ZGlmZiAtLWdpdCBhLy5iYXplbHJjIGIvLmJhemVscmMKaW5kZXggZDIzMTgxMi4uNWI5ZmIzNyAxMDA2NDQKLS0tIGEvLmJhemVscmMKKysrIGIvLmJhemVscmMKQEAgLTIxLDYgKzIxLDcgQEAKIAogIyBTaG9ydGN1dHMgZm9yIHNlbGVjdGluZyB0aGUgdGFyZ2V0IHBsYXRmb3JtLgogYnVpbGQ6azggLS1wbGF0Zm9ybXM9Ly90b29scy9wbGF0Zm9ybXM6bGludXhfeDg2CitidWlsZDprOF91cHN0cmVhbV9weXRob24gLS1wbGF0Zm9ybXM9Ly90b29scy9wbGF0Zm9ybXM6bGludXhfeDg2X3Vwc3RyZWFtX3B5dGhvbgogYnVpbGQ6cm9ib3JpbyAtLXBsYXRmb3Jtcz0vL3Rvb2xzL3BsYXRmb3JtczpsaW51eF9yb2JvcmlvCiBidWlsZDpyb2JvcmlvIC0tcGxhdGZvcm1fc3VmZml4PS1yb2JvcmlvCiBidWlsZDphcm12NyAtLXBsYXRmb3Jtcz0vL3Rvb2xzL3BsYXRmb3JtczpsaW51eF9hcm12NwpkaWZmIC0tZ2l0IGEvV09SS1NQQUNFIGIvV09SS1NQQUNFCmluZGV4IDE2YjYyZWYuLjA2MmZlMjUgMTAwNjQ0Ci0tLSBhL1dPUktTUEFDRQorKysgYi9XT1JLU1BBQ0UKQEAgLTI5Myw2ICsyOTMsNyBAQAogICAgICMgRmluZCBhIGdvb2Qgd2F5IHRvIHNlbGVjdCBiZXR3ZWVuIHRoZXNlIHR3byBNNEYgdG9vbGNoYWlucy4KICAgICAjIi8vdG9vbHMvY3BwOmNjLXRvb2xjaGFpbi1jb3J0ZXgtbTRmLWsyMiIsCiAgICAgIi8vdG9vbHMvcHl0aG9uOnB5dGhvbl90b29sY2hhaW4iLAorICAgICIvL3Rvb2xzL3B5dGhvbjp1cHN0cmVhbV9weXRob25fdG9vbGNoYWluIiwKICAgICAiLy90b29scy9nbzpub29wX2dvX3Rvb2xjaGFpbiIsCiAgICAgIi8vdG9vbHMvcnVzdDpydXN0LXRvb2xjaGFpbi14ODYiLAogICAgICIvL3Rvb2xzL3J1c3Q6cnVzdC10b29sY2hhaW4tYXJtdjciLApAQCAtNDAwLDEzICs0MDEsMzkgQEAKICAgICBdLAogKQogCi0jIE5vdGUgdGhhdCBydWxlc19weXRob24gaXMgY3VycmVudGx5IG9ubHkgaW1wb3J0ZWQgdG8gbWFrZSBnb29nbGV0ZXN0IGhhcHB5LgotIyBUT0RPOiBhZGQgZnJjOTcxLm9yZyBVUkwKIGh0dHBfYXJjaGl2ZSgKICAgICBuYW1lID0gInJ1bGVzX3B5dGhvbiIsCi0gICAgc2hhMjU2ID0gIjg5NWZhM2IwMzg5OGQ3NzA4ZWI1MGVkMzRkY2ZiNzFjMDc4NjY0MzNkZjY5MTJhNmZmNGY0ZmI0NzMwNDhmOTkiLAotICAgIHN0cmlwX3ByZWZpeCA9ICJydWxlc19weXRob24tMmIxZDZiZWI0ZDVkOGY1OWQ2Mjk1OTdlMzBlOWFhNTE5MTgyZDlhOSIsCi0gICAgdXJsID0gImh0dHBzOi8vZ2l0aHViLmNvbS9iYXplbGJ1aWxkL3J1bGVzX3B5dGhvbi9hcmNoaXZlLzJiMWQ2YmViNGQ1ZDhmNTlkNjI5NTk3ZTMwZTlhYTUxOTE4MmQ5YTkudGFyLmd6IiwKKyAgICBzaGEyNTYgPSAiYjU5M2QxM2JiNDNjOTRjZTk0YjQ4M2MyODU4ZTUzYTliODExZjZmMTBlMWUwZWVkYzYxMDczYmQ5MGU1OGQ5YyIsCisgICAgc3RyaXBfcHJlZml4ID0gInJ1bGVzX3B5dGhvbi0wLjEyLjAiLAorICAgIHVybCA9ICJodHRwczovL2dpdGh1Yi5jb20vYmF6ZWxidWlsZC9ydWxlc19weXRob24vYXJjaGl2ZS9yZWZzL3RhZ3MvMC4xMi4wLnRhci5neiIsCispCisKK2xvYWQoIkBydWxlc19weXRob24vL3B5dGhvbjpyZXBvc2l0b3JpZXMuYnpsIiwgInB5dGhvbl9yZWdpc3Rlcl90b29sY2hhaW5zIikKKworcHl0aG9uX3JlZ2lzdGVyX3Rvb2xjaGFpbnMoCisgICAgbmFtZSA9ICJweXRob24zXzkiLAorICAgIHB5dGhvbl92ZXJzaW9uID0gIjMuOSIsCisgICAgcmVnaXN0ZXJfdG9vbGNoYWlucyA9IEZhbHNlLAorKQorCitsb2FkKCJAcHl0aG9uM185Ly86ZGVmcy5iemwiLCBweXRob25faW50ZXJwcmV0ZXIgPSAiaW50ZXJwcmV0ZXIiKQorbG9hZCgiQHJ1bGVzX3B5dGhvbi8vcHl0aG9uOnBpcC5iemwiLCAicGlwX3BhcnNlIikKKworcGlwX3BhcnNlKAorICAgIG5hbWUgPSAicGlwX2RlcHMiLAorICAgIHB5dGhvbl9pbnRlcnByZXRlcl90YXJnZXQgPSBweXRob25faW50ZXJwcmV0ZXIsCisgICAgcmVxdWlyZW1lbnRzX2xvY2sgPSAiLy90b29scy9weXRob246cmVxdWlyZW1lbnRzLmxvY2sudHh0IiwKKykKKworIyBMb2FkIHRoZSBzdGFybGFyayBtYWNybyB3aGljaCB3aWxsIGRlZmluZSB5b3VyIGRlcGVuZGVuY2llcy4KK2xvYWQoIkBwaXBfZGVwcy8vOnJlcXVpcmVtZW50cy5iemwiLCBpbnN0YWxsX3BpcF9kZXBzID0gImluc3RhbGxfZGVwcyIpCisKK2luc3RhbGxfcGlwX2RlcHMoKQorCitsb2FkKCIvL3Rvb2xzL3B5dGhvbjpyZXBvX2RlZnMuYnpsIiwgInBpcF9jb25maWd1cmUiKQorCitwaXBfY29uZmlndXJlKAorICAgIG5hbWUgPSAicGlwIiwKICkKIAogbmV3X2xvY2FsX3JlcG9zaXRvcnkoCmRpZmYgLS1naXQgYS9hb3MvQlVJTEQgYi9hb3MvQlVJTEQKaW5kZXggMGI1ZGZhMC4uNjkzMDNhOSAxMDA2NDQKLS0tIGEvYW9zL0JVSUxECisrKyBiL2Fvcy9CVUlMRApAQCAtMSw0ICsxLDUgQEAKLWxvYWQoIkBjb21fZ2l0aHViX2dvb2dsZV9mbGF0YnVmZmVycy8vOmJ1aWxkX2RlZnMuYnpsIiwgImZsYXRidWZmZXJfY2NfbGlicmFyeSIsICJmbGF0YnVmZmVyX3B5X2xpYnJhcnkiLCAiZmxhdGJ1ZmZlcl9ydXN0X2xpYnJhcnkiLCAiZmxhdGJ1ZmZlcl90c19saWJyYXJ5IikKK2xvYWQoIkBjb21fZ2l0aHViX2dvb2dsZV9mbGF0YnVmZmVycy8vOmJ1aWxkX2RlZnMuYnpsIiwgImZsYXRidWZmZXJfY2NfbGlicmFyeSIsICJmbGF0YnVmZmVyX3B5X2xpYnJhcnkiLCAiZmxhdGJ1ZmZlcl9ydXN0X2xpYnJhcnkiKQorbG9hZCgiQGNvbV9naXRodWJfZ29vZ2xlX2ZsYXRidWZmZXJzLy86dHlwZXNjcmlwdC5iemwiLCAiZmxhdGJ1ZmZlcl90c19saWJyYXJ5IikKIGxvYWQoIkBydWxlc19ydXN0Ly9ydXN0OmRlZnMuYnpsIiwgInJ1c3RfbGlicmFyeSIsICJydXN0X3Rlc3QiKQogbG9hZCgiLy9hb3M6ZmxhdGJ1ZmZlcnMuYnpsIiwgImNjX3N0YXRpY19mbGF0YnVmZmVyIikKIGxvYWQoIi8vdG9vbHMvYnVpbGRfcnVsZXM6YXV0b2N4eC5iemwiLCAiYXV0b2N4eF9saWJyYXJ5IikKZGlmZiAtLWdpdCBhL2Fvcy9ldmVudHMvQlVJTEQgYi9hb3MvZXZlbnRzL0JVSUxECmluZGV4IGIzMzliNjcuLjZhYmMwNzUgMTAwNjQ0Ci0tLSBhL2Fvcy9ldmVudHMvQlVJTEQKKysrIGIvYW9zL2V2ZW50cy9CVUlMRApAQCAtMSw0ICsxLDUgQEAKLWxvYWQoIkBjb21fZ2l0aHViX2dvb2dsZV9mbGF0YnVmZmVycy8vOmJ1aWxkX2RlZnMuYnpsIiwgImZsYXRidWZmZXJfY2NfbGlicmFyeSIsICJmbGF0YnVmZmVyX3J1c3RfbGlicmFyeSIsICJmbGF0YnVmZmVyX3RzX2xpYnJhcnkiKQorbG9hZCgiQGNvbV9naXRodWJfZ29vZ2xlX2ZsYXRidWZmZXJzLy86YnVpbGRfZGVmcy5iemwiLCAiZmxhdGJ1ZmZlcl9jY19saWJyYXJ5IiwgImZsYXRidWZmZXJfcnVzdF9saWJyYXJ5IikKK2xvYWQoIkBjb21fZ2l0aHViX2dvb2dsZV9mbGF0YnVmZmVycy8vOnR5cGVzY3JpcHQuYnpsIiwgImZsYXRidWZmZXJfdHNfbGlicmFyeSIpCiBsb2FkKCIvL2FvczpmbGF0YnVmZmVycy5iemwiLCAiY2Nfc3RhdGljX2ZsYXRidWZmZXIiKQogbG9hZCgiLy9hb3M6Y29uZmlnLmJ6bCIsICJhb3NfY29uZmlnIikKIGxvYWQoIi8vdG9vbHMvYnVpbGRfcnVsZXM6YXV0b2N4eC5iemwiLCAiYXV0b2N4eF9saWJyYXJ5IikKQEAgLTM4Miw3ICszODMsNyBAQAogY2NfdGVzdCgKICAgICBuYW1lID0gInNobV9ldmVudF9sb29wX3Rlc3QiLAogICAgIHNyY3MgPSBbInNobV9ldmVudF9sb29wX3Rlc3QuY2MiXSwKLSAgICBzaGFyZF9jb3VudCA9IDE2LAorICAgIHNoYXJkX2NvdW50ID0gMjQsCiAgICAgdGFyZ2V0X2NvbXBhdGlibGVfd2l0aCA9IFsiQHBsYXRmb3Jtcy8vb3M6bGludXgiXSwKICAgICBkZXBzID0gWwogICAgICAgICAiOmV2ZW50X2xvb3BfcGFyYW1fdGVzdCIsCmRpZmYgLS1naXQgYS9hb3MvZXZlbnRzL2Fvc190aW1pbmdfcmVwb3J0X3N0cmVhbWVyLmNjIGIvYW9zL2V2ZW50cy9hb3NfdGltaW5nX3JlcG9ydF9zdHJlYW1lci5jYwppbmRleCBlZTVlZmRlLi4zNWE3OGI5IDEwMDY0NAotLS0gYS9hb3MvZXZlbnRzL2Fvc190aW1pbmdfcmVwb3J0X3N0cmVhbWVyLmNjCisrKyBiL2Fvcy9ldmVudHMvYW9zX3RpbWluZ19yZXBvcnRfc3RyZWFtZXIuY2MKQEAgLTUsNyArNSw3IEBACiAjaW5jbHVkZSAiYW9zL2pzb25fdG9fZmxhdGJ1ZmZlci5oIgogI2luY2x1ZGUgImdmbGFncy9nZmxhZ3MuaCIKIAotREVGSU5FX3N0cmluZyhjb25maWcsICIvYXBwL2Fvc19jb25maWcuanNvbiIsICJUaGUgcGF0aCB0byB0aGUgY29uZmlnIHRvIHVzZS4iKTsKK0RFRklORV9zdHJpbmcoY29uZmlnLCAiYW9zX2NvbmZpZy5qc29uIiwgIlRoZSBwYXRoIHRvIHRoZSBjb25maWcgdG8gdXNlLiIpOwogREVGSU5FX3N0cmluZyhhcHBsaWNhdGlvbiwgIiIsCiAgICAgICAgICAgICAgICJBcHBsaWNhdGlvbiBmaWx0ZXIgdG8gdXNlLiBFbXB0eSBmb3Igbm8gZmlsdGVyLiIpOwogREVGSU5FX2Jvb2woc3RyZWFtLCB0cnVlLCAiU3RyZWFtIG91dCBhbGwgdGhlIHRpbWluZyByZXBvcnRzIHRoYXQgd2UgcmVjZWl2ZS4iKTsKZGlmZiAtLWdpdCBhL2Fvcy9ldmVudHMvbG9nZ2luZy9sb2dnZXJfdGVzdC5jYyBiL2Fvcy9ldmVudHMvbG9nZ2luZy9sb2dnZXJfdGVzdC5jYwppbmRleCBlODZkMmE5Li5lZDdkMTUwIDEwMDY0NAotLS0gYS9hb3MvZXZlbnRzL2xvZ2dpbmcvbG9nZ2VyX3Rlc3QuY2MKKysrIGIvYW9zL2V2ZW50cy9sb2dnaW5nL2xvZ2dlcl90ZXN0LmNjCkBAIC0zNjY2LDkgKzM2NjYsOSBAQAogfQogCiBjb25zdGV4cHIgc3RkOjpzdHJpbmdfdmlldyBrQ29tYmluZWRDb25maWdTaGExKAotICAgICI5OWJmOWIzNzdkOWI5YTIzZWFmN2RlMDEyZTlmY2MzODQwZmQ3ZDI4NzUxNDYxODI0Y2QzMDRiMjc3NjFiODFkIik7CisgICAgIjQ2ZjhkYWE3ZDg0ZWI5OTljOGQzNTg0Yjc5ZjRhMjg5ZmQ0NmUzYTBiNDdhMDhiZGJlZTljN2UzYjg5YjRhZmYiKTsKIGNvbnN0ZXhwciBzdGQ6OnN0cmluZ192aWV3IGtTcGxpdENvbmZpZ1NoYTEoCi0gICAgIjEyMzMxNWRjZTk2MDBjNDY3MmQwZjg2NzU3NDg2ZjhhMTVhNWE5NjQ5YWEzZDQ2OGVhMWJkYzVkM2MyNDNkNTQiKTsKKyAgICAiMjU1ODY2M2U5NDE0MzgzZTI2NDUxMGNlNzMzNTA1YTQwYmU5OWQyZjQzZTI5OTgxOTQxNzk0NGYwNmI4OTllYSIpOwogCiBJTlNUQU5USUFURV9URVNUX1NVSVRFX1AoCiAgICAgQWxsLCBNdWx0aW5vZGVMb2dnZXJUZXN0LApAQCAtNDYwMiw3ICs0NjAyLDcgQEAKIAogLy8gVGVzdHMgdGhhdCB3aGVuIHdlIGhhdmUgYSBsb29wIHdpdGhvdXQgYWxsIHRoZSBsb2dzIGF0IGFsbCBwb2ludHMgaW4gdGltZSwgd2UKIC8vIGNhbiBzb3J0IGl0IHByb3Blcmx5LgotVEVTVChNdWx0aW5vZGVMb2dnZXJMb29wVGVzdCwgRElTQUJMRURfTG9vcCkgeworVEVTVChNdWx0aW5vZGVMb2dnZXJMb29wVGVzdCwgTG9vcCkgewogICBhb3M6OkZsYXRidWZmZXJEZXRhY2hlZEJ1ZmZlcjxhb3M6OkNvbmZpZ3VyYXRpb24+IGNvbmZpZyA9CiAgICAgICBhb3M6OmNvbmZpZ3VyYXRpb246OlJlYWRDb25maWcoQXJ0aWZhY3RQYXRoKAogICAgICAgICAgICJhb3MvZXZlbnRzL2xvZ2dpbmcvbXVsdGlub2RlX3Bpbmdwb25nX3RyaWFuZ2xlX3NwbGl0X2NvbmZpZy5qc29uIikpOwpkaWZmIC0tZ2l0IGEvYW9zL25ldHdvcmsvQlVJTEQgYi9hb3MvbmV0d29yay9CVUlMRAppbmRleCBlMjhmZDg5Li45NjgyNWU0IDEwMDY0NAotLS0gYS9hb3MvbmV0d29yay9CVUlMRAorKysgYi9hb3MvbmV0d29yay9CVUlMRApAQCAtMSw3ICsxLDggQEAKIGxvYWQoIi8vYW9zL3NlYXNvY2tzOmdlbl9lbWJlZGRlZC5iemwiLCAiZ2VuX2VtYmVkZGVkIikKIGxvYWQoIi8vYW9zOmNvbmZpZy5iemwiLCAiYW9zX2NvbmZpZyIpCiBsb2FkKCIvL2FvczpmbGF0YnVmZmVycy5iemwiLCAiY2Nfc3RhdGljX2ZsYXRidWZmZXIiKQotbG9hZCgiQGNvbV9naXRodWJfZ29vZ2xlX2ZsYXRidWZmZXJzLy86YnVpbGRfZGVmcy5iemwiLCAiZmxhdGJ1ZmZlcl9jY19saWJyYXJ5IiwgImZsYXRidWZmZXJfdHNfbGlicmFyeSIpCitsb2FkKCJAY29tX2dpdGh1Yl9nb29nbGVfZmxhdGJ1ZmZlcnMvLzpidWlsZF9kZWZzLmJ6bCIsICJmbGF0YnVmZmVyX2NjX2xpYnJhcnkiKQorbG9hZCgiQGNvbV9naXRodWJfZ29vZ2xlX2ZsYXRidWZmZXJzLy86dHlwZXNjcmlwdC5iemwiLCAiZmxhdGJ1ZmZlcl90c19saWJyYXJ5IikKIAogcGFja2FnZShkZWZhdWx0X3Zpc2liaWxpdHkgPSBbIi8vdmlzaWJpbGl0eTpwdWJsaWMiXSkKIApkaWZmIC0tZ2l0IGEvYW9zL25ldHdvcmsvbXVsdGlub2RlX3RpbWVzdGFtcF9maWx0ZXIuY2MgYi9hb3MvbmV0d29yay9tdWx0aW5vZGVfdGltZXN0YW1wX2ZpbHRlci5jYwppbmRleCBiY2E3ZDczLi5hODhlODAxIDEwMDY0NAotLS0gYS9hb3MvbmV0d29yay9tdWx0aW5vZGVfdGltZXN0YW1wX2ZpbHRlci5jYworKysgYi9hb3MvbmV0d29yay9tdWx0aW5vZGVfdGltZXN0YW1wX2ZpbHRlci5jYwpAQCAtMzMsMTIgKzMzLDM1IEBACiAgICAgICAgICAgICAidGhlIGludGVycG9sYXRpb24gbGluZXMuICBUaGlzIHNlZW1zIHRvIG1ha2Ugc3RhcnR1cCBhIGJpdCAiCiAgICAgICAgICAgICAiYmV0dGVyLCBidXQgd29uJ3QgdHJhY2sgdGhlIG1pZGRsZSBhcyB3ZWxsLiIpOwogCi0jZGVmaW5lIFNPTFZFX1ZMT0dfSVNfT04odikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgKFZMT0dfSVNfT04odikgfHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgKHN0YXRpY19jYXN0PGludDMyX3Q+KG15X3NvbHZlX251bWJlcl8pID09IEZMQUdTX2RlYnVnX3NvbHZlX251bWJlciAmJiBcCi0gICAgRkxBR1NfZGVidWdfc29sdmVfbnVtYmVyICE9IC0xKSkKK0RFRklORV9ib29sKAorICAgIGNyYXNoX29uX3NvbHZlX2ZhaWx1cmUsIHRydWUsCisgICAgIklmIHRydWUsIGNyYXNoIHdoZW4gdGhlIHNvbHZlciBmYWlscyB0byBjb252ZXJnZS4gIElmIGZhbHNlLCBrZWVwIGdvaW5nLiAgIgorICAgICJUaGlzIHNob3VsZCBvbmx5IGJlIHNldCB0byBmYWxzZSB3aGVuIHRyeWluZyB0byBzZWUgaWYgZnV0dXJlIHByb2JsZW1zICIKKyAgICAid291bGQgYmUgc29sdmFibGUuICBUaGlzIHdvbid0IHByb2Nlc3MgYSB2YWxpZCBsb2ciKTsKIAotI2RlZmluZSBTT0xWRV9WTE9HKHYpIExPR19JRihJTkZPLCBTT0xWRV9WTE9HX0lTX09OKHYpKQorREVGSU5FX2Jvb2woYXR0ZW1wdF9zaW11bHRhbmVvdXNfY29uc3RyYWluZWRfc29sdmUsIHRydWUsCisgICAgICAgICAgICAiSWYgdHJ1ZSwgdHJ5IHRoZSBzaW11bHRhbmVvdXMsIGNvbnN0cmFpbmVkIHNvbHZlci4gIElmIGZhbHNlLCAiCisgICAgICAgICAgICAib25seSBzb2x2ZSBjb25zdHJhaW5lZCBwcm9ibGVtcyBzZXF1ZW50aWFsbHkuIik7CisKK0RFRklORV9ib29sKAorICAgIHJlbW92ZV91bmxpa2VseV9jb25zdHJhaW50cywgdHJ1ZSwKKyAgICAiSWYgdHJ1ZSwgd2hlbiBzb2x2aW5nLCB0cnkgd2l0aCBvdXIgYmVzdCBndWVzcyBhdCB3aGljaCBjb25zdHJhaW50cyB3aWxsICIKKyAgICAiYmUgcmVsZXZhbnQgYW5kIHJlc29sdmUgaWYgdGhhdCBwcm92ZXMgd3Jvbmcgd2l0aCBhbiB1cGRhdGVkIHNldC4gIEZvciAiCisgICAgImV4cGVuc2l2ZSBwcm9ibGVtcywgdGhpcyByZWR1Y2VzIHNvbHZlIHRpbWUgc2lnbmlmaWNhbnRseS4iKTsKKworREVGSU5FX2ludDMyKHNvbHZlX3ZlcmJvc2l0eSwgMSwgIlZlcmJvc2l0eSB0byB1c2Ugd2hlbiBkZWJ1Z2dpbmcgdGhlIHNvbHZlci4iKTsKKworREVGSU5FX2Jvb2woY29uc3RyYWluZWRfc29sdmUsIHRydWUsCisgICAgICAgICAgICAiSWYgdHJ1ZSwgdXNlIHRoZSBjb25zdHJhaW5lZCBzb2x2ZXIuICBJZiBmYWxzZSwgb25seSBzb2x2ZSAiCisgICAgICAgICAgICAidW5jb25zdHJhaW5lZC4iKTsKKworI2RlZmluZSBTT0xWRV9WTE9HX0lTX09OKHNvbHZlX251bWJlciwgdikgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKFZMT0dfSVNfT04odikgfHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAoc3RhdGljX2Nhc3Q8aW50MzJfdD4oc29sdmVfbnVtYmVyKSA9PSBGTEFHU19kZWJ1Z19zb2x2ZV9udW1iZXIgJiYgXAorICAgIHYgPD0gRkxBR1Nfc29sdmVfdmVyYm9zaXR5KSkKKworI2RlZmluZSBTT0xWRV9WTE9HKHNvbHZlX251bWJlciwgdikgXAorICBMT0dfSUYoSU5GTywgU09MVkVfVkxPR19JU19PTihzb2x2ZV9udW1iZXIsIHYpKQogCiBuYW1lc3BhY2UgYW9zIHsKIG5hbWVzcGFjZSBtZXNzYWdlX2JyaWRnZSB7CkBAIC00NywxOCArNzAsMjEgQEAKIHVzaW5nIGFvczo6bG9nZ2VyOjpCb290RHVyYXRpb247CiB1c2luZyBhb3M6OmxvZ2dlcjo6Qm9vdFRpbWVzdGFtcDsKIAotY29uc3QgRWlnZW46OklPRm9ybWF0IGtIZWF2eUZvcm1hdChFaWdlbjo6U3RyZWFtUHJlY2lzaW9uLCBFaWdlbjo6RG9udEFsaWduQ29scywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiwgIiwgIjtcbiIsICJbIiwgIl0iLCAiWyIsICJdIik7Citjb25zdCBFaWdlbjo6SU9Gb3JtYXQga0hlYXZ5Rm9ybWF0KEVpZ2VuOjpTdHJlYW1QcmVjaXNpb24sIDAsICIsICIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJbIiwgIl0iLCAiWyIsICJdIik7CiAKIHRlbXBsYXRlIDxjbGFzcy4uLiBBcmdzPgogc3RkOjpzdHJpbmcgQ3N2UGF0aChBcmdzICYmLi4uYXJncykgewogICByZXR1cm4gYWJzbDo6U3RyQ2F0KEZMQUdTX3RpbWVzdGFtcF9jc3ZfZm9sZGVyLCAiLyIsCiAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpmb3J3YXJkPEFyZ3M+KGFyZ3MpLi4uKTsKIH0KLQogfSAgLy8gbmFtZXNwYWNlCiAKLXNpemVfdCBUaW1lc3RhbXBQcm9ibGVtOjpzb2x2ZV9udW1iZXJfID0gMHU7CitzaXplX3QgTmV3dG9uU29sdmVyOjpzb2x2ZV9udW1iZXJfID0gMHU7CisKK05ld3RvblNvbHZlcjo6TmV3dG9uU29sdmVyKCkgOiBteV9zb2x2ZV9udW1iZXJfKHNvbHZlX251bWJlcl8rKykge30KIAogVGltZXN0YW1wUHJvYmxlbTo6VGltZXN0YW1wUHJvYmxlbShzaXplX3QgY291bnQpIHsKICAgQ0hFQ0tfR1QoY291bnQsIDF1KTsKQEAgLTY2LDcgKzkyLDYgQEAKICAgYmFzZV9jbG9ja18ucmVzaXplKGNvdW50KTsKICAgbGl2ZV8ucmVzaXplKGNvdW50LCB0cnVlKTsKICAgbm9kZV9tYXBwaW5nXy5yZXNpemUoY291bnQsIDApOwotICBteV9zb2x2ZV9udW1iZXJfID0gc29sdmVfbnVtYmVyXysrOwogfQogCiAvLyBUT0RPKGF1c3Rpbik6IEFkZCBhIHJhdGUgb2YgY2hhbmdlIGNvbnN0cmFpbnQgZnJvbSB0aGUgbGFzdCBzYW1wbGUuICAxCkBAIC0xMDMsOCArMTI4LDggQEAKICAgICAgICBjbG9ja19vZmZzZXRfZmlsdGVyX2Zvcl9ub2RlX1tub2RlX2FdKSB7CiAgICAgLy8gVGhlcmUncyBzb21ldGhpbmcgaW4gdGhpcyBkaXJlY3Rpb24sIHNvIHdlIGRvbid0IG5lZWQgdG8gY2hlY2sgdGhlCiAgICAgLy8gb3Bwb3NpdGUgZGlyZWN0aW9uIHRvIGNvbmZpcm0gd2UgaGF2ZSBvYnNlcnZhdGlvbnMuCi0gICAgaWYgKCFmaWx0ZXIuZmlsdGVyLT50aW1lc3RhbXBzX2VtcHR5KAotICAgICAgICAgICAgYmFzZV9jbG9ja19bbm9kZV9hXS5ib290LCBiYXNlX2Nsb2NrX1tmaWx0ZXIuYl9pbmRleF0uYm9vdCkpIHsKKyAgICBpZiAoIWZpbHRlci5maWx0ZXItPnRpbWVzdGFtcHNfZW1wdHkoYmFzZV9jbG9ja19bbm9kZV9hXS5ib290LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlX2Nsb2NrX1tmaWx0ZXIuYl9pbmRleF0uYm9vdCkpIHsKICAgICAgIGNvbnRpbnVlOwogICAgIH0KIApAQCAtMTI4LDggKzE1Myw4IEBACiAgICAgZm9yIChjb25zdCBzdHJ1Y3QgRmlsdGVyUGFpciAmZmlsdGVyIDogY2xvY2tfb2Zmc2V0X2ZpbHRlcl9mb3Jfbm9kZV9baV0pIHsKICAgICAgIC8vIFRoZXJlJ3Mgbm90aGluZyBpbiB0aGlzIGRpcmVjdGlvbiwgc28gdGhlcmUgd2lsbCBiZSBub3RoaW5nIHRvCiAgICAgICAvLyB2YWxpZGF0ZS4KLSAgICAgIGlmIChmaWx0ZXIuZmlsdGVyLT50aW1lc3RhbXBzX2VtcHR5KAotICAgICAgICAgICAgICBiYXNlX2Nsb2NrX1tpXS5ib290LCBiYXNlX2Nsb2NrX1tmaWx0ZXIuYl9pbmRleF0uYm9vdCkpIHsKKyAgICAgIGlmIChmaWx0ZXIuZmlsdGVyLT50aW1lc3RhbXBzX2VtcHR5KGJhc2VfY2xvY2tfW2ldLmJvb3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlX2Nsb2NrX1tmaWx0ZXIuYl9pbmRleF0uYm9vdCkpIHsKICAgICAgICAgLy8gRm9yIGEgYm9vdCB0byBleGlzdCwgd2UgbmVlZCB0byBoYXZlIHNvbWUgb2JzZXJ2YXRpb25zIGJldHdlZW4gaXQgYW5kCiAgICAgICAgIC8vIGFub3RoZXIgYm9vdC4gIFdlIHdvdWxkbid0IGJvdGhlciB0byBidWlsZCBhIHByb2JsZW0gdG8gc29sdmUgZm9yCiAgICAgICAgIC8vIHRoaXMgbm9kZSBvdGhlcndpc2UuICBDb25maXJtIHRoYXQgaXMgdHJ1ZSBzbyB3ZSBhdCBsZWFzdCBnZXQKQEAgLTE0NSwxMSArMTcwLDExIEBACiAgICAgICB9CiAgICAgICBjb25zdCBib29sIGl0ZXJhdGlvbiA9IGZpbHRlci5maWx0ZXItPlZhbGlkYXRlU29sdXRpb24oCiAgICAgICAgICAgZmlsdGVyLmJfZmlsdGVyLCBmaWx0ZXIucG9pbnRlciwgc29sdXRpb25baV0sCi0gICAgICAgICAgc29sdXRpb25bZmlsdGVyLmJfaW5kZXhdLCBxdWlldCk7CisgICAgICAgICAgc29sdXRpb25bZmlsdGVyLmJfaW5kZXhdLCB0cnVlLCBxdWlldCk7CiAgICAgICBpZiAoIWl0ZXJhdGlvbikgewotICAgICAgICBmaWx0ZXIuZmlsdGVyLT5WYWxpZGF0ZVNvbHV0aW9uKGZpbHRlci5iX2ZpbHRlciwgZmlsdGVyLnBvaW50ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc29sdXRpb25baV0sIDAuMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb2x1dGlvbltmaWx0ZXIuYl9pbmRleF0sIDAuMCwgcXVpZXQpOworICAgICAgICBmaWx0ZXIuZmlsdGVyLT5WYWxpZGF0ZVNvbHV0aW9uKAorICAgICAgICAgICAgZmlsdGVyLmJfZmlsdGVyLCBmaWx0ZXIucG9pbnRlciwgc29sdXRpb25baV0sIDAuMCwKKyAgICAgICAgICAgIHNvbHV0aW9uW2ZpbHRlci5iX2luZGV4XSwgMC4wLCB0cnVlLCBxdWlldCk7CiAgICAgICB9CiAKICAgICAgIHN1Y2Nlc3MgPSBzdWNjZXNzICYmIGl0ZXJhdGlvbjsKQEAgLTE3NSw5ICsyMDAsNzEgQEAKICAgcmV0dXJuIHJlc3VsdDsKIH0KIAotVGltZXN0YW1wUHJvYmxlbTo6RGVyaXZpdGl2ZXMgVGltZXN0YW1wUHJvYmxlbTo6Q29tcHV0ZURlcml2aXRpdmVzKAotICAgICAgY29uc3QgRWlnZW46OlJlZjxFaWdlbjo6VmVjdG9yWGQ+IHRpbWVfb2Zmc2V0cykgewotICBEZXJpdml0aXZlcyByZXN1bHQ7CitQcm9ibGVtOjpEZXJpdmF0aXZlcyBUaW1lc3RhbXBQcm9ibGVtOjpDb21wdXRlRGVyaXZhdGl2ZXMoCisgICAgc2l6ZV90IHNvbHZlX251bWJlciwgY29uc3QgRWlnZW46OlJlZjxjb25zdCBFaWdlbjo6VmVjdG9yWGQ+IHRpbWVfb2Zmc2V0cywKKyAgICBib29sIHF1aWV0LCBib29sIGFsbCwgY29uc3QgYWJzbDo6U3Bhbjxjb25zdCBzaXplX3Q+IGFjdGl2ZV9jb25zdHJhaW50cykgeworICAvLyBRdWV1ZSBsb25nIGV4cGxhbmF0aW9uIGZvciB3aHkgdGhpcyBpcyB0aGUgcmlnaHQgbWF0aC4uLgorICAvLworICAvLyBPdXIgY29zdCBmdW5jdGlvbiBpcyBwaWVjZXdpc2UgcXVhZHJhdGljIGFuZCBzaW1wbGUgYnkgZGVzaWduLiAgSXQgc2hvdWxkCisgIC8vIGFsc28gYmUgYWxtb3N0IGNvbnZleC4gIFRoaXMgbWVhbnMgaXQgaXMgZXF1aXZhbGVudCBmb3IgdXMgdG8gZHJpdmUgdGhlCisgIC8vIGdyYWRpZW50IHRvIDAgdG8gZmluZCB0aGUgY29ycmVzcG9uZGluZyB0aW1lcyBvbiBhbGwgbm9kZXMuCisgIC8vCisgIC8vIFRoaXMgZ2V0cyB1cyBjbG9zZSBidXQgZG9lc24ndCBsZXQgdXMgc29sdmUgZm9yIHRoZSB0aW1lIGNvcnJlc3BvbmRpbmcgdG8gYQorICAvLyBzcGVjaWZpYyB0aW1lIG9uIG9uZSBub2RlIG9uIGFsbCB0aGUgbm9kZXMuCisgIC8vCisgIC8vIFRvIGRvIHRoaXMsIHdlIHdhbnQgYSBOZXd0b24gc29sdmVyIHdoaWNoIHdvcmtzIGZvciBlcXVhbGl0eSBjb25zdHJhaW50cy4KKyAgLy8gICBhcmdtaW4gZih4KQorICAvLyAgIHN1YmplY3QgdG8ge0EgeCA9IGJ9CisgIC8vCisgIC8vIE1vcmUgc3BlY2lmaWNhbGx5LCB3ZSB3YW50IGEgdmVyc2lvbiBvZiB0aGlzIHdoaWNoIHdpbGwgc3RhcnQgd2l0aAorICAvLyBpbmZlYXNpYmxlIGluaXRpYWwgc29sdXRpb25zLgorICAvLworICAvLyBUaGUgbmV3dG9uIHN0ZXAgZm9yIHRoaXMgaXMKKyAgLy8gICBYKG4rMSkgPSBYKG4pICsgeG50CisgIC8vCisgIC8vICAgW0hlc3NpYW4oY29zdChYKG4pKSkgQV5UXSBbeG50XSA9IFstZ3JhZChjb3N0KFgobikpKV0KKyAgLy8gICBbQSAgICAgICAgICAgICAgICAgICAgIDBdIFt3XSAgICAgWy1BIFgobikgKyBiICAgICAgXQorICAvLworICAvLyBJdCB0dXJucyBvdXQgdGhhdCB3IGlzIHRoZSBkdWFsIG5ld3RvbiBzdGVwLiAgQnV0IHdlIGRvbid0IGFjdHVhbGx5IG5lZWQgdG8KKyAgLy8gdHJhY2sgdGhlIGR1YWwgcHJvYmxlbSB0byBzb2x2ZSBvdXIgcHJvYmxlbSBleGNlcHQgdG8gc2hvdyB0aGF0IHRoZSBkdWFsCisgIC8vIHByb2JsZW0gaGFzIGFsc28gY29udmVyZ2VkLgorICAvLworICAvLyBXZSBjb3VsZCBzZXQgQSB0byBbMSwgMCwgMCwgLi4uXSBhbmQgZm9yY2UgYSBzaW5nbGUgY2xvY2sgdG8gYSBzcGVjaWZpYworICAvLyB0aW1lLiAgQnV0LCB0aGF0IHdpbGwgcmVzdWx0IGluIHRoZSBvcHRpbWFsIHNvbHV0aW9uIGJlaW5nIGRpZmZlcmVudAorICAvLyBkZXBlbmRpbmcgb24gd2hpY2ggbm9kZSBpcyBwaWNrZWQuCisgIC8vCisgIC8vIEluc3RlYWQsIGxldCdzIHNvbHZlIGZvciB0aGUgYXZlcmFnZSBjbG9jayBpbnN0ZWFkLiAgVGhpcyB3aWxsIGJlIGFsd2F5cworICAvLyBzeW1tZXRyaWMsIGFuZCB3ZSBjYW4gZHJpdmUgdGhlIGdvYWwgZm9yIHRoYXQgY2xvY2sgdG8gbWFrZSBhbnkgaW5kaXZpZHVhbAorICAvLyBjbG9jayBoYXZlIHRoZSByaWdodCB0aW1lLiAgVGhhdCB3b3VsZCBiZSBhIHNvbHZlciB3cmFwcGVkIGFyb3VuZCBhIHNvbHZlci4KKyAgLy8KKyAgLy8gVHVybnMgb3V0LCB3ZSBjYW4gZG8gdGhhdCBieSBjb21iaW5pbmcgdGhlIGl0ZXJhdGlvbnMuICBJZiB3ZSBzZXQgQSB0bworICAvLyBbMS9uLCAxL24sIDEvbiAuLi5dLCBhbmQgYiB0byB0aGUgZGlzdHJpYnV0ZWQgY2xvY2ssIHRoYXQgd291bGQgZHJpdmUgb3VyCisgIC8vIHN0YXRlcyBzdWNoIHRoYXQgdGhlIGRpc3RyaWJ1dGVkIGNsb2NrIHdpbGwgYmUgd2hhdCB3ZSB3YW50LiAgSWYgd2UgaW5zdGVhZAorICAvLyBsZWF2ZSBBIHRoZSBzYW1lLCBidXQgc2V0ICgtQSBYKG4pICsgYikgdG8gYmUgKCAtIFsxLCAwLCAwLi4uXSAqIFgobikgKworICAvLyBnb2FsX2Nsb2NrKSwgd2Ugd2lsbCBkcml2ZSB0aGUgZGlzdHJpYnV0ZWQgY2xvY2sgdG8gYmUgd2hhdCBpdCBuZWVkcyB0byBiZQorICAvLyB0byBzZXQgYSBub2RlJ3MgY2xvY2sgdG8gdGhlIHJpZ2h0IHRpbWUuCisgIC8vCisgIC8vIFRoaXMgZW5kcyB1cCB3b3JraW5nIHN1cnByaXNpbmdseSB3ZWxsLiAgQSB0b3kgcHJvYmxlbSB3aXRoIDIgbGluZSBzZWdtZW50cworICAvLyBhbmQgMiBub2RlcyBjb252ZXJnZXMgaW4gMiBpdGVyYXRpb25zLgorICAvLworICAvLyBUbyBlbnN1cmUgcmVsaWFibGUgY29udmVyZ2VuY2UsIHdlIHdhbnQgdG8gbWFrZSAxIGFkanVzdG1lbnQgdG8gdGhlIGFib3ZlCisgIC8vIHByb2JsZW0gc3RhdGVtZW50LgorICAvLworICAvLyBkIGNvc3QvZHRhID0+CisgIC8vICAgMiAqICh0YiAtICgxICsgbWEpIHRhIC0gYmEpICogKC0oMSArIG1hKSkKKyAgLy8KKyAgLy8gVGhpcyBtZWFucyB0aGF0IGFzIHlvdSBtb3ZlIGJldHdlZW4gbGluZSBzZWdtZW50cyB3aXRoIGRpZmZlcmVudCBzbG9wZXMsCisgIC8vIHlvdSBlbmQgdXAgd2l0aCBzdGVwIGNoYW5nZXMgaW4gdGhlIGdyYWRpZW50LiAgU29sdmVycyBsaWtlIGNvbnRpbnVvdXMKKyAgLy8gZGVyaXZhdGl2ZXMuICBCdXQsIHdlIGRvbid0IHJlYWxseSBjYXJlIGlmIHRoaXMgaXMgYW4gZXhhY3Qgc29sdXRpb24gdG8gdGhlCisgIC8vIGNvc3QgcHJvYmxlbS4gIFdlIGp1c3QgY2FyZSB0aGF0IGl0IGlzIGNsb3NlIHRvIGEgc29sdXRpb24gdG8gdGhlIGNvc3QKKyAgLy8gcHJvYmxlbSBhbmQgbW9yZSBpbXBvcnRhbnRseSB3ZWxsIGJlaGF2ZWQuCisgIC8vCisgIC8vIFRoZSBzaW1wbGUgZml4IGlzIHRvIGlnbm9yZSB0aGUgc2xvcGUgd2hlbiBhcHBseWluZyB0aGUgY2hhaW4gcnVsZS4gIFRoaXMKKyAgLy8gbWFrZXMgdGhlIGRlcml2YXRpdmUganVzdCBiZSB0aGUgZGlzdGFuY2UgdG8gdGhlIGxpbmUsIHdoaWNoIGlzIGEKKyAgLy8gY29udGludW91cyBmdW5jdGlvbi4gIE5ld3RvbnMgbWV0aG9kIHRoZW4gY29udmVyZ2VzIHJlYWxseSByZWFsbHkgZWFzaWx5CisgIC8vIGV2ZXJ5IHRpbWUuCisgIENIRUNLX0dUKHN0YXRlcygpLCAwdSkgPDwgIjogTm8gbGl2ZSBub2RlcyB0byBzb2x2ZSBmb3IuIjsKKyAgUHJvYmxlbTo6RGVyaXZhdGl2ZXMgcmVzdWx0OwogCiAgIC8vIFdlIGdldCBiYWNrIGJvdGggaW50ZXJnZXIgYW5kIGRvdWJsZSByZW1haW5kZXJzIGZvciB0aGUgZ3JhZGllbnQuICBXZSB0aGVuCiAgIC8vIGFkZCB0aGVtIGFsbCB1cC4gIFJhdGhlciB0aGFuIGRvaW5nIHRoYXQgcHVyZWx5IGFzIGRvdWJsZXMsIGxldCdzIHNhdmUgdXAKQEAgLTE4NSwxMCArMjcyLDI2IEBACiAgIC8vIGJpZ2dlciBpc3N1ZSBhdCB0aGUgc3RhcnQgd2hlbiB3ZSBhcmUgZXh0cmFwb2xhdGluZyBhIGxvdCwgYW5kIHRoZSBvZmZzZXRzCiAgIC8vIGNhbiBiZSBxdWl0ZSBsYXJnZSBpbiBlYWNoIGRpcmVjdGlvbi4KICAgRWlnZW46Ok1hdHJpeDxjaHJvbm86Om5hbm9zZWNvbmRzLCBFaWdlbjo6RHluYW1pYywgMT4gaW50Z3JhZCA9Ci0gICAgICBFaWdlbjo6TWF0cml4PGNocm9ubzo6bmFub3NlY29uZHMsIEVpZ2VuOjpEeW5hbWljLCAxPjo6WmVybyhsaXZlX25vZGVzXyk7Ci0gIHJlc3VsdC5ncmFkaWVudCA9IEVpZ2VuOjpWZWN0b3JYZDo6WmVybyhsaXZlX25vZGVzXyk7CisgICAgICBFaWdlbjo6TWF0cml4PGNocm9ubzo6bmFub3NlY29uZHMsIEVpZ2VuOjpEeW5hbWljLCAxPjo6WmVybyhzdGF0ZXMoKSk7CisgIHJlc3VsdC5ncmFkaWVudCA9IEVpZ2VuOjpWZWN0b3JYZDo6WmVybyhzdGF0ZXMoKSk7CiAKLSAgcmVzdWx0Lmhlc3NpYW4gPSBFaWdlbjo6TWF0cml4WGQ6Olplcm8obGl2ZV9ub2Rlc18sIGxpdmVfbm9kZXNfKTsKKyAgcmVzdWx0Lmhlc3NpYW4gPSBFaWdlbjo6TWF0cml4WGQ6Olplcm8oc3RhdGVzKCksIHN0YXRlcygpKTsKKworICAvLyBDb25zdHJhaW4gdGhlIGF2ZXJhZ2Ugb2YgdGhlIHRpbWVzLgorICByZXN1bHQuQSA9CisgICAgICBFaWdlbjo6TWF0cml4WGQ6Ok9uZXMoMSwgc3RhdGVzKCkpIC8gc3RhdGljX2Nhc3Q8ZG91YmxlPihzdGF0ZXMoKSk7CisgIHJlc3VsdC5BeG1iID0gRWlnZW46OlZlY3RvclhkOjpaZXJvKDEpOworCisgIGlmIChhY3RpdmVfY29uc3RyYWludHMuc2l6ZSgpID4gMCB8fCBhbGwpIHsKKyAgICBjb25zdCBzaXplX3QgY29uc3RyYWludHMgPQorICAgICAgICBhbGwgPyBpbmVxdWFsaXR5X2NvbnN0cmFpbnRzXyA6IGFjdGl2ZV9jb25zdHJhaW50cy5zaXplKCk7CisgICAgcmVzdWx0LmYgPSBFaWdlbjo6TWF0cml4WGQ6Olplcm8oY29uc3RyYWludHMsIDEpOworICAgIHJlc3VsdC5kZiA9IEVpZ2VuOjpNYXRyaXhYZDo6WmVybyhjb25zdHJhaW50cywgc3RhdGVzKCkpOworICAgIHJlc3VsdC5kZl9zbG9wZV9saW1pdGVkID0gRWlnZW46Ok1hdHJpeFhkOjpaZXJvKGNvbnN0cmFpbnRzLCBzdGF0ZXMoKSk7CisgIH0KKworICBzaXplX3QgY29uc3RyYWludF9pbmRleCA9IDA7CisgIHNpemVfdCByZXN1bHRfY29uc3RyYWludF9pbmRleCA9IDA7CiAKICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBjbG9ja19vZmZzZXRfZmlsdGVyX2Zvcl9ub2RlXy5zaXplKCk7ICsraSkgewogICAgIGZvciAoc3RydWN0IEZpbHRlclBhaXIgJmZpbHRlciA6IGNsb2NrX29mZnNldF9maWx0ZXJfZm9yX25vZGVfW2ldKSB7CkBAIC0yMzgsMjkgKzM0MSw2NyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lX29mZnNldHMoYV9zb2x1dGlvbl9pbmRleCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2VfY2xvY2tfW2ZpbHRlci5iX2luZGV4XSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZV9vZmZzZXRzKGJfc29sdXRpb25faW5kZXgpKTsKLSAgICAgIGZpbHRlci5wb2ludGVyID0gc3RkOjptb3ZlKG9mZnNldF9lcnJvci5maXJzdCk7CisKKyAgICAgIHN0ZDo6cGFpcjxOb25jYXVzYWxUaW1lc3RhbXBGaWx0ZXI6OlBvaW50ZXIsCisgICAgICAgICAgICAgICAgc3RkOjp0dXBsZTxjaHJvbm86Om5hbm9zZWNvbmRzLCBkb3VibGUsIGRvdWJsZT4+CisgICAgICAgICAgYm91bmRzX29mZnNldF9lcnJvciA9IGZpbHRlci5maWx0ZXItPkJvdW5kc09mZnNldEVycm9yKAorICAgICAgICAgICAgICBmaWx0ZXIuYl9maWx0ZXIsIHN0ZDo6bW92ZShvZmZzZXRfZXJyb3IuZmlyc3QpLCBiYXNlX2Nsb2NrX1tpXSwKKyAgICAgICAgICAgICAgdGltZV9vZmZzZXRzKGFfc29sdXRpb25faW5kZXgpLCBiYXNlX2Nsb2NrX1tmaWx0ZXIuYl9pbmRleF0sCisgICAgICAgICAgICAgIHRpbWVfb2Zmc2V0cyhiX3NvbHV0aW9uX2luZGV4KSk7CisKKyAgICAgIGZpbHRlci5wb2ludGVyID0gc3RkOjptb3ZlKGJvdW5kc19vZmZzZXRfZXJyb3IuZmlyc3QpOwogCiAgICAgICBjb25zdCBzdGQ6OnBhaXI8Y2hyb25vOjpuYW5vc2Vjb25kcywgZG91YmxlPiBlcnJvciA9CiAgICAgICAgICAgc3RkOjptYWtlX3BhaXIoc3RkOjpnZXQ8MD4ob2Zmc2V0X2Vycm9yLnNlY29uZCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpnZXQ8MT4ob2Zmc2V0X2Vycm9yLnNlY29uZCkgLSBrTWluTmV0d29ya0RlbGF5KTsKIAotICAgICAgc3RkOjpwYWlyPGNocm9ubzo6bmFub3NlY29uZHMsIGRvdWJsZT4gZ3JhZDsKLSAgICAgIGRvdWJsZSBoZXNzOworICAgICAgY29uc3QgZG91YmxlIGJvdW5kc19lcnJvciA9CisgICAgICAgICAgKHN0ZDo6Z2V0PDA+KGJvdW5kc19vZmZzZXRfZXJyb3Iuc2Vjb25kKS5jb3VudCgpICsKKyAgICAgICAgICAgc3RkOjpnZXQ8MT4oYm91bmRzX29mZnNldF9lcnJvci5zZWNvbmQpIC0ga01pbk5ldHdvcmtEZWxheSk7CiAKLSAgICAgIGdyYWQgPSBzdGQ6Om1ha2VfcGFpcigyICogZXJyb3IuZmlyc3QsIDIgKiBlcnJvci5zZWNvbmQpOwotICAgICAgaGVzcyA9IDIuMDsKKyAgICAgIC8vIFdlIG5lZWQgZihYKSA8PSAwIHRvIGJlIG91ciBjb25zdHJhaW50LiAgQnV0LCByZW1lbWJlciwgT2Zmc2V0RXJyb3IgaXM6CisgICAgICAvLyAgICh0YiAtIHRhKSAtIE8odGEpCisgICAgICAvLyBXaXRoIGEgYml0IG9mIHJlc2h1ZmZsaW5nLCB3ZSBxdWlja2x5IHNlZSB0aGF0IGZvciBhbiBpbnZhbGlkIG9mZnNldAorICAgICAgLy8gKHNlZSBWYWxpZGF0ZVNvbHV0aW9uIGZvciB3aGF0IGlzIGludmFsaWQpLCBvZmZzZXQgKyB0YSA+PSB0Yiwgd2UgZW5kCisgICAgICAvLyB1cCB3aXRoIGEgbmVnYXRpdmUgdmFsdWUgb2YgZihYKS4gIFNvLCBmbGlwIHRoZSBzaWduIHRvIG1hdGNoIHRoZQorICAgICAgLy8gY29udmVudGlvbnMuCisgICAgICBpZiAoYWxsIHx8CisgICAgICAgICAgKHJlc3VsdF9jb25zdHJhaW50X2luZGV4IDwgYWN0aXZlX2NvbnN0cmFpbnRzLnNpemUoKSAmJgorICAgICAgICAgICBhY3RpdmVfY29uc3RyYWludHNbcmVzdWx0X2NvbnN0cmFpbnRfaW5kZXhdID09IGNvbnN0cmFpbnRfaW5kZXgpKSB7CisgICAgICAgIHJlc3VsdC5mKHJlc3VsdF9jb25zdHJhaW50X2luZGV4LCAwKSA9IC1ib3VuZHNfZXJyb3I7CisKKyAgICAgICAgcmVzdWx0LmRmKHJlc3VsdF9jb25zdHJhaW50X2luZGV4LCBhX3NvbHV0aW9uX2luZGV4KSArPQorICAgICAgICAgICAgMS4wICsgc3RkOjpnZXQ8Mj4oYm91bmRzX29mZnNldF9lcnJvci5zZWNvbmQpOworICAgICAgICByZXN1bHQuZGYocmVzdWx0X2NvbnN0cmFpbnRfaW5kZXgsIGJfc29sdXRpb25faW5kZXgpIC09IDEuMDsKKworICAgICAgICAvLyBOb3csIHJldHVybiBhIHNsb3BlIGxpbWl0ZWQgdmVyc2lvbiBvZiBvdXIgY29uc3RyYWludCBkZXJpdml0aXZlLgorICAgICAgICByZXN1bHQuZGZfc2xvcGVfbGltaXRlZChyZXN1bHRfY29uc3RyYWludF9pbmRleCwgYV9zb2x1dGlvbl9pbmRleCkgKz0KKyAgICAgICAgICAgIDEuMCArIGtNYXhWZWxvY2l0eSgpOworICAgICAgICByZXN1bHQuZGZfc2xvcGVfbGltaXRlZChyZXN1bHRfY29uc3RyYWludF9pbmRleCwgYl9zb2x1dGlvbl9pbmRleCkgLT0KKyAgICAgICAgICAgIDEuMDsKKyAgICAgICAgKytyZXN1bHRfY29uc3RyYWludF9pbmRleDsKKyAgICAgIH0KKworICAgICAgLy8gVE9ETyhhdXN0aW4pOiBBIGxvc3MgZnVuY3Rpb24gaGVyZSB3b3VsZCBiZSBuaWNlIHRvIGxldCB1cyBkZXdlaWdodAorICAgICAgLy8gb3V0bGllcnMgbW9yZS4gIFNvbWV0aGluZyBsb2dhcml0aG1pYy4KKyAgICAgIGNvbnN0IHN0ZDo6cGFpcjxjaHJvbm86Om5hbm9zZWNvbmRzLCBkb3VibGU+IGdyYWQgPQorICAgICAgICAgIHN0ZDo6bWFrZV9wYWlyKDIgKiBlcnJvci5maXJzdCwgMiAqIGVycm9yLnNlY29uZCk7CisgICAgICBjb25zdCBkb3VibGUgaGVzcyA9IDIuMDsKIAogICAgICAgaW50Z3JhZChhX3NvbHV0aW9uX2luZGV4KSArPSAtZ3JhZC5maXJzdDsKICAgICAgIGludGdyYWQoYl9zb2x1dGlvbl9pbmRleCkgKz0gZ3JhZC5maXJzdDsKICAgICAgIHJlc3VsdC5ncmFkaWVudChhX3NvbHV0aW9uX2luZGV4KSArPSAtZ3JhZC5zZWNvbmQ7CiAgICAgICByZXN1bHQuZ3JhZGllbnQoYl9zb2x1dGlvbl9pbmRleCkgKz0gZ3JhZC5zZWNvbmQ7CiAKLSAgICAgIFZMT0coMikgPDwgIiAgRmlsdGVyIHBhaXIgIgotICAgICAgICAgICAgICA8PCBmaWx0ZXIuZmlsdGVyLT5ub2RlX2EoKS0+bmFtZSgpLT5zdHJpbmdfdmlldygpIDw8ICIoIgotICAgICAgICAgICAgICA8PCBhX3NvbHV0aW9uX2luZGV4IDw8ICIpIC0+ICIKLSAgICAgICAgICAgICAgPDwgZmlsdGVyLmZpbHRlci0+bm9kZV9iKCktPm5hbWUoKS0+c3RyaW5nX3ZpZXcoKSA8PCAiKCIKLSAgICAgICAgICAgICAgPDwgYl9zb2x1dGlvbl9pbmRleCA8PCAiKTogIiA8PCBzdGQ6OnNldHByZWNpc2lvbigxMikKLSAgICAgICAgICAgICAgPDwgZXJyb3IuZmlyc3QuY291bnQoKSA8PCAiICsgIiA8PCBlcnJvci5zZWNvbmQ7CisgICAgICBpZiAoIXF1aWV0KSB7CisgICAgICAgIFNPTFZFX1ZMT0coc29sdmVfbnVtYmVyLCAzKQorICAgICAgICAgICAgPDwgIiAgRmlsdGVyIHBhaXIgIgorICAgICAgICAgICAgPDwgZmlsdGVyLmZpbHRlci0+bm9kZV9hKCktPm5hbWUoKS0+c3RyaW5nX3ZpZXcoKSA8PCAiKCIKKyAgICAgICAgICAgIDw8IGFfc29sdXRpb25faW5kZXggPDwgIikgLT4gIgorICAgICAgICAgICAgPDwgZmlsdGVyLmZpbHRlci0+bm9kZV9iKCktPm5hbWUoKS0+c3RyaW5nX3ZpZXcoKSA8PCAiKCIKKyAgICAgICAgICAgIDw8IGJfc29sdXRpb25faW5kZXggPDwgIik6ICIgPDwgc3RkOjpzZXRwcmVjaXNpb24oMTIpCisgICAgICAgICAgICA8PCBlcnJvci5maXJzdC5jb3VudCgpIDw8ICIgKyAiIDw8IGVycm9yLnNlY29uZDsKKyAgICAgIH0KIAogICAgICAgLy8gUmVtaW5kZXIsIG91ciBjb3N0IGZ1bmN0aW9uIGhhcyB0aGUgZm9sbG93aW5nIGZvcm0uCiAgICAgICAvLyAgICgodGIgLSAoMSArIG1hKSB0YSAtIGJhKV4yCkBAIC0yNzIsNiArNDEzLDggQEAKICAgICAgIHJlc3VsdC5oZXNzaWFuKGFfc29sdXRpb25faW5kZXgsIGJfc29sdXRpb25faW5kZXgpID0KICAgICAgICAgICByZXN1bHQuaGVzc2lhbihiX3NvbHV0aW9uX2luZGV4LCBhX3NvbHV0aW9uX2luZGV4KTsKICAgICAgIHJlc3VsdC5oZXNzaWFuKGJfc29sdXRpb25faW5kZXgsIGJfc29sdXRpb25faW5kZXgpICs9IGhlc3M7CisKKyAgICAgICsrY29uc3RyYWludF9pbmRleDsKICAgICB9CiAgIH0KIApAQCAtMjc5LDE3MiArNDIyLDEyOCBAQAogICAgIHJlc3VsdC5ncmFkaWVudChpKSArPSBzdGF0aWNfY2FzdDxkb3VibGU+KGludGdyYWQoaSkuY291bnQoKSk7CiAgIH0KIAotICByZXR1cm4gcmVzdWx0OwotfQotCi1zdGQ6OnR1cGxlPEVpZ2VuOjpWZWN0b3JYZCwgc2l6ZV90PiBUaW1lc3RhbXBQcm9ibGVtOjpOZXd0b24oCi0gICAgY29uc3QgRWlnZW46OlJlZjxFaWdlbjo6VmVjdG9yWGQ+IHRpbWVfb2Zmc2V0cywKLSAgICBjb25zdCBzdGQ6OnZlY3Rvcjxsb2dnZXI6OkJvb3RUaW1lc3RhbXA+ICZwb2ludHMpIHsKLSAgQ0hFQ0tfR1QobGl2ZV9ub2Rlc18sIDB1KSA8PCAiOiBObyBsaXZlIG5vZGVzIHRvIHNvbHZlIGZvci4iOwotICBjb25zdCBEZXJpdml0aXZlcyBkZXJpdml0aXZlcyA9IENvbXB1dGVEZXJpdml0aXZlcyh0aW1lX29mZnNldHMpOwotCi0gIGNvbnN0IEVpZ2VuOjpNYXRyaXhYZCBjb25zdHJhaW50X2phY29iaWFuID0KLSAgICAgIEVpZ2VuOjpNYXRyaXhYZDo6T25lcygxLCBsaXZlX25vZGVzXykgLyBzdGF0aWNfY2FzdDxkb3VibGU+KGxpdmVfbm9kZXNfKTsKLSAgLy8gaHR0cHM6Ly93d3cuY3MucHVyZHVlLmVkdS9ob21lcy9qaG9ub3Jpby8xNnNwcmluZy1jczUyMDAwLWVxdWFsaXR5LnBkZgotICAvLwotICAvLyBRdWV1ZSBsb25nIGV4cGxhbmF0aW9uIGZvciB3aHkgdGhpcyBpcyB0aGUgcmlnaHQgbWF0aC4uLgotICAvLwotICAvLyBPdXIgY29zdCBmdW5jdGlvbiBpcyBwaWVjZXdpc2UgcXVhZHJhdGljIGFuZCBzaW1wbGUgYnkgZGVzaWduLiAgSXQgc2hvdWxkCi0gIC8vIGFsc28gYmUgY29udmV4LiAgVGhpcyBtZWFucyBpdCBpcyBlcXVpdmFsZW50IGZvciB1cyB0byBkcml2ZSB0aGUgZ3JhZGllbnQKLSAgLy8gdG8gMCB0byBmaW5kIHRoZSBjb3JyZXNwb25kaW5nIHRpbWVzIG9uIGFsbCBub2Rlcy4KLSAgLy8KLSAgLy8gVGhpcyBnZXRzIHVzIGNsb3NlIGJ1dCBkb2Vzbid0IGxldCB1cyBzb2x2ZSBmb3IgdGhlIHRpbWUgY29ycmVzcG9uZGluZyB0byBhCi0gIC8vIHNwZWNpZmljIHRpbWUgb24gb25lIG5vZGUgb24gYWxsIHRoZSBub2Rlcy4KLSAgLy8KLSAgLy8gVG8gZG8gdGhpcywgd2Ugd2FudCBhIE5ld3RvbiBzb2x2ZXIgd2hpY2ggd29ya3MgZm9yIGVxdWFsaXR5IGNvbnN0cmFpbnRzLgotICAvLyAgIGFyZ21pbiBmKHgpIHN1YmplY3QgdG8ge0EgeCA9IGJ9Ci0gIC8vIE1vcmUgc3BlY2lmaWNhbGx5LCB3ZSB3YW50IGEgdmVyc2lvbiBvZiB0aGlzIHdoaWNoIHdpbGwgc3RhcnQgd2l0aAotICAvLyBpbmZlYXNpYmxlIGluaXRpYWwgc29sdXRpb25zLgotICAvLwotICAvLyBUaGUgbmV3dG9uIHN0ZXAgZm9yIHRoaXMgaXMKLSAgLy8gICBYKG4rMSkgPSBYKG4pICsgeG50Ci0gIC8vCi0gIC8vICAgW0hlc3NpYW4oY29zdChYKG4pKSkgQV5UXSBbeG50XSA9IFstZ3JhZChjb3N0KFgobikpKV0KLSAgLy8gICBbQSAgICAgICAgICAgICAgICAgICAgIDBdIFt3XSAgICAgWy1BIFgobikgKyBiICAgICAgXQotICAvLwotICAvLyBJdCB0dXJucyBvdXQgdGhhdCB3IGlzIHRoZSBkdWFsIG5ld3RvbiBzdGVwLiAgQnV0IHdlIGRvbid0IGFjdHVhbGx5IG5lZWQgdG8KLSAgLy8gdHJhY2sgdGhlIGR1YWwgcHJvYmxlbSB0byBzb2x2ZSBvdXIgcHJvYmxlbSBleGNlcHQgdG8gc2hvdyB0aGF0IHRoZSBkdWFsCi0gIC8vIHByb2JsZW0gaGFzIGFsc28gY29udmVyZ2VkLgotICAvLwotICAvLyBXZSBjb3VsZCBzZXQgQSB0byBbMSwgMCwgMCwgLi4uXSBhbmQgZm9yY2UgYSBzaW5nbGUgY2xvY2sgdG8gYSBzcGVjaWZpYwotICAvLyB0aW1lLiAgQnV0LCB0aGF0IHdpbGwgcmVzdWx0IGluIHRoZSBvcHRpbWFsIHNvbHV0aW9uIGJlaW5nIGRpZmZlcmVudAotICAvLyBkZXBlbmRpbmcgb24gd2hpY2ggbm9kZSBpcyBwaWNrZWQuCi0gIC8vCi0gIC8vIEluc3RlYWQsIGxldCdzIHNvbHZlIGZvciB0aGUgYXZlcmFnZSBjbG9jayBpbnN0ZWFkLiAgVGhpcyB3aWxsIGJlIGFsd2F5cwotICAvLyBzeW1tZXRyaWMsIGFuZCB3ZSBjYW4gZHJpdmUgdGhlIGdvYWwgZm9yIHRoYXQgY2xvY2sgdG8gbWFrZSBhbnkgaW5kaXZpZHVhbAotICAvLyBjbG9jayBoYXZlIHRoZSByaWdodCB0aW1lLiAgVGhhdCB3b3VsZCBiZSBhIHNvbHZlciB3cmFwcGVkIGFyb3VuZCBhIHNvbHZlci4KLSAgLy8KLSAgLy8gVHVybnMgb3V0LCB3ZSBjYW4gZG8gdGhhdCBieSBjb21iaW5pbmcgdGhlIGl0ZXJhdGlvbnMuICBJZiB3ZSBzZXQgQSB0bwotICAvLyBbMS9uLCAxL24sIDEvbiAuLi5dLCBhbmQgYiB0byB0aGUgZGlzdHJpYnV0ZWQgY2xvY2ssIHRoYXQgd291bGQgZHJpdmUgb3VyCi0gIC8vIHN0YXRlcyBzdWNoIHRoYXQgdGhlIGRpc3RyaWJ1dGVkIGNsb2NrIHdpbGwgYmUgd2hhdCB3ZSB3YW50LiAgSWYgd2UgaW5zdGVhZAotICAvLyBsZWF2ZSBBIHRoZSBzYW1lLCBidXQgc2V0ICgtQSBYKG4pICsgYikgdG8gYmUgKCAtIFsxLCAwLCAwLi4uXSAqIFgobikgKwotICAvLyBnb2FsX2Nsb2NrKSwgd2Ugd2lsbCBkcml2ZSB0aGUgZGlzdHJpYnV0ZWQgY2xvY2sgdG8gYmUgd2hhdCBpdCBuZWVkcyB0byBiZQotICAvLyB0byBzZXQgYSBub2RlJ3MgY2xvY2sgdG8gdGhlIHJpZ2h0IHRpbWUuCi0gIC8vCi0gIC8vIFRoaXMgZW5kcyB1cCB3b3JraW5nIHN1cnByaXNpbmdseSB3ZWxsLiAgQSB0b3kgcHJvYmxlbSB3aXRoIDIgbGluZSBzZWdtZW50cwotICAvLyBhbmQgMiBub2RlcyBjb252ZXJnZXMgaW4gMiBpdGVyYXRpb25zLgotICAvLwotICAvLyBUbyBlbnN1cmUgcmVsaWFibGUgY29udmVyZ2VuY2UsIHdlIHdhbnQgdG8gbWFrZSAxIGFkanVzdG1lbnQgdG8gdGhlIGFib3ZlCi0gIC8vIHByb2JsZW0gc3RhdGVtZW50LgotICAvLwotICAvLyBkIGNvc3QvZHRhID0+Ci0gIC8vICAgMiAqICh0YiAtICgxICsgbWEpIHRhIC0gYmEpICogKC0oMSArIG1hKSkKLSAgLy8KLSAgLy8gVGhpcyBtZWFucyB0aGF0IGFzIHlvdSBtb3ZlIGJldHdlZW4gbGluZSBzZWdtZW50cyB3aXRoIGRpZmZlcmVudCBzbG9wZXMsCi0gIC8vIHlvdSBlbmQgdXAgd2l0aCBzdGVwIGNoYW5nZXMgaW4gdGhlIGdyYWRpZW50LiAgU29sdmVycyBsaWtlIGNvbnRpbnVvdXMKLSAgLy8gZGVyaXZhdGl2ZXMuICBCdXQsIHdlIGRvbid0IHJlYWxseSBjYXJlIGlmIHRoaXMgaXMgYW4gZXhhY3Qgc29sdXRpb24gdG8gdGhlCi0gIC8vIGNvc3QgcHJvYmxlbS4gIFdlIGp1c3QgY2FyZSB0aGF0IGl0IGlzIGNsb3NlIHRvIGEgc29sdXRpb24gdG8gdGhlIGNvc3QKLSAgLy8gcHJvYmxlbSBhbmQgbW9yZSBpbXBvcnRhbnRseSB3ZWxsIGJlaGF2ZWQuCi0gIC8vCi0gIC8vIFRoZSBzaW1wbGUgZml4IGlzIHRvIGlnbm9yZSB0aGUgc2xvcGUgd2hlbiBhcHBseWluZyB0aGUgY2hhaW4gcnVsZS4gIFRoaXMKLSAgLy8gbWFrZXMgdGhlIGRlcml2YXRpdmUganVzdCBiZSB0aGUgZGlzdGFuY2UgdG8gdGhlIGxpbmUsIHdoaWNoIGlzIGEKLSAgLy8gY29udGludW91cyBmdW5jdGlvbi4gIE5ld3RvbnMgbWV0aG9kIHRoZW4gY29udmVyZ2VzIHJlYWxseSByZWFsbHkgZWFzaWx5Ci0gIC8vIGV2ZXJ5IHRpbWUuCi0KLSAgRWlnZW46Ok1hdHJpeFhkIGE7Ci0gIGEucmVzaXplKGxpdmVfbm9kZXNfICsgMSwgbGl2ZV9ub2Rlc18gKyAxKTsKLSAgYS5ibG9jaygwLCAwLCBsaXZlX25vZGVzXywgbGl2ZV9ub2Rlc18pID0gZGVyaXZpdGl2ZXMuaGVzc2lhbjsKLSAgYS5ibG9jaygwLCBsaXZlX25vZGVzXywgbGl2ZV9ub2Rlc18sIDEpID0gY29uc3RyYWludF9qYWNvYmlhbi50cmFuc3Bvc2UoKTsKLSAgYS5ibG9jayhsaXZlX25vZGVzXywgMCwgMSwgbGl2ZV9ub2Rlc18pID0gY29uc3RyYWludF9qYWNvYmlhbjsKLSAgYShsaXZlX25vZGVzXywgbGl2ZV9ub2Rlc18pID0gMC4wOwotCi0gIEVpZ2VuOjpWZWN0b3JYZCBiID0gRWlnZW46OlZlY3RvclhkOjpaZXJvKGxpdmVfbm9kZXNfICsgMSk7Ci0gIGIuYmxvY2soMCwgMCwgbGl2ZV9ub2Rlc18sIDEpID0gLWRlcml2aXRpdmVzLmdyYWRpZW50OwotCi0gIC8vIE5vdywgd2Ugd2FudCB0byBzZXQgYihsaXZlX25vZGVzXykgdG8gYmUgLXRpbWVfb2Zmc2V0IGZvciB0aGUgZWFybGllc3QKKyAgLy8gTm93LCB3ZSB3YW50IHRvIHNldCBBIHggLSBiIHRvIGJlIC10aW1lX29mZnNldCBmb3IgdGhlIGVhcmxpZXN0CiAgIC8vIGNsb2NrLgogICAvLwogICAvLyBUbyBzYXZlIG91cnNlbHZlcyBhIGZhaXIgYW1vdW50IG9mIGNvbXB1dGUsIHdlIGNhbiB0YWtlIHRoZSBtaW4gaGVyZS4gIFRoYXQKICAgLy8gd2lsbCBkcml2ZSB1cyBiYWNrIHRoZSBmdXJ0aGVzdCBiYWNrIGluIHRpbWUgZm9yIGFsbCBwcm92aWRlZCBub2RlcyB3aXRob3V0CiAgIC8vIGhhdmluZyB0byBzb2x2ZSBOIHRpbWVzIGFuZCBsb29rIGZvciB0aGUgZWFybGllc3Qgc29sdXRpb24uCi0gIHNpemVfdCBzb2x1dGlvbl9ub2RlID0gc3RkOjpudW1lcmljX2xpbWl0czxzaXplX3Q+OjptYXgoKTsKLSAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBwb2ludHMuc2l6ZSgpOyArK2kpIHsKLSAgICBpZiAocG9pbnRzW2ldID09IGxvZ2dlcjo6Qm9vdFRpbWVzdGFtcDo6bWF4X3RpbWUoKSkgeworICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHBvaW50c18uc2l6ZSgpOyArK2kpIHsKKyAgICBpZiAocG9pbnRzX1tpXSA9PSBsb2dnZXI6OkJvb3RUaW1lc3RhbXA6Om1heF90aW1lKCkpIHsKICAgICAgIGNvbnRpbnVlOwogICAgIH0KIAotICAgIENIRUNLX0VRKHBvaW50c1tpXS5ib290LCBiYXNlX2Nsb2NrKGkpLmJvb3QpOwotICAgIGNvbnN0IGRvdWJsZSBjYW5kaWRhdGVfYiA9Ci0gICAgICAgIGNocm9ubzo6ZHVyYXRpb248ZG91YmxlLCBzdGQ6Om5hbm8+KHBvaW50c1tpXS50aW1lIC0gYmFzZV9jbG9jayhpKS50aW1lKQotICAgICAgICAgICAgLmNvdW50KCkgLQotICAgICAgICB0aW1lX29mZnNldHMoTm9kZVRvRnVsbFNvbHV0aW9uSW5kZXgoaSkpOwotICAgIGlmIChjYW5kaWRhdGVfYiA8IGIobGl2ZV9ub2Rlc18pIHx8Ci0gICAgICAgIHNvbHV0aW9uX25vZGUgPT0gc3RkOjpudW1lcmljX2xpbWl0czxzaXplX3Q+OjptYXgoKSkgewotICAgICAgVkxPRygyKSA8PCAiTm9kZSAiIDw8IGkgPDwgIiwgc29sdXRpb24gdGltZSAiIDw8IHBvaW50c1tpXQotICAgICAgICAgICAgICA8PCAiLCBiYXNlX2Nsb2NrICIgPDwgYmFzZV9jbG9jayhpKSA8PCAiLCBlcnJvciAiIDw8IGNhbmRpZGF0ZV9iCi0gICAgICAgICAgICAgIDw8ICIgdGltZSBvZmZzZXQgIiA8PCB0aW1lX29mZnNldHMoTm9kZVRvRnVsbFNvbHV0aW9uSW5kZXgoaSkpOwotICAgICAgYihsaXZlX25vZGVzXykgPSBjYW5kaWRhdGVfYjsKLSAgICAgIHNvbHV0aW9uX25vZGUgPSBpOworICAgIENIRUNLX0VRKHBvaW50c19baV0uYm9vdCwgYmFzZV9jbG9jayhpKS5ib290KTsKKyAgICBjb25zdCBkb3VibGUgY2FuZGlkYXRlX2IgPSBjaHJvbm86OmR1cmF0aW9uPGRvdWJsZSwgc3RkOjpuYW5vPigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9pbnRzX1tpXS50aW1lIC0gYmFzZV9jbG9jayhpKS50aW1lKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY291bnQoKSAtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZV9vZmZzZXRzKE5vZGVUb0Z1bGxTb2x1dGlvbkluZGV4KGkpKTsKKyAgICBpZiAoKHJlc3VsdC5BeG1iLnJvd3MoKSAhPSAwICYmIGNhbmRpZGF0ZV9iIDwgLXJlc3VsdC5BeG1iKDAsIDApKSB8fAorICAgICAgICByZXN1bHQuc29sdXRpb25fbm9kZSA9PSBzdGQ6Om51bWVyaWNfbGltaXRzPHNpemVfdD46Om1heCgpKSB7CisgICAgICBpZiAoIXF1aWV0KSB7CisgICAgICAgIFNPTFZFX1ZMT0coc29sdmVfbnVtYmVyLCAxKQorICAgICAgICAgICAgPDwgIiAgTm9kZSAiIDw8IGkgPDwgIiwgZGVzaXJlZCBzb2x1dGlvbiB0aW1lICIgPDwgcG9pbnRzX1tpXQorICAgICAgICAgICAgPDwgIiwgYmFzZV9jbG9jayAiIDw8IGJhc2VfY2xvY2soaSkgPDwgIiwgZXJyb3IgIiA8PCBjYW5kaWRhdGVfYgorICAgICAgICAgICAgPDwgIiB0aW1lIG9mZnNldCAiIDw8IHRpbWVfb2Zmc2V0cyhOb2RlVG9GdWxsU29sdXRpb25JbmRleChpKSk7CisgICAgICB9CisgICAgICBpZiAocmVzdWx0LkF4bWIucm93cygpICE9IDApIHsKKyAgICAgICAgcmVzdWx0LkF4bWIoMCwgMCkgPSAtY2FuZGlkYXRlX2I7CisgICAgICB9CisgICAgICByZXN1bHQuc29sdXRpb25fbm9kZSA9IGk7CiAgICAgfQogICB9CiAKLSAgQ0hFQ0tfTkUoc29sdXRpb25fbm9kZSwgc3RkOjpudW1lcmljX2xpbWl0czxzaXplX3Q+OjptYXgoKSkKKyAgQ0hFQ0tfTkUocmVzdWx0LnNvbHV0aW9uX25vZGUsIHN0ZDo6bnVtZXJpY19saW1pdHM8c2l6ZV90Pjo6bWF4KCkpCiAgICAgICA8PCAiOiBObyBzb2x1dGlvbiBub2RlcywgcGxlYXNlIGludmVzdGlnYXRlIjsKIAotICByZXR1cm4gc3RkOjp0dXBsZTxFaWdlbjo6VmVjdG9yWGQsIHNpemVfdD4oYS5jb2xQaXZIb3VzZWhvbGRlclFyKCkuc29sdmUoYiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb2x1dGlvbl9ub2RlKTsKKyAgcmV0dXJuIHJlc3VsdDsKIH0KIAotc3RkOjp0dXBsZTxzdGQ6OnZlY3RvcjxCb290VGltZXN0YW1wPiwgc2l6ZV90LCBzaXplX3Q+Ci1UaW1lc3RhbXBQcm9ibGVtOjpTb2x2ZU5ld3Rvbihjb25zdCBzdGQ6OnZlY3Rvcjxsb2dnZXI6OkJvb3RUaW1lc3RhbXA+ICZwb2ludHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzaXplX3QgbWF4X2l0ZXJhdGlvbnMpIHsKLSAgTWF5YmVVcGRhdGVOb2RlTWFwcGluZygpOwotICBTT0xWRV9WTE9HKDIpIDw8ICJTdGFydGluZyB0byBzb2x2ZSBwcm9ibGVtIG51bWJlciAiIDw8IG15X3NvbHZlX251bWJlcl87Ci0gIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgcG9pbnRzLnNpemUoKTsgKytpKSB7Ci0gICAgaWYgKHBvaW50c1tpXSAhPSBsb2dnZXI6OkJvb3RUaW1lc3RhbXA6Om1heF90aW1lKCkpIHsKLSAgICAgIFNPTFZFX1ZMT0coMikgPDwgIlNvbHZpbmcgZm9yIG5vZGUgIiA8PCBpIDw8ICIgYXQgIiA8PCBwb2ludHNbaV07Ci0gICAgfQorRWlnZW46OlZlY3RvclhkIE5ld3RvblNvbHZlcjo6TmV3dG9uKGNvbnN0IFByb2JsZW06OkRlcml2YXRpdmVzICZkZXJpdmF0aXZlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgaXRlcmF0aW9uKSB7CisgIC8vIGh0dHBzOi8vd3d3LmNzLnB1cmR1ZS5lZHUvaG9tZXMvamhvbm9yaW8vMTZzcHJpbmctY3M1MjAwMC1lcXVhbGl0eS5wZGYKKyAgLy8gaHR0cHM6Ly93ZWIuc3RhbmZvcmQuZWR1L35ib3lkL2N2eGJvb2svYnZfY3Z4Ym9vay5wZGYgY2hhcHRlciAxMCBpcyBnb29kCisgIC8vIHRvby4KKworICBFaWdlbjo6TWF0cml4WGQgYTsKKyAgYS5yZXNpemUoZGVyaXZhdGl2ZXMuZ3JhZGllbnQucm93cygpICsgZGVyaXZhdGl2ZXMuQS5yb3dzKCksCisgICAgICAgICAgIGRlcml2YXRpdmVzLmdyYWRpZW50LnJvd3MoKSArIGRlcml2YXRpdmVzLkEucm93cygpKTsKKyAgYS5ibG9jaygwLCAwLCBkZXJpdmF0aXZlcy5ncmFkaWVudC5yb3dzKCksIGRlcml2YXRpdmVzLmdyYWRpZW50LnJvd3MoKSkgPQorICAgICAgZGVyaXZhdGl2ZXMuaGVzc2lhbjsKKyAgYS5ibG9jaygwLCBkZXJpdmF0aXZlcy5ncmFkaWVudC5yb3dzKCksIGRlcml2YXRpdmVzLmdyYWRpZW50LnJvd3MoKSwKKyAgICAgICAgICBkZXJpdmF0aXZlcy5BLnJvd3MoKSkgPSBkZXJpdmF0aXZlcy5BLnRyYW5zcG9zZSgpOworICBhLmJsb2NrKGRlcml2YXRpdmVzLmdyYWRpZW50LnJvd3MoKSwgMCwgZGVyaXZhdGl2ZXMuQS5yb3dzKCksCisgICAgICAgICAgZGVyaXZhdGl2ZXMuZ3JhZGllbnQucm93cygpKSA9IGRlcml2YXRpdmVzLkE7CisgIGEoZGVyaXZhdGl2ZXMuZ3JhZGllbnQucm93cygpLCBkZXJpdmF0aXZlcy5ncmFkaWVudC5yb3dzKCkpID0gMC4wOworCisgIEVpZ2VuOjpWZWN0b3JYZCBiID0gRWlnZW46OlZlY3RvclhkOjpaZXJvKGEucm93cygpKTsKKyAgYi5ibG9jaygwLCAwLCBkZXJpdmF0aXZlcy5ncmFkaWVudC5yb3dzKCksIDEpID0gLWRlcml2YXRpdmVzLmdyYWRpZW50OworICBpZiAoZGVyaXZhdGl2ZXMuQXhtYi5yb3dzKCkpIHsKKyAgICBiLmJsb2NrKGRlcml2YXRpdmVzLmdyYWRpZW50LnJvd3MoKSwgMCwgZGVyaXZhdGl2ZXMuQXhtYi5yb3dzKCksIDEpID0KKyAgICAgICAgLWRlcml2YXRpdmVzLkF4bWI7CiAgIH0KLSAgRWlnZW46OlZlY3RvclhkIGRhdGEgPSBFaWdlbjo6VmVjdG9yWGQ6Olplcm8obGl2ZV9ub2Rlc18pOworCisgIFZMT0coMikgPDwgIkE6ICIgPDwgYS5mb3JtYXQoa0hlYXZ5Rm9ybWF0KTsKKyAgVkxPRygyKSA8PCAiYjogIiA8PCBiLmZvcm1hdChrSGVhdnlGb3JtYXQpOworCisgIEVpZ2VuOjpWZWN0b3JYZCBzdGVwID0gYS5jb2xQaXZIb3VzZWhvbGRlclFyKCkuc29sdmUoYik7CisKKyAgaWYgKFNPTFZFX1ZMT0dfSVNfT04obXlfc29sdmVfbnVtYmVyXywgMikpIHsKKyAgICAvLyBQcmludCBvdXQgdGhlIGdyYWRpZW50IGlnbm9yaW5nIHRoZSBjb21wb25lbnQgcmVtb3ZlZCBieSB0aGUgZXF1YWxpdHkKKyAgICAvLyBjb25zdHJhaW50LiAgVGhpcyB0ZWxscyB1cyB3aGF0IGdyYWRpZW50IHdlIGFyZSBkZXBlbmRpbmcgdG8gdHJ5IHRvCisgICAgLy8gZmluaXNoIG91ciBzb2x1dGlvbi4KKyAgICBjb25zdCBFaWdlbjo6TWF0cml4WGQgY29uc3RyYWludF9qYWNvYmlhbiA9CisgICAgICAgIEVpZ2VuOjpNYXRyaXhYZDo6T25lcygxLCBkZXJpdmF0aXZlcy5ncmFkaWVudC5yb3dzKCkpIC8KKyAgICAgICAgc3RhdGljX2Nhc3Q8ZG91YmxlPihkZXJpdmF0aXZlcy5ncmFkaWVudC5yb3dzKCkpOworICAgIEVpZ2VuOjpWZWN0b3JYZCBhZGp1c3RlZF9ncmFkID0KKyAgICAgICAgZGVyaXZhdGl2ZXMuZ3JhZGllbnQgKworICAgICAgICBzdGVwKGRlcml2YXRpdmVzLmdyYWRpZW50LnJvd3MoKSkgKiBjb25zdHJhaW50X2phY29iaWFuLnRyYW5zcG9zZSgpOworCisgICAgU09MVkVfVkxPRyhteV9zb2x2ZV9udW1iZXJfLCAyKQorICAgICAgICA8PCAiQWRqdXN0ZWQgZ3JhZCAiIDw8IGl0ZXJhdGlvbiA8PCAiIC0+ICIgPDwgc3RkOjpzZXRwcmVjaXNpb24oMTIpCisgICAgICAgIDw8IHN0ZDo6Zml4ZWQgPDwgc3RkOjpzZXRmaWxsKCcgJykKKyAgICAgICAgPDwgYWRqdXN0ZWRfZ3JhZC50cmFuc3Bvc2UoKS5mb3JtYXQoa0hlYXZ5Rm9ybWF0KTsKKyAgfQorCisgIHJldHVybiBzdGVwOworfQorCitzdGQ6OnR1cGxlPEVpZ2VuOjpWZWN0b3JYZCwgc2l6ZV90LCBzaXplX3Q+IE5ld3RvblNvbHZlcjo6U29sdmVOZXd0b24oCisgICAgUHJvYmxlbSAqcHJvYmxlbSwgY29uc3Qgc2l6ZV90IG1heF9pdGVyYXRpb25zKSB7CisgIFNPTFZFX1ZMT0cobXlfc29sdmVfbnVtYmVyXywgMikKKyAgICAgIDw8ICJTdGFydGluZyB0byBzb2x2ZSBwcm9ibGVtIG51bWJlciAiIDw8IG15X3NvbHZlX251bWJlcl87CisKKyAgcHJvYmxlbS0+UHJlcGFyZShteV9zb2x2ZV9udW1iZXJfKTsKKworICBFaWdlbjo6VmVjdG9yWGQgZGF0YSA9IEVpZ2VuOjpWZWN0b3JYZDo6WmVybyhwcm9ibGVtLT5zdGF0ZXMoKSk7CiAKICAgc2l6ZV90IGl0ZXJhdGlvbiA9IDA7CiAgIHNpemVfdCBzb2x1dGlvbl9ub2RlOwogICB3aGlsZSAodHJ1ZSkgewotICAgIEVpZ2VuOjpWZWN0b3JYZCBzdGVwOwotICAgIHN0ZDo6dGllKHN0ZXAsIHNvbHV0aW9uX25vZGUpID0gTmV3dG9uKGRhdGEsIHBvaW50cyk7CisgICAgY29uc3QgUHJvYmxlbTo6RGVyaXZhdGl2ZXMgZGVyaXZhdGl2ZXMgPSBwcm9ibGVtLT5Db21wdXRlRGVyaXZhdGl2ZXMoCisgICAgICAgIG15X3NvbHZlX251bWJlcl8sIGRhdGEsIGZhbHNlLCBmYWxzZSwgYWJzbDo6U3Bhbjxjb25zdCBzaXplX3Q+KCkpOworICAgIGNvbnN0IEVpZ2VuOjpWZWN0b3JYZCBzdGVwID0gTmV3dG9uKGRlcml2YXRpdmVzLCBpdGVyYXRpb24pOworICAgIHNvbHV0aW9uX25vZGUgPSBkZXJpdmF0aXZlcy5zb2x1dGlvbl9ub2RlOwogCi0gICAgaWYgKFZMT0dfSVNfT04oMikpIHsKLSAgICAgIC8vIFByaW50IG91dCB0aGUgZ3JhZGllbnQgaWdub3JpbmcgdGhlIGNvbXBvbmVudCByZW1vdmVkIGJ5IHRoZSBlcXVhbGl0eQotICAgICAgLy8gY29uc3RyYWludC4gIFRoaXMgdGVsbHMgdXMgd2hhdCBncmFkaWVudCB3ZSBhcmUgZGVwZW5kaW5nIHRvIHRyeSB0bwotICAgICAgLy8gZmluaXNoIG91ciBzb2x1dGlvbi4KLSAgICAgIGNvbnN0IEVpZ2VuOjpNYXRyaXhYZCBjb25zdHJhaW50X2phY29iaWFuID0KLSAgICAgICAgICBFaWdlbjo6TWF0cml4WGQ6Ok9uZXMoMSwgbGl2ZV9ub2Rlc18pIC8KLSAgICAgICAgICBzdGF0aWNfY2FzdDxkb3VibGU+KGxpdmVfbm9kZXNfKTsKLSAgICAgIEVpZ2VuOjpWZWN0b3JYZCBhZGp1c3RlZF9ncmFkID0KLSAgICAgICAgICBDb21wdXRlRGVyaXZpdGl2ZXMoZGF0YSkuZ3JhZGllbnQgKwotICAgICAgICAgIHN0ZXAobGl2ZV9ub2Rlc18pICogY29uc3RyYWludF9qYWNvYmlhbi50cmFuc3Bvc2UoKTsKKyAgICBTT0xWRV9WTE9HKG15X3NvbHZlX251bWJlcl8sIDIpCisgICAgICAgIDw8ICJTdGVwICIgPDwgaXRlcmF0aW9uIDw8ICIgLT4gIiA8PCBzdGQ6OnNldHByZWNpc2lvbigxMikgPDwgc3RkOjpmaXhlZAorICAgICAgICA8PCBzdGQ6OnNldGZpbGwoJyAnKSA8PCBzdGVwLnRyYW5zcG9zZSgpLmZvcm1hdChrSGVhdnlGb3JtYXQpOwogCi0gICAgICBWTE9HKDIpIDw8ICJBZGp1c3RlZCBncmFkICIgPDwgaXRlcmF0aW9uIDw8ICIgLT4gIgotICAgICAgICAgICAgICA8PCBzdGQ6OnNldHByZWNpc2lvbigxMikgPDwgc3RkOjpmaXhlZCA8PCBzdGQ6OnNldGZpbGwoJyAnKQotICAgICAgICAgICAgICA8PCBhZGp1c3RlZF9ncmFkLnRyYW5zcG9zZSgpLmZvcm1hdChrSGVhdnlGb3JtYXQpOwotICAgIH0KKyAgICAvLyBXZSBub3cgaGF2ZSBhIHNlYXJjaCBkaXJlY3Rpb24uICBMaW5lIHNlYXJjaCBhbmQgZ28uCiAKLSAgICBWTE9HKDIpIDw8ICJTdGVwICIgPDwgaXRlcmF0aW9uIDw8ICIgLT4gIiA8PCBzdGQ6OnNldHByZWNpc2lvbigxMikKLSAgICAgICAgICAgIDw8IHN0ZDo6Zml4ZWQgPDwgc3RkOjpzZXRmaWxsKCcgJykKLSAgICAgICAgICAgIDw8IHN0ZXAudHJhbnNwb3NlKCkuZm9ybWF0KGtIZWF2eUZvcm1hdCk7CiAgICAgLy8gV2UgZ290IHRoZXJlIGlmIHRoZSBtYXggc3RlcCBpcyBzbWFsbCAodGhpcyBpcyBzdHJvbmdseSBjb3JyZWxhdGVkIHRvIHRoZQogICAgIC8vIGdyYWRpZW50IHNpbmNlIHRoZSBIZXNzaWFuIGlzIGNvbnN0YW50KSwgYW5kIG91ciBzb2x1dGlvbiBub2RlJ3MgdGltZSBpcwogICAgIC8vIGFsc28gY2xvc2UuCi0gICAgaWYgKHN0ZXAuYmxvY2soMCwgMCwgbGl2ZV9ub2Rlc18sIDEpLmxwTm9ybTxFaWdlbjo6SW5maW5pdHk+KCkgPCAxZS00ICYmCi0gICAgICAgIHN0ZDo6YWJzKAotICAgICAgICAgICAgY2hyb25vOjpkdXJhdGlvbjxkb3VibGUsIHN0ZDo6bmFubz4ocG9pbnRzW3NvbHV0aW9uX25vZGVdLnRpbWUgLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZV9jbG9jayhzb2x1dGlvbl9ub2RlKS50aW1lKQotICAgICAgICAgICAgICAgIC5jb3VudCgpIC0KLSAgICAgICAgICAgIGRhdGEoTm9kZVRvRnVsbFNvbHV0aW9uSW5kZXgoc29sdXRpb25fbm9kZSkpKSA8IDFlLTQpIHsKKworICAgIC8vIEdyYWQgaXMgPCBlcHNpbG9uLgorICAgIC8vIER1YWwgaXMgPCBlcHNpbG9uIHRvby4KKyAgICBpZiAoc3RlcC5ibG9jaygwLCAwLCBwcm9ibGVtLT5zdGF0ZXMoKSwgMSkubHBOb3JtPEVpZ2VuOjpJbmZpbml0eT4oKSA8CisgICAgICAgICAgICAxZS00ICYmCisgICAgICAgIGRlcml2YXRpdmVzLkF4bWIuc3F1YXJlZE5vcm0oKSA8IDFlLTgpIHsKICAgICAgIGJyZWFrOwogICAgIH0KIAotICAgIGRhdGEgKz0gc3RlcC5ibG9jaygwLCAwLCBsaXZlX25vZGVzXywgMSk7CisgICAgZGF0YSArPSBzdGVwLmJsb2NrKDAsIDAsIHByb2JsZW0tPnN0YXRlcygpLCAxKTsKIAogICAgICsraXRlcmF0aW9uOwogCkBAIC00NTcsMjggKzU1Niw3IEBACiAgICAgLy8gZGV0ZXJtaW5lIHRoYXQgdGhlIGRvdWJsZSBpcyBnZXR0aW5nIHRvbyBiaWcsIHdlIGNhbiBtb3ZlIHRoYXQKICAgICAvLyBpbmZvcm1hdGlvbiB0byB0aGUgaW50NjQgYmFzZSBjbG9jay4gIFRocmVzaG9sZCB0aGlzIHRvIG5vdCBiZSAqdG9vKiBiaWcKICAgICAvLyBzaW5jZSBpdCBtYWtlcyBpdCBoYXJkIHRvIGRlYnVnIGFzIHRoZSBkYXRhIGtlZXBzIGp1bXBpbmcgYXJvdW5kLgotICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwgc2l6ZSgpOyArK2opIHsKLSAgICAgIGNvbnN0IHNpemVfdCBzb2x1dGlvbl9pbmRleCA9IE5vZGVUb0Z1bGxTb2x1dGlvbkluZGV4KGopOwotICAgICAgaWYgKGxpdmUoaikgJiYgc3RkOjphYnMoZGF0YShzb2x1dGlvbl9pbmRleCkpID4gMTAwMCkgewotICAgICAgICBpbnQ2NF90IGRzb2x1dGlvbiA9Ci0gICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQ2NF90PihzdGQ6OnJvdW5kKGRhdGEoc29sdXRpb25faW5kZXgpKSk7Ci0gICAgICAgIGJhc2VfY2xvY2tfW2pdLnRpbWUgKz0gY2hyb25vOjpuYW5vc2Vjb25kcyhkc29sdXRpb24pOwotICAgICAgICBkYXRhKHNvbHV0aW9uX2luZGV4KSAtPSBkc29sdXRpb247Ci0gICAgICB9Ci0gICAgICBpZiAobGl2ZShqKSkgewotICAgICAgICBTT0xWRV9WTE9HKDIpIDw8ICIgICAgbGl2ZSAgIgotICAgICAgICAgICAgICAgICAgICAgIDw8IGJhc2VfY2xvY2tfW2pdLnRpbWUgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OmNocm9ubzo6bmFub3NlY29uZHMoc3RhdGljX2Nhc3Q8aW50NjRfdD4oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnJvdW5kKGRhdGEoTm9kZVRvRnVsbFNvbHV0aW9uSW5kZXgoaikpKSkpCi0gICAgICAgICAgICAgICAgICAgICAgPDwgIiAiCi0gICAgICAgICAgICAgICAgICAgICAgPDwgKGRhdGEoTm9kZVRvRnVsbFNvbHV0aW9uSW5kZXgoaikpIC0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpyb3VuZChkYXRhKE5vZGVUb0Z1bGxTb2x1dGlvbkluZGV4KGopKSkpCi0gICAgICAgICAgICAgICAgICAgICAgPDwgIiAodW5yb3VuZGVkOiAiIDw8IGRhdGEoTm9kZVRvRnVsbFNvbHV0aW9uSW5kZXgoaikpCi0gICAgICAgICAgICAgICAgICAgICAgPDwgIikiOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgU09MVkVfVkxPRygyKSA8PCAiICAgIGRlYWQgICIgPDwgYW9zOjptb25vdG9uaWNfY2xvY2s6Om1pbl90aW1lOwotICAgICAgfQotICAgIH0KKyAgICBwcm9ibGVtLT5VcGRhdGUobXlfc29sdmVfbnVtYmVyXywgZGF0YSk7CiAKICAgICAvLyBBbmQgZmluYWxseSwgZG9uJ3QgbGV0IHVzIGl0ZXJhdGUgZm9yZXZlci4gIElmIGl0IGlzbid0IGNvbnZlcmdpbmcsCiAgICAgLy8gcmVwb3J0IGJhY2suCkBAIC00ODcsNTQgKzU2NSw2NjEgQEAKICAgICB9CiAgIH0KIAotICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHBvaW50cy5zaXplKCk7ICsraSkgewotICAgIGlmIChwb2ludHNbaV0gIT0gbG9nZ2VyOjpCb290VGltZXN0YW1wOjptYXhfdGltZSgpKSB7Ci0gICAgICBTT0xWRV9WTE9HKDIpIDw8ICJTb2x2aW5nIGZvciBub2RlICIgPDwgaSA8PCAiIG9mICIgPDwgcG9pbnRzW2ldIDw8ICIgaW4gIgotICAgICAgICAgICAgICAgICAgICA8PCBpdGVyYXRpb24gPDwgIiBjeWNsZXMiOwotICAgIH0KKyAgaWYgKGl0ZXJhdGlvbiA+IG1heF9pdGVyYXRpb25zKSB7CisgICAgTE9HKEVSUk9SKSA8PCAiRmFpbGVkIHRvIGNvbnZlcmdlIG9uIHNvbHZlICIgPDwgbXlfc29sdmVfbnVtYmVyKCk7CiAgIH0KKworICBTT0xWRV9WTE9HKG15X3NvbHZlX251bWJlcl8sIDEpCisgICAgICA8PCAiVG9vayAiIDw8IGl0ZXJhdGlvbiA8PCAiIGl0ZXJhdGlvbnMgdG8gc29sdmUuIjsKKyAgcmV0dXJuIHN0ZDo6bWFrZV90dXBsZShzdGQ6Om1vdmUoZGF0YSksIHNvbHV0aW9uX25vZGUsIGl0ZXJhdGlvbik7Cit9CisKK1Byb2JsZW06OkRlcml2YXRpdmVzIE5ld3RvblNvbHZlcjo6QWRkQ29uc3RyYWludFNsYWNrVmFyaWFibGUoCisgICAgY29uc3QgUHJvYmxlbTo6RGVyaXZhdGl2ZXMgJmRlcml2YXRpdmVzLAorICAgIGNvbnN0IEVpZ2VuOjpSZWY8Y29uc3QgRWlnZW46OlZlY3RvclhkPiB5KSB7CisgIC8vIFNlZSBDb25zdHJhaW5lZE5ld3RvbigpIGZvciBhbiBleHBsYW5hdGlvbiBvZiBob3cgd2UgYXJlIGNoYW5naW5nIHRoZQorICAvLyBwcm9ibGVtIHN0YXRlbWVudC4KKyAgLy8KKyAgLy8gICBtaW5pbWl6ZSBmMChYLCBzKQorICAvLyAgICAgc3ViamVjdCB0byBmKFgpIDw9IHMKKyAgLy8gICAgICAgICAgICAgICAgIEEgWCAgPSBiCisgIC8vICAgICAgICAgICAgICAgICAgIHMgID0gMAorICBQcm9ibGVtOjpEZXJpdmF0aXZlcyByZXN1bHQ7CisKKyAgLy8gVGhlcmUncyBubyBleHRyYSBjb3N0IGhlc3NpYW4gYXMgcGFydCBvZiB0aGUgbmV3IHNsYWNrIHZhcmlhYmxlLCBzaW5jZSBpdAorICAvLyBpc24ndCBpbiB0aGUgY29zdCBmdW5jdGlvbiwgZjAuCisgIHJlc3VsdC5oZXNzaWFuID0gRWlnZW46Ok1hdHJpeFhkOjpaZXJvKGRlcml2YXRpdmVzLmhlc3NpYW4ucm93cygpICsgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVyaXZhdGl2ZXMuaGVzc2lhbi5yb3dzKCkgKyAxKTsKKyAgcmVzdWx0Lmhlc3NpYW4uYmxvY2soMCwgMCwgZGVyaXZhdGl2ZXMuaGVzc2lhbi5yb3dzKCksCisgICAgICAgICAgICAgICAgICAgICAgIGRlcml2YXRpdmVzLmhlc3NpYW4ucm93cygpKSA9IGRlcml2YXRpdmVzLmhlc3NpYW47CisKKyAgLy8gQW5kIHRoZSBncmFkaWVudCBvZiB0aGF0IGNvc3QgaXMgYWxzbyB6ZXJvLgorICByZXN1bHQuZ3JhZGllbnQgPSBFaWdlbjo6VmVjdG9yWGQ6Olplcm8oZGVyaXZhdGl2ZXMuZ3JhZGllbnQucm93cygpICsgMSk7CisKKyAgcmVzdWx0LmdyYWRpZW50LmJsb2NrKDAsIDAsIGRlcml2YXRpdmVzLmdyYWRpZW50LnJvd3MoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlcml2YXRpdmVzLmdyYWRpZW50LmNvbHMoKSkgPSBkZXJpdmF0aXZlcy5ncmFkaWVudDsKKworICAvLyBTdWJ0cmFjdCB0aGUgbmV3IHNsYWNrIHZhcmlhYmxlIGZyb20gZih4KS4KKyAgcmVzdWx0LmYgPSBkZXJpdmF0aXZlcy5mLmFycmF5KCkgLSB5KGRlcml2YXRpdmVzLmdyYWRpZW50LnJvd3MoKSwgMCk7CisKKyAgLy8gQW5kIHRoZSBkZXJpdml0aXZlIG9mIGYoeCkgLSBzICogT25lcyB3aXRoIHJlc3BlY3QgdG8gcyBpcyAtMS4KKyAgcmVzdWx0LmRmID0gLTEuMCAqIEVpZ2VuOjpNYXRyaXhYZDo6T25lcyhkZXJpdmF0aXZlcy5kZi5yb3dzKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVyaXZhdGl2ZXMuZGYuY29scygpICsgMSk7CisgIHJlc3VsdC5kZi5ibG9jaygwLCAwLCBkZXJpdmF0aXZlcy5kZi5yb3dzKCksIGRlcml2YXRpdmVzLmRmLmNvbHMoKSkgPQorICAgICAgZGVyaXZhdGl2ZXMuZGY7CisKKyAgcmVzdWx0LmRmX3Nsb3BlX2xpbWl0ZWQgPQorICAgICAgLTEuMCAqIEVpZ2VuOjpNYXRyaXhYZDo6T25lcyhkZXJpdmF0aXZlcy5kZl9zbG9wZV9saW1pdGVkLnJvd3MoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVyaXZhdGl2ZXMuZGZfc2xvcGVfbGltaXRlZC5jb2xzKCkgKyAxKTsKKyAgcmVzdWx0LmRmX3Nsb3BlX2xpbWl0ZWQuYmxvY2soMCwgMCwgZGVyaXZhdGl2ZXMuZGZfc2xvcGVfbGltaXRlZC5yb3dzKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlcml2YXRpdmVzLmRmX3Nsb3BlX2xpbWl0ZWQuY29scygpKSA9CisgICAgICBkZXJpdmF0aXZlcy5kZl9zbG9wZV9saW1pdGVkOworCisgIC8vIEFuZCBhZGQgaW4gcyA9IDAgaW50byBBLgorICByZXN1bHQuQSA9IEVpZ2VuOjpNYXRyaXhYZDo6WmVybyhkZXJpdmF0aXZlcy5BLnJvd3MoKSArIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlcml2YXRpdmVzLmhlc3NpYW4ucm93cygpICsgMSk7CisgIHJlc3VsdC5BLmJsb2NrKDAsIDAsIGRlcml2YXRpdmVzLkEucm93cygpLCBkZXJpdmF0aXZlcy5oZXNzaWFuLnJvd3MoKSkgPQorICAgICAgZGVyaXZhdGl2ZXMuQTsKKyAgcmVzdWx0LkEoZGVyaXZhdGl2ZXMuQS5yb3dzKCksIGRlcml2YXRpdmVzLmhlc3NpYW4ucm93cygpKSA9IDE7CisKKyAgcmVzdWx0LkF4bWIgPSBFaWdlbjo6TWF0cml4WGQ6Olplcm8oZGVyaXZhdGl2ZXMuQS5yb3dzKCkgKyAxLCAxKTsKKyAgcmVzdWx0LkF4bWIuYmxvY2soMCwgMCwgZGVyaXZhdGl2ZXMuQS5yb3dzKCksIDEpID0gZGVyaXZhdGl2ZXMuQXhtYjsKKyAgcmVzdWx0LkF4bWIoZGVyaXZhdGl2ZXMuQS5yb3dzKCksIDApID0geShkZXJpdmF0aXZlcy5oZXNzaWFuLnJvd3MoKSk7CisgIHJlc3VsdC5zb2x1dGlvbl9ub2RlID0gZGVyaXZhdGl2ZXMuc29sdXRpb25fbm9kZTsKKworICByZXR1cm4gcmVzdWx0OworfQorCitFaWdlbjo6VmVjdG9yWGQgTmV3dG9uU29sdmVyOjpSdChjb25zdCBQcm9ibGVtOjpEZXJpdmF0aXZlcyAmZGVyaXZhdGl2ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFaWdlbjo6UmVmPGNvbnN0IEVpZ2VuOjpWZWN0b3JYZD4geSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSB0X2ludmVyc2UpIHsKKyAgY29uc3QgRWlnZW46OlJlZjxjb25zdCBFaWdlbjo6VmVjdG9yWGQ+IHggPQorICAgICAgeS5ibG9jaygwLCAwLCBkZXJpdmF0aXZlcy5oZXNzaWFuLnJvd3MoKSwgMSk7CisgIGNvbnN0IEVpZ2VuOjpSZWY8Y29uc3QgRWlnZW46OlZlY3RvclhkPiBsYW1iZGEgPQorICAgICAgeS5ibG9jayhkZXJpdmF0aXZlcy5oZXNzaWFuLnJvd3MoKSwgMCwgZGVyaXZhdGl2ZXMuZi5yb3dzKCksIDEpOworICBjb25zdCBFaWdlbjo6UmVmPGNvbnN0IEVpZ2VuOjpWZWN0b3JYZD4gdiA9IHkuYmxvY2soCisgICAgICBkZXJpdmF0aXZlcy5oZXNzaWFuLnJvd3MoKSArIGxhbWJkYS5yb3dzKCksIDAsIGRlcml2YXRpdmVzLkEucm93cygpLCAxKTsKKworICBFaWdlbjo6VmVjdG9yWGQgcmVzdWx0KHkucm93cygpKTsKKworICAvLyByX2R1YWwgLT4gXGdyYWQgZl8wKFgpICsgRGYoeCleVCBcbGFtYmRhICsgQV5UIHYKKyAgLy8KKyAgLy8gV2UgbmVlZCB0byBsaWUgc2xpZ2h0bHkgYWJvdXQgdGhlIHByb2JsZW0gc3RhdGVtZW50IHRvIGdldCBpdCB0byBjb252ZXJnZS4KKyAgLy8gV2UgbmVlZCB0aGUgZGVjZW50IGRpcmVjdGlvbiAoaW4gQ29uc3RyYWluZWROZXd0b24pIHRvIHVzZSB0aGUgZXhhY3QKKyAgLy8gZGVyaXZhdGl2ZSBvZiBmKHgpIHNvIHdlIHdpbGwgZGVzY2VuZCBmb2xsb3dpbmcgdGhlIGNvbnN0cmFpbnRzIHdoZW4gd2UgYXJlCisgIC8vIG5leHQgdG8gYSBjb25zdHJhaW50IHRvIGF2b2lkIGdldHRpbmcgc3R1Y2sgd2l0aCBsaW5lIHNlYXJjaC4gIEJ1dCwgd2UgbmVlZAorICAvLyB0aGUgdmFsdWUgaXQgaXMgdHJ5aW5nIHRvIGNvbnZlcmdlIHRvICh0aGlzLCBSdCksIHRvIG5vdCBoYXZlIHN0ZXAgY2hhbmdlcworICAvLyBhY3Jvc3MgY29uc3RyYWludCBsaW5lIHNlZ21lbnQgYm91bmRhcmllcy4gIElmIHdlIGxpZSBoZXJlIGFuZCBwaWNrIHRoZQorICAvLyB3b3JzdCBjYXNlIHNsb3BlICh0aGUgc2xvcGVfbGltaXRlZCBzbG9wZSksIHRoZW4gdGhlcmUgd2lsbCBiZSBubyBzdGVwCisgIC8vIGNoYW5nZSBhY3Jvc3MgYm91bmRhcmllcy4KKyAgcmVzdWx0LmJsb2NrKDAsIDAsIHgucm93cygpLCAxKSA9CisgICAgICBkZXJpdmF0aXZlcy5ncmFkaWVudCArIGRlcml2YXRpdmVzLmRmX3Nsb3BlX2xpbWl0ZWQudHJhbnNwb3NlKCkgKiBsYW1iZGEgKworICAgICAgZGVyaXZhdGl2ZXMuQS50cmFuc3Bvc2UoKSAqIHY7CisKKyAgU09MVkVfVkxPRyhteV9zb2x2ZV9udW1iZXJfLCAzKQorICAgICAgPDwgIiAgICByX2R1YWw6ICIgPDwgc3RkOjpzZXRwcmVjaXNpb24oMTIpIDw8IHN0ZDo6Zml4ZWQKKyAgICAgIDw8IHN0ZDo6c2V0ZmlsbCgnICcpCisgICAgICA8PCBkZXJpdmF0aXZlcy5ncmFkaWVudC50cmFuc3Bvc2UoKS5mb3JtYXQoa0hlYXZ5Rm9ybWF0KSA8PCAiICsgIgorICAgICAgPDwgKGRlcml2YXRpdmVzLmRmX3Nsb3BlX2xpbWl0ZWQudHJhbnNwb3NlKCkgKiBsYW1iZGEpCisgICAgICAgICAgICAgLnRyYW5zcG9zZSgpCisgICAgICAgICAgICAgLmZvcm1hdChrSGVhdnlGb3JtYXQpCisgICAgICA8PCAiICsgIiA8PCAodi50cmFuc3Bvc2UoKSAqIGRlcml2YXRpdmVzLkEpLmZvcm1hdChrSGVhdnlGb3JtYXQpOworCisgIC8vIHJfY2VudCAtPiAtZGlhZyhcbGFtYmRhKSBmKHgpIC0gMSAvIHQgKiBcYm9sZHsxfQorICByZXN1bHQuYmxvY2soeC5yb3dzKCksIDAsIGxhbWJkYS5yb3dzKCksIDEpID0KKyAgICAgIC1sYW1iZGEuYXJyYXkoKSAqIGRlcml2YXRpdmVzLmYuYXJyYXkoKSAtIHRfaW52ZXJzZTsKKworICAvLyByX3ByaW1hbCAtPiBBIFggLSBiCisgIHJlc3VsdC5ibG9jayh4LnJvd3MoKSArIGxhbWJkYS5yb3dzKCksIDAsIHYucm93cygpLCAxKSA9IGRlcml2YXRpdmVzLkF4bWI7CisKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworc3RkOjp0dXBsZTxFaWdlbjo6VmVjdG9yWGQsIGRvdWJsZSwgRWlnZW46OlZlY3RvclhkPgorTmV3dG9uU29sdmVyOjpDb25zdHJhaW5lZE5ld3Rvbihjb25zdCBFaWdlbjo6UmVmPGNvbnN0IEVpZ2VuOjpWZWN0b3JYZD4geSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUHJvYmxlbTo6RGVyaXZhdGl2ZXMgJmRlcml2YXRpdmVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgLyppdGVyYXRpb24qLykgeworICAvLyBUT0RPKGF1c3Rpbik6IENhbiB3ZSB0YWtlIGEgcHJvYmxlbSBkaXJlY3RseSB3aXRob3V0CisgIC8vIEFkZENvbnN0cmFpbnRTbGFja1ZhcmlhYmxlIGJlaW5nIGNhbGxlZCBvbiBpdCBhbmQgZmlsbCBldmVyeXRoaW5nIGluPworICAvLyBUaGF0J2xsIGF2b2lkIGEgYnVuY2ggb2YgYWxsb2NhdGlvbnMgYW5kIGNvcHBpZXMgb2YgcmF0aGVyIHNpemFibGUKKyAgLy8gbWF0cmljaWVzLgorICAvLworICAvLyBJIHRoaW5rIEkgd2FudCB0byBkbyBpdCBhcyBhbm90aGVyIHJldmlldyBhZnRlciBldmVyeXRoaW5nIHdvcmtzIHdpdGggdGhlCisgIC8vIG1vcmUgb2J2aW91c2x5IHZlcmlmaWFibGUgc29sdXRpb24uCisKKyAgY29uc3QgRWlnZW46OlJlZjxjb25zdCBFaWdlbjo6VmVjdG9yWGQ+IHggPQorICAgICAgeS5ibG9jaygwLCAwLCBkZXJpdmF0aXZlcy5oZXNzaWFuLnJvd3MoKSwgMSk7CisKKyAgY29uc3QgRWlnZW46OlJlZjxjb25zdCBFaWdlbjo6VmVjdG9yWGQ+IGxhbWJkYSA9CisgICAgICB5LmJsb2NrKHgucm93cygpLCAwLCBkZXJpdmF0aXZlcy5mLnJvd3MoKSwgMSk7CisKKyAgY29uc3QgRWlnZW46OlJlZjxjb25zdCBFaWdlbjo6VmVjdG9yWGQ+IHYgPQorICAgICAgeS5ibG9jayh4LnJvd3MoKSArIGxhbWJkYS5yb3dzKCksIDAsIGRlcml2YXRpdmVzLkEucm93cygpLCAxKTsKKworICAvLyBodHRwczovL3dlYi5zdGFuZm9yZC5lZHUvfmJveWQvY3Z4Ym9vay9idl9jdnhib29rLnBkZiBjaGFwdGVyIDExLjcgaXMgZ29vZC4KKyAgLy8KKyAgLy8gU2VlIHRoZSB1bmNvbnN0cmFpbmVkIHNvbHZlciBhYm92ZSBmb3IgdGhlIGVxdWFsaXR5IGFuZCBjb3N0IGV4cGxpbmF0aW9uLgorICAvLworICAvLyBXZSBuZWVkIHRvIGFkZCBjb25zdHJhaW50cy4gIFJlbWVtYmVyLCBvdXIgcHJvYmxlbSBpcyBvZiB0aGUgZm9ybToKKyAgLy8KKyAgLy8gICBtaW5pbWl6ZSBmMChYKQorICAvLyAgICAgc3ViamVjdCB0byBmKFgpIDw9IDAKKyAgLy8gICAgICAgICAgICAgICAgIEEgWCAgPSBiCisgIC8vCisgIC8vIFVuZm9ydHVuYXRlbHksIHdlIG5lZWQgYSBmZWFzaWJsZSBYIHRvIHN0YXJ0IHdpdGguICBBIGJpZyBwYXJ0IG9mIHRoZQorICAvLyBwcm9ibGVtIGlzIGZpbmRpbmcgYSBmZWFzaWJsZSBYLiAgQnV0LCB3ZSBjYW4gZWFzaWx5IGF1Z21lbnQgb3VyIHByb2JsZW0gdG8KKyAgLy8gbWFrZSBpdCBmZWFzaWJsZS4KKyAgLy8KKyAgLy8gICBtaW5pbWl6ZSBmMChYLCBzKQorICAvLyAgICAgc3ViamVjdCB0byBmKFgpIDw9IHMKKyAgLy8gICAgICAgICAgICAgICAgIEEgWCAgPSBiCisgIC8vICAgICAgICAgICAgICAgICAgIHMgID0gMAorICAvLworICAvLyBzIGJlY29tZXMgcGFydCBvZiBYLCBhbmQgdGhlbiB0aGUgb3JpZ2luYWwgc29sdmVyIHdvcmtzLiAgV2UgY2FuIHBpY2sgYW4KKyAgLy8gYXJiaXRyYXJpbHkgbGFyZ2UgUyB0byBzdGFydCB3aXRoLCBtYWlubHkgbWF4KGYoWCksIDApLiAgV2UgYXJlIGZlYXNpYmxlCisgIC8vIHdoZW4gcyA9PSAwLgorICAvLworICAvLyBTaW5jZSBvdXIgY29uc3RyYWludHMgYXJlIGxpbmVhciwgd2UgZG9uJ3QgbmVlZCB0aGUgc2Vjb25kIGRlcml2aXRpdmUgb2YKKyAgLy8gdGhlIGNvbnN0cmFpbnRzLiAgVGhlIGVxdWF0aW9ucyBiZWxvdyByZW1vdmUgdGhvc2UgdG8gc2F2ZSB0aGUgQ1BVIHVzYWdlLgorICBjb25zdCBkb3VibGUgbnUgPSAtKGRlcml2YXRpdmVzLmYudHJhbnNwb3NlKCkgKiBsYW1iZGEpKDAsIDApOworICBjb25zdCBkb3VibGUgdF9pbnZlcnNlID0gbnUgLyAoa011ICogbGFtYmRhLnJvd3MoKSk7CisKKyAgLy8gTm93LCBidWlsZCB1cCB0aGUgc3RlcCBkaXJlY3Rpb24gbWF0cml4IHRvIHNvbHZlLgorICBFaWdlbjo6TWF0cml4WGQgbTEgPSBFaWdlbjo6TWF0cml4WGQ6Olplcm8oeS5yb3dzKCksIHkucm93cygpKTsKKyAgbTEuYmxvY2soMCwgMCwgeC5yb3dzKCksIHgucm93cygpKSA9IGRlcml2YXRpdmVzLmhlc3NpYW47CisgIC8vIFRPRE8oYXVzdGluKTogU2xvcGUgY29uc3RyYWluZWQgb3IgbGVhdmUgaXQgc3RvY2s/CisgIG0xLmJsb2NrKDAsIHgucm93cygpLCB4LnJvd3MoKSwgbGFtYmRhLnJvd3MoKSkgPSBkZXJpdmF0aXZlcy5kZi50cmFuc3Bvc2UoKTsKKworICBtMS5ibG9jaygwLCB4LnJvd3MoKSArIGxhbWJkYS5yb3dzKCksIHgucm93cygpLCB2LnJvd3MoKSkgPQorICAgICAgZGVyaXZhdGl2ZXMuQS50cmFuc3Bvc2UoKTsKKworICBtMS5ibG9jayh4LnJvd3MoKSwgMCwgbGFtYmRhLnJvd3MoKSwgeC5yb3dzKCkpID0KKyAgICAgIC0oRWlnZW46OkRpYWdvbmFsTWF0cml4PGRvdWJsZSwgRWlnZW46OkR5bmFtaWM+KGxhbWJkYSkgKiBkZXJpdmF0aXZlcy5kZik7CisKKyAgbTEuYmxvY2soeC5yb3dzKCksIHgucm93cygpLCBsYW1iZGEucm93cygpLCBsYW1iZGEucm93cygpKSA9CisgICAgICBFaWdlbjo6RGlhZ29uYWxNYXRyaXg8ZG91YmxlLCBFaWdlbjo6RHluYW1pYz4oLWRlcml2YXRpdmVzLmYpOworCisgIG0xLmJsb2NrKHgucm93cygpICsgbGFtYmRhLnJvd3MoKSwgMCwgdi5yb3dzKCksIHgucm93cygpKSA9IGRlcml2YXRpdmVzLkE7CisKKyAgU09MVkVfVkxPRyhteV9zb2x2ZV9udW1iZXJfLCAzKQorICAgICAgPDwgIiAgIG0xOiAgICAgICAgICIgPDwgbTEuZm9ybWF0KGtIZWF2eUZvcm1hdCk7CisKKyAgRWlnZW46OlZlY3RvclhkIHJ0ID0gUnQoZGVyaXZhdGl2ZXMsIHksIHRfaW52ZXJzZSk7CisgIFNPTFZFX1ZMT0cobXlfc29sdmVfbnVtYmVyXywgMikKKyAgICAgIDw8ICIgICBydDogIiA8PCBydC5ub3JtKCkgPDwgIiAiIDw8IHJ0LnRyYW5zcG9zZSgpLmZvcm1hdChrSGVhdnlGb3JtYXQpOworCisgIEVpZ2VuOjpWZWN0b3JYZCBkeSA9IG0xLmNvbFBpdkhvdXNlaG9sZGVyUXIoKS5zb2x2ZSgtcnQpOworICByZXR1cm4gc3RkOjp0dXBsZTxFaWdlbjo6VmVjdG9yWGQsIGRvdWJsZSwgRWlnZW46OlZlY3RvclhkPigKKyAgICAgIHN0ZDo6bW92ZShkeSksIHRfaW52ZXJzZSwgc3RkOjptb3ZlKHJ0KSk7Cit9CisKK3ZvaWQgTmV3dG9uU29sdmVyOjpQcmludERlcml2YXRpdmVzKGNvbnN0IFByb2JsZW06OkRlcml2YXRpdmVzICZkZXJpdmF0aXZlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEVpZ2VuOjpSZWY8Y29uc3QgRWlnZW46OlZlY3RvclhkPiB5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmdfdmlldyBwcmVmaXgsIGludCB2ZXJib3NpdHkpIHsKKyAgY29uc3QgRWlnZW46OlJlZjxjb25zdCBFaWdlbjo6VmVjdG9yWGQ+IHggPQorICAgICAgeS5ibG9jaygwLCAwLCBkZXJpdmF0aXZlcy5oZXNzaWFuLnJvd3MoKSwgMSk7CisgIGNvbnN0IEVpZ2VuOjpSZWY8Y29uc3QgRWlnZW46OlZlY3RvclhkPiBsYW1iZGEgPQorICAgICAgeS5ibG9jayh4LnJvd3MoKSwgMCwgZGVyaXZhdGl2ZXMuZi5yb3dzKCksIDEpOworCisgIGlmIChTT0xWRV9WTE9HX0lTX09OKG15X3NvbHZlX251bWJlcl8sIHZlcmJvc2l0eSkpIHsKKyAgICBFaWdlbjo6SU9Gb3JtYXQgaGVhdnkgPSBrSGVhdnlGb3JtYXQ7CisgICAgaGVhdnkucm93U2VwYXJhdG9yID0KKyAgICAgICAga0hlYXZ5Rm9ybWF0LnJvd1NlcGFyYXRvciArCisgICAgICAgIHN0ZDo6c3RyaW5nKGFic2w6OlN0ckNhdChnZXRwaWQoKSkuc2l6ZSgpICsgcHJlZml4LnNpemUoKSwgJyAnKTsKKworICAgIGNvbnN0IEVpZ2VuOjpSZWY8Y29uc3QgRWlnZW46OlZlY3RvclhkPiB2ID0KKyAgICAgICAgeS5ibG9jayh4LnJvd3MoKSArIGxhbWJkYS5yb3dzKCksIDAsIGRlcml2YXRpdmVzLkEucm93cygpLCAxKTsKKyAgICBTT0xWRV9WTE9HKG15X3NvbHZlX251bWJlcl8sIHZlcmJvc2l0eSkKKyAgICAgICAgPDwgIiAgICIgPDwgcHJlZml4IDw8ICJ4OiAiIDw8IHgudHJhbnNwb3NlKCkuZm9ybWF0KGhlYXZ5KTsKKyAgICBTT0xWRV9WTE9HKG15X3NvbHZlX251bWJlcl8sIHZlcmJvc2l0eSkKKyAgICAgICAgPDwgIiAgICIgPDwgcHJlZml4IDw8ICJsYW1iZGE6ICIgPDwgbGFtYmRhLnRyYW5zcG9zZSgpLmZvcm1hdChoZWF2eSk7CisgICAgU09MVkVfVkxPRyhteV9zb2x2ZV9udW1iZXJfLCB2ZXJib3NpdHkpCisgICAgICAgIDw8ICIgICAiIDw8IHByZWZpeCA8PCAidjogIiA8PCB2LnRyYW5zcG9zZSgpLmZvcm1hdChoZWF2eSk7CisgICAgU09MVkVfVkxPRyhteV9zb2x2ZV9udW1iZXJfLCB2ZXJib3NpdHkpCisgICAgICAgIDw8ICIgICIgPDwgcHJlZml4CisgICAgICAgIDw8ICJoZXNzaWFuOiAgICAgIiA8PCBkZXJpdmF0aXZlcy5oZXNzaWFuLmZvcm1hdChoZWF2eSk7CisgICAgU09MVkVfVkxPRyhteV9zb2x2ZV9udW1iZXJfLCB2ZXJib3NpdHkpCisgICAgICAgIDw8ICIgICIgPDwgcHJlZml4CisgICAgICAgIDw8ICJncmFkaWVudDogICAgIiA8PCBkZXJpdmF0aXZlcy5ncmFkaWVudC5mb3JtYXQoaGVhdnkpOworICAgIFNPTFZFX1ZMT0cobXlfc29sdmVfbnVtYmVyXywgdmVyYm9zaXR5KQorICAgICAgICA8PCAiICAiIDw8IHByZWZpeCA8PCAiQTogICAgICAgICAgICIgPDwgZGVyaXZhdGl2ZXMuQS5mb3JtYXQoaGVhdnkpOworICAgIFNPTFZFX1ZMT0cobXlfc29sdmVfbnVtYmVyXywgdmVyYm9zaXR5KQorICAgICAgICA8PCAiICAiIDw8IHByZWZpeCA8PCAiQXgtYjogICAgICAgICIgPDwgZGVyaXZhdGl2ZXMuQXhtYi5mb3JtYXQoaGVhdnkpOworICAgIFNPTFZFX1ZMT0cobXlfc29sdmVfbnVtYmVyXywgdmVyYm9zaXR5KQorICAgICAgICA8PCAiICAiIDw8IHByZWZpeCA8PCAiZjogICAgICAgICAgICIgPDwgZGVyaXZhdGl2ZXMuZi5mb3JtYXQoaGVhdnkpOworICAgIFNPTFZFX1ZMT0cobXlfc29sdmVfbnVtYmVyXywgdmVyYm9zaXR5KQorICAgICAgICA8PCAiICAiIDw8IHByZWZpeCA8PCAiZGY6ICAgICAgICAgICIgPDwgZGVyaXZhdGl2ZXMuZGYuZm9ybWF0KGhlYXZ5KTsKKyAgfQorfQorCitzdGQ6OnZlY3RvcjxCb290VGltZXN0YW1wPiBUaW1lc3RhbXBQcm9ibGVtOjpQYWNrUmVzdWx0cygKKyAgICBib29sIHByaW50LCBjb25zdCBFaWdlbjo6UmVmPGNvbnN0IEVpZ2VuOjpWZWN0b3JYZD4geSkgewogICBzdGQ6OnZlY3RvcjxCb290VGltZXN0YW1wPiByZXN1bHQoc2l6ZSgpKTsKKwogICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemUoKTsgKytpKSB7CiAgICAgaWYgKGxpdmUoaSkpIHsKICAgICAgIHJlc3VsdFtpXS5ib290ID0gYmFzZV9jbG9jayhpKS5ib290OwotICAgICAgcmVzdWx0W2ldLnRpbWUgPSBiYXNlX2Nsb2NrKGkpLnRpbWUgKworICAgICAgcmVzdWx0W2ldLnRpbWUgPQorICAgICAgICAgIGJhc2VfY2xvY2soaSkudGltZSArIHN0ZDo6Y2hyb25vOjpuYW5vc2Vjb25kcyhzdGF0aWNfY2FzdDxpbnQ2NF90PigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpyb3VuZCh5KE5vZGVUb0Z1bGxTb2x1dGlvbkluZGV4KGkpKSkpKTsKKyAgICAgIGlmIChwcmludCkgeworICAgICAgICBMT0coSU5GTykgPDwgIiAgICBsaXZlICIgPDwgcG9pbnRzX1tpXSA8PCAiIHZzIHNvbHV0aW9uICIKKyAgICAgICAgICAgICAgICAgIDw8IHJlc3VsdFtpXS50aW1lIDw8ICIgIgorICAgICAgICAgICAgICAgICAgPDwgKHkoTm9kZVRvRnVsbFNvbHV0aW9uSW5kZXgoaSkpIC0KKyAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnJvdW5kKHkoTm9kZVRvRnVsbFNvbHV0aW9uSW5kZXgoaSkpKSkKKyAgICAgICAgICAgICAgICAgIDw8ICIgKHVucm91bmRlZDogIiA8PCB5KE5vZGVUb0Z1bGxTb2x1dGlvbkluZGV4KGkpKSA8PCAiKSBkdCAiCisgICAgICAgICAgICAgICAgICA8PCAocG9pbnRzX1tpXS50aW1lIC0KKyAgICAgICAgICAgICAgICAgICAgICAoYmFzZV9jbG9ja19baV0udGltZSArCiAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6Y2hyb25vOjpuYW5vc2Vjb25kcyhzdGF0aWNfY2FzdDxpbnQ2NF90PigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6cm91bmQoZGF0YShOb2RlVG9GdWxsU29sdXRpb25JbmRleChpKSkpKSk7Ci0gICAgICBpZiAoVkxPR19JU19PTigyKSB8fCBpdGVyYXRpb24gPiBtYXhfaXRlcmF0aW9ucykgewotICAgICAgICBMT0coSU5GTykgPDwgImxpdmUgICIgPDwgcmVzdWx0W2ldIDw8ICIgIgotICAgICAgICAgICAgICAgICAgPDwgKGRhdGEoTm9kZVRvRnVsbFNvbHV0aW9uSW5kZXgoaSkpIC0KLSAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnJvdW5kKGRhdGEoTm9kZVRvRnVsbFNvbHV0aW9uSW5kZXgoaSkpKSkKLSAgICAgICAgICAgICAgICAgIDw8ICIgKHVucm91bmRlZDogIiA8PCBkYXRhKE5vZGVUb0Z1bGxTb2x1dGlvbkluZGV4KGkpKSA8PCAiKSI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnJvdW5kKHkoTm9kZVRvRnVsbFNvbHV0aW9uSW5kZXgoaSkpKSkpKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAuY291bnQoKQorICAgICAgICAgICAgICAgICAgPDwgIm5zIjsKICAgICAgIH0KICAgICB9IGVsc2UgewogICAgICAgcmVzdWx0W2ldID0gQm9vdFRpbWVzdGFtcDo6bWluX3RpbWUoKTsKLSAgICAgIGlmIChWTE9HX0lTX09OKDIpIHx8IGl0ZXJhdGlvbiA+IG1heF9pdGVyYXRpb25zKSB7Ci0gICAgICAgIExPRyhJTkZPKSA8PCAiZGVhZCAgIiA8PCByZXN1bHRbaV07CisgICAgICBpZiAocHJpbnQpIHsKKyAgICAgICAgTE9HKElORk8pIDw8ICIgIGRlYWQgICIgPDwgcmVzdWx0W2ldOwogICAgICAgfQogICAgIH0KICAgfQotICBpZiAoaXRlcmF0aW9uID4gbWF4X2l0ZXJhdGlvbnMpIHsKLSAgICBMT0coRVJST1IpIDw8ICJGYWlsZWQgdG8gY29udmVyZ2UuIjsKKworICByZXR1cm4gcmVzdWx0OworfQorCitib29sIFRpbWVzdGFtcFByb2JsZW06OkFkZENvbnN0cmFpbnRzKAorICAgIHNpemVfdCBzb2x2ZV9udW1iZXIsIGNvbnN0IHN0ZDo6dmVjdG9yPEJvb3RUaW1lc3RhbXA+ICZyZXN1bHQsCisgICAgc3RkOjp2ZWN0b3I8c2l6ZV90PiAqbmV3X2FjdGl2ZV9jb25zdHJhaW50cykgeworICBib29sIHVwZGF0ZWQgPSBmYWxzZTsKKyAgeworICAgIC8vIFRPRE8oYXVzdGluKTogTWFrZSB0aGlzIGEgZnVuY3Rpb24uCisgICAgc2l6ZV90IGNvbnN0cmFpbnRfaW5kZXggPSAwOworICAgIGZvciAoc2l6ZV90IGkgPSAwdTsgaSA8IGNsb2NrX29mZnNldF9maWx0ZXJfZm9yX25vZGVfLnNpemUoKTsgKytpKSB7CisgICAgICBmb3IgKGNvbnN0IHN0cnVjdCBGaWx0ZXJQYWlyICZmaWx0ZXIgOiBjbG9ja19vZmZzZXRfZmlsdGVyX2Zvcl9ub2RlX1tpXSkgeworICAgICAgICAvLyBUaGVyZSdzIG5vdGhpbmcgaW4gdGhpcyBkaXJlY3Rpb24sIHNvIHRoZXJlIHdpbGwgYmUgbm90aGluZyB0bworICAgICAgICAvLyB2YWxpZGF0ZS4KKyAgICAgICAgaWYgKGZpbHRlci5maWx0ZXItPnRpbWVzdGFtcHNfZW1wdHkoYmFzZV9jbG9ja19baV0uYm9vdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZV9jbG9ja19bZmlsdGVyLmJfaW5kZXhdLmJvb3QpKSB7CisgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICAvLyBTZWUgaWYgdGhpcyBjb25zdHJhaW50IGhhZCB0cm91YmxlLiAgTm90ZTogd2UgZG9uJ3QgY2FyZSBpZiBpdCBpcworICAgICAgICAvLyBiZWZvcmUgdGhlIGxhc3Qgc29sdXRpb24uICBJZiBpdCBpbmZsdWVuY2VzIHRoZSByZXN1bHQsIGl0IHdpbGwKKyAgICAgICAgLy8gY2hhbmdlIHRoZSBzb2x1dGlvbiBhbmQgd2UnbGwgbmVlZCB0byByZS1zb2x2ZSBhbnl3YXlzLiAgVGhlcmUncyBhCisgICAgICAgIC8vIGJpZyB2YWxpZGF0aW9uIHRoYXQgaGFwcGVucyBhZnRlcndhcmRzIHdoaWNoIHdpbGwgcGljayB1cCBpZiB3ZSBhcmUKKyAgICAgICAgLy8gYmVmb3JlIHRoZSBzdGFydC4KKyAgICAgICAgY29uc3QgYm9vbCBpdGVyYXRpb24gPSBmaWx0ZXIuZmlsdGVyLT5WYWxpZGF0ZVNvbHV0aW9uKAorICAgICAgICAgICAgZmlsdGVyLmJfZmlsdGVyLCBmaWx0ZXIucG9pbnRlciwgcmVzdWx0W2ldLCByZXN1bHRbZmlsdGVyLmJfaW5kZXhdLAorICAgICAgICAgICAgZmFsc2UsICFTT0xWRV9WTE9HX0lTX09OKHNvbHZlX251bWJlciwgMikpOworICAgICAgICBpZiAoIWl0ZXJhdGlvbikgeworICAgICAgICAgIC8vIE9rLCB3ZSBmb3VuZCBhIHZpb2xhdGVkIGNvbnN0cmFpbnQuICBBZGQgaXQgdG8gdGhlIGxpc3QuCisgICAgICAgICAgdXBkYXRlZCA9IHRydWU7CisgICAgICAgICAgQ0hFQ0soc3RkOjpmaW5kKG5ld19hY3RpdmVfY29uc3RyYWludHMtPmJlZ2luKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld19hY3RpdmVfY29uc3RyYWludHMtPmVuZCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdHJhaW50X2luZGV4KSA9PSBuZXdfYWN0aXZlX2NvbnN0cmFpbnRzLT5lbmQoKSkKKyAgICAgICAgICAgICAgPDwgIiB3aGlsZSBzb2x2aW5nICIgPDwgc29sdmVfbnVtYmVyIDw8ICIgY29uc3RyYWludCBpbmRleCAiCisgICAgICAgICAgICAgIDw8IGNvbnN0cmFpbnRfaW5kZXg7CisKKyAgICAgICAgICBTT0xWRV9WTE9HKHNvbHZlX251bWJlciwgMSkKKyAgICAgICAgICAgICAgPDwgIiBGb3VuZCBhIHZpb2xhdGVkIGNvbnN0cmFpbnQgYXQgaW5kZXggIiA8PCBjb25zdHJhaW50X2luZGV4CisgICAgICAgICAgICAgIDw8ICIgb24gcHJvYmxlbSAiIDw8IHNvbHZlX251bWJlcjsKKyAgICAgICAgICBuZXdfYWN0aXZlX2NvbnN0cmFpbnRzLT5pbnNlcnQoCisgICAgICAgICAgICAgIHN0ZDo6dXBwZXJfYm91bmQobmV3X2FjdGl2ZV9jb25zdHJhaW50cy0+YmVnaW4oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdfYWN0aXZlX2NvbnN0cmFpbnRzLT5lbmQoKSwgY29uc3RyYWludF9pbmRleCksCisgICAgICAgICAgICAgIGNvbnN0cmFpbnRfaW5kZXgpOworICAgICAgICB9CisKKyAgICAgICAgKytjb25zdHJhaW50X2luZGV4OworICAgICAgfQorICAgIH0KKworICAgIENIRUNLX0VRKGNvbnN0cmFpbnRfaW5kZXgsIGluZXF1YWxpdHlfY29uc3RyYWludHNfKTsKKyAgfQorICByZXR1cm4gdXBkYXRlZDsKK30KKworc3RkOjp0dXBsZTxzdGQ6OnZlY3RvcjxCb290VGltZXN0YW1wPiwgRWlnZW46OlZlY3RvclhkLCBzaXplX3QsIHNpemVfdD4KK1NvbHZlQ29uc3RyYWluZWROZXd0b24oTmV3dG9uU29sdmVyICpzb2x2ZXIsIFRpbWVzdGFtcFByb2JsZW0gKnByb2JsZW0sCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNpemVfdCBtYXhfaXRlcmF0aW9ucykgeworICBzdGQ6OnZlY3RvcjxzaXplX3Q+IGFjdGl2ZV9jb25zdHJhaW50czsKKworICB3aGlsZSAodHJ1ZSkgeworICAgIEVpZ2VuOjpWZWN0b3JYZCB5OworICAgIHNpemVfdCBpdGVyYXRpb247CisgICAgc2l6ZV90IHNvbHV0aW9uX25vZGU7CisgICAgc3RkOjp2ZWN0b3I8c2l6ZV90PiBuZXdfYWN0aXZlX2NvbnN0cmFpbnRzOworCisgICAgc3RkOjp0aWUoeSwgc29sdXRpb25fbm9kZSwgaXRlcmF0aW9uLCBuZXdfYWN0aXZlX2NvbnN0cmFpbnRzKSA9CisgICAgICAgIHNvbHZlci0+U29sdmVDb25zdHJhaW5lZE5ld3Rvbihwcm9ibGVtLCBtYXhfaXRlcmF0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGl2ZV9jb25zdHJhaW50cyk7CisKKyAgICBzdGQ6OnZlY3RvcjxCb290VGltZXN0YW1wPiByZXN1bHQgPQorICAgICAgICBwcm9ibGVtLT5QYWNrUmVzdWx0cyhpdGVyYXRpb24gPiBtYXhfaXRlcmF0aW9ucyB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU09MVkVfVkxPR19JU19PTihzb2x2ZXItPm15X3NvbHZlX251bWJlcigpLCAyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeSk7CisKKyAgICBjb25zdCBib29sIHZhbGlkID0gIXByb2JsZW0tPkFkZENvbnN0cmFpbnRzKAorICAgICAgICBzb2x2ZXItPm15X3NvbHZlX251bWJlcigpLCByZXN1bHQsICZuZXdfYWN0aXZlX2NvbnN0cmFpbnRzKTsKKworICAgIGlmICh2YWxpZCB8fAorICAgICAgICBhY3RpdmVfY29uc3RyYWludHMuc2l6ZSgpID09IHByb2JsZW0tPmluZXF1YWxpdHlfY29uc3RyYWludHMoKSkgeworICAgICAgcmV0dXJuIHN0ZDo6bWFrZV90dXBsZShzdGQ6Om1vdmUocmVzdWx0KSwgc3RkOjptb3ZlKHkpLCBzb2x1dGlvbl9ub2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVyYXRpb24pOworICAgIH0gZWxzZSB7CisgICAgICBDSEVDSyhuZXdfYWN0aXZlX2NvbnN0cmFpbnRzICE9IGFjdGl2ZV9jb25zdHJhaW50cyk7CisgICAgICBhY3RpdmVfY29uc3RyYWludHMgPSBzdGQ6Om1vdmUobmV3X2FjdGl2ZV9jb25zdHJhaW50cyk7CisgICAgICBTT0xWRV9WTE9HKHNvbHZlci0+bXlfc29sdmVfbnVtYmVyKCksIDEpCisgICAgICAgICAgPDwgIkNvbnN0cmFpbnQgaW5kaWNlcyBjaGFuZ2VkLCBzb2x2aW5nIGFnYWluIHdpdGggbW9yZSBjb25zdHJhaW50cy4iOworICAgIH0KKyAgfQorfQorCitzdGQ6OnR1cGxlPEVpZ2VuOjpWZWN0b3JYZCwgc2l6ZV90LCBzaXplX3QsIHN0ZDo6dmVjdG9yPHNpemVfdD4+CitOZXd0b25Tb2x2ZXI6OlNvbHZlQ29uc3RyYWluZWROZXd0b24oCisgICAgUHJvYmxlbSAqcHJvYmxlbSwgY29uc3Qgc2l6ZV90IG1heF9pdGVyYXRpb25zLAorICAgIGNvbnN0IGFic2w6OlNwYW48Y29uc3Qgc2l6ZV90PiBvcmlnaW5hbF9hY3RpdmVfY29uc3RyYWludHMpIHsKKyAgLy8gSW1wbGVtZW50IGEgcHJpbWFsLWR1YWwgaW50ZXJpb3IgcG9pbnQgbWV0aG9kIHNvbHZlci4KKyAgLy8KKyAgLy8gaHR0cHM6Ly93ZWIuc3RhbmZvcmQuZWR1L35ib3lkL2N2eGJvb2svYnZfY3Z4Ym9vay5wZGYgY2hhcHRlciAxMS43IGhhcyBhCisgIC8vIGdvb2QgZGVzY3JpcHRpb24uICBJdCBpcyB3b3J0aCBoYXZpbmcgdGhlIGJvb2sgb3BlbiB3aGVuIHJlYWRpbmcgdGhpcyBjb2RlLgorICBTT0xWRV9WTE9HKG15X3NvbHZlX251bWJlcl8sIDIpCisgICAgICA8PCAiU3RhcnRpbmcgdG8gc29sdmUgcHJvYmxlbSBudW1iZXIgIiA8PCBteV9zb2x2ZV9udW1iZXJfOworCisgIHByb2JsZW0tPlByZXBhcmUobXlfc29sdmVfbnVtYmVyXyk7CisKKyAgRWlnZW46OlZlY3RvclhkIHk7CisgIHNpemVfdCBpdGVyYXRpb24gPSAwOworICBzaXplX3Qgc29sdXRpb25fbm9kZTsKKworICBzdGQ6OnZlY3RvcjxzaXplX3Q+IGFjdGl2ZV9jb25zdHJhaW50czsKKworICB7CisgICAgY29uc3QgUHJvYmxlbTo6RGVyaXZhdGl2ZXMgZGVyaXZhdGl2ZXMgPSBBZGRDb25zdHJhaW50U2xhY2tWYXJpYWJsZSgKKyAgICAgICAgcHJvYmxlbS0+Q29tcHV0ZURlcml2YXRpdmVzKG15X3NvbHZlX251bWJlcl8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFaWdlbjo6VmVjdG9yWGQ6Olplcm8ocHJvYmxlbS0+c3RhdGVzKCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UsIHRydWUsIGFic2w6OlNwYW48Y29uc3Qgc2l6ZV90PigpKSwKKyAgICAgICAgRWlnZW46OlZlY3RvclhkOjpaZXJvKHByb2JsZW0tPnN0YXRlcygpICsgMSkpOworCisgICAgc2l6ZV90IG9yaWdpbmFsX2NvbnN0cmFpbnRfaW5kZXggPSAwOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc3RhdGljX2Nhc3Q8c2l6ZV90PihkZXJpdmF0aXZlcy5mLnJvd3MoKSk7ICsraSkgeworICAgICAgaWYgKG9yaWdpbmFsX2NvbnN0cmFpbnRfaW5kZXggPCBvcmlnaW5hbF9hY3RpdmVfY29uc3RyYWludHMuc2l6ZSgpICYmCisgICAgICAgICAgb3JpZ2luYWxfYWN0aXZlX2NvbnN0cmFpbnRzW29yaWdpbmFsX2NvbnN0cmFpbnRfaW5kZXhdID09IGkpIHsKKyAgICAgICAgU09MVkVfVkxPRyhteV9zb2x2ZV9udW1iZXJfLCAxKQorICAgICAgICAgICAgPDwgIiBDb25zaWRlcmluZyBjb25zdHJhaW50ICIgPDwgaSA8PCAiIGZyb20gYmVmb3JlIjsKKyAgICAgICAgYWN0aXZlX2NvbnN0cmFpbnRzLmVtcGxhY2VfYmFjayhpKTsKKyAgICAgICAgKytvcmlnaW5hbF9jb25zdHJhaW50X2luZGV4OworICAgICAgfSBlbHNlIGlmIChkZXJpdmF0aXZlcy5mKGkpID4gMC4wIHx8ICFGTEFHU19yZW1vdmVfdW5saWtlbHlfY29uc3RyYWludHMpIHsKKyAgICAgICAgU09MVkVfVkxPRyhteV9zb2x2ZV9udW1iZXJfLCAxKSA8PCAiIENvbnNpZGVyaW5nIGNvbnN0cmFpbnQgIiA8PCBpOworICAgICAgICBhY3RpdmVfY29uc3RyYWludHMuZW1wbGFjZV9iYWNrKGkpOworICAgICAgfQorICAgIH0KKworICAgIC8vIEFzc3VtZSB0aGUgaW5pdGlhbCB0aW1lcyB3ZSBhcmUgc29sdmluZyBmb3IgYXJlIGRlY2VudCwgYW5kIG91ciBlcXVhbGl0eQorICAgIC8vIGNvbnN0cmFpbnRzIGFyZSBnb29kLgorICAgIHkgPSBFaWdlbjo6VmVjdG9yWGQ6Olplcm8oZGVyaXZhdGl2ZXMuaGVzc2lhbi5yb3dzKCkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aXZlX2NvbnN0cmFpbnRzLnNpemUoKSArIGRlcml2YXRpdmVzLkEucm93cygpKTsKKworICAgIC8vIEluaXRpYWxpemUgb3VyIHNsYWNrIHZhcmlhYmxlIHRvIHRoZSBtYXggY29uc3RyYWludCBwbHVzIGEgbGl0dGxlIGJpdCBzbworICAgIC8vIG91ciBpbmVxdWFsaXR5IGNvbnN0cmFpbnRzIGFyZSBhbGwgc2F0aXNmaWVkIGF0IHRoZSBzdGFydC4KKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGRlcml2YXRpdmVzLmYucm93cygpOyArK2kpIHsKKyAgICAgIHkoZGVyaXZhdGl2ZXMuaGVzc2lhbi5yb3dzKCkgLSAxLCAwKSA9CisgICAgICAgICAgc3RkOjptYXgoeShkZXJpdmF0aXZlcy5oZXNzaWFuLnJvd3MoKSAtIDEsIDApLCBkZXJpdmF0aXZlcy5mKGkpKSArIDE7CisgICAgfQorCisgICAgLy8gSW5pdGlhbGl6ZSBvdXIgaW5lcXVhbGl0eSBjb25zdHJhaW50IGxlZ3JhbmdlIG11bHRpcGxpZXJzIHRvIGJlIGFib3V0IHRoZQorICAgIC8vIHNpemUgb2YgdGhlIHZpb2xhdGlvbiBvZiB0aGUgY29uc3RyYWludC4gIFRoZSBzbG9wZSBpcyB+MSBmb3IgZWFjaCwgc28gaXQKKyAgICAvLyBzaG91bGQgd29yayBvdXQgdG8gYmUgYWJvdXQgdGhlIHJpZ2h0IG9yZGVyIG9mIG1hZ25pdHVkZS4KKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGFjdGl2ZV9jb25zdHJhaW50cy5zaXplKCk7ICsraSkgeworICAgICAgeShkZXJpdmF0aXZlcy5ncmFkaWVudC5yb3dzKCkgKyBpKSA9CisgICAgICAgICAgc3RkOjptYXgoZGVyaXZhdGl2ZXMuZihhY3RpdmVfY29uc3RyYWludHNbaV0pLCAxLjApOworICAgIH0KKworICAgIFNPTFZFX1ZMT0cobXlfc29sdmVfbnVtYmVyXywgMSkKKyAgICAgICAgPDwgIlMgaW5pdGlhbCBpcyAiIDw8IHkoZGVyaXZhdGl2ZXMuaGVzc2lhbi5yb3dzKCkgLSAxLCAwKTsKKyAgICBTT0xWRV9WTE9HKG15X3NvbHZlX251bWJlcl8sIDEpCisgICAgICAgIDw8ICJZIGluaXRpYWwgaXMgIiA8PCB5LnRyYW5zcG9zZSgpLmZvcm1hdChrSGVhdnlGb3JtYXQpOwogICB9CiAKLSAgcmV0dXJuIHN0ZDo6bWFrZV90dXBsZShzdGQ6Om1vdmUocmVzdWx0KSwgc29sdXRpb25fbm9kZSwgaXRlcmF0aW9uKTsKKyAgUHJvYmxlbTo6RGVyaXZhdGl2ZXMgZGVyaXZhdGl2ZXMgPSBBZGRDb25zdHJhaW50U2xhY2tWYXJpYWJsZSgKKyAgICAgIHByb2JsZW0tPkNvbXB1dGVEZXJpdmF0aXZlcyhteV9zb2x2ZV9udW1iZXJfLCB5LCBmYWxzZSwgZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aXZlX2NvbnN0cmFpbnRzKSwKKyAgICAgIHkpOworICB3aGlsZSAodHJ1ZSkgeworICAgIFNPTFZFX1ZMT0cobXlfc29sdmVfbnVtYmVyXywgMSkgPDwgIlN0YXJ0aW5nIGl0ZXJhdGlvbiAiIDw8IGl0ZXJhdGlvbjsKKyAgICAvLyBOb3cgdGhhdCB3ZSBoYXZlIGFsbCB0aGUgZGVyaXZhdGl2ZXMgY29tcHV0ZWQsIHdlIGNhbiBzdGFydCB0byBleGVjdXRlCisgICAgLy8gdGhpcyBzdGVwLgorICAgIC8vCisgICAgLy8gTm90ZTogd2UgZG9uJ3Qgd2FudCB0byByZWNvbXB1dGUgdGhlbSBoZXJlLiAgRm9yIHRoZSBmaXJzdCBpdGVyYXRpb24sIHdlCisgICAgLy8gY29tcHV0ZSB0aGVtIG91dHNpZGUgdGhlIGxvb3AuICBGb3IgYW55IHN1YnNlcXVlbnQgaXRlcmF0aW9ucywgYXMgcGFydCBvZgorICAgIC8vIGxpbmUgc2VhcmNoLCB3ZSBjb21wdXRlIHRoZSBkZXJpdmF0aXZlcyB0byBjb21wdXRlIFJ0LiAgU28sIHdlIGNhbiBqdXN0CisgICAgLy8gcmV1c2UgdGhlIGZpbmFsIGxpbmUgc2VhcmNoIHN0ZXAncyBkZXJpdmF0aXZlcy4KKworICAgIHNvbHV0aW9uX25vZGUgPSBkZXJpdmF0aXZlcy5zb2x1dGlvbl9ub2RlOworICAgIFNPTFZFX1ZMT0cobXlfc29sdmVfbnVtYmVyXywgMSkgPDwgIiAgIHkoIiA8PCBpdGVyYXRpb24gPDwgIikgaXMgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgeS50cmFuc3Bvc2UoKS5mb3JtYXQoa0hlYXZ5Rm9ybWF0KTsKKworICAgIC8vIFJvdW5kIGxhbWJkYSBzbyB3aGVuIHdlIGdldCBzdXBlciBjbG9zZSB0byAwLCB3ZSB0cmVhdCBpdCBqdXN0IGFzIDAuIFRoaXMKKyAgICAvLyBoZWxwcyB0aGUgbWF0cml4IGludmVyc2lvbiBiZSBtb3JlIGFjY3VyYXRlLiAgV2UgYWxzbyBkb24ndCBjYXJlIGFib3V0CisgICAgLy8gYWNjdXJhY3kgdGhhdCBiYWRseSB0byBuZWVkIHRvIGNhcmUgYWJvdXQgbGFtYmRhIDwgMWUtMTIuICBPdXIKKyAgICAvLyBjb25zdHJhaW50cyBoYXZlIGEgamFjb2JpYW4gd2l0aCBhIHNsb3BlIG9mIH4xLCBzbyB0aGlzIHdvdWxkIGNvcnJlc3BvbmQKKyAgICAvLyB0byBhIGNvbnN0cmFpbnQgdmlvbGF0aW9uIG9mIDFlLTEyIHdoaWNoIGlzIGEgcm91bmRpbmcgZXJyb3IgYXQgdGhpcworICAgIC8vIHBvaW50IGdpdmVuIHdlIG9ubHkgbmVlZCA8IDAuNSBucyBwcmVjaXNpb24uCisgICAgeworICAgICAgRWlnZW46OlJlZjxFaWdlbjo6VmVjdG9yWGQ+IGxhbWJkYSA9CisgICAgICAgICAgeS5ibG9jayhkZXJpdmF0aXZlcy5oZXNzaWFuLnJvd3MoKSwgMCwgZGVyaXZhdGl2ZXMuZi5yb3dzKCksIDEpOworICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsYW1iZGEucm93cygpOyArK2kpIHsKKyAgICAgICAgaWYgKHN0ZDo6YWJzKGxhbWJkYShpKSkgPCAxZS0xMikgeworICAgICAgICAgIGxhbWJkYShpKSA9IDAuMDsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKworICAgIFByaW50RGVyaXZhdGl2ZXMoZGVyaXZhdGl2ZXMsIHksICIiLCAxKTsKKworICAgIC8vIEZpZ3VyZSBvdXQgb3VyIGRlc2NlbnQgZGlyZWN0aW9uLgorICAgIEVpZ2VuOjpWZWN0b3JYZCBkeTsKKyAgICBFaWdlbjo6VmVjdG9yWGQgcnRfb3JpZzsKKyAgICBkb3VibGUgdF9pbnZlcnNlOworICAgIHN0ZDo6dGllKGR5LCB0X2ludmVyc2UsIHJ0X29yaWcpID0KKyAgICAgICAgQ29uc3RyYWluZWROZXd0b24oeSwgZGVyaXZhdGl2ZXMsIGl0ZXJhdGlvbik7CisgICAgU09MVkVfVkxPRyhteV9zb2x2ZV9udW1iZXJfLCAxKSA8PCAiICAgdCAiIDw8IDEuMCAvIHRfaW52ZXJzZTsKKworICAgIGRvdWJsZSBzID0gMS4wOworCisgICAgY29uc3QgRWlnZW46OlJlZjxjb25zdCBFaWdlbjo6VmVjdG9yWGQ+IHggPQorICAgICAgICB5LmJsb2NrKDAsIDAsIGRlcml2YXRpdmVzLmhlc3NpYW4ucm93cygpLCAxKTsKKyAgICBjb25zdCBFaWdlbjo6UmVmPGNvbnN0IEVpZ2VuOjpWZWN0b3JYZD4gbGFtYmRhID0KKyAgICAgICAgeS5ibG9jayh4LnJvd3MoKSwgMCwgZGVyaXZhdGl2ZXMuZi5yb3dzKCksIDEpOworICAgIEVpZ2VuOjpSZWY8RWlnZW46OlZlY3RvclhkPiBkbGFtYmRhID0KKyAgICAgICAgZHkuYmxvY2soeC5yb3dzKCksIDAsIGxhbWJkYS5yb3dzKCksIDEpOworCisgICAgY29uc3QgRWlnZW46OlJlZjxjb25zdCBFaWdlbjo6VmVjdG9yWGQ+IHYgPQorICAgICAgICB5LmJsb2NrKHgucm93cygpICsgbGFtYmRhLnJvd3MoKSwgMCwgZGVyaXZhdGl2ZXMuQS5yb3dzKCksIDEpOworCisgICAgLy8gTm93LCB0aW1lIHRvIGRvIGxpbmUgc2VhcmNoLgorICAgIC8vCisgICAgLy8gU3RhcnQgYnkga2VlcGluZyBsYW1iZGEgcG9zaXRpdmUuICBNYWtlIHN1cmUgb3VyIHN0ZXAgZG9lc24ndCBsZXQgbGFtYmRhCisgICAgLy8gY3Jvc3MgMC4KKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGRsYW1iZGEucm93cygpOyArK2kpIHsKKyAgICAgIGlmIChsYW1iZGEoaSkgKyBzICogZGxhbWJkYShpKSA8IDAuMCkgeworICAgICAgICAvLyBJZ25vcmUgdGlueSBzdGVwcyBpbiBsYW1iZGEuICBUaGV5IGNhdXNlIGlzc3VlcyB3aGVuIHdlIGdldCByZWFsbHkKKyAgICAgICAgLy8gY2xvc2UgdG8gaGF2aW5nIG91ciBjb25zdHJhaW50cyBtZXQgYnV0IGhhdmVuJ3QgY29udmVyZ2VkIHRoZSByZXN0IG9mCisgICAgICAgIC8vIHRoZSBwcm9ibGVtIGFuZCBzdGFydCB0byBydW4gaW50byByb3VuZGluZyBpc3N1ZXMgaW4gdGhlIG1hdHJpeCBzb2x2ZQorICAgICAgICAvLyBwb3J0aW9uLgorICAgICAgICBpZiAoZGxhbWJkYShpKSA8IDAuMCAmJiBkbGFtYmRhKGkpID4gLTFlLTEyKSB7CisgICAgICAgICAgU09MVkVfVkxPRyhteV9zb2x2ZV9udW1iZXJfLCAxKQorICAgICAgICAgICAgICA8PCAiICBsYW1iZGEoIiA8PCBpIDw8ICIpICIgPDwgbGFtYmRhKGkpIDw8ICIgKyAiIDw8IHMgPDwgIiAqICIKKyAgICAgICAgICAgICAgPDwgZGxhbWJkYShpKSA8PCAiIC0+IHMgd291bGQgYmUgbm93ICIgPDwgLWxhbWJkYShpKSAvIGRsYW1iZGEoaSk7CisgICAgICAgICAgZGxhbWJkYShpKSA9IDAuMDsKKyAgICAgICAgICBTT0xWRV9WTE9HKG15X3NvbHZlX251bWJlcl8sIDEpCisgICAgICAgICAgICAgIDw8ICIgIGR5IC0+ICIgPDwgc3RkOjpzZXRwcmVjaXNpb24oMTIpIDw8IHN0ZDo6Zml4ZWQKKyAgICAgICAgICAgICAgPDwgc3RkOjpzZXRmaWxsKCcgJykgPDwgZHkudHJhbnNwb3NlKCkuZm9ybWF0KGtIZWF2eUZvcm1hdCk7CisgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgU09MVkVfVkxPRyhteV9zb2x2ZV9udW1iZXJfLCAxKQorICAgICAgICAgICAgPDwgIiAgbGFtYmRhKCIgPDwgaSA8PCAiKSAiIDw8IGxhbWJkYShpKSA8PCAiICsgIiA8PCBzIDw8ICIgKiAiCisgICAgICAgICAgICA8PCBkbGFtYmRhKGkpIDw8ICIgLT4gcyBub3cgIiA8PCAtbGFtYmRhKGkpIC8gZGxhbWJkYShpKTsKKyAgICAgICAgcyA9IC1sYW1iZGEoaSkgLyBkbGFtYmRhKGkpOworICAgICAgfQorICAgIH0KKworICAgIHMgKj0gMC45OTk7CisKKyAgICBTT0xWRV9WTE9HKG15X3NvbHZlX251bWJlcl8sIDEpIDw8ICIgIEFmdGVyIGxhbWJkYSBsaW5lIHNlYXJjaCwgcyBpcyAiIDw8IHM7CisKKyAgICBjb25zdCBFaWdlbjo6UmVmPGNvbnN0IEVpZ2VuOjpWZWN0b3JYZD4gZHggPSBkeS5ibG9jaygwLCAwLCB4LnJvd3MoKSwgMSk7CisgICAgY29uc3QgRWlnZW46OlJlZjxjb25zdCBFaWdlbjo6VmVjdG9yWGQ+IGR2ID0KKyAgICAgICAgZHkuYmxvY2soeC5yb3dzKCkgKyBsYW1iZGEucm93cygpLCAwLCB2LnJvd3MoKSwgMSk7CisKKyAgICBTT0xWRV9WTE9HKG15X3NvbHZlX251bWJlcl8sIDMpCisgICAgICAgIDw8ICIgIEluaXRpYWwgc3RlcCAiIDw8IGl0ZXJhdGlvbiA8PCAiIC0+ICIgPDwgc3RkOjpzZXRwcmVjaXNpb24oMTIpCisgICAgICAgIDw8IHN0ZDo6Zml4ZWQgPDwgc3RkOjpzZXRmaWxsKCcgJykKKyAgICAgICAgPDwgZHkudHJhbnNwb3NlKCkuZm9ybWF0KGtIZWF2eUZvcm1hdCk7CisgICAgU09MVkVfVkxPRyhteV9zb2x2ZV9udW1iZXJfLCAzKQorICAgICAgICA8PCAiICAgcnQgLT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIgorICAgICAgICA8PCBzdGQ6OnNldHByZWNpc2lvbigxMikgPDwgc3RkOjpmaXhlZCA8PCBzdGQ6OnNldGZpbGwoJyAnKQorICAgICAgICA8PCBydF9vcmlnLnRyYW5zcG9zZSgpLmZvcm1hdChrSGVhdnlGb3JtYXQpOworCisgICAgY29uc3QgZG91YmxlIHJ0X29yaWdfc3F1YXJlZF9ub3JtID0gcnRfb3JpZy5zcXVhcmVkTm9ybSgpOworCisgICAgLy8gTm93LCBkbyB0aGUgcmVzdCBvZiBsaW5lIHNlYXJjaCB0byBtYWtlIHN1cmUgd2UgZG9uJ3QgaW5jcmVhc2UgUnQuCisgICAgRWlnZW46OlZlY3RvclhkIHJ0OworICAgIEVpZ2VuOjpWZWN0b3JYZCBuZXh0X3k7CisgICAgUHJvYmxlbTo6RGVyaXZhdGl2ZXMgbmV4dF9kZXJpdmF0aXZlczsKKyAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgbmV4dF95ID0geSArIHMgKiBkeTsKKworICAgICAgbmV4dF9kZXJpdmF0aXZlcyA9IEFkZENvbnN0cmFpbnRTbGFja1ZhcmlhYmxlKAorICAgICAgICAgIHByb2JsZW0tPkNvbXB1dGVEZXJpdmF0aXZlcyhteV9zb2x2ZV9udW1iZXJfLCBuZXh0X3ksIHRydWUsIGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3RpdmVfY29uc3RyYWludHMpLAorICAgICAgICAgIG5leHRfeSk7CisKKyAgICAgIHJ0ID0gUnQobmV4dF9kZXJpdmF0aXZlcywgbmV4dF95LCB0X2ludmVyc2UpOworCisgICAgICBjb25zdCBFaWdlbjo6UmVmPGNvbnN0IEVpZ2VuOjpWZWN0b3JYZD4gbmV4dF94ID0KKyAgICAgICAgICBuZXh0X3kuYmxvY2soMCwgMCwgbmV4dF9kZXJpdmF0aXZlcy5oZXNzaWFuLnJvd3MoKSwgMSk7CisgICAgICBjb25zdCBFaWdlbjo6UmVmPGNvbnN0IEVpZ2VuOjpWZWN0b3JYZD4gbmV4dF9sYW1iZGEgPQorICAgICAgICAgIG5leHRfeS5ibG9jayhuZXh0X3gucm93cygpLCAwLCBuZXh0X2Rlcml2YXRpdmVzLmYucm93cygpLCAxKTsKKworICAgICAgY29uc3QgRWlnZW46OlJlZjxjb25zdCBFaWdlbjo6VmVjdG9yWGQ+IG5leHRfdiA9IG5leHRfeS5ibG9jaygKKyAgICAgICAgICBuZXh0X3gucm93cygpICsgbmV4dF9sYW1iZGEucm93cygpLCAwLCBuZXh0X2Rlcml2YXRpdmVzLkEucm93cygpLCAxKTsKKworICAgICAgU09MVkVfVkxPRyhteV9zb2x2ZV9udW1iZXJfLCAxKQorICAgICAgICAgIDw8ICIgICAgbmV4dF9ydCgiIDw8IGl0ZXJhdGlvbiA8PCAiKSBpcyAiIDw8IHJ0Lm5vcm0oKSA8PCAiIC0+ICIKKyAgICAgICAgICA8PCBzdGQ6OnNldHByZWNpc2lvbigxMikgPDwgc3RkOjpmaXhlZCA8PCBzdGQ6OnNldGZpbGwoJyAnKQorICAgICAgICAgIDw8IHJ0LnRyYW5zcG9zZSgpLmZvcm1hdChrSGVhdnlGb3JtYXQpOworCisgICAgICBQcmludERlcml2YXRpdmVzKG5leHRfZGVyaXZhdGl2ZXMsIG5leHRfeSwgIm5leHRfIiwgMyk7CisKKyAgICAgIC8vIFRPRE8oYXVzdGluKTogSWYgd2UgZW5kIHVwIGdyb3dpbmcgdGhlIHJlc2lkdWFsIHRvbyBtYW55IHRpbWVzIGluIGEKKyAgICAgIC8vIHJvdywgdGhlbiBzdG9wIHNlYXJjaGluZz8gIFF1YW4gdGhpbmtzIHdlIGNhbiBiZSBtb3JlIGNsZXZlciBoZXJlLgorICAgICAgLy8KKyAgICAgIC8vIEtlZXAgc3RlcHBpbmcgdW50aWwgd2UgZG9uJ3QgZ3JvdyB0aGUgcmVzaWR1YWwsIGFuZCB1bnRpbCB3ZSBkb24ndAorICAgICAgLy8gY3Jvc3Mgb3VyIGNvbnN0cmFpbnQuICBTaW5jZSBBeG1iIGlzbid0IHBlcmZlY3RseSBjb252ZXgsIGxldCBvdXJzZWx2ZXMKKyAgICAgIC8vIGdldCB3b3JzZSB1bnRpbCBpdCBnZXRzIGNsb3NlIHRvIGNvbnZlcmdpbmcuCisgICAgICBpZiAobmV4dF9kZXJpdmF0aXZlcy5mLm1heENvZWZmKCkgPiAwLjApIHsKKyAgICAgICAgU09MVkVfVkxPRyhteV9zb2x2ZV9udW1iZXJfLCAxKQorICAgICAgICAgICAgPDwgIiAgIGZfbmV4dCA+IDAuMCAgLT4gIiA8PCBuZXh0X2Rlcml2YXRpdmVzLmYubWF4Q29lZmYoKQorICAgICAgICAgICAgPDwgIiwgY29udGludWluZyBsaW5lIHNlYXJjaC4iOworICAgICAgICBzICo9IGtCZXRhOworICAgICAgfSBlbHNlIGlmIChuZXh0X2Rlcml2YXRpdmVzLkF4bWIuc3F1YXJlZE5vcm0oKSA8IDAuMSAmJgorICAgICAgICAgICAgICAgICBydC5zcXVhcmVkTm9ybSgpID4KKyAgICAgICAgICAgICAgICAgICAgIHN0ZDo6cG93KDEuMCAtIGtBbHBoYSAqIHMsIDIuMCkgKiBydF9vcmlnX3NxdWFyZWRfbm9ybSkgeworICAgICAgICBTT0xWRV9WTE9HKG15X3NvbHZlX251bWJlcl8sIDEpCisgICAgICAgICAgICA8PCAiICAgfFJ0fCA+IHxSdCsxfCAiIDw8IHJ0Lm5vcm0oKSA8PCAiID4gICIgPDwgcnRfb3JpZy5ub3JtKCkKKyAgICAgICAgICAgIDw8ICIsIGRydCAtPiAiIDw8IHN0ZDo6c2V0cHJlY2lzaW9uKDEyKSA8PCBzdGQ6OmZpeGVkCisgICAgICAgICAgICA8PCBzdGQ6OnNldGZpbGwoJyAnKQorICAgICAgICAgICAgPDwgKHJ0X29yaWcgLSBydCkudHJhbnNwb3NlKCkuZm9ybWF0KGtIZWF2eUZvcm1hdCk7CisgICAgICAgIHMgKj0ga0JldGE7CisgICAgICB9IGVsc2UgeworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisKKyAgICBTT0xWRV9WTE9HKG15X3NvbHZlX251bWJlcl8sIDEpCisgICAgICAgIDw8ICIgIFRlcm1pbmF0ZWQgbGluZSBzZWFyY2ggd2l0aCBzICIgPDwgcyA8PCAiLCAiIDw8IHJ0Lm5vcm0oKQorICAgICAgICA8PCAiKHxSdCsxfCkgPCAiIDw8IHJ0X29yaWcubm9ybSgpIDw8ICIofFJ0fCkiOworICAgIHkgPSBuZXh0X3k7CisKKyAgICBjb25zdCBFaWdlbjo6UmVmPGNvbnN0IEVpZ2VuOjpWZWN0b3JYZD4gbmV4dF9sYW1iZGEgPQorICAgICAgICB5LmJsb2NrKHgucm93cygpLCAwLCBsYW1iZGEucm93cygpLCAxKTsKKworICAgIC8vIFNlZSBpZiB3ZSBoaXQgb3VyIGNvbnZlcmdlbmNlIGNyaXRlcmlhLgorICAgIGNvbnN0IGRvdWJsZSByX3ByaW1hbF9zcXVhcmVkX25vcm0gPQorICAgICAgICBydC5ibG9jayh4LnJvd3MoKSArIGxhbWJkYS5yb3dzKCksIDAsIHYucm93cygpLCAxKS5zcXVhcmVkTm9ybSgpOworICAgIFNPTFZFX1ZMT0cobXlfc29sdmVfbnVtYmVyXywgMSkKKyAgICAgICAgPDwgIiAgcnRfbmV4dCgiIDw8IGl0ZXJhdGlvbiA8PCAiKSBpcyAiIDw8IHJ0Lm5vcm0oKSA8PCAiIC0+ICIKKyAgICAgICAgPDwgc3RkOjpzZXRwcmVjaXNpb24oMTIpIDw8IHN0ZDo6Zml4ZWQgPDwgc3RkOjpzZXRmaWxsKCcgJykKKyAgICAgICAgPDwgcnQudHJhbnNwb3NlKCkuZm9ybWF0KGtIZWF2eUZvcm1hdCk7CisgICAgaWYgKHJfcHJpbWFsX3NxdWFyZWRfbm9ybSA8IGtFcHNpbG9uRiAqIGtFcHNpbG9uRikgeworICAgICAgY29uc3QgZG91YmxlIHJfZHVhbF9zcXVhcmVkX25vcm0gPQorICAgICAgICAgIHJ0LmJsb2NrKDAsIDAsIHgucm93cygpLCAxKS5zcXVhcmVkTm9ybSgpOworICAgICAgaWYgKHJfZHVhbF9zcXVhcmVkX25vcm0gPCBrRXBzaWxvbkYgKiBrRXBzaWxvbkYpIHsKKyAgICAgICAgY29uc3QgZG91YmxlIG5leHRfbnUgPQorICAgICAgICAgICAgLShuZXh0X2Rlcml2YXRpdmVzLmYudHJhbnNwb3NlKCkgKiBuZXh0X2xhbWJkYSkoMCwgMCk7CisgICAgICAgIGlmIChuZXh0X251IDwga0Vwc2lsb24pIHsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBTT0xWRV9WTE9HKG15X3NvbHZlX251bWJlcl8sIDEpCisgICAgICAgICAgICAgIDw8ICIgIG51KCIgPDwgaXRlcmF0aW9uIDw8ICIpIC0+ICIgPDwgbmV4dF9udSA8PCAiIDwgIiA8PCBrRXBzaWxvbgorICAgICAgICAgICAgICA8PCAiLCBub3QgZG9uZSB5ZXQiOworICAgICAgICB9CisKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIFNPTFZFX1ZMT0cobXlfc29sdmVfbnVtYmVyXywgMSkKKyAgICAgICAgICAgIDw8ICIgIHJfZHVhbCgiIDw8IGl0ZXJhdGlvbiA8PCAiKSAtPiAiCisgICAgICAgICAgICA8PCBzdGQ6OnNxcnQocl9kdWFsX3NxdWFyZWRfbm9ybSkgPDwgIiA8ICIgPDwga0Vwc2lsb25GCisgICAgICAgICAgICA8PCAiLCBub3QgZG9uZSB5ZXQiOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBTT0xWRV9WTE9HKG15X3NvbHZlX251bWJlcl8sIDEpIDw8ICIgIHJfcHJpbWFsKCIgPDwgaXRlcmF0aW9uIDw8ICIpIC0+ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgc3RkOjpzcXJ0KHJfcHJpbWFsX3NxdWFyZWRfbm9ybSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIiA8ICIgPDwga0Vwc2lsb25GIDw8ICIsIG5vdCBkb25lIHlldCI7CisgICAgfQorICAgIFNPTFZFX1ZMT0cobXlfc29sdmVfbnVtYmVyXywgMSkKKyAgICAgICAgPDwgIiAgc3RlcCgiIDw8IGl0ZXJhdGlvbiA8PCAiKSAiCisgICAgICAgIDw8IChzICogZHkpLnRyYW5zcG9zZSgpLmZvcm1hdChrSGVhdnlGb3JtYXQpOworICAgIFNPTFZFX1ZMT0cobXlfc29sdmVfbnVtYmVyXywgMSkgPDwgIiB5KCIgPDwgaXRlcmF0aW9uIDw8ICIpIGlzIG5vdyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCB5LnRyYW5zcG9zZSgpLmZvcm1hdChrSGVhdnlGb3JtYXQpOworCisgICAgLy8gVmVyeSBpbXBvcnQsIHVzZSB0aGUgbGFzdCBzZXQgb2YgZGVyaXZhdGl2ZXMgd2UgcGlja2VkIGZvciBvdXIgbmV3IHkgZm9yCisgICAgLy8gdGhlIG5leHQgaXRlcmF0aW9uLgorICAgIGRlcml2YXRpdmVzID0gc3RkOjptb3ZlKG5leHRfZGVyaXZhdGl2ZXMpOworICAgICsraXRlcmF0aW9uOworCisgICAgLy8gTm90aWZ5IHRoZSBwcm9ibGVtIHRoYXQgeSB1cGRhdGVkLiAgVGhpcyBnaXZlcyBpdCBhIGhvb2sgdG8gcHVsbCBkaWdpdHMKKyAgICAvLyBvdXQgb2YgeSBpZiBuZWVkZWQuCisgICAgcHJvYmxlbS0+VXBkYXRlKG15X3NvbHZlX251bWJlcl8sIHkpOworCisgICAgLy8gQW5kIGZpbmFsbHksIGRvbid0IGxldCB1cyBpdGVyYXRlIGZvcmV2ZXIuICBJZiBpdCBpc24ndCBjb252ZXJnaW5nLAorICAgIC8vIHJlcG9ydCBiYWNrLgorICAgIGlmIChpdGVyYXRpb24gPiBtYXhfaXRlcmF0aW9ucykgeworICAgICAgYnJlYWs7CisgICAgfQorICB9CisKKyAgaWYgKGl0ZXJhdGlvbiA+IG1heF9pdGVyYXRpb25zKSB7CisgICAgTE9HKEZBVEFMKSA8PCAiRmFpbGVkIHRvIGNvbnZlcmdlIG9uIHNvbHZlICIgPDwgbXlfc29sdmVfbnVtYmVyXzsKKyAgfQorCisgIHJldHVybiBzdGQ6Om1ha2VfdHVwbGUoc3RkOjptb3ZlKHkpLCBzb2x1dGlvbl9ub2RlLCBpdGVyYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptb3ZlKGFjdGl2ZV9jb25zdHJhaW50cykpOwogfQogCiB2b2lkIFRpbWVzdGFtcFByb2JsZW06Ok1heWJlVXBkYXRlTm9kZU1hcHBpbmcoKSB7CiAgIGlmIChub2RlX21hcHBpbmdfdmFsaWRfKSB7CiAgICAgcmV0dXJuOwogICB9Ci0gIHNpemVfdCBsaXZlX25vZGVfaW5kZXggPSAwOworICBzaXplX3Qgc3RhdGVzX2NvdW50ID0gMDsKICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBub2RlX21hcHBpbmdfLnNpemUoKTsgKytpKSB7CiAgICAgaWYgKGxpdmUoaSkpIHsKLSAgICAgIG5vZGVfbWFwcGluZ19baV0gPSBsaXZlX25vZGVfaW5kZXg7Ci0gICAgICArK2xpdmVfbm9kZV9pbmRleDsKKyAgICAgIG5vZGVfbWFwcGluZ19baV0gPSBzdGF0ZXNfY291bnQ7CisgICAgICArK3N0YXRlc19jb3VudDsKICAgICB9IGVsc2UgewogICAgICAgbm9kZV9tYXBwaW5nX1tpXSA9IHN0ZDo6bnVtZXJpY19saW1pdHM8c2l6ZV90Pjo6bWF4KCk7CiAgICAgfQogICB9Ci0gIGxpdmVfbm9kZXNfID0gbGl2ZV9ub2RlX2luZGV4OwotICBsaXZlX2NvbnN0cmFpbnRzXyA9IExpdmVDb25zdHJhaW50c0NvdW50KCk7CisgIHN0YXRlc18gPSBzdGF0ZXNfY291bnQ7CisgIGluZXF1YWxpdHlfY29uc3RyYWludHNfID0gTGl2ZUNvbnN0cmFpbnRzQ291bnQoKTsKICAgbm9kZV9tYXBwaW5nX3ZhbGlkXyA9IHRydWU7CiAKICAgLy8gUmVzZXQgdGhlIGNhY2hlZCBzdGF0ZSBlYWNoIHRpbWUgd2Ugc29sdmUuCkBAIC01NDUsNiArMTIzMCw2OSBAQAogICB9CiB9CiAKK3ZvaWQgVGltZXN0YW1wUHJvYmxlbTo6UHJlcGFyZShzaXplX3Qgc29sdmVfbnVtYmVyKSB7CisgIE1heWJlVXBkYXRlTm9kZU1hcHBpbmcoKTsKKworICBDSEVDS19HVChzdGF0ZXMoKSwgMHUpIDw8ICI6IE5vIGxpdmUgbm9kZXMgdG8gc29sdmUgZm9yLiI7CisKKyAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBwb2ludHNfLnNpemUoKTsgKytpKSB7CisgICAgaWYgKHBvaW50c19baV0gIT0gbG9nZ2VyOjpCb290VGltZXN0YW1wOjptYXhfdGltZSgpKSB7CisgICAgICBTT0xWRV9WTE9HKHNvbHZlX251bWJlciwgMikKKyAgICAgICAgICA8PCAiU29sdmluZyBmb3Igbm9kZSAiIDw8IGkgPDwgIiBhdCAiIDw8IHBvaW50c19baV07CisgICAgfQorICB9Cit9CisKK3ZvaWQgVGltZXN0YW1wUHJvYmxlbTo6VXBkYXRlKHNpemVfdCBzb2x2ZV9udW1iZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFaWdlbjo6UmVmPEVpZ2VuOjpWZWN0b3JYZD4gZGF0YSkgeworICAvLyBXZSBhcmUgZG9pbmcgYWxsIG91ciBtYXRoIHdpdGggYm90aCBhbiBpbnQ2NCBiYXNlIGFuZCBhIGRvdWJsZSBvZmZzZXQuCisgIC8vIFRoaXMgbGV0cyB1cyBoYW5kbGUgbGFyZ2Ugb2Zmc2V0cyB3aGlsZSByZXRhaW5pbmcgcHJlY2lzaW9uIGRvd24gdG8gdGhlCisgIC8vIG5hbm9zZWNvbmQgZWFzaWx5LgorICAvLworICAvLyBTb21lIHByb2JsZW1zIHN0YXJ0IG91dCB3aXRoIGEgcG9vciBpbml0aWFsIHNvbHV0aW9uLiAgVGhpcyBpcworICAvLyBlc3BlY2lhbGx5IHRydWUgZm9yIHRoZSBmaXJzdCBzb2x1dGlvbi4gIEJlY2F1c2Ugd2UgY29udHJvbCB0aGUgc29sdmVyLAorICAvLyBhcyB3ZSBkZXRlcm1pbmUgdGhhdCB0aGUgZG91YmxlIGlzIGdldHRpbmcgdG9vIGJpZywgd2UgY2FuIG1vdmUgdGhhdAorICAvLyBpbmZvcm1hdGlvbiB0byB0aGUgaW50NjQgYmFzZSBjbG9jay4gIFRocmVzaG9sZCB0aGlzIHRvIG5vdCBiZSAqdG9vKgorICAvLyBiaWcgc2luY2UgaXQgbWFrZXMgaXQgaGFyZCB0byBkZWJ1ZyBhcyB0aGUgZGF0YSBrZWVwcyBqdW1waW5nIGFyb3VuZC4KKyAgZm9yIChzaXplX3QgaiA9IDA7IGogPCBzaXplKCk7ICsraikgeworICAgIGNvbnN0IHNpemVfdCBzb2x1dGlvbl9pbmRleCA9IE5vZGVUb0Z1bGxTb2x1dGlvbkluZGV4KGopOworICAgIGlmIChsaXZlKGopKSB7CisgICAgICBib29sIHVwZGF0ZWQgPSBmYWxzZTsKKyAgICAgIGludDY0X3QgZHNvbHV0aW9uID0gMDsKKyAgICAgIGlmIChzdGQ6OmFicyhkYXRhKHNvbHV0aW9uX2luZGV4KSkgPiAxMDApIHsKKyAgICAgICAgZHNvbHV0aW9uID0gc3RhdGljX2Nhc3Q8aW50NjRfdD4oc3RkOjpyb3VuZChkYXRhKHNvbHV0aW9uX2luZGV4KSkpOworICAgICAgICBiYXNlX2Nsb2NrX1tqXS50aW1lICs9IGNocm9ubzo6bmFub3NlY29uZHMoZHNvbHV0aW9uKTsKKyAgICAgICAgZGF0YShzb2x1dGlvbl9pbmRleCkgLT0gZHNvbHV0aW9uOworICAgICAgICB1cGRhdGVkID0gdHJ1ZTsKKyAgICAgIH0KKworICAgICAgU09MVkVfVkxPRyhzb2x2ZV9udW1iZXIsIDIpCisgICAgICAgICAgPDwgIiAgICBsaXZlICIgPDwgcG9pbnRzX1tqXS50aW1lIDw8ICIgdnMgc29sdXRpb24gIgorICAgICAgICAgIDw8IGJhc2VfY2xvY2tfW2pdLnRpbWUgKworICAgICAgICAgICAgICAgICBzdGQ6OmNocm9ubzo6bmFub3NlY29uZHMoc3RhdGljX2Nhc3Q8aW50NjRfdD4oCisgICAgICAgICAgICAgICAgICAgICBzdGQ6OnJvdW5kKGRhdGEoTm9kZVRvRnVsbFNvbHV0aW9uSW5kZXgoaikpKSkpCisgICAgICAgICAgPDwgIiAiCisgICAgICAgICAgPDwgKGRhdGEoTm9kZVRvRnVsbFNvbHV0aW9uSW5kZXgoaikpIC0KKyAgICAgICAgICAgICAgc3RkOjpyb3VuZChkYXRhKE5vZGVUb0Z1bGxTb2x1dGlvbkluZGV4KGopKSkpCisgICAgICAgICAgPDwgIiAodW5yb3VuZGVkOiAiIDw8IGRhdGEoTm9kZVRvRnVsbFNvbHV0aW9uSW5kZXgoaikpIDw8ICIpIgorICAgICAgICAgIDw8ICh1cGRhdGVkID8gKHN0ZDo6c3RyaW5nKCIgdXBkYXRlZCAiKSArIHN0ZDo6dG9fc3RyaW5nKGRzb2x1dGlvbikpCisgICAgICAgICAgICAgICAgICAgICAgOiBzdGQ6OnN0cmluZygiIikpCisgICAgICAgICAgPDwgIiBkdCAiCisgICAgICAgICAgPDwgKHBvaW50c19bal0udGltZSAtCisgICAgICAgICAgICAgIChiYXNlX2Nsb2NrX1tqXS50aW1lICsKKyAgICAgICAgICAgICAgIHN0ZDo6Y2hyb25vOjpuYW5vc2Vjb25kcyhzdGF0aWNfY2FzdDxpbnQ2NF90PigKKyAgICAgICAgICAgICAgICAgICBzdGQ6OnJvdW5kKGRhdGEoTm9kZVRvRnVsbFNvbHV0aW9uSW5kZXgoaikpKSkpKSkKKyAgICAgICAgICAgICAgICAgLmNvdW50KCkKKyAgICAgICAgICA8PCAibnMiOworICAgIH0gZWxzZSB7CisgICAgICBTT0xWRV9WTE9HKHNvbHZlX251bWJlciwgMikKKyAgICAgICAgICA8PCAiICAgIGRlYWQgICIgPDwgYW9zOjptb25vdG9uaWNfY2xvY2s6Om1pbl90aW1lOworICAgICAgU09MVkVfVkxPRyhzb2x2ZV9udW1iZXIsIDIpCisgICAgICAgICAgPDwgIiAgICBkZWFkICAiIDw8IGFvczo6bW9ub3RvbmljX2Nsb2NrOjptaW5fdGltZTsKKyAgICB9CisgIH0KK30KKwogdm9pZCBUaW1lc3RhbXBQcm9ibGVtOjpEZWJ1ZygpIHsKICAgTWF5YmVVcGRhdGVOb2RlTWFwcGluZygpOwogCkBAIC03MTgsMTEgKzE0NjYsMTEgQEAKIAogICAvLyBJbnRlcnBvbGF0ZSB3aXRoIHRoZSB0d28gb2YgdGhlc2UuCiAgIGNvbnN0IHN0ZDo6dHVwbGU8ZGlzdHJpYnV0ZWRfY2xvY2s6OnRpbWVfcG9pbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3Rvcjxsb2dnZXI6OkJvb3RUaW1lc3RhbXA+PiAmcDAgPSAqc2VhcmNoOworICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGxvZ2dlcjo6Qm9vdFRpbWVzdGFtcD4+ICZwMCA9ICpzZWFyY2g7CiAgIGNvbnN0IHN0ZDo6dHVwbGU8ZGlzdHJpYnV0ZWRfY2xvY2s6OnRpbWVfcG9pbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3Rvcjxsb2dnZXI6OkJvb3RUaW1lc3RhbXA+PiAmcDEgPSAqKHNlYXJjaCAtIDEpOworICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGxvZ2dlcjo6Qm9vdFRpbWVzdGFtcD4+ICZwMSA9ICooc2VhcmNoIC0gMSk7CiAKLSAgY29uc3QgZGlzdHJpYnV0ZWRfY2xvY2s6OnRpbWVfcG9pbnQgZDAgPSAgc3RkOjpnZXQ8MD4ocDApOworICBjb25zdCBkaXN0cmlidXRlZF9jbG9jazo6dGltZV9wb2ludCBkMCA9IHN0ZDo6Z2V0PDA+KHAwKTsKICAgY29uc3QgZGlzdHJpYnV0ZWRfY2xvY2s6OnRpbWVfcG9pbnQgZDEgPSBzdGQ6OmdldDwwPihwMSk7CiAKICAgY29uc3QgQm9vdFRpbWVzdGFtcCB0MCA9IHN0ZDo6Z2V0PDE+KHAwKVtub2RlX2luZGV4XTsKQEAgLTE3MDcsMzIgKzI0NTUsODEgQEAKICAgICAgIHByb2JsZW0tPnNldF9iYXNlX2Nsb2NrKG5vZGVfaW5kZXgsIHtiYXNlX3RpbWVzW25vZGVfaW5kZXhdLmJvb3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZV90aW1lc1tub2RlX2luZGV4XS50aW1lICsgZHR9KTsKICAgICB9Ci0gICAgc3RkOjp0dXBsZTxzdGQ6OnZlY3RvcjxCb290VGltZXN0YW1wPiwgc2l6ZV90LCBzaXplX3Q+IHNvbHV0aW9uID0KLSAgICAgICAgcHJvYmxlbS0+U29sdmVOZXd0b24ocG9pbnRzLCBrTWF4SXRlcmF0aW9ucyk7CisgICAgcHJvYmxlbS0+c2V0X3BvaW50cyhwb2ludHMpOwogCi0gICAgaWYgKHN0ZDo6Z2V0PDI+KHNvbHV0aW9uKSA+IGtNYXhJdGVyYXRpb25zKSB7Ci0gICAgICBVcGRhdGVTb2x1dGlvbihzdGQ6Om1vdmUoc3RkOjpnZXQ8MD4oc29sdXRpb24pKSk7CisgICAgRWlnZW46OlZlY3RvclhkIHNvbHV0aW9uX3k7CisgICAgc2l6ZV90IGl0ZXJhdGlvbnM7CisgICAgTmV3dG9uU29sdmVyIHNvbHZlcjsKKyAgICBzdGQ6OnRpZShzb2x1dGlvbl95LCBzb2x1dGlvbl9pbmRleCwgaXRlcmF0aW9ucykgPQorICAgICAgICBzb2x2ZXIuU29sdmVOZXd0b24ocHJvYmxlbSwga01heEl0ZXJhdGlvbnMpOworICAgIHN0ZDo6dmVjdG9yPEJvb3RUaW1lc3RhbXA+IHNvbHV0aW9uID0KKyAgICAgICAgcHJvYmxlbS0+UGFja1Jlc3VsdHMoaXRlcmF0aW9ucyA+IGtNYXhJdGVyYXRpb25zIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTT0xWRV9WTE9HX0lTX09OKHNvbHZlci5teV9zb2x2ZV9udW1iZXIoKSwgMiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvbHV0aW9uX3kpOworCisgICAgaWYgKGl0ZXJhdGlvbnMgPiBrTWF4SXRlcmF0aW9ucyAmJiBGTEFHU19jcmFzaF9vbl9zb2x2ZV9mYWlsdXJlKSB7CisgICAgICBVcGRhdGVTb2x1dGlvbihzdGQ6Om1vdmUoc29sdXRpb24pKTsKICAgICAgIEZsdXNoQW5kQ2xvc2UoZmFsc2UpOwogICAgICAgTE9HKEZBVEFMKSA8PCAiRmFpbGVkIHRvIGNvbnZlcmdlLiI7CiAgICAgfQogCi0gICAgaWYgKCFwcm9ibGVtLT5WYWxpZGF0ZVNvbHV0aW9uKHN0ZDo6Z2V0PDA+KHNvbHV0aW9uKSwgZmFsc2UpKSB7Ci0gICAgICBMT0coV0FSTklORykgPDwgIkludmFsaWQgc29sdXRpb24sIGNvbnN0cmFpbnRzIG5vdCBtZXQuIjsKLSAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc3RkOjpnZXQ8MD4oc29sdXRpb24pLnNpemUoKTsgKytpKSB7Ci0gICAgICAgIExPRyhJTkZPKSA8PCAiICAiIDw8IHN0ZDo6Z2V0PDA+KHNvbHV0aW9uKVtpXTsKLSAgICAgIH0KLSAgICAgIHByb2JsZW0tPkRlYnVnKCk7Ci0gICAgICBpZiAoIXNraXBfb3JkZXJfdmFsaWRhdGlvbl8pIHsKLSAgICAgICAgVXBkYXRlU29sdXRpb24oc3RkOjptb3ZlKHN0ZDo6Z2V0PDA+KHNvbHV0aW9uKSkpOwotICAgICAgICBGbHVzaEFuZENsb3NlKGZhbHNlKTsKLSAgICAgICAgTE9HKEZBVEFMKSA8PCAiQmFpbGluZywgdXNlIC0tc2tpcF9vcmRlcl92YWxpZGF0aW9uIHRvIGNvbnRpbnVlLiAgIgotICAgICAgICAgICAgICAgICAgICAgICJVc2UgYXQgeW91ciBvd24gcmlzay4iOworICAgIGlmICghcHJvYmxlbS0+VmFsaWRhdGVTb2x1dGlvbihzb2x1dGlvbiwgdHJ1ZSkpIHsKKyAgICAgIGlmICghRkxBR1NfY29uc3RyYWluZWRfc29sdmUpIHsKKyAgICAgICAgcHJvYmxlbS0+VmFsaWRhdGVTb2x1dGlvbihzb2x1dGlvbiwgZmFsc2UpOworICAgICAgICBMT0coV0FSTklORykgPDwgIkludmFsaWQgc29sdXRpb24sIGNvbnN0cmFpbnRzIG5vdCBtZXQgZm9yIHByb2JsZW0gIgorICAgICAgICAgICAgICAgICAgICAgPDwgc29sdmVyLm15X3NvbHZlX251bWJlcigpOworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNvbHV0aW9uLnNpemUoKTsgKytpKSB7CisgICAgICAgICAgTE9HKElORk8pIDw8ICIgICIgPDwgc29sdXRpb25baV07CisgICAgICAgIH0KKyAgICAgICAgcHJvYmxlbS0+RGVidWcoKTsKKyAgICAgICAgaWYgKCFza2lwX29yZGVyX3ZhbGlkYXRpb25fKSB7CisgICAgICAgICAgVXBkYXRlU29sdXRpb24oc29sdXRpb24pOworICAgICAgICAgIEZsdXNoQW5kQ2xvc2UoZmFsc2UpOworICAgICAgICAgIExPRyhGQVRBTCkgPDwgIkJhaWxpbmcsIHVzZSAtLXNraXBfb3JkZXJfdmFsaWRhdGlvbiB0byBjb250aW51ZS4gICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJVc2UgYXQgeW91ciBvd24gcmlzay4iOworICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICAvLyBBdywgb3VyIGluaXRpYWwgYXR0ZW1wdCB0byBzb2x2ZSBmYWlsZWQuICBOb3csIGxldCdzIHRyeSBhZ2FpbiB3aXRoCisgICAgICAgIC8vIGNvbnN0cmlhbnRzLgorICAgICAgICBmb3IgKHNpemVfdCBub2RlX2luZGV4ID0gMDsgbm9kZV9pbmRleCA8IGJhc2VfdGltZXMuc2l6ZSgpOworICAgICAgICAgICAgICsrbm9kZV9pbmRleCkgeworICAgICAgICAgIHByb2JsZW0tPnNldF9iYXNlX2Nsb2NrKG5vZGVfaW5kZXgsIHNvbHV0aW9uW25vZGVfaW5kZXhdKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICghRkxBR1NfYXR0ZW1wdF9zaW11bHRhbmVvdXNfY29uc3RyYWluZWRfc29sdmUpIHsKKyAgICAgICAgICBWTE9HKDEpIDw8ICJGYWxsaW5nIGJhY2sgdG8gc2VxdWVudGlhbCBjb25zdHJhaW5lZCBOZXd0b24uIjsKKyAgICAgICAgICByZXR1cm4gU2VxdWVudGlhbFNvbHV0aW9uKHByb2JsZW0sIGNhbmRpZGF0ZV90aW1lcywgYmFzZV90aW1lcyk7CisgICAgICAgIH0KKworICAgICAgICBwcm9ibGVtLT5zZXRfcG9pbnRzKHBvaW50cyk7CisgICAgICAgIHN0ZDo6dGllKHNvbHV0aW9uLCBzb2x1dGlvbl95LCBzb2x1dGlvbl9pbmRleCwgaXRlcmF0aW9ucykgPQorICAgICAgICAgICAgU29sdmVDb25zdHJhaW5lZE5ld3Rvbigmc29sdmVyLCBwcm9ibGVtLCBrTWF4SXRlcmF0aW9ucyk7CisKKyAgICAgICAgaWYgKGl0ZXJhdGlvbnMgPiBrTWF4SXRlcmF0aW9ucyAmJiBGTEFHU19jcmFzaF9vbl9zb2x2ZV9mYWlsdXJlKSB7CisgICAgICAgICAgVXBkYXRlU29sdXRpb24oc3RkOjptb3ZlKHNvbHV0aW9uKSk7CisgICAgICAgICAgRmx1c2hBbmRDbG9zZShmYWxzZSk7CisgICAgICAgICAgTE9HKEZBVEFMKSA8PCAiRmFpbGVkIHRvIGNvbnZlcmdlIGZvciBwcm9ibGVtICIKKyAgICAgICAgICAgICAgICAgICAgIDw8IHNvbHZlci5teV9zb2x2ZV9udW1iZXIoKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIXByb2JsZW0tPlZhbGlkYXRlU29sdXRpb24oc29sdXRpb24sIGZhbHNlKSkgeworICAgICAgICAgIExPRyhXQVJOSU5HKSA8PCAiSW52YWxpZCBzb2x1dGlvbiwgY29uc3RyYWludHMgbm90IG1ldCBmb3IgcHJvYmxlbSAiCisgICAgICAgICAgICAgICAgICAgICAgIDw8IHNvbHZlci5teV9zb2x2ZV9udW1iZXIoKTsKKyAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNvbHV0aW9uLnNpemUoKTsgKytpKSB7CisgICAgICAgICAgICBMT0coSU5GTykgPDwgIiAgIiA8PCBzb2x1dGlvbltpXTsKKyAgICAgICAgICB9CisgICAgICAgICAgcHJvYmxlbS0+RGVidWcoKTsKKyAgICAgICAgICBpZiAoIXNraXBfb3JkZXJfdmFsaWRhdGlvbl8pIHsKKyAgICAgICAgICAgIFVwZGF0ZVNvbHV0aW9uKHNvbHV0aW9uKTsKKyAgICAgICAgICAgIEZsdXNoQW5kQ2xvc2UoZmFsc2UpOworICAgICAgICAgICAgTE9HKEZBVEFMKSA8PCAiQmFpbGluZywgdXNlIC0tc2tpcF9vcmRlcl92YWxpZGF0aW9uIHRvIGNvbnRpbnVlLiAgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAiVXNlIGF0IHlvdXIgb3duIHJpc2suIjsKKyAgICAgICAgICB9CisgICAgICAgIH0KICAgICAgIH0KICAgICB9CiAKLSAgICByZXN1bHRfdGltZXMgPSBzdGQ6Om1vdmUoc3RkOjpnZXQ8MD4oc29sdXRpb24pKTsKLSAgICBuZXh0X2ZpbHRlciA9IGNhbmRpZGF0ZV90aW1lc1tzdGQ6OmdldDwxPihzb2x1dGlvbildLm5leHRfbm9kZV9maWx0ZXI7Ci0gICAgc29sdXRpb25faW5kZXggPSBzdGQ6OmdldDwxPihzb2x1dGlvbik7CisgICAgcmVzdWx0X3RpbWVzID0gc3RkOjptb3ZlKHNvbHV0aW9uKTsKKyAgICBuZXh0X2ZpbHRlciA9IGNhbmRpZGF0ZV90aW1lc1tzb2x1dGlvbl9pbmRleF0ubmV4dF9ub2RlX2ZpbHRlcjsKICAgfQogCiAgIHJldHVybiBzdGQ6Om1ha2VfdHVwbGUobmV4dF9maWx0ZXIsIHN0ZDo6bW92ZShyZXN1bHRfdGltZXMpLCBzb2x1dGlvbl9pbmRleCk7CkBAIC0xODUwLDEzICsyNjQ3LDYgQEAKICAgICAgIH0KICAgICB9CiAKLSAgICBzdGQ6OnZlY3RvcjxCb290VGltZXN0YW1wPiBwb2ludHMocHJvYmxlbS0+c2l6ZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCb290VGltZXN0YW1wOjptYXhfdGltZSgpKTsKLSAgICBpZiAoVkxPR19JU19PTigyKSkgewotICAgICAgcHJvYmxlbS0+RGVidWcoKTsKLSAgICB9Ci0gICAgcG9pbnRzW25vZGVfYV9pbmRleF0gPSBuZXh0X25vZGVfdGltZTsKLQogICAgIGlmICghcHJvYmxlbS0+SGFzT2JzZXJ2YXRpb25zKG5vZGVfYV9pbmRleCkpIHsKICAgICAgIFZMT0coMSkgPDwgIk5vIG9ic2VydmF0aW9ucywgY2hlY2tpbmcgaWYgdGhlcmUncyBhIGZpbHRlciI7CiAgICAgICBDSEVDSyhuZXh0X25vZGVfZmlsdGVyID09IG51bGxwdHIpCkBAIC0xODY0LDQ5ICsyNjU0LDEwMyBAQAogICAgICAgY29udGludWU7CiAgICAgfQogCi0gICAgc3RkOjp0dXBsZTxzdGQ6OnZlY3RvcjxCb290VGltZXN0YW1wPiwgc2l6ZV90LCBzaXplX3Q+IHNvbHV0aW9uID0KLSAgICAgICAgcHJvYmxlbS0+U29sdmVOZXd0b24ocG9pbnRzLCBrTWF4SXRlcmF0aW9ucyk7CisgICAgc3RkOjp2ZWN0b3I8Qm9vdFRpbWVzdGFtcD4gcG9pbnRzKHByb2JsZW0tPnNpemUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQm9vdFRpbWVzdGFtcDo6bWF4X3RpbWUoKSk7CisgICAgaWYgKFZMT0dfSVNfT04oMikpIHsKKyAgICAgIHByb2JsZW0tPkRlYnVnKCk7CisgICAgfQorICAgIHBvaW50c1tub2RlX2FfaW5kZXhdID0gbmV4dF9ub2RlX3RpbWU7CiAKLSAgICBpZiAoc3RkOjpnZXQ8Mj4oc29sdXRpb24pID4ga01heEl0ZXJhdGlvbnMpIHsKLSAgICAgIFVwZGF0ZVNvbHV0aW9uKHN0ZDo6bW92ZShzdGQ6OmdldDwwPihzb2x1dGlvbikpKTsKKyAgICBwcm9ibGVtLT5zZXRfcG9pbnRzKHBvaW50cyk7CisKKyAgICBOZXd0b25Tb2x2ZXIgc29sdmVyOworICAgIEVpZ2VuOjpWZWN0b3JYZCBzb2x1dGlvbl95OworICAgIHNpemVfdCBpdGVyYXRpb25zOworICAgIHNpemVfdCBteV9zb2x1dGlvbl9pbmRleDsKKyAgICBzdGQ6OnRpZShzb2x1dGlvbl95LCBteV9zb2x1dGlvbl9pbmRleCwgaXRlcmF0aW9ucykgPQorICAgICAgICBzb2x2ZXIuU29sdmVOZXd0b24ocHJvYmxlbSwga01heEl0ZXJhdGlvbnMpOworICAgIHN0ZDo6dmVjdG9yPEJvb3RUaW1lc3RhbXA+IHNvbHV0aW9uID0KKyAgICAgICAgcHJvYmxlbS0+UGFja1Jlc3VsdHMoaXRlcmF0aW9ucyA+IGtNYXhJdGVyYXRpb25zIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTT0xWRV9WTE9HX0lTX09OKHNvbHZlci5teV9zb2x2ZV9udW1iZXIoKSwgMiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvbHV0aW9uX3kpOworCisgICAgaWYgKGl0ZXJhdGlvbnMgPiBrTWF4SXRlcmF0aW9ucyAmJiBGTEFHU19jcmFzaF9vbl9zb2x2ZV9mYWlsdXJlKSB7CisgICAgICBVcGRhdGVTb2x1dGlvbihzdGQ6Om1vdmUoc29sdXRpb24pKTsKICAgICAgIEZsdXNoQW5kQ2xvc2UoZmFsc2UpOwotICAgICAgTE9HKEZBVEFMKSA8PCAiRmFpbGVkIHRvIGNvbnZlcmdlLiI7CisgICAgICBMT0coRkFUQUwpIDw8ICJGYWlsZWQgdG8gY29udmVyZ2UgZm9yIHByb2JsZW0gIgorICAgICAgICAgICAgICAgICA8PCBzb2x2ZXIubXlfc29sdmVfbnVtYmVyKCk7CiAgICAgfQogCiAgICAgLy8gQnlwYXNzIGNoZWNraW5nIGlmIG9yZGVyIHZhbGlkYXRpb24gaXMgdHVybmVkIG9mZi4gIFRoaXMgbGV0cyB1cyBkdW1wIGEKICAgICAvLyBDU1YgZmlsZSBzbyB3ZSBjYW4gdmlldyB0aGUgcHJvYmxlbSBhbmQgZmlndXJlIG91dCB3aGF0IHRvIGRvLiAgVGhlCiAgICAgLy8gcmVzdWx0cyB3b24ndCBtYWtlIHNlbnNlLgotICAgIGlmICghcHJvYmxlbS0+VmFsaWRhdGVTb2x1dGlvbihzdGQ6OmdldDwwPihzb2x1dGlvbiksIGZhbHNlKSkgewotICAgICAgTE9HKFdBUk5JTkcpIDw8ICJJbnZhbGlkIHNvbHV0aW9uLCBjb25zdHJhaW50cyBub3QgbWV0LiI7Ci0gICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHN0ZDo6Z2V0PDA+KHNvbHV0aW9uKS5zaXplKCk7ICsraSkgewotICAgICAgICBMT0coSU5GTykgPDwgIiAgIiA8PCBzdGQ6OmdldDwwPihzb2x1dGlvbilbaV07Ci0gICAgICB9Ci0gICAgICBwcm9ibGVtLT5EZWJ1ZygpOwotICAgICAgaWYgKCFza2lwX29yZGVyX3ZhbGlkYXRpb25fKSB7Ci0gICAgICAgIFVwZGF0ZVNvbHV0aW9uKHN0ZDo6Z2V0PDA+KHNvbHV0aW9uKSk7Ci0gICAgICAgIEZsdXNoQW5kQ2xvc2UoZmFsc2UpOwotICAgICAgICBMT0coRkFUQUwpIDw8ICJCYWlsaW5nLCB1c2UgLS1za2lwX29yZGVyX3ZhbGlkYXRpb24gdG8gY29udGludWUuICAiCi0gICAgICAgICAgICAgICAgICAgICAgIlVzZSBhdCB5b3VyIG93biByaXNrLiI7CisgICAgaWYgKCFwcm9ibGVtLT5WYWxpZGF0ZVNvbHV0aW9uKHNvbHV0aW9uLCB0cnVlKSkgeworICAgICAgaWYgKCFGTEFHU19jb25zdHJhaW5lZF9zb2x2ZSkgeworICAgICAgICAvLyBEbyBpdCBub24tcXVpZXQgbm93LgorICAgICAgICBwcm9ibGVtLT5WYWxpZGF0ZVNvbHV0aW9uKHNvbHV0aW9uLCBmYWxzZSk7CisKKyAgICAgICAgTE9HKFdBUk5JTkcpIDw8ICJJbnZhbGlkIHNvbHV0aW9uLCBjb25zdHJhaW50cyBub3QgbWV0IGZvciBwcm9ibGVtICIKKyAgICAgICAgICAgICAgICAgICAgIDw8IHNvbHZlci5teV9zb2x2ZV9udW1iZXIoKTsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzb2x1dGlvbi5zaXplKCk7ICsraSkgeworICAgICAgICAgIExPRyhJTkZPKSA8PCAiICAiIDw8IHNvbHV0aW9uW2ldOworICAgICAgICB9CisgICAgICAgIHByb2JsZW0tPkRlYnVnKCk7CisgICAgICAgIGlmICghc2tpcF9vcmRlcl92YWxpZGF0aW9uXykgeworICAgICAgICAgIFVwZGF0ZVNvbHV0aW9uKHNvbHV0aW9uKTsKKyAgICAgICAgICBGbHVzaEFuZENsb3NlKGZhbHNlKTsKKyAgICAgICAgICBMT0coRkFUQUwpIDw8ICJCYWlsaW5nLCB1c2UgLS1za2lwX29yZGVyX3ZhbGlkYXRpb24gdG8gY29udGludWUuICAiCisgICAgICAgICAgICAgICAgICAgICAgICAiVXNlIGF0IHlvdXIgb3duIHJpc2suIjsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gU2VlZCB3aXRoIG91ciBsYXN0IHNvbHV0aW9uLgorICAgICAgICBmb3IgKHNpemVfdCBub2RlX2luZGV4ID0gMDsgbm9kZV9pbmRleCA8IGJhc2VfdGltZXMuc2l6ZSgpOworICAgICAgICAgICAgICsrbm9kZV9pbmRleCkgeworICAgICAgICAgIHByb2JsZW0tPnNldF9iYXNlX2Nsb2NrKG5vZGVfaW5kZXgsIHNvbHV0aW9uW25vZGVfaW5kZXhdKTsKKyAgICAgICAgfQorICAgICAgICAvLyBBbmQgbm93IHJlc29sdmUgY29uc3RyYWluZWQuCisgICAgICAgIHByb2JsZW0tPnNldF9wb2ludHMocG9pbnRzKTsKKyAgICAgICAgc3RkOjp0aWUoc29sdXRpb24sIHNvbHV0aW9uX3ksIHNvbHV0aW9uX2luZGV4LCBpdGVyYXRpb25zKSA9CisgICAgICAgICAgICBTb2x2ZUNvbnN0cmFpbmVkTmV3dG9uKCZzb2x2ZXIsIHByb2JsZW0sIGtNYXhJdGVyYXRpb25zKTsKKworICAgICAgICBpZiAoaXRlcmF0aW9ucyA+IGtNYXhJdGVyYXRpb25zICYmIEZMQUdTX2NyYXNoX29uX3NvbHZlX2ZhaWx1cmUpIHsKKyAgICAgICAgICBVcGRhdGVTb2x1dGlvbihzdGQ6Om1vdmUoc29sdXRpb24pKTsKKyAgICAgICAgICBGbHVzaEFuZENsb3NlKGZhbHNlKTsKKyAgICAgICAgICBMT0coRkFUQUwpIDw8ICJGYWlsZWQgdG8gY29udmVyZ2UgZm9yIHByb2JsZW0gIgorICAgICAgICAgICAgICAgICAgICAgPDwgc29sdmVyLm15X3NvbHZlX251bWJlcigpOworICAgICAgICB9CisgICAgICAgIGlmICghcHJvYmxlbS0+VmFsaWRhdGVTb2x1dGlvbihzb2x1dGlvbiwgZmFsc2UpKSB7CisgICAgICAgICAgTE9HKFdBUk5JTkcpIDw8ICJJbnZhbGlkIHNvbHV0aW9uLCBjb25zdHJhaW50cyBub3QgbWV0IGZvciBwcm9ibGVtICIKKyAgICAgICAgICAgICAgICAgICAgICAgPDwgc29sdmVyLm15X3NvbHZlX251bWJlcigpOworICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc29sdXRpb24uc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgICAgIExPRyhJTkZPKSA8PCAiICAiIDw8IHNvbHV0aW9uW2ldOworICAgICAgICAgIH0KKyAgICAgICAgICBwcm9ibGVtLT5EZWJ1ZygpOworICAgICAgICAgIGlmICghc2tpcF9vcmRlcl92YWxpZGF0aW9uXykgeworICAgICAgICAgICAgVXBkYXRlU29sdXRpb24oc29sdXRpb24pOworICAgICAgICAgICAgRmx1c2hBbmRDbG9zZShmYWxzZSk7CisgICAgICAgICAgICBMT0coRkFUQUwpIDw8ICJCYWlsaW5nLCB1c2UgLS1za2lwX29yZGVyX3ZhbGlkYXRpb24gdG8gY29udGludWUuICAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICJVc2UgYXQgeW91ciBvd24gcmlzay4iOworICAgICAgICAgIH0KKyAgICAgICAgfQogICAgICAgfQogICAgIH0KIAogICAgIGlmIChWTE9HX0lTX09OKDEpKSB7Ci0gICAgICBWTE9HKDEpIDw8ICJDYW5kaWRhdGUgc3RkOjpnZXQ8MD4oc29sdXRpb24pIGZvciBub2RlICIgPDwgbm9kZV9hX2luZGV4Ci0gICAgICAgICAgICAgIDw8ICIgaXMiOwotICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzdGQ6OmdldDwwPihzb2x1dGlvbikuc2l6ZSgpOyArK2kpIHsKLSAgICAgICAgVkxPRygxKSA8PCAiICAiIDw8IHN0ZDo6Z2V0PDA+KHNvbHV0aW9uKVtpXTsKKyAgICAgIFZMT0coMSkgPDwgIkNhbmRpZGF0ZSBzb2x1dGlvbiBmb3Igbm9kZSAiIDw8IG5vZGVfYV9pbmRleCA8PCAiIGlzIjsKKyAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc29sdXRpb24uc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgVkxPRygxKSA8PCAiICAiIDw8IHNvbHV0aW9uW2ldOwogICAgICAgfQogICAgIH0KIAogICAgIGlmIChyZXN1bHRfdGltZXMuZW1wdHkoKSkgewogICAgICAgLy8gVGhpcyBpcyB0aGUgZmlyc3Qgc29sdXRpb24gY2FuZGlkYXRlLCBzbyBkb24ndCBib3RoZXIgY29tcGFyaW5nLgotICAgICAgcmVzdWx0X3RpbWVzID0gc3RkOjptb3ZlKHN0ZDo6Z2V0PDA+KHNvbHV0aW9uKSk7CisgICAgICByZXN1bHRfdGltZXMgPSBzdGQ6Om1vdmUoc29sdXRpb24pOwogICAgICAgbmV4dF9maWx0ZXIgPSBuZXh0X25vZGVfZmlsdGVyOwogICAgICAgc29sdXRpb25faW5kZXggPSBub2RlX2FfaW5kZXg7CiAgICAgICBjb250aW51ZTsKICAgICB9CiAKLSAgICBzd2l0Y2ggKENvbXBhcmVUaW1lcyhyZXN1bHRfdGltZXMsIHN0ZDo6Z2V0PDA+KHNvbHV0aW9uKSkpIHsKKyAgICBzd2l0Y2ggKENvbXBhcmVUaW1lcyhyZXN1bHRfdGltZXMsIHNvbHV0aW9uKSkgewogICAgICAgLy8gVGhlIG9sZCBzb2x1dGlvbiBpcyBiZWZvcmUgb3IgYXQgdGhlIG5ldyBzb2x1dGlvbi4gIFRoaXMgbWVhbnMgdGhhdAogICAgICAgLy8gdGhlIG9sZCBzb2x1dGlvbiBpcyBhIGJldHRlciByZXN1bHQsIHNvIGlnbm9yZSB0aGlzIG9uZS4KICAgICAgIGNhc2UgVGltZUNvbXBhcmlzb246OmtCZWZvcmU6CkBAIC0xOTE0LDEyICsyNzU4LDEyIEBACiAgICAgICAgIGJyZWFrOwogICAgICAgY2FzZSBUaW1lQ29tcGFyaXNvbjo6a0FmdGVyOgogICAgICAgICAvLyBUaGUgbmV3IHNvbHV0aW9uIGlzIGJldHRlciEgIFNhdmUgaXQuCi0gICAgICAgIHJlc3VsdF90aW1lcyA9IHN0ZDo6bW92ZShzdGQ6OmdldDwwPihzb2x1dGlvbikpOworICAgICAgICByZXN1bHRfdGltZXMgPSBzdGQ6Om1vdmUoc29sdXRpb24pOwogICAgICAgICBuZXh0X2ZpbHRlciA9IG5leHRfbm9kZV9maWx0ZXI7CiAgICAgICAgIHNvbHV0aW9uX2luZGV4ID0gbm9kZV9hX2luZGV4OwogICAgICAgICBicmVhazsKICAgICAgIGNhc2UgVGltZUNvbXBhcmlzb246OmtJbnZhbGlkOiB7Ci0gICAgICAgIENoZWNrSW52YWxpZERpc3RhbmNlKHJlc3VsdF90aW1lcywgc3RkOjpnZXQ8MD4oc29sdXRpb24pKTsKKyAgICAgICAgQ2hlY2tJbnZhbGlkRGlzdGFuY2UocmVzdWx0X3RpbWVzLCBzb2x1dGlvbik7CiAgICAgICAgIGlmIChuZXh0X25vZGVfZmlsdGVyKSB7CiAgICAgICAgICAgc3RkOjpvcHRpb25hbDxzdGQ6OnR1cGxlPGxvZ2dlcjo6Qm9vdFRpbWVzdGFtcCwgbG9nZ2VyOjpCb290RHVyYXRpb24+PgogICAgICAgICAgICAgICByZXN1bHQgPSBuZXh0X25vZGVfZmlsdGVyLT5Db25zdW1lKCk7CkBAIC0yMTAwLDYgKzI5NDQsMTYgQEAKICAgICByZXR1cm4gc3RkOjpudWxsb3B0OwogICB9CiAKKyAgeworICAgIHNpemVfdCBpbmRleCA9IDA7CisgICAgZm9yIChhdXRvIHQgOiByZXN1bHRfdGltZXMpIHsKKyAgICAgIFZMT0coMSkKKyAgICAgICAgICA8PCAiVGltZTogIiA8PCB0IDw8ICIgIgorICAgICAgICAgIDw8IGxvZ2dlZF9jb25maWd1cmF0aW9uXy0+bm9kZXMoKS0+R2V0KGluZGV4KS0+bmFtZSgpLT5zdHJpbmdfdmlldygpOworICAgICAgKytpbmRleDsKKyAgICB9CisgIH0KKwogICBzdGQ6OnR1cGxlPGxvZ2dlcjo6Qm9vdFRpbWVzdGFtcCwgbG9nZ2VyOjpCb290RHVyYXRpb24+IHNhbXBsZTsKICAgaWYgKGZpcnN0X3NvbHV0aW9uXykgewogICAgIGZpcnN0X3NvbHV0aW9uXyA9IGZhbHNlOwpAQCAtMjExNCwxMiArMjk2OCwxNiBAQAogICAgIGlmIChuZXh0X2ZpbHRlcikgewogICAgICAgLy8gVGhpcyBpc24ndCBhIHN0YXJ0IHRpbWUgYmVjYXVzZSB3ZSBoYXZlIGEgY29ycmVzcG9uZGluZyBmaWx0ZXIuCiAgICAgICBzYW1wbGUgPSAqbmV4dF9maWx0ZXItPkNvbnN1bWUoKTsKKyAgICAgIFZMT0coMSkgPDwgIlNhbXBsZSBpcyAiIDw8IHN0ZDo6Z2V0PDA+KHNhbXBsZSkgPDwgIiBmcm9tICIKKyAgICAgICAgICAgICAgPDwgbmV4dF9maWx0ZXItPm5vZGVfYSgpLT5uYW1lKCktPnN0cmluZ192aWV3KCk7CiAgICAgICBuZXh0X2ZpbHRlci0+UG9wKHN0ZDo6Z2V0PDA+KHNhbXBsZSkgLSB0aW1lX2VzdGltYXRpb25fYnVmZmVyX3NlY29uZHNfKTsKICAgICB9CiAgIH0gZWxzZSB7CiAgICAgaWYgKG5leHRfZmlsdGVyKSB7CiAgICAgICAvLyBUaGlzIGlzbid0IGEgc3RhcnQgdGltZSBiZWNhdXNlIHdlIGhhdmUgYSBjb3JyZXNwb25kaW5nIGZpbHRlci4KICAgICAgIHNhbXBsZSA9ICpuZXh0X2ZpbHRlci0+Q29uc3VtZSgpOworICAgICAgVkxPRygxKSA8PCAiU2FtcGxlIGlzICIgPDwgc3RkOjpnZXQ8MD4oc2FtcGxlKSA8PCAiIGZyb20gIgorICAgICAgICAgICAgICA8PCBuZXh0X2ZpbHRlci0+bm9kZV9hKCktPm5hbWUoKS0+c3RyaW5nX3ZpZXcoKTsKICAgICAgIG5leHRfZmlsdGVyLT5Qb3Aoc3RkOjpnZXQ8MD4oc2FtcGxlKSAtIHRpbWVfZXN0aW1hdGlvbl9idWZmZXJfc2Vjb25kc18pOwogICAgIH0KICAgICAvLyBXZSBmb3VuZCBhIGdvb2Qgc2FtcGxlLCBzbyBjb25zdW1lIGl0LiAgSWYgaXQgaXMgYSBkdXBsaWNhdGUsIHdlIHN0aWxsCmRpZmYgLS1naXQgYS9hb3MvbmV0d29yay9tdWx0aW5vZGVfdGltZXN0YW1wX2ZpbHRlci5oIGIvYW9zL25ldHdvcmsvbXVsdGlub2RlX3RpbWVzdGFtcF9maWx0ZXIuaAppbmRleCBiMDc4NTQ1Li41ODY0MzM0IDEwMDY0NAotLS0gYS9hb3MvbmV0d29yay9tdWx0aW5vZGVfdGltZXN0YW1wX2ZpbHRlci5oCisrKyBiL2Fvcy9uZXR3b3JrL211bHRpbm9kZV90aW1lc3RhbXBfZmlsdGVyLmgKQEAgLTE4LDYgKzE4LDE0OCBAQAogbmFtZXNwYWNlIGFvcyB7CiBuYW1lc3BhY2UgbWVzc2FnZV9icmlkZ2UgewogCisvLyBQcm9ibGVtIGRlc2NyaXB0aW9uIGZvciBOZXd0b25Tb2x2ZXIuCitjbGFzcyBQcm9ibGVtIHsKKyBwdWJsaWM6CisgIC8vIFRoZSBkZXJpdmF0aXZlcyBhbmQgb3RoZXIgd29yayBwcm9kdWN0cyBuZWVkZWQgZm9yIGJvdGggdGhlIGNvbnN0cmFpbmVkIGFuZAorICAvLyB1bmNvbnN0cmFpbmVkIG5ld3RvbnMgbWV0aG9kLgorICBzdHJ1Y3QgRGVyaXZhdGl2ZXMgeworICAgIEVpZ2VuOjpWZWN0b3JYZCBncmFkaWVudDsKKyAgICBFaWdlbjo6TWF0cml4WGQgaGVzc2lhbjsKKworICAgIC8vIEluZXF1YWxpdHkgZnVuY3Rpb24gZgorICAgIEVpZ2VuOjpNYXRyaXhYZCBmOworICAgIC8vIGRmCisgICAgRWlnZW46Ok1hdHJpeFhkIGRmOworICAgIC8vIFNsb3BlIGxpbWl0ZWQgZGYuIFRoaXMgaXMgdXNlZCBhcyBwYXJ0IG9mIGNvbXB1dGluZyB0aGUgbW9kaWZpZWQgS0tUCisgICAgLy8gY29uZGl0aW9ucyB0byBhdm9pZCBkaXNjb250aW51aXRpZXMgYWNyb3NzIHNlZ21lbnQgYm91bmRhcmllcyBpbiBsYW1iZGEsCisgICAgLy8gYW5kIHRoZXJlZm9yIFJ0LiAgU2VlIFJ0IGluIHRoZSAuY2MgZmlsZSBmb3IgbW9yZSBpbmZvLgorICAgIEVpZ2VuOjpNYXRyaXhYZCBkZl9zbG9wZV9saW1pdGVkOworCisgICAgLy8gZGRmIGlzIGFzc3VtZWQgdG8gYmUgMCBiZWNhdXNlIGZvciB0aGUgbGluZWFyIGNvbnN0cmFpbnQgZGlzdGFuY2UKKyAgICAvLyBmdW5jdGlvbiB3ZSBhcmUgdXNpbmcsIGl0IGlzIGFjdHVhbGx5IDAsIGFuZCBieSBhc3N1bWluZyBpdCBpcyB6ZXJvCisgICAgLy8gcmF0aGVyIHRoYW4gcGFzc2luZyBpdCB0aHJvdWdoIGFzIDAgdG8gdGhlIHNvbHZlciwgd2UgY2FuIHNhdmUgZW5vdWdoIENQVQorICAgIC8vIHRvIG1ha2UgaXQgd29ydGggaXQuCisKKyAgICAvLyBBCisgICAgRWlnZW46Ok1hdHJpeFhkIEE7CisgICAgLy8gQXggLSBiCisgICAgRWlnZW46Ok1hdHJpeFhkIEF4bWI7CisgICAgLy8gTm9kZSBwaWNrZWQgZm9yIEF4bWIKKyAgICBzaXplX3Qgc29sdXRpb25fbm9kZSA9IHN0ZDo6bnVtZXJpY19saW1pdHM8c2l6ZV90Pjo6bWF4KCk7CisgIH07CisKKyAgLy8gQ29tcHV0ZXMgdGhlIGRlcml2YXRpdmVzIG9mIHRoZSBjb3N0IGZ1bmN0aW9uLgorICAvLyBJZiBxdWlldCBpcyB0cnVlLCBDb21wdXRlRGVyaXZhdGl2ZXMgc2hvdWxkbid0IHByaW50IGFueXRoaW5nLiAgSWYgYWxsIGlzCisgIC8vIHRydWUsIGFsbCBpbmVxdWFsaXR5IGNvbnN0cmFpbnRzIGFyZSBwb3B1bGF0ZWQsIG90aGVyd2lzZSBvbmx5IHRoZQorICAvLyBjb25zdHJhaW50IGluZGljZXMgKGluZGV4ZWQgaW50byB0aGUgbGlzdCBvZiBhbGwgY29uc3RyYWludHMpIHByb3ZpZGVkIGFyZQorICAvLyByZWZlcmVuY2VkLgorICB2aXJ0dWFsIERlcml2YXRpdmVzIENvbXB1dGVEZXJpdmF0aXZlcygKKyAgICAgIHNpemVfdCBzb2x2ZV9udW1iZXIsIGNvbnN0IEVpZ2VuOjpSZWY8Y29uc3QgRWlnZW46OlZlY3RvclhkPiB5LAorICAgICAgYm9vbCBxdWlldCwgYm9vbCBhbGwsCisgICAgICBjb25zdCBhYnNsOjpTcGFuPGNvbnN0IHNpemVfdD4gYWN0aXZlX2NvbnN0cmFpbnRzKSA9IDA7CisKKyAgLy8gUHJlcGFyZXMgdGhlIHByb2JsZW0gdG8gYmUgc29sdmVkLiAgVGhpcyBpcyBjYWxsZWQgd2hlbiB0aGUgcHJvYmxlbSBpcworICAvLyBzdGFydGVkIGJlZm9yZSBhbnkgZGVyaXZhdGl2ZXMgYXJlIGNvbXB1dGVkLgorICB2aXJ0dWFsIHZvaWQgUHJlcGFyZShzaXplX3QgbXlfc29sdmVfbnVtYmVyKSA9IDA7CisKKyAgLy8gT2JzZXJ2ZXMgKGFuZCBwb3RlbnRpYWxseSBtb2RpZmllcyB5KSBmb3IgYSBuZXcgeS4KKyAgdmlydHVhbCB2b2lkIFVwZGF0ZShzaXplX3Qgc29sdmVfbnVtYmVyLCBFaWdlbjo6UmVmPEVpZ2VuOjpWZWN0b3JYZD4geSkgPSAwOworCisgIC8vIFJldHVybnMgdGhlIG51bWJlciBvZiBzdGF0ZXMuCisgIHNpemVfdCBzdGF0ZXMoKSBjb25zdCB7IHJldHVybiBzdGF0ZXNfOyB9CisKKyAgLy8gUmV0dXJucyB0aGUgbnVtYmVyIG9mIGluZXF1YWxpdHkgY29uc3RyYWludHMuCisgIHNpemVfdCBpbmVxdWFsaXR5X2NvbnN0cmFpbnRzKCkgY29uc3QgeyByZXR1cm4gaW5lcXVhbGl0eV9jb25zdHJhaW50c187IH0KKworIHByb3RlY3RlZDoKKyAgc2l6ZV90IHN0YXRlc18gPSAwOworICBzaXplX3QgaW5lcXVhbGl0eV9jb25zdHJhaW50c18gPSAwOworfTsKKworLy8gSW1wbGVtZW50cyBhIHNvbHZlciBmb3IgdmFyaW91cyBQcm9ibGVtcy4KK2NsYXNzIE5ld3RvblNvbHZlciB7CisgcHVibGljOgorICAvLyBSYXRpbyB0byBsZXQgdGhlIGNvc3QgaW5jcmVhc2Ugd2hlbiBsaW5lIHNlYXJjaGluZy4gIEEgc21hbGwgaW5jcmVhc2UgaXMKKyAgLy8gZmluZSBzaW5jZSB3ZSBhcmVuJ3QgcGVyZmVjdGx5IGNvbnZleC4KKyAgc3RhdGljIGNvbnN0ZXhwciBkb3VibGUga0FscGhhID0gLTAuMTU7CisgIC8vIExpbmUgc2VhcmNoIHN0ZXAgcGFyYW1ldGVyLgorICBzdGF0aWMgY29uc3RleHByIGRvdWJsZSBrQmV0YSA9IDAuNTsKKyAgc3RhdGljIGNvbnN0ZXhwciBkb3VibGUga011ID0gMi4wOworICAvLyBUZXJtaW5hbCBjb25kaXRpb24gZm9yIHRoZSBwcmltYWwgcHJvYmxlbSAoZXF1YWxpdHkgY29uc3RyYWludHMpIGFuZCBkdWFsCisgIC8vIChncmFkaWVudCArIGluZXF1YWxpdHkgY29uc3RyYWludHMpLgorICBzdGF0aWMgY29uc3RleHByIGRvdWJsZSBrRXBzaWxvbkYgPSAxZS00OworICAvLyBUZXJtaW5hbCBjb25kaXRpb24gZm9yIG51LCB0aGUgc3Vycm9nYXRlIGR1YWxpdHkgZ2FwLgorICBzdGF0aWMgY29uc3RleHByIGRvdWJsZSBrRXBzaWxvbiA9IDFlLTI7CisKKyAgTmV3dG9uU29sdmVyKCk7CisKKyAgLy8gUmV0dXJucyB3aGljaCBzb2x2ZSBudW1iZXIgdGhpcyBpcy4gIFRoaXMgaW5jcmVtZW50cyBlYWNoIHRpbWUgTmV3dG9uU29sdmVyCisgIC8vIGlzIGNvbnN0cnVjdGVkLCBhbmQgaXMgb25seSB1c2VkIGZvciBkZWJ1Z2dpbmcuCisgIHNpemVfdCBteV9zb2x2ZV9udW1iZXIoKSBjb25zdCB7IHJldHVybiBteV9zb2x2ZV9udW1iZXJfOyB9CisKKyAgLy8gU29sdmVzIGEgcHJvYmxlbSB1c2luZyBhbiBpbmZlYXNpYmxlIHN0YXJ0IHVuY29uc3RyYWluZWQgTmV3dG9ucyBtZXRob2QKKyAgLy8gc29sdmVyLiAgVGhlcmUgaXMgbm8gbGluZSBzZWFyY2guCisgIC8vCisgIC8vIG1pbmltaXplICAgICBmMCh4KQorICAvLyAgc3ViamVjdCB0byAgQSB4ID0gMAorICAvLworICAvLyBSZXR1cm5zIHRoZSBzb2x1dGlvbiwgdGhlIHNvbHV0aW9uX25vZGUgZmllbGQgZnJvbSB0aGUgZmluYWwgZGVyaXZhdGl2ZXMsCisgIC8vIGFuZCB0aGUgbnVtYmVyIG9mIGl0ZXJhdGlvbnMgaXQgdG9vaworICBzdGQ6OnR1cGxlPEVpZ2VuOjpWZWN0b3JYZCwgc2l6ZV90LCBzaXplX3Q+IFNvbHZlTmV3dG9uKAorICAgICAgUHJvYmxlbSAqcHJvYmxlbSwgY29uc3Qgc2l6ZV90IG1heF9pdGVyYXRpb25zKTsKKworICAvLyBTb2x2ZXMgYSBwcm9ibGVtIHVzaW5nIGFuIGluZmVhc2libGUgc3RhcnQgIFByaW1hbC1kdWFsIGludGVyaW9yLXBvaW50CisgIC8vIG1ldGhvZCBzb2x2ZXIuIE9ubHkgcmVzcGVjdHMgdGhlIGNvbnN0cmFpbnQgaW5kaWNlcyBwcm92aWRlZCBhbmQgd2hpY2ggYXJlCisgIC8vIHZpb2xhdGVkIGJ5IHRoZSBpbml0aWFsIHgoMCkuCisgIC8vCisgIC8vIG1pbmltaXplICAgICBmMCh4KQorICAvLyAgc3ViamVjdCB0byAgZih4KSA8PTAKKyAgLy8gICAgICAgICAgICAgIEEgeCA9IDAKKyAgLy8KKyAgLy8gUmV0dXJucyB0aGUgc29sdXRpb24sIHRoZSBzb2x1dGlvbl9ub2RlIGZpZWxkIGZyb20gdGhlIGZpbmFsIGRlcml2YXRpdmVzLAorICAvLyB0aGUgbnVtYmVyIG9mIGl0ZXJhdGlvbnMgaXQgdG9vaywgYW5kIGEgbGlzdCBvZiB0aGUgY29uc3RyYWludHMgYWN0dWFsbHkKKyAgLy8gdXNlZCBpbiB0aGUgc29sdXRpb24uCisgIHN0ZDo6dHVwbGU8RWlnZW46OlZlY3RvclhkLCBzaXplX3QsIHNpemVfdCwgc3RkOjp2ZWN0b3I8c2l6ZV90Pj4KKyAgU29sdmVDb25zdHJhaW5lZE5ld3RvbihQcm9ibGVtICpwcm9ibGVtLCBzaXplX3QgbWF4X2l0ZXJhdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYWJzbDo6U3Bhbjxjb25zdCBzaXplX3Q+IGNvbnN0cmFpbnRfaW5kaWNlcyk7CisKKyAgLy8gQWRkcyBvdXIgc2xhY2sgdmFyaWFibGUgdG8gb3VyIGNvbnN0cmFpbmVkIHByb2JsZW0gZGVyaXZhdGl2ZXMuCisgIHN0YXRpYyBQcm9ibGVtOjpEZXJpdmF0aXZlcyBBZGRDb25zdHJhaW50U2xhY2tWYXJpYWJsZSgKKyAgICAgIGNvbnN0IFByb2JsZW06OkRlcml2YXRpdmVzICZkZXJpdmF0aXZlcywKKyAgICAgIGNvbnN0IEVpZ2VuOjpSZWY8Y29uc3QgRWlnZW46OlZlY3RvclhkPiB5KTsKKworIHByaXZhdGU6CisgIC8vIFJldHVybnMgdGhlIG1vZGlmaWVkIEtLVCBjb25kaXRpb25zCisgIC8vICgxMS41MyBpbiBDb252ZXggT3B0aW1pemF0aW9uLAorICAvLyAgaHR0cHM6Ly93ZWIuc3RhbmZvcmQuZWR1L35ib3lkL2N2eGJvb2svYnZfY3Z4Ym9vay5wZGYpCisgIEVpZ2VuOjpWZWN0b3JYZCBSdChjb25zdCBQcm9ibGVtOjpEZXJpdmF0aXZlcyAmZGVyaXZhdGl2ZXMsCisgICAgICAgICAgICAgICAgICAgICBFaWdlbjo6UmVmPGNvbnN0IEVpZ2VuOjpWZWN0b3JYZD4geSwgZG91YmxlIHQpOworCisgIC8vIFJldHVybnMgdGhlIGNvbnN0cmFpbmVkIG5ld3RvbnMgc3RlcCwgdF9pbnZlcnNlLCBhbmQgUnQuCisgIHN0ZDo6dHVwbGU8RWlnZW46OlZlY3RvclhkLCBkb3VibGUsIEVpZ2VuOjpWZWN0b3JYZD4gQ29uc3RyYWluZWROZXd0b24oCisgICAgICBjb25zdCBFaWdlbjo6UmVmPGNvbnN0IEVpZ2VuOjpWZWN0b3JYZD4geSwKKyAgICAgIGNvbnN0IFByb2JsZW06OkRlcml2YXRpdmVzICZkZXJpdmF0aXZlcywgc2l6ZV90IGl0ZXJhdGlvbik7CisKKyAgLy8gUHJpbnRzIG91dCB0aGUgcHJvdmlkZWQgZGVyaXZhdGl2ZXMgZm9yIGRlYnVnZ2luZy4KKyAgdm9pZCBQcmludERlcml2YXRpdmVzKGNvbnN0IFByb2JsZW06OkRlcml2YXRpdmVzICZkZXJpdmF0aXZlcywKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEVpZ2VuOjpSZWY8Y29uc3QgRWlnZW46OlZlY3RvclhkPiB5LAorICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmdfdmlldyBwcmVmaXgsIGludCB2ZXJib3NpdHkpOworCisgIC8vIFJldHVybnMgdGhlIG5ld3RvbiBzdGVwIG9mIHRoZSB0aW1lc3RhbXAgcHJvYmxlbSwgYW5kIHRoZSBub2RlIHdoaWNoIHdhcworICAvLyB1c2VkIGZvciB0aGUgZXF1YWxpdHkgY29uc3RyYWludC4gIFRoZSBsYXN0IHRlcm0gaXMgdGhlIHNjYWxhciBvbiB0aGUKKyAgLy8gZXF1YWxpdHkgY29uc3RyYWludC4gIFRoaXMgbmVlZHMgdG8gYmUgcmVtb3ZlZCBmcm9tIHRoZSBzb2x1dGlvbiB0byBnZXQgdGhlCisgIC8vIGFjdHVhbCBuZXd0b24gc3RlcC4KKyAgRWlnZW46OlZlY3RvclhkIE5ld3Rvbihjb25zdCBQcm9ibGVtOjpEZXJpdmF0aXZlcyAmZGVyaXZhdGl2ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGl0ZXJhdGlvbik7CisKKyAgLy8gVGhlIHNvbHZlIG51bWJlciBmb3IgdGhpcyBpbnN0YW5jZSBvZiB0aGUgcHJvYmxlbS4KKyAgc2l6ZV90IG15X3NvbHZlX251bWJlcl87CisKKyAgLy8gVGhlIGdsb2JhbCBzb2x2ZSBudW1iZXIgY291bnRlciB1c2VkIHRvIGRldGVybWluaXN0aWNhbGx5IGZpbmQgcHJvYmxlbXMuCisgIHN0YXRpYyBzaXplX3Qgc29sdmVfbnVtYmVyXzsKK307CisKIC8vIEEgY29uZGVuc2VkIHJlcHJlc2VudGF0aW9uIG9mIHRoZSB0aW1lIGVzdGltYXRpb24gcHJvYmxlbSBzdGF0ZW1lbnQuICBUaGlzIGlzCiAvLyBkZXNpZ25lZCB0byBub3QgaGF2ZSB0aGUgY29uY2VwdCBvZiBhIE5vZGUgb2JqZWN0LCBvciBhbnl0aGluZywganVzdAogLy8gbWVhc3VyZW1lbnQgcGFpcnMgYW5kIGluZGljZXMuCkBAIC0zMyw3ICsxNzUsNyBAQAogLy8KIC8vIFRvIG1ha2UgdGhpcyBvYmplY3QgcmV1c2FibGUsIGl0IGhhcyBhIHNvbHV0aW9uX25vZGUgaW5kZXggd2hpY2ggc3BlY2lmaWVzCiAvLyB3aGljaCBvZiB0aGUgbm9kZXMgaXMgdHJlYXRlZCBhcyBhbiBpbnB1dCBhbmQgbm90IHNvbHZlZCBmb3IuCi1jbGFzcyBUaW1lc3RhbXBQcm9ibGVtIHsKK2NsYXNzIFRpbWVzdGFtcFByb2JsZW0gOiBwdWJsaWMgUHJvYmxlbSB7CiAgcHVibGljOgogICBUaW1lc3RhbXBQcm9ibGVtKHNpemVfdCBjb3VudCk7CiAKQEAgLTU4LDEyICsyMDAsOSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiX2ZpbHRlcik7CiAgIH0KIAotICAvLyBTb2x2ZXMgdGhlIG9wdGltaXphdGlvbiBwcm9ibGVtIHBocmFzZWQgdXNpbmcgdGhlIHN5bW1ldHJpYyBOZXR3b24ncyBtZXRob2QKLSAgLy8gc29sdmVyIGFuZCByZXR1cm5zIHRoZSBvcHRpbWFsIHRpbWUgb24gZWFjaCBub2RlLCBhbG9uZyB3aXRoIHRoZSBub2RlIHdoaWNoCi0gIC8vIGNvbnN0cmFpbmVkIHRoZSBwcm9ibGVtLiAgcG9pbnRzIGlzIHRoZSBsaXN0IG9mIHBvdGVudGlhbCBjb25zdHJhaW50Ci0gIC8vIHBvaW50cywgYW5kIHRoZSBzb2x2ZXIgdXNlcyB0aGUgZWFybGllc3QgcG9pbnQuCi0gIHN0ZDo6dHVwbGU8c3RkOjp2ZWN0b3I8bG9nZ2VyOjpCb290VGltZXN0YW1wPiwgc2l6ZV90LCBzaXplX3Q+IFNvbHZlTmV3dG9uKAotICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8bG9nZ2VyOjpCb290VGltZXN0YW1wPiAmcG9pbnRzLCBzaXplX3QgbWF4X2l0ZXJhdGlvbnMpOworICAvLyBBZGRzIGJvdGggYmFzZV9jbG9ja18gYW5kIHkgdG9nZXRoZXIgdG8gcHJvZHVjZSB0aGUgZmluYWwgYW5zd2VyLgorICBzdGQ6OnZlY3Rvcjxsb2dnZXI6OkJvb3RUaW1lc3RhbXA+IFBhY2tSZXN1bHRzKAorICAgICAgYm9vbCBwcmludCwgY29uc3QgRWlnZW46OlJlZjxjb25zdCBFaWdlbjo6VmVjdG9yWGQ+IHkpOwogCiAgIC8vIFZhbGlkYXRlcyB0aGUgc29sdXRpb24sIHJldHVybmluZyB0cnVlIGlmIGl0IG1lZXRzIGFsbCB0aGUgY29uc3RyYWludHMsIGFuZAogICAvLyBmYWxzZSBvdGhlcndpc2UuCkBAIC05NCw3ICsyMzMsMjYgQEAKICAgICByZXR1cm4gY291bnQ7CiAgIH0KIAotICBzaXplX3QgbXlfc29sdmVfbnVtYmVyKCkgY29uc3QgeyByZXR1cm4gbXlfc29sdmVfbnVtYmVyXzsgfQorICAvLyBTZXRzIHRoZSBwb2ludHMgdG8gc29sdmUgYW4gZXF1YWxpdHkgY29uc3RyYWludCB0by4KKyAgdm9pZCBzZXRfcG9pbnRzKGNvbnN0IGFic2w6OlNwYW48Y29uc3QgbG9nZ2VyOjpCb290VGltZXN0YW1wPiBwb2ludHMpIHsKKyAgICBwb2ludHNfID0gcG9pbnRzOworICB9CisKKyAgLy8gQWRkcyB0aGUgdmlvbGF0ZWQgY29uc3RyYWludHMgZnJvbSByZXN1bHQgdG8gbmV3X2NvbnN0cmFpbnRfaW5kaWNlcy4KKyAgLy8gUmV0dXJucyB0cnVlIGlmIGFueXRoaW5nIHdhcyBhZGRlZC4KKyAgYm9vbCBBZGRDb25zdHJhaW50cyhzaXplX3Qgc29sdmVfbnVtYmVyLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPGxvZ2dlcjo6Qm9vdFRpbWVzdGFtcD4gJnJlc3VsdCwKKyAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzaXplX3Q+ICpuZXdfY29uc3RyYWludF9pbmRpY2VzKTsKKworICAvLyBSZXR1cm5zIGFsbCB0aGUgZGVyaXZhdGl2ZXMgb2YgdGhlIGNvc3QgZnVuY3Rpb24gYXQgdGhlIHByb3ZpZGUKKyAgLy8gdGltZV9vZmZzZXRzIHVzaW5nIHRoZSBzeW1tZXRyaWMgcHJvYmxlbSBkZWZpbml0aW9uLiAgSWYgcXVpZXQgaXMKKyAgLy8gc3BlY2lmaWNlZCwgbm90aGluZyBpcyBwcmludGVkLiBJZiBhbGwgaXMgc3BlY2lmaWVkLCBhbGwgdGhlIGNvbnN0cmFpbnRzCisgIC8vIGFyZSBjb25zaWRlcmVkLCBvdGhlcndpc2UsIG9ubHkgdGhlIGNvbnN0cmFpbnQgaW5kaWNlcyBpbiBhY3RpdmVfY29uc3RyYWludAorICAvLyBhcmUgY29uc2lkZXJlZC4KKyAgUHJvYmxlbTo6RGVyaXZhdGl2ZXMgQ29tcHV0ZURlcml2YXRpdmVzKAorICAgICAgc2l6ZV90IHNvbHZlX251bWJlciwgY29uc3QgRWlnZW46OlJlZjxjb25zdCBFaWdlbjo6VmVjdG9yWGQ+IHRpbWVfb2Zmc2V0cywKKyAgICAgIGJvb2wgcXVpZXQsIGJvb2wgYWxsLAorICAgICAgY29uc3QgYWJzbDo6U3Bhbjxjb25zdCBzaXplX3Q+IGFjdGl2ZV9jb25zdHJhaW50cykgb3ZlcnJpZGU7CiAKICBwcml2YXRlOgogICAvLyBSZXR1cm5zIHRoZSBudW1iZXIgb2YgbGl2ZSBjb25zdHJhaW50cy4KQEAgLTExMiwyNCArMjcwLDEzIEBACiAgICAgcmV0dXJuIHNvbHV0aW9uX25vZGU7CiAgIH0KIAotICAvLyBUaGUgZGVyaXZpdGl2ZXMgYW5kIG90aGVyIHdvcmsgcHJvZHVjdHMgbmVlZGVkIGZvciBjb25zdHJhaW5lZCBuZXd0b25zCi0gIC8vIG1ldGhvZC4KLSAgc3RydWN0IERlcml2aXRpdmVzIHsKLSAgICBFaWdlbjo6VmVjdG9yWGQgZ3JhZGllbnQ7Ci0gICAgRWlnZW46Ok1hdHJpeFhkIGhlc3NpYW47Ci0gIH07CisgIC8vIFNldHMgdGhlIHByb2JsZW0gdXAgdG8gYmUgcmVhZHkgdG8gc29sdmUuICBDYWNoZXMgYW55dGhpbmcgd2UgbmVlZCBkdXJpbmcKKyAgLy8gdGhlIHNvbHZlLgorICB2b2lkIFByZXBhcmUoc2l6ZV90IG15X3NvbHZlX251bWJlcikgb3ZlcnJpZGU7CiAKLSAgLy8gUmV0dXJucyB0aGUgZ3JhZGllbnQgYW5kIEhlc3NpYW4gb2YgdGhlIGNvc3QgZnVuY3Rpb24gYXQgdGltZV9vZmZzZXRzLgotICBEZXJpdml0aXZlcyBDb21wdXRlRGVyaXZpdGl2ZXMoCi0gICAgICBjb25zdCBFaWdlbjo6UmVmPEVpZ2VuOjpWZWN0b3JYZD4gdGltZV9vZmZzZXRzKTsKLQotICAvLyBSZXR1cm5zIHRoZSBuZXd0b24gc3RlcCBvZiB0aGUgdGltZXN0YW1wIHByb2JsZW0sIGFuZCB0aGUgbm9kZSB3aGljaCB3YXMKLSAgLy8gdXNlZCBmb3IgdGhlIGVxdWFsaXR5IGNvbnN0cmFpbnQuICBUaGUgbGFzdCB0ZXJtIGlzIHRoZSBzY2FsYXIgb24gdGhlCi0gIC8vIGVxdWFsaXR5IGNvbnN0cmFpbnQuICBUaGlzIG5lZWRzIHRvIGJlIHJlbW92ZWQgZnJvbSB0aGUgc29sdXRpb24gdG8gZ2V0IHRoZQotICAvLyBhY3R1YWwgbmV3dG9uIHN0ZXAuCi0gIHN0ZDo6dHVwbGU8RWlnZW46OlZlY3RvclhkLCBzaXplX3Q+IE5ld3RvbigKLSAgICAgIGNvbnN0IEVpZ2VuOjpSZWY8RWlnZW46OlZlY3RvclhkPiB0aW1lX29mZnNldHMsCi0gICAgICBjb25zdCBzdGQ6OnZlY3Rvcjxsb2dnZXI6OkJvb3RUaW1lc3RhbXA+ICZwb2ludHMpOworICAvLyBVcGRhdGVzIGJhc2VfY2xvY2tfIGlmIHkgaXMgdG9vIGJpZyB0byBrZWVwIHRoZSBzb2x1dGlvbiBzbWFsbC4gIFVwZGF0ZXMgeQorICAvLyB0byBhY2NvdW50IGZvciBhbnkgY2hhbmdlLgorICB2b2lkIFVwZGF0ZShzaXplX3Qgc29sdmVfbnVtYmVyLCBFaWdlbjo6UmVmPEVpZ2VuOjpWZWN0b3JYZD4geSkgb3ZlcnJpZGU7CiAKICAgdm9pZCBNYXliZVVwZGF0ZU5vZGVNYXBwaW5nKCk7CiAKQEAgLTE1MCwxMCArMjk3LDYgQEAKICAgYm9vbCBub2RlX21hcHBpbmdfdmFsaWRfID0gZmFsc2U7CiAgIC8vIE1hcHBpbmcgZnJvbSBhIG5vZGUgaW5kZXggdG8gYW4gaW5kZXggaW4gdGhlIHNvbHV0aW9uLgogICBzdGQ6OnZlY3RvcjxzaXplX3Q+IG5vZGVfbWFwcGluZ187Ci0gIC8vIFRoZSBudW1iZXIgb2YgbGl2ZSBub2RlcyB0aGVyZSBhcmUuCi0gIHNpemVfdCBsaXZlX25vZGVzXyA9IDA7Ci0gIC8vIE51bWJlciBvZiBjb25zdHJhaW50cyBpbiBwbGF5LgotICBzaXplX3QgbGl2ZV9jb25zdHJhaW50c18gPSAwOwogCiAgIC8vIEZpbHRlciBhbmQgdGhlIG5vZGUgaW5kZXggaXQgaXMgcmVmZXJlbmNpbmcuCiAgIC8vICAgZmlsdGVyLT5PZmZzZXQodGEpICsgdGEgPT4gdF8oYl9ub2RlKTsKQEAgLTE3MiwxMSArMzE1LDkgQEAKICAgLy8gTGlzdCBvZiBmaWx0ZXJzIGluZGV4ZWQgYnkgbm9kZS4KICAgc3RkOjp2ZWN0b3I8c3RkOjp2ZWN0b3I8RmlsdGVyUGFpcj4+IGNsb2NrX29mZnNldF9maWx0ZXJfZm9yX25vZGVfOwogCi0gIC8vIFRoZSBzb2x2ZSBudW1iZXIgZm9yIHRoaXMgaW5zdGFuY2Ugb2YgdGhlIHByb2JsZW0uCi0gIHNpemVfdCBteV9zb2x2ZV9udW1iZXJfOworICAvLyBQb2ludHMgdG8gc29sdmUgZXF1YWxpdHkgY29uc3RyYWludHMgdG8uCisgIGFic2w6OlNwYW48Y29uc3QgbG9nZ2VyOjpCb290VGltZXN0YW1wPiBwb2ludHNfOwogCi0gIC8vIFRoZSBnbG9iYWwgc29sdmUgbnVtYmVyIGNvdW50ZXIgdXNlZCB0byBkZXRlcm1pbmlzdGljYWxseSBmaW5kIHByb2JsZW1zLgotICBzdGF0aWMgc2l6ZV90IHNvbHZlX251bWJlcl87CiB9OwogCiAvLyBIZWxwZXJzIHRvIGNvbnZlcnQgdGltZXMgYmV0d2VlbiB0aGUgbW9ub3RvbmljIGFuZCBkaXN0cmlidXRlZCBjbG9ja3MgZm9yCmRpZmYgLS1naXQgYS9hb3MvbmV0d29yay9tdWx0aW5vZGVfdGltZXN0YW1wX2ZpbHRlcl90ZXN0LmNjIGIvYW9zL25ldHdvcmsvbXVsdGlub2RlX3RpbWVzdGFtcF9maWx0ZXJfdGVzdC5jYwppbmRleCA1MDE0YTA1Li4yMDlkZTA2IDEwMDY0NAotLS0gYS9hb3MvbmV0d29yay9tdWx0aW5vZGVfdGltZXN0YW1wX2ZpbHRlcl90ZXN0LmNjCisrKyBiL2Fvcy9uZXR3b3JrL211bHRpbm9kZV90aW1lc3RhbXBfZmlsdGVyX3Rlc3QuY2MKQEAgLTMzMSw2ICszMzEsOTAgQEAKICAgRVhQRUNUX1RSVUUodGltZV9jb252ZXJ0ZXIuTmV4dFRpbWVzdGFtcCgpKTsKIH0KIAorY2xhc3MgU3F1YXJlUHJvYmxlbSA6IHB1YmxpYyBQcm9ibGVtIHsKKyBwdWJsaWM6CisgIFNxdWFyZVByb2JsZW0oKSA6IFByb2JsZW0oKSB7CisgICAgaW5lcXVhbGl0eV9jb25zdHJhaW50c18gPSA0dTsKKyAgICBzdGF0ZXNfID0gMnU7CisgIH0KKworICB2b2lkIFByZXBhcmUoc2l6ZV90IG15X3NvbHZlX251bWJlcikgb3ZlcnJpZGUgeworICAgIExPRyhJTkZPKSA8PCAiU3RhcnRpbmcgc29sdmUgIiA8PCBteV9zb2x2ZV9udW1iZXI7CisgIH0KKworICB2b2lkIFVwZGF0ZShzaXplX3QgLypzb2x2ZV9udW1iZXIqLywKKyAgICAgICAgICAgICAgRWlnZW46OlJlZjxFaWdlbjo6VmVjdG9yWGQ+IC8qeSovKSBvdmVycmlkZSB7fQorCisgIERlcml2YXRpdmVzIENvbXB1dGVEZXJpdmF0aXZlcygKKyAgICAgIHNpemVfdCAvKnNvbHZlX251bWJlciovLCBjb25zdCBFaWdlbjo6UmVmPGNvbnN0IEVpZ2VuOjpWZWN0b3JYZD4geSwKKyAgICAgIGJvb2wgcXVpZXQsIGJvb2wgYWxsLAorICAgICAgY29uc3QgYWJzbDo6U3Bhbjxjb25zdCBzaXplX3Q+IGFjdGl2ZV9jb25zdHJhaW50cykgb3ZlcnJpZGUgeworICAgIEVpZ2VuOjpNYXRyaXg8ZG91YmxlLCAyLCAyPiBRID0gRWlnZW46OkRpYWdvbmFsTWF0cml4PGRvdWJsZSwgMj4oMS4wLCAyLjApOworICAgIEVpZ2VuOjpNYXRyaXg8ZG91YmxlLCA0LCAyPiBIOworCisgICAgLy8gQm94IGNvbnN0cmFpbnQgZnJvbSAtMSA8PSB4KDApIDw9IDUsIGFuZCAxIDw9IHgoMSkgPD0gNQorICAgIEggPDwgMS4wLCAwLjAsIC0xLjAsIDAuMCwgMC4wLCAxLjAsIDAuMCwgLTEuMDsKKyAgICBFaWdlbjo6TWF0cml4PGRvdWJsZSwgNCwgMT4gazsKKyAgICBrIDw8IDUuMCwgMS4wLCA1LjAsIC0xLjA7CisKKyAgICBEZXJpdmF0aXZlcyByZXN1bHQ7CisgICAgcmVzdWx0LnNvbHV0aW9uX25vZGUgPSAwOworICAgIHJlc3VsdC5oZXNzaWFuID0gMi4wICogUTsKKyAgICByZXN1bHQuZ3JhZGllbnQgPSAyLjAgKiBRICogeS5ibG9jazwyLCAxPigwLCAwKTsKKworICAgIGlmIChhbGwgfHwgYWN0aXZlX2NvbnN0cmFpbnRzLnNpemUoKSAhPSAwdSkgeworICAgICAgaWYgKCFhbGwpIHsKKyAgICAgICAgQ0hFQ0tfRVEoYWN0aXZlX2NvbnN0cmFpbnRzLnNpemUoKSwgNHUpOworICAgICAgfQorICAgICAgcmVzdWx0LmYgPSBIICogeS5ibG9jazwyLCAxPigwLCAwKSAtIGs7CisgICAgICByZXN1bHQuZGYgPSBIOworICAgICAgcmVzdWx0LmRmX3Nsb3BlX2xpbWl0ZWQgPSByZXN1bHQuZGY7CisgICAgfQorCisgICAgcmVzdWx0LkEgPSBFaWdlbjo6TWF0cml4WGQ6Olplcm8oMSwgMik7CisgICAgLy8gU2V0IHgwID0geDEKKyAgICByZXN1bHQuQSgwLCAwKSA9IDEuMDsKKyAgICByZXN1bHQuQSgwLCAxKSA9IC0xLjA7CisKKyAgICByZXN1bHQuQXhtYiA9IHJlc3VsdC5BICogeS5ibG9jazwyLCAxPigwLCAwKTsKKworICAgIGlmICghcXVpZXQpIHsKKyAgICAgIFZMT0coMikgPDwgUTsKKyAgICB9CisKKyAgICByZXR1cm4gcmVzdWx0OworICB9Cit9OworCisvLyBUZXN0cyB0aGF0IG91ciBzb2x2ZXIgY2FuIHNvbHZlIGEgdG95IHByb2JsZW0gd2l0aCBrbm93biBhbnN3ZXJzLgorVEVTVChUaW1lc3RhbXBQcm9ibGVtVGVzdCwgU29sdmVUb3lOZXd0b24pIHsKKyAgU3F1YXJlUHJvYmxlbSBwcm9ibGVtOworCisgIE5ld3RvblNvbHZlciBzb2x2ZXI7CisgIEVpZ2VuOjpWZWN0b3JYZCB5OworICBzaXplX3Qgc29sdXRpb25fbm9kZTsKKyAgc2l6ZV90IGl0ZXJhdGlvbnM7CisgIHN0ZDo6dGllKHksIHNvbHV0aW9uX25vZGUsIGl0ZXJhdGlvbnMpID0gc29sdmVyLlNvbHZlTmV3dG9uKCZwcm9ibGVtLCAyMCk7CisKKyAgRVhQRUNUX05FQVIoeSgwKSwgMC4wLCAxZS02KTsKKyAgRVhQRUNUX05FQVIoeSgxKSwgMC4wLCAxZS02KTsKKworICBzdGQ6OnZlY3RvcjxzaXplX3Q+IGNvbnN0cmFpbnRzOworICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHByb2JsZW0uaW5lcXVhbGl0eV9jb25zdHJhaW50cygpOyArK2kpIHsKKyAgICBjb25zdHJhaW50cy5lbXBsYWNlX2JhY2soaSk7CisgIH0KKworICBzdGQ6OnZlY3RvcjxzaXplX3Q+IHVzZWRfY29uc3RyYWludHM7CisgIHN0ZDo6dGllKHksIHNvbHV0aW9uX25vZGUsIGl0ZXJhdGlvbnMsIHVzZWRfY29uc3RyYWludHMpID0KKyAgICAgIHNvbHZlci5Tb2x2ZUNvbnN0cmFpbmVkTmV3dG9uKCZwcm9ibGVtLCAyMCwgY29uc3RyYWludHMpOworCisgIExPRyhJTkZPKSA8PCB5LnRyYW5zcG9zZSgpOworCisgIEVYUEVDVF9FUShjb25zdHJhaW50cywgdXNlZF9jb25zdHJhaW50cyk7CisgIEVYUEVDVF9ORUFSKHkoMCksIDEuMCwgMWUtMyk7CisgIEVYUEVDVF9ORUFSKHkoMSksIDEuMCwgMWUtMyk7Cit9CisKIC8vIFRlc3RzIHRoYXQgb3VyIE5ld3RvbnMgbWV0aG9kIHNvbHZlciByZXR1cm5zIGNvbnNpc3RlbnQgYW5zd2VycyBmb3IgYSBzaW1wbGUKIC8vIHByb2JsZW0gb3IgdHdvLiAgQWxzbyBjb25maXJtIHRoYXQgdGhlIHJlc2lkdWFsIGVycm9yIHRvIHRoZSBjb25zdHJhaW50cwogLy8gbG9va3Mgc2FuZSwgbWVhbmluZyBpdCBpcyBjZW50ZXJlZC4KQEAgLTM3MywzOCArNDU3LDg0IEBACiAgIHBvaW50czFbMF0gPSBlICsgY2hyb25vOjpzZWNvbmRzKDEpOwogCiAgIGNvbnN0ZXhwciBzaXplX3Qga01heEl0ZXJhdGlvbnMgPSAyMDB1OwotICBzdGQ6OnR1cGxlPHN0ZDo6dmVjdG9yPEJvb3RUaW1lc3RhbXA+LCBzaXplX3QsIHNpemVfdD4gcmVzdWx0MSA9Ci0gICAgICBwcm9ibGVtLlNvbHZlTmV3dG9uKHBvaW50czEsIGtNYXhJdGVyYXRpb25zKTsKKyAgcHJvYmxlbS5zZXRfcG9pbnRzKHBvaW50czEpOworCisgIE5ld3RvblNvbHZlciBzb2x2ZXIxOworICBjb25zdCBzdGQ6OnR1cGxlPEVpZ2VuOjpWZWN0b3JYZCwgc2l6ZV90LCBzaXplX3Q+IHJlc3VsdDEgPQorICAgICAgc29sdmVyMS5Tb2x2ZU5ld3RvbigmcHJvYmxlbSwga01heEl0ZXJhdGlvbnMpOworICBjb25zdCBzdGQ6OnZlY3Rvcjxsb2dnZXI6OkJvb3RUaW1lc3RhbXA+IHRpbWVzMSA9CisgICAgICBwcm9ibGVtLlBhY2tSZXN1bHRzKGZhbHNlLCBzdGQ6OmdldDwwPihyZXN1bHQxKSk7CiAgIEVYUEVDVF9MVChzdGQ6OmdldDwyPihyZXN1bHQxKSwga01heEl0ZXJhdGlvbnMpOwogICBFWFBFQ1RfRVEoc3RkOjpnZXQ8MT4ocmVzdWx0MSksIDB1KTsKLSAgRVhQRUNUX1RSVUUocHJvYmxlbS5WYWxpZGF0ZVNvbHV0aW9uKHN0ZDo6Z2V0PDA+KHJlc3VsdDEpLCBmYWxzZSkpOworICBFWFBFQ1RfVFJVRShwcm9ibGVtLlZhbGlkYXRlU29sdXRpb24odGltZXMxLCBmYWxzZSkpOwogCiAgIHN0ZDo6dmVjdG9yPEJvb3RUaW1lc3RhbXA+IHBvaW50czIocHJvYmxlbS5zaXplKCksIEJvb3RUaW1lc3RhbXA6Om1heF90aW1lKCkpOwotICBwb2ludHMyWzFdID0gc3RkOjpnZXQ8MD4ocmVzdWx0MSlbMV07Ci0gIHN0ZDo6dHVwbGU8c3RkOjp2ZWN0b3I8Qm9vdFRpbWVzdGFtcD4sIHNpemVfdCwgc2l6ZV90PiByZXN1bHQyID0KLSAgICAgIHByb2JsZW0uU29sdmVOZXd0b24ocG9pbnRzMiwga01heEl0ZXJhdGlvbnMpOworICBwb2ludHMyWzFdID0gdGltZXMxWzFdOworICBwcm9ibGVtLnNldF9wb2ludHMocG9pbnRzMik7CisgIE5ld3RvblNvbHZlciBzb2x2ZXIyOworICBzdGQ6OnR1cGxlPEVpZ2VuOjpWZWN0b3JYZCwgc2l6ZV90LCBzaXplX3Q+IHJlc3VsdDIgPQorICAgICAgc29sdmVyMi5Tb2x2ZU5ld3RvbigmcHJvYmxlbSwga01heEl0ZXJhdGlvbnMpOworICBjb25zdCBzdGQ6OnZlY3Rvcjxsb2dnZXI6OkJvb3RUaW1lc3RhbXA+IHRpbWVzMiA9CisgICAgICBwcm9ibGVtLlBhY2tSZXN1bHRzKGZhbHNlLCBzdGQ6OmdldDwwPihyZXN1bHQyKSk7CiAgIEVYUEVDVF9MVChzdGQ6OmdldDwyPihyZXN1bHQxKSwga01heEl0ZXJhdGlvbnMpOwogICBFWFBFQ1RfRVEoc3RkOjpnZXQ8MT4ocmVzdWx0MiksIDF1KTsKLSAgRVhQRUNUX1RSVUUocHJvYmxlbS5WYWxpZGF0ZVNvbHV0aW9uKHN0ZDo6Z2V0PDA+KHJlc3VsdDIpLCBmYWxzZSkpOworICBFWFBFQ1RfVFJVRShwcm9ibGVtLlZhbGlkYXRlU29sdXRpb24odGltZXMyLCBmYWxzZSkpOwogCi0gIEVYUEVDVF9FUShzdGQ6OmdldDwwPihyZXN1bHQxKVswXSwgZSArIGNocm9ubzo6c2Vjb25kcygxKSk7Ci0gIEVYUEVDVF9FUShzdGQ6OmdldDwwPihyZXN1bHQxKVswXSwgc3RkOjpnZXQ8MD4ocmVzdWx0MilbMF0pOwotICBFWFBFQ1RfRVEoc3RkOjpnZXQ8MD4ocmVzdWx0MSlbMV0sIHN0ZDo6Z2V0PDA+KHJlc3VsdDIpWzFdKTsKKyAgRVhQRUNUX0VRKHRpbWVzMVswXSwgZSArIGNocm9ubzo6c2Vjb25kcygxKSk7CisgIEVYUEVDVF9FUSh0aW1lczFbMF0sIHRpbWVzMlswXSk7CisgIEVYUEVDVF9FUSh0aW1lczFbMV0sIHRpbWVzMlsxXSk7CiAKICAgLy8gQ29uZmlybSB0aGF0IHRoZSBlcnJvciBpcyBhbG1vc3QgZXF1YWwgZm9yIGJvdGggZGlyZWN0aW9ucy4gIFRoZSBzb2x1dGlvbgogICAvLyBpcyBhbiBpbnRlZ2VyIHNvbHV0aW9uLCBzbyB0aGVyZSB3aWxsIGJlIGEgbGl0dGxlIGJpdCBvZiBlcnJvciBsZWZ0IG92ZXIuCiAgIHN0ZDo6dHVwbGU8Y2hyb25vOjpuYW5vc2Vjb25kcywgZG91YmxlLCBkb3VibGU+IGFfZXJyb3IgPQotICAgICAgYS5PZmZzZXRFcnJvcihudWxscHRyLCBOb25jYXVzYWxUaW1lc3RhbXBGaWx0ZXI6OlBvaW50ZXIoKSwKLSAgICAgICAgICAgICAgICAgICAgc3RkOjpnZXQ8MD4ocmVzdWx0MSlbMF0sIDAuMCwgc3RkOjpnZXQ8MD4ocmVzdWx0MSlbMV0sIDAuMCkKKyAgICAgIGEuT2Zmc2V0RXJyb3IobnVsbHB0ciwgTm9uY2F1c2FsVGltZXN0YW1wRmlsdGVyOjpQb2ludGVyKCksIHRpbWVzMVswXSwKKyAgICAgICAgICAgICAgICAgICAgMC4wLCB0aW1lczFbMV0sIDAuMCkKICAgICAgICAgICAuc2Vjb25kOwogICBzdGQ6OnR1cGxlPGNocm9ubzo6bmFub3NlY29uZHMsIGRvdWJsZSwgZG91YmxlPiBiX2Vycm9yID0KLSAgICAgIGIuT2Zmc2V0RXJyb3IobnVsbHB0ciwgTm9uY2F1c2FsVGltZXN0YW1wRmlsdGVyOjpQb2ludGVyKCksCi0gICAgICAgICAgICAgICAgICAgIHN0ZDo6Z2V0PDA+KHJlc3VsdDEpWzFdLCAwLjAsIHN0ZDo6Z2V0PDA+KHJlc3VsdDEpWzBdLCAwLjApCisgICAgICBiLk9mZnNldEVycm9yKG51bGxwdHIsIE5vbmNhdXNhbFRpbWVzdGFtcEZpbHRlcjo6UG9pbnRlcigpLCB0aW1lczFbMV0sCisgICAgICAgICAgICAgICAgICAgIDAuMCwgdGltZXMxWzBdLCAwLjApCiAgICAgICAgICAgLnNlY29uZDsKICAgRVhQRUNUX05FQVIoc3RhdGljX2Nhc3Q8ZG91YmxlPigKICAgICAgICAgICAgICAgICAgIChzdGQ6OmdldDwwPihhX2Vycm9yKSAtIHN0ZDo6Z2V0PDA+KGJfZXJyb3IpKS5jb3VudCgpKSArCiAgICAgICAgICAgICAgICAgICAoc3RkOjpnZXQ8MT4oYV9lcnJvcikgLSBzdGQ6OmdldDwxPihiX2Vycm9yKSksCiAgICAgICAgICAgICAgIDAuMCwgMC41KTsKKworICAvLyBDb25maXJtIHRoZSBkZXJpdmF0aXZlcyBmb3IgdGhlIHNvbHV0aW9uIG1ha2Ugc2Vuc2UuCisgIFByb2JsZW06OkRlcml2YXRpdmVzIGRlcml2YXRpdmVzID0gcHJvYmxlbS5Db21wdXRlRGVyaXZhdGl2ZXMoCisgICAgICAwLCBzdGQ6OmdldDwwPihyZXN1bHQyKSwgdHJ1ZSwgdHJ1ZSwgYWJzbDo6U3Bhbjxjb25zdCBzaXplX3Q+KCkpOworCisgIC8vIEhlc3NpYW4gc2hvdWxkIGJlIGZpeGVkIGFuZCBwcmV0dHkgc2ltcGxlLgorICBFaWdlbjo6TWF0cml4PGRvdWJsZSwgMiwgMj4gZXhwZWN0ZWRfaGVzc2lhbjsKKyAgZXhwZWN0ZWRfaGVzc2lhbiA8PCA0LCAtNCwgLTQsIDQ7CisgIEVYUEVDVF9ORUFSKChkZXJpdmF0aXZlcy5oZXNzaWFuIC0gZXhwZWN0ZWRfaGVzc2lhbikubm9ybSgpLCAwLjAsIDFlLTYpCisgICAgICA8PCBkZXJpdmF0aXZlcy5oZXNzaWFuOworCisgIC8vIEl0J3MgdGhlIHNvbHV0aW9uLCBncmFkaWVudCBzaG91bGQgYmUgc21hbGwuCisgIEVYUEVDVF9ORUFSKGRlcml2YXRpdmVzLmdyYWRpZW50Lm5vcm0oKSwgMC4wLCAxZS02KSA8PCBkZXJpdmF0aXZlcy5ncmFkaWVudDsKKworICBFaWdlbjo6TWF0cml4PGRvdWJsZSwgMiwgMT4gZXhwZWN0ZWRfZjsKKyAgZXhwZWN0ZWRfZiA8PCAtMTUwMDI0OC4xMjQ5Mzc0Njg3LCAtMTUwMDI0OC4xMjQ5Mzc0Njg3OworICBFWFBFQ1RfTkVBUigoZGVyaXZhdGl2ZXMuZiAtIGV4cGVjdGVkX2YpLm5vcm0oKSwgMC4wLCAxZS02KSA8PCBkZXJpdmF0aXZlcy5mOworCisgIC8vIEEgLT4gMS9uIGZvciBlYWNoIGVsZW1lbnQuCisgIEVpZ2VuOjpNYXRyaXg8ZG91YmxlLCAxLCAyPiBleHBlY3RlZF9BOworICBleHBlY3RlZF9BIDw8IDAuNSwgMC41OworICBFWFBFQ1RfTkVBUigoZGVyaXZhdGl2ZXMuQSAtIGV4cGVjdGVkX0EpLm5vcm0oKSwgMC4wLCAxZS0xMikgPDwgZGVyaXZhdGl2ZXMuQTsKKworICAvLyBBeCAtIGIgLT4gMCBhdCB0aGUgc29sdXRpb24uCisgIEVYUEVDVF9ORUFSKGRlcml2YXRpdmVzLkF4bWIubm9ybSgpLCAwLjAsIDFlLTQpIDw8IGRlcml2YXRpdmVzLkF4bWI7CisKKyAgLy8gQW5kIGRmIGlzIHdlbGwgZGVmaW5lZC4KKyAgRWlnZW46Ok1hdHJpeDxkb3VibGUsIDIsIDI+IGV4cGVjdGVkX2RmOworICBleHBlY3RlZF9kZiA8PCAoMS4wIC0ga01heFZlbG9jaXR5KCkpLCAtMSwgLTEsICgxIC0ga01heFZlbG9jaXR5KCkpOworICBFWFBFQ1RfTkVBUigoZGVyaXZhdGl2ZXMuZGYgLSBleHBlY3RlZF9kZikubm9ybSgpLCAwLjAsIDFlLTEyKQorICAgICAgPDwgZGVyaXZhdGl2ZXMuZGY7CisKKyAgRWlnZW46Ok1hdHJpeDxkb3VibGUsIDIsIDI+IGV4cGVjdGVkX2RmX3Nsb3BlX2xpbWl0ZWQ7CisgIGV4cGVjdGVkX2RmX3Nsb3BlX2xpbWl0ZWQgPDwgMS4wICsga01heFZlbG9jaXR5KCksIC0xLCAtMSwgMSArIGtNYXhWZWxvY2l0eSgpOworICBFWFBFQ1RfTkVBUigoZGVyaXZhdGl2ZXMuZGZfc2xvcGVfbGltaXRlZCAtIGV4cGVjdGVkX2RmX3Nsb3BlX2xpbWl0ZWQpLm5vcm0oKSwKKyAgICAgICAgICAgICAgMC4wLCAxZS0xMikKKyAgICAgIDw8IGRlcml2YXRpdmVzLmRmX3Nsb3BlX2xpbWl0ZWQ7CiB9CiAKIH0gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nCmRpZmYgLS1naXQgYS9hb3MvbmV0d29yay9yYXdydGMuY2MgYi9hb3MvbmV0d29yay9yYXdydGMuY2MKaW5kZXggYzE5NWE0Yi4uZGI0ZGUwNyAxMDA2NDQKLS0tIGEvYW9zL25ldHdvcmsvcmF3cnRjLmNjCisrKyBiL2Fvcy9uZXR3b3JrL3Jhd3J0Yy5jYwpAQCAtMyw3ICszLDcgQEAKIGV4dGVybiAiQyIgewogI2luY2x1ZGUgPHJhd3J0Yy5oPgogCi0jaW5jbHVkZSAiZXh0ZXJuYWwvY29tX2dpdGh1Yl9yYXdydGNfcmF3cnRjX2NvbW1vbi9pbmNsdWRlL3Jhd3J0Y2MvdXRpbHMuaCIKKyNpbmNsdWRlICJyYXdydGNjL3V0aWxzLmgiCiB9CiAKICNpbmNsdWRlIDxmdW5jdGlvbmFsPgpkaWZmIC0tZ2l0IGEvYW9zL25ldHdvcmsvcmF3cnRjLmggYi9hb3MvbmV0d29yay9yYXdydGMuaAppbmRleCBmOWRlOGIwLi5mNDNjYzVlIDEwMDY0NAotLS0gYS9hb3MvbmV0d29yay9yYXdydGMuaAorKysgYi9hb3MvbmV0d29yay9yYXdydGMuaApAQCAtNyw3ICs3LDcgQEAKIGV4dGVybiAiQyIgewogI2luY2x1ZGUgPHJhd3J0Yy5oPgogCi0jaW5jbHVkZSAiZXh0ZXJuYWwvY29tX2dpdGh1Yl9yYXdydGNfcmF3cnRjX2NvbW1vbi9pbmNsdWRlL3Jhd3J0Y2MvdXRpbHMuaCIKKyNpbmNsdWRlICJyYXdydGNjL3V0aWxzLmgiCiB9CiAKICNpbmNsdWRlICJmbGF0YnVmZmVycy9mbGF0YnVmZmVycy5oIgpkaWZmIC0tZ2l0IGEvYW9zL25ldHdvcmsvdGltZXN0YW1wX2ZpbHRlci5jYyBiL2Fvcy9uZXR3b3JrL3RpbWVzdGFtcF9maWx0ZXIuY2MKaW5kZXggZWU2ZmYyNy4uNDY2NGY2ZiAxMDA2NDQKLS0tIGEvYW9zL25ldHdvcmsvdGltZXN0YW1wX2ZpbHRlci5jYworKysgYi9hb3MvbmV0d29yay90aW1lc3RhbXBfZmlsdGVyLmNjCkBAIC0xMTI1LDExICsxMTI1LDEyIEBACiBib29sIE5vbmNhdXNhbFRpbWVzdGFtcEZpbHRlcjo6U2luZ2xlRmlsdGVyOjpWYWxpZGF0ZVNvbHV0aW9uKAogICAgIGNvbnN0IFNpbmdsZUZpbHRlciAqb3RoZXIsIFBvaW50ZXIgcG9pbnRlciwKICAgICBhb3M6Om1vbm90b25pY19jbG9jazo6dGltZV9wb2ludCB0YV9iYXNlLCBkb3VibGUgdGEsCi0gICAgYW9zOjptb25vdG9uaWNfY2xvY2s6OnRpbWVfcG9pbnQgdGJfYmFzZSwgZG91YmxlIHRiLCBib29sIHF1aWV0KSBjb25zdCB7CisgICAgYW9zOjptb25vdG9uaWNfY2xvY2s6OnRpbWVfcG9pbnQgdGJfYmFzZSwgZG91YmxlIHRiLCBib29sIHZhbGlkYXRlX3BvcHBlZCwKKyAgICBib29sIHF1aWV0KSBjb25zdCB7CiAgIE5vcm1hbGl6ZVRpbWVzdGFtcHMoJnRhX2Jhc2UsICZ0YSk7CiAgIE5vcm1hbGl6ZVRpbWVzdGFtcHMoJnRiX2Jhc2UsICZ0Yik7CiAgIENIRUNLX0dUKHRpbWVzdGFtcHNfc2l6ZSgpLCAwdSk7Ci0gIGlmICh0YV9iYXNlIDwgc3RkOjpnZXQ8MD4odGltZXN0YW1wKDApKSAmJiBoYXNfcG9wcGVkXykgeworICBpZiAodGFfYmFzZSA8IHN0ZDo6Z2V0PDA+KHRpbWVzdGFtcCgwKSkgJiYgaGFzX3BvcHBlZF8gJiYgdmFsaWRhdGVfcG9wcGVkKSB7CiAgICAgaWYgKCFxdWlldCB8fCBWTE9HX0lTX09OKDEpKSB7CiAgICAgICBMT0coRVJST1IpIDw8IG5vZGVfbmFtZXNfIDw8ICIgTygiIDw8IHRhX2Jhc2UgPDwgIiwgIiA8PCB0YQogICAgICAgICAgICAgICAgICA8PCAiKSBpcyBiZWZvcmUgdGhlIHN0YXJ0IGFuZCB3ZSBoYXZlIGZvcmdvdHRlbiB0aGUgYW5zd2VyLiI7CkBAIC0xMTk5LDkgKzEyMDAsOSBAQAogYm9vbCBOb25jYXVzYWxUaW1lc3RhbXBGaWx0ZXI6OlNpbmdsZUZpbHRlcjo6VmFsaWRhdGVTb2x1dGlvbigKICAgICBjb25zdCBTaW5nbGVGaWx0ZXIgKm90aGVyLCBQb2ludGVyIHBvaW50ZXIsCiAgICAgYW9zOjptb25vdG9uaWNfY2xvY2s6OnRpbWVfcG9pbnQgdGEsIGFvczo6bW9ub3RvbmljX2Nsb2NrOjp0aW1lX3BvaW50IHRiLAotICAgIGJvb2wgcXVpZXQpIGNvbnN0IHsKKyAgICBib29sIHZhbGlkYXRlX3BvcHBlZCwgYm9vbCBxdWlldCkgY29uc3QgewogICBDSEVDS19HVCh0aW1lc3RhbXBzX3NpemUoKSwgMHUpOwotICBpZiAodGEgPCBzdGQ6OmdldDwwPih0aW1lc3RhbXAoMCkpICYmIGhhc19wb3BwZWRfKSB7CisgIGlmICh0YSA8IHN0ZDo6Z2V0PDA+KHRpbWVzdGFtcCgwKSkgJiYgaGFzX3BvcHBlZF8gJiYgdmFsaWRhdGVfcG9wcGVkKSB7CiAgICAgaWYgKCFxdWlldCB8fCBWTE9HX0lTX09OKDEpKSB7CiAgICAgICBMT0coRVJST1IpIDw8IG5vZGVfbmFtZXNfIDw8ICIgTygiIDw8IHRhCiAgICAgICAgICAgICAgICAgIDw8ICIpIGlzIGJlZm9yZSB0aGUgc3RhcnQgYW5kIHdlIGhhdmUgZm9yZ290dGVuIHRoZSBhbnN3ZXIuIjsKQEAgLTE3MjQsNiArMTcyNSw3IEBACiB2b2lkIE5vbmNhdXNhbFRpbWVzdGFtcEZpbHRlcjo6U2luZ2xlRmlsdGVyOjpQb3BGcm9udCgpIHsKICAgLy8gSWYgd2UgZHJvcCBkYXRhLCB3ZSBzaG91bGRuJ3QgYWRkIGFueXRoaW5nIGJlZm9yZSB0aGF0IHBvaW50LgogICBmcm96ZW5fdGltZV8gPSBzdGQ6Om1heChmcm96ZW5fdGltZV8sIHN0ZDo6Z2V0PDA+KHRpbWVzdGFtcCgwKSkpOworICBWTE9HKDEpIDw8ICJQb3BwZWQgIiA8PCBzdGQ6OmdldDwwPih0aW1lc3RhbXBzX1swXSk7CiAgIHRpbWVzdGFtcHNfLnBvcF9mcm9udCgpOwogICBoYXNfcG9wcGVkXyA9IHRydWU7CiAgIGlmIChuZXh0X3RvX2NvbnN1bWVfID4gMHUpIHsKZGlmZiAtLWdpdCBhL2Fvcy9uZXR3b3JrL3RpbWVzdGFtcF9maWx0ZXIuaCBiL2Fvcy9uZXR3b3JrL3RpbWVzdGFtcF9maWx0ZXIuaAppbmRleCAxMGJkMTFmLi4zZTJkYjAxIDEwMDY0NAotLS0gYS9hb3MvbmV0d29yay90aW1lc3RhbXBfZmlsdGVyLmgKKysrIGIvYW9zL25ldHdvcmsvdGltZXN0YW1wX2ZpbHRlci5oCkBAIC0zNTksMjUgKzM1OSwyNiBAQAogCiAgIC8vIENvbmZpcm1zIHRoYXQgdGhlIHNvbHV0aW9uIG1lZXRzIHRoZSBjb25zdHJhaW50cy4gIFJldHVybnMgdHJ1ZSBvbiBzdWNjZXNzLgogICBib29sIFZhbGlkYXRlU29sdXRpb24oY29uc3QgTm9uY2F1c2FsVGltZXN0YW1wRmlsdGVyICpvdGhlciwgUG9pbnRlciBwb2ludGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyOjpCb290VGltZXN0YW1wIHRhLAotICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyOjpCb290VGltZXN0YW1wIHRiLCBib29sIHF1aWV0KSBjb25zdCB7CisgICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXI6OkJvb3RUaW1lc3RhbXAgdGEsIGxvZ2dlcjo6Qm9vdFRpbWVzdGFtcCB0YiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgdmFsaWRhdGVfcG9wcGVkLCBib29sIHF1aWV0KSBjb25zdCB7CiAgICAgY29uc3QgU2luZ2xlRmlsdGVyICpvdGhlcl9maWx0ZXIgPQogICAgICAgICBvdGhlciA9PSBudWxscHRyID8gbnVsbHB0cgogICAgICAgICAgICAgICAgICAgICAgICAgIDogb3RoZXItPm1heWJlX3NpbmdsZV9maWx0ZXIodGIuYm9vdCwgdGEuYm9vdCk7CiAgICAgcmV0dXJuIGZpbHRlcihwb2ludGVyLCB0YS5ib290LCB0Yi5ib290KQotICAgICAgICAtPmZpbHRlci5WYWxpZGF0ZVNvbHV0aW9uKG90aGVyX2ZpbHRlciwgcG9pbnRlciwgdGEudGltZSwgdGIudGltZSwgcXVpZXQpOworICAgICAgICAtPmZpbHRlci5WYWxpZGF0ZVNvbHV0aW9uKG90aGVyX2ZpbHRlciwgcG9pbnRlciwgdGEudGltZSwgdGIudGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZGF0ZV9wb3BwZWQsIHF1aWV0KTsKICAgfQogICBib29sIFZhbGlkYXRlU29sdXRpb24oY29uc3QgTm9uY2F1c2FsVGltZXN0YW1wRmlsdGVyICpvdGhlciwgUG9pbnRlciBwb2ludGVyLAogICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyOjpCb290VGltZXN0YW1wIHRhX2Jhc2UsIGRvdWJsZSB0YSwKICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlcjo6Qm9vdFRpbWVzdGFtcCB0Yl9iYXNlLCBkb3VibGUgdGIsCi0gICAgICAgICAgICAgICAgICAgICAgICBib29sIHF1aWV0KSBjb25zdCB7CisgICAgICAgICAgICAgICAgICAgICAgICBib29sIHZhbGlkYXRlX3BvcHBlZCwgYm9vbCBxdWlldCkgY29uc3QgewogICAgIGNvbnN0IFNpbmdsZUZpbHRlciAqb3RoZXJfZmlsdGVyID0KICAgICAgICAgb3RoZXIgPT0gbnVsbHB0cgogICAgICAgICAgICAgPyBudWxscHRyCiAgICAgICAgICAgICA6IG90aGVyLT5tYXliZV9zaW5nbGVfZmlsdGVyKHRiX2Jhc2UuYm9vdCwgdGFfYmFzZS5ib290KTsKICAgICByZXR1cm4gZmlsdGVyKHBvaW50ZXIsIHRhX2Jhc2UuYm9vdCwgdGJfYmFzZS5ib290KQogICAgICAgICAtPmZpbHRlci5WYWxpZGF0ZVNvbHV0aW9uKG90aGVyX2ZpbHRlciwgcG9pbnRlciwgdGFfYmFzZS50aW1lLCB0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0Yl9iYXNlLnRpbWUsIHRiLCBxdWlldCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGJfYmFzZS50aW1lLCB0YiwgdmFsaWRhdGVfcG9wcGVkLCBxdWlldCk7CiAgIH0KIAogICAvLyBBZGRzIGEgbmV3IHNhbXBsZSB0byBvdXIgZmlsdGVyZWQgdGltZXN0YW1wIGxpc3QuCkBAIC03MjMsMTEgKzcyNCwxMiBAQAogICAgIC8vIHN1Y2Nlc3MuCiAgICAgYm9vbCBWYWxpZGF0ZVNvbHV0aW9uKGNvbnN0IFNpbmdsZUZpbHRlciAqb3RoZXIsIFBvaW50ZXIgcG9pbnRlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgYW9zOjptb25vdG9uaWNfY2xvY2s6OnRpbWVfcG9pbnQgdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGFvczo6bW9ub3RvbmljX2Nsb2NrOjp0aW1lX3BvaW50IHRiLCBib29sIHF1aWV0KSBjb25zdDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYW9zOjptb25vdG9uaWNfY2xvY2s6OnRpbWVfcG9pbnQgdGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgdmFsaWRhdGVfcG9wcGVkLCBib29sIHF1aWV0KSBjb25zdDsKICAgICBib29sIFZhbGlkYXRlU29sdXRpb24oY29uc3QgU2luZ2xlRmlsdGVyICpvdGhlciwgUG9pbnRlciBwb2ludGVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICBhb3M6Om1vbm90b25pY19jbG9jazo6dGltZV9wb2ludCB0YV9iYXNlLCBkb3VibGUgdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGFvczo6bW9ub3RvbmljX2Nsb2NrOjp0aW1lX3BvaW50IHRiX2Jhc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSB0YiwgYm9vbCBxdWlldCkgY29uc3Q7CisgICAgICAgICAgICAgICAgICAgICAgICAgIGFvczo6bW9ub3RvbmljX2Nsb2NrOjp0aW1lX3BvaW50IHRiX2Jhc2UsIGRvdWJsZSB0YiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCB2YWxpZGF0ZV9wb3BwZWQsIGJvb2wgcXVpZXQpIGNvbnN0OwogCiAgICAgdm9pZCBTYW1wbGUobW9ub3RvbmljX2Nsb2NrOjp0aW1lX3BvaW50IG1vbm90b25pY19ub3csCiAgICAgICAgICAgICAgICAgc3RkOjpjaHJvbm86Om5hbm9zZWNvbmRzIHNhbXBsZV9ucyk7CmRpZmYgLS1naXQgYS9hb3MvbmV0d29yay90aW1lc3RhbXBfZmlsdGVyX3Rlc3QuY2MgYi9hb3MvbmV0d29yay90aW1lc3RhbXBfZmlsdGVyX3Rlc3QuY2MKaW5kZXggMWEwZWRjOS4uZTMzZmRkMSAxMDA2NDQKLS0tIGEvYW9zL25ldHdvcmsvdGltZXN0YW1wX2ZpbHRlcl90ZXN0LmNjCisrKyBiL2Fvcy9uZXR3b3JrL3RpbWVzdGFtcF9maWx0ZXJfdGVzdC5jYwpAQCAtMTMyMiwxNyArMTMyMiwyMiBAQAogCiAgIC8vIENvbmZpcm0gdGhlIHByb2JsZW0gc3RhdGVtZW50IGlzIHJlYXNvbmFibGUuLi4gIFdlJ3ZlIGhhZCBlbm91Z2ggdHJvdWJsZQogICAvLyBoZXJlIGluIHRoZSBwYXN0LgotICBFWFBFQ1RfVFJVRShmaWx0ZXJfYS5WYWxpZGF0ZVNvbHV0aW9uKAotICAgICAgJmZpbHRlcl9iLCBQb2ludGVyKCksIHQxX2EsIHQxX2EgKyBvMV9hICsgY2hyb25vOjpuYW5vc2Vjb25kcygxKSwgZmFsc2UpKTsKLSAgRVhQRUNUX1RSVUUoZmlsdGVyX2EuVmFsaWRhdGVTb2x1dGlvbigKLSAgICAgICZmaWx0ZXJfYiwgUG9pbnRlcigpLCB0Ml9hLCB0Ml9hICsgbzJfYSArIGNocm9ubzo6bmFub3NlY29uZHMoMSksIGZhbHNlKSk7CisgIEVYUEVDVF9UUlVFKGZpbHRlcl9hLlZhbGlkYXRlU29sdXRpb24oJmZpbHRlcl9iLCBQb2ludGVyKCksIHQxX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdDFfYSArIG8xX2EgKyBjaHJvbm86Om5hbm9zZWNvbmRzKDEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUsIGZhbHNlKSk7CisgIEVYUEVDVF9UUlVFKGZpbHRlcl9hLlZhbGlkYXRlU29sdXRpb24oJmZpbHRlcl9iLCBQb2ludGVyKCksIHQyX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdDJfYSArIG8yX2EgKyBjaHJvbm86Om5hbm9zZWNvbmRzKDEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUsIGZhbHNlKSk7CiAKLSAgRVhQRUNUX1RSVUUoZmlsdGVyX2IuVmFsaWRhdGVTb2x1dGlvbigKLSAgICAgICZmaWx0ZXJfYSwgUG9pbnRlcigpLCB0MV9iLCB0MV9iICsgbzFfYiArIGNocm9ubzo6bmFub3NlY29uZHMoMSksIGZhbHNlKSk7Ci0gIEVYUEVDVF9UUlVFKGZpbHRlcl9iLlZhbGlkYXRlU29sdXRpb24oCi0gICAgICAmZmlsdGVyX2EsIFBvaW50ZXIoKSwgdDJfYiwgdDJfYiArIG8yX2IgKyBjaHJvbm86Om5hbm9zZWNvbmRzKDEpLCBmYWxzZSkpOwotICBFWFBFQ1RfVFJVRShmaWx0ZXJfYi5WYWxpZGF0ZVNvbHV0aW9uKAotICAgICAgJmZpbHRlcl9hLCBQb2ludGVyKCksIHQzX2IsIHQzX2IgKyBvM19iICsgY2hyb25vOjpuYW5vc2Vjb25kcygxKSwgZmFsc2UpKTsKKyAgRVhQRUNUX1RSVUUoZmlsdGVyX2IuVmFsaWRhdGVTb2x1dGlvbigmZmlsdGVyX2EsIFBvaW50ZXIoKSwgdDFfYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0MV9iICsgbzFfYiArIGNocm9ubzo6bmFub3NlY29uZHMoMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSwgZmFsc2UpKTsKKyAgRVhQRUNUX1RSVUUoZmlsdGVyX2IuVmFsaWRhdGVTb2x1dGlvbigmZmlsdGVyX2EsIFBvaW50ZXIoKSwgdDJfYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0Ml9iICsgbzJfYiArIGNocm9ubzo6bmFub3NlY29uZHMoMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSwgZmFsc2UpKTsKKyAgRVhQRUNUX1RSVUUoZmlsdGVyX2IuVmFsaWRhdGVTb2x1dGlvbigmZmlsdGVyX2EsIFBvaW50ZXIoKSwgdDNfYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0M19iICsgbzNfYiArIGNocm9ubzo6bmFub3NlY29uZHMoMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSwgZmFsc2UpKTsKIAogICAvLyBCZWZvcmUgdGhlIHN0YXJ0CiAgIHJlc3VsdCA9IGZpbHRlcl9hLkZpbmRUaW1lc3RhbXBzKCZmaWx0ZXJfYiwgdHJ1ZSwgUG9pbnRlcigpLApAQCAtMTQyNSw0NCArMTQzMCw0OSBAQAogCiAgIC8vIEF0IHRoZSBjb250cm9sIHBvaW50cywgd2Ugc2hvdWxkIHNlZSB0aGF0IHRoZSBib3VuZGFyeSBpcyByaWdodCBhdCB0aGUKICAgLy8gZWRnZS4KLSAgRVhQRUNUX1RSVUUoZmlsdGVyX2EuVmFsaWRhdGVTb2x1dGlvbigKLSAgICAgICZmaWx0ZXJfYiwgUG9pbnRlcigpLCB0MV9hLCB0MV9hICsgbzFfYSArIGNocm9ubzo6bmFub3NlY29uZHMoMSksIGZhbHNlKSk7CisgIEVYUEVDVF9UUlVFKGZpbHRlcl9hLlZhbGlkYXRlU29sdXRpb24oJmZpbHRlcl9iLCBQb2ludGVyKCksIHQxX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdDFfYSArIG8xX2EgKyBjaHJvbm86Om5hbm9zZWNvbmRzKDEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUsIGZhbHNlKSk7CiAgIEVYUEVDVF9UUlVFKGZpbHRlcl9hLlZhbGlkYXRlU29sdXRpb24oJmZpbHRlcl9iLCBQb2ludGVyKCksIHQxX2EsIDAuMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0MV9hICsgbzFfYSwgMC4wMDAwMSwgZmFsc2UpKTsKLSAgRVhQRUNUX0ZBTFNFKGZpbHRlcl9hLlZhbGlkYXRlU29sdXRpb24oCi0gICAgICAmZmlsdGVyX2IsIFBvaW50ZXIoKSwgdDFfYSwgdDFfYSArIG8xX2EgLSBjaHJvbm86Om5hbm9zZWNvbmRzKDEpLCBmYWxzZSkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQxX2EgKyBvMV9hLCAwLjAwMDAxLCB0cnVlLCBmYWxzZSkpOworICBFWFBFQ1RfRkFMU0UoZmlsdGVyX2EuVmFsaWRhdGVTb2x1dGlvbigmZmlsdGVyX2IsIFBvaW50ZXIoKSwgdDFfYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdDFfYSArIG8xX2EgLSBjaHJvbm86Om5hbm9zZWNvbmRzKDEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlLCBmYWxzZSkpOwogICBFWFBFQ1RfRkFMU0UoZmlsdGVyX2EuVmFsaWRhdGVTb2x1dGlvbigmZmlsdGVyX2IsIFBvaW50ZXIoKSwgdDFfYSwgMC4wLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0MV9hICsgbzFfYSwgLTAuMDAwMSwgZmFsc2UpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdDFfYSArIG8xX2EsIC0wLjAwMDEsIHRydWUsIGZhbHNlKSk7CiAKLSAgRVhQRUNUX1RSVUUoZmlsdGVyX2EuVmFsaWRhdGVTb2x1dGlvbigKLSAgICAgICZmaWx0ZXJfYiwgUG9pbnRlcigpLCB0Ml9hLCB0Ml9hICsgbzJfYSArIGNocm9ubzo6bmFub3NlY29uZHMoMSksIGZhbHNlKSk7CisgIEVYUEVDVF9UUlVFKGZpbHRlcl9hLlZhbGlkYXRlU29sdXRpb24oJmZpbHRlcl9iLCBQb2ludGVyKCksIHQyX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdDJfYSArIG8yX2EgKyBjaHJvbm86Om5hbm9zZWNvbmRzKDEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUsIGZhbHNlKSk7CiAgIEVYUEVDVF9UUlVFKGZpbHRlcl9hLlZhbGlkYXRlU29sdXRpb24oJmZpbHRlcl9iLCBQb2ludGVyKCksIHQyX2EsIDAuMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0Ml9hICsgbzJfYSwgMC4wMDAwMSwgZmFsc2UpKTsKLSAgRVhQRUNUX0ZBTFNFKGZpbHRlcl9hLlZhbGlkYXRlU29sdXRpb24oCi0gICAgICAmZmlsdGVyX2IsIFBvaW50ZXIoKSwgdDJfYSwgdDJfYSArIG8yX2EgLSBjaHJvbm86Om5hbm9zZWNvbmRzKDEpLCBmYWxzZSkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQyX2EgKyBvMl9hLCAwLjAwMDAxLCB0cnVlLCBmYWxzZSkpOworICBFWFBFQ1RfRkFMU0UoZmlsdGVyX2EuVmFsaWRhdGVTb2x1dGlvbigmZmlsdGVyX2IsIFBvaW50ZXIoKSwgdDJfYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdDJfYSArIG8yX2EgLSBjaHJvbm86Om5hbm9zZWNvbmRzKDEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlLCBmYWxzZSkpOwogICBFWFBFQ1RfRkFMU0UoZmlsdGVyX2EuVmFsaWRhdGVTb2x1dGlvbigmZmlsdGVyX2IsIFBvaW50ZXIoKSwgdDJfYSwgMC4wLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0Ml9hICsgbzJfYSwgLTAuMDAwMDEsIGZhbHNlKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQyX2EgKyBvMl9hLCAtMC4wMDAwMSwgdHJ1ZSwgZmFsc2UpKTsKIAogICAvLyBOb3cgdGhhdCB3ZSd2ZSBjaGVja2VkIHRoZSBjb250cm9sIHBvaW50cywgY2hlY2sgaW4gdGhlIG1pZGRsZSB0byBjb25maXJtCiAgIC8vIGl0IGxvb2tzIGxpa2Ugd2UgYXJlIHVzaW5nIEJvdW5kT2Zmc2V0IHJhdGhlciB0aGFuIGludGVycG9sYXRlLgogICBFWFBFQ1RfVFJVRShmaWx0ZXJfYS5WYWxpZGF0ZVNvbHV0aW9uKAogICAgICAgJmZpbHRlcl9iLCBQb2ludGVyKCksIHRtaWRfYSwgdG1pZF9hICsgb21pZF9hICsgY2hyb25vOjpuYW5vc2Vjb25kcygxKSwKLSAgICAgIGZhbHNlKSk7CisgICAgICB0cnVlLCBmYWxzZSkpOwogICBFWFBFQ1RfVFJVRShmaWx0ZXJfYS5WYWxpZGF0ZVNvbHV0aW9uKCZmaWx0ZXJfYiwgUG9pbnRlcigpLCB0bWlkX2EsIDAuMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bWlkX2EgKyBvbWlkX2EsIDAuMDAwMDEsIGZhbHNlKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG1pZF9hICsgb21pZF9hLCAwLjAwMDAxLCB0cnVlLCBmYWxzZSkpOwogCiAgIEVYUEVDVF9GQUxTRShmaWx0ZXJfYS5WYWxpZGF0ZVNvbHV0aW9uKAogICAgICAgJmZpbHRlcl9iLCBQb2ludGVyKCksIHRiZWZvcmVfYSwKLSAgICAgIHRiZWZvcmVfYSArIG9iZWZvcmVfYSAtIGNocm9ubzo6bmFub3NlY29uZHMoMSksIGZhbHNlKSk7CisgICAgICB0YmVmb3JlX2EgKyBvYmVmb3JlX2EgLSBjaHJvbm86Om5hbm9zZWNvbmRzKDEpLCB0cnVlLCBmYWxzZSkpOwogICBFWFBFQ1RfRkFMU0UoZmlsdGVyX2EuVmFsaWRhdGVTb2x1dGlvbigmZmlsdGVyX2IsIFBvaW50ZXIoKSwgdGJlZm9yZV9hLCAwLjAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRiZWZvcmVfYSArIG9iZWZvcmVfYSwgLTAuMDAwMDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRiZWZvcmVfYSArIG9iZWZvcmVfYSwgLTAuMDAwMDEsIHRydWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlKSk7CiAKICAgRVhQRUNUX0ZBTFNFKGZpbHRlcl9hLlZhbGlkYXRlU29sdXRpb24oCiAgICAgICAmZmlsdGVyX2IsIFBvaW50ZXIoKSwgdGFmdGVyX2EsCi0gICAgICB0YWZ0ZXJfYSArIG9hZnRlcl9hIC0gY2hyb25vOjpuYW5vc2Vjb25kcygxKSwgZmFsc2UpKTsKKyAgICAgIHRhZnRlcl9hICsgb2FmdGVyX2EgLSBjaHJvbm86Om5hbm9zZWNvbmRzKDEpLCB0cnVlLCBmYWxzZSkpOwogICBFWFBFQ1RfRkFMU0UoZmlsdGVyX2EuVmFsaWRhdGVTb2x1dGlvbigmZmlsdGVyX2IsIFBvaW50ZXIoKSwgdGFmdGVyX2EsIDAuMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFmdGVyX2EgKyBvYWZ0ZXJfYSwgLTAuMDAwMDEsIGZhbHNlKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhZnRlcl9hICsgb2FmdGVyX2EsIC0wLjAwMDAxLCB0cnVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSkpOwogfQogCiAvLyBUZXN0cyB0aGF0IE9mZnNldCByZXR1cm5zIHJlc3VsdHMgaW5kaWNhdGl2ZSBvZiBpdCBjYWxsaW5nIEludGVycG9sYXRlT2Zmc2V0CmRpZmYgLS1naXQgYS9idWlsZF90ZXN0cy9CVUlMRCBiL2J1aWxkX3Rlc3RzL0JVSUxECmluZGV4IGU3ZjIzNmEuLjdjODg5OTIgMTAwNjQ0Ci0tLSBhL2J1aWxkX3Rlc3RzL0JVSUxECisrKyBiL2J1aWxkX3Rlc3RzL0JVSUxECkBAIC0yMjAsMyArMjIwLDE1IEBACiAgICAgcnVzdGNfZmxhZ3MgPSBbIi1DcmVsb2NhdGlvbi1tb2RlbD1zdGF0aWMiXSwKICAgICB0YXJnZXRfY29tcGF0aWJsZV93aXRoID0gWyIvL3Rvb2xzL3BsYXRmb3Jtcy9ydXN0Omhhc19zdXBwb3J0Il0sCiApCisKK3B5X3Rlc3QoCisgICAgbmFtZSA9ICJ1cHN0cmVhbV9weXRob25fdGVzdCIsCisgICAgc3JjcyA9IFsKKyAgICAgICAgInVwc3RyZWFtX3B5dGhvbl90ZXN0LnB5IiwKKyAgICBdLAorICAgIGRlcHMgPSBbCisgICAgICAgICJAcGlwLy9tYXRwbG90bGliIiwKKyAgICAgICAgIkBwaXAvL251bXB5IiwKKyAgICAgICAgIkBwaXAvL3NjaXB5IiwKKyAgICBdLAorKQpkaWZmIC0tZ2l0IGEvYnVpbGRfdGVzdHMvdXBzdHJlYW1fcHl0aG9uX3Rlc3QucHkgYi9idWlsZF90ZXN0cy91cHN0cmVhbV9weXRob25fdGVzdC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYmVmZjExCi0tLSAvZGV2L251bGwKKysrIGIvYnVpbGRfdGVzdHMvdXBzdHJlYW1fcHl0aG9uX3Rlc3QucHkKQEAgLTAsMCArMSwyNiBAQAoraW1wb3J0IHN5cworaW1wb3J0IHVuaXR0ZXN0CisKKworY2xhc3MgVGVzdFBpcEltcG9ydHModW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgZGVmIHRlc3RfdmVyc2lvbihzZWxmKToKKyAgICAgICAgIiIiVmFsaWRhdGVzIHRoYXQgd2UgYXJlIHVzaW5nIHRoZSB2ZXJzaW9uIHNwZWNpZmllZCBpbiBydWxlc19weXRob24uIiIiCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3lzLnZlcnNpb25faW5mb1swOjNdLCAoMywgOSwgMTMpKQorCisgICAgZGVmIHRlc3RfaW1wb3J0cyhzZWxmKToKKyAgICAgICAgIiIiVmFsaWRhdGVzIHRoYXQgd2UgY2FuIGltcG9ydCBwaXAgcGFja2FnZXMgZnJvbSBweXBpLm9yZy4iIiIKKyAgICAgICAgaW1wb3J0IG51bXB5CisgICAgICAgIGltcG9ydCBzY2lweQorICAgICAgICBpbXBvcnQgbWF0cGxvdGxpYgorCisgICAgICAgICMgTWFrZSBzdXJlIHdlJ3JlIHNvdXJjaW5nIG51bXB5IGZyb20gdGhlIGV4cGVjdGVkIHNvdXJjZS4gV2UgY291bGQKKyAgICAgICAgIyBwaWNrIGFueSBvZiB0aGUgdGhyZWUgd2UgaW1wb3J0ZWQgYWJvdmUuCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgKKyAgICAgICAgICAgIG51bXB5Ll9fZmlsZV9fLmVuZHN3aXRoKAorICAgICAgICAgICAgICAgICIvdXBzdHJlYW1fcHl0aG9uX3Rlc3QucnVuZmlsZXMvcGlwX2RlcHNfbnVtcHkvc2l0ZS1wYWNrYWdlcy9udW1weS9fX2luaXRfXy5weSIKKyAgICAgICAgICAgICksIG51bXB5Ll9fZmlsZV9fKQorCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgdW5pdHRlc3QubWFpbigpCmRpZmYgLS1naXQgYS9kZWJpYW4vbWF0cGxvdGxpYi5iemwgYi9kZWJpYW4vbWF0cGxvdGxpYi5iemwKaW5kZXggMzU3MjYzOS4uNGU5ZmViOCAxMDA2NDQKLS0tIGEvZGViaWFuL21hdHBsb3RsaWIuYnpsCisrKyBiL2RlYmlhbi9tYXRwbG90bGliLmJ6bApAQCAtMTk4LDcgKzE5OCwxMCBAQAogICAgICAgICAgICAgIi4iLAogICAgICAgICAgICAgInVzci9saWIvcHl0aG9uIiArIHRraW50ZXJfcHlfdmVyc2lvbiwKICAgICAgICAgXSwKLSAgICAgICAgdGFyZ2V0X2NvbXBhdGlibGVfd2l0aCA9IFsiQHBsYXRmb3Jtcy8vY3B1Ong4Nl82NCJdLAorICAgICAgICB0YXJnZXRfY29tcGF0aWJsZV93aXRoID0gWworICAgICAgICAgICAgIkBwbGF0Zm9ybXMvL2NwdTp4ODZfNjQiLAorICAgICAgICAgICAgIkAvL3Rvb2xzL3BsYXRmb3Jtcy9weXRob246ZGViaWFuX2J1bmRsZWRfcHl0aG9uIiwKKyAgICAgICAgXSwKICAgICAgICAgdmlzaWJpbGl0eSA9IFsiLy92aXNpYmlsaXR5OnB1YmxpYyJdLAogICAgICAgICBkZXBzID0gWwogICAgICAgICAgICAgIkBweXRob25fcmVwby8vOm51bXB5IiwKZGlmZiAtLWdpdCBhL2RlYmlhbi9vcGVuY3ZfcHl0aG9uLkJVSUxEIGIvZGViaWFuL29wZW5jdl9weXRob24uQlVJTEQKaW5kZXggMjgxNTY0Yi4uOGQyZWYyYSAxMDA2NDQKLS0tIGEvZGViaWFuL29wZW5jdl9weXRob24uQlVJTEQKKysrIGIvZGViaWFuL29wZW5jdl9weXRob24uQlVJTEQKQEAgLTYsNiArNiw5IEBACiAgICAgICAgIGV4Y2x1ZGUgPSBbIioqLyoucHkiXSwKICAgICApLAogICAgIGltcG9ydHMgPSBbIi4iXSwKKyAgICB0YXJnZXRfY29tcGF0aWJsZV93aXRoID0gWworICAgICAgICAiQC8vdG9vbHMvcGxhdGZvcm1zL3B5dGhvbjpkZWJpYW5fYnVuZGxlZF9weXRob24iLAorICAgIF0sCiAgICAgdmlzaWJpbGl0eSA9IFsiLy92aXNpYmlsaXR5OnB1YmxpYyJdLAogICAgIGRlcHMgPSBbCiAgICAgICAgICJAcHl0aG9uX3JlcG8vLzpudW1weSIsCmRpZmYgLS1naXQgYS9kZWJpYW4vb3NxcF9weXRob24uQlVJTEQgYi9kZWJpYW4vb3NxcF9weXRob24uQlVJTEQKaW5kZXggOWQzMjYwZS4uYjc5MGE3NSAxMDA2NDQKLS0tIGEvZGViaWFuL29zcXBfcHl0aG9uLkJVSUxECisrKyBiL2RlYmlhbi9vc3FwX3B5dGhvbi5CVUlMRApAQCAtNiw2ICs2LDkgQEAKICAgICAgICAgZXhjbHVkZSA9IFsiKiovKi5weSJdLAogICAgICksCiAgICAgaW1wb3J0cyA9IFsiLiJdLAorICAgIHRhcmdldF9jb21wYXRpYmxlX3dpdGggPSBbCisgICAgICAgICJALy90b29scy9wbGF0Zm9ybXMvcHl0aG9uOmRlYmlhbl9idW5kbGVkX3B5dGhvbiIsCisgICAgXSwKICAgICB2aXNpYmlsaXR5ID0gWyIvL3Zpc2liaWxpdHk6cHVibGljIl0sCiAgICAgZGVwcyA9IFsKICAgICAgICAgIkBweXRob25fcmVwby8vOm51bXB5IiwKZGlmZiAtLWdpdCBhL2RlYmlhbi9weXRob24uQlVJTEQgYi9kZWJpYW4vcHl0aG9uLkJVSUxECmluZGV4IDFhODc2ZjEuLjgwM2U0YmQgMTAwNjQ0Ci0tLSBhL2RlYmlhbi9weXRob24uQlVJTEQKKysrIGIvZGViaWFuL3B5dGhvbi5CVUlMRApAQCAtNzUsNiArNzUsNyBAQAogICAgIHRhcmdldF9jb21wYXRpYmxlX3dpdGggPSBbCiAgICAgICAgICJAcGxhdGZvcm1zLy9vczpsaW51eCIsCiAgICAgICAgICJAcGxhdGZvcm1zLy9jcHU6eDg2XzY0IiwKKyAgICAgICAgIkAvL3Rvb2xzL3BsYXRmb3Jtcy9weXRob246ZGViaWFuX2J1bmRsZWRfcHl0aG9uIiwKICAgICBdLAogICAgIHZpc2liaWxpdHkgPSBbIi8vdmlzaWJpbGl0eTpwdWJsaWMiXSwKICAgICBkZXBzID0gWwpAQCAtMTAxLDYgKzEwMiw3IEBACiAgICAgdGFyZ2V0X2NvbXBhdGlibGVfd2l0aCA9IFsKICAgICAgICAgIkBwbGF0Zm9ybXMvL29zOmxpbnV4IiwKICAgICAgICAgIkBwbGF0Zm9ybXMvL2NwdTp4ODZfNjQiLAorICAgICAgICAiQC8vdG9vbHMvcGxhdGZvcm1zL3B5dGhvbjpkZWJpYW5fYnVuZGxlZF9weXRob24iLAogICAgIF0sCiAgICAgdmlzaWJpbGl0eSA9IFsiLy92aXNpYmlsaXR5OnB1YmxpYyJdLAogKQpkaWZmIC0tZ2l0IGEvZGViaWFuL3B5dGhvbl9ndGsuQlVJTEQgYi9kZWJpYW4vcHl0aG9uX2d0ay5CVUlMRAppbmRleCA3ZmRiM2I5Li4yMjZkMTdhIDEwMDY0NAotLS0gYS9kZWJpYW4vcHl0aG9uX2d0ay5CVUlMRAorKysgYi9kZWJpYW4vcHl0aG9uX2d0ay5CVUlMRApAQCAtMTYzLDYgKzE2Myw5IEBACiAgICAgICAgICJ1c3IvbGliL3g4Nl82NC1saW51eC1nbnUvZ2RrLXBpeGJ1Zi0yLjAvZ2RrLXBpeGJ1Zi1xdWVyeS1sb2FkZXJzIiwKICAgICBdLAogICAgIGltcG9ydHMgPSBbInVzci9saWIvcHl0aG9uMy9kaXN0LXBhY2thZ2VzIl0sCi0gICAgdGFyZ2V0X2NvbXBhdGlibGVfd2l0aCA9IFsiQHBsYXRmb3Jtcy8vY3B1Ong4Nl82NCJdLAorICAgIHRhcmdldF9jb21wYXRpYmxlX3dpdGggPSBbCisgICAgICAgICJAcGxhdGZvcm1zLy9jcHU6eDg2XzY0IiwKKyAgICAgICAgIkAvL3Rvb2xzL3BsYXRmb3Jtcy9weXRob246ZGViaWFuX2J1bmRsZWRfcHl0aG9uIiwKKyAgICBdLAogICAgIHZpc2liaWxpdHkgPSBbIi8vdmlzaWJpbGl0eTpwdWJsaWMiXSwKICkKZGlmZiAtLWdpdCBhL2RlYmlhbi9weXRob25famluamEyLkJVSUxEIGIvZGViaWFuL3B5dGhvbl9qaW5qYTIuQlVJTEQKaW5kZXggMWFkYWI2YS4uNWU1NjRjOSAxMDA2NDQKLS0tIGEvZGViaWFuL3B5dGhvbl9qaW5qYTIuQlVJTEQKKysrIGIvZGViaWFuL3B5dGhvbl9qaW5qYTIuQlVJTEQKQEAgLTIsNiArMiw5IEBACiAgICAgbmFtZSA9ICJweXRob25famluamEyIiwKICAgICBzcmNzID0gZ2xvYihbInNyYy9qaW5qYTIvKi5weSJdKSwKICAgICBpbXBvcnRzID0gWyJzcmMvIl0sCisgICAgdGFyZ2V0X2NvbXBhdGlibGVfd2l0aCA9IFsKKyAgICAgICAgIkAvL3Rvb2xzL3BsYXRmb3Jtcy9weXRob246ZGViaWFuX2J1bmRsZWRfcHl0aG9uIiwKKyAgICBdLAogICAgIHZpc2liaWxpdHkgPSBbIi8vdmlzaWJpbGl0eTpwdWJsaWMiXSwKICAgICBkZXBzID0gWyJAcHl0aG9uX21hcmt1cHNhZmUiXSwKICkKZGlmZiAtLWdpdCBhL2RlYmlhbi9weXRob25fbWFya3Vwc2FmZS5CVUlMRCBiL2RlYmlhbi9weXRob25fbWFya3Vwc2FmZS5CVUlMRAppbmRleCA4N2YxMGVhLi5hZjZjZjU2IDEwMDY0NAotLS0gYS9kZWJpYW4vcHl0aG9uX21hcmt1cHNhZmUuQlVJTEQKKysrIGIvZGViaWFuL3B5dGhvbl9tYXJrdXBzYWZlLkJVSUxECkBAIC0yLDUgKzIsOCBAQAogICAgIG5hbWUgPSAicHl0aG9uX21hcmt1cHNhZmUiLAogICAgIHNyY3MgPSBnbG9iKFsic3JjL21hcmt1cHNhZmUvKi5weSJdKSwKICAgICBpbXBvcnRzID0gWyJzcmMvIl0sCisgICAgdGFyZ2V0X2NvbXBhdGlibGVfd2l0aCA9IFsKKyAgICAgICAgIkAvL3Rvb2xzL3BsYXRmb3Jtcy9weXRob246ZGViaWFuX2J1bmRsZWRfcHl0aG9uIiwKKyAgICBdLAogICAgIHZpc2liaWxpdHkgPSBbIi8vdmlzaWJpbGl0eTpwdWJsaWMiXSwKICkKZGlmZiAtLWdpdCBhL2RlYmlhbi9weXRob25feWFwZi5CVUlMRCBiL2RlYmlhbi9weXRob25feWFwZi5CVUlMRAppbmRleCBjNDE1NThjLi5hZDA2NTc2IDEwMDY0NAotLS0gYS9kZWJpYW4vcHl0aG9uX3lhcGYuQlVJTEQKKysrIGIvZGViaWFuL3B5dGhvbl95YXBmLkJVSUxECkBAIC0yLDUgKzIsOCBAQAogICAgIG5hbWUgPSAicHl0aG9uX3lhcGYiLAogICAgIHNyY3MgPSBnbG9iKFsieWFwZi8qKi8qLnB5Il0pLAogICAgIG1haW4gPSAieWFwZi9fX21haW5fXy5weSIsCisgICAgdGFyZ2V0X2NvbXBhdGlibGVfd2l0aCA9IFsKKyAgICAgICAgIkAvL3Rvb2xzL3BsYXRmb3Jtcy9weXRob246ZGViaWFuX2J1bmRsZWRfcHl0aG9uIiwKKyAgICBdLAogICAgIHZpc2liaWxpdHkgPSBbIi8vdmlzaWJpbGl0eTpwdWJsaWMiXSwKICkKZGlmZiAtLWdpdCBhL2RlYmlhbi9xZGxkbF9weXRob24uQlVJTEQgYi9kZWJpYW4vcWRsZGxfcHl0aG9uLkJVSUxECmluZGV4IDc2ZDY0N2UuLmQyNzAwMjkgMTAwNjQ0Ci0tLSBhL2RlYmlhbi9xZGxkbF9weXRob24uQlVJTEQKKysrIGIvZGViaWFuL3FkbGRsX3B5dGhvbi5CVUlMRApAQCAtNiw2ICs2LDkgQEAKICAgICAgICAgZXhjbHVkZSA9IFsiKiovKi5weSJdLAogICAgICksCiAgICAgaW1wb3J0cyA9IFsiLiJdLAorICAgIHRhcmdldF9jb21wYXRpYmxlX3dpdGggPSBbCisgICAgICAgICJALy90b29scy9wbGF0Zm9ybXMvcHl0aG9uOmRlYmlhbl9idW5kbGVkX3B5dGhvbiIsCisgICAgXSwKICAgICB2aXNpYmlsaXR5ID0gWyIvL3Zpc2liaWxpdHk6cHVibGljIl0sCiAgICAgZGVwcyA9IFsKICAgICAgICAgIkBweXRob25fcmVwby8vOm51bXB5IiwKZGlmZiAtLWdpdCBhL2RlYmlhbi9zaXguQlVJTEQgYi9kZWJpYW4vc2l4LkJVSUxECmluZGV4IDNkOGZmZDQuLjkyMWJmZmIgMTAwNjQ0Ci0tLSBhL2RlYmlhbi9zaXguQlVJTEQKKysrIGIvZGViaWFuL3NpeC5CVUlMRApAQCAtMyw1ICszLDggQEAKICAgICBzcmNzID0gWwogICAgICAgICAic2l4LnB5IiwKICAgICBdLAorICAgIHRhcmdldF9jb21wYXRpYmxlX3dpdGggPSBbCisgICAgICAgICJALy90b29scy9wbGF0Zm9ybXMvcHl0aG9uOmRlYmlhbl9idW5kbGVkX3B5dGhvbiIsCisgICAgXSwKICAgICB2aXNpYmlsaXR5ID0gWyIvL3Zpc2liaWxpdHk6cHVibGljIl0sCiApCmRpZmYgLS1naXQgYS9mcmM5NzEvYW5hbHlzaXMvQlVJTEQgYi9mcmM5NzEvYW5hbHlzaXMvQlVJTEQKaW5kZXggYWJiOTUwYi4uOTkwNDEzMiAxMDA2NDQKLS0tIGEvZnJjOTcxL2FuYWx5c2lzL0JVSUxECisrKyBiL2ZyYzk3MS9hbmFseXNpcy9CVUlMRApAQCAtMSw2ICsxLDcgQEAKIGxvYWQoIkBucG0vL0BiYXplbC90eXBlc2NyaXB0OmluZGV4LmJ6bCIsICJ0c19saWJyYXJ5IikKIGxvYWQoIi8vdG9vbHMvYnVpbGRfcnVsZXM6anMuYnpsIiwgInJvbGx1cF9idW5kbGUiKQotbG9hZCgiQGNvbV9naXRodWJfZ29vZ2xlX2ZsYXRidWZmZXJzLy86YnVpbGRfZGVmcy5iemwiLCAiZmxhdGJ1ZmZlcl9jY19saWJyYXJ5IiwgImZsYXRidWZmZXJfdHNfbGlicmFyeSIpCitsb2FkKCJAY29tX2dpdGh1Yl9nb29nbGVfZmxhdGJ1ZmZlcnMvLzpidWlsZF9kZWZzLmJ6bCIsICJmbGF0YnVmZmVyX2NjX2xpYnJhcnkiKQorbG9hZCgiQGNvbV9naXRodWJfZ29vZ2xlX2ZsYXRidWZmZXJzLy86dHlwZXNjcmlwdC5iemwiLCAiZmxhdGJ1ZmZlcl90c19saWJyYXJ5IikKIGxvYWQoIi8vYW9zOmNvbmZpZy5iemwiLCAiYW9zX2NvbmZpZyIpCiAKIHBhY2thZ2UoZGVmYXVsdF92aXNpYmlsaXR5ID0gWyIvL3Zpc2liaWxpdHk6cHVibGljIl0pCmRpZmYgLS1naXQgYS9mcmM5NzEvY29udHJvbF9sb29wcy9CVUlMRCBiL2ZyYzk3MS9jb250cm9sX2xvb3BzL0JVSUxECmluZGV4IDQ0OTFiYmEuLjQ1OTkyOWIgMTAwNjQ0Ci0tLSBhL2ZyYzk3MS9jb250cm9sX2xvb3BzL0JVSUxECisrKyBiL2ZyYzk3MS9jb250cm9sX2xvb3BzL0JVSUxECkBAIC0xLDUgKzEsNiBAQAogbG9hZCgiLy9hb3M6Y29uZmlnLmJ6bCIsICJhb3NfY29uZmlnIikKLWxvYWQoIkBjb21fZ2l0aHViX2dvb2dsZV9mbGF0YnVmZmVycy8vOmJ1aWxkX2RlZnMuYnpsIiwgImZsYXRidWZmZXJfY2NfbGlicmFyeSIsICJmbGF0YnVmZmVyX3RzX2xpYnJhcnkiKQorbG9hZCgiQGNvbV9naXRodWJfZ29vZ2xlX2ZsYXRidWZmZXJzLy86YnVpbGRfZGVmcy5iemwiLCAiZmxhdGJ1ZmZlcl9jY19saWJyYXJ5IikKK2xvYWQoIkBjb21fZ2l0aHViX2dvb2dsZV9mbGF0YnVmZmVycy8vOnR5cGVzY3JpcHQuYnpsIiwgImZsYXRidWZmZXJfdHNfbGlicmFyeSIpCiAKIHBhY2thZ2UoZGVmYXVsdF92aXNpYmlsaXR5ID0gWyIvL3Zpc2liaWxpdHk6cHVibGljIl0pCiAKZGlmZiAtLWdpdCBhL2ZyYzk3MS9jb250cm9sX2xvb3BzL2RyaXZldHJhaW4vQlVJTEQgYi9mcmM5NzEvY29udHJvbF9sb29wcy9kcml2ZXRyYWluL0JVSUxECmluZGV4IDA4NWU1M2YuLjlmN2VhZTggMTAwNjQ0Ci0tLSBhL2ZyYzk3MS9jb250cm9sX2xvb3BzL2RyaXZldHJhaW4vQlVJTEQKKysrIGIvZnJjOTcxL2NvbnRyb2xfbG9vcHMvZHJpdmV0cmFpbi9CVUlMRApAQCAtMSw0ICsxLDUgQEAKLWxvYWQoIkBjb21fZ2l0aHViX2dvb2dsZV9mbGF0YnVmZmVycy8vOmJ1aWxkX2RlZnMuYnpsIiwgImZsYXRidWZmZXJfY2NfbGlicmFyeSIsICJmbGF0YnVmZmVyX3RzX2xpYnJhcnkiKQorbG9hZCgiQGNvbV9naXRodWJfZ29vZ2xlX2ZsYXRidWZmZXJzLy86YnVpbGRfZGVmcy5iemwiLCAiZmxhdGJ1ZmZlcl9jY19saWJyYXJ5IikKK2xvYWQoIkBjb21fZ2l0aHViX2dvb2dsZV9mbGF0YnVmZmVycy8vOnR5cGVzY3JpcHQuYnpsIiwgImZsYXRidWZmZXJfdHNfbGlicmFyeSIpCiBsb2FkKCIvL2Fvczpjb25maWcuYnpsIiwgImFvc19jb25maWciKQogbG9hZCgiLy90b29scy9idWlsZF9ydWxlczpzZWxlY3QuYnpsIiwgImNwdV9zZWxlY3QiKQogbG9hZCgiLy9hb3M6ZmxhdGJ1ZmZlcnMuYnpsIiwgImNjX3N0YXRpY19mbGF0YnVmZmVyIikKZGlmZiAtLWdpdCBhL2ZyYzk3MS92aXNpb24vQlVJTEQgYi9mcmM5NzEvdmlzaW9uL0JVSUxECmluZGV4IGNhMzVmN2MuLmJmMmZmMWQgMTAwNjQ0Ci0tLSBhL2ZyYzk3MS92aXNpb24vQlVJTEQKKysrIGIvZnJjOTcxL3Zpc2lvbi9CVUlMRApAQCAtMSw0ICsxLDUgQEAKLWxvYWQoIkBjb21fZ2l0aHViX2dvb2dsZV9mbGF0YnVmZmVycy8vOmJ1aWxkX2RlZnMuYnpsIiwgImZsYXRidWZmZXJfY2NfbGlicmFyeSIsICJmbGF0YnVmZmVyX3RzX2xpYnJhcnkiKQorbG9hZCgiQGNvbV9naXRodWJfZ29vZ2xlX2ZsYXRidWZmZXJzLy86YnVpbGRfZGVmcy5iemwiLCAiZmxhdGJ1ZmZlcl9jY19saWJyYXJ5IikKK2xvYWQoIkBjb21fZ2l0aHViX2dvb2dsZV9mbGF0YnVmZmVycy8vOnR5cGVzY3JpcHQuYnpsIiwgImZsYXRidWZmZXJfdHNfbGlicmFyeSIpCiAKIGZsYXRidWZmZXJfY2NfbGlicmFyeSgKICAgICBuYW1lID0gInZpc2lvbl9mYnMiLApkaWZmIC0tZ2l0IGEvZnJjOTcxL3dwaWxpYi9CVUlMRCBiL2ZyYzk3MS93cGlsaWIvQlVJTEQKaW5kZXggODk2MzEyZS4uNzk4YTU2MSAxMDA2NDQKLS0tIGEvZnJjOTcxL3dwaWxpYi9CVUlMRAorKysgYi9mcmM5NzEvd3BpbGliL0JVSUxECkBAIC0xLDUgKzEsNiBAQAogbG9hZCgiQG5wbS8vQGJhemVsL3R5cGVzY3JpcHQ6aW5kZXguYnpsIiwgInRzX2xpYnJhcnkiKQotbG9hZCgiQGNvbV9naXRodWJfZ29vZ2xlX2ZsYXRidWZmZXJzLy86YnVpbGRfZGVmcy5iemwiLCAiZmxhdGJ1ZmZlcl9jY19saWJyYXJ5IiwgImZsYXRidWZmZXJfdHNfbGlicmFyeSIpCitsb2FkKCJAY29tX2dpdGh1Yl9nb29nbGVfZmxhdGJ1ZmZlcnMvLzpidWlsZF9kZWZzLmJ6bCIsICJmbGF0YnVmZmVyX2NjX2xpYnJhcnkiKQorbG9hZCgiQGNvbV9naXRodWJfZ29vZ2xlX2ZsYXRidWZmZXJzLy86dHlwZXNjcmlwdC5iemwiLCAiZmxhdGJ1ZmZlcl90c19saWJyYXJ5IikKIGxvYWQoIi8vYW9zOmNvbmZpZy5iemwiLCAiYW9zX2NvbmZpZyIpCiAKIHBhY2thZ2UoZGVmYXVsdF92aXNpYmlsaXR5ID0gWyIvL3Zpc2liaWxpdHk6cHVibGljIl0pCmRpZmYgLS1naXQgYS9zY291dGluZy93ZWJzZXJ2ZXIvcmVxdWVzdHMvbWVzc2FnZXMvQlVJTEQgYi9zY291dGluZy93ZWJzZXJ2ZXIvcmVxdWVzdHMvbWVzc2FnZXMvQlVJTEQKaW5kZXggZDgwNGVhNi4uYjJkMjFhMiAxMDA2NDQKLS0tIGEvc2NvdXRpbmcvd2Vic2VydmVyL3JlcXVlc3RzL21lc3NhZ2VzL0JVSUxECisrKyBiL3Njb3V0aW5nL3dlYnNlcnZlci9yZXF1ZXN0cy9tZXNzYWdlcy9CVUlMRApAQCAtMSw0ICsxLDUgQEAKLWxvYWQoIkBjb21fZ2l0aHViX2dvb2dsZV9mbGF0YnVmZmVycy8vOmJ1aWxkX2RlZnMuYnpsIiwgImZsYXRidWZmZXJfZ29fbGlicmFyeSIsICJmbGF0YnVmZmVyX3RzX2xpYnJhcnkiKQorbG9hZCgiQGNvbV9naXRodWJfZ29vZ2xlX2ZsYXRidWZmZXJzLy86YnVpbGRfZGVmcy5iemwiLCAiZmxhdGJ1ZmZlcl9nb19saWJyYXJ5IikKK2xvYWQoIkBjb21fZ2l0aHViX2dvb2dsZV9mbGF0YnVmZmVycy8vOnR5cGVzY3JpcHQuYnpsIiwgImZsYXRidWZmZXJfdHNfbGlicmFyeSIpCiAKIEZJTEVfTkFNRVMgPSAoCiAgICAgImVycm9yX3Jlc3BvbnNlIiwKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzLy5iYXplbGNpL3ByZXN1Ym1pdC55bWwgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy8uYmF6ZWxjaS9wcmVzdWJtaXQueW1sCmluZGV4IDMzY2I3YzIuLmRmNDgwY2MgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzLy5iYXplbGNpL3ByZXN1Ym1pdC55bWwKKysrIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvLmJhemVsY2kvcHJlc3VibWl0LnltbApAQCAtMiwxMSArMiwyOSBAQAogYnVpbGRpZmllcjogbGF0ZXN0CiBwbGF0Zm9ybXM6CiAgIHVidW50dTE4MDQ6CisgICAgZW52aXJvbm1lbnQ6CisgICAgICBDQzogY2xhbmcKKyAgICAgIFNXSUZUX1ZFUlNJT046ICI1LjUuMyIKKyAgICAgIFNXSUZUX0hPTUU6ICIkSE9NRS9zd2lmdC0kU1dJRlRfVkVSU0lPTiIKKyAgICAgIFBBVEg6ICIkUEFUSDokU1dJRlRfSE9NRS91c3IvYmluIgorICAgIHNoZWxsX2NvbW1hbmRzOgorICAgICAgLSAiZWNobyAtLS0gRG93bmxvYWRpbmcgYW5kIGV4dHJhY3RpbmcgU3dpZnQgJFNXSUZUX1ZFUlNJT04gdG8gJFNXSUZUX0hPTUUiCisgICAgICAtICJta2RpciAkU1dJRlRfSE9NRSIKKyAgICAgIC0gImN1cmwgaHR0cHM6Ly9kb3dubG9hZC5zd2lmdC5vcmcvc3dpZnQtJHtTV0lGVF9WRVJTSU9OfS1yZWxlYXNlL3VidW50dTE4MDQvc3dpZnQtJHtTV0lGVF9WRVJTSU9OfS1SRUxFQVNFL3N3aWZ0LSR7U1dJRlRfVkVSU0lPTn0tUkVMRUFTRS11YnVudHUxOC4wNC50YXIuZ3ogfCB0YXIgeHZ6IC0tc3RyaXAtY29tcG9uZW50cz0xIC1DICRTV0lGVF9IT01FIgogICAgIGJ1aWxkX3RhcmdldHM6CiAgICAgLSAiLy8uLi4iCiAgICAgdGVzdF90YXJnZXRzOgogICAgIC0gIi8vLi4uIgogICB1YnVudHUyMDA0OgorICAgIGVudmlyb25tZW50OgorICAgICAgQ0M6IGNsYW5nCisgICAgICBTV0lGVF9WRVJTSU9OOiAiNS41LjMiCisgICAgICBTV0lGVF9IT01FOiAiJEhPTUUvc3dpZnQtJFNXSUZUX1ZFUlNJT04iCisgICAgICBQQVRIOiAiJFBBVEg6JFNXSUZUX0hPTUUvdXNyL2JpbiIKKyAgICBzaGVsbF9jb21tYW5kczoKKyAgICAgIC0gImVjaG8gLS0tIERvd25sb2FkaW5nIGFuZCBleHRyYWN0aW5nIFN3aWZ0ICRTV0lGVF9WRVJTSU9OIHRvICRTV0lGVF9IT01FIgorICAgICAgLSAibWtkaXIgJFNXSUZUX0hPTUUiCisgICAgICAtICJjdXJsIGh0dHBzOi8vZG93bmxvYWQuc3dpZnQub3JnL3N3aWZ0LSR7U1dJRlRfVkVSU0lPTn0tcmVsZWFzZS91YnVudHUyMDA0L3N3aWZ0LSR7U1dJRlRfVkVSU0lPTn0tUkVMRUFTRS9zd2lmdC0ke1NXSUZUX1ZFUlNJT059LVJFTEVBU0UtdWJ1bnR1MjAuMDQudGFyLmd6IHwgdGFyIHh2eiAtLXN0cmlwLWNvbXBvbmVudHM9MSAtQyAkU1dJRlRfSE9NRSIKICAgICBidWlsZF90YXJnZXRzOgogICAgIC0gIi8vLi4uIgogICAgIHRlc3RfdGFyZ2V0czoKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzLy5naXRodWIvbGFiZWxlci55bWwgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy8uZ2l0aHViL2xhYmVsZXIueW1sCmluZGV4IDVkZTBjM2EuLmViMWQ3ZmQgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzLy5naXRodWIvbGFiZWxlci55bWwKKysrIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvLmdpdGh1Yi9sYWJlbGVyLnltbApAQCAtMTUsOSArMTUsNyBAQAogc3dpZnQ6CiAgIC0gJyoqLyouc3dpZnQnCiAgIC0gc3dpZnQvKiovKgotICAtIHRlc3RzL0ZsYXRCdWZmZXJzLkdSUEMuU3dpZnQvKiovKgotICAtIHRlc3RzL0ZsYXRCdWZmZXJzLkJlbmNobWFya3Muc3dpZnQvKiovKgotICAtIHRlc3RzL0ZsYXRCdWZmZXJzLlRlc3QuU3dpZnQvKiovKgorICAtIHRlc3RzL3N3aWZ0LyoqCiAgIC0gc3JjL2lkbF9nZW5fc3dpZnQuY3BwCiAKIGphdmFzY3JpcHQ6CkBAIC04Niw5ICs4NCw3IEBACiAKIENJOgogICAtICcuZ2l0aHViLyoqLyonCi0gIC0gJy50cmF2aXMvKiovKicKICAgLSAnLmJhemVsY2kvKiovKicKLSAgLSAudHJhdmlzLnltbAogCiBncnBjOgogICAtIGdycGMvKiovKgpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvLmdpdGh1Yi93b3JrZmxvd3MvYnVpbGQueW1sIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvLmdpdGh1Yi93b3JrZmxvd3MvYnVpbGQueW1sCmluZGV4IDkyNWU4NmEuLmNiNGUxZjMgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzLy5naXRodWIvd29ya2Zsb3dzL2J1aWxkLnltbAorKysgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy8uZ2l0aHViL3dvcmtmbG93cy9idWlsZC55bWwKQEAgLTEsNyArMSwxMiBAQAogbmFtZTogQ0kKK3Blcm1pc3Npb25zOiByZWFkLWFsbAogCiBvbjoKKyAgIyBGb3IgbWFudWFsIHRlc3RzLgorICB3b3JrZmxvd19kaXNwYXRjaDoKICAgcHVzaDoKKyAgICB0YWdzOgorICAgICAgLSAiKiIgIyBuZXcgdGFnIHZlcnNpb24sIGxpa2UgYDAuOC40YCBvciBlbHNlCiAgICAgYnJhbmNoZXM6CiAgICAgICAtIG1hc3RlcgogICBwdWxsX3JlcXVlc3Q6CkBAIC0xMCwzMCArMTUsMTEyIEBACiAKIGpvYnM6CiAgIGJ1aWxkLWxpbnV4OgorICAgIHBlcm1pc3Npb25zOgorICAgICAgY29udGVudHM6IHdyaXRlCisgICAgb3V0cHV0czoKKyAgICAgIGRpZ2VzdHMtZ2NjOiAke3sgc3RlcHMuaGFzaC1nY2Mub3V0cHV0cy5oYXNoZXMgfX0KKyAgICAgIGRpZ2VzdHMtY2xhbmc6ICR7eyBzdGVwcy5oYXNoLWNsYW5nLm91dHB1dHMuaGFzaGVzIH19CiAgICAgbmFtZTogQnVpbGQgTGludXgKICAgICBydW5zLW9uOiB1YnVudHUtbGF0ZXN0CiAgICAgc3RyYXRlZ3k6CiAgICAgICBtYXRyaXg6CiAgICAgICAgIGN4eDogW2crKy0xMCwgY2xhbmcrKy0xMl0KKyAgICAgIGZhaWwtZmFzdDogZmFsc2UKICAgICBzdGVwczoKICAgICAtIHVzZXM6IGFjdGlvbnMvY2hlY2tvdXRAdjIKICAgICAtIG5hbWU6IGNtYWtlCi0gICAgICBydW46IENYWD0ke3sgbWF0cml4LmN4eCB9fSBjbWFrZSAtRyAiVW5peCBNYWtlZmlsZXMiIC1EQ01BS0VfQlVJTERfVFlQRT1SZWxlYXNlIC4KKyAgICAgIHJ1bjogQ1hYPSR7eyBtYXRyaXguY3h4IH19IGNtYWtlIC1HICJVbml4IE1ha2VmaWxlcyIgLURDTUFLRV9CVUlMRF9UWVBFPVJlbGVhc2UgLURGTEFUQlVGRkVSU19TVFJJQ1RfTU9ERT1PTiAuCiAgICAgLSBuYW1lOiBidWlsZAotICAgICAgcnVuOiBtYWtlIC1qNAorICAgICAgcnVuOiBtYWtlIC1qCiAgICAgLSBuYW1lOiB0ZXN0CiAgICAgICBydW46IC4vZmxhdHRlc3RzCiAgICAgLSBuYW1lOiBtYWtlIGZsYXRjIGV4ZWN1dGFibGUKICAgICAgIHJ1bjogfAogICAgICAgICBjaG1vZCAreCBmbGF0YwogICAgICAgICAuL2ZsYXRjIC0tdmVyc2lvbgorICAgIC0gbmFtZTogZmxhdGMgdGVzdHMKKyAgICAgIHJ1bjogcHl0aG9uMyB0ZXN0cy9mbGF0Yy9tYWluLnB5CiAgICAgLSBuYW1lOiB1cGxvYWQgYnVpbGQgYXJ0aWZhY3RzCiAgICAgICB1c2VzOiBhY3Rpb25zL3VwbG9hZC1hcnRpZmFjdEB2MQogICAgICAgd2l0aDoKICAgICAgICAgbmFtZTogTGludXggZmxhdGMgYmluYXJ5ICR7eyBtYXRyaXguY3h4IH19CiAgICAgICAgIHBhdGg6IGZsYXRjCisgICAgIyBCZWxvdyBpZiBvbmx5IGZvciByZWxlYXNlLgorICAgIC0gbmFtZTogWmlwIGZpbGUKKyAgICAgIGlmOiBzdGFydHNXaXRoKGdpdGh1Yi5yZWYsICdyZWZzL3RhZ3MvJykKKyAgICAgIHJ1bjogemlwIExpbnV4LmZsYXRjLmJpbmFyeS4ke3sgbWF0cml4LmN4eCB9fS56aXAgZmxhdGMKKyAgICAtIG5hbWU6IFJlbGVhc2UgemlwIGZpbGUKKyAgICAgIHVzZXM6IHNvZnRwcm9wcy9hY3Rpb24tZ2gtcmVsZWFzZUB2MQorICAgICAgaWY6IHN0YXJ0c1dpdGgoZ2l0aHViLnJlZiwgJ3JlZnMvdGFncy8nKQorICAgICAgd2l0aDoKKyAgICAgICAgZmlsZXM6IExpbnV4LmZsYXRjLmJpbmFyeS4ke3sgbWF0cml4LmN4eCB9fS56aXAKKyAgICAtIG5hbWU6IEdlbmVyYXRlIFNMU0Egc3ViamVjdHMgLSBjbGFuZworICAgICAgaWY6IG1hdHJpeC5jeHggPT0gJ2NsYW5nKystMTInICYmIHN0YXJ0c1dpdGgoZ2l0aHViLnJlZiwgJ3JlZnMvdGFncy8nKQorICAgICAgaWQ6IGhhc2gtY2xhbmcKKyAgICAgIHJ1bjogZWNobyAiOjpzZXQtb3V0cHV0IG5hbWU9aGFzaGVzOjokKHNoYTI1NnN1bSBMaW51eC5mbGF0Yy5iaW5hcnkuJHt7IG1hdHJpeC5jeHggfX0uemlwIHwgYmFzZTY0IC13MCkiCisgICAgLSBuYW1lOiBHZW5lcmF0ZSBTTFNBIHN1YmplY3RzIC0gZ2NjCisgICAgICBpZjogbWF0cml4LmN4eCA9PSAnZysrLTEwJyAmJiBzdGFydHNXaXRoKGdpdGh1Yi5yZWYsICdyZWZzL3RhZ3MvJykKKyAgICAgIGlkOiBoYXNoLWdjYworICAgICAgcnVuOiBlY2hvICI6OnNldC1vdXRwdXQgbmFtZT1oYXNoZXM6OiQoc2hhMjU2c3VtIExpbnV4LmZsYXRjLmJpbmFyeS4ke3sgbWF0cml4LmN4eCB9fS56aXAgfCBiYXNlNjQgLXcwKSIKKworICBidWlsZC1saW51eC1jcHAtc3RkOgorICAgIG5hbWU6IEJ1aWxkIExpbnV4IEMrKworICAgIHJ1bnMtb246IHVidW50dS1sYXRlc3QKKyAgICBzdHJhdGVneToKKyAgICAgIGZhaWwtZmFzdDogZmFsc2UKKyAgICAgIG1hdHJpeDoKKyAgICAgICAgc3RkOiBbMTEsIDE0LCAxNywgMjAsIDIzXQorICAgICAgICBjeHg6IFtnKystMTAsIGNsYW5nKystMTJdCisgICAgICAgIGV4Y2x1ZGU6CisgICAgICAgICAgIyBHQ0MgMTAuMy4wIGRvZXNuJ3Qgc3VwcG9ydCBzdGQgMjMKKyAgICAgICAgICAtIGN4eDogZysrLTEwCisgICAgICAgICAgICBzdGQ6IDIzCisgICAgc3RlcHM6CisgICAgLSB1c2VzOiBhY3Rpb25zL2NoZWNrb3V0QHYyCisgICAgLSBuYW1lOiBjbWFrZQorICAgICAgcnVuOiA+CisgICAgICAgIENYWD0ke3sgbWF0cml4LmN4eCB9fSBjbWFrZSAtRyAiVW5peCBNYWtlZmlsZXMiIAorICAgICAgICAtRENNQUtFX0JVSUxEX1RZUEU9UmVsZWFzZSAtREZMQVRCVUZGRVJTX1NUUklDVF9NT0RFPU9OIAorICAgICAgICAtREZMQVRCVUZGRVJTX0NQUF9TVEQ9JHt7IG1hdHJpeC5zdGQgfX0KKyAgICAgICAgLURGTEFUQlVGRkVSU19CVUlMRF9DUFAxNz0ke3sgbWF0cml4LnN0ZCA+PSAxNyAmJiAnT24nIHx8ICdPZmYnfX0KKyAgICAtIG5hbWU6IGJ1aWxkCisgICAgICBydW46IG1ha2UgLWoKKyAgICAtIG5hbWU6IHRlc3QKKyAgICAgIHJ1bjogLi9mbGF0dGVzdHMKKyAgICAtIG5hbWU6IHRlc3QgQysrMTcKKyAgICAgIGlmOiBtYXRyaXguc3RkID49IDE3CisgICAgICBydW46IC4vZmxhdHRlc3RzX2NwcDE3CisKKyAgYnVpbGQtd2luZG93cy1jcHAtc3RkOgorICAgIG5hbWU6IEJ1aWxkIFdpbmRvd3MgQysrCisgICAgcnVucy1vbjogd2luZG93cy0yMDE5CisgICAgc3RyYXRlZ3k6CisgICAgICBtYXRyaXg6CisgICAgICAgIHN0ZDogWzExLCAxNCwgMTcsIDIwLCAyM10KKyAgICAgIGZhaWwtZmFzdDogZmFsc2UKKyAgICBzdGVwczoKKyAgICAtIHVzZXM6IGFjdGlvbnMvY2hlY2tvdXRAdjIKKyAgICAtIG5hbWU6IEFkZCBtc2J1aWxkIHRvIFBBVEgKKyAgICAgIHVzZXM6IG1pY3Jvc29mdC9zZXR1cC1tc2J1aWxkQHYxLjEKKyAgICAtIG5hbWU6IGNtYWtlCisgICAgICBydW46ID4KKyAgICAgICAgY21ha2UgLUcgIlZpc3VhbCBTdHVkaW8gMTYgMjAxOSIgLUEgeDY0IC1EQ01BS0VfQlVJTERfVFlQRT1SZWxlYXNlIAorICAgICAgICAtREZMQVRCVUZGRVJTX1NUUklDVF9NT0RFPU9OIAorICAgICAgICAtREZMQVRCVUZGRVJTX0NQUF9TVEQ9JHt7IG1hdHJpeC5zdGQgfX0KKyAgICAgICAgLURGTEFUQlVGRkVSU19CVUlMRF9DUFAxNz0ke3sgbWF0cml4LnN0ZCA+PSAxNyAmJiAnT24nIHx8ICdPZmYnfX0KKyAgICAtIG5hbWU6IGJ1aWxkCisgICAgICBydW46IG1zYnVpbGQuZXhlIEZsYXRCdWZmZXJzLnNsbiAvcDpDb25maWd1cmF0aW9uPVJlbGVhc2UgL3A6UGxhdGZvcm09eDY0CisgICAgLSBuYW1lOiB0ZXN0CisgICAgICBydW46IFJlbGVhc2VcZmxhdHRlc3RzLmV4ZQorICAgIC0gbmFtZTogdGVzdCBDKysxNworICAgICAgaWY6IG1hdHJpeC5zdGQgPj0gMTcKKyAgICAgIHJ1bjogUmVsZWFzZVxmbGF0dGVzdHNfY3BwMTcuZXhlCiAKICAgYnVpbGQtd2luZG93czoKKyAgICBwZXJtaXNzaW9uczoKKyAgICAgIGNvbnRlbnRzOiB3cml0ZQorICAgIG91dHB1dHM6CisgICAgICBkaWdlc3RzOiAke3sgc3RlcHMuaGFzaC5vdXRwdXRzLmhhc2hlcyB9fQogICAgIG5hbWU6IEJ1aWxkIFdpbmRvd3MgMjAxOSAKICAgICBydW5zLW9uOiB3aW5kb3dzLTIwMTkKICAgICBzdGVwczoKQEAgLTQxLDE2ICsxMjgsMzIgQEAKICAgICAtIG5hbWU6IEFkZCBtc2J1aWxkIHRvIFBBVEgKICAgICAgIHVzZXM6IG1pY3Jvc29mdC9zZXR1cC1tc2J1aWxkQHYxLjEKICAgICAtIG5hbWU6IGNtYWtlCi0gICAgICBydW46IGNtYWtlIC1HICJWaXN1YWwgU3R1ZGlvIDE2IDIwMTkiIC1BIHg2NCAtRENNQUtFX0JVSUxEX1RZUEU9UmVsZWFzZSAtREZMQVRCVUZGRVJTX0JVSUxEX0NQUDE3PU9OIC4KKyAgICAgIHJ1bjogY21ha2UgLUcgIlZpc3VhbCBTdHVkaW8gMTYgMjAxOSIgLUEgeDY0IC1EQ01BS0VfQlVJTERfVFlQRT1SZWxlYXNlIC1ERkxBVEJVRkZFUlNfQlVJTERfQ1BQMTc9T04gLURGTEFUQlVGRkVSU19TVFJJQ1RfTU9ERT1PTiAuCiAgICAgLSBuYW1lOiBidWlsZAogICAgICAgcnVuOiBtc2J1aWxkLmV4ZSBGbGF0QnVmZmVycy5zbG4gL3A6Q29uZmlndXJhdGlvbj1SZWxlYXNlIC9wOlBsYXRmb3JtPXg2NAogICAgIC0gbmFtZTogdGVzdAogICAgICAgcnVuOiBSZWxlYXNlXGZsYXR0ZXN0cy5leGUKKyAgICAtIG5hbWU6IGZsYXRjIHRlc3RzCisgICAgICBydW46IHB5dGhvbjMgdGVzdHMvZmxhdGMvbWFpbi5weSAtLWZsYXRjIFJlbGVhc2VcZmxhdGMuZXhlCiAgICAgLSBuYW1lOiB1cGxvYWQgYnVpbGQgYXJ0aWZhY3RzCiAgICAgICB1c2VzOiBhY3Rpb25zL3VwbG9hZC1hcnRpZmFjdEB2MQogICAgICAgd2l0aDoKICAgICAgICAgbmFtZTogV2luZG93cyBmbGF0YyBiaW5hcnkKICAgICAgICAgcGF0aDogUmVsZWFzZVxmbGF0Yy5leGUKKyAgICAjIEJlbG93IGlmIG9ubHkgZm9yIHJlbGVhc2UuCisgICAgLSBuYW1lOiBaaXAgZmlsZQorICAgICAgaWY6IHN0YXJ0c1dpdGgoZ2l0aHViLnJlZiwgJ3JlZnMvdGFncy8nKQorICAgICAgcnVuOiBtb3ZlIFJlbGVhc2UvZmxhdGMuZXhlIC4gJiYgQ29tcHJlc3MtQXJjaGl2ZSBmbGF0Yy5leGUgV2luZG93cy5mbGF0Yy5iaW5hcnkuemlwCisgICAgLSBuYW1lOiBSZWxlYXNlIGJpbmFyeQorICAgICAgdXNlczogc29mdHByb3BzL2FjdGlvbi1naC1yZWxlYXNlQHYxCisgICAgICBpZjogc3RhcnRzV2l0aChnaXRodWIucmVmLCAncmVmcy90YWdzLycpCisgICAgICB3aXRoOgorICAgICAgICBmaWxlczogV2luZG93cy5mbGF0Yy5iaW5hcnkuemlwCisgICAgLSBuYW1lOiBHZW5lcmF0ZSBTTFNBIHN1YmplY3RzCisgICAgICBpZjogc3RhcnRzV2l0aChnaXRodWIucmVmLCAncmVmcy90YWdzLycpCisgICAgICBpZDogaGFzaAorICAgICAgc2hlbGw6IGJhc2gKKyAgICAgIHJ1bjogZWNobyAiOjpzZXQtb3V0cHV0IG5hbWU9aGFzaGVzOjokKHNoYTI1NnN1bSBXaW5kb3dzLmZsYXRjLmJpbmFyeS56aXAgfCBiYXNlNjQgLXcwKSIKIAogICBidWlsZC13aW5kb3dzLTIwMTc6CiAgICAgbmFtZTogQnVpbGQgV2luZG93cyAyMDE3CkBAIC02MCw3ICsxNjMsNyBAQAogICAgIC0gbmFtZTogQWRkIG1zYnVpbGQgdG8gUEFUSAogICAgICAgdXNlczogbWljcm9zb2Z0L3NldHVwLW1zYnVpbGRAdjEuMQogICAgIC0gbmFtZTogY21ha2UKLSAgICAgIHJ1bjogY21ha2UgLUcgIlZpc3VhbCBTdHVkaW8gMTYgMjAxOSIgLUEgeDY0IC1EQ01BS0VfQlVJTERfVFlQRT1SZWxlYXNlIC4KKyAgICAgIHJ1bjogY21ha2UgLUcgIlZpc3VhbCBTdHVkaW8gMTYgMjAxOSIgLUEgeDY0IC1EQ01BS0VfQlVJTERfVFlQRT1SZWxlYXNlIC1ERkxBVEJVRkZFUlNfU1RSSUNUX01PREU9T04gLgogICAgIC0gbmFtZTogYnVpbGQgdG9vbCB2ZXJzaW9uIDE1IChWUyAyMDE3KQogICAgICAgcnVuOiBtc2J1aWxkLmV4ZSBGbGF0QnVmZmVycy5zbG4gL3A6Q29uZmlndXJhdGlvbj1SZWxlYXNlIC9wOlBsYXRmb3JtPXg2NCAvcDpWaXN1YWxTdHVkaW9WZXJzaW9uPTE1LjAKICAgICAtIG5hbWU6IHRlc3QKQEAgLTc0LDcgKzE3Nyw3IEBACiAgICAgLSBuYW1lOiBBZGQgbXNidWlsZCB0byBQQVRICiAgICAgICB1c2VzOiBtaWNyb3NvZnQvc2V0dXAtbXNidWlsZEB2MS4xCiAgICAgLSBuYW1lOiBjbWFrZQotICAgICAgcnVuOiBjbWFrZSAtRyAiVmlzdWFsIFN0dWRpbyAxNCAyMDE1IiAtQSB4NjQgLURDTUFLRV9CVUlMRF9UWVBFPVJlbGVhc2UgLgorICAgICAgcnVuOiBjbWFrZSAtRyAiVmlzdWFsIFN0dWRpbyAxNCAyMDE1IiAtQSB4NjQgLURDTUFLRV9CVUlMRF9UWVBFPVJlbGVhc2UgLURGTEFUQlVGRkVSU19TVFJJQ1RfTU9ERT1PTiAuCiAgICAgLSBuYW1lOiBidWlsZCB0b29sIHZlcnNpb24gMTQgKFZTIDIwMTUpCiAgICAgICBydW46IG1zYnVpbGQuZXhlIEZsYXRCdWZmZXJzLnNsbiAvcDpDb25maWd1cmF0aW9uPVJlbGVhc2UgL3A6UGxhdGZvcm09eDY0IC9wOlZpc3VhbFN0dWRpb1ZlcnNpb249MTQuMAogICAgIC0gbmFtZTogdGVzdApAQCAtMTA4LDEzICsyMTEsNjMgQEAKICAgICAgICAgY2QgdGVzdHNcRmxhdEJ1ZmZlcnMuVGVzdAogICAgICAgICBvdXRcRmxhdEJ1ZmZlcnMuQ29yZS5UZXN0LmV4ZQogCi0gIGJ1aWxkLW1hYzoKLSAgICBuYW1lOiBCdWlsZCBNYWMKKyAgYnVpbGQtbWFjLWludGVsOgorICAgIHBlcm1pc3Npb25zOgorICAgICAgY29udGVudHM6IHdyaXRlCisgICAgb3V0cHV0czoKKyAgICAgIGRpZ2VzdHM6ICR7eyBzdGVwcy5oYXNoLm91dHB1dHMuaGFzaGVzIH19CisgICAgbmFtZTogQnVpbGQgTWFjIChmb3IgSW50ZWwpCiAgICAgcnVucy1vbjogbWFjb3MtbGF0ZXN0CiAgICAgc3RlcHM6CiAgICAgLSB1c2VzOiBhY3Rpb25zL2NoZWNrb3V0QHYyCiAgICAgLSBuYW1lOiBjbWFrZQotICAgICAgcnVuOiBjbWFrZSAtRyAiWGNvZGUiIC1EQ01BS0VfQlVJTERfVFlQRT1SZWxlYXNlIC1ERkxBVEJVRkZFUlNfRkxBVENfRVhFQ1VUQUJMRT1fYnVpbGQvUmVsZWFzZS9mbGF0YyAuCisgICAgICBydW46IGNtYWtlIC1HICJYY29kZSIgLURDTUFLRV9CVUlMRF9UWVBFPVJlbGVhc2UgLURGTEFUQlVGRkVSU19GTEFUQ19FWEVDVVRBQkxFPV9idWlsZC9SZWxlYXNlL2ZsYXRjIC1ERkxBVEJVRkZFUlNfU1RSSUNUX01PREU9T04gLgorICAgIC0gbmFtZTogYnVpbGQKKyAgICAgICMgTk9URTogd2UgbmVlZCB0aGlzIF9idWlsZCBkaXIgdG8gbm90IGhhdmUgeGNvZGVidWlsZCdzIGRlZmF1bHQgLi9idWlsZCBkaXIgY2xhc2ggd2l0aCB0aGUgQlVJTEQgZmlsZS4KKyAgICAgIHJ1bjogeGNvZGVidWlsZCAtdG9vbGNoYWluIGNsYW5nIC1jb25maWd1cmF0aW9uIFJlbGVhc2UgLXRhcmdldCBmbGF0dGVzdHMgU1lNUk9PVD0kKFBXRCkvX2J1aWxkCisgICAgLSBuYW1lOiBjaGVjayB0aGF0IHRoZSBiaW5hcnkgaXMgeDg2XzY0CisgICAgICBydW46IHwKKyAgICAgICAgaW5mbz0kKGZpbGUgX2J1aWxkL1JlbGVhc2UvZmxhdGMpCisgICAgICAgIGVjaG8gJGluZm8KKyAgICAgICAgZWNobyAkaW5mbyB8IGdyZXAgIk1hY2gtTyA2NC1iaXQgZXhlY3V0YWJsZSB4ODZfNjQiCisgICAgLSBuYW1lOiB0ZXN0CisgICAgICBydW46IF9idWlsZC9SZWxlYXNlL2ZsYXR0ZXN0cworICAgIC0gbmFtZTogbWFrZSBmbGF0YyBleGVjdXRhYmxlCisgICAgICBydW46IHwKKyAgICAgICAgY2htb2QgK3ggX2J1aWxkL1JlbGVhc2UvZmxhdGMKKyAgICAgICAgLi9fYnVpbGQvUmVsZWFzZS9mbGF0YyAtLXZlcnNpb24KKyAgICAtIG5hbWU6IGZsYXRjIHRlc3RzCisgICAgICBydW46IHB5dGhvbjMgdGVzdHMvZmxhdGMvbWFpbi5weSAtLWZsYXRjIC4vX2J1aWxkL1JlbGVhc2UvZmxhdGMKKyAgICAtIG5hbWU6IHVwbG9hZCBidWlsZCBhcnRpZmFjdHMKKyAgICAgIHVzZXM6IGFjdGlvbnMvdXBsb2FkLWFydGlmYWN0QHYxCisgICAgICB3aXRoOgorICAgICAgICBuYW1lOiBNYWMgZmxhdGMgYmluYXJ5CisgICAgICAgIHBhdGg6IF9idWlsZC9SZWxlYXNlL2ZsYXRjCisgICAgIyBCZWxvdyBpZiBvbmx5IGZvciByZWxlYXNlLgorICAgIC0gbmFtZTogWmlwIGZpbGUKKyAgICAgIGlmOiBzdGFydHNXaXRoKGdpdGh1Yi5yZWYsICdyZWZzL3RhZ3MvJykKKyAgICAgIHJ1bjogbXYgX2J1aWxkL1JlbGVhc2UvZmxhdGMgLiAmJiB6aXAgTWFjSW50ZWwuZmxhdGMuYmluYXJ5LnppcCBmbGF0YworICAgIC0gbmFtZTogUmVsZWFzZSBiaW5hcnkKKyAgICAgIHVzZXM6IHNvZnRwcm9wcy9hY3Rpb24tZ2gtcmVsZWFzZUB2MQorICAgICAgaWY6IHN0YXJ0c1dpdGgoZ2l0aHViLnJlZiwgJ3JlZnMvdGFncy8nKQorICAgICAgd2l0aDoKKyAgICAgICAgZmlsZXM6IE1hY0ludGVsLmZsYXRjLmJpbmFyeS56aXAKKyAgICAtIG5hbWU6IEdlbmVyYXRlIFNMU0Egc3ViamVjdHMKKyAgICAgIGlmOiBzdGFydHNXaXRoKGdpdGh1Yi5yZWYsICdyZWZzL3RhZ3MvJykKKyAgICAgIGlkOiBoYXNoCisgICAgICBydW46IGVjaG8gIjo6c2V0LW91dHB1dCBuYW1lPWhhc2hlczo6JChzaGFzdW0gLWEgMjU2IE1hY0ludGVsLmZsYXRjLmJpbmFyeS56aXAgfCBiYXNlNjQpIgorCisgIGJ1aWxkLW1hYy11bml2ZXJzYWw6CisgICAgcGVybWlzc2lvbnM6CisgICAgICBjb250ZW50czogd3JpdGUKKyAgICBvdXRwdXRzOgorICAgICAgZGlnZXN0czogJHt7IHN0ZXBzLmhhc2gub3V0cHV0cy5oYXNoZXMgfX0KKyAgICBuYW1lOiBCdWlsZCBNYWMgKHVuaXZlcnNhbCBidWlsZCkKKyAgICBydW5zLW9uOiBtYWNvcy1sYXRlc3QKKyAgICBzdGVwczoKKyAgICAtIHVzZXM6IGFjdGlvbnMvY2hlY2tvdXRAdjIKKyAgICAtIG5hbWU6IGNtYWtlCisgICAgICBydW46IGNtYWtlIC1HICJYY29kZSIgLURDTUFLRV9PU1hfQVJDSElURUNUVVJFUz0iYXJtNjQ7eDg2XzY0IiAtRENNQUtFX0JVSUxEX1RZUEU9UmVsZWFzZSAtREZMQVRCVUZGRVJTX0ZMQVRDX0VYRUNVVEFCTEU9X2J1aWxkL1JlbGVhc2UvZmxhdGMgLURGTEFUQlVGRkVSU19TVFJJQ1RfTU9ERT1PTiAuCiAgICAgLSBuYW1lOiBidWlsZAogICAgICAgIyBOT1RFOiB3ZSBuZWVkIHRoaXMgX2J1aWxkIGRpciB0byBub3QgaGF2ZSB4Y29kZWJ1aWxkJ3MgZGVmYXVsdCAuL2J1aWxkIGRpciBjbGFzaCB3aXRoIHRoZSBCVUlMRCBmaWxlLgogICAgICAgcnVuOiB4Y29kZWJ1aWxkIC10b29sY2hhaW4gY2xhbmcgLWNvbmZpZ3VyYXRpb24gUmVsZWFzZSAtdGFyZ2V0IGZsYXR0ZXN0cyBTWU1ST09UPSQoUFdEKS9fYnVpbGQKQEAgLTEyMiw3ICsyNzUsNyBAQAogICAgICAgcnVuOiB8CiAgICAgICAgIGluZm89JChmaWxlIF9idWlsZC9SZWxlYXNlL2ZsYXRjKQogICAgICAgICBlY2hvICRpbmZvCi0gICAgICAgIGVjaG8gJGluZm8gfCBncmVwICJ1bml2ZXJzYWwgYmluYXJ5IHdpdGggMiBhcmNoaXRlY3R1cmVzIgorICAgICAgICBlY2hvICRpbmZvIHwgZ3JlcCAiTWFjaC1PIHVuaXZlcnNhbCBiaW5hcnkgd2l0aCAyIGFyY2hpdGVjdHVyZXMiCiAgICAgLSBuYW1lOiB0ZXN0CiAgICAgICBydW46IF9idWlsZC9SZWxlYXNlL2ZsYXR0ZXN0cwogICAgIC0gbmFtZTogbWFrZSBmbGF0YyBleGVjdXRhYmxlCkBAIC0xMzQsNiArMjg3LDE5IEBACiAgICAgICB3aXRoOgogICAgICAgICBuYW1lOiBNYWMgZmxhdGMgYmluYXJ5CiAgICAgICAgIHBhdGg6IF9idWlsZC9SZWxlYXNlL2ZsYXRjCisgICAgIyBCZWxvdyBpZiBvbmx5IGZvciByZWxlYXNlLgorICAgIC0gbmFtZTogWmlwIGZpbGUKKyAgICAgIGlmOiBzdGFydHNXaXRoKGdpdGh1Yi5yZWYsICdyZWZzL3RhZ3MvJykKKyAgICAgIHJ1bjogbXYgX2J1aWxkL1JlbGVhc2UvZmxhdGMgLiAmJiB6aXAgTWFjLmZsYXRjLmJpbmFyeS56aXAgZmxhdGMKKyAgICAtIG5hbWU6IFJlbGVhc2UgYmluYXJ5CisgICAgICB1c2VzOiBzb2Z0cHJvcHMvYWN0aW9uLWdoLXJlbGVhc2VAdjEKKyAgICAgIGlmOiBzdGFydHNXaXRoKGdpdGh1Yi5yZWYsICdyZWZzL3RhZ3MvJykKKyAgICAgIHdpdGg6CisgICAgICAgIGZpbGVzOiBNYWMuZmxhdGMuYmluYXJ5LnppcAorICAgIC0gbmFtZTogR2VuZXJhdGUgU0xTQSBzdWJqZWN0cworICAgICAgaWY6IHN0YXJ0c1dpdGgoZ2l0aHViLnJlZiwgJ3JlZnMvdGFncy8nKQorICAgICAgaWQ6IGhhc2gKKyAgICAgIHJ1bjogZWNobyAiOjpzZXQtb3V0cHV0IG5hbWU9aGFzaGVzOjokKHNoYXN1bSAtYSAyNTYgTWFjLmZsYXRjLmJpbmFyeS56aXAgfCBiYXNlNjQpIgogCiAgIGJ1aWxkLWFuZHJvaWQ6CiAgICBuYW1lOiBCdWlsZCBBbmRyb2lkIChvbiBMaW51eCkKQEAgLTE0NiwxMiArMzEyLDEyIEBACiAgICAgICAgamF2YS12ZXJzaW9uOiAxLjgKICAgIC0gbmFtZTogc2V0IHVwIGZsYXRjCiAgICAgIHJ1bjogfAotICAgICAgIGNtYWtlIC1ERkxBVEJVRkZFUlNfQlVJTERfVEVTVFM9T0ZGIC1ERkxBVEJVRkZFUlNfQlVJTERfRkxBVExJQj1PRkYgLURGTEFUQlVGRkVSU19CVUlMRF9GTEFUSEFTSD1PRkYgLgotICAgICAgIG1ha2UKKyAgICAgICBjbWFrZSAtREZMQVRCVUZGRVJTX0JVSUxEX1RFU1RTPU9GRiAtREZMQVRCVUZGRVJTX0JVSUxEX0ZMQVRMSUI9T0ZGIC1ERkxBVEJVRkZFUlNfQlVJTERfRkxBVEhBU0g9T0ZGIC1ERkxBVEJVRkZFUlNfU1RSSUNUX01PREU9T04gLgorICAgICAgIG1ha2UgLWoKICAgICAgICBlY2hvICIke1BXRH0iID4+ICRHSVRIVUJfUEFUSAogICAgLSBuYW1lOiBidWlsZAogICAgICB3b3JraW5nLWRpcmVjdG9yeTogYW5kcm9pZAotICAgICBydW46IGJhc2ggLi9ncmFkbGV3IGNsZWFuIGJ1aWxkCisgICAgIHJ1bjogZ3JhZGxlIGNsZWFuIGJ1aWxkCiAKICAgYnVpbGQtZ2VuZXJhdG9yOgogICAgIG5hbWU6IENoZWNrIEdlbmVyYXRlZCBDb2RlCkBAIC0xNjIsMTEgKzMyOCwxMSBAQAogICAgIHN0ZXBzOgogICAgIC0gdXNlczogYWN0aW9ucy9jaGVja291dEB2MgogICAgIC0gbmFtZTogY21ha2UKLSAgICAgIHJ1bjogQ1hYPSR7eyBtYXRyaXguY3h4IH19IGNtYWtlIC1HICJVbml4IE1ha2VmaWxlcyIgLURGTEFUQlVGRkVSU19CVUlMRF9URVNUUz1PRkYgLURDTUFLRV9CVUlMRF9UWVBFPVJlbGVhc2UgLiAmJiBtYWtlIC1qNAorICAgICAgcnVuOiBDWFg9JHt7IG1hdHJpeC5jeHggfX0gY21ha2UgLUcgIlVuaXggTWFrZWZpbGVzIiAtREZMQVRCVUZGRVJTX0JVSUxEX1RFU1RTPU9GRiAtRENNQUtFX0JVSUxEX1RZUEU9UmVsZWFzZSAtREZMQVRCVUZGRVJTX1NUUklDVF9NT0RFPU9OIC4gJiYgbWFrZSAtagogICAgIC0gbmFtZTogR2VuZXJhdGUKICAgICAgIHJ1bjogc2NyaXB0cy9jaGVja19nZW5lcmF0ZV9jb2RlLnB5CiAgICAgLSBuYW1lOiBHZW5lcmF0ZSBnUlBDCi0gICAgICBydW46IGJhc2ggc2NyaXB0cy9jaGVjay1ncnBjLWdlbmVyYXRlZC1jb2RlLnNoCisgICAgICBydW46IHNjcmlwdHMvY2hlY2stZ3JwYy1nZW5lcmF0ZWQtY29kZS5weQogCiAgIGJ1aWxkLWJlbmNobWFya3M6CiAgICAgbmFtZTogQnVpbGQgQmVuY2htYXJrcyAob24gTGludXgpCkBAIC0xNzcsNyArMzQzLDcgQEAKICAgICBzdGVwczoKICAgICAtIHVzZXM6IGFjdGlvbnMvY2hlY2tvdXRAdjIKICAgICAtIG5hbWU6IGNtYWtlCi0gICAgICBydW46IENYWD0ke3sgbWF0cml4LmN4eCB9fSBjbWFrZSAtRyAiVW5peCBNYWtlZmlsZXMiIC1ERkxBVEJVRkZFUlNfQ1hYX0ZMQUdTPSItV25vLXVudXNlZC1wYXJhbWV0ZXIgLWZuby1hbGlnbmVkLW5ldyIgLURGTEFUQlVGRkVSU19CVUlMRF9CRU5DSE1BUktTPU9OIC1EQ01BS0VfQlVJTERfVFlQRT1SZWxlYXNlIC4gJiYgbWFrZSAtajQKKyAgICAgIHJ1bjogQ1hYPSR7eyBtYXRyaXguY3h4IH19IGNtYWtlIC1HICJVbml4IE1ha2VmaWxlcyIgLURGTEFUQlVGRkVSU19DWFhfRkxBR1M9Ii1Xbm8tdW51c2VkLXBhcmFtZXRlciAtZm5vLWFsaWduZWQtbmV3IiAtREZMQVRCVUZGRVJTX0JVSUxEX0JFTkNITUFSS1M9T04gLURDTUFLRV9CVUlMRF9UWVBFPVJlbGVhc2UgLURGTEFUQlVGRkVSU19TVFJJQ1RfTU9ERT1PTiAuICYmIG1ha2UgLWoKICAgICAtIG5hbWU6IFJ1biBiZW5jaG1hcmtzCiAgICAgICBydW46IC4vZmxhdGJlbmNobWFyayAtLWJlbmNobWFya19yZXBldGl0aW9ucz01IC0tYmVuY2htYXJrX2Rpc3BsYXlfYWdncmVnYXRlc19vbmx5PXRydWUgLS1iZW5jaG1hcmtfb3V0X2Zvcm1hdD1jb25zb2xlIC0tYmVuY2htYXJrX291dD1iZW5jaG1hcmtzL3Jlc3VsdHNfJHt7bWF0cml4LmN4eH19CiAgICAgLSBuYW1lOiBVcGxvYWQgYmVuY2htYXJrcyByZXN1bHRzCkBAIC0xOTIsOCArMzU4LDggQEAKICAgICBzdGVwczoKICAgICAtIHVzZXM6IGFjdGlvbnMvY2hlY2tvdXRAdjIKICAgICAtIG5hbWU6IHRlc3QKLSAgICAgIHdvcmtpbmctZGlyZWN0b3J5OiB0ZXN0cwotICAgICAgcnVuOiBiYXNoIEphdmFUZXN0LnNoCisgICAgICB3b3JraW5nLWRpcmVjdG9yeTogamF2YQorICAgICAgcnVuOiBtdm4gdGVzdAogCiAgIGJ1aWxkLWtvdGxpbi1tYWNvczoKICAgICBuYW1lOiBCdWlsZCBLb3RsaW4gTWFjT1MKQEAgLTIwMSwxMyArMzY3LDE0IEBACiAgICAgc3RlcHM6CiAgICAgLSBuYW1lOiBDaGVja291dAogICAgICAgdXNlczogYWN0aW9ucy9jaGVja291dEB2MgorICAgIC0gdXNlczogZ3JhZGxlL3dyYXBwZXItdmFsaWRhdGlvbi1hY3Rpb25AdjEKICAgICAtIHVzZXM6IGFjdGlvbnMvc2V0dXAtamF2YUB2MgogICAgICAgd2l0aDoKICAgICAgICAgZGlzdHJpYnV0aW9uOiAnYWRvcHQtaG90c3BvdCcKICAgICAgICAgamF2YS12ZXJzaW9uOiAnMTEnCiAgICAgLSBuYW1lOiBCdWlsZAogICAgICAgd29ya2luZy1kaXJlY3Rvcnk6IGtvdGxpbgotICAgICAgcnVuOiAuL2dyYWRsZXcgY2xlYW4gaW9zWDY0VGVzdCBtYWNvc1g2NFRlc3QganNUZXN0IGpzQnJvd3NlclRlc3QKKyAgICAgIHJ1bjogLi9ncmFkbGV3IGNsZWFuIGlvc1g2NFRlc3QgbWFjb3NYNjRUZXN0CiAKICAgYnVpbGQta290bGluLWxpbnV4OgogICAgIG5hbWU6IEJ1aWxkIEtvdGxpbiBMaW51eApAQCAtMjE4LDIzICszODUsMTQgQEAKICAgICAtIHVzZXM6IGFjdGlvbnMvc2V0dXAtamF2YUB2MgogICAgICAgd2l0aDoKICAgICAgICAgZGlzdHJpYnV0aW9uOiAnYWRvcHQtaG90c3BvdCcKLSAgICAgICAgamF2YS12ZXJzaW9uOiAnOCcKKyAgICAgICAgamF2YS12ZXJzaW9uOiAnMTEnCisgICAgLSB1c2VzOiBncmFkbGUvd3JhcHBlci12YWxpZGF0aW9uLWFjdGlvbkB2MQogICAgIC0gbmFtZTogQnVpbGQKICAgICAgIHdvcmtpbmctZGlyZWN0b3J5OiBrb3RsaW4KLSAgICAgIHJ1bjogLi9ncmFkbGV3IGp2bU1haW5DbGFzc2VzIGp2bVRlc3QKLSAgICAtIG5hbWU6IFJ1biBCZW5jaG1hcmsKLSAgICAgIHdvcmtpbmctZGlyZWN0b3J5OiBrb3RsaW4KLSAgICAgIHJ1bjogLi9ncmFkbGV3IGp2bUJlbmNobWFyawotICAgIC0gbmFtZTogR2VuZXJhdGUgQmVuY2htYXJrIFJlcG9ydAotICAgICAgd29ya2luZy1kaXJlY3Rvcnk6IGtvdGxpbgotICAgICAgcnVuOiB8Ci0gICAgICAgIC4vZ3JhZGxldyBqbWhSZXBvcnQ7Ci0gICAgICAgIG12IGJlbmNobWFyay9idWlsZC9yZXBvcnRzL2JlbmNobWFya3MvbWFpbi8qIGJlbmNobWFya19sYXRlc3QKLSAgICAtIG5hbWU6IEFyY2hpdmUgYmVuY2htYXJrIHJlcG9ydAotICAgICAgdXNlczogYWN0aW9ucy91cGxvYWQtYXJ0aWZhY3RAdjEKLSAgICAgIHdpdGg6Ci0gICAgICAgIG5hbWU6IEtvdGxpbiBCZW5jaG1hcmsgUmVwb3J0Ci0gICAgICAgIHBhdGg6IGtvdGxpbi9iZW5jaG1hcmtfbGF0ZXN0CisgICAgICAjIHdlIGFyZSB1c2luZyBkb2NrZXIncyB2ZXJzaW9uIG9mIGdyYWRsZQorICAgICAgIyBzbyBubyBuZWVkIGZvciB3cmFwcGVyIHZhbGlkYWRhdGlvbiBvciB1c2VyCisgICAgICAjIGdyYWRsZXcKKyAgICAgIHJ1bjogZ3JhZGxlIGp2bU1haW5DbGFzc2VzIGp2bVRlc3QganNUZXN0IGpzQnJvd3NlclRlc3QKIAogICBidWlsZC1ydXN0OgogICAgIG5hbWU6IEJ1aWxkIFJ1c3QKQEAgLTI2MSw3ICs0MTksNyBAQAogICAgIC0gdXNlczogYWN0aW9ucy9jaGVja291dEB2MgogICAgIC0gbmFtZTogZmxhdGMKICAgICAgICMgRklYTUU6IG1ha2UgdGVzdCBzY3JpcHQgbm90IHJlbHkgb24gZmxhdGMKLSAgICAgIHJ1bjogY21ha2UgLUcgIlVuaXggTWFrZWZpbGVzIiAtRENNQUtFX0JVSUxEX1RZUEU9UmVsZWFzZSAtREZMQVRCVUZGRVJTX0JVSUxEX1RFU1RTPU9GRiAtREZMQVRCVUZGRVJTX0lOU1RBTEw9T0ZGIC1ERkxBVEJVRkZFUlNfQlVJTERfRkxBVExJQj1PRkYgLURGTEFUQlVGRkVSU19CVUlMRF9GTEFUSEFTSD1PRkYgLiAmJiBtYWtlIC1qNAorICAgICAgcnVuOiBjbWFrZSAtRyAiVW5peCBNYWtlZmlsZXMiIC1EQ01BS0VfQlVJTERfVFlQRT1SZWxlYXNlIC1ERkxBVEJVRkZFUlNfQlVJTERfVEVTVFM9T0ZGIC1ERkxBVEJVRkZFUlNfSU5TVEFMTD1PRkYgLURGTEFUQlVGRkVSU19CVUlMRF9GTEFUTElCPU9GRiAtREZMQVRCVUZGRVJTX0JVSUxEX0ZMQVRIQVNIPU9GRiAtREZMQVRCVUZGRVJTX1NUUklDVF9NT0RFPU9OIC4gJiYgbWFrZSAtagogICAgIC0gbmFtZTogdGVzdAogICAgICAgd29ya2luZy1kaXJlY3Rvcnk6IHRlc3RzCiAgICAgICBydW46IGJhc2ggR29UZXN0LnNoCkBAIC0yNzIsMTkgKzQzMCwzNyBAQAogICAgIHN0ZXBzOgogICAgIC0gdXNlczogYWN0aW9ucy9jaGVja291dEB2MgogICAgIC0gbmFtZTogdGVzdAotICAgICAgd29ya2luZy1kaXJlY3Rvcnk6IHRlc3RzL0ZsYXRCdWZmZXJzLlRlc3QuU3dpZnQKKyAgICAgIHdvcmtpbmctZGlyZWN0b3J5OiB0ZXN0cy9zd2lmdC90ZXN0cwogICAgICAgcnVuOiBzaCBTd2lmdFRlc3Quc2gKIAorICBidWlsZC1zd2lmdC13YXNtOgorICAgIG5hbWU6IEJ1aWxkIFN3aWZ0IFdhc20KKyAgICBydW5zLW9uOiB1YnVudHUtbGF0ZXN0CisgICAgY29udGFpbmVyOgorICAgICAgaW1hZ2U6IGdoY3IuaW8vc3dpZnR3YXNtL2NhcnRvbjowLjE1LjMKKyAgICBzdGVwczoKKyAgICAgIC0gdXNlczogYWN0aW9ucy9jaGVja291dEB2MgorICAgICAgLSBuYW1lOiBTZXR1cCBXYXNtZXIKKyAgICAgICAgdXNlczogd2FzbWVyaW8vc2V0dXAtd2FzbWVyQHYxCisgICAgICAtIG5hbWU6IFRlc3QKKyAgICAgICAgd29ya2luZy1kaXJlY3Rvcnk6IHRlc3RzL3N3aWZ0L1dhc20udGVzdHMKKyAgICAgICAgcnVuOiBjYXJ0b24gdGVzdAorCiAgIGJ1aWxkLXRzOgogICAgIG5hbWU6IEJ1aWxkIFRTCiAgICAgcnVucy1vbjogdWJ1bnR1LWxhdGVzdAogICAgIHN0ZXBzOgogICAgIC0gdXNlczogYWN0aW9ucy9jaGVja291dEB2MgorICAgIC0gbmFtZTogZmxhdGMKKyAgICAgICMgRklYTUU6IG1ha2UgdGVzdCBzY3JpcHQgbm90IHJlbHkgb24gZmxhdGMKKyAgICAgIHJ1bjogY21ha2UgLUcgIlVuaXggTWFrZWZpbGVzIiAtRENNQUtFX0JVSUxEX1RZUEU9UmVsZWFzZSAtREZMQVRCVUZGRVJTX0JVSUxEX1RFU1RTPU9GRiAtREZMQVRCVUZGRVJTX0lOU1RBTEw9T0ZGIC1ERkxBVEJVRkZFUlNfQlVJTERfRkxBVExJQj1PRkYgLURGTEFUQlVGRkVSU19CVUlMRF9GTEFUSEFTSD1PRkYgLiAmJiBtYWtlIC1qCisgICAgLSBuYW1lOiBkZXBzCisgICAgICBydW46IHlhcm4KICAgICAtIG5hbWU6IGNvbXBpbGUKLSAgICAgIHJ1bjogbnBtIHJ1biBjb21waWxlCisgICAgICBydW46IHlhcm4gY29tcGlsZQogICAgIC0gbmFtZTogdGVzdAotICAgICAgd29ya2luZy1kaXJlY3Rvcnk6IHRlc3RzCi0gICAgICBydW46IHNoIFR5cGVTY3JpcHRUZXN0LnNoCisgICAgICB3b3JraW5nLWRpcmVjdG9yeTogdGVzdHMvdHMKKyAgICAgIHJ1bjogcHl0aG9uMyBUeXBlU2NyaXB0VGVzdC5weQogCiAgIGJ1aWxkLWRhcnQ6CiAgICAgbmFtZTogQnVpbGQgRGFydApAQCAtMjk2LDcgKzQ3Miw0MyBAQAogICAgICAgICAgIHNkazogc3RhYmxlCiAgICAgICAtIG5hbWU6IGZsYXRjCiAgICAgICAgICMgRklYTUU6IG1ha2UgdGVzdCBzY3JpcHQgbm90IHJlbHkgb24gZmxhdGMKLSAgICAgICAgcnVuOiBjbWFrZSAtRyAiVW5peCBNYWtlZmlsZXMiIC1EQ01BS0VfQlVJTERfVFlQRT1SZWxlYXNlIC1ERkxBVEJVRkZFUlNfQlVJTERfVEVTVFM9T0ZGIC1ERkxBVEJVRkZFUlNfSU5TVEFMTD1PRkYgLURGTEFUQlVGRkVSU19CVUlMRF9GTEFUTElCPU9GRiAtREZMQVRCVUZGRVJTX0JVSUxEX0ZMQVRIQVNIPU9GRiAuICYmIG1ha2UgLWo0CisgICAgICAgIHJ1bjogY21ha2UgLUcgIlVuaXggTWFrZWZpbGVzIiAtRENNQUtFX0JVSUxEX1RZUEU9UmVsZWFzZSAtREZMQVRCVUZGRVJTX0JVSUxEX1RFU1RTPU9GRiAtREZMQVRCVUZGRVJTX0lOU1RBTEw9T0ZGIC1ERkxBVEJVRkZFUlNfQlVJTERfRkxBVExJQj1PRkYgLURGTEFUQlVGRkVSU19CVUlMRF9GTEFUSEFTSD1PRkYgLURGTEFUQlVGRkVSU19TVFJJQ1RfTU9ERT1PTiAuICYmIG1ha2UgLWoKICAgICAgIC0gbmFtZTogdGVzdAogICAgICAgICB3b3JraW5nLWRpcmVjdG9yeTogdGVzdHMKICAgICAgICAgcnVuOiBiYXNoIERhcnRUZXN0LnNoCisKKyAgcmVsZWFzZS1kaWdlc3RzOgorICAgIGlmOiBzdGFydHNXaXRoKGdpdGh1Yi5yZWYsICdyZWZzL3RhZ3MvJykKKyAgICBuZWVkczogW2J1aWxkLWxpbnV4LCBidWlsZC13aW5kb3dzLCBidWlsZC1tYWMtaW50ZWwsIGJ1aWxkLW1hYy11bml2ZXJzYWxdCisgICAgb3V0cHV0czoKKyAgICAgIGRpZ2VzdHM6ICR7eyBzdGVwcy5oYXNoLm91dHB1dHMuZGlnZXN0cyB9fQorICAgIHJ1bnMtb246IHVidW50dS1sYXRlc3QKKyAgICBzdGVwczoKKyAgICAgIC0gbmFtZTogTWVyZ2UgcmVzdWx0cworICAgICAgICBpZDogaGFzaAorICAgICAgICBlbnY6CisgICAgICAgICAgTElOVVhHQ0NfRElHRVNUUzogIiR7eyBuZWVkcy5idWlsZC1saW51eC5vdXRwdXRzLmRpZ2VzdHMtZ2NjIH19IgorICAgICAgICAgIExJTlVYQ0xBTkdfRElHRVNUUzogIiR7eyBuZWVkcy5idWlsZC1saW51eC5vdXRwdXRzLmRpZ2VzdHMtY2xhbmcgfX0iCisgICAgICAgICAgTUFDX0RJR0VTVFM6ICIke3sgbmVlZHMuYnVpbGQtbWFjLXVuaXZlcnNhbC5vdXRwdXRzLmRpZ2VzdHMgfX0iCisgICAgICAgICAgTUFDSU5URUxfRElHRVNUUzogIiR7eyBuZWVkcy5idWlsZC1tYWMtaW50ZWwub3V0cHV0cy5kaWdlc3RzIH19IgorICAgICAgICAgIFdJTkRPV1NfRElHRVNUUzogIiR7eyBuZWVkcy5idWlsZC13aW5kb3dzLm91dHB1dHMuZGlnZXN0cyB9fSIKKyAgICAgICAgcnVuOiB8CisgICAgICAgICAgc2V0IC1ldW8gcGlwZWZhaWwKKyAgICAgICAgICBlY2hvICIkTElOVVhHQ0NfRElHRVNUUyIgfCBiYXNlNjQgLWQgPiBjaGVja3N1bXMudHh0CisgICAgICAgICAgZWNobyAiJExJTlVYQ0xBTkdfRElHRVNUUyIgfCBiYXNlNjQgLWQgPj4gY2hlY2tzdW1zLnR4dAorICAgICAgICAgIGVjaG8gIiRNQUNfRElHRVNUUyIgfCBiYXNlNjQgLWQgPj4gY2hlY2tzdW1zLnR4dAorICAgICAgICAgIGVjaG8gIiRNQUNJTlRFTF9ESUdFU1RTIiB8IGJhc2U2NCAtZCA+PiBjaGVja3N1bXMudHh0CisgICAgICAgICAgZWNobyAiJFdJTkRPV1NfRElHRVNUUyIgfCBiYXNlNjQgLWQgPj4gY2hlY2tzdW1zLnR4dAorICAgICAgICAgIGVjaG8gIjo6c2V0LW91dHB1dCBuYW1lPWRpZ2VzdHM6OiQoY2F0IGNoZWNrc3Vtcy50eHQgfCBiYXNlNjQgLXcwKSIKKworICBwcm92ZW5hbmNlOgorICAgIGlmOiBzdGFydHNXaXRoKGdpdGh1Yi5yZWYsICdyZWZzL3RhZ3MvJykKKyAgICBuZWVkczogW3JlbGVhc2UtZGlnZXN0c10KKyAgICBwZXJtaXNzaW9uczoKKyAgICAgIGFjdGlvbnM6IHJlYWQgICAjIFRvIHJlYWQgdGhlIHdvcmtmbG93IHBhdGguCisgICAgICBpZC10b2tlbjogd3JpdGUgIyBUbyBzaWduIHRoZSBwcm92ZW5hbmNlLgorICAgICAgY29udGVudHM6IHdyaXRlICMgVG8gYWRkIGFzc2V0cyB0byBhIHJlbGVhc2UuCisgICAgdXNlczogc2xzYS1mcmFtZXdvcmsvc2xzYS1naXRodWItZ2VuZXJhdG9yLy5naXRodWIvd29ya2Zsb3dzL2dlbmVyYXRvcl9nZW5lcmljX3Nsc2EzLnltbEB2MS4yLjAKKyAgICB3aXRoOgorICAgICAgYmFzZTY0LXN1YmplY3RzOiAiJHt7IG5lZWRzLnJlbGVhc2UtZGlnZXN0cy5vdXRwdXRzLmRpZ2VzdHMgfX0iCisgICAgICB1cGxvYWQtYXNzZXRzOiB0cnVlICMgT3B0aW9uYWw6IFVwbG9hZCB0byBhIG5ldyByZWxlYXNlCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy8uZ2l0aHViL3dvcmtmbG93cy9jb2RlcWwueW1sIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvLmdpdGh1Yi93b3JrZmxvd3MvY29kZXFsLnltbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZGNiYWI4Ci0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvLmdpdGh1Yi93b3JrZmxvd3MvY29kZXFsLnltbApAQCAtMCwwICsxLDcxIEBACisjIEZvciBtb3N0IHByb2plY3RzLCB0aGlzIHdvcmtmbG93IGZpbGUgd2lsbCBub3QgbmVlZCBjaGFuZ2luZzsgeW91IHNpbXBseSBuZWVkCisjIHRvIGNvbW1pdCBpdCB0byB5b3VyIHJlcG9zaXRvcnkuCisjCisjIFlvdSBtYXkgd2lzaCB0byBhbHRlciB0aGlzIGZpbGUgdG8gb3ZlcnJpZGUgdGhlIHNldCBvZiBsYW5ndWFnZXMgYW5hbHl6ZWQsCisjIG9yIHRvIHByb3ZpZGUgY3VzdG9tIHF1ZXJpZXMgb3IgYnVpbGQgbG9naWMuCisjCisjICoqKioqKioqIE5PVEUgKioqKioqKioKKyMgV2UgaGF2ZSBhdHRlbXB0ZWQgdG8gZGV0ZWN0IHRoZSBsYW5ndWFnZXMgaW4geW91ciByZXBvc2l0b3J5LiBQbGVhc2UgY2hlY2sKKyMgdGhlIGBsYW5ndWFnZWAgbWF0cml4IGRlZmluZWQgYmVsb3cgdG8gY29uZmlybSB5b3UgaGF2ZSB0aGUgY29ycmVjdCBzZXQgb2YKKyMgc3VwcG9ydGVkIENvZGVRTCBsYW5ndWFnZXMuCisjCituYW1lOiAiQ29kZVFMIgorcGVybWlzc2lvbnM6IHJlYWQtYWxsCisKK29uOgorICBwdXNoOgorICAgIGJyYW5jaGVzOiBbIG1hc3RlciBdCisgIHB1bGxfcmVxdWVzdDoKKyAgICAjIFRoZSBicmFuY2hlcyBiZWxvdyBtdXN0IGJlIGEgc3Vic2V0IG9mIHRoZSBicmFuY2hlcyBhYm92ZQorICAgIGJyYW5jaGVzOiBbIG1hc3RlciBdCisgIHNjaGVkdWxlOgorICAgIC0gY3JvbjogJzE2IDIwICogKiAwJworCitqb2JzOgorICBhbmFseXplOgorICAgIG5hbWU6IEFuYWx5emUKKyAgICBydW5zLW9uOiB1YnVudHUtbGF0ZXN0CisgICAgcGVybWlzc2lvbnM6CisgICAgICBhY3Rpb25zOiByZWFkCisgICAgICBjb250ZW50czogcmVhZAorICAgICAgc2VjdXJpdHktZXZlbnRzOiB3cml0ZQorCisgICAgc3RyYXRlZ3k6CisgICAgICBmYWlsLWZhc3Q6IGZhbHNlCisgICAgICBtYXRyaXg6CisgICAgICAgIGxhbmd1YWdlOiBbICdjcHAnIF0KKyAgICAgICAgIyBDb2RlUUwgc3VwcG9ydHMgWyAnY3BwJywgJ2NzaGFycCcsICdnbycsICdqYXZhJywgJ2phdmFzY3JpcHQnLCAncHl0aG9uJywgJ3J1YnknIF0KKyAgICAgICAgIyBMZWFybiBtb3JlIGFib3V0IENvZGVRTCBsYW5ndWFnZSBzdXBwb3J0IGF0IGh0dHBzOi8vZ2l0LmlvL2NvZGVxbC1sYW5ndWFnZS1zdXBwb3J0CisKKyAgICBzdGVwczoKKyAgICAtIG5hbWU6IENoZWNrb3V0IHJlcG9zaXRvcnkKKyAgICAgIHVzZXM6IGFjdGlvbnMvY2hlY2tvdXRAdjMKKworICAgICMgSW5pdGlhbGl6ZXMgdGhlIENvZGVRTCB0b29scyBmb3Igc2Nhbm5pbmcuCisgICAgLSBuYW1lOiBJbml0aWFsaXplIENvZGVRTAorICAgICAgdXNlczogZ2l0aHViL2NvZGVxbC1hY3Rpb24vaW5pdEB2MgorICAgICAgd2l0aDoKKyAgICAgICAgbGFuZ3VhZ2VzOiAke3sgbWF0cml4Lmxhbmd1YWdlIH19CisgICAgICAgICMgSWYgeW91IHdpc2ggdG8gc3BlY2lmeSBjdXN0b20gcXVlcmllcywgeW91IGNhbiBkbyBzbyBoZXJlIG9yIGluIGEgY29uZmlnIGZpbGUuCisgICAgICAgICMgQnkgZGVmYXVsdCwgcXVlcmllcyBsaXN0ZWQgaGVyZSB3aWxsIG92ZXJyaWRlIGFueSBzcGVjaWZpZWQgaW4gYSBjb25maWcgZmlsZS4KKyAgICAgICAgIyBQcmVmaXggdGhlIGxpc3QgaGVyZSB3aXRoICIrIiB0byB1c2UgdGhlc2UgcXVlcmllcyBhbmQgdGhvc2UgaW4gdGhlIGNvbmZpZyBmaWxlLgorICAgICAgICAjIHF1ZXJpZXM6IC4vcGF0aC90by9sb2NhbC9xdWVyeSwgeW91ci1vcmcveW91ci1yZXBvL3F1ZXJpZXNAbWFpbgorCisgICAgIyBBdXRvYnVpbGQgYXR0ZW1wdHMgdG8gYnVpbGQgYW55IGNvbXBpbGVkIGxhbmd1YWdlcyAgKEMvQysrLCBDIywgb3IgSmF2YSkuCisgICAgIyBJZiB0aGlzIHN0ZXAgZmFpbHMsIHRoZW4geW91IHNob3VsZCByZW1vdmUgaXQgYW5kIHJ1biB0aGUgYnVpbGQgbWFudWFsbHkgKHNlZSBiZWxvdykKKyAgICAjIC0gbmFtZTogQXV0b2J1aWxkCisgICAgIyAgdXNlczogZ2l0aHViL2NvZGVxbC1hY3Rpb24vYXV0b2J1aWxkQHYyCisKKyAgICAjIOKEue+4jyBDb21tYW5kLWxpbmUgcHJvZ3JhbXMgdG8gcnVuIHVzaW5nIHRoZSBPUyBzaGVsbC4KKyAgICAjIPCfk5ogaHR0cHM6Ly9naXQuaW8vSnZYRGwKKworICAgICMg4pyP77iPIElmIHRoZSBBdXRvYnVpbGQgZmFpbHMgYWJvdmUsIHJlbW92ZSBpdCBhbmQgdW5jb21tZW50IHRoZSBmb2xsb3dpbmcgdGhyZWUgbGluZXMKKyAgICAjICAgIGFuZCBtb2RpZnkgdGhlbSAob3IgYWRkIG1vcmUpIHRvIGJ1aWxkIHlvdXIgY29kZSBpZiB5b3VyIHByb2plY3QKKyAgICAjICAgIHVzZXMgYSBjb21waWxlZCBsYW5ndWFnZQorCisgICAgLSBydW46IHwKKyAgICAgICBjbWFrZSAtRyAiVW5peCBNYWtlZmlsZXMiIC1EQ01BS0VfQlVJTERfVFlQRT1SZWxlYXNlIC1ERkxBVEJVRkZFUlNfU1RSSUNUX01PREU9T04gLgorICAgICAgIG1ha2UgLWogICAgICAgCisKKyAgICAtIG5hbWU6IFBlcmZvcm0gQ29kZVFMIEFuYWx5c2lzCisgICAgICB1c2VzOiBnaXRodWIvY29kZXFsLWFjdGlvbi9hbmFseXplQHYyCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy8uZ2l0aHViL3dvcmtmbG93cy9sYWJlbC55bWwgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy8uZ2l0aHViL3dvcmtmbG93cy9sYWJlbC55bWwKaW5kZXggNTNkZDQ3Mi4uNDJhOTYxNSAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvLmdpdGh1Yi93b3JrZmxvd3MvbGFiZWwueW1sCisrKyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzLy5naXRodWIvd29ya2Zsb3dzL2xhYmVsLnltbApAQCAtNiwxMSArNiwxNiBAQAogIyBodHRwczovL2dpdGh1Yi5jb20vYWN0aW9ucy9sYWJlbGVyCiAKIG5hbWU6IExhYmVsZXIKK3Blcm1pc3Npb25zOiByZWFkLWFsbAorCiBvbjogW3B1bGxfcmVxdWVzdF90YXJnZXRdCiAKIGpvYnM6CiAgIGxhYmVsOgotCisgICAgcGVybWlzc2lvbnM6CisgICAgICBjb250ZW50czogcmVhZAorICAgICAgcHVsbC1yZXF1ZXN0czogd3JpdGUKKyAgICAgIAogICAgIHJ1bnMtb246IHVidW50dS1sYXRlc3QKIAogICAgIHN0ZXBzOgpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvLmdpdGh1Yi93b3JrZmxvd3MvbWFpbi55bWwgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy8uZ2l0aHViL3dvcmtmbG93cy9tYWluLnltbAppbmRleCA0ZWM1YWQ0Li43Mzk0NjE3IDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy8uZ2l0aHViL3dvcmtmbG93cy9tYWluLnltbAorKysgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy8uZ2l0aHViL3dvcmtmbG93cy9tYWluLnltbApAQCAtMSw0ICsxLDYgQEAKLW5hbWU6IENJRnV6egorbmFtZTogT1NTLUZ1enoKK3Blcm1pc3Npb25zOiByZWFkLWFsbAorCiBvbjogCiAgIHB1bGxfcmVxdWVzdDoKICAgICBicmFuY2hlczoKQEAgLTIzLDcgKzI1LDcgQEAKICAgICAgd2l0aDoKICAgICAgICBvc3MtZnV6ei1wcm9qZWN0LW5hbWU6ICdmbGF0YnVmZmVycycKICAgICAgICBsYW5ndWFnZTogYysrCi0gICAgICAgZnV6ei1zZWNvbmRzOiA2MDAKKyAgICAgICBmdXp6LXNlY29uZHM6IDYwCiAgICAtIG5hbWU6IFVwbG9hZCBDcmFzaAogICAgICB1c2VzOiBhY3Rpb25zL3VwbG9hZC1hcnRpZmFjdEB2MQogICAgICBpZjogZmFpbHVyZSgpICYmIHN0ZXBzLmJ1aWxkLm91dGNvbWUgPT0gJ3N1Y2Nlc3MnCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy8uZ2l0aHViL3dvcmtmbG93cy9zY29yZWNhcmRzLnltbCBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzLy5naXRodWIvd29ya2Zsb3dzL3Njb3JlY2FyZHMueW1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiMmJlOTQKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy8uZ2l0aHViL3dvcmtmbG93cy9zY29yZWNhcmRzLnltbApAQCAtMCwwICsxLDU1IEBACituYW1lOiBTY29yZWNhcmRzIHN1cHBseS1jaGFpbiBzZWN1cml0eQorb246CisgICMgT25seSB0aGUgZGVmYXVsdCBicmFuY2ggaXMgc3VwcG9ydGVkLgorICBicmFuY2hfcHJvdGVjdGlvbl9ydWxlOgorICBzY2hlZHVsZToKKyAgICAtIGNyb246ICcyMSAyICogKiA1JworICBwdXNoOgorICAgIGJyYW5jaGVzOiBbIG1hc3RlciBdCisKKyMgRGVjbGFyZSBkZWZhdWx0IHBlcm1pc3Npb25zIGFzIHJlYWQgb25seS4KK3Blcm1pc3Npb25zOiByZWFkLWFsbAorCitqb2JzOgorICBhbmFseXNpczoKKyAgICBuYW1lOiBTY29yZWNhcmRzIGFuYWx5c2lzCisgICAgcnVucy1vbjogdWJ1bnR1LWxhdGVzdAorICAgIHBlcm1pc3Npb25zOgorICAgICAgIyBOZWVkZWQgdG8gdXBsb2FkIHRoZSByZXN1bHRzIHRvIGNvZGUtc2Nhbm5pbmcgZGFzaGJvYXJkLgorICAgICAgc2VjdXJpdHktZXZlbnRzOiB3cml0ZQorICAgICAgYWN0aW9uczogcmVhZAorICAgICAgY29udGVudHM6IHJlYWQKKworICAgIHN0ZXBzOgorICAgICAgLSBuYW1lOiAiQ2hlY2tvdXQgY29kZSIKKyAgICAgICAgdXNlczogYWN0aW9ucy9jaGVja291dEBhMTJhMzk0M2I0YmRkZTc2NzE2NGY3OTJmMzNmNDBiMDQ2NDVkODQ2ICMgdjMuMC4wCisgICAgICAgIHdpdGg6CisgICAgICAgICAgcGVyc2lzdC1jcmVkZW50aWFsczogZmFsc2UKKworICAgICAgLSBuYW1lOiAiUnVuIGFuYWx5c2lzIgorICAgICAgICB1c2VzOiBvc3NmL3Njb3JlY2FyZC1hY3Rpb25AY2UzMzBmZGU2YjFhNWM5Yzc1YjQxN2U3ZWZjNTEwYjgyMmEzNTU2NCAjIHYxLjEuMgorICAgICAgICB3aXRoOgorICAgICAgICAgIHJlc3VsdHNfZmlsZTogcmVzdWx0cy5zYXJpZgorICAgICAgICAgIHJlc3VsdHNfZm9ybWF0OiBzYXJpZgorICAgICAgICAgICMgUmVhZC1vbmx5IFBBVCB0b2tlbi4gVG8gY3JlYXRlIGl0LAorICAgICAgICAgICMgZm9sbG93IHRoZSBzdGVwcyBpbiBodHRwczovL2dpdGh1Yi5jb20vb3NzZi9zY29yZWNhcmQtYWN0aW9uI3BhdC10b2tlbi1jcmVhdGlvbi4KKyAgICAgICAgICByZXBvX3Rva2VuOiAke3sgc2VjcmV0cy5TQ09SRUNBUkRfUkVBRF9UT0tFTiB9fQorICAgICAgICAgICMgUHVibGlzaCB0aGUgcmVzdWx0cyB0byBlbmFibGUgc2NvcmVjYXJkIGJhZGdlcy4gRm9yIG1vcmUgZGV0YWlscywgc2VlCisgICAgICAgICAgIyBodHRwczovL2dpdGh1Yi5jb20vb3NzZi9zY29yZWNhcmQtYWN0aW9uI3B1Ymxpc2hpbmctcmVzdWx0cy4KKyAgICAgICAgICAjIEZvciBwcml2YXRlIHJlcG9zaXRvcmllcywgYHB1Ymxpc2hfcmVzdWx0c2Agd2lsbCBhdXRvbWF0aWNhbGx5IGJlIHNldCB0byBgZmFsc2VgLAorICAgICAgICAgICMgcmVnYXJkbGVzcyBvZiB0aGUgdmFsdWUgZW50ZXJlZCBoZXJlLgorICAgICAgICAgIHB1Ymxpc2hfcmVzdWx0czogdHJ1ZQorCisgICAgICAjIFVwbG9hZCB0aGUgcmVzdWx0cyBhcyBhcnRpZmFjdHMgKG9wdGlvbmFsKS4KKyAgICAgIC0gbmFtZTogIlVwbG9hZCBhcnRpZmFjdCIKKyAgICAgICAgdXNlczogYWN0aW9ucy91cGxvYWQtYXJ0aWZhY3RANjY3M2NkMDUyYzRjZDZmY2Y0YjRlNmU2MGVhOTg2Yzg4OTM4OTUzNSAjIHYzLjAuMAorICAgICAgICB3aXRoOgorICAgICAgICAgIG5hbWU6IFNBUklGIGZpbGUKKyAgICAgICAgICBwYXRoOiByZXN1bHRzLnNhcmlmCisgICAgICAgICAgcmV0ZW50aW9uLWRheXM6IDUKKworICAgICAgIyBVcGxvYWQgdGhlIHJlc3VsdHMgdG8gR2l0SHViJ3MgY29kZSBzY2FubmluZyBkYXNoYm9hcmQuCisgICAgICAtIG5hbWU6ICJVcGxvYWQgdG8gY29kZS1zY2FubmluZyIKKyAgICAgICAgdXNlczogZ2l0aHViL2NvZGVxbC1hY3Rpb24vdXBsb2FkLXNhcmlmQDVmNTMyNTYzNTg0ZDcxZmRlZjE0ZWU2NGQxN2JhZmIzNGY3NTFjZTUgIyB2MS4wLjI2CisgICAgICAgIHdpdGg6CisgICAgICAgICAgc2FyaWZfZmlsZTogcmVzdWx0cy5zYXJpZgpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvLmdpdGh1Yi93b3JrZmxvd3Mvc3RhbGUueW1sIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvLmdpdGh1Yi93b3JrZmxvd3Mvc3RhbGUueW1sCmluZGV4IGIzMjJiNzQuLjQ1ZjAxMTkgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzLy5naXRodWIvd29ya2Zsb3dzL3N0YWxlLnltbAorKysgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy8uZ2l0aHViL3dvcmtmbG93cy9zdGFsZS55bWwKQEAgLTEsNCArMSw1IEBACiBuYW1lOiBNYXJrIHN0YWxlIGlzc3VlcyBhbmQgcHVsbCByZXF1ZXN0cworcGVybWlzc2lvbnM6IHJlYWQtYWxsCiAKIG9uOgogICBzY2hlZHVsZToKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzLy5naXRpZ25vcmUgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy8uZ2l0aWdub3JlCmluZGV4IGM0YmZiYzkuLjA4ZGFlZTEgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzLy5naXRpZ25vcmUKKysrIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvLmdpdGlnbm9yZQpAQCAtNTQsNiArNTQsOCBAQAogZmxhdGhhc2guZXhlCiBmbGF0dGVzdHMKIGZsYXR0ZXN0cy5leGUKK2ZsYXR0ZXN0c19jcHAxNworZmxhdHRlc3RzX2NwcDE3LmV4ZQogZmxhdHNhbXBsZWJpbmFyeQogZmxhdHNhbXBsZWJpbmFyeS5leGUKIGZsYXRzYW1wbGV0ZXh0CkBAIC03Niw3ICs3OCw3IEBACiBDTWFrZUxpc3RzLnR4dC51c2VyCiBDTWFrZVNjcmlwdHMvKioKIENUZXN0VGVzdGZpbGUuY21ha2UKLUZsYXRidWZmZXJzQ29uZmlnVmVyc2lvbi5jbWFrZQorZmxhdGJ1ZmZlcnMtY29uZmlnLXZlcnNpb24uY21ha2UKIEZsYXRCdWZmZXJzLmNicAogYnVpbGQvWGNvZGUvRmxhdEJ1ZmZlcnMueGNvZGVwcm9qL3Byb2plY3QueGN3b3Jrc3BhY2UvKioKIGJ1aWxkL1hjb2RlL0ZsYXRCdWZmZXJzLnhjb2RlcHJvai94Y3VzZXJkYXRhLyoqCkBAIC04Niw2ICs4OCw3IEBACiAuaWRlYQogKi5pbWwKIHRhcmdldAoramF2YS90YXJnZXQKICoqLyoucHljCiBidWlsZC9WUzIwMTAvRmxhdEJ1ZmZlcnMuc2RmCiBidWlsZC9WUzIwMTAvRmxhdEJ1ZmZlcnMub3BlbnNkZgpAQCAtMTQ2LDQgKzE0OSw0IEBACiAqKi9odG1sLyoqCiAqKi9sYXRleC8qKgogIyBodHRwczovL2NtYWtlLm9yZy9jbWFrZS9oZWxwL2xhdGVzdC9tb2R1bGUvRmV0Y2hDb250ZW50Lmh0bWwjdmFyaWFibGU6RkVUQ0hDT05URU5UX0JBU0VfRElSCi1fZGVwcy8KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCitfZGVwcy8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzLy50cmF2aXMueW1sIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvLnRyYXZpcy55bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJlOTUxMDkuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvLnRyYXZpcy55bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMTUgKzAsMCBAQAotZW52OgotICBnbG9iYWw6Ci0gICAgIyBTZXQgYXQgdGhlIHJvb3QgbGV2ZWwgYXMgdGhpcyBpcyBpZ25vcmVkIHdoZW4gc2V0IHVuZGVyIG1hdHJpeC5lbnYuCi0gICAgLSBHQ0NfVkVSU0lPTj0iNC45IgotICAgICMgRmFpbCBvbiBmaXJzdCBlcnJvciBpZiBVQlNBTiBvciBBU0FOIGVuYWJsZWQgZm9yIGEgdGFyZ2V0Ci0gICAgLSBVQlNBTl9PUFRJT05TPWhhbHRfb25fZXJyb3I9MQotICAgIC0gQVNBTl9PUFRJT05TPWhhbHRfb25fZXJyb3I9MQotICAgICMgVHJhdmlzIG1hY2hpbmVzIGhhdmUgMiBjb3JlcwotICAgIC0gSk9CUz0yCi0gICAgLSBNQUtFRkxBR1M9Ii1qIDIiCi0KLWNvbmFuLWxpbnV4OiAmY29uYW4tbGludXgKLSAgb3M6IGxpbnV4Ci0gIGRpc3Q6IHhlbmlhbAotICBsYW5ndWFnZTogcHl0aG9uCi0gIHB5dGhvbjogIjMuNyIKLSAgc2VydmljZXM6Ci0gICAgLSBkb2NrZXIKLSAgaW5zdGFsbDoKLSAgICAtIC4vY29uYW4vdHJhdmlzL2luc3RhbGwuc2gKLSAgc2NyaXB0OgotICAgIC0gLi9jb25hbi90cmF2aXMvYnVpbGQuc2gKLSAgaWY6IHRhZyBJUyBwcmVzZW50Ci0KLWNvbmFuLWxpbnV4LW1hc3RlcjogJmNvbmFuLWxpbnV4LW1hc3RlcgotICBvczogbGludXgKLSAgZGlzdDogeGVuaWFsCi0gIGxhbmd1YWdlOiBweXRob24KLSAgcHl0aG9uOiAiMy43IgotICBzZXJ2aWNlczoKLSAgICAtIGRvY2tlcgotICBpbnN0YWxsOgotICAgIC0gJ2lmIFsgIiRUUkFWSVNfUFVMTF9SRVFVRVNUIiA9ICJmYWxzZSIgXTsgdGhlbiBiYXNoIC4vY29uYW4vdHJhdmlzL2luc3RhbGwuc2g7IGZpJwotICBzY3JpcHQ6Ci0gICAgLSAnaWYgWyAiJFRSQVZJU19QVUxMX1JFUVVFU1QiID0gImZhbHNlIiBdOyB0aGVuIGJhc2ggLi9jb25hbi90cmF2aXMvYnVpbGQuc2g7IGZpJwotICBicmFuY2hlczoKLSAgICBvbmx5OgotICAgIC0gbWFzdGVyCi0KLWNvbmFuLW9zeDogJmNvbmFuLW9zeAotICBvczogb3N4Ci0gIGxhbmd1YWdlOiBnZW5lcmljCi0gIGluc3RhbGw6Ci0gICAgLSAuL2NvbmFuL3RyYXZpcy9pbnN0YWxsLnNoCi0gIHNjcmlwdDoKLSAgICAtIC4vY29uYW4vdHJhdmlzL2J1aWxkLnNoCi0gIGlmOiB0YWcgSVMgcHJlc2VudAotCi1tYXRyaXg6Ci0gIGluY2x1ZGU6Ci0gICAgIy0gbGFuZ3VhZ2U6IHB5dGhvbgotICAgICMgIHB5dGhvbjogIjIuNyIKLSAgICAjICBpbnN0YWxsOgotICAgICMgICAgLSAicGlwIGluc3RhbGwgd2hlZWwgdHdpbmUiCi0gICAgIyAgc2NyaXB0OgotICAgICMgICAgLSAiY2QgcHl0aG9uLyIKLSAgICAjICAgIC0gJ1ZFUlNJT049IiRUUkFWSVNfVEFHIiBweXRob24gc2V0dXAucHkgc2Rpc3QgYmRpc3Rfd2hlZWwnCi0gICAgIyAgICAtICJjZCAuLi8iCi0gICAgIyAgZGVwbG95OgotICAgICMgICAgIyBDaGVja3BvaW50ZWQgcmVsZWFzZSBidWlsZHMuCi0gICAgIyAgICAtIHByb3ZpZGVyOiBzY3JpcHQKLSAgICAjICAgICAgc2NyaXB0OiAudHJhdmlzL2RlcGxveS1weXRob24uc2gKLSAgICAjICAgICAgc2tpcF9jbGVhbnVwOiB0cnVlCi0gICAgIyAgICAgIG9uOgotICAgICMgICAgICAgIHRhZ3M6IHRydWUKLSAgICAjICAgICAgICAjIGFsbF9icmFuY2hlcyBtdXN0IGJlIHNldCB3aXRoIHRhZ3M6IHRydWUuIFNlZSBiZWxvdyBwb3N0OgotICAgICMgICAgICAgICMgaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9hLzI3Nzc1MjU3LzEwNzY1ODUKLSAgICAjICAgICAgICBhbGxfYnJhbmNoZXM6IHRydWUKLSAgICAjICAgICMgUHJvZHVjZSBhIG5ldyBidWlsZCBmb3IgdGhlIGN1dHRpbmcgZWRnZSB3aGVuIG1hc3RlciBjaGFuZ2VzLgotICAgICMgICAgLSBwcm92aWRlcjogc2NyaXB0Ci0gICAgIyAgICAgIHNjcmlwdDogLnRyYXZpcy9kZXBsb3ktcHl0aG9uLnNoCi0gICAgIyAgICAgIHNraXBfY2xlYW51cDogdHJ1ZQotICAgICMgICAgICBvbjoKLSAgICAjICAgICAgICBicmFuY2g6IG1hc3RlcgotICAgIC0gbGFuZ3VhZ2U6IGNwcAotICAgICAgb3M6Ci0gICAgICAgIC0gbGludXgKLQotICAgICAgYWRkb25zOgotICAgICAgICBhcHQ6Ci0gICAgICAgICAgcGFja2FnZXM6Ci0gICAgICAgICAgICAtIGRvY2tlci1jZQotICAgICAgc2NyaXB0OgotICAgICAgICAtIGJhc2ggLnRyYXZpcy9idWlsZC1hbmQtcnVuLWRvY2tlci10ZXN0LWNvbnRhaW5lcnMuc2gKLQotICAgIC0gbGFuZ3VhZ2U6IGNwcAotICAgICAgb3M6Ci0gICAgICAgIC0gbGludXgKLQotICAgICAgY29tcGlsZXI6Ci0gICAgICAgIC0gZ2NjCi0KLSAgICAgIGVudjoKLSAgICAgICAgbWF0cml4OgotICAgICAgICAgIC0gQlVJTERfVFlQRT1EZWJ1ZwotICAgICAgICAgIC0gQlVJTERfVFlQRT1SZWxlYXNlCi0KLSAgICAgIGJlZm9yZV9pbnN0YWxsOgotICAgICAgLSBpZiBbICIkVFJBVklTX09TX05BTUUiID09ICJsaW51eCIgXTsgdGhlbiBzdWRvIGFkZC1hcHQtcmVwb3NpdG9yeSAteSBwcGE6dWJ1bnR1LXRvb2xjaGFpbi1yL3Rlc3Q7IGZpCi0gICAgICAtIGlmIFsgIiRUUkFWSVNfT1NfTkFNRSIgPT0gImxpbnV4IiBdOyB0aGVuIHN1ZG8gYXB0LWdldCB1cGRhdGUgLXFxOyBmaQotICAgICAgLSBpZiBbICIkVFJBVklTX09TX05BTUUiID09ICJsaW51eCIgXTsgdGhlbiBzdWRvIGFwdC1nZXQgaW5zdGFsbCAtcXEgZysrLSRHQ0NfVkVSU0lPTjsgZmkKLSAgICAgIC0gaWYgWyAiJFRSQVZJU19PU19OQU1FIiA9PSAibGludXgiIF07IHRoZW4gc3VkbyBhcHQtZ2V0IGluc3RhbGwgLXFxIGdjYy0kR0NDX1ZFUlNJT047IGZpCi0gICAgICAtIGlmIFsgIiRUUkFWSVNfT1NfTkFNRSIgPT0gImxpbnV4IiBdOyB0aGVuIHN1ZG8gbG4gLXMgLXYgLWYgJCh3aGljaCBnKystJEdDQ19WRVJTSU9OKSAvdXNyL2Jpbi9nKys7IGZpCi0gICAgICAtIGlmIFsgIiRUUkFWSVNfT1NfTkFNRSIgPT0gImxpbnV4IiBdOyB0aGVuIHN1ZG8gbG4gLXMgLXYgLWYgJCh3aGljaCBnY2MtJEdDQ19WRVJTSU9OKSAvdXNyL2Jpbi9nY2M7IGZpCi0KLSAgICAgIHNjcmlwdDoKLSAgICAgIC0gcGlwIGluc3RhbGwgY21ha2UKLSAgICAgIC0gYmFzaCAudHJhdmlzL2NoZWNrLXNvdXJjZXMuc2gKLSAgICAgIC0gYmFzaCBncnBjL2J1aWxkX2dycGMuc2gKLSAgICAgIC0gY21ha2UgLgotICAgICAgICAtRENNQUtFX0JVSUxEX1RZUEU9JEJVSUxEX1RZUEUKLSAgICAgICAgLURGTEFUQlVGRkVSU19CVUlMRF9HUlBDVEVTVD1PTgotICAgICAgICAtREdSUENfSU5TVEFMTF9QQVRIPSRUUkFWSVNfQlVJTERfRElSL2dvb2dsZS9ncnBjL2luc3RhbGwKLSAgICAgICAgLURQUk9UT0JVRl9ET1dOTE9BRF9QQVRIPSRUUkFWSVNfQlVJTERfRElSL2dvb2dsZS9ncnBjL3RoaXJkX3BhcnR5L3Byb3RvYnVmCi0gICAgICAgIC1ERkxBVEJVRkZFUlNfQ09ERV9TQU5JVElaRT1PTgotICAgICAgLSBjbWFrZSAtLWJ1aWxkIC4gLS10YXJnZXQgYWxsIC0tY2xlYW4tZmlyc3QgLS0gLWoke0pPQlN9Ci0gICAgICAtIExEX0xJQlJBUllfUEFUSD0kVFJBVklTX0JVSUxEX0RJUi9nb29nbGUvZ3JwYy9pbnN0YWxsL2xpYiBjdGVzdCAtLWV4dHJhLXZlcmJvc2UgLS1vdXRwdXQtb24tZmFpbHVyZQotCi0gICAgLSBsYW5ndWFnZTogY3BwCi0gICAgICBvczogb3N4Ci0gICAgICBvc3hfaW1hZ2U6IHhjb2RlOS4zCi0gICAgICBlbnY6Ci0gICAgICAgIG1hdHJpeDoKLSAgICAgICAgICAtIEJVSUxEX1RZUEU9RGVidWcKLSAgICAgICAgICAtIEJVSUxEX1RZUEU9UmVsZWFzZQotCi0gICAgICBzY3JpcHQ6Ci0gICAgICAtIHBpcCBpbnN0YWxsIC0tdXNlciBjbWFrZQotICAgICAgLSBta2RpciB+L2NtYWtlX3BhdGgKLSAgICAgIC0gbG4gLXMgJChmaW5kIH4vTGlicmFyeS9QeXRob24gLW5hbWUgY21ha2UgLXR5cGUgZiB8IGhlYWQgLW4gMSkgfi9jbWFrZV9wYXRoL2NtYWtlCi0gICAgICAtIGxuIC1zICQoZmluZCB+L0xpYnJhcnkvUHl0aG9uIC1uYW1lIGN0ZXN0IC10eXBlIGYgfCBoZWFkIC1uIDEpIH4vY21ha2VfcGF0aC9jdGVzdAotICAgICAgLSBleHBvcnQgUEFUSD1+L2NtYWtlX3BhdGg6JHtQQVRIfQotICAgICAgLSBiYXNoIGdycGMvYnVpbGRfZ3JwYy5zaAotICAgICAgLSBjbWFrZSAuCi0gICAgICAgIC1EQ01BS0VfQlVJTERfVFlQRT0kQlVJTERfVFlQRQotICAgICAgICAtREZMQVRCVUZGRVJTX0JVSUxEX0dSUENURVNUPU9OCi0gICAgICAgIC1ER1JQQ19JTlNUQUxMX1BBVEg9JFRSQVZJU19CVUlMRF9ESVIvZ29vZ2xlL2dycGMvaW5zdGFsbAotICAgICAgICAtRFBST1RPQlVGX0RPV05MT0FEX1BBVEg9JFRSQVZJU19CVUlMRF9ESVIvZ29vZ2xlL2dycGMvdGhpcmRfcGFydHkvcHJvdG9idWYKLSAgICAgICAgLURGTEFUQlVGRkVSU19DT0RFX1NBTklUSVpFPU9OCi0gICAgICAtIGNtYWtlIC0tYnVpbGQgLiAtLSAtaiR7Sk9CU30KLSAgICAgIC0gRFlMRF9MSUJSQVJZX1BBVEg9JFRSQVZJU19CVUlMRF9ESVIvZ29vZ2xlL2dycGMvaW5zdGFsbC9saWIgY3Rlc3QgLS1leHRyYS12ZXJib3NlIC0tb3V0cHV0LW9uLWZhaWx1cmUKLQotICAgIC0gPDw6ICpjb25hbi1saW51eC1tYXN0ZXIKLSAgICAgIGVudjogQ09OQU5fR0NDX1ZFUlNJT05TPTggQ09OQU5fRE9DS0VSX0lNQUdFPWNvbmFuaW8vZ2NjOAotICAgIC0gPDw6ICpjb25hbi1saW51eAotICAgICAgZW52OiBDT05BTl9HQ0NfVkVSU0lPTlM9NC45IENPTkFOX0RPQ0tFUl9JTUFHRT1jb25hbmlvL2djYzQ5Ci0gICAgLSA8PDogKmNvbmFuLWxpbnV4Ci0gICAgICBlbnY6IENPTkFOX0dDQ19WRVJTSU9OUz01IENPTkFOX0RPQ0tFUl9JTUFHRT1jb25hbmlvL2djYzUKLSAgICAtIDw8OiAqY29uYW4tbGludXgKLSAgICAgIGVudjogQ09OQU5fR0NDX1ZFUlNJT05TPTYgQ09OQU5fRE9DS0VSX0lNQUdFPWNvbmFuaW8vZ2NjNgotICAgIC0gPDw6ICpjb25hbi1saW51eAotICAgICAgZW52OiBDT05BTl9HQ0NfVkVSU0lPTlM9NyBDT05BTl9ET0NLRVJfSU1BR0U9Y29uYW5pby9nY2M3Ci0gICAgLSA8PDogKmNvbmFuLWxpbnV4Ci0gICAgICBlbnY6IENPTkFOX0dDQ19WRVJTSU9OUz04IENPTkFOX0RPQ0tFUl9JTUFHRT1jb25hbmlvL2djYzgKLSAgICAtIDw8OiAqY29uYW4tbGludXgKLSAgICAgIGVudjogQ09OQU5fR0NDX1ZFUlNJT05TPTkgQ09OQU5fRE9DS0VSX0lNQUdFPWNvbmFuaW8vZ2NjOQotICAgIC0gPDw6ICpjb25hbi1saW51eAotICAgICAgZW52OiBDT05BTl9DTEFOR19WRVJTSU9OUz0zLjkgQ09OQU5fRE9DS0VSX0lNQUdFPWNvbmFuaW8vY2xhbmczOQotICAgIC0gPDw6ICpjb25hbi1saW51eAotICAgICAgZW52OiBDT05BTl9DTEFOR19WRVJTSU9OUz00LjAgQ09OQU5fRE9DS0VSX0lNQUdFPWNvbmFuaW8vY2xhbmc0MAotICAgIC0gPDw6ICpjb25hbi1saW51eAotICAgICAgZW52OiBDT05BTl9DTEFOR19WRVJTSU9OUz01LjAgQ09OQU5fRE9DS0VSX0lNQUdFPWNvbmFuaW8vY2xhbmc1MAotICAgIC0gPDw6ICpjb25hbi1saW51eAotICAgICAgZW52OiBDT05BTl9DTEFOR19WRVJTSU9OUz02LjAgQ09OQU5fRE9DS0VSX0lNQUdFPWNvbmFuaW8vY2xhbmc2MAotICAgIC0gPDw6ICpjb25hbi1saW51eAotICAgICAgZW52OiBDT05BTl9DTEFOR19WRVJTSU9OUz03LjAgQ09OQU5fRE9DS0VSX0lNQUdFPWNvbmFuaW8vY2xhbmc3Ci0gICAgLSA8PDogKmNvbmFuLWxpbnV4Ci0gICAgICBlbnY6IENPTkFOX0NMQU5HX1ZFUlNJT05TPTggQ09OQU5fRE9DS0VSX0lNQUdFPWNvbmFuaW8vY2xhbmc4Ci0gICAgLSA8PDogKmNvbmFuLW9zeAotICAgICAgb3N4X2ltYWdlOiB4Y29kZTcuMwotICAgICAgZW52OiBDT05BTl9BUFBMRV9DTEFOR19WRVJTSU9OUz03LjMKLSAgICAtIDw8OiAqY29uYW4tb3N4Ci0gICAgICBvc3hfaW1hZ2U6IHhjb2RlOC4zCi0gICAgICBlbnY6IENPTkFOX0FQUExFX0NMQU5HX1ZFUlNJT05TPTguMQotICAgIC0gPDw6ICpjb25hbi1vc3gKLSAgICAgIG9zeF9pbWFnZTogeGNvZGU5Ci0gICAgICBlbnY6IENPTkFOX0FQUExFX0NMQU5HX1ZFUlNJT05TPTkuMAotICAgIC0gPDw6ICpjb25hbi1vc3gKLSAgICAgIG9zeF9pbWFnZTogeGNvZGU5LjQKLSAgICAgIGVudjogQ09OQU5fQVBQTEVfQ0xBTkdfVkVSU0lPTlM9OS4xCi0gICAgLSA8PDogKmNvbmFuLW9zeAotICAgICAgb3N4X2ltYWdlOiB4Y29kZTEwLjIKLSAgICAgIGVudjogQ09OQU5fQVBQTEVfQ0xBTkdfVkVSU0lPTlM9MTAuMAotCi0gICAgLSBsYW5ndWFnZTogYW5kcm9pZAotICAgICAgc3VkbzogdHJ1ZQotICAgICAgZGlzdDogdHJ1c3R5Ci0gICAgICBhbmRyb2lkOgotICAgICAgICBjb21wb25lbnRzOgotICAgICAgICAgIC0gdG9vbHMKLSAgICAgICAgICAtIHBsYXRmb3JtLXRvb2xzCi0gICAgICAgICAgLSBleHRyYS1hbmRyb2lkLW0ycmVwb3NpdG9yeQotICAgICAgICBsaWNlbnNlczoKLSAgICAgICAgICAtICdhbmRyb2lkLXNkay1wcmV2aWV3LWxpY2Vuc2UtNTJkMTFjZDInCi0gICAgICAgICAgLSAnYW5kcm9pZC1zZGstbGljZW5zZS0uKycKLSAgICAgICAgICAtICdnb29nbGUtZ2RrLWxpY2Vuc2UtLisnCi0gICAgICBjb21waWxlcjoKLSAgICAgICAgLSBnY2MKLSAgICAgIGJlZm9yZV9pbnN0YWxsOgotICAgICAgICAtIGVjaG8geSB8IHNka21hbmFnZXIgInBsYXRmb3JtczthbmRyb2lkLTMwIgotICAgICAgICAtIGVjaG8geSB8IHNka21hbmFnZXIgImJ1aWxkLXRvb2xzOzMwLjAuMiIKLSAgICAgICAgLSBlY2hvIHkgfCBzZGttYW5hZ2VyICJuZGstYnVuZGxlIgotICAgICAgICAtIGVjaG8geSB8IHNka21hbmFnZXIgImNtYWtlOzMuNi40MTExNDU5IgotICAgICAgc2NyaXB0OgotICAgICAgICAtIGNtYWtlIC1ERkxBVEJVRkZFUlNfQlVJTERfVEVTVFM9T0ZGIC1ERkxBVEJVRkZFUlNfQlVJTERfRkxBVExJQj1PRkYgLURGTEFUQlVGRkVSU19CVUlMRF9GTEFUSEFTSD1PRkYgLjsgbWFrZTsgZXhwb3J0IFBBVEg9IiRQQVRIOiR7UFdEfSIKLSAgICAgICAgLSBjZCBhbmRyb2lkOyAuL2dyYWRsZXcgY2xlYW4gYnVpbGQKLQotICAgIC0gbGFuZ3VhZ2U6IGdlbmVyaWMKLSAgICAgIGlmOiB0eXBlIElOIChwdWxsX3JlcXVlc3QpCi0gICAgICBvczogbGludXgKLSAgICAgIGluc3RhbGw6Ci0gICAgICAgIC0gYmFzaCAudHJhdmlzL2Zvcm1hdF9pbnN0YWxsLnNoCi0KLSAgICAgIHNjcmlwdDoKLSAgICAgICAgLSBiYXNoIC50cmF2aXMvZm9ybWF0X2NoZWNrLnNoCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy8udHJhdmlzL2J1aWxkLWFuZC1ydW4tZG9ja2VyLXRlc3QtY29udGFpbmVycy5zaCBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzLy50cmF2aXMvYnVpbGQtYW5kLXJ1bi1kb2NrZXItdGVzdC1jb250YWluZXJzLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBkMzc3YmE4Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzLy50cmF2aXMvYnVpbGQtYW5kLXJ1bi1kb2NrZXItdGVzdC1jb250YWluZXJzLnNoCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotIyEvYmluL2Jhc2gKLSMKLSMgQ29weXJpZ2h0IDIwMTggR29vZ2xlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSMKLSMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0jIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLXNldCAtZQotCi1kb2NrZXIgYnVpbGQgLXQgYnVpbGRfY3BwX2ltYWdlIC1mIHRlc3RzL2RvY2tlci9Eb2NrZXJmaWxlLnRlc3RpbmcuY3BwLmRlYmlhbl9idXN0ZXIgLgotIyBSdW4gdGVzdHMgd2l0aCBzYW5pdGl6ZXJzICAoLS1jYXAtYWRkIFNZU19QVFJBQ0UpLCBib3RoIEdDQyBhbmQgQ2xhbmcuCi1jcHBfdGVzdF9hcmdzPSItLWNhcC1hZGQgU1lTX1BUUkFDRSBidWlsZF9jcHBfaW1hZ2Ugc2ggLi90ZXN0cy9kb2NrZXIvY3BwX3Rlc3QucnVuLnNoIERlYnVnIgotZG9ja2VyIHJ1biAtLXJtICRjcHBfdGVzdF9hcmdzCi1kb2NrZXIgcnVuIC0tcm0gLS1lbnYgQ0M9L3Vzci9iaW4vY2xhbmcgLS1lbnYgQ1hYPS91c3IvYmluL2NsYW5nKysgJGNwcF90ZXN0X2FyZ3MKLSMgQnVpbGQgZmxhdGMgb24gZGViaWFuIG9uY2UgdG8gc3BlZWQgdXAgdGhlIHRlc3QgbG9vcCBiZWxvdy4KLWRvY2tlciBydW4gLS1uYW1lIGZsYXRjX2NvbnRhaW5lciBidWlsZF9jcHBfaW1hZ2Ugc2ggLi90ZXN0cy9kb2NrZXIvYnVpbGRfZmxhdGMucnVuLnNoIERlYnVnCi0jIEFsbCBkZXBlbmRlbnQgZG9ja2VycyByZWZlciB0byAnZmxhdGNfZGViaWFuX3N0cmV0Y2gnLgotZG9ja2VyIGNwIGZsYXRjX2NvbnRhaW5lcjovZmxhdGJ1ZmZlcnMvZmxhdGMgZmxhdGNfZGViaWFuX3N0cmV0Y2gKLQotZm9yIGYgaW4gJChscyB0ZXN0cy9kb2NrZXIvbGFuZ3VhZ2VzIHwgc29ydCkKLWRvCi0gICAgICAgICMgZG9ja2VyIHB1bGwgc29tZXRpbWVzIGZhaWxzIGZvciB1bmtub3duIHJlYXNvbnMsIHByb2JhYmx5IHRyYXZpc2NpLXJlbGF0ZWQuIHRoaXMgcmV0cmllcyB0aGUgcHVsbCB3ZSBuZWVkIGEgZmV3IHRpbWVzLgotICAgICAgICBSRVFVSVJFRF9CQVNFX0lNQUdFPSQoY2F0IHRlc3RzL2RvY2tlci9sYW5ndWFnZXMvJHtmfSB8IGhlYWQgLW4gMSAgfCBhd2sgJyB7IHByaW50ICQyIH0gJykKLQotICAgICAgICBzZXQgK2UKLSAgICAgICAgbj0wCi0gICAgICAgIHVudGlsIFsgJG4gLWdlIDUgXQotICAgICAgICBkbwotICAgICAgICAgICBkb2NrZXIgcHVsbCAkUkVRVUlSRURfQkFTRV9JTUFHRSAmJiBicmVhawotICAgICAgICAgICBuPSRbJG4rMV0KLSAgICAgICAgICAgc2xlZXAgMQotICAgICAgICBkb25lCi0gICAgICAgIHNldCAtZQotCi0gICAgICAgIGRvY2tlciBidWlsZCAtdCAkKGVjaG8gJHtmfSB8IGN1dCAtZiAzLSAtZCAuKSAtZiB0ZXN0cy9kb2NrZXIvbGFuZ3VhZ2VzLyR7Zn0gLgotICAgICAgICBlY2hvICJURVNUIE9LOiAke2Z9IgotZG9uZQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvLnRyYXZpcy9jaGVjay1zb3VyY2VzLnNoIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvLnRyYXZpcy9jaGVjay1zb3VyY2VzLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZTZkYmYxLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzLy50cmF2aXMvY2hlY2stc291cmNlcy5zaAorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLSMhL2Jpbi9iYXNoCi0jCi0jIENvcHlyaWdodCAyMDE4IEdvb2dsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0jCi0jIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0jIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0jIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi1zZXQgLWUKLQotaWYgWyAtbiAiJDEiIF07IHRoZW4KLSAgc2Nhbl9kaXI9IiQxIgotZWxzZQotICBzY2FuX2Rpcj0iJCggcHdkICkiCi1maQotCi1weV9jaGVja2VyPSIkMC5weSIKLQotZWNobyAic2NhbiByb290IGRpcmVjdG9yeSA9ICckc2Nhbl9kaXInIgotcHl0aG9uMyAtLXZlcnNpb24KLSMgU2NhbiByZWN1cnNpdmVseSBhbmQgc2VhcmNoIGFsbCAqLmNwcCBhbmQgKi5oIGZpbGVzIHVzaW5nIHJlZ2V4IHBhdHRlcm5zLgotIyBBc3N1bWUgdGhhdCBzY3JpcHQgcnVubmluZyBmcm9tIGEgcm9vdCBvZiBGbGF0YnVmZmVycyB3b3JraW5nIGRpci4KLXB5dGhvbjMgJHB5X2NoZWNrZXIgImFzY2lpIiAiJHNjYW5fZGlyL2luY2x1ZGUiICJcLmgkIgotcHl0aG9uMyAkcHlfY2hlY2tlciAiYXNjaWkiICIkc2Nhbl9kaXIvc3JjIiAgICAgIlwuY3BwJCIKLXB5dGhvbjMgJHB5X2NoZWNrZXIgImFzY2lpIiAiJHNjYW5fZGlyL3Rlc3RzIiAgICJcLmgkIgotcHl0aG9uMyAkcHlfY2hlY2tlciAidXRmLTgiICIkc2Nhbl9kaXIvdGVzdHMiICAgIlwuY3BwJCIKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzLy50cmF2aXMvY2hlY2stc291cmNlcy5zaC5weSBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzLy50cmF2aXMvY2hlY2stc291cmNlcy5zaC5weQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmIwMDFkNy4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy8udHJhdmlzL2NoZWNrLXNvdXJjZXMuc2gucHkKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi1pbXBvcnQgb3MKLWltcG9ydCByZQotaW1wb3J0IHN5cwotCi1kZWYgY2hlY2tfZW5jb2RpbmcoZW5jb2RpbmcsIHNjYW5fZGlyLCByZWdleF9wYXR0ZXJuKToKLSAgZm5hbWUgPSBOb25lCi0gIHRyeToKLSAgICBhc3NlcnQgZW5jb2RpbmcgaW4gWydhc2NpaScsICd1dGYtOCddLCAidW5leHBlY3RlZCBlbmNvZGluZyIKLSAgICBjbXAgPSByZS5jb21waWxlKHJlZ2V4X3BhdHRlcm4pCi0gICAgZm9yIHJvb3QsIGRpcnMsIGZpbGVzIGluIG9zLndhbGsoc2Nhbl9kaXIpOgotICAgICAgZm5hbWUgPSByb290Ci0gICAgICBjbXBfbGlzdCA9IFtmIGZvciBmIGluIGZpbGVzIGlmIGNtcC5zZWFyY2goZikgaXMgbm90IE5vbmVdCi0gICAgICBmb3IgZiBpbiBjbXBfbGlzdDoKLSAgICAgICAgZm5hbWUgPSBvcy5wYXRoLmpvaW4ocm9vdCwgZikKLSAgICAgICAgd2l0aCBvcGVuKGZuYW1lLCBtb2RlPSdyYicpIGFzIHRlc3RfZmlsZToKLSAgICAgICAgICBidGV4dCA9IHRlc3RfZmlsZS5yZWFkKCkKLSAgICAgICAgIyBjaGVjayBlbmNvZGluZwotICAgICAgICBidGV4dC5kZWNvZGUoZW5jb2Rpbmc9ZW5jb2RpbmcsIGVycm9ycz0ic3RyaWN0IikKLSAgICAgICAgaWYgZW5jb2RpbmcgPT0gInV0Zi04IiBhbmQgYnRleHQuc3RhcnRzd2l0aChiJ1x4RUZceEJCXHhCRicpOgotICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoInVuZXhwZWN0ZWQgQk9NIGluIGZpbGUiKQotICAgICAgICAjIGNoZWNrIExGIGxpbmUgZW5kaW5ncwotICAgICAgICBMRiA9IGJ0ZXh0LmNvdW50KGInXG4nKQotICAgICAgICBDUiA9IGJ0ZXh0LmNvdW50KGInXHInKQotICAgICAgICBpZiBDUiE9MDoKLSAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJpbnZhbGlkIGxpbmUgZW5kaW5nczogTEYoe30pL0NSKHt9KSIuZm9ybWF0KExGLCBDUikpCi0gIGV4Y2VwdCBFeGNlcHRpb24gYXMgZXJyOgotICAgIHByaW50KCJFUlJPUiB3aXRoIFt7fV06IHt9Ii5mb3JtYXQoZm5hbWUsIGVycikpCi0gICAgcmV0dXJuIC0xCi0gIGVsc2U6Ci0gICAgcmV0dXJuIDAKLQotaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKLSAgIyBweXRob24gY2hlY2stc291cmNlcy5zaC5weSAnYXNjaWknICcuJyAnLipcLihjcHB8aCkkJwotICByZXMgPSBjaGVja19lbmNvZGluZyhzeXMuYXJndlsxXSwgc3lzLmFyZ3ZbMl0sIHN5cy5hcmd2WzNdKQotICBzeXMuZXhpdCgwIGlmIHJlcyA9PSAwIGVsc2UgLTEpCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy8udHJhdmlzL2RlcGxveS1weXRob24uc2ggYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy8udHJhdmlzL2RlcGxveS1weXRob24uc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDRjYzAzNDYuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvLnRyYXZpcy9kZXBsb3ktcHl0aG9uLnNoCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotIyEvYmluL2Jhc2gKLQotRElSPSIkKCBjZCAiJCggZGlybmFtZSAiJHtCQVNIX1NPVVJDRVswXX0iICkiICYmIHB3ZCApIgotUFJPRF9SRVBPU0lUT1JZPSJodHRwczovL3VwbG9hZC5weXBpLm9yZy9sZWdhY3kvIgotVEVTVF9SRVBPU0lUT1JZPSJodHRwczovL3Rlc3QucHlwaS5vcmcvbGVnYWN5LyIKLQotdHdpbmUgdXBsb2FkIFwKLSAgICAtLXVzZXJuYW1lICIkUFlQSV9VU0VSTkFNRSIgXAotICAgIC0tcGFzc3dvcmQgIiRQWVBJX1BBU1NXT1JEIiBcCi0gICAgLS1yZXBvc2l0b3J5LXVybCAiJFBST0RfUkVQT1NJVE9SWSIgXAotICAgICIkRElSLy4uL3B5dGhvbi9kaXN0LyIqCi0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzLy50cmF2aXMvZm9ybWF0X2NoZWNrLnNoIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvLnRyYXZpcy9mb3JtYXRfY2hlY2suc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiZDFkOWIuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvLnRyYXZpcy9mb3JtYXRfY2hlY2suc2gKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0jIS9iaW4vYmFzaAotIwotIyBDb3B5cmlnaHQgMjAyMSBHb29nbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotIwotIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0jIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0jIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0jIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1zZXQgLWUKLQotIyBIQUNLWSBzb2x1dGlvbiB0byBtYWtlIG5vZGVqcyB3b3JrLgotc291cmNlIH4vLm52bS9udm0uc2gKLW52bSBhbGlhcyBkZWZhdWx0IG5vZGUKLW52bSB1c2UgZGVmYXVsdAotCi1zaCBzY3JpcHRzL2NsYW5nLWZvcm1hdC1naXQuc2gKLQotIyBDaGVjayBmb3JtYXR0aW5nIGZvciBnbyBsYW5nCi0KLWNkIGdvCi1nb2ZtdCAtdyAuCi1jZCAuLgotY2QgZ3JwYy9leGFtcGxlcy9nbwotc2ggZm9ybWF0LnNoCi1jZCAuLi8uLi8uLgotCi1ub2RlX21vZHVsZXMvLmJpbi9lc2xpbnQgdHMvKiogLS1leHQgLnRzIC0tcXVpZXQgLS1maXgKLQotI1BZVEhPTiBJUyBESVNBQkxFRCBVTlRJTCBXRSBDUkVBVEUgQSAucHlsaW50cmMgRklMRSBGT1IgSVQKLXB5bGludCBweXRob24vKiogLS1kaXNhYmxlPWFsbAotCi1zd2lmdGZvcm1hdCAtLWNvbmZpZyBzd2lmdC5zd2lmdGZvcm1hdCAuCi0KLQotaWYgISBnaXQgZGlmZiAtLXF1aWV0OyB0aGVuCi0gIGVjaG8gPiYyCi0gIGVjaG8gIkVSUk9SOiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiIgPiYyCi0gIGVjaG8gIkVSUk9SOiBUaGUgZm9sbG93aW5nIGRpZmZlcmVuY2VzIHdlcmUgZm91bmQgYWZ0ZXIgcnVubmluZyIgPiYyCi0gIGVjaG8gIkVSUk9SOiAudHJhdmlzL2Zvcm1hdF9jaGVjay5zaCBzY3JpcHQuIE1heWJlIHlvdSBmb3Jnb3QgdG8gZm9ybWF0IiA+JjIKLSAgZWNobyAiRVJST1I6IHRoZSBjb2RlIGFmdGVyIG1ha2luZyBjaGFuZ2VzPyBwbGVhc2UgY2hlY2sgRm9ybWF0dGVycy5tZCIgPiYyCi0gIGVjaG8gIkVSUk9SOiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiIgPiYyCi0gIGVjaG8gPiYyCi0gIGdpdCBkaWZmIC0tYmluYXJ5IC0tZXhpdC1jb2RlCi1maQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzLy50cmF2aXMvZm9ybWF0X2luc3RhbGwuc2ggYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy8udHJhdmlzL2Zvcm1hdF9pbnN0YWxsLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NDkwOGQ1Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzLy50cmF2aXMvZm9ybWF0X2luc3RhbGwuc2gKKysrIC9kZXYvbnVsbApAQCAtMSw5MCArMCwwIEBACi0jIS9iaW4vYmFzaAotIwotIyBDb3B5cmlnaHQgMjAyMCBHb29nbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotIwotIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0jIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0jIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0jIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1zZXQgLWUKLXNldCAteAotCi0jIGluc3RhbGwgZGV2dG9vbHMKLWluc3RhbGxfbGFuZ3VhZ2VzKCkgewotICBzdWRvIGFwdCB1cGRhdGUKLQotICAjIEluc3RhbGwgbm9kZUpTIGFuZCB5YXJuCi0gIHdnZXQgaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL2NyZWF0aW9uaXgvbnZtL3YwLjMxLjAvbnZtLnNoIC1PIH4vLm52bS9udm0uc2gKLSAgc291cmNlIH4vLm52bS9udm0uc2gKLSAgbnZtIGluc3RhbGwgbm9kZQotICBub2RlIC0tdmVyc2lvbgotICBjdXJsIC1vLSAtTCBodHRwczovL3lhcm5wa2cuY29tL2luc3RhbGwuc2ggfCBiYXNoCi0gIGV4cG9ydCBQQVRIPSIkSE9NRS8ueWFybi9iaW46JFBBVEgiCi0gIHlhcm4gY29uZmlnIHNldCBwcmVmaXggfi8ueWFybiAtZwotICBleHBvcnQgUEFUSD0iJEhPTUUvLnlhcm4vYmluOiRIT01FLy5jb25maWcveWFybi9nbG9iYWwvbm9kZV9tb2R1bGVzLy5iaW46JFBBVEgiCi0KLSAgIyBJbnN0YWxsIHN3aWZ0Ci0gIHN1ZG8gYXB0LWdldCBpbnN0YWxsIFwKLSAgICAgICAgICBiaW51dGlscyBcCi0gICAgICAgICAgZ2l0IFwKLSAgICAgICAgICBsaWJjNi1kZXYgXAotICAgICAgICAgIGxpYmN1cmwzIFwKLSAgICAgICAgICBsaWJlZGl0MiBcCi0gICAgICAgICAgbGliZ2NjLTUtZGV2IFwKLSAgICAgICAgICBsaWJweXRob24yLjcgXAotICAgICAgICAgIGxpYnNxbGl0ZTMtMCBcCi0gICAgICAgICAgbGlic3RkYysrLTUtZGV2IFwKLSAgICAgICAgICBsaWJ4bWwyIFwKLSAgICAgICAgICBwa2ctY29uZmlnIFwKLSAgICAgICAgICB0emRhdGEgXAotICAgICAgICAgIHpsaWIxZy1kZXYKLQotICBTV0lGVF9VUkw9aHR0cHM6Ly9zd2lmdC5vcmcvYnVpbGRzL3N3aWZ0LTUuMy4xLXJlbGVhc2UvdWJ1bnR1MTYwNC9zd2lmdC01LjMuMS1SRUxFQVNFL3N3aWZ0LTUuMy4xLVJFTEVBU0UtdWJ1bnR1MTYuMDQudGFyLmd6Ci0gIGN1cmwgLWZTc0wgIiRTV0lGVF9VUkwiIC1vIHN3aWZ0LnRhci5negotCi0gIG1rZGlyIH4vc3dpZnRidWlsZAotICB0YXIgLXh2emYgc3dpZnQudGFyLmd6IC1DIH4vc3dpZnRidWlsZAotCi0gIGV4cG9ydCBQQVRIPSJ+L3N3aWZ0YnVpbGQvc3dpZnQtNS4zLjEtUkVMRUFTRS11YnVudHUxNi4wNC91c3IvYmluOiRQQVRIIgotCi0KLSAgbWtkaXIgfi9nb2J1aWxkCi0gIHdnZXQgLWMgaHR0cHM6Ly9nb2xhbmcub3JnL2RsL2dvMS4xNS4yLmxpbnV4LWFtZDY0LnRhci5negotICB0YXIgLXh2emYgZ28xLjE1LjIubGludXgtYW1kNjQudGFyLmd6IC1DIH4vZ29idWlsZAotCi0gIGV4cG9ydCAgUEFUSD0ifi9nb2J1aWxkL2dvL2JpbjokUEFUSCIKLQotICBzd2lmdCAtLXZlcnNpb24KLSAgZ28gdmVyc2lvbgotICB5YXJuIC12Ci0gIG5vZGUgLXYKLX0KLQotaW5zdGFsbF9mb3JtYXR0ZXJzKCkgewotICAjIGluc3RhbGxpbmcgc3dpZnQgZm9ybWF0dGVyCi0gIGdpdCBjbG9uZSAtLWRlcHRoIDEgLS1icmFuY2ggMC40Ny40IGh0dHBzOi8vZ2l0aHViLmNvbS9uaWNrbG9ja3dvb2QvU3dpZnRGb3JtYXQuZ2l0Ci0gIGNkIFN3aWZ0Rm9ybWF0Ci0gIHN3aWZ0IGJ1aWxkIC1jIHJlbGVhc2UKLSAgc3VkbyBjcCAuYnVpbGQvcmVsZWFzZS9zd2lmdGZvcm1hdCAvdXNyL2xvY2FsL2Jpbi9zd2lmdGZvcm1hdAotICBjZCAuLgotCi0gIHdoaWNoIHlhcm4KLSAgd2hpY2ggbm9kZQotICB5YXJuIC12Ci0gIG5vZGUgLXYKLQotICB5YXJuIGluc3RhbGwKLSAgcGlwIGluc3RhbGwgcHlsaW50Ci19Ci0KLWluc3RhbGxfbGFuZ3VhZ2VzCi1leHBvcnQgUEFUSD0ifi9zd2lmdC9zd2lmdC91c3IvYmluOiRQQVRIIgotaW5zdGFsbF9mb3JtYXR0ZXJzClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvQlVJTEQuYmF6ZWwgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy9CVUlMRC5iYXplbAppbmRleCAxMWNjN2YxLi42ZjkyZWVjIDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy9CVUlMRC5iYXplbAorKysgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy9CVUlMRC5iYXplbApAQCAtNTAsNiArNTAsNyBAQAogICAgICAgICAiaW5jbHVkZS9mbGF0YnVmZmVycy9kZXRhY2hlZF9idWZmZXIuaCIsCiAgICAgICAgICJpbmNsdWRlL2ZsYXRidWZmZXJzL2ZsYXRidWZmZXJfYnVpbGRlci5oIiwKICAgICAgICAgImluY2x1ZGUvZmxhdGJ1ZmZlcnMvZmxhdGJ1ZmZlcnMuaCIsCisgICAgICAgICJpbmNsdWRlL2ZsYXRidWZmZXJzL2ZsZXhfZmxhdF91dGlsLmgiLAogICAgICAgICAiaW5jbHVkZS9mbGF0YnVmZmVycy9mbGV4YnVmZmVycy5oIiwKICAgICAgICAgImluY2x1ZGUvZmxhdGJ1ZmZlcnMvZ3JwYy5oIiwKICAgICAgICAgImluY2x1ZGUvZmxhdGJ1ZmZlcnMvaGFzaC5oIiwKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL0NIQU5HRUxPRy5tZCBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL0NIQU5HRUxPRy5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNGMzMmQ0Ci0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvQ0hBTkdFTE9HLm1kCkBAIC0wLDAgKzEsMzYgQEAKKyMgRmxhdGJ1ZmZlcnMgQ2hhbmdlIExvZworCitBbGwgbWFqb3Igb3IgYnJlYWtpbmcgY2hhbmdlcyB3aWxsIGJlIGRvY3VtZW50ZWQgaW4gdGhpcyBmaWxlLCBhcyB3ZWxsIGFzIGFueQorbmV3IGZlYXR1cmVzIHRoYXQgc2hvdWxkIGJlIGhpZ2hsaWdodGVkLiBNaW5vciBmaXhlcyBvciBpbXByb3ZlbWVudHMgYXJlIG5vdAorbmVjZXNzYXJpbHkgbGlzdGVkLgorCisjIyAyLjAuOCAoQXVnIDI5IDIwMjIpCisKKyogRml4IGZvciBgLS1rZWVwLXByZWZpeGAgdGhlIHdhcyBnZW5lcmF0aW5nIHRoZSB3cm9uZyBpbmNsdWRlIHN0YXRlbWVudHMgZm9yCitDKysgKCM3NDY5KS4gVGhlIGJ1ZyB3YXMgaW50cm9kdWNlZCBpbiAyLjAuNy4KKworKiBBZGRlZCB0aGUgYFZlcmlmaWVyOjpPcHRpb25zYCBvcHRpb24gc3RydWN0IHRvIGFsbG93IHNwZWNpZnlpbmcgcnVudGltZQorY29uZmlndXJhdGlvbiBzZXR0aW5ncyBmb3IgdGhlIHZlcmlmaWVyICgjNzQ4OSkuIFRoaXMgYWxsb3dzIHRvIHNraXAgdmVyaWZ5aW5nCituZXN0ZWQgZmxhdGJ1ZmZlcnMsIGEgb24tYnktZGVmYXVsdCBjaGFuZ2UgdGhhdCB3YXMgaW50cm9kdWNlZCBpbiAyLjAuNy4gVGhpcworZGVwcmVjYXRlcyB0aGUgZXhpc3RpbmcgYFZlcmlmaWVyYCBjb25zdHJ1Y3Rvciwgd2hpY2ggbWF5IGJlIHJlbW92ZWQgaW4gYSBmdXR1cmUKK3ZlcnNpb24uCisKKyogUmVmYWN0b3Igb2YgYHRlc3RzL3Rlc3QuY3BwYCB0aGF0IGxlYWQgdG8gfjEwJSBzcGVlZHVwIGluIGNvbXBpbGF0aW9uIG9mIHRoZQorZW50aXJlIHByb2plY3QgKCM3NDg3KS4KKworIyMgMi4wLjcgKEF1ZyAyMiAyMDIyKQorCisqIFRoaXMgaXMgdGhlIGZpcnN0IHZlcnNpb24gd2l0aCBhbiBleHBsaWNpdCBjaGFuZ2UgbG9nLCBzbyBhbGwgdGhlIHByZXZpb3VzCitmZWF0dXJlcyB3aWxsIG5vdCBiZSBsaXN0ZWQuCisKKyogVmVyaWZpZXIgbm93IGNoZWNrcyB0aGF0IGJ1ZmZlcnMgYXJlIGF0IGxlYXN0IHRoZSBtaW5pbXVtIHNpemUgcmVxdWlyZWQgdG8gYmUKK2EgZmxhdGJ1ZmZlcnMgKDEyIGJ5dGVzKS4gVGhpcyBpbmNsdWRlcyBuZXN0ZWQgZmxhdGJ1ZmZlcnMsIHdoaWNoIHByZXZpb3VzbHkKK2NvdWxkIGJlIGRlY2xhcmVkIHZhbGlkIGF0IHNpemUgMC4KKworKiBBbm5vdGF0ZWQgYmluYXJpZXMuIEdpdmVuIGEgZmxhdGJ1ZmZlciBiaW5hcnkgYW5kIGEgc2NoZW1hIChvciBiaW5hcnkgc2NoZW1hKQorb25lIGNhbiBnZW5lcmF0ZSBhbiBhbm5vdGF0ZWQgZmxhdGJ1ZmZlciAoLmFmYikgdG8gZGVzY3JpYmUgZWFjaCBieXRlIGluIHRoZQorYmluYXJ5IHdpdGggc2NoZW1hIG1ldGFkYXRhIGFuZCB2YWx1ZS4KKworKiBGaXJzdCBiaW5hcnkgc2NoZW1hIGdlbmVyYXRvciAoTHVhKSB0byBnZW5lcmF0ZSBMdWEgY29kZSB2aWEgYSAuYmZicyBmaWxlLiAKK1RoaXMgaXMgbW9zdGx5IGFuIGltcGxlbWVudGF0aW9uIGRldGFpbCBvZiBmbGF0YyBpbnRlcm5hbHMsIGJ1dCB3aWxsIGJlIHNsb3dseQorYXBwbGllZCB0byB0aGUgb3RoZXIgbGFuZ3VhZ2UgZ2VuZXJhdG9ycy4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy9DTWFrZS9DTWFrZUxpc3RzX2xlZ2FjeS5jbWFrZS5pbiBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL0NNYWtlL0NNYWtlTGlzdHNfbGVnYWN5LmNtYWtlLmluCmluZGV4IDBhMGVmZDMuLjllMWFmMmIgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL0NNYWtlL0NNYWtlTGlzdHNfbGVnYWN5LmNtYWtlLmluCisrKyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL0NNYWtlL0NNYWtlTGlzdHNfbGVnYWN5LmNtYWtlLmluCkBAIC04LDEwICs4LDE2IEBACiAKIGlmIChQT0xJQ1kgQ01QMDA0OCkKICAgY21ha2VfcG9saWN5KFNFVCBDTVAwMDQ4IE5FVykKLSAgcHJvamVjdChGbGF0QnVmZmVycwotICAgICAgICBERVNDUklQVElPTiAiRmxhdGJ1ZmZlcnMgc2VyaWFsaXphdGlvbiBsaWJyYXJ5IgotICAgICAgICBWRVJTSU9OIDIuMC4wCi0gICAgICAgIExBTkdVQUdFUyBDWFgpCisgIGlmKENNQUtFX1ZFUlNJT04gVkVSU0lPTl9MRVNTIDMuOSkKKyAgICBwcm9qZWN0KEZsYXRCdWZmZXJzCisgICAgICBWRVJTSU9OIDIuMC4wCisgICAgICBMQU5HVUFHRVMgQ1hYKQorICBlbHNlKCkKKyAgICBwcm9qZWN0KEZsYXRCdWZmZXJzCisgICAgICBERVNDUklQVElPTiAiRmxhdGJ1ZmZlcnMgc2VyaWFsaXphdGlvbiBsaWJyYXJ5IgorICAgICAgVkVSU0lPTiAyLjAuMAorICAgICAgTEFOR1VBR0VTIENYWCkKKyAgZW5kaWYoKQogZWxzZSgpCiAgIHByb2plY3QoRmxhdEJ1ZmZlcnMpCiBlbmRpZiAoUE9MSUNZIENNUDAwNDgpCkBAIC02NDgsMjggKzY1NCwyOCBAQAogCiAgIHNldChGQl9DTUFLRV9ESVIgIiR7Q01BS0VfSU5TVEFMTF9MSUJESVJ9L2NtYWtlL2ZsYXRidWZmZXJzIikKIAotICBjb25maWd1cmVfZmlsZShDTWFrZS9GbGF0YnVmZmVyc0NvbmZpZ1ZlcnNpb24uY21ha2UuaW4gRmxhdGJ1ZmZlcnNDb25maWdWZXJzaW9uLmNtYWtlIEBPTkxZKQorICBjb25maWd1cmVfZmlsZShDTWFrZS9mbGF0YnVmZmVycy1jb25maWctdmVyc2lvbi5jbWFrZS5pbiBmbGF0YnVmZmVycy1jb25maWctdmVyc2lvbi5jbWFrZSBAT05MWSkKICAgaW5zdGFsbCgKLSAgICAgIEZJTEVTICJDTWFrZS9GbGF0YnVmZmVyc0NvbmZpZy5jbWFrZSIgIiR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS9GbGF0YnVmZmVyc0NvbmZpZ1ZlcnNpb24uY21ha2UiCisgICAgICBGSUxFUyAiQ01ha2UvZmxhdGJ1ZmZlcnMtY29uZmlnLmNtYWtlIiAiJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L2ZsYXRidWZmZXJzLWNvbmZpZy12ZXJzaW9uLmNtYWtlIgogICAgICAgREVTVElOQVRJT04gJHtGQl9DTUFLRV9ESVJ9CiAgICkKIAogICBpZihGTEFUQlVGRkVSU19CVUlMRF9GTEFUTElCKQogICAgIGlmKENNQUtFX1ZFUlNJT04gVkVSU0lPTl9MRVNTIDMuMCkKICAgICAgIGluc3RhbGwoCi0gICAgICAgIFRBUkdFVFMgZmxhdGJ1ZmZlcnMgRVhQT1JUIEZsYXRidWZmZXJzVGFyZ2V0cworICAgICAgICBUQVJHRVRTIGZsYXRidWZmZXJzIEVYUE9SVCBGbGF0QnVmZmVyc1RhcmdldHMKICAgICAgICAgQVJDSElWRSBERVNUSU5BVElPTiAke0NNQUtFX0lOU1RBTExfTElCRElSfQogICAgICAgKQogICAgIGVsc2UoKQogICAgICAgaW5zdGFsbCgKLSAgICAgICAgVEFSR0VUUyBmbGF0YnVmZmVycyBFWFBPUlQgRmxhdGJ1ZmZlcnNUYXJnZXRzCisgICAgICAgIFRBUkdFVFMgZmxhdGJ1ZmZlcnMgRVhQT1JUIEZsYXRCdWZmZXJzVGFyZ2V0cwogICAgICAgICBBUkNISVZFIERFU1RJTkFUSU9OICR7Q01BS0VfSU5TVEFMTF9MSUJESVJ9CiAgICAgICAgIElOQ0xVREVTIERFU1RJTkFUSU9OICR7Q01BS0VfSU5TVEFMTF9JTkNMVURFRElSfQogICAgICAgKQogICAgIGVuZGlmKCkKIAotICAgIGluc3RhbGwoRVhQT1JUIEZsYXRidWZmZXJzVGFyZ2V0cwotICAgICAgRklMRSBGbGF0YnVmZmVyc1RhcmdldHMuY21ha2UKKyAgICBpbnN0YWxsKEVYUE9SVCBGbGF0QnVmZmVyc1RhcmdldHMKKyAgICAgIEZJTEUgRmxhdEJ1ZmZlcnNUYXJnZXRzLmNtYWtlCiAgICAgICBOQU1FU1BBQ0UgZmxhdGJ1ZmZlcnM6OgogICAgICAgREVTVElOQVRJT04gJHtGQl9DTUFLRV9ESVJ9CiAgICAgKQpAQCAtNjkyLDE0ICs2OTgsMTQgQEAKICAgaWYoRkxBVEJVRkZFUlNfQlVJTERfU0hBUkVETElCKQogICAgIGlmKENNQUtFX1ZFUlNJT04gVkVSU0lPTl9MRVNTIDMuMCkKICAgICAgIGluc3RhbGwoCi0gICAgICAgIFRBUkdFVFMgZmxhdGJ1ZmZlcnNfc2hhcmVkIEVYUE9SVCBGbGF0YnVmZmVyc1NoYXJlZFRhcmdldHMKKyAgICAgICAgVEFSR0VUUyBmbGF0YnVmZmVyc19zaGFyZWQgRVhQT1JUIEZsYXRCdWZmZXJzU2hhcmVkVGFyZ2V0cwogICAgICAgICBBUkNISVZFIERFU1RJTkFUSU9OICR7Q01BS0VfSU5TVEFMTF9MSUJESVJ9CiAgICAgICAgIFJVTlRJTUUgREVTVElOQVRJT04gJHtDTUFLRV9JTlNUQUxMX0xJQkRJUn0KICAgICAgICAgTElCUkFSWSBERVNUSU5BVElPTiAke0NNQUtFX0lOU1RBTExfTElCRElSfQogICAgICAgKQogICAgIGVsc2UoKQogICAgICAgaW5zdGFsbCgKLSAgICAgICAgVEFSR0VUUyBmbGF0YnVmZmVyc19zaGFyZWQgRVhQT1JUIEZsYXRidWZmZXJzU2hhcmVkVGFyZ2V0cworICAgICAgICBUQVJHRVRTIGZsYXRidWZmZXJzX3NoYXJlZCBFWFBPUlQgRmxhdEJ1ZmZlcnNTaGFyZWRUYXJnZXRzCiAgICAgICAgIEFSQ0hJVkUgREVTVElOQVRJT04gJHtDTUFLRV9JTlNUQUxMX0xJQkRJUn0KICAgICAgICAgUlVOVElNRSBERVNUSU5BVElPTiAke0NNQUtFX0lOU1RBTExfTElCRElSfQogICAgICAgICBMSUJSQVJZIERFU1RJTkFUSU9OICR7Q01BS0VfSU5TVEFMTF9MSUJESVJ9CkBAIC03MDgsOCArNzE0LDggQEAKICAgICBlbmRpZigpCiAKICAgaW5zdGFsbCgKLSAgICAgIEVYUE9SVCBGbGF0YnVmZmVyc1NoYXJlZFRhcmdldHMKLSAgICAgIEZJTEUgRmxhdGJ1ZmZlcnNTaGFyZWRUYXJnZXRzLmNtYWtlCisgICAgICBFWFBPUlQgRmxhdEJ1ZmZlcnNTaGFyZWRUYXJnZXRzCisgICAgICBGSUxFIEZsYXRCdWZmZXJzU2hhcmVkVGFyZ2V0cy5jbWFrZQogICAgICAgTkFNRVNQQUNFIGZsYXRidWZmZXJzOjoKICAgICAgIERFU1RJTkFUSU9OICR7RkJfQ01BS0VfRElSfQogICAgICkKQEAgLTc3MSw0ICs3NzcsNCBAQAogdGFyZ2V0X2luY2x1ZGVfZGlyZWN0b3JpZXMoCiAgIEZsYXRCdWZmZXJzCiAgIElOVEVSRkFDRSAkPEJVSUxEX0lOVEVSRkFDRToke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vaW5jbHVkZT4KLSAgICAgICAgICAgICQ8SU5TVEFMTF9JTlRFUkZBQ0U6JHtDTUFLRV9JTlNUQUxMX0lOQ0xVREVESVJ9L2luY2x1ZGU+KQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKKyAgICAgICAgICAgICQ8SU5TVEFMTF9JTlRFUkZBQ0U6JHtDTUFLRV9JTlNUQUxMX0lOQ0xVREVESVJ9L2luY2x1ZGU+KQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvQ01ha2UvRmxhdGJ1ZmZlcnNDb25maWcuY21ha2UgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy9DTWFrZS9GbGF0YnVmZmVyc0NvbmZpZy5jbWFrZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTA3ZDc4ZS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy9DTWFrZS9GbGF0YnVmZmVyc0NvbmZpZy5jbWFrZQorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotaW5jbHVkZSgiJHtDTUFLRV9DVVJSRU5UX0xJU1RfRElSfS9GbGF0YnVmZmVyc1RhcmdldHMuY21ha2UiIE9QVElPTkFMKQotaW5jbHVkZSgiJHtDTUFLRV9DVVJSRU5UX0xJU1RfRElSfS9GbGF0Y1RhcmdldHMuY21ha2UiIE9QVElPTkFMKQotaW5jbHVkZSgiJHtDTUFLRV9DVVJSRU5UX0xJU1RfRElSfS9GbGF0YnVmZmVyc1NoYXJlZFRhcmdldHMuY21ha2UiIE9QVElPTkFMKQotCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy9DTWFrZS9WZXJzaW9uLmNtYWtlIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvQ01ha2UvVmVyc2lvbi5jbWFrZQppbmRleCA0ODI1ZDE4Li5lNmY0YjRjIDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy9DTWFrZS9WZXJzaW9uLmNtYWtlCisrKyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL0NNYWtlL1ZlcnNpb24uY21ha2UKQEAgLTEsNiArMSw2IEBACiBzZXQoVkVSU0lPTl9NQUpPUiAyKQogc2V0KFZFUlNJT05fTUlOT1IgMCkKLXNldChWRVJTSU9OX1BBVENIIDYpCitzZXQoVkVSU0lPTl9QQVRDSCA4KQogc2V0KFZFUlNJT05fQ09NTUlUIDApCiAKIGZpbmRfcHJvZ3JhbShHSVQgZ2l0KQpAQCAtMTQsMTAgKzE0LDE5IEBACiAgICkKIAogICBpZihHSVRfREVTQ1JJQkVfUkVTVUxUIEVRVUFMIDApCi0gICAgc3RyaW5nKFJFR0VYIFJFUExBQ0UgIl52KFswLTldKylcXC4uKiIgIlxcMSIgVkVSU0lPTl9NQUpPUiAiJHtHSVRfREVTQ1JJQkVfRElSVFl9IikKLSAgICBzdHJpbmcoUkVHRVggUkVQTEFDRSAiXnZbMC05XStcXC4oWzAtOV0rKS4qIiAiXFwxIiBWRVJTSU9OX01JTk9SICIke0dJVF9ERVNDUklCRV9ESVJUWX0iKQotICAgIHN0cmluZyhSRUdFWCBSRVBMQUNFICJedlswLTldK1xcLlswLTldK1xcLihbMC05XSspLioiICJcXDEiIFZFUlNJT05fUEFUQ0ggIiR7R0lUX0RFU0NSSUJFX0RJUlRZfSIpCi0gICAgc3RyaW5nKFJFR0VYIFJFUExBQ0UgIl52WzAtOV0rXFwuWzAtOV0rXFwuWzAtOV0rXFwtKFswLTldKykuKiIgIlxcMSIgVkVSU0lPTl9DT01NSVQgIiR7R0lUX0RFU0NSSUJFX0RJUlRZfSIpCisgICAgIyBUZXN0IGlmIHRoZSBtb3N0IHJlY2VudCBHaXQgdGFnIG1hdGNoZXMgdGhlIHBhdHRlcm4gInY8bWFqb3I+LjxtaW5vcj4uPHBhdGNoPioiCisgICAgaWYoR0lUX0RFU0NSSUJFX0RJUlRZIE1BVENIRVMgIl52WzAtOV0rXFwuWzAtOV0rXFwuWzAtOV0rLioiKQorICAgICAgc3RyaW5nKFJFR0VYIFJFUExBQ0UgIl52KFswLTldKylcXC4uKiIgIlxcMSIgVkVSU0lPTl9NQUpPUiAiJHtHSVRfREVTQ1JJQkVfRElSVFl9IikKKyAgICAgIHN0cmluZyhSRUdFWCBSRVBMQUNFICJedlswLTldK1xcLihbMC05XSspLioiICJcXDEiIFZFUlNJT05fTUlOT1IgIiR7R0lUX0RFU0NSSUJFX0RJUlRZfSIpCisgICAgICBzdHJpbmcoUkVHRVggUkVQTEFDRSAiXnZbMC05XStcXC5bMC05XStcXC4oWzAtOV0rKS4qIiAiXFwxIiBWRVJTSU9OX1BBVENIICIke0dJVF9ERVNDUklCRV9ESVJUWX0iKQorICAgICAgc3RyaW5nKFJFR0VYIFJFUExBQ0UgIl52WzAtOV0rXFwuWzAtOV0rXFwuWzAtOV0rXFwtKFswLTldKykuKiIgIlxcMSIgVkVSU0lPTl9DT01NSVQgIiR7R0lUX0RFU0NSSUJFX0RJUlRZfSIpCisgICAgICAjIElmIHRoZSB0YWcgcG9pbnRzIHRvIHRoZSBjb21taXQsIHRoZW4gb25seSB0aGUgdGFnIGlzIHNob3duIGluICJnaXQgZGVzY3JpYmUiCisgICAgICBpZihWRVJTSU9OX0NPTU1JVCBTVFJFUVVBTCBHSVRfREVTQ1JJQkVfRElSVFkpCisgICAgICAgIHNldChWRVJTSU9OX0NPTU1JVCAwKQorICAgICAgZW5kaWYoKQorICAgIGVsc2UoKQorICAgICAgbWVzc2FnZShXQVJOSU5HICJcIiR7R0lUX0RFU0NSSUJFX0RJUlRZfVwiIGRvZXMgbm90IG1hdGNoIHBhdHRlcm4gdjxtYWpvcj4uPG1pbm9yPi48cGF0Y2g+LTxjb21taXQ+IikKKyAgICBlbmRpZigpCiAgIGVsc2UoKQogICAgIG1lc3NhZ2UoV0FSTklORyAiZ2l0IGRlc2NyaWJlIGZhaWxlZCB3aXRoIGV4aXQgY29kZTogJHtHSVRfREVTQ1JJQkVfUkVTVUxUfSIpCiAgIGVuZGlmKCkKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL0NNYWtlL0ZsYXRidWZmZXJzQ29uZmlnVmVyc2lvbi5jbWFrZS5pbiBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL0NNYWtlL2ZsYXRidWZmZXJzLWNvbmZpZy12ZXJzaW9uLmNtYWtlLmluCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSB0aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy9DTWFrZS9GbGF0YnVmZmVyc0NvbmZpZ1ZlcnNpb24uY21ha2UuaW4KcmVuYW1lIHRvIHRoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL0NNYWtlL2ZsYXRidWZmZXJzLWNvbmZpZy12ZXJzaW9uLmNtYWtlLmluCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy9DTWFrZS9mbGF0YnVmZmVycy1jb25maWcuY21ha2UgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy9DTWFrZS9mbGF0YnVmZmVycy1jb25maWcuY21ha2UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTkyZmM3OQotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL0NNYWtlL2ZsYXRidWZmZXJzLWNvbmZpZy5jbWFrZQpAQCAtMCwwICsxLDMgQEAKK2luY2x1ZGUoIiR7Q01BS0VfQ1VSUkVOVF9MSVNUX0RJUn0vRmxhdEJ1ZmZlcnNUYXJnZXRzLmNtYWtlIiBPUFRJT05BTCkKK2luY2x1ZGUoIiR7Q01BS0VfQ1VSUkVOVF9MSVNUX0RJUn0vRmxhdGNUYXJnZXRzLmNtYWtlIiBPUFRJT05BTCkKK2luY2x1ZGUoIiR7Q01BS0VfQ1VSUkVOVF9MSVNUX0RJUn0vRmxhdEJ1ZmZlcnNTaGFyZWRUYXJnZXRzLmNtYWtlIiBPUFRJT05BTCkKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL0NNYWtlTGlzdHMudHh0IGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvQ01ha2VMaXN0cy50eHQKaW5kZXggOWJmMDdmZS4uZjVhZTVhYyAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvQ01ha2VMaXN0cy50eHQKKysrIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvQ01ha2VMaXN0cy50eHQKQEAgLTc0LDkgKzc0LDI2IEBACiBvcHRpb24oRkxBVEJVRkZFUlNfU0tJUF9NT05TVEVSX0VYVFJBIAogICAgICAgIlNraXAgZ2VuZXJhdGluZyBtb25zdGVyX2V4dHJhLmZicyB0aGF0IGNvbnRhaW5zIG5vbi1zdXBwb3J0ZWQgbnVtZXJpY2FsXCIKICAgICAgIHR5cGVzLiIgT0ZGKQotb3B0aW9uKEZMQVRCVUZGRVJTX09TWF9CVUlMRF9VTklWRVJTQUwKLSAgICAgICJFbmFibGUgdGhlIGJ1aWxkIGZvciBtdWx0aXBsZSBhcmNoaXRlY3R1cmVzIG9uIE9TIFggKGFybTY0LCB4ODZfNjQpLiIKLSAgICAgIE9OKQorb3B0aW9uKEZMQVRCVUZGRVJTX1NUUklDVF9NT0RFIAorICAgICAgIkJ1aWxkIGZsYXRidWZmZXJzIHdpdGggYWxsIHdhcm5pbmdzIGFzIGVycm9ycyAoLVdlcnJvciBvciAvV1gpLiIKKyAgICAgIE9GRikKKworaWYoTk9UIERFRklORUQgRkxBVEJVRkZFUlNfQ1BQX1NURCkKKyAgc2V0KEZMQVRCVUZGRVJTX0NQUF9TVEQgMTEpCitlbmRpZigpCisKK3NldChNU1ZDX0xJS0UgT0ZGKQoraWYoTVNWQyBPUiBDTUFLRV9DWFhfQ09NUElMRVJfRlJPTlRFTkRfVkFSSUFOVCBTVFJFUVVBTCAiTVNWQyIpCisgICAgc2V0KE1TVkNfTElLRSBPTikKK2VuZGlmKCkKKworaWYoREVGSU5FRCBGTEFUQlVGRkVSU19DT01QSUxBVElPTl9USU1JTkdTKQorICBtZXNzYWdlKCJSZWNvcmRpbmcgQ29tcGlsYXRpb24gVGltaW5ncyB0byAke0ZMQVRCVUZGRVJTX0NPTVBJTEFUSU9OX1RJTUlOR1N9IikKKyAgZmlsZShSRU1PVkUgJHtGTEFUQlVGRkVSU19DT01QSUxBVElPTl9USU1JTkdTfSkKKyAgc2V0X3Byb3BlcnR5KEdMT0JBTCBQUk9QRVJUWSBSVUxFX0xBVU5DSF9DT01QSUxFICJ0aW1lIC1mICdXYWxsOiAlRSBVc2VyOiAlVSBTeXM6ICVTIHwgJUMnIC1xIC1hIC1vICR7RkxBVEJVRkZFUlNfQ09NUElMQVRJT05fVElNSU5HU30iKQorICBzZXRfcHJvcGVydHkoR0xPQkFMIFBST1BFUlRZIFJVTEVfTEFVTkNIX0NVU1RPTSAidGltZSAtZiAnV2FsbDogJUUgVXNlcjogJVUgU3lzOiAlUyB8ICVDJyAtcSAtYSAtbyAke0ZMQVRCVUZGRVJTX0NPTVBJTEFUSU9OX1RJTUlOR1N9IikKKyAgc2V0X3Byb3BlcnR5KEdMT0JBTCBQUk9QRVJUWSBSVUxFX0xBVU5DSF9MSU5LICJ0aW1lIC1mICdXYWxsOiAlRSBVc2VyOiAlVSBTeXM6ICVTIHwgJUMnIC1xIC1hIC1vICR7RkxBVEJVRkZFUlNfQ09NUElMQVRJT05fVElNSU5HU30iKQorZW5kaWYoKQogCiBpZihOT1QgRkxBVEJVRkZFUlNfQlVJTERfRkxBVEMgQU5EIEZMQVRCVUZGRVJTX0JVSUxEX1RFU1RTKQogICAgIG1lc3NhZ2UoV0FSTklORwpAQCAtOTUsNyArMTEyLDcgQEAKICAgaW5jbHVkZShDaGVja0NYWFN5bWJvbEV4aXN0cykKIAogICBzZXQoRkxBVEJVRkZFUlNfTE9DQUxFX0lOREVQRU5ERU5UIDApCi0gIGlmKE1TVkMpCisgIGlmKE1TVkNfTElLRSkKICAgICBjaGVja19jeHhfc3ltYm9sX2V4aXN0cyhfc3RydG9mX2wgc3RkbGliLmggRkxBVEJVRkZFUlNfSEFTX1NUUlRPRl9MKQogICAgIGNoZWNrX2N4eF9zeW1ib2xfZXhpc3RzKF9zdHJ0b3VpNjRfbCBzdGRsaWIuaCBGTEFUQlVGRkVSU19IQVNfU1RSVE9VTExfTCkKICAgZWxzZSgpCkBAIC0xMjAsNiArMTM3LDcgQEAKICAgaW5jbHVkZS9mbGF0YnVmZmVycy9mbGF0YnVmZmVyX2J1aWxkZXIuaAogICBpbmNsdWRlL2ZsYXRidWZmZXJzL2ZsYXRidWZmZXJzLmgKICAgaW5jbHVkZS9mbGF0YnVmZmVycy9mbGV4YnVmZmVycy5oCisgIGluY2x1ZGUvZmxhdGJ1ZmZlcnMvZmxleF9mbGF0X3V0aWwuaAogICBpbmNsdWRlL2ZsYXRidWZmZXJzL2hhc2guaAogICBpbmNsdWRlL2ZsYXRidWZmZXJzL2lkbC5oCiAgIGluY2x1ZGUvZmxhdGJ1ZmZlcnMvbWluaXJlZmxlY3QuaApAQCAtMTU4LDExICsxNzYsMTggQEAKICAgc3JjL2lkbF9nZW5fZ3JwYy5jcHAKICAgc3JjL2lkbF9nZW5fanNvbl9zY2hlbWEuY3BwCiAgIHNyYy9pZGxfZ2VuX3N3aWZ0LmNwcAorICBzcmMvaWRsX25hbWVyLmgKKyAgc3JjL25hbWVyLmgKICAgc3JjL2ZsYXRjLmNwcAogICBzcmMvZmxhdGNfbWFpbi5jcHAKICAgc3JjL2JmYnNfZ2VuLmgKICAgc3JjL2JmYnNfZ2VuX2x1YS5oCisgIHNyYy9iZmJzX25hbWVyLmgKICAgaW5jbHVkZS9mbGF0YnVmZmVycy9jb2RlX2dlbmVyYXRvcnMuaAorICBzcmMvYmluYXJ5X2Fubm90YXRvci5oCisgIHNyYy9iaW5hcnlfYW5ub3RhdG9yLmNwcAorICBzcmMvYW5ub3RhdGVkX2JpbmFyeV90ZXh0X2dlbi5oCisgIHNyYy9hbm5vdGF0ZWRfYmluYXJ5X3RleHRfZ2VuLmNwcAogICBzcmMvYmZic19nZW5fbHVhLmNwcAogICBzcmMvY29kZV9nZW5lcmF0b3JzLmNwcAogICBncnBjL3NyYy9jb21waWxlci9zY2hlbWFfaW50ZXJmYWNlLmgKQEAgLTE4OCwxMSArMjEzLDIxIEBACiBzZXQoRmxhdEJ1ZmZlcnNfVGVzdHNfU1JDUwogICAke0ZsYXRCdWZmZXJzX0xpYnJhcnlfU1JDU30KICAgc3JjL2lkbF9nZW5fZmJzLmNwcAorICB0ZXN0cy9ldm9sdXRpb25fdGVzdC5jcHAKKyAgdGVzdHMvZmxleGJ1ZmZlcnNfdGVzdC5jcHAKKyAgdGVzdHMvZnV6el90ZXN0LmNwcAorICB0ZXN0cy9qc29uX3Rlc3QuY3BwCisgIHRlc3RzL21vbnN0ZXJfdGVzdC5jcHAKKyAgdGVzdHMvb3B0aW9uYWxfc2NhbGFyc190ZXN0LmNwcAorICB0ZXN0cy9wYXJzZXJfdGVzdC5jcHAKKyAgdGVzdHMvcHJvdG9fdGVzdC5jcHAKKyAgdGVzdHMvcmVmbGVjdGlvbl90ZXN0LmNwcAogICB0ZXN0cy90ZXN0LmNwcAogICB0ZXN0cy90ZXN0X2Fzc2VydC5oCiAgIHRlc3RzL3Rlc3RfYXNzZXJ0LmNwcAogICB0ZXN0cy90ZXN0X2J1aWxkZXIuaAogICB0ZXN0cy90ZXN0X2J1aWxkZXIuY3BwCisgIHRlc3RzL3V0aWxfdGVzdC5jcHAKICAgdGVzdHMvbmF0aXZlX3R5cGVfdGVzdF9pbXBsLmgKICAgdGVzdHMvbmF0aXZlX3R5cGVfdGVzdF9pbXBsLmNwcAogICBpbmNsdWRlL2ZsYXRidWZmZXJzL2NvZGVfZ2VuZXJhdG9ycy5oCkBAIC0yMTQsNiArMjQ5LDggQEAKICAgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L3Rlc3RzL21vbnN0ZXJfdGVzdF9iZmJzX2dlbmVyYXRlZC5oCiAgICMgZmlsZSBnZW5lcmF0ZSBieSBydW5uaW5nIGNvbXBpbGVyIG9uIHRlc3RzL29wdGlvbmFsX3NjYWxhcnMuZmJzCiAgICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS90ZXN0cy9vcHRpb25hbF9zY2FsYXJzX2dlbmVyYXRlZC5oCisgICMgZmlsZSBnZW5lcmF0ZSBieSBydW5uaW5nIGNvbXBpbGVyIG9uIHRlc3RzL25hdGl2ZV9pbmxpbmVfdGFibGVfdGVzdC5mYnMKKyAgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L3Rlc3RzL25hdGl2ZV9pbmxpbmVfdGFibGVfdGVzdF9nZW5lcmF0ZWQuaAogKQogCiBzZXQoRmxhdEJ1ZmZlcnNfVGVzdHNfQ1BQMTdfU1JDUwpAQCAtMjY2LDc1ICszMDMsOCBAQAogICAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vdGVzdHMvbW9uc3Rlcl90ZXN0X2dlbmVyYXRlZC5oCiApCiAKLSMgc291cmNlX2dyb3VwKENvbXBpbGVyIEZJTEVTICR7RmxhdEJ1ZmZlcnNfQ29tcGlsZXJfU1JDU30pCi0jIHNvdXJjZV9ncm91cChUZXN0cyBGSUxFUyAke0ZsYXRCdWZmZXJzX1Rlc3RzX1NSQ1N9KQotCi1pZihFWElTVFMgIiR7Q01BS0VfVE9PTENIQUlOX0ZJTEV9IikKLSAgIyBkbyBub3QgYXBwbHkgYW55IGdsb2JhbCBzZXR0aW5ncyBpZiB0aGUgdG9vbGNoYWluCi0gICMgaXMgYmVpbmcgY29uZmlndXJlZCBleHRlcm5hbGx5Ci0gIG1lc3NhZ2UoU1RBVFVTICJVc2luZyB0b29sY2hhaW4gZmlsZTogJHtDTUFLRV9UT09MQ0hBSU5fRklMRX0uIikKLWVsc2VpZihDTUFLRV9DT01QSUxFUl9JU19HTlVDWFgpCi0gIHNldChDTUFLRV9DWFhfRkxBR1MKLSAgICAiJHtDTUFLRV9DWFhfRkxBR1N9IC1XYWxsIC1wZWRhbnRpYyAtV2Vycm9yIC1XZXh0cmEgLVdlcnJvcj1zaGFkb3ciKQotICBzZXQoRkxBVEJVRkZFUlNfUFJJVkFURV9DWFhfRkxBR1MgIi1Xb2xkLXN0eWxlLWNhc3QiKQotICBpZiAoQ01BS0VfQ1hYX0NPTVBJTEVSX1ZFUlNJT04gVkVSU0lPTl9HUkVBVEVSIDQuNCkKLSAgICBpZiAoQ01BS0VfQ1hYX0NPTVBJTEVSX1ZFUlNJT04gVkVSU0lPTl9HUkVBVEVSIDcuMCkKLSAgICAgIHNldChDTUFLRV9DWFhfRkxBR1MKLSAgICAgICAgIiR7Q01BS0VfQ1hYX0ZMQUdTfSAtZmFsaWduZWQtbmV3IC1XZXJyb3I9aW1wbGljaXQtZmFsbHRocm91Z2g9MiIpCi0gICAgZW5kaWYoKQotICAgIHNldChDTUFLRV9DWFhfRkxBR1MKLSAgICAgICIke0NNQUtFX0NYWF9GTEFHU30gLVd1bnVzZWQtcmVzdWx0IC1XZXJyb3I9dW51c2VkLXJlc3VsdCAtV3VudXNlZC1wYXJhbWV0ZXIgLVdlcnJvcj11bnVzZWQtcGFyYW1ldGVyIikKLSAgZW5kaWYoKQotCi0gICMgQ2VydGFpbiBwbGF0Zm9ybXMgc3VjaCBhcyBBUk0gZG8gbm90IHVzZSBzaWduZWQgY2hhcnMgYnkgZGVmYXVsdAotICAjIHdoaWNoIGNhdXNlcyBpc3N1ZXMgd2l0aCBjZXJ0YWluIGJvdW5kcyBjaGVja3MuCi0gIHNldChDTUFLRV9DWFhfRkxBR1MKLSAgICAiJHtDTUFLRV9DWFhfRkxBR1N9IC1mc2lnbmVkLWNoYXIiKQotCi0jIE1TVkMgKipNVVNUKiogY29tZSBiZWZvcmUgdGhlIENsYW5nIGNoZWNrLCBhcyBjbGFuZy1jbCBpcyBmbGFnZ2VkIGJ5IENNYWtlIGFzICJNU1ZDIiwgYnV0IGl0IHN0aWxsIHRleHR1YWxseSAKLSMgbWF0Y2hlcyBhcyBDbGFuZyBpbiBpdHMgQ29tcGlsZXIgSWQgOikKLSMgTm90ZTogaW4gQ01ha2UgPj0gMy4xNCB3ZSBjYW4gY2hlY2sgQ01BS0VfQ1hYX0NPTVBJTEVSX0ZST05URU5EX1ZBUklBTlQgU1RSRVFVQUwgIkdOVSIgb3IgIk1TVkMiIHRvIGRpZmZlcmVudGlhdGUuLi4KLWVsc2VpZihNU1ZDKQotICAjIFZpc3VhbCBTdHVkaW8gcGVkYW50aWMgYnVpbGQgc2V0dGluZ3MKLSAgIyB3YXJuaW5nIEM0NTEyOiBhc3NpZ25tZW50IG9wZXJhdG9yIGNvdWxkIG5vdCBiZSBnZW5lcmF0ZWQKLSAgIyB3YXJuaW5nIEM0MzE2OiBvYmplY3QgYWxsb2NhdGVkIG9uIHRoZSBoZWFwIG1heSBub3QgYmUgYWxpZ25lZAotICBzZXQoQ01BS0VfQ1hYX0ZMQUdTICIke0NNQUtFX0NYWF9GTEFHU30gL1c0IC9XWCAvd2Q0NTEyIC93ZDQzMTYiKQotCi0gIGlmKCR7Q01BS0VfQ1hYX0NPTVBJTEVSX0lEfSBNQVRDSEVTICJDbGFuZyIpCi0gICAgc2V0KENNQUtFX0NYWF9GTEFHUyAiJHtDTUFLRV9DWFhfRkxBR1N9IC9EX0NSVF9TRUNVUkVfTk9fV0FSTklOR1MiKQotICBlbmRpZigpCi0KLWVsc2VpZigke0NNQUtFX0NYWF9DT01QSUxFUl9JRH0gTUFUQ0hFUyAiQ2xhbmciKQotICBpZihBUFBMRSkKLSAgICBpZihGTEFUQlVGRkVSU19PU1hfQlVJTERfVU5JVkVSU0FMKQotICAgICAgc2V0KENNQUtFX09TWF9BUkNISVRFQ1RVUkVTICJhcm02NDt4ODZfNjQiKQotICAgIGVuZGlmKCkKLSAgZW5kaWYoKQotCi0gIHNldChDTUFLRV9DWFhfRkxBR1MgIiR7Q01BS0VfQ1hYX0ZMQUdTfSAtV2FsbCAtcGVkYW50aWMgLVdlcnJvciAtV2V4dHJhIC1Xbm8tdW51c2VkLXBhcmFtZXRlciIpCi0gIHNldChGTEFUQlVGRkVSU19QUklWQVRFX0NYWF9GTEFHUyAiLVdvbGQtc3R5bGUtY2FzdCIpCi0gIGlmKE5PVCBDTUFLRV9DWFhfQ09NUElMRVJfVkVSU0lPTiBWRVJTSU9OX0xFU1MgMy44KQotICAgIGxpc3QoQVBQRU5EIEZMQVRCVUZGRVJTX1BSSVZBVEVfQ1hYX0ZMQUdTICItV2ltcGxpY2l0LWZhbGx0aHJvdWdoIiAiLVdleHRyYS1zZW1pIiAiLVdlcnJvcj11bnVzZWQtcHJpdmF0ZS1maWVsZCIpICMgZW5hYmxlIHdhcm5pbmcKLSAgZW5kaWYoKQotICBpZihGTEFUQlVGRkVSU19MSUJDWFhfV0lUSF9DTEFORykKLSAgICBpZihOT1QgIiR7Q01BS0VfU1lTVEVNX05BTUV9IiBNQVRDSEVTICJMaW51eCIpCi0gICAgICBzZXQoQ01BS0VfQ1hYX0ZMQUdTCi0gICAgICAgICAgIiR7Q01BS0VfQ1hYX0ZMQUdTfSAtc3RkbGliPWxpYmMrKyIpCi0gICAgZW5kaWYoKQotICAgIGlmKE5PVCAoIiR7Q01BS0VfU1lTVEVNX05BTUV9IiBNQVRDSEVTICJGcmVlQlNEIiBPUgotICAgICAgICAgICAgIiR7Q01BS0VfU1lTVEVNX05BTUV9IiBNQVRDSEVTICJMaW51eCIpKQotICAgICAgc2V0KENNQUtFX0VYRV9MSU5LRVJfRkxBR1MKLSAgICAgICAgICAiJHtDTUFLRV9FWEVfTElOS0VSX0ZMQUdTfSAtbGMrK2FiaSIpCi0gICAgZW5kaWYoKQotICBlbmRpZigpCi0KLSAgIyBDZXJ0YWluIHBsYXRmb3JtcyBzdWNoIGFzIEFSTSBkbyBub3QgdXNlIHNpZ25lZCBjaGFycyBieSBkZWZhdWx0Ci0gICMgd2hpY2ggY2F1c2VzIGlzc3VlcyB3aXRoIGNlcnRhaW4gYm91bmRzIGNoZWNrcy4KLSAgc2V0KENNQUtFX0NYWF9GTEFHUwotICAgICIke0NNQUtFX0NYWF9GTEFHU30gLWZzaWduZWQtY2hhciIpCi0KLWVuZGlmKCkKLQorIyBUT0RPKGRiYWlsZXljaGVzcyk6IEZpZ3VyZSBvdXQgaG93IHRoaXMgd291bGQgbm93IHdvcmsuIEkgcG9zdGVkIGEgcXVlc3Rpb24gb24KKyMgaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvNzE3NzIzMzAvb3ZlcnJpZGUtdGFyZ2V0LWNvbXBpbGUtb3B0aW9ucy12aWEtY21ha2UtY29tbWFuZC1saW5lLgogIyBBcHBlbmQgRkxBVEJVRkZFUlNfQ1hYX0ZMQUdTIHRvIENNQUtFX0NYWF9GTEFHUy4KIGlmKERFRklORUQgRkxBVEJVRkZFUlNfQ1hYX0ZMQUdTIEFORCBOT1QgRVhJU1RTICIke0NNQUtFX1RPT0xDSEFJTl9GSUxFfSIpCiAgIG1lc3NhZ2UoU1RBVFVTICJleHRlbmQgQ1hYX0ZMQUdTIHdpdGggJHtGTEFUQlVGRkVSU19DWFhfRkxBR1N9IikKQEAgLTM0MiwxMiArMzEyLDYgQEAKIGVuZGlmKCkKIG1lc3NhZ2UoU1RBVFVTICJDTUFLRV9DWFhfRkxBR1M6ICR7Q01BS0VfQ1hYX0ZMQUdTfSIpCiAKLWlmKEZMQVRCVUZGRVJTX0NPREVfQ09WRVJBR0UpCi0gIHNldChDTUFLRV9DWFhfRkxBR1MgIiR7Q01BS0VfQ1hYX0ZMQUdTfSAtZyAtZnByb2ZpbGUtYXJjcyAtZnRlc3QtY292ZXJhZ2UiKQotICBzZXQoQ01BS0VfRVhFX0xJTktFUl9GTEFHUwotICAgICAgIiR7Q01BS0VfRVhFX0xJTktFUl9GTEFHU30gLWZwcm9maWxlLWFyY3MgLWZ0ZXN0LWNvdmVyYWdlIikKLWVuZGlmKCkKLQogZnVuY3Rpb24oYWRkX2ZzYW5pdGl6ZV90b190YXJnZXQgX3RhcmdldCBfc2FuaXRpemVyKQogICBpZihXSU4zMikKICAgICB0YXJnZXRfY29tcGlsZV9kZWZpbml0aW9ucygke190YXJnZXR9IFBSSVZBVEUgRkxBVEJVRkZFUlNfTUVNT1JZX0xFQUtfVFJBQ0tJTkcpCkBAIC0zODYsMTMgKzM1MCwxMjUgQEAKIGluY2x1ZGVfZGlyZWN0b3JpZXMoaW5jbHVkZSkKIGluY2x1ZGVfZGlyZWN0b3JpZXMoZ3JwYykKIAorIyBDcmVhdGVzIGFuIGludGVyZmFjZSBsaWJyYXJ5IHRoYXQgc3RvcmVzIHRoZSBjb25maWd1cmF0aW9uIHNldHRpbmdzIHRoYXQgZWFjaAorIyB0YXJnZXQgbGlua3MgdG9vLiBUaGlzIGlzIGEgY29tcHJvbWlzZSBiZXR3ZWVuIHNldHRpbmcgY29uZmlndXJhdGlvbiBnbG9iYWxseQorIyB3aXRoIGFkZF9jb21waWxlX29wdGlvbnMoKSBhbmQgdGhlIG1vcmUgdGFyZ2V0dGVkIHRhcmdldF9jb21waWxlX29wdGlvbnMoKS4gCisjIFRoaXMgd2F5IGVhY2ggdGFyZ2V0IGluIHRoaXMgZmlsZSBjYW4gc2hhcmUgc2V0dGluZ3MgYW5kIG92ZXJyaWRlIHRoZW0gaWYgCisjIG5lZWRlZC4KK2FkZF9saWJyYXJ5KFByb2plY3RDb25maWcgSU5URVJGQUNFKQordGFyZ2V0X2NvbXBpbGVfZmVhdHVyZXMoUHJvamVjdENvbmZpZworICBJTlRFUkZBQ0UKKyAgICBjeHhfc3RkXyR7RkxBVEJVRkZFUlNfQ1BQX1NURH0KKykKKworIyBGb3JjZSB0aGUgc3RhbmRhcmQgdG8gYmUgbWV0Lgorc2V0KENNQUtFX0NYWF9TVEFOREFSRF9SRVFVSVJFRCBPTikKKworIyBXZSBzaG91bGRuJ3QgcmVseSBvbiBhbnkgY29tcGlsZXItZXh0ZW5zaW9ucyB0byBtYWtlIHRoaW5ncyB3b3JrLgorc2V0KENNQUtFX0NYWF9FWFRFTlNJT05TIE9GRikKKworaWYoTVNWQ19MSUtFKQorICB0YXJnZXRfY29tcGlsZV9vcHRpb25zKFByb2plY3RDb25maWcKKyAgICBJTlRFUkZBQ0UgCisgICAgICAvVzQKKyAgICAgICQ8JDxCT09MOiR7RkxBVEJVRkZFUlNfU1RSSUNUX01PREV9PjoKKyAgICAgICAgL1dYICAgICAgICMgVHJlYXQgYWxsIGNvbXBpbGVyIHdhcm5pbmdzIGFzIGVycm9ycworICAgICAgPgorICAgICAgL3dkNDUxMiAgICMgQzQ1MTI6IGFzc2lnbm1lbnQgb3BlcmF0b3IgY291bGQgbm90IGJlIGdlbmVyYXRlZAorICAgICAgL3dkNDMxNiAgICMgQzQzMTY6IG9iamVjdCBhbGxvY2F0ZWQgb24gdGhlIGhlYXAgbWF5IG5vdCBiZSBhbGlnbmVkCisgICAgICAvd2Q0NDU2ICAgIyBDNDQ1NjogaGlkZXMgcHJldmlvdXMgbG9jYWwgZGVjbGFyYXRpb24KKyAgICAgICQ8JDxDWFhfQ09NUElMRVJfSUQ6Q2xhbmc+OgorICAgICAgICAvRF9DUlRfU0VDVVJFX05PX1dBUk5JTkdTCisgICAgICA+CisgICkKK2Vsc2UoKQorICBpZigiJHtDTUFLRV9DWFhfQ09NUElMRVJfSUR9IiBNQVRDSEVTICJDbGFuZyIpCisgICAgc2V0KElTX0NMQU5HIE9OKQorICBlbHNlKCkKKyAgICBzZXQoSVNfQ0xBTkcgT0ZGKQorICBlbmRpZigpCisgIHRhcmdldF9jb21waWxlX29wdGlvbnMoUHJvamVjdENvbmZpZworICAgIElOVEVSRkFDRQorICAgICAgLVdhbGwKKyAgICAgICQ8JDxCT09MOiR7RkxBVEJVRkZFUlNfU1RSSUNUX01PREV9PjoKKyAgICAgICAgLVdlcnJvciAgICMgVHJlYXQgYWxsIGNvbXBpbGVyIHdhcm5pbmdzIGFzIGVycm9ycworCisgICAgICAgIC1mbm8tcnR0aSAjIERpc2FibGUgcnVudGltZSB0eXBlIGluZm9ybWF0aW9uCisKKyAgICAgICAgJDwkPENYWF9DT01QSUxFUl9JRDpHTlU+OgorICAgICAgICAgICMgRmFsc2UgcG9zaXRpdmUgc3RyaW5nIG92ZXJmbG93CisgICAgICAgICAgIyBodHRwczovL2dpdGh1Yi5jb20vZ29vZ2xlL2ZsYXRidWZmZXJzL2lzc3Vlcy83MzY2CisgICAgICAgICAgLVduby1lcnJvcj1zdHJpbmdvcC1vdmVyZmxvdworICAgICAgICA+CisgICAgICA+CisgICAgICAtcGVkYW50aWMgCisgICAgICAtV2V4dHJhIAorICAgICAgLVduby11bnVzZWQtcGFyYW1ldGVyCisgICAgICAtV29sZC1zdHlsZS1jYXN0CisgICAgICAtZnNpZ25lZC1jaGFyCisgICAgICAtV25vbi12aXJ0dWFsLWR0b3IKKworICAgICAgIyBUaGlzIGlzbid0IHdvcmtpbmcgZm9yIHNvbWUgcmVhc29uOiAkPCQ8Q1hYX0NPTVBJTEVSX0lEOkNMQU5HPjoKKyAgICAgICQ8JDxCT09MOiR7SVNfQ0xBTkd9PjoKKyAgICAgICAgLVduby11bmtub3duLXdhcm5pbmctb3B0aW9uCisgICAgICAgIC1XbWlzc2luZy1kZWNsYXJhdGlvbnMKKyAgICAgICAgLVd6ZXJvLWFzLW51bGwtcG9pbnRlci1jb25zdGFudAorICAgICAgICAkPCQ8VkVSU0lPTl9HUkVBVEVSOiQ8Q1hYX0NPTVBJTEVSX1ZFUlNJT04+LDMuOD46CisgICAgICAgICAgLVdpbXBsaWNpdC1mYWxsdGhyb3VnaAorICAgICAgICAgIC1XZXh0cmEtc2VtaQorICAgICAgICAgICQ8JDxCT09MOiR7RkxBVEJVRkZFUlNfU1RSSUNUX01PREV9PjogICAgICAgICAgICAKKyAgICAgICAgICAgIC1XZXJyb3I9dW51c2VkLXByaXZhdGUtZmllbGQKKyAgICAgICAgICA+CisgICAgICAgID4KKyAgICAgID4KKworICAgICAgJDwkPENYWF9DT01QSUxFUl9JRDpHTlU+OgorICAgICAgICAkPCQ8VkVSU0lPTl9HUkVBVEVSOiQ8Q1hYX0NPTVBJTEVSX1ZFUlNJT04+LDQuND46CisgICAgICAgICAgLVd1bnVzZWQtcmVzdWx0CisgICAgICAgICAgLVd1bnVzZWQtcGFyYW1ldGVyIAorICAgICAgICAgIC1XZXJyb3I9dW51c2VkLXBhcmFtZXRlcgorICAgICAgICAgIC1XbWlzc2luZy1kZWNsYXJhdGlvbnMKKyAgICAgICAgPgorICAgICAgICAkPCQ8VkVSU0lPTl9HUkVBVEVSOiQ8Q1hYX0NPTVBJTEVSX1ZFUlNJT04+LDQuNz46CisgICAgICAgICAgLVd6ZXJvLWFzLW51bGwtcG9pbnRlci1jb25zdGFudAorICAgICAgICA+CisgICAgICAgICQ8JDxWRVJTSU9OX0dSRUFURVI6JDxDWFhfQ09NUElMRVJfVkVSU0lPTj4sNy4wPjoKKyAgICAgICAgICAtZmFsaWduZWQtbmV3IAorICAgICAgICAgICQ8JDxCT09MOiR7RkxBVEJVRkZFUlNfU1RSSUNUX01PREV9PjoKKyAgICAgICAgICAgIC1XZXJyb3I9aW1wbGljaXQtZmFsbHRocm91Z2g9MgorICAgICAgICAgID4KKyAgICAgICAgPgorICAgICAgICAkPCQ8VkVSU0lPTl9HUkVBVEVSOiQ8Q1hYX0NPTVBJTEVSX1ZFUlNJT04+LDguMD46CisgICAgICAgICAgLVdleHRyYS1zZW1pCisgICAgICAgID4KKyAgICAgID4KKworICAgICAgJDwkPEJPT0w6JHtGTEFUQlVGRkVSU19DT0RFX0NPVkVSQUdFfT46CisgICAgICAgIC1nCisgICAgICAgIC1mcHJvZmlsZS1hcmNzCisgICAgICAgIC1mdGVzdC1jb3ZlcmFnZQorICAgICAgPgorICAgICkKKworICBpZihGTEFUQlVGRkVSU19DT0RFX0NPVkVSQUdFKQorICAgIHRhcmdldF9saW5rX29wdGlvbnMoUHJvamVjdENvbmZpZworICAgICAgSU5URVJGQUNFCisgICAgICAgIC1mcHJvZmlsZS1hcmNzCisgICAgICAgIC1mdGVzdC1jb3ZlcmFnZQorICAgICkKKyAgZW5kaWYoKQorZW5kaWYoKQorCiBpZihGTEFUQlVGRkVSU19CVUlMRF9GTEFUTElCKQogICBhZGRfbGlicmFyeShmbGF0YnVmZmVycyBTVEFUSUMgJHtGbGF0QnVmZmVyc19MaWJyYXJ5X1NSQ1N9KQorCiAgICMgQXR0YWNoIGhlYWRlciBkaXJlY3RvcnkgZm9yIHdoZW4gYnVpbGQgdmlhIGFkZF9zdWJkaXJlY3RvcnkoKS4KLSAgdGFyZ2V0X2luY2x1ZGVfZGlyZWN0b3JpZXMoZmxhdGJ1ZmZlcnMgSU5URVJGQUNFCi0gICAgJDxCVUlMRF9JTlRFUkZBQ0U6JHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9L2luY2x1ZGU+KQotICB0YXJnZXRfY29tcGlsZV9vcHRpb25zKGZsYXRidWZmZXJzIFBSSVZBVEUgIiR7RkxBVEJVRkZFUlNfUFJJVkFURV9DWFhfRkxBR1N9IikKLSAgdGFyZ2V0X2NvbXBpbGVfZmVhdHVyZXMoZmxhdGJ1ZmZlcnMgUFVCTElDIGN4eF9zdGRfMTEpCisgIHRhcmdldF9pbmNsdWRlX2RpcmVjdG9yaWVzKGZsYXRidWZmZXJzIAorICAgIElOVEVSRkFDRQorICAgICAgJDxCVUlMRF9JTlRFUkZBQ0U6JHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9L2luY2x1ZGU+CisgICkKKyAgdGFyZ2V0X2xpbmtfbGlicmFyaWVzKGZsYXRidWZmZXJzIFBSSVZBVEUgJDxCVUlMRF9JTlRFUkZBQ0U6UHJvamVjdENvbmZpZz4pCisKICAgaWYoRkxBVEJVRkZFUlNfRU5BQkxFX1BDSCkKICAgICBhZGRfcGNoX3RvX3RhcmdldChmbGF0YnVmZmVycyBpbmNsdWRlL2ZsYXRidWZmZXJzL3BjaC9wY2guaCkKICAgZW5kaWYoKQpAQCAtNDAzLDE4ICs0NzksMjEgQEAKICAgaWYoRkxBVEJVRkZFUlNfRU5BQkxFX1BDSCkKICAgICBhZGRfcGNoX3RvX3RhcmdldChmbGF0YyBpbmNsdWRlL2ZsYXRidWZmZXJzL3BjaC9mbGF0Y19wY2guaCkKICAgZW5kaWYoKQotICB0YXJnZXRfY29tcGlsZV9vcHRpb25zKGZsYXRjIFBSSVZBVEUgIiR7RkxBVEJVRkZFUlNfUFJJVkFURV9DWFhfRkxBR1N9IikKLSAgdGFyZ2V0X2NvbXBpbGVfZmVhdHVyZXMoZmxhdGMgUFVCTElDIGN4eF9zdGRfMTEpCisKKyAgdGFyZ2V0X2xpbmtfbGlicmFyaWVzKGZsYXRjIFBSSVZBVEUgJDxCVUlMRF9JTlRFUkZBQ0U6UHJvamVjdENvbmZpZz4pCisgIHRhcmdldF9jb21waWxlX29wdGlvbnMoZmxhdGMgCisgICAgUFVCTElDCisgICAgICAkPCQ8QU5EOiQ8Qk9PTDoke01TVkNfTElLRX0+LCQ8Q09ORklHOlJlbGVhc2U+PjoKKyAgICAgICAgL01UCisgICAgICA+CisgICkKKwogICBpZihGTEFUQlVGRkVSU19DT0RFX1NBTklUSVpFIEFORCBOT1QgV0lOMzIpCiAgICAgYWRkX2ZzYW5pdGl6ZV90b190YXJnZXQoZmxhdGMgJHtGTEFUQlVGRkVSU19DT0RFX1NBTklUSVpFfSkKICAgZW5kaWYoKQogICBpZihOT1QgRkxBVEJVRkZFUlNfRkxBVENfRVhFQ1VUQUJMRSkKICAgICBzZXQoRkxBVEJVRkZFUlNfRkxBVENfRVhFQ1VUQUJMRSAkPFRBUkdFVF9GSUxFOmZsYXRjPikKICAgZW5kaWYoKQotICBpZihNU1ZDKQotICAgICMgTWFrZSBmbGF0Yy5leGUgbm90IGRlcGVuZCBvbiBydW50aW1lIGRsbHMgZm9yIGVhc3kgZGlzdHJpYnV0aW9uLgotICAgIHRhcmdldF9jb21waWxlX29wdGlvbnMoZmxhdGMgUFVCTElDICQ8JDxDT05GSUc6UmVsZWFzZT46L01UPikKLSAgZW5kaWYoKQogICBpZihGTEFUQlVGRkVSU19TVEFUSUNfRkxBVEMgQU5EIE5PVCBNU1ZDKQogICAgIHRhcmdldF9saW5rX2xpYnJhcmllcyhmbGF0YyBQUklWQVRFIC1zdGF0aWMpCiAgIGVuZGlmKCkKQEAgLTQyMiwxMiArNTAxLDEyIEBACiAKIGlmKEZMQVRCVUZGRVJTX0JVSUxEX0ZMQVRIQVNIKQogICBhZGRfZXhlY3V0YWJsZShmbGF0aGFzaCAke0ZsYXRIYXNoX1NSQ1N9KQotICB0YXJnZXRfY29tcGlsZV9mZWF0dXJlcyhmbGF0aGFzaCBQVUJMSUMgY3h4X3N0ZF8xMSkKKyAgdGFyZ2V0X2xpbmtfbGlicmFyaWVzKGZsYXRoYXNoIFBSSVZBVEUgJDxCVUlMRF9JTlRFUkZBQ0U6UHJvamVjdENvbmZpZz4pCiBlbmRpZigpCiAKIGlmKEZMQVRCVUZGRVJTX0JVSUxEX1NIQVJFRExJQikKICAgYWRkX2xpYnJhcnkoZmxhdGJ1ZmZlcnNfc2hhcmVkIFNIQVJFRCAke0ZsYXRCdWZmZXJzX0xpYnJhcnlfU1JDU30pCi0gIHRhcmdldF9jb21waWxlX2ZlYXR1cmVzKGZsYXRidWZmZXJzX3NoYXJlZCBQVUJMSUMgY3h4X3N0ZF8xMSkKKyAgdGFyZ2V0X2xpbmtfbGlicmFyaWVzKGZsYXRidWZmZXJzX3NoYXJlZCBQUklWQVRFICQ8QlVJTERfSU5URVJGQUNFOlByb2plY3RDb25maWc+KQogICAjIFNoYXJlZCBvYmplY3QgdmVyc2lvbjogIm1ham9yLm1pbm9yLm1pY3JvIgogICAjIC0gbWljcm8gdXBkYXRlZCBldmVyeSByZWxlYXNlIHdoZW4gdGhlcmUgaXMgbm8gQVBJL0FCSSBjaGFuZ2VzCiAgICMgLSBtaW5vciB1cGRhdGVkIHdoZW4gdGhlcmUgYXJlIGFkZGl0aW9ucyBpbiBBUEkvQUJJCkBAIC01NDMsMTYgKzYyMiwxNiBAQAogICBjb21waWxlX2ZsYXRidWZmZXJzX3NjaGVtYV90b19jcHBfb3B0KHRlc3RzL2FycmF5c190ZXN0LmZicyAiLS1zY29wZWQtZW51bXM7LS1nZW4tY29tcGFyZSIpCiAgIGNvbXBpbGVfZmxhdGJ1ZmZlcnNfc2NoZW1hX3RvX2JpbmFyeSh0ZXN0cy9hcnJheXNfdGVzdC5mYnMpCiAgIGNvbXBpbGVfZmxhdGJ1ZmZlcnNfc2NoZW1hX3RvX2VtYmVkZGVkX2JpbmFyeSh0ZXN0cy9tb25zdGVyX3Rlc3QuZmJzICItLW5vLWluY2x1ZGVzOy0tZ2VuLWNvbXBhcmUiKQorICBjb21waWxlX2ZsYXRidWZmZXJzX3NjaGVtYV90b19jcHAodGVzdHMvbmF0aXZlX2lubGluZV90YWJsZV90ZXN0LmZicyAiLS1nZW4tY29tcGFyZSIpCiAgIGlmKE5PVCAoTVNWQyBBTkQgKE1TVkNfVkVSU0lPTiBMRVNTIDE5MDApKSkKICAgICBjb21waWxlX2ZsYXRidWZmZXJzX3NjaGVtYV90b19jcHAodGVzdHMvbW9uc3Rlcl9leHRyYS5mYnMpICMgVGVzdCBmbG9hdGluZy1wb2ludCBOQU4vSU5GLgogICBlbmRpZigpCiAgIGluY2x1ZGVfZGlyZWN0b3JpZXMoJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L3Rlc3RzKQogICBhZGRfZXhlY3V0YWJsZShmbGF0dGVzdHMgJHtGbGF0QnVmZmVyc19UZXN0c19TUkNTfSkKLSAgdGFyZ2V0X2NvbXBpbGVfZmVhdHVyZXMoZmxhdHRlc3RzIFBVQkxJQyBjeHhfc3RkXzExKQorICB0YXJnZXRfbGlua19saWJyYXJpZXMoZmxhdHRlc3RzIFBSSVZBVEUgJDxCVUlMRF9JTlRFUkZBQ0U6UHJvamVjdENvbmZpZz4pCisKICAgYWRkX2RlcGVuZGVuY2llcyhmbGF0dGVzdHMgZ2VuZXJhdGVkX2NvZGUpCi0gIHNldF9wcm9wZXJ0eShUQVJHRVQgZmxhdHRlc3RzCi0gICAgUFJPUEVSVFkgQ09NUElMRV9ERUZJTklUSU9OUyBGTEFUQlVGRkVSU19UUkFDS19WRVJJRklFUl9CVUZGRVJfU0laRQotICAgIEZMQVRCVUZGRVJTX0RFQlVHX1ZFUklGSUNBVElPTl9GQUlMVVJFPTEpCisKICAgaWYoRkxBVEJVRkZFUlNfQ09ERV9TQU5JVElaRSkKICAgICBhZGRfZnNhbml0aXplX3RvX3RhcmdldChmbGF0dGVzdHMgJHtGTEFUQlVGRkVSU19DT0RFX1NBTklUSVpFfSkKICAgZW5kaWYoKQpAQCAtNTYwLDI3ICs2MzksMjcgQEAKICAgY29tcGlsZV9mbGF0YnVmZmVyc19zY2hlbWFfdG9fY3BwKHNhbXBsZXMvbW9uc3Rlci5mYnMpCiAgIGNvbXBpbGVfZmxhdGJ1ZmZlcnNfc2NoZW1hX3RvX2JpbmFyeShzYW1wbGVzL21vbnN0ZXIuZmJzKQogICBpbmNsdWRlX2RpcmVjdG9yaWVzKCR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS9zYW1wbGVzKQorCiAgIGFkZF9leGVjdXRhYmxlKGZsYXRzYW1wbGViaW5hcnkgJHtGbGF0QnVmZmVyc19TYW1wbGVfQmluYXJ5X1NSQ1N9KQotICB0YXJnZXRfY29tcGlsZV9mZWF0dXJlcyhmbGF0c2FtcGxlYmluYXJ5IFBVQkxJQyBjeHhfc3RkXzExKQorICB0YXJnZXRfbGlua19saWJyYXJpZXMoZmxhdHNhbXBsZWJpbmFyeSBQUklWQVRFICQ8QlVJTERfSU5URVJGQUNFOlByb2plY3RDb25maWc+KQogICBhZGRfZGVwZW5kZW5jaWVzKGZsYXRzYW1wbGViaW5hcnkgZ2VuZXJhdGVkX2NvZGUpCisKICAgYWRkX2V4ZWN1dGFibGUoZmxhdHNhbXBsZXRleHQgJHtGbGF0QnVmZmVyc19TYW1wbGVfVGV4dF9TUkNTfSkKLSAgdGFyZ2V0X2NvbXBpbGVfZmVhdHVyZXMoZmxhdHNhbXBsZXRleHQgUFVCTElDIGN4eF9zdGRfMTEpCisgIHRhcmdldF9saW5rX2xpYnJhcmllcyhmbGF0c2FtcGxldGV4dCBQUklWQVRFICQ8QlVJTERfSU5URVJGQUNFOlByb2plY3RDb25maWc+KQogICBhZGRfZGVwZW5kZW5jaWVzKGZsYXRzYW1wbGV0ZXh0IGdlbmVyYXRlZF9jb2RlKQorCiAgIGFkZF9leGVjdXRhYmxlKGZsYXRzYW1wbGViZmJzICR7RmxhdEJ1ZmZlcnNfU2FtcGxlX0JGQlNfU1JDU30pCi0gIHRhcmdldF9jb21waWxlX2ZlYXR1cmVzKGZsYXRzYW1wbGViZmJzIFBVQkxJQyBjeHhfc3RkXzExKQorICB0YXJnZXRfbGlua19saWJyYXJpZXMoZmxhdHNhbXBsZWJmYnMgUFJJVkFURSAkPEJVSUxEX0lOVEVSRkFDRTpQcm9qZWN0Q29uZmlnPikKICAgYWRkX2RlcGVuZGVuY2llcyhmbGF0c2FtcGxlYmZicyBnZW5lcmF0ZWRfY29kZSkKIAogICBpZihGTEFUQlVGRkVSU19CVUlMRF9DUFAxNykKICAgICAjIERvbid0IGdlbmVyYXRlIGhlYWRlciBmb3IgZmxhdHRlc3RzX2NwcDE3IHRhcmdldC4KICAgICAjIFRoaXMgdGFyZ2V0IHVzZXMgImdlbmVyYXRlZF9jcHAxNy9tb25zdGVyX3Rlc3RfZ2VuZXJhdGVkLmgiCi0gICAgIyBwcm9kdWNlZCBieSBkaXJlY3QgY2FsbCBvZiBnZW5lcmF0ZV9jb2RlLnB5IHNjcmlwdC4KICAgICBhZGRfZXhlY3V0YWJsZShmbGF0dGVzdHNfY3BwMTcgJHtGbGF0QnVmZmVyc19UZXN0c19DUFAxN19TUkNTfSkKICAgICBhZGRfZGVwZW5kZW5jaWVzKGZsYXR0ZXN0c19jcHAxNyBnZW5lcmF0ZWRfY29kZSkKKyAgICB0YXJnZXRfbGlua19saWJyYXJpZXMoZmxhdHRlc3RzX2NwcDE3IFBSSVZBVEUgJDxCVUlMRF9JTlRFUkZBQ0U6UHJvamVjdENvbmZpZz4pCiAgICAgdGFyZ2V0X2NvbXBpbGVfZmVhdHVyZXMoZmxhdHRlc3RzX2NwcDE3IFBSSVZBVEUgY3h4X3N0ZF8xNykKLSAgICB0YXJnZXRfY29tcGlsZV9kZWZpbml0aW9ucyhmbGF0dGVzdHNfY3BwMTcgUFJJVkFURQotICAgICAgRkxBVEJVRkZFUlNfVFJBQ0tfVkVSSUZJRVJfQlVGRkVSX1NJWkUKLSAgICAgIEZMQVRCVUZGRVJTX0RFQlVHX1ZFUklGSUNBVElPTl9GQUlMVVJFPTEKLSAgICApCisKICAgICBpZihGTEFUQlVGRkVSU19DT0RFX1NBTklUSVpFKQogICAgICAgYWRkX2ZzYW5pdGl6ZV90b190YXJnZXQoZmxhdHRlc3RzX2NwcDE3ICR7RkxBVEJVRkZFUlNfQ09ERV9TQU5JVElaRX0pCiAgICAgZW5kaWYoKQpAQCAtNTg4LDkgKzY2Nyw2IEBACiBlbmRpZigpCiAKIGlmKEZMQVRCVUZGRVJTX0JVSUxEX0dSUENURVNUKQotICBpZihDTUFLRV9DT01QSUxFUl9JU19HTlVDWFgpCi0gICAgc2V0KENNQUtFX0NYWF9GTEFHUyAiJHtDTUFLRV9DWFhfRkxBR1N9IC1Xbm8tdW51c2VkLXBhcmFtZXRlciAtV25vLXNoYWRvdyIpCi0gIGVuZGlmKCkKICAgaWYoTk9UIEdSUENfSU5TVEFMTF9QQVRIKQogICAgIG1lc3NhZ2UoU0VORF9FUlJPUiAiR1JQQ19JTlNUQUxMX1BBVEggdmFyaWFibGUgaXMgbm90IGRlZmluZWQuIFNlZSBncnBjL1JFQURNRS5tZCIpCiAgIGVuZGlmKCkKQEAgLTYwNiwxNSArNjgyLDE2IEBACiAgIGZpbmRfcGFja2FnZShnUlBDIENPTkZJRyBSRVFVSVJFRCkKICAgYWRkX2V4ZWN1dGFibGUoZ3JwY3Rlc3QgJHtGbGF0QnVmZmVyc19HUlBDVGVzdF9TUkNTfSkKICAgYWRkX2RlcGVuZGVuY2llcyhncnBjdGVzdCBnZW5lcmF0ZWRfY29kZSkKLSAgdGFyZ2V0X2NvbXBpbGVfZmVhdHVyZXMoZ3JwY3Rlc3QgUFJJVkFURSBjeHhfc3RkXzExKQotICB0YXJnZXRfbGlua19saWJyYXJpZXMoZ3JwY3Rlc3QgUFJJVkFURSBnUlBDOjpncnBjKytfdW5zZWN1cmUgZ1JQQzo6Z3JwY191bnNlY3VyZSBnUlBDOjpncHIgcHRocmVhZCBkbCkKLSAgaWYoRkxBVEJVRkZFUlNfQ09ERV9TQU5JVElaRSBBTkQgTk9UIFdJTjMyKQotICAgICMgR1JQQyB0ZXN0IGhhcyBwcm9ibGVtcyB3aXRoIGFsaWdubWVudCBhbmQgd2lsbCBmYWlsIHVuZGVyIEFTQU4vVUJTQU4uCi0gICAgIyBhZGRfZnNhbml0aXplX3RvX3RhcmdldChncnBjdGVzdCAke0ZMQVRCVUZGRVJTX0NPREVfU0FOSVRJWkV9KQotICBlbmRpZigpCisgIHRhcmdldF9saW5rX2xpYnJhcmllcyhncnBjdGV4dCAKKyAgICBQUklWQVRFIAorICAgICAgJDxCVUlMRF9JTlRFUkZBQ0U6UHJvamVjdENvbmZpZz4KKyAgICAgIGdSUEM6OmdycGMrK191bnNlY3VyZSAKKyAgICAgIGdSUEM6OmdwciAKKyAgICAgIHB0aHJlYWQKKyAgICAgIGRsIAorICApCiBlbmRpZigpCiAKLQogaWYoRkxBVEJVRkZFUlNfSU5TVEFMTCkKICAgaW5jbHVkZShHTlVJbnN0YWxsRGlycykKIApAQCAtNjIyLDIxICs2OTksMjQgQEAKIAogICBzZXQoRkJfQ01BS0VfRElSICIke0NNQUtFX0lOU1RBTExfTElCRElSfS9jbWFrZS9mbGF0YnVmZmVycyIpCiAKLSAgY29uZmlndXJlX2ZpbGUoQ01ha2UvRmxhdGJ1ZmZlcnNDb25maWdWZXJzaW9uLmNtYWtlLmluIEZsYXRidWZmZXJzQ29uZmlnVmVyc2lvbi5jbWFrZSBAT05MWSkKKyAgY29uZmlndXJlX2ZpbGUoQ01ha2UvZmxhdGJ1ZmZlcnMtY29uZmlnLXZlcnNpb24uY21ha2UuaW4gZmxhdGJ1ZmZlcnMtY29uZmlnLXZlcnNpb24uY21ha2UgQE9OTFkpCiAgIGluc3RhbGwoCi0gICAgICBGSUxFUyAiQ01ha2UvRmxhdGJ1ZmZlcnNDb25maWcuY21ha2UiICIke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vRmxhdGJ1ZmZlcnNDb25maWdWZXJzaW9uLmNtYWtlIgorICAgICAgRklMRVMgCisgICAgICAgICJDTWFrZS9mbGF0YnVmZmVycy1jb25maWcuY21ha2UiIAorICAgICAgICAiQ01ha2UvQnVpbGRGbGF0QnVmZmVycy5jbWFrZSIKKyAgICAgICAgIiR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS9mbGF0YnVmZmVycy1jb25maWctdmVyc2lvbi5jbWFrZSIKICAgICAgIERFU1RJTkFUSU9OICR7RkJfQ01BS0VfRElSfQogICApCiAKICAgaWYoRkxBVEJVRkZFUlNfQlVJTERfRkxBVExJQikKICAgICBpbnN0YWxsKAotICAgICAgVEFSR0VUUyBmbGF0YnVmZmVycyBFWFBPUlQgRmxhdGJ1ZmZlcnNUYXJnZXRzCisgICAgICBUQVJHRVRTIGZsYXRidWZmZXJzIEVYUE9SVCBGbGF0QnVmZmVyc1RhcmdldHMKICAgICAgIEFSQ0hJVkUgREVTVElOQVRJT04gJHtDTUFLRV9JTlNUQUxMX0xJQkRJUn0KICAgICAgIElOQ0xVREVTIERFU1RJTkFUSU9OICR7Q01BS0VfSU5TVEFMTF9JTkNMVURFRElSfQogICAgICkKIAotICAgIGluc3RhbGwoRVhQT1JUIEZsYXRidWZmZXJzVGFyZ2V0cwotICAgICAgRklMRSBGbGF0YnVmZmVyc1RhcmdldHMuY21ha2UKKyAgICBpbnN0YWxsKEVYUE9SVCBGbGF0QnVmZmVyc1RhcmdldHMKKyAgICAgIEZJTEUgRmxhdEJ1ZmZlcnNUYXJnZXRzLmNtYWtlCiAgICAgICBOQU1FU1BBQ0UgZmxhdGJ1ZmZlcnM6OgogICAgICAgREVTVElOQVRJT04gJHtGQl9DTUFLRV9ESVJ9CiAgICAgKQpAQCAtNjU4LDcgKzczOCw3IEBACiAKICAgaWYoRkxBVEJVRkZFUlNfQlVJTERfU0hBUkVETElCKQogICAgIGluc3RhbGwoCi0gICAgICBUQVJHRVRTIGZsYXRidWZmZXJzX3NoYXJlZCBFWFBPUlQgRmxhdGJ1ZmZlcnNTaGFyZWRUYXJnZXRzCisgICAgICBUQVJHRVRTIGZsYXRidWZmZXJzX3NoYXJlZCBFWFBPUlQgRmxhdEJ1ZmZlcnNTaGFyZWRUYXJnZXRzCiAgICAgICBBUkNISVZFIERFU1RJTkFUSU9OICR7Q01BS0VfSU5TVEFMTF9MSUJESVJ9CiAgICAgICBSVU5USU1FIERFU1RJTkFUSU9OICR7Q01BS0VfSU5TVEFMTF9MSUJESVJ9CiAgICAgICBMSUJSQVJZIERFU1RJTkFUSU9OICR7Q01BS0VfSU5TVEFMTF9MSUJESVJ9CkBAIC02NjYsOCArNzQ2LDggQEAKICAgICApCiAKICAgICBpbnN0YWxsKAotICAgICAgRVhQT1JUIEZsYXRidWZmZXJzU2hhcmVkVGFyZ2V0cwotICAgICAgRklMRSBGbGF0YnVmZmVyc1NoYXJlZFRhcmdldHMuY21ha2UKKyAgICAgIEVYUE9SVCBGbGF0QnVmZmVyc1NoYXJlZFRhcmdldHMKKyAgICAgIEZJTEUgRmxhdEJ1ZmZlcnNTaGFyZWRUYXJnZXRzLmNtYWtlCiAgICAgICBOQU1FU1BBQ0UgZmxhdGJ1ZmZlcnM6OgogICAgICAgREVTVElOQVRJT04gJHtGQl9DTUFLRV9ESVJ9CiAgICAgKQpAQCAtNzI5LDQgKzgwOSw0IEBACiB0YXJnZXRfaW5jbHVkZV9kaXJlY3RvcmllcygKICAgRmxhdEJ1ZmZlcnMKICAgSU5URVJGQUNFICQ8QlVJTERfSU5URVJGQUNFOiR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS9pbmNsdWRlPgotICAgICAgICAgICAgJDxJTlNUQUxMX0lOVEVSRkFDRToke0NNQUtFX0lOU1RBTExfSU5DTFVERURJUn0vaW5jbHVkZT4pClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorICAgICAgICAgICAgJDxJTlNUQUxMX0lOVEVSRkFDRToke0NNQUtFX0lOU1RBTExfSU5DTFVERURJUn0vaW5jbHVkZT4pCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy9XT1JLU1BBQ0UgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy9XT1JLU1BBQ0UKaW5kZXggZjAzMGU4Ni4uYjcwNzg1NyAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvV09SS1NQQUNFCisrKyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL1dPUktTUEFDRQpAQCAtMywyMCArMyw0NyBAQAogbG9hZCgiQGJhemVsX3Rvb2xzLy90b29scy9idWlsZF9kZWZzL3JlcG86aHR0cC5iemwiLCAiaHR0cF9hcmNoaXZlIikKIAogaHR0cF9hcmNoaXZlKAotICAgIG5hbWUgPSAiaW9fYmF6ZWxfcnVsZXNfZ28iLAotICAgIHNoYTI1NiA9ICJkMWZmZDA1NTk2OWM4ZjhkNDMxZTJkNDM5ODEzZTQyMzI2OTYxZDA5NDJiZGY3MzRkMmM5NWRjMzBjMzY5NTY2IiwKKyAgICBuYW1lID0gInBsYXRmb3JtcyIsCisgICAgc2hhMjU2ID0gIjM3OTExMzQ1OWIwZmVhZjZiZmJiNTg0YTkxODc0YzA2NTA3OGFhNjczMjIyODQ2YWM3NjVmODY2NjFjMjc0MDciLAogICAgIHVybHMgPSBbCi0gICAgICAgICJodHRwczovL21pcnJvci5iYXplbC5idWlsZC9naXRodWIuY29tL2JhemVsYnVpbGQvcnVsZXNfZ28vcmVsZWFzZXMvZG93bmxvYWQvdjAuMjQuNS9ydWxlc19nby12MC4yNC41LnRhci5neiIsCi0gICAgICAgICJodHRwczovL2dpdGh1Yi5jb20vYmF6ZWxidWlsZC9ydWxlc19nby9yZWxlYXNlcy9kb3dubG9hZC92MC4yNC41L3J1bGVzX2dvLXYwLjI0LjUudGFyLmd6IiwKKyAgICAgICAgImh0dHBzOi8vbWlycm9yLmJhemVsLmJ1aWxkL2dpdGh1Yi5jb20vYmF6ZWxidWlsZC9wbGF0Zm9ybXMvcmVsZWFzZXMvZG93bmxvYWQvMC4wLjUvcGxhdGZvcm1zLTAuMC41LnRhci5neiIsCisgICAgICAgICJodHRwczovL2dpdGh1Yi5jb20vYmF6ZWxidWlsZC9wbGF0Zm9ybXMvcmVsZWFzZXMvZG93bmxvYWQvMC4wLjUvcGxhdGZvcm1zLTAuMC41LnRhci5neiIsCiAgICAgXSwKICkKIAotbG9hZCgiQGlvX2JhemVsX3J1bGVzX2dvLy9nbzpkZXBzLmJ6bCIsICJnb19yZWdpc3Rlcl90b29sY2hhaW5zIiwgImdvX3J1bGVzX2RlcGVuZGVuY2llcyIpCitodHRwX2FyY2hpdmUoCisgICAgbmFtZSA9ICJidWlsZF9iYXplbF9ydWxlc19zd2lmdCIsCisgICAgc2hhMjU2ID0gImEyZmQ1NjVlNTI3ZjgzZmIzZjllYjA3ZWI5NzM3MjQwZTY2OGM5MjQyZDNiYzMxODcxMmVmYTU0YTdkZWRhOTciLAorICAgIHVybCA9ICJodHRwczovL2dpdGh1Yi5jb20vYmF6ZWxidWlsZC9ydWxlc19zd2lmdC9yZWxlYXNlcy9kb3dubG9hZC8wLjI3LjAvcnVsZXNfc3dpZnQuMC4yNy4wLnRhci5neiIsCispCisKK2xvYWQoCisgICAgIkBidWlsZF9iYXplbF9ydWxlc19zd2lmdC8vc3dpZnQ6cmVwb3NpdG9yaWVzLmJ6bCIsCisgICAgInN3aWZ0X3J1bGVzX2RlcGVuZGVuY2llcyIsCispCisKK3N3aWZ0X3J1bGVzX2RlcGVuZGVuY2llcygpCisKK2xvYWQoCisgICAgIkBidWlsZF9iYXplbF9ydWxlc19zd2lmdC8vc3dpZnQ6ZXh0cmFzLmJ6bCIsCisgICAgInN3aWZ0X3J1bGVzX2V4dHJhX2RlcGVuZGVuY2llcyIsCispCisKK3N3aWZ0X3J1bGVzX2V4dHJhX2RlcGVuZGVuY2llcygpCisKK2h0dHBfYXJjaGl2ZSgKKyAgICBuYW1lID0gImlvX2JhemVsX3J1bGVzX2dvIiwKKyAgICBzaGEyNTYgPSAiMTZlOWZjYTUzZWQ2YmQ0ZmY0YWQ3NmZhY2M5YjdiNjUxYTg5ZGIxNjg5YTI4NzdkNmZkN2I4MmFhODI0ZTM2NiIsCisgICAgdXJscyA9IFsKKyAgICAgICAgImh0dHBzOi8vbWlycm9yLmJhemVsLmJ1aWxkL2dpdGh1Yi5jb20vYmF6ZWxidWlsZC9ydWxlc19nby9yZWxlYXNlcy9kb3dubG9hZC92MC4zNC4wL3J1bGVzX2dvLXYwLjM0LjAuemlwIiwKKyAgICAgICAgImh0dHBzOi8vZ2l0aHViLmNvbS9iYXplbGJ1aWxkL3J1bGVzX2dvL3JlbGVhc2VzL2Rvd25sb2FkL3YwLjM0LjAvcnVsZXNfZ28tdjAuMzQuMC56aXAiLAorICAgIF0sCispCisKK2xvYWQoIkBpb19iYXplbF9ydWxlc19nby8vZ286ZGVwcy5iemwiLCAiZ29fcnVsZXNfZGVwZW5kZW5jaWVzIikKIAogZ29fcnVsZXNfZGVwZW5kZW5jaWVzKCkKIAotZ29fcmVnaXN0ZXJfdG9vbGNoYWlucygpCi0KICMjIyMjIFByb3RvYnVmCiBfUFJPVE9CVUZfVkVSU0lPTiA9ICIzLjE1LjIiCiAKQEAgLTI5LDEyICs1NiwxMiBAQAogKQogCiAjIyMjIyBHUlBDCi1fR1JQQ19WRVJTSU9OID0gIjEuNDIuMCIKK19HUlBDX1ZFUlNJT04gPSAiMS40OC4wIiAgIyBodHRwczovL2dpdGh1Yi5jb20vZ3JwYy9ncnBjL3JlbGVhc2VzL3RhZy92MS40OC4wCiAKIGh0dHBfYXJjaGl2ZSgKICAgICBuYW1lID0gImNvbV9naXRodWJfZ3JwY19ncnBjIiwKICAgICBzdHJpcF9wcmVmaXggPSAiZ3JwYy0iICsgX0dSUENfVkVSU0lPTiwKLSAgICB1cmxzID0gWyJodHRwczovL2dpdGh1Yi5jb20vZ3JwYy9ncnBjL2FyY2hpdmUvdiIgKyBfR1JQQ19WRVJTSU9OICsgIi50YXIuZ3oiXSwKKyAgICB1cmxzID0gWyJodHRwczovL2dpdGh1Yi5jb20vZ3JwYy9ncnBjL2FyY2hpdmUvcmVmcy90YWdzL3YiICsgX0dSUENfVkVSU0lPTiArICIudGFyLmd6Il0sCiApCiAKIGxvYWQoIkBjb21fZ2l0aHViX2dycGNfZ3JwYy8vYmF6ZWw6Z3JwY19kZXBzLmJ6bCIsICJncnBjX2RlcHMiKQpAQCAtNDUsNiArNzIsNyBAQAogCiBncnBjX2V4dHJhX2RlcHMoKQogCisjIHJ1bGVzX2dvIGZyb20gaHR0cHM6Ly9naXRodWIuY29tL2JhemVsYnVpbGQvcnVsZXNfZ28vcmVsZWFzZXMvdGFnL3YwLjM0LjAKIGh0dHBfYXJjaGl2ZSgKICAgICBuYW1lID0gImJ1aWxkX2JhemVsX3J1bGVzX25vZGVqcyIsCiAgICAgc2hhMjU2ID0gIjk2NWVlMjQ5MmEyYjA4N2NmOWUwZjJjYTQ3MmFlYWYxYmUyZWI2NTBlMGNmYmRkZjUxNGI5YTdkM2VhNGIwMmEiLApkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvYW5kcm9pZC9BbmRyb2lkTWFuaWZlc3QueG1sIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvYW5kcm9pZC9BbmRyb2lkTWFuaWZlc3QueG1sCmluZGV4IGM3NTVlNmQuLjY1Y2U2NDMgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL2FuZHJvaWQvQW5kcm9pZE1hbmlmZXN0LnhtbAorKysgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy9hbmRyb2lkL0FuZHJvaWRNYW5pZmVzdC54bWwKQEAgLTYsNyArNiw4IEBACiAgICAgPHVzZXMtZmVhdHVyZSBhbmRyb2lkOmdsRXNWZXJzaW9uPSIweDAwMDIwMDAwIj48L3VzZXMtZmVhdHVyZT4KIAogICAgIDwhLS0gVGhpcyAuYXBrIGhhcyBubyBKYXZhIGNvZGUgaXRzZWxmLCBzbyBzZXQgaGFzQ29kZSB0byBmYWxzZS4gLS0+Ci0gICAgPGFwcGxpY2F0aW9uIGFuZHJvaWQ6bGFiZWw9IkBzdHJpbmcvYXBwX25hbWUiCisgICAgPGFwcGxpY2F0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5zdXBwb3J0Lm11bHRpZGV4Lk11bHRpRGV4QXBwbGljYXRpb24iCisgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGFiZWw9IkBzdHJpbmcvYXBwX25hbWUiCiAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6aGFzQ29kZT0iZmFsc2UiCiAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6YWxsb3dCYWNrdXA9ImZhbHNlIj4KICAgICAgICAgPCEtLSBPdXIgYWN0aXZpdHkgaXMgdGhlIGJ1aWx0LWluIE5hdGl2ZUFjdGl2aXR5IGZyYW1ld29yayBjbGFzcy4KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL2FuZHJvaWQvYXBwL2J1aWxkLmdyYWRsZSBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL2FuZHJvaWQvYXBwL2J1aWxkLmdyYWRsZQppbmRleCBkYmE2NjI0Li4xYjAzNWJhIDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy9hbmRyb2lkL2FwcC9idWlsZC5ncmFkbGUKKysrIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvYW5kcm9pZC9hcHAvYnVpbGQuZ3JhZGxlCkBAIC04LDcgKzgsNyBAQAogCiAgIGRlZmF1bHRDb25maWcgewogICAgIGFwcGxpY2F0aW9uSWQgImNvbS5mbGF0YnVmZmVycy5hcHAiCi0gICAgbWluU2RrVmVyc2lvbiAxNgorICAgIG1pblNka1ZlcnNpb24gMjYKICAgICB0YXJnZXRTZGtWZXJzaW9uIDMwCiAgICAgdmVyc2lvbkNvZGUgMQogICAgIHZlcnNpb25OYW1lICIxLjAiCkBAIC0xOCw2ICsxOCwxOCBAQAogICAgICAgdGFyZ2V0Q29tcGF0aWJpbGl0eSBKYXZhVmVyc2lvbi5WRVJTSU9OXzFfOAogICAgIH0KIAorICAgIHNvdXJjZVNldHMgeworICAgICAgbWFpbiB7CisgICAgICAgIGphdmEgeworICAgICAgICAgIHNyY0RpciAnLi4vLi4vamF2YS9zcmMvbWFpbi9qYXZhLycKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKworICAgIG5kayB7CisgICAgICBhYmlGaWx0ZXJzICdhcm02NC12OGEnLCAnYXJtZWFiaS12N2EnCisgICAgfQorICAgIAogICAgIHRlc3RJbnN0cnVtZW50YXRpb25SdW5uZXIgImFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdFJ1bm5lciIKICAgICBleHRlcm5hbE5hdGl2ZUJ1aWxkIHsKICAgICAgIGNtYWtlIHsKQEAgLTMzLDcgKzQ1LDYgQEAKICAgICB9CiAgIH0KIAotICBuZGtWZXJzaW9uICIyMS4zLjY1MjgxNDciCiAgIGV4dGVybmFsTmF0aXZlQnVpbGQgewogICAgIGNtYWtlIHsKICAgICAgIHBhdGggInNyYy9tYWluL2NwcC9DTWFrZUxpc3RzLnR4dCIKQEAgLTUyLDE2ICs2MywxNyBAQAogICAgIGZic0ZpbGVzLmZvckVhY2h7CiAgICAgICBjb21tYW5kTGluZUFyZ3MuYWRkKGl0LnBhdGgpCiAgICAgfQorCiAgICAgY29tbWFuZExpbmUgY29tbWFuZExpbmVBcmdzCiAKICAgICBkb0ZpcnN0IHsKICAgICAgIGRlbGV0ZSAiJG91dHB1dENwcERpci8iCiAgICAgICBta2RpciAiJG91dHB1dENwcERpci8iCiAgICAgfQorCiAgICAgZG9MYXN0IHsKLSAgICAgIGlmIChleGVjUmVzdWx0LmdldEV4aXRWYWx1ZSgpICE9IDApIHsKLSAgICAgICAgcHJpbnRsbihzdGFuZGFyZE91dHB1dC50b1N0cmluZygpKQotICAgICAgICB0aHJvdyBuZXcgR3JhZGxlRXhjZXB0aW9uKCJmbGF0YyBjb21tYW5kIGxpbmUgZmFpbGVkIikKKyAgICAgIGlmIChleGVjdXRpb25SZXN1bHQuZ2V0KCkuZXhpdFZhbHVlICE9IDApIHsKKyAgICAgICAgdGhyb3cgbmV3IEdyYWRsZUV4Y2VwdGlvbigiZmxhdGMgZmFpbGVkIHdpdGg6ICR7ZXhlY3V0aW9uUmVzdWx0LmdldCgpLnRvU3RyaW5nKCl9IikKICAgICAgIH0KICAgICB9CiAgIH0KQEAgLTc0LDYgKzg2LDEwIEBACiAKICAgICBzdGFuZGFyZE91dHB1dCA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKQogICAgIGVycm9yT3V0cHV0ID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpCisKKyAgICBzZXRFcnJvck91dHB1dChlcnJvck91dHB1dCkKKyAgICBzZXRTdGFuZGFyZE91dHB1dChzdGFuZGFyZE91dHB1dCkKKwogICAgIGRlZiBjb21tYW5kTGluZUFyZ3MgPSBbJ2ZsYXRjJywgJy1vJywgb3V0cHV0S290bGluRGlyLCAnLS1rb3RsaW4nXQogICAgIGZic0ZpbGVzLmZvckVhY2h7CiAgICAgICBjb21tYW5kTGluZUFyZ3MuYWRkKGl0LnBhdGgpCkBAIC04NSw0MSArMTAxLDE2IEBACiAgICAgICBta2RpciAiJG91dHB1dEtvdGxpbkRpci8iCiAgICAgfQogICAgIGRvTGFzdCB7Ci0gICAgICBpZiAoZXhlY1Jlc3VsdC5nZXRFeGl0VmFsdWUoKSAhPSAwKSB7Ci0gICAgICAgIHByaW50bG4oc3RhbmRhcmRPdXRwdXQudG9TdHJpbmcoKSkKLSAgICAgICAgdGhyb3cgbmV3IEdyYWRsZUV4Y2VwdGlvbigiZmxhdGMgY29tbWFuZCBsaW5lIGZhaWxlZCIpCisgICAgICBpZiAoZXhlY3V0aW9uUmVzdWx0LmdldCgpLmV4aXRWYWx1ZSAhPSAwKSB7CisgICAgICAgIHRocm93IG5ldyBHcmFkbGVFeGNlcHRpb24oImZsYXRjIGZhaWxlZCB3aXRoOiAke2V4ZWN1dGlvblJlc3VsdC5nZXQoKS50b1N0cmluZygpfSIpCiAgICAgICB9CiAgICAgfQogICB9CiAKICAgYWZ0ZXJFdmFsdWF0ZSB7Ci0gICAgYW5kcm9pZC5hcHBsaWNhdGlvblZhcmlhbnRzLmFsbCB7IHZhcmlhbnQgLT4KLSAgICAgIHZhcmlhbnQuamF2YUNvbXBpbGVyLmRlcGVuZHNPbihnZW5lcmF0ZUZic0tvdGxpbikKLSAgICAgIHZhcmlhbnQuamF2YUNvbXBpbGVyLmRlcGVuZHNPbihnZW5lcmF0ZUZic0NwcCkKLSAgICB9Ci0gIH0KLQotICBmbGF2b3JEaW1lbnNpb25zICJzdGwtdmFyaWFudCIKLSAgcHJvZHVjdEZsYXZvcnMgewotICAgIGdudXN0bCB7Ci0gICAgICBkaW1lbnNpb24gInN0bC12YXJpYW50IgotICAgICAgYXBwbGljYXRpb25JZFN1ZmZpeCAiLmdudXN0bCIKLSAgICAgIHZlcnNpb25OYW1lU3VmZml4ICItZ251c3RsIgotICAgICAgZXh0ZXJuYWxOYXRpdmVCdWlsZCB7Ci0gICAgICAgIG5ka0J1aWxkIHsKLSAgICAgICAgICBhcmd1bWVudHMgIkFQUF9TVEw9Z251c3RsX3N0YXRpYyIKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICBsaWJjcHAgewotICAgICAgZGltZW5zaW9uICJzdGwtdmFyaWFudCIKLSAgICAgIGFwcGxpY2F0aW9uSWRTdWZmaXggIi5saWJjcHAiCi0gICAgICB2ZXJzaW9uTmFtZVN1ZmZpeCAiLWxpYmNwcCIKLSAgICAgIGV4dGVybmFsTmF0aXZlQnVpbGQgewotICAgICAgICBuZGtCdWlsZCB7Ci0gICAgICAgICAgYXJndW1lbnRzICJBUFBfU1RMPWMrK19zdGF0aWMiCi0gICAgICAgIH0KLSAgICAgIH0KKyAgICB0YXNrcy5uYW1lZCgicHJlQnVpbGQiKSB7CisgICAgICBkZXBlbmRzT24oZ2VuZXJhdGVGYnNLb3RsaW4pCisgICAgICBkZXBlbmRzT24oZ2VuZXJhdGVGYnNDcHApCiAgICAgfQogICB9CiB9CkBAIC0xMjksNiArMTIwLDggQEAKICAgaW1wbGVtZW50YXRpb24gIm9yZy5qZXRicmFpbnMua290bGluOmtvdGxpbi1zdGRsaWI6JGtvdGxpbl92ZXJzaW9uIgogICBpbXBsZW1lbnRhdGlvbiAnYW5kcm9pZHguY29yZTpjb3JlLWt0eDoxLjMuMicKICAgaW1wbGVtZW50YXRpb24gJ2FuZHJvaWR4LmFwcGNvbXBhdDphcHBjb21wYXQ6MS4yLjAnCi0gIGltcGxlbWVudGF0aW9uICdjb20uZ29vZ2xlLmZsYXRidWZmZXJzOmZsYXRidWZmZXJzLWphdmE6Mi4wLjAnCisKKyAgLy8gSWYgeW91IHVzaW5nIGphdmEgcnVudGltZSB5b3UgY2FuIGFkZCBpdHMgZGVwZW5kZW5jeSBhcyB0aGUgZXhhbXBsZSBiZWxvdworICAvLyBpbXBsZW1lbnRhdGlvbiAnY29tLmdvb2dsZS5mbGF0YnVmZmVyczpmbGF0YnVmZmVycy1qYXZhOiRsYXRlc3RfdmVyc2lvbicKIAogfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvYW5kcm9pZC9hcHAvc3JjL21haW4vY3BwL2ZsYXRidWZmZXJzL0NNYWtlTGlzdHMudHh0IGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvYW5kcm9pZC9hcHAvc3JjL21haW4vY3BwL2ZsYXRidWZmZXJzL0NNYWtlTGlzdHMudHh0CmluZGV4IDBlNWYzZTkuLmUxZGQxZTggMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL2FuZHJvaWQvYXBwL3NyYy9tYWluL2NwcC9mbGF0YnVmZmVycy9DTWFrZUxpc3RzLnR4dAorKysgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy9hbmRyb2lkL2FwcC9zcmMvbWFpbi9jcHAvZmxhdGJ1ZmZlcnMvQ01ha2VMaXN0cy50eHQKQEAgLTI2LDYgKzI2LDcgQEAKICAgICAgICAgJHtGTEFUQlVGRkVSU19TUkN9L2luY2x1ZGUvZmxhdGJ1ZmZlcnMvZmxhdGJ1ZmZlcl9idWlsZGVyLmgKICAgICAgICAgJHtGTEFUQlVGRkVSU19TUkN9L2luY2x1ZGUvZmxhdGJ1ZmZlcnMvZmxhdGJ1ZmZlcnMuaAogICAgICAgICAke0ZMQVRCVUZGRVJTX1NSQ30vaW5jbHVkZS9mbGF0YnVmZmVycy9mbGV4YnVmZmVycy5oCisgICAgICAgICR7RkxBVEJVRkZFUlNfU1JDfS9pbmNsdWRlL2ZsYXRidWZmZXJzL2ZsZXhfZmxhdF91dGlsLmgKICAgICAgICAgJHtGTEFUQlVGRkVSU19TUkN9L2luY2x1ZGUvZmxhdGJ1ZmZlcnMvaGFzaC5oCiAgICAgICAgICR7RkxBVEJVRkZFUlNfU1JDfS9pbmNsdWRlL2ZsYXRidWZmZXJzL2lkbC5oCiAgICAgICAgICR7RkxBVEJVRkZFUlNfU1JDfS9pbmNsdWRlL2ZsYXRidWZmZXJzL21pbmlyZWZsZWN0LmgKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL2FuZHJvaWQvYXBwL3NyYy9tYWluL2NwcC9nZW5lcmF0ZWQvYW5pbWFsX2dlbmVyYXRlZC5oIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvYW5kcm9pZC9hcHAvc3JjL21haW4vY3BwL2dlbmVyYXRlZC9hbmltYWxfZ2VuZXJhdGVkLmgKaW5kZXggMWJhOWIwOS4uNTI1M2Y2NyAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvYW5kcm9pZC9hcHAvc3JjL21haW4vY3BwL2dlbmVyYXRlZC9hbmltYWxfZ2VuZXJhdGVkLmgKKysrIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvYW5kcm9pZC9hcHAvc3JjL21haW4vY3BwL2dlbmVyYXRlZC9hbmltYWxfZ2VuZXJhdGVkLmgKQEAgLTYsNiArNiwxMyBAQAogCiAjaW5jbHVkZSAiZmxhdGJ1ZmZlcnMvZmxhdGJ1ZmZlcnMuaCIKIAorLy8gRW5zdXJlIHRoZSBpbmNsdWRlZCBmbGF0YnVmZmVycy5oIGlzIHRoZSBzYW1lIHZlcnNpb24gYXMgd2hlbiB0aGlzIGZpbGUgd2FzCisvLyBnZW5lcmF0ZWQsIG90aGVyd2lzZSBpdCBtYXkgbm90IGJlIGNvbXBhdGlibGUuCitzdGF0aWNfYXNzZXJ0KEZMQVRCVUZGRVJTX1ZFUlNJT05fTUFKT1IgPT0gMiAmJgorICAgICAgICAgICAgICBGTEFUQlVGRkVSU19WRVJTSU9OX01JTk9SID09IDAgJiYKKyAgICAgICAgICAgICAgRkxBVEJVRkZFUlNfVkVSU0lPTl9SRVZJU0lPTiA9PSA4LAorICAgICAgICAgICAgICJOb24tY29tcGF0aWJsZSBmbGF0YnVmZmVycyB2ZXJzaW9uIGluY2x1ZGVkIik7CisKIG5hbWVzcGFjZSBjb20gewogbmFtZXNwYWNlIGZicyB7CiBuYW1lc3BhY2UgYXBwIHsKQEAgLTM1LDcgKzQyLDcgQEAKICAgICAgICAgICAgdmVyaWZpZXIuVmVyaWZ5U3RyaW5nKG5hbWUoKSkgJiYKICAgICAgICAgICAgVmVyaWZ5T2Zmc2V0KHZlcmlmaWVyLCBWVF9TT1VORCkgJiYKICAgICAgICAgICAgdmVyaWZpZXIuVmVyaWZ5U3RyaW5nKHNvdW5kKCkpICYmCi0gICAgICAgICAgIFZlcmlmeUZpZWxkPHVpbnQxNl90Pih2ZXJpZmllciwgVlRfV0VJR0hUKSAmJgorICAgICAgICAgICBWZXJpZnlGaWVsZDx1aW50MTZfdD4odmVyaWZpZXIsIFZUX1dFSUdIVCwgMikgJiYKICAgICAgICAgICAgdmVyaWZpZXIuRW5kVGFibGUoKTsKICAgfQogfTsKQEAgLTU3LDcgKzY0LDYgQEAKICAgICAgICAgOiBmYmJfKF9mYmIpIHsKICAgICBzdGFydF8gPSBmYmJfLlN0YXJ0VGFibGUoKTsKICAgfQotICBBbmltYWxCdWlsZGVyICZvcGVyYXRvcj0oY29uc3QgQW5pbWFsQnVpbGRlciAmKTsKICAgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxBbmltYWw+IEZpbmlzaCgpIHsKICAgICBjb25zdCBhdXRvIGVuZCA9IGZiYl8uRW5kVGFibGUoc3RhcnRfKTsKICAgICBhdXRvIG8gPSBmbGF0YnVmZmVyczo6T2Zmc2V0PEFuaW1hbD4oZW5kKTsKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL2FuZHJvaWQvYXBwL3NyYy9tYWluL2phdmEvZ2VuZXJhdGVkL2NvbS9mYnMvYXBwL0FuaW1hbC5rdCBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL2FuZHJvaWQvYXBwL3NyYy9tYWluL2phdmEvZ2VuZXJhdGVkL2NvbS9mYnMvYXBwL0FuaW1hbC5rdAppbmRleCA4OWRhNjQ2Li5mNjQ3ZmVmIDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy9hbmRyb2lkL2FwcC9zcmMvbWFpbi9qYXZhL2dlbmVyYXRlZC9jb20vZmJzL2FwcC9BbmltYWwua3QKKysrIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvYW5kcm9pZC9hcHAvc3JjL21haW4vamF2YS9nZW5lcmF0ZWQvY29tL2Zicy9hcHAvQW5pbWFsLmt0CkBAIC03LDcgKzcsNiBAQAogaW1wb3J0IGNvbS5nb29nbGUuZmxhdGJ1ZmZlcnMuKgogCiBAU3VwcHJlc3MoInVudXNlZCIpCi1ARXhwZXJpbWVudGFsVW5zaWduZWRUeXBlcwogY2xhc3MgQW5pbWFsIDogVGFibGUoKSB7CiAKICAgICBmdW4gX19pbml0KF9pOiBJbnQsIF9iYjogQnl0ZUJ1ZmZlcikgIHsKQEAgLTM3LDcgKzM2LDcgQEAKICAgICAgICAgICAgIHJldHVybiBpZihvICE9IDApIGJiLmdldFNob3J0KG8gKyBiYl9wb3MpLnRvVVNob3J0KCkgZWxzZSAwdQogICAgICAgICB9CiAgICAgY29tcGFuaW9uIG9iamVjdCB7Ci0gICAgICAgIGZ1biB2YWxpZGF0ZVZlcnNpb24oKSA9IENvbnN0YW50cy5GTEFUQlVGRkVSU18yXzBfMCgpCisgICAgICAgIGZ1biB2YWxpZGF0ZVZlcnNpb24oKSA9IENvbnN0YW50cy5GTEFUQlVGRkVSU18yXzBfOCgpCiAgICAgICAgIGZ1biBnZXRSb290QXNBbmltYWwoX2JiOiBCeXRlQnVmZmVyKTogQW5pbWFsID0gZ2V0Um9vdEFzQW5pbWFsKF9iYiwgQW5pbWFsKCkpCiAgICAgICAgIGZ1biBnZXRSb290QXNBbmltYWwoX2JiOiBCeXRlQnVmZmVyLCBvYmo6IEFuaW1hbCk6IEFuaW1hbCB7CiAgICAgICAgICAgICBfYmIub3JkZXIoQnl0ZU9yZGVyLkxJVFRMRV9FTkRJQU4pCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy9hbmRyb2lkL2dyYWRsZS5wcm9wZXJ0aWVzIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvYW5kcm9pZC9ncmFkbGUucHJvcGVydGllcwppbmRleCA5YmIxY2IyLi5iZjMwNjhkIDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy9hbmRyb2lkL2dyYWRsZS5wcm9wZXJ0aWVzCisrKyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL2FuZHJvaWQvZ3JhZGxlLnByb3BlcnRpZXMKQEAgLTE5LDMgKzE5LDUgQEAKIGFuZHJvaWQuZW5hYmxlSmV0aWZpZXI9dHJ1ZQogIyBLb3RsaW4gY29kZSBzdHlsZSBmb3IgdGhpcyBwcm9qZWN0OiAib2ZmaWNpYWwiIG9yICJvYnNvbGV0ZSI6CiBrb3RsaW4uY29kZS5zdHlsZT1vZmZpY2lhbAorIyBVc2UgcGFyYWxsZWwgYnVpbGRzCitvcmcuZ3JhZGxlLnBhcmFsbGVsPXRydWUKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy9hbmRyb2lkL2dyYWRsZS93cmFwcGVyL2dyYWRsZS13cmFwcGVyLmphciBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL2FuZHJvaWQvZ3JhZGxlL3dyYXBwZXIvZ3JhZGxlLXdyYXBwZXIuamFyCmluZGV4IGI0MTYzYjguLjQxZDk5MjcgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL2FuZHJvaWQvZ3JhZGxlL3dyYXBwZXIvZ3JhZGxlLXdyYXBwZXIuamFyCisrKyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL2FuZHJvaWQvZ3JhZGxlL3dyYXBwZXIvZ3JhZGxlLXdyYXBwZXIuamFyCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL2FuZHJvaWQvZ3JhZGxlL3dyYXBwZXIvZ3JhZGxlLXdyYXBwZXIucHJvcGVydGllcyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL2FuZHJvaWQvZ3JhZGxlL3dyYXBwZXIvZ3JhZGxlLXdyYXBwZXIucHJvcGVydGllcwppbmRleCA0MTZmMjNjLi5hYTk5MWZjIDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy9hbmRyb2lkL2dyYWRsZS93cmFwcGVyL2dyYWRsZS13cmFwcGVyLnByb3BlcnRpZXMKKysrIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvYW5kcm9pZC9ncmFkbGUvd3JhcHBlci9ncmFkbGUtd3JhcHBlci5wcm9wZXJ0aWVzCkBAIC0xLDYgKzEsNSBAQAotI1RodSBPY3QgMjkgMTk6NDc6MjMgQ0VUIDIwMjAKIGRpc3RyaWJ1dGlvbkJhc2U9R1JBRExFX1VTRVJfSE9NRQogZGlzdHJpYnV0aW9uUGF0aD13cmFwcGVyL2Rpc3RzCitkaXN0cmlidXRpb25Vcmw9aHR0cHNcOi8vc2VydmljZXMuZ3JhZGxlLm9yZy9kaXN0cmlidXRpb25zL2dyYWRsZS03LjQuMi1iaW4uemlwCiB6aXBTdG9yZUJhc2U9R1JBRExFX1VTRVJfSE9NRQogemlwU3RvcmVQYXRoPXdyYXBwZXIvZGlzdHMKLWRpc3RyaWJ1dGlvblVybD1odHRwc1w6Ly9zZXJ2aWNlcy5ncmFkbGUub3JnL2Rpc3RyaWJ1dGlvbnMvZ3JhZGxlLTYuNS1hbGwuemlwCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy9iZW5jaG1hcmtzL0NNYWtlTGlzdHMudHh0IGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvYmVuY2htYXJrcy9DTWFrZUxpc3RzLnR4dAppbmRleCA4ZDQ5YzM1Li4yNzJhMmI3IDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy9iZW5jaG1hcmtzL0NNYWtlTGlzdHMudHh0CisrKyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL2JlbmNobWFya3MvQ01ha2VMaXN0cy50eHQKQEAgLTE2LDcgKzE2LDcgQEAKIEZldGNoQ29udGVudF9EZWNsYXJlKAogICAgIGdvb2dsZWJlbmNobWFyawogICAgIEdJVF9SRVBPU0lUT1JZIGh0dHBzOi8vZ2l0aHViLmNvbS9nb29nbGUvYmVuY2htYXJrLmdpdAotICAgIEdJVF9UQUcgICAgICAgIGY5MWI2YjQyYjFiOTg1NDc3MmE5MGFlOTUwMTQ2NGExNjE3MDdkMWUgIyB2MS42LjAKKyAgICBHSVRfVEFHICAgICAgICAwZDk4ZGJhMjlkNjZlOTMyNTlkYjdkYWE1M2E5MzI3ZGY3NjdhNDE1ICMgdjEuNi4xCiApCiAKICMgRm9yIFdpbmRvd3M6IFByZXZlbnQgb3ZlcnJpZGluZyB0aGUgcGFyZW50IHByb2plY3QncyBjb21waWxlci9saW5rZXIgCkBAIC02Niw2ICs2NiwxMiBAQAogICAgIGN4eF9zdGRfMTEKICkKIAordGFyZ2V0X2NvbXBpbGVfb3B0aW9ucyhmbGF0YmVuY2htYXJrCisgICAgUFJJVkFURQorICAgICAgICAtZm5vLWFsaWduZWQtbmV3CisgICAgICAgIC1Xbm8tZGVwcmVjYXRlZC1kZWNsYXJhdGlvbnMKKykKKwogIyBTZXQgdGhlIG91dHB1dCBkaXJlY3RvcnkgdG8gdGhlIHJvb3QgYmluYXJ5IGRpcmVjdG9yeQogc2V0X3RhcmdldF9wcm9wZXJ0aWVzKGZsYXRiZW5jaG1hcmsgCiAgICAgUFJPUEVSVElFUyBSVU5USU1FX09VVFBVVF9ESVJFQ1RPUlkgCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy9iZW5jaG1hcmtzL2NwcC9mbGF0YnVmZmVycy9iZW5jaF9nZW5lcmF0ZWQuaCBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL2JlbmNobWFya3MvY3BwL2ZsYXRidWZmZXJzL2JlbmNoX2dlbmVyYXRlZC5oCmluZGV4IDlkMjA3YzUuLjgyOTM3NTkgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL2JlbmNobWFya3MvY3BwL2ZsYXRidWZmZXJzL2JlbmNoX2dlbmVyYXRlZC5oCisrKyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL2JlbmNobWFya3MvY3BwL2ZsYXRidWZmZXJzL2JlbmNoX2dlbmVyYXRlZC5oCkBAIC02LDYgKzYsMTMgQEAKIAogI2luY2x1ZGUgImZsYXRidWZmZXJzL2ZsYXRidWZmZXJzLmgiCiAKKy8vIEVuc3VyZSB0aGUgaW5jbHVkZWQgZmxhdGJ1ZmZlcnMuaCBpcyB0aGUgc2FtZSB2ZXJzaW9uIGFzIHdoZW4gdGhpcyBmaWxlIHdhcworLy8gZ2VuZXJhdGVkLCBvdGhlcndpc2UgaXQgbWF5IG5vdCBiZSBjb21wYXRpYmxlLgorc3RhdGljX2Fzc2VydChGTEFUQlVGRkVSU19WRVJTSU9OX01BSk9SID09IDIgJiYKKyAgICAgICAgICAgICAgRkxBVEJVRkZFUlNfVkVSU0lPTl9NSU5PUiA9PSAwICYmCisgICAgICAgICAgICAgIEZMQVRCVUZGRVJTX1ZFUlNJT05fUkVWSVNJT04gPT0gNiwKKyAgICAgICAgICAgICAiTm9uLWNvbXBhdGlibGUgZmxhdGJ1ZmZlcnMgdmVyc2lvbiBpbmNsdWRlZCIpOworCiBuYW1lc3BhY2UgYmVuY2htYXJrc19mbGF0YnVmZmVycyB7CiAKIHN0cnVjdCBGb287CkBAIC0xNTcsMTEgKzE2NCwxMSBAQAogICB9CiAgIGJvb2wgVmVyaWZ5KGZsYXRidWZmZXJzOjpWZXJpZmllciAmdmVyaWZpZXIpIGNvbnN0IHsKICAgICByZXR1cm4gVmVyaWZ5VGFibGVTdGFydCh2ZXJpZmllcikgJiYKLSAgICAgICAgICAgVmVyaWZ5RmllbGQ8YmVuY2htYXJrc19mbGF0YnVmZmVyczo6QmFyPih2ZXJpZmllciwgVlRfU0lCTElORykgJiYKKyAgICAgICAgICAgVmVyaWZ5RmllbGQ8YmVuY2htYXJrc19mbGF0YnVmZmVyczo6QmFyPih2ZXJpZmllciwgVlRfU0lCTElORywgOCkgJiYKICAgICAgICAgICAgVmVyaWZ5T2Zmc2V0KHZlcmlmaWVyLCBWVF9OQU1FKSAmJgogICAgICAgICAgICB2ZXJpZmllci5WZXJpZnlTdHJpbmcobmFtZSgpKSAmJgotICAgICAgICAgICBWZXJpZnlGaWVsZDxkb3VibGU+KHZlcmlmaWVyLCBWVF9SQVRJTkcpICYmCi0gICAgICAgICAgIFZlcmlmeUZpZWxkPHVpbnQ4X3Q+KHZlcmlmaWVyLCBWVF9QT1NURklYKSAmJgorICAgICAgICAgICBWZXJpZnlGaWVsZDxkb3VibGU+KHZlcmlmaWVyLCBWVF9SQVRJTkcsIDgpICYmCisgICAgICAgICAgIFZlcmlmeUZpZWxkPHVpbnQ4X3Q+KHZlcmlmaWVyLCBWVF9QT1NURklYLCAxKSAmJgogICAgICAgICAgICB2ZXJpZmllci5FbmRUYWJsZSgpOwogICB9CiB9OwpAQCAtMjQ3LDggKzI1NCw4IEBACiAgICAgICAgICAgIFZlcmlmeU9mZnNldCh2ZXJpZmllciwgVlRfTElTVCkgJiYKICAgICAgICAgICAgdmVyaWZpZXIuVmVyaWZ5VmVjdG9yKGxpc3QoKSkgJiYKICAgICAgICAgICAgdmVyaWZpZXIuVmVyaWZ5VmVjdG9yT2ZUYWJsZXMobGlzdCgpKSAmJgotICAgICAgICAgICBWZXJpZnlGaWVsZDx1aW50OF90Pih2ZXJpZmllciwgVlRfSU5JVElBTElaRUQpICYmCi0gICAgICAgICAgIFZlcmlmeUZpZWxkPGludDE2X3Q+KHZlcmlmaWVyLCBWVF9GUlVJVCkgJiYKKyAgICAgICAgICAgVmVyaWZ5RmllbGQ8dWludDhfdD4odmVyaWZpZXIsIFZUX0lOSVRJQUxJWkVELCAxKSAmJgorICAgICAgICAgICBWZXJpZnlGaWVsZDxpbnQxNl90Pih2ZXJpZmllciwgVlRfRlJVSVQsIDIpICYmCiAgICAgICAgICAgIFZlcmlmeU9mZnNldCh2ZXJpZmllciwgVlRfTE9DQVRJT04pICYmCiAgICAgICAgICAgIHZlcmlmaWVyLlZlcmlmeVN0cmluZyhsb2NhdGlvbigpKSAmJgogICAgICAgICAgICB2ZXJpZmllci5FbmRUYWJsZSgpOwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvYmVuY2htYXJrcy9jcHAvZmxhdGJ1ZmZlcnMvZmJfYmVuY2guY3BwIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvYmVuY2htYXJrcy9jcHAvZmxhdGJ1ZmZlcnMvZmJfYmVuY2guY3BwCmluZGV4IDJiYmI5YTUuLjkzNTE2NjcgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL2JlbmNobWFya3MvY3BwL2ZsYXRidWZmZXJzL2ZiX2JlbmNoLmNwcAorKysgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy9iZW5jaG1hcmtzL2NwcC9mbGF0YnVmZmVycy9mYl9iZW5jaC5jcHAKQEAgLTE2LDcgKzE2LDcgQEAKICAgZXhwbGljaXQgRmxhdEJ1ZmZlckJlbmNoKGludDY0X3QgaW5pdGlhbF9zaXplLCBBbGxvY2F0b3IgKmFsbG9jYXRvcikKICAgICAgIDogZmJiKGluaXRpYWxfc2l6ZSwgYWxsb2NhdG9yLCBmYWxzZSkge30KIAotICB1aW50OF90ICpFbmNvZGUodm9pZCAqLCBpbnQ2NF90ICZsZW4pIHsKKyAgdWludDhfdCAqRW5jb2RlKHZvaWQgKiwgaW50NjRfdCAmbGVuKSBvdmVycmlkZSB7CiAgICAgZmJiLkNsZWFyKCk7CiAKICAgICBjb25zdCBpbnQga1ZlY3Rvckxlbmd0aCA9IDM7CkBAIC00MCw3ICs0MCw3IEBACiAgICAgcmV0dXJuIGZiYi5HZXRCdWZmZXJQb2ludGVyKCk7CiAgIH0KIAotICBpbnQ2NF90IFVzZSh2b2lkICpkZWNvZGVkKSB7CisgIGludDY0X3QgVXNlKHZvaWQgKmRlY29kZWQpIG92ZXJyaWRlIHsKICAgICBzdW0gPSAwOwogICAgIGF1dG8gZm9vYmFyY29udGFpbmVyID0gR2V0Rm9vQmFyQ29udGFpbmVyKGRlY29kZWQpOwogICAgIHN1bSA9IDA7CkBAIC02NSw4ICs2NSw4IEBACiAgICAgcmV0dXJuIHN1bTsKICAgfQogCi0gIHZvaWQgKkRlY29kZSh2b2lkICpidWZmZXIsIGludDY0X3QpIHsgcmV0dXJuIGJ1ZmZlcjsgfQotICB2b2lkIERlYWxsb2Modm9pZCAqKSBvdmVycmlkZXt9OworICB2b2lkICpEZWNvZGUodm9pZCAqYnVmZmVyLCBpbnQ2NF90KSBvdmVycmlkZSB7IHJldHVybiBidWZmZXI7IH0KKyAgdm9pZCBEZWFsbG9jKHZvaWQgKikgb3ZlcnJpZGUge307CiAKICAgRmxhdEJ1ZmZlckJ1aWxkZXIgZmJiOwogfTsKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL2JlbmNobWFya3MvY3BwL3Jhdy9yYXdfYmVuY2guY3BwIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvYmVuY2htYXJrcy9jcHAvcmF3L3Jhd19iZW5jaC5jcHAKaW5kZXggODEwY2IxZi4uYzY1YmNhNyAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvYmVuY2htYXJrcy9jcHAvcmF3L3Jhd19iZW5jaC5jcHAKKysrIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvYmVuY2htYXJrcy9jcHAvcmF3L3Jhd19iZW5jaC5jcHAKQEAgLTQ1LDcgKzQ1LDcgQEAKIH07CiAKIHN0cnVjdCBSYXdCZW5jaCA6IEJlbmNoIHsKLSAgdWludDhfdCAqRW5jb2RlKHZvaWQgKmJ1ZiwgaW50NjRfdCAmbGVuKSB7CisgIHVpbnQ4X3QgKkVuY29kZSh2b2lkICpidWYsIGludDY0X3QgJmxlbikgb3ZlcnJpZGUgewogICAgIEZvb0JhckNvbnRhaW5lciAqZmJjID0gbmV3IChidWYpIEZvb0JhckNvbnRhaW5lcjsKICAgICBzdHJjcHkoZmJjLT5sb2NhdGlvbiwgImh0dHA6Ly9nb29nbGUuY29tL2ZsYXRidWZmZXJzLyIpOyAgLy8gVW5zYWZlIGVlayEKICAgICBmYmMtPmxvY2F0aW9uX2xlbiA9IChpbnQpc3RybGVuKGZiYy0+bG9jYXRpb24pOwpAQCAtNzQsNyArNzQsNyBAQAogICAgIHJldHVybiByZWludGVycHJldF9jYXN0PHVpbnQ4X3QgKj4oZmJjKTsKICAgfTsKIAotICBpbnQ2NF90IFVzZSh2b2lkICpkZWNvZGVkKSB7CisgIGludDY0X3QgVXNlKHZvaWQgKmRlY29kZWQpIG92ZXJyaWRlIHsKICAgICBhdXRvIGZvb2JhcmNvbnRhaW5lciA9IHJlaW50ZXJwcmV0X2Nhc3Q8Rm9vQmFyQ29udGFpbmVyICo+KGRlY29kZWQpOwogICAgIHN1bSA9IDA7CiAgICAgQWRkKGZvb2JhcmNvbnRhaW5lci0+aW5pdGlhbGl6ZWQpOwpAQCAtOTgsNyArOTgsNyBAQAogICAgIHJldHVybiBzdW07CiAgIH0KIAotICB2b2lkICpEZWNvZGUodm9pZCAqYnVmLCBpbnQ2NF90KSB7IHJldHVybiBidWY7IH0KKyAgdm9pZCAqRGVjb2RlKHZvaWQgKmJ1ZiwgaW50NjRfdCkgb3ZlcnJpZGUgeyByZXR1cm4gYnVmOyB9CiAgIHZvaWQgRGVhbGxvYyh2b2lkICopIG92ZXJyaWRle307CiB9OwogCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy9idWlsZF9kZWZzLmJ6bCBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL2J1aWxkX2RlZnMuYnpsCmluZGV4IDRlYmQ4NzIuLjkwZWI3N2MgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL2J1aWxkX2RlZnMuYnpsCisrKyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL2J1aWxkX2RlZnMuYnpsCkBAIC00NiwxNSArNDYsNiBAQAogICAgICItLWdlbi1uYW1lLXN0cmluZ3MiLAogXQogCi1ERUZBVUxUX0ZMQVRDX1RTX0FSR1MgPSBbCi0gICAgIi0tZ2VuLW9iamVjdC1hcGkiLAotICAgICItLWdlbi1tdXRhYmxlIiwKLSAgICAiLS1yZWZsZWN0LW5hbWVzIiwKLSAgICAiLS1nZW4tbmFtZS1zdHJpbmdzIiwKLSAgICAiLS10cy1mbGF0LWZpbGVzIiwKLSAgICAiLS1rZWVwLXByZWZpeCIsCi1dCi0KICIiIkNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IGEgc2V0IG9mIGZsYXRidWZmZXJzIHdoaWNoIGhhdmUgdGhlaXIgY29kZSBmb3IKIHJlYWRpbmcvd3JpdGluZyBnZW5lcmF0ZWQgaW4gYSBzaW5nbGUgbGlicmFyeS1zdHlsZSBydWxlLgogCkBAIC00OTMsMTE0ICs0ODQsMyBAQAogICAgICAgICBjb21wYXRpYmxlX3dpdGggPSBjb21wYXRpYmxlX3dpdGgsCiAgICAgICAgIHRhcmdldF9jb21wYXRpYmxlX3dpdGggPSB0YXJnZXRfY29tcGF0aWJsZV93aXRoLAogICAgICkKLQotZGVmIGZsYXRidWZmZXJfdHNfbGlicmFyeSgKLSAgICAgICAgbmFtZSwKLSAgICAgICAgc3JjcywKLSAgICAgICAgY29tcGF0aWJsZV93aXRoID0gTm9uZSwKLSAgICAgICAgdGFyZ2V0X2NvbXBhdGlibGVfd2l0aCA9IE5vbmUsCi0gICAgICAgIGRlcHMgPSBbXSwKLSAgICAgICAgaW5jbHVkZV9wYXRocyA9IERFRkFVTFRfSU5DTFVERV9QQVRIUywKLSAgICAgICAgZmxhdGNfYXJncyA9IERFRkFVTFRfRkxBVENfVFNfQVJHUywKLSAgICAgICAgdmlzaWJpbGl0eSA9IE5vbmUsCi0gICAgICAgIHJlc3RyaWN0ZWRfdG8gPSBOb25lLAotICAgICAgICBpbmNsdWRlX3JlZmxlY3Rpb24gPSBUcnVlLAotICAgICAgICBwYWNrYWdlX25hbWUgPSBOb25lKToKLSAgICAiIiJHZW5lcmF0ZXMgYSB0c19saWJyYXJ5IHJ1bGUgZm9yIGEgZ2l2ZW4gZmxhdGJ1ZmZlciBkZWZpbml0aW9uLgotCi0gICAgQXJnczoKLSAgICAgIG5hbWU6IE5hbWUgb2YgdGhlIGdlbmVyYXRlZCB0c19saWJyYXJ5IHJ1bGUuCi0gICAgICBzcmNzOiBTb3VyY2UgLmZicyBmaWxlKHMpLgotICAgICAgZGVwczogT3RoZXIgZmxhdGJ1ZmZlcl90c19saWJyYXJ5J3MgdG8gZGVwZW5kIG9uLiBOb3RlIHRoYXQgY3VycmVudGx5Ci0gICAgICAgICAgICB5b3UgbXVzdCBzcGVjaWZ5IGFsbCB5b3VyIHRyYW5zaXRpdmUgZGVwZW5kZW5jaWVzIG1hbnVhbGx5LgotICAgICAgaW5jbHVkZV9wYXRoczogT3B0aW9uYWwsIGxpc3Qgb2YgcGF0aHMgdGhlIGluY2x1ZGVzIGZpbGVzIGNhbiBiZSBmb3VuZCBpbi4KLSAgICAgIGZsYXRjX2FyZ3M6IE9wdGlvbmFsIGxpc3Qgb2YgYWRkaXRpb25hbCBhcmd1bWVudHMgdG8gcGFzcyB0byBmbGF0YwotICAgICAgICAgIChlLmcuIC0tZ2VuLW11dGFibGUpLgotICAgICAgdmlzaWJpbGl0eTogVGhlIHZpc2liaWxpdHkgb2YgdGhlIGdlbmVyYXRlZCBjY19saWJyYXJ5LiBCeSBkZWZhdWx0LCB1c2UgdGhlCi0gICAgICAgICAgZGVmYXVsdCB2aXNpYmlsaXR5IG9mIHRoZSBwcm9qZWN0LgotICAgICAgY29tcGF0aWJsZV93aXRoOiBPcHRpb25hbCwgVGhlIGxpc3Qgb2YgZW52aXJvbm1lbnRzIHRoaXMgcnVsZSBjYW4gYmUgYnVpbHQKLSAgICAgICAgZm9yLCBpbiBhZGRpdGlvbiB0byBkZWZhdWx0LXN1cHBvcnRlZCBlbnZpcm9ubWVudHMuCi0gICAgICByZXN0cmljdGVkX3RvOiBPcHRpb25hbCwgVGhlIGxpc3Qgb2YgZW52aXJvbm1lbnRzIHRoaXMgcnVsZSBjYW4gYmUgYnVpbHQKLSAgICAgICAgZm9yLCBpbnN0ZWFkIG9mIGRlZmF1bHQtc3VwcG9ydGVkIGVudmlyb25tZW50cy4KLSAgICAgIHRhcmdldF9jb21wYXRpYmxlX3dpdGg6IE9wdGlvbmFsLCBUaGUgbGlzdCBvZiB0YXJnZXQgcGxhdGZvcm0gY29uc3RyYWludHMKLSAgICAgICAgdG8gdXNlLgotICAgICAgaW5jbHVkZV9yZWZsZWN0aW9uOiBPcHRpb25hbCwgV2hldGhlciB0byBkZXBlbmQgb24gdGhlIGZsYXRidWZmZXIKLSAgICAgICAgcmVmbGVjdGlvbiBsaWJyYXJ5IGF1dG9tYXRpY2FsbHkuIE9ubHkgcmVhbGx5IHJlbGV2YW50IGZvciB0aGUKLSAgICAgICAgdGFyZ2V0IHRoYXQgYnVpbGRzIHRoZSByZWZsZWN0aW9uIGxpYnJhcnkgaXRzZWxmLgotICAgICAgcGFja2FnZV9uYW1lOiBPcHRpb25hbCwgUGFja2FnZSBuYW1lIHRvIHVzZSBmb3IgdGhlIGdlbmVyYXRlZCBjb2RlLgotICAgICIiIgotICAgIHNyY3NfbGliID0gIiVzX3NyY3MiICUgKG5hbWUpCi0KLSAgICAjIGZyYzk3MS1zcGVjaWZpYyBtb2RpZmljYXRpb246IEFkZCBhIGdlbnJ1bGUgdGhhdCBvdmVyd3JpdGVzIHRoZSBpbXBvcnRzIGZvciBhbnkgZmxhdGJ1ZmZlcgotICAgICMgdHlwZXMgKG1vc3RseSBqdXN0IGZvciByZWZsZWN0aW9uKSBiZWNhdXNlIHRoZXkgbmVlZCB0byBwb2ludCB0byBleHRlcm5hbC8sIG5vdCB0bwotICAgICMgdGhpcmRfcGFydHkvLgotICAgICMgVE9ETyhqYW1lcyk6IFRoZXJlIGFic29sdXRlbHkgYXJlIGJldHRlciB3YXlzIHRvIGRvIHRoaXMsIGJ1dCB0aGlzIHdhcyB0aGUgcXVpY2sgYW5kIGRpcnR5Ci0gICAgIyBvbmUuLi4uCi0gICAgb3V0cyA9IFsiJXNfZ2VuZXJhdGVkLnRzIiAlIChzLnJlcGxhY2UoIi5mYnMiLCAiIikuc3BsaXQoIi8iKVstMV0pIGZvciBzIGluIHNyY3NdCi0gICAgaW5jbHVkZXMgPSBbZCArICJfaW5jbHVkZXMiIGZvciBkIGluIGRlcHNdCi0gICAgZmxhdGJ1ZmZlcl9saWJyYXJ5X3B1YmxpYygKLSAgICAgICAgbmFtZSA9IHNyY3NfbGliLAotICAgICAgICBzcmNzID0gc3JjcywKLSAgICAgICAgb3V0cHV0X3N1ZmZpeCA9ICJfcHJlZ2VuZXJhdGVkLnRzIiwKLSAgICAgICAgbGFuZ3VhZ2VfZmxhZyA9ICItLXRzIiwKLSAgICAgICAgaW5jbHVkZXMgPSBpbmNsdWRlcywKLSAgICAgICAgaW5jbHVkZV9wYXRocyA9IGluY2x1ZGVfcGF0aHMsCi0gICAgICAgIGZsYXRjX2FyZ3MgPSBmbGF0Y19hcmdzICsgWyItLWZpbGVuYW1lLXN1ZmZpeCBfcHJlZ2VuZXJhdGVkIl0sCi0gICAgICAgIGNvbXBhdGlibGVfd2l0aCA9IGNvbXBhdGlibGVfd2l0aCwKLSAgICAgICAgcmVzdHJpY3RlZF90byA9IHJlc3RyaWN0ZWRfdG8sCi0gICAgICAgIHRhcmdldF9jb21wYXRpYmxlX3dpdGggPSB0YXJnZXRfY29tcGF0aWJsZV93aXRoLAotICAgICkKLSAgICBnZW5ydWxlX2NtZCA9ICIgIi5qb2luKFsKLSAgICAgICAgIlNSQ1M9KCQoU1JDUykpOyIsCi0gICAgICAgICJPVVRTPSgkKE9VVFMpKTsiLAotICAgICAgICAiZm9yIGkgaW4gJCR7IVNSQ1NbQF19OyBkbyIsCi0gICAgICAgICJzZWQgXCJzLycuKnJlZmxlY3Rpb25cXC9yZWZsZWN0aW9uX3ByZWdlbmVyYXRlZC8nZmxhdGJ1ZmZlcnNfcmVmbGVjdGlvblxcL3JlZmxlY3Rpb25fZ2VuZXJhdGVkL1wiICQke1NSQ1NbaV19ID4gJCR7T1VUU1tpXX07IiwKLSAgICAgICAgInNlZCAtaSAncy9fcHJlZ2VuZXJhdGVkL19nZW5lcmF0ZWQvJyAkJHtPVVRTW2ldfTsiLAotICAgICAgICAiZG9uZSIsCi0gICAgXSkKLSAgICBuYXRpdmUuZ2VucnVsZSgKLSAgICAgICAgbmFtZSA9IG5hbWUgKyAiX3JlaW1wb3J0ZXIudHMiLAotICAgICAgICBzcmNzID0gW3NyY3NfbGliXSwKLSAgICAgICAgb3V0cyA9IG91dHMsCi0gICAgICAgIGNtZCA9IGdlbnJ1bGVfY21kLAotICAgICkKLSAgICB0c19wcm9qZWN0KAotICAgICAgICBuYW1lID0gbmFtZSArICJfdHMiLAotICAgICAgICBzcmNzID0gb3V0cywKLSAgICAgICAgZGVjbGFyYXRpb24gPSBUcnVlLAotICAgICAgICB2aXNpYmlsaXR5ID0gdmlzaWJpbGl0eSwKLSAgICAgICAgY29tcGF0aWJsZV93aXRoID0gY29tcGF0aWJsZV93aXRoLAotICAgICAgICByZXN0cmljdGVkX3RvID0gcmVzdHJpY3RlZF90bywKLSAgICAgICAgdGFyZ2V0X2NvbXBhdGlibGVfd2l0aCA9IHRhcmdldF9jb21wYXRpYmxlX3dpdGgsCi0gICAgICAgIHRzY29uZmlnID0gewotICAgICAgICAgICAgImNvbXBpbGVyT3B0aW9ucyI6IHsKLSAgICAgICAgICAgICAgICAiZGVjbGFyYXRpb24iOiBUcnVlLAotICAgICAgICAgICAgICAgICJsaWIiOiBbCi0gICAgICAgICAgICAgICAgICAgICJFUzIwMTUiLAotICAgICAgICAgICAgICAgICAgICAiRVMyMDIwLkJpZ0ludCIsCi0gICAgICAgICAgICAgICAgICAgICJET00iLAotICAgICAgICAgICAgICAgIF0sCi0gICAgICAgICAgICAgICAgIm1vZHVsZSI6ICJlczIwMTUiLAotICAgICAgICAgICAgICAgICJtb2R1bGVSZXNvbHV0aW9uIjogIm5vZGUiLAotICAgICAgICAgICAgICAgICJzdHJpY3QiOiBUcnVlLAotICAgICAgICAgICAgICAgICJ0eXBlcyI6IFsibm9kZSJdLAotICAgICAgICAgICAgfSwKLSAgICAgICAgfSwKLSAgICAgICAgZGVwcyA9IGRlcHMgKyBbIkBjb21fZ2l0aHViX2dvb2dsZV9mbGF0YnVmZmVycy8vdHM6ZmxhdGJ1ZmZlcnMiXSArIChbIkBjb21fZ2l0aHViX2dvb2dsZV9mbGF0YnVmZmVycy8vcmVmbGVjdGlvbjpyZWZsZWN0aW9uX3RzX2ZicyJdIGlmIGluY2x1ZGVfcmVmbGVjdGlvbiBlbHNlIFtdKSwKLSAgICApCi0gICAganNfbGlicmFyeSgKLSAgICAgICAgbmFtZSA9IG5hbWUsCi0gICAgICAgIHZpc2liaWxpdHkgPSB2aXNpYmlsaXR5LAotICAgICAgICBjb21wYXRpYmxlX3dpdGggPSBjb21wYXRpYmxlX3dpdGgsCi0gICAgICAgIHJlc3RyaWN0ZWRfdG8gPSByZXN0cmljdGVkX3RvLAotICAgICAgICB0YXJnZXRfY29tcGF0aWJsZV93aXRoID0gdGFyZ2V0X2NvbXBhdGlibGVfd2l0aCwKLSAgICAgICAgZGVwcyA9IFtuYW1lICsgIl90cyJdLAotICAgICAgICBwYWNrYWdlX25hbWUgPSBwYWNrYWdlX25hbWUsCi0gICAgKQotICAgIG5hdGl2ZS5maWxlZ3JvdXAoCi0gICAgICAgIG5hbWUgPSAiJXNfaW5jbHVkZXMiICUgKG5hbWUpLAotICAgICAgICBzcmNzID0gc3JjcyArIGluY2x1ZGVzLAotICAgICAgICBjb21wYXRpYmxlX3dpdGggPSBjb21wYXRpYmxlX3dpdGgsCi0gICAgICAgIHJlc3RyaWN0ZWRfdG8gPSByZXN0cmljdGVkX3RvLAotICAgICAgICB2aXNpYmlsaXR5ID0gdmlzaWJpbGl0eSwKLSAgICApCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy9jb25hbi9DTWFrZUxpc3RzLnR4dCBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL2NvbmFuL0NNYWtlTGlzdHMudHh0CmluZGV4IGQzMmEwMTMuLjY1ZjkwMjggMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL2NvbmFuL0NNYWtlTGlzdHMudHh0CisrKyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL2NvbmFuL0NNYWtlTGlzdHMudHh0CkBAIC01LDggKzUsOCBAQAogaW5jbHVkZSgke0NNQUtFX0JJTkFSWV9ESVJ9L2NvbmFuYnVpbGRpbmZvLmNtYWtlKQogY29uYW5fYmFzaWNfc2V0dXAoKQogCi1pZiAoV0lOMzIgQU5EIE1TVkMgQU5EIEZMQVRCVUZGRVJTX0JVSUxEX1NIQVJFRExJQikKK2lmIChXSU4zMiBBTkQgTVNWQ19MSUtFIEFORCBGTEFUQlVGRkVSU19CVUlMRF9TSEFSRURMSUIpCiAgICAgc2V0KENNQUtFX1dJTkRPV1NfRVhQT1JUX0FMTF9TWU1CT0xTIE9OKQotZW5kaWYoV0lOMzIgQU5EIE1TVkMgQU5EIEZMQVRCVUZGRVJTX0JVSUxEX1NIQVJFRExJQikKK2VuZGlmKFdJTjMyIEFORCBNU1ZDX0xJS0UgQU5EIEZMQVRCVUZGRVJTX0JVSUxEX1NIQVJFRExJQikKIAogaW5jbHVkZSgke0NNQUtFX1NPVVJDRV9ESVJ9L0NNYWtlTGlzdHNPcmlnaW5hbC50eHQpCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy9jb25hbi9hcHB2ZXlvci9idWlsZC5weSBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL2NvbmFuL2FwcHZleW9yL2J1aWxkLnB5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YmFjNDZkLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL2NvbmFuL2FwcHZleW9yL2J1aWxkLnB5CisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi0jIS91c3IvYmluL2VudiBweXRob24KLSMgLSotIGNvZGluZzogdXRmLTggLSotCi1pbXBvcnQgb3MKLQotaWYgb3MuZ2V0ZW52KCJBUFBWRVlPUl9SRVBPX1RBRyIpICE9ICJ0cnVlIjoKLSAgICBwcmludCgiU2tpcCBidWlsZCBzdGVwLiBJdCdzIG5vdCBUQUciKQotZWxzZToKLSAgICBvcy5zeXN0ZW0oInB5dGhvbiBjb25hbi9idWlsZC5weSIpCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy9jb25hbi9hcHB2ZXlvci9pbnN0YWxsLnB5IGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvY29uYW4vYXBwdmV5b3IvaW5zdGFsbC5weQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTYyYzdkYS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy9jb25hbi9hcHB2ZXlvci9pbnN0YWxsLnB5CisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi0jIS91c3IvYmluL2VudiBweXRob24KLSMgLSotIGNvZGluZzogdXRmLTggLSotCi1pbXBvcnQgb3MKLQotaWYgb3MuZ2V0ZW52KCJBUFBWRVlPUl9SRVBPX1RBRyIpICE9ICJ0cnVlIjoKLSAgICBwcmludCgiU2tpcCBzdGVwLiBJdCdzIG5vdCBUQUciKQotZWxzZToKLSAgICBvcy5zeXN0ZW0oInBpcCBpbnN0YWxsIGNvbmFuIGNvbmFuLXBhY2thZ2UtdG9vbHMiKQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvY29uYW4vYnVpbGQucHkgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy9jb25hbi9idWlsZC5weQppbmRleCA5YTg1NzE4Li42MmEzNzk5IDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy9jb25hbi9idWlsZC5weQorKysgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy9jb25hbi9idWlsZC5weQpAQCAtMjEsMTQgKzIxLDYgQEAKIAogZGVmIGdldF92ZXJzaW9uKCk6CiAgICAgdmVyc2lvbiA9IGdldF9icmFuY2goKQotICAgIGlmIG9zLmdldGVudigiVFJBVklTIiwgRmFsc2UpOgotICAgICAgICB2ZXJzaW9uID0gb3MuZ2V0ZW52KCJUUkFWSVNfQlJBTkNIIikKLQotICAgIGlmIG9zLmdldGVudigiQVBQVkVZT1IiLCBGYWxzZSk6Ci0gICAgICAgIHZlcnNpb24gPSBvcy5nZXRlbnYoIkFQUFZFWU9SX1JFUE9fQlJBTkNIIikKLSAgICAgICAgaWYgb3MuZ2V0ZW52KCJBUFBWRVlPUl9SRVBPX1RBRyIpID09ICJ0cnVlIjoKLSAgICAgICAgICAgIHZlcnNpb24gPSBvcy5nZXRlbnYoIkFQUFZFWU9SX1JFUE9fVEFHX05BTUUiKQotCiAgICAgbWF0Y2ggPSByZS5zZWFyY2gociJ2KFxkK1wuXGQrXC5cZCsuKikiLCB2ZXJzaW9uKQogICAgIGlmIG1hdGNoOgogICAgICAgICByZXR1cm4gbWF0Y2guZ3JvdXAoMSkKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL2NvbmFuL3RyYXZpcy9idWlsZC5zaCBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL2NvbmFuL3RyYXZpcy9idWlsZC5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDY5Y2VkMi4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy9jb25hbi90cmF2aXMvYnVpbGQuc2gKKysrIC9kZXYvbnVsbApAQCAtMSwxNCArMCwwIEBACi0jIS9iaW4vYmFzaAotCi1zZXQgLWUKLXNldCAteAotCi1pZiBbWyAiJCh1bmFtZSAtcykiID09ICdEYXJ3aW4nIF1dOyB0aGVuCi0gICAgaWYgd2hpY2ggcHllbnYgPiAvZGV2L251bGw7IHRoZW4KLSAgICAgICAgZXZhbCAiJChweWVudiBpbml0IC0pIgotICAgIGZpCi0gICAgcHllbnYgYWN0aXZhdGUgY29uYW4KLWZpCi0KLWNvbmFuIHVzZXIKLXB5dGhvbiBjb25hbi9idWlsZC5weQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvY29uYW4vdHJhdmlzL2luc3RhbGwuc2ggYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy9jb25hbi90cmF2aXMvaW5zdGFsbC5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZjQyMDhkOC4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy9jb25hbi90cmF2aXMvaW5zdGFsbC5zaAorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLSMhL2Jpbi9iYXNoCi0KLXNldCAtZQotc2V0IC14Ci0KLWlmIFtbICIkKHVuYW1lIC1zKSIgPT0gJ0RhcndpbicgXV07IHRoZW4KLSAgICBicmV3IHVwZGF0ZSB8fCBicmV3IHVwZGF0ZQotICAgIGJyZXcgb3V0ZGF0ZWQgcHllbnYgfHwgYnJldyB1cGdyYWRlIHB5ZW52Ci0gICAgYnJldyBpbnN0YWxsIHB5ZW52LXZpcnR1YWxlbnYKLSAgICBicmV3IGluc3RhbGwgY21ha2UgfHwgdHJ1ZQotCi0gICAgaWYgd2hpY2ggcHllbnYgPiAvZGV2L251bGw7IHRoZW4KLSAgICAgICAgZXZhbCAiJChweWVudiBpbml0IC0pIgotICAgIGZpCi0KLSAgICBweWVudiBpbnN0YWxsIDIuNy4xMAotICAgIHB5ZW52IHZpcnR1YWxlbnYgMi43LjEwIGNvbmFuCi0gICAgcHllbnYgcmVoYXNoCi0gICAgcHllbnYgYWN0aXZhdGUgY29uYW4KLWZpCi0KLXBpcCBpbnN0YWxsIC1VIGNvbmFuX3BhY2thZ2VfdG9vbHMgY29uYW4KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL2RhcnQvbGliL2ZsYXRfYnVmZmVycy5kYXJ0IGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvZGFydC9saWIvZmxhdF9idWZmZXJzLmRhcnQKaW5kZXggZDI3ZDRiZi4uOGNlMWFiOSAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvZGFydC9saWIvZmxhdF9idWZmZXJzLmRhcnQKKysrIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvZGFydC9saWIvZmxhdF9idWZmZXJzLmRhcnQKQEAgLTEsNyArMSwzIEBACi0vLyBDb3B5cmlnaHQgKGMpIDIwMTYsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQotLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLS8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KIGltcG9ydCAnZGFydDpjb2xsZWN0aW9uJzsKIGltcG9ydCAnZGFydDpjb252ZXJ0JzsKIGltcG9ydCAnZGFydDptYXRoJzsKQEAgLTQwMSw2ICszOTcsMTUgQEAKICAgICBfc2V0RmxvYXQzMkF0VGFpbChfdGFpbCwgdmFsdWUpOwogICB9CiAKKyAgLy8vIFdyaXRlcyBhIGJvb2wgdG8gdGhlIHRhaWwgb2YgdGhlIGJ1ZmZlciBhZnRlciBwcmVwYXJpbmcgc3BhY2UgZm9yIGl0LgorICAvLy8gQm9vbHMgYXJlIHJlcHJlc2VudGVkIGFzIGEgVWludDgsIHdpdGggdGhlIHZhbHVlIHNldCB0byAnMScgZm9yIHRydWUsIGFuZCAnMCcgZm9yIGZhbHNlCisgIC8vLworICAvLy8gVXBkYXRlcyB0aGUgW29mZnNldF0gcG9pbnRlci4gIFRoaXMgbWV0aG9kIGlzIGludGVuZGVkIGZvciB1c2Ugd2hlbiB3cml0aW5nIHN0cnVjdHMgdG8gdGhlIGJ1ZmZlci4KKyAgdm9pZCBwdXRCb29sKGJvb2wgdmFsdWUpIHsKKyAgICBfcHJlcGFyZShfc2l6ZW9mVWludDgsIDEpOworICAgIF9idWYuc2V0SW50OChfYnVmLmxlbmd0aEluQnl0ZXMgLSBfdGFpbCwgdmFsdWUgPyAxIDogMCk7CisgIH0KKwogICAvLy8gV3JpdGVzIGEgSW50NjQgdG8gdGhlIHRhaWwgb2YgdGhlIGJ1ZmZlciBhZnRlciBwcmVwYXJpbmcgc3BhY2UgZm9yIGl0LgogICAvLy8KICAgLy8vIFVwZGF0ZXMgdGhlIFtvZmZzZXRdIHBvaW50ZXIuICBUaGlzIG1ldGhvZCBpcyBpbnRlbmRlZCBmb3IgdXNlIHdoZW4gd3JpdGluZyBzdHJ1Y3RzIHRvIHRoZSBidWZmZXIuCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy9kYXJ0L2xpYi9zcmMvYnVpbGRlci5kYXJ0IGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvZGFydC9saWIvc3JjL2J1aWxkZXIuZGFydAppbmRleCBhMGQ0N2VkLi44MjY4MWU3IDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy9kYXJ0L2xpYi9zcmMvYnVpbGRlci5kYXJ0CisrKyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL2RhcnQvbGliL3NyYy9idWlsZGVyLmRhcnQKQEAgLTE3LDcgKzE3LDcgQEAKICAgZmluYWwgTWFwPGRvdWJsZSwgX1N0YWNrVmFsdWU+IF9pbmRpcmVjdERvdWJsZUNhY2hlID0ge307CiAKICAgLy8vIEluc3RhbnRpYXRlIHRoZSBidWlsZGVyIGlmIHlvdSBpbnRlbnQgdG8gZ3JhZHVhbGx5IGJ1aWxkIHVwIHRoZSBidWZmZXIgYnkgY2FsbGluZwotICAvLy8gYWRkLi4uIG1ldGhvZHMgYW5kIGNhbGxpbmcgW2ZpbmlzaF0gdG8gcmVjZWl2ZSB0aGUgdGhlIHJlc3VsdGluZyBieXRlIGFycmF5LgorICAvLy8gYWRkLi4uIG1ldGhvZHMgYW5kIGNhbGxpbmcgW2ZpbmlzaF0gdG8gcmVjZWl2ZSB0aGUgcmVzdWx0aW5nIGJ5dGUgYXJyYXkuCiAgIC8vLwogICAvLy8gVGhlIGRlZmF1bHQgc2l6ZSBvZiBpbnRlcm5hbCBidWZmZXIgaXMgc2V0IHRvIDIwNDguIFByb3ZpZGUgYSBkaWZmZXJlbnQgdmFsdWUgaW4gb3JkZXIgdG8gYXZvaWQgYnVmZmVyIGNvcGllcy4KICAgQnVpbGRlcih7aW50IHNpemUgPSAyMDQ4fSkgOiBfYnVmZmVyID0gQnl0ZURhdGEoc2l6ZSk7CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy9kYXJ0L2xpYi9zcmMvcmVmZXJlbmNlLmRhcnQgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy9kYXJ0L2xpYi9zcmMvcmVmZXJlbmNlLmRhcnQKaW5kZXggZTUyZDBiNy4uNjYxOTVjMSAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvZGFydC9saWIvc3JjL3JlZmVyZW5jZS5kYXJ0CisrKyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL2RhcnQvbGliL3NyYy9yZWZlcmVuY2UuZGFydApAQCAtMTk5LDcgKzE5OSw3IEBACiAgICAgcmV0dXJuIF9NYXBWYWx1ZUl0ZXJhdG9yKHRoaXMpOwogICB9CiAKLSAgLy8vIFJldHVybnMgdGhlIGxlbmd0aCBvZiB0aGUgdGhlIHVuZGVybHlpbmcgRmxleEJ1ZmZlciB2YWx1ZS4KKyAgLy8vIFJldHVybnMgdGhlIGxlbmd0aCBvZiB0aGUgdW5kZXJseWluZyBGbGV4QnVmZmVyIHZhbHVlLgogICAvLy8gSWYgdGhlIHVuZGVybHlpbmcgdmFsdWUgaXMgW251bGxdIHRoZSBsZW5ndGggaXMgMC4KICAgLy8vIElmIHRoZSB1bmRlcmx5aW5nIHZhbHVlIGlzIGEgbnVtYmVyLCBvciBhIGJvb2wsIHRoZSBsZW5ndGggaXMgMS4KICAgLy8vIElmIHRoZSB1bmRlcmx5aW5nIHZhbHVlIGlzIGEgdmVjdG9yLCBvciBtYXAsIHRoZSBsZW5ndGggcmVmbGVjdHMgbnVtYmVyIG9mIGVsZW1lbnRzIC8gZWxlbWVudCBwYWlycy4KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL2RhcnQvcHVic3BlYy55YW1sIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvZGFydC9wdWJzcGVjLnlhbWwKaW5kZXggYWU4NjU3MC4uYTE5YmY2ZiAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvZGFydC9wdWJzcGVjLnlhbWwKKysrIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvZGFydC9wdWJzcGVjLnlhbWwKQEAgLTEsNSArMSw1IEBACiBuYW1lOiBmbGF0X2J1ZmZlcnMKLXZlcnNpb246IDIuMC41Cit2ZXJzaW9uOiAyLjAuOAogZGVzY3JpcHRpb246IEZsYXRCdWZmZXJzIHJlYWRpbmcgYW5kIHdyaXRpbmcgbGlicmFyeSBmb3IgRGFydC4gQmFzZWQgb24gb3JpZ2luYWwgd29yayBieSBLb25zdGFudGluIFNjaGVnbG92IGFuZCBQYXVsIEJlcnJ5IG9mIHRoZSBEYXJ0IFNESyB0ZWFtLgogaG9tZXBhZ2U6IGh0dHBzOi8vZ2l0aHViLmNvbS9nb29nbGUvZmxhdGJ1ZmZlcnMKIGRvY3VtZW50YXRpb246IGh0dHBzOi8vZ29vZ2xlLmdpdGh1Yi5pby9mbGF0YnVmZmVycy9pbmRleC5odG1sCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy9kYXJ0L3Rlc3QvYm9vbF9zdHJ1Y3RzLmZicyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL2RhcnQvdGVzdC9ib29sX3N0cnVjdHMuZmJzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ3YjI2YjUKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy9kYXJ0L3Rlc3QvYm9vbF9zdHJ1Y3RzLmZicwpAQCAtMCwwICsxLDEwIEBACisvLyBUZXN0IGZvciAjNzM1NQordGFibGUgRm9vIHsKKyAgbXlfZm9vIDogZm9vX3Byb3BlcnRpZXM7Cit9CisKK3N0cnVjdCBmb29fcHJvcGVydGllcworeworICAgIGEgOiBib29sOworICAgIGIgOiBib29sOworfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvZGFydC90ZXN0L2ZsYXRfYnVmZmVyc190ZXN0LmRhcnQgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy9kYXJ0L3Rlc3QvZmxhdF9idWZmZXJzX3Rlc3QuZGFydAppbmRleCA4Y2VlNmIyLi41Mjk4YjE3IDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy9kYXJ0L3Rlc3QvZmxhdF9idWZmZXJzX3Rlc3QuZGFydAorKysgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy9kYXJ0L3Rlc3QvZmxhdF9idWZmZXJzX3Rlc3QuZGFydApAQCAtMSw3ICsxLDMgQEAKLS8vIENvcHlyaWdodCAoYykgMjAxNiwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi0vLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQotLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQogaW1wb3J0ICdkYXJ0OnR5cGVkX2RhdGEnOwogaW1wb3J0ICdkYXJ0OmlvJyBhcyBpbzsKIApAQCAtMTMsNiArOSw5IEBACiAKIGltcG9ydCAnLi9tb25zdGVyX3Rlc3RfbXlfZ2FtZS5leGFtcGxlX2dlbmVyYXRlZC5kYXJ0JyBhcyBleGFtcGxlOwogaW1wb3J0ICcuL21vbnN0ZXJfdGVzdF9teV9nYW1lLmV4YW1wbGUyX2dlbmVyYXRlZC5kYXJ0JyBhcyBleGFtcGxlMjsKK2ltcG9ydCAnLi9saXN0X29mX2VudW1zX2dlbmVyYXRlZC5kYXJ0JyBhcyBleGFtcGxlMzsKK2ltcG9ydCAnLi9ib29sX3N0cnVjdHNfZ2VuZXJhdGVkLmRhcnQnIGFzIGV4YW1wbGU0OworaW1wb3J0ICcuL2tleXdvcmRfdGVzdF9rZXl3b3JkX3Rlc3RfZ2VuZXJhdGVkLmRhcnQnIGFzIGtleXdvcmRfdGVzdDsKIAogbWFpbigpIHsKICAgZGVmaW5lUmVmbGVjdGl2ZVN1aXRlKCgpIHsKQEAgLTIwLDYgKzE5LDcgQEAKICAgICBkZWZpbmVSZWZsZWN0aXZlVGVzdHMoT2JqZWN0QVBJVGVzdCk7CiAgICAgZGVmaW5lUmVmbGVjdGl2ZVRlc3RzKENoZWNrT3RoZXJMYW5nYXVnZXNEYXRhKTsKICAgICBkZWZpbmVSZWZsZWN0aXZlVGVzdHMoR2VuZXJhdG9yVGVzdCk7CisgICAgZGVmaW5lUmVmbGVjdGl2ZVRlc3RzKExpc3RPZkVudW1zVGVzdCk7CiAgIH0pOwogfQogCkBAIC05MDIsMyArOTAyLDMyIEBACiAgICAgICAgIHNhbWUoZXhhbXBsZS5BbnlBbWJpZ3VvdXNBbGlhc2VzVHlwZUlkLnZhbHVlcykpOwogICB9CiB9CisKKy8vIFNlZSAjNjg2OQorQHJlZmxlY3RpdmVUZXN0CitjbGFzcyBMaXN0T2ZFbnVtc1Rlc3QgeworICB2b2lkIHRlc3RfbGlzdE9mRW51bXMoKSBhc3luYyB7CisgICAgdmFyIG15dGFibGUgPSBleGFtcGxlMy5NeVRhYmxlT2JqZWN0QnVpbGRlcihvcHRpb25zOiBbCisgICAgICBleGFtcGxlMy5PcHRpb25zRW51bS5BLAorICAgICAgZXhhbXBsZTMuT3B0aW9uc0VudW0uQiwKKyAgICAgIGV4YW1wbGUzLk9wdGlvbnNFbnVtLkMKKyAgICBdKTsKKyAgICB2YXIgYnl0ZXMgPSBteXRhYmxlLnRvQnl0ZXMoKTsKKyAgICB2YXIgbXl0YWJsZV9yZWFkID0gZXhhbXBsZTMuTXlUYWJsZShieXRlcyk7CisgICAgZXhwZWN0KG15dGFibGVfcmVhZC5vcHRpb25zIVswXS52YWx1ZSwgZXhhbXBsZTMuT3B0aW9uc0VudW0uQS52YWx1ZSk7CisgICAgZXhwZWN0KG15dGFibGVfcmVhZC5vcHRpb25zIVsxXS52YWx1ZSwgZXhhbXBsZTMuT3B0aW9uc0VudW0uQi52YWx1ZSk7CisgICAgZXhwZWN0KG15dGFibGVfcmVhZC5vcHRpb25zIVsyXS52YWx1ZSwgZXhhbXBsZTMuT3B0aW9uc0VudW0uQy52YWx1ZSk7CisgIH0KK30KKworQHJlZmxlY3RpdmVUZXN0CitjbGFzcyBCb29sSW5TdHJ1Y3RUZXN0IHsKKyAgdm9pZCB0ZXN0X2Jvb2xJblN0cnVjdCgpIGFzeW5jIHsKKyAgICB2YXIgbXlzdHJ1Y3QgPSBleGFtcGxlNC5Gb29PYmplY3RCdWlsZGVyKAorICAgICAgICBteUZvbzogZXhhbXBsZTQuRm9vUHJvcGVydGllc09iamVjdEJ1aWxkZXIoYTogdHJ1ZSwgYjogZmFsc2UpKTsKKyAgICB2YXIgYnl0ZXMgPSBteXN0cnVjdC50b0J5dGVzKCk7CisgICAgdmFyIG15c3RydWN0X3JlYWQgPSBleGFtcGxlNC5Gb28oYnl0ZXMpOworICAgIGV4cGVjdChteXN0cnVjdF9yZWFkLm15Rm9vIS5hLCB0cnVlKTsKKyAgICBleHBlY3QobXlzdHJ1Y3RfcmVhZC5teUZvbyEuYiwgZmFsc2UpOworICB9Cit9CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy9kYXJ0L3Rlc3Qva2V5d29yZF90ZXN0X2tleXdvcmRfdGVzdF9nZW5lcmF0ZWQuZGFydCBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL2RhcnQvdGVzdC9rZXl3b3JkX3Rlc3Rfa2V5d29yZF90ZXN0X2dlbmVyYXRlZC5kYXJ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjZmMyMzMKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy9kYXJ0L3Rlc3Qva2V5d29yZF90ZXN0X2tleXdvcmRfdGVzdF9nZW5lcmF0ZWQuZGFydApAQCAtMCwwICsxLDI4MCBAQAorLy8gYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgYnkgdGhlIEZsYXRCdWZmZXJzIGNvbXBpbGVyLCBkbyBub3QgbW9kaWZ5CisvLyBpZ25vcmVfZm9yX2ZpbGU6IHVudXNlZF9pbXBvcnQsIHVudXNlZF9maWVsZCwgdW51c2VkX2VsZW1lbnQsIHVudXNlZF9sb2NhbF92YXJpYWJsZQorCitsaWJyYXJ5IGtleXdvcmRfdGVzdDsKKworaW1wb3J0ICdkYXJ0OnR5cGVkX2RhdGEnIHNob3cgVWludDhMaXN0OworaW1wb3J0ICdwYWNrYWdlOmZsYXRfYnVmZmVycy9mbGF0X2J1ZmZlcnMuZGFydCcgYXMgZmI7CisKKworY2xhc3MgQWJjIHsKKyAgZmluYWwgaW50IHZhbHVlOworICBjb25zdCBBYmMuXyh0aGlzLnZhbHVlKTsKKworICBmYWN0b3J5IEFiYy5mcm9tVmFsdWUoaW50IHZhbHVlKSB7CisgICAgZmluYWwgcmVzdWx0ID0gdmFsdWVzW3ZhbHVlXTsKKyAgICBpZiAocmVzdWx0ID09IG51bGwpIHsKKyAgICAgICAgdGhyb3cgU3RhdGVFcnJvcignSW52YWxpZCB2YWx1ZSAkdmFsdWUgZm9yIGJpdCBmbGFnIGVudW0gQWJjJyk7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7CisgIH0KKworICBzdGF0aWMgQWJjPyBfY3JlYXRlT3JOdWxsKGludD8gdmFsdWUpID0+IAorICAgICAgdmFsdWUgPT0gbnVsbCA/IG51bGwgOiBBYmMuZnJvbVZhbHVlKHZhbHVlKTsKKworICBzdGF0aWMgY29uc3QgaW50IG1pblZhbHVlID0gMDsKKyAgc3RhdGljIGNvbnN0IGludCBtYXhWYWx1ZSA9IDI7CisgIHN0YXRpYyBib29sIGNvbnRhaW5zVmFsdWUoaW50IHZhbHVlKSA9PiB2YWx1ZXMuY29udGFpbnNLZXkodmFsdWUpOworCisgIHN0YXRpYyBjb25zdCBBYmMgJHZvaWQgPSBBYmMuXygwKTsKKyAgc3RhdGljIGNvbnN0IEFiYyB3aGVyZSA9IEFiYy5fKDEpOworICBzdGF0aWMgY29uc3QgQWJjIHN0YWNrYWxsb2MgPSBBYmMuXygyKTsKKyAgc3RhdGljIGNvbnN0IE1hcDxpbnQsIEFiYz4gdmFsdWVzID0geworICAgIDA6ICR2b2lkLAorICAgIDE6IHdoZXJlLAorICAgIDI6IHN0YWNrYWxsb2N9OworCisgIHN0YXRpYyBjb25zdCBmYi5SZWFkZXI8QWJjPiByZWFkZXIgPSBfQWJjUmVhZGVyKCk7CisKKyAgQG92ZXJyaWRlCisgIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICByZXR1cm4gJ0FiY3t2YWx1ZTogJHZhbHVlfSc7CisgIH0KK30KKworY2xhc3MgX0FiY1JlYWRlciBleHRlbmRzIGZiLlJlYWRlcjxBYmM+IHsKKyAgY29uc3QgX0FiY1JlYWRlcigpOworCisgIEBvdmVycmlkZQorICBpbnQgZ2V0IHNpemUgPT4gNDsKKworICBAb3ZlcnJpZGUKKyAgQWJjIHJlYWQoZmIuQnVmZmVyQ29udGV4dCBiYywgaW50IG9mZnNldCkgPT4KKyAgICAgIEFiYy5mcm9tVmFsdWUoY29uc3QgZmIuSW50MzJSZWFkZXIoKS5yZWFkKGJjLCBvZmZzZXQpKTsKK30KKworY2xhc3MgUHVibGljIHsKKyAgZmluYWwgaW50IHZhbHVlOworICBjb25zdCBQdWJsaWMuXyh0aGlzLnZhbHVlKTsKKworICBmYWN0b3J5IFB1YmxpYy5mcm9tVmFsdWUoaW50IHZhbHVlKSB7CisgICAgZmluYWwgcmVzdWx0ID0gdmFsdWVzW3ZhbHVlXTsKKyAgICBpZiAocmVzdWx0ID09IG51bGwpIHsKKyAgICAgICAgdGhyb3cgU3RhdGVFcnJvcignSW52YWxpZCB2YWx1ZSAkdmFsdWUgZm9yIGJpdCBmbGFnIGVudW0gUHVibGljJyk7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7CisgIH0KKworICBzdGF0aWMgUHVibGljPyBfY3JlYXRlT3JOdWxsKGludD8gdmFsdWUpID0+IAorICAgICAgdmFsdWUgPT0gbnVsbCA/IG51bGwgOiBQdWJsaWMuZnJvbVZhbHVlKHZhbHVlKTsKKworICBzdGF0aWMgY29uc3QgaW50IG1pblZhbHVlID0gMDsKKyAgc3RhdGljIGNvbnN0IGludCBtYXhWYWx1ZSA9IDA7CisgIHN0YXRpYyBib29sIGNvbnRhaW5zVmFsdWUoaW50IHZhbHVlKSA9PiB2YWx1ZXMuY29udGFpbnNLZXkodmFsdWUpOworCisgIHN0YXRpYyBjb25zdCBQdWJsaWMgTk9ORSA9IFB1YmxpYy5fKDApOworICBzdGF0aWMgY29uc3QgTWFwPGludCwgUHVibGljPiB2YWx1ZXMgPSB7CisgICAgMDogTk9ORX07CisKKyAgc3RhdGljIGNvbnN0IGZiLlJlYWRlcjxQdWJsaWM+IHJlYWRlciA9IF9QdWJsaWNSZWFkZXIoKTsKKworICBAb3ZlcnJpZGUKKyAgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgIHJldHVybiAnUHVibGlje3ZhbHVlOiAkdmFsdWV9JzsKKyAgfQorfQorCitjbGFzcyBfUHVibGljUmVhZGVyIGV4dGVuZHMgZmIuUmVhZGVyPFB1YmxpYz4geworICBjb25zdCBfUHVibGljUmVhZGVyKCk7CisKKyAgQG92ZXJyaWRlCisgIGludCBnZXQgc2l6ZSA9PiA0OworCisgIEBvdmVycmlkZQorICBQdWJsaWMgcmVhZChmYi5CdWZmZXJDb250ZXh0IGJjLCBpbnQgb2Zmc2V0KSA9PgorICAgICAgUHVibGljLmZyb21WYWx1ZShjb25zdCBmYi5JbnQzMlJlYWRlcigpLnJlYWQoYmMsIG9mZnNldCkpOworfQorCitjbGFzcyBLZXl3b3Jkc0luVW5pb25UeXBlSWQgeworICBmaW5hbCBpbnQgdmFsdWU7CisgIGNvbnN0IEtleXdvcmRzSW5VbmlvblR5cGVJZC5fKHRoaXMudmFsdWUpOworCisgIGZhY3RvcnkgS2V5d29yZHNJblVuaW9uVHlwZUlkLmZyb21WYWx1ZShpbnQgdmFsdWUpIHsKKyAgICBmaW5hbCByZXN1bHQgPSB2YWx1ZXNbdmFsdWVdOworICAgIGlmIChyZXN1bHQgPT0gbnVsbCkgeworICAgICAgICB0aHJvdyBTdGF0ZUVycm9yKCdJbnZhbGlkIHZhbHVlICR2YWx1ZSBmb3IgYml0IGZsYWcgZW51bSBLZXl3b3Jkc0luVW5pb25UeXBlSWQnKTsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKKyAgfQorCisgIHN0YXRpYyBLZXl3b3Jkc0luVW5pb25UeXBlSWQ/IF9jcmVhdGVPck51bGwoaW50PyB2YWx1ZSkgPT4gCisgICAgICB2YWx1ZSA9PSBudWxsID8gbnVsbCA6IEtleXdvcmRzSW5VbmlvblR5cGVJZC5mcm9tVmFsdWUodmFsdWUpOworCisgIHN0YXRpYyBjb25zdCBpbnQgbWluVmFsdWUgPSAwOworICBzdGF0aWMgY29uc3QgaW50IG1heFZhbHVlID0gMjsKKyAgc3RhdGljIGJvb2wgY29udGFpbnNWYWx1ZShpbnQgdmFsdWUpID0+IHZhbHVlcy5jb250YWluc0tleSh2YWx1ZSk7CisKKyAgc3RhdGljIGNvbnN0IEtleXdvcmRzSW5VbmlvblR5cGVJZCBOT05FID0gS2V5d29yZHNJblVuaW9uVHlwZUlkLl8oMCk7CisgIHN0YXRpYyBjb25zdCBLZXl3b3Jkc0luVW5pb25UeXBlSWQgJHN0YXRpYyA9IEtleXdvcmRzSW5VbmlvblR5cGVJZC5fKDEpOworICBzdGF0aWMgY29uc3QgS2V5d29yZHNJblVuaW9uVHlwZUlkIGludGVybmFsID0gS2V5d29yZHNJblVuaW9uVHlwZUlkLl8oMik7CisgIHN0YXRpYyBjb25zdCBNYXA8aW50LCBLZXl3b3Jkc0luVW5pb25UeXBlSWQ+IHZhbHVlcyA9IHsKKyAgICAwOiBOT05FLAorICAgIDE6ICRzdGF0aWMsCisgICAgMjogaW50ZXJuYWx9OworCisgIHN0YXRpYyBjb25zdCBmYi5SZWFkZXI8S2V5d29yZHNJblVuaW9uVHlwZUlkPiByZWFkZXIgPSBfS2V5d29yZHNJblVuaW9uVHlwZUlkUmVhZGVyKCk7CisKKyAgQG92ZXJyaWRlCisgIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICByZXR1cm4gJ0tleXdvcmRzSW5VbmlvblR5cGVJZHt2YWx1ZTogJHZhbHVlfSc7CisgIH0KK30KKworY2xhc3MgX0tleXdvcmRzSW5VbmlvblR5cGVJZFJlYWRlciBleHRlbmRzIGZiLlJlYWRlcjxLZXl3b3Jkc0luVW5pb25UeXBlSWQ+IHsKKyAgY29uc3QgX0tleXdvcmRzSW5VbmlvblR5cGVJZFJlYWRlcigpOworCisgIEBvdmVycmlkZQorICBpbnQgZ2V0IHNpemUgPT4gMTsKKworICBAb3ZlcnJpZGUKKyAgS2V5d29yZHNJblVuaW9uVHlwZUlkIHJlYWQoZmIuQnVmZmVyQ29udGV4dCBiYywgaW50IG9mZnNldCkgPT4KKyAgICAgIEtleXdvcmRzSW5VbmlvblR5cGVJZC5mcm9tVmFsdWUoY29uc3QgZmIuVWludDhSZWFkZXIoKS5yZWFkKGJjLCBvZmZzZXQpKTsKK30KKworY2xhc3MgS2V5d29yZHNJblRhYmxlIHsKKyAgS2V5d29yZHNJblRhYmxlLl8odGhpcy5fYmMsIHRoaXMuX2JjT2Zmc2V0KTsKKyAgZmFjdG9yeSBLZXl3b3Jkc0luVGFibGUoTGlzdDxpbnQ+IGJ5dGVzKSB7CisgICAgZmluYWwgcm9vdFJlZiA9IGZiLkJ1ZmZlckNvbnRleHQuZnJvbUJ5dGVzKGJ5dGVzKTsKKyAgICByZXR1cm4gcmVhZGVyLnJlYWQocm9vdFJlZiwgMCk7CisgIH0KKworICBzdGF0aWMgY29uc3QgZmIuUmVhZGVyPEtleXdvcmRzSW5UYWJsZT4gcmVhZGVyID0gX0tleXdvcmRzSW5UYWJsZVJlYWRlcigpOworCisgIGZpbmFsIGZiLkJ1ZmZlckNvbnRleHQgX2JjOworICBmaW5hbCBpbnQgX2JjT2Zmc2V0OworCisgIEFiYyBnZXQgJGlzID0+IEFiYy5mcm9tVmFsdWUoY29uc3QgZmIuSW50MzJSZWFkZXIoKS52VGFibGVHZXQoX2JjLCBfYmNPZmZzZXQsIDQsIDApKTsKKyAgUHVibGljIGdldCBwcml2YXRlID0+IFB1YmxpYy5mcm9tVmFsdWUoY29uc3QgZmIuSW50MzJSZWFkZXIoKS52VGFibGVHZXQoX2JjLCBfYmNPZmZzZXQsIDYsIDApKTsKKyAgaW50IGdldCB0eXBlID0+IGNvbnN0IGZiLkludDMyUmVhZGVyKCkudlRhYmxlR2V0KF9iYywgX2JjT2Zmc2V0LCA4LCAwKTsKKyAgYm9vbCBnZXQgJGRlZmF1bHQgPT4gY29uc3QgZmIuQm9vbFJlYWRlcigpLnZUYWJsZUdldChfYmMsIF9iY09mZnNldCwgMTAsIGZhbHNlKTsKKworICBAb3ZlcnJpZGUKKyAgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgIHJldHVybiAnS2V5d29yZHNJblRhYmxle1wkaXM6ICR7JGlzfSwgcHJpdmF0ZTogJHtwcml2YXRlfSwgdHlwZTogJHt0eXBlfSwgXCRkZWZhdWx0OiAkeyRkZWZhdWx0fX0nOworICB9CisKKyAgS2V5d29yZHNJblRhYmxlVCB1bnBhY2soKSA9PiBLZXl3b3Jkc0luVGFibGVUKAorICAgICAgJGlzOiAkaXMsCisgICAgICBwcml2YXRlOiBwcml2YXRlLAorICAgICAgdHlwZTogdHlwZSwKKyAgICAgICRkZWZhdWx0OiAkZGVmYXVsdCk7CisKKyAgc3RhdGljIGludCBwYWNrKGZiLkJ1aWxkZXIgZmJCdWlsZGVyLCBLZXl3b3Jkc0luVGFibGVUPyBvYmplY3QpIHsKKyAgICBpZiAob2JqZWN0ID09IG51bGwpIHJldHVybiAwOworICAgIHJldHVybiBvYmplY3QucGFjayhmYkJ1aWxkZXIpOworICB9Cit9CisKK2NsYXNzIEtleXdvcmRzSW5UYWJsZVQgaW1wbGVtZW50cyBmYi5QYWNrYWJsZSB7CisgIEFiYyAkaXM7CisgIFB1YmxpYyBwcml2YXRlOworICBpbnQgdHlwZTsKKyAgYm9vbCAkZGVmYXVsdDsKKworICBLZXl3b3Jkc0luVGFibGVUKHsKKyAgICAgIHRoaXMuJGlzID0gQWJjLiR2b2lkLAorICAgICAgdGhpcy5wcml2YXRlID0gUHVibGljLk5PTkUsCisgICAgICB0aGlzLnR5cGUgPSAwLAorICAgICAgdGhpcy4kZGVmYXVsdCA9IGZhbHNlfSk7CisKKyAgQG92ZXJyaWRlCisgIGludCBwYWNrKGZiLkJ1aWxkZXIgZmJCdWlsZGVyKSB7CisgICAgZmJCdWlsZGVyLnN0YXJ0VGFibGUoNCk7CisgICAgZmJCdWlsZGVyLmFkZEludDMyKDAsICRpcy52YWx1ZSk7CisgICAgZmJCdWlsZGVyLmFkZEludDMyKDEsIHByaXZhdGUudmFsdWUpOworICAgIGZiQnVpbGRlci5hZGRJbnQzMigyLCB0eXBlKTsKKyAgICBmYkJ1aWxkZXIuYWRkQm9vbCgzLCAkZGVmYXVsdCk7CisgICAgcmV0dXJuIGZiQnVpbGRlci5lbmRUYWJsZSgpOworICB9CisKKyAgQG92ZXJyaWRlCisgIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICByZXR1cm4gJ0tleXdvcmRzSW5UYWJsZVR7XCRpczogJHskaXN9LCBwcml2YXRlOiAke3ByaXZhdGV9LCB0eXBlOiAke3R5cGV9LCBcJGRlZmF1bHQ6ICR7JGRlZmF1bHR9fSc7CisgIH0KK30KKworY2xhc3MgX0tleXdvcmRzSW5UYWJsZVJlYWRlciBleHRlbmRzIGZiLlRhYmxlUmVhZGVyPEtleXdvcmRzSW5UYWJsZT4geworICBjb25zdCBfS2V5d29yZHNJblRhYmxlUmVhZGVyKCk7CisKKyAgQG92ZXJyaWRlCisgIEtleXdvcmRzSW5UYWJsZSBjcmVhdGVPYmplY3QoZmIuQnVmZmVyQ29udGV4dCBiYywgaW50IG9mZnNldCkgPT4gCisgICAgS2V5d29yZHNJblRhYmxlLl8oYmMsIG9mZnNldCk7Cit9CisKK2NsYXNzIEtleXdvcmRzSW5UYWJsZUJ1aWxkZXIgeworICBLZXl3b3Jkc0luVGFibGVCdWlsZGVyKHRoaXMuZmJCdWlsZGVyKTsKKworICBmaW5hbCBmYi5CdWlsZGVyIGZiQnVpbGRlcjsKKworICB2b2lkIGJlZ2luKCkgeworICAgIGZiQnVpbGRlci5zdGFydFRhYmxlKDQpOworICB9CisKKyAgaW50IGFkZElzKEFiYz8gJGlzKSB7CisgICAgZmJCdWlsZGVyLmFkZEludDMyKDAsICRpcz8udmFsdWUpOworICAgIHJldHVybiBmYkJ1aWxkZXIub2Zmc2V0OworICB9CisgIGludCBhZGRQcml2YXRlKFB1YmxpYz8gcHJpdmF0ZSkgeworICAgIGZiQnVpbGRlci5hZGRJbnQzMigxLCBwcml2YXRlPy52YWx1ZSk7CisgICAgcmV0dXJuIGZiQnVpbGRlci5vZmZzZXQ7CisgIH0KKyAgaW50IGFkZFR5cGUoaW50PyB0eXBlKSB7CisgICAgZmJCdWlsZGVyLmFkZEludDMyKDIsIHR5cGUpOworICAgIHJldHVybiBmYkJ1aWxkZXIub2Zmc2V0OworICB9CisgIGludCBhZGREZWZhdWx0KGJvb2w/ICRkZWZhdWx0KSB7CisgICAgZmJCdWlsZGVyLmFkZEJvb2woMywgJGRlZmF1bHQpOworICAgIHJldHVybiBmYkJ1aWxkZXIub2Zmc2V0OworICB9CisKKyAgaW50IGZpbmlzaCgpIHsKKyAgICByZXR1cm4gZmJCdWlsZGVyLmVuZFRhYmxlKCk7CisgIH0KK30KKworY2xhc3MgS2V5d29yZHNJblRhYmxlT2JqZWN0QnVpbGRlciBleHRlbmRzIGZiLk9iamVjdEJ1aWxkZXIgeworICBmaW5hbCBBYmM/IF8kaXM7CisgIGZpbmFsIFB1YmxpYz8gX3ByaXZhdGU7CisgIGZpbmFsIGludD8gX3R5cGU7CisgIGZpbmFsIGJvb2w/IF8kZGVmYXVsdDsKKworICBLZXl3b3Jkc0luVGFibGVPYmplY3RCdWlsZGVyKHsKKyAgICBBYmM/ICRpcywKKyAgICBQdWJsaWM/IHByaXZhdGUsCisgICAgaW50PyB0eXBlLAorICAgIGJvb2w/ICRkZWZhdWx0LAorICB9KQorICAgICAgOiBfJGlzID0gJGlzLAorICAgICAgICBfcHJpdmF0ZSA9IHByaXZhdGUsCisgICAgICAgIF90eXBlID0gdHlwZSwKKyAgICAgICAgXyRkZWZhdWx0ID0gJGRlZmF1bHQ7CisKKyAgLy8vIEZpbmlzaCBidWlsZGluZywgYW5kIHN0b3JlIGludG8gdGhlIFtmYkJ1aWxkZXJdLgorICBAb3ZlcnJpZGUKKyAgaW50IGZpbmlzaChmYi5CdWlsZGVyIGZiQnVpbGRlcikgeworICAgIGZiQnVpbGRlci5zdGFydFRhYmxlKDQpOworICAgIGZiQnVpbGRlci5hZGRJbnQzMigwLCBfJGlzPy52YWx1ZSk7CisgICAgZmJCdWlsZGVyLmFkZEludDMyKDEsIF9wcml2YXRlPy52YWx1ZSk7CisgICAgZmJCdWlsZGVyLmFkZEludDMyKDIsIF90eXBlKTsKKyAgICBmYkJ1aWxkZXIuYWRkQm9vbCgzLCBfJGRlZmF1bHQpOworICAgIHJldHVybiBmYkJ1aWxkZXIuZW5kVGFibGUoKTsKKyAgfQorCisgIC8vLyBDb252ZW5pZW5jZSBtZXRob2QgdG8gc2VyaWFsaXplIHRvIGJ5dGUgbGlzdC4KKyAgQG92ZXJyaWRlCisgIFVpbnQ4TGlzdCB0b0J5dGVzKFtTdHJpbmc/IGZpbGVJZGVudGlmaWVyXSkgeworICAgIGZpbmFsIGZiQnVpbGRlciA9IGZiLkJ1aWxkZXIoZGVkdXBsaWNhdGVUYWJsZXM6IGZhbHNlKTsKKyAgICBmYkJ1aWxkZXIuZmluaXNoKGZpbmlzaChmYkJ1aWxkZXIpLCBmaWxlSWRlbnRpZmllcik7CisgICAgcmV0dXJuIGZiQnVpbGRlci5idWZmZXI7CisgIH0KK30KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL2RhcnQvdGVzdC9saXN0X29mX2VudW1zLmZicyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL2RhcnQvdGVzdC9saXN0X29mX2VudW1zLmZicwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNDI3MmE0Ci0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvZGFydC90ZXN0L2xpc3Rfb2ZfZW51bXMuZmJzCkBAIC0wLDAgKzEsMTAgQEAKK2VudW0gT3B0aW9uc0VudW0gOiB1aW50MzIKK3sKKyAgICBBID0gMSwKKyAgICBCID0gMiwKKyAgICBDID0gMworfQorCit0YWJsZSBNeVRhYmxlIHsKKyAgICBvcHRpb25zIDogW09wdGlvbnNFbnVtXTsKK30KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL2RvY3Mvc291cmNlL0J1aWxkaW5nLm1kIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvZG9jcy9zb3VyY2UvQnVpbGRpbmcubWQKaW5kZXggZDdlOWNhMy4uYTEyYWJhYyAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvZG9jcy9zb3VyY2UvQnVpbGRpbmcubWQKKysrIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvZG9jcy9zb3VyY2UvQnVpbGRpbmcubWQKQEAgLTMxLDI0ICszMSwyMiBAQAogCiAjIyMgTWFrZSBhbGwgd2FybmluZ3MgaW50byBlcnJvcnMKIAotQnkgZGVmYXVsdCBhbGwgRmxhdGJ1ZmZlcnMgYGNtYWtlYCB0YXJnZXRzIGFyZSBidWlsZCB3aXRoIGAtV2Vycm9yYCBmbGFnLgotV2l0aCB0aGlzIGZsYWcgKG9yIGAvV1hgIGZvciBNU1ZDKSBDKysgY29tcGlsZXIgd2lsbCB0cmVhdCBhbGwgd2FybmluZ3MgYXMgZXJyb3JzLgotQWRkaXRpb25hbGx5IGAtV2FsbCAtcGVkYW50aWMgLVdleHRyYWAgKG9yIGAvVzRgIGZvcm0gTVNWQykgZmxhZ3MgYXJlIHNldC4KLVRoZXNlIGZsYWdzIG1pbmltaXplIHRoZSBudW1iZXIgb2YgcG9zc2libGUgZGVmZWN0cyBpbiBjb2RlIGFuZCBrZWVwIGNvZGUgaGlnaGx5IHBvcnRhYmxlLgotVXNpbmcgdGhlc2UgZmxhZ3MgaXMgY29uc2lkZXJlZCBnb29kIHByYWN0aWNlIGJ1dCBzb21ldGltZXMgaXQgY2FuIGJyZWFrIGRlcGVuZGVudCBwcm9qZWN0cyAKLWlmIGEgY29tcGlsZXIgaXMgdXBncmFkZWQgb3IgYSB0b29sc2V0IGlzIGNoYW5nZWQuCi1Vc3VhbGx5LCBuZXdlciBjb21waWxlciB2ZXJzaW9ucyBhZGQgbmV3IGNvbXBpbGUtdGltZSBkaWFnbm9zdGljcyB0aGF0IHdlcmUgdW5hdmFpbGFibGUgYmVmb3JlLgotVGhlc2UgbmV3IGRpYWdub3N0aWMgd2FybmluZ3MgY291bGQgc3RvcCB0aGUgYnVpbGQgcHJvY2VzcyBpZiBgLVdlcnJvcmAgZmxhZyBpcyBzZXQuCitCeSBkZWZhdWx0IGFsbCBGbGF0YnVmZmVycyBgY21ha2VgIHRhcmdldHMgYXJlICoqbm90KiogYnVpbHQgd2l0aCB0aGUgYC1XZXJyb3JgIAorKG9yIGAvV1hgIGZvciBNU1ZDKSBmbGFnIHRoYXQgdHJlYXRzIGFueSB3YXJuaW5nIGFzIGFuIGVycm9yLiBUaGlzIGFsbG93cyBtb3JlIAorZmxleGliaWxpdHkgZm9yIHVzZXJzIG9mIEZsYXRidWZmZXJzIHRvIHVzZSBuZXdlciBjb21waWxlcnMgYW5kIHRvb2xzZXRzIHRoYXQKK21heSBhZGQgbmV3IHdhcm5pbmdzIHRoYXQgd291bGQgY2F1c2UgYSBidWlsZCBmYWlsdXJlLgogCi1JdCBpcyBwb3NzaWJsZSB0byBjYW5jZWwgYHdhcm5pbmdzIGFzIGVycm9yc2AgZmxhZyBhdCBgY21ha2VgIGNvbmZpZ3VyYXRpb24gc3RhZ2UgdXNpbmcgCi1gRkxBVEJVRkZFUlNfQ1hYX0ZMQUdTYCBvcHRpb24uIENvbXBpbGF0aW9uIGZsYWdzIGRlY2xhcmVkIGluIGBGTEFUQlVGRkVSU19DWFhfRkxBR1NgIHdpbGwgYmUgCi1hcHBlbmRlZCB0byB0aGUgcHJvamVjdC1sZXZlbCBgQ01BS0VfQ1hYX0ZMQUdTYCB2YXJpYWJsZS4KLUV4YW1wbGVzOgorVG8gZW5hYmxlIGEgc3RyaWN0ZXIgYnVpbGQgdGhhdCBkb2VzIHRyZWF0IHdhcm5pbmdzIGFzIGVycm9ycywgc2V0IHRoZQorYEZMQVRCVUZGRVJTX1NUUklDVF9NT0RFYCBgY21ha2VgIGNvbXBsaWF0aW9uIGZsYWcgdG8gYE9OYC4gCiAKLS0gR0NDIGFuZCBDbGFuZzogYGNtYWtlIC4gLUQgRkxBVEJVRkZFUlNfQ1hYX0ZMQUdTPSItV25vLWVycm9yImAKLS0gTVNWQzogYGNtYWtlIC4gLUQgRkxBVEJVRkZFUlNfQ1hYX0ZMQUdTPSIvV1gtImAKLS0gTVNWQzogYGNtYWtlIC4gLUQgRkxBVEJVRkZFUlNfQ1hYX0ZMQUdTPSIvV3YgPGNvbXBpbGVyLnZlcnNpb24+ImAKK2BgYAorY21ha2UgLiAtREZMQVRCVUZGRVJTX1NUUklDVF9NT0RFPU9OCitgYGAKIAorT3VyIENJIGJ1aWxkcyBydW4gd2l0aCBzdHJpY3QgbW9kZSBvbiwgZW5zdXJpbmcgdGhlIGNvZGUgdGhhdCBpcyBjb21taXR0ZWQgdG8gCit0aGUgcHJvamVjdCBpcyBhcyBwb3J0YWJsZSBhbmQgd2FybmluZyBmcmVlIGFzIHBvc3NpYmxlLiBUaHVzIGRldmVsb3BlcnMKK2NvbnRyaWJ1dGluZyB0byB0aGUgcHJvamVjdCBzaG91bGQgZW5hYmxlIHN0cmljdCBtb2RlIGxvY2FsbHkgYmVmb3JlIG1ha2luZyBhIAorUFIuCiAKICMjIEJ1aWxkaW5nIHdpdGggVkNQS0cKIApAQCAtNjMsNiArNjEsMTggQEAKIFRoZSBmbGF0YnVmZmVycyBwb3J0IGluIHZjcGtnIGlzIGtlcHQgdXAgdG8gZGF0ZSBieSBNaWNyb3NvZnQgdGVhbSBtZW1iZXJzIGFuZCBjb21tdW5pdHkgY29udHJpYnV0b3JzLgogSWYgdGhlIHZlcnNpb24gaXMgb3V0IG9mIGRhdGUsIHBsZWFzZSBbY3JlYXRlIGFuIGlzc3VlIG9yIHB1bGwgcmVxdWVzdF0oaHR0cHM6Ly9naXRodWIuY29tL01pY3Jvc29mdC92Y3BrZykgb24gdGhlIHZjcGtnIHJlcG9zaXRvcnkuCiAKKyMjIERvd25sb2FkaW5nIGJpbmFyaWVzCitZb3UgY2FuIGRvd25sb2FkIHRoZSBiaW5hcmllcyBmcm9tIHRoZQorW0dpdEh1YiByZWxlYXNlIHBhZ2VdKGh0dHBzOi8vZ2l0aHViLmNvbS9nb29nbGUvZmxhdGJ1ZmZlcnMvcmVsZWFzZXMpLgorCitXZSBnZW5lcmF0ZSBbU0xTQTMgc2lnbmF0dXJlc10oc2xzYS5kZXYpIHVzaW5nIHRoZSBPcGVuU1NGJ3MgW3Nsc2EtZnJhbWV3b3JrL3Nsc2EtZ2l0aHViLWdlbmVyYXRvcl0oaHR0cHM6Ly9naXRodWIuY29tL3Nsc2EtZnJhbWV3b3JrL3Nsc2EtZ2l0aHViLWdlbmVyYXRvcikuIFRvIHZlcmlmeSB0aGUgYmluYXJpZXM6CisxLiBJbnN0YWxsIHRoZSB2ZXJpZmljYXRpb24gdG9vbCBmcm9tIFtzbHNhLWZyYW1ld29yay9zbHNhLXZlcmlmaWVyI2luc3RhbGxhdGlvbl0oaHR0cHM6Ly9naXRodWIuY29tL3Nsc2EtZnJhbWV3b3JrL3Nsc2EtdmVyaWZpZXIjaW5zdGFsbGF0aW9uKQorMS4gRG93bmxvYWQgdGhlIGZpbGUgbmFtZWQgYGF0dGVzdGF0aW9uLmludG90by5qc29ubGAgZnJvbSB0aGUgR2l0SHViIHJlbGVhc2UKKzEuIFJ1bjoKK2BgYHNoZWxsCiskIHNsc2EtdmVyaWZpZXIgLWFydGlmYWN0LXBhdGggPGRvd25sb2FkZWQuemlwPiAtcHJvdmVuYW5jZSBhdHRlc3RhdGlvbi5pbnRvdG8uanNvbmwgLXNvdXJjZSBnaXRodWIuY29tL2dvb2dsZS9mbGF0YnVmZmVycyAtdGFnIDx2ZXJzaW9uPgorICBQQVNTRUQ6IFZlcmlmaWVkIFNMU0EgcHJvdmVuYW5jZQorCiAjIyBCdWlsZGluZyBmb3IgQW5kcm9pZAogCiBUaGVyZSBpcyBhIGBmbGF0YnVmZmVycy9hbmRyb2lkYCBkaXJlY3RvcnkgdGhhdCBjb250YWlucyBhbGwgeW91IG5lZWQgdG8gYnVpbGQKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL2RvY3Mvc291cmNlL0dvVXNhZ2UubWQgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy9kb2NzL3NvdXJjZS9Hb1VzYWdlLm1kCmluZGV4IGFiNmRkYmQuLmUyYWExMTUgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL2RvY3Mvc291cmNlL0dvVXNhZ2UubWQKKysrIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvZG9jcy9zb3VyY2UvR29Vc2FnZS5tZApAQCAtNTIsMTAgKzUyLDEwIEBACiAgICAgICAgZXhhbXBsZSAiTXlHYW1lL0V4YW1wbGUiCiAgICAgICAgZmxhdGJ1ZmZlcnMgImdpdGh1Yi5jb20vZ29vZ2xlL2ZsYXRidWZmZXJzL2dvIgogCi0gICAgICAgaW8vaW91dGlsCisgICAgICAgIm9zIgogICAgICkKIAotICAgIGJ1ZiwgZXJyIDo9IGlvdXRpbC5SZWFkRmlsZSgibW9uc3Rlci5kYXQiKQorICAgIGJ1ZiwgZXJyIDo9IG9zLlJlYWRGaWxlKCJtb25zdGVyLmRhdCIpCiAgICAgLy8gaGFuZGxlIGVycgogICAgIG1vbnN0ZXIgOj0gZXhhbXBsZS5HZXRSb290QXNNb25zdGVyKGJ1ZiwgMCkKIH5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvZG9jcy9zb3VyY2UvUnVzdFVzYWdlLm1kIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvZG9jcy9zb3VyY2UvUnVzdFVzYWdlLm1kCmluZGV4IDllOTU5YTkuLjJhMTYyNTggMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL2RvY3Mvc291cmNlL1J1c3RVc2FnZS5tZAorKysgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy9kb2NzL3NvdXJjZS9SdXN0VXNhZ2UubWQKQEAgLTU4LDcgKzU4LDcgQEAKIAogRm9yIGV4YW1wbGUsIGhlcmUgaXMgaG93IHlvdSB3b3VsZCByZWFkIGEgRmxhdEJ1ZmZlciBiaW5hcnkgZmlsZSBpbiBSdXN0OgogRmlyc3QsIGluY2x1ZGUgdGhlIGxpYnJhcnkgYW5kIGdlbmVyYXRlZCBjb2RlLiBUaGVuIHJlYWQgdGhlIGZpbGUgaW50bwotYSBgdThgIHZlY3Rvciwgd2hpY2ggeW91IHBhc3MsIGFzIGEgYnl0ZSBzbGljZSwgdG8gYGdldF9yb290X2FzX21vbnN0ZXIoKWAuCithIGB1OGAgdmVjdG9yLCB3aGljaCB5b3UgcGFzcywgYXMgYSBieXRlIHNsaWNlLCB0byBgcm9vdF9hc19tb25zdGVyKClgLgogCiBUaGlzIGZ1bGwgZXhhbXBsZSBwcm9ncmFtIGlzIGF2YWlsYWJsZSBpbiB0aGUgUnVzdCB0ZXN0IHN1aXRlOgogW21vbnN0ZXJfZXhhbXBsZS5yc10oaHR0cHM6Ly9naXRodWIuY29tL2dvb2dsZS9mbGF0YnVmZmVycy9ibG9iL21hc3Rlci90ZXN0cy9ydXN0X3VzYWdlX3Rlc3QvYmluL21vbnN0ZXJfZXhhbXBsZS5ycykKQEAgLTgwLDcgKzgwLDcgQEAKICAgICAgICAgbGV0IG11dCBidWYgPSBWZWM6Om5ldygpOwogICAgICAgICBmLnJlYWRfdG9fZW5kKCZtdXQgYnVmKS5leHBlY3QoImZpbGUgcmVhZGluZyBmYWlsZWQiKTsKIAotICAgICAgICBsZXQgbW9uc3RlciA9IG15X2dhbWU6OmV4YW1wbGU6OmdldF9yb290X2FzX21vbnN0ZXIoJmJ1ZlsuLl0pOworICAgICAgICBsZXQgbW9uc3RlciA9IG15X2dhbWU6OmV4YW1wbGU6OnJvb3RfYXNfbW9uc3RlcigmYnVmWy4uXSk7CiB+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KIAogYG1vbnN0ZXJgIGlzIG9mIHR5cGUgYE1vbnN0ZXJgLCBhbmQgcG9pbnRzIHRvIHNvbWV3aGVyZSAqaW5zaWRlKiB5b3VyCkBAIC0xMDgsNyArMTA4LDcgQEAKIEZvciBzdHJ1Y3RzLCBsYXlvdXQgaXMgZGV0ZXJtaW5pc3RpYyBhbmQgZ3VhcmFudGVlZCB0byBiZSB0aGUgc2FtZQogYWNyb3NzIHBsYXRmb3JtcyAoc2NhbGFycyBhcmUgYWxpZ25lZCB0byB0aGVpcgogb3duIHNpemUsIGFuZCBzdHJ1Y3RzIHRoZW1zZWx2ZXMgdG8gdGhlaXIgbGFyZ2VzdCBtZW1iZXIpLCBhbmQgeW91Ci1hcmUgYWxsb3dlZCB0byBhY2Nlc3MgdGhpcyBtZW1vcnkgZGlyZWN0bHkgYnkgdXNpbmcgYHNhZmVfc2xpY2VgIGFuZAorYXJlIGFsbG93ZWQgdG8gYWNjZXNzIHRoaXMgbWVtb3J5IGRpcmVjdGx5IGJ5IHVzaW5nIGBzYWZlX3NsaWNlYAogb24gdGhlIHJlZmVyZW5jZSB0byBhIHN0cnVjdCwgb3IgZXZlbiBhbiBhcnJheSBvZiBzdHJ1Y3RzLgogCiBUbyBjb21wdXRlIG9mZnNldHMgdG8gc3ViLWVsZW1lbnRzIG9mIGEgc3RydWN0LCBtYWtlIHN1cmUgdGhleQpAQCAtMTE4LDkgKzExOCwxMCBAQAogaW4gT3BlbkdMIG9yIHNpbWlsYXIgQVBJcy4KIAogSXQgaXMgaW1wb3J0YW50IHRvIG5vdGUgaXMgdGhhdCBzdHJ1Y3RzIGFyZSBzdGlsbCBsaXR0bGUgZW5kaWFuIG9uIGFsbAotbWFjaGluZXMsIHNvIG9ubHkgdXNlIHRyaWNrcyBsaWtlIHRoaXMgaWYgeW91IGNhbiBndWFyYW50ZWUgeW91J3JlIG5vdAotc2hpcHBpbmcgb24gYSBiaWcgZW5kaWFuIG1hY2hpbmUgKHVzaW5nIGFuIGAjW2NmZyh0YXJnZXRfZW5kaWFuID0gImxpdHRsZSIpXWAKLWF0dHJpYnV0ZSB3b3VsZCBiZSB3aXNlKS4KK21hY2hpbmVzLCBzbyB0aGUgZnVuY3Rpb25zIHRvIGVuYWJsZSB0cmlja3MgbGlrZSB0aGlzIGFyZSBvbmx5IGV4cG9zZWQgb24gbGl0dGxlCitlbmRpYW4gbWFjaGluZXMuIElmIHlvdSBhbHNvIHNoaXAgb24gYmlnIGVuZGlhbiBtYWNoaW5lcywgdXNpbmcgYW4KK2AjW2NmZyh0YXJnZXRfZW5kaWFuID0gImxpdHRsZSIpXWAgYXR0cmlidXRlIHdvdWxkIGJlIHdpc2Ugb3IgeW91ciBjb2RlIHdpbGwgbm90Citjb21waWxlLgogCiBUaGUgc3BlY2lhbCBmdW5jdGlvbiBgc2FmZV9zbGljZWAgaXMgaW1wbGVtZW50ZWQgb24gVmVjdG9yIG9iamVjdHMgdGhhdCBhcmUKIHJlcHJlc2VudGVkIGluIG1lbW9yeSB0aGUgc2FtZSB3YXkgYXMgdGhleSBhcmUgcmVwcmVzZW50ZWQgb24gdGhlIHdpcmUuIFRoaXMKQEAgLTEzNCwyMiArMTM1LDIyIEBACiAKICMjIEFjY2VzcyBvZiB1bnRydXN0ZWQgYnVmZmVycwogCitUaGUgc2FmZSBSdXN0IGZ1bmN0aW9ucyB0byBpbnRlcnByZXQgYSBzbGljZSBhcyBhIHRhYmxlIChgcm9vdGAsCitgc2l6ZV9wcmVmaXhlZF9yb290YCwgYHJvb3Rfd2l0aF9vcHRzYCwgYW5kIGBzaXplX3ByZWZpeGVkX3Jvb3Rfd2l0aF9vcHRzYCkKK3ZlcmlmeSB0aGUgZGF0YSBmaXJzdC4gVGhpcyBoYXMgc29tZSBwZXJmb3JtYW5jZSBjb3N0LCBidXQgaXMgaW50ZW5kZWQgdG8gYmUKK3NhZmUgZm9yIHVzZSBvbiBmbGF0YnVmZmVycyBmcm9tIHVudHJ1c3RlZCBzb3VyY2VzLiBUaGVyZSBhcmUgY29ycmVzcG9uZGluZworYHVuc2FmZWAgdmVyc2lvbnMgd2l0aCBuYW1lcyBlbmRpbmcgaW4gYF91bmNoZWNrZWRgIHdoaWNoIHNraXAgdGhpcwordmVyaWZpY2F0aW9uLCBhbmQgbWF5IGFjY2VzcyBhcmJpdHJhcnkgbWVtb3J5LgorCiBUaGUgZ2VuZXJhdGVkIGFjY2Vzc29yIGZ1bmN0aW9ucyBhY2Nlc3MgZmllbGRzIG92ZXIgb2Zmc2V0cywgd2hpY2ggaXMKLXZlcnkgcXVpY2suIFRoZXNlIG9mZnNldHMgYXJlIHVzZWQgdG8gaW5kZXggaW50byBSdXN0IHNsaWNlcywgc28gdGhleSBhcmUKLWJvdW5kcy1jaGVja2VkIGJ5IHRoZSBSdXN0IHJ1bnRpbWUuIEhvd2V2ZXIsIG91ciBSdXN0IGltcGxlbWVudGF0aW9uIG1heQotY2hhbmdlOiB3ZSBtYXkgY29udmVydCBhY2Nlc3MgZnVuY3Rpb25zIHRvIHVzZSBkaXJlY3QgcG9pbnRlciBkZXJlZmVyZW5jaW5nLCB0bwotaW1wcm92ZSBsb29rdXAgc3BlZWQuIEFzIGEgcmVzdWx0LCB1c2VycyBzaG91bGQgbm90IHJlbHkgb24gdGhlIGFmb3JlbWVudGlvbmVkCi1ib3VuZHMtY2hlY2tpbmcgYmVoYXZpb3IuCit2ZXJ5IHF1aWNrLiBUaGUgY3VycmVudCBpbXBsZW1lbnRhdGlvbiB1c2VzIHRoZXNlIHRvIGFjY2VzcyBtZW1vcnkgd2l0aG91dCBhbnkKK2Z1cnRoZXIgYm91bmRzIGNoZWNraW5nLiBBbGwgb2YgdGhlIHNhZmUgUnVzdCBBUElzIGVuc3VyZSB0aGUgdmVyaWZpZXIgaXMgcnVuCitvdmVyIHRoZXNlIGZsYXRidWZmZXJzIGJlZm9yZSBhY2Nlc3NpbmcgdGhlbS4KIAogV2hlbiB5b3UncmUgcHJvY2Vzc2luZyBsYXJnZSBhbW91bnRzIG9mIGRhdGEgZnJvbSBhIHNvdXJjZSB5b3Uga25vdyAoZS5nLgoteW91ciBvd24gZ2VuZXJhdGVkIGRhdGEgb24gZGlzayksIHRoaXMgaXMgYWNjZXB0YWJsZSwgYnV0IHdoZW4gcmVhZGluZwotZGF0YSBmcm9tIHRoZSBuZXR3b3JrIHRoYXQgY2FuIHBvdGVudGlhbGx5IGhhdmUgYmVlbiBtb2RpZmllZCBieSBhbgotYXR0YWNrZXIsIHRoaXMgaXMgdW5kZXNpcmFibGUuCi0KLVRoZSBDKysgcG9ydCBwcm92aWRlcyBhIGJ1ZmZlciB2ZXJpZmllci4gQXQgdGhpcyB0aW1lLCBSdXN0IGRvZXMgbm90LiBSdXN0IG1heQotcHJvdmlkZSBhIHZlcmlmaWVyIGluIGEgZnV0dXJlIHZlcnNpb24uIEluIHRoZSBtZWFudGltZSwgUnVzdCB1c2VycyBjYW4gYWNjZXNzCi10aGUgYnVmZmVyIHZlcmlmaWVyIGdlbmVyYXRlZCBieSB0aGUgQysrIHBvcnQgdGhyb3VnaCBhIGZvcmVpZ24gZnVuY3Rpb24KLWludGVyZmFjZSAoRkZJKS4KK3lvdXIgb3duIGdlbmVyYXRlZCBkYXRhIG9uIGRpc2spLCB0aGUgYF91bmNoZWNrZWRgIHZlcnNpb25zIGFyZSBhY2NlcHRhYmxlLCBidXQKK3doZW4gcmVhZGluZyBkYXRhIGZyb20gdGhlIG5ldHdvcmsgdGhhdCBjYW4gcG90ZW50aWFsbHkgaGF2ZSBiZWVuIG1vZGlmaWVkIGJ5IGFuCithdHRhY2tlciwgaXQgaXMgZGVzaXJhYmxlIHRvIHVzZSB0aGUgc2FmZSB2ZXJzaW9ucyB3aGljaCB1c2UgdGhlIHZlcmlmaWVyLgogCiAjIyBUaHJlYWRpbmcKIApAQCAtMTY1LDYgKzE2NiwxNyBAQAogYWNjb21wbGlzaCB0aGlzLCBieSBkZXNpZ24sIGFzIHdlIGZlZWwgbXVsdGl0aHJlYWRlZCBjb25zdHJ1Y3Rpb24KIG9mIGEgc2luZ2xlIGJ1ZmZlciB3aWxsIGJlIHJhcmUsIGFuZCBzeW5jaHJvbmlzYXRpb24gb3ZlcmhlYWQgd291bGQgYmUgY29zdGx5LgogCitVbmxpa2UgbW9zdCBvdGhlciBsYW5ndWFnZXMsIGluIFJ1c3QgdGhlc2UgcHJvcGVydGllcyBhcmUgZXhwb3NlZCB0byBhbmQKK2VuZm9yY2VkIGJ5IHRoZSB0eXBlIHN5c3RlbS4gYGZsYXRidWZmZXJzOjpUYWJsZWAgYW5kIHRoZSBnZW5lcmF0ZWQgdGFibGUgdHlwZXMKK2FyZSBgU2VuZCArIFN5bmNgLCBpbmRpY2F0aW5nIHRoZXkgbWF5IGJlIGZyZWVseSBzaGFyZWQgYWNyb3NzIHRocmVhZHMgYW5kIGRhdGEKK21heSBiZSBhY2Nlc3NlZCBmcm9tIGFueSB0aHJlYWQgd2hpY2ggcmVjZWl2ZXMgYSBjb25zdCAoYWthIHNoYXJlZCkgcmVmZXJlbmNlLgorVGhlcmUgYXJlIG5vIGZ1bmN0aW9ucyB3aGljaCByZXF1aXJlIGEgbXV0YWJsZSAoYWthIGV4Y2x1c2l2ZSkgcmVmZXJlbmNlLCB3aGljaAorbWVhbnMgYWxsIHRoZSBhdmFpbGFibGUgZnVuY3Rpb25zIG1heSBiZSBjYWxsZWQgbGlrZSB0aGlzLgorYGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlcmAgaXMgYWxzbyBgU2VuZCArIFN5bmNgLCBidXQgYWxsIG9mIHRoZSBtdXRhdGluZworZnVuY3Rpb25zIHJlcXVpcmUgYSBtdXRhYmxlIChha2EgZXhjbHVzaXZlKSByZWZlcmVuY2Ugd2hpY2ggY2FuIG9ubHkgYmUgY3JlYXRlZAord2hlbiBubyBvdGhlciByZWZlcmVuY2VzIHRvIHRoZSBgRmxhdEJ1ZmZlckJ1aWxkZXJgIGV4aXN0LCBhbmQgbWF5IG5vdCBiZSBjb3BpZWQKK3dpdGhpbiB0aGUgc2FtZSB0aHJlYWQsIGxldCBhbG9uZSB0byBhIHNlY29uZCB0aHJlYWQuCisKICMjIFVzZWZ1bCB0b29scyBjcmVhdGVkIGJ5IG90aGVycwogCiAqIFtmbGF0Yy1ydXN0XShodHRwczovL2dpdGh1Yi5jb20vZnJvbC9mbGF0Yy1ydXN0KSAtIEZsYXRCdWZmZXJzIGNvbXBpbGVyCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy9kb2NzL3NvdXJjZS9Td2lmdFVzYWdlLm1kIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvZG9jcy9zb3VyY2UvU3dpZnRVc2FnZS5tZAppbmRleCAxYzQzOGYyLi5iMTAzNzVlIDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy9kb2NzL3NvdXJjZS9Td2lmdFVzYWdlLm1kCisrKyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL2RvY3Mvc291cmNlL1N3aWZ0VXNhZ2UubWQKQEAgLTIyLDEwICsyMiwxMCBAQAogCiAjIyBUZXN0aW5nIHRoZSBGbGF0QnVmZmVycyBTd2lmdCBsaWJyYXJ5CiAKLVRoZSBjb2RlIHRvIHRlc3QgdGhlIFN3aWZ0IGxpYnJhcnkgY2FuIGJlIGZvdW5kIGF0IGBmbGF0YnVmZmVycy9GbGF0YnVmZmVycy5UZXN0LlN3aWZ0YC4KLVRoZSB0ZXN0IGNvZGUgaXRzZWxmIGlzIGxvY2F0ZWQgaW4gW0ZsYXRidWZmZXJzLlRlc3QuU3dpZnRdKGh0dHBzOi8vZ2l0aHViLmNvbS9nb29nbGUvZmxhdGJ1ZmZlcnMvYmxvYi9tYXN0ZXIvdGVzdHMvRmxhdEJ1ZmZlcnMuVGVzdC5Td2lmdCkuCitUaGUgY29kZSB0byB0ZXN0IHRoZSBTd2lmdCBsaWJyYXJ5IGNhbiBiZSBmb3VuZCBhdCBgZmxhdGJ1ZmZlcnMvdGVzdHMvc3dpZnQvdGVzdHNgLgorVGhlIHRlc3QgY29kZSBpdHNlbGYgaXMgbG9jYXRlZCBpbiBbZmxhdGJ1ZmZlcnMvdGVzdHMvc3dpZnQvdGVzdHNdKGh0dHBzOi8vZ2l0aHViLmNvbS9nb29nbGUvZmxhdGJ1ZmZlcnMvYmxvYi9tYXN0ZXIvdGVzdHMvc3dpZnQvdGVzdHMpLgogCi1UbyBydW4gdGhlIHRlc3RzLCB1c2UgdGhlIFtTd2lmdFRlc3Quc2hdKGh0dHBzOi8vZ2l0aHViLmNvbS9nb29nbGUvZmxhdGJ1ZmZlcnMvYmxvYi9tYXN0ZXIvdGVzdHMvRmxhdEJ1ZmZlcnMuVGVzdC5Td2lmdC9Td2lmdFRlc3Quc2gpIHNoZWxsIHNjcmlwdC4KK1RvIHJ1biB0aGUgdGVzdHMsIHVzZSB0aGUgW1N3aWZ0VGVzdC5zaF0oaHR0cHM6Ly9naXRodWIuY29tL2dvb2dsZS9mbGF0YnVmZmVycy9ibG9iL21hc3Rlci90ZXN0cy9zd2lmdC90ZXN0cy9Td2lmdFRlc3Quc2gpIHNoZWxsIHNjcmlwdC4KIAogKk5vdGU6IFRoZSBzaGVsbCBzY3JpcHQgcmVxdWlyZXMgW1N3aWZ0XShodHRwczovL3N3aWZ0Lm9yZykgdG8KIGJlIGluc3RhbGxlZC4qCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy9kb2NzL3NvdXJjZS9UeXBlU2NyaXB0VXNhZ2UubWQgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy9kb2NzL3NvdXJjZS9UeXBlU2NyaXB0VXNhZ2UubWQKaW5kZXggYTFhY2FlYi4uMGRkMWRhMiAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvZG9jcy9zb3VyY2UvVHlwZVNjcmlwdFVzYWdlLm1kCisrKyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL2RvY3Mvc291cmNlL1R5cGVTY3JpcHRVc2FnZS5tZApAQCAtMjEsOCArMjEsOCBAQAogCiAjIyBUZXN0aW5nIHRoZSBGbGF0QnVmZmVycyBUeXBlU2NyaXB0IGxpYnJhcnkKIAotVG8gcnVuIHRoZSB0ZXN0cywgdXNlIHRoZSBbVHlwZVNjcmlwdFRlc3Quc2hdKGh0dHBzOi8vZ2l0aHViLmNvbS9nb29nbGUvCi1mbGF0YnVmZmVycy9ibG9iL21hc3Rlci90ZXN0cy9UeXBlU2NyaXB0VGVzdC5zaCkgc2hlbGwgc2NyaXB0LgorVG8gcnVuIHRoZSB0ZXN0cywgdXNlIHRoZSBbVHlwZVNjcmlwdFRlc3QucHldKGh0dHBzOi8vZ2l0aHViLmNvbS9nb29nbGUvCitmbGF0YnVmZmVycy9ibG9iL21hc3Rlci90ZXN0cy9UeXBlU2NyaXB0VGVzdC5weSkgUHl0aG9uMyBzY3JpcHQuCiAKICpOb3RlOiBUaGUgVHlwZVNjcmlwdCB0ZXN0IGZpbGUgcmVxdWlyZXMgW05vZGUuanNdKGh0dHBzOi8vbm9kZWpzLm9yZy9lbi8pLioKIApkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvZ3JwYy9leGFtcGxlcy9nZW5lcmF0ZS5zaCBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL2dycGMvZXhhbXBsZXMvZ2VuZXJhdGUuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDBmMDUxZGEuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvZ3JwYy9leGFtcGxlcy9nZW5lcmF0ZS5zaAorKysgL2Rldi9udWxsCkBAIC0xLDcxICswLDAgQEAKLSMhL2Jpbi9iYXNoCi0jCi0jIENvcHlyaWdodCAyMDIxIEdvb2dsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0jCi0jIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0jIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0jIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLXNldCAtZQotCi1jdXJyZW50X2Rpcj1gcHdkYAotCi1jZCAuLi8uLgotCi1tYWluX2Rpcj1gcHdkYAotCi1jZCAke2N1cnJlbnRfZGlyfQotCi0jIExvb2tzIGZvciBmbGF0YyB3aXRoaW4gdGhlIHJvb3QgZGlyICYgZGVidWcKLWlmIFsgLWUgJHttYWluX2Rpcn0vZmxhdGMgXTsgdGhlbgotICBhbGlhcyBmYmM9JyR7bWFpbl9kaXJ9L2ZsYXRjJwotZWxpZiBbIC1lICR7bWFpbl9kaXJ9L0RlYnVnL2ZsYXRjIF07IHRoZW4KLSAgYWxpYXMgZmJjPScke21haW5fZGlyfS9EZWJ1Zy9mbGF0YycKLWVsc2UKLSAgZWNobyAnZmxhdGMnIGNvdWxkIG5vdCBiZSBmb3VuZC4gTWFrZSBzdXJlIHRvIGJ1aWxkIEZsYXRCdWZmZXJzIGZyb20gdGhlIFwKLSAgICAgICAkcm9vdGRpciBkaXJlY3RvcnkuCi0gIGV4aXQgMQotZmkKLQotZ2VuZXJhdG9yPSItLWdycGMgJGN1cnJlbnRfZGlyL2dyZWV0ZXIuZmJzIgotCi0jIFJlZ2VuZXJhdGUgR28gbGFuZyBjb2RlCi1jZCBnbwotCi1jZCBncmVldGVyCi1mYmMgLS1iZmJzLWZpbGVuYW1lcyAuLi8uLiAtLWdvICR7Z2VuZXJhdG9yfQotCi1jZCAke2N1cnJlbnRfZGlyfQotCi0jIFJlZ2VuZXJhdGUgUHl0aG9uIGNvZGUKLWNkIHB5dGhvbgotCi1jZCBncmVldGVyCi0KLWZiYyAtLWJmYnMtZmlsZW5hbWVzIC4uLy4uIC0tcHl0aG9uICR7Z2VuZXJhdG9yfQotCi1jZCAke2N1cnJlbnRfZGlyfQotCi0jIFJlZ2VuZXJhdGUgU3dpZnQgY29kZQotY2Qgc3dpZnQKLQotY2QgR3JlZXRlci9Tb3VyY2VzL01vZGVsCi1mYmMgLS1iZmJzLWZpbGVuYW1lcyAuLi8uLi8uLi8uLiAtLXN3aWZ0IC0tZ2VuLWpzb24tZW1pdCAke2dlbmVyYXRvcn0KLQotY2QgJHtjdXJyZW50X2Rpcn0KLQotIyBSZWdlbmVyYXRlIFR5cGVzY3JpcHQgY29kZQotY2QgdHMKLQotY2QgZ3JlZXRlci9zcmMKLWZiYyAtLWJmYnMtZmlsZW5hbWVzIC4uLy4uLy4uIC0tdHMgJHtnZW5lcmF0b3J9Ci0KLWNkICR7Y3VycmVudF9kaXJ9CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy9ncnBjL2V4YW1wbGVzL2dvL2dyZWV0ZXIvY2xpZW50L21haW4uZ28gYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy9ncnBjL2V4YW1wbGVzL2dvL2dyZWV0ZXIvY2xpZW50L21haW4uZ28KaW5kZXggNDk5MzU3Ni4uYTc2NDkxMiAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvZ3JwYy9leGFtcGxlcy9nby9ncmVldGVyL2NsaWVudC9tYWluLmdvCisrKyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL2dycGMvZXhhbXBsZXMvZ28vZ3JlZXRlci9jbGllbnQvbWFpbi5nbwpAQCAtOSw4ICs5LDEwIEBACiAJInRpbWUiCiAKIAlmbGF0YnVmZmVycyAiZ2l0aHViLmNvbS9nb29nbGUvZmxhdGJ1ZmZlcnMvZ28iCi0JbW9kZWxzICJnaXRodWIuY29tL2dvb2dsZS9mbGF0YnVmZmVycy9ncnBjL2V4YW1wbGVzL2dvL2dyZWV0ZXIvbW9kZWxzIgogCSJnb29nbGUuZ29sYW5nLm9yZy9ncnBjIgorCSJnb29nbGUuZ29sYW5nLm9yZy9ncnBjL2NyZWRlbnRpYWxzL2luc2VjdXJlIgorCisJbW9kZWxzICJnaXRodWIuY29tL2dvb2dsZS9mbGF0YnVmZmVycy9ncnBjL2V4YW1wbGVzL2dvL2dyZWV0ZXIvbW9kZWxzIgogKQogCiB2YXIgKApAQCAtNjMsNyArNjUsOSBAQAogCiBmdW5jIG1haW4oKSB7CiAJZmxhZy5QYXJzZSgpCi0JY29ubiwgZXJyIDo9IGdycGMuRGlhbChmbXQuU3ByaW50ZigibG9jYWxob3N0OiVkIiwgMzAwMCksIGdycGMuV2l0aEluc2VjdXJlKCksIGdycGMuV2l0aENvZGVjKGZsYXRidWZmZXJzLkZsYXRidWZmZXJzQ29kZWN7fSkpCisJY29ubiwgZXJyIDo9IGdycGMuRGlhbChmbXQuU3ByaW50ZigibG9jYWxob3N0OiVkIiwgMzAwMCksCisJCWdycGMuV2l0aFRyYW5zcG9ydENyZWRlbnRpYWxzKGluc2VjdXJlLk5ld0NyZWRlbnRpYWxzKCkpLAorCQlncnBjLldpdGhEZWZhdWx0Q2FsbE9wdGlvbnMoZ3JwYy5Gb3JjZUNvZGVjKGZsYXRidWZmZXJzLkZsYXRidWZmZXJzQ29kZWN7fSkpKQogCWlmIGVyciAhPSBuaWwgewogCQlsb2cuRmF0YWxmKCJmYWlsIHRvIGRpYWw6ICV2IiwgZXJyKQogCX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL2dycGMvZXhhbXBsZXMvc3dpZnQvR3JlZXRlci9Tb3VyY2VzL01vZGVsL2dyZWV0ZXJfZ2VuZXJhdGVkLnN3aWZ0IGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvZ3JwYy9leGFtcGxlcy9zd2lmdC9HcmVldGVyL1NvdXJjZXMvTW9kZWwvZ3JlZXRlcl9nZW5lcmF0ZWQuc3dpZnQKaW5kZXggYTdjNDIwYi4uMTdjZjM4ZiAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvZ3JwYy9leGFtcGxlcy9zd2lmdC9HcmVldGVyL1NvdXJjZXMvTW9kZWwvZ3JlZXRlcl9nZW5lcmF0ZWQuc3dpZnQKKysrIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvZ3JwYy9leGFtcGxlcy9zd2lmdC9HcmVldGVyL1NvdXJjZXMvTW9kZWwvZ3JlZXRlcl9nZW5lcmF0ZWQuc3dpZnQKQEAgLTYsNyArNiw3IEBACiAKIHB1YmxpYyBzdHJ1Y3QgbW9kZWxzX0hlbGxvUmVwbHk6IEZsYXRCdWZmZXJPYmplY3QsIFZlcmlmaWFibGUgewogCi0gIHN0YXRpYyBmdW5jIHZhbGlkYXRlVmVyc2lvbigpIHsgRmxhdEJ1ZmZlcnNWZXJzaW9uXzJfMF8wKCkgfQorICBzdGF0aWMgZnVuYyB2YWxpZGF0ZVZlcnNpb24oKSB7IEZsYXRCdWZmZXJzVmVyc2lvbl8yXzBfOCgpIH0KICAgcHVibGljIHZhciBfX2J1ZmZlcjogQnl0ZUJ1ZmZlciEgeyByZXR1cm4gX2FjY2Vzc29yLmJiIH0KICAgcHJpdmF0ZSB2YXIgX2FjY2Vzc29yOiBUYWJsZQogCkBAIC01NSw3ICs1NSw3IEBACiAKIHB1YmxpYyBzdHJ1Y3QgbW9kZWxzX0hlbGxvUmVxdWVzdDogRmxhdEJ1ZmZlck9iamVjdCwgVmVyaWZpYWJsZSB7CiAKLSAgc3RhdGljIGZ1bmMgdmFsaWRhdGVWZXJzaW9uKCkgeyBGbGF0QnVmZmVyc1ZlcnNpb25fMl8wXzAoKSB9CisgIHN0YXRpYyBmdW5jIHZhbGlkYXRlVmVyc2lvbigpIHsgRmxhdEJ1ZmZlcnNWZXJzaW9uXzJfMF84KCkgfQogICBwdWJsaWMgdmFyIF9fYnVmZmVyOiBCeXRlQnVmZmVyISB7IHJldHVybiBfYWNjZXNzb3IuYmIgfQogICBwcml2YXRlIHZhciBfYWNjZXNzb3I6IFRhYmxlCiAKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL2dycGMvZXhhbXBsZXMvdHMvZ3JlZXRlci9zcmMvZ3JlZXRlcl9nZW5lcmF0ZWQudHMgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy9ncnBjL2V4YW1wbGVzL3RzL2dyZWV0ZXIvc3JjL2dyZWV0ZXJfZ2VuZXJhdGVkLnRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0OGFmZTUKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy9ncnBjL2V4YW1wbGVzL3RzL2dyZWV0ZXIvc3JjL2dyZWV0ZXJfZ2VuZXJhdGVkLnRzCkBAIC0wLDAgKzEsNCBAQAorLy8gYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgYnkgdGhlIEZsYXRCdWZmZXJzIGNvbXBpbGVyLCBkbyBub3QgbW9kaWZ5CisKK2V4cG9ydCB7IEhlbGxvUmVwbHkgfSBmcm9tICcuL21vZGVscy9oZWxsby1yZXBseS5qcyc7CitleHBvcnQgeyBIZWxsb1JlcXVlc3QgfSBmcm9tICcuL21vZGVscy9oZWxsby1yZXF1ZXN0LmpzJzsKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL2dycGMvZXhhbXBsZXMvdHMvZ3JlZXRlci9zcmMvbW9kZWxzL2hlbGxvLXJlcGx5LnRzIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvZ3JwYy9leGFtcGxlcy90cy9ncmVldGVyL3NyYy9tb2RlbHMvaGVsbG8tcmVwbHkudHMKaW5kZXggZTY4ZjdhNC4uYjA0MWE3ZSAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvZ3JwYy9leGFtcGxlcy90cy9ncmVldGVyL3NyYy9tb2RlbHMvaGVsbG8tcmVwbHkudHMKKysrIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvZ3JwYy9leGFtcGxlcy90cy9ncmVldGVyL3NyYy9tb2RlbHMvaGVsbG8tcmVwbHkudHMKQEAgLTcsNyArNyw3IEBACiBleHBvcnQgY2xhc3MgSGVsbG9SZXBseSB7CiAgIGJiOiBmbGF0YnVmZmVycy5CeXRlQnVmZmVyfG51bGwgPSBudWxsOwogICBiYl9wb3MgPSAwOwotX19pbml0KGk6bnVtYmVyLCBiYjpmbGF0YnVmZmVycy5CeXRlQnVmZmVyKTpIZWxsb1JlcGx5IHsKKyAgX19pbml0KGk6bnVtYmVyLCBiYjpmbGF0YnVmZmVycy5CeXRlQnVmZmVyKTpIZWxsb1JlcGx5IHsKICAgdGhpcy5iYl9wb3MgPSBpOwogICB0aGlzLmJiID0gYmI7CiAgIHJldHVybiB0aGlzOwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvZ3JwYy9leGFtcGxlcy90cy9ncmVldGVyL3NyYy9tb2RlbHMvaGVsbG8tcmVxdWVzdC50cyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL2dycGMvZXhhbXBsZXMvdHMvZ3JlZXRlci9zcmMvbW9kZWxzL2hlbGxvLXJlcXVlc3QudHMKaW5kZXggMzcxODE2Ny4uZDk0M2U0NSAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvZ3JwYy9leGFtcGxlcy90cy9ncmVldGVyL3NyYy9tb2RlbHMvaGVsbG8tcmVxdWVzdC50cworKysgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy9ncnBjL2V4YW1wbGVzL3RzL2dyZWV0ZXIvc3JjL21vZGVscy9oZWxsby1yZXF1ZXN0LnRzCkBAIC03LDcgKzcsNyBAQAogZXhwb3J0IGNsYXNzIEhlbGxvUmVxdWVzdCB7CiAgIGJiOiBmbGF0YnVmZmVycy5CeXRlQnVmZmVyfG51bGwgPSBudWxsOwogICBiYl9wb3MgPSAwOwotX19pbml0KGk6bnVtYmVyLCBiYjpmbGF0YnVmZmVycy5CeXRlQnVmZmVyKTpIZWxsb1JlcXVlc3QgeworICBfX2luaXQoaTpudW1iZXIsIGJiOmZsYXRidWZmZXJzLkJ5dGVCdWZmZXIpOkhlbGxvUmVxdWVzdCB7CiAgIHRoaXMuYmJfcG9zID0gaTsKICAgdGhpcy5iYiA9IGJiOwogICByZXR1cm4gdGhpczsKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL2dycGMvc3JjL2NvbXBpbGVyL2NwcF9nZW5lcmF0b3IuY2MgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy9ncnBjL3NyYy9jb21waWxlci9jcHBfZ2VuZXJhdG9yLmNjCmluZGV4IDY5ZGNmNTkuLmZkNjM1ZjIgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL2dycGMvc3JjL2NvbXBpbGVyL2NwcF9nZW5lcmF0b3IuY2MKKysrIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvZ3JwYy9zcmMvY29tcGlsZXIvY3BwX2dlbmVyYXRvci5jYwpAQCAtOCwyNCArOCwyNCBAQAogbmFtZXNwYWNlIGdycGNfY3BwX2dlbmVyYXRvciB7CiBuYW1lc3BhY2UgewogCi1ncnBjOjpzdHJpbmcgbWVzc2FnZV9oZWFkZXJfZXh0KCkgeyByZXR1cm4gIl9nZW5lcmF0ZWQuaCI7IH0KLWdycGM6OnN0cmluZyBzZXJ2aWNlX2hlYWRlcl9leHQoKSB7IHJldHVybiAiLmdycGMuZmIuaCI7IH0KK3N0YXRpYyBncnBjOjpzdHJpbmcgc2VydmljZV9oZWFkZXJfZXh0KCkgeyByZXR1cm4gIi5ncnBjLmZiLmgiOyB9CiAKLXRlbXBsYXRlPGNsYXNzIFQ+IGdycGM6OnN0cmluZyBhc19zdHJpbmcoVCB4KSB7Cit0ZW1wbGF0ZTxjbGFzcyBUPgorc3RhdGljIGdycGM6OnN0cmluZyBhc19zdHJpbmcoVCB4KSB7CiAgIHN0ZDo6b3N0cmluZ3N0cmVhbSBvdXQ7CiAgIG91dCA8PCB4OwogICByZXR1cm4gb3V0LnN0cigpOwogfQogCi1pbmxpbmUgYm9vbCBDbGllbnRPbmx5U3RyZWFtaW5nKGNvbnN0IGdycGNfZ2VuZXJhdG9yOjpNZXRob2QgKm1ldGhvZCkgeworc3RhdGljIGlubGluZSBib29sIENsaWVudE9ubHlTdHJlYW1pbmcoY29uc3QgZ3JwY19nZW5lcmF0b3I6Ok1ldGhvZCAqbWV0aG9kKSB7CiAgIHJldHVybiBtZXRob2QtPkNsaWVudFN0cmVhbWluZygpICYmICFtZXRob2QtPlNlcnZlclN0cmVhbWluZygpOwogfQogCi1pbmxpbmUgYm9vbCBTZXJ2ZXJPbmx5U3RyZWFtaW5nKGNvbnN0IGdycGNfZ2VuZXJhdG9yOjpNZXRob2QgKm1ldGhvZCkgeworc3RhdGljIGlubGluZSBib29sIFNlcnZlck9ubHlTdHJlYW1pbmcoY29uc3QgZ3JwY19nZW5lcmF0b3I6Ok1ldGhvZCAqbWV0aG9kKSB7CiAgIHJldHVybiAhbWV0aG9kLT5DbGllbnRTdHJlYW1pbmcoKSAmJiBtZXRob2QtPlNlcnZlclN0cmVhbWluZygpOwogfQogCi1ncnBjOjpzdHJpbmcgRmlsZW5hbWVJZGVudGlmaWVyKGNvbnN0IGdycGM6OnN0cmluZyAmZmlsZW5hbWUpIHsKK3N0YXRpYyBncnBjOjpzdHJpbmcgRmlsZW5hbWVJZGVudGlmaWVyKGNvbnN0IGdycGM6OnN0cmluZyAmZmlsZW5hbWUpIHsKICAgZ3JwYzo6c3RyaW5nIHJlc3VsdDsKICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IGZpbGVuYW1lLnNpemUoKTsgaSsrKSB7CiAgICAgY2hhciBjID0gZmlsZW5hbWVbaV07CkBAIC00MCwxMSArNDAsMTEgQEAKICAgfQogICByZXR1cm4gcmVzdWx0OwogfQotfSAgLy8gbmFtZXNwYWNlCiAKLXRlbXBsYXRlPGNsYXNzIFQsIHNpemVfdCBOPiBUICphcnJheV9lbmQoVCAoJmFycmF5KVtOXSkgeyByZXR1cm4gYXJyYXkgKyBOOyB9Cit0ZW1wbGF0ZTxjbGFzcyBULCBzaXplX3QgTj4KK3N0YXRpYyBUICphcnJheV9lbmQoVCAoJmFycmF5KVtOXSkgeyByZXR1cm4gYXJyYXkgKyBOOyB9CiAKLXZvaWQgUHJpbnRJbmNsdWRlcyhncnBjX2dlbmVyYXRvcjo6UHJpbnRlciAqcHJpbnRlciwKK3N0YXRpYyB2b2lkIFByaW50SW5jbHVkZXMoZ3JwY19nZW5lcmF0b3I6OlByaW50ZXIgKnByaW50ZXIsCiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8Z3JwYzo6c3RyaW5nPiAmaGVhZGVycywKICAgICAgICAgICAgICAgICAgICBjb25zdCBQYXJhbWV0ZXJzICZwYXJhbXMpIHsKICAgc3RkOjptYXA8Z3JwYzo6c3RyaW5nLCBncnBjOjpzdHJpbmc+IHZhcnM7CkBAIC02NCw4ICs2NCwxMCBAQAogICB9CiB9CiAKK30gIC8vIG5hbWVzcGFjZQorCiBncnBjOjpzdHJpbmcgR2V0SGVhZGVyUHJvbG9ndWUoZ3JwY19nZW5lcmF0b3I6OkZpbGUgKmZpbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUGFyYW1ldGVycyAmIC8qcGFyYW1zKi8pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQYXJhbWV0ZXJzICZwYXJhbXMpIHsKICAgZ3JwYzo6c3RyaW5nIG91dHB1dDsKICAgewogICAgIC8vIFNjb3BlIHRoZSBvdXRwdXQgc3RyZWFtIHNvIGl0IGNsb3NlcyBhbmQgZmluYWxpemVzIG91dHB1dCB0byB0aGUgc3RyaW5nLgpAQCAtNzUsNyArNzcsNyBAQAogICAgIHZhcnNbImZpbGVuYW1lIl0gPSBmaWxlLT5maWxlbmFtZSgpOwogICAgIHZhcnNbImZpbGVuYW1lX2lkZW50aWZpZXIiXSA9IEZpbGVuYW1lSWRlbnRpZmllcihmaWxlLT5maWxlbmFtZSgpKTsKICAgICB2YXJzWyJmaWxlbmFtZV9iYXNlIl0gPSBmaWxlLT5maWxlbmFtZV93aXRob3V0X2V4dCgpOwotICAgIHZhcnNbIm1lc3NhZ2VfaGVhZGVyX2V4dCJdID0gZmlsZS0+bWVzc2FnZV9oZWFkZXJfZXh0KCk7CisgICAgdmFyc1sibWVzc2FnZV9oZWFkZXJfZXh0Il0gPSBwYXJhbXMubWVzc2FnZV9oZWFkZXJfZXh0ZW5zaW9uOwogCiAgICAgcHJpbnRlci0+UHJpbnQodmFycywgIi8vIEdlbmVyYXRlZCBieSB0aGUgZ1JQQyBDKysgcGx1Z2luLlxuIik7CiAgICAgcHJpbnRlci0+UHJpbnQodmFycywKQEAgLTEzOCw3ICsxNDAsMTAgQEAKICAgcmV0dXJuIG91dHB1dDsKIH0KIAotdm9pZCBQcmludEhlYWRlckNsaWVudE1ldGhvZEludGVyZmFjZXMoCisKK25hbWVzcGFjZSB7CisKK3N0YXRpYyB2b2lkIFByaW50SGVhZGVyQ2xpZW50TWV0aG9kSW50ZXJmYWNlcygKICAgICBncnBjX2dlbmVyYXRvcjo6UHJpbnRlciAqcHJpbnRlciwgY29uc3QgZ3JwY19nZW5lcmF0b3I6Ok1ldGhvZCAqbWV0aG9kLAogICAgIHN0ZDo6bWFwPGdycGM6OnN0cmluZywgZ3JwYzo6c3RyaW5nPiAqdmFycywgYm9vbCBpc19wdWJsaWMpIHsKICAgKCp2YXJzKVsiTWV0aG9kIl0gPSBtZXRob2QtPm5hbWUoKTsKQEAgLTM1Miw3ICszNTcsOSBAQAogICB9CiB9CiAKLXZvaWQgUHJpbnRIZWFkZXJDbGllbnRNZXRob2QoZ3JwY19nZW5lcmF0b3I6OlByaW50ZXIgKnByaW50ZXIsCisKKworc3RhdGljIHZvaWQgUHJpbnRIZWFkZXJDbGllbnRNZXRob2QoZ3JwY19nZW5lcmF0b3I6OlByaW50ZXIgKnByaW50ZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGdycGNfZ2VuZXJhdG9yOjpNZXRob2QgKm1ldGhvZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptYXA8Z3JwYzo6c3RyaW5nLCBncnBjOjpzdHJpbmc+ICp2YXJzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3B1YmxpYykgewpAQCAtNTU1LDcgKzU2Miw3IEBACiAgIH0KIH0KIAotdm9pZCBQcmludEhlYWRlckNsaWVudE1ldGhvZERhdGEoZ3JwY19nZW5lcmF0b3I6OlByaW50ZXIgKnByaW50ZXIsCitzdGF0aWMgdm9pZCBQcmludEhlYWRlckNsaWVudE1ldGhvZERhdGEoZ3JwY19nZW5lcmF0b3I6OlByaW50ZXIgKnByaW50ZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBncnBjX2dlbmVyYXRvcjo6TWV0aG9kICptZXRob2QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1hcDxncnBjOjpzdHJpbmcsIGdycGM6OnN0cmluZz4gKnZhcnMpIHsKICAgKCp2YXJzKVsiTWV0aG9kIl0gPSBtZXRob2QtPm5hbWUoKTsKQEAgLTU2Myw3ICs1NzAsNyBAQAogICAgICAgICAgICAgICAgICAiY29uc3QgOjpncnBjOjppbnRlcm5hbDo6UnBjTWV0aG9kIHJwY21ldGhvZF8kTWV0aG9kJF87XG4iKTsKIH0KIAotdm9pZCBQcmludEhlYWRlclNlcnZlck1ldGhvZFN5bmMoZ3JwY19nZW5lcmF0b3I6OlByaW50ZXIgKnByaW50ZXIsCitzdGF0aWMgdm9pZCBQcmludEhlYWRlclNlcnZlck1ldGhvZFN5bmMoZ3JwY19nZW5lcmF0b3I6OlByaW50ZXIgKnByaW50ZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBncnBjX2dlbmVyYXRvcjo6TWV0aG9kICptZXRob2QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1hcDxncnBjOjpzdHJpbmcsIGdycGM6OnN0cmluZz4gKnZhcnMpIHsKICAgKCp2YXJzKVsiTWV0aG9kIl0gPSBtZXRob2QtPm5hbWUoKTsKQEAgLTU5Nyw3ICs2MDQsNyBAQAogICBwcmludGVyLT5QcmludChtZXRob2QtPkdldFRyYWlsaW5nQ29tbWVudHMoIi8vIikuY19zdHIoKSk7CiB9CiAKLXZvaWQgUHJpbnRIZWFkZXJTZXJ2ZXJNZXRob2RBc3luYyhncnBjX2dlbmVyYXRvcjo6UHJpbnRlciAqcHJpbnRlciwKK3N0YXRpYyB2b2lkIFByaW50SGVhZGVyU2VydmVyTWV0aG9kQXN5bmMoZ3JwY19nZW5lcmF0b3I6OlByaW50ZXIgKnByaW50ZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ3JwY19nZW5lcmF0b3I6Ok1ldGhvZCAqbWV0aG9kLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWFwPGdycGM6OnN0cmluZywgZ3JwYzo6c3RyaW5nPiAqdmFycykgewogICAoKnZhcnMpWyJNZXRob2QiXSA9IG1ldGhvZC0+bmFtZSgpOwpAQCAtNjQ4LDcgKzY1NSw3IEBACiAgICAgICAgICI6OmdycGM6OlN0YXR1cyAkTWV0aG9kJCgiCiAgICAgICAgICI6OmdycGM6OlNlcnZlckNvbnRleHQqIC8qY29udGV4dCovLCAiCiAgICAgICAgICI6OmdycGM6OlNlcnZlclJlYWRlcjwgJFJlcXVlc3QkPiogLypyZWFkZXIqLywgIgotICAgICAgICAiJFJlc3BvbnNlJCogcmVzcG9uc2UpIGZpbmFsIG92ZXJyaWRlIHtcbiIKKyAgICAgICAgIiRSZXNwb25zZSQqIC8qcmVzcG9uc2UqLykgZmluYWwgb3ZlcnJpZGUge1xuIgogICAgICAgICAiICBhYm9ydCgpO1xuIgogICAgICAgICAiICByZXR1cm4gOjpncnBjOjpTdGF0dXMoOjpncnBjOjpTdGF0dXNDb2RlOjpVTklNUExFTUVOVEVELCBcIlwiKTtcbiIKICAgICAgICAgIn1cbiIpOwpAQCAtNzEzLDcgKzcyMCw3IEBACiAgIHByaW50ZXItPlByaW50KCp2YXJzLCAifTtcbiIpOwogfQogCi12b2lkIFByaW50SGVhZGVyU2VydmVyTWV0aG9kU3RyZWFtZWRVbmFyeSgKK3N0YXRpYyB2b2lkIFByaW50SGVhZGVyU2VydmVyTWV0aG9kU3RyZWFtZWRVbmFyeSgKICAgICBncnBjX2dlbmVyYXRvcjo6UHJpbnRlciAqcHJpbnRlciwgY29uc3QgZ3JwY19nZW5lcmF0b3I6Ok1ldGhvZCAqbWV0aG9kLAogICAgIHN0ZDo6bWFwPGdycGM6OnN0cmluZywgZ3JwYzo6c3RyaW5nPiAqdmFycykgewogICAoKnZhcnMpWyJNZXRob2QiXSA9IG1ldGhvZC0+bmFtZSgpOwpAQCAtNzY0LDcgKzc3MSw3IEBACiAgIH0KIH0KIAotdm9pZCBQcmludEhlYWRlclNlcnZlck1ldGhvZFNwbGl0U3RyZWFtaW5nKAorc3RhdGljIHZvaWQgUHJpbnRIZWFkZXJTZXJ2ZXJNZXRob2RTcGxpdFN0cmVhbWluZygKICAgICBncnBjX2dlbmVyYXRvcjo6UHJpbnRlciAqcHJpbnRlciwgY29uc3QgZ3JwY19nZW5lcmF0b3I6Ok1ldGhvZCAqbWV0aG9kLAogICAgIHN0ZDo6bWFwPGdycGM6OnN0cmluZywgZ3JwYzo6c3RyaW5nPiAqdmFycykgewogICAoKnZhcnMpWyJNZXRob2QiXSA9IG1ldGhvZC0+bmFtZSgpOwpAQCAtODE3LDcgKzgyNCw3IEBACiAgIH0KIH0KIAotdm9pZCBQcmludEhlYWRlclNlcnZlck1ldGhvZEdlbmVyaWMoCitzdGF0aWMgdm9pZCBQcmludEhlYWRlclNlcnZlck1ldGhvZEdlbmVyaWMoCiAgICAgZ3JwY19nZW5lcmF0b3I6OlByaW50ZXIgKnByaW50ZXIsIGNvbnN0IGdycGNfZ2VuZXJhdG9yOjpNZXRob2QgKm1ldGhvZCwKICAgICBzdGQ6Om1hcDxncnBjOjpzdHJpbmcsIGdycGM6OnN0cmluZz4gKnZhcnMpIHsKICAgKCp2YXJzKVsiTWV0aG9kIl0gPSBtZXRob2QtPm5hbWUoKTsKQEAgLTg4OCw3ICs4OTUsNyBAQAogICBwcmludGVyLT5QcmludCgqdmFycywgIn07XG4iKTsKIH0KIAotdm9pZCBQcmludEhlYWRlclNlcnZpY2UoZ3JwY19nZW5lcmF0b3I6OlByaW50ZXIgKnByaW50ZXIsCitzdGF0aWMgdm9pZCBQcmludEhlYWRlclNlcnZpY2UoZ3JwY19nZW5lcmF0b3I6OlByaW50ZXIgKnByaW50ZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBncnBjX2dlbmVyYXRvcjo6U2VydmljZSAqc2VydmljZSwKICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWFwPGdycGM6OnN0cmluZywgZ3JwYzo6c3RyaW5nPiAqdmFycykgewogICAoKnZhcnMpWyJTZXJ2aWNlIl0gPSBzZXJ2aWNlLT5uYW1lKCk7CkBAIC0xMDU5LDYgKzEwNjYsOCBAQAogICBwcmludGVyLT5QcmludChzZXJ2aWNlLT5HZXRUcmFpbGluZ0NvbW1lbnRzKCIvLyIpLmNfc3RyKCkpOwogfQogCit9IC8vIG5hbWVzcGFjZQorCiBncnBjOjpzdHJpbmcgR2V0SGVhZGVyU2VydmljZXMoZ3JwY19nZW5lcmF0b3I6OkZpbGUgKmZpbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUGFyYW1ldGVycyAmcGFyYW1zKSB7CiAgIGdycGM6OnN0cmluZyBvdXRwdXQ7CkBAIC0xMTE4LDcgKzExMjcsNyBAQAogfQogCiBncnBjOjpzdHJpbmcgR2V0U291cmNlUHJvbG9ndWUoZ3JwY19nZW5lcmF0b3I6OkZpbGUgKmZpbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUGFyYW1ldGVycyAmIC8qcGFyYW1zKi8pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQYXJhbWV0ZXJzICZwYXJhbXMpIHsKICAgZ3JwYzo6c3RyaW5nIG91dHB1dDsKICAgewogICAgIC8vIFNjb3BlIHRoZSBvdXRwdXQgc3RyZWFtIHNvIGl0IGNsb3NlcyBhbmQgZmluYWxpemVzIG91dHB1dCB0byB0aGUgc3RyaW5nLgpAQCAtMTEyNyw4ICsxMTM2LDggQEAKIAogICAgIHZhcnNbImZpbGVuYW1lIl0gPSBmaWxlLT5maWxlbmFtZSgpOwogICAgIHZhcnNbImZpbGVuYW1lX2Jhc2UiXSA9IGZpbGUtPmZpbGVuYW1lX3dpdGhvdXRfZXh0KCk7Ci0gICAgdmFyc1sibWVzc2FnZV9oZWFkZXJfZXh0Il0gPSBmaWxlLT5tZXNzYWdlX2hlYWRlcl9leHQoKTsKLSAgICB2YXJzWyJzZXJ2aWNlX2hlYWRlcl9leHQiXSA9IGZpbGUtPnNlcnZpY2VfaGVhZGVyX2V4dCgpOworICAgIHZhcnNbIm1lc3NhZ2VfaGVhZGVyX2V4dCJdID0gcGFyYW1zLm1lc3NhZ2VfaGVhZGVyX2V4dGVuc2lvbjsKKyAgICB2YXJzWyJzZXJ2aWNlX2hlYWRlcl9leHQiXSA9IHNlcnZpY2VfaGVhZGVyX2V4dCgpOwogCiAgICAgcHJpbnRlci0+UHJpbnQodmFycywgIi8vIEdlbmVyYXRlZCBieSB0aGUgZ1JQQyBDKysgcGx1Z2luLlxuIik7CiAgICAgcHJpbnRlci0+UHJpbnQodmFycywKQEAgLTExNzcsNyArMTE4NiwxMCBAQAogICByZXR1cm4gb3V0cHV0OwogfQogCi12b2lkIFByaW50U291cmNlQ2xpZW50TWV0aG9kKGdycGNfZ2VuZXJhdG9yOjpQcmludGVyICpwcmludGVyLAorCituYW1lc3BhY2UgeworCitzdGF0aWMgdm9pZCBQcmludFNvdXJjZUNsaWVudE1ldGhvZChncnBjX2dlbmVyYXRvcjo6UHJpbnRlciAqcHJpbnRlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ3JwY19nZW5lcmF0b3I6Ok1ldGhvZCAqbWV0aG9kLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1hcDxncnBjOjpzdHJpbmcsIGdycGM6OnN0cmluZz4gKnZhcnMpIHsKICAgKCp2YXJzKVsiTWV0aG9kIl0gPSBtZXRob2QtPm5hbWUoKTsKQEAgLTEzMjEsNyArMTMzMyw3IEBACiAgIH0KIH0KIAotdm9pZCBQcmludFNvdXJjZVNlcnZlck1ldGhvZChncnBjX2dlbmVyYXRvcjo6UHJpbnRlciAqcHJpbnRlciwKK3N0YXRpYyB2b2lkIFByaW50U291cmNlU2VydmVyTWV0aG9kKGdycGNfZ2VuZXJhdG9yOjpQcmludGVyICpwcmludGVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBncnBjX2dlbmVyYXRvcjo6TWV0aG9kICptZXRob2QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWFwPGdycGM6OnN0cmluZywgZ3JwYzo6c3RyaW5nPiAqdmFycykgewogICAoKnZhcnMpWyJNZXRob2QiXSA9IG1ldGhvZC0+bmFtZSgpOwpAQCAtMTM3MCw3ICsxMzgyLDcgQEAKICAgfQogfQogCi12b2lkIFByaW50U291cmNlU2VydmljZShncnBjX2dlbmVyYXRvcjo6UHJpbnRlciAqcHJpbnRlciwKK3N0YXRpYyB2b2lkIFByaW50U291cmNlU2VydmljZShncnBjX2dlbmVyYXRvcjo6UHJpbnRlciAqcHJpbnRlciwKICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGdycGNfZ2VuZXJhdG9yOjpTZXJ2aWNlICpzZXJ2aWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptYXA8Z3JwYzo6c3RyaW5nLCBncnBjOjpzdHJpbmc+ICp2YXJzKSB7CiAgICgqdmFycylbIlNlcnZpY2UiXSA9IHNlcnZpY2UtPm5hbWUoKTsKQEAgLTE0ODcsNiArMTQ5OSw4IEBACiAgIH0KIH0KIAorfSAvLyBuYW1lc3BhY2UKKwogZ3JwYzo6c3RyaW5nIEdldFNvdXJjZVNlcnZpY2VzKGdycGNfZ2VuZXJhdG9yOjpGaWxlICpmaWxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFBhcmFtZXRlcnMgJnBhcmFtcykgewogICBncnBjOjpzdHJpbmcgb3V0cHV0OwpAQCAtMTUzMiw5ICsxNTQ2LDggQEAKICAgcmV0dXJuIHRlbXA7CiB9CiAKLS8vIFRPRE8obW11a2hpKTogTWFrZSBzdXJlIHdlIG5lZWQgcGFyYW1ldGVycyBvciBub3QuCiBncnBjOjpzdHJpbmcgR2V0TW9ja1Byb2xvZ3VlKGdycGNfZ2VuZXJhdG9yOjpGaWxlICpmaWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQYXJhbWV0ZXJzICYgLypwYXJhbXMqLykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQYXJhbWV0ZXJzICZwYXJhbXMpIHsKICAgZ3JwYzo6c3RyaW5nIG91dHB1dDsKICAgewogICAgIC8vIFNjb3BlIHRoZSBvdXRwdXQgc3RyZWFtIHNvIGl0IGNsb3NlcyBhbmQgZmluYWxpemVzIG91dHB1dCB0byB0aGUgc3RyaW5nLgpAQCAtMTU0Myw3ICsxNTU2LDcgQEAKIAogICAgIHZhcnNbImZpbGVuYW1lIl0gPSBmaWxlLT5maWxlbmFtZSgpOwogICAgIHZhcnNbImZpbGVuYW1lX2Jhc2UiXSA9IGZpbGUtPmZpbGVuYW1lX3dpdGhvdXRfZXh0KCk7Ci0gICAgdmFyc1sibWVzc2FnZV9oZWFkZXJfZXh0Il0gPSBtZXNzYWdlX2hlYWRlcl9leHQoKTsKKyAgICB2YXJzWyJtZXNzYWdlX2hlYWRlcl9leHQiXSA9IHBhcmFtcy5tZXNzYWdlX2hlYWRlcl9leHRlbnNpb247CiAgICAgdmFyc1sic2VydmljZV9oZWFkZXJfZXh0Il0gPSBzZXJ2aWNlX2hlYWRlcl9leHQoKTsKIAogICAgIHByaW50ZXItPlByaW50KHZhcnMsICIvLyBHZW5lcmF0ZWQgYnkgdGhlIGdSUEMgQysrIHBsdWdpbi5cbiIpOwpAQCAtMTU5MCw3ICsxNjAzLDEwIEBACiAgIHJldHVybiBvdXRwdXQ7CiB9CiAKLXZvaWQgUHJpbnRNb2NrQ2xpZW50TWV0aG9kcyhncnBjX2dlbmVyYXRvcjo6UHJpbnRlciAqcHJpbnRlciwKKworbmFtZXNwYWNlIHsKKworc3RhdGljIHZvaWQgUHJpbnRNb2NrQ2xpZW50TWV0aG9kcyhncnBjX2dlbmVyYXRvcjo6UHJpbnRlciAqcHJpbnRlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBncnBjX2dlbmVyYXRvcjo6TWV0aG9kICptZXRob2QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptYXA8Z3JwYzo6c3RyaW5nLCBncnBjOjpzdHJpbmc+ICp2YXJzKSB7CiAgICgqdmFycylbIk1ldGhvZCJdID0gbWV0aG9kLT5uYW1lKCk7CkBAIC0xNjgyLDcgKzE2OTgsNyBAQAogICB9CiB9CiAKLXZvaWQgUHJpbnRNb2NrU2VydmljZShncnBjX2dlbmVyYXRvcjo6UHJpbnRlciAqcHJpbnRlciwKK3N0YXRpYyB2b2lkIFByaW50TW9ja1NlcnZpY2UoZ3JwY19nZW5lcmF0b3I6OlByaW50ZXIgKnByaW50ZXIsCiAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ3JwY19nZW5lcmF0b3I6OlNlcnZpY2UgKnNlcnZpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptYXA8Z3JwYzo6c3RyaW5nLCBncnBjOjpzdHJpbmc+ICp2YXJzKSB7CiAgICgqdmFycylbIlNlcnZpY2UiXSA9IHNlcnZpY2UtPm5hbWUoKTsKQEAgLTE2OTgsNiArMTcxNCw4IEBACiAgIHByaW50ZXItPlByaW50KCJ9O1xuIik7CiB9CiAKK30gLy8gbmFtZXNwYWNlCisKIGdycGM6OnN0cmluZyBHZXRNb2NrU2VydmljZXMoZ3JwY19nZW5lcmF0b3I6OkZpbGUgKmZpbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFBhcmFtZXRlcnMgJnBhcmFtcykgewogICBncnBjOjpzdHJpbmcgb3V0cHV0OwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvZ3JwYy9zcmMvY29tcGlsZXIvY3BwX2dlbmVyYXRvci5oIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvZ3JwYy9zcmMvY29tcGlsZXIvY3BwX2dlbmVyYXRvci5oCmluZGV4IDE2YWE5N2EuLmE5YWYxYTYgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL2dycGMvc3JjL2NvbXBpbGVyL2NwcF9nZW5lcmF0b3IuaAorKysgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy9ncnBjL3NyYy9jb21waWxlci9jcHBfZ2VuZXJhdG9yLmgKQEAgLTMzLDYgKzMzLDggQEAKICAgZ3JwYzo6c3RyaW5nIGdycGNfc2VhcmNoX3BhdGg7CiAgIC8vIEdlbmVyYXRlIEdNT0NLIGNvZGUgdG8gZmFjaWxpdGF0ZSB1bml0IHRlc3RpbmcuCiAgIGJvb2wgZ2VuZXJhdGVfbW9ja19jb2RlOworICAvLyBCeSBkZWZhdWx0LCB1c2UgIl9nZW5lcmF0ZWQuaCIKKyAgc3RkOjpzdHJpbmcgbWVzc2FnZV9oZWFkZXJfZXh0ZW5zaW9uOwogfTsKIAogLy8gUmV0dXJuIHRoZSBwcm9sb2d1ZSBvZiB0aGUgZ2VuZXJhdGVkIGhlYWRlciBmaWxlLgpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvZ3JwYy9zcmMvY29tcGlsZXIvZ29fZ2VuZXJhdG9yLmNjIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvZ3JwYy9zcmMvY29tcGlsZXIvZ29fZ2VuZXJhdG9yLmNjCmluZGV4IDliYTJlNjUuLmFkNDY5NGIgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL2dycGMvc3JjL2NvbXBpbGVyL2dvX2dlbmVyYXRvci5jYworKysgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy9ncnBjL3NyYy9jb21waWxlci9nb19nZW5lcmF0b3IuY2MKQEAgLTE5LDIyICsxOSwyMyBAQAogfQogCiBuYW1lc3BhY2UgZ3JwY19nb19nZW5lcmF0b3IgeworbmFtZXNwYWNlIHsKIAogLy8gUmV0dXJucyBzdHJpbmcgd2l0aCBmaXJzdCBsZXR0ZXIgdG8gbG93ZXJDYXNlCi1ncnBjOjpzdHJpbmcgdW5leHBvcnROYW1lKGdycGM6OnN0cmluZyBzKSB7CitzdGF0aWMgZ3JwYzo6c3RyaW5nIHVuZXhwb3J0TmFtZShncnBjOjpzdHJpbmcgcykgewogICBpZiAocy5lbXB0eSgpKSByZXR1cm4gczsKICAgc1swXSA9IHN0YXRpY19jYXN0PGNoYXI+KHN0ZDo6dG9sb3dlcihzWzBdKSk7CiAgIHJldHVybiBzOwogfQogCiAvLyBSZXR1cm5zIHN0cmluZyB3aXRoIGZpcnN0IGxldHRlciB0byB1cHBlcmNhc2UKLWdycGM6OnN0cmluZyBleHBvcnROYW1lKGdycGM6OnN0cmluZyBzKSB7CitzdGF0aWMgZ3JwYzo6c3RyaW5nIGV4cG9ydE5hbWUoZ3JwYzo6c3RyaW5nIHMpIHsKICAgaWYgKHMuZW1wdHkoKSkgcmV0dXJuIHM7CiAgIHNbMF0gPSBzdGF0aWNfY2FzdDxjaGFyPihzdGQ6OnRvdXBwZXIoc1swXSkpOwogICByZXR1cm4gczsKIH0KIAotdm9pZCBHZW5lcmF0ZUVycm9yKGdycGNfZ2VuZXJhdG9yOjpQcmludGVyICpwcmludGVyLAorc3RhdGljIHZvaWQgR2VuZXJhdGVFcnJvcihncnBjX2dlbmVyYXRvcjo6UHJpbnRlciAqcHJpbnRlciwKICAgICAgICAgICAgICAgICAgICBzdGQ6Om1hcDxncnBjOjpzdHJpbmcsIGdycGM6OnN0cmluZz4gdmFycywKICAgICAgICAgICAgICAgICAgICBjb25zdCBib29sIG11bHRpcGxlX3JldHVybiA9IHRydWUpIHsKICAgcHJpbnRlci0+UHJpbnQodmFycywgImlmICRFcnJvcl9DaGVjayQge1xuIik7CkBAIC00Niw3ICs0Nyw3IEBACiB9CiAKIC8vIEdlbmVyYXRlcyBpbXBvcnRzIGZvciB0aGUgc2VydmljZQotdm9pZCBHZW5lcmF0ZUltcG9ydHMoZ3JwY19nZW5lcmF0b3I6OkZpbGUgKmZpbGUsCitzdGF0aWMgdm9pZCBHZW5lcmF0ZUltcG9ydHMoZ3JwY19nZW5lcmF0b3I6OkZpbGUgKmZpbGUsCiAgICAgICAgICAgICAgICAgICAgICBncnBjX2dlbmVyYXRvcjo6UHJpbnRlciAqcHJpbnRlciwKICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWFwPGdycGM6OnN0cmluZywgZ3JwYzo6c3RyaW5nPiB2YXJzKSB7CiAgIHZhcnNbImZpbGVuYW1lIl0gPSBmaWxlLT5maWxlbmFtZSgpOwpAQCAtNjYsNyArNjcsNyBAQAogfQogCiAvLyBHZW5lcmF0ZXMgU2VydmVyIG1ldGhvZCBzaWduYXR1cmUgc291cmNlCi12b2lkIEdlbmVyYXRlU2VydmVyTWV0aG9kU2lnbmF0dXJlKGNvbnN0IGdycGNfZ2VuZXJhdG9yOjpNZXRob2QgKm1ldGhvZCwKK3N0YXRpYyB2b2lkIEdlbmVyYXRlU2VydmVyTWV0aG9kU2lnbmF0dXJlKGNvbnN0IGdycGNfZ2VuZXJhdG9yOjpNZXRob2QgKm1ldGhvZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19nZW5lcmF0b3I6OlByaW50ZXIgKnByaW50ZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWFwPGdycGM6OnN0cmluZywgZ3JwYzo6c3RyaW5nPiB2YXJzKSB7CiAgIHZhcnNbIk1ldGhvZCJdID0gZXhwb3J0TmFtZShtZXRob2QtPm5hbWUoKSk7CkBAIC04Niw3ICs4Nyw3IEBACiAgIH0KIH0KIAotdm9pZCBHZW5lcmF0ZVNlcnZlck1ldGhvZChjb25zdCBncnBjX2dlbmVyYXRvcjo6TWV0aG9kICptZXRob2QsCitzdGF0aWMgdm9pZCBHZW5lcmF0ZVNlcnZlck1ldGhvZChjb25zdCBncnBjX2dlbmVyYXRvcjo6TWV0aG9kICptZXRob2QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfZ2VuZXJhdG9yOjpQcmludGVyICpwcmludGVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1hcDxncnBjOjpzdHJpbmcsIGdycGM6OnN0cmluZz4gdmFycykgewogICB2YXJzWyJNZXRob2QiXSA9IGV4cG9ydE5hbWUobWV0aG9kLT5uYW1lKCkpOwpAQCAtMjA0LDcgKzIwNSw3IEBACiB9CiAKIC8vIEdlbmVyYXRlcyBDbGllbnQgbWV0aG9kIHNpZ25hdHVyZSBzb3VyY2UKLXZvaWQgR2VuZXJhdGVDbGllbnRNZXRob2RTaWduYXR1cmUoY29uc3QgZ3JwY19nZW5lcmF0b3I6Ok1ldGhvZCAqbWV0aG9kLAorc3RhdGljIHZvaWQgR2VuZXJhdGVDbGllbnRNZXRob2RTaWduYXR1cmUoY29uc3QgZ3JwY19nZW5lcmF0b3I6Ok1ldGhvZCAqbWV0aG9kLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX2dlbmVyYXRvcjo6UHJpbnRlciAqcHJpbnRlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptYXA8Z3JwYzo6c3RyaW5nLCBncnBjOjpzdHJpbmc+IHZhcnMpIHsKICAgdmFyc1siTWV0aG9kIl0gPSBleHBvcnROYW1lKG1ldGhvZC0+bmFtZSgpKTsKQEAgLTIyNSw3ICsyMjYsNyBAQAogfQogCiAvLyBHZW5lcmF0ZXMgQ2xpZW50IG1ldGhvZCBzb3VyY2UKLXZvaWQgR2VuZXJhdGVDbGllbnRNZXRob2QoY29uc3QgZ3JwY19nZW5lcmF0b3I6Ok1ldGhvZCAqbWV0aG9kLAorc3RhdGljIHZvaWQgR2VuZXJhdGVDbGllbnRNZXRob2QoY29uc3QgZ3JwY19nZW5lcmF0b3I6Ok1ldGhvZCAqbWV0aG9kLAogICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX2dlbmVyYXRvcjo6UHJpbnRlciAqcHJpbnRlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptYXA8Z3JwYzo6c3RyaW5nLCBncnBjOjpzdHJpbmc+IHZhcnMpIHsKICAgcHJpbnRlci0+UHJpbnQodmFycywgImZ1bmMgKGMgKiRTZXJ2aWNlVW5leHBvcnRlZCRDbGllbnQpICIpOwpAQCAtNDgwLDYgKzQ4MSw3IEBACiAgIHByaW50ZXItPk91dGRlbnQoKTsKICAgcHJpbnRlci0+UHJpbnQoIn1cbiIpOwogfQorfSAgLy8gbmFtZXNwYWNlCiAKIC8vIFJldHVybnMgc291cmNlIGZvciB0aGUgc2VydmljZQogZ3JwYzo6c3RyaW5nIEdlbmVyYXRlU2VydmljZVNvdXJjZShncnBjX2dlbmVyYXRvcjo6RmlsZSAqZmlsZSwKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL2dycGMvc3JjL2NvbXBpbGVyL2phdmFfZ2VuZXJhdG9yLmNjIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvZ3JwYy9zcmMvY29tcGlsZXIvamF2YV9nZW5lcmF0b3IuY2MKaW5kZXggOThmODc4OC4uYmZlMmIxMSAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvZ3JwYy9zcmMvY29tcGlsZXIvamF2YV9nZW5lcmF0b3IuY2MKKysrIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvZ3JwYy9zcmMvY29tcGlsZXIvamF2YV9nZW5lcmF0b3IuY2MKQEAgLTQ0LDggKzQ0LDkgQEAKIAogbmFtZXNwYWNlIGdycGNfamF2YV9nZW5lcmF0b3IgewogdHlwZWRlZiBzdGQ6OnN0cmluZyBzdHJpbmc7CituYW1lc3BhY2UgewogLy8gR2VuZXJhdGVzIGltcG9ydHMgZm9yIHRoZSBzZXJ2aWNlCi12b2lkIEdlbmVyYXRlSW1wb3J0cyhncnBjX2dlbmVyYXRvcjo6RmlsZSAqZmlsZSwKK3N0YXRpYyB2b2lkIEdlbmVyYXRlSW1wb3J0cyhncnBjX2dlbmVyYXRvcjo6RmlsZSAqZmlsZSwKICAgICAgICAgICAgICAgICAgICAgIGdycGNfZ2VuZXJhdG9yOjpQcmludGVyICpwcmludGVyLCBWQVJTICZ2YXJzKSB7CiAgIHZhcnNbImZpbGVuYW1lIl0gPSBmaWxlLT5maWxlbmFtZSgpOwogICBwcmludGVyLT5QcmludCh2YXJzLApAQCAtMjg3LDcgKzI4OCw3IEBACiAgIHByaW50ZXItPlByaW50KCIgKi9cbiIpOwogfQogCi12b2lkIEdycGNXcml0ZU1ldGhvZERvY0NvbW1lbnQoUHJpbnRlciAqcHJpbnRlciwgVkFSUyAmdmFycywKK3N0YXRpYyB2b2lkIEdycGNXcml0ZU1ldGhvZERvY0NvbW1lbnQoUHJpbnRlciAqcHJpbnRlciwgVkFSUyAmdmFycywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNZXRob2REZXNjcmlwdG9yICptZXRob2QpIHsKICAgcHJpbnRlci0+UHJpbnQoIi8qKlxuIik7CiAgIHN0ZDo6dmVjdG9yPHN0cmluZz4gbGluZXMgPSBHcnBjR2V0RG9jTGluZXNGb3JEZXNjcmlwdG9yKG1ldGhvZCk7CkBAIC0xMDI5LDcgKzEwMzAsNyBAQAogICBwLT5QcmludCgifVxuIik7CiB9CiAKLXZvaWQgUHJpbnRTdGF0aWNJbXBvcnRzKFByaW50ZXIgKnApIHsKK3N0YXRpYyB2b2lkIFByaW50U3RhdGljSW1wb3J0cyhQcmludGVyICpwKSB7CiAgIHAtPlByaW50KAogICAgICAgImltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyO1xuIgogICAgICAgImltcG9ydCBzdGF0aWMgIgpAQCAtMTA2Miw3ICsxMDYzLDcgQEAKICAgICAgICJpby5ncnBjLnN0dWIuU2VydmVyQ2FsbHMuYXN5bmNVbmltcGxlbWVudGVkVW5hcnlDYWxsO1xuXG4iKTsKIH0KIAotdm9pZCBHZW5lcmF0ZVNlcnZpY2UoY29uc3QgZ3JwY19nZW5lcmF0b3I6OlNlcnZpY2UgKnNlcnZpY2UsCitzdGF0aWMgdm9pZCBHZW5lcmF0ZVNlcnZpY2UoY29uc3QgZ3JwY19nZW5lcmF0b3I6OlNlcnZpY2UgKnNlcnZpY2UsCiAgICAgICAgICAgICAgICAgICAgICBncnBjX2dlbmVyYXRvcjo6UHJpbnRlciAqcHJpbnRlciwgVkFSUyAmdmFycywKICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZGlzYWJsZV92ZXJzaW9uKSB7CiAgIC8vIEFsbCBub24tZ2VuZXJhdGVkIGNsYXNzZXMgbXVzdCBiZSByZWZlcnJlZCBieSBmdWxseSBxdWFsaWZpZWQgbmFtZXMgdG8KQEAgLTEwOTcsNiArMTA5OCw3IEBACiAKICAgUHJpbnRTZXJ2aWNlKHByaW50ZXIsIHZhcnMsIHNlcnZpY2UsIGRpc2FibGVfdmVyc2lvbik7CiB9Cit9IC8vIG5hbWVzcGFjZQogCiBncnBjOjpzdHJpbmcgR2VuZXJhdGVTZXJ2aWNlU291cmNlKAogICAgIGdycGNfZ2VuZXJhdG9yOjpGaWxlICpmaWxlLCBjb25zdCBncnBjX2dlbmVyYXRvcjo6U2VydmljZSAqc2VydmljZSwKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL2dycGMvc3JjL2NvbXBpbGVyL3B5dGhvbl9nZW5lcmF0b3IuY2MgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy9ncnBjL3NyYy9jb21waWxlci9weXRob25fZ2VuZXJhdG9yLmNjCmluZGV4IDgxMDhkYjQuLmQ1ZjY5ZTIgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL2dycGMvc3JjL2NvbXBpbGVyL3B5dGhvbl9nZW5lcmF0b3IuY2MKKysrIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvZ3JwYy9zcmMvY29tcGlsZXIvcHl0aG9uX2dlbmVyYXRvci5jYwpAQCAtMjMsOCArMjMsOSBAQAogI2luY2x1ZGUgInNyYy9jb21waWxlci9weXRob25fZ2VuZXJhdG9yLmgiCiAKIG5hbWVzcGFjZSBncnBjX3B5dGhvbl9nZW5lcmF0b3IgeworbmFtZXNwYWNlIHsKIAotZ3JwYzo6c3RyaW5nIEdlbmVyYXRlTWV0aG9kVHlwZShjb25zdCBncnBjX2dlbmVyYXRvcjo6TWV0aG9kICptZXRob2QpIHsKK3N0YXRpYyBncnBjOjpzdHJpbmcgR2VuZXJhdGVNZXRob2RUeXBlKGNvbnN0IGdycGNfZ2VuZXJhdG9yOjpNZXRob2QgKm1ldGhvZCkgewogCiAgIGlmIChtZXRob2QtPk5vU3RyZWFtaW5nKCkpCiAgICAgcmV0dXJuICJ1bmFyeV91bmFyeSI7CkBAIC0xMzEsNiArMTMyLDcgQEAKICAgcHJpbnRlci0+T3V0ZGVudCgpOwogICBwcmludGVyLT5QcmludCgiXG4iKTsKIH0KK30gLy8gbmFtZXNwYWNlCiAKIGdycGM6OnN0cmluZyBHZW5lcmF0ZShncnBjX2dlbmVyYXRvcjo6RmlsZSAqZmlsZSwKICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBncnBjX2dlbmVyYXRvcjo6U2VydmljZSAqc2VydmljZSkgewpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvZ3JwYy9zcmMvY29tcGlsZXIvc2NoZW1hX2ludGVyZmFjZS5oIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvZ3JwYy9zcmMvY29tcGlsZXIvc2NoZW1hX2ludGVyZmFjZS5oCmluZGV4IGU0MmUzZTMuLmY4OTI4OGQgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL2dycGMvc3JjL2NvbXBpbGVyL3NjaGVtYV9pbnRlcmZhY2UuaAorKysgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy9ncnBjL3NyYy9jb21waWxlci9zY2hlbWFfaW50ZXJmYWNlLmgKQEAgLTEwNyw4ICsxMDcsNiBAQAogICB2aXJ0dWFsIGdycGM6OnN0cmluZyBwYWNrYWdlKCkgY29uc3QgPSAwOwogICB2aXJ0dWFsIHN0ZDo6dmVjdG9yPGdycGM6OnN0cmluZz4gcGFja2FnZV9wYXJ0cygpIGNvbnN0ID0gMDsKICAgdmlydHVhbCBncnBjOjpzdHJpbmcgYWRkaXRpb25hbF9oZWFkZXJzKCkgY29uc3QgPSAwOwotICB2aXJ0dWFsIHN0ZDo6c3RyaW5nIG1lc3NhZ2VfaGVhZGVyX2V4dCgpIGNvbnN0ID0gMDsKLSAgdmlydHVhbCBzdGQ6OnN0cmluZyBzZXJ2aWNlX2hlYWRlcl9leHQoKSBjb25zdCA9IDA7CiAKICAgdmlydHVhbCBpbnQgc2VydmljZV9jb3VudCgpIGNvbnN0ID0gMDsKICAgdmlydHVhbCBzdGQ6OnVuaXF1ZV9wdHI8Y29uc3QgU2VydmljZT4gc2VydmljZShpbnQgaSkgY29uc3QgPSAwOwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvZ3JwYy9zcmMvY29tcGlsZXIvc3dpZnRfZ2VuZXJhdG9yLmNjIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvZ3JwYy9zcmMvY29tcGlsZXIvc3dpZnRfZ2VuZXJhdG9yLmNjCmluZGV4IDQwM2E4MDMuLmIwYTk2ZDggMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL2dycGMvc3JjL2NvbXBpbGVyL3N3aWZ0X2dlbmVyYXRvci5jYworKysgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy9ncnBjL3NyYy9jb21waWxlci9zd2lmdF9nZW5lcmF0b3IuY2MKQEAgLTI4LDggKzI4LDkgQEAKICNpbmNsdWRlICJzcmMvY29tcGlsZXIvc3dpZnRfZ2VuZXJhdG9yLmgiCiAKIG5hbWVzcGFjZSBncnBjX3N3aWZ0X2dlbmVyYXRvciB7CituYW1lc3BhY2UgewogCi1zdGQ6OnN0cmluZyBXcmFwSW5OYW1lU3BhY2UoY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+ICZjb21wb25lbnRzLAorc3RhdGljIHN0ZDo6c3RyaW5nIFdyYXBJbk5hbWVTcGFjZShjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gJmNvbXBvbmVudHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ3JwYzo6c3RyaW5nICZuYW1lKSB7CiAgIHN0ZDo6c3RyaW5nIHF1YWxpZmllZF9uYW1lOwogICBmb3IgKGF1dG8gaXQgPSBjb21wb25lbnRzLmJlZ2luKCk7IGl0ICE9IGNvbXBvbmVudHMuZW5kKCk7ICsraXQpCkBAIC0zNywxNCArMzgsMTQgQEAKICAgcmV0dXJuIHF1YWxpZmllZF9uYW1lICsgbmFtZTsKIH0KIAotZ3JwYzo6c3RyaW5nIEdlbmVyYXRlTWVzc2FnZShjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gJmNvbXBvbmVudHMsCitzdGF0aWMgZ3JwYzo6c3RyaW5nIEdlbmVyYXRlTWVzc2FnZShjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gJmNvbXBvbmVudHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGdycGM6OnN0cmluZyAmbmFtZSkgewogICByZXR1cm4gIk1lc3NhZ2U8IiArIFdyYXBJbk5hbWVTcGFjZShjb21wb25lbnRzLCBuYW1lKSArICI+IjsKIH0KIAogLy8gTUFSSzogLSBDbGllbnQKIAotdm9pZCBHZW5lcmF0ZUNsaWVudEZ1bmNOYW1lKGNvbnN0IGdycGNfZ2VuZXJhdG9yOjpNZXRob2QgKm1ldGhvZCwKK3N0YXRpYyB2b2lkIEdlbmVyYXRlQ2xpZW50RnVuY05hbWUoY29uc3QgZ3JwY19nZW5lcmF0b3I6Ok1ldGhvZCAqbWV0aG9kLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfZ2VuZXJhdG9yOjpQcmludGVyICpwcmludGVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWFwPGdycGM6OnN0cmluZywgZ3JwYzo6c3RyaW5nPiAqZGljdG9uYXJ5KSB7CiAgIGF1dG8gdmFycyA9ICpkaWN0b25hcnk7CkBAIC04Miw3ICs4Myw3IEBACiAgICAgICAgICAgICAgICAgICIgICkgLT4gQmlkaXJlY3Rpb25hbFN0cmVhbWluZ0NhbGw8JElucHV0JCwgJE91dHB1dCQ+Iik7CiB9CiAKLXZvaWQgR2VuZXJhdGVDbGllbnRGdW5jQm9keShjb25zdCBncnBjX2dlbmVyYXRvcjo6TWV0aG9kICptZXRob2QsCitzdGF0aWMgdm9pZCBHZW5lcmF0ZUNsaWVudEZ1bmNCb2R5KGNvbnN0IGdycGNfZ2VuZXJhdG9yOjpNZXRob2QgKm1ldGhvZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX2dlbmVyYXRvcjo6UHJpbnRlciAqcHJpbnRlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1hcDxncnBjOjpzdHJpbmcsIGdycGM6OnN0cmluZz4gKmRpY3RvbmFyeSkgewogICBhdXRvIHZhcnMgPSAqZGljdG9uYXJ5OwpAQCAtMzcyLDYgKzM3Myw3IEBACiAgIH0KICAgcHJpbnRlci0+UHJpbnQoIn0iKTsKIH0KK30gLy8gbmFtZXNwYWNlCiAKIGdycGM6OnN0cmluZyBHZW5lcmF0ZShncnBjX2dlbmVyYXRvcjo6RmlsZSAqZmlsZSwKICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBncnBjX2dlbmVyYXRvcjo6U2VydmljZSAqc2VydmljZSkgewpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvZ3JwYy9zcmMvY29tcGlsZXIvdHNfZ2VuZXJhdG9yLmNjIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvZ3JwYy9zcmMvY29tcGlsZXIvdHNfZ2VuZXJhdG9yLmNjCmluZGV4IDNjM2RhZjAuLmZmMzYyYjcgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL2dycGMvc3JjL2NvbXBpbGVyL3RzX2dlbmVyYXRvci5jYworKysgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy9ncnBjL3NyYy9jb21waWxlci90c19nZW5lcmF0b3IuY2MKQEAgLTMwLDggKzMwLDkgQEAKICNpbmNsdWRlICJzcmMvY29tcGlsZXIvc2NoZW1hX2ludGVyZmFjZS5oIgogCiBuYW1lc3BhY2UgZ3JwY190c19nZW5lcmF0b3IgeworbmFtZXNwYWNlIHsKIAotZ3JwYzo6c3RyaW5nIEdlbmVyYXRlTmFtZXNwYWNlKGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBucywKK3N0YXRpYyBncnBjOjpzdHJpbmcgR2VuZXJhdGVOYW1lc3BhY2UoY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IG5zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nIGZpbGVuYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJvb2wgaW5jbHVkZV9zZXBhcmF0b3IpIHsKICAgZ3JwYzo6c3RyaW5nIHBhdGggPSAiIjsKQEAgLTU1LDcgKzU2LDcgQEAKIAogLy8gTUFSSzogLSBTaGFyZWQgY29kZQogCi12b2lkIEdlbmVyYXRlSW1wb3J0cyhjb25zdCBncnBjX2dlbmVyYXRvcjo6U2VydmljZSAqc2VydmljZSwKK3N0YXRpYyB2b2lkIEdlbmVyYXRlSW1wb3J0cyhjb25zdCBncnBjX2dlbmVyYXRvcjo6U2VydmljZSAqc2VydmljZSwKICAgICAgICAgICAgICAgICAgICAgIGdycGNfZ2VuZXJhdG9yOjpQcmludGVyICpwcmludGVyLAogICAgICAgICAgICAgICAgICAgICAgc3RkOjptYXA8Z3JwYzo6c3RyaW5nLCBncnBjOjpzdHJpbmc+ICpkaWN0b25hcnksCiAgICAgICAgICAgICAgICAgICAgICBjb25zdCBib29sIGdycGNfdmFyX2ltcG9ydCkgewpAQCAtMTA0LDcgKzEwNSw3IEBACiAKIC8vIE1BUks6IC0gR2VuZXJhdGUgTWFpbiBHUlBDIENvZGUKIAotdm9pZCBHZXRTdHJlYW1UeXBlKGdycGNfZ2VuZXJhdG9yOjpQcmludGVyICpwcmludGVyLAorc3RhdGljIHZvaWQgR2V0U3RyZWFtVHlwZShncnBjX2dlbmVyYXRvcjo6UHJpbnRlciAqcHJpbnRlciwKICAgICAgICAgICAgICAgICAgICBjb25zdCBncnBjX2dlbmVyYXRvcjo6TWV0aG9kICptZXRob2QsCiAgICAgICAgICAgICAgICAgICAgc3RkOjptYXA8Z3JwYzo6c3RyaW5nLCBncnBjOjpzdHJpbmc+ICpkaWN0b25hcnkpIHsKICAgYXV0byB2YXJzID0gKmRpY3RvbmFyeTsKQEAgLTExNiw3ICsxMTcsNyBAQAogICBwcmludGVyLT5QcmludCh2YXJzLCAicmVzcG9uc2VTdHJlYW06ICRTZXJ2ZXJTdHJlYW1pbmckLFxuIik7CiB9CiAKLXZvaWQgR2VuZXJhdGVTZXJpYWxpemVNZXRob2QoZ3JwY19nZW5lcmF0b3I6OlByaW50ZXIgKnByaW50ZXIsCitzdGF0aWMgdm9pZCBHZW5lcmF0ZVNlcmlhbGl6ZU1ldGhvZChncnBjX2dlbmVyYXRvcjo6UHJpbnRlciAqcHJpbnRlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptYXA8Z3JwYzo6c3RyaW5nLCBncnBjOjpzdHJpbmc+ICpkaWN0b25hcnkpIHsKICAgYXV0byB2YXJzID0gKmRpY3RvbmFyeTsKICAgcHJpbnRlci0+UHJpbnQodmFycywgImZ1bmN0aW9uIHNlcmlhbGl6ZV8kVHlwZSQoYnVmZmVyX2FyZ3MpIHtcbiIpOwpAQCAtMTMyLDcgKzEzMyw3IEBACiAgIHByaW50ZXItPlByaW50KCJ9XG5cbiIpOwogfQogCi12b2lkIEdlbmVyYXRlRGVzZXJpYWxpemVNZXRob2QoCitzdGF0aWMgdm9pZCBHZW5lcmF0ZURlc2VyaWFsaXplTWV0aG9kKAogICAgIGdycGNfZ2VuZXJhdG9yOjpQcmludGVyICpwcmludGVyLAogICAgIHN0ZDo6bWFwPGdycGM6OnN0cmluZywgZ3JwYzo6c3RyaW5nPiAqZGljdG9uYXJ5KSB7CiAgIGF1dG8gdmFycyA9ICpkaWN0b25hcnk7CkBAIC0xNDUsNyArMTQ2LDcgQEAKICAgcHJpbnRlci0+UHJpbnQoIn1cblxuIik7CiB9CiAKLXZvaWQgR2VuZXJhdGVNZXRob2RzKGNvbnN0IGdycGNfZ2VuZXJhdG9yOjpTZXJ2aWNlICpzZXJ2aWNlLAorc3RhdGljIHZvaWQgR2VuZXJhdGVNZXRob2RzKGNvbnN0IGdycGNfZ2VuZXJhdG9yOjpTZXJ2aWNlICpzZXJ2aWNlLAogICAgICAgICAgICAgICAgICAgICAgZ3JwY19nZW5lcmF0b3I6OlByaW50ZXIgKnByaW50ZXIsCiAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1hcDxncnBjOjpzdHJpbmcsIGdycGM6OnN0cmluZz4gKmRpY3RvbmFyeSkgewogICBhdXRvIHZhcnMgPSAqZGljdG9uYXJ5OwpAQCAtMTc3LDcgKzE3OCw3IEBACiAgIH0KIH0KIAotdm9pZCBHZW5lcmF0ZVNlcnZpY2UoY29uc3QgZ3JwY19nZW5lcmF0b3I6OlNlcnZpY2UgKnNlcnZpY2UsCitzdGF0aWMgdm9pZCBHZW5lcmF0ZVNlcnZpY2UoY29uc3QgZ3JwY19nZW5lcmF0b3I6OlNlcnZpY2UgKnNlcnZpY2UsCiAgICAgICAgICAgICAgICAgICAgICBncnBjX2dlbmVyYXRvcjo6UHJpbnRlciAqcHJpbnRlciwKICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWFwPGdycGM6OnN0cmluZywgZ3JwYzo6c3RyaW5nPiAqZGljdG9uYXJ5KSB7CiAgIGF1dG8gdmFycyA9ICpkaWN0b25hcnk7CkBAIC0yMTIsNiArMjEzLDggQEAKICAgICAgICAgICAgICAgICAgImdycGMubWFrZUdlbmVyaWNDbGllbnRDb25zdHJ1Y3RvcigkTkFNRSQpOyIpOwogfQogCit9IC8vIG5hbWVzcGFjZQorCiBncnBjOjpzdHJpbmcgR2VuZXJhdGUoZ3JwY19nZW5lcmF0b3I6OkZpbGUgKmZpbGUsCiAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ3JwY19nZW5lcmF0b3I6OlNlcnZpY2UgKnNlcnZpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ3JwYzo6c3RyaW5nICZmaWxlbmFtZSkgewpAQCAtMjMzLDkgKzIzNiwxMSBAQAogICByZXR1cm4gb3V0cHV0OwogfQogCituYW1lc3BhY2UgeworCiAvLyBNQVJLOiAtIEdlbmVyYXRlIEludGVyZmFjZQogCi12b2lkIEZpbGxJbnRlcmZhY2UoZ3JwY19nZW5lcmF0b3I6OlByaW50ZXIgKnByaW50ZXIsCitzdGF0aWMgdm9pZCBGaWxsSW50ZXJmYWNlKGdycGNfZ2VuZXJhdG9yOjpQcmludGVyICpwcmludGVyLAogICAgICAgICAgICAgICAgICAgIHN0ZDo6bWFwPGdycGM6OnN0cmluZywgZ3JwYzo6c3RyaW5nPiAqZGljdG9uYXJ5KSB7CiAgIGF1dG8gdmFycyA9ICpkaWN0b25hcnk7CiAgIHByaW50ZXItPlByaW50KHZhcnMsCkBAIC0yNTMsNyArMjU4LDcgQEAKICAgcHJpbnRlci0+UHJpbnQoIn1cbiIpOwogfQogCi12b2lkIEdlbmVyYXRlSW50ZXJmYWNlcyhjb25zdCBncnBjX2dlbmVyYXRvcjo6U2VydmljZSAqc2VydmljZSwKK3N0YXRpYyB2b2lkIEdlbmVyYXRlSW50ZXJmYWNlcyhjb25zdCBncnBjX2dlbmVyYXRvcjo6U2VydmljZSAqc2VydmljZSwKICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfZ2VuZXJhdG9yOjpQcmludGVyICpwcmludGVyLAogICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptYXA8Z3JwYzo6c3RyaW5nLCBncnBjOjpzdHJpbmc+ICpkaWN0b25hcnkpIHsKICAgYXV0byB2YXJzID0gKmRpY3RvbmFyeTsKQEAgLTI3NSw3ICsyODAsNyBAQAogICB9CiB9CiAKLXZvaWQgR2VuZXJhdGVFeHBvcnRlZEludGVyZmFjZSgKK3N0YXRpYyB2b2lkIEdlbmVyYXRlRXhwb3J0ZWRJbnRlcmZhY2UoCiAgICAgY29uc3QgZ3JwY19nZW5lcmF0b3I6OlNlcnZpY2UgKnNlcnZpY2UsIGdycGNfZ2VuZXJhdG9yOjpQcmludGVyICpwcmludGVyLAogICAgIHN0ZDo6bWFwPGdycGM6OnN0cmluZywgZ3JwYzo6c3RyaW5nPiAqZGljdG9uYXJ5KSB7CiAgIGF1dG8gdmFycyA9ICpkaWN0b25hcnk7CkBAIC0zMTksNyArMzI0LDcgQEAKICAgcHJpbnRlci0+UHJpbnQoIn1cbiIpOwogfQogCi12b2lkIEdlbmVyYXRlTWFpbkludGVyZmFjZShjb25zdCBncnBjX2dlbmVyYXRvcjo6U2VydmljZSAqc2VydmljZSwKK3N0YXRpYyB2b2lkIEdlbmVyYXRlTWFpbkludGVyZmFjZShjb25zdCBncnBjX2dlbmVyYXRvcjo6U2VydmljZSAqc2VydmljZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfZ2VuZXJhdG9yOjpQcmludGVyICpwcmludGVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptYXA8Z3JwYzo6c3RyaW5nLCBncnBjOjpzdHJpbmc+ICpkaWN0b25hcnkpIHsKICAgYXV0byB2YXJzID0gKmRpY3RvbmFyeTsKQEAgLTM0NCwxMSArMzQ5LDExIEBACiAgIEdlbmVyYXRlRXhwb3J0ZWRJbnRlcmZhY2Uoc2VydmljZSwgcHJpbnRlciwgJnZhcnMpOwogfQogCi1ncnBjOjpzdHJpbmcgR2VuZXJhdGVNZXRhRGF0YSgpIHsgcmV0dXJuICJtZXRhZGF0YTogZ3JwYy5NZXRhZGF0YSI7IH0KK3N0YXRpYyBncnBjOjpzdHJpbmcgR2VuZXJhdGVNZXRhRGF0YSgpIHsgcmV0dXJuICJtZXRhZGF0YTogZ3JwYy5NZXRhZGF0YSI7IH0KIAotZ3JwYzo6c3RyaW5nIEdlbmVyYXRlT3B0aW9ucygpIHsgcmV0dXJuICJvcHRpb25zOiBQYXJ0aWFsPGdycGMuQ2FsbE9wdGlvbnM+IjsgfQorc3RhdGljIGdycGM6OnN0cmluZyBHZW5lcmF0ZU9wdGlvbnMoKSB7IHJldHVybiAib3B0aW9uczogUGFydGlhbDxncnBjLkNhbGxPcHRpb25zPiI7IH0KIAotdm9pZCBHZW5lcmF0ZVVuYXJ5Q2xpZW50SW50ZXJmYWNlKAorc3RhdGljIHZvaWQgR2VuZXJhdGVVbmFyeUNsaWVudEludGVyZmFjZSgKICAgICBncnBjX2dlbmVyYXRvcjo6UHJpbnRlciAqcHJpbnRlciwKICAgICBzdGQ6Om1hcDxncnBjOjpzdHJpbmcsIGdycGM6OnN0cmluZz4gKmRpY3RvbmFyeSkgewogICBhdXRvIHZhcnMgPSAqZGljdG9uYXJ5OwpAQCAtMzYzLDcgKzM2OCw3IEBACiAgIHByaW50ZXItPlByaW50KHZhcnMsIChtYWluICsgbWV0YV9kYXRhICsgb3B0aW9ucyArIGNhbGxiYWNrKS5jX3N0cigpKTsKIH0KIAotdm9pZCBHZW5lcmF0ZUNsaWVudFdyaXRlU3RyZWFtSW50ZXJmYWNlKAorc3RhdGljIHZvaWQgR2VuZXJhdGVDbGllbnRXcml0ZVN0cmVhbUludGVyZmFjZSgKICAgICBncnBjX2dlbmVyYXRvcjo6UHJpbnRlciAqcHJpbnRlciwKICAgICBzdGQ6Om1hcDxncnBjOjpzdHJpbmcsIGdycGM6OnN0cmluZz4gKmRpY3RvbmFyeSkgewogICBhdXRvIHZhcnMgPSAqZGljdG9uYXJ5OwpAQCAtMzgwLDcgKzM4NSw3IEBACiAgIHByaW50ZXItPlByaW50KHZhcnMsIChtYWluICsgbWV0YV9kYXRhICsgb3B0aW9ucyArIGNhbGxiYWNrKS5jX3N0cigpKTsKIH0KIAotdm9pZCBHZW5lcmF0ZUNsaWVudFJlYWRhYmxlU3RyZWFtSW50ZXJmYWNlKAorc3RhdGljIHZvaWQgR2VuZXJhdGVDbGllbnRSZWFkYWJsZVN0cmVhbUludGVyZmFjZSgKICAgICBncnBjX2dlbmVyYXRvcjo6UHJpbnRlciAqcHJpbnRlciwKICAgICBzdGQ6Om1hcDxncnBjOjpzdHJpbmcsIGdycGM6OnN0cmluZz4gKmRpY3RvbmFyeSkgewogICBhdXRvIHZhcnMgPSAqZGljdG9uYXJ5OwpAQCAtMzkyLDcgKzM5Nyw3IEBACiAgIHByaW50ZXItPlByaW50KHZhcnMsIChtYWluICsgb3B0aW9ucyArIGVuZF9mdW5jdGlvbikuY19zdHIoKSk7CiB9CiAKLXZvaWQgR2VuZXJhdGVEZXBsdXhTdHJlYW1JbnRlcmZhY2UoCitzdGF0aWMgdm9pZCBHZW5lcmF0ZURlcGx1eFN0cmVhbUludGVyZmFjZSgKICAgICBncnBjX2dlbmVyYXRvcjo6UHJpbnRlciAqcHJpbnRlciwKICAgICBzdGQ6Om1hcDxncnBjOjpzdHJpbmcsIGdycGM6OnN0cmluZz4gKmRpY3RvbmFyeSkgewogICBhdXRvIHZhcnMgPSAqZGljdG9uYXJ5OwpAQCAtNDA4LDcgKzQxMyw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY19zdHIoKSk7CiB9CiAKLXZvaWQgR2VuZXJhdGVDbGllbnRJbnRlcmZhY2UoY29uc3QgZ3JwY19nZW5lcmF0b3I6OlNlcnZpY2UgKnNlcnZpY2UsCitzdGF0aWMgdm9pZCBHZW5lcmF0ZUNsaWVudEludGVyZmFjZShjb25zdCBncnBjX2dlbmVyYXRvcjo6U2VydmljZSAqc2VydmljZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19nZW5lcmF0b3I6OlByaW50ZXIgKnByaW50ZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWFwPGdycGM6OnN0cmluZywgZ3JwYzo6c3RyaW5nPiAqZGljdG9uYXJ5KSB7CiAgIGF1dG8gdmFycyA9ICpkaWN0b25hcnk7CkBAIC00NDYsNyArNDUxLDcgQEAKICAgcHJpbnRlci0+UHJpbnQoIn1cbiIpOwogfQogCi12b2lkIEdlbmVyYXRlQ2xpZW50Q2xhc3NJbnRlcmZhY2UoCitzdGF0aWMgdm9pZCBHZW5lcmF0ZUNsaWVudENsYXNzSW50ZXJmYWNlKAogICAgIGNvbnN0IGdycGNfZ2VuZXJhdG9yOjpTZXJ2aWNlICpzZXJ2aWNlLCBncnBjX2dlbmVyYXRvcjo6UHJpbnRlciAqcHJpbnRlciwKICAgICBzdGQ6Om1hcDxncnBjOjpzdHJpbmcsIGdycGM6OnN0cmluZz4gKmRpY3RvbmFyeSkgewogICBhdXRvIHZhcnMgPSAqZGljdG9uYXJ5OwpAQCAtNDg3LDYgKzQ5Miw4IEBACiAgIHByaW50ZXItPk91dGRlbnQoKTsKICAgcHJpbnRlci0+UHJpbnQoIn1cbiIpOwogfQorfSAvLyBuYW1lc3BhY2UKKwogCiBncnBjOjpzdHJpbmcgR2VuZXJhdGVJbnRlcmZhY2UoZ3JwY19nZW5lcmF0b3I6OkZpbGUgKmZpbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ3JwY19nZW5lcmF0b3I6OlNlcnZpY2UgKnNlcnZpY2UsCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy9pbmNsdWRlL2ZsYXRidWZmZXJzL2Jhc2UuaCBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL2luY2x1ZGUvZmxhdGJ1ZmZlcnMvYmFzZS5oCmluZGV4IDQ1OGFjM2YuLjg3MGE4MTEgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL2luY2x1ZGUvZmxhdGJ1ZmZlcnMvYmFzZS5oCisrKyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL2luY2x1ZGUvZmxhdGJ1ZmZlcnMvYmFzZS5oCkBAIC0xNDAsNyArMTQwLDcgQEAKIAogI2RlZmluZSBGTEFUQlVGRkVSU19WRVJTSU9OX01BSk9SIDIKICNkZWZpbmUgRkxBVEJVRkZFUlNfVkVSU0lPTl9NSU5PUiAwCi0jZGVmaW5lIEZMQVRCVUZGRVJTX1ZFUlNJT05fUkVWSVNJT04gNgorI2RlZmluZSBGTEFUQlVGRkVSU19WRVJTSU9OX1JFVklTSU9OIDgKICNkZWZpbmUgRkxBVEJVRkZFUlNfU1RSSU5HX0VYUEFORChYKSAjWAogI2RlZmluZSBGTEFUQlVGRkVSU19TVFJJTkcoWCkgRkxBVEJVRkZFUlNfU1RSSU5HX0VYUEFORChYKQogbmFtZXNwYWNlIGZsYXRidWZmZXJzIHsKQEAgLTI2MCw5ICsyNjAsMTIgQEAKICNlbmRpZiAvLyAhRkxBVEJVRkZFUlNfSEFTX05FV19TVFJUT0QKIAogI2lmbmRlZiBGTEFUQlVGRkVSU19MT0NBTEVfSU5ERVBFTkRFTlQKLSAgLy8gRW5hYmxlIGxvY2FsZSBpbmRlcGVuZGVudCBmdW5jdGlvbnMge3N0cnRvZl9sLCBzdHJ0b2RfbCxzdHJ0b2xsX2wsIHN0cnRvdWxsX2x9LgotICAjaWYgKChkZWZpbmVkKF9NU0NfVkVSKSAmJiBfTVNDX1ZFUiA+PSAxODAwKSAgICAgICAgICAgIHx8IFwKLSAgICAgICAoZGVmaW5lZChfWE9QRU5fVkVSU0lPTikgJiYgKF9YT1BFTl9WRVJTSU9OPj03MDApKSAmJiAoIWRlZmluZWQoX19BTkRST0lEX0FQSV9fKSB8fCAoZGVmaW5lZChfX0FORFJPSURfQVBJX18pICYmIChfX0FORFJPSURfQVBJX18+PTIxKSkpKQorICAvLyBFbmFibGUgbG9jYWxlIGluZGVwZW5kZW50IGZ1bmN0aW9ucyB7c3RydG9mX2wsIHN0cnRvZF9sLHN0cnRvbGxfbCwKKyAgLy8gc3RydG91bGxfbH0uCisgICNpZiAoZGVmaW5lZChfTVNDX1ZFUikgJiYgX01TQ19WRVIgPj0gMTgwMCkgfHwgXAorICAgICAgKGRlZmluZWQoX19BTkRST0lEX0FQSV9fKSAmJiBfX0FORFJPSURfQVBJX18+PSAyMSkgfHwgXAorICAgICAgKGRlZmluZWQoX1hPUEVOX1ZFUlNJT04pICYmIChfWE9QRU5fVkVSU0lPTiA+PSA3MDApKSAmJiBcCisgICAgICAgICghZGVmaW5lZChfX0Z1Y2hzaWFfXykgJiYgIWRlZmluZWQoX19BTkRST0lEX0FQSV9fKSkKICAgICAjZGVmaW5lIEZMQVRCVUZGRVJTX0xPQ0FMRV9JTkRFUEVOREVOVCAxCiAgICNlbHNlCiAgICAgI2RlZmluZSBGTEFUQlVGRkVSU19MT0NBTEVfSU5ERVBFTkRFTlQgMApAQCAtMjcwLDE0ICsyNzMsMTQgQEAKICNlbmRpZiAgLy8gIUZMQVRCVUZGRVJTX0xPQ0FMRV9JTkRFUEVOREVOVAogCiAvLyBTdXBwcmVzcyBVbmRlZmluZWQgQmVoYXZpb3IgU2FuaXRpemVyIChyZWNvdmVyYWJsZSBvbmx5KS4gVXNhZ2U6Ci0vLyAtIF9fc3VwcmVzc191YnNhbl9fKCJ1bmRlZmluZWQiKQotLy8gLSBfX3N1cHJlc3NfdWJzYW5fXygic2lnbmVkLWludGVnZXItb3ZlcmZsb3ciKQorLy8gLSBfX3N1cHByZXNzX3Vic2FuX18oInVuZGVmaW5lZCIpCisvLyAtIF9fc3VwcHJlc3NfdWJzYW5fXygic2lnbmVkLWludGVnZXItb3ZlcmZsb3ciKQogI2lmIGRlZmluZWQoX19jbGFuZ19fKSAmJiAoX19jbGFuZ19tYWpvcl9fID4gMyB8fCAoX19jbGFuZ19tYWpvcl9fID09IDMgJiYgX19jbGFuZ19taW5vcl9fID49NykpCi0gICNkZWZpbmUgX19zdXByZXNzX3Vic2FuX18odHlwZSkgX19hdHRyaWJ1dGVfXygobm9fc2FuaXRpemUodHlwZSkpKQorICAjZGVmaW5lIF9fc3VwcHJlc3NfdWJzYW5fXyh0eXBlKSBfX2F0dHJpYnV0ZV9fKChub19zYW5pdGl6ZSh0eXBlKSkpCiAjZWxpZiBkZWZpbmVkKF9fR05VQ19fKSAmJiAoX19HTlVDX18gKiAxMDAgKyBfX0dOVUNfTUlOT1JfXyA+PSA0MDkpCi0gICNkZWZpbmUgX19zdXByZXNzX3Vic2FuX18odHlwZSkgX19hdHRyaWJ1dGVfXygobm9fc2FuaXRpemVfdW5kZWZpbmVkKSkKKyAgI2RlZmluZSBfX3N1cHByZXNzX3Vic2FuX18odHlwZSkgX19hdHRyaWJ1dGVfXygobm9fc2FuaXRpemVfdW5kZWZpbmVkKSkKICNlbHNlCi0gICNkZWZpbmUgX19zdXByZXNzX3Vic2FuX18odHlwZSkKKyAgI2RlZmluZSBfX3N1cHByZXNzX3Vic2FuX18odHlwZSkKICNlbmRpZgogCiAvLyBUaGlzIGlzIGNvbnN0ZXhwciBmdW5jdGlvbiB1c2VkIGZvciBjaGVja2luZyBjb21waWxlLXRpbWUgY29uc3RhbnRzLgpAQCAtMzI4LDggKzMzMSwxNyBAQAogLy8gSW4gMzJiaXRzLCB0aGlzIGV2YWx1YXRlcyB0byAyR0IgLSAxCiAjZGVmaW5lIEZMQVRCVUZGRVJTX01BWF9CVUZGRVJfU0laRSAoKDFVTEwgPDwgKHNpemVvZig6OmZsYXRidWZmZXJzOjpzb2Zmc2V0X3QpICogOCAtIDEpKSAtIDEpCiAKKy8vIFRoZSBtaW5pbXVtIHNpemUgYnVmZmVyIHRoYXQgY2FuIGJlIGEgdmFsaWQgZmxhdGJ1ZmZlci4KKy8vIEluY2x1ZGVzIHRoZSBvZmZzZXQgdG8gdGhlIHJvb3QgdGFibGUgKHVvZmZzZXRfdCksIHRoZSBvZmZzZXQgdG8gdGhlIHZ0YWJsZQorLy8gb2YgdGhlIHJvb3QgdGFibGUgKHNvZmZzZXRfdCksIHRoZSBzaXplIG9mIHRoZSB2dGFibGUgKHVpbnQxNl90KSwgYW5kIHRoZQorLy8gc2l6ZSBvZiB0aGUgcmVmZXJyaW5nIHRhYmxlICh1aW50MTZfdCkuCisjZGVmaW5lIEZMQVRCVUZGRVJTX01JTl9CVUZGRVJfU0laRSBzaXplb2YodW9mZnNldF90KSArIHNpemVvZihzb2Zmc2V0X3QpICsgXAorICAgc2l6ZW9mKHVpbnQxNl90KSArIHNpemVvZih1aW50MTZfdCkKKwogLy8gV2Ugc3VwcG9ydCBhbGlnbmluZyB0aGUgY29udGVudHMgb2YgYnVmZmVycyB1cCB0byB0aGlzIHNpemUuCi0jZGVmaW5lIEZMQVRCVUZGRVJTX01BWF9BTElHTk1FTlQgMTYKKyNpZm5kZWYgRkxBVEJVRkZFUlNfTUFYX0FMSUdOTUVOVAorICAjZGVmaW5lIEZMQVRCVUZGRVJTX01BWF9BTElHTk1FTlQgMzIKKyNlbmRpZgogCiAvLy8gQGJyaWVmIFRoZSBsZW5ndGggb2YgYSBGbGF0QnVmZmVyIGZpbGUgaGVhZGVyLgogc3RhdGljIGNvbnN0IHNpemVfdCBrRmlsZUlkZW50aWZpZXJMZW5ndGggPSA0OwpAQCAtNDAxLDcgKzQxMyw3IEBACiAKIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CiAvLyBVQlNBTjogQysrIGFsaWFzaW5nIHR5cGUgcnVsZXMsIHNlZSBzdGQ6OmJpdF9jYXN0PD4gZm9yIGRldGFpbHMuCi1fX3N1cHJlc3NfdWJzYW5fXygiYWxpZ25tZW50IikKK19fc3VwcHJlc3NfdWJzYW5fXygiYWxpZ25tZW50IikKIFQgUmVhZFNjYWxhcihjb25zdCB2b2lkICpwKSB7CiAgIHJldHVybiBFbmRpYW5TY2FsYXIoKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVCAqPihwKSk7CiB9CkBAIC00MTUsMTMgKzQyNywxMyBAQAogCiB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgogLy8gVUJTQU46IEMrKyBhbGlhc2luZyB0eXBlIHJ1bGVzLCBzZWUgc3RkOjpiaXRfY2FzdDw+IGZvciBkZXRhaWxzLgotX19zdXByZXNzX3Vic2FuX18oImFsaWdubWVudCIpCitfX3N1cHByZXNzX3Vic2FuX18oImFsaWdubWVudCIpCiB2b2lkIFdyaXRlU2NhbGFyKHZvaWQgKnAsIFQgdCkgewogICAqcmVpbnRlcnByZXRfY2FzdDxUICo+KHApID0gRW5kaWFuU2NhbGFyKHQpOwogfQogCiB0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBzdHJ1Y3QgT2Zmc2V0OwotdGVtcGxhdGU8dHlwZW5hbWUgVD4gX19zdXByZXNzX3Vic2FuX18oImFsaWdubWVudCIpIHZvaWQgV3JpdGVTY2FsYXIodm9pZCAqcCwgT2Zmc2V0PFQ+IHQpIHsKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+IF9fc3VwcHJlc3NfdWJzYW5fXygiYWxpZ25tZW50Iikgdm9pZCBXcml0ZVNjYWxhcih2b2lkICpwLCBPZmZzZXQ8VD4gdCkgewogICAqcmVpbnRlcnByZXRfY2FzdDx1b2Zmc2V0X3QgKj4ocCkgPSBFbmRpYW5TY2FsYXIodC5vKTsKIH0KIApAQCAtNDMyLDcgKzQ0NCw3IEBACiAvLyBDb21wdXRlcyBob3cgbWFueSBieXRlcyB5b3UnZCBoYXZlIHRvIHBhZCB0byBiZSBhYmxlIHRvIHdyaXRlIGFuCiAvLyAic2NhbGFyX3NpemUiIHNjYWxhciBpZiB0aGUgYnVmZmVyIGhhZCBncm93biB0byAiYnVmX3NpemUiIChkb3dud2FyZHMgaW4KIC8vIG1lbW9yeSkuCi1fX3N1cHJlc3NfdWJzYW5fXygidW5zaWduZWQtaW50ZWdlci1vdmVyZmxvdyIpCitfX3N1cHByZXNzX3Vic2FuX18oInVuc2lnbmVkLWludGVnZXItb3ZlcmZsb3ciKQogaW5saW5lIHNpemVfdCBQYWRkaW5nQnl0ZXMoc2l6ZV90IGJ1Zl9zaXplLCBzaXplX3Qgc2NhbGFyX3NpemUpIHsKICAgcmV0dXJuICgofmJ1Zl9zaXplKSArIDEpICYgKHNjYWxhcl9zaXplIC0gMSk7CiB9CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy9pbmNsdWRlL2ZsYXRidWZmZXJzL2J1ZmZlci5oIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvaW5jbHVkZS9mbGF0YnVmZmVycy9idWZmZXIuaAppbmRleCBlOGQyY2U5Li5jYTAwNWY3IDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy9pbmNsdWRlL2ZsYXRidWZmZXJzL2J1ZmZlci5oCisrKyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL2luY2x1ZGUvZmxhdGJ1ZmZlcnMvYnVmZmVyLmgKQEAgLTk1LDcgKzk1LDcgQEAKICAgfQogfTsKIAotLy8vIEBicmllZiBHZXQgYSBwb2ludGVyIHRvIHRoZSB0aGUgZmlsZV9pZGVudGlmaWVyIHNlY3Rpb24gb2YgdGhlIGJ1ZmZlci4KKy8vLyBAYnJpZWYgR2V0IGEgcG9pbnRlciB0byB0aGUgZmlsZV9pZGVudGlmaWVyIHNlY3Rpb24gb2YgdGhlIGJ1ZmZlci4KIC8vLyBAcmV0dXJuIFJldHVybnMgYSBjb25zdCBjaGFyIHBvaW50ZXIgdG8gdGhlIHN0YXJ0IG9mIHRoZSBmaWxlX2lkZW50aWZpZXIKIC8vLyBjaGFyYWN0ZXJzIGluIHRoZSBidWZmZXIuICBUaGUgcmV0dXJuZWQgY2hhciAqIGhhcyBsZW5ndGgKIC8vLyAnZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyOjprRmlsZUlkZW50aWZpZXJMZW5ndGgnLgpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvaW5jbHVkZS9mbGF0YnVmZmVycy9jb2RlX2dlbmVyYXRvcnMuaCBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL2luY2x1ZGUvZmxhdGJ1ZmZlcnMvY29kZV9nZW5lcmF0b3JzLmgKaW5kZXggMjY0M2QyZS4uMzJhMTUzZSAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvaW5jbHVkZS9mbGF0YnVmZmVycy9jb2RlX2dlbmVyYXRvcnMuaAorKysgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy9pbmNsdWRlL2ZsYXRidWZmZXJzL2NvZGVfZ2VuZXJhdG9ycy5oCkBAIC0xNDEsNyArMTQxLDkgQEAKICAgc3RkOjpzdHJpbmcgV3JhcEluTmFtZVNwYWNlKGNvbnN0IE5hbWVzcGFjZSAqbnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyAmbmFtZSwgYm9vbCBqc190cyA9IGZhbHNlKSBjb25zdDsKIAotICBzdGQ6OnN0cmluZyBXcmFwSW5OYW1lU3BhY2UoY29uc3QgRGVmaW5pdGlvbiAmZGVmLCBib29sIGpzX3RzID0gZmFsc2UpIGNvbnN0OworICBzdGQ6OnN0cmluZyBXcmFwSW5OYW1lU3BhY2UoY29uc3QgRGVmaW5pdGlvbiAmZGVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgJnN1ZmZpeCA9ICIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBqc190cyA9IGZhbHNlKSBjb25zdDsKIAogICBzdGQ6OnN0cmluZyBHZXROYW1lU3BhY2UoY29uc3QgRGVmaW5pdGlvbiAmZGVmKSBjb25zdDsKIApkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvaW5jbHVkZS9mbGF0YnVmZmVycy9mbGF0YnVmZmVyX2J1aWxkZXIuaCBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL2luY2x1ZGUvZmxhdGJ1ZmZlcnMvZmxhdGJ1ZmZlcl9idWlsZGVyLmgKaW5kZXggYzAzOWRhYS4uZDVjYWM3NCAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvaW5jbHVkZS9mbGF0YnVmZmVycy9mbGF0YnVmZmVyX2J1aWxkZXIuaAorKysgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy9pbmNsdWRlL2ZsYXRidWZmZXJzL2ZsYXRidWZmZXJfYnVpbGRlci5oCkBAIC0xOCw2ICsxOCw3IEBACiAjZGVmaW5lIEZMQVRCVUZGRVJTX0ZMQVRCVUZGRVJfQlVJTERFUl9IXwogCiAjaW5jbHVkZSA8ZnVuY3Rpb25hbD4KKyNpbmNsdWRlIDxpbml0aWFsaXplcl9saXN0PgogCiAjaW5jbHVkZSAiZmxhdGJ1ZmZlcnMvYWxsb2NhdG9yLmgiCiAjaW5jbHVkZSAiZmxhdGJ1ZmZlcnMvYXJyYXkuaCIKQEAgLTM1Nyw3ICszNTgsNyBAQAogICAgIC8vIElmIHlvdSBnZXQgdGhpcyBhc3NlcnQsIGEgY29ycmVzcG9uZGluZyBTdGFydFRhYmxlIHdhc24ndCBjYWxsZWQuCiAgICAgRkxBVEJVRkZFUlNfQVNTRVJUKG5lc3RlZCk7CiAgICAgLy8gV3JpdGUgdGhlIHZ0YWJsZSBvZmZzZXQsIHdoaWNoIGlzIHRoZSBzdGFydCBvZiBhbnkgVGFibGUuCi0gICAgLy8gV2UgZmlsbCBpdCdzIHZhbHVlIGxhdGVyLgorICAgIC8vIFdlIGZpbGwgaXRzIHZhbHVlIGxhdGVyLgogICAgIGF1dG8gdnRhYmxlb2Zmc2V0bG9jID0gUHVzaEVsZW1lbnQ8c29mZnNldF90PigwKTsKICAgICAvLyBXcml0ZSBhIHZ0YWJsZSwgd2hpY2ggY29uc2lzdHMgZW50aXJlbHkgb2Ygdm9mZnNldF90IGVsZW1lbnRzLgogICAgIC8vIEl0IHN0YXJ0cyB3aXRoIHRoZSBudW1iZXIgb2Ygb2Zmc2V0cywgZm9sbG93ZWQgYnkgYSB0eXBlIGlkLCBmb2xsb3dlZApAQCAtNDQyLDYgKzQ0Myw3IEBACiAgIC8vIEFsaWducyBzdWNoIHRoYXQgd2hlbiAibGVuIiBieXRlcyBhcmUgd3JpdHRlbiwgYW4gb2JqZWN0IGNhbiBiZSB3cml0dGVuCiAgIC8vIGFmdGVyIGl0IHdpdGggImFsaWdubWVudCIgd2l0aG91dCBwYWRkaW5nLgogICB2b2lkIFByZUFsaWduKHNpemVfdCBsZW4sIHNpemVfdCBhbGlnbm1lbnQpIHsKKyAgICBpZiAobGVuID09IDApIHJldHVybjsKICAgICBUcmFja01pbkFsaWduKGFsaWdubWVudCk7CiAgICAgYnVmXy5maWxsKFBhZGRpbmdCeXRlcyhHZXRTaXplKCkgKyBsZW4sIGFsaWdubWVudCkpOwogICB9CkBAIC01NzcsNyArNTc5LDcgQEAKICAgLy8vIEBwYXJhbVtpbl0gc3RyIEEgY29uc3QgcG9pbnRlciB0byBhIGBTdHJpbmdgIHN0cnVjdCB0byBhZGQgdG8gdGhlIGJ1ZmZlci4KICAgLy8vIEByZXR1cm4gUmV0dXJucyB0aGUgb2Zmc2V0IGluIHRoZSBidWZmZXIgd2hlcmUgdGhlIHN0cmluZyBzdGFydHMKICAgT2Zmc2V0PFN0cmluZz4gQ3JlYXRlU2hhcmVkU3RyaW5nKGNvbnN0IFN0cmluZyAqc3RyKSB7Ci0gICAgcmV0dXJuIENyZWF0ZVNoYXJlZFN0cmluZyhzdHItPmNfc3RyKCksIHN0ci0+c2l6ZSgpKTsKKyAgICByZXR1cm4gc3RyID8gQ3JlYXRlU2hhcmVkU3RyaW5nKHN0ci0+Y19zdHIoKSwgc3RyLT5zaXplKCkpIDogMDsKICAgfQogCiAgIC8vLyBAY29uZCBGTEFUQlVGRkVSU19JTlRFUk5BTApAQCAtNjAwLDEyICs2MDIsMTQgQEAKICAgLy8gVGhpcyBpcyB1c2VmdWwgd2hlbiBzdG9yaW5nIGEgbmVzdGVkX2ZsYXRidWZmZXIgaW4gYSB2ZWN0b3Igb2YgYnl0ZXMsCiAgIC8vIG9yIHdoZW4gc3RvcmluZyBTSU1EIGZsb2F0cywgZXRjLgogICB2b2lkIEZvcmNlVmVjdG9yQWxpZ25tZW50KHNpemVfdCBsZW4sIHNpemVfdCBlbGVtc2l6ZSwgc2l6ZV90IGFsaWdubWVudCkgeworICAgIGlmIChsZW4gPT0gMCkgcmV0dXJuOwogICAgIEZMQVRCVUZGRVJTX0FTU0VSVChWZXJpZnlBbGlnbm1lbnRSZXF1aXJlbWVudHMoYWxpZ25tZW50KSk7CiAgICAgUHJlQWxpZ24obGVuICogZWxlbXNpemUsIGFsaWdubWVudCk7CiAgIH0KIAogICAvLyBTaW1pbGFyIHRvIEZvcmNlVmVjdG9yQWxpZ25tZW50IGJ1dCBmb3IgU3RyaW5nIGZpZWxkcy4KICAgdm9pZCBGb3JjZVN0cmluZ0FsaWdubWVudChzaXplX3QgbGVuLCBzaXplX3QgYWxpZ25tZW50KSB7CisgICAgaWYgKGxlbiA9PSAwKSByZXR1cm47CiAgICAgRkxBVEJVRkZFUlNfQVNTRVJUKFZlcmlmeUFsaWdubWVudFJlcXVpcmVtZW50cyhhbGlnbm1lbnQpKTsKICAgICBQcmVBbGlnbigobGVuICsgMSkgKiBzaXplb2YoY2hhciksIGFsaWdubWVudCk7CiAgIH0KQEAgLTY1Miw2ICs2NTYsMTYgQEAKICAgICByZXR1cm4gQ3JlYXRlVmVjdG9yKGFycmF5LmRhdGEoKSwgYXJyYXkuc2l6ZSgpKTsKICAgfQogCisgIC8vLyBAYnJpZWYgU2VyaWFsaXplIGFuIGluaXRpYWxpemVyIGxpc3QgaW50byBhIEZsYXRCdWZmZXIgYHZlY3RvcmAuCisgIC8vLyBAdHBhcmFtIFQgVGhlIGRhdGEgdHlwZSBvZiB0aGUgaW5pdGlhbGl6ZXIgbGlzdCBlbGVtZW50cy4KKyAgLy8vIEBwYXJhbVtpbl0gdiBUaGUgdmFsdWUgb2YgdGhlIGluaXRpYWxpemVyIGxpc3QuCisgIC8vLyBAcmV0dXJuIFJldHVybnMgYSB0eXBlZCBgT2Zmc2V0YCBpbnRvIHRoZSBzZXJpYWxpemVkIGRhdGEgaW5kaWNhdGluZworICAvLy8gd2hlcmUgdGhlIHZlY3RvciBpcyBzdG9yZWQuCisgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgIE9mZnNldDxWZWN0b3I8VD4+IENyZWF0ZVZlY3RvcihzdGQ6OmluaXRpYWxpemVyX2xpc3Q8VD4gdikgeworICAgIHJldHVybiBDcmVhdGVWZWN0b3Iodi5iZWdpbigpLCB2LnNpemUoKSk7CisgIH0KKwogICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgogICBPZmZzZXQ8VmVjdG9yPE9mZnNldDxUPj4+IENyZWF0ZVZlY3Rvcihjb25zdCBPZmZzZXQ8VD4gKnYsIHNpemVfdCBsZW4pIHsKICAgICBTdGFydFZlY3RvcihsZW4sIHNpemVvZihPZmZzZXQ8VD4pKTsKQEAgLTcxNiwyMSArNzMwLDI0IEBACiAgICAgcmV0dXJuIENyZWF0ZVZlY3RvcihlbGVtcyk7CiAgIH0KIAotICAvLy8gQGJyaWVmIFNlcmlhbGl6ZSBhIGBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz5gIGludG8gYSBGbGF0QnVmZmVyIGB2ZWN0b3JgLgorICAvLy8gQGJyaWVmIFNlcmlhbGl6ZSBhIGBzdGQ6OnZlY3RvcjxTdHJpbmdUeXBlPmAgaW50byBhIEZsYXRCdWZmZXIgYHZlY3RvcmAuCisgIC8vLyB3aGVyZWFzIFN0cmluZ1R5cGUgaXMgYW55IHR5cGUgdGhhdCBpcyBhY2NlcHRlZCBieSB0aGUgQ3JlYXRlU3RyaW5nKCkKKyAgLy8vIG92ZXJsb2Fkcy4KICAgLy8vIFRoaXMgaXMgYSBjb252ZW5pZW5jZSBmdW5jdGlvbiBmb3IgYSBjb21tb24gY2FzZS4KICAgLy8vIEBwYXJhbSB2IEEgY29uc3QgcmVmZXJlbmNlIHRvIHRoZSBgc3RkOjp2ZWN0b3JgIHRvIHNlcmlhbGl6ZSBpbnRvIHRoZQogICAvLy8gYnVmZmVyIGFzIGEgYHZlY3RvcmAuCiAgIC8vLyBAcmV0dXJuIFJldHVybnMgYSB0eXBlZCBgT2Zmc2V0YCBpbnRvIHRoZSBzZXJpYWxpemVkIGRhdGEgaW5kaWNhdGluZwogICAvLy8gd2hlcmUgdGhlIHZlY3RvciBpcyBzdG9yZWQuCi0gIHRlbXBsYXRlPHR5cGVuYW1lIEFsbG9jID0gc3RkOjphbGxvY2F0b3I8c3RkOjpzdHJpbmc+PgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBTdHJpbmdUeXBlID0gc3RkOjpzdHJpbmcsCisgICAgICAgICAgIHR5cGVuYW1lIEFsbG9jID0gc3RkOjphbGxvY2F0b3I8U3RyaW5nVHlwZT4+CiAgIE9mZnNldDxWZWN0b3I8T2Zmc2V0PFN0cmluZz4+PiBDcmVhdGVWZWN0b3JPZlN0cmluZ3MoCi0gICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZywgQWxsb2M+ICZ2KSB7CisgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxTdHJpbmdUeXBlLCBBbGxvYz4gJnYpIHsKICAgICByZXR1cm4gQ3JlYXRlVmVjdG9yT2ZTdHJpbmdzKHYuY2JlZ2luKCksIHYuY2VuZCgpKTsKICAgfQogCiAgIC8vLyBAYnJpZWYgU2VyaWFsaXplIGEgY29sbGVjdGlvbiBvZiBTdHJpbmdzIGludG8gYSBGbGF0QnVmZmVyIGB2ZWN0b3JgLgogICAvLy8gVGhpcyBpcyBhIGNvbnZlbmllbmNlIGZ1bmN0aW9uIGZvciBhIGNvbW1vbiBjYXNlLgotICAvLy8gQHBhcmFtIGJlZ2luIFRoZSBiZWdpbmluZyBpdGVyYXRvciBvZiB0aGUgY29sbGVjdGlvbgorICAvLy8gQHBhcmFtIGJlZ2luIFRoZSBiZWdpbm5pbmcgaXRlcmF0b3Igb2YgdGhlIGNvbGxlY3Rpb24KICAgLy8vIEBwYXJhbSBlbmQgVGhlIGVuZGluZyBpdGVyYXRvciBvZiB0aGUgY29sbGVjdGlvbgogICAvLy8gQHJldHVybiBSZXR1cm5zIGEgdHlwZWQgYE9mZnNldGAgaW50byB0aGUgc2VyaWFsaXplZCBkYXRhIGluZGljYXRpbmcKICAgLy8vIHdoZXJlIHRoZSB2ZWN0b3IgaXMgc3RvcmVkLgpAQCAtNzQwLDcgKzc1Nyw3IEBACiAgICAgYXV0byBzY3JhdGNoX2J1ZmZlcl91c2FnZSA9IHNpemUgKiBzaXplb2YoT2Zmc2V0PFN0cmluZz4pOwogICAgIC8vIElmIHRoZXJlIGlzIG5vdCBlbm91Z2ggc3BhY2UgdG8gc3RvcmUgdGhlIG9mZnNldHMsIHRoZXJlIGRlZmluaXRlbHkgd29uJ3QKICAgICAvLyBiZSBlbm91Z2ggc3BhY2UgdG8gc3RvcmUgYWxsIHRoZSBzdHJpbmdzLiBTbyBlbnN1cmluZyBzcGFjZSBmb3IgdGhlCi0gICAgLy8gc2NyYXRjaCByZWdpb24gaXMgT0ssIGZvciBpdCBpdCBmYWlscywgaXQgd291bGQgaGF2ZSBmYWlsZWQgbGF0ZXIuCisgICAgLy8gc2NyYXRjaCByZWdpb24gaXMgT0ssIGZvciBpZiBpdCBmYWlscywgaXQgd291bGQgaGF2ZSBmYWlsZWQgbGF0ZXIuCiAgICAgYnVmXy5lbnN1cmVfc3BhY2Uoc2NyYXRjaF9idWZmZXJfdXNhZ2UpOwogICAgIGZvciAoYXV0byBpdCA9IGJlZ2luOyBpdCAhPSBlbmQ7ICsraXQpIHsKICAgICAgIGJ1Zl8uc2NyYXRjaF9wdXNoX3NtYWxsKENyZWF0ZVN0cmluZygqaXQpKTsKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL2luY2x1ZGUvZmxhdGJ1ZmZlcnMvZmxhdGMuaCBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL2luY2x1ZGUvZmxhdGJ1ZmZlcnMvZmxhdGMuaAppbmRleCAzZGJhNWUxLi5hZjRjY2FlIDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy9pbmNsdWRlL2ZsYXRidWZmZXJzL2ZsYXRjLmgKKysrIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvaW5jbHVkZS9mbGF0YnVmZmVycy9mbGF0Yy5oCkBAIC0xMDMsNiArMTAzLDExIEBACiAgIHZvaWQgRXJyb3IoY29uc3Qgc3RkOjpzdHJpbmcgJmVyciwgYm9vbCB1c2FnZSA9IHRydWUsCiAgICAgICAgICAgICAgYm9vbCBzaG93X2V4ZV9uYW1lID0gdHJ1ZSkgY29uc3Q7CiAKKyAgdm9pZCBBbm5vdGF0ZUJpbmFyaWVzKGNvbnN0IHVpbnQ4X3QgKmJpbmFyeV9zY2hlbWEsCisgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCBiaW5hcnlfc2NoZW1hX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyAmIHNjaGVtYV9maWxlbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiAmYmluYXJ5X2ZpbGVzKTsKKwogICBJbml0UGFyYW1zIHBhcmFtc187CiB9OwogCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy9pbmNsdWRlL2ZsYXRidWZmZXJzL2ZsZXhfZmxhdF91dGlsLmggYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy9pbmNsdWRlL2ZsYXRidWZmZXJzL2ZsZXhfZmxhdF91dGlsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDIwOTU3ZQotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL2luY2x1ZGUvZmxhdGJ1ZmZlcnMvZmxleF9mbGF0X3V0aWwuaApAQCAtMCwwICsxLDM2IEBACisvKgorICogQ29weXJpZ2h0IDIwMjIgR29vZ2xlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEZMQVRCVUZGRVJTX0ZMRVhfRkxBVF9VVElMX0hfCisjZGVmaW5lIEZMQVRCVUZGRVJTX0ZMRVhfRkxBVF9VVElMX0hfCisKKyNpbmNsdWRlICJmbGF0YnVmZmVycy9mbGF0YnVmZmVycy5oIgorI2luY2x1ZGUgImZsYXRidWZmZXJzL2ZsZXhidWZmZXJzLmgiCisKK25hbWVzcGFjZSBmbGV4YnVmZmVycyB7CisKKy8vIFZlcmlmaWVzIHRoZSBgbmVzdGVkYCBmbGV4YnVmZmVyIHdpdGhpbiBhIGZsYXRidWZmZXIgdmVjdG9yIGlzIHZhbGlkLgoraW5saW5lIGJvb2wgVmVyaWZ5TmVzdGVkRmxleEJ1ZmZlcigKKyAgICBjb25zdCBmbGF0YnVmZmVyczo6VmVjdG9yPHVpbnQ4X3Q+ICpjb25zdCBuZXN0ZWQsCisgICAgZmxhdGJ1ZmZlcnM6OlZlcmlmaWVyICZ2ZXJpZmllcikgeworICBpZiAoIW5lc3RlZCkgcmV0dXJuIHRydWU7CisgIHJldHVybiB2ZXJpZmllci5DaGVjayhmbGV4YnVmZmVyczo6VmVyaWZ5QnVmZmVyKAorICAgICAgbmVzdGVkLT5kYXRhKCksIG5lc3RlZC0+c2l6ZSgpLCB2ZXJpZmllci5HZXRGbGV4UmV1c2VUcmFja2VyKCkpKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGZsZXhidWZmZXJzCisKKyNlbmRpZiAgLy8gRkxBVEJVRkZFUlNfRkxFWF9GTEFUX1VUSUxfSF8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL2luY2x1ZGUvZmxhdGJ1ZmZlcnMvZmxleGJ1ZmZlcnMuaCBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL2luY2x1ZGUvZmxhdGJ1ZmZlcnMvZmxleGJ1ZmZlcnMuaAppbmRleCBiNGIwMzMyLi43YmY4NDMwIDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy9pbmNsdWRlL2ZsYXRidWZmZXJzL2ZsZXhidWZmZXJzLmgKKysrIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvaW5jbHVkZS9mbGF0YnVmZmVycy9mbGV4YnVmZmVycy5oCkBAIC0xNTYsNiArMTU2LDcgQEAKICAgLy8gVE9ETzogR0NDIGFwcGFyZW50bHkgcmVwbGFjZXMgbWVtY3B5IGJ5IGEgcmVwIG1vdnNiLCBidXQgb25seSBpZiBjb3VudCBpcyBhCiAgIC8vIGNvbnN0YW50LCB3aGljaCBoZXJlIGl0IGlzbid0LiBUZXN0IGlmIG1lbWNweSBpcyBzdGlsbCBmYXN0ZXIgdGhhbgogICAvLyB0aGUgY29uZGl0aW9uYWxzIGluIFJlYWRTaXplZFNjYWxhci4gQ2FuIGFsc28gdXNlIGlubGluZSBhc20uCisKICAgLy8gY2xhbmctZm9ybWF0IG9mZgogICAjaWYgZGVmaW5lZChfTVNDX1ZFUikgJiYgZGVmaW5lZChfTV9YNjQpICYmICFkZWZpbmVkKF9NX0FSTTY0RUMpCiAgIC8vIFRoaXMgaXMgNjQtYml0IFdpbmRvd3Mgb25seSwgX19tb3ZzYiBkb2VzIG5vdCB3b3JrIG9uIDMyLWJpdCBXaW5kb3dzLgpAQCAtNTc4LDcgKzU3OSw3IEBACiAgICAgICAgICAgLy8gdW5xdW90ZWQgaWYgaXQgbG9va3MgbGlrZSBhbiAiaWRlbnRpZmllciI6CiAgICAgICAgICAgY29uc3QgY2hhciAqcCA9IGtleXNbaV0uQXNLZXkoKTsKICAgICAgICAgICBpZiAoIWZsYXRidWZmZXJzOjppc19hbHBoYSgqcCkgJiYgKnAgIT0gJ18nKSB7Ci0gICAgICAgICAgICAgIGtxID0gdHJ1ZTsKKyAgICAgICAgICAgIGtxID0gdHJ1ZTsKICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgd2hpbGUgKCorK3ApIHsKICAgICAgICAgICAgICAgaWYgKCFmbGF0YnVmZmVyczo6aXNfYWxudW0oKnApICYmICpwICE9ICdfJykgewpAQCAtMTQyMiwxMCArMTQyMywxMiBAQAogCiAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+IHN0YXRpYyBUeXBlIEdldFNjYWxhclR5cGUoKSB7CiAgICAgc3RhdGljX2Fzc2VydChmbGF0YnVmZmVyczo6aXNfc2NhbGFyPFQ+Ojp2YWx1ZSwgIlVucmVsYXRlZCB0eXBlcyIpOwotICAgIHJldHVybiBmbGF0YnVmZmVyczo6aXNfZmxvYXRpbmdfcG9pbnQ8VD46OnZhbHVlID8gRkJUX0ZMT0FUCi0gICAgICAgICAgIDogZmxhdGJ1ZmZlcnM6OmlzX3NhbWU8VCwgYm9vbD46OnZhbHVlCi0gICAgICAgICAgICAgICA/IEZCVF9CT09MCi0gICAgICAgICAgICAgICA6IChmbGF0YnVmZmVyczo6aXNfdW5zaWduZWQ8VD46OnZhbHVlID8gRkJUX1VJTlQgOiBGQlRfSU5UKTsKKyAgICByZXR1cm4gZmxhdGJ1ZmZlcnM6OmlzX2Zsb2F0aW5nX3BvaW50PFQ+Ojp2YWx1ZQorICAgICAgICAgICAgICAgPyBGQlRfRkxPQVQKKyAgICAgICAgICAgICAgIDogZmxhdGJ1ZmZlcnM6OmlzX3NhbWU8VCwgYm9vbD46OnZhbHVlCisgICAgICAgICAgICAgICAgICAgICA/IEZCVF9CT09MCisgICAgICAgICAgICAgICAgICAgICA6IChmbGF0YnVmZmVyczo6aXNfdW5zaWduZWQ8VD46OnZhbHVlID8gRkJUX1VJTlQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBGQlRfSU5UKTsKICAgfQogCiAgcHVibGljOgpAQCAtMTczNyw5ICsxNzQwLDkgQEAKICAgICBpZiAoIUNoZWNrKGRlcHRoXyA8PSBtYXhfZGVwdGhfICYmIG51bV92ZWN0b3JzXyA8PSBtYXhfdmVjdG9yc18pKQogICAgICAgcmV0dXJuIGZhbHNlOwogICAgIGF1dG8gc2l6ZV9ieXRlX3dpZHRoID0gci5ieXRlX3dpZHRoXzsKLSAgICBGTEVYX0NIRUNLX1ZFUklGSUVEKHAsCi0gICAgICAgICAgICAgICAgICAgICAgICBQYWNrZWRUeXBlKEJ1aWxkZXI6OldpZHRoQihzaXplX2J5dGVfd2lkdGgpLCByLnR5cGVfKSk7CiAgICAgaWYgKCFWZXJpZnlCZWZvcmVQb2ludGVyKHAsIHNpemVfYnl0ZV93aWR0aCkpIHJldHVybiBmYWxzZTsKKyAgICBGTEVYX0NIRUNLX1ZFUklGSUVEKHAgLSBzaXplX2J5dGVfd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICBQYWNrZWRUeXBlKEJ1aWxkZXI6OldpZHRoQihzaXplX2J5dGVfd2lkdGgpLCByLnR5cGVfKSk7CiAgICAgYXV0byBzaXplZCA9IFNpemVkKHAsIHNpemVfYnl0ZV93aWR0aCk7CiAgICAgYXV0byBudW1fZWxlbXMgPSBzaXplZC5zaXplKCk7CiAgICAgYXV0byBlbGVtX2J5dGVfd2lkdGggPSByLnR5cGVfID09IEZCVF9TVFJJTkcgfHwgci50eXBlXyA9PSBGQlRfQkxPQgpAQCAtMTg2OCw3ICsxODcxLDcgQEAKICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gKnJldXNlX3RyYWNrZXJfOwogfTsKIAotLy8gVXRpbGl0eSBmdW5jdGlvbiB0aGF0IGNvbnRydWN0cyB0aGUgVmVyaWZpZXIgZm9yIHlvdSwgc2VlIGFib3ZlIGZvcgorLy8gVXRpbGl0eSBmdW5jdGlvbiB0aGF0IGNvbnN0cnVjdHMgdGhlIFZlcmlmaWVyIGZvciB5b3UsIHNlZSBhYm92ZSBmb3IKIC8vIHBhcmFtZXRlcnMuCiBpbmxpbmUgYm9vbCBWZXJpZnlCdWZmZXIoY29uc3QgdWludDhfdCAqYnVmLCBzaXplX3QgYnVmX2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiAqcmV1c2VfdHJhY2tlciA9IG51bGxwdHIpIHsKQEAgLTE4NzYsMTggKzE4NzksNiBAQAogICByZXR1cm4gdmVyaWZpZXIuVmVyaWZ5QnVmZmVyKCk7CiB9CiAKLSNpZmRlZiBGTEFUQlVGRkVSU19IXwotLy8gVGhpcyBpcyBhIHZlcmlmaWVyIHV0aWxpdHkgZnVuY3Rpb24gdGhhdCB3b3JrcyB0b2dldGhlciB3aXRoIHRoZQotLy8gRmxhdEJ1ZmZlcnMgdmVyaWZpZXIsIHdoaWNoIHNob3VsZCBvbmx5IGJlIHByZXNlbnQgaWYgZmxhdGJ1ZmZlci5oCi0vLyBoYXMgYmVlbiBpbmNsdWRlZCAod2hpY2ggaXQgdHlwaWNhbGx5IGlzIGluIGdlbmVyYXRlZCBjb2RlKS4KLWlubGluZSBib29sIFZlcmlmeU5lc3RlZEZsZXhCdWZmZXIoY29uc3QgZmxhdGJ1ZmZlcnM6OlZlY3Rvcjx1aW50OF90PiAqbnYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYXRidWZmZXJzOjpWZXJpZmllciAmdmVyaWZpZXIpIHsKLSAgaWYgKCFudikgcmV0dXJuIHRydWU7Ci0gIHJldHVybiB2ZXJpZmllci5DaGVjayhmbGV4YnVmZmVyczo6VmVyaWZ5QnVmZmVyKAotICAgICAgbnYtPmRhdGEoKSwgbnYtPnNpemUoKSwgdmVyaWZpZXIuR2V0RmxleFJldXNlVHJhY2tlcigpKSk7Ci19Ci0jZW5kaWYKLQogfSAgLy8gbmFtZXNwYWNlIGZsZXhidWZmZXJzCiAKICNpZiBkZWZpbmVkKF9NU0NfVkVSKQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvaW5jbHVkZS9mbGF0YnVmZmVycy9pZGwuaCBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL2luY2x1ZGUvZmxhdGJ1ZmZlcnMvaWRsLmgKaW5kZXggMjYwMDYxZi4uNGNmZDdlYiAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvaW5jbHVkZS9mbGF0YnVmZmVycy9pZGwuaAorKysgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy9pbmNsdWRlL2ZsYXRidWZmZXJzL2lkbC5oCkBAIC0xNjQsNyArMTY0LDcgQEAKICAgICAgICAgZW51bV9kZWYoX2VkKSwKICAgICAgICAgZml4ZWRfbGVuZ3RoKF9maXhlZF9sZW5ndGgpIHt9CiAKLSAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IFR5cGUgJm8pIHsKKyAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IFR5cGUgJm8pIGNvbnN0IHsKICAgICByZXR1cm4gYmFzZV90eXBlID09IG8uYmFzZV90eXBlICYmIGVsZW1lbnQgPT0gby5lbGVtZW50ICYmCiAgICAgICAgICAgIHN0cnVjdF9kZWYgPT0gby5zdHJ1Y3RfZGVmICYmIGVudW1fZGVmID09IG8uZW51bV9kZWY7CiAgIH0KQEAgLTI5NSw3ICsyOTUsNyBAQAogICAgICAgICBuYXRpdmVfaW5saW5lKGZhbHNlKSwKICAgICAgICAgZmxleGJ1ZmZlcihmYWxzZSksCiAgICAgICAgIHByZXNlbmNlKGtEZWZhdWx0KSwKLSAgICAgICAgbmVzdGVkX2ZsYXRidWZmZXIoTlVMTCksCisgICAgICAgIG5lc3RlZF9mbGF0YnVmZmVyKG51bGxwdHIpLAogICAgICAgICBwYWRkaW5nKDApIHt9CiAKICAgT2Zmc2V0PHJlZmxlY3Rpb246OkZpZWxkPiBTZXJpYWxpemUoRmxhdEJ1ZmZlckJ1aWxkZXIgKmJ1aWxkZXIsIHVpbnQxNl90IGlkLApAQCAtNDY0LDYgKzQ2NCwxMCBAQAogICByZXR1cm4gdHlwZS5iYXNlX3R5cGUgPT0gQkFTRV9UWVBFX1NUUlVDVCAmJiB0eXBlLnN0cnVjdF9kZWYtPmZpeGVkOwogfQogCitpbmxpbmUgYm9vbCBJc1RhYmxlKGNvbnN0IFR5cGUgJnR5cGUpIHsKKyAgcmV0dXJuIHR5cGUuYmFzZV90eXBlID09IEJBU0VfVFlQRV9TVFJVQ1QgJiYgIXR5cGUuc3RydWN0X2RlZi0+Zml4ZWQ7Cit9CisKIGlubGluZSBib29sIElzVW5pb24oY29uc3QgVHlwZSAmdHlwZSkgewogICByZXR1cm4gdHlwZS5lbnVtX2RlZiAhPSBudWxscHRyICYmIHR5cGUuZW51bV9kZWYtPmlzX3VuaW9uOwogfQpAQCAtNDc2LDYgKzQ4MCwxNCBAQAogICByZXR1cm4gdHlwZS5iYXNlX3R5cGUgPT0gQkFTRV9UWVBFX1ZFQ1RPUjsKIH0KIAoraW5saW5lIGJvb2wgSXNWZWN0b3JPZlN0cnVjdChjb25zdCBUeXBlJiB0eXBlKSB7CisgIHJldHVybiBJc1ZlY3Rvcih0eXBlKSAmJiBJc1N0cnVjdCh0eXBlLlZlY3RvclR5cGUoKSk7Cit9CisKK2lubGluZSBib29sIElzVmVjdG9yT2ZUYWJsZShjb25zdCBUeXBlJiB0eXBlKSB7CisgIHJldHVybiBJc1ZlY3Rvcih0eXBlKSAmJiBJc1RhYmxlKHR5cGUuVmVjdG9yVHlwZSgpKTsKK30KKwogaW5saW5lIGJvb2wgSXNBcnJheShjb25zdCBUeXBlICZ0eXBlKSB7CiAgIHJldHVybiB0eXBlLmJhc2VfdHlwZSA9PSBCQVNFX1RZUEVfQVJSQVk7CiB9CkBAIC01MzcsNiArNTQ5LDI0IEBACiAgIFN5bWJvbFRhYmxlPFJQQ0NhbGw+IGNhbGxzOwogfTsKIAorc3RydWN0IEluY2x1ZGVkRmlsZSB7CisgIC8vIFRoZSBuYW1lIG9mIHRoZSBzY2hlbWEgZmlsZSBiZWluZyBpbmNsdWRlZCwgYXMgZGVmaW5lZCBpbiB0aGUgLmZicyBmaWxlLgorICAvLyBUaGlzIGluY2x1ZGVzIHRoZSBwcmVmaXggKGUuZy4sIGluY2x1ZGUgImZvby9iYXIvYmF6LmZicyIgd291bGQgbWVhbiB0aGlzCisgIC8vIHZhbHVlIGlzICJmb28vYmFyL2Jhei5mYnMiKS4KKyAgc3RkOjpzdHJpbmcgc2NoZW1hX25hbWU7CisKKyAgLy8gVGhlIGZpbGVuYW1lIG9mIHdoZXJlIHRoZSBpbmNsdWRlZCBmaWxlIHdhcyBmb3VuZCwgYWZ0ZXIgc2VhcmNoaW5nIHRoZQorICAvLyByZWxhdGl2ZSBwYXRocyBwbHVzIGFueSBvdGhlciBwYXRocyBpbmNsdWRlZCB3aXRoIGBmbGF0YyAtSSAuLi5gLiBOb3RlLAorICAvLyB3aGlsZSB0aGlzIGlzIHNvbWV0aW1lcyB0aGUgc2FtZSBhcyBzY2hlbWFfbmFtZSwgaXQgaXMgbm90IGFsd2F5cywgc2luY2UgaXQKKyAgLy8gY2FuIGJlIGRlZmluZWQgcmVsYXRpdmUgdG8gd2hlcmUgZmxhdGMgd2FzIGludm9rZWQuCisgIHN0ZDo6c3RyaW5nIGZpbGVuYW1lOworfTsKKworLy8gU2luY2UgSW5jbHVkZWRGaWxlIGlzIGNvbnRhaW5lZCB3aXRoaW4gYSBzdGQ6OnNldCwgbmVlZCB0byBwcm92aWRlIG9yZGVyaW5nLgoraW5saW5lIGJvb2wgb3BlcmF0b3I8KGNvbnN0IEluY2x1ZGVkRmlsZSAmYSwgY29uc3QgSW5jbHVkZWRGaWxlICZiKSB7CisgIHJldHVybiBhLmZpbGVuYW1lIDwgYi5maWxlbmFtZTsKK30KKwogLy8gQ29udGFpbmVyIG9mIG9wdGlvbnMgdGhhdCBtYXkgYXBwbHkgdG8gYW55IG9mIHRoZSBzb3VyY2UvdGV4dCBnZW5lcmF0b3JzLgogc3RydWN0IElETE9wdGlvbnMgewogICAvLyBmaWVsZCBjYXNlIHN0eWxlIG9wdGlvbnMgZm9yIEMrKwpAQCAtNTUxLDYgKzU4MSw3IEBACiAgIGJvb2wgb3V0cHV0X2VudW1faWRlbnRpZmllcnM7CiAgIGJvb2wgcHJlZml4ZWRfZW51bXM7CiAgIGJvb2wgc2NvcGVkX2VudW1zOworICBib29sIHN3aWZ0X2ltcGxlbWVudGF0aW9uX29ubHk7CiAgIGJvb2wgaW5jbHVkZV9kZXBlbmRlbmNlX2hlYWRlcnM7CiAgIGJvb2wgbXV0YWJsZV9idWZmZXI7CiAgIGJvb2wgb25lX2ZpbGU7CkBAIC01NzYsNyArNjA3LDcgQEAKICAgYm9vbCBhbGxvd19ub25fdXRmODsKICAgYm9vbCBuYXR1cmFsX3V0Zjg7CiAgIHN0ZDo6c3RyaW5nIGluY2x1ZGVfcHJlZml4OwotICBib29sIGtlZXBfaW5jbHVkZV9wYXRoOworICBib29sIGtlZXBfcHJlZml4OwogICBib29sIGJpbmFyeV9zY2hlbWFfY29tbWVudHM7CiAgIGJvb2wgYmluYXJ5X3NjaGVtYV9idWlsdGluczsKICAgYm9vbCBiaW5hcnlfc2NoZW1hX2dlbl9lbWJlZDsKQEAgLTYwMiw2ICs2MzMsNyBAQAogICBib29sIGpzb25fbmVzdGVkX2ZsZXhidWZmZXJzOwogICBib29sIGpzb25fbmVzdGVkX2xlZ2FjeV9mbGF0YnVmZmVyczsKICAgYm9vbCB0c19mbGF0X2ZpbGU7CisgIGJvb2wgbm9fbGVha19wcml2YXRlX2Fubm90YXRpb25zOwogCiAgIC8vIFBvc3NpYmxlIG9wdGlvbnMgZm9yIHRoZSBtb3JlIGdlbmVyYWwgZ2VuZXJhdG9yIGJlbG93LgogICBlbnVtIExhbmd1YWdlIHsKQEAgLTY1OCw2ICs2OTAsNyBAQAogICAgICAgICBvdXRwdXRfZW51bV9pZGVudGlmaWVycyh0cnVlKSwKICAgICAgICAgcHJlZml4ZWRfZW51bXModHJ1ZSksCiAgICAgICAgIHNjb3BlZF9lbnVtcyhmYWxzZSksCisgICAgICAgIHN3aWZ0X2ltcGxlbWVudGF0aW9uX29ubHkoZmFsc2UpLAogICAgICAgICBpbmNsdWRlX2RlcGVuZGVuY2VfaGVhZGVycyh0cnVlKSwKICAgICAgICAgbXV0YWJsZV9idWZmZXIoZmFsc2UpLAogICAgICAgICBvbmVfZmlsZShmYWxzZSksCkBAIC02ODAsNyArNzEzLDcgQEAKICAgICAgICAgdW5pb25fdmFsdWVfbmFtZXNwYWNpbmcodHJ1ZSksCiAgICAgICAgIGFsbG93X25vbl91dGY4KGZhbHNlKSwKICAgICAgICAgbmF0dXJhbF91dGY4KGZhbHNlKSwKLSAgICAgICAga2VlcF9pbmNsdWRlX3BhdGgoZmFsc2UpLAorICAgICAgICBrZWVwX3ByZWZpeChmYWxzZSksCiAgICAgICAgIGJpbmFyeV9zY2hlbWFfY29tbWVudHMoZmFsc2UpLAogICAgICAgICBiaW5hcnlfc2NoZW1hX2J1aWx0aW5zKGZhbHNlKSwKICAgICAgICAgYmluYXJ5X3NjaGVtYV9nZW5fZW1iZWQoZmFsc2UpLApAQCAtNzAwLDYgKzczMyw3IEBACiAgICAgICAgIGpzb25fbmVzdGVkX2ZsZXhidWZmZXJzKHRydWUpLAogICAgICAgICBqc29uX25lc3RlZF9sZWdhY3lfZmxhdGJ1ZmZlcnMoZmFsc2UpLAogICAgICAgICB0c19mbGF0X2ZpbGUoZmFsc2UpLAorICAgICAgICBub19sZWFrX3ByaXZhdGVfYW5ub3RhdGlvbnMoZmFsc2UpLAogICAgICAgICBtaW5pX3JlZmxlY3QoSURMT3B0aW9uczo6a05vbmUpLAogICAgICAgICByZXF1aXJlX2V4cGxpY2l0X2lkcyhmYWxzZSksCiAgICAgICAgIHJ1c3Rfc2VyaWFsaXplKGZhbHNlKSwKQEAgLTkwNyw2ICs5NDEsMTEgQEAKICAgLy8gQHBhcmFtIG9wdHMgT3B0aW9ucyB1c2VkIHRvIHBhcmNlIGEgc2NoZW1hIGFuZCBnZW5lcmF0ZSBjb2RlLgogICBzdGF0aWMgYm9vbCBTdXBwb3J0c09wdGlvbmFsU2NhbGFycyhjb25zdCBmbGF0YnVmZmVyczo6SURMT3B0aW9ucyAmb3B0cyk7CiAKKyAgLy8gR2V0IHRoZSBzZXQgb2YgaW5jbHVkZWQgZmlsZXMgdGhhdCBhcmUgZGlyZWN0bHkgcmVmZXJlbmNlZCBieSB0aGUgZmlsZQorICAvLyBiZWluZyBwYXJzZWQuIFRoaXMgZG9lcyBub3QgaW5jbHVkZSBmaWxlcyB0aGF0IGFyZSB0cmFuc2l0aXZlbHkgaW5jbHVkZWQgYnkKKyAgLy8gb3RoZXJzIGluY2x1ZGVzLgorICBzdGQ6OnZlY3RvcjxJbmNsdWRlZEZpbGU+IEdldEluY2x1ZGVkRmlsZXMoKSBjb25zdDsKKwogIHByaXZhdGU6CiAgIGNsYXNzIFBhcnNlRGVwdGhHdWFyZDsKIApAQCAtOTkxLDYgKzEwMzAsOSBAQAogICBGTEFUQlVGRkVSU19DSEVDS0VEX0VSUk9SIFBhcnNlUm9vdChjb25zdCBjaGFyICpfc291cmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICoqaW5jbHVkZV9wYXRocywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqc291cmNlX2ZpbGVuYW1lKTsKKyAgRkxBVEJVRkZFUlNfQ0hFQ0tFRF9FUlJPUiBDaGVja1ByaXZhdGVMZWFrKCk7CisgIEZMQVRCVUZGRVJTX0NIRUNLRURfRVJST1IgQ2hlY2tQcml2YXRlbHlMZWFrZWRGaWVsZHMoCisgICAgICBjb25zdCBEZWZpbml0aW9uICZkZWYsIGNvbnN0IERlZmluaXRpb24gJnZhbHVlX3R5cGUpOwogICBGTEFUQlVGRkVSU19DSEVDS0VEX0VSUk9SIERvUGFyc2UoY29uc3QgY2hhciAqX3NvdXJjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKippbmNsdWRlX3BhdGhzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqc291cmNlX2ZpbGVuYW1lLApAQCAtMTAzMSw3ICsxMDczLDcgQEAKICAgc3RkOjpzdHJpbmcgZmlsZV9leHRlbnNpb25fOwogCiAgIHN0ZDo6bWFwPHVpbnQ2NF90LCBzdGQ6OnN0cmluZz4gaW5jbHVkZWRfZmlsZXNfOwotICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzZXQ8c3RkOjpzdHJpbmc+PiBmaWxlc19pbmNsdWRlZF9wZXJfZmlsZV87CisgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnNldDxJbmNsdWRlZEZpbGU+PiBmaWxlc19pbmNsdWRlZF9wZXJfZmlsZV87CiAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBuYXRpdmVfaW5jbHVkZWRfZmlsZXNfOwogCiAgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBib29sPiBrbm93bl9hdHRyaWJ1dGVzXzsKQEAgLTEwNDIsMTEgKzEwODQsMTEgQEAKIAogICB1aW50NjRfdCBhZHZhbmNlZF9mZWF0dXJlc187CiAKKyAgc3RkOjpzdHJpbmcgZmlsZV9iZWluZ19wYXJzZWRfOworCiAgcHJpdmF0ZToKICAgY29uc3QgY2hhciAqc291cmNlXzsKIAotICBzdGQ6OnN0cmluZyBmaWxlX2JlaW5nX3BhcnNlZF87Ci0KICAgc3RkOjp2ZWN0b3I8c3RkOjpwYWlyPFZhbHVlLCBGaWVsZERlZiAqPj4gZmllbGRfc3RhY2tfOwogCiAgIC8vIFRPRE8oY25lbyk6IFJlZmFjdG9yIHBhcnNlciB0byB1c2Ugc3RyaW5nX2NhY2hlIG1vcmUgb2Z0ZW4gdG8gc2F2ZQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvaW5jbHVkZS9mbGF0YnVmZmVycy9yZWZsZWN0aW9uLmggYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy9pbmNsdWRlL2ZsYXRidWZmZXJzL3JlZmxlY3Rpb24uaAppbmRleCBjZWNmMzdjLi4xYWEwODYzIDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy9pbmNsdWRlL2ZsYXRidWZmZXJzL3JlZmxlY3Rpb24uaAorKysgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy9pbmNsdWRlL2ZsYXRidWZmZXJzL3JlZmxlY3Rpb24uaApAQCAtODgsMTMgKzg4LDIyIEBACiB9CiAKIC8vIEdldCB0aGUgcm9vdCwgcmVnYXJkbGVzcyBvZiB3aGF0IHR5cGUgaXQgaXMuCi1pbmxpbmUgVGFibGUgKkdldEFueVJvb3QodWludDhfdCAqZmxhdGJ1ZikgeworaW5saW5lIFRhYmxlICpHZXRBbnlSb290KHVpbnQ4X3QgKmNvbnN0IGZsYXRidWYpIHsKICAgcmV0dXJuIEdldE11dGFibGVSb290PFRhYmxlPihmbGF0YnVmKTsKIH0KLWlubGluZSBjb25zdCBUYWJsZSAqR2V0QW55Um9vdChjb25zdCB1aW50OF90ICpmbGF0YnVmKSB7CisKK2lubGluZSBjb25zdCBUYWJsZSAqR2V0QW55Um9vdChjb25zdCB1aW50OF90ICpjb25zdCBmbGF0YnVmKSB7CiAgIHJldHVybiBHZXRSb290PFRhYmxlPihmbGF0YnVmKTsKIH0KIAoraW5saW5lIFRhYmxlICpHZXRBbnlTaXplUHJlZml4ZWRSb290KHVpbnQ4X3QgKmNvbnN0IGZsYXRidWYpIHsKKyAgcmV0dXJuIEdldE11dGFibGVTaXplUHJlZml4ZWRSb290PFRhYmxlPihmbGF0YnVmKTsKK30KKworaW5saW5lIGNvbnN0IFRhYmxlICpHZXRBbnlTaXplUHJlZml4ZWRSb290KGNvbnN0IHVpbnQ4X3QgKmNvbnN0IGZsYXRidWYpIHsKKyAgcmV0dXJuIEdldFNpemVQcmVmaXhlZFJvb3Q8VGFibGU+KGZsYXRidWYpOworfQorCiAvLyBHZXQgYSBmaWVsZCdzIGRlZmF1bHQsIGlmIHlvdSBrbm93IGl0J3MgYW4gaW50ZWdlciwgYW5kIGl0cyBleGFjdCB0eXBlLgogdGVtcGxhdGU8dHlwZW5hbWUgVD4gVCBHZXRGaWVsZERlZmF1bHRJKGNvbnN0IHJlZmxlY3Rpb246OkZpZWxkICZmaWVsZCkgewogICBGTEFUQlVGRkVSU19BU1NFUlQoc2l6ZW9mKFQpID09IEdldFR5cGVTaXplKGZpZWxkLnR5cGUoKS0+YmFzZV90eXBlKCkpKTsKQEAgLTI3OSw2ICsyODgsMTIgQEAKICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8VCAqPihzdC5HZXRBZGRyZXNzT2YoZmllbGQub2Zmc2V0KCkpKTsKIH0KIAorLy8gTG9vcCBvdmVyIGFsbCB0aGUgZmllbGRzIG9mIHRoZSBwcm92aWRlZCBgb2JqZWN0YCBhbmQgY2FsbCBgZnVuY2Agb24gZWFjaCBvbmUKKy8vIGluIGluY3JlYXNpbmcgb3JkZXIgYnkgdGhlaXIgZmllbGQtPmlkKCkuIElmIGByZXZlcnNlYCBpcyB0cnVlLCBgZnVuY2AgaXMKKy8vIGNhbGxlZCBpbiBkZXNjZW5kaW5nIG9yZGVyCit2b2lkIEZvckFsbEZpZWxkcyhjb25zdCByZWZsZWN0aW9uOjpPYmplY3QgKm9iamVjdCwgYm9vbCByZXZlcnNlLAorICAgICAgICAgICAgICAgICAgc3RkOjpmdW5jdGlvbjx2b2lkKGNvbnN0IHJlZmxlY3Rpb246OkZpZWxkICopPiBmdW5jKTsKKwogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBTRVRURVJTIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogLy8gU2V0IGFueSBzY2FsYXIgZmllbGQsIGlmIHlvdSBrbm93IGl0cyBleGFjdCB0eXBlLgpAQCAtNDk3LDYgKzUxMiwxMSBAQAogICAgICAgICAgICAgY29uc3QgdWludDhfdCAqYnVmLCBzaXplX3QgbGVuZ3RoLCB1b2Zmc2V0X3QgbWF4X2RlcHRoID0gNjQsCiAgICAgICAgICAgICB1b2Zmc2V0X3QgbWF4X3RhYmxlcyA9IDEwMDAwMDApOwogCitib29sIFZlcmlmeVNpemVQcmVmaXhlZChjb25zdCByZWZsZWN0aW9uOjpTY2hlbWEgJnNjaGVtYSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlZmxlY3Rpb246Ok9iamVjdCAmcm9vdCwgY29uc3QgdWludDhfdCAqYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGxlbmd0aCwgdW9mZnNldF90IG1heF9kZXB0aCA9IDY0LAorICAgICAgICAgICAgICAgICAgICAgICAgdW9mZnNldF90IG1heF90YWJsZXMgPSAxMDAwMDAwKTsKKwogfSAgLy8gbmFtZXNwYWNlIGZsYXRidWZmZXJzCiAKICNlbmRpZiAgLy8gRkxBVEJVRkZFUlNfUkVGTEVDVElPTl9IXwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvaW5jbHVkZS9mbGF0YnVmZmVycy9yZWZsZWN0aW9uX2dlbmVyYXRlZC5oIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvaW5jbHVkZS9mbGF0YnVmZmVycy9yZWZsZWN0aW9uX2dlbmVyYXRlZC5oCmluZGV4IDg2ZDhmMzYuLjBiMmZjMDAgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL2luY2x1ZGUvZmxhdGJ1ZmZlcnMvcmVmbGVjdGlvbl9nZW5lcmF0ZWQuaAorKysgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy9pbmNsdWRlL2ZsYXRidWZmZXJzL3JlZmxlY3Rpb25fZ2VuZXJhdGVkLmgKQEAgLTYsNiArNiwxMyBAQAogCiAjaW5jbHVkZSAiZmxhdGJ1ZmZlcnMvZmxhdGJ1ZmZlcnMuaCIKIAorLy8gRW5zdXJlIHRoZSBpbmNsdWRlZCBmbGF0YnVmZmVycy5oIGlzIHRoZSBzYW1lIHZlcnNpb24gYXMgd2hlbiB0aGlzIGZpbGUgd2FzCisvLyBnZW5lcmF0ZWQsIG90aGVyd2lzZSBpdCBtYXkgbm90IGJlIGNvbXBhdGlibGUuCitzdGF0aWNfYXNzZXJ0KEZMQVRCVUZGRVJTX1ZFUlNJT05fTUFKT1IgPT0gMiAmJgorICAgICAgICAgICAgICBGTEFUQlVGRkVSU19WRVJTSU9OX01JTk9SID09IDAgJiYKKyAgICAgICAgICAgICAgRkxBVEJVRkZFUlNfVkVSU0lPTl9SRVZJU0lPTiA9PSA4LAorICAgICAgICAgICAgICJOb24tY29tcGF0aWJsZSBmbGF0YnVmZmVycyB2ZXJzaW9uIGluY2x1ZGVkIik7CisKIG5hbWVzcGFjZSByZWZsZWN0aW9uIHsKIAogc3RydWN0IFR5cGU7CkBAIC0yMTQsNiArMjIxLDkgQEAKIAogc3RydWN0IFR5cGVUIDogcHVibGljIGZsYXRidWZmZXJzOjpOYXRpdmVUYWJsZSB7CiAgIHR5cGVkZWYgVHlwZSBUYWJsZVR5cGU7CisgIHN0YXRpYyBGTEFUQlVGRkVSU19DT05TVEVYUFJfQ1BQMTEgY29uc3QgY2hhciAqR2V0RnVsbHlRdWFsaWZpZWROYW1lKCkgeworICAgIHJldHVybiAicmVmbGVjdGlvbi5UeXBlVCI7CisgIH0KICAgcmVmbGVjdGlvbjo6QmFzZVR5cGUgYmFzZV90eXBlID0gcmVmbGVjdGlvbjo6QmFzZVR5cGU6Ok5vbmU7CiAgIHJlZmxlY3Rpb246OkJhc2VUeXBlIGVsZW1lbnQgPSByZWZsZWN0aW9uOjpCYXNlVHlwZTo6Tm9uZTsKICAgaW50MzJfdCBpbmRleCA9IC0xOwpAQCAtMjI5LDYgKzIzOSw5IEBACiAgIHN0YXRpYyBjb25zdCBmbGF0YnVmZmVyczo6VHlwZVRhYmxlICpNaW5pUmVmbGVjdFR5cGVUYWJsZSgpIHsKICAgICByZXR1cm4gVHlwZVR5cGVUYWJsZSgpOwogICB9CisgIHN0YXRpYyBGTEFUQlVGRkVSU19DT05TVEVYUFJfQ1BQMTEgY29uc3QgY2hhciAqR2V0RnVsbHlRdWFsaWZpZWROYW1lKCkgeworICAgIHJldHVybiAicmVmbGVjdGlvbi5UeXBlIjsKKyAgfQogICBlbnVtIEZsYXRCdWZmZXJzVlRhYmxlT2Zmc2V0IEZMQVRCVUZGRVJTX1ZUQUJMRV9VTkRFUkxZSU5HX1RZUEUgewogICAgIFZUX0JBU0VfVFlQRSA9IDQsCiAgICAgVlRfRUxFTUVOVCA9IDYsCkBAIC0yNDAsMjMgKzI1Myw3NyBAQAogICByZWZsZWN0aW9uOjpCYXNlVHlwZSBiYXNlX3R5cGUoKSBjb25zdCB7CiAgICAgcmV0dXJuIHN0YXRpY19jYXN0PHJlZmxlY3Rpb246OkJhc2VUeXBlPihHZXRGaWVsZDxpbnQ4X3Q+KFZUX0JBU0VfVFlQRSwgMCkpOwogICB9CisgIGJvb2wgbXV0YXRlX2Jhc2VfdHlwZShyZWZsZWN0aW9uOjpCYXNlVHlwZSBfYmFzZV90eXBlID0gc3RhdGljX2Nhc3Q8cmVmbGVjdGlvbjo6QmFzZVR5cGU+KDApKSB7CisgICAgcmV0dXJuIFNldEZpZWxkPGludDhfdD4oVlRfQkFTRV9UWVBFLCBzdGF0aWNfY2FzdDxpbnQ4X3Q+KF9iYXNlX3R5cGUpLCAwKTsKKyAgfQorICB2b2lkIGNsZWFyX2Jhc2VfdHlwZSgpIHsKKyAgICBDbGVhckZpZWxkKFZUX0JBU0VfVFlQRSk7CisgIH0KKyAgYm9vbCBoYXNfYmFzZV90eXBlKCkgY29uc3QgeworICAgIHJldHVybiBDaGVja0ZpZWxkKFZUX0JBU0VfVFlQRSk7CisgIH0KICAgcmVmbGVjdGlvbjo6QmFzZVR5cGUgZWxlbWVudCgpIGNvbnN0IHsKICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8cmVmbGVjdGlvbjo6QmFzZVR5cGU+KEdldEZpZWxkPGludDhfdD4oVlRfRUxFTUVOVCwgMCkpOwogICB9CisgIGJvb2wgbXV0YXRlX2VsZW1lbnQocmVmbGVjdGlvbjo6QmFzZVR5cGUgX2VsZW1lbnQgPSBzdGF0aWNfY2FzdDxyZWZsZWN0aW9uOjpCYXNlVHlwZT4oMCkpIHsKKyAgICByZXR1cm4gU2V0RmllbGQ8aW50OF90PihWVF9FTEVNRU5ULCBzdGF0aWNfY2FzdDxpbnQ4X3Q+KF9lbGVtZW50KSwgMCk7CisgIH0KKyAgdm9pZCBjbGVhcl9lbGVtZW50KCkgeworICAgIENsZWFyRmllbGQoVlRfRUxFTUVOVCk7CisgIH0KKyAgYm9vbCBoYXNfZWxlbWVudCgpIGNvbnN0IHsKKyAgICByZXR1cm4gQ2hlY2tGaWVsZChWVF9FTEVNRU5UKTsKKyAgfQogICBpbnQzMl90IGluZGV4KCkgY29uc3QgewogICAgIHJldHVybiBHZXRGaWVsZDxpbnQzMl90PihWVF9JTkRFWCwgLTEpOwogICB9CisgIGJvb2wgbXV0YXRlX2luZGV4KGludDMyX3QgX2luZGV4ID0gLTEpIHsKKyAgICByZXR1cm4gU2V0RmllbGQ8aW50MzJfdD4oVlRfSU5ERVgsIF9pbmRleCwgLTEpOworICB9CisgIHZvaWQgY2xlYXJfaW5kZXgoKSB7CisgICAgQ2xlYXJGaWVsZChWVF9JTkRFWCk7CisgIH0KKyAgYm9vbCBoYXNfaW5kZXgoKSBjb25zdCB7CisgICAgcmV0dXJuIENoZWNrRmllbGQoVlRfSU5ERVgpOworICB9CiAgIHVpbnQxNl90IGZpeGVkX2xlbmd0aCgpIGNvbnN0IHsKICAgICByZXR1cm4gR2V0RmllbGQ8dWludDE2X3Q+KFZUX0ZJWEVEX0xFTkdUSCwgMCk7CiAgIH0KKyAgYm9vbCBtdXRhdGVfZml4ZWRfbGVuZ3RoKHVpbnQxNl90IF9maXhlZF9sZW5ndGggPSAwKSB7CisgICAgcmV0dXJuIFNldEZpZWxkPHVpbnQxNl90PihWVF9GSVhFRF9MRU5HVEgsIF9maXhlZF9sZW5ndGgsIDApOworICB9CisgIHZvaWQgY2xlYXJfZml4ZWRfbGVuZ3RoKCkgeworICAgIENsZWFyRmllbGQoVlRfRklYRURfTEVOR1RIKTsKKyAgfQorICBib29sIGhhc19maXhlZF9sZW5ndGgoKSBjb25zdCB7CisgICAgcmV0dXJuIENoZWNrRmllbGQoVlRfRklYRURfTEVOR1RIKTsKKyAgfQogICAvLy8gVGhlIHNpemUgKG9jdGV0cykgb2YgdGhlIGBiYXNlX3R5cGVgIGZpZWxkLgogICB1aW50MzJfdCBiYXNlX3NpemUoKSBjb25zdCB7CiAgICAgcmV0dXJuIEdldEZpZWxkPHVpbnQzMl90PihWVF9CQVNFX1NJWkUsIDQpOwogICB9CisgIGJvb2wgbXV0YXRlX2Jhc2Vfc2l6ZSh1aW50MzJfdCBfYmFzZV9zaXplID0gNCkgeworICAgIHJldHVybiBTZXRGaWVsZDx1aW50MzJfdD4oVlRfQkFTRV9TSVpFLCBfYmFzZV9zaXplLCA0KTsKKyAgfQorICB2b2lkIGNsZWFyX2Jhc2Vfc2l6ZSgpIHsKKyAgICBDbGVhckZpZWxkKFZUX0JBU0VfU0laRSk7CisgIH0KKyAgYm9vbCBoYXNfYmFzZV9zaXplKCkgY29uc3QgeworICAgIHJldHVybiBDaGVja0ZpZWxkKFZUX0JBU0VfU0laRSk7CisgIH0KICAgLy8vIFRoZSBzaXplIChvY3RldHMpIG9mIHRoZSBgZWxlbWVudGAgZmllbGQsIGlmIHByZXNlbnQuCiAgIHVpbnQzMl90IGVsZW1lbnRfc2l6ZSgpIGNvbnN0IHsKICAgICByZXR1cm4gR2V0RmllbGQ8dWludDMyX3Q+KFZUX0VMRU1FTlRfU0laRSwgMCk7CiAgIH0KKyAgYm9vbCBtdXRhdGVfZWxlbWVudF9zaXplKHVpbnQzMl90IF9lbGVtZW50X3NpemUgPSAwKSB7CisgICAgcmV0dXJuIFNldEZpZWxkPHVpbnQzMl90PihWVF9FTEVNRU5UX1NJWkUsIF9lbGVtZW50X3NpemUsIDApOworICB9CisgIHZvaWQgY2xlYXJfZWxlbWVudF9zaXplKCkgeworICAgIENsZWFyRmllbGQoVlRfRUxFTUVOVF9TSVpFKTsKKyAgfQorICBib29sIGhhc19lbGVtZW50X3NpemUoKSBjb25zdCB7CisgICAgcmV0dXJuIENoZWNrRmllbGQoVlRfRUxFTUVOVF9TSVpFKTsKKyAgfQogICBib29sIFZlcmlmeShmbGF0YnVmZmVyczo6VmVyaWZpZXIgJnZlcmlmaWVyKSBjb25zdCB7CiAgICAgcmV0dXJuIFZlcmlmeVRhYmxlU3RhcnQodmVyaWZpZXIpICYmCiAgICAgICAgICAgIFZlcmlmeUZpZWxkPGludDhfdD4odmVyaWZpZXIsIFZUX0JBU0VfVFlQRSwgMSkgJiYKQEAgLTMzMiw2ICszOTksOSBAQAogCiBzdHJ1Y3QgS2V5VmFsdWVUIDogcHVibGljIGZsYXRidWZmZXJzOjpOYXRpdmVUYWJsZSB7CiAgIHR5cGVkZWYgS2V5VmFsdWUgVGFibGVUeXBlOworICBzdGF0aWMgRkxBVEJVRkZFUlNfQ09OU1RFWFBSX0NQUDExIGNvbnN0IGNoYXIgKkdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpIHsKKyAgICByZXR1cm4gInJlZmxlY3Rpb24uS2V5VmFsdWVUIjsKKyAgfQogICBzdGQ6OnN0cmluZyBrZXl7fTsKICAgc3RkOjpzdHJpbmcgdmFsdWV7fTsKIH07CkBAIC0zNDMsNiArNDEzLDkgQEAKICAgc3RhdGljIGNvbnN0IGZsYXRidWZmZXJzOjpUeXBlVGFibGUgKk1pbmlSZWZsZWN0VHlwZVRhYmxlKCkgewogICAgIHJldHVybiBLZXlWYWx1ZVR5cGVUYWJsZSgpOwogICB9CisgIHN0YXRpYyBGTEFUQlVGRkVSU19DT05TVEVYUFJfQ1BQMTEgY29uc3QgY2hhciAqR2V0RnVsbHlRdWFsaWZpZWROYW1lKCkgeworICAgIHJldHVybiAicmVmbGVjdGlvbi5LZXlWYWx1ZSI7CisgIH0KICAgZW51bSBGbGF0QnVmZmVyc1ZUYWJsZU9mZnNldCBGTEFUQlVGRkVSU19WVEFCTEVfVU5ERVJMWUlOR19UWVBFIHsKICAgICBWVF9LRVkgPSA0LAogICAgIFZUX1ZBTFVFID0gNgpAQCAtMzUwLDYgKzQyMywxNSBAQAogICBjb25zdCBmbGF0YnVmZmVyczo6U3RyaW5nICprZXkoKSBjb25zdCB7CiAgICAgcmV0dXJuIEdldFBvaW50ZXI8Y29uc3QgZmxhdGJ1ZmZlcnM6OlN0cmluZyAqPihWVF9LRVkpOwogICB9CisgIGZsYXRidWZmZXJzOjpTdHJpbmcgKm11dGFibGVfa2V5KCkgeworICAgIHJldHVybiBHZXRQb2ludGVyPGZsYXRidWZmZXJzOjpTdHJpbmcgKj4oVlRfS0VZKTsKKyAgfQorICB2b2lkIGNsZWFyX2tleSgpIHsKKyAgICBDbGVhckZpZWxkKFZUX0tFWSk7CisgIH0KKyAgYm9vbCBoYXNfa2V5KCkgY29uc3QgeworICAgIHJldHVybiBDaGVja0ZpZWxkKFZUX0tFWSk7CisgIH0KICAgYm9vbCBLZXlDb21wYXJlTGVzc1RoYW4oY29uc3QgS2V5VmFsdWUgKm8pIGNvbnN0IHsKICAgICByZXR1cm4gKmtleSgpIDwgKm8tPmtleSgpOwogICB9CkBAIC0zNTksNiArNDQxLDE1IEBACiAgIGNvbnN0IGZsYXRidWZmZXJzOjpTdHJpbmcgKnZhbHVlKCkgY29uc3QgewogICAgIHJldHVybiBHZXRQb2ludGVyPGNvbnN0IGZsYXRidWZmZXJzOjpTdHJpbmcgKj4oVlRfVkFMVUUpOwogICB9CisgIGZsYXRidWZmZXJzOjpTdHJpbmcgKm11dGFibGVfdmFsdWUoKSB7CisgICAgcmV0dXJuIEdldFBvaW50ZXI8ZmxhdGJ1ZmZlcnM6OlN0cmluZyAqPihWVF9WQUxVRSk7CisgIH0KKyAgdm9pZCBjbGVhcl92YWx1ZSgpIHsKKyAgICBDbGVhckZpZWxkKFZUX1ZBTFVFKTsKKyAgfQorICBib29sIGhhc192YWx1ZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gQ2hlY2tGaWVsZChWVF9WQUxVRSk7CisgIH0KICAgYm9vbCBWZXJpZnkoZmxhdGJ1ZmZlcnM6OlZlcmlmaWVyICZ2ZXJpZmllcikgY29uc3QgewogICAgIHJldHVybiBWZXJpZnlUYWJsZVN0YXJ0KHZlcmlmaWVyKSAmJgogICAgICAgICAgICBWZXJpZnlPZmZzZXRSZXF1aXJlZCh2ZXJpZmllciwgVlRfS0VZKSAmJgpAQCAtNDI1LDkgKzUxNiwxMiBAQAogCiBzdHJ1Y3QgRW51bVZhbFQgOiBwdWJsaWMgZmxhdGJ1ZmZlcnM6Ok5hdGl2ZVRhYmxlIHsKICAgdHlwZWRlZiBFbnVtVmFsIFRhYmxlVHlwZTsKKyAgc3RhdGljIEZMQVRCVUZGRVJTX0NPTlNURVhQUl9DUFAxMSBjb25zdCBjaGFyICpHZXRGdWxseVF1YWxpZmllZE5hbWUoKSB7CisgICAgcmV0dXJuICJyZWZsZWN0aW9uLkVudW1WYWxUIjsKKyAgfQogICBzdGQ6OnN0cmluZyBuYW1le307CiAgIGludDY0X3QgdmFsdWUgPSAwOwotICBzdGQ6OnVuaXF1ZV9wdHI8cmVmbGVjdGlvbjo6VHlwZVQ+IHVuaW9uX3R5cGV7fTsKKyAgZmxhdGJ1ZmZlcnM6OnVuaXF1ZV9wdHI8cmVmbGVjdGlvbjo6VHlwZVQ+IHVuaW9uX3R5cGV7fTsKICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IGRvY3VtZW50YXRpb257fTsKICAgRW51bVZhbFQoKSA9IGRlZmF1bHQ7CiAgIEVudW1WYWxUKGNvbnN0IEVudW1WYWxUICZvKTsKQEAgLTQ0Miw2ICs1MzYsOSBAQAogICBzdGF0aWMgY29uc3QgZmxhdGJ1ZmZlcnM6OlR5cGVUYWJsZSAqTWluaVJlZmxlY3RUeXBlVGFibGUoKSB7CiAgICAgcmV0dXJuIEVudW1WYWxUeXBlVGFibGUoKTsKICAgfQorICBzdGF0aWMgRkxBVEJVRkZFUlNfQ09OU1RFWFBSX0NQUDExIGNvbnN0IGNoYXIgKkdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpIHsKKyAgICByZXR1cm4gInJlZmxlY3Rpb24uRW51bVZhbCI7CisgIH0KICAgZW51bSBGbGF0QnVmZmVyc1ZUYWJsZU9mZnNldCBGTEFUQlVGRkVSU19WVEFCTEVfVU5ERVJMWUlOR19UWVBFIHsKICAgICBWVF9OQU1FID0gNCwKICAgICBWVF9WQUxVRSA9IDYsCkBAIC00NTEsOSArNTQ4LDI3IEBACiAgIGNvbnN0IGZsYXRidWZmZXJzOjpTdHJpbmcgKm5hbWUoKSBjb25zdCB7CiAgICAgcmV0dXJuIEdldFBvaW50ZXI8Y29uc3QgZmxhdGJ1ZmZlcnM6OlN0cmluZyAqPihWVF9OQU1FKTsKICAgfQorICBmbGF0YnVmZmVyczo6U3RyaW5nICptdXRhYmxlX25hbWUoKSB7CisgICAgcmV0dXJuIEdldFBvaW50ZXI8ZmxhdGJ1ZmZlcnM6OlN0cmluZyAqPihWVF9OQU1FKTsKKyAgfQorICB2b2lkIGNsZWFyX25hbWUoKSB7CisgICAgQ2xlYXJGaWVsZChWVF9OQU1FKTsKKyAgfQorICBib29sIGhhc19uYW1lKCkgY29uc3QgeworICAgIHJldHVybiBDaGVja0ZpZWxkKFZUX05BTUUpOworICB9CiAgIGludDY0X3QgdmFsdWUoKSBjb25zdCB7CiAgICAgcmV0dXJuIEdldEZpZWxkPGludDY0X3Q+KFZUX1ZBTFVFLCAwKTsKICAgfQorICBib29sIG11dGF0ZV92YWx1ZShpbnQ2NF90IF92YWx1ZSA9IDApIHsKKyAgICByZXR1cm4gU2V0RmllbGQ8aW50NjRfdD4oVlRfVkFMVUUsIF92YWx1ZSwgMCk7CisgIH0KKyAgdm9pZCBjbGVhcl92YWx1ZSgpIHsKKyAgICBDbGVhckZpZWxkKFZUX1ZBTFVFKTsKKyAgfQorICBib29sIGhhc192YWx1ZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gQ2hlY2tGaWVsZChWVF9WQUxVRSk7CisgIH0KICAgYm9vbCBLZXlDb21wYXJlTGVzc1RoYW4oY29uc3QgRW51bVZhbCAqbykgY29uc3QgewogICAgIHJldHVybiB2YWx1ZSgpIDwgby0+dmFsdWUoKTsKICAgfQpAQCAtNDYzLDkgKzU3OCwyNyBAQAogICBjb25zdCByZWZsZWN0aW9uOjpUeXBlICp1bmlvbl90eXBlKCkgY29uc3QgewogICAgIHJldHVybiBHZXRQb2ludGVyPGNvbnN0IHJlZmxlY3Rpb246OlR5cGUgKj4oVlRfVU5JT05fVFlQRSk7CiAgIH0KKyAgcmVmbGVjdGlvbjo6VHlwZSAqbXV0YWJsZV91bmlvbl90eXBlKCkgeworICAgIHJldHVybiBHZXRQb2ludGVyPHJlZmxlY3Rpb246OlR5cGUgKj4oVlRfVU5JT05fVFlQRSk7CisgIH0KKyAgdm9pZCBjbGVhcl91bmlvbl90eXBlKCkgeworICAgIENsZWFyRmllbGQoVlRfVU5JT05fVFlQRSk7CisgIH0KKyAgYm9vbCBoYXNfdW5pb25fdHlwZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gQ2hlY2tGaWVsZChWVF9VTklPTl9UWVBFKTsKKyAgfQogICBjb25zdCBmbGF0YnVmZmVyczo6VmVjdG9yPGZsYXRidWZmZXJzOjpPZmZzZXQ8ZmxhdGJ1ZmZlcnM6OlN0cmluZz4+ICpkb2N1bWVudGF0aW9uKCkgY29uc3QgewogICAgIHJldHVybiBHZXRQb2ludGVyPGNvbnN0IGZsYXRidWZmZXJzOjpWZWN0b3I8ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxmbGF0YnVmZmVyczo6U3RyaW5nPj4gKj4oVlRfRE9DVU1FTlRBVElPTik7CiAgIH0KKyAgZmxhdGJ1ZmZlcnM6OlZlY3RvcjxmbGF0YnVmZmVyczo6T2Zmc2V0PGZsYXRidWZmZXJzOjpTdHJpbmc+PiAqbXV0YWJsZV9kb2N1bWVudGF0aW9uKCkgeworICAgIHJldHVybiBHZXRQb2ludGVyPGZsYXRidWZmZXJzOjpWZWN0b3I8ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxmbGF0YnVmZmVyczo6U3RyaW5nPj4gKj4oVlRfRE9DVU1FTlRBVElPTik7CisgIH0KKyAgdm9pZCBjbGVhcl9kb2N1bWVudGF0aW9uKCkgeworICAgIENsZWFyRmllbGQoVlRfRE9DVU1FTlRBVElPTik7CisgIH0KKyAgYm9vbCBoYXNfZG9jdW1lbnRhdGlvbigpIGNvbnN0IHsKKyAgICByZXR1cm4gQ2hlY2tGaWVsZChWVF9ET0NVTUVOVEFUSU9OKTsKKyAgfQogICBib29sIFZlcmlmeShmbGF0YnVmZmVyczo6VmVyaWZpZXIgJnZlcmlmaWVyKSBjb25zdCB7CiAgICAgcmV0dXJuIFZlcmlmeVRhYmxlU3RhcnQodmVyaWZpZXIpICYmCiAgICAgICAgICAgIFZlcmlmeU9mZnNldFJlcXVpcmVkKHZlcmlmaWVyLCBWVF9OQU1FKSAmJgpAQCAtNTUwLDExICs2ODMsMTQgQEAKIAogc3RydWN0IEVudW1UIDogcHVibGljIGZsYXRidWZmZXJzOjpOYXRpdmVUYWJsZSB7CiAgIHR5cGVkZWYgRW51bSBUYWJsZVR5cGU7CisgIHN0YXRpYyBGTEFUQlVGRkVSU19DT05TVEVYUFJfQ1BQMTEgY29uc3QgY2hhciAqR2V0RnVsbHlRdWFsaWZpZWROYW1lKCkgeworICAgIHJldHVybiAicmVmbGVjdGlvbi5FbnVtVCI7CisgIH0KICAgc3RkOjpzdHJpbmcgbmFtZXt9OwotICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8cmVmbGVjdGlvbjo6RW51bVZhbFQ+PiB2YWx1ZXN7fTsKKyAgc3RkOjp2ZWN0b3I8ZmxhdGJ1ZmZlcnM6OnVuaXF1ZV9wdHI8cmVmbGVjdGlvbjo6RW51bVZhbFQ+PiB2YWx1ZXN7fTsKICAgYm9vbCBpc191bmlvbiA9IGZhbHNlOwotICBzdGQ6OnVuaXF1ZV9wdHI8cmVmbGVjdGlvbjo6VHlwZVQ+IHVuZGVybHlpbmdfdHlwZXt9OwotICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8cmVmbGVjdGlvbjo6S2V5VmFsdWVUPj4gYXR0cmlidXRlc3t9OworICBmbGF0YnVmZmVyczo6dW5pcXVlX3B0cjxyZWZsZWN0aW9uOjpUeXBlVD4gdW5kZXJseWluZ190eXBle307CisgIHN0ZDo6dmVjdG9yPGZsYXRidWZmZXJzOjp1bmlxdWVfcHRyPHJlZmxlY3Rpb246OktleVZhbHVlVD4+IGF0dHJpYnV0ZXN7fTsKICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IGRvY3VtZW50YXRpb257fTsKICAgc3RkOjpzdHJpbmcgZGVjbGFyYXRpb25fZmlsZXt9OwogICBFbnVtVCgpID0gZGVmYXVsdDsKQEAgLTU3MCw2ICs3MDYsOSBAQAogICBzdGF0aWMgY29uc3QgZmxhdGJ1ZmZlcnM6OlR5cGVUYWJsZSAqTWluaVJlZmxlY3RUeXBlVGFibGUoKSB7CiAgICAgcmV0dXJuIEVudW1UeXBlVGFibGUoKTsKICAgfQorICBzdGF0aWMgRkxBVEJVRkZFUlNfQ09OU1RFWFBSX0NQUDExIGNvbnN0IGNoYXIgKkdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpIHsKKyAgICByZXR1cm4gInJlZmxlY3Rpb24uRW51bSI7CisgIH0KICAgZW51bSBGbGF0QnVmZmVyc1ZUYWJsZU9mZnNldCBGTEFUQlVGRkVSU19WVEFCTEVfVU5ERVJMWUlOR19UWVBFIHsKICAgICBWVF9OQU1FID0gNCwKICAgICBWVF9WQUxVRVMgPSA2LApAQCAtNTgyLDYgKzcyMSwxNSBAQAogICBjb25zdCBmbGF0YnVmZmVyczo6U3RyaW5nICpuYW1lKCkgY29uc3QgewogICAgIHJldHVybiBHZXRQb2ludGVyPGNvbnN0IGZsYXRidWZmZXJzOjpTdHJpbmcgKj4oVlRfTkFNRSk7CiAgIH0KKyAgZmxhdGJ1ZmZlcnM6OlN0cmluZyAqbXV0YWJsZV9uYW1lKCkgeworICAgIHJldHVybiBHZXRQb2ludGVyPGZsYXRidWZmZXJzOjpTdHJpbmcgKj4oVlRfTkFNRSk7CisgIH0KKyAgdm9pZCBjbGVhcl9uYW1lKCkgeworICAgIENsZWFyRmllbGQoVlRfTkFNRSk7CisgIH0KKyAgYm9vbCBoYXNfbmFtZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gQ2hlY2tGaWVsZChWVF9OQU1FKTsKKyAgfQogICBib29sIEtleUNvbXBhcmVMZXNzVGhhbihjb25zdCBFbnVtICpvKSBjb25zdCB7CiAgICAgcmV0dXJuICpuYW1lKCkgPCAqby0+bmFtZSgpOwogICB9CkBAIC01OTEsMjIgKzczOSw3NiBAQAogICBjb25zdCBmbGF0YnVmZmVyczo6VmVjdG9yPGZsYXRidWZmZXJzOjpPZmZzZXQ8cmVmbGVjdGlvbjo6RW51bVZhbD4+ICp2YWx1ZXMoKSBjb25zdCB7CiAgICAgcmV0dXJuIEdldFBvaW50ZXI8Y29uc3QgZmxhdGJ1ZmZlcnM6OlZlY3RvcjxmbGF0YnVmZmVyczo6T2Zmc2V0PHJlZmxlY3Rpb246OkVudW1WYWw+PiAqPihWVF9WQUxVRVMpOwogICB9CisgIGZsYXRidWZmZXJzOjpWZWN0b3I8ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxyZWZsZWN0aW9uOjpFbnVtVmFsPj4gKm11dGFibGVfdmFsdWVzKCkgeworICAgIHJldHVybiBHZXRQb2ludGVyPGZsYXRidWZmZXJzOjpWZWN0b3I8ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxyZWZsZWN0aW9uOjpFbnVtVmFsPj4gKj4oVlRfVkFMVUVTKTsKKyAgfQorICB2b2lkIGNsZWFyX3ZhbHVlcygpIHsKKyAgICBDbGVhckZpZWxkKFZUX1ZBTFVFUyk7CisgIH0KKyAgYm9vbCBoYXNfdmFsdWVzKCkgY29uc3QgeworICAgIHJldHVybiBDaGVja0ZpZWxkKFZUX1ZBTFVFUyk7CisgIH0KICAgYm9vbCBpc191bmlvbigpIGNvbnN0IHsKICAgICByZXR1cm4gR2V0RmllbGQ8dWludDhfdD4oVlRfSVNfVU5JT04sIDApICE9IDA7CiAgIH0KKyAgYm9vbCBtdXRhdGVfaXNfdW5pb24oYm9vbCBfaXNfdW5pb24gPSAwKSB7CisgICAgcmV0dXJuIFNldEZpZWxkPHVpbnQ4X3Q+KFZUX0lTX1VOSU9OLCBzdGF0aWNfY2FzdDx1aW50OF90PihfaXNfdW5pb24pLCAwKTsKKyAgfQorICB2b2lkIGNsZWFyX2lzX3VuaW9uKCkgeworICAgIENsZWFyRmllbGQoVlRfSVNfVU5JT04pOworICB9CisgIGJvb2wgaGFzX2lzX3VuaW9uKCkgY29uc3QgeworICAgIHJldHVybiBDaGVja0ZpZWxkKFZUX0lTX1VOSU9OKTsKKyAgfQogICBjb25zdCByZWZsZWN0aW9uOjpUeXBlICp1bmRlcmx5aW5nX3R5cGUoKSBjb25zdCB7CiAgICAgcmV0dXJuIEdldFBvaW50ZXI8Y29uc3QgcmVmbGVjdGlvbjo6VHlwZSAqPihWVF9VTkRFUkxZSU5HX1RZUEUpOwogICB9CisgIHJlZmxlY3Rpb246OlR5cGUgKm11dGFibGVfdW5kZXJseWluZ190eXBlKCkgeworICAgIHJldHVybiBHZXRQb2ludGVyPHJlZmxlY3Rpb246OlR5cGUgKj4oVlRfVU5ERVJMWUlOR19UWVBFKTsKKyAgfQorICB2b2lkIGNsZWFyX3VuZGVybHlpbmdfdHlwZSgpIHsKKyAgICBDbGVhckZpZWxkKFZUX1VOREVSTFlJTkdfVFlQRSk7CisgIH0KKyAgYm9vbCBoYXNfdW5kZXJseWluZ190eXBlKCkgY29uc3QgeworICAgIHJldHVybiBDaGVja0ZpZWxkKFZUX1VOREVSTFlJTkdfVFlQRSk7CisgIH0KICAgY29uc3QgZmxhdGJ1ZmZlcnM6OlZlY3RvcjxmbGF0YnVmZmVyczo6T2Zmc2V0PHJlZmxlY3Rpb246OktleVZhbHVlPj4gKmF0dHJpYnV0ZXMoKSBjb25zdCB7CiAgICAgcmV0dXJuIEdldFBvaW50ZXI8Y29uc3QgZmxhdGJ1ZmZlcnM6OlZlY3RvcjxmbGF0YnVmZmVyczo6T2Zmc2V0PHJlZmxlY3Rpb246OktleVZhbHVlPj4gKj4oVlRfQVRUUklCVVRFUyk7CiAgIH0KKyAgZmxhdGJ1ZmZlcnM6OlZlY3RvcjxmbGF0YnVmZmVyczo6T2Zmc2V0PHJlZmxlY3Rpb246OktleVZhbHVlPj4gKm11dGFibGVfYXR0cmlidXRlcygpIHsKKyAgICByZXR1cm4gR2V0UG9pbnRlcjxmbGF0YnVmZmVyczo6VmVjdG9yPGZsYXRidWZmZXJzOjpPZmZzZXQ8cmVmbGVjdGlvbjo6S2V5VmFsdWU+PiAqPihWVF9BVFRSSUJVVEVTKTsKKyAgfQorICB2b2lkIGNsZWFyX2F0dHJpYnV0ZXMoKSB7CisgICAgQ2xlYXJGaWVsZChWVF9BVFRSSUJVVEVTKTsKKyAgfQorICBib29sIGhhc19hdHRyaWJ1dGVzKCkgY29uc3QgeworICAgIHJldHVybiBDaGVja0ZpZWxkKFZUX0FUVFJJQlVURVMpOworICB9CiAgIGNvbnN0IGZsYXRidWZmZXJzOjpWZWN0b3I8ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxmbGF0YnVmZmVyczo6U3RyaW5nPj4gKmRvY3VtZW50YXRpb24oKSBjb25zdCB7CiAgICAgcmV0dXJuIEdldFBvaW50ZXI8Y29uc3QgZmxhdGJ1ZmZlcnM6OlZlY3RvcjxmbGF0YnVmZmVyczo6T2Zmc2V0PGZsYXRidWZmZXJzOjpTdHJpbmc+PiAqPihWVF9ET0NVTUVOVEFUSU9OKTsKICAgfQorICBmbGF0YnVmZmVyczo6VmVjdG9yPGZsYXRidWZmZXJzOjpPZmZzZXQ8ZmxhdGJ1ZmZlcnM6OlN0cmluZz4+ICptdXRhYmxlX2RvY3VtZW50YXRpb24oKSB7CisgICAgcmV0dXJuIEdldFBvaW50ZXI8ZmxhdGJ1ZmZlcnM6OlZlY3RvcjxmbGF0YnVmZmVyczo6T2Zmc2V0PGZsYXRidWZmZXJzOjpTdHJpbmc+PiAqPihWVF9ET0NVTUVOVEFUSU9OKTsKKyAgfQorICB2b2lkIGNsZWFyX2RvY3VtZW50YXRpb24oKSB7CisgICAgQ2xlYXJGaWVsZChWVF9ET0NVTUVOVEFUSU9OKTsKKyAgfQorICBib29sIGhhc19kb2N1bWVudGF0aW9uKCkgY29uc3QgeworICAgIHJldHVybiBDaGVja0ZpZWxkKFZUX0RPQ1VNRU5UQVRJT04pOworICB9CiAgIC8vLyBGaWxlIHRoYXQgdGhpcyBFbnVtIGlzIGRlY2xhcmVkIGluLgogICBjb25zdCBmbGF0YnVmZmVyczo6U3RyaW5nICpkZWNsYXJhdGlvbl9maWxlKCkgY29uc3QgewogICAgIHJldHVybiBHZXRQb2ludGVyPGNvbnN0IGZsYXRidWZmZXJzOjpTdHJpbmcgKj4oVlRfREVDTEFSQVRJT05fRklMRSk7CiAgIH0KKyAgZmxhdGJ1ZmZlcnM6OlN0cmluZyAqbXV0YWJsZV9kZWNsYXJhdGlvbl9maWxlKCkgeworICAgIHJldHVybiBHZXRQb2ludGVyPGZsYXRidWZmZXJzOjpTdHJpbmcgKj4oVlRfREVDTEFSQVRJT05fRklMRSk7CisgIH0KKyAgdm9pZCBjbGVhcl9kZWNsYXJhdGlvbl9maWxlKCkgeworICAgIENsZWFyRmllbGQoVlRfREVDTEFSQVRJT05fRklMRSk7CisgIH0KKyAgYm9vbCBoYXNfZGVjbGFyYXRpb25fZmlsZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gQ2hlY2tGaWVsZChWVF9ERUNMQVJBVElPTl9GSUxFKTsKKyAgfQogICBib29sIFZlcmlmeShmbGF0YnVmZmVyczo6VmVyaWZpZXIgJnZlcmlmaWVyKSBjb25zdCB7CiAgICAgcmV0dXJuIFZlcmlmeVRhYmxlU3RhcnQodmVyaWZpZXIpICYmCiAgICAgICAgICAgIFZlcmlmeU9mZnNldFJlcXVpcmVkKHZlcmlmaWVyLCBWVF9OQU1FKSAmJgpAQCAtNzI1LDggKzkyNywxMSBAQAogCiBzdHJ1Y3QgRmllbGRUIDogcHVibGljIGZsYXRidWZmZXJzOjpOYXRpdmVUYWJsZSB7CiAgIHR5cGVkZWYgRmllbGQgVGFibGVUeXBlOworICBzdGF0aWMgRkxBVEJVRkZFUlNfQ09OU1RFWFBSX0NQUDExIGNvbnN0IGNoYXIgKkdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpIHsKKyAgICByZXR1cm4gInJlZmxlY3Rpb24uRmllbGRUIjsKKyAgfQogICBzdGQ6OnN0cmluZyBuYW1le307Ci0gIHN0ZDo6dW5pcXVlX3B0cjxyZWZsZWN0aW9uOjpUeXBlVD4gdHlwZXt9OworICBmbGF0YnVmZmVyczo6dW5pcXVlX3B0cjxyZWZsZWN0aW9uOjpUeXBlVD4gdHlwZXt9OwogICB1aW50MTZfdCBpZCA9IDA7CiAgIHVpbnQxNl90IG9mZnNldCA9IDA7CiAgIGludDY0X3QgZGVmYXVsdF9pbnRlZ2VyID0gMDsKQEAgLTczNCw3ICs5MzksNyBAQAogICBib29sIGRlcHJlY2F0ZWQgPSBmYWxzZTsKICAgYm9vbCByZXF1aXJlZCA9IGZhbHNlOwogICBib29sIGtleSA9IGZhbHNlOwotICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8cmVmbGVjdGlvbjo6S2V5VmFsdWVUPj4gYXR0cmlidXRlc3t9OworICBzdGQ6OnZlY3RvcjxmbGF0YnVmZmVyczo6dW5pcXVlX3B0cjxyZWZsZWN0aW9uOjpLZXlWYWx1ZVQ+PiBhdHRyaWJ1dGVze307CiAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBkb2N1bWVudGF0aW9ue307CiAgIGJvb2wgb3B0aW9uYWwgPSBmYWxzZTsKICAgdWludDE2X3QgcGFkZGluZyA9IDA7CkBAIC03NTEsNiArOTU2LDkgQEAKICAgc3RhdGljIGNvbnN0IGZsYXRidWZmZXJzOjpUeXBlVGFibGUgKk1pbmlSZWZsZWN0VHlwZVRhYmxlKCkgewogICAgIHJldHVybiBGaWVsZFR5cGVUYWJsZSgpOwogICB9CisgIHN0YXRpYyBGTEFUQlVGRkVSU19DT05TVEVYUFJfQ1BQMTEgY29uc3QgY2hhciAqR2V0RnVsbHlRdWFsaWZpZWROYW1lKCkgeworICAgIHJldHVybiAicmVmbGVjdGlvbi5GaWVsZCI7CisgIH0KICAgZW51bSBGbGF0QnVmZmVyc1ZUYWJsZU9mZnNldCBGTEFUQlVGRkVSU19WVEFCTEVfVU5ERVJMWUlOR19UWVBFIHsKICAgICBWVF9OQU1FID0gNCwKICAgICBWVF9UWVBFID0gNiwKQEAgLTc2OSw2ICs5NzcsMTUgQEAKICAgY29uc3QgZmxhdGJ1ZmZlcnM6OlN0cmluZyAqbmFtZSgpIGNvbnN0IHsKICAgICByZXR1cm4gR2V0UG9pbnRlcjxjb25zdCBmbGF0YnVmZmVyczo6U3RyaW5nICo+KFZUX05BTUUpOwogICB9CisgIGZsYXRidWZmZXJzOjpTdHJpbmcgKm11dGFibGVfbmFtZSgpIHsKKyAgICByZXR1cm4gR2V0UG9pbnRlcjxmbGF0YnVmZmVyczo6U3RyaW5nICo+KFZUX05BTUUpOworICB9CisgIHZvaWQgY2xlYXJfbmFtZSgpIHsKKyAgICBDbGVhckZpZWxkKFZUX05BTUUpOworICB9CisgIGJvb2wgaGFzX25hbWUoKSBjb25zdCB7CisgICAgcmV0dXJuIENoZWNrRmllbGQoVlRfTkFNRSk7CisgIH0KICAgYm9vbCBLZXlDb21wYXJlTGVzc1RoYW4oY29uc3QgRmllbGQgKm8pIGNvbnN0IHsKICAgICByZXR1cm4gKm5hbWUoKSA8ICpvLT5uYW1lKCk7CiAgIH0KQEAgLTc3OCw0MCArOTk1LDE0OCBAQAogICBjb25zdCByZWZsZWN0aW9uOjpUeXBlICp0eXBlKCkgY29uc3QgewogICAgIHJldHVybiBHZXRQb2ludGVyPGNvbnN0IHJlZmxlY3Rpb246OlR5cGUgKj4oVlRfVFlQRSk7CiAgIH0KKyAgcmVmbGVjdGlvbjo6VHlwZSAqbXV0YWJsZV90eXBlKCkgeworICAgIHJldHVybiBHZXRQb2ludGVyPHJlZmxlY3Rpb246OlR5cGUgKj4oVlRfVFlQRSk7CisgIH0KKyAgdm9pZCBjbGVhcl90eXBlKCkgeworICAgIENsZWFyRmllbGQoVlRfVFlQRSk7CisgIH0KKyAgYm9vbCBoYXNfdHlwZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gQ2hlY2tGaWVsZChWVF9UWVBFKTsKKyAgfQogICB1aW50MTZfdCBpZCgpIGNvbnN0IHsKICAgICByZXR1cm4gR2V0RmllbGQ8dWludDE2X3Q+KFZUX0lELCAwKTsKICAgfQorICBib29sIG11dGF0ZV9pZCh1aW50MTZfdCBfaWQgPSAwKSB7CisgICAgcmV0dXJuIFNldEZpZWxkPHVpbnQxNl90PihWVF9JRCwgX2lkLCAwKTsKKyAgfQorICB2b2lkIGNsZWFyX2lkKCkgeworICAgIENsZWFyRmllbGQoVlRfSUQpOworICB9CisgIGJvb2wgaGFzX2lkKCkgY29uc3QgeworICAgIHJldHVybiBDaGVja0ZpZWxkKFZUX0lEKTsKKyAgfQogICB1aW50MTZfdCBvZmZzZXQoKSBjb25zdCB7CiAgICAgcmV0dXJuIEdldEZpZWxkPHVpbnQxNl90PihWVF9PRkZTRVQsIDApOwogICB9CisgIGJvb2wgbXV0YXRlX29mZnNldCh1aW50MTZfdCBfb2Zmc2V0ID0gMCkgeworICAgIHJldHVybiBTZXRGaWVsZDx1aW50MTZfdD4oVlRfT0ZGU0VULCBfb2Zmc2V0LCAwKTsKKyAgfQorICB2b2lkIGNsZWFyX29mZnNldCgpIHsKKyAgICBDbGVhckZpZWxkKFZUX09GRlNFVCk7CisgIH0KKyAgYm9vbCBoYXNfb2Zmc2V0KCkgY29uc3QgeworICAgIHJldHVybiBDaGVja0ZpZWxkKFZUX09GRlNFVCk7CisgIH0KICAgaW50NjRfdCBkZWZhdWx0X2ludGVnZXIoKSBjb25zdCB7CiAgICAgcmV0dXJuIEdldEZpZWxkPGludDY0X3Q+KFZUX0RFRkFVTFRfSU5URUdFUiwgMCk7CiAgIH0KKyAgYm9vbCBtdXRhdGVfZGVmYXVsdF9pbnRlZ2VyKGludDY0X3QgX2RlZmF1bHRfaW50ZWdlciA9IDApIHsKKyAgICByZXR1cm4gU2V0RmllbGQ8aW50NjRfdD4oVlRfREVGQVVMVF9JTlRFR0VSLCBfZGVmYXVsdF9pbnRlZ2VyLCAwKTsKKyAgfQorICB2b2lkIGNsZWFyX2RlZmF1bHRfaW50ZWdlcigpIHsKKyAgICBDbGVhckZpZWxkKFZUX0RFRkFVTFRfSU5URUdFUik7CisgIH0KKyAgYm9vbCBoYXNfZGVmYXVsdF9pbnRlZ2VyKCkgY29uc3QgeworICAgIHJldHVybiBDaGVja0ZpZWxkKFZUX0RFRkFVTFRfSU5URUdFUik7CisgIH0KICAgZG91YmxlIGRlZmF1bHRfcmVhbCgpIGNvbnN0IHsKICAgICByZXR1cm4gR2V0RmllbGQ8ZG91YmxlPihWVF9ERUZBVUxUX1JFQUwsIDAuMCk7CiAgIH0KKyAgYm9vbCBtdXRhdGVfZGVmYXVsdF9yZWFsKGRvdWJsZSBfZGVmYXVsdF9yZWFsID0gMC4wKSB7CisgICAgcmV0dXJuIFNldEZpZWxkPGRvdWJsZT4oVlRfREVGQVVMVF9SRUFMLCBfZGVmYXVsdF9yZWFsLCAwLjApOworICB9CisgIHZvaWQgY2xlYXJfZGVmYXVsdF9yZWFsKCkgeworICAgIENsZWFyRmllbGQoVlRfREVGQVVMVF9SRUFMKTsKKyAgfQorICBib29sIGhhc19kZWZhdWx0X3JlYWwoKSBjb25zdCB7CisgICAgcmV0dXJuIENoZWNrRmllbGQoVlRfREVGQVVMVF9SRUFMKTsKKyAgfQogICBib29sIGRlcHJlY2F0ZWQoKSBjb25zdCB7CiAgICAgcmV0dXJuIEdldEZpZWxkPHVpbnQ4X3Q+KFZUX0RFUFJFQ0FURUQsIDApICE9IDA7CiAgIH0KKyAgYm9vbCBtdXRhdGVfZGVwcmVjYXRlZChib29sIF9kZXByZWNhdGVkID0gMCkgeworICAgIHJldHVybiBTZXRGaWVsZDx1aW50OF90PihWVF9ERVBSRUNBVEVELCBzdGF0aWNfY2FzdDx1aW50OF90PihfZGVwcmVjYXRlZCksIDApOworICB9CisgIHZvaWQgY2xlYXJfZGVwcmVjYXRlZCgpIHsKKyAgICBDbGVhckZpZWxkKFZUX0RFUFJFQ0FURUQpOworICB9CisgIGJvb2wgaGFzX2RlcHJlY2F0ZWQoKSBjb25zdCB7CisgICAgcmV0dXJuIENoZWNrRmllbGQoVlRfREVQUkVDQVRFRCk7CisgIH0KICAgYm9vbCByZXF1aXJlZCgpIGNvbnN0IHsKICAgICByZXR1cm4gR2V0RmllbGQ8dWludDhfdD4oVlRfUkVRVUlSRUQsIDApICE9IDA7CiAgIH0KKyAgYm9vbCBtdXRhdGVfcmVxdWlyZWQoYm9vbCBfcmVxdWlyZWQgPSAwKSB7CisgICAgcmV0dXJuIFNldEZpZWxkPHVpbnQ4X3Q+KFZUX1JFUVVJUkVELCBzdGF0aWNfY2FzdDx1aW50OF90PihfcmVxdWlyZWQpLCAwKTsKKyAgfQorICB2b2lkIGNsZWFyX3JlcXVpcmVkKCkgeworICAgIENsZWFyRmllbGQoVlRfUkVRVUlSRUQpOworICB9CisgIGJvb2wgaGFzX3JlcXVpcmVkKCkgY29uc3QgeworICAgIHJldHVybiBDaGVja0ZpZWxkKFZUX1JFUVVJUkVEKTsKKyAgfQogICBib29sIGtleSgpIGNvbnN0IHsKICAgICByZXR1cm4gR2V0RmllbGQ8dWludDhfdD4oVlRfS0VZLCAwKSAhPSAwOwogICB9CisgIGJvb2wgbXV0YXRlX2tleShib29sIF9rZXkgPSAwKSB7CisgICAgcmV0dXJuIFNldEZpZWxkPHVpbnQ4X3Q+KFZUX0tFWSwgc3RhdGljX2Nhc3Q8dWludDhfdD4oX2tleSksIDApOworICB9CisgIHZvaWQgY2xlYXJfa2V5KCkgeworICAgIENsZWFyRmllbGQoVlRfS0VZKTsKKyAgfQorICBib29sIGhhc19rZXkoKSBjb25zdCB7CisgICAgcmV0dXJuIENoZWNrRmllbGQoVlRfS0VZKTsKKyAgfQogICBjb25zdCBmbGF0YnVmZmVyczo6VmVjdG9yPGZsYXRidWZmZXJzOjpPZmZzZXQ8cmVmbGVjdGlvbjo6S2V5VmFsdWU+PiAqYXR0cmlidXRlcygpIGNvbnN0IHsKICAgICByZXR1cm4gR2V0UG9pbnRlcjxjb25zdCBmbGF0YnVmZmVyczo6VmVjdG9yPGZsYXRidWZmZXJzOjpPZmZzZXQ8cmVmbGVjdGlvbjo6S2V5VmFsdWU+PiAqPihWVF9BVFRSSUJVVEVTKTsKICAgfQorICBmbGF0YnVmZmVyczo6VmVjdG9yPGZsYXRidWZmZXJzOjpPZmZzZXQ8cmVmbGVjdGlvbjo6S2V5VmFsdWU+PiAqbXV0YWJsZV9hdHRyaWJ1dGVzKCkgeworICAgIHJldHVybiBHZXRQb2ludGVyPGZsYXRidWZmZXJzOjpWZWN0b3I8ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxyZWZsZWN0aW9uOjpLZXlWYWx1ZT4+ICo+KFZUX0FUVFJJQlVURVMpOworICB9CisgIHZvaWQgY2xlYXJfYXR0cmlidXRlcygpIHsKKyAgICBDbGVhckZpZWxkKFZUX0FUVFJJQlVURVMpOworICB9CisgIGJvb2wgaGFzX2F0dHJpYnV0ZXMoKSBjb25zdCB7CisgICAgcmV0dXJuIENoZWNrRmllbGQoVlRfQVRUUklCVVRFUyk7CisgIH0KICAgY29uc3QgZmxhdGJ1ZmZlcnM6OlZlY3RvcjxmbGF0YnVmZmVyczo6T2Zmc2V0PGZsYXRidWZmZXJzOjpTdHJpbmc+PiAqZG9jdW1lbnRhdGlvbigpIGNvbnN0IHsKICAgICByZXR1cm4gR2V0UG9pbnRlcjxjb25zdCBmbGF0YnVmZmVyczo6VmVjdG9yPGZsYXRidWZmZXJzOjpPZmZzZXQ8ZmxhdGJ1ZmZlcnM6OlN0cmluZz4+ICo+KFZUX0RPQ1VNRU5UQVRJT04pOwogICB9CisgIGZsYXRidWZmZXJzOjpWZWN0b3I8ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxmbGF0YnVmZmVyczo6U3RyaW5nPj4gKm11dGFibGVfZG9jdW1lbnRhdGlvbigpIHsKKyAgICByZXR1cm4gR2V0UG9pbnRlcjxmbGF0YnVmZmVyczo6VmVjdG9yPGZsYXRidWZmZXJzOjpPZmZzZXQ8ZmxhdGJ1ZmZlcnM6OlN0cmluZz4+ICo+KFZUX0RPQ1VNRU5UQVRJT04pOworICB9CisgIHZvaWQgY2xlYXJfZG9jdW1lbnRhdGlvbigpIHsKKyAgICBDbGVhckZpZWxkKFZUX0RPQ1VNRU5UQVRJT04pOworICB9CisgIGJvb2wgaGFzX2RvY3VtZW50YXRpb24oKSBjb25zdCB7CisgICAgcmV0dXJuIENoZWNrRmllbGQoVlRfRE9DVU1FTlRBVElPTik7CisgIH0KICAgYm9vbCBvcHRpb25hbCgpIGNvbnN0IHsKICAgICByZXR1cm4gR2V0RmllbGQ8dWludDhfdD4oVlRfT1BUSU9OQUwsIDApICE9IDA7CiAgIH0KKyAgYm9vbCBtdXRhdGVfb3B0aW9uYWwoYm9vbCBfb3B0aW9uYWwgPSAwKSB7CisgICAgcmV0dXJuIFNldEZpZWxkPHVpbnQ4X3Q+KFZUX09QVElPTkFMLCBzdGF0aWNfY2FzdDx1aW50OF90Pihfb3B0aW9uYWwpLCAwKTsKKyAgfQorICB2b2lkIGNsZWFyX29wdGlvbmFsKCkgeworICAgIENsZWFyRmllbGQoVlRfT1BUSU9OQUwpOworICB9CisgIGJvb2wgaGFzX29wdGlvbmFsKCkgY29uc3QgeworICAgIHJldHVybiBDaGVja0ZpZWxkKFZUX09QVElPTkFMKTsKKyAgfQogICAvLy8gTnVtYmVyIG9mIHBhZGRpbmcgb2N0ZXRzIHRvIGFsd2F5cyBhZGQgYWZ0ZXIgdGhpcyBmaWVsZC4gU3RydWN0cyBvbmx5LgogICB1aW50MTZfdCBwYWRkaW5nKCkgY29uc3QgewogICAgIHJldHVybiBHZXRGaWVsZDx1aW50MTZfdD4oVlRfUEFERElORywgMCk7CiAgIH0KKyAgYm9vbCBtdXRhdGVfcGFkZGluZyh1aW50MTZfdCBfcGFkZGluZyA9IDApIHsKKyAgICByZXR1cm4gU2V0RmllbGQ8dWludDE2X3Q+KFZUX1BBRERJTkcsIF9wYWRkaW5nLCAwKTsKKyAgfQorICB2b2lkIGNsZWFyX3BhZGRpbmcoKSB7CisgICAgQ2xlYXJGaWVsZChWVF9QQURESU5HKTsKKyAgfQorICBib29sIGhhc19wYWRkaW5nKCkgY29uc3QgeworICAgIHJldHVybiBDaGVja0ZpZWxkKFZUX1BBRERJTkcpOworICB9CiAgIGJvb2wgVmVyaWZ5KGZsYXRidWZmZXJzOjpWZXJpZmllciAmdmVyaWZpZXIpIGNvbnN0IHsKICAgICByZXR1cm4gVmVyaWZ5VGFibGVTdGFydCh2ZXJpZmllcikgJiYKICAgICAgICAgICAgVmVyaWZ5T2Zmc2V0UmVxdWlyZWQodmVyaWZpZXIsIFZUX05BTUUpICYmCkBAIC05NzIsMTIgKzEyOTcsMTUgQEAKIAogc3RydWN0IE9iamVjdFQgOiBwdWJsaWMgZmxhdGJ1ZmZlcnM6Ok5hdGl2ZVRhYmxlIHsKICAgdHlwZWRlZiBPYmplY3QgVGFibGVUeXBlOworICBzdGF0aWMgRkxBVEJVRkZFUlNfQ09OU1RFWFBSX0NQUDExIGNvbnN0IGNoYXIgKkdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpIHsKKyAgICByZXR1cm4gInJlZmxlY3Rpb24uT2JqZWN0VCI7CisgIH0KICAgc3RkOjpzdHJpbmcgbmFtZXt9OwotICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8cmVmbGVjdGlvbjo6RmllbGRUPj4gZmllbGRze307CisgIHN0ZDo6dmVjdG9yPGZsYXRidWZmZXJzOjp1bmlxdWVfcHRyPHJlZmxlY3Rpb246OkZpZWxkVD4+IGZpZWxkc3t9OwogICBib29sIGlzX3N0cnVjdCA9IGZhbHNlOwogICBpbnQzMl90IG1pbmFsaWduID0gMDsKICAgaW50MzJfdCBieXRlc2l6ZSA9IDA7Ci0gIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxyZWZsZWN0aW9uOjpLZXlWYWx1ZVQ+PiBhdHRyaWJ1dGVze307CisgIHN0ZDo6dmVjdG9yPGZsYXRidWZmZXJzOjp1bmlxdWVfcHRyPHJlZmxlY3Rpb246OktleVZhbHVlVD4+IGF0dHJpYnV0ZXN7fTsKICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IGRvY3VtZW50YXRpb257fTsKICAgc3RkOjpzdHJpbmcgZGVjbGFyYXRpb25fZmlsZXt9OwogICBPYmplY3RUKCkgPSBkZWZhdWx0OwpAQCAtOTkzLDYgKzEzMjEsOSBAQAogICBzdGF0aWMgY29uc3QgZmxhdGJ1ZmZlcnM6OlR5cGVUYWJsZSAqTWluaVJlZmxlY3RUeXBlVGFibGUoKSB7CiAgICAgcmV0dXJuIE9iamVjdFR5cGVUYWJsZSgpOwogICB9CisgIHN0YXRpYyBGTEFUQlVGRkVSU19DT05TVEVYUFJfQ1BQMTEgY29uc3QgY2hhciAqR2V0RnVsbHlRdWFsaWZpZWROYW1lKCkgeworICAgIHJldHVybiAicmVmbGVjdGlvbi5PYmplY3QiOworICB9CiAgIGVudW0gRmxhdEJ1ZmZlcnNWVGFibGVPZmZzZXQgRkxBVEJVRkZFUlNfVlRBQkxFX1VOREVSTFlJTkdfVFlQRSB7CiAgICAgVlRfTkFNRSA9IDQsCiAgICAgVlRfRklFTERTID0gNiwKQEAgLTEwMDYsNiArMTMzNywxNSBAQAogICBjb25zdCBmbGF0YnVmZmVyczo6U3RyaW5nICpuYW1lKCkgY29uc3QgewogICAgIHJldHVybiBHZXRQb2ludGVyPGNvbnN0IGZsYXRidWZmZXJzOjpTdHJpbmcgKj4oVlRfTkFNRSk7CiAgIH0KKyAgZmxhdGJ1ZmZlcnM6OlN0cmluZyAqbXV0YWJsZV9uYW1lKCkgeworICAgIHJldHVybiBHZXRQb2ludGVyPGZsYXRidWZmZXJzOjpTdHJpbmcgKj4oVlRfTkFNRSk7CisgIH0KKyAgdm9pZCBjbGVhcl9uYW1lKCkgeworICAgIENsZWFyRmllbGQoVlRfTkFNRSk7CisgIH0KKyAgYm9vbCBoYXNfbmFtZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gQ2hlY2tGaWVsZChWVF9OQU1FKTsKKyAgfQogICBib29sIEtleUNvbXBhcmVMZXNzVGhhbihjb25zdCBPYmplY3QgKm8pIGNvbnN0IHsKICAgICByZXR1cm4gKm5hbWUoKSA8ICpvLT5uYW1lKCk7CiAgIH0KQEAgLTEwMTUsMjUgKzEzNTUsODggQEAKICAgY29uc3QgZmxhdGJ1ZmZlcnM6OlZlY3RvcjxmbGF0YnVmZmVyczo6T2Zmc2V0PHJlZmxlY3Rpb246OkZpZWxkPj4gKmZpZWxkcygpIGNvbnN0IHsKICAgICByZXR1cm4gR2V0UG9pbnRlcjxjb25zdCBmbGF0YnVmZmVyczo6VmVjdG9yPGZsYXRidWZmZXJzOjpPZmZzZXQ8cmVmbGVjdGlvbjo6RmllbGQ+PiAqPihWVF9GSUVMRFMpOwogICB9CisgIGZsYXRidWZmZXJzOjpWZWN0b3I8ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxyZWZsZWN0aW9uOjpGaWVsZD4+ICptdXRhYmxlX2ZpZWxkcygpIHsKKyAgICByZXR1cm4gR2V0UG9pbnRlcjxmbGF0YnVmZmVyczo6VmVjdG9yPGZsYXRidWZmZXJzOjpPZmZzZXQ8cmVmbGVjdGlvbjo6RmllbGQ+PiAqPihWVF9GSUVMRFMpOworICB9CisgIHZvaWQgY2xlYXJfZmllbGRzKCkgeworICAgIENsZWFyRmllbGQoVlRfRklFTERTKTsKKyAgfQorICBib29sIGhhc19maWVsZHMoKSBjb25zdCB7CisgICAgcmV0dXJuIENoZWNrRmllbGQoVlRfRklFTERTKTsKKyAgfQogICBib29sIGlzX3N0cnVjdCgpIGNvbnN0IHsKICAgICByZXR1cm4gR2V0RmllbGQ8dWludDhfdD4oVlRfSVNfU1RSVUNULCAwKSAhPSAwOwogICB9CisgIGJvb2wgbXV0YXRlX2lzX3N0cnVjdChib29sIF9pc19zdHJ1Y3QgPSAwKSB7CisgICAgcmV0dXJuIFNldEZpZWxkPHVpbnQ4X3Q+KFZUX0lTX1NUUlVDVCwgc3RhdGljX2Nhc3Q8dWludDhfdD4oX2lzX3N0cnVjdCksIDApOworICB9CisgIHZvaWQgY2xlYXJfaXNfc3RydWN0KCkgeworICAgIENsZWFyRmllbGQoVlRfSVNfU1RSVUNUKTsKKyAgfQorICBib29sIGhhc19pc19zdHJ1Y3QoKSBjb25zdCB7CisgICAgcmV0dXJuIENoZWNrRmllbGQoVlRfSVNfU1RSVUNUKTsKKyAgfQogICBpbnQzMl90IG1pbmFsaWduKCkgY29uc3QgewogICAgIHJldHVybiBHZXRGaWVsZDxpbnQzMl90PihWVF9NSU5BTElHTiwgMCk7CiAgIH0KKyAgYm9vbCBtdXRhdGVfbWluYWxpZ24oaW50MzJfdCBfbWluYWxpZ24gPSAwKSB7CisgICAgcmV0dXJuIFNldEZpZWxkPGludDMyX3Q+KFZUX01JTkFMSUdOLCBfbWluYWxpZ24sIDApOworICB9CisgIHZvaWQgY2xlYXJfbWluYWxpZ24oKSB7CisgICAgQ2xlYXJGaWVsZChWVF9NSU5BTElHTik7CisgIH0KKyAgYm9vbCBoYXNfbWluYWxpZ24oKSBjb25zdCB7CisgICAgcmV0dXJuIENoZWNrRmllbGQoVlRfTUlOQUxJR04pOworICB9CiAgIGludDMyX3QgYnl0ZXNpemUoKSBjb25zdCB7CiAgICAgcmV0dXJuIEdldEZpZWxkPGludDMyX3Q+KFZUX0JZVEVTSVpFLCAwKTsKICAgfQorICBib29sIG11dGF0ZV9ieXRlc2l6ZShpbnQzMl90IF9ieXRlc2l6ZSA9IDApIHsKKyAgICByZXR1cm4gU2V0RmllbGQ8aW50MzJfdD4oVlRfQllURVNJWkUsIF9ieXRlc2l6ZSwgMCk7CisgIH0KKyAgdm9pZCBjbGVhcl9ieXRlc2l6ZSgpIHsKKyAgICBDbGVhckZpZWxkKFZUX0JZVEVTSVpFKTsKKyAgfQorICBib29sIGhhc19ieXRlc2l6ZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gQ2hlY2tGaWVsZChWVF9CWVRFU0laRSk7CisgIH0KICAgY29uc3QgZmxhdGJ1ZmZlcnM6OlZlY3RvcjxmbGF0YnVmZmVyczo6T2Zmc2V0PHJlZmxlY3Rpb246OktleVZhbHVlPj4gKmF0dHJpYnV0ZXMoKSBjb25zdCB7CiAgICAgcmV0dXJuIEdldFBvaW50ZXI8Y29uc3QgZmxhdGJ1ZmZlcnM6OlZlY3RvcjxmbGF0YnVmZmVyczo6T2Zmc2V0PHJlZmxlY3Rpb246OktleVZhbHVlPj4gKj4oVlRfQVRUUklCVVRFUyk7CiAgIH0KKyAgZmxhdGJ1ZmZlcnM6OlZlY3RvcjxmbGF0YnVmZmVyczo6T2Zmc2V0PHJlZmxlY3Rpb246OktleVZhbHVlPj4gKm11dGFibGVfYXR0cmlidXRlcygpIHsKKyAgICByZXR1cm4gR2V0UG9pbnRlcjxmbGF0YnVmZmVyczo6VmVjdG9yPGZsYXRidWZmZXJzOjpPZmZzZXQ8cmVmbGVjdGlvbjo6S2V5VmFsdWU+PiAqPihWVF9BVFRSSUJVVEVTKTsKKyAgfQorICB2b2lkIGNsZWFyX2F0dHJpYnV0ZXMoKSB7CisgICAgQ2xlYXJGaWVsZChWVF9BVFRSSUJVVEVTKTsKKyAgfQorICBib29sIGhhc19hdHRyaWJ1dGVzKCkgY29uc3QgeworICAgIHJldHVybiBDaGVja0ZpZWxkKFZUX0FUVFJJQlVURVMpOworICB9CiAgIGNvbnN0IGZsYXRidWZmZXJzOjpWZWN0b3I8ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxmbGF0YnVmZmVyczo6U3RyaW5nPj4gKmRvY3VtZW50YXRpb24oKSBjb25zdCB7CiAgICAgcmV0dXJuIEdldFBvaW50ZXI8Y29uc3QgZmxhdGJ1ZmZlcnM6OlZlY3RvcjxmbGF0YnVmZmVyczo6T2Zmc2V0PGZsYXRidWZmZXJzOjpTdHJpbmc+PiAqPihWVF9ET0NVTUVOVEFUSU9OKTsKICAgfQorICBmbGF0YnVmZmVyczo6VmVjdG9yPGZsYXRidWZmZXJzOjpPZmZzZXQ8ZmxhdGJ1ZmZlcnM6OlN0cmluZz4+ICptdXRhYmxlX2RvY3VtZW50YXRpb24oKSB7CisgICAgcmV0dXJuIEdldFBvaW50ZXI8ZmxhdGJ1ZmZlcnM6OlZlY3RvcjxmbGF0YnVmZmVyczo6T2Zmc2V0PGZsYXRidWZmZXJzOjpTdHJpbmc+PiAqPihWVF9ET0NVTUVOVEFUSU9OKTsKKyAgfQorICB2b2lkIGNsZWFyX2RvY3VtZW50YXRpb24oKSB7CisgICAgQ2xlYXJGaWVsZChWVF9ET0NVTUVOVEFUSU9OKTsKKyAgfQorICBib29sIGhhc19kb2N1bWVudGF0aW9uKCkgY29uc3QgeworICAgIHJldHVybiBDaGVja0ZpZWxkKFZUX0RPQ1VNRU5UQVRJT04pOworICB9CiAgIC8vLyBGaWxlIHRoYXQgdGhpcyBPYmplY3QgaXMgZGVjbGFyZWQgaW4uCiAgIGNvbnN0IGZsYXRidWZmZXJzOjpTdHJpbmcgKmRlY2xhcmF0aW9uX2ZpbGUoKSBjb25zdCB7CiAgICAgcmV0dXJuIEdldFBvaW50ZXI8Y29uc3QgZmxhdGJ1ZmZlcnM6OlN0cmluZyAqPihWVF9ERUNMQVJBVElPTl9GSUxFKTsKICAgfQorICBmbGF0YnVmZmVyczo6U3RyaW5nICptdXRhYmxlX2RlY2xhcmF0aW9uX2ZpbGUoKSB7CisgICAgcmV0dXJuIEdldFBvaW50ZXI8ZmxhdGJ1ZmZlcnM6OlN0cmluZyAqPihWVF9ERUNMQVJBVElPTl9GSUxFKTsKKyAgfQorICB2b2lkIGNsZWFyX2RlY2xhcmF0aW9uX2ZpbGUoKSB7CisgICAgQ2xlYXJGaWVsZChWVF9ERUNMQVJBVElPTl9GSUxFKTsKKyAgfQorICBib29sIGhhc19kZWNsYXJhdGlvbl9maWxlKCkgY29uc3QgeworICAgIHJldHVybiBDaGVja0ZpZWxkKFZUX0RFQ0xBUkFUSU9OX0ZJTEUpOworICB9CiAgIGJvb2wgVmVyaWZ5KGZsYXRidWZmZXJzOjpWZXJpZmllciAmdmVyaWZpZXIpIGNvbnN0IHsKICAgICByZXR1cm4gVmVyaWZ5VGFibGVTdGFydCh2ZXJpZmllcikgJiYKICAgICAgICAgICAgVmVyaWZ5T2Zmc2V0UmVxdWlyZWQodmVyaWZpZXIsIFZUX05BTUUpICYmCkBAIC0xMTU4LDEwICsxNTYxLDEzIEBACiAKIHN0cnVjdCBSUENDYWxsVCA6IHB1YmxpYyBmbGF0YnVmZmVyczo6TmF0aXZlVGFibGUgewogICB0eXBlZGVmIFJQQ0NhbGwgVGFibGVUeXBlOworICBzdGF0aWMgRkxBVEJVRkZFUlNfQ09OU1RFWFBSX0NQUDExIGNvbnN0IGNoYXIgKkdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpIHsKKyAgICByZXR1cm4gInJlZmxlY3Rpb24uUlBDQ2FsbFQiOworICB9CiAgIHN0ZDo6c3RyaW5nIG5hbWV7fTsKLSAgc3RkOjp1bmlxdWVfcHRyPHJlZmxlY3Rpb246Ok9iamVjdFQ+IHJlcXVlc3R7fTsKLSAgc3RkOjp1bmlxdWVfcHRyPHJlZmxlY3Rpb246Ok9iamVjdFQ+IHJlc3BvbnNle307Ci0gIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxyZWZsZWN0aW9uOjpLZXlWYWx1ZVQ+PiBhdHRyaWJ1dGVze307CisgIGZsYXRidWZmZXJzOjp1bmlxdWVfcHRyPHJlZmxlY3Rpb246Ok9iamVjdFQ+IHJlcXVlc3R7fTsKKyAgZmxhdGJ1ZmZlcnM6OnVuaXF1ZV9wdHI8cmVmbGVjdGlvbjo6T2JqZWN0VD4gcmVzcG9uc2V7fTsKKyAgc3RkOjp2ZWN0b3I8ZmxhdGJ1ZmZlcnM6OnVuaXF1ZV9wdHI8cmVmbGVjdGlvbjo6S2V5VmFsdWVUPj4gYXR0cmlidXRlc3t9OwogICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gZG9jdW1lbnRhdGlvbnt9OwogICBSUENDYWxsVCgpID0gZGVmYXVsdDsKICAgUlBDQ2FsbFQoY29uc3QgUlBDQ2FsbFQgJm8pOwpAQCAtMTE3Niw2ICsxNTgyLDkgQEAKICAgc3RhdGljIGNvbnN0IGZsYXRidWZmZXJzOjpUeXBlVGFibGUgKk1pbmlSZWZsZWN0VHlwZVRhYmxlKCkgewogICAgIHJldHVybiBSUENDYWxsVHlwZVRhYmxlKCk7CiAgIH0KKyAgc3RhdGljIEZMQVRCVUZGRVJTX0NPTlNURVhQUl9DUFAxMSBjb25zdCBjaGFyICpHZXRGdWxseVF1YWxpZmllZE5hbWUoKSB7CisgICAgcmV0dXJuICJyZWZsZWN0aW9uLlJQQ0NhbGwiOworICB9CiAgIGVudW0gRmxhdEJ1ZmZlcnNWVGFibGVPZmZzZXQgRkxBVEJVRkZFUlNfVlRBQkxFX1VOREVSTFlJTkdfVFlQRSB7CiAgICAgVlRfTkFNRSA9IDQsCiAgICAgVlRfUkVRVUVTVCA9IDYsCkBAIC0xMTg2LDYgKzE1OTUsMTUgQEAKICAgY29uc3QgZmxhdGJ1ZmZlcnM6OlN0cmluZyAqbmFtZSgpIGNvbnN0IHsKICAgICByZXR1cm4gR2V0UG9pbnRlcjxjb25zdCBmbGF0YnVmZmVyczo6U3RyaW5nICo+KFZUX05BTUUpOwogICB9CisgIGZsYXRidWZmZXJzOjpTdHJpbmcgKm11dGFibGVfbmFtZSgpIHsKKyAgICByZXR1cm4gR2V0UG9pbnRlcjxmbGF0YnVmZmVyczo6U3RyaW5nICo+KFZUX05BTUUpOworICB9CisgIHZvaWQgY2xlYXJfbmFtZSgpIHsKKyAgICBDbGVhckZpZWxkKFZUX05BTUUpOworICB9CisgIGJvb2wgaGFzX25hbWUoKSBjb25zdCB7CisgICAgcmV0dXJuIENoZWNrRmllbGQoVlRfTkFNRSk7CisgIH0KICAgYm9vbCBLZXlDb21wYXJlTGVzc1RoYW4oY29uc3QgUlBDQ2FsbCAqbykgY29uc3QgewogICAgIHJldHVybiAqbmFtZSgpIDwgKm8tPm5hbWUoKTsKICAgfQpAQCAtMTE5NSwxNSArMTYxMyw1MSBAQAogICBjb25zdCByZWZsZWN0aW9uOjpPYmplY3QgKnJlcXVlc3QoKSBjb25zdCB7CiAgICAgcmV0dXJuIEdldFBvaW50ZXI8Y29uc3QgcmVmbGVjdGlvbjo6T2JqZWN0ICo+KFZUX1JFUVVFU1QpOwogICB9CisgIHJlZmxlY3Rpb246Ok9iamVjdCAqbXV0YWJsZV9yZXF1ZXN0KCkgeworICAgIHJldHVybiBHZXRQb2ludGVyPHJlZmxlY3Rpb246Ok9iamVjdCAqPihWVF9SRVFVRVNUKTsKKyAgfQorICB2b2lkIGNsZWFyX3JlcXVlc3QoKSB7CisgICAgQ2xlYXJGaWVsZChWVF9SRVFVRVNUKTsKKyAgfQorICBib29sIGhhc19yZXF1ZXN0KCkgY29uc3QgeworICAgIHJldHVybiBDaGVja0ZpZWxkKFZUX1JFUVVFU1QpOworICB9CiAgIGNvbnN0IHJlZmxlY3Rpb246Ok9iamVjdCAqcmVzcG9uc2UoKSBjb25zdCB7CiAgICAgcmV0dXJuIEdldFBvaW50ZXI8Y29uc3QgcmVmbGVjdGlvbjo6T2JqZWN0ICo+KFZUX1JFU1BPTlNFKTsKICAgfQorICByZWZsZWN0aW9uOjpPYmplY3QgKm11dGFibGVfcmVzcG9uc2UoKSB7CisgICAgcmV0dXJuIEdldFBvaW50ZXI8cmVmbGVjdGlvbjo6T2JqZWN0ICo+KFZUX1JFU1BPTlNFKTsKKyAgfQorICB2b2lkIGNsZWFyX3Jlc3BvbnNlKCkgeworICAgIENsZWFyRmllbGQoVlRfUkVTUE9OU0UpOworICB9CisgIGJvb2wgaGFzX3Jlc3BvbnNlKCkgY29uc3QgeworICAgIHJldHVybiBDaGVja0ZpZWxkKFZUX1JFU1BPTlNFKTsKKyAgfQogICBjb25zdCBmbGF0YnVmZmVyczo6VmVjdG9yPGZsYXRidWZmZXJzOjpPZmZzZXQ8cmVmbGVjdGlvbjo6S2V5VmFsdWU+PiAqYXR0cmlidXRlcygpIGNvbnN0IHsKICAgICByZXR1cm4gR2V0UG9pbnRlcjxjb25zdCBmbGF0YnVmZmVyczo6VmVjdG9yPGZsYXRidWZmZXJzOjpPZmZzZXQ8cmVmbGVjdGlvbjo6S2V5VmFsdWU+PiAqPihWVF9BVFRSSUJVVEVTKTsKICAgfQorICBmbGF0YnVmZmVyczo6VmVjdG9yPGZsYXRidWZmZXJzOjpPZmZzZXQ8cmVmbGVjdGlvbjo6S2V5VmFsdWU+PiAqbXV0YWJsZV9hdHRyaWJ1dGVzKCkgeworICAgIHJldHVybiBHZXRQb2ludGVyPGZsYXRidWZmZXJzOjpWZWN0b3I8ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxyZWZsZWN0aW9uOjpLZXlWYWx1ZT4+ICo+KFZUX0FUVFJJQlVURVMpOworICB9CisgIHZvaWQgY2xlYXJfYXR0cmlidXRlcygpIHsKKyAgICBDbGVhckZpZWxkKFZUX0FUVFJJQlVURVMpOworICB9CisgIGJvb2wgaGFzX2F0dHJpYnV0ZXMoKSBjb25zdCB7CisgICAgcmV0dXJuIENoZWNrRmllbGQoVlRfQVRUUklCVVRFUyk7CisgIH0KICAgY29uc3QgZmxhdGJ1ZmZlcnM6OlZlY3RvcjxmbGF0YnVmZmVyczo6T2Zmc2V0PGZsYXRidWZmZXJzOjpTdHJpbmc+PiAqZG9jdW1lbnRhdGlvbigpIGNvbnN0IHsKICAgICByZXR1cm4gR2V0UG9pbnRlcjxjb25zdCBmbGF0YnVmZmVyczo6VmVjdG9yPGZsYXRidWZmZXJzOjpPZmZzZXQ8ZmxhdGJ1ZmZlcnM6OlN0cmluZz4+ICo+KFZUX0RPQ1VNRU5UQVRJT04pOwogICB9CisgIGZsYXRidWZmZXJzOjpWZWN0b3I8ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxmbGF0YnVmZmVyczo6U3RyaW5nPj4gKm11dGFibGVfZG9jdW1lbnRhdGlvbigpIHsKKyAgICByZXR1cm4gR2V0UG9pbnRlcjxmbGF0YnVmZmVyczo6VmVjdG9yPGZsYXRidWZmZXJzOjpPZmZzZXQ8ZmxhdGJ1ZmZlcnM6OlN0cmluZz4+ICo+KFZUX0RPQ1VNRU5UQVRJT04pOworICB9CisgIHZvaWQgY2xlYXJfZG9jdW1lbnRhdGlvbigpIHsKKyAgICBDbGVhckZpZWxkKFZUX0RPQ1VNRU5UQVRJT04pOworICB9CisgIGJvb2wgaGFzX2RvY3VtZW50YXRpb24oKSBjb25zdCB7CisgICAgcmV0dXJuIENoZWNrRmllbGQoVlRfRE9DVU1FTlRBVElPTik7CisgIH0KICAgYm9vbCBWZXJpZnkoZmxhdGJ1ZmZlcnM6OlZlcmlmaWVyICZ2ZXJpZmllcikgY29uc3QgewogICAgIHJldHVybiBWZXJpZnlUYWJsZVN0YXJ0KHZlcmlmaWVyKSAmJgogICAgICAgICAgICBWZXJpZnlPZmZzZXRSZXF1aXJlZCh2ZXJpZmllciwgVlRfTkFNRSkgJiYKQEAgLTEzMDIsOSArMTc1NiwxMiBAQAogCiBzdHJ1Y3QgU2VydmljZVQgOiBwdWJsaWMgZmxhdGJ1ZmZlcnM6Ok5hdGl2ZVRhYmxlIHsKICAgdHlwZWRlZiBTZXJ2aWNlIFRhYmxlVHlwZTsKKyAgc3RhdGljIEZMQVRCVUZGRVJTX0NPTlNURVhQUl9DUFAxMSBjb25zdCBjaGFyICpHZXRGdWxseVF1YWxpZmllZE5hbWUoKSB7CisgICAgcmV0dXJuICJyZWZsZWN0aW9uLlNlcnZpY2VUIjsKKyAgfQogICBzdGQ6OnN0cmluZyBuYW1le307Ci0gIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxyZWZsZWN0aW9uOjpSUENDYWxsVD4+IGNhbGxze307Ci0gIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxyZWZsZWN0aW9uOjpLZXlWYWx1ZVQ+PiBhdHRyaWJ1dGVze307CisgIHN0ZDo6dmVjdG9yPGZsYXRidWZmZXJzOjp1bmlxdWVfcHRyPHJlZmxlY3Rpb246OlJQQ0NhbGxUPj4gY2FsbHN7fTsKKyAgc3RkOjp2ZWN0b3I8ZmxhdGJ1ZmZlcnM6OnVuaXF1ZV9wdHI8cmVmbGVjdGlvbjo6S2V5VmFsdWVUPj4gYXR0cmlidXRlc3t9OwogICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gZG9jdW1lbnRhdGlvbnt9OwogICBzdGQ6OnN0cmluZyBkZWNsYXJhdGlvbl9maWxle307CiAgIFNlcnZpY2VUKCkgPSBkZWZhdWx0OwpAQCAtMTMyMCw2ICsxNzc3LDkgQEAKICAgc3RhdGljIGNvbnN0IGZsYXRidWZmZXJzOjpUeXBlVGFibGUgKk1pbmlSZWZsZWN0VHlwZVRhYmxlKCkgewogICAgIHJldHVybiBTZXJ2aWNlVHlwZVRhYmxlKCk7CiAgIH0KKyAgc3RhdGljIEZMQVRCVUZGRVJTX0NPTlNURVhQUl9DUFAxMSBjb25zdCBjaGFyICpHZXRGdWxseVF1YWxpZmllZE5hbWUoKSB7CisgICAgcmV0dXJuICJyZWZsZWN0aW9uLlNlcnZpY2UiOworICB9CiAgIGVudW0gRmxhdEJ1ZmZlcnNWVGFibGVPZmZzZXQgRkxBVEJVRkZFUlNfVlRBQkxFX1VOREVSTFlJTkdfVFlQRSB7CiAgICAgVlRfTkFNRSA9IDQsCiAgICAgVlRfQ0FMTFMgPSA2LApAQCAtMTMzMCw2ICsxNzkwLDE1IEBACiAgIGNvbnN0IGZsYXRidWZmZXJzOjpTdHJpbmcgKm5hbWUoKSBjb25zdCB7CiAgICAgcmV0dXJuIEdldFBvaW50ZXI8Y29uc3QgZmxhdGJ1ZmZlcnM6OlN0cmluZyAqPihWVF9OQU1FKTsKICAgfQorICBmbGF0YnVmZmVyczo6U3RyaW5nICptdXRhYmxlX25hbWUoKSB7CisgICAgcmV0dXJuIEdldFBvaW50ZXI8ZmxhdGJ1ZmZlcnM6OlN0cmluZyAqPihWVF9OQU1FKTsKKyAgfQorICB2b2lkIGNsZWFyX25hbWUoKSB7CisgICAgQ2xlYXJGaWVsZChWVF9OQU1FKTsKKyAgfQorICBib29sIGhhc19uYW1lKCkgY29uc3QgeworICAgIHJldHVybiBDaGVja0ZpZWxkKFZUX05BTUUpOworICB9CiAgIGJvb2wgS2V5Q29tcGFyZUxlc3NUaGFuKGNvbnN0IFNlcnZpY2UgKm8pIGNvbnN0IHsKICAgICByZXR1cm4gKm5hbWUoKSA8ICpvLT5uYW1lKCk7CiAgIH0KQEAgLTEzMzksMTYgKzE4MDgsNTIgQEAKICAgY29uc3QgZmxhdGJ1ZmZlcnM6OlZlY3RvcjxmbGF0YnVmZmVyczo6T2Zmc2V0PHJlZmxlY3Rpb246OlJQQ0NhbGw+PiAqY2FsbHMoKSBjb25zdCB7CiAgICAgcmV0dXJuIEdldFBvaW50ZXI8Y29uc3QgZmxhdGJ1ZmZlcnM6OlZlY3RvcjxmbGF0YnVmZmVyczo6T2Zmc2V0PHJlZmxlY3Rpb246OlJQQ0NhbGw+PiAqPihWVF9DQUxMUyk7CiAgIH0KKyAgZmxhdGJ1ZmZlcnM6OlZlY3RvcjxmbGF0YnVmZmVyczo6T2Zmc2V0PHJlZmxlY3Rpb246OlJQQ0NhbGw+PiAqbXV0YWJsZV9jYWxscygpIHsKKyAgICByZXR1cm4gR2V0UG9pbnRlcjxmbGF0YnVmZmVyczo6VmVjdG9yPGZsYXRidWZmZXJzOjpPZmZzZXQ8cmVmbGVjdGlvbjo6UlBDQ2FsbD4+ICo+KFZUX0NBTExTKTsKKyAgfQorICB2b2lkIGNsZWFyX2NhbGxzKCkgeworICAgIENsZWFyRmllbGQoVlRfQ0FMTFMpOworICB9CisgIGJvb2wgaGFzX2NhbGxzKCkgY29uc3QgeworICAgIHJldHVybiBDaGVja0ZpZWxkKFZUX0NBTExTKTsKKyAgfQogICBjb25zdCBmbGF0YnVmZmVyczo6VmVjdG9yPGZsYXRidWZmZXJzOjpPZmZzZXQ8cmVmbGVjdGlvbjo6S2V5VmFsdWU+PiAqYXR0cmlidXRlcygpIGNvbnN0IHsKICAgICByZXR1cm4gR2V0UG9pbnRlcjxjb25zdCBmbGF0YnVmZmVyczo6VmVjdG9yPGZsYXRidWZmZXJzOjpPZmZzZXQ8cmVmbGVjdGlvbjo6S2V5VmFsdWU+PiAqPihWVF9BVFRSSUJVVEVTKTsKICAgfQorICBmbGF0YnVmZmVyczo6VmVjdG9yPGZsYXRidWZmZXJzOjpPZmZzZXQ8cmVmbGVjdGlvbjo6S2V5VmFsdWU+PiAqbXV0YWJsZV9hdHRyaWJ1dGVzKCkgeworICAgIHJldHVybiBHZXRQb2ludGVyPGZsYXRidWZmZXJzOjpWZWN0b3I8ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxyZWZsZWN0aW9uOjpLZXlWYWx1ZT4+ICo+KFZUX0FUVFJJQlVURVMpOworICB9CisgIHZvaWQgY2xlYXJfYXR0cmlidXRlcygpIHsKKyAgICBDbGVhckZpZWxkKFZUX0FUVFJJQlVURVMpOworICB9CisgIGJvb2wgaGFzX2F0dHJpYnV0ZXMoKSBjb25zdCB7CisgICAgcmV0dXJuIENoZWNrRmllbGQoVlRfQVRUUklCVVRFUyk7CisgIH0KICAgY29uc3QgZmxhdGJ1ZmZlcnM6OlZlY3RvcjxmbGF0YnVmZmVyczo6T2Zmc2V0PGZsYXRidWZmZXJzOjpTdHJpbmc+PiAqZG9jdW1lbnRhdGlvbigpIGNvbnN0IHsKICAgICByZXR1cm4gR2V0UG9pbnRlcjxjb25zdCBmbGF0YnVmZmVyczo6VmVjdG9yPGZsYXRidWZmZXJzOjpPZmZzZXQ8ZmxhdGJ1ZmZlcnM6OlN0cmluZz4+ICo+KFZUX0RPQ1VNRU5UQVRJT04pOwogICB9CisgIGZsYXRidWZmZXJzOjpWZWN0b3I8ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxmbGF0YnVmZmVyczo6U3RyaW5nPj4gKm11dGFibGVfZG9jdW1lbnRhdGlvbigpIHsKKyAgICByZXR1cm4gR2V0UG9pbnRlcjxmbGF0YnVmZmVyczo6VmVjdG9yPGZsYXRidWZmZXJzOjpPZmZzZXQ8ZmxhdGJ1ZmZlcnM6OlN0cmluZz4+ICo+KFZUX0RPQ1VNRU5UQVRJT04pOworICB9CisgIHZvaWQgY2xlYXJfZG9jdW1lbnRhdGlvbigpIHsKKyAgICBDbGVhckZpZWxkKFZUX0RPQ1VNRU5UQVRJT04pOworICB9CisgIGJvb2wgaGFzX2RvY3VtZW50YXRpb24oKSBjb25zdCB7CisgICAgcmV0dXJuIENoZWNrRmllbGQoVlRfRE9DVU1FTlRBVElPTik7CisgIH0KICAgLy8vIEZpbGUgdGhhdCB0aGlzIFNlcnZpY2UgaXMgZGVjbGFyZWQgaW4uCiAgIGNvbnN0IGZsYXRidWZmZXJzOjpTdHJpbmcgKmRlY2xhcmF0aW9uX2ZpbGUoKSBjb25zdCB7CiAgICAgcmV0dXJuIEdldFBvaW50ZXI8Y29uc3QgZmxhdGJ1ZmZlcnM6OlN0cmluZyAqPihWVF9ERUNMQVJBVElPTl9GSUxFKTsKICAgfQorICBmbGF0YnVmZmVyczo6U3RyaW5nICptdXRhYmxlX2RlY2xhcmF0aW9uX2ZpbGUoKSB7CisgICAgcmV0dXJuIEdldFBvaW50ZXI8ZmxhdGJ1ZmZlcnM6OlN0cmluZyAqPihWVF9ERUNMQVJBVElPTl9GSUxFKTsKKyAgfQorICB2b2lkIGNsZWFyX2RlY2xhcmF0aW9uX2ZpbGUoKSB7CisgICAgQ2xlYXJGaWVsZChWVF9ERUNMQVJBVElPTl9GSUxFKTsKKyAgfQorICBib29sIGhhc19kZWNsYXJhdGlvbl9maWxlKCkgY29uc3QgeworICAgIHJldHVybiBDaGVja0ZpZWxkKFZUX0RFQ0xBUkFUSU9OX0ZJTEUpOworICB9CiAgIGJvb2wgVmVyaWZ5KGZsYXRidWZmZXJzOjpWZXJpZmllciAmdmVyaWZpZXIpIGNvbnN0IHsKICAgICByZXR1cm4gVmVyaWZ5VGFibGVTdGFydCh2ZXJpZmllcikgJiYKICAgICAgICAgICAgVmVyaWZ5T2Zmc2V0UmVxdWlyZWQodmVyaWZpZXIsIFZUX05BTUUpICYmCkBAIC0xNDQ4LDYgKzE5NTMsOSBAQAogCiBzdHJ1Y3QgU2NoZW1hRmlsZVQgOiBwdWJsaWMgZmxhdGJ1ZmZlcnM6Ok5hdGl2ZVRhYmxlIHsKICAgdHlwZWRlZiBTY2hlbWFGaWxlIFRhYmxlVHlwZTsKKyAgc3RhdGljIEZMQVRCVUZGRVJTX0NPTlNURVhQUl9DUFAxMSBjb25zdCBjaGFyICpHZXRGdWxseVF1YWxpZmllZE5hbWUoKSB7CisgICAgcmV0dXJuICJyZWZsZWN0aW9uLlNjaGVtYUZpbGVUIjsKKyAgfQogICBzdGQ6OnN0cmluZyBmaWxlbmFtZXt9OwogICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gaW5jbHVkZWRfZmlsZW5hbWVze307CiB9OwpAQCAtMTQ2Miw2ICsxOTcwLDkgQEAKICAgc3RhdGljIGNvbnN0IGZsYXRidWZmZXJzOjpUeXBlVGFibGUgKk1pbmlSZWZsZWN0VHlwZVRhYmxlKCkgewogICAgIHJldHVybiBTY2hlbWFGaWxlVHlwZVRhYmxlKCk7CiAgIH0KKyAgc3RhdGljIEZMQVRCVUZGRVJTX0NPTlNURVhQUl9DUFAxMSBjb25zdCBjaGFyICpHZXRGdWxseVF1YWxpZmllZE5hbWUoKSB7CisgICAgcmV0dXJuICJyZWZsZWN0aW9uLlNjaGVtYUZpbGUiOworICB9CiAgIGVudW0gRmxhdEJ1ZmZlcnNWVGFibGVPZmZzZXQgRkxBVEJVRkZFUlNfVlRBQkxFX1VOREVSTFlJTkdfVFlQRSB7CiAgICAgVlRfRklMRU5BTUUgPSA0LAogICAgIFZUX0lOQ0xVREVEX0ZJTEVOQU1FUyA9IDYKQEAgLTE0NzAsNiArMTk4MSwxNSBAQAogICBjb25zdCBmbGF0YnVmZmVyczo6U3RyaW5nICpmaWxlbmFtZSgpIGNvbnN0IHsKICAgICByZXR1cm4gR2V0UG9pbnRlcjxjb25zdCBmbGF0YnVmZmVyczo6U3RyaW5nICo+KFZUX0ZJTEVOQU1FKTsKICAgfQorICBmbGF0YnVmZmVyczo6U3RyaW5nICptdXRhYmxlX2ZpbGVuYW1lKCkgeworICAgIHJldHVybiBHZXRQb2ludGVyPGZsYXRidWZmZXJzOjpTdHJpbmcgKj4oVlRfRklMRU5BTUUpOworICB9CisgIHZvaWQgY2xlYXJfZmlsZW5hbWUoKSB7CisgICAgQ2xlYXJGaWVsZChWVF9GSUxFTkFNRSk7CisgIH0KKyAgYm9vbCBoYXNfZmlsZW5hbWUoKSBjb25zdCB7CisgICAgcmV0dXJuIENoZWNrRmllbGQoVlRfRklMRU5BTUUpOworICB9CiAgIGJvb2wgS2V5Q29tcGFyZUxlc3NUaGFuKGNvbnN0IFNjaGVtYUZpbGUgKm8pIGNvbnN0IHsKICAgICByZXR1cm4gKmZpbGVuYW1lKCkgPCAqby0+ZmlsZW5hbWUoKTsKICAgfQpAQCAtMTQ4MCw2ICsyMDAwLDE1IEBACiAgIGNvbnN0IGZsYXRidWZmZXJzOjpWZWN0b3I8ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxmbGF0YnVmZmVyczo6U3RyaW5nPj4gKmluY2x1ZGVkX2ZpbGVuYW1lcygpIGNvbnN0IHsKICAgICByZXR1cm4gR2V0UG9pbnRlcjxjb25zdCBmbGF0YnVmZmVyczo6VmVjdG9yPGZsYXRidWZmZXJzOjpPZmZzZXQ8ZmxhdGJ1ZmZlcnM6OlN0cmluZz4+ICo+KFZUX0lOQ0xVREVEX0ZJTEVOQU1FUyk7CiAgIH0KKyAgZmxhdGJ1ZmZlcnM6OlZlY3RvcjxmbGF0YnVmZmVyczo6T2Zmc2V0PGZsYXRidWZmZXJzOjpTdHJpbmc+PiAqbXV0YWJsZV9pbmNsdWRlZF9maWxlbmFtZXMoKSB7CisgICAgcmV0dXJuIEdldFBvaW50ZXI8ZmxhdGJ1ZmZlcnM6OlZlY3RvcjxmbGF0YnVmZmVyczo6T2Zmc2V0PGZsYXRidWZmZXJzOjpTdHJpbmc+PiAqPihWVF9JTkNMVURFRF9GSUxFTkFNRVMpOworICB9CisgIHZvaWQgY2xlYXJfaW5jbHVkZWRfZmlsZW5hbWVzKCkgeworICAgIENsZWFyRmllbGQoVlRfSU5DTFVERURfRklMRU5BTUVTKTsKKyAgfQorICBib29sIGhhc19pbmNsdWRlZF9maWxlbmFtZXMoKSBjb25zdCB7CisgICAgcmV0dXJuIENoZWNrRmllbGQoVlRfSU5DTFVERURfRklMRU5BTUVTKTsKKyAgfQogICBib29sIFZlcmlmeShmbGF0YnVmZmVyczo6VmVyaWZpZXIgJnZlcmlmaWVyKSBjb25zdCB7CiAgICAgcmV0dXJuIFZlcmlmeVRhYmxlU3RhcnQodmVyaWZpZXIpICYmCiAgICAgICAgICAgIFZlcmlmeU9mZnNldFJlcXVpcmVkKHZlcmlmaWVyLCBWVF9GSUxFTkFNRSkgJiYKQEAgLTE1NDcsMTQgKzIwNzYsMTcgQEAKIAogc3RydWN0IFNjaGVtYVQgOiBwdWJsaWMgZmxhdGJ1ZmZlcnM6Ok5hdGl2ZVRhYmxlIHsKICAgdHlwZWRlZiBTY2hlbWEgVGFibGVUeXBlOwotICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8cmVmbGVjdGlvbjo6T2JqZWN0VD4+IG9iamVjdHN7fTsKLSAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPHJlZmxlY3Rpb246OkVudW1UPj4gZW51bXN7fTsKKyAgc3RhdGljIEZMQVRCVUZGRVJTX0NPTlNURVhQUl9DUFAxMSBjb25zdCBjaGFyICpHZXRGdWxseVF1YWxpZmllZE5hbWUoKSB7CisgICAgcmV0dXJuICJyZWZsZWN0aW9uLlNjaGVtYVQiOworICB9CisgIHN0ZDo6dmVjdG9yPGZsYXRidWZmZXJzOjp1bmlxdWVfcHRyPHJlZmxlY3Rpb246Ok9iamVjdFQ+PiBvYmplY3Rze307CisgIHN0ZDo6dmVjdG9yPGZsYXRidWZmZXJzOjp1bmlxdWVfcHRyPHJlZmxlY3Rpb246OkVudW1UPj4gZW51bXN7fTsKICAgc3RkOjpzdHJpbmcgZmlsZV9pZGVudHt9OwogICBzdGQ6OnN0cmluZyBmaWxlX2V4dHt9OwotICBzdGQ6OnVuaXF1ZV9wdHI8cmVmbGVjdGlvbjo6T2JqZWN0VD4gcm9vdF90YWJsZXt9OwotICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8cmVmbGVjdGlvbjo6U2VydmljZVQ+PiBzZXJ2aWNlc3t9OworICBmbGF0YnVmZmVyczo6dW5pcXVlX3B0cjxyZWZsZWN0aW9uOjpPYmplY3RUPiByb290X3RhYmxle307CisgIHN0ZDo6dmVjdG9yPGZsYXRidWZmZXJzOjp1bmlxdWVfcHRyPHJlZmxlY3Rpb246OlNlcnZpY2VUPj4gc2VydmljZXN7fTsKICAgcmVmbGVjdGlvbjo6QWR2YW5jZWRGZWF0dXJlcyBhZHZhbmNlZF9mZWF0dXJlcyA9IHN0YXRpY19jYXN0PHJlZmxlY3Rpb246OkFkdmFuY2VkRmVhdHVyZXM+KDApOwotICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8cmVmbGVjdGlvbjo6U2NoZW1hRmlsZVQ+PiBmYnNfZmlsZXN7fTsKKyAgc3RkOjp2ZWN0b3I8ZmxhdGJ1ZmZlcnM6OnVuaXF1ZV9wdHI8cmVmbGVjdGlvbjo6U2NoZW1hRmlsZVQ+PiBmYnNfZmlsZXN7fTsKICAgU2NoZW1hVCgpID0gZGVmYXVsdDsKICAgU2NoZW1hVChjb25zdCBTY2hlbWFUICZvKTsKICAgU2NoZW1hVChTY2hlbWFUJiYpIEZMQVRCVUZGRVJTX05PRVhDRVBUID0gZGVmYXVsdDsKQEAgLTE1NjgsNiArMjEwMCw5IEBACiAgIHN0YXRpYyBjb25zdCBmbGF0YnVmZmVyczo6VHlwZVRhYmxlICpNaW5pUmVmbGVjdFR5cGVUYWJsZSgpIHsKICAgICByZXR1cm4gU2NoZW1hVHlwZVRhYmxlKCk7CiAgIH0KKyAgc3RhdGljIEZMQVRCVUZGRVJTX0NPTlNURVhQUl9DUFAxMSBjb25zdCBjaGFyICpHZXRGdWxseVF1YWxpZmllZE5hbWUoKSB7CisgICAgcmV0dXJuICJyZWZsZWN0aW9uLlNjaGVtYSI7CisgIH0KICAgZW51bSBGbGF0QnVmZmVyc1ZUYWJsZU9mZnNldCBGTEFUQlVGRkVSU19WVEFCTEVfVU5ERVJMWUlOR19UWVBFIHsKICAgICBWVF9PQkpFQ1RTID0gNCwKICAgICBWVF9FTlVNUyA9IDYsCkBAIC0xNTgxLDI5ICsyMTE2LDEwMSBAQAogICBjb25zdCBmbGF0YnVmZmVyczo6VmVjdG9yPGZsYXRidWZmZXJzOjpPZmZzZXQ8cmVmbGVjdGlvbjo6T2JqZWN0Pj4gKm9iamVjdHMoKSBjb25zdCB7CiAgICAgcmV0dXJuIEdldFBvaW50ZXI8Y29uc3QgZmxhdGJ1ZmZlcnM6OlZlY3RvcjxmbGF0YnVmZmVyczo6T2Zmc2V0PHJlZmxlY3Rpb246Ok9iamVjdD4+ICo+KFZUX09CSkVDVFMpOwogICB9CisgIGZsYXRidWZmZXJzOjpWZWN0b3I8ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxyZWZsZWN0aW9uOjpPYmplY3Q+PiAqbXV0YWJsZV9vYmplY3RzKCkgeworICAgIHJldHVybiBHZXRQb2ludGVyPGZsYXRidWZmZXJzOjpWZWN0b3I8ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxyZWZsZWN0aW9uOjpPYmplY3Q+PiAqPihWVF9PQkpFQ1RTKTsKKyAgfQorICB2b2lkIGNsZWFyX29iamVjdHMoKSB7CisgICAgQ2xlYXJGaWVsZChWVF9PQkpFQ1RTKTsKKyAgfQorICBib29sIGhhc19vYmplY3RzKCkgY29uc3QgeworICAgIHJldHVybiBDaGVja0ZpZWxkKFZUX09CSkVDVFMpOworICB9CiAgIGNvbnN0IGZsYXRidWZmZXJzOjpWZWN0b3I8ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxyZWZsZWN0aW9uOjpFbnVtPj4gKmVudW1zKCkgY29uc3QgewogICAgIHJldHVybiBHZXRQb2ludGVyPGNvbnN0IGZsYXRidWZmZXJzOjpWZWN0b3I8ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxyZWZsZWN0aW9uOjpFbnVtPj4gKj4oVlRfRU5VTVMpOwogICB9CisgIGZsYXRidWZmZXJzOjpWZWN0b3I8ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxyZWZsZWN0aW9uOjpFbnVtPj4gKm11dGFibGVfZW51bXMoKSB7CisgICAgcmV0dXJuIEdldFBvaW50ZXI8ZmxhdGJ1ZmZlcnM6OlZlY3RvcjxmbGF0YnVmZmVyczo6T2Zmc2V0PHJlZmxlY3Rpb246OkVudW0+PiAqPihWVF9FTlVNUyk7CisgIH0KKyAgdm9pZCBjbGVhcl9lbnVtcygpIHsKKyAgICBDbGVhckZpZWxkKFZUX0VOVU1TKTsKKyAgfQorICBib29sIGhhc19lbnVtcygpIGNvbnN0IHsKKyAgICByZXR1cm4gQ2hlY2tGaWVsZChWVF9FTlVNUyk7CisgIH0KICAgY29uc3QgZmxhdGJ1ZmZlcnM6OlN0cmluZyAqZmlsZV9pZGVudCgpIGNvbnN0IHsKICAgICByZXR1cm4gR2V0UG9pbnRlcjxjb25zdCBmbGF0YnVmZmVyczo6U3RyaW5nICo+KFZUX0ZJTEVfSURFTlQpOwogICB9CisgIGZsYXRidWZmZXJzOjpTdHJpbmcgKm11dGFibGVfZmlsZV9pZGVudCgpIHsKKyAgICByZXR1cm4gR2V0UG9pbnRlcjxmbGF0YnVmZmVyczo6U3RyaW5nICo+KFZUX0ZJTEVfSURFTlQpOworICB9CisgIHZvaWQgY2xlYXJfZmlsZV9pZGVudCgpIHsKKyAgICBDbGVhckZpZWxkKFZUX0ZJTEVfSURFTlQpOworICB9CisgIGJvb2wgaGFzX2ZpbGVfaWRlbnQoKSBjb25zdCB7CisgICAgcmV0dXJuIENoZWNrRmllbGQoVlRfRklMRV9JREVOVCk7CisgIH0KICAgY29uc3QgZmxhdGJ1ZmZlcnM6OlN0cmluZyAqZmlsZV9leHQoKSBjb25zdCB7CiAgICAgcmV0dXJuIEdldFBvaW50ZXI8Y29uc3QgZmxhdGJ1ZmZlcnM6OlN0cmluZyAqPihWVF9GSUxFX0VYVCk7CiAgIH0KKyAgZmxhdGJ1ZmZlcnM6OlN0cmluZyAqbXV0YWJsZV9maWxlX2V4dCgpIHsKKyAgICByZXR1cm4gR2V0UG9pbnRlcjxmbGF0YnVmZmVyczo6U3RyaW5nICo+KFZUX0ZJTEVfRVhUKTsKKyAgfQorICB2b2lkIGNsZWFyX2ZpbGVfZXh0KCkgeworICAgIENsZWFyRmllbGQoVlRfRklMRV9FWFQpOworICB9CisgIGJvb2wgaGFzX2ZpbGVfZXh0KCkgY29uc3QgeworICAgIHJldHVybiBDaGVja0ZpZWxkKFZUX0ZJTEVfRVhUKTsKKyAgfQogICBjb25zdCByZWZsZWN0aW9uOjpPYmplY3QgKnJvb3RfdGFibGUoKSBjb25zdCB7CiAgICAgcmV0dXJuIEdldFBvaW50ZXI8Y29uc3QgcmVmbGVjdGlvbjo6T2JqZWN0ICo+KFZUX1JPT1RfVEFCTEUpOwogICB9CisgIHJlZmxlY3Rpb246Ok9iamVjdCAqbXV0YWJsZV9yb290X3RhYmxlKCkgeworICAgIHJldHVybiBHZXRQb2ludGVyPHJlZmxlY3Rpb246Ok9iamVjdCAqPihWVF9ST09UX1RBQkxFKTsKKyAgfQorICB2b2lkIGNsZWFyX3Jvb3RfdGFibGUoKSB7CisgICAgQ2xlYXJGaWVsZChWVF9ST09UX1RBQkxFKTsKKyAgfQorICBib29sIGhhc19yb290X3RhYmxlKCkgY29uc3QgeworICAgIHJldHVybiBDaGVja0ZpZWxkKFZUX1JPT1RfVEFCTEUpOworICB9CiAgIGNvbnN0IGZsYXRidWZmZXJzOjpWZWN0b3I8ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxyZWZsZWN0aW9uOjpTZXJ2aWNlPj4gKnNlcnZpY2VzKCkgY29uc3QgewogICAgIHJldHVybiBHZXRQb2ludGVyPGNvbnN0IGZsYXRidWZmZXJzOjpWZWN0b3I8ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxyZWZsZWN0aW9uOjpTZXJ2aWNlPj4gKj4oVlRfU0VSVklDRVMpOwogICB9CisgIGZsYXRidWZmZXJzOjpWZWN0b3I8ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxyZWZsZWN0aW9uOjpTZXJ2aWNlPj4gKm11dGFibGVfc2VydmljZXMoKSB7CisgICAgcmV0dXJuIEdldFBvaW50ZXI8ZmxhdGJ1ZmZlcnM6OlZlY3RvcjxmbGF0YnVmZmVyczo6T2Zmc2V0PHJlZmxlY3Rpb246OlNlcnZpY2U+PiAqPihWVF9TRVJWSUNFUyk7CisgIH0KKyAgdm9pZCBjbGVhcl9zZXJ2aWNlcygpIHsKKyAgICBDbGVhckZpZWxkKFZUX1NFUlZJQ0VTKTsKKyAgfQorICBib29sIGhhc19zZXJ2aWNlcygpIGNvbnN0IHsKKyAgICByZXR1cm4gQ2hlY2tGaWVsZChWVF9TRVJWSUNFUyk7CisgIH0KICAgcmVmbGVjdGlvbjo6QWR2YW5jZWRGZWF0dXJlcyBhZHZhbmNlZF9mZWF0dXJlcygpIGNvbnN0IHsKICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8cmVmbGVjdGlvbjo6QWR2YW5jZWRGZWF0dXJlcz4oR2V0RmllbGQ8dWludDY0X3Q+KFZUX0FEVkFOQ0VEX0ZFQVRVUkVTLCAwKSk7CiAgIH0KKyAgYm9vbCBtdXRhdGVfYWR2YW5jZWRfZmVhdHVyZXMocmVmbGVjdGlvbjo6QWR2YW5jZWRGZWF0dXJlcyBfYWR2YW5jZWRfZmVhdHVyZXMgPSBzdGF0aWNfY2FzdDxyZWZsZWN0aW9uOjpBZHZhbmNlZEZlYXR1cmVzPigwKSkgeworICAgIHJldHVybiBTZXRGaWVsZDx1aW50NjRfdD4oVlRfQURWQU5DRURfRkVBVFVSRVMsIHN0YXRpY19jYXN0PHVpbnQ2NF90PihfYWR2YW5jZWRfZmVhdHVyZXMpLCAwKTsKKyAgfQorICB2b2lkIGNsZWFyX2FkdmFuY2VkX2ZlYXR1cmVzKCkgeworICAgIENsZWFyRmllbGQoVlRfQURWQU5DRURfRkVBVFVSRVMpOworICB9CisgIGJvb2wgaGFzX2FkdmFuY2VkX2ZlYXR1cmVzKCkgY29uc3QgeworICAgIHJldHVybiBDaGVja0ZpZWxkKFZUX0FEVkFOQ0VEX0ZFQVRVUkVTKTsKKyAgfQogICAvLy8gQWxsIHRoZSBmaWxlcyB1c2VkIGluIHRoaXMgY29tcGlsYXRpb24uIEZpbGVzIGFyZSByZWxhdGl2ZSB0byB3aGVyZQogICAvLy8gZmxhdGMgd2FzIGludm9rZWQuCiAgIGNvbnN0IGZsYXRidWZmZXJzOjpWZWN0b3I8ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxyZWZsZWN0aW9uOjpTY2hlbWFGaWxlPj4gKmZic19maWxlcygpIGNvbnN0IHsKICAgICByZXR1cm4gR2V0UG9pbnRlcjxjb25zdCBmbGF0YnVmZmVyczo6VmVjdG9yPGZsYXRidWZmZXJzOjpPZmZzZXQ8cmVmbGVjdGlvbjo6U2NoZW1hRmlsZT4+ICo+KFZUX0ZCU19GSUxFUyk7CiAgIH0KKyAgZmxhdGJ1ZmZlcnM6OlZlY3RvcjxmbGF0YnVmZmVyczo6T2Zmc2V0PHJlZmxlY3Rpb246OlNjaGVtYUZpbGU+PiAqbXV0YWJsZV9mYnNfZmlsZXMoKSB7CisgICAgcmV0dXJuIEdldFBvaW50ZXI8ZmxhdGJ1ZmZlcnM6OlZlY3RvcjxmbGF0YnVmZmVyczo6T2Zmc2V0PHJlZmxlY3Rpb246OlNjaGVtYUZpbGU+PiAqPihWVF9GQlNfRklMRVMpOworICB9CisgIHZvaWQgY2xlYXJfZmJzX2ZpbGVzKCkgeworICAgIENsZWFyRmllbGQoVlRfRkJTX0ZJTEVTKTsKKyAgfQorICBib29sIGhhc19mYnNfZmlsZXMoKSBjb25zdCB7CisgICAgcmV0dXJuIENoZWNrRmllbGQoVlRfRkJTX0ZJTEVTKTsKKyAgfQogICBib29sIFZlcmlmeShmbGF0YnVmZmVyczo6VmVyaWZpZXIgJnZlcmlmaWVyKSBjb25zdCB7CiAgICAgcmV0dXJuIFZlcmlmeVRhYmxlU3RhcnQodmVyaWZpZXIpICYmCiAgICAgICAgICAgIFZlcmlmeU9mZnNldFJlcXVpcmVkKHZlcmlmaWVyLCBWVF9PQkpFQ1RTKSAmJgpAQCAtMTgyMSw3ICsyNDI4LDcgQEAKICAgKHZvaWQpX287CiAgIHN0cnVjdCBfVmVjdG9yQXJncyB7IGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAqX19mYmI7IGNvbnN0IEtleVZhbHVlVCogX19vOyBjb25zdCBmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX19yZWhhc2hlcjsgfSBfdmEgPSB7ICZfZmJiLCBfbywgX3JlaGFzaGVyfTsgKHZvaWQpX3ZhOwogICBhdXRvIF9rZXkgPSBfZmJiLkNyZWF0ZVN0cmluZyhfby0+a2V5KTsKLSAgYXV0byBfdmFsdWUgPSBfby0+dmFsdWUuZW1wdHkoKSA/IDAgOiBfZmJiLkNyZWF0ZVN0cmluZyhfby0+dmFsdWUpOworICBhdXRvIF92YWx1ZSA9IF9vLT52YWx1ZS5lbXB0eSgpID8gX2ZiYi5DcmVhdGVTaGFyZWRTdHJpbmcoIiIpIDogX2ZiYi5DcmVhdGVTdHJpbmcoX28tPnZhbHVlKTsKICAgcmV0dXJuIHJlZmxlY3Rpb246OkNyZWF0ZUtleVZhbHVlKAogICAgICAgX2ZiYiwKICAgICAgIF9rZXksCkBAIC0xODY4LDggKzI0NzUsOCBAQAogICAodm9pZClfcmVzb2x2ZXI7CiAgIHsgYXV0byBfZSA9IG5hbWUoKTsgaWYgKF9lKSBfby0+bmFtZSA9IF9lLT5zdHIoKTsgfQogICB7IGF1dG8gX2UgPSB2YWx1ZSgpOyBfby0+dmFsdWUgPSBfZTsgfQotICB7IGF1dG8gX2UgPSB1bmlvbl90eXBlKCk7IGlmIChfZSkgeyBpZihfby0+dW5pb25fdHlwZSkgeyBfZS0+VW5QYWNrVG8oX28tPnVuaW9uX3R5cGUuZ2V0KCksIF9yZXNvbHZlcik7IH0gZWxzZSB7IF9vLT51bmlvbl90eXBlID0gc3RkOjp1bmlxdWVfcHRyPHJlZmxlY3Rpb246OlR5cGVUPihfZS0+VW5QYWNrKF9yZXNvbHZlcikpOyB9IH0gfQotICB7IGF1dG8gX2UgPSBkb2N1bWVudGF0aW9uKCk7IGlmIChfZSkgeyBfby0+ZG9jdW1lbnRhdGlvbi5yZXNpemUoX2UtPnNpemUoKSk7IGZvciAoZmxhdGJ1ZmZlcnM6OnVvZmZzZXRfdCBfaSA9IDA7IF9pIDwgX2UtPnNpemUoKTsgX2krKykgeyBfby0+ZG9jdW1lbnRhdGlvbltfaV0gPSBfZS0+R2V0KF9pKS0+c3RyKCk7IH0gfSB9CisgIHsgYXV0byBfZSA9IHVuaW9uX3R5cGUoKTsgaWYgKF9lKSB7IGlmKF9vLT51bmlvbl90eXBlKSB7IF9lLT5VblBhY2tUbyhfby0+dW5pb25fdHlwZS5nZXQoKSwgX3Jlc29sdmVyKTsgfSBlbHNlIHsgX28tPnVuaW9uX3R5cGUgPSBmbGF0YnVmZmVyczo6dW5pcXVlX3B0cjxyZWZsZWN0aW9uOjpUeXBlVD4oX2UtPlVuUGFjayhfcmVzb2x2ZXIpKTsgfSB9IGVsc2UgaWYgKF9vLT51bmlvbl90eXBlKSB7IF9vLT51bmlvbl90eXBlLnJlc2V0KCk7IH0gfQorICB7IGF1dG8gX2UgPSBkb2N1bWVudGF0aW9uKCk7IGlmIChfZSkgeyBfby0+ZG9jdW1lbnRhdGlvbi5yZXNpemUoX2UtPnNpemUoKSk7IGZvciAoZmxhdGJ1ZmZlcnM6OnVvZmZzZXRfdCBfaSA9IDA7IF9pIDwgX2UtPnNpemUoKTsgX2krKykgeyBfby0+ZG9jdW1lbnRhdGlvbltfaV0gPSBfZS0+R2V0KF9pKS0+c3RyKCk7IH0gfSBlbHNlIHsgX28tPmRvY3VtZW50YXRpb24ucmVzaXplKDApOyB9IH0KIH0KIAogaW5saW5lIGZsYXRidWZmZXJzOjpPZmZzZXQ8RW51bVZhbD4gRW51bVZhbDo6UGFjayhmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IEVudW1WYWxUKiBfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlcikgewpAQCAtMTg4Myw3ICsyNDkwLDcgQEAKICAgYXV0byBfbmFtZSA9IF9mYmIuQ3JlYXRlU3RyaW5nKF9vLT5uYW1lKTsKICAgYXV0byBfdmFsdWUgPSBfby0+dmFsdWU7CiAgIGF1dG8gX3VuaW9uX3R5cGUgPSBfby0+dW5pb25fdHlwZSA/IENyZWF0ZVR5cGUoX2ZiYiwgX28tPnVuaW9uX3R5cGUuZ2V0KCksIF9yZWhhc2hlcikgOiAwOwotICBhdXRvIF9kb2N1bWVudGF0aW9uID0gX28tPmRvY3VtZW50YXRpb24uc2l6ZSgpID8gX2ZiYi5DcmVhdGVWZWN0b3JPZlN0cmluZ3MoX28tPmRvY3VtZW50YXRpb24pIDogMDsKKyAgYXV0byBfZG9jdW1lbnRhdGlvbiA9IF9mYmIuQ3JlYXRlVmVjdG9yT2ZTdHJpbmdzKF9vLT5kb2N1bWVudGF0aW9uKTsKICAgcmV0dXJuIHJlZmxlY3Rpb246OkNyZWF0ZUVudW1WYWwoCiAgICAgICBfZmJiLAogICAgICAgX25hbWUsCkBAIC0xODk2LDEwICsyNTAzLDEwIEBACiBpbmxpbmUgYm9vbCBvcGVyYXRvcj09KGNvbnN0IEVudW1UICZsaHMsIGNvbnN0IEVudW1UICZyaHMpIHsKICAgcmV0dXJuCiAgICAgICAobGhzLm5hbWUgPT0gcmhzLm5hbWUpICYmCi0gICAgICAobGhzLnZhbHVlcyA9PSByaHMudmFsdWVzKSAmJgorICAgICAgKGxocy52YWx1ZXMuc2l6ZSgpID09IHJocy52YWx1ZXMuc2l6ZSgpICYmIHN0ZDo6ZXF1YWwobGhzLnZhbHVlcy5jYmVnaW4oKSwgbGhzLnZhbHVlcy5jZW5kKCksIHJocy52YWx1ZXMuY2JlZ2luKCksIFtdKGZsYXRidWZmZXJzOjp1bmlxdWVfcHRyPHJlZmxlY3Rpb246OkVudW1WYWxUPiBjb25zdCAmYSwgZmxhdGJ1ZmZlcnM6OnVuaXF1ZV9wdHI8cmVmbGVjdGlvbjo6RW51bVZhbFQ+IGNvbnN0ICZiKSB7IHJldHVybiAoYSA9PSBiKSB8fCAoYSAmJiBiICYmICphID09ICpiKTsgfSkpICYmCiAgICAgICAobGhzLmlzX3VuaW9uID09IHJocy5pc191bmlvbikgJiYKICAgICAgICgobGhzLnVuZGVybHlpbmdfdHlwZSA9PSByaHMudW5kZXJseWluZ190eXBlKSB8fCAobGhzLnVuZGVybHlpbmdfdHlwZSAmJiByaHMudW5kZXJseWluZ190eXBlICYmICpsaHMudW5kZXJseWluZ190eXBlID09ICpyaHMudW5kZXJseWluZ190eXBlKSkgJiYKLSAgICAgIChsaHMuYXR0cmlidXRlcyA9PSByaHMuYXR0cmlidXRlcykgJiYKKyAgICAgIChsaHMuYXR0cmlidXRlcy5zaXplKCkgPT0gcmhzLmF0dHJpYnV0ZXMuc2l6ZSgpICYmIHN0ZDo6ZXF1YWwobGhzLmF0dHJpYnV0ZXMuY2JlZ2luKCksIGxocy5hdHRyaWJ1dGVzLmNlbmQoKSwgcmhzLmF0dHJpYnV0ZXMuY2JlZ2luKCksIFtdKGZsYXRidWZmZXJzOjp1bmlxdWVfcHRyPHJlZmxlY3Rpb246OktleVZhbHVlVD4gY29uc3QgJmEsIGZsYXRidWZmZXJzOjp1bmlxdWVfcHRyPHJlZmxlY3Rpb246OktleVZhbHVlVD4gY29uc3QgJmIpIHsgcmV0dXJuIChhID09IGIpIHx8IChhICYmIGIgJiYgKmEgPT0gKmIpOyB9KSkgJiYKICAgICAgIChsaHMuZG9jdW1lbnRhdGlvbiA9PSByaHMuZG9jdW1lbnRhdGlvbikgJiYKICAgICAgIChsaHMuZGVjbGFyYXRpb25fZmlsZSA9PSByaHMuZGVjbGFyYXRpb25fZmlsZSk7CiB9CkBAIC0xOTE2LDkgKzI1MjMsOSBAQAogICAgICAgICBkb2N1bWVudGF0aW9uKG8uZG9jdW1lbnRhdGlvbiksCiAgICAgICAgIGRlY2xhcmF0aW9uX2ZpbGUoby5kZWNsYXJhdGlvbl9maWxlKSB7CiAgIHZhbHVlcy5yZXNlcnZlKG8udmFsdWVzLnNpemUoKSk7Ci0gIGZvciAoY29uc3QgYXV0byAmdiA6IG8udmFsdWVzKSB7IHZhbHVlcy5lbXBsYWNlX2JhY2soKHYpID8gbmV3IHJlZmxlY3Rpb246OkVudW1WYWxUKCp2KSA6IG51bGxwdHIpOyB9CisgIGZvciAoY29uc3QgYXV0byAmdmFsdWVzXyA6IG8udmFsdWVzKSB7IHZhbHVlcy5lbXBsYWNlX2JhY2soKHZhbHVlc18pID8gbmV3IHJlZmxlY3Rpb246OkVudW1WYWxUKCp2YWx1ZXNfKSA6IG51bGxwdHIpOyB9CiAgIGF0dHJpYnV0ZXMucmVzZXJ2ZShvLmF0dHJpYnV0ZXMuc2l6ZSgpKTsKLSAgZm9yIChjb25zdCBhdXRvICZ2IDogby5hdHRyaWJ1dGVzKSB7IGF0dHJpYnV0ZXMuZW1wbGFjZV9iYWNrKCh2KSA/IG5ldyByZWZsZWN0aW9uOjpLZXlWYWx1ZVQoKnYpIDogbnVsbHB0cik7IH0KKyAgZm9yIChjb25zdCBhdXRvICZhdHRyaWJ1dGVzXyA6IG8uYXR0cmlidXRlcykgeyBhdHRyaWJ1dGVzLmVtcGxhY2VfYmFjaygoYXR0cmlidXRlc18pID8gbmV3IHJlZmxlY3Rpb246OktleVZhbHVlVCgqYXR0cmlidXRlc18pIDogbnVsbHB0cik7IH0KIH0KIAogaW5saW5lIEVudW1UICZFbnVtVDo6b3BlcmF0b3I9KEVudW1UIG8pIEZMQVRCVUZGRVJTX05PRVhDRVBUIHsKQEAgLTE5NDIsMTEgKzI1NDksMTEgQEAKICAgKHZvaWQpX287CiAgICh2b2lkKV9yZXNvbHZlcjsKICAgeyBhdXRvIF9lID0gbmFtZSgpOyBpZiAoX2UpIF9vLT5uYW1lID0gX2UtPnN0cigpOyB9Ci0gIHsgYXV0byBfZSA9IHZhbHVlcygpOyBpZiAoX2UpIHsgX28tPnZhbHVlcy5yZXNpemUoX2UtPnNpemUoKSk7IGZvciAoZmxhdGJ1ZmZlcnM6OnVvZmZzZXRfdCBfaSA9IDA7IF9pIDwgX2UtPnNpemUoKTsgX2krKykgeyBpZihfby0+dmFsdWVzW19pXSkgeyBfZS0+R2V0KF9pKS0+VW5QYWNrVG8oX28tPnZhbHVlc1tfaV0uZ2V0KCksIF9yZXNvbHZlcik7IH0gZWxzZSB7IF9vLT52YWx1ZXNbX2ldID0gc3RkOjp1bmlxdWVfcHRyPHJlZmxlY3Rpb246OkVudW1WYWxUPihfZS0+R2V0KF9pKS0+VW5QYWNrKF9yZXNvbHZlcikpOyB9OyB9IH0gfQorICB7IGF1dG8gX2UgPSB2YWx1ZXMoKTsgaWYgKF9lKSB7IF9vLT52YWx1ZXMucmVzaXplKF9lLT5zaXplKCkpOyBmb3IgKGZsYXRidWZmZXJzOjp1b2Zmc2V0X3QgX2kgPSAwOyBfaSA8IF9lLT5zaXplKCk7IF9pKyspIHsgaWYoX28tPnZhbHVlc1tfaV0pIHsgX2UtPkdldChfaSktPlVuUGFja1RvKF9vLT52YWx1ZXNbX2ldLmdldCgpLCBfcmVzb2x2ZXIpOyB9IGVsc2UgeyBfby0+dmFsdWVzW19pXSA9IGZsYXRidWZmZXJzOjp1bmlxdWVfcHRyPHJlZmxlY3Rpb246OkVudW1WYWxUPihfZS0+R2V0KF9pKS0+VW5QYWNrKF9yZXNvbHZlcikpOyB9OyB9IH0gZWxzZSB7IF9vLT52YWx1ZXMucmVzaXplKDApOyB9IH0KICAgeyBhdXRvIF9lID0gaXNfdW5pb24oKTsgX28tPmlzX3VuaW9uID0gX2U7IH0KLSAgeyBhdXRvIF9lID0gdW5kZXJseWluZ190eXBlKCk7IGlmIChfZSkgeyBpZihfby0+dW5kZXJseWluZ190eXBlKSB7IF9lLT5VblBhY2tUbyhfby0+dW5kZXJseWluZ190eXBlLmdldCgpLCBfcmVzb2x2ZXIpOyB9IGVsc2UgeyBfby0+dW5kZXJseWluZ190eXBlID0gc3RkOjp1bmlxdWVfcHRyPHJlZmxlY3Rpb246OlR5cGVUPihfZS0+VW5QYWNrKF9yZXNvbHZlcikpOyB9IH0gfQotICB7IGF1dG8gX2UgPSBhdHRyaWJ1dGVzKCk7IGlmIChfZSkgeyBfby0+YXR0cmlidXRlcy5yZXNpemUoX2UtPnNpemUoKSk7IGZvciAoZmxhdGJ1ZmZlcnM6OnVvZmZzZXRfdCBfaSA9IDA7IF9pIDwgX2UtPnNpemUoKTsgX2krKykgeyBpZihfby0+YXR0cmlidXRlc1tfaV0pIHsgX2UtPkdldChfaSktPlVuUGFja1RvKF9vLT5hdHRyaWJ1dGVzW19pXS5nZXQoKSwgX3Jlc29sdmVyKTsgfSBlbHNlIHsgX28tPmF0dHJpYnV0ZXNbX2ldID0gc3RkOjp1bmlxdWVfcHRyPHJlZmxlY3Rpb246OktleVZhbHVlVD4oX2UtPkdldChfaSktPlVuUGFjayhfcmVzb2x2ZXIpKTsgfTsgfSB9IH0KLSAgeyBhdXRvIF9lID0gZG9jdW1lbnRhdGlvbigpOyBpZiAoX2UpIHsgX28tPmRvY3VtZW50YXRpb24ucmVzaXplKF9lLT5zaXplKCkpOyBmb3IgKGZsYXRidWZmZXJzOjp1b2Zmc2V0X3QgX2kgPSAwOyBfaSA8IF9lLT5zaXplKCk7IF9pKyspIHsgX28tPmRvY3VtZW50YXRpb25bX2ldID0gX2UtPkdldChfaSktPnN0cigpOyB9IH0gfQorICB7IGF1dG8gX2UgPSB1bmRlcmx5aW5nX3R5cGUoKTsgaWYgKF9lKSB7IGlmKF9vLT51bmRlcmx5aW5nX3R5cGUpIHsgX2UtPlVuUGFja1RvKF9vLT51bmRlcmx5aW5nX3R5cGUuZ2V0KCksIF9yZXNvbHZlcik7IH0gZWxzZSB7IF9vLT51bmRlcmx5aW5nX3R5cGUgPSBmbGF0YnVmZmVyczo6dW5pcXVlX3B0cjxyZWZsZWN0aW9uOjpUeXBlVD4oX2UtPlVuUGFjayhfcmVzb2x2ZXIpKTsgfSB9IGVsc2UgaWYgKF9vLT51bmRlcmx5aW5nX3R5cGUpIHsgX28tPnVuZGVybHlpbmdfdHlwZS5yZXNldCgpOyB9IH0KKyAgeyBhdXRvIF9lID0gYXR0cmlidXRlcygpOyBpZiAoX2UpIHsgX28tPmF0dHJpYnV0ZXMucmVzaXplKF9lLT5zaXplKCkpOyBmb3IgKGZsYXRidWZmZXJzOjp1b2Zmc2V0X3QgX2kgPSAwOyBfaSA8IF9lLT5zaXplKCk7IF9pKyspIHsgaWYoX28tPmF0dHJpYnV0ZXNbX2ldKSB7IF9lLT5HZXQoX2kpLT5VblBhY2tUbyhfby0+YXR0cmlidXRlc1tfaV0uZ2V0KCksIF9yZXNvbHZlcik7IH0gZWxzZSB7IF9vLT5hdHRyaWJ1dGVzW19pXSA9IGZsYXRidWZmZXJzOjp1bmlxdWVfcHRyPHJlZmxlY3Rpb246OktleVZhbHVlVD4oX2UtPkdldChfaSktPlVuUGFjayhfcmVzb2x2ZXIpKTsgfTsgfSB9IGVsc2UgeyBfby0+YXR0cmlidXRlcy5yZXNpemUoMCk7IH0gfQorICB7IGF1dG8gX2UgPSBkb2N1bWVudGF0aW9uKCk7IGlmIChfZSkgeyBfby0+ZG9jdW1lbnRhdGlvbi5yZXNpemUoX2UtPnNpemUoKSk7IGZvciAoZmxhdGJ1ZmZlcnM6OnVvZmZzZXRfdCBfaSA9IDA7IF9pIDwgX2UtPnNpemUoKTsgX2krKykgeyBfby0+ZG9jdW1lbnRhdGlvbltfaV0gPSBfZS0+R2V0KF9pKS0+c3RyKCk7IH0gfSBlbHNlIHsgX28tPmRvY3VtZW50YXRpb24ucmVzaXplKDApOyB9IH0KICAgeyBhdXRvIF9lID0gZGVjbGFyYXRpb25fZmlsZSgpOyBpZiAoX2UpIF9vLT5kZWNsYXJhdGlvbl9maWxlID0gX2UtPnN0cigpOyB9CiB9CiAKQEAgLTE5NjIsOSArMjU2OSw5IEBACiAgIGF1dG8gX3ZhbHVlcyA9IF9mYmIuQ3JlYXRlVmVjdG9yPGZsYXRidWZmZXJzOjpPZmZzZXQ8cmVmbGVjdGlvbjo6RW51bVZhbD4+IChfby0+dmFsdWVzLnNpemUoKSwgW10oc2l6ZV90IGksIF9WZWN0b3JBcmdzICpfX3ZhKSB7IHJldHVybiBDcmVhdGVFbnVtVmFsKCpfX3ZhLT5fX2ZiYiwgX192YS0+X19vLT52YWx1ZXNbaV0uZ2V0KCksIF9fdmEtPl9fcmVoYXNoZXIpOyB9LCAmX3ZhICk7CiAgIGF1dG8gX2lzX3VuaW9uID0gX28tPmlzX3VuaW9uOwogICBhdXRvIF91bmRlcmx5aW5nX3R5cGUgPSBfby0+dW5kZXJseWluZ190eXBlID8gQ3JlYXRlVHlwZShfZmJiLCBfby0+dW5kZXJseWluZ190eXBlLmdldCgpLCBfcmVoYXNoZXIpIDogMDsKLSAgYXV0byBfYXR0cmlidXRlcyA9IF9vLT5hdHRyaWJ1dGVzLnNpemUoKSA/IF9mYmIuQ3JlYXRlVmVjdG9yPGZsYXRidWZmZXJzOjpPZmZzZXQ8cmVmbGVjdGlvbjo6S2V5VmFsdWU+PiAoX28tPmF0dHJpYnV0ZXMuc2l6ZSgpLCBbXShzaXplX3QgaSwgX1ZlY3RvckFyZ3MgKl9fdmEpIHsgcmV0dXJuIENyZWF0ZUtleVZhbHVlKCpfX3ZhLT5fX2ZiYiwgX192YS0+X19vLT5hdHRyaWJ1dGVzW2ldLmdldCgpLCBfX3ZhLT5fX3JlaGFzaGVyKTsgfSwgJl92YSApIDogMDsKLSAgYXV0byBfZG9jdW1lbnRhdGlvbiA9IF9vLT5kb2N1bWVudGF0aW9uLnNpemUoKSA/IF9mYmIuQ3JlYXRlVmVjdG9yT2ZTdHJpbmdzKF9vLT5kb2N1bWVudGF0aW9uKSA6IDA7Ci0gIGF1dG8gX2RlY2xhcmF0aW9uX2ZpbGUgPSBfby0+ZGVjbGFyYXRpb25fZmlsZS5lbXB0eSgpID8gMCA6IF9mYmIuQ3JlYXRlU3RyaW5nKF9vLT5kZWNsYXJhdGlvbl9maWxlKTsKKyAgYXV0byBfYXR0cmlidXRlcyA9IF9mYmIuQ3JlYXRlVmVjdG9yPGZsYXRidWZmZXJzOjpPZmZzZXQ8cmVmbGVjdGlvbjo6S2V5VmFsdWU+PiAoX28tPmF0dHJpYnV0ZXMuc2l6ZSgpLCBbXShzaXplX3QgaSwgX1ZlY3RvckFyZ3MgKl9fdmEpIHsgcmV0dXJuIENyZWF0ZUtleVZhbHVlKCpfX3ZhLT5fX2ZiYiwgX192YS0+X19vLT5hdHRyaWJ1dGVzW2ldLmdldCgpLCBfX3ZhLT5fX3JlaGFzaGVyKTsgfSwgJl92YSApOworICBhdXRvIF9kb2N1bWVudGF0aW9uID0gX2ZiYi5DcmVhdGVWZWN0b3JPZlN0cmluZ3MoX28tPmRvY3VtZW50YXRpb24pOworICBhdXRvIF9kZWNsYXJhdGlvbl9maWxlID0gX28tPmRlY2xhcmF0aW9uX2ZpbGUuZW1wdHkoKSA/IF9mYmIuQ3JlYXRlU2hhcmVkU3RyaW5nKCIiKSA6IF9mYmIuQ3JlYXRlU3RyaW5nKF9vLT5kZWNsYXJhdGlvbl9maWxlKTsKICAgcmV0dXJuIHJlZmxlY3Rpb246OkNyZWF0ZUVudW0oCiAgICAgICBfZmJiLAogICAgICAgX25hbWUsCkBAIC0xOTg4LDcgKzI1OTUsNyBAQAogICAgICAgKGxocy5kZXByZWNhdGVkID09IHJocy5kZXByZWNhdGVkKSAmJgogICAgICAgKGxocy5yZXF1aXJlZCA9PSByaHMucmVxdWlyZWQpICYmCiAgICAgICAobGhzLmtleSA9PSByaHMua2V5KSAmJgotICAgICAgKGxocy5hdHRyaWJ1dGVzID09IHJocy5hdHRyaWJ1dGVzKSAmJgorICAgICAgKGxocy5hdHRyaWJ1dGVzLnNpemUoKSA9PSByaHMuYXR0cmlidXRlcy5zaXplKCkgJiYgc3RkOjplcXVhbChsaHMuYXR0cmlidXRlcy5jYmVnaW4oKSwgbGhzLmF0dHJpYnV0ZXMuY2VuZCgpLCByaHMuYXR0cmlidXRlcy5jYmVnaW4oKSwgW10oZmxhdGJ1ZmZlcnM6OnVuaXF1ZV9wdHI8cmVmbGVjdGlvbjo6S2V5VmFsdWVUPiBjb25zdCAmYSwgZmxhdGJ1ZmZlcnM6OnVuaXF1ZV9wdHI8cmVmbGVjdGlvbjo6S2V5VmFsdWVUPiBjb25zdCAmYikgeyByZXR1cm4gKGEgPT0gYikgfHwgKGEgJiYgYiAmJiAqYSA9PSAqYik7IH0pKSAmJgogICAgICAgKGxocy5kb2N1bWVudGF0aW9uID09IHJocy5kb2N1bWVudGF0aW9uKSAmJgogICAgICAgKGxocy5vcHRpb25hbCA9PSByaHMub3B0aW9uYWwpICYmCiAgICAgICAobGhzLnBhZGRpbmcgPT0gcmhzLnBhZGRpbmcpOwpAQCAtMjAxMyw3ICsyNjIwLDcgQEAKICAgICAgICAgb3B0aW9uYWwoby5vcHRpb25hbCksCiAgICAgICAgIHBhZGRpbmcoby5wYWRkaW5nKSB7CiAgIGF0dHJpYnV0ZXMucmVzZXJ2ZShvLmF0dHJpYnV0ZXMuc2l6ZSgpKTsKLSAgZm9yIChjb25zdCBhdXRvICZ2IDogby5hdHRyaWJ1dGVzKSB7IGF0dHJpYnV0ZXMuZW1wbGFjZV9iYWNrKCh2KSA/IG5ldyByZWZsZWN0aW9uOjpLZXlWYWx1ZVQoKnYpIDogbnVsbHB0cik7IH0KKyAgZm9yIChjb25zdCBhdXRvICZhdHRyaWJ1dGVzXyA6IG8uYXR0cmlidXRlcykgeyBhdHRyaWJ1dGVzLmVtcGxhY2VfYmFjaygoYXR0cmlidXRlc18pID8gbmV3IHJlZmxlY3Rpb246OktleVZhbHVlVCgqYXR0cmlidXRlc18pIDogbnVsbHB0cik7IH0KIH0KIAogaW5saW5lIEZpZWxkVCAmRmllbGRUOjpvcGVyYXRvcj0oRmllbGRUIG8pIEZMQVRCVUZGRVJTX05PRVhDRVBUIHsKQEAgLTIwNDMsNyArMjY1MCw3IEBACiAgICh2b2lkKV9vOwogICAodm9pZClfcmVzb2x2ZXI7CiAgIHsgYXV0byBfZSA9IG5hbWUoKTsgaWYgKF9lKSBfby0+bmFtZSA9IF9lLT5zdHIoKTsgfQotICB7IGF1dG8gX2UgPSB0eXBlKCk7IGlmIChfZSkgeyBpZihfby0+dHlwZSkgeyBfZS0+VW5QYWNrVG8oX28tPnR5cGUuZ2V0KCksIF9yZXNvbHZlcik7IH0gZWxzZSB7IF9vLT50eXBlID0gc3RkOjp1bmlxdWVfcHRyPHJlZmxlY3Rpb246OlR5cGVUPihfZS0+VW5QYWNrKF9yZXNvbHZlcikpOyB9IH0gfQorICB7IGF1dG8gX2UgPSB0eXBlKCk7IGlmIChfZSkgeyBpZihfby0+dHlwZSkgeyBfZS0+VW5QYWNrVG8oX28tPnR5cGUuZ2V0KCksIF9yZXNvbHZlcik7IH0gZWxzZSB7IF9vLT50eXBlID0gZmxhdGJ1ZmZlcnM6OnVuaXF1ZV9wdHI8cmVmbGVjdGlvbjo6VHlwZVQ+KF9lLT5VblBhY2soX3Jlc29sdmVyKSk7IH0gfSBlbHNlIGlmIChfby0+dHlwZSkgeyBfby0+dHlwZS5yZXNldCgpOyB9IH0KICAgeyBhdXRvIF9lID0gaWQoKTsgX28tPmlkID0gX2U7IH0KICAgeyBhdXRvIF9lID0gb2Zmc2V0KCk7IF9vLT5vZmZzZXQgPSBfZTsgfQogICB7IGF1dG8gX2UgPSBkZWZhdWx0X2ludGVnZXIoKTsgX28tPmRlZmF1bHRfaW50ZWdlciA9IF9lOyB9CkBAIC0yMDUxLDggKzI2NTgsOCBAQAogICB7IGF1dG8gX2UgPSBkZXByZWNhdGVkKCk7IF9vLT5kZXByZWNhdGVkID0gX2U7IH0KICAgeyBhdXRvIF9lID0gcmVxdWlyZWQoKTsgX28tPnJlcXVpcmVkID0gX2U7IH0KICAgeyBhdXRvIF9lID0ga2V5KCk7IF9vLT5rZXkgPSBfZTsgfQotICB7IGF1dG8gX2UgPSBhdHRyaWJ1dGVzKCk7IGlmIChfZSkgeyBfby0+YXR0cmlidXRlcy5yZXNpemUoX2UtPnNpemUoKSk7IGZvciAoZmxhdGJ1ZmZlcnM6OnVvZmZzZXRfdCBfaSA9IDA7IF9pIDwgX2UtPnNpemUoKTsgX2krKykgeyBpZihfby0+YXR0cmlidXRlc1tfaV0pIHsgX2UtPkdldChfaSktPlVuUGFja1RvKF9vLT5hdHRyaWJ1dGVzW19pXS5nZXQoKSwgX3Jlc29sdmVyKTsgfSBlbHNlIHsgX28tPmF0dHJpYnV0ZXNbX2ldID0gc3RkOjp1bmlxdWVfcHRyPHJlZmxlY3Rpb246OktleVZhbHVlVD4oX2UtPkdldChfaSktPlVuUGFjayhfcmVzb2x2ZXIpKTsgfTsgfSB9IH0KLSAgeyBhdXRvIF9lID0gZG9jdW1lbnRhdGlvbigpOyBpZiAoX2UpIHsgX28tPmRvY3VtZW50YXRpb24ucmVzaXplKF9lLT5zaXplKCkpOyBmb3IgKGZsYXRidWZmZXJzOjp1b2Zmc2V0X3QgX2kgPSAwOyBfaSA8IF9lLT5zaXplKCk7IF9pKyspIHsgX28tPmRvY3VtZW50YXRpb25bX2ldID0gX2UtPkdldChfaSktPnN0cigpOyB9IH0gfQorICB7IGF1dG8gX2UgPSBhdHRyaWJ1dGVzKCk7IGlmIChfZSkgeyBfby0+YXR0cmlidXRlcy5yZXNpemUoX2UtPnNpemUoKSk7IGZvciAoZmxhdGJ1ZmZlcnM6OnVvZmZzZXRfdCBfaSA9IDA7IF9pIDwgX2UtPnNpemUoKTsgX2krKykgeyBpZihfby0+YXR0cmlidXRlc1tfaV0pIHsgX2UtPkdldChfaSktPlVuUGFja1RvKF9vLT5hdHRyaWJ1dGVzW19pXS5nZXQoKSwgX3Jlc29sdmVyKTsgfSBlbHNlIHsgX28tPmF0dHJpYnV0ZXNbX2ldID0gZmxhdGJ1ZmZlcnM6OnVuaXF1ZV9wdHI8cmVmbGVjdGlvbjo6S2V5VmFsdWVUPihfZS0+R2V0KF9pKS0+VW5QYWNrKF9yZXNvbHZlcikpOyB9OyB9IH0gZWxzZSB7IF9vLT5hdHRyaWJ1dGVzLnJlc2l6ZSgwKTsgfSB9CisgIHsgYXV0byBfZSA9IGRvY3VtZW50YXRpb24oKTsgaWYgKF9lKSB7IF9vLT5kb2N1bWVudGF0aW9uLnJlc2l6ZShfZS0+c2l6ZSgpKTsgZm9yIChmbGF0YnVmZmVyczo6dW9mZnNldF90IF9pID0gMDsgX2kgPCBfZS0+c2l6ZSgpOyBfaSsrKSB7IF9vLT5kb2N1bWVudGF0aW9uW19pXSA9IF9lLT5HZXQoX2kpLT5zdHIoKTsgfSB9IGVsc2UgeyBfby0+ZG9jdW1lbnRhdGlvbi5yZXNpemUoMCk7IH0gfQogICB7IGF1dG8gX2UgPSBvcHRpb25hbCgpOyBfby0+b3B0aW9uYWwgPSBfZTsgfQogICB7IGF1dG8gX2UgPSBwYWRkaW5nKCk7IF9vLT5wYWRkaW5nID0gX2U7IH0KIH0KQEAgLTIwNzQsOCArMjY4MSw4IEBACiAgIGF1dG8gX2RlcHJlY2F0ZWQgPSBfby0+ZGVwcmVjYXRlZDsKICAgYXV0byBfcmVxdWlyZWQgPSBfby0+cmVxdWlyZWQ7CiAgIGF1dG8gX2tleSA9IF9vLT5rZXk7Ci0gIGF1dG8gX2F0dHJpYnV0ZXMgPSBfby0+YXR0cmlidXRlcy5zaXplKCkgPyBfZmJiLkNyZWF0ZVZlY3RvcjxmbGF0YnVmZmVyczo6T2Zmc2V0PHJlZmxlY3Rpb246OktleVZhbHVlPj4gKF9vLT5hdHRyaWJ1dGVzLnNpemUoKSwgW10oc2l6ZV90IGksIF9WZWN0b3JBcmdzICpfX3ZhKSB7IHJldHVybiBDcmVhdGVLZXlWYWx1ZSgqX192YS0+X19mYmIsIF9fdmEtPl9fby0+YXR0cmlidXRlc1tpXS5nZXQoKSwgX192YS0+X19yZWhhc2hlcik7IH0sICZfdmEgKSA6IDA7Ci0gIGF1dG8gX2RvY3VtZW50YXRpb24gPSBfby0+ZG9jdW1lbnRhdGlvbi5zaXplKCkgPyBfZmJiLkNyZWF0ZVZlY3Rvck9mU3RyaW5ncyhfby0+ZG9jdW1lbnRhdGlvbikgOiAwOworICBhdXRvIF9hdHRyaWJ1dGVzID0gX2ZiYi5DcmVhdGVWZWN0b3I8ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxyZWZsZWN0aW9uOjpLZXlWYWx1ZT4+IChfby0+YXR0cmlidXRlcy5zaXplKCksIFtdKHNpemVfdCBpLCBfVmVjdG9yQXJncyAqX192YSkgeyByZXR1cm4gQ3JlYXRlS2V5VmFsdWUoKl9fdmEtPl9fZmJiLCBfX3ZhLT5fX28tPmF0dHJpYnV0ZXNbaV0uZ2V0KCksIF9fdmEtPl9fcmVoYXNoZXIpOyB9LCAmX3ZhICk7CisgIGF1dG8gX2RvY3VtZW50YXRpb24gPSBfZmJiLkNyZWF0ZVZlY3Rvck9mU3RyaW5ncyhfby0+ZG9jdW1lbnRhdGlvbik7CiAgIGF1dG8gX29wdGlvbmFsID0gX28tPm9wdGlvbmFsOwogICBhdXRvIF9wYWRkaW5nID0gX28tPnBhZGRpbmc7CiAgIHJldHVybiByZWZsZWN0aW9uOjpDcmVhdGVGaWVsZCgKQEAgLTIwOTksMTEgKzI3MDYsMTEgQEAKIGlubGluZSBib29sIG9wZXJhdG9yPT0oY29uc3QgT2JqZWN0VCAmbGhzLCBjb25zdCBPYmplY3RUICZyaHMpIHsKICAgcmV0dXJuCiAgICAgICAobGhzLm5hbWUgPT0gcmhzLm5hbWUpICYmCi0gICAgICAobGhzLmZpZWxkcyA9PSByaHMuZmllbGRzKSAmJgorICAgICAgKGxocy5maWVsZHMuc2l6ZSgpID09IHJocy5maWVsZHMuc2l6ZSgpICYmIHN0ZDo6ZXF1YWwobGhzLmZpZWxkcy5jYmVnaW4oKSwgbGhzLmZpZWxkcy5jZW5kKCksIHJocy5maWVsZHMuY2JlZ2luKCksIFtdKGZsYXRidWZmZXJzOjp1bmlxdWVfcHRyPHJlZmxlY3Rpb246OkZpZWxkVD4gY29uc3QgJmEsIGZsYXRidWZmZXJzOjp1bmlxdWVfcHRyPHJlZmxlY3Rpb246OkZpZWxkVD4gY29uc3QgJmIpIHsgcmV0dXJuIChhID09IGIpIHx8IChhICYmIGIgJiYgKmEgPT0gKmIpOyB9KSkgJiYKICAgICAgIChsaHMuaXNfc3RydWN0ID09IHJocy5pc19zdHJ1Y3QpICYmCiAgICAgICAobGhzLm1pbmFsaWduID09IHJocy5taW5hbGlnbikgJiYKICAgICAgIChsaHMuYnl0ZXNpemUgPT0gcmhzLmJ5dGVzaXplKSAmJgotICAgICAgKGxocy5hdHRyaWJ1dGVzID09IHJocy5hdHRyaWJ1dGVzKSAmJgorICAgICAgKGxocy5hdHRyaWJ1dGVzLnNpemUoKSA9PSByaHMuYXR0cmlidXRlcy5zaXplKCkgJiYgc3RkOjplcXVhbChsaHMuYXR0cmlidXRlcy5jYmVnaW4oKSwgbGhzLmF0dHJpYnV0ZXMuY2VuZCgpLCByaHMuYXR0cmlidXRlcy5jYmVnaW4oKSwgW10oZmxhdGJ1ZmZlcnM6OnVuaXF1ZV9wdHI8cmVmbGVjdGlvbjo6S2V5VmFsdWVUPiBjb25zdCAmYSwgZmxhdGJ1ZmZlcnM6OnVuaXF1ZV9wdHI8cmVmbGVjdGlvbjo6S2V5VmFsdWVUPiBjb25zdCAmYikgeyByZXR1cm4gKGEgPT0gYikgfHwgKGEgJiYgYiAmJiAqYSA9PSAqYik7IH0pKSAmJgogICAgICAgKGxocy5kb2N1bWVudGF0aW9uID09IHJocy5kb2N1bWVudGF0aW9uKSAmJgogICAgICAgKGxocy5kZWNsYXJhdGlvbl9maWxlID09IHJocy5kZWNsYXJhdGlvbl9maWxlKTsKIH0KQEAgLTIxMjEsOSArMjcyOCw5IEBACiAgICAgICAgIGRvY3VtZW50YXRpb24oby5kb2N1bWVudGF0aW9uKSwKICAgICAgICAgZGVjbGFyYXRpb25fZmlsZShvLmRlY2xhcmF0aW9uX2ZpbGUpIHsKICAgZmllbGRzLnJlc2VydmUoby5maWVsZHMuc2l6ZSgpKTsKLSAgZm9yIChjb25zdCBhdXRvICZ2IDogby5maWVsZHMpIHsgZmllbGRzLmVtcGxhY2VfYmFjaygodikgPyBuZXcgcmVmbGVjdGlvbjo6RmllbGRUKCp2KSA6IG51bGxwdHIpOyB9CisgIGZvciAoY29uc3QgYXV0byAmZmllbGRzXyA6IG8uZmllbGRzKSB7IGZpZWxkcy5lbXBsYWNlX2JhY2soKGZpZWxkc18pID8gbmV3IHJlZmxlY3Rpb246OkZpZWxkVCgqZmllbGRzXykgOiBudWxscHRyKTsgfQogICBhdHRyaWJ1dGVzLnJlc2VydmUoby5hdHRyaWJ1dGVzLnNpemUoKSk7Ci0gIGZvciAoY29uc3QgYXV0byAmdiA6IG8uYXR0cmlidXRlcykgeyBhdHRyaWJ1dGVzLmVtcGxhY2VfYmFjaygodikgPyBuZXcgcmVmbGVjdGlvbjo6S2V5VmFsdWVUKCp2KSA6IG51bGxwdHIpOyB9CisgIGZvciAoY29uc3QgYXV0byAmYXR0cmlidXRlc18gOiBvLmF0dHJpYnV0ZXMpIHsgYXR0cmlidXRlcy5lbXBsYWNlX2JhY2soKGF0dHJpYnV0ZXNfKSA/IG5ldyByZWZsZWN0aW9uOjpLZXlWYWx1ZVQoKmF0dHJpYnV0ZXNfKSA6IG51bGxwdHIpOyB9CiB9CiAKIGlubGluZSBPYmplY3RUICZPYmplY3RUOjpvcGVyYXRvcj0oT2JqZWN0VCBvKSBGTEFUQlVGRkVSU19OT0VYQ0VQVCB7CkBAIC0yMTQ4LDEyICsyNzU1LDEyIEBACiAgICh2b2lkKV9vOwogICAodm9pZClfcmVzb2x2ZXI7CiAgIHsgYXV0byBfZSA9IG5hbWUoKTsgaWYgKF9lKSBfby0+bmFtZSA9IF9lLT5zdHIoKTsgfQotICB7IGF1dG8gX2UgPSBmaWVsZHMoKTsgaWYgKF9lKSB7IF9vLT5maWVsZHMucmVzaXplKF9lLT5zaXplKCkpOyBmb3IgKGZsYXRidWZmZXJzOjp1b2Zmc2V0X3QgX2kgPSAwOyBfaSA8IF9lLT5zaXplKCk7IF9pKyspIHsgaWYoX28tPmZpZWxkc1tfaV0pIHsgX2UtPkdldChfaSktPlVuUGFja1RvKF9vLT5maWVsZHNbX2ldLmdldCgpLCBfcmVzb2x2ZXIpOyB9IGVsc2UgeyBfby0+ZmllbGRzW19pXSA9IHN0ZDo6dW5pcXVlX3B0cjxyZWZsZWN0aW9uOjpGaWVsZFQ+KF9lLT5HZXQoX2kpLT5VblBhY2soX3Jlc29sdmVyKSk7IH07IH0gfSB9CisgIHsgYXV0byBfZSA9IGZpZWxkcygpOyBpZiAoX2UpIHsgX28tPmZpZWxkcy5yZXNpemUoX2UtPnNpemUoKSk7IGZvciAoZmxhdGJ1ZmZlcnM6OnVvZmZzZXRfdCBfaSA9IDA7IF9pIDwgX2UtPnNpemUoKTsgX2krKykgeyBpZihfby0+ZmllbGRzW19pXSkgeyBfZS0+R2V0KF9pKS0+VW5QYWNrVG8oX28tPmZpZWxkc1tfaV0uZ2V0KCksIF9yZXNvbHZlcik7IH0gZWxzZSB7IF9vLT5maWVsZHNbX2ldID0gZmxhdGJ1ZmZlcnM6OnVuaXF1ZV9wdHI8cmVmbGVjdGlvbjo6RmllbGRUPihfZS0+R2V0KF9pKS0+VW5QYWNrKF9yZXNvbHZlcikpOyB9OyB9IH0gZWxzZSB7IF9vLT5maWVsZHMucmVzaXplKDApOyB9IH0KICAgeyBhdXRvIF9lID0gaXNfc3RydWN0KCk7IF9vLT5pc19zdHJ1Y3QgPSBfZTsgfQogICB7IGF1dG8gX2UgPSBtaW5hbGlnbigpOyBfby0+bWluYWxpZ24gPSBfZTsgfQogICB7IGF1dG8gX2UgPSBieXRlc2l6ZSgpOyBfby0+Ynl0ZXNpemUgPSBfZTsgfQotICB7IGF1dG8gX2UgPSBhdHRyaWJ1dGVzKCk7IGlmIChfZSkgeyBfby0+YXR0cmlidXRlcy5yZXNpemUoX2UtPnNpemUoKSk7IGZvciAoZmxhdGJ1ZmZlcnM6OnVvZmZzZXRfdCBfaSA9IDA7IF9pIDwgX2UtPnNpemUoKTsgX2krKykgeyBpZihfby0+YXR0cmlidXRlc1tfaV0pIHsgX2UtPkdldChfaSktPlVuUGFja1RvKF9vLT5hdHRyaWJ1dGVzW19pXS5nZXQoKSwgX3Jlc29sdmVyKTsgfSBlbHNlIHsgX28tPmF0dHJpYnV0ZXNbX2ldID0gc3RkOjp1bmlxdWVfcHRyPHJlZmxlY3Rpb246OktleVZhbHVlVD4oX2UtPkdldChfaSktPlVuUGFjayhfcmVzb2x2ZXIpKTsgfTsgfSB9IH0KLSAgeyBhdXRvIF9lID0gZG9jdW1lbnRhdGlvbigpOyBpZiAoX2UpIHsgX28tPmRvY3VtZW50YXRpb24ucmVzaXplKF9lLT5zaXplKCkpOyBmb3IgKGZsYXRidWZmZXJzOjp1b2Zmc2V0X3QgX2kgPSAwOyBfaSA8IF9lLT5zaXplKCk7IF9pKyspIHsgX28tPmRvY3VtZW50YXRpb25bX2ldID0gX2UtPkdldChfaSktPnN0cigpOyB9IH0gfQorICB7IGF1dG8gX2UgPSBhdHRyaWJ1dGVzKCk7IGlmIChfZSkgeyBfby0+YXR0cmlidXRlcy5yZXNpemUoX2UtPnNpemUoKSk7IGZvciAoZmxhdGJ1ZmZlcnM6OnVvZmZzZXRfdCBfaSA9IDA7IF9pIDwgX2UtPnNpemUoKTsgX2krKykgeyBpZihfby0+YXR0cmlidXRlc1tfaV0pIHsgX2UtPkdldChfaSktPlVuUGFja1RvKF9vLT5hdHRyaWJ1dGVzW19pXS5nZXQoKSwgX3Jlc29sdmVyKTsgfSBlbHNlIHsgX28tPmF0dHJpYnV0ZXNbX2ldID0gZmxhdGJ1ZmZlcnM6OnVuaXF1ZV9wdHI8cmVmbGVjdGlvbjo6S2V5VmFsdWVUPihfZS0+R2V0KF9pKS0+VW5QYWNrKF9yZXNvbHZlcikpOyB9OyB9IH0gZWxzZSB7IF9vLT5hdHRyaWJ1dGVzLnJlc2l6ZSgwKTsgfSB9CisgIHsgYXV0byBfZSA9IGRvY3VtZW50YXRpb24oKTsgaWYgKF9lKSB7IF9vLT5kb2N1bWVudGF0aW9uLnJlc2l6ZShfZS0+c2l6ZSgpKTsgZm9yIChmbGF0YnVmZmVyczo6dW9mZnNldF90IF9pID0gMDsgX2kgPCBfZS0+c2l6ZSgpOyBfaSsrKSB7IF9vLT5kb2N1bWVudGF0aW9uW19pXSA9IF9lLT5HZXQoX2kpLT5zdHIoKTsgfSB9IGVsc2UgeyBfby0+ZG9jdW1lbnRhdGlvbi5yZXNpemUoMCk7IH0gfQogICB7IGF1dG8gX2UgPSBkZWNsYXJhdGlvbl9maWxlKCk7IGlmIChfZSkgX28tPmRlY2xhcmF0aW9uX2ZpbGUgPSBfZS0+c3RyKCk7IH0KIH0KIApAQCAtMjE3MCw5ICsyNzc3LDkgQEAKICAgYXV0byBfaXNfc3RydWN0ID0gX28tPmlzX3N0cnVjdDsKICAgYXV0byBfbWluYWxpZ24gPSBfby0+bWluYWxpZ247CiAgIGF1dG8gX2J5dGVzaXplID0gX28tPmJ5dGVzaXplOwotICBhdXRvIF9hdHRyaWJ1dGVzID0gX28tPmF0dHJpYnV0ZXMuc2l6ZSgpID8gX2ZiYi5DcmVhdGVWZWN0b3I8ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxyZWZsZWN0aW9uOjpLZXlWYWx1ZT4+IChfby0+YXR0cmlidXRlcy5zaXplKCksIFtdKHNpemVfdCBpLCBfVmVjdG9yQXJncyAqX192YSkgeyByZXR1cm4gQ3JlYXRlS2V5VmFsdWUoKl9fdmEtPl9fZmJiLCBfX3ZhLT5fX28tPmF0dHJpYnV0ZXNbaV0uZ2V0KCksIF9fdmEtPl9fcmVoYXNoZXIpOyB9LCAmX3ZhICkgOiAwOwotICBhdXRvIF9kb2N1bWVudGF0aW9uID0gX28tPmRvY3VtZW50YXRpb24uc2l6ZSgpID8gX2ZiYi5DcmVhdGVWZWN0b3JPZlN0cmluZ3MoX28tPmRvY3VtZW50YXRpb24pIDogMDsKLSAgYXV0byBfZGVjbGFyYXRpb25fZmlsZSA9IF9vLT5kZWNsYXJhdGlvbl9maWxlLmVtcHR5KCkgPyAwIDogX2ZiYi5DcmVhdGVTdHJpbmcoX28tPmRlY2xhcmF0aW9uX2ZpbGUpOworICBhdXRvIF9hdHRyaWJ1dGVzID0gX2ZiYi5DcmVhdGVWZWN0b3I8ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxyZWZsZWN0aW9uOjpLZXlWYWx1ZT4+IChfby0+YXR0cmlidXRlcy5zaXplKCksIFtdKHNpemVfdCBpLCBfVmVjdG9yQXJncyAqX192YSkgeyByZXR1cm4gQ3JlYXRlS2V5VmFsdWUoKl9fdmEtPl9fZmJiLCBfX3ZhLT5fX28tPmF0dHJpYnV0ZXNbaV0uZ2V0KCksIF9fdmEtPl9fcmVoYXNoZXIpOyB9LCAmX3ZhICk7CisgIGF1dG8gX2RvY3VtZW50YXRpb24gPSBfZmJiLkNyZWF0ZVZlY3Rvck9mU3RyaW5ncyhfby0+ZG9jdW1lbnRhdGlvbik7CisgIGF1dG8gX2RlY2xhcmF0aW9uX2ZpbGUgPSBfby0+ZGVjbGFyYXRpb25fZmlsZS5lbXB0eSgpID8gX2ZiYi5DcmVhdGVTaGFyZWRTdHJpbmcoIiIpIDogX2ZiYi5DcmVhdGVTdHJpbmcoX28tPmRlY2xhcmF0aW9uX2ZpbGUpOwogICByZXR1cm4gcmVmbGVjdGlvbjo6Q3JlYXRlT2JqZWN0KAogICAgICAgX2ZiYiwKICAgICAgIF9uYW1lLApAQCAtMjE5MSw3ICsyNzk4LDcgQEAKICAgICAgIChsaHMubmFtZSA9PSByaHMubmFtZSkgJiYKICAgICAgICgobGhzLnJlcXVlc3QgPT0gcmhzLnJlcXVlc3QpIHx8IChsaHMucmVxdWVzdCAmJiByaHMucmVxdWVzdCAmJiAqbGhzLnJlcXVlc3QgPT0gKnJocy5yZXF1ZXN0KSkgJiYKICAgICAgICgobGhzLnJlc3BvbnNlID09IHJocy5yZXNwb25zZSkgfHwgKGxocy5yZXNwb25zZSAmJiByaHMucmVzcG9uc2UgJiYgKmxocy5yZXNwb25zZSA9PSAqcmhzLnJlc3BvbnNlKSkgJiYKLSAgICAgIChsaHMuYXR0cmlidXRlcyA9PSByaHMuYXR0cmlidXRlcykgJiYKKyAgICAgIChsaHMuYXR0cmlidXRlcy5zaXplKCkgPT0gcmhzLmF0dHJpYnV0ZXMuc2l6ZSgpICYmIHN0ZDo6ZXF1YWwobGhzLmF0dHJpYnV0ZXMuY2JlZ2luKCksIGxocy5hdHRyaWJ1dGVzLmNlbmQoKSwgcmhzLmF0dHJpYnV0ZXMuY2JlZ2luKCksIFtdKGZsYXRidWZmZXJzOjp1bmlxdWVfcHRyPHJlZmxlY3Rpb246OktleVZhbHVlVD4gY29uc3QgJmEsIGZsYXRidWZmZXJzOjp1bmlxdWVfcHRyPHJlZmxlY3Rpb246OktleVZhbHVlVD4gY29uc3QgJmIpIHsgcmV0dXJuIChhID09IGIpIHx8IChhICYmIGIgJiYgKmEgPT0gKmIpOyB9KSkgJiYKICAgICAgIChsaHMuZG9jdW1lbnRhdGlvbiA9PSByaHMuZG9jdW1lbnRhdGlvbik7CiB9CiAKQEAgLTIyMDYsNyArMjgxMyw3IEBACiAgICAgICAgIHJlc3BvbnNlKChvLnJlc3BvbnNlKSA/IG5ldyByZWZsZWN0aW9uOjpPYmplY3RUKCpvLnJlc3BvbnNlKSA6IG51bGxwdHIpLAogICAgICAgICBkb2N1bWVudGF0aW9uKG8uZG9jdW1lbnRhdGlvbikgewogICBhdHRyaWJ1dGVzLnJlc2VydmUoby5hdHRyaWJ1dGVzLnNpemUoKSk7Ci0gIGZvciAoY29uc3QgYXV0byAmdiA6IG8uYXR0cmlidXRlcykgeyBhdHRyaWJ1dGVzLmVtcGxhY2VfYmFjaygodikgPyBuZXcgcmVmbGVjdGlvbjo6S2V5VmFsdWVUKCp2KSA6IG51bGxwdHIpOyB9CisgIGZvciAoY29uc3QgYXV0byAmYXR0cmlidXRlc18gOiBvLmF0dHJpYnV0ZXMpIHsgYXR0cmlidXRlcy5lbXBsYWNlX2JhY2soKGF0dHJpYnV0ZXNfKSA/IG5ldyByZWZsZWN0aW9uOjpLZXlWYWx1ZVQoKmF0dHJpYnV0ZXNfKSA6IG51bGxwdHIpOyB9CiB9CiAKIGlubGluZSBSUENDYWxsVCAmUlBDQ2FsbFQ6Om9wZXJhdG9yPShSUENDYWxsVCBvKSBGTEFUQlVGRkVSU19OT0VYQ0VQVCB7CkBAIC0yMjI4LDEwICsyODM1LDEwIEBACiAgICh2b2lkKV9vOwogICAodm9pZClfcmVzb2x2ZXI7CiAgIHsgYXV0byBfZSA9IG5hbWUoKTsgaWYgKF9lKSBfby0+bmFtZSA9IF9lLT5zdHIoKTsgfQotICB7IGF1dG8gX2UgPSByZXF1ZXN0KCk7IGlmIChfZSkgeyBpZihfby0+cmVxdWVzdCkgeyBfZS0+VW5QYWNrVG8oX28tPnJlcXVlc3QuZ2V0KCksIF9yZXNvbHZlcik7IH0gZWxzZSB7IF9vLT5yZXF1ZXN0ID0gc3RkOjp1bmlxdWVfcHRyPHJlZmxlY3Rpb246Ok9iamVjdFQ+KF9lLT5VblBhY2soX3Jlc29sdmVyKSk7IH0gfSB9Ci0gIHsgYXV0byBfZSA9IHJlc3BvbnNlKCk7IGlmIChfZSkgeyBpZihfby0+cmVzcG9uc2UpIHsgX2UtPlVuUGFja1RvKF9vLT5yZXNwb25zZS5nZXQoKSwgX3Jlc29sdmVyKTsgfSBlbHNlIHsgX28tPnJlc3BvbnNlID0gc3RkOjp1bmlxdWVfcHRyPHJlZmxlY3Rpb246Ok9iamVjdFQ+KF9lLT5VblBhY2soX3Jlc29sdmVyKSk7IH0gfSB9Ci0gIHsgYXV0byBfZSA9IGF0dHJpYnV0ZXMoKTsgaWYgKF9lKSB7IF9vLT5hdHRyaWJ1dGVzLnJlc2l6ZShfZS0+c2l6ZSgpKTsgZm9yIChmbGF0YnVmZmVyczo6dW9mZnNldF90IF9pID0gMDsgX2kgPCBfZS0+c2l6ZSgpOyBfaSsrKSB7IGlmKF9vLT5hdHRyaWJ1dGVzW19pXSkgeyBfZS0+R2V0KF9pKS0+VW5QYWNrVG8oX28tPmF0dHJpYnV0ZXNbX2ldLmdldCgpLCBfcmVzb2x2ZXIpOyB9IGVsc2UgeyBfby0+YXR0cmlidXRlc1tfaV0gPSBzdGQ6OnVuaXF1ZV9wdHI8cmVmbGVjdGlvbjo6S2V5VmFsdWVUPihfZS0+R2V0KF9pKS0+VW5QYWNrKF9yZXNvbHZlcikpOyB9OyB9IH0gfQotICB7IGF1dG8gX2UgPSBkb2N1bWVudGF0aW9uKCk7IGlmIChfZSkgeyBfby0+ZG9jdW1lbnRhdGlvbi5yZXNpemUoX2UtPnNpemUoKSk7IGZvciAoZmxhdGJ1ZmZlcnM6OnVvZmZzZXRfdCBfaSA9IDA7IF9pIDwgX2UtPnNpemUoKTsgX2krKykgeyBfby0+ZG9jdW1lbnRhdGlvbltfaV0gPSBfZS0+R2V0KF9pKS0+c3RyKCk7IH0gfSB9CisgIHsgYXV0byBfZSA9IHJlcXVlc3QoKTsgaWYgKF9lKSB7IGlmKF9vLT5yZXF1ZXN0KSB7IF9lLT5VblBhY2tUbyhfby0+cmVxdWVzdC5nZXQoKSwgX3Jlc29sdmVyKTsgfSBlbHNlIHsgX28tPnJlcXVlc3QgPSBmbGF0YnVmZmVyczo6dW5pcXVlX3B0cjxyZWZsZWN0aW9uOjpPYmplY3RUPihfZS0+VW5QYWNrKF9yZXNvbHZlcikpOyB9IH0gZWxzZSBpZiAoX28tPnJlcXVlc3QpIHsgX28tPnJlcXVlc3QucmVzZXQoKTsgfSB9CisgIHsgYXV0byBfZSA9IHJlc3BvbnNlKCk7IGlmIChfZSkgeyBpZihfby0+cmVzcG9uc2UpIHsgX2UtPlVuUGFja1RvKF9vLT5yZXNwb25zZS5nZXQoKSwgX3Jlc29sdmVyKTsgfSBlbHNlIHsgX28tPnJlc3BvbnNlID0gZmxhdGJ1ZmZlcnM6OnVuaXF1ZV9wdHI8cmVmbGVjdGlvbjo6T2JqZWN0VD4oX2UtPlVuUGFjayhfcmVzb2x2ZXIpKTsgfSB9IGVsc2UgaWYgKF9vLT5yZXNwb25zZSkgeyBfby0+cmVzcG9uc2UucmVzZXQoKTsgfSB9CisgIHsgYXV0byBfZSA9IGF0dHJpYnV0ZXMoKTsgaWYgKF9lKSB7IF9vLT5hdHRyaWJ1dGVzLnJlc2l6ZShfZS0+c2l6ZSgpKTsgZm9yIChmbGF0YnVmZmVyczo6dW9mZnNldF90IF9pID0gMDsgX2kgPCBfZS0+c2l6ZSgpOyBfaSsrKSB7IGlmKF9vLT5hdHRyaWJ1dGVzW19pXSkgeyBfZS0+R2V0KF9pKS0+VW5QYWNrVG8oX28tPmF0dHJpYnV0ZXNbX2ldLmdldCgpLCBfcmVzb2x2ZXIpOyB9IGVsc2UgeyBfby0+YXR0cmlidXRlc1tfaV0gPSBmbGF0YnVmZmVyczo6dW5pcXVlX3B0cjxyZWZsZWN0aW9uOjpLZXlWYWx1ZVQ+KF9lLT5HZXQoX2kpLT5VblBhY2soX3Jlc29sdmVyKSk7IH07IH0gfSBlbHNlIHsgX28tPmF0dHJpYnV0ZXMucmVzaXplKDApOyB9IH0KKyAgeyBhdXRvIF9lID0gZG9jdW1lbnRhdGlvbigpOyBpZiAoX2UpIHsgX28tPmRvY3VtZW50YXRpb24ucmVzaXplKF9lLT5zaXplKCkpOyBmb3IgKGZsYXRidWZmZXJzOjp1b2Zmc2V0X3QgX2kgPSAwOyBfaSA8IF9lLT5zaXplKCk7IF9pKyspIHsgX28tPmRvY3VtZW50YXRpb25bX2ldID0gX2UtPkdldChfaSktPnN0cigpOyB9IH0gZWxzZSB7IF9vLT5kb2N1bWVudGF0aW9uLnJlc2l6ZSgwKTsgfSB9CiB9CiAKIGlubGluZSBmbGF0YnVmZmVyczo6T2Zmc2V0PFJQQ0NhbGw+IFJQQ0NhbGw6OlBhY2soZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBSUENDYWxsVCogX28sIGNvbnN0IGZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIpIHsKQEAgLTIyNDUsOCArMjg1Miw4IEBACiAgIGF1dG8gX25hbWUgPSBfZmJiLkNyZWF0ZVN0cmluZyhfby0+bmFtZSk7CiAgIGF1dG8gX3JlcXVlc3QgPSBfby0+cmVxdWVzdCA/IENyZWF0ZU9iamVjdChfZmJiLCBfby0+cmVxdWVzdC5nZXQoKSwgX3JlaGFzaGVyKSA6IDA7CiAgIGF1dG8gX3Jlc3BvbnNlID0gX28tPnJlc3BvbnNlID8gQ3JlYXRlT2JqZWN0KF9mYmIsIF9vLT5yZXNwb25zZS5nZXQoKSwgX3JlaGFzaGVyKSA6IDA7Ci0gIGF1dG8gX2F0dHJpYnV0ZXMgPSBfby0+YXR0cmlidXRlcy5zaXplKCkgPyBfZmJiLkNyZWF0ZVZlY3RvcjxmbGF0YnVmZmVyczo6T2Zmc2V0PHJlZmxlY3Rpb246OktleVZhbHVlPj4gKF9vLT5hdHRyaWJ1dGVzLnNpemUoKSwgW10oc2l6ZV90IGksIF9WZWN0b3JBcmdzICpfX3ZhKSB7IHJldHVybiBDcmVhdGVLZXlWYWx1ZSgqX192YS0+X19mYmIsIF9fdmEtPl9fby0+YXR0cmlidXRlc1tpXS5nZXQoKSwgX192YS0+X19yZWhhc2hlcik7IH0sICZfdmEgKSA6IDA7Ci0gIGF1dG8gX2RvY3VtZW50YXRpb24gPSBfby0+ZG9jdW1lbnRhdGlvbi5zaXplKCkgPyBfZmJiLkNyZWF0ZVZlY3Rvck9mU3RyaW5ncyhfby0+ZG9jdW1lbnRhdGlvbikgOiAwOworICBhdXRvIF9hdHRyaWJ1dGVzID0gX2ZiYi5DcmVhdGVWZWN0b3I8ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxyZWZsZWN0aW9uOjpLZXlWYWx1ZT4+IChfby0+YXR0cmlidXRlcy5zaXplKCksIFtdKHNpemVfdCBpLCBfVmVjdG9yQXJncyAqX192YSkgeyByZXR1cm4gQ3JlYXRlS2V5VmFsdWUoKl9fdmEtPl9fZmJiLCBfX3ZhLT5fX28tPmF0dHJpYnV0ZXNbaV0uZ2V0KCksIF9fdmEtPl9fcmVoYXNoZXIpOyB9LCAmX3ZhICk7CisgIGF1dG8gX2RvY3VtZW50YXRpb24gPSBfZmJiLkNyZWF0ZVZlY3Rvck9mU3RyaW5ncyhfby0+ZG9jdW1lbnRhdGlvbik7CiAgIHJldHVybiByZWZsZWN0aW9uOjpDcmVhdGVSUENDYWxsKAogICAgICAgX2ZiYiwKICAgICAgIF9uYW1lLApAQCAtMjI2MCw4ICsyODY3LDggQEAKIGlubGluZSBib29sIG9wZXJhdG9yPT0oY29uc3QgU2VydmljZVQgJmxocywgY29uc3QgU2VydmljZVQgJnJocykgewogICByZXR1cm4KICAgICAgIChsaHMubmFtZSA9PSByaHMubmFtZSkgJiYKLSAgICAgIChsaHMuY2FsbHMgPT0gcmhzLmNhbGxzKSAmJgotICAgICAgKGxocy5hdHRyaWJ1dGVzID09IHJocy5hdHRyaWJ1dGVzKSAmJgorICAgICAgKGxocy5jYWxscy5zaXplKCkgPT0gcmhzLmNhbGxzLnNpemUoKSAmJiBzdGQ6OmVxdWFsKGxocy5jYWxscy5jYmVnaW4oKSwgbGhzLmNhbGxzLmNlbmQoKSwgcmhzLmNhbGxzLmNiZWdpbigpLCBbXShmbGF0YnVmZmVyczo6dW5pcXVlX3B0cjxyZWZsZWN0aW9uOjpSUENDYWxsVD4gY29uc3QgJmEsIGZsYXRidWZmZXJzOjp1bmlxdWVfcHRyPHJlZmxlY3Rpb246OlJQQ0NhbGxUPiBjb25zdCAmYikgeyByZXR1cm4gKGEgPT0gYikgfHwgKGEgJiYgYiAmJiAqYSA9PSAqYik7IH0pKSAmJgorICAgICAgKGxocy5hdHRyaWJ1dGVzLnNpemUoKSA9PSByaHMuYXR0cmlidXRlcy5zaXplKCkgJiYgc3RkOjplcXVhbChsaHMuYXR0cmlidXRlcy5jYmVnaW4oKSwgbGhzLmF0dHJpYnV0ZXMuY2VuZCgpLCByaHMuYXR0cmlidXRlcy5jYmVnaW4oKSwgW10oZmxhdGJ1ZmZlcnM6OnVuaXF1ZV9wdHI8cmVmbGVjdGlvbjo6S2V5VmFsdWVUPiBjb25zdCAmYSwgZmxhdGJ1ZmZlcnM6OnVuaXF1ZV9wdHI8cmVmbGVjdGlvbjo6S2V5VmFsdWVUPiBjb25zdCAmYikgeyByZXR1cm4gKGEgPT0gYikgfHwgKGEgJiYgYiAmJiAqYSA9PSAqYik7IH0pKSAmJgogICAgICAgKGxocy5kb2N1bWVudGF0aW9uID09IHJocy5kb2N1bWVudGF0aW9uKSAmJgogICAgICAgKGxocy5kZWNsYXJhdGlvbl9maWxlID09IHJocy5kZWNsYXJhdGlvbl9maWxlKTsKIH0KQEAgLTIyNzYsOSArMjg4Myw5IEBACiAgICAgICAgIGRvY3VtZW50YXRpb24oby5kb2N1bWVudGF0aW9uKSwKICAgICAgICAgZGVjbGFyYXRpb25fZmlsZShvLmRlY2xhcmF0aW9uX2ZpbGUpIHsKICAgY2FsbHMucmVzZXJ2ZShvLmNhbGxzLnNpemUoKSk7Ci0gIGZvciAoY29uc3QgYXV0byAmdiA6IG8uY2FsbHMpIHsgY2FsbHMuZW1wbGFjZV9iYWNrKCh2KSA/IG5ldyByZWZsZWN0aW9uOjpSUENDYWxsVCgqdikgOiBudWxscHRyKTsgfQorICBmb3IgKGNvbnN0IGF1dG8gJmNhbGxzXyA6IG8uY2FsbHMpIHsgY2FsbHMuZW1wbGFjZV9iYWNrKChjYWxsc18pID8gbmV3IHJlZmxlY3Rpb246OlJQQ0NhbGxUKCpjYWxsc18pIDogbnVsbHB0cik7IH0KICAgYXR0cmlidXRlcy5yZXNlcnZlKG8uYXR0cmlidXRlcy5zaXplKCkpOwotICBmb3IgKGNvbnN0IGF1dG8gJnYgOiBvLmF0dHJpYnV0ZXMpIHsgYXR0cmlidXRlcy5lbXBsYWNlX2JhY2soKHYpID8gbmV3IHJlZmxlY3Rpb246OktleVZhbHVlVCgqdikgOiBudWxscHRyKTsgfQorICBmb3IgKGNvbnN0IGF1dG8gJmF0dHJpYnV0ZXNfIDogby5hdHRyaWJ1dGVzKSB7IGF0dHJpYnV0ZXMuZW1wbGFjZV9iYWNrKChhdHRyaWJ1dGVzXykgPyBuZXcgcmVmbGVjdGlvbjo6S2V5VmFsdWVUKCphdHRyaWJ1dGVzXykgOiBudWxscHRyKTsgfQogfQogCiBpbmxpbmUgU2VydmljZVQgJlNlcnZpY2VUOjpvcGVyYXRvcj0oU2VydmljZVQgbykgRkxBVEJVRkZFUlNfTk9FWENFUFQgewpAQCAtMjMwMCw5ICsyOTA3LDkgQEAKICAgKHZvaWQpX287CiAgICh2b2lkKV9yZXNvbHZlcjsKICAgeyBhdXRvIF9lID0gbmFtZSgpOyBpZiAoX2UpIF9vLT5uYW1lID0gX2UtPnN0cigpOyB9Ci0gIHsgYXV0byBfZSA9IGNhbGxzKCk7IGlmIChfZSkgeyBfby0+Y2FsbHMucmVzaXplKF9lLT5zaXplKCkpOyBmb3IgKGZsYXRidWZmZXJzOjp1b2Zmc2V0X3QgX2kgPSAwOyBfaSA8IF9lLT5zaXplKCk7IF9pKyspIHsgaWYoX28tPmNhbGxzW19pXSkgeyBfZS0+R2V0KF9pKS0+VW5QYWNrVG8oX28tPmNhbGxzW19pXS5nZXQoKSwgX3Jlc29sdmVyKTsgfSBlbHNlIHsgX28tPmNhbGxzW19pXSA9IHN0ZDo6dW5pcXVlX3B0cjxyZWZsZWN0aW9uOjpSUENDYWxsVD4oX2UtPkdldChfaSktPlVuUGFjayhfcmVzb2x2ZXIpKTsgfTsgfSB9IH0KLSAgeyBhdXRvIF9lID0gYXR0cmlidXRlcygpOyBpZiAoX2UpIHsgX28tPmF0dHJpYnV0ZXMucmVzaXplKF9lLT5zaXplKCkpOyBmb3IgKGZsYXRidWZmZXJzOjp1b2Zmc2V0X3QgX2kgPSAwOyBfaSA8IF9lLT5zaXplKCk7IF9pKyspIHsgaWYoX28tPmF0dHJpYnV0ZXNbX2ldKSB7IF9lLT5HZXQoX2kpLT5VblBhY2tUbyhfby0+YXR0cmlidXRlc1tfaV0uZ2V0KCksIF9yZXNvbHZlcik7IH0gZWxzZSB7IF9vLT5hdHRyaWJ1dGVzW19pXSA9IHN0ZDo6dW5pcXVlX3B0cjxyZWZsZWN0aW9uOjpLZXlWYWx1ZVQ+KF9lLT5HZXQoX2kpLT5VblBhY2soX3Jlc29sdmVyKSk7IH07IH0gfSB9Ci0gIHsgYXV0byBfZSA9IGRvY3VtZW50YXRpb24oKTsgaWYgKF9lKSB7IF9vLT5kb2N1bWVudGF0aW9uLnJlc2l6ZShfZS0+c2l6ZSgpKTsgZm9yIChmbGF0YnVmZmVyczo6dW9mZnNldF90IF9pID0gMDsgX2kgPCBfZS0+c2l6ZSgpOyBfaSsrKSB7IF9vLT5kb2N1bWVudGF0aW9uW19pXSA9IF9lLT5HZXQoX2kpLT5zdHIoKTsgfSB9IH0KKyAgeyBhdXRvIF9lID0gY2FsbHMoKTsgaWYgKF9lKSB7IF9vLT5jYWxscy5yZXNpemUoX2UtPnNpemUoKSk7IGZvciAoZmxhdGJ1ZmZlcnM6OnVvZmZzZXRfdCBfaSA9IDA7IF9pIDwgX2UtPnNpemUoKTsgX2krKykgeyBpZihfby0+Y2FsbHNbX2ldKSB7IF9lLT5HZXQoX2kpLT5VblBhY2tUbyhfby0+Y2FsbHNbX2ldLmdldCgpLCBfcmVzb2x2ZXIpOyB9IGVsc2UgeyBfby0+Y2FsbHNbX2ldID0gZmxhdGJ1ZmZlcnM6OnVuaXF1ZV9wdHI8cmVmbGVjdGlvbjo6UlBDQ2FsbFQ+KF9lLT5HZXQoX2kpLT5VblBhY2soX3Jlc29sdmVyKSk7IH07IH0gfSBlbHNlIHsgX28tPmNhbGxzLnJlc2l6ZSgwKTsgfSB9CisgIHsgYXV0byBfZSA9IGF0dHJpYnV0ZXMoKTsgaWYgKF9lKSB7IF9vLT5hdHRyaWJ1dGVzLnJlc2l6ZShfZS0+c2l6ZSgpKTsgZm9yIChmbGF0YnVmZmVyczo6dW9mZnNldF90IF9pID0gMDsgX2kgPCBfZS0+c2l6ZSgpOyBfaSsrKSB7IGlmKF9vLT5hdHRyaWJ1dGVzW19pXSkgeyBfZS0+R2V0KF9pKS0+VW5QYWNrVG8oX28tPmF0dHJpYnV0ZXNbX2ldLmdldCgpLCBfcmVzb2x2ZXIpOyB9IGVsc2UgeyBfby0+YXR0cmlidXRlc1tfaV0gPSBmbGF0YnVmZmVyczo6dW5pcXVlX3B0cjxyZWZsZWN0aW9uOjpLZXlWYWx1ZVQ+KF9lLT5HZXQoX2kpLT5VblBhY2soX3Jlc29sdmVyKSk7IH07IH0gfSBlbHNlIHsgX28tPmF0dHJpYnV0ZXMucmVzaXplKDApOyB9IH0KKyAgeyBhdXRvIF9lID0gZG9jdW1lbnRhdGlvbigpOyBpZiAoX2UpIHsgX28tPmRvY3VtZW50YXRpb24ucmVzaXplKF9lLT5zaXplKCkpOyBmb3IgKGZsYXRidWZmZXJzOjp1b2Zmc2V0X3QgX2kgPSAwOyBfaSA8IF9lLT5zaXplKCk7IF9pKyspIHsgX28tPmRvY3VtZW50YXRpb25bX2ldID0gX2UtPkdldChfaSktPnN0cigpOyB9IH0gZWxzZSB7IF9vLT5kb2N1bWVudGF0aW9uLnJlc2l6ZSgwKTsgfSB9CiAgIHsgYXV0byBfZSA9IGRlY2xhcmF0aW9uX2ZpbGUoKTsgaWYgKF9lKSBfby0+ZGVjbGFyYXRpb25fZmlsZSA9IF9lLT5zdHIoKTsgfQogfQogCkBAIC0yMzE1LDEwICsyOTIyLDEwIEBACiAgICh2b2lkKV9vOwogICBzdHJ1Y3QgX1ZlY3RvckFyZ3MgeyBmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgKl9fZmJiOyBjb25zdCBTZXJ2aWNlVCogX19vOyBjb25zdCBmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX19yZWhhc2hlcjsgfSBfdmEgPSB7ICZfZmJiLCBfbywgX3JlaGFzaGVyfTsgKHZvaWQpX3ZhOwogICBhdXRvIF9uYW1lID0gX2ZiYi5DcmVhdGVTdHJpbmcoX28tPm5hbWUpOwotICBhdXRvIF9jYWxscyA9IF9vLT5jYWxscy5zaXplKCkgPyBfZmJiLkNyZWF0ZVZlY3RvcjxmbGF0YnVmZmVyczo6T2Zmc2V0PHJlZmxlY3Rpb246OlJQQ0NhbGw+PiAoX28tPmNhbGxzLnNpemUoKSwgW10oc2l6ZV90IGksIF9WZWN0b3JBcmdzICpfX3ZhKSB7IHJldHVybiBDcmVhdGVSUENDYWxsKCpfX3ZhLT5fX2ZiYiwgX192YS0+X19vLT5jYWxsc1tpXS5nZXQoKSwgX192YS0+X19yZWhhc2hlcik7IH0sICZfdmEgKSA6IDA7Ci0gIGF1dG8gX2F0dHJpYnV0ZXMgPSBfby0+YXR0cmlidXRlcy5zaXplKCkgPyBfZmJiLkNyZWF0ZVZlY3RvcjxmbGF0YnVmZmVyczo6T2Zmc2V0PHJlZmxlY3Rpb246OktleVZhbHVlPj4gKF9vLT5hdHRyaWJ1dGVzLnNpemUoKSwgW10oc2l6ZV90IGksIF9WZWN0b3JBcmdzICpfX3ZhKSB7IHJldHVybiBDcmVhdGVLZXlWYWx1ZSgqX192YS0+X19mYmIsIF9fdmEtPl9fby0+YXR0cmlidXRlc1tpXS5nZXQoKSwgX192YS0+X19yZWhhc2hlcik7IH0sICZfdmEgKSA6IDA7Ci0gIGF1dG8gX2RvY3VtZW50YXRpb24gPSBfby0+ZG9jdW1lbnRhdGlvbi5zaXplKCkgPyBfZmJiLkNyZWF0ZVZlY3Rvck9mU3RyaW5ncyhfby0+ZG9jdW1lbnRhdGlvbikgOiAwOwotICBhdXRvIF9kZWNsYXJhdGlvbl9maWxlID0gX28tPmRlY2xhcmF0aW9uX2ZpbGUuZW1wdHkoKSA/IDAgOiBfZmJiLkNyZWF0ZVN0cmluZyhfby0+ZGVjbGFyYXRpb25fZmlsZSk7CisgIGF1dG8gX2NhbGxzID0gX2ZiYi5DcmVhdGVWZWN0b3I8ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxyZWZsZWN0aW9uOjpSUENDYWxsPj4gKF9vLT5jYWxscy5zaXplKCksIFtdKHNpemVfdCBpLCBfVmVjdG9yQXJncyAqX192YSkgeyByZXR1cm4gQ3JlYXRlUlBDQ2FsbCgqX192YS0+X19mYmIsIF9fdmEtPl9fby0+Y2FsbHNbaV0uZ2V0KCksIF9fdmEtPl9fcmVoYXNoZXIpOyB9LCAmX3ZhICk7CisgIGF1dG8gX2F0dHJpYnV0ZXMgPSBfZmJiLkNyZWF0ZVZlY3RvcjxmbGF0YnVmZmVyczo6T2Zmc2V0PHJlZmxlY3Rpb246OktleVZhbHVlPj4gKF9vLT5hdHRyaWJ1dGVzLnNpemUoKSwgW10oc2l6ZV90IGksIF9WZWN0b3JBcmdzICpfX3ZhKSB7IHJldHVybiBDcmVhdGVLZXlWYWx1ZSgqX192YS0+X19mYmIsIF9fdmEtPl9fby0+YXR0cmlidXRlc1tpXS5nZXQoKSwgX192YS0+X19yZWhhc2hlcik7IH0sICZfdmEgKTsKKyAgYXV0byBfZG9jdW1lbnRhdGlvbiA9IF9mYmIuQ3JlYXRlVmVjdG9yT2ZTdHJpbmdzKF9vLT5kb2N1bWVudGF0aW9uKTsKKyAgYXV0byBfZGVjbGFyYXRpb25fZmlsZSA9IF9vLT5kZWNsYXJhdGlvbl9maWxlLmVtcHR5KCkgPyBfZmJiLkNyZWF0ZVNoYXJlZFN0cmluZygiIikgOiBfZmJiLkNyZWF0ZVN0cmluZyhfby0+ZGVjbGFyYXRpb25fZmlsZSk7CiAgIHJldHVybiByZWZsZWN0aW9uOjpDcmVhdGVTZXJ2aWNlKAogICAgICAgX2ZiYiwKICAgICAgIF9uYW1lLApAQCAtMjM1MCw3ICsyOTU3LDcgQEAKICAgKHZvaWQpX287CiAgICh2b2lkKV9yZXNvbHZlcjsKICAgeyBhdXRvIF9lID0gZmlsZW5hbWUoKTsgaWYgKF9lKSBfby0+ZmlsZW5hbWUgPSBfZS0+c3RyKCk7IH0KLSAgeyBhdXRvIF9lID0gaW5jbHVkZWRfZmlsZW5hbWVzKCk7IGlmIChfZSkgeyBfby0+aW5jbHVkZWRfZmlsZW5hbWVzLnJlc2l6ZShfZS0+c2l6ZSgpKTsgZm9yIChmbGF0YnVmZmVyczo6dW9mZnNldF90IF9pID0gMDsgX2kgPCBfZS0+c2l6ZSgpOyBfaSsrKSB7IF9vLT5pbmNsdWRlZF9maWxlbmFtZXNbX2ldID0gX2UtPkdldChfaSktPnN0cigpOyB9IH0gfQorICB7IGF1dG8gX2UgPSBpbmNsdWRlZF9maWxlbmFtZXMoKTsgaWYgKF9lKSB7IF9vLT5pbmNsdWRlZF9maWxlbmFtZXMucmVzaXplKF9lLT5zaXplKCkpOyBmb3IgKGZsYXRidWZmZXJzOjp1b2Zmc2V0X3QgX2kgPSAwOyBfaSA8IF9lLT5zaXplKCk7IF9pKyspIHsgX28tPmluY2x1ZGVkX2ZpbGVuYW1lc1tfaV0gPSBfZS0+R2V0KF9pKS0+c3RyKCk7IH0gfSBlbHNlIHsgX28tPmluY2x1ZGVkX2ZpbGVuYW1lcy5yZXNpemUoMCk7IH0gfQogfQogCiBpbmxpbmUgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxTY2hlbWFGaWxlPiBTY2hlbWFGaWxlOjpQYWNrKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgU2NoZW1hRmlsZVQqIF9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyKSB7CkBAIC0yMzYyLDcgKzI5NjksNyBAQAogICAodm9pZClfbzsKICAgc3RydWN0IF9WZWN0b3JBcmdzIHsgZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICpfX2ZiYjsgY29uc3QgU2NoZW1hRmlsZVQqIF9fbzsgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9fcmVoYXNoZXI7IH0gX3ZhID0geyAmX2ZiYiwgX28sIF9yZWhhc2hlcn07ICh2b2lkKV92YTsKICAgYXV0byBfZmlsZW5hbWUgPSBfZmJiLkNyZWF0ZVN0cmluZyhfby0+ZmlsZW5hbWUpOwotICBhdXRvIF9pbmNsdWRlZF9maWxlbmFtZXMgPSBfby0+aW5jbHVkZWRfZmlsZW5hbWVzLnNpemUoKSA/IF9mYmIuQ3JlYXRlVmVjdG9yT2ZTdHJpbmdzKF9vLT5pbmNsdWRlZF9maWxlbmFtZXMpIDogMDsKKyAgYXV0byBfaW5jbHVkZWRfZmlsZW5hbWVzID0gX2ZiYi5DcmVhdGVWZWN0b3JPZlN0cmluZ3MoX28tPmluY2x1ZGVkX2ZpbGVuYW1lcyk7CiAgIHJldHVybiByZWZsZWN0aW9uOjpDcmVhdGVTY2hlbWFGaWxlKAogICAgICAgX2ZiYiwKICAgICAgIF9maWxlbmFtZSwKQEAgLTIzNzIsMTQgKzI5NzksMTQgQEAKIAogaW5saW5lIGJvb2wgb3BlcmF0b3I9PShjb25zdCBTY2hlbWFUICZsaHMsIGNvbnN0IFNjaGVtYVQgJnJocykgewogICByZXR1cm4KLSAgICAgIChsaHMub2JqZWN0cyA9PSByaHMub2JqZWN0cykgJiYKLSAgICAgIChsaHMuZW51bXMgPT0gcmhzLmVudW1zKSAmJgorICAgICAgKGxocy5vYmplY3RzLnNpemUoKSA9PSByaHMub2JqZWN0cy5zaXplKCkgJiYgc3RkOjplcXVhbChsaHMub2JqZWN0cy5jYmVnaW4oKSwgbGhzLm9iamVjdHMuY2VuZCgpLCByaHMub2JqZWN0cy5jYmVnaW4oKSwgW10oZmxhdGJ1ZmZlcnM6OnVuaXF1ZV9wdHI8cmVmbGVjdGlvbjo6T2JqZWN0VD4gY29uc3QgJmEsIGZsYXRidWZmZXJzOjp1bmlxdWVfcHRyPHJlZmxlY3Rpb246Ok9iamVjdFQ+IGNvbnN0ICZiKSB7IHJldHVybiAoYSA9PSBiKSB8fCAoYSAmJiBiICYmICphID09ICpiKTsgfSkpICYmCisgICAgICAobGhzLmVudW1zLnNpemUoKSA9PSByaHMuZW51bXMuc2l6ZSgpICYmIHN0ZDo6ZXF1YWwobGhzLmVudW1zLmNiZWdpbigpLCBsaHMuZW51bXMuY2VuZCgpLCByaHMuZW51bXMuY2JlZ2luKCksIFtdKGZsYXRidWZmZXJzOjp1bmlxdWVfcHRyPHJlZmxlY3Rpb246OkVudW1UPiBjb25zdCAmYSwgZmxhdGJ1ZmZlcnM6OnVuaXF1ZV9wdHI8cmVmbGVjdGlvbjo6RW51bVQ+IGNvbnN0ICZiKSB7IHJldHVybiAoYSA9PSBiKSB8fCAoYSAmJiBiICYmICphID09ICpiKTsgfSkpICYmCiAgICAgICAobGhzLmZpbGVfaWRlbnQgPT0gcmhzLmZpbGVfaWRlbnQpICYmCiAgICAgICAobGhzLmZpbGVfZXh0ID09IHJocy5maWxlX2V4dCkgJiYKICAgICAgICgobGhzLnJvb3RfdGFibGUgPT0gcmhzLnJvb3RfdGFibGUpIHx8IChsaHMucm9vdF90YWJsZSAmJiByaHMucm9vdF90YWJsZSAmJiAqbGhzLnJvb3RfdGFibGUgPT0gKnJocy5yb290X3RhYmxlKSkgJiYKLSAgICAgIChsaHMuc2VydmljZXMgPT0gcmhzLnNlcnZpY2VzKSAmJgorICAgICAgKGxocy5zZXJ2aWNlcy5zaXplKCkgPT0gcmhzLnNlcnZpY2VzLnNpemUoKSAmJiBzdGQ6OmVxdWFsKGxocy5zZXJ2aWNlcy5jYmVnaW4oKSwgbGhzLnNlcnZpY2VzLmNlbmQoKSwgcmhzLnNlcnZpY2VzLmNiZWdpbigpLCBbXShmbGF0YnVmZmVyczo6dW5pcXVlX3B0cjxyZWZsZWN0aW9uOjpTZXJ2aWNlVD4gY29uc3QgJmEsIGZsYXRidWZmZXJzOjp1bmlxdWVfcHRyPHJlZmxlY3Rpb246OlNlcnZpY2VUPiBjb25zdCAmYikgeyByZXR1cm4gKGEgPT0gYikgfHwgKGEgJiYgYiAmJiAqYSA9PSAqYik7IH0pKSAmJgogICAgICAgKGxocy5hZHZhbmNlZF9mZWF0dXJlcyA9PSByaHMuYWR2YW5jZWRfZmVhdHVyZXMpICYmCi0gICAgICAobGhzLmZic19maWxlcyA9PSByaHMuZmJzX2ZpbGVzKTsKKyAgICAgIChsaHMuZmJzX2ZpbGVzLnNpemUoKSA9PSByaHMuZmJzX2ZpbGVzLnNpemUoKSAmJiBzdGQ6OmVxdWFsKGxocy5mYnNfZmlsZXMuY2JlZ2luKCksIGxocy5mYnNfZmlsZXMuY2VuZCgpLCByaHMuZmJzX2ZpbGVzLmNiZWdpbigpLCBbXShmbGF0YnVmZmVyczo6dW5pcXVlX3B0cjxyZWZsZWN0aW9uOjpTY2hlbWFGaWxlVD4gY29uc3QgJmEsIGZsYXRidWZmZXJzOjp1bmlxdWVfcHRyPHJlZmxlY3Rpb246OlNjaGVtYUZpbGVUPiBjb25zdCAmYikgeyByZXR1cm4gKGEgPT0gYikgfHwgKGEgJiYgYiAmJiAqYSA9PSAqYik7IH0pKTsKIH0KIAogaW5saW5lIGJvb2wgb3BlcmF0b3IhPShjb25zdCBTY2hlbWFUICZsaHMsIGNvbnN0IFNjaGVtYVQgJnJocykgewpAQCAtMjM5MywxMyArMzAwMCwxMyBAQAogICAgICAgICByb290X3RhYmxlKChvLnJvb3RfdGFibGUpID8gbmV3IHJlZmxlY3Rpb246Ok9iamVjdFQoKm8ucm9vdF90YWJsZSkgOiBudWxscHRyKSwKICAgICAgICAgYWR2YW5jZWRfZmVhdHVyZXMoby5hZHZhbmNlZF9mZWF0dXJlcykgewogICBvYmplY3RzLnJlc2VydmUoby5vYmplY3RzLnNpemUoKSk7Ci0gIGZvciAoY29uc3QgYXV0byAmdiA6IG8ub2JqZWN0cykgeyBvYmplY3RzLmVtcGxhY2VfYmFjaygodikgPyBuZXcgcmVmbGVjdGlvbjo6T2JqZWN0VCgqdikgOiBudWxscHRyKTsgfQorICBmb3IgKGNvbnN0IGF1dG8gJm9iamVjdHNfIDogby5vYmplY3RzKSB7IG9iamVjdHMuZW1wbGFjZV9iYWNrKChvYmplY3RzXykgPyBuZXcgcmVmbGVjdGlvbjo6T2JqZWN0VCgqb2JqZWN0c18pIDogbnVsbHB0cik7IH0KICAgZW51bXMucmVzZXJ2ZShvLmVudW1zLnNpemUoKSk7Ci0gIGZvciAoY29uc3QgYXV0byAmdiA6IG8uZW51bXMpIHsgZW51bXMuZW1wbGFjZV9iYWNrKCh2KSA/IG5ldyByZWZsZWN0aW9uOjpFbnVtVCgqdikgOiBudWxscHRyKTsgfQorICBmb3IgKGNvbnN0IGF1dG8gJmVudW1zXyA6IG8uZW51bXMpIHsgZW51bXMuZW1wbGFjZV9iYWNrKChlbnVtc18pID8gbmV3IHJlZmxlY3Rpb246OkVudW1UKCplbnVtc18pIDogbnVsbHB0cik7IH0KICAgc2VydmljZXMucmVzZXJ2ZShvLnNlcnZpY2VzLnNpemUoKSk7Ci0gIGZvciAoY29uc3QgYXV0byAmdiA6IG8uc2VydmljZXMpIHsgc2VydmljZXMuZW1wbGFjZV9iYWNrKCh2KSA/IG5ldyByZWZsZWN0aW9uOjpTZXJ2aWNlVCgqdikgOiBudWxscHRyKTsgfQorICBmb3IgKGNvbnN0IGF1dG8gJnNlcnZpY2VzXyA6IG8uc2VydmljZXMpIHsgc2VydmljZXMuZW1wbGFjZV9iYWNrKChzZXJ2aWNlc18pID8gbmV3IHJlZmxlY3Rpb246OlNlcnZpY2VUKCpzZXJ2aWNlc18pIDogbnVsbHB0cik7IH0KICAgZmJzX2ZpbGVzLnJlc2VydmUoby5mYnNfZmlsZXMuc2l6ZSgpKTsKLSAgZm9yIChjb25zdCBhdXRvICZ2IDogby5mYnNfZmlsZXMpIHsgZmJzX2ZpbGVzLmVtcGxhY2VfYmFjaygodikgPyBuZXcgcmVmbGVjdGlvbjo6U2NoZW1hRmlsZVQoKnYpIDogbnVsbHB0cik7IH0KKyAgZm9yIChjb25zdCBhdXRvICZmYnNfZmlsZXNfIDogby5mYnNfZmlsZXMpIHsgZmJzX2ZpbGVzLmVtcGxhY2VfYmFjaygoZmJzX2ZpbGVzXykgPyBuZXcgcmVmbGVjdGlvbjo6U2NoZW1hRmlsZVQoKmZic19maWxlc18pIDogbnVsbHB0cik7IH0KIH0KIAogaW5saW5lIFNjaGVtYVQgJlNjaGVtYVQ6Om9wZXJhdG9yPShTY2hlbWFUIG8pIEZMQVRCVUZGRVJTX05PRVhDRVBUIHsKQEAgLTI0MjMsMTQgKzMwMzAsMTQgQEAKIGlubGluZSB2b2lkIFNjaGVtYTo6VW5QYWNrVG8oU2NoZW1hVCAqX28sIGNvbnN0IGZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIpIGNvbnN0IHsKICAgKHZvaWQpX287CiAgICh2b2lkKV9yZXNvbHZlcjsKLSAgeyBhdXRvIF9lID0gb2JqZWN0cygpOyBpZiAoX2UpIHsgX28tPm9iamVjdHMucmVzaXplKF9lLT5zaXplKCkpOyBmb3IgKGZsYXRidWZmZXJzOjp1b2Zmc2V0X3QgX2kgPSAwOyBfaSA8IF9lLT5zaXplKCk7IF9pKyspIHsgaWYoX28tPm9iamVjdHNbX2ldKSB7IF9lLT5HZXQoX2kpLT5VblBhY2tUbyhfby0+b2JqZWN0c1tfaV0uZ2V0KCksIF9yZXNvbHZlcik7IH0gZWxzZSB7IF9vLT5vYmplY3RzW19pXSA9IHN0ZDo6dW5pcXVlX3B0cjxyZWZsZWN0aW9uOjpPYmplY3RUPihfZS0+R2V0KF9pKS0+VW5QYWNrKF9yZXNvbHZlcikpOyB9OyB9IH0gfQotICB7IGF1dG8gX2UgPSBlbnVtcygpOyBpZiAoX2UpIHsgX28tPmVudW1zLnJlc2l6ZShfZS0+c2l6ZSgpKTsgZm9yIChmbGF0YnVmZmVyczo6dW9mZnNldF90IF9pID0gMDsgX2kgPCBfZS0+c2l6ZSgpOyBfaSsrKSB7IGlmKF9vLT5lbnVtc1tfaV0pIHsgX2UtPkdldChfaSktPlVuUGFja1RvKF9vLT5lbnVtc1tfaV0uZ2V0KCksIF9yZXNvbHZlcik7IH0gZWxzZSB7IF9vLT5lbnVtc1tfaV0gPSBzdGQ6OnVuaXF1ZV9wdHI8cmVmbGVjdGlvbjo6RW51bVQ+KF9lLT5HZXQoX2kpLT5VblBhY2soX3Jlc29sdmVyKSk7IH07IH0gfSB9CisgIHsgYXV0byBfZSA9IG9iamVjdHMoKTsgaWYgKF9lKSB7IF9vLT5vYmplY3RzLnJlc2l6ZShfZS0+c2l6ZSgpKTsgZm9yIChmbGF0YnVmZmVyczo6dW9mZnNldF90IF9pID0gMDsgX2kgPCBfZS0+c2l6ZSgpOyBfaSsrKSB7IGlmKF9vLT5vYmplY3RzW19pXSkgeyBfZS0+R2V0KF9pKS0+VW5QYWNrVG8oX28tPm9iamVjdHNbX2ldLmdldCgpLCBfcmVzb2x2ZXIpOyB9IGVsc2UgeyBfby0+b2JqZWN0c1tfaV0gPSBmbGF0YnVmZmVyczo6dW5pcXVlX3B0cjxyZWZsZWN0aW9uOjpPYmplY3RUPihfZS0+R2V0KF9pKS0+VW5QYWNrKF9yZXNvbHZlcikpOyB9OyB9IH0gZWxzZSB7IF9vLT5vYmplY3RzLnJlc2l6ZSgwKTsgfSB9CisgIHsgYXV0byBfZSA9IGVudW1zKCk7IGlmIChfZSkgeyBfby0+ZW51bXMucmVzaXplKF9lLT5zaXplKCkpOyBmb3IgKGZsYXRidWZmZXJzOjp1b2Zmc2V0X3QgX2kgPSAwOyBfaSA8IF9lLT5zaXplKCk7IF9pKyspIHsgaWYoX28tPmVudW1zW19pXSkgeyBfZS0+R2V0KF9pKS0+VW5QYWNrVG8oX28tPmVudW1zW19pXS5nZXQoKSwgX3Jlc29sdmVyKTsgfSBlbHNlIHsgX28tPmVudW1zW19pXSA9IGZsYXRidWZmZXJzOjp1bmlxdWVfcHRyPHJlZmxlY3Rpb246OkVudW1UPihfZS0+R2V0KF9pKS0+VW5QYWNrKF9yZXNvbHZlcikpOyB9OyB9IH0gZWxzZSB7IF9vLT5lbnVtcy5yZXNpemUoMCk7IH0gfQogICB7IGF1dG8gX2UgPSBmaWxlX2lkZW50KCk7IGlmIChfZSkgX28tPmZpbGVfaWRlbnQgPSBfZS0+c3RyKCk7IH0KICAgeyBhdXRvIF9lID0gZmlsZV9leHQoKTsgaWYgKF9lKSBfby0+ZmlsZV9leHQgPSBfZS0+c3RyKCk7IH0KLSAgeyBhdXRvIF9lID0gcm9vdF90YWJsZSgpOyBpZiAoX2UpIHsgaWYoX28tPnJvb3RfdGFibGUpIHsgX2UtPlVuUGFja1RvKF9vLT5yb290X3RhYmxlLmdldCgpLCBfcmVzb2x2ZXIpOyB9IGVsc2UgeyBfby0+cm9vdF90YWJsZSA9IHN0ZDo6dW5pcXVlX3B0cjxyZWZsZWN0aW9uOjpPYmplY3RUPihfZS0+VW5QYWNrKF9yZXNvbHZlcikpOyB9IH0gfQotICB7IGF1dG8gX2UgPSBzZXJ2aWNlcygpOyBpZiAoX2UpIHsgX28tPnNlcnZpY2VzLnJlc2l6ZShfZS0+c2l6ZSgpKTsgZm9yIChmbGF0YnVmZmVyczo6dW9mZnNldF90IF9pID0gMDsgX2kgPCBfZS0+c2l6ZSgpOyBfaSsrKSB7IGlmKF9vLT5zZXJ2aWNlc1tfaV0pIHsgX2UtPkdldChfaSktPlVuUGFja1RvKF9vLT5zZXJ2aWNlc1tfaV0uZ2V0KCksIF9yZXNvbHZlcik7IH0gZWxzZSB7IF9vLT5zZXJ2aWNlc1tfaV0gPSBzdGQ6OnVuaXF1ZV9wdHI8cmVmbGVjdGlvbjo6U2VydmljZVQ+KF9lLT5HZXQoX2kpLT5VblBhY2soX3Jlc29sdmVyKSk7IH07IH0gfSB9CisgIHsgYXV0byBfZSA9IHJvb3RfdGFibGUoKTsgaWYgKF9lKSB7IGlmKF9vLT5yb290X3RhYmxlKSB7IF9lLT5VblBhY2tUbyhfby0+cm9vdF90YWJsZS5nZXQoKSwgX3Jlc29sdmVyKTsgfSBlbHNlIHsgX28tPnJvb3RfdGFibGUgPSBmbGF0YnVmZmVyczo6dW5pcXVlX3B0cjxyZWZsZWN0aW9uOjpPYmplY3RUPihfZS0+VW5QYWNrKF9yZXNvbHZlcikpOyB9IH0gZWxzZSBpZiAoX28tPnJvb3RfdGFibGUpIHsgX28tPnJvb3RfdGFibGUucmVzZXQoKTsgfSB9CisgIHsgYXV0byBfZSA9IHNlcnZpY2VzKCk7IGlmIChfZSkgeyBfby0+c2VydmljZXMucmVzaXplKF9lLT5zaXplKCkpOyBmb3IgKGZsYXRidWZmZXJzOjp1b2Zmc2V0X3QgX2kgPSAwOyBfaSA8IF9lLT5zaXplKCk7IF9pKyspIHsgaWYoX28tPnNlcnZpY2VzW19pXSkgeyBfZS0+R2V0KF9pKS0+VW5QYWNrVG8oX28tPnNlcnZpY2VzW19pXS5nZXQoKSwgX3Jlc29sdmVyKTsgfSBlbHNlIHsgX28tPnNlcnZpY2VzW19pXSA9IGZsYXRidWZmZXJzOjp1bmlxdWVfcHRyPHJlZmxlY3Rpb246OlNlcnZpY2VUPihfZS0+R2V0KF9pKS0+VW5QYWNrKF9yZXNvbHZlcikpOyB9OyB9IH0gZWxzZSB7IF9vLT5zZXJ2aWNlcy5yZXNpemUoMCk7IH0gfQogICB7IGF1dG8gX2UgPSBhZHZhbmNlZF9mZWF0dXJlcygpOyBfby0+YWR2YW5jZWRfZmVhdHVyZXMgPSBfZTsgfQotICB7IGF1dG8gX2UgPSBmYnNfZmlsZXMoKTsgaWYgKF9lKSB7IF9vLT5mYnNfZmlsZXMucmVzaXplKF9lLT5zaXplKCkpOyBmb3IgKGZsYXRidWZmZXJzOjp1b2Zmc2V0X3QgX2kgPSAwOyBfaSA8IF9lLT5zaXplKCk7IF9pKyspIHsgaWYoX28tPmZic19maWxlc1tfaV0pIHsgX2UtPkdldChfaSktPlVuUGFja1RvKF9vLT5mYnNfZmlsZXNbX2ldLmdldCgpLCBfcmVzb2x2ZXIpOyB9IGVsc2UgeyBfby0+ZmJzX2ZpbGVzW19pXSA9IHN0ZDo6dW5pcXVlX3B0cjxyZWZsZWN0aW9uOjpTY2hlbWFGaWxlVD4oX2UtPkdldChfaSktPlVuUGFjayhfcmVzb2x2ZXIpKTsgfTsgfSB9IH0KKyAgeyBhdXRvIF9lID0gZmJzX2ZpbGVzKCk7IGlmIChfZSkgeyBfby0+ZmJzX2ZpbGVzLnJlc2l6ZShfZS0+c2l6ZSgpKTsgZm9yIChmbGF0YnVmZmVyczo6dW9mZnNldF90IF9pID0gMDsgX2kgPCBfZS0+c2l6ZSgpOyBfaSsrKSB7IGlmKF9vLT5mYnNfZmlsZXNbX2ldKSB7IF9lLT5HZXQoX2kpLT5VblBhY2tUbyhfby0+ZmJzX2ZpbGVzW19pXS5nZXQoKSwgX3Jlc29sdmVyKTsgfSBlbHNlIHsgX28tPmZic19maWxlc1tfaV0gPSBmbGF0YnVmZmVyczo6dW5pcXVlX3B0cjxyZWZsZWN0aW9uOjpTY2hlbWFGaWxlVD4oX2UtPkdldChfaSktPlVuUGFjayhfcmVzb2x2ZXIpKTsgfTsgfSB9IGVsc2UgeyBfby0+ZmJzX2ZpbGVzLnJlc2l6ZSgwKTsgfSB9CiB9CiAKIGlubGluZSBmbGF0YnVmZmVyczo6T2Zmc2V0PFNjaGVtYT4gU2NoZW1hOjpQYWNrKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgU2NoZW1hVCogX28sIGNvbnN0IGZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIpIHsKQEAgLTI0NDMsMTIgKzMwNTAsMTIgQEAKICAgc3RydWN0IF9WZWN0b3JBcmdzIHsgZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICpfX2ZiYjsgY29uc3QgU2NoZW1hVCogX19vOyBjb25zdCBmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX19yZWhhc2hlcjsgfSBfdmEgPSB7ICZfZmJiLCBfbywgX3JlaGFzaGVyfTsgKHZvaWQpX3ZhOwogICBhdXRvIF9vYmplY3RzID0gX2ZiYi5DcmVhdGVWZWN0b3I8ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxyZWZsZWN0aW9uOjpPYmplY3Q+PiAoX28tPm9iamVjdHMuc2l6ZSgpLCBbXShzaXplX3QgaSwgX1ZlY3RvckFyZ3MgKl9fdmEpIHsgcmV0dXJuIENyZWF0ZU9iamVjdCgqX192YS0+X19mYmIsIF9fdmEtPl9fby0+b2JqZWN0c1tpXS5nZXQoKSwgX192YS0+X19yZWhhc2hlcik7IH0sICZfdmEgKTsKICAgYXV0byBfZW51bXMgPSBfZmJiLkNyZWF0ZVZlY3RvcjxmbGF0YnVmZmVyczo6T2Zmc2V0PHJlZmxlY3Rpb246OkVudW0+PiAoX28tPmVudW1zLnNpemUoKSwgW10oc2l6ZV90IGksIF9WZWN0b3JBcmdzICpfX3ZhKSB7IHJldHVybiBDcmVhdGVFbnVtKCpfX3ZhLT5fX2ZiYiwgX192YS0+X19vLT5lbnVtc1tpXS5nZXQoKSwgX192YS0+X19yZWhhc2hlcik7IH0sICZfdmEgKTsKLSAgYXV0byBfZmlsZV9pZGVudCA9IF9vLT5maWxlX2lkZW50LmVtcHR5KCkgPyAwIDogX2ZiYi5DcmVhdGVTdHJpbmcoX28tPmZpbGVfaWRlbnQpOwotICBhdXRvIF9maWxlX2V4dCA9IF9vLT5maWxlX2V4dC5lbXB0eSgpID8gMCA6IF9mYmIuQ3JlYXRlU3RyaW5nKF9vLT5maWxlX2V4dCk7CisgIGF1dG8gX2ZpbGVfaWRlbnQgPSBfby0+ZmlsZV9pZGVudC5lbXB0eSgpID8gX2ZiYi5DcmVhdGVTaGFyZWRTdHJpbmcoIiIpIDogX2ZiYi5DcmVhdGVTdHJpbmcoX28tPmZpbGVfaWRlbnQpOworICBhdXRvIF9maWxlX2V4dCA9IF9vLT5maWxlX2V4dC5lbXB0eSgpID8gX2ZiYi5DcmVhdGVTaGFyZWRTdHJpbmcoIiIpIDogX2ZiYi5DcmVhdGVTdHJpbmcoX28tPmZpbGVfZXh0KTsKICAgYXV0byBfcm9vdF90YWJsZSA9IF9vLT5yb290X3RhYmxlID8gQ3JlYXRlT2JqZWN0KF9mYmIsIF9vLT5yb290X3RhYmxlLmdldCgpLCBfcmVoYXNoZXIpIDogMDsKLSAgYXV0byBfc2VydmljZXMgPSBfby0+c2VydmljZXMuc2l6ZSgpID8gX2ZiYi5DcmVhdGVWZWN0b3I8ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxyZWZsZWN0aW9uOjpTZXJ2aWNlPj4gKF9vLT5zZXJ2aWNlcy5zaXplKCksIFtdKHNpemVfdCBpLCBfVmVjdG9yQXJncyAqX192YSkgeyByZXR1cm4gQ3JlYXRlU2VydmljZSgqX192YS0+X19mYmIsIF9fdmEtPl9fby0+c2VydmljZXNbaV0uZ2V0KCksIF9fdmEtPl9fcmVoYXNoZXIpOyB9LCAmX3ZhICkgOiAwOworICBhdXRvIF9zZXJ2aWNlcyA9IF9mYmIuQ3JlYXRlVmVjdG9yPGZsYXRidWZmZXJzOjpPZmZzZXQ8cmVmbGVjdGlvbjo6U2VydmljZT4+IChfby0+c2VydmljZXMuc2l6ZSgpLCBbXShzaXplX3QgaSwgX1ZlY3RvckFyZ3MgKl9fdmEpIHsgcmV0dXJuIENyZWF0ZVNlcnZpY2UoKl9fdmEtPl9fZmJiLCBfX3ZhLT5fX28tPnNlcnZpY2VzW2ldLmdldCgpLCBfX3ZhLT5fX3JlaGFzaGVyKTsgfSwgJl92YSApOwogICBhdXRvIF9hZHZhbmNlZF9mZWF0dXJlcyA9IF9vLT5hZHZhbmNlZF9mZWF0dXJlczsKLSAgYXV0byBfZmJzX2ZpbGVzID0gX28tPmZic19maWxlcy5zaXplKCkgPyBfZmJiLkNyZWF0ZVZlY3RvcjxmbGF0YnVmZmVyczo6T2Zmc2V0PHJlZmxlY3Rpb246OlNjaGVtYUZpbGU+PiAoX28tPmZic19maWxlcy5zaXplKCksIFtdKHNpemVfdCBpLCBfVmVjdG9yQXJncyAqX192YSkgeyByZXR1cm4gQ3JlYXRlU2NoZW1hRmlsZSgqX192YS0+X19mYmIsIF9fdmEtPl9fby0+ZmJzX2ZpbGVzW2ldLmdldCgpLCBfX3ZhLT5fX3JlaGFzaGVyKTsgfSwgJl92YSApIDogMDsKKyAgYXV0byBfZmJzX2ZpbGVzID0gX2ZiYi5DcmVhdGVWZWN0b3I8ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxyZWZsZWN0aW9uOjpTY2hlbWFGaWxlPj4gKF9vLT5mYnNfZmlsZXMuc2l6ZSgpLCBbXShzaXplX3QgaSwgX1ZlY3RvckFyZ3MgKl9fdmEpIHsgcmV0dXJuIENyZWF0ZVNjaGVtYUZpbGUoKl9fdmEtPl9fZmJiLCBfX3ZhLT5fX28tPmZic19maWxlc1tpXS5nZXQoKSwgX192YS0+X19yZWhhc2hlcik7IH0sICZfdmEgKTsKICAgcmV0dXJuIHJlZmxlY3Rpb246OkNyZWF0ZVNjaGVtYSgKICAgICAgIF9mYmIsCiAgICAgICBfb2JqZWN0cywKQEAgLTI4MTEsNiArMzQxOCwxNCBAQAogICByZXR1cm4gZmxhdGJ1ZmZlcnM6OkdldFNpemVQcmVmaXhlZFJvb3Q8cmVmbGVjdGlvbjo6U2NoZW1hPihidWYpOwogfQogCitpbmxpbmUgU2NoZW1hICpHZXRNdXRhYmxlU2NoZW1hKHZvaWQgKmJ1ZikgeworICByZXR1cm4gZmxhdGJ1ZmZlcnM6OkdldE11dGFibGVSb290PFNjaGVtYT4oYnVmKTsKK30KKworaW5saW5lIHJlZmxlY3Rpb246OlNjaGVtYSAqR2V0TXV0YWJsZVNpemVQcmVmaXhlZFNjaGVtYSh2b2lkICpidWYpIHsKKyAgcmV0dXJuIGZsYXRidWZmZXJzOjpHZXRNdXRhYmxlU2l6ZVByZWZpeGVkUm9vdDxyZWZsZWN0aW9uOjpTY2hlbWE+KGJ1Zik7Cit9CisKIGlubGluZSBjb25zdCBjaGFyICpTY2hlbWFJZGVudGlmaWVyKCkgewogICByZXR1cm4gIkJGQlMiOwogfQpAQCAtMjg1MSwxNiArMzQ2NiwxNiBAQAogICBmYmIuRmluaXNoU2l6ZVByZWZpeGVkKHJvb3QsIFNjaGVtYUlkZW50aWZpZXIoKSk7CiB9CiAKLWlubGluZSBzdGQ6OnVuaXF1ZV9wdHI8cmVmbGVjdGlvbjo6U2NoZW1hVD4gVW5QYWNrU2NoZW1hKAoraW5saW5lIGZsYXRidWZmZXJzOjp1bmlxdWVfcHRyPHJlZmxlY3Rpb246OlNjaGVtYVQ+IFVuUGFja1NjaGVtYSgKICAgICBjb25zdCB2b2lkICpidWYsCiAgICAgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKnJlcyA9IG51bGxwdHIpIHsKLSAgcmV0dXJuIHN0ZDo6dW5pcXVlX3B0cjxyZWZsZWN0aW9uOjpTY2hlbWFUPihHZXRTY2hlbWEoYnVmKS0+VW5QYWNrKHJlcykpOworICByZXR1cm4gZmxhdGJ1ZmZlcnM6OnVuaXF1ZV9wdHI8cmVmbGVjdGlvbjo6U2NoZW1hVD4oR2V0U2NoZW1hKGJ1ZiktPlVuUGFjayhyZXMpKTsKIH0KIAotaW5saW5lIHN0ZDo6dW5pcXVlX3B0cjxyZWZsZWN0aW9uOjpTY2hlbWFUPiBVblBhY2tTaXplUHJlZml4ZWRTY2hlbWEoCitpbmxpbmUgZmxhdGJ1ZmZlcnM6OnVuaXF1ZV9wdHI8cmVmbGVjdGlvbjo6U2NoZW1hVD4gVW5QYWNrU2l6ZVByZWZpeGVkU2NoZW1hKAogICAgIGNvbnN0IHZvaWQgKmJ1ZiwKICAgICBjb25zdCBmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqcmVzID0gbnVsbHB0cikgewotICByZXR1cm4gc3RkOjp1bmlxdWVfcHRyPHJlZmxlY3Rpb246OlNjaGVtYVQ+KEdldFNpemVQcmVmaXhlZFNjaGVtYShidWYpLT5VblBhY2socmVzKSk7CisgIHJldHVybiBmbGF0YnVmZmVyczo6dW5pcXVlX3B0cjxyZWZsZWN0aW9uOjpTY2hlbWFUPihHZXRTaXplUHJlZml4ZWRTY2hlbWEoYnVmKS0+VW5QYWNrKHJlcykpOwogfQogCiB9ICAvLyBuYW1lc3BhY2UgcmVmbGVjdGlvbgpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvaW5jbHVkZS9mbGF0YnVmZmVycy9zdGxfZW11bGF0aW9uLmggYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy9pbmNsdWRlL2ZsYXRidWZmZXJzL3N0bF9lbXVsYXRpb24uaAppbmRleCA3NWQxM2IyLi40NTJkZGI4IDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy9pbmNsdWRlL2ZsYXRidWZmZXJzL3N0bF9lbXVsYXRpb24uaAorKysgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy9pbmNsdWRlL2ZsYXRidWZmZXJzL3N0bF9lbXVsYXRpb24uaApAQCAtMjYsMjIgKzI2LDI3IEBACiAjaW5jbHVkZSA8bWVtb3J5PgogI2luY2x1ZGUgPGxpbWl0cz4KIAotLy8gRGV0ZWN0IEMrKzE3IGNvbXBhdGlibGUgY29tcGlsZXIuCi0vLyBfX2NwbHVzcGx1cyA+PSAyMDE3MDNMIC0gYSBjb21waWxlciBoYXMgc3VwcG9ydCBvZiAnc3RhdGljIGlubGluZScgdmFyaWFibGVzLgotI2lmIGRlZmluZWQoRkxBVEJVRkZFUlNfVVNFX1NURF9PUFRJT05BTCkgXAotICAgIHx8IChkZWZpbmVkKF9fY3BsdXNwbHVzKSAmJiBfX2NwbHVzcGx1cyA+PSAyMDE3MDNMKSBcCi0gICAgfHwgKGRlZmluZWQoX01TVkNfTEFORykgJiYgIChfTVNWQ19MQU5HID49IDIwMTcwM0wpKQorI2lmbmRlZiBGTEFUQlVGRkVSU19VU0VfU1REX09QVElPTkFMCisgIC8vIERldGVjdCBDKysxNyBjb21wYXRpYmxlIGNvbXBpbGVyLgorICAvLyBfX2NwbHVzcGx1cyA+PSAyMDE3MDNMIC0gYSBjb21waWxlciBoYXMgc3VwcG9ydCBvZiAnc3RhdGljIGlubGluZScgdmFyaWFibGVzLgorICAjaWYgKGRlZmluZWQoX19jcGx1c3BsdXMpICYmIF9fY3BsdXNwbHVzID49IDIwMTcwM0wpIFwKKyAgICAgIHx8IChkZWZpbmVkKF9NU1ZDX0xBTkcpICYmIF9NU1ZDX0xBTkcgPj0gMjAxNzAzTCkKKyAgICAjZGVmaW5lIEZMQVRCVUZGRVJTX1VTRV9TVERfT1BUSU9OQUwgMQorICAjZWxzZQorICAgICNkZWZpbmUgRkxBVEJVRkZFUlNfVVNFX1NURF9PUFRJT05BTCAwCisgICNlbmRpZiAvLyAoZGVmaW5lZChfX2NwbHVzcGx1cykgJiYgX19jcGx1c3BsdXMgPj0gMjAxNzAzTCkgLi4uCisjZW5kaWYgLy8gRkxBVEJVRkZFUlNfVVNFX1NURF9PUFRJT05BTAorCisjaWYgRkxBVEJVRkZFUlNfVVNFX1NURF9PUFRJT05BTAogICAjaW5jbHVkZSA8b3B0aW9uYWw+Ci0gICNpZm5kZWYgRkxBVEJVRkZFUlNfVVNFX1NURF9PUFRJT05BTAotICAgICNkZWZpbmUgRkxBVEJVRkZFUlNfVVNFX1NURF9PUFRJT05BTAotICAjZW5kaWYKLSNlbmRpZiAvLyBkZWZpbmVkKEZMQVRCVUZGRVJTX1VTRV9TVERfT1BUSU9OQUwpIC4uLgorI2VuZGlmCiAKIC8vIFRoZSBfX2NwcF9saWJfc3BhbiBpcyB0aGUgcHJlZGVmaW5lZCBmZWF0dXJlIG1hY3JvLgogI2lmIGRlZmluZWQoRkxBVEJVRkZFUlNfVVNFX1NURF9TUEFOKQogICAgICNpbmNsdWRlIDxzcGFuPgogI2VsaWYgZGVmaW5lZChfX2NwcF9saWJfc3BhbikgJiYgZGVmaW5lZChfX2hhc19pbmNsdWRlKQogICAjaWYgX19oYXNfaW5jbHVkZSg8c3Bhbj4pCisgICAgI2luY2x1ZGUgPGFycmF5PgogICAgICNpbmNsdWRlIDxzcGFuPgogICAgICNkZWZpbmUgRkxBVEJVRkZFUlNfVVNFX1NURF9TUEFOCiAgICNlbmRpZgpAQCAtMTI4LDcgKzEzMyw3IEBACiAgIH07CiAjZW5kaWYgIC8vIGRlZmluZWQoRkxBVEJVRkZFUlNfVEVNUExBVEVTX0FMSUFTRVMpCiAKLSNpZmRlZiBGTEFUQlVGRkVSU19VU0VfU1REX09QVElPTkFMCisjaWYgRkxBVEJVRkZFUlNfVVNFX1NURF9PUFRJT05BTAogdGVtcGxhdGU8Y2xhc3MgVD4KIHVzaW5nIE9wdGlvbmFsID0gc3RkOjpvcHRpb25hbDxUPjsKIHVzaW5nIG51bGxvcHRfdCA9IHN0ZDo6bnVsbG9wdF90OwpAQCAtMjg0LDEzICsyODksMTMgQEAKIG5hbWVzcGFjZSBpbnRlcm5hbCB7CiAgIC8vIFRoaXMgaXMgU0ZJTkFFIGhlbHBlciBjbGFzcyBmb3IgY2hlY2tpbmcgb2YgYSBjb21tb24gY29uZGl0aW9uOgogICAvLyA+IFRoaXMgb3ZlcmxvYWQgb25seSBwYXJ0aWNpcGF0ZXMgaW4gb3ZlcmxvYWQgcmVzb2x1dGlvbgotICAvLyA+IENoZWNrIHdoZXRoZXIgYSBwb2ludGVyIHRvIGFuIGFycmF5IG9mIFUgY2FuIGJlIGNvbnZlcnRlZAotICAvLyA+IHRvIGEgcG9pbnRlciB0byBhbiBhcnJheSBvZiBFLgotICAvLyBUaGlzIGhlbHBlciBpcyB1c2VkIGZvciBjaGVja2luZyBvZiAnVSAtPiBjb25zdCBVJy4KLSAgdGVtcGxhdGU8Y2xhc3MgRSwgc3RkOjpzaXplX3QgRXh0ZW50LCBjbGFzcyBVLCBzdGQ6OnNpemVfdCBOPgotICBzdHJ1Y3QgaXNfc3Bhbl9jb252ZXJ0YWJsZSB7CisgIC8vID4gQ2hlY2sgd2hldGhlciBhIHBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgRnJvbSBjYW4gYmUgY29udmVydGVkCisgIC8vID4gdG8gYSBwb2ludGVyIHRvIGFuIGFycmF5IG9mIFRvLgorICAvLyBUaGlzIGhlbHBlciBpcyB1c2VkIGZvciBjaGVja2luZyBvZiAnRnJvbSAtPiBjb25zdCBGcm9tJy4KKyAgdGVtcGxhdGU8Y2xhc3MgVG8sIHN0ZDo6c2l6ZV90IEV4dGVudCwgY2xhc3MgRnJvbSwgc3RkOjpzaXplX3QgTj4KKyAgc3RydWN0IGlzX3NwYW5fY29udmVydGlibGUgewogICAgIHVzaW5nIHR5cGUgPQotICAgICAgdHlwZW5hbWUgc3RkOjpjb25kaXRpb25hbDxzdGQ6OmlzX2NvbnZlcnRpYmxlPFUgKCopW10sIEUgKCopW10+Ojp2YWx1ZQorICAgICAgdHlwZW5hbWUgc3RkOjpjb25kaXRpb25hbDxzdGQ6OmlzX2NvbnZlcnRpYmxlPEZyb20gKCopW10sIFRvICgqKVtdPjo6dmFsdWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgKEV4dGVudCA9PSBkeW5hbWljX2V4dGVudCB8fCBOID09IEV4dGVudCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCwgdm9pZD46OnR5cGU7CiAgIH07CkBAIC0zNjIsMTMgKzM2Nyw5IEBACiAKICAgI2lmICFkZWZpbmVkKEZMQVRCVUZGRVJTX1NQQU5fTUlOSU1BTCkKICAgICB1c2luZyBJdGVyYXRvciA9IGludGVybmFsOjpTcGFuSXRlcmF0b3I8VD47Ci0gICAgdXNpbmcgQ29uc3RJdGVyYXRvciA9IGludGVybmFsOjpTcGFuSXRlcmF0b3I8Y29uc3QgVD47CiAKICAgICBJdGVyYXRvciBiZWdpbigpIGNvbnN0IHsgcmV0dXJuIEl0ZXJhdG9yKGRhdGEoKSk7IH0KICAgICBJdGVyYXRvciBlbmQoKSBjb25zdCAgIHsgcmV0dXJuIEl0ZXJhdG9yKGRhdGEoKSArIHNpemUoKSk7IH0KLQotICAgIENvbnN0SXRlcmF0b3IgY2JlZ2luKCkgY29uc3QgeyByZXR1cm4gQ29uc3RJdGVyYXRvcihkYXRhKCkpOyB9Ci0gICAgQ29uc3RJdGVyYXRvciBjZW5kKCkgY29uc3QgIHsgcmV0dXJuIENvbnN0SXRlcmF0b3IoZGF0YSgpICsgc2l6ZSgpKTsgfQogICAjZW5kaWYKIAogICAvLyBSZXR1cm5zIGEgcmVmZXJlbmNlIHRvIHRoZSBpZHgtdGggZWxlbWVudCBvZiB0aGUgc2VxdWVuY2UuCkBAIC00MTQsNyArNDE1LDcgQEAKICAgLy8gZXh0ZW50ID09IDAgfHwgZXh0ZW50ID09IGZsYXRidWZmZXJzOjpkeW5hbWljX2V4dGVudC4KICAgLy8gQSBkdW1teSB0ZW1wbGF0ZSBhcmd1bWVudCBOIGlzIG5lZWQgZGVwZW5kZW5jeSBmb3IgU0ZJTkFFLgogICB0ZW1wbGF0ZTxzdGQ6OnNpemVfdCBOID0gMCwKLSAgICB0eXBlbmFtZSBpbnRlcm5hbDo6aXNfc3Bhbl9jb252ZXJ0YWJsZTxlbGVtZW50X3R5cGUsIEV4dGVudCwgZWxlbWVudF90eXBlLCAoTiAtIE4pPjo6dHlwZSA9IDA+CisgICAgdHlwZW5hbWUgaW50ZXJuYWw6OmlzX3NwYW5fY29udmVydGlibGU8ZWxlbWVudF90eXBlLCBFeHRlbnQsIGVsZW1lbnRfdHlwZSwgKE4gLSBOKT46OnR5cGUgPSAwPgogICBGTEFUQlVGRkVSU19DT05TVEVYUFJfQ1BQMTEgc3BhbigpIEZMQVRCVUZGRVJTX05PRVhDRVBUIDogZGF0YV8obnVsbHB0ciksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudF8oMCkgewogICAgIHN0YXRpY19hc3NlcnQoZXh0ZW50ID09IDAgfHwgZXh0ZW50ID09IGR5bmFtaWNfZXh0ZW50LCAiaW52YWxpZCBzcGFuIik7CkBAIC00MjcsMTIgKzQyOCwxMiBAQAogICAvLyBzdGQ6OnJlbW92ZV9wb2ludGVyX3Q8ZGVjbHR5cGUoc3RkOjpkYXRhKGFycikpPigqKVtdCiAgIC8vIGlzIGNvbnZlcnRpYmxlIHRvIGVsZW1lbnRfdHlwZSAoKilbXS4KICAgdGVtcGxhdGU8c3RkOjpzaXplX3QgTiwKLSAgICB0eXBlbmFtZSBpbnRlcm5hbDo6aXNfc3Bhbl9jb252ZXJ0YWJsZTxlbGVtZW50X3R5cGUsIEV4dGVudCwgZWxlbWVudF90eXBlLCBOPjo6dHlwZSA9IDA+CisgICAgdHlwZW5hbWUgaW50ZXJuYWw6OmlzX3NwYW5fY29udmVydGlibGU8ZWxlbWVudF90eXBlLCBFeHRlbnQsIGVsZW1lbnRfdHlwZSwgTj46OnR5cGUgPSAwPgogICBGTEFUQlVGRkVSU19DT05TVEVYUFJfQ1BQMTEgc3BhbihlbGVtZW50X3R5cGUgKCZhcnIpW05dKSBGTEFUQlVGRkVSU19OT0VYQ0VQVAogICAgICAgOiBkYXRhXyhhcnIpLCBjb3VudF8oTikge30KIAogICB0ZW1wbGF0ZTxjbGFzcyBVLCBzdGQ6OnNpemVfdCBOLAotICAgIHR5cGVuYW1lIGludGVybmFsOjppc19zcGFuX2NvbnZlcnRhYmxlPGVsZW1lbnRfdHlwZSwgRXh0ZW50LCBVLCBOPjo6dHlwZSA9IDA+CisgICAgdHlwZW5hbWUgaW50ZXJuYWw6OmlzX3NwYW5fY29udmVydGlibGU8ZWxlbWVudF90eXBlLCBFeHRlbnQsIFUsIE4+Ojp0eXBlID0gMD4KICAgRkxBVEJVRkZFUlNfQ09OU1RFWFBSX0NQUDExIHNwYW4oc3RkOjphcnJheTxVLCBOPiAmYXJyKSBGTEFUQlVGRkVSU19OT0VYQ0VQVAogICAgICA6IGRhdGFfKGFyci5kYXRhKCkpLCBjb3VudF8oTikge30KIApAQCAtNDQyLDcgKzQ0Myw3IEBACiAgIC8vICAgOiBkYXRhXyhhcnIuZGF0YSgpKSwgY291bnRfKE4pIHt9CiAKICAgdGVtcGxhdGU8Y2xhc3MgVSwgc3RkOjpzaXplX3QgTiwKLSAgICB0eXBlbmFtZSBpbnRlcm5hbDo6aXNfc3Bhbl9jb252ZXJ0YWJsZTxlbGVtZW50X3R5cGUsIEV4dGVudCwgVSwgTj46OnR5cGUgPSAwPgorICAgIHR5cGVuYW1lIGludGVybmFsOjppc19zcGFuX2NvbnZlcnRpYmxlPGVsZW1lbnRfdHlwZSwgRXh0ZW50LCBVLCBOPjo6dHlwZSA9IDA+CiAgIEZMQVRCVUZGRVJTX0NPTlNURVhQUl9DUFAxMSBzcGFuKGNvbnN0IHN0ZDo6YXJyYXk8VSwgTj4gJmFycikgRkxBVEJVRkZFUlNfTk9FWENFUFQKICAgICA6IGRhdGFfKGFyci5kYXRhKCkpLCBjb3VudF8oTikge30KIApAQCAtNDUyLDcgKzQ1Myw3IEBACiAgIC8vIGlmIGV4dGVudCA9PSBzdGQ6OmR5bmFtaWNfZXh0ZW50IHx8IE4gPT0gZXh0ZW50IGlzIHRydWUgYW5kIFUgKCopW10KICAgLy8gaXMgY29udmVydGlibGUgdG8gZWxlbWVudF90eXBlICgqKVtdLgogICB0ZW1wbGF0ZTxjbGFzcyBVLCBzdGQ6OnNpemVfdCBOLAotICAgIHR5cGVuYW1lIGludGVybmFsOjppc19zcGFuX2NvbnZlcnRhYmxlPGVsZW1lbnRfdHlwZSwgRXh0ZW50LCBVLCBOPjo6dHlwZSA9IDA+CisgICAgdHlwZW5hbWUgaW50ZXJuYWw6OmlzX3NwYW5fY29udmVydGlibGU8ZWxlbWVudF90eXBlLCBFeHRlbnQsIFUsIE4+Ojp0eXBlID0gMD4KICAgRkxBVEJVRkZFUlNfQ09OU1RFWFBSX0NQUDExIHNwYW4oY29uc3QgZmxhdGJ1ZmZlcnM6OnNwYW48VSwgTj4gJnMpIEZMQVRCVUZGRVJTX05PRVhDRVBUCiAgICAgICA6IHNwYW4ocy5kYXRhKCksIHMuc2l6ZSgpKSB7CiAgIH0KQEAgLTQ2Miw0NSArNDYzLDQ1IEBACiAgcHJpdmF0ZToKICAgLy8gVGhpcyBpcyBhIG5haXZlIGltcGxlbWVudGF0aW9uIHdpdGggJ2NvdW50XycgbWVtYmVyIGV2ZW4gaWYgKEV4dGVudCAhPSBkeW5hbWljX2V4dGVudCkuCiAgIHBvaW50ZXIgY29uc3QgZGF0YV87Ci0gIGNvbnN0IHNpemVfdHlwZSBjb3VudF87CisgIHNpemVfdHlwZSBjb3VudF87CiB9OwogI2VuZGlmICAvLyBkZWZpbmVkKEZMQVRCVUZGRVJTX1VTRV9TVERfU1BBTikKIAogI2lmICFkZWZpbmVkKEZMQVRCVUZGRVJTX1NQQU5fTUlOSU1BTCkKLXRlbXBsYXRlPGNsYXNzIFUsIHN0ZDo6c2l6ZV90IE4+Cit0ZW1wbGF0ZTxjbGFzcyBFbGVtZW50VHlwZSwgc3RkOjpzaXplX3QgRXh0ZW50PgogRkxBVEJVRkZFUlNfQ09OU1RFWFBSX0NQUDExCi1mbGF0YnVmZmVyczo6c3BhbjxVLCBOPiBtYWtlX3NwYW4oVSgmYXJyKVtOXSkgRkxBVEJVRkZFUlNfTk9FWENFUFQgewotICByZXR1cm4gc3BhbjxVLCBOPihhcnIpOworZmxhdGJ1ZmZlcnM6OnNwYW48RWxlbWVudFR5cGUsIEV4dGVudD4gbWFrZV9zcGFuKEVsZW1lbnRUeXBlKCZhcnIpW0V4dGVudF0pIEZMQVRCVUZGRVJTX05PRVhDRVBUIHsKKyAgcmV0dXJuIHNwYW48RWxlbWVudFR5cGUsIEV4dGVudD4oYXJyKTsKIH0KIAotdGVtcGxhdGU8Y2xhc3MgVSwgc3RkOjpzaXplX3QgTj4KK3RlbXBsYXRlPGNsYXNzIEVsZW1lbnRUeXBlLCBzdGQ6OnNpemVfdCBFeHRlbnQ+CiBGTEFUQlVGRkVSU19DT05TVEVYUFJfQ1BQMTEKLWZsYXRidWZmZXJzOjpzcGFuPGNvbnN0IFUsIE4+IG1ha2Vfc3Bhbihjb25zdCBVKCZhcnIpW05dKSBGTEFUQlVGRkVSU19OT0VYQ0VQVCB7Ci0gIHJldHVybiBzcGFuPGNvbnN0IFUsIE4+KGFycik7CitmbGF0YnVmZmVyczo6c3Bhbjxjb25zdCBFbGVtZW50VHlwZSwgRXh0ZW50PiBtYWtlX3NwYW4oY29uc3QgRWxlbWVudFR5cGUoJmFycilbRXh0ZW50XSkgRkxBVEJVRkZFUlNfTk9FWENFUFQgeworICByZXR1cm4gc3Bhbjxjb25zdCBFbGVtZW50VHlwZSwgRXh0ZW50PihhcnIpOwogfQogCi10ZW1wbGF0ZTxjbGFzcyBVLCBzdGQ6OnNpemVfdCBOPgordGVtcGxhdGU8Y2xhc3MgRWxlbWVudFR5cGUsIHN0ZDo6c2l6ZV90IEV4dGVudD4KIEZMQVRCVUZGRVJTX0NPTlNURVhQUl9DUFAxMQotZmxhdGJ1ZmZlcnM6OnNwYW48VSwgTj4gbWFrZV9zcGFuKHN0ZDo6YXJyYXk8VSwgTj4gJmFycikgRkxBVEJVRkZFUlNfTk9FWENFUFQgewotICByZXR1cm4gc3BhbjxVLCBOPihhcnIpOworZmxhdGJ1ZmZlcnM6OnNwYW48RWxlbWVudFR5cGUsIEV4dGVudD4gbWFrZV9zcGFuKHN0ZDo6YXJyYXk8RWxlbWVudFR5cGUsIEV4dGVudD4gJmFycikgRkxBVEJVRkZFUlNfTk9FWENFUFQgeworICByZXR1cm4gc3BhbjxFbGVtZW50VHlwZSwgRXh0ZW50PihhcnIpOwogfQogCi10ZW1wbGF0ZTxjbGFzcyBVLCBzdGQ6OnNpemVfdCBOPgordGVtcGxhdGU8Y2xhc3MgRWxlbWVudFR5cGUsIHN0ZDo6c2l6ZV90IEV4dGVudD4KIEZMQVRCVUZGRVJTX0NPTlNURVhQUl9DUFAxMQotZmxhdGJ1ZmZlcnM6OnNwYW48Y29uc3QgVSwgTj4gbWFrZV9zcGFuKGNvbnN0IHN0ZDo6YXJyYXk8VSwgTj4gJmFycikgRkxBVEJVRkZFUlNfTk9FWENFUFQgewotICByZXR1cm4gc3Bhbjxjb25zdCBVLCBOPihhcnIpOworZmxhdGJ1ZmZlcnM6OnNwYW48Y29uc3QgRWxlbWVudFR5cGUsIEV4dGVudD4gbWFrZV9zcGFuKGNvbnN0IHN0ZDo6YXJyYXk8RWxlbWVudFR5cGUsIEV4dGVudD4gJmFycikgRkxBVEJVRkZFUlNfTk9FWENFUFQgeworICByZXR1cm4gc3Bhbjxjb25zdCBFbGVtZW50VHlwZSwgRXh0ZW50PihhcnIpOwogfQogCi10ZW1wbGF0ZTxjbGFzcyBVLCBzdGQ6OnNpemVfdCBOPgordGVtcGxhdGU8Y2xhc3MgRWxlbWVudFR5cGUsIHN0ZDo6c2l6ZV90IEV4dGVudD4KIEZMQVRCVUZGRVJTX0NPTlNURVhQUl9DUFAxMQotZmxhdGJ1ZmZlcnM6OnNwYW48VSwgZHluYW1pY19leHRlbnQ+IG1ha2Vfc3BhbihVICpmaXJzdCwgc3RkOjpzaXplX3QgY291bnQpIEZMQVRCVUZGRVJTX05PRVhDRVBUIHsKLSAgcmV0dXJuIHNwYW48VSwgZHluYW1pY19leHRlbnQ+KGZpcnN0LCBjb3VudCk7CitmbGF0YnVmZmVyczo6c3BhbjxFbGVtZW50VHlwZSwgZHluYW1pY19leHRlbnQ+IG1ha2Vfc3BhbihFbGVtZW50VHlwZSAqZmlyc3QsIHN0ZDo6c2l6ZV90IGNvdW50KSBGTEFUQlVGRkVSU19OT0VYQ0VQVCB7CisgIHJldHVybiBzcGFuPEVsZW1lbnRUeXBlLCBkeW5hbWljX2V4dGVudD4oZmlyc3QsIGNvdW50KTsKIH0KIAotdGVtcGxhdGU8Y2xhc3MgVSwgc3RkOjpzaXplX3QgTj4KK3RlbXBsYXRlPGNsYXNzIEVsZW1lbnRUeXBlLCBzdGQ6OnNpemVfdCBFeHRlbnQ+CiBGTEFUQlVGRkVSU19DT05TVEVYUFJfQ1BQMTEKLWZsYXRidWZmZXJzOjpzcGFuPGNvbnN0IFUsIGR5bmFtaWNfZXh0ZW50PiBtYWtlX3NwYW4oY29uc3QgVSAqZmlyc3QsIHN0ZDo6c2l6ZV90IGNvdW50KSBGTEFUQlVGRkVSU19OT0VYQ0VQVCB7Ci0gIHJldHVybiBzcGFuPGNvbnN0IFUsIGR5bmFtaWNfZXh0ZW50PihmaXJzdCwgY291bnQpOworZmxhdGJ1ZmZlcnM6OnNwYW48Y29uc3QgRWxlbWVudFR5cGUsIGR5bmFtaWNfZXh0ZW50PiBtYWtlX3NwYW4oY29uc3QgRWxlbWVudFR5cGUgKmZpcnN0LCBzdGQ6OnNpemVfdCBjb3VudCkgRkxBVEJVRkZFUlNfTk9FWENFUFQgeworICByZXR1cm4gc3Bhbjxjb25zdCBFbGVtZW50VHlwZSwgZHluYW1pY19leHRlbnQ+KGZpcnN0LCBjb3VudCk7CiB9CiAjZW5kaWYgLy8gIWRlZmluZWQoRkxBVEJVRkZFUlNfU1BBTl9NSU5JTUFMKQogCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy9pbmNsdWRlL2ZsYXRidWZmZXJzL3V0aWwuaCBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL2luY2x1ZGUvZmxhdGJ1ZmZlcnMvdXRpbC5oCmluZGV4IDJlMGNlNzMuLjczYTNhYjcgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL2luY2x1ZGUvZmxhdGJ1ZmZlcnMvdXRpbC5oCisrKyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL2luY2x1ZGUvZmxhdGJ1ZmZlcnMvdXRpbC5oCkBAIC0yNTUsNyArMjU1LDcgQEAKIH0KIAogLy8gVUJTQU46IGRvdWJsZSB0byBmbG9hdCBpcyBzYWZlIGlmIG51bWVyaWNfbGltaXRzPGZsb2F0Pjo6aXNfaWVjNTU5IGlzIHRydWUuCi1fX3N1cHJlc3NfdWJzYW5fXygiZmxvYXQtY2FzdC1vdmVyZmxvdyIpCitfX3N1cHByZXNzX3Vic2FuX18oImZsb2F0LWNhc3Qtb3ZlcmZsb3ciKQogaW5saW5lIHZvaWQgc3RydG92YWxfaW1wbChmbG9hdCAqdmFsLCBjb25zdCBjaGFyICpzdHIsIGNoYXIgKiplbmRwdHIpIHsKICAgKnZhbCA9IF9fc3RydG9mX2ltcGwoc3RyLCBlbmRwdHIpOwogfQpAQCAtNDQ4LDYgKzQ0OCw5IEBACiAvLyBTdHJpcCB0aGUgbGFzdCBjb21wb25lbnQgb2YgdGhlIHBhdGggKyBzZXBhcmF0b3IuCiBzdGQ6OnN0cmluZyBTdHJpcEZpbGVOYW1lKGNvbnN0IHN0ZDo6c3RyaW5nICZmaWxlcGF0aCk7CiAKK3N0ZDo6c3RyaW5nIFN0cmlwUHJlZml4KGNvbnN0IHN0ZDo6c3RyaW5nICZmaWxlcGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nICZwcmVmaXhfdG9fcmVtb3ZlKTsKKwogLy8gQ29uY2F0ZW5hdGVzIGEgcGF0aCB3aXRoIGEgZmlsZW5hbWUsIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciB0aGUgcGF0aAogLy8gZW5kcyBpbiBhIHNlcGFyYXRvciBvciBub3QuCiBzdGQ6OnN0cmluZyBDb25DYXRQYXRoRmlsZU5hbWUoY29uc3Qgc3RkOjpzdHJpbmcgJnBhdGgsCkBAIC02ODIsOSArNjg1LDYgQEAKIGJvb2wgUmVhZEVudmlyb25tZW50VmFyaWFibGUoY29uc3QgY2hhciAqdmFyX25hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nICpfdmFsdWUgPSBudWxscHRyKTsKIAotLy8gTVNWQyBzcGVjaWZpYzogU2VuZCBhbGwgYXNzZXJ0IHJlcG9ydHMgdG8gU1RET1VUIHRvIHByZXZlbnQgQ0kgaGFuZ3MuCi12b2lkIFNldHVwRGVmYXVsdENSVFJlcG9ydE1vZGUoKTsKLQogZW51bSBjbGFzcyBDYXNlIHsKICAga1Vua25vd24gPSAwLAogICAvLyBUaGVRdWlja0Jyb3duRm94CkBAIC03MDMsNiArNzAzLDggQEAKICAga0Rhc2hlciA9IDcsCiAgIC8vIFRIRVF1aUNLQnJfb3duRm94IChvciB3aGF0ZXZlciB5b3Ugd2FudCwgd2Ugd29uJ3QgY2hhbmdlIGl0KQogICBrS2VlcCA9IDgsCisgIC8vIHRoZV9xdWlja19icm93bl9mb3gxMjMgKGFzIG9wcG9zZWQgdG8gdGhlX3F1aWNrX2Jyb3duX2ZveF8xMjMpCisgIGtTbmFrZTIgPSA5LAogfTsKIAogLy8gQ29udmVydCB0aGUgYGlucHV0YCBzdHJpbmcgb2YgY2FzZSBgaW5wdXRfY2FzZWAgdG8gdGhlIHNwZWNpZmllZCBgb3V0cHV0X2Nhc2VgLgpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvaW5jbHVkZS9mbGF0YnVmZmVycy92ZWN0b3IuaCBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL2luY2x1ZGUvZmxhdGJ1ZmZlcnMvdmVjdG9yLmgKaW5kZXggZjhhNWQ4OC4uNmJjZGZlMiAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvaW5jbHVkZS9mbGF0YnVmZmVycy92ZWN0b3IuaAorKysgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy9pbmNsdWRlL2ZsYXRidWZmZXJzL3ZlY3Rvci5oCkBAIC0xOSw2ICsxOSw3IEBACiAKICNpbmNsdWRlICJmbGF0YnVmZmVycy9iYXNlLmgiCiAjaW5jbHVkZSAiZmxhdGJ1ZmZlcnMvYnVmZmVyLmgiCisjaW5jbHVkZSAiZmxhdGJ1ZmZlcnMvc3RsX2VtdWxhdGlvbi5oIgogCiBuYW1lc3BhY2UgZmxhdGJ1ZmZlcnMgewogCkBAIC0zMjYsNiArMzI3LDI0IEBACiAgIHJldHVybiBzcGFuPGNvbnN0IHVpbnQ4X3Q+KHZlYy5EYXRhKCksIHZlYy5zaXplKCkgKiBzaXplb2YoVSkpOwogfQogCisvLyBDb252ZW5pZW50IGhlbHBlciBmdW5jdGlvbnMgdG8gZ2V0IGEgc3BhbiBvZiBhbnkgdmVjdG9yLCByZWdhcmRsZXNzCisvLyBvZiB3aGV0aGVyIGl0IGlzIG51bGwgb3Igbm90ICh0aGUgZmllbGQgaXMgbm90IHNldCkuCit0ZW1wbGF0ZTxjbGFzcyBVPgorRkxBVEJVRkZFUlNfQ09OU1RFWFBSX0NQUDExIGZsYXRidWZmZXJzOjpzcGFuPFU+IG1ha2Vfc3BhbihWZWN0b3I8VT4gKnB0cikKKyAgICBGTEFUQlVGRkVSU19OT0VYQ0VQVCB7CisgIHN0YXRpY19hc3NlcnQoVmVjdG9yPFU+Ojppc19zcGFuX29ic2VydmFibGUsCisgICAgICAgICAgICAgICAgIndyb25nIHR5cGUgVSwgb25seSBMRS1zY2FsYXIsIG9yIGJ5dGUgdHlwZXMgYXJlIGFsbG93ZWQiKTsKKyAgcmV0dXJuIHB0ciA/IG1ha2Vfc3BhbigqcHRyKSA6IHNwYW48VT4oKTsKK30KKwordGVtcGxhdGU8Y2xhc3MgVT4KK0ZMQVRCVUZGRVJTX0NPTlNURVhQUl9DUFAxMSBmbGF0YnVmZmVyczo6c3Bhbjxjb25zdCBVPiBtYWtlX3NwYW4oCisgICAgY29uc3QgVmVjdG9yPFU+ICpwdHIpIEZMQVRCVUZGRVJTX05PRVhDRVBUIHsKKyAgc3RhdGljX2Fzc2VydChWZWN0b3I8VT46OmlzX3NwYW5fb2JzZXJ2YWJsZSwKKyAgICAgICAgICAgICAgICAid3JvbmcgdHlwZSBVLCBvbmx5IExFLXNjYWxhciwgb3IgYnl0ZSB0eXBlcyBhcmUgYWxsb3dlZCIpOworICByZXR1cm4gcHRyID8gbWFrZV9zcGFuKCpwdHIpIDogc3Bhbjxjb25zdCBVPigpOworfQorCiAvLyBSZXByZXNlbnQgYSB2ZWN0b3IgbXVjaCBsaWtlIHRoZSB0ZW1wbGF0ZSBhYm92ZSwgYnV0IGluIHRoaXMgY2FzZSB3ZQogLy8gZG9uJ3Qga25vdyB3aGF0IHRoZSBlbGVtZW50IHR5cGVzIGFyZSAodXNlZCB3aXRoIHJlZmxlY3Rpb24uaCkuCiBjbGFzcyBWZWN0b3JPZkFueSB7CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy9pbmNsdWRlL2ZsYXRidWZmZXJzL3ZlY3Rvcl9kb3dud2FyZC5oIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvaW5jbHVkZS9mbGF0YnVmZmVycy92ZWN0b3JfZG93bndhcmQuaAppbmRleCAzMzkxMzkxLi5kMjVlNTQ0IDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy9pbmNsdWRlL2ZsYXRidWZmZXJzL3ZlY3Rvcl9kb3dud2FyZC5oCisrKyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL2luY2x1ZGUvZmxhdGJ1ZmZlcnMvdmVjdG9yX2Rvd253YXJkLmgKQEAgLTI0LDcgKzI0LDcgQEAKIG5hbWVzcGFjZSBmbGF0YnVmZmVycyB7CiAKIC8vIFRoaXMgaXMgYSBtaW5pbWFsIHJlcGxpY2F0aW9uIG9mIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGZ1bmN0aW9uYWxpdHksCi0vLyBleGNlcHQgZ3Jvd2luZyBmcm9tIGhpZ2hlciB0byBsb3dlciBhZGRyZXNzZXMuIGkuZSBwdXNoX2JhY2soKSBpbnNlcnRzIGRhdGEKKy8vIGV4Y2VwdCBncm93aW5nIGZyb20gaGlnaGVyIHRvIGxvd2VyIGFkZHJlc3Nlcy4gaS5lLiBwdXNoX2JhY2soKSBpbnNlcnRzIGRhdGEKIC8vIGluIHRoZSBsb3dlc3QgYWRkcmVzcyBpbiB0aGUgdmVjdG9yLgogLy8gU2luY2UgdGhpcyB2ZWN0b3IgbGVhdmVzIHRoZSBsb3dlciBwYXJ0IHVudXNlZCwgd2Ugc3VwcG9ydCBhICJzY3JhdGNoLXBhZCIKIC8vIHRoYXQgY2FuIGJlIHN0b3JlZCB0aGVyZSBmb3IgdGVtcG9yYXJ5IGRhdGEsIHRvIHNoYXJlIHRoZSBhbGxvY2F0ZWQgc3BhY2UuCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy9pbmNsdWRlL2ZsYXRidWZmZXJzL3ZlcmlmaWVyLmggYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy9pbmNsdWRlL2ZsYXRidWZmZXJzL3ZlcmlmaWVyLmgKaW5kZXggNDUxMmQ0NS4uODdkM2Y1NCAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvaW5jbHVkZS9mbGF0YnVmZmVycy92ZXJpZmllci5oCisrKyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL2luY2x1ZGUvZmxhdGJ1ZmZlcnMvdmVyaWZpZXIuaApAQCAtMTgsNyArMTgsNiBAQAogI2RlZmluZSBGTEFUQlVGRkVSU19WRVJJRklFUl9IXwogCiAjaW5jbHVkZSAiZmxhdGJ1ZmZlcnMvYmFzZS5oIgotI2luY2x1ZGUgImZsYXRidWZmZXJzL3V0aWwuaCIKICNpbmNsdWRlICJmbGF0YnVmZmVycy92ZWN0b3IuaCIKIAogbmFtZXNwYWNlIGZsYXRidWZmZXJzIHsKQEAgLTI2LDIyICsyNSwzNyBAQAogLy8gSGVscGVyIGNsYXNzIHRvIHZlcmlmeSB0aGUgaW50ZWdyaXR5IG9mIGEgRmxhdEJ1ZmZlcgogY2xhc3MgVmVyaWZpZXIgRkxBVEJVRkZFUlNfRklOQUxfQ0xBU1MgewogIHB1YmxpYzoKLSAgVmVyaWZpZXIoY29uc3QgdWludDhfdCAqYnVmLCBzaXplX3QgYnVmX2xlbiwgdW9mZnNldF90IF9tYXhfZGVwdGggPSA2NCwKLSAgICAgICAgICAgdW9mZnNldF90IF9tYXhfdGFibGVzID0gMTAwMDAwMCwgYm9vbCBfY2hlY2tfYWxpZ25tZW50ID0gdHJ1ZSkKLSAgICAgIDogYnVmXyhidWYpLAotICAgICAgICBzaXplXyhidWZfbGVuKSwKLSAgICAgICAgZGVwdGhfKDApLAotICAgICAgICBtYXhfZGVwdGhfKF9tYXhfZGVwdGgpLAotICAgICAgICBudW1fdGFibGVzXygwKSwKLSAgICAgICAgbWF4X3RhYmxlc18oX21heF90YWJsZXMpLAotICAgICAgICB1cHBlcl9ib3VuZF8oMCksCi0gICAgICAgIGNoZWNrX2FsaWdubWVudF8oX2NoZWNrX2FsaWdubWVudCksCi0gICAgICAgIGZsZXhfcmV1c2VfdHJhY2tlcl8obnVsbHB0cikgeworICBzdHJ1Y3QgT3B0aW9ucyB7CisgICAgLy8gVGhlIG1heGltdW0gbmVzdGluZyBvZiB0YWJsZXMgYW5kIHZlY3RvcnMgYmVmb3JlIHdlIGNhbGwgaXQgaW52YWxpZC4KKyAgICB1b2Zmc2V0X3QgbWF4X2RlcHRoID0gNjQ7CisgICAgLy8gVGhlIG1heGltdW0gbnVtYmVyIG9mIHRhYmxlcyB3ZSB3aWxsIHZlcmlmeSBiZWZvcmUgd2UgY2FsbCBpdCBpbnZhbGlkLgorICAgIHVvZmZzZXRfdCBtYXhfdGFibGVzID0gMTAwMDAwMDsKKyAgICAvLyBJZiB0cnVlLCB2ZXJpZnkgYWxsIGRhdGEgaXMgYWxpZ25lZC4KKyAgICBib29sIGNoZWNrX2FsaWdubWVudCA9IHRydWU7CisgICAgLy8gSWYgdHJ1ZSwgcnVuIHZlcmlmaWVyIG9uIG5lc3RlZCBmbGF0YnVmZmVycworICAgIGJvb2wgY2hlY2tfbmVzdGVkX2ZsYXRidWZmZXJzID0gdHJ1ZTsKKyAgfTsKKworICBleHBsaWNpdCBWZXJpZmllcihjb25zdCB1aW50OF90ICpjb25zdCBidWYsIGNvbnN0IHNpemVfdCBidWZfbGVuLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBPcHRpb25zICZvcHRzKQorICAgICAgOiBidWZfKGJ1ZiksIHNpemVfKGJ1Zl9sZW4pLCBvcHRzXyhvcHRzKSB7CiAgICAgRkxBVEJVRkZFUlNfQVNTRVJUKHNpemVfIDwgRkxBVEJVRkZFUlNfTUFYX0JVRkZFUl9TSVpFKTsKICAgfQogCisgIC8vIERlcHJlY2F0ZWQgQVBJLCBwbGVhc2UgY29uc3RydWN0IHdpdGggVmVyaWZpZXI6Ok9wdGlvbnMuCisgIFZlcmlmaWVyKGNvbnN0IHVpbnQ4X3QgKmNvbnN0IGJ1ZiwgY29uc3Qgc2l6ZV90IGJ1Zl9sZW4sCisgICAgICAgICAgIGNvbnN0IHVvZmZzZXRfdCBtYXhfZGVwdGggPSA2NCwgY29uc3QgdW9mZnNldF90IG1heF90YWJsZXMgPSAxMDAwMDAwLAorICAgICAgICAgICBjb25zdCBib29sIGNoZWNrX2FsaWdubWVudCA9IHRydWUpCisgICAgICA6IFZlcmlmaWVyKGJ1ZiwgYnVmX2xlbiwgWyZdIHsKKyAgICAgICAgICBPcHRpb25zIG9wdHM7CisgICAgICAgICAgb3B0cy5tYXhfZGVwdGggPSBtYXhfZGVwdGg7CisgICAgICAgICAgb3B0cy5tYXhfdGFibGVzID0gbWF4X3RhYmxlczsKKyAgICAgICAgICBvcHRzLmNoZWNrX2FsaWdubWVudCA9IGNoZWNrX2FsaWdubWVudDsKKyAgICAgICAgICByZXR1cm4gb3B0czsKKyAgICAgICAgfSgpKSB7fQorCiAgIC8vIENlbnRyYWwgbG9jYXRpb24gd2hlcmUgYW55IHZlcmlmaWNhdGlvbiBmYWlsdXJlcyByZWdpc3Rlci4KLSAgYm9vbCBDaGVjayhib29sIG9rKSBjb25zdCB7CisgIGJvb2wgQ2hlY2soY29uc3QgYm9vbCBvaykgY29uc3QgewogICAgIC8vIGNsYW5nLWZvcm1hdCBvZmYKICAgICAjaWZkZWYgRkxBVEJVRkZFUlNfREVCVUdfVkVSSUZJQ0FUSU9OX0ZBSUxVUkUKICAgICAgIEZMQVRCVUZGRVJTX0FTU0VSVChvayk7CkBAIC01NSw3ICs2OSw3IEBACiAgIH0KIAogICAvLyBWZXJpZnkgYW55IHJhbmdlIHdpdGhpbiB0aGUgYnVmZmVyLgotICBib29sIFZlcmlmeShzaXplX3QgZWxlbSwgc2l6ZV90IGVsZW1fbGVuKSBjb25zdCB7CisgIGJvb2wgVmVyaWZ5KGNvbnN0IHNpemVfdCBlbGVtLCBjb25zdCBzaXplX3QgZWxlbV9sZW4pIGNvbnN0IHsKICAgICAvLyBjbGFuZy1mb3JtYXQgb2ZmCiAgICAgI2lmZGVmIEZMQVRCVUZGRVJTX1RSQUNLX1ZFUklGSUVSX0JVRkZFUl9TSVpFCiAgICAgICBhdXRvIHVwcGVyX2JvdW5kID0gZWxlbSArIGVsZW1fbGVuOwpAQCAtNjYsNTIgKzgwLDUyIEBACiAgICAgcmV0dXJuIENoZWNrKGVsZW1fbGVuIDwgc2l6ZV8gJiYgZWxlbSA8PSBzaXplXyAtIGVsZW1fbGVuKTsKICAgfQogCi0gIGJvb2wgVmVyaWZ5QWxpZ25tZW50KHNpemVfdCBlbGVtLCBzaXplX3QgYWxpZ24pIGNvbnN0IHsKLSAgICByZXR1cm4gQ2hlY2soKGVsZW0gJiAoYWxpZ24gLSAxKSkgPT0gMCB8fCAhY2hlY2tfYWxpZ25tZW50Xyk7CisgIGJvb2wgVmVyaWZ5QWxpZ25tZW50KGNvbnN0IHNpemVfdCBlbGVtLCBjb25zdCBzaXplX3QgYWxpZ24pIGNvbnN0IHsKKyAgICByZXR1cm4gQ2hlY2soKGVsZW0gJiAoYWxpZ24gLSAxKSkgPT0gMCB8fCAhb3B0c18uY2hlY2tfYWxpZ25tZW50KTsKICAgfQogCiAgIC8vIFZlcmlmeSBhIHJhbmdlIGluZGljYXRlZCBieSBzaXplb2YoVCkuCi0gIHRlbXBsYXRlPHR5cGVuYW1lIFQ+IGJvb2wgVmVyaWZ5KHNpemVfdCBlbGVtKSBjb25zdCB7CisgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+IGJvb2wgVmVyaWZ5KGNvbnN0IHNpemVfdCBlbGVtKSBjb25zdCB7CiAgICAgcmV0dXJuIFZlcmlmeUFsaWdubWVudChlbGVtLCBzaXplb2YoVCkpICYmIFZlcmlmeShlbGVtLCBzaXplb2YoVCkpOwogICB9CiAKLSAgYm9vbCBWZXJpZnlGcm9tUG9pbnRlcihjb25zdCB1aW50OF90ICpwLCBzaXplX3QgbGVuKSB7Ci0gICAgYXV0byBvID0gc3RhdGljX2Nhc3Q8c2l6ZV90PihwIC0gYnVmXyk7Ci0gICAgcmV0dXJuIFZlcmlmeShvLCBsZW4pOworICBib29sIFZlcmlmeUZyb21Qb2ludGVyKGNvbnN0IHVpbnQ4X3QgKmNvbnN0IHAsIGNvbnN0IHNpemVfdCBsZW4pIHsKKyAgICByZXR1cm4gVmVyaWZ5KHN0YXRpY19jYXN0PHNpemVfdD4ocCAtIGJ1Zl8pLCBsZW4pOwogICB9CiAKICAgLy8gVmVyaWZ5IHJlbGF0aXZlIHRvIGEga25vd24tZ29vZCBiYXNlIHBvaW50ZXIuCi0gIGJvb2wgVmVyaWZ5RmllbGRTdHJ1Y3QoY29uc3QgdWludDhfdCAqYmFzZSwgdm9mZnNldF90IGVsZW1fb2ZmLAotICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBlbGVtX2xlbiwgc2l6ZV90IGFsaWduKSBjb25zdCB7Ci0gICAgYXV0byBmID0gc3RhdGljX2Nhc3Q8c2l6ZV90PihiYXNlIC0gYnVmXykgKyBlbGVtX29mZjsKKyAgYm9vbCBWZXJpZnlGaWVsZFN0cnVjdChjb25zdCB1aW50OF90ICpjb25zdCBiYXNlLCBjb25zdCB2b2Zmc2V0X3QgZWxlbV9vZmYsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2l6ZV90IGVsZW1fbGVuLCBjb25zdCBzaXplX3QgYWxpZ24pIGNvbnN0IHsKKyAgICBjb25zdCBhdXRvIGYgPSBzdGF0aWNfY2FzdDxzaXplX3Q+KGJhc2UgLSBidWZfKSArIGVsZW1fb2ZmOwogICAgIHJldHVybiBWZXJpZnlBbGlnbm1lbnQoZiwgYWxpZ24pICYmIFZlcmlmeShmLCBlbGVtX2xlbik7CiAgIH0KIAogICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgotICBib29sIFZlcmlmeUZpZWxkKGNvbnN0IHVpbnQ4X3QgKmJhc2UsIHZvZmZzZXRfdCBlbGVtX29mZiwKLSAgICAgICAgICAgICAgICAgICBzaXplX3QgYWxpZ24pIGNvbnN0IHsKLSAgICBhdXRvIGYgPSBzdGF0aWNfY2FzdDxzaXplX3Q+KGJhc2UgLSBidWZfKSArIGVsZW1fb2ZmOworICBib29sIFZlcmlmeUZpZWxkKGNvbnN0IHVpbnQ4X3QgKmNvbnN0IGJhc2UsIGNvbnN0IHZvZmZzZXRfdCBlbGVtX29mZiwKKyAgICAgICAgICAgICAgICAgICBjb25zdCBzaXplX3QgYWxpZ24pIGNvbnN0IHsKKyAgICBjb25zdCBhdXRvIGYgPSBzdGF0aWNfY2FzdDxzaXplX3Q+KGJhc2UgLSBidWZfKSArIGVsZW1fb2ZmOwogICAgIHJldHVybiBWZXJpZnlBbGlnbm1lbnQoZiwgYWxpZ24pICYmIFZlcmlmeShmLCBzaXplb2YoVCkpOwogICB9CiAKICAgLy8gVmVyaWZ5IGEgcG9pbnRlciAobWF5IGJlIE5VTEwpIG9mIGEgdGFibGUgdHlwZS4KLSAgdGVtcGxhdGU8dHlwZW5hbWUgVD4gYm9vbCBWZXJpZnlUYWJsZShjb25zdCBUICp0YWJsZSkgeworICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBib29sIFZlcmlmeVRhYmxlKGNvbnN0IFQgKmNvbnN0IHRhYmxlKSB7CiAgICAgcmV0dXJuICF0YWJsZSB8fCB0YWJsZS0+VmVyaWZ5KCp0aGlzKTsKICAgfQogCiAgIC8vIFZlcmlmeSBhIHBvaW50ZXIgKG1heSBiZSBOVUxMKSBvZiBhbnkgdmVjdG9yIHR5cGUuCi0gIHRlbXBsYXRlPHR5cGVuYW1lIFQ+IGJvb2wgVmVyaWZ5VmVjdG9yKGNvbnN0IFZlY3RvcjxUPiAqdmVjKSBjb25zdCB7CisgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+IGJvb2wgVmVyaWZ5VmVjdG9yKGNvbnN0IFZlY3RvcjxUPiAqY29uc3QgdmVjKSBjb25zdCB7CiAgICAgcmV0dXJuICF2ZWMgfHwgVmVyaWZ5VmVjdG9yT3JTdHJpbmcocmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90ICo+KHZlYyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKFQpKTsKICAgfQogCiAgIC8vIFZlcmlmeSBhIHBvaW50ZXIgKG1heSBiZSBOVUxMKSBvZiBhIHZlY3RvciB0byBzdHJ1Y3QuCi0gIHRlbXBsYXRlPHR5cGVuYW1lIFQ+IGJvb2wgVmVyaWZ5VmVjdG9yKGNvbnN0IFZlY3Rvcjxjb25zdCBUICo+ICp2ZWMpIGNvbnN0IHsKKyAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgYm9vbCBWZXJpZnlWZWN0b3IoY29uc3QgVmVjdG9yPGNvbnN0IFQgKj4gKmNvbnN0IHZlYykgY29uc3QgewogICAgIHJldHVybiBWZXJpZnlWZWN0b3IocmVpbnRlcnByZXRfY2FzdDxjb25zdCBWZWN0b3I8VD4gKj4odmVjKSk7CiAgIH0KIAogICAvLyBWZXJpZnkgYSBwb2ludGVyIChtYXkgYmUgTlVMTCkgdG8gc3RyaW5nLgotICBib29sIFZlcmlmeVN0cmluZyhjb25zdCBTdHJpbmcgKnN0cikgY29uc3QgeworICBib29sIFZlcmlmeVN0cmluZyhjb25zdCBTdHJpbmcgKmNvbnN0IHN0cikgY29uc3QgewogICAgIHNpemVfdCBlbmQ7CiAgICAgcmV0dXJuICFzdHIgfHwgKFZlcmlmeVZlY3Rvck9yU3RyaW5nKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCAqPihzdHIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLCAmZW5kKSAmJgpAQCAtMTIwLDI0ICsxMzQsMjQgQEAKICAgfQogCiAgIC8vIENvbW1vbiBjb2RlIGJldHdlZW4gdmVjdG9ycyBhbmQgc3RyaW5ncy4KLSAgYm9vbCBWZXJpZnlWZWN0b3JPclN0cmluZyhjb25zdCB1aW50OF90ICp2ZWMsIHNpemVfdCBlbGVtX3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICplbmQgPSBudWxscHRyKSBjb25zdCB7Ci0gICAgYXV0byB2ZWNvID0gc3RhdGljX2Nhc3Q8c2l6ZV90Pih2ZWMgLSBidWZfKTsKKyAgYm9vbCBWZXJpZnlWZWN0b3JPclN0cmluZyhjb25zdCB1aW50OF90ICpjb25zdCB2ZWMsIGNvbnN0IHNpemVfdCBlbGVtX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICpjb25zdCBlbmQgPSBudWxscHRyKSBjb25zdCB7CisgICAgY29uc3QgYXV0byB2ZWNvID0gc3RhdGljX2Nhc3Q8c2l6ZV90Pih2ZWMgLSBidWZfKTsKICAgICAvLyBDaGVjayB3ZSBjYW4gcmVhZCB0aGUgc2l6ZSBmaWVsZC4KICAgICBpZiAoIVZlcmlmeTx1b2Zmc2V0X3Q+KHZlY28pKSByZXR1cm4gZmFsc2U7Ci0gICAgLy8gQ2hlY2sgdGhlIHdob2xlIGFycmF5LiBJZiB0aGlzIGlzIGEgc3RyaW5nLCB0aGUgYnl0ZSBwYXN0IHRoZSBhcnJheQotICAgIC8vIG11c3QgYmUgMC4KLSAgICBhdXRvIHNpemUgPSBSZWFkU2NhbGFyPHVvZmZzZXRfdD4odmVjKTsKLSAgICBhdXRvIG1heF9lbGVtcyA9IEZMQVRCVUZGRVJTX01BWF9CVUZGRVJfU0laRSAvIGVsZW1fc2l6ZTsKKyAgICAvLyBDaGVjayB0aGUgd2hvbGUgYXJyYXkuIElmIHRoaXMgaXMgYSBzdHJpbmcsIHRoZSBieXRlIHBhc3QgdGhlIGFycmF5IG11c3QKKyAgICAvLyBiZSAwLgorICAgIGNvbnN0IGF1dG8gc2l6ZSA9IFJlYWRTY2FsYXI8dW9mZnNldF90Pih2ZWMpOworICAgIGNvbnN0IGF1dG8gbWF4X2VsZW1zID0gRkxBVEJVRkZFUlNfTUFYX0JVRkZFUl9TSVpFIC8gZWxlbV9zaXplOwogICAgIGlmICghQ2hlY2soc2l6ZSA8IG1heF9lbGVtcykpCiAgICAgICByZXR1cm4gZmFsc2U7ICAvLyBQcm90ZWN0IGFnYWluc3QgYnl0ZV9zaXplIG92ZXJmbG93aW5nLgotICAgIGF1dG8gYnl0ZV9zaXplID0gc2l6ZW9mKHNpemUpICsgZWxlbV9zaXplICogc2l6ZTsKKyAgICBjb25zdCBhdXRvIGJ5dGVfc2l6ZSA9IHNpemVvZihzaXplKSArIGVsZW1fc2l6ZSAqIHNpemU7CiAgICAgaWYgKGVuZCkgKmVuZCA9IHZlY28gKyBieXRlX3NpemU7CiAgICAgcmV0dXJuIFZlcmlmeSh2ZWNvLCBieXRlX3NpemUpOwogICB9CiAKICAgLy8gU3BlY2lhbCBjYXNlIGZvciBzdHJpbmcgY29udGVudHMsIGFmdGVyIHRoZSBhYm92ZSBoYXMgYmVlbiBjYWxsZWQuCi0gIGJvb2wgVmVyaWZ5VmVjdG9yT2ZTdHJpbmdzKGNvbnN0IFZlY3RvcjxPZmZzZXQ8U3RyaW5nPj4gKnZlYykgY29uc3QgeworICBib29sIFZlcmlmeVZlY3Rvck9mU3RyaW5ncyhjb25zdCBWZWN0b3I8T2Zmc2V0PFN0cmluZz4+ICpjb25zdCB2ZWMpIGNvbnN0IHsKICAgICBpZiAodmVjKSB7CiAgICAgICBmb3IgKHVvZmZzZXRfdCBpID0gMDsgaSA8IHZlYy0+c2l6ZSgpOyBpKyspIHsKICAgICAgICAgaWYgKCFWZXJpZnlTdHJpbmcodmVjLT5HZXQoaSkpKSByZXR1cm4gZmFsc2U7CkBAIC0xNDcsNyArMTYxLDggQEAKICAgfQogCiAgIC8vIFNwZWNpYWwgY2FzZSBmb3IgdGFibGUgY29udGVudHMsIGFmdGVyIHRoZSBhYm92ZSBoYXMgYmVlbiBjYWxsZWQuCi0gIHRlbXBsYXRlPHR5cGVuYW1lIFQ+IGJvb2wgVmVyaWZ5VmVjdG9yT2ZUYWJsZXMoY29uc3QgVmVjdG9yPE9mZnNldDxUPj4gKnZlYykgeworICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICBib29sIFZlcmlmeVZlY3Rvck9mVGFibGVzKGNvbnN0IFZlY3RvcjxPZmZzZXQ8VD4+ICpjb25zdCB2ZWMpIHsKICAgICBpZiAodmVjKSB7CiAgICAgICBmb3IgKHVvZmZzZXRfdCBpID0gMDsgaSA8IHZlYy0+c2l6ZSgpOyBpKyspIHsKICAgICAgICAgaWYgKCF2ZWMtPkdldChpKS0+VmVyaWZ5KCp0aGlzKSkgcmV0dXJuIGZhbHNlOwpAQCAtMTU2LDMxICsxNzEsNDEgQEAKICAgICByZXR1cm4gdHJ1ZTsKICAgfQogCi0gIF9fc3VwcmVzc191YnNhbl9fKCJ1bnNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IikgYm9vbCBWZXJpZnlUYWJsZVN0YXJ0KAotICAgICAgY29uc3QgdWludDhfdCAqdGFibGUpIHsKKyAgX19zdXBwcmVzc191YnNhbl9fKCJ1bnNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IikgYm9vbCBWZXJpZnlUYWJsZVN0YXJ0KAorICAgICAgY29uc3QgdWludDhfdCAqY29uc3QgdGFibGUpIHsKICAgICAvLyBDaGVjayB0aGUgdnRhYmxlIG9mZnNldC4KLSAgICBhdXRvIHRhYmxlbyA9IHN0YXRpY19jYXN0PHNpemVfdD4odGFibGUgLSBidWZfKTsKKyAgICBjb25zdCBhdXRvIHRhYmxlbyA9IHN0YXRpY19jYXN0PHNpemVfdD4odGFibGUgLSBidWZfKTsKICAgICBpZiAoIVZlcmlmeTxzb2Zmc2V0X3Q+KHRhYmxlbykpIHJldHVybiBmYWxzZTsKICAgICAvLyBUaGlzIG9mZnNldCBtYXkgYmUgc2lnbmVkLCBidXQgZG9pbmcgdGhlIHN1YnRyYWN0aW9uIHVuc2lnbmVkIGFsd2F5cwogICAgIC8vIGdpdmVzIHRoZSByZXN1bHQgd2Ugd2FudC4KLSAgICBhdXRvIHZ0YWJsZW8gPSB0YWJsZW8gLSBzdGF0aWNfY2FzdDxzaXplX3Q+KFJlYWRTY2FsYXI8c29mZnNldF90Pih0YWJsZSkpOworICAgIGNvbnN0IGF1dG8gdnRhYmxlbyA9CisgICAgICAgIHRhYmxlbyAtIHN0YXRpY19jYXN0PHNpemVfdD4oUmVhZFNjYWxhcjxzb2Zmc2V0X3Q+KHRhYmxlKSk7CiAgICAgLy8gQ2hlY2sgdGhlIHZ0YWJsZSBzaXplIGZpZWxkLCB0aGVuIGNoZWNrIHZ0YWJsZSBmaXRzIGluIGl0cyBlbnRpcmV0eS4KLSAgICByZXR1cm4gVmVyaWZ5Q29tcGxleGl0eSgpICYmIFZlcmlmeTx2b2Zmc2V0X3Q+KHZ0YWJsZW8pICYmCi0gICAgICAgICAgIFZlcmlmeUFsaWdubWVudChSZWFkU2NhbGFyPHZvZmZzZXRfdD4oYnVmXyArIHZ0YWJsZW8pLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHZvZmZzZXRfdCkpICYmCi0gICAgICAgICAgIFZlcmlmeSh2dGFibGVvLCBSZWFkU2NhbGFyPHZvZmZzZXRfdD4oYnVmXyArIHZ0YWJsZW8pKTsKKyAgICBpZiAoIShWZXJpZnlDb21wbGV4aXR5KCkgJiYgVmVyaWZ5PHZvZmZzZXRfdD4odnRhYmxlbykgJiYKKyAgICAgICAgICBWZXJpZnlBbGlnbm1lbnQoUmVhZFNjYWxhcjx2b2Zmc2V0X3Q+KGJ1Zl8gKyB2dGFibGVvKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHZvZmZzZXRfdCkpKSkKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICBjb25zdCBhdXRvIHZzaXplID0gUmVhZFNjYWxhcjx2b2Zmc2V0X3Q+KGJ1Zl8gKyB2dGFibGVvKTsKKyAgICByZXR1cm4gQ2hlY2soKHZzaXplICYgMSkgPT0gMCkgJiYgVmVyaWZ5KHZ0YWJsZW8sIHZzaXplKTsKICAgfQogCiAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+Ci0gIGJvb2wgVmVyaWZ5QnVmZmVyRnJvbVN0YXJ0KGNvbnN0IGNoYXIgKmlkZW50aWZpZXIsIHNpemVfdCBzdGFydCkgeworICBib29sIFZlcmlmeUJ1ZmZlckZyb21TdGFydChjb25zdCBjaGFyICpjb25zdCBpZGVudGlmaWVyLCBjb25zdCBzaXplX3Qgc3RhcnQpIHsKKyAgICAvLyBCdWZmZXJzIGhhdmUgdG8gYmUgb2Ygc29tZSBzaXplIHRvIGJlIHZhbGlkLiBUaGUgcmVhc29uIGl0IGlzIGEgcnVudGltZQorICAgIC8vIGNoZWNrIGluc3RlYWQgb2Ygc3RhdGljX2Fzc2VydCwgaXMgdGhhdCBuZXN0ZWQgZmxhdGJ1ZmZlcnMgZ28gdGhyb3VnaAorICAgIC8vIHRoaXMgY2FsbCBhbmQgdGhlaXIgc2l6ZSBpcyBkZXRlcm1pbmVkIGF0IHJ1bnRpbWUuCisgICAgaWYgKCFDaGVjayhzaXplXyA+PSBGTEFUQlVGRkVSU19NSU5fQlVGRkVSX1NJWkUpKSByZXR1cm4gZmFsc2U7CisKKyAgICAvLyBJZiBhbiBpZGVudGlmaWVyIGlzIHByb3ZpZGVkLCBjaGVjayB0aGF0IHdlIGhhdmUgYSBidWZmZXIKICAgICBpZiAoaWRlbnRpZmllciAmJiAhQ2hlY2soKHNpemVfID49IDIgKiBzaXplb2YoZmxhdGJ1ZmZlcnM6OnVvZmZzZXRfdCkgJiYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1ZmZlckhhc0lkZW50aWZpZXIoYnVmXyArIHN0YXJ0LCBpZGVudGlmaWVyKSkpKSB7CiAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogCiAgICAgLy8gQ2FsbCBUOjpWZXJpZnksIHdoaWNoIG11c3QgYmUgaW4gdGhlIGdlbmVyYXRlZCBjb2RlIGZvciB0aGlzIHR5cGUuCi0gICAgYXV0byBvID0gVmVyaWZ5T2Zmc2V0KHN0YXJ0KTsKLSAgICByZXR1cm4gbyAmJiByZWludGVycHJldF9jYXN0PGNvbnN0IFQgKj4oYnVmXyArIHN0YXJ0ICsgbyktPlZlcmlmeSgqdGhpcykKKyAgICBjb25zdCBhdXRvIG8gPSBWZXJpZnlPZmZzZXQoc3RhcnQpOworICAgIHJldHVybiBDaGVjayhvICE9IDApICYmCisgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVCAqPihidWZfICsgc3RhcnQgKyBvKS0+VmVyaWZ5KCp0aGlzKQogICAgIC8vIGNsYW5nLWZvcm1hdCBvZmYKICAgICAjaWZkZWYgRkxBVEJVRkZFUlNfVFJBQ0tfVkVSSUZJRVJfQlVGRkVSX1NJWkUKICAgICAgICAgICAgJiYgR2V0Q29tcHV0ZWRTaXplKCkKQEAgLTE5MCw5ICsyMTUsMTcgQEAKICAgfQogCiAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+Ci0gIGJvb2wgVmVyaWZ5TmVzdGVkRmxhdEJ1ZmZlcihjb25zdCBWZWN0b3I8dWludDhfdD4gKmJ1ZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmlkZW50aWZpZXIpIHsKKyAgYm9vbCBWZXJpZnlOZXN0ZWRGbGF0QnVmZmVyKGNvbnN0IFZlY3Rvcjx1aW50OF90PiAqY29uc3QgYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqY29uc3QgaWRlbnRpZmllcikgeworICAgIC8vIENhbGxlciBvcHRlZCBvdXQgb2YgdGhpcy4KKyAgICBpZiAoIW9wdHNfLmNoZWNrX25lc3RlZF9mbGF0YnVmZmVycykgcmV0dXJuIHRydWU7CisKKyAgICAvLyBBbiBlbXB0eSBidWZmZXIgaXMgT0sgYXMgaXQgaW5kaWNhdGVzIG5vdCBwcmVzZW50LgogICAgIGlmICghYnVmKSByZXR1cm4gdHJ1ZTsKKworICAgIC8vIElmIHRoZXJlIGlzIGEgbmVzdGVkIGJ1ZmZlciwgaXQgbXVzdCBiZSBncmVhdGVyIHRoYW4gdGhlIG1pbiBzaXplLgorICAgIGlmICghQ2hlY2soYnVmLT5zaXplKCkgPj0gRkxBVEJVRkZFUlNfTUlOX0JVRkZFUl9TSVpFKSkgcmV0dXJuIGZhbHNlOworCiAgICAgVmVyaWZpZXIgbmVzdGVkX3ZlcmlmaWVyKGJ1Zi0+ZGF0YSgpLCBidWYtPnNpemUoKSk7CiAgICAgcmV0dXJuIG5lc3RlZF92ZXJpZmllci5WZXJpZnlCdWZmZXI8VD4oaWRlbnRpZmllcik7CiAgIH0KQEAgLTIwMCwxOSArMjMzLDIwIEBACiAgIC8vIFZlcmlmeSB0aGlzIHdob2xlIGJ1ZmZlciwgc3RhcnRpbmcgd2l0aCByb290IHR5cGUgVC4KICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4gYm9vbCBWZXJpZnlCdWZmZXIoKSB7IHJldHVybiBWZXJpZnlCdWZmZXI8VD4obnVsbHB0cik7IH0KIAotICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBib29sIFZlcmlmeUJ1ZmZlcihjb25zdCBjaGFyICppZGVudGlmaWVyKSB7CisgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+IGJvb2wgVmVyaWZ5QnVmZmVyKGNvbnN0IGNoYXIgKmNvbnN0IGlkZW50aWZpZXIpIHsKICAgICByZXR1cm4gVmVyaWZ5QnVmZmVyRnJvbVN0YXJ0PFQ+KGlkZW50aWZpZXIsIDApOwogICB9CiAKLSAgdGVtcGxhdGU8dHlwZW5hbWUgVD4gYm9vbCBWZXJpZnlTaXplUHJlZml4ZWRCdWZmZXIoY29uc3QgY2hhciAqaWRlbnRpZmllcikgeworICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICBib29sIFZlcmlmeVNpemVQcmVmaXhlZEJ1ZmZlcihjb25zdCBjaGFyICpjb25zdCBpZGVudGlmaWVyKSB7CiAgICAgcmV0dXJuIFZlcmlmeTx1b2Zmc2V0X3Q+KDBVKSAmJgotICAgICAgICAgICBSZWFkU2NhbGFyPHVvZmZzZXRfdD4oYnVmXykgPT0gc2l6ZV8gLSBzaXplb2YodW9mZnNldF90KSAmJgorICAgICAgICAgICBDaGVjayhSZWFkU2NhbGFyPHVvZmZzZXRfdD4oYnVmXykgPT0gc2l6ZV8gLSBzaXplb2YodW9mZnNldF90KSkgJiYKICAgICAgICAgICAgVmVyaWZ5QnVmZmVyRnJvbVN0YXJ0PFQ+KGlkZW50aWZpZXIsIHNpemVvZih1b2Zmc2V0X3QpKTsKICAgfQogCi0gIHVvZmZzZXRfdCBWZXJpZnlPZmZzZXQoc2l6ZV90IHN0YXJ0KSBjb25zdCB7CisgIHVvZmZzZXRfdCBWZXJpZnlPZmZzZXQoY29uc3Qgc2l6ZV90IHN0YXJ0KSBjb25zdCB7CiAgICAgaWYgKCFWZXJpZnk8dW9mZnNldF90PihzdGFydCkpIHJldHVybiAwOwotICAgIGF1dG8gbyA9IFJlYWRTY2FsYXI8dW9mZnNldF90PihidWZfICsgc3RhcnQpOworICAgIGNvbnN0IGF1dG8gbyA9IFJlYWRTY2FsYXI8dW9mZnNldF90PihidWZfICsgc3RhcnQpOwogICAgIC8vIE1heSBub3QgcG9pbnQgdG8gaXRzZWxmLgogICAgIGlmICghQ2hlY2sobyAhPSAwKSkgcmV0dXJuIDA7CiAgICAgLy8gQ2FuJ3Qgd3JhcCBhcm91bmQgLyBidWZmZXJzIGFyZSBtYXggMkdCLgpAQCAtMjIzLDE4ICsyNTcsMTggQEAKICAgICByZXR1cm4gbzsKICAgfQogCi0gIHVvZmZzZXRfdCBWZXJpZnlPZmZzZXQoY29uc3QgdWludDhfdCAqYmFzZSwgdm9mZnNldF90IHN0YXJ0KSBjb25zdCB7CisgIHVvZmZzZXRfdCBWZXJpZnlPZmZzZXQoY29uc3QgdWludDhfdCAqY29uc3QgYmFzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2Zmc2V0X3Qgc3RhcnQpIGNvbnN0IHsKICAgICByZXR1cm4gVmVyaWZ5T2Zmc2V0KHN0YXRpY19jYXN0PHNpemVfdD4oYmFzZSAtIGJ1Zl8pICsgc3RhcnQpOwogICB9CiAKICAgLy8gQ2FsbGVkIGF0IHRoZSBzdGFydCBvZiBhIHRhYmxlIHRvIGluY3JlYXNlIGNvdW50ZXJzIG1lYXN1cmluZyBkYXRhCi0gIC8vIHN0cnVjdHVyZSBkZXB0aCBhbmQgYW1vdW50LCBhbmQgcG9zc2libHkgYmFpbHMgb3V0IHdpdGggZmFsc2UgaWYKLSAgLy8gbGltaXRzIHNldCBieSB0aGUgY29uc3RydWN0b3IgaGF2ZSBiZWVuIGhpdC4gTmVlZHMgdG8gYmUgYmFsYW5jZWQKLSAgLy8gd2l0aCBFbmRUYWJsZSgpLgorICAvLyBzdHJ1Y3R1cmUgZGVwdGggYW5kIGFtb3VudCwgYW5kIHBvc3NpYmx5IGJhaWxzIG91dCB3aXRoIGZhbHNlIGlmIGxpbWl0cyBzZXQKKyAgLy8gYnkgdGhlIGNvbnN0cnVjdG9yIGhhdmUgYmVlbiBoaXQuIE5lZWRzIHRvIGJlIGJhbGFuY2VkIHdpdGggRW5kVGFibGUoKS4KICAgYm9vbCBWZXJpZnlDb21wbGV4aXR5KCkgewogICAgIGRlcHRoXysrOwogICAgIG51bV90YWJsZXNfKys7Ci0gICAgcmV0dXJuIENoZWNrKGRlcHRoXyA8PSBtYXhfZGVwdGhfICYmIG51bV90YWJsZXNfIDw9IG1heF90YWJsZXNfKTsKKyAgICByZXR1cm4gQ2hlY2soZGVwdGhfIDw9IG9wdHNfLm1heF9kZXB0aCAmJiBudW1fdGFibGVzXyA8PSBvcHRzXy5tYXhfdGFibGVzKTsKICAgfQogCiAgIC8vIENhbGxlZCBhdCB0aGUgZW5kIG9mIGEgdGFibGUgdG8gcG9wIHRoZSBkZXB0aCBjb3VudC4KQEAgLTI2MiwyMCArMjk2LDIwIEBACiAKICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gKkdldEZsZXhSZXVzZVRyYWNrZXIoKSB7IHJldHVybiBmbGV4X3JldXNlX3RyYWNrZXJfOyB9CiAKLSAgdm9pZCBTZXRGbGV4UmV1c2VUcmFja2VyKHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+ICpydCkgeworICB2b2lkIFNldEZsZXhSZXVzZVRyYWNrZXIoc3RkOjp2ZWN0b3I8dWludDhfdD4gKmNvbnN0IHJ0KSB7CiAgICAgZmxleF9yZXVzZV90cmFja2VyXyA9IHJ0OwogICB9CiAKICBwcml2YXRlOgogICBjb25zdCB1aW50OF90ICpidWZfOwotICBzaXplX3Qgc2l6ZV87Ci0gIHVvZmZzZXRfdCBkZXB0aF87Ci0gIHVvZmZzZXRfdCBtYXhfZGVwdGhfOwotICB1b2Zmc2V0X3QgbnVtX3RhYmxlc187Ci0gIHVvZmZzZXRfdCBtYXhfdGFibGVzXzsKLSAgbXV0YWJsZSBzaXplX3QgdXBwZXJfYm91bmRfOwotICBib29sIGNoZWNrX2FsaWdubWVudF87Ci0gIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+ICpmbGV4X3JldXNlX3RyYWNrZXJfOworICBjb25zdCBzaXplX3Qgc2l6ZV87CisgIGNvbnN0IE9wdGlvbnMgb3B0c187CisKKyAgbXV0YWJsZSBzaXplX3QgdXBwZXJfYm91bmRfID0gMDsKKworICB1b2Zmc2V0X3QgZGVwdGhfID0gMDsKKyAgdW9mZnNldF90IG51bV90YWJsZXNfID0gMDsKKyAgc3RkOjp2ZWN0b3I8dWludDhfdD4gKmZsZXhfcmV1c2VfdHJhY2tlcl8gPSBudWxscHRyOwogfTsKIAogfSAgLy8gbmFtZXNwYWNlIGZsYXRidWZmZXJzCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy9wb20ueG1sIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvamF2YS9wb20ueG1sCnNpbWlsYXJpdHkgaW5kZXggODIlCnJlbmFtZSBmcm9tIHRoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3BvbS54bWwKcmVuYW1lIHRvIHRoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL2phdmEvcG9tLnhtbAppbmRleCBhYTMxOGQwLi4zNGYxNTRhIDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy9wb20ueG1sCisrKyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL2phdmEvcG9tLnhtbApAQCAtMyw3ICszLDcgQEAKICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgogICA8Z3JvdXBJZD5jb20uZ29vZ2xlLmZsYXRidWZmZXJzPC9ncm91cElkPgogICA8YXJ0aWZhY3RJZD5mbGF0YnVmZmVycy1qYXZhPC9hcnRpZmFjdElkPgotICA8dmVyc2lvbj4yLjAuMzwvdmVyc2lvbj4KKyAgPHZlcnNpb24+Mi4wLjg8L3ZlcnNpb24+CiAgIDxwYWNrYWdpbmc+YnVuZGxlPC9wYWNrYWdpbmc+CiAgIDxuYW1lPkZsYXRCdWZmZXJzIEphdmEgQVBJPC9uYW1lPgogICA8ZGVzY3JpcHRpb24+CkBAIC0xMyw2ICsxMywxMCBAQAogICAgIDxkZXZlbG9wZXI+CiAgICAgICA8bmFtZT5Xb3V0ZXIgdmFuIE9vcnRtZXJzc2VuPC9uYW1lPgogICAgIDwvZGV2ZWxvcGVyPgorICAgIDxkZXZlbG9wZXI+CisgICAgICA8bmFtZT5EZXJlayBCYWlsZXk8L25hbWU+CisgICAgICA8ZW1haWw+ZGJhaWxleWNoZXNzQGdtYWlsLmNvbTwvZW1haWw+CisgICAgPC9kZXZlbG9wZXI+CiAgIDwvZGV2ZWxvcGVycz4KICAgPHByb3BlcnRpZXM+CiAgICAgPHByb2plY3QuYnVpbGQuc291cmNlRW5jb2Rpbmc+VVRGLTg8L3Byb2plY3QuYnVpbGQuc291cmNlRW5jb2Rpbmc+CkBAIC0zMyw2ICszNywxOCBAQAogICAgIDx0YWc+SEVBRDwvdGFnPgogICA8L3NjbT4KICAgPGRlcGVuZGVuY2llcz4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPmp1bml0PC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+anVuaXQ8L2FydGlmYWN0SWQ+CisgICAgICA8dmVyc2lvbj40LjEzLjE8L3ZlcnNpb24+CisgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgPC9kZXBlbmRlbmN5PgorICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+Y29tLmdvb2dsZS50cnV0aDwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPnRydXRoPC9hcnRpZmFjdElkPgorICAgICAgPHZlcnNpb24+MS4xLjM8L3ZlcnNpb24+CisgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgPC9kZXBlbmRlbmN5PgogICA8L2RlcGVuZGVuY2llcz4KICAgPGRpc3RyaWJ1dGlvbk1hbmFnZW1lbnQ+CiAgICAgPHNuYXBzaG90UmVwb3NpdG9yeT4KQEAgLTQxLDcgKzU3LDIxIEBACiAgICAgPC9zbmFwc2hvdFJlcG9zaXRvcnk+CiAgIDwvZGlzdHJpYnV0aW9uTWFuYWdlbWVudD4KICAgPGJ1aWxkPgotICAgIDxzb3VyY2VEaXJlY3Rvcnk+amF2YTwvc291cmNlRGlyZWN0b3J5PgorICAgIDxwbHVnaW5zPgorICAgIDxwbHVnaW4+CisgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1jb21waWxlci1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgPHJlbGVhc2U+ODwvcmVsZWFzZT4KKyAgICAgICAgPHRlc3RFeGNsdWRlcz4KKyAgICAgICAgICA8dGVzdEV4Y2x1ZGU+KiovTG9uZ0VudW0uamF2YTwvdGVzdEV4Y2x1ZGU+CisgICAgICAgICAgPHRlc3RFeGNsdWRlPk15R2FtZS9FeGFtcGxlL01vbnN0ZXJTdG9yYWdlR3JwYy5qYXZhPC90ZXN0RXhjbHVkZT4KKyAgICAgICAgICA8dGVzdEV4Y2x1ZGU+TXlHYW1lL0V4YW1wbGUvU3RydWN0T2ZTdHJ1Y3RzKio8L3Rlc3RFeGNsdWRlPgorICAgICAgICAgIDx0ZXN0RXhjbHVkZT5NeUdhbWUvT3RoZXJOYW1lU3BhY2UvVGFibGVCVC5qYXZhPC90ZXN0RXhjbHVkZT4KKyAgICAgICAgPC90ZXN0RXhjbHVkZXM+CisgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICA8dmVyc2lvbj4zLjguMTwvdmVyc2lvbj4KKyAgICA8L3BsdWdpbj4KKyAgICA8L3BsdWdpbnM+CiAgIDwvYnVpbGQ+CiAgIDxwcm9maWxlcz4KICAgICA8cHJvZmlsZT4KQEAgLTUyLDEzICs4Miw2IEBACiAgICAgICA8YnVpbGQ+CiAgICAgICAgIDxwbHVnaW5zPgogICAgICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1jb21waWxlci1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgPHJlbGVhc2U+ODwvcmVsZWFzZT4KLSAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgIDx2ZXJzaW9uPjMuOC4xPC92ZXJzaW9uPgotICAgICAgICAgIDwvcGx1Z2luPgotICAgICAgICAgIDxwbHVnaW4+CiAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1zdXJlZmlyZS1wbHVnaW48L2FydGlmYWN0SWQ+CiAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KICAgICAgICAgICAgICAgPGluY2x1ZGVzPgpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvamF2YS9jb20vZ29vZ2xlL2ZsYXRidWZmZXJzL0FycmF5UmVhZFdyaXRlQnVmLmphdmEgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy9qYXZhL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9mbGF0YnVmZmVycy9BcnJheVJlYWRXcml0ZUJ1Zi5qYXZhCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSB0aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy9qYXZhL2NvbS9nb29nbGUvZmxhdGJ1ZmZlcnMvQXJyYXlSZWFkV3JpdGVCdWYuamF2YQpyZW5hbWUgdG8gdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvamF2YS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZmxhdGJ1ZmZlcnMvQXJyYXlSZWFkV3JpdGVCdWYuamF2YQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvamF2YS9jb20vZ29vZ2xlL2ZsYXRidWZmZXJzL0Jhc2VWZWN0b3IuamF2YSBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL2phdmEvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2ZsYXRidWZmZXJzL0Jhc2VWZWN0b3IuamF2YQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvamF2YS9jb20vZ29vZ2xlL2ZsYXRidWZmZXJzL0Jhc2VWZWN0b3IuamF2YQpyZW5hbWUgdG8gdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvamF2YS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZmxhdGJ1ZmZlcnMvQmFzZVZlY3Rvci5qYXZhCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy9qYXZhL2NvbS9nb29nbGUvZmxhdGJ1ZmZlcnMvQm9vbGVhblZlY3Rvci5qYXZhIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvamF2YS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZmxhdGJ1ZmZlcnMvQm9vbGVhblZlY3Rvci5qYXZhCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSB0aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy9qYXZhL2NvbS9nb29nbGUvZmxhdGJ1ZmZlcnMvQm9vbGVhblZlY3Rvci5qYXZhCnJlbmFtZSB0byB0aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy9qYXZhL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9mbGF0YnVmZmVycy9Cb29sZWFuVmVjdG9yLmphdmEKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL2phdmEvY29tL2dvb2dsZS9mbGF0YnVmZmVycy9CeXRlQnVmZmVyUmVhZFdyaXRlQnVmLmphdmEgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy9qYXZhL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9mbGF0YnVmZmVycy9CeXRlQnVmZmVyUmVhZFdyaXRlQnVmLmphdmEKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHRoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL2phdmEvY29tL2dvb2dsZS9mbGF0YnVmZmVycy9CeXRlQnVmZmVyUmVhZFdyaXRlQnVmLmphdmEKcmVuYW1lIHRvIHRoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL2phdmEvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2ZsYXRidWZmZXJzL0J5dGVCdWZmZXJSZWFkV3JpdGVCdWYuamF2YQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvamF2YS9jb20vZ29vZ2xlL2ZsYXRidWZmZXJzL0J5dGVCdWZmZXJVdGlsLmphdmEgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy9qYXZhL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9mbGF0YnVmZmVycy9CeXRlQnVmZmVyVXRpbC5qYXZhCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSB0aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy9qYXZhL2NvbS9nb29nbGUvZmxhdGJ1ZmZlcnMvQnl0ZUJ1ZmZlclV0aWwuamF2YQpyZW5hbWUgdG8gdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvamF2YS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZmxhdGJ1ZmZlcnMvQnl0ZUJ1ZmZlclV0aWwuamF2YQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvamF2YS9jb20vZ29vZ2xlL2ZsYXRidWZmZXJzL0J5dGVWZWN0b3IuamF2YSBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL2phdmEvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2ZsYXRidWZmZXJzL0J5dGVWZWN0b3IuamF2YQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvamF2YS9jb20vZ29vZ2xlL2ZsYXRidWZmZXJzL0J5dGVWZWN0b3IuamF2YQpyZW5hbWUgdG8gdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvamF2YS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZmxhdGJ1ZmZlcnMvQnl0ZVZlY3Rvci5qYXZhCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy9qYXZhL2NvbS9nb29nbGUvZmxhdGJ1ZmZlcnMvQ29uc3RhbnRzLmphdmEgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy9qYXZhL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9mbGF0YnVmZmVycy9Db25zdGFudHMuamF2YQpzaW1pbGFyaXR5IGluZGV4IDk3JQpyZW5hbWUgZnJvbSB0aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy9qYXZhL2NvbS9nb29nbGUvZmxhdGJ1ZmZlcnMvQ29uc3RhbnRzLmphdmEKcmVuYW1lIHRvIHRoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL2phdmEvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2ZsYXRidWZmZXJzL0NvbnN0YW50cy5qYXZhCmluZGV4IDBjMDkyMGYuLmI5Y2I4ZjIgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL2phdmEvY29tL2dvb2dsZS9mbGF0YnVmZmVycy9Db25zdGFudHMuamF2YQorKysgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy9qYXZhL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9mbGF0YnVmZmVycy9Db25zdGFudHMuamF2YQpAQCAtNDYsNyArNDYsNyBAQAogICAgIENoYW5nZXMgdG8gdGhlIEphdmEgaW1wbGVtZW50YXRpb24gbmVlZCB0byBiZSBzdXJlIHRvIGNoYW5nZQogICAgIHRoZSB2ZXJzaW9uIGhlcmUgYW5kIGluIHRoZSBjb2RlIGdlbmVyYXRvciBvbiBldmVyeSBwb3NzaWJsZQogICAgIGluY29tcGF0aWJsZSBjaGFuZ2UgKi8KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgRkxBVEJVRkZFUlNfMl8wXzAoKSB7fQorICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBGTEFUQlVGRkVSU18yXzBfOCgpIHt9CiB9CiAKIC8vLyBAZW5kY29uZApkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvamF2YS9jb20vZ29vZ2xlL2ZsYXRidWZmZXJzL0RvdWJsZVZlY3Rvci5qYXZhIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvamF2YS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZmxhdGJ1ZmZlcnMvRG91YmxlVmVjdG9yLmphdmEKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHRoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL2phdmEvY29tL2dvb2dsZS9mbGF0YnVmZmVycy9Eb3VibGVWZWN0b3IuamF2YQpyZW5hbWUgdG8gdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvamF2YS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZmxhdGJ1ZmZlcnMvRG91YmxlVmVjdG9yLmphdmEKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL2phdmEvY29tL2dvb2dsZS9mbGF0YnVmZmVycy9GbGF0QnVmZmVyQnVpbGRlci5qYXZhIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvamF2YS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZmxhdGJ1ZmZlcnMvRmxhdEJ1ZmZlckJ1aWxkZXIuamF2YQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvamF2YS9jb20vZ29vZ2xlL2ZsYXRidWZmZXJzL0ZsYXRCdWZmZXJCdWlsZGVyLmphdmEKcmVuYW1lIHRvIHRoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL2phdmEvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2ZsYXRidWZmZXJzL0ZsYXRCdWZmZXJCdWlsZGVyLmphdmEKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL2phdmEvY29tL2dvb2dsZS9mbGF0YnVmZmVycy9GbGV4QnVmZmVycy5qYXZhIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvamF2YS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZmxhdGJ1ZmZlcnMvRmxleEJ1ZmZlcnMuamF2YQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvamF2YS9jb20vZ29vZ2xlL2ZsYXRidWZmZXJzL0ZsZXhCdWZmZXJzLmphdmEKcmVuYW1lIHRvIHRoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL2phdmEvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2ZsYXRidWZmZXJzL0ZsZXhCdWZmZXJzLmphdmEKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL2phdmEvY29tL2dvb2dsZS9mbGF0YnVmZmVycy9GbGV4QnVmZmVyc0J1aWxkZXIuamF2YSBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL2phdmEvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2ZsYXRidWZmZXJzL0ZsZXhCdWZmZXJzQnVpbGRlci5qYXZhCnNpbWlsYXJpdHkgaW5kZXggOTclCnJlbmFtZSBmcm9tIHRoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL2phdmEvY29tL2dvb2dsZS9mbGF0YnVmZmVycy9GbGV4QnVmZmVyc0J1aWxkZXIuamF2YQpyZW5hbWUgdG8gdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvamF2YS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZmxhdGJ1ZmZlcnMvRmxleEJ1ZmZlcnNCdWlsZGVyLmphdmEKaW5kZXggN2Y0MWJiNi4uNjBhYjUzNSAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvamF2YS9jb20vZ29vZ2xlL2ZsYXRidWZmZXJzL0ZsZXhCdWZmZXJzQnVpbGRlci5qYXZhCisrKyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL2phdmEvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2ZsYXRidWZmZXJzL0ZsZXhCdWZmZXJzQnVpbGRlci5qYXZhCkBAIC0xNzQsNiArMTc0LDIxIEBACiAgICAgfQogCiAgICAgLyoqCisgICAgICogSW5zZXJ0IGEgbnVsbCB2YWx1ZSBpbnRvIHRoZSBidWZmZXIKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBwdXROdWxsKCkgeworICAgICAgICBwdXROdWxsKG51bGwpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEluc2VydCBhIG51bGwgdmFsdWUgaW50byB0aGUgYnVmZmVyCisgICAgICogQHBhcmFtIGtleSBrZXkgdXNlZCB0byBzdG9yZSBlbGVtZW50IGluIG1hcAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHB1dE51bGwoU3RyaW5nIGtleSkgeworICAgICAgICBzdGFjay5hZGQoVmFsdWUubnVsbFZhbHVlKHB1dEtleShrZXkpKSk7CisgICAgfQorCisgICAgLyoqCiAgICAgICogSW5zZXJ0IGEgc2luZ2xlIGJvb2xlYW4gaW50byB0aGUgYnVmZmVyCiAgICAgICogQHBhcmFtIHZhbCB0cnVlIG9yIGZhbHNlCiAgICAgICovCkBAIC00NTEsNyArNDY2LDcgQEAKICAgICAvKioKICAgICAgKiBGaW5pc2hlcyBhIHZlY3RvciwgYnV0IHdyaXRpbmcgdGhlIGluZm9ybWF0aW9uIGluIHRoZSBidWZmZXIKICAgICAgKiBAcGFyYW0ga2V5ICAga2V5IHVzZWQgdG8gc3RvcmUgZWxlbWVudCBpbiBtYXAKLSAgICAgKiBAcGFyYW0gc3RhcnQgcmVmZXJlbmNlIGZvciBiZWdpbmluZyBvZiB0aGUgdmVjdG9yLiBSZXR1cm5lZCBieSB7QGxpbmsgc3RhcnRWZWN0b3IoKX0KKyAgICAgKiBAcGFyYW0gc3RhcnQgcmVmZXJlbmNlIGZvciBiZWdpbm5pbmcgb2YgdGhlIHZlY3Rvci4gUmV0dXJuZWQgYnkge0BsaW5rIHN0YXJ0VmVjdG9yKCl9CiAgICAgICogQHBhcmFtIHR5cGVkIGJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIHZlY3RvciBpcyB0eXBlZAogICAgICAqIEBwYXJhbSBmaXhlZCBib29sZWFuIGluZGljYXRpbmcgd2hldGhlciB2ZWN0b3IgaXMgZml4ZWQKICAgICAgKiBAcmV0dXJuICAgICAgUmVmZXJlbmNlIHRvIHRoZSB2ZWN0b3IKQEAgLTUwMiw3ICs1MTcsOSBAQAogICAgICAqIEByZXR1cm4gVmFsdWUgcmVwcmVzZW50aW5nIHRoZSBjcmVhdGVkIHZlY3RvcgogICAgICAqLwogICAgIHByaXZhdGUgVmFsdWUgY3JlYXRlVmVjdG9yKGludCBrZXksIGludCBzdGFydCwgaW50IGxlbmd0aCwgYm9vbGVhbiB0eXBlZCwgYm9vbGVhbiBmaXhlZCwgVmFsdWUga2V5cykgewotICAgICAgICBhc3NlcnQgKCFmaXhlZCB8fCB0eXBlZCk7IC8vIHR5cGVkPWZhbHNlLCBmaXhlZD10cnVlIGNvbWJpbmF0aW9uIGlzIG5vdCBzdXBwb3J0ZWQuCisgICAgICAgIGlmIChmaXhlZCAmICF0eXBlZCkKKyAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiVW50eXBlZCBmaXhlZCB2ZWN0b3IgaXMgbm90IHN1cHBvcnRlZCIpOworCiAgICAgICAgIC8vIEZpZ3VyZSBvdXQgc21hbGxlc3QgYml0IHdpZHRoIHdlIGNhbiBzdG9yZSB0aGlzIHZlY3RvciB3aXRoLgogICAgICAgICBpbnQgYml0V2lkdGggPSBNYXRoLm1heChXSURUSF84LCB3aWR0aFVJbkJpdHMobGVuZ3RoKSk7CiAgICAgICAgIGludCBwcmVmaXhFbGVtcyA9IDE7CkBAIC02MDIsNyArNjE5LDcgQEAKICAgICAvKioKICAgICAgKiBGaW5pc2hlcyBhIG1hcCwgYnV0IHdyaXRpbmcgdGhlIGluZm9ybWF0aW9uIGluIHRoZSBidWZmZXIKICAgICAgKiBAcGFyYW0ga2V5ICAga2V5IHVzZWQgdG8gc3RvcmUgZWxlbWVudCBpbiBtYXAKLSAgICAgKiBAcGFyYW0gc3RhcnQgcmVmZXJlbmNlIGZvciBiZWdpbmluZyBvZiB0aGUgbWFwLiBSZXR1cm5lZCBieSB7QGxpbmsgc3RhcnRNYXAoKX0KKyAgICAgKiBAcGFyYW0gc3RhcnQgcmVmZXJlbmNlIGZvciBiZWdpbm5pbmcgb2YgdGhlIG1hcC4gUmV0dXJuZWQgYnkge0BsaW5rIHN0YXJ0TWFwKCl9CiAgICAgICogQHJldHVybiAgICAgIFJlZmVyZW5jZSB0byB0aGUgbWFwCiAgICAgICovCiAgICAgcHVibGljIGludCBlbmRNYXAoU3RyaW5nIGtleSwgaW50IHN0YXJ0KSB7CkBAIC02NzMsNiArNjkwLDEwIEBACiAgICAgICAgICAgICB0aGlzLmlWYWx1ZSA9IExvbmcuTUlOX1ZBTFVFOwogICAgICAgICB9CiAKKyAgICAgICAgc3RhdGljIFZhbHVlIG51bGxWYWx1ZShpbnQga2V5KSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IFZhbHVlKGtleSwgRkJUX05VTEwsIFdJRFRIXzgsIDApOworICAgICAgICB9CisKICAgICAgICAgc3RhdGljIFZhbHVlIGJvb2woaW50IGtleSwgYm9vbGVhbiBiKSB7CiAgICAgICAgICAgICByZXR1cm4gbmV3IFZhbHVlKGtleSwgRkJUX0JPT0wsIFdJRFRIXzgsIGIgPyAxIDogMCk7CiAgICAgICAgIH0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL2phdmEvY29tL2dvb2dsZS9mbGF0YnVmZmVycy9GbG9hdFZlY3Rvci5qYXZhIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvamF2YS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZmxhdGJ1ZmZlcnMvRmxvYXRWZWN0b3IuamF2YQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvamF2YS9jb20vZ29vZ2xlL2ZsYXRidWZmZXJzL0Zsb2F0VmVjdG9yLmphdmEKcmVuYW1lIHRvIHRoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL2phdmEvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2ZsYXRidWZmZXJzL0Zsb2F0VmVjdG9yLmphdmEKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL2phdmEvY29tL2dvb2dsZS9mbGF0YnVmZmVycy9JbnRWZWN0b3IuamF2YSBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL2phdmEvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2ZsYXRidWZmZXJzL0ludFZlY3Rvci5qYXZhCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSB0aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy9qYXZhL2NvbS9nb29nbGUvZmxhdGJ1ZmZlcnMvSW50VmVjdG9yLmphdmEKcmVuYW1lIHRvIHRoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL2phdmEvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2ZsYXRidWZmZXJzL0ludFZlY3Rvci5qYXZhCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy9qYXZhL2NvbS9nb29nbGUvZmxhdGJ1ZmZlcnMvTG9uZ1ZlY3Rvci5qYXZhIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvamF2YS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZmxhdGJ1ZmZlcnMvTG9uZ1ZlY3Rvci5qYXZhCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSB0aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy9qYXZhL2NvbS9nb29nbGUvZmxhdGJ1ZmZlcnMvTG9uZ1ZlY3Rvci5qYXZhCnJlbmFtZSB0byB0aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy9qYXZhL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9mbGF0YnVmZmVycy9Mb25nVmVjdG9yLmphdmEKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL2phdmEvY29tL2dvb2dsZS9mbGF0YnVmZmVycy9SZWFkQnVmLmphdmEgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy9qYXZhL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9mbGF0YnVmZmVycy9SZWFkQnVmLmphdmEKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHRoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL2phdmEvY29tL2dvb2dsZS9mbGF0YnVmZmVycy9SZWFkQnVmLmphdmEKcmVuYW1lIHRvIHRoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL2phdmEvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2ZsYXRidWZmZXJzL1JlYWRCdWYuamF2YQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvamF2YS9jb20vZ29vZ2xlL2ZsYXRidWZmZXJzL1JlYWRXcml0ZUJ1Zi5qYXZhIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvamF2YS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZmxhdGJ1ZmZlcnMvUmVhZFdyaXRlQnVmLmphdmEKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHRoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL2phdmEvY29tL2dvb2dsZS9mbGF0YnVmZmVycy9SZWFkV3JpdGVCdWYuamF2YQpyZW5hbWUgdG8gdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvamF2YS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZmxhdGJ1ZmZlcnMvUmVhZFdyaXRlQnVmLmphdmEKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL2phdmEvY29tL2dvb2dsZS9mbGF0YnVmZmVycy9TaG9ydFZlY3Rvci5qYXZhIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvamF2YS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZmxhdGJ1ZmZlcnMvU2hvcnRWZWN0b3IuamF2YQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvamF2YS9jb20vZ29vZ2xlL2ZsYXRidWZmZXJzL1Nob3J0VmVjdG9yLmphdmEKcmVuYW1lIHRvIHRoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL2phdmEvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2ZsYXRidWZmZXJzL1Nob3J0VmVjdG9yLmphdmEKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL2phdmEvY29tL2dvb2dsZS9mbGF0YnVmZmVycy9TdHJpbmdWZWN0b3IuamF2YSBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL2phdmEvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2ZsYXRidWZmZXJzL1N0cmluZ1ZlY3Rvci5qYXZhCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSB0aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy9qYXZhL2NvbS9nb29nbGUvZmxhdGJ1ZmZlcnMvU3RyaW5nVmVjdG9yLmphdmEKcmVuYW1lIHRvIHRoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL2phdmEvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2ZsYXRidWZmZXJzL1N0cmluZ1ZlY3Rvci5qYXZhCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy9qYXZhL2NvbS9nb29nbGUvZmxhdGJ1ZmZlcnMvU3RydWN0LmphdmEgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy9qYXZhL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9mbGF0YnVmZmVycy9TdHJ1Y3QuamF2YQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvamF2YS9jb20vZ29vZ2xlL2ZsYXRidWZmZXJzL1N0cnVjdC5qYXZhCnJlbmFtZSB0byB0aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy9qYXZhL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9mbGF0YnVmZmVycy9TdHJ1Y3QuamF2YQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvamF2YS9jb20vZ29vZ2xlL2ZsYXRidWZmZXJzL1RhYmxlLmphdmEgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy9qYXZhL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9mbGF0YnVmZmVycy9UYWJsZS5qYXZhCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSB0aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy9qYXZhL2NvbS9nb29nbGUvZmxhdGJ1ZmZlcnMvVGFibGUuamF2YQpyZW5hbWUgdG8gdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvamF2YS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZmxhdGJ1ZmZlcnMvVGFibGUuamF2YQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvamF2YS9jb20vZ29vZ2xlL2ZsYXRidWZmZXJzL1VuaW9uVmVjdG9yLmphdmEgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy9qYXZhL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9mbGF0YnVmZmVycy9VbmlvblZlY3Rvci5qYXZhCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSB0aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy9qYXZhL2NvbS9nb29nbGUvZmxhdGJ1ZmZlcnMvVW5pb25WZWN0b3IuamF2YQpyZW5hbWUgdG8gdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvamF2YS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZmxhdGJ1ZmZlcnMvVW5pb25WZWN0b3IuamF2YQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvamF2YS9jb20vZ29vZ2xlL2ZsYXRidWZmZXJzL1V0ZjguamF2YSBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL2phdmEvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2ZsYXRidWZmZXJzL1V0ZjguamF2YQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvamF2YS9jb20vZ29vZ2xlL2ZsYXRidWZmZXJzL1V0ZjguamF2YQpyZW5hbWUgdG8gdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvamF2YS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZmxhdGJ1ZmZlcnMvVXRmOC5qYXZhCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy9qYXZhL2NvbS9nb29nbGUvZmxhdGJ1ZmZlcnMvVXRmOE9sZC5qYXZhIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvamF2YS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZmxhdGJ1ZmZlcnMvVXRmOE9sZC5qYXZhCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSB0aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy9qYXZhL2NvbS9nb29nbGUvZmxhdGJ1ZmZlcnMvVXRmOE9sZC5qYXZhCnJlbmFtZSB0byB0aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy9qYXZhL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9mbGF0YnVmZmVycy9VdGY4T2xkLmphdmEKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL2phdmEvY29tL2dvb2dsZS9mbGF0YnVmZmVycy9VdGY4U2FmZS5qYXZhIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvamF2YS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZmxhdGJ1ZmZlcnMvVXRmOFNhZmUuamF2YQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvamF2YS9jb20vZ29vZ2xlL2ZsYXRidWZmZXJzL1V0ZjhTYWZlLmphdmEKcmVuYW1lIHRvIHRoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL2phdmEvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2ZsYXRidWZmZXJzL1V0ZjhTYWZlLmphdmEKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL2phdmEvc3JjL3Rlc3QvamF2YS9EaWN0aW9uYXJ5TG9va3VwIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvamF2YS9zcmMvdGVzdC9qYXZhL0RpY3Rpb25hcnlMb29rdXAKbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uMjMxYmNkOAotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL2phdmEvc3JjL3Rlc3QvamF2YS9EaWN0aW9uYXJ5TG9va3VwCkBAIC0wLDAgKzEgQEAKKy4uLy4uLy4uLy4uL3Rlc3RzL0RpY3Rpb25hcnlMb29rdXAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy9qYXZhL3NyYy90ZXN0L2phdmEvSmF2YVRlc3QuamF2YSBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL2phdmEvc3JjL3Rlc3QvamF2YS9KYXZhVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMzOTJlMDQKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy9qYXZhL3NyYy90ZXN0L2phdmEvSmF2YVRlc3QuamF2YQpAQCAtMCwwICsxLDE1MzMgQEAKKworaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLmZsYXRidWZmZXJzLkNvbnN0YW50cy4qOworaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLmNvbW1vbi50cnV0aC5UcnV0aC5hc3NlcnRUaGF0OworCitpbXBvcnQgRGljdGlvbmFyeUxvb2t1cC4qOworaW1wb3J0IE15R2FtZS5FeGFtcGxlLio7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uaW8uQnl0ZVN0cmVhbXM7CitpbXBvcnQgb3B0aW9uYWxfc2NhbGFycy5TY2FsYXJTdHVmZjsKK2ltcG9ydCBvcHRpb25hbF9zY2FsYXJzLk9wdGlvbmFsQnl0ZTsKK2ltcG9ydCBOYW1lc3BhY2VBLio7CitpbXBvcnQgTmFtZXNwYWNlQS5OYW1lc3BhY2VCLio7CitpbXBvcnQgY29tLmdvb2dsZS5mbGF0YnVmZmVycy5CeXRlQnVmZmVyVXRpbDsKK2ltcG9ydCBjb20uZ29vZ2xlLmZsYXRidWZmZXJzLkJ5dGVWZWN0b3I7CitpbXBvcnQgY29tLmdvb2dsZS5mbGF0YnVmZmVycy5GbGF0QnVmZmVyQnVpbGRlcjsKK2ltcG9ydCBjb20uZ29vZ2xlLmZsYXRidWZmZXJzLkZsZXhCdWZmZXJzOworaW1wb3J0IGNvbS5nb29nbGUuZmxhdGJ1ZmZlcnMuRmxleEJ1ZmZlcnNCdWlsZGVyOworaW1wb3J0IGNvbS5nb29nbGUuZmxhdGJ1ZmZlcnMuU3RyaW5nVmVjdG9yOworaW1wb3J0IGNvbS5nb29nbGUuZmxhdGJ1ZmZlcnMuVW5pb25WZWN0b3I7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmZsYXRidWZmZXJzLkZsZXhCdWZmZXJzLkZsZXhCdWZmZXJFeGNlcHRpb247CitpbXBvcnQgY29tLmdvb2dsZS5mbGF0YnVmZmVycy5GbGV4QnVmZmVycy5SZWZlcmVuY2U7CitpbXBvcnQgY29tLmdvb2dsZS5mbGF0YnVmZmVycy5GbGV4QnVmZmVycy5WZWN0b3I7CitpbXBvcnQgY29tLmdvb2dsZS5mbGF0YnVmZmVycy5BcnJheVJlYWRXcml0ZUJ1ZjsKK2ltcG9ydCBjb20uZ29vZ2xlLmZsYXRidWZmZXJzLkZsZXhCdWZmZXJzLktleVZlY3RvcjsKKworaW1wb3J0IGphdmEuaW8uKjsKK2ltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOworaW1wb3J0IGphdmEubmlvLkJ5dGVPcmRlcjsKK2ltcG9ydCBqYXZhLm5pby5jaGFubmVscy5GaWxlQ2hhbm5lbDsKK2ltcG9ydCBqYXZhLm5pby5jaGFyc2V0LlN0YW5kYXJkQ2hhcnNldHM7CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IG9yZy5qdW5pdC5SdWxlOworaW1wb3J0IG9yZy5qdW5pdC5ydWxlcy5UZW1wb3JhcnlGb2xkZXI7CitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOworaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXJzLkpVbml0NDsKKworCisvKgorICogQ29weXJpZ2h0IDIwMTQgR29vZ2xlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitAUnVuV2l0aChKVW5pdDQuY2xhc3MpCitwdWJsaWMgY2xhc3MgSmF2YVRlc3QgeworCisgICAgQFJ1bGUKKyAgICBwdWJsaWMgVGVtcG9yYXJ5Rm9sZGVyIHRlbXBGb2xkZXIgPSBuZXcgVGVtcG9yYXJ5Rm9sZGVyKCk7CisKKyAgICBAb3JnLmp1bml0LlRlc3QKKyAgICBwdWJsaWMgdm9pZCBtYWluVGVzdCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAvLyBGaXJzdCwgbGV0J3MgdGVzdCByZWFkaW5nIGEgRmxhdEJ1ZmZlciBnZW5lcmF0ZWQgYnkgQysrIGNvZGU6CisgICAgICAvLyBUaGlzIGZpbGUgd2FzIGdlbmVyYXRlZCBmcm9tIG1vbnN0ZXJkYXRhX3Rlc3QuanNvbgorICAgICAgYnl0ZVtdIGRhdGEgPSBCeXRlU3RyZWFtcy50b0J5dGVBcnJheSgKKyAgICAgICAgSmF2YVRlc3QuY2xhc3MuZ2V0Q2xhc3NMb2FkZXIoKS5nZXRSZXNvdXJjZUFzU3RyZWFtKCJtb25zdGVyZGF0YV90ZXN0Lm1vbiIpKTsKKworICAgICAgLy8gTm93IHRlc3QgaXQ6CisgICAgICBCeXRlQnVmZmVyIGJiID0gQnl0ZUJ1ZmZlci53cmFwKGRhdGEpOworICAgICAgVGVzdEJ1ZmZlcihiYik7CisgICAgICBUZXN0UGFja1VucGFjayhiYik7CisgICAgfQorCisgICAgQG9yZy5qdW5pdC5UZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEZsYXRCdWZmZXJCdWlsZGVyKCkgeworICAgICAgLy8gV2UgdXNlIGFuIGluaXRpYWwgc2l6ZSBvZiAxIHRvIGV4ZXJjaXNlIHRoZSByZWFsbG9jYXRpb24gYWxnb3JpdGhtLAorICAgICAgLy8gbm9ybWFsbHkgYSBzaXplIGxhcmdlciB0aGFuIHRoZSB0eXBpY2FsIEZsYXRCdWZmZXIgeW91IGdlbmVyYXRlIHdvdWxkIGJlCisgICAgICAvLyBiZXR0ZXIgZm9yIHBlcmZvcm1hbmNlLgorICAgICAgRmxhdEJ1ZmZlckJ1aWxkZXIgZmJiID0gbmV3IEZsYXRCdWZmZXJCdWlsZGVyKDEpOworICAgICAgVGVzdEJ1aWxkZXJCYXNpY3MoZmJiLCB0cnVlKTsKKyAgICAgIFRlc3RCdWlsZGVyQmFzaWNzKGZiYiwgZmFsc2UpOworICAgICAgVGVzdEV4dGVuZGVkQnVmZmVyKGZiYi5kYXRhQnVmZmVyKCkuYXNSZWFkT25seUJ1ZmZlcigpKTsKKyAgICB9CisKKyAgICBAb3JnLmp1bml0LlRlc3QKKyAgICBwdWJsaWMgdm9pZCBUZXN0RW51bXMoKSB7CisgICAgICBhc3NlcnRUaGF0KENvbG9yLm5hbWUoQ29sb3IuUmVkKSkuaXNFcXVhbFRvKCJSZWQiKTsKKyAgICAgIGFzc2VydFRoYXQoQ29sb3IubmFtZShDb2xvci5CbHVlKSkuaXNFcXVhbFRvKCJCbHVlIik7CisgICAgICBhc3NlcnRUaGF0KEFueS5uYW1lKEFueS5OT05FKSkuaXNFcXVhbFRvKCJOT05FIik7CisgICAgICBhc3NlcnRUaGF0KEFueS5uYW1lKEFueS5Nb25zdGVyKSkuaXNFcXVhbFRvKCJNb25zdGVyIik7CisgICAgfQorCisgICAgc3RhdGljIHZvaWQgVGVzdEJ1ZmZlcihCeXRlQnVmZmVyIGJiKSB7CisgICAgICBhc3NlcnRUaGF0KE1vbnN0ZXIuTW9uc3RlckJ1ZmZlckhhc0lkZW50aWZpZXIoYmIpKS5pc0VxdWFsVG8odHJ1ZSk7CisKKyAgICAgIE1vbnN0ZXIgbW9uc3RlciA9IE1vbnN0ZXIuZ2V0Um9vdEFzTW9uc3RlcihiYik7CisKKyAgICAgIGFzc2VydFRoYXQobW9uc3Rlci5ocCgpKS5pc0VxdWFsVG8oKHNob3J0KSA4MCk7CisgICAgICAvLyBkZWZhdWx0CisgICAgICBhc3NlcnRUaGF0KG1vbnN0ZXIubWFuYSgpKS5pc0VxdWFsVG8oKHNob3J0KSAxNTApOworCisgICAgICBhc3NlcnRUaGF0KG1vbnN0ZXIubmFtZSgpKS5pc0VxdWFsVG8oIk15TW9uc3RlciIpOworICAgICAgLy8gbW9uc3Rlci5mcmllbmRseSgpIC8vIGNhbid0IGFjY2VzcywgZGVwcmVjYXRlZAorCisgICAgICAgIFZlYzMgcG9zID0gbW9uc3Rlci5wb3MoKTsKKyAgICAgIGFzc2VydFRoYXQocG9zLngoKSkuaXNFcXVhbFRvKDEuMGYpOworICAgICAgYXNzZXJ0VGhhdChwb3MueSgpKS5pc0VxdWFsVG8oMi4wZik7CisgICAgICBhc3NlcnRUaGF0KHBvcy56KCkpLmlzRXF1YWxUbygzLjBmKTsKKyAgICAgIGFzc2VydFRoYXQocG9zLnRlc3QxKCkpLmlzRXF1YWxUbygzLjApOworICAgICAgLy8gaXNzdWU6IGludCAhPSBieXRlCisgICAgICBhc3NlcnRUaGF0KHBvcy50ZXN0MigpKS5pc0VxdWFsVG8oKGludCkgQ29sb3IuR3JlZW4pOworICAgICAgVGVzdCB0ID0gcG9zLnRlc3QzKCk7CisgICAgICBhc3NlcnRUaGF0KHQuYSgpKS5pc0VxdWFsVG8oKHNob3J0KSA1KTsKKyAgICAgIGFzc2VydFRoYXQodC5iKCkpLmlzRXF1YWxUbygoYnl0ZSkgNik7CisKKyAgICAgIGFzc2VydFRoYXQobW9uc3Rlci50ZXN0VHlwZSgpKS5pc0VxdWFsVG8oKGJ5dGUpIEFueS5Nb25zdGVyKTsKKyAgICAgIE1vbnN0ZXIgbW9uc3RlcjIgPSBuZXcgTW9uc3RlcigpOworICAgICAgYXNzZXJ0VGhhdChtb25zdGVyLnRlc3QobW9uc3RlcjIpICE9IG51bGwpLmlzVHJ1ZSgpOworICAgICAgYXNzZXJ0VGhhdChtb25zdGVyMi5uYW1lKCkpLmlzRXF1YWxUbygiRnJlZCIpOworCisgICAgICBhc3NlcnRUaGF0KG1vbnN0ZXIuaW52ZW50b3J5TGVuZ3RoKCkpLmlzRXF1YWxUbyg1KTsKKyAgICAgIGludCBpbnZzdW0gPSAwOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1vbnN0ZXIuaW52ZW50b3J5TGVuZ3RoKCk7IGkrKykKKyAgICAgICAgICAgIGludnN1bSArPSBtb25zdGVyLmludmVudG9yeShpKTsKKyAgICAgIGFzc2VydFRoYXQoaW52c3VtKS5pc0VxdWFsVG8oMTApOworCisgICAgICAvLyBNZXRob2QgdXNpbmcgYSB2ZWN0b3IgYWNjZXNzIG9iamVjdDoKKyAgICAgICAgQnl0ZVZlY3RvciBpbnZlbnRvcnlWZWN0b3IgPSBtb25zdGVyLmludmVudG9yeVZlY3RvcigpOworICAgICAgYXNzZXJ0VGhhdChpbnZlbnRvcnlWZWN0b3IubGVuZ3RoKCkpLmlzRXF1YWxUbyg1KTsKKyAgICAgIGludnN1bSA9IDA7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaW52ZW50b3J5VmVjdG9yLmxlbmd0aCgpOyBpKyspCisgICAgICAgICAgICBpbnZzdW0gKz0gaW52ZW50b3J5VmVjdG9yLmdldEFzVW5zaWduZWQoaSk7CisgICAgICBhc3NlcnRUaGF0KGludnN1bSkuaXNFcXVhbFRvKDEwKTsKKworICAgICAgLy8gQWx0ZXJuYXRpdmUgd2F5IG9mIGFjY2Vzc2luZyBhIHZlY3RvcjoKKyAgICAgICAgQnl0ZUJ1ZmZlciBpYmIgPSBtb25zdGVyLmludmVudG9yeUFzQnl0ZUJ1ZmZlcigpOworICAgICAgICBpbnZzdW0gPSAwOworICAgICAgICB3aGlsZSAoaWJiLnBvc2l0aW9uKCkgPCBpYmIubGltaXQoKSkKKyAgICAgICAgICAgIGludnN1bSArPSBpYmIuZ2V0KCk7CisgICAgICBhc3NlcnRUaGF0KGludnN1bSkuaXNFcXVhbFRvKDEwKTsKKworICAgICAgVGVzdCB0ZXN0XzAgPSBtb25zdGVyLnRlc3Q0KDApOworICAgICAgICBUZXN0IHRlc3RfMSA9IG1vbnN0ZXIudGVzdDQoMSk7CisgICAgICBhc3NlcnRUaGF0KG1vbnN0ZXIudGVzdDRMZW5ndGgoKSkuaXNFcXVhbFRvKDIpOworICAgICAgYXNzZXJ0VGhhdCh0ZXN0XzAuYSgpICsgdGVzdF8wLmIoKSArIHRlc3RfMS5hKCkgKyB0ZXN0XzEuYigpKS5pc0VxdWFsVG8oKEludGVnZXIpIDEwMCk7CisKKyAgICAgIFRlc3QuVmVjdG9yIHRlc3Q0VmVjdG9yID0gbW9uc3Rlci50ZXN0NFZlY3RvcigpOworICAgICAgICB0ZXN0XzAgPSB0ZXN0NFZlY3Rvci5nZXQoMCk7CisgICAgICAgIHRlc3RfMSA9IHRlc3Q0VmVjdG9yLmdldCgxKTsKKyAgICAgIGFzc2VydFRoYXQodGVzdDRWZWN0b3IubGVuZ3RoKCkpLmlzRXF1YWxUbygyKTsKKyAgICAgIGFzc2VydFRoYXQodGVzdF8wLmEoKSArIHRlc3RfMC5iKCkgKyB0ZXN0XzEuYSgpICsgdGVzdF8xLmIoKSkuaXNFcXVhbFRvKChJbnRlZ2VyKSAxMDApOworCisgICAgICBhc3NlcnRUaGF0KG1vbnN0ZXIudGVzdGFycmF5b2ZzdHJpbmdMZW5ndGgoKSkuaXNFcXVhbFRvKDIpOworICAgICAgYXNzZXJ0VGhhdChtb25zdGVyLnRlc3RhcnJheW9mc3RyaW5nKDApKS5pc0VxdWFsVG8oInRlc3QxIik7CisgICAgICBhc3NlcnRUaGF0KG1vbnN0ZXIudGVzdGFycmF5b2ZzdHJpbmcoMSkpLmlzRXF1YWxUbygidGVzdDIiKTsKKworICAgICAgLy8gTWV0aG9kIHVzaW5nIGEgdmVjdG9yIGFjY2VzcyBvYmplY3Q6CisgICAgICAgIFN0cmluZ1ZlY3RvciB0ZXN0YXJyYXlvZnN0cmluZ1ZlY3RvciA9IG1vbnN0ZXIudGVzdGFycmF5b2ZzdHJpbmdWZWN0b3IoKTsKKyAgICAgIGFzc2VydFRoYXQodGVzdGFycmF5b2ZzdHJpbmdWZWN0b3IubGVuZ3RoKCkpLmlzRXF1YWxUbygyKTsKKyAgICAgIGFzc2VydFRoYXQodGVzdGFycmF5b2ZzdHJpbmdWZWN0b3IuZ2V0KDApKS5pc0VxdWFsVG8oInRlc3QxIik7CisgICAgICBhc3NlcnRUaGF0KHRlc3RhcnJheW9mc3RyaW5nVmVjdG9yLmdldCgxKSkuaXNFcXVhbFRvKCJ0ZXN0MiIpOworCisgICAgICBhc3NlcnRUaGF0KG1vbnN0ZXIudGVzdGJvb2woKSkuaXNFcXVhbFRvKHRydWUpOworICAgIH0KKworICAgIC8vIHRoaXMgbWV0aG9kIGNoZWNrcyBhZGRpdGlvbmFsIGZpZWxkcyBub3QgcHJlc2VudCBpbiB0aGUgYmluYXJ5IGJ1ZmZlciByZWFkIGZyb20gZmlsZQorICAgIC8vIHRoZXNlIG5ldyB0ZXN0cyBhcmUgcGVyZm9ybWVkIG9uIHRvcCBvZiB0aGUgcmVndWxhciB0ZXN0cworICAgIHN0YXRpYyB2b2lkIFRlc3RFeHRlbmRlZEJ1ZmZlcihCeXRlQnVmZmVyIGJiKSB7CisgICAgICAgIFRlc3RCdWZmZXIoYmIpOworCisgICAgICAgIE1vbnN0ZXIgbW9uc3RlciA9IE1vbnN0ZXIuZ2V0Um9vdEFzTW9uc3RlcihiYik7CisKKyAgICAgIGFzc2VydFRoYXQobW9uc3Rlci50ZXN0aGFzaHUzMkZudjEoKSkuaXNFcXVhbFRvKChJbnRlZ2VyLk1BWF9WQUxVRSArIDFMKSk7CisgICAgfQorCisKKyAgICBAb3JnLmp1bml0LlRlc3QgcHVibGljIHZvaWQgVGVzdE5hbWVzcGFjZU5lc3RpbmcoKSB7CisgICAgICAgIC8vIHJlZmVyZW5jZSAvIG1hbmlwdWxhdGUgdGhlc2UgdG8gdmVyaWZ5IGNvbXBpbGF0aW9uCisgICAgICAgIEZsYXRCdWZmZXJCdWlsZGVyIGZiYiA9IG5ldyBGbGF0QnVmZmVyQnVpbGRlcigxKTsKKworICAgICAgICBUYWJsZUluTmVzdGVkTlMuc3RhcnRUYWJsZUluTmVzdGVkTlMoZmJiKTsKKyAgICAgICAgVGFibGVJbk5lc3RlZE5TLmFkZEZvbyhmYmIsIDEyMzQpOworICAgICAgICBpbnQgbmVzdGVkVGFibGVPZmYgPSBUYWJsZUluTmVzdGVkTlMuZW5kVGFibGVJbk5lc3RlZE5TKGZiYik7CisKKyAgICAgICAgVGFibGVJbkZpcnN0TlMuc3RhcnRUYWJsZUluRmlyc3ROUyhmYmIpOworICAgICAgICBUYWJsZUluRmlyc3ROUy5hZGRGb29UYWJsZShmYmIsIG5lc3RlZFRhYmxlT2ZmKTsKKyAgICAgICAgaW50IG9mZiA9IFRhYmxlSW5GaXJzdE5TLmVuZFRhYmxlSW5GaXJzdE5TKGZiYik7CisgICAgfQorCisgICAgQG9yZy5qdW5pdC5UZXN0IHB1YmxpYyB2b2lkIFRlc3ROZXN0ZWRGbGF0QnVmZmVyKCkgeworICAgICAgICBmaW5hbCBTdHJpbmcgbmVzdGVkTW9uc3Rlck5hbWUgPSAiTmVzdGVkTW9uc3Rlck5hbWUiOworICAgICAgICBmaW5hbCBzaG9ydCBuZXN0ZWRNb25zdGVySHAgPSA2MDA7CisgICAgICAgIGZpbmFsIHNob3J0IG5lc3RlZE1vbnN0ZXJNYW5hID0gMTAyNDsKKworICAgICAgICBGbGF0QnVmZmVyQnVpbGRlciBmYmIxID0gbmV3IEZsYXRCdWZmZXJCdWlsZGVyKDE2KTsKKyAgICAgICAgaW50IHN0cjEgPSBmYmIxLmNyZWF0ZVN0cmluZyhuZXN0ZWRNb25zdGVyTmFtZSk7CisgICAgICAgIE1vbnN0ZXIuc3RhcnRNb25zdGVyKGZiYjEpOworICAgICAgICBNb25zdGVyLmFkZE5hbWUoZmJiMSwgc3RyMSk7CisgICAgICAgIE1vbnN0ZXIuYWRkSHAoZmJiMSwgbmVzdGVkTW9uc3RlckhwKTsKKyAgICAgICAgTW9uc3Rlci5hZGRNYW5hKGZiYjEsIG5lc3RlZE1vbnN0ZXJNYW5hKTsKKyAgICAgICAgaW50IG1vbnN0ZXIxID0gTW9uc3Rlci5lbmRNb25zdGVyKGZiYjEpOworICAgICAgICBNb25zdGVyLmZpbmlzaE1vbnN0ZXJCdWZmZXIoZmJiMSwgbW9uc3RlcjEpOworICAgICAgICBieXRlW10gZmJiMUJ5dGVzID0gZmJiMS5zaXplZEJ5dGVBcnJheSgpOworICAgICAgICBmYmIxID0gbnVsbDsKKworICAgICAgICBGbGF0QnVmZmVyQnVpbGRlciBmYmIyID0gbmV3IEZsYXRCdWZmZXJCdWlsZGVyKDE2KTsKKyAgICAgICAgaW50IHN0cjIgPSBmYmIyLmNyZWF0ZVN0cmluZygiTXkgTW9uc3RlciIpOworICAgICAgICBpbnQgbmVzdGVkQnVmZmVyID0gTW9uc3Rlci5jcmVhdGVUZXN0bmVzdGVkZmxhdGJ1ZmZlclZlY3RvcihmYmIyLCBmYmIxQnl0ZXMpOworICAgICAgICBNb25zdGVyLnN0YXJ0TW9uc3RlcihmYmIyKTsKKyAgICAgICAgTW9uc3Rlci5hZGROYW1lKGZiYjIsIHN0cjIpOworICAgICAgICBNb25zdGVyLmFkZEhwKGZiYjIsIChzaG9ydCk1MCk7CisgICAgICAgIE1vbnN0ZXIuYWRkTWFuYShmYmIyLCAoc2hvcnQpMzIpOworICAgICAgICBNb25zdGVyLmFkZFRlc3RuZXN0ZWRmbGF0YnVmZmVyKGZiYjIsIG5lc3RlZEJ1ZmZlcik7CisgICAgICAgIGludCBtb25zdGVyID0gTW9uc3Rlci5lbmRNb25zdGVyKGZiYjIpOworICAgICAgICBNb25zdGVyLmZpbmlzaE1vbnN0ZXJCdWZmZXIoZmJiMiwgbW9uc3Rlcik7CisKKyAgICAgICAgLy8gTm93IHRlc3QgdGhlIGRhdGEgZXh0cmFjdGVkIGZyb20gdGhlIG5lc3RlZCBidWZmZXIKKyAgICAgICAgTW9uc3RlciBtb25zID0gTW9uc3Rlci5nZXRSb290QXNNb25zdGVyKGZiYjIuZGF0YUJ1ZmZlcigpKTsKKyAgICAgICAgTW9uc3RlciBuZXN0ZWRNb25zdGVyID0gbW9ucy50ZXN0bmVzdGVkZmxhdGJ1ZmZlckFzTW9uc3RlcigpOworCisgICAgICBhc3NlcnRUaGF0KG5lc3RlZE1vbnN0ZXJNYW5hKS5pc0VxdWFsVG8obmVzdGVkTW9uc3Rlci5tYW5hKCkpOworICAgICAgYXNzZXJ0VGhhdChuZXN0ZWRNb25zdGVySHApLmlzRXF1YWxUbyhuZXN0ZWRNb25zdGVyLmhwKCkpOworICAgICAgYXNzZXJ0VGhhdChuZXN0ZWRNb25zdGVyTmFtZSkuaXNFcXVhbFRvKG5lc3RlZE1vbnN0ZXIubmFtZSgpKTsKKyAgICB9CisKKyAgICBAb3JnLmp1bml0LlRlc3QgcHVibGljIHZvaWQgVGVzdENyZWF0ZUJ5dGVWZWN0b3IoKSB7CisgICAgICAgIEZsYXRCdWZmZXJCdWlsZGVyIGZiYiA9IG5ldyBGbGF0QnVmZmVyQnVpbGRlcigxNik7CisgICAgICAgIGludCBzdHIgPSBmYmIuY3JlYXRlU3RyaW5nKCJNeU1vbnN0ZXIiKTsKKyAgICAgICAgYnl0ZVtdIGludmVudG9yeSA9IG5ldyBieXRlW10geyAwLCAxLCAyLCAzLCA0IH07CisgICAgICAgIGludCB2ZWMgPSBmYmIuY3JlYXRlQnl0ZVZlY3RvcihpbnZlbnRvcnkpOworICAgICAgICBNb25zdGVyLnN0YXJ0TW9uc3RlcihmYmIpOworICAgICAgICBNb25zdGVyLmFkZEludmVudG9yeShmYmIsIHZlYyk7CisgICAgICAgIE1vbnN0ZXIuYWRkTmFtZShmYmIsIHN0cik7CisgICAgICAgIGludCBtb25zdGVyMSA9IE1vbnN0ZXIuZW5kTW9uc3RlcihmYmIpOworICAgICAgICBNb25zdGVyLmZpbmlzaE1vbnN0ZXJCdWZmZXIoZmJiLCBtb25zdGVyMSk7CisgICAgICAgIE1vbnN0ZXIgbW9uc3Rlck9iamVjdCA9IE1vbnN0ZXIuZ2V0Um9vdEFzTW9uc3RlcihmYmIuZGF0YUJ1ZmZlcigpKTsKKworICAgICAgYXNzZXJ0VGhhdCgoSW50ZWdlcikgbW9uc3Rlck9iamVjdC5pbnZlbnRvcnkoMSkpLmlzRXF1YWxUbygoaW50KWludmVudG9yeVsxXSk7CisgICAgICBhc3NlcnRUaGF0KG1vbnN0ZXJPYmplY3QuaW52ZW50b3J5TGVuZ3RoKCkpLmlzRXF1YWxUbyhpbnZlbnRvcnkubGVuZ3RoKTsKKyAgICAgIEJ5dGVWZWN0b3IgaW52ZW50b3J5VmVjdG9yID0gbW9uc3Rlck9iamVjdC5pbnZlbnRvcnlWZWN0b3IoKTsKKyAgICAgIGFzc2VydFRoYXQoaW52ZW50b3J5VmVjdG9yLmdldEFzVW5zaWduZWQoMSkpLmlzRXF1YWxUbygoaW50KWludmVudG9yeVsxXSk7CisgICAgICBhc3NlcnRUaGF0KGludmVudG9yeVZlY3Rvci5sZW5ndGgoKSkuaXNFcXVhbFRvKGludmVudG9yeS5sZW5ndGgpOworCisgICAgICBhc3NlcnRUaGF0KEJ5dGVCdWZmZXIud3JhcChpbnZlbnRvcnkpKS5pc0VxdWFsVG8oCisgICAgICAgIG1vbnN0ZXJPYmplY3QuaW52ZW50b3J5QXNCeXRlQnVmZmVyKCkpOworICAgIH0KKworICAgIEBvcmcuanVuaXQuVGVzdCBwdWJsaWMgdm9pZCBUZXN0Q3JlYXRlVW5pbml0aWFsaXplZFZlY3RvcigpIHsKKyAgICAgICAgRmxhdEJ1ZmZlckJ1aWxkZXIgZmJiID0gbmV3IEZsYXRCdWZmZXJCdWlsZGVyKDE2KTsKKyAgICAgICAgaW50IHN0ciA9IGZiYi5jcmVhdGVTdHJpbmcoIk15TW9uc3RlciIpOworICAgICAgICBieXRlW10gaW52ZW50b3J5ID0gbmV3IGJ5dGVbXSB7IDAsIDEsIDIsIDMsIDQgfTsKKyAgICAgICAgQnl0ZUJ1ZmZlciBiYiA9IGZiYi5jcmVhdGVVbmludGlhbGl6ZWRWZWN0b3IoMSwgaW52ZW50b3J5Lmxlbmd0aCwgMSk7CisgICAgICAgIGZvciAoYnl0ZSBpOmludmVudG9yeSkgeworICAgICAgICAgICAgYmIucHV0KGkpOworICAgICAgICB9CisgICAgICAgIGludCB2ZWMgPSBmYmIuZW5kVmVjdG9yKCk7CisgICAgICAgIE1vbnN0ZXIuc3RhcnRNb25zdGVyKGZiYik7CisgICAgICAgIE1vbnN0ZXIuYWRkSW52ZW50b3J5KGZiYiwgdmVjKTsKKyAgICAgICAgTW9uc3Rlci5hZGROYW1lKGZiYiwgc3RyKTsKKyAgICAgICAgaW50IG1vbnN0ZXIxID0gTW9uc3Rlci5lbmRNb25zdGVyKGZiYik7CisgICAgICAgIE1vbnN0ZXIuZmluaXNoTW9uc3RlckJ1ZmZlcihmYmIsIG1vbnN0ZXIxKTsKKyAgICAgICAgTW9uc3RlciBtb25zdGVyT2JqZWN0ID0gTW9uc3Rlci5nZXRSb290QXNNb25zdGVyKGZiYi5kYXRhQnVmZmVyKCkpOworCisgICAgICBhc3NlcnRUaGF0KChJbnRlZ2VyKSBtb25zdGVyT2JqZWN0LmludmVudG9yeSgxKSkuaXNFcXVhbFRvKChpbnQpaW52ZW50b3J5WzFdKTsKKyAgICAgIGFzc2VydFRoYXQobW9uc3Rlck9iamVjdC5pbnZlbnRvcnlMZW5ndGgoKSkuaXNFcXVhbFRvKGludmVudG9yeS5sZW5ndGgpOworICAgICAgQnl0ZVZlY3RvciBpbnZlbnRvcnlWZWN0b3IgPSBtb25zdGVyT2JqZWN0LmludmVudG9yeVZlY3RvcigpOworICAgICAgYXNzZXJ0VGhhdChpbnZlbnRvcnlWZWN0b3IuZ2V0QXNVbnNpZ25lZCgxKSkuaXNFcXVhbFRvKChpbnQpaW52ZW50b3J5WzFdKTsKKyAgICAgIGFzc2VydFRoYXQoaW52ZW50b3J5VmVjdG9yLmxlbmd0aCgpKS5pc0VxdWFsVG8oaW52ZW50b3J5Lmxlbmd0aCk7CisgICAgICBhc3NlcnRUaGF0KEJ5dGVCdWZmZXIud3JhcChpbnZlbnRvcnkpKS5pc0VxdWFsVG8oCisgICAgICAgIG1vbnN0ZXJPYmplY3QuaW52ZW50b3J5QXNCeXRlQnVmZmVyKCkpOworICAgIH0KKworICAgIEBvcmcuanVuaXQuVGVzdCBwdWJsaWMgdm9pZCBUZXN0Qnl0ZUJ1ZmZlckZhY3RvcnkoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgRmlsZSBmaWxlID0gdGVtcEZvbGRlci5uZXdGaWxlKCJqYXZhdGVzdC5iaW4iKTsKKyAgICAgICAgZmluYWwgY2xhc3MgTWFwcGVkQnl0ZUJ1ZmZlckZhY3RvcnkgZXh0ZW5kcyBGbGF0QnVmZmVyQnVpbGRlci5CeXRlQnVmZmVyRmFjdG9yeSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBCeXRlQnVmZmVyIG5ld0J5dGVCdWZmZXIoaW50IGNhcGFjaXR5KSB7CisgICAgICAgICAgICAgICAgQnl0ZUJ1ZmZlciBiYjsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBSYW5kb21BY2Nlc3NGaWxlIGYgPSBuZXcgUmFuZG9tQWNjZXNzRmlsZShmaWxlLCAicnciKTsKKyAgICAgICAgICAgICAgICAgICAgYmIgPSAgZi5nZXRDaGFubmVsKCkubWFwKEZpbGVDaGFubmVsLk1hcE1vZGUuUkVBRF9XUklURSwgMCwgY2FwYWNpdHkpLm9yZGVyKEJ5dGVPcmRlci5MSVRUTEVfRU5ESUFOKTsKKyAgICAgICAgICAgICAgICAgICAgZi5jbG9zZSgpOworICAgICAgICAgICAgICAgIH0gY2F0Y2goVGhyb3dhYmxlIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJGbGF0QnVmZmVycyB0ZXN0OiBjb3VsZG4ndCBtYXAgQnl0ZUJ1ZmZlciB0byBhIGZpbGUiKTsKKyAgICAgICAgICAgICAgICAgICAgYmIgPSBudWxsOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gYmI7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBGbGF0QnVmZmVyQnVpbGRlciBmYmIgPSBuZXcgRmxhdEJ1ZmZlckJ1aWxkZXIoMSwgbmV3IE1hcHBlZEJ5dGVCdWZmZXJGYWN0b3J5KCkpOworCisgICAgICAgIFRlc3RCdWlsZGVyQmFzaWNzKGZiYiwgZmFsc2UpOworICAgIH0KKworICAgIEBvcmcuanVuaXQuVGVzdCBwdWJsaWMgdm9pZCBUZXN0U2l6ZWRJbnB1dFN0cmVhbSgpIHsKKyAgICAgICAgLy8gVGVzdCBvbiBkZWZhdWx0IEZsYXRCdWZmZXJCdWlsZGVyIHRoYXQgdXNlcyBIZWFwQnl0ZUJ1ZmZlcgorICAgICAgICBGbGF0QnVmZmVyQnVpbGRlciBmYmIgPSBuZXcgRmxhdEJ1ZmZlckJ1aWxkZXIoMSk7CisKKyAgICAgICAgVGVzdEJ1aWxkZXJCYXNpY3MoZmJiLCBmYWxzZSk7CisKKyAgICAgICAgSW5wdXRTdHJlYW0gaW4gPSBmYmIuc2l6ZWRJbnB1dFN0cmVhbSgpOworICAgICAgICBieXRlW10gYXJyYXkgPSBmYmIuc2l6ZWRCeXRlQXJyYXkoKTsKKyAgICAgICAgaW50IGNvdW50ID0gMDsKKyAgICAgICAgaW50IGN1cnJlbnRWYWwgPSAwOworCisgICAgICAgIHdoaWxlIChjdXJyZW50VmFsICE9IC0xICYmIGNvdW50IDwgYXJyYXkubGVuZ3RoKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGN1cnJlbnRWYWwgPSBpbi5yZWFkKCk7CisgICAgICAgICAgICB9IGNhdGNoKGphdmEuaW8uSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRmxhdEJ1ZmZlcnMgdGVzdDogY291bGRuJ3QgcmVhZCBmcm9tIElucHV0U3RyZWFtIik7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgIGFzc2VydFRoYXQoKGJ5dGUpY3VycmVudFZhbCkuaXNFcXVhbFRvKGFycmF5W2NvdW50XSk7CisgICAgICAgICAgY291bnQrKzsKKyAgICAgICAgfQorICAgICAgYXNzZXJ0VGhhdChjb3VudCkuaXNFcXVhbFRvKGFycmF5Lmxlbmd0aCk7CisgICAgfQorCisgICAgdm9pZCBUZXN0QnVpbGRlckJhc2ljcyhGbGF0QnVmZmVyQnVpbGRlciBmYmIsIGJvb2xlYW4gc2l6ZVByZWZpeCkgeworICAgICAgICBpbnRbXSBuYW1lcyA9IHtmYmIuY3JlYXRlU3RyaW5nKCJGcm9kbyIpLCBmYmIuY3JlYXRlU3RyaW5nKCJCYXJuZXkiKSwgZmJiLmNyZWF0ZVN0cmluZygiV2lsbWEiKX07CisgICAgICAgIGludFtdIG9mZiA9IG5ldyBpbnRbM107CisgICAgICAgIE1vbnN0ZXIuc3RhcnRNb25zdGVyKGZiYik7CisgICAgICAgIE1vbnN0ZXIuYWRkTmFtZShmYmIsIG5hbWVzWzBdKTsKKyAgICAgICAgb2ZmWzBdID0gTW9uc3Rlci5lbmRNb25zdGVyKGZiYik7CisgICAgICAgIE1vbnN0ZXIuc3RhcnRNb25zdGVyKGZiYik7CisgICAgICAgIE1vbnN0ZXIuYWRkTmFtZShmYmIsIG5hbWVzWzFdKTsKKyAgICAgICAgb2ZmWzFdID0gTW9uc3Rlci5lbmRNb25zdGVyKGZiYik7CisgICAgICAgIE1vbnN0ZXIuc3RhcnRNb25zdGVyKGZiYik7CisgICAgICAgIE1vbnN0ZXIuYWRkTmFtZShmYmIsIG5hbWVzWzJdKTsKKyAgICAgICAgb2ZmWzJdID0gTW9uc3Rlci5lbmRNb25zdGVyKGZiYik7CisgICAgICAgIGludCBzb3J0TW9ucyA9IGZiYi5jcmVhdGVTb3J0ZWRWZWN0b3JPZlRhYmxlcyhuZXcgTW9uc3RlcigpLCBvZmYpOworCisgICAgICAgIC8vIFdlIHNldCB1cCB0aGUgc2FtZSB2YWx1ZXMgYXMgbW9uc3RlcmRhdGEuanNvbjoKKworICAgICAgICBpbnQgc3RyID0gZmJiLmNyZWF0ZVN0cmluZygiTXlNb25zdGVyIik7CisKKyAgICAgICAgaW50IGludiA9IE1vbnN0ZXIuY3JlYXRlSW52ZW50b3J5VmVjdG9yKGZiYiwgbmV3IGJ5dGVbXSB7IDAsIDEsIDIsIDMsIDQgfSk7CisKKyAgICAgICAgaW50IGZyZWQgPSBmYmIuY3JlYXRlU3RyaW5nKCJGcmVkIik7CisgICAgICAgIE1vbnN0ZXIuc3RhcnRNb25zdGVyKGZiYik7CisgICAgICAgIE1vbnN0ZXIuYWRkTmFtZShmYmIsIGZyZWQpOworICAgICAgICBpbnQgbW9uMiA9IE1vbnN0ZXIuZW5kTW9uc3RlcihmYmIpOworCisgICAgICAgIE1vbnN0ZXIuc3RhcnRUZXN0NFZlY3RvcihmYmIsIDIpOworICAgICAgICBUZXN0LmNyZWF0ZVRlc3QoZmJiLCAoc2hvcnQpMTAsIChieXRlKTIwKTsKKyAgICAgICAgVGVzdC5jcmVhdGVUZXN0KGZiYiwgKHNob3J0KTMwLCAoYnl0ZSk0MCk7CisgICAgICAgIGludCB0ZXN0NCA9IGZiYi5lbmRWZWN0b3IoKTsKKworICAgICAgICBpbnQgdGVzdEFycmF5T2ZTdHJpbmcgPSBNb25zdGVyLmNyZWF0ZVRlc3RhcnJheW9mc3RyaW5nVmVjdG9yKGZiYiwgbmV3IGludFtdIHsKKyAgICAgICAgICAgICAgICBmYmIuY3JlYXRlU3RyaW5nKCJ0ZXN0MSIpLAorICAgICAgICAgICAgICAgIGZiYi5jcmVhdGVTdHJpbmcoInRlc3QyIikKKyAgICAgICAgfSk7CisKKyAgICAgICAgTW9uc3Rlci5zdGFydE1vbnN0ZXIoZmJiKTsKKyAgICAgICAgTW9uc3Rlci5hZGRQb3MoZmJiLCBWZWMzLmNyZWF0ZVZlYzMoZmJiLCAxLjBmLCAyLjBmLCAzLjBmLCAzLjAsCisgICAgICAgICAgICAgICAgQ29sb3IuR3JlZW4sIChzaG9ydCk1LCAoYnl0ZSk2KSk7CisgICAgICAgIE1vbnN0ZXIuYWRkSHAoZmJiLCAoc2hvcnQpODApOworICAgICAgICBNb25zdGVyLmFkZE5hbWUoZmJiLCBzdHIpOworICAgICAgICBNb25zdGVyLmFkZEludmVudG9yeShmYmIsIGludik7CisgICAgICAgIE1vbnN0ZXIuYWRkVGVzdFR5cGUoZmJiLCAoYnl0ZSlBbnkuTW9uc3Rlcik7CisgICAgICAgIE1vbnN0ZXIuYWRkVGVzdChmYmIsIG1vbjIpOworICAgICAgICBNb25zdGVyLmFkZFRlc3Q0KGZiYiwgdGVzdDQpOworICAgICAgICBNb25zdGVyLmFkZFRlc3RhcnJheW9mc3RyaW5nKGZiYiwgdGVzdEFycmF5T2ZTdHJpbmcpOworICAgICAgICBNb25zdGVyLmFkZFRlc3Rib29sKGZiYiwgdHJ1ZSk7CisgICAgICAgIE1vbnN0ZXIuYWRkVGVzdGhhc2h1MzJGbnYxKGZiYiwgSW50ZWdlci5NQVhfVkFMVUUgKyAxTCk7CisgICAgICAgIE1vbnN0ZXIuYWRkVGVzdGFycmF5b2Z0YWJsZXMoZmJiLCBzb3J0TW9ucyk7CisgICAgICAgIGludCBtb24gPSBNb25zdGVyLmVuZE1vbnN0ZXIoZmJiKTsKKworICAgICAgICBpZiAoc2l6ZVByZWZpeCkgeworICAgICAgICAgICAgTW9uc3Rlci5maW5pc2hTaXplUHJlZml4ZWRNb25zdGVyQnVmZmVyKGZiYiwgbW9uKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIE1vbnN0ZXIuZmluaXNoTW9uc3RlckJ1ZmZlcihmYmIsIG1vbik7CisgICAgICAgIH0KKworICAgICAgICAvLyBXcml0ZSB0aGUgcmVzdWx0IHRvIGEgZmlsZSBmb3IgZGVidWdnaW5nIHB1cnBvc2VzOgorICAgICAgICAvLyBOb3RlIHRoYXQgdGhlIGJpbmFyaWVzIGFyZSBub3QgbmVjZXNzYXJpbHkgaWRlbnRpY2FsLCBzaW5jZSB0aGUgSlNPTgorICAgICAgICAvLyBwYXJzZXIgbWF5IHNlcmlhbGl6ZSBpbiBhIHNsaWdodGx5IGRpZmZlcmVudCBvcmRlciB0aGFuIHRoZSBhYm92ZQorICAgICAgICAvLyBKYXZhIGNvZGUuIFRoZXkgYXJlIGZ1bmN0aW9uYWxseSBlcXVpdmFsZW50IHRob3VnaC4KKworICAgICAgICB0cnkgeworICAgICAgICAgICAgU3RyaW5nIGZpbGVuYW1lID0gIm1vbnN0ZXJkYXRhX2phdmFfd2lyZSIgKyAoc2l6ZVByZWZpeCA/ICJfc3AiIDogIiIpICsgIi5tb24iOworICAgICAgICAgICAgRmlsZUNoYW5uZWwgZmMgPSBuZXcgRmlsZU91dHB1dFN0cmVhbSh0ZW1wRm9sZGVyLm5ld0ZpbGUoZmlsZW5hbWUpKS5nZXRDaGFubmVsKCk7CisgICAgICAgICAgICBmYy53cml0ZShmYmIuZGF0YUJ1ZmZlcigpLmR1cGxpY2F0ZSgpKTsKKyAgICAgICAgICAgIGZjLmNsb3NlKCk7CisgICAgICAgIH0gY2F0Y2goamF2YS5pby5JT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkZsYXRCdWZmZXJzIHRlc3Q6IGNvdWxkbid0IHdyaXRlIGZpbGUiKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFRlc3QgaXQ6CisgICAgICAgIEJ5dGVCdWZmZXIgZGF0YUJ1ZmZlciA9IGZiYi5kYXRhQnVmZmVyKCk7CisgICAgICAgIGlmIChzaXplUHJlZml4KSB7CisgICAgICAgICAgYXNzZXJ0VGhhdChCeXRlQnVmZmVyVXRpbC5nZXRTaXplUHJlZml4KGRhdGFCdWZmZXIpICsgU0laRV9QUkVGSVhfTEVOR1RIKS5pc0VxdWFsVG8oCisgICAgICAgICAgICBkYXRhQnVmZmVyLnJlbWFpbmluZygpKTsKKyAgICAgICAgICBkYXRhQnVmZmVyID0gQnl0ZUJ1ZmZlclV0aWwucmVtb3ZlU2l6ZVByZWZpeChkYXRhQnVmZmVyKTsKKyAgICAgICAgfQorICAgICAgICBUZXN0RXh0ZW5kZWRCdWZmZXIoZGF0YUJ1ZmZlcik7CisKKyAgICAgICAgLy8gTWFrZSBzdXJlIGl0IGFsc28gd29ya3Mgd2l0aCByZWFkIG9ubHkgQnl0ZUJ1ZmZlcnMuIFRoaXMgaXMgc2xvd2VyLAorICAgICAgICAvLyBzaW5jZSBjcmVhdGluZyBzdHJpbmdzIGluY3VycyBhbiBhZGRpdGlvbmFsIGNvcHkKKyAgICAgICAgLy8gKHNlZSBUYWJsZS5fX3N0cmluZykuCisgICAgICAgIFRlc3RFeHRlbmRlZEJ1ZmZlcihkYXRhQnVmZmVyLmFzUmVhZE9ubHlCdWZmZXIoKSk7CisKKyAgICAgICAgLy9BdHRlbXB0IHRvIG11dGF0ZSBNb25zdGVyIGZpZWxkcyBhbmQgY2hlY2sgd2hldGhlciB0aGUgYnVmZmVyIGhhcyBiZWVuIG11dGF0ZWQgcHJvcGVybHkKKyAgICAgICAgLy8gcmV2ZXJ0IHRvIG9yaWdpbmFsIHZhbHVlcyBhZnRlciB0ZXN0aW5nCisgICAgICAgIE1vbnN0ZXIgbW9uc3RlciA9IE1vbnN0ZXIuZ2V0Um9vdEFzTW9uc3RlcihkYXRhQnVmZmVyKTsKKworICAgICAgICAvLyBtYW5hIGlzIG9wdGlvbmFsIGFuZCBkb2VzIG5vdCBleGlzdCBpbiB0aGUgYnVmZmVyIHNvIHRoZSBtdXRhdGlvbiBzaG91bGQgZmFpbAorICAgICAgICAvLyB0aGUgbWFuYSBmaWVsZCBzaG91bGQgcmV0YWluIGl0cyBkZWZhdWx0IHZhbHVlCisgICAgICBhc3NlcnRUaGF0KG1vbnN0ZXIubXV0YXRlTWFuYSgoc2hvcnQpMTApKS5pc0ZhbHNlKCk7CisgICAgICBhc3NlcnRUaGF0KG1vbnN0ZXIubWFuYSgpKS5pc0VxdWFsVG8oKHNob3J0KSAxNTApOworCisgICAgICAvLyBBY2Nlc3NpbmcgYSB2ZWN0b3Igb2Ygc29ydGVkIGJ5IHRoZSBrZXkgdGFibGVzCisgICAgICBhc3NlcnRUaGF0KG1vbnN0ZXIudGVzdGFycmF5b2Z0YWJsZXMoMCkubmFtZSgpKS5pc0VxdWFsVG8oIkJhcm5leSIpOworICAgICAgYXNzZXJ0VGhhdChtb25zdGVyLnRlc3RhcnJheW9mdGFibGVzKDEpLm5hbWUoKSkuaXNFcXVhbFRvKCJGcm9kbyIpOworICAgICAgYXNzZXJ0VGhhdChtb25zdGVyLnRlc3RhcnJheW9mdGFibGVzKDIpLm5hbWUoKSkuaXNFcXVhbFRvKCJXaWxtYSIpOworICAgICAgTW9uc3Rlci5WZWN0b3IgdGVzdGFycmF5b2Z0YWJsZXNWZWN0b3IgPSBtb25zdGVyLnRlc3RhcnJheW9mdGFibGVzVmVjdG9yKCk7CisgICAgICBhc3NlcnRUaGF0KHRlc3RhcnJheW9mdGFibGVzVmVjdG9yLmdldCgwKS5uYW1lKCkpLmlzRXF1YWxUbygiQmFybmV5Iik7CisgICAgICBhc3NlcnRUaGF0KHRlc3RhcnJheW9mdGFibGVzVmVjdG9yLmdldCgxKS5uYW1lKCkpLmlzRXF1YWxUbygiRnJvZG8iKTsKKyAgICAgIGFzc2VydFRoYXQodGVzdGFycmF5b2Z0YWJsZXNWZWN0b3IuZ2V0KDIpLm5hbWUoKSkuaXNFcXVhbFRvKCJXaWxtYSIpOworCisgICAgICAvLyBFeGFtcGxlIG9mIHNlYXJjaGluZyBmb3IgYSB0YWJsZSBieSB0aGUga2V5CisgICAgICBhc3NlcnRUaGF0KG1vbnN0ZXIudGVzdGFycmF5b2Z0YWJsZXNCeUtleSgiRnJvZG8iKS5uYW1lKCkpLmlzRXF1YWxUbygiRnJvZG8iKTsKKyAgICAgIGFzc2VydFRoYXQobW9uc3Rlci50ZXN0YXJyYXlvZnRhYmxlc0J5S2V5KCJCYXJuZXkiKS5uYW1lKCkpLmlzRXF1YWxUbygiQmFybmV5Iik7CisgICAgICBhc3NlcnRUaGF0KG1vbnN0ZXIudGVzdGFycmF5b2Z0YWJsZXNCeUtleSgiV2lsbWEiKS5uYW1lKCkpLmlzRXF1YWxUbygiV2lsbWEiKTsKKyAgICAgIGFzc2VydFRoYXQodGVzdGFycmF5b2Z0YWJsZXNWZWN0b3IuZ2V0QnlLZXkoIkZyb2RvIikubmFtZSgpKS5pc0VxdWFsVG8oIkZyb2RvIik7CisgICAgICBhc3NlcnRUaGF0KHRlc3RhcnJheW9mdGFibGVzVmVjdG9yLmdldEJ5S2V5KCJCYXJuZXkiKS5uYW1lKCkpLmlzRXF1YWxUbygiQmFybmV5Iik7CisgICAgICBhc3NlcnRUaGF0KHRlc3RhcnJheW9mdGFibGVzVmVjdG9yLmdldEJ5S2V5KCJXaWxtYSIpLm5hbWUoKSkuaXNFcXVhbFRvKCJXaWxtYSIpOworCisgICAgICAvLyB0ZXN0VHlwZSBpcyBhbiBleGlzdGluZyBmaWVsZCBhbmQgbXV0YXRpbmcgaXQgc2hvdWxkIHN1Y2NlZWQKKyAgICAgIGFzc2VydFRoYXQobW9uc3Rlci50ZXN0VHlwZSgpKS5pc0VxdWFsVG8oKGJ5dGUpIEFueS5Nb25zdGVyKTsKKworICAgICAgLy9tdXRhdGUgdGhlIGludmVudG9yeSB2ZWN0b3IKKyAgICAgIGFzc2VydFRoYXQobW9uc3Rlci5tdXRhdGVJbnZlbnRvcnkoMCwgMSkpLmlzVHJ1ZSgpOworICAgICAgYXNzZXJ0VGhhdChtb25zdGVyLm11dGF0ZUludmVudG9yeSgxLCAyKSkuaXNUcnVlKCk7CisgICAgICBhc3NlcnRUaGF0KG1vbnN0ZXIubXV0YXRlSW52ZW50b3J5KDIsIDMpKS5pc1RydWUoKTsKKyAgICAgIGFzc2VydFRoYXQobW9uc3Rlci5tdXRhdGVJbnZlbnRvcnkoMywgNCkpLmlzVHJ1ZSgpOworICAgICAgYXNzZXJ0VGhhdChtb25zdGVyLm11dGF0ZUludmVudG9yeSg0LCA1KSkuaXNUcnVlKCk7CisKKyAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbW9uc3Rlci5pbnZlbnRvcnlMZW5ndGgoKTsgaSsrKSB7CisgICAgICAgIGFzc2VydFRoYXQoKEludGVnZXIpIG1vbnN0ZXIuaW52ZW50b3J5KGkpKS5pc0VxdWFsVG8oaSArIDEpOworICAgICAgfQorICAgICAgICBCeXRlVmVjdG9yIGludmVudG9yeVZlY3RvciA9ICBtb25zdGVyLmludmVudG9yeVZlY3RvcigpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGludmVudG9yeVZlY3Rvci5sZW5ndGgoKTsgaSsrKSB7CisgICAgICAgICAgYXNzZXJ0VGhhdCgoaW50KWludmVudG9yeVZlY3Rvci5nZXQoaSkpLmlzRXF1YWxUbyhpICsgMSk7CisgICAgICAgIH0KKworICAgICAgICAvL3JldmVyc2UgbXV0YXRpb24KKyAgICAgIGFzc2VydFRoYXQobW9uc3Rlci5tdXRhdGVJbnZlbnRvcnkoMCwgMCkpLmlzVHJ1ZSgpOworICAgICAgYXNzZXJ0VGhhdChtb25zdGVyLm11dGF0ZUludmVudG9yeSgxLCAxKSkuaXNUcnVlKCk7CisgICAgICBhc3NlcnRUaGF0KG1vbnN0ZXIubXV0YXRlSW52ZW50b3J5KDIsIDIpKS5pc1RydWUoKTsKKyAgICAgIGFzc2VydFRoYXQobW9uc3Rlci5tdXRhdGVJbnZlbnRvcnkoMywgMykpLmlzVHJ1ZSgpOworICAgICAgYXNzZXJ0VGhhdChtb25zdGVyLm11dGF0ZUludmVudG9yeSg0LCA0KSkuaXNUcnVlKCk7CisKKyAgICAgIC8vIGdldCBhIHN0cnVjdCBmaWVsZCBhbmQgZWRpdCBvbmUgb2YgaXRzIGZpZWxkcworICAgICAgVmVjMyBwb3MgPSBtb25zdGVyLnBvcygpOworICAgICAgYXNzZXJ0VGhhdChwb3MueCgpKS5pc0VxdWFsVG8oMS4wZik7CisgICAgICBwb3MubXV0YXRlWCg1NS4wZik7CisgICAgICBhc3NlcnRUaGF0KHBvcy54KCkpLmlzRXF1YWxUbyg1NS4wZik7CisgICAgICBwb3MubXV0YXRlWCgxLjBmKTsKKyAgICAgIGFzc2VydFRoYXQocG9zLngoKSkuaXNFcXVhbFRvKDEuMGYpOworICAgIH0KKworICAgIEBvcmcuanVuaXQuVGVzdCBwdWJsaWMgdm9pZCBUZXN0VmVjdG9yT2ZVbmlvbnMoKSB7CisgICAgICAgIGZpbmFsIEZsYXRCdWZmZXJCdWlsZGVyIGZiYiA9IG5ldyBGbGF0QnVmZmVyQnVpbGRlcigpOworCisgICAgICAgIGZpbmFsIGludCBzd29yZEF0dGFja0RhbWFnZSA9IDE7CisKKyAgICAgICAgZmluYWwgaW50W10gY2hhcmFjdGVyVmVjdG9yID0gbmV3IGludFtdIHsKKyAgICAgICAgICAgIEF0dGFja2VyLmNyZWF0ZUF0dGFja2VyKGZiYiwgc3dvcmRBdHRhY2tEYW1hZ2UpLAorICAgICAgICB9OworCisgICAgICAgIGZpbmFsIGJ5dGVbXSBjaGFyYWN0ZXJUeXBlVmVjdG9yID0gbmV3IGJ5dGVbXXsKKyAgICAgICAgICAgIENoYXJhY3Rlci5NdUxhbiwKKyAgICAgICAgfTsKKworICAgICAgICBNb3ZpZS5maW5pc2hNb3ZpZUJ1ZmZlcigKKyAgICAgICAgICAgIGZiYiwKKyAgICAgICAgICAgIE1vdmllLmNyZWF0ZU1vdmllKAorICAgICAgICAgICAgICAgIGZiYiwKKyAgICAgICAgICAgICAgICAoYnl0ZSkwLAorICAgICAgICAgICAgICAgIChieXRlKTAsCisgICAgICAgICAgICAgICAgTW92aWUuY3JlYXRlQ2hhcmFjdGVyc1R5cGVWZWN0b3IoZmJiLCBjaGFyYWN0ZXJUeXBlVmVjdG9yKSwKKyAgICAgICAgICAgICAgICBNb3ZpZS5jcmVhdGVDaGFyYWN0ZXJzVmVjdG9yKGZiYiwgY2hhcmFjdGVyVmVjdG9yKQorICAgICAgICAgICAgKQorICAgICAgICApOworCisgICAgICAgIGZpbmFsIE1vdmllIG1vdmllID0gTW92aWUuZ2V0Um9vdEFzTW92aWUoZmJiLmRhdGFCdWZmZXIoKSk7CisgICAgICAgIEJ5dGVWZWN0b3IgY2hhcmFjdGVyc1R5cGVCeXRlVmVjdG9yID0gbW92aWUuY2hhcmFjdGVyc1R5cGVWZWN0b3IoKTsKKyAgICAgICAgVW5pb25WZWN0b3IgY2hhcmFjdGVyc1ZlY3RvciA9IG1vdmllLmNoYXJhY3RlcnNWZWN0b3IoKTsKKworICAgICAgYXNzZXJ0VGhhdChtb3ZpZS5jaGFyYWN0ZXJzVHlwZUxlbmd0aCgpKS5pc0VxdWFsVG8oY2hhcmFjdGVyVHlwZVZlY3Rvci5sZW5ndGgpOworICAgICAgYXNzZXJ0VGhhdChjaGFyYWN0ZXJzVHlwZUJ5dGVWZWN0b3IubGVuZ3RoKCkpLmlzRXF1YWxUbyhjaGFyYWN0ZXJUeXBlVmVjdG9yLmxlbmd0aCk7CisgICAgICBhc3NlcnRUaGF0KG1vdmllLmNoYXJhY3RlcnNMZW5ndGgoKSkuaXNFcXVhbFRvKGNoYXJhY3RlclZlY3Rvci5sZW5ndGgpOworICAgICAgYXNzZXJ0VGhhdChjaGFyYWN0ZXJzVmVjdG9yLmxlbmd0aCgpKS5pc0VxdWFsVG8oY2hhcmFjdGVyVmVjdG9yLmxlbmd0aCk7CisKKyAgICAgIGFzc2VydFRoYXQoKEJ5dGUpIG1vdmllLmNoYXJhY3RlcnNUeXBlKDApKS5pc0VxdWFsVG8oY2hhcmFjdGVyVHlwZVZlY3RvclswXSk7CisgICAgICBhc3NlcnRUaGF0KGNoYXJhY3RlcnNUeXBlQnl0ZVZlY3Rvci5nZXQoMCkpLmlzRXF1YWxUbyhjaGFyYWN0ZXJUeXBlVmVjdG9yWzBdKTsKKworICAgICAgYXNzZXJ0VGhhdCgoKEF0dGFja2VyKW1vdmllLmNoYXJhY3RlcnMobmV3IEF0dGFja2VyKCksIDApKS5zd29yZEF0dGFja0RhbWFnZSgpKS5pc0VxdWFsVG8oCisgICAgICAgIHN3b3JkQXR0YWNrRGFtYWdlKTsKKyAgICB9CisKKyAgICBAb3JnLmp1bml0LlRlc3QgcHVibGljIHZvaWQgVGVzdEZpeGVkTGVuZ3RoQXJyYXlzKCkgeworICAgICAgICBGbGF0QnVmZmVyQnVpbGRlciBidWlsZGVyID0gbmV3IEZsYXRCdWZmZXJCdWlsZGVyKDApOworCisgICAgICAgIGZsb2F0ICAgICAgIGE7CisgICAgICAgIGludFtdICAgICAgIGIgPSBuZXcgaW50WzE1XTsKKyAgICAgICAgYnl0ZSAgICAgICAgYzsKKyAgICAgICAgaW50W11bXSAgICAgZF9hID0gbmV3IGludFsyXVsyXTsKKyAgICAgICAgYnl0ZVtdICAgICAgZF9iID0gbmV3IGJ5dGVbMl07CisgICAgICAgIGJ5dGVbXVtdICAgIGRfYyA9IG5ldyBieXRlWzJdWzJdOworICAgICAgICBsb25nW11bXSAgICBkX2QgPSBuZXcgbG9uZ1syXVsyXTsKKyAgICAgICAgaW50ICAgICAgICAgZTsKKyAgICAgICAgbG9uZ1tdICAgICAgZiA9IG5ldyBsb25nWzJdOworCisgICAgICAgIGEgPSAwLjVmOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDE1OyBpKyspIGJbaV0gPSBpOworICAgICAgICBjID0gMTsKKyAgICAgICAgZF9hWzBdWzBdID0gMTsKKyAgICAgICAgZF9hWzBdWzFdID0gMjsKKyAgICAgICAgZF9hWzFdWzBdID0gMzsKKyAgICAgICAgZF9hWzFdWzFdID0gNDsKKyAgICAgICAgZF9iWzBdID0gVGVzdEVudW0uQjsKKyAgICAgICAgZF9iWzFdID0gVGVzdEVudW0uQzsKKyAgICAgICAgZF9jWzBdWzBdID0gVGVzdEVudW0uQTsKKyAgICAgICAgZF9jWzBdWzFdID0gVGVzdEVudW0uQjsKKyAgICAgICAgZF9jWzFdWzBdID0gVGVzdEVudW0uQzsKKyAgICAgICAgZF9jWzFdWzFdID0gVGVzdEVudW0uQjsKKyAgICAgICAgZF9kWzBdWzBdID0gLTE7CisgICAgICAgIGRfZFswXVsxXSA9IDE7CisgICAgICAgIGRfZFsxXVswXSA9IC0yOworICAgICAgICBkX2RbMV1bMV0gPSAyOworICAgICAgICBlID0gMjsKKyAgICAgICAgZlswXSA9IC0xOworICAgICAgICBmWzFdID0gMTsKKworICAgICAgICBpbnQgYXJyYXlPZmZzZXQgPSBBcnJheVN0cnVjdC5jcmVhdGVBcnJheVN0cnVjdChidWlsZGVyLAorICAgICAgICAgICAgYSwgYiwgYywgZF9hLCBkX2IsIGRfYywgZF9kLCBlLCBmKTsKKworICAgICAgICAvLyBDcmVhdGUgYSB0YWJsZSB3aXRoIHRoZSBBcnJheVN0cnVjdC4KKyAgICAgICAgQXJyYXlUYWJsZS5zdGFydEFycmF5VGFibGUoYnVpbGRlcik7CisgICAgICAgIEFycmF5VGFibGUuYWRkQShidWlsZGVyLCBhcnJheU9mZnNldCk7CisgICAgICAgIGludCB0YWJsZU9mZnNldCA9IEFycmF5VGFibGUuZW5kQXJyYXlUYWJsZShidWlsZGVyKTsKKworICAgICAgICBBcnJheVRhYmxlLmZpbmlzaEFycmF5VGFibGVCdWZmZXIoYnVpbGRlciwgdGFibGVPZmZzZXQpOworCisgICAgICAgIEFycmF5VGFibGUgdGFibGUgPSBBcnJheVRhYmxlLmdldFJvb3RBc0FycmF5VGFibGUoYnVpbGRlci5kYXRhQnVmZmVyKCkpOworICAgICAgICBOZXN0ZWRTdHJ1Y3QgbmVzdGVkID0gbmV3IE5lc3RlZFN0cnVjdCgpOworCisgICAgICBhc3NlcnRUaGF0KHRhYmxlLmEoKS5hKCkpLmlzRXF1YWxUbygwLjVmKTsKKyAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMTU7IGkrKykKKyAgICAgICAgYXNzZXJ0VGhhdCh0YWJsZS5hKCkuYihpKSkuaXNFcXVhbFRvKGkpOworICAgICAgYXNzZXJ0VGhhdCh0YWJsZS5hKCkuYygpKS5pc0VxdWFsVG8oKGJ5dGUpMSk7CisgICAgICBhc3NlcnRUaGF0KHRhYmxlLmEoKS5kKG5lc3RlZCwgMCkuYSgwKSkuaXNFcXVhbFRvKDEpOworICAgICAgYXNzZXJ0VGhhdCh0YWJsZS5hKCkuZChuZXN0ZWQsIDApLmEoMSkpLmlzRXF1YWxUbygyKTsKKyAgICAgIGFzc2VydFRoYXQodGFibGUuYSgpLmQobmVzdGVkLCAxKS5hKDApKS5pc0VxdWFsVG8oMyk7CisgICAgICBhc3NlcnRUaGF0KHRhYmxlLmEoKS5kKG5lc3RlZCwgMSkuYSgxKSkuaXNFcXVhbFRvKDQpOworICAgICAgYXNzZXJ0VGhhdCh0YWJsZS5hKCkuZChuZXN0ZWQsIDApLmIoKSkuaXNFcXVhbFRvKFRlc3RFbnVtLkIpOworICAgICAgYXNzZXJ0VGhhdCh0YWJsZS5hKCkuZChuZXN0ZWQsIDEpLmIoKSkuaXNFcXVhbFRvKFRlc3RFbnVtLkMpOworICAgICAgYXNzZXJ0VGhhdCh0YWJsZS5hKCkuZChuZXN0ZWQsIDApLmMoMCkpLmlzRXF1YWxUbyhUZXN0RW51bS5BKTsKKyAgICAgIGFzc2VydFRoYXQodGFibGUuYSgpLmQobmVzdGVkLCAwKS5jKDEpKS5pc0VxdWFsVG8oVGVzdEVudW0uQik7CisgICAgICBhc3NlcnRUaGF0KHRhYmxlLmEoKS5kKG5lc3RlZCwgMSkuYygwKSkuaXNFcXVhbFRvKFRlc3RFbnVtLkMpOworICAgICAgYXNzZXJ0VGhhdCh0YWJsZS5hKCkuZChuZXN0ZWQsIDEpLmMoMSkpLmlzRXF1YWxUbyhUZXN0RW51bS5CKTsKKyAgICAgIGFzc2VydFRoYXQodGFibGUuYSgpLmQobmVzdGVkLCAwKS5kKDApKS5pc0VxdWFsVG8oKGxvbmcpLTEpOworICAgICAgYXNzZXJ0VGhhdCh0YWJsZS5hKCkuZChuZXN0ZWQsIDApLmQoMSkpLmlzRXF1YWxUbygobG9uZykxKTsKKyAgICAgIGFzc2VydFRoYXQodGFibGUuYSgpLmQobmVzdGVkLCAxKS5kKDApKS5pc0VxdWFsVG8oKGxvbmcpLTIpOworICAgICAgYXNzZXJ0VGhhdCh0YWJsZS5hKCkuZChuZXN0ZWQsIDEpLmQoMSkpLmlzRXF1YWxUbygobG9uZykyKTsKKyAgICAgIGFzc2VydFRoYXQodGFibGUuYSgpLmUoKSkuaXNFcXVhbFRvKDIpOworICAgICAgYXNzZXJ0VGhhdCh0YWJsZS5hKCkuZigwKSkuaXNFcXVhbFRvKChsb25nKS0xKTsKKyAgICAgIGFzc2VydFRoYXQodGFibGUuYSgpLmYoMSkpLmlzRXF1YWxUbygobG9uZykxKTsKKyAgICB9CisKKyAgICBAb3JnLmp1bml0LlRlc3QgcHVibGljIHZvaWQgdGVzdEZsZXhCdWZmZXJzVGVzdCgpIHsKKyAgICAgICAgRmxleEJ1ZmZlcnNCdWlsZGVyIGJ1aWxkZXIgPSBuZXcgRmxleEJ1ZmZlcnNCdWlsZGVyKEJ5dGVCdWZmZXIuYWxsb2NhdGUoNTEyKSwKKyAgICAgICAgICAgICAgICBGbGV4QnVmZmVyc0J1aWxkZXIuQlVJTERFUl9GTEFHX1NIQVJFX0tFWVNfQU5EX1NUUklOR1MpOworICAgICAgICB0ZXN0RmxleEJ1ZmZlcnNUZXN0KGJ1aWxkZXIpOworICAgICAgICBpbnQgYnVmZmVyTGltaXQxID0gKChBcnJheVJlYWRXcml0ZUJ1ZikgYnVpbGRlci5nZXRCdWZmZXIoKSkubGltaXQoKTsKKworICAgICAgICAvLyBSZXBlYXQgYWZ0ZXIgY2xlYXJpbmcgdGhlIGJ1aWxkZXIgdG8gZW5zdXJlIHRoZSBidWlsZGVyIGlzIHJldXNhYmxlCisgICAgICAgIGJ1aWxkZXIuY2xlYXIoKTsKKyAgICAgICAgdGVzdEZsZXhCdWZmZXJzVGVzdChidWlsZGVyKTsKKyAgICAgICAgaW50IGJ1ZmZlckxpbWl0MiA9ICgoQXJyYXlSZWFkV3JpdGVCdWYpIGJ1aWxkZXIuZ2V0QnVmZmVyKCkpLmxpbWl0KCk7CisgICAgICBhc3NlcnRUaGF0KGJ1ZmZlckxpbWl0MSkuaXNFcXVhbFRvKGJ1ZmZlckxpbWl0Mik7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyB2b2lkIHRlc3RGbGV4QnVmZmVyc1Rlc3QoRmxleEJ1ZmZlcnNCdWlsZGVyIGJ1aWxkZXIpIHsKKyAgICAgICAgLy8gV3JpdGUgdGhlIGVxdWl2YWxlbnQgb2Y6CisgICAgICAgIC8vIHsgdmVjOiBbIC0xMDAsICJGcmVkIiwgNC4wLCBmYWxzZSBdLCBiYXI6IFsgMSwgMiwgMyBdLCBiYXIzOiBbIDEsIDIsIDMgXSwKKyAgICAgICAgLy8gZm9vOiAxMDAsIGJvb2w6IHRydWUsIG15bWFwOiB7IGZvbzogIkZyZWQiIH0gfQorICAgICAgICAvLyBJdCdzIHBvc3NpYmxlIHRvIGRvIHRoaXMgd2l0aG91dCBzdGQ6OmZ1bmN0aW9uIHN1cHBvcnQgYXMgd2VsbC4KKyAgICAgICAgaW50IG1hcDEgPSBidWlsZGVyLnN0YXJ0TWFwKCk7CisKKyAgICAgICAgaW50IHZlYzEgPSBidWlsZGVyLnN0YXJ0VmVjdG9yKCk7CisgICAgICAgIGJ1aWxkZXIucHV0SW50KC0xMDApOworICAgICAgICBidWlsZGVyLnB1dFN0cmluZygiRnJlZCIpOworICAgICAgICBidWlsZGVyLnB1dEJsb2IobmV3IGJ5dGVbXXsoYnl0ZSkgNzd9KTsKKyAgICAgICAgYnVpbGRlci5wdXRCb29sZWFuKGZhbHNlKTsKKyAgICAgICAgYnVpbGRlci5wdXRJbnQoTG9uZy5NQVhfVkFMVUUpOworCisgICAgICAgIGludCBtYXAyID0gYnVpbGRlci5zdGFydE1hcCgpOworICAgICAgICBidWlsZGVyLnB1dEludCgidGVzdCIsIDIwMCk7CisgICAgICAgIGJ1aWxkZXIuZW5kTWFwKG51bGwsIG1hcDIpOworCisgICAgICAgIGJ1aWxkZXIucHV0RmxvYXQoMTUwLjkpOworICAgICAgICBidWlsZGVyLnB1dEZsb2F0KDE1MC45OTk5OTk4KTsKKyAgICAgICAgYnVpbGRlci5lbmRWZWN0b3IoInZlYyIsIHZlYzEsIGZhbHNlLCBmYWxzZSk7CisKKyAgICAgICAgdmVjMSA9IGJ1aWxkZXIuc3RhcnRWZWN0b3IoKTsKKyAgICAgICAgYnVpbGRlci5wdXRJbnQoMSk7CisgICAgICAgIGJ1aWxkZXIucHV0SW50KDIpOworICAgICAgICBidWlsZGVyLnB1dEludCgzKTsKKyAgICAgICAgYnVpbGRlci5lbmRWZWN0b3IoImJhciIsIHZlYzEsIHRydWUsIGZhbHNlKTsKKworICAgICAgICB2ZWMxID0gYnVpbGRlci5zdGFydFZlY3RvcigpOworICAgICAgICBidWlsZGVyLnB1dEJvb2xlYW4odHJ1ZSk7CisgICAgICAgIGJ1aWxkZXIucHV0Qm9vbGVhbihmYWxzZSk7CisgICAgICAgIGJ1aWxkZXIucHV0Qm9vbGVhbih0cnVlKTsKKyAgICAgICAgYnVpbGRlci5wdXRCb29sZWFuKGZhbHNlKTsKKyAgICAgICAgYnVpbGRlci5lbmRWZWN0b3IoImJvb2xzIiwgdmVjMSwgdHJ1ZSwgZmFsc2UpOworCisgICAgICAgIGJ1aWxkZXIucHV0Qm9vbGVhbigiYm9vbCIsIHRydWUpOworICAgICAgICBidWlsZGVyLnB1dEZsb2F0KCJmb28iLCAxMDApOworCisgICAgICAgIG1hcDIgPSBidWlsZGVyLnN0YXJ0TWFwKCk7CisgICAgICAgIGJ1aWxkZXIucHV0U3RyaW5nKCJiYXIiLCAiRnJlZCIpOyAgLy8gVGVzdGluZyBrZXkgYW5kIHN0cmluZyByZXVzZS4KKyAgICAgICAgYnVpbGRlci5wdXRJbnQoImludCIsIC0xMjApOworICAgICAgICBidWlsZGVyLnB1dEZsb2F0KCJmbG9hdCIsIC0xMjMuMGYpOworICAgICAgICBidWlsZGVyLnB1dEJsb2IoImJsb2IiLCBuZXcgYnl0ZVtdeyA2NSwgNjcgfSk7CisgICAgICAgIGJ1aWxkZXIuZW5kTWFwKCJteW1hcCIsIG1hcDIpOworCisgICAgICAgIGJ1aWxkZXIuZW5kTWFwKG51bGwsIG1hcDEpOworICAgICAgICBidWlsZGVyLmZpbmlzaCgpOworCisgICAgICAgIEZsZXhCdWZmZXJzLk1hcCBtID0gRmxleEJ1ZmZlcnMuZ2V0Um9vdChidWlsZGVyLmdldEJ1ZmZlcigpKS5hc01hcCgpOworCisgICAgICBhc3NlcnRUaGF0KG0uc2l6ZSgpKS5pc0VxdWFsVG8oNik7CisKKyAgICAgIC8vIHRlc3QgZW1wdHkgKGFuIG51bGwpCisgICAgICAvLyBlbXB0eSBpZiBmYWlsCisgICAgICBhc3NlcnRUaGF0KG0uZ2V0KCJub19rZXkiKS5hc1N0cmluZygpKS5pc0VxdWFsVG8oIiIpOworICAgICAgLy8gZW1wdHkgaWYgZmFpbAorICAgICAgYXNzZXJ0VGhhdChtLmdldCgibm9fa2V5IikuYXNNYXAoKSkuaXNFcXVhbFRvKEZsZXhCdWZmZXJzLk1hcC5lbXB0eSgpKTsKKyAgICAgIC8vIGVtcHR5IGlmIGZhaWwKKyAgICAgIGFzc2VydFRoYXQobS5nZXQoIm5vX2tleSIpLmFzS2V5KCkpLmlzRXF1YWxUbyhGbGV4QnVmZmVycy5LZXkuZW1wdHkoKSk7CisgICAgICAvLyBlbXB0eSBpZiBmYWlsCisgICAgICBhc3NlcnRUaGF0KG0uZ2V0KCJub19rZXkiKS5hc1ZlY3RvcigpKS5pc0VxdWFsVG8oVmVjdG9yLmVtcHR5KCkpOworICAgICAgLy8gZW1wdHkgaWYgZmFpbAorICAgICAgYXNzZXJ0VGhhdChtLmdldCgibm9fa2V5IikuYXNCbG9iKCkpLmlzRXF1YWxUbyhGbGV4QnVmZmVycy5CbG9iLmVtcHR5KCkpOworICAgICAgYXNzZXJ0KG0uZ2V0KCJub19rZXkiKS5hc1ZlY3RvcigpLmlzRW1wdHkoKSk7IC8vIGVtcHR5IGlmIGZhaWwKKworICAgICAgICAvLyB0ZXN0aW5nICJ2ZWMiIGZpZWxkCisgICAgICAgIEZsZXhCdWZmZXJzLlZlY3RvciB2ZWMgPSBtLmdldCgidmVjIikuYXNWZWN0b3IoKTsKKyAgICAgIGFzc2VydFRoYXQodmVjLnNpemUoKSkuaXNFcXVhbFRvKDgpOworICAgICAgYXNzZXJ0VGhhdCh2ZWMuZ2V0KDApLmFzTG9uZygpKS5pc0VxdWFsVG8oKGxvbmcpIC0xMDApOworICAgICAgYXNzZXJ0VGhhdCh2ZWMuZ2V0KDEpLmFzU3RyaW5nKCkpLmlzRXF1YWxUbygiRnJlZCIpOworICAgICAgYXNzZXJ0VGhhdCh2ZWMuZ2V0KDIpLmlzQmxvYigpKS5pc1RydWUoKTsKKyAgICAgIGFzc2VydFRoYXQodmVjLmdldCgyKS5hc0Jsb2IoKS5zaXplKCkpLmlzRXF1YWxUbygxKTsKKyAgICAgIGFzc2VydFRoYXQodmVjLmdldCgyKS5hc0Jsb2IoKS5kYXRhKCkuZ2V0KDApKS5pc0VxdWFsVG8oKGJ5dGUpIDc3KTsKKyAgICAgIC8vIENoZWNrIGlmIHR5cGUgaXMgYSBib29sCisgICAgICBhc3NlcnRUaGF0KHZlYy5nZXQoMykuaXNCb29sZWFuKCkpLmlzVHJ1ZSgpOworICAgICAgLy8gQ2hlY2sgaWYgdmFsdWUgaXMgZmFsc2UKKyAgICAgIGFzc2VydFRoYXQodmVjLmdldCgzKS5hc0Jvb2xlYW4oKSkuaXNGYWxzZSgpOworICAgICAgYXNzZXJ0VGhhdCh2ZWMuZ2V0KDQpLmFzTG9uZygpKS5pc0VxdWFsVG8oTG9uZy5NQVhfVkFMVUUpOworICAgICAgYXNzZXJ0VGhhdCh2ZWMuZ2V0KDUpLmlzTWFwKCkpLmlzVHJ1ZSgpOworICAgICAgYXNzZXJ0VGhhdCh2ZWMuZ2V0KDUpLmFzTWFwKCkuZ2V0KCJ0ZXN0IikuYXNJbnQoKSkuaXNFcXVhbFRvKDIwMCk7CisgICAgICBhc3NlcnRUaGF0KEZsb2F0LmNvbXBhcmUoKGZsb2F0KXZlYy5nZXQoNikuYXNGbG9hdCgpLCAxNTAuOWYpKS5pc0VxdWFsVG8oMCk7CisgICAgICBhc3NlcnRUaGF0KERvdWJsZS5jb21wYXJlKHZlYy5nZXQoNykuYXNGbG9hdCgpLCAxNTAuOTk5OTk5OCkpLmlzRXF1YWxUbygwKTsKKyAgICAgIC8vY29udmVyc2lvbiBmYWlsIHJldHVybnMgMCBhcyBDKysKKyAgICAgIGFzc2VydFRoYXQoKGxvbmcpMCkuaXNFcXVhbFRvKChsb25nKXZlYy5nZXQoMSkuYXNMb25nKCkpOworCisgICAgICAvLyBiYXIgdmVjdG9yCisgICAgICAgIEZsZXhCdWZmZXJzLlZlY3RvciB0dmVjID0gbS5nZXQoImJhciIpLmFzVmVjdG9yKCk7CisgICAgICBhc3NlcnRUaGF0KHR2ZWMuc2l6ZSgpKS5pc0VxdWFsVG8oMyk7CisgICAgICBhc3NlcnRUaGF0KHR2ZWMuZ2V0KDApLmFzSW50KCkpLmlzRXF1YWxUbygxKTsKKyAgICAgIGFzc2VydFRoYXQodHZlYy5nZXQoMSkuYXNJbnQoKSkuaXNFcXVhbFRvKDIpOworICAgICAgYXNzZXJ0VGhhdCh0dmVjLmdldCgyKS5hc0ludCgpKS5pc0VxdWFsVG8oMyk7CisgICAgICBhc3NlcnRUaGF0KCgoRmxleEJ1ZmZlcnMuVHlwZWRWZWN0b3IpIHR2ZWMpLmdldEVsZW1UeXBlKCkpLmlzRXF1YWxUbyhGbGV4QnVmZmVycy5GQlRfSU5UKTsKKworICAgICAgLy8gYm9vbHMgdmVjdG9yCisgICAgICAgIEZsZXhCdWZmZXJzLlZlY3RvciBidmVjID0gbS5nZXQoImJvb2xzIikuYXNWZWN0b3IoKTsKKyAgICAgIGFzc2VydFRoYXQoYnZlYy5zaXplKCkpLmlzRXF1YWxUbyg0KTsKKyAgICAgIGFzc2VydFRoYXQoYnZlYy5nZXQoMCkuYXNCb29sZWFuKCkpLmlzVHJ1ZSgpOworICAgICAgYXNzZXJ0VGhhdChidmVjLmdldCgxKS5hc0Jvb2xlYW4oKSkuaXNGYWxzZSgpOworICAgICAgYXNzZXJ0VGhhdChidmVjLmdldCgyKS5hc0Jvb2xlYW4oKSkuaXNUcnVlKCk7CisgICAgICBhc3NlcnRUaGF0KGJ2ZWMuZ2V0KDMpLmFzQm9vbGVhbigpKS5pc0ZhbHNlKCk7CisgICAgICBhc3NlcnRUaGF0KCgoRmxleEJ1ZmZlcnMuVHlwZWRWZWN0b3IpIGJ2ZWMpLmdldEVsZW1UeXBlKCkpLmlzRXF1YWxUbyhGbGV4QnVmZmVycy5GQlRfQk9PTCk7CisKKyAgICAgIGFzc2VydFRoYXQoKGZsb2F0KW0uZ2V0KCJmb28iKS5hc0Zsb2F0KCkpLmlzRXF1YWxUbygoZmxvYXQpIDEwMCk7CisgICAgICBhc3NlcnRUaGF0KG0uZ2V0KCJ1bmtub3duIikuaXNOdWxsKCkpLmlzVHJ1ZSgpOworCisgICAgICAvLyBteW1hcCB2ZWN0b3IKKyAgICAgICAgRmxleEJ1ZmZlcnMuTWFwIG15bWFwID0gbS5nZXQoIm15bWFwIikuYXNNYXAoKTsKKyAgICAgIC8vIFRoZXNlIHNob3VsZCBiZSBlcXVhbCBieSBwb2ludGVyIGVxdWFsaXR5LCBzaW5jZSBrZXkgYW5kIHZhbHVlIGFyZSBzaGFyZWQuCisgICAgICBhc3NlcnRUaGF0KG15bWFwLmtleXMoKS5nZXQoMCkpLmlzRXF1YWxUbyhtLmtleXMoKS5nZXQoMCkpOworICAgICAgYXNzZXJ0VGhhdChteW1hcC5rZXlzKCkuZ2V0KDApLnRvU3RyaW5nKCkpLmlzRXF1YWxUbygiYmFyIik7CisgICAgICBhc3NlcnRUaGF0KG15bWFwLnZhbHVlcygpLmdldCgwKS5hc1N0cmluZygpKS5pc0VxdWFsVG8odmVjLmdldCgxKS5hc1N0cmluZygpKTsKKyAgICAgIGFzc2VydFRoYXQobXltYXAuZ2V0KCJpbnQiKS5hc0ludCgpKS5pc0VxdWFsVG8oLTEyMCk7CisgICAgICBhc3NlcnRUaGF0KChmbG9hdClteW1hcC5nZXQoImZsb2F0IikuYXNGbG9hdCgpKS5pc0VxdWFsVG8oLTEyMy4wZik7CisgICAgICBhc3NlcnRUaGF0KEFycmF5cy5lcXVhbHMobXltYXAuZ2V0KCJibG9iIikuYXNCbG9iKCkuZ2V0Qnl0ZXMoKSwgbmV3IGJ5dGVbXXsgNjUsIDY3IH0pKS5pc0VxdWFsVG8oCisgICAgICAgIHRydWUpOworICAgICAgYXNzZXJ0VGhhdChteW1hcC5nZXQoImJsb2IiKS5hc0Jsb2IoKS50b1N0cmluZygpKS5pc0VxdWFsVG8oIkFDIik7CisgICAgICBhc3NlcnRUaGF0KG15bWFwLmdldCgiYmxvYiIpLnRvU3RyaW5nKCkpLmlzRXF1YWxUbygiXCJBQ1wiIik7CisgICAgfQorCisgICAgQG9yZy5qdW5pdC5UZXN0IHB1YmxpYyB2b2lkIHRlc3RGbGV4QnVmZmVyVmVjdG9yU3RyaW5ncygpIHsKKyAgICAgICAgRmxleEJ1ZmZlcnNCdWlsZGVyIGJ1aWxkZXIgPSBuZXcgRmxleEJ1ZmZlcnNCdWlsZGVyKEJ5dGVCdWZmZXIuYWxsb2NhdGUoMTAwMDAwMDApKTsKKworICAgICAgICBpbnQgc2l6ZSA9IDMwMDA7CisgICAgICAgIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgICAgICBmb3IgKGludCBpPTA7IGk8IHNpemU7IGkrKykgeworICAgICAgICAgICAgc2IuYXBwZW5kKCJhIik7CisgICAgICAgIH0KKworICAgICAgICBTdHJpbmcgdGV4dCA9IHNiLnRvU3RyaW5nKCk7CisgICAgICBhc3NlcnRUaGF0KHRleHQubGVuZ3RoKCkpLmlzRXF1YWxUbyhzaXplKTsKKworICAgICAgaW50IHBvcyA9IGJ1aWxkZXIuc3RhcnRWZWN0b3IoKTsKKworICAgICAgICBmb3IgKGludCBpPTA7IGk8c2l6ZTsgaSsrKSB7CisgICAgICAgICAgICBidWlsZGVyLnB1dFN0cmluZyh0ZXh0KTsKKyAgICAgICAgfQorCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBidWlsZGVyLmVuZFZlY3RvcihudWxsLCBwb3MsIHRydWUsIGZhbHNlKTsKKyAgICAgICAgICAgIC8vIHRoaXMgc2hvdWxkIHJhaXNlIGFuIGV4Y2VwdGlvbiBhcworICAgICAgICAgICAgLy8gdHlwZWQgdmVjdG9yIG9mIHN0cmluZyB3YXMgZGVwcmVjYXRlZAorICAgICAgICAgICAgYXNzZXJ0IGZhbHNlOworICAgICAgICB9IGNhdGNoKEZsZXhCdWZmZXJFeGNlcHRpb24gZmIpIHsKKyAgICAgICAgICAgIC8vIG5vIG9wCisgICAgICAgIH0KKyAgICAgICAgLy8gd2UgZmluaXNoIHRoZSB2ZWN0b3IgYWdhaW4gYXMgbm9uLXR5cGVkCisgICAgICAgIGJ1aWxkZXIuZW5kVmVjdG9yKG51bGwsIHBvcywgZmFsc2UsIGZhbHNlKTsKKworICAgICAgICBCeXRlQnVmZmVyIGIgPSBidWlsZGVyLmZpbmlzaCgpOworICAgICAgICBWZWN0b3IgdiA9IEZsZXhCdWZmZXJzLmdldFJvb3QoYikuYXNWZWN0b3IoKTsKKworICAgICAgYXNzZXJ0VGhhdCh2LnNpemUoKSkuaXNFcXVhbFRvKHNpemUpOworICAgICAgZm9yIChpbnQgaT0wOyBpPHNpemU7IGkrKykgeworICAgICAgICBhc3NlcnRUaGF0KHYuZ2V0KGkpLmFzU3RyaW5nKCkubGVuZ3RoKCkpLmlzRXF1YWxUbyhzaXplKTsKKyAgICAgICAgYXNzZXJ0VGhhdCh2LmdldChpKS5hc1N0cmluZygpKS5pc0VxdWFsVG8odGV4dCk7CisgICAgICB9CisgICAgfQorCisgICAgQG9yZy5qdW5pdC5UZXN0IHB1YmxpYyB2b2lkIHRlc3REZXByZWNhdGVkVHlwZWRWZWN0b3JTdHJpbmcoKSB7CisgICAgICAgIC8vIHRlc3RzIHdoZXRoZXIgd2UgYXJlIGFibGUgdG8gc3VwcG9ydCByZWFkaW5nIGRlcHJlY2F0ZWQgdHlwZWQgdmVjdG9yIHN0cmluZworICAgICAgICAvLyBkYXRhIGlzIGVxdWl2YWxlbnQgdG8gWyAiYWJjIiwgImFiYyIsICJhYmMiLCAiYWJjIl0KKyAgICAgICAgYnl0ZVtdIGRhdGEgPSBuZXcgYnl0ZVtdIHsweDAzLCAweDYxLCAweDYyLCAweDYzLCAweDAwLCAweDAzLCAweDYxLCAweDYyLCAweDYzLCAweDAwLAorICAgICAgICAgICAgMHgwMywgMHg2MSwgMHg2MiwgMHg2MywgMHgwMCwgMHgwMywgMHg2MSwgMHg2MiwgMHg2MywgMHgwMCwgMHgwNCwgMHgxNCwgMHgxMCwKKyAgICAgICAgICAgICAweDBjLCAweDA4LCAweDA0LCAweDNjLCAweDAxfTsKKyAgICAgICAgUmVmZXJlbmNlIHJlZiA9IEZsZXhCdWZmZXJzLmdldFJvb3QoQnl0ZUJ1ZmZlci53cmFwKGRhdGEpKTsKKyAgICAgIGFzc2VydFRoYXQocmVmLmdldFR5cGUoKSkuaXNFcXVhbFRvKEZsZXhCdWZmZXJzLkZCVF9WRUNUT1JfU1RSSU5HX0RFUFJFQ0FURUQpOworICAgICAgYXNzZXJ0VGhhdChyZWYuaXNUeXBlZFZlY3RvcigpKS5pc1RydWUoKTsKKyAgICAgIFZlY3RvciB2ZWMgPSByZWYuYXNWZWN0b3IoKTsKKyAgICAgICAgZm9yIChpbnQgaT0wOyBpPCB2ZWMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICBhc3NlcnRUaGF0KCJhYmMiKS5pc0VxdWFsVG8odmVjLmdldChpKS5hc1N0cmluZygpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBvcmcuanVuaXQuVGVzdCBwdWJsaWMgdm9pZCB0ZXN0U2luZ2xlRWxlbWVudEJvb2xlYW4oKSB7CisgICAgICAgIEZsZXhCdWZmZXJzQnVpbGRlciBidWlsZGVyID0gbmV3IEZsZXhCdWZmZXJzQnVpbGRlcihCeXRlQnVmZmVyLmFsbG9jYXRlKDEwMCkpOworICAgICAgICBidWlsZGVyLnB1dEJvb2xlYW4odHJ1ZSk7CisgICAgICAgIEJ5dGVCdWZmZXIgYiA9IGJ1aWxkZXIuZmluaXNoKCk7CisgICAgICAgIGFzc2VydFRoYXQoRmxleEJ1ZmZlcnMuZ2V0Um9vdChiKS5hc0Jvb2xlYW4oKSkuaXNUcnVlKCk7CisgICAgfQorCisgICAgQG9yZy5qdW5pdC5UZXN0IHB1YmxpYyB2b2lkIHRlc3RTaW5nbGVFbGVtZW50Qnl0ZSgpIHsKKyAgICAgICAgRmxleEJ1ZmZlcnNCdWlsZGVyIGJ1aWxkZXIgPSBuZXcgRmxleEJ1ZmZlcnNCdWlsZGVyKCk7CisgICAgICAgIGJ1aWxkZXIucHV0SW50KDEwKTsKKyAgICAgICAgQnl0ZUJ1ZmZlciBiID0gYnVpbGRlci5maW5pc2goKTsKKyAgICAgIGFzc2VydFRoYXQoMTApLmlzRXF1YWxUbyhGbGV4QnVmZmVycy5nZXRSb290KGIpLmFzSW50KCkpOworICAgIH0KKworICAgIEBvcmcuanVuaXQuVGVzdCBwdWJsaWMgdm9pZCB0ZXN0U2luZ2xlRWxlbWVudFNob3J0KCkgeworICAgICAgICBGbGV4QnVmZmVyc0J1aWxkZXIgYnVpbGRlciA9IG5ldyBGbGV4QnVmZmVyc0J1aWxkZXIoKTsKKyAgICAgICAgYnVpbGRlci5wdXRJbnQoU2hvcnQuTUFYX1ZBTFVFKTsKKyAgICAgICAgQnl0ZUJ1ZmZlciBiID0gYnVpbGRlci5maW5pc2goKTsKKyAgICAgIGFzc2VydFRoYXQoU2hvcnQuTUFYX1ZBTFVFKS5pc0VxdWFsVG8oKHNob3J0KSBGbGV4QnVmZmVycy5nZXRSb290KGIpLmFzSW50KCkpOworICAgIH0KKworICAgIEBvcmcuanVuaXQuVGVzdCBwdWJsaWMgdm9pZCB0ZXN0U2luZ2xlRWxlbWVudEludCgpIHsKKyAgICAgICAgRmxleEJ1ZmZlcnNCdWlsZGVyIGJ1aWxkZXIgPSBuZXcgRmxleEJ1ZmZlcnNCdWlsZGVyKCk7CisgICAgICAgIGJ1aWxkZXIucHV0SW50KEludGVnZXIuTUlOX1ZBTFVFKTsKKyAgICAgICAgQnl0ZUJ1ZmZlciBiID0gYnVpbGRlci5maW5pc2goKTsKKyAgICAgIGFzc2VydFRoYXQoSW50ZWdlci5NSU5fVkFMVUUpLmlzRXF1YWxUbyhGbGV4QnVmZmVycy5nZXRSb290KGIpLmFzSW50KCkpOworICAgIH0KKworICAgIEBvcmcuanVuaXQuVGVzdCBwdWJsaWMgdm9pZCB0ZXN0U2luZ2xlRWxlbWVudExvbmcoKSB7CisgICAgICAgIEZsZXhCdWZmZXJzQnVpbGRlciBidWlsZGVyID0gbmV3IEZsZXhCdWZmZXJzQnVpbGRlcigpOworICAgICAgICBidWlsZGVyLnB1dEludChMb25nLk1BWF9WQUxVRSk7CisgICAgICAgIEJ5dGVCdWZmZXIgYiA9IGJ1aWxkZXIuZmluaXNoKCk7CisgICAgICBhc3NlcnRUaGF0KExvbmcuTUFYX1ZBTFVFKS5pc0VxdWFsVG8oRmxleEJ1ZmZlcnMuZ2V0Um9vdChiKS5hc0xvbmcoKSk7CisgICAgfQorCisgICAgQG9yZy5qdW5pdC5UZXN0IHB1YmxpYyB2b2lkIHRlc3RTaW5nbGVFbGVtZW50RmxvYXQoKSB7CisgICAgICAgIEZsZXhCdWZmZXJzQnVpbGRlciBidWlsZGVyID0gbmV3IEZsZXhCdWZmZXJzQnVpbGRlcigpOworICAgICAgICBidWlsZGVyLnB1dEZsb2F0KEZsb2F0Lk1BWF9WQUxVRSk7CisgICAgICAgIEJ5dGVCdWZmZXIgYiA9IGJ1aWxkZXIuZmluaXNoKCk7CisgICAgICBhc3NlcnRUaGF0KEZsb2F0LmNvbXBhcmUoRmxvYXQuTUFYX1ZBTFVFLCAoZmxvYXQpIEZsZXhCdWZmZXJzLmdldFJvb3QoYikuYXNGbG9hdCgpKSkuaXNFcXVhbFRvKAorICAgICAgICAwKTsKKyAgICB9CisKKyAgICBAb3JnLmp1bml0LlRlc3QgcHVibGljIHZvaWQgdGVzdFNpbmdsZUVsZW1lbnREb3VibGUoKSB7CisgICAgICAgIEZsZXhCdWZmZXJzQnVpbGRlciBidWlsZGVyID0gbmV3IEZsZXhCdWZmZXJzQnVpbGRlcigpOworICAgICAgICBidWlsZGVyLnB1dEZsb2F0KERvdWJsZS5NQVhfVkFMVUUpOworICAgICAgICBCeXRlQnVmZmVyIGIgPSBidWlsZGVyLmZpbmlzaCgpOworICAgICAgYXNzZXJ0VGhhdChEb3VibGUuY29tcGFyZShEb3VibGUuTUFYX1ZBTFVFLCBGbGV4QnVmZmVycy5nZXRSb290KGIpLmFzRmxvYXQoKSkpLmlzRXF1YWxUbygwKTsKKyAgICB9CisKKyAgICBAb3JnLmp1bml0LlRlc3QgcHVibGljIHZvaWQgdGVzdFNpbmdsZUVsZW1lbnRCaWdTdHJpbmcoKSB7CisgICAgICAgIEZsZXhCdWZmZXJzQnVpbGRlciBidWlsZGVyID0gbmV3IEZsZXhCdWZmZXJzQnVpbGRlcihCeXRlQnVmZmVyLmFsbG9jYXRlKDEwMDAwKSk7CisgICAgICAgIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworCisgICAgICAgIGZvciAoaW50IGk9MDsgaTwgMzAwMDsgaSsrKSB7CisgICAgICAgICAgICBzYi5hcHBlbmQoImEiKTsKKyAgICAgICAgfQorCisgICAgICAgIGJ1aWxkZXIucHV0U3RyaW5nKHNiLnRvU3RyaW5nKCkpOworICAgICAgICBCeXRlQnVmZmVyIGIgPSBidWlsZGVyLmZpbmlzaCgpOworCisgICAgICAgIEZsZXhCdWZmZXJzLlJlZmVyZW5jZSByID0gRmxleEJ1ZmZlcnMuZ2V0Um9vdChiKTsKKworICAgICAgYXNzZXJ0VGhhdChGbGV4QnVmZmVycy5GQlRfU1RSSU5HKS5pc0VxdWFsVG8oci5nZXRUeXBlKCkpOworICAgICAgYXNzZXJ0VGhhdChzYi50b1N0cmluZygpKS5pc0VxdWFsVG8oci5hc1N0cmluZygpKTsKKyAgICB9CisKKyAgICBAb3JnLmp1bml0LlRlc3QgcHVibGljIHZvaWQgdGVzdFNpbmdsZUVsZW1lbnRTbWFsbFN0cmluZygpIHsKKyAgICAgICAgRmxleEJ1ZmZlcnNCdWlsZGVyIGJ1aWxkZXIgPSBuZXcgRmxleEJ1ZmZlcnNCdWlsZGVyKEJ5dGVCdWZmZXIuYWxsb2NhdGUoMTAwMDApKTsKKworICAgICAgICBidWlsZGVyLnB1dFN0cmluZygiYWEiKTsKKyAgICAgICAgQnl0ZUJ1ZmZlciBiID0gYnVpbGRlci5maW5pc2goKTsKKyAgICAgICAgRmxleEJ1ZmZlcnMuUmVmZXJlbmNlIHIgPSBGbGV4QnVmZmVycy5nZXRSb290KGIpOworCisgICAgICBhc3NlcnRUaGF0KEZsZXhCdWZmZXJzLkZCVF9TVFJJTkcpLmlzRXF1YWxUbyhyLmdldFR5cGUoKSk7CisgICAgICBhc3NlcnRUaGF0KCJhYSIpLmlzRXF1YWxUbyhyLmFzU3RyaW5nKCkpOworICAgIH0KKworICAgIEBvcmcuanVuaXQuVGVzdCBwdWJsaWMgdm9pZCB0ZXN0U2luZ2xlRWxlbWVudEJsb2IoKSB7CisgICAgICAgIEZsZXhCdWZmZXJzQnVpbGRlciBidWlsZGVyID0gbmV3IEZsZXhCdWZmZXJzQnVpbGRlcigpOworICAgICAgICBidWlsZGVyLnB1dEJsb2IobmV3IGJ5dGVbXXs1LCAxMjQsIDExOCwgLTF9KTsKKyAgICAgICAgQnl0ZUJ1ZmZlciBiID0gYnVpbGRlci5maW5pc2goKTsKKyAgICAgICAgRmxleEJ1ZmZlcnMuUmVmZXJlbmNlIHIgPSBGbGV4QnVmZmVycy5nZXRSb290KGIpOworICAgICAgICBieXRlW10gcmVzdWx0ID0gci5hc0Jsb2IoKS5nZXRCeXRlcygpOworICAgICAgYXNzZXJ0VGhhdCgoYnl0ZSk1KS5pc0VxdWFsVG8ocmVzdWx0WzBdKTsKKyAgICAgIGFzc2VydFRoYXQoKGJ5dGUpMTI0KS5pc0VxdWFsVG8ocmVzdWx0WzFdKTsKKyAgICAgIGFzc2VydFRoYXQoKGJ5dGUpMTE4KS5pc0VxdWFsVG8ocmVzdWx0WzJdKTsKKyAgICAgIGFzc2VydFRoYXQoKGJ5dGUpLTEpLmlzRXF1YWxUbyhyZXN1bHRbM10pOworICAgIH0KKworICAgIEBvcmcuanVuaXQuVGVzdCBwdWJsaWMgdm9pZCB0ZXN0U2luZ2xlRWxlbWVudExvbmdCbG9iKCkgeworCisgICAgICAgIC8vIHZlcmlmaWVzIGJsb2JzIG9mIHVwIHRvIDJeMTYgaW4gbGVuZ3RoCisgICAgICAgIGZvciAoaW50IGkgPSAyOyBpIDw9IDE8PDE2OyBpID0gaTw8MSkgeworICAgICAgICAgICAgYnl0ZVtdIGlucHV0ID0gbmV3IGJ5dGVbaS0xXTsKKyAgICAgICAgICAgIGZvciAoaW50IGluZGV4ID0gMDsgaW5kZXggPCBpbnB1dC5sZW5ndGg7IGluZGV4KyspIHsKKyAgICAgICAgICAgICAgICBpbnB1dFtpbmRleF0gPSAoYnl0ZSkoaW5kZXggJSA2NCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEZsZXhCdWZmZXJzQnVpbGRlciBidWlsZGVyID0gbmV3IEZsZXhCdWZmZXJzQnVpbGRlcigpOworICAgICAgICAgICAgYnVpbGRlci5wdXRCbG9iKGlucHV0KTsKKyAgICAgICAgICAgIEJ5dGVCdWZmZXIgYiA9IGJ1aWxkZXIuZmluaXNoKCk7CisgICAgICAgICAgICBGbGV4QnVmZmVycy5SZWZlcmVuY2UgciA9IEZsZXhCdWZmZXJzLmdldFJvb3QoYik7CisgICAgICAgICAgICBieXRlW10gcmVzdWx0ID0gci5hc0Jsb2IoKS5nZXRCeXRlcygpOworICAgICAgICAgICAgCisgICAgICAgICAgICBmb3IgKGludCBpbmRleCA9IDA7IGluZGV4IDwgaW5wdXQubGVuZ3RoOyBpbmRleCsrKSB7CisgICAgICAgICAgICAgIGFzc2VydFRoYXQoKGJ5dGUpKGluZGV4ICUgNjQpKS5pc0VxdWFsVG8ocmVzdWx0W2luZGV4XSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAb3JnLmp1bml0LlRlc3QgcHVibGljIHZvaWQgdGVzdFNpbmdsZUVsZW1lbnRVQnl0ZSgpIHsKKyAgICAgICAgRmxleEJ1ZmZlcnNCdWlsZGVyIGJ1aWxkZXIgPSBuZXcgRmxleEJ1ZmZlcnNCdWlsZGVyKCk7CisgICAgICAgIGJ1aWxkZXIucHV0VUludCgweEZGKTsKKyAgICAgICAgQnl0ZUJ1ZmZlciBiID0gYnVpbGRlci5maW5pc2goKTsKKyAgICAgICAgRmxleEJ1ZmZlcnMuUmVmZXJlbmNlIHIgPSBGbGV4QnVmZmVycy5nZXRSb290KGIpOworICAgICAgYXNzZXJ0VGhhdCgyNTUpLmlzRXF1YWxUbygoaW50KXIuYXNVSW50KCkpOworICAgIH0KKworICAgIEBvcmcuanVuaXQuVGVzdCBwdWJsaWMgdm9pZCB0ZXN0U2luZ2xlRWxlbWVudFVTaG9ydCgpIHsKKyAgICAgICAgRmxleEJ1ZmZlcnNCdWlsZGVyIGJ1aWxkZXIgPSBuZXcgRmxleEJ1ZmZlcnNCdWlsZGVyKCk7CisgICAgICAgIGJ1aWxkZXIucHV0VUludCgweEZGRkYpOworICAgICAgICBCeXRlQnVmZmVyIGIgPSBidWlsZGVyLmZpbmlzaCgpOworICAgICAgICBGbGV4QnVmZmVycy5SZWZlcmVuY2UgciA9IEZsZXhCdWZmZXJzLmdldFJvb3QoYik7CisgICAgICBhc3NlcnRUaGF0KDY1NTM1KS5pc0VxdWFsVG8oKGludClyLmFzVUludCgpKTsKKyAgICB9CisKKyAgICBAb3JnLmp1bml0LlRlc3QgcHVibGljIHZvaWQgdGVzdFNpbmdsZUVsZW1lbnRVSW50KCkgeworICAgICAgICBGbGV4QnVmZmVyc0J1aWxkZXIgYnVpbGRlciA9IG5ldyBGbGV4QnVmZmVyc0J1aWxkZXIoKTsKKyAgICAgICAgYnVpbGRlci5wdXRVSW50KDB4RkZGRl9GRkZGTCk7CisgICAgICAgIEJ5dGVCdWZmZXIgYiA9IGJ1aWxkZXIuZmluaXNoKCk7CisgICAgICAgIEZsZXhCdWZmZXJzLlJlZmVyZW5jZSByID0gRmxleEJ1ZmZlcnMuZ2V0Um9vdChiKTsKKyAgICAgIGFzc2VydFRoYXQoNDI5NDk2NzI5NUwpLmlzRXF1YWxUbyhyLmFzVUludCgpKTsKKyAgICB9CisKKyAgICBAb3JnLmp1bml0LlRlc3QgcHVibGljIHZvaWQgdGVzdFNpbmdsZUZpeGVkVHlwZVZlY3RvcigpIHsKKworICAgICAgICBpbnRbXSBpbnRzID0gbmV3IGludFtdezUsIDEyNCwgMTE4LCAtMX07CisgICAgICAgIGZsb2F0W10gZmxvYXRzID0gbmV3IGZsb2F0W117NS41ZiwgMTI0LjEyNGYsIDExOC4xMThmLCAtMS4xZn07CisgICAgICAgIFN0cmluZ1tdIHN0cmluZ3MgPSBuZXcgU3RyaW5nW117IlRoaXMiLCAiaXMiLCAiYSIsICJ0eXBlZCIsICJhcnJheSJ9OworICAgICAgICBib29sZWFuW10gYm9vbGVhbnMgPSBuZXcgYm9vbGVhbltde2ZhbHNlLCB0cnVlLCB0cnVlLCBmYWxzZX07CisKKworICAgICAgICBGbGV4QnVmZmVyc0J1aWxkZXIgYnVpbGRlciA9IG5ldyBGbGV4QnVmZmVyc0J1aWxkZXIoQnl0ZUJ1ZmZlci5hbGxvY2F0ZSg1MTIpLAorICAgICAgICAgICAgICAgIEZsZXhCdWZmZXJzQnVpbGRlci5CVUlMREVSX0ZMQUdfTk9ORSk7CisKKyAgICAgICAgaW50IG1hcFBvcyA9IGJ1aWxkZXIuc3RhcnRNYXAoKTsKKworICAgICAgICBpbnQgdmVjUG9zID0gYnVpbGRlci5zdGFydFZlY3RvcigpOworICAgICAgICBmb3IgKGZpbmFsIGludCBpIDogaW50cykgeworICAgICAgICAgICAgYnVpbGRlci5wdXRJbnQoaSk7CisgICAgICAgIH0KKyAgICAgICAgYnVpbGRlci5lbmRWZWN0b3IoImludHMiLCB2ZWNQb3MsIHRydWUsIGZhbHNlKTsKKworICAgICAgICB2ZWNQb3MgPSBidWlsZGVyLnN0YXJ0VmVjdG9yKCk7CisgICAgICAgIGZvciAoZmluYWwgZmxvYXQgaSA6IGZsb2F0cykgeworICAgICAgICAgICAgYnVpbGRlci5wdXRGbG9hdChpKTsKKyAgICAgICAgfQorICAgICAgICBidWlsZGVyLmVuZFZlY3RvcigiZmxvYXRzIiwgdmVjUG9zLCB0cnVlLCBmYWxzZSk7CisKKyAgICAgICAgdmVjUG9zID0gYnVpbGRlci5zdGFydFZlY3RvcigpOworICAgICAgICBmb3IgKGZpbmFsIGJvb2xlYW4gaSA6IGJvb2xlYW5zKSB7CisgICAgICAgICAgICBidWlsZGVyLnB1dEJvb2xlYW4oaSk7CisgICAgICAgIH0KKyAgICAgICAgYnVpbGRlci5lbmRWZWN0b3IoImJvb2xlYW5zIiwgdmVjUG9zLCB0cnVlLCBmYWxzZSk7CisKKyAgICAgICAgYnVpbGRlci5lbmRNYXAobnVsbCwgbWFwUG9zKTsKKworCisgICAgICAgIEJ5dGVCdWZmZXIgYiA9IGJ1aWxkZXIuZmluaXNoKCk7CisgICAgICAgIEZsZXhCdWZmZXJzLlJlZmVyZW5jZSByID0gRmxleEJ1ZmZlcnMuZ2V0Um9vdChiKTsKKyAgICAgICAgYXNzZXJ0KHIuYXNNYXAoKS5nZXQoImludHMiKS5pc1R5cGVkVmVjdG9yKCkpOworICAgICAgICBhc3NlcnQoci5hc01hcCgpLmdldCgiZmxvYXRzIikuaXNUeXBlZFZlY3RvcigpKTsKKyAgICAgICAgYXNzZXJ0KHIuYXNNYXAoKS5nZXQoImJvb2xlYW5zIikuaXNUeXBlZFZlY3RvcigpKTsKKyAgICB9CisKKyAgICBAb3JnLmp1bml0LlRlc3QgcHVibGljIHZvaWQgdGVzdFNpbmdsZUVsZW1lbnRWZWN0b3IoKSB7CisgICAgICAgIEZsZXhCdWZmZXJzQnVpbGRlciBiID0gbmV3IEZsZXhCdWZmZXJzQnVpbGRlcigpOworCisgICAgICAgIGludCB2ZWNQb3MgPSBiLnN0YXJ0VmVjdG9yKCk7CisgICAgICAgIGIucHV0SW50KDk5KTsKKyAgICAgICAgYi5wdXRTdHJpbmcoIndvdyIpOworICAgICAgICBiLnB1dE51bGwoKTsKKyAgICAgICAgaW50IHZlY3BvczIgPSBiLnN0YXJ0VmVjdG9yKCk7CisgICAgICAgIGIucHV0SW50KDk5KTsKKyAgICAgICAgYi5wdXRTdHJpbmcoIndvdyIpOworICAgICAgICBiLnB1dE51bGwoKTsKKyAgICAgICAgYi5lbmRWZWN0b3IobnVsbCwgdmVjcG9zMiwgZmFsc2UsIGZhbHNlKTsKKyAgICAgICAgYi5lbmRWZWN0b3IobnVsbCwgdmVjUG9zLCBmYWxzZSwgZmFsc2UpOworICAgICAgICBiLmZpbmlzaCgpOworCisgICAgICAgIEZsZXhCdWZmZXJzLlJlZmVyZW5jZSByID0gRmxleEJ1ZmZlcnMuZ2V0Um9vdChiLmdldEJ1ZmZlcigpKTsKKyAgICAgIGFzc2VydFRoYXQoRmxleEJ1ZmZlcnMuRkJUX1ZFQ1RPUikuaXNFcXVhbFRvKHIuZ2V0VHlwZSgpKTsKKyAgICAgIEZsZXhCdWZmZXJzLlZlY3RvciB2ZWMgPSBGbGV4QnVmZmVycy5nZXRSb290KGIuZ2V0QnVmZmVyKCkpLmFzVmVjdG9yKCk7CisgICAgICBhc3NlcnRUaGF0KDQpLmlzRXF1YWxUbyh2ZWMuc2l6ZSgpKTsKKyAgICAgIGFzc2VydFRoYXQoOTkpLmlzRXF1YWxUbyh2ZWMuZ2V0KDApLmFzSW50KCkpOworICAgICAgYXNzZXJ0VGhhdCgid293IikuaXNFcXVhbFRvKHZlYy5nZXQoMSkuYXNTdHJpbmcoKSk7CisgICAgICBhc3NlcnRUaGF0KHRydWUpLmlzRXF1YWxUbyh2ZWMuZ2V0KDIpLmlzTnVsbCgpKTsKKyAgICAgIGFzc2VydFRoYXQoIlsgOTksIFwid293XCIsIG51bGwgXSIpLmlzRXF1YWxUbyh2ZWMuZ2V0KDMpLnRvU3RyaW5nKCkpOworICAgICAgYXNzZXJ0VGhhdCgiWyA5OSwgXCJ3b3dcIiwgbnVsbCwgWyA5OSwgXCJ3b3dcIiwgbnVsbCBdIF0iKS5pc0VxdWFsVG8oCisgICAgICAgIEZsZXhCdWZmZXJzLmdldFJvb3QoYi5nZXRCdWZmZXIoKSkudG9TdHJpbmcoKSk7CisgICAgfQorCisgICAgQG9yZy5qdW5pdC5UZXN0IHB1YmxpYyB2b2lkIHRlc3RTaW5nbGVFbGVtZW50TWFwKCkgeworICAgICAgICBGbGV4QnVmZmVyc0J1aWxkZXIgYiA9IG5ldyBGbGV4QnVmZmVyc0J1aWxkZXIoKTsKKworICAgICAgICBpbnQgbWFwUG9zdCA9IGIuc3RhcnRNYXAoKTsKKyAgICAgICAgYi5wdXRJbnQoIm15SW50IiwgMHg3ZmZmZmZiYmJmZmZmZmZmTCk7CisgICAgICAgIGIucHV0U3RyaW5nKCJteVN0cmluZyIsICJ3b3ciKTsKKyAgICAgICAgYi5wdXRTdHJpbmcoIm15U3RyaW5nMiIsICJpbmNyZWRpYmxlIik7CisgICAgICAgIGIucHV0TnVsbCgibXlOdWxsIik7CisgICAgICAgIGludCBzdGFydCA9IGIuc3RhcnRWZWN0b3IoKTsKKyAgICAgICAgYi5wdXRJbnQoOTkpOworICAgICAgICBiLnB1dFN0cmluZygid293Iik7CisgICAgICAgIGIuZW5kVmVjdG9yKCJteVZlYyIsIHN0YXJ0LCBmYWxzZSwgZmFsc2UpOworCisgICAgICAgIGIucHV0RmxvYXQoImRvdWJsZSIsIDB4MS5mZmZmYmJiZmZmZmZmUCsxMDIzKTsKKyAgICAgICAgYi5lbmRNYXAobnVsbCwgbWFwUG9zdCk7CisgICAgICAgIGIuZmluaXNoKCk7CisKKyAgICAgICAgRmxleEJ1ZmZlcnMuUmVmZXJlbmNlIHIgPSBGbGV4QnVmZmVycy5nZXRSb290KGIuZ2V0QnVmZmVyKCkpOworICAgICAgYXNzZXJ0VGhhdChGbGV4QnVmZmVycy5GQlRfTUFQKS5pc0VxdWFsVG8oci5nZXRUeXBlKCkpOworICAgICAgRmxleEJ1ZmZlcnMuTWFwIG1hcCA9IEZsZXhCdWZmZXJzLmdldFJvb3QoYi5nZXRCdWZmZXIoKSkuYXNNYXAoKTsKKyAgICAgIGFzc2VydFRoYXQoNikuaXNFcXVhbFRvKG1hcC5zaXplKCkpOworICAgICAgYXNzZXJ0VGhhdCgweDdmZmZmZmJiYmZmZmZmZmZMKS5pc0VxdWFsVG8obWFwLmdldCgibXlJbnQiKS5hc0xvbmcoKSk7CisgICAgICBhc3NlcnRUaGF0KCJ3b3ciKS5pc0VxdWFsVG8obWFwLmdldCgibXlTdHJpbmciKS5hc1N0cmluZygpKTsKKyAgICAgIGFzc2VydFRoYXQoImluY3JlZGlibGUiKS5pc0VxdWFsVG8obWFwLmdldCgibXlTdHJpbmcyIikuYXNTdHJpbmcoKSk7CisgICAgICBhc3NlcnRUaGF0KHRydWUpLmlzRXF1YWxUbyhtYXAuZ2V0KCJteU51bGwiKS5pc051bGwoKSk7CisgICAgICBhc3NlcnRUaGF0KDk5KS5pc0VxdWFsVG8obWFwLmdldCgibXlWZWMiKS5hc1ZlY3RvcigpLmdldCgwKS5hc0ludCgpKTsKKyAgICAgIGFzc2VydFRoYXQoIndvdyIpLmlzRXF1YWxUbyhtYXAuZ2V0KCJteVZlYyIpLmFzVmVjdG9yKCkuZ2V0KDEpLmFzU3RyaW5nKCkpOworICAgICAgYXNzZXJ0VGhhdChEb3VibGUuY29tcGFyZSgweDEuZmZmZmJiYmZmZmZmZlArMTAyMywgbWFwLmdldCgiZG91YmxlIikuYXNGbG9hdCgpKSkuaXNFcXVhbFRvKDApOworICAgICAgYXNzZXJ0VGhhdCgKKyAgICAgICAgInsgXCJkb3VibGVcIiA6IDEuNzk3Njg5NDc4MzM5MTkzN0UzMDgsIFwibXlJbnRcIiA6IDkyMjMzNzE3NDM3MjMyNTc4NTUsIFwibXlOdWxsXCIgOiBudWxsLCBcIm15U3RyaW5nXCIgOiBcIndvd1wiLCBcIm15U3RyaW5nMlwiIDogXCJpbmNyZWRpYmxlXCIsIFwibXlWZWNcIiA6IFsgOTksIFwid293XCIgXSB9IikuaXNFcXVhbFRvKAorICAgICAgICBGbGV4QnVmZmVycy5nZXRSb290KGIuZ2V0QnVmZmVyKCkpLnRvU3RyaW5nKCkpOworICAgIH0KKworICAgIEBvcmcuanVuaXQuVGVzdCBwdWJsaWMgdm9pZCB0ZXN0RmxleEJ1ZmVyRW1wdHkoKSB7CisgICAgICAgIEZsZXhCdWZmZXJzLkJsb2IgYmxvYiA9IEZsZXhCdWZmZXJzLkJsb2IuZW1wdHkoKTsKKyAgICAgICAgRmxleEJ1ZmZlcnMuTWFwIGFyeSA9IEZsZXhCdWZmZXJzLk1hcC5lbXB0eSgpOworICAgICAgICBGbGV4QnVmZmVycy5WZWN0b3IgbWFwID0gRmxleEJ1ZmZlcnMuVmVjdG9yLmVtcHR5KCk7CisgICAgICAgIEZsZXhCdWZmZXJzLlR5cGVkVmVjdG9yIHR5cGVkQXJ5ID0gRmxleEJ1ZmZlcnMuVHlwZWRWZWN0b3IuZW1wdHkoKTsKKyAgICAgIGFzc2VydFRoYXQoYmxvYi5zaXplKCkpLmlzRXF1YWxUbygwKTsKKyAgICAgIGFzc2VydFRoYXQobWFwLnNpemUoKSkuaXNFcXVhbFRvKDApOworICAgICAgYXNzZXJ0VGhhdChhcnkuc2l6ZSgpKS5pc0VxdWFsVG8oMCk7CisgICAgICBhc3NlcnRUaGF0KHR5cGVkQXJ5LnNpemUoKSkuaXNFcXVhbFRvKDApOworICAgIH0KKworICAgIEBvcmcuanVuaXQuVGVzdCBwdWJsaWMgdm9pZCB0ZXN0SGFzaE1hcFRvTWFwKCkgeworICAgICAgICBpbnQgZW50cmllc0NvdW50ID0gMTI7CisKKyAgICAgICAgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4gc291cmNlID0gIG5ldyBIYXNoTWFwPD4oKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBlbnRyaWVzQ291bnQ7IGkrKykgeworICAgICAgICAgICAgc291cmNlLnB1dCgiZm9vX3BhcmFtXyIgKyBpLCAiZm9vX3ZhbHVlXyIgKyBpKTsKKyAgICAgICAgfQorCisgICAgICAgIEZsZXhCdWZmZXJzQnVpbGRlciBidWlsZGVyID0gbmV3IEZsZXhCdWZmZXJzQnVpbGRlcigxMDAwKTsKKyAgICAgICAgaW50IG1hcFN0YXJ0ID0gYnVpbGRlci5zdGFydE1hcCgpOworICAgICAgICBmb3IgKE1hcC5FbnRyeTxTdHJpbmcsIFN0cmluZz4gZW50cnkgOiBzb3VyY2UuZW50cnlTZXQoKSkgeworICAgICAgICAgICAgYnVpbGRlci5wdXRTdHJpbmcoZW50cnkuZ2V0S2V5KCksIGVudHJ5LmdldFZhbHVlKCkpOworICAgICAgICB9CisgICAgICAgIGJ1aWxkZXIuZW5kTWFwKG51bGwsIG1hcFN0YXJ0KTsKKyAgICAgICAgQnl0ZUJ1ZmZlciBiYiA9IGJ1aWxkZXIuZmluaXNoKCk7CisgICAgICAgIGJiLnJld2luZCgpOworCisgICAgICAgIEZsZXhCdWZmZXJzLlJlZmVyZW5jZSByb290UmVmZXJlbmNlID0gRmxleEJ1ZmZlcnMuZ2V0Um9vdChiYik7CisKKyAgICAgIGFzc2VydFRoYXQocm9vdFJlZmVyZW5jZS5pc01hcCgpKS5pc1RydWUoKTsKKworICAgICAgRmxleEJ1ZmZlcnMuTWFwIGZsZXhNYXAgPSByb290UmVmZXJlbmNlLmFzTWFwKCk7CisKKyAgICAgICAgRmxleEJ1ZmZlcnMuS2V5VmVjdG9yIGtleXMgPSBmbGV4TWFwLmtleXMoKTsKKyAgICAgICAgRmxleEJ1ZmZlcnMuVmVjdG9yIHZhbHVlcyA9IGZsZXhNYXAudmFsdWVzKCk7CisKKyAgICAgIGFzc2VydFRoYXQoZW50cmllc0NvdW50KS5pc0VxdWFsVG8oa2V5cy5zaXplKCkpOworICAgICAgYXNzZXJ0VGhhdChlbnRyaWVzQ291bnQpLmlzRXF1YWxUbyh2YWx1ZXMuc2l6ZSgpKTsKKworICAgICAgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4gcmVzdWx0ID0gIG5ldyBIYXNoTWFwPD4oKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBrZXlzLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICByZXN1bHQucHV0KGtleXMuZ2V0KGkpLnRvU3RyaW5nKCksIHZhbHVlcy5nZXQoaSkuYXNTdHJpbmcoKSk7CisgICAgICAgIH0KKworICAgICAgYXNzZXJ0VGhhdChzb3VyY2UpLmlzRXF1YWxUbyhyZXN1bHQpOworICAgIH0KKworICAgIEBvcmcuanVuaXQuVGVzdCBwdWJsaWMgdm9pZCB0ZXN0QnVpbGRlckdyb3d0aCgpIHsKKyAgICAgICAgRmxleEJ1ZmZlcnNCdWlsZGVyIGJ1aWxkZXIgPSBuZXcgRmxleEJ1ZmZlcnNCdWlsZGVyKCk7CisgICAgICAgIFN0cmluZyBzb21lU3RyaW5nID0gIlRoaXMgaXMgYSBzbWFsbCBzdHJpbmciOworICAgICAgICBidWlsZGVyLnB1dFN0cmluZyhzb21lU3RyaW5nKTsKKyAgICAgICAgQnl0ZUJ1ZmZlciBiID0gYnVpbGRlci5maW5pc2goKTsKKyAgICAgIGFzc2VydFRoYXQoc29tZVN0cmluZykuaXNFcXVhbFRvKEZsZXhCdWZmZXJzLmdldFJvb3QoYikuYXNTdHJpbmcoKSk7CisKKyAgICAgIEZsZXhCdWZmZXJzQnVpbGRlciBmYWlsQnVpbGRlciA9IG5ldyBGbGV4QnVmZmVyc0J1aWxkZXIoQnl0ZUJ1ZmZlci5hbGxvY2F0ZSgxKSk7CisgICAgICAgIGZhaWxCdWlsZGVyLnB1dFN0cmluZyhzb21lU3RyaW5nKTsKKyAgICB9CisKKyAgICBAb3JnLmp1bml0LlRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RmxleEJ1ZmZlcnNVdGY4TWFwKCkgeworICAgICAgICBGbGV4QnVmZmVyc0J1aWxkZXIgYnVpbGRlciA9IG5ldyBGbGV4QnVmZmVyc0J1aWxkZXIoQnl0ZUJ1ZmZlci5hbGxvY2F0ZSg1MTIpLAorICAgICAgICAgICAgICAgIEZsZXhCdWZmZXJzQnVpbGRlci5CVUlMREVSX0ZMQUdfU0hBUkVfS0VZU19BTkRfU1RSSU5HUyk7CisKKyAgICAgICAgU3RyaW5nIGtleTAgPSAi8J+YqCBmYWNlMSI7CisgICAgICAgIFN0cmluZyBrZXkxID0gIvCfmKkgZmFjZTIiOworICAgICAgICBTdHJpbmcga2V5MiA9ICLwn5ioIGZhY2UzIjsKKyAgICAgICAgU3RyaW5nIGtleTMgPSAidHJhZGVtYXJrIMKuIjsKKyAgICAgICAgU3RyaW5nIGtleTQgPSAi4oKsIGV1cm8iOworICAgICAgICBTdHJpbmcgdXRmOGtleXNbXSA9IHsgIvCfmKggZmFjZTEiLCAi8J+YqSBmYWNlMiIsICLwn5ioIGZhY2UzIiwgInRyYWRlbWFyayDCriIsICLigqwgZXVybyJ9OworCisgICAgICAgIGludCBtYXAgPSBidWlsZGVyLnN0YXJ0TWFwKCk7CisKKyAgICAgICAgZm9yIChpbnQgaT0wOyBpPCB1dGY4a2V5cy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgYnVpbGRlci5wdXRTdHJpbmcodXRmOGtleXNbaV0sIHV0ZjhrZXlzW2ldKTsgIC8vIFRlc3Rpbmcga2V5IGFuZCBzdHJpbmcgcmV1c2UuCisgICAgICAgIH0KKyAgICAgICAgYnVpbGRlci5lbmRNYXAobnVsbCwgbWFwKTsKKyAgICAgICAgYnVpbGRlci5maW5pc2goKTsKKworICAgICAgICBGbGV4QnVmZmVycy5NYXAgbSA9IEZsZXhCdWZmZXJzLmdldFJvb3QoYnVpbGRlci5nZXRCdWZmZXIoKSkuYXNNYXAoKTsKKworICAgICAgYXNzZXJ0VGhhdChtLnNpemUoKSkuaXNFcXVhbFRvKDUpOworCisgICAgICBLZXlWZWN0b3Iga3YgPSBtLmtleXMoKTsKKyAgICAgICAgZm9yIChpbnQgaT0wOyBpPCB1dGY4a2V5cy5sZW5ndGg7IGkrKykgeworICAgICAgICAgIGFzc2VydFRoYXQoa3YuZ2V0KGkpLnRvU3RyaW5nKCkpLmlzRXF1YWxUbyhtLmdldChpKS5hc1N0cmluZygpKTsKKyAgICAgICAgfQorCisgICAgICBhc3NlcnRUaGF0KG0uZ2V0KGtleTApLmFzU3RyaW5nKCkpLmlzRXF1YWxUbyh1dGY4a2V5c1swXSk7CisgICAgICBhc3NlcnRUaGF0KG0uZ2V0KGtleTEpLmFzU3RyaW5nKCkpLmlzRXF1YWxUbyh1dGY4a2V5c1sxXSk7CisgICAgICBhc3NlcnRUaGF0KG0uZ2V0KGtleTIpLmFzU3RyaW5nKCkpLmlzRXF1YWxUbyh1dGY4a2V5c1syXSk7CisgICAgICBhc3NlcnRUaGF0KG0uZ2V0KGtleTMpLmFzU3RyaW5nKCkpLmlzRXF1YWxUbyh1dGY4a2V5c1szXSk7CisgICAgICBhc3NlcnRUaGF0KG0uZ2V0KGtleTQpLmFzU3RyaW5nKCkpLmlzRXF1YWxUbyh1dGY4a2V5c1s0XSk7CisgICAgfQorCisgICAgQG9yZy5qdW5pdC5UZXN0IHB1YmxpYyB2b2lkIHRlc3RGbGV4QnVmZmVyc01hcExvb2t1cCgpIHsKKyAgICAgICAgRmxleEJ1ZmZlcnNCdWlsZGVyIGJ1aWxkZXIgPSBuZXcgRmxleEJ1ZmZlcnNCdWlsZGVyKEJ5dGVCdWZmZXIuYWxsb2NhdGUoNTEyKSwKKyAgICAgICAgICAgICAgICBGbGV4QnVmZmVyc0J1aWxkZXIuQlVJTERFUl9GTEFHX1NIQVJFX0tFWVNfQU5EX1NUUklOR1MpOworCisgICAgICAgIFN0cmluZyBrZXkwID0gIjEyMyI7CisgICAgICAgIFN0cmluZyBrZXkxID0gIjEyMzQiOworICAgICAgICBTdHJpbmcga2V5MiA9ICIxMjM0NSI7CisgICAgICAgIFN0cmluZ1tdIGtleXMgPSBuZXcgU3RyaW5nW117a2V5MCwga2V5MSwga2V5Mn07CisKKyAgICAgICAgaW50IG1hcCA9IGJ1aWxkZXIuc3RhcnRNYXAoKTsKKworICAgICAgICBmb3IgKGludCBpPTA7IGk8IGtleXMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIGJ1aWxkZXIucHV0U3RyaW5nKGtleXNbaV0sIGtleXNbaV0pOyAgLy8gVGVzdGluZyBrZXkgYW5kIHN0cmluZyByZXVzZS4KKyAgICAgICAgfQorICAgICAgICBidWlsZGVyLmVuZE1hcChudWxsLCBtYXApOworICAgICAgICBidWlsZGVyLmZpbmlzaCgpOworCisgICAgICAgIEZsZXhCdWZmZXJzLk1hcCBtID0gRmxleEJ1ZmZlcnMuZ2V0Um9vdChidWlsZGVyLmdldEJ1ZmZlcigpKS5hc01hcCgpOworICAgICAgICBmb3IgKGludCBpPTA7IGk8IGtleXMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICBhc3NlcnRUaGF0KG0uZ2V0KGtleXNbaV0pLmFzU3RyaW5nKCkpLmlzRXF1YWxUbyhrZXlzW2ldKTsKKyAgICAgICAgICBhc3NlcnRUaGF0KG0uZ2V0KGtleXNbaV0uZ2V0Qnl0ZXMoU3RhbmRhcmRDaGFyc2V0cy5VVEZfOCkpLmFzU3RyaW5nKCkpLmlzRXF1YWxUbyhrZXlzW2ldKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBvcmcuanVuaXQuVGVzdCBwdWJsaWMgdm9pZCBUZXN0RGljdGlvbmFyeUxvb2t1cCgpIHsKKyAgICAgICAgRmxhdEJ1ZmZlckJ1aWxkZXIgZmJiID0gbmV3IEZsYXRCdWZmZXJCdWlsZGVyKDE2KTsKKyAgICAgICAgaW50IGxmSW5kZXggPSBMb25nRmxvYXRFbnRyeS5jcmVhdGVMb25nRmxvYXRFbnRyeShmYmIsIDAsIDk5KTsKKyAgICAgICAgaW50IHZlY3RvckVudHJpZXNJZHggPSBMb25nRmxvYXRNYXAuY3JlYXRlRW50cmllc1ZlY3RvcihmYmIsIG5ldyBpbnRbXSB7IGxmSW5kZXggfSk7CisgICAgICAgIGludCByb290SWR4ID0gTG9uZ0Zsb2F0TWFwLmNyZWF0ZUxvbmdGbG9hdE1hcChmYmIsIHZlY3RvckVudHJpZXNJZHgpOworCisgICAgICAgIExvbmdGbG9hdE1hcC5maW5pc2hMb25nRmxvYXRNYXBCdWZmZXIoZmJiLCByb290SWR4KTsKKyAgICAgICAgTG9uZ0Zsb2F0TWFwIG1hcCA9IExvbmdGbG9hdE1hcC5nZXRSb290QXNMb25nRmxvYXRNYXAoZmJiLmRhdGFCdWZmZXIoKSk7CisgICAgICBhc3NlcnRUaGF0KG1hcC5lbnRyaWVzTGVuZ3RoKCkpLmlzRXF1YWxUbygxKTsKKworICAgICAgTG9uZ0Zsb2F0RW50cnkgZSA9IG1hcC5lbnRyaWVzKDApOworICAgICAgYXNzZXJ0VGhhdChlLmtleSgpKS5pc0VxdWFsVG8oMEwpOworICAgICAgYXNzZXJ0VGhhdChlLnZhbHVlKCkpLmlzRXF1YWxUbyg5OS4wZik7CisKKyAgICAgIExvbmdGbG9hdEVudHJ5IGUyID0gbWFwLmVudHJpZXNCeUtleSgwKTsKKyAgICAgIGFzc2VydFRoYXQoZTIua2V5KCkpLmlzRXF1YWxUbygwTCk7CisgICAgICBhc3NlcnRUaGF0KGUyLnZhbHVlKCkpLmlzRXF1YWxUbyg5OS4wZik7CisgICAgfQorCisgICAgQG9yZy5qdW5pdC5UZXN0IHB1YmxpYyB2b2lkIFRlc3RWZWN0b3JPZkJ5dGVzKCkgeworICAgICAgICBGbGF0QnVmZmVyQnVpbGRlciBmYmIgPSBuZXcgRmxhdEJ1ZmZlckJ1aWxkZXIoMTYpOworICAgICAgICBpbnQgc3RyID0gZmJiLmNyZWF0ZVN0cmluZygiQnl0ZU1vbnN0ZXIiKTsKKyAgICAgICAgYnl0ZVtdIGRhdGEgPSBuZXcgYnl0ZVtdIHswLCAxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5fTsKKyAgICAgICAgaW50IG9mZnNldCA9IE1vbnN0ZXIuY3JlYXRlSW52ZW50b3J5VmVjdG9yKGZiYiwgZGF0YSk7CisgICAgICAgIE1vbnN0ZXIuc3RhcnRNb25zdGVyKGZiYik7CisgICAgICAgIE1vbnN0ZXIuYWRkTmFtZShmYmIsIHN0cik7CisgICAgICAgIE1vbnN0ZXIuYWRkSW52ZW50b3J5KGZiYiwgb2Zmc2V0KTsKKyAgICAgICAgaW50IG1vbnN0ZXIxID0gTW9uc3Rlci5lbmRNb25zdGVyKGZiYik7CisgICAgICAgIE1vbnN0ZXIuZmluaXNoTW9uc3RlckJ1ZmZlcihmYmIsIG1vbnN0ZXIxKTsKKyAgICAgICAgTW9uc3RlciBtb25zdGVyT2JqZWN0ID0gTW9uc3Rlci5nZXRSb290QXNNb25zdGVyKGZiYi5kYXRhQnVmZmVyKCkpOworCisgICAgICBhc3NlcnRUaGF0KG1vbnN0ZXJPYmplY3QuaW52ZW50b3J5TGVuZ3RoKCkpLmlzRXF1YWxUbyhkYXRhLmxlbmd0aCk7CisgICAgICBhc3NlcnRUaGF0KChJbnRlZ2VyKSBtb25zdGVyT2JqZWN0LmludmVudG9yeSg0KSkuaXNFcXVhbFRvKChpbnQpIGRhdGFbNF0pOworICAgICAgYXNzZXJ0VGhhdChCeXRlQnVmZmVyLndyYXAoZGF0YSkpLmlzRXF1YWxUbyhtb25zdGVyT2JqZWN0LmludmVudG9yeUFzQnl0ZUJ1ZmZlcigpKTsKKworICAgICAgZmJiLmNsZWFyKCk7CisgICAgICAgIEJ5dGVCdWZmZXIgYmIgPSBCeXRlQnVmZmVyLndyYXAoZGF0YSk7CisgICAgICAgIG9mZnNldCA9IGZiYi5jcmVhdGVCeXRlVmVjdG9yKGJiKTsKKyAgICAgICAgc3RyID0gZmJiLmNyZWF0ZVN0cmluZygiQnl0ZU1vbnN0ZXIiKTsKKyAgICAgICAgTW9uc3Rlci5zdGFydE1vbnN0ZXIoZmJiKTsKKyAgICAgICAgTW9uc3Rlci5hZGROYW1lKGZiYiwgc3RyKTsKKyAgICAgICAgTW9uc3Rlci5hZGRJbnZlbnRvcnkoZmJiLCBvZmZzZXQpOworICAgICAgICBtb25zdGVyMSA9IE1vbnN0ZXIuZW5kTW9uc3RlcihmYmIpOworICAgICAgICBNb25zdGVyLmZpbmlzaE1vbnN0ZXJCdWZmZXIoZmJiLCBtb25zdGVyMSk7CisgICAgICAgIE1vbnN0ZXIgbW9uc3Rlck9iamVjdDIgPSBNb25zdGVyLmdldFJvb3RBc01vbnN0ZXIoZmJiLmRhdGFCdWZmZXIoKSk7CisKKyAgICAgIGFzc2VydFRoYXQobW9uc3Rlck9iamVjdDIuaW52ZW50b3J5TGVuZ3RoKCkpLmlzRXF1YWxUbyhkYXRhLmxlbmd0aCk7CisgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGRhdGEubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgYXNzZXJ0VGhhdCgoSW50ZWdlcikgbW9uc3Rlck9iamVjdDIuaW52ZW50b3J5KGkpKS5pc0VxdWFsVG8oKGludCkgYmIuZ2V0KGkpKTsKKyAgICAgIH0KKworICAgICAgICBmYmIuY2xlYXIoKTsKKyAgICAgICAgb2Zmc2V0ID0gZmJiLmNyZWF0ZUJ5dGVWZWN0b3IoZGF0YSwgMywgNCk7CisgICAgICAgIHN0ciA9IGZiYi5jcmVhdGVTdHJpbmcoIkJ5dGVNb25zdGVyIik7CisgICAgICAgIE1vbnN0ZXIuc3RhcnRNb25zdGVyKGZiYik7CisgICAgICAgIE1vbnN0ZXIuYWRkTmFtZShmYmIsIHN0cik7CisgICAgICAgIE1vbnN0ZXIuYWRkSW52ZW50b3J5KGZiYiwgb2Zmc2V0KTsKKyAgICAgICAgbW9uc3RlcjEgPSBNb25zdGVyLmVuZE1vbnN0ZXIoZmJiKTsKKyAgICAgICAgTW9uc3Rlci5maW5pc2hNb25zdGVyQnVmZmVyKGZiYiwgbW9uc3RlcjEpOworICAgICAgICBNb25zdGVyIG1vbnN0ZXJPYmplY3QzID0gTW9uc3Rlci5nZXRSb290QXNNb25zdGVyKGZiYi5kYXRhQnVmZmVyKCkpOworCisgICAgICBhc3NlcnRUaGF0KG1vbnN0ZXJPYmplY3QzLmludmVudG9yeUxlbmd0aCgpKS5pc0VxdWFsVG8oNCk7CisgICAgICBhc3NlcnRUaGF0KChJbnRlZ2VyKSBtb25zdGVyT2JqZWN0My5pbnZlbnRvcnkoMCkpLmlzRXF1YWxUbygoaW50KSBkYXRhWzNdKTsKKworICAgICAgZmJiLmNsZWFyKCk7CisgICAgICAgIGJiID0gQnl0ZUJ1ZmZlci53cmFwKGRhdGEpOworICAgICAgICBvZmZzZXQgPSBNb25zdGVyLmNyZWF0ZUludmVudG9yeVZlY3RvcihmYmIsIGJiKTsKKyAgICAgICAgc3RyID0gZmJiLmNyZWF0ZVN0cmluZygiQnl0ZU1vbnN0ZXIiKTsKKyAgICAgICAgTW9uc3Rlci5zdGFydE1vbnN0ZXIoZmJiKTsKKyAgICAgICAgTW9uc3Rlci5hZGROYW1lKGZiYiwgc3RyKTsKKyAgICAgICAgTW9uc3Rlci5hZGRJbnZlbnRvcnkoZmJiLCBvZmZzZXQpOworICAgICAgICBtb25zdGVyMSA9IE1vbnN0ZXIuZW5kTW9uc3RlcihmYmIpOworICAgICAgICBNb25zdGVyLmZpbmlzaE1vbnN0ZXJCdWZmZXIoZmJiLCBtb25zdGVyMSk7CisgICAgICAgIE1vbnN0ZXIgbW9uc3Rlck9iamVjdDQgPSBNb25zdGVyLmdldFJvb3RBc01vbnN0ZXIoZmJiLmRhdGFCdWZmZXIoKSk7CisKKyAgICAgIGFzc2VydFRoYXQobW9uc3Rlck9iamVjdDQuaW52ZW50b3J5TGVuZ3RoKCkpLmlzRXF1YWxUbyhkYXRhLmxlbmd0aCk7CisgICAgICBhc3NlcnRUaGF0KChJbnRlZ2VyKSBtb25zdGVyT2JqZWN0NC5pbnZlbnRvcnkoOCkpLmlzRXF1YWxUbygoaW50KSA4KTsKKworICAgICAgZmJiLmNsZWFyKCk7CisgICAgICAgIGJ5dGVbXSBsYXJnZURhdGEgPSBuZXcgYnl0ZVsxMDI0XTsKKyAgICAgICAgb2Zmc2V0ID0gZmJiLmNyZWF0ZUJ5dGVWZWN0b3IobGFyZ2VEYXRhKTsKKyAgICAgICAgc3RyID0gZmJiLmNyZWF0ZVN0cmluZygiQnl0ZU1vbnN0ZXIiKTsKKyAgICAgICAgTW9uc3Rlci5zdGFydE1vbnN0ZXIoZmJiKTsKKyAgICAgICAgTW9uc3Rlci5hZGROYW1lKGZiYiwgc3RyKTsKKyAgICAgICAgTW9uc3Rlci5hZGRJbnZlbnRvcnkoZmJiLCBvZmZzZXQpOworICAgICAgICBtb25zdGVyMSA9IE1vbnN0ZXIuZW5kTW9uc3RlcihmYmIpOworICAgICAgICBNb25zdGVyLmZpbmlzaE1vbnN0ZXJCdWZmZXIoZmJiLCBtb25zdGVyMSk7CisgICAgICAgIE1vbnN0ZXIgbW9uc3Rlck9iamVjdDUgPSBNb25zdGVyLmdldFJvb3RBc01vbnN0ZXIoZmJiLmRhdGFCdWZmZXIoKSk7CisKKyAgICAgIGFzc2VydFRoYXQobW9uc3Rlck9iamVjdDUuaW52ZW50b3J5TGVuZ3RoKCkpLmlzRXF1YWxUbyhsYXJnZURhdGEubGVuZ3RoKTsKKyAgICAgIGFzc2VydFRoYXQoKEludGVnZXIpIG1vbnN0ZXJPYmplY3Q1LmludmVudG9yeSgyNSkpLmlzRXF1YWxUbygoaW50KSBsYXJnZURhdGFbMjVdKTsKKworICAgICAgZmJiLmNsZWFyKCk7CisgICAgICAgIGJiID0gQnl0ZUJ1ZmZlci53cmFwKGxhcmdlRGF0YSk7CisgICAgICAgIGJiLnBvc2l0aW9uKDUxMik7CisgICAgICAgIEJ5dGVCdWZmZXIgYmIyID0gYmIuc2xpY2UoKTsKKyAgICAgIGFzc2VydFRoYXQoYmIyLmFycmF5T2Zmc2V0KCkpLmlzRXF1YWxUbyg1MTIpOworICAgICAgb2Zmc2V0ID0gZmJiLmNyZWF0ZUJ5dGVWZWN0b3IoYmIyKTsKKyAgICAgICAgc3RyID0gZmJiLmNyZWF0ZVN0cmluZygiQnl0ZU1vbnN0ZXIiKTsKKyAgICAgICAgTW9uc3Rlci5zdGFydE1vbnN0ZXIoZmJiKTsKKyAgICAgICAgTW9uc3Rlci5hZGROYW1lKGZiYiwgc3RyKTsKKyAgICAgICAgTW9uc3Rlci5hZGRJbnZlbnRvcnkoZmJiLCBvZmZzZXQpOworICAgICAgICBtb25zdGVyMSA9IE1vbnN0ZXIuZW5kTW9uc3RlcihmYmIpOworICAgICAgICBNb25zdGVyLmZpbmlzaE1vbnN0ZXJCdWZmZXIoZmJiLCBtb25zdGVyMSk7CisgICAgICAgIE1vbnN0ZXIgbW9uc3Rlck9iamVjdDYgPSBNb25zdGVyLmdldFJvb3RBc01vbnN0ZXIoZmJiLmRhdGFCdWZmZXIoKSk7CisKKyAgICAgIGFzc2VydFRoYXQobW9uc3Rlck9iamVjdDYuaW52ZW50b3J5TGVuZ3RoKCkpLmlzRXF1YWxUbyg1MTIpOworICAgICAgYXNzZXJ0VGhhdCgoSW50ZWdlcikgbW9uc3Rlck9iamVjdDYuaW52ZW50b3J5KDApKS5pc0VxdWFsVG8oKGludCkgbGFyZ2VEYXRhWzUxMl0pOworCisgICAgICBmYmIuY2xlYXIoKTsKKyAgICAgICAgYmIgPSBCeXRlQnVmZmVyLndyYXAobGFyZ2VEYXRhKTsKKyAgICAgICAgYmIubGltaXQoMjU2KTsKKyAgICAgICAgb2Zmc2V0ID0gZmJiLmNyZWF0ZUJ5dGVWZWN0b3IoYmIpOworICAgICAgICBzdHIgPSBmYmIuY3JlYXRlU3RyaW5nKCJCeXRlTW9uc3RlciIpOworICAgICAgICBNb25zdGVyLnN0YXJ0TW9uc3RlcihmYmIpOworICAgICAgICBNb25zdGVyLmFkZE5hbWUoZmJiLCBzdHIpOworICAgICAgICBNb25zdGVyLmFkZEludmVudG9yeShmYmIsIG9mZnNldCk7CisgICAgICAgIG1vbnN0ZXIxID0gTW9uc3Rlci5lbmRNb25zdGVyKGZiYik7CisgICAgICAgIE1vbnN0ZXIuZmluaXNoTW9uc3RlckJ1ZmZlcihmYmIsIG1vbnN0ZXIxKTsKKyAgICAgICAgTW9uc3RlciBtb25zdGVyT2JqZWN0NyA9IE1vbnN0ZXIuZ2V0Um9vdEFzTW9uc3RlcihmYmIuZGF0YUJ1ZmZlcigpKTsKKworICAgICAgYXNzZXJ0VGhhdChtb25zdGVyT2JqZWN0Ny5pbnZlbnRvcnlMZW5ndGgoKSkuaXNFcXVhbFRvKDI1Nik7CisKKyAgICAgIGZiYi5jbGVhcigpOworICAgICAgICBiYiA9IEJ5dGVCdWZmZXIuYWxsb2NhdGVEaXJlY3QoMjA0OCk7CisgICAgICAgIG9mZnNldCA9IGZiYi5jcmVhdGVCeXRlVmVjdG9yKGJiKTsKKyAgICAgICAgc3RyID0gZmJiLmNyZWF0ZVN0cmluZygiQnl0ZU1vbnN0ZXIiKTsKKyAgICAgICAgTW9uc3Rlci5zdGFydE1vbnN0ZXIoZmJiKTsKKyAgICAgICAgTW9uc3Rlci5hZGROYW1lKGZiYiwgc3RyKTsKKyAgICAgICAgTW9uc3Rlci5hZGRJbnZlbnRvcnkoZmJiLCBvZmZzZXQpOworICAgICAgICBtb25zdGVyMSA9IE1vbnN0ZXIuZW5kTW9uc3RlcihmYmIpOworICAgICAgICBNb25zdGVyLmZpbmlzaE1vbnN0ZXJCdWZmZXIoZmJiLCBtb25zdGVyMSk7CisgICAgICAgIE1vbnN0ZXIgbW9uc3Rlck9iamVjdDggPSBNb25zdGVyLmdldFJvb3RBc01vbnN0ZXIoZmJiLmRhdGFCdWZmZXIoKSk7CisKKyAgICAgIGFzc2VydFRoYXQobW9uc3Rlck9iamVjdDguaW52ZW50b3J5TGVuZ3RoKCkpLmlzRXF1YWxUbygyMDQ4KTsKKyAgICB9CisKKyAgICBAb3JnLmp1bml0LlRlc3QgcHVibGljIHZvaWQgVGVzdFNoYXJlZFN0cmluZ1Bvb2woKSB7CisgICAgICAgIEZsYXRCdWZmZXJCdWlsZGVyIGZiID0gbmV3IEZsYXRCdWZmZXJCdWlsZGVyKDEpOworICAgICAgICBTdHJpbmcgdGVzdFN0cmluZyA9ICJNeSBzdHJpbmciOworICAgICAgICBpbnQgb2Zmc2V0ID0gZmIuY3JlYXRlU2hhcmVkU3RyaW5nKHRlc3RTdHJpbmcpOworICAgICAgICBmb3IgKGludCBpPTA7IGk8IDEwOyBpKyspIHsKKyAgICAgICAgICBhc3NlcnRUaGF0KG9mZnNldCkuaXNFcXVhbFRvKGZiLmNyZWF0ZVNoYXJlZFN0cmluZyh0ZXN0U3RyaW5nKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAb3JnLmp1bml0LlRlc3QgcHVibGljIHZvaWQgVGVzdFNjYWxhck9wdGlvbmFsKCkgeworICAgICAgICBGbGF0QnVmZmVyQnVpbGRlciBmYmIgPSBuZXcgRmxhdEJ1ZmZlckJ1aWxkZXIoMSk7CisgICAgICAgIFNjYWxhclN0dWZmLnN0YXJ0U2NhbGFyU3R1ZmYoZmJiKTsKKyAgICAgICAgaW50IHBvcyA9IFNjYWxhclN0dWZmLmVuZFNjYWxhclN0dWZmKGZiYik7CisgICAgICAgIGZiYi5maW5pc2gocG9zKTsKKworICAgICAgICBTY2FsYXJTdHVmZiBzY2FsYXJTdHVmZiA9IFNjYWxhclN0dWZmLmdldFJvb3RBc1NjYWxhclN0dWZmKGZiYi5kYXRhQnVmZmVyKCkpOworICAgICAgYXNzZXJ0VGhhdChzY2FsYXJTdHVmZi5qdXN0STgoKSkuaXNFcXVhbFRvKChieXRlKTApOworICAgICAgYXNzZXJ0VGhhdChzY2FsYXJTdHVmZi5tYXliZUk4KCkpLmlzRXF1YWxUbygoYnl0ZSkwKTsKKyAgICAgIGFzc2VydFRoYXQoc2NhbGFyU3R1ZmYuZGVmYXVsdEk4KCkpLmlzRXF1YWxUbygoYnl0ZSk0Mik7CisgICAgICBhc3NlcnRUaGF0KHNjYWxhclN0dWZmLmp1c3RVOCgpKS5pc0VxdWFsVG8oMCk7CisgICAgICBhc3NlcnRUaGF0KHNjYWxhclN0dWZmLm1heWJlVTgoKSkuaXNFcXVhbFRvKDApOworICAgICAgYXNzZXJ0VGhhdChzY2FsYXJTdHVmZi5kZWZhdWx0VTgoKSkuaXNFcXVhbFRvKDQyKTsKKyAgICAgIGFzc2VydFRoYXQoc2NhbGFyU3R1ZmYuanVzdEkxNigpKS5pc0VxdWFsVG8oKHNob3J0KTApOworICAgICAgYXNzZXJ0VGhhdChzY2FsYXJTdHVmZi5tYXliZUkxNigpKS5pc0VxdWFsVG8oKHNob3J0KTApOworICAgICAgYXNzZXJ0VGhhdChzY2FsYXJTdHVmZi5kZWZhdWx0STE2KCkpLmlzRXF1YWxUbygoc2hvcnQpNDIpOworICAgICAgYXNzZXJ0VGhhdChzY2FsYXJTdHVmZi5qdXN0VTE2KCkpLmlzRXF1YWxUbygwKTsKKyAgICAgIGFzc2VydFRoYXQoc2NhbGFyU3R1ZmYubWF5YmVVMTYoKSkuaXNFcXVhbFRvKDApOworICAgICAgYXNzZXJ0VGhhdChzY2FsYXJTdHVmZi5kZWZhdWx0VTE2KCkpLmlzRXF1YWxUbyg0Mik7CisgICAgICBhc3NlcnRUaGF0KHNjYWxhclN0dWZmLmp1c3RJMzIoKSkuaXNFcXVhbFRvKDApOworICAgICAgYXNzZXJ0VGhhdChzY2FsYXJTdHVmZi5tYXliZUkzMigpKS5pc0VxdWFsVG8oMCk7CisgICAgICBhc3NlcnRUaGF0KHNjYWxhclN0dWZmLmRlZmF1bHRJMzIoKSkuaXNFcXVhbFRvKDQyKTsKKyAgICAgIGFzc2VydFRoYXQoc2NhbGFyU3R1ZmYuanVzdFUzMigpKS5pc0VxdWFsVG8oMEwpOworICAgICAgYXNzZXJ0VGhhdChzY2FsYXJTdHVmZi5tYXliZVUzMigpKS5pc0VxdWFsVG8oMEwpOworICAgICAgYXNzZXJ0VGhhdChzY2FsYXJTdHVmZi5kZWZhdWx0VTMyKCkpLmlzRXF1YWxUbyg0MkwpOworICAgICAgYXNzZXJ0VGhhdChzY2FsYXJTdHVmZi5qdXN0STY0KCkpLmlzRXF1YWxUbygwTCk7CisgICAgICBhc3NlcnRUaGF0KHNjYWxhclN0dWZmLm1heWJlSTY0KCkpLmlzRXF1YWxUbygwTCk7CisgICAgICBhc3NlcnRUaGF0KHNjYWxhclN0dWZmLmRlZmF1bHRJNjQoKSkuaXNFcXVhbFRvKDQyTCk7CisgICAgICBhc3NlcnRUaGF0KHNjYWxhclN0dWZmLmp1c3RVNjQoKSkuaXNFcXVhbFRvKDBMKTsKKyAgICAgIGFzc2VydFRoYXQoc2NhbGFyU3R1ZmYubWF5YmVVNjQoKSkuaXNFcXVhbFRvKDBMKTsKKyAgICAgIGFzc2VydFRoYXQoc2NhbGFyU3R1ZmYuZGVmYXVsdFU2NCgpKS5pc0VxdWFsVG8oNDJMKTsKKyAgICAgIGFzc2VydFRoYXQoc2NhbGFyU3R1ZmYuanVzdEYzMigpKS5pc0VxdWFsVG8oMC4wZik7CisgICAgICBhc3NlcnRUaGF0KHNjYWxhclN0dWZmLm1heWJlRjMyKCkpLmlzRXF1YWxUbygwZik7CisgICAgICBhc3NlcnRUaGF0KHNjYWxhclN0dWZmLmRlZmF1bHRGMzIoKSkuaXNFcXVhbFRvKDQyLjBmKTsKKyAgICAgIGFzc2VydFRoYXQoc2NhbGFyU3R1ZmYuanVzdEY2NCgpKS5pc0VxdWFsVG8oMC4wKTsKKyAgICAgIGFzc2VydFRoYXQoc2NhbGFyU3R1ZmYubWF5YmVGNjQoKSkuaXNFcXVhbFRvKDAuMCk7CisgICAgICBhc3NlcnRUaGF0KHNjYWxhclN0dWZmLmRlZmF1bHRGNjQoKSkuaXNFcXVhbFRvKDQyLjApOworICAgICAgYXNzZXJ0VGhhdChzY2FsYXJTdHVmZi5qdXN0Qm9vbCgpKS5pc0ZhbHNlKCk7CisgICAgICBhc3NlcnRUaGF0KHNjYWxhclN0dWZmLm1heWJlQm9vbCgpKS5pc0ZhbHNlKCk7CisgICAgICBhc3NlcnRUaGF0KHNjYWxhclN0dWZmLmRlZmF1bHRCb29sKCkpLmlzVHJ1ZSgpOworICAgICAgYXNzZXJ0VGhhdChzY2FsYXJTdHVmZi5qdXN0RW51bSgpKS5pc0VxdWFsVG8oT3B0aW9uYWxCeXRlLk5vbmUpOworICAgICAgYXNzZXJ0VGhhdChzY2FsYXJTdHVmZi5tYXliZUVudW0oKSkuaXNFcXVhbFRvKE9wdGlvbmFsQnl0ZS5Ob25lKTsKKyAgICAgIGFzc2VydFRoYXQoc2NhbGFyU3R1ZmYuZGVmYXVsdEVudW0oKSkuaXNFcXVhbFRvKE9wdGlvbmFsQnl0ZS5PbmUpOworCisgICAgICBhc3NlcnRUaGF0KHNjYWxhclN0dWZmLmhhc01heWJlSTgoKSkuaXNGYWxzZSgpOworICAgICAgYXNzZXJ0VGhhdChzY2FsYXJTdHVmZi5oYXNNYXliZUkxNigpKS5pc0ZhbHNlKCk7CisgICAgICBhc3NlcnRUaGF0KHNjYWxhclN0dWZmLmhhc01heWJlSTMyKCkpLmlzRmFsc2UoKTsKKyAgICAgIGFzc2VydFRoYXQoc2NhbGFyU3R1ZmYuaGFzTWF5YmVJNjQoKSkuaXNGYWxzZSgpOworICAgICAgYXNzZXJ0VGhhdChzY2FsYXJTdHVmZi5oYXNNYXliZVU4KCkpLmlzRmFsc2UoKTsKKyAgICAgIGFzc2VydFRoYXQoc2NhbGFyU3R1ZmYuaGFzTWF5YmVVMTYoKSkuaXNGYWxzZSgpOworICAgICAgYXNzZXJ0VGhhdChzY2FsYXJTdHVmZi5oYXNNYXliZVUzMigpKS5pc0ZhbHNlKCk7CisgICAgICBhc3NlcnRUaGF0KHNjYWxhclN0dWZmLmhhc01heWJlVTY0KCkpLmlzRmFsc2UoKTsKKyAgICAgIGFzc2VydFRoYXQoc2NhbGFyU3R1ZmYuaGFzTWF5YmVGMzIoKSkuaXNGYWxzZSgpOworICAgICAgYXNzZXJ0VGhhdChzY2FsYXJTdHVmZi5oYXNNYXliZUY2NCgpKS5pc0ZhbHNlKCk7CisgICAgICBhc3NlcnRUaGF0KHNjYWxhclN0dWZmLmhhc01heWJlQm9vbCgpKS5pc0ZhbHNlKCk7CisgICAgICBhc3NlcnRUaGF0KHNjYWxhclN0dWZmLmhhc01heWJlRW51bSgpKS5pc0ZhbHNlKCk7CisKKyAgICAgIGZiYi5jbGVhcigpOworCisgICAgICAgIFNjYWxhclN0dWZmLnN0YXJ0U2NhbGFyU3R1ZmYoZmJiKTsKKyAgICAgICAgU2NhbGFyU3R1ZmYuYWRkSnVzdEk4KGZiYiwgKGJ5dGUpNSk7CisgICAgICAgIFNjYWxhclN0dWZmLmFkZE1heWJlSTgoZmJiLCAoYnl0ZSk1KTsKKyAgICAgICAgU2NhbGFyU3R1ZmYuYWRkRGVmYXVsdEk4KGZiYiwgKGJ5dGUpNSk7CisgICAgICAgIFNjYWxhclN0dWZmLmFkZEp1c3RVOChmYmIsIDYpOworICAgICAgICBTY2FsYXJTdHVmZi5hZGRNYXliZVU4KGZiYiwgNik7CisgICAgICAgIFNjYWxhclN0dWZmLmFkZERlZmF1bHRVOChmYmIsIDYpOworICAgICAgICBTY2FsYXJTdHVmZi5hZGRKdXN0STE2KGZiYiwgKHNob3J0KTcpOworICAgICAgICBTY2FsYXJTdHVmZi5hZGRNYXliZUkxNihmYmIsIChzaG9ydCk3KTsKKyAgICAgICAgU2NhbGFyU3R1ZmYuYWRkRGVmYXVsdEkxNihmYmIsIChzaG9ydCk3KTsKKyAgICAgICAgU2NhbGFyU3R1ZmYuYWRkSnVzdFUxNihmYmIsIDgpOworICAgICAgICBTY2FsYXJTdHVmZi5hZGRNYXliZVUxNihmYmIsIDgpOworICAgICAgICBTY2FsYXJTdHVmZi5hZGREZWZhdWx0VTE2KGZiYiwgOCk7CisgICAgICAgIFNjYWxhclN0dWZmLmFkZEp1c3RJMzIoZmJiLCA5KTsKKyAgICAgICAgU2NhbGFyU3R1ZmYuYWRkTWF5YmVJMzIoZmJiLCA5KTsKKyAgICAgICAgU2NhbGFyU3R1ZmYuYWRkRGVmYXVsdEkzMihmYmIsIDkpOworICAgICAgICBTY2FsYXJTdHVmZi5hZGRKdXN0VTMyKGZiYiwgKGxvbmcpMTApOworICAgICAgICBTY2FsYXJTdHVmZi5hZGRNYXliZVUzMihmYmIsIChsb25nKTEwKTsKKyAgICAgICAgU2NhbGFyU3R1ZmYuYWRkRGVmYXVsdFUzMihmYmIsIChsb25nKTEwKTsKKyAgICAgICAgU2NhbGFyU3R1ZmYuYWRkSnVzdEk2NChmYmIsIDExTCk7CisgICAgICAgIFNjYWxhclN0dWZmLmFkZE1heWJlSTY0KGZiYiwgMTFMKTsKKyAgICAgICAgU2NhbGFyU3R1ZmYuYWRkRGVmYXVsdEk2NChmYmIsIDExTCk7CisgICAgICAgIFNjYWxhclN0dWZmLmFkZEp1c3RVNjQoZmJiLCAxMkwpOworICAgICAgICBTY2FsYXJTdHVmZi5hZGRNYXliZVU2NChmYmIsIDEyTCk7CisgICAgICAgIFNjYWxhclN0dWZmLmFkZERlZmF1bHRVNjQoZmJiLCAxMkwpOworICAgICAgICBTY2FsYXJTdHVmZi5hZGRKdXN0RjMyKGZiYiwgMTMuMGYpOworICAgICAgICBTY2FsYXJTdHVmZi5hZGRNYXliZUYzMihmYmIsIDEzLjBmKTsKKyAgICAgICAgU2NhbGFyU3R1ZmYuYWRkRGVmYXVsdEYzMihmYmIsIDEzLjBmKTsKKyAgICAgICAgU2NhbGFyU3R1ZmYuYWRkSnVzdEY2NChmYmIsIDE0LjApOworICAgICAgICBTY2FsYXJTdHVmZi5hZGRNYXliZUY2NChmYmIsIDE0LjApOworICAgICAgICBTY2FsYXJTdHVmZi5hZGREZWZhdWx0RjY0KGZiYiwgMTQuMCk7CisgICAgICAgIFNjYWxhclN0dWZmLmFkZEp1c3RCb29sKGZiYiwgdHJ1ZSk7CisgICAgICAgIFNjYWxhclN0dWZmLmFkZE1heWJlQm9vbChmYmIsIHRydWUpOworICAgICAgICBTY2FsYXJTdHVmZi5hZGREZWZhdWx0Qm9vbChmYmIsIHRydWUpOworICAgICAgICBTY2FsYXJTdHVmZi5hZGRKdXN0RW51bShmYmIsIE9wdGlvbmFsQnl0ZS5Ud28pOworICAgICAgICBTY2FsYXJTdHVmZi5hZGRNYXliZUVudW0oZmJiLCBPcHRpb25hbEJ5dGUuVHdvKTsKKyAgICAgICAgU2NhbGFyU3R1ZmYuYWRkRGVmYXVsdEVudW0oZmJiLCBPcHRpb25hbEJ5dGUuVHdvKTsKKworICAgICAgICBwb3MgPSBTY2FsYXJTdHVmZi5lbmRTY2FsYXJTdHVmZihmYmIpOworCisgICAgICAgIGZiYi5maW5pc2gocG9zKTsKKworICAgICAgICBzY2FsYXJTdHVmZiA9IFNjYWxhclN0dWZmLmdldFJvb3RBc1NjYWxhclN0dWZmKGZiYi5kYXRhQnVmZmVyKCkpOworCisgICAgICBhc3NlcnRUaGF0KHNjYWxhclN0dWZmLmp1c3RJOCgpKS5pc0VxdWFsVG8oKGJ5dGUpNSk7CisgICAgICBhc3NlcnRUaGF0KHNjYWxhclN0dWZmLm1heWJlSTgoKSkuaXNFcXVhbFRvKChieXRlKTUpOworICAgICAgYXNzZXJ0VGhhdChzY2FsYXJTdHVmZi5kZWZhdWx0STgoKSkuaXNFcXVhbFRvKChieXRlKTUpOworICAgICAgYXNzZXJ0VGhhdChzY2FsYXJTdHVmZi5qdXN0VTgoKSkuaXNFcXVhbFRvKDYpOworICAgICAgYXNzZXJ0VGhhdChzY2FsYXJTdHVmZi5tYXliZVU4KCkpLmlzRXF1YWxUbyg2KTsKKyAgICAgIGFzc2VydFRoYXQoc2NhbGFyU3R1ZmYuZGVmYXVsdFU4KCkpLmlzRXF1YWxUbyg2KTsKKyAgICAgIGFzc2VydFRoYXQoc2NhbGFyU3R1ZmYuanVzdEkxNigpKS5pc0VxdWFsVG8oKHNob3J0KTcpOworICAgICAgYXNzZXJ0VGhhdChzY2FsYXJTdHVmZi5tYXliZUkxNigpKS5pc0VxdWFsVG8oKHNob3J0KTcpOworICAgICAgYXNzZXJ0VGhhdChzY2FsYXJTdHVmZi5kZWZhdWx0STE2KCkpLmlzRXF1YWxUbygoc2hvcnQpNyk7CisgICAgICBhc3NlcnRUaGF0KHNjYWxhclN0dWZmLmp1c3RVMTYoKSkuaXNFcXVhbFRvKDgpOworICAgICAgYXNzZXJ0VGhhdChzY2FsYXJTdHVmZi5tYXliZVUxNigpKS5pc0VxdWFsVG8oOCk7CisgICAgICBhc3NlcnRUaGF0KHNjYWxhclN0dWZmLmRlZmF1bHRVMTYoKSkuaXNFcXVhbFRvKDgpOworICAgICAgYXNzZXJ0VGhhdChzY2FsYXJTdHVmZi5qdXN0STMyKCkpLmlzRXF1YWxUbyg5KTsKKyAgICAgIGFzc2VydFRoYXQoc2NhbGFyU3R1ZmYubWF5YmVJMzIoKSkuaXNFcXVhbFRvKDkpOworICAgICAgYXNzZXJ0VGhhdChzY2FsYXJTdHVmZi5kZWZhdWx0STMyKCkpLmlzRXF1YWxUbyg5KTsKKyAgICAgIGFzc2VydFRoYXQoc2NhbGFyU3R1ZmYuanVzdFUzMigpKS5pc0VxdWFsVG8oMTBMKTsKKyAgICAgIGFzc2VydFRoYXQoc2NhbGFyU3R1ZmYubWF5YmVVMzIoKSkuaXNFcXVhbFRvKDEwTCk7CisgICAgICBhc3NlcnRUaGF0KHNjYWxhclN0dWZmLmRlZmF1bHRVMzIoKSkuaXNFcXVhbFRvKDEwTCk7CisgICAgICBhc3NlcnRUaGF0KHNjYWxhclN0dWZmLmp1c3RJNjQoKSkuaXNFcXVhbFRvKDExTCk7CisgICAgICBhc3NlcnRUaGF0KHNjYWxhclN0dWZmLm1heWJlSTY0KCkpLmlzRXF1YWxUbygxMUwpOworICAgICAgYXNzZXJ0VGhhdChzY2FsYXJTdHVmZi5kZWZhdWx0STY0KCkpLmlzRXF1YWxUbygxMUwpOworICAgICAgYXNzZXJ0VGhhdChzY2FsYXJTdHVmZi5qdXN0VTY0KCkpLmlzRXF1YWxUbygxMkwpOworICAgICAgYXNzZXJ0VGhhdChzY2FsYXJTdHVmZi5tYXliZVU2NCgpKS5pc0VxdWFsVG8oMTJMKTsKKyAgICAgIGFzc2VydFRoYXQoc2NhbGFyU3R1ZmYuZGVmYXVsdFU2NCgpKS5pc0VxdWFsVG8oMTJMKTsKKyAgICAgIGFzc2VydFRoYXQoc2NhbGFyU3R1ZmYuanVzdEYzMigpKS5pc0VxdWFsVG8oMTMuMGYpOworICAgICAgYXNzZXJ0VGhhdChzY2FsYXJTdHVmZi5tYXliZUYzMigpKS5pc0VxdWFsVG8oMTMuMGYpOworICAgICAgYXNzZXJ0VGhhdChzY2FsYXJTdHVmZi5kZWZhdWx0RjMyKCkpLmlzRXF1YWxUbygxMy4wZik7CisgICAgICBhc3NlcnRUaGF0KHNjYWxhclN0dWZmLmp1c3RGNjQoKSkuaXNFcXVhbFRvKDE0LjApOworICAgICAgYXNzZXJ0VGhhdChzY2FsYXJTdHVmZi5tYXliZUY2NCgpKS5pc0VxdWFsVG8oMTQuMCk7CisgICAgICBhc3NlcnRUaGF0KHNjYWxhclN0dWZmLmRlZmF1bHRGNjQoKSkuaXNFcXVhbFRvKDE0LjApOworICAgICAgYXNzZXJ0VGhhdChzY2FsYXJTdHVmZi5qdXN0Qm9vbCgpKS5pc1RydWUoKTsKKyAgICAgIGFzc2VydFRoYXQoc2NhbGFyU3R1ZmYubWF5YmVCb29sKCkpLmlzVHJ1ZSgpOworICAgICAgYXNzZXJ0VGhhdChzY2FsYXJTdHVmZi5kZWZhdWx0Qm9vbCgpKS5pc1RydWUoKTsKKyAgICAgIGFzc2VydFRoYXQoc2NhbGFyU3R1ZmYuanVzdEVudW0oKSkuaXNFcXVhbFRvKE9wdGlvbmFsQnl0ZS5Ud28pOworICAgICAgYXNzZXJ0VGhhdChzY2FsYXJTdHVmZi5tYXliZUVudW0oKSkuaXNFcXVhbFRvKE9wdGlvbmFsQnl0ZS5Ud28pOworICAgICAgYXNzZXJ0VGhhdChzY2FsYXJTdHVmZi5kZWZhdWx0RW51bSgpKS5pc0VxdWFsVG8oT3B0aW9uYWxCeXRlLlR3byk7CisKKyAgICAgIGFzc2VydFRoYXQoc2NhbGFyU3R1ZmYuaGFzTWF5YmVJOCgpKS5pc1RydWUoKTsKKyAgICAgIGFzc2VydFRoYXQoc2NhbGFyU3R1ZmYuaGFzTWF5YmVJMTYoKSkuaXNUcnVlKCk7CisgICAgICBhc3NlcnRUaGF0KHNjYWxhclN0dWZmLmhhc01heWJlSTMyKCkpLmlzVHJ1ZSgpOworICAgICAgYXNzZXJ0VGhhdChzY2FsYXJTdHVmZi5oYXNNYXliZUk2NCgpKS5pc1RydWUoKTsKKyAgICAgIGFzc2VydFRoYXQoc2NhbGFyU3R1ZmYuaGFzTWF5YmVVOCgpKS5pc1RydWUoKTsKKyAgICAgIGFzc2VydFRoYXQoc2NhbGFyU3R1ZmYuaGFzTWF5YmVVMTYoKSkuaXNUcnVlKCk7CisgICAgICBhc3NlcnRUaGF0KHNjYWxhclN0dWZmLmhhc01heWJlVTMyKCkpLmlzVHJ1ZSgpOworICAgICAgYXNzZXJ0VGhhdChzY2FsYXJTdHVmZi5oYXNNYXliZVU2NCgpKS5pc1RydWUoKTsKKyAgICAgIGFzc2VydFRoYXQoc2NhbGFyU3R1ZmYuaGFzTWF5YmVGMzIoKSkuaXNUcnVlKCk7CisgICAgICBhc3NlcnRUaGF0KHNjYWxhclN0dWZmLmhhc01heWJlRjY0KCkpLmlzVHJ1ZSgpOworICAgICAgYXNzZXJ0VGhhdChzY2FsYXJTdHVmZi5oYXNNYXliZUJvb2woKSkuaXNUcnVlKCk7CisgICAgICBhc3NlcnRUaGF0KHNjYWxhclN0dWZmLmhhc01heWJlRW51bSgpKS5pc1RydWUoKTsKKyAgICB9CisKKyAgICBzdGF0aWMgdm9pZCBUZXN0T2JqZWN0KE1vbnN0ZXJUIG1vbnN0ZXIpIHsKKyAgICAgIGFzc2VydFRoYXQobW9uc3Rlci5nZXRIcCgpKS5pc0VxdWFsVG8oKHNob3J0KSA4MCk7CisgICAgICAvLyBkZWZhdWx0CisgICAgICBhc3NlcnRUaGF0KG1vbnN0ZXIuZ2V0TWFuYSgpKS5pc0VxdWFsVG8oKHNob3J0KSAxNTApOworCisgICAgICBhc3NlcnRUaGF0KG1vbnN0ZXIuZ2V0TmFtZSgpKS5pc0VxdWFsVG8oIk15TW9uc3RlciIpOworICAgICAgYXNzZXJ0VGhhdChtb25zdGVyLmdldENvbG9yKCkpLmlzRXF1YWxUbygoSW50ZWdlcikgQ29sb3IuQmx1ZSk7CisgICAgICAvLyBtb25zdGVyLmZyaWVuZGx5KCkgLy8gY2FuJ3QgYWNjZXNzLCBkZXByZWNhdGVkCisKKyAgICAgICAgVmVjM1QgcG9zID0gbW9uc3Rlci5nZXRQb3MoKTsKKyAgICAgIGFzc2VydFRoYXQocG9zLmdldFgoKSkuaXNFcXVhbFRvKDEuMGYpOworICAgICAgYXNzZXJ0VGhhdChwb3MuZ2V0WSgpKS5pc0VxdWFsVG8oMi4wZik7CisgICAgICBhc3NlcnRUaGF0KHBvcy5nZXRaKCkpLmlzRXF1YWxUbygzLjBmKTsKKyAgICAgIGFzc2VydFRoYXQocG9zLmdldFRlc3QxKCkpLmlzRXF1YWxUbygzLjApOworICAgICAgLy8gaXNzdWU6IGludCAhPSBieXRlCisgICAgICBhc3NlcnRUaGF0KHBvcy5nZXRUZXN0MigpKS5pc0VxdWFsVG8oKGludCkgQ29sb3IuR3JlZW4pOworICAgICAgVGVzdFQgdCA9IHBvcy5nZXRUZXN0MygpOworICAgICAgYXNzZXJ0VGhhdCh0LmdldEEoKSkuaXNFcXVhbFRvKChzaG9ydCkgNSk7CisgICAgICBhc3NlcnRUaGF0KHQuZ2V0QigpKS5pc0VxdWFsVG8oKGJ5dGUpIDYpOworCisgICAgICBhc3NlcnRUaGF0KG1vbnN0ZXIuZ2V0VGVzdCgpLmdldFR5cGUoKSkuaXNFcXVhbFRvKChieXRlKSBBbnkuTW9uc3Rlcik7CisgICAgICBNb25zdGVyVCBtb25zdGVyMiA9IChNb25zdGVyVCkgbW9uc3Rlci5nZXRUZXN0KCkuZ2V0VmFsdWUoKTsKKyAgICAgIGFzc2VydFRoYXQobW9uc3RlcjIgIT0gbnVsbCkuaXNUcnVlKCk7CisgICAgICBhc3NlcnRUaGF0KG1vbnN0ZXIyLmdldE5hbWUoKSkuaXNFcXVhbFRvKCJGcmVkIik7CisKKyAgICAgIGludFtdIGludiA9IG1vbnN0ZXIuZ2V0SW52ZW50b3J5KCk7CisgICAgICBhc3NlcnRUaGF0KGludi5sZW5ndGgpLmlzRXF1YWxUbyg1KTsKKyAgICAgIGludFtdIGV4cEludiA9IHswLCAxLCAyLCAzLCA0fTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpbnYubGVuZ3RoOyBpKyspCisgICAgICAgICAgYXNzZXJ0VGhhdChleHBJbnZbaV0pLmlzRXF1YWxUbyhpbnZbaV0pOworCisgICAgICAgIFRlc3RUW10gdGVzdDQgPSBtb25zdGVyLmdldFRlc3Q0KCk7CisgICAgICAgIFRlc3RUIHRlc3RfMCA9IHRlc3Q0WzBdOworICAgICAgICBUZXN0VCB0ZXN0XzEgPSB0ZXN0NFsxXTsKKyAgICAgIGFzc2VydFRoYXQodGVzdDQubGVuZ3RoKS5pc0VxdWFsVG8oMik7CisgICAgICBhc3NlcnRUaGF0KHRlc3RfMC5nZXRBKCkpLmlzRXF1YWxUbygoc2hvcnQpIDEwKTsKKyAgICAgIGFzc2VydFRoYXQodGVzdF8wLmdldEIoKSkuaXNFcXVhbFRvKChieXRlKSAyMCk7CisgICAgICBhc3NlcnRUaGF0KHRlc3RfMS5nZXRBKCkpLmlzRXF1YWxUbygoc2hvcnQpIDMwKTsKKyAgICAgIGFzc2VydFRoYXQodGVzdF8xLmdldEIoKSkuaXNFcXVhbFRvKChieXRlKSA0MCk7CisKKyAgICAgIFN0cmluZ1tdIHRlc3RhcnJheW9mc3RyaW5nID0gbW9uc3Rlci5nZXRUZXN0YXJyYXlvZnN0cmluZygpOworICAgICAgYXNzZXJ0VGhhdCh0ZXN0YXJyYXlvZnN0cmluZy5sZW5ndGgpLmlzRXF1YWxUbygyKTsKKyAgICAgIGFzc2VydFRoYXQodGVzdGFycmF5b2ZzdHJpbmdbMF0pLmlzRXF1YWxUbygidGVzdDEiKTsKKyAgICAgIGFzc2VydFRoYXQodGVzdGFycmF5b2ZzdHJpbmdbMV0pLmlzRXF1YWxUbygidGVzdDIiKTsKKworICAgICAgTW9uc3RlclRbXSB0ZXN0YXJyYXlvZnRhYmxlcyA9IG1vbnN0ZXIuZ2V0VGVzdGFycmF5b2Z0YWJsZXMoKTsKKyAgICAgIGFzc2VydFRoYXQodGVzdGFycmF5b2Z0YWJsZXMubGVuZ3RoKS5pc0VxdWFsVG8oMCk7CisKKyAgICAgIE1vbnN0ZXJUIGVuZW15ID0gbW9uc3Rlci5nZXRFbmVteSgpOworICAgICAgYXNzZXJ0VGhhdChlbmVteSAhPSBudWxsKS5pc1RydWUoKTsKKyAgICAgIGFzc2VydFRoYXQoZW5lbXkuZ2V0TmFtZSgpKS5pc0VxdWFsVG8oIkZyZWQiKTsKKworICAgICAgaW50W10gdGVzdG5lc3RlZGZsYXRidWZmZXIgPSBtb25zdGVyLmdldFRlc3RuZXN0ZWRmbGF0YnVmZmVyKCk7CisgICAgICBhc3NlcnRUaGF0KHRlc3RuZXN0ZWRmbGF0YnVmZmVyLmxlbmd0aCkuaXNFcXVhbFRvKDApOworCisgICAgICBhc3NlcnRUaGF0KG1vbnN0ZXIuZ2V0VGVzdGVtcHR5KCkgPT0gbnVsbCkuaXNUcnVlKCk7CisKKyAgICAgIGFzc2VydFRoYXQobW9uc3Rlci5nZXRUZXN0Ym9vbCgpKS5pc1RydWUoKTsKKworICAgICAgYm9vbGVhbltdIHRlc3RhcnJheW9mYm9vbHMgPSBtb25zdGVyLmdldFRlc3RhcnJheW9mYm9vbHMoKTsKKyAgICAgIGFzc2VydFRoYXQodGVzdGFycmF5b2Zib29scy5sZW5ndGgpLmlzRXF1YWxUbygzKTsKKyAgICAgIGFzc2VydFRoYXQodGVzdGFycmF5b2Zib29sc1swXSkuaXNUcnVlKCk7CisgICAgICBhc3NlcnRUaGF0KHRlc3RhcnJheW9mYm9vbHNbMV0pLmlzRmFsc2UoKTsKKyAgICAgIGFzc2VydFRoYXQodGVzdGFycmF5b2Zib29sc1syXSkuaXNUcnVlKCk7CisKKyAgICAgIGFzc2VydFRoYXQobW9uc3Rlci5nZXRUZXN0ZigpKS5pc0VxdWFsVG8oMy4xNDE1OWYpOworICAgICAgYXNzZXJ0VGhhdChtb25zdGVyLmdldFRlc3RmMigpKS5pc0VxdWFsVG8oMy4wZik7CisgICAgICBhc3NlcnRUaGF0KG1vbnN0ZXIuZ2V0VGVzdGYzKCkpLmlzRXF1YWxUbygwLjBmKTsKKyAgICAgIGFzc2VydFRoYXQobW9uc3Rlci5nZXRUZXN0ZjMoKSkuaXNFcXVhbFRvKDAuMGYpOworCisgICAgICBBYmlsaXR5VFtdIHRlc3RhcnJheW9mc29ydGVkc3RydWN0ID0gbW9uc3Rlci5nZXRUZXN0YXJyYXlvZnNvcnRlZHN0cnVjdCgpOworICAgICAgYXNzZXJ0VGhhdCh0ZXN0YXJyYXlvZnNvcnRlZHN0cnVjdC5sZW5ndGgpLmlzRXF1YWxUbygzKTsKKyAgICAgIGFzc2VydFRoYXQodGVzdGFycmF5b2Zzb3J0ZWRzdHJ1Y3RbMF0uZ2V0SWQoKSkuaXNFcXVhbFRvKChsb25nKSAwKTsKKyAgICAgIGFzc2VydFRoYXQodGVzdGFycmF5b2Zzb3J0ZWRzdHJ1Y3RbMV0uZ2V0SWQoKSkuaXNFcXVhbFRvKChsb25nKSAxKTsKKyAgICAgIGFzc2VydFRoYXQodGVzdGFycmF5b2Zzb3J0ZWRzdHJ1Y3RbMl0uZ2V0SWQoKSkuaXNFcXVhbFRvKChsb25nKSA1KTsKKyAgICAgIGFzc2VydFRoYXQodGVzdGFycmF5b2Zzb3J0ZWRzdHJ1Y3RbMF0uZ2V0RGlzdGFuY2UoKSkuaXNFcXVhbFRvKChsb25nKSA0NSk7CisgICAgICBhc3NlcnRUaGF0KHRlc3RhcnJheW9mc29ydGVkc3RydWN0WzFdLmdldERpc3RhbmNlKCkpLmlzRXF1YWxUbygobG9uZykgMjEpOworICAgICAgYXNzZXJ0VGhhdCh0ZXN0YXJyYXlvZnNvcnRlZHN0cnVjdFsyXS5nZXREaXN0YW5jZSgpKS5pc0VxdWFsVG8oKGxvbmcpIDEyKTsKKworICAgICAgaW50W10gZmxleCA9IG1vbnN0ZXIuZ2V0RmxleCgpOworICAgICAgYXNzZXJ0VGhhdChmbGV4Lmxlbmd0aCkuaXNFcXVhbFRvKDApOworCisgICAgICBsb25nW10gdmVjdG9yT2ZMb25ncyA9IG1vbnN0ZXIuZ2V0VmVjdG9yT2ZMb25ncygpOworICAgICAgYXNzZXJ0VGhhdCh2ZWN0b3JPZkxvbmdzLmxlbmd0aCkuaXNFcXVhbFRvKDUpOworICAgICAgbG9uZyBsID0gMTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB2ZWN0b3JPZkxvbmdzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgYXNzZXJ0VGhhdCh2ZWN0b3JPZkxvbmdzW2ldKS5pc0VxdWFsVG8obCk7CisgICAgICAgICAgbCAqPSAxMDA7CisgICAgICAgIH0KKworICAgICAgICBkb3VibGVbXSB2ZWN0b3JPZkRvdWJsZXMgPSBtb25zdGVyLmdldFZlY3Rvck9mRG91YmxlcygpOworICAgICAgYXNzZXJ0VGhhdCh2ZWN0b3JPZkRvdWJsZXMubGVuZ3RoKS5pc0VxdWFsVG8oMyk7CisgICAgICBhc3NlcnRUaGF0KHZlY3Rvck9mRG91Ymxlc1swXSkuaXNFcXVhbFRvKC0xLjc5NzY5MzEzNDg2MjMxNTdFMzA4KTsKKyAgICAgIGFzc2VydFRoYXQodmVjdG9yT2ZEb3VibGVzWzFdKS5pc0VxdWFsVG8oMC4wKTsKKyAgICAgIGFzc2VydFRoYXQodmVjdG9yT2ZEb3VibGVzWzJdKS5pc0VxdWFsVG8oMS43OTc2OTMxMzQ4NjIzMTU3RTMwOCk7CisKKyAgICAgIGFzc2VydFRoYXQobW9uc3Rlci5nZXRQYXJlbnROYW1lc3BhY2VUZXN0KCkgPT0gbnVsbCkuaXNUcnVlKCk7CisgICAgICBSZWZlcnJhYmxlVFtdIHZlY3Rvck9mUmVmZXJyYWJsZXMgPSBtb25zdGVyLmdldFZlY3Rvck9mUmVmZXJyYWJsZXMoKTsKKyAgICAgIGFzc2VydFRoYXQodmVjdG9yT2ZSZWZlcnJhYmxlcy5sZW5ndGgpLmlzRXF1YWxUbygwKTsKKworICAgICAgYXNzZXJ0VGhhdChtb25zdGVyLmdldFNpZ25lZEVudW0oKSkuaXNFcXVhbFRvKChieXRlKSAtMSk7CisgICAgfQorCisgICAgc3RhdGljIHZvaWQgVGVzdFBhY2tVbnBhY2soQnl0ZUJ1ZmZlciBiYikgeworICAgICAgICBNb25zdGVyIG0gPSBNb25zdGVyLmdldFJvb3RBc01vbnN0ZXIoYmIpOworICAgICAgICBNb25zdGVyVCBtT2JqZWN0ID0gbS51bnBhY2soKTsKKyAgICAgICAgVGVzdE9iamVjdChtT2JqZWN0KTsKKyAgICAgICAgRmxhdEJ1ZmZlckJ1aWxkZXIgZmJiID0gbmV3IEZsYXRCdWZmZXJCdWlsZGVyKCk7CisgICAgICAgIGludCBtb25zdGVyID0gTW9uc3Rlci5wYWNrKGZiYiwgbU9iamVjdCk7CisgICAgICAgIE1vbnN0ZXIuZmluaXNoTW9uc3RlckJ1ZmZlcihmYmIsIG1vbnN0ZXIpOworICAgICAgICBUZXN0QnVmZmVyKGZiYi5kYXRhQnVmZmVyKCkpOworCisgICAgICAgIGJ5dGVbXSBieXRlcyA9IG1PYmplY3Quc2VyaWFsaXplVG9CaW5hcnkoKTsKKyAgICAgICAgTW9uc3RlclQgbmV3TW9uc3RlclQgPSBNb25zdGVyVC5kZXNlcmlhbGl6ZUZyb21CaW5hcnkoYnl0ZXMpOworICAgICAgICBUZXN0T2JqZWN0KG5ld01vbnN0ZXJUKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy9qYXZhL3NyYy90ZXN0L2phdmEvTXlHYW1lIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvamF2YS9zcmMvdGVzdC9qYXZhL015R2FtZQpuZXcgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAwMDAwMDAwLi4wYmE5MThlCi0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvamF2YS9zcmMvdGVzdC9qYXZhL015R2FtZQpAQCAtMCwwICsxIEBACisuLi8uLi8uLi8uLi90ZXN0cy9NeUdhbWUKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy9qYXZhL3NyYy90ZXN0L2phdmEvTmFtZXNwYWNlQSBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL2phdmEvc3JjL3Rlc3QvamF2YS9OYW1lc3BhY2VBCm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAwMDAuLjM3YThkODkKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy9qYXZhL3NyYy90ZXN0L2phdmEvTmFtZXNwYWNlQQpAQCAtMCwwICsxIEBACisuLi8uLi8uLi8uLi90ZXN0cy9uYW1lc3BhY2VfdGVzdC9OYW1lc3BhY2VBClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvamF2YS9zcmMvdGVzdC9qYXZhL05hbWVzcGFjZUMgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy9qYXZhL3NyYy90ZXN0L2phdmEvTmFtZXNwYWNlQwpuZXcgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAwMDAwMDAwLi5jMWU0NGE4Ci0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvamF2YS9zcmMvdGVzdC9qYXZhL05hbWVzcGFjZUMKQEAgLTAsMCArMSBAQAorLi4vLi4vLi4vLi4vdGVzdHMvbmFtZXNwYWNlX3Rlc3QvTmFtZXNwYWNlQwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL2phdmEvc3JjL3Rlc3QvamF2YS9vcHRpb25hbF9zY2FsYXJzIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvamF2YS9zcmMvdGVzdC9qYXZhL29wdGlvbmFsX3NjYWxhcnMKbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uNDRhMzVmOQotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL2phdmEvc3JjL3Rlc3QvamF2YS9vcHRpb25hbF9zY2FsYXJzCkBAIC0wLDAgKzEgQEAKKy4uLy4uLy4uLy4uL3Rlc3RzL29wdGlvbmFsX3NjYWxhcnMKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy9qYXZhL3NyYy90ZXN0L2phdmEvdW5pb25fdmVjdG9yIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvamF2YS9zcmMvdGVzdC9qYXZhL3VuaW9uX3ZlY3RvcgpuZXcgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAwMDAwMDAwLi5jYzgyMjIxCi0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvamF2YS9zcmMvdGVzdC9qYXZhL3VuaW9uX3ZlY3RvcgpAQCAtMCwwICsxIEBACisuLi8uLi8uLi8uLi90ZXN0cy91bmlvbl92ZWN0b3IKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy9qYXZhL3NyYy90ZXN0L3Jlc291cmNlcy9tb25zdGVyZGF0YV90ZXN0Lm1vbiBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL2phdmEvc3JjL3Rlc3QvcmVzb3VyY2VzL21vbnN0ZXJkYXRhX3Rlc3QubW9uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRhMGVkODYKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy9qYXZhL3NyYy90ZXN0L3Jlc291cmNlcy9tb25zdGVyZGF0YV90ZXN0Lm1vbgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy9rb3RsaW4vYmVuY2htYXJrL2J1aWxkLmdyYWRsZS5rdHMgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy9rb3RsaW4vYmVuY2htYXJrL2J1aWxkLmdyYWRsZS5rdHMKaW5kZXggMjI5NGU0Yy4uODU5NWMwMiAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMva290bGluL2JlbmNobWFyay9idWlsZC5ncmFkbGUua3RzCisrKyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL2tvdGxpbi9iZW5jaG1hcmsvYnVpbGQuZ3JhZGxlLmt0cwpAQCAtMSwxNSArMSwxNSBAQAogaW1wb3J0IG9yZy5qZXRicmFpbnMua290bGluLmlyLmJhY2tlbmQuanMuY29tcGlsZQogCiBwbHVnaW5zIHsKLSAga290bGluKCJtdWx0aXBsYXRmb3JtIikgdmVyc2lvbiAiMS40LjIwIgorICBrb3RsaW4oIm11bHRpcGxhdGZvcm0iKQogICBpZCgib3JnLmpldGJyYWlucy5rb3RsaW4ucGx1Z2luLmFsbG9wZW4iKSB2ZXJzaW9uICIxLjQuMjAiCi0gIGlkKCJvcmcuamV0YnJhaW5zLmtvdGxpbnguYmVuY2htYXJrIikgdmVyc2lvbiAiMC4zLjAiCisgIGlkKCJvcmcuamV0YnJhaW5zLmtvdGxpbnguYmVuY2htYXJrIikgdmVyc2lvbiAiMC40LjIiCiAgIGlkKCJpby5tb3JldGhhbi5qbWhyZXBvcnQiKSB2ZXJzaW9uICIwLjkuMCIKLSAgaWQoImRlLnVuZGVyY291Y2guZG93bmxvYWQiKSB2ZXJzaW9uICI0LjEuMSIKKyAgaWQoImRlLnVuZGVyY291Y2guZG93bmxvYWQiKQogfQogCiAvLyBhbGxPcGVuIHBsdWdpbiBpcyBuZWVkZWQgZm9yIHRoZSBiZW5jaG1hcmsgYW5ub3RhdGlvbnMuCi0vLyBmb3IgbW9yZSBpbmZvbWF0aW9uLCBzZWUgaHR0cHM6Ly9naXRodWIuY29tL0tvdGxpbi9rb3RsaW54LWJlbmNobWFyayNncmFkbGUtcGx1Z2luCisvLyBmb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9Lb3RsaW4va290bGlueC1iZW5jaG1hcmsjZ3JhZGxlLXBsdWdpbgogYWxsT3BlbiB7CiAgIGFubm90YXRpb24oIm9yZy5vcGVuamRrLmptaC5hbm5vdGF0aW9ucy5TdGF0ZSIpCiB9CkBAIC00NSw1NCArNDUsMjUgQEAKIGtvdGxpbiB7CiAgIGp2bSB7CiAgICAgd2l0aEphdmEoKQotICAgIGNvbXBpbGF0aW9ucy5hbGwgewotICAgICAga290bGluT3B0aW9ucyB7Ci0gICAgICAgIGp2bVRhcmdldCA9IEphdmFWZXJzaW9uLlZFUlNJT05fMV84LnRvU3RyaW5nKCkKLSAgICAgIH0KLSAgICB9CiAgIH0KIAogICBzb3VyY2VTZXRzIHsKIAogICAgIGFsbCB7CiAgICAgICBsYW5ndWFnZVNldHRpbmdzLmVuYWJsZUxhbmd1YWdlRmVhdHVyZSgiSW5saW5lQ2xhc3NlcyIpCi0gICAgICBsYW5ndWFnZVNldHRpbmdzLnVzZUV4cGVyaW1lbnRhbEFubm90YXRpb24oImtvdGxpbi5FeHBlcmltZW50YWxVbnNpZ25lZFR5cGVzIikKICAgICB9CiAKLSAgICB2YWwgY29tbW9uVGVzdCBieSBnZXR0aW5nIHsKLSAgICAgIGRlcGVuZGVuY2llcyB7Ci0gICAgICAgIGltcGxlbWVudGF0aW9uKGtvdGxpbigidGVzdC1jb21tb24iKSkKLSAgICAgICAgaW1wbGVtZW50YXRpb24oa290bGluKCJ0ZXN0LWFubm90YXRpb25zLWNvbW1vbiIpKQotICAgICAgfQotICAgIH0KLSAgICB2YWwganZtVGVzdCBieSBnZXR0aW5nIHsKLSAgICAgIGRlcGVuZGVuY2llcyB7Ci0gICAgICAgIGltcGxlbWVudGF0aW9uKGtvdGxpbigidGVzdC1qdW5pdCIpKQotICAgICAgfQotICAgIH0KICAgICB2YWwganZtTWFpbiBieSBnZXR0aW5nIHsKICAgICAgIGRlcGVuZGVuY2llcyB7Ci0gICAgICAgIGltcGxlbWVudGF0aW9uKCJvcmcuamV0YnJhaW5zLmtvdGxpbng6a290bGlueC1iZW5jaG1hcmstcnVudGltZTowLjMuMCIpCiAgICAgICAgIGltcGxlbWVudGF0aW9uKGtvdGxpbigic3RkbGliLWNvbW1vbiIpKQogICAgICAgICBpbXBsZW1lbnRhdGlvbihwcm9qZWN0KCI6ZmxhdGJ1ZmZlcnMta290bGluIikpCi0gICAgICAgIGltcGxlbWVudGF0aW9uKCJvcmcuamV0YnJhaW5zLmtvdGxpbjprb3RsaW4tc3RkbGliLWpkazgiKQotICAgICAgICBpbXBsZW1lbnRhdGlvbigib3JnLmpldGJyYWlucy5rb3RsaW54OmtvdGxpbngtY29yb3V0aW5lcy1jb3JlLWp2bToxLjQuMSIpCisgICAgICAgIGltcGxlbWVudGF0aW9uKGxpYnMua290bGlueC5iZW5jaG1hcmsucnVudGltZSkKIAotICAgICAgICAvL21vc2hpCi0gICAgICAgIGltcGxlbWVudGF0aW9uKCJjb20uc3F1YXJldXAubW9zaGk6bW9zaGkta290bGluOjEuMTEuMCIpCi0KLSAgICAgICAgLy9nc29uCi0gICAgICAgIGltcGxlbWVudGF0aW9uKCJjb20uZ29vZ2xlLmNvZGUuZ3Nvbjpnc29uOjIuOC41IikKKyAgICAgICAgLy8ganNvbiBzZXJpYWxpemVycworICAgICAgICBpbXBsZW1lbnRhdGlvbihsaWJzLm1vc2hpLmtvdGxpbikKKyAgICAgICAgaW1wbGVtZW50YXRpb24obGlicy5nc29uKQogICAgICAgfQogICAgIH0KLQotICAgIC8qIFRhcmdldHMgY29uZmlndXJhdGlvbiBvbWl0dGVkLgotICAgICAqICBUbyBmaW5kIG91dCBob3cgdG8gY29uZmlndXJlIHRoZSB0YXJnZXRzLCBwbGVhc2UgZm9sbG93IHRoZSBsaW5rOgotICAgICAqICBodHRwczovL2tvdGxpbmxhbmcub3JnL2RvY3MvcmVmZXJlbmNlL2J1aWxkaW5nLW1wcC13aXRoLWdyYWRsZS5odG1sI3NldHRpbmctdXAtdGFyZ2V0cwotICAgICAqLwotICAgIHRhcmdldHMgewotICAgICAgdGFyZ2V0RnJvbVByZXNldChwcmVzZXRzLmdldEF0KCJqdm0iKSkKLSAgICB9CiAgIH0KIH0KIApAQCAtMTA1LDcgKzc2LDMgQEAKICAgZGVzdChGaWxlKCIke3Byb2plY3QucHJvamVjdERpci5hYnNvbHV0ZVBhdGh9L3NyYy9qdm1NYWluL3Jlc291cmNlcyIpKQogICBvdmVyd3JpdGUoZmFsc2UpCiB9Ci0KLXByb2plY3QudGFza3MubmFtZWQoImNvbXBpbGVLb3RsaW5Kdm0iKSB7Ci0gIGRlcGVuZHNPbigiZG93bmxvYWRNdWx0aXBsZUZpbGVzIikKLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL2tvdGxpbi9iZW5jaG1hcmsvc3JjL2p2bU1haW4vamF2YSBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL2tvdGxpbi9iZW5jaG1hcmsvc3JjL2p2bU1haW4vamF2YQppbmRleCAyMjYwMTk2Li5mZDYyYTg3IDEyMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy9rb3RsaW4vYmVuY2htYXJrL3NyYy9qdm1NYWluL2phdmEKKysrIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMva290bGluL2JlbmNobWFyay9zcmMvanZtTWFpbi9qYXZhCkBAIC0xICsxIEBACi0uLi8uLi8uLi8uLi9qYXZhLwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKKy4uLy4uLy4uLy4uL2phdmEvc3JjL21haW4vamF2YQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL2tvdGxpbi9idWlsZC5ncmFkbGUua3RzIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMva290bGluL2J1aWxkLmdyYWRsZS5rdHMKaW5kZXggNDU1ZWUwZC4uYjE4OTA3NSAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMva290bGluL2J1aWxkLmdyYWRsZS5rdHMKKysrIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMva290bGluL2J1aWxkLmdyYWRsZS5rdHMKQEAgLTEsMjIgKzEsMjQgQEAKIHBsdWdpbnMgewotICBpZCgiY29tLmRpZmZwbHVnLnNwb3RsZXNzIikgdmVyc2lvbiAiNS44LjIiCisgIGlkKCJjb20uZGlmZnBsdWcuc3BvdGxlc3MiKSB2ZXJzaW9uICI2LjMuMCIKIH0KIAogZ3JvdXAgPSAiY29tLmdvb2dsZS5mbGF0YnVmZmVycyIKIHZlcnNpb24gPSAiMi4wLjAtU05BUFNIT1QiCiAKLXN1YnByb2plY3RzIHsKLQorYnVpbGRzY3JpcHQgewogICByZXBvc2l0b3JpZXMgewotICAgIG1hdmVuIHsgc2V0VXJsKCJodHRwczovL3BsdWdpbnMuZ3JhZGxlLm9yZy9tMi8iKSB9CisgICAgZ3JhZGxlUGx1Z2luUG9ydGFsKCkKKyAgICBnb29nbGUoKQogICAgIG1hdmVuQ2VudHJhbCgpCiAgIH0KKyAgZGVwZW5kZW5jaWVzIHsKKyAgICBjbGFzc3BhdGgobGlicy5idW5kbGVzLnBsdWdpbnMpCisgIH0KIH0KIAotYnVpbGRzY3JpcHQgeworYWxscHJvamVjdHMgewogICByZXBvc2l0b3JpZXMgewotICAgIG1hdmVuIHsgc2V0VXJsKCJodHRwczovL3BsdWdpbnMuZ3JhZGxlLm9yZy9tMi8iKSB9Ci0gICAgZ3JhZGxlUGx1Z2luUG9ydGFsKCkKKyAgICBnb29nbGUoKQogICAgIG1hdmVuQ2VudHJhbCgpCiAgIH0KIH0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL2tvdGxpbi9mbGF0YnVmZmVycy1rb3RsaW4vYnVpbGQuZ3JhZGxlLmt0cyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL2tvdGxpbi9mbGF0YnVmZmVycy1rb3RsaW4vYnVpbGQuZ3JhZGxlLmt0cwppbmRleCBiNzQ4MDdlLi5mMzg0MzIwIDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy9rb3RsaW4vZmxhdGJ1ZmZlcnMta290bGluL2J1aWxkLmdyYWRsZS5rdHMKKysrIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMva290bGluL2ZsYXRidWZmZXJzLWtvdGxpbi9idWlsZC5ncmFkbGUua3RzCkBAIC0xLDUgKzEsNSBAQAogcGx1Z2lucyB7Ci0gIGtvdGxpbigibXVsdGlwbGF0Zm9ybSIpIHZlcnNpb24gIjEuNC4yMCIKKyAga290bGluKCJtdWx0aXBsYXRmb3JtIikKIH0KIAogZ3JvdXAgPSAiY29tLmdvb2dsZS5mbGF0YnVmZmVycy5rb3RsaW4iCkBAIC0xMCwxMyArMTAsMTMgQEAKICAganZtKCkKICAganMgewogICAgIGJyb3dzZXIgewotICAgICAgYmluYXJpZXMuZXhlY3V0YWJsZSgpCi0gICAgICB0ZXN0VGFzayB7CisgICAgIHRlc3RUYXNrIHsKICAgICAgICAgdXNlS2FybWEgewogICAgICAgICAgIHVzZUNocm9tZUhlYWRsZXNzKCkKICAgICAgICAgfQogICAgICAgfQogICAgIH0KKyAgICBiaW5hcmllcy5leGVjdXRhYmxlKCkKICAgfQogICBtYWNvc1g2NCgpCiAgIGlvc0FybTMyKCkKQEAgLTMyLDggKzMyLDcgQEAKIAogICAgIHZhbCBjb21tb25UZXN0IGJ5IGdldHRpbmcgewogICAgICAgZGVwZW5kZW5jaWVzIHsKLSAgICAgICAgaW1wbGVtZW50YXRpb24oa290bGluKCJ0ZXN0LWNvbW1vbiIpKQotICAgICAgICBpbXBsZW1lbnRhdGlvbihrb3RsaW4oInRlc3QtYW5ub3RhdGlvbnMtY29tbW9uIikpCisgICAgICAgIGltcGxlbWVudGF0aW9uKGtvdGxpbigidGVzdCIpKQogICAgICAgfQogICAgIH0KICAgICB2YWwganZtVGVzdCBieSBnZXR0aW5nIHsKQEAgLTQzLDkgKzQyLDYgQEAKICAgICB9CiAgICAgdmFsIGp2bU1haW4gYnkgZ2V0dGluZyB7CiAgICAgICBrb3RsaW4uc3JjRGlyKCJqYXZhIikKLSAgICAgIGRlcGVuZGVuY2llcyB7Ci0gICAgICAgIGltcGxlbWVudGF0aW9uKCJvcmcuamV0YnJhaW5zLmtvdGxpbng6a290bGlueC1jb3JvdXRpbmVzLWNvcmUtanZtOjEuNC4xIikKLSAgICAgIH0KICAgICB9CiAKICAgICB2YWwganNNYWluIGJ5IGdldHRpbmcgewpAQCAtNzksMTkgKzc1LDEyIEBACiAKICAgICBhbGwgewogICAgICAgbGFuZ3VhZ2VTZXR0aW5ncy5lbmFibGVMYW5ndWFnZUZlYXR1cmUoIklubGluZUNsYXNzZXMiKQotICAgICAgbGFuZ3VhZ2VTZXR0aW5ncy51c2VFeHBlcmltZW50YWxBbm5vdGF0aW9uKCJrb3RsaW4uRXhwZXJpbWVudGFsVW5zaWduZWRUeXBlcyIpCisgICAgICBsYW5ndWFnZVNldHRpbmdzLm9wdEluKCJrb3RsaW4uRXhwZXJpbWVudGFsVW5zaWduZWRUeXBlcyIpCiAgICAgfQogICB9Cit9CiAKLSAgLyogVGFyZ2V0cyBjb25maWd1cmF0aW9uIG9taXR0ZWQuCi0gICAqICBUbyBmaW5kIG91dCBob3cgdG8gY29uZmlndXJlIHRoZSB0YXJnZXRzLCBwbGVhc2UgZm9sbG93IHRoZSBsaW5rOgotICAgKiAgaHR0cHM6Ly9rb3RsaW5sYW5nLm9yZy9kb2NzL3JlZmVyZW5jZS9idWlsZGluZy1tcHAtd2l0aC1ncmFkbGUuaHRtbCNzZXR0aW5nLXVwLXRhcmdldHMgKi8KLSAgdGFyZ2V0cyB7Ci0gICAgdGFyZ2V0RnJvbVByZXNldChwcmVzZXRzLmdldEF0KCJqdm0iKSkKLSAgICB0YXJnZXRGcm9tUHJlc2V0KHByZXNldHMuZ2V0QXQoImpzIikpCi0gICAgdGFyZ2V0RnJvbVByZXNldChwcmVzZXRzLmdldEF0KCJtYWNvc1g2NCIpKQotICAgIHRhcmdldEZyb21QcmVzZXQocHJlc2V0cy5nZXRBdCgiaW9zQXJtMzIiKSkKLSAgICB0YXJnZXRGcm9tUHJlc2V0KHByZXNldHMuZ2V0QXQoImlvc0FybTY0IikpCi0gICAgdGFyZ2V0RnJvbVByZXNldChwcmVzZXRzLmdldEF0KCJpb3NYNjQiKSkKLSAgfQorLy8gRml4ZXMgSlMgaXNzdWU6IGh0dHBzOi8veW91dHJhY2suamV0YnJhaW5zLmNvbS9pc3N1ZS9LVC00OTEwOQorcm9vdFByb2plY3QucGx1Z2lucy53aXRoVHlwZTxvcmcuamV0YnJhaW5zLmtvdGxpbi5ncmFkbGUudGFyZ2V0cy5qcy5ub2RlanMuTm9kZUpzUm9vdFBsdWdpbj4geworICByb290UHJvamVjdC50aGU8b3JnLmpldGJyYWlucy5rb3RsaW4uZ3JhZGxlLnRhcmdldHMuanMubm9kZWpzLk5vZGVKc1Jvb3RFeHRlbnNpb24+KCkubm9kZVZlcnNpb24gPSAiMTYuMC4wIgogfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMva290bGluL2dyYWRsZS5wcm9wZXJ0aWVzIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMva290bGluL2dyYWRsZS5wcm9wZXJ0aWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjYjQyZTMKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy9rb3RsaW4vZ3JhZGxlLnByb3BlcnRpZXMKQEAgLTAsMCArMSwxNCBAQAorI0dyYWRsZQorCitvcmcuZ3JhZGxlLnBhcmFsbGVsPXRydWUKK29yZy5ncmFkbGUuY2FjaGluZz10cnVlCisKKyNLb3RsaW4KK2tvdGxpbi5jb2RlLnN0eWxlPW9mZmljaWFsCisKKyNNUFAKK2tvdGxpbi5tcHAuZW5hYmxlR3JhbnVsYXJTb3VyY2VTZXRzTWV0YWRhdGE9dHJ1ZQora290bGluLm5hdGl2ZS5lbmFibGVEZXBlbmRlbmN5UHJvcGFnYXRpb249ZmFsc2UKK2tvdGxpbi5tcHAuZW5hYmxlQ29tcGF0aWJpbGl0eU1ldGFkYXRhVmFyaWFudD10cnVlCitrb3RsaW4ubXBwLnN0YWJpbGl0eS5ub3dhcm49dHJ1ZQora290bGluLmluY3JlbWVudGFsLm11bHRpcGxhdGZvcm09dHJ1ZQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMva290bGluL2dyYWRsZS9saWJzLnZlcnNpb25zLnRvbWwgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy9rb3RsaW4vZ3JhZGxlL2xpYnMudmVyc2lvbnMudG9tbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wODlmN2U3Ci0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMva290bGluL2dyYWRsZS9saWJzLnZlcnNpb25zLnRvbWwKQEAgLTAsMCArMSwyMCBAQAorW3ZlcnNpb25zXQorcGx1Z2luLWtvdGxpbiA9ICIxLjYuMTAiCitwbHVnaW4tZ3ZlciA9ICIwLjQyLjAiCitrb3RsaW54LWJlbmNobWFyay1ydW50aW1lID0gIjAuNC4yIgoranVuaXQgPSAiNC4xMiIKK2dzb24gPSAiMi44LjUiCittb3NoaS1rb3RsaW4gPSAiMS4xMS4wIgorCitbbGlicmFyaWVzXQorbW9zaGkta290bGluID0geyBtb2R1bGUgPSAiY29tLnNxdWFyZXVwLm1vc2hpOm1vc2hpLWtvdGxpbiIsIHZlcnNpb24ucmVmID0gIm1vc2hpLWtvdGxpbiIgfQorZ3NvbiA9IHsgbW9kdWxlID0gImNvbS5nb29nbGUuY29kZS5nc29uOmdzb24iLCB2ZXJzaW9uLnJlZiA9ICJnc29uIiB9Citrb3RsaW54LWJlbmNobWFyay1ydW50aW1lID0geyBtb2R1bGUgPSAib3JnLmpldGJyYWlucy5rb3RsaW54OmtvdGxpbngtYmVuY2htYXJrLXJ1bnRpbWUiLCB2ZXJzaW9uLnJlZiA9ICJrb3RsaW54LWJlbmNobWFyay1ydW50aW1lIiB9CitwbHVnaW4ta290bGluID0geyBtb2R1bGUgPSAib3JnLmpldGJyYWlucy5rb3RsaW46a290bGluLWdyYWRsZS1wbHVnaW4iLCB2ZXJzaW9uLnJlZiA9ICJwbHVnaW4ta290bGluIiB9CitwbHVnaW4ta290bGluLXNlcmlhbGl6YXRpb24gPSB7IG1vZHVsZSA9ICJvcmcuamV0YnJhaW5zLmtvdGxpbjprb3RsaW4tc2VyaWFsaXphdGlvbiIsIHZlcnNpb24ucmVmID0gInBsdWdpbi1rb3RsaW4iIH0KK3BsdWdpbi1ndmVyID0geyBtb2R1bGUgPSAiY29tLmdpdGh1Yi5iZW4tbWFuZXM6Z3JhZGxlLXZlcnNpb25zLXBsdWdpbiIsIHZlcnNpb24ucmVmID0gInBsdWdpbi1ndmVyIiB9CisKK2p1bml0ID0geyBtb2R1bGU9Imp1bml0Omp1bml0IiwgdmVyc2lvbi5yZWY9Imp1bml0In0KKworW2J1bmRsZXNdCitwbHVnaW5zID0gWyJwbHVnaW4ta290bGluIiwgICJwbHVnaW4ta290bGluLXNlcmlhbGl6YXRpb24iLCAicGx1Z2luLWd2ZXIiXQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMva290bGluL2dyYWRsZS93cmFwcGVyL2dyYWRsZS13cmFwcGVyLmphciBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL2tvdGxpbi9ncmFkbGUvd3JhcHBlci9ncmFkbGUtd3JhcHBlci5qYXIKaW5kZXggNjJkNGMwNS4uNDFkOTkyNyAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMva290bGluL2dyYWRsZS93cmFwcGVyL2dyYWRsZS13cmFwcGVyLmphcgorKysgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy9rb3RsaW4vZ3JhZGxlL3dyYXBwZXIvZ3JhZGxlLXdyYXBwZXIuamFyCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL2tvdGxpbi9ncmFkbGUvd3JhcHBlci9ncmFkbGUtd3JhcHBlci5wcm9wZXJ0aWVzIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMva290bGluL2dyYWRsZS93cmFwcGVyL2dyYWRsZS13cmFwcGVyLnByb3BlcnRpZXMKaW5kZXggOGZhZjM5ZC4uYWE5OTFmYyAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMva290bGluL2dyYWRsZS93cmFwcGVyL2dyYWRsZS13cmFwcGVyLnByb3BlcnRpZXMKKysrIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMva290bGluL2dyYWRsZS93cmFwcGVyL2dyYWRsZS13cmFwcGVyLnByb3BlcnRpZXMKQEAgLTEsOSArMSw1IEBACiBkaXN0cmlidXRpb25CYXNlPUdSQURMRV9VU0VSX0hPTUUKIGRpc3RyaWJ1dGlvblBhdGg9d3JhcHBlci9kaXN0cwotZGlzdHJpYnV0aW9uVXJsPWh0dHBzXDovL3NlcnZpY2VzLmdyYWRsZS5vcmcvZGlzdHJpYnV0aW9ucy9ncmFkbGUtNi4zLWJpbi56aXAKK2Rpc3RyaWJ1dGlvblVybD1odHRwc1w6Ly9zZXJ2aWNlcy5ncmFkbGUub3JnL2Rpc3RyaWJ1dGlvbnMvZ3JhZGxlLTcuNC4yLWJpbi56aXAKIHppcFN0b3JlQmFzZT1HUkFETEVfVVNFUl9IT01FCiB6aXBTdG9yZVBhdGg9d3JhcHBlci9kaXN0cwotIyBSZW1vdmUga290bGluIE1QUCB3YXJuaW5nCi1rb3RsaW4ubXBwLnN0YWJpbGl0eS5ub3dhcm49dHJ1ZQotIyBOZWVkZWQgdG8gc2hhcmUgc291cmNlIGFtb25nIGRpZmZlcmVudCB0YXJnZXRzCi1rb3RsaW4ubXBwLmVuYWJsZUdyYW51bGFyU291cmNlU2V0c01ldGFkYXRhPXRydWUKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL2tvdGxpbi9ncmFkbGV3IGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMva290bGluL2dyYWRsZXcKaW5kZXggZmJkN2M1MS4uMWI2Yzc4NyAxMDA3NTUKLS0tIGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMva290bGluL2dyYWRsZXcKKysrIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMva290bGluL2dyYWRsZXcKQEAgLTEsNyArMSw3IEBACi0jIS91c3IvYmluL2VudiBzaAorIyEvYmluL3NoCiAKICMKLSMgQ29weXJpZ2h0IDIwMTUgdGhlIG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzLgorIyBDb3B5cmlnaHQgwqkgMjAxNS0yMDIxIHRoZSBvcmlnaW5hbCBhdXRob3JzLgogIwogIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgpAQCAtMTcsNjcgKzE3LDEwMSBAQAogIwogCiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMjCi0jIyAgR3JhZGxlIHN0YXJ0IHVwIHNjcmlwdCBmb3IgVU4qWAotIyMKKyMKKyMgICBHcmFkbGUgc3RhcnQgdXAgc2NyaXB0IGZvciBQT1NJWCBnZW5lcmF0ZWQgYnkgR3JhZGxlLgorIworIyAgIEltcG9ydGFudCBmb3IgcnVubmluZzoKKyMKKyMgICAoMSkgWW91IG5lZWQgYSBQT1NJWC1jb21wbGlhbnQgc2hlbGwgdG8gcnVuIHRoaXMgc2NyaXB0LiBJZiB5b3VyIC9iaW4vc2ggaXMKKyMgICAgICAgbm9uY29tcGxpYW50LCBidXQgeW91IGhhdmUgc29tZSBvdGhlciBjb21wbGlhbnQgc2hlbGwgc3VjaCBhcyBrc2ggb3IKKyMgICAgICAgYmFzaCwgdGhlbiB0byBydW4gdGhpcyBzY3JpcHQsIHR5cGUgdGhhdCBzaGVsbCBuYW1lIGJlZm9yZSB0aGUgd2hvbGUKKyMgICAgICAgY29tbWFuZCBsaW5lLCBsaWtlOgorIworIyAgICAgICAgICAga3NoIEdyYWRsZQorIworIyAgICAgICBCdXN5Ym94IGFuZCBzaW1pbGFyIHJlZHVjZWQgc2hlbGxzIHdpbGwgTk9UIHdvcmssIGJlY2F1c2UgdGhpcyBzY3JpcHQKKyMgICAgICAgcmVxdWlyZXMgYWxsIG9mIHRoZXNlIFBPU0lYIHNoZWxsIGZlYXR1cmVzOgorIyAgICAgICAgICogZnVuY3Rpb25zOworIyAgICAgICAgICogZXhwYW5zaW9ucyDCqyR2YXLCuywgwqske3Zhcn3Cuywgwqske3ZhcjotZGVmYXVsdH3Cuywgwqske3ZhcitTRVR9wrssCisjICAgICAgICAgICDCqyR7dmFyI3ByZWZpeH3Cuywgwqske3ZhciVzdWZmaXh9wrssIGFuZCDCqyQoIGNtZCApwrs7CisjICAgICAgICAgKiBjb21wb3VuZCBjb21tYW5kcyBoYXZpbmcgYSB0ZXN0YWJsZSBleGl0IHN0YXR1cywgZXNwZWNpYWxseSDCq2Nhc2XCuzsKKyMgICAgICAgICAqIHZhcmlvdXMgYnVpbHQtaW4gY29tbWFuZHMgaW5jbHVkaW5nIMKrY29tbWFuZMK7LCDCq3NldMK7LCBhbmQgwqt1bGltaXTCuy4KKyMKKyMgICBJbXBvcnRhbnQgZm9yIHBhdGNoaW5nOgorIworIyAgICgyKSBUaGlzIHNjcmlwdCB0YXJnZXRzIGFueSBQT1NJWCBzaGVsbCwgc28gaXQgYXZvaWRzIGV4dGVuc2lvbnMgcHJvdmlkZWQKKyMgICAgICAgYnkgQmFzaCwgS3NoLCBldGM7IGluIHBhcnRpY3VsYXIgYXJyYXlzIGFyZSBhdm9pZGVkLgorIworIyAgICAgICBUaGUgInRyYWRpdGlvbmFsIiBwcmFjdGljZSBvZiBwYWNraW5nIG11bHRpcGxlIHBhcmFtZXRlcnMgaW50byBhCisjICAgICAgIHNwYWNlLXNlcGFyYXRlZCBzdHJpbmcgaXMgYSB3ZWxsIGRvY3VtZW50ZWQgc291cmNlIG9mIGJ1Z3MgYW5kIHNlY3VyaXR5CisjICAgICAgIHByb2JsZW1zLCBzbyB0aGlzIGlzIChtb3N0bHkpIGF2b2lkZWQsIGJ5IHByb2dyZXNzaXZlbHkgYWNjdW11bGF0aW5nCisjICAgICAgIG9wdGlvbnMgaW4gIiRAIiwgYW5kIGV2ZW50dWFsbHkgcGFzc2luZyB0aGF0IHRvIEphdmEuCisjCisjICAgICAgIFdoZXJlIHRoZSBpbmhlcml0ZWQgZW52aXJvbm1lbnQgdmFyaWFibGVzIChERUZBVUxUX0pWTV9PUFRTLCBKQVZBX09QVFMsCisjICAgICAgIGFuZCBHUkFETEVfT1BUUykgcmVseSBvbiB3b3JkLXNwbGl0dGluZywgdGhpcyBpcyBwZXJmb3JtZWQgZXhwbGljaXRseTsKKyMgICAgICAgc2VlIHRoZSBpbi1saW5lIGNvbW1lbnRzIGZvciBkZXRhaWxzLgorIworIyAgICAgICBUaGVyZSBhcmUgdHdlYWtzIGZvciBzcGVjaWZpYyBvcGVyYXRpbmcgc3lzdGVtcyBzdWNoIGFzIEFJWCwgQ3lnV2luLAorIyAgICAgICBEYXJ3aW4sIE1pbkdXLCBhbmQgTm9uU3RvcC4KKyMKKyMgICAoMykgVGhpcyBzY3JpcHQgaXMgZ2VuZXJhdGVkIGZyb20gdGhlIEdyb292eSB0ZW1wbGF0ZQorIyAgICAgICBodHRwczovL2dpdGh1Yi5jb20vZ3JhZGxlL2dyYWRsZS9ibG9iL21hc3Rlci9zdWJwcm9qZWN0cy9wbHVnaW5zL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvZ3JhZGxlL2FwaS9pbnRlcm5hbC9wbHVnaW5zL3VuaXhTdGFydFNjcmlwdC50eHQKKyMgICAgICAgd2l0aGluIHRoZSBHcmFkbGUgcHJvamVjdC4KKyMKKyMgICAgICAgWW91IGNhbiBmaW5kIEdyYWRsZSBhdCBodHRwczovL2dpdGh1Yi5jb20vZ3JhZGxlL2dyYWRsZS8uCisjCiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIAogIyBBdHRlbXB0IHRvIHNldCBBUFBfSE9NRQorCiAjIFJlc29sdmUgbGlua3M6ICQwIG1heSBiZSBhIGxpbmsKLVBSRz0iJDAiCi0jIE5lZWQgdGhpcyBmb3IgcmVsYXRpdmUgc3ltbGlua3MuCi13aGlsZSBbIC1oICIkUFJHIiBdIDsgZG8KLSAgICBscz1gbHMgLWxkICIkUFJHImAKLSAgICBsaW5rPWBleHByICIkbHMiIDogJy4qLT4gXCguKlwpJCdgCi0gICAgaWYgZXhwciAiJGxpbmsiIDogJy8uKicgPiAvZGV2L251bGw7IHRoZW4KLSAgICAgICAgUFJHPSIkbGluayIKLSAgICBlbHNlCi0gICAgICAgIFBSRz1gZGlybmFtZSAiJFBSRyJgIi8kbGluayIKLSAgICBmaQorYXBwX3BhdGg9JDAKKworIyBOZWVkIHRoaXMgZm9yIGRhaXN5LWNoYWluZWQgc3ltbGlua3MuCit3aGlsZQorICAgIEFQUF9IT01FPSR7YXBwX3BhdGglIiR7YXBwX3BhdGgjIyovfSJ9ICAjIGxlYXZlcyBhIHRyYWlsaW5nIC87IGVtcHR5IGlmIG5vIGxlYWRpbmcgcGF0aAorICAgIFsgLWggIiRhcHBfcGF0aCIgXQorZG8KKyAgICBscz0kKCBscyAtbGQgIiRhcHBfcGF0aCIgKQorICAgIGxpbms9JHtscyMqJyAtPiAnfQorICAgIGNhc2UgJGxpbmsgaW4gICAgICAgICAgICAgIygKKyAgICAgIC8qKSAgIGFwcF9wYXRoPSRsaW5rIDs7ICMoCisgICAgICAqKSAgICBhcHBfcGF0aD0kQVBQX0hPTUUkbGluayA7OworICAgIGVzYWMKIGRvbmUKLVNBVkVEPSJgcHdkYCIKLWNkICJgZGlybmFtZSBcIiRQUkdcImAvIiA+L2Rldi9udWxsCi1BUFBfSE9NRT0iYHB3ZCAtUGAiCi1jZCAiJFNBVkVEIiA+L2Rldi9udWxsCisKK0FQUF9IT01FPSQoIGNkICIke0FQUF9IT01FOi0uL30iICYmIHB3ZCAtUCApIHx8IGV4aXQKIAogQVBQX05BTUU9IkdyYWRsZSIKLUFQUF9CQVNFX05BTUU9YGJhc2VuYW1lICIkMCJgCitBUFBfQkFTRV9OQU1FPSR7MCMjKi99CiAKICMgQWRkIGRlZmF1bHQgSlZNIG9wdGlvbnMgaGVyZS4gWW91IGNhbiBhbHNvIHVzZSBKQVZBX09QVFMgYW5kIEdSQURMRV9PUFRTIHRvIHBhc3MgSlZNIG9wdGlvbnMgdG8gdGhpcyBzY3JpcHQuCiBERUZBVUxUX0pWTV9PUFRTPSciLVhteDY0bSIgIi1YbXM2NG0iJwogCiAjIFVzZSB0aGUgbWF4aW11bSBhdmFpbGFibGUsIG9yIHNldCBNQVhfRkQgIT0gLTEgdG8gdXNlIHRoYXQgdmFsdWUuCi1NQVhfRkQ9Im1heGltdW0iCitNQVhfRkQ9bWF4aW11bQogCiB3YXJuICgpIHsKICAgICBlY2hvICIkKiIKLX0KK30gPiYyCiAKIGRpZSAoKSB7CiAgICAgZWNobwogICAgIGVjaG8gIiQqIgogICAgIGVjaG8KICAgICBleGl0IDEKLX0KK30gPiYyCiAKICMgT1Mgc3BlY2lmaWMgc3VwcG9ydCAobXVzdCBiZSAndHJ1ZScgb3IgJ2ZhbHNlJykuCiBjeWd3aW49ZmFsc2UKIG1zeXM9ZmFsc2UKIGRhcndpbj1mYWxzZQogbm9uc3RvcD1mYWxzZQotY2FzZSAiYHVuYW1lYCIgaW4KLSAgQ1lHV0lOKiApCi0gICAgY3lnd2luPXRydWUKLSAgICA7OwotICBEYXJ3aW4qICkKLSAgICBkYXJ3aW49dHJ1ZQotICAgIDs7Ci0gIE1JTkdXKiApCi0gICAgbXN5cz10cnVlCi0gICAgOzsKLSAgTk9OU1RPUCogKQotICAgIG5vbnN0b3A9dHJ1ZQotICAgIDs7CitjYXNlICIkKCB1bmFtZSApIiBpbiAgICAgICAgICAgICAgICAjKAorICBDWUdXSU4qICkgICAgICAgICBjeWd3aW49dHJ1ZSAgOzsgIygKKyAgRGFyd2luKiApICAgICAgICAgZGFyd2luPXRydWUgIDs7ICMoCisgIE1TWVMqIHwgTUlOR1cqICkgIG1zeXM9dHJ1ZSAgICA7OyAjKAorICBOT05TVE9QKiApICAgICAgICBub25zdG9wPXRydWUgOzsKIGVzYWMKIAogQ0xBU1NQQVRIPSRBUFBfSE9NRS9ncmFkbGUvd3JhcHBlci9ncmFkbGUtd3JhcHBlci5qYXIKQEAgLTg3LDkgKzEyMSw5IEBACiBpZiBbIC1uICIkSkFWQV9IT01FIiBdIDsgdGhlbgogICAgIGlmIFsgLXggIiRKQVZBX0hPTUUvanJlL3NoL2phdmEiIF0gOyB0aGVuCiAgICAgICAgICMgSUJNJ3MgSkRLIG9uIEFJWCB1c2VzIHN0cmFuZ2UgbG9jYXRpb25zIGZvciB0aGUgZXhlY3V0YWJsZXMKLSAgICAgICAgSkFWQUNNRD0iJEpBVkFfSE9NRS9qcmUvc2gvamF2YSIKKyAgICAgICAgSkFWQUNNRD0kSkFWQV9IT01FL2pyZS9zaC9qYXZhCiAgICAgZWxzZQotICAgICAgICBKQVZBQ01EPSIkSkFWQV9IT01FL2Jpbi9qYXZhIgorICAgICAgICBKQVZBQ01EPSRKQVZBX0hPTUUvYmluL2phdmEKICAgICBmaQogICAgIGlmIFsgISAteCAiJEpBVkFDTUQiIF0gOyB0aGVuCiAgICAgICAgIGRpZSAiRVJST1I6IEpBVkFfSE9NRSBpcyBzZXQgdG8gYW4gaW52YWxpZCBkaXJlY3Rvcnk6ICRKQVZBX0hPTUUKQEAgLTk4LDcgKzEzMiw3IEBACiBsb2NhdGlvbiBvZiB5b3VyIEphdmEgaW5zdGFsbGF0aW9uLiIKICAgICBmaQogZWxzZQotICAgIEpBVkFDTUQ9ImphdmEiCisgICAgSkFWQUNNRD1qYXZhCiAgICAgd2hpY2ggamF2YSA+L2Rldi9udWxsIDI+JjEgfHwgZGllICJFUlJPUjogSkFWQV9IT01FIGlzIG5vdCBzZXQgYW5kIG5vICdqYXZhJyBjb21tYW5kIGNvdWxkIGJlIGZvdW5kIGluIHlvdXIgUEFUSC4KIAogUGxlYXNlIHNldCB0aGUgSkFWQV9IT01FIHZhcmlhYmxlIGluIHlvdXIgZW52aXJvbm1lbnQgdG8gbWF0Y2ggdGhlCkBAIC0xMDYsODAgKzE0MCw5NSBAQAogZmkKIAogIyBJbmNyZWFzZSB0aGUgbWF4aW11bSBmaWxlIGRlc2NyaXB0b3JzIGlmIHdlIGNhbi4KLWlmIFsgIiRjeWd3aW4iID0gImZhbHNlIiAtYSAiJGRhcndpbiIgPSAiZmFsc2UiIC1hICIkbm9uc3RvcCIgPSAiZmFsc2UiIF0gOyB0aGVuCi0gICAgTUFYX0ZEX0xJTUlUPWB1bGltaXQgLUggLW5gCi0gICAgaWYgWyAkPyAtZXEgMCBdIDsgdGhlbgotICAgICAgICBpZiBbICIkTUFYX0ZEIiA9ICJtYXhpbXVtIiAtbyAiJE1BWF9GRCIgPSAibWF4IiBdIDsgdGhlbgotICAgICAgICAgICAgTUFYX0ZEPSIkTUFYX0ZEX0xJTUlUIgotICAgICAgICBmaQotICAgICAgICB1bGltaXQgLW4gJE1BWF9GRAotICAgICAgICBpZiBbICQ/IC1uZSAwIF0gOyB0aGVuCi0gICAgICAgICAgICB3YXJuICJDb3VsZCBub3Qgc2V0IG1heGltdW0gZmlsZSBkZXNjcmlwdG9yIGxpbWl0OiAkTUFYX0ZEIgotICAgICAgICBmaQotICAgIGVsc2UKLSAgICAgICAgd2FybiAiQ291bGQgbm90IHF1ZXJ5IG1heGltdW0gZmlsZSBkZXNjcmlwdG9yIGxpbWl0OiAkTUFYX0ZEX0xJTUlUIgotICAgIGZpCi1maQotCi0jIEZvciBEYXJ3aW4sIGFkZCBvcHRpb25zIHRvIHNwZWNpZnkgaG93IHRoZSBhcHBsaWNhdGlvbiBhcHBlYXJzIGluIHRoZSBkb2NrCi1pZiAkZGFyd2luOyB0aGVuCi0gICAgR1JBRExFX09QVFM9IiRHUkFETEVfT1BUUyBcIi1YZG9jazpuYW1lPSRBUFBfTkFNRVwiIFwiLVhkb2NrOmljb249JEFQUF9IT01FL21lZGlhL2dyYWRsZS5pY25zXCIiCi1maQotCi0jIEZvciBDeWd3aW4gb3IgTVNZUywgc3dpdGNoIHBhdGhzIHRvIFdpbmRvd3MgZm9ybWF0IGJlZm9yZSBydW5uaW5nIGphdmEKLWlmIFsgIiRjeWd3aW4iID0gInRydWUiIC1vICIkbXN5cyIgPSAidHJ1ZSIgXSA7IHRoZW4KLSAgICBBUFBfSE9NRT1gY3lncGF0aCAtLXBhdGggLS1taXhlZCAiJEFQUF9IT01FImAKLSAgICBDTEFTU1BBVEg9YGN5Z3BhdGggLS1wYXRoIC0tbWl4ZWQgIiRDTEFTU1BBVEgiYAotICAgIAotICAgIEpBVkFDTUQ9YGN5Z3BhdGggLS11bml4ICIkSkFWQUNNRCJgCi0KLSAgICAjIFdlIGJ1aWxkIHRoZSBwYXR0ZXJuIGZvciBhcmd1bWVudHMgdG8gYmUgY29udmVydGVkIHZpYSBjeWdwYXRoCi0gICAgUk9PVERJUlNSQVc9YGZpbmQgLUwgLyAtbWF4ZGVwdGggMSAtbWluZGVwdGggMSAtdHlwZSBkIDI+L2Rldi9udWxsYAotICAgIFNFUD0iIgotICAgIGZvciBkaXIgaW4gJFJPT1RESVJTUkFXIDsgZG8KLSAgICAgICAgUk9PVERJUlM9IiRST09URElSUyRTRVAkZGlyIgotICAgICAgICBTRVA9InwiCi0gICAgZG9uZQotICAgIE9VUkNZR1BBVFRFUk49IiheKCRST09URElSUykpIgotICAgICMgQWRkIGEgdXNlci1kZWZpbmVkIHBhdHRlcm4gdG8gdGhlIGN5Z3BhdGggYXJndW1lbnRzCi0gICAgaWYgWyAiJEdSQURMRV9DWUdQQVRURVJOIiAhPSAiIiBdIDsgdGhlbgotICAgICAgICBPVVJDWUdQQVRURVJOPSIkT1VSQ1lHUEFUVEVSTnwoJEdSQURMRV9DWUdQQVRURVJOKSIKLSAgICBmaQotICAgICMgTm93IGNvbnZlcnQgdGhlIGFyZ3VtZW50cyAtIGtsdWRnZSB0byBsaW1pdCBvdXJzZWx2ZXMgdG8gL2Jpbi9zaAotICAgIGk9MAotICAgIGZvciBhcmcgaW4gIiRAIiA7IGRvCi0gICAgICAgIENIRUNLPWBlY2hvICIkYXJnInxlZ3JlcCAtYyAiJE9VUkNZR1BBVFRFUk4iIC1gCi0gICAgICAgIENIRUNLMj1gZWNobyAiJGFyZyJ8ZWdyZXAgLWMgIl4tImAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIyMgRGV0ZXJtaW5lIGlmIGFuIG9wdGlvbgotCi0gICAgICAgIGlmIFsgJENIRUNLIC1uZSAwIF0gJiYgWyAkQ0hFQ0syIC1lcSAwIF0gOyB0aGVuICAgICAgICAgICAgICAgICAgICAjIyMgQWRkZWQgYSBjb25kaXRpb24KLSAgICAgICAgICAgIGV2YWwgYGVjaG8gYXJncyRpYD1gY3lncGF0aCAtLXBhdGggLS1pZ25vcmUgLS1taXhlZCAiJGFyZyJgCi0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIGV2YWwgYGVjaG8gYXJncyRpYD0iXCIkYXJnXCIiCi0gICAgICAgIGZpCi0gICAgICAgIGk9YGV4cHIgJGkgKyAxYAotICAgIGRvbmUKLSAgICBjYXNlICRpIGluCi0gICAgICAgIDApIHNldCAtLSA7OwotICAgICAgICAxKSBzZXQgLS0gIiRhcmdzMCIgOzsKLSAgICAgICAgMikgc2V0IC0tICIkYXJnczAiICIkYXJnczEiIDs7Ci0gICAgICAgIDMpIHNldCAtLSAiJGFyZ3MwIiAiJGFyZ3MxIiAiJGFyZ3MyIiA7OwotICAgICAgICA0KSBzZXQgLS0gIiRhcmdzMCIgIiRhcmdzMSIgIiRhcmdzMiIgIiRhcmdzMyIgOzsKLSAgICAgICAgNSkgc2V0IC0tICIkYXJnczAiICIkYXJnczEiICIkYXJnczIiICIkYXJnczMiICIkYXJnczQiIDs7Ci0gICAgICAgIDYpIHNldCAtLSAiJGFyZ3MwIiAiJGFyZ3MxIiAiJGFyZ3MyIiAiJGFyZ3MzIiAiJGFyZ3M0IiAiJGFyZ3M1IiA7OwotICAgICAgICA3KSBzZXQgLS0gIiRhcmdzMCIgIiRhcmdzMSIgIiRhcmdzMiIgIiRhcmdzMyIgIiRhcmdzNCIgIiRhcmdzNSIgIiRhcmdzNiIgOzsKLSAgICAgICAgOCkgc2V0IC0tICIkYXJnczAiICIkYXJnczEiICIkYXJnczIiICIkYXJnczMiICIkYXJnczQiICIkYXJnczUiICIkYXJnczYiICIkYXJnczciIDs7Ci0gICAgICAgIDkpIHNldCAtLSAiJGFyZ3MwIiAiJGFyZ3MxIiAiJGFyZ3MyIiAiJGFyZ3MzIiAiJGFyZ3M0IiAiJGFyZ3M1IiAiJGFyZ3M2IiAiJGFyZ3M3IiAiJGFyZ3M4IiA7OworaWYgISAiJGN5Z3dpbiIgJiYgISAiJGRhcndpbiIgJiYgISAiJG5vbnN0b3AiIDsgdGhlbgorICAgIGNhc2UgJE1BWF9GRCBpbiAjKAorICAgICAgbWF4KikKKyAgICAgICAgTUFYX0ZEPSQoIHVsaW1pdCAtSCAtbiApIHx8CisgICAgICAgICAgICB3YXJuICJDb3VsZCBub3QgcXVlcnkgbWF4aW11bSBmaWxlIGRlc2NyaXB0b3IgbGltaXQiCisgICAgZXNhYworICAgIGNhc2UgJE1BWF9GRCBpbiAgIygKKyAgICAgICcnIHwgc29mdCkgOjs7ICMoCisgICAgICAqKQorICAgICAgICB1bGltaXQgLW4gIiRNQVhfRkQiIHx8CisgICAgICAgICAgICB3YXJuICJDb3VsZCBub3Qgc2V0IG1heGltdW0gZmlsZSBkZXNjcmlwdG9yIGxpbWl0IHRvICRNQVhfRkQiCiAgICAgZXNhYwogZmkKIAotIyBFc2NhcGUgYXBwbGljYXRpb24gYXJncwotc2F2ZSAoKSB7Ci0gICAgZm9yIGkgZG8gcHJpbnRmICVzXFxuICIkaSIgfCBzZWQgInMvJy8nXFxcXCcnL2c7MXMvXi8nLztcJHMvXCQvJyBcXFxcLyIgOyBkb25lCi0gICAgZWNobyAiICIKLX0KLUFQUF9BUkdTPWBzYXZlICIkQCJgCisjIENvbGxlY3QgYWxsIGFyZ3VtZW50cyBmb3IgdGhlIGphdmEgY29tbWFuZCwgc3RhY2tpbmcgaW4gcmV2ZXJzZSBvcmRlcjoKKyMgICAqIGFyZ3MgZnJvbSB0aGUgY29tbWFuZCBsaW5lCisjICAgKiB0aGUgbWFpbiBjbGFzcyBuYW1lCisjICAgKiAtY2xhc3NwYXRoCisjICAgKiAtRC4uLmFwcG5hbWUgc2V0dGluZ3MKKyMgICAqIC0tbW9kdWxlLXBhdGggKG9ubHkgaWYgbmVlZGVkKQorIyAgICogREVGQVVMVF9KVk1fT1BUUywgSkFWQV9PUFRTLCBhbmQgR1JBRExFX09QVFMgZW52aXJvbm1lbnQgdmFyaWFibGVzLgogCi0jIENvbGxlY3QgYWxsIGFyZ3VtZW50cyBmb3IgdGhlIGphdmEgY29tbWFuZCwgZm9sbG93aW5nIHRoZSBzaGVsbCBxdW90aW5nIGFuZCBzdWJzdGl0dXRpb24gcnVsZXMKLWV2YWwgc2V0IC0tICRERUZBVUxUX0pWTV9PUFRTICRKQVZBX09QVFMgJEdSQURMRV9PUFRTICJcIi1Eb3JnLmdyYWRsZS5hcHBuYW1lPSRBUFBfQkFTRV9OQU1FXCIiIC1jbGFzc3BhdGggIlwiJENMQVNTUEFUSFwiIiBvcmcuZ3JhZGxlLndyYXBwZXIuR3JhZGxlV3JhcHBlck1haW4gIiRBUFBfQVJHUyIKKyMgRm9yIEN5Z3dpbiBvciBNU1lTLCBzd2l0Y2ggcGF0aHMgdG8gV2luZG93cyBmb3JtYXQgYmVmb3JlIHJ1bm5pbmcgamF2YQoraWYgIiRjeWd3aW4iIHx8ICIkbXN5cyIgOyB0aGVuCisgICAgQVBQX0hPTUU9JCggY3lncGF0aCAtLXBhdGggLS1taXhlZCAiJEFQUF9IT01FIiApCisgICAgQ0xBU1NQQVRIPSQoIGN5Z3BhdGggLS1wYXRoIC0tbWl4ZWQgIiRDTEFTU1BBVEgiICkKKworICAgIEpBVkFDTUQ9JCggY3lncGF0aCAtLXVuaXggIiRKQVZBQ01EIiApCisKKyAgICAjIE5vdyBjb252ZXJ0IHRoZSBhcmd1bWVudHMgLSBrbHVkZ2UgdG8gbGltaXQgb3Vyc2VsdmVzIHRvIC9iaW4vc2gKKyAgICBmb3IgYXJnIGRvCisgICAgICAgIGlmCisgICAgICAgICAgICBjYXNlICRhcmcgaW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMoCisgICAgICAgICAgICAgIC0qKSAgIGZhbHNlIDs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgZG9uJ3QgbWVzcyB3aXRoIG9wdGlvbnMgIygKKyAgICAgICAgICAgICAgLz8qKSAgdD0ke2FyZyMvfSB0PS8ke3QlJS8qfSAgICAgICAgICAgICAgIyBsb29rcyBsaWtlIGEgUE9TSVggZmlsZXBhdGgKKyAgICAgICAgICAgICAgICAgICAgWyAtZSAiJHQiIF0gOzsgICAgICAgICAgICAgICAgICAgICAgIygKKyAgICAgICAgICAgICAgKikgICAgZmFsc2UgOzsKKyAgICAgICAgICAgIGVzYWMKKyAgICAgICAgdGhlbgorICAgICAgICAgICAgYXJnPSQoIGN5Z3BhdGggLS1wYXRoIC0taWdub3JlIC0tbWl4ZWQgIiRhcmciICkKKyAgICAgICAgZmkKKyAgICAgICAgIyBSb2xsIHRoZSBhcmdzIGxpc3QgYXJvdW5kIGV4YWN0bHkgYXMgbWFueSB0aW1lcyBhcyB0aGUgbnVtYmVyIG9mCisgICAgICAgICMgYXJncywgc28gZWFjaCBhcmcgd2luZHMgdXAgYmFjayBpbiB0aGUgcG9zaXRpb24gd2hlcmUgaXQgc3RhcnRlZCwgYnV0CisgICAgICAgICMgcG9zc2libHkgbW9kaWZpZWQuCisgICAgICAgICMKKyAgICAgICAgIyBOQjogYSBgZm9yYCBsb29wIGNhcHR1cmVzIGl0cyBpdGVyYXRpb24gbGlzdCBiZWZvcmUgaXQgYmVnaW5zLCBzbworICAgICAgICAjIGNoYW5naW5nIHRoZSBwb3NpdGlvbmFsIHBhcmFtZXRlcnMgaGVyZSBhZmZlY3RzIG5laXRoZXIgdGhlIG51bWJlciBvZgorICAgICAgICAjIGl0ZXJhdGlvbnMsIG5vciB0aGUgdmFsdWVzIHByZXNlbnRlZCBpbiBgYXJnYC4KKyAgICAgICAgc2hpZnQgICAgICAgICAgICAgICAgICAgIyByZW1vdmUgb2xkIGFyZworICAgICAgICBzZXQgLS0gIiRAIiAiJGFyZyIgICAgICAjIHB1c2ggcmVwbGFjZW1lbnQgYXJnCisgICAgZG9uZQorZmkKKworIyBDb2xsZWN0IGFsbCBhcmd1bWVudHMgZm9yIHRoZSBqYXZhIGNvbW1hbmQ7CisjICAgKiAkREVGQVVMVF9KVk1fT1BUUywgJEpBVkFfT1BUUywgYW5kICRHUkFETEVfT1BUUyBjYW4gY29udGFpbiBmcmFnbWVudHMgb2YKKyMgICAgIHNoZWxsIHNjcmlwdCBpbmNsdWRpbmcgcXVvdGVzIGFuZCB2YXJpYWJsZSBzdWJzdGl0dXRpb25zLCBzbyBwdXQgdGhlbSBpbgorIyAgICAgZG91YmxlIHF1b3RlcyB0byBtYWtlIHN1cmUgdGhhdCB0aGV5IGdldCByZS1leHBhbmRlZDsgYW5kCisjICAgKiBwdXQgZXZlcnl0aGluZyBlbHNlIGluIHNpbmdsZSBxdW90ZXMsIHNvIHRoYXQgaXQncyBub3QgcmUtZXhwYW5kZWQuCisKK3NldCAtLSBcCisgICAgICAgICItRG9yZy5ncmFkbGUuYXBwbmFtZT0kQVBQX0JBU0VfTkFNRSIgXAorICAgICAgICAtY2xhc3NwYXRoICIkQ0xBU1NQQVRIIiBcCisgICAgICAgIG9yZy5ncmFkbGUud3JhcHBlci5HcmFkbGVXcmFwcGVyTWFpbiBcCisgICAgICAgICIkQCIKKworIyBVc2UgInhhcmdzIiB0byBwYXJzZSBxdW90ZWQgYXJncy4KKyMKKyMgV2l0aCAtbjEgaXQgb3V0cHV0cyBvbmUgYXJnIHBlciBsaW5lLCB3aXRoIHRoZSBxdW90ZXMgYW5kIGJhY2tzbGFzaGVzIHJlbW92ZWQuCisjCisjIEluIEJhc2ggd2UgY291bGQgc2ltcGx5IGdvOgorIworIyAgIHJlYWRhcnJheSBBUkdTIDwgPCggeGFyZ3MgLW4xIDw8PCIkdmFyIiApICYmCisjICAgc2V0IC0tICIke0FSR1NbQF19IiAiJEAiCisjCisjIGJ1dCBQT1NJWCBzaGVsbCBoYXMgbmVpdGhlciBhcnJheXMgbm9yIGNvbW1hbmQgc3Vic3RpdHV0aW9uLCBzbyBpbnN0ZWFkIHdlCisjIHBvc3QtcHJvY2VzcyBlYWNoIGFyZyAoYXMgYSBsaW5lIG9mIGlucHV0IHRvIHNlZCkgdG8gYmFja3NsYXNoLWVzY2FwZSBhbnkKKyMgY2hhcmFjdGVyIHRoYXQgbWlnaHQgYmUgYSBzaGVsbCBtZXRhY2hhcmFjdGVyLCB0aGVuIHVzZSBldmFsIHRvIHJldmVyc2UKKyMgdGhhdCBwcm9jZXNzICh3aGlsZSBtYWludGFpbmluZyB0aGUgc2VwYXJhdGlvbiBiZXR3ZWVuIGFyZ3VtZW50cyksIGFuZCB3cmFwCisjIHRoZSB3aG9sZSB0aGluZyB1cCBhcyBhIHNpbmdsZSAic2V0IiBzdGF0ZW1lbnQuCisjCisjIFRoaXMgd2lsbCBvZiBjb3Vyc2UgYnJlYWsgaWYgYW55IG9mIHRoZXNlIHZhcmlhYmxlcyBjb250YWlucyBhIG5ld2xpbmUgb3IKKyMgYW4gdW5tYXRjaGVkIHF1b3RlLgorIworCitldmFsICJzZXQgLS0gJCgKKyAgICAgICAgcHJpbnRmICclc1xuJyAiJERFRkFVTFRfSlZNX09QVFMgJEpBVkFfT1BUUyAkR1JBRExFX09QVFMiIHwKKyAgICAgICAgeGFyZ3MgLW4xIHwKKyAgICAgICAgc2VkICcgc35bXi1bOmFsbnVtOl0rLC4vOj1AX11+XFwmfmc7ICcgfAorICAgICAgICB0ciAnXG4nICcgJworICAgICkiICciJEAiJwogCiBleGVjICIkSkFWQUNNRCIgIiRAIgpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMva290bGluL2dyYWRsZXcuYmF0IGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMva290bGluL2dyYWRsZXcuYmF0CmluZGV4IDUwOTM2MDkuLjEwN2FjZDMgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL2tvdGxpbi9ncmFkbGV3LmJhdAorKysgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy9rb3RsaW4vZ3JhZGxldy5iYXQKQEAgLTQwLDcgKzQwLDcgQEAKIAogc2V0IEpBVkFfRVhFPWphdmEuZXhlCiAlSkFWQV9FWEUlIC12ZXJzaW9uID5OVUwgMj4mMQotaWYgIiVFUlJPUkxFVkVMJSIgPT0gIjAiIGdvdG8gaW5pdAoraWYgIiVFUlJPUkxFVkVMJSIgPT0gIjAiIGdvdG8gZXhlY3V0ZQogCiBlY2hvLgogZWNobyBFUlJPUjogSkFWQV9IT01FIGlzIG5vdCBzZXQgYW5kIG5vICdqYXZhJyBjb21tYW5kIGNvdWxkIGJlIGZvdW5kIGluIHlvdXIgUEFUSC4KQEAgLTU0LDcgKzU0LDcgQEAKIHNldCBKQVZBX0hPTUU9JUpBVkFfSE9NRToiPSUKIHNldCBKQVZBX0VYRT0lSkFWQV9IT01FJS9iaW4vamF2YS5leGUKIAotaWYgZXhpc3QgIiVKQVZBX0VYRSUiIGdvdG8gaW5pdAoraWYgZXhpc3QgIiVKQVZBX0VYRSUiIGdvdG8gZXhlY3V0ZQogCiBlY2hvLgogZWNobyBFUlJPUjogSkFWQV9IT01FIGlzIHNldCB0byBhbiBpbnZhbGlkIGRpcmVjdG9yeTogJUpBVkFfSE9NRSUKQEAgLTY0LDIxICs2NCw2IEBACiAKIGdvdG8gZmFpbAogCi06aW5pdAotQHJlbSBHZXQgY29tbWFuZC1saW5lIGFyZ3VtZW50cywgaGFuZGxpbmcgV2luZG93cyB2YXJpYW50cwotCi1pZiBub3QgIiVPUyUiID09ICJXaW5kb3dzX05UIiBnb3RvIHdpbjl4TUVfYXJncwotCi06d2luOXhNRV9hcmdzCi1AcmVtIFNsdXJwIHRoZSBjb21tYW5kIGxpbmUgYXJndW1lbnRzLgotc2V0IENNRF9MSU5FX0FSR1M9Ci1zZXQgX1NLSVA9MgotCi06d2luOXhNRV9hcmdzX3NsdXJwCi1pZiAieCV+MSIgPT0gIngiIGdvdG8gZXhlY3V0ZQotCi1zZXQgQ01EX0xJTkVfQVJHUz0lKgotCiA6ZXhlY3V0ZQogQHJlbSBTZXR1cCB0aGUgY29tbWFuZCBsaW5lCiAKQEAgLTg2LDcgKzcxLDcgQEAKIAogCiBAcmVtIEV4ZWN1dGUgR3JhZGxlCi0iJUpBVkFfRVhFJSIgJURFRkFVTFRfSlZNX09QVFMlICVKQVZBX09QVFMlICVHUkFETEVfT1BUUyUgIi1Eb3JnLmdyYWRsZS5hcHBuYW1lPSVBUFBfQkFTRV9OQU1FJSIgLWNsYXNzcGF0aCAiJUNMQVNTUEFUSCUiIG9yZy5ncmFkbGUud3JhcHBlci5HcmFkbGVXcmFwcGVyTWFpbiAlQ01EX0xJTkVfQVJHUyUKKyIlSkFWQV9FWEUlIiAlREVGQVVMVF9KVk1fT1BUUyUgJUpBVkFfT1BUUyUgJUdSQURMRV9PUFRTJSAiLURvcmcuZ3JhZGxlLmFwcG5hbWU9JUFQUF9CQVNFX05BTUUlIiAtY2xhc3NwYXRoICIlQ0xBU1NQQVRIJSIgb3JnLmdyYWRsZS53cmFwcGVyLkdyYWRsZVdyYXBwZXJNYWluICUqCiAKIDplbmQKIEByZW0gRW5kIGxvY2FsIHNjb3BlIGZvciB0aGUgdmFyaWFibGVzIHdpdGggd2luZG93cyBOVCBzaGVsbApkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMva290bGluL3NldHRpbmdzLmdyYWRsZSBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL2tvdGxpbi9zZXR0aW5ncy5ncmFkbGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEzMDk3MWMuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMva290bGluL3NldHRpbmdzLmdyYWRsZQorKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLXBsdWdpbk1hbmFnZW1lbnQgewotICByZXBvc2l0b3JpZXMgewotICAgIG1hdmVuQ2VudHJhbCgpCi0gICAgZ3JhZGxlUGx1Z2luUG9ydGFsKCkKLSAgfQotfQotCi0KLXJvb3RQcm9qZWN0Lm5hbWUgPSAnZmxhdGJ1ZmZlcnMta290bGluJwotaW5jbHVkZSAnZmxhdGJ1ZmZlcnMta290bGluJywgImJlbmNobWFyayIKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL2tvdGxpbi9zZXR0aW5ncy5ncmFkbGUua3RzIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMva290bGluL3NldHRpbmdzLmdyYWRsZS5rdHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGZkMTljNAotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL2tvdGxpbi9zZXR0aW5ncy5ncmFkbGUua3RzCkBAIC0wLDAgKzEsMyBAQAorcm9vdFByb2plY3QubmFtZSA9ICJmbGF0YnVmZmVycy1rb3RsaW4iCitpbmNsdWRlKCJmbGF0YnVmZmVycy1rb3RsaW4iKQoraW5jbHVkZSgiYmVuY2htYXJrIikKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL25ldC9GbGF0QnVmZmVycy9CeXRlQnVmZmVyLmNzIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvbmV0L0ZsYXRCdWZmZXJzL0J5dGVCdWZmZXIuY3MKaW5kZXggNmUwZmUzNS4uNGMwZDAwMCAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvbmV0L0ZsYXRCdWZmZXJzL0J5dGVCdWZmZXIuY3MKKysrIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvbmV0L0ZsYXRCdWZmZXJzL0J5dGVCdWZmZXIuY3MKQEAgLTUxLDcgKzUxLDcgQEAKICN3YXJuaW5nIEVOQUJMRV9TUEFOX1QgcmVxdWlyZXMgVU5TQUZFX0JZVEVCVUZGRVIgdG8gYWxzbyBiZSBkZWZpbmVkCiAjZW5kaWYKIAotbmFtZXNwYWNlIEZsYXRCdWZmZXJzCituYW1lc3BhY2UgR29vZ2xlLkZsYXRCdWZmZXJzCiB7CiAgICAgcHVibGljIGFic3RyYWN0IGNsYXNzIEJ5dGVCdWZmZXJBbGxvY2F0b3IKICAgICB7CkBAIC0yMjUsNiArMjI1LDE4IEBACiAgICAgICAgICAgICByZXR1cm4gU2l6ZU9mPFQ+KCkgKiB4Lkxlbmd0aDsKICAgICAgICAgfQogCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIEdldCB0aGUgd2lyZS1zaXplIChpbiBieXRlcykgb2YgYW4gdHlwZWQgYXJyYXkgc2VnbWVudCwgdGFraW5nIG9ubHkgdGhlCisgICAgICAgIC8vLyByYW5nZSBzcGVjaWZpZWQgYnkgPHBhcmFtcmVmIG5hbWU9IngiLz4gaW50byBhY2NvdW50LgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHR5cGVwYXJhbSBuYW1lPSJUIj5UaGUgdHlwZSBvZiB0aGUgYXJyYXk8L3R5cGVwYXJhbT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJ4Ij5UaGUgYXJyYXkgc2VnbWVudCB0byBnZXQgdGhlIHNpemUgb2Y8L3BhcmFtPgorICAgICAgICAvLy8gPHJldHVybnM+VGhlIG51bWJlciBvZiBieXRlcyB0aGUgYXJyYXkgc2VnbWVudCB0YWtlcyBvbiB3aXJlPC9yZXR1cm5zPgorICAgICAgICBwdWJsaWMgc3RhdGljIGludCBBcnJheVNpemU8VD4oQXJyYXlTZWdtZW50PFQ+IHgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBTaXplT2Y8VD4oKSAqIHguQ291bnQ7CisgICAgICAgIH0KKwogI2lmIEVOQUJMRV9TUEFOX1QgJiYgKFVOU0FGRV9CWVRFQlVGRkVSIHx8IE5FVFNUQU5EQVJEMl8xKQogICAgICAgICBwdWJsaWMgc3RhdGljIGludCBBcnJheVNpemU8VD4oU3BhbjxUPiB4KQogICAgICAgICB7CkBAIC04NjksNyArODgxLDMwIEBACiAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50TnVsbEV4Y2VwdGlvbigiQ2Fubm90IHB1dCBhIG51bGwgYXJyYXkiKTsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgaWYgKHguTGVuZ3RoID09IDApCisgICAgICAgICAgICByZXR1cm4gUHV0KG9mZnNldCwgbmV3IEFycmF5U2VnbWVudDxUPih4KSk7CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBDb3BpZXMgYW4gYXJyYXkgc2VnbWVudCBvZiB0eXBlIFQgaW50byB0aGlzIGJ1ZmZlciwgZW5kaW5nIGF0IHRoZSAKKyAgICAgICAgLy8vIGdpdmVuIG9mZnNldCBpbnRvIHRoaXMgYnVmZmVyLiBUaGUgc3RhcnRpbmcgb2Zmc2V0IGlzIGNhbGN1bGF0ZWQgCisgICAgICAgIC8vLyBiYXNlZCBvbiB0aGUgY291bnQgb2YgdGhlIGFycmF5IHNlZ21lbnQgYW5kIGlzIHRoZSB2YWx1ZSByZXR1cm5lZC4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDx0eXBlcGFyYW0gbmFtZT0iVCI+VGhlIHR5cGUgb2YgdGhlIGlucHV0IGRhdGEgKG11c3QgYmUgYSBzdHJ1Y3QpCisgICAgICAgIC8vLyA8L3R5cGVwYXJhbT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJvZmZzZXQiPlRoZSBvZmZzZXQgaW50byB0aGlzIGJ1ZmZlciB3aGVyZSB0aGUgY29weSAKKyAgICAgICAgLy8vIHdpbGwgZW5kPC9wYXJhbT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJ4Ij5UaGUgYXJyYXkgc2VnbWVudCB0byBjb3B5IGRhdGEgZnJvbTwvcGFyYW0+CisgICAgICAgIC8vLyA8cmV0dXJucz5UaGUgJ3N0YXJ0JyBsb2NhdGlvbiBvZiB0aGlzIGJ1ZmZlciBub3csIGFmdGVyIHRoZSBjb3B5IAorICAgICAgICAvLy8gY29tcGxldGVkPC9yZXR1cm5zPgorICAgICAgICBwdWJsaWMgaW50IFB1dDxUPihpbnQgb2Zmc2V0LCBBcnJheVNlZ21lbnQ8VD4geCkKKyAgICAgICAgICAgIHdoZXJlIFQgOiBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHguRXF1YWxzKGRlZmF1bHQoQXJyYXlTZWdtZW50PFQ+KSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50TnVsbEV4Y2VwdGlvbigiQ2Fubm90IHB1dCBhIHVuaW5pdGlhbGl6ZWQgYXJyYXkgc2VnbWVudCIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoeC5Db3VudCA9PSAwKQogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIHRocm93IG5ldyBBcmd1bWVudEV4Y2VwdGlvbigiQ2Fubm90IHB1dCBhbiBlbXB0eSBhcnJheSIpOwogICAgICAgICAgICAgfQpAQCAtODg5LDcgKzkyNCw2OCBAQAogI2lmIEVOQUJMRV9TUEFOX1QgJiYgKFVOU0FGRV9CWVRFQlVGRkVSIHx8IE5FVFNUQU5EQVJEMl8xKQogICAgICAgICAgICAgICAgIE1lbW9yeU1hcnNoYWwuQ2FzdDxULCBieXRlPih4KS5Db3B5VG8oX2J1ZmZlci5TcGFuLlNsaWNlKG9mZnNldCwgbnVtQnl0ZXMpKTsKICNlbHNlCi0gICAgICAgICAgICAgICAgQnVmZmVyLkJsb2NrQ29weSh4LCAwLCBfYnVmZmVyLkJ1ZmZlciwgb2Zmc2V0LCBudW1CeXRlcyk7CisgICAgICAgICAgICAgICAgdmFyIHNyY09mZnNldCA9IEJ5dGVCdWZmZXIuU2l6ZU9mPFQ+KCkgKiB4Lk9mZnNldDsKKyAgICAgICAgICAgICAgICBCdWZmZXIuQmxvY2tDb3B5KHguQXJyYXksIHNyY09mZnNldCwgX2J1ZmZlci5CdWZmZXIsIG9mZnNldCwgbnVtQnl0ZXMpOworI2VuZGlmCisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKCJCaWcgRW5kaWFuIFN1cHBvcnQgbm90IGltcGxlbWVudGVkIHlldCAiICsKKyAgICAgICAgICAgICAgICAgICAgImZvciBwdXR0aW5nIHR5cGVkIGFycmF5cyIpOworICAgICAgICAgICAgICAgIC8vIGlmIHdlIGFyZSBCRSwgd2UgaGF2ZSB0byBzd2FwIGVhY2ggZWxlbWVudCBieSBpdHNlbGYKKyAgICAgICAgICAgICAgICAvL2ZvcihpbnQgaSA9IHguTGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pCisgICAgICAgICAgICAgICAgLy97CisgICAgICAgICAgICAgICAgLy8gIHRvZG86IGxvdyBwcmlvcml0eSwgYnV0IG5lZWQgdG8gZ2VuZXJpY2l6ZSB0aGUgUHV0PFQ+KCkgZnVuY3Rpb25zCisgICAgICAgICAgICAgICAgLy99CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gb2Zmc2V0OworICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gQ29waWVzIGFuIGFycmF5IHNlZ21lbnQgb2YgdHlwZSBUIGludG8gdGhpcyBidWZmZXIsIGVuZGluZyBhdCB0aGUgCisgICAgICAgIC8vLyBnaXZlbiBvZmZzZXQgaW50byB0aGlzIGJ1ZmZlci4gVGhlIHN0YXJ0aW5nIG9mZnNldCBpcyBjYWxjdWxhdGVkIAorICAgICAgICAvLy8gYmFzZWQgb24gdGhlIGNvdW50IG9mIHRoZSBhcnJheSBzZWdtZW50IGFuZCBpcyB0aGUgdmFsdWUgcmV0dXJuZWQuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8dHlwZXBhcmFtIG5hbWU9IlQiPlRoZSB0eXBlIG9mIHRoZSBpbnB1dCBkYXRhIChtdXN0IGJlIGEgc3RydWN0KQorICAgICAgICAvLy8gPC90eXBlcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ib2Zmc2V0Ij5UaGUgb2Zmc2V0IGludG8gdGhpcyBidWZmZXIgd2hlcmUgdGhlIGNvcHkgCisgICAgICAgIC8vLyB3aWxsIGVuZDwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0icHRyIj5UaGUgcG9pbnRlciB0byBjb3B5IGRhdGEgZnJvbTwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ic2l6ZUluQnl0ZXMiPlRoZSBudW1iZXIgb2YgYnl0ZXMgdG8gY29weTwvcGFyYW0+CisgICAgICAgIC8vLyA8cmV0dXJucz5UaGUgJ3N0YXJ0JyBsb2NhdGlvbiBvZiB0aGlzIGJ1ZmZlciBub3csIGFmdGVyIHRoZSBjb3B5IAorICAgICAgICAvLy8gY29tcGxldGVkPC9yZXR1cm5zPgorICAgICAgICBwdWJsaWMgaW50IFB1dDxUPihpbnQgb2Zmc2V0LCBJbnRQdHIgcHRyLCBpbnQgc2l6ZUluQnl0ZXMpCisgICAgICAgICAgICB3aGVyZSBUIDogc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChwdHIgPT0gSW50UHRyLlplcm8pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50TnVsbEV4Y2VwdGlvbigiQ2Fubm90IGFkZCBhIG51bGwgcG9pbnRlciIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZihzaXplSW5CeXRlcyA8PSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBBcmd1bWVudEV4Y2VwdGlvbigiQ2Fubm90IHB1dCBhbiBlbXB0eSBhcnJheSIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIUlzU3VwcG9ydGVkVHlwZTxUPigpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBBcmd1bWVudEV4Y2VwdGlvbigiQ2Fubm90IHB1dCBhbiBhcnJheSBvZiB0eXBlICIKKyAgICAgICAgICAgICAgICAgICAgKyB0eXBlb2YoVCkgKyAiIGludG8gdGhpcyBidWZmZXIiKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKEJpdENvbnZlcnRlci5Jc0xpdHRsZUVuZGlhbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBvZmZzZXQgLT0gc2l6ZUluQnl0ZXM7CisgICAgICAgICAgICAgICAgQXNzZXJ0T2Zmc2V0QW5kTGVuZ3RoKG9mZnNldCwgc2l6ZUluQnl0ZXMpOworICAgICAgICAgICAgICAgIC8vIGlmIHdlIGFyZSBMRSwganVzdCBkbyBhIGJsb2NrIGNvcHkKKyNpZiBFTkFCTEVfU1BBTl9UICYmIFVOU0FGRV9CWVRFQlVGRkVSCisgICAgICAgICAgICAgICAgdW5zYWZlCisgICAgICAgICAgICAgICAgeyAKKyAgICAgICAgICAgICAgICAgICAgdmFyIHNwYW4gPSBuZXcgU3BhbjxieXRlPihwdHIuVG9Qb2ludGVyKCksIHNpemVJbkJ5dGVzKTsKKyAgICAgICAgICAgICAgICAgICAgc3Bhbi5Db3B5VG8oX2J1ZmZlci5TcGFuLlNsaWNlKG9mZnNldCwgc2l6ZUluQnl0ZXMpKTsKKyAgICAgICAgICAgICAgICB9CisjZWxzZQorICAgICAgICAgICAgICAgIE1hcnNoYWwuQ29weShwdHIsIF9idWZmZXIuQnVmZmVyLCBvZmZzZXQsIHNpemVJbkJ5dGVzKTsKICNlbmRpZgogICAgICAgICAgICAgfQogICAgICAgICAgICAgZWxzZQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvbmV0L0ZsYXRCdWZmZXJzL0J5dGVCdWZmZXJVdGlsLmNzIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvbmV0L0ZsYXRCdWZmZXJzL0J5dGVCdWZmZXJVdGlsLmNzCmluZGV4IDY2ZTgyNjYuLmE1ZjJmYjkgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL25ldC9GbGF0QnVmZmVycy9CeXRlQnVmZmVyVXRpbC5jcworKysgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy9uZXQvRmxhdEJ1ZmZlcnMvQnl0ZUJ1ZmZlclV0aWwuY3MKQEAgLTE2LDcgKzE2LDcgQEAKIAogdXNpbmcgU3lzdGVtOwogCi1uYW1lc3BhY2UgRmxhdEJ1ZmZlcnMKK25hbWVzcGFjZSBHb29nbGUuRmxhdEJ1ZmZlcnMKIHsKIAkvLy8gPHN1bW1hcnk+CiAJLy8vIENsYXNzIHRoYXQgY29sbGVjdHMgdXRpbGl0eSBmdW5jdGlvbnMgYXJvdW5kIGBCeXRlQnVmZmVyYC4KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL25ldC9GbGF0QnVmZmVycy9GbGF0QnVmZmVyQnVpbGRlci5jcyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL25ldC9GbGF0QnVmZmVycy9GbGF0QnVmZmVyQnVpbGRlci5jcwppbmRleCBjNzJiNjI0Li5lNTUwZjkwIDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy9uZXQvRmxhdEJ1ZmZlcnMvRmxhdEJ1ZmZlckJ1aWxkZXIuY3MKKysrIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvbmV0L0ZsYXRCdWZmZXJzL0ZsYXRCdWZmZXJCdWlsZGVyLmNzCkBAIC0yMyw3ICsyMyw3IEBACiAvLy8gQGFkZHRvZ3JvdXAgZmxhdGJ1ZmZlcnNfY3NoYXJwX2FwaQogLy8vIEB7CiAKLW5hbWVzcGFjZSBGbGF0QnVmZmVycworbmFtZXNwYWNlIEdvb2dsZS5GbGF0QnVmZmVycwogewogICAgIC8vLyA8c3VtbWFyeT4KICAgICAvLy8gUmVzcG9uc2libGUgZm9yIGJ1aWxkaW5nIHVwIGFuZCBhY2Nlc3NpbmcgYSBGbGF0QnVmZmVyIGZvcm1hdHRlZCBieXRlCkBAIC0yMTAsNiArMjEwLDMxIEBACiAgICAgICAgICAgICBfc3BhY2UgPSBfYmIuUHV0KF9zcGFjZSwgeCk7CiAgICAgICAgIH0KIAorICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBQdXRzIGFuIGFycmF5IG9mIHR5cGUgVCBpbnRvIHRoaXMgYnVpbGRlciBhdCB0aGUKKyAgICAgICAgLy8vIGN1cnJlbnQgb2Zmc2V0CisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8dHlwZXBhcmFtIG5hbWU9IlQiPlRoZSB0eXBlIG9mIHRoZSBpbnB1dCBkYXRhIDwvdHlwZXBhcmFtPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9IngiPlRoZSBhcnJheSBzZWdtZW50IHRvIGNvcHkgZGF0YSBmcm9tPC9wYXJhbT4KKyAgICAgICAgcHVibGljIHZvaWQgUHV0PFQ+KEFycmF5U2VnbWVudDxUPiB4KQorICAgICAgICAgICAgd2hlcmUgVCA6IHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBfc3BhY2UgPSBfYmIuUHV0KF9zcGFjZSwgeCk7CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBQdXRzIGRhdGEgb2YgdHlwZSBUIGludG8gdGhpcyBidWlsZGVyIGF0IHRoZQorICAgICAgICAvLy8gY3VycmVudCBvZmZzZXQKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDx0eXBlcGFyYW0gbmFtZT0iVCI+VGhlIHR5cGUgb2YgdGhlIGlucHV0IGRhdGEgPC90eXBlcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0icHRyIj5UaGUgcG9pbnRlciB0byBjb3B5IGRhdGEgZnJvbTwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ic2l6ZUluQnl0ZXMiPlRoZSBsZW5ndGggb2YgdGhlIGRhdGEgaW4gYnl0ZXM8L3BhcmFtPgorICAgICAgICBwdWJsaWMgdm9pZCBQdXQ8VD4oSW50UHRyIHB0ciwgaW50IHNpemVJbkJ5dGVzKQorICAgICAgICAgICAgd2hlcmUgVCA6IHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBfc3BhY2UgPSBfYmIuUHV0PFQ+KF9zcGFjZSwgcHRyLCBzaXplSW5CeXRlcyk7CisgICAgICAgIH0KKwogI2lmIEVOQUJMRV9TUEFOX1QgJiYgKFVOU0FGRV9CWVRFQlVGRkVSIHx8IE5FVFNUQU5EQVJEMl8xKQogICAgICAgICAvLy8gPHN1bW1hcnk+CiAgICAgICAgIC8vLyBQdXRzIGEgc3BhbiBvZiB0eXBlIFQgaW50byB0aGlzIGJ1aWxkZXIgYXQgdGhlCkBAIC0yOTgsMTIgKzMyMywyMyBAQAogICAgICAgICBwdWJsaWMgdm9pZCBBZGQ8VD4oVFtdIHgpCiAgICAgICAgICAgICB3aGVyZSBUIDogc3RydWN0CiAgICAgICAgIHsKKyAgICAgICAgICAgIEFkZChuZXcgQXJyYXlTZWdtZW50PFQ+KHgpKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIEFkZCBhbiBhcnJheSBvZiB0eXBlIFQgdG8gdGhlIGJ1ZmZlciAoYWxpZ25zIHRoZSBkYXRhIGFuZCBncm93cyBpZiBuZWNlc3NhcnkpLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHR5cGVwYXJhbSBuYW1lPSJUIj5UaGUgdHlwZSBvZiB0aGUgaW5wdXQgZGF0YTwvdHlwZXBhcmFtPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9IngiPlRoZSBhcnJheSBzZWdtZW50IHRvIGNvcHkgZGF0YSBmcm9tPC9wYXJhbT4KKyAgICAgICAgcHVibGljIHZvaWQgQWRkPFQ+KEFycmF5U2VnbWVudDxUPiB4KQorICAgICAgICAgICAgd2hlcmUgVCA6IHN0cnVjdAorICAgICAgICB7CiAgICAgICAgICAgICBpZiAoeCA9PSBudWxsKQogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIHRocm93IG5ldyBBcmd1bWVudE51bGxFeGNlcHRpb24oIkNhbm5vdCBhZGQgYSBudWxsIGFycmF5Iik7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIGlmKCB4Lkxlbmd0aCA9PSAwKQorICAgICAgICAgICAgaWYoIHguQ291bnQgPT0gMCkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAvLyBkb24ndCBkbyBhbnl0aGluZyBpZiB0aGUgYXJyYXkgaXMgZW1wdHkKICAgICAgICAgICAgICAgICByZXR1cm47CkBAIC0zMTcsMTAgKzM1Myw1MiBAQAogICAgICAgICAgICAgaW50IHNpemUgPSBCeXRlQnVmZmVyLlNpemVPZjxUPigpOwogICAgICAgICAgICAgLy8gTmVlZCB0byBwcmVwIG9uIHNpemUgKGZvciBkYXRhIGFsaWdubWVudCkgYW5kIHRoZW4gd2UgcGFzcyB0aGUKICAgICAgICAgICAgIC8vIHJlc3Qgb2YgdGhlIGxlbmd0aCAobWludXMgMSkgYXMgYWRkaXRpb25hbCBieXRlcwotICAgICAgICAgICAgUHJlcChzaXplLCBzaXplICogKHguTGVuZ3RoIC0gMSkpOworICAgICAgICAgICAgUHJlcChzaXplLCBzaXplICogKHguQ291bnQgLSAxKSk7CiAgICAgICAgICAgICBQdXQoeCk7CiAgICAgICAgIH0KIAorICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBBZGRzIHRoZSBkYXRhIG9mIHR5cGUgVCBwb2ludGVkIHRvIGJ5IHRoZSBnaXZlbiBwb2ludGVyIHRvIHRoZSBidWZmZXIgKGFsaWducyB0aGUgZGF0YSBhbmQgZ3Jvd3MgaWYgbmVjZXNzYXJ5KS4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDx0eXBlcGFyYW0gbmFtZT0iVCI+VGhlIHR5cGUgb2YgdGhlIGlucHV0IGRhdGE8L3R5cGVwYXJhbT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJwdHIiPlRoZSBwb2ludGVyIHRvIGNvcHkgZGF0YSBmcm9tPC9wYXJhbT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJzaXplSW5CeXRlcyI+VGhlIGRhdGEgc2l6ZSBpbiBieXRlczwvcGFyYW0+CisgICAgICAgIHB1YmxpYyB2b2lkIEFkZDxUPihJbnRQdHIgcHRyLCBpbnQgc2l6ZUluQnl0ZXMpCisgICAgICAgICAgICB3aGVyZSBUIDogc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGlmKHNpemVJbkJ5dGVzID09IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gZG9uJ3QgZG8gYW55dGhpbmcgaWYgdGhlIGFycmF5IGlzIGVtcHR5CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAocHRyID09IEludFB0ci5aZXJvKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBBcmd1bWVudE51bGxFeGNlcHRpb24oIkNhbm5vdCBhZGQgYSBudWxsIHBvaW50ZXIiKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYoc2l6ZUluQnl0ZXMgPCAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBBcmd1bWVudE91dE9mUmFuZ2VFeGNlcHRpb24oInNpemVJbkJ5dGVzIiwgInNpemVJbkJ5dGVzIGNhbm5vdCBiZSBuZWdhdGl2ZSIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZighQnl0ZUJ1ZmZlci5Jc1N1cHBvcnRlZFR5cGU8VD4oKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXJndW1lbnRFeGNlcHRpb24oIkNhbm5vdCBhZGQgdGhpcyBUeXBlIGFycmF5IHRvIHRoZSBidWlsZGVyIik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGludCBzaXplID0gQnl0ZUJ1ZmZlci5TaXplT2Y8VD4oKTsKKyAgICAgICAgICAgIGlmKChzaXplSW5CeXRlcyAlIHNpemUpICE9IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgZ2l2ZW4gc2l6ZSBpbiBieXRlcyAiICsgc2l6ZUluQnl0ZXMgKyAiIGRvZXNuJ3QgbWF0Y2ggdGhlIGVsZW1lbnQgc2l6ZSBvZiBUICggIiArIHNpemUgKyAiKSIsICJzaXplSW5CeXRlcyIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBOZWVkIHRvIHByZXAgb24gc2l6ZSAoZm9yIGRhdGEgYWxpZ25tZW50KSBhbmQgdGhlbiB3ZSBwYXNzIHRoZQorICAgICAgICAgICAgLy8gcmVzdCBvZiB0aGUgbGVuZ3RoIChtaW51cyAxKSBhcyBhZGRpdGlvbmFsIGJ5dGVzCisgICAgICAgICAgICBQcmVwKHNpemUsIHNpemVJbkJ5dGVzIC0gc2l6ZSk7CisgICAgICAgICAgICBQdXQ8VD4ocHRyLCBzaXplSW5CeXRlcyk7CisgICAgICAgIH0KKwogI2lmIEVOQUJMRV9TUEFOX1QgJiYgKFVOU0FGRV9CWVRFQlVGRkVSIHx8IE5FVFNUQU5EQVJEMl8xKQogICAgICAgICAvLy8gPHN1bW1hcnk+CiAgICAgICAgIC8vLyBBZGQgYSBzcGFuIG9mIHR5cGUgVCB0byB0aGUgYnVmZmVyIChhbGlnbnMgdGhlIGRhdGEgYW5kIGdyb3dzIGlmIG5lY2Vzc2FyeSkuCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy9uZXQvRmxhdEJ1ZmZlcnMvRmxhdEJ1ZmZlckNvbnN0YW50cy5jcyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL25ldC9GbGF0QnVmZmVycy9GbGF0QnVmZmVyQ29uc3RhbnRzLmNzCmluZGV4IDQ3M2Y3OWEuLmUzZjBmODkgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL25ldC9GbGF0QnVmZmVycy9GbGF0QnVmZmVyQ29uc3RhbnRzLmNzCisrKyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL25ldC9GbGF0QnVmZmVycy9GbGF0QnVmZmVyQ29uc3RhbnRzLmNzCkBAIC0xOSw3ICsxOSw3IEBACiB1c2luZyBTeXN0ZW0uTGlucTsKIHVzaW5nIFN5c3RlbS5UZXh0OwogCi1uYW1lc3BhY2UgRmxhdEJ1ZmZlcnMKK25hbWVzcGFjZSBHb29nbGUuRmxhdEJ1ZmZlcnMKIHsKICAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEZsYXRCdWZmZXJDb25zdGFudHMKICAgICB7CkBAIC0zMiw2ICszMiw2IEBACiAgICAgICAgIENoYW5nZXMgdG8gdGhlIEMjIGltcGxlbWVudGF0aW9uIG5lZWQgdG8gYmUgc3VyZSB0byBjaGFuZ2UKICAgICAgICAgdGhlIHZlcnNpb24gaGVyZSBhbmQgaW4gdGhlIGNvZGUgZ2VuZXJhdG9yIG9uIGV2ZXJ5IHBvc3NpYmxlCiAgICAgICAgIGluY29tcGF0aWJsZSBjaGFuZ2UgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyB2b2lkIEZMQVRCVUZGRVJTXzJfMF8wKCkge30KKyAgICAgICAgcHVibGljIHN0YXRpYyB2b2lkIEZMQVRCVUZGRVJTXzJfMF84KCkge30KICAgICB9CiB9CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy9uZXQvRmxhdEJ1ZmZlcnMvRmxhdEJ1ZmZlcnMuY3Nwcm9qIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvbmV0L0ZsYXRCdWZmZXJzL0ZsYXRCdWZmZXJzLmNzcHJvagpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTJiOGJmYi4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy9uZXQvRmxhdEJ1ZmZlcnMvRmxhdEJ1ZmZlcnMuY3Nwcm9qCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAot77u/PFByb2plY3QgU2RrPSJNaWNyb3NvZnQuTkVULlNkayIgVG9vbHNWZXJzaW9uPSIxMi4wIiBEZWZhdWx0VGFyZ2V0cz0iQnVpbGQiIHhtbG5zPSJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL2RldmVsb3Blci9tc2J1aWxkLzIwMDMiPgotCi0gIDxQcm9wZXJ0eUdyb3VwPgotICAgIDxUYXJnZXRGcmFtZXdvcmtzPm5ldHN0YW5kYXJkMi4xO25ldHN0YW5kYXJkMi4wO25ldDQ2PC9UYXJnZXRGcmFtZXdvcmtzPgotICAgIDxHZW5lcmF0ZUFzc2VtYmx5SW5mbz5mYWxzZTwvR2VuZXJhdGVBc3NlbWJseUluZm8+Ci0gIDwvUHJvcGVydHlHcm91cD4KLQotICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IickKFVOU0FGRV9CWVRFQlVGRkVSKScgPT0gJ3RydWUnIj4KLSAgICA8RGVmaW5lQ29uc3RhbnRzPiQoRGVmaW5lQ29uc3RhbnRzKTtVTlNBRkVfQllURUJVRkZFUjwvRGVmaW5lQ29uc3RhbnRzPgotICAgIDxBbGxvd1Vuc2FmZUJsb2Nrcz50cnVlPC9BbGxvd1Vuc2FmZUJsb2Nrcz4KLSAgPC9Qcm9wZXJ0eUdyb3VwPgotICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IickKEJZVEVCVUZGRVJfTk9fQk9VTkRTX0NIRUNLKScgPT0gJ3RydWUnIj4KLSAgICA8RGVmaW5lQ29uc3RhbnRzPiQoRGVmaW5lQ29uc3RhbnRzKTtCWVRFQlVGRkVSX05PX0JPVU5EU19DSEVDSzwvRGVmaW5lQ29uc3RhbnRzPgotICA8L1Byb3BlcnR5R3JvdXA+Ci0gIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iJyQoRU5BQkxFX1NQQU5fVCknID09ICd0cnVlJyI+Ci0gICAgPERlZmluZUNvbnN0YW50cz4kKERlZmluZUNvbnN0YW50cyk7RU5BQkxFX1NQQU5fVDwvRGVmaW5lQ29uc3RhbnRzPgotICA8L1Byb3BlcnR5R3JvdXA+Ci0KLSAgPEl0ZW1Hcm91cCBDb25kaXRpb249IignJChFTkFCTEVfU1BBTl9UKScgPT0gJ3RydWUnKSBBbmQgKCgnJChUYXJnZXRGcmFtZXdvcmspJyA9PSAnbmV0c3RhbmRhcmQyLjAnKSBPciAoJyQoVGFyZ2V0RnJhbWV3b3JrKScgPT0gJ25ldDQ2JykpIj4KLSAgICA8UGFja2FnZVJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0uTWVtb3J5IiBWZXJzaW9uPSI0LjUuNCIgLz4KLSAgPC9JdGVtR3JvdXA+Ci0KLTwvUHJvamVjdD4KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL25ldC9GbGF0QnVmZmVycy9Hb29nbGUuRmxhdEJ1ZmZlcnMuY3Nwcm9qIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvbmV0L0ZsYXRCdWZmZXJzL0dvb2dsZS5GbGF0QnVmZmVycy5jc3Byb2oKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTA3YmE3YwotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL25ldC9GbGF0QnVmZmVycy9Hb29nbGUuRmxhdEJ1ZmZlcnMuY3Nwcm9qCkBAIC0wLDAgKzEsNDYgQEAKK++7vzxQcm9qZWN0IFNkaz0iTWljcm9zb2Z0Lk5FVC5TZGsiIFRvb2xzVmVyc2lvbj0iMTIuMCIgRGVmYXVsdFRhcmdldHM9IkJ1aWxkIiB4bWxucz0iaHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS9kZXZlbG9wZXIvbXNidWlsZC8yMDAzIj4KKworICA8UHJvcGVydHlHcm91cD4KKyAgICA8VGFyZ2V0RnJhbWV3b3Jrcz5uZXRzdGFuZGFyZDIuMTtuZXRzdGFuZGFyZDIuMDtuZXQ0NjwvVGFyZ2V0RnJhbWV3b3Jrcz4KKyAgICA8RGVzY3JpcHRpb24+QSBjcm9zcy1wbGF0Zm9ybSBtZW1vcnkgZWZmaWNpZW50IHNlcmlhbGl6YXRpb24gbGlicmFyeTwvRGVzY3JpcHRpb24+CisgICAgPFBhY2thZ2VWZXJzaW9uPjIuMC44LWJldGEuMTwvUGFja2FnZVZlcnNpb24+CisgICAgPEF1dGhvcnM+R29vZ2xlIExMQzwvQXV0aG9ycz4KKyAgICA8UGFja2FnZVByb2plY3RVcmw+aHR0cHM6Ly9naXRodWIuY29tL2dvb2dsZS9mbGF0YnVmZmVyczwvUGFja2FnZVByb2plY3RVcmw+CisgICAgPFJlcG9zaXRvcnlVcmw+aHR0cHM6Ly9naXRodWIuY29tL2dvb2dsZS9mbGF0YnVmZmVyczwvUmVwb3NpdG9yeVVybD4KKyAgICA8UHVibGlzaFJlcG9zaXRvcnlVcmw+dHJ1ZTwvUHVibGlzaFJlcG9zaXRvcnlVcmw+CisgICAgPFBhY2thZ2VMaWNlbnNlRmlsZT5MSUNFTlNFLnR4dDwvUGFja2FnZUxpY2Vuc2VGaWxlPgorICAgIDxQYWNrYWdlSWNvbj5mbGF0YnVmZmVycy5wbmc8L1BhY2thZ2VJY29uPgorICAgIDxQYWNrYWdlVGFncz5Hb29nbGU7RmxhdEJ1ZmZlcnM7U2VyaWFsaXphdGlvbjtCdWZmZXI7QmluYXJ5O3plcm8gY29weTwvUGFja2FnZVRhZ3M+CisgICAgPENvcHlyaWdodD5Db3B5cmlnaHQgMjAyMiBHb29nbGUgTExDPC9Db3B5cmlnaHQ+CisgICAgPEluY2x1ZGVTeW1ib2xzPnRydWU8L0luY2x1ZGVTeW1ib2xzPgorICAgIDxTeW1ib2xQYWNrYWdlRm9ybWF0PnNudXBrZzwvU3ltYm9sUGFja2FnZUZvcm1hdD4KKyAgICA8U2lnbkFzc2VtYmx5PnRydWU8L1NpZ25Bc3NlbWJseT4KKyAgICA8QXNzZW1ibHlPcmlnaW5hdG9yS2V5RmlsZT5mbGF0YnVmZmVycy5zbms8L0Fzc2VtYmx5T3JpZ2luYXRvcktleUZpbGU+CisgICAgPERlbGF5U2lnbj5mYWxzZTwvRGVsYXlTaWduPgorICA8L1Byb3BlcnR5R3JvdXA+CisKKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChVTlNBRkVfQllURUJVRkZFUiknID09ICd0cnVlJyI+CisgICAgPERlZmluZUNvbnN0YW50cz4kKERlZmluZUNvbnN0YW50cyk7VU5TQUZFX0JZVEVCVUZGRVI8L0RlZmluZUNvbnN0YW50cz4KKyAgICA8QWxsb3dVbnNhZmVCbG9ja3M+dHJ1ZTwvQWxsb3dVbnNhZmVCbG9ja3M+CisgIDwvUHJvcGVydHlHcm91cD4KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChCWVRFQlVGRkVSX05PX0JPVU5EU19DSEVDSyknID09ICd0cnVlJyI+CisgICAgPERlZmluZUNvbnN0YW50cz4kKERlZmluZUNvbnN0YW50cyk7QllURUJVRkZFUl9OT19CT1VORFNfQ0hFQ0s8L0RlZmluZUNvbnN0YW50cz4KKyAgPC9Qcm9wZXJ0eUdyb3VwPgorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IickKEVOQUJMRV9TUEFOX1QpJyA9PSAndHJ1ZSciPgorICAgIDxEZWZpbmVDb25zdGFudHM+JChEZWZpbmVDb25zdGFudHMpO0VOQUJMRV9TUEFOX1Q8L0RlZmluZUNvbnN0YW50cz4KKyAgPC9Qcm9wZXJ0eUdyb3VwPgorCisgIDxJdGVtR3JvdXAgQ29uZGl0aW9uPSIoJyQoRU5BQkxFX1NQQU5fVCknID09ICd0cnVlJykgQW5kICgoJyQoVGFyZ2V0RnJhbWV3b3JrKScgPT0gJ25ldHN0YW5kYXJkMi4wJykgT3IgKCckKFRhcmdldEZyYW1ld29yayknID09ICduZXQ0NicpKSI+CisgICAgPFBhY2thZ2VSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtLk1lbW9yeSIgVmVyc2lvbj0iNC41LjQiIC8+CisgIDwvSXRlbUdyb3VwPgorCisgIDxJdGVtR3JvdXA+CisgICAgPFBhY2thZ2VSZWZlcmVuY2UgSW5jbHVkZT0iTWljcm9zb2Z0LlNvdXJjZUxpbmsuR2l0SHViIiBWZXJzaW9uPSIxLjEuMSIgUHJpdmF0ZUFzc2V0cz0iQWxsIiAvPgorICA8L0l0ZW1Hcm91cD4KKworICA8SXRlbUdyb3VwPgorICAgIDxOb25lIEluY2x1ZGU9Ii4uXC4uXExJQ0VOU0UudHh0IiBQYWNrPSJ0cnVlIiBQYWNrYWdlUGF0aD0iIiAvPgorICAgIDxOb25lIEluY2x1ZGU9ImZsYXRidWZmZXJzLnBuZyIgUGFjaz0idHJ1ZSIgUGFja2FnZVBhdGg9IiIgLz4KKyAgPC9JdGVtR3JvdXA+CisKKzwvUHJvamVjdD4KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL25ldC9GbGF0QnVmZmVycy9JRmxhdGJ1ZmZlck9iamVjdC5jcyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL25ldC9GbGF0QnVmZmVycy9JRmxhdGJ1ZmZlck9iamVjdC5jcwppbmRleCA2YTE1YWJhLi5jMWQxMDZjIDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy9uZXQvRmxhdEJ1ZmZlcnMvSUZsYXRidWZmZXJPYmplY3QuY3MKKysrIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvbmV0L0ZsYXRCdWZmZXJzL0lGbGF0YnVmZmVyT2JqZWN0LmNzCkBAIC0xNCw3ICsxNCw3IEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCi1uYW1lc3BhY2UgRmxhdEJ1ZmZlcnMKK25hbWVzcGFjZSBHb29nbGUuRmxhdEJ1ZmZlcnMKIHsKICAgICAvLy8gPHN1bW1hcnk+CiAgICAgLy8vIFRoaXMgaXMgdGhlIGJhc2UgZm9yIGJvdGggc3RydWN0cyBhbmQgdGFibGVzLgpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvbmV0L0ZsYXRCdWZmZXJzL09mZnNldC5jcyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL25ldC9GbGF0QnVmZmVycy9PZmZzZXQuY3MKaW5kZXggMmIxN2NlYy4uZDJkZDYyOCAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvbmV0L0ZsYXRCdWZmZXJzL09mZnNldC5jcworKysgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy9uZXQvRmxhdEJ1ZmZlcnMvT2Zmc2V0LmNzCkBAIC0xNCw3ICsxNCw3IEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCi1uYW1lc3BhY2UgRmxhdEJ1ZmZlcnMKK25hbWVzcGFjZSBHb29nbGUuRmxhdEJ1ZmZlcnMKIHsKICAgICAvLy8gPHN1bW1hcnk+CiAgICAgLy8vIE9mZnNldCBjbGFzcyBmb3IgdHlwZXNhZmUgYXNzaWdubWVudHMuCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy9uZXQvRmxhdEJ1ZmZlcnMvUHJvcGVydGllcy9Bc3NlbWJseUluZm8uY3MgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy9uZXQvRmxhdEJ1ZmZlcnMvUHJvcGVydGllcy9Bc3NlbWJseUluZm8uY3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFlZGZhYzQuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvbmV0L0ZsYXRCdWZmZXJzL1Byb3BlcnRpZXMvQXNzZW1ibHlJbmZvLmNzCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE0IEdvb2dsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotdXNpbmcgU3lzdGVtLlJlZmxlY3Rpb247Ci11c2luZyBTeXN0ZW0uUnVudGltZS5Db21waWxlclNlcnZpY2VzOwotdXNpbmcgU3lzdGVtLlJ1bnRpbWUuSW50ZXJvcFNlcnZpY2VzOwotCi0vLyBHZW5lcmFsIEluZm9ybWF0aW9uIGFib3V0IGFuIGFzc2VtYmx5IGlzIGNvbnRyb2xsZWQgdGhyb3VnaCB0aGUgZm9sbG93aW5nCi0vLyBzZXQgb2YgYXR0cmlidXRlcy4gQ2hhbmdlIHRoZXNlIGF0dHJpYnV0ZSB2YWx1ZXMgdG8gbW9kaWZ5IHRoZSBpbmZvcm1hdGlvbgotLy8gYXNzb2NpYXRlZCB3aXRoIGFuIGFzc2VtYmx5LgotW2Fzc2VtYmx5OiBBc3NlbWJseVRpdGxlKCJGbGF0QnVmZmVycyIpXQotW2Fzc2VtYmx5OiBBc3NlbWJseURlc2NyaXB0aW9uKCIiKV0KLVthc3NlbWJseTogQXNzZW1ibHlDb25maWd1cmF0aW9uKCIiKV0KLVthc3NlbWJseTogQXNzZW1ibHlDb21wYW55KCIiKV0KLVthc3NlbWJseTogQXNzZW1ibHlQcm9kdWN0KCJGbGF0QnVmZmVycyIpXQotW2Fzc2VtYmx5OiBBc3NlbWJseUNvcHlyaWdodCgiQ29weXJpZ2h0IChjKSAyMDE1IEdvb2dsZSBJbmMiKV0KLVthc3NlbWJseTogQXNzZW1ibHlUcmFkZW1hcmsoIiIpXQotW2Fzc2VtYmx5OiBBc3NlbWJseUN1bHR1cmUoIiIpXQotCi0vLyBTZXR0aW5nIENvbVZpc2libGUgdG8gZmFsc2UgbWFrZXMgdGhlIHR5cGVzIGluIHRoaXMgYXNzZW1ibHkgbm90IHZpc2libGUKLS8vIHRvIENPTSBjb21wb25lbnRzLiAgSWYgeW91IG5lZWQgdG8gYWNjZXNzIGEgdHlwZSBpbiB0aGlzIGFzc2VtYmx5IGZyb20KLS8vIENPTSwgc2V0IHRoZSBDb21WaXNpYmxlIGF0dHJpYnV0ZSB0byB0cnVlIG9uIHRoYXQgdHlwZS4KLVthc3NlbWJseTogQ29tVmlzaWJsZShmYWxzZSldCi0KLS8vIFRoZSBmb2xsb3dpbmcgR1VJRCBpcyBmb3IgdGhlIElEIG9mIHRoZSB0eXBlbGliIGlmIHRoaXMgcHJvamVjdCBpcyBleHBvc2VkIHRvIENPTQotW2Fzc2VtYmx5OiBHdWlkKCI5MWMzMmU2NC1lZjIwLTQ3ZGYtOWM5Zi1jZWM5MjA3YmM2ZGYiKV0KLQotLy8gVmVyc2lvbiBpbmZvcm1hdGlvbiBmb3IgYW4gYXNzZW1ibHkgY29uc2lzdHMgb2YgdGhlIGZvbGxvd2luZyBmb3VyIHZhbHVlczoKLS8vCi0vLyAgICAgIE1ham9yIFZlcnNpb24KLS8vICAgICAgTWlub3IgVmVyc2lvbgotLy8gICAgICBCdWlsZCBOdW1iZXIKLS8vICAgICAgUmV2aXNpb24KLS8vCi0vLyBZb3UgY2FuIHNwZWNpZnkgYWxsIHRoZSB2YWx1ZXMgb3IgeW91IGNhbiBkZWZhdWx0IHRoZSBCdWlsZCBhbmQgUmV2aXNpb24gTnVtYmVycwotLy8gYnkgdXNpbmcgdGhlICcqJyBhcyBzaG93biBiZWxvdzoKLS8vIFthc3NlbWJseTogQXNzZW1ibHlWZXJzaW9uKCIxLjAuKiIpXQotW2Fzc2VtYmx5OiBBc3NlbWJseVZlcnNpb24oIjEuMC4wLjAiKV0KLVthc3NlbWJseTogQXNzZW1ibHlGaWxlVmVyc2lvbigiMS4wLjAuMCIpXQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvbmV0L0ZsYXRCdWZmZXJzL1N0cnVjdC5jcyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL25ldC9GbGF0QnVmZmVycy9TdHJ1Y3QuY3MKaW5kZXggNDgzMmNkYS4uYjQ1MzliZiAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvbmV0L0ZsYXRCdWZmZXJzL1N0cnVjdC5jcworKysgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy9uZXQvRmxhdEJ1ZmZlcnMvU3RydWN0LmNzCkBAIC0xNCw3ICsxNCw3IEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCi1uYW1lc3BhY2UgRmxhdEJ1ZmZlcnMKK25hbWVzcGFjZSBHb29nbGUuRmxhdEJ1ZmZlcnMKIHsKICAgICAvLy8gPHN1bW1hcnk+CiAgICAgLy8vIEFsbCBzdHJ1Y3RzIGluIHRoZSBnZW5lcmF0ZWQgY29kZSBkZXJpdmUgZnJvbSB0aGlzIGNsYXNzLCBhbmQgYWRkIHRoZWlyIG93biBhY2Nlc3NvcnMuCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy9uZXQvRmxhdEJ1ZmZlcnMvVGFibGUuY3MgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy9uZXQvRmxhdEJ1ZmZlcnMvVGFibGUuY3MKaW5kZXggZDg4OGRlNS4uMjFlZjdkYyAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvbmV0L0ZsYXRCdWZmZXJzL1RhYmxlLmNzCisrKyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL25ldC9GbGF0QnVmZmVycy9UYWJsZS5jcwpAQCAtMTgsNyArMTgsNyBAQAogdXNpbmcgU3lzdGVtLlRleHQ7CiB1c2luZyBTeXN0ZW0uUnVudGltZS5JbnRlcm9wU2VydmljZXM7CiAKLW5hbWVzcGFjZSBGbGF0QnVmZmVycworbmFtZXNwYWNlIEdvb2dsZS5GbGF0QnVmZmVycwogewogICAgIC8vLyA8c3VtbWFyeT4KICAgICAvLy8gQWxsIHRhYmxlcyBpbiB0aGUgZ2VuZXJhdGVkIGNvZGUgZGVyaXZlIGZyb20gdGhpcyBzdHJ1Y3QsIGFuZCBhZGQgdGhlaXIgb3duIGFjY2Vzc29ycy4KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL25ldC9GbGF0QnVmZmVycy9mbGF0YnVmZmVycy5wbmcgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy9uZXQvRmxhdEJ1ZmZlcnMvZmxhdGJ1ZmZlcnMucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJjNzI4ZjMKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy9uZXQvRmxhdEJ1ZmZlcnMvZmxhdGJ1ZmZlcnMucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL25ldC9GbGF0QnVmZmVycy9mbGF0YnVmZmVycy5zbmsgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy9uZXQvRmxhdEJ1ZmZlcnMvZmxhdGJ1ZmZlcnMuc25rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcwYTIxNDYKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy9uZXQvRmxhdEJ1ZmZlcnMvZmxhdGJ1ZmZlcnMuc25rCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3BhY2thZ2UuanNvbiBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3BhY2thZ2UuanNvbgppbmRleCA0MWJjNTFiLi4yNmUwODQxIDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy9wYWNrYWdlLmpzb24KKysrIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvcGFja2FnZS5qc29uCkBAIC0xLDYgKzEsNiBAQAogewogICAibmFtZSI6ICJmbGF0YnVmZmVycyIsCi0gICJ2ZXJzaW9uIjogIjIuMC42IiwKKyAgInZlcnNpb24iOiAiMi4wLjgiLAogICAiZGVzY3JpcHRpb24iOiAiTWVtb3J5IEVmZmljaWVudCBTZXJpYWxpemF0aW9uIExpYnJhcnkiLAogICAiZmlsZXMiOiBbCiAgICAgImpzLyoqLyouanMiLApAQCAtMTYsOCArMTYsOCBAQAogICAgICJ0ZXN0IjogInRlc3RzIgogICB9LAogICAic2NyaXB0cyI6IHsKLSAgICAidGVzdCI6ICJucG0gcnVuIGNvbXBpbGUgJiYgY2QgdGVzdHMgJiYgLi9UeXBlU2NyaXB0VGVzdC5zaCIsCi0gICAgImNvbXBpbGUiOiAidHNjICYmIHRzYyAtcCB0c2NvbmZpZy5tanMuanNvbiIsCisgICAgInRlc3QiOiAibnBtIHJ1biBjb21waWxlICYmIGNkIHRlc3RzL3RzICYmIHB5dGhvbjMgLi9UeXBlU2NyaXB0VGVzdC5weSIsCisgICAgImNvbXBpbGUiOiAidHNjICYmIHRzYyAtcCB0c2NvbmZpZy5tanMuanNvbiAmJiByb2xsdXAgLWMiLAogICAgICJwcmVwdWJsaXNoT25seSI6ICJucG0gaW5zdGFsbCAtLW9ubHk9ZGV2ICYmIG5wbSBydW4gY29tcGlsZSIKICAgfSwKICAgInJlcG9zaXRvcnkiOiB7CkBAIC0zNSwxMSArMzUsMTIgQEAKICAgImhvbWVwYWdlIjogImh0dHBzOi8vZ29vZ2xlLmdpdGh1Yi5pby9mbGF0YnVmZmVycy8iLAogICAiZGVwZW5kZW5jaWVzIjoge30sCiAgICJkZXZEZXBlbmRlbmNpZXMiOiB7Ci0gICAgIkBiYXplbC90eXBlc2NyaXB0IjogIl41LjIuMCIsCi0gICAgIkB0eXBlcy9ub2RlIjogIjE3LjAuMjEiLAotICAgICJAdHlwZXNjcmlwdC1lc2xpbnQvZXNsaW50LXBsdWdpbiI6ICJeNC4xMi4wIiwKLSAgICAiQHR5cGVzY3JpcHQtZXNsaW50L3BhcnNlciI6ICJeNC4xMi4wIiwKLSAgICAiZXNsaW50IjogIl43LjE3LjAiLAotICAgICJ0eXBlc2NyaXB0IjogIl40LjUuNSIKKyAgICAiQGJhemVsL3R5cGVzY3JpcHQiOiAiNS4yLjAiLAorICAgICJAdHlwZXMvbm9kZSI6ICIxOC43LjE2IiwKKyAgICAiQHR5cGVzY3JpcHQtZXNsaW50L2VzbGludC1wbHVnaW4iOiAiXjUuMzYuMiIsCisgICAgIkB0eXBlc2NyaXB0LWVzbGludC9wYXJzZXIiOiAiXjUuMzYuMiIsCisgICAgImVzbGludCI6ICJeOC4yMy4xIiwKKyAgICAicm9sbHVwIjogIl4yLjc5LjAiLAorICAgICJ0eXBlc2NyaXB0IjogIl40LjguMyIKICAgfQogfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvcHl0aG9uL2ZsYXRidWZmZXJzL192ZXJzaW9uLnB5IGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvcHl0aG9uL2ZsYXRidWZmZXJzL192ZXJzaW9uLnB5CmluZGV4IGE0NGU5MDAuLjc4MTI3OTEgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3B5dGhvbi9mbGF0YnVmZmVycy9fdmVyc2lvbi5weQorKysgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy9weXRob24vZmxhdGJ1ZmZlcnMvX3ZlcnNpb24ucHkKQEAgLTE0LDQgKzE0LDQgQEAKIAogIyBQbGFjZWhvbGRlciwgdG8gYmUgdXBkYXRlZCBkdXJpbmcgdGhlIHJlbGVhc2UgcHJvY2VzcwogIyBieSB0aGUgc2V0dXAucHkKLV9fdmVyc2lvbl9fID0gdSJsYXRlc3QiCitfX3ZlcnNpb25fXyA9IHUiMi4wLjgiCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy9weXRob24vZmxhdGJ1ZmZlcnMvYnVpbGRlci5weSBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3B5dGhvbi9mbGF0YnVmZmVycy9idWlsZGVyLnB5CmluZGV4IDNmMGNmNGUuLjliZGYxMTYgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3B5dGhvbi9mbGF0YnVmZmVycy9idWlsZGVyLnB5CisrKyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3B5dGhvbi9mbGF0YnVmZmVycy9idWlsZGVyLnB5CkBAIC0yMyw2ICsyMyw4IEBACiBmcm9tIC5jb21wYXQgaW1wb3J0IG1lbW9yeXZpZXdfdHlwZQogZnJvbSAuY29tcGF0IGltcG9ydCBpbXBvcnRfbnVtcHksIE51bXB5UmVxdWlyZWRGb3JUaGlzRmVhdHVyZQogCitpbXBvcnQgd2FybmluZ3MKKwogbnAgPSBpbXBvcnRfbnVtcHkoKQogIyMgQGZpbGUKICMjIEBhZGR0b2dyb3VwIGZsYXRidWZmZXJzX3B5dGhvbl9hcGkKQEAgLTc1LDYgKzc3LDEzIEBACiAgICAgIiIiCiAgICAgcGFzcwogCitjbGFzcyBFbmRWZWN0b3JMZW5ndGhNaXNtYXRjaGVkKFJ1bnRpbWVFcnJvcik6CisgICAgIiIiCisgICAgVGhlIG51bWJlciBvZiBlbGVtZW50cyBwYXNzZWQgdG8gRW5kVmVjdG9yIGRvZXMgbm90IG1hdGNoIHRoZSBudW1iZXIgCisgICAgc3BlY2lmaWVkIGluIFN0YXJ0VmVjdG9yLgorICAgICIiIgorICAgIHBhc3MKKwogCiAjIFZ0YWJsZU1ldGFkYXRhRmllbGRzIGlzIHRoZSBjb3VudCBvZiBtZXRhZGF0YSBmaWVsZHMgaW4gZWFjaCB2dGFibGUuCiBWdGFibGVNZXRhZGF0YUZpZWxkcyA9IDIKQEAgLTM3NywxMyArMzg2LDIwIEBACiAgICAgICAgIHJldHVybiBzZWxmLk9mZnNldCgpCiAgICAgIyMgQGVuZGNvbmQKIAotICAgIGRlZiBFbmRWZWN0b3Ioc2VsZik6CisgICAgZGVmIEVuZFZlY3RvcihzZWxmLCBudW1FbGVtcyA9IE5vbmUpOgogICAgICAgICAiIiJFbmRWZWN0b3Igd3JpdGVzIGRhdGEgbmVjZXNzYXJ5IHRvIGZpbmlzaCB2ZWN0b3IgY29uc3RydWN0aW9uLiIiIgogCiAgICAgICAgIHNlbGYuYXNzZXJ0TmVzdGVkKCkKICAgICAgICAgIyMgQGNvbmQgRkxBVEJVRkZFUlNfSU5URVJOQUwKICAgICAgICAgc2VsZi5uZXN0ZWQgPSBGYWxzZQogICAgICAgICAjIyBAZW5kY29uZAorICAgICAgICAgICAgICAgCisgICAgICAgIGlmIG51bUVsZW1zOgorICAgICAgICAgICAgd2FybmluZ3Mud2FybigibnVtRWxlbXMgaXMgZGVwcmVjYXRlZC4iLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRGVwcmVjYXRpb25XYXJuaW5nLCBzdGFja2xldmVsPTIpCisgICAgICAgICAgICBpZiBudW1FbGVtcyAhPSBzZWxmLnZlY3Rvck51bUVsZW1zOgorICAgICAgICAgICAgICAgIHJhaXNlIEVuZFZlY3Rvckxlbmd0aE1pc21hdGNoZWQoKTsKKwogICAgICAgICAjIHdlIGFscmVhZHkgbWFkZSBzcGFjZSBmb3IgdGhpcywgc28gd3JpdGUgd2l0aG91dCBQcmVwZW5kVWludDMyCiAgICAgICAgIHNlbGYuUGxhY2VVT2Zmc2V0VChzZWxmLnZlY3Rvck51bUVsZW1zKQogICAgICAgICBzZWxmLnZlY3Rvck51bUVsZW1zID0gTm9uZQpAQCAtNTYyLDkgKzU3OCwxMSBAQAogICAgICAgICBzZWxmLlBsYWNlKG9mZiwgZmxhZ3MpCiAKICAgICBkZWYgUHJlcGVuZFNsb3Qoc2VsZiwgZmxhZ3MsIG8sIHgsIGQpOgotICAgICAgICBOLmVuZm9yY2VfbnVtYmVyKHgsIGZsYWdzKQotICAgICAgICBOLmVuZm9yY2VfbnVtYmVyKGQsIGZsYWdzKQotICAgICAgICBpZiB4ICE9IGQgb3Igc2VsZi5mb3JjZURlZmF1bHRzOgorICAgICAgICBpZiB4IGlzIG5vdCBOb25lOgorICAgICAgICAgICAgTi5lbmZvcmNlX251bWJlcih4LCBmbGFncykKKyAgICAgICAgaWYgZCBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIE4uZW5mb3JjZV9udW1iZXIoZCwgZmxhZ3MpCisgICAgICAgIGlmIHggIT0gZCBvciAoc2VsZi5mb3JjZURlZmF1bHRzIGFuZCBkIGlzIG5vdCBOb25lKToKICAgICAgICAgICAgIHNlbGYuUHJlcGVuZChmbGFncywgeCkKICAgICAgICAgICAgIHNlbGYuU2xvdChvKQogCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy9yZWFkbWUubWQgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy9yZWFkbWUubWQKaW5kZXggNjQ5Y2YyNC4uNTA1NmE2NCAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvcmVhZG1lLm1kCisrKyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3JlYWRtZS5tZApAQCAtMiw2ICsyLDggQEAKID09PT09PT09PT09CiAKICFbQnVpbGQgc3RhdHVzXShodHRwczovL2dpdGh1Yi5jb20vZ29vZ2xlL2ZsYXRidWZmZXJzL2FjdGlvbnMvd29ya2Zsb3dzL2J1aWxkLnltbC9iYWRnZS5zdmc/YnJhbmNoPW1hc3RlcikKK1shW0Z1enppbmcgU3RhdHVzXShodHRwczovL29zcy1mdXp6LWJ1aWxkLWxvZ3Muc3RvcmFnZS5nb29nbGVhcGlzLmNvbS9iYWRnZXMvZmxhdGJ1ZmZlcnMuc3ZnKV0oaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL29zcy1mdXp6L2lzc3Vlcy9saXN0P3NvcnQ9LW9wZW5lZCZjYW49MSZxPXByb2o6ZmxhdGJ1ZmZlcnMpCitbIVtPcGVuU1NGIFNjb3JlY2FyZF0oaHR0cHM6Ly9hcGkuc2VjdXJpdHlzY29yZWNhcmRzLmRldi9wcm9qZWN0cy9naXRodWIuY29tL2dvb2dsZS9mbGF0YnVmZmVycy9iYWRnZSldKGh0dHBzOi8vYXBpLnNlY3VyaXR5c2NvcmVjYXJkcy5kZXYvcHJvamVjdHMvZ2l0aHViLmNvbS9nb29nbGUvZmxhdGJ1ZmZlcnMpCiBbIVtKb2luIHRoZSBjaGF0IGF0IGh0dHBzOi8vZ2l0dGVyLmltL2dvb2dsZS9mbGF0YnVmZmVyc10oaHR0cHM6Ly9iYWRnZXMuZ2l0dGVyLmltL2dvb2dsZS9mbGF0YnVmZmVycy5zdmcpXShodHRwczovL2dpdHRlci5pbS9nb29nbGUvZmxhdGJ1ZmZlcnM/dXRtX3NvdXJjZT1iYWRnZSZ1dG1fbWVkaXVtPWJhZGdlJnV0bV9jYW1wYWlnbj1wci1iYWRnZSZ1dG1fY29udGVudD1iYWRnZSkKIFshW0Rpc2NvcmQgQ2hhdF0oaHR0cHM6Ly9pbWcuc2hpZWxkcy5pby9kaXNjb3JkLzY1NjIwMjc4NTkyNjE1MjIwNi5zdmcpXShodHRwczovLy9kaXNjb3JkLmdnLzZxZ0tzM1IpCiBbIVtUd2l0dGVyIEZvbGxvd10oaHR0cHM6Ly9pbWcuc2hpZWxkcy5pby90d2l0dGVyL2ZvbGxvdy93dm8uc3ZnP3N0eWxlPXNvY2lhbCldKGh0dHBzOi8vdHdpdHRlci5jb20vd3ZvKQpAQCAtMTgsMzIgKzIwLDQ2IEBACiAqIE1hY09TIFgKICogTGludXgKICogQW5kcm9pZAotKiBBbmQgYW55IG90aGVycyB3aXRoIGEgcmVjZW50IEMrKyBjb21waWxlci4KKyogQW5kIGFueSBvdGhlcnMgd2l0aCBhIHJlY2VudCBDKysgY29tcGlsZXIgKEMrKyAxMSBhbmQgbmV3ZXIpCiAKICMjIFN1cHBvcnRlZCBwcm9ncmFtbWluZyBsYW5ndWFnZXMKLSogQysrCi0qIEMjCi0qIEMKLSogRGFydAotKiBHbwotKiBKYXZhCi0qIEphdmFTY3JpcHQKLSogTG9ic3RlcgotKiBMdWEKLSogUEhQCi0qIFB5dGhvbgotKiBSdXN0Ci0qIFR5cGVTY3JpcHQKKworQ29kZSBnZW5lcmF0aW9uIGFuZCBydW50aW1lIGxpYnJhcmllcyBmb3IgbWFueSBwb3B1bGFyIGxhbmd1YWdlcy4KKworMS4gQworMS4gQysrIC0gW3NuYXBjcmFmdC5pb10oaHR0cHM6Ly9zbmFwY3JhZnQuaW8vZmxhdGJ1ZmZlcnMpCisxLiBDIyAtIFtudWdldC5vcmddKGh0dHBzOi8vd3d3Lm51Z2V0Lm9yZy9wYWNrYWdlcy9Hb29nbGUuRmxhdEJ1ZmZlcnMpCisxLiBEYXJ0IC0gW3B1Yi5kZXZdKGh0dHBzOi8vcHViLmRldi9wYWNrYWdlcy9mbGF0X2J1ZmZlcnMpCisxLiBHbyAtIFtnby5kZXZdKGh0dHBzOi8vcGtnLmdvLmRldi9naXRodWIuY29tL2dvb2dsZS9mbGF0YnVmZmVycy9nbykKKzEuIEphdmEgLSBbTWF2ZW5dKGh0dHBzOi8vc2VhcmNoLm1hdmVuLm9yZy9hcnRpZmFjdC9jb20uZ29vZ2xlLmZsYXRidWZmZXJzL2ZsYXRidWZmZXJzLWphdmEpCisxLiBKYXZhU2NyaXB0IC0gW05QTV0oaHR0cHM6Ly93d3cubnBtanMuY29tL3BhY2thZ2UvZmxhdGJ1ZmZlcnMpCisxLiBLb3RsaW4KKzEuIExvYnN0ZXIKKzEuIEx1YQorMS4gUEhQCisxLiBQeXRob24gLSBbUHlQaV0oaHR0cHM6Ly9weXBpLm9yZy9wcm9qZWN0L2ZsYXRidWZmZXJzLykKKzEuIFJ1c3QgLSBbY3JhdGVzLmlvXShodHRwczovL2NyYXRlcy5pby9jcmF0ZXMvZmxhdGJ1ZmZlcnMpCisxLiBTd2lmdAorMS4gVHlwZVNjcmlwdCAtIFtOUE1dKGh0dHBzOi8vd3d3Lm5wbWpzLmNvbS9wYWNrYWdlL2ZsYXRidWZmZXJzKQogCiAqYW5kIG1vcmUgaW4gcHJvZ3Jlc3MuLi4qCiAKKzEuIFtOaW1dKGh0dHBzOi8vZ2l0aHViLmNvbS9nb29nbGUvZmxhdGJ1ZmZlcnMvcHVsbC83MzYyKQorCiAjIyBDb250cmlidXRpb24KLSogW0ZsYXRCdWZmZXJzIEdvb2dsZSBHcm91cF1bXSB0byBkaXNjdXNzIEZsYXRCdWZmZXJzIHdpdGggb3RoZXIgZGV2ZWxvcGVycyBhbmQgdXNlcnMuCisKICogW0ZsYXRCdWZmZXJzIElzc3VlcyBUcmFja2VyXVtdIHRvIHN1Ym1pdCBhbiBpc3N1ZS4KICogW3N0YWNrb3ZlcmZsb3cuY29tXVtdIHdpdGggW2BmbGF0YnVmZmVyc2AgdGFnXVtdIGZvciBhbnkgcXVlc3Rpb25zIHJlZ2FyZGluZyBGbGF0QnVmZmVycy4KIAogKlRvIGNvbnRyaWJ1dGUgdG8gdGhpcyBwcm9qZWN0LCogc2VlIFtDT05UUklCVVRJTkddW10uCiAKKyMjIENvbW11bml0eQorCisqIFtGbGF0QnVmZmVycyBHb29nbGUgR3JvdXBdW10gdG8gZGlzY3VzcyBGbGF0QnVmZmVycyB3aXRoIG90aGVyIGRldmVsb3BlcnMgYW5kIHVzZXJzLgorKiBbRGlzY29yZCBTZXJ2ZXJdKGh0dHBzOi8vL2Rpc2NvcmQuZ2cvNnFnS3MzUikKKyogW0dpdHRlcl0oaHR0cHM6Ly9naXR0ZXIuaW0vZ29vZ2xlL2ZsYXRidWZmZXJzKQorCisKICMjIFNlY3VyaXR5CiAKIFBsZWFzZSBzZWUgb3VyIFtTZWN1cml0eSBQb2xpY3ldKFNFQ1VSSVRZLm1kKSBmb3IgcmVwb3J0aW5nIHZ1bG5lcmFiaWxpdGllcy4KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3JlZmxlY3Rpb24vQlVJTEQuYmF6ZWwgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy9yZWZsZWN0aW9uL0JVSUxELmJhemVsCmluZGV4IDliMDg3MzQuLjZlNTBkYzQgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3JlZmxlY3Rpb24vQlVJTEQuYmF6ZWwKKysrIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvcmVmbGVjdGlvbi9CVUlMRC5iYXplbApAQCAtMSw0ICsxLDUgQEAKLWxvYWQoIi8vOmJ1aWxkX2RlZnMuYnpsIiwgImZsYXRidWZmZXJfcnVzdF9saWJyYXJ5IiwgImZsYXRidWZmZXJfdHNfbGlicmFyeSIpCitsb2FkKCIvLzpidWlsZF9kZWZzLmJ6bCIsICJmbGF0YnVmZmVyX3J1c3RfbGlicmFyeSIpCitsb2FkKCIvLzp0eXBlc2NyaXB0LmJ6bCIsICJmbGF0YnVmZmVyX3RzX2xpYnJhcnkiKQogCiBmaWxlZ3JvdXAoCiAgICAgbmFtZSA9ICJyZWZsZWN0aW9uX2Zic19zY2hlbWEiLApkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvcmVmbGVjdGlvbi9yZWZsZWN0aW9uLmZicyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3JlZmxlY3Rpb24vcmVmbGVjdGlvbi5mYnMKaW5kZXggY2MwNjk1OS4uNTFlNWI2MyAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvcmVmbGVjdGlvbi9yZWZsZWN0aW9uLmZicworKysgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy9yZWZsZWN0aW9uL3JlZmxlY3Rpb24uZmJzCkBAIC0zNyw2ICszNyw3IEBACiAgICAgaW5kZXg6aW50ID0gLTEgKGlkOiAyKTsgIC8vIElmIGJhc2VfdHlwZSA9PSBPYmplY3QsIGluZGV4IGludG8gIm9iamVjdHMiIGJlbG93LgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJZiBiYXNlX3R5cGUgPT0gVW5pb24sIFVuaW9uVHlwZSwgb3IgaW50ZWdyYWwgZGVyaXZlZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmcm9tIGFuIGVudW0sIGluZGV4IGludG8gImVudW1zIiBiZWxvdy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWYgYmFzZV90eXBlID09IFZlY3RvciAmJiBlbGVtZW50ID09IFVuaW9uIG9yIFVuaW9uVHlwZS4KICAgICBmaXhlZF9sZW5ndGg6dWludDE2ID0gMCAoaWQ6IDMpOyAgLy8gT25seSBpZiBiYXNlX3R5cGUgPT0gQXJyYXkuCiAgICAgLy8vIFRoZSBzaXplIChvY3RldHMpIG9mIHRoZSBgYmFzZV90eXBlYCBmaWVsZC4KICAgICBiYXNlX3NpemU6dWludCA9IDQgKGlkOiA0KTsgLy8gNCBJcyBhIGNvbW1vbiBzaXplIGR1ZSB0byBvZmZzZXRzIGJlaW5nIHRoYXQgc2l6ZS4KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3JlZmxlY3Rpb24vdHMvQlVJTEQuYmF6ZWwgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy9yZWZsZWN0aW9uL3RzL0JVSUxELmJhemVsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNmOGE0MTgKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy9yZWZsZWN0aW9uL3RzL0JVSUxELmJhemVsCkBAIC0wLDAgKzEsMTYgQEAKK2xvYWQoIi8vOnR5cGVzY3JpcHQuYnpsIiwgImZsYXRidWZmZXJfdHNfbGlicmFyeSIpCisKK2dlbnJ1bGUoCisgICAgbmFtZSA9ICJjb3B5X3NjaGVtYV90b19mb2xkZXIiLAorICAgIHNyY3MgPSBbIi8vcmVmbGVjdGlvbjpyZWZsZWN0aW9uX2Zic19zY2hlbWEiXSwKKyAgICBvdXRzID0gWyJyZWZsZWN0aW9uLmZicyJdLAorICAgIGNtZCA9ICJjcCAkPCAkQCIsCispCisKK2ZsYXRidWZmZXJfdHNfbGlicmFyeSgKKyAgICBuYW1lID0gInJlZmxlY3Rpb25fdHNfZmJzIiwKKyAgICBwYWNrYWdlX25hbWUgPSAiZmxhdGJ1ZmZlcnNfcmVmbGVjdGlvbiIsCisgICAgc3JjcyA9IFsiOnJlZmxlY3Rpb24uZmJzIl0sCisgICAgaW5jbHVkZV9yZWZsZWN0aW9uID0gRmFsc2UsCisgICAgdmlzaWJpbGl0eSA9IFsiLy92aXNpYmlsaXR5OnB1YmxpYyJdLAorKQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvcm9sbHVwLmNvbmZpZy5qcyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3JvbGx1cC5jb25maWcuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTM2OTY1NQotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3JvbGx1cC5jb25maWcuanMKQEAgLTAsMCArMSw4IEBACitleHBvcnQgZGVmYXVsdCB7CisgIGlucHV0OiAnbWpzL2luZGV4LmpzJywKKyAgb3V0cHV0OiB7CisgICAgZmlsZTogJ2ZsYXRidWZmZXJzLmpzJywKKyAgICBmb3JtYXQ6ICdpaWZlJywKKyAgICBuYW1lOiAnZmxhdGJ1ZmZlcnMnCisgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy9ydXN0L2ZsYXRidWZmZXJzL0NhcmdvLnRvbWwgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy9ydXN0L2ZsYXRidWZmZXJzL0NhcmdvLnRvbWwKaW5kZXggOGJmOGMwOC4uYjMyNzZjMCAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvcnVzdC9mbGF0YnVmZmVycy9DYXJnby50b21sCisrKyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3J1c3QvZmxhdGJ1ZmZlcnMvQ2FyZ28udG9tbApAQCAtMSw2ICsxLDYgQEAKIFtwYWNrYWdlXQogbmFtZSA9ICJmbGF0YnVmZmVycyIKLXZlcnNpb24gPSAiMi4xLjEiCit2ZXJzaW9uID0gIjIuMS4yIgogZWRpdGlvbiA9ICIyMDE4IgogYXV0aG9ycyA9IFsiUm9iZXJ0IFdpbnNsb3cgPGhlbGxvQHJ3aW5zbG93LmNvbT4iLCAiRmxhdEJ1ZmZlcnMgTWFpbnRhaW5lcnMiXQogbGljZW5zZSA9ICJBcGFjaGUtMi4wIgpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvcnVzdC9mbGF0YnVmZmVycy9zcmMvdmVyaWZpZXIucnMgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy9ydXN0L2ZsYXRidWZmZXJzL3NyYy92ZXJpZmllci5ycwppbmRleCBkNWUzMWRmLi4zNmE1Nzc1IDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy9ydXN0L2ZsYXRidWZmZXJzL3NyYy92ZXJpZmllci5ycworKysgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy9ydXN0L2ZsYXRidWZmZXJzL3NyYy92ZXJpZmllci5ycwpAQCAtNiw3ICs2LDggQEAKIHVzZSBjcmF0ZTo6e0ZvcndhcmRzVU9mZnNldCwgU09mZnNldFQsIFNraXBTaXplUHJlZml4LCBVT2Zmc2V0VCwgVk9mZnNldFQsIFZlY3RvciwgU0laRV9VT0ZGU0VUfTsKIAogI1tjZmcoZmVhdHVyZT0ibm9fc3RkIildCi1leHRlcm4gY3JhdGUgdGhpc2Vycm9yX2NvcmUyIGFzIHRoaXNlcnJvcjsKK3VzZSB0aGlzZXJyb3JfY29yZTI6OkVycm9yOworI1tjZmcobm90KGZlYXR1cmU9Im5vX3N0ZCIpKV0KIHVzZSB0aGlzZXJyb3I6OkVycm9yOwogCiAvLy8gVHJhY2VzIHRoZSBsb2NhdGlvbiBvZiBkYXRhIGVycm9ycy4gTm90IHBvcHVsYXRlZCBmb3IgRG9zIGRldGVjdGluZyBlcnJvcnMuCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy9zYW1wbGVzL21vbnN0ZXJfZ2VuZXJhdGVkLmggYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy9zYW1wbGVzL21vbnN0ZXJfZ2VuZXJhdGVkLmgKaW5kZXggNWVlZjBmMi4uOGMyNGQxNyAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvc2FtcGxlcy9tb25zdGVyX2dlbmVyYXRlZC5oCisrKyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3NhbXBsZXMvbW9uc3Rlcl9nZW5lcmF0ZWQuaApAQCAtNiw2ICs2LDEzIEBACiAKICNpbmNsdWRlICJmbGF0YnVmZmVycy9mbGF0YnVmZmVycy5oIgogCisvLyBFbnN1cmUgdGhlIGluY2x1ZGVkIGZsYXRidWZmZXJzLmggaXMgdGhlIHNhbWUgdmVyc2lvbiBhcyB3aGVuIHRoaXMgZmlsZSB3YXMKKy8vIGdlbmVyYXRlZCwgb3RoZXJ3aXNlIGl0IG1heSBub3QgYmUgY29tcGF0aWJsZS4KK3N0YXRpY19hc3NlcnQoRkxBVEJVRkZFUlNfVkVSU0lPTl9NQUpPUiA9PSAyICYmCisgICAgICAgICAgICAgIEZMQVRCVUZGRVJTX1ZFUlNJT05fTUlOT1IgPT0gMCAmJgorICAgICAgICAgICAgICBGTEFUQlVGRkVSU19WRVJTSU9OX1JFVklTSU9OID09IDgsCisgICAgICAgICAgICAgIk5vbi1jb21wYXRpYmxlIGZsYXRidWZmZXJzIHZlcnNpb24gaW5jbHVkZWQiKTsKKwogbmFtZXNwYWNlIE15R2FtZSB7CiBuYW1lc3BhY2UgU2FtcGxlIHsKIApAQCAtNTQ5LDcgKzU1Niw3IEBACiAgICAgICAobGhzLm5hbWUgPT0gcmhzLm5hbWUpICYmCiAgICAgICAobGhzLmludmVudG9yeSA9PSByaHMuaW52ZW50b3J5KSAmJgogICAgICAgKGxocy5jb2xvciA9PSByaHMuY29sb3IpICYmCi0gICAgICAobGhzLndlYXBvbnMgPT0gcmhzLndlYXBvbnMpICYmCisgICAgICAobGhzLndlYXBvbnMuc2l6ZSgpID09IHJocy53ZWFwb25zLnNpemUoKSAmJiBzdGQ6OmVxdWFsKGxocy53ZWFwb25zLmNiZWdpbigpLCBsaHMud2VhcG9ucy5jZW5kKCksIHJocy53ZWFwb25zLmNiZWdpbigpLCBbXShmbGF0YnVmZmVyczo6dW5pcXVlX3B0cjxNeUdhbWU6OlNhbXBsZTo6V2VhcG9uVD4gY29uc3QgJmEsIGZsYXRidWZmZXJzOjp1bmlxdWVfcHRyPE15R2FtZTo6U2FtcGxlOjpXZWFwb25UPiBjb25zdCAmYikgeyByZXR1cm4gKGEgPT0gYikgfHwgKGEgJiYgYiAmJiAqYSA9PSAqYik7IH0pKSAmJgogICAgICAgKGxocy5lcXVpcHBlZCA9PSByaHMuZXF1aXBwZWQpICYmCiAgICAgICAobGhzLnBhdGggPT0gcmhzLnBhdGgpOwogfQpAQCAtNjAwLDEwICs2MDcsMTAgQEAKICAgeyBhdXRvIF9lID0gbmFtZSgpOyBpZiAoX2UpIF9vLT5uYW1lID0gX2UtPnN0cigpOyB9CiAgIHsgYXV0byBfZSA9IGludmVudG9yeSgpOyBpZiAoX2UpIHsgX28tPmludmVudG9yeS5yZXNpemUoX2UtPnNpemUoKSk7IHN0ZDo6Y29weShfZS0+YmVnaW4oKSwgX2UtPmVuZCgpLCBfby0+aW52ZW50b3J5LmJlZ2luKCkpOyB9IH0KICAgeyBhdXRvIF9lID0gY29sb3IoKTsgX28tPmNvbG9yID0gX2U7IH0KLSAgeyBhdXRvIF9lID0gd2VhcG9ucygpOyBpZiAoX2UpIHsgX28tPndlYXBvbnMucmVzaXplKF9lLT5zaXplKCkpOyBmb3IgKGZsYXRidWZmZXJzOjp1b2Zmc2V0X3QgX2kgPSAwOyBfaSA8IF9lLT5zaXplKCk7IF9pKyspIHsgaWYoX28tPndlYXBvbnNbX2ldKSB7IF9lLT5HZXQoX2kpLT5VblBhY2tUbyhfby0+d2VhcG9uc1tfaV0uZ2V0KCksIF9yZXNvbHZlcik7IH0gZWxzZSB7IF9vLT53ZWFwb25zW19pXSA9IGZsYXRidWZmZXJzOjp1bmlxdWVfcHRyPE15R2FtZTo6U2FtcGxlOjpXZWFwb25UPihfZS0+R2V0KF9pKS0+VW5QYWNrKF9yZXNvbHZlcikpOyB9OyB9IH0gfQorICB7IGF1dG8gX2UgPSB3ZWFwb25zKCk7IGlmIChfZSkgeyBfby0+d2VhcG9ucy5yZXNpemUoX2UtPnNpemUoKSk7IGZvciAoZmxhdGJ1ZmZlcnM6OnVvZmZzZXRfdCBfaSA9IDA7IF9pIDwgX2UtPnNpemUoKTsgX2krKykgeyBpZihfby0+d2VhcG9uc1tfaV0pIHsgX2UtPkdldChfaSktPlVuUGFja1RvKF9vLT53ZWFwb25zW19pXS5nZXQoKSwgX3Jlc29sdmVyKTsgfSBlbHNlIHsgX28tPndlYXBvbnNbX2ldID0gZmxhdGJ1ZmZlcnM6OnVuaXF1ZV9wdHI8TXlHYW1lOjpTYW1wbGU6OldlYXBvblQ+KF9lLT5HZXQoX2kpLT5VblBhY2soX3Jlc29sdmVyKSk7IH07IH0gfSBlbHNlIHsgX28tPndlYXBvbnMucmVzaXplKDApOyB9IH0KICAgeyBhdXRvIF9lID0gZXF1aXBwZWRfdHlwZSgpOyBfby0+ZXF1aXBwZWQudHlwZSA9IF9lOyB9CiAgIHsgYXV0byBfZSA9IGVxdWlwcGVkKCk7IGlmIChfZSkgX28tPmVxdWlwcGVkLnZhbHVlID0gTXlHYW1lOjpTYW1wbGU6OkVxdWlwbWVudFVuaW9uOjpVblBhY2soX2UsIGVxdWlwcGVkX3R5cGUoKSwgX3Jlc29sdmVyKTsgfQotICB7IGF1dG8gX2UgPSBwYXRoKCk7IGlmIChfZSkgeyBfby0+cGF0aC5yZXNpemUoX2UtPnNpemUoKSk7IGZvciAoZmxhdGJ1ZmZlcnM6OnVvZmZzZXRfdCBfaSA9IDA7IF9pIDwgX2UtPnNpemUoKTsgX2krKykgeyBfby0+cGF0aFtfaV0gPSAqX2UtPkdldChfaSk7IH0gfSB9CisgIHsgYXV0byBfZSA9IHBhdGgoKTsgaWYgKF9lKSB7IF9vLT5wYXRoLnJlc2l6ZShfZS0+c2l6ZSgpKTsgZm9yIChmbGF0YnVmZmVyczo6dW9mZnNldF90IF9pID0gMDsgX2kgPCBfZS0+c2l6ZSgpOyBfaSsrKSB7IF9vLT5wYXRoW19pXSA9ICpfZS0+R2V0KF9pKTsgfSB9IGVsc2UgeyBfby0+cGF0aC5yZXNpemUoMCk7IH0gfQogfQogCiBpbmxpbmUgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxNb25zdGVyPiBNb25zdGVyOjpQYWNrKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgTW9uc3RlclQqIF9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyKSB7CkBAIC02MTQsNyArNjIxLDcgQEAKICAgKHZvaWQpX3JlaGFzaGVyOwogICAodm9pZClfbzsKICAgc3RydWN0IF9WZWN0b3JBcmdzIHsgZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICpfX2ZiYjsgY29uc3QgTW9uc3RlclQqIF9fbzsgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9fcmVoYXNoZXI7IH0gX3ZhID0geyAmX2ZiYiwgX28sIF9yZWhhc2hlcn07ICh2b2lkKV92YTsKLSAgYXV0byBfcG9zID0gX28tPnBvcyA/IF9vLT5wb3MuZ2V0KCkgOiAwOworICBhdXRvIF9wb3MgPSBfby0+cG9zID8gX28tPnBvcy5nZXQoKSA6IG51bGxwdHI7CiAgIGF1dG8gX21hbmEgPSBfby0+bWFuYTsKICAgYXV0byBfaHAgPSBfby0+aHA7CiAgIGF1dG8gX25hbWUgPSBfby0+bmFtZS5lbXB0eSgpID8gMCA6IF9mYmIuQ3JlYXRlU3RyaW5nKF9vLT5uYW1lKTsKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3NhbXBsZXMvbW9uc3Rlcl9nZW5lcmF0ZWQubG9ic3RlciBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3NhbXBsZXMvbW9uc3Rlcl9nZW5lcmF0ZWQubG9ic3RlcgppbmRleCAzMTBmNzRkLi5lMjgzZTUzIDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy9zYW1wbGVzL21vbnN0ZXJfZ2VuZXJhdGVkLmxvYnN0ZXIKKysrIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvc2FtcGxlcy9tb25zdGVyX2dlbmVyYXRlZC5sb2JzdGVyCkBAIC0xOSwxMSArMTksMTEgQEAKIGNsYXNzIFdlYXBvbgogCiBjbGFzcyBWZWMzIDogZmxhdGJ1ZmZlcnNfaGFuZGxlCi0gICAgZGVmIHgoKToKKyAgICBkZWYgeCgpIC0+IGZsb2F0OgogICAgICAgICByZXR1cm4gYnVmXy5yZWFkX2Zsb2F0MzJfbGUocG9zXyArIDApCi0gICAgZGVmIHkoKToKKyAgICBkZWYgeSgpIC0+IGZsb2F0OgogICAgICAgICByZXR1cm4gYnVmXy5yZWFkX2Zsb2F0MzJfbGUocG9zXyArIDQpCi0gICAgZGVmIHooKToKKyAgICBkZWYgeigpIC0+IGZsb2F0OgogICAgICAgICByZXR1cm4gYnVmXy5yZWFkX2Zsb2F0MzJfbGUocG9zXyArIDgpCiAKIGRlZiBDcmVhdGVWZWMzKGJfOmZsYXRidWZmZXJzX2J1aWxkZXIsIHg6ZmxvYXQsIHk6ZmxvYXQsIHo6ZmxvYXQpOgpAQCAtMzQsMzIgKzM0LDMyIEBACiAgICAgcmV0dXJuIGJfLk9mZnNldCgpCiAKIGNsYXNzIE1vbnN0ZXIgOiBmbGF0YnVmZmVyc19oYW5kbGUKLSAgICBkZWYgcG9zKCk6CisgICAgZGVmIHBvcygpIC0+IE15R2FtZV9TYW1wbGVfVmVjMz86CiAgICAgICAgIGxldCBvID0gYnVmXy5mbGF0YnVmZmVyc19maWVsZF9zdHJ1Y3QocG9zXywgNCkKICAgICAgICAgcmV0dXJuIGlmIG86IE15R2FtZV9TYW1wbGVfVmVjMyB7IGJ1Zl8sIG8gfSBlbHNlOiBuaWwKLSAgICBkZWYgbWFuYSgpOgorICAgIGRlZiBtYW5hKCkgLT4gaW50OgogICAgICAgICByZXR1cm4gYnVmXy5mbGF0YnVmZmVyc19maWVsZF9pbnQxNihwb3NfLCA2LCAxNTApCi0gICAgZGVmIGhwKCk6CisgICAgZGVmIGhwKCkgLT4gaW50OgogICAgICAgICByZXR1cm4gYnVmXy5mbGF0YnVmZmVyc19maWVsZF9pbnQxNihwb3NfLCA4LCAxMDApCi0gICAgZGVmIG5hbWUoKToKKyAgICBkZWYgbmFtZSgpIC0+IHN0cmluZzoKICAgICAgICAgcmV0dXJuIGJ1Zl8uZmxhdGJ1ZmZlcnNfZmllbGRfc3RyaW5nKHBvc18sIDEwKQotICAgIGRlZiBpbnZlbnRvcnkoaTppbnQpOgorICAgIGRlZiBpbnZlbnRvcnkoaTppbnQpIC0+IGludDoKICAgICAgICAgcmV0dXJuIGJ1Zl8ucmVhZF91aW50OF9sZShidWZfLmZsYXRidWZmZXJzX2ZpZWxkX3ZlY3Rvcihwb3NfLCAxNCkgKyBpICogMSkKLSAgICBkZWYgaW52ZW50b3J5X2xlbmd0aCgpOgorICAgIGRlZiBpbnZlbnRvcnlfbGVuZ3RoKCkgLT4gaW50OgogICAgICAgICByZXR1cm4gYnVmXy5mbGF0YnVmZmVyc19maWVsZF92ZWN0b3JfbGVuKHBvc18sIDE0KQotICAgIGRlZiBjb2xvcigpOgorICAgIGRlZiBjb2xvcigpIC0+IENvbG9yOgogICAgICAgICByZXR1cm4gQ29sb3IoYnVmXy5mbGF0YnVmZmVyc19maWVsZF9pbnQ4KHBvc18sIDE2LCAyKSkKLSAgICBkZWYgd2VhcG9ucyhpOmludCk6CisgICAgZGVmIHdlYXBvbnMoaTppbnQpIC0+IE15R2FtZV9TYW1wbGVfV2VhcG9uOgogICAgICAgICByZXR1cm4gTXlHYW1lX1NhbXBsZV9XZWFwb24geyBidWZfLCBidWZfLmZsYXRidWZmZXJzX2luZGlyZWN0KGJ1Zl8uZmxhdGJ1ZmZlcnNfZmllbGRfdmVjdG9yKHBvc18sIDE4KSArIGkgKiA0KSB9Ci0gICAgZGVmIHdlYXBvbnNfbGVuZ3RoKCk6CisgICAgZGVmIHdlYXBvbnNfbGVuZ3RoKCkgLT4gaW50OgogICAgICAgICByZXR1cm4gYnVmXy5mbGF0YnVmZmVyc19maWVsZF92ZWN0b3JfbGVuKHBvc18sIDE4KQotICAgIGRlZiBlcXVpcHBlZF90eXBlKCk6CisgICAgZGVmIGVxdWlwcGVkX3R5cGUoKSAtPiBFcXVpcG1lbnQ6CiAgICAgICAgIHJldHVybiBFcXVpcG1lbnQoYnVmXy5mbGF0YnVmZmVyc19maWVsZF91aW50OChwb3NfLCAyMCwgMCkpCiAgICAgZGVmIGVxdWlwcGVkX2FzX1dlYXBvbigpOgogICAgICAgICByZXR1cm4gTXlHYW1lX1NhbXBsZV9XZWFwb24geyBidWZfLCBidWZfLmZsYXRidWZmZXJzX2ZpZWxkX3RhYmxlKHBvc18sIDIyKSB9Ci0gICAgZGVmIHBhdGgoaTppbnQpOgorICAgIGRlZiBwYXRoKGk6aW50KSAtPiBNeUdhbWVfU2FtcGxlX1ZlYzM6CiAgICAgICAgIHJldHVybiBNeUdhbWVfU2FtcGxlX1ZlYzMgeyBidWZfLCBidWZfLmZsYXRidWZmZXJzX2ZpZWxkX3ZlY3Rvcihwb3NfLCAyNCkgKyBpICogMTIgfQotICAgIGRlZiBwYXRoX2xlbmd0aCgpOgorICAgIGRlZiBwYXRoX2xlbmd0aCgpIC0+IGludDoKICAgICAgICAgcmV0dXJuIGJ1Zl8uZmxhdGJ1ZmZlcnNfZmllbGRfdmVjdG9yX2xlbihwb3NfLCAyNCkKIAogZGVmIEdldFJvb3RBc01vbnN0ZXIoYnVmOnN0cmluZyk6IHJldHVybiBNb25zdGVyIHsgYnVmLCBidWYuZmxhdGJ1ZmZlcnNfaW5kaXJlY3QoMCkgfQpAQCAtMTIwLDkgKzEyMCw5IEBACiAgICAgYl8uU3RhcnRWZWN0b3IoMTIsIG5fLCA0KQogCiBjbGFzcyBXZWFwb24gOiBmbGF0YnVmZmVyc19oYW5kbGUKLSAgICBkZWYgbmFtZSgpOgorICAgIGRlZiBuYW1lKCkgLT4gc3RyaW5nOgogICAgICAgICByZXR1cm4gYnVmXy5mbGF0YnVmZmVyc19maWVsZF9zdHJpbmcocG9zXywgNCkKLSAgICBkZWYgZGFtYWdlKCk6CisgICAgZGVmIGRhbWFnZSgpIC0+IGludDoKICAgICAgICAgcmV0dXJuIGJ1Zl8uZmxhdGJ1ZmZlcnNfZmllbGRfaW50MTYocG9zXywgNiwgMCkKIAogZGVmIEdldFJvb3RBc1dlYXBvbihidWY6c3RyaW5nKTogcmV0dXJuIFdlYXBvbiB7IGJ1ZiwgYnVmLmZsYXRidWZmZXJzX2luZGlyZWN0KDApIH0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3NhbXBsZXMvbW9uc3Rlcl9nZW5lcmF0ZWQuc3dpZnQgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy9zYW1wbGVzL21vbnN0ZXJfZ2VuZXJhdGVkLnN3aWZ0CmluZGV4IGIzYjZmMDUuLjE3M2JhY2IgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3NhbXBsZXMvbW9uc3Rlcl9nZW5lcmF0ZWQuc3dpZnQKKysrIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvc2FtcGxlcy9tb25zdGVyX2dlbmVyYXRlZC5zd2lmdApAQCAtMzEsNyArMzEsNyBAQAogCiBwdWJsaWMgc3RydWN0IE15R2FtZV9TYW1wbGVfVmVjMzogTmF0aXZlU3RydWN0IHsKIAotICBzdGF0aWMgZnVuYyB2YWxpZGF0ZVZlcnNpb24oKSB7IEZsYXRCdWZmZXJzVmVyc2lvbl8yXzBfMCgpIH0KKyAgc3RhdGljIGZ1bmMgdmFsaWRhdGVWZXJzaW9uKCkgeyBGbGF0QnVmZmVyc1ZlcnNpb25fMl8wXzgoKSB9CiAKICAgcHJpdmF0ZSB2YXIgX3g6IEZsb2F0MzIKICAgcHJpdmF0ZSB2YXIgX3k6IEZsb2F0MzIKQEAgLTU2LDcgKzU2LDcgQEAKIAogcHVibGljIHN0cnVjdCBNeUdhbWVfU2FtcGxlX1ZlYzNfTXV0YWJsZTogRmxhdEJ1ZmZlck9iamVjdCB7CiAKLSAgc3RhdGljIGZ1bmMgdmFsaWRhdGVWZXJzaW9uKCkgeyBGbGF0QnVmZmVyc1ZlcnNpb25fMl8wXzAoKSB9CisgIHN0YXRpYyBmdW5jIHZhbGlkYXRlVmVyc2lvbigpIHsgRmxhdEJ1ZmZlcnNWZXJzaW9uXzJfMF84KCkgfQogICBwdWJsaWMgdmFyIF9fYnVmZmVyOiBCeXRlQnVmZmVyISB7IHJldHVybiBfYWNjZXNzb3IuYmIgfQogICBwcml2YXRlIHZhciBfYWNjZXNzb3I6IFN0cnVjdAogCkBAIC03Miw3ICs3Miw3IEBACiAKIHB1YmxpYyBzdHJ1Y3QgTXlHYW1lX1NhbXBsZV9Nb25zdGVyOiBGbGF0QnVmZmVyT2JqZWN0IHsKIAotICBzdGF0aWMgZnVuYyB2YWxpZGF0ZVZlcnNpb24oKSB7IEZsYXRCdWZmZXJzVmVyc2lvbl8yXzBfMCgpIH0KKyAgc3RhdGljIGZ1bmMgdmFsaWRhdGVWZXJzaW9uKCkgeyBGbGF0QnVmZmVyc1ZlcnNpb25fMl8wXzgoKSB9CiAgIHB1YmxpYyB2YXIgX19idWZmZXI6IEJ5dGVCdWZmZXIhIHsgcmV0dXJuIF9hY2Nlc3Nvci5iYiB9CiAgIHByaXZhdGUgdmFyIF9hY2Nlc3NvcjogVGFibGUKIApAQCAtMTYyLDcgKzE2Miw3IEBACiAKIHB1YmxpYyBzdHJ1Y3QgTXlHYW1lX1NhbXBsZV9XZWFwb246IEZsYXRCdWZmZXJPYmplY3QgewogCi0gIHN0YXRpYyBmdW5jIHZhbGlkYXRlVmVyc2lvbigpIHsgRmxhdEJ1ZmZlcnNWZXJzaW9uXzJfMF8wKCkgfQorICBzdGF0aWMgZnVuYyB2YWxpZGF0ZVZlcnNpb24oKSB7IEZsYXRCdWZmZXJzVmVyc2lvbl8yXzBfOCgpIH0KICAgcHVibGljIHZhciBfX2J1ZmZlcjogQnl0ZUJ1ZmZlciEgeyByZXR1cm4gX2FjY2Vzc29yLmJiIH0KICAgcHJpdmF0ZSB2YXIgX2FjY2Vzc29yOiBUYWJsZQogCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy9zYW1wbGVzL3J1c3RfZ2VuZXJhdGVkL21vZC5ycyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3NhbXBsZXMvcnVzdF9nZW5lcmF0ZWQvbW9kLnJzCmluZGV4IDg1NjAxNTMuLjVmN2U5MjQgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3NhbXBsZXMvcnVzdF9nZW5lcmF0ZWQvbW9kLnJzCisrKyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3NhbXBsZXMvcnVzdF9nZW5lcmF0ZWQvbW9kLnJzCkBAIC0xLDQgKzEsNSBAQAogLy8gQXV0b21hdGljYWxseSBnZW5lcmF0ZWQgYnkgdGhlIEZsYXRidWZmZXJzIGNvbXBpbGVyLiBEbyBub3QgbW9kaWZ5LgorLy8gQGdlbmVyYXRlZAogcHViIG1vZCBteV9nYW1lIHsKICAgdXNlIHN1cGVyOjoqOwogICBwdWIgbW9kIHNhbXBsZSB7CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy9zYW1wbGVzL3J1c3RfZ2VuZXJhdGVkL215X2dhbWUvc2FtcGxlL2NvbG9yX2dlbmVyYXRlZC5ycyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3NhbXBsZXMvcnVzdF9nZW5lcmF0ZWQvbXlfZ2FtZS9zYW1wbGUvY29sb3JfZ2VuZXJhdGVkLnJzCmluZGV4IDFlZjFkMzEuLjdhN2QxZDUgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3NhbXBsZXMvcnVzdF9nZW5lcmF0ZWQvbXlfZ2FtZS9zYW1wbGUvY29sb3JfZ2VuZXJhdGVkLnJzCisrKyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3NhbXBsZXMvcnVzdF9nZW5lcmF0ZWQvbXlfZ2FtZS9zYW1wbGUvY29sb3JfZ2VuZXJhdGVkLnJzCkBAIC0xLDcgKzEsMTIgQEAKIC8vIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGJ5IHRoZSBGbGF0QnVmZmVycyBjb21waWxlciwgZG8gbm90IG1vZGlmeQorLy8gQGdlbmVyYXRlZAorZXh0ZXJuIGNyYXRlIGFsbG9jOwogZXh0ZXJuIGNyYXRlIGZsYXRidWZmZXJzOwotdXNlIHN0ZDo6bWVtOwotdXNlIHN0ZDo6Y21wOjpPcmRlcmluZzsKK3VzZSBhbGxvYzo6Ym94ZWQ6OkJveDsKK3VzZSBhbGxvYzo6c3RyaW5nOjp7U3RyaW5nLCBUb1N0cmluZ307Cit1c2UgYWxsb2M6OnZlYzo6VmVjOwordXNlIGNvcmU6Om1lbTsKK3VzZSBjb3JlOjpjbXA6Ok9yZGVyaW5nOwogdXNlIHNlbGY6OmZsYXRidWZmZXJzOjp7RW5kaWFuU2NhbGFyLCBGb2xsb3d9OwogdXNlIHN1cGVyOjoqOwogI1tkZXByZWNhdGVkKHNpbmNlID0gIjIuMC4wIiwgbm90ZSA9ICJVc2UgYXNzb2NpYXRlZCBjb25zdGFudHMgaW5zdGVhZC4gVGhpcyB3aWxsIG5vIGxvbmdlciBiZSBnZW5lcmF0ZWQgaW4gMjAyMS4iKV0KQEAgLTQyLDggKzQ3LDggQEAKICAgICB9CiAgIH0KIH0KLWltcGwgc3RkOjpmbXQ6OkRlYnVnIGZvciBDb2xvciB7Ci0gIGZuIGZtdCgmc2VsZiwgZjogJm11dCBzdGQ6OmZtdDo6Rm9ybWF0dGVyKSAtPiBzdGQ6OmZtdDo6UmVzdWx0IHsKK2ltcGwgY29yZTo6Zm10OjpEZWJ1ZyBmb3IgQ29sb3IgeworICBmbiBmbXQoJnNlbGYsIGY6ICZtdXQgY29yZTo6Zm10OjpGb3JtYXR0ZXIpIC0+IGNvcmU6OmZtdDo6UmVzdWx0IHsKICAgICBpZiBsZXQgU29tZShuYW1lKSA9IHNlbGYudmFyaWFudF9uYW1lKCkgewogICAgICAgZi53cml0ZV9zdHIobmFtZSkKICAgICB9IGVsc2UgewpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvc2FtcGxlcy9ydXN0X2dlbmVyYXRlZC9teV9nYW1lL3NhbXBsZS9lcXVpcG1lbnRfZ2VuZXJhdGVkLnJzIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvc2FtcGxlcy9ydXN0X2dlbmVyYXRlZC9teV9nYW1lL3NhbXBsZS9lcXVpcG1lbnRfZ2VuZXJhdGVkLnJzCmluZGV4IDkxOTk1OGEuLjk4OThjOGQgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3NhbXBsZXMvcnVzdF9nZW5lcmF0ZWQvbXlfZ2FtZS9zYW1wbGUvZXF1aXBtZW50X2dlbmVyYXRlZC5ycworKysgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy9zYW1wbGVzL3J1c3RfZ2VuZXJhdGVkL215X2dhbWUvc2FtcGxlL2VxdWlwbWVudF9nZW5lcmF0ZWQucnMKQEAgLTEsNyArMSwxMiBAQAogLy8gYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgYnkgdGhlIEZsYXRCdWZmZXJzIGNvbXBpbGVyLCBkbyBub3QgbW9kaWZ5CisvLyBAZ2VuZXJhdGVkCitleHRlcm4gY3JhdGUgYWxsb2M7CiBleHRlcm4gY3JhdGUgZmxhdGJ1ZmZlcnM7Ci11c2Ugc3RkOjptZW07Ci11c2Ugc3RkOjpjbXA6Ok9yZGVyaW5nOwordXNlIGFsbG9jOjpib3hlZDo6Qm94OwordXNlIGFsbG9jOjpzdHJpbmc6OntTdHJpbmcsIFRvU3RyaW5nfTsKK3VzZSBhbGxvYzo6dmVjOjpWZWM7Cit1c2UgY29yZTo6bWVtOwordXNlIGNvcmU6OmNtcDo6T3JkZXJpbmc7CiB1c2Ugc2VsZjo6ZmxhdGJ1ZmZlcnM6OntFbmRpYW5TY2FsYXIsIEZvbGxvd307CiB1c2Ugc3VwZXI6Oio7CiAjW2RlcHJlY2F0ZWQoc2luY2UgPSAiMi4wLjAiLCBub3RlID0gIlVzZSBhc3NvY2lhdGVkIGNvbnN0YW50cyBpbnN0ZWFkLiBUaGlzIHdpbGwgbm8gbG9uZ2VyIGJlIGdlbmVyYXRlZCBpbiAyMDIxLiIpXQpAQCAtMzgsOCArNDMsOCBAQAogICAgIH0KICAgfQogfQotaW1wbCBzdGQ6OmZtdDo6RGVidWcgZm9yIEVxdWlwbWVudCB7Ci0gIGZuIGZtdCgmc2VsZiwgZjogJm11dCBzdGQ6OmZtdDo6Rm9ybWF0dGVyKSAtPiBzdGQ6OmZtdDo6UmVzdWx0IHsKK2ltcGwgY29yZTo6Zm10OjpEZWJ1ZyBmb3IgRXF1aXBtZW50IHsKKyAgZm4gZm10KCZzZWxmLCBmOiAmbXV0IGNvcmU6OmZtdDo6Rm9ybWF0dGVyKSAtPiBjb3JlOjpmbXQ6OlJlc3VsdCB7CiAgICAgaWYgbGV0IFNvbWUobmFtZSkgPSBzZWxmLnZhcmlhbnRfbmFtZSgpIHsKICAgICAgIGYud3JpdGVfc3RyKG5hbWUpCiAgICAgfSBlbHNlIHsKQEAgLTEyMSw3ICsxMjYsNyBAQAogICAvLy8gSWYgdGhlIHVuaW9uIHZhcmlhbnQgbWF0Y2hlcywgcmV0dXJuIHRoZSBvd25lZCBXZWFwb25ULCBzZXR0aW5nIHRoZSB1bmlvbiB0byBOT05FLgogICBwdWIgZm4gdGFrZV93ZWFwb24oJm11dCBzZWxmKSAtPiBPcHRpb248Qm94PFdlYXBvblQ+PiB7CiAgICAgaWYgbGV0IFNlbGY6OldlYXBvbihfKSA9IHNlbGYgewotICAgICAgbGV0IHYgPSBzdGQ6Om1lbTo6cmVwbGFjZShzZWxmLCBTZWxmOjpOT05FKTsKKyAgICAgIGxldCB2ID0gY29yZTo6bWVtOjpyZXBsYWNlKHNlbGYsIFNlbGY6Ok5PTkUpOwogICAgICAgaWYgbGV0IFNlbGY6OldlYXBvbih3KSA9IHYgewogICAgICAgICBTb21lKHcpCiAgICAgICB9IGVsc2UgewpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvc2FtcGxlcy9ydXN0X2dlbmVyYXRlZC9teV9nYW1lL3NhbXBsZS9tb25zdGVyX2dlbmVyYXRlZC5ycyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3NhbXBsZXMvcnVzdF9nZW5lcmF0ZWQvbXlfZ2FtZS9zYW1wbGUvbW9uc3Rlcl9nZW5lcmF0ZWQucnMKaW5kZXggYzE1NjIyNS4uMjczMjEyZiAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvc2FtcGxlcy9ydXN0X2dlbmVyYXRlZC9teV9nYW1lL3NhbXBsZS9tb25zdGVyX2dlbmVyYXRlZC5ycworKysgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy9zYW1wbGVzL3J1c3RfZ2VuZXJhdGVkL215X2dhbWUvc2FtcGxlL21vbnN0ZXJfZ2VuZXJhdGVkLnJzCkBAIC0xLDcgKzEsMTIgQEAKIC8vIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGJ5IHRoZSBGbGF0QnVmZmVycyBjb21waWxlciwgZG8gbm90IG1vZGlmeQorLy8gQGdlbmVyYXRlZAorZXh0ZXJuIGNyYXRlIGFsbG9jOwogZXh0ZXJuIGNyYXRlIGZsYXRidWZmZXJzOwotdXNlIHN0ZDo6bWVtOwotdXNlIHN0ZDo6Y21wOjpPcmRlcmluZzsKK3VzZSBhbGxvYzo6Ym94ZWQ6OkJveDsKK3VzZSBhbGxvYzo6c3RyaW5nOjp7U3RyaW5nLCBUb1N0cmluZ307Cit1c2UgYWxsb2M6OnZlYzo6VmVjOwordXNlIGNvcmU6Om1lbTsKK3VzZSBjb3JlOjpjbXA6Ok9yZGVyaW5nOwogdXNlIHNlbGY6OmZsYXRidWZmZXJzOjp7RW5kaWFuU2NhbGFyLCBGb2xsb3d9OwogdXNlIHN1cGVyOjoqOwogcHViIGVudW0gTW9uc3Rlck9mZnNldCB7fQpAQCAtMjY2LDggKzI3MSw4IEBACiAgIH0KIH0KIAotaW1wbCBzdGQ6OmZtdDo6RGVidWcgZm9yIE1vbnN0ZXI8J18+IHsKLSAgZm4gZm10KCZzZWxmLCBmOiAmbXV0IHN0ZDo6Zm10OjpGb3JtYXR0ZXI8J18+KSAtPiBzdGQ6OmZtdDo6UmVzdWx0IHsKK2ltcGwgY29yZTo6Zm10OjpEZWJ1ZyBmb3IgTW9uc3RlcjwnXz4geworICBmbiBmbXQoJnNlbGYsIGY6ICZtdXQgY29yZTo6Zm10OjpGb3JtYXR0ZXI8J18+KSAtPiBjb3JlOjpmbXQ6OlJlc3VsdCB7CiAgICAgbGV0IG11dCBkcyA9IGYuZGVidWdfc3RydWN0KCJNb25zdGVyIik7CiAgICAgICBkcy5maWVsZCgicG9zIiwgJnNlbGYucG9zKCkpOwogICAgICAgZHMuZmllbGQoIm1hbmEiLCAmc2VsZi5tYW5hKCkpOwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvc2FtcGxlcy9ydXN0X2dlbmVyYXRlZC9teV9nYW1lL3NhbXBsZS92ZWNfM19nZW5lcmF0ZWQucnMgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy9zYW1wbGVzL3J1c3RfZ2VuZXJhdGVkL215X2dhbWUvc2FtcGxlL3ZlY18zX2dlbmVyYXRlZC5ycwppbmRleCBhMTY0N2Q1Li44OTQxODZiIDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy9zYW1wbGVzL3J1c3RfZ2VuZXJhdGVkL215X2dhbWUvc2FtcGxlL3ZlY18zX2dlbmVyYXRlZC5ycworKysgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy9zYW1wbGVzL3J1c3RfZ2VuZXJhdGVkL215X2dhbWUvc2FtcGxlL3ZlY18zX2dlbmVyYXRlZC5ycwpAQCAtMSw3ICsxLDEyIEBACiAvLyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBieSB0aGUgRmxhdEJ1ZmZlcnMgY29tcGlsZXIsIGRvIG5vdCBtb2RpZnkKKy8vIEBnZW5lcmF0ZWQKK2V4dGVybiBjcmF0ZSBhbGxvYzsKIGV4dGVybiBjcmF0ZSBmbGF0YnVmZmVyczsKLXVzZSBzdGQ6Om1lbTsKLXVzZSBzdGQ6OmNtcDo6T3JkZXJpbmc7Cit1c2UgYWxsb2M6OmJveGVkOjpCb3g7Cit1c2UgYWxsb2M6OnN0cmluZzo6e1N0cmluZywgVG9TdHJpbmd9OwordXNlIGFsbG9jOjp2ZWM6OlZlYzsKK3VzZSBjb3JlOjptZW07Cit1c2UgY29yZTo6Y21wOjpPcmRlcmluZzsKIHVzZSBzZWxmOjpmbGF0YnVmZmVyczo6e0VuZGlhblNjYWxhciwgRm9sbG93fTsKIHVzZSBzdXBlcjo6KjsKIC8vIHN0cnVjdCBWZWMzLCBhbGlnbmVkIHRvIDQKQEAgLTEzLDggKzE4LDggQEAKICAgICBTZWxmKFswOyAxMl0pCiAgIH0KIH0KLWltcGwgc3RkOjpmbXQ6OkRlYnVnIGZvciBWZWMzIHsKLSAgZm4gZm10KCZzZWxmLCBmOiAmbXV0IHN0ZDo6Zm10OjpGb3JtYXR0ZXIpIC0+IHN0ZDo6Zm10OjpSZXN1bHQgeworaW1wbCBjb3JlOjpmbXQ6OkRlYnVnIGZvciBWZWMzIHsKKyAgZm4gZm10KCZzZWxmLCBmOiAmbXV0IGNvcmU6OmZtdDo6Rm9ybWF0dGVyKSAtPiBjb3JlOjpmbXQ6OlJlc3VsdCB7CiAgICAgZi5kZWJ1Z19zdHJ1Y3QoIlZlYzMiKQogICAgICAgLmZpZWxkKCJ4IiwgJnNlbGYueCgpKQogICAgICAgLmZpZWxkKCJ5IiwgJnNlbGYueSgpKQpAQCAtNDQsNyArNDksNyBAQAogICAgICNbaW5saW5lXQogICAgIGZuIHB1c2goJnNlbGYsIGRzdDogJm11dCBbdThdLCBfcmVzdDogJlt1OF0pIHsKICAgICAgICAgbGV0IHNyYyA9IHVuc2FmZSB7Ci0gICAgICAgICAgICA6OnN0ZDo6c2xpY2U6OmZyb21fcmF3X3BhcnRzKHNlbGYgYXMgKmNvbnN0IFZlYzMgYXMgKmNvbnN0IHU4LCBTZWxmOjpzaXplKCkpCisgICAgICAgICAgICA6OmNvcmU6OnNsaWNlOjpmcm9tX3Jhd19wYXJ0cyhzZWxmIGFzICpjb25zdCBWZWMzIGFzICpjb25zdCB1OCwgU2VsZjo6c2l6ZSgpKQogICAgICAgICB9OwogICAgICAgICBkc3QuY29weV9mcm9tX3NsaWNlKHNyYyk7CiAgICAgfQpAQCAtNTUsNyArNjAsNyBAQAogICAgICNbaW5saW5lXQogICAgIGZuIHB1c2goJnNlbGYsIGRzdDogJm11dCBbdThdLCBfcmVzdDogJlt1OF0pIHsKICAgICAgICAgbGV0IHNyYyA9IHVuc2FmZSB7Ci0gICAgICAgICAgICA6OnN0ZDo6c2xpY2U6OmZyb21fcmF3X3BhcnRzKCpzZWxmIGFzICpjb25zdCBWZWMzIGFzICpjb25zdCB1OCwgU2VsZjo6c2l6ZSgpKQorICAgICAgICAgICAgOjpjb3JlOjpzbGljZTo6ZnJvbV9yYXdfcGFydHMoKnNlbGYgYXMgKmNvbnN0IFZlYzMgYXMgKmNvbnN0IHU4LCBTZWxmOjpzaXplKCkpCiAgICAgICAgIH07CiAgICAgICAgIGRzdC5jb3B5X2Zyb21fc2xpY2Uoc3JjKTsKICAgICB9CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy9zYW1wbGVzL3J1c3RfZ2VuZXJhdGVkL215X2dhbWUvc2FtcGxlL3dlYXBvbl9nZW5lcmF0ZWQucnMgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy9zYW1wbGVzL3J1c3RfZ2VuZXJhdGVkL215X2dhbWUvc2FtcGxlL3dlYXBvbl9nZW5lcmF0ZWQucnMKaW5kZXggNTBhNjc4Yi4uZjBhNzA5ZCAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvc2FtcGxlcy9ydXN0X2dlbmVyYXRlZC9teV9nYW1lL3NhbXBsZS93ZWFwb25fZ2VuZXJhdGVkLnJzCisrKyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3NhbXBsZXMvcnVzdF9nZW5lcmF0ZWQvbXlfZ2FtZS9zYW1wbGUvd2VhcG9uX2dlbmVyYXRlZC5ycwpAQCAtMSw3ICsxLDEyIEBACiAvLyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBieSB0aGUgRmxhdEJ1ZmZlcnMgY29tcGlsZXIsIGRvIG5vdCBtb2RpZnkKKy8vIEBnZW5lcmF0ZWQKK2V4dGVybiBjcmF0ZSBhbGxvYzsKIGV4dGVybiBjcmF0ZSBmbGF0YnVmZmVyczsKLXVzZSBzdGQ6Om1lbTsKLXVzZSBzdGQ6OmNtcDo6T3JkZXJpbmc7Cit1c2UgYWxsb2M6OmJveGVkOjpCb3g7Cit1c2UgYWxsb2M6OnN0cmluZzo6e1N0cmluZywgVG9TdHJpbmd9OwordXNlIGFsbG9jOjp2ZWM6OlZlYzsKK3VzZSBjb3JlOjptZW07Cit1c2UgY29yZTo6Y21wOjpPcmRlcmluZzsKIHVzZSBzZWxmOjpmbGF0YnVmZmVyczo6e0VuZGlhblNjYWxhciwgRm9sbG93fTsKIHVzZSBzdXBlcjo6KjsKIHB1YiBlbnVtIFdlYXBvbk9mZnNldCB7fQpAQCAtMTE4LDggKzEyMyw4IEBACiAgIH0KIH0KIAotaW1wbCBzdGQ6OmZtdDo6RGVidWcgZm9yIFdlYXBvbjwnXz4gewotICBmbiBmbXQoJnNlbGYsIGY6ICZtdXQgc3RkOjpmbXQ6OkZvcm1hdHRlcjwnXz4pIC0+IHN0ZDo6Zm10OjpSZXN1bHQgeworaW1wbCBjb3JlOjpmbXQ6OkRlYnVnIGZvciBXZWFwb248J18+IHsKKyAgZm4gZm10KCZzZWxmLCBmOiAmbXV0IGNvcmU6OmZtdDo6Rm9ybWF0dGVyPCdfPikgLT4gY29yZTo6Zm10OjpSZXN1bHQgewogICAgIGxldCBtdXQgZHMgPSBmLmRlYnVnX3N0cnVjdCgiV2VhcG9uIik7CiAgICAgICBkcy5maWVsZCgibmFtZSIsICZzZWxmLm5hbWUoKSk7CiAgICAgICBkcy5maWVsZCgiZGFtYWdlIiwgJnNlbGYuZGFtYWdlKCkpOwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvc2FtcGxlcy9zYW1wbGVfYmZicy5jcHAgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy9zYW1wbGVzL3NhbXBsZV9iZmJzLmNwcAppbmRleCAwZTE3NjkwLi41NjBkZTcwIDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy9zYW1wbGVzL3NhbXBsZV9iZmJzLmNwcAorKysgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy9zYW1wbGVzL3NhbXBsZV9iZmJzLmNwcApAQCAtNDYsNyArNDYsOCBAQAogCiAgIC8vIGluaXppYWxpemUgcGFyc2VyIGJ5IGRlc2VyaWFsaXppbmcgYmZicyBzY2hlbWEKICAgZmxhdGJ1ZmZlcnM6OlBhcnNlciBwYXJzZXIyOwotICBvayA9IHBhcnNlcjIuRGVzZXJpYWxpemUoKHVpbnQ4X3QgKiliZmJzX2ZpbGUuY19zdHIoKSwgYmZic19maWxlLmxlbmd0aCgpKTsKKyAgb2sgPSBwYXJzZXIyLkRlc2VyaWFsaXplKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCAqPihiZmJzX2ZpbGUuY19zdHIoKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBiZmJzX2ZpbGUubGVuZ3RoKCkpOwogICBhc3NlcnQob2spOwogCiAgIC8vIHBhcnNlIGpzb24gaW4gcGFyc2VyIGZyb20gZmJzIGFuZCBiZmJzCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy9zY3JpcHRzL2NoZWNrLWdycGMtZ2VuZXJhdGVkLWNvZGUucHkgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy9zY3JpcHRzL2NoZWNrLWdycGMtZ2VuZXJhdGVkLWNvZGUucHkKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYzlhNDM4MwotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3NjcmlwdHMvY2hlY2stZ3JwYy1nZW5lcmF0ZWQtY29kZS5weQpAQCAtMCwwICsxLDQ1IEBACisjIS91c3IvYmluL2VudiBweXRob24zCisjCisjIENvcHlyaWdodCAyMDIyIEdvb2dsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK2ltcG9ydCBzdWJwcm9jZXNzCitpbXBvcnQgc3lzCitpbXBvcnQgZ2VuZXJhdGVfZ3JwY19leGFtcGxlcworZnJvbSBwYXRobGliIGltcG9ydCBQYXRoCisKKyMgR2V0IHRoZSBwYXRoIHdoZXJlIHRoaXMgc2NyaXB0IGlzIGxvY2F0ZWQgc28gd2UgY2FuIGludm9rZSB0aGUgc2NyaXB0IGZyb20KKyMgYW55IGRpcmVjdG9yeSBhbmQgaGF2ZSB0aGUgcGF0aHMgd29yayBjb3JyZWN0bHkuCitzY3JpcHRfcGF0aCA9IFBhdGgoX19maWxlX18pLnBhcmVudC5yZXNvbHZlKCkKKworIyBHZXQgdGhlIHJvb3QgcGF0aCBhcyBhbiBhYnNvbHV0ZSBwYXRoLCBzbyBhbGwgZGVyaXZlZCBwYXRocyBhcmUgYWJzb2x1dGUuCityb290X3BhdGggPSBzY3JpcHRfcGF0aC5wYXJlbnQuYWJzb2x1dGUoKQorCitwcmludCgiR2VuZXJhdGluZyBHUlBDIGNvZGUuLi4iKQorZ2VuZXJhdGVfZ3JwY19leGFtcGxlcy5HZW5lcmF0ZUdSUENFeGFtcGxlcygpCisKK3Jlc3VsdCA9IHN1YnByb2Nlc3MucnVuKFsiZ2l0IiwgImRpZmYiLCAiLS1xdWlldCJdLCBjd2Q9cm9vdF9wYXRoKQorCitpZiByZXN1bHQucmV0dXJuY29kZSAhPSAwOgorICAgIHByaW50KAorICAgICAgICAiXG4iCisgICAgICAgICJFUlJPUjogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiIKKyAgICAgICAgIkVSUk9SOiAqIFRoZSBmb2xsb3dpbmcgZGlmZmVyZW5jZXMgd2VyZSBmb3VuZCBhZnRlciBydW5uaW5nICAgKlxuIgorICAgICAgICAiRVJST1I6ICogdGhlIHNjcmlwdC9nZW5lcmF0ZV9ncnBjX2V4YW1wbGVzLnB5IHNjcmlwdC4gTWF5YmUgICAqXG4iCisgICAgICAgICJFUlJPUjogKiB5b3UgZm9yZ290IHRvIHJ1biBpdCBhZnRlciBtYWtpbmcgY2hhbmdlcyBpbiBhICAgICAgICpcbiIKKyAgICAgICAgIkVSUk9SOiAqIGdlbmVyYXRvciBvciBzY2hlbWE/ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKlxuIgorICAgICAgICAiRVJST1I6ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4iCisgICAgKQorICAgIHN1YnByb2Nlc3MucnVuKFsiZ2l0IiwgImRpZmYiLCAiLS1iaW5hcnkiLCAiLS1leGl0LWNvZGUiXSwgY3dkPXJvb3RfcGF0aCkKKyAgICBzeXMuZXhpdChyZXN1bHQucmV0dXJuY29kZSkKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3NjcmlwdHMvY2hlY2stZ3JwYy1nZW5lcmF0ZWQtY29kZS5zaCBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3NjcmlwdHMvY2hlY2stZ3JwYy1nZW5lcmF0ZWQtY29kZS5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNDU0MWJlMS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy9zY3JpcHRzL2NoZWNrLWdycGMtZ2VuZXJhdGVkLWNvZGUuc2gKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0jIS9iaW4vYmFzaAotIwotIyBDb3B5cmlnaHQgMjAyMSBHb29nbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotIwotIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0jIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0jIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0jIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotc2V0IC1lCi0KLWVjaG8gIkNoZWNrcyBnZW5lcmF0ZWQgZ3JwYyBjb2RlIgotY2QgZ3JwYy9leGFtcGxlcwotc2ggZ2VuZXJhdGUuc2gKLWNkIC4uCi0KLWlmICEgZ2l0IGRpZmYgLS1xdWlldDsgdGhlbgotICBlY2hvID4mMgotICBlY2hvICJFUlJPUjogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioiID4mMgotICBlY2hvICJFUlJPUjogVGhlIGZvbGxvd2luZyBkaWZmZXJlbmNlcyB3ZXJlIGZvdW5kIGFmdGVyIHJ1bm5pbmcgdGhlIiA+JjIKLSAgZWNobyAiRVJST1I6IGdycGMvZXhhbXBsZS9nZW5lcmF0ZS5zaCBzY3JpcHQuIE1heWJlIHlvdSBmb3Jnb3QgdG8gcnVuIiA+JjIKLSAgZWNobyAiRVJST1I6IGl0IGFmdGVyIG1ha2luZyBjaGFuZ2VzIGluIGEgZ2VuZXJhdG9yIG9yIHNjaGVtYT8iID4mMgotICBlY2hvICJFUlJPUjogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioiID4mMgotICBlY2hvID4mMgotICBnaXQgZGlmZiAtLWJpbmFyeSAtLWV4aXQtY29kZQotZmkKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3NjcmlwdHMvZ2VuZXJhdGVfY29kZS5weSBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3NjcmlwdHMvZ2VuZXJhdGVfY29kZS5weQppbmRleCA5ODcxYzBkLi43MTExZDhkIDEwMDc1NQotLS0gYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy9zY3JpcHRzL2dlbmVyYXRlX2NvZGUucHkKKysrIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvc2NyaXB0cy9nZW5lcmF0ZV9jb2RlLnB5CkBAIC0yMCw3ICsyMCw3IEBACiBpbXBvcnQgcGxhdGZvcm0KIGltcG9ydCBzaHV0aWwKIGltcG9ydCBzdWJwcm9jZXNzCi1pbXBvcnQgc3lzCitpbXBvcnQgZ2VuZXJhdGVfZ3JwY19leGFtcGxlcwogZnJvbSBwYXRobGliIGltcG9ydCBQYXRoCiAKIHBhcnNlciA9IGFyZ3BhcnNlLkFyZ3VtZW50UGFyc2VyKCkKQEAgLTY0LDEzICs2NCwxMiBAQAogCiAjIFNwZWNpZnkgdGhlIG90aGVyIHBhdGhzIHRoYXQgd2lsbCBiZSByZWZlcmVuY2VkCiB0ZXN0c19wYXRoID0gUGF0aChyb290X3BhdGgsICJ0ZXN0cyIpCitzd2lmdF9jb2RlX2dlbiA9IFBhdGgocm9vdF9wYXRoLCAidGVzdHMvc3dpZnQvdGVzdHMvQ29kZUdlbmVyYXRpb25UZXN0cyIpCiBzYW1wbGVzX3BhdGggPSBQYXRoKHJvb3RfcGF0aCwgInNhbXBsZXMiKQogcmVmbGVjdGlvbl9wYXRoID0gUGF0aChyb290X3BhdGgsICJyZWZsZWN0aW9uIikKIAogIyBFeGVjdXRlIHRoZSBmbGF0YyBjb21waWxlciB3aXRoIHRoZSBzcGVjaWZpZWQgcGFyYW1ldGVycwotZGVmIGZsYXRjKAotICAgIG9wdGlvbnMsIHNjaGVtYSwgcHJlZml4PU5vbmUsIGluY2x1ZGU9Tm9uZSwgZGF0YT1Ob25lLCBjd2Q9dGVzdHNfcGF0aAotKToKK2RlZiBmbGF0YyhvcHRpb25zLCBzY2hlbWEsIHByZWZpeD1Ob25lLCBpbmNsdWRlPU5vbmUsIGRhdGE9Tm9uZSwgY3dkPXRlc3RzX3BhdGgpOgogICAgIGNtZCA9IFtzdHIoZmxhdGNfcGF0aCldICsgb3B0aW9ucwogICAgIGlmIHByZWZpeDoKICAgICAgICAgY21kICs9IFsiLW8iXSArIFtwcmVmaXhdCkBAIC05NSwxMCArOTQsMTYgQEAKICAgICBuZXdfcmVmbGVjdGlvbl9wYXRoID0gUGF0aChyZWZsZWN0aW9uX3BhdGgsIHRlbXBfZGlyLCB0YXJnZXQpCiAgICAgb3JpZ2luYWxfcmVmbGVjdGlvbl9wYXRoID0gUGF0aChyb290X3BhdGgsIGxvY2F0aW9uLCB0YXJnZXQpCiAgICAgaWYgbm90IGZpbGVjbXAuY21wKHN0cihuZXdfcmVmbGVjdGlvbl9wYXRoKSwgc3RyKG9yaWdpbmFsX3JlZmxlY3Rpb25fcGF0aCkpOgotICAgICAgICBzaHV0aWwucm10cmVlKHN0cihvcmlnaW5hbF9yZWZsZWN0aW9uX3BhdGgpKQorICAgICAgICBzaHV0aWwucm10cmVlKHN0cihvcmlnaW5hbF9yZWZsZWN0aW9uX3BhdGgpLCBpZ25vcmVfZXJyb3JzPVRydWUpCiAgICAgICAgIHNodXRpbC5tb3ZlKHN0cihuZXdfcmVmbGVjdGlvbl9wYXRoKSwgc3RyKG9yaWdpbmFsX3JlZmxlY3Rpb25fcGF0aCkpCiAgICAgc2h1dGlsLnJtdHJlZShzdHIoUGF0aChyZWZsZWN0aW9uX3BhdGgsIHRlbXBfZGlyKSkpCiAKK2RlZiBmbGF0Y19hbm5vdGF0ZShzY2hlbWEsIGZpbGUsIGluY2x1ZGU9Tm9uZSwgY3dkPXRlc3RzX3BhdGgpOgorICAgIGNtZCA9IFtzdHIoZmxhdGNfcGF0aCldCisgICAgaWYgaW5jbHVkZToKKyAgICAgICAgY21kICs9IFsiLUkiXSArIFtpbmNsdWRlXQorICAgIGNtZCArPSBbIi0tYW5ub3RhdGUiLCBzY2hlbWEsIGZpbGVdCisgICAgcmVzdWx0ID0gc3VicHJvY2Vzcy5ydW4oY21kLCBjd2Q9c3RyKGN3ZCksIGNoZWNrPVRydWUpCiAKICMgR2xvYiBhIHBhdHRlcm4gcmVsYXRpdmUgdG8gZmlsZSBwYXRoCiBkZWYgZ2xvYihwYXRoLCBwYXR0ZXJuKToKQEAgLTEyNSw3ICsxMzAsMTIgQEAKICAgICAiLS1jcHAtc3RhdGljLXJlZmxlY3Rpb24iLAogICAgICItLWdlbi1vYmplY3QtYXBpIiwKIF0KLVJVU1RfT1BUUyA9IEJBU0VfT1BUUyArIFsiLS1ydXN0IiwgIi0tZ2VuLWFsbCIsICItLWdlbi1uYW1lLXN0cmluZ3MiLCAiLS1ydXN0LW1vZHVsZS1yb290LWZpbGUiXQorUlVTVF9PUFRTID0gQkFTRV9PUFRTICsgWworICAgICItLXJ1c3QiLAorICAgICItLWdlbi1hbGwiLAorICAgICItLWdlbi1uYW1lLXN0cmluZ3MiLAorICAgICItLXJ1c3QtbW9kdWxlLXJvb3QtZmlsZSIsCitdCiBSVVNUX1NFUklBTElaRV9PUFRTID0gQkFTRV9PUFRTICsgWwogICAgICItLXJ1c3QiLAogICAgICItLWdlbi1hbGwiLApAQCAtMTM2LDYgKzE0NiwxMiBAQAogVFNfT1BUUyA9IFsiLS10cyIsICItLWdlbi1uYW1lLXN0cmluZ3MiXQogTE9CU1RFUl9PUFRTID0gWyItLWxvYnN0ZXIiXQogU1dJRlRfT1BUUyA9IFsiLS1zd2lmdCIsICItLWdlbi1qc29uLWVtaXQiLCAiLS1iZmJzLWZpbGVuYW1lcyIsIHN0cih0ZXN0c19wYXRoKV0KK1NXSUZUX09QVFNfQ09ERV9HRU4gPSBbCisgICAgIi0tc3dpZnQiLCAKKyAgICAiLS1nZW4tanNvbi1lbWl0IiwKKyAgICAiLS1iZmJzLWZpbGVuYW1lcyIsCisgICAgc3dpZnRfY29kZV9nZW4KK10KIEpBVkFfT1BUUyA9IFsiLS1qYXZhIl0KIEtPVExJTl9PUFRTID0gWyItLWtvdGxpbiJdCiBQSFBfT1BUUyA9IFsiLS1waHAiXQpAQCAtMTQ5LDcgKzE2NSw2IEBACiAgICAgTk9fSU5DTF9PUFRTCiAgICAgKyBDUFBfT1BUUwogICAgICsgQ1NfT1BUUwotICAgICsgVFNfT1BUUwogICAgICsgWwogICAgICAgICAiLS1iaW5hcnkiLAogICAgICAgICAiLS1qYXZhIiwKQEAgLTE2NSw2ICsxODAsMTUgQEAKICkKIAogZmxhdGMoCisgICAgTk9fSU5DTF9PUFRTCisgICAgKyBUU19PUFRTLAorICAgIHNjaGVtYT0ibW9uc3Rlcl90ZXN0LmZicyIsCisgICAgcHJlZml4PSJ0cyIsCisgICAgaW5jbHVkZT0iaW5jbHVkZV90ZXN0IiwKKyAgICBkYXRhPSJtb25zdGVyZGF0YV90ZXN0Lmpzb24iLAorKQorCitmbGF0YygKICAgICBbIi0tbHVhIiwgIi0tYmZicy1maWxlbmFtZXMiLCBzdHIodGVzdHNfcGF0aCldLAogICAgIHNjaGVtYT0ibW9uc3Rlcl90ZXN0LmZicyIsCiAgICAgaW5jbHVkZT0iaW5jbHVkZV90ZXN0IiwKQEAgLTIxMCw3ICsyMzQsNyBAQAogIyBGb3IgUnVzdCB3ZSBjdXJyZW50bHkgZ2VuZXJhdGUgdHdvIGluZGVwZW5kZW50IHNjaGVtYXMsIHdpdGggbmFtZXNwYWNlX3Rlc3QyCiAjIGR1cGxpY2F0aW5nIHRoZSB0eXBlcyBpbiBuYW1lc3BhY2VfdGVzdDEKIGZsYXRjKAotICAgIFJVU1RfT1BUUywKKyAgICBSVVNUX09QVFMgKyBDU19PUFRTLAogICAgIHByZWZpeD0ibmFtZXNwYWNlX3Rlc3QiLAogICAgIHNjaGVtYT1bCiAgICAgICAgICJuYW1lc3BhY2VfdGVzdC9uYW1lc3BhY2VfdGVzdDEuZmJzIiwKQEAgLTIxOSwzMyArMjQzLDQzIEBACiApCiAKIGZsYXRjKAotICAgIEJBU0VfT1BUUwotICAgICsgQ1BQX09QVFMKLSAgICArIENTX09QVFMKLSAgICArIFRTX09QVFMKLSAgICArIEpBVkFfT1BUUwotICAgICsgS09UTElOX09QVFMKLSAgICArIFBIUF9PUFRTLAorICAgIEJBU0VfT1BUUyArIENQUF9PUFRTICsgQ1NfT1BUUyArIEpBVkFfT1BUUyArIEtPVExJTl9PUFRTICsgUEhQX09QVFMsCiAgICAgcHJlZml4PSJ1bmlvbl92ZWN0b3IiLAogICAgIHNjaGVtYT0idW5pb25fdmVjdG9yL3VuaW9uX3ZlY3Rvci5mYnMiLAogKQogCiBmbGF0YygKKyAgICBCQVNFX09QVFMgKyBUU19PUFRTLAorICAgIHByZWZpeD0idHMvdW5pb25fdmVjdG9yIiwKKyAgICBzY2hlbWE9InVuaW9uX3ZlY3Rvci91bmlvbl92ZWN0b3IuZmJzIiwKKykKKworZmxhdGMoCiAgICAgQkFTRV9PUFRTICsgVFNfT1BUUyArIFsiLS1nZW4tbmFtZS1zdHJpbmdzIiwgIi0tZ2VuLW11dGFibGUiXSwKICAgICBpbmNsdWRlPSJpbmNsdWRlX3Rlc3QiLAorICAgIHByZWZpeD0idHMiLAogICAgIHNjaGVtYT0ibW9uc3Rlcl90ZXN0LmZicyIsCiApCiAKKyMgR2VuZXJhdGUgdGhlIGNvbXBsZXRlIGZsYXQgZmlsZSBUUyBvZiBtb25zdGVyLgorZmxhdGMoCisgICAgWyItLXRzIiwgIi0tZ2VuLWFsbCIsICItLXRzLWZsYXQtZmlsZXMiXSwKKyAgICBpbmNsdWRlPSJpbmNsdWRlX3Rlc3QiLAorICAgIHNjaGVtYT0ibW9uc3Rlcl90ZXN0LmZicyIsCisgICAgcHJlZml4PSJ0cy90cy1mbGF0LWZpbGVzIgorKQorCiBmbGF0YygKICAgICBCQVNFX09QVFMgKyBUU19PUFRTICsgWyItYiJdLAogICAgIGluY2x1ZGU9ImluY2x1ZGVfdGVzdCIsCisgICAgcHJlZml4PSJ0cyIsCiAgICAgc2NoZW1hPSJtb25zdGVyX3Rlc3QuZmJzIiwKICAgICBkYXRhPSJ1bmljb2RlX3Rlc3QuanNvbiIsCiApCiAKIGZsYXRjKAogICAgIEJBU0VfT1BUUyArIFRTX09QVFMgKyBbIi0tZ2VuLW5hbWUtc3RyaW5ncyJdLAotICAgIHByZWZpeD0idW5pb25fdmVjdG9yIiwKKyAgICBwcmVmaXg9InRzL3VuaW9uX3ZlY3RvciIsCiAgICAgc2NoZW1hPSJ1bmlvbl92ZWN0b3IvdW5pb25fdmVjdG9yLmZicyIsCiApCiAKQEAgLTI2OSw2ICszMDMsMTkgQEAKICAgICBzY2hlbWE9Im1vbnN0ZXJfdGVzdC5mYnMiLAogKQogCisjIEdlbmVyYXRlIHRoZSBhbm5vdGF0ZWQgYmluYXJ5IG9mIHRoZSBtb25zdGVyX3Rlc3QgYmluYXJ5IHNjaGVtYS4KK2ZsYXRjX2Fubm90YXRlKAorICAgIHNjaGVtYT0iLi4vcmVmbGVjdGlvbi9yZWZsZWN0aW9uLmZicyIsIAorICAgIGZpbGU9Im1vbnN0ZXJfdGVzdC5iZmJzIiwgCisgICAgaW5jbHVkZT0iaW5jbHVkZV90ZXN0IgorKQorCitmbGF0Y19hbm5vdGF0ZSgKKyAgICBzY2hlbWE9Im1vbnN0ZXJfdGVzdC5mYnMiLCAKKyAgICBmaWxlPSJtb25zdGVyZGF0YV90ZXN0Lm1vbiIsIAorICAgIGluY2x1ZGU9ImluY2x1ZGVfdGVzdCIKKykKKwogZmxhdGMoCiAgICAgQ1BQX09QVFMKICAgICArIE5PX0lOQ0xfT1BUUwpAQCAtMjk3LDEyICszNDQsNyBAQAogCiBpZiBub3QgYXJncy5za2lwX21vbnN0ZXJfZXh0cmE6CiAgICAgZmxhdGMoCi0gICAgICAgIENQUF9PUFRTCi0gICAgICAgICsgQ1NfT1BUUwotICAgICAgICArIE5PX0lOQ0xfT1BUUwotICAgICAgICArIEpBVkFfT1BUUwotICAgICAgICArIEtPVExJTl9PUFRTCi0gICAgICAgICsgUFlUSE9OX09QVFMsCisgICAgICAgIENQUF9PUFRTICsgQ1NfT1BUUyArIE5PX0lOQ0xfT1BUUyArIEpBVkFfT1BUUyArIEtPVExJTl9PUFRTICsgUFlUSE9OX09QVFMsCiAgICAgICAgIHNjaGVtYT0ibW9uc3Rlcl9leHRyYS5mYnMiLAogICAgICAgICBkYXRhPSJtb25zdGVyZGF0YV9leHRyYS5qc29uIiwKICAgICApCkBAIC0zMTMsMTEgKzM1NSw3IEBACiAgICAgKQogCiBmbGF0YygKLSAgICBDUFBfT1BUUwotICAgICsgQ1NfT1BUUwotICAgICsgTk9fSU5DTF9PUFRTCi0gICAgKyBKQVZBX09QVFMKLSAgICArIFsiLS1qc29uc2NoZW1hIiwgIi0tc2NvcGVkLWVudW1zIl0sCisgICAgQ1BQX09QVFMgKyBDU19PUFRTICsgTk9fSU5DTF9PUFRTICsgSkFWQV9PUFRTICsgWyItLWpzb25zY2hlbWEiLCAiLS1zY29wZWQtZW51bXMiXSwKICAgICBzY2hlbWE9ImFycmF5c190ZXN0LmZicyIsCiApCiAKQEAgLTMzNSwxNiArMzczLDIwIEBACiAKICMgT3B0aW9uYWwgU2NhbGFycwogb3B0aW9uYWxfc2NhbGFyc19zY2hlbWEgPSAib3B0aW9uYWxfc2NhbGFycy5mYnMiCi1mbGF0YygKLSAgICBbIi0tamF2YSIsICItLWtvdGxpbiIsICItLWxvYnN0ZXIiLCAiLS10cyJdLCBzY2hlbWE9b3B0aW9uYWxfc2NhbGFyc19zY2hlbWEKLSkKK2ZsYXRjKFsiLS1qYXZhIiwgIi0ta290bGluIiwgIi0tbG9ic3RlciJdLCBzY2hlbWE9b3B0aW9uYWxfc2NhbGFyc19zY2hlbWEpCitmbGF0YyhUU19PUFRTLCBzY2hlbWE9b3B0aW9uYWxfc2NhbGFyc19zY2hlbWEsIHByZWZpeD0idHMiKQogCi1mbGF0YyhbIi0tY3NoYXJwIiwgIi0tZ2VuLW9iamVjdC1hcGkiXSwgc2NoZW1hPW9wdGlvbmFsX3NjYWxhcnNfc2NoZW1hKQorZmxhdGMoWyItLWNzaGFycCIsICItLXB5dGhvbiIsICItLWdlbi1vYmplY3QtYXBpIl0sIHNjaGVtYT1vcHRpb25hbF9zY2FsYXJzX3NjaGVtYSkKIAogZmxhdGMoUlVTVF9PUFRTLCBwcmVmaXg9Im9wdGlvbmFsX3NjYWxhcnMiLCBzY2hlbWE9b3B0aW9uYWxfc2NhbGFyc19zY2hlbWEpCiAKIGZsYXRjKE5PX0lOQ0xfT1BUUyArIENQUF9PUFRTLCBzY2hlbWE9b3B0aW9uYWxfc2NhbGFyc19zY2hlbWEpCiAKKyMgVHlwZSAvIGZpZWxkIGNvbGxzaW9uCit0eXBlX2ZpZWxkX2NvbGxzaW9uX3NjaGVtYSA9ICJ0eXBlX2ZpZWxkX2NvbGxzaW9uLmZicyIKKworZmxhdGMoWyItLWNzaGFycCIsICItLWdlbi1vYmplY3QtYXBpIl0sIHNjaGVtYT10eXBlX2ZpZWxkX2NvbGxzaW9uX3NjaGVtYSkKKwogIyBHZW5lcmF0ZSBzdHJpbmcvdmVjdG9yIGRlZmF1bHQgY29kZSBmb3IgdGVzdHMKIGZsYXRjKFJVU1RfT1BUUywgcHJlZml4PSJtb3JlX2RlZmF1bHRzIiwgc2NoZW1hPSJtb3JlX2RlZmF1bHRzLmZicyIpCiAKQEAgLTM2MywxMSArNDA1LDE2IEBACiAgICAgcHJlZml4PSJuZXN0ZWRfbmFtZXNwYWNlX3Rlc3QiLAogICAgIHNjaGVtYT1nbG9iKHRlc3RzX3BhdGgsICJuZXN0ZWRfbmFtZXNwYWNlX3Rlc3QvbmVzdGVkX25hbWVzcGFjZV90ZXN0Ki5mYnMiKSwKICkKK2ZsYXRjKEJBU0VfT1BUUyArIERBUlRfT1BUUywgcHJlZml4PSIuLi9kYXJ0L3Rlc3QvIiwgc2NoZW1hPSJrZXl3b3JkX3Rlc3QuZmJzIikKKworIyBGaWVsZCBrZXkgbG9va3VwIHdpdGggZGVmYXVsdCB2YWx1ZSB0ZXN0CitkaWN0aW9uYXJ5X2xvb2t1cF9zY2hlbWEgPSAiZGljdGlvbmFyeV9sb29rdXAuZmJzIgorZmxhdGMoWyItLWphdmEiLCAiLS1rb3RsaW4iXSwgc2NoZW1hPWRpY3Rpb25hcnlfbG9va3VwX3NjaGVtYSkKIAogIyBTd2lmdCBUZXN0cwotc3dpZnRfcHJlZml4ID0gIkZsYXRCdWZmZXJzLlRlc3QuU3dpZnQvVGVzdHMvRmxhdEJ1ZmZlcnMuVGVzdC5Td2lmdFRlc3RzIgorc3dpZnRfcHJlZml4ID0gInN3aWZ0L3Rlc3RzL1Rlc3RzL0ZsYXRCdWZmZXJzLlRlc3QuU3dpZnRUZXN0cyIKIGZsYXRjKAotICAgIFNXSUZUX09QVFMgKyBOT19JTkNMX09QVFMgKyBbIi0tZ3JwYyJdLAorICAgIFNXSUZUX09QVFMgKyBCQVNFX09QVFMgKyBbIi0tZ3JwYyJdLAogICAgIHNjaGVtYT0ibW9uc3Rlcl90ZXN0LmZicyIsCiAgICAgaW5jbHVkZT0iaW5jbHVkZV90ZXN0IiwKICAgICBwcmVmaXg9c3dpZnRfcHJlZml4LApAQCAtMzc4LDYgKzQyNSw3IEBACiAgICAgcHJlZml4PXN3aWZ0X3ByZWZpeCwKICkKIGZsYXRjKFNXSUZUX09QVFMsIHNjaGVtYT0ib3B0aW9uYWxfc2NhbGFycy5mYnMiLCBwcmVmaXg9c3dpZnRfcHJlZml4KQorZmxhdGMoU1dJRlRfT1BUUywgc2NoZW1hPSJ2ZWN0b3JfaGFzX3Rlc3QuZmJzIiwgcHJlZml4PXN3aWZ0X3ByZWZpeCkKIGZsYXRjKAogICAgIFNXSUZUX09QVFMgKyBbIi0tZ2VuLW9iamVjdC1hcGkiXSwKICAgICBzY2hlbWE9Im1vcmVfZGVmYXVsdHMuZmJzIiwKQEAgLTM4OSwyMyArNDM3LDM3IEBACiAgICAgcHJlZml4PXN3aWZ0X3ByZWZpeCwKICkKIAorZmxhdGMoCisgICAgU1dJRlRfT1BUU19DT0RFX0dFTiArIEJBU0VfT1BUUyArIFsiLS1ncnBjIiwgIi0tc3dpZnQtaW1wbGVtZW50YXRpb24tb25seSJdLAorICAgIHNjaGVtYT0idGVzdF9pbXBvcnQuZmJzIiwKKyAgICBjd2Q9c3dpZnRfY29kZV9nZW4KKykKKworZmxhdGMoCisgICAgU1dJRlRfT1BUU19DT0RFX0dFTiArIE5PX0lOQ0xfT1BUUyArIFsiLS1ncnBjIl0sCisgICAgc2NoZW1hPSJ0ZXN0X25vX2luY2x1ZGUuZmJzIiwKKyAgICBjd2Q9c3dpZnRfY29kZV9nZW4KKykKKwogIyAtLWZpbGVuYW1lLXN1ZmZpeCBhbmQgLS1maWxlbmFtZS1leHQgdGVzdHMKIGZsYXRjKAotICAgIENQUF9PUFRTCi0gICAgKyBOT19JTkNMX09QVFMKLSAgICArIFsiLS1maWxlbmFtZS1zdWZmaXgiLCAiX3N1ZmZpeCIsICItLWZpbGVuYW1lLWV4dCIsICJocHAiXSwKKyAgICBDUFBfT1BUUyArIE5PX0lOQ0xfT1BUUyArIFsiLS1ncnBjIiwgIi0tZmlsZW5hbWUtZXh0IiwgImhwcCJdLAogICAgIGluY2x1ZGU9ImluY2x1ZGVfdGVzdCIsCisgICAgcHJlZml4PSJtb25zdGVyX3Rlc3Rfc3VmZml4L2V4dF9vbmx5IiwKICAgICBzY2hlbWE9Im1vbnN0ZXJfdGVzdC5mYnMiLAogKQotb3JpZ19tb25zdGVyX2ZpbGUgPSBQYXRoKHRlc3RzX3BhdGgsICJtb25zdGVyX3Rlc3RfZ2VuZXJhdGVkLmgiKQotbmV3X21vbnN0ZXJfZmlsZSA9IFBhdGgodGVzdHNfcGF0aCwgIm1vbnN0ZXJfdGVzdF9zdWZmaXguaHBwIikKLWFzc2VydCAoCi0gICAgbmV3X21vbnN0ZXJfZmlsZS5leGlzdHMoKQotKSwgImZpbGVuYW1lIHN1ZmZpeCBvcHRpb24gZGlkIG5vdCBwcm9kdWNlIGEgZmlsZSIKLWFzc2VydCBmaWxlY21wLmNtcCgKLSAgICBzdHIob3JpZ19tb25zdGVyX2ZpbGUpLCBzdHIobmV3X21vbnN0ZXJfZmlsZSkKLSksICJmaWxlbmFtZSBzdWZmaXggb3B0aW9uIGRpZCBub3QgcHJvZHVjZSBpZGVudGljYWwgcmVzdWx0cyIKLW5ld19tb25zdGVyX2ZpbGUudW5saW5rKCkKK2ZsYXRjKAorICAgIENQUF9PUFRTICsgTk9fSU5DTF9PUFRTICsgWyItLWdycGMiLCAiLS1maWxlbmFtZS1zdWZmaXgiLCAiX3N1ZmZpeCJdLAorICAgIGluY2x1ZGU9ImluY2x1ZGVfdGVzdCIsCisgICAgcHJlZml4PSJtb25zdGVyX3Rlc3Rfc3VmZml4L2ZpbGVzdWZmaXhfb25seSIsCisgICAgc2NoZW1hPSJtb25zdGVyX3Rlc3QuZmJzIiwKKykKK2ZsYXRjKAorICAgIENQUF9PUFRTICsgTk9fSU5DTF9PUFRTICsgWyItLWdycGMiLCAiLS1maWxlbmFtZS1zdWZmaXgiLCAiX3N1ZmZpeCIsICItLWZpbGVuYW1lLWV4dCIsICJocHAiXSwKKyAgICBpbmNsdWRlPSJpbmNsdWRlX3Rlc3QiLAorICAgIHByZWZpeD0ibW9uc3Rlcl90ZXN0X3N1ZmZpeCIsCisgICAgc2NoZW1hPSJtb25zdGVyX3Rlc3QuZmJzIiwKKykKIAogIyBGbGFnIGMrKzE3IHJlcXVpcmVzIENsYW5nNiwgR0NDNywgTVNWQzIwMTcgKF9NU0NfVkVSID49IDE5MTQpIG9yIGhpZ2hlci4KIGNwcF8xN19wcmVmaXggPSAiY3BwMTcvZ2VuZXJhdGVkX2NwcDE3IgpAQCAtNDI2LDE0ICs0ODgsMTUgQEAKICAgICBwcmVmaXg9Y3BwXzE3X3ByZWZpeCwKICkKIAorIyBQcml2YXRlIGFubm90YXRpb25zCithbm5vdGF0aW9uc190ZXN0X3NjaGVtYSA9ICJwcml2YXRlX2Fubm90YXRpb25fdGVzdC5mYnMiCisKK2ZsYXRjKFJVU1RfT1BUUyArIFsiLS1uby1sZWFrLXByaXZhdGUtYW5ub3RhdGlvbiIsICItLWdlbi1vYmplY3QtYXBpIl0sIHByZWZpeD0icHJpdmF0ZV9hbm5vdGF0aW9uX3Rlc3QiLCBzY2hlbWE9YW5ub3RhdGlvbnNfdGVzdF9zY2hlbWEpCisKICMgU2FtcGxlIGZpbGVzCiBzYW1wbGVzX3NjaGVtYSA9ICJtb25zdGVyLmZicyIKLWZsYXRjKAotICAgIEJBU0VfT1BUUyArIENQUF9PUFRTICsgTE9CU1RFUl9PUFRTLCBzY2hlbWE9c2FtcGxlc19zY2hlbWEsIGN3ZD1zYW1wbGVzX3BhdGgKLSkKLWZsYXRjKAotICAgIFJVU1RfT1BUUywgcHJlZml4PSJydXN0X2dlbmVyYXRlZCIsIHNjaGVtYT1zYW1wbGVzX3NjaGVtYSwgY3dkPXNhbXBsZXNfcGF0aAotKQorZmxhdGMoQkFTRV9PUFRTICsgQ1BQX09QVFMgKyBMT0JTVEVSX09QVFMsIHNjaGVtYT1zYW1wbGVzX3NjaGVtYSwgY3dkPXNhbXBsZXNfcGF0aCkKK2ZsYXRjKFJVU1RfT1BUUywgcHJlZml4PSJydXN0X2dlbmVyYXRlZCIsIHNjaGVtYT1zYW1wbGVzX3NjaGVtYSwgY3dkPXNhbXBsZXNfcGF0aCkKIGZsYXRjKAogICAgIEJJTkFSWV9PUFRTICsgWyItLWJmYnMtZmlsZW5hbWVzIiwgc3RyKHNhbXBsZXNfcGF0aCldLAogICAgIHNjaGVtYT1zYW1wbGVzX3NjaGVtYSwKQEAgLTQ0NSw5ICs1MDgsMzAgQEAKICMgU2tpcCBnZW5lcmF0aW5nIHRoZSByZWZsZWN0aW9uIGlmIHRvbGQgdG9vLCBhcyB3ZSBydW4gdGhpcyBzY3JpcHQgYWZ0ZXIKICMgYnVpbGRpbmcgZmxhdGMgd2hpY2ggdXNlcyB0aGUgcmVmbGVjdGlvbl9nZW5lcmF0ZWQuaCBpdHNlbGYuCiBpZiBub3QgYXJncy5za2lwX2dlbl9yZWZsZWN0aW9uOgotICAjIEMrKyBSZWZsZWN0aW9uCi0gIGZsYXRjX3JlZmxlY3Rpb24oWyItYyIsICItLWNwcC1zdGQiLCAiYysrMHgiXSwgImluY2x1ZGUvZmxhdGJ1ZmZlcnMiLAotICAgICAgICAgICAgICAgICAgICJyZWZsZWN0aW9uX2dlbmVyYXRlZC5oIikKKyAgICAjIEMrKyBSZWZsZWN0aW9uCisgICAgZmxhdGNfcmVmbGVjdGlvbigKKyAgICAgICAgWyItYyIsICItLWNwcC1zdGQiLCAiYysrMHgiXSwgImluY2x1ZGUvZmxhdGJ1ZmZlcnMiLCAicmVmbGVjdGlvbl9nZW5lcmF0ZWQuaCIKKyAgICApCiAKICMgUHl0aG9uIFJlZmxlY3Rpb24KIGZsYXRjX3JlZmxlY3Rpb24oWyItcCJdLCAicHl0aG9uL2ZsYXRidWZmZXJzIiwgInJlZmxlY3Rpb24iKQorCisjIEFubm90YXRpb24KKworCitkZWYgZmxhdGNfYW5ub3RhdGUoc2NoZW1hLCBpbmNsdWRlPU5vbmUsIGRhdGE9Tm9uZSwgY3dkPXRlc3RzX3BhdGgpOgorICAgIGNtZCA9IFtzdHIoZmxhdGNfcGF0aCldCisgICAgaWYgaW5jbHVkZToKKyAgICAgICAgY21kICs9IFsiLUkiXSArIFtpbmNsdWRlXQorICAgIGNtZCArPSBbIi0tYW5ub3RhdGUiLCBzY2hlbWFdCisgICAgaWYgZGF0YToKKyAgICAgICAgY21kICs9IFtkYXRhXSBpZiBpc2luc3RhbmNlKGRhdGEsIHN0cikgZWxzZSBkYXRhCisgICAgc3VicHJvY2Vzcy5ydW4oY21kLCBjd2Q9c3RyKGN3ZCksIGNoZWNrPVRydWUpCisKKworZmxhdGNfYW5ub3RhdGUoCisgICAgc2NoZW1hPSJtb25zdGVyX3Rlc3QuZmJzIiwgaW5jbHVkZT0iaW5jbHVkZV90ZXN0IiwgZGF0YT0ibW9uc3RlcmRhdGFfdGVzdC5tb24iCispCisKKyMgUnVuIHRoZSBnZW5lcmF0ZV9ncnBjX2V4YW1wbGVzIHNjcmlwdAorZ2VuZXJhdGVfZ3JwY19leGFtcGxlcy5HZW5lcmF0ZUdSUENFeGFtcGxlcygpCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy9zY3JpcHRzL2dlbmVyYXRlX2dycGNfZXhhbXBsZXMucHkgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy9zY3JpcHRzL2dlbmVyYXRlX2dycGNfZXhhbXBsZXMucHkKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYzVkYmJhNQotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3NjcmlwdHMvZ2VuZXJhdGVfZ3JwY19leGFtcGxlcy5weQpAQCAtMCwwICsxLDcwIEBACisjIS91c3IvYmluL2VudiBweXRob24zCisjCisjIENvcHlyaWdodCAyMDIyIEdvb2dsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK2Zyb20gdXRpbCBpbXBvcnQgZmxhdGMsIHJvb3RfcGF0aAorZnJvbSBwYXRobGliIGltcG9ydCBQYXRoCisKK2dycGNfZXhhbXBsZXNfcGF0aCA9IFBhdGgocm9vdF9wYXRoLCAiZ3JwYy9leGFtcGxlcyIpCisKK2dyZWV0ZXJfc2NoZW1hID0gUGF0aChncnBjX2V4YW1wbGVzX3BhdGgsICJncmVldGVyLmZicyIpCisKK0NPTU1PTl9BUkdTID0gWworICAgICItLWdycGMiLAorICAgICItLWJmYnMtZmlsZW5hbWVzIiwKKyAgICBzdHIoZ3JwY19leGFtcGxlc19wYXRoKSwKK10KKworZGVmIEdlbmVyYXRlR1JQQ0V4YW1wbGVzKCk6CisKKyAgICBmbGF0YygKKyAgICAgICAgQ09NTU9OX0FSR1MKKyAgICAgICAgKyBbCisgICAgICAgICAgICAiLS1nbyIsCisgICAgICAgIF0sCisgICAgICAgIHNjaGVtYT1ncmVldGVyX3NjaGVtYSwKKyAgICAgICAgY3dkPVBhdGgoZ3JwY19leGFtcGxlc19wYXRoLCAiZ28vZ3JlZXRlciIpLAorICAgICkKKworICAgIGZsYXRjKAorICAgICAgICBDT01NT05fQVJHUworICAgICAgICArIFsKKyAgICAgICAgICAgICItLXB5dGhvbiIsCisgICAgICAgIF0sCisgICAgICAgIHNjaGVtYT1ncmVldGVyX3NjaGVtYSwKKyAgICAgICAgY3dkPVBhdGgoZ3JwY19leGFtcGxlc19wYXRoLCAicHl0aG9uL2dyZWV0ZXIiKSwKKyAgICApCisKKyAgICBmbGF0YygKKyAgICAgICAgQ09NTU9OX0FSR1MKKyAgICAgICAgKyBbCisgICAgICAgICAgICAiLS1zd2lmdCIsCisgICAgICAgICAgICAiLS1nZW4tanNvbi1lbWl0IiwKKyAgICAgICAgXSwKKyAgICAgICAgc2NoZW1hPWdyZWV0ZXJfc2NoZW1hLAorICAgICAgICBjd2Q9UGF0aChncnBjX2V4YW1wbGVzX3BhdGgsICJzd2lmdC9HcmVldGVyL1NvdXJjZXMvTW9kZWwiKSwKKyAgICApCisKKyAgICBmbGF0YygKKyAgICAgICAgQ09NTU9OX0FSR1MKKyAgICAgICAgKyBbCisgICAgICAgICAgICAiLS10cyIsCisgICAgICAgIF0sCisgICAgICAgIHNjaGVtYT1ncmVldGVyX3NjaGVtYSwKKyAgICAgICAgY3dkPVBhdGgoZ3JwY19leGFtcGxlc19wYXRoLCAidHMvZ3JlZXRlci9zcmMiKSwKKyAgICApCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgR2VuZXJhdGVHUlBDRXhhbXBsZXMoKQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvc2NyaXB0cy91dGlsLnB5IGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvc2NyaXB0cy91dGlsLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM2NWJhMmQKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy9zY3JpcHRzL3V0aWwucHkKQEAgLTAsMCArMSw1MSBAQAorIyBDb3B5cmlnaHQgMjAyMiBHb29nbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitpbXBvcnQgcGxhdGZvcm0KK2ltcG9ydCBzdWJwcm9jZXNzCitmcm9tIHBhdGhsaWIgaW1wb3J0IFBhdGgKKworIyBHZXQgdGhlIHBhdGggd2hlcmUgdGhpcyBzY3JpcHQgaXMgbG9jYXRlZCBzbyB3ZSBjYW4gaW52b2tlIHRoZSBzY3JpcHQgZnJvbQorIyBhbnkgZGlyZWN0b3J5IGFuZCBoYXZlIHRoZSBwYXRocyB3b3JrIGNvcnJlY3RseS4KK3NjcmlwdF9wYXRoID0gUGF0aChfX2ZpbGVfXykucGFyZW50LnJlc29sdmUoKQorCisjIEdldCB0aGUgcm9vdCBwYXRoIGFzIGFuIGFic29sdXRlIHBhdGgsIHNvIGFsbCBkZXJpdmVkIHBhdGhzIGFyZSBhYnNvbHV0ZS4KK3Jvb3RfcGF0aCA9IHNjcmlwdF9wYXRoLnBhcmVudC5hYnNvbHV0ZSgpCisKKyMgR2V0IHRoZSBsb2NhdGlvbiBvZiB0aGUgZmxhdGMgZXhlY3V0YWJsZSwgcmVhZGluZyBmcm9tIHRoZSBmaXJzdCBjb21tYW5kIGxpbmUKKyMgYXJndW1lbnQgb3IgZGVmYXVsdGluZyB0byBkZWZhdWx0IG5hbWVzLgorZmxhdGNfZXhlID0gUGF0aCgiZmxhdGMiIGlmIG5vdCBwbGF0Zm9ybS5zeXN0ZW0oKSA9PSAiV2luZG93cyIgZWxzZSAiZmxhdGMuZXhlIikKKworIyBGaW5kIGFuZCBhc3NlcnQgZmxhdGMgY29tcGlsZXIgaXMgcHJlc2VudC4KK2lmIHJvb3RfcGF0aCBpbiBmbGF0Y19leGUucGFyZW50czoKKyAgICBmbGF0Y19leGUgPSBmbGF0Y19leGUucmVsYXRpdmVfdG8ocm9vdF9wYXRoKQorZmxhdGNfcGF0aCA9IFBhdGgocm9vdF9wYXRoLCBmbGF0Y19leGUpCithc3NlcnQgZmxhdGNfcGF0aC5leGlzdHMoKSwgIkNhbm5vdCBmaW5kIHRoZSBmbGF0YyBjb21waWxlciAiICsgc3RyKGZsYXRjX3BhdGgpCisKKyMgRXhlY3V0ZSB0aGUgZmxhdGMgY29tcGlsZXIgd2l0aCB0aGUgc3BlY2lmaWVkIHBhcmFtZXRlcnMKK2RlZiBmbGF0YyhvcHRpb25zLCBzY2hlbWEsIHByZWZpeD1Ob25lLCBpbmNsdWRlPU5vbmUsIGRhdGE9Tm9uZSwgY3dkPXJvb3RfcGF0aCk6CisgICAgY21kID0gW3N0cihmbGF0Y19wYXRoKV0gKyBvcHRpb25zCisgICAgaWYgcHJlZml4OgorICAgICAgICBjbWQgKz0gWyItbyJdICsgW3ByZWZpeF0KKyAgICBpZiBpbmNsdWRlOgorICAgICAgICBjbWQgKz0gWyItSSJdICsgW2luY2x1ZGVdCisgICAgaWYgaXNpbnN0YW5jZShzY2hlbWEsIFBhdGgpOgorICAgICAgY21kICs9IFtzdHIoc2NoZW1hKV0KKyAgICBlbGlmIGlzaW5zdGFuY2Uoc2NoZW1hLCBzdHIpOgorICAgICAgY21kICs9IFtzY2hlbWFdCisgICAgZWxzZToKKyAgICAgIGNtZCArPSBzY2hlbWEKKyAgICBpZiBkYXRhOgorICAgICAgICBjbWQgKz0gW2RhdGFdIGlmIGlzaW5zdGFuY2UoZGF0YSwgc3RyKSBlbHNlIGRhdGEKKyAgICByZXR1cm4gc3VicHJvY2Vzcy5jaGVja19jYWxsKGNtZCwgY3dkPXN0cihjd2QpKQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvc3JjL0JVSUxELmJhemVsIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvc3JjL0JVSUxELmJhemVsCmluZGV4IGQ4YmJmY2QuLmIwMTU1MWQgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3NyYy9CVUlMRC5iYXplbAorKysgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy9zcmMvQlVJTEQuYmF6ZWwKQEAgLTM0LDEwICszNCwxNiBAQAogY2NfbGlicmFyeSgKICAgICBuYW1lID0gImZsYXRjX2xpYnJhcnkiLAogICAgIHNyY3MgPSBbCisgICAgICAgICJhbm5vdGF0ZWRfYmluYXJ5X3RleHRfZ2VuLmNwcCIsCisgICAgICAgICJhbm5vdGF0ZWRfYmluYXJ5X3RleHRfZ2VuLmgiLAogICAgICAgICAiYmZic19nZW4uaCIsCiAgICAgICAgICJiZmJzX2dlbl9sdWEuY3BwIiwKICAgICAgICAgImJmYnNfZ2VuX2x1YS5oIiwKKyAgICAgICAgImJmYnNfbmFtZXIuaCIsCisgICAgICAgICJiaW5hcnlfYW5ub3RhdG9yLmNwcCIsCisgICAgICAgICJiaW5hcnlfYW5ub3RhdG9yLmgiLAogICAgICAgICAiZmxhdGMuY3BwIiwKKyAgICAgICAgIm5hbWVyLmgiLAogICAgIF0sCiAgICAgaGRycyA9IFsKICAgICAgICAgIi8vOmZsYXRjX2hlYWRlcnMiLApAQCAtNTYsNiArNjIsNyBAQAogICAgICAgICAiYmZic19nZW4uaCIsCiAgICAgICAgICJiZmJzX2dlbl9sdWEuY3BwIiwKICAgICAgICAgImJmYnNfZ2VuX2x1YS5oIiwKKyAgICAgICAgImJmYnNfbmFtZXIuaCIsCiAgICAgICAgICJmbGF0Y19tYWluLmNwcCIsCiAgICAgICAgICJpZGxfZ2VuX2NwcC5jcHAiLAogICAgICAgICAiaWRsX2dlbl9jc2hhcnAuY3BwIiwKQEAgLTczLDYgKzgwLDcgQEAKICAgICAgICAgImlkbF9nZW5fc3dpZnQuY3BwIiwKICAgICAgICAgImlkbF9nZW5fdGV4dC5jcHAiLAogICAgICAgICAiaWRsX2dlbl90cy5jcHAiLAorICAgICAgICAiaWRsX25hbWVyLmgiLAogICAgICAgICAibmFtZXIuaCIsCiAgICAgICAgICJ1dGlsLmNwcCIsCiAgICAgXSwKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3NyYy9hbm5vdGF0ZWRfYmluYXJ5X3RleHRfZ2VuLmNwcCBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3NyYy9hbm5vdGF0ZWRfYmluYXJ5X3RleHRfZ2VuLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYzMwYjFkCi0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvc3JjL2Fubm90YXRlZF9iaW5hcnlfdGV4dF9nZW4uY3BwCkBAIC0wLDAgKzEsNDM5IEBACisjaW5jbHVkZSAiYW5ub3RhdGVkX2JpbmFyeV90ZXh0X2dlbi5oIgorCisjaW5jbHVkZSA8c3N0cmVhbT4KKyNpbmNsdWRlIDxzdHJpbmc+CisKKyNpbmNsdWRlICJiaW5hcnlfYW5ub3RhdG9yLmgiCisjaW5jbHVkZSAiZmxhdGJ1ZmZlcnMvYmFzZS5oIgorI2luY2x1ZGUgImZsYXRidWZmZXJzL3V0aWwuaCIKKworbmFtZXNwYWNlIGZsYXRidWZmZXJzIHsKK25hbWVzcGFjZSB7CisKK3N0cnVjdCBPdXRwdXRDb25maWcgeworICBzaXplX3QgbGFyZ2VzdF90eXBlX3N0cmluZyA9IDEwOworCisgIHNpemVfdCBsYXJnZXN0X3ZhbHVlX3N0cmluZyA9IDIwOworCisgIHNpemVfdCBtYXhfYnl0ZXNfcGVyX2xpbmUgPSA4OworCisgIHNpemVfdCBvZmZzZXRfbWF4X2NoYXIgPSA0OworCisgIGNoYXIgZGVsaW1pdGVyID0gJ3wnOworfTsKKworc3RhdGljIHN0ZDo6c3RyaW5nIFRvU3RyaW5nKGNvbnN0IEJpbmFyeVNlY3Rpb25UeXBlIHR5cGUpIHsKKyAgc3dpdGNoICh0eXBlKSB7CisgICAgY2FzZSBCaW5hcnlTZWN0aW9uVHlwZTo6SGVhZGVyOiByZXR1cm4gImhlYWRlciI7CisgICAgY2FzZSBCaW5hcnlTZWN0aW9uVHlwZTo6VGFibGU6IHJldHVybiAidGFibGUiOworICAgIGNhc2UgQmluYXJ5U2VjdGlvblR5cGU6OlJvb3RUYWJsZTogcmV0dXJuICJyb290X3RhYmxlIjsKKyAgICBjYXNlIEJpbmFyeVNlY3Rpb25UeXBlOjpWVGFibGU6IHJldHVybiAidnRhYmxlIjsKKyAgICBjYXNlIEJpbmFyeVNlY3Rpb25UeXBlOjpTdHJ1Y3Q6IHJldHVybiAic3RydWN0IjsKKyAgICBjYXNlIEJpbmFyeVNlY3Rpb25UeXBlOjpTdHJpbmc6IHJldHVybiAic3RyaW5nIjsKKyAgICBjYXNlIEJpbmFyeVNlY3Rpb25UeXBlOjpWZWN0b3I6IHJldHVybiAidmVjdG9yIjsKKyAgICBjYXNlIEJpbmFyeVNlY3Rpb25UeXBlOjpVbmtub3duOiByZXR1cm4gInVua25vd24iOworICAgIGNhc2UgQmluYXJ5U2VjdGlvblR5cGU6OlVuaW9uOiByZXR1cm4gInVuaW9uIjsKKyAgICBjYXNlIEJpbmFyeVNlY3Rpb25UeXBlOjpQYWRkaW5nOiByZXR1cm4gInBhZGRpbmciOworICAgIGRlZmF1bHQ6IHJldHVybiAidG9kbyI7CisgIH0KK30KKworc3RhdGljIGJvb2wgSXNPZmZzZXQoY29uc3QgQmluYXJ5UmVnaW9uVHlwZSB0eXBlKSB7CisgIHJldHVybiB0eXBlID09IEJpbmFyeVJlZ2lvblR5cGU6OlVPZmZzZXQgfHwgdHlwZSA9PSBCaW5hcnlSZWdpb25UeXBlOjpTT2Zmc2V0OworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBzdGQ6OnN0cmluZyBUb1N0cmluZyhUIHZhbHVlKSB7CisgIGlmIChzdGQ6OmlzX2Zsb2F0aW5nX3BvaW50PFQ+Ojp2YWx1ZSkgeworICAgIHN0ZDo6c3RyaW5nc3RyZWFtIHNzOworICAgIHNzIDw8IHZhbHVlOworICAgIHJldHVybiBzcy5zdHIoKTsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gc3RkOjp0b19zdHJpbmcodmFsdWUpOworICB9Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitzdGQ6OnN0cmluZyBUb1ZhbHVlU3RyaW5nKGNvbnN0IEJpbmFyeVJlZ2lvbiAmcmVnaW9uLCBjb25zdCB1aW50OF90ICpiaW5hcnkpIHsKKyAgc3RkOjpzdHJpbmcgczsKKyAgcyArPSAiMHgiOworICBjb25zdCBUIHZhbCA9IFJlYWRTY2FsYXI8VD4oYmluYXJ5ICsgcmVnaW9uLm9mZnNldCk7CisgIGNvbnN0IHVpbnQ2NF90IHN0YXJ0X2luZGV4ID0gcmVnaW9uLm9mZnNldCArIHJlZ2lvbi5sZW5ndGggLSAxOworICBmb3IgKHVpbnQ2NF90IGkgPSAwOyBpIDwgcmVnaW9uLmxlbmd0aDsgKytpKSB7CisgICAgcyArPSBUb0hleChiaW5hcnlbc3RhcnRfaW5kZXggLSBpXSk7CisgIH0KKyAgcyArPSAiICgiOworICBzICs9IFRvU3RyaW5nKHZhbCk7CisgIHMgKz0gIikiOworICByZXR1cm4gczsKK30KKwordGVtcGxhdGU8Pgorc3RkOjpzdHJpbmcgVG9WYWx1ZVN0cmluZzxzdGQ6OnN0cmluZz4oY29uc3QgQmluYXJ5UmVnaW9uICZyZWdpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpiaW5hcnkpIHsKKyAgcmV0dXJuIHN0ZDo6c3RyaW5nKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhciAqPihiaW5hcnkgKyByZWdpb24ub2Zmc2V0KSwKKyAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PHNpemVfdD4ocmVnaW9uLmFycmF5X2xlbmd0aCkpOworfQorCitzdGF0aWMgc3RkOjpzdHJpbmcgVG9WYWx1ZVN0cmluZyhjb25zdCBCaW5hcnlSZWdpb24gJnJlZ2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmJpbmFyeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE91dHB1dENvbmZpZyAmb3V0cHV0X2NvbmZpZykgeworICBzdGQ6OnN0cmluZyBzOworCisgIGlmIChyZWdpb24uYXJyYXlfbGVuZ3RoKSB7CisgICAgaWYgKHJlZ2lvbi50eXBlID09IEJpbmFyeVJlZ2lvblR5cGU6OlVpbnQ4IHx8CisgICAgICAgIHJlZ2lvbi50eXBlID09IEJpbmFyeVJlZ2lvblR5cGU6OlVua25vd24pIHsKKyAgICAgIC8vIEludGVycGV0IGVhY2ggdmFsdWUgYXMgYSBBU0NJSSB0byBhaWQgZGVidWdnaW5nCisgICAgICBmb3IgKHVpbnQ2NF90IGkgPSAwOyBpIDwgcmVnaW9uLmFycmF5X2xlbmd0aDsgKytpKSB7CisgICAgICAgIGNvbnN0IHVpbnQ4X3QgYyA9ICooYmluYXJ5ICsgcmVnaW9uLm9mZnNldCArIGkpOworICAgICAgICBzICs9IGlzcHJpbnQoYykgPyBzdGF0aWNfY2FzdDxjaGFyPihjICYgMHg3RikgOiAnLic7CisgICAgICB9CisgICAgICByZXR1cm4gczsKKyAgICB9IGVsc2UgaWYgKHJlZ2lvbi50eXBlID09IEJpbmFyeVJlZ2lvblR5cGU6OkNoYXIpIHsKKyAgICAgIC8vIHN0cmluZyB2YWx1ZQorICAgICAgcmV0dXJuIFRvVmFsdWVTdHJpbmc8c3RkOjpzdHJpbmc+KHJlZ2lvbiwgYmluYXJ5KTsKKyAgICB9CisgIH0KKworICBzd2l0Y2ggKHJlZ2lvbi50eXBlKSB7CisgICAgY2FzZSBCaW5hcnlSZWdpb25UeXBlOjpVaW50MzI6CisgICAgICByZXR1cm4gVG9WYWx1ZVN0cmluZzx1aW50MzJfdD4ocmVnaW9uLCBiaW5hcnkpOworICAgIGNhc2UgQmluYXJ5UmVnaW9uVHlwZTo6SW50MzI6IHJldHVybiBUb1ZhbHVlU3RyaW5nPGludDMyX3Q+KHJlZ2lvbiwgYmluYXJ5KTsKKyAgICBjYXNlIEJpbmFyeVJlZ2lvblR5cGU6OlVpbnQxNjoKKyAgICAgIHJldHVybiBUb1ZhbHVlU3RyaW5nPHVpbnQxNl90PihyZWdpb24sIGJpbmFyeSk7CisgICAgY2FzZSBCaW5hcnlSZWdpb25UeXBlOjpJbnQxNjogcmV0dXJuIFRvVmFsdWVTdHJpbmc8aW50MTZfdD4ocmVnaW9uLCBiaW5hcnkpOworICAgIGNhc2UgQmluYXJ5UmVnaW9uVHlwZTo6Qm9vbDogcmV0dXJuIFRvVmFsdWVTdHJpbmc8Ym9vbD4ocmVnaW9uLCBiaW5hcnkpOworICAgIGNhc2UgQmluYXJ5UmVnaW9uVHlwZTo6VWludDg6IHJldHVybiBUb1ZhbHVlU3RyaW5nPHVpbnQ4X3Q+KHJlZ2lvbiwgYmluYXJ5KTsKKyAgICBjYXNlIEJpbmFyeVJlZ2lvblR5cGU6OkNoYXI6IHJldHVybiBUb1ZhbHVlU3RyaW5nPGNoYXI+KHJlZ2lvbiwgYmluYXJ5KTsKKyAgICBjYXNlIEJpbmFyeVJlZ2lvblR5cGU6OkJ5dGU6CisgICAgY2FzZSBCaW5hcnlSZWdpb25UeXBlOjpJbnQ4OiByZXR1cm4gVG9WYWx1ZVN0cmluZzxpbnQ4X3Q+KHJlZ2lvbiwgYmluYXJ5KTsKKyAgICBjYXNlIEJpbmFyeVJlZ2lvblR5cGU6OkludDY0OiByZXR1cm4gVG9WYWx1ZVN0cmluZzxpbnQ2NF90PihyZWdpb24sIGJpbmFyeSk7CisgICAgY2FzZSBCaW5hcnlSZWdpb25UeXBlOjpVaW50NjQ6CisgICAgICByZXR1cm4gVG9WYWx1ZVN0cmluZzx1aW50NjRfdD4ocmVnaW9uLCBiaW5hcnkpOworICAgIGNhc2UgQmluYXJ5UmVnaW9uVHlwZTo6RG91YmxlOiByZXR1cm4gVG9WYWx1ZVN0cmluZzxkb3VibGU+KHJlZ2lvbiwgYmluYXJ5KTsKKyAgICBjYXNlIEJpbmFyeVJlZ2lvblR5cGU6OkZsb2F0OiByZXR1cm4gVG9WYWx1ZVN0cmluZzxmbG9hdD4ocmVnaW9uLCBiaW5hcnkpOworICAgIGNhc2UgQmluYXJ5UmVnaW9uVHlwZTo6VVR5cGU6IHJldHVybiBUb1ZhbHVlU3RyaW5nPHVpbnQ4X3Q+KHJlZ2lvbiwgYmluYXJ5KTsKKworICAgIC8vIEhhbmRsZSBPZmZzZXRzIHNlcGFyYXRlbHksIGluY2FzZSB0aGV5IGFkZCBhZGRpdGlvbmFsIGRldGFpbHMuCisgICAgY2FzZSBCaW5hcnlSZWdpb25UeXBlOjpVT2Zmc2V0OgorICAgICAgcyArPSBUb1ZhbHVlU3RyaW5nPHVpbnQzMl90PihyZWdpb24sIGJpbmFyeSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEJpbmFyeVJlZ2lvblR5cGU6OlNPZmZzZXQ6CisgICAgICBzICs9IFRvVmFsdWVTdHJpbmc8aW50MzJfdD4ocmVnaW9uLCBiaW5hcnkpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBCaW5hcnlSZWdpb25UeXBlOjpWT2Zmc2V0OgorICAgICAgcyArPSBUb1ZhbHVlU3RyaW5nPHVpbnQxNl90PihyZWdpb24sIGJpbmFyeSk7CisgICAgICBicmVhazsKKworICAgIGRlZmF1bHQ6IGJyZWFrOworICB9CisgIC8vIElmIHRoaXMgaXMgYW4gb2Zmc2V0IHR5cGUsIGluY2x1ZGUgdGhlIGNhbGN1bGF0ZWQgb2Zmc2V0IGxvY2F0aW9uIGluIHRoZQorICAvLyB2YWx1ZS4KKyAgLy8gVE9ETyhkYmFpbGV5Y2hlc3MpOiBJdCBtaWdodCBiZSBuaWNlciB0byBwdXQgdGhpcyBpbiB0aGUgY29tbWVudCBmaWVsZC4KKyAgaWYgKElzT2Zmc2V0KHJlZ2lvbi50eXBlKSkgeworICAgIHMgKz0gIiBMb2M6ICsweCI7CisgICAgcyArPSBUb0hleChyZWdpb24ucG9pbnRzX3RvX29mZnNldCwgb3V0cHV0X2NvbmZpZy5vZmZzZXRfbWF4X2NoYXIpOworICB9CisgIHJldHVybiBzOworfQorCitzdHJ1Y3QgRG9jQ29udGludWF0aW9uIHsKKyAgLy8gVGhlIHN0YXJ0IGNvbHVtbiB3aGVyZSB0aGUgdmFsdWUgdGV4dCBmaXJzdCBzdGFydHMKKyAgc2l6ZV90IHZhbHVlX3N0YXJ0X2NvbHVtbiA9IDA7CisKKyAgLy8gVGhlIHJlbWFpbmluZyBwYXJ0IG9mIHRoZSBkb2MgdG8gcHJpbnQuCisgIHN0ZDo6c3RyaW5nIHZhbHVlOworfTsKKworc3RhdGljIHN0ZDo6c3RyaW5nIEdlbmVyYXRlVHlwZVN0cmluZyhjb25zdCBCaW5hcnlSZWdpb24gJnJlZ2lvbikgeworICByZXR1cm4gVG9TdHJpbmcocmVnaW9uLnR5cGUpICsKKyAgICAgICAgICgocmVnaW9uLmFycmF5X2xlbmd0aCkKKyAgICAgICAgICAgICAgPyAiWyIgKyBzdGQ6OnRvX3N0cmluZyhyZWdpb24uYXJyYXlfbGVuZ3RoKSArICJdIgorICAgICAgICAgICAgICA6ICIiKTsKK30KKworc3RhdGljIHN0ZDo6c3RyaW5nIEdlbmVyYXRlQ29tbWVudChjb25zdCBCaW5hcnlSZWdpb25Db21tZW50ICZjb21tZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBCaW5hcnlTZWN0aW9uICYpIHsKKyAgc3RkOjpzdHJpbmcgczsKKyAgc3dpdGNoIChjb21tZW50LnR5cGUpIHsKKyAgICBjYXNlIEJpbmFyeVJlZ2lvbkNvbW1lbnRUeXBlOjpVbmtub3duOiBzID0gInVua25vd24iOyBicmVhazsKKyAgICBjYXNlIEJpbmFyeVJlZ2lvbkNvbW1lbnRUeXBlOjpTaXplUHJlZml4OiBzID0gInNpemUgcHJlZml4IjsgYnJlYWs7CisgICAgY2FzZSBCaW5hcnlSZWdpb25Db21tZW50VHlwZTo6Um9vdFRhYmxlT2Zmc2V0OgorICAgICAgcyA9ICJvZmZzZXQgdG8gcm9vdCB0YWJsZSBgIiArIGNvbW1lbnQubmFtZSArICJgIjsKKyAgICAgIGJyZWFrOworICAgIC8vIFRPRE8oZGJhaWxleWNoZXNzKTogbWFrZSB0aGlzIGxvd2VyY2FzZSB0byBmb2xsb3cgdGhlIGNvbnZlbnRpb24uCisgICAgY2FzZSBCaW5hcnlSZWdpb25Db21tZW50VHlwZTo6RmlsZUlkZW50aWZpZXI6IHMgPSAiRmlsZSBJZGVudGlmaWVyIjsgYnJlYWs7CisgICAgY2FzZSBCaW5hcnlSZWdpb25Db21tZW50VHlwZTo6UGFkZGluZzogcyA9ICJwYWRkaW5nIjsgYnJlYWs7CisgICAgY2FzZSBCaW5hcnlSZWdpb25Db21tZW50VHlwZTo6VlRhYmxlU2l6ZTogcyA9ICJzaXplIG9mIHRoaXMgdnRhYmxlIjsgYnJlYWs7CisgICAgY2FzZSBCaW5hcnlSZWdpb25Db21tZW50VHlwZTo6VlRhYmxlUmVmZmVyaW5nVGFibGVMZW5ndGg6CisgICAgICBzID0gInNpemUgb2YgcmVmZXJyaW5nIHRhYmxlIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgQmluYXJ5UmVnaW9uQ29tbWVudFR5cGU6OlZUYWJsZUZpZWxkT2Zmc2V0OgorICAgICAgcyA9ICJvZmZzZXQgdG8gZmllbGQgYCIgKyBjb21tZW50Lm5hbWU7CisgICAgICBicmVhazsKKyAgICBjYXNlIEJpbmFyeVJlZ2lvbkNvbW1lbnRUeXBlOjpWVGFibGVVbmtub3duRmllbGRPZmZzZXQ6CisgICAgICBzID0gIm9mZnNldCB0byB1bmtub3duIGZpZWxkIChpZDogIiArIHN0ZDo6dG9fc3RyaW5nKGNvbW1lbnQuaW5kZXgpICsgIikiOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEJpbmFyeVJlZ2lvbkNvbW1lbnRUeXBlOjpUYWJsZVZUYWJsZU9mZnNldDoKKyAgICAgIHMgPSAib2Zmc2V0IHRvIHZ0YWJsZSI7CisgICAgICBicmVhazsKKyAgICBjYXNlIEJpbmFyeVJlZ2lvbkNvbW1lbnRUeXBlOjpUYWJsZUZpZWxkOgorICAgICAgcyA9ICJ0YWJsZSBmaWVsZCBgIiArIGNvbW1lbnQubmFtZTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgQmluYXJ5UmVnaW9uQ29tbWVudFR5cGU6OlRhYmxlVW5rbm93bkZpZWxkOiBzID0gInVua25vd24gZmllbGQiOyBicmVhazsKKyAgICBjYXNlIEJpbmFyeVJlZ2lvbkNvbW1lbnRUeXBlOjpUYWJsZU9mZnNldEZpZWxkOgorICAgICAgcyA9ICJvZmZzZXQgdG8gZmllbGQgYCIgKyBjb21tZW50Lm5hbWUgKyAiYCI7CisgICAgICBicmVhazsKKyAgICBjYXNlIEJpbmFyeVJlZ2lvbkNvbW1lbnRUeXBlOjpTdHJ1Y3RGaWVsZDoKKyAgICAgIHMgPSAic3RydWN0IGZpZWxkIGAiICsgY29tbWVudC5uYW1lICsgImAiOworICAgICAgYnJlYWs7CisgICAgY2FzZSBCaW5hcnlSZWdpb25Db21tZW50VHlwZTo6QXJyYXlGaWVsZDoKKyAgICAgIHMgPSAiYXJyYXkgZmllbGQgYCIgKyBjb21tZW50Lm5hbWUgKyAiYFsiICsKKyAgICAgICAgICBzdGQ6OnRvX3N0cmluZyhjb21tZW50LmluZGV4KSArICJdIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgQmluYXJ5UmVnaW9uQ29tbWVudFR5cGU6OlN0cmluZ0xlbmd0aDogcyA9ICJsZW5ndGggb2Ygc3RyaW5nIjsgYnJlYWs7CisgICAgY2FzZSBCaW5hcnlSZWdpb25Db21tZW50VHlwZTo6U3RyaW5nVmFsdWU6IHMgPSAic3RyaW5nIGxpdGVyYWwiOyBicmVhazsKKyAgICBjYXNlIEJpbmFyeVJlZ2lvbkNvbW1lbnRUeXBlOjpTdHJpbmdUZXJtaW5hdG9yOgorICAgICAgcyA9ICJzdHJpbmcgdGVybWluYXRvciI7CisgICAgICBicmVhazsKKyAgICBjYXNlIEJpbmFyeVJlZ2lvbkNvbW1lbnRUeXBlOjpWZWN0b3JMZW5ndGg6CisgICAgICBzID0gImxlbmd0aCBvZiB2ZWN0b3IgKCMgaXRlbXMpIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgQmluYXJ5UmVnaW9uQ29tbWVudFR5cGU6OlZlY3RvclZhbHVlOgorICAgICAgcyA9ICJ2YWx1ZVsiICsgc3RkOjp0b19zdHJpbmcoY29tbWVudC5pbmRleCkgKyAiXSI7CisgICAgICBicmVhazsKKyAgICBjYXNlIEJpbmFyeVJlZ2lvbkNvbW1lbnRUeXBlOjpWZWN0b3JUYWJsZVZhbHVlOgorICAgICAgcyA9ICJvZmZzZXQgdG8gdGFibGVbIiArIHN0ZDo6dG9fc3RyaW5nKGNvbW1lbnQuaW5kZXgpICsgIl0iOworICAgICAgYnJlYWs7CisgICAgY2FzZSBCaW5hcnlSZWdpb25Db21tZW50VHlwZTo6VmVjdG9yU3RyaW5nVmFsdWU6CisgICAgICBzID0gIm9mZnNldCB0byBzdHJpbmdbIiArIHN0ZDo6dG9fc3RyaW5nKGNvbW1lbnQuaW5kZXgpICsgIl0iOworICAgICAgYnJlYWs7CisgICAgY2FzZSBCaW5hcnlSZWdpb25Db21tZW50VHlwZTo6VmVjdG9yVW5pb25WYWx1ZToKKyAgICAgIHMgPSAib2Zmc2V0IHRvIHVuaW9uWyIgKyBzdGQ6OnRvX3N0cmluZyhjb21tZW50LmluZGV4KSArICJdIjsKKyAgICAgIGJyZWFrOworCisgICAgZGVmYXVsdDogYnJlYWs7CisgIH0KKyAgaWYgKCFjb21tZW50LmRlZmF1bHRfdmFsdWUuZW1wdHkoKSkgeyBzICs9ICIgIiArIGNvbW1lbnQuZGVmYXVsdF92YWx1ZTsgfQorCisgIHN3aXRjaCAoY29tbWVudC5zdGF0dXMpIHsKKyAgICBjYXNlIEJpbmFyeVJlZ2lvblN0YXR1czo6T0s6IGJyZWFrOyAgLy8gbm8tb3AKKyAgICBjYXNlIEJpbmFyeVJlZ2lvblN0YXR1czo6V0FSTjogcyA9ICJXQVJOOiAiICsgczsgYnJlYWs7CisgICAgY2FzZSBCaW5hcnlSZWdpb25TdGF0dXM6OldBUk5fTk9fUkVGRVJFTkNFUzoKKyAgICAgIHMgPSAiV0FSTjogbm90aGluZyByZWZlcnMgdG8gdGhpcyBzZWN0aW9uLiI7CisgICAgICBicmVhazsKKyAgICBjYXNlIEJpbmFyeVJlZ2lvblN0YXR1czo6V0FSTl9DT1JSVVBURURfUEFERElORzoKKyAgICAgIHMgPSAiV0FSTjogY291bGQgYmUgY29ycnVwdGVkIHBhZGRpbmcgcmVnaW9uLiI7CisgICAgICBicmVhazsKKyAgICBjYXNlIEJpbmFyeVJlZ2lvblN0YXR1czo6V0FSTl9QQURESU5HX0xFTkdUSDoKKyAgICAgIHMgPSAiV0FSTjogcGFkZGluZyBpcyBsb25nZXIgdGhhbiBleHBlY3RlZC4iOworICAgICAgYnJlYWs7CisgICAgY2FzZSBCaW5hcnlSZWdpb25TdGF0dXM6OkVSUk9SOiBzID0gIkVSUk9SOiAiICsgczsgYnJlYWs7CisgICAgY2FzZSBCaW5hcnlSZWdpb25TdGF0dXM6OkVSUk9SX09GRlNFVF9PVVRfT0ZfQklOQVJZOgorICAgICAgcyA9ICJFUlJPUjogIiArIHMgKyAiLiBJbnZhbGlkIG9mZnNldCwgcG9pbnRzIG91dHNpZGUgdGhlIGJpbmFyeS4iOworICAgICAgYnJlYWs7CisgICAgY2FzZSBCaW5hcnlSZWdpb25TdGF0dXM6OkVSUk9SX0lOQ09NUExFVEVfQklOQVJZOgorICAgICAgcyA9ICJFUlJPUjogIiArIHMgKyAiLiBJbmNvbXBsZXRlIGJpbmFyeSwgZXhwZWN0ZWQgdG8gcmVhZCAiICsKKyAgICAgICAgICBjb21tZW50LnN0YXR1c19tZXNzYWdlICsgIiBieXRlcy4iOworICAgICAgYnJlYWs7CisgICAgY2FzZSBCaW5hcnlSZWdpb25TdGF0dXM6OkVSUk9SX0xFTkdUSF9UT09fTE9ORzoKKyAgICAgIHMgPSAiRVJST1I6ICIgKyBzICsgIi4gTG9uZ2VyIHRoYW4gdGhlIGJpbmFyeS4iOworICAgICAgYnJlYWs7CisgICAgY2FzZSBCaW5hcnlSZWdpb25TdGF0dXM6OkVSUk9SX0xFTkdUSF9UT09fU0hPUlQ6CisgICAgICBzID0gIkVSUk9SOiAiICsgcyArICIuIFNob3J0ZXIgdGhhbiB0aGUgbWluaW11bSBsZW5ndGg6ICI7CisgICAgICBicmVhazsKKyAgICBjYXNlIEJpbmFyeVJlZ2lvblN0YXR1czo6RVJST1JfUkVRVUlSRURfRklFTERfTk9UX1BSRVNFTlQ6CisgICAgICBzID0gIkVSUk9SOiAiICsgcyArICIuIFJlcXVpcmVkIGZpZWxkIGlzIG5vdCBwcmVzZW50LiI7CisgICAgICBicmVhazsKKyAgICBjYXNlIEJpbmFyeVJlZ2lvblN0YXR1czo6RVJST1JfSU5WQUxJRF9VTklPTl9UWVBFOgorICAgICAgcyA9ICJFUlJPUjogIiArIHMgKyAiLiBJbnZhbGlkIHVuaW9uIHR5cGUgdmFsdWUuIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgQmluYXJ5UmVnaW9uU3RhdHVzOjpFUlJPUl9DWUNMRV9ERVRFQ1RFRDoKKyAgICAgIHMgPSAiRVJST1I6ICIgKyBzICsgIi4gSW52YWxpZCBvZmZzZXQsIGN5Y2xlIGRldGVjdGVkLiI7CisgICAgICBicmVhazsKKyAgfQorCisgIHJldHVybiBzOworfQorCitzdGF0aWMgc3RkOjpzdHJpbmcgR2VuZXJhdGVEb2N1bWVudGF0aW9uKGNvbnN0IEJpbmFyeVJlZ2lvbiAmcmVnaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBCaW5hcnlTZWN0aW9uICZzZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpiaW5hcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERvY0NvbnRpbnVhdGlvbiAmY29udGludWF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBPdXRwdXRDb25maWcgJm91dHB1dF9jb25maWcpIHsKKyAgc3RkOjpzdHJpbmcgczsKKworICAvLyBDaGVjayBpZiB0aGVyZSBpcyBhIGRvYyBjb250aW51YXRpb24gdGhhdCBzaG91bGQgYmUgcHJpb3JpdGl6ZWQuCisgIGlmIChjb250aW51YXRpb24udmFsdWVfc3RhcnRfY29sdW1uKSB7CisgICAgcyArPSBzdGQ6OnN0cmluZyhjb250aW51YXRpb24udmFsdWVfc3RhcnRfY29sdW1uIC0gMiwgJyAnKTsKKyAgICBzICs9IG91dHB1dF9jb25maWcuZGVsaW1pdGVyOworICAgIHMgKz0gIiAiOworCisgICAgcyArPSBjb250aW51YXRpb24udmFsdWUuc3Vic3RyKDAsIG91dHB1dF9jb25maWcubWF4X2J5dGVzX3Blcl9saW5lKTsKKyAgICBjb250aW51YXRpb24udmFsdWUgPSBjb250aW51YXRpb24udmFsdWUuc3Vic3RyKAorICAgICAgICBzdGQ6Om1pbihvdXRwdXRfY29uZmlnLm1heF9ieXRlc19wZXJfbGluZSwgY29udGludWF0aW9uLnZhbHVlLnNpemUoKSkpOworICAgIHJldHVybiBzOworICB9CisKKyAgeworICAgIHN0ZDo6c3RyaW5nc3RyZWFtIHNzOworICAgIHNzIDw8IHN0ZDo6c2V0dyhvdXRwdXRfY29uZmlnLmxhcmdlc3RfdHlwZV9zdHJpbmcpIDw8IHN0ZDo6bGVmdDsKKyAgICBzcyA8PCBHZW5lcmF0ZVR5cGVTdHJpbmcocmVnaW9uKTsKKyAgICBzICs9IHNzLnN0cigpOworICB9CisgIHMgKz0gIiAiOworICBzICs9IG91dHB1dF9jb25maWcuZGVsaW1pdGVyOworICBzICs9ICIgIjsKKyAgaWYgKHJlZ2lvbi5hcnJheV9sZW5ndGgpIHsKKyAgICAvLyBSZWNvcmQgd2hlcmUgdGhlIHZhbHVlIGlzIGZpcnN0IGJlaW5nIG91dHB1dHRlZC4KKyAgICBjb250aW51YXRpb24udmFsdWVfc3RhcnRfY29sdW1uID0gcy5zaXplKCk7CisKKyAgICAvLyBHZXQgdGhlIGZ1bGwtbGVuZ3RoIHZhbHVlLCB3aGljaCB3ZSB3aWxsIGNodW5rIGJlbG93LgorICAgIGNvbnN0IHN0ZDo6c3RyaW5nIHZhbHVlID0gVG9WYWx1ZVN0cmluZyhyZWdpb24sIGJpbmFyeSwgb3V0cHV0X2NvbmZpZyk7CisKKyAgICBzdGQ6OnN0cmluZ3N0cmVhbSBzczsKKyAgICBzcyA8PCBzdGQ6OnNldHcob3V0cHV0X2NvbmZpZy5sYXJnZXN0X3ZhbHVlX3N0cmluZykgPDwgc3RkOjpsZWZ0OworICAgIHNzIDw8IHZhbHVlLnN1YnN0cigwLCBvdXRwdXRfY29uZmlnLm1heF9ieXRlc19wZXJfbGluZSk7CisgICAgcyArPSBzcy5zdHIoKTsKKworICAgIGNvbnRpbnVhdGlvbi52YWx1ZSA9CisgICAgICAgIHZhbHVlLnN1YnN0cihzdGQ6Om1pbihvdXRwdXRfY29uZmlnLm1heF9ieXRlc19wZXJfbGluZSwgdmFsdWUuc2l6ZSgpKSk7CisgIH0gZWxzZSB7CisgICAgc3RkOjpzdHJpbmdzdHJlYW0gc3M7CisgICAgc3MgPDwgc3RkOjpzZXR3KG91dHB1dF9jb25maWcubGFyZ2VzdF92YWx1ZV9zdHJpbmcpIDw8IHN0ZDo6bGVmdDsKKyAgICBzcyA8PCBUb1ZhbHVlU3RyaW5nKHJlZ2lvbiwgYmluYXJ5LCBvdXRwdXRfY29uZmlnKTsKKyAgICBzICs9IHNzLnN0cigpOworICB9CisKKyAgcyArPSAiICI7CisgIHMgKz0gb3V0cHV0X2NvbmZpZy5kZWxpbWl0ZXI7CisgIHMgKz0gIiAiOworICBzICs9IEdlbmVyYXRlQ29tbWVudChyZWdpb24uY29tbWVudCwgc2VjdGlvbik7CisKKyAgcmV0dXJuIHM7Cit9CisKK3N0YXRpYyBzdGQ6OnN0cmluZyBHZW5lcmF0ZVJlZ2lvbihjb25zdCBCaW5hcnlSZWdpb24gJnJlZ2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBCaW5hcnlTZWN0aW9uICZzZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmJpbmFyeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBPdXRwdXRDb25maWcgJm91dHB1dF9jb25maWcpIHsKKyAgc3RkOjpzdHJpbmcgczsKKyAgYm9vbCBkb2NfZ2VuZXJhdGVkID0gZmFsc2U7CisgIERvY0NvbnRpbnVhdGlvbiBkb2NfY29udGludWF0aW9uOworICBmb3IgKHVpbnQ2NF90IGkgPSAwOyBpIDwgcmVnaW9uLmxlbmd0aDsgKytpKSB7CisgICAgaWYgKChpICUgb3V0cHV0X2NvbmZpZy5tYXhfYnl0ZXNfcGVyX2xpbmUpID09IDApIHsKKyAgICAgIC8vIFN0YXJ0IGEgbmV3IGxpbmUgb2Ygb3V0cHV0CisgICAgICBzICs9ICdcbic7CisgICAgICBzICs9ICIgICI7CisgICAgICBzICs9ICIrMHgiOworICAgICAgcyArPSBUb0hleChyZWdpb24ub2Zmc2V0ICsgaSwgb3V0cHV0X2NvbmZpZy5vZmZzZXRfbWF4X2NoYXIpOworICAgICAgcyArPSAiICI7CisgICAgICBzICs9IG91dHB1dF9jb25maWcuZGVsaW1pdGVyOworICAgIH0KKworICAgIC8vIEFkZCBlYWNoIGJ5dGUKKyAgICBzICs9ICIgIjsKKyAgICBzICs9IFRvSGV4KGJpbmFyeVtyZWdpb24ub2Zmc2V0ICsgaV0pOworCisgICAgLy8gQ2hlY2sgZm9yIGVuZCBvZiBsaW5lIG9yIGVuZCBvZiByZWdpb24gY29uZGl0aW9ucy4KKyAgICBpZiAoKChpICsgMSkgJSBvdXRwdXRfY29uZmlnLm1heF9ieXRlc19wZXJfbGluZSA9PSAwKSB8fAorICAgICAgICBpICsgMSA9PSByZWdpb24ubGVuZ3RoKSB7CisgICAgICBpZiAoaSArIDEgPT0gcmVnaW9uLmxlbmd0aCkgeworICAgICAgICAvLyBXZSBhcmUgb3V0IG9mIGJ5dGVzIGJ1dCBoYXZlbid0IHRoZSBrTWF4Qnl0ZXNQZXJMaW5lLCBzbyB3ZSBuZWVkIHRvCisgICAgICAgIC8vIHplcm8gdGhvc2Ugb3V0IHRvIGFsaWduIGV2ZXJ5dGhpbmcgZ2xvYmFsbHkuCisgICAgICAgIGZvciAodWludDY0X3QgaiA9IGkgKyAxOyAoaiAlIG91dHB1dF9jb25maWcubWF4X2J5dGVzX3Blcl9saW5lKSAhPSAwOworICAgICAgICAgICAgICsraikgeworICAgICAgICAgIHMgKz0gIiAgICI7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIHMgKz0gIiAiOworICAgICAgcyArPSBvdXRwdXRfY29uZmlnLmRlbGltaXRlcjsKKyAgICAgIC8vIFRoaXMgaXMgdGhlIGVuZCBvZiB0aGUgZmlyc3QgbGluZSBvciBpdHMgdGhlIGxhc3QgYnl0ZSBvZiB0aGUgcmVnaW9uLAorICAgICAgLy8gZ2VuZXJhdGUgdGhlIGVuZC1vZi1saW5lIGRvY3VtZW50YXRpb24uCisgICAgICBpZiAoIWRvY19nZW5lcmF0ZWQpIHsKKyAgICAgICAgcyArPSAiICI7CisgICAgICAgIHMgKz0gR2VuZXJhdGVEb2N1bWVudGF0aW9uKHJlZ2lvbiwgc2VjdGlvbiwgYmluYXJ5LCBkb2NfY29udGludWF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRfY29uZmlnKTsKKworICAgICAgICAvLyBJZiB3ZSBoYXZlIGEgdmFsdWUgaW4gdGhlIGRvYyBjb250aW51YXRpb24sIHRoYXQgbWVhbnMgdGhlIGRvYyBpcworICAgICAgICAvLyBiZWluZyBwcmludGVkIG9uIG11bHRpcGxlIGxpbmVzLgorICAgICAgICBkb2NfZ2VuZXJhdGVkID0gZG9jX2NvbnRpbnVhdGlvbi52YWx1ZS5lbXB0eSgpOworICAgICAgfQorICAgIH0KKyAgfQorCisgIHJldHVybiBzOworfQorCitzdGF0aWMgc3RkOjpzdHJpbmcgR2VuZXJhdGVTZWN0aW9uKGNvbnN0IEJpbmFyeVNlY3Rpb24gJnNlY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmJpbmFyeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgT3V0cHV0Q29uZmlnICZvdXRwdXRfY29uZmlnKSB7CisgIHN0ZDo6c3RyaW5nIHM7CisgIHMgKz0gIlxuIjsKKyAgcyArPSBUb1N0cmluZyhzZWN0aW9uLnR5cGUpOworICBpZiAoIXNlY3Rpb24ubmFtZS5lbXB0eSgpKSB7IHMgKz0gIiAoIiArIHNlY3Rpb24ubmFtZSArICIpIjsgfQorICBzICs9ICI6IjsKKyAgZm9yIChjb25zdCBCaW5hcnlSZWdpb24gJnJlZ2lvbiA6IHNlY3Rpb24ucmVnaW9ucykgeworICAgIHMgKz0gR2VuZXJhdGVSZWdpb24ocmVnaW9uLCBzZWN0aW9uLCBiaW5hcnksIG91dHB1dF9jb25maWcpOworICB9CisgIHJldHVybiBzOworfQorfSAgLy8gbmFtZXNwYWNlCisKK2Jvb2wgQW5ub3RhdGVkQmluYXJ5VGV4dEdlbmVyYXRvcjo6R2VuZXJhdGUoCisgICAgY29uc3Qgc3RkOjpzdHJpbmcgJmZpbGVuYW1lLCBjb25zdCBzdGQ6OnN0cmluZyAmc2NoZW1hX2ZpbGVuYW1lKSB7CisgIE91dHB1dENvbmZpZyBvdXRwdXRfY29uZmlnOworICBvdXRwdXRfY29uZmlnLm1heF9ieXRlc19wZXJfbGluZSA9IG9wdGlvbnNfLm1heF9ieXRlc19wZXJfbGluZTsKKworICAvLyBHaXZlbiB0aGUgbGVuZ3RoIG9mIHRoZSBiaW5hcnksIHdlIGNhbiBjYWxjdWxhdGUgdGhlIG1heGltdW0gbnVtYmVyIG9mCisgIC8vIGNoYXJhY3RlcnMgdG8gZGlzcGxheSBpbiB0aGUgb2Zmc2V0IGhleDogKGkuZS4gMiB3b3VsZCBsZWFkIHRvIDBYRkYgYmVpbmcKKyAgLy8gdGhlIG1heCBvdXRwdXQpLgorICBvdXRwdXRfY29uZmlnLm9mZnNldF9tYXhfY2hhciA9CisgICAgICBiaW5hcnlfbGVuZ3RoXyA+IDB4RkZGRkZGCisgICAgICAgICAgPyA4CisgICAgICAgICAgOiAoYmluYXJ5X2xlbmd0aF8gPiAweEZGRkYgPyA2IDogKGJpbmFyeV9sZW5ndGhfID4gMHhGRiA/IDQgOiAyKSk7CisKKyAgLy8gRmluZCB0aGUgbGFyZ2VzdCB0eXBlIHN0cmluZyBvZiBhbGwgdGhlIHJlZ2lvbnMgaW4gdGhpcyBmaWxlLCBzbyB3ZSBjYW4KKyAgLy8gYWxpZ24gdGhlIG91dHB1dCBuaWNlbHkuCisgIG91dHB1dF9jb25maWcubGFyZ2VzdF90eXBlX3N0cmluZyA9IDA7CisgIGZvciAoY29uc3QgYXV0byAmc2VjdGlvbiA6IGFubm90YXRpb25zXykgeworICAgIGZvciAoY29uc3QgYXV0byAmcmVnaW9uIDogc2VjdGlvbi5zZWNvbmQucmVnaW9ucykgeworICAgICAgc3RkOjpzdHJpbmcgcyA9IEdlbmVyYXRlVHlwZVN0cmluZyhyZWdpb24pOworICAgICAgaWYgKHMuc2l6ZSgpID4gb3V0cHV0X2NvbmZpZy5sYXJnZXN0X3R5cGVfc3RyaW5nKSB7CisgICAgICAgIG91dHB1dF9jb25maWcubGFyZ2VzdF90eXBlX3N0cmluZyA9IHMuc2l6ZSgpOworICAgICAgfQorCisgICAgICAvLyBEb24ndCBjb25zaWRlciBhcnJheSByZWdpb25zLCBhcyB0aGV5IHdpbGwgYmUgc3BsaXQgdG8gbXVsdGlwbGUgbGluZXMuCisgICAgICBpZiAoIXJlZ2lvbi5hcnJheV9sZW5ndGgpIHsKKyAgICAgICAgcyA9IFRvVmFsdWVTdHJpbmcocmVnaW9uLCBiaW5hcnlfLCBvdXRwdXRfY29uZmlnKTsKKyAgICAgICAgaWYgKHMuc2l6ZSgpID4gb3V0cHV0X2NvbmZpZy5sYXJnZXN0X3ZhbHVlX3N0cmluZykgeworICAgICAgICAgIG91dHB1dF9jb25maWcubGFyZ2VzdF92YWx1ZV9zdHJpbmcgPSBzLnNpemUoKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorCisgIC8vIEdlbmVyYXRlIGVhY2ggb2YgdGhlIGJpbmFyeSBzZWN0aW9ucworICBzdGQ6OnN0cmluZyBzOworCisgIHMgKz0gIi8vIEFubm90YXRlZCBGbGF0YnVmZmVyIEJpbmFyeVxuIjsKKyAgcyArPSAiLy9cbiI7CisgIHMgKz0gIi8vIFNjaGVtYSBmaWxlOiAiICsgc2NoZW1hX2ZpbGVuYW1lICsgIlxuIjsKKyAgcyArPSAiLy8gQmluYXJ5IGZpbGU6ICIgKyBmaWxlbmFtZSArICJcbiI7CisKKyAgZm9yIChjb25zdCBhdXRvICZzZWN0aW9uIDogYW5ub3RhdGlvbnNfKSB7CisgICAgcyArPSBHZW5lcmF0ZVNlY3Rpb24oc2VjdGlvbi5zZWNvbmQsIGJpbmFyeV8sIG91dHB1dF9jb25maWcpOworICAgIHMgKz0gIlxuIjsKKyAgfQorCisgIC8vIE1vZGlmeSB0aGUgb3V0cHV0IGZpbGVuYW1lLgorICBzdGQ6OnN0cmluZyBvdXRwdXRfZmlsZW5hbWUgPSBTdHJpcEV4dGVuc2lvbihmaWxlbmFtZSk7CisgIG91dHB1dF9maWxlbmFtZSArPSBvcHRpb25zXy5vdXRwdXRfcG9zdGZpeDsKKyAgb3V0cHV0X2ZpbGVuYW1lICs9CisgICAgICAiLiIgKyAob3B0aW9uc18ub3V0cHV0X2V4dGVuc2lvbi5lbXB0eSgpID8gR2V0RXh0ZW5zaW9uKGZpbGVuYW1lKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IG9wdGlvbnNfLm91dHB1dF9leHRlbnNpb24pOworCisgIHJldHVybiBTYXZlRmlsZShvdXRwdXRfZmlsZW5hbWUuY19zdHIoKSwgcywgZmFsc2UpOworfQorCit9ICAvLyBuYW1lc3BhY2UgZmxhdGJ1ZmZlcnMKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3NyYy9hbm5vdGF0ZWRfYmluYXJ5X3RleHRfZ2VuLmggYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy9zcmMvYW5ub3RhdGVkX2JpbmFyeV90ZXh0X2dlbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcxMmM0NTIKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy9zcmMvYW5ub3RhdGVkX2JpbmFyeV90ZXh0X2dlbi5oCkBAIC0wLDAgKzEsNzIgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAyMSBHb29nbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgRkxBVEJVRkZFUlNfQU5OT1RBVEVEX0JJTkFSWV9URVhUX0dFTl9IXworI2RlZmluZSBGTEFUQlVGRkVSU19BTk5PVEFURURfQklOQVJZX1RFWFRfR0VOX0hfCisKKyNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHN0cmluZz4KKworI2luY2x1ZGUgImJpbmFyeV9hbm5vdGF0b3IuaCIKKworbmFtZXNwYWNlIGZsYXRidWZmZXJzIHsKKworY2xhc3MgQW5ub3RhdGVkQmluYXJ5VGV4dEdlbmVyYXRvciB7CisgcHVibGljOgorICBzdHJ1Y3QgT3B0aW9ucyB7CisgICAgLy8gVGhlIG1heGltdW0gbnVtYmVyIG9mIHJhdyBieXRlcyB0byBwcmludCBwZXIgbGluZSBpbiB0aGUgb3V0cHV0LiA4IGlzIGEKKyAgICAvLyBnb29kIGRlZmF1bHQgZHVlIHRvIHRoZSBsYXJnZXN0IHR5cGUgKGRvdWJsZSkgYmVpbmcgOCBieXRlcyBsb25nLgorICAgIHNpemVfdCBtYXhfYnl0ZXNfcGVyX2xpbmUgPSA4OworCisgICAgLy8gVGhlIG91dHB1dCBmaWxlIHBvc3RmaXgsIGFwcGVuZGVkIGJldHdlZW4gdGhlIGZpbGVuYW1lIGFuZCB0aGUgZXh0ZW5zaW9uLgorICAgIC8vIEV4YW1wbGUgYmluYXJ5MS5iaW4gLT4gYmluYXJ5MV9hbm5vdGF0ZWQuYmluCisgICAgc3RkOjpzdHJpbmcgb3V0cHV0X3Bvc3RmaXggPSAiIjsKKworICAgIC8vIFRoZSBvdXRwdXQgZmlsZSBleHRlbnNpb24sIHJlcGxhY2luZyBhbnkgZXh0ZW5zaW9uIGdpdmVuLiBJZiBlbXB0eSwgZG9uJ3QKKyAgICAvLyBjaGFuZ2UgdGhlIHByb3ZpZGVkIGV4dGVuc2lvbi4gQUZCID0gQW5ub3RhdGVkIEZsYXRidWZmZXIgQmluYXJ5CisgICAgLy8KKyAgICAvLyBFeGFtcGxlOiBiaW5hcnkxLmJpbiAtPiBiaW5hcnkxLmFmYgorICAgIHN0ZDo6c3RyaW5nIG91dHB1dF9leHRlbnNpb24gPSAiYWZiIjsKKyAgfTsKKworICBleHBsaWNpdCBBbm5vdGF0ZWRCaW5hcnlUZXh0R2VuZXJhdG9yKAorICAgICAgY29uc3QgT3B0aW9ucyAmb3B0aW9ucywgc3RkOjptYXA8dWludDY0X3QsIEJpbmFyeVNlY3Rpb24+IGFubm90YXRpb25zLAorICAgICAgY29uc3QgdWludDhfdCAqY29uc3QgYmluYXJ5LCBjb25zdCBpbnQ2NF90IGJpbmFyeV9sZW5ndGgpCisgICAgICA6IGFubm90YXRpb25zXyhzdGQ6Om1vdmUoYW5ub3RhdGlvbnMpKSwKKyAgICAgICAgYmluYXJ5XyhiaW5hcnkpLAorICAgICAgICBiaW5hcnlfbGVuZ3RoXyhiaW5hcnlfbGVuZ3RoKSwKKyAgICAgICAgb3B0aW9uc18ob3B0aW9ucykge30KKworICAvLyBHZW5lcmF0ZSB0aGUgYW5ub3RhdGVkIGJpbmFyeSBmb3IgdGhlIGdpdmVuIGBmaWxlbmFtZWAuIFJldHVybnMgdHJ1ZSBpZiB0aGUKKyAgLy8gYW5ub3RhdGVkIGJpbmFyeSB3YXMgc3VjY2Vzc2Z1bGx5IHNhdmVkLgorICBib29sIEdlbmVyYXRlKGNvbnN0IHN0ZDo6c3RyaW5nICZmaWxlbmFtZSwKKyAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyAmc2NoZW1hX2ZpbGVuYW1lKTsKKworIHByaXZhdGU6CisgIGNvbnN0IHN0ZDo6bWFwPHVpbnQ2NF90LCBCaW5hcnlTZWN0aW9uPiBhbm5vdGF0aW9uc187CisKKyAgLy8gVGhlIGJpbmFyeSBkYXRhIGl0c2VsZi4KKyAgY29uc3QgdWludDhfdCAqYmluYXJ5XzsKKyAgY29uc3QgaW50NjRfdCBiaW5hcnlfbGVuZ3RoXzsKKworICAvLyBPdXRwdXQgY29uZmlndXJhdGlvbgorICBjb25zdCBPcHRpb25zIG9wdGlvbnNfOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGZsYXRidWZmZXJzCisKKyNlbmRpZiAgLy8gRkxBVEJVRkZFUlNfQU5OT1RBVEVEX0JJTkFSWV9URVhUX0dFTl9IXwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvc3JjL2JmYnNfZ2VuLmggYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy9zcmMvYmZic19nZW4uaAppbmRleCAyN2JhZWY5Li42MzIyMGU4IDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy9zcmMvYmZic19nZW4uaAorKysgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy9zcmMvYmZic19nZW4uaApAQCAtMjQsMTkgKzI0LDIxIEBACiAKIG5hbWVzcGFjZSBmbGF0YnVmZmVycyB7CiAKLXZvaWQgRm9yQWxsRW51bXMoCituYW1lc3BhY2UgeworCitzdGF0aWMgdm9pZCBGb3JBbGxFbnVtcygKICAgICBjb25zdCBmbGF0YnVmZmVyczo6VmVjdG9yPGZsYXRidWZmZXJzOjpPZmZzZXQ8cmVmbGVjdGlvbjo6RW51bT4+ICplbnVtcywKICAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQoY29uc3QgcmVmbGVjdGlvbjo6RW51bSAqKT4gZnVuYykgewogICBmb3IgKGF1dG8gaXQgPSBlbnVtcy0+Y2JlZ2luKCk7IGl0ICE9IGVudW1zLT5jZW5kKCk7ICsraXQpIHsgZnVuYygqaXQpOyB9CiB9CiAKLXZvaWQgRm9yQWxsT2JqZWN0cygKK3N0YXRpYyB2b2lkIEZvckFsbE9iamVjdHMoCiAgICAgY29uc3QgZmxhdGJ1ZmZlcnM6OlZlY3RvcjxmbGF0YnVmZmVyczo6T2Zmc2V0PHJlZmxlY3Rpb246Ok9iamVjdD4+ICpvYmplY3RzLAogICAgIHN0ZDo6ZnVuY3Rpb248dm9pZChjb25zdCByZWZsZWN0aW9uOjpPYmplY3QgKik+IGZ1bmMpIHsKICAgZm9yIChhdXRvIGl0ID0gb2JqZWN0cy0+Y2JlZ2luKCk7IGl0ICE9IG9iamVjdHMtPmNlbmQoKTsgKytpdCkgeyBmdW5jKCppdCk7IH0KIH0KIAotdm9pZCBGb3JBbGxFbnVtVmFsdWVzKGNvbnN0IHJlZmxlY3Rpb246OkVudW0gKmVudW1fZGVmLAorc3RhdGljIHZvaWQgRm9yQWxsRW51bVZhbHVlcyhjb25zdCByZWZsZWN0aW9uOjpFbnVtICplbnVtX2RlZiwKICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQoY29uc3QgcmVmbGVjdGlvbjo6RW51bVZhbCAqKT4gZnVuYykgewogICBmb3IgKGF1dG8gaXQgPSBlbnVtX2RlZi0+dmFsdWVzKCktPmNiZWdpbigpOyBpdCAhPSBlbnVtX2RlZi0+dmFsdWVzKCktPmNlbmQoKTsKICAgICAgICArK2l0KSB7CkBAIC00NCw3ICs0Niw3IEBACiAgIH0KIH0KIAotdm9pZCBGb3JBbGxEb2N1bWVudGF0aW9uKAorc3RhdGljIHZvaWQgRm9yQWxsRG9jdW1lbnRhdGlvbigKICAgICBjb25zdCBmbGF0YnVmZmVyczo6VmVjdG9yPGZsYXRidWZmZXJzOjpPZmZzZXQ8ZmxhdGJ1ZmZlcnM6OlN0cmluZz4+CiAgICAgICAgICpkb2N1bWVudGF0aW9uLAogICAgIHN0ZDo6ZnVuY3Rpb248dm9pZChjb25zdCBmbGF0YnVmZmVyczo6U3RyaW5nICopPiBmdW5jKSB7CkBAIC03MywxMCArNzUsNiBAQAogICByZXR1cm4gYmFzZV90eXBlID09IHJlZmxlY3Rpb246OkJhc2VUeXBlOjpPYmo7CiB9CiAKLXN0YXRpYyBib29sIElzU2NhbGFyKGNvbnN0IHJlZmxlY3Rpb246OkJhc2VUeXBlIGJhc2VfdHlwZSkgewotICByZXR1cm4gYmFzZV90eXBlID49IHJlZmxlY3Rpb246OkJhc2VUeXBlOjpVVHlwZSAmJiBiYXNlX3R5cGUgPD0gcmVmbGVjdGlvbjo6QmFzZVR5cGU6OkRvdWJsZTsKLX0KLQogc3RhdGljIGJvb2wgSXNGbG9hdGluZ1BvaW50KGNvbnN0IHJlZmxlY3Rpb246OkJhc2VUeXBlIGJhc2VfdHlwZSkgewogICByZXR1cm4gYmFzZV90eXBlID09IHJlZmxlY3Rpb246OkJhc2VUeXBlOjpGbG9hdCB8fCBiYXNlX3R5cGUgPT0gcmVmbGVjdGlvbjo6QmFzZVR5cGU6OkRvdWJsZTsKIH0KQEAgLTkzLDIxICs5MSw3IEBACiAgIHJldHVybiBiYXNlX3R5cGUgPT0gcmVmbGVjdGlvbjo6QmFzZVR5cGU6OlZlY3RvcjsKIH0KIAotc3RhdGljIHN0ZDo6c3RyaW5nIERlbmFtZXNwYWNlKGNvbnN0IGZsYXRidWZmZXJzOjpTdHJpbmcgKm5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgJm5zKSB7Ci0gIGNvbnN0IHNpemVfdCBwb3MgPSBuYW1lLT5zdHIoKS5maW5kX2xhc3Rfb2YoJy4nKTsKLSAgaWYgKHBvcyA9PSBzdGQ6OnN0cmluZzo6bnBvcykgewotICAgIG5zID0gIiI7Ci0gICAgcmV0dXJuIG5hbWUtPnN0cigpOwotICB9Ci0gIG5zID0gbmFtZS0+c3RyKCkuc3Vic3RyKDAsIHBvcyk7Ci0gIHJldHVybiBuYW1lLT5zdHIoKS5zdWJzdHIocG9zICsgMSk7Ci19Ci0KLXN0YXRpYyBzdGQ6OnN0cmluZyBEZW5hbWVzcGFjZShjb25zdCBmbGF0YnVmZmVyczo6U3RyaW5nICpuYW1lKSB7Ci0gIHN0ZDo6c3RyaW5nIG5zOwotICByZXR1cm4gRGVuYW1lc3BhY2UobmFtZSwgbnMpOwotfQorfSAvLyBuYW1lc3BhY2UKIAogLy8gQSBjb25jcmV0ZSBiYXNlIEZsYXRidWZmZXIgR2VuZXJhdG9yIHRoYXQgc3BlY2lmaWMgbGFuZ3VhZ2UgZ2VuZXJhdG9ycyBjYW4KIC8vIGRlcml2ZSBmcm9tLgpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvc3JjL2JmYnNfZ2VuX2x1YS5jcHAgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy9zcmMvYmZic19nZW5fbHVhLmNwcAppbmRleCAxOGUxNzFjLi5lOTYyM2Q0IDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy9zcmMvYmZic19nZW5fbHVhLmNwcAorKysgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy9zcmMvYmZic19nZW5fbHVhLmNwcApAQCAtMjUsOSArMjUsMTEgQEAKIAogLy8gRW5zdXJlIG5vIGluY2x1ZGVzIHRvIGZsYXRjIGludGVybmFscy4gYmZic19nZW4uaCBhbmQgZ2VuZXJhdG9yLmggYXJlIE9LLgogI2luY2x1ZGUgImJmYnNfZ2VuLmgiCisjaW5jbHVkZSAiYmZic19uYW1lci5oIgogI2luY2x1ZGUgImZsYXRidWZmZXJzL2JmYnNfZ2VuZXJhdG9yLmgiCiAKIC8vIFRoZSBpbnRlcm1lZGlhdGUgcmVwcmVzZW50YXRpb24gc2NoZW1hLgorI2luY2x1ZGUgImZsYXRidWZmZXJzL3JlZmxlY3Rpb24uaCIKICNpbmNsdWRlICJmbGF0YnVmZmVycy9yZWZsZWN0aW9uX2dlbmVyYXRlZC5oIgogCiBuYW1lc3BhY2UgZmxhdGJ1ZmZlcnMgewpAQCAtMzYsNiArMzgsMzYgQEAKIC8vIFRvIHJlZHVjZSB0eXBpbmcKIG5hbWVzcGFjZSByID0gOjpyZWZsZWN0aW9uOwogCitzdGQ6OnNldDxzdGQ6OnN0cmluZz4gTHVhS2V5d29yZHMoKSB7CisgIHJldHVybiB7ICJhbmQiLCAgICJicmVhayIsICJkbyIsICAgICAgICJlbHNlIiwgImVsc2VpZiIsICJlbmQiLAorICAgICAgICAgICAiZmFsc2UiLCAiZm9yIiwgICAiZnVuY3Rpb24iLCAiZ290byIsICJpZiIsICAgICAiaW4iLAorICAgICAgICAgICAibG9jYWwiLCAibmlsIiwgICAibm90IiwgICAgICAib3IiLCAgICJyZXBlYXQiLCAicmV0dXJuIiwKKyAgICAgICAgICAgInRoZW4iLCAgInRydWUiLCAgInVudGlsIiwgICAgIndoaWxlIiB9OworfQorCitOYW1lcjo6Q29uZmlnIEx1YURlZmF1bHRDb25maWcoKSB7CisgIHJldHVybiB7IC8qdHlwZXM9Ki9DYXNlOjprVXBwZXJDYW1lbCwKKyAgICAgICAgICAgLypjb25zdGFudHM9Ki9DYXNlOjprVW5rbm93biwKKyAgICAgICAgICAgLyptZXRob2RzPSovQ2FzZTo6a1VwcGVyQ2FtZWwsCisgICAgICAgICAgIC8qZnVuY3Rpb25zPSovQ2FzZTo6a1VwcGVyQ2FtZWwsCisgICAgICAgICAgIC8qZmllbGRzPSovQ2FzZTo6a1VwcGVyQ2FtZWwsCisgICAgICAgICAgIC8qdmFyaWFibGVzPSovQ2FzZTo6a0xvd2VyQ2FtZWwsCisgICAgICAgICAgIC8qdmFyaWFudHM9Ki9DYXNlOjprS2VlcCwKKyAgICAgICAgICAgLyplbnVtX3ZhcmlhbnRfc2VwZXJhdG9yPSovIiIsCisgICAgICAgICAgIC8qZXNjYXBlX2tleXdvcmRzPSovTmFtZXI6OkNvbmZpZzo6RXNjYXBlOjpBZnRlckNvbnZlcnRpbmdDYXNlLAorICAgICAgICAgICAvKm5hbWVzcGFjZXM9Ki9DYXNlOjprS2VlcCwKKyAgICAgICAgICAgLypuYW1lc3BhY2Vfc2VwZXJhdG9yPSovIl9fIiwKKyAgICAgICAgICAgLypvYmplY3RfcHJlZml4PSovIiIsCisgICAgICAgICAgIC8qb2JqZWN0X3N1ZmZpeD0qLyIiLAorICAgICAgICAgICAvKmtleXdvcmRfcHJlZml4PSovIiIsCisgICAgICAgICAgIC8qa2V5d29yZF9zdWZmaXg9Ki8iXyIsCisgICAgICAgICAgIC8qZmlsZW5hbWVzPSovQ2FzZTo6a0tlZXAsCisgICAgICAgICAgIC8qZGlyZWN0b3JpZXM9Ki9DYXNlOjprS2VlcCwKKyAgICAgICAgICAgLypvdXRwdXRfcGF0aD0qLyIiLAorICAgICAgICAgICAvKmZpbGVuYW1lX3N1ZmZpeD0qLyIiLAorICAgICAgICAgICAvKmZpbGVuYW1lX2V4dGVuc2lvbj0qLyIubHVhIiB9OworfQorCiBjbGFzcyBMdWFCZmJzR2VuZXJhdG9yIDogcHVibGljIEJhc2VCZmJzR2VuZXJhdG9yIHsKICBwdWJsaWM6CiAgIGV4cGxpY2l0IEx1YUJmYnNHZW5lcmF0b3IoY29uc3Qgc3RkOjpzdHJpbmcgJmZsYXRjX3ZlcnNpb24pCkBAIC00NCwxNCArNzYsOCBAQAogICAgICAgICByZXF1aXJlc18oKSwKICAgICAgICAgY3VycmVudF9vYmpfKG51bGxwdHIpLAogICAgICAgICBjdXJyZW50X2VudW1fKG51bGxwdHIpLAotICAgICAgICBmbGF0Y192ZXJzaW9uXyhmbGF0Y192ZXJzaW9uKSB7Ci0gICAgc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IGtleXdvcmRzW10gPSB7Ci0gICAgICAiYW5kIiwgICAgICAiYnJlYWsiLCAgImRvIiwgICAiZWxzZSIsICJlbHNlaWYiLCAiZW5kIiwgICJmYWxzZSIsICJmb3IiLAotICAgICAgImZ1bmN0aW9uIiwgImdvdG8iLCAgICJpZiIsICAgImluIiwgICAibG9jYWwiLCAgIm5pbCIsICAibm90IiwgICAib3IiLAotICAgICAgInJlcGVhdCIsICAgInJldHVybiIsICJ0aGVuIiwgInRydWUiLCAidW50aWwiLCAgIndoaWxlIgotICAgIH07Ci0gICAga2V5d29yZHNfLmluc2VydChzdGQ6OmJlZ2luKGtleXdvcmRzKSwgc3RkOjplbmQoa2V5d29yZHMpKTsKLSAgfQorICAgICAgICBmbGF0Y192ZXJzaW9uXyhmbGF0Y192ZXJzaW9uKSwKKyAgICAgICAgbmFtZXJfKEx1YURlZmF1bHRDb25maWcoKSwgTHVhS2V5d29yZHMoKSkge30KIAogICBHZW5lcmF0b3JTdGF0dXMgR2VuZXJhdGVGcm9tU2NoZW1hKGNvbnN0IHI6OlNjaGVtYSAqc2NoZW1hKQogICAgICAgRkxBVEJVRkZFUlNfT1ZFUlJJREUgewpAQCAtNzYsMTQgKzEwMiwxNCBAQAogCiAgICAgICBzdGQ6OnN0cmluZyBuczsKICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nIGVudW1fbmFtZSA9Ci0gICAgICAgICAgTm9ybWFsaXplTmFtZShEZW5hbWVzcGFjZShlbnVtX2RlZi0+bmFtZSgpLCBucykpOworICAgICAgICAgIG5hbWVyXy5UeXBlKG5hbWVyXy5EZW5hbWVzcGFjZShlbnVtX2RlZiwgbnMpKTsKIAogICAgICAgR2VuZXJhdGVEb2N1bWVudGF0aW9uKGVudW1fZGVmLT5kb2N1bWVudGF0aW9uKCksICIiLCBjb2RlKTsKICAgICAgIGNvZGUgKz0gImxvY2FsICIgKyBlbnVtX25hbWUgKyAiID0ge1xuIjsKIAogICAgICAgRm9yQWxsRW51bVZhbHVlcyhlbnVtX2RlZiwgWyZdKGNvbnN0IHJlZmxlY3Rpb246OkVudW1WYWwgKmVudW1fdmFsKSB7CiAgICAgICAgIEdlbmVyYXRlRG9jdW1lbnRhdGlvbihlbnVtX3ZhbC0+ZG9jdW1lbnRhdGlvbigpLCAiICAiLCBjb2RlKTsKLSAgICAgICAgY29kZSArPSAiICAiICsgTm9ybWFsaXplTmFtZShlbnVtX3ZhbC0+bmFtZSgpKSArICIgPSAiICsKKyAgICAgICAgY29kZSArPSAiICAiICsgbmFtZXJfLlZhcmlhbnQoZW51bV92YWwtPm5hbWUoKS0+c3RyKCkpICsgIiA9ICIgKwogICAgICAgICAgICAgICAgIE51bVRvU3RyaW5nKGVudW1fdmFsLT52YWx1ZSgpKSArICIsXG4iOwogICAgICAgfSk7CiAgICAgICBjb2RlICs9ICJ9XG4iOwpAQCAtMTA3LDcgKzEzMyw3IEBACiAKICAgICAgIHN0ZDo6c3RyaW5nIG5zOwogICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgb2JqZWN0X25hbWUgPQotICAgICAgICAgIE5vcm1hbGl6ZU5hbWUoRGVuYW1lc3BhY2Uob2JqZWN0LT5uYW1lKCksIG5zKSk7CisgICAgICAgICAgbmFtZXJfLlR5cGUobmFtZXJfLkRlbmFtZXNwYWNlKG9iamVjdCwgbnMpKTsKIAogICAgICAgR2VuZXJhdGVEb2N1bWVudGF0aW9uKG9iamVjdC0+ZG9jdW1lbnRhdGlvbigpLCAiIiwgY29kZSk7CiAKQEAgLTE0OSwxNCArMTc1LDEyIEBACiAgICAgICAgIC8vIFNraXAgd3JpdGluZyBkZXByZWNhdGVkIGZpZWxkcyBhbHRvZ2V0aGVyLgogICAgICAgICBpZiAoZmllbGQtPmRlcHJlY2F0ZWQoKSkgeyByZXR1cm47IH0KIAotICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyBmaWVsZF9uYW1lID0gTm9ybWFsaXplTmFtZShmaWVsZC0+bmFtZSgpKTsKLSAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgZmllbGRfbmFtZV9jYW1lbF9jYXNlID0KLSAgICAgICAgICAgIENvbnZlcnRDYXNlKGZpZWxkX25hbWUsIENhc2U6OmtVcHBlckNhbWVsKTsKKyAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgZmllbGRfbmFtZSA9IG5hbWVyXy5GaWVsZChmaWVsZC0+bmFtZSgpLT5zdHIoKSk7CiAgICAgICAgIGNvbnN0IHI6OkJhc2VUeXBlIGJhc2VfdHlwZSA9IGZpZWxkLT50eXBlKCktPmJhc2VfdHlwZSgpOwogCiAgICAgICAgIC8vIEdlbmVyYXRlIHNvbWUgZml4ZWQgc3RyaW5ncyBzbyB3ZSBkb24ndCByZXBlYXQgb3V0c2VsdmVzIGxhdGVyLgogICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyBnZXR0ZXJfc2lnbmF0dXJlID0KLSAgICAgICAgICAgICJmdW5jdGlvbiBtdDoiICsgZmllbGRfbmFtZV9jYW1lbF9jYXNlICsgIigpXG4iOworICAgICAgICAgICAgImZ1bmN0aW9uIG10OiIgKyBmaWVsZF9uYW1lICsgIigpXG4iOwogICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyBvZmZzZXRfcHJlZml4ID0gImxvY2FsIG8gPSBzZWxmLnZpZXc6T2Zmc2V0KCIgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTnVtVG9TdHJpbmcoZmllbGQtPm9mZnNldCgpKSArICIpXG4iOwogICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyBvZmZzZXRfcHJlZml4XzIgPSAiaWYgbyB+PSAwIHRoZW5cbiI7CkBAIC0yMDEsNyArMjI1LDcgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGNhc2Ugcjo6QmFzZVR5cGU6Ok9iajogewogICAgICAgICAgICAgICBpZiAob2JqZWN0LT5pc19zdHJ1Y3QoKSkgewotICAgICAgICAgICAgICAgIGNvZGUgKz0gImZ1bmN0aW9uIG10OiIgKyBmaWVsZF9uYW1lX2NhbWVsX2Nhc2UgKyAiKG9iailcbiI7CisgICAgICAgICAgICAgICAgY29kZSArPSAiZnVuY3Rpb24gbXQ6IiArIGZpZWxkX25hbWUgKyAiKG9iailcbiI7CiAgICAgICAgICAgICAgICAgY29kZSArPSAiICBvYmo6SW5pdChzZWxmLnZpZXcuYnl0ZXMsIHNlbGYudmlldy5wb3MgKyAiICsKICAgICAgICAgICAgICAgICAgICAgICAgIE51bVRvU3RyaW5nKGZpZWxkLT5vZmZzZXQoKSkgKyAiKVxuIjsKICAgICAgICAgICAgICAgICBjb2RlICs9ICIgIHJldHVybiBvYmpcbiI7CkBAIC0yNTIsNyArMjc2LDcgQEAKICAgICAgICAgICAgIGNhc2Ugcjo6QmFzZVR5cGU6OlZlY3RvcjogewogICAgICAgICAgICAgICBjb25zdCByOjpCYXNlVHlwZSB2ZWN0b3JfYmFzZV90eXBlID0gZmllbGQtPnR5cGUoKS0+ZWxlbWVudCgpOwogICAgICAgICAgICAgICBpbnQzMl90IGVsZW1lbnRfc2l6ZSA9IGZpZWxkLT50eXBlKCktPmVsZW1lbnRfc2l6ZSgpOwotICAgICAgICAgICAgICBjb2RlICs9ICJmdW5jdGlvbiBtdDoiICsgZmllbGRfbmFtZV9jYW1lbF9jYXNlICsgIihqKVxuIjsKKyAgICAgICAgICAgICAgY29kZSArPSAiZnVuY3Rpb24gbXQ6IiArIGZpZWxkX25hbWUgKyAiKGopXG4iOwogICAgICAgICAgICAgICBjb2RlICs9ICIgICIgKyBvZmZzZXRfcHJlZml4OwogICAgICAgICAgICAgICBjb2RlICs9ICIgICIgKyBvZmZzZXRfcHJlZml4XzI7CiAKQEAgLTI5Nyw4ICszMjEsNyBAQAogICAgICAgICAgICAgICAvLyBnZW5lcmF0ZSBhIGhlbHBlciBmdW5jdGlvbiB0byBnZXQgaXQgYXMgYSBieXRlIHN0cmluZyBpbgogICAgICAgICAgICAgICAvLyBMdWEuCiAgICAgICAgICAgICAgIGlmIChJc1NpbmdsZUJ5dGUodmVjdG9yX2Jhc2VfdHlwZSkpIHsKLSAgICAgICAgICAgICAgICBjb2RlICs9ICJmdW5jdGlvbiBtdDoiICsgZmllbGRfbmFtZV9jYW1lbF9jYXNlICsKLSAgICAgICAgICAgICAgICAgICAgICAgICJBc1N0cmluZyhzdGFydCwgc3RvcClcbiI7CisgICAgICAgICAgICAgICAgY29kZSArPSAiZnVuY3Rpb24gbXQ6IiArIGZpZWxkX25hbWUgKyAiQXNTdHJpbmcoc3RhcnQsIHN0b3ApXG4iOwogICAgICAgICAgICAgICAgIGNvZGUgKz0gIiAgcmV0dXJuIHNlbGYudmlldzpWZWN0b3JBc1N0cmluZygiICsKICAgICAgICAgICAgICAgICAgICAgICAgIE51bVRvU3RyaW5nKGZpZWxkLT5vZmZzZXQoKSkgKyAiLCBzdGFydCwgc3RvcClcbiI7CiAgICAgICAgICAgICAgICAgY29kZSArPSAiZW5kXG4iOwpAQCAtMzA3LDcgKzMzMCw3IEBACiAKICAgICAgICAgICAgICAgLy8gV2UgYWxzbyBtYWtlIGEgbmV3IGFjY2Vzc29yIHRvIHF1ZXJ5IGp1c3QgdGhlIGxlbmd0aCBvZiB0aGUKICAgICAgICAgICAgICAgLy8gdmVjdG9yLgotICAgICAgICAgICAgICBjb2RlICs9ICJmdW5jdGlvbiBtdDoiICsgZmllbGRfbmFtZV9jYW1lbF9jYXNlICsgIkxlbmd0aCgpXG4iOworICAgICAgICAgICAgICBjb2RlICs9ICJmdW5jdGlvbiBtdDoiICsgZmllbGRfbmFtZSArICJMZW5ndGgoKVxuIjsKICAgICAgICAgICAgICAgY29kZSArPSAiICAiICsgb2Zmc2V0X3ByZWZpeDsKICAgICAgICAgICAgICAgY29kZSArPSAiICAiICsgb2Zmc2V0X3ByZWZpeF8yOwogICAgICAgICAgICAgICBjb2RlICs9ICIgICAgcmV0dXJuIHNlbGYudmlldzpWZWN0b3JMZW4obylcbiI7CkBAIC0zNDQsMjEgKzM2NywyMCBAQAogICAgICAgICBGb3JBbGxGaWVsZHMob2JqZWN0LCAvKnJldmVyc2U9Ki9mYWxzZSwgWyZdKGNvbnN0IHI6OkZpZWxkICpmaWVsZCkgewogICAgICAgICAgIGlmIChmaWVsZC0+ZGVwcmVjYXRlZCgpKSB7IHJldHVybjsgfQogCi0gICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgZmllbGRfbmFtZSA9IE5vcm1hbGl6ZU5hbWUoZmllbGQtPm5hbWUoKSk7CisgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgZmllbGRfbmFtZSA9IG5hbWVyXy5GaWVsZChmaWVsZC0+bmFtZSgpLT5zdHIoKSk7CisgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgdmFyaWFibGVfbmFtZSA9CisgICAgICAgICAgICAgIG5hbWVyXy5WYXJpYWJsZShmaWVsZC0+bmFtZSgpLT5zdHIoKSk7CiAKLSAgICAgICAgICBjb2RlICs9ICJmdW5jdGlvbiAiICsgb2JqZWN0X25hbWUgKyAiLkFkZCIgKwotICAgICAgICAgICAgICAgICAgQ29udmVydENhc2UoZmllbGRfbmFtZSwgQ2FzZTo6a1VwcGVyQ2FtZWwpICsgIihidWlsZGVyLCAiICsKLSAgICAgICAgICAgICAgICAgIENvbnZlcnRDYXNlKGZpZWxkX25hbWUsIENhc2U6OmtMb3dlckNhbWVsKSArICIpXG4iOworICAgICAgICAgIGNvZGUgKz0gImZ1bmN0aW9uICIgKyBvYmplY3RfbmFtZSArICIuQWRkIiArIGZpZWxkX25hbWUgKworICAgICAgICAgICAgICAgICAgIihidWlsZGVyLCAiICsgdmFyaWFibGVfbmFtZSArICIpXG4iOwogICAgICAgICAgIGNvZGUgKz0gIiAgYnVpbGRlcjpQcmVwZW5kIiArIEdlbmVyYXRlTWV0aG9kKGZpZWxkKSArICJTbG90KCIgKwotICAgICAgICAgICAgICAgICAgTnVtVG9TdHJpbmcoZmllbGQtPmlkKCkpICsgIiwgIiArCi0gICAgICAgICAgICAgICAgICBDb252ZXJ0Q2FzZShmaWVsZF9uYW1lLCBDYXNlOjprTG93ZXJDYW1lbCkgKyAiLCAiICsKKyAgICAgICAgICAgICAgICAgIE51bVRvU3RyaW5nKGZpZWxkLT5pZCgpKSArICIsICIgKyB2YXJpYWJsZV9uYW1lICsgIiwgIiArCiAgICAgICAgICAgICAgICAgICBEZWZhdWx0VmFsdWUoZmllbGQpICsgIilcbiI7CiAgICAgICAgICAgY29kZSArPSAiZW5kXG4iOwogICAgICAgICAgIGNvZGUgKz0gIlxuIjsKIAogICAgICAgICAgIGlmIChJc1ZlY3RvcihmaWVsZC0+dHlwZSgpLT5iYXNlX3R5cGUoKSkpIHsKLSAgICAgICAgICAgIGNvZGUgKz0gImZ1bmN0aW9uICIgKyBvYmplY3RfbmFtZSArICIuU3RhcnQiICsKLSAgICAgICAgICAgICAgICAgICAgQ29udmVydENhc2UoZmllbGRfbmFtZSwgQ2FzZTo6a1VwcGVyQ2FtZWwpICsKKyAgICAgICAgICAgIGNvZGUgKz0gImZ1bmN0aW9uICIgKyBvYmplY3RfbmFtZSArICIuU3RhcnQiICsgZmllbGRfbmFtZSArCiAgICAgICAgICAgICAgICAgICAgICJWZWN0b3IoYnVpbGRlciwgbnVtRWxlbXMpXG4iOwogCiAgICAgICAgICAgICBjb25zdCBpbnQzMl90IGVsZW1lbnRfc2l6ZSA9IGZpZWxkLT50eXBlKCktPmVsZW1lbnRfc2l6ZSgpOwpAQCAtNDA2LDExICs0MjgsOSBAQAogICAgICAgaWYgKElzU3RydWN0T3JUYWJsZShmaWVsZC0+dHlwZSgpLT5iYXNlX3R5cGUoKSkpIHsKICAgICAgICAgY29uc3Qgcjo6T2JqZWN0ICpmaWVsZF9vYmplY3QgPSBHZXRPYmplY3QoZmllbGQtPnR5cGUoKSk7CiAgICAgICAgIHNpZ25hdHVyZSArPSBHZW5lcmF0ZVN0cnVjdEJ1aWxkZXJBcmdzKAotICAgICAgICAgICAgZmllbGRfb2JqZWN0LCBwcmVmaXggKyBOb3JtYWxpemVOYW1lKGZpZWxkLT5uYW1lKCkpICsgIl8iKTsKKyAgICAgICAgICAgIGZpZWxkX29iamVjdCwgcHJlZml4ICsgbmFtZXJfLlZhcmlhYmxlKGZpZWxkLT5uYW1lKCktPnN0cigpKSArICJfIik7CiAgICAgICB9IGVsc2UgewotICAgICAgICBzaWduYXR1cmUgKz0KLSAgICAgICAgICAgICIsICIgKyBwcmVmaXggKwotICAgICAgICAgICAgQ29udmVydENhc2UoTm9ybWFsaXplTmFtZShmaWVsZC0+bmFtZSgpKSwgQ2FzZTo6a0xvd2VyQ2FtZWwpOworICAgICAgICBzaWduYXR1cmUgKz0gIiwgIiArIHByZWZpeCArIG5hbWVyXy5WYXJpYWJsZShmaWVsZC0+bmFtZSgpLT5zdHIoKSk7CiAgICAgICB9CiAgICAgfSk7CiAgICAgcmV0dXJuIHNpZ25hdHVyZTsKQEAgLTQzMiwxMSArNDUyLDEwIEBACiAgICAgICBpZiAoSXNTdHJ1Y3RPclRhYmxlKGZpZWxkLT50eXBlKCktPmJhc2VfdHlwZSgpKSkgewogICAgICAgICBjb25zdCByOjpPYmplY3QgKmZpZWxkX29iamVjdCA9IEdldE9iamVjdChmaWVsZC0+dHlwZSgpKTsKICAgICAgICAgY29kZSArPSBBcHBlbmRTdHJ1Y3RCdWlsZGVyQm9keSgKLSAgICAgICAgICAgIGZpZWxkX29iamVjdCwgcHJlZml4ICsgTm9ybWFsaXplTmFtZShmaWVsZC0+bmFtZSgpKSArICJfIik7CisgICAgICAgICAgICBmaWVsZF9vYmplY3QsIHByZWZpeCArIG5hbWVyXy5WYXJpYWJsZShmaWVsZC0+bmFtZSgpLT5zdHIoKSkgKyAiXyIpOwogICAgICAgfSBlbHNlIHsKICAgICAgICAgY29kZSArPSAiICBidWlsZGVyOlByZXBlbmQiICsgR2VuZXJhdGVNZXRob2QoZmllbGQpICsgIigiICsgcHJlZml4ICsKLSAgICAgICAgICAgICAgICBDb252ZXJ0Q2FzZShOb3JtYWxpemVOYW1lKGZpZWxkLT5uYW1lKCkpLCBDYXNlOjprTG93ZXJDYW1lbCkgKwotICAgICAgICAgICAgICAgICIpXG4iOworICAgICAgICAgICAgICAgIG5hbWVyXy5WYXJpYWJsZShmaWVsZC0+bmFtZSgpLT5zdHIoKSkgKyAiKVxuIjsKICAgICAgIH0KICAgICB9KTsKIApAQCAtNDQ1LDkgKzQ2NCw3IEBACiAKICAgc3RkOjpzdHJpbmcgR2VuZXJhdGVNZXRob2QoY29uc3Qgcjo6RmllbGQgKmZpZWxkKSBjb25zdCB7CiAgICAgY29uc3Qgcjo6QmFzZVR5cGUgYmFzZV90eXBlID0gZmllbGQtPnR5cGUoKS0+YmFzZV90eXBlKCk7Ci0gICAgaWYgKElzU2NhbGFyKGJhc2VfdHlwZSkpIHsKLSAgICAgIHJldHVybiBDb252ZXJ0Q2FzZShHZW5lcmF0ZVR5cGUoYmFzZV90eXBlKSwgQ2FzZTo6a1VwcGVyQ2FtZWwpOwotICAgIH0KKyAgICBpZiAoSXNTY2FsYXIoYmFzZV90eXBlKSkgeyByZXR1cm4gbmFtZXJfLlR5cGUoR2VuZXJhdGVUeXBlKGJhc2VfdHlwZSkpOyB9CiAgICAgaWYgKElzU3RydWN0T3JUYWJsZShiYXNlX3R5cGUpKSB7IHJldHVybiAiU3RydWN0IjsgfQogICAgIHJldHVybiAiVU9mZnNldFRSZWxhdGl2ZSI7CiAgIH0KQEAgLTQ2MCw5ICs0NzcsNyBAQAogICAgICAgY2FzZSByOjpCYXNlVHlwZTo6VmVjdG9yOiByZXR1cm4gR2VuZXJhdGVHZXR0ZXIodHlwZSwgdHJ1ZSk7CiAgICAgICBkZWZhdWx0OgogICAgICAgICByZXR1cm4gInNlbGYudmlldzpHZXQoZmxhdGJ1ZmZlcnMuTi4iICsKLSAgICAgICAgICAgICAgIENvbnZlcnRDYXNlKEdlbmVyYXRlVHlwZSh0eXBlLCBlbGVtZW50X3R5cGUpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2FzZTo6a1VwcGVyQ2FtZWwpICsKLSAgICAgICAgICAgICAgICIsICI7CisgICAgICAgICAgICAgICBuYW1lcl8uVHlwZShHZW5lcmF0ZVR5cGUodHlwZSwgZWxlbWVudF90eXBlKSkgKyAiLCAiOwogICAgIH0KICAgfQogCkBAIC00NzQsMTAgKzQ4OSw4IEBACiAgICAgc3dpdGNoIChiYXNlX3R5cGUpIHsKICAgICAgIGNhc2Ugcjo6QmFzZVR5cGU6OlN0cmluZzogcmV0dXJuICJzdHJpbmciOwogICAgICAgY2FzZSByOjpCYXNlVHlwZTo6VmVjdG9yOiByZXR1cm4gR2VuZXJhdGVHZXR0ZXIodHlwZSwgdHJ1ZSk7Ci0gICAgICBjYXNlIHI6OkJhc2VUeXBlOjpPYmo6IHsKLSAgICAgICAgY29uc3Qgcjo6T2JqZWN0ICpvYmogPSBHZXRPYmplY3QodHlwZSk7Ci0gICAgICAgIHJldHVybiBOb3JtYWxpemVOYW1lKERlbmFtZXNwYWNlKG9iai0+bmFtZSgpKSk7Ci0gICAgICB9OworICAgICAgY2FzZSByOjpCYXNlVHlwZTo6T2JqOiByZXR1cm4gbmFtZXJfLlR5cGUobmFtZXJfLkRlbmFtZXNwYWNlKEdldE9iamVjdCh0eXBlKSkpOworCiAgICAgICBkZWZhdWx0OiByZXR1cm4gIipmbGF0YnVmZmVycy5UYWJsZSI7CiAgICAgfQogICB9CkBAIC01MTUsMTQgKzUyOCw2IEBACiAgICAgcmV0dXJuICIwIjsKICAgfQogCi0gIHN0ZDo6c3RyaW5nIE5vcm1hbGl6ZU5hbWUoY29uc3Qgc3RkOjpzdHJpbmcgbmFtZSkgY29uc3QgewotICAgIHJldHVybiBrZXl3b3Jkc18uZmluZChuYW1lKSA9PSBrZXl3b3Jkc18uZW5kKCkgPyBuYW1lIDogIl8iICsgbmFtZTsKLSAgfQotCi0gIHN0ZDo6c3RyaW5nIE5vcm1hbGl6ZU5hbWUoY29uc3QgZmxhdGJ1ZmZlcnM6OlN0cmluZyAqbmFtZSkgY29uc3QgewotICAgIHJldHVybiBOb3JtYWxpemVOYW1lKG5hbWUtPnN0cigpKTsKLSAgfQotCiAgIHZvaWQgU3RhcnRDb2RlQmxvY2soY29uc3QgcmVmbGVjdGlvbjo6RW51bSAqZW51bV9kZWYpIHsKICAgICBjdXJyZW50X2VudW1fID0gZW51bV9kZWY7CiAgICAgY3VycmVudF9vYmpfID0gbnVsbHB0cjsKQEAgLTU0NCwxMSArNTQ5LDExIEBACiAKICAgICBpZiAoSXNTdHJ1Y3RPclRhYmxlKHR5cGUpKSB7CiAgICAgICBjb25zdCByOjpPYmplY3QgKm9iamVjdCA9IEdldE9iamVjdEJ5SW5kZXgoZmllbGQtPnR5cGUoKS0+aW5kZXgoKSk7Ci0gICAgICBpZiAob2JqZWN0ID09IGN1cnJlbnRfb2JqXykgeyByZXR1cm4gRGVuYW1lc3BhY2Uob2JqZWN0LT5uYW1lKCkpOyB9CisgICAgICBpZiAob2JqZWN0ID09IGN1cnJlbnRfb2JqXykgeyByZXR1cm4gbmFtZXJfLkRlbmFtZXNwYWNlKG9iamVjdCk7IH0KICAgICAgIHR5cGVfbmFtZSA9IG9iamVjdC0+bmFtZSgpLT5zdHIoKTsKICAgICB9IGVsc2UgewogICAgICAgY29uc3Qgcjo6RW51bSAqZW51bV9kZWYgPSBHZXRFbnVtQnlJbmRleChmaWVsZC0+dHlwZSgpLT5pbmRleCgpKTsKLSAgICAgIGlmIChlbnVtX2RlZiA9PSBjdXJyZW50X2VudW1fKSB7IHJldHVybiBEZW5hbWVzcGFjZShlbnVtX2RlZi0+bmFtZSgpKTsgfQorICAgICAgaWYgKGVudW1fZGVmID09IGN1cnJlbnRfZW51bV8pIHsgcmV0dXJuIG5hbWVyXy5EZW5hbWVzcGFjZShlbnVtX2RlZik7IH0KICAgICAgIHR5cGVfbmFtZSA9IGVudW1fZGVmLT5uYW1lKCktPnN0cigpOwogICAgIH0KIApAQCAtNjAwLDcgKzYwNSw3IEBACiAgICAgLy8gTmFtZXNwYWNlcyBhcmUgJy4nIGRlbGltaW50ZWQsIHNvIHJlcGxhY2UgaXQgd2l0aCB0aGUgcGF0aCBzZXBhcmF0b3IuCiAgICAgc3RkOjpzdHJpbmcgcGF0aCA9IG5zOwogCi0gICAgaWYgKHBhdGguZW1wdHkoKSkgeworICAgIGlmIChucy5lbXB0eSgpKSB7CiAgICAgICBwYXRoID0gIi4iOwogICAgIH0gZWxzZSB7CiAgICAgICBzdGQ6OnJlcGxhY2UocGF0aC5iZWdpbigpLCBwYXRoLmVuZCgpLCAnLicsICcvJyk7CkBAIC02MDgsNyArNjEzLDcgQEAKIAogICAgIC8vIFRPRE8oZGVyZWtiYWlsZXkpOiBmaWd1cmUgb3V0IGEgc2F2ZSBmaWxlIHdpdGhvdXQgZGVwZW5kaW5nIG9uIHV0aWwuaAogICAgIEVuc3VyZURpckV4aXN0cyhwYXRoKTsKLSAgICBjb25zdCBzdGQ6OnN0cmluZyBmaWxlX25hbWUgPSBwYXRoICsgIi8iICsgbmFtZSArICIubHVhIjsKKyAgICBjb25zdCBzdGQ6OnN0cmluZyBmaWxlX25hbWUgPSBwYXRoICsgIi8iICsgbmFtZXJfLkZpbGUobmFtZSk7CiAgICAgU2F2ZUZpbGUoZmlsZV9uYW1lLmNfc3RyKCksIGNvZGUsIGZhbHNlKTsKICAgfQogCkBAIC02MTcsNiArNjIyLDcgQEAKICAgY29uc3Qgcjo6T2JqZWN0ICpjdXJyZW50X29ial87CiAgIGNvbnN0IHI6OkVudW0gKmN1cnJlbnRfZW51bV87CiAgIGNvbnN0IHN0ZDo6c3RyaW5nIGZsYXRjX3ZlcnNpb25fOworICBjb25zdCBCZmJzTmFtZXIgbmFtZXJfOwogfTsKIH0gIC8vIG5hbWVzcGFjZQogCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy9zcmMvYmZic19uYW1lci5oIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvc3JjL2JmYnNfbmFtZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYzZlNzI0Ci0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvc3JjL2JmYnNfbmFtZXIuaApAQCAtMCwwICsxLDQzIEBACisjaWZuZGVmIEZMQVRCVUZGRVJTX0JGQlNfTkFNRVIKKyNkZWZpbmUgRkxBVEJVRkZFUlNfQkZCU19OQU1FUgorCisjaW5jbHVkZSAiZmxhdGJ1ZmZlcnMvcmVmbGVjdGlvbi5oIgorI2luY2x1ZGUgIm5hbWVyLmgiCisKK25hbWVzcGFjZSBmbGF0YnVmZmVycyB7CisKKy8vIFByb3ZpZGVzIE5hbWVyIGNhcGFiaWxpdGllcyB0byB0eXBlcyBkZWZpbmVkIGluIHRoZSBmbGF0YnVmZmVycyByZWZsZWN0aW9uLgorY2xhc3MgQmZic05hbWVyIDogcHVibGljIE5hbWVyIHsKKyBwdWJsaWM6CisgIGV4cGxpY2l0IEJmYnNOYW1lcihDb25maWcgY29uZmlnLCBzdGQ6OnNldDxzdGQ6OnN0cmluZz4ga2V5d29yZHMpCisgICAgICA6IE5hbWVyKGNvbmZpZywgc3RkOjptb3ZlKGtleXdvcmRzKSkge30KKworICB1c2luZyBOYW1lcjo6Q29uc3RhbnQ7CisgIHVzaW5nIE5hbWVyOjpEZW5hbWVzcGFjZTsKKyAgdXNpbmcgTmFtZXI6OkRpcmVjdG9yaWVzOworICB1c2luZyBOYW1lcjo6RmllbGQ7CisgIHVzaW5nIE5hbWVyOjpGaWxlOworICB1c2luZyBOYW1lcjo6RnVuY3Rpb247CisgIHVzaW5nIE5hbWVyOjpNZXRob2Q7CisgIHVzaW5nIE5hbWVyOjpOYW1lc3BhY2U7CisgIHVzaW5nIE5hbWVyOjpOYW1lc3BhY2VkVHlwZTsKKyAgdXNpbmcgTmFtZXI6Ok9iamVjdFR5cGU7CisgIHVzaW5nIE5hbWVyOjpUeXBlOworICB1c2luZyBOYW1lcjo6VmFyaWFibGU7CisgIHVzaW5nIE5hbWVyOjpWYXJpYW50OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgIHN0ZDo6c3RyaW5nIERlbmFtZXNwYWNlKFQgdCwgc3RkOjpzdHJpbmcgJm5hbWVzcGFjZV9wcmVmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgZGVsaW1pdGVyID0gJy4nKSBjb25zdCB7CisgICAgcmV0dXJuIE5hbWVyOjpEZW5hbWVzcGFjZSh0LT5uYW1lKCktPmNfc3RyKCksIG5hbWVzcGFjZV9wcmVmaXgsIGRlbGltaXRlcik7CisgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICBzdGQ6OnN0cmluZyBEZW5hbWVzcGFjZShUIHQsIGNvbnN0IGNoYXIgZGVsaW1pdGVyID0gJy4nKSBjb25zdCB7CisgICAgcmV0dXJuIE5hbWVyOjpEZW5hbWVzcGFjZSh0LT5uYW1lKCktPmNfc3RyKCksIGRlbGltaXRlcik7CisgIH0KK307CisKK30gIC8vIG5hbWVzcGFjZSBmbGF0YnVmZmVycworCisjZW5kaWYgIC8vIEZMQVRCVUZGRVJTX0JGQlNfTkFNRVIKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy9zcmMvYmluYXJ5X2Fubm90YXRvci5jcHAgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy9zcmMvYmluYXJ5X2Fubm90YXRvci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGQwYjQ1NAotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3NyYy9iaW5hcnlfYW5ub3RhdG9yLmNwcApAQCAtMCwwICsxLDE0MTkgQEAKKyNpbmNsdWRlICJiaW5hcnlfYW5ub3RhdG9yLmgiCisKKyNpbmNsdWRlIDxsaW1pdHM+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHZlY3Rvcj4KKworI2luY2x1ZGUgImZsYXRidWZmZXJzL3JlZmxlY3Rpb24uaCIKKyNpbmNsdWRlICJmbGF0YnVmZmVycy92ZXJpZmllci5oIgorCituYW1lc3BhY2UgZmxhdGJ1ZmZlcnMgeworbmFtZXNwYWNlIHsKKworc3RhdGljIGJvb2wgQmluYXJ5UmVnaW9uU29ydChjb25zdCBCaW5hcnlSZWdpb24gJmEsIGNvbnN0IEJpbmFyeVJlZ2lvbiAmYikgeworICByZXR1cm4gYS5vZmZzZXQgPCBiLm9mZnNldDsKK30KKworc3RhdGljIHZvaWQgU2V0RXJyb3IoQmluYXJ5UmVnaW9uQ29tbWVudCAmY29tbWVudCwgQmluYXJ5UmVnaW9uU3RhdHVzIHN0YXR1cywKKyAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIG1lc3NhZ2UgPSAiIikgeworICBjb21tZW50LnN0YXR1cyA9IHN0YXR1czsKKyAgY29tbWVudC5zdGF0dXNfbWVzc2FnZSA9IG1lc3NhZ2U7Cit9CisKK3N0YXRpYyBCaW5hcnlSZWdpb24gTWFrZUJpbmFyeVJlZ2lvbigKKyAgICBjb25zdCB1aW50NjRfdCBvZmZzZXQgPSAwLCBjb25zdCB1aW50NjRfdCBsZW5ndGggPSAwLAorICAgIGNvbnN0IEJpbmFyeVJlZ2lvblR5cGUgdHlwZSA9IEJpbmFyeVJlZ2lvblR5cGU6OlVua25vd24sCisgICAgY29uc3QgdWludDY0X3QgYXJyYXlfbGVuZ3RoID0gMCwgY29uc3QgdWludDY0X3QgcG9pbnRzX3RvX29mZnNldCA9IDAsCisgICAgY29uc3QgQmluYXJ5UmVnaW9uQ29tbWVudCBjb21tZW50ID0ge30pIHsKKyAgQmluYXJ5UmVnaW9uIHJlZ2lvbjsKKyAgcmVnaW9uLm9mZnNldCA9IG9mZnNldDsKKyAgcmVnaW9uLmxlbmd0aCA9IGxlbmd0aDsKKyAgcmVnaW9uLnR5cGUgPSB0eXBlOworICByZWdpb24uYXJyYXlfbGVuZ3RoID0gYXJyYXlfbGVuZ3RoOworICByZWdpb24ucG9pbnRzX3RvX29mZnNldCA9IHBvaW50c190b19vZmZzZXQ7CisgIHJlZ2lvbi5jb21tZW50ID0gc3RkOjptb3ZlKGNvbW1lbnQpOworICByZXR1cm4gcmVnaW9uOworfQorCitzdGF0aWMgQmluYXJ5U2VjdGlvbiBNYWtlQmluYXJ5U2VjdGlvbigKKyAgICBjb25zdCBzdGQ6OnN0cmluZyAmbmFtZSwgY29uc3QgQmluYXJ5U2VjdGlvblR5cGUgdHlwZSwKKyAgICBjb25zdCBzdGQ6OnZlY3RvcjxCaW5hcnlSZWdpb24+IHJlZ2lvbnMpIHsKKyAgQmluYXJ5U2VjdGlvbiBzZWN0aW9uOworICBzZWN0aW9uLm5hbWUgPSBuYW1lOworICBzZWN0aW9uLnR5cGUgPSB0eXBlOworICBzZWN0aW9uLnJlZ2lvbnMgPSBzdGQ6Om1vdmUocmVnaW9ucyk7CisgIHJldHVybiBzZWN0aW9uOworfQorCitzdGF0aWMgQmluYXJ5U2VjdGlvbiBNYWtlU2luZ2xlUmVnaW9uQmluYXJ5U2VjdGlvbihjb25zdCBzdGQ6OnN0cmluZyAmbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEJpbmFyeVNlY3Rpb25UeXBlIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBCaW5hcnlSZWdpb24gJnJlZ2lvbikgeworICBzdGQ6OnZlY3RvcjxCaW5hcnlSZWdpb24+IHJlZ2lvbnM7CisgIHJlZ2lvbnMucHVzaF9iYWNrKHJlZ2lvbik7CisgIHJldHVybiBNYWtlQmluYXJ5U2VjdGlvbihuYW1lLCB0eXBlLCBzdGQ6Om1vdmUocmVnaW9ucykpOworfQorCitzdGF0aWMgYm9vbCBJc05vblplcm9SZWdpb24oY29uc3QgdWludDY0X3Qgb2Zmc2V0LCBjb25zdCB1aW50NjRfdCBsZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqY29uc3QgYmluYXJ5KSB7CisgIGZvciAodWludDY0X3QgaSA9IG9mZnNldDsgaSA8IG9mZnNldCArIGxlbmd0aDsgKytpKSB7CisgICAgaWYgKGJpbmFyeVtpXSAhPSAwKSB7IHJldHVybiB0cnVlOyB9CisgIH0KKyAgcmV0dXJuIGZhbHNlOworfQorCitzdGF0aWMgYm9vbCBJc1ByaW50YWJsZVJlZ2lvbihjb25zdCB1aW50NjRfdCBvZmZzZXQsIGNvbnN0IHVpbnQ2NF90IGxlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmNvbnN0IGJpbmFyeSkgeworICBmb3IgKHVpbnQ2NF90IGkgPSBvZmZzZXQ7IGkgPCBvZmZzZXQgKyBsZW5ndGg7ICsraSkgeworICAgIGlmICghaXNwcmludChiaW5hcnlbaV0pKSB7IHJldHVybiBmYWxzZTsgfQorICB9CisgIHJldHVybiB0cnVlOworfQorCitzdGF0aWMgQmluYXJ5U2VjdGlvbiBHZW5lcmF0ZU1pc3NpbmdTZWN0aW9uKGNvbnN0IHVpbnQ2NF90IG9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDY0X3QgbGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpjb25zdCBiaW5hcnkpIHsKKyAgc3RkOjp2ZWN0b3I8QmluYXJ5UmVnaW9uPiByZWdpb25zOworCisgIC8vIENoZWNrIGlmIHRoZSByZWdpb24gaXMgYWxsIHplcm9zIG9yIG5vdCwgYXMgdGhhdCBjYW4gdGVsbCB1cyBpZiBpdCBpcworICAvLyBwYWRkaW5nIG9yIG5vdC4KKyAgaWYgKElzTm9uWmVyb1JlZ2lvbihvZmZzZXQsIGxlbmd0aCwgYmluYXJ5KSkgeworICAgIC8vIFNvbWUgb2YgdGhlIHBhZGRpbmcgYnl0ZXMgYXJlIG5vbi16ZXJvLCBzbyB0aGlzIG1pZ2h0IGJlIGFuIHVua25vd24KKyAgICAvLyBzZWN0aW9uIG9mIHRoZSBiaW5hcnkuCisgICAgLy8gVE9ETyhkYmFpbGV5Y2hlc3MpOiBXZSBjb3VsZCBiZSBhIGJpdCBzbWFydGVyIHdpdGggZGlmZmVyZW50IHNpemVkCisgICAgLy8gYWxpZ25tZW50cy4gRm9yIG5vdywgdGhlIDggYnl0ZSBjaGVjayBlbmNvbXBhc3NlcyBhbGwgdGhlIHNtYWxsZXIKKyAgICAvLyBhbGlnbm1lbnRzLgorICAgIEJpbmFyeVJlZ2lvbkNvbW1lbnQgY29tbWVudDsKKyAgICBjb21tZW50LnR5cGUgPSBCaW5hcnlSZWdpb25Db21tZW50VHlwZTo6VW5rbm93bjsKKyAgICBpZiAobGVuZ3RoID49IDgpIHsKKyAgICAgIFNldEVycm9yKGNvbW1lbnQsIEJpbmFyeVJlZ2lvblN0YXR1czo6V0FSTl9OT19SRUZFUkVOQ0VTKTsKKyAgICB9IGVsc2UgeworICAgICAgU2V0RXJyb3IoY29tbWVudCwgQmluYXJ5UmVnaW9uU3RhdHVzOjpXQVJOX0NPUlJVUFRFRF9QQURESU5HKTsKKyAgICB9CisKKyAgICByZWdpb25zLnB1c2hfYmFjayhNYWtlQmluYXJ5UmVnaW9uKG9mZnNldCwgbGVuZ3RoICogc2l6ZW9mKHVpbnQ4X3QpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmluYXJ5UmVnaW9uVHlwZTo6VW5rbm93biwgbGVuZ3RoLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWVudCkpOworCisgICAgcmV0dXJuIE1ha2VCaW5hcnlTZWN0aW9uKCJubyBrbm93biByZWZlcmVuY2VzIiwgQmluYXJ5U2VjdGlvblR5cGU6OlVua25vd24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bW92ZShyZWdpb25zKSk7CisgIH0KKworICBCaW5hcnlSZWdpb25Db21tZW50IGNvbW1lbnQ7CisgIGNvbW1lbnQudHlwZSA9IEJpbmFyeVJlZ2lvbkNvbW1lbnRUeXBlOjpQYWRkaW5nOworICBpZiAobGVuZ3RoID49IDgpIHsKKyAgICBTZXRFcnJvcihjb21tZW50LCBCaW5hcnlSZWdpb25TdGF0dXM6OldBUk5fUEFERElOR19MRU5HVEgpOworICB9CisKKyAgLy8gVGhpcyByZWdpb24gaXMgbW9zdCBsaWtlbHkgcGFkZGluZy4KKyAgcmVnaW9ucy5wdXNoX2JhY2soTWFrZUJpbmFyeVJlZ2lvbihvZmZzZXQsIGxlbmd0aCAqIHNpemVvZih1aW50OF90KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaW5hcnlSZWdpb25UeXBlOjpVaW50OCwgbGVuZ3RoLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1lbnQpKTsKKworICByZXR1cm4gTWFrZUJpbmFyeVNlY3Rpb24oIiIsIEJpbmFyeVNlY3Rpb25UeXBlOjpQYWRkaW5nLCBzdGQ6Om1vdmUocmVnaW9ucykpOworfQorCit9ICAvLyBuYW1lc3BhY2UKKworc3RkOjptYXA8dWludDY0X3QsIEJpbmFyeVNlY3Rpb24+IEJpbmFyeUFubm90YXRvcjo6QW5ub3RhdGUoKSB7CisgIGZsYXRidWZmZXJzOjpWZXJpZmllciB2ZXJpZmllcihiZmJzXywgc3RhdGljX2Nhc3Q8c2l6ZV90PihiZmJzX2xlbmd0aF8pKTsKKyAgaWYgKCFyZWZsZWN0aW9uOjpWZXJpZnlTY2hlbWFCdWZmZXIodmVyaWZpZXIpKSB7IHJldHVybiB7fTsgfQorCisgIC8vIFRoZSBiaW5hcnkgaXMgdG9vIHNob3J0IHRvIHJlYWQgYXMgYSBmbGF0YnVmZmVycy4KKyAgLy8gVE9ETyhkYmFpbGV5Y2hlc3MpOiBXZSBjb3VsZCBzcGl0IG91dCB0aGUgYW5ub3RhdGVkIGJ1ZmZlciBzZWN0aW9ucywgYnV0CisgIC8vIEknbSBub3Qgc3VyZSBpZiBpdCBpcyB3b3J0aCBpdC4KKyAgaWYgKGJpbmFyeV9sZW5ndGhfIDwgNCkgeyByZXR1cm4ge307IH0KKworICAvLyBNYWtlIHN1cmUgd2Ugc3RhcnQgd2l0aCBhIGNsZWFuIHNsYXRlLgorICB2dGFibGVzXy5jbGVhcigpOworICBzZWN0aW9uc18uY2xlYXIoKTsKKworICAvLyBGaXJzdCBwYXJzZSB0aGUgaGVhZGVyIHJlZ2lvbiB3aGljaCBhbHdheXMgc3RhcnQgYXQgb2Zmc2V0IDAuCisgIC8vIFRoZSByZXR1cm5lZCBvZmZzZXQgd2lsbCBwb2ludCB0byB0aGUgcm9vdF90YWJsZSBsb2NhdGlvbi4KKyAgY29uc3QgdWludDY0X3Qgcm9vdF90YWJsZV9vZmZzZXQgPSBCdWlsZEhlYWRlcigwKTsKKworICBpZiAoSXNWYWxpZE9mZnNldChyb290X3RhYmxlX29mZnNldCkpIHsKKyAgICAvLyBCdWlsZCB0aGUgcm9vdCB0YWJsZSwgYW5kIGFsbCBlbHNlIHdpbGwgYmUgcmVmZXJlbmNlZCBmcm9tIGl0LgorICAgIEJ1aWxkVGFibGUocm9vdF90YWJsZV9vZmZzZXQsIEJpbmFyeVNlY3Rpb25UeXBlOjpSb290VGFibGUsCisgICAgICAgICAgICAgICBzY2hlbWFfLT5yb290X3RhYmxlKCkpOworICB9CisKKyAgLy8gTm93IHRoYXQgYWxsIHRoZSBzZWN0aW9ucyBhcmUgYnVpbHQsIG1ha2Ugc3VyZSB0aGUgYmluYXJ5IHNlY3Rpb25zIGFyZQorICAvLyBjb250aWd1b3VzLgorICBGaXhNaXNzaW5nUmVnaW9ucygpOworCisgIC8vIFRoZW4gc2NhbiB0aGUgYXJlYSBiZXR3ZWVuIEJpbmFyeVNlY3Rpb25zIGluc2VydCBwYWRkaW5nIHNlY3Rpb25zIHRoYXQgYXJlCisgIC8vIGltcGxpZWQuCisgIEZpeE1pc3NpbmdTZWN0aW9ucygpOworCisgIHJldHVybiBzZWN0aW9uc187Cit9CisKK3VpbnQ2NF90IEJpbmFyeUFubm90YXRvcjo6QnVpbGRIZWFkZXIoY29uc3QgdWludDY0X3QgaGVhZGVyX29mZnNldCkgeworICBjb25zdCBhdXRvIHJvb3RfdGFibGVfb2Zmc2V0ID0gUmVhZFNjYWxhcjx1aW50MzJfdD4oaGVhZGVyX29mZnNldCk7CisKKyAgaWYgKCFyb290X3RhYmxlX29mZnNldC5oYXNfdmFsdWUoKSkgeworICAgIC8vIFRoaXMgc2hvdWxkbid0IG9jY3VyLCBzaW5jZSB3ZSB2YWxpZGF0ZSB0aGUgbWluIHNpemUgb2YgdGhlIGJ1ZmZlcgorICAgIC8vIGJlZm9yZS4gQnV0IGZvciBjb21wbGV0aW9uIHNha2UsIHdlIHNob3VsZG4ndCByZWFkIHBhc3NlZCB0aGUgYmluYXJ5IGVuZC4KKyAgICByZXR1cm4gc3RkOjpudW1lcmljX2xpbWl0czx1aW50NjRfdD46Om1heCgpOworICB9CisKKyAgc3RkOjp2ZWN0b3I8QmluYXJ5UmVnaW9uPiByZWdpb25zOworICB1aW50NjRfdCBvZmZzZXQgPSBoZWFkZXJfb2Zmc2V0OworICAvLyBUT0RPKGRiYWlsZXljaGVzcyk6IHNpemVkIHByZWZpeGVkIHZhbHVlCisKKyAgQmluYXJ5UmVnaW9uQ29tbWVudCByb290X29mZnNldF9jb21tZW50OworICByb290X29mZnNldF9jb21tZW50LnR5cGUgPSBCaW5hcnlSZWdpb25Db21tZW50VHlwZTo6Um9vdFRhYmxlT2Zmc2V0OworICByb290X29mZnNldF9jb21tZW50Lm5hbWUgPSBzY2hlbWFfLT5yb290X3RhYmxlKCktPm5hbWUoKS0+c3RyKCk7CisKKyAgaWYgKCFJc1ZhbGlkT2Zmc2V0KHJvb3RfdGFibGVfb2Zmc2V0LnZhbHVlKCkpKSB7CisgICAgU2V0RXJyb3Iocm9vdF9vZmZzZXRfY29tbWVudCwKKyAgICAgICAgICAgICBCaW5hcnlSZWdpb25TdGF0dXM6OkVSUk9SX09GRlNFVF9PVVRfT0ZfQklOQVJZKTsKKyAgfQorCisgIHJlZ2lvbnMucHVzaF9iYWNrKAorICAgICAgTWFrZUJpbmFyeVJlZ2lvbihvZmZzZXQsIHNpemVvZih1aW50MzJfdCksIEJpbmFyeVJlZ2lvblR5cGU6OlVPZmZzZXQsIDAsCisgICAgICAgICAgICAgICAgICAgICAgIHJvb3RfdGFibGVfb2Zmc2V0LnZhbHVlKCksIHJvb3Rfb2Zmc2V0X2NvbW1lbnQpKTsKKyAgb2Zmc2V0ICs9IHNpemVvZih1aW50MzJfdCk7CisKKyAgaWYgKElzVmFsaWRSZWFkKG9mZnNldCwgZmxhdGJ1ZmZlcnM6OmtGaWxlSWRlbnRpZmllckxlbmd0aCkgJiYKKyAgICAgIElzUHJpbnRhYmxlUmVnaW9uKG9mZnNldCwgZmxhdGJ1ZmZlcnM6OmtGaWxlSWRlbnRpZmllckxlbmd0aCwgYmluYXJ5XykpIHsKKyAgICBCaW5hcnlSZWdpb25Db21tZW50IGNvbW1lbnQ7CisgICAgY29tbWVudC50eXBlID0gQmluYXJ5UmVnaW9uQ29tbWVudFR5cGU6OkZpbGVJZGVudGlmaWVyOworICAgIC8vIENoZWNrIGlmIHRoZSBmaWxlIGlkZW50aWZpZXIgcmVnaW9uIGhhcyBub24temVybyBkYXRhLCBhbmQgYXNzdW1lIGl0cworICAgIC8vIHRoZSBmaWxlIGlkZW50aWZpZXIuIE90aGVyd2lzZSwgaXQgd2lsbCBnZXQgZmlsbGVkIGluIHdpdGggcGFkZGluZworICAgIC8vIGxhdGVyLgorICAgIHJlZ2lvbnMucHVzaF9iYWNrKE1ha2VCaW5hcnlSZWdpb24oCisgICAgICAgIG9mZnNldCwgZmxhdGJ1ZmZlcnM6OmtGaWxlSWRlbnRpZmllckxlbmd0aCAqIHNpemVvZih1aW50OF90KSwKKyAgICAgICAgQmluYXJ5UmVnaW9uVHlwZTo6Q2hhciwgZmxhdGJ1ZmZlcnM6OmtGaWxlSWRlbnRpZmllckxlbmd0aCwgMCwKKyAgICAgICAgY29tbWVudCkpOworICB9CisKKyAgQWRkU2VjdGlvbihoZWFkZXJfb2Zmc2V0LCBNYWtlQmluYXJ5U2VjdGlvbigiIiwgQmluYXJ5U2VjdGlvblR5cGU6OkhlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1vdmUocmVnaW9ucykpKTsKKworICByZXR1cm4gcm9vdF90YWJsZV9vZmZzZXQudmFsdWUoKTsKK30KKwordm9pZCBCaW5hcnlBbm5vdGF0b3I6OkJ1aWxkVlRhYmxlKGNvbnN0IHVpbnQ2NF90IHZ0YWJsZV9vZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVmbGVjdGlvbjo6T2JqZWN0ICpjb25zdCB0YWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50NjRfdCBvZmZzZXRfb2ZfcmVmZXJyaW5nX3RhYmxlKSB7CisgIC8vIEZpcnN0IHNlZSBpZiB3ZSBoYXZlIHVzZWQgdGhpcyB2dGFibGUgYmVmb3JlLCBpZiBzbyBza2lwIGJ1aWxkaW5nIGl0IGFnYWluLgorICBhdXRvIGl0ID0gdnRhYmxlc18uZmluZCh2dGFibGVfb2Zmc2V0KTsKKyAgaWYgKGl0ICE9IHZ0YWJsZXNfLmVuZCgpKSB7IHJldHVybjsgfQorCisgIGlmIChDb250YWluc1NlY3Rpb24odnRhYmxlX29mZnNldCkpIHsgcmV0dXJuOyB9CisKKyAgQmluYXJ5UmVnaW9uQ29tbWVudCB2dGFibGVfc2l6ZV9jb21tZW50OworICB2dGFibGVfc2l6ZV9jb21tZW50LnR5cGUgPSBCaW5hcnlSZWdpb25Db21tZW50VHlwZTo6VlRhYmxlU2l6ZTsKKworICBjb25zdCBhdXRvIHZ0YWJsZV9sZW5ndGggPSBSZWFkU2NhbGFyPHVpbnQxNl90Pih2dGFibGVfb2Zmc2V0KTsKKyAgaWYgKCF2dGFibGVfbGVuZ3RoLmhhc192YWx1ZSgpKSB7CisgICAgY29uc3QgdWludDY0X3QgcmVtYWluaW5nID0gUmVtYWluaW5nQnl0ZXModnRhYmxlX29mZnNldCk7CisKKyAgICBTZXRFcnJvcih2dGFibGVfc2l6ZV9jb21tZW50LCBCaW5hcnlSZWdpb25TdGF0dXM6OkVSUk9SX0lOQ09NUExFVEVfQklOQVJZLAorICAgICAgICAgICAgICIyIik7CisKKyAgICBBZGRTZWN0aW9uKHZ0YWJsZV9vZmZzZXQsCisgICAgICAgICAgICAgICBNYWtlU2luZ2xlUmVnaW9uQmluYXJ5U2VjdGlvbigKKyAgICAgICAgICAgICAgICAgICB0YWJsZS0+bmFtZSgpLT5zdHIoKSwgQmluYXJ5U2VjdGlvblR5cGU6OlZUYWJsZSwKKyAgICAgICAgICAgICAgICAgICBNYWtlQmluYXJ5UmVnaW9uKHZ0YWJsZV9vZmZzZXQsIHJlbWFpbmluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpbmFyeVJlZ2lvblR5cGU6OlVua25vd24sIHJlbWFpbmluZywgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZ0YWJsZV9zaXplX2NvbW1lbnQpKSk7CisgICAgcmV0dXJuOworICB9CisKKyAgLy8gVnRhYmxlcyBzdGFydCB3aXRoIHRoZSBzaXplIG9mIHRoZSB2dGFibGUKKyAgY29uc3QgdWludDE2X3QgdnRhYmxlX3NpemUgPSB2dGFibGVfbGVuZ3RoLnZhbHVlKCk7CisKKyAgaWYgKCFJc1ZhbGlkT2Zmc2V0KHZ0YWJsZV9vZmZzZXQgKyB2dGFibGVfc2l6ZSAtIDEpKSB7CisgICAgU2V0RXJyb3IodnRhYmxlX3NpemVfY29tbWVudCwgQmluYXJ5UmVnaW9uU3RhdHVzOjpFUlJPUl9MRU5HVEhfVE9PX0xPTkcpOworICAgIC8vIFRoZSB2dGFibGVfc2l6ZSBwb2ludHMgdG8gb2ZmIHRoZSBlbmQgb2YgdGhlIGJpbmFyeS4KKyAgICBBZGRTZWN0aW9uKHZ0YWJsZV9vZmZzZXQsCisgICAgICAgICAgICAgICBNYWtlU2luZ2xlUmVnaW9uQmluYXJ5U2VjdGlvbigKKyAgICAgICAgICAgICAgICAgICB0YWJsZS0+bmFtZSgpLT5zdHIoKSwgQmluYXJ5U2VjdGlvblR5cGU6OlZUYWJsZSwKKyAgICAgICAgICAgICAgICAgICBNYWtlQmluYXJ5UmVnaW9uKHZ0YWJsZV9vZmZzZXQsIHNpemVvZih1aW50MTZfdCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaW5hcnlSZWdpb25UeXBlOjpVaW50MTYsIDAsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2dGFibGVfc2l6ZV9jb21tZW50KSkpOworCisgICAgcmV0dXJuOworICB9IGVsc2UgaWYgKHZ0YWJsZV9zaXplIDwgMiAqIHNpemVvZih1aW50MTZfdCkpIHsKKyAgICBTZXRFcnJvcih2dGFibGVfc2l6ZV9jb21tZW50LCBCaW5hcnlSZWdpb25TdGF0dXM6OkVSUk9SX0xFTkdUSF9UT09fU0hPUlQsCisgICAgICAgICAgICAgIjQiKTsKKyAgICAvLyBUaGUgc2l6ZSBpbmNsdWRlcyBpdHNlbGYgYW5kIHRoZSB0YWJsZSBzaXplIHdoaWNoIGFyZSBib3RoIHVpbnQxNl90LgorICAgIEFkZFNlY3Rpb24odnRhYmxlX29mZnNldCwKKyAgICAgICAgICAgICAgIE1ha2VTaW5nbGVSZWdpb25CaW5hcnlTZWN0aW9uKAorICAgICAgICAgICAgICAgICAgIHRhYmxlLT5uYW1lKCktPnN0cigpLCBCaW5hcnlTZWN0aW9uVHlwZTo6VlRhYmxlLAorICAgICAgICAgICAgICAgICAgIE1ha2VCaW5hcnlSZWdpb24odnRhYmxlX29mZnNldCwgc2l6ZW9mKHVpbnQxNl90KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpbmFyeVJlZ2lvblR5cGU6OlVpbnQxNiwgMCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZ0YWJsZV9zaXplX2NvbW1lbnQpKSk7CisgICAgcmV0dXJuOworICB9CisKKyAgc3RkOjp2ZWN0b3I8QmluYXJ5UmVnaW9uPiByZWdpb25zOworCisgIHJlZ2lvbnMucHVzaF9iYWNrKE1ha2VCaW5hcnlSZWdpb24odnRhYmxlX29mZnNldCwgc2l6ZW9mKHVpbnQxNl90KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaW5hcnlSZWdpb25UeXBlOjpVaW50MTYsIDAsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdnRhYmxlX3NpemVfY29tbWVudCkpOworICB1aW50NjRfdCBvZmZzZXQgPSB2dGFibGVfb2Zmc2V0ICsgc2l6ZW9mKHVpbnQxNl90KTsKKworICBCaW5hcnlSZWdpb25Db21tZW50IHJlZl90YWJsZV9sZW5fY29tbWVudDsKKyAgcmVmX3RhYmxlX2xlbl9jb21tZW50LnR5cGUgPQorICAgICAgQmluYXJ5UmVnaW9uQ29tbWVudFR5cGU6OlZUYWJsZVJlZmZlcmluZ1RhYmxlTGVuZ3RoOworCisgIC8vIEVuc3VyZSB3ZSBjYW4gcmVhZCB0aGUgbmV4dCB1aW50MTZfdCBmaWVsZCwgd2hpY2ggaXMgdGhlIHNpemUgb2YgdGhlCisgIC8vIHJlZmVycmluZyB0YWJsZS4KKyAgY29uc3QgYXV0byB0YWJsZV9sZW5ndGggPSBSZWFkU2NhbGFyPHVpbnQxNl90PihvZmZzZXQpOworCisgIGlmICghdGFibGVfbGVuZ3RoLmhhc192YWx1ZSgpKSB7CisgICAgY29uc3QgdWludDY0X3QgcmVtYWluaW5nID0gUmVtYWluaW5nQnl0ZXMob2Zmc2V0KTsKKyAgICBTZXRFcnJvcihyZWZfdGFibGVfbGVuX2NvbW1lbnQsIEJpbmFyeVJlZ2lvblN0YXR1czo6RVJST1JfSU5DT01QTEVURV9CSU5BUlksCisgICAgICAgICAgICAgIjIiKTsKKworICAgIEFkZFNlY3Rpb24ob2Zmc2V0LCBNYWtlU2luZ2xlUmVnaW9uQmluYXJ5U2VjdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhYmxlLT5uYW1lKCktPnN0cigpLCBCaW5hcnlTZWN0aW9uVHlwZTo6VlRhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFrZUJpbmFyeVJlZ2lvbigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQsIHJlbWFpbmluZywgQmluYXJ5UmVnaW9uVHlwZTo6VW5rbm93biwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZW1haW5pbmcsIDAsIHJlZl90YWJsZV9sZW5fY29tbWVudCkpKTsKKyAgICByZXR1cm47CisgIH0KKworICAvLyBUaGVuIHRoZXkgaGF2ZSB0aGUgc2l6ZSBvZiB0aGUgdGFibGUgdGhleSByZWZlcmVuY2UuCisgIGNvbnN0IHVpbnQxNl90IHRhYmxlX3NpemUgPSB0YWJsZV9sZW5ndGgudmFsdWUoKTsKKworICBpZiAoIUlzVmFsaWRPZmZzZXQob2Zmc2V0X29mX3JlZmVycmluZ190YWJsZSArIHRhYmxlX3NpemUgLSAxKSkgeworICAgIFNldEVycm9yKHJlZl90YWJsZV9sZW5fY29tbWVudCwgQmluYXJ5UmVnaW9uU3RhdHVzOjpFUlJPUl9MRU5HVEhfVE9PX0xPTkcpOworICB9IGVsc2UgaWYgKHRhYmxlX3NpemUgPCA0KSB7CisgICAgU2V0RXJyb3IocmVmX3RhYmxlX2xlbl9jb21tZW50LCBCaW5hcnlSZWdpb25TdGF0dXM6OkVSUk9SX0xFTkdUSF9UT09fU0hPUlQsCisgICAgICAgICAgICAgIjQiKTsKKyAgfQorCisgIHJlZ2lvbnMucHVzaF9iYWNrKE1ha2VCaW5hcnlSZWdpb24ob2Zmc2V0LCBzaXplb2YodWludDE2X3QpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpbmFyeVJlZ2lvblR5cGU6OlVpbnQxNiwgMCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWZfdGFibGVfbGVuX2NvbW1lbnQpKTsKKyAgb2Zmc2V0ICs9IHNpemVvZih1aW50MTZfdCk7CisKKyAgY29uc3QgdWludDY0X3Qgb2Zmc2V0X3N0YXJ0ID0gb2Zmc2V0OworCisgIC8vIEEgbWFwcGluZyBiZXR3ZWVuIGZpZWxkIChhbmQgaXRzIGlkKSB0byB0aGUgcmVsYXRpdmUgb2Zmc2V0ICh1aW4xNl90KSBmcm9tCisgIC8vIHRoZSBzdGFydCBvZiB0aGUgdGFibGUuCisgIHN0ZDo6bWFwPHVpbnQxNl90LCBWVGFibGU6OkVudHJ5PiBmaWVsZHM7CisKKyAgLy8gQ291bnRlciBmb3IgZGV0ZXJtaW5pbmcgaWYgdGhlIGJpbmFyeSBoYXMgbW9yZSB2dGFibGUgZW50cmllcyB0aGFuIHRoZQorICAvLyBzY2hlbWEgcHJvdmlkZWQuIFRoaXMgY2FuIG9jY3VyIGlmIHRoZSBiaW5hcnkgd2FzIGNyZWF0ZWQgYXQgYSBuZXdlciBzY2hlbWEKKyAgLy8gdmVyc2lvbiBhbmQgaXMgYmVpbmcgcHJvY2Vzc2VkIHdpdGggYW4gb2xkZXIgb25lLgorICB1aW50MTZfdCBmaWVsZHNfcHJvY2Vzc2VkID0gMDsKKworICAvLyBMb29wIG92ZXIgYWxsIHRoZSBmaWVsZHMuCisgIEZvckFsbEZpZWxkcyh0YWJsZSwgLypyZXZlcnNlPSovZmFsc2UsIFsmXShjb25zdCByZWZsZWN0aW9uOjpGaWVsZCAqZmllbGQpIHsKKyAgICBjb25zdCB1aW50NjRfdCBmaWVsZF9vZmZzZXQgPSBvZmZzZXRfc3RhcnQgKyBmaWVsZC0+aWQoKSAqIHNpemVvZih1aW50MTZfdCk7CisKKyAgICBpZiAoZmllbGRfb2Zmc2V0ID49IHZ0YWJsZV9vZmZzZXQgKyB2dGFibGVfc2l6ZSkgeworICAgICAgLy8gVGhpcyBmaWVsZF9vZmZzZXQgaXMgdG9vIGxhcmdlIGZvciB0aGlzIHZ0YWJsZSwgc28gaXQgbXVzdCBjb21lIGZyb20gYQorICAgICAgLy8gbmV3ZXIgc2NoZW1hIHRoYW4gdGhlIGJpbmFyeSB3YXMgY3JlYXRlIHdpdGggb3IgdGhlIGJpbmFyeSB3cml0ZXIgZGlkCisgICAgICAvLyBub3Qgd3JpdGUgaXQuIEZvciBlaXRoZXIgY2FzZSwgaXQgaXMgc2FmZSB0byBpZ25vcmUuCisKKyAgICAgIC8vIFRPRE8oZGJhaWxleWNoZXNzKTogV2UgY291bGQgc2hvdyB3aGljaCBmaWVsZHMgYXJlIG5vdCBzZXQgYW4gdGhlaXIKKyAgICAgIC8vIGRlZmF1bHQgdmFsdWVzIGlmIHdlIHdhbnQuIFdlIGp1c3QgbmVlZCBhIHdheSB0byBtYWtlIGl0IG9idmlvdXMgdGhhdAorICAgICAgLy8gaXQgaXNuJ3QgcGFydCBvZiB0aGUgYnVmZmVyLgorICAgICAgcmV0dXJuOworICAgIH0KKworICAgIEJpbmFyeVJlZ2lvbkNvbW1lbnQgZmllbGRfY29tbWVudDsKKyAgICBmaWVsZF9jb21tZW50LnR5cGUgPSBCaW5hcnlSZWdpb25Db21tZW50VHlwZTo6VlRhYmxlRmllbGRPZmZzZXQ7CisgICAgZmllbGRfY29tbWVudC5uYW1lID0gc3RkOjpzdHJpbmcoZmllbGQtPm5hbWUoKS0+Y19zdHIoKSkgKworICAgICAgICAgICAgICAgICAgICAgICAgICJgIChpZDogIiArIHN0ZDo6dG9fc3RyaW5nKGZpZWxkLT5pZCgpKSArICIpIjsKKworICAgIGNvbnN0IGF1dG8gb2Zmc2V0X2Zyb21fdGFibGUgPSBSZWFkU2NhbGFyPHVpbnQxNl90PihmaWVsZF9vZmZzZXQpOworCisgICAgaWYgKCFvZmZzZXRfZnJvbV90YWJsZS5oYXNfdmFsdWUoKSkgeworICAgICAgY29uc3QgdWludDY0X3QgcmVtYWluaW5nID0gUmVtYWluaW5nQnl0ZXMoZmllbGRfb2Zmc2V0KTsKKworICAgICAgU2V0RXJyb3IoZmllbGRfY29tbWVudCwgQmluYXJ5UmVnaW9uU3RhdHVzOjpFUlJPUl9JTkNPTVBMRVRFX0JJTkFSWSwgIjIiKTsKKyAgICAgIHJlZ2lvbnMucHVzaF9iYWNrKE1ha2VCaW5hcnlSZWdpb24oZmllbGRfb2Zmc2V0LCByZW1haW5pbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpbmFyeVJlZ2lvblR5cGU6OlVua25vd24sIHJlbWFpbmluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgZmllbGRfY29tbWVudCkpOworCisgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKCFJc1ZhbGlkT2Zmc2V0KG9mZnNldF9vZl9yZWZlcnJpbmdfdGFibGUgKyBvZmZzZXRfZnJvbV90YWJsZS52YWx1ZSgpIC0KKyAgICAgICAgICAgICAgICAgICAgICAgMSkpIHsKKyAgICAgIFNldEVycm9yKGZpZWxkX2NvbW1lbnQsIEJpbmFyeVJlZ2lvblN0YXR1czo6RVJST1JfT0ZGU0VUX09VVF9PRl9CSU5BUlkpOworICAgICAgcmVnaW9ucy5wdXNoX2JhY2soTWFrZUJpbmFyeVJlZ2lvbihmaWVsZF9vZmZzZXQsIHNpemVvZih1aW50MTZfdCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpbmFyeVJlZ2lvblR5cGU6OlZPZmZzZXQsIDAsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkX2NvbW1lbnQpKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBWVGFibGU6OkVudHJ5IGVudHJ5OworICAgIGVudHJ5LmZpZWxkID0gZmllbGQ7CisgICAgZW50cnkub2Zmc2V0X2Zyb21fdGFibGUgPSBvZmZzZXRfZnJvbV90YWJsZS52YWx1ZSgpOworICAgIGZpZWxkcy5pbnNlcnQoc3RkOjptYWtlX3BhaXIoZmllbGQtPmlkKCksIGVudHJ5KSk7CisKKyAgICBzdGQ6OnN0cmluZyBkZWZhdWx0X2xhYmVsOworICAgIGlmIChvZmZzZXRfZnJvbV90YWJsZS52YWx1ZSgpID09IDApIHsKKyAgICAgIC8vIE5vdCBwcmVzZW50LCBzbyBjb3VsZCBiZSBkZWZhdWx0IG9yIGJlIG9wdGlvbmFsLgorICAgICAgaWYgKGZpZWxkLT5yZXF1aXJlZCgpKSB7CisgICAgICAgIFNldEVycm9yKGZpZWxkX2NvbW1lbnQsCisgICAgICAgICAgICAgICAgIEJpbmFyeVJlZ2lvblN0YXR1czo6RVJST1JfUkVRVUlSRURfRklFTERfTk9UX1BSRVNFTlQpOworICAgICAgICAvLyBJZiB0aGlzIGlzIGEgcmVxdWlyZWQgZmllbGQsIG1ha2UgaXQga25vd24gdGhpcyBpcyBhbiBlcnJvci4KKyAgICAgICAgcmVnaW9ucy5wdXNoX2JhY2soTWFrZUJpbmFyeVJlZ2lvbihmaWVsZF9vZmZzZXQsIHNpemVvZih1aW50MTZfdCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmluYXJ5UmVnaW9uVHlwZTo6Vk9mZnNldCwgMCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZF9jb21tZW50KSk7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIC8vIEl0cyBhbiBvcHRpb25hbCBmaWVsZCwgc28gZ2V0IHRoZSBkZWZhdWx0IHZhbHVlIGFuZCBpbnRlcnByZXQgYW5kCisgICAgICAgIC8vIHByb3ZpZGVkIGFuIGFubm90YXRpb24gZm9yIGl0LgorICAgICAgICBpZiAoSXNTY2FsYXIoZmllbGQtPnR5cGUoKS0+YmFzZV90eXBlKCkpKSB7CisgICAgICAgICAgZGVmYXVsdF9sYWJlbCArPSAiPGRlZmF1bHRzIHRvICI7CisgICAgICAgICAgZGVmYXVsdF9sYWJlbCArPSBJc0Zsb2F0KGZpZWxkLT50eXBlKCktPmJhc2VfdHlwZSgpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gc3RkOjp0b19zdHJpbmcoZmllbGQtPmRlZmF1bHRfcmVhbCgpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogc3RkOjp0b19zdHJpbmcoZmllbGQtPmRlZmF1bHRfaW50ZWdlcigpKTsKKyAgICAgICAgICBkZWZhdWx0X2xhYmVsICs9ICI+ICgiOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGRlZmF1bHRfbGFiZWwgKz0gIjxudWxsPiAoIjsKKyAgICAgICAgfQorICAgICAgICBkZWZhdWx0X2xhYmVsICs9CisgICAgICAgICAgICByZWZsZWN0aW9uOjpFbnVtTmFtZUJhc2VUeXBlKGZpZWxkLT50eXBlKCktPmJhc2VfdHlwZSgpKTsKKyAgICAgICAgZGVmYXVsdF9sYWJlbCArPSAiKSI7CisgICAgICB9CisgICAgfQorICAgIGZpZWxkX2NvbW1lbnQuZGVmYXVsdF92YWx1ZSA9IGRlZmF1bHRfbGFiZWw7CisKKyAgICByZWdpb25zLnB1c2hfYmFjayhNYWtlQmluYXJ5UmVnaW9uKGZpZWxkX29mZnNldCwgc2l6ZW9mKHVpbnQxNl90KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpbmFyeVJlZ2lvblR5cGU6OlZPZmZzZXQsIDAsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZF9jb21tZW50KSk7CisKKyAgICBmaWVsZHNfcHJvY2Vzc2VkKys7CisgIH0pOworCisgIC8vIENoZWNrIGlmIHdlIGNvdmVyZWQgYWxsIHRoZSBleHBlY3RhbnQgZmllbGRzLiBJZiBub3QsIHdlIG5lZWQgdG8gYWRkIHRoZW0KKyAgLy8gYXMgdW5rbm93biBmaWVsZHMuCisgIHVpbnQxNl90IGV4cGVjdGFudF92dGFibGVfZmllbGRzID0KKyAgICAgICh2dGFibGVfc2l6ZSAtIHNpemVvZih1aW50MTZfdCkgLSBzaXplb2YodWludDE2X3QpKSAvIHNpemVvZih1aW50MTZfdCk7CisKKyAgLy8gUHJldmVudCBhIGJhZCBiaW5hcnkgZnJvbSBkZWNsYXJpbmcgYSByZWFsbHkgbGFyZ2UgdnRhYmxlX3NpemUsIHRoYXQgd2UgY2FuCisgIC8vIG5vdCBpbmRwZW5kZW50bHkgdmVyaWZ5LgorICBleHBlY3RhbnRfdnRhYmxlX2ZpZWxkcyA9IHN0ZDo6bWluKAorICAgICAgc3RhdGljX2Nhc3Q8dWludDE2X3Q+KGZpZWxkc19wcm9jZXNzZWQgKiAzKSwgZXhwZWN0YW50X3Z0YWJsZV9maWVsZHMpOworCisgIGZvciAodWludDE2X3QgaWQgPSBmaWVsZHNfcHJvY2Vzc2VkOyBpZCA8IGV4cGVjdGFudF92dGFibGVfZmllbGRzOyArK2lkKSB7CisgICAgY29uc3QgdWludDY0X3QgZmllbGRfb2Zmc2V0ID0gb2Zmc2V0X3N0YXJ0ICsgaWQgKiBzaXplb2YodWludDE2X3QpOworCisgICAgY29uc3QgYXV0byBvZmZzZXRfZnJvbV90YWJsZSA9IFJlYWRTY2FsYXI8dWludDE2X3Q+KGZpZWxkX29mZnNldCk7CisKKyAgICBCaW5hcnlSZWdpb25Db21tZW50IGZpZWxkX2NvbW1lbnQ7CisgICAgZmllbGRfY29tbWVudC50eXBlID0gQmluYXJ5UmVnaW9uQ29tbWVudFR5cGU6OlZUYWJsZVVua25vd25GaWVsZE9mZnNldDsKKyAgICBmaWVsZF9jb21tZW50LmluZGV4ID0gaWQ7CisKKyAgICBpZiAoIW9mZnNldF9mcm9tX3RhYmxlLmhhc192YWx1ZSgpKSB7CisgICAgICBjb25zdCB1aW50NjRfdCByZW1haW5pbmcgPSBSZW1haW5pbmdCeXRlcyhmaWVsZF9vZmZzZXQpOworICAgICAgU2V0RXJyb3IoZmllbGRfY29tbWVudCwgQmluYXJ5UmVnaW9uU3RhdHVzOjpFUlJPUl9JTkNPTVBMRVRFX0JJTkFSWSwgIjIiKTsKKyAgICAgIHJlZ2lvbnMucHVzaF9iYWNrKE1ha2VCaW5hcnlSZWdpb24oZmllbGRfb2Zmc2V0LCByZW1haW5pbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpbmFyeVJlZ2lvblR5cGU6OlVua25vd24sIHJlbWFpbmluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgZmllbGRfY29tbWVudCkpOworICAgICAgY29udGludWU7CisgICAgfQorCisgICAgVlRhYmxlOjpFbnRyeSBlbnRyeTsKKyAgICBlbnRyeS5maWVsZCA9IG51bGxwdHI7ICAvLyBObyBmaWVsZCB0byByZWZlcmVuY2UuCisgICAgZW50cnkub2Zmc2V0X2Zyb21fdGFibGUgPSBvZmZzZXRfZnJvbV90YWJsZS52YWx1ZSgpOworICAgIGZpZWxkcy5pbnNlcnQoc3RkOjptYWtlX3BhaXIoaWQsIGVudHJ5KSk7CisKKyAgICByZWdpb25zLnB1c2hfYmFjayhNYWtlQmluYXJ5UmVnaW9uKGZpZWxkX29mZnNldCwgc2l6ZW9mKHVpbnQxNl90KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpbmFyeVJlZ2lvblR5cGU6OlZPZmZzZXQsIDAsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZF9jb21tZW50KSk7CisgIH0KKworICBzZWN0aW9uc19bdnRhYmxlX29mZnNldF0gPSBNYWtlQmluYXJ5U2VjdGlvbigKKyAgICAgIHRhYmxlLT5uYW1lKCktPnN0cigpLCBCaW5hcnlTZWN0aW9uVHlwZTo6VlRhYmxlLCBzdGQ6Om1vdmUocmVnaW9ucykpOworCisgIFZUYWJsZSB2dGFibGU7CisgIHZ0YWJsZS5maWVsZHMgPSBzdGQ6Om1vdmUoZmllbGRzKTsKKyAgdnRhYmxlLnRhYmxlX3NpemUgPSB0YWJsZV9zaXplOworICB2dGFibGUudnRhYmxlX3NpemUgPSB2dGFibGVfc2l6ZTsKKworICB2dGFibGVzX1t2dGFibGVfb2Zmc2V0XSA9IHZ0YWJsZTsKK30KKwordm9pZCBCaW5hcnlBbm5vdGF0b3I6OkJ1aWxkVGFibGUoY29uc3QgdWludDY0X3QgdGFibGVfb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQmluYXJ5U2VjdGlvblR5cGUgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlZmxlY3Rpb246Ok9iamVjdCAqY29uc3QgdGFibGUpIHsKKyAgaWYgKENvbnRhaW5zU2VjdGlvbih0YWJsZV9vZmZzZXQpKSB7IHJldHVybjsgfQorCisgIEJpbmFyeVJlZ2lvbkNvbW1lbnQgdnRhYmxlX29mZnNldF9jb21tZW50OworICB2dGFibGVfb2Zmc2V0X2NvbW1lbnQudHlwZSA9IEJpbmFyeVJlZ2lvbkNvbW1lbnRUeXBlOjpUYWJsZVZUYWJsZU9mZnNldDsKKworICBjb25zdCBhdXRvIHZ0YWJsZV9zb2Zmc2V0ID0gUmVhZFNjYWxhcjxpbnQzMl90Pih0YWJsZV9vZmZzZXQpOworCisgIGlmICghdnRhYmxlX3NvZmZzZXQuaGFzX3ZhbHVlKCkpIHsKKyAgICBjb25zdCB1aW50NjRfdCByZW1haW5pbmcgPSBSZW1haW5pbmdCeXRlcyh0YWJsZV9vZmZzZXQpOworICAgIFNldEVycm9yKHZ0YWJsZV9vZmZzZXRfY29tbWVudCwgQmluYXJ5UmVnaW9uU3RhdHVzOjpFUlJPUl9JTkNPTVBMRVRFX0JJTkFSWSwKKyAgICAgICAgICAgICAiNCIpOworCisgICAgQWRkU2VjdGlvbigKKyAgICAgICAgdGFibGVfb2Zmc2V0LAorICAgICAgICBNYWtlU2luZ2xlUmVnaW9uQmluYXJ5U2VjdGlvbigKKyAgICAgICAgICAgIHRhYmxlLT5uYW1lKCktPnN0cigpLCB0eXBlLAorICAgICAgICAgICAgTWFrZUJpbmFyeVJlZ2lvbih0YWJsZV9vZmZzZXQsIHJlbWFpbmluZywgQmluYXJ5UmVnaW9uVHlwZTo6VW5rbm93biwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVtYWluaW5nLCAwLCB2dGFibGVfb2Zmc2V0X2NvbW1lbnQpKSk7CisKKyAgICAvLyBJZiB0aGVyZSBhcmVuJ3QgZW5vdWdoIGJ5dGVzIGxlZnQgdG8gcmVhZCB0aGUgdnRhYmxlIG9mZnNldCwgdGhlcmUgaXMKKyAgICAvLyBub3RoaW5nIHdlIGNhbiBkby4KKyAgICByZXR1cm47CisgIH0KKworICAvLyBUYWJsZXMgc3RhcnQgd2l0aCB0aGUgdnRhYmxlCisgIGNvbnN0IHVpbnQ2NF90IHZ0YWJsZV9vZmZzZXQgPSB0YWJsZV9vZmZzZXQgLSB2dGFibGVfc29mZnNldC52YWx1ZSgpOworCisgIGlmICghSXNWYWxpZE9mZnNldCh2dGFibGVfb2Zmc2V0KSkgeworICAgIFNldEVycm9yKHZ0YWJsZV9vZmZzZXRfY29tbWVudCwKKyAgICAgICAgICAgICBCaW5hcnlSZWdpb25TdGF0dXM6OkVSUk9SX09GRlNFVF9PVVRfT0ZfQklOQVJZKTsKKworICAgIEFkZFNlY3Rpb24odGFibGVfb2Zmc2V0LAorICAgICAgICAgICAgICAgTWFrZVNpbmdsZVJlZ2lvbkJpbmFyeVNlY3Rpb24oCisgICAgICAgICAgICAgICAgICAgdGFibGUtPm5hbWUoKS0+c3RyKCksIHR5cGUsCisgICAgICAgICAgICAgICAgICAgTWFrZUJpbmFyeVJlZ2lvbih0YWJsZV9vZmZzZXQsIHNpemVvZihpbnQzMl90KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpbmFyeVJlZ2lvblR5cGU6OlNPZmZzZXQsIDAsIHZ0YWJsZV9vZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2dGFibGVfb2Zmc2V0X2NvbW1lbnQpKSk7CisKKyAgICAvLyBUaGVyZSBpc24ndCBtdWNoIHRvIGRvIHdpdGggYW4gaW52YWxpZCB2dGFibGUgb2Zmc2V0LCBhcyB3ZSB3b24ndCBiZSBhYmxlCisgICAgLy8gdG8gaW50ZXByZXQgdGhlIHJlc3Qgb2YgdGhlIHRhYmxlIGZpZWxkcy4KKyAgICByZXR1cm47CisgIH0KKworICBzdGQ6OnZlY3RvcjxCaW5hcnlSZWdpb24+IHJlZ2lvbnM7CisgIHJlZ2lvbnMucHVzaF9iYWNrKE1ha2VCaW5hcnlSZWdpb24odGFibGVfb2Zmc2V0LCBzaXplb2YoaW50MzJfdCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmluYXJ5UmVnaW9uVHlwZTo6U09mZnNldCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2dGFibGVfb2Zmc2V0LCB2dGFibGVfb2Zmc2V0X2NvbW1lbnQpKTsKKworICAvLyBQYXJzZSB0aGUgdnRhYmxlIGZpcnN0IHNvIHdlIGtub3cgd2hhdCB0aGUgcmVzdCBvZiB0aGUgZmllbGRzIGluIHRoZSB0YWJsZQorICAvLyBhcmUuCisgIEJ1aWxkVlRhYmxlKHZ0YWJsZV9vZmZzZXQsIHRhYmxlLCB0YWJsZV9vZmZzZXQpOworCisgIGF1dG8gdnRhYmxlX2VudHJ5ID0gdnRhYmxlc18uZmluZCh2dGFibGVfb2Zmc2V0KTsKKyAgaWYgKHZ0YWJsZV9lbnRyeSA9PSB2dGFibGVzXy5lbmQoKSkgeworICAgIC8vIFRoZXJlIGlzIG5vIHZhbGlkIHZ0YWJsZSBmb3IgdGhpcyB0YWJsZSwgc28gd2UgY2Fubm90IHByb2Nlc3MgdGhlIHJlc3Qgb2YKKyAgICAvLyB0aGUgdGFibGUgZW50cmllcy4KKyAgICByZXR1cm47CisgIH0KKworICBjb25zdCBWVGFibGUgJnZ0YWJsZSA9IHZ0YWJsZV9lbnRyeS0+c2Vjb25kOworCisgIC8vIFRoaXMgaXMgdGhlIHNpemUgYW5kIGxlbmd0aCBvZiB0aGlzIHRhYmxlLgorICBjb25zdCB1aW50MTZfdCB0YWJsZV9zaXplID0gdnRhYmxlLnRhYmxlX3NpemU7CisgIHVpbnQ2NF90IHRhYmxlX2VuZF9vZmZzZXQgPSB0YWJsZV9vZmZzZXQgKyB0YWJsZV9zaXplOworCisgIGlmICghSXNWYWxpZE9mZnNldCh0YWJsZV9lbmRfb2Zmc2V0IC0gMSkpIHsKKyAgICAvLyBXZSBhbHJlYWR5IHZhbGlkYXRlZCB0aGUgdGFibGUgc2l6ZSBpbiBCdWlsZFZUYWJsZSwgYnV0IHdlIGhhdmUgdG8gbWFrZQorICAgIC8vIHN1cmUgd2UgZG9uJ3QgdXNlIGEgYmFkIHZhbHVlIGhlcmUuCisgICAgdGFibGVfZW5kX29mZnNldCA9IGJpbmFyeV9sZW5ndGhfOworICB9CisKKyAgLy8gV2UgbmVlZCB0byBpdGVyYXRlIG92ZXIgdGhlIHZ0YWJsZSBmaWVsZHMgYnkgdGhlaXIgb2Zmc2V0IGluIHRoZSBiaW5hcnksCisgIC8vIG5vdCBieSB0aGVpciBJRHMuIFNvIGNvcHkgdGhlbSBvdmVyIHRvIGFub3RoZXIgdmVjdG9yIHRoYXQgd2UgY2FuIHNvcnQgb24KKyAgLy8gdGhlIG9mZnNldF9mcm9tX3RhYmxlIHByb3BlcnR5LgorICBzdGQ6OnZlY3RvcjxWVGFibGU6OkVudHJ5PiBmaWVsZHM7CisgIGZvciAoY29uc3QgYXV0byAmdnRhYmxlX2ZpZWxkIDogdnRhYmxlLmZpZWxkcykgeworICAgIGZpZWxkcy5wdXNoX2JhY2sodnRhYmxlX2ZpZWxkLnNlY29uZCk7CisgIH0KKworICBzdGQ6OnN0YWJsZV9zb3J0KGZpZWxkcy5iZWdpbigpLCBmaWVsZHMuZW5kKCksCisgICAgICAgICAgICAgICAgICAgW10oY29uc3QgVlRhYmxlOjpFbnRyeSAmYSwgY29uc3QgVlRhYmxlOjpFbnRyeSAmYikgeworICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGEub2Zmc2V0X2Zyb21fdGFibGUgPCBiLm9mZnNldF9mcm9tX3RhYmxlOworICAgICAgICAgICAgICAgICAgIH0pOworCisgIC8vIEl0ZXJhdGUgb3ZlciBhbGwgdGhlIGZpZWxkcyBieSBvcmRlciBvZiB0aGVpciBvZmZzZXQuCisgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgZmllbGRzLnNpemUoKTsgKytpKSB7CisgICAgY29uc3QgcmVmbGVjdGlvbjo6RmllbGQgKmZpZWxkID0gZmllbGRzW2ldLmZpZWxkOworICAgIGNvbnN0IHVpbnQxNl90IG9mZnNldF9mcm9tX3RhYmxlID0gZmllbGRzW2ldLm9mZnNldF9mcm9tX3RhYmxlOworCisgICAgaWYgKG9mZnNldF9mcm9tX3RhYmxlID09IDApIHsKKyAgICAgIC8vIFNraXAgbm9uLXByZXNlbnQgZmllbGRzLgorICAgICAgY29udGludWU7CisgICAgfQorCisgICAgLy8gVGhlIGZpZWxkIG9mZnNldHMgYXJlIHJlbGF0aXZlIHRvIHRoZSBzdGFydCBvZiB0aGUgdGFibGUuCisgICAgY29uc3QgdWludDY0X3QgZmllbGRfb2Zmc2V0ID0gdGFibGVfb2Zmc2V0ICsgb2Zmc2V0X2Zyb21fdGFibGU7CisKKyAgICBpZiAoIUlzVmFsaWRPZmZzZXQoZmllbGRfb2Zmc2V0KSkgeworICAgICAgLy8gVGhlIGZpZWxkIG9mZnNldCBpcyBsYXJnZXIgdGhhbiB0aGUgYmluYXJ5LCBub3RoaW5nIHdlIGNhbiBkby4KKyAgICAgIGNvbnRpbnVlOworICAgIH0KKworICAgIC8vIFdlIGhhdmUgYSB2dGFibGUgZW50cnkgZm9yIGEgbm9uLWV4aXN0YW50IGZpZWxkLCB0aGF0IG1lYW5zIGl0cyBhIGJpbmFyeQorICAgIC8vIGdlbmVyYXRlZCBieSBhIG5ld2VyIHNjaGVtYSB0aGFuIHdlIGFyZSBjdXJyZW50bHkgcHJvY2Vzc2luZy4KKyAgICBpZiAoZmllbGQgPT0gbnVsbHB0cikgeworICAgICAgLy8gQ2FsY3VsYXRlIHRoZSBsZW5ndGggb2YgdGhpcyB1bmtub3duIGZpZWxkLgorICAgICAgY29uc3QgdWludDY0X3QgdW5rbm93bl9maWVsZF9sZW5ndGggPQorICAgICAgICAgIC8vIENoZWNrIGlmIHRoZXJlIGlzIGFub3RoZXIgdW5rbm93biBmaWVsZCBhZnRlciB0aGlzIG9uZS4KKyAgICAgICAgICAoKGkgKyAxIDwgZmllbGRzLnNpemUoKSkKKyAgICAgICAgICAgICAgID8gdGFibGVfb2Zmc2V0ICsgZmllbGRzW2kgKyAxXS5vZmZzZXRfZnJvbV90YWJsZQorICAgICAgICAgICAgICAgLy8gT3RoZXJ3aXNlIHVzZSB0aGUga25vd24gZW5kIG9mIHRoZSB0YWJsZS4KKyAgICAgICAgICAgICAgIDogdGFibGVfZW5kX29mZnNldCkgLQorICAgICAgICAgIGZpZWxkX29mZnNldDsKKworICAgICAgaWYgKHVua25vd25fZmllbGRfbGVuZ3RoID09IDApIHsgY29udGludWU7IH0KKworICAgICAgc3RkOjpzdHJpbmcgaGludDsKKworICAgICAgaWYgKHVua25vd25fZmllbGRfbGVuZ3RoID09IDQpIHsKKyAgICAgICAgY29uc3QgYXV0byByZWxhdGl2ZV9vZmZzZXQgPSBSZWFkU2NhbGFyPHVpbnQzMl90PihmaWVsZF9vZmZzZXQpOworICAgICAgICBpZiAocmVsYXRpdmVfb2Zmc2V0Lmhhc192YWx1ZSgpKSB7CisgICAgICAgICAgLy8gVGhlIGZpZWxkIGlzIDQgaW4gbGVuZ3RoLCBzbyBpdCBjb3VsZCBiZSBhbiBvZmZzZXQ/IFByb3ZpZGUgYSBoaW50LgorICAgICAgICAgIGhpbnQgKz0gIjxwb3NzaWJseSBhbiBvZmZzZXQ/IENoZWNrIExvYzogKzB4IjsKKyAgICAgICAgICBoaW50ICs9IFRvSGV4KGZpZWxkX29mZnNldCArIHJlbGF0aXZlX29mZnNldC52YWx1ZSgpKTsKKyAgICAgICAgICBoaW50ICs9ICI+IjsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICBCaW5hcnlSZWdpb25Db21tZW50IHVua25vd25fZmllbGRfY29tbWVudDsKKyAgICAgIHVua25vd25fZmllbGRfY29tbWVudC50eXBlID0gQmluYXJ5UmVnaW9uQ29tbWVudFR5cGU6OlRhYmxlVW5rbm93bkZpZWxkOworCisgICAgICBpZiAoIUlzVmFsaWRSZWFkKGZpZWxkX29mZnNldCwgdW5rbm93bl9maWVsZF9sZW5ndGgpKSB7CisgICAgICAgIGNvbnN0IHVpbnQ2NF90IHJlbWFpbmluZyA9IFJlbWFpbmluZ0J5dGVzKGZpZWxkX29mZnNldCk7CisKKyAgICAgICAgU2V0RXJyb3IodW5rbm93bl9maWVsZF9jb21tZW50LAorICAgICAgICAgICAgICAgICBCaW5hcnlSZWdpb25TdGF0dXM6OkVSUk9SX0lOQ09NUExFVEVfQklOQVJZLAorICAgICAgICAgICAgICAgICBzdGQ6OnRvX3N0cmluZyh1bmtub3duX2ZpZWxkX2xlbmd0aCkpOworCisgICAgICAgIHJlZ2lvbnMucHVzaF9iYWNrKE1ha2VCaW5hcnlSZWdpb24oZmllbGRfb2Zmc2V0LCByZW1haW5pbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmluYXJ5UmVnaW9uVHlwZTo6VW5rbm93biwgcmVtYWluaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIHVua25vd25fZmllbGRfY29tbWVudCkpOworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKworICAgICAgdW5rbm93bl9maWVsZF9jb21tZW50LmRlZmF1bHRfdmFsdWUgPSBoaW50OworCisgICAgICByZWdpb25zLnB1c2hfYmFjayhNYWtlQmluYXJ5UmVnaW9uKAorICAgICAgICAgIGZpZWxkX29mZnNldCwgdW5rbm93bl9maWVsZF9sZW5ndGgsIEJpbmFyeVJlZ2lvblR5cGU6OlVua25vd24sCisgICAgICAgICAgdW5rbm93bl9maWVsZF9sZW5ndGgsIDAsIHVua25vd25fZmllbGRfY29tbWVudCkpOworICAgICAgY29udGludWU7CisgICAgfQorCisgICAgaWYgKElzU2NhbGFyKGZpZWxkLT50eXBlKCktPmJhc2VfdHlwZSgpKSkgeworICAgICAgLy8gVGhlc2UgYXJlIHRoZSByYXcgdmFsdWVzIHN0b3JlIGluIHRoZSB0YWJsZS4KKyAgICAgIGNvbnN0IHVpbnQ2NF90IHR5cGVfc2l6ZSA9IEdldFR5cGVTaXplKGZpZWxkLT50eXBlKCktPmJhc2VfdHlwZSgpKTsKKyAgICAgIGNvbnN0IEJpbmFyeVJlZ2lvblR5cGUgcmVnaW9uX3R5cGUgPQorICAgICAgICAgIEdldFJlZ2lvblR5cGUoZmllbGQtPnR5cGUoKS0+YmFzZV90eXBlKCkpOworCisgICAgICBCaW5hcnlSZWdpb25Db21tZW50IHNjYWxhcl9maWVsZF9jb21tZW50OworICAgICAgc2NhbGFyX2ZpZWxkX2NvbW1lbnQudHlwZSA9IEJpbmFyeVJlZ2lvbkNvbW1lbnRUeXBlOjpUYWJsZUZpZWxkOworICAgICAgc2NhbGFyX2ZpZWxkX2NvbW1lbnQubmFtZSA9CisgICAgICAgICAgc3RkOjpzdHJpbmcoZmllbGQtPm5hbWUoKS0+Y19zdHIoKSkgKyAiYCAoIiArCisgICAgICAgICAgcmVmbGVjdGlvbjo6RW51bU5hbWVCYXNlVHlwZShmaWVsZC0+dHlwZSgpLT5iYXNlX3R5cGUoKSkgKyAiKSI7CisKKyAgICAgIGlmICghSXNWYWxpZFJlYWQoZmllbGRfb2Zmc2V0LCB0eXBlX3NpemUpKSB7CisgICAgICAgIGNvbnN0IHVpbnQ2NF90IHJlbWFpbmluZyA9IFJlbWFpbmluZ0J5dGVzKGZpZWxkX29mZnNldCk7CisgICAgICAgIFNldEVycm9yKHNjYWxhcl9maWVsZF9jb21tZW50LAorICAgICAgICAgICAgICAgICBCaW5hcnlSZWdpb25TdGF0dXM6OkVSUk9SX0lOQ09NUExFVEVfQklOQVJZLAorICAgICAgICAgICAgICAgICBzdGQ6OnRvX3N0cmluZyh0eXBlX3NpemUpKTsKKworICAgICAgICByZWdpb25zLnB1c2hfYmFjayhNYWtlQmluYXJ5UmVnaW9uKGZpZWxkX29mZnNldCwgcmVtYWluaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpbmFyeVJlZ2lvblR5cGU6OlVua25vd24sIHJlbWFpbmluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCBzY2FsYXJfZmllbGRfY29tbWVudCkpOworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKworICAgICAgaWYgKElzVW5pb25UeXBlKGZpZWxkKSkgeworICAgICAgICAvLyBUaGlzIGlzIGEgdHlwZSBmb3IgYSB1bmlvbi4gVmFsaWRhdGUgdGhlIHZhbHVlCisgICAgICAgIGNvbnN0IGF1dG8gZW51bV92YWx1ZSA9IFJlYWRTY2FsYXI8dWludDhfdD4oZmllbGRfb2Zmc2V0KTsKKworICAgICAgICAvLyBUaGlzIHNob3VsZCBhbHdheXMgaGF2ZSBhIHZhbHVlLCBkdWUgdG8gdGhlIElzVmFsaWRSZWFkIGNoZWNrIGFib3ZlLgorICAgICAgICBpZiAoIUlzVmFsaWRVbmlvblZhbHVlKGZpZWxkLCBlbnVtX3ZhbHVlLnZhbHVlKCkpKSB7CisgICAgICAgICAgU2V0RXJyb3Ioc2NhbGFyX2ZpZWxkX2NvbW1lbnQsCisgICAgICAgICAgICAgICAgICAgQmluYXJ5UmVnaW9uU3RhdHVzOjpFUlJPUl9JTlZBTElEX1VOSU9OX1RZUEUpOworCisgICAgICAgICAgcmVnaW9ucy5wdXNoX2JhY2soTWFrZUJpbmFyeVJlZ2lvbihmaWVsZF9vZmZzZXQsIHR5cGVfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lvbl90eXBlLCAwLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NhbGFyX2ZpZWxkX2NvbW1lbnQpKTsKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICByZWdpb25zLnB1c2hfYmFjayhNYWtlQmluYXJ5UmVnaW9uKGZpZWxkX29mZnNldCwgdHlwZV9zaXplLCByZWdpb25fdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgMCwgc2NhbGFyX2ZpZWxkX2NvbW1lbnQpKTsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKworICAgIC8vIFJlYWQgdGhlIG9mZnNldAorICAgIGNvbnN0IGF1dG8gb2Zmc2V0X2Zyb21fZmllbGQgPSBSZWFkU2NhbGFyPHVpbnQzMl90PihmaWVsZF9vZmZzZXQpOworICAgIHVpbnQ2NF90IG9mZnNldF9vZl9uZXh0X2l0ZW0gPSAwOworICAgIEJpbmFyeVJlZ2lvbkNvbW1lbnQgb2Zmc2V0X2ZpZWxkX2NvbW1lbnQ7CisgICAgb2Zmc2V0X2ZpZWxkX2NvbW1lbnQudHlwZSA9IEJpbmFyeVJlZ2lvbkNvbW1lbnRUeXBlOjpUYWJsZU9mZnNldEZpZWxkOworICAgIG9mZnNldF9maWVsZF9jb21tZW50Lm5hbWUgPSBmaWVsZC0+bmFtZSgpLT5jX3N0cigpOworICAgIGNvbnN0IHN0ZDo6c3RyaW5nIG9mZnNldF9wcmVmaXggPQorICAgICAgICAib2Zmc2V0IHRvIGZpZWxkIGAiICsgc3RkOjpzdHJpbmcoZmllbGQtPm5hbWUoKS0+Y19zdHIoKSkgKyAiYCI7CisKKyAgICAvLyBWYWxpZGF0ZSBhbnkgZmllbGQgdGhhdCBpc24ndCBpbmxpbmUgKGkuZS4sIG5vbi1zdHJ1Y3RzKS4KKyAgICBpZiAoIUlzSW5saW5lRmllbGQoZmllbGQpKSB7CisgICAgICBpZiAoIW9mZnNldF9mcm9tX2ZpZWxkLmhhc192YWx1ZSgpKSB7CisgICAgICAgIGNvbnN0IHVpbnQ2NF90IHJlbWFpbmluZyA9IFJlbWFpbmluZ0J5dGVzKGZpZWxkX29mZnNldCk7CisKKyAgICAgICAgU2V0RXJyb3Iob2Zmc2V0X2ZpZWxkX2NvbW1lbnQsCisgICAgICAgICAgICAgICAgIEJpbmFyeVJlZ2lvblN0YXR1czo6RVJST1JfSU5DT01QTEVURV9CSU5BUlksICI0Iik7CisKKyAgICAgICAgcmVnaW9ucy5wdXNoX2JhY2soTWFrZUJpbmFyeVJlZ2lvbihmaWVsZF9vZmZzZXQsIHJlbWFpbmluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaW5hcnlSZWdpb25UeXBlOjpVbmtub3duLCByZW1haW5pbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgb2Zmc2V0X2ZpZWxkX2NvbW1lbnQpKTsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisKKyAgICAgIG9mZnNldF9vZl9uZXh0X2l0ZW0gPSBmaWVsZF9vZmZzZXQgKyBvZmZzZXRfZnJvbV9maWVsZC52YWx1ZSgpOworCisgICAgICBpZiAoIUlzVmFsaWRPZmZzZXQob2Zmc2V0X29mX25leHRfaXRlbSkpIHsKKyAgICAgICAgU2V0RXJyb3Iob2Zmc2V0X2ZpZWxkX2NvbW1lbnQsCisgICAgICAgICAgICAgICAgIEJpbmFyeVJlZ2lvblN0YXR1czo6RVJST1JfT0ZGU0VUX09VVF9PRl9CSU5BUlkpOworICAgICAgICByZWdpb25zLnB1c2hfYmFjayhNYWtlQmluYXJ5UmVnaW9uKAorICAgICAgICAgICAgZmllbGRfb2Zmc2V0LCBzaXplb2YodWludDMyX3QpLCBCaW5hcnlSZWdpb25UeXBlOjpVT2Zmc2V0LCAwLAorICAgICAgICAgICAgb2Zmc2V0X29mX25leHRfaXRlbSwgb2Zmc2V0X2ZpZWxkX2NvbW1lbnQpKTsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisgICAgfQorCisgICAgc3dpdGNoIChmaWVsZC0+dHlwZSgpLT5iYXNlX3R5cGUoKSkgeworICAgICAgY2FzZSByZWZsZWN0aW9uOjpCYXNlVHlwZTo6T2JqOiB7CisgICAgICAgIGNvbnN0IHJlZmxlY3Rpb246Ok9iamVjdCAqbmV4dF9vYmplY3QgPQorICAgICAgICAgICAgc2NoZW1hXy0+b2JqZWN0cygpLT5HZXQoZmllbGQtPnR5cGUoKS0+aW5kZXgoKSk7CisKKyAgICAgICAgaWYgKG5leHRfb2JqZWN0LT5pc19zdHJ1Y3QoKSkgeworICAgICAgICAgIC8vIFN0cnVjdHMgYXJlIHN0b3JlZCBpbmxpbmUuCisgICAgICAgICAgQnVpbGRTdHJ1Y3QoZmllbGRfb2Zmc2V0LCByZWdpb25zLCBuZXh0X29iamVjdCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgb2Zmc2V0X2ZpZWxkX2NvbW1lbnQuZGVmYXVsdF92YWx1ZSA9ICIodGFibGUpIjsKKworICAgICAgICAgIHJlZ2lvbnMucHVzaF9iYWNrKE1ha2VCaW5hcnlSZWdpb24oCisgICAgICAgICAgICAgIGZpZWxkX29mZnNldCwgc2l6ZW9mKHVpbnQzMl90KSwgQmluYXJ5UmVnaW9uVHlwZTo6VU9mZnNldCwgMCwKKyAgICAgICAgICAgICAgb2Zmc2V0X29mX25leHRfaXRlbSwgb2Zmc2V0X2ZpZWxkX2NvbW1lbnQpKTsKKworICAgICAgICAgIEJ1aWxkVGFibGUob2Zmc2V0X29mX25leHRfaXRlbSwgQmluYXJ5U2VjdGlvblR5cGU6OlRhYmxlLAorICAgICAgICAgICAgICAgICAgICAgbmV4dF9vYmplY3QpOworICAgICAgICB9CisgICAgICB9IGJyZWFrOworCisgICAgICBjYXNlIHJlZmxlY3Rpb246OkJhc2VUeXBlOjpTdHJpbmc6IHsKKyAgICAgICAgb2Zmc2V0X2ZpZWxkX2NvbW1lbnQuZGVmYXVsdF92YWx1ZSA9ICIoc3RyaW5nKSI7CisgICAgICAgIHJlZ2lvbnMucHVzaF9iYWNrKE1ha2VCaW5hcnlSZWdpb24oCisgICAgICAgICAgICBmaWVsZF9vZmZzZXQsIHNpemVvZih1aW50MzJfdCksIEJpbmFyeVJlZ2lvblR5cGU6OlVPZmZzZXQsIDAsCisgICAgICAgICAgICBvZmZzZXRfb2ZfbmV4dF9pdGVtLCBvZmZzZXRfZmllbGRfY29tbWVudCkpOworICAgICAgICBCdWlsZFN0cmluZyhvZmZzZXRfb2ZfbmV4dF9pdGVtLCB0YWJsZSwgZmllbGQpOworICAgICAgfSBicmVhazsKKworICAgICAgY2FzZSByZWZsZWN0aW9uOjpCYXNlVHlwZTo6VmVjdG9yOiB7CisgICAgICAgIG9mZnNldF9maWVsZF9jb21tZW50LmRlZmF1bHRfdmFsdWUgPSAiKHZlY3RvcikiOworICAgICAgICByZWdpb25zLnB1c2hfYmFjayhNYWtlQmluYXJ5UmVnaW9uKAorICAgICAgICAgICAgZmllbGRfb2Zmc2V0LCBzaXplb2YodWludDMyX3QpLCBCaW5hcnlSZWdpb25UeXBlOjpVT2Zmc2V0LCAwLAorICAgICAgICAgICAgb2Zmc2V0X29mX25leHRfaXRlbSwgb2Zmc2V0X2ZpZWxkX2NvbW1lbnQpKTsKKyAgICAgICAgQnVpbGRWZWN0b3Iob2Zmc2V0X29mX25leHRfaXRlbSwgdGFibGUsIGZpZWxkLCB0YWJsZV9vZmZzZXQsIHZ0YWJsZSk7CisgICAgICB9IGJyZWFrOworCisgICAgICBjYXNlIHJlZmxlY3Rpb246OkJhc2VUeXBlOjpVbmlvbjogeworICAgICAgICBjb25zdCB1aW50NjRfdCB1bmlvbl9vZmZzZXQgPSBvZmZzZXRfb2ZfbmV4dF9pdGVtOworCisgICAgICAgIC8vIFRoZSB1bmlvbiB0eXBlIGZpZWxkIGlzIGFsd2F5cyBvbmUgbGVzcyB0aGFuIHRoZSB1bmlvbiBpdHNlbGYuCisgICAgICAgIGNvbnN0IHVpbnQxNl90IHVuaW9uX3R5cGVfaWQgPSBmaWVsZC0+aWQoKSAtIDE7CisKKyAgICAgICAgYXV0byB2dGFibGVfZmllbGQgPSB2dGFibGUuZmllbGRzLmZpbmQodW5pb25fdHlwZV9pZCk7CisgICAgICAgIGlmICh2dGFibGVfZmllbGQgPT0gdnRhYmxlLmZpZWxkcy5lbmQoKSkgeworICAgICAgICAgIC8vIFRPRE8oZGJhaWxleWNoZXNzKTogbmVlZCB0byBjYXB0dXJlIHRoaXMgZXJyb3IgY29uZGl0aW9uLgorICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIG9mZnNldF9maWVsZF9jb21tZW50LmRlZmF1bHRfdmFsdWUgPSAiKHVuaW9uKSI7CisKKyAgICAgICAgY29uc3QgdWludDY0X3QgdHlwZV9vZmZzZXQgPQorICAgICAgICAgICAgdGFibGVfb2Zmc2V0ICsgdnRhYmxlX2ZpZWxkLT5zZWNvbmQub2Zmc2V0X2Zyb21fdGFibGU7CisKKyAgICAgICAgY29uc3QgYXV0byByZWFsaXplZF90eXBlID0gUmVhZFNjYWxhcjx1aW50OF90Pih0eXBlX29mZnNldCk7CisgICAgICAgIGlmICghcmVhbGl6ZWRfdHlwZS5oYXNfdmFsdWUoKSkgeworICAgICAgICAgIGNvbnN0IHVpbnQ2NF90IHJlbWFpbmluZyA9IFJlbWFpbmluZ0J5dGVzKHR5cGVfb2Zmc2V0KTsKKyAgICAgICAgICBTZXRFcnJvcihvZmZzZXRfZmllbGRfY29tbWVudCwKKyAgICAgICAgICAgICAgICAgICBCaW5hcnlSZWdpb25TdGF0dXM6OkVSUk9SX0lOQ09NUExFVEVfQklOQVJZLCAiMSIpOworICAgICAgICAgIHJlZ2lvbnMucHVzaF9iYWNrKE1ha2VCaW5hcnlSZWdpb24oCisgICAgICAgICAgICAgIHR5cGVfb2Zmc2V0LCByZW1haW5pbmcsIEJpbmFyeVJlZ2lvblR5cGU6OlVua25vd24sIHJlbWFpbmluZywgMCwKKyAgICAgICAgICAgICAgb2Zmc2V0X2ZpZWxkX2NvbW1lbnQpKTsKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICghSXNWYWxpZFVuaW9uVmFsdWUoZmllbGQsIHJlYWxpemVkX3R5cGUudmFsdWUoKSkpIHsKKyAgICAgICAgICAvLyBXZSBhbHJlYWR5IGV4cG9ydCBhbiBlcnJvciBpbiB0aGUgdW5pb24gdHlwZSBmaWVsZCwgc28ganVzdCBza2lwCisgICAgICAgICAgLy8gYnVpbGRpbmcgdGhlIHVuaW9uIGl0c2VsZiBhbmQgaXQgd2lsbCBkZWZhdWx0IHRvIGFuIHVucmVmZXJlbmNlCisgICAgICAgICAgLy8gQmluYXJ5IHNlY3Rpb24uCisgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyBlbnVtX3R5cGUgPQorICAgICAgICAgICAgQnVpbGRVbmlvbih1bmlvbl9vZmZzZXQsIHJlYWxpemVkX3R5cGUudmFsdWUoKSwgZmllbGQpOworCisgICAgICAgIG9mZnNldF9maWVsZF9jb21tZW50LmRlZmF1bHRfdmFsdWUgPQorICAgICAgICAgICAgIih1bmlvbiBvZiB0eXBlIGAiICsgZW51bV90eXBlICsgImApIjsKKworICAgICAgICByZWdpb25zLnB1c2hfYmFjayhNYWtlQmluYXJ5UmVnaW9uKGZpZWxkX29mZnNldCwgc2l6ZW9mKHVpbnQzMl90KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaW5hcnlSZWdpb25UeXBlOjpVT2Zmc2V0LCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuaW9uX29mZnNldCwgb2Zmc2V0X2ZpZWxkX2NvbW1lbnQpKTsKKworICAgICAgfSBicmVhazsKKworICAgICAgZGVmYXVsdDogYnJlYWs7CisgICAgfQorICB9CisKKyAgLy8gSGFuZGxlIHRoZSBjYXNlIHdoZXJlIHRoZXJlIGlzIHBhZGRpbmcgYWZ0ZXIgdGhlIGxhc3Qga25vd24gYmluYXJ5CisgIC8vIHJlZ2lvbi4gQ2FsY3VsYXRlIHdoZXJlIHdlIGxlZnQgb2ZmIHRvd2FyZHMgdGhlIGV4cGVjdGVkIGVuZCBvZiB0aGUKKyAgLy8gdGFibGUuCisgIGNvbnN0IHVpbnQ2NF90IGkgPSByZWdpb25zLmJhY2soKS5vZmZzZXQgKyByZWdpb25zLmJhY2soKS5sZW5ndGggKyAxOworCisgIGlmIChpIDwgdGFibGVfZW5kX29mZnNldCkgeworICAgIGNvbnN0IHVpbnQ2NF90IHBhZF9ieXRlcyA9IHRhYmxlX2VuZF9vZmZzZXQgLSBpICsgMTsKKworICAgIEJpbmFyeVJlZ2lvbkNvbW1lbnQgcGFkZGluZ19jb21tZW50OworICAgIHBhZGRpbmdfY29tbWVudC50eXBlID0gQmluYXJ5UmVnaW9uQ29tbWVudFR5cGU6OlBhZGRpbmc7CisKKyAgICByZWdpb25zLnB1c2hfYmFjayhNYWtlQmluYXJ5UmVnaW9uKGkgLSAxLCBwYWRfYnl0ZXMgKiBzaXplb2YodWludDhfdCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaW5hcnlSZWdpb25UeXBlOjpVaW50OCwgcGFkX2J5dGVzLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFkZGluZ19jb21tZW50KSk7CisgIH0KKworICBBZGRTZWN0aW9uKHRhYmxlX29mZnNldCwKKyAgICAgICAgICAgICBNYWtlQmluYXJ5U2VjdGlvbih0YWJsZS0+bmFtZSgpLT5zdHIoKSwgdHlwZSwgc3RkOjptb3ZlKHJlZ2lvbnMpKSk7Cit9CisKK3VpbnQ2NF90IEJpbmFyeUFubm90YXRvcjo6QnVpbGRTdHJ1Y3QoY29uc3QgdWludDY0X3Qgc3RydWN0X29mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8QmluYXJ5UmVnaW9uPiAmcmVnaW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVmbGVjdGlvbjo6T2JqZWN0ICpjb25zdCBvYmplY3QpIHsKKyAgaWYgKCFvYmplY3QtPmlzX3N0cnVjdCgpKSB7IHJldHVybiBzdHJ1Y3Rfb2Zmc2V0OyB9CisgIHVpbnQ2NF90IG9mZnNldCA9IHN0cnVjdF9vZmZzZXQ7CisKKyAgLy8gTG9vcCBvdmVyIGFsbCB0aGUgZmllbGRzIGluIGluY3JlYXNpbmcgb3JkZXIKKyAgRm9yQWxsRmllbGRzKG9iamVjdCwgLypyZXZlcnNlPSovZmFsc2UsIFsmXShjb25zdCByZWZsZWN0aW9uOjpGaWVsZCAqZmllbGQpIHsKKyAgICBpZiAoSXNTY2FsYXIoZmllbGQtPnR5cGUoKS0+YmFzZV90eXBlKCkpKSB7CisgICAgICAvLyBTdHJ1Y3R1cmUgRmllbGQgdmFsdWUKKyAgICAgIGNvbnN0IHVpbnQ2NF90IHR5cGVfc2l6ZSA9IEdldFR5cGVTaXplKGZpZWxkLT50eXBlKCktPmJhc2VfdHlwZSgpKTsKKyAgICAgIGNvbnN0IEJpbmFyeVJlZ2lvblR5cGUgcmVnaW9uX3R5cGUgPQorICAgICAgICAgIEdldFJlZ2lvblR5cGUoZmllbGQtPnR5cGUoKS0+YmFzZV90eXBlKCkpOworCisgICAgICBCaW5hcnlSZWdpb25Db21tZW50IGNvbW1lbnQ7CisgICAgICBjb21tZW50LnR5cGUgPSBCaW5hcnlSZWdpb25Db21tZW50VHlwZTo6U3RydWN0RmllbGQ7CisgICAgICBjb21tZW50Lm5hbWUgPQorICAgICAgICAgIHN0ZDo6c3RyaW5nKG9iamVjdC0+bmFtZSgpLT5jX3N0cigpKSArICIuIiArIGZpZWxkLT5uYW1lKCktPmNfc3RyKCk7CisgICAgICBjb21tZW50LmRlZmF1bHRfdmFsdWUgPSAiKCIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcocmVmbGVjdGlvbjo6RW51bU5hbWVCYXNlVHlwZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZC0+dHlwZSgpLT5iYXNlX3R5cGUoKSkpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIpIjsKKworICAgICAgaWYgKCFJc1ZhbGlkUmVhZChvZmZzZXQsIHR5cGVfc2l6ZSkpIHsKKyAgICAgICAgY29uc3QgdWludDY0X3QgcmVtYWluaW5nID0gUmVtYWluaW5nQnl0ZXMob2Zmc2V0KTsKKyAgICAgICAgU2V0RXJyb3IoY29tbWVudCwgQmluYXJ5UmVnaW9uU3RhdHVzOjpFUlJPUl9JTkNPTVBMRVRFX0JJTkFSWSwKKyAgICAgICAgICAgICAgICAgc3RkOjp0b19zdHJpbmcodHlwZV9zaXplKSk7CisgICAgICAgIHJlZ2lvbnMucHVzaF9iYWNrKE1ha2VCaW5hcnlSZWdpb24ob2Zmc2V0LCByZW1haW5pbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmluYXJ5UmVnaW9uVHlwZTo6VW5rbm93biwgcmVtYWluaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIGNvbW1lbnQpKTsKKworICAgICAgICAvLyBUT0RPKGRiYWlsZXljaGVzcyk6IFNob3VsZCBJIGJhaWwgb3V0IGhlcmU/IFRoaXMgc2V0cyBvZmZzZXQgdG8gdGhlCisgICAgICAgIC8vIGVuZCBvZiB0aGUgYmluYXJ5LiBTbyBhbGwgb3RoZXIgcmVhZHMgaW4gdGhlIGxvb3Agc2hvdWxkIGZhaWwuCisgICAgICAgIG9mZnNldCArPSByZW1haW5pbmc7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKworICAgICAgcmVnaW9ucy5wdXNoX2JhY2soCisgICAgICAgICAgTWFrZUJpbmFyeVJlZ2lvbihvZmZzZXQsIHR5cGVfc2l6ZSwgcmVnaW9uX3R5cGUsIDAsIDAsIGNvbW1lbnQpKTsKKyAgICAgIG9mZnNldCArPSB0eXBlX3NpemU7CisgICAgfSBlbHNlIGlmIChmaWVsZC0+dHlwZSgpLT5iYXNlX3R5cGUoKSA9PSByZWZsZWN0aW9uOjpCYXNlVHlwZTo6T2JqKSB7CisgICAgICAvLyBTdHJ1Y3RzIGFyZSBzdG9yZWQgaW5saW5lLCBldmVuIHdoZW4gbmVzdGVkLgorICAgICAgb2Zmc2V0ID0gQnVpbGRTdHJ1Y3Qob2Zmc2V0LCByZWdpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NoZW1hXy0+b2JqZWN0cygpLT5HZXQoZmllbGQtPnR5cGUoKS0+aW5kZXgoKSkpOworICAgIH0gZWxzZSBpZiAoZmllbGQtPnR5cGUoKS0+YmFzZV90eXBlKCkgPT0gcmVmbGVjdGlvbjo6QmFzZVR5cGU6OkFycmF5KSB7CisgICAgICBjb25zdCBib29sIGlzX3NjYWxhciA9IElzU2NhbGFyKGZpZWxkLT50eXBlKCktPmVsZW1lbnQoKSk7CisgICAgICBjb25zdCB1aW50NjRfdCB0eXBlX3NpemUgPSBHZXRUeXBlU2l6ZShmaWVsZC0+dHlwZSgpLT5lbGVtZW50KCkpOworICAgICAgY29uc3QgQmluYXJ5UmVnaW9uVHlwZSByZWdpb25fdHlwZSA9CisgICAgICAgICAgR2V0UmVnaW9uVHlwZShmaWVsZC0+dHlwZSgpLT5lbGVtZW50KCkpOworCisgICAgICAvLyBBcnJheXMgYXJlIGp1c3QgcmVwZWF0ZWQgc3RydWN0dXJlcy4KKyAgICAgIGZvciAodWludDE2X3QgaSA9IDA7IGkgPCBmaWVsZC0+dHlwZSgpLT5maXhlZF9sZW5ndGgoKTsgKytpKSB7CisgICAgICAgIGlmIChpc19zY2FsYXIpIHsKKyAgICAgICAgICBCaW5hcnlSZWdpb25Db21tZW50IGFycmF5X2NvbW1lbnQ7CisgICAgICAgICAgYXJyYXlfY29tbWVudC50eXBlID0gQmluYXJ5UmVnaW9uQ29tbWVudFR5cGU6OkFycmF5RmllbGQ7CisgICAgICAgICAgYXJyYXlfY29tbWVudC5uYW1lID0gc3RkOjpzdHJpbmcob2JqZWN0LT5uYW1lKCktPmNfc3RyKCkpICsgIi4iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZC0+bmFtZSgpLT5jX3N0cigpOworICAgICAgICAgIGFycmF5X2NvbW1lbnQuaW5kZXggPSBpOworICAgICAgICAgIGFycmF5X2NvbW1lbnQuZGVmYXVsdF92YWx1ZSA9CisgICAgICAgICAgICAgICIoIiArCisgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nKAorICAgICAgICAgICAgICAgICAgcmVmbGVjdGlvbjo6RW51bU5hbWVCYXNlVHlwZShmaWVsZC0+dHlwZSgpLT5lbGVtZW50KCkpKSArCisgICAgICAgICAgICAgICIpIjsKKworICAgICAgICAgIGlmICghSXNWYWxpZFJlYWQob2Zmc2V0LCB0eXBlX3NpemUpKSB7CisgICAgICAgICAgICBjb25zdCB1aW50NjRfdCByZW1haW5pbmcgPSBSZW1haW5pbmdCeXRlcyhvZmZzZXQpOworCisgICAgICAgICAgICBTZXRFcnJvcihhcnJheV9jb21tZW50LCBCaW5hcnlSZWdpb25TdGF0dXM6OkVSUk9SX0lOQ09NUExFVEVfQklOQVJZLAorICAgICAgICAgICAgICAgICAgICAgc3RkOjp0b19zdHJpbmcodHlwZV9zaXplKSk7CisKKyAgICAgICAgICAgIHJlZ2lvbnMucHVzaF9iYWNrKE1ha2VCaW5hcnlSZWdpb24ob2Zmc2V0LCByZW1haW5pbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpbmFyeVJlZ2lvblR5cGU6OlVua25vd24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbWFpbmluZywgMCwgYXJyYXlfY29tbWVudCkpOworCisgICAgICAgICAgICAvLyBUT0RPKGRiYWlsZXljaGVzcyk6IFNob3VsZCBJIGJhaWwgb3V0IGhlcmU/IFRoaXMgc2V0cyBvZmZzZXQgdG8KKyAgICAgICAgICAgIC8vIHRoZSBlbmQgb2YgdGhlIGJpbmFyeS4gU28gYWxsIG90aGVyIHJlYWRzIGluIHRoZSBsb29wIHNob3VsZAorICAgICAgICAgICAgLy8gZmFpbC4KKyAgICAgICAgICAgIG9mZnNldCArPSByZW1haW5pbmc7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisKKyAgICAgICAgICByZWdpb25zLnB1c2hfYmFjayhNYWtlQmluYXJ5UmVnaW9uKG9mZnNldCwgdHlwZV9zaXplLCByZWdpb25fdHlwZSwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIGFycmF5X2NvbW1lbnQpKTsKKworICAgICAgICAgIG9mZnNldCArPSB0eXBlX3NpemU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgLy8gQXJyYXkgb2YgU3RydWN0cy4KKyAgICAgICAgICAvLworICAgICAgICAgIC8vIFRPRE8oZGJhaWxleWNoZXNzKTogVGhpcyB3b3JrcywgYnV0IHRoZSBjb21tZW50cyBvbiB0aGUgZmllbGRzIGxvc2UKKyAgICAgICAgICAvLyBzb21lIGNvbnRleHQuIE5lZWQgdG8gZmlndXJlIGEgd2F5IGhvdyB0byBwbHVtYiB0aGUgbmVzdGVkIGFycmF5cworICAgICAgICAgIC8vIGNvbW1lbnRzIHRvZ2V0aGVyIHRoYXQgaXNuJ3QgdG9vIGNvbmZ1c2luZy4KKyAgICAgICAgICBvZmZzZXQgPSBCdWlsZFN0cnVjdChvZmZzZXQsIHJlZ2lvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NoZW1hXy0+b2JqZWN0cygpLT5HZXQoZmllbGQtPnR5cGUoKS0+aW5kZXgoKSkpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorCisgICAgLy8gSW5zZXJ0IGFueSBwYWRkaW5nIGFmdGVyIHRoaXMgZmllbGQuCisgICAgY29uc3QgdWludDE2X3QgcGFkZGluZyA9IGZpZWxkLT5wYWRkaW5nKCk7CisgICAgaWYgKHBhZGRpbmcgPiAwICYmIElzVmFsaWRPZmZzZXQob2Zmc2V0ICsgcGFkZGluZykpIHsKKyAgICAgIEJpbmFyeVJlZ2lvbkNvbW1lbnQgcGFkZGluZ19jb21tZW50OworICAgICAgcGFkZGluZ19jb21tZW50LnR5cGUgPSBCaW5hcnlSZWdpb25Db21tZW50VHlwZTo6UGFkZGluZzsKKworICAgICAgcmVnaW9ucy5wdXNoX2JhY2soTWFrZUJpbmFyeVJlZ2lvbihvZmZzZXQsIHBhZGRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpbmFyeVJlZ2lvblR5cGU6OlVpbnQ4LCBwYWRkaW5nLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWRkaW5nX2NvbW1lbnQpKTsKKyAgICAgIG9mZnNldCArPSBwYWRkaW5nOworICAgIH0KKyAgfSk7CisKKyAgcmV0dXJuIG9mZnNldDsKK30KKwordm9pZCBCaW5hcnlBbm5vdGF0b3I6OkJ1aWxkU3RyaW5nKGNvbnN0IHVpbnQ2NF90IHN0cmluZ19vZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVmbGVjdGlvbjo6T2JqZWN0ICpjb25zdCB0YWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZWZsZWN0aW9uOjpGaWVsZCAqY29uc3QgZmllbGQpIHsKKyAgLy8gQ2hlY2sgaWYgd2UgaGF2ZSBhbHJlYWR5IGdlbmVyYXRlZCB0aGlzIHN0cmluZyBzZWN0aW9uLCBhbmQgdGhpcyBpcyBhCisgIC8vIHNoYXJlZCBzdHJpbmcgaW5zdGFuY2UuCisgIGlmIChDb250YWluc1NlY3Rpb24oc3RyaW5nX29mZnNldCkpIHsgcmV0dXJuOyB9CisKKyAgc3RkOjp2ZWN0b3I8QmluYXJ5UmVnaW9uPiByZWdpb25zOworICBjb25zdCBhdXRvIHN0cmluZ19sZW5ndGggPSBSZWFkU2NhbGFyPHVpbnQzMl90PihzdHJpbmdfb2Zmc2V0KTsKKworICBCaW5hcnlSZWdpb25Db21tZW50IHN0cmluZ19sZW5ndGhfY29tbWVudDsKKyAgc3RyaW5nX2xlbmd0aF9jb21tZW50LnR5cGUgPSBCaW5hcnlSZWdpb25Db21tZW50VHlwZTo6U3RyaW5nTGVuZ3RoOworCisgIGlmICghc3RyaW5nX2xlbmd0aC5oYXNfdmFsdWUoKSkgeworICAgIGNvbnN0IHVpbnQ2NF90IHJlbWFpbmluZyA9IFJlbWFpbmluZ0J5dGVzKHN0cmluZ19vZmZzZXQpOworCisgICAgU2V0RXJyb3Ioc3RyaW5nX2xlbmd0aF9jb21tZW50LCBCaW5hcnlSZWdpb25TdGF0dXM6OkVSUk9SX0lOQ09NUExFVEVfQklOQVJZLAorICAgICAgICAgICAgICI0Iik7CisKKyAgICByZWdpb25zLnB1c2hfYmFjayhNYWtlQmluYXJ5UmVnaW9uKHN0cmluZ19vZmZzZXQsIHJlbWFpbmluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpbmFyeVJlZ2lvblR5cGU6OlVua25vd24sIHJlbWFpbmluZywgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ19sZW5ndGhfY29tbWVudCkpOworCisgIH0gZWxzZSB7CisgICAgY29uc3QgdWludDMyX3Qgc3RyaW5nX3NpemUgPSBzdHJpbmdfbGVuZ3RoLnZhbHVlKCk7CisgICAgY29uc3QgdWludDY0X3Qgc3RyaW5nX2VuZCA9CisgICAgICAgIHN0cmluZ19vZmZzZXQgKyBzaXplb2YodWludDMyX3QpICsgc3RyaW5nX3NpemUgKyBzaXplb2YoY2hhcik7CisKKyAgICBpZiAoIUlzVmFsaWRPZmZzZXQoc3RyaW5nX2VuZCAtIDEpKSB7CisgICAgICBTZXRFcnJvcihzdHJpbmdfbGVuZ3RoX2NvbW1lbnQsCisgICAgICAgICAgICAgICBCaW5hcnlSZWdpb25TdGF0dXM6OkVSUk9SX0xFTkdUSF9UT09fTE9ORyk7CisKKyAgICAgIHJlZ2lvbnMucHVzaF9iYWNrKE1ha2VCaW5hcnlSZWdpb24oc3RyaW5nX29mZnNldCwgc2l6ZW9mKHVpbnQzMl90KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmluYXJ5UmVnaW9uVHlwZTo6VWludDMyLCAwLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdfbGVuZ3RoX2NvbW1lbnQpKTsKKyAgICB9IGVsc2UgeworICAgICAgcmVnaW9ucy5wdXNoX2JhY2soTWFrZUJpbmFyeVJlZ2lvbihzdHJpbmdfb2Zmc2V0LCBzaXplb2YodWludDMyX3QpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaW5hcnlSZWdpb25UeXBlOjpVaW50MzIsIDAsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ19sZW5ndGhfY29tbWVudCkpOworCisgICAgICBCaW5hcnlSZWdpb25Db21tZW50IHN0cmluZ19jb21tZW50OworICAgICAgc3RyaW5nX2NvbW1lbnQudHlwZSA9IEJpbmFyeVJlZ2lvbkNvbW1lbnRUeXBlOjpTdHJpbmdWYWx1ZTsKKworICAgICAgcmVnaW9ucy5wdXNoX2JhY2soTWFrZUJpbmFyeVJlZ2lvbihzdHJpbmdfb2Zmc2V0ICsgc2l6ZW9mKHVpbnQzMl90KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nX3NpemUsIEJpbmFyeVJlZ2lvblR5cGU6OkNoYXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ19zaXplLCAwLCBzdHJpbmdfY29tbWVudCkpOworCisgICAgICBCaW5hcnlSZWdpb25Db21tZW50IHN0cmluZ190ZXJtaW5hdG9yX2NvbW1lbnQ7CisgICAgICBzdHJpbmdfdGVybWluYXRvcl9jb21tZW50LnR5cGUgPQorICAgICAgICAgIEJpbmFyeVJlZ2lvbkNvbW1lbnRUeXBlOjpTdHJpbmdUZXJtaW5hdG9yOworCisgICAgICByZWdpb25zLnB1c2hfYmFjayhNYWtlQmluYXJ5UmVnaW9uKAorICAgICAgICAgIHN0cmluZ19vZmZzZXQgKyBzaXplb2YodWludDMyX3QpICsgc3RyaW5nX3NpemUsIHNpemVvZihjaGFyKSwKKyAgICAgICAgICBCaW5hcnlSZWdpb25UeXBlOjpDaGFyLCAwLCAwLCBzdHJpbmdfdGVybWluYXRvcl9jb21tZW50KSk7CisgICAgfQorICB9CisKKyAgQWRkU2VjdGlvbihzdHJpbmdfb2Zmc2V0LAorICAgICAgICAgICAgIE1ha2VCaW5hcnlTZWN0aW9uKHN0ZDo6c3RyaW5nKHRhYmxlLT5uYW1lKCktPmNfc3RyKCkpICsgIi4iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQtPm5hbWUoKS0+Y19zdHIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaW5hcnlTZWN0aW9uVHlwZTo6U3RyaW5nLCBzdGQ6Om1vdmUocmVnaW9ucykpKTsKK30KKwordm9pZCBCaW5hcnlBbm5vdGF0b3I6OkJ1aWxkVmVjdG9yKGNvbnN0IHVpbnQ2NF90IHZlY3Rvcl9vZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVmbGVjdGlvbjo6T2JqZWN0ICpjb25zdCB0YWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZWZsZWN0aW9uOjpGaWVsZCAqY29uc3QgZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDY0X3QgcGFyZW50X3RhYmxlX29mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWVGFibGUgJnZ0YWJsZSkgeworICBpZiAoQ29udGFpbnNTZWN0aW9uKHZlY3Rvcl9vZmZzZXQpKSB7IHJldHVybjsgfQorCisgIEJpbmFyeVJlZ2lvbkNvbW1lbnQgdmVjdG9yX2xlbmd0aF9jb21tZW50OworICB2ZWN0b3JfbGVuZ3RoX2NvbW1lbnQudHlwZSA9IEJpbmFyeVJlZ2lvbkNvbW1lbnRUeXBlOjpWZWN0b3JMZW5ndGg7CisKKyAgY29uc3QgYXV0byB2ZWN0b3JfbGVuZ3RoID0gUmVhZFNjYWxhcjx1aW50MzJfdD4odmVjdG9yX29mZnNldCk7CisgIGlmICghdmVjdG9yX2xlbmd0aC5oYXNfdmFsdWUoKSkgeworICAgIGNvbnN0IHVpbnQ2NF90IHJlbWFpbmluZyA9IFJlbWFpbmluZ0J5dGVzKHZlY3Rvcl9vZmZzZXQpOworICAgIFNldEVycm9yKHZlY3Rvcl9sZW5ndGhfY29tbWVudCwgQmluYXJ5UmVnaW9uU3RhdHVzOjpFUlJPUl9JTkNPTVBMRVRFX0JJTkFSWSwKKyAgICAgICAgICAgICAiNCIpOworCisgICAgQWRkU2VjdGlvbigKKyAgICAgICAgdmVjdG9yX29mZnNldCwKKyAgICAgICAgTWFrZVNpbmdsZVJlZ2lvbkJpbmFyeVNlY3Rpb24oCisgICAgICAgICAgICBzdGQ6OnN0cmluZyh0YWJsZS0+bmFtZSgpLT5jX3N0cigpKSArICIuIiArIGZpZWxkLT5uYW1lKCktPmNfc3RyKCksCisgICAgICAgICAgICBCaW5hcnlTZWN0aW9uVHlwZTo6VmVjdG9yLAorICAgICAgICAgICAgTWFrZUJpbmFyeVJlZ2lvbih2ZWN0b3Jfb2Zmc2V0LCByZW1haW5pbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpbmFyeVJlZ2lvblR5cGU6OlVua25vd24sIHJlbWFpbmluZywgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yX2xlbmd0aF9jb21tZW50KSkpOworICAgIHJldHVybjsKKyAgfQorCisgIC8vIFZhbGlkYXRlIHRoZXJlIGFyZSBlbm91Z2ggYnl0ZXMgbGVmdCBpbiB0aGUgYmluYXJ5IHRvIHByb2Nlc3MgYWxsIHRoZQorICAvLyBpdGVtcy4KKyAgY29uc3QgdWludDY0X3QgbGFzdF9pdGVtX29mZnNldCA9CisgICAgICB2ZWN0b3Jfb2Zmc2V0ICsgc2l6ZW9mKHVpbnQzMl90KSArCisgICAgICB2ZWN0b3JfbGVuZ3RoLnZhbHVlKCkgKiBHZXRFbGVtZW50U2l6ZShmaWVsZCk7CisKKyAgaWYgKCFJc1ZhbGlkT2Zmc2V0KGxhc3RfaXRlbV9vZmZzZXQgLSAxKSkgeworICAgIFNldEVycm9yKHZlY3Rvcl9sZW5ndGhfY29tbWVudCwgQmluYXJ5UmVnaW9uU3RhdHVzOjpFUlJPUl9MRU5HVEhfVE9PX0xPTkcpOworICAgIEFkZFNlY3Rpb24oCisgICAgICAgIHZlY3Rvcl9vZmZzZXQsCisgICAgICAgIE1ha2VTaW5nbGVSZWdpb25CaW5hcnlTZWN0aW9uKAorICAgICAgICAgICAgc3RkOjpzdHJpbmcodGFibGUtPm5hbWUoKS0+Y19zdHIoKSkgKyAiLiIgKyBmaWVsZC0+bmFtZSgpLT5jX3N0cigpLAorICAgICAgICAgICAgQmluYXJ5U2VjdGlvblR5cGU6OlZlY3RvciwKKyAgICAgICAgICAgIE1ha2VCaW5hcnlSZWdpb24odmVjdG9yX29mZnNldCwgc2l6ZW9mKHVpbnQzMl90KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmluYXJ5UmVnaW9uVHlwZTo6VWludDMyLCAwLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3JfbGVuZ3RoX2NvbW1lbnQpKSk7CisKKyAgICByZXR1cm47CisgIH0KKworICBzdGQ6OnZlY3RvcjxCaW5hcnlSZWdpb24+IHJlZ2lvbnM7CisKKyAgcmVnaW9ucy5wdXNoX2JhY2soTWFrZUJpbmFyeVJlZ2lvbih2ZWN0b3Jfb2Zmc2V0LCBzaXplb2YodWludDMyX3QpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpbmFyeVJlZ2lvblR5cGU6OlVpbnQzMiwgMCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3JfbGVuZ3RoX2NvbW1lbnQpKTsKKworICB1aW50NjRfdCBvZmZzZXQgPSB2ZWN0b3Jfb2Zmc2V0ICsgc2l6ZW9mKHVpbnQzMl90KTsKKworICBzd2l0Y2ggKGZpZWxkLT50eXBlKCktPmVsZW1lbnQoKSkgeworICAgIGNhc2UgcmVmbGVjdGlvbjo6QmFzZVR5cGU6Ok9iajogeworICAgICAgY29uc3QgcmVmbGVjdGlvbjo6T2JqZWN0ICpvYmplY3QgPQorICAgICAgICAgIHNjaGVtYV8tPm9iamVjdHMoKS0+R2V0KGZpZWxkLT50eXBlKCktPmluZGV4KCkpOworCisgICAgICBpZiAob2JqZWN0LT5pc19zdHJ1Y3QoKSkgeworICAgICAgICAvLyBWZWN0b3Igb2Ygc3RydWN0cworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHZlY3Rvcl9sZW5ndGgudmFsdWUoKTsgKytpKSB7CisgICAgICAgICAgLy8gU3RydWN0cyBhcmUgaW5saW5lIHRvIHRoZSB2ZWN0b3IuCisgICAgICAgICAgY29uc3QgdWludDY0X3QgbmV4dF9vZmZzZXQgPSBCdWlsZFN0cnVjdChvZmZzZXQsIHJlZ2lvbnMsIG9iamVjdCk7CisgICAgICAgICAgaWYgKG5leHRfb2Zmc2V0ID09IG9mZnNldCkgeyBicmVhazsgfQorICAgICAgICAgIG9mZnNldCA9IG5leHRfb2Zmc2V0OworICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICAvLyBWZWN0b3Igb2Ygb2JqZWN0cworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHZlY3Rvcl9sZW5ndGgudmFsdWUoKTsgKytpKSB7CisgICAgICAgICAgQmluYXJ5UmVnaW9uQ29tbWVudCB2ZWN0b3Jfb2JqZWN0X2NvbW1lbnQ7CisgICAgICAgICAgdmVjdG9yX29iamVjdF9jb21tZW50LnR5cGUgPQorICAgICAgICAgICAgICBCaW5hcnlSZWdpb25Db21tZW50VHlwZTo6VmVjdG9yVGFibGVWYWx1ZTsKKyAgICAgICAgICB2ZWN0b3Jfb2JqZWN0X2NvbW1lbnQuaW5kZXggPSBpOworCisgICAgICAgICAgY29uc3QgYXV0byB0YWJsZV9yZWxhdGl2ZV9vZmZzZXQgPSBSZWFkU2NhbGFyPHVpbnQzMl90PihvZmZzZXQpOworICAgICAgICAgIGlmICghdGFibGVfcmVsYXRpdmVfb2Zmc2V0Lmhhc192YWx1ZSgpKSB7CisgICAgICAgICAgICBjb25zdCB1aW50NjRfdCByZW1haW5pbmcgPSBSZW1haW5pbmdCeXRlcyhvZmZzZXQpOworICAgICAgICAgICAgU2V0RXJyb3IodmVjdG9yX29iamVjdF9jb21tZW50LAorICAgICAgICAgICAgICAgICAgICAgQmluYXJ5UmVnaW9uU3RhdHVzOjpFUlJPUl9JTkNPTVBMRVRFX0JJTkFSWSwgIjQiKTsKKworICAgICAgICAgICAgcmVnaW9ucy5wdXNoX2JhY2soCisgICAgICAgICAgICAgICAgTWFrZUJpbmFyeVJlZ2lvbihvZmZzZXQsIHJlbWFpbmluZywgQmluYXJ5UmVnaW9uVHlwZTo6VW5rbm93biwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbWFpbmluZywgMCwgdmVjdG9yX29iamVjdF9jb21tZW50KSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisKKyAgICAgICAgICAvLyBUaGUgdGFibGUgb2Zmc2V0IGlzIHJlbGF0aXZlIGZyb20gdGhlIG9mZnNldCBsb2NhdGlvbiBpdHNlbGYuCisgICAgICAgICAgY29uc3QgdWludDY0X3QgdGFibGVfb2Zmc2V0ID0gb2Zmc2V0ICsgdGFibGVfcmVsYXRpdmVfb2Zmc2V0LnZhbHVlKCk7CisKKyAgICAgICAgICBpZiAoIUlzVmFsaWRPZmZzZXQodGFibGVfb2Zmc2V0KSkgeworICAgICAgICAgICAgU2V0RXJyb3IodmVjdG9yX29iamVjdF9jb21tZW50LAorICAgICAgICAgICAgICAgICAgICAgQmluYXJ5UmVnaW9uU3RhdHVzOjpFUlJPUl9PRkZTRVRfT1VUX09GX0JJTkFSWSk7CisgICAgICAgICAgICByZWdpb25zLnB1c2hfYmFjayhNYWtlQmluYXJ5UmVnaW9uKAorICAgICAgICAgICAgICAgIG9mZnNldCwgc2l6ZW9mKHVpbnQzMl90KSwgQmluYXJ5UmVnaW9uVHlwZTo6VU9mZnNldCwgMCwKKyAgICAgICAgICAgICAgICB0YWJsZV9vZmZzZXQsIHZlY3Rvcl9vYmplY3RfY29tbWVudCkpOworCisgICAgICAgICAgICBvZmZzZXQgKz0gc2l6ZW9mKHVpbnQzMl90KTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgIH0KKworICAgICAgICAgIGlmICh0YWJsZV9vZmZzZXQgPT0gcGFyZW50X3RhYmxlX29mZnNldCkgeworICAgICAgICAgICAgU2V0RXJyb3IodmVjdG9yX29iamVjdF9jb21tZW50LAorICAgICAgICAgICAgICAgICAgICAgQmluYXJ5UmVnaW9uU3RhdHVzOjpFUlJPUl9DWUNMRV9ERVRFQ1RFRCk7CisgICAgICAgICAgICAvLyBBIGN5Y2xlIGRldGVjdGVkIHdoZXJlIGEgdGFibGUgdmVjdG9yIGZpZWxkIGlzIHBvaW50aW5nIHRvCisgICAgICAgICAgICAvLyBpdHNlbGYuIFRoaXMgc2hvdWxkIG9ubHkgaGFwcGVuIGluIGNvcnJ1cHRlZCBmaWxlcy4KKyAgICAgICAgICAgIHJlZ2lvbnMucHVzaF9iYWNrKE1ha2VCaW5hcnlSZWdpb24oCisgICAgICAgICAgICAgICAgb2Zmc2V0LCBzaXplb2YodWludDMyX3QpLCBCaW5hcnlSZWdpb25UeXBlOjpVT2Zmc2V0LCAwLAorICAgICAgICAgICAgICAgIHRhYmxlX29mZnNldCwgdmVjdG9yX29iamVjdF9jb21tZW50KSk7CisKKyAgICAgICAgICAgIG9mZnNldCArPSBzaXplb2YodWludDMyX3QpOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgfQorCisgICAgICAgICAgcmVnaW9ucy5wdXNoX2JhY2soTWFrZUJpbmFyeVJlZ2lvbigKKyAgICAgICAgICAgICAgb2Zmc2V0LCBzaXplb2YodWludDMyX3QpLCBCaW5hcnlSZWdpb25UeXBlOjpVT2Zmc2V0LCAwLAorICAgICAgICAgICAgICB0YWJsZV9vZmZzZXQsIHZlY3Rvcl9vYmplY3RfY29tbWVudCkpOworCisgICAgICAgICAgb2Zmc2V0ICs9IHNpemVvZih1aW50MzJfdCk7CisKKyAgICAgICAgICBCdWlsZFRhYmxlKHRhYmxlX29mZnNldCwgQmluYXJ5U2VjdGlvblR5cGU6OlRhYmxlLCBvYmplY3QpOworICAgICAgICB9CisgICAgICB9CisgICAgfSBicmVhazsKKyAgICBjYXNlIHJlZmxlY3Rpb246OkJhc2VUeXBlOjpTdHJpbmc6IHsKKyAgICAgIC8vIFZlY3RvciBvZiBzdHJpbmdzCisgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHZlY3Rvcl9sZW5ndGgudmFsdWUoKTsgKytpKSB7CisgICAgICAgIEJpbmFyeVJlZ2lvbkNvbW1lbnQgdmVjdG9yX29iamVjdF9jb21tZW50OworICAgICAgICB2ZWN0b3Jfb2JqZWN0X2NvbW1lbnQudHlwZSA9IEJpbmFyeVJlZ2lvbkNvbW1lbnRUeXBlOjpWZWN0b3JTdHJpbmdWYWx1ZTsKKyAgICAgICAgdmVjdG9yX29iamVjdF9jb21tZW50LmluZGV4ID0gaTsKKworICAgICAgICBjb25zdCBhdXRvIHN0cmluZ19yZWxhdGl2ZV9vZmZzZXQgPSBSZWFkU2NhbGFyPHVpbnQzMl90PihvZmZzZXQpOworICAgICAgICBpZiAoIXN0cmluZ19yZWxhdGl2ZV9vZmZzZXQuaGFzX3ZhbHVlKCkpIHsKKyAgICAgICAgICBjb25zdCB1aW50NjRfdCByZW1haW5pbmcgPSBSZW1haW5pbmdCeXRlcyhvZmZzZXQpOworCisgICAgICAgICAgU2V0RXJyb3IodmVjdG9yX29iamVjdF9jb21tZW50LAorICAgICAgICAgICAgICAgICAgIEJpbmFyeVJlZ2lvblN0YXR1czo6RVJST1JfSU5DT01QTEVURV9CSU5BUlksICI0Iik7CisKKyAgICAgICAgICByZWdpb25zLnB1c2hfYmFjaygKKyAgICAgICAgICAgICAgTWFrZUJpbmFyeVJlZ2lvbihvZmZzZXQsIHJlbWFpbmluZywgQmluYXJ5UmVnaW9uVHlwZTo6VW5rbm93biwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZW1haW5pbmcsIDAsIHZlY3Rvcl9vYmplY3RfY29tbWVudCkpOworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgLy8gVGhlIHN0cmluZyBvZmZzZXQgaXMgcmVsYXRpdmUgZnJvbSB0aGUgb2Zmc2V0IGxvY2F0aW9uIGl0c2VsZi4KKyAgICAgICAgY29uc3QgdWludDY0X3Qgc3RyaW5nX29mZnNldCA9IG9mZnNldCArIHN0cmluZ19yZWxhdGl2ZV9vZmZzZXQudmFsdWUoKTsKKworICAgICAgICBpZiAoIUlzVmFsaWRPZmZzZXQoc3RyaW5nX29mZnNldCkpIHsKKyAgICAgICAgICBTZXRFcnJvcih2ZWN0b3Jfb2JqZWN0X2NvbW1lbnQsCisgICAgICAgICAgICAgICAgICAgQmluYXJ5UmVnaW9uU3RhdHVzOjpFUlJPUl9PRkZTRVRfT1VUX09GX0JJTkFSWSk7CisgICAgICAgICAgcmVnaW9ucy5wdXNoX2JhY2soTWFrZUJpbmFyeVJlZ2lvbigKKyAgICAgICAgICAgICAgb2Zmc2V0LCBzaXplb2YodWludDMyX3QpLCBCaW5hcnlSZWdpb25UeXBlOjpVT2Zmc2V0LCAwLAorICAgICAgICAgICAgICBzdHJpbmdfb2Zmc2V0LCB2ZWN0b3Jfb2JqZWN0X2NvbW1lbnQpKTsKKworICAgICAgICAgIG9mZnNldCArPSBzaXplb2YodWludDMyX3QpOworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgcmVnaW9ucy5wdXNoX2JhY2soTWFrZUJpbmFyeVJlZ2lvbigKKyAgICAgICAgICAgIG9mZnNldCwgc2l6ZW9mKHVpbnQzMl90KSwgQmluYXJ5UmVnaW9uVHlwZTo6VU9mZnNldCwgMCwKKyAgICAgICAgICAgIHN0cmluZ19vZmZzZXQsIHZlY3Rvcl9vYmplY3RfY29tbWVudCkpOworCisgICAgICAgIEJ1aWxkU3RyaW5nKHN0cmluZ19vZmZzZXQsIHRhYmxlLCBmaWVsZCk7CisKKyAgICAgICAgb2Zmc2V0ICs9IHNpemVvZih1aW50MzJfdCk7CisgICAgICB9CisgICAgfSBicmVhazsKKyAgICBjYXNlIHJlZmxlY3Rpb246OkJhc2VUeXBlOjpVbmlvbjogeworICAgICAgLy8gVmVjdG9yIG9mIHVuaW9ucworICAgICAgLy8gVW5pb25zIGhhdmUgYm90aCB0aGVpciByZWFsaXplZCB0eXBlICh1aW50OF90IGZvciBub3cpIHRoYXQgYXJlCisgICAgICAvLyBzdG9yZWQgc2VwYXJhdGVseS4gVGhlc2UgYXJlIHN0b3JlZCBpbiB0aGUgZmllbGQtPmluZGV4KCkgLSAxCisgICAgICAvLyBsb2NhdGlvbi4KKyAgICAgIGNvbnN0IHVpbnQxNl90IHVuaW9uX3R5cGVfdmVjdG9yX2lkID0gZmllbGQtPmlkKCkgLSAxOworCisgICAgICBhdXRvIHZ0YWJsZV9lbnRyeSA9IHZ0YWJsZS5maWVsZHMuZmluZCh1bmlvbl90eXBlX3ZlY3Rvcl9pZCk7CisgICAgICBpZiAodnRhYmxlX2VudHJ5ID09IHZ0YWJsZS5maWVsZHMuZW5kKCkpIHsKKyAgICAgICAgLy8gVE9ETyhkYmFpbGV5Y2hlc3MpOiBuZWVkIHRvIGNhcHR1cmUgdGhpcyBlcnJvciBjb25kaXRpb24uCisgICAgICAgIGJyZWFrOworICAgICAgfQorCisgICAgICBjb25zdCB1aW50NjRfdCB1bmlvbl90eXBlX3ZlY3Rvcl9maWVsZF9vZmZzZXQgPQorICAgICAgICAgIHBhcmVudF90YWJsZV9vZmZzZXQgKyB2dGFibGVfZW50cnktPnNlY29uZC5vZmZzZXRfZnJvbV90YWJsZTsKKworICAgICAgY29uc3QgYXV0byB1bmlvbl90eXBlX3ZlY3Rvcl9maWVsZF9yZWxhdGl2ZV9vZmZzZXQgPQorICAgICAgICAgIFJlYWRTY2FsYXI8dWludDE2X3Q+KHVuaW9uX3R5cGVfdmVjdG9yX2ZpZWxkX29mZnNldCk7CisKKyAgICAgIGlmICghdW5pb25fdHlwZV92ZWN0b3JfZmllbGRfcmVsYXRpdmVfb2Zmc2V0Lmhhc192YWx1ZSgpKSB7CisgICAgICAgIGNvbnN0IHVpbnQ2NF90IHJlbWFpbmluZyA9IFJlbWFpbmluZ0J5dGVzKG9mZnNldCk7CisgICAgICAgIEJpbmFyeVJlZ2lvbkNvbW1lbnQgdmVjdG9yX3VuaW9uX2NvbW1lbnQ7CisgICAgICAgIHZlY3Rvcl91bmlvbl9jb21tZW50LnR5cGUgPSBCaW5hcnlSZWdpb25Db21tZW50VHlwZTo6VmVjdG9yVW5pb25WYWx1ZTsKKyAgICAgICAgU2V0RXJyb3IodmVjdG9yX3VuaW9uX2NvbW1lbnQsCisgICAgICAgICAgICAgICAgIEJpbmFyeVJlZ2lvblN0YXR1czo6RVJST1JfSU5DT01QTEVURV9CSU5BUlksICIyIik7CisKKyAgICAgICAgcmVnaW9ucy5wdXNoX2JhY2soTWFrZUJpbmFyeVJlZ2lvbihvZmZzZXQsIHJlbWFpbmluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaW5hcnlSZWdpb25UeXBlOjpVbmtub3duLCByZW1haW5pbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgdmVjdG9yX3VuaW9uX2NvbW1lbnQpKTsKKworICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgLy8gR2V0IHRoZSBvZmZzZXQgdG8gdGhlIGZpcnN0IHR5cGUgKHRoZSArIHNpemVvZih1aW50MzJfdCkgaXMgdG8gc2tpcAorICAgICAgLy8gb3ZlciB0aGUgdmVjdG9yIGxlbmd0aCB3aGljaCB3ZSBhbHJlYWR5IGtub3cpLiBWYWxpZGF0aW9uIGhhcHBlbnMKKyAgICAgIC8vIHdpdGhpbiB0aGUgbG9vcCBiZWxvdy4KKyAgICAgIGNvbnN0IHVpbnQ2NF90IHVuaW9uX3R5cGVfdmVjdG9yX2RhdGFfb2Zmc2V0ID0KKyAgICAgICAgICB1bmlvbl90eXBlX3ZlY3Rvcl9maWVsZF9vZmZzZXQgKworICAgICAgICAgIHVuaW9uX3R5cGVfdmVjdG9yX2ZpZWxkX3JlbGF0aXZlX29mZnNldC52YWx1ZSgpICsgc2l6ZW9mKHVpbnQzMl90KTsKKworICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCB2ZWN0b3JfbGVuZ3RoLnZhbHVlKCk7ICsraSkgeworICAgICAgICBCaW5hcnlSZWdpb25Db21tZW50IGNvbW1lbnQ7CisgICAgICAgIGNvbW1lbnQudHlwZSA9IEJpbmFyeVJlZ2lvbkNvbW1lbnRUeXBlOjpWZWN0b3JVbmlvblZhbHVlOworICAgICAgICBjb21tZW50LmluZGV4ID0gaTsKKworICAgICAgICBjb25zdCBhdXRvIHVuaW9uX3JlbGF0aXZlX29mZnNldCA9IFJlYWRTY2FsYXI8dWludDMyX3Q+KG9mZnNldCk7CisgICAgICAgIGlmICghdW5pb25fcmVsYXRpdmVfb2Zmc2V0Lmhhc192YWx1ZSgpKSB7CisgICAgICAgICAgY29uc3QgdWludDY0X3QgcmVtYWluaW5nID0gUmVtYWluaW5nQnl0ZXMob2Zmc2V0KTsKKworICAgICAgICAgIFNldEVycm9yKGNvbW1lbnQsIEJpbmFyeVJlZ2lvblN0YXR1czo6RVJST1JfSU5DT01QTEVURV9CSU5BUlksICI0Iik7CisKKyAgICAgICAgICByZWdpb25zLnB1c2hfYmFjayhNYWtlQmluYXJ5UmVnaW9uKG9mZnNldCwgcmVtYWluaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmluYXJ5UmVnaW9uVHlwZTo6VW5rbm93biwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbWFpbmluZywgMCwgY29tbWVudCkpOworCisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICAvLyBUaGUgdW5pb24gb2Zmc2V0IGlzIHJlbGF0aXZlIGZyb20gdGhlIG9mZnNldCBsb2NhdGlvbiBpdHNlbGYuCisgICAgICAgIGNvbnN0IHVpbnQ2NF90IHVuaW9uX29mZnNldCA9IG9mZnNldCArIHVuaW9uX3JlbGF0aXZlX29mZnNldC52YWx1ZSgpOworCisgICAgICAgIGlmICghSXNWYWxpZE9mZnNldCh1bmlvbl9vZmZzZXQpKSB7CisgICAgICAgICAgU2V0RXJyb3IoY29tbWVudCwgQmluYXJ5UmVnaW9uU3RhdHVzOjpFUlJPUl9PRkZTRVRfT1VUX09GX0JJTkFSWSk7CisKKyAgICAgICAgICByZWdpb25zLnB1c2hfYmFjayhNYWtlQmluYXJ5UmVnaW9uKG9mZnNldCwgc2l6ZW9mKHVpbnQzMl90KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpbmFyeVJlZ2lvblR5cGU6OlVPZmZzZXQsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmlvbl9vZmZzZXQsIGNvbW1lbnQpKTsKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIGNvbnN0IGF1dG8gcmVhbGl6ZWRfdHlwZSA9CisgICAgICAgICAgICBSZWFkU2NhbGFyPHVpbnQ4X3Q+KHVuaW9uX3R5cGVfdmVjdG9yX2RhdGFfb2Zmc2V0ICsgaSk7CisKKyAgICAgICAgaWYgKCFyZWFsaXplZF90eXBlLmhhc192YWx1ZSgpKSB7CisgICAgICAgICAgU2V0RXJyb3IoY29tbWVudCwgQmluYXJ5UmVnaW9uU3RhdHVzOjpFUlJPUl9JTkNPTVBMRVRFX0JJTkFSWSwgIjEiKTsKKyAgICAgICAgICByZWdpb25zLnB1c2hfYmFjayhNYWtlQmluYXJ5UmVnaW9uKAorICAgICAgICAgICAgICBvZmZzZXQsIDAsIEJpbmFyeVJlZ2lvblR5cGU6OlVua25vd24sIDAsIDAsIGNvbW1lbnQpKTsKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICghSXNWYWxpZFVuaW9uVmFsdWUodnRhYmxlX2VudHJ5LT5zZWNvbmQuZmllbGQtPnR5cGUoKS0+aW5kZXgoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFsaXplZF90eXBlLnZhbHVlKCkpKSB7CisgICAgICAgICAgLy8gV2UgYWxyZWFkeSBleHBvcnQgYW4gZXJyb3IgaW4gdGhlIHVuaW9uIHR5cGUgZmllbGQsIHNvIGp1c3Qgc2tpcAorICAgICAgICAgIC8vIGJ1aWxkaW5nIHRoZSB1bmlvbiBpdHNlbGYgYW5kIGl0IHdpbGwgZGVmYXVsdCB0byBhbiB1bnJlZmVyZW5jZQorICAgICAgICAgIC8vIEJpbmFyeSBzZWN0aW9uLgorICAgICAgICAgIG9mZnNldCArPSBzaXplb2YodWludDMyX3QpOworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgZW51bV90eXBlID0KKyAgICAgICAgICAgIEJ1aWxkVW5pb24odW5pb25fb2Zmc2V0LCByZWFsaXplZF90eXBlLnZhbHVlKCksIGZpZWxkKTsKKworICAgICAgICBjb21tZW50LmRlZmF1bHRfdmFsdWUgPSAiKGAiICsgZW51bV90eXBlICsgImApIjsKKyAgICAgICAgcmVnaW9ucy5wdXNoX2JhY2soTWFrZUJpbmFyeVJlZ2lvbihvZmZzZXQsIHNpemVvZih1aW50MzJfdCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmluYXJ5UmVnaW9uVHlwZTo6VU9mZnNldCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmlvbl9vZmZzZXQsIGNvbW1lbnQpKTsKKworICAgICAgICBvZmZzZXQgKz0gc2l6ZW9mKHVpbnQzMl90KTsKKyAgICAgIH0KKyAgICB9IGJyZWFrOworICAgIGRlZmF1bHQ6IHsKKyAgICAgIGlmIChJc1NjYWxhcihmaWVsZC0+dHlwZSgpLT5lbGVtZW50KCkpKSB7CisgICAgICAgIGNvbnN0IEJpbmFyeVJlZ2lvblR5cGUgYmluYXJ5X3JlZ2lvbl90eXBlID0KKyAgICAgICAgICAgIEdldFJlZ2lvblR5cGUoZmllbGQtPnR5cGUoKS0+ZWxlbWVudCgpKTsKKworICAgICAgICBjb25zdCB1aW50NjRfdCB0eXBlX3NpemUgPSBHZXRUeXBlU2l6ZShmaWVsZC0+dHlwZSgpLT5lbGVtZW50KCkpOworCisgICAgICAgIC8vIFRPRE8oZGJhaWxleWNoZXNzKTogSXQgbWlnaHQgYmUgbmljZXIgdG8gdXNlciB0aGUKKyAgICAgICAgLy8gQmluYXJ5UmVnaW9uLmFycmF5X2xlbmd0aCBmaWVsZCB0byBpbmRpY2F0ZSB0aGlzLgorICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHZlY3Rvcl9sZW5ndGgudmFsdWUoKTsgKytpKSB7CisgICAgICAgICAgQmluYXJ5UmVnaW9uQ29tbWVudCB2ZWN0b3Jfc2NhbGFyX2NvbW1lbnQ7CisgICAgICAgICAgdmVjdG9yX3NjYWxhcl9jb21tZW50LnR5cGUgPSBCaW5hcnlSZWdpb25Db21tZW50VHlwZTo6VmVjdG9yVmFsdWU7CisgICAgICAgICAgdmVjdG9yX3NjYWxhcl9jb21tZW50LmluZGV4ID0gaTsKKworICAgICAgICAgIGlmICghSXNWYWxpZFJlYWQob2Zmc2V0LCB0eXBlX3NpemUpKSB7CisgICAgICAgICAgICBjb25zdCB1aW50NjRfdCByZW1haW5pbmcgPSBSZW1haW5pbmdCeXRlcyhvZmZzZXQpOworCisgICAgICAgICAgICBTZXRFcnJvcih2ZWN0b3Jfc2NhbGFyX2NvbW1lbnQsCisgICAgICAgICAgICAgICAgICAgICBCaW5hcnlSZWdpb25TdGF0dXM6OkVSUk9SX0lOQ09NUExFVEVfQklOQVJZLAorICAgICAgICAgICAgICAgICAgICAgc3RkOjp0b19zdHJpbmcodHlwZV9zaXplKSk7CisKKyAgICAgICAgICAgIHJlZ2lvbnMucHVzaF9iYWNrKAorICAgICAgICAgICAgICAgIE1ha2VCaW5hcnlSZWdpb24ob2Zmc2V0LCByZW1haW5pbmcsIEJpbmFyeVJlZ2lvblR5cGU6OlVua25vd24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZW1haW5pbmcsIDAsIHZlY3Rvcl9zY2FsYXJfY29tbWVudCkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorCisgICAgICAgICAgaWYgKElzVW5pb25UeXBlKGZpZWxkLT50eXBlKCktPmVsZW1lbnQoKSkpIHsKKyAgICAgICAgICAgIC8vIFRoaXMgaXMgYSB0eXBlIGZvciBhIHVuaW9uLiBWYWxpZGF0ZSB0aGUgdmFsdWUKKyAgICAgICAgICAgIGNvbnN0IGF1dG8gZW51bV92YWx1ZSA9IFJlYWRTY2FsYXI8dWludDhfdD4ob2Zmc2V0KTsKKworICAgICAgICAgICAgLy8gVGhpcyBzaG91bGQgYWx3YXlzIGhhdmUgYSB2YWx1ZSwgZHVlIHRvIHRoZSBJc1ZhbGlkUmVhZCBjaGVjaworICAgICAgICAgICAgLy8gYWJvdmUuCisgICAgICAgICAgICBpZiAoIUlzVmFsaWRVbmlvblZhbHVlKGZpZWxkLT50eXBlKCktPmluZGV4KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudW1fdmFsdWUudmFsdWUoKSkpIHsKKyAgICAgICAgICAgICAgU2V0RXJyb3IodmVjdG9yX3NjYWxhcl9jb21tZW50LAorICAgICAgICAgICAgICAgICAgICAgICBCaW5hcnlSZWdpb25TdGF0dXM6OkVSUk9SX0lOVkFMSURfVU5JT05fVFlQRSk7CisgICAgICAgICAgICAgIHJlZ2lvbnMucHVzaF9iYWNrKE1ha2VCaW5hcnlSZWdpb24ob2Zmc2V0LCB0eXBlX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmluYXJ5X3JlZ2lvbl90eXBlLCAwLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3Rvcl9zY2FsYXJfY29tbWVudCkpOworICAgICAgICAgICAgICBvZmZzZXQgKz0gdHlwZV9zaXplOworICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisKKyAgICAgICAgICByZWdpb25zLnB1c2hfYmFjayhNYWtlQmluYXJ5UmVnaW9uKG9mZnNldCwgdHlwZV9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmluYXJ5X3JlZ2lvbl90eXBlLCAwLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yX3NjYWxhcl9jb21tZW50KSk7CisgICAgICAgICAgb2Zmc2V0ICs9IHR5cGVfc2l6ZTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0gYnJlYWs7CisgIH0KKyAgQWRkU2VjdGlvbih2ZWN0b3Jfb2Zmc2V0LAorICAgICAgICAgICAgIE1ha2VCaW5hcnlTZWN0aW9uKHN0ZDo6c3RyaW5nKHRhYmxlLT5uYW1lKCktPmNfc3RyKCkpICsgIi4iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQtPm5hbWUoKS0+Y19zdHIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaW5hcnlTZWN0aW9uVHlwZTo6VmVjdG9yLCBzdGQ6Om1vdmUocmVnaW9ucykpKTsKK30KKworc3RkOjpzdHJpbmcgQmluYXJ5QW5ub3RhdG9yOjpCdWlsZFVuaW9uKGNvbnN0IHVpbnQ2NF90IHVuaW9uX29mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90IHJlYWxpemVkX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVmbGVjdGlvbjo6RmllbGQgKmNvbnN0IGZpZWxkKSB7CisgIGNvbnN0IHJlZmxlY3Rpb246OkVudW0gKm5leHRfZW51bSA9CisgICAgICBzY2hlbWFfLT5lbnVtcygpLT5HZXQoZmllbGQtPnR5cGUoKS0+aW5kZXgoKSk7CisKKyAgY29uc3QgcmVmbGVjdGlvbjo6RW51bVZhbCAqZW51bV92YWwgPSBuZXh0X2VudW0tPnZhbHVlcygpLT5HZXQocmVhbGl6ZWRfdHlwZSk7CisKKyAgaWYgKENvbnRhaW5zU2VjdGlvbih1bmlvbl9vZmZzZXQpKSB7IHJldHVybiBlbnVtX3ZhbC0+bmFtZSgpLT5jX3N0cigpOyB9CisKKyAgY29uc3QgcmVmbGVjdGlvbjo6VHlwZSAqdW5pb25fdHlwZSA9IGVudW1fdmFsLT51bmlvbl90eXBlKCk7CisKKyAgaWYgKHVuaW9uX3R5cGUtPmJhc2VfdHlwZSgpID09IHJlZmxlY3Rpb246OkJhc2VUeXBlOjpPYmopIHsKKyAgICBjb25zdCByZWZsZWN0aW9uOjpPYmplY3QgKm9iamVjdCA9CisgICAgICAgIHNjaGVtYV8tPm9iamVjdHMoKS0+R2V0KHVuaW9uX3R5cGUtPmluZGV4KCkpOworCisgICAgaWYgKG9iamVjdC0+aXNfc3RydWN0KCkpIHsKKyAgICAgIC8vIFVuaW9uIG9mIHZlY3RvcnMgcG9pbnQgdG8gYSBuZXcgQmluYXJ5IHNlY3Rpb24KKyAgICAgIHN0ZDo6dmVjdG9yPEJpbmFyeVJlZ2lvbj4gcmVnaW9uczsKKworICAgICAgQnVpbGRTdHJ1Y3QodW5pb25fb2Zmc2V0LCByZWdpb25zLCBvYmplY3QpOworCisgICAgICBBZGRTZWN0aW9uKAorICAgICAgICAgIHVuaW9uX29mZnNldCwKKyAgICAgICAgICBNYWtlQmluYXJ5U2VjdGlvbihzdGQ6OnN0cmluZyhvYmplY3QtPm5hbWUoKS0+Y19zdHIoKSkgKyAiLiIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZC0+bmFtZSgpLT5jX3N0cigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpbmFyeVNlY3Rpb25UeXBlOjpVbmlvbiwgc3RkOjptb3ZlKHJlZ2lvbnMpKSk7CisgICAgfSBlbHNlIHsKKyAgICAgIEJ1aWxkVGFibGUodW5pb25fb2Zmc2V0LCBCaW5hcnlTZWN0aW9uVHlwZTo6VGFibGUsIG9iamVjdCk7CisgICAgfQorICB9CisgIC8vIFRPRE8oZGJhaWxleWNoZXNzKTogaGFuZGxlIHRoZSBvdGhlciB1bmlvbiB0eXBlcy4KKworICByZXR1cm4gZW51bV92YWwtPm5hbWUoKS0+Y19zdHIoKTsKK30KKwordm9pZCBCaW5hcnlBbm5vdGF0b3I6OkZpeE1pc3NpbmdSZWdpb25zKCkgeworICBzdGQ6OnZlY3RvcjxCaW5hcnlSZWdpb24+IHJlZ2lvbnNfdG9faW5zZXJ0OworICBmb3IgKGF1dG8gJmN1cnJlbnRfc2VjdGlvbiA6IHNlY3Rpb25zXykgeworICAgIEJpbmFyeVNlY3Rpb24gJnNlY3Rpb24gPSBjdXJyZW50X3NlY3Rpb24uc2Vjb25kOworICAgIGlmIChzZWN0aW9uLnJlZ2lvbnMuZW1wdHkoKSkgeworICAgICAgLy8gVE9ETyhkYmFpbGV5Y2hlc3MpOiBpcyB0aGlzIHBvc3NpYmxlPworICAgICAgY29udGludWU7CisgICAgfQorCisgICAgdWludDY0X3Qgb2Zmc2V0ID0gc2VjdGlvbi5yZWdpb25zWzBdLm9mZnNldCArIHNlY3Rpb24ucmVnaW9uc1swXS5sZW5ndGg7CisgICAgZm9yIChzaXplX3QgaSA9IDE7IGkgPCBzZWN0aW9uLnJlZ2lvbnMuc2l6ZSgpOyArK2kpIHsKKyAgICAgIEJpbmFyeVJlZ2lvbiAmcmVnaW9uID0gc2VjdGlvbi5yZWdpb25zW2ldOworCisgICAgICBjb25zdCB1aW50NjRfdCBuZXh0X29mZnNldCA9IHJlZ2lvbi5vZmZzZXQ7CisgICAgICBpZiAoIUlzVmFsaWRPZmZzZXQobmV4dF9vZmZzZXQpKSB7CisgICAgICAgIC8vIFRPRE8oZGJhaWxleWNoZXNzKTogZmlndXJlIG91dCBob3cgd2UgZ2V0IGludG8gdGhpcyBzaXR1YXRpb24uCisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorCisgICAgICBpZiAob2Zmc2V0IDwgbmV4dF9vZmZzZXQpIHsKKyAgICAgICAgY29uc3QgdWludDY0X3QgcGFkZGluZ19ieXRlcyA9IG5leHRfb2Zmc2V0IC0gb2Zmc2V0OworCisgICAgICAgIEJpbmFyeVJlZ2lvbkNvbW1lbnQgY29tbWVudDsKKyAgICAgICAgY29tbWVudC50eXBlID0gQmluYXJ5UmVnaW9uQ29tbWVudFR5cGU6OlBhZGRpbmc7CisKKyAgICAgICAgaWYgKElzTm9uWmVyb1JlZ2lvbihvZmZzZXQsIHBhZGRpbmdfYnl0ZXMsIGJpbmFyeV8pKSB7CisgICAgICAgICAgU2V0RXJyb3IoY29tbWVudCwgQmluYXJ5UmVnaW9uU3RhdHVzOjpXQVJOX05PX1JFRkVSRU5DRVMpOworICAgICAgICAgIHJlZ2lvbnNfdG9faW5zZXJ0LnB1c2hfYmFjaygKKyAgICAgICAgICAgICAgTWFrZUJpbmFyeVJlZ2lvbihvZmZzZXQsIHBhZGRpbmdfYnl0ZXMsIEJpbmFyeVJlZ2lvblR5cGU6OlVua25vd24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFkZGluZ19ieXRlcywgMCwgY29tbWVudCkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHJlZ2lvbnNfdG9faW5zZXJ0LnB1c2hfYmFjaygKKyAgICAgICAgICAgICAgTWFrZUJpbmFyeVJlZ2lvbihvZmZzZXQsIHBhZGRpbmdfYnl0ZXMsIEJpbmFyeVJlZ2lvblR5cGU6OlVpbnQ4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhZGRpbmdfYnl0ZXMsIDAsIGNvbW1lbnQpKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgb2Zmc2V0ID0gbmV4dF9vZmZzZXQgKyByZWdpb24ubGVuZ3RoOworICAgIH0KKworICAgIGlmICghcmVnaW9uc190b19pbnNlcnQuZW1wdHkoKSkgeworICAgICAgc2VjdGlvbi5yZWdpb25zLmluc2VydChzZWN0aW9uLnJlZ2lvbnMuZW5kKCksIHJlZ2lvbnNfdG9faW5zZXJ0LmJlZ2luKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lvbnNfdG9faW5zZXJ0LmVuZCgpKTsKKyAgICAgIHN0ZDo6c3RhYmxlX3NvcnQoc2VjdGlvbi5yZWdpb25zLmJlZ2luKCksIHNlY3Rpb24ucmVnaW9ucy5lbmQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgQmluYXJ5UmVnaW9uU29ydCk7CisgICAgICByZWdpb25zX3RvX2luc2VydC5jbGVhcigpOworICAgIH0KKyAgfQorfQorCit2b2lkIEJpbmFyeUFubm90YXRvcjo6Rml4TWlzc2luZ1NlY3Rpb25zKCkgeworICB1aW50NjRfdCBvZmZzZXQgPSAwOworCisgIHN0ZDo6dmVjdG9yPEJpbmFyeVNlY3Rpb24+IHNlY3Rpb25zX3RvX2luc2VydDsKKworICBmb3IgKGF1dG8gJmN1cnJlbnRfc2VjdGlvbiA6IHNlY3Rpb25zXykgeworICAgIEJpbmFyeVNlY3Rpb24gJnNlY3Rpb24gPSBjdXJyZW50X3NlY3Rpb24uc2Vjb25kOworICAgIGNvbnN0IHVpbnQ2NF90IHNlY3Rpb25fc3RhcnRfb2Zmc2V0ID0gY3VycmVudF9zZWN0aW9uLmZpcnN0OworICAgIGNvbnN0IHVpbnQ2NF90IHNlY3Rpb25fZW5kX29mZnNldCA9CisgICAgICAgIHNlY3Rpb24ucmVnaW9ucy5iYWNrKCkub2Zmc2V0ICsgc2VjdGlvbi5yZWdpb25zLmJhY2soKS5sZW5ndGg7CisKKyAgICBpZiAob2Zmc2V0IDwgc2VjdGlvbl9zdGFydF9vZmZzZXQpIHsKKyAgICAgIC8vIFdlIGFyZSBhdCBhbiBvZmZzZXQgdGhhdCBpcyBsZXNzIHRoZW4gdGhlIGN1cnJlbnQgc2VjdGlvbi4KKyAgICAgIGNvbnN0IHVpbnQ2NF90IHBhZF9ieXRlcyA9IHNlY3Rpb25fc3RhcnRfb2Zmc2V0IC0gb2Zmc2V0ICsgMTsKKworICAgICAgc2VjdGlvbnNfdG9faW5zZXJ0LnB1c2hfYmFjaygKKyAgICAgICAgICBHZW5lcmF0ZU1pc3NpbmdTZWN0aW9uKG9mZnNldCAtIDEsIHBhZF9ieXRlcywgYmluYXJ5XykpOworICAgIH0KKyAgICBvZmZzZXQgPSBzZWN0aW9uX2VuZF9vZmZzZXQgKyAxOworICB9CisKKyAgLy8gSGFuZGxlIHRoZSBjYXNlIHdoZXJlIHRoZXJlIGFyZSBzdGlsbCBieXRlcyBsZWZ0IGluIHRoZSBiaW5hcnkgdGhhdCBhcmUKKyAgLy8gdW5hY2NvdW50ZWQgZm9yLgorICBpZiAob2Zmc2V0IDwgYmluYXJ5X2xlbmd0aF8pIHsKKyAgICBjb25zdCB1aW50NjRfdCBwYWRfYnl0ZXMgPSBiaW5hcnlfbGVuZ3RoXyAtIG9mZnNldCArIDE7CisgICAgc2VjdGlvbnNfdG9faW5zZXJ0LnB1c2hfYmFjaygKKyAgICAgICAgR2VuZXJhdGVNaXNzaW5nU2VjdGlvbihvZmZzZXQgLSAxLCBwYWRfYnl0ZXMsIGJpbmFyeV8pKTsKKyAgfQorCisgIGZvciAoY29uc3QgQmluYXJ5U2VjdGlvbiAmc2VjdGlvbl90b19pbnNlcnQgOiBzZWN0aW9uc190b19pbnNlcnQpIHsKKyAgICBBZGRTZWN0aW9uKHNlY3Rpb25fdG9faW5zZXJ0LnJlZ2lvbnNbMF0ub2Zmc2V0LCBzZWN0aW9uX3RvX2luc2VydCk7CisgIH0KK30KKworYm9vbCBCaW5hcnlBbm5vdGF0b3I6OkNvbnRhaW5zU2VjdGlvbihjb25zdCB1aW50NjRfdCBvZmZzZXQpIHsKKyAgYXV0byBpdCA9IHNlY3Rpb25zXy5sb3dlcl9ib3VuZChvZmZzZXQpOworICAvLyBJZiB0aGUgc2VjdGlvbiBpcyBmb3VuZCwgY2hlY2sgdGhhdCBpdCBpcyBleGFjdGx5IGVxdWFsIGl0cyBvZmZzZXQuCisgIGlmIChpdCAhPSBzZWN0aW9uc18uZW5kKCkgJiYgaXQtPmZpcnN0ID09IG9mZnNldCkgeyByZXR1cm4gdHJ1ZTsgfQorCisgIC8vIElmIHRoaXMgd2FzIHRoZSBmaXJzdCBzZWN0aW9uLCB0aGVyZSBhcmUgbm8gb3RoZXIgcHJldmlvdXMgc2VjdGlvbnMgdG8KKyAgLy8gY2hlY2suCisgIGlmIChpdCA9PSBzZWN0aW9uc18uYmVnaW4oKSkgeyByZXR1cm4gZmFsc2U7IH0KKworICAvLyBHbyBiYWNrIG9uZSBzZWN0aW9uLgorICAtLWl0OworCisgIC8vIEFuZCBjaGVjayB0aGF0IGlmIHRoZSBvZmZzZXQgaXMgY292ZXJlZCBieSB0aGUgc2VjdGlvbi4KKyAgcmV0dXJuIG9mZnNldCA+PSBpdC0+Zmlyc3QgJiYgb2Zmc2V0IDwgaXQtPnNlY29uZC5yZWdpb25zLmJhY2soKS5vZmZzZXQgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXQtPnNlY29uZC5yZWdpb25zLmJhY2soKS5sZW5ndGg7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBmbGF0YnVmZmVycwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3NyYy9iaW5hcnlfYW5ub3RhdG9yLmggYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy9zcmMvYmluYXJ5X2Fubm90YXRvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIzZTQxOTgKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy9zcmMvYmluYXJ5X2Fubm90YXRvci5oCkBAIC0wLDAgKzEsMzkyIEBACisvKgorICogQ29weXJpZ2h0IDIwMjEgR29vZ2xlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEZMQVRCVUZGRVJTX0JJTkFSWV9BTk5PVEFUT1JfSF8KKyNkZWZpbmUgRkxBVEJVRkZFUlNfQklOQVJZX0FOTk9UQVRPUl9IXworCisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlICJmbGF0YnVmZmVycy9iYXNlLmgiCisjaW5jbHVkZSAiZmxhdGJ1ZmZlcnMvcmVmbGVjdGlvbi5oIgorI2luY2x1ZGUgImZsYXRidWZmZXJzL3N0bF9lbXVsYXRpb24uaCIKKyNpbmNsdWRlICJmbGF0YnVmZmVycy91dGlsLmgiCisKK25hbWVzcGFjZSBmbGF0YnVmZmVycyB7CisKK2VudW0gY2xhc3MgQmluYXJ5UmVnaW9uVHlwZSB7CisgIFVua25vd24gPSAwLAorICBVT2Zmc2V0ID0gMSwKKyAgU09mZnNldCA9IDIsCisgIFZPZmZzZXQgPSAzLAorICBCb29sID0gNCwKKyAgQnl0ZSA9IDUsCisgIENoYXIgPSA2LAorICBVaW50OCA9IDcsCisgIEludDggPSA4LAorICBVaW50MTYgPSA5LAorICBJbnQxNiA9IDEwLAorICBVaW50MzIgPSAxMSwKKyAgSW50MzIgPSAxMiwKKyAgVWludDY0ID0gMTMsCisgIEludDY0ID0gMTQsCisgIEZsb2F0ID0gMTUsCisgIERvdWJsZSA9IDE2LAorICBVVHlwZSA9IDE3LAorfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK3N0YXRpYyBpbmxpbmUgc3RkOjpzdHJpbmcgVG9IZXgoVCBpLCBzaXplX3Qgd2lkdGggPSBzaXplb2YoVCkpIHsKKyAgc3RkOjpzdHJpbmdzdHJlYW0gc3RyZWFtOworICBzdHJlYW0gPDwgc3RkOjpoZXggPDwgc3RkOjp1cHBlcmNhc2UgPDwgc3RkOjpzZXRmaWxsKCcwJykgPDwgc3RkOjpzZXR3KHdpZHRoKQorICAgICAgICAgPDwgaTsKKyAgcmV0dXJuIHN0cmVhbS5zdHIoKTsKK30KKworLy8gU3BlY2lhbGl6ZWQgdmVyc2lvbiBmb3IgdWludDhfdCB0aGF0IGRvbid0IHdvcmsgd2VsbCB3aXRoIHN0ZDo6aGV4Lgorc3RhdGljIGlubGluZSBzdGQ6OnN0cmluZyBUb0hleCh1aW50OF90IGkpIHsKKyAgcmV0dXJuIFRvSGV4KHN0YXRpY19jYXN0PGludD4oaSksIDIpOworfQorCitlbnVtIGNsYXNzIEJpbmFyeVJlZ2lvblN0YXR1cyB7CisgIE9LID0gMCwKKyAgV0FSTiA9IDEwMCwKKyAgV0FSTl9OT19SRUZFUkVOQ0VTLAorICBXQVJOX0NPUlJVUFRFRF9QQURESU5HLAorICBXQVJOX1BBRERJTkdfTEVOR1RILAorICBFUlJPUiA9IDIwMCwKKyAgLy8gQW4gb2Zmc2V0IGlzIHBvaW50aW5nIG91dHNpZGUgdGhlIGJpbmFyeSBib3VuZHMuCisgIEVSUk9SX09GRlNFVF9PVVRfT0ZfQklOQVJZLAorICAvLyBFeHBlY3RpbmcgdG8gcmVhZCBOIGJ5dGVzIGJ1dCBub3QgZW5vdWdoIHJlbWFpbiBpbiB0aGUgYmluYXJ5LgorICBFUlJPUl9JTkNPTVBMRVRFX0JJTkFSWSwKKyAgLy8gV2hlbiBhIGxlbmd0aCBvZiBhIHZ0YWJsZS92ZWN0b3IgaXMgbG9uZ2VyIHRoYW4gcG9zc2libGUuCisgIEVSUk9SX0xFTkdUSF9UT09fTE9ORywKKyAgLy8gV2hlbiBhIGxlbmd0aCBvZiBhIHZ0YWJsZS92ZWN0b3IgaXMgc2hvcnRlciB0aGFuIHBvc3NpYmxlLgorICBFUlJPUl9MRU5HVEhfVE9PX1NIT1JULAorICAvLyBBIGZpZWxkIG1hcmsgcmVxdWlyZWQgaXMgbm90IHByZXNlbnQgaW4gdGhlIHZ0YWJsZS4KKyAgRVJST1JfUkVRVUlSRURfRklFTERfTk9UX1BSRVNFTlQsCisgIC8vIEEgcmVhbGl6ZWQgdW5pb24gdHlwZSBpcyBub3Qgd2l0aGluIHRoZSBlbnVtIGJvdW5kcy4KKyAgRVJST1JfSU5WQUxJRF9VTklPTl9UWVBFLAorICAvLyBPY2N1cnMgd2hlbiB0aGVyZSBpcyBhIGN5Y2xlIGluIG9mZnNldHMuCisgIEVSUk9SX0NZQ0xFX0RFVEVDVEVELAorfTsKKworZW51bSBjbGFzcyBCaW5hcnlSZWdpb25Db21tZW50VHlwZSB7CisgIFVua25vd24gPSAwLAorICBTaXplUHJlZml4LAorICAvLyBUaGUgb2Zmc2V0IHRvIHRoZSByb290IHRhYmxlLgorICBSb290VGFibGVPZmZzZXQsCisgIC8vIFRoZSBvcHRpb25hbCA0LWNoYXIgZmlsZSBpZGVudGlmaWVyLgorICBGaWxlSWRlbnRpZmllciwKKyAgLy8gR2VuZXJpYyAwLWZpbGxlZCBwYWRkaW5nCisgIFBhZGRpbmcsCisgIC8vIFRoZSBzaXplIG9mIHRoZSB2dGFibGUuCisgIFZUYWJsZVNpemUsCisgIC8vIFRoZSBzaXplIG9mIHRoZSByZWZlcnJpbmcgdGFibGUuCisgIFZUYWJsZVJlZmZlcmluZ1RhYmxlTGVuZ3RoLAorICAvLyBPZmZzZXRzIHRvIHZ0YWJsZSBmaWVsZHMuCisgIFZUYWJsZUZpZWxkT2Zmc2V0LAorICAvLyBPZmZzZXRzIHRvIHVua25vd24gdnRhYmxlIGZpZWxkcy4KKyAgVlRhYmxlVW5rbm93bkZpZWxkT2Zmc2V0LAorICAvLyBUaGUgdnRhYmxlIG9mZnNldCBvZiBhIHRhYmxlLgorICBUYWJsZVZUYWJsZU9mZnNldCwKKyAgLy8gQSAiaW5saW5lIiB0YWJsZSBmaWVsZCB2YWx1ZS4KKyAgVGFibGVGaWVsZCwKKyAgLy8gQSB0YWJsZSBmaWVsZCB0aGF0IGlzIHVua25vd24uCisgIFRhYmxlVW5rbm93bkZpZWxkLAorICAvLyBBIHRhYmxlIGZpZWxkIHZhbHVlIHRoYXQgcG9pbnRzIHRvIGFub3RoZXIgc2VjdGlvbi4KKyAgVGFibGVPZmZzZXRGaWVsZCwKKyAgLy8gQSBzdHJ1Y3QgZmllbGQgdmFsdWUuCisgIFN0cnVjdEZpZWxkLAorICAvLyBBIGFycmF5IGZpZWxkIHZhbHVlLgorICBBcnJheUZpZWxkLAorICAvLyBUaGUgbGVuZ3RoIG9mIHRoZSBzdHJpbmcuCisgIFN0cmluZ0xlbmd0aCwKKyAgLy8gVGhlIHN0cmluZyBjb250ZW50cy4KKyAgU3RyaW5nVmFsdWUsCisgIC8vIFRoZSBleHBsaWNpdCBzdHJpbmcgdGVybWluYXRvci4KKyAgU3RyaW5nVGVybWluYXRvciwKKyAgLy8gVGhlIGxlbmd0aCBvZiB0aGUgdmVjdG9yICgjIG9mIGl0ZW1zKS4KKyAgVmVjdG9yTGVuZ3RoLAorICAvLyBBICJpbmxpbmUiIHZhbHVlIG9mIGEgdmVjdG9yLgorICBWZWN0b3JWYWx1ZSwKKyAgLy8gQSB2ZWN0b3IgdmFsdWUgdGhhdCBwb2ludHMgdG8gYW5vdGhlciBzZWN0aW9uLgorICBWZWN0b3JUYWJsZVZhbHVlLAorICBWZWN0b3JTdHJpbmdWYWx1ZSwKKyAgVmVjdG9yVW5pb25WYWx1ZSwKK307CisKK3N0cnVjdCBCaW5hcnlSZWdpb25Db21tZW50IHsKKyAgQmluYXJ5UmVnaW9uU3RhdHVzIHN0YXR1cyA9IEJpbmFyeVJlZ2lvblN0YXR1czo6T0s7CisKKyAgLy8gSWYgc3RhdHVzIGlzIG5vbiBPSywgdGhpcyBtYXkgYmUgZmlsbGVkIGluIHdpdGggYWRkaXRpb25hbCBkZXRhaWxzLgorICBzdGQ6OnN0cmluZyBzdGF0dXNfbWVzc2FnZTsKKworICBCaW5hcnlSZWdpb25Db21tZW50VHlwZSB0eXBlID0gQmluYXJ5UmVnaW9uQ29tbWVudFR5cGU6OlVua25vd247CisKKyAgc3RkOjpzdHJpbmcgbmFtZTsKKworICBzdGQ6OnN0cmluZyBkZWZhdWx0X3ZhbHVlOworCisgIHNpemVfdCBpbmRleCA9IDA7Cit9OworCitzdHJ1Y3QgQmluYXJ5UmVnaW9uIHsKKyAgLy8gT2Zmc2V0IGludG8gdGhlIGJpbmFyeSB3aGVyZSB0aGlzIHJlZ2lvbiBiZWdpbnMuCisgIHVpbnQ2NF90IG9mZnNldCA9IDA7CisKKyAgLy8gVGhlIGxlbmd0aCBvZiB0aGlzIHJlZ2lvbiBpbiBieXRlcy4KKyAgdWludDY0X3QgbGVuZ3RoID0gMDsKKworICAvLyBUaGUgdW5kZXJseWluZyBkYXRhdHlwZSBvZiB0aGlzIHJlZ2lvbgorICBCaW5hcnlSZWdpb25UeXBlIHR5cGUgPSBCaW5hcnlSZWdpb25UeXBlOjpVbmtub3duOworCisgIC8vIElmIGB0eXBlYCBpcyBhbiBhcnJheS92ZWN0b3IsIHRoaXMgaXMgdGhlIG51bWJlciBvZiB0aG9zZSB0eXBlcyB0aGlzIHJlZ2lvbgorICAvLyBlbmNvbXBhc3Nlcy4KKyAgdWludDY0X3QgYXJyYXlfbGVuZ3RoID0gMDsKKworICAvLyBJZiB0aGUgaXMgYW4gb2Zmc2V0IHRvIHNvbWUgb3RoZXIgcmVnaW9uLCB0aGlzIGlzIHdoYXQgaXQgcG9pbnRzIHRvLiBUaGUKKyAgLy8gb2Zmc2V0IGlzIHJlbGF0aXZlIHRvIG92ZXJhbGwgYmluYXJ5LCBub3QgdG8gdGhpcyByZWdpb24uCisgIHVpbnQ2NF90IHBvaW50c190b19vZmZzZXQgPSAwOworCisgIC8vIFRoZSBjb21tZW50IG9uIHRoZSByZWdpb24uCisgIEJpbmFyeVJlZ2lvbkNvbW1lbnQgY29tbWVudDsKK307CisKK2VudW0gY2xhc3MgQmluYXJ5U2VjdGlvblR5cGUgeworICBVbmtub3duID0gMCwKKyAgSGVhZGVyID0gMSwKKyAgVGFibGUgPSAyLAorICBSb290VGFibGUgPSAzLAorICBWVGFibGUgPSA0LAorICBTdHJ1Y3QgPSA1LAorICBTdHJpbmcgPSA2LAorICBWZWN0b3IgPSA3LAorICBVbmlvbiA9IDgsCisgIFBhZGRpbmcgPSA5LAorfTsKKworLy8gQSBzZWN0aW9uIG9mIHRoZSBiaW5hcnkgdGhhdCBpcyBncm91cGVkIHRvZ2V0aGVyIGluIHNvbWUgbG9naWNhbCBtYW5uZXIsIGFuZAorLy8gb2Z0ZW4gaXMgcG9pbnRlZCB0b28gYnkgc29tZSBvdGhlciBvZmZzZXQgQmluYXJ5UmVnaW9uLiBTZWN0aW9ucyBpbmNsdWRlCisvLyBgdGFibGVzYCwgYHZ0YWJsZXNgLCBgc3RyaW5nc2AsIGB2ZWN0b3JzYCwgZXRjLi4KK3N0cnVjdCBCaW5hcnlTZWN0aW9uIHsKKyAgLy8gVXNlci1zcGVjaWZpZWQgbmFtZSBvZiB0aGUgc2VjdGlvbiwgaWYgYXBwbGljYWJsZS4KKyAgc3RkOjpzdHJpbmcgbmFtZTsKKworICAvLyBUaGUgdHlwZSBvZiB0aGlzIHNlY3Rpb24uCisgIEJpbmFyeVNlY3Rpb25UeXBlIHR5cGUgPSBCaW5hcnlTZWN0aW9uVHlwZTo6VW5rbm93bjsKKworICAvLyBUaGUgYmluYXJ5IHJlZ2lvbnMgdGhhdCBtYWtlIHVwIHRoaXMgc2VjdGlvbiwgaW4gb3JkZXIgb2YgdGhlaXIgb2Zmc2V0cy4KKyAgc3RkOjp2ZWN0b3I8QmluYXJ5UmVnaW9uPiByZWdpb25zOworfTsKKworaW5saW5lIHN0YXRpYyBCaW5hcnlSZWdpb25UeXBlIEdldFJlZ2lvblR5cGUocmVmbGVjdGlvbjo6QmFzZVR5cGUgYmFzZV90eXBlKSB7CisgIHN3aXRjaCAoYmFzZV90eXBlKSB7CisgICAgY2FzZSByZWZsZWN0aW9uOjpCYXNlVHlwZTo6VVR5cGU6IHJldHVybiBCaW5hcnlSZWdpb25UeXBlOjpVVHlwZTsKKyAgICBjYXNlIHJlZmxlY3Rpb246OkJhc2VUeXBlOjpCb29sOiByZXR1cm4gQmluYXJ5UmVnaW9uVHlwZTo6VWludDg7CisgICAgY2FzZSByZWZsZWN0aW9uOjpCYXNlVHlwZTo6Qnl0ZTogcmV0dXJuIEJpbmFyeVJlZ2lvblR5cGU6OlVpbnQ4OworICAgIGNhc2UgcmVmbGVjdGlvbjo6QmFzZVR5cGU6OlVCeXRlOiByZXR1cm4gQmluYXJ5UmVnaW9uVHlwZTo6VWludDg7CisgICAgY2FzZSByZWZsZWN0aW9uOjpCYXNlVHlwZTo6U2hvcnQ6IHJldHVybiBCaW5hcnlSZWdpb25UeXBlOjpJbnQxNjsKKyAgICBjYXNlIHJlZmxlY3Rpb246OkJhc2VUeXBlOjpVU2hvcnQ6IHJldHVybiBCaW5hcnlSZWdpb25UeXBlOjpVaW50MTY7CisgICAgY2FzZSByZWZsZWN0aW9uOjpCYXNlVHlwZTo6SW50OiByZXR1cm4gQmluYXJ5UmVnaW9uVHlwZTo6VWludDMyOworICAgIGNhc2UgcmVmbGVjdGlvbjo6QmFzZVR5cGU6OlVJbnQ6IHJldHVybiBCaW5hcnlSZWdpb25UeXBlOjpVaW50MzI7CisgICAgY2FzZSByZWZsZWN0aW9uOjpCYXNlVHlwZTo6TG9uZzogcmV0dXJuIEJpbmFyeVJlZ2lvblR5cGU6OkludDY0OworICAgIGNhc2UgcmVmbGVjdGlvbjo6QmFzZVR5cGU6OlVMb25nOiByZXR1cm4gQmluYXJ5UmVnaW9uVHlwZTo6VWludDY0OworICAgIGNhc2UgcmVmbGVjdGlvbjo6QmFzZVR5cGU6OkZsb2F0OiByZXR1cm4gQmluYXJ5UmVnaW9uVHlwZTo6RmxvYXQ7CisgICAgY2FzZSByZWZsZWN0aW9uOjpCYXNlVHlwZTo6RG91YmxlOiByZXR1cm4gQmluYXJ5UmVnaW9uVHlwZTo6RG91YmxlOworICAgIGRlZmF1bHQ6IHJldHVybiBCaW5hcnlSZWdpb25UeXBlOjpVbmtub3duOworICB9Cit9CisKK2lubGluZSBzdGF0aWMgc3RkOjpzdHJpbmcgVG9TdHJpbmcoY29uc3QgQmluYXJ5UmVnaW9uVHlwZSB0eXBlKSB7CisgIHN3aXRjaCAodHlwZSkgeworICAgIGNhc2UgQmluYXJ5UmVnaW9uVHlwZTo6VU9mZnNldDogcmV0dXJuICJVT2Zmc2V0MzIiOworICAgIGNhc2UgQmluYXJ5UmVnaW9uVHlwZTo6U09mZnNldDogcmV0dXJuICJTT2Zmc2V0MzIiOworICAgIGNhc2UgQmluYXJ5UmVnaW9uVHlwZTo6Vk9mZnNldDogcmV0dXJuICJWT2Zmc2V0MTYiOworICAgIGNhc2UgQmluYXJ5UmVnaW9uVHlwZTo6Qm9vbDogcmV0dXJuICJib29sIjsKKyAgICBjYXNlIEJpbmFyeVJlZ2lvblR5cGU6OkNoYXI6IHJldHVybiAiY2hhciI7CisgICAgY2FzZSBCaW5hcnlSZWdpb25UeXBlOjpCeXRlOiByZXR1cm4gImludDhfdCI7CisgICAgY2FzZSBCaW5hcnlSZWdpb25UeXBlOjpVaW50ODogcmV0dXJuICJ1aW50OF90IjsKKyAgICBjYXNlIEJpbmFyeVJlZ2lvblR5cGU6OlVpbnQxNjogcmV0dXJuICJ1aW50MTZfdCI7CisgICAgY2FzZSBCaW5hcnlSZWdpb25UeXBlOjpVaW50MzI6IHJldHVybiAidWludDMyX3QiOworICAgIGNhc2UgQmluYXJ5UmVnaW9uVHlwZTo6VWludDY0OiByZXR1cm4gInVpbnQ2NF90IjsgOworICAgIGNhc2UgQmluYXJ5UmVnaW9uVHlwZTo6SW50ODogcmV0dXJuICJpbnQ4X3QiOworICAgIGNhc2UgQmluYXJ5UmVnaW9uVHlwZTo6SW50MTY6IHJldHVybiAiaW50MTZfdCI7CisgICAgY2FzZSBCaW5hcnlSZWdpb25UeXBlOjpJbnQzMjogcmV0dXJuICJpbnQzMl90IjsKKyAgICBjYXNlIEJpbmFyeVJlZ2lvblR5cGU6OkludDY0OiByZXR1cm4gImludDY0X3QiOworICAgIGNhc2UgQmluYXJ5UmVnaW9uVHlwZTo6RG91YmxlOiByZXR1cm4gImRvdWJsZSI7CisgICAgY2FzZSBCaW5hcnlSZWdpb25UeXBlOjpGbG9hdDogcmV0dXJuICJmbG9hdCI7CisgICAgY2FzZSBCaW5hcnlSZWdpb25UeXBlOjpVVHlwZTogcmV0dXJuICJVVHlwZTgiOworICAgIGNhc2UgQmluYXJ5UmVnaW9uVHlwZTo6VW5rbm93bjogcmV0dXJuICI/dWludDhfdCI7CisgICAgZGVmYXVsdDogcmV0dXJuICJ0b2RvIjsKKyAgfQorfQorCitjbGFzcyBCaW5hcnlBbm5vdGF0b3IgeworIHB1YmxpYzoKKyAgZXhwbGljaXQgQmluYXJ5QW5ub3RhdG9yKGNvbnN0IHVpbnQ4X3QgKmNvbnN0IGJmYnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50NjRfdCBiZmJzX2xlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmNvbnN0IGJpbmFyeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ2NF90IGJpbmFyeV9sZW5ndGgpCisgICAgICA6IGJmYnNfKGJmYnMpLAorICAgICAgICBiZmJzX2xlbmd0aF8oYmZic19sZW5ndGgpLAorICAgICAgICBzY2hlbWFfKHJlZmxlY3Rpb246OkdldFNjaGVtYShiZmJzKSksCisgICAgICAgIGJpbmFyeV8oYmluYXJ5KSwKKyAgICAgICAgYmluYXJ5X2xlbmd0aF8oYmluYXJ5X2xlbmd0aCkge30KKworICBzdGQ6Om1hcDx1aW50NjRfdCwgQmluYXJ5U2VjdGlvbj4gQW5ub3RhdGUoKTsKKworIHByaXZhdGU6CisgIHN0cnVjdCBWVGFibGUgeworICAgIHN0cnVjdCBFbnRyeSB7CisgICAgICBjb25zdCByZWZsZWN0aW9uOjpGaWVsZCAqZmllbGQgPSBudWxscHRyOworICAgICAgdWludDE2X3Qgb2Zmc2V0X2Zyb21fdGFibGUgPSAwOworICAgIH07CisKKyAgICAvLyBGaWVsZCBJRCAtPiB7ZmllbGQgZGVmLCBvZmZzZXQgZnJvbSB0YWJsZX0KKyAgICBzdGQ6Om1hcDx1aW50MTZfdCwgRW50cnk+IGZpZWxkczsKKworICAgIHVpbnQxNl90IHZ0YWJsZV9zaXplID0gMDsKKyAgICB1aW50MTZfdCB0YWJsZV9zaXplID0gMDsKKyAgfTsKKworICB1aW50NjRfdCBCdWlsZEhlYWRlcih1aW50NjRfdCBvZmZzZXQpOworCisgIHZvaWQgQnVpbGRWVGFibGUodWludDY0X3Qgb2Zmc2V0LCBjb25zdCByZWZsZWN0aW9uOjpPYmplY3QgKnRhYmxlLAorICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IG9mZnNldF9vZl9yZWZlcnJpbmdfdGFibGUpOworCisgIHZvaWQgQnVpbGRUYWJsZSh1aW50NjRfdCBvZmZzZXQsIGNvbnN0IEJpbmFyeVNlY3Rpb25UeXBlIHR5cGUsCisgICAgICAgICAgICAgICAgICBjb25zdCByZWZsZWN0aW9uOjpPYmplY3QgKnRhYmxlKTsKKworICB1aW50NjRfdCBCdWlsZFN0cnVjdCh1aW50NjRfdCBvZmZzZXQsIHN0ZDo6dmVjdG9yPEJpbmFyeVJlZ2lvbj4gJnJlZ2lvbnMsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlZmxlY3Rpb246Ok9iamVjdCAqc3RydWN0dXJlKTsKKworICB2b2lkIEJ1aWxkU3RyaW5nKHVpbnQ2NF90IG9mZnNldCwgY29uc3QgcmVmbGVjdGlvbjo6T2JqZWN0ICp0YWJsZSwKKyAgICAgICAgICAgICAgICAgICBjb25zdCByZWZsZWN0aW9uOjpGaWVsZCAqZmllbGQpOworCisgIHZvaWQgQnVpbGRWZWN0b3IodWludDY0X3Qgb2Zmc2V0LCBjb25zdCByZWZsZWN0aW9uOjpPYmplY3QgKnRhYmxlLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlZmxlY3Rpb246OkZpZWxkICpmaWVsZCwgdWludDY0X3QgcGFyZW50X3RhYmxlX29mZnNldCwKKyAgICAgICAgICAgICAgICAgICBjb25zdCBWVGFibGUgJnZ0YWJsZSk7CisKKyAgc3RkOjpzdHJpbmcgQnVpbGRVbmlvbih1aW50NjRfdCBvZmZzZXQsIHVpbnQ4X3QgcmVhbGl6ZWRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZWZsZWN0aW9uOjpGaWVsZCAqZmllbGQpOworCisgIHZvaWQgRml4TWlzc2luZ1JlZ2lvbnMoKTsKKyAgdm9pZCBGaXhNaXNzaW5nU2VjdGlvbnMoKTsKKworICBpbmxpbmUgYm9vbCBJc1ZhbGlkT2Zmc2V0KGNvbnN0IHVpbnQ2NF90IG9mZnNldCkgY29uc3QgeworICAgIHJldHVybiBvZmZzZXQgPCBiaW5hcnlfbGVuZ3RoXzsKKyAgfQorCisgIC8vIERldGVybWluZXMgaWYgcGVyZm9ybWluZyBhIEdldFNjYWxhciByZXF1ZXN0IGZvciBgVGAgYXQgYG9mZnNldGAgd291bGQgcmVhZAorICAvLyBwYXNzZWQgdGhlIGVuZCBvZiB0aGUgYmluYXJ5LgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBpbmxpbmUgYm9vbCBJc1ZhbGlkUmVhZChjb25zdCB1aW50NjRfdCBvZmZzZXQpIGNvbnN0IHsKKyAgICByZXR1cm4gSXNWYWxpZFJlYWQob2Zmc2V0LCBzaXplb2YoVCkpOworICB9CisKKyAgaW5saW5lIGJvb2wgSXNWYWxpZFJlYWQoY29uc3QgdWludDY0X3Qgb2Zmc2V0LCBjb25zdCB1aW50NjRfdCBsZW5ndGgpIGNvbnN0IHsKKyAgICByZXR1cm4gbGVuZ3RoIDwgYmluYXJ5X2xlbmd0aF8gJiYgSXNWYWxpZE9mZnNldChvZmZzZXQgKyBsZW5ndGggLSAxKTsKKyAgfQorCisgIC8vIENhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIGJ5dGVzIHJlbWFpbmluZyBmcm9tIHRoZSBnaXZlbiBvZmZzZXQuIElmIG9mZnNldCBpcworICAvLyA+IGJpbmFyeV9sZW5ndGgsIDAgaXMgcmV0dXJuZWQuCisgIHVpbnQ2NF90IFJlbWFpbmluZ0J5dGVzKGNvbnN0IHVpbnQ2NF90IG9mZnNldCkgY29uc3QgeworICAgIHJldHVybiBJc1ZhbGlkT2Zmc2V0KG9mZnNldCkgPyBiaW5hcnlfbGVuZ3RoXyAtIG9mZnNldCA6IDA7CisgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICBmbGF0YnVmZmVyczo6T3B0aW9uYWw8VD4gUmVhZFNjYWxhcihjb25zdCB1aW50NjRfdCBvZmZzZXQpIGNvbnN0IHsKKyAgICBpZiAoIUlzVmFsaWRSZWFkPFQ+KG9mZnNldCkpIHsgcmV0dXJuIGZsYXRidWZmZXJzOjpudWxsb3B0OyB9CisKKyAgICByZXR1cm4gZmxhdGJ1ZmZlcnM6OlJlYWRTY2FsYXI8VD4oYmluYXJ5XyArIG9mZnNldCk7CisgIH0KKworICAvLyBBZGRzIHRoZSBwcm92aWRlZCBgc2VjdGlvbmAga2V5ZWQgYnkgdGhlIGBvZmZzZXRgIGl0IG9jY3VycyBhdC4gSWYgYQorICAvLyBzZWN0aW9uIGlzIGFscmVhZHkgYWRkZWQgYXQgdGhhdCBvZmZzZXQsIGl0IGRvZXNuJ3QgcmVwbGFjZSB0aGUgZXhpc2l0aW5nCisgIC8vIG9uZS4KKyAgdm9pZCBBZGRTZWN0aW9uKGNvbnN0IHVpbnQ2NF90IG9mZnNldCwgY29uc3QgQmluYXJ5U2VjdGlvbiAmc2VjdGlvbikgeworICAgIHNlY3Rpb25zXy5pbnNlcnQoc3RkOjptYWtlX3BhaXIob2Zmc2V0LCBzZWN0aW9uKSk7CisgIH0KKworICBib29sIElzSW5saW5lRmllbGQoY29uc3QgcmVmbGVjdGlvbjo6RmllbGQgKmNvbnN0IGZpZWxkKSB7CisgICAgaWYgKGZpZWxkLT50eXBlKCktPmJhc2VfdHlwZSgpID09IHJlZmxlY3Rpb246OkJhc2VUeXBlOjpPYmopIHsKKyAgICAgIHJldHVybiBzY2hlbWFfLT5vYmplY3RzKCktPkdldChmaWVsZC0+dHlwZSgpLT5pbmRleCgpKS0+aXNfc3RydWN0KCk7CisgICAgfQorICAgIHJldHVybiBJc1NjYWxhcihmaWVsZC0+dHlwZSgpLT5iYXNlX3R5cGUoKSk7CisgIH0KKworICBib29sIElzVW5pb25UeXBlKGNvbnN0IHJlZmxlY3Rpb246OkJhc2VUeXBlIHR5cGUpIHsKKyAgICByZXR1cm4gKHR5cGUgPT0gcmVmbGVjdGlvbjo6QmFzZVR5cGU6OlVUeXBlIHx8CisgICAgICAgICAgICB0eXBlID09IHJlZmxlY3Rpb246OkJhc2VUeXBlOjpVbmlvbik7CisgIH0KKworICBib29sIElzVW5pb25UeXBlKGNvbnN0IHJlZmxlY3Rpb246OkZpZWxkICpjb25zdCBmaWVsZCkgeworICAgIHJldHVybiBJc1VuaW9uVHlwZShmaWVsZC0+dHlwZSgpLT5iYXNlX3R5cGUoKSkgJiYKKyAgICAgICAgICAgZmllbGQtPnR5cGUoKS0+aW5kZXgoKSA+PSAwOworICB9CisKKyAgYm9vbCBJc1ZhbGlkVW5pb25WYWx1ZShjb25zdCByZWZsZWN0aW9uOjpGaWVsZCAqY29uc3QgZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCB2YWx1ZSkgeworICAgIHJldHVybiBJc1VuaW9uVHlwZShmaWVsZCkgJiYKKyAgICAgICAgICAgSXNWYWxpZFVuaW9uVmFsdWUoZmllbGQtPnR5cGUoKS0+aW5kZXgoKSwgdmFsdWUpOworICB9CisKKyAgYm9vbCBJc1ZhbGlkVW5pb25WYWx1ZShjb25zdCB1aW50MzJfdCBlbnVtX2lkLCBjb25zdCB1aW50OF90IHZhbHVlKSB7CisgICAgaWYgKGVudW1faWQgPj0gc2NoZW1hXy0+ZW51bXMoKS0+c2l6ZSgpKSB7IHJldHVybiBmYWxzZTsgfQorCisgICAgY29uc3QgcmVmbGVjdGlvbjo6RW51bSAqZW51bV9kZWYgPSBzY2hlbWFfLT5lbnVtcygpLT5HZXQoZW51bV9pZCk7CisKKyAgICBpZiAoZW51bV9kZWYgPT0gbnVsbHB0cikgeyByZXR1cm4gZmFsc2U7IH0KKworICAgIHJldHVybiB2YWx1ZSA8IGVudW1fZGVmLT52YWx1ZXMoKS0+c2l6ZSgpOworICB9CisKKyAgdWludDY0X3QgR2V0RWxlbWVudFNpemUoY29uc3QgcmVmbGVjdGlvbjo6RmllbGQgKmNvbnN0IGZpZWxkKSB7CisgICAgaWYgKElzU2NhbGFyKGZpZWxkLT50eXBlKCktPmVsZW1lbnQoKSkpIHsKKyAgICAgIHJldHVybiBHZXRUeXBlU2l6ZShmaWVsZC0+dHlwZSgpLT5lbGVtZW50KCkpOworICAgIH0KKworICAgIHN3aXRjaCAoZmllbGQtPnR5cGUoKS0+ZWxlbWVudCgpKSB7CisgICAgICBjYXNlIHJlZmxlY3Rpb246OkJhc2VUeXBlOjpPYmo6IHsKKyAgICAgICAgYXV0byBvYmogPSBzY2hlbWFfLT5vYmplY3RzKCktPkdldChmaWVsZC0+dHlwZSgpLT5pbmRleCgpKTsKKyAgICAgICAgcmV0dXJuIG9iai0+aXNfc3RydWN0KCkgPyBvYmotPmJ5dGVzaXplKCkgOiBzaXplb2YodWludDMyX3QpOworICAgICAgfQorICAgICAgZGVmYXVsdDogcmV0dXJuIHNpemVvZih1aW50MzJfdCk7CisgICAgfQorICB9CisKKyAgYm9vbCBDb250YWluc1NlY3Rpb24oY29uc3QgdWludDY0X3Qgb2Zmc2V0KTsKKworICAvLyBUaGUgc2NoZW1hIGZvciB0aGUgYmluYXJ5IGZpbGUKKyAgY29uc3QgdWludDhfdCAqYmZic187CisgIGNvbnN0IHVpbnQ2NF90IGJmYnNfbGVuZ3RoXzsKKyAgY29uc3QgcmVmbGVjdGlvbjo6U2NoZW1hICpzY2hlbWFfOworCisgIC8vIFRoZSBiaW5hcnkgZGF0YSBpdHNlbGYuCisgIGNvbnN0IHVpbnQ4X3QgKmJpbmFyeV87CisgIGNvbnN0IHVpbnQ2NF90IGJpbmFyeV9sZW5ndGhfOworCisgIC8vIE1hcCBvZiBiaW5hcnkgb2Zmc2V0IHRvIHZ0YWJsZXMsIHRvIGRlZHVwZSB2dGFibGVzLgorICBzdGQ6Om1hcDx1aW50NjRfdCwgVlRhYmxlPiB2dGFibGVzXzsKKworICAvLyBUaGUgYW5ub3RhdGVkIGJpbmFyeSBzZWN0aW9ucywgaW5kZXggYnkgdGhlaXIgYWJzb2x1dGUgb2Zmc2V0LgorICBzdGQ6Om1hcDx1aW50NjRfdCwgQmluYXJ5U2VjdGlvbj4gc2VjdGlvbnNfOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGZsYXRidWZmZXJzCisKKyNlbmRpZiAgLy8gRkxBVEJVRkZFUlNfQklOQVJZX0FOTk9UQVRPUl9IXwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvc3JjL2NvZGVfZ2VuZXJhdG9ycy5jcHAgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy9zcmMvY29kZV9nZW5lcmF0b3JzLmNwcAppbmRleCBlNDQ5YTFkLi5mM2U1MGM3IDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy9zcmMvY29kZV9nZW5lcmF0b3JzLmNwcAorKysgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy9zcmMvY29kZV9nZW5lcmF0b3JzLmNwcApAQCAtMzAsNiArMzAsNTIgQEAKIAogbmFtZXNwYWNlIGZsYXRidWZmZXJzIHsKIAorbmFtZXNwYWNlIHsKKworc3RhdGljIHN0ZDo6c3RyaW5nIEphdmFDU2hhcnBNYWtlUnVsZShjb25zdCBib29sIGphdmEsIGNvbnN0IFBhcnNlciAmcGFyc2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nICZwYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nICZmaWxlX25hbWUpIHsKKyAgY29uc3Qgc3RkOjpzdHJpbmcgZmlsZV9leHRlbnNpb24gPSBqYXZhID8gIi5qYXZhIiA6ICIuY3MiOworICBzdGQ6OnN0cmluZyBtYWtlX3J1bGU7CisKKyAgZm9yIChhdXRvIGl0ID0gcGFyc2VyLmVudW1zXy52ZWMuYmVnaW4oKTsgaXQgIT0gcGFyc2VyLmVudW1zXy52ZWMuZW5kKCk7CisgICAgICAgKytpdCkgeworICAgIGF1dG8gJmVudW1fZGVmID0gKippdDsKKyAgICBpZiAoIW1ha2VfcnVsZS5lbXB0eSgpKSBtYWtlX3J1bGUgKz0gIiAiOworICAgIHN0ZDo6c3RyaW5nIGRpcmVjdG9yeSA9CisgICAgICAgIEJhc2VHZW5lcmF0b3I6Ok5hbWVzcGFjZURpcihwYXJzZXIsIHBhdGgsICplbnVtX2RlZi5kZWZpbmVkX25hbWVzcGFjZSk7CisgICAgbWFrZV9ydWxlICs9IGRpcmVjdG9yeSArIGVudW1fZGVmLm5hbWUgKyBmaWxlX2V4dGVuc2lvbjsKKyAgfQorCisgIGZvciAoYXV0byBpdCA9IHBhcnNlci5zdHJ1Y3RzXy52ZWMuYmVnaW4oKTsgaXQgIT0gcGFyc2VyLnN0cnVjdHNfLnZlYy5lbmQoKTsKKyAgICAgICArK2l0KSB7CisgICAgYXV0byAmc3RydWN0X2RlZiA9ICoqaXQ7CisgICAgaWYgKCFtYWtlX3J1bGUuZW1wdHkoKSkgbWFrZV9ydWxlICs9ICIgIjsKKyAgICBzdGQ6OnN0cmluZyBkaXJlY3RvcnkgPSBCYXNlR2VuZXJhdG9yOjpOYW1lc3BhY2VEaXIoCisgICAgICAgIHBhcnNlciwgcGF0aCwgKnN0cnVjdF9kZWYuZGVmaW5lZF9uYW1lc3BhY2UpOworICAgIG1ha2VfcnVsZSArPSBkaXJlY3RvcnkgKyBzdHJ1Y3RfZGVmLm5hbWUgKyBmaWxlX2V4dGVuc2lvbjsKKyAgfQorCisgIG1ha2VfcnVsZSArPSAiOiAiOworICBhdXRvIGluY2x1ZGVkX2ZpbGVzID0gcGFyc2VyLkdldEluY2x1ZGVkRmlsZXNSZWN1cnNpdmUoZmlsZV9uYW1lKTsKKyAgZm9yIChhdXRvIGl0ID0gaW5jbHVkZWRfZmlsZXMuYmVnaW4oKTsgaXQgIT0gaW5jbHVkZWRfZmlsZXMuZW5kKCk7ICsraXQpIHsKKyAgICBtYWtlX3J1bGUgKz0gIiAiICsgKml0OworICB9CisgIHJldHVybiBtYWtlX3J1bGU7Cit9CisKKworc3RhdGljIHN0ZDo6c3RyaW5nIEJpbmFyeUZpbGVOYW1lKGNvbnN0IFBhcnNlciAmcGFyc2VyLCBjb25zdCBzdGQ6OnN0cmluZyAmcGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nICZmaWxlX25hbWUpIHsKKyAgYXV0byBleHQgPSBwYXJzZXIuZmlsZV9leHRlbnNpb25fLmxlbmd0aCgpID8gcGFyc2VyLmZpbGVfZXh0ZW5zaW9uXyA6ICJiaW4iOworICByZXR1cm4gcGF0aCArIGZpbGVfbmFtZSArICIuIiArIGV4dDsKK30KKworfSAvLyBuYW1lc3BhY2UKKworCisKKwogdm9pZCBDb2RlV3JpdGVyOjpvcGVyYXRvcis9KHN0ZDo6c3RyaW5nIHRleHQpIHsKICAgaWYgKCFpZ25vcmVfaWRlbnRfICYmICF0ZXh0LmVtcHR5KCkpIEFwcGVuZElkZW50KHN0cmVhbV8pOwogCkBAIC0xMzcsOCArMTgzLDkgQEAKIH0KIAogc3RkOjpzdHJpbmcgQmFzZUdlbmVyYXRvcjo6V3JhcEluTmFtZVNwYWNlKGNvbnN0IERlZmluaXRpb24gJmRlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyAmc3VmZml4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wganNfdHMpIGNvbnN0IHsKLSAgcmV0dXJuIFdyYXBJbk5hbWVTcGFjZShkZWYuZGVmaW5lZF9uYW1lc3BhY2UsIGRlZi5uYW1lLCBqc190cyk7CisgIHJldHVybiBXcmFwSW5OYW1lU3BhY2UoZGVmLmRlZmluZWRfbmFtZXNwYWNlLCBkZWYubmFtZSArIHN1ZmZpeCwganNfdHMpOwogfQogCiBzdGQ6OnN0cmluZyBCYXNlR2VuZXJhdG9yOjpHZXROYW1lU3BhY2UoY29uc3QgRGVmaW5pdGlvbiAmZGVmKSBjb25zdCB7CkBAIC0zMDUsMzcgKzM1Miw2IEBACiAgIHJldHVybiB0aGlzLT5OYU4oc3RhdGljX2Nhc3Q8ZG91YmxlPih2KSk7CiB9CiAKLXN0ZDo6c3RyaW5nIEphdmFDU2hhcnBNYWtlUnVsZShjb25zdCBib29sIGphdmEsIGNvbnN0IFBhcnNlciAmcGFyc2VyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nICZwYXRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nICZmaWxlX25hbWUpIHsKLSAgY29uc3Qgc3RkOjpzdHJpbmcgZmlsZV9leHRlbnNpb24gPSBqYXZhID8gIi5qYXZhIiA6ICIuY3MiOwotICBzdGQ6OnN0cmluZyBtYWtlX3J1bGU7Ci0KLSAgZm9yIChhdXRvIGl0ID0gcGFyc2VyLmVudW1zXy52ZWMuYmVnaW4oKTsgaXQgIT0gcGFyc2VyLmVudW1zXy52ZWMuZW5kKCk7Ci0gICAgICAgKytpdCkgewotICAgIGF1dG8gJmVudW1fZGVmID0gKippdDsKLSAgICBpZiAoIW1ha2VfcnVsZS5lbXB0eSgpKSBtYWtlX3J1bGUgKz0gIiAiOwotICAgIHN0ZDo6c3RyaW5nIGRpcmVjdG9yeSA9Ci0gICAgICAgIEJhc2VHZW5lcmF0b3I6Ok5hbWVzcGFjZURpcihwYXJzZXIsIHBhdGgsICplbnVtX2RlZi5kZWZpbmVkX25hbWVzcGFjZSk7Ci0gICAgbWFrZV9ydWxlICs9IGRpcmVjdG9yeSArIGVudW1fZGVmLm5hbWUgKyBmaWxlX2V4dGVuc2lvbjsKLSAgfQotCi0gIGZvciAoYXV0byBpdCA9IHBhcnNlci5zdHJ1Y3RzXy52ZWMuYmVnaW4oKTsgaXQgIT0gcGFyc2VyLnN0cnVjdHNfLnZlYy5lbmQoKTsKLSAgICAgICArK2l0KSB7Ci0gICAgYXV0byAmc3RydWN0X2RlZiA9ICoqaXQ7Ci0gICAgaWYgKCFtYWtlX3J1bGUuZW1wdHkoKSkgbWFrZV9ydWxlICs9ICIgIjsKLSAgICBzdGQ6OnN0cmluZyBkaXJlY3RvcnkgPSBCYXNlR2VuZXJhdG9yOjpOYW1lc3BhY2VEaXIoCi0gICAgICAgIHBhcnNlciwgcGF0aCwgKnN0cnVjdF9kZWYuZGVmaW5lZF9uYW1lc3BhY2UpOwotICAgIG1ha2VfcnVsZSArPSBkaXJlY3RvcnkgKyBzdHJ1Y3RfZGVmLm5hbWUgKyBmaWxlX2V4dGVuc2lvbjsKLSAgfQotCi0gIG1ha2VfcnVsZSArPSAiOiAiOwotICBhdXRvIGluY2x1ZGVkX2ZpbGVzID0gcGFyc2VyLkdldEluY2x1ZGVkRmlsZXNSZWN1cnNpdmUoZmlsZV9uYW1lKTsKLSAgZm9yIChhdXRvIGl0ID0gaW5jbHVkZWRfZmlsZXMuYmVnaW4oKTsgaXQgIT0gaW5jbHVkZWRfZmlsZXMuZW5kKCk7ICsraXQpIHsKLSAgICBtYWtlX3J1bGUgKz0gIiAiICsgKml0OwotICB9Ci0gIHJldHVybiBtYWtlX3J1bGU7Ci19CiAKIHN0ZDo6c3RyaW5nIEphdmFNYWtlUnVsZShjb25zdCBQYXJzZXIgJnBhcnNlciwgY29uc3Qgc3RkOjpzdHJpbmcgJnBhdGgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgJmZpbGVfbmFtZSkgewpAQCAtMzQ2LDEyICszNjIsNiBAQAogICByZXR1cm4gSmF2YUNTaGFycE1ha2VSdWxlKGZhbHNlLCBwYXJzZXIsIHBhdGgsIGZpbGVfbmFtZSk7CiB9CiAKLXN0ZDo6c3RyaW5nIEJpbmFyeUZpbGVOYW1lKGNvbnN0IFBhcnNlciAmcGFyc2VyLCBjb25zdCBzdGQ6OnN0cmluZyAmcGF0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nICZmaWxlX25hbWUpIHsKLSAgYXV0byBleHQgPSBwYXJzZXIuZmlsZV9leHRlbnNpb25fLmxlbmd0aCgpID8gcGFyc2VyLmZpbGVfZXh0ZW5zaW9uXyA6ICJiaW4iOwotICByZXR1cm4gcGF0aCArIGZpbGVfbmFtZSArICIuIiArIGV4dDsKLX0KLQogYm9vbCBHZW5lcmF0ZUJpbmFyeShjb25zdCBQYXJzZXIgJnBhcnNlciwgY29uc3Qgc3RkOjpzdHJpbmcgJnBhdGgsCiAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nICZmaWxlX25hbWUpIHsKICAgaWYgKHBhcnNlci5vcHRzLnVzZV9mbGV4YnVmZmVycykgewpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvc3JjL2ZsYXRjLmNwcCBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3NyYy9mbGF0Yy5jcHAKaW5kZXggM2IyZWY5Zi4uMWQxMmExNyAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvc3JjL2ZsYXRjLmNwcAorKysgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy9zcmMvZmxhdGMuY3BwCkBAIC0xOSwxMSArMTksMTMgQEAKICNpbmNsdWRlIDxsaXN0PgogI2luY2x1ZGUgPHNzdHJlYW0+CiAKKyNpbmNsdWRlICJhbm5vdGF0ZWRfYmluYXJ5X3RleHRfZ2VuLmgiCisjaW5jbHVkZSAiYmluYXJ5X2Fubm90YXRvci5oIgogI2luY2x1ZGUgImZsYXRidWZmZXJzL3V0aWwuaCIKIAogbmFtZXNwYWNlIGZsYXRidWZmZXJzIHsKIAotY29uc3QgY2hhciAqRkxBVENfVkVSU0lPTigpIHsgcmV0dXJuIEZMQVRCVUZGRVJTX1ZFUlNJT04oKTsgfQorc3RhdGljIGNvbnN0IGNoYXIgKkZMQVRDX1ZFUlNJT04oKSB7IHJldHVybiBGTEFUQlVGRkVSU19WRVJTSU9OKCk7IH0KIAogdm9pZCBGbGF0Q29tcGlsZXI6OlBhcnNlRmlsZSgKICAgICBmbGF0YnVmZmVyczo6UGFyc2VyICZwYXJzZXIsIGNvbnN0IHN0ZDo6c3RyaW5nICZmaWxlbmFtZSwKQEAgLTg0LDYgKzg2LDggQEAKICAgeyAiIiwgInNjb3BlZC1lbnVtcyIsICIiLAogICAgICJVc2UgQysrMTEgc3R5bGUgc2NvcGVkIGFuZCBzdHJvbmdseSB0eXBlZCBlbnVtcy4gQWxzbyBpbXBsaWVzICIKICAgICAiLS1uby1wcmVmaXguIiB9LAorICB7ICIiLCAic3dpZnQtaW1wbGVtZW50YXRpb24tb25seSIsICIiLAorICAgICJBZGRzIGEgQF9pbXBsZW1lbnRhdGlvbk9ubHkgdG8gc3dpZnQgaW1wb3J0cyIgfSwKICAgeyAiIiwgImdlbi1pbmNsdWVzIiwgIiIsCiAgICAgIihkZXByZWNhdGVkKSwgdGhpcyBpcyB0aGUgZGVmYXVsdCBiZWhhdmlvci4gSWYgdGhlIG9yaWdpbmFsIGJlaGF2aW9yIGlzICIKICAgICAicmVxdWlyZWQgKG5vIGluY2x1ZGUgc3RhdGVtZW50cykgdXNlIC0tbm8taW5jbHVkZXMuIiB9LApAQCAtMjAzLDcgKzIwNyw3IEBACiAgICAgIlVzZWQgd2l0aCBcImJpbmFyeVwiIGFuZCBcImpzb25cIiBvcHRpb25zLCBpdCBnZW5lcmF0ZXMgZGF0YSB1c2luZyAiCiAgICAgInNjaGVtYS1sZXNzIEZsZXhCdWZmZXJzLiIgfSwKICAgeyAiIiwgIm5vLXdhcm5pbmdzIiwgIiIsICJJbmhpYml0IGFsbCB3YXJuaW5ncyBtZXNzYWdlcy4iIH0sCi0gIHsgIiIsICJ3YXJuaW5nLWFzLWVycm9ycyIsICIiLCAiVHJlYXQgYWxsIHdhcm5pbmdzIGFzIGVycm9ycy4iIH0sCisgIHsgIiIsICJ3YXJuaW5ncy1hcy1lcnJvcnMiLCAiIiwgIlRyZWF0IGFsbCB3YXJuaW5ncyBhcyBlcnJvcnMuIiB9LAogICB7ICIiLCAiY3MtZ2xvYmFsLWFsaWFzIiwgIiIsCiAgICAgIlByZXBlbmQgXCJnbG9iYWw6OlwiIHRvIGFsbCB1c2VyIGdlbmVyYXRlZCBjc2hhcnAgY2xhc3NlcyBhbmQgIgogICAgICJzdHJ1Y3RzLiIgfSwKQEAgLTIxNSw2ICsyMTksMTEgQEAKICAgICAiaW4gSlNPTiwgd2hpY2ggaXMgdW5zYWZlIHVubGVzcyBjaGVja2VkIGJ5IGEgdmVyaWZpZXIgYWZ0ZXJ3YXJkcy4iIH0sCiAgIHsgIiIsICJ0cy1mbGF0LWZpbGVzIiwgIiIsCiAgICAgIk9ubHkgZ2VuZXJhdGVkIG9uZSB0eXBlc2NyaXB0IGZpbGUgcGVyIC5mYnMgZmlsZS4iIH0sCisgIHsgIiIsICJhbm5vdGF0ZSIsICJTQ0hFTUEiLAorICAgICJBbm5vdGF0ZSB0aGUgcHJvdmlkZWQgQklOQVJZX0ZJTEUgd2l0aCB0aGUgc3BlY2lmaWVkIFNDSEVNQSBmaWxlLiIgfSwKKyAgeyAiIiwgIm5vLWxlYWstcHJpdmF0ZS1hbm5vdGF0aW9uIiwgIiIsCisgICAgIlByZXZlbnRzIG11bHRpcGxlIHR5cGUgb2YgYW5ub3RhdGlvbnMgd2l0aGluIGEgRmJzIFNDSEVNQSBmaWxlLiIKKyAgICAiQ3VycmVudGx5IHRoaXMgaXMgcmVxdWlyZWQgdG8gZ2VuZXJhdGUgcHJpdmF0ZSB0eXBlcyBpbiBSdXN0IiB9LAogfTsKIAogc3RhdGljIHZvaWQgQXBwZW5kVGV4dFdyYXBwZWRTdHJpbmcoc3RkOjpzdHJpbmdzdHJlYW0gJnNzLCBzdGQ6OnN0cmluZyAmdGV4dCwKQEAgLTI5Nyw3ICszMDYsNyBAQAogICAgIHNzIDw8ICIsICI7CiAgIH0KICAgc3Muc2Vla3AoLTIsIHNzLmN1cik7Ci0gIHNzIDw8ICJdLi4uIEZJTEUuLi4gWy0tIEZJTEUuLi5dIjsKKyAgc3MgPDwgIl0uLi4gRklMRS4uLiBbLS0gQklOQVJZX0ZJTEUuLi5dIjsKICAgc3RkOjpzdHJpbmcgaGVscCA9IHNzLnN0cigpOwogICBzdGQ6OnN0cmluZ3N0cmVhbSBzc190ZXh0d3JhcDsKICAgQXBwZW5kVGV4dFdyYXBwZWRTdHJpbmcoc3NfdGV4dHdyYXAsIGhlbHAsIDgwLCAwKTsKQEAgLTMwNiw3ICszMTUsOCBAQAogCiBzdGQ6OnN0cmluZyBGbGF0Q29tcGlsZXI6OkdldFVzYWdlU3RyaW5nKGNvbnN0IGNoYXIgKnByb2dyYW1fbmFtZSkgY29uc3QgewogICBzdGQ6OnN0cmluZ3N0cmVhbSBzczsKLSAgc3MgPDwgIlVzYWdlOiAiIDw8IHByb2dyYW1fbmFtZSA8PCAiIFtPUFRJT05dLi4uIEZJTEUuLi4gWy0tIEZJTEUuLi5dXG4iOworICBzcyA8PCAiVXNhZ2U6ICIgPDwgcHJvZ3JhbV9uYW1lCisgICAgIDw8ICIgW09QVElPTl0uLi4gRklMRS4uLiBbLS0gQklOQVJZX0ZJTEUuLi5dXG4iOwogICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHBhcmFtc18ubnVtX2dlbmVyYXRvcnM7ICsraSkgewogICAgIGNvbnN0IEdlbmVyYXRvciAmZyA9IHBhcmFtc18uZ2VuZXJhdG9yc1tpXTsKICAgICBBcHBlbmRPcHRpb24oc3MsIGcub3B0aW9uLCA4MCwgMjUpOwpAQCAtMzIwLDE2ICszMzAsNDggQEAKIAogICBzdGQ6OnN0cmluZyBmaWxlc19kZXNjcmlwdGlvbiA9CiAgICAgICAiRklMRXMgbWF5IGJlIHNjaGVtYXMgKG11c3QgZW5kIGluIC5mYnMpLCBiaW5hcnkgc2NoZW1hcyAobXVzdCBlbmQgaW4gIgotICAgICAgIi5iZmJzKSBvciBKU09OIGZpbGVzIChjb25mb3JtaW5nIHRvIHByZWNlZGluZyBzY2hlbWEpLiBGSUxFcyBhZnRlciB0aGUgIgotICAgICAgIi0tIG11c3QgYmUgYmluYXJ5IGZsYXRidWZmZXIgZm9ybWF0IGZpbGVzLiBPdXRwdXQgZmlsZXMgYXJlIG5hbWVkIHVzaW5nICIKLSAgICAgICJ0aGUgYmFzZSBmaWxlIG5hbWUgb2YgdGhlIGlucHV0LCBhbmQgd3JpdHRlbiB0byB0aGUgY3VycmVudCBkaXJlY3RvcnkgIgotICAgICAgIm9yIHRoZSBwYXRoIGdpdmVuIGJ5IC1vLiBleGFtcGxlOiAiICsKKyAgICAgICIuYmZicykgb3IgSlNPTiBmaWxlcyAoY29uZm9ybWluZyB0byBwcmVjZWRpbmcgc2NoZW1hKS4gQklOQVJZX0ZJTEVzICIKKyAgICAgICJhZnRlciB0aGUgLS0gbXVzdCBiZSBiaW5hcnkgZmxhdGJ1ZmZlciBmb3JtYXQgZmlsZXMuIE91dHB1dCBmaWxlcyBhcmUgIgorICAgICAgIm5hbWVkIHVzaW5nIHRoZSBiYXNlIGZpbGUgbmFtZSBvZiB0aGUgaW5wdXQsIGFuZCB3cml0dGVuIHRvIHRoZSBjdXJyZW50ICIKKyAgICAgICJkaXJlY3Rvcnkgb3IgdGhlIHBhdGggZ2l2ZW4gYnkgLW8uIGV4YW1wbGU6ICIgKwogICAgICAgc3RkOjpzdHJpbmcocHJvZ3JhbV9uYW1lKSArICIgLWMgLWIgc2NoZW1hMS5mYnMgc2NoZW1hMi5mYnMgZGF0YS5qc29uIjsKICAgQXBwZW5kVGV4dFdyYXBwZWRTdHJpbmcoc3MsIGZpbGVzX2Rlc2NyaXB0aW9uLCA4MCwgMCk7CiAgIHNzIDw8ICJcbiI7CiAgIHJldHVybiBzcy5zdHIoKTsKIH0KIAordm9pZCBGbGF0Q29tcGlsZXI6OkFubm90YXRlQmluYXJpZXMoCisgICAgY29uc3QgdWludDhfdCAqYmluYXJ5X3NjaGVtYSwgY29uc3QgdWludDY0X3QgYmluYXJ5X3NjaGVtYV9zaXplLAorICAgIGNvbnN0IHN0ZDo6c3RyaW5nICZzY2hlbWFfZmlsZW5hbWUsCisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+ICZiaW5hcnlfZmlsZXMpIHsKKyAgZm9yIChjb25zdCBzdGQ6OnN0cmluZyAmZmlsZW5hbWUgOiBiaW5hcnlfZmlsZXMpIHsKKyAgICBzdGQ6OnN0cmluZyBiaW5hcnlfY29udGVudHM7CisgICAgaWYgKCFmbGF0YnVmZmVyczo6TG9hZEZpbGUoZmlsZW5hbWUuY19zdHIoKSwgdHJ1ZSwgJmJpbmFyeV9jb250ZW50cykpIHsKKyAgICAgIFdhcm4oInVuYWJsZSB0byBsb2FkIGJpbmFyeSBmaWxlOiAiICsgZmlsZW5hbWUpOworICAgICAgY29udGludWU7CisgICAgfQorCisgICAgY29uc3QgdWludDhfdCAqYmluYXJ5ID0KKyAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90ICo+KGJpbmFyeV9jb250ZW50cy5jX3N0cigpKTsKKyAgICBjb25zdCBzaXplX3QgYmluYXJ5X3NpemUgPSBiaW5hcnlfY29udGVudHMuc2l6ZSgpOworCisgICAgZmxhdGJ1ZmZlcnM6OkJpbmFyeUFubm90YXRvciBiaW5hcnlfYW5ub3RhdG9yKAorICAgICAgICBiaW5hcnlfc2NoZW1hLCBiaW5hcnlfc2NoZW1hX3NpemUsIGJpbmFyeSwgYmluYXJ5X3NpemUpOworCisgICAgYXV0byBhbm5vdGF0aW9ucyA9IGJpbmFyeV9hbm5vdGF0b3IuQW5ub3RhdGUoKTsKKworICAgIC8vIFRPRE8oZGJhaWxleWNoZXNzKTogUmlnaHQgbm93IHdlIGp1c3Qgc3VwcG9ydCBhIHNpbmdsZSB0ZXh0LWJhc2VkCisgICAgLy8gb3V0cHV0IG9mIHRoZSBhbm5vdGF0ZWQgYmluYXJ5IHNjaGVtYSwgd2hpY2ggd2UgZ2VuZXJhdGUgaGVyZS4gV2UKKyAgICAvLyBjb3VsZCBvdXRwdXQgdGhlIHJhdyBhbm5vdGF0aW9ucyBpbnN0ZWFkIGFuZCBoYXZlIHRoaXJkLXBhcnR5IHRvb2xzCisgICAgLy8gdXNlIHRoZW0gdG8gZ2VuZXJhdGUgdGhlaXIgb3duIG91dHB1dC4KKyAgICBmbGF0YnVmZmVyczo6QW5ub3RhdGVkQmluYXJ5VGV4dEdlbmVyYXRvciB0ZXh0X2dlbmVyYXRvcigKKyAgICAgICAgZmxhdGJ1ZmZlcnM6OkFubm90YXRlZEJpbmFyeVRleHRHZW5lcmF0b3I6Ok9wdGlvbnN7fSwgYW5ub3RhdGlvbnMsCisgICAgICAgIGJpbmFyeSwgYmluYXJ5X3NpemUpOworCisgICAgdGV4dF9nZW5lcmF0b3IuR2VuZXJhdGUoZmlsZW5hbWUsIHNjaGVtYV9maWxlbmFtZSk7CisgIH0KK30KKwogaW50IEZsYXRDb21waWxlcjo6Q29tcGlsZShpbnQgYXJnYywgY29uc3QgY2hhciAqKmFyZ3YpIHsKICAgaWYgKHBhcmFtc18uZ2VuZXJhdG9ycyA9PSBudWxscHRyIHx8IHBhcmFtc18ubnVtX2dlbmVyYXRvcnMgPT0gMCkgewogICAgIHJldHVybiAwOwpAQCAtMzUzLDYgKzM5NSw3IEBACiAgIHN0ZDo6dmVjdG9yPGJvb2w+IGdlbmVyYXRvcl9lbmFibGVkKHBhcmFtc18ubnVtX2dlbmVyYXRvcnMsIGZhbHNlKTsKICAgc2l6ZV90IGJpbmFyeV9maWxlc19mcm9tID0gc3RkOjpudW1lcmljX2xpbWl0czxzaXplX3Q+OjptYXgoKTsKICAgc3RkOjpzdHJpbmcgY29uZm9ybV90b19zY2hlbWE7CisgIHN0ZDo6c3RyaW5nIGFubm90YXRlX3NjaGVtYTsKIAogICBjb25zdCBjaGFyICpwcm9ncmFtX25hbWUgPSBhcmd2WzBdOwogCkBAIC0zOTAsNyArNDMzLDcgQEAKICAgICAgICAgb3B0cy5pbmNsdWRlX3ByZWZpeCA9IGZsYXRidWZmZXJzOjpDb25DYXRQYXRoRmlsZU5hbWUoCiAgICAgICAgICAgICBmbGF0YnVmZmVyczo6UG9zaXhQYXRoKGFyZ3ZbYXJnaV0pLCAiIik7CiAgICAgICB9IGVsc2UgaWYgKGFyZyA9PSAiLS1rZWVwLXByZWZpeCIpIHsKLSAgICAgICAgb3B0cy5rZWVwX2luY2x1ZGVfcGF0aCA9IHRydWU7CisgICAgICAgIG9wdHMua2VlcF9wcmVmaXggPSB0cnVlOwogICAgICAgfSBlbHNlIGlmIChhcmcgPT0gIi0tc3RyaWN0LWpzb24iKSB7CiAgICAgICAgIG9wdHMuc3RyaWN0X2pzb24gPSB0cnVlOwogICAgICAgfSBlbHNlIGlmIChhcmcgPT0gIi0tYWxsb3ctbm9uLXV0ZjgiKSB7CkBAIC00NTIsNiArNDk1LDggQEAKICAgICAgICAgb3B0cy5qYXZhX2NoZWNrZXJmcmFtZXdvcmsgPSB0cnVlOwogICAgICAgfSBlbHNlIGlmIChhcmcgPT0gIi0tZ2VuLWdlbmVyYXRlZCIpIHsKICAgICAgICAgb3B0cy5nZW5fZ2VuZXJhdGVkID0gdHJ1ZTsKKyAgICAgIH0gZWxzZSBpZiAoYXJnID09ICItLXN3aWZ0LWltcGxlbWVudGF0aW9uLW9ubHkiKSB7CisgICAgICAgIG9wdHMuc3dpZnRfaW1wbGVtZW50YXRpb25fb25seSA9IHRydWU7CiAgICAgICB9IGVsc2UgaWYgKGFyZyA9PSAiLS1nZW4tanNvbi1lbWl0IikgewogICAgICAgICBvcHRzLmdlbl9qc29uX2NvZGVycyA9IHRydWU7CiAgICAgICB9IGVsc2UgaWYgKGFyZyA9PSAiLS1vYmplY3QtcHJlZml4IikgewpAQCAtNTU0LDYgKzU5OSwxMSBAQAogICAgICAgICBvcHRzLmpzb25fbmVzdGVkX2xlZ2FjeV9mbGF0YnVmZmVycyA9IHRydWU7CiAgICAgICB9IGVsc2UgaWYgKGFyZyA9PSAiLS10cy1mbGF0LWZpbGVzIikgewogICAgICAgICBvcHRzLnRzX2ZsYXRfZmlsZSA9IHRydWU7CisgICAgICB9IGVsc2UgaWYgKGFyZyA9PSAiLS1uby1sZWFrLXByaXZhdGUtYW5ub3RhdGlvbiIpIHsKKyAgICAgICAgb3B0cy5ub19sZWFrX3ByaXZhdGVfYW5ub3RhdGlvbnMgPSB0cnVlOworICAgICAgfSBlbHNlIGlmIChhcmcgPT0gIi0tYW5ub3RhdGUiKSB7CisgICAgICAgIGlmICgrK2FyZ2kgPj0gYXJnYykgRXJyb3IoIm1pc3NpbmcgcGF0aCBmb2xsb3dpbmc6ICIgKyBhcmcsIHRydWUpOworICAgICAgICBhbm5vdGF0ZV9zY2hlbWEgPSBmbGF0YnVmZmVyczo6UG9zaXhQYXRoKGFyZ3ZbYXJnaV0pOwogICAgICAgfSBlbHNlIHsKICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBwYXJhbXNfLm51bV9nZW5lcmF0b3JzOyArK2kpIHsKICAgICAgICAgICBpZiAoYXJnID09ICItLSIgKyBwYXJhbXNfLmdlbmVyYXRvcnNbaV0ub3B0aW9uLmxvbmdfb3B0IHx8CkBAIC01ODIsNyArNjMyLDggQEAKICAgaWYgKG9wdHMucHJvdG9fbW9kZSkgewogICAgIGlmIChhbnlfZ2VuZXJhdG9yKQogICAgICAgRXJyb3IoImNhbm5vdCBnZW5lcmF0ZSBjb2RlIGRpcmVjdGx5IGZyb20gLnByb3RvIGZpbGVzIiwgdHJ1ZSk7Ci0gIH0gZWxzZSBpZiAoIWFueV9nZW5lcmF0b3IgJiYgY29uZm9ybV90b19zY2hlbWEuZW1wdHkoKSkgeworICB9IGVsc2UgaWYgKCFhbnlfZ2VuZXJhdG9yICYmIGNvbmZvcm1fdG9fc2NoZW1hLmVtcHR5KCkgJiYKKyAgICAgICAgICAgICBhbm5vdGF0ZV9zY2hlbWEuZW1wdHkoKSkgewogICAgIEVycm9yKCJubyBvcHRpb25zOiBzcGVjaWZ5IGF0IGxlYXN0IG9uZSBnZW5lcmF0b3IuIiwgdHJ1ZSk7CiAgIH0KIApAQCAtNTkyLDEwICs2NDMsNiBAQAogICAgICAgICAid2VsbC4iKTsKICAgfQogCi0gIGlmIChvcHRzLnRzX2ZsYXRfZmlsZSAmJiBvcHRzLmdlbmVyYXRlX2FsbCkgewotICAgIEVycm9yKCJDb21iaW5pbmcgLS10cy1mbGF0LWZpbGUgYW5kIC0tZ2VuLWFsbCBpcyBub3Qgc3VwcG9ydGVkLiIpOwotICB9Ci0KICAgZmxhdGJ1ZmZlcnM6OlBhcnNlciBjb25mb3JtX3BhcnNlcjsKICAgaWYgKCFjb25mb3JtX3RvX3NjaGVtYS5lbXB0eSgpKSB7CiAgICAgc3RkOjpzdHJpbmcgY29udGVudHM7CkBAIC02MTEsNiArNjU4LDUzIEBACiAgICAgfQogICB9CiAKKyAgaWYgKCFhbm5vdGF0ZV9zY2hlbWEuZW1wdHkoKSkgeworICAgIGNvbnN0IHN0ZDo6c3RyaW5nIGV4dCA9IGZsYXRidWZmZXJzOjpHZXRFeHRlbnNpb24oYW5ub3RhdGVfc2NoZW1hKTsKKyAgICBpZiAoIShleHQgPT0gcmVmbGVjdGlvbjo6U2NoZW1hRXh0ZW5zaW9uKCkgfHwgZXh0ID09ICJmYnMiKSkgeworICAgICAgRXJyb3IoIkV4cGVjdGVkIGEgYC5iZmJzYCBvciBgLmZic2Agc2NoZW1hLCBnb3Q6ICIgKyBhbm5vdGF0ZV9zY2hlbWEpOworICAgIH0KKworICAgIGNvbnN0IGJvb2wgaXNfYmluYXJ5X3NjaGVtYSA9IGV4dCA9PSByZWZsZWN0aW9uOjpTY2hlbWFFeHRlbnNpb24oKTsKKworICAgIHN0ZDo6c3RyaW5nIHNjaGVtYV9jb250ZW50czsKKyAgICBpZiAoIWZsYXRidWZmZXJzOjpMb2FkRmlsZShhbm5vdGF0ZV9zY2hlbWEuY19zdHIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKmJpbmFyeT0qL2lzX2JpbmFyeV9zY2hlbWEsICZzY2hlbWFfY29udGVudHMpKSB7CisgICAgICBFcnJvcigidW5hYmxlIHRvIGxvYWQgc2NoZW1hOiAiICsgYW5ub3RhdGVfc2NoZW1hKTsKKyAgICB9CisKKyAgICBjb25zdCB1aW50OF90ICpiaW5hcnlfc2NoZW1hID0gbnVsbHB0cjsKKyAgICB1aW50NjRfdCBiaW5hcnlfc2NoZW1hX3NpemUgPSAwOworCisgICAgSURMT3B0aW9ucyBiaW5hcnlfb3B0czsKKyAgICBiaW5hcnlfb3B0cy5sYW5nX3RvX2dlbmVyYXRlIHw9IGZsYXRidWZmZXJzOjpJRExPcHRpb25zOjprQmluYXJ5OworICAgIGZsYXRidWZmZXJzOjpQYXJzZXIgcGFyc2VyKGJpbmFyeV9vcHRzKTsKKworICAgIGlmIChpc19iaW5hcnlfc2NoZW1hKSB7CisgICAgICBiaW5hcnlfc2NoZW1hID0KKyAgICAgICAgICByZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QgKj4oc2NoZW1hX2NvbnRlbnRzLmNfc3RyKCkpOworICAgICAgYmluYXJ5X3NjaGVtYV9zaXplID0gc2NoZW1hX2NvbnRlbnRzLnNpemUoKTsKKyAgICB9IGVsc2UgeworICAgICAgLy8gSWYgd2UgbmVlZCB0byBnZW5lcmF0ZSB0aGUgLmJmYnMgZmlsZSBmcm9tIHRoZSBwcm92aWRlZCBzY2hlbWEgZmlsZQorICAgICAgLy8gKC5mYnMpCisgICAgICBQYXJzZUZpbGUocGFyc2VyLCBhbm5vdGF0ZV9zY2hlbWEsIHNjaGVtYV9jb250ZW50cywgaW5jbHVkZV9kaXJlY3Rvcmllcyk7CisgICAgICBwYXJzZXIuU2VyaWFsaXplKCk7CisKKyAgICAgIGJpbmFyeV9zY2hlbWEgPSBwYXJzZXIuYnVpbGRlcl8uR2V0QnVmZmVyUG9pbnRlcigpOworICAgICAgYmluYXJ5X3NjaGVtYV9zaXplID0gcGFyc2VyLmJ1aWxkZXJfLkdldFNpemUoKTsKKyAgICB9CisKKyAgICBpZiAoYmluYXJ5X3NjaGVtYSA9PSBudWxscHRyIHx8ICFiaW5hcnlfc2NoZW1hX3NpemUpIHsKKyAgICAgIEVycm9yKCJjb3VsZCBub3QgcGFyc2UgYSB2YWx1ZSBiaW5hcnkgc2NoZW1hIGZyb206ICIgKyBhbm5vdGF0ZV9zY2hlbWEpOworICAgIH0KKworICAgIC8vIEFubm90YXRlIHRoZSBwcm92aWRlZCBmaWxlcyB3aXRoIHRoZSBiaW5hcnlfc2NoZW1hLgorICAgIEFubm90YXRlQmluYXJpZXMoYmluYXJ5X3NjaGVtYSwgYmluYXJ5X3NjaGVtYV9zaXplLCBhbm5vdGF0ZV9zY2hlbWEsCisgICAgICAgICAgICAgICAgICAgICBmaWxlbmFtZXMpOworCisgICAgLy8gV2UgZG9uJ3Qgc3VwcG9ydCBkb2luZyBhbnl0aGluZyBlbHNlIGFmdGVyIGFubm90YXRpbmcgYSBiaW5hcnkuCisgICAgcmV0dXJuIDA7CisgIH0KKwogICBzdGQ6OnVuaXF1ZV9wdHI8ZmxhdGJ1ZmZlcnM6OlBhcnNlcj4gcGFyc2VyKG5ldyBmbGF0YnVmZmVyczo6UGFyc2VyKG9wdHMpKTsKIAogICBmb3IgKGF1dG8gZmlsZV9pdCA9IGZpbGVuYW1lcy5iZWdpbigpOyBmaWxlX2l0ICE9IGZpbGVuYW1lcy5lbmQoKTsKQEAgLTc1NSw3ICs4NDksNyBAQAogICAgICAgICAgIGlmIChwYXJhbXNfLmdlbmVyYXRvcnNbaV0uZ2VuZXJhdGVHUlBDICE9IG51bGxwdHIpIHsKICAgICAgICAgICAgIGlmICghcGFyYW1zXy5nZW5lcmF0b3JzW2ldLmdlbmVyYXRlR1JQQygqcGFyc2VyLmdldCgpLCBvdXRwdXRfcGF0aCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlYmFzZSkpIHsKLSAgICAgICAgICAgICAgRXJyb3Ioc3RkOjpzdHJpbmcoIlVuYWJsZSB0byBnZW5lcmF0ZSBHUlBDIGludGVyZmFjZSBmb3IiKSArCisgICAgICAgICAgICAgIEVycm9yKHN0ZDo6c3RyaW5nKCJVbmFibGUgdG8gZ2VuZXJhdGUgR1JQQyBpbnRlcmZhY2UgZm9yICIpICsKICAgICAgICAgICAgICAgICAgICAgcGFyYW1zXy5nZW5lcmF0b3JzW2ldLmxhbmdfbmFtZSk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgfSBlbHNlIHsKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3NyYy9mbGF0Y19tYWluLmNwcCBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3NyYy9mbGF0Y19tYWluLmNwcAppbmRleCBhYmNhYjI0Li5iNGM0MjUxIDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy9zcmMvZmxhdGNfbWFpbi5jcHAKKysrIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvc3JjL2ZsYXRjX21haW4uY3BwCkBAIC01Miw5ICs1Miw2IEBACiB9ICAvLyBuYW1lc3BhY2UgZmxhdGJ1ZmZlcnMKIAogaW50IG1haW4oaW50IGFyZ2MsIGNvbnN0IGNoYXIgKmFyZ3ZbXSkgewotICAvLyBQcmV2ZW50IEFwcHZleW9yLUNJIGhhbmdzLgotICBmbGF0YnVmZmVyczo6U2V0dXBEZWZhdWx0Q1JUUmVwb3J0TW9kZSgpOwotCiAgIGNvbnN0IHN0ZDo6c3RyaW5nIGZsYXRidWZmZXJzX3ZlcnNpb24oZmxhdGJ1ZmZlcnM6OkZMQVRCVUZGRVJTX1ZFUlNJT04oKSk7CiAKICAgc3RkOjp1bmlxdWVfcHRyPGZsYXRidWZmZXJzOjpCZmJzR2VuZXJhdG9yPiBiZmJzX2dlbl9sdWEgPQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvc3JjL2lkbF9nZW5fY3BwLmNwcCBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3NyYy9pZGxfZ2VuX2NwcC5jcHAKaW5kZXggZWY3ZjYwYS4uYzFhMDE5OCAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvc3JjL2lkbF9nZW5fY3BwLmNwcAorKysgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy9zcmMvaWRsX2dlbl9jcHAuY3BwCkBAIC0xNiw4ICsxNiwxMCBAQAogCiAvLyBpbmRlcGVuZGVudCBmcm9tIGlkbF9wYXJzZXIsIHNpbmNlIHRoaXMgY29kZSBpcyBub3QgbmVlZGVkIGZvciBtb3N0IGNsaWVudHMKIAorI2luY2x1ZGUgPHN0cmluZz4KICNpbmNsdWRlIDx1bm9yZGVyZWRfc2V0PgogCisjaW5jbHVkZSAiZmxhdGJ1ZmZlcnMvYmFzZS5oIgogI2luY2x1ZGUgImZsYXRidWZmZXJzL2NvZGVfZ2VuZXJhdG9ycy5oIgogI2luY2x1ZGUgImZsYXRidWZmZXJzL2ZsYXRidWZmZXJzLmgiCiAjaW5jbHVkZSAiZmxhdGJ1ZmZlcnMvZmxhdGMuaCIKQEAgLTY4LDYgKzcwLDE5IEBACiAgIHJldHVybiBndWFyZDsKIH0KIAorc3RhdGljIGJvb2wgSXNWZWN0b3JPZlBvaW50ZXJzKGNvbnN0IEZpZWxkRGVmICZmaWVsZCkgeworICBjb25zdCBhdXRvICZ0eXBlID0gZmllbGQudmFsdWUudHlwZTsKKyAgY29uc3QgYXV0byAmdmVjdG9yX3R5cGUgPSB0eXBlLlZlY3RvclR5cGUoKTsKKyAgcmV0dXJuIHR5cGUuYmFzZV90eXBlID09IEJBU0VfVFlQRV9WRUNUT1IgJiYKKyAgICAgICAgIHZlY3Rvcl90eXBlLmJhc2VfdHlwZSA9PSBCQVNFX1RZUEVfU1RSVUNUICYmCisgICAgICAgICAhdmVjdG9yX3R5cGUuc3RydWN0X2RlZi0+Zml4ZWQgJiYgIWZpZWxkLm5hdGl2ZV9pbmxpbmU7Cit9CisKK3N0YXRpYyBib29sIElzUG9pbnRlcihjb25zdCBGaWVsZERlZiAmZmllbGQpIHsKKyAgcmV0dXJuIGZpZWxkLnZhbHVlLnR5cGUuYmFzZV90eXBlID09IEJBU0VfVFlQRV9TVFJVQ1QgJiYKKyAgICAgICAgICFJc1N0cnVjdChmaWVsZC52YWx1ZS50eXBlKTsKK30KKwogbmFtZXNwYWNlIGNwcCB7CiAKIGVudW0gQ3BwU3RhbmRhcmQgeyBDUFBfU1REX1gwID0gMCwgQ1BQX1NURF8xMSwgQ1BQX1NURF8xNyB9OwpAQCAtMTk5LDM3ICsyMTQsNjYgQEAKICAgICBmb3IgKGF1dG8ga3cgPSBrZXl3b3JkczsgKmt3OyBrdysrKSBrZXl3b3Jkc18uaW5zZXJ0KCprdyk7CiAgIH0KIAorICAvLyBBZGRzIGNvZGUgdG8gY2hlY2sgdGhhdCB0aGUgaW5jbHVkZWQgZmxhdGJ1ZmZlcnMuaCBpcyBvZiB0aGUgc2FtZSB2ZXJzaW9uCisgIC8vIGFzIHRoZSBnZW5lcmF0ZWQgY29kZS4gVGhpcyBjaGVjayBjdXJyZW50bHkgbG9va3MgZm9yIGV4YWN0IHZlcnNpb24gbWF0Y2gsCisgIC8vIGFzIHdlIHdvdWxkIGd1YXJhbnRlZSB0aGF0IHRoZXkgYXJlIGNvbXBhdGlibGUsIGJ1dCBpbiB0aGVvcnkgYSBuZXdlcgorICAvLyB2ZXJzaW9uIG9mIGZsYXRidWZmZXJzLmggc2hvdWxkIHdvcmsgd2l0aCBhIG9sZCBjb2RlIGdlbiBpZiB3ZSBkbyBwcm9wZXIKKyAgLy8gYmFja3dhcmRzIHN1cHBvcnQuCisgIHZvaWQgR2VuRmxhdGJ1ZmZlcnNWZXJzaW9uQ2hlY2soKSB7CisgICAgY29kZV8gKz0KKyAgICAgICAgIi8vIEVuc3VyZSB0aGUgaW5jbHVkZWQgZmxhdGJ1ZmZlcnMuaCBpcyB0aGUgc2FtZSB2ZXJzaW9uIGFzIHdoZW4gdGhpcyAiCisgICAgICAgICJmaWxlIHdhcyI7CisgICAgY29kZV8gKz0gIi8vIGdlbmVyYXRlZCwgb3RoZXJ3aXNlIGl0IG1heSBub3QgYmUgY29tcGF0aWJsZS4iOworICAgIGNvZGVfICs9ICJzdGF0aWNfYXNzZXJ0KEZMQVRCVUZGRVJTX1ZFUlNJT05fTUFKT1IgPT0gIiArCisgICAgICAgICAgICAgc3RkOjp0b19zdHJpbmcoRkxBVEJVRkZFUlNfVkVSU0lPTl9NQUpPUikgKyAiICYmIjsKKyAgICBjb2RlXyArPSAiICAgICAgICAgICAgICBGTEFUQlVGRkVSU19WRVJTSU9OX01JTk9SID09ICIgKworICAgICAgICAgICAgIHN0ZDo6dG9fc3RyaW5nKEZMQVRCVUZGRVJTX1ZFUlNJT05fTUlOT1IpICsgIiAmJiI7CisgICAgY29kZV8gKz0gIiAgICAgICAgICAgICAgRkxBVEJVRkZFUlNfVkVSU0lPTl9SRVZJU0lPTiA9PSAiICsKKyAgICAgICAgICAgICBzdGQ6OnRvX3N0cmluZyhGTEFUQlVGRkVSU19WRVJTSU9OX1JFVklTSU9OKSArICIsIjsKKyAgICBjb2RlXyArPSAiICAgICAgICAgICAgIFwiTm9uLWNvbXBhdGlibGUgZmxhdGJ1ZmZlcnMgdmVyc2lvbiBpbmNsdWRlZFwiKTsiOworICB9CisKICAgdm9pZCBHZW5JbmNsdWRlRGVwZW5kZW5jaWVzKCkgewotICAgIGludCBudW1faW5jbHVkZXMgPSAwOwogICAgIGlmIChvcHRzXy5nZW5lcmF0ZV9vYmplY3RfYmFzZWRfYXBpKSB7CiAgICAgICBmb3IgKGF1dG8gaXQgPSBwYXJzZXJfLm5hdGl2ZV9pbmNsdWRlZF9maWxlc18uYmVnaW4oKTsKICAgICAgICAgICAgaXQgIT0gcGFyc2VyXy5uYXRpdmVfaW5jbHVkZWRfZmlsZXNfLmVuZCgpOyArK2l0KSB7CiAgICAgICAgIGNvZGVfICs9ICIjaW5jbHVkZSBcIiIgKyAqaXQgKyAiXCIiOwotICAgICAgICBudW1faW5jbHVkZXMrKzsKICAgICAgIH0KICAgICB9Ci0gICAgZm9yIChhdXRvIGl0ID0gcGFyc2VyXy5pbmNsdWRlZF9maWxlc18uYmVnaW4oKTsKLSAgICAgICAgIGl0ICE9IHBhcnNlcl8uaW5jbHVkZWRfZmlsZXNfLmVuZCgpOyArK2l0KSB7Ci0gICAgICBpZiAoaXQtPnNlY29uZC5lbXB0eSgpKSBjb250aW51ZTsKLSAgICAgIGF1dG8gbm9leHQgPSBmbGF0YnVmZmVyczo6U3RyaXBFeHRlbnNpb24oaXQtPnNlY29uZCk7Ci0gICAgICBhdXRvIGJhc2VuYW1lID0gZmxhdGJ1ZmZlcnM6OlN0cmlwUGF0aChub2V4dCk7CiAKLSAgICAgIC8vIFRPRE8oYXVzdGluKTogQ2xlYW4gdGhpcyB1cC4KLSAgICAgIC8vIFRoZSByZWZsZWN0aW9uX2dlbmVyYXRlZC5oIGhlYWRlciBpcyBub3QgaW4gdGhlIHJlZmxlY3Rpb24gZm9sZGVyIGxpa2UKLSAgICAgIC8vIGl0J3MgaW5jbHVkZSBwYXRoIGFuZCBuYW1lc3BhY2Ugc3VnZ2VzdHMuICBEZXRlY3QgdGhpcyBzcGVjaWFsIGNhc2UgYW5kCi0gICAgICAvLyByZXdyaXRlIGl0LgotICAgICAgYXV0byBpbmNsdWRlTmFtZSA9Ci0gICAgICAgICAgR2VuZXJhdGVkRmlsZU5hbWUob3B0c18uaW5jbHVkZV9wcmVmaXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0c18ua2VlcF9pbmNsdWRlX3BhdGggPyBub2V4dCA6IGJhc2VuYW1lLCBvcHRzXyk7CisgICAgLy8gR2V0IHRoZSBkaXJlY3RseSBpbmNsdWRlZCBmaWxlIG9mIHRoZSBmaWxlIGJlaW5nIHBhcnNlZC4KKyAgICBzdGQ6OnZlY3RvcjxJbmNsdWRlZEZpbGU+IGluY2x1ZGVkX2ZpbGVzKHBhcnNlcl8uR2V0SW5jbHVkZWRGaWxlcygpKTsKIAotICAgICAgaWYgKGluY2x1ZGVOYW1lID09ICJyZWZsZWN0aW9uL3JlZmxlY3Rpb25fZ2VuZXJhdGVkLmgiKSB7Ci0gICAgICAgIGluY2x1ZGVOYW1lID0gImZsYXRidWZmZXJzL3JlZmxlY3Rpb25fZ2VuZXJhdGVkLmgiOworICAgIC8vIFdlIGFyZSBzYWZlIHRvIHNvcnQgdGhlbSBhbHBoYWJldGljYWxseSwgc2luY2UgdGhlcmUgc2hvdWxkbid0IGJlIGFueQorICAgIC8vIGludGVyZGVwZW5kZW5jZSBiZXR3ZWVuIHRoZW0uCisgICAgc3RkOjpzdGFibGVfc29ydChpbmNsdWRlZF9maWxlcy5iZWdpbigpLCBpbmNsdWRlZF9maWxlcy5lbmQoKSk7CisKKyAgICBmb3IgKGNvbnN0IEluY2x1ZGVkRmlsZSAmaW5jbHVkZWRfZmlsZSA6IGluY2x1ZGVkX2ZpbGVzKSB7CisgICAgICAvLyBHZXQgdGhlIG5hbWUgb2YgdGhlIGluY2x1ZGVkIGZpbGUgYXMgZGVmaW5lZCBieSB0aGUgc2NoZW1hLCBhbmQgc3RyaXAKKyAgICAgIC8vIHRoZSAuZmJzIGV4dGVuc2lvbi4KKyAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nIG5hbWVfd2l0aG91dF9leHQgPQorICAgICAgICAgIGZsYXRidWZmZXJzOjpTdHJpcEV4dGVuc2lvbihpbmNsdWRlZF9maWxlLnNjaGVtYV9uYW1lKTsKKworICAgICAgLy8gSWYgd2UgYXJlIHRvbGQgdG8ga2VlcCB0aGUgcHJlZml4IG9mIHRoZSBpbmNsdWRlZCBzY2hlbWEsIGxlYXZlIGl0CisgICAgICAvLyB1bmNoYW5nZWQsIG90aGVyd2lzZSBzdHJpcCB0aGUgbGVhZGluZyBwYXRoIG9mZiBzbyBqdXN0IHRoZSAiYmFzZW5hbWUiCisgICAgICAvLyBvZiB0aGUgaW5jbHVkZSBpcyByZXRhaW5lZC4KKyAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nIGJhc2VuYW1lID0KKyAgICAgICAgICBvcHRzXy5rZWVwX3ByZWZpeCA/IG5hbWVfd2l0aG91dF9leHQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGZsYXRidWZmZXJzOjpTdHJpcFBhdGgobmFtZV93aXRob3V0X2V4dCk7CisKKyAgICAgIHN0ZDo6c3RyaW5nIGluY2x1ZGVfbmFtZSA9CisgICAgICAgICAgR2VuZXJhdGVkRmlsZU5hbWUob3B0c18uaW5jbHVkZV9wcmVmaXgsIGJhc2VuYW1lLCBvcHRzXyk7CisKKyAgICAgIGlmIChpbmNsdWRlX25hbWUgPT0gInJlZmxlY3Rpb24vcmVmbGVjdGlvbl9nZW5lcmF0ZWQuaCIpIHsKKyAgICAgICAgaW5jbHVkZV9uYW1lID0gImZsYXRidWZmZXJzL3JlZmxlY3Rpb25fZ2VuZXJhdGVkLmgiOwogICAgICAgfQogCi0gICAgICBjb2RlXyArPSAiI2luY2x1ZGUgXCIiICsgaW5jbHVkZU5hbWUgKyAiXCIiOwotICAgICAgbnVtX2luY2x1ZGVzKys7CisgICAgICBjb2RlXyArPSAiI2luY2x1ZGUgXCIiICsgaW5jbHVkZV9uYW1lICsgIlwiIjsKICAgICB9Ci0gICAgaWYgKG51bV9pbmNsdWRlcykgY29kZV8gKz0gIiI7CisKKyAgICBpZiAoIXBhcnNlcl8ubmF0aXZlX2luY2x1ZGVkX2ZpbGVzXy5lbXB0eSgpIHx8ICFpbmNsdWRlZF9maWxlcy5lbXB0eSgpKSB7CisgICAgICBjb2RlXyArPSAiIjsKKyAgICB9CiAgIH0KIAogICB2b2lkIEdlbkV4dHJhSW5jbHVkZXMoKSB7CkBAIC0yOTUsNiArMzM5LDggQEAKIAogICAgICAgY29kZV8gKz0gIiNpbmNsdWRlIFwiZmxhdGJ1ZmZlcnMvZmxhdGJ1ZmZlcnMuaFwiIjsKICAgICAgIGNvZGVfICs9ICIiOworICAgICAgR2VuRmxhdGJ1ZmZlcnNWZXJzaW9uQ2hlY2soKTsKKyAgICAgIGNvZGVfICs9ICIiOwogCiAgICAgICBTZXROYW1lU3BhY2Uoc3RydWN0X2RlZi5kZWZpbmVkX25hbWVzcGFjZSk7CiAgICAgICBhdXRvIG5hbWUgPSBOYW1lKHN0cnVjdF9kZWYpOwpAQCAtMzU3LDggKzQwMywxMSBAQAogICAgIGNvZGVfICs9ICIjaW5jbHVkZSBcImZsYXRidWZmZXJzL2ZsYXRidWZmZXJzLmhcIiI7CiAgICAgaWYgKHBhcnNlcl8udXNlc19mbGV4YnVmZmVyc18pIHsKICAgICAgIGNvZGVfICs9ICIjaW5jbHVkZSBcImZsYXRidWZmZXJzL2ZsZXhidWZmZXJzLmhcIiI7CisgICAgICBjb2RlXyArPSAiI2luY2x1ZGUgXCJmbGF0YnVmZmVycy9mbGV4X2ZsYXRfdXRpbC5oXCIiOwogICAgIH0KICAgICBjb2RlXyArPSAiIjsKKyAgICBHZW5GbGF0YnVmZmVyc1ZlcnNpb25DaGVjaygpOworICAgIGNvZGVfICs9ICIiOwogCiAgICAgaWYgKG9wdHNfLmluY2x1ZGVfZGVwZW5kZW5jZV9oZWFkZXJzKSB7IEdlbkluY2x1ZGVEZXBlbmRlbmNpZXMoKTsgfQogICAgIEdlbkV4dHJhSW5jbHVkZXMoKTsKQEAgLTg1Miw3ICs5MDEsOSBAQAogICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICBjb25zdCBhdXRvIG5uID0gV3JhcE5hdGl2ZU5hbWVJbk5hbWVTcGFjZSgqdHlwZS5zdHJ1Y3RfZGVmLCBvcHRzXyk7Ci0gICAgICAgICAgcmV0dXJuIGZvcmNvcHkgPyBubiA6IEdlblR5cGVOYXRpdmVQdHIobm4sICZmaWVsZCwgZmFsc2UpOworICAgICAgICAgIHJldHVybiAoZm9yY29weSB8fCBmaWVsZC5uYXRpdmVfaW5saW5lKQorICAgICAgICAgICAgICAgICAgICAgPyBubgorICAgICAgICAgICAgICAgICAgICAgOiBHZW5UeXBlTmF0aXZlUHRyKG5uLCAmZmllbGQsIGZhbHNlKTsKICAgICAgICAgfQogICAgICAgfQogICAgICAgY2FzZSBCQVNFX1RZUEVfVU5JT046IHsKQEAgLTE4MzgsOSArMTg4OSw4IEBACiAgICAgICAgIGlmICh2ZWNfdHlwZS5iYXNlX3R5cGUgPT0gQkFTRV9UWVBFX1VUWVBFKSBjb250aW51ZTsKICAgICAgICAgY29uc3QgYXV0byBjcHBfdHlwZSA9IGZpZWxkLmF0dHJpYnV0ZXMuTG9va3VwKCJjcHBfdHlwZSIpOwogICAgICAgICBjb25zdCBhdXRvIGNwcF9wdHJfdHlwZSA9IGZpZWxkLmF0dHJpYnV0ZXMuTG9va3VwKCJjcHBfcHRyX3R5cGUiKTsKLSAgICAgICAgY29uc3QgYm9vbCBpc19wdHIgPQotICAgICAgICAgICAgKHZlY190eXBlLmJhc2VfdHlwZSA9PSBCQVNFX1RZUEVfU1RSVUNUICYmICFJc1N0cnVjdCh2ZWNfdHlwZSkpIHx8Ci0gICAgICAgICAgICAoY3BwX3R5cGUgJiYgY3BwX3B0cl90eXBlLT5jb25zdGFudCAhPSAibmFrZWQiKTsKKyAgICAgICAgY29uc3QgYm9vbCBpc19wdHIgPSBJc1ZlY3Rvck9mUG9pbnRlcnMoZmllbGQpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNwcF90eXBlICYmIGNwcF9wdHJfdHlwZS0+Y29uc3RhbnQgIT0gIm5ha2VkIik7CiAgICAgICAgIGlmIChpc19wdHIpIHsgcmV0dXJuIHRydWU7IH0KICAgICAgIH0KICAgICB9CkBAIC0xOTY0LDkgKzIwMTQsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IGNwcF90eXBlLT5jb25zdGFudAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IEdlblR5cGVOYXRpdmUodmVjX3R5cGUsIC8qaW52ZWN0b3IqLyB0cnVlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQsIC8qZm9yY29weSovIHRydWUpOwotICAgICAgICBjb25zdCBib29sIGlzX3B0ciA9Ci0gICAgICAgICAgICAodmVjX3R5cGUuYmFzZV90eXBlID09IEJBU0VfVFlQRV9TVFJVQ1QgJiYgIUlzU3RydWN0KHZlY190eXBlKSkgfHwKLSAgICAgICAgICAgIChjcHBfdHlwZSAmJiBjcHBfcHRyX3R5cGUtPmNvbnN0YW50ICE9ICJuYWtlZCIpOworICAgICAgICBjb25zdCBib29sIGlzX3B0ciA9IElzVmVjdG9yT2ZQb2ludGVycyhmaWVsZCkgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY3BwX3R5cGUgJiYgY3BwX3B0cl90eXBlLT5jb25zdGFudCAhPSAibmFrZWQiKTsKICAgICAgICAgQ29kZVdyaXRlciBjdygiICAiKTsKICAgICAgICAgY3cuU2V0VmFsdWUoIkZJRUxEIiwgTmFtZShmaWVsZCkpOwogICAgICAgICBjdy5TZXRWYWx1ZSgiVFlQRSIsIHR5cGVfbmFtZSk7CkBAIC0yMDMxLDE5ICsyMDgwLDM5IEBACiAgICAgZm9yIChhdXRvIGl0ID0gc3RydWN0X2RlZi5maWVsZHMudmVjLmJlZ2luKCk7CiAgICAgICAgICBpdCAhPSBzdHJ1Y3RfZGVmLmZpZWxkcy52ZWMuZW5kKCk7ICsraXQpIHsKICAgICAgIGNvbnN0IGF1dG8gJmZpZWxkID0gKippdDsKKyAgICAgIGNvbnN0IGF1dG8gYWNjZXNzb3IgPSBOYW1lKGZpZWxkKSArIGFjY2Vzc1N1ZmZpeDsKKyAgICAgIGNvbnN0IGF1dG8gbGhzX2FjY2Vzc29yID0gImxocy4iICsgYWNjZXNzb3I7CisgICAgICBjb25zdCBhdXRvIHJoc19hY2Nlc3NvciA9ICJyaHMuIiArIGFjY2Vzc29yOworCiAgICAgICBpZiAoIWZpZWxkLmRlcHJlY2F0ZWQgJiYgIC8vIERlcHJlY2F0ZWQgZmllbGRzIHdvbid0IGJlIGFjY2Vzc2libGUuCiAgICAgICAgICAgZmllbGQudmFsdWUudHlwZS5iYXNlX3R5cGUgIT0gQkFTRV9UWVBFX1VUWVBFICYmCiAgICAgICAgICAgKGZpZWxkLnZhbHVlLnR5cGUuYmFzZV90eXBlICE9IEJBU0VfVFlQRV9WRUNUT1IgfHwKICAgICAgICAgICAgZmllbGQudmFsdWUudHlwZS5lbGVtZW50ICE9IEJBU0VfVFlQRV9VVFlQRSkpIHsKICAgICAgICAgaWYgKCFjb21wYXJlX29wLmVtcHR5KCkpIHsgY29tcGFyZV9vcCArPSAiICYmXG4gICAgICAiOyB9Ci0gICAgICAgIGF1dG8gYWNjZXNzb3IgPSBOYW1lKGZpZWxkKSArIGFjY2Vzc1N1ZmZpeDsKICAgICAgICAgaWYgKHN0cnVjdF9kZWYuZml4ZWQgfHwgZmllbGQubmF0aXZlX2lubGluZSB8fAogICAgICAgICAgICAgZmllbGQudmFsdWUudHlwZS5iYXNlX3R5cGUgIT0gQkFTRV9UWVBFX1NUUlVDVCkgewotICAgICAgICAgIGNvbXBhcmVfb3AgKz0gIihsaHMuIiArIGFjY2Vzc29yICsgIiA9PSByaHMuIiArIGFjY2Vzc29yICsgIikiOworICAgICAgICAgIC8vIElmIHRoZSBmaWVsZCBpcyBhIHZlY3RvciBvZiB0YWJsZXMsIHRoZSB0YWJsZSBuZWVkIHRvIGJlIGNvbXBhcmVkCisgICAgICAgICAgLy8gYnkgdmFsdWUsIGluc3RlYWQgb2YgYnkgdGhlIGRlZmF1bHQgdW5pcXVlX3B0ciA9PSBvcGVyYXRvciB3aGljaAorICAgICAgICAgIC8vIGNvbXBhcmVzIGJ5IGFkZHJlc3MuCisgICAgICAgICAgaWYgKElzVmVjdG9yT2ZQb2ludGVycyhmaWVsZCkpIHsKKyAgICAgICAgICAgIGNvbnN0IGF1dG8gdHlwZSA9CisgICAgICAgICAgICAgICAgR2VuVHlwZU5hdGl2ZShmaWVsZC52YWx1ZS50eXBlLlZlY3RvclR5cGUoKSwgdHJ1ZSwgZmllbGQpOworICAgICAgICAgICAgY29uc3QgYXV0byBlcXVhbF9sZW5ndGggPQorICAgICAgICAgICAgICAgIGxoc19hY2Nlc3NvciArICIuc2l6ZSgpID09ICIgKyByaHNfYWNjZXNzb3IgKyAiLnNpemUoKSI7CisgICAgICAgICAgICBjb25zdCBhdXRvIGVsZW1lbnRzX2VxdWFsID0KKyAgICAgICAgICAgICAgICAic3RkOjplcXVhbCgiICsgbGhzX2FjY2Vzc29yICsgIi5jYmVnaW4oKSwgIiArIGxoc19hY2Nlc3NvciArCisgICAgICAgICAgICAgICAgIi5jZW5kKCksICIgKyByaHNfYWNjZXNzb3IgKyAiLmNiZWdpbigpLCBbXSgiICsgdHlwZSArCisgICAgICAgICAgICAgICAgIiBjb25zdCAmYSwgIiArIHR5cGUgKworICAgICAgICAgICAgICAgICIgY29uc3QgJmIpIHsgcmV0dXJuIChhID09IGIpIHx8IChhICYmIGIgJiYgKmEgPT0gKmIpOyB9KSI7CisKKyAgICAgICAgICAgIGNvbXBhcmVfb3AgKz0gIigiICsgZXF1YWxfbGVuZ3RoICsgIiAmJiAiICsgZWxlbWVudHNfZXF1YWwgKyAiKSI7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGNvbXBhcmVfb3AgKz0gIigiICsgbGhzX2FjY2Vzc29yICsgIiA9PSAiICsgcmhzX2FjY2Vzc29yICsgIikiOworICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAvLyBEZWVwIGNvbXBhcmUgb2Ygc3RkOjp1bmlxdWVfcHRyLiBOdWxsIGlzIG5vdCBlcXVhbCB0byBlbXB0eS4KICAgICAgICAgICBzdGQ6OnN0cmluZyBib3RoX251bGwgPQotICAgICAgICAgICAgICAiKGxocy4iICsgYWNjZXNzb3IgKyAiID09IHJocy4iICsgYWNjZXNzb3IgKyAiKSI7CisgICAgICAgICAgICAgICIoIiArIGxoc19hY2Nlc3NvciArICIgPT0gIiArIHJoc19hY2Nlc3NvciArICIpIjsKICAgICAgICAgICBzdGQ6OnN0cmluZyBub3RfbnVsbF9hbmRfZXF1YWwgPSAiKGxocy4iICsgYWNjZXNzb3IgKyAiICYmIHJocy4iICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY2Nlc3NvciArICIgJiYgKmxocy4iICsgYWNjZXNzb3IgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgPT0gKnJocy4iICsgYWNjZXNzb3IgKyAiKSI7CkBAIC0yMjU5LDcgKzIzMjgsNyBAQAogCiAgICAgICAvLyBAVE9ETzogTWJ5IG1ha2UgdGhpcyBkZWNpc2lvbnMgbW9yZSB1bml2ZXJzYWw/IEhvdz8KICAgICAgIGNvZGVfLlNldFZhbHVlKCJVX0dFVF9UWVBFIiwKLSAgICAgICAgICAgICAgICAgICAgIEVzY2FwZUtleXdvcmQoZmllbGQubmFtZSArIFVuaW9uVHlwZUZpZWxkU3VmZml4KCkpKTsKKyAgICAgICAgICAgICAgICAgICAgIEVzY2FwZUtleXdvcmQoTmFtZShmaWVsZCkgKyBVbmlvblR5cGVGaWVsZFN1ZmZpeCgpKSk7CiAgICAgICBjb2RlXy5TZXRWYWx1ZSgiVV9FTEVNRU5UX1RZUEUiLCBXcmFwSW5OYW1lU3BhY2UodS0+ZGVmaW5lZF9uYW1lc3BhY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR2V0RW51bVZhbFVzZSgqdSwgZXYpKSk7CiAgICAgICBjb2RlXy5TZXRWYWx1ZSgiVV9GSUVMRF9UWVBFIiwgImNvbnN0ICIgKyBmdWxsX3N0cnVjdF9uYW1lICsgIiAqIik7CkBAIC0yOTMyLDcgKzMwMDEsOCBAQAogICAgICAgICAgICAgcmV0dXJuIHB0eXBlICsgIihuZXcgIiArIG5hbWUgKyAiKCoiICsgdmFsICsgIikpIjsKICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgY29uc3QgYXV0byBwdHlwZSA9IEdlblR5cGVOYXRpdmVQdHIoCisgICAgICAgICAgc3RkOjpzdHJpbmcgcHR5cGUgPSBhZmllbGQubmF0aXZlX2lubGluZSA/ICIqIiA6ICIiOworICAgICAgICAgIHB0eXBlICs9IEdlblR5cGVOYXRpdmVQdHIoCiAgICAgICAgICAgICAgIFdyYXBOYXRpdmVOYW1lSW5OYW1lU3BhY2UoKnR5cGUuc3RydWN0X2RlZiwgb3B0c18pLCAmYWZpZWxkLAogICAgICAgICAgICAgICB0cnVlKTsKICAgICAgICAgICByZXR1cm4gcHR5cGUgKyAiKCIgKyB2YWwgKyAiLT5VblBhY2soX3Jlc29sdmVyKSkiOwpAQCAtMjk2MCw3ICszMDMwLDggQEAKICAgICAgICAgaWYgKGZpZWxkLnZhbHVlLnR5cGUuZWxlbWVudCA9PSBCQVNFX1RZUEVfVVRZUEUpIHsKICAgICAgICAgICBuYW1lID0gU3RyaXBVbmlvblR5cGUoTmFtZShmaWVsZCkpOwogICAgICAgICB9Ci0gICAgICAgIGNvZGUgKz0gInsgX28tPiIgKyBuYW1lICsgIi5yZXNpemUoX2UtPnNpemUoKSk7ICI7CisgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nIHZlY3Rvcl9maWVsZCA9ICJfby0+IiArIG5hbWU7CisgICAgICAgIGNvZGUgKz0gInsgIiArIHZlY3Rvcl9maWVsZCArICIucmVzaXplKF9lLT5zaXplKCkpOyAiOwogICAgICAgICBpZiAoIWZpZWxkLnZhbHVlLnR5cGUuZW51bV9kZWYgJiYgIUlzQm9vbChmaWVsZC52YWx1ZS50eXBlLmVsZW1lbnQpICYmCiAgICAgICAgICAgICBJc09uZUJ5dGUoZmllbGQudmFsdWUudHlwZS5lbGVtZW50KSkgewogICAgICAgICAgIC8vIEZvciB2ZWN0b3JzIG9mIGJ5dGVzLCBzdGQ6OmNvcHkgaXMgdXNlZCB0byBpbXByb3ZlIHBlcmZvcm1hbmNlLgpAQCAtMzAwMCw3ICszMDcxLDcgQEAKICAgICAgICAgICAgIC8vICAgICgqcmVzb2x2ZXIpKCZfby0+ZmllbGQsIChoYXNoX3ZhbHVlX3QpKF9lKSk7CiAgICAgICAgICAgICAvLyAgZWxzZQogICAgICAgICAgICAgLy8gICAgX28tPmZpZWxkID0gbnVsbHB0cjsKLSAgICAgICAgICAgIGNvZGUgKz0gIi8vdmVjdG9yIHJlc29sdmVyLCAiICsgUHRyVHlwZSgmZmllbGQpICsgIlxuIjsKKyAgICAgICAgICAgIGNvZGUgKz0gIi8qdmVjdG9yIHJlc29sdmVyLCAiICsgUHRyVHlwZSgmZmllbGQpICsgIiovICI7CiAgICAgICAgICAgICBjb2RlICs9ICJpZiAoX3Jlc29sdmVyKSAiOwogICAgICAgICAgICAgY29kZSArPSAiKCpfcmVzb2x2ZXIpIjsKICAgICAgICAgICAgIGNvZGUgKz0gIihyZWludGVycHJldF9jYXN0PHZvaWQgKio+KCZfby0+IiArIG5hbWUgKyAiW19pXSIgKwpAQCAtMzAxNyw5ICszMDg4LDcgQEAKICAgICAgICAgICAgICAgY29kZSArPSAiLyogZWxzZSBkbyBub3RoaW5nICovIjsKICAgICAgICAgICAgIH0KICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgY29uc3QgYm9vbCBpc19wb2ludGVyID0KLSAgICAgICAgICAgICAgICBmaWVsZC52YWx1ZS50eXBlLlZlY3RvclR5cGUoKS5iYXNlX3R5cGUgPT0gQkFTRV9UWVBFX1NUUlVDVCAmJgotICAgICAgICAgICAgICAgICFJc1N0cnVjdChmaWVsZC52YWx1ZS50eXBlLlZlY3RvclR5cGUoKSk7CisgICAgICAgICAgICBjb25zdCBib29sIGlzX3BvaW50ZXIgPSBJc1ZlY3Rvck9mUG9pbnRlcnMoZmllbGQpOwogICAgICAgICAgICAgaWYgKGlzX3BvaW50ZXIpIHsKICAgICAgICAgICAgICAgY29kZSArPSAiaWYoX28tPiIgKyBuYW1lICsgIltfaV0iICsgIikgeyAiOwogICAgICAgICAgICAgICBjb2RlICs9IGluZGV4aW5nICsgIi0+VW5QYWNrVG8oX28tPiIgKyBuYW1lICsKQEAgLTMwMzEsNyArMzEwMCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZCk7CiAgICAgICAgICAgICBpZiAoaXNfcG9pbnRlcikgeyBjb2RlICs9ICI7IH0iOyB9CiAgICAgICAgICAgfQotICAgICAgICAgIGNvZGUgKz0gIjsgfSB9IjsKKyAgICAgICAgICBjb2RlICs9ICI7IH0gfSBlbHNlIHsgIiArIHZlY3Rvcl9maWVsZCArICIucmVzaXplKDApOyB9IjsKICAgICAgICAgfQogICAgICAgICBicmVhazsKICAgICAgIH0KQEAgLTMwNTksNyArMzEyOCw3IEBACiAgICAgICAgICAgLy8gICAgKCpyZXNvbHZlcikoJl9vLT5maWVsZCwgKGhhc2hfdmFsdWVfdCkoX2UpKTsKICAgICAgICAgICAvLyAgZWxzZQogICAgICAgICAgIC8vICAgIF9vLT5maWVsZCA9IG51bGxwdHI7Ci0gICAgICAgICAgY29kZSArPSAiLy9zY2FsYXIgcmVzb2x2ZXIsICIgKyBQdHJUeXBlKCZmaWVsZCkgKyAiIFxuIjsKKyAgICAgICAgICBjb2RlICs9ICIvKnNjYWxhciByZXNvbHZlciwgIiArIFB0clR5cGUoJmZpZWxkKSArICIqLyAiOwogICAgICAgICAgIGNvZGUgKz0gImlmIChfcmVzb2x2ZXIpICI7CiAgICAgICAgICAgY29kZSArPSAiKCpfcmVzb2x2ZXIpIjsKICAgICAgICAgICBjb2RlICs9ICIocmVpbnRlcnByZXRfY2FzdDx2b2lkICoqPigmX28tPiIgKyBOYW1lKGZpZWxkKSArICIpLCAiOwpAQCAtMzA3NiwxNyArMzE0NSwyMSBAQAogICAgICAgICB9IGVsc2UgewogICAgICAgICAgIC8vIEdlbmVyYXRlIGNvZGUgZm9yIGFzc2lnbmluZyB0aGUgdmFsdWUsIG9mIHRoZSBmb3JtOgogICAgICAgICAgIC8vICBfby0+ZmllbGQgPSB2YWx1ZTsKLSAgICAgICAgICBjb25zdCBib29sIGlzX3BvaW50ZXIgPQotICAgICAgICAgICAgICBmaWVsZC52YWx1ZS50eXBlLmJhc2VfdHlwZSA9PSBCQVNFX1RZUEVfU1RSVUNUICYmCi0gICAgICAgICAgICAgICFJc1N0cnVjdChmaWVsZC52YWx1ZS50eXBlKTsKKyAgICAgICAgICBjb25zdCBib29sIGlzX3BvaW50ZXIgPSBJc1BvaW50ZXIoZmllbGQpOworCisgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgb3V0X2ZpZWxkID0gIl9vLT4iICsgTmFtZShmaWVsZCk7CisKICAgICAgICAgICBpZiAoaXNfcG9pbnRlcikgewotICAgICAgICAgICAgY29kZSArPSAieyBpZihfby0+IiArIE5hbWUoZmllbGQpICsgIikgeyAiOwotICAgICAgICAgICAgY29kZSArPSAiX2UtPlVuUGFja1RvKF9vLT4iICsgTmFtZShmaWVsZCkgKyAiLmdldCgpLCBfcmVzb2x2ZXIpOyI7CisgICAgICAgICAgICBjb2RlICs9ICJ7IGlmKCIgKyBvdXRfZmllbGQgKyAiKSB7ICI7CisgICAgICAgICAgICBjb2RlICs9ICJfZS0+VW5QYWNrVG8oIiArIG91dF9maWVsZCArICIuZ2V0KCksIF9yZXNvbHZlcik7IjsKICAgICAgICAgICAgIGNvZGUgKz0gIiB9IGVsc2UgeyAiOwogICAgICAgICAgIH0KLSAgICAgICAgICBjb2RlICs9ICJfby0+IiArIE5hbWUoZmllbGQpICsgIiA9ICI7CisgICAgICAgICAgY29kZSArPSBvdXRfZmllbGQgKyAiID0gIjsKICAgICAgICAgICBjb2RlICs9IEdlblVucGFja1ZhbChmaWVsZC52YWx1ZS50eXBlLCAiX2UiLCBmYWxzZSwgZmllbGQpICsgIjsiOwotICAgICAgICAgIGlmIChpc19wb2ludGVyKSB7IGNvZGUgKz0gIiB9IH0iOyB9CisgICAgICAgICAgaWYgKGlzX3BvaW50ZXIpIHsKKyAgICAgICAgICAgIGNvZGUgKz0gIiB9IH0gZWxzZSBpZiAoIiArIG91dF9maWVsZCArICIpIHsgIiArIG91dF9maWVsZCArCisgICAgICAgICAgICAgICAgICAgICIucmVzZXQoKTsgfSI7CisgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIGJyZWFrOwogICAgICAgfQpAQCAtMzE5Miw5ICszMjY1LDEzIEBACiAgICAgICAgICAgICAgIGNvZGUgKz0gIigiICsgdmFsdWUgKyAiLnNpemUoKSwgIjsKICAgICAgICAgICAgICAgY29kZSArPSAiW10oc2l6ZV90IGksIF9WZWN0b3JBcmdzICpfX3ZhKSB7ICI7CiAgICAgICAgICAgICAgIGNvZGUgKz0gInJldHVybiBDcmVhdGUiICsgdmVjdG9yX3R5cGUuc3RydWN0X2RlZi0+bmFtZTsKLSAgICAgICAgICAgICAgY29kZSArPSAiKCpfX3ZhLT5fX2ZiYiwgX192YS0+XyIgKyB2YWx1ZSArICJbaV0iICsKLSAgICAgICAgICAgICAgICAgICAgICBHZW5QdHJHZXQoZmllbGQpICsgIiwgIjsKLSAgICAgICAgICAgICAgY29kZSArPSAiX192YS0+X19yZWhhc2hlcik7IH0sICZfdmEgKSI7CisgICAgICAgICAgICAgIGNvZGUgKz0gIigqX192YS0+X19mYmIsICI7CisgICAgICAgICAgICAgIGlmIChmaWVsZC5uYXRpdmVfaW5saW5lKSB7CisgICAgICAgICAgICAgICAgY29kZSArPSAiJihfX3ZhLT5fIiArIHZhbHVlICsgIltpXSkiOworICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGNvZGUgKz0gIl9fdmEtPl8iICsgdmFsdWUgKyAiW2ldIiArIEdlblB0ckdldChmaWVsZCk7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgY29kZSArPSAiLCBfX3ZhLT5fX3JlaGFzaGVyKTsgfSwgJl92YSApIjsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgIH0KQEAgLTMyNTMsNyArMzMzMCw4IEBACiAgICAgICAgIC8vIElmIHNldF9lbXB0eV92ZWN0b3JzX3RvX251bGwgb3B0aW9uIGlzIGVuYWJsZWQsIGZvciBvcHRpb25hbCBmaWVsZHMsCiAgICAgICAgIC8vIGNoZWNrIHRvIHNlZSBpZiB0aGVyZSBhY3R1YWxseSBpcyBhbnkgZGF0YSBpbiBfby0+ZmllbGQgYmVmb3JlCiAgICAgICAgIC8vIGF0dGVtcHRpbmcgdG8gYWNjZXNzIGl0LgotICAgICAgICBpZiAob3B0c18uc2V0X2VtcHR5X3ZlY3RvcnNfdG9fbnVsbCAmJiAhZmllbGQuSXNSZXF1aXJlZCgpKSB7CisgICAgICAgIGlmIChmaWVsZC5hdHRyaWJ1dGVzLkxvb2t1cCgibmVzdGVkX2ZsYXRidWZmZXIiKSB8fAorICAgICAgICAgICAgKG9wdHNfLnNldF9lbXB0eV92ZWN0b3JzX3RvX251bGwgJiYgIWZpZWxkLklzUmVxdWlyZWQoKSkpIHsKICAgICAgICAgICBjb2RlID0gdmFsdWUgKyAiLnNpemUoKSA/ICIgKyBjb2RlICsgIiA6IDAiOwogICAgICAgICB9CiAgICAgICAgIGJyZWFrOwpAQCAtMzI3NiwxNCArMzM1NCwxNSBAQAogICAgICAgICAgIH0gZWxzZSBpZiAoZmllbGQubmF0aXZlX2lubGluZSkgewogICAgICAgICAgICAgY29kZSArPSAiJiIgKyB2YWx1ZTsKICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgY29kZSArPSB2YWx1ZSArICIgPyAiICsgdmFsdWUgKyBHZW5QdHJHZXQoZmllbGQpICsgIiA6IDAiOworICAgICAgICAgICAgY29kZSArPSB2YWx1ZSArICIgPyAiICsgdmFsdWUgKyBHZW5QdHJHZXQoZmllbGQpICsgIiA6IG51bGxwdHIiOwogICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAvLyBfby0+ZmllbGQgPyBDcmVhdGVUKF9mYmIsIF9vLT5maWVsZC5nZXQoKSwgX3JlaGFzaGVyKTsKICAgICAgICAgICBjb25zdCBhdXRvIHR5cGUgPSBmaWVsZC52YWx1ZS50eXBlLnN0cnVjdF9kZWYtPm5hbWU7CiAgICAgICAgICAgY29kZSArPSB2YWx1ZSArICIgPyBDcmVhdGUiICsgdHlwZTsKLSAgICAgICAgICBjb2RlICs9ICIoX2ZiYiwgIiArIHZhbHVlICsgR2VuUHRyR2V0KGZpZWxkKSArICIsIF9yZWhhc2hlcikiOwotICAgICAgICAgIGNvZGUgKz0gIiA6IDAiOworICAgICAgICAgIGNvZGUgKz0gIihfZmJiLCAiICsgdmFsdWU7CisgICAgICAgICAgaWYgKCFmaWVsZC5uYXRpdmVfaW5saW5lKSBjb2RlICs9IEdlblB0ckdldChmaWVsZCk7CisgICAgICAgICAgY29kZSArPSAiLCBfcmVoYXNoZXIpIDogMCI7CiAgICAgICAgIH0KICAgICAgICAgYnJlYWs7CiAgICAgICB9CkBAIC0zNDYwLDcgKzM1MzksNyBAQAogICAgIGZvciAoYXV0byBpdCA9IHN0cnVjdF9kZWYuZmllbGRzLnZlYy5iZWdpbigpOwogICAgICAgICAgaXQgIT0gc3RydWN0X2RlZi5maWVsZHMudmVjLmVuZCgpOyArK2l0KSB7CiAgICAgICBjb25zdCBhdXRvIGZpZWxkID0gKml0OwotICAgICAgY29uc3QgYXV0byBmaWVsZF9uYW1lID0gZmllbGQtPm5hbWUgKyAiXyI7CisgICAgICBjb25zdCBhdXRvIGZpZWxkX25hbWUgPSBOYW1lKCpmaWVsZCkgKyAiXyI7CiAKICAgICAgIGlmIChmaXJzdF9pbl9pbml0X2xpc3QpIHsKICAgICAgICAgZmlyc3RfaW5faW5pdF9saXN0ID0gZmFsc2U7CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy9zcmMvaWRsX2dlbl9jc2hhcnAuY3BwIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvc3JjL2lkbF9nZW5fY3NoYXJwLmNwcAppbmRleCBjYjYwNWRlLi5mYTY3ZWFmIDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy9zcmMvaWRsX2dlbl9jc2hhcnAuY3BwCisrKyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3NyYy9pZGxfZ2VuX2NzaGFycC5jcHAKQEAgLTIyNiw3ICsyMjYsNyBAQAogICAgIGlmIChuZWVkc19pbmNsdWRlcykgewogICAgICAgY29kZSArPSAidXNpbmcgZ2xvYmFsOjpTeXN0ZW07XG4iOwogICAgICAgY29kZSArPSAidXNpbmcgZ2xvYmFsOjpTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYztcbiI7Ci0gICAgICBjb2RlICs9ICJ1c2luZyBnbG9iYWw6OkZsYXRCdWZmZXJzO1xuXG4iOworICAgICAgY29kZSArPSAidXNpbmcgZ2xvYmFsOjpHb29nbGUuRmxhdEJ1ZmZlcnM7XG5cbiI7CiAgICAgfQogICAgIGNvZGUgKz0gY2xhc3Njb2RlOwogICAgIGlmICghbmFtZXNwYWNlX25hbWUuZW1wdHkoKSkgeyBjb2RlICs9ICJcbn1cbiI7IH0KQEAgLTQ1OSwyMCArNDU5LDI0IEBACiAgICAgfQogICB9CiAKKyAgc3RkOjpzdHJpbmcgR2V0T2JqZWN0Q29uc3RydWN0b3IoZmxhdGJ1ZmZlcnM6OlN0cnVjdERlZiAmc3RydWN0X2RlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgJmRhdGFfYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyAmb2Zmc2V0KSBjb25zdCB7CisgICAgLy8gVXNlIHRoZSBnZW5lcmF0ZWQgdHlwZSBkaXJlY3RseSwgdG8gcHJvcGVybHkgaGFuZGxlIGRlZmF1bHQgdmFsdWVzIHRoYXQKKyAgICAvLyBtaWdodCBub3QgYmUgd3JpdHRlbiB0byB0aGUgYnVmZmVyLgorICAgIHJldHVybiAibmV3ICIgKyBOYW1lKHN0cnVjdF9kZWYpICsgIigpLl9fYXNzaWduKCIgKyBvZmZzZXQgKyAiLCAiICsKKyAgICAgICAgICAgZGF0YV9idWZmZXIgKyAiKSI7CisgIH0KKwogICAvLyBSZXR1cm5zIHRoZSBmdW5jdGlvbiBuYW1lIHRoYXQgaXMgYWJsZSB0byByZWFkIGEgdmFsdWUgb2YgdGhlIGdpdmVuIHR5cGUuCi0gIHN0ZDo6c3RyaW5nIEdlbkdldHRlckZvckxvb2t1cEJ5S2V5KGZsYXRidWZmZXJzOjpGaWVsZERlZiAqa2V5X2ZpZWxkLAorICBzdGQ6OnN0cmluZyBHZW5HZXR0ZXJGb3JMb29rdXBCeUtleShmbGF0YnVmZmVyczo6U3RydWN0RGVmICZzdHJ1Y3RfZGVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGF0YnVmZmVyczo6RmllbGREZWYgKmtleV9maWVsZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgJmRhdGFfYnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpudW0gPSBudWxscHRyKSBjb25zdCB7Ci0gICAgYXV0byB0eXBlID0ga2V5X2ZpZWxkLT52YWx1ZS50eXBlOwotICAgIGF1dG8gZGVzdF9tYXNrID0gIiI7Ci0gICAgYXV0byBkZXN0X2Nhc3QgPSBEZXN0aW5hdGlvbkNhc3QodHlwZSk7Ci0gICAgYXV0byBnZXR0ZXIgPSBkYXRhX2J1ZmZlciArICIuR2V0IjsKLSAgICBpZiAoR2VuVHlwZUJhc2ljKHR5cGUsIGZhbHNlKSAhPSAiYnl0ZSIpIHsKLSAgICAgIGdldHRlciArPSBDb252ZXJ0Q2FzZShHZW5UeXBlQmFzaWModHlwZSwgZmFsc2UpLCBDYXNlOjprVXBwZXJDYW1lbCk7Ci0gICAgfQotICAgIGdldHRlciA9IGRlc3RfY2FzdCArIGdldHRlciArICIoIiArIEdlbk9mZnNldEdldHRlcihrZXlfZmllbGQsIG51bSkgKyAiKSIgKwotICAgICAgICAgICAgIGRlc3RfbWFzazsKLSAgICByZXR1cm4gZ2V0dGVyOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyAmb2Zmc2V0KSBjb25zdCB7CisgICAgLy8gVXNlIHRoZSBnZW5lcmF0ZWQgdHlwZSBkaXJlY3RseSwgdG8gcHJvcGVybHkgaGFuZGxlIGRlZmF1bHQgdmFsdWVzIHRoYXQKKyAgICAvLyBtaWdodCBub3QgYmUgd3JpdHRlbiB0byB0aGUgYnVmZmVyLgorICAgIHJldHVybiBHZXRPYmplY3RDb25zdHJ1Y3RvcihzdHJ1Y3RfZGVmLCBkYXRhX2J1ZmZlciwgb2Zmc2V0KSArICIuIiArCisgICAgICAgICAgIE5hbWUoKmtleV9maWVsZCk7CiAgIH0KIAogICAvLyBEaXJlY3QgbXV0YXRpb24gaXMgb25seSBhbGxvd2VkIGZvciBzY2FsYXIgZmllbGRzLgpAQCAtNjA1LDM3ICs2MDksMTUgQEAKICAgICByZXR1cm4ga2V5X29mZnNldDsKICAgfQogCi0gIHN0ZDo6c3RyaW5nIEdlbkxvb2t1cEtleUdldHRlcihmbGF0YnVmZmVyczo6RmllbGREZWYgKmtleV9maWVsZCkgY29uc3QgewotICAgIHN0ZDo6c3RyaW5nIGtleV9nZXR0ZXIgPSAiICAgICAgIjsKLSAgICBrZXlfZ2V0dGVyICs9ICJpbnQgdGFibGVPZmZzZXQgPSBUYWJsZS4iOwotICAgIGtleV9nZXR0ZXIgKz0gIl9faW5kaXJlY3QodmVjdG9yTG9jYXRpb24gKyA0ICogKHN0YXJ0ICsgbWlkZGxlKSI7Ci0gICAga2V5X2dldHRlciArPSAiLCBiYik7XG4gICAgICAiOwotICAgIGlmIChJc1N0cmluZyhrZXlfZmllbGQtPnZhbHVlLnR5cGUpKSB7Ci0gICAgICBrZXlfZ2V0dGVyICs9ICJpbnQgY29tcCA9IFRhYmxlLiI7Ci0gICAgICBrZXlfZ2V0dGVyICs9ICJDb21wYXJlU3RyaW5ncygiOwotICAgICAga2V5X2dldHRlciArPSBHZW5PZmZzZXRHZXR0ZXIoa2V5X2ZpZWxkKTsKLSAgICAgIGtleV9nZXR0ZXIgKz0gIiwgYnl0ZUtleSwgYmIpO1xuIjsKLSAgICB9IGVsc2UgewotICAgICAgYXV0byBnZXRfdmFsID0gR2VuR2V0dGVyRm9yTG9va3VwQnlLZXkoa2V5X2ZpZWxkLCAiYmIiKTsKLSAgICAgIGtleV9nZXR0ZXIgKz0gImludCBjb21wID0gIiArIGdldF92YWwgKyAiLkNvbXBhcmVUbyhrZXkpO1xuIjsKLSAgICB9Ci0gICAgcmV0dXJuIGtleV9nZXR0ZXI7Ci0gIH0KLQotICBzdGQ6OnN0cmluZyBHZW5LZXlHZXR0ZXIoZmxhdGJ1ZmZlcnM6OkZpZWxkRGVmICprZXlfZmllbGQpIGNvbnN0IHsKLSAgICBzdGQ6OnN0cmluZyBrZXlfZ2V0dGVyID0gIiI7Ci0gICAgYXV0byBkYXRhX2J1ZmZlciA9ICJidWlsZGVyLkRhdGFCdWZmZXIiOwotICAgIGlmIChJc1N0cmluZyhrZXlfZmllbGQtPnZhbHVlLnR5cGUpKSB7Ci0gICAgICBrZXlfZ2V0dGVyICs9ICJUYWJsZS5Db21wYXJlU3RyaW5ncygiOwotICAgICAga2V5X2dldHRlciArPSBHZW5PZmZzZXRHZXR0ZXIoa2V5X2ZpZWxkLCAibzEiKSArICIsICI7Ci0gICAgICBrZXlfZ2V0dGVyICs9IEdlbk9mZnNldEdldHRlcihrZXlfZmllbGQsICJvMiIpICsgIiwgIiArIGRhdGFfYnVmZmVyICsgIikiOwotICAgIH0gZWxzZSB7Ci0gICAgICBhdXRvIGZpZWxkX2dldHRlciA9IEdlbkdldHRlckZvckxvb2t1cEJ5S2V5KGtleV9maWVsZCwgZGF0YV9idWZmZXIsICJvMSIpOwotICAgICAga2V5X2dldHRlciArPSBmaWVsZF9nZXR0ZXI7Ci0gICAgICBmaWVsZF9nZXR0ZXIgPSBHZW5HZXR0ZXJGb3JMb29rdXBCeUtleShrZXlfZmllbGQsIGRhdGFfYnVmZmVyLCAibzIiKTsKLSAgICAgIGtleV9nZXR0ZXIgKz0gIi5Db21wYXJlVG8oIiArIGZpZWxkX2dldHRlciArICIpIjsKLSAgICB9Ci0gICAgcmV0dXJuIGtleV9nZXR0ZXI7CisgIHN0ZDo6c3RyaW5nIEdlbktleUdldHRlcihmbGF0YnVmZmVyczo6U3RydWN0RGVmICZzdHJ1Y3RfZGVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhdGJ1ZmZlcnM6OkZpZWxkRGVmICprZXlfZmllbGQpIGNvbnN0IHsKKyAgICAvLyBHZXQgdGhlIGdldHRlciBmb3IgdGhlIGtleSBvZiB0aGUgc3RydWN0LgorICAgIHJldHVybiBHZW5HZXR0ZXJGb3JMb29rdXBCeUtleShzdHJ1Y3RfZGVmLCBrZXlfZmllbGQsICJidWlsZGVyLkRhdGFCdWZmZXIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYnVpbGRlci5EYXRhQnVmZmVyLkxlbmd0aCAtIG8xLlZhbHVlIikgKworICAgICAgICAgICAiLkNvbXBhcmVUbygiICsKKyAgICAgICAgICAgR2VuR2V0dGVyRm9yTG9va3VwQnlLZXkoc3RydWN0X2RlZiwga2V5X2ZpZWxkLCAiYnVpbGRlci5EYXRhQnVmZmVyIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImJ1aWxkZXIuRGF0YUJ1ZmZlci5MZW5ndGggLSBvMi5WYWx1ZSIpICsKKyAgICAgICAgICAgIikiOwogICB9CiAKICAgdm9pZCBHZW5TdHJ1Y3QoU3RydWN0RGVmICZzdHJ1Y3RfZGVmLCBzdGQ6OnN0cmluZyAqY29kZV9wdHIsCkBAIC02NjksMTEgKzY1MSwxMSBAQAogICAgIGNvZGUgKz0gIiAgcHVibGljIEJ5dGVCdWZmZXIgQnl0ZUJ1ZmZlciB7IGdldCB7IHJldHVybiBfX3AuYmI7IH0gfVxuIjsKIAogICAgIGlmICghc3RydWN0X2RlZi5maXhlZCkgewotICAgICAgLy8gR2VuZXJhdGUgdmVyc29uIGNoZWNrIG1ldGhvZC4KKyAgICAgIC8vIEdlbmVyYXRlIHZlcnNpb24gY2hlY2sgbWV0aG9kLgogICAgICAgLy8gRm9yY2UgY29tcGlsZSB0aW1lIGVycm9yIGlmIG5vdCB1c2luZyB0aGUgc2FtZSB2ZXJzaW9uIHJ1bnRpbWUuCiAgICAgICBjb2RlICs9ICIgIHB1YmxpYyBzdGF0aWMgdm9pZCBWYWxpZGF0ZVZlcnNpb24oKSB7IjsKICAgICAgIGNvZGUgKz0gIiBGbGF0QnVmZmVyQ29uc3RhbnRzLiI7Ci0gICAgICBjb2RlICs9ICJGTEFUQlVGRkVSU18yXzBfMCgpOyAiOworICAgICAgY29kZSArPSAiRkxBVEJVRkZFUlNfMl8wXzgoKTsgIjsKICAgICAgIGNvZGUgKz0gIn1cbiI7CiAKICAgICAgIC8vIEdlbmVyYXRlIGEgc3BlY2lhbCBhY2Nlc3NvciBmb3IgdGhlIHRhYmxlIHRoYXQgd2hlbiB1c2VkIGFzIHRoZSByb290CkBAIC05MTQsNyArODk2LDkgQEAKICAgICAgIGNvZGUgKz0gbWVtYmVyX3N1ZmZpeDsKICAgICAgIGNvZGUgKz0gIn1cbiI7CiAgICAgICBpZiAoSXNWZWN0b3IoZmllbGQudmFsdWUudHlwZSkpIHsKLSAgICAgICAgY29kZSArPSAiICBwdWJsaWMgaW50ICIgKyBOYW1lKGZpZWxkKTsKKyAgICAgICAgYXV0byBjYW1lbF9uYW1lID0gTmFtZShmaWVsZCk7CisgICAgICAgIGlmIChjYW1lbF9uYW1lID09IHN0cnVjdF9kZWYubmFtZSkgeyBjYW1lbF9uYW1lICs9ICJfIjsgfQorICAgICAgICBjb2RlICs9ICIgIHB1YmxpYyBpbnQgIiArIGNhbWVsX25hbWU7CiAgICAgICAgIGNvZGUgKz0gIkxlbmd0aCI7CiAgICAgICAgIGNvZGUgKz0gIiB7IGdldCI7CiAgICAgICAgIGNvZGUgKz0gb2Zmc2V0X3ByZWZpeDsKQEAgLTEyMzgsNiArMTIyMiw4IEBACiAgICAgICAgICAgICBjb2RlICs9ICIpOyByZXR1cm4gIjsKICAgICAgICAgICAgIGNvZGUgKz0gImJ1aWxkZXIuRW5kVmVjdG9yKCk7IH1cbiI7CiAKKyAgICAgICAgICAgIC8vIGFkZCBDcmVhdGUuLi5WZWN0b3JCbG9jaygpIG92ZXJsb2FkcyBmb3IgVFtdLCBBcnJheVNlZ21lbnQ8VD4gYW5kCisgICAgICAgICAgICAvLyBJbnRQdHIKICAgICAgICAgICAgIGNvZGUgKz0gIiAgcHVibGljIHN0YXRpYyBWZWN0b3JPZmZzZXQgIjsKICAgICAgICAgICAgIGNvZGUgKz0gIkNyZWF0ZSI7CiAgICAgICAgICAgICBjb2RlICs9IE5hbWUoZmllbGQpOwpAQCAtMTI0OCw2ICsxMjM0LDI2IEBACiAgICAgICAgICAgICBjb2RlICs9ICIsIGRhdGEuTGVuZ3RoLCAiOwogICAgICAgICAgICAgY29kZSArPSBOdW1Ub1N0cmluZyhhbGlnbm1lbnQpOwogICAgICAgICAgICAgY29kZSArPSAiKTsgYnVpbGRlci5BZGQoZGF0YSk7IHJldHVybiBidWlsZGVyLkVuZFZlY3RvcigpOyB9XG4iOworCisgICAgICAgICAgICBjb2RlICs9ICIgIHB1YmxpYyBzdGF0aWMgVmVjdG9yT2Zmc2V0ICI7CisgICAgICAgICAgICBjb2RlICs9ICJDcmVhdGUiOworICAgICAgICAgICAgY29kZSArPSBOYW1lKGZpZWxkKTsKKyAgICAgICAgICAgIGNvZGUgKz0gIlZlY3RvckJsb2NrKEZsYXRCdWZmZXJCdWlsZGVyIGJ1aWxkZXIsICI7CisgICAgICAgICAgICBjb2RlICs9ICJBcnJheVNlZ21lbnQ8IiArIEdlblR5cGVCYXNpYyh2ZWN0b3JfdHlwZSkgKyAiPiBkYXRhKSAiOworICAgICAgICAgICAgY29kZSArPSAieyBidWlsZGVyLlN0YXJ0VmVjdG9yKCI7CisgICAgICAgICAgICBjb2RlICs9IE51bVRvU3RyaW5nKGVsZW1fc2l6ZSk7CisgICAgICAgICAgICBjb2RlICs9ICIsIGRhdGEuQ291bnQsICI7CisgICAgICAgICAgICBjb2RlICs9IE51bVRvU3RyaW5nKGFsaWdubWVudCk7CisgICAgICAgICAgICBjb2RlICs9ICIpOyBidWlsZGVyLkFkZChkYXRhKTsgcmV0dXJuIGJ1aWxkZXIuRW5kVmVjdG9yKCk7IH1cbiI7CisKKyAgICAgICAgICAgIGNvZGUgKz0gIiAgcHVibGljIHN0YXRpYyBWZWN0b3JPZmZzZXQgIjsKKyAgICAgICAgICAgIGNvZGUgKz0gIkNyZWF0ZSI7CisgICAgICAgICAgICBjb2RlICs9IE5hbWUoZmllbGQpOworICAgICAgICAgICAgY29kZSArPSAiVmVjdG9yQmxvY2soRmxhdEJ1ZmZlckJ1aWxkZXIgYnVpbGRlciwgIjsKKyAgICAgICAgICAgIGNvZGUgKz0gIkludFB0ciBkYXRhUHRyLCBpbnQgc2l6ZUluQnl0ZXMpICI7CisgICAgICAgICAgICBjb2RlICs9ICJ7IGJ1aWxkZXIuU3RhcnRWZWN0b3IoMSwgc2l6ZUluQnl0ZXMsIDEpOyAiOworICAgICAgICAgICAgY29kZSArPSAiYnVpbGRlci5BZGQ8IiArIEdlblR5cGVCYXNpYyh2ZWN0b3JfdHlwZSkgKworICAgICAgICAgICAgICAgICAgICAiPihkYXRhUHRyLCBzaXplSW5CeXRlcyk7IHJldHVybiBidWlsZGVyLkVuZFZlY3RvcigpOyB9XG4iOwogICAgICAgICAgIH0KICAgICAgICAgICAvLyBHZW5lcmF0ZSBhIG1ldGhvZCB0byBzdGFydCBhIHZlY3RvciwgZGF0YSB0byBiZSBhZGRlZCBtYW51YWxseQogICAgICAgICAgIC8vIGFmdGVyLgpAQCAtMTMwMCw5ICsxMzA2LDEwIEBACiAgICAgICBjb2RlICs9ICIoRmxhdEJ1ZmZlckJ1aWxkZXIgYnVpbGRlciwgIjsKICAgICAgIGNvZGUgKz0gIk9mZnNldDwiICsgc3RydWN0X2RlZi5uYW1lICsgIj4iOwogICAgICAgY29kZSArPSAiW10gb2Zmc2V0cykge1xuIjsKLSAgICAgIGNvZGUgKz0gIiAgICBBcnJheS5Tb3J0KG9mZnNldHMsIChPZmZzZXQ8IiArIHN0cnVjdF9kZWYubmFtZSArCi0gICAgICAgICAgICAgICI+IG8xLCBPZmZzZXQ8IiArIHN0cnVjdF9kZWYubmFtZSArICI+IG8yKSA9PiAiICsKLSAgICAgICAgICAgICAgR2VuS2V5R2V0dGVyKGtleV9maWVsZCk7CisgICAgICBjb2RlICs9ICIgICAgQXJyYXkuU29ydChvZmZzZXRzLFxuIjsKKyAgICAgIGNvZGUgKz0gIiAgICAgIChPZmZzZXQ8IiArIHN0cnVjdF9kZWYubmFtZSArICI+IG8xLCBPZmZzZXQ8IiArCisgICAgICAgICAgICAgIHN0cnVjdF9kZWYubmFtZSArICI+IG8yKSA9PlxuIjsKKyAgICAgIGNvZGUgKz0gIiAgICAgICAgIiArIEdlbktleUdldHRlcihzdHJ1Y3RfZGVmLCBrZXlfZmllbGQpOwogICAgICAgY29kZSArPSAiKTtcbiI7CiAgICAgICBjb2RlICs9ICIgICAgcmV0dXJuIGJ1aWxkZXIuQ3JlYXRlVmVjdG9yT2ZUYWJsZXMob2Zmc2V0cyk7XG4gIH1cbiI7CiAKQEAgLTEzMTEsMTYgKzEzMTgsMjAgQEAKICAgICAgIGNvZGUgKz0gImludCB2ZWN0b3JMb2NhdGlvbiwgIjsKICAgICAgIGNvZGUgKz0gR2VuVHlwZUdldChrZXlfZmllbGQtPnZhbHVlLnR5cGUpOwogICAgICAgY29kZSArPSAiIGtleSwgQnl0ZUJ1ZmZlciBiYikge1xuIjsKLSAgICAgIGlmIChJc1N0cmluZyhrZXlfZmllbGQtPnZhbHVlLnR5cGUpKSB7Ci0gICAgICAgIGNvZGUgKz0gIiAgICBieXRlW10gYnl0ZUtleSA9ICI7Ci0gICAgICAgIGNvZGUgKz0gIlN5c3RlbS5UZXh0LkVuY29kaW5nLlVURjguR2V0Qnl0ZXMoa2V5KTtcbiI7Ci0gICAgICB9CisgICAgICBjb2RlICs9CisgICAgICAgICAgIiAgICAiICsgc3RydWN0X2RlZi5uYW1lICsgIiBvYmpfID0gbmV3ICIgKyBzdHJ1Y3RfZGVmLm5hbWUgKyAiKCk7XG4iOwogICAgICAgY29kZSArPSAiICAgIGludCBzcGFuID0gIjsKICAgICAgIGNvZGUgKz0gImJiLkdldEludCh2ZWN0b3JMb2NhdGlvbiAtIDQpO1xuIjsKICAgICAgIGNvZGUgKz0gIiAgICBpbnQgc3RhcnQgPSAwO1xuIjsKICAgICAgIGNvZGUgKz0gIiAgICB3aGlsZSAoc3BhbiAhPSAwKSB7XG4iOwogICAgICAgY29kZSArPSAiICAgICAgaW50IG1pZGRsZSA9IHNwYW4gLyAyO1xuIjsKLSAgICAgIGNvZGUgKz0gR2VuTG9va3VwS2V5R2V0dGVyKGtleV9maWVsZCk7CisgICAgICBjb2RlICs9CisgICAgICAgICAgIiAgICAgIGludCB0YWJsZU9mZnNldCA9IFRhYmxlLl9faW5kaXJlY3QodmVjdG9yTG9jYXRpb24gKyA0ICogIgorICAgICAgICAgICIoc3RhcnQgKyBtaWRkbGUpLCBiYik7XG4iOworCisgICAgICBjb2RlICs9ICIgICAgICBvYmpfLl9fYXNzaWduKHRhYmxlT2Zmc2V0LCBiYik7XG4iOworICAgICAgY29kZSArPQorICAgICAgICAgICIgICAgICBpbnQgY29tcCA9IG9ial8uIiArIE5hbWUoKmtleV9maWVsZCkgKyAiLkNvbXBhcmVUbyhrZXkpO1xuIjsKICAgICAgIGNvZGUgKz0gIiAgICAgIGlmIChjb21wID4gMCkge1xuIjsKICAgICAgIGNvZGUgKz0gIiAgICAgICAgc3BhbiA9IG1pZGRsZTtcbiI7CiAgICAgICBjb2RlICs9ICIgICAgICB9IGVsc2UgaWYgKGNvbXAgPCAwKSB7XG4iOwpAQCAtMTMyOCw5ICsxMzM5LDcgQEAKICAgICAgIGNvZGUgKz0gIiAgICAgICAgc3RhcnQgKz0gbWlkZGxlO1xuIjsKICAgICAgIGNvZGUgKz0gIiAgICAgICAgc3BhbiAtPSBtaWRkbGU7XG4iOwogICAgICAgY29kZSArPSAiICAgICAgfSBlbHNlIHtcbiI7Ci0gICAgICBjb2RlICs9ICIgICAgICAgIHJldHVybiAiOwotICAgICAgY29kZSArPSAibmV3ICIgKyBzdHJ1Y3RfZGVmLm5hbWUgKyAiKCkiOwotICAgICAgY29kZSArPSAiLl9fYXNzaWduKHRhYmxlT2Zmc2V0LCBiYik7XG4iOworICAgICAgY29kZSArPSAiICAgICAgICByZXR1cm4gb2JqXztcbiI7CiAgICAgICBjb2RlICs9ICIgICAgICB9XG4gICAgfVxuIjsKICAgICAgIGNvZGUgKz0gIiAgICByZXR1cm4gbnVsbDtcbiI7CiAgICAgICBjb2RlICs9ICIgIH1cbiI7CkBAIC0xNDU0LDggKzE0NjMsMTAgQEAKICAgICB9CiAgICAgY29kZSArPSAiXG4iOwogICAgIC8vIFBhY2soKQotICAgIGNvZGUgKz0gIiAgcHVibGljIHN0YXRpYyBpbnQgUGFjayhGbGF0QnVmZmVycy5GbGF0QnVmZmVyQnVpbGRlciBidWlsZGVyLCAiICsKLSAgICAgICAgICAgIHVuaW9uX25hbWUgKyAiIF9vKSB7XG4iOworICAgIGNvZGUgKz0KKyAgICAgICAgIiAgcHVibGljIHN0YXRpYyBpbnQgUGFjayhHb29nbGUuRmxhdEJ1ZmZlcnMuRmxhdEJ1ZmZlckJ1aWxkZXIgIgorICAgICAgICAiYnVpbGRlciwgIiArCisgICAgICAgIHVuaW9uX25hbWUgKyAiIF9vKSB7XG4iOwogICAgIGNvZGUgKz0gIiAgICBzd2l0Y2ggKF9vLlR5cGUpIHtcbiI7CiAgICAgZm9yIChhdXRvIGl0ID0gZW51bV9kZWYuVmFscygpLmJlZ2luKCk7IGl0ICE9IGVudW1fZGVmLlZhbHMoKS5lbmQoKTsgKytpdCkgewogICAgICAgYXV0byAmZXYgPSAqKml0OwpAQCAtMTU2Niw2ICsxNTc3LDcgQEAKIAogICB2b2lkIEdlblVuaW9uVW5QYWNrX09iamVjdEFQSShjb25zdCBFbnVtRGVmICZlbnVtX2RlZiwgc3RkOjpzdHJpbmcgKmNvZGVfcHRyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyAmY2FtZWxfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgJmNhbWVsX25hbWVfc2hvcnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfdmVjdG9yKSBjb25zdCB7CiAgICAgYXV0byAmY29kZSA9ICpjb2RlX3B0cjsKICAgICBzdGQ6OnN0cmluZyB2YXJpYWxiZV9uYW1lID0gIl9vLiIgKyBjYW1lbF9uYW1lOwpAQCAtMTU4NCwxMCArMTU5NiwxMCBAQAogICAgICAgY29kZSArPSBpbmRlbnQgKyB2YXJpYWxiZV9uYW1lICsgIiA9IG5ldyAiOwogICAgIH0KICAgICBjb2RlICs9IE5hbWVzcGFjZWROYW1lKGVudW1fZGVmKSArICJVbmlvbigpO1xuIjsKLSAgICBjb2RlICs9IGluZGVudCArIHZhcmlhbGJlX25hbWUgKyAiLlR5cGUgPSB0aGlzLiIgKyBjYW1lbF9uYW1lICsgIlR5cGUiICsKLSAgICAgICAgICAgIHR5cGVfc3VmZml4ICsgIjtcbiI7Ci0gICAgY29kZSArPQotICAgICAgICBpbmRlbnQgKyAic3dpdGNoICh0aGlzLiIgKyBjYW1lbF9uYW1lICsgIlR5cGUiICsgdHlwZV9zdWZmaXggKyAiKSB7XG4iOworICAgIGNvZGUgKz0gaW5kZW50ICsgdmFyaWFsYmVfbmFtZSArICIuVHlwZSA9IHRoaXMuIiArIGNhbWVsX25hbWVfc2hvcnQgKworICAgICAgICAgICAgIlR5cGUiICsgdHlwZV9zdWZmaXggKyAiO1xuIjsKKyAgICBjb2RlICs9IGluZGVudCArICJzd2l0Y2ggKHRoaXMuIiArIGNhbWVsX25hbWVfc2hvcnQgKyAiVHlwZSIgKyB0eXBlX3N1ZmZpeCArCisgICAgICAgICAgICAiKSB7XG4iOwogICAgIGZvciAoYXV0byBlaXQgPSBlbnVtX2RlZi5WYWxzKCkuYmVnaW4oKTsgZWl0ICE9IGVudW1fZGVmLlZhbHMoKS5lbmQoKTsKICAgICAgICAgICsrZWl0KSB7CiAgICAgICBhdXRvICZldiA9ICoqZWl0OwpAQCAtMTYzMyw2ICsxNjQ1LDggQEAKICAgICAgIGF1dG8gJmZpZWxkID0gKippdDsKICAgICAgIGlmIChmaWVsZC5kZXByZWNhdGVkKSBjb250aW51ZTsKICAgICAgIGF1dG8gY2FtZWxfbmFtZSA9IE5hbWUoZmllbGQpOworICAgICAgaWYgKGNhbWVsX25hbWUgPT0gc3RydWN0X2RlZi5uYW1lKSB7IGNhbWVsX25hbWUgKz0gIl8iOyB9CisgICAgICBhdXRvIGNhbWVsX25hbWVfc2hvcnQgPSBOYW1lKGZpZWxkKTsKICAgICAgIGF1dG8gc3RhcnQgPSAiICAgIF9vLiIgKyBjYW1lbF9uYW1lICsgIiA9ICI7CiAgICAgICBzd2l0Y2ggKGZpZWxkLnZhbHVlLnR5cGUuYmFzZV90eXBlKSB7CiAgICAgICAgIGNhc2UgQkFTRV9UWVBFX1NUUlVDVDogewpAQCAtMTY2Niw3ICsxNjgwLDcgQEAKICAgICAgICAgICAgIGNvZGUgKz0gIiAgICBmb3IgKHZhciBfaiA9IDA7IF9qIDwgdGhpcy4iICsgY2FtZWxfbmFtZSArCiAgICAgICAgICAgICAgICAgICAgICJMZW5ndGg7ICsrX2opIHtcbiI7CiAgICAgICAgICAgICBHZW5VbmlvblVuUGFja19PYmplY3RBUEkoKmZpZWxkLnZhbHVlLnR5cGUuZW51bV9kZWYsIGNvZGVfcHRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbWVsX25hbWUsIHRydWUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbWVsX25hbWUsIGNhbWVsX25hbWVfc2hvcnQsIHRydWUpOwogICAgICAgICAgICAgY29kZSArPSAiICAgIH1cbiI7CiAgICAgICAgICAgfSBlbHNlIGlmIChmaWVsZC52YWx1ZS50eXBlLmVsZW1lbnQgIT0gQkFTRV9UWVBFX1VUWVBFKSB7CiAgICAgICAgICAgICBhdXRvIGZpeGVkID0gZmllbGQudmFsdWUudHlwZS5zdHJ1Y3RfZGVmID09IG51bGxwdHI7CkBAIC0xNjg3LDcgKzE3MDEsNyBAQAogICAgICAgICBjYXNlIEJBU0VfVFlQRV9VVFlQRTogYnJlYWs7CiAgICAgICAgIGNhc2UgQkFTRV9UWVBFX1VOSU9OOiB7CiAgICAgICAgICAgR2VuVW5pb25VblBhY2tfT2JqZWN0QVBJKCpmaWVsZC52YWx1ZS50eXBlLmVudW1fZGVmLCBjb2RlX3B0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FtZWxfbmFtZSwgZmFsc2UpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW1lbF9uYW1lLCBjYW1lbF9uYW1lX3Nob3J0LCBmYWxzZSk7CiAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KICAgICAgICAgZGVmYXVsdDogewpAQCAtMTcwNyw2ICsxNzIxLDggQEAKICAgICAgIGF1dG8gJmZpZWxkID0gKippdDsKICAgICAgIGlmIChmaWVsZC5kZXByZWNhdGVkKSBjb250aW51ZTsKICAgICAgIGF1dG8gY2FtZWxfbmFtZSA9IE5hbWUoZmllbGQpOworICAgICAgaWYgKGNhbWVsX25hbWUgPT0gc3RydWN0X2RlZi5uYW1lKSB7IGNhbWVsX25hbWUgKz0gIl8iOyB9CisgICAgICBhdXRvIGNhbWVsX25hbWVfc2hvcnQgPSBOYW1lKGZpZWxkKTsKICAgICAgIC8vIHByZQogICAgICAgc3dpdGNoIChmaWVsZC52YWx1ZS50eXBlLmJhc2VfdHlwZSkgewogICAgICAgICBjYXNlIEJBU0VfVFlQRV9TVFJVQ1Q6IHsKQEAgLTE3ODIsNyArMTc5OCw3IEBACiAgICAgICAgICAgICAgIGNvZGUgKz0gIiAgICAgIHZhciAiICsgYXJyYXlfbmFtZSArICIgPSBfby4iICsgcHJvcGVydHlfbmFtZSArCiAgICAgICAgICAgICAgICAgICAgICAgIi5Ub0FycmF5KCk7XG4iOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgY29kZSArPSAiICAgICAgXyIgKyBmaWVsZC5uYW1lICsgIiA9IENyZWF0ZSIgKyBjYW1lbF9uYW1lICsKKyAgICAgICAgICAgIGNvZGUgKz0gIiAgICAgIF8iICsgZmllbGQubmFtZSArICIgPSBDcmVhdGUiICsgY2FtZWxfbmFtZV9zaG9ydCArCiAgICAgICAgICAgICAgICAgICAgICJWZWN0b3IoYnVpbGRlciwgIiArIGFycmF5X25hbWUgKyAiKTtcbiI7CiAgICAgICAgICAgICBjb2RlICs9ICIgICAgfVxuIjsKICAgICAgICAgICB9IGVsc2UgewpAQCAtMTc5NCw3ICsxODEwLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FtZWxfbmFtZSArICJbX2pdKTsiOwogICAgICAgICAgICAgY29kZSArPSAiICAgIHZhciBfIiArIGZpZWxkLm5hbWUgKyAiID0gZGVmYXVsdChWZWN0b3JPZmZzZXQpO1xuIjsKICAgICAgICAgICAgIGNvZGUgKz0gIiAgICBpZiAoX28uIiArIGNhbWVsX25hbWUgKyAiICE9IG51bGwpIHtcbiI7Ci0gICAgICAgICAgICBjb2RlICs9ICIgICAgICBTdGFydCIgKyBjYW1lbF9uYW1lICsgIlZlY3RvcihidWlsZGVyLCBfby4iICsKKyAgICAgICAgICAgIGNvZGUgKz0gIiAgICAgIFN0YXJ0IiArIGNhbWVsX25hbWVfc2hvcnQgKyAiVmVjdG9yKGJ1aWxkZXIsIF9vLiIgKwogICAgICAgICAgICAgICAgICAgICBjYW1lbF9uYW1lICsgIi5Db3VudCk7XG4iOwogICAgICAgICAgICAgY29kZSArPSAiICAgICAgZm9yICh2YXIgX2ogPSBfby4iICsgY2FtZWxfbmFtZSArCiAgICAgICAgICAgICAgICAgICAgICIuQ291bnQgLSAxOyBfaiA+PSAwOyAtLV9qKSB7ICIgKyBwYWNrX21ldGhvZCArICIgfVxuIjsKQEAgLTE4NDAsNiArMTg1Niw3IEBACiAgICAgICAgIGF1dG8gJmZpZWxkID0gKippdDsKICAgICAgICAgaWYgKGZpZWxkLmRlcHJlY2F0ZWQpIGNvbnRpbnVlOwogICAgICAgICBhdXRvIGNhbWVsX25hbWUgPSBOYW1lKGZpZWxkKTsKKyAgICAgICAgaWYgKGNhbWVsX25hbWUgPT0gc3RydWN0X2RlZi5uYW1lKSB7IGNhbWVsX25hbWUgKz0gIl8iOyB9CiAgICAgICAgIHN3aXRjaCAoZmllbGQudmFsdWUudHlwZS5iYXNlX3R5cGUpIHsKICAgICAgICAgICBjYXNlIEJBU0VfVFlQRV9TVFJVQ1Q6IHsKICAgICAgICAgICAgIGlmIChzdHJ1Y3RfZGVmLmZpeGVkKSB7CkBAIC0yMDk0LDYgKzIxMTEsNyBAQAogICAgICAgYXV0byB0eXBlX25hbWUgPSBHZW5UeXBlR2V0X09iamVjdEFQSShmaWVsZC52YWx1ZS50eXBlLCBvcHRzKTsKICAgICAgIGlmIChmaWVsZC5Jc1NjYWxhck9wdGlvbmFsKCkpIHR5cGVfbmFtZSArPSAiPyI7CiAgICAgICBhdXRvIGNhbWVsX25hbWUgPSBOYW1lKGZpZWxkKTsKKyAgICAgIGlmIChjYW1lbF9uYW1lID09IHN0cnVjdF9kZWYubmFtZSkgeyBjYW1lbF9uYW1lICs9ICJfIjsgfQogICAgICAgaWYgKG9wdHMuY3NfZ2VuX2pzb25fc2VyaWFsaXplcikgewogICAgICAgICBpZiAoSXNVbmlvbihmaWVsZC52YWx1ZS50eXBlKSkgewogICAgICAgICAgIGF1dG8gdXR5cGVfbmFtZSA9IE5hbWVzcGFjZWROYW1lKCpmaWVsZC52YWx1ZS50eXBlLmVudW1fZGVmKTsKQEAgLTIxNTksNyArMjE3Nyw5IEBACiAgICAgICBpZiAoZmllbGQuZGVwcmVjYXRlZCkgY29udGludWU7CiAgICAgICBpZiAoZmllbGQudmFsdWUudHlwZS5iYXNlX3R5cGUgPT0gQkFTRV9UWVBFX1VUWVBFKSBjb250aW51ZTsKICAgICAgIGlmIChmaWVsZC52YWx1ZS50eXBlLmVsZW1lbnQgPT0gQkFTRV9UWVBFX1VUWVBFKSBjb250aW51ZTsKLSAgICAgIGNvZGUgKz0gIiAgICB0aGlzLiIgKyBOYW1lKGZpZWxkKSArICIgPSAiOworICAgICAgYXV0byBjYW1lbF9uYW1lID0gTmFtZShmaWVsZCk7CisgICAgICBpZiAoY2FtZWxfbmFtZSA9PSBzdHJ1Y3RfZGVmLm5hbWUpIHsgY2FtZWxfbmFtZSArPSAiXyI7IH0KKyAgICAgIGNvZGUgKz0gIiAgICB0aGlzLiIgKyBjYW1lbF9uYW1lICsgIiA9ICI7CiAgICAgICBhdXRvIHR5cGVfbmFtZSA9IEdlblR5cGVHZXRfT2JqZWN0QVBJKGZpZWxkLnZhbHVlLnR5cGUsIG9wdHMpOwogICAgICAgaWYgKElzU2NhbGFyKGZpZWxkLnZhbHVlLnR5cGUuYmFzZV90eXBlKSkgewogICAgICAgICBjb2RlICs9IEdlbkRlZmF1bHRWYWx1ZShmaWVsZCkgKyAiO1xuIjsKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3NyYy9pZGxfZ2VuX2RhcnQuY3BwIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvc3JjL2lkbF9nZW5fZGFydC5jcHAKaW5kZXggZmYyYzFhNS4uMGJmMjMwZCAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvc3JjL2lkbF9nZW5fZGFydC5jcHAKKysrIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvc3JjL2lkbF9nZW5fZGFydC5jcHAKQEAgLTIxLDI2ICsyMSw1NyBAQAogI2luY2x1ZGUgImZsYXRidWZmZXJzL2ZsYXRidWZmZXJzLmgiCiAjaW5jbHVkZSAiZmxhdGJ1ZmZlcnMvaWRsLmgiCiAjaW5jbHVkZSAiZmxhdGJ1ZmZlcnMvdXRpbC5oIgorI2luY2x1ZGUgImlkbF9uYW1lci5oIgogCiBuYW1lc3BhY2UgZmxhdGJ1ZmZlcnMgewogCiBuYW1lc3BhY2UgZGFydCB7CiAKK25hbWVzcGFjZSB7CisKK3N0YXRpYyBOYW1lcjo6Q29uZmlnIERhcnREZWZhdWx0Q29uZmlnKCkgeworICByZXR1cm4geyAvKnR5cGVzPSovQ2FzZTo6a1VwcGVyQ2FtZWwsCisgICAgICAgICAgIC8qY29uc3RhbnRzPSovQ2FzZTo6a1NjcmVhbWluZ1NuYWtlLAorICAgICAgICAgICAvKm1ldGhvZHM9Ki9DYXNlOjprTG93ZXJDYW1lbCwKKyAgICAgICAgICAgLypmdW5jdGlvbnM9Ki9DYXNlOjprVW5rbm93biwgIC8vIHVudXNlZC4KKyAgICAgICAgICAgLypmaWVsZHM9Ki9DYXNlOjprTG93ZXJDYW1lbCwKKyAgICAgICAgICAgLyp2YXJpYWJsZXM9Ki9DYXNlOjprTG93ZXJDYW1lbCwKKyAgICAgICAgICAgLyp2YXJpYW50cz0qL0Nhc2U6OmtLZWVwLAorICAgICAgICAgICAvKmVudW1fdmFyaWFudF9zZXBlcmF0b3I9Ki8iLiIsCisgICAgICAgICAgIC8qZXNjYXBlX2tleXdvcmRzPSovTmFtZXI6OkNvbmZpZzo6RXNjYXBlOjpBZnRlckNvbnZlcnRpbmdDYXNlLAorICAgICAgICAgICAvKm5hbWVzcGFjZXM9Ki9DYXNlOjprU25ha2UyLAorICAgICAgICAgICAvKm5hbWVzcGFjZV9zZXBlcmF0b3I9Ki8iLiIsCisgICAgICAgICAgIC8qb2JqZWN0X3ByZWZpeD0qLyIiLAorICAgICAgICAgICAvKm9iamVjdF9zdWZmaXg9Ki8iVCIsCisgICAgICAgICAgIC8qa2V5d29yZF9wcmVmaXg9Ki8iJCIsCisgICAgICAgICAgIC8qa2V5d29yZF9zdWZmaXg9Ki8iIiwKKyAgICAgICAgICAgLypmaWxlbmFtZXM9Ki9DYXNlOjprS2VlcCwKKyAgICAgICAgICAgLypkaXJlY3Rvcmllcz0qL0Nhc2U6OmtLZWVwLAorICAgICAgICAgICAvKm91dHB1dF9wYXRoPSovIiIsCisgICAgICAgICAgIC8qZmlsZW5hbWVfc3VmZml4PSovIl9nZW5lcmF0ZWQiLAorICAgICAgICAgICAvKmZpbGVuYW1lX2V4dGVuc2lvbj0qLyIuZGFydCIgfTsKK30KKworc3RhdGljIHN0ZDo6c2V0PHN0ZDo6c3RyaW5nPiBEYXJ0S2V5d29yZHMoKSB7CisgIC8vIHNlZSBodHRwczovL3d3dy5kYXJ0bGFuZy5vcmcvZ3VpZGVzL2xhbmd1YWdlL2xhbmd1YWdlLXRvdXIja2V5d29yZHMKKyAgLy8geWllbGQqLCBhc3luYyosIGFuZCBzeW5jKiBzaG91bGRuJ3QgYmUgcHJvYmxlCisgIHJldHVybiB7CisgICAgImFic3RyYWN0IiwgImVsc2UiLCAgICAgICAiaW1wb3J0IiwgICAgInNob3ciLCAgICAgImFzIiwgICAgICAgICJlbnVtIiwKKyAgICAiaW4iLCAgICAgICAic3RhdGljIiwgICAgICJhc3NlcnQiLCAgICAiZXhwb3J0IiwgICAiaW50ZXJmYWNlIiwgInN1cGVyIiwKKyAgICAiYXN5bmMiLCAgICAiZXh0ZW5kcyIsICAgICJpcyIsICAgICAgICAic3dpdGNoIiwgICAiYXdhaXQiLCAgICAgImV4dGVuc2lvbiIsCisgICAgImxhdGUiLCAgICAgInN5bmMiLCAgICAgICAiYnJlYWsiLCAgICAgImV4dGVybmFsIiwgImxpYnJhcnkiLCAgICJ0aGlzIiwKKyAgICAiY2FzZSIsICAgICAiZmFjdG9yeSIsICAgICJtaXhpbiIsICAgICAidGhyb3ciLCAgICAiY2F0Y2giLCAgICAgImZhbHNlIiwKKyAgICAibmV3IiwgICAgICAidHJ1ZSIsICAgICAgICJjbGFzcyIsICAgICAiZmluYWwiLCAgICAibnVsbCIsICAgICAgInRyeSIsCisgICAgImNvbnN0IiwgICAgImZpbmFsbHkiLCAgICAib24iLCAgICAgICAgInR5cGVkZWYiLCAgImNvbnRpbnVlIiwgICJmb3IiLAorICAgICJvcGVyYXRvciIsICJ2YXIiLCAgICAgICAgImNvdmFyaWFudCIsICJGdW5jdGlvbiIsICJwYXJ0IiwgICAgICAidm9pZCIsCisgICAgImRlZmF1bHQiLCAgImdldCIsICAgICAgICAicmVxdWlyZWQiLCAgIndoaWxlIiwgICAgImRlZmVycmVkIiwgICJoaWRlIiwKKyAgICAicmV0aHJvdyIsICAid2l0aCIsICAgICAgICJkbyIsICAgICAgICAiaWYiLCAgICAgICAicmV0dXJuIiwgICAgInlpZWxkIiwKKyAgICAiZHluYW1pYyIsICAiaW1wbGVtZW50cyIsICJzZXQiLAorICB9OworfQorfSAvLyBuYW1lc3BhY2UKKwogY29uc3Qgc3RkOjpzdHJpbmcgX2tGYiA9ICJmYiI7Ci0vLyBzZWUgaHR0cHM6Ly93d3cuZGFydGxhbmcub3JnL2d1aWRlcy9sYW5ndWFnZS9sYW5ndWFnZS10b3VyI2tleXdvcmRzCi0vLyB5ZWlsZCosIGFzeW5jKiwgYW5kIHN5bmMqIHNob3VsZG4ndCBiZSBwcm9ibGVtcyBhbnl3YXkgYnV0IGtlZXBpbmcgdGhlbSBpbgotc3RhdGljIGNvbnN0IGNoYXIgKmtleXdvcmRzW10gPSB7Ci0gICJhYnN0cmFjdCIsICAgImRlZmVycmVkIiwgImlmIiwgICAgICAgInN1cGVyIiwgICAiYXMiLCAgICAgICAiZG8iLAotICAiaW1wbGVtZW50cyIsICJzd2l0Y2giLCAgICJhc3NlcnQiLCAgICJkeW5hbWljIiwgImltcG9ydCIsICAgInN5bmMqIiwKLSAgImFzeW5jIiwgICAgICAiZWxzZSIsICAgICAiaW4iLCAgICAgICAidGhpcyIsICAgICJhc3luYyoiLCAgICJlbnVtIiwKLSAgImlzIiwgICAgICAgICAidGhyb3ciLCAgICAiYXdhaXQiLCAgICAiZXhwb3J0IiwgICJsaWJyYXJ5IiwgICJ0cnVlIiwKLSAgImJyZWFrIiwgICAgICAiZXh0ZXJuYWwiLCAibmV3IiwgICAgICAidHJ5IiwgICAgICJjYXNlIiwgICAgICJleHRlbmRzIiwKLSAgIm51bGwiLCAgICAgICAidHlwZWRlZiIsICAiY2F0Y2giLCAgICAiZmFjdG9yeSIsICJvcGVyYXRvciIsICJ2YXIiLAotICAiY2xhc3MiLCAgICAgICJmYWxzZSIsICAgICJwYXJ0IiwgICAgICJ2b2lkIiwgICAgImNvbnN0IiwgICAgImZpbmFsIiwKLSAgInJldGhyb3ciLCAgICAid2hpbGUiLCAgICAiY29udGludWUiLCAiZmluYWxseSIsICJyZXR1cm4iLCAgICJ3aXRoIiwKLSAgImNvdmFyaWFudCIsICAiZm9yIiwgICAgICAic2V0IiwgICAgICAieWllbGQiLCAgICJkZWZhdWx0IiwgICJnZXQiLAotICAic3RhdGljIiwgICAgICJ5aWVsZCoiCi19OwogCiAvLyBJdGVyYXRlIHRocm91Z2ggYWxsIGRlZmluaXRpb25zIHdlIGhhdmVuJ3QgZ2VuZXJhdGUgY29kZSBmb3IgKGVudW1zLCBzdHJ1Y3RzLAogLy8gYW5kIHRhYmxlcykgYW5kIG91dHB1dCB0aGVtIHRvIGEgc2luZ2xlIGZpbGUuCkBAIC01MCwxNCArODEsMTYgQEAKIAogICBEYXJ0R2VuZXJhdG9yKGNvbnN0IFBhcnNlciAmcGFyc2VyLCBjb25zdCBzdGQ6OnN0cmluZyAmcGF0aCwKICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyAmZmlsZV9uYW1lKQotICAgICAgOiBCYXNlR2VuZXJhdG9yKHBhcnNlciwgcGF0aCwgZmlsZV9uYW1lLCAiIiwgIi4iLCAiZGFydCIpIHt9CisgICAgICA6IEJhc2VHZW5lcmF0b3IocGFyc2VyLCBwYXRoLCBmaWxlX25hbWUsICIiLCAiLiIsICJkYXJ0IiksCisgICAgICAgIG5hbWVyXyhXaXRoRmxhZ09wdGlvbnMoRGFydERlZmF1bHRDb25maWcoKSwgcGFyc2VyLm9wdHMsIHBhdGgpLAorICAgICAgICAgICAgICAgRGFydEtleXdvcmRzKCkpIHt9CiAgIC8vIEl0ZXJhdGUgdGhyb3VnaCBhbGwgZGVmaW5pdGlvbnMgd2UgaGF2ZW4ndCBnZW5lcmF0ZSBjb2RlIGZvciAoZW51bXMsCiAgIC8vIHN0cnVjdHMsIGFuZCB0YWJsZXMpIGFuZCBvdXRwdXQgdGhlbSB0byBhIHNpbmdsZSBmaWxlLgogICBib29sIGdlbmVyYXRlKCkgewogICAgIHN0ZDo6c3RyaW5nIGNvZGU7CiAgICAgbmFtZXNwYWNlX2NvZGVfbWFwIG5hbWVzcGFjZV9jb2RlOwotICAgIEdlbmVyYXRlRW51bXMoJm5hbWVzcGFjZV9jb2RlKTsKLSAgICBHZW5lcmF0ZVN0cnVjdHMoJm5hbWVzcGFjZV9jb2RlKTsKKyAgICBHZW5lcmF0ZUVudW1zKG5hbWVzcGFjZV9jb2RlKTsKKyAgICBHZW5lcmF0ZVN0cnVjdHMobmFtZXNwYWNlX2NvZGUpOwogCiAgICAgZm9yIChhdXRvIGt2ID0gbmFtZXNwYWNlX2NvZGUuYmVnaW4oKTsga3YgIT0gbmFtZXNwYWNlX2NvZGUuZW5kKCk7ICsra3YpIHsKICAgICAgIGNvZGUuY2xlYXIoKTsKQEAgLTc1LDMxICsxMDgsMjMgQEAKICAgICAgIGZvciAoYXV0byBrdjIgPSBuYW1lc3BhY2VfY29kZS5iZWdpbigpOyBrdjIgIT0gbmFtZXNwYWNlX2NvZGUuZW5kKCk7CiAgICAgICAgICAgICsra3YyKSB7CiAgICAgICAgIGlmIChrdjItPmZpcnN0ICE9IGt2LT5maXJzdCkgewotICAgICAgICAgIGNvZGUgKz0KLSAgICAgICAgICAgICAgImltcG9ydCAnIiArCi0gICAgICAgICAgICAgIEdlbmVyYXRlZEZpbGVOYW1lKAotICAgICAgICAgICAgICAgICAgIi4vIiwKLSAgICAgICAgICAgICAgICAgIGZpbGVfbmFtZV8gKyAoIWt2Mi0+Zmlyc3QuZW1wdHkoKSA/ICJfIiArIGt2Mi0+Zmlyc3QgOiAiIiksCi0gICAgICAgICAgICAgICAgICBwYXJzZXJfLm9wdHMpICsKLSAgICAgICAgICAgICAgIicgYXMgIiArIEltcG9ydEFsaWFzTmFtZShrdjItPmZpcnN0KSArICI7XG4iOworICAgICAgICAgIGNvZGUgKz0gImltcG9ydCAnLi8iICsgRmlsZW5hbWUoa3YyLT5maXJzdCwgLypwYXRoPSovZmFsc2UpICsKKyAgICAgICAgICAgICAgICAgICInIGFzICIgKyBJbXBvcnRBbGlhc05hbWUoa3YyLT5maXJzdCkgKyAiO1xuIjsKICAgICAgICAgfQogICAgICAgfQogICAgICAgY29kZSArPSAiXG4iOwogICAgICAgY29kZSArPSBrdi0+c2Vjb25kOwogCi0gICAgICBpZiAoIVNhdmVGaWxlKAotICAgICAgICAgICAgICBHZW5lcmF0ZWRGaWxlTmFtZSgKLSAgICAgICAgICAgICAgICAgIHBhdGhfLAotICAgICAgICAgICAgICAgICAgZmlsZV9uYW1lXyArICgha3YtPmZpcnN0LmVtcHR5KCkgPyAiXyIgKyBrdi0+Zmlyc3QgOiAiIiksCi0gICAgICAgICAgICAgICAgICBwYXJzZXJfLm9wdHMpCi0gICAgICAgICAgICAgICAgICAuY19zdHIoKSwKLSAgICAgICAgICAgICAgY29kZSwgZmFsc2UpKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgIH0KKyAgICAgIGlmICghU2F2ZUZpbGUoRmlsZW5hbWUoa3YtPmZpcnN0KS5jX3N0cigpLCBjb2RlLCBmYWxzZSkpIHsgcmV0dXJuIGZhbHNlOyB9CiAgICAgfQogICAgIHJldHVybiB0cnVlOwogICB9CiAKKyAgc3RkOjpzdHJpbmcgRmlsZW5hbWUoY29uc3Qgc3RkOjpzdHJpbmcgJnN1ZmZpeCwgYm9vbCBwYXRoID0gdHJ1ZSkgY29uc3QgeworICAgIHJldHVybiAocGF0aCA/IHBhdGhfIDogIiIpICsKKyAgICAgICAgICAgbmFtZXJfLkZpbGUoZmlsZV9uYW1lXyArIChzdWZmaXguZW1wdHkoKSA/ICIiIDogIl8iICsgc3VmZml4KSk7CisgIH0KKwogIHByaXZhdGU6CiAgIHN0YXRpYyBzdGQ6OnN0cmluZyBJbXBvcnRBbGlhc05hbWUoY29uc3Qgc3RkOjpzdHJpbmcgJm5zKSB7CiAgICAgc3RkOjpzdHJpbmcgcmV0OwpAQCAtMTEzLDY0ICsxMzgsMTUgQEAKICAgICByZXR1cm4gcmV0OwogICB9CiAKLSAgc3RhdGljIHN0ZDo6c3RyaW5nIEJ1aWxkTmFtZXNwYWNlTmFtZShjb25zdCBOYW1lc3BhY2UgJm5zKSB7Ci0gICAgaWYgKG5zLmNvbXBvbmVudHMuZW1wdHkoKSkgeyByZXR1cm4gIiI7IH0KLSAgICBzdGQ6OnN0cmluZ3N0cmVhbSBzc3RyZWFtOwotICAgIHN0ZDo6Y29weShucy5jb21wb25lbnRzLmJlZ2luKCksIG5zLmNvbXBvbmVudHMuZW5kKCkgLSAxLAotICAgICAgICAgICAgICBzdGQ6Om9zdHJlYW1faXRlcmF0b3I8c3RkOjpzdHJpbmc+KHNzdHJlYW0sICIuIikpOwotCi0gICAgYXV0byByZXQgPSBzc3RyZWFtLnN0cigpICsgbnMuY29tcG9uZW50cy5iYWNrKCk7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCByZXQuc2l6ZSgpOyBpKyspIHsKLSAgICAgIGF1dG8gbG93ZXIgPSBDaGFyVG9Mb3dlcihyZXRbaV0pOwotICAgICAgaWYgKGxvd2VyICE9IHJldFtpXSkgewotICAgICAgICByZXRbaV0gPSBsb3dlcjsKLSAgICAgICAgaWYgKGkgIT0gMCAmJiByZXRbaSAtIDFdICE9ICcuJykgewotICAgICAgICAgIHJldC5pbnNlcnQoaSwgIl8iKTsKLSAgICAgICAgICBpKys7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgLy8gc3RkOjp0cmFuc2Zvcm0ocmV0LmJlZ2luKCksIHJldC5lbmQoKSwgcmV0LmJlZ2luKCksIENoYXJUb0xvd2VyKTsKLSAgICByZXR1cm4gcmV0OwotICB9Ci0KLSAgdm9pZCBHZW5JbmNsdWRlRGVwZW5kZW5jaWVzKHN0ZDo6c3RyaW5nICpjb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgJnRoZV9uYW1lc3BhY2UpIHsKLSAgICBmb3IgKGF1dG8gaXQgPSBwYXJzZXJfLmluY2x1ZGVkX2ZpbGVzXy5iZWdpbigpOwotICAgICAgICAgaXQgIT0gcGFyc2VyXy5pbmNsdWRlZF9maWxlc18uZW5kKCk7ICsraXQpIHsKLSAgICAgIGlmIChpdC0+c2Vjb25kLmVtcHR5KCkpIGNvbnRpbnVlOwotCi0gICAgICBhdXRvIG5vZXh0ID0gZmxhdGJ1ZmZlcnM6OlN0cmlwRXh0ZW5zaW9uKGl0LT5zZWNvbmQpOwotICAgICAgYXV0byBiYXNlbmFtZSA9IGZsYXRidWZmZXJzOjpTdHJpcFBhdGgobm9leHQpOwotCi0gICAgICAqY29kZSArPQotICAgICAgICAgICJpbXBvcnQgJyIgKwotICAgICAgICAgIEdlbmVyYXRlZEZpbGVOYW1lKAotICAgICAgICAgICAgICAiIiwgYmFzZW5hbWUgKyAodGhlX25hbWVzcGFjZSA9PSAiIiA/ICIiIDogIl8iICsgdGhlX25hbWVzcGFjZSksCi0gICAgICAgICAgICAgIHBhcnNlcl8ub3B0cykgKwotICAgICAgICAgICInO1xuIjsKLSAgICB9Ci0gIH0KLQotICBzdGF0aWMgc3RkOjpzdHJpbmcgRXNjYXBlS2V5d29yZChjb25zdCBzdGQ6OnN0cmluZyAmbmFtZSkgewotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZW9mKGtleXdvcmRzKSAvIHNpemVvZihrZXl3b3Jkc1swXSk7IGkrKykgewotICAgICAgaWYgKG5hbWUgPT0ga2V5d29yZHNbaV0pIHsKLSAgICAgICAgcmV0dXJuIENvbnZlcnRDYXNlKG5hbWUgKyAiXyIsIENhc2U6OmtMb3dlckNhbWVsKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gQ29udmVydENhc2UobmFtZSwgQ2FzZTo6a0xvd2VyQ2FtZWwpOwotICB9Ci0KLSAgdm9pZCBHZW5lcmF0ZUVudW1zKG5hbWVzcGFjZV9jb2RlX21hcCAqbmFtZXNwYWNlX2NvZGUpIHsKKyAgdm9pZCBHZW5lcmF0ZUVudW1zKG5hbWVzcGFjZV9jb2RlX21hcCAmbmFtZXNwYWNlX2NvZGUpIHsKICAgICBmb3IgKGF1dG8gaXQgPSBwYXJzZXJfLmVudW1zXy52ZWMuYmVnaW4oKTsgaXQgIT0gcGFyc2VyXy5lbnVtc18udmVjLmVuZCgpOwogICAgICAgICAgKytpdCkgewogICAgICAgYXV0byAmZW51bV9kZWYgPSAqKml0OwotICAgICAgR2VuRW51bShlbnVtX2RlZiwgbmFtZXNwYWNlX2NvZGUpOyAgLy8gZW51bV9jb2RlX3B0cik7CisgICAgICBHZW5FbnVtKGVudW1fZGVmLCBuYW1lc3BhY2VfY29kZSk7CiAgICAgfQogICB9CiAKLSAgdm9pZCBHZW5lcmF0ZVN0cnVjdHMobmFtZXNwYWNlX2NvZGVfbWFwICpuYW1lc3BhY2VfY29kZSkgeworICB2b2lkIEdlbmVyYXRlU3RydWN0cyhuYW1lc3BhY2VfY29kZV9tYXAgJm5hbWVzcGFjZV9jb2RlKSB7CiAgICAgZm9yIChhdXRvIGl0ID0gcGFyc2VyXy5zdHJ1Y3RzXy52ZWMuYmVnaW4oKTsKICAgICAgICAgIGl0ICE9IHBhcnNlcl8uc3RydWN0c18udmVjLmVuZCgpOyArK2l0KSB7CiAgICAgICBhdXRvICZzdHJ1Y3RfZGVmID0gKippdDsKQEAgLTE4MCw4MCArMTU2LDUwIEBACiAKICAgLy8gR2VuZXJhdGUgYSBkb2N1bWVudGF0aW9uIGNvbW1lbnQsIGlmIGF2YWlsYWJsZS4KICAgc3RhdGljIHZvaWQgR2VuRG9jQ29tbWVudChjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gJmRjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nICpjb2RlX3B0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyAmZXh0cmFfbGluZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqaW5kZW50ID0gbnVsbHB0cikgewotICAgIGlmIChkYy5lbXB0eSgpICYmIGV4dHJhX2xpbmVzLmVtcHR5KCkpIHsKLSAgICAgIC8vIERvbid0IG91dHB1dCBlbXB0eSBjb21tZW50IGJsb2NrcyB3aXRoIDAgbGluZXMgb2YgY29tbWVudCBjb250ZW50LgotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGF1dG8gJmNvZGUgPSAqY29kZV9wdHI7Ci0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICppbmRlbnQsIHN0ZDo6c3RyaW5nICZjb2RlKSB7CiAgICAgZm9yIChhdXRvIGl0ID0gZGMuYmVnaW4oKTsgaXQgIT0gZGMuZW5kKCk7ICsraXQpIHsKICAgICAgIGlmIChpbmRlbnQpIGNvZGUgKz0gaW5kZW50OwogICAgICAgY29kZSArPSAiLy8vICIgKyAqaXQgKyAiXG4iOwogICAgIH0KLSAgICBpZiAoIWV4dHJhX2xpbmVzLmVtcHR5KCkpIHsKLSAgICAgIGlmICghZGMuZW1wdHkoKSkgewotICAgICAgICBpZiAoaW5kZW50KSBjb2RlICs9IGluZGVudDsKLSAgICAgICAgY29kZSArPSAiLy8vXG4iOwotICAgICAgfQotICAgICAgaWYgKGluZGVudCkgY29kZSArPSBpbmRlbnQ7Ci0gICAgICBzdGQ6OnN0cmluZzo6c2l6ZV90eXBlIHN0YXJ0ID0gMDsKLSAgICAgIGZvciAoOzspIHsKLSAgICAgICAgYXV0byBlbmQgPSBleHRyYV9saW5lcy5maW5kKCdcbicsIHN0YXJ0KTsKLSAgICAgICAgaWYgKGVuZCAhPSBzdGQ6OnN0cmluZzo6bnBvcykgewotICAgICAgICAgIGNvZGUgKz0gIi8vLyAiICsgZXh0cmFfbGluZXMuc3Vic3RyKHN0YXJ0LCBlbmQgLSBzdGFydCkgKyAiXG4iOwotICAgICAgICAgIHN0YXJ0ID0gZW5kICsgMTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBjb2RlICs9ICIvLy8gIiArIGV4dHJhX2xpbmVzLnN1YnN0cihzdGFydCkgKyAiXG4iOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgc3RhdGljIHZvaWQgR2VuRG9jQ29tbWVudChzdGQ6OnN0cmluZyAqY29kZV9wdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgJmV4dHJhX2xpbmVzKSB7Ci0gICAgR2VuRG9jQ29tbWVudChzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4oKSwgY29kZV9wdHIsIGV4dHJhX2xpbmVzKTsKICAgfQogCiAgIC8vIEdlbmVyYXRlIGFuIGVudW0gZGVjbGFyYXRpb24gYW5kIGFuIGVudW0gc3RyaW5nIGxvb2t1cCB0YWJsZS4KLSAgdm9pZCBHZW5FbnVtKEVudW1EZWYgJmVudW1fZGVmLCBuYW1lc3BhY2VfY29kZV9tYXAgKm5hbWVzcGFjZV9jb2RlKSB7CisgIHZvaWQgR2VuRW51bShFbnVtRGVmICZlbnVtX2RlZiwgbmFtZXNwYWNlX2NvZGVfbWFwICZuYW1lc3BhY2VfY29kZSkgewogICAgIGlmIChlbnVtX2RlZi5nZW5lcmF0ZWQpIHJldHVybjsKLSAgICBhdXRvIG5zID0gQnVpbGROYW1lc3BhY2VOYW1lKCplbnVtX2RlZi5kZWZpbmVkX25hbWVzcGFjZSk7Ci0gICAgc3RkOjpzdHJpbmcgY29kZTsKLSAgICBHZW5Eb2NDb21tZW50KGVudW1fZGVmLmRvY19jb21tZW50LCAmY29kZSwgIiIpOworICAgIHN0ZDo6c3RyaW5nICZjb2RlID0KKyAgICAgICAgbmFtZXNwYWNlX2NvZGVbbmFtZXJfLk5hbWVzcGFjZSgqZW51bV9kZWYuZGVmaW5lZF9uYW1lc3BhY2UpXTsKKyAgICBHZW5Eb2NDb21tZW50KGVudW1fZGVmLmRvY19jb21tZW50LCAiIiwgY29kZSk7CiAKLSAgICBhdXRvIG5hbWUgPSBlbnVtX2RlZi5pc191bmlvbiA/IGVudW1fZGVmLm5hbWUgKyAiVHlwZUlkIiA6IGVudW1fZGVmLm5hbWU7CisgICAgY29uc3Qgc3RkOjpzdHJpbmcgZW51bV90eXBlID0KKyAgICAgICAgbmFtZXJfLlR5cGUoZW51bV9kZWYpICsgKGVudW1fZGVmLmlzX3VuaW9uID8gIlR5cGVJZCIgOiAiIik7CiAgICAgY29uc3QgYm9vbCBpc19iaXRfZmxhZ3MgPQogICAgICAgICBlbnVtX2RlZi5hdHRyaWJ1dGVzLkxvb2t1cCgiYml0X2ZsYWdzIikgIT0gbnVsbHB0cjsKICAgICAvLyBUaGUgZmxhdGJ1ZmZlciBzY2hlbWEgbGFuZ3VhZ2UgYWxsb3dzIGJpdCBmbGFnIGVudW1zIHRvIHBvdGVudGlhbGx5IGhhdmUKICAgICAvLyBhIGRlZmF1bHQgdmFsdWUgb2YgemVybywgZXZlbiBpZiBpdCdzIG5vdCBhIHZhbGlkIGVudW0gdmFsdWUuLi4KICAgICBjb25zdCBib29sIHBlcm1pdF96ZXJvID0gaXNfYml0X2ZsYWdzOwogCi0gICAgY29kZSArPSAiY2xhc3MgIiArIG5hbWUgKyAiIHtcbiI7CisgICAgY29kZSArPSAiY2xhc3MgIiArIGVudW1fdHlwZSArICIge1xuIjsKICAgICBjb2RlICs9ICIgIGZpbmFsIGludCB2YWx1ZTtcbiI7Ci0gICAgY29kZSArPSAiICBjb25zdCAiICsgbmFtZSArICIuXyh0aGlzLnZhbHVlKTtcblxuIjsKLSAgICBjb2RlICs9ICIgIGZhY3RvcnkgIiArIG5hbWUgKyAiLmZyb21WYWx1ZShpbnQgdmFsdWUpIHtcbiI7CisgICAgY29kZSArPSAiICBjb25zdCAiICsgZW51bV90eXBlICsgIi5fKHRoaXMudmFsdWUpO1xuXG4iOworICAgIGNvZGUgKz0gIiAgZmFjdG9yeSAiICsgZW51bV90eXBlICsgIi5mcm9tVmFsdWUoaW50IHZhbHVlKSB7XG4iOwogICAgIGNvZGUgKz0gIiAgICBmaW5hbCByZXN1bHQgPSB2YWx1ZXNbdmFsdWVdO1xuIjsKICAgICBjb2RlICs9ICIgICAgaWYgKHJlc3VsdCA9PSBudWxsKSB7XG4iOwogICAgIGlmIChwZXJtaXRfemVybykgewogICAgICAgY29kZSArPSAiICAgICAgaWYgKHZhbHVlID09IDApIHtcbiI7Ci0gICAgICBjb2RlICs9ICIgICAgICAgIHJldHVybiAiICsgbmFtZSArICIuXygwKTtcbiI7CisgICAgICBjb2RlICs9ICIgICAgICAgIHJldHVybiAiICsgZW51bV90eXBlICsgIi5fKDApO1xuIjsKICAgICAgIGNvZGUgKz0gIiAgICAgIH0gZWxzZSB7XG4iOwogICAgIH0KICAgICBjb2RlICs9ICIgICAgICAgIHRocm93IFN0YXRlRXJyb3IoJ0ludmFsaWQgdmFsdWUgJHZhbHVlIGZvciBiaXQgZmxhZyBlbnVtICI7Ci0gICAgY29kZSArPSBuYW1lICsgIicpO1xuIjsKKyAgICBjb2RlICs9IGVudW1fdHlwZSArICInKTtcbiI7CiAgICAgaWYgKHBlcm1pdF96ZXJvKSB7IGNvZGUgKz0gIiAgICAgIH1cbiI7IH0KICAgICBjb2RlICs9ICIgICAgfVxuIjsKIAogICAgIGNvZGUgKz0gIiAgICByZXR1cm4gcmVzdWx0O1xuIjsKICAgICBjb2RlICs9ICIgIH1cblxuIjsKIAotICAgIGNvZGUgKz0gIiAgc3RhdGljICIgKyBuYW1lICsgIj8gX2NyZWF0ZU9yTnVsbChpbnQ/IHZhbHVlKSA9PiBcbiI7Ci0gICAgY29kZSArPSAiICAgICAgdmFsdWUgPT0gbnVsbCA/IG51bGwgOiAiICsgbmFtZSArICIuZnJvbVZhbHVlKHZhbHVlKTtcblxuIjsKKyAgICBjb2RlICs9ICIgIHN0YXRpYyAiICsgZW51bV90eXBlICsgIj8gX2NyZWF0ZU9yTnVsbChpbnQ/IHZhbHVlKSA9PiBcbiI7CisgICAgY29kZSArPQorICAgICAgICAiICAgICAgdmFsdWUgPT0gbnVsbCA/IG51bGwgOiAiICsgZW51bV90eXBlICsgIi5mcm9tVmFsdWUodmFsdWUpO1xuXG4iOwogCiAgICAgLy8gdGhpcyBpcyBtZWFuaW5nbGVzcyBmb3IgYml0X2ZsYWdzCiAgICAgLy8gaG93ZXZlciwgbm90ZSB0aGF0IHVubGlrZSAicmVndWxhciIgZGFydCBlbnVtcyB0aGlzIGVudW0gY2FuIHN0aWxsIGhhdmUKQEAgLTI3MSw1MyArMjE3LDUyIEBACiAKICAgICBmb3IgKGF1dG8gaXQgPSBlbnVtX2RlZi5WYWxzKCkuYmVnaW4oKTsgaXQgIT0gZW51bV9kZWYuVmFscygpLmVuZCgpOyArK2l0KSB7CiAgICAgICBhdXRvICZldiA9ICoqaXQ7CisgICAgICBjb25zdCBhdXRvIGVudW1fdmFyID0gbmFtZXJfLlZhcmlhbnQoZXYpOwogCiAgICAgICBpZiAoIWV2LmRvY19jb21tZW50LmVtcHR5KCkpIHsKICAgICAgICAgaWYgKGl0ICE9IGVudW1fZGVmLlZhbHMoKS5iZWdpbigpKSB7IGNvZGUgKz0gJ1xuJzsgfQotICAgICAgICBHZW5Eb2NDb21tZW50KGV2LmRvY19jb21tZW50LCAmY29kZSwgIiIsICIgICIpOworICAgICAgICBHZW5Eb2NDb21tZW50KGV2LmRvY19jb21tZW50LCAiICAiLCBjb2RlKTsKICAgICAgIH0KLSAgICAgIGNvZGUgKz0gIiAgc3RhdGljIGNvbnN0ICIgKyBuYW1lICsgIiAiICsgZXYubmFtZSArICIgPSAiICsgbmFtZSArICIuXygiICsKLSAgICAgICAgICAgICAgZW51bV9kZWYuVG9TdHJpbmcoZXYpICsgIik7XG4iOworICAgICAgY29kZSArPSAiICBzdGF0aWMgY29uc3QgIiArIGVudW1fdHlwZSArICIgIiArIGVudW1fdmFyICsgIiA9ICIgKworICAgICAgICAgICAgICBlbnVtX3R5cGUgKyAiLl8oIiArIGVudW1fZGVmLlRvU3RyaW5nKGV2KSArICIpO1xuIjsKICAgICB9CiAKLSAgICBjb2RlICs9ICIgIHN0YXRpYyBjb25zdCBNYXA8aW50LCAiICsgbmFtZSArICI+IHZhbHVlcyA9IHtcbiI7CisgICAgY29kZSArPSAiICBzdGF0aWMgY29uc3QgTWFwPGludCwgIiArIGVudW1fdHlwZSArICI+IHZhbHVlcyA9IHtcbiI7CiAgICAgZm9yIChhdXRvIGl0ID0gZW51bV9kZWYuVmFscygpLmJlZ2luKCk7IGl0ICE9IGVudW1fZGVmLlZhbHMoKS5lbmQoKTsgKytpdCkgewogICAgICAgYXV0byAmZXYgPSAqKml0OworICAgICAgY29uc3QgYXV0byBlbnVtX3ZhciA9IG5hbWVyXy5WYXJpYW50KGV2KTsKICAgICAgIGlmIChpdCAhPSBlbnVtX2RlZi5WYWxzKCkuYmVnaW4oKSkgY29kZSArPSAiLFxuIjsKLSAgICAgIGNvZGUgKz0gIiAgICAiICsgZW51bV9kZWYuVG9TdHJpbmcoZXYpICsgIjogIiArIGV2Lm5hbWU7CisgICAgICBjb2RlICs9ICIgICAgIiArIGVudW1fZGVmLlRvU3RyaW5nKGV2KSArICI6ICIgKyBlbnVtX3ZhcjsKICAgICB9CiAgICAgY29kZSArPSAifTtcblxuIjsKIAotICAgIGNvZGUgKz0gIiAgc3RhdGljIGNvbnN0ICIgKyBfa0ZiICsgIi5SZWFkZXI8IiArIG5hbWUgKyAiPiByZWFkZXIgPSBfIiArCi0gICAgICAgICAgICBuYW1lICsgIlJlYWRlcigpO1xuXG4iOworICAgIGNvZGUgKz0gIiAgc3RhdGljIGNvbnN0ICIgKyBfa0ZiICsgIi5SZWFkZXI8IiArIGVudW1fdHlwZSArICI+IHJlYWRlciA9IF8iICsKKyAgICAgICAgICAgIGVudW1fdHlwZSArICJSZWFkZXIoKTtcblxuIjsKICAgICBjb2RlICs9ICIgIEBvdmVycmlkZVxuIjsKICAgICBjb2RlICs9ICIgIFN0cmluZyB0b1N0cmluZygpIHtcbiI7Ci0gICAgY29kZSArPSAiICAgIHJldHVybiAnIiArIG5hbWUgKyAie3ZhbHVlOiAkdmFsdWV9JztcbiI7CisgICAgY29kZSArPSAiICAgIHJldHVybiAnIiArIGVudW1fdHlwZSArICJ7dmFsdWU6ICR2YWx1ZX0nO1xuIjsKICAgICBjb2RlICs9ICIgIH1cbiI7CiAgICAgY29kZSArPSAifVxuXG4iOwogCi0gICAgR2VuRW51bVJlYWRlcihlbnVtX2RlZiwgbmFtZSwgJmNvZGUpOwotICAgICgqbmFtZXNwYWNlX2NvZGUpW25zXSArPSBjb2RlOworICAgIEdlbkVudW1SZWFkZXIoZW51bV9kZWYsIGVudW1fdHlwZSwgY29kZSk7CiAgIH0KIAotICB2b2lkIEdlbkVudW1SZWFkZXIoRW51bURlZiAmZW51bV9kZWYsIGNvbnN0IHN0ZDo6c3RyaW5nICZuYW1lLAotICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgKmNvZGVfcHRyKSB7Ci0gICAgYXV0byAmY29kZSA9ICpjb2RlX3B0cjsKLQotICAgIGNvZGUgKz0gImNsYXNzIF8iICsgbmFtZSArICJSZWFkZXIgZXh0ZW5kcyAiICsgX2tGYiArICIuUmVhZGVyPCIgKyBuYW1lICsKLSAgICAgICAgICAgICI+IHtcbiI7Ci0gICAgY29kZSArPSAiICBjb25zdCBfIiArIG5hbWUgKyAiUmVhZGVyKCk7XG5cbiI7CisgIHZvaWQgR2VuRW51bVJlYWRlcihFbnVtRGVmICZlbnVtX2RlZiwgY29uc3Qgc3RkOjpzdHJpbmcgJmVudW1fdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nICZjb2RlKSB7CisgICAgY29kZSArPSAiY2xhc3MgXyIgKyBlbnVtX3R5cGUgKyAiUmVhZGVyIGV4dGVuZHMgIiArIF9rRmIgKyAiLlJlYWRlcjwiICsKKyAgICAgICAgICAgIGVudW1fdHlwZSArICI+IHtcbiI7CisgICAgY29kZSArPSAiICBjb25zdCBfIiArIGVudW1fdHlwZSArICJSZWFkZXIoKTtcblxuIjsKICAgICBjb2RlICs9ICIgIEBvdmVycmlkZVxuIjsKLSAgICBjb2RlICs9ICIgIGludCBnZXQgc2l6ZSA9PiAxO1xuXG4iOworICAgIGNvZGUgKz0gIiAgaW50IGdldCBzaXplID0+ICIgKyBFbnVtU2l6ZShlbnVtX2RlZi51bmRlcmx5aW5nX3R5cGUpICsgIjtcblxuIjsKICAgICBjb2RlICs9ICIgIEBvdmVycmlkZVxuIjsKLSAgICBjb2RlICs9Ci0gICAgICAgICIgICIgKyBuYW1lICsgIiByZWFkKCIgKyBfa0ZiICsgIi5CdWZmZXJDb250ZXh0IGJjLCBpbnQgb2Zmc2V0KSA9PlxuIjsKLSAgICBjb2RlICs9ICIgICAgICAiICsgbmFtZSArICIuZnJvbVZhbHVlKGNvbnN0ICIgKyBfa0ZiICsgIi4iICsKKyAgICBjb2RlICs9ICIgICIgKyBlbnVtX3R5cGUgKyAiIHJlYWQoIiArIF9rRmIgKworICAgICAgICAgICAgIi5CdWZmZXJDb250ZXh0IGJjLCBpbnQgb2Zmc2V0KSA9PlxuIjsKKyAgICBjb2RlICs9ICIgICAgICAiICsgZW51bV90eXBlICsgIi5mcm9tVmFsdWUoY29uc3QgIiArIF9rRmIgKyAiLiIgKwogICAgICAgICAgICAgR2VuVHlwZShlbnVtX2RlZi51bmRlcmx5aW5nX3R5cGUpICsgIlJlYWRlcigpLnJlYWQoYmMsIG9mZnNldCkpO1xuIjsKICAgICBjb2RlICs9ICJ9XG5cbiI7CiAgIH0KIAotICBzdGF0aWMgc3RkOjpzdHJpbmcgR2VuVHlwZShjb25zdCBUeXBlICZ0eXBlKSB7CisgIHN0ZDo6c3RyaW5nIEdlblR5cGUoY29uc3QgVHlwZSAmdHlwZSkgewogICAgIHN3aXRjaCAodHlwZS5iYXNlX3R5cGUpIHsKICAgICAgIGNhc2UgQkFTRV9UWVBFX0JPT0w6IHJldHVybiAiQm9vbCI7CiAgICAgICBjYXNlIEJBU0VfVFlQRV9DSEFSOiByZXR1cm4gIkludDgiOwpAQCAtMzMzLDEyICsyNzgsMzAgQEAKICAgICAgIGNhc2UgQkFTRV9UWVBFX0RPVUJMRTogcmV0dXJuICJGbG9hdDY0IjsKICAgICAgIGNhc2UgQkFTRV9UWVBFX1NUUklORzogcmV0dXJuICJTdHJpbmciOwogICAgICAgY2FzZSBCQVNFX1RZUEVfVkVDVE9SOiByZXR1cm4gR2VuVHlwZSh0eXBlLlZlY3RvclR5cGUoKSk7Ci0gICAgICBjYXNlIEJBU0VfVFlQRV9TVFJVQ1Q6IHJldHVybiB0eXBlLnN0cnVjdF9kZWYtPm5hbWU7Ci0gICAgICBjYXNlIEJBU0VfVFlQRV9VTklPTjogcmV0dXJuIHR5cGUuZW51bV9kZWYtPm5hbWUgKyAiVHlwZUlkIjsKKyAgICAgIGNhc2UgQkFTRV9UWVBFX1NUUlVDVDogcmV0dXJuIG5hbWVyXy5UeXBlKCp0eXBlLnN0cnVjdF9kZWYpOworICAgICAgY2FzZSBCQVNFX1RZUEVfVU5JT046IHJldHVybiBuYW1lcl8uVHlwZSgqdHlwZS5lbnVtX2RlZikgKyAiVHlwZUlkIjsKICAgICAgIGRlZmF1bHQ6IHJldHVybiAiVGFibGUiOwogICAgIH0KICAgfQogCisgIHN0YXRpYyBzdGQ6OnN0cmluZyBFbnVtU2l6ZShjb25zdCBUeXBlICZ0eXBlKSB7CisgICAgc3dpdGNoICh0eXBlLmJhc2VfdHlwZSkgeworICAgICAgY2FzZSBCQVNFX1RZUEVfQk9PTDoKKyAgICAgIGNhc2UgQkFTRV9UWVBFX0NIQVI6CisgICAgICBjYXNlIEJBU0VfVFlQRV9VVFlQRToKKyAgICAgIGNhc2UgQkFTRV9UWVBFX1VDSEFSOiByZXR1cm4gIjEiOworICAgICAgY2FzZSBCQVNFX1RZUEVfU0hPUlQ6CisgICAgICBjYXNlIEJBU0VfVFlQRV9VU0hPUlQ6IHJldHVybiAiMiI7CisgICAgICBjYXNlIEJBU0VfVFlQRV9JTlQ6CisgICAgICBjYXNlIEJBU0VfVFlQRV9VSU5UOgorICAgICAgY2FzZSBCQVNFX1RZUEVfRkxPQVQ6IHJldHVybiAiNCI7CisgICAgICBjYXNlIEJBU0VfVFlQRV9MT05HOgorICAgICAgY2FzZSBCQVNFX1RZUEVfVUxPTkc6CisgICAgICBjYXNlIEJBU0VfVFlQRV9ET1VCTEU6IHJldHVybiAiOCI7CisgICAgICBkZWZhdWx0OiByZXR1cm4gIjEiOworICAgIH0KKyAgfQorCiAgIHN0ZDo6c3RyaW5nIEdlblJlYWRlclR5cGVOYW1lKGNvbnN0IFR5cGUgJnR5cGUsIE5hbWVzcGFjZSAqY3VycmVudF9uYW1lc3BhY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpZWxkRGVmICZkZWYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgcGFyZW50X2lzX3ZlY3RvciA9IGZhbHNlLCBib29sIGxhenkgPSB0cnVlLApAQCAtMzc4LDExICszNDEsMTEgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHN0cnVjdF90eXBlX3N1ZmZpeCA9ICIiKSB7CiAgICAgaWYgKHR5cGUuZW51bV9kZWYpIHsKICAgICAgIGlmICh0eXBlLmVudW1fZGVmLT5pc191bmlvbiAmJiB0eXBlLmJhc2VfdHlwZSAhPSBCQVNFX1RZUEVfVU5JT04pIHsKLSAgICAgICAgcmV0dXJuIHR5cGUuZW51bV9kZWYtPm5hbWUgKyAiVHlwZUlkIjsKKyAgICAgICAgcmV0dXJuIG5hbWVyXy5UeXBlKCp0eXBlLmVudW1fZGVmKSArICJUeXBlSWQiOwogICAgICAgfSBlbHNlIGlmICh0eXBlLmVudW1fZGVmLT5pc191bmlvbikgewogICAgICAgICByZXR1cm4gImR5bmFtaWMiOwogICAgICAgfSBlbHNlIGlmICh0eXBlLmJhc2VfdHlwZSAhPSBCQVNFX1RZUEVfVkVDVE9SKSB7Ci0gICAgICAgIHJldHVybiB0eXBlLmVudW1fZGVmLT5uYW1lOworICAgICAgICByZXR1cm4gbmFtZXJfLlR5cGUoKnR5cGUuZW51bV9kZWYpOwogICAgICAgfQogICAgIH0KIApAQCAtNDAwLDggKzM2Myw5IEBACiAgICAgICBjYXNlIEJBU0VfVFlQRV9ET1VCTEU6IHJldHVybiAiZG91YmxlIjsKICAgICAgIGNhc2UgQkFTRV9UWVBFX1NUUklORzogcmV0dXJuICJTdHJpbmciOwogICAgICAgY2FzZSBCQVNFX1RZUEVfU1RSVUNUOgotICAgICAgICByZXR1cm4gTWF5YmVXcmFwTmFtZXNwYWNlKHR5cGUuc3RydWN0X2RlZi0+bmFtZSArIHN0cnVjdF90eXBlX3N1ZmZpeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50X25hbWVzcGFjZSwgZGVmKTsKKyAgICAgICAgcmV0dXJuIE1heWJlV3JhcE5hbWVzcGFjZSgKKyAgICAgICAgICAgIG5hbWVyXy5UeXBlKCp0eXBlLnN0cnVjdF9kZWYpICsgc3RydWN0X3R5cGVfc3VmZml4LAorICAgICAgICAgICAgY3VycmVudF9uYW1lc3BhY2UsIGRlZik7CiAgICAgICBjYXNlIEJBU0VfVFlQRV9WRUNUT1I6CiAgICAgICAgIHJldHVybiAiTGlzdDwiICsKICAgICAgICAgICAgICAgIEdlbkRhcnRUeXBlTmFtZSh0eXBlLlZlY3RvclR5cGUoKSwgY3VycmVudF9uYW1lc3BhY2UsIGRlZiwKQEAgLTQyMCwyMSArMzg0LDE5IEBACiAgICAgcmV0dXJuIHR5cGVOYW1lOwogICB9CiAKLSAgc3RhdGljIGNvbnN0IHN0ZDo6c3RyaW5nIE1heWJlV3JhcE5hbWVzcGFjZShjb25zdCBzdGQ6OnN0cmluZyAmdHlwZV9uYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5hbWVzcGFjZSAqY3VycmVudF9ucywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWVsZERlZiAmZmllbGQpIHsKLSAgICBhdXRvIGN1cnJfbnNfc3RyID0gQnVpbGROYW1lc3BhY2VOYW1lKCpjdXJyZW50X25zKTsKLSAgICBzdGQ6OnN0cmluZyBmaWVsZF9uc19zdHIgPSAiIjsKLSAgICBpZiAoZmllbGQudmFsdWUudHlwZS5zdHJ1Y3RfZGVmKSB7Ci0gICAgICBmaWVsZF9uc19zdHIgKz0KLSAgICAgICAgICBCdWlsZE5hbWVzcGFjZU5hbWUoKmZpZWxkLnZhbHVlLnR5cGUuc3RydWN0X2RlZi0+ZGVmaW5lZF9uYW1lc3BhY2UpOwotICAgIH0gZWxzZSBpZiAoZmllbGQudmFsdWUudHlwZS5lbnVtX2RlZikgewotICAgICAgZmllbGRfbnNfc3RyICs9Ci0gICAgICAgICAgQnVpbGROYW1lc3BhY2VOYW1lKCpmaWVsZC52YWx1ZS50eXBlLmVudW1fZGVmLT5kZWZpbmVkX25hbWVzcGFjZSk7Ci0gICAgfQorICBzdGQ6OnN0cmluZyBNYXliZVdyYXBOYW1lc3BhY2UoY29uc3Qgc3RkOjpzdHJpbmcgJnR5cGVfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5hbWVzcGFjZSAqY3VycmVudF9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpZWxkRGVmICZmaWVsZCkgY29uc3QgeworICAgIGNvbnN0IHN0ZDo6c3RyaW5nIGN1cnJlbnRfbmFtZXNwYWNlID0gbmFtZXJfLk5hbWVzcGFjZSgqY3VycmVudF9ucyk7CisgICAgY29uc3Qgc3RkOjpzdHJpbmcgZmllbGRfbmFtZXNwYWNlID0KKyAgICAgICAgZmllbGQudmFsdWUudHlwZS5zdHJ1Y3RfZGVmCisgICAgICAgICAgICA/IG5hbWVyXy5OYW1lc3BhY2UoKmZpZWxkLnZhbHVlLnR5cGUuc3RydWN0X2RlZi0+ZGVmaW5lZF9uYW1lc3BhY2UpCisgICAgICAgIDogZmllbGQudmFsdWUudHlwZS5lbnVtX2RlZgorICAgICAgICAgICAgPyBuYW1lcl8uTmFtZXNwYWNlKCpmaWVsZC52YWx1ZS50eXBlLmVudW1fZGVmLT5kZWZpbmVkX25hbWVzcGFjZSkKKyAgICAgICAgICAgIDogIiI7CiAKLSAgICBpZiAoZmllbGRfbnNfc3RyICE9ICIiICYmIGZpZWxkX25zX3N0ciAhPSBjdXJyX25zX3N0cikgewotICAgICAgcmV0dXJuIEltcG9ydEFsaWFzTmFtZShmaWVsZF9uc19zdHIpICsgIi4iICsgdHlwZV9uYW1lOworICAgIGlmIChmaWVsZF9uYW1lc3BhY2UgIT0gIiIgJiYgZmllbGRfbmFtZXNwYWNlICE9IGN1cnJlbnRfbmFtZXNwYWNlKSB7CisgICAgICByZXR1cm4gSW1wb3J0QWxpYXNOYW1lKGZpZWxkX25hbWVzcGFjZSkgKyAiLiIgKyB0eXBlX25hbWU7CiAgICAgfSBlbHNlIHsKICAgICAgIHJldHVybiB0eXBlX25hbWU7CiAgICAgfQpAQCAtNDQyLDI5ICs0MDQsMjkgQEAKIAogICAvLyBHZW5lcmF0ZSBhbiBhY2Nlc3NvciBzdHJ1Y3Qgd2l0aCBjb25zdHJ1Y3RvciBmb3IgYSBmbGF0YnVmZmVycyBzdHJ1Y3QuCiAgIHZvaWQgR2VuU3RydWN0KGNvbnN0IFN0cnVjdERlZiAmc3RydWN0X2RlZiwKLSAgICAgICAgICAgICAgICAgbmFtZXNwYWNlX2NvZGVfbWFwICpuYW1lc3BhY2VfY29kZSkgeworICAgICAgICAgICAgICAgICBuYW1lc3BhY2VfY29kZV9tYXAgJm5hbWVzcGFjZV9jb2RlKSB7CiAgICAgaWYgKHN0cnVjdF9kZWYuZ2VuZXJhdGVkKSByZXR1cm47CiAKLSAgICBhdXRvIG9iamVjdF9uYW1lc3BhY2UgPSBCdWlsZE5hbWVzcGFjZU5hbWUoKnN0cnVjdF9kZWYuZGVmaW5lZF9uYW1lc3BhY2UpOwotICAgIHN0ZDo6c3RyaW5nIGNvZGU7CisgICAgc3RkOjpzdHJpbmcgJmNvZGUgPQorICAgICAgICBuYW1lc3BhY2VfY29kZVtuYW1lcl8uTmFtZXNwYWNlKCpzdHJ1Y3RfZGVmLmRlZmluZWRfbmFtZXNwYWNlKV07CiAKLSAgICBjb25zdCBhdXRvICZvYmplY3RfbmFtZSA9IHN0cnVjdF9kZWYubmFtZTsKKyAgICBjb25zdCBhdXRvICZzdHJ1Y3RfdHlwZSA9IG5hbWVyXy5UeXBlKHN0cnVjdF9kZWYpOwogCiAgICAgLy8gRW1pdCBjb25zdHJ1Y3RvcgogCi0gICAgR2VuRG9jQ29tbWVudChzdHJ1Y3RfZGVmLmRvY19jb21tZW50LCAmY29kZSwgIiIpOworICAgIEdlbkRvY0NvbW1lbnQoc3RydWN0X2RlZi5kb2NfY29tbWVudCwgIiIsIGNvZGUpOwogCi0gICAgYXV0byByZWFkZXJfbmFtZSA9ICJfIiArIG9iamVjdF9uYW1lICsgIlJlYWRlciI7Ci0gICAgYXV0byBidWlsZGVyX25hbWUgPSBvYmplY3RfbmFtZSArICJCdWlsZGVyIjsKLSAgICBhdXRvIG9iamVjdF9idWlsZGVyX25hbWUgPSBvYmplY3RfbmFtZSArICJPYmplY3RCdWlsZGVyIjsKKyAgICBhdXRvIHJlYWRlcl9uYW1lID0gIl8iICsgc3RydWN0X3R5cGUgKyAiUmVhZGVyIjsKKyAgICBhdXRvIGJ1aWxkZXJfbmFtZSA9IHN0cnVjdF90eXBlICsgIkJ1aWxkZXIiOworICAgIGF1dG8gb2JqZWN0X2J1aWxkZXJfbmFtZSA9IHN0cnVjdF90eXBlICsgIk9iamVjdEJ1aWxkZXIiOwogCiAgICAgc3RkOjpzdHJpbmcgcmVhZGVyX2NvZGUsIGJ1aWxkZXJfY29kZTsKIAotICAgIGNvZGUgKz0gImNsYXNzICIgKyBvYmplY3RfbmFtZSArICIge1xuIjsKKyAgICBjb2RlICs9ICJjbGFzcyAiICsgc3RydWN0X3R5cGUgKyAiIHtcbiI7CiAKLSAgICBjb2RlICs9ICIgICIgKyBvYmplY3RfbmFtZSArICIuXyh0aGlzLl9iYywgdGhpcy5fYmNPZmZzZXQpO1xuIjsKKyAgICBjb2RlICs9ICIgICIgKyBzdHJ1Y3RfdHlwZSArICIuXyh0aGlzLl9iYywgdGhpcy5fYmNPZmZzZXQpO1xuIjsKICAgICBpZiAoIXN0cnVjdF9kZWYuZml4ZWQpIHsKLSAgICAgIGNvZGUgKz0gIiAgZmFjdG9yeSAiICsgb2JqZWN0X25hbWUgKyAiKExpc3Q8aW50PiBieXRlcykge1xuIjsKKyAgICAgIGNvZGUgKz0gIiAgZmFjdG9yeSAiICsgc3RydWN0X3R5cGUgKyAiKExpc3Q8aW50PiBieXRlcykge1xuIjsKICAgICAgIGNvZGUgKz0KICAgICAgICAgICAiICAgIGZpbmFsIHJvb3RSZWYgPSAiICsgX2tGYiArICIuQnVmZmVyQ29udGV4dC5mcm9tQnl0ZXMoYnl0ZXMpO1xuIjsKICAgICAgIGNvZGUgKz0gIiAgICByZXR1cm4gcmVhZGVyLnJlYWQocm9vdFJlZiwgMCk7XG4iOwpAQCAtNDcyLDcgKzQzNCw3IEBACiAgICAgfQogCiAgICAgY29kZSArPSAiXG4iOwotICAgIGNvZGUgKz0gIiAgc3RhdGljIGNvbnN0ICIgKyBfa0ZiICsgIi5SZWFkZXI8IiArIG9iamVjdF9uYW1lICsKKyAgICBjb2RlICs9ICIgIHN0YXRpYyBjb25zdCAiICsgX2tGYiArICIuUmVhZGVyPCIgKyBzdHJ1Y3RfdHlwZSArCiAgICAgICAgICAgICAiPiByZWFkZXIgPSAiICsgcmVhZGVyX25hbWUgKyAiKCk7XG5cbiI7CiAKICAgICBjb2RlICs9ICIgIGZpbmFsICIgKyBfa0ZiICsgIi5CdWZmZXJDb250ZXh0IF9iYztcbiI7CkBAIC00ODEsMjAgKzQ0MywyMCBAQAogICAgIHN0ZDo6dmVjdG9yPHN0ZDo6cGFpcjxpbnQsIEZpZWxkRGVmICo+PiBub25fZGVwcmVjYXRlZF9maWVsZHM7CiAgICAgZm9yIChhdXRvIGl0ID0gc3RydWN0X2RlZi5maWVsZHMudmVjLmJlZ2luKCk7CiAgICAgICAgICBpdCAhPSBzdHJ1Y3RfZGVmLmZpZWxkcy52ZWMuZW5kKCk7ICsraXQpIHsKLSAgICAgIGF1dG8gJmZpZWxkID0gKippdDsKKyAgICAgIEZpZWxkRGVmICZmaWVsZCA9ICoqaXQ7CiAgICAgICBpZiAoZmllbGQuZGVwcmVjYXRlZCkgY29udGludWU7CiAgICAgICBhdXRvIG9mZnNldCA9IHN0YXRpY19jYXN0PGludD4oaXQgLSBzdHJ1Y3RfZGVmLmZpZWxkcy52ZWMuYmVnaW4oKSk7CiAgICAgICBub25fZGVwcmVjYXRlZF9maWVsZHMucHVzaF9iYWNrKHN0ZDo6bWFrZV9wYWlyKG9mZnNldCwgJmZpZWxkKSk7CiAgICAgfQogCi0gICAgR2VuSW1wbGVtZW50YXRpb25HZXR0ZXJzKHN0cnVjdF9kZWYsIG5vbl9kZXByZWNhdGVkX2ZpZWxkcywgJmNvZGUpOworICAgIEdlbkltcGxlbWVudGF0aW9uR2V0dGVycyhzdHJ1Y3RfZGVmLCBub25fZGVwcmVjYXRlZF9maWVsZHMsIGNvZGUpOwogCiAgICAgaWYgKHBhcnNlcl8ub3B0cy5nZW5lcmF0ZV9vYmplY3RfYmFzZWRfYXBpKSB7CiAgICAgICBjb2RlICs9CiAgICAgICAgICAgIlxuIiArIEdlblN0cnVjdE9iamVjdEFQSVVucGFjayhzdHJ1Y3RfZGVmLCBub25fZGVwcmVjYXRlZF9maWVsZHMpOwogCi0gICAgICBjb2RlICs9ICJcbiAgc3RhdGljIGludCBwYWNrKGZiLkJ1aWxkZXIgZmJCdWlsZGVyLCAiICsgc3RydWN0X2RlZi5uYW1lICsKLSAgICAgICAgICAgICAgIlQ/IG9iamVjdCkge1xuIjsKKyAgICAgIGNvZGUgKz0gIlxuICBzdGF0aWMgaW50IHBhY2soZmIuQnVpbGRlciBmYkJ1aWxkZXIsICIgKworICAgICAgICAgICAgICBuYW1lcl8uT2JqZWN0VHlwZShzdHJ1Y3RfZGVmKSArICI/IG9iamVjdCkge1xuIjsKICAgICAgIGNvZGUgKz0gIiAgICBpZiAob2JqZWN0ID09IG51bGwpIHJldHVybiAwO1xuIjsKICAgICAgIGNvZGUgKz0gIiAgICByZXR1cm4gb2JqZWN0LnBhY2soZmJCdWlsZGVyKTtcbiI7CiAgICAgICBjb2RlICs9ICIgIH1cbiI7CkBAIC01MDYsMTUgKzQ2OCwxMyBAQAogICAgICAgY29kZSArPSBHZW5TdHJ1Y3RPYmplY3RBUEkoc3RydWN0X2RlZiwgbm9uX2RlcHJlY2F0ZWRfZmllbGRzKTsKICAgICB9CiAKLSAgICBHZW5SZWFkZXIoc3RydWN0X2RlZiwgJnJlYWRlcl9uYW1lLCAmcmVhZGVyX2NvZGUpOwotICAgIEdlbkJ1aWxkZXIoc3RydWN0X2RlZiwgbm9uX2RlcHJlY2F0ZWRfZmllbGRzLCAmYnVpbGRlcl9uYW1lLCAmYnVpbGRlcl9jb2RlKTsKLSAgICBHZW5PYmplY3RCdWlsZGVyKHN0cnVjdF9kZWYsIG5vbl9kZXByZWNhdGVkX2ZpZWxkcywgJm9iamVjdF9idWlsZGVyX25hbWUsCi0gICAgICAgICAgICAgICAgICAgICAmYnVpbGRlcl9jb2RlKTsKKyAgICBHZW5SZWFkZXIoc3RydWN0X2RlZiwgcmVhZGVyX25hbWUsIHJlYWRlcl9jb2RlKTsKKyAgICBHZW5CdWlsZGVyKHN0cnVjdF9kZWYsIG5vbl9kZXByZWNhdGVkX2ZpZWxkcywgYnVpbGRlcl9uYW1lLCBidWlsZGVyX2NvZGUpOworICAgIEdlbk9iamVjdEJ1aWxkZXIoc3RydWN0X2RlZiwgbm9uX2RlcHJlY2F0ZWRfZmllbGRzLCBvYmplY3RfYnVpbGRlcl9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgYnVpbGRlcl9jb2RlKTsKIAogICAgIGNvZGUgKz0gcmVhZGVyX2NvZGU7CiAgICAgY29kZSArPSBidWlsZGVyX2NvZGU7Ci0KLSAgICAoKm5hbWVzcGFjZV9jb2RlKVtvYmplY3RfbmFtZXNwYWNlXSArPSBjb2RlOwogICB9CiAKICAgLy8gR2VuZXJhdGUgYW4gYWNjZXNzb3Igc3RydWN0IHdpdGggY29uc3RydWN0b3IgZm9yIGEgZmxhdGJ1ZmZlcnMgc3RydWN0LgpAQCAtNTIyLDIzICs0ODIsMjMgQEAKICAgICAgIGNvbnN0IFN0cnVjdERlZiAmc3RydWN0X2RlZiwKICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6cGFpcjxpbnQsIEZpZWxkRGVmICo+PiAmbm9uX2RlcHJlY2F0ZWRfZmllbGRzKSB7CiAgICAgc3RkOjpzdHJpbmcgY29kZTsKLSAgICBHZW5Eb2NDb21tZW50KHN0cnVjdF9kZWYuZG9jX2NvbW1lbnQsICZjb2RlLCAiIik7CisgICAgR2VuRG9jQ29tbWVudChzdHJ1Y3RfZGVmLmRvY19jb21tZW50LCAiIiwgY29kZSk7CiAKLSAgICBzdGQ6OnN0cmluZyBjbGFzc19uYW1lID0gc3RydWN0X2RlZi5uYW1lICsgIlQiOwotICAgIGNvZGUgKz0gImNsYXNzICIgKyBjbGFzc19uYW1lICsgIiBpbXBsZW1lbnRzICIgKyBfa0ZiICsgIi5QYWNrYWJsZSB7XG4iOworICAgIHN0ZDo6c3RyaW5nIG9iamVjdF90eXBlID0gbmFtZXJfLk9iamVjdFR5cGUoc3RydWN0X2RlZik7CisgICAgY29kZSArPSAiY2xhc3MgIiArIG9iamVjdF90eXBlICsgIiBpbXBsZW1lbnRzICIgKyBfa0ZiICsgIi5QYWNrYWJsZSB7XG4iOwogCiAgICAgc3RkOjpzdHJpbmcgY29uc3RydWN0b3JfYXJnczsKICAgICBmb3IgKGF1dG8gaXQgPSBub25fZGVwcmVjYXRlZF9maWVsZHMuYmVnaW4oKTsKICAgICAgICAgIGl0ICE9IG5vbl9kZXByZWNhdGVkX2ZpZWxkcy5lbmQoKTsgKytpdCkgewogICAgICAgY29uc3QgRmllbGREZWYgJmZpZWxkID0gKml0LT5zZWNvbmQ7CiAKLSAgICAgIHN0ZDo6c3RyaW5nIGZpZWxkX25hbWUgPSBDb252ZXJ0Q2FzZShmaWVsZC5uYW1lLCBDYXNlOjprTG93ZXJDYW1lbCk7Ci0gICAgICBzdGQ6OnN0cmluZyBkZWZhdWx0VmFsdWUgPSBnZXREZWZhdWx0VmFsdWUoZmllbGQudmFsdWUpOwotICAgICAgc3RkOjpzdHJpbmcgdHlwZV9uYW1lID0KKyAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nIGZpZWxkX25hbWUgPSBuYW1lcl8uRmllbGQoZmllbGQpOworICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgZGVmYXVsdFZhbHVlID0gZ2V0RGVmYXVsdFZhbHVlKGZpZWxkLnZhbHVlKTsKKyAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nIHR5cGVfbmFtZSA9CiAgICAgICAgICAgR2VuRGFydFR5cGVOYW1lKGZpZWxkLnZhbHVlLnR5cGUsIHN0cnVjdF9kZWYuZGVmaW5lZF9uYW1lc3BhY2UsIGZpZWxkLAogICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0VmFsdWUuZW1wdHkoKSAmJiAhc3RydWN0X2RlZi5maXhlZCwgIlQiKTsKIAotICAgICAgR2VuRG9jQ29tbWVudChmaWVsZC5kb2NfY29tbWVudCwgJmNvZGUsICIiLCAiICAiKTsKKyAgICAgIEdlbkRvY0NvbW1lbnQoZmllbGQuZG9jX2NvbW1lbnQsICIgICIsIGNvZGUpOwogICAgICAgY29kZSArPSAiICAiICsgdHlwZV9uYW1lICsgIiAiICsgZmllbGRfbmFtZSArICI7XG4iOwogCiAgICAgICBpZiAoIWNvbnN0cnVjdG9yX2FyZ3MuZW1wdHkoKSkgY29uc3RydWN0b3JfYXJncyArPSAiLFxuIjsKQEAgLTU0OSwxMCArNTA5LDEwIEBACiAgICAgICAgIGlmIChJc0VudW0oZmllbGQudmFsdWUudHlwZSkpIHsKICAgICAgICAgICBhdXRvICZlbnVtX2RlZiA9ICpmaWVsZC52YWx1ZS50eXBlLmVudW1fZGVmOwogICAgICAgICAgIGlmIChhdXRvIHZhbCA9IGVudW1fZGVmLkZpbmRCeVZhbHVlKGRlZmF1bHRWYWx1ZSkpIHsKLSAgICAgICAgICAgIGNvbnN0cnVjdG9yX2FyZ3MgKz0gIiA9ICIgKyBlbnVtX2RlZi5uYW1lICsgIi4iICsgdmFsLT5uYW1lOworICAgICAgICAgICAgY29uc3RydWN0b3JfYXJncyArPSAiID0gIiArIG5hbWVyXy5FbnVtVmFyaWFudChlbnVtX2RlZiwgKnZhbCk7CiAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGNvbnN0cnVjdG9yX2FyZ3MgKz0KLSAgICAgICAgICAgICAgICAiID0gY29uc3QgIiArIGVudW1fZGVmLm5hbWUgKyAiLl8oIiArIGRlZmF1bHRWYWx1ZSArICIpIjsKKyAgICAgICAgICAgIGNvbnN0cnVjdG9yX2FyZ3MgKz0gIiA9IGNvbnN0ICIgKyBuYW1lcl8uVHlwZShlbnVtX2RlZikgKyAiLl8oIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHRWYWx1ZSArICIpIjsKICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgY29uc3RydWN0b3JfYXJncyArPSAiID0gIiArIGRlZmF1bHRWYWx1ZTsKQEAgLTU2MSwxMiArNTIxLDEyIEBACiAgICAgfQogCiAgICAgaWYgKCFjb25zdHJ1Y3Rvcl9hcmdzLmVtcHR5KCkpIHsKLSAgICAgIGNvZGUgKz0gIlxuICAiICsgY2xhc3NfbmFtZSArICIoe1xuIiArIGNvbnN0cnVjdG9yX2FyZ3MgKyAifSk7XG5cbiI7CisgICAgICBjb2RlICs9ICJcbiAgIiArIG9iamVjdF90eXBlICsgIih7XG4iICsgY29uc3RydWN0b3JfYXJncyArICJ9KTtcblxuIjsKICAgICB9CiAKICAgICBjb2RlICs9IEdlblN0cnVjdE9iamVjdEFQSVBhY2soc3RydWN0X2RlZiwgbm9uX2RlcHJlY2F0ZWRfZmllbGRzKTsKICAgICBjb2RlICs9ICJcbiI7Ci0gICAgY29kZSArPSBHZW5Ub1N0cmluZyhjbGFzc19uYW1lLCBub25fZGVwcmVjYXRlZF9maWVsZHMpOworICAgIGNvZGUgKz0gR2VuVG9TdHJpbmcob2JqZWN0X3R5cGUsIG5vbl9kZXByZWNhdGVkX2ZpZWxkcyk7CiAKICAgICBjb2RlICs9ICJ9XG5cbiI7CiAgICAgcmV0dXJuIGNvZGU7CkBAIC01ODEsNyArNTQxLDcgQEAKICAgICAgICAgIGl0ICE9IG5vbl9kZXByZWNhdGVkX2ZpZWxkcy5lbmQoKTsgKytpdCkgewogICAgICAgY29uc3QgRmllbGREZWYgJmZpZWxkID0gKml0LT5zZWNvbmQ7CiAKLSAgICAgIHN0ZDo6c3RyaW5nIGZpZWxkX25hbWUgPSBDb252ZXJ0Q2FzZShmaWVsZC5uYW1lLCBDYXNlOjprTG93ZXJDYW1lbCk7CisgICAgICBjb25zdCBzdGQ6OnN0cmluZyBmaWVsZF9uYW1lID0gbmFtZXJfLkZpZWxkKGZpZWxkKTsKICAgICAgIGlmICghY29uc3RydWN0b3JfYXJncy5lbXB0eSgpKSBjb25zdHJ1Y3Rvcl9hcmdzICs9ICIsXG4iOwogICAgICAgY29uc3RydWN0b3JfYXJncyArPSAiICAgICAgIiArIGZpZWxkX25hbWUgKyAiOiAiOwogCkBAIC02MTIsOCArNTcyLDggQEAKICAgICAgIH0KICAgICB9CiAKLSAgICBzdGQ6OnN0cmluZyBjbGFzc19uYW1lID0gc3RydWN0X2RlZi5uYW1lICsgIlQiOwotICAgIHN0ZDo6c3RyaW5nIGNvZGUgPSAiICAiICsgY2xhc3NfbmFtZSArICIgdW5wYWNrKCkgPT4gIiArIGNsYXNzX25hbWUgKyAiKCI7CisgICAgY29uc3Qgc3RkOjpzdHJpbmcgb2JqZWN0X3R5cGUgPSBuYW1lcl8uT2JqZWN0VHlwZShzdHJ1Y3RfZGVmKTsKKyAgICBzdGQ6OnN0cmluZyBjb2RlID0gIiAgIiArIG9iamVjdF90eXBlICsgIiB1bnBhY2soKSA9PiAiICsgb2JqZWN0X3R5cGUgKyAiKCI7CiAgICAgaWYgKCFjb25zdHJ1Y3Rvcl9hcmdzLmVtcHR5KCkpIGNvZGUgKz0gIlxuIiArIGNvbnN0cnVjdG9yX2FyZ3M7CiAgICAgY29kZSArPSAiKTtcbiI7CiAgICAgcmV0dXJuIGNvZGU7CkBAIC02NDAsNyArNjAwLDcgQEAKICAgICBpZiAoc3RkOjplcXVhbChyb290X25hbWVzcGFjZS0+Y29tcG9uZW50cy5iZWdpbigpLAogICAgICAgICAgICAgICAgICAgIHJvb3RfbmFtZXNwYWNlLT5jb21wb25lbnRzLmVuZCgpLAogICAgICAgICAgICAgICAgICAgIHF1YWxpZmllZF9uYW1lX3BhcnRzLmJlZ2luKCkpKSB7Ci0gICAgICByZXR1cm4gdHlwZS5zdHJ1Y3RfZGVmLT5uYW1lOworICAgICAgcmV0dXJuIG5hbWVyXy5UeXBlKCp0eXBlLnN0cnVjdF9kZWYpOwogICAgIH0KIAogICAgIHN0ZDo6c3RyaW5nIG5zOwpAQCAtNjYwLDM5ICs2MjAsMzUgQEAKICAgICAgIGlmIChpdCAhPSBxdWFsaWZpZWRfbmFtZV9wYXJ0cy5lbmQoKSAtIDEpIHsgbnMgKz0gIl8iOyB9CiAgICAgfQogCi0gICAgcmV0dXJuIG5zICsgIi4iICsgdHlwZS5zdHJ1Y3RfZGVmLT5uYW1lOworICAgIHJldHVybiBucyArICIuIiArIG5hbWVyXy5UeXBlKCp0eXBlLnN0cnVjdF9kZWYpOwogICB9CiAKICAgdm9pZCBHZW5JbXBsZW1lbnRhdGlvbkdldHRlcnMoCiAgICAgICBjb25zdCBTdHJ1Y3REZWYgJnN0cnVjdF9kZWYsCi0gICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnBhaXI8aW50LCBGaWVsZERlZiAqPj4gbm9uX2RlcHJlY2F0ZWRfZmllbGRzLAotICAgICAgc3RkOjpzdHJpbmcgKmNvZGVfcHRyKSB7Ci0gICAgYXV0byAmY29kZSA9ICpjb2RlX3B0cjsKLQorICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpwYWlyPGludCwgRmllbGREZWYgKj4+ICZub25fZGVwcmVjYXRlZF9maWVsZHMsCisgICAgICBzdGQ6OnN0cmluZyAmY29kZSkgewogICAgIGZvciAoYXV0byBpdCA9IG5vbl9kZXByZWNhdGVkX2ZpZWxkcy5iZWdpbigpOwogICAgICAgICAgaXQgIT0gbm9uX2RlcHJlY2F0ZWRfZmllbGRzLmVuZCgpOyArK2l0KSB7Ci0gICAgICBhdXRvIHBhaXIgPSAqaXQ7Ci0gICAgICBhdXRvICZmaWVsZCA9ICpwYWlyLnNlY29uZDsKKyAgICAgIGNvbnN0IEZpZWxkRGVmICZmaWVsZCA9ICppdC0+c2Vjb25kOwogCi0gICAgICBzdGQ6OnN0cmluZyBmaWVsZF9uYW1lID0gQ29udmVydENhc2UoZmllbGQubmFtZSwgQ2FzZTo6a0xvd2VyQ2FtZWwpOwotICAgICAgc3RkOjpzdHJpbmcgZGVmYXVsdFZhbHVlID0gZ2V0RGVmYXVsdFZhbHVlKGZpZWxkLnZhbHVlKTsKLSAgICAgIGJvb2wgaXNOdWxsYWJsZSA9IGRlZmF1bHRWYWx1ZS5lbXB0eSgpICYmICFzdHJ1Y3RfZGVmLmZpeGVkOwotICAgICAgc3RkOjpzdHJpbmcgdHlwZV9uYW1lID0KKyAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nIGZpZWxkX25hbWUgPSBuYW1lcl8uRmllbGQoZmllbGQpOworICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgZGVmYXVsdFZhbHVlID0gZ2V0RGVmYXVsdFZhbHVlKGZpZWxkLnZhbHVlKTsKKyAgICAgIGNvbnN0IGJvb2wgaXNOdWxsYWJsZSA9IGRlZmF1bHRWYWx1ZS5lbXB0eSgpICYmICFzdHJ1Y3RfZGVmLmZpeGVkOworICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgdHlwZV9uYW1lID0KICAgICAgICAgICBHZW5EYXJ0VHlwZU5hbWUoZmllbGQudmFsdWUudHlwZSwgc3RydWN0X2RlZi5kZWZpbmVkX25hbWVzcGFjZSwgZmllbGQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzTnVsbGFibGUsICIiKTsKIAotICAgICAgR2VuRG9jQ29tbWVudChmaWVsZC5kb2NfY29tbWVudCwgJmNvZGUsICIiLCAiICAiKTsKKyAgICAgIEdlbkRvY0NvbW1lbnQoZmllbGQuZG9jX2NvbW1lbnQsICIgICIsIGNvZGUpOwogCiAgICAgICBjb2RlICs9ICIgICIgKyB0eXBlX25hbWUgKyAiIGdldCAiICsgZmllbGRfbmFtZTsKICAgICAgIGlmIChmaWVsZC52YWx1ZS50eXBlLmJhc2VfdHlwZSA9PSBCQVNFX1RZUEVfVU5JT04pIHsKICAgICAgICAgY29kZSArPSAiIHtcbiI7CiAgICAgICAgIGNvZGUgKz0gIiAgICBzd2l0Y2ggKCIgKyBmaWVsZF9uYW1lICsgIlR5cGU/LnZhbHVlKSB7XG4iOwotICAgICAgICBhdXRvICZlbnVtX2RlZiA9ICpmaWVsZC52YWx1ZS50eXBlLmVudW1fZGVmOworICAgICAgICBjb25zdCBhdXRvICZlbnVtX2RlZiA9ICpmaWVsZC52YWx1ZS50eXBlLmVudW1fZGVmOwogICAgICAgICBmb3IgKGF1dG8gZW5faXQgPSBlbnVtX2RlZi5WYWxzKCkuYmVnaW4oKSArIDE7CiAgICAgICAgICAgICAgZW5faXQgIT0gZW51bV9kZWYuVmFscygpLmVuZCgpOyArK2VuX2l0KSB7Ci0gICAgICAgICAgYXV0byAmZXYgPSAqKmVuX2l0OwotCi0gICAgICAgICAgYXV0byBlbnVtX25hbWUgPSBOYW1lc3BhY2VBbGlhc0Zyb21VbmlvblR5cGUoCisgICAgICAgICAgY29uc3QgYXV0byAmZXYgPSAqKmVuX2l0OworICAgICAgICAgIGNvbnN0IGF1dG8gZW51bV9uYW1lID0gTmFtZXNwYWNlQWxpYXNGcm9tVW5pb25UeXBlKAogICAgICAgICAgICAgICBlbnVtX2RlZi5kZWZpbmVkX25hbWVzcGFjZSwgZXYudW5pb25fdHlwZSk7CiAgICAgICAgICAgY29kZSArPSAiICAgICAgY2FzZSAiICsgZW51bV9kZWYuVG9TdHJpbmcoZXYpICsgIjogcmV0dXJuICIgKwogICAgICAgICAgICAgICAgICAgZW51bV9uYW1lICsgIi5yZWFkZXIudlRhYmxlR2V0TnVsbGFibGUoX2JjLCBfYmNPZmZzZXQsICIgKwpAQCAtNzMzLDcgKzY4OSw3IEBACiAgICAgfQogCiAgICAgY29kZSArPSAiXG4iOwotICAgIGNvZGUgKz0gR2VuVG9TdHJpbmcoc3RydWN0X2RlZi5uYW1lLCBub25fZGVwcmVjYXRlZF9maWVsZHMpOworICAgIGNvZGUgKz0gR2VuVG9TdHJpbmcobmFtZXJfLlR5cGUoc3RydWN0X2RlZiksIG5vbl9kZXByZWNhdGVkX2ZpZWxkcyk7CiAgIH0KIAogICBzdGQ6OnN0cmluZyBHZW5Ub1N0cmluZygKQEAgLTc0NSwxMCArNzAxLDE1IEBACiAgICAgY29kZSArPSAiICAgIHJldHVybiAnIiArIG9iamVjdF9uYW1lICsgInsiOwogICAgIGZvciAoYXV0byBpdCA9IG5vbl9kZXByZWNhdGVkX2ZpZWxkcy5iZWdpbigpOwogICAgICAgICAgaXQgIT0gbm9uX2RlcHJlY2F0ZWRfZmllbGRzLmVuZCgpOyArK2l0KSB7Ci0gICAgICBhdXRvIHBhaXIgPSAqaXQ7Ci0gICAgICBhdXRvICZmaWVsZCA9ICpwYWlyLnNlY29uZDsKLSAgICAgIGNvZGUgKz0gQ29udmVydENhc2UoZmllbGQubmFtZSwgQ2FzZTo6a0xvd2VyQ2FtZWwpICsgIjogJCIgKwotICAgICAgICAgICAgICBDb252ZXJ0Q2FzZShmaWVsZC5uYW1lLCBDYXNlOjprTG93ZXJDYW1lbCk7CisgICAgICBjb25zdCBzdGQ6OnN0cmluZyBmaWVsZCA9IG5hbWVyXy5GaWVsZCgqaXQtPnNlY29uZCk7CisgICAgICAvLyBXZSBuZWVkIHRvIGVzY2FwZSB0aGUgZmFjdCB0aGF0IHNvbWUgZmllbGRzIGhhdmUgJCBpbiB0aGUgbmFtZSB3aGljaCBpcworICAgICAgLy8gYWxzbyB1c2VkIGluIHN5bWJvbC9zdHJpbmcgc3Vic3RpdHV0aW9uLgorICAgICAgc3RkOjpzdHJpbmcgZXNjYXBlZF9maWVsZDsKKyAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgZmllbGQuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgaWYgKGZpZWxkW2ldID09ICckJykgZXNjYXBlZF9maWVsZC5wdXNoX2JhY2soJ1xcJyk7CisgICAgICAgIGVzY2FwZWRfZmllbGQucHVzaF9iYWNrKGZpZWxkW2ldKTsKKyAgICAgIH0KKyAgICAgIGNvZGUgKz0gZXNjYXBlZF9maWVsZCArICI6ICR7IiArIGZpZWxkICsgIn0iOwogICAgICAgaWYgKGl0ICE9IG5vbl9kZXByZWNhdGVkX2ZpZWxkcy5lbmQoKSAtIDEpIHsgY29kZSArPSAiLCAiOyB9CiAgICAgfQogICAgIGNvZGUgKz0gIn0nO1xuIjsKQEAgLTc3OSwxMSArNzQwLDkgQEAKICAgICB9CiAgIH0KIAotICB2b2lkIEdlblJlYWRlcihjb25zdCBTdHJ1Y3REZWYgJnN0cnVjdF9kZWYsIHN0ZDo6c3RyaW5nICpyZWFkZXJfbmFtZV9wdHIsCi0gICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nICpjb2RlX3B0cikgewotICAgIGF1dG8gJmNvZGUgPSAqY29kZV9wdHI7Ci0gICAgYXV0byAmcmVhZGVyX25hbWUgPSAqcmVhZGVyX25hbWVfcHRyOwotICAgIGF1dG8gJmltcGxfbmFtZSA9IHN0cnVjdF9kZWYubmFtZTsKKyAgdm9pZCBHZW5SZWFkZXIoY29uc3QgU3RydWN0RGVmICZzdHJ1Y3RfZGVmLCBjb25zdCBzdGQ6OnN0cmluZyAmcmVhZGVyX25hbWUsCisgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nICZjb2RlKSB7CisgICAgY29uc3QgYXV0byBzdHJ1Y3RfdHlwZSA9IG5hbWVyXy5UeXBlKHN0cnVjdF9kZWYpOwogCiAgICAgY29kZSArPSAiY2xhc3MgIiArIHJlYWRlcl9uYW1lICsgIiBleHRlbmRzICIgKyBfa0ZiOwogICAgIGlmIChzdHJ1Y3RfZGVmLmZpeGVkKSB7CkBAIC03OTEsNyArNzUwLDcgQEAKICAgICB9IGVsc2UgewogICAgICAgY29kZSArPSAiLlRhYmxlUmVhZGVyPCI7CiAgICAgfQotICAgIGNvZGUgKz0gaW1wbF9uYW1lICsgIj4ge1xuIjsKKyAgICBjb2RlICs9IHN0cnVjdF90eXBlICsgIj4ge1xuIjsKICAgICBjb2RlICs9ICIgIGNvbnN0ICIgKyByZWFkZXJfbmFtZSArICIoKTtcblxuIjsKIAogICAgIGlmIChzdHJ1Y3RfZGVmLmZpeGVkKSB7CkBAIC03OTksMjcgKzc1OCwyNiBAQAogICAgICAgY29kZSArPSAiICBpbnQgZ2V0IHNpemUgPT4gIiArIE51bVRvU3RyaW5nKHN0cnVjdF9kZWYuYnl0ZXNpemUpICsgIjtcblxuIjsKICAgICB9CiAgICAgY29kZSArPSAiICBAb3ZlcnJpZGVcbiI7Ci0gICAgY29kZSArPSAiICAiICsgaW1wbF9uYW1lICsKKyAgICBjb2RlICs9ICIgICIgKyBzdHJ1Y3RfdHlwZSArCiAgICAgICAgICAgICAiIGNyZWF0ZU9iamVjdChmYi5CdWZmZXJDb250ZXh0IGJjLCBpbnQgb2Zmc2V0KSA9PiBcbiAgICAiICsKLSAgICAgICAgICAgIGltcGxfbmFtZSArICIuXyhiYywgb2Zmc2V0KTtcbiI7CisgICAgICAgICAgICBzdHJ1Y3RfdHlwZSArICIuXyhiYywgb2Zmc2V0KTtcbiI7CiAgICAgY29kZSArPSAifVxuXG4iOwogICB9CiAKLSAgdm9pZCBHZW5CdWlsZGVyKGNvbnN0IFN0cnVjdERlZiAmc3RydWN0X2RlZiwKLSAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6cGFpcjxpbnQsIEZpZWxkRGVmICo+PiBub25fZGVwcmVjYXRlZF9maWVsZHMsCi0gICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyAqYnVpbGRlcl9uYW1lX3B0ciwgc3RkOjpzdHJpbmcgKmNvZGVfcHRyKSB7CisgIHZvaWQgR2VuQnVpbGRlcigKKyAgICAgIGNvbnN0IFN0cnVjdERlZiAmc3RydWN0X2RlZiwKKyAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6cGFpcjxpbnQsIEZpZWxkRGVmICo+PiAmbm9uX2RlcHJlY2F0ZWRfZmllbGRzLAorICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgJmJ1aWxkZXJfbmFtZSwgc3RkOjpzdHJpbmcgJmNvZGUpIHsKICAgICBpZiAobm9uX2RlcHJlY2F0ZWRfZmllbGRzLnNpemUoKSA9PSAwKSB7IHJldHVybjsgfQotICAgIGF1dG8gJmNvZGUgPSAqY29kZV9wdHI7Ci0gICAgYXV0byAmYnVpbGRlcl9uYW1lID0gKmJ1aWxkZXJfbmFtZV9wdHI7CiAKICAgICBjb2RlICs9ICJjbGFzcyAiICsgYnVpbGRlcl9uYW1lICsgIiB7XG4iOwogICAgIGNvZGUgKz0gIiAgIiArIGJ1aWxkZXJfbmFtZSArICIodGhpcy5mYkJ1aWxkZXIpO1xuXG4iOwogICAgIGNvZGUgKz0gIiAgZmluYWwgIiArIF9rRmIgKyAiLkJ1aWxkZXIgZmJCdWlsZGVyO1xuXG4iOwogCiAgICAgaWYgKHN0cnVjdF9kZWYuZml4ZWQpIHsKLSAgICAgIFN0cnVjdEJ1aWxkZXJCb2R5KHN0cnVjdF9kZWYsIG5vbl9kZXByZWNhdGVkX2ZpZWxkcywgY29kZV9wdHIpOworICAgICAgU3RydWN0QnVpbGRlckJvZHkoc3RydWN0X2RlZiwgbm9uX2RlcHJlY2F0ZWRfZmllbGRzLCBjb2RlKTsKICAgICB9IGVsc2UgewotICAgICAgVGFibGVCdWlsZGVyQm9keShzdHJ1Y3RfZGVmLCBub25fZGVwcmVjYXRlZF9maWVsZHMsIGNvZGVfcHRyKTsKKyAgICAgIFRhYmxlQnVpbGRlckJvZHkoc3RydWN0X2RlZiwgbm9uX2RlcHJlY2F0ZWRfZmllbGRzLCBjb2RlKTsKICAgICB9CiAKICAgICBjb2RlICs9ICJ9XG5cbiI7CkBAIC04MjcsMTUgKzc4NSwxMyBAQAogCiAgIHZvaWQgU3RydWN0QnVpbGRlckJvZHkoCiAgICAgICBjb25zdCBTdHJ1Y3REZWYgJnN0cnVjdF9kZWYsCi0gICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnBhaXI8aW50LCBGaWVsZERlZiAqPj4gbm9uX2RlcHJlY2F0ZWRfZmllbGRzLAotICAgICAgc3RkOjpzdHJpbmcgKmNvZGVfcHRyKSB7Ci0gICAgYXV0byAmY29kZSA9ICpjb2RlX3B0cjsKLQorICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpwYWlyPGludCwgRmllbGREZWYgKj4+ICZub25fZGVwcmVjYXRlZF9maWVsZHMsCisgICAgICBzdGQ6OnN0cmluZyAmY29kZSkgewogICAgIGNvZGUgKz0gIiAgaW50IGZpbmlzaCgiOwogICAgIGZvciAoYXV0byBpdCA9IG5vbl9kZXByZWNhdGVkX2ZpZWxkcy5iZWdpbigpOwogICAgICAgICAgaXQgIT0gbm9uX2RlcHJlY2F0ZWRfZmllbGRzLmVuZCgpOyArK2l0KSB7Ci0gICAgICBhdXRvIHBhaXIgPSAqaXQ7Ci0gICAgICBhdXRvICZmaWVsZCA9ICpwYWlyLnNlY29uZDsKKyAgICAgIGNvbnN0IEZpZWxkRGVmICZmaWVsZCA9ICppdC0+c2Vjb25kOworICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgZmllbGRfbmFtZSA9IG5hbWVyXy5GaWVsZChmaWVsZCk7CiAKICAgICAgIGlmIChJc1N0cnVjdChmaWVsZC52YWx1ZS50eXBlKSkgewogICAgICAgICBjb2RlICs9ICJmYi5TdHJ1Y3RCdWlsZGVyIjsKQEAgLTg0MywyNSArNzk5LDI1IEBACiAgICAgICAgIGNvZGUgKz0gR2VuRGFydFR5cGVOYW1lKGZpZWxkLnZhbHVlLnR5cGUsIHN0cnVjdF9kZWYuZGVmaW5lZF9uYW1lc3BhY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkKTsKICAgICAgIH0KLSAgICAgIGNvZGUgKz0gIiAiICsgZmllbGQubmFtZTsKKyAgICAgIGNvZGUgKz0gIiAiICsgZmllbGRfbmFtZTsKICAgICAgIGlmIChpdCAhPSBub25fZGVwcmVjYXRlZF9maWVsZHMuZW5kKCkgLSAxKSB7IGNvZGUgKz0gIiwgIjsgfQogICAgIH0KICAgICBjb2RlICs9ICIpIHtcbiI7CiAKICAgICBmb3IgKGF1dG8gaXQgPSBub25fZGVwcmVjYXRlZF9maWVsZHMucmJlZ2luKCk7CiAgICAgICAgICBpdCAhPSBub25fZGVwcmVjYXRlZF9maWVsZHMucmVuZCgpOyArK2l0KSB7Ci0gICAgICBhdXRvIHBhaXIgPSAqaXQ7Ci0gICAgICBhdXRvICZmaWVsZCA9ICpwYWlyLnNlY29uZDsKKyAgICAgIGNvbnN0IEZpZWxkRGVmICZmaWVsZCA9ICppdC0+c2Vjb25kOworICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgZmllbGRfbmFtZSA9IG5hbWVyXy5GaWVsZChmaWVsZCk7CiAKICAgICAgIGlmIChmaWVsZC5wYWRkaW5nKSB7CiAgICAgICAgIGNvZGUgKz0gIiAgICBmYkJ1aWxkZXIucGFkKCIgKyBOdW1Ub1N0cmluZyhmaWVsZC5wYWRkaW5nKSArICIpO1xuIjsKICAgICAgIH0KIAogICAgICAgaWYgKElzU3RydWN0KGZpZWxkLnZhbHVlLnR5cGUpKSB7Ci0gICAgICAgIGNvZGUgKz0gIiAgICAiICsgZmllbGQubmFtZSArICIoKTtcbiI7CisgICAgICAgIGNvZGUgKz0gIiAgICAiICsgZmllbGRfbmFtZSArICIoKTtcbiI7CiAgICAgICB9IGVsc2UgewogICAgICAgICBjb2RlICs9ICIgICAgZmJCdWlsZGVyLnB1dCIgKyBHZW5UeXBlKGZpZWxkLnZhbHVlLnR5cGUpICsgIigiOwotICAgICAgICBjb2RlICs9IGZpZWxkLm5hbWU7CisgICAgICAgIGNvZGUgKz0gZmllbGRfbmFtZTsKICAgICAgICAgaWYgKGZpZWxkLnZhbHVlLnR5cGUuZW51bV9kZWYpIHsgY29kZSArPSAiLnZhbHVlIjsgfQogICAgICAgICBjb2RlICs9ICIpO1xuIjsKICAgICAgIH0KQEAgLTg3MiwxMCArODI4LDggQEAKIAogICB2b2lkIFRhYmxlQnVpbGRlckJvZHkoCiAgICAgICBjb25zdCBTdHJ1Y3REZWYgJnN0cnVjdF9kZWYsCi0gICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnBhaXI8aW50LCBGaWVsZERlZiAqPj4gbm9uX2RlcHJlY2F0ZWRfZmllbGRzLAotICAgICAgc3RkOjpzdHJpbmcgKmNvZGVfcHRyKSB7Ci0gICAgYXV0byAmY29kZSA9ICpjb2RlX3B0cjsKLQorICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpwYWlyPGludCwgRmllbGREZWYgKj4+ICZub25fZGVwcmVjYXRlZF9maWVsZHMsCisgICAgICBzdGQ6OnN0cmluZyAmY29kZSkgewogICAgIGNvZGUgKz0gIiAgdm9pZCBiZWdpbigpIHtcbiI7CiAgICAgY29kZSArPSAiICAgIGZiQnVpbGRlci5zdGFydFRhYmxlKCIgKwogICAgICAgICAgICAgTnVtVG9TdHJpbmcoc3RydWN0X2RlZi5maWVsZHMudmVjLnNpemUoKSkgKyAiKTtcbiI7CkBAIC04ODMsMjggKzgzNywyNyBAQAogCiAgICAgZm9yIChhdXRvIGl0ID0gbm9uX2RlcHJlY2F0ZWRfZmllbGRzLmJlZ2luKCk7CiAgICAgICAgICBpdCAhPSBub25fZGVwcmVjYXRlZF9maWVsZHMuZW5kKCk7ICsraXQpIHsKLSAgICAgIGF1dG8gcGFpciA9ICppdDsKLSAgICAgIGF1dG8gJmZpZWxkID0gKnBhaXIuc2Vjb25kOwotICAgICAgYXV0byBvZmZzZXQgPSBwYWlyLmZpcnN0OworICAgICAgY29uc3QgYXV0byAmZmllbGQgPSAqaXQtPnNlY29uZDsKKyAgICAgIGNvbnN0IGF1dG8gb2Zmc2V0ID0gaXQtPmZpcnN0OworICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgYWRkX2ZpZWxkID0gbmFtZXJfLk1ldGhvZCgiYWRkIiwgZmllbGQpOworICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgZmllbGRfdmFyID0gbmFtZXJfLlZhcmlhYmxlKGZpZWxkKTsKIAogICAgICAgaWYgKElzU2NhbGFyKGZpZWxkLnZhbHVlLnR5cGUuYmFzZV90eXBlKSkgewotICAgICAgICBjb2RlICs9ICIgIGludCBhZGQiICsgQ29udmVydENhc2UoZmllbGQubmFtZSwgQ2FzZTo6a1VwcGVyQ2FtZWwpICsgIigiOworICAgICAgICBjb2RlICs9ICIgIGludCAiICsgYWRkX2ZpZWxkICsgIigiOwogICAgICAgICBjb2RlICs9IEdlbkRhcnRUeXBlTmFtZShmaWVsZC52YWx1ZS50eXBlLCBzdHJ1Y3RfZGVmLmRlZmluZWRfbmFtZXNwYWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZCk7Ci0gICAgICAgIGNvZGUgKz0gIj8gIiArIENvbnZlcnRDYXNlKGZpZWxkLm5hbWUsIENhc2U6OmtMb3dlckNhbWVsKSArICIpIHtcbiI7CisgICAgICAgIGNvZGUgKz0gIj8gIiArIGZpZWxkX3ZhciArICIpIHtcbiI7CiAgICAgICAgIGNvZGUgKz0gIiAgICBmYkJ1aWxkZXIuYWRkIiArIEdlblR5cGUoZmllbGQudmFsdWUudHlwZSkgKyAiKCIgKwogICAgICAgICAgICAgICAgIE51bVRvU3RyaW5nKG9mZnNldCkgKyAiLCAiOwotICAgICAgICBjb2RlICs9IENvbnZlcnRDYXNlKGZpZWxkLm5hbWUsIENhc2U6OmtMb3dlckNhbWVsKTsKKyAgICAgICAgY29kZSArPSBmaWVsZF92YXI7CiAgICAgICAgIGlmIChmaWVsZC52YWx1ZS50eXBlLmVudW1fZGVmKSB7IGNvZGUgKz0gIj8udmFsdWUiOyB9CiAgICAgICAgIGNvZGUgKz0gIik7XG4iOwogICAgICAgfSBlbHNlIGlmIChJc1N0cnVjdChmaWVsZC52YWx1ZS50eXBlKSkgewotICAgICAgICBjb2RlICs9ICIgIGludCBhZGQiICsgQ29udmVydENhc2UoZmllbGQubmFtZSwgQ2FzZTo6a1VwcGVyQ2FtZWwpICsKLSAgICAgICAgICAgICAgICAiKGludCBvZmZzZXQpIHtcbiI7CisgICAgICAgIGNvZGUgKz0gIiAgaW50ICIgKyBhZGRfZmllbGQgKyAiKGludCBvZmZzZXQpIHtcbiI7CiAgICAgICAgIGNvZGUgKz0KICAgICAgICAgICAgICIgICAgZmJCdWlsZGVyLmFkZFN0cnVjdCgiICsgTnVtVG9TdHJpbmcob2Zmc2V0KSArICIsIG9mZnNldCk7XG4iOwogICAgICAgfSBlbHNlIHsKLSAgICAgICAgY29kZSArPSAiICBpbnQgYWRkIiArIENvbnZlcnRDYXNlKGZpZWxkLm5hbWUsIENhc2U6OmtVcHBlckNhbWVsKSArCi0gICAgICAgICAgICAgICAgIk9mZnNldChpbnQ/IG9mZnNldCkge1xuIjsKKyAgICAgICAgY29kZSArPSAiICBpbnQgIiArIGFkZF9maWVsZCArICJPZmZzZXQoaW50PyBvZmZzZXQpIHtcbiI7CiAgICAgICAgIGNvZGUgKz0KICAgICAgICAgICAgICIgICAgZmJCdWlsZGVyLmFkZE9mZnNldCgiICsgTnVtVG9TdHJpbmcob2Zmc2V0KSArICIsIG9mZnNldCk7XG4iOwogICAgICAgfQpAQCAtOTIwLDIxICs4NzMsMTcgQEAKIAogICB2b2lkIEdlbk9iamVjdEJ1aWxkZXIoCiAgICAgICBjb25zdCBTdHJ1Y3REZWYgJnN0cnVjdF9kZWYsCi0gICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnBhaXI8aW50LCBGaWVsZERlZiAqPj4gbm9uX2RlcHJlY2F0ZWRfZmllbGRzLAotICAgICAgc3RkOjpzdHJpbmcgKmJ1aWxkZXJfbmFtZV9wdHIsIHN0ZDo6c3RyaW5nICpjb2RlX3B0cikgewotICAgIGF1dG8gJmNvZGUgPSAqY29kZV9wdHI7Ci0gICAgYXV0byAmYnVpbGRlcl9uYW1lID0gKmJ1aWxkZXJfbmFtZV9wdHI7Ci0KKyAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6cGFpcjxpbnQsIEZpZWxkRGVmICo+PiAmbm9uX2RlcHJlY2F0ZWRfZmllbGRzLAorICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgJmJ1aWxkZXJfbmFtZSwgc3RkOjpzdHJpbmcgJmNvZGUpIHsKICAgICBjb2RlICs9ICJjbGFzcyAiICsgYnVpbGRlcl9uYW1lICsgIiBleHRlbmRzICIgKyBfa0ZiICsgIi5PYmplY3RCdWlsZGVyIHtcbiI7CiAgICAgZm9yIChhdXRvIGl0ID0gbm9uX2RlcHJlY2F0ZWRfZmllbGRzLmJlZ2luKCk7CiAgICAgICAgICBpdCAhPSBub25fZGVwcmVjYXRlZF9maWVsZHMuZW5kKCk7ICsraXQpIHsKLSAgICAgIGF1dG8gcGFpciA9ICppdDsKLSAgICAgIGF1dG8gJmZpZWxkID0gKnBhaXIuc2Vjb25kOworICAgICAgY29uc3QgRmllbGREZWYgJmZpZWxkID0gKml0LT5zZWNvbmQ7CiAKICAgICAgIGNvZGUgKz0gIiAgZmluYWwgIiArCiAgICAgICAgICAgICAgIEdlbkRhcnRUeXBlTmFtZShmaWVsZC52YWx1ZS50eXBlLCBzdHJ1Y3RfZGVmLmRlZmluZWRfbmFtZXNwYWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQsICFzdHJ1Y3RfZGVmLmZpeGVkLCAiT2JqZWN0QnVpbGRlciIpICsKLSAgICAgICAgICAgICAgIiBfIiArIENvbnZlcnRDYXNlKGZpZWxkLm5hbWUsIENhc2U6OmtMb3dlckNhbWVsKSArICI7XG4iOworICAgICAgICAgICAgICAiIF8iICsgbmFtZXJfLlZhcmlhYmxlKGZpZWxkKSArICI7XG4iOwogICAgIH0KICAgICBjb2RlICs9ICJcbiI7CiAgICAgY29kZSArPSAiICAiICsgYnVpbGRlcl9uYW1lICsgIigiOwpAQCAtOTQzLDI0ICs4OTIsMjEgQEAKICAgICAgIGNvZGUgKz0gIntcbiI7CiAgICAgICBmb3IgKGF1dG8gaXQgPSBub25fZGVwcmVjYXRlZF9maWVsZHMuYmVnaW4oKTsKICAgICAgICAgICAgaXQgIT0gbm9uX2RlcHJlY2F0ZWRfZmllbGRzLmVuZCgpOyArK2l0KSB7Ci0gICAgICAgIGF1dG8gcGFpciA9ICppdDsKLSAgICAgICAgYXV0byAmZmllbGQgPSAqcGFpci5zZWNvbmQ7CisgICAgICAgIGNvbnN0IEZpZWxkRGVmICZmaWVsZCA9ICppdC0+c2Vjb25kOwogCiAgICAgICAgIGNvZGUgKz0gIiAgICAiOwogICAgICAgICBjb2RlICs9IChzdHJ1Y3RfZGVmLmZpeGVkID8gInJlcXVpcmVkICIgOiAiIikgKwogICAgICAgICAgICAgICAgIEdlbkRhcnRUeXBlTmFtZShmaWVsZC52YWx1ZS50eXBlLCBzdHJ1Y3RfZGVmLmRlZmluZWRfbmFtZXNwYWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZCwgIXN0cnVjdF9kZWYuZml4ZWQsICJPYmplY3RCdWlsZGVyIikgKwotICAgICAgICAgICAgICAgICIgIiArIENvbnZlcnRDYXNlKGZpZWxkLm5hbWUsIENhc2U6OmtMb3dlckNhbWVsKSArICIsXG4iOworICAgICAgICAgICAgICAgICIgIiArIG5hbWVyXy5WYXJpYWJsZShmaWVsZCkgKyAiLFxuIjsKICAgICAgIH0KICAgICAgIGNvZGUgKz0gIiAgfSlcbiI7CiAgICAgICBjb2RlICs9ICIgICAgICA6ICI7CiAgICAgICBmb3IgKGF1dG8gaXQgPSBub25fZGVwcmVjYXRlZF9maWVsZHMuYmVnaW4oKTsKICAgICAgICAgICAgaXQgIT0gbm9uX2RlcHJlY2F0ZWRfZmllbGRzLmVuZCgpOyArK2l0KSB7Ci0gICAgICAgIGF1dG8gcGFpciA9ICppdDsKLSAgICAgICAgYXV0byAmZmllbGQgPSAqcGFpci5zZWNvbmQ7CisgICAgICAgIGNvbnN0IEZpZWxkRGVmICZmaWVsZCA9ICppdC0+c2Vjb25kOwogCi0gICAgICAgIGNvZGUgKz0gIl8iICsgQ29udmVydENhc2UoZmllbGQubmFtZSwgQ2FzZTo6a0xvd2VyQ2FtZWwpICsgIiA9ICIgKwotICAgICAgICAgICAgICAgIENvbnZlcnRDYXNlKGZpZWxkLm5hbWUsIENhc2U6OmtMb3dlckNhbWVsKTsKKyAgICAgICAgY29kZSArPSAiXyIgKyBuYW1lcl8uVmFyaWFibGUoZmllbGQpICsgIiA9ICIgKyBuYW1lcl8uVmFyaWFibGUoZmllbGQpOwogICAgICAgICBpZiAoaXQgPT0gbm9uX2RlcHJlY2F0ZWRfZmllbGRzLmVuZCgpIC0gMSkgewogICAgICAgICAgIGNvZGUgKz0gIjtcblxuIjsKICAgICAgICAgfSBlbHNlIHsKQEAgLTEwMDAsMTEgKzk0Niw5IEBACiAgICAgICBpZiAoSXNTY2FsYXIoZmllbGQudmFsdWUudHlwZS5iYXNlX3R5cGUpIHx8IElzU3RydWN0KGZpZWxkLnZhbHVlLnR5cGUpKQogICAgICAgICBjb250aW51ZTsKIAotICAgICAgc3RkOjpzdHJpbmcgb2Zmc2V0X25hbWUgPQotICAgICAgICAgIENvbnZlcnRDYXNlKGZpZWxkLm5hbWUsIENhc2U6OmtMb3dlckNhbWVsKSArICJPZmZzZXQiOwotICAgICAgc3RkOjpzdHJpbmcgZmllbGRfbmFtZSA9IChwcmVwZW5kVW5kZXJzY29yZSA/ICJfIiA6ICIiKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udmVydENhc2UoZmllbGQubmFtZSwgQ2FzZTo6a0xvd2VyQ2FtZWwpOwotCisgICAgICBzdGQ6OnN0cmluZyBvZmZzZXRfbmFtZSA9IG5hbWVyXy5WYXJpYWJsZShmaWVsZCkgKyAiT2Zmc2V0IjsKKyAgICAgIHN0ZDo6c3RyaW5nIGZpZWxkX25hbWUgPQorICAgICAgICAgIChwcmVwZW5kVW5kZXJzY29yZSA/ICJfIiA6ICIiKSArIG5hbWVyXy5WYXJpYWJsZShmaWVsZCk7CiAgICAgICAvLyBjdXN0b20gaGFuZGxpbmcgZm9yIGZpeGVkLXNpemVkIHN0cnVjdCBpbiBwYWNrKCkKICAgICAgIGlmIChwYWNrICYmIElzVmVjdG9yKGZpZWxkLnZhbHVlLnR5cGUpICYmCiAgICAgICAgICAgZmllbGQudmFsdWUudHlwZS5WZWN0b3JUeXBlKCkuYmFzZV90eXBlID09IEJBU0VfVFlQRV9TVFJVQ1QgJiYKQEAgLTEwMTMsNyArOTU3LDcgQEAKICAgICAgICAgY29kZSArPSAiICAgIGlmICgiICsgZmllbGRfbmFtZSArICIgIT0gbnVsbCkge1xuIjsKICAgICAgICAgY29kZSArPQogICAgICAgICAgICAgIiAgICAgIGZvciAodmFyIGUgaW4gIiArIGZpZWxkX25hbWUgKyAiISkgeyBlLnBhY2soZmJCdWlsZGVyKTsgfVxuIjsKLSAgICAgICAgY29kZSArPSAiICAgICAgIiArIENvbnZlcnRDYXNlKGZpZWxkLm5hbWUsIENhc2U6OmtMb3dlckNhbWVsKSArCisgICAgICAgIGNvZGUgKz0gIiAgICAgICIgKyBuYW1lcl8uVmFyaWFibGUoZmllbGQpICsKICAgICAgICAgICAgICAgICAiT2Zmc2V0ID0gZmJCdWlsZGVyLmVuZFN0cnVjdFZlY3RvcigiICsgZmllbGRfbmFtZSArCiAgICAgICAgICAgICAgICAgIiEubGVuZ3RoKTtcbiI7CiAgICAgICAgIGNvZGUgKz0gIiAgICB9XG4iOwpAQCAtMTA3Miw4ICsxMDE2LDggQEAKIAogICAgIGZvciAoYXV0byBpdCA9IG5vbl9kZXByZWNhdGVkX2ZpZWxkcy5yYmVnaW4oKTsKICAgICAgICAgIGl0ICE9IG5vbl9kZXByZWNhdGVkX2ZpZWxkcy5yZW5kKCk7ICsraXQpIHsKLSAgICAgIGF1dG8gcGFpciA9ICppdDsKLSAgICAgIGF1dG8gJmZpZWxkID0gKnBhaXIuc2Vjb25kOworICAgICAgY29uc3QgRmllbGREZWYgJmZpZWxkID0gKml0LT5zZWNvbmQ7CisgICAgICBjb25zdCBzdGQ6OnN0cmluZyBmaWVsZF9uYW1lID0gbmFtZXJfLkZpZWxkKGZpZWxkKTsKIAogICAgICAgaWYgKGZpZWxkLnBhZGRpbmcpIHsKICAgICAgICAgY29kZSArPSAiICAgIGZiQnVpbGRlci5wYWQoIiArIE51bVRvU3RyaW5nKGZpZWxkLnBhZGRpbmcpICsgIik7XG4iOwpAQCAtMTA4MiwxMSArMTAyNiwxMSBAQAogICAgICAgaWYgKElzU3RydWN0KGZpZWxkLnZhbHVlLnR5cGUpKSB7CiAgICAgICAgIGNvZGUgKz0gIiAgICAiOwogICAgICAgICBpZiAocHJlcGVuZFVuZGVyc2NvcmUpIHsgY29kZSArPSAiXyI7IH0KLSAgICAgICAgY29kZSArPSBmaWVsZC5uYW1lICsgKHBhY2sgPyAiLnBhY2siIDogIi5maW5pc2giKSArICIoZmJCdWlsZGVyKTtcbiI7CisgICAgICAgIGNvZGUgKz0gZmllbGRfbmFtZSArIChwYWNrID8gIi5wYWNrIiA6ICIuZmluaXNoIikgKyAiKGZiQnVpbGRlcik7XG4iOwogICAgICAgfSBlbHNlIHsKICAgICAgICAgY29kZSArPSAiICAgIGZiQnVpbGRlci5wdXQiICsgR2VuVHlwZShmaWVsZC52YWx1ZS50eXBlKSArICIoIjsKICAgICAgICAgaWYgKHByZXBlbmRVbmRlcnNjb3JlKSB7IGNvZGUgKz0gIl8iOyB9Ci0gICAgICAgIGNvZGUgKz0gZmllbGQubmFtZTsKKyAgICAgICAgY29kZSArPSBmaWVsZF9uYW1lOwogICAgICAgICBpZiAoZmllbGQudmFsdWUudHlwZS5lbnVtX2RlZikgeyBjb2RlICs9ICIudmFsdWUiOyB9CiAgICAgICAgIGNvZGUgKz0gIik7XG4iOwogICAgICAgfQpAQCAtMTEwNiwzNCArMTA1MCwzNSBAQAogCiAgICAgZm9yIChhdXRvIGl0ID0gbm9uX2RlcHJlY2F0ZWRfZmllbGRzLmJlZ2luKCk7CiAgICAgICAgICBpdCAhPSBub25fZGVwcmVjYXRlZF9maWVsZHMuZW5kKCk7ICsraXQpIHsKLSAgICAgIGF1dG8gcGFpciA9ICppdDsKLSAgICAgIGF1dG8gJmZpZWxkID0gKnBhaXIuc2Vjb25kOwotICAgICAgYXV0byBvZmZzZXQgPSBwYWlyLmZpcnN0OworICAgICAgY29uc3QgRmllbGREZWYgJmZpZWxkID0gKml0LT5zZWNvbmQ7CisgICAgICBhdXRvIG9mZnNldCA9IGl0LT5maXJzdDsKIAotICAgICAgc3RkOjpzdHJpbmcgZmllbGRfbmFtZSA9IChwcmVwZW5kVW5kZXJzY29yZSA/ICJfIiA6ICIiKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udmVydENhc2UoZmllbGQubmFtZSwgQ2FzZTo6a0xvd2VyQ2FtZWwpOworICAgICAgc3RkOjpzdHJpbmcgZmllbGRfdmFyID0KKyAgICAgICAgICAocHJlcGVuZFVuZGVyc2NvcmUgPyAiXyIgOiAiIikgKyBuYW1lcl8uVmFyaWFibGUoZmllbGQpOwogCiAgICAgICBpZiAoSXNTY2FsYXIoZmllbGQudmFsdWUudHlwZS5iYXNlX3R5cGUpKSB7CiAgICAgICAgIGNvZGUgKz0gIiAgICBmYkJ1aWxkZXIuYWRkIiArIEdlblR5cGUoZmllbGQudmFsdWUudHlwZSkgKyAiKCIgKwotICAgICAgICAgICAgICAgIE51bVRvU3RyaW5nKG9mZnNldCkgKyAiLCAiICsgZmllbGRfbmFtZTsKKyAgICAgICAgICAgICAgICBOdW1Ub1N0cmluZyhvZmZzZXQpICsgIiwgIiArIGZpZWxkX3ZhcjsKICAgICAgICAgaWYgKGZpZWxkLnZhbHVlLnR5cGUuZW51bV9kZWYpIHsKICAgICAgICAgICBib29sIGlzTnVsbGFibGUgPSBnZXREZWZhdWx0VmFsdWUoZmllbGQudmFsdWUpLmVtcHR5KCk7CiAgICAgICAgICAgY29kZSArPSAoaXNOdWxsYWJsZSB8fCAhcGFjaykgPyAiPy52YWx1ZSIgOiAiLnZhbHVlIjsKICAgICAgICAgfQogICAgICAgICBjb2RlICs9ICIpO1xuIjsKICAgICAgIH0gZWxzZSBpZiAoSXNTdHJ1Y3QoZmllbGQudmFsdWUudHlwZSkpIHsKLSAgICAgICAgY29kZSArPSAiICAgIGlmICgiICsgZmllbGRfbmFtZSArICIgIT0gbnVsbCkge1xuIjsKKyAgICAgICAgY29kZSArPSAiICAgIGlmICgiICsgZmllbGRfdmFyICsgIiAhPSBudWxsKSB7XG4iOwogICAgICAgICBjb2RlICs9ICIgICAgICBmYkJ1aWxkZXIuYWRkU3RydWN0KCIgKyBOdW1Ub1N0cmluZyhvZmZzZXQpICsgIiwgIiArCi0gICAgICAgICAgICAgICAgZmllbGRfbmFtZSArIChwYWNrID8gIiEucGFjayIgOiAiIS5maW5pc2giKSArICIoZmJCdWlsZGVyKSk7XG4iOworICAgICAgICAgICAgICAgIGZpZWxkX3ZhciArIChwYWNrID8gIiEucGFjayIgOiAiIS5maW5pc2giKSArICIoZmJCdWlsZGVyKSk7XG4iOwogICAgICAgICBjb2RlICs9ICIgICAgfVxuIjsKICAgICAgIH0gZWxzZSB7CiAgICAgICAgIGNvZGUgKz0gIiAgICBmYkJ1aWxkZXIuYWRkT2Zmc2V0KCIgKyBOdW1Ub1N0cmluZyhvZmZzZXQpICsgIiwgIiArCi0gICAgICAgICAgICAgICAgQ29udmVydENhc2UoZmllbGQubmFtZSwgQ2FzZTo6a0xvd2VyQ2FtZWwpICsgIk9mZnNldCk7XG4iOworICAgICAgICAgICAgICAgIG5hbWVyXy5WYXJpYWJsZShmaWVsZCkgKyAiT2Zmc2V0KTtcbiI7CiAgICAgICB9CiAgICAgfQogICAgIGNvZGUgKz0gIiAgICByZXR1cm4gZmJCdWlsZGVyLmVuZFRhYmxlKCk7XG4iOwogICAgIHJldHVybiBjb2RlOwogICB9CisKKyAgY29uc3QgSWRsTmFtZXIgbmFtZXJfOwogfTsKIH0gIC8vIG5hbWVzcGFjZSBkYXJ0CiAKQEAgLTExNDgsOCArMTA5Myw3IEBACiAgIGF1dG8gZmlsZWJhc2UgPQogICAgICAgZmxhdGJ1ZmZlcnM6OlN0cmlwUGF0aChmbGF0YnVmZmVyczo6U3RyaXBFeHRlbnNpb24oZmlsZV9uYW1lKSk7CiAgIGRhcnQ6OkRhcnRHZW5lcmF0b3IgZ2VuZXJhdG9yKHBhcnNlciwgcGF0aCwgZmlsZV9uYW1lKTsKLSAgYXV0byBtYWtlX3J1bGUgPQotICAgICAgZ2VuZXJhdG9yLkdlbmVyYXRlZEZpbGVOYW1lKHBhdGgsIGZpbGVfbmFtZSwgcGFyc2VyLm9wdHMpICsgIjogIjsKKyAgYXV0byBtYWtlX3J1bGUgPSBnZW5lcmF0b3IuRmlsZW5hbWUoIiIpICsgIjogIjsKIAogICBhdXRvIGluY2x1ZGVkX2ZpbGVzID0gcGFyc2VyLkdldEluY2x1ZGVkRmlsZXNSZWN1cnNpdmUoZmlsZV9uYW1lKTsKICAgZm9yIChhdXRvIGl0ID0gaW5jbHVkZWRfZmlsZXMuYmVnaW4oKTsgaXQgIT0gaW5jbHVkZWRfZmlsZXMuZW5kKCk7ICsraXQpIHsKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3NyYy9pZGxfZ2VuX2Zicy5jcHAgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy9zcmMvaWRsX2dlbl9mYnMuY3BwCmluZGV4IDM1YzFhN2QuLjc4MjU1N2YgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3NyYy9pZGxfZ2VuX2Zicy5jcHAKKysrIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvc3JjL2lkbF9nZW5fZmJzLmNwcApAQCAtODIsNyArODIsNyBAQAogICAgICAgaWYgKGl0LT5zZWNvbmQuZW1wdHkoKSkKICAgICAgICAgY29udGludWU7CiAgICAgICBzdGQ6OnN0cmluZyBiYXNlbmFtZTsKLSAgICAgIGlmKHBhcnNlci5vcHRzLmtlZXBfaW5jbHVkZV9wYXRoKSB7CisgICAgICBpZihwYXJzZXIub3B0cy5rZWVwX3ByZWZpeCkgewogICAgICAgICBiYXNlbmFtZSA9IGZsYXRidWZmZXJzOjpTdHJpcEV4dGVuc2lvbihpdC0+c2Vjb25kKTsKICAgICAgIH0gZWxzZSB7CiAgICAgICAgIGJhc2VuYW1lID0gZmxhdGJ1ZmZlcnM6OlN0cmlwUGF0aCgKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3NyYy9pZGxfZ2VuX2dvLmNwcCBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3NyYy9pZGxfZ2VuX2dvLmNwcAppbmRleCAzMDZhMDIyLi41MWUwMThhIDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy9zcmMvaWRsX2dlbl9nby5jcHAKKysrIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvc3JjL2lkbF9nZW5fZ28uY3BwCkBAIC0yMyw3ICsyMyw3IEBACiAjaW5jbHVkZSAiZmxhdGJ1ZmZlcnMvZmxhdGJ1ZmZlcnMuaCIKICNpbmNsdWRlICJmbGF0YnVmZmVycy9pZGwuaCIKICNpbmNsdWRlICJmbGF0YnVmZmVycy91dGlsLmgiCi0jaW5jbHVkZSAibmFtZXIuaCIKKyNpbmNsdWRlICJpZGxfbmFtZXIuaCIKIAogI2lmZGVmIF9XSU4zMgogIyAgaW5jbHVkZSA8ZGlyZWN0Lmg+CkBAIC0zOCw4ICszOCwxMCBAQAogCiBuYW1lc3BhY2UgZ28gewogCituYW1lc3BhY2UgeworCiAvLyBzZWUgaHR0cHM6Ly9nb2xhbmcub3JnL3JlZi9zcGVjI0tleXdvcmRzCi1zdGQ6OnNldDxzdGQ6OnN0cmluZz4gR29LZXl3b3JkcygpIHsKK3N0YXRpYyBzdGQ6OnNldDxzdGQ6OnN0cmluZz4gR29LZXl3b3JkcygpIHsKICAgcmV0dXJuIHsKICAgICAiYnJlYWsiLCAgICAiZGVmYXVsdCIsICAgICAiZnVuYyIsICAgImludGVyZmFjZSIsICJzZWxlY3QiLAogICAgICJjYXNlIiwgICAgICJkZWZlciIsICAgICAgICJnbyIsICAgICAibWFwIiwgICAgICAgInN0cnVjdCIsCkBAIC00OSw3ICs1MSw3IEBACiAgIH07CiB9CiAKLU5hbWVyOjpDb25maWcgR29EZWZhdWx0Q29uZmlnKCkgeworc3RhdGljIE5hbWVyOjpDb25maWcgR29EZWZhdWx0Q29uZmlnKCkgewogICAvLyBOb3RlIHRoYXQgdGhlIGZ1bmN0aW9ucyB3aXRoIHVzZXIgZGVmaW5lZCB0eXBlcyBpbiB0aGUgbmFtZSB1c2UKICAgLy8gdXBwZXIgY2FtZWwgY2FzZSBmb3IgYWxsIGJ1dCB0aGUgdXNlciBkZWZpbmVkIHR5cGUgaXRzZWxmLCB3aGljaCBpcyBrZWVwCiAgIC8vIGNhc2VkLiBEZXNwaXRlIGJlaW5nIGEgZnVuY3Rpb24sIHdlIGludGVycHJldCBpdCBhcyBhIFR5cGUuCkBAIC02MSw2ICs2Myw3IEBACiAgICAgICAgICAgIC8qdmFyaWFibGVzPSovQ2FzZTo6a0xvd2VyQ2FtZWwsCiAgICAgICAgICAgIC8qdmFyaWFudHM9Ki9DYXNlOjprS2VlcCwKICAgICAgICAgICAgLyplbnVtX3ZhcmlhbnRfc2VwZXJhdG9yPSovIiIsICAvLyBJLmUuIENvbmNhdGVuYXRlLgorICAgICAgICAgICAvKmVzY2FwZV9rZXl3b3Jkcz0qL05hbWVyOjpDb25maWc6OkVzY2FwZTo6QWZ0ZXJDb252ZXJ0aW5nQ2FzZSwKICAgICAgICAgICAgLypuYW1lc3BhY2VzPSovQ2FzZTo6a0tlZXAsCiAgICAgICAgICAgIC8qbmFtZXNwYWNlX3NlcGVyYXRvcj0qLyJfXyIsCiAgICAgICAgICAgIC8qb2JqZWN0X3ByZWZpeD0qLyIiLApAQCAtNzQsNiArNzcsOCBAQAogICAgICAgICAgICAvKmZpbGVuYW1lX2V4dGVuc2lvbj0qLyIuZ28iIH07CiB9CiAKK30gLy8gbmFtZXNwYWNlCisKIGNsYXNzIEdvR2VuZXJhdG9yIDogcHVibGljIEJhc2VHZW5lcmF0b3IgewogIHB1YmxpYzoKICAgR29HZW5lcmF0b3IoY29uc3QgUGFyc2VyICZwYXJzZXIsIGNvbnN0IHN0ZDo6c3RyaW5nICZwYXRoLApAQCAtODEsOCArODYsOCBAQAogICAgICAgOiBCYXNlR2VuZXJhdG9yKHBhcnNlciwgcGF0aCwgZmlsZV9uYW1lLCAiIiAvKiBub3QgdXNlZCovLAogICAgICAgICAgICAgICAgICAgICAgICIiIC8qIG5vdCB1c2VkICovLCAiZ28iKSwKICAgICAgICAgY3VyX25hbWVfc3BhY2VfKG51bGxwdHIpLAotICAgICAgICBuYW1lcl8oeyBHb0RlZmF1bHRDb25maWcoKS5XaXRoRmxhZ09wdGlvbnMocGFyc2VyLm9wdHMsIHBhdGgpLAotICAgICAgICAgICAgICAgICBHb0tleXdvcmRzKCkgfSkgeworICAgICAgICBuYW1lcl8oV2l0aEZsYWdPcHRpb25zKEdvRGVmYXVsdENvbmZpZygpLCBwYXJzZXIub3B0cywgcGF0aCksCisgICAgICAgICAgICAgICBHb0tleXdvcmRzKCkpIHsKICAgICBzdGQ6OmlzdHJpbmdzdHJlYW0gaXNzKGdvX25hbWVzcGFjZSk7CiAgICAgc3RkOjpzdHJpbmcgY29tcG9uZW50OwogICAgIHdoaWxlIChzdGQ6OmdldGxpbmUoaXNzLCBjb21wb25lbnQsICcuJykpIHsKQEAgLTE0MCw3ICsxNDUsNyBAQAogIHByaXZhdGU6CiAgIE5hbWVzcGFjZSBnb19uYW1lc3BhY2VfOwogICBOYW1lc3BhY2UgKmN1cl9uYW1lX3NwYWNlXzsKLSAgY29uc3QgTmFtZXIgbmFtZXJfOworICBjb25zdCBJZGxOYW1lciBuYW1lcl87CiAKICAgc3RydWN0IE5hbWVzcGFjZVB0ckxlc3MgewogICAgIGJvb2wgb3BlcmF0b3IoKShjb25zdCBOYW1lc3BhY2UgKmEsIGNvbnN0IE5hbWVzcGFjZSAqYikgY29uc3QgewpAQCAtMTYwLDcgKzE2NSw3IEBACiAgIHZvaWQgQmVnaW5DbGFzcyhjb25zdCBTdHJ1Y3REZWYgJnN0cnVjdF9kZWYsIHN0ZDo6c3RyaW5nICpjb2RlX3B0cikgewogICAgIHN0ZDo6c3RyaW5nICZjb2RlID0gKmNvZGVfcHRyOwogCi0gICAgY29kZSArPSAidHlwZSAiICsgbmFtZXJfLlR5cGUoc3RydWN0X2RlZi5uYW1lKSArICIgc3RydWN0IHtcblx0IjsKKyAgICBjb2RlICs9ICJ0eXBlICIgKyBuYW1lcl8uVHlwZShzdHJ1Y3RfZGVmKSArICIgc3RydWN0IHtcblx0IjsKIAogICAgIC8vIF8gaXMgcmVzZXJ2ZWQgaW4gZmxhdGJ1ZmZlcnMgZmllbGQgbmFtZXMsIHNvIG5vIGNoYW5jZSBvZiBuYW1lIGNvbmZsaWN0OgogICAgIGNvZGUgKz0gIl90YWIgIjsKQEAgLTE3MSw3ICsxNzYsNyBAQAogICAvLyBDb25zdHJ1Y3QgdGhlIG5hbWUgb2YgdGhlIHR5cGUgZm9yIHRoaXMgZW51bS4KICAgc3RkOjpzdHJpbmcgR2V0RW51bVR5cGVOYW1lKGNvbnN0IEVudW1EZWYgJmVudW1fZGVmKSB7CiAgICAgcmV0dXJuIFdyYXBJbk5hbWVTcGFjZUFuZFRyYWNrKGVudW1fZGVmLmRlZmluZWRfbmFtZXNwYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lcl8uVHlwZShlbnVtX2RlZi5uYW1lKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVyXy5UeXBlKGVudW1fZGVmKSk7CiAgIH0KIAogICAvLyBDcmVhdGUgYSB0eXBlIGZvciB0aGUgZW51bSB2YWx1ZXMuCkBAIC0xOTIsNyArMTk3LDcgQEAKICAgICAgICAgICAgICAgICAgIHNpemVfdCBtYXhfbmFtZV9sZW5ndGgsIHN0ZDo6c3RyaW5nICpjb2RlX3B0cikgewogICAgIHN0ZDo6c3RyaW5nICZjb2RlID0gKmNvZGVfcHRyOwogICAgIGNvZGUgKz0gIlx0IjsKLSAgICBjb2RlICs9IG5hbWVyXy5FbnVtVmFyaWFudChlbnVtX2RlZi5uYW1lLCBldi5uYW1lKTsKKyAgICBjb2RlICs9IG5hbWVyXy5FbnVtVmFyaWFudChlbnVtX2RlZiwgZXYpOwogICAgIGNvZGUgKz0gIiAiOwogICAgIGNvZGUgKz0gc3RkOjpzdHJpbmcobWF4X25hbWVfbGVuZ3RoIC0gZXYubmFtZS5sZW5ndGgoKSwgJyAnKTsKICAgICBjb2RlICs9IEdldEVudW1UeXBlTmFtZShlbnVtX2RlZik7CkBAIC0yMTksNyArMjI0LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgbWF4X25hbWVfbGVuZ3RoLCBzdGQ6OnN0cmluZyAqY29kZV9wdHIpIHsKICAgICBzdGQ6OnN0cmluZyAmY29kZSA9ICpjb2RlX3B0cjsKICAgICBjb2RlICs9ICJcdCI7Ci0gICAgY29kZSArPSBuYW1lcl8uRW51bVZhcmlhbnQoZW51bV9kZWYubmFtZSwgZXYubmFtZSk7CisgICAgY29kZSArPSBuYW1lcl8uRW51bVZhcmlhbnQoZW51bV9kZWYsIGV2KTsKICAgICBjb2RlICs9ICI6ICI7CiAgICAgY29kZSArPSBzdGQ6OnN0cmluZyhtYXhfbmFtZV9sZW5ndGggLSBldi5uYW1lLmxlbmd0aCgpLCAnICcpOwogICAgIGNvZGUgKz0gIlwiIjsKQEAgLTIzNiw3ICsyNDEsNyBAQAogICAvLyBHZW5lcmF0ZSBTdHJpbmcoKSBtZXRob2Qgb24gZW51bSB0eXBlLgogICB2b2lkIEVudW1TdHJpbmdlcihjb25zdCBFbnVtRGVmICZlbnVtX2RlZiwgc3RkOjpzdHJpbmcgKmNvZGVfcHRyKSB7CiAgICAgc3RkOjpzdHJpbmcgJmNvZGUgPSAqY29kZV9wdHI7Ci0gICAgY29uc3Qgc3RkOjpzdHJpbmcgZW51bV90eXBlID0gbmFtZXJfLlR5cGUoZW51bV9kZWYubmFtZSk7CisgICAgY29uc3Qgc3RkOjpzdHJpbmcgZW51bV90eXBlID0gbmFtZXJfLlR5cGUoZW51bV9kZWYpOwogICAgIGNvZGUgKz0gImZ1bmMgKHYgIiArIGVudW1fdHlwZSArICIpIFN0cmluZygpIHN0cmluZyB7XG4iOwogICAgIGNvZGUgKz0gIlx0aWYgcywgb2sgOj0gRW51bU5hbWVzIiArIGVudW1fdHlwZSArICJbdl07IG9rIHtcbiI7CiAgICAgY29kZSArPSAiXHRcdHJldHVybiBzXG4iOwpAQCAtMjUwLDcgKzI1NSw3IEBACiAgIHZvaWQgQmVnaW5FbnVtVmFsdWVzKGNvbnN0IEVudW1EZWYgJmVudW1fZGVmLCBzdGQ6OnN0cmluZyAqY29kZV9wdHIpIHsKICAgICBzdGQ6OnN0cmluZyAmY29kZSA9ICpjb2RlX3B0cjsKICAgICBjb2RlICs9ICJ2YXIgRW51bVZhbHVlcyI7Ci0gICAgY29kZSArPSBuYW1lcl8uVHlwZShlbnVtX2RlZi5uYW1lKTsKKyAgICBjb2RlICs9IG5hbWVyXy5UeXBlKGVudW1fZGVmKTsKICAgICBjb2RlICs9ICIgPSBtYXBbc3RyaW5nXSIgKyBHZXRFbnVtVHlwZU5hbWUoZW51bV9kZWYpICsgIntcbiI7CiAgIH0KIApAQCAtMjYyLDcgKzI2Nyw3IEBACiAgICAgY29kZSArPSBldi5uYW1lOwogICAgIGNvZGUgKz0gIlwiOiAiOwogICAgIGNvZGUgKz0gc3RkOjpzdHJpbmcobWF4X25hbWVfbGVuZ3RoIC0gZXYubmFtZS5sZW5ndGgoKSwgJyAnKTsKLSAgICBjb2RlICs9IG5hbWVyXy5FbnVtVmFyaWFudChlbnVtX2RlZi5uYW1lLCBldi5uYW1lKTsKKyAgICBjb2RlICs9IG5hbWVyXy5FbnVtVmFyaWFudChlbnVtX2RlZiwgZXYpOwogICAgIGNvZGUgKz0gIixcbiI7CiAgIH0KIApAQCAtMjc3LDcgKzI4Miw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nICpjb2RlX3B0cikgewogICAgIHN0ZDo6c3RyaW5nICZjb2RlID0gKmNvZGVfcHRyOwogICAgIGNvbnN0IHN0ZDo6c3RyaW5nIHNpemVfcHJlZml4W10gPSB7ICIiLCAiU2l6ZVByZWZpeGVkIiB9OwotICAgIGNvbnN0IHN0ZDo6c3RyaW5nIHN0cnVjdF90eXBlID0gbmFtZXJfLlR5cGUoc3RydWN0X2RlZi5uYW1lKTsKKyAgICBjb25zdCBzdGQ6OnN0cmluZyBzdHJ1Y3RfdHlwZSA9IG5hbWVyXy5UeXBlKHN0cnVjdF9kZWYpOwogCiAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAyOyBpKyspIHsKICAgICAgIGNvZGUgKz0gImZ1bmMgR2V0IiArIHNpemVfcHJlZml4W2ldICsgIlJvb3RBcyIgKyBzdHJ1Y3RfdHlwZTsKQEAgLTMzNiw3ICszNDEsNyBAQAogICAgIHN0ZDo6c3RyaW5nICZjb2RlID0gKmNvZGVfcHRyOwogCiAgICAgR2VuUmVjZWl2ZXIoc3RydWN0X2RlZiwgY29kZV9wdHIpOwotICAgIGNvZGUgKz0gIiAiICsgbmFtZXJfLkZ1bmN0aW9uKGZpZWxkLm5hbWUpICsgIkxlbmd0aCgiOworICAgIGNvZGUgKz0gIiAiICsgbmFtZXJfLkZ1bmN0aW9uKGZpZWxkKSArICJMZW5ndGgoIjsKICAgICBjb2RlICs9ICIpIGludCAiICsgT2Zmc2V0UHJlZml4KGZpZWxkKTsKICAgICBjb2RlICs9ICJcdFx0cmV0dXJuIHJjdi5fdGFiLlZlY3RvckxlbihvKVxuXHR9XG4iOwogICAgIGNvZGUgKz0gIlx0cmV0dXJuIDBcbn1cblxuIjsKQEAgLTM0OCw3ICszNTMsNyBAQAogICAgIHN0ZDo6c3RyaW5nICZjb2RlID0gKmNvZGVfcHRyOwogCiAgICAgR2VuUmVjZWl2ZXIoc3RydWN0X2RlZiwgY29kZV9wdHIpOwotICAgIGNvZGUgKz0gIiAiICsgbmFtZXJfLkZ1bmN0aW9uKGZpZWxkLm5hbWUpICsgIkJ5dGVzKCI7CisgICAgY29kZSArPSAiICIgKyBuYW1lcl8uRnVuY3Rpb24oZmllbGQpICsgIkJ5dGVzKCI7CiAgICAgY29kZSArPSAiKSBbXWJ5dGUgIiArIE9mZnNldFByZWZpeChmaWVsZCk7CiAgICAgY29kZSArPSAiXHRcdHJldHVybiByY3YuX3RhYi5CeXRlVmVjdG9yKG8gKyByY3YuX3RhYi5Qb3MpXG5cdH1cbiI7CiAgICAgY29kZSArPSAiXHRyZXR1cm4gbmlsXG59XG5cbiI7CkBAIC0zNjAsNyArMzY1LDcgQEAKICAgICBzdGQ6OnN0cmluZyAmY29kZSA9ICpjb2RlX3B0cjsKICAgICBzdGQ6OnN0cmluZyBnZXR0ZXIgPSBHZW5HZXR0ZXIoZmllbGQudmFsdWUudHlwZSk7CiAgICAgR2VuUmVjZWl2ZXIoc3RydWN0X2RlZiwgY29kZV9wdHIpOwotICAgIGNvZGUgKz0gIiAiICsgbmFtZXJfLkZ1bmN0aW9uKGZpZWxkLm5hbWUpOworICAgIGNvZGUgKz0gIiAiICsgbmFtZXJfLkZ1bmN0aW9uKGZpZWxkKTsKICAgICBjb2RlICs9ICIoKSAiICsgVHlwZU5hbWUoZmllbGQpICsgIiB7XG4iOwogICAgIGNvZGUgKz0gIlx0cmV0dXJuICIgKwogICAgICAgICAgICAgQ2FzdFRvRW51bShmaWVsZC52YWx1ZS50eXBlLApAQCAtMzc1LDcgKzM4MCw3IEBACiAgICAgc3RkOjpzdHJpbmcgJmNvZGUgPSAqY29kZV9wdHI7CiAgICAgc3RkOjpzdHJpbmcgZ2V0dGVyID0gR2VuR2V0dGVyKGZpZWxkLnZhbHVlLnR5cGUpOwogICAgIEdlblJlY2VpdmVyKHN0cnVjdF9kZWYsIGNvZGVfcHRyKTsKLSAgICBjb2RlICs9ICIgIiArIG5hbWVyXy5GdW5jdGlvbihmaWVsZC5uYW1lKTsKKyAgICBjb2RlICs9ICIgIiArIG5hbWVyXy5GdW5jdGlvbihmaWVsZCk7CiAgICAgY29kZSArPSAiKCkgIiArIFR5cGVOYW1lKGZpZWxkKSArICIgIjsKICAgICBjb2RlICs9IE9mZnNldFByZWZpeChmaWVsZCk7CiAgICAgaWYgKGZpZWxkLklzU2NhbGFyT3B0aW9uYWwoKSkgewpAQCAtMzg0LDkgKzM4OSw3IEBACiAgICAgICBjb2RlICs9ICJcdFx0cmV0dXJuICI7CiAgICAgfQogICAgIGNvZGUgKz0gQ2FzdFRvRW51bShmaWVsZC52YWx1ZS50eXBlLCBnZXR0ZXIgKyAiKG8gKyByY3YuX3RhYi5Qb3MpIik7Ci0gICAgaWYgKGZpZWxkLklzU2NhbGFyT3B0aW9uYWwoKSkgewotICAgICAgY29kZSArPSAiXG5cdFx0cmV0dXJuICZ2IjsKLSAgICB9CisgICAgaWYgKGZpZWxkLklzU2NhbGFyT3B0aW9uYWwoKSkgeyBjb2RlICs9ICJcblx0XHRyZXR1cm4gJnYiOyB9CiAgICAgY29kZSArPSAiXG5cdH1cbiI7CiAgICAgY29kZSArPSAiXHRyZXR1cm4gIiArIEdlbkNvbnN0YW50KGZpZWxkKSArICJcbiI7CiAgICAgY29kZSArPSAifVxuXG4iOwpAQCAtMzk4LDcgKzQwMSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWVsZERlZiAmZmllbGQsIHN0ZDo6c3RyaW5nICpjb2RlX3B0cikgewogICAgIHN0ZDo6c3RyaW5nICZjb2RlID0gKmNvZGVfcHRyOwogICAgIEdlblJlY2VpdmVyKHN0cnVjdF9kZWYsIGNvZGVfcHRyKTsKLSAgICBjb2RlICs9ICIgIiArIG5hbWVyXy5GdW5jdGlvbihmaWVsZC5uYW1lKTsKKyAgICBjb2RlICs9ICIgIiArIG5hbWVyXy5GdW5jdGlvbihmaWVsZCk7CiAgICAgY29kZSArPSAiKG9iaiAqIiArIFR5cGVOYW1lKGZpZWxkKTsKICAgICBjb2RlICs9ICIpICoiICsgVHlwZU5hbWUoZmllbGQpOwogICAgIGNvZGUgKz0gIiB7XG4iOwpAQCAtNDE3LDcgKzQyMCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nICpjb2RlX3B0cikgewogICAgIHN0ZDo6c3RyaW5nICZjb2RlID0gKmNvZGVfcHRyOwogICAgIEdlblJlY2VpdmVyKHN0cnVjdF9kZWYsIGNvZGVfcHRyKTsKLSAgICBjb2RlICs9ICIgIiArIG5hbWVyXy5GdW5jdGlvbihmaWVsZC5uYW1lKTsKKyAgICBjb2RlICs9ICIgIiArIG5hbWVyXy5GdW5jdGlvbihmaWVsZCk7CiAgICAgY29kZSArPSAiKG9iaiAqIjsKICAgICBjb2RlICs9IFR5cGVOYW1lKGZpZWxkKTsKICAgICBjb2RlICs9ICIpICoiICsgVHlwZU5hbWUoZmllbGQpICsgIiAiICsgT2Zmc2V0UHJlZml4KGZpZWxkKTsKQEAgLTQzOSw3ICs0NDIsNyBAQAogICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nICpjb2RlX3B0cikgewogICAgIHN0ZDo6c3RyaW5nICZjb2RlID0gKmNvZGVfcHRyOwogICAgIEdlblJlY2VpdmVyKHN0cnVjdF9kZWYsIGNvZGVfcHRyKTsKLSAgICBjb2RlICs9ICIgIiArIG5hbWVyXy5GdW5jdGlvbihmaWVsZC5uYW1lKTsKKyAgICBjb2RlICs9ICIgIiArIG5hbWVyXy5GdW5jdGlvbihmaWVsZCk7CiAgICAgY29kZSArPSAiKCkgIiArIFR5cGVOYW1lKGZpZWxkKSArICIgIjsKICAgICBjb2RlICs9IE9mZnNldFByZWZpeChmaWVsZCkgKyAiXHRcdHJldHVybiAiICsgR2VuR2V0dGVyKGZpZWxkLnZhbHVlLnR5cGUpOwogICAgIGNvZGUgKz0gIihvICsgcmN2Ll90YWIuUG9zKVxuXHR9XG5cdHJldHVybiBuaWxcbiI7CkBAIC00NTEsNyArNDU0LDcgQEAKICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nICpjb2RlX3B0cikgewogICAgIHN0ZDo6c3RyaW5nICZjb2RlID0gKmNvZGVfcHRyOwogICAgIEdlblJlY2VpdmVyKHN0cnVjdF9kZWYsIGNvZGVfcHRyKTsKLSAgICBjb2RlICs9ICIgIiArIG5hbWVyXy5GdW5jdGlvbihmaWVsZC5uYW1lKSArICIoIjsKKyAgICBjb2RlICs9ICIgIiArIG5hbWVyXy5GdW5jdGlvbihmaWVsZCkgKyAiKCI7CiAgICAgY29kZSArPSAib2JqICIgKyBHZW5UeXBlUG9pbnRlcihmaWVsZC52YWx1ZS50eXBlKSArICIpIGJvb2wgIjsKICAgICBjb2RlICs9IE9mZnNldFByZWZpeChmaWVsZCk7CiAgICAgY29kZSArPSAiXHRcdCIgKyBHZW5HZXR0ZXIoZmllbGQudmFsdWUudHlwZSk7CkBAIC00NjcsNyArNDcwLDcgQEAKICAgICBhdXRvIHZlY3RvcnR5cGUgPSBmaWVsZC52YWx1ZS50eXBlLlZlY3RvclR5cGUoKTsKIAogICAgIEdlblJlY2VpdmVyKHN0cnVjdF9kZWYsIGNvZGVfcHRyKTsKLSAgICBjb2RlICs9ICIgIiArIG5hbWVyXy5GdW5jdGlvbihmaWVsZC5uYW1lKTsKKyAgICBjb2RlICs9ICIgIiArIG5hbWVyXy5GdW5jdGlvbihmaWVsZCk7CiAgICAgY29kZSArPSAiKG9iaiAqIiArIFR5cGVOYW1lKGZpZWxkKTsKICAgICBjb2RlICs9ICIsIGogaW50KSBib29sICIgKyBPZmZzZXRQcmVmaXgoZmllbGQpOwogICAgIGNvZGUgKz0gIlx0XHR4IDo9IHJjdi5fdGFiLlZlY3RvcihvKVxuIjsKQEAgLTQ5MCw3ICs0OTMsNyBAQAogICAgIGF1dG8gdmVjdG9ydHlwZSA9IGZpZWxkLnZhbHVlLnR5cGUuVmVjdG9yVHlwZSgpOwogCiAgICAgR2VuUmVjZWl2ZXIoc3RydWN0X2RlZiwgY29kZV9wdHIpOwotICAgIGNvZGUgKz0gIiAiICsgbmFtZXJfLkZ1bmN0aW9uKGZpZWxkLm5hbWUpOworICAgIGNvZGUgKz0gIiAiICsgbmFtZXJfLkZ1bmN0aW9uKGZpZWxkKTsKICAgICBjb2RlICs9ICIoaiBpbnQpICIgKyBUeXBlTmFtZShmaWVsZCkgKyAiICI7CiAgICAgY29kZSArPSBPZmZzZXRQcmVmaXgoZmllbGQpOwogICAgIGNvZGUgKz0gIlx0XHRhIDo9IHJjdi5fdGFiLlZlY3RvcihvKVxuIjsKQEAgLTUzOCw3ICs1NDEsNyBAQAogICAgICAgfSBlbHNlIHsKICAgICAgICAgc3RkOjpzdHJpbmcgJmNvZGUgPSAqY29kZV9wdHI7CiAgICAgICAgIGNvZGUgKz0gc3RkOjpzdHJpbmcoIiwgIikgKyBuYW1lcHJlZml4OwotICAgICAgICBjb2RlICs9IG5hbWVyXy5WYXJpYWJsZShmaWVsZC5uYW1lKTsKKyAgICAgICAgY29kZSArPSBuYW1lcl8uVmFyaWFibGUoZmllbGQpOwogICAgICAgICBjb2RlICs9ICIgIiArIFR5cGVOYW1lKGZpZWxkKTsKICAgICAgIH0KICAgICB9CkBAIC01NjgsNyArNTcxLDcgQEAKICAgICAgIH0gZWxzZSB7CiAgICAgICAgIGNvZGUgKz0gIlx0YnVpbGRlci5QcmVwZW5kIiArIEdlbk1ldGhvZChmaWVsZCkgKyAiKCI7CiAgICAgICAgIGNvZGUgKz0gQ2FzdFRvQmFzZVR5cGUoZmllbGQudmFsdWUudHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lcHJlZml4ICsgbmFtZXJfLlZhcmlhYmxlKGZpZWxkLm5hbWUpKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZXByZWZpeCArIG5hbWVyXy5WYXJpYWJsZShmaWVsZCkpICsKICAgICAgICAgICAgICAgICAiKVxuIjsKICAgICAgIH0KICAgICB9CkBAIC01ODMsNyArNTg2LDcgQEAKICAgLy8gR2V0IHRoZSB2YWx1ZSBvZiBhIHRhYmxlJ3Mgc3RhcnRpbmcgb2Zmc2V0LgogICB2b2lkIEdldFN0YXJ0T2ZUYWJsZShjb25zdCBTdHJ1Y3REZWYgJnN0cnVjdF9kZWYsIHN0ZDo6c3RyaW5nICpjb2RlX3B0cikgewogICAgIHN0ZDo6c3RyaW5nICZjb2RlID0gKmNvZGVfcHRyOwotICAgIGNvZGUgKz0gImZ1bmMgIiArIG5hbWVyXy5UeXBlKHN0cnVjdF9kZWYubmFtZSkgKyAiU3RhcnQiOworICAgIGNvZGUgKz0gImZ1bmMgIiArIG5hbWVyXy5UeXBlKHN0cnVjdF9kZWYpICsgIlN0YXJ0IjsKICAgICBjb2RlICs9ICIoYnVpbGRlciAqZmxhdGJ1ZmZlcnMuQnVpbGRlcikge1xuIjsKICAgICBjb2RlICs9ICJcdGJ1aWxkZXIuU3RhcnRPYmplY3QoIjsKICAgICBjb2RlICs9IE51bVRvU3RyaW5nKHN0cnVjdF9kZWYuZmllbGRzLnZlYy5zaXplKCkpOwpAQCAtNTk0LDkgKzU5Nyw4IEBACiAgIHZvaWQgQnVpbGRGaWVsZE9mVGFibGUoY29uc3QgU3RydWN0RGVmICZzdHJ1Y3RfZGVmLCBjb25zdCBGaWVsZERlZiAmZmllbGQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2l6ZV90IG9mZnNldCwgc3RkOjpzdHJpbmcgKmNvZGVfcHRyKSB7CiAgICAgc3RkOjpzdHJpbmcgJmNvZGUgPSAqY29kZV9wdHI7Ci0gICAgY29uc3Qgc3RkOjpzdHJpbmcgZmllbGRfdmFyID0gbmFtZXJfLlZhcmlhYmxlKGZpZWxkLm5hbWUpOwotICAgIGNvZGUgKz0gImZ1bmMgIiArIG5hbWVyXy5UeXBlKHN0cnVjdF9kZWYubmFtZSkgKyAiQWRkIiArCi0gICAgICAgICAgICBuYW1lcl8uRnVuY3Rpb24oZmllbGQubmFtZSk7CisgICAgY29uc3Qgc3RkOjpzdHJpbmcgZmllbGRfdmFyID0gbmFtZXJfLlZhcmlhYmxlKGZpZWxkKTsKKyAgICBjb2RlICs9ICJmdW5jICIgKyBuYW1lcl8uVHlwZShzdHJ1Y3RfZGVmKSArICJBZGQiICsgbmFtZXJfLkZ1bmN0aW9uKGZpZWxkKTsKICAgICBjb2RlICs9ICIoYnVpbGRlciAqZmxhdGJ1ZmZlcnMuQnVpbGRlciwgIjsKICAgICBjb2RlICs9IGZpZWxkX3ZhciArICIgIjsKICAgICBpZiAoIUlzU2NhbGFyKGZpZWxkLnZhbHVlLnR5cGUuYmFzZV90eXBlKSAmJiAoIXN0cnVjdF9kZWYuZml4ZWQpKSB7CkBAIC02MzIsOCArNjM0LDggQEAKICAgdm9pZCBCdWlsZFZlY3Rvck9mVGFibGUoY29uc3QgU3RydWN0RGVmICZzdHJ1Y3RfZGVmLCBjb25zdCBGaWVsZERlZiAmZmllbGQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nICpjb2RlX3B0cikgewogICAgIHN0ZDo6c3RyaW5nICZjb2RlID0gKmNvZGVfcHRyOwotICAgIGNvZGUgKz0gImZ1bmMgIiArIG5hbWVyXy5UeXBlKHN0cnVjdF9kZWYubmFtZSkgKyAiU3RhcnQiOwotICAgIGNvZGUgKz0gbmFtZXJfLkZ1bmN0aW9uKGZpZWxkLm5hbWUpOworICAgIGNvZGUgKz0gImZ1bmMgIiArIG5hbWVyXy5UeXBlKHN0cnVjdF9kZWYpICsgIlN0YXJ0IjsKKyAgICBjb2RlICs9IG5hbWVyXy5GdW5jdGlvbihmaWVsZCk7CiAgICAgY29kZSArPSAiVmVjdG9yKGJ1aWxkZXIgKmZsYXRidWZmZXJzLkJ1aWxkZXIsIG51bUVsZW1zIGludCkgIjsKICAgICBjb2RlICs9ICJmbGF0YnVmZmVycy5VT2Zmc2V0VCB7XG5cdHJldHVybiBidWlsZGVyLlN0YXJ0VmVjdG9yKCI7CiAgICAgYXV0byB2ZWN0b3JfdHlwZSA9IGZpZWxkLnZhbHVlLnR5cGUuVmVjdG9yVHlwZSgpOwpAQCAtNjQ3LDcgKzY0OSw3IEBACiAgIC8vIEdldCB0aGUgb2Zmc2V0IG9mIHRoZSBlbmQgb2YgYSB0YWJsZS4KICAgdm9pZCBHZXRFbmRPZmZzZXRPblRhYmxlKGNvbnN0IFN0cnVjdERlZiAmc3RydWN0X2RlZiwgc3RkOjpzdHJpbmcgKmNvZGVfcHRyKSB7CiAgICAgc3RkOjpzdHJpbmcgJmNvZGUgPSAqY29kZV9wdHI7Ci0gICAgY29kZSArPSAiZnVuYyAiICsgbmFtZXJfLlR5cGUoc3RydWN0X2RlZi5uYW1lKSArICJFbmQiOworICAgIGNvZGUgKz0gImZ1bmMgIiArIG5hbWVyXy5UeXBlKHN0cnVjdF9kZWYpICsgIkVuZCI7CiAgICAgY29kZSArPSAiKGJ1aWxkZXIgKmZsYXRidWZmZXJzLkJ1aWxkZXIpIGZsYXRidWZmZXJzLlVPZmZzZXRUICI7CiAgICAgY29kZSArPSAie1xuXHRyZXR1cm4gYnVpbGRlci5FbmRPYmplY3QoKVxufVxuIjsKICAgfQpAQCAtNjU1LDcgKzY1Nyw3IEBACiAgIC8vIEdlbmVyYXRlIHRoZSByZWNlaXZlciBmb3IgZnVuY3Rpb24gc2lnbmF0dXJlcy4KICAgdm9pZCBHZW5SZWNlaXZlcihjb25zdCBTdHJ1Y3REZWYgJnN0cnVjdF9kZWYsIHN0ZDo6c3RyaW5nICpjb2RlX3B0cikgewogICAgIHN0ZDo6c3RyaW5nICZjb2RlID0gKmNvZGVfcHRyOwotICAgIGNvZGUgKz0gImZ1bmMgKHJjdiAqIiArIG5hbWVyXy5UeXBlKHN0cnVjdF9kZWYubmFtZSkgKyAiKSI7CisgICAgY29kZSArPSAiZnVuYyAocmN2ICoiICsgbmFtZXJfLlR5cGUoc3RydWN0X2RlZikgKyAiKSI7CiAgIH0KIAogICAvLyBHZW5lcmF0ZSBhIHN0cnVjdCBmaWVsZCBnZXR0ZXIsIGNvbmRpdGlvbmVkIG9uIGl0cyBjaGlsZCB0eXBlKHMpLgpAQCAtNzA4LDggKzcxMCw5IEBACiAgICAgc3RkOjpzdHJpbmcgc2V0dGVyID0KICAgICAgICAgInJjdi5fdGFiLk11dGF0ZSIgKyBuYW1lcl8uTWV0aG9kKEdlblR5cGVCYXNpYyhmaWVsZC52YWx1ZS50eXBlKSk7CiAgICAgR2VuUmVjZWl2ZXIoc3RydWN0X2RlZiwgY29kZV9wdHIpOwotICAgIGNvZGUgKz0gIiBNdXRhdGUiICsgbmFtZXJfLkZ1bmN0aW9uKGZpZWxkLm5hbWUpOwotICAgIGNvZGUgKz0gIihuICIgKyBHZW5UeXBlR2V0KGZpZWxkLnZhbHVlLnR5cGUpICsgIikgYm9vbCB7XG5cdHJldHVybiAiICsgc2V0dGVyOworICAgIGNvZGUgKz0gIiBNdXRhdGUiICsgbmFtZXJfLkZ1bmN0aW9uKGZpZWxkKTsKKyAgICBjb2RlICs9CisgICAgICAgICIobiAiICsgR2VuVHlwZUdldChmaWVsZC52YWx1ZS50eXBlKSArICIpIGJvb2wge1xuXHRyZXR1cm4gIiArIHNldHRlcjsKICAgICBjb2RlICs9ICIocmN2Ll90YWIuUG9zK2ZsYXRidWZmZXJzLlVPZmZzZXRUKCI7CiAgICAgY29kZSArPSBOdW1Ub1N0cmluZyhmaWVsZC52YWx1ZS5vZmZzZXQpICsgIiksICI7CiAgICAgY29kZSArPSBDYXN0VG9CYXNlVHlwZShmaWVsZC52YWx1ZS50eXBlLCAibiIpICsgIilcbn1cblxuIjsKQEAgLTcyMiw3ICs3MjUsNyBAQAogICAgIHN0ZDo6c3RyaW5nIHNldHRlciA9ICJyY3YuX3RhYi5NdXRhdGUiICsKICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lcl8uTWV0aG9kKEdlblR5cGVCYXNpYyhmaWVsZC52YWx1ZS50eXBlKSkgKyAiU2xvdCI7CiAgICAgR2VuUmVjZWl2ZXIoc3RydWN0X2RlZiwgY29kZV9wdHIpOwotICAgIGNvZGUgKz0gIiBNdXRhdGUiICsgbmFtZXJfLkZ1bmN0aW9uKGZpZWxkLm5hbWUpOworICAgIGNvZGUgKz0gIiBNdXRhdGUiICsgbmFtZXJfLkZ1bmN0aW9uKGZpZWxkKTsKICAgICBjb2RlICs9ICIobiAiICsgR2VuVHlwZUdldChmaWVsZC52YWx1ZS50eXBlKSArICIpIGJvb2wge1xuXHRyZXR1cm4gIjsKICAgICBjb2RlICs9IHNldHRlciArICIoIiArIE51bVRvU3RyaW5nKGZpZWxkLnZhbHVlLm9mZnNldCkgKyAiLCAiOwogICAgIGNvZGUgKz0gQ2FzdFRvQmFzZVR5cGUoZmllbGQudmFsdWUudHlwZSwgIm4iKSArICIpXG4iOwpAQCAtNzM4LDcgKzc0MSw3IEBACiAgICAgc3RkOjpzdHJpbmcgc2V0dGVyID0KICAgICAgICAgInJjdi5fdGFiLk11dGF0ZSIgKyBuYW1lcl8uTWV0aG9kKEdlblR5cGVCYXNpYyh2ZWN0b3J0eXBlKSk7CiAgICAgR2VuUmVjZWl2ZXIoc3RydWN0X2RlZiwgY29kZV9wdHIpOwotICAgIGNvZGUgKz0gIiBNdXRhdGUiICsgbmFtZXJfLkZ1bmN0aW9uKGZpZWxkLm5hbWUpOworICAgIGNvZGUgKz0gIiBNdXRhdGUiICsgbmFtZXJfLkZ1bmN0aW9uKGZpZWxkKTsKICAgICBjb2RlICs9ICIoaiBpbnQsIG4gIiArIFR5cGVOYW1lKGZpZWxkKSArICIpIGJvb2wgIjsKICAgICBjb2RlICs9IE9mZnNldFByZWZpeChmaWVsZCk7CiAgICAgY29kZSArPSAiXHRcdGEgOj0gcmN2Ll90YWIuVmVjdG9yKG8pXG4iOwpAQCAtODQxLDExICs4NDQsMTAgQEAKICAgICAgICAgICBmaWVsZC52YWx1ZS50eXBlLmVudW1fZGVmICE9IG51bGxwdHIgJiYKICAgICAgICAgICBmaWVsZC52YWx1ZS50eXBlLmVudW1fZGVmLT5pc191bmlvbikKICAgICAgICAgY29udGludWU7Ci0gICAgICBjb2RlICs9ICJcdCIgKyBuYW1lcl8uRmllbGQoZmllbGQubmFtZSkgKyAiICI7Ci0gICAgICBpZiAoZmllbGQuSXNTY2FsYXJPcHRpb25hbCgpKSB7Ci0gICAgICAgIGNvZGUgKz0gIioiOwotICAgICAgfQotICAgICAgY29kZSArPSBOYXRpdmVUeXBlKGZpZWxkLnZhbHVlLnR5cGUpICsgIlxuIjsKKyAgICAgIGNvZGUgKz0gIlx0IiArIG5hbWVyXy5GaWVsZChmaWVsZCkgKyAiICI7CisgICAgICBpZiAoZmllbGQuSXNTY2FsYXJPcHRpb25hbCgpKSB7IGNvZGUgKz0gIioiOyB9CisgICAgICBjb2RlICs9IE5hdGl2ZVR5cGUoZmllbGQudmFsdWUudHlwZSkgKyAiIGBqc29uOlwiIiArIGZpZWxkLm5hbWUgKyAiXCJgIiArCisgICAgICAgICAgICAgICJcbiI7CiAgICAgfQogICAgIGNvZGUgKz0gIn1cblxuIjsKIApAQCAtODYxLDcgKzg2Myw3IEBACiAgIHZvaWQgR2VuTmF0aXZlVW5pb24oY29uc3QgRW51bURlZiAmZW51bV9kZWYsIHN0ZDo6c3RyaW5nICpjb2RlX3B0cikgewogICAgIHN0ZDo6c3RyaW5nICZjb2RlID0gKmNvZGVfcHRyOwogICAgIGNvZGUgKz0gInR5cGUgIiArIE5hdGl2ZU5hbWUoZW51bV9kZWYpICsgIiBzdHJ1Y3Qge1xuIjsKLSAgICBjb2RlICs9ICJcdFR5cGUgIiArIG5hbWVyXy5UeXBlKGVudW1fZGVmLm5hbWUpICsgIlxuIjsKKyAgICBjb2RlICs9ICJcdFR5cGUgIiArIG5hbWVyXy5UeXBlKGVudW1fZGVmKSArICJcbiI7CiAgICAgY29kZSArPSAiXHRWYWx1ZSBpbnRlcmZhY2V7fVxuIjsKICAgICBjb2RlICs9ICJ9XG5cbiI7CiAgIH0KQEAgLTg3Nyw3ICs4NzksNyBAQAogICAgICAgICAgKytpdDIpIHsKICAgICAgIGNvbnN0IEVudW1WYWwgJmV2ID0gKippdDI7CiAgICAgICBpZiAoZXYuSXNaZXJvKCkpIGNvbnRpbnVlOwotICAgICAgY29kZSArPSAiXHRjYXNlICIgKyBuYW1lcl8uRW51bVZhcmlhbnQoZW51bV9kZWYubmFtZSwgZXYubmFtZSkgKyAiOlxuIjsKKyAgICAgIGNvZGUgKz0gIlx0Y2FzZSAiICsgbmFtZXJfLkVudW1WYXJpYW50KGVudW1fZGVmLCBldikgKyAiOlxuIjsKICAgICAgIGNvZGUgKz0gIlx0XHRyZXR1cm4gdC5WYWx1ZS4oIiArIE5hdGl2ZVR5cGUoZXYudW5pb25fdHlwZSkgKwogICAgICAgICAgICAgICAiKS5QYWNrKGJ1aWxkZXIpXG4iOwogICAgIH0KQEAgLTg4OSw3ICs4OTEsNyBAQAogICB2b2lkIEdlbk5hdGl2ZVVuaW9uVW5QYWNrKGNvbnN0IEVudW1EZWYgJmVudW1fZGVmLCBzdGQ6OnN0cmluZyAqY29kZV9wdHIpIHsKICAgICBzdGQ6OnN0cmluZyAmY29kZSA9ICpjb2RlX3B0cjsKIAotICAgIGNvZGUgKz0gImZ1bmMgKHJjdiAiICsgbmFtZXJfLlR5cGUoZW51bV9kZWYubmFtZSkgKworICAgIGNvZGUgKz0gImZ1bmMgKHJjdiAiICsgbmFtZXJfLlR5cGUoZW51bV9kZWYpICsKICAgICAgICAgICAgICIpIFVuUGFjayh0YWJsZSBmbGF0YnVmZmVycy5UYWJsZSkgKiIgKyBOYXRpdmVOYW1lKGVudW1fZGVmKSArCiAgICAgICAgICAgICAiIHtcbiI7CiAgICAgY29kZSArPSAiXHRzd2l0Y2ggcmN2IHtcbiI7CkBAIC04OTgsMTMgKzkwMCwxMyBAQAogICAgICAgICAgKytpdDIpIHsKICAgICAgIGNvbnN0IEVudW1WYWwgJmV2ID0gKippdDI7CiAgICAgICBpZiAoZXYuSXNaZXJvKCkpIGNvbnRpbnVlOwotICAgICAgY29kZSArPSAiXHRjYXNlICIgKyBuYW1lcl8uRW51bVZhcmlhbnQoZW51bV9kZWYubmFtZSwgZXYubmFtZSkgKyAiOlxuIjsKKyAgICAgIGNvZGUgKz0gIlx0Y2FzZSAiICsgbmFtZXJfLkVudW1WYXJpYW50KGVudW1fZGVmLCBldikgKyAiOlxuIjsKICAgICAgIGNvZGUgKz0gIlx0XHR4IDo9ICIgKyBldi51bmlvbl90eXBlLnN0cnVjdF9kZWYtPm5hbWUgKyAie190YWI6IHRhYmxlfVxuIjsKIAogICAgICAgY29kZSArPSAiXHRcdHJldHVybiAmIiArCiAgICAgICAgICAgICAgIFdyYXBJbk5hbWVTcGFjZUFuZFRyYWNrKGVudW1fZGVmLmRlZmluZWRfbmFtZXNwYWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOYXRpdmVOYW1lKGVudW1fZGVmKSkgKwotICAgICAgICAgICAgICAieyBUeXBlOiAiICsgbmFtZXJfLkVudW1WYXJpYW50KGVudW1fZGVmLm5hbWUsIGV2Lm5hbWUpICsKKyAgICAgICAgICAgICAgInsgVHlwZTogIiArIG5hbWVyXy5FbnVtVmFyaWFudChlbnVtX2RlZiwgZXYpICsKICAgICAgICAgICAgICAgIiwgVmFsdWU6IHguVW5QYWNrKCkgfVxuIjsKICAgICB9CiAgICAgY29kZSArPSAiXHR9XG4iOwpAQCAtOTE0LDcgKzkxNiw3IEBACiAKICAgdm9pZCBHZW5OYXRpdmVUYWJsZVBhY2soY29uc3QgU3RydWN0RGVmICZzdHJ1Y3RfZGVmLCBzdGQ6OnN0cmluZyAqY29kZV9wdHIpIHsKICAgICBzdGQ6OnN0cmluZyAmY29kZSA9ICpjb2RlX3B0cjsKLSAgICBjb25zdCBzdGQ6OnN0cmluZyBzdHJ1Y3RfdHlwZSA9IG5hbWVyXy5UeXBlKHN0cnVjdF9kZWYubmFtZSk7CisgICAgY29uc3Qgc3RkOjpzdHJpbmcgc3RydWN0X3R5cGUgPSBuYW1lcl8uVHlwZShzdHJ1Y3RfZGVmKTsKIAogICAgIGNvZGUgKz0gImZ1bmMgKHQgKiIgKyBOYXRpdmVOYW1lKHN0cnVjdF9kZWYpICsKICAgICAgICAgICAgICIpIFBhY2soYnVpbGRlciAqZmxhdGJ1ZmZlcnMuQnVpbGRlcikgZmxhdGJ1ZmZlcnMuVU9mZnNldFQge1xuIjsKQEAgLTkyNSw4ICs5MjcsOCBAQAogICAgICAgaWYgKGZpZWxkLmRlcHJlY2F0ZWQpIGNvbnRpbnVlOwogICAgICAgaWYgKElzU2NhbGFyKGZpZWxkLnZhbHVlLnR5cGUuYmFzZV90eXBlKSkgY29udGludWU7CiAKLSAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nIGZpZWxkX2ZpZWxkID0gbmFtZXJfLkZpZWxkKGZpZWxkLm5hbWUpOwotICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgZmllbGRfdmFyID0gbmFtZXJfLlZhcmlhYmxlKGZpZWxkLm5hbWUpOworICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgZmllbGRfZmllbGQgPSBuYW1lcl8uRmllbGQoZmllbGQpOworICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgZmllbGRfdmFyID0gbmFtZXJfLlZhcmlhYmxlKGZpZWxkKTsKICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nIG9mZnNldCA9IGZpZWxkX3ZhciArICJPZmZzZXQiOwogCiAgICAgICBpZiAoSXNTdHJpbmcoZmllbGQudmFsdWUudHlwZSkpIHsKQEAgLTk2Miw3ICs5NjQsNyBAQAogICAgICAgICAgICAgICAgICAgIltqXS5QYWNrKGJ1aWxkZXIpXG4iOwogICAgICAgICAgIGNvZGUgKz0gIlx0XHR9XG4iOwogICAgICAgICB9Ci0gICAgICAgIGNvZGUgKz0gIlx0XHQiICsgc3RydWN0X3R5cGUgKyAiU3RhcnQiICsgbmFtZXJfLkZ1bmN0aW9uKGZpZWxkLm5hbWUpICsKKyAgICAgICAgY29kZSArPSAiXHRcdCIgKyBzdHJ1Y3RfdHlwZSArICJTdGFydCIgKyBuYW1lcl8uRnVuY3Rpb24oZmllbGQpICsKICAgICAgICAgICAgICAgICAiVmVjdG9yKGJ1aWxkZXIsICIgKyBsZW5ndGggKyAiKVxuIjsKICAgICAgICAgY29kZSArPSAiXHRcdGZvciBqIDo9ICIgKyBsZW5ndGggKyAiIC0gMTsgaiA+PSAwOyBqLS0ge1xuIjsKICAgICAgICAgaWYgKElzU2NhbGFyKGZpZWxkLnZhbHVlLnR5cGUuZWxlbWVudCkpIHsKQEAgLTk5Niw5ICs5OTgsOSBAQAogICAgICAgICAgaXQgIT0gc3RydWN0X2RlZi5maWVsZHMudmVjLmVuZCgpOyArK2l0KSB7CiAgICAgICBjb25zdCBGaWVsZERlZiAmZmllbGQgPSAqKml0OwogICAgICAgaWYgKGZpZWxkLmRlcHJlY2F0ZWQpIGNvbnRpbnVlOwotICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgZmllbGRfZmllbGQgPSBuYW1lcl8uRmllbGQoZmllbGQubmFtZSk7Ci0gICAgICBjb25zdCBzdGQ6OnN0cmluZyBmaWVsZF9mbiA9IG5hbWVyXy5GdW5jdGlvbihmaWVsZC5uYW1lKTsKLSAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nIG9mZnNldCA9IG5hbWVyXy5WYXJpYWJsZShmaWVsZC5uYW1lKSArICJPZmZzZXQiOworICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgZmllbGRfZmllbGQgPSBuYW1lcl8uRmllbGQoZmllbGQpOworICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgZmllbGRfZm4gPSBuYW1lcl8uRnVuY3Rpb24oZmllbGQpOworICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgb2Zmc2V0ID0gbmFtZXJfLlZhcmlhYmxlKGZpZWxkKSArICJPZmZzZXQiOwogCiAgICAgICBpZiAoSXNTY2FsYXIoZmllbGQudmFsdWUudHlwZS5iYXNlX3R5cGUpKSB7CiAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeDsKQEAgLTEwMTEsOSArMTAxMyw3IEBACiAgICAgICAgICAgY29kZSArPSAiXHQiICsgc3RydWN0X3R5cGUgKyAiQWRkIiArIGZpZWxkX2ZuICsgIihidWlsZGVyLCAiICsKICAgICAgICAgICAgICAgICAgIHByZWZpeCArICJ0LiIgKyBmaWVsZF9maWVsZCArICIpXG4iOwogICAgICAgICB9Ci0gICAgICAgIGlmIChmaWVsZC5Jc1NjYWxhck9wdGlvbmFsKCkpIHsKLSAgICAgICAgICBjb2RlICs9ICJcdH1cbiI7Ci0gICAgICAgIH0KKyAgICAgICAgaWYgKGZpZWxkLklzU2NhbGFyT3B0aW9uYWwoKSkgeyBjb2RlICs9ICJcdH1cbiI7IH0KICAgICAgIH0gZWxzZSB7CiAgICAgICAgIGlmIChmaWVsZC52YWx1ZS50eXBlLmJhc2VfdHlwZSA9PSBCQVNFX1RZUEVfU1RSVUNUICYmCiAgICAgICAgICAgICBmaWVsZC52YWx1ZS50eXBlLnN0cnVjdF9kZWYtPmZpeGVkKSB7CkBAIC0xMDM3LDcgKzEwMzcsNyBAQAogICB2b2lkIEdlbk5hdGl2ZVRhYmxlVW5QYWNrKGNvbnN0IFN0cnVjdERlZiAmc3RydWN0X2RlZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyAqY29kZV9wdHIpIHsKICAgICBzdGQ6OnN0cmluZyAmY29kZSA9ICpjb2RlX3B0cjsKLSAgICBjb25zdCBzdGQ6OnN0cmluZyBzdHJ1Y3RfdHlwZSA9IG5hbWVyXy5UeXBlKHN0cnVjdF9kZWYubmFtZSk7CisgICAgY29uc3Qgc3RkOjpzdHJpbmcgc3RydWN0X3R5cGUgPSBuYW1lcl8uVHlwZShzdHJ1Y3RfZGVmKTsKIAogICAgIGNvZGUgKz0gImZ1bmMgKHJjdiAqIiArIHN0cnVjdF90eXBlICsgIikgVW5QYWNrVG8odCAqIiArCiAgICAgICAgICAgICBOYXRpdmVOYW1lKHN0cnVjdF9kZWYpICsgIikge1xuIjsKQEAgLTEwNDUsOCArMTA0NSw4IEBACiAgICAgICAgICBpdCAhPSBzdHJ1Y3RfZGVmLmZpZWxkcy52ZWMuZW5kKCk7ICsraXQpIHsKICAgICAgIGNvbnN0IEZpZWxkRGVmICZmaWVsZCA9ICoqaXQ7CiAgICAgICBpZiAoZmllbGQuZGVwcmVjYXRlZCkgY29udGludWU7Ci0gICAgICBjb25zdCBzdGQ6OnN0cmluZyBmaWVsZF9maWVsZCA9IG5hbWVyXy5GaWVsZChmaWVsZC5uYW1lKTsKLSAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nIGZpZWxkX3ZhciA9IG5hbWVyXy5WYXJpYWJsZShmaWVsZC5uYW1lKTsKKyAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nIGZpZWxkX2ZpZWxkID0gbmFtZXJfLkZpZWxkKGZpZWxkKTsKKyAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nIGZpZWxkX3ZhciA9IG5hbWVyXy5WYXJpYWJsZShmaWVsZCk7CiAgICAgICBjb25zdCBzdGQ6OnN0cmluZyBsZW5ndGggPSBmaWVsZF92YXIgKyAiTGVuZ3RoIjsKICAgICAgIGlmIChJc1NjYWxhcihmaWVsZC52YWx1ZS50eXBlLmJhc2VfdHlwZSkpIHsKICAgICAgICAgaWYgKGZpZWxkLnZhbHVlLnR5cGUuZW51bV9kZWYgIT0gbnVsbHB0ciAmJgpAQCAtMTA4OSw4ICsxMDg5LDggQEAKICAgICAgIH0gZWxzZSBpZiAoZmllbGQudmFsdWUudHlwZS5iYXNlX3R5cGUgPT0gQkFTRV9UWVBFX1VOSU9OKSB7CiAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nIGZpZWxkX3RhYmxlID0gZmllbGRfdmFyICsgIlRhYmxlIjsKICAgICAgICAgY29kZSArPSAiXHQiICsgZmllbGRfdGFibGUgKyAiIDo9IGZsYXRidWZmZXJzLlRhYmxle31cbiI7Ci0gICAgICAgIGNvZGUgKz0gIlx0aWYgcmN2LiIgKyBuYW1lcl8uTWV0aG9kKGZpZWxkLm5hbWUpICsgIigmIiArIGZpZWxkX3RhYmxlICsKLSAgICAgICAgICAgICAgICAiKSB7XG4iOworICAgICAgICBjb2RlICs9CisgICAgICAgICAgICAiXHRpZiByY3YuIiArIG5hbWVyXy5NZXRob2QoZmllbGQpICsgIigmIiArIGZpZWxkX3RhYmxlICsgIikge1xuIjsKICAgICAgICAgY29kZSArPSAiXHRcdHQuIiArIGZpZWxkX2ZpZWxkICsgIiA9IHJjdi4iICsKICAgICAgICAgICAgICAgICBuYW1lcl8uTWV0aG9kKGZpZWxkLm5hbWUgKyBVbmlvblR5cGVGaWVsZFN1ZmZpeCgpKSArCiAgICAgICAgICAgICAgICAgIigpLlVuUGFjaygiICsgZmllbGRfdGFibGUgKyAiKVxuIjsKQEAgLTExMTYsNyArMTExNiw3IEBACiAgICAgY29kZSArPSAiZnVuYyAodCAqIiArIE5hdGl2ZU5hbWUoc3RydWN0X2RlZikgKwogICAgICAgICAgICAgIikgUGFjayhidWlsZGVyICpmbGF0YnVmZmVycy5CdWlsZGVyKSBmbGF0YnVmZmVycy5VT2Zmc2V0VCB7XG4iOwogICAgIGNvZGUgKz0gIlx0aWYgdCA9PSBuaWwgeyByZXR1cm4gMCB9XG4iOwotICAgIGNvZGUgKz0gIlx0cmV0dXJuIENyZWF0ZSIgKyBuYW1lcl8uVHlwZShzdHJ1Y3RfZGVmLm5hbWUpICsgIihidWlsZGVyIjsKKyAgICBjb2RlICs9ICJcdHJldHVybiBDcmVhdGUiICsgbmFtZXJfLlR5cGUoc3RydWN0X2RlZikgKyAiKGJ1aWxkZXIiOwogICAgIFN0cnVjdFBhY2tBcmdzKHN0cnVjdF9kZWYsICIiLCBjb2RlX3B0cik7CiAgICAgY29kZSArPSAiKVxuIjsKICAgICBjb2RlICs9ICJ9XG4iOwpAQCAtMTEzMCwxMCArMTEzMCwxMCBAQAogICAgICAgY29uc3QgRmllbGREZWYgJmZpZWxkID0gKippdDsKICAgICAgIGlmIChmaWVsZC52YWx1ZS50eXBlLmJhc2VfdHlwZSA9PSBCQVNFX1RZUEVfU1RSVUNUKSB7CiAgICAgICAgIFN0cnVjdFBhY2tBcmdzKCpmaWVsZC52YWx1ZS50eXBlLnN0cnVjdF9kZWYsCi0gICAgICAgICAgICAgICAgICAgICAgIChuYW1lcHJlZml4ICsgbmFtZXJfLkZpZWxkKGZpZWxkLm5hbWUpICsgIi4iKS5jX3N0cigpLAorICAgICAgICAgICAgICAgICAgICAgICAobmFtZXByZWZpeCArIG5hbWVyXy5GaWVsZChmaWVsZCkgKyAiLiIpLmNfc3RyKCksCiAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVfcHRyKTsKICAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGNvZGUgKz0gc3RkOjpzdHJpbmcoIiwgdC4iKSArIG5hbWVwcmVmaXggKyBuYW1lcl8uRmllbGQoZmllbGQubmFtZSk7CisgICAgICAgIGNvZGUgKz0gc3RkOjpzdHJpbmcoIiwgdC4iKSArIG5hbWVwcmVmaXggKyBuYW1lcl8uRmllbGQoZmllbGQpOwogICAgICAgfQogICAgIH0KICAgfQpAQCAtMTE0MiwyMiArMTE0MiwyMiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyAqY29kZV9wdHIpIHsKICAgICBzdGQ6OnN0cmluZyAmY29kZSA9ICpjb2RlX3B0cjsKIAotICAgIGNvZGUgKz0gImZ1bmMgKHJjdiAqIiArIG5hbWVyXy5UeXBlKHN0cnVjdF9kZWYubmFtZSkgKyAiKSBVblBhY2tUbyh0ICoiICsKKyAgICBjb2RlICs9ICJmdW5jIChyY3YgKiIgKyBuYW1lcl8uVHlwZShzdHJ1Y3RfZGVmKSArICIpIFVuUGFja1RvKHQgKiIgKwogICAgICAgICAgICAgTmF0aXZlTmFtZShzdHJ1Y3RfZGVmKSArICIpIHtcbiI7CiAgICAgZm9yIChhdXRvIGl0ID0gc3RydWN0X2RlZi5maWVsZHMudmVjLmJlZ2luKCk7CiAgICAgICAgICBpdCAhPSBzdHJ1Y3RfZGVmLmZpZWxkcy52ZWMuZW5kKCk7ICsraXQpIHsKICAgICAgIGNvbnN0IEZpZWxkRGVmICZmaWVsZCA9ICoqaXQ7CiAgICAgICBpZiAoZmllbGQudmFsdWUudHlwZS5iYXNlX3R5cGUgPT0gQkFTRV9UWVBFX1NUUlVDVCkgewotICAgICAgICBjb2RlICs9ICJcdHQuIiArIG5hbWVyXy5GaWVsZChmaWVsZC5uYW1lKSArICIgPSByY3YuIiArCi0gICAgICAgICAgICAgICAgbmFtZXJfLk1ldGhvZChmaWVsZC5uYW1lKSArICIobmlsKS5VblBhY2soKVxuIjsKKyAgICAgICAgY29kZSArPSAiXHR0LiIgKyBuYW1lcl8uRmllbGQoZmllbGQpICsgIiA9IHJjdi4iICsKKyAgICAgICAgICAgICAgICBuYW1lcl8uTWV0aG9kKGZpZWxkKSArICIobmlsKS5VblBhY2soKVxuIjsKICAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGNvZGUgKz0gIlx0dC4iICsgbmFtZXJfLkZpZWxkKGZpZWxkLm5hbWUpICsgIiA9IHJjdi4iICsKLSAgICAgICAgICAgICAgICBuYW1lcl8uTWV0aG9kKGZpZWxkLm5hbWUpICsgIigpXG4iOworICAgICAgICBjb2RlICs9ICJcdHQuIiArIG5hbWVyXy5GaWVsZChmaWVsZCkgKyAiID0gcmN2LiIgKworICAgICAgICAgICAgICAgIG5hbWVyXy5NZXRob2QoZmllbGQpICsgIigpXG4iOwogICAgICAgfQogICAgIH0KICAgICBjb2RlICs9ICJ9XG5cbiI7CiAKLSAgICBjb2RlICs9ICJmdW5jIChyY3YgKiIgKyBuYW1lcl8uVHlwZShzdHJ1Y3RfZGVmLm5hbWUpICsgIikgVW5QYWNrKCkgKiIgKworICAgIGNvZGUgKz0gImZ1bmMgKHJjdiAqIiArIG5hbWVyXy5UeXBlKHN0cnVjdF9kZWYpICsgIikgVW5QYWNrKCkgKiIgKwogICAgICAgICAgICAgTmF0aXZlTmFtZShzdHJ1Y3RfZGVmKSArICIge1xuIjsKICAgICBjb2RlICs9ICJcdGlmIHJjdiA9PSBuaWwgeyByZXR1cm4gbmlsIH1cbiI7CiAgICAgY29kZSArPSAiXHR0IDo9ICYiICsgTmF0aXZlTmFtZShzdHJ1Y3RfZGVmKSArICJ7fVxuIjsKQEAgLTEyNDcsOSArMTI0Nyw3IEBACiAKICAgc3RkOjpzdHJpbmcgVHlwZU5hbWUoY29uc3QgRmllbGREZWYgJmZpZWxkKSB7CiAgICAgc3RkOjpzdHJpbmcgcHJlZml4OwotICAgIGlmIChmaWVsZC5Jc1NjYWxhck9wdGlvbmFsKCkpIHsKLSAgICAgIHByZWZpeCA9ICIqIjsKLSAgICB9CisgICAgaWYgKGZpZWxkLklzU2NhbGFyT3B0aW9uYWwoKSkgeyBwcmVmaXggPSAiKiI7IH0KICAgICByZXR1cm4gcHJlZml4ICsgR2VuVHlwZUdldChmaWVsZC52YWx1ZS50eXBlKTsKICAgfQogCkBAIC0xMjc0LDkgKzEyNzIsNyBAQAogICB9CiAKICAgc3RkOjpzdHJpbmcgR2VuQ29uc3RhbnQoY29uc3QgRmllbGREZWYgJmZpZWxkKSB7Ci0gICAgaWYgKGZpZWxkLklzU2NhbGFyT3B0aW9uYWwoKSkgewotICAgICAgcmV0dXJuICJuaWwiOwotICAgIH0KKyAgICBpZiAoZmllbGQuSXNTY2FsYXJPcHRpb25hbCgpKSB7IHJldHVybiAibmlsIjsgfQogICAgIHN3aXRjaCAoZmllbGQudmFsdWUudHlwZS5iYXNlX3R5cGUpIHsKICAgICAgIGNhc2UgQkFTRV9UWVBFX0JPT0w6CiAgICAgICAgIHJldHVybiBmaWVsZC52YWx1ZS5jb25zdGFudCA9PSAiMCIgPyAiZmFsc2UiIDogInRydWUiOwpAQCAtMTI4NSwxMSArMTI4MSwxMSBAQAogICB9CiAKICAgc3RkOjpzdHJpbmcgTmF0aXZlTmFtZShjb25zdCBTdHJ1Y3REZWYgJnN0cnVjdF9kZWYpIGNvbnN0IHsKLSAgICByZXR1cm4gbmFtZXJfLk9iamVjdFR5cGUoc3RydWN0X2RlZi5uYW1lKTsKKyAgICByZXR1cm4gbmFtZXJfLk9iamVjdFR5cGUoc3RydWN0X2RlZik7CiAgIH0KIAogICBzdGQ6OnN0cmluZyBOYXRpdmVOYW1lKGNvbnN0IEVudW1EZWYgJmVudW1fZGVmKSBjb25zdCB7Ci0gICAgcmV0dXJuIG5hbWVyXy5PYmplY3RUeXBlKGVudW1fZGVmLm5hbWUpOworICAgIHJldHVybiBuYW1lcl8uT2JqZWN0VHlwZShlbnVtX2RlZik7CiAgIH0KIAogICBzdGQ6OnN0cmluZyBOYXRpdmVUeXBlKGNvbnN0IFR5cGUgJnR5cGUpIHsKQEAgLTEzNjYsMjAgKzEzNjIsMjEgQEAKICAgICB3aGlsZSAoY29kZS5sZW5ndGgoKSA+IDIgJiYgY29kZS5zdWJzdHIoY29kZS5sZW5ndGgoKSAtIDIpID09ICJcblxuIikgewogICAgICAgY29kZS5wb3BfYmFjaygpOwogICAgIH0KLSAgICBzdGQ6OnN0cmluZyBmaWxlbmFtZSA9IG5hbWVyXy5EaXJlY3Rvcmllcyhucy5jb21wb25lbnRzKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lcl8uRmlsZShkZWYubmFtZSwgU2tpcEZpbGU6OlN1ZmZpeCk7CisgICAgc3RkOjpzdHJpbmcgZGlyZWN0b3J5ID0gbmFtZXJfLkRpcmVjdG9yaWVzKG5zKTsKKyAgICBzdGQ6OnN0cmluZyBmaWxlID0gbmFtZXJfLkZpbGUoZGVmLCBTa2lwRmlsZTo6U3VmZml4KTsKKyAgICBFbnN1cmVEaXJFeGlzdHMoZGlyZWN0b3J5KTsKKyAgICBzdGQ6OnN0cmluZyBmaWxlbmFtZSA9IGRpcmVjdG9yeSArIGZpbGU7CiAgICAgcmV0dXJuIFNhdmVGaWxlKGZpbGVuYW1lLmNfc3RyKCksIGNvZGUsIGZhbHNlKTsKICAgfQogCiAgIC8vIENyZWF0ZSB0aGUgZnVsbCBuYW1lIG9mIHRoZSBpbXBvcnRlZCBuYW1lc3BhY2UgKGZvcm1hdDogQV9fQl9fQykuCiAgIHN0ZDo6c3RyaW5nIE5hbWVzcGFjZUltcG9ydE5hbWUoY29uc3QgTmFtZXNwYWNlICpucykgY29uc3QgewotICAgIHJldHVybiBuYW1lcl8uTmFtZXNwYWNlKG5zLT5jb21wb25lbnRzKTsKKyAgICByZXR1cm4gbmFtZXJfLk5hbWVzcGFjZSgqbnMpOwogICB9CiAKICAgLy8gQ3JlYXRlIHRoZSBmdWxsIHBhdGggZm9yIHRoZSBpbXBvcnRlZCBuYW1lc3BhY2UgKGZvcm1hdDogQS9CL0MpLgogICBzdGQ6OnN0cmluZyBOYW1lc3BhY2VJbXBvcnRQYXRoKGNvbnN0IE5hbWVzcGFjZSAqbnMpIGNvbnN0IHsKLSAgICByZXR1cm4gbmFtZXJfLkRpcmVjdG9yaWVzKG5zLT5jb21wb25lbnRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2tpcERpcjo6T3V0cHV0UGF0aEFuZFRyYWlsaW5nUGF0aFNlcGFyYXRvcik7CisgICAgcmV0dXJuIG5hbWVyXy5EaXJlY3RvcmllcygqbnMsIFNraXBEaXI6Ok91dHB1dFBhdGhBbmRUcmFpbGluZ1BhdGhTZXBhcmF0b3IpOwogICB9CiAKICAgLy8gRW5zdXJlIHRoYXQgYSB0eXBlIGlzIHByZWZpeGVkIHdpdGggaXRzIGdvIHBhY2thZ2UgaW1wb3J0IG5hbWUgaWYgaXQgaXMKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3NyYy9pZGxfZ2VuX2dycGMuY3BwIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvc3JjL2lkbF9nZW5fZ3JwYy5jcHAKaW5kZXggNjg5NGZmYi4uMmJlMjRlNyAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvc3JjL2lkbF9nZW5fZ3JwYy5jcHAKKysrIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvc3JjL2lkbF9nZW5fZ3JwYy5jcHAKQEAgLTI0MiwxMiArMjQyLDYgQEAKICAgICByZXR1cm4gU3RyaXBFeHRlbnNpb24oZmlsZV9uYW1lXyk7CiAgIH0KIAotICBzdGQ6OnN0cmluZyBtZXNzYWdlX2hlYWRlcl9leHQoKSBjb25zdCB7Ci0gICAgcmV0dXJuIHBhcnNlcl8ub3B0cy5maWxlbmFtZV9zdWZmaXggKyAiLmgiOwotICB9Ci0KLSAgc3RkOjpzdHJpbmcgc2VydmljZV9oZWFkZXJfZXh0KCkgY29uc3QgeyByZXR1cm4gIi5ncnBjLmZiLmgiOyB9Ci0KICAgc3RkOjpzdHJpbmcgcGFja2FnZSgpIGNvbnN0IHsKICAgICByZXR1cm4gcGFyc2VyXy5jdXJyZW50X25hbWVzcGFjZV8tPkdldEZ1bGx5UXVhbGlmaWVkTmFtZSgiIik7CiAgIH0KQEAgLTM0Nyw2ICszNDEsNyBAQAogCiBib29sIEdlbmVyYXRlQ3BwR1JQQyhjb25zdCBQYXJzZXIgJnBhcnNlciwgY29uc3Qgc3RkOjpzdHJpbmcgJnBhdGgsCiAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyAmZmlsZV9uYW1lKSB7CisgIGNvbnN0IGF1dG8gJm9wdHMgPSBwYXJzZXIub3B0czsKICAgaW50IG5zZXJ2aWNlcyA9IDA7CiAgIGZvciAoYXV0byBpdCA9IHBhcnNlci5zZXJ2aWNlc18udmVjLmJlZ2luKCk7IGl0ICE9IHBhcnNlci5zZXJ2aWNlc18udmVjLmVuZCgpOwogICAgICAgICsraXQpIHsKQEAgLTM1NCw5ICszNDksMTUgQEAKICAgfQogICBpZiAoIW5zZXJ2aWNlcykgcmV0dXJuIHRydWU7CiAKKyAgc3RkOjpzdHJpbmcgc3VmZml4ID0gIiI7CisgIHN1ZmZpeCArPSBvcHRzLmZpbGVuYW1lX3N1ZmZpeC5lbXB0eSgpID8gIl9nZW5lcmF0ZWQiIDogb3B0cy5maWxlbmFtZV9zdWZmaXg7CisgIHN1ZmZpeCArPSAiLiI7CisgIHN1ZmZpeCArPSBvcHRzLmZpbGVuYW1lX2V4dGVuc2lvbi5lbXB0eSgpID8gImgiIDogb3B0cy5maWxlbmFtZV9leHRlbnNpb247CisKICAgZ3JwY19jcHBfZ2VuZXJhdG9yOjpQYXJhbWV0ZXJzIGdlbmVyYXRvcl9wYXJhbWV0ZXJzOwogICAvLyBUT0RPKHd2byk6IG1ha2UgdGhlIG90aGVyIHBhcmFtZXRlcnMgaW4gdGhpcyBzdHJ1Y3QgY29uZmlndXJhYmxlLgogICBnZW5lcmF0b3JfcGFyYW1ldGVycy51c2Vfc3lzdGVtX2hlYWRlcnMgPSB0cnVlOworICBnZW5lcmF0b3JfcGFyYW1ldGVycy5tZXNzYWdlX2hlYWRlcl9leHRlbnNpb24gPSBzdWZmaXg7CiAKICAgRmxhdEJ1ZkZpbGUgZmJmaWxlKHBhcnNlciwgZmlsZV9uYW1lLCBGbGF0QnVmRmlsZTo6a0xhbmd1YWdlQ3BwKTsKIApkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvc3JjL2lkbF9nZW5famF2YS5jcHAgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy9zcmMvaWRsX2dlbl9qYXZhLmNwcAppbmRleCBlZTA5MzkxLi42ZWU5N2FhIDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy9zcmMvaWRsX2dlbl9qYXZhLmNwcAorKysgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy9zcmMvaWRsX2dlbl9qYXZhLmNwcApAQCAtMjAsMjAgKzIwLDY1IEBACiAjaW5jbHVkZSAiZmxhdGJ1ZmZlcnMvZmxhdGJ1ZmZlcnMuaCIKICNpbmNsdWRlICJmbGF0YnVmZmVycy9pZGwuaCIKICNpbmNsdWRlICJmbGF0YnVmZmVycy91dGlsLmgiCisjaW5jbHVkZSAiaWRsX25hbWVyLmgiCiAKIG5hbWVzcGFjZSBmbGF0YnVmZmVycyB7CiBuYW1lc3BhY2UgamF2YSB7CiAKLXN0YXRpYyBUeXBlZEZsb2F0Q29uc3RhbnRHZW5lcmF0b3IgSmF2YUZsb2F0R2VuKCJEb3VibGUuIiwgIkZsb2F0LiIsICJOYU4iLAorbmFtZXNwYWNlIHsKKworc3RhdGljIE5hbWVyOjpDb25maWcgSmF2YURlZmF1bHRDb25maWcoKSB7CisgIHJldHVybiB7CisgICAgLyp0eXBlcz0qL0Nhc2U6OmtLZWVwLAorICAgIC8qY29uc3RhbnRzPSovQ2FzZTo6a1NjcmVhbWluZ1NuYWtlLAorICAgIC8qbWV0aG9kcz0qL0Nhc2U6OmtMb3dlckNhbWVsLAorICAgIC8qZnVuY3Rpb25zPSovQ2FzZTo6a0xvd2VyQ2FtZWwsCisgICAgLypmaWVsZHM9Ki9DYXNlOjprTG93ZXJDYW1lbCwKKyAgICAvKnZhcmlhYmxlcz0qL0Nhc2U6OmtMb3dlckNhbWVsLAorICAgIC8qdmFyaWFudHM9Ki9DYXNlOjprS2VlcCwKKyAgICAvKmVudW1fdmFyaWFudF9zZXBlcmF0b3I9Ki8iLiIsCisgICAgLyplc2NhcGVfa2V5d29yZHM9Ki9OYW1lcjo6Q29uZmlnOjpFc2NhcGU6OkFmdGVyQ29udmVydGluZ0Nhc2UsCisgICAgLypuYW1lc3BhY2VzPSovQ2FzZTo6a0tlZXAsCisgICAgLypuYW1lc3BhY2Vfc2VwZXJhdG9yPSovIi4iLAorICAgIC8qb2JqZWN0X3ByZWZpeD0qLyIiLAorICAgIC8qb2JqZWN0X3N1ZmZpeD0qLyJUIiwKKyAgICAvKmtleXdvcmRfcHJlZml4PSovIiIsCisgICAgLyprZXl3b3JkX3N1ZmZpeD0qLyJfIiwKKyAgICAvKmZpbGVuYW1lcz0qL0Nhc2U6OmtLZWVwLAorICAgIC8qZGlyZWN0b3JpZXM9Ki9DYXNlOjprS2VlcCwKKyAgICAvKm91dHB1dF9wYXRoPSovIiIsCisgICAgLypmaWxlbmFtZV9zdWZmaXg9Ki8iX2dlbmVyYXRlZCIsCisgICAgLypmaWxlbmFtZV9leHRlbnNpb249Ki8iLmphdmEiLAorICB9OworfQorCitzdGF0aWMgc3RkOjpzZXQ8c3RkOjpzdHJpbmc+IEphdmFLZXl3b3JkcygpIHsKKyAgcmV0dXJuIHsKKyAgICAiYWJzdHJhY3QiLCAiY29udGludWUiLCAiZm9yIiwgICAgICAgICJuZXciLCAgICAgICAic3dpdGNoIiwKKyAgICAiYXNzZXJ0IiwgICAiZGVmYXVsdCIsICAiZ290byIsICAgICAgICJwYWNrYWdlIiwgICAic3luY2hyb25pemVkIiwKKyAgICAiYm9vbGVhbiIsICAiZG8iLCAgICAgICAiaWYiLCAgICAgICAgICJwcml2YXRlIiwgICAidGhpcyIsCisgICAgImJyZWFrIiwgICAgImRvdWJsZSIsICAgImltcGxlbWVudHMiLCAicHJvdGVjdGVkIiwgInRocm93IiwKKyAgICAiYnl0ZSIsICAgICAiZWxzZSIsICAgICAiaW1wb3J0IiwgICAgICJwdWJsaWMiLCAgICAidGhyb3dzIiwKKyAgICAiY2FzZSIsICAgICAiZW51bSIsICAgICAiaW5zdGFuY2VvZiIsICJyZXR1cm4iLCAgICAidHJhbnNpZW50IiwKKyAgICAiY2F0Y2giLCAgICAiZXh0ZW5kcyIsICAiaW50IiwgICAgICAgICJzaG9ydCIsICAgICAidHJ5IiwKKyAgICAiY2hhciIsICAgICAiZmluYWwiLCAgICAiaW50ZXJmYWNlIiwgICJzdGF0aWMiLCAgICAidm9pZCIsCisgICAgImNsYXNzIiwgICAgImZpbmFsbHkiLCAgImxvbmciLCAgICAgICAic3RyaWN0ZnAiLCAgInZvbGF0aWxlIiwKKyAgICAiY29uc3QiLCAgICAiZmxvYXQiLCAgICAibmF0aXZlIiwgICAgICJzdXBlciIsICAgICAid2hpbGUiLAorICB9OworfQorCitzdGF0aWMgY29uc3QgVHlwZWRGbG9hdENvbnN0YW50R2VuZXJhdG9yIEphdmFGbG9hdEdlbigiRG91YmxlLiIsICJGbG9hdC4iLCAiTmFOIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJQT1NJVElWRV9JTkZJTklUWSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTkVHQVRJVkVfSU5GSU5JVFkiKTsKIAotc3RhdGljIENvbW1lbnRDb25maWcgY29tbWVudF9jb25maWcgPSB7CitzdGF0aWMgY29uc3QgQ29tbWVudENvbmZpZyBjb21tZW50X2NvbmZpZyA9IHsKICAgIi8qKiIsCiAgICIgKiIsCiAgICIgKi8iLAogfTsKIAorfSAvLyBuYW1lc3BhY2UKKwogY2xhc3MgSmF2YUdlbmVyYXRvciA6IHB1YmxpYyBCYXNlR2VuZXJhdG9yIHsKICAgc3RydWN0IEZpZWxkQXJyYXlMZW5ndGggewogICAgIHN0ZDo6c3RyaW5nIG5hbWU7CkBAIC00NCw3ICs4OSw5IEBACiAgIEphdmFHZW5lcmF0b3IoY29uc3QgUGFyc2VyICZwYXJzZXIsIGNvbnN0IHN0ZDo6c3RyaW5nICZwYXRoLAogICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nICZmaWxlX25hbWUpCiAgICAgICA6IEJhc2VHZW5lcmF0b3IocGFyc2VyLCBwYXRoLCBmaWxlX25hbWUsICIiLCAiLiIsICJqYXZhIiksCi0gICAgICAgIGN1cl9uYW1lX3NwYWNlXyhudWxscHRyKSB7fQorICAgICAgICBjdXJfbmFtZV9zcGFjZV8obnVsbHB0ciksCisgICAgICAgIG5hbWVyXyhXaXRoRmxhZ09wdGlvbnMoSmF2YURlZmF1bHRDb25maWcoKSwgcGFyc2VyLm9wdHMsIHBhdGgpLAorICAgICAgICAgICAgICAgSmF2YUtleXdvcmRzKCkpIHt9CiAKICAgSmF2YUdlbmVyYXRvciAmb3BlcmF0b3I9KGNvbnN0IEphdmFHZW5lcmF0b3IgJik7CiAgIGJvb2wgZ2VuZXJhdGUoKSB7CkBAIC01Niw3ICsxMDMsNyBAQAogICAgICAgc3RkOjpzdHJpbmcgZW51bWNvZGU7CiAgICAgICBhdXRvICZlbnVtX2RlZiA9ICoqaXQ7CiAgICAgICBpZiAoIXBhcnNlcl8ub3B0cy5vbmVfZmlsZSkgY3VyX25hbWVfc3BhY2VfID0gZW51bV9kZWYuZGVmaW5lZF9uYW1lc3BhY2U7Ci0gICAgICBHZW5FbnVtKGVudW1fZGVmLCAmZW51bWNvZGUpOworICAgICAgR2VuRW51bShlbnVtX2RlZiwgZW51bWNvZGUpOwogICAgICAgaWYgKHBhcnNlcl8ub3B0cy5vbmVfZmlsZSkgewogICAgICAgICBvbmVfZmlsZV9jb2RlICs9IGVudW1jb2RlOwogICAgICAgfSBlbHNlIHsKQEAgLTY3LDggKzExNCw4IEBACiAKICAgICAgIGlmIChwYXJzZXJfLm9wdHMuZ2VuZXJhdGVfb2JqZWN0X2Jhc2VkX2FwaSAmJiBlbnVtX2RlZi5pc191bmlvbikgewogICAgICAgICBlbnVtY29kZSA9ICIiOwotICAgICAgICBHZW5FbnVtX09iamVjdEFQSShlbnVtX2RlZiwgJmVudW1jb2RlLCBwYXJzZXJfLm9wdHMpOwotICAgICAgICBhdXRvIGNsYXNzX25hbWUgPSBlbnVtX2RlZi5uYW1lICsgIlVuaW9uIjsKKyAgICAgICAgR2VuRW51bV9PYmplY3RBUEkoZW51bV9kZWYsIGVudW1jb2RlKTsKKyAgICAgICAgYXV0byBjbGFzc19uYW1lID0gbmFtZXJfLlR5cGUoZW51bV9kZWYpICsgIlVuaW9uIjsKICAgICAgICAgaWYgKHBhcnNlcl8ub3B0cy5vbmVfZmlsZSkgewogICAgICAgICAgIG9uZV9maWxlX2NvZGUgKz0gZW51bWNvZGU7CiAgICAgICAgIH0gZWxzZSB7CkBAIC04NSw3ICsxMzIsNyBAQAogICAgICAgYXV0byAmc3RydWN0X2RlZiA9ICoqaXQ7CiAgICAgICBpZiAoIXBhcnNlcl8ub3B0cy5vbmVfZmlsZSkKICAgICAgICAgY3VyX25hbWVfc3BhY2VfID0gc3RydWN0X2RlZi5kZWZpbmVkX25hbWVzcGFjZTsKLSAgICAgIEdlblN0cnVjdChzdHJ1Y3RfZGVmLCAmZGVjbGNvZGUsIHBhcnNlcl8ub3B0cyk7CisgICAgICBHZW5TdHJ1Y3Qoc3RydWN0X2RlZiwgZGVjbGNvZGUsIHBhcnNlcl8ub3B0cyk7CiAgICAgICBpZiAocGFyc2VyXy5vcHRzLm9uZV9maWxlKSB7CiAgICAgICAgIG9uZV9maWxlX2NvZGUgKz0gZGVjbGNvZGU7CiAgICAgICB9IGVsc2UgewpAQCAtOTYsOCArMTQzLDggQEAKIAogICAgICAgaWYgKHBhcnNlcl8ub3B0cy5nZW5lcmF0ZV9vYmplY3RfYmFzZWRfYXBpKSB7CiAgICAgICAgIGRlY2xjb2RlID0gIiI7Ci0gICAgICAgIEdlblN0cnVjdF9PYmplY3RBUEkoc3RydWN0X2RlZiwgJmRlY2xjb2RlLCBwYXJzZXJfLm9wdHMpOwotICAgICAgICBhdXRvIGNsYXNzX25hbWUgPSBHZW5UeXBlTmFtZV9PYmplY3RBUEkoc3RydWN0X2RlZi5uYW1lLCBwYXJzZXJfLm9wdHMpOworICAgICAgICBHZW5TdHJ1Y3RfT2JqZWN0QVBJKHN0cnVjdF9kZWYsIGRlY2xjb2RlKTsKKyAgICAgICAgYXV0byBjbGFzc19uYW1lID0gbmFtZXJfLk9iamVjdFR5cGUoc3RydWN0X2RlZik7CiAgICAgICAgIGlmIChwYXJzZXJfLm9wdHMub25lX2ZpbGUpIHsKICAgICAgICAgICBvbmVfZmlsZV9jb2RlICs9IGRlY2xjb2RlOwogICAgICAgICB9IGVsc2UgewpAQCAtMTI0LDcgKzE3MSw3IEBACiAgICAgc3RkOjpzdHJpbmcgY29kZTsKICAgICBjb2RlID0gIi8vICIgKyBzdGQ6OnN0cmluZyhGbGF0QnVmZmVyc0dlbmVyYXRlZFdhcm5pbmcoKSkgKyAiXG5cbiI7CiAKLSAgICBzdGQ6OnN0cmluZyBuYW1lc3BhY2VfbmFtZSA9IEZ1bGxOYW1lc3BhY2UoIi4iLCBucyk7CisgICAgY29uc3Qgc3RkOjpzdHJpbmcgbmFtZXNwYWNlX25hbWUgPSBGdWxsTmFtZXNwYWNlKCIuIiwgbnMpOwogICAgIGlmICghbmFtZXNwYWNlX25hbWUuZW1wdHkoKSkgewogICAgICAgY29kZSArPSAicGFja2FnZSAiICsgbmFtZXNwYWNlX25hbWUgKyAiOyI7CiAgICAgICBjb2RlICs9ICJcblxuIjsKQEAgLTE0NCw3ICsxOTEsMTAgQEAKIAogICAgIGNvZGUgKz0gY2xhc3Njb2RlOwogICAgIGlmICghbmFtZXNwYWNlX25hbWUuZW1wdHkoKSkgY29kZSArPSAiIjsKLSAgICBhdXRvIGZpbGVuYW1lID0gTmFtZXNwYWNlRGlyKG5zKSArIGRlZm5hbWUgKyAiLmphdmEiOworICAgIGNvbnN0IHN0ZDo6c3RyaW5nIGRpcnMgPSBuYW1lcl8uRGlyZWN0b3JpZXMobnMpOworICAgIEVuc3VyZURpckV4aXN0cyhkaXJzKTsKKyAgICBjb25zdCBzdGQ6OnN0cmluZyBmaWxlbmFtZSA9CisgICAgICAgIGRpcnMgKyBuYW1lcl8uRmlsZShkZWZuYW1lLCAvKnNraXBzPSovU2tpcEZpbGU6OlN1ZmZpeCk7CiAgICAgcmV0dXJuIFNhdmVGaWxlKGZpbGVuYW1lLmNfc3RyKCksIGNvZGUsIGZhbHNlKTsKICAgfQogCkBAIC0xODEsNyArMjMxLDcgQEAKICAgICBzd2l0Y2ggKHR5cGUuYmFzZV90eXBlKSB7CiAgICAgICBjYXNlIEJBU0VfVFlQRV9TVFJJTkc6IHJldHVybiAiU3RyaW5nIjsKICAgICAgIGNhc2UgQkFTRV9UWVBFX1ZFQ1RPUjogcmV0dXJuIEdlblR5cGVHZXQodHlwZS5WZWN0b3JUeXBlKCkpOwotICAgICAgY2FzZSBCQVNFX1RZUEVfU1RSVUNUOiByZXR1cm4gV3JhcEluTmFtZVNwYWNlKCp0eXBlLnN0cnVjdF9kZWYpOworICAgICAgY2FzZSBCQVNFX1RZUEVfU1RSVUNUOiByZXR1cm4gbmFtZXJfLk5hbWVzcGFjZWRUeXBlKCp0eXBlLnN0cnVjdF9kZWYpOwogICAgICAgY2FzZSBCQVNFX1RZUEVfVU5JT046IEZMQVRCVUZGRVJTX0ZBTExUSFJPVUdIKCk7ICAvLyBlbHNlIGZhbGwgdGhydQogICAgICAgZGVmYXVsdDogcmV0dXJuICJUYWJsZSI7CiAgICAgfQpAQCAtMjg1LDcgKzMzNSw3IEBACiAgICAgRkxBVEJVRkZFUlNfQVNTRVJUKHZhbHVlLnR5cGUuZW51bV9kZWYpOwogICAgIGF1dG8gJmVudW1fZGVmID0gKnZhbHVlLnR5cGUuZW51bV9kZWY7CiAgICAgYXV0byBlbnVtX3ZhbCA9IGVudW1fZGVmLkZpbmRCeVZhbHVlKHZhbHVlLmNvbnN0YW50KTsKLSAgICByZXR1cm4gZW51bV92YWwgPyAoV3JhcEluTmFtZVNwYWNlKGVudW1fZGVmKSArICIuIiArIGVudW1fdmFsLT5uYW1lKQorICAgIHJldHVybiBlbnVtX3ZhbCA/IG5hbWVyXy5OYW1lc3BhY2VkRW51bVZhcmlhbnQoZW51bV9kZWYsICplbnVtX3ZhbCkKICAgICAgICAgICAgICAgICAgICAgOiB2YWx1ZS5jb25zdGFudDsKICAgfQogCkBAIC0zMjAsOCArMzcwLDcgQEAKICAgICByZXR1cm4gR2VuRGVmYXVsdFZhbHVlKGZpZWxkKTsKICAgfQogCi0gIHZvaWQgR2VuRW51bShFbnVtRGVmICZlbnVtX2RlZiwgc3RkOjpzdHJpbmcgKmNvZGVfcHRyKSBjb25zdCB7Ci0gICAgc3RkOjpzdHJpbmcgJmNvZGUgPSAqY29kZV9wdHI7CisgIHZvaWQgR2VuRW51bShFbnVtRGVmICZlbnVtX2RlZiwgc3RkOjpzdHJpbmcgJmNvZGUpIGNvbnN0IHsKICAgICBpZiAoZW51bV9kZWYuZ2VuZXJhdGVkKSByZXR1cm47CiAKICAgICAvLyBHZW5lcmF0ZSBlbnVtIGRlZmluaXRpb25zIG9mIHRoZSBmb3JtOgpAQCAtMzI5LDcgKzM3OCw3IEBACiAgICAgLy8gSW4gSmF2YSwgd2UgdXNlIGludHMgcmF0aGVyIHRoYW4gdGhlIEVudW0gZmVhdHVyZSwgYmVjYXVzZSB3ZSB3YW50IHRoZW0KICAgICAvLyB0byBtYXAgZGlyZWN0bHkgdG8gaG93IHRoZXkncmUgdXNlZCBpbiBDL0MrKyBhbmQgZmlsZSBmb3JtYXRzLgogICAgIC8vIFRoYXQsIGFuZCBKYXZhIEVudW1zIGFyZSBleHBlbnNpdmUsIGFuZCBub3QgdW5pdmVyc2FsbHkgbGlrZWQuCi0gICAgR2VuQ29tbWVudChlbnVtX2RlZi5kb2NfY29tbWVudCwgY29kZV9wdHIsICZjb21tZW50X2NvbmZpZyk7CisgICAgR2VuQ29tbWVudChlbnVtX2RlZi5kb2NfY29tbWVudCwgJmNvZGUsICZjb21tZW50X2NvbmZpZyk7CiAKICAgICBjb2RlICs9ICJAU3VwcHJlc3NXYXJuaW5ncyhcInVudXNlZFwiKVxuIjsKICAgICBpZiAoZW51bV9kZWYuYXR0cmlidXRlcy5Mb29rdXAoInByaXZhdGUiKSkgewpAQCAtMzM3LDE2ICszODYsMTYgQEAKICAgICB9IGVsc2UgewogICAgICAgY29kZSArPSAicHVibGljICI7CiAgICAgfQotICAgIGNvZGUgKz0gImZpbmFsIGNsYXNzICIgKyBlbnVtX2RlZi5uYW1lOworICAgIGNvZGUgKz0gImZpbmFsIGNsYXNzICIgKyBuYW1lcl8uVHlwZShlbnVtX2RlZik7CiAgICAgY29kZSArPSAiIHtcbiI7Ci0gICAgY29kZSArPSAiICBwcml2YXRlICIgKyBlbnVtX2RlZi5uYW1lICsgIigpIHsgfVxuIjsKKyAgICBjb2RlICs9ICIgIHByaXZhdGUgIiArIG5hbWVyXy5UeXBlKGVudW1fZGVmKSArICIoKSB7IH1cbiI7CiAgICAgZm9yIChhdXRvIGl0ID0gZW51bV9kZWYuVmFscygpLmJlZ2luKCk7IGl0ICE9IGVudW1fZGVmLlZhbHMoKS5lbmQoKTsgKytpdCkgewogICAgICAgYXV0byAmZXYgPSAqKml0OwotICAgICAgR2VuQ29tbWVudChldi5kb2NfY29tbWVudCwgY29kZV9wdHIsICZjb21tZW50X2NvbmZpZywgIiAgIik7CisgICAgICBHZW5Db21tZW50KGV2LmRvY19jb21tZW50LCAmY29kZSwgJmNvbW1lbnRfY29uZmlnLCAiICAiKTsKICAgICAgIGNvZGUgKz0gIiAgcHVibGljIHN0YXRpYyBmaW5hbCAiOwogICAgICAgY29kZSArPSBHZW5UeXBlQmFzaWMoRGVzdGluYXRpb25UeXBlKGVudW1fZGVmLnVuZGVybHlpbmdfdHlwZSwgZmFsc2UpKTsKICAgICAgIGNvZGUgKz0gIiAiOwotICAgICAgY29kZSArPSBldi5uYW1lICsgIiA9ICI7CisgICAgICBjb2RlICs9IG5hbWVyXy5WYXJpYW50KGV2KSArICIgPSAiOwogICAgICAgY29kZSArPSBlbnVtX2RlZi5Ub1N0cmluZyhldik7CiAgICAgICBjb2RlICs9ICI7XG4iOwogICAgIH0KQEAgLTM2NCwxMyArNDEzLDE0IEBACiAgICAgICAgICAgICAibG9uZyIpIHsKICAgICAgIGNvZGUgKz0gIlxuICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyI7CiAgICAgICBjb2RlICs9ICJbXSBuYW1lcyA9IHsgIjsKLSAgICAgIGF1dG8gdmFsID0gZW51bV9kZWYuVmFscygpLmZyb250KCk7CisgICAgICBjb25zdCBFbnVtVmFsICpwcmV2ID0gZW51bV9kZWYuVmFscygpLmZyb250KCk7CiAgICAgICBmb3IgKGF1dG8gaXQgPSBlbnVtX2RlZi5WYWxzKCkuYmVnaW4oKTsgaXQgIT0gZW51bV9kZWYuVmFscygpLmVuZCgpOwogICAgICAgICAgICArK2l0KSB7Ci0gICAgICAgIGF1dG8gZXYgPSAqaXQ7Ci0gICAgICAgIGZvciAoYXV0byBrID0gZW51bV9kZWYuRGlzdGFuY2UodmFsLCBldik7IGsgPiAxOyAtLWspIGNvZGUgKz0gIlwiXCIsICI7Ci0gICAgICAgIHZhbCA9IGV2OwotICAgICAgICBjb2RlICs9ICJcIiIgKyAoKml0KS0+bmFtZSArICJcIiwgIjsKKyAgICAgICAgY29uc3QgRW51bVZhbCAmZXYgPSAqKml0OworICAgICAgICBmb3IgKGF1dG8gayA9IGVudW1fZGVmLkRpc3RhbmNlKHByZXYsICZldik7IGsgPiAxOyAtLWspCisgICAgICAgICAgY29kZSArPSAiXCJcIiwgIjsKKyAgICAgICAgcHJldiA9ICZldjsKKyAgICAgICAgY29kZSArPSAiXCIiICsgbmFtZXJfLlZhcmlhbnQoZXYpICsgIlwiLCAiOwogICAgICAgfQogICAgICAgY29kZSArPSAifTtcblxuIjsKICAgICAgIGNvZGUgKz0gIiAgcHVibGljIHN0YXRpYyAiOwpAQCAtMzc4LDcgKzQyOCw3IEBACiAgICAgICBjb2RlICs9ICIgbmFtZSI7CiAgICAgICBjb2RlICs9ICIoaW50IGUpIHsgcmV0dXJuIG5hbWVzW2UiOwogICAgICAgaWYgKGVudW1fZGVmLk1pblZhbHVlKCktPklzTm9uWmVybygpKQotICAgICAgICBjb2RlICs9ICIgLSAiICsgZW51bV9kZWYuTWluVmFsdWUoKS0+bmFtZTsKKyAgICAgICAgY29kZSArPSAiIC0gIiArIG5hbWVyXy5WYXJpYW50KGVudW1fZGVmLk1pblZhbHVlKCktPm5hbWUpOwogICAgICAgY29kZSArPSAiXTsgfVxuIjsKICAgICB9CiAKQEAgLTQ0NSw5ICs0OTUsOCBAQAogCiAgIC8vIFJlY3Vyc2l2ZWx5IGdlbmVyYXRlIGFyZ3VtZW50cyBmb3IgYSBjb25zdHJ1Y3RvciwgdG8gZGVhbCB3aXRoIG5lc3RlZAogICAvLyBzdHJ1Y3RzLgotICB2b2lkIEdlblN0cnVjdEFyZ3MoY29uc3QgU3RydWN0RGVmICZzdHJ1Y3RfZGVmLCBzdGQ6OnN0cmluZyAqY29kZV9wdHIsCisgIHZvaWQgR2VuU3RydWN0QXJncyhjb25zdCBTdHJ1Y3REZWYgJnN0cnVjdF9kZWYsIHN0ZDo6c3RyaW5nICZjb2RlLAogICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqbmFtZXByZWZpeCwgc2l6ZV90IGFycmF5X2NvdW50ID0gMCkgY29uc3QgewotICAgIHN0ZDo6c3RyaW5nICZjb2RlID0gKmNvZGVfcHRyOwogICAgIGZvciAoYXV0byBpdCA9IHN0cnVjdF9kZWYuZmllbGRzLnZlYy5iZWdpbigpOwogICAgICAgICAgaXQgIT0gc3RydWN0X2RlZi5maWVsZHMudmVjLmVuZCgpOyArK2l0KSB7CiAgICAgICBhdXRvICZmaWVsZCA9ICoqaXQ7CkBAIC00NjAsNyArNTA5LDcgQEAKICAgICAgICAgLy8gR2VuZXJhdGUgYXJndW1lbnRzIGZvciBhIHN0cnVjdCBpbnNpZGUgYSBzdHJ1Y3QuIFRvIGVuc3VyZSBuYW1lcwogICAgICAgICAvLyBkb24ndCBjbGFzaCwgYW5kIHRvIG1ha2UgaXQgb2J2aW91cyB0aGVzZSBhcmd1bWVudHMgYXJlIGNvbnN0cnVjdGluZwogICAgICAgICAvLyBhIG5lc3RlZCBzdHJ1Y3QsIHByZWZpeCB0aGUgbmFtZSB3aXRoIHRoZSBmaWVsZCBuYW1lLgotICAgICAgICBHZW5TdHJ1Y3RBcmdzKCpmaWVsZF90eXBlLnN0cnVjdF9kZWYsIGNvZGVfcHRyLAorICAgICAgICBHZW5TdHJ1Y3RBcmdzKCpmaWVsZF90eXBlLnN0cnVjdF9kZWYsIGNvZGUsCiAgICAgICAgICAgICAgICAgICAgICAgKG5hbWVwcmVmaXggKyAoZmllbGQubmFtZSArICJfIikpLmNfc3RyKCksIGFycmF5X2NudCk7CiAgICAgICB9IGVsc2UgewogICAgICAgICBjb2RlICs9ICIsICI7CkBAIC00NjgsNyArNTE3LDcgQEAKICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBhcnJheV9jbnQ7IGkrKykgY29kZSArPSAiW10iOwogICAgICAgICBjb2RlICs9ICIgIjsKICAgICAgICAgY29kZSArPSBuYW1lcHJlZml4OwotICAgICAgICBjb2RlICs9IENvbnZlcnRDYXNlKGZpZWxkLm5hbWUsIENhc2U6OmtMb3dlckNhbWVsKTsKKyAgICAgICAgY29kZSArPSBuYW1lcl8uRmllbGQoZmllbGQpOwogICAgICAgfQogICAgIH0KICAgfQpAQCAtNDc2LDEwICs1MjUsOSBAQAogICAvLyBSZWN1c2l2ZWx5IGdlbmVyYXRlIHN0cnVjdCBjb25zdHJ1Y3Rpb24gc3RhdGVtZW50cyBvZiB0aGUgZm9ybToKICAgLy8gYnVpbGRlci5wdXRUeXBlKG5hbWUpOwogICAvLyBhbmQgaW5zZXJ0IG1hbnVhbCBwYWRkaW5nLgotICB2b2lkIEdlblN0cnVjdEJvZHkoY29uc3QgU3RydWN0RGVmICZzdHJ1Y3RfZGVmLCBzdGQ6OnN0cmluZyAqY29kZV9wdHIsCisgIHZvaWQgR2VuU3RydWN0Qm9keShjb25zdCBTdHJ1Y3REZWYgJnN0cnVjdF9kZWYsIHN0ZDo6c3RyaW5nICZjb2RlLAogICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqbmFtZXByZWZpeCwgc2l6ZV90IGluZGV4ID0gMCwKICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW5fYXJyYXkgPSBmYWxzZSkgY29uc3QgewotICAgIHN0ZDo6c3RyaW5nICZjb2RlID0gKmNvZGVfcHRyOwogICAgIHN0ZDo6c3RyaW5nIGluZGVudCgoaW5kZXggKyAxKSAqIDIsICcgJyk7CiAgICAgY29kZSArPSBpbmRlbnQgKyAiICBidWlsZGVyLnByZXAoIjsKICAgICBjb2RlICs9IE51bVRvU3RyaW5nKHN0cnVjdF9kZWYubWluYWxpZ24pICsgIiwgIjsKQEAgLTQ5Myw3ICs1NDEsNyBAQAogICAgICAgICBjb2RlICs9IE51bVRvU3RyaW5nKGZpZWxkLnBhZGRpbmcpICsgIik7XG4iOwogICAgICAgfQogICAgICAgaWYgKElzU3RydWN0KGZpZWxkX3R5cGUpKSB7Ci0gICAgICAgIEdlblN0cnVjdEJvZHkoKmZpZWxkX3R5cGUuc3RydWN0X2RlZiwgY29kZV9wdHIsCisgICAgICAgIEdlblN0cnVjdEJvZHkoKmZpZWxkX3R5cGUuc3RydWN0X2RlZiwgY29kZSwKICAgICAgICAgICAgICAgICAgICAgICAobmFtZXByZWZpeCArIChmaWVsZC5uYW1lICsgIl8iKSkuY19zdHIoKSwgaW5kZXgsCiAgICAgICAgICAgICAgICAgICAgICAgaW5fYXJyYXkpOwogICAgICAgfSBlbHNlIHsKQEAgLTUwNyw3ICs1NTUsNyBAQAogICAgICAgICAgIGluX2FycmF5ID0gdHJ1ZTsKICAgICAgICAgfQogICAgICAgICBpZiAoSXNTdHJ1Y3QodHlwZSkpIHsKLSAgICAgICAgICBHZW5TdHJ1Y3RCb2R5KCpmaWVsZF90eXBlLnN0cnVjdF9kZWYsIGNvZGVfcHRyLAorICAgICAgICAgIEdlblN0cnVjdEJvZHkoKmZpZWxkX3R5cGUuc3RydWN0X2RlZiwgY29kZSwKICAgICAgICAgICAgICAgICAgICAgICAgIChuYW1lcHJlZml4ICsgKGZpZWxkLm5hbWUgKyAiXyIpKS5jX3N0cigpLCBpbmRleCArIDEsCiAgICAgICAgICAgICAgICAgICAgICAgICBpbl9hcnJheSk7CiAgICAgICAgIH0gZWxzZSB7CkBAIC01MTUsOCArNTYzLDcgQEAKICAgICAgICAgICBjb2RlICs9IGluZGVudCArICIgIGJ1aWxkZXIucHV0IjsKICAgICAgICAgICBjb2RlICs9IEdlbk1ldGhvZCh0eXBlKSArICIoIjsKICAgICAgICAgICBjb2RlICs9IFNvdXJjZUNhc3QodHlwZSk7Ci0gICAgICAgICAgYXV0byBhcmduYW1lID0KLSAgICAgICAgICAgICAgbmFtZXByZWZpeCArIENvbnZlcnRDYXNlKGZpZWxkLm5hbWUsIENhc2U6OmtMb3dlckNhbWVsKTsKKyAgICAgICAgICBhdXRvIGFyZ25hbWUgPSBuYW1lcHJlZml4ICsgbmFtZXJfLlZhcmlhYmxlKGZpZWxkKTsKICAgICAgICAgICBjb2RlICs9IGFyZ25hbWU7CiAgICAgICAgICAgc2l6ZV90IGFycmF5X2NudCA9IGluZGV4ICsgKElzQXJyYXkoZmllbGRfdHlwZSkgPyAxIDogMCk7CiAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGluX2FycmF5ICYmIGkgPCBhcnJheV9jbnQ7IGkrKykgewpAQCAtNTI5LDEyICs1NzYsNiBAQAogICAgIH0KICAgfQogCi0gIHN0ZDo6c3RyaW5nIEdlbkJ5dGVCdWZmZXJMZW5ndGgoY29uc3QgY2hhciAqYmJfbmFtZSkgY29uc3QgewotICAgIHN0ZDo6c3RyaW5nIGJiX2xlbiA9IGJiX25hbWU7Ci0gICAgYmJfbGVuICs9ICIuY2FwYWNpdHkoKSI7Ci0gICAgcmV0dXJuIGJiX2xlbjsKLSAgfQotCiAgIHN0ZDo6c3RyaW5nIEdlbk9mZnNldEdldHRlcihmbGF0YnVmZmVyczo6RmllbGREZWYgKmtleV9maWVsZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKm51bSA9IG51bGxwdHIpIGNvbnN0IHsKICAgICBzdGQ6OnN0cmluZyBrZXlfb2Zmc2V0ID0gIiI7CkBAIC01NDMsNyArNTg0LDcgQEAKICAgICAgIGtleV9vZmZzZXQgKz0gbnVtOwogICAgICAga2V5X29mZnNldCArPSAiLCBfYmIpIjsKICAgICB9IGVsc2UgewotICAgICAga2V5X29mZnNldCArPSBHZW5CeXRlQnVmZmVyTGVuZ3RoKCJiYiIpOworICAgICAga2V5X29mZnNldCArPSAiYmIuY2FwYWNpdHkoKSI7CiAgICAgICBrZXlfb2Zmc2V0ICs9ICIgLSB0YWJsZU9mZnNldCwgYmIpIjsKICAgICB9CiAgICAgcmV0dXJuIGtleV9vZmZzZXQ7CkBAIC01OTIsMTAgKzYzMyw5IEBACiAgICAgcmV0dXJuIGtleV9nZXR0ZXI7CiAgIH0KIAotICB2b2lkIEdlblN0cnVjdChTdHJ1Y3REZWYgJnN0cnVjdF9kZWYsIHN0ZDo6c3RyaW5nICpjb2RlX3B0ciwKKyAgdm9pZCBHZW5TdHJ1Y3QoU3RydWN0RGVmICZzdHJ1Y3RfZGVmLCBzdGQ6OnN0cmluZyAmY29kZSwKICAgICAgICAgICAgICAgICAgY29uc3QgSURMT3B0aW9ucyAmb3B0cykgY29uc3QgewogICAgIGlmIChzdHJ1Y3RfZGVmLmdlbmVyYXRlZCkgcmV0dXJuOwotICAgIHN0ZDo6c3RyaW5nICZjb2RlID0gKmNvZGVfcHRyOwogCiAgICAgLy8gR2VuZXJhdGUgYSBzdHJ1Y3QgYWNjZXNzb3IgY2xhc3MsIHdpdGggbWV0aG9kcyBvZiB0aGUgZm9ybToKICAgICAvLyBwdWJsaWMgdHlwZSBuYW1lKCkgeyByZXR1cm4gYmIuZ2V0VHlwZShpICsgb2Zmc2V0KTsgfQpAQCAtNjAzLDcgKzY0Myw3IEBACiAgICAgLy8gcHVibGljIHR5cGUgbmFtZSgpIHsKICAgICAvLyAgIGludCBvID0gX19vZmZzZXQob2Zmc2V0KTsgcmV0dXJuIG8gIT0gMCA/IGJiLmdldFR5cGUobyArIGkpIDogZGVmYXVsdDsKICAgICAvLyB9Ci0gICAgR2VuQ29tbWVudChzdHJ1Y3RfZGVmLmRvY19jb21tZW50LCBjb2RlX3B0ciwgJmNvbW1lbnRfY29uZmlnKTsKKyAgICBHZW5Db21tZW50KHN0cnVjdF9kZWYuZG9jX2NvbW1lbnQsICZjb2RlLCAmY29tbWVudF9jb25maWcpOwogCiAgICAgaWYgKHBhcnNlcl8ub3B0cy5nZW5fZ2VuZXJhdGVkKSB7CiAgICAgICBjb2RlICs9ICJAamF2YXguYW5ub3RhdGlvbi5HZW5lcmF0ZWQodmFsdWU9XCJmbGF0Y1wiKVxuIjsKQEAgLTYxNCwzMyArNjU0LDM1IEBACiAgICAgfSBlbHNlIHsKICAgICAgIGNvZGUgKz0gInB1YmxpYyAiOwogICAgIH0KLSAgICBjb2RlICs9ICJmaW5hbCBjbGFzcyAiICsgc3RydWN0X2RlZi5uYW1lOworICAgIGNvbnN0IGF1dG8gc3RydWN0X2NsYXNzID0gbmFtZXJfLlR5cGUoc3RydWN0X2RlZik7CisgICAgY29kZSArPSAiZmluYWwgY2xhc3MgIiArIHN0cnVjdF9jbGFzczsKICAgICBjb2RlICs9ICIgZXh0ZW5kcyAiOwogICAgIGNvZGUgKz0gc3RydWN0X2RlZi5maXhlZCA/ICJTdHJ1Y3QiIDogIlRhYmxlIjsKICAgICBjb2RlICs9ICIge1xuIjsKIAogICAgIGlmICghc3RydWN0X2RlZi5maXhlZCkgewotICAgICAgLy8gR2VuZXJhdGUgdmVyc29uIGNoZWNrIG1ldGhvZC4KKyAgICAgIC8vIEdlbmVyYXRlIHZlcnNpb24gY2hlY2sgbWV0aG9kLgogICAgICAgLy8gRm9yY2UgY29tcGlsZSB0aW1lIGVycm9yIGlmIG5vdCB1c2luZyB0aGUgc2FtZSB2ZXJzaW9uIHJ1bnRpbWUuCiAgICAgICBjb2RlICs9ICIgIHB1YmxpYyBzdGF0aWMgdm9pZCBWYWxpZGF0ZVZlcnNpb24oKSB7IjsKICAgICAgIGNvZGUgKz0gIiBDb25zdGFudHMuIjsKLSAgICAgIGNvZGUgKz0gIkZMQVRCVUZGRVJTXzJfMF8wKCk7ICI7CisgICAgICBjb2RlICs9ICJGTEFUQlVGRkVSU18yXzBfOCgpOyAiOwogICAgICAgY29kZSArPSAifVxuIjsKIAogICAgICAgLy8gR2VuZXJhdGUgYSBzcGVjaWFsIGFjY2Vzc29yIGZvciB0aGUgdGFibGUgdGhhdCB3aGVuIHVzZWQgYXMgdGhlIHJvb3QKICAgICAgIC8vIG9mIGEgRmxhdEJ1ZmZlcgotICAgICAgc3RkOjpzdHJpbmcgbWV0aG9kX25hbWUgPSAiZ2V0Um9vdEFzIiArIHN0cnVjdF9kZWYubmFtZTsKLSAgICAgIHN0ZDo6c3RyaW5nIG1ldGhvZF9zaWduYXR1cmUgPQotICAgICAgICAgICIgIHB1YmxpYyBzdGF0aWMgIiArIHN0cnVjdF9kZWYubmFtZSArICIgIiArIG1ldGhvZF9uYW1lOworICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgbWV0aG9kX25hbWUgPQorICAgICAgICAgIG5hbWVyXy5MZWdhY3lKYXZhTWV0aG9kMigiZ2V0Um9vdEFzIiwgc3RydWN0X2RlZiwgIiIpOworICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgbWV0aG9kX3NpZ25hdHVyZSA9CisgICAgICAgICAgIiAgcHVibGljIHN0YXRpYyAiICsgc3RydWN0X2NsYXNzICsgIiAiICsgbWV0aG9kX25hbWU7CiAKICAgICAgIC8vIGNyZWF0ZSBjb252ZW5pZW5jZSBtZXRob2QgdGhhdCBkb2Vzbid0IHJlcXVpcmUgYW4gZXhpc3Rpbmcgb2JqZWN0CiAgICAgICBjb2RlICs9IG1ldGhvZF9zaWduYXR1cmUgKyAiKEJ5dGVCdWZmZXIgX2JiKSAiOwotICAgICAgY29kZSArPSAieyByZXR1cm4gIiArIG1ldGhvZF9uYW1lICsgIihfYmIsIG5ldyAiICsgc3RydWN0X2RlZi5uYW1lICsKLSAgICAgICAgICAgICAgIigpKTsgfVxuIjsKKyAgICAgIGNvZGUgKz0KKyAgICAgICAgICAieyByZXR1cm4gIiArIG1ldGhvZF9uYW1lICsgIihfYmIsIG5ldyAiICsgc3RydWN0X2NsYXNzICsgIigpKTsgfVxuIjsKIAogICAgICAgLy8gY3JlYXRlIG1ldGhvZCB0aGF0IGFsbG93cyBvYmplY3QgcmV1c2UKICAgICAgIGNvZGUgKz0KLSAgICAgICAgICBtZXRob2Rfc2lnbmF0dXJlICsgIihCeXRlQnVmZmVyIF9iYiwgIiArIHN0cnVjdF9kZWYubmFtZSArICIgb2JqKSB7ICI7CisgICAgICAgICAgbWV0aG9kX3NpZ25hdHVyZSArICIoQnl0ZUJ1ZmZlciBfYmIsICIgKyBzdHJ1Y3RfY2xhc3MgKyAiIG9iaikgeyAiOwogICAgICAgY29kZSArPSAiX2JiLm9yZGVyKEJ5dGVPcmRlci5MSVRUTEVfRU5ESUFOKTsgIjsKICAgICAgIGNvZGUgKz0gInJldHVybiAob2JqLl9fYXNzaWduKF9iYi5nZXRJbnQoX2JiLiI7CiAgICAgICBjb2RlICs9ICJwb3NpdGlvbigpIjsKQEAgLTY1MSw4ICs2OTMsMTAgQEAKICAgICAgICAgaWYgKHBhcnNlcl8uZmlsZV9pZGVudGlmaWVyXy5sZW5ndGgoKSkgewogICAgICAgICAgIC8vIENoZWNrIGlmIGEgYnVmZmVyIGhhcyB0aGUgaWRlbnRpZmllci4KICAgICAgICAgICBjb2RlICs9ICIgIHB1YmxpYyBzdGF0aWMgIjsKLSAgICAgICAgICBjb2RlICs9ICJib29sZWFuICIgKyBzdHJ1Y3RfZGVmLm5hbWU7Ci0gICAgICAgICAgY29kZSArPSAiQnVmZmVySGFzSWRlbnRpZmllcihCeXRlQnVmZmVyIF9iYikgeyByZXR1cm4gIjsKKyAgICAgICAgICBjb2RlICs9ICJib29sZWFuICIgKworICAgICAgICAgICAgICAgICAgbmFtZXJfLkxlZ2FjeUphdmFNZXRob2QyKAorICAgICAgICAgICAgICAgICAgICAgICIiLCBzdHJ1Y3RfZGVmLCAiQnVmZmVySGFzSWRlbnRpZmllcihCeXRlQnVmZmVyIF9iYikiKSArCisgICAgICAgICAgICAgICAgICAiIHsgcmV0dXJuICI7CiAgICAgICAgICAgY29kZSArPSAiX19oYXNfaWRlbnRpZmllcihfYmIsIFwiIjsKICAgICAgICAgICBjb2RlICs9IHBhcnNlcl8uZmlsZV9pZGVudGlmaWVyXzsKICAgICAgICAgICBjb2RlICs9ICJcIik7IH1cbiI7CkBAIC02NjUsMjcgKzcwOSwyNCBAQAogICAgIGNvZGUgKz0gInsgIjsKICAgICBjb2RlICs9ICJfX3Jlc2V0KF9pLCBfYmIpOyAiOwogICAgIGNvZGUgKz0gIn1cbiI7Ci0gICAgY29kZSArPQotICAgICAgICAiICBwdWJsaWMgIiArIHN0cnVjdF9kZWYubmFtZSArICIgX19hc3NpZ24oaW50IF9pLCBCeXRlQnVmZmVyIF9iYikgIjsKKyAgICBjb2RlICs9ICIgIHB1YmxpYyAiICsgc3RydWN0X2NsYXNzICsgIiBfX2Fzc2lnbihpbnQgX2ksIEJ5dGVCdWZmZXIgX2JiKSAiOwogICAgIGNvZGUgKz0gInsgX19pbml0KF9pLCBfYmIpOyByZXR1cm4gdGhpczsgfVxuXG4iOwogICAgIGZvciAoYXV0byBpdCA9IHN0cnVjdF9kZWYuZmllbGRzLnZlYy5iZWdpbigpOwogICAgICAgICAgaXQgIT0gc3RydWN0X2RlZi5maWVsZHMudmVjLmVuZCgpOyArK2l0KSB7CiAgICAgICBhdXRvICZmaWVsZCA9ICoqaXQ7CiAgICAgICBpZiAoZmllbGQuZGVwcmVjYXRlZCkgY29udGludWU7Ci0gICAgICBHZW5Db21tZW50KGZpZWxkLmRvY19jb21tZW50LCBjb2RlX3B0ciwgJmNvbW1lbnRfY29uZmlnLCAiICAiKTsKLSAgICAgIHN0ZDo6c3RyaW5nIHR5cGVfbmFtZSA9IEdlblR5cGVHZXQoZmllbGQudmFsdWUudHlwZSk7Ci0gICAgICBzdGQ6OnN0cmluZyB0eXBlX25hbWVfZGVzdCA9IEdlblR5cGVOYW1lRGVzdChmaWVsZC52YWx1ZS50eXBlKTsKLSAgICAgIHN0ZDo6c3RyaW5nIGNvbmRpdGlvbmFsX2Nhc3QgPSAiIjsKLSAgICAgIHN0ZDo6c3RyaW5nIG9wdGlvbmFsID0gIiI7Ci0gICAgICBzdGQ6OnN0cmluZyBkZXN0X21hc2sgPSBEZXN0aW5hdGlvbk1hc2soZmllbGQudmFsdWUudHlwZSwgdHJ1ZSk7Ci0gICAgICBzdGQ6OnN0cmluZyBkZXN0X2Nhc3QgPSBEZXN0aW5hdGlvbkNhc3QoZmllbGQudmFsdWUudHlwZSk7Ci0gICAgICBzdGQ6OnN0cmluZyBzcmNfY2FzdCA9IFNvdXJjZUNhc3QoZmllbGQudmFsdWUudHlwZSk7Ci0gICAgICBzdGQ6OnN0cmluZyBtZXRob2Rfc3RhcnQgPQorICAgICAgR2VuQ29tbWVudChmaWVsZC5kb2NfY29tbWVudCwgJmNvZGUsICZjb21tZW50X2NvbmZpZywgIiAgIik7CisgICAgICBjb25zdCBzdGQ6OnN0cmluZyB0eXBlX25hbWUgPSBHZW5UeXBlR2V0KGZpZWxkLnZhbHVlLnR5cGUpOworICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgdHlwZV9uYW1lX2Rlc3QgPSBHZW5UeXBlTmFtZURlc3QoZmllbGQudmFsdWUudHlwZSk7CisgICAgICBjb25zdCBzdGQ6OnN0cmluZyBkZXN0X21hc2sgPSBEZXN0aW5hdGlvbk1hc2soZmllbGQudmFsdWUudHlwZSwgdHJ1ZSk7CisgICAgICBjb25zdCBzdGQ6OnN0cmluZyBkZXN0X2Nhc3QgPSBEZXN0aW5hdGlvbkNhc3QoZmllbGQudmFsdWUudHlwZSk7CisgICAgICBjb25zdCBzdGQ6OnN0cmluZyBzcmNfY2FzdCA9IFNvdXJjZUNhc3QoZmllbGQudmFsdWUudHlwZSk7CisgICAgICBjb25zdCBzdGQ6OnN0cmluZyBtZXRob2Rfc3RhcnQgPQogICAgICAgICAgICIgIHB1YmxpYyAiICsKICAgICAgICAgICAoZmllbGQuSXNSZXF1aXJlZCgpID8gIiIgOiBHZW5OdWxsYWJsZUFubm90YXRpb24oZmllbGQudmFsdWUudHlwZSkpICsKLSAgICAgICAgICBHZW5QdXJlQW5ub3RhdGlvbihmaWVsZC52YWx1ZS50eXBlKSArIHR5cGVfbmFtZV9kZXN0ICsgb3B0aW9uYWwgKwotICAgICAgICAgICIgIiArIENvbnZlcnRDYXNlKGZpZWxkLm5hbWUsIENhc2U6OmtMb3dlckNhbWVsKTsKLSAgICAgIHN0ZDo6c3RyaW5nIG9iaiA9ICJvYmoiOworICAgICAgICAgIEdlblB1cmVBbm5vdGF0aW9uKGZpZWxkLnZhbHVlLnR5cGUpICsgdHlwZV9uYW1lX2Rlc3QgKyAiICIgKworICAgICAgICAgIG5hbWVyXy5GaWVsZChmaWVsZCk7CisgICAgICBjb25zdCBzdGQ6OnN0cmluZyBvYmogPSAib2JqIjsKIAogICAgICAgLy8gTW9zdCBmaWVsZCBhY2Nlc3NvcnMgbmVlZCB0byByZXRyaWV2ZSBhbmQgdGVzdCB0aGUgZmllbGQgb2Zmc2V0IGZpcnN0LAogICAgICAgLy8gdGhpcyBpcyB0aGUgcHJlZml4IGNvZGUgZm9yIHRoYXQ6CkBAIC02OTgsNyArNzM5LDcgQEAKICAgICAgIGlmIChmaWVsZC52YWx1ZS50eXBlLmJhc2VfdHlwZSA9PSBCQVNFX1RZUEVfU1RSVUNUKSB7CiAgICAgICAgIC8vIENhbGxzIHRoZSBhY2Nlc3NvciB0aGF0IHRha2VzIGFuIGFjY2Vzc29yIG9iamVjdCB3aXRoIGEgbmV3IG9iamVjdC4KICAgICAgICAgY29kZSArPSBtZXRob2Rfc3RhcnQgKyAiKCkgeyByZXR1cm4gIjsKLSAgICAgICAgY29kZSArPSBDb252ZXJ0Q2FzZShmaWVsZC5uYW1lLCBDYXNlOjprTG93ZXJDYW1lbCk7CisgICAgICAgIGNvZGUgKz0gbmFtZXJfLkZpZWxkKGZpZWxkKTsKICAgICAgICAgY29kZSArPSAiKG5ldyAiOwogICAgICAgICBjb2RlICs9IHR5cGVfbmFtZSArICIoKSk7IH1cbiI7CiAgICAgICB9IGVsc2UgaWYgKElzU2VyaWVzKGZpZWxkLnZhbHVlLnR5cGUpICYmCkBAIC03MDYsMTQgKzc0NywxMyBAQAogICAgICAgICAvLyBBY2Nlc3NvcnMgZm9yIHZlY3RvcnMgb2Ygc3RydWN0cyBhbHNvIHRha2UgYWNjZXNzb3Igb2JqZWN0cywgdGhpcwogICAgICAgICAvLyBnZW5lcmF0ZXMgYSB2YXJpYW50IHdpdGhvdXQgdGhhdCBhcmd1bWVudC4KICAgICAgICAgY29kZSArPSBtZXRob2Rfc3RhcnQgKyAiKGludCBqKSB7IHJldHVybiAiOwotICAgICAgICBjb2RlICs9IENvbnZlcnRDYXNlKGZpZWxkLm5hbWUsIENhc2U6OmtMb3dlckNhbWVsKTsKKyAgICAgICAgY29kZSArPSBuYW1lcl8uRmllbGQoZmllbGQpOwogICAgICAgICBjb2RlICs9ICIobmV3ICIgKyB0eXBlX25hbWUgKyAiKCksIGopOyB9XG4iOwogICAgICAgfQogCiAgICAgICBpZiAoZmllbGQuSXNTY2FsYXJPcHRpb25hbCgpKSB7IGNvZGUgKz0gR2VuT3B0aW9uYWxTY2FsYXJDaGVjayhmaWVsZCk7IH0KICAgICAgIHN0ZDo6c3RyaW5nIGdldHRlciA9IGRlc3RfY2FzdCArIEdlbkdldHRlcihmaWVsZC52YWx1ZS50eXBlKTsKICAgICAgIGNvZGUgKz0gbWV0aG9kX3N0YXJ0OwotICAgICAgc3RkOjpzdHJpbmcgZGVmYXVsdF9jYXN0ID0gIiI7CiAgICAgICBzdGQ6OnN0cmluZyBtZW1iZXJfc3VmZml4ID0gIjsgIjsKICAgICAgIGlmIChJc1NjYWxhcihmaWVsZC52YWx1ZS50eXBlLmJhc2VfdHlwZSkpIHsKICAgICAgICAgY29kZSArPSAiKCkiOwpAQCAtNzI2LDcgKzc2Niw3IEBACiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgY29kZSArPSBvZmZzZXRfcHJlZml4ICsgZ2V0dGVyOwogICAgICAgICAgIGNvZGUgKz0gIihvICsgYmJfcG9zKSIgKyBkZXN0X21hc2s7Ci0gICAgICAgICAgY29kZSArPSAiIDogIiArIGRlZmF1bHRfY2FzdDsKKyAgICAgICAgICBjb2RlICs9ICIgOiAiOwogICAgICAgICAgIGNvZGUgKz0gR2VuRGVmYXVsdFZhbHVlKGZpZWxkKTsKICAgICAgICAgfQogICAgICAgfSBlbHNlIHsKQEAgLTczOCw3ICs3NzgsNyBAQAogICAgICAgICAgICAgICBjb2RlICs9ICJiYl9wb3MgKyAiICsgTnVtVG9TdHJpbmcoZmllbGQudmFsdWUub2Zmc2V0KSArICIsICI7CiAgICAgICAgICAgICAgIGNvZGUgKz0gImJiKSI7CiAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICBjb2RlICs9IG9mZnNldF9wcmVmaXggKyBjb25kaXRpb25hbF9jYXN0OworICAgICAgICAgICAgICBjb2RlICs9IG9mZnNldF9wcmVmaXg7CiAgICAgICAgICAgICAgIGNvZGUgKz0gb2JqICsgIi5fX2Fzc2lnbigiOwogICAgICAgICAgICAgICBjb2RlICs9IGZpZWxkLnZhbHVlLnR5cGUuc3RydWN0X2RlZi0+Zml4ZWQKICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAibyArIGJiX3BvcyIKQEAgLTc2Myw3ICs4MDMsNyBAQAogICAgICAgICAgICAgICBjb2RlICs9IHR5cGVfbmFtZSArICIgb2JqLCAiOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgY29kZSArPSAiaW50IGopIjsKLSAgICAgICAgICAgIGNvbnN0IGF1dG8gYm9keSA9IG9mZnNldF9wcmVmaXggKyBjb25kaXRpb25hbF9jYXN0ICsgZ2V0dGVyICsgIigiOworICAgICAgICAgICAgY29uc3QgYXV0byBib2R5ID0gb2Zmc2V0X3ByZWZpeCArIGdldHRlciArICIoIjsKICAgICAgICAgICAgIGlmICh2ZWN0b3J0eXBlLmJhc2VfdHlwZSA9PSBCQVNFX1RZUEVfVU5JT04pIHsKICAgICAgICAgICAgICAgY29kZSArPSBib2R5ICsgIm9iaiwgIjsKICAgICAgICAgICAgIH0gZWxzZSB7CkBAIC03ODcsMTEgKzgyNyw5IEBACiAgICAgICAgICAgICBjb2RlICs9ICIpIiArIGRlc3RfbWFzazsKICAgICAgICAgICAgIGlmICghSXNBcnJheShmaWVsZC52YWx1ZS50eXBlKSkgewogICAgICAgICAgICAgICBjb2RlICs9ICIgOiAiOwotICAgICAgICAgICAgICBjb2RlICs9Ci0gICAgICAgICAgICAgICAgICBmaWVsZC52YWx1ZS50eXBlLmVsZW1lbnQgPT0gQkFTRV9UWVBFX0JPT0wKLSAgICAgICAgICAgICAgICAgICAgICA/ICJmYWxzZSIKLSAgICAgICAgICAgICAgICAgICAgICA6IChJc1NjYWxhcihmaWVsZC52YWx1ZS50eXBlLmVsZW1lbnQpID8gZGVmYXVsdF9jYXN0ICsgIjAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICJudWxsIik7CisgICAgICAgICAgICAgIGNvZGUgKz0gZmllbGQudmFsdWUudHlwZS5lbGVtZW50ID09IEJBU0VfVFlQRV9CT09MCisgICAgICAgICAgICAgICAgICAgICAgICAgID8gImZhbHNlIgorICAgICAgICAgICAgICAgICAgICAgICAgICA6IChJc1NjYWxhcihmaWVsZC52YWx1ZS50eXBlLmVsZW1lbnQpID8gIjAiIDogIm51bGwiKTsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgYnJlYWs7CkBAIC04MDYsNyArODQ0LDcgQEAKICAgICAgIGNvZGUgKz0gbWVtYmVyX3N1ZmZpeDsKICAgICAgIGNvZGUgKz0gIn1cbiI7CiAgICAgICBpZiAoSXNWZWN0b3IoZmllbGQudmFsdWUudHlwZSkpIHsKLSAgICAgICAgY29kZSArPSAiICBwdWJsaWMgaW50ICIgKyBDb252ZXJ0Q2FzZShmaWVsZC5uYW1lLCBDYXNlOjprTG93ZXJDYW1lbCk7CisgICAgICAgIGNvZGUgKz0gIiAgcHVibGljIGludCAiICsgbmFtZXJfLkZpZWxkKGZpZWxkKTsKICAgICAgICAgY29kZSArPSAiTGVuZ3RoIjsKICAgICAgICAgY29kZSArPSAiKCkiOwogICAgICAgICBjb2RlICs9IG9mZnNldF9wcmVmaXg7CkBAIC04MjEsOSArODU5LDkgQEAKICAgICAgICAgICBmb3IgKGF1dG8ga2l0ID0gZmllbGRzLmJlZ2luKCk7IGtpdCAhPSBmaWVsZHMuZW5kKCk7ICsra2l0KSB7CiAgICAgICAgICAgICBhdXRvICZrZXlfZmllbGQgPSAqKmtpdDsKICAgICAgICAgICAgIGlmIChrZXlfZmllbGQua2V5KSB7Ci0gICAgICAgICAgICAgIGF1dG8gcXVhbGlmaWVkX25hbWUgPSBXcmFwSW5OYW1lU3BhY2Uoc2QpOworICAgICAgICAgICAgICBhdXRvIHF1YWxpZmllZF9uYW1lID0gbmFtZXJfLk5hbWVzcGFjZWRUeXBlKHNkKTsKICAgICAgICAgICAgICAgY29kZSArPSAiICBwdWJsaWMgIiArIHF1YWxpZmllZF9uYW1lICsgIiAiOwotICAgICAgICAgICAgICBjb2RlICs9IENvbnZlcnRDYXNlKGZpZWxkLm5hbWUsIENhc2U6OmtMb3dlckNhbWVsKSArICJCeUtleSgiOworICAgICAgICAgICAgICBjb2RlICs9IG5hbWVyXy5NZXRob2QoZmllbGQpICsgIkJ5S2V5KCI7CiAgICAgICAgICAgICAgIGNvZGUgKz0gR2VuVHlwZU5hbWVEZXN0KGtleV9maWVsZC52YWx1ZS50eXBlKSArICIga2V5KSI7CiAgICAgICAgICAgICAgIGNvZGUgKz0gb2Zmc2V0X3ByZWZpeDsKICAgICAgICAgICAgICAgY29kZSArPSBxdWFsaWZpZWRfbmFtZSArICIuX19sb29rdXBfYnlfa2V5KCI7CkBAIC04MzIsNyArODcwLDcgQEAKICAgICAgICAgICAgICAgY29kZSArPSAiYmIpIDogbnVsbDsgIjsKICAgICAgICAgICAgICAgY29kZSArPSAifVxuIjsKICAgICAgICAgICAgICAgY29kZSArPSAiICBwdWJsaWMgIiArIHF1YWxpZmllZF9uYW1lICsgIiAiOwotICAgICAgICAgICAgICBjb2RlICs9IENvbnZlcnRDYXNlKGZpZWxkLm5hbWUsIENhc2U6OmtMb3dlckNhbWVsKSArICJCeUtleSgiOworICAgICAgICAgICAgICBjb2RlICs9IG5hbWVyXy5NZXRob2QoZmllbGQpICsgIkJ5S2V5KCI7CiAgICAgICAgICAgICAgIGNvZGUgKz0gcXVhbGlmaWVkX25hbWUgKyAiIG9iaiwgIjsKICAgICAgICAgICAgICAgY29kZSArPSBHZW5UeXBlTmFtZURlc3Qoa2V5X2ZpZWxkLnZhbHVlLnR5cGUpICsgIiBrZXkpIjsKICAgICAgICAgICAgICAgY29kZSArPSBvZmZzZXRfcHJlZml4OwpAQCAtODU5LDE1ICs4OTcsMTQgQEAKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICB2ZWN0b3JfdHlwZV9uYW1lID0gdHlwZV9uYW1lICsgIi5WZWN0b3IiOwogICAgICAgICB9Ci0gICAgICAgIGF1dG8gdmVjdG9yX21ldGhvZF9zdGFydCA9Ci0gICAgICAgICAgICBHZW5OdWxsYWJsZUFubm90YXRpb24oZmllbGQudmFsdWUudHlwZSkgKyAiICBwdWJsaWMgIiArCi0gICAgICAgICAgICB2ZWN0b3JfdHlwZV9uYW1lICsgb3B0aW9uYWwgKyAiICIgKwotICAgICAgICAgICAgQ29udmVydENhc2UoZmllbGQubmFtZSwgQ2FzZTo6a0xvd2VyQ2FtZWwpICsgIlZlY3RvciI7CisgICAgICAgIGF1dG8gdmVjdG9yX21ldGhvZF9zdGFydCA9IEdlbk51bGxhYmxlQW5ub3RhdGlvbihmaWVsZC52YWx1ZS50eXBlKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgIHB1YmxpYyAiICsgdmVjdG9yX3R5cGVfbmFtZSArICIgIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVyXy5GaWVsZChmaWVsZCwgInZlY3RvciIpOwogICAgICAgICBjb2RlICs9IHZlY3Rvcl9tZXRob2Rfc3RhcnQgKyAiKCkgeyByZXR1cm4gIjsKLSAgICAgICAgY29kZSArPSBDb252ZXJ0Q2FzZShmaWVsZC5uYW1lLCBDYXNlOjprTG93ZXJDYW1lbCkgKyAiVmVjdG9yIjsKKyAgICAgICAgY29kZSArPSBuYW1lcl8uRmllbGQoZmllbGQsICJ2ZWN0b3IiKTsKICAgICAgICAgY29kZSArPSAiKG5ldyAiICsgdmVjdG9yX3R5cGVfbmFtZSArICIoKSk7IH1cbiI7CiAgICAgICAgIGNvZGUgKz0gdmVjdG9yX21ldGhvZF9zdGFydCArICIoIiArIHZlY3Rvcl90eXBlX25hbWUgKyAiIG9iaikiOwotICAgICAgICBjb2RlICs9IG9mZnNldF9wcmVmaXggKyBjb25kaXRpb25hbF9jYXN0ICsgb2JqICsgIi5fX2Fzc2lnbigiOworICAgICAgICBjb2RlICs9IG9mZnNldF9wcmVmaXggKyBvYmogKyAiLl9fYXNzaWduKCI7CiAgICAgICAgIGNvZGUgKz0gIl9fdmVjdG9yKG8pLCAiOwogICAgICAgICBpZiAoIUlzU2NhbGFyKGVsZW1lbnRfYmFzZV90eXBlKSkgewogICAgICAgICAgIGF1dG8gdmVjdG9ydHlwZSA9IGZpZWxkLnZhbHVlLnR5cGUuVmVjdG9yVHlwZSgpOwpAQCAtODgwLDcgKzkxNyw3IEBACiAgICAgICAgICAgIElzU2NhbGFyKGZpZWxkLnZhbHVlLnR5cGUuVmVjdG9yVHlwZSgpLmJhc2VfdHlwZSkpIHx8CiAgICAgICAgICAgSXNTdHJpbmcoZmllbGQudmFsdWUudHlwZSkpIHsKICAgICAgICAgY29kZSArPSAiICBwdWJsaWMgQnl0ZUJ1ZmZlciAiOwotICAgICAgICBjb2RlICs9IENvbnZlcnRDYXNlKGZpZWxkLm5hbWUsIENhc2U6OmtMb3dlckNhbWVsKTsKKyAgICAgICAgY29kZSArPSBuYW1lcl8uRmllbGQoZmllbGQpOwogICAgICAgICBjb2RlICs9ICJBc0J5dGVCdWZmZXIoKSB7IHJldHVybiAiOwogICAgICAgICBjb2RlICs9ICJfX3ZlY3Rvcl9hc19ieXRlYnVmZmVyKCI7CiAgICAgICAgIGNvZGUgKz0gTnVtVG9TdHJpbmcoZmllbGQudmFsdWUub2Zmc2V0KSArICIsICI7CkBAIC04ODksNyArOTI2LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBJbmxpbmVTaXplKGZpZWxkLnZhbHVlLnR5cGUuVmVjdG9yVHlwZSgpKSk7CiAgICAgICAgIGNvZGUgKz0gIik7IH1cbiI7CiAgICAgICAgIGNvZGUgKz0gIiAgcHVibGljIEJ5dGVCdWZmZXIgIjsKLSAgICAgICAgY29kZSArPSBDb252ZXJ0Q2FzZShmaWVsZC5uYW1lLCBDYXNlOjprTG93ZXJDYW1lbCk7CisgICAgICAgIGNvZGUgKz0gbmFtZXJfLkZpZWxkKGZpZWxkKTsKICAgICAgICAgY29kZSArPSAiSW5CeXRlQnVmZmVyKEJ5dGVCdWZmZXIgX2JiKSB7IHJldHVybiAiOwogICAgICAgICBjb2RlICs9ICJfX3ZlY3Rvcl9pbl9ieXRlYnVmZmVyKF9iYiwgIjsKICAgICAgICAgY29kZSArPSBOdW1Ub1N0cmluZyhmaWVsZC52YWx1ZS5vZmZzZXQpICsgIiwgIjsKQEAgLTkwMCw5ICs5MzcsOSBAQAogICAgICAgfQogICAgICAgLy8gZ2VuZXJhdGUgb2JqZWN0IGFjY2Vzc29ycyBpZiBpcyBuZXN0ZWRfZmxhdGJ1ZmZlcgogICAgICAgaWYgKGZpZWxkLm5lc3RlZF9mbGF0YnVmZmVyKSB7Ci0gICAgICAgIGF1dG8gbmVzdGVkX3R5cGVfbmFtZSA9IFdyYXBJbk5hbWVTcGFjZSgqZmllbGQubmVzdGVkX2ZsYXRidWZmZXIpOwotICAgICAgICBhdXRvIG5lc3RlZF9tZXRob2RfbmFtZSA9IENvbnZlcnRDYXNlKGZpZWxkLm5hbWUsIENhc2U6OmtMb3dlckNhbWVsKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFzIiArIGZpZWxkLm5lc3RlZF9mbGF0YnVmZmVyLT5uYW1lOworICAgICAgICBhdXRvIG5lc3RlZF90eXBlX25hbWUgPSBuYW1lcl8uTmFtZXNwYWNlZFR5cGUoKmZpZWxkLm5lc3RlZF9mbGF0YnVmZmVyKTsKKyAgICAgICAgYXV0byBuZXN0ZWRfbWV0aG9kX25hbWUgPQorICAgICAgICAgICAgbmFtZXJfLkZpZWxkKGZpZWxkKSArICJBcyIgKyBmaWVsZC5uZXN0ZWRfZmxhdGJ1ZmZlci0+bmFtZTsKICAgICAgICAgYXV0byBnZXRfbmVzdGVkX21ldGhvZF9uYW1lID0gbmVzdGVkX21ldGhvZF9uYW1lOwogICAgICAgICBjb2RlICs9ICIgIHB1YmxpYyAiICsgbmVzdGVkX3R5cGVfbmFtZSArICIgIjsKICAgICAgICAgY29kZSArPSBuZXN0ZWRfbWV0aG9kX25hbWUgKyAiKCkgeyByZXR1cm4gIjsKQEAgLTkxMyw3ICs5NTAsNyBAQAogICAgICAgICBjb2RlICs9IG5lc3RlZF90eXBlX25hbWUgKyAiIG9iaiI7CiAgICAgICAgIGNvZGUgKz0gIikgeyBpbnQgbyA9IF9fb2Zmc2V0KCI7CiAgICAgICAgIGNvZGUgKz0gTnVtVG9TdHJpbmcoZmllbGQudmFsdWUub2Zmc2V0KSArICIpOyAiOwotICAgICAgICBjb2RlICs9ICJyZXR1cm4gbyAhPSAwID8gIiArIGNvbmRpdGlvbmFsX2Nhc3QgKyBvYmogKyAiLl9fYXNzaWduKCI7CisgICAgICAgIGNvZGUgKz0gInJldHVybiBvICE9IDAgPyAiICsgb2JqICsgIi5fX2Fzc2lnbigiOwogICAgICAgICBjb2RlICs9ICIiOwogICAgICAgICBjb2RlICs9ICJfX2luZGlyZWN0KF9fdmVjdG9yKG8pKSwgIjsKICAgICAgICAgY29kZSArPSAiYmIpIDogbnVsbDsgfVxuIjsKQEAgLTkyOCw3ICs5NjUsNiBAQAogICAgICAgICBhdXRvIHNldHRlcl9wYXJhbWV0ZXIgPSB1bmRlcmx5aW5nX3R5cGUuYmFzZV90eXBlID09IEJBU0VfVFlQRV9CT09MCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/ICIoYnl0ZSkoIiArIGZpZWxkLm5hbWUgKyAiID8gMSA6IDApIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBmaWVsZC5uYW1lOwotICAgICAgICBhdXRvIG11dGF0b3JfcHJlZml4ID0gIm11dGF0ZSI7CiAgICAgICAgIC8vIEEgdmVjdG9yIG11dGF0b3IgYWxzbyBuZWVkcyB0aGUgaW5kZXggb2YgdGhlIHZlY3RvciBlbGVtZW50IGl0IHNob3VsZAogICAgICAgICAvLyBtdXRhdGUuCiAgICAgICAgIGF1dG8gbXV0YXRvcl9wYXJhbXMgPSAoaXNfc2VyaWVzID8gIihpbnQgaiwgIiA6ICIoIikgKwpAQCAtOTQ2LDcgKzk4Miw3IEBACiAgICAgICAgIGlmIChJc1NjYWxhcih1bmRlcmx5aW5nX3R5cGUuYmFzZV90eXBlKSAmJiAhSXNVbmlvbihmaWVsZC52YWx1ZS50eXBlKSkgewogICAgICAgICAgIGNvZGUgKz0gIiAgcHVibGljICI7CiAgICAgICAgICAgY29kZSArPSBzdHJ1Y3RfZGVmLmZpeGVkID8gInZvaWQgIiA6ICJib29sZWFuICI7Ci0gICAgICAgICAgY29kZSArPSBtdXRhdG9yX3ByZWZpeCArIENvbnZlcnRDYXNlKGZpZWxkLm5hbWUsIENhc2U6OmtVcHBlckNhbWVsKTsKKyAgICAgICAgICBjb2RlICs9IG5hbWVyXy5NZXRob2QoIm11dGF0ZSIsIGZpZWxkKTsKICAgICAgICAgICBjb2RlICs9IG11dGF0b3JfcGFyYW1zOwogICAgICAgICAgIGlmIChzdHJ1Y3RfZGVmLmZpeGVkKSB7CiAgICAgICAgICAgICBjb2RlICs9IEdlblNldHRlcih1bmRlcmx5aW5nX3R5cGUpICsgIigiICsgc2V0dGVyX2luZGV4ICsgIiwgIjsKQEAgLTk2MiwxMCArOTk4LDkgQEAKICAgICAgIH0KICAgICAgIGlmIChwYXJzZXJfLm9wdHMuamF2YV9wcmltaXRpdmVfaGFzX21ldGhvZCAmJgogICAgICAgICAgIElzU2NhbGFyKGZpZWxkLnZhbHVlLnR5cGUuYmFzZV90eXBlKSAmJiAhc3RydWN0X2RlZi5maXhlZCkgewotICAgICAgICBhdXRvIHZ0X29mZnNldF9jb25zdGFudCA9Ci0gICAgICAgICAgICAiICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWVF8iICsKLSAgICAgICAgICAgIENvbnZlcnRDYXNlKGZpZWxkLm5hbWUsIENhc2U6OmtTY3JlYW1pbmdTbmFrZSkgKyAiID0gIiArCi0gICAgICAgICAgICBOdW1Ub1N0cmluZyhmaWVsZC52YWx1ZS5vZmZzZXQpICsgIjsiOworICAgICAgICBhdXRvIHZ0X29mZnNldF9jb25zdGFudCA9ICIgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZUXyIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVyXy5Db25zdGFudChmaWVsZCkgKyAiID0gIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTnVtVG9TdHJpbmcoZmllbGQudmFsdWUub2Zmc2V0KSArICI7IjsKIAogICAgICAgICBjb2RlICs9IHZ0X29mZnNldF9jb25zdGFudDsKICAgICAgICAgY29kZSArPSAiXG4iOwpAQCAtOTgwLDEwICsxMDE1LDEwIEBACiAgICAgICAvLyBjcmVhdGUgYSBzdHJ1Y3QgY29uc3RydWN0b3IgZnVuY3Rpb24KICAgICAgIGNvZGUgKz0gIiAgcHVibGljIHN0YXRpYyAiICsgR2VuT2Zmc2V0VHlwZSgpICsgIiAiOwogICAgICAgY29kZSArPSAiY3JlYXRlIjsKLSAgICAgIGNvZGUgKz0gc3RydWN0X2RlZi5uYW1lICsgIihGbGF0QnVmZmVyQnVpbGRlciBidWlsZGVyIjsKLSAgICAgIEdlblN0cnVjdEFyZ3Moc3RydWN0X2RlZiwgY29kZV9wdHIsICIiKTsKKyAgICAgIGNvZGUgKz0gc3RydWN0X2NsYXNzICsgIihGbGF0QnVmZmVyQnVpbGRlciBidWlsZGVyIjsKKyAgICAgIEdlblN0cnVjdEFyZ3Moc3RydWN0X2RlZiwgY29kZSwgIiIpOwogICAgICAgY29kZSArPSAiKSB7XG4iOwotICAgICAgR2VuU3RydWN0Qm9keShzdHJ1Y3RfZGVmLCBjb2RlX3B0ciwgIiIpOworICAgICAgR2VuU3RydWN0Qm9keShzdHJ1Y3RfZGVmLCBjb2RlLCAiIik7CiAgICAgICBjb2RlICs9ICIgICAgcmV0dXJuICI7CiAgICAgICBjb2RlICs9IEdlbk9mZnNldENvbnN0cnVjdCgiYnVpbGRlci4iICsgc3RkOjpzdHJpbmcoIm9mZnNldCgpIikpOwogICAgICAgY29kZSArPSAiO1xuICB9XG4iOwpAQCAtMTAxMCwxMiArMTA0NSwxMiBAQAogICAgICAgICAvLyBHZW5lcmF0ZSBhIHRhYmxlIGNvbnN0cnVjdG9yIG9mIHRoZSBmb3JtOgogICAgICAgICAvLyBwdWJsaWMgc3RhdGljIGludCBjcmVhdGVOYW1lKEZsYXRCdWZmZXJCdWlsZGVyIGJ1aWxkZXIsIGFyZ3MuLi4pCiAgICAgICAgIGNvZGUgKz0gIiAgcHVibGljIHN0YXRpYyAiICsgR2VuT2Zmc2V0VHlwZSgpICsgIiAiOwotICAgICAgICBjb2RlICs9ICJjcmVhdGUiICsgc3RydWN0X2RlZi5uYW1lOworICAgICAgICBjb2RlICs9IG5hbWVyXy5MZWdhY3lKYXZhTWV0aG9kMigiY3JlYXRlIiwgc3RydWN0X2RlZiwgIiIpOwogICAgICAgICBjb2RlICs9ICIoRmxhdEJ1ZmZlckJ1aWxkZXIgYnVpbGRlciI7CiAgICAgICAgIGZvciAoYXV0byBpdCA9IHN0cnVjdF9kZWYuZmllbGRzLnZlYy5iZWdpbigpOwogICAgICAgICAgICAgIGl0ICE9IHN0cnVjdF9kZWYuZmllbGRzLnZlYy5lbmQoKTsgKytpdCkgewogICAgICAgICAgIGF1dG8gJmZpZWxkID0gKippdDsKLSAgICAgICAgICBhdXRvIGZpZWxkX25hbWUgPSBDb252ZXJ0Q2FzZShmaWVsZC5uYW1lLCBDYXNlOjprTG93ZXJDYW1lbCk7CisgICAgICAgICAgYXV0byBmaWVsZF9uYW1lID0gbmFtZXJfLkZpZWxkKGZpZWxkKTsKICAgICAgICAgICBpZiAoZmllbGQuZGVwcmVjYXRlZCkgY29udGludWU7CiAgICAgICAgICAgY29kZSArPSAiLFxuICAgICAgIjsKICAgICAgICAgICBjb2RlICs9IEdlblR5cGVCYXNpYyhEZXN0aW5hdGlvblR5cGUoZmllbGQudmFsdWUudHlwZSwgZmFsc2UpKTsKQEAgLTEwMzEsMjEgKzEwNjYsMTkgQEAKICAgICAgICAgICBmb3IgKGF1dG8gaXQgPSBzdHJ1Y3RfZGVmLmZpZWxkcy52ZWMucmJlZ2luKCk7CiAgICAgICAgICAgICAgICBpdCAhPSBzdHJ1Y3RfZGVmLmZpZWxkcy52ZWMucmVuZCgpOyArK2l0KSB7CiAgICAgICAgICAgICBhdXRvICZmaWVsZCA9ICoqaXQ7Ci0gICAgICAgICAgICBhdXRvIGZpZWxkX25hbWUgPSBDb252ZXJ0Q2FzZShmaWVsZC5uYW1lLCBDYXNlOjprTG93ZXJDYW1lbCk7Ci0gICAgICAgICAgICBhdXRvIG1ldGhvZF9uYW1lID0gQ29udmVydENhc2UoZmllbGQubmFtZSwgQ2FzZTo6a1VwcGVyQ2FtZWwpOworICAgICAgICAgICAgYXV0byBmaWVsZF9uYW1lID0gbmFtZXJfLkZpZWxkKGZpZWxkKTsKICAgICAgICAgICAgIGlmICghZmllbGQuZGVwcmVjYXRlZCAmJgogICAgICAgICAgICAgICAgICghc3RydWN0X2RlZi5zb3J0YnlzaXplIHx8CiAgICAgICAgICAgICAgICAgIHNpemUgPT0gU2l6ZU9mKGZpZWxkLnZhbHVlLnR5cGUuYmFzZV90eXBlKSkpIHsKLSAgICAgICAgICAgICAgY29kZSArPSAiICAgICIgKyBzdHJ1Y3RfZGVmLm5hbWUgKyAiLiI7Ci0gICAgICAgICAgICAgIGNvZGUgKz0gImFkZCI7Ci0gICAgICAgICAgICAgIGNvZGUgKz0gbWV0aG9kX25hbWUgKyAiKGJ1aWxkZXIsICIgKyBmaWVsZF9uYW1lOworICAgICAgICAgICAgICBjb2RlICs9ICIgICAgIiArIHN0cnVjdF9jbGFzcyArICIuIjsKKyAgICAgICAgICAgICAgY29kZSArPSBuYW1lcl8uTWV0aG9kKCJhZGQiLCBmaWVsZCkgKyAiKGJ1aWxkZXIsICIgKyBmaWVsZF9uYW1lOwogICAgICAgICAgICAgICBpZiAoIUlzU2NhbGFyKGZpZWxkLnZhbHVlLnR5cGUuYmFzZV90eXBlKSkgY29kZSArPSAiT2Zmc2V0IjsKICAgICAgICAgICAgICAgY29kZSArPSAiKTtcbiI7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgICAgIGNvZGUgKz0gIiAgICByZXR1cm4gIiArIHN0cnVjdF9kZWYubmFtZSArICIuIjsKLSAgICAgICAgY29kZSArPSAiZW5kIiArIHN0cnVjdF9kZWYubmFtZTsKKyAgICAgICAgY29kZSArPSAiICAgIHJldHVybiAiICsgc3RydWN0X2NsYXNzICsgIi4iOworICAgICAgICBjb2RlICs9IG5hbWVyXy5MZWdhY3lKYXZhTWV0aG9kMigiZW5kIiwgc3RydWN0X2RlZiwgIiIpOwogICAgICAgICBjb2RlICs9ICIoYnVpbGRlcik7XG4gIH1cblxuIjsKICAgICAgIH0KICAgICAgIC8vIEdlbmVyYXRlIGEgc2V0IG9mIHN0YXRpYyBtZXRob2RzIHRoYXQgYWxsb3cgdGFibGUgY29uc3RydWN0aW9uLApAQCAtMTA1NCw3ICsxMDg3LDcgQEAKICAgICAgIC8vIHsgYnVpbGRlci5hZGRTaG9ydChpZCwgbmFtZSwgZGVmYXVsdCk7IH0KICAgICAgIC8vIFVubGlrZSB0aGUgQ3JlYXRlIGZ1bmN0aW9uLCB0aGVzZSBhbHdheXMgd29yay4KICAgICAgIGNvZGUgKz0gIiAgcHVibGljIHN0YXRpYyB2b2lkIHN0YXJ0IjsKLSAgICAgIGNvZGUgKz0gc3RydWN0X2RlZi5uYW1lOworICAgICAgY29kZSArPSBzdHJ1Y3RfY2xhc3M7CiAgICAgICBjb2RlICs9ICIoRmxhdEJ1ZmZlckJ1aWxkZXIgYnVpbGRlcikgeyBidWlsZGVyLiI7CiAgICAgICBjb2RlICs9ICJzdGFydFRhYmxlKCI7CiAgICAgICBjb2RlICs9IE51bVRvU3RyaW5nKHN0cnVjdF9kZWYuZmllbGRzLnZlYy5zaXplKCkpICsgIik7IH1cbiI7CkBAIC0xMDYyLDIyICsxMDk1LDM0IEBACiAgICAgICAgICAgIGl0ICE9IHN0cnVjdF9kZWYuZmllbGRzLnZlYy5lbmQoKTsgKytpdCkgewogICAgICAgICBhdXRvICZmaWVsZCA9ICoqaXQ7CiAgICAgICAgIGlmIChmaWVsZC5kZXByZWNhdGVkKSBjb250aW51ZTsKLSAgICAgICAgaWYgKGZpZWxkLmtleSkga2V5X2ZpZWxkID0gJmZpZWxkOwotICAgICAgICBjb2RlICs9ICIgIHB1YmxpYyBzdGF0aWMgdm9pZCBhZGQiOwotICAgICAgICBjb2RlICs9IENvbnZlcnRDYXNlKGZpZWxkLm5hbWUsIENhc2U6OmtVcHBlckNhbWVsKTsKKworICAgICAgICBjb2RlICs9ICIgIHB1YmxpYyBzdGF0aWMgdm9pZCAiICsgbmFtZXJfLk1ldGhvZCgiYWRkIiwgZmllbGQpOwogICAgICAgICBjb2RlICs9ICIoRmxhdEJ1ZmZlckJ1aWxkZXIgYnVpbGRlciwgIjsKICAgICAgICAgY29kZSArPSBHZW5UeXBlQmFzaWMoRGVzdGluYXRpb25UeXBlKGZpZWxkLnZhbHVlLnR5cGUsIGZhbHNlKSk7Ci0gICAgICAgIGF1dG8gYXJnbmFtZSA9IENvbnZlcnRDYXNlKGZpZWxkLm5hbWUsIENhc2U6OmtMb3dlckNhbWVsKTsKKyAgICAgICAgYXV0byBhcmduYW1lID0gbmFtZXJfLkZpZWxkKGZpZWxkKTsKICAgICAgICAgaWYgKCFJc1NjYWxhcihmaWVsZC52YWx1ZS50eXBlLmJhc2VfdHlwZSkpIGFyZ25hbWUgKz0gIk9mZnNldCI7CiAgICAgICAgIGNvZGUgKz0gIiAiICsgYXJnbmFtZSArICIpIHsgYnVpbGRlci5hZGQiOwogICAgICAgICBjb2RlICs9IEdlbk1ldGhvZChmaWVsZC52YWx1ZS50eXBlKSArICIoIjsKLSAgICAgICAgY29kZSArPSBOdW1Ub1N0cmluZyhpdCAtIHN0cnVjdF9kZWYuZmllbGRzLnZlYy5iZWdpbigpKSArICIsICI7Ci0gICAgICAgIGNvZGUgKz0gU291cmNlQ2FzdEJhc2ljKGZpZWxkLnZhbHVlLnR5cGUpOwotICAgICAgICBjb2RlICs9IGFyZ25hbWU7Ci0gICAgICAgIGNvZGUgKz0gIiwgIjsKLSAgICAgICAgY29kZSArPSBTb3VyY2VDYXN0QmFzaWMoZmllbGQudmFsdWUudHlwZSk7Ci0gICAgICAgIGNvZGUgKz0gR2VuRGVmYXVsdFZhbHVlKGZpZWxkKTsKLSAgICAgICAgY29kZSArPSAiKTsgfVxuIjsKKworICAgICAgICBpZiAoZmllbGQua2V5KSB7CisgICAgICAgICAgLy8gZmllbGQgaGFzIGtleSBhdHRyaWJ1dGUsIHNvIGFsd2F5cyBuZWVkIHRvIGV4aXN0CisgICAgICAgICAgLy8gZXZlbiBpZiBpdHMgdmFsdWUgaXMgZXF1YWwgdG8gZGVmYXVsdC4KKyAgICAgICAgICAvLyBHZW5lcmF0ZWQgY29kZSB3aWxsIGJ5cGFzcyBkZWZhdWx0IGNoZWNraW5nCisgICAgICAgICAgLy8gcmVzdWx0aW5nIGluIHsgYnVpbGRlci5hZGRTaG9ydChuYW1lKTsgc2xvdChpZCk7IH0KKyAgICAgICAgICBrZXlfZmllbGQgPSAmZmllbGQ7CisgICAgICAgICAgY29kZSArPSBTb3VyY2VDYXN0QmFzaWMoZmllbGQudmFsdWUudHlwZSk7CisgICAgICAgICAgY29kZSArPSBhcmduYW1lOworICAgICAgICAgIGNvZGUgKz0gIik7IGJ1aWxkZXIuc2xvdCgiICsKKyAgICAgICAgICAgICAgICAgIE51bVRvU3RyaW5nKGl0IC0gc3RydWN0X2RlZi5maWVsZHMudmVjLmJlZ2luKCkpICsgIik7IH1cbiI7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgY29kZSArPSBOdW1Ub1N0cmluZyhpdCAtIHN0cnVjdF9kZWYuZmllbGRzLnZlYy5iZWdpbigpKSArICIsICI7CisgICAgICAgICAgY29kZSArPSBTb3VyY2VDYXN0QmFzaWMoZmllbGQudmFsdWUudHlwZSk7CisgICAgICAgICAgY29kZSArPSBhcmduYW1lOworICAgICAgICAgIGNvZGUgKz0gIiwgIjsKKyAgICAgICAgICBjb2RlICs9IFNvdXJjZUNhc3RCYXNpYyhmaWVsZC52YWx1ZS50eXBlKTsKKyAgICAgICAgICBjb2RlICs9IEdlbkRlZmF1bHRWYWx1ZShmaWVsZCk7CisgICAgICAgICAgY29kZSArPSAiKTsgfVxuIjsKKyAgICAgICAgfQogICAgICAgICBpZiAoSXNWZWN0b3IoZmllbGQudmFsdWUudHlwZSkpIHsKICAgICAgICAgICBhdXRvIHZlY3Rvcl90eXBlID0gZmllbGQudmFsdWUudHlwZS5WZWN0b3JUeXBlKCk7CiAgICAgICAgICAgYXV0byBhbGlnbm1lbnQgPSBJbmxpbmVBbGlnbm1lbnQodmVjdG9yX3R5cGUpOwpAQCAtMTA4OSwyMCArMTEzNCwxNyBAQAogICAgICAgICAgICAgICAgICB2ZWN0b3JfdHlwZS5iYXNlX3R5cGUgPT0gQkFTRV9UWVBFX1VDSEFSKSkgewogICAgICAgICAgICAgICAvLyBIYW5kbGUgYnl0ZVtdIGFuZCBCeXRlQnVmZmVycyBzZXBhcmF0ZWx5IGZvciBKYXZhCiAgICAgICAgICAgICAgIGNvZGUgKz0gIiAgcHVibGljIHN0YXRpYyAiICsgR2VuVmVjdG9yT2Zmc2V0VHlwZSgpICsgIiAiOwotICAgICAgICAgICAgICBjb2RlICs9ICJjcmVhdGUiOwotICAgICAgICAgICAgICBjb2RlICs9IENvbnZlcnRDYXNlKGZpZWxkLm5hbWUsIENhc2U6OmtVcHBlckNhbWVsKTsKKyAgICAgICAgICAgICAgY29kZSArPSBuYW1lcl8uTWV0aG9kKCJjcmVhdGUiLCBmaWVsZCk7CiAgICAgICAgICAgICAgIGNvZGUgKz0gIlZlY3RvcihGbGF0QnVmZmVyQnVpbGRlciBidWlsZGVyLCBieXRlW10gZGF0YSkgIjsKICAgICAgICAgICAgICAgY29kZSArPSAieyByZXR1cm4gYnVpbGRlci5jcmVhdGVCeXRlVmVjdG9yKGRhdGEpOyB9XG4iOwogCiAgICAgICAgICAgICAgIGNvZGUgKz0gIiAgcHVibGljIHN0YXRpYyAiICsgR2VuVmVjdG9yT2Zmc2V0VHlwZSgpICsgIiAiOwotICAgICAgICAgICAgICBjb2RlICs9ICJjcmVhdGUiOwotICAgICAgICAgICAgICBjb2RlICs9IENvbnZlcnRDYXNlKGZpZWxkLm5hbWUsIENhc2U6OmtVcHBlckNhbWVsKTsKKyAgICAgICAgICAgICAgY29kZSArPSBuYW1lcl8uTWV0aG9kKCJjcmVhdGUiLCBmaWVsZCk7CiAgICAgICAgICAgICAgIGNvZGUgKz0gIlZlY3RvcihGbGF0QnVmZmVyQnVpbGRlciBidWlsZGVyLCBCeXRlQnVmZmVyIGRhdGEpICI7CiAgICAgICAgICAgICAgIGNvZGUgKz0gInsgcmV0dXJuIGJ1aWxkZXIuY3JlYXRlQnl0ZVZlY3RvcihkYXRhKTsgfVxuIjsKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgIGNvZGUgKz0gIiAgcHVibGljIHN0YXRpYyAiICsgR2VuVmVjdG9yT2Zmc2V0VHlwZSgpICsgIiAiOwotICAgICAgICAgICAgICBjb2RlICs9ICJjcmVhdGUiOwotICAgICAgICAgICAgICBjb2RlICs9IENvbnZlcnRDYXNlKGZpZWxkLm5hbWUsIENhc2U6OmtVcHBlckNhbWVsKTsKKyAgICAgICAgICAgICAgY29kZSArPSBuYW1lcl8uTWV0aG9kKCJjcmVhdGUiLCBmaWVsZCk7CiAgICAgICAgICAgICAgIGNvZGUgKz0gIlZlY3RvcihGbGF0QnVmZmVyQnVpbGRlciBidWlsZGVyLCAiOwogICAgICAgICAgICAgICBjb2RlICs9IEdlblR5cGVCYXNpYyhEZXN0aW5hdGlvblR5cGUodmVjdG9yX3R5cGUsIGZhbHNlKSkgKwogICAgICAgICAgICAgICAgICAgICAgICJbXSBkYXRhKSAiOwpAQCAtMTEyMyw4ICsxMTY1LDcgQEAKICAgICAgICAgICB9CiAgICAgICAgICAgLy8gR2VuZXJhdGUgYSBtZXRob2QgdG8gc3RhcnQgYSB2ZWN0b3IsIGRhdGEgdG8gYmUgYWRkZWQgbWFudWFsbHkKICAgICAgICAgICAvLyBhZnRlci4KLSAgICAgICAgICBjb2RlICs9ICIgIHB1YmxpYyBzdGF0aWMgdm9pZCBzdGFydCI7Ci0gICAgICAgICAgY29kZSArPSBDb252ZXJ0Q2FzZShmaWVsZC5uYW1lLCBDYXNlOjprVXBwZXJDYW1lbCk7CisgICAgICAgICAgY29kZSArPSAiICBwdWJsaWMgc3RhdGljIHZvaWQgIiArIG5hbWVyXy5NZXRob2QoInN0YXJ0IiwgZmllbGQpOwogICAgICAgICAgIGNvZGUgKz0gIlZlY3RvcihGbGF0QnVmZmVyQnVpbGRlciBidWlsZGVyLCBpbnQgbnVtRWxlbXMpICI7CiAgICAgICAgICAgY29kZSArPSAieyBidWlsZGVyLnN0YXJ0VmVjdG9yKCI7CiAgICAgICAgICAgY29kZSArPSBOdW1Ub1N0cmluZyhlbGVtX3NpemUpOwpAQCAtMTEzMyw3ICsxMTc0LDcgQEAKICAgICAgICAgfQogICAgICAgfQogICAgICAgY29kZSArPSAiICBwdWJsaWMgc3RhdGljICIgKyBHZW5PZmZzZXRUeXBlKCkgKyAiICI7Ci0gICAgICBjb2RlICs9ICJlbmQiICsgc3RydWN0X2RlZi5uYW1lOworICAgICAgY29kZSArPSBuYW1lcl8uTGVnYWN5SmF2YU1ldGhvZDIoImVuZCIsIHN0cnVjdF9kZWYsICIiKTsKICAgICAgIGNvZGUgKz0gIihGbGF0QnVmZmVyQnVpbGRlciBidWlsZGVyKSB7XG4gICAgaW50IG8gPSBidWlsZGVyLiI7CiAgICAgICBjb2RlICs9ICJlbmRUYWJsZSgpO1xuIjsKICAgICAgIGZvciAoYXV0byBpdCA9IHN0cnVjdF9kZWYuZmllbGRzLnZlYy5iZWdpbigpOwpAQCAtMTE1MCw4ICsxMTkxLDkgQEAKICAgICAgICAgc3RkOjpzdHJpbmcgc2l6ZV9wcmVmaXhbXSA9IHsgIiIsICJTaXplUHJlZml4ZWQiIH07CiAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMjsgKytpKSB7CiAgICAgICAgICAgY29kZSArPSAiICBwdWJsaWMgc3RhdGljIHZvaWQgIjsKLSAgICAgICAgICBjb2RlICs9ICJmaW5pc2giICsgc2l6ZV9wcmVmaXhbaV0gKyBzdHJ1Y3RfZGVmLm5hbWU7Ci0gICAgICAgICAgY29kZSArPSAiQnVmZmVyKEZsYXRCdWZmZXJCdWlsZGVyIGJ1aWxkZXIsICIgKyBHZW5PZmZzZXRUeXBlKCk7CisgICAgICAgICAgY29kZSArPSBuYW1lcl8uTGVnYWN5SmF2YU1ldGhvZDIoImZpbmlzaCIgKyBzaXplX3ByZWZpeFtpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3RfZGVmLCAiQnVmZmVyIik7CisgICAgICAgICAgY29kZSArPSAiKEZsYXRCdWZmZXJCdWlsZGVyIGJ1aWxkZXIsICIgKyBHZW5PZmZzZXRUeXBlKCk7CiAgICAgICAgICAgY29kZSArPSAiIG9mZnNldCkgeyI7CiAgICAgICAgICAgY29kZSArPSAiIGJ1aWxkZXIuZmluaXNoIiArIHNpemVfcHJlZml4W2ldICsgIihvZmZzZXQiOwogCkBAIC0xMTcwLDkgKzEyMTIsOSBAQAogICAgICAgY29kZSArPSBHZW5LZXlHZXR0ZXIoa2V5X2ZpZWxkKTsKICAgICAgIGNvZGUgKz0gIiB9XG4iOwogCi0gICAgICBjb2RlICs9ICJcbiAgcHVibGljIHN0YXRpYyAiICsgc3RydWN0X2RlZi5uYW1lOworICAgICAgY29kZSArPSAiXG4gIHB1YmxpYyBzdGF0aWMgIiArIHN0cnVjdF9jbGFzczsKICAgICAgIGNvZGUgKz0gIiBfX2xvb2t1cF9ieV9rZXkoIjsKLSAgICAgIGNvZGUgKz0gc3RydWN0X2RlZi5uYW1lICsgIiBvYmosICI7CisgICAgICBjb2RlICs9IHN0cnVjdF9jbGFzcyArICIgb2JqLCAiOwogICAgICAgY29kZSArPSAiaW50IHZlY3RvckxvY2F0aW9uLCAiOwogICAgICAgY29kZSArPSBHZW5UeXBlTmFtZURlc3Qoa2V5X2ZpZWxkLT52YWx1ZS50eXBlKTsKICAgICAgIGNvZGUgKz0gIiBrZXksIEJ5dGVCdWZmZXIgYmIpIHtcbiI7CkBAIC0xMTk0LDE1ICsxMjM2LDE1IEBACiAgICAgICBjb2RlICs9ICIgICAgICAgIHNwYW4gLT0gbWlkZGxlO1xuIjsKICAgICAgIGNvZGUgKz0gIiAgICAgIH0gZWxzZSB7XG4iOwogICAgICAgY29kZSArPSAiICAgICAgICByZXR1cm4gIjsKLSAgICAgIGNvZGUgKz0gIihvYmogPT0gbnVsbCA/IG5ldyAiICsgc3RydWN0X2RlZi5uYW1lICsgIigpIDogb2JqKSI7CisgICAgICBjb2RlICs9ICIob2JqID09IG51bGwgPyBuZXcgIiArIHN0cnVjdF9jbGFzcyArICIoKSA6IG9iaikiOwogICAgICAgY29kZSArPSAiLl9fYXNzaWduKHRhYmxlT2Zmc2V0LCBiYik7XG4iOwogICAgICAgY29kZSArPSAiICAgICAgfVxuICAgIH1cbiI7CiAgICAgICBjb2RlICs9ICIgICAgcmV0dXJuIG51bGw7XG4iOwogICAgICAgY29kZSArPSAiICB9XG4iOwogICAgIH0KLSAgICBHZW5WZWN0b3JBY2Nlc3NPYmplY3Qoc3RydWN0X2RlZiwgY29kZV9wdHIpOworICAgIEdlblZlY3RvckFjY2Vzc09iamVjdChzdHJ1Y3RfZGVmLCBjb2RlKTsKICAgICBpZiAob3B0cy5nZW5lcmF0ZV9vYmplY3RfYmFzZWRfYXBpKSB7Ci0gICAgICBHZW5QYWNrVW5QYWNrX09iamVjdEFQSShzdHJ1Y3RfZGVmLCBjb2RlX3B0ciwgb3B0cywgc3RydWN0X2hhc19jcmVhdGUsCisgICAgICBHZW5QYWNrVW5QYWNrX09iamVjdEFQSShzdHJ1Y3RfZGVmLCBjb2RlLCBvcHRzLCBzdHJ1Y3RfaGFzX2NyZWF0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkX2hhc19jcmVhdGVfc2V0KTsKICAgICB9CiAgICAgY29kZSArPSAifVxuXG4iOwpAQCAtMTIxMCwxNCArMTI1MiwxMiBAQAogCiAgIHN0ZDo6c3RyaW5nIEdlbk9wdGlvbmFsU2NhbGFyQ2hlY2soRmllbGREZWYgJmZpZWxkKSBjb25zdCB7CiAgICAgaWYgKCFmaWVsZC5Jc1NjYWxhck9wdGlvbmFsKCkpIHJldHVybiAiIjsKLSAgICByZXR1cm4gIiAgcHVibGljIGJvb2xlYW4gaGFzIiArIENvbnZlcnRDYXNlKGZpZWxkLm5hbWUsIENhc2U6OmtVcHBlckNhbWVsKSArCisgICAgcmV0dXJuICIgIHB1YmxpYyBib29sZWFuICIgKyBuYW1lcl8uTWV0aG9kKCJoYXMiLCBmaWVsZCkgKwogICAgICAgICAgICAiKCkgeyByZXR1cm4gMCAhPSBfX29mZnNldCgiICsgTnVtVG9TdHJpbmcoZmllbGQudmFsdWUub2Zmc2V0KSArCiAgICAgICAgICAgICIpOyB9XG4iOwogICB9CiAKLSAgdm9pZCBHZW5WZWN0b3JBY2Nlc3NPYmplY3QoU3RydWN0RGVmICZzdHJ1Y3RfZGVmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyAqY29kZV9wdHIpIGNvbnN0IHsKLSAgICBhdXRvICZjb2RlID0gKmNvZGVfcHRyOworICB2b2lkIEdlblZlY3RvckFjY2Vzc09iamVjdChTdHJ1Y3REZWYgJnN0cnVjdF9kZWYsIHN0ZDo6c3RyaW5nICZjb2RlKSBjb25zdCB7CiAgICAgLy8gR2VuZXJhdGUgYSB2ZWN0b3Igb2Ygc3RydWN0cyBhY2Nlc3NvciBjbGFzcy4KICAgICBjb2RlICs9ICJcbiI7CiAgICAgY29kZSArPSAiICAiOwpAQCAtMTIzNCw3ICsxMjc0LDcgQEAKICAgICBjb2RlICs9ICJfX2Fzc2lnbihpbnQgX3ZlY3RvciwgaW50IF9lbGVtZW50X3NpemUsIEJ5dGVCdWZmZXIgX2JiKSB7ICI7CiAgICAgY29kZSArPSAiX19yZXNldChfdmVjdG9yLCBfZWxlbWVudF9zaXplLCBfYmIpOyByZXR1cm4gdGhpczsgfVxuXG4iOwogCi0gICAgYXV0byB0eXBlX25hbWUgPSBzdHJ1Y3RfZGVmLm5hbWU7CisgICAgYXV0byB0eXBlX25hbWUgPSBuYW1lcl8uVHlwZShzdHJ1Y3RfZGVmKTsKICAgICBhdXRvIG1ldGhvZF9zdGFydCA9IG1ldGhvZF9pbmRlbnQgKyAicHVibGljICIgKyB0eXBlX25hbWUgKyAiIGdldCI7CiAgICAgLy8gR2VuZXJhdGUgdGhlIGFjY2Vzc29ycyB0aGF0IGRvbid0IGRvIG9iamVjdCByZXVzZS4KICAgICBjb2RlICs9IG1ldGhvZF9zdGFydCArICIoaW50IGopIHsgcmV0dXJuIGdldCI7CkBAIC0xMjc2LDE4ICsxMzE2LDEyIEBACiAgICAgY29kZSArPSAiICB9XG4iOwogICB9CiAKLSAgc3RkOjpzdHJpbmcgR2VuR2V0dGVyRnVuY05hbWVfT2JqZWN0QVBJKGNvbnN0IHN0ZDo6c3RyaW5nICZmaWVsZF9uYW1lKSBjb25zdCB7Ci0gICAgcmV0dXJuICJnZXQiICsgQ29udmVydENhc2UoZmllbGRfbmFtZSwgQ2FzZTo6a1VwcGVyQ2FtZWwpOwotICB9Ci0KLSAgdm9pZCBHZW5FbnVtX09iamVjdEFQSShFbnVtRGVmICZlbnVtX2RlZiwgc3RkOjpzdHJpbmcgKmNvZGVfcHRyLAotICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElETE9wdGlvbnMgJm9wdHMpIGNvbnN0IHsKLSAgICBhdXRvICZjb2RlID0gKmNvZGVfcHRyOworICB2b2lkIEdlbkVudW1fT2JqZWN0QVBJKEVudW1EZWYgJmVudW1fZGVmLCBzdGQ6OnN0cmluZyAmY29kZSkgY29uc3QgewogICAgIGlmIChlbnVtX2RlZi5nZW5lcmF0ZWQpIHJldHVybjsKICAgICBjb2RlICs9ICJpbXBvcnQgY29tLmdvb2dsZS5mbGF0YnVmZmVycy5GbGF0QnVmZmVyQnVpbGRlcjtcblxuIjsKIAogICAgIGlmICghZW51bV9kZWYuYXR0cmlidXRlcy5Mb29rdXAoInByaXZhdGUiKSkgeyBjb2RlICs9ICJwdWJsaWMgIjsgfQotICAgIGF1dG8gdW5pb25fbmFtZSA9IGVudW1fZGVmLm5hbWUgKyAiVW5pb24iOworICAgIGF1dG8gdW5pb25fbmFtZSA9IG5hbWVyXy5UeXBlKGVudW1fZGVmKSArICJVbmlvbiI7CiAgICAgYXV0byB1bmlvbl90eXBlID0KICAgICAgICAgR2VuVHlwZUJhc2ljKERlc3RpbmF0aW9uVHlwZShlbnVtX2RlZi51bmRlcmx5aW5nX3R5cGUsIGZhbHNlKSk7CiAgICAgY29kZSArPSAiY2xhc3MgIiArIHVuaW9uX25hbWUgKyAiIHtcbiI7CkBAIC0xMzA0LDE1ICsxMzM4LDE2IEBACiAgICAgY29kZSArPSAiICBwdWJsaWMgdm9pZCBzZXRWYWx1ZShPYmplY3QgdmFsdWUpIHsgdGhpcy52YWx1ZSA9IHZhbHVlOyB9XG5cbiI7CiAgICAgLy8gQ29uc3RydWN0b3IKICAgICBjb2RlICs9ICIgIHB1YmxpYyAiICsgdW5pb25fbmFtZSArICIoKSB7XG4iOwotICAgIGNvZGUgKz0gIiAgICB0aGlzLnR5cGUgPSAiICsgZW51bV9kZWYubmFtZSArICIuIiArCi0gICAgICAgICAgICBlbnVtX2RlZi5WYWxzKClbMF0tPm5hbWUgKyAiO1xuIjsKKyAgICBjb2RlICs9CisgICAgICAgICIgICAgdGhpcy50eXBlID0gIiArIG5hbWVyXy5FbnVtVmFyaWFudChlbnVtX2RlZiwgKmVudW1fZGVmLlZhbHMoKVswXSkgKworICAgICAgICAiO1xuIjsKICAgICBjb2RlICs9ICIgICAgdGhpcy52YWx1ZSA9IG51bGw7XG4iOwogICAgIGNvZGUgKz0gIiAgfVxuXG4iOwogICAgIC8vIEFzCiAgICAgZm9yIChhdXRvIGl0ID0gZW51bV9kZWYuVmFscygpLmJlZ2luKCk7IGl0ICE9IGVudW1fZGVmLlZhbHMoKS5lbmQoKTsgKytpdCkgewogICAgICAgYXV0byAmZXYgPSAqKml0OwogICAgICAgaWYgKGV2LnVuaW9uX3R5cGUuYmFzZV90eXBlID09IEJBU0VfVFlQRV9OT05FKSBjb250aW51ZTsKLSAgICAgIGF1dG8gdHlwZV9uYW1lID0gR2VuVHlwZUdldF9PYmplY3RBUEkoZXYudW5pb25fdHlwZSwgb3B0cywgZmFsc2UsIHRydWUpOworICAgICAgYXV0byB0eXBlX25hbWUgPSBHZW5UeXBlR2V0X09iamVjdEFQSShldi51bmlvbl90eXBlLCBmYWxzZSwgdHJ1ZSk7CiAgICAgICBpZiAoZXYudW5pb25fdHlwZS5iYXNlX3R5cGUgPT0gQkFTRV9UWVBFX1NUUlVDVCAmJgogICAgICAgICAgIGV2LnVuaW9uX3R5cGUuc3RydWN0X2RlZi0+YXR0cmlidXRlcy5Mb29rdXAoInByaXZhdGUiKSkgewogICAgICAgICBjb2RlICs9ICIgICI7CkBAIC0xMzMyLDcgKzEzNjcsNyBAQAogICAgICAgaWYgKGV2LnVuaW9uX3R5cGUuYmFzZV90eXBlID09IEJBU0VfVFlQRV9OT05FKSB7CiAgICAgICAgIGNvbnRpbnVlOwogICAgICAgfSBlbHNlIHsKLSAgICAgICAgY29kZSArPSAiICAgICAgY2FzZSAiICsgZW51bV9kZWYubmFtZSArICIuIiArIGV2Lm5hbWUgKyAiOiByZXR1cm4gIjsKKyAgICAgICAgY29kZSArPSAiICAgICAgY2FzZSAiICsgbmFtZXJfLkVudW1WYXJpYW50KGVudW1fZGVmLCBldikgKyAiOiByZXR1cm4gIjsKICAgICAgICAgaWYgKElzU3RyaW5nKGV2LnVuaW9uX3R5cGUpKSB7CiAgICAgICAgICAgY29kZSArPSAiYnVpbGRlci5jcmVhdGVTdHJpbmcoX28uYXMiICsgZXYubmFtZSArICIoKSk7XG4iOwogICAgICAgICB9IGVsc2UgewpAQCAtMTM0Nyw0MSArMTM4MiwyMyBAQAogICAgIGNvZGUgKz0gIn1cblxuIjsKICAgfQogCi0gIHN0ZDo6c3RyaW5nIEdlblNldHRlckZ1bmNOYW1lX09iamVjdEFQSShjb25zdCBzdGQ6OnN0cmluZyAmZmllbGRfbmFtZSkgY29uc3QgewotICAgIHJldHVybiAic2V0IiArIENvbnZlcnRDYXNlKGZpZWxkX25hbWUsIENhc2U6OmtVcHBlckNhbWVsKTsKLSAgfQotCi0gIHN0ZDo6c3RyaW5nIEdlblR5cGVOYW1lX09iamVjdEFQSShjb25zdCBzdGQ6OnN0cmluZyAmbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElETE9wdGlvbnMgJm9wdHMpIGNvbnN0IHsKLSAgICByZXR1cm4gb3B0cy5vYmplY3RfcHJlZml4ICsgbmFtZSArIG9wdHMub2JqZWN0X3N1ZmZpeDsKLSAgfQotCi0gIHZvaWQgR2VuVW5pb25VblBhY2tfT2JqZWN0QVBJKGNvbnN0IEVudW1EZWYgJmVudW1fZGVmLCBzdGQ6OnN0cmluZyAqY29kZV9wdHIsCisgIHZvaWQgR2VuVW5pb25VblBhY2tfT2JqZWN0QVBJKGNvbnN0IEVudW1EZWYgJmVudW1fZGVmLCBzdGQ6OnN0cmluZyAmY29kZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgJnR5cGVfbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgJmNhbWVsX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nICZmaWVsZF9uYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3ZlY3RvcikgY29uc3QgewotICAgIGF1dG8gJmNvZGUgPSAqY29kZV9wdHI7CisgICAgY29uc3Qgc3RkOjpzdHJpbmcgdmFyaWFibGVfdHlwZSA9CisgICAgICAgIGlzX3ZlY3RvciA/IHR5cGVfbmFtZS5zdWJzdHIoMCwgdHlwZV9uYW1lLmxlbmd0aCgpIC0gMikgOiB0eXBlX25hbWU7CisgICAgY29uc3Qgc3RkOjpzdHJpbmcgdmFyaWFibGVfbmFtZSA9CisgICAgICAgICJfIiArIG5hbWVyXy5WYXJpYWJsZSgibyIsIGZpZWxkX25hbWUpICsgKGlzX3ZlY3RvciA/ICJFbGVtZW50IiA6ICIiKTsKKyAgICBjb25zdCBzdGQ6OnN0cmluZyB0eXBlX3BhcmFtcyA9IGlzX3ZlY3RvciA/ICJfaiIgOiAiIjsKKyAgICBjb25zdCBzdGQ6OnN0cmluZyB2YWx1ZV9wYXJhbXMgPSBpc192ZWN0b3IgPyAiLCBfaiIgOiAiIjsKKyAgICBjb25zdCBzdGQ6OnN0cmluZyBpbmRlbnQgPSAoaXNfdmVjdG9yID8gIiAgICAgICIgOiAiICAgICIpOwogCi0gICAgc3RkOjpzdHJpbmcgdmFyaWFibGVfdHlwZSA9IHR5cGVfbmFtZTsKLSAgICBzdGQ6OnN0cmluZyB2YXJpYWJsZV9uYW1lID0KLSAgICAgICAgIl9vIiArIENvbnZlcnRDYXNlKGNhbWVsX25hbWUsIENhc2U6OmtVcHBlckNhbWVsKTsKLSAgICBzdGQ6OnN0cmluZyB0eXBlX3BhcmFtcyA9ICIiOwotICAgIHN0ZDo6c3RyaW5nIHZhbHVlX3BhcmFtcyA9ICIiOwotICAgIHN0ZDo6c3RyaW5nIGZ1bmNfc3VmZml4ID0gIigpIjsKLSAgICBzdGQ6OnN0cmluZyBpbmRlbnQgPSAiICAgICI7Ci0gICAgaWYgKGlzX3ZlY3RvcikgewotICAgICAgdmFyaWFibGVfdHlwZSA9IHR5cGVfbmFtZS5zdWJzdHIoMCwgdHlwZV9uYW1lLmxlbmd0aCgpIC0gMik7Ci0gICAgICB2YXJpYWJsZV9uYW1lICs9ICJFbGVtZW50IjsKLSAgICAgIHR5cGVfcGFyYW1zID0gIl9qIjsKLSAgICAgIHZhbHVlX3BhcmFtcyA9ICIsIF9qIjsKLSAgICAgIGZ1bmNfc3VmZml4ID0gIihfaikiOwotICAgICAgaW5kZW50ID0gIiAgICAgICI7Ci0gICAgfQogICAgIGNvZGUgKz0gaW5kZW50ICsgdmFyaWFibGVfdHlwZSArICIgIiArIHZhcmlhYmxlX25hbWUgKyAiID0gbmV3ICIgKwogICAgICAgICAgICAgdmFyaWFibGVfdHlwZSArICIoKTtcbiI7CiAgICAgY29kZSArPSBpbmRlbnQgKwogICAgICAgICAgICAgR2VuVHlwZUJhc2ljKERlc3RpbmF0aW9uVHlwZShlbnVtX2RlZi51bmRlcmx5aW5nX3R5cGUsIGZhbHNlKSkgKwotICAgICAgICAgICAgIiAiICsgdmFyaWFibGVfbmFtZSArICJUeXBlID0gIiArIGNhbWVsX25hbWUgKyAiVHlwZSgiICsKKyAgICAgICAgICAgICIgIiArIHZhcmlhYmxlX25hbWUgKyAiVHlwZSA9ICIgKyBmaWVsZF9uYW1lICsgIlR5cGUoIiArCiAgICAgICAgICAgICB0eXBlX3BhcmFtcyArICIpO1xuIjsKICAgICBjb2RlICs9IGluZGVudCArIHZhcmlhYmxlX25hbWUgKyAiLnNldFR5cGUoIiArIHZhcmlhYmxlX25hbWUgKyAiVHlwZSk7XG4iOwogICAgIGNvZGUgKz0gaW5kZW50ICsgIlRhYmxlICIgKyB2YXJpYWJsZV9uYW1lICsgIlZhbHVlO1xuIjsKQEAgLTEzOTksMTAgKzE0MTYsMTAgQEAKICAgICAgICAgICAgICAgICAgICAgIC8vIEphdmEgd2hpY2ggZG9lc24ndCBoYW5kbGUgbm9uIFRhYmxlIHR5cGVzLiBTaG91bGQgYmUKICAgICAgICAgICAgICAgICAgICAgIC8vIGRlbGV0ZWQgd2hlbiBpc3N1ZSAjNjU2MSBpcyBmaXhlZC4KICAgICAgICAgfQotICAgICAgICBjb2RlICs9IGluZGVudCArICIgIGNhc2UgIiArIFdyYXBJbk5hbWVTcGFjZShlbnVtX2RlZikgKyAiLiIgKyBldi5uYW1lICsKLSAgICAgICAgICAgICAgICAiOlxuIjsKKyAgICAgICAgY29kZSArPSBpbmRlbnQgKyAiICBjYXNlICIgKworICAgICAgICAgICAgICAgIG5hbWVyXy5OYW1lc3BhY2VkRW51bVZhcmlhbnQoZW51bV9kZWYsIGV2KSArICI6XG4iOwogICAgICAgICBhdXRvIGFjdHVhbF90eXBlID0gR2VuVHlwZUdldChldi51bmlvbl90eXBlKTsKLSAgICAgICAgY29kZSArPSBpbmRlbnQgKyAiICAgICIgKyB2YXJpYWJsZV9uYW1lICsgIlZhbHVlID0gIiArIGNhbWVsX25hbWUgKworICAgICAgICBjb2RlICs9IGluZGVudCArICIgICAgIiArIHZhcmlhYmxlX25hbWUgKyAiVmFsdWUgPSAiICsgZmllbGRfbmFtZSArCiAgICAgICAgICAgICAgICAgIihuZXcgIiArIGFjdHVhbF90eXBlICsgIigpIiArIHZhbHVlX3BhcmFtcyArICIpO1xuIjsKICAgICAgICAgY29kZSArPSBpbmRlbnQgKyAiICAgICIgKyB2YXJpYWJsZV9uYW1lICsgIi5zZXRWYWx1ZSgiICsgdmFyaWFibGVfbmFtZSArCiAgICAgICAgICAgICAgICAgIlZhbHVlICE9IG51bGwgPyAoKCIgKyBhY3R1YWxfdHlwZSArICIpICIgKyB2YXJpYWJsZV9uYW1lICsKQEAgLTE0MTMsMTcgKzE0MzAsMTYgQEAKICAgICBjb2RlICs9IGluZGVudCArICIgIGRlZmF1bHQ6IGJyZWFrO1xuIjsKICAgICBjb2RlICs9IGluZGVudCArICJ9XG4iOwogICAgIGlmIChpc192ZWN0b3IpIHsKLSAgICAgIGNvZGUgKz0gaW5kZW50ICsgIl9vIiArIENvbnZlcnRDYXNlKGNhbWVsX25hbWUsIENhc2U6OmtVcHBlckNhbWVsKSArCisgICAgICBjb2RlICs9IGluZGVudCArICJfIiArIG5hbWVyXy5WYXJpYWJsZSgibyIsIGZpZWxkX25hbWUpICsKICAgICAgICAgICAgICAgIltfal0gPSAiICsgdmFyaWFibGVfbmFtZSArICI7XG4iOwogICAgIH0KICAgfQogCiAgIHZvaWQgR2VuUGFja1VuUGFja19PYmplY3RBUEkoCi0gICAgICBTdHJ1Y3REZWYgJnN0cnVjdF9kZWYsIHN0ZDo6c3RyaW5nICpjb2RlX3B0ciwgY29uc3QgSURMT3B0aW9ucyAmb3B0cywKKyAgICAgIFN0cnVjdERlZiAmc3RydWN0X2RlZiwgc3RkOjpzdHJpbmcgJmNvZGUsIGNvbnN0IElETE9wdGlvbnMgJm9wdHMsCiAgICAgICBib29sIHN0cnVjdF9oYXNfY3JlYXRlLAogICAgICAgY29uc3Qgc3RkOjpzZXQ8RmllbGREZWYgKj4gJmZpZWxkX2hhc19jcmVhdGUpIGNvbnN0IHsKLSAgICBhdXRvICZjb2RlID0gKmNvZGVfcHRyOwotICAgIGF1dG8gc3RydWN0X25hbWUgPSBHZW5UeXBlTmFtZV9PYmplY3RBUEkoc3RydWN0X2RlZi5uYW1lLCBvcHRzKTsKKyAgICBhdXRvIHN0cnVjdF9uYW1lID0gbmFtZXJfLk9iamVjdFR5cGUoc3RydWN0X2RlZik7CiAgICAgLy8gdW5wYWNrKCkKICAgICBjb2RlICs9ICIgIHB1YmxpYyAiICsgc3RydWN0X25hbWUgKyAiIHVucGFjaygpIHtcbiI7CiAgICAgY29kZSArPSAiICAgICIgKyBzdHJ1Y3RfbmFtZSArICIgX28gPSBuZXcgIiArIHN0cnVjdF9uYW1lICsgIigpO1xuIjsKQEAgLTE0MzQsMzUgKzE0NTAsMzQgQEAKICAgICBjb2RlICs9ICIgIHB1YmxpYyB2b2lkIHVucGFja1RvKCIgKyBzdHJ1Y3RfbmFtZSArICIgX28pIHtcbiI7CiAgICAgZm9yIChhdXRvIGl0ID0gc3RydWN0X2RlZi5maWVsZHMudmVjLmJlZ2luKCk7CiAgICAgICAgICBpdCAhPSBzdHJ1Y3RfZGVmLmZpZWxkcy52ZWMuZW5kKCk7ICsraXQpIHsKLSAgICAgIGF1dG8gJmZpZWxkID0gKippdDsKKyAgICAgIGNvbnN0IGF1dG8gJmZpZWxkID0gKippdDsKICAgICAgIGlmIChmaWVsZC5kZXByZWNhdGVkKSBjb250aW51ZTsKICAgICAgIGlmIChmaWVsZC52YWx1ZS50eXBlLmJhc2VfdHlwZSA9PSBCQVNFX1RZUEVfVVRZUEUpIGNvbnRpbnVlOwogICAgICAgaWYgKGZpZWxkLnZhbHVlLnR5cGUuZWxlbWVudCA9PSBCQVNFX1RZUEVfVVRZUEUpIGNvbnRpbnVlOwotICAgICAgYXV0byBjYW1lbF9uYW1lID0gQ29udmVydENhc2UoZmllbGQubmFtZSwgQ2FzZTo6a0xvd2VyQ2FtZWwpOwotICAgICAgYXV0byBjYW1lbF9uYW1lX3dpdGhfZmlyc3QgPSBDb252ZXJ0Q2FzZShmaWVsZC5uYW1lLCBDYXNlOjprVXBwZXJDYW1lbCk7Ci0gICAgICBhdXRvIHR5cGVfbmFtZSA9Ci0gICAgICAgICAgR2VuVHlwZUdldF9PYmplY3RBUEkoZmllbGQudmFsdWUudHlwZSwgb3B0cywgZmFsc2UsIHRydWUpOworICAgICAgY29uc3QgYXV0byBhY2Nlc3NvciA9IG5hbWVyXy5NZXRob2QoZmllbGQpOworICAgICAgY29uc3QgYXV0byB2YXJpYWJsZSA9ICJfIiArIG5hbWVyXy5WYXJpYWJsZSgibyIsIGZpZWxkKTsKKyAgICAgIGNvbnN0IGF1dG8gZ2V0X2ZpZWxkID0gbmFtZXJfLk1ldGhvZCgiZ2V0IiwgZmllbGQpOworICAgICAgY29uc3QgYXV0byBzZXRfZmllbGQgPSBuYW1lcl8uTWV0aG9kKCJzZXQiLCBmaWVsZCk7CisKKyAgICAgIGF1dG8gdHlwZV9uYW1lID0gR2VuVHlwZUdldF9PYmplY3RBUEkoZmllbGQudmFsdWUudHlwZSwgZmFsc2UsIHRydWUpOwogICAgICAgaWYgKGZpZWxkLklzU2NhbGFyT3B0aW9uYWwoKSkKICAgICAgICAgdHlwZV9uYW1lID0gQ29udmVydFByaW1pdGl2ZVR5cGVUb09iamVjdFdyYXBwZXJfT2JqZWN0QVBJKHR5cGVfbmFtZSk7Ci0gICAgICBhdXRvIHN0YXJ0ID0gIiAgICAiICsgdHlwZV9uYW1lICsgIiBfbyIgKyBjYW1lbF9uYW1lX3dpdGhfZmlyc3QgKyAiID0gIjsKKyAgICAgIGF1dG8gc3RhcnQgPSAiICAgICIgKyB0eXBlX25hbWUgKyAiICIgKyB2YXJpYWJsZSArICIgPSAiOwogICAgICAgYXV0byBjYWxsX3NldHRlciA9IHRydWU7CiAgICAgICBzd2l0Y2ggKGZpZWxkLnZhbHVlLnR5cGUuYmFzZV90eXBlKSB7CiAgICAgICAgIGNhc2UgQkFTRV9UWVBFX1NUUlVDVDogewogICAgICAgICAgIGF1dG8gZml4ZWQgPSBzdHJ1Y3RfZGVmLmZpeGVkICYmIGZpZWxkLnZhbHVlLnR5cGUuc3RydWN0X2RlZi0+Zml4ZWQ7CiAgICAgICAgICAgaWYgKGZpeGVkKSB7Ci0gICAgICAgICAgICBjb2RlICs9ICIgICAgIiArIGNhbWVsX25hbWUgKyAiKCkudW5wYWNrVG8oX28uZ2V0IiArCi0gICAgICAgICAgICAgICAgICAgIGNhbWVsX25hbWVfd2l0aF9maXJzdCArICIoKSk7XG4iOworICAgICAgICAgICAgY29kZSArPQorICAgICAgICAgICAgICAgICIgICAgIiArIGFjY2Vzc29yICsgIigpLnVucGFja1RvKF9vLiIgKyBnZXRfZmllbGQgKyAiKCkpO1xuIjsKICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgY29kZSArPSAiICAgIGlmICgiICsgY2FtZWxfbmFtZSArICIoKSAhPSBudWxsKSAiOworICAgICAgICAgICAgY29kZSArPSAiICAgIGlmICgiICsgYWNjZXNzb3IgKyAiKCkgIT0gbnVsbCkgIjsKICAgICAgICAgICAgIGlmIChmaWVsZC52YWx1ZS50eXBlLnN0cnVjdF9kZWYtPmZpeGVkKSB7Ci0gICAgICAgICAgICAgIGNvZGUgKz0gY2FtZWxfbmFtZSArICIoKS51bnBhY2tUbyhfby5nZXQiICsKLSAgICAgICAgICAgICAgICAgICAgICBjYW1lbF9uYW1lX3dpdGhfZmlyc3QgKyAiKCkpO1xuIjsKKyAgICAgICAgICAgICAgY29kZSArPSBhY2Nlc3NvciArICIoKS51bnBhY2tUbyhfby4iICsgZ2V0X2ZpZWxkICsgIigpKTtcbiI7CiAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICBjb2RlICs9ICJfby4iICsgR2VuU2V0dGVyRnVuY05hbWVfT2JqZWN0QVBJKGZpZWxkLm5hbWUpICsgIigiICsKLSAgICAgICAgICAgICAgICAgICAgICBjYW1lbF9uYW1lICsgIigpLnVucGFjaygpKTtcbiI7CisgICAgICAgICAgICAgIGNvZGUgKz0gIl9vLiIgKyBzZXRfZmllbGQgKyAiKCIgKyBhY2Nlc3NvciArICIoKS51bnBhY2soKSk7XG4iOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgY29kZSArPSAiICAgIGVsc2UgX28uIiArIEdlblNldHRlckZ1bmNOYW1lX09iamVjdEFQSShmaWVsZC5uYW1lKSArCi0gICAgICAgICAgICAgICAgICAgICIobnVsbCk7XG4iOworICAgICAgICAgICAgY29kZSArPSAiICAgIGVsc2UgX28uIiArIHNldF9maWVsZCArICIobnVsbCk7XG4iOwogICAgICAgICAgIH0KICAgICAgICAgICBjYWxsX3NldHRlciA9IGZhbHNlOwogICAgICAgICAgIGJyZWFrOwpAQCAtMTQ3MSwzOCArMTQ4NiwzOCBAQAogICAgICAgICAgIGF1dG8gbGVuZ3RoX3N0ciA9IE51bVRvU3RyaW5nKGZpZWxkLnZhbHVlLnR5cGUuZml4ZWRfbGVuZ3RoKTsKICAgICAgICAgICBhdXRvIHVucGFja19tZXRob2QgPQogICAgICAgICAgICAgICBmaWVsZC52YWx1ZS50eXBlLnN0cnVjdF9kZWYgPT0gbnVsbHB0ciA/ICIiIDogIi51bnBhY2soKSI7Ci0gICAgICAgICAgY29kZSArPQotICAgICAgICAgICAgICBzdGFydCArICJfby4iICsgR2VuR2V0dGVyRnVuY05hbWVfT2JqZWN0QVBJKGZpZWxkLm5hbWUpICsgIigpO1xuIjsKLSAgICAgICAgICBjb2RlICs9ICIgICAgZm9yIChpbnQgX2ogPSAwOyBfaiA8ICIgKyBsZW5ndGhfc3RyICsgIjsgKytfaikgeyBfbyIgKwotICAgICAgICAgICAgICAgICAgY2FtZWxfbmFtZV93aXRoX2ZpcnN0ICsgIltfal0gPSAiICsgY2FtZWxfbmFtZSArICIoX2opIiArCi0gICAgICAgICAgICAgICAgICB1bnBhY2tfbWV0aG9kICsgIjsgfVxuIjsKKyAgICAgICAgICBjb2RlICs9IHN0YXJ0ICsgIl9vLiIgKyBnZXRfZmllbGQgKyAiKCk7XG4iOworICAgICAgICAgIGNvZGUgKz0gIiAgICBmb3IgKGludCBfaiA9IDA7IF9qIDwgIiArIGxlbmd0aF9zdHIgKyAiOyArK19qKSB7ICIgKworICAgICAgICAgICAgICAgICAgdmFyaWFibGUgKyAiW19qXSA9ICIgKyBhY2Nlc3NvciArICIoX2opIiArIHVucGFja19tZXRob2QgKworICAgICAgICAgICAgICAgICAgIjsgfVxuIjsKICAgICAgICAgICBjYWxsX3NldHRlciA9IGZhbHNlOwogICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAgICAgICAgIGNhc2UgQkFTRV9UWVBFX1ZFQ1RPUjoKICAgICAgICAgICBpZiAoZmllbGQudmFsdWUudHlwZS5lbGVtZW50ID09IEJBU0VfVFlQRV9VTklPTikgewogICAgICAgICAgICAgY29kZSArPSBzdGFydCArICJuZXcgIiArCi0gICAgICAgICAgICAgICAgICAgIEdlbkNvbmNyZXRlVHlwZUdldF9PYmplY3RBUEkoZmllbGQudmFsdWUudHlwZSwgb3B0cykKKyAgICAgICAgICAgICAgICAgICAgR2VuQ29uY3JldGVUeXBlR2V0X09iamVjdEFQSShmaWVsZC52YWx1ZS50eXBlKQogICAgICAgICAgICAgICAgICAgICAgICAgLnN1YnN0cigwLCB0eXBlX25hbWUubGVuZ3RoKCkgLSAxKSArCi0gICAgICAgICAgICAgICAgICAgIGNhbWVsX25hbWUgKyAiTGVuZ3RoKCldO1xuIjsKLSAgICAgICAgICAgIGNvZGUgKz0gIiAgICBmb3IgKGludCBfaiA9IDA7IF9qIDwgIiArIGNhbWVsX25hbWUgKwotICAgICAgICAgICAgICAgICAgICAiTGVuZ3RoKCk7ICsrX2opIHtcbiI7Ci0gICAgICAgICAgICBHZW5VbmlvblVuUGFja19PYmplY3RBUEkoKmZpZWxkLnZhbHVlLnR5cGUuZW51bV9kZWYsIGNvZGVfcHRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVfbmFtZSwgY2FtZWxfbmFtZSwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgICAgIGFjY2Vzc29yICsgIkxlbmd0aCgpXTtcbiI7CisgICAgICAgICAgICBjb2RlICs9CisgICAgICAgICAgICAgICAgIiAgICBmb3IgKGludCBfaiA9IDA7IF9qIDwgIiArIGFjY2Vzc29yICsgIkxlbmd0aCgpOyArK19qKSB7XG4iOworICAgICAgICAgICAgR2VuVW5pb25VblBhY2tfT2JqZWN0QVBJKCpmaWVsZC52YWx1ZS50eXBlLmVudW1fZGVmLCBjb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVfbmFtZSwgYWNjZXNzb3IsIHRydWUpOwogICAgICAgICAgICAgY29kZSArPSAiICAgIH1cbiI7CiAgICAgICAgICAgfSBlbHNlIGlmIChmaWVsZC52YWx1ZS50eXBlLmVsZW1lbnQgIT0gQkFTRV9UWVBFX1VUWVBFKSB7CiAgICAgICAgICAgICBhdXRvIGZpeGVkID0gZmllbGQudmFsdWUudHlwZS5zdHJ1Y3RfZGVmID09IG51bGxwdHI7CisgICAgICAgICAgICBjb25zdCBhdXRvIGxlbmd0aF9hY2Nlc3NvciA9IG5hbWVyXy5NZXRob2QoZmllbGQsICJsZW5ndGgiKTsKICAgICAgICAgICAgIGNvZGUgKz0gc3RhcnQgKyAibmV3ICIgKwotICAgICAgICAgICAgICAgICAgICBHZW5Db25jcmV0ZVR5cGVHZXRfT2JqZWN0QVBJKGZpZWxkLnZhbHVlLnR5cGUsIG9wdHMpCisgICAgICAgICAgICAgICAgICAgIEdlbkNvbmNyZXRlVHlwZUdldF9PYmplY3RBUEkoZmllbGQudmFsdWUudHlwZSkKICAgICAgICAgICAgICAgICAgICAgICAgIC5zdWJzdHIoMCwgdHlwZV9uYW1lLmxlbmd0aCgpIC0gMSkgKwotICAgICAgICAgICAgICAgICAgICBjYW1lbF9uYW1lICsgIkxlbmd0aCgpXTtcbiI7CisgICAgICAgICAgICAgICAgICAgIGxlbmd0aF9hY2Nlc3NvciArICIoKV07XG4iOwogICAgICAgICAgICAgY29kZSArPQotICAgICAgICAgICAgICAgICIgICAgZm9yIChpbnQgX2ogPSAwOyBfaiA8ICIgKyBjYW1lbF9uYW1lICsgIkxlbmd0aCgpOyArK19qKSB7IjsKLSAgICAgICAgICAgIGNvZGUgKz0gIl9vIiArIGNhbWVsX25hbWVfd2l0aF9maXJzdCArICJbX2pdID0gIjsKKyAgICAgICAgICAgICAgICAiICAgIGZvciAoaW50IF9qID0gMDsgX2ogPCAiICsgbGVuZ3RoX2FjY2Vzc29yICsgIigpOyArK19qKSB7IjsKKyAgICAgICAgICAgIGNvZGUgKz0gdmFyaWFibGUgKyAiW19qXSA9ICI7CiAgICAgICAgICAgICBpZiAoZml4ZWQpIHsKLSAgICAgICAgICAgICAgY29kZSArPSBjYW1lbF9uYW1lICsgIihfaikiOworICAgICAgICAgICAgICBjb2RlICs9IGFjY2Vzc29yICsgIihfaikiOwogICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgY29kZSArPSAiKCIgKyBjYW1lbF9uYW1lICsgIihfaikgIT0gbnVsbCA/ICIgKyBjYW1lbF9uYW1lICsKKyAgICAgICAgICAgICAgY29kZSArPSAiKCIgKyBhY2Nlc3NvciArICIoX2opICE9IG51bGwgPyAiICsgYWNjZXNzb3IgKwogICAgICAgICAgICAgICAgICAgICAgICIoX2opLnVucGFjaygpIDogbnVsbCkiOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgY29kZSArPSAiO31cbiI7CkBAIC0xNTEwLDIzICsxNTI1LDIyIEBACiAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgQkFTRV9UWVBFX1VUWVBFOiBicmVhazsKICAgICAgICAgY2FzZSBCQVNFX1RZUEVfVU5JT046IHsKLSAgICAgICAgICBHZW5VbmlvblVuUGFja19PYmplY3RBUEkoKmZpZWxkLnZhbHVlLnR5cGUuZW51bV9kZWYsIGNvZGVfcHRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlX25hbWUsIGNhbWVsX25hbWUsIGZhbHNlKTsKKyAgICAgICAgICBHZW5VbmlvblVuUGFja19PYmplY3RBUEkoKmZpZWxkLnZhbHVlLnR5cGUuZW51bV9kZWYsIGNvZGUsIHR5cGVfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWNjZXNzb3IsIGZhbHNlKTsKICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogICAgICAgICBkZWZhdWx0OiB7CiAgICAgICAgICAgaWYgKGZpZWxkLklzU2NhbGFyT3B0aW9uYWwoKSkgewotICAgICAgICAgICAgY29kZSArPSBzdGFydCArICJoYXMiICsgY2FtZWxfbmFtZV93aXRoX2ZpcnN0ICsgIigpID8gIiArCi0gICAgICAgICAgICAgICAgICAgIGNhbWVsX25hbWUgKyAiKCkgOiBudWxsO1xuIjsKKyAgICAgICAgICAgIGNvZGUgKz0gc3RhcnQgKyBuYW1lcl8uTWV0aG9kKCJoYXMiLCBmaWVsZCkgKyAiKCkgPyAiICsgYWNjZXNzb3IgKworICAgICAgICAgICAgICAgICAgICAiKCkgOiBudWxsO1xuIjsKICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgY29kZSArPSBzdGFydCArIGNhbWVsX25hbWUgKyAiKCk7XG4iOworICAgICAgICAgICAgY29kZSArPSBzdGFydCArIGFjY2Vzc29yICsgIigpO1xuIjsKICAgICAgICAgICB9CiAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KICAgICAgIH0KICAgICAgIGlmIChjYWxsX3NldHRlcikgewotICAgICAgICBjb2RlICs9ICIgICAgX28uIiArIEdlblNldHRlckZ1bmNOYW1lX09iamVjdEFQSShmaWVsZC5uYW1lKSArICIoX28iICsKLSAgICAgICAgICAgICAgICBjYW1lbF9uYW1lX3dpdGhfZmlyc3QgKyAiKTtcbiI7CisgICAgICAgIGNvZGUgKz0gIiAgICBfby4iICsgc2V0X2ZpZWxkICsgIigiICsgdmFyaWFibGUgKyAiKTtcbiI7CiAgICAgICB9CiAgICAgfQogICAgIGNvZGUgKz0gIiAgfVxuIjsKQEAgLTE1MzgsMTcgKzE1NTIsMTcgQEAKICAgICAgICAgIGl0ICE9IHN0cnVjdF9kZWYuZmllbGRzLnZlYy5lbmQoKTsgKytpdCkgewogICAgICAgYXV0byAmZmllbGQgPSAqKml0OwogICAgICAgaWYgKGZpZWxkLmRlcHJlY2F0ZWQpIGNvbnRpbnVlOwotICAgICAgYXV0byBjYW1lbF9uYW1lID0gQ29udmVydENhc2UoZmllbGQubmFtZSwgQ2FzZTo6a0xvd2VyQ2FtZWwpOwotICAgICAgYXV0byBjYW1lbF9uYW1lX3dpdGhfZmlyc3QgPSBDb252ZXJ0Q2FzZShmaWVsZC5uYW1lLCBDYXNlOjprVXBwZXJDYW1lbCk7CisgICAgICBjb25zdCBhdXRvIGZpZWxkX25hbWUgPSBuYW1lcl8uRmllbGQoZmllbGQpOworICAgICAgY29uc3QgYXV0byB2YXJpYWJsZSA9ICJfIiArIG5hbWVyXy5WYXJpYWJsZSgibyIsIGZpZWxkKTsKKyAgICAgIGNvbnN0IGF1dG8gZ2V0X2ZpZWxkID0gbmFtZXJfLk1ldGhvZCgiZ2V0IiwgZmllbGQpOwogICAgICAgLy8gcHJlCiAgICAgICBzd2l0Y2ggKGZpZWxkLnZhbHVlLnR5cGUuYmFzZV90eXBlKSB7CiAgICAgICAgIGNhc2UgQkFTRV9UWVBFX1NUUlVDVDogewogICAgICAgICAgIGlmICghZmllbGQudmFsdWUudHlwZS5zdHJ1Y3RfZGVmLT5maXhlZCkgewotICAgICAgICAgICAgY29kZSArPSAiICAgICIgKyBHZW5PZmZzZXRUeXBlKCkgKyAiIF8iICsgZmllbGQubmFtZSArICIgPSBfby4iICsKLSAgICAgICAgICAgICAgICAgICAgR2VuR2V0dGVyRnVuY05hbWVfT2JqZWN0QVBJKGZpZWxkLm5hbWUpICsKKyAgICAgICAgICAgIGNvZGUgKz0gIiAgICAiICsgR2VuT2Zmc2V0VHlwZSgpICsgIiBfIiArIG5hbWVyXy5WYXJpYWJsZShmaWVsZCkgKworICAgICAgICAgICAgICAgICAgICAiID0gX28uIiArIGdldF9maWVsZCArCiAgICAgICAgICAgICAgICAgICAgICIoKSA9PSBudWxsID8gMCA6ICIgKyBHZW5UeXBlR2V0KGZpZWxkLnZhbHVlLnR5cGUpICsKLSAgICAgICAgICAgICAgICAgICAgIi5wYWNrKGJ1aWxkZXIsIF9vLiIgKwotICAgICAgICAgICAgICAgICAgICBHZW5HZXR0ZXJGdW5jTmFtZV9PYmplY3RBUEkoZmllbGQubmFtZSkgKyAiKCkpO1xuIjsKKyAgICAgICAgICAgICAgICAgICAgIi5wYWNrKGJ1aWxkZXIsIF9vLiIgKyBnZXRfZmllbGQgKyAiKCkpO1xuIjsKICAgICAgICAgICB9IGVsc2UgaWYgKHN0cnVjdF9kZWYuZml4ZWQgJiYgc3RydWN0X2hhc19jcmVhdGUpIHsKICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPEZpZWxkQXJyYXlMZW5ndGg+IGFycmF5X2xlbmd0aHM7CiAgICAgICAgICAgICBGaWVsZEFycmF5TGVuZ3RoIHRtcF9hcnJheV9sZW5ndGggPSB7CkBAIC0xNTU2LDYwICsxNTcwLDU0IEBACiAgICAgICAgICAgICAgIGZpZWxkLnZhbHVlLnR5cGUuZml4ZWRfbGVuZ3RoLAogICAgICAgICAgICAgfTsKICAgICAgICAgICAgIGFycmF5X2xlbmd0aHMucHVzaF9iYWNrKHRtcF9hcnJheV9sZW5ndGgpOwotICAgICAgICAgICAgR2VuU3RydWN0UGFja0RlY2xfT2JqZWN0QVBJKCpmaWVsZC52YWx1ZS50eXBlLnN0cnVjdF9kZWYsIGNvZGVfcHRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFycmF5X2xlbmd0aHMpOworICAgICAgICAgICAgR2VuU3RydWN0UGFja0RlY2xfT2JqZWN0QVBJKCpmaWVsZC52YWx1ZS50eXBlLnN0cnVjdF9kZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJyYXlfbGVuZ3RocywgY29kZSk7CiAgICAgICAgICAgfQogICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAgICAgICAgIGNhc2UgQkFTRV9UWVBFX1NUUklORzogewotICAgICAgICAgIHN0ZDo6c3RyaW5nIGNyZWF0ZV9zdHJpbmcgPSAiY3JlYXRlU3RyaW5nIjsKLSAgICAgICAgICBjb2RlICs9ICIgICAgaW50IF8iICsgY2FtZWxfbmFtZSArICIgPSBfby4iICsKLSAgICAgICAgICAgICAgICAgIEdlbkdldHRlckZ1bmNOYW1lX09iamVjdEFQSShmaWVsZC5uYW1lKSArCisgICAgICAgICAgY29kZSArPSAiICAgIGludCBfIiArIGZpZWxkX25hbWUgKyAiID0gX28uIiArIGdldF9maWVsZCArCiAgICAgICAgICAgICAgICAgICAiKCkgPT0gbnVsbCA/IDAgOiAiCi0gICAgICAgICAgICAgICAgICAiYnVpbGRlci4iICsKLSAgICAgICAgICAgICAgICAgIGNyZWF0ZV9zdHJpbmcgKyAiKF9vLiIgKwotICAgICAgICAgICAgICAgICAgR2VuR2V0dGVyRnVuY05hbWVfT2JqZWN0QVBJKGZpZWxkLm5hbWUpICsgIigpKTtcbiI7CisgICAgICAgICAgICAgICAgICAiYnVpbGRlci5jcmVhdGVTdHJpbmcoX28uIiArCisgICAgICAgICAgICAgICAgICBnZXRfZmllbGQgKyAiKCkpO1xuIjsKICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogICAgICAgICBjYXNlIEJBU0VfVFlQRV9WRUNUT1I6IHsKICAgICAgICAgICBpZiAoZmllbGRfaGFzX2NyZWF0ZS5maW5kKCZmaWVsZCkgIT0gZmllbGRfaGFzX2NyZWF0ZS5lbmQoKSkgewotICAgICAgICAgICAgYXV0byBwcm9wZXJ0eV9uYW1lID0gY2FtZWxfbmFtZTsKKyAgICAgICAgICAgIGF1dG8gcHJvcGVydHlfbmFtZSA9IGZpZWxkX25hbWU7CiAgICAgICAgICAgICBhdXRvIGdlbl9mb3JfbG9vcCA9IHRydWU7Ci0gICAgICAgICAgICBzdGQ6OnN0cmluZyBhcnJheV9uYW1lID0gIl9fIiArIGNhbWVsX25hbWU7CisgICAgICAgICAgICBzdGQ6OnN0cmluZyBhcnJheV9uYW1lID0gIl9fIiArIGZpZWxkX25hbWU7CiAgICAgICAgICAgICBzdGQ6OnN0cmluZyBhcnJheV90eXBlID0gIiI7CiAgICAgICAgICAgICBzdGQ6OnN0cmluZyBlbGVtZW50X3R5cGUgPSAiIjsKICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHRvX2FycmF5ID0gIiI7CiAgICAgICAgICAgICBzd2l0Y2ggKGZpZWxkLnZhbHVlLnR5cGUuZWxlbWVudCkgewogICAgICAgICAgICAgICBjYXNlIEJBU0VfVFlQRV9TVFJJTkc6IHsKLSAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBjcmVhdGVfc3RyaW5nID0gImNyZWF0ZVN0cmluZyI7CiAgICAgICAgICAgICAgICAgYXJyYXlfdHlwZSA9ICJpbnQiOwogICAgICAgICAgICAgICAgIGVsZW1lbnRfdHlwZSA9ICJTdHJpbmciOwotICAgICAgICAgICAgICAgIHRvX2FycmF5ICs9ICJidWlsZGVyLiIgKyBjcmVhdGVfc3RyaW5nICsgIihfZSkiOworICAgICAgICAgICAgICAgIHRvX2FycmF5ID0gImJ1aWxkZXIuY3JlYXRlU3RyaW5nKF9lKSI7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgY2FzZSBCQVNFX1RZUEVfU1RSVUNUOgogICAgICAgICAgICAgICAgIGFycmF5X3R5cGUgPSAiaW50IjsKICAgICAgICAgICAgICAgICBlbGVtZW50X3R5cGUgPQotICAgICAgICAgICAgICAgICAgICBHZW5UeXBlR2V0X09iamVjdEFQSShmaWVsZC52YWx1ZS50eXBlLCBvcHRzLCB0cnVlLCB0cnVlKTsKKyAgICAgICAgICAgICAgICAgICAgR2VuVHlwZUdldF9PYmplY3RBUEkoZmllbGQudmFsdWUudHlwZSwgdHJ1ZSwgdHJ1ZSk7CiAgICAgICAgICAgICAgICAgOwogICAgICAgICAgICAgICAgIHRvX2FycmF5ID0gR2VuVHlwZUdldChmaWVsZC52YWx1ZS50eXBlKSArICIucGFjayhidWlsZGVyLCBfZSkiOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICBjYXNlIEJBU0VfVFlQRV9VVFlQRToKLSAgICAgICAgICAgICAgICBwcm9wZXJ0eV9uYW1lID0gY2FtZWxfbmFtZS5zdWJzdHIoMCwgY2FtZWxfbmFtZS5zaXplKCkgLSA0KTsKKyAgICAgICAgICAgICAgICBwcm9wZXJ0eV9uYW1lID0gZmllbGRfbmFtZS5zdWJzdHIoMCwgZmllbGRfbmFtZS5zaXplKCkgLSA0KTsKICAgICAgICAgICAgICAgICBhcnJheV90eXBlID0gR2VuVHlwZUJhc2ljKERlc3RpbmF0aW9uVHlwZSgKICAgICAgICAgICAgICAgICAgICAgZmllbGQudmFsdWUudHlwZS5lbnVtX2RlZi0+dW5kZXJseWluZ190eXBlLCBmYWxzZSkpOwogICAgICAgICAgICAgICAgIGVsZW1lbnRfdHlwZSA9IGZpZWxkLnZhbHVlLnR5cGUuZW51bV9kZWYtPm5hbWUgKyAiVW5pb24iOwotICAgICAgICAgICAgICAgIHRvX2FycmF5ID0gIl9vLiIgKyBHZW5HZXR0ZXJGdW5jTmFtZV9PYmplY3RBUEkocHJvcGVydHlfbmFtZSkgKworICAgICAgICAgICAgICAgIHRvX2FycmF5ID0gIl9vLiIgKyBuYW1lcl8uTWV0aG9kKCJnZXQiLCBwcm9wZXJ0eV9uYW1lKSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKClbX2pdLmdldFR5cGUoKSI7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgIGNhc2UgQkFTRV9UWVBFX1VOSU9OOgogICAgICAgICAgICAgICAgIGFycmF5X3R5cGUgPSAiaW50IjsKICAgICAgICAgICAgICAgICBlbGVtZW50X3R5cGUgPQotICAgICAgICAgICAgICAgICAgICBXcmFwSW5OYW1lU3BhY2UoKmZpZWxkLnZhbHVlLnR5cGUuZW51bV9kZWYpICsgIlVuaW9uIjsKLSAgICAgICAgICAgICAgICB0b19hcnJheSA9IFdyYXBJbk5hbWVTcGFjZSgqZmllbGQudmFsdWUudHlwZS5lbnVtX2RlZikgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIlVuaW9uLnBhY2soYnVpbGRlciwgIF9vLiIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgR2VuR2V0dGVyRnVuY05hbWVfT2JqZWN0QVBJKHByb3BlcnR5X25hbWUpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICIoKVtfal0pIjsKKyAgICAgICAgICAgICAgICAgICAgbmFtZXJfLk5hbWVzcGFjZWRUeXBlKCpmaWVsZC52YWx1ZS50eXBlLmVudW1fZGVmKSArICJVbmlvbiI7CisgICAgICAgICAgICAgICAgdG9fYXJyYXkgPSBlbGVtZW50X3R5cGUgKyAiLnBhY2soYnVpbGRlciwgIF9vLiIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZXJfLk1ldGhvZCgiZ2V0IiwgcHJvcGVydHlfbmFtZSkgKyAiKClbX2pdKSI7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgIGNhc2UgQkFTRV9UWVBFX1VDSEFSOiAgLy8gVE9ETyB0aGlzIGJyYW5jaCBvZiB0aGUgc3dpdGNoIGlzIGR1ZSB0bwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGluY29uc2lzdGVudCBiZWhhdmlvciBpbiB1bnNpZ25lZCBieXRlLgpAQCAtMTYyMCw1MiArMTYyOCw1MSBAQAogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgIGdlbl9mb3JfbG9vcCA9IGZhbHNlOwotICAgICAgICAgICAgICAgIGFycmF5X25hbWUgPQotICAgICAgICAgICAgICAgICAgICAiX28uIiArIEdlbkdldHRlckZ1bmNOYW1lX09iamVjdEFQSShwcm9wZXJ0eV9uYW1lKSArICIoKSI7CisgICAgICAgICAgICAgICAgYXJyYXlfbmFtZSA9ICJfby4iICsgbmFtZXJfLk1ldGhvZCgiZ2V0IiwgcHJvcGVydHlfbmFtZSkgKyAiKCkiOwogICAgICAgICAgICAgICAgIGFycmF5X3R5cGUgPSBHZW5UeXBlTmFtZURlc3QoZmllbGQudmFsdWUudHlwZSk7CiAgICAgICAgICAgICAgICAgZWxlbWVudF90eXBlID0gYXJyYXlfdHlwZTsKICAgICAgICAgICAgICAgICB0b19hcnJheSA9ICJfZSI7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBjb2RlICs9ICIgICAgaW50IF8iICsgY2FtZWxfbmFtZSArICIgPSAwO1xuIjsKLSAgICAgICAgICAgIGNvZGUgKz0gIiAgICBpZiAoX28uIiArIEdlbkdldHRlckZ1bmNOYW1lX09iamVjdEFQSShwcm9wZXJ0eV9uYW1lKSArCisgICAgICAgICAgICBjb2RlICs9ICIgICAgaW50IF8iICsgZmllbGRfbmFtZSArICIgPSAwO1xuIjsKKyAgICAgICAgICAgIGNvZGUgKz0gIiAgICBpZiAoX28uIiArIG5hbWVyXy5NZXRob2QoImdldCIsIHByb3BlcnR5X25hbWUpICsKICAgICAgICAgICAgICAgICAgICAgIigpICE9IG51bGwpIHtcbiI7CiAgICAgICAgICAgICBpZiAoZ2VuX2Zvcl9sb29wKSB7CiAgICAgICAgICAgICAgIGNvZGUgKz0gIiAgICAgICIgKyBhcnJheV90eXBlICsgIltdICIgKyBhcnJheV9uYW1lICsgIiA9IG5ldyAiICsKICAgICAgICAgICAgICAgICAgICAgICBhcnJheV90eXBlICsgIltfby4iICsKLSAgICAgICAgICAgICAgICAgICAgICBHZW5HZXR0ZXJGdW5jTmFtZV9PYmplY3RBUEkocHJvcGVydHlfbmFtZSkgKwotICAgICAgICAgICAgICAgICAgICAgICIoKS5sZW5ndGhdO1xuIjsKKyAgICAgICAgICAgICAgICAgICAgICBuYW1lcl8uTWV0aG9kKCJnZXQiLCBwcm9wZXJ0eV9uYW1lKSArICIoKS5sZW5ndGhdO1xuIjsKICAgICAgICAgICAgICAgY29kZSArPSAiICAgICAgaW50IF9qID0gMDtcbiI7CiAgICAgICAgICAgICAgIGNvZGUgKz0gIiAgICAgIGZvciAoIiArIGVsZW1lbnRfdHlwZSArICIgX2UgOiBfby4iICsKLSAgICAgICAgICAgICAgICAgICAgICBHZW5HZXR0ZXJGdW5jTmFtZV9PYmplY3RBUEkocHJvcGVydHlfbmFtZSkgKyAiKCkpIHsgIjsKKyAgICAgICAgICAgICAgICAgICAgICBuYW1lcl8uTWV0aG9kKCJnZXQiLCBwcm9wZXJ0eV9uYW1lKSArICIoKSkgeyAiOwogICAgICAgICAgICAgICBjb2RlICs9IGFycmF5X25hbWUgKyAiW19qXSA9ICIgKyB0b19hcnJheSArICI7IF9qKys7fVxuIjsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNvZGUgKz0gIiAgICAgIF8iICsgY2FtZWxfbmFtZSArICIgPSBjcmVhdGUiICsKLSAgICAgICAgICAgICAgICAgICAgY2FtZWxfbmFtZV93aXRoX2ZpcnN0ICsgIlZlY3RvcihidWlsZGVyLCAiICsgYXJyYXlfbmFtZSArCi0gICAgICAgICAgICAgICAgICAgICIpO1xuIjsKKyAgICAgICAgICAgIGNvZGUgKz0gIiAgICAgIF8iICsgZmllbGRfbmFtZSArICIgPSAiICsKKyAgICAgICAgICAgICAgICAgICAgbmFtZXJfLk1ldGhvZCgiY3JlYXRlIiwgZmllbGQpICsgIlZlY3RvcihidWlsZGVyLCAiICsKKyAgICAgICAgICAgICAgICAgICAgYXJyYXlfbmFtZSArICIpO1xuIjsKICAgICAgICAgICAgIGNvZGUgKz0gIiAgICB9XG4iOwogICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBhdXRvIHR5cGVfbmFtZSA9IEdlblR5cGVHZXQoZmllbGQudmFsdWUudHlwZSk7CiAgICAgICAgICAgICBhdXRvIGVsZW1lbnRfdHlwZV9uYW1lID0KLSAgICAgICAgICAgICAgICBHZW5UeXBlR2V0X09iamVjdEFQSShmaWVsZC52YWx1ZS50eXBlLCBvcHRzLCB0cnVlLCB0cnVlKTsKKyAgICAgICAgICAgICAgICBHZW5UeXBlR2V0X09iamVjdEFQSShmaWVsZC52YWx1ZS50eXBlLCB0cnVlLCB0cnVlKTsKICAgICAgICAgICAgIGF1dG8gcGFja19tZXRob2QgPQogICAgICAgICAgICAgICAgIGZpZWxkLnZhbHVlLnR5cGUuc3RydWN0X2RlZiA9PSBudWxscHRyCiAgICAgICAgICAgICAgICAgICAgID8gImJ1aWxkZXIuYWRkIiArIEdlbk1ldGhvZChmaWVsZC52YWx1ZS50eXBlLlZlY3RvclR5cGUoKSkgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAiKF9vIiArIGNhbWVsX25hbWVfd2l0aF9maXJzdCArICJbX2pdKTsiCi0gICAgICAgICAgICAgICAgICAgIDogdHlwZV9uYW1lICsgIi5wYWNrKGJ1aWxkZXIsIF9vIiArIGNhbWVsX25hbWVfd2l0aF9maXJzdCArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICJbX2pdKTsiOwotICAgICAgICAgICAgY29kZSArPSAiICAgIGludCBfIiArIGNhbWVsX25hbWUgKyAiID0gMDtcbiI7Ci0gICAgICAgICAgICBjb2RlICs9ICIgICAgIiArIGVsZW1lbnRfdHlwZV9uYW1lICsgIltdIF9vIiArCi0gICAgICAgICAgICAgICAgICAgIGNhbWVsX25hbWVfd2l0aF9maXJzdCArICIgPSBfby4iICsKLSAgICAgICAgICAgICAgICAgICAgR2VuR2V0dGVyRnVuY05hbWVfT2JqZWN0QVBJKGZpZWxkLm5hbWUpICsgIigpO1xuIjsKLSAgICAgICAgICAgIGNvZGUgKz0gIiAgICBpZiAoX28iICsgY2FtZWxfbmFtZV93aXRoX2ZpcnN0ICsgIiAhPSBudWxsKSB7XG4iOwotICAgICAgICAgICAgY29kZSArPSAiICAgICAgc3RhcnQiICsgY2FtZWxfbmFtZV93aXRoX2ZpcnN0ICsKLSAgICAgICAgICAgICAgICAgICAgIlZlY3RvcihidWlsZGVyLCBfbyIgKyBjYW1lbF9uYW1lX3dpdGhfZmlyc3QgKwotICAgICAgICAgICAgICAgICAgICAiLmxlbmd0aCk7XG4iOwotICAgICAgICAgICAgY29kZSArPSAiICAgICAgZm9yIChpbnQgX2ogPSBfbyIgKyBjYW1lbF9uYW1lX3dpdGhfZmlyc3QgKworICAgICAgICAgICAgICAgICAgICAgICAgICAiKCIgKyB2YXJpYWJsZSArICJbX2pdKTsiCisgICAgICAgICAgICAgICAgICAgIDogIl91bnVzZWRfb2Zmc2V0ID0gIiArIHR5cGVfbmFtZSArICIucGFjayhidWlsZGVyLCAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyaWFibGUgKyAiW19qXSk7IjsKKyAgICAgICAgICAgIGNvZGUgKz0gIiAgICBpbnQgXyIgKyBmaWVsZF9uYW1lICsgIiA9IDA7XG4iOworICAgICAgICAgICAgY29kZSArPSAiICAgICIgKyBlbGVtZW50X3R5cGVfbmFtZSArICJbXSAiICsgdmFyaWFibGUgKyAiID0gX28uIiArCisgICAgICAgICAgICAgICAgICAgIGdldF9maWVsZCArICIoKTtcbiI7CisgICAgICAgICAgICBjb2RlICs9ICIgICAgaWYgKCIgKyB2YXJpYWJsZSArICIgIT0gbnVsbCkge1xuIjsKKyAgICAgICAgICAgIGlmIChmaWVsZC52YWx1ZS50eXBlLnN0cnVjdF9kZWYgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgICBjb2RlICs9ICIgICAgICBpbnQgX3VudXNlZF9vZmZzZXQgPSAwO1xuIjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNvZGUgKz0gIiAgICAgICIgKyBuYW1lcl8uTWV0aG9kKCJzdGFydCIsIGZpZWxkKSArCisgICAgICAgICAgICAgICAgICAgICJWZWN0b3IoYnVpbGRlciwgIiArIHZhcmlhYmxlICsgIi5sZW5ndGgpO1xuIjsKKyAgICAgICAgICAgIGNvZGUgKz0gIiAgICAgIGZvciAoaW50IF9qID0gIiArIHZhcmlhYmxlICsKICAgICAgICAgICAgICAgICAgICAgIi5sZW5ndGggLSAxOyBfaiA+PTA7IF9qLS0pIHsgIjsKICAgICAgICAgICAgIGNvZGUgKz0gcGFja19tZXRob2QgKyAifVxuIjsKLSAgICAgICAgICAgIGNvZGUgKz0gIiAgICAgIF8iICsgY2FtZWxfbmFtZSArICIgPSBidWlsZGVyLmVuZFZlY3RvcigpO1xuIjsKKyAgICAgICAgICAgIGNvZGUgKz0gIiAgICAgIF8iICsgZmllbGRfbmFtZSArICIgPSBidWlsZGVyLmVuZFZlY3RvcigpO1xuIjsKICAgICAgICAgICAgIGNvZGUgKz0gIiAgICB9XG4iOwogICAgICAgICAgIH0KICAgICAgICAgICBicmVhazsKQEAgLTE2NzgsMjkgKzE2ODUsMjcgQEAKICAgICAgICAgICAgICAgZmllbGQudmFsdWUudHlwZS5maXhlZF9sZW5ndGgsCiAgICAgICAgICAgICB9OwogICAgICAgICAgICAgYXJyYXlfbGVuZ3Rocy5wdXNoX2JhY2sodG1wX2FycmF5X2xlbmd0aCk7Ci0gICAgICAgICAgICBHZW5TdHJ1Y3RQYWNrRGVjbF9PYmplY3RBUEkoKmZpZWxkLnZhbHVlLnR5cGUuc3RydWN0X2RlZiwgY29kZV9wdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJyYXlfbGVuZ3Rocyk7CisgICAgICAgICAgICBHZW5TdHJ1Y3RQYWNrRGVjbF9PYmplY3RBUEkoKmZpZWxkLnZhbHVlLnR5cGUuc3RydWN0X2RlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcnJheV9sZW5ndGhzLCBjb2RlKTsKICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgY29kZSArPSAiICAgICIgKwotICAgICAgICAgICAgICAgICAgICBHZW5UeXBlR2V0X09iamVjdEFQSShmaWVsZC52YWx1ZS50eXBlLCBvcHRzLCBmYWxzZSwgdHJ1ZSkgKwotICAgICAgICAgICAgICAgICAgICAiIF8iICsgY2FtZWxfbmFtZSArICIgPSBfby4iICsKLSAgICAgICAgICAgICAgICAgICAgR2VuR2V0dGVyRnVuY05hbWVfT2JqZWN0QVBJKGZpZWxkLm5hbWUpICsgIigpO1xuIjsKKyAgICAgICAgICAgICAgICAgICAgR2VuVHlwZUdldF9PYmplY3RBUEkoZmllbGQudmFsdWUudHlwZSwgZmFsc2UsIHRydWUpICsgIiBfIiArCisgICAgICAgICAgICAgICAgICAgIGZpZWxkX25hbWUgKyAiID0gX28uIiArIGdldF9maWVsZCArICIoKTtcbiI7CiAgICAgICAgICAgfQogICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAgICAgICAgIGNhc2UgQkFTRV9UWVBFX1VOSU9OOiB7Ci0gICAgICAgICAgY29kZSArPQotICAgICAgICAgICAgICAiICAgICIgKwotICAgICAgICAgICAgICBHZW5UeXBlQmFzaWMoRGVzdGluYXRpb25UeXBlKAotICAgICAgICAgICAgICAgICAgZmllbGQudmFsdWUudHlwZS5lbnVtX2RlZi0+dW5kZXJseWluZ190eXBlLCBmYWxzZSkpICsKLSAgICAgICAgICAgICAgIiBfIiArIGNhbWVsX25hbWUgKyAiVHlwZSA9IF9vLmdldCIgKyBjYW1lbF9uYW1lX3dpdGhfZmlyc3QgKwotICAgICAgICAgICAgICAiKCkgPT0gbnVsbCA/ICIgKyBXcmFwSW5OYW1lU3BhY2UoKmZpZWxkLnZhbHVlLnR5cGUuZW51bV9kZWYpICsKLSAgICAgICAgICAgICAgIi5OT05FIDogIiArICJfby5nZXQiICsgY2FtZWxfbmFtZV93aXRoX2ZpcnN0ICsgIigpLmdldFR5cGUoKTtcbiI7Ci0gICAgICAgICAgY29kZSArPSAiICAgICIgKyBHZW5PZmZzZXRUeXBlKCkgKyAiIF8iICsgY2FtZWxfbmFtZSArICIgPSBfby5nZXQiICsKLSAgICAgICAgICAgICAgICAgIGNhbWVsX25hbWVfd2l0aF9maXJzdCArICIoKSA9PSBudWxsID8gMCA6ICIgKwotICAgICAgICAgICAgICAgICAgV3JhcEluTmFtZVNwYWNlKCpmaWVsZC52YWx1ZS50eXBlLmVudW1fZGVmKSArCi0gICAgICAgICAgICAgICAgICAiVW5pb24ucGFjayhidWlsZGVyLCBfby5nZXQiICsgY2FtZWxfbmFtZV93aXRoX2ZpcnN0ICsKLSAgICAgICAgICAgICAgICAgICIoKSk7XG4iOworICAgICAgICAgIGNvZGUgKz0gIiAgICAiICsKKyAgICAgICAgICAgICAgICAgIEdlblR5cGVCYXNpYyhEZXN0aW5hdGlvblR5cGUoCisgICAgICAgICAgICAgICAgICAgICAgZmllbGQudmFsdWUudHlwZS5lbnVtX2RlZi0+dW5kZXJseWluZ190eXBlLCBmYWxzZSkpICsKKyAgICAgICAgICAgICAgICAgICIgXyIgKyBmaWVsZF9uYW1lICsgIlR5cGUgPSBfby4iICsgZ2V0X2ZpZWxkICsKKyAgICAgICAgICAgICAgICAgICIoKSA9PSBudWxsID8gIiArCisgICAgICAgICAgICAgICAgICBuYW1lcl8uTmFtZXNwYWNlZFR5cGUoKmZpZWxkLnZhbHVlLnR5cGUuZW51bV9kZWYpICsKKyAgICAgICAgICAgICAgICAgICIuTk9ORSA6ICIgKyAiX28uIiArIGdldF9maWVsZCArICIoKS5nZXRUeXBlKCk7XG4iOworICAgICAgICAgIGNvZGUgKz0gIiAgICAiICsgR2VuT2Zmc2V0VHlwZSgpICsgIiBfIiArIGZpZWxkX25hbWUgKyAiID0gX28uIiArCisgICAgICAgICAgICAgICAgICBnZXRfZmllbGQgKyAiKCkgPT0gbnVsbCA/IDAgOiAiICsKKyAgICAgICAgICAgICAgICAgIG5hbWVyXy5OYW1lc3BhY2VkVHlwZSgqZmllbGQudmFsdWUudHlwZS5lbnVtX2RlZikgKworICAgICAgICAgICAgICAgICAgIlVuaW9uLnBhY2soYnVpbGRlciwgX28uIiArIGdldF9maWVsZCArICIoKSk7XG4iOwogICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAgICAgICAgIGRlZmF1bHQ6IGJyZWFrOwpAQCAtMTcwOCw0MiArMTcxMyw0MiBAQAogICAgIH0KICAgICBpZiAoc3RydWN0X2hhc19jcmVhdGUpIHsKICAgICAgIC8vIENyZWF0ZQotICAgICAgY29kZSArPSAiICAgIHJldHVybiBjcmVhdGUiICsgc3RydWN0X2RlZi5uYW1lICsgIihcbiI7CisgICAgICBjb2RlICs9ICIgICAgcmV0dXJuICIgKworICAgICAgICAgICAgICBuYW1lcl8uTGVnYWN5SmF2YU1ldGhvZDIoImNyZWF0ZSIsIHN0cnVjdF9kZWYsICIiKSArICIoXG4iOwogICAgICAgY29kZSArPSAiICAgICAgYnVpbGRlciI7CiAgICAgICBmb3IgKGF1dG8gaXQgPSBzdHJ1Y3RfZGVmLmZpZWxkcy52ZWMuYmVnaW4oKTsKICAgICAgICAgICAgaXQgIT0gc3RydWN0X2RlZi5maWVsZHMudmVjLmVuZCgpOyArK2l0KSB7CiAgICAgICAgIGF1dG8gJmZpZWxkID0gKippdDsKICAgICAgICAgaWYgKGZpZWxkLmRlcHJlY2F0ZWQpIGNvbnRpbnVlOwotICAgICAgICBhdXRvIGNhbWVsX25hbWUgPSBDb252ZXJ0Q2FzZShmaWVsZC5uYW1lLCBDYXNlOjprTG93ZXJDYW1lbCk7CisgICAgICAgIGNvbnN0IGF1dG8gZmllbGRfbmFtZSA9IG5hbWVyXy5GaWVsZChmaWVsZCk7CisgICAgICAgIGNvbnN0IGF1dG8gZ2V0X2ZpZWxkID0gbmFtZXJfLk1ldGhvZCgiZ2V0IiwgZmllbGQpOwogICAgICAgICBzd2l0Y2ggKGZpZWxkLnZhbHVlLnR5cGUuYmFzZV90eXBlKSB7CiAgICAgICAgICAgY2FzZSBCQVNFX1RZUEVfU1RSVUNUOiB7CiAgICAgICAgICAgICBpZiAoc3RydWN0X2RlZi5maXhlZCkgewotICAgICAgICAgICAgICBHZW5TdHJ1Y3RQYWNrQ2FsbF9PYmplY3RBUEkoKmZpZWxkLnZhbHVlLnR5cGUuc3RydWN0X2RlZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVfcHRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgICAgIF8iICsgY2FtZWxfbmFtZSArICJfIik7CisgICAgICAgICAgICAgIEdlblN0cnVjdFBhY2tDYWxsX09iamVjdEFQSSgqZmllbGQudmFsdWUudHlwZS5zdHJ1Y3RfZGVmLCBjb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgICAgIF8iICsgZmllbGRfbmFtZSArICJfIik7CiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICBjb2RlICs9ICIsXG4iOwogICAgICAgICAgICAgICBpZiAoZmllbGQudmFsdWUudHlwZS5zdHJ1Y3RfZGVmLT5maXhlZCkgewogICAgICAgICAgICAgICAgIGlmIChvcHRzLmdlbmVyYXRlX29iamVjdF9iYXNlZF9hcGkpCi0gICAgICAgICAgICAgICAgICBjb2RlICs9ICIgICAgICBfby4iICsgY2FtZWxfbmFtZTsKKyAgICAgICAgICAgICAgICAgIGNvZGUgKz0gIiAgICAgIF9vLiIgKyBmaWVsZF9uYW1lOwogICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgIC8vIFNlZW1zIGxpa2UgdW5yZWFjaGFibGUgY29kZQogICAgICAgICAgICAgICAgICAgY29kZSArPSAiICAgICAgIiArIEdlblR5cGVHZXQoZmllbGQudmFsdWUudHlwZSkgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAiLlBhY2soYnVpbGRlciwgX28uIiArIGNhbWVsX25hbWUgKyAiKSI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICIuUGFjayhidWlsZGVyLCBfby4iICsgZmllbGRfbmFtZSArICIpIjsKICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBjb2RlICs9ICIgICAgICBfIiArIGZpZWxkLm5hbWU7CisgICAgICAgICAgICAgICAgY29kZSArPSAiICAgICAgXyIgKyBmaWVsZF9uYW1lOwogICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICB9CiAgICAgICAgICAgY2FzZSBCQVNFX1RZUEVfQVJSQVk6IHsKICAgICAgICAgICAgIGlmIChmaWVsZC52YWx1ZS50eXBlLnN0cnVjdF9kZWYgIT0gbnVsbHB0cikgewotICAgICAgICAgICAgICBHZW5TdHJ1Y3RQYWNrQ2FsbF9PYmplY3RBUEkoKmZpZWxkLnZhbHVlLnR5cGUuc3RydWN0X2RlZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVfcHRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgICAgIF8iICsgY2FtZWxfbmFtZSArICJfIik7CisgICAgICAgICAgICAgIEdlblN0cnVjdFBhY2tDYWxsX09iamVjdEFQSSgqZmllbGQudmFsdWUudHlwZS5zdHJ1Y3RfZGVmLCBjb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgICAgIF8iICsgZmllbGRfbmFtZSArICJfIik7CiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICBjb2RlICs9ICIsXG4iOwotICAgICAgICAgICAgICBjb2RlICs9ICIgICAgICBfIiArIGNhbWVsX25hbWU7CisgICAgICAgICAgICAgIGNvZGUgKz0gIiAgICAgIF8iICsgZmllbGRfbmFtZTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgIH0KQEAgLTE3NTIsODIgKzE3NTcsNzggQEAKICAgICAgICAgICBjYXNlIEJBU0VfVFlQRV9TVFJJTkc6IEZMQVRCVUZGRVJTX0ZBTExUSFJPVUdIKCk7ICAvLyBmYWxsIHRocnUKICAgICAgICAgICBjYXNlIEJBU0VfVFlQRV9WRUNUT1I6IHsKICAgICAgICAgICAgIGNvZGUgKz0gIixcbiI7Ci0gICAgICAgICAgICBjb2RlICs9ICIgICAgICBfIiArIGNhbWVsX25hbWU7CisgICAgICAgICAgICBjb2RlICs9ICIgICAgICBfIiArIGZpZWxkX25hbWU7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICB9CiAgICAgICAgICAgZGVmYXVsdDogIC8vIHNjYWxhcgogICAgICAgICAgICAgY29kZSArPSAiLFxuIjsKLSAgICAgICAgICAgIGNvZGUgKz0KLSAgICAgICAgICAgICAgICAiICAgICAgX28uIiArIEdlbkdldHRlckZ1bmNOYW1lX09iamVjdEFQSShmaWVsZC5uYW1lKSArICIoKSI7CisgICAgICAgICAgICBjb2RlICs9ICIgICAgICBfby4iICsgZ2V0X2ZpZWxkICsgIigpIjsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAgICAgICB9CiAgICAgICBjb2RlICs9ICIpO1xuIjsKICAgICB9IGVsc2UgewogICAgICAgLy8gU3RhcnQsIEVuZAotICAgICAgY29kZSArPSAiICAgIHN0YXJ0IiArIHN0cnVjdF9kZWYubmFtZSArICIoYnVpbGRlcik7XG4iOworICAgICAgY29kZSArPSAiICAgICIgKyBuYW1lcl8uTGVnYWN5SmF2YU1ldGhvZDIoInN0YXJ0Iiwgc3RydWN0X2RlZiwgIiIpICsKKyAgICAgICAgICAgICAgIihidWlsZGVyKTtcbiI7CiAgICAgICBmb3IgKGF1dG8gaXQgPSBzdHJ1Y3RfZGVmLmZpZWxkcy52ZWMuYmVnaW4oKTsKICAgICAgICAgICAgaXQgIT0gc3RydWN0X2RlZi5maWVsZHMudmVjLmVuZCgpOyArK2l0KSB7CiAgICAgICAgIGF1dG8gJmZpZWxkID0gKippdDsKICAgICAgICAgaWYgKGZpZWxkLmRlcHJlY2F0ZWQpIGNvbnRpbnVlOwotICAgICAgICBhdXRvIGNhbWVsX25hbWUgPSBDb252ZXJ0Q2FzZShmaWVsZC5uYW1lLCBDYXNlOjprTG93ZXJDYW1lbCk7Ci0gICAgICAgIGF1dG8gY2FtZWxfbmFtZV93aXRoX2ZpcnN0ID0gQ29udmVydENhc2UoZmllbGQubmFtZSwgQ2FzZTo6a1VwcGVyQ2FtZWwpOworICAgICAgICBjb25zdCBhdXRvIGFyZyA9ICJfIiArIG5hbWVyXy5WYXJpYWJsZShmaWVsZCk7CisgICAgICAgIGNvbnN0IGF1dG8gZ2V0X2ZpZWxkID0gbmFtZXJfLk1ldGhvZCgiZ2V0IiwgZmllbGQpOworICAgICAgICBjb25zdCBhdXRvIGFkZF9maWVsZCA9IG5hbWVyXy5NZXRob2QoImFkZCIsIGZpZWxkKTsKKwogICAgICAgICBzd2l0Y2ggKGZpZWxkLnZhbHVlLnR5cGUuYmFzZV90eXBlKSB7CiAgICAgICAgICAgY2FzZSBCQVNFX1RZUEVfU1RSVUNUOiB7CiAgICAgICAgICAgICBpZiAoZmllbGQudmFsdWUudHlwZS5zdHJ1Y3RfZGVmLT5maXhlZCkgewotICAgICAgICAgICAgICBjb2RlICs9ICIgICAgYWRkIiArIGNhbWVsX25hbWVfd2l0aF9maXJzdCArICIoYnVpbGRlciwgIiArCisgICAgICAgICAgICAgIGNvZGUgKz0gIiAgICAiICsgYWRkX2ZpZWxkICsgIihidWlsZGVyLCAiICsKICAgICAgICAgICAgICAgICAgICAgICBHZW5UeXBlR2V0KGZpZWxkLnZhbHVlLnR5cGUpICsgIi5wYWNrKGJ1aWxkZXIsIF9vLiIgKwotICAgICAgICAgICAgICAgICAgICAgIEdlbkdldHRlckZ1bmNOYW1lX09iamVjdEFQSShmaWVsZC5uYW1lKSArICIoKSkpO1xuIjsKKyAgICAgICAgICAgICAgICAgICAgICBnZXRfZmllbGQgKyAiKCkpKTtcbiI7CiAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICBjb2RlICs9ICIgICAgYWRkIiArIGNhbWVsX25hbWVfd2l0aF9maXJzdCArICIoYnVpbGRlciwgXyIgKwotICAgICAgICAgICAgICAgICAgICAgIGZpZWxkLm5hbWUgKyAiKTtcbiI7CisgICAgICAgICAgICAgIGNvZGUgKz0gIiAgICAiICsgYWRkX2ZpZWxkICsgIihidWlsZGVyLCAiICsgYXJnICsgIik7XG4iOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgfQogICAgICAgICAgIGNhc2UgQkFTRV9UWVBFX1NUUklORzogRkxBVEJVRkZFUlNfRkFMTFRIUk9VR0goKTsgIC8vIGZhbGwgdGhydQogICAgICAgICAgIGNhc2UgQkFTRV9UWVBFX0FSUkFZOiBGTEFUQlVGRkVSU19GQUxMVEhST1VHSCgpOyAgIC8vIGZhbGwgdGhydQogICAgICAgICAgIGNhc2UgQkFTRV9UWVBFX1ZFQ1RPUjogewotICAgICAgICAgICAgY29kZSArPSAiICAgIGFkZCIgKyBjYW1lbF9uYW1lX3dpdGhfZmlyc3QgKyAiKGJ1aWxkZXIsIF8iICsKLSAgICAgICAgICAgICAgICAgICAgY2FtZWxfbmFtZSArICIpO1xuIjsKKyAgICAgICAgICAgIGNvZGUgKz0gIiAgICAiICsgYWRkX2ZpZWxkICsgIihidWlsZGVyLCAiICsgYXJnICsgIik7XG4iOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgfQogICAgICAgICAgIGNhc2UgQkFTRV9UWVBFX1VUWVBFOiBicmVhazsKICAgICAgICAgICBjYXNlIEJBU0VfVFlQRV9VTklPTjogewotICAgICAgICAgICAgY29kZSArPSAiICAgIGFkZCIgKyBjYW1lbF9uYW1lX3dpdGhfZmlyc3QgKyAiVHlwZShidWlsZGVyLCBfIiArCi0gICAgICAgICAgICAgICAgICAgIGNhbWVsX25hbWUgKyAiVHlwZSk7XG4iOwotICAgICAgICAgICAgY29kZSArPSAiICAgIGFkZCIgKyBjYW1lbF9uYW1lX3dpdGhfZmlyc3QgKyAiKGJ1aWxkZXIsIF8iICsKLSAgICAgICAgICAgICAgICAgICAgY2FtZWxfbmFtZSArICIpO1xuIjsKKyAgICAgICAgICAgIGNvZGUgKz0gIiAgICAiICsgYWRkX2ZpZWxkICsgIlR5cGUoYnVpbGRlciwgIiArIGFyZyArICJUeXBlKTtcbiI7CisgICAgICAgICAgICBjb2RlICs9ICIgICAgIiArIGFkZF9maWVsZCArICIoYnVpbGRlciwgIiArIGFyZyArICIpO1xuIjsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgIH0KICAgICAgICAgICAvLyBzY2FsYXIKICAgICAgICAgICBkZWZhdWx0OiB7CiAgICAgICAgICAgICBpZiAoZmllbGQuSXNTY2FsYXJPcHRpb25hbCgpKSB7Ci0gICAgICAgICAgICAgIGNvZGUgKz0gIiAgICBpZiAoX28uIiArIEdlbkdldHRlckZ1bmNOYW1lX09iamVjdEFQSShmaWVsZC5uYW1lKSArCi0gICAgICAgICAgICAgICAgICAgICAgIigpICE9IG51bGwpIHsgYWRkIiArIGNhbWVsX25hbWVfd2l0aF9maXJzdCArCi0gICAgICAgICAgICAgICAgICAgICAgIihidWlsZGVyLCBfby4iICsKLSAgICAgICAgICAgICAgICAgICAgICBHZW5HZXR0ZXJGdW5jTmFtZV9PYmplY3RBUEkoZmllbGQubmFtZSkgKyAiKCkpOyB9XG4iOworICAgICAgICAgICAgICBjb2RlICs9ICIgICAgaWYgKF9vLiIgKyBnZXRfZmllbGQgKyAiKCkgIT0gbnVsbCkgeyAiICsgYWRkX2ZpZWxkICsKKyAgICAgICAgICAgICAgICAgICAgICAiKGJ1aWxkZXIsIF9vLiIgKyBnZXRfZmllbGQgKyAiKCkpOyB9XG4iOwogICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgY29kZSArPSAiICAgIGFkZCIgKyBjYW1lbF9uYW1lX3dpdGhfZmlyc3QgKyAiKGJ1aWxkZXIsIF9vLiIgKwotICAgICAgICAgICAgICAgICAgICAgIEdlbkdldHRlckZ1bmNOYW1lX09iamVjdEFQSShmaWVsZC5uYW1lKSArICIoKSk7XG4iOworICAgICAgICAgICAgICBjb2RlICs9CisgICAgICAgICAgICAgICAgICAiICAgICIgKyBhZGRfZmllbGQgKyAiKGJ1aWxkZXIsIF9vLiIgKyBnZXRfZmllbGQgKyAiKCkpO1xuIjsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgfQotICAgICAgY29kZSArPSAiICAgIHJldHVybiBlbmQiICsgc3RydWN0X2RlZi5uYW1lICsgIihidWlsZGVyKTtcbiI7CisgICAgICBjb2RlICs9ICIgICAgcmV0dXJuICIgKyBuYW1lcl8uTGVnYWN5SmF2YU1ldGhvZDIoImVuZCIsIHN0cnVjdF9kZWYsICIiKSArCisgICAgICAgICAgICAgICIoYnVpbGRlcik7XG4iOwogICAgIH0KICAgICBjb2RlICs9ICIgIH1cbiI7CiAgIH0KIAotICB2b2lkIEdlblN0cnVjdFBhY2tEZWNsX09iamVjdEFQSSgKLSAgICAgIGNvbnN0IFN0cnVjdERlZiAmc3RydWN0X2RlZiwgc3RkOjpzdHJpbmcgKmNvZGVfcHRyLAotICAgICAgc3RkOjp2ZWN0b3I8RmllbGRBcnJheUxlbmd0aD4gJmFycmF5X2xlbmd0aHMpIGNvbnN0IHsKLSAgICBhdXRvICZjb2RlID0gKmNvZGVfcHRyOworICB2b2lkIEdlblN0cnVjdFBhY2tEZWNsX09iamVjdEFQSShjb25zdCBTdHJ1Y3REZWYgJnN0cnVjdF9kZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPEZpZWxkQXJyYXlMZW5ndGg+ICZhcnJheV9sZW5ndGhzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyAmY29kZSkgY29uc3QgewogICAgIGZvciAoYXV0byBpdCA9IHN0cnVjdF9kZWYuZmllbGRzLnZlYy5iZWdpbigpOwogICAgICAgICAgaXQgIT0gc3RydWN0X2RlZi5maWVsZHMudmVjLmVuZCgpOyArK2l0KSB7Ci0gICAgICBhdXRvICZmaWVsZCA9ICoqaXQ7Ci0gICAgICBhdXRvIGlzX2FycmF5ID0gSXNBcnJheShmaWVsZC52YWx1ZS50eXBlKTsKLSAgICAgIGNvbnN0IGF1dG8gJmZpZWxkX3R5cGUgPQorICAgICAgY29uc3QgRmllbGREZWYgJmZpZWxkID0gKippdDsKKyAgICAgIGNvbnN0IGJvb2wgaXNfYXJyYXkgPSBJc0FycmF5KGZpZWxkLnZhbHVlLnR5cGUpOworICAgICAgY29uc3QgVHlwZSAmZmllbGRfdHlwZSA9CiAgICAgICAgICAgaXNfYXJyYXkgPyBmaWVsZC52YWx1ZS50eXBlLlZlY3RvclR5cGUoKSA6IGZpZWxkLnZhbHVlLnR5cGU7CiAgICAgICBGaWVsZEFycmF5TGVuZ3RoIHRtcF9hcnJheV9sZW5ndGggPSB7CiAgICAgICAgIGZpZWxkLm5hbWUsCkBAIC0xODM1LDggKzE4MzYsOCBAQAogICAgICAgfTsKICAgICAgIGFycmF5X2xlbmd0aHMucHVzaF9iYWNrKHRtcF9hcnJheV9sZW5ndGgpOwogICAgICAgaWYgKGZpZWxkX3R5cGUuc3RydWN0X2RlZiAhPSBudWxscHRyKSB7Ci0gICAgICAgIEdlblN0cnVjdFBhY2tEZWNsX09iamVjdEFQSSgqZmllbGRfdHlwZS5zdHJ1Y3RfZGVmLCBjb2RlX3B0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFycmF5X2xlbmd0aHMpOworICAgICAgICBHZW5TdHJ1Y3RQYWNrRGVjbF9PYmplY3RBUEkoKmZpZWxkX3R5cGUuc3RydWN0X2RlZiwgYXJyYXlfbGVuZ3RocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUpOwogICAgICAgfSBlbHNlIHsKICAgICAgICAgc3RkOjp2ZWN0b3I8RmllbGRBcnJheUxlbmd0aD4gYXJyYXlfb25seV9sZW5ndGhzOwogICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGFycmF5X2xlbmd0aHMuc2l6ZSgpOyArK2kpIHsKQEAgLTE4NDYsNyArMTg0Nyw3IEBACiAgICAgICAgIH0KICAgICAgICAgc3RkOjpzdHJpbmcgbmFtZTsKICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBhcnJheV9sZW5ndGhzLnNpemUoKTsgKytpKSB7Ci0gICAgICAgICAgbmFtZSArPSAiXyIgKyBDb252ZXJ0Q2FzZShhcnJheV9sZW5ndGhzW2ldLm5hbWUsIENhc2U6OmtMb3dlckNhbWVsKTsKKyAgICAgICAgICBuYW1lICs9ICJfIiArIG5hbWVyXy5WYXJpYWJsZShhcnJheV9sZW5ndGhzW2ldLm5hbWUpOwogICAgICAgICB9CiAgICAgICAgIGNvZGUgKz0gIiAgICAiICsgR2VuVHlwZUJhc2ljKGZpZWxkX3R5cGUpOwogICAgICAgICBpZiAoYXJyYXlfb25seV9sZW5ndGhzLnNpemUoKSA+IDApIHsKQEAgLTE4NzgsOCArMTg3OSw3IEBACiAgICAgICAgICAgfQogICAgICAgICAgIGNvZGUgKz0gIl0gPSBfbyI7CiAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDAsIGogPSAwOyBpIDwgYXJyYXlfbGVuZ3Rocy5zaXplKCk7ICsraSkgewotICAgICAgICAgICAgY29kZSArPQotICAgICAgICAgICAgICAgICIuIiArIEdlbkdldHRlckZ1bmNOYW1lX09iamVjdEFQSShhcnJheV9sZW5ndGhzW2ldLm5hbWUpICsgIigpIjsKKyAgICAgICAgICAgIGNvZGUgKz0gIi4iICsgbmFtZXJfLk1ldGhvZCgiZ2V0IiwgYXJyYXlfbGVuZ3Roc1tpXS5uYW1lKSArICIoKSI7CiAgICAgICAgICAgICBpZiAoYXJyYXlfbGVuZ3Roc1tpXS5sZW5ndGggPD0gMCkgY29udGludWU7CiAgICAgICAgICAgICBjb2RlICs9ICJbaWR4IiArIE51bVRvU3RyaW5nKGorKykgKyAiXSI7CiAgICAgICAgICAgfQpAQCAtMTg5MSw4ICsxODkxLDcgQEAKICAgICAgICAgICBjb2RlICs9ICIgIiArIG5hbWUgKyAiID0gIjsKICAgICAgICAgICBjb2RlICs9ICJfbyI7CiAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBhcnJheV9sZW5ndGhzLnNpemUoKTsgKytpKSB7Ci0gICAgICAgICAgICBjb2RlICs9Ci0gICAgICAgICAgICAgICAgIi4iICsgR2VuR2V0dGVyRnVuY05hbWVfT2JqZWN0QVBJKGFycmF5X2xlbmd0aHNbaV0ubmFtZSkgKyAiKCkiOworICAgICAgICAgICAgY29kZSArPSAiLiIgKyBuYW1lcl8uTWV0aG9kKCJnZXQiLCBhcnJheV9sZW5ndGhzW2ldLm5hbWUpICsgIigpIjsKICAgICAgICAgICB9CiAgICAgICAgICAgY29kZSArPSAiOyI7CiAgICAgICAgIH0KQEAgLTE5MDMsMjYgKzE5MDIsMjQgQEAKICAgfQogCiAgIHZvaWQgR2VuU3RydWN0UGFja0NhbGxfT2JqZWN0QVBJKGNvbnN0IFN0cnVjdERlZiAmc3RydWN0X2RlZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgKmNvZGVfcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyAmY29kZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4KSBjb25zdCB7Ci0gICAgYXV0byAmY29kZSA9ICpjb2RlX3B0cjsKICAgICBmb3IgKGF1dG8gaXQgPSBzdHJ1Y3RfZGVmLmZpZWxkcy52ZWMuYmVnaW4oKTsKICAgICAgICAgIGl0ICE9IHN0cnVjdF9kZWYuZmllbGRzLnZlYy5lbmQoKTsgKytpdCkgewogICAgICAgYXV0byAmZmllbGQgPSAqKml0OwogICAgICAgY29uc3QgYXV0byAmZmllbGRfdHlwZSA9IGZpZWxkLnZhbHVlLnR5cGU7CiAgICAgICBpZiAoZmllbGRfdHlwZS5zdHJ1Y3RfZGVmICE9IG51bGxwdHIpIHsKLSAgICAgICAgR2VuU3RydWN0UGFja0NhbGxfT2JqZWN0QVBJKAotICAgICAgICAgICAgKmZpZWxkX3R5cGUuc3RydWN0X2RlZiwgY29kZV9wdHIsCi0gICAgICAgICAgICBwcmVmaXggKyBDb252ZXJ0Q2FzZShmaWVsZC5uYW1lLCBDYXNlOjprTG93ZXJDYW1lbCkgKyAiXyIpOworICAgICAgICBHZW5TdHJ1Y3RQYWNrQ2FsbF9PYmplY3RBUEkoKmZpZWxkX3R5cGUuc3RydWN0X2RlZiwgY29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCArIG5hbWVyXy5GaWVsZChmaWVsZCkgKyAiXyIpOwogICAgICAgfSBlbHNlIHsKICAgICAgICAgY29kZSArPSAiLFxuIjsKLSAgICAgICAgY29kZSArPSBwcmVmaXggKyBDb252ZXJ0Q2FzZShmaWVsZC5uYW1lLCBDYXNlOjprTG93ZXJDYW1lbCk7CisgICAgICAgIGNvZGUgKz0gcHJlZml4ICsgbmFtZXJfLkZpZWxkKGZpZWxkKTsKICAgICAgIH0KICAgICB9CiAgIH0KIAogICBzdGQ6OnN0cmluZyBDb252ZXJ0UHJpbWl0aXZlVHlwZVRvT2JqZWN0V3JhcHBlcl9PYmplY3RBUEkoCi0gICAgICBzdGQ6OnN0cmluZyB0eXBlX25hbWUpIGNvbnN0IHsKKyAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nICZ0eXBlX25hbWUpIGNvbnN0IHsKICAgICBpZiAodHlwZV9uYW1lID09ICJib29sZWFuIikKICAgICAgIHJldHVybiAiQm9vbGVhbiI7CiAgICAgZWxzZSBpZiAodHlwZV9uYW1lID09ICJieXRlIikKQEAgLTE5NDIsOCArMTkzOSw4IEBACiAgICAgcmV0dXJuIHR5cGVfbmFtZTsKICAgfQogCi0gIHN0ZDo6c3RyaW5nIEdlblR5cGVHZXRfT2JqZWN0QVBJKGZsYXRidWZmZXJzOjpUeXBlIHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElETE9wdGlvbnMgJm9wdHMsIGJvb2wgdmVjdG9yZWxlbSwKKyAgc3RkOjpzdHJpbmcgR2VuVHlwZUdldF9PYmplY3RBUEkoY29uc3QgZmxhdGJ1ZmZlcnM6OlR5cGUgJnR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgdmVjdG9yZWxlbSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCB3cmFwX2luX25hbWVzcGFjZSkgY29uc3QgewogICAgIGF1dG8gdHlwZV9uYW1lID0gR2VuVHlwZU5hbWVEZXN0KHR5cGUpOwogICAgIC8vIFJlcGxhY2UgdG8gT2JqZWN0QmFzZUFQSSBUeXBlIE5hbWUKQEAgLTE5NTMsMTUgKzE5NTAsMTQgQEAKICAgICAgIGNhc2UgQkFTRV9UWVBFX1ZFQ1RPUjogewogICAgICAgICBpZiAodHlwZS5zdHJ1Y3RfZGVmICE9IG51bGxwdHIpIHsKICAgICAgICAgICBhdXRvIHR5cGVfbmFtZV9sZW5ndGggPSB0eXBlLnN0cnVjdF9kZWYtPm5hbWUubGVuZ3RoKCk7Ci0gICAgICAgICAgYXV0byBuZXdfdHlwZV9uYW1lID0KLSAgICAgICAgICAgICAgR2VuVHlwZU5hbWVfT2JqZWN0QVBJKHR5cGUuc3RydWN0X2RlZi0+bmFtZSwgb3B0cyk7CisgICAgICAgICAgYXV0byBuZXdfdHlwZV9uYW1lID0gbmFtZXJfLk9iamVjdFR5cGUoKnR5cGUuc3RydWN0X2RlZik7CiAgICAgICAgICAgdHlwZV9uYW1lLnJlcGxhY2UodHlwZV9uYW1lLmxlbmd0aCgpIC0gdHlwZV9uYW1lX2xlbmd0aCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlX25hbWVfbGVuZ3RoLCBuZXdfdHlwZV9uYW1lKTsKICAgICAgICAgfSBlbHNlIGlmICh0eXBlLmVsZW1lbnQgPT0gQkFTRV9UWVBFX1VOSU9OKSB7CiAgICAgICAgICAgaWYgKHdyYXBfaW5fbmFtZXNwYWNlKSB7Ci0gICAgICAgICAgICB0eXBlX25hbWUgPSBXcmFwSW5OYW1lU3BhY2UoKnR5cGUuZW51bV9kZWYpICsgIlVuaW9uIjsKKyAgICAgICAgICAgIHR5cGVfbmFtZSA9IG5hbWVyXy5OYW1lc3BhY2VkVHlwZSgqdHlwZS5lbnVtX2RlZikgKyAiVW5pb24iOwogICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB0eXBlX25hbWUgPSB0eXBlLmVudW1fZGVmLT5uYW1lICsgIlVuaW9uIjsKKyAgICAgICAgICAgIHR5cGVfbmFtZSA9IG5hbWVyXy5UeXBlKCp0eXBlLmVudW1fZGVmKSArICJVbmlvbiI7CiAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIGJyZWFrOwpAQCAtMTk2OSw5ICsxOTY1LDkgQEAKIAogICAgICAgY2FzZSBCQVNFX1RZUEVfVU5JT046IHsKICAgICAgICAgaWYgKHdyYXBfaW5fbmFtZXNwYWNlKSB7Ci0gICAgICAgICAgdHlwZV9uYW1lID0gV3JhcEluTmFtZVNwYWNlKCp0eXBlLmVudW1fZGVmKSArICJVbmlvbiI7CisgICAgICAgICAgdHlwZV9uYW1lID0gbmFtZXJfLk5hbWVzcGFjZWRUeXBlKCp0eXBlLmVudW1fZGVmKSArICJVbmlvbiI7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgdHlwZV9uYW1lID0gdHlwZS5lbnVtX2RlZi0+bmFtZSArICJVbmlvbiI7CisgICAgICAgICAgdHlwZV9uYW1lID0gbmFtZXJfLlR5cGUoKnR5cGUuZW51bV9kZWYpICsgIlVuaW9uIjsKICAgICAgICAgfQogICAgICAgICBicmVhazsKICAgICAgIH0KQEAgLTE5ODksOCArMTk4NSw4IEBACiAgICAgcmV0dXJuIHR5cGVfbmFtZTsKICAgfQogCi0gIHN0ZDo6c3RyaW5nIEdlbkNvbmNyZXRlVHlwZUdldF9PYmplY3RBUEkoZmxhdGJ1ZmZlcnM6OlR5cGUgdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJRExPcHRpb25zICZvcHRzKSBjb25zdCB7CisgIHN0ZDo6c3RyaW5nIEdlbkNvbmNyZXRlVHlwZUdldF9PYmplY3RBUEkoCisgICAgICBjb25zdCBmbGF0YnVmZmVyczo6VHlwZSAmdHlwZSkgY29uc3QgewogICAgIGF1dG8gdHlwZV9uYW1lID0gR2VuVHlwZU5hbWVEZXN0KHR5cGUpOwogICAgIC8vIFJlcGxhY2UgdG8gT2JqZWN0QmFzZUFQSSBUeXBlIE5hbWUKICAgICBzd2l0Y2ggKHR5cGUuYmFzZV90eXBlKSB7CkBAIC0xOTk5LDE4ICsxOTk1LDE3IEBACiAgICAgICBjYXNlIEJBU0VfVFlQRV9WRUNUT1I6IHsKICAgICAgICAgaWYgKHR5cGUuc3RydWN0X2RlZiAhPSBudWxscHRyKSB7CiAgICAgICAgICAgYXV0byB0eXBlX25hbWVfbGVuZ3RoID0gdHlwZS5zdHJ1Y3RfZGVmLT5uYW1lLmxlbmd0aCgpOwotICAgICAgICAgIGF1dG8gbmV3X3R5cGVfbmFtZSA9Ci0gICAgICAgICAgICAgIEdlblR5cGVOYW1lX09iamVjdEFQSSh0eXBlLnN0cnVjdF9kZWYtPm5hbWUsIG9wdHMpOworICAgICAgICAgIGF1dG8gbmV3X3R5cGVfbmFtZSA9IG5hbWVyXy5PYmplY3RUeXBlKCp0eXBlLnN0cnVjdF9kZWYpOwogICAgICAgICAgIHR5cGVfbmFtZS5yZXBsYWNlKHR5cGVfbmFtZS5sZW5ndGgoKSAtIHR5cGVfbmFtZV9sZW5ndGgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZV9uYW1lX2xlbmd0aCwgbmV3X3R5cGVfbmFtZSk7CiAgICAgICAgIH0gZWxzZSBpZiAodHlwZS5lbGVtZW50ID09IEJBU0VfVFlQRV9VTklPTikgewotICAgICAgICAgIHR5cGVfbmFtZSA9IFdyYXBJbk5hbWVTcGFjZSgqdHlwZS5lbnVtX2RlZikgKyAiVW5pb24iOworICAgICAgICAgIHR5cGVfbmFtZSA9IG5hbWVyXy5OYW1lc3BhY2VkVHlwZSgqdHlwZS5lbnVtX2RlZikgKyAiVW5pb24iOwogICAgICAgICB9CiAgICAgICAgIGJyZWFrOwogICAgICAgfQogCiAgICAgICBjYXNlIEJBU0VfVFlQRV9VTklPTjogewotICAgICAgICB0eXBlX25hbWUgPSBXcmFwSW5OYW1lU3BhY2UoKnR5cGUuZW51bV9kZWYpICsgIlVuaW9uIjsKKyAgICAgICAgdHlwZV9uYW1lID0gbmFtZXJfLk5hbWVzcGFjZWRUeXBlKCp0eXBlLmVudW1fZGVmKSArICJVbmlvbiI7CiAgICAgICAgIGJyZWFrOwogICAgICAgfQogICAgICAgZGVmYXVsdDogYnJlYWs7CkBAIC0yMDI3LDcxICsyMDIyLDcxIEBACiAgICAgcmV0dXJuIHR5cGVfbmFtZTsKICAgfQogCi0gIHZvaWQgR2VuU3RydWN0X09iamVjdEFQSShTdHJ1Y3REZWYgJnN0cnVjdF9kZWYsIHN0ZDo6c3RyaW5nICpjb2RlX3B0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElETE9wdGlvbnMgJm9wdHMpIGNvbnN0IHsKKyAgdm9pZCBHZW5TdHJ1Y3RfT2JqZWN0QVBJKGNvbnN0IFN0cnVjdERlZiAmc3RydWN0X2RlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nICZjb2RlKSBjb25zdCB7CiAgICAgaWYgKHN0cnVjdF9kZWYuZ2VuZXJhdGVkKSByZXR1cm47Ci0gICAgYXV0byAmY29kZSA9ICpjb2RlX3B0cjsKICAgICBpZiAoc3RydWN0X2RlZi5hdHRyaWJ1dGVzLkxvb2t1cCgicHJpdmF0ZSIpKSB7CiAgICAgICAvLyBGb3IgSmF2YSwgd2UgbGVhdmUgdGhlIGVudW0gdW5tYXJrZWQgdG8gaW5kaWNhdGUgcGFja2FnZS1wcml2YXRlCiAgICAgfSBlbHNlIHsKICAgICAgIGNvZGUgKz0gInB1YmxpYyAiOwogICAgIH0KIAotICAgIGF1dG8gY2xhc3NfbmFtZSA9IEdlblR5cGVOYW1lX09iamVjdEFQSShzdHJ1Y3RfZGVmLm5hbWUsIG9wdHMpOworICAgIGNvbnN0IGF1dG8gY2xhc3NfbmFtZSA9IG5hbWVyXy5PYmplY3RUeXBlKHN0cnVjdF9kZWYpOwogICAgIGNvZGUgKz0gImNsYXNzICIgKyBjbGFzc19uYW1lOwogICAgIGNvZGUgKz0gIiB7XG4iOwogICAgIC8vIEdlbmVyYXRlIFByb3BlcnRpZXMKICAgICBmb3IgKGF1dG8gaXQgPSBzdHJ1Y3RfZGVmLmZpZWxkcy52ZWMuYmVnaW4oKTsKICAgICAgICAgIGl0ICE9IHN0cnVjdF9kZWYuZmllbGRzLnZlYy5lbmQoKTsgKytpdCkgewotICAgICAgYXV0byAmZmllbGQgPSAqKml0OworICAgICAgY29uc3QgYXV0byAmZmllbGQgPSAqKml0OwogICAgICAgaWYgKGZpZWxkLmRlcHJlY2F0ZWQpIGNvbnRpbnVlOwogICAgICAgaWYgKGZpZWxkLnZhbHVlLnR5cGUuYmFzZV90eXBlID09IEJBU0VfVFlQRV9VVFlQRSkgY29udGludWU7CiAgICAgICBpZiAoZmllbGQudmFsdWUudHlwZS5lbGVtZW50ID09IEJBU0VfVFlQRV9VVFlQRSkgY29udGludWU7Ci0gICAgICBhdXRvIHR5cGVfbmFtZSA9Ci0gICAgICAgICAgR2VuVHlwZUdldF9PYmplY3RBUEkoZmllbGQudmFsdWUudHlwZSwgb3B0cywgZmFsc2UsIHRydWUpOworICAgICAgYXV0byB0eXBlX25hbWUgPSBHZW5UeXBlR2V0X09iamVjdEFQSShmaWVsZC52YWx1ZS50eXBlLCBmYWxzZSwgdHJ1ZSk7CiAgICAgICBpZiAoZmllbGQuSXNTY2FsYXJPcHRpb25hbCgpKQogICAgICAgICB0eXBlX25hbWUgPSBDb252ZXJ0UHJpbWl0aXZlVHlwZVRvT2JqZWN0V3JhcHBlcl9PYmplY3RBUEkodHlwZV9uYW1lKTsKLSAgICAgIGF1dG8gY2FtZWxfbmFtZSA9IENvbnZlcnRDYXNlKGZpZWxkLm5hbWUsIENhc2U6OmtMb3dlckNhbWVsKTsKLSAgICAgIGNvZGUgKz0gIiAgcHJpdmF0ZSAiICsgdHlwZV9uYW1lICsgIiAiICsgY2FtZWxfbmFtZSArICI7XG4iOworICAgICAgY29uc3QgYXV0byBmaWVsZF9uYW1lID0gbmFtZXJfLkZpZWxkKGZpZWxkKTsKKyAgICAgIGNvZGUgKz0gIiAgcHJpdmF0ZSAiICsgdHlwZV9uYW1lICsgIiAiICsgZmllbGRfbmFtZSArICI7XG4iOwogICAgIH0KICAgICAvLyBHZW5lcmF0ZSBKYXZhIGdldHRlcnMgYW5kIHNldHRlcnMKICAgICBjb2RlICs9ICJcbiI7CiAgICAgZm9yIChhdXRvIGl0ID0gc3RydWN0X2RlZi5maWVsZHMudmVjLmJlZ2luKCk7CiAgICAgICAgICBpdCAhPSBzdHJ1Y3RfZGVmLmZpZWxkcy52ZWMuZW5kKCk7ICsraXQpIHsKLSAgICAgIGF1dG8gJmZpZWxkID0gKippdDsKKyAgICAgIGNvbnN0IGF1dG8gJmZpZWxkID0gKippdDsKICAgICAgIGlmIChmaWVsZC5kZXByZWNhdGVkKSBjb250aW51ZTsKICAgICAgIGlmIChmaWVsZC52YWx1ZS50eXBlLmJhc2VfdHlwZSA9PSBCQVNFX1RZUEVfVVRZUEUpIGNvbnRpbnVlOwogICAgICAgaWYgKGZpZWxkLnZhbHVlLnR5cGUuZWxlbWVudCA9PSBCQVNFX1RZUEVfVVRZUEUpIGNvbnRpbnVlOwotICAgICAgYXV0byB0eXBlX25hbWUgPQotICAgICAgICAgIEdlblR5cGVHZXRfT2JqZWN0QVBJKGZpZWxkLnZhbHVlLnR5cGUsIG9wdHMsIGZhbHNlLCB0cnVlKTsKKyAgICAgIGNvbnN0IGF1dG8gZmllbGRfbmFtZSA9IG5hbWVyXy5GaWVsZChmaWVsZCk7CisgICAgICBjb25zdCBhdXRvIGdldF9maWVsZCA9IG5hbWVyXy5NZXRob2QoImdldCIsIGZpZWxkKTsKKyAgICAgIGF1dG8gdHlwZV9uYW1lID0gR2VuVHlwZUdldF9PYmplY3RBUEkoZmllbGQudmFsdWUudHlwZSwgZmFsc2UsIHRydWUpOwogICAgICAgaWYgKGZpZWxkLklzU2NhbGFyT3B0aW9uYWwoKSkKICAgICAgICAgdHlwZV9uYW1lID0gQ29udmVydFByaW1pdGl2ZVR5cGVUb09iamVjdFdyYXBwZXJfT2JqZWN0QVBJKHR5cGVfbmFtZSk7Ci0gICAgICBhdXRvIGNhbWVsX25hbWUgPSBDb252ZXJ0Q2FzZShmaWVsZC5uYW1lLCBDYXNlOjprTG93ZXJDYW1lbCk7Ci0gICAgICBjb2RlICs9ICIgIHB1YmxpYyAiICsgdHlwZV9uYW1lICsgIiAiICsKLSAgICAgICAgICAgICAgR2VuR2V0dGVyRnVuY05hbWVfT2JqZWN0QVBJKGZpZWxkLm5hbWUpICsgIigpIHsgcmV0dXJuICIgKwotICAgICAgICAgICAgICBjYW1lbF9uYW1lICsgIjsgfVxuXG4iOworCisgICAgICBjb2RlICs9ICIgIHB1YmxpYyAiICsgdHlwZV9uYW1lICsgIiAiICsgZ2V0X2ZpZWxkICsgIigpIHsgcmV0dXJuICIgKworICAgICAgICAgICAgICBmaWVsZF9uYW1lICsgIjsgfVxuXG4iOwogICAgICAgc3RkOjpzdHJpbmcgYXJyYXlfdmFsaWRhdGlvbiA9ICIiOwogICAgICAgaWYgKGZpZWxkLnZhbHVlLnR5cGUuYmFzZV90eXBlID09IEJBU0VfVFlQRV9BUlJBWSkgewogICAgICAgICBhcnJheV92YWxpZGF0aW9uID0KLSAgICAgICAgICAgICJpZiAoIiArIGNhbWVsX25hbWUgKyAiICE9IG51bGwgJiYgIiArIGNhbWVsX25hbWUgKworICAgICAgICAgICAgImlmICgiICsgZmllbGRfbmFtZSArICIgIT0gbnVsbCAmJiAiICsgZmllbGRfbmFtZSArCiAgICAgICAgICAgICAiLmxlbmd0aCA9PSAiICsgTnVtVG9TdHJpbmcoZmllbGQudmFsdWUudHlwZS5maXhlZF9sZW5ndGgpICsgIikgIjsKICAgICAgIH0KLSAgICAgIGNvZGUgKz0gIiAgcHVibGljIHZvaWQgIiArIEdlblNldHRlckZ1bmNOYW1lX09iamVjdEFQSShmaWVsZC5uYW1lKSArICIoIiArCi0gICAgICAgICAgICAgIHR5cGVfbmFtZSArICIgIiArIGNhbWVsX25hbWUgKyAiKSB7ICIgKyBhcnJheV92YWxpZGF0aW9uICsKLSAgICAgICAgICAgICAgInRoaXMuIiArIGNhbWVsX25hbWUgKyAiID0gIiArIGNhbWVsX25hbWUgKyAiOyB9XG5cbiI7CisgICAgICBjb2RlICs9ICIgIHB1YmxpYyB2b2lkICIgKyBuYW1lcl8uTWV0aG9kKCJzZXQiLCBmaWVsZCkgKyAiKCIgKyB0eXBlX25hbWUgKworICAgICAgICAgICAgICAiICIgKyBmaWVsZF9uYW1lICsgIikgeyAiICsgYXJyYXlfdmFsaWRhdGlvbiArICJ0aGlzLiIgKworICAgICAgICAgICAgICBmaWVsZF9uYW1lICsgIiA9ICIgKyBmaWVsZF9uYW1lICsgIjsgfVxuXG4iOwogICAgIH0KICAgICAvLyBHZW5lcmF0ZSBDb25zdHJ1Y3RvcgogICAgIGNvZGUgKz0gIlxuIjsKICAgICBjb2RlICs9ICIgIHB1YmxpYyAiICsgY2xhc3NfbmFtZSArICIoKSB7XG4iOwogICAgIGZvciAoYXV0byBpdCA9IHN0cnVjdF9kZWYuZmllbGRzLnZlYy5iZWdpbigpOwogICAgICAgICAgaXQgIT0gc3RydWN0X2RlZi5maWVsZHMudmVjLmVuZCgpOyArK2l0KSB7Ci0gICAgICBhdXRvICZmaWVsZCA9ICoqaXQ7CisgICAgICBjb25zdCBhdXRvICZmaWVsZCA9ICoqaXQ7CiAgICAgICBpZiAoZmllbGQuZGVwcmVjYXRlZCkgY29udGludWU7CiAgICAgICBpZiAoZmllbGQudmFsdWUudHlwZS5iYXNlX3R5cGUgPT0gQkFTRV9UWVBFX1VUWVBFKSBjb250aW51ZTsKICAgICAgIGlmIChmaWVsZC52YWx1ZS50eXBlLmVsZW1lbnQgPT0gQkFTRV9UWVBFX1VUWVBFKSBjb250aW51ZTsKLSAgICAgIGNvZGUgKz0gIiAgICB0aGlzLiIgKyBDb252ZXJ0Q2FzZShmaWVsZC5uYW1lLCBDYXNlOjprTG93ZXJDYW1lbCkgKyAiID0gIjsKLSAgICAgIGF1dG8gdHlwZV9uYW1lID0KLSAgICAgICAgICBHZW5UeXBlR2V0X09iamVjdEFQSShmaWVsZC52YWx1ZS50eXBlLCBvcHRzLCBmYWxzZSwgdHJ1ZSk7CisgICAgICBjb25zdCBhdXRvIGdldF9maWVsZCA9IG5hbWVyXy5NZXRob2QoImdldCIsIGZpZWxkKTsKKworICAgICAgY29kZSArPSAiICAgIHRoaXMuIiArIG5hbWVyXy5GaWVsZChmaWVsZCkgKyAiID0gIjsKKyAgICAgIGNvbnN0IGF1dG8gdHlwZV9uYW1lID0KKyAgICAgICAgICBHZW5UeXBlR2V0X09iamVjdEFQSShmaWVsZC52YWx1ZS50eXBlLCBmYWxzZSwgdHJ1ZSk7CiAgICAgICBpZiAoSXNTY2FsYXIoZmllbGQudmFsdWUudHlwZS5iYXNlX3R5cGUpKSB7CiAgICAgICAgIGlmIChmaWVsZC5Jc1NjYWxhck9wdGlvbmFsKCkpIHsKICAgICAgICAgICBjb2RlICs9ICJudWxsO1xuIjsKQEAgLTIxMjIsMTUgKzIxMTcsMTggQEAKICAgICB9CiAgICAgY29kZSArPSAiICB9XG4iOwogICAgIGlmIChwYXJzZXJfLnJvb3Rfc3RydWN0X2RlZl8gPT0gJnN0cnVjdF9kZWYpIHsKKyAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nIHN0cnVjdF90eXBlID0gbmFtZXJfLlR5cGUoc3RydWN0X2RlZik7CiAgICAgICBjb2RlICs9ICIgIHB1YmxpYyBzdGF0aWMgIiArIGNsYXNzX25hbWUgKwogICAgICAgICAgICAgICAiIGRlc2VyaWFsaXplRnJvbUJpbmFyeShieXRlW10gZmJCdWZmZXIpIHtcbiI7Ci0gICAgICBjb2RlICs9ICIgICAgcmV0dXJuICIgKyBzdHJ1Y3RfZGVmLm5hbWUgKyAiLmdldFJvb3RBcyIgKyBzdHJ1Y3RfZGVmLm5hbWUgKworICAgICAgY29kZSArPSAiICAgIHJldHVybiAiICsgc3RydWN0X3R5cGUgKyAiLiIgKworICAgICAgICAgICAgICBuYW1lcl8uTGVnYWN5SmF2YU1ldGhvZDIoImdldFJvb3RBcyIsIHN0cnVjdF9kZWYsICIiKSArCiAgICAgICAgICAgICAgICIoQnl0ZUJ1ZmZlci53cmFwKGZiQnVmZmVyKSkudW5wYWNrKCk7XG4iOwogICAgICAgY29kZSArPSAiICB9XG4iOwogICAgICAgY29kZSArPSAiICBwdWJsaWMgYnl0ZVtdIHNlcmlhbGl6ZVRvQmluYXJ5KCkge1xuIjsKICAgICAgIGNvZGUgKz0gIiAgICBGbGF0QnVmZmVyQnVpbGRlciBmYmIgPSBuZXcgRmxhdEJ1ZmZlckJ1aWxkZXIoKTtcbiI7Ci0gICAgICBjb2RlICs9ICIgICAgIiArIHN0cnVjdF9kZWYubmFtZSArICIuZmluaXNoIiArIHN0cnVjdF9kZWYubmFtZSArCi0gICAgICAgICAgICAgICJCdWZmZXIoZmJiLCAiICsgc3RydWN0X2RlZi5uYW1lICsgIi5wYWNrKGZiYiwgdGhpcykpO1xuIjsKKyAgICAgIGNvZGUgKz0gIiAgICAiICsgc3RydWN0X3R5cGUgKyAiLiIgKworICAgICAgICAgICAgICBuYW1lcl8uTGVnYWN5SmF2YU1ldGhvZDIoImZpbmlzaCIsIHN0cnVjdF9kZWYsICJCdWZmZXIiKSArCisgICAgICAgICAgICAgICIoZmJiLCAiICsgc3RydWN0X3R5cGUgKyAiLnBhY2soZmJiLCB0aGlzKSk7XG4iOwogICAgICAgY29kZSArPSAiICAgIHJldHVybiBmYmIuc2l6ZWRCeXRlQXJyYXkoKTtcbiI7CiAgICAgICBjb2RlICs9ICIgIH1cbiI7CiAgICAgfQpAQCAtMjE0MCw2ICsyMTM4LDcgQEAKICAgLy8gVGhpcyB0cmFja3MgdGhlIGN1cnJlbnQgbmFtZXNwYWNlIHVzZWQgdG8gZGV0ZXJtaW5lIGlmIGEgdHlwZSBuZWVkIHRvIGJlCiAgIC8vIHByZWZpeGVkIGJ5IGl0cyBuYW1lc3BhY2UKICAgY29uc3QgTmFtZXNwYWNlICpjdXJfbmFtZV9zcGFjZV87CisgIGNvbnN0IElkbE5hbWVyIG5hbWVyXzsKIH07CiB9ICAvLyBuYW1lc3BhY2UgamF2YQogCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy9zcmMvaWRsX2dlbl9qc29uX3NjaGVtYS5jcHAgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy9zcmMvaWRsX2dlbl9qc29uX3NjaGVtYS5jcHAKaW5kZXggOWVhMzdhZS4uNWNiNmE5ZCAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvc3JjL2lkbF9nZW5fanNvbl9zY2hlbWEuY3BwCisrKyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3NyYy9pZGxfZ2VuX2pzb25fc2NoZW1hLmNwcApAQCAtMjQsNyArMjQsMTAgQEAKIAogbmFtZXNwYWNlIGpzb25zIHsKIAotdGVtcGxhdGU8Y2xhc3MgVD4gc3RkOjpzdHJpbmcgR2VuRnVsbE5hbWUoY29uc3QgVCAqZW51bV9kZWYpIHsKK25hbWVzcGFjZSB7CisKK3RlbXBsYXRlPGNsYXNzIFQ+CitzdGF0aWMgc3RkOjpzdHJpbmcgR2VuRnVsbE5hbWUoY29uc3QgVCAqZW51bV9kZWYpIHsKICAgc3RkOjpzdHJpbmcgZnVsbF9uYW1lOwogICBjb25zdCBhdXRvICZuYW1lX3NwYWNlcyA9IGVudW1fZGVmLT5kZWZpbmVkX25hbWVzcGFjZS0+Y29tcG9uZW50czsKICAgZm9yIChhdXRvIG5zID0gbmFtZV9zcGFjZXMuY2JlZ2luKCk7IG5zICE9IG5hbWVfc3BhY2VzLmNlbmQoKTsgKytucykgewpAQCAtMzQsMTUgKzM3LDE2IEBACiAgIHJldHVybiBmdWxsX25hbWU7CiB9CiAKLXRlbXBsYXRlPGNsYXNzIFQ+IHN0ZDo6c3RyaW5nIEdlblR5cGVSZWYoY29uc3QgVCAqZW51bV9kZWYpIHsKK3RlbXBsYXRlPGNsYXNzIFQ+CitzdGF0aWMgc3RkOjpzdHJpbmcgR2VuVHlwZVJlZihjb25zdCBUICplbnVtX2RlZikgewogICByZXR1cm4gIlwiJHJlZlwiIDogXCIjL2RlZmluaXRpb25zLyIgKyBHZW5GdWxsTmFtZShlbnVtX2RlZikgKyAiXCIiOwogfQogCi1zdGQ6OnN0cmluZyBHZW5UeXBlKGNvbnN0IHN0ZDo6c3RyaW5nICZuYW1lKSB7CitzdGF0aWMgc3RkOjpzdHJpbmcgR2VuVHlwZShjb25zdCBzdGQ6OnN0cmluZyAmbmFtZSkgewogICByZXR1cm4gIlwidHlwZVwiIDogXCIiICsgbmFtZSArICJcIiI7CiB9CiAKLXN0ZDo6c3RyaW5nIEdlblR5cGUoQmFzZVR5cGUgdHlwZSkgeworc3RhdGljIHN0ZDo6c3RyaW5nIEdlblR5cGUoQmFzZVR5cGUgdHlwZSkgewogICBzd2l0Y2ggKHR5cGUpIHsKICAgICBjYXNlIEJBU0VfVFlQRV9CT09MOiByZXR1cm4gIlwidHlwZVwiIDogXCJib29sZWFuXCIiOwogICAgIGNhc2UgQkFTRV9UWVBFX0NIQVI6CkBAIC04NCwxMyArODgsMTMgQEAKICAgfQogfQogCi1zdGQ6OnN0cmluZyBHZW5CYXNlVHlwZShjb25zdCBUeXBlICZ0eXBlKSB7CitzdGF0aWMgc3RkOjpzdHJpbmcgR2VuQmFzZVR5cGUoY29uc3QgVHlwZSAmdHlwZSkgewogICBpZiAodHlwZS5zdHJ1Y3RfZGVmICE9IG51bGxwdHIpIHsgcmV0dXJuIEdlblR5cGVSZWYodHlwZS5zdHJ1Y3RfZGVmKTsgfQogICBpZiAodHlwZS5lbnVtX2RlZiAhPSBudWxscHRyKSB7IHJldHVybiBHZW5UeXBlUmVmKHR5cGUuZW51bV9kZWYpOyB9CiAgIHJldHVybiBHZW5UeXBlKHR5cGUuYmFzZV90eXBlKTsKIH0KIAotc3RkOjpzdHJpbmcgR2VuQXJyYXlUeXBlKGNvbnN0IFR5cGUgJnR5cGUpIHsKK3N0YXRpYyBzdGQ6OnN0cmluZyBHZW5BcnJheVR5cGUoY29uc3QgVHlwZSAmdHlwZSkgewogICBzdGQ6OnN0cmluZyBlbGVtZW50X3R5cGU7CiAgIGlmICh0eXBlLnN0cnVjdF9kZWYgIT0gbnVsbHB0cikgewogICAgIGVsZW1lbnRfdHlwZSA9IEdlblR5cGVSZWYodHlwZS5zdHJ1Y3RfZGVmKTsKQEAgLTEwMyw3ICsxMDcsNyBAQAogICByZXR1cm4gIlwidHlwZVwiIDogXCJhcnJheVwiLCBcIml0ZW1zXCIgOiB7IiArIGVsZW1lbnRfdHlwZSArICJ9IjsKIH0KIAotc3RkOjpzdHJpbmcgR2VuVHlwZShjb25zdCBUeXBlICZ0eXBlKSB7CitzdGF0aWMgc3RkOjpzdHJpbmcgR2VuVHlwZShjb25zdCBUeXBlICZ0eXBlKSB7CiAgIHN3aXRjaCAodHlwZS5iYXNlX3R5cGUpIHsKICAgICBjYXNlIEJBU0VfVFlQRV9BUlJBWTogRkxBVEJVRkZFUlNfRkFMTFRIUk9VR0goKTsgIC8vIGZhbGwgdGhydQogICAgIGNhc2UgQkFTRV9UWVBFX1ZFQ1RPUjogewpAQCAtMTM2LDYgKzE0MCw4IEBACiAgIH0KIH0KIAorfSAvLyBuYW1lc3BhY2UKKwogY2xhc3MgSnNvblNjaGVtYUdlbmVyYXRvciA6IHB1YmxpYyBCYXNlR2VuZXJhdG9yIHsKICBwcml2YXRlOgogICBzdGQ6OnN0cmluZyBjb2RlXzsKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3NyYy9pZGxfZ2VuX2tvdGxpbi5jcHAgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy9zcmMvaWRsX2dlbl9rb3RsaW4uY3BwCmluZGV4IGZjNTVhZWIuLjEwMmUyNGQgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3NyYy9pZGxfZ2VuX2tvdGxpbi5jcHAKKysrIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvc3JjL2lkbF9nZW5fa290bGluLmNwcApAQCAtMjMsMTEgKzIzLDE0IEBACiAjaW5jbHVkZSAiZmxhdGJ1ZmZlcnMvZmxhdGJ1ZmZlcnMuaCIKICNpbmNsdWRlICJmbGF0YnVmZmVycy9pZGwuaCIKICNpbmNsdWRlICJmbGF0YnVmZmVycy91dGlsLmgiCisjaW5jbHVkZSAiaWRsX25hbWVyLmgiCiAKIG5hbWVzcGFjZSBmbGF0YnVmZmVycyB7CiAKIG5hbWVzcGFjZSBrb3RsaW4gewogCituYW1lc3BhY2UgeworCiB0eXBlZGVmIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnBhaXI8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiA+IEZiYlBhcmFtTWFwOwogc3RhdGljIFR5cGVkRmxvYXRDb25zdGFudEdlbmVyYXRvciBLb3RsaW5GbG9hdEdlbigiRG91YmxlLiIsICJGbG9hdC4iLCAiTmFOIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlBPU0lUSVZFX0lORklOSVRZIiwKQEAgLTM1LDQyICszOCw1NCBAQAogCiBzdGF0aWMgY29uc3QgQ29tbWVudENvbmZpZyBjb21tZW50X2NvbmZpZyA9IHsgIi8qKiIsICIgKiIsICIgKi8iIH07CiBzdGF0aWMgY29uc3Qgc3RkOjpzdHJpbmcgaWRlbnRfcGFkID0gIiAgICAiOwotc3RhdGljIGNvbnN0IGNoYXIgKmtleXdvcmRzW10gPSB7Ci0gICJwYWNrYWdlIiwgICJhcyIsICAgICAidHlwZWFsaWFzIiwgImNsYXNzIiwgICJ0aGlzIiwgICAic3VwZXIiLAotICAidmFsIiwgICAgICAidmFyIiwgICAgImZ1biIsICAgICAgICJmb3IiLCAgICAibnVsbCIsICAgInRydWUiLAotICAiZmFsc2UiLCAgICAiaXMiLCAgICAgImluIiwgICAgICAgICJ0aHJvdyIsICAicmV0dXJuIiwgImJyZWFrIiwKLSAgImNvbnRpbnVlIiwgIm9iamVjdCIsICJpZiIsICAgICAgICAidHJ5IiwgICAgImVsc2UiLCAgICJ3aGlsZSIsCi0gICJkbyIsICAgICAgICJ3aGVuIiwgICAiaW50ZXJmYWNlIiwgInR5cGVvZiIsICJBbnkiLCAgICAiQ2hhcmFjdGVyIgotfTsKLQotLy8gRXNjYXBlIEtleXdvcmRzCi1zdGF0aWMgc3RkOjpzdHJpbmcgRXNjKGNvbnN0IHN0ZDo6c3RyaW5nICZuYW1lKSB7Ci0gIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZW9mKGtleXdvcmRzKSAvIHNpemVvZihrZXl3b3Jkc1swXSk7IGkrKykgewotICAgIGlmIChuYW1lID09IGtleXdvcmRzW2ldKSB7Ci0gICAgICByZXR1cm4gQ29udmVydENhc2UobmFtZSArICJfIiwgQ2FzZTo6a0xvd2VyQ2FtZWwpOwotICAgIH0KLSAgfQotCi0gIHJldHVybiBDb252ZXJ0Q2FzZShuYW1lLCBDYXNlOjprTG93ZXJDYW1lbCk7CitzdGF0aWMgc3RkOjpzZXQ8c3RkOjpzdHJpbmc+IEtvdGxpbktleXdvcmRzKCkgeworICByZXR1cm4geyAicGFja2FnZSIsICAiYXMiLCAgICAgInR5cGVhbGlhcyIsICJjbGFzcyIsICAidGhpcyIsICAgInN1cGVyIiwKKyAgICAgICAgICAgInZhbCIsICAgICAgInZhciIsICAgICJmdW4iLCAgICAgICAiZm9yIiwgICAgIm51bGwiLCAgICJ0cnVlIiwKKyAgICAgICAgICAgImZhbHNlIiwgICAgImlzIiwgICAgICJpbiIsICAgICAgICAidGhyb3ciLCAgInJldHVybiIsICJicmVhayIsCisgICAgICAgICAgICJjb250aW51ZSIsICJvYmplY3QiLCAiaWYiLCAgICAgICAgInRyeSIsICAgICJlbHNlIiwgICAid2hpbGUiLAorICAgICAgICAgICAiZG8iLCAgICAgICAid2hlbiIsICAgImludGVyZmFjZSIsICJ0eXBlb2YiLCAiQW55IiwgICAgIkNoYXJhY3RlciIgfTsKIH0KIAorc3RhdGljIE5hbWVyOjpDb25maWcgS290bGluRGVmYXVsdENvbmZpZygpIHsKKyAgcmV0dXJuIHsgLyp0eXBlcz0qL0Nhc2U6OmtLZWVwLAorICAgICAgICAgICAvKmNvbnN0YW50cz0qL0Nhc2U6OmtLZWVwLAorICAgICAgICAgICAvKm1ldGhvZHM9Ki9DYXNlOjprTG93ZXJDYW1lbCwKKyAgICAgICAgICAgLypmdW5jdGlvbnM9Ki9DYXNlOjprS2VlcCwKKyAgICAgICAgICAgLypmaWVsZHM9Ki9DYXNlOjprTG93ZXJDYW1lbCwKKyAgICAgICAgICAgLyp2YXJpYWJsZXM9Ki9DYXNlOjprTG93ZXJDYW1lbCwKKyAgICAgICAgICAgLyp2YXJpYW50cz0qL0Nhc2U6OmtMb3dlckNhbWVsLAorICAgICAgICAgICAvKmVudW1fdmFyaWFudF9zZXBlcmF0b3I9Ki8iIiwgIC8vIEkuZS4gQ29uY2F0ZW5hdGUuCisgICAgICAgICAgIC8qZXNjYXBlX2tleXdvcmRzPSovTmFtZXI6OkNvbmZpZzo6RXNjYXBlOjpCZWZvcmVDb252ZXJ0aW5nQ2FzZSwKKyAgICAgICAgICAgLypuYW1lc3BhY2VzPSovQ2FzZTo6a0tlZXAsCisgICAgICAgICAgIC8qbmFtZXNwYWNlX3NlcGVyYXRvcj0qLyJfXyIsCisgICAgICAgICAgIC8qb2JqZWN0X3ByZWZpeD0qLyIiLAorICAgICAgICAgICAvKm9iamVjdF9zdWZmaXg9Ki8iVCIsCisgICAgICAgICAgIC8qa2V5d29yZF9wcmVmaXg9Ki8iIiwKKyAgICAgICAgICAgLyprZXl3b3JkX3N1ZmZpeD0qLyJfIiwKKyAgICAgICAgICAgLypmaWxlbmFtZXM9Ki9DYXNlOjprS2VlcCwKKyAgICAgICAgICAgLypkaXJlY3Rvcmllcz0qL0Nhc2U6OmtLZWVwLAorICAgICAgICAgICAvKm91dHB1dF9wYXRoPSovIiIsCisgICAgICAgICAgIC8qZmlsZW5hbWVfc3VmZml4PSovIiIsCisgICAgICAgICAgIC8qZmlsZW5hbWVfZXh0ZW5zaW9uPSovIi5rdCIgfTsKK30KK30gLy8gbmFtZXNwYWNlCisKIGNsYXNzIEtvdGxpbkdlbmVyYXRvciA6IHB1YmxpYyBCYXNlR2VuZXJhdG9yIHsKICBwdWJsaWM6CiAgIEtvdGxpbkdlbmVyYXRvcihjb25zdCBQYXJzZXIgJnBhcnNlciwgY29uc3Qgc3RkOjpzdHJpbmcgJnBhdGgsCiAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyAmZmlsZV9uYW1lKQogICAgICAgOiBCYXNlR2VuZXJhdG9yKHBhcnNlciwgcGF0aCwgZmlsZV9uYW1lLCAiIiwgIi4iLCAia3QiKSwKLSAgICAgICAgY3VyX25hbWVfc3BhY2VfKG51bGxwdHIpIHt9CisgICAgICAgIG5hbWVyXyhXaXRoRmxhZ09wdGlvbnMoS290bGluRGVmYXVsdENvbmZpZygpLCBwYXJzZXIub3B0cywgcGF0aCksCisgICAgICAgICAgICAgICBLb3RsaW5LZXl3b3JkcygpKSB7fQogCiAgIEtvdGxpbkdlbmVyYXRvciAmb3BlcmF0b3I9KGNvbnN0IEtvdGxpbkdlbmVyYXRvciAmKTsKICAgYm9vbCBnZW5lcmF0ZSgpIEZMQVRCVUZGRVJTX09WRVJSSURFIHsKICAgICBzdGQ6OnN0cmluZyBvbmVfZmlsZV9jb2RlOwogCi0gICAgY3VyX25hbWVfc3BhY2VfID0gcGFyc2VyXy5jdXJyZW50X25hbWVzcGFjZV87CiAgICAgZm9yIChhdXRvIGl0ID0gcGFyc2VyXy5lbnVtc18udmVjLmJlZ2luKCk7IGl0ICE9IHBhcnNlcl8uZW51bXNfLnZlYy5lbmQoKTsKICAgICAgICAgICsraXQpIHsKICAgICAgIENvZGVXcml0ZXIgZW51bVdyaXRlcihpZGVudF9wYWQpOwogICAgICAgYXV0byAmZW51bV9kZWYgPSAqKml0OwotICAgICAgaWYgKCFwYXJzZXJfLm9wdHMub25lX2ZpbGUpIGN1cl9uYW1lX3NwYWNlXyA9IGVudW1fZGVmLmRlZmluZWRfbmFtZXNwYWNlOwogICAgICAgR2VuRW51bShlbnVtX2RlZiwgZW51bVdyaXRlcik7CiAgICAgICBpZiAocGFyc2VyXy5vcHRzLm9uZV9maWxlKSB7CiAgICAgICAgIG9uZV9maWxlX2NvZGUgKz0gZW51bVdyaXRlci5Ub1N0cmluZygpOwpAQCAtODUsOCArMTAwLDYgQEAKICAgICAgICAgIGl0ICE9IHBhcnNlcl8uc3RydWN0c18udmVjLmVuZCgpOyArK2l0KSB7CiAgICAgICBDb2RlV3JpdGVyIHN0cnVjdFdyaXRlcihpZGVudF9wYWQpOwogICAgICAgYXV0byAmc3RydWN0X2RlZiA9ICoqaXQ7Ci0gICAgICBpZiAoIXBhcnNlcl8ub3B0cy5vbmVfZmlsZSkKLSAgICAgICAgY3VyX25hbWVfc3BhY2VfID0gc3RydWN0X2RlZi5kZWZpbmVkX25hbWVzcGFjZTsKICAgICAgIEdlblN0cnVjdChzdHJ1Y3RfZGVmLCBzdHJ1Y3RXcml0ZXIsIHBhcnNlcl8ub3B0cyk7CiAgICAgICBpZiAocGFyc2VyXy5vcHRzLm9uZV9maWxlKSB7CiAgICAgICAgIG9uZV9maWxlX2NvZGUgKz0gc3RydWN0V3JpdGVyLlRvU3RyaW5nKCk7CkBAIC0xMjQsMTQgKzEzNywxMyBAQAogICAgICAgY29kZSArPSAiaW1wb3J0IGNvbS5nb29nbGUuZmxhdGJ1ZmZlcnMuKlxuXG4iOwogICAgIH0KICAgICBjb2RlICs9IGNsYXNzY29kZTsKLSAgICBhdXRvIGZpbGVuYW1lID0gTmFtZXNwYWNlRGlyKG5zKSArIGRlZm5hbWUgKyAiLmt0IjsKKyAgICBjb25zdCBzdGQ6OnN0cmluZyBkaXJzID0gbmFtZXJfLkRpcmVjdG9yaWVzKG5zKTsKKyAgICBFbnN1cmVEaXJFeGlzdHMoZGlycyk7CisgICAgY29uc3Qgc3RkOjpzdHJpbmcgZmlsZW5hbWUgPQorICAgICAgICBkaXJzICsgbmFtZXJfLkZpbGUoZGVmbmFtZSwgLypza2lwcz0qL1NraXBGaWxlOjpTdWZmaXgpOwogICAgIHJldHVybiBTYXZlRmlsZShmaWxlbmFtZS5jX3N0cigpLCBjb2RlLCBmYWxzZSk7CiAgIH0KIAotICBjb25zdCBOYW1lc3BhY2UgKkN1cnJlbnROYW1lU3BhY2UoKSBjb25zdCBGTEFUQlVGRkVSU19PVkVSUklERSB7Ci0gICAgcmV0dXJuIGN1cl9uYW1lX3NwYWNlXzsKLSAgfQotCiAgIHN0YXRpYyBib29sIElzRW51bShjb25zdCBUeXBlICZ0eXBlKSB7CiAgICAgcmV0dXJuIHR5cGUuZW51bV9kZWYgIT0gbnVsbHB0ciAmJiBJc0ludGVnZXIodHlwZS5iYXNlX3R5cGUpOwogICB9CkBAIC0yNjEsNyArMjczLDcgQEAKICAgICBHZW5lcmF0ZUNvbW1lbnQoZW51bV9kZWYuZG9jX2NvbW1lbnQsIHdyaXRlciwgJmNvbW1lbnRfY29uZmlnKTsKIAogICAgIHdyaXRlciArPSAiQFN1cHByZXNzKFwidW51c2VkXCIpIjsKLSAgICB3cml0ZXIgKz0gImNsYXNzICIgKyBFc2MoZW51bV9kZWYubmFtZSkgKyAiIHByaXZhdGUgY29uc3RydWN0b3IoKSB7IjsKKyAgICB3cml0ZXIgKz0gImNsYXNzICIgKyBuYW1lcl8uVHlwZShlbnVtX2RlZikgKyAiIHByaXZhdGUgY29uc3RydWN0b3IoKSB7IjsKICAgICB3cml0ZXIuSW5jcmVtZW50SWRlbnRMZXZlbCgpOwogCiAgICAgR2VuZXJhdGVDb21wYW5pb25PYmplY3Qod3JpdGVyLCBbJl0oKSB7CkBAIC0yNzIsNyArMjg0LDcgQEAKICAgICAgICAgYXV0byBmaWVsZF90eXBlID0gR2VuVHlwZUJhc2ljKGVudW1fZGVmLnVuZGVybHlpbmdfdHlwZS5iYXNlX3R5cGUpOwogICAgICAgICBhdXRvIHZhbCA9IGVudW1fZGVmLlRvU3RyaW5nKGV2KTsKICAgICAgICAgYXV0byBzdWZmaXggPSBMaXRlcmFsU3VmZml4KGVudW1fZGVmLnVuZGVybHlpbmdfdHlwZS5iYXNlX3R5cGUpOwotICAgICAgICB3cml0ZXIuU2V0VmFsdWUoIm5hbWUiLCBFc2MoZXYubmFtZSkpOworICAgICAgICB3cml0ZXIuU2V0VmFsdWUoIm5hbWUiLCBuYW1lcl8uTGVnYWN5S290bGluVmFyaWFudChldikpOwogICAgICAgICB3cml0ZXIuU2V0VmFsdWUoInR5cGUiLCBmaWVsZF90eXBlKTsKICAgICAgICAgd3JpdGVyLlNldFZhbHVlKCJ2YWwiLCB2YWwgKyBzdWZmaXgpOwogICAgICAgICBHZW5lcmF0ZUNvbW1lbnQoZXYuZG9jX2NvbW1lbnQsIHdyaXRlciwgJmNvbW1lbnRfY29uZmlnKTsKQEAgLTMzOSw4ICszNTEsOCBAQAogICAgICAgY2FzZSBCQVNFX1RZUEVfVVRZUEU6IHJldHVybiBiYl92YXJfbmFtZSArICIuZ2V0IjsKICAgICAgIGNhc2UgQkFTRV9UWVBFX0JPT0w6IHJldHVybiAiMC50b0J5dGUoKSAhPSAiICsgYmJfdmFyX25hbWUgKyAiLmdldCI7CiAgICAgICBkZWZhdWx0OgotICAgICAgICByZXR1cm4gYmJfdmFyX25hbWUgKyAiLmdldCIgKwotICAgICAgICAgICAgICAgQ29udmVydENhc2UoR2VuVHlwZUJhc2ljKHR5cGUuYmFzZV90eXBlKSwgQ2FzZTo6a1VwcGVyQ2FtZWwpOworICAgICAgICByZXR1cm4gYmJfdmFyX25hbWUgKyAiLiIgKworICAgICAgICAgICAgICAgbmFtZXJfLk1ldGhvZCgiZ2V0IiwgR2VuVHlwZUJhc2ljKHR5cGUuYmFzZV90eXBlKSk7CiAgICAgfQogICB9CiAKQEAgLTM2MSw4ICszNzMsNyBAQAogICAgICAgICBjYXNlIEJBU0VfVFlQRV9OT05FOgogICAgICAgICBjYXNlIEJBU0VfVFlQRV9VVFlQRTogcmV0dXJuICJiYi5wdXQiOwogICAgICAgICBkZWZhdWx0OgotICAgICAgICAgIHJldHVybiAiYmIucHV0IiArCi0gICAgICAgICAgICAgICAgIENvbnZlcnRDYXNlKEdlblR5cGVCYXNpYyh0eXBlLmJhc2VfdHlwZSksIENhc2U6OmtVcHBlckNhbWVsKTsKKyAgICAgICAgICByZXR1cm4gImJiLiIgKyBuYW1lcl8uTWV0aG9kKCJwdXQiLCBHZW5UeXBlQmFzaWModHlwZS5iYXNlX3R5cGUpKTsKICAgICAgIH0KICAgICB9CiAgICAgcmV0dXJuICIiOwpAQCAtMzg1LDggKzM5Niw4IEBACiAKICAgLy8gUmVjdXJzaXZlbHkgZ2VuZXJhdGUgYXJndW1lbnRzIGZvciBhIGNvbnN0cnVjdG9yLCB0byBkZWFsIHdpdGggbmVzdGVkCiAgIC8vIHN0cnVjdHMuCi0gIHN0YXRpYyB2b2lkIEdlblN0cnVjdEFyZ3MoY29uc3QgU3RydWN0RGVmICZzdHJ1Y3RfZGVmLCBDb2RlV3JpdGVyICZ3cml0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqbmFtZXByZWZpeCkgeworICB2b2lkIEdlblN0cnVjdEFyZ3MoY29uc3QgU3RydWN0RGVmICZzdHJ1Y3RfZGVmLCBDb2RlV3JpdGVyICZ3cml0ZXIsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpuYW1lcHJlZml4KSBjb25zdCB7CiAgICAgZm9yIChhdXRvIGl0ID0gc3RydWN0X2RlZi5maWVsZHMudmVjLmJlZ2luKCk7CiAgICAgICAgICBpdCAhPSBzdHJ1Y3RfZGVmLmZpZWxkcy52ZWMuZW5kKCk7ICsraXQpIHsKICAgICAgIGF1dG8gJmZpZWxkID0gKippdDsKQEAgLTM5OSw3ICs0MTAsNyBAQAogICAgICAgICAgICAgICAgICAgICAgIChuYW1lcHJlZml4ICsgKGZpZWxkLm5hbWUgKyAiXyIpKS5jX3N0cigpKTsKICAgICAgIH0gZWxzZSB7CiAgICAgICAgIHdyaXRlciArPSBzdGQ6OnN0cmluZygiLCAiKSArIG5hbWVwcmVmaXggKyAiXFwiOwotICAgICAgICB3cml0ZXIgKz0gQ29udmVydENhc2UoZmllbGQubmFtZSwgQ2FzZTo6a1VwcGVyQ2FtZWwpICsgIjogXFwiOworICAgICAgICB3cml0ZXIgKz0gbmFtZXJfLkZpZWxkKGZpZWxkKSArICI6IFxcIjsKICAgICAgICAgd3JpdGVyICs9IEdlblR5cGVCYXNpYyhmaWVsZC52YWx1ZS50eXBlLmJhc2VfdHlwZSkgKyAiXFwiOwogICAgICAgfQogICAgIH0KQEAgLTQwOCw4ICs0MTksOCBAQAogICAvLyBSZWN1c2l2ZWx5IGdlbmVyYXRlIHN0cnVjdCBjb25zdHJ1Y3Rpb24gc3RhdGVtZW50cyBvZiB0aGUgZm9ybToKICAgLy8gYnVpbGRlci5wdXRUeXBlKG5hbWUpOwogICAvLyBhbmQgaW5zZXJ0IG1hbnVhbCBwYWRkaW5nLgotICBzdGF0aWMgdm9pZCBHZW5TdHJ1Y3RCb2R5KGNvbnN0IFN0cnVjdERlZiAmc3RydWN0X2RlZiwgQ29kZVdyaXRlciAmd3JpdGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKm5hbWVwcmVmaXgpIHsKKyAgdm9pZCBHZW5TdHJ1Y3RCb2R5KGNvbnN0IFN0cnVjdERlZiAmc3RydWN0X2RlZiwgQ29kZVdyaXRlciAmd3JpdGVyLAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqbmFtZXByZWZpeCkgY29uc3QgewogICAgIHdyaXRlci5TZXRWYWx1ZSgiYWxpZ24iLCBOdW1Ub1N0cmluZyhzdHJ1Y3RfZGVmLm1pbmFsaWduKSk7CiAgICAgd3JpdGVyLlNldFZhbHVlKCJzaXplIiwgTnVtVG9TdHJpbmcoc3RydWN0X2RlZi5ieXRlc2l6ZSkpOwogICAgIHdyaXRlciArPSAiYnVpbGRlci5wcmVwKHt7YWxpZ259fSwge3tzaXplfX0pIjsKQEAgLTQyNiw4ICs0MzcsNyBAQAogICAgICAgICAgICAgICAgICAgICAgIChuYW1lcHJlZml4ICsgKGZpZWxkLm5hbWUgKyAiXyIpKS5jX3N0cigpKTsKICAgICAgIH0gZWxzZSB7CiAgICAgICAgIHdyaXRlci5TZXRWYWx1ZSgidHlwZSIsIEdlbk1ldGhvZChmaWVsZC52YWx1ZS50eXBlKSk7Ci0gICAgICAgIHdyaXRlci5TZXRWYWx1ZSgiYXJnbmFtZSIsIG5hbWVwcmVmaXggKyBDb252ZXJ0Q2FzZShFc2MoZmllbGQubmFtZSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDYXNlOjprTG93ZXJDYW1lbCkpOworICAgICAgICB3cml0ZXIuU2V0VmFsdWUoImFyZ25hbWUiLCBuYW1lcHJlZml4ICsgbmFtZXJfLlZhcmlhYmxlKGZpZWxkKSk7CiAgICAgICAgIHdyaXRlci5TZXRWYWx1ZSgiY2FzdCIsIENhc3RUb1NpZ25lZChmaWVsZC52YWx1ZS50eXBlKSk7CiAgICAgICAgIHdyaXRlciArPSAiYnVpbGRlci5wdXR7e3R5cGV9fSh7e2FyZ25hbWV9fXt7Y2FzdH19KSI7CiAgICAgICB9CkBAIC00NjEsNyArNDcxLDcgQEAKICAgICBHZW5lcmF0ZUNvbW1lbnQoc3RydWN0X2RlZi5kb2NfY29tbWVudCwgd3JpdGVyLCAmY29tbWVudF9jb25maWcpOwogICAgIGF1dG8gZml4ZWQgPSBzdHJ1Y3RfZGVmLmZpeGVkOwogCi0gICAgd3JpdGVyLlNldFZhbHVlKCJzdHJ1Y3RfbmFtZSIsIEVzYyhzdHJ1Y3RfZGVmLm5hbWUpKTsKKyAgICB3cml0ZXIuU2V0VmFsdWUoInN0cnVjdF9uYW1lIiwgbmFtZXJfLlR5cGUoc3RydWN0X2RlZikpOwogICAgIHdyaXRlci5TZXRWYWx1ZSgic3VwZXJjbGFzcyIsIGZpeGVkID8gIlN0cnVjdCIgOiAiVGFibGUiKTsKIAogICAgIHdyaXRlciArPSAiQFN1cHByZXNzKFwidW51c2VkXCIpIjsKQEAgLTQ3Nyw3ICs0ODcsNyBAQAogCiAgICAgICAvLyBHZW5lcmF0ZSBhc3NpZ24gbWV0aG9kCiAgICAgICBHZW5lcmF0ZUZ1bih3cml0ZXIsICJfX2Fzc2lnbiIsICJfaTogSW50LCBfYmI6IEJ5dGVCdWZmZXIiLAotICAgICAgICAgICAgICAgICAgRXNjKHN0cnVjdF9kZWYubmFtZSksIFsmXSgpIHsKKyAgICAgICAgICAgICAgICAgIG5hbWVyXy5UeXBlKHN0cnVjdF9kZWYpLCBbJl0oKSB7CiAgICAgICAgICAgICAgICAgICAgIHdyaXRlciArPSAiX19pbml0KF9pLCBfYmIpIjsKICAgICAgICAgICAgICAgICAgICAgd3JpdGVyICs9ICJyZXR1cm4gdGhpcyI7CiAgICAgICAgICAgICAgICAgICB9KTsKQEAgLTQ5MCwxNSArNTAwLDE1IEBACiAgICAgICAgIGlmICghc3RydWN0X2RlZi5maXhlZCkgewogICAgICAgICAgIEZpZWxkRGVmICprZXlfZmllbGQgPSBudWxscHRyOwogCi0gICAgICAgICAgLy8gR2VuZXJhdGUgdmVyc29uIGNoZWNrIG1ldGhvZC4KKyAgICAgICAgICAvLyBHZW5lcmF0ZSB2ZXJzaW9uIGNoZWNrIG1ldGhvZC4KICAgICAgICAgICAvLyBGb3JjZSBjb21waWxlIHRpbWUgZXJyb3IgaWYgbm90IHVzaW5nIHRoZSBzYW1lIHZlcnNpb24KICAgICAgICAgICAvLyBydW50aW1lLgogICAgICAgICAgIEdlbmVyYXRlRnVuT25lTGluZSgKICAgICAgICAgICAgICAgd3JpdGVyLCAidmFsaWRhdGVWZXJzaW9uIiwgIiIsICIiLAotICAgICAgICAgICAgICBbJl0oKSB7IHdyaXRlciArPSAiQ29uc3RhbnRzLkZMQVRCVUZGRVJTXzJfMF8wKCkiOyB9LAorICAgICAgICAgICAgICBbJl0oKSB7IHdyaXRlciArPSAiQ29uc3RhbnRzLkZMQVRCVUZGRVJTXzJfMF84KCkiOyB9LAogICAgICAgICAgICAgICBvcHRpb25zLmdlbl9qdm1zdGF0aWMpOwogCi0gICAgICAgICAgR2VuZXJhdGVHZXRSb290QXNBY2Nlc3NvcnMoRXNjKHN0cnVjdF9kZWYubmFtZSksIHdyaXRlciwgb3B0aW9ucyk7CisgICAgICAgICAgR2VuZXJhdGVHZXRSb290QXNBY2Nlc3NvcnMobmFtZXJfLlR5cGUoc3RydWN0X2RlZiksIHdyaXRlciwgb3B0aW9ucyk7CiAgICAgICAgICAgR2VuZXJhdGVCdWZmZXJIYXNJZGVudGlmaWVyKHN0cnVjdF9kZWYsIHdyaXRlciwgb3B0aW9ucyk7CiAgICAgICAgICAgR2VuZXJhdGVUYWJsZUNyZWF0b3Ioc3RydWN0X2RlZiwgd3JpdGVyLCBvcHRpb25zKTsKIApAQCAtNTUwLDcgKzU2MCw3IEBACiAgIHZvaWQgR2VuZXJhdGVMb29rdXBCeUtleShGaWVsZERlZiAqa2V5X2ZpZWxkLCBTdHJ1Y3REZWYgJnN0cnVjdF9kZWYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2RlV3JpdGVyICZ3cml0ZXIsIGNvbnN0IElETE9wdGlvbnMgb3B0aW9ucykgY29uc3QgewogICAgIHN0ZDo6c3RyaW5nc3RyZWFtIHBhcmFtczsKLSAgICBwYXJhbXMgPDwgIm9iajogIiA8PCBFc2Moc3RydWN0X2RlZi5uYW1lKSA8PCAiPyIKKyAgICBwYXJhbXMgPDwgIm9iajogIiA8PCBuYW1lcl8uVHlwZShzdHJ1Y3RfZGVmKSA8PCAiPyIKICAgICAgICAgICAgPDwgIiwgIjsKICAgICBwYXJhbXMgPDwgInZlY3RvckxvY2F0aW9uOiBJbnQsICI7CiAgICAgcGFyYW1zIDw8ICJrZXk6ICIgPDwgR2VuVHlwZUdldChrZXlfZmllbGQtPnZhbHVlLnR5cGUpIDw8ICIsICI7CkBAIC01NTgsNyArNTY4LDcgQEAKIAogICAgIGF1dG8gc3RhdGVtZW50cyA9IFsmXSgpIHsKICAgICAgIGF1dG8gYmFzZV90eXBlID0ga2V5X2ZpZWxkLT52YWx1ZS50eXBlLmJhc2VfdHlwZTsKLSAgICAgIHdyaXRlci5TZXRWYWx1ZSgic3RydWN0X25hbWUiLCBFc2Moc3RydWN0X2RlZi5uYW1lKSk7CisgICAgICB3cml0ZXIuU2V0VmFsdWUoInN0cnVjdF9uYW1lIiwgbmFtZXJfLlR5cGUoc3RydWN0X2RlZikpOwogICAgICAgaWYgKGJhc2VfdHlwZSA9PSBCQVNFX1RZUEVfU1RSSU5HKSB7CiAgICAgICAgIHdyaXRlciArPQogICAgICAgICAgICAgInZhbCBieXRlS2V5ID0ga2V5LiIKQEAgLTYwNCw3ICs2MTQsOCBAQAogICAgICAgd3JpdGVyICs9ICJyZXR1cm4gbnVsbCI7CiAgICAgfTsKICAgICBHZW5lcmF0ZUZ1bih3cml0ZXIsICJfX2xvb2t1cF9ieV9rZXkiLCBwYXJhbXMuc3RyKCksCi0gICAgICAgICAgICAgICAgRXNjKHN0cnVjdF9kZWYubmFtZSkgKyAiPyIsIHN0YXRlbWVudHMsIG9wdGlvbnMuZ2VuX2p2bXN0YXRpYyk7CisgICAgICAgICAgICAgICAgbmFtZXJfLlR5cGUoc3RydWN0X2RlZikgKyAiPyIsIHN0YXRlbWVudHMsCisgICAgICAgICAgICAgICAgb3B0aW9ucy5nZW5fanZtc3RhdGljKTsKICAgfQogCiAgIHZvaWQgR2VuZXJhdGVGaW5pc2hTaXplUHJlZml4ZWQoU3RydWN0RGVmICZzdHJ1Y3RfZGVmLApAQCAtNjEzLDcgKzYyNCw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSURMT3B0aW9ucyBvcHRpb25zKSBjb25zdCB7CiAgICAgYXV0byBpZCA9IGlkZW50aWZpZXIubGVuZ3RoKCkgPiAwID8gIiwgXCIiICsgaWRlbnRpZmllciArICJcIiIgOiAiIjsKICAgICBhdXRvIHBhcmFtcyA9ICJidWlsZGVyOiBGbGF0QnVmZmVyQnVpbGRlciwgb2Zmc2V0OiBJbnQiOwotICAgIGF1dG8gbWV0aG9kX25hbWUgPSAiZmluaXNoU2l6ZVByZWZpeGVkIiArIEVzYyhzdHJ1Y3RfZGVmLm5hbWUpICsgIkJ1ZmZlciI7CisgICAgYXV0byBtZXRob2RfbmFtZSA9CisgICAgICAgIG5hbWVyXy5MZWdhY3lKYXZhTWV0aG9kMigiZmluaXNoU2l6ZVByZWZpeGVkIiwgc3RydWN0X2RlZiwgIkJ1ZmZlciIpOwogICAgIEdlbmVyYXRlRnVuT25lTGluZSgKICAgICAgICAgd3JpdGVyLCBtZXRob2RfbmFtZSwgcGFyYW1zLCAiIiwKICAgICAgICAgWyZdKCkgeyB3cml0ZXIgKz0gImJ1aWxkZXIuZmluaXNoU2l6ZVByZWZpeGVkKG9mZnNldCIgKyBpZCArICIpIjsgfSwKQEAgLTYyNSw3ICs2MzcsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElETE9wdGlvbnMgb3B0aW9ucykgY29uc3QgewogICAgIGF1dG8gaWQgPSBpZGVudGlmaWVyLmxlbmd0aCgpID4gMCA/ICIsIFwiIiArIGlkZW50aWZpZXIgKyAiXCIiIDogIiI7CiAgICAgYXV0byBwYXJhbXMgPSAiYnVpbGRlcjogRmxhdEJ1ZmZlckJ1aWxkZXIsIG9mZnNldDogSW50IjsKLSAgICBhdXRvIG1ldGhvZF9uYW1lID0gImZpbmlzaCIgKyBFc2Moc3RydWN0X2RlZi5uYW1lKSArICJCdWZmZXIiOworICAgIGF1dG8gbWV0aG9kX25hbWUgPQorICAgICAgICBuYW1lcl8uTGVnYWN5S290bGluTWV0aG9kKCJmaW5pc2giLCBzdHJ1Y3RfZGVmLCAiQnVmZmVyIik7CiAgICAgR2VuZXJhdGVGdW5PbmVMaW5lKAogICAgICAgICB3cml0ZXIsIG1ldGhvZF9uYW1lLCBwYXJhbXMsICIiLAogICAgICAgICBbJl0oKSB7IHdyaXRlciArPSAiYnVpbGRlci5maW5pc2gob2Zmc2V0IiArIGlkICsgIikiOyB9LApAQCAtNjM1LDcgKzY0OCw3IEBACiAgIHZvaWQgR2VuZXJhdGVFbmRTdHJ1Y3RNZXRob2QoU3RydWN0RGVmICZzdHJ1Y3RfZGVmLCBDb2RlV3JpdGVyICZ3cml0ZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSURMT3B0aW9ucyBvcHRpb25zKSBjb25zdCB7CiAgICAgLy8gR2VuZXJhdGUgZW5ke3tUYWJsZU5hbWV9fShidWlsZGVyOiBGbGF0QnVmZmVyQnVpbGRlcikgbWV0aG9kCi0gICAgYXV0byBuYW1lID0gImVuZCIgKyBFc2Moc3RydWN0X2RlZi5uYW1lKTsKKyAgICBhdXRvIG5hbWUgPSBuYW1lcl8uTGVnYWN5SmF2YU1ldGhvZDIoImVuZCIsIHN0cnVjdF9kZWYsICIiKTsKICAgICBhdXRvIHBhcmFtcyA9ICJidWlsZGVyOiBGbGF0QnVmZmVyQnVpbGRlciI7CiAgICAgYXV0byByZXR1cm5zID0gIkludCI7CiAgICAgYXV0byBmaWVsZF92ZWMgPSBzdHJ1Y3RfZGVmLmZpZWxkcy52ZWM7CkBAIC02NjEsOCArNjc0LDcgQEAKICAgdm9pZCBHZW5lcmF0ZUNyZWF0ZVZlY3RvckZpZWxkKEZpZWxkRGVmICZmaWVsZCwgQ29kZVdyaXRlciAmd3JpdGVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSURMT3B0aW9ucyBvcHRpb25zKSBjb25zdCB7CiAgICAgYXV0byB2ZWN0b3JfdHlwZSA9IGZpZWxkLnZhbHVlLnR5cGUuVmVjdG9yVHlwZSgpOwotICAgIGF1dG8gbWV0aG9kX25hbWUgPQotICAgICAgICAiY3JlYXRlIiArIENvbnZlcnRDYXNlKEVzYyhmaWVsZC5uYW1lKSwgQ2FzZTo6a1VwcGVyQ2FtZWwpICsgIlZlY3RvciI7CisgICAgYXV0byBtZXRob2RfbmFtZSA9IG5hbWVyXy5NZXRob2QoImNyZWF0ZSIsIGZpZWxkLCAidmVjdG9yIik7CiAgICAgYXV0byBwYXJhbXMgPSAiYnVpbGRlcjogRmxhdEJ1ZmZlckJ1aWxkZXIsIGRhdGE6ICIgKwogICAgICAgICAgICAgICAgICAgR2VuVHlwZUJhc2ljKHZlY3Rvcl90eXBlLmJhc2VfdHlwZSkgKyAiQXJyYXkiOwogICAgIHdyaXRlci5TZXRWYWx1ZSgic2l6ZSIsIE51bVRvU3RyaW5nKElubGluZVNpemUodmVjdG9yX3R5cGUpKSk7CkBAIC02OTQsOSArNzA2LDcgQEAKICAgICB3cml0ZXIuU2V0VmFsdWUoImFsaWduIiwgTnVtVG9TdHJpbmcoSW5saW5lQWxpZ25tZW50KHZlY3Rvcl90eXBlKSkpOwogCiAgICAgR2VuZXJhdGVGdW5PbmVMaW5lKAotICAgICAgICB3cml0ZXIsCi0gICAgICAgICJzdGFydCIgKyBDb252ZXJ0Q2FzZShFc2MoZmllbGQubmFtZSkgKyAiVmVjdG9yIiwgQ2FzZTo6a1VwcGVyQ2FtZWwpLAotICAgICAgICBwYXJhbXMsICIiLAorICAgICAgICB3cml0ZXIsIG5hbWVyXy5NZXRob2QoInN0YXJ0IiwgZmllbGQsICJWZWN0b3IiKSwgcGFyYW1zLCAiIiwKICAgICAgICAgWyZdKCkgewogICAgICAgICAgIHdyaXRlciArPSAiYnVpbGRlci5zdGFydFZlY3Rvcih7e3NpemV9fSwgbnVtRWxlbXMsIHt7YWxpZ259fSkiOwogICAgICAgICB9LApAQCAtNzA2LDI1ICs3MTYsMzYgQEAKICAgdm9pZCBHZW5lcmF0ZUFkZEZpZWxkKHN0ZDo6c3RyaW5nIGZpZWxkX3BvcywgRmllbGREZWYgJmZpZWxkLAogICAgICAgICAgICAgICAgICAgICAgICAgQ29kZVdyaXRlciAmd3JpdGVyLCBjb25zdCBJRExPcHRpb25zIG9wdGlvbnMpIGNvbnN0IHsKICAgICBhdXRvIGZpZWxkX3R5cGUgPSBHZW5UeXBlQmFzaWMoZmllbGQudmFsdWUudHlwZS5iYXNlX3R5cGUpOwotICAgIGF1dG8gc2Vjb25kQXJnID0KLSAgICAgICAgQ29udmVydENhc2UoRXNjKGZpZWxkLm5hbWUpLCBDYXNlOjprTG93ZXJDYW1lbCkgKyAiOiAiICsgZmllbGRfdHlwZTsKKyAgICBhdXRvIHNlY29uZEFyZyA9IG5hbWVyXy5WYXJpYWJsZShmaWVsZC5uYW1lKSArICI6ICIgKyBmaWVsZF90eXBlOwogCi0gICAgR2VuZXJhdGVGdW5PbmVMaW5lKAotICAgICAgICB3cml0ZXIsICJhZGQiICsgQ29udmVydENhc2UoRXNjKGZpZWxkLm5hbWUpLCBDYXNlOjprVXBwZXJDYW1lbCksCi0gICAgICAgICJidWlsZGVyOiBGbGF0QnVmZmVyQnVpbGRlciwgIiArIHNlY29uZEFyZywgIiIsCi0gICAgICAgIFsmXSgpIHsKLSAgICAgICAgICBhdXRvIG1ldGhvZCA9IEdlbk1ldGhvZChmaWVsZC52YWx1ZS50eXBlKTsKLSAgICAgICAgICB3cml0ZXIuU2V0VmFsdWUoImZpZWxkX25hbWUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICBDb252ZXJ0Q2FzZShFc2MoZmllbGQubmFtZSksIENhc2U6OmtMb3dlckNhbWVsKSk7Ci0gICAgICAgICAgd3JpdGVyLlNldFZhbHVlKCJtZXRob2RfbmFtZSIsIG1ldGhvZCk7Ci0gICAgICAgICAgd3JpdGVyLlNldFZhbHVlKCJwb3MiLCBmaWVsZF9wb3MpOwotICAgICAgICAgIHdyaXRlci5TZXRWYWx1ZSgiZGVmYXVsdCIsIEdlbkZCQkRlZmF1bHRWYWx1ZShmaWVsZCkpOwotICAgICAgICAgIHdyaXRlci5TZXRWYWx1ZSgiY2FzdCIsIEdlbkZCQlZhbHVlQ2FzdChmaWVsZCkpOwotCi0gICAgICAgICAgd3JpdGVyICs9ICJidWlsZGVyLmFkZHt7bWV0aG9kX25hbWV9fSh7e3Bvc319LCBcXCI7Ci0gICAgICAgICAgd3JpdGVyICs9ICJ7e2ZpZWxkX25hbWV9fXt7Y2FzdH19LCB7e2RlZmF1bHR9fSkiOwotICAgICAgICB9LAotICAgICAgICBvcHRpb25zLmdlbl9qdm1zdGF0aWMpOworICAgIGF1dG8gY29udGVudCA9IFsmXSgpIHsKKyAgICAgIGF1dG8gbWV0aG9kID0gR2VuTWV0aG9kKGZpZWxkLnZhbHVlLnR5cGUpOworICAgICAgd3JpdGVyLlNldFZhbHVlKCJmaWVsZF9uYW1lIiwgbmFtZXJfLkZpZWxkKGZpZWxkKSk7CisgICAgICB3cml0ZXIuU2V0VmFsdWUoIm1ldGhvZF9uYW1lIiwgbWV0aG9kKTsKKyAgICAgIHdyaXRlci5TZXRWYWx1ZSgicG9zIiwgZmllbGRfcG9zKTsKKyAgICAgIHdyaXRlci5TZXRWYWx1ZSgiZGVmYXVsdCIsIEdlbkZCQkRlZmF1bHRWYWx1ZShmaWVsZCkpOworICAgICAgd3JpdGVyLlNldFZhbHVlKCJjYXN0IiwgR2VuRkJCVmFsdWVDYXN0KGZpZWxkKSk7CisgICAgICBpZiAoZmllbGQua2V5KSB7CisgICAgICAgIC8vIGZpZWxkIGhhcyBrZXkgYXR0cmlidXRlLCBzbyBhbHdheXMgbmVlZCB0byBleGlzdAorICAgICAgICAvLyBldmVuIGlmIGl0cyB2YWx1ZSBpcyBlcXVhbCB0byBkZWZhdWx0LgorICAgICAgICAvLyBHZW5lcmF0ZWQgY29kZSB3aWxsIGJ5cGFzcyBkZWZhdWx0IGNoZWNraW5nCisgICAgICAgIC8vIHJlc3VsdGluZyBpbiB7IGJ1aWxkZXIuYWRkU2hvcnQobmFtZSk7IHNsb3QoaWQpOyB9CisgICAgICAgIHdyaXRlciArPSAiYnVpbGRlci5hZGR7e21ldGhvZF9uYW1lfX0oe3tmaWVsZF9uYW1lfX17e2Nhc3R9fSkiOworICAgICAgICB3cml0ZXIgKz0gImJ1aWxkZXIuc2xvdCh7e3Bvc319KSI7CisgICAgICB9IGVsc2UgeworICAgICAgICB3cml0ZXIgKz0gImJ1aWxkZXIuYWRke3ttZXRob2RfbmFtZX19KHt7cG9zfX0sIFxcIjsKKyAgICAgICAgd3JpdGVyICs9ICJ7e2ZpZWxkX25hbWV9fXt7Y2FzdH19LCB7e2RlZmF1bHR9fSkiOworICAgICAgfQorICAgIH07CisgICAgYXV0byBzaWduYXR1cmUgPSBuYW1lcl8uTGVnYWN5S290bGluTWV0aG9kKCJhZGQiLCBmaWVsZCwgIiIpOworICAgIGF1dG8gcGFyYW1zID0gImJ1aWxkZXI6IEZsYXRCdWZmZXJCdWlsZGVyLCAiICsgc2Vjb25kQXJnOworICAgIGlmIChmaWVsZC5rZXkpIHsKKyAgICAgIEdlbmVyYXRlRnVuKHdyaXRlciwgc2lnbmF0dXJlLCBwYXJhbXMsICIiLCBjb250ZW50LAorICAgICAgICAgICAgICAgICAgb3B0aW9ucy5nZW5fanZtc3RhdGljKTsKKyAgICB9IGVsc2UgeworICAgICAgR2VuZXJhdGVGdW5PbmVMaW5lKHdyaXRlciwgc2lnbmF0dXJlLCBwYXJhbXMsICIiLCBjb250ZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMuZ2VuX2p2bXN0YXRpYyk7CisgICAgfQogICB9CiAKICAgc3RhdGljIHN0ZDo6c3RyaW5nIFRvU2lnbmVkVHlwZShjb25zdCBUeXBlICZ0eXBlKSB7CkBAIC03NjgsNyArNzg5LDggQEAKICAgdm9pZCBHZW5lcmF0ZVN0YXJ0U3RydWN0TWV0aG9kKFN0cnVjdERlZiAmc3RydWN0X2RlZiwgQ29kZVdyaXRlciAmY29kZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElETE9wdGlvbnMgb3B0aW9ucykgY29uc3QgewogICAgIEdlbmVyYXRlRnVuT25lTGluZSgKLSAgICAgICAgY29kZSwgInN0YXJ0IiArIEVzYyhzdHJ1Y3RfZGVmLm5hbWUpLCAiYnVpbGRlcjogRmxhdEJ1ZmZlckJ1aWxkZXIiLCAiIiwKKyAgICAgICAgY29kZSwgbmFtZXJfLkxlZ2FjeUphdmFNZXRob2QyKCJzdGFydCIsIHN0cnVjdF9kZWYsICIiKSwKKyAgICAgICAgImJ1aWxkZXI6IEZsYXRCdWZmZXJCdWlsZGVyIiwgIiIsCiAgICAgICAgIFsmXSgpIHsKICAgICAgICAgICBjb2RlICs9ICJidWlsZGVyLnN0YXJ0VGFibGUoIiArCiAgICAgICAgICAgICAgICAgICBOdW1Ub1N0cmluZyhzdHJ1Y3RfZGVmLmZpZWxkcy52ZWMuc2l6ZSgpKSArICIpIjsKQEAgLTgwMCwxMyArODIyLDEzIEBACiAgICAgICAvLyBHZW5lcmF0ZSBhIHRhYmxlIGNvbnN0cnVjdG9yIG9mIHRoZSBmb3JtOgogICAgICAgLy8gcHVibGljIHN0YXRpYyBpbnQgY3JlYXRlTmFtZShGbGF0QnVmZmVyQnVpbGRlciBidWlsZGVyLCBhcmdzLi4uKQogCi0gICAgICBhdXRvIG5hbWUgPSAiY3JlYXRlIiArIEVzYyhzdHJ1Y3RfZGVmLm5hbWUpOworICAgICAgYXV0byBuYW1lID0gbmFtZXJfLkxlZ2FjeUphdmFNZXRob2QyKCJjcmVhdGUiLCBzdHJ1Y3RfZGVmLCAiIik7CiAgICAgICBzdGQ6OnN0cmluZ3N0cmVhbSBwYXJhbXM7CiAgICAgICBwYXJhbXMgPDwgImJ1aWxkZXI6IEZsYXRCdWZmZXJCdWlsZGVyIjsKICAgICAgIGZvciAoYXV0byBpdCA9IGZpZWxkc192ZWMuYmVnaW4oKTsgaXQgIT0gZmllbGRzX3ZlYy5lbmQoKTsgKytpdCkgewogICAgICAgICBhdXRvICZmaWVsZCA9ICoqaXQ7CiAgICAgICAgIGlmIChmaWVsZC5kZXByZWNhdGVkKSBjb250aW51ZTsKLSAgICAgICAgcGFyYW1zIDw8ICIsICIgPDwgQ29udmVydENhc2UoRXNjKGZpZWxkLm5hbWUpLCBDYXNlOjprTG93ZXJDYW1lbCk7CisgICAgICAgIHBhcmFtcyA8PCAiLCAiIDw8IG5hbWVyXy5WYXJpYWJsZShmaWVsZCk7CiAgICAgICAgIGlmICghSXNTY2FsYXIoZmllbGQudmFsdWUudHlwZS5iYXNlX3R5cGUpKSB7CiAgICAgICAgICAgcGFyYW1zIDw8ICJPZmZzZXQ6ICI7CiAgICAgICAgIH0gZWxzZSB7CkBAIC04MzIsMTggKzg1NCwxNSBAQAogICAgICAgICAgICAgICAgIGF1dG8gYmFzZV90eXBlX3NpemUgPSBTaXplT2YoZmllbGQudmFsdWUudHlwZS5iYXNlX3R5cGUpOwogICAgICAgICAgICAgICAgIGlmICghZmllbGQuZGVwcmVjYXRlZCAmJgogICAgICAgICAgICAgICAgICAgICAoIXNvcnRieXNpemUgfHwgc2l6ZSA9PSBiYXNlX3R5cGVfc2l6ZSkpIHsKLSAgICAgICAgICAgICAgICAgIHdyaXRlci5TZXRWYWx1ZSgKLSAgICAgICAgICAgICAgICAgICAgICAiY2FtZWxfZmllbGRfbmFtZSIsCi0gICAgICAgICAgICAgICAgICAgICAgQ29udmVydENhc2UoRXNjKGZpZWxkLm5hbWUpLCBDYXNlOjprVXBwZXJDYW1lbCkpOwotICAgICAgICAgICAgICAgICAgd3JpdGVyLlNldFZhbHVlKCJmaWVsZF9uYW1lIiwgQ29udmVydENhc2UoRXNjKGZpZWxkLm5hbWUpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2FzZTo6a0xvd2VyQ2FtZWwpKTsKKyAgICAgICAgICAgICAgICAgIHdyaXRlci5TZXRWYWx1ZSgiZmllbGRfbmFtZSIsIG5hbWVyXy5GaWVsZChmaWVsZCkpOwogCiAgICAgICAgICAgICAgICAgICAvLyB3ZSB3cmFwIG9uIG51bGwgY2hlY2sgZm9yIHNjYWxhciBvcHRpb25hbHMKICAgICAgICAgICAgICAgICAgIHdyaXRlciArPSBmaWVsZC5Jc1NjYWxhck9wdGlvbmFsKCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAie3tmaWVsZF9uYW1lfX0/LnJ1biB7IFxcIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICJcXCI7CiAKLSAgICAgICAgICAgICAgICAgIHdyaXRlciArPSAiYWRke3tjYW1lbF9maWVsZF9uYW1lfX0oYnVpbGRlciwge3tmaWVsZF9uYW1lfX1cXCI7CisgICAgICAgICAgICAgICAgICB3cml0ZXIgKz0gbmFtZXJfLkxlZ2FjeUtvdGxpbk1ldGhvZCgiYWRkIiwgZmllbGQsICIiKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIihidWlsZGVyLCB7e2ZpZWxkX25hbWV9fVxcIjsKICAgICAgICAgICAgICAgICAgIGlmICghSXNTY2FsYXIoZmllbGQudmFsdWUudHlwZS5iYXNlX3R5cGUpKSB7CiAgICAgICAgICAgICAgICAgICAgIHdyaXRlciArPSAiT2Zmc2V0XFwiOwogICAgICAgICAgICAgICAgICAgfQpAQCAtODYzLDcgKzg4Miw3IEBACiAgICAgLy8gQ2hlY2sgaWYgYSBidWZmZXIgaGFzIHRoZSBpZGVudGlmaWVyLgogICAgIGlmIChwYXJzZXJfLnJvb3Rfc3RydWN0X2RlZl8gIT0gJnN0cnVjdF9kZWYgfHwgIWZpbGVfaWRlbnRpZmllci5sZW5ndGgoKSkKICAgICAgIHJldHVybjsKLSAgICBhdXRvIG5hbWUgPSBDb252ZXJ0Q2FzZShFc2Moc3RydWN0X2RlZi5uYW1lKSwgQ2FzZTo6a0xvd2VyQ2FtZWwpOworICAgIGF1dG8gbmFtZSA9IG5hbWVyXy5GdW5jdGlvbihzdHJ1Y3RfZGVmKTsKICAgICBHZW5lcmF0ZUZ1bk9uZUxpbmUoCiAgICAgICAgIHdyaXRlciwgbmFtZSArICJCdWZmZXJIYXNJZGVudGlmaWVyIiwgIl9iYjogQnl0ZUJ1ZmZlciIsICJCb29sZWFuIiwKICAgICAgICAgWyZdKCkgewpAQCAtODgyLDcgKzkwMSw3IEBACiAKICAgICAgIEdlbmVyYXRlQ29tbWVudChmaWVsZC5kb2NfY29tbWVudCwgd3JpdGVyLCAmY29tbWVudF9jb25maWcpOwogCi0gICAgICBhdXRvIGZpZWxkX25hbWUgPSBDb252ZXJ0Q2FzZShFc2MoZmllbGQubmFtZSksIENhc2U6OmtMb3dlckNhbWVsKTsKKyAgICAgIGF1dG8gZmllbGRfbmFtZSA9IG5hbWVyXy5GaWVsZChmaWVsZCk7CiAgICAgICBhdXRvIGZpZWxkX3R5cGUgPSBHZW5UeXBlR2V0KGZpZWxkLnZhbHVlLnR5cGUpOwogICAgICAgYXV0byBmaWVsZF9kZWZhdWx0X3ZhbHVlID0gR2VuRGVmYXVsdFZhbHVlKGZpZWxkKTsKICAgICAgIGF1dG8gcmV0dXJuX3R5cGUgPSBHZXR0ZXJSZXR1cm5UeXBlKGZpZWxkKTsKQEAgLTEwNTMsOCArMTA3Miw3IEBACiAgICAgICAgICAgICBhdXRvICZrZmllbGQgPSAqKmtpdDsKICAgICAgICAgICAgIGlmIChrZmllbGQua2V5KSB7CiAgICAgICAgICAgICAgIGF1dG8gcXVhbGlmaWVkX25hbWUgPSBXcmFwSW5OYW1lU3BhY2Uoc2QpOwotICAgICAgICAgICAgICBhdXRvIG5hbWUgPQotICAgICAgICAgICAgICAgICAgQ29udmVydENhc2UoRXNjKGZpZWxkLm5hbWUpLCBDYXNlOjprTG93ZXJDYW1lbCkgKyAiQnlLZXkiOworICAgICAgICAgICAgICBhdXRvIG5hbWUgPSBuYW1lcl8uTWV0aG9kKGZpZWxkLCAiQnlLZXkiKTsKICAgICAgICAgICAgICAgYXV0byBwYXJhbXMgPSAia2V5OiAiICsgR2VuVHlwZUdldChrZmllbGQudmFsdWUudHlwZSk7CiAgICAgICAgICAgICAgIGF1dG8gcnR5cGUgPSBxdWFsaWZpZWRfbmFtZSArICI/IjsKICAgICAgICAgICAgICAgR2VuZXJhdGVGdW4od3JpdGVyLCBuYW1lLCBwYXJhbXMsIHJ0eXBlLCBbJl0oKSB7CkBAIC0xMTQ3LDkgKzExNjUsOSBAQAogICAgICAgICBhdXRvIHVuZGVybHlpbmdfdHlwZSA9IHZhbHVlX2Jhc2VfdHlwZSA9PSBCQVNFX1RZUEVfVkVDVE9SCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gdmFsdWVfdHlwZS5WZWN0b3JUeXBlKCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiB2YWx1ZV90eXBlOwotICAgICAgICBhdXRvIG5hbWUgPSAibXV0YXRlIiArIENvbnZlcnRDYXNlKEVzYyhmaWVsZC5uYW1lKSwgQ2FzZTo6a1VwcGVyQ2FtZWwpOworICAgICAgICBhdXRvIG5hbWUgPSBuYW1lcl8uTGVnYWN5S290bGluTWV0aG9kKCJtdXRhdGUiLCBmaWVsZCwgIiIpOwogICAgICAgICBhdXRvIHNpemUgPSBOdW1Ub1N0cmluZyhJbmxpbmVTaXplKHVuZGVybHlpbmdfdHlwZSkpOwotICAgICAgICBhdXRvIHBhcmFtcyA9IEVzYyhmaWVsZC5uYW1lKSArICI6ICIgKyBHZW5UeXBlR2V0KHVuZGVybHlpbmdfdHlwZSk7CisgICAgICAgIGF1dG8gcGFyYW1zID0gbmFtZXJfLkZpZWxkKGZpZWxkKSArICI6ICIgKyBHZW5UeXBlR2V0KHVuZGVybHlpbmdfdHlwZSk7CiAgICAgICAgIC8vIEEgdmVjdG9yIG11dGF0b3IgYWxzbyBuZWVkcyB0aGUgaW5kZXggb2YgdGhlIHZlY3RvciBlbGVtZW50IGl0IHNob3VsZAogICAgICAgICAvLyBtdXRhdGUuCiAgICAgICAgIGlmICh2YWx1ZV9iYXNlX3R5cGUgPT0gQkFTRV9UWVBFX1ZFQ1RPUikgcGFyYW1zLmluc2VydCgwLCAiajogSW50LCAiKTsKQEAgLTExNTgsOCArMTE3Niw4IEBACiAgICAgICAgIC8vIHJlcHJlc2VudGF0aW9uLgogICAgICAgICBhdXRvIHNldHRlcl9wYXJhbWV0ZXIgPQogICAgICAgICAgICAgdW5kZXJseWluZ190eXBlLmJhc2VfdHlwZSA9PSBCQVNFX1RZUEVfQk9PTAotICAgICAgICAgICAgICAgID8gIihpZigiICsgRXNjKGZpZWxkLm5hbWUpICsgIikgMSBlbHNlIDApLnRvQnl0ZSgpIgotICAgICAgICAgICAgICAgIDogRXNjKGZpZWxkLm5hbWUpOworICAgICAgICAgICAgICAgID8gIihpZigiICsgbmFtZXJfLkZpZWxkKGZpZWxkKSArICIpIDEgZWxzZSAwKS50b0J5dGUoKSIKKyAgICAgICAgICAgICAgICA6IG5hbWVyXy5GaWVsZChmaWVsZCk7CiAKICAgICAgICAgYXV0byBzZXR0ZXJfaW5kZXggPQogICAgICAgICAgICAgdmFsdWVfYmFzZV90eXBlID09IEJBU0VfVFlQRV9WRUNUT1IKQEAgLTEyOTIsOSArMTMxMCw5IEBACiAgICAgfQogICB9CiAKLSAgc3RhdGljIHZvaWQgR2VuZXJhdGVHZXRSb290QXNBY2Nlc3NvcnMoY29uc3Qgc3RkOjpzdHJpbmcgJnN0cnVjdF9uYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2RlV3JpdGVyICZ3cml0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElETE9wdGlvbnMgb3B0aW9ucykgeworICB2b2lkIEdlbmVyYXRlR2V0Um9vdEFzQWNjZXNzb3JzKGNvbnN0IHN0ZDo6c3RyaW5nICZzdHJ1Y3RfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2RlV3JpdGVyICZ3cml0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSURMT3B0aW9ucyBvcHRpb25zKSBjb25zdCB7CiAgICAgLy8gR2VuZXJhdGUgYSBzcGVjaWFsIGFjY2Vzc29yIGZvciB0aGUgdGFibGUgdGhhdCB3aGVuIHVzZWQgYXMgdGhlIHJvb3QKICAgICAvLyBleDogZnVuIGdldFJvb3RBc01vbnN0ZXIoX2JiOiBCeXRlQnVmZmVyKTogTW9uc3RlciB7Li4ufQogICAgIHdyaXRlci5TZXRWYWx1ZSgiZ3JfbmFtZSIsIHN0cnVjdF9uYW1lKTsKQEAgLTEzMjAsMTMgKzEzMzgsMTIgQEAKICAgICB3cml0ZXIgKz0gIn0iOwogICB9CiAKLSAgc3RhdGljIHZvaWQgR2VuZXJhdGVTdGF0aWNDb25zdHJ1Y3Rvcihjb25zdCBTdHJ1Y3REZWYgJnN0cnVjdF9kZWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29kZVdyaXRlciAmY29kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJRExPcHRpb25zIG9wdGlvbnMpIHsKKyAgdm9pZCBHZW5lcmF0ZVN0YXRpY0NvbnN0cnVjdG9yKGNvbnN0IFN0cnVjdERlZiAmc3RydWN0X2RlZiwgQ29kZVdyaXRlciAmY29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElETE9wdGlvbnMgb3B0aW9ucykgY29uc3QgewogICAgIC8vIGNyZWF0ZSBhIHN0cnVjdCBjb25zdHJ1Y3RvciBmdW5jdGlvbgogICAgIGF1dG8gcGFyYW1zID0gU3RydWN0Q29uc3RydWN0b3JQYXJhbXMoc3RydWN0X2RlZik7CiAgICAgR2VuZXJhdGVGdW4oCi0gICAgICAgIGNvZGUsICJjcmVhdGUiICsgRXNjKHN0cnVjdF9kZWYubmFtZSksIHBhcmFtcywgIkludCIsCisgICAgICAgIGNvZGUsIG5hbWVyXy5MZWdhY3lKYXZhTWV0aG9kMigiY3JlYXRlIiwgc3RydWN0X2RlZiwgIiIpLCBwYXJhbXMsICJJbnQiLAogICAgICAgICBbJl0oKSB7CiAgICAgICAgICAgR2VuU3RydWN0Qm9keShzdHJ1Y3RfZGVmLCBjb2RlLCAiIik7CiAgICAgICAgICAgY29kZSArPSAicmV0dXJuIGJ1aWxkZXIub2Zmc2V0KCkiOwpAQCAtMTMzNCw4ICsxMzUxLDggQEAKICAgICAgICAgb3B0aW9ucy5nZW5fanZtc3RhdGljKTsKICAgfQogCi0gIHN0YXRpYyBzdGQ6OnN0cmluZyBTdHJ1Y3RDb25zdHJ1Y3RvclBhcmFtcyhjb25zdCBTdHJ1Y3REZWYgJnN0cnVjdF9kZWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyAmcHJlZml4ID0gIiIpIHsKKyAgc3RkOjpzdHJpbmcgU3RydWN0Q29uc3RydWN0b3JQYXJhbXMoY29uc3QgU3RydWN0RGVmICZzdHJ1Y3RfZGVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyAmcHJlZml4ID0gIiIpIGNvbnN0IHsKICAgICAvLyBidWlsZGVyOiBGbGF0QnVmZmVyQnVpbGRlcgogICAgIHN0ZDo6c3RyaW5nc3RyZWFtIG91dDsKICAgICBhdXRvIGZpZWxkX3ZlYyA9IHN0cnVjdF9kZWYuZmllbGRzLnZlYzsKQEAgLTEzNDgsMTAgKzEzNjUsMTAgQEAKICAgICAgICAgLy8gY29uc3RydWN0aW5nIGEgbmVzdGVkIHN0cnVjdCwgcHJlZml4IHRoZSBuYW1lIHdpdGggdGhlIGZpZWxkCiAgICAgICAgIC8vIG5hbWUuCiAgICAgICAgIG91dCA8PCBTdHJ1Y3RDb25zdHJ1Y3RvclBhcmFtcygqZmllbGQudmFsdWUudHlwZS5zdHJ1Y3RfZGVmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ICsgKEVzYyhmaWVsZC5uYW1lKSArICJfIikpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ICsgKG5hbWVyXy5WYXJpYWJsZShmaWVsZCkgKyAiXyIpKTsKICAgICAgIH0gZWxzZSB7Ci0gICAgICAgIG91dCA8PCAiLCAiIDw8IHByZWZpeCA8PCBDb252ZXJ0Q2FzZShFc2MoZmllbGQubmFtZSksIENhc2U6OmtMb3dlckNhbWVsKQotICAgICAgICAgICAgPDwgIjogIiA8PCBHZW5UeXBlQmFzaWMoZmllbGQudmFsdWUudHlwZS5iYXNlX3R5cGUpOworICAgICAgICBvdXQgPDwgIiwgIiA8PCBwcmVmaXggPDwgbmFtZXJfLlZhcmlhYmxlKGZpZWxkKSA8PCAiOiAiCisgICAgICAgICAgICA8PCBHZW5UeXBlQmFzaWMoZmllbGQudmFsdWUudHlwZS5iYXNlX3R5cGUpOwogICAgICAgfQogICAgIH0KICAgICByZXR1cm4gb3V0LnN0cigpOwpAQCAtMTUyMCw5ICsxNTM3LDcgQEAKICAgICBpZiAoZ2VuX2p2bXN0YXRpYykgeyBjb2RlICs9ICJASnZtU3RhdGljIjsgfQogICB9CiAKLSAgLy8gVGhpcyB0cmFja3MgdGhlIGN1cnJlbnQgbmFtZXNwYWNlIHVzZWQgdG8gZGV0ZXJtaW5lIGlmIGEgdHlwZSBuZWVkIHRvIGJlCi0gIC8vIHByZWZpeGVkIGJ5IGl0cyBuYW1lc3BhY2UKLSAgY29uc3QgTmFtZXNwYWNlICpjdXJfbmFtZV9zcGFjZV87CisgIGNvbnN0IElkbE5hbWVyIG5hbWVyXzsKIH07CiB9ICAvLyBuYW1lc3BhY2Uga290bGluCiAKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3NyYy9pZGxfZ2VuX2xvYnN0ZXIuY3BwIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvc3JjL2lkbF9nZW5fbG9ic3Rlci5jcHAKaW5kZXggYzFlNzhhZC4uNjc4MzBmMyAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvc3JjL2lkbF9nZW5fbG9ic3Rlci5jcHAKKysrIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvc3JjL2lkbF9nZW5fbG9ic3Rlci5jcHAKQEAgLTcyLDkgKzcyLDExIEBACiAKICAgc3RkOjpzdHJpbmcgTG9ic3RlclR5cGUoY29uc3QgVHlwZSAmdHlwZSkgewogICAgIGlmIChJc0Zsb2F0KHR5cGUuYmFzZV90eXBlKSkgcmV0dXJuICJmbG9hdCI7CisgICAgaWYgKElzQm9vbCh0eXBlLmJhc2VfdHlwZSkpIHJldHVybiAiYm9vbCI7CiAgICAgaWYgKElzU2NhbGFyKHR5cGUuYmFzZV90eXBlKSAmJiB0eXBlLmVudW1fZGVmKQogICAgICAgcmV0dXJuIE5vcm1hbGl6ZWROYW1lKCp0eXBlLmVudW1fZGVmKTsKICAgICBpZiAoIUlzU2NhbGFyKHR5cGUuYmFzZV90eXBlKSkgcmV0dXJuICJmbGF0YnVmZmVyc19vZmZzZXQiOworICAgIGlmIChJc1N0cmluZyh0eXBlKSkgcmV0dXJuICJzdHJpbmciOwogICAgIHJldHVybiAiaW50IjsKICAgfQogCkBAIC0xMTYsMjEgKzExOCwyNyBAQAogICAgICAgICBhdXRvIGRlZnZhbCA9IGZpZWxkLklzT3B0aW9uYWwoKSA/ICIwIiA6IGZpZWxkLnZhbHVlLmNvbnN0YW50OwogICAgICAgICBhY2MgPSAiYnVmXy5mbGF0YnVmZmVyc19maWVsZF8iICsgR2VuVHlwZU5hbWUoZmllbGQudmFsdWUudHlwZSkgKwogICAgICAgICAgICAgICAiKHBvc18sICIgKyBvZmZzZXRzICsgIiwgIiArIGRlZnZhbCArICIpIjsKKyAgICAgICAgaWYgKElzQm9vbChmaWVsZC52YWx1ZS50eXBlLmJhc2VfdHlwZSkpCisgICAgICAgICAgYWNjID0gImJvb2woIiArIGFjYyArICIpIjsKICAgICAgIH0KICAgICAgIGlmIChmaWVsZC52YWx1ZS50eXBlLmVudW1fZGVmKQogICAgICAgICBhY2MgPSBOb3JtYWxpemVkTmFtZSgqZmllbGQudmFsdWUudHlwZS5lbnVtX2RlZikgKyAiKCIgKyBhY2MgKyAiKSI7Ci0gICAgICBpZiAoZmllbGQuSXNPcHRpb25hbCgpKQorICAgICAgaWYgKGZpZWxkLklzT3B0aW9uYWwoKSkgewogICAgICAgICBhY2MgKz0gIiwgYnVmXy5mbGF0YnVmZmVyc19maWVsZF9wcmVzZW50KHBvc18sICIgKyBvZmZzZXRzICsgIikiOwotICAgICAgY29kZSArPSBkZWYgKyAiKCk6XG4gICAgICAgIHJldHVybiAiICsgYWNjICsgIlxuIjsKKyAgICAgICAgY29kZSArPSBkZWYgKyAiKCkgLT4gIiArIExvYnN0ZXJUeXBlKGZpZWxkLnZhbHVlLnR5cGUpICsgIiwgYm9vbDpcbiAgICAgICAgcmV0dXJuICIgKyBhY2MgKyAiXG4iOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgY29kZSArPSBkZWYgKyAiKCkgLT4gIiArIExvYnN0ZXJUeXBlKGZpZWxkLnZhbHVlLnR5cGUpICsgIjpcbiAgICAgICAgcmV0dXJuICIgKyBhY2MgKyAiXG4iOworICAgICAgfQogICAgICAgcmV0dXJuOwogICAgIH0KICAgICBzd2l0Y2ggKGZpZWxkLnZhbHVlLnR5cGUuYmFzZV90eXBlKSB7CiAgICAgICBjYXNlIEJBU0VfVFlQRV9TVFJVQ1Q6IHsKICAgICAgICAgYXV0byBuYW1lID0gTmFtZXNwYWNlZE5hbWUoKmZpZWxkLnZhbHVlLnR5cGUuc3RydWN0X2RlZik7Ci0gICAgICAgIGNvZGUgKz0gZGVmICsgIigpOlxuICAgICAgICAiOwogICAgICAgICBpZiAoc3RydWN0X2RlZi5maXhlZCkgeworICAgICAgICAgIGNvZGUgKz0gZGVmICsgIigpIC0+ICIgKyBuYW1lICsgIjpcbiAgICAgICAgIjsKICAgICAgICAgICBjb2RlICs9ICJyZXR1cm4gIiArIG5hbWUgKyAieyBidWZfLCBwb3NfICsgIiArIG9mZnNldHMgKyAiIH1cbiI7CiAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgY29kZSArPSBkZWYgKyAiKCkgLT4gIiArIG5hbWUgKyAiPzpcbiAgICAgICAgIjsKICAgICAgICAgICBjb2RlICs9IHN0ZDo6c3RyaW5nKCJsZXQgbyA9IGJ1Zl8uZmxhdGJ1ZmZlcnNfZmllbGRfIikgKwogICAgICAgICAgICAgICAgICAgKGZpZWxkLnZhbHVlLnR5cGUuc3RydWN0X2RlZi0+Zml4ZWQgPyAic3RydWN0IiA6ICJ0YWJsZSIpICsKICAgICAgICAgICAgICAgICAgICIocG9zXywgIiArIG9mZnNldHMgKyAiKVxuICAgICAgICByZXR1cm4gaWYgbzogIiArIG5hbWUgKwpAQCAtMTQwLDI1ICsxNDgsMjggQEAKICAgICAgIH0KICAgICAgIGNhc2UgQkFTRV9UWVBFX1NUUklORzoKICAgICAgICAgY29kZSArPSBkZWYgKwotICAgICAgICAgICAgICAgICIoKTpcbiAgICAgICAgcmV0dXJuIGJ1Zl8uZmxhdGJ1ZmZlcnNfZmllbGRfc3RyaW5nKHBvc18sICIgKworICAgICAgICAgICAgICAgICIoKSAtPiBzdHJpbmc6XG4gICAgICAgIHJldHVybiBidWZfLmZsYXRidWZmZXJzX2ZpZWxkX3N0cmluZyhwb3NfLCAiICsKICAgICAgICAgICAgICAgICBvZmZzZXRzICsgIilcbiI7CiAgICAgICAgIGJyZWFrOwogICAgICAgY2FzZSBCQVNFX1RZUEVfVkVDVE9SOiB7CiAgICAgICAgIGF1dG8gdmVjdG9ydHlwZSA9IGZpZWxkLnZhbHVlLnR5cGUuVmVjdG9yVHlwZSgpOwotICAgICAgICBjb2RlICs9IGRlZiArICIoaTppbnQpOlxuICAgICAgICByZXR1cm4gIjsKICAgICAgICAgaWYgKHZlY3RvcnR5cGUuYmFzZV90eXBlID09IEJBU0VfVFlQRV9TVFJVQ1QpIHsKICAgICAgICAgICBhdXRvIHN0YXJ0ID0gImJ1Zl8uZmxhdGJ1ZmZlcnNfZmllbGRfdmVjdG9yKHBvc18sICIgKyBvZmZzZXRzICsKICAgICAgICAgICAgICAgICAgICAgICAgIikgKyBpICogIiArIE51bVRvU3RyaW5nKElubGluZVNpemUodmVjdG9ydHlwZSkpOwogICAgICAgICAgIGlmICghKHZlY3RvcnR5cGUuc3RydWN0X2RlZi0+Zml4ZWQpKSB7CiAgICAgICAgICAgICBzdGFydCA9ICJidWZfLmZsYXRidWZmZXJzX2luZGlyZWN0KCIgKyBzdGFydCArICIpIjsKICAgICAgICAgICB9CisgICAgICAgICAgY29kZSArPSBkZWYgKyAiKGk6aW50KSAtPiAiICsgTmFtZXNwYWNlZE5hbWUoKmZpZWxkLnZhbHVlLnR5cGUuc3RydWN0X2RlZikgKyAiOlxuICAgICAgICByZXR1cm4gIjsKICAgICAgICAgICBjb2RlICs9IE5hbWVzcGFjZWROYW1lKCpmaWVsZC52YWx1ZS50eXBlLnN0cnVjdF9kZWYpICsgIiB7IGJ1Zl8sICIgKwogICAgICAgICAgICAgICAgICAgc3RhcnQgKyAiIH1cbiI7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgaWYgKElzU3RyaW5nKHZlY3RvcnR5cGUpKQorICAgICAgICAgIGlmIChJc1N0cmluZyh2ZWN0b3J0eXBlKSkgeworICAgICAgICAgICAgY29kZSArPSBkZWYgKyAiKGk6aW50KSAtPiBzdHJpbmc6XG4gICAgICAgIHJldHVybiAiOwogICAgICAgICAgICAgY29kZSArPSAiYnVmXy5mbGF0YnVmZmVyc19zdHJpbmciOwotICAgICAgICAgIGVsc2UKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgY29kZSArPSBkZWYgKyAiKGk6aW50KSAtPiAiICsgTG9ic3RlclR5cGUodmVjdG9ydHlwZSkgKyAiOlxuICAgICAgICByZXR1cm4gIjsKICAgICAgICAgICAgIGNvZGUgKz0gImJ1Zl8ucmVhZF8iICsgR2VuVHlwZU5hbWUodmVjdG9ydHlwZSkgKyAiX2xlIjsKKyAgICAgICAgICB9CiAgICAgICAgICAgY29kZSArPSAiKGJ1Zl8uZmxhdGJ1ZmZlcnNfZmllbGRfdmVjdG9yKHBvc18sICIgKyBvZmZzZXRzICsKICAgICAgICAgICAgICAgICAgICIpICsgaSAqICIgKyBOdW1Ub1N0cmluZyhJbmxpbmVTaXplKHZlY3RvcnR5cGUpKSArICIpXG4iOwogICAgICAgICB9CkBAIC0xODEsNyArMTkyLDcgQEAKICAgICB9CiAgICAgaWYgKElzVmVjdG9yKGZpZWxkLnZhbHVlLnR5cGUpKSB7CiAgICAgICBjb2RlICs9IGRlZiArCi0gICAgICAgICAgICAgICJfbGVuZ3RoKCk6XG4gICAgICAgIHJldHVybiAiCisgICAgICAgICAgICAgICJfbGVuZ3RoKCkgLT4gaW50OlxuICAgICAgICByZXR1cm4gIgogICAgICAgICAgICAgICAiYnVmXy5mbGF0YnVmZmVyc19maWVsZF92ZWN0b3JfbGVuKHBvc18sICIgKwogICAgICAgICAgICAgICBvZmZzZXRzICsgIilcbiI7CiAgICAgfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvc3JjL2lkbF9nZW5fcHl0aG9uLmNwcCBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3NyYy9pZGxfZ2VuX3B5dGhvbi5jcHAKaW5kZXggODQyNmI2ZS4uMGI4ZmZhOCAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvc3JjL2lkbF9nZW5fcHl0aG9uLmNwcAorKysgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy9zcmMvaWRsX2dlbl9weXRob24uY3BwCkBAIC0yNiwxMiArMjYsMTQgQEAKICNpbmNsdWRlICJmbGF0YnVmZmVycy9mbGF0YnVmZmVycy5oIgogI2luY2x1ZGUgImZsYXRidWZmZXJzL2lkbC5oIgogI2luY2x1ZGUgImZsYXRidWZmZXJzL3V0aWwuaCIKLSNpbmNsdWRlICJuYW1lci5oIgorI2luY2x1ZGUgImlkbF9uYW1lci5oIgogCiBuYW1lc3BhY2UgZmxhdGJ1ZmZlcnMgewogbmFtZXNwYWNlIHB5dGhvbiB7CiAKLXN0ZDo6c2V0PHN0ZDo6c3RyaW5nPiBQeXRob25LZXl3b3JkcygpIHsKK25hbWVzcGFjZSB7CisKK3N0YXRpYyBzdGQ6OnNldDxzdGQ6OnN0cmluZz4gUHl0aG9uS2V5d29yZHMoKSB7CiAgIHJldHVybiB7ICJGYWxzZSIsICJOb25lIiwgICAiVHJ1ZSIsICAgICAiYW5kIiwgICAiYXMiLCAgICAgImFzc2VydCIsCiAgICAgICAgICAgICJicmVhayIsICJjbGFzcyIsICAiY29udGludWUiLCAiZGVmIiwgICAiZGVsIiwgICAgImVsaWYiLAogICAgICAgICAgICAiZWxzZSIsICAiZXhjZXB0IiwgImZpbmFsbHkiLCAgImZvciIsICAgImZyb20iLCAgICJnbG9iYWwiLApAQCAtNDAsNyArNDIsNyBAQAogICAgICAgICAgICAid2hpbGUiLCAid2l0aCIsICAgInlpZWxkIiB9OwogfQogCi1OYW1lcjo6Q29uZmlnIFB5dGhvbkRlZmF1bHRDb25maWcoKSB7CitzdGF0aWMgTmFtZXI6OkNvbmZpZyBQeXRob25EZWZhdWx0Q29uZmlnKCkgewogICByZXR1cm4geyAvKnR5cGVzPSovQ2FzZTo6a0tlZXAsCiAgICAgICAgICAgIC8qY29uc3RhbnRzPSovQ2FzZTo6a1NjcmVhbWluZ1NuYWtlLAogICAgICAgICAgICAvKm1ldGhvZHM9Ki9DYXNlOjprVXBwZXJDYW1lbCwKQEAgLTQ5LDYgKzUxLDcgQEAKICAgICAgICAgICAgLyp2YXJpYWJsZT0qL0Nhc2U6OmtMb3dlckNhbWVsLAogICAgICAgICAgICAvKnZhcmlhbnRzPSovQ2FzZTo6a0tlZXAsCiAgICAgICAgICAgIC8qZW51bV92YXJpYW50X3NlcGVyYXRvcj0qLyIuIiwKKyAgICAgICAgICAgLyplc2NhcGVfa2V5d29yZHM9Ki9OYW1lcjo6Q29uZmlnOjpFc2NhcGU6OkJlZm9yZUNvbnZlcnRpbmdDYXNlLAogICAgICAgICAgICAvKm5hbWVzcGFjZXM9Ki9DYXNlOjprS2VlcCwgIC8vIFBhY2thZ2VzIGluIHB5dGhvbi4KICAgICAgICAgICAgLypuYW1lc3BhY2Vfc2VwZXJhdG9yPSovIi4iLAogICAgICAgICAgICAvKm9iamVjdF9wcmVmaXg9Ki8iIiwKQEAgLTYzLDggKzY2LDEwIEBACiB9CiAKIC8vIEhhcmRjb2RlIHNwYWNlcyBwZXIgaW5kZW50YXRpb24uCi1jb25zdCBDb21tZW50Q29uZmlnIGRlZl9jb21tZW50ID0geyBudWxscHRyLCAiIyIsIG51bGxwdHIgfTsKLWNvbnN0IHN0ZDo6c3RyaW5nIEluZGVudCA9ICIgICAgIjsKK3N0YXRpYyBjb25zdCBDb21tZW50Q29uZmlnIGRlZl9jb21tZW50ID0geyBudWxscHRyLCAiIyIsIG51bGxwdHIgfTsKK3N0YXRpYyBjb25zdCBzdGQ6OnN0cmluZyBJbmRlbnQgPSAiICAgICI7CisKK30gLy8gbmFtZXNwYWNlCiAKIGNsYXNzIFB5dGhvbkdlbmVyYXRvciA6IHB1YmxpYyBCYXNlR2VuZXJhdG9yIHsKICBwdWJsaWM6CkBAIC03Myw4ICs3OCw4IEBACiAgICAgICA6IEJhc2VHZW5lcmF0b3IocGFyc2VyLCBwYXRoLCBmaWxlX25hbWUsICIiIC8qIG5vdCB1c2VkICovLAogICAgICAgICAgICAgICAgICAgICAgICIiIC8qIG5vdCB1c2VkICovLCAicHkiKSwKICAgICAgICAgZmxvYXRfY29uc3RfZ2VuXygiZmxvYXQoJ25hbicpIiwgImZsb2F0KCdpbmYnKSIsICJmbG9hdCgnLWluZicpIiksCi0gICAgICAgIG5hbWVyXyh7IFB5dGhvbkRlZmF1bHRDb25maWcoKS5XaXRoRmxhZ09wdGlvbnMocGFyc2VyLm9wdHMsIHBhdGgpLAotICAgICAgICAgICAgICAgICBQeXRob25LZXl3b3JkcygpIH0pIHt9CisgICAgICAgIG5hbWVyXyhXaXRoRmxhZ09wdGlvbnMoUHl0aG9uRGVmYXVsdENvbmZpZygpLCBwYXJzZXIub3B0cywgcGF0aCksCisgICAgICAgICAgICAgICBQeXRob25LZXl3b3JkcygpKSB7fQogCiAgIC8vIE1vc3QgZmllbGQgYWNjZXNzb3JzIG5lZWQgdG8gcmV0cmlldmUgYW5kIHRlc3QgdGhlIGZpZWxkIG9mZnNldCBmaXJzdCwKICAgLy8gdGhpcyBpcyB0aGUgcHJlZml4IGNvZGUgZm9yIHRoYXQuCkBAIC04OCw3ICs5Myw3IEBACiAgIC8vIEJlZ2luIGEgY2xhc3MgZGVjbGFyYXRpb24uCiAgIHZvaWQgQmVnaW5DbGFzcyhjb25zdCBTdHJ1Y3REZWYgJnN0cnVjdF9kZWYsIHN0ZDo6c3RyaW5nICpjb2RlX3B0cikgY29uc3QgewogICAgIGF1dG8gJmNvZGUgPSAqY29kZV9wdHI7Ci0gICAgY29kZSArPSAiY2xhc3MgIiArIG5hbWVyXy5UeXBlKHN0cnVjdF9kZWYubmFtZSkgKyAiKG9iamVjdCk6XG4iOworICAgIGNvZGUgKz0gImNsYXNzICIgKyBuYW1lcl8uVHlwZShzdHJ1Y3RfZGVmKSArICIob2JqZWN0KTpcbiI7CiAgICAgY29kZSArPSBJbmRlbnQgKyAiX19zbG90c19fID0gWydfdGFiJ10iOwogICAgIGNvZGUgKz0gIlxuXG4iOwogICB9CkBAIC05Niw3ICsxMDEsNyBAQAogICAvLyBCZWdpbiBlbnVtIGNvZGUgd2l0aCBhIGNsYXNzIGRlY2xhcmF0aW9uLgogICB2b2lkIEJlZ2luRW51bShjb25zdCBFbnVtRGVmICZlbnVtX2RlZiwgc3RkOjpzdHJpbmcgKmNvZGVfcHRyKSBjb25zdCB7CiAgICAgYXV0byAmY29kZSA9ICpjb2RlX3B0cjsKLSAgICBjb2RlICs9ICJjbGFzcyAiICsgbmFtZXJfLlR5cGUoZW51bV9kZWYubmFtZSkgKyAiKG9iamVjdCk6XG4iOworICAgIGNvZGUgKz0gImNsYXNzICIgKyBuYW1lcl8uVHlwZShlbnVtX2RlZikgKyAiKG9iamVjdCk6XG4iOwogICB9CiAKICAgLy8gU3RhcnRzIGEgbmV3IGxpbmUgYW5kIHRoZW4gaW5kZW50cy4KQEAgLTEwOSw3ICsxMTQsNyBAQAogICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgKmNvZGVfcHRyKSBjb25zdCB7CiAgICAgYXV0byAmY29kZSA9ICpjb2RlX3B0cjsKICAgICBjb2RlICs9IEluZGVudDsKLSAgICBjb2RlICs9IG5hbWVyXy5WYXJpYW50KGV2Lm5hbWUpOworICAgIGNvZGUgKz0gbmFtZXJfLlZhcmlhbnQoZXYpOwogICAgIGNvZGUgKz0gIiA9ICI7CiAgICAgY29kZSArPSBlbnVtX2RlZi5Ub1N0cmluZyhldikgKyAiXG4iOwogICB9CkBAIC0xMTgsNyArMTIzLDcgQEAKICAgdm9pZCBOZXdSb290VHlwZUZyb21CdWZmZXIoY29uc3QgU3RydWN0RGVmICZzdHJ1Y3RfZGVmLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyAqY29kZV9wdHIpIGNvbnN0IHsKICAgICBhdXRvICZjb2RlID0gKmNvZGVfcHRyOwotICAgIGNvbnN0IHN0ZDo6c3RyaW5nIHN0cnVjdF90eXBlID0gbmFtZXJfLlR5cGUoc3RydWN0X2RlZi5uYW1lKTsKKyAgICBjb25zdCBzdGQ6OnN0cmluZyBzdHJ1Y3RfdHlwZSA9IG5hbWVyXy5UeXBlKHN0cnVjdF9kZWYpOwogCiAgICAgY29kZSArPSBJbmRlbnQgKyAiQGNsYXNzbWV0aG9kXG4iOwogICAgIGNvZGUgKz0gSW5kZW50ICsgImRlZiBHZXRSb290QXMiOwpAQCAtMTU4LDcgKzE2Myw3IEBACiAgICAgYXV0byAmY29kZSA9ICpjb2RlX3B0cjsKIAogICAgIEdlblJlY2VpdmVyKHN0cnVjdF9kZWYsIGNvZGVfcHRyKTsKLSAgICBjb2RlICs9IG5hbWVyXy5NZXRob2QoZmllbGQubmFtZSkgKyAiTGVuZ3RoKHNlbGYiOworICAgIGNvZGUgKz0gbmFtZXJfLk1ldGhvZChmaWVsZCkgKyAiTGVuZ3RoKHNlbGYiOwogICAgIGNvZGUgKz0gIik6IiArIE9mZnNldFByZWZpeChmaWVsZCk7CiAgICAgY29kZSArPSBJbmRlbnQgKyBJbmRlbnQgKyBJbmRlbnQgKyAicmV0dXJuIHNlbGYuX3RhYi5WZWN0b3JMZW4obylcbiI7CiAgICAgY29kZSArPSBJbmRlbnQgKyBJbmRlbnQgKyAicmV0dXJuIDBcblxuIjsKQEAgLTE3MCw3ICsxNzUsNyBAQAogICAgIGF1dG8gJmNvZGUgPSAqY29kZV9wdHI7CiAKICAgICBHZW5SZWNlaXZlcihzdHJ1Y3RfZGVmLCBjb2RlX3B0cik7Ci0gICAgY29kZSArPSBuYW1lcl8uTWV0aG9kKGZpZWxkLm5hbWUpICsgIklzTm9uZShzZWxmIjsKKyAgICBjb2RlICs9IG5hbWVyXy5NZXRob2QoZmllbGQpICsgIklzTm9uZShzZWxmIjsKICAgICBjb2RlICs9ICIpOiI7CiAgICAgY29kZSArPSBHZW5JbmRlbnRzKDIpICsKICAgICAgICAgICAgICJvID0gZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVPZmZzZXRURmxhZ3MucHlfdHlwZSIgKwpAQCAtMTg2LDcgKzE5MSw3IEBACiAgICAgYXV0byAmY29kZSA9ICpjb2RlX3B0cjsKICAgICBzdGQ6OnN0cmluZyBnZXR0ZXIgPSBHZW5HZXR0ZXIoZmllbGQudmFsdWUudHlwZSk7CiAgICAgR2VuUmVjZWl2ZXIoc3RydWN0X2RlZiwgY29kZV9wdHIpOwotICAgIGNvZGUgKz0gbmFtZXJfLk1ldGhvZChmaWVsZC5uYW1lKTsKKyAgICBjb2RlICs9IG5hbWVyXy5NZXRob2QoZmllbGQpOwogICAgIGNvZGUgKz0gIihzZWxmKTogcmV0dXJuICIgKyBnZXR0ZXI7CiAgICAgY29kZSArPSAic2VsZi5fdGFiLlBvcyArIGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5VT2Zmc2V0VEZsYWdzLnB5X3R5cGUoIjsKICAgICBjb2RlICs9IE51bVRvU3RyaW5nKGZpZWxkLnZhbHVlLm9mZnNldCkgKyAiKSlcbiI7CkBAIC0xOTgsNyArMjAzLDcgQEAKICAgICBhdXRvICZjb2RlID0gKmNvZGVfcHRyOwogICAgIHN0ZDo6c3RyaW5nIGdldHRlciA9IEdlbkdldHRlcihmaWVsZC52YWx1ZS50eXBlKTsKICAgICBHZW5SZWNlaXZlcihzdHJ1Y3RfZGVmLCBjb2RlX3B0cik7Ci0gICAgY29kZSArPSBuYW1lcl8uTWV0aG9kKGZpZWxkLm5hbWUpOworICAgIGNvZGUgKz0gbmFtZXJfLk1ldGhvZChmaWVsZCk7CiAgICAgY29kZSArPSAiKHNlbGYpOiI7CiAgICAgY29kZSArPSBPZmZzZXRQcmVmaXgoZmllbGQpOwogICAgIGdldHRlciArPSAibyArIHNlbGYuX3RhYi5Qb3MpIjsKQEAgLTIwNiw3ICsyMTEsOSBAQAogICAgIGlmIChpc19ib29sKSB7IGdldHRlciA9ICJib29sKCIgKyBnZXR0ZXIgKyAiKSI7IH0KICAgICBjb2RlICs9IEluZGVudCArIEluZGVudCArIEluZGVudCArICJyZXR1cm4gIiArIGdldHRlciArICJcbiI7CiAgICAgc3RkOjpzdHJpbmcgZGVmYXVsdF92YWx1ZTsKLSAgICBpZiAoaXNfYm9vbCkgeworICAgIGlmIChmaWVsZC5Jc1NjYWxhck9wdGlvbmFsKCkpIHsKKyAgICAgIGRlZmF1bHRfdmFsdWUgPSAiTm9uZSI7CisgICAgfSBlbHNlIGlmIChpc19ib29sKSB7CiAgICAgICBkZWZhdWx0X3ZhbHVlID0gZmllbGQudmFsdWUuY29uc3RhbnQgPT0gIjAiID8gIkZhbHNlIiA6ICJUcnVlIjsKICAgICB9IGVsc2UgewogICAgICAgZGVmYXVsdF92YWx1ZSA9IElzRmxvYXQoZmllbGQudmFsdWUudHlwZS5iYXNlX3R5cGUpCkBAIC0yMjMsNyArMjMwLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nICpjb2RlX3B0cikgY29uc3QgewogICAgIGF1dG8gJmNvZGUgPSAqY29kZV9wdHI7CiAgICAgR2VuUmVjZWl2ZXIoc3RydWN0X2RlZiwgY29kZV9wdHIpOwotICAgIGNvZGUgKz0gbmFtZXJfLk1ldGhvZChmaWVsZC5uYW1lKTsKKyAgICBjb2RlICs9IG5hbWVyXy5NZXRob2QoZmllbGQpOwogICAgIGNvZGUgKz0gIihzZWxmLCBvYmopOlxuIjsKICAgICBjb2RlICs9IEluZGVudCArIEluZGVudCArICJvYmouSW5pdChzZWxmLl90YWIuQnl0ZXMsIHNlbGYuX3RhYi5Qb3MgKyAiOwogICAgIGNvZGUgKz0gTnVtVG9TdHJpbmcoZmllbGQudmFsdWUub2Zmc2V0KSArICIpIjsKQEAgLTIzNiw3ICsyNDMsNyBAQAogICAgIGF1dG8gJmNvZGUgPSAqY29kZV9wdHI7CiAgICAgY29uc3QgYXV0byB2ZWNfdHlwZSA9IGZpZWxkLnZhbHVlLnR5cGUuVmVjdG9yVHlwZSgpOwogICAgIEdlblJlY2VpdmVyKHN0cnVjdF9kZWYsIGNvZGVfcHRyKTsKLSAgICBjb2RlICs9IG5hbWVyXy5NZXRob2QoZmllbGQubmFtZSk7CisgICAgY29kZSArPSBuYW1lcl8uTWV0aG9kKGZpZWxkKTsKICAgICBpZiAoSXNTdHJ1Y3QodmVjX3R5cGUpKSB7CiAgICAgICBjb2RlICs9ICIoc2VsZiwgb2JqLCBpKTpcbiI7CiAgICAgICBjb2RlICs9IEluZGVudCArIEluZGVudCArICJvYmouSW5pdChzZWxmLl90YWIuQnl0ZXMsIHNlbGYuX3RhYi5Qb3MgKyAiOwpAQCAtMjYwLDcgKzI2Nyw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nICpjb2RlX3B0cikgY29uc3QgewogICAgIGF1dG8gJmNvZGUgPSAqY29kZV9wdHI7CiAgICAgR2VuUmVjZWl2ZXIoc3RydWN0X2RlZiwgY29kZV9wdHIpOwotICAgIGNvZGUgKz0gbmFtZXJfLk1ldGhvZChmaWVsZC5uYW1lKTsKKyAgICBjb2RlICs9IG5hbWVyXy5NZXRob2QoZmllbGQpOwogICAgIGNvZGUgKz0gIihzZWxmKToiOwogICAgIGNvZGUgKz0gT2Zmc2V0UHJlZml4KGZpZWxkKTsKICAgICBpZiAoZmllbGQudmFsdWUudHlwZS5zdHJ1Y3RfZGVmLT5maXhlZCkgewpAQCAtMjg1LDcgKzI5Miw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgKmNvZGVfcHRyKSBjb25zdCB7CiAgICAgYXV0byAmY29kZSA9ICpjb2RlX3B0cjsKICAgICBHZW5SZWNlaXZlcihzdHJ1Y3RfZGVmLCBjb2RlX3B0cik7Ci0gICAgY29kZSArPSBuYW1lcl8uTWV0aG9kKGZpZWxkLm5hbWUpOworICAgIGNvZGUgKz0gbmFtZXJfLk1ldGhvZChmaWVsZCk7CiAgICAgY29kZSArPSAiKHNlbGYpOiI7CiAgICAgY29kZSArPSBPZmZzZXRQcmVmaXgoZmllbGQpOwogICAgIGNvZGUgKz0gSW5kZW50ICsgSW5kZW50ICsgSW5kZW50ICsgInJldHVybiAiICsgR2VuR2V0dGVyKGZpZWxkLnZhbHVlLnR5cGUpOwpAQCAtMjk4LDcgKzMwNSw3IEBACiAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyAqY29kZV9wdHIpIGNvbnN0IHsKICAgICBhdXRvICZjb2RlID0gKmNvZGVfcHRyOwogICAgIEdlblJlY2VpdmVyKHN0cnVjdF9kZWYsIGNvZGVfcHRyKTsKLSAgICBjb2RlICs9IG5hbWVyXy5NZXRob2QoZmllbGQubmFtZSkgKyAiKHNlbGYpOiI7CisgICAgY29kZSArPSBuYW1lcl8uTWV0aG9kKGZpZWxkKSArICIoc2VsZik6IjsKICAgICBjb2RlICs9IE9mZnNldFByZWZpeChmaWVsZCk7CiAKICAgICAvLyBUT0RPKHJ3KTogdGhpcyB3b3JrcyBhbmQgaXMgbm90IHRoZSBnb29kIHdheSB0byBpdDoKQEAgLTMyMSwyMSArMzI4LDEzIEBACiAgIC8vIG1vZHVsZS4KICAgc3RkOjpzdHJpbmcgR2VuUGFja2FnZVJlZmVyZW5jZShjb25zdCBUeXBlICZ0eXBlKSBjb25zdCB7CiAgICAgaWYgKHR5cGUuc3RydWN0X2RlZikgewotICAgICAgcmV0dXJuIEdlblBhY2thZ2VSZWZlcmVuY2UoKnR5cGUuc3RydWN0X2RlZik7CisgICAgICByZXR1cm4gbmFtZXJfLk5hbWVzcGFjZWRUeXBlKCp0eXBlLnN0cnVjdF9kZWYpOwogICAgIH0gZWxzZSBpZiAodHlwZS5lbnVtX2RlZikgewotICAgICAgcmV0dXJuIEdlblBhY2thZ2VSZWZlcmVuY2UoKnR5cGUuZW51bV9kZWYpOworICAgICAgcmV0dXJuIG5hbWVyXy5OYW1lc3BhY2VkVHlwZSgqdHlwZS5lbnVtX2RlZik7CiAgICAgfSBlbHNlIHsKICAgICAgIHJldHVybiAiLiIgKyBHZW5UeXBlR2V0KHR5cGUpOwogICAgIH0KICAgfQotICBzdGQ6OnN0cmluZyBHZW5QYWNrYWdlUmVmZXJlbmNlKGNvbnN0IEVudW1EZWYgJmVudW1fZGVmKSBjb25zdCB7Ci0gICAgcmV0dXJuIG5hbWVyXy5OYW1lc3BhY2VkVHlwZShlbnVtX2RlZi5kZWZpbmVkX25hbWVzcGFjZS0+Y29tcG9uZW50cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudW1fZGVmLm5hbWUpOwotICB9Ci0gIHN0ZDo6c3RyaW5nIEdlblBhY2thZ2VSZWZlcmVuY2UoY29uc3QgU3RydWN0RGVmICZzdHJ1Y3RfZGVmKSBjb25zdCB7Ci0gICAgcmV0dXJuIG5hbWVyXy5OYW1lc3BhY2VkVHlwZShzdHJ1Y3RfZGVmLmRlZmluZWRfbmFtZXNwYWNlLT5jb21wb25lbnRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0X2RlZi5uYW1lKTsKLSAgfQogCiAgIC8vIEdldCB0aGUgdmFsdWUgb2YgYSB2ZWN0b3IncyBzdHJ1Y3QgbWVtYmVyLgogICB2b2lkIEdldE1lbWJlck9mVmVjdG9yT2ZTdHJ1Y3QoY29uc3QgU3RydWN0RGVmICZzdHJ1Y3RfZGVmLApAQCAtMzQ1LDcgKzM0NCw3IEBACiAgICAgYXV0byB2ZWN0b3J0eXBlID0gZmllbGQudmFsdWUudHlwZS5WZWN0b3JUeXBlKCk7CiAKICAgICBHZW5SZWNlaXZlcihzdHJ1Y3RfZGVmLCBjb2RlX3B0cik7Ci0gICAgY29kZSArPSBuYW1lcl8uTWV0aG9kKGZpZWxkLm5hbWUpOworICAgIGNvZGUgKz0gbmFtZXJfLk1ldGhvZChmaWVsZCk7CiAgICAgY29kZSArPSAiKHNlbGYsIGopOiIgKyBPZmZzZXRQcmVmaXgoZmllbGQpOwogICAgIGNvZGUgKz0gSW5kZW50ICsgSW5kZW50ICsgSW5kZW50ICsgInggPSBzZWxmLl90YWIuVmVjdG9yKG8pXG4iOwogICAgIGNvZGUgKz0gSW5kZW50ICsgSW5kZW50ICsgSW5kZW50OwpAQCAtMzc0LDcgKzM3Myw3IEBACiAgICAgYXV0byB2ZWN0b3J0eXBlID0gZmllbGQudmFsdWUudHlwZS5WZWN0b3JUeXBlKCk7CiAKICAgICBHZW5SZWNlaXZlcihzdHJ1Y3RfZGVmLCBjb2RlX3B0cik7Ci0gICAgY29kZSArPSBuYW1lcl8uTWV0aG9kKGZpZWxkLm5hbWUpOworICAgIGNvZGUgKz0gbmFtZXJfLk1ldGhvZChmaWVsZCk7CiAgICAgY29kZSArPSAiKHNlbGYsIGopOiI7CiAgICAgY29kZSArPSBPZmZzZXRQcmVmaXgoZmllbGQpOwogICAgIGNvZGUgKz0gSW5kZW50ICsgSW5kZW50ICsgSW5kZW50ICsgImEgPSBzZWxmLl90YWIuVmVjdG9yKG8pXG4iOwpAQCAtNDAzLDcgKzQwMiw3IEBACiAgICAgaWYgKCEoSXNTY2FsYXIodmVjdG9ydHlwZS5iYXNlX3R5cGUpKSkgeyByZXR1cm47IH0KIAogICAgIEdlblJlY2VpdmVyKHN0cnVjdF9kZWYsIGNvZGVfcHRyKTsKLSAgICBjb2RlICs9IG5hbWVyXy5NZXRob2QoZmllbGQubmFtZSkgKyAiQXNOdW1weShzZWxmKToiOworICAgIGNvZGUgKz0gbmFtZXJfLk1ldGhvZChmaWVsZCkgKyAiQXNOdW1weShzZWxmKToiOwogICAgIGNvZGUgKz0gT2Zmc2V0UHJlZml4KGZpZWxkKTsKIAogICAgIGNvZGUgKz0gSW5kZW50ICsgSW5kZW50ICsgSW5kZW50OwpAQCAtNDIxLDcgKzQyMCw3IEBACiAgIH0KIAogICBzdGQ6OnN0cmluZyBOZXN0ZWRGbGF0YnVmZmVyVHlwZShzdGQ6OnN0cmluZyB1bnF1YWxpZmllZF9uYW1lKSBjb25zdCB7Ci0gICAgU3RydWN0RGVmKiBuZXN0ZWRfcm9vdCA9IHBhcnNlcl8uTG9va3VwU3RydWN0KHVucXVhbGlmaWVkX25hbWUpOworICAgIFN0cnVjdERlZiAqbmVzdGVkX3Jvb3QgPSBwYXJzZXJfLkxvb2t1cFN0cnVjdCh1bnF1YWxpZmllZF9uYW1lKTsKICAgICBzdGQ6OnN0cmluZyBxdWFsaWZpZWRfbmFtZTsKICAgICBpZiAobmVzdGVkX3Jvb3QgPT0gbnVsbHB0cikgewogICAgICAgcXVhbGlmaWVkX25hbWUgPSBuYW1lcl8uTmFtZXNwYWNlZFR5cGUoCkBAIC00NDUsNyArNDQ0LDcgQEAKIAogICAgIGF1dG8gJmNvZGUgPSAqY29kZV9wdHI7CiAgICAgR2VuUmVjZWl2ZXIoc3RydWN0X2RlZiwgY29kZV9wdHIpOwotICAgIGNvZGUgKz0gbmFtZXJfLk1ldGhvZChmaWVsZC5uYW1lKSArICJOZXN0ZWRSb290KHNlbGYpOiI7CisgICAgY29kZSArPSBuYW1lcl8uTWV0aG9kKGZpZWxkKSArICJOZXN0ZWRSb290KHNlbGYpOiI7CiAKICAgICBjb2RlICs9IE9mZnNldFByZWZpeChmaWVsZCk7CiAKQEAgLTQ2NCw3ICs0NjMsNyBAQAogICAgIGF1dG8gJmNvZGUgPSAqY29kZV9wdHI7CiAKICAgICBjb2RlICs9ICJcbiI7Ci0gICAgY29kZSArPSAiZGVmIENyZWF0ZSIgKyBuYW1lcl8uVHlwZShzdHJ1Y3RfZGVmLm5hbWUpOworICAgIGNvZGUgKz0gImRlZiBDcmVhdGUiICsgbmFtZXJfLlR5cGUoc3RydWN0X2RlZik7CiAgICAgY29kZSArPSAiKGJ1aWxkZXIiOwogICB9CiAKQEAgLTQ4NywxNCArNDg2LDE0IEBACiAgICAgICAgIC8vIGEgbmVzdGVkIHN0cnVjdCwgcHJlZml4IHRoZSBuYW1lIHdpdGggdGhlIGZpZWxkIG5hbWUuCiAgICAgICAgIGF1dG8gc3VicHJlZml4ID0gbmFtZXByZWZpeDsKICAgICAgICAgaWYgKGhhc19maWVsZF9uYW1lKSB7Ci0gICAgICAgICAgc3VicHJlZml4ICs9IG5hbWVyXy5GaWVsZChmaWVsZC5uYW1lKSArIGZpZWxkbmFtZV9zdWZmaXg7CisgICAgICAgICAgc3VicHJlZml4ICs9IG5hbWVyXy5GaWVsZChmaWVsZCkgKyBmaWVsZG5hbWVfc3VmZml4OwogICAgICAgICB9CiAgICAgICAgIFN0cnVjdEJ1aWxkZXJBcmdzKCpmaWVsZC52YWx1ZS50eXBlLnN0cnVjdF9kZWYsIHN1YnByZWZpeCwgbmFtZXN1ZmZpeCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzX2ZpZWxkX25hbWUsIGZpZWxkbmFtZV9zdWZmaXgsIGNvZGVfcHRyKTsKICAgICAgIH0gZWxzZSB7CiAgICAgICAgIGF1dG8gJmNvZGUgPSAqY29kZV9wdHI7CiAgICAgICAgIGNvZGUgKz0gc3RkOjpzdHJpbmcoIiwgIikgKyBuYW1lcHJlZml4OwotICAgICAgICBpZiAoaGFzX2ZpZWxkX25hbWUpIHsgY29kZSArPSBuYW1lcl8uRmllbGQoZmllbGQubmFtZSk7IH0KKyAgICAgICAgaWYgKGhhc19maWVsZF9uYW1lKSB7IGNvZGUgKz0gbmFtZXJfLkZpZWxkKGZpZWxkKTsgfQogICAgICAgICBjb2RlICs9IG5hbWVzdWZmaXg7CiAgICAgICB9CiAgICAgfQpAQCAtNTI2LDEwICs1MjUsOSBAQAogICAgICAgICBjb2RlICs9CiAgICAgICAgICAgICBpbmRlbnQgKyAiICAgIGJ1aWxkZXIuUGFkKCIgKyBOdW1Ub1N0cmluZyhmaWVsZC5wYWRkaW5nKSArICIpXG4iOwogICAgICAgaWYgKElzU3RydWN0KGZpZWxkX3R5cGUpKSB7Ci0gICAgICAgIFN0cnVjdEJ1aWxkZXJCb2R5KAotICAgICAgICAgICAgKmZpZWxkX3R5cGUuc3RydWN0X2RlZiwKLSAgICAgICAgICAgIChuYW1lcHJlZml4ICsgKG5hbWVyXy5GaWVsZChmaWVsZC5uYW1lKSArICJfIikpLmNfc3RyKCksIGNvZGVfcHRyLAotICAgICAgICAgICAgaW5kZXgsIGluX2FycmF5KTsKKyAgICAgICAgU3RydWN0QnVpbGRlckJvZHkoKmZpZWxkX3R5cGUuc3RydWN0X2RlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKG5hbWVwcmVmaXggKyAobmFtZXJfLkZpZWxkKGZpZWxkKSArICJfIikpLmNfc3RyKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVfcHRyLCBpbmRleCwgaW5fYXJyYXkpOwogICAgICAgfSBlbHNlIHsKICAgICAgICAgY29uc3QgYXV0byBpbmRleF92YXIgPSAiX2lkeCIgKyBOdW1Ub1N0cmluZyhpbmRleCk7CiAgICAgICAgIGlmIChJc0FycmF5KGZpZWxkX3R5cGUpKSB7CkBAIC01MzksMTQgKzUzNywxMyBAQAogICAgICAgICAgIGluX2FycmF5ID0gdHJ1ZTsKICAgICAgICAgfQogICAgICAgICBpZiAoSXNTdHJ1Y3QodHlwZSkpIHsKLSAgICAgICAgICBTdHJ1Y3RCdWlsZGVyQm9keSgKLSAgICAgICAgICAgICAgKmZpZWxkX3R5cGUuc3RydWN0X2RlZiwKLSAgICAgICAgICAgICAgKG5hbWVwcmVmaXggKyAobmFtZXJfLkZpZWxkKGZpZWxkLm5hbWUpICsgIl8iKSkuY19zdHIoKSwgY29kZV9wdHIsCi0gICAgICAgICAgICAgIGluZGV4ICsgMSwgaW5fYXJyYXkpOworICAgICAgICAgIFN0cnVjdEJ1aWxkZXJCb2R5KCpmaWVsZF90eXBlLnN0cnVjdF9kZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG5hbWVwcmVmaXggKyAobmFtZXJfLkZpZWxkKGZpZWxkKSArICJfIikpLmNfc3RyKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZV9wdHIsIGluZGV4ICsgMSwgaW5fYXJyYXkpOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgIGNvZGUgKz0gSXNBcnJheShmaWVsZF90eXBlKSA/ICIgICAgIiA6ICIiOwogICAgICAgICAgIGNvZGUgKz0gaW5kZW50ICsgIiAgICBidWlsZGVyLlByZXBlbmQiICsgR2VuTWV0aG9kKGZpZWxkKSArICIoIjsKLSAgICAgICAgICBjb2RlICs9IG5hbWVwcmVmaXggKyBuYW1lcl8uVmFyaWFibGUoZmllbGQubmFtZSk7CisgICAgICAgICAgY29kZSArPSBuYW1lcHJlZml4ICsgbmFtZXJfLlZhcmlhYmxlKGZpZWxkKTsKICAgICAgICAgICBzaXplX3QgYXJyYXlfY250ID0gaW5kZXggKyAoSXNBcnJheShmaWVsZF90eXBlKSA/IDEgOiAwKTsKICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaW5fYXJyYXkgJiYgaSA8IGFycmF5X2NudDsgaSsrKSB7CiAgICAgICAgICAgICBjb2RlICs9ICJbX2lkeCIgKyBOdW1Ub1N0cmluZyhpKSArICItMV0iOwpAQCAtNTY2LDcgKzU2Myw3IEBACiAgIHZvaWQgR2V0U3RhcnRPZlRhYmxlKGNvbnN0IFN0cnVjdERlZiAmc3RydWN0X2RlZiwKICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgKmNvZGVfcHRyKSBjb25zdCB7CiAgICAgYXV0byAmY29kZSA9ICpjb2RlX3B0cjsKLSAgICBjb25zdCBhdXRvIHN0cnVjdF90eXBlID0gbmFtZXJfLlR5cGUoc3RydWN0X2RlZi5uYW1lKTsKKyAgICBjb25zdCBhdXRvIHN0cnVjdF90eXBlID0gbmFtZXJfLlR5cGUoc3RydWN0X2RlZik7CiAgICAgLy8gR2VuZXJhdGUgbWV0aG9kIHdpdGggc3RydWN0IG5hbWUuCiAgICAgY29kZSArPSAiZGVmICIgKyBzdHJ1Y3RfdHlwZSArICJTdGFydChidWlsZGVyKTogIjsKICAgICBjb2RlICs9ICJidWlsZGVyLlN0YXJ0T2JqZWN0KCI7CkBAIC01ODQsMTEgKzU4MSwxMSBAQAogICB2b2lkIEJ1aWxkRmllbGRPZlRhYmxlKGNvbnN0IFN0cnVjdERlZiAmc3RydWN0X2RlZiwgY29uc3QgRmllbGREZWYgJmZpZWxkLAogICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNpemVfdCBvZmZzZXQsIHN0ZDo6c3RyaW5nICpjb2RlX3B0cikgY29uc3QgewogICAgIGF1dG8gJmNvZGUgPSAqY29kZV9wdHI7Ci0gICAgY29uc3Qgc3RkOjpzdHJpbmcgZmllbGRfdmFyID0gbmFtZXJfLlZhcmlhYmxlKGZpZWxkLm5hbWUpOwotICAgIGNvbnN0IHN0ZDo6c3RyaW5nIGZpZWxkX21ldGhvZCA9IG5hbWVyXy5NZXRob2QoZmllbGQubmFtZSk7CisgICAgY29uc3Qgc3RkOjpzdHJpbmcgZmllbGRfdmFyID0gbmFtZXJfLlZhcmlhYmxlKGZpZWxkKTsKKyAgICBjb25zdCBzdGQ6OnN0cmluZyBmaWVsZF9tZXRob2QgPSBuYW1lcl8uTWV0aG9kKGZpZWxkKTsKIAogICAgIC8vIEdlbmVyYXRlIG1ldGhvZCB3aXRoIHN0cnVjdCBuYW1lLgotICAgIGNvZGUgKz0gImRlZiAiICsgbmFtZXJfLlR5cGUoc3RydWN0X2RlZi5uYW1lKSArICJBZGQiICsgZmllbGRfbWV0aG9kOworICAgIGNvZGUgKz0gImRlZiAiICsgbmFtZXJfLlR5cGUoc3RydWN0X2RlZikgKyAiQWRkIiArIGZpZWxkX21ldGhvZDsKICAgICBjb2RlICs9ICIoYnVpbGRlciwgIjsKICAgICBjb2RlICs9IGZpZWxkX3ZhcjsKICAgICBjb2RlICs9ICIpOiAiOwpAQCAtNjAyLDE2ICs1OTksMjAgQEAKICAgICAgIGNvZGUgKz0gZmllbGRfdmFyOwogICAgIH0KICAgICBjb2RlICs9ICIsICI7Ci0gICAgY29kZSArPSBJc0Zsb2F0KGZpZWxkLnZhbHVlLnR5cGUuYmFzZV90eXBlKQotICAgICAgICAgICAgICAgID8gZmxvYXRfY29uc3RfZ2VuXy5HZW5GbG9hdENvbnN0YW50KGZpZWxkKQotICAgICAgICAgICAgICAgIDogZmllbGQudmFsdWUuY29uc3RhbnQ7CisgICAgaWYgKGZpZWxkLklzU2NhbGFyT3B0aW9uYWwoKSkgeworICAgICAgY29kZSArPSAiTm9uZSI7CisgICAgfSBlbHNlIGlmIChJc0Zsb2F0KGZpZWxkLnZhbHVlLnR5cGUuYmFzZV90eXBlKSkgeworICAgICAgY29kZSArPSBmbG9hdF9jb25zdF9nZW5fLkdlbkZsb2F0Q29uc3RhbnQoZmllbGQpOworICAgIH0gZWxzZSB7CisgICAgICBjb2RlICs9IGZpZWxkLnZhbHVlLmNvbnN0YW50OworICAgIH0KICAgICBjb2RlICs9ICIpXG4iOwogCiAgICAgaWYgKCFwYXJzZXJfLm9wdHMub25lX2ZpbGUpIHsKICAgICAgIC8vIEdlbmVyYXRlIG1ldGhvZCB3aXRob3V0IHN0cnVjdCBuYW1lLgogICAgICAgY29kZSArPSAiZGVmIEFkZCIgKyBmaWVsZF9tZXRob2QgKyAiKGJ1aWxkZXIsICIgKyBmaWVsZF92YXIgKyAiKTpcbiI7Ci0gICAgICBjb2RlICs9IEluZGVudCArICJyZXR1cm4gIiArIG5hbWVyXy5UeXBlKHN0cnVjdF9kZWYubmFtZSkgKyAiQWRkIiArCi0gICAgICAgICAgICAgIGZpZWxkX21ldGhvZDsKKyAgICAgIGNvZGUgKz0KKyAgICAgICAgICBJbmRlbnQgKyAicmV0dXJuICIgKyBuYW1lcl8uVHlwZShzdHJ1Y3RfZGVmKSArICJBZGQiICsgZmllbGRfbWV0aG9kOwogICAgICAgY29kZSArPSAiKGJ1aWxkZXIsICI7CiAgICAgICBjb2RlICs9IGZpZWxkX3ZhcjsKICAgICAgIGNvZGUgKz0gIilcbiI7CkBAIC02MjIsOCArNjIzLDggQEAKICAgdm9pZCBCdWlsZFZlY3Rvck9mVGFibGUoY29uc3QgU3RydWN0RGVmICZzdHJ1Y3RfZGVmLCBjb25zdCBGaWVsZERlZiAmZmllbGQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nICpjb2RlX3B0cikgY29uc3QgewogICAgIGF1dG8gJmNvZGUgPSAqY29kZV9wdHI7Ci0gICAgY29uc3Qgc3RkOjpzdHJpbmcgc3RydWN0X3R5cGUgPSBuYW1lcl8uVHlwZShzdHJ1Y3RfZGVmLm5hbWUpOwotICAgIGNvbnN0IHN0ZDo6c3RyaW5nIGZpZWxkX21ldGhvZCA9IG5hbWVyXy5NZXRob2QoZmllbGQubmFtZSk7CisgICAgY29uc3Qgc3RkOjpzdHJpbmcgc3RydWN0X3R5cGUgPSBuYW1lcl8uVHlwZShzdHJ1Y3RfZGVmKTsKKyAgICBjb25zdCBzdGQ6OnN0cmluZyBmaWVsZF9tZXRob2QgPSBuYW1lcl8uTWV0aG9kKGZpZWxkKTsKIAogICAgIC8vIEdlbmVyYXRlIG1ldGhvZCB3aXRoIHN0cnVjdCBuYW1lLgogICAgIGNvZGUgKz0gImRlZiAiICsgc3RydWN0X3R5cGUgKyAiU3RhcnQiICsgZmllbGRfbWV0aG9kOwpAQCAtNjUzLDggKzY1NCw4IEBACiAgICAgaWYgKCFuZXN0ZWQpIHsgcmV0dXJuOyB9ICAvLyBUaGVyZSBpcyBubyBuZXN0ZWQgZmxhdGJ1ZmZlci4KIAogICAgIGF1dG8gJmNvZGUgPSAqY29kZV9wdHI7Ci0gICAgY29uc3Qgc3RkOjpzdHJpbmcgZmllbGRfbWV0aG9kID0gbmFtZXJfLk1ldGhvZChmaWVsZC5uYW1lKTsKLSAgICBjb25zdCBzdGQ6OnN0cmluZyBzdHJ1Y3RfdHlwZSA9IG5hbWVyXy5UeXBlKHN0cnVjdF9kZWYubmFtZSk7CisgICAgY29uc3Qgc3RkOjpzdHJpbmcgZmllbGRfbWV0aG9kID0gbmFtZXJfLk1ldGhvZChmaWVsZCk7CisgICAgY29uc3Qgc3RkOjpzdHJpbmcgc3RydWN0X3R5cGUgPSBuYW1lcl8uVHlwZShzdHJ1Y3RfZGVmKTsKIAogICAgIC8vIEdlbmVyYXRlIG1ldGhvZCB3aXRoIHN0cnVjdCBhbmQgZmllbGQgbmFtZS4KICAgICBjb2RlICs9ICJkZWYgIiArIHN0cnVjdF90eXBlICsgIk1ha2UiICsgZmllbGRfbWV0aG9kOwpAQCAtNjg1LDIyICs2ODYsMjEgQEAKICAgICBhdXRvICZjb2RlID0gKmNvZGVfcHRyOwogCiAgICAgLy8gR2VuZXJhdGUgbWV0aG9kIHdpdGggc3RydWN0IG5hbWUuCi0gICAgY29kZSArPSAiZGVmICIgKyBuYW1lcl8uVHlwZShzdHJ1Y3RfZGVmLm5hbWUpICsgIkVuZCI7CisgICAgY29kZSArPSAiZGVmICIgKyBuYW1lcl8uVHlwZShzdHJ1Y3RfZGVmKSArICJFbmQiOwogICAgIGNvZGUgKz0gIihidWlsZGVyKTogIjsKICAgICBjb2RlICs9ICJyZXR1cm4gYnVpbGRlci5FbmRPYmplY3QoKVxuIjsKIAogICAgIGlmICghcGFyc2VyXy5vcHRzLm9uZV9maWxlKSB7CiAgICAgICAvLyBHZW5lcmF0ZSBtZXRob2Qgd2l0aG91dCBzdHJ1Y3QgbmFtZS4KICAgICAgIGNvZGUgKz0gImRlZiBFbmQoYnVpbGRlcik6XG4iOwotICAgICAgY29kZSArPQotICAgICAgICAgIEluZGVudCArICJyZXR1cm4gIiArIG5hbWVyXy5UeXBlKHN0cnVjdF9kZWYubmFtZSkgKyAiRW5kKGJ1aWxkZXIpIjsKKyAgICAgIGNvZGUgKz0gSW5kZW50ICsgInJldHVybiAiICsgbmFtZXJfLlR5cGUoc3RydWN0X2RlZikgKyAiRW5kKGJ1aWxkZXIpIjsKICAgICB9CiAgIH0KIAogICAvLyBHZW5lcmF0ZSB0aGUgcmVjZWl2ZXIgZm9yIGZ1bmN0aW9uIHNpZ25hdHVyZXMuCiAgIHZvaWQgR2VuUmVjZWl2ZXIoY29uc3QgU3RydWN0RGVmICZzdHJ1Y3RfZGVmLCBzdGQ6OnN0cmluZyAqY29kZV9wdHIpIGNvbnN0IHsKICAgICBhdXRvICZjb2RlID0gKmNvZGVfcHRyOwotICAgIGNvZGUgKz0gSW5kZW50ICsgIiMgIiArIG5hbWVyXy5UeXBlKHN0cnVjdF9kZWYubmFtZSkgKyAiXG4iOworICAgIGNvZGUgKz0gSW5kZW50ICsgIiMgIiArIG5hbWVyXy5UeXBlKHN0cnVjdF9kZWYpICsgIlxuIjsKICAgICBjb2RlICs9IEluZGVudCArICJkZWYgIjsKICAgfQogCkBAIC03OTUsNyArNzk1LDcgQEAKICAgICB9CiAKICAgICBjb2RlICs9IEluZGVudCArICJAY2xhc3NtZXRob2RcbiI7Ci0gICAgY29kZSArPSBJbmRlbnQgKyAiZGVmICIgKyBuYW1lcl8uVHlwZShzdHJ1Y3RfZGVmLm5hbWUpOworICAgIGNvZGUgKz0gSW5kZW50ICsgImRlZiAiICsgbmFtZXJfLlR5cGUoc3RydWN0X2RlZik7CiAgICAgY29kZSArPSAiQnVmZmVySGFzSWRlbnRpZmllcihjbHMsIGJ1Ziwgb2Zmc2V0LCBzaXplX3ByZWZpeGVkPUZhbHNlKToiOwogICAgIGNvZGUgKz0gIlxuIjsKICAgICBjb2RlICs9IEluZGVudCArIEluZGVudDsKQEAgLTg0Niw3ICs4NDYsNyBAQAogICB2b2lkIEdlblJlY2VpdmVyRm9yT2JqZWN0QVBJKGNvbnN0IFN0cnVjdERlZiAmc3RydWN0X2RlZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyAqY29kZV9wdHIpIGNvbnN0IHsKICAgICBhdXRvICZjb2RlID0gKmNvZGVfcHRyOwotICAgIGNvZGUgKz0gR2VuSW5kZW50cygxKSArICIjICIgKyBuYW1lcl8uT2JqZWN0VHlwZShzdHJ1Y3RfZGVmLm5hbWUpOworICAgIGNvZGUgKz0gR2VuSW5kZW50cygxKSArICIjICIgKyBuYW1lcl8uT2JqZWN0VHlwZShzdHJ1Y3RfZGVmKTsKICAgICBjb2RlICs9IEdlbkluZGVudHMoMSkgKyAiZGVmICI7CiAgIH0KIApAQCAtODU0LDcgKzg1NCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyAqY29kZV9wdHIpIGNvbnN0IHsKICAgICBhdXRvICZjb2RlID0gKmNvZGVfcHRyOwogICAgIGNvZGUgKz0gIlxuIjsKLSAgICBjb2RlICs9ICJjbGFzcyAiICsgbmFtZXJfLk9iamVjdFR5cGUoc3RydWN0X2RlZi5uYW1lKSArICIob2JqZWN0KToiOworICAgIGNvZGUgKz0gImNsYXNzICIgKyBuYW1lcl8uT2JqZWN0VHlwZShzdHJ1Y3RfZGVmKSArICIob2JqZWN0KToiOwogICAgIGNvZGUgKz0gIlxuIjsKICAgfQogCkBAIC04NzgsNyArODc4LDkgQEAKIAogICBzdGQ6OnN0cmluZyBHZXREZWZhdWx0VmFsdWUoY29uc3QgRmllbGREZWYgJmZpZWxkKSBjb25zdCB7CiAgICAgQmFzZVR5cGUgYmFzZV90eXBlID0gZmllbGQudmFsdWUudHlwZS5iYXNlX3R5cGU7Ci0gICAgaWYgKElzQm9vbChiYXNlX3R5cGUpKSB7CisgICAgaWYgKGZpZWxkLklzU2NhbGFyT3B0aW9uYWwoKSkgeworICAgICAgcmV0dXJuICJOb25lIjsKKyAgICB9IGVsc2UgaWYgKElzQm9vbChiYXNlX3R5cGUpKSB7CiAgICAgICByZXR1cm4gZmllbGQudmFsdWUuY29uc3RhbnQgPT0gIjAiID8gIkZhbHNlIiA6ICJUcnVlIjsKICAgICB9IGVsc2UgaWYgKElzRmxvYXQoYmFzZV90eXBlKSkgewogICAgICAgcmV0dXJuIGZsb2F0X2NvbnN0X2dlbl8uR2VuRmxvYXRDb25zdGFudChmaWVsZCk7CkBAIC05MDcsNyArOTA5LDcgQEAKICAgICAgIHN0ZDo6c3RyaW5nIGZpZWxkX3R5cGU7CiAgICAgICBzd2l0Y2ggKGV2LnVuaW9uX3R5cGUuYmFzZV90eXBlKSB7CiAgICAgICAgIGNhc2UgQkFTRV9UWVBFX1NUUlVDVDoKLSAgICAgICAgICBmaWVsZF90eXBlID0gbmFtZXJfLk9iamVjdFR5cGUoZXYudW5pb25fdHlwZS5zdHJ1Y3RfZGVmLT5uYW1lKTsKKyAgICAgICAgICBmaWVsZF90eXBlID0gbmFtZXJfLk9iamVjdFR5cGUoKmV2LnVuaW9uX3R5cGUuc3RydWN0X2RlZik7CiAgICAgICAgICAgaWYgKHBhcnNlcl8ub3B0cy5pbmNsdWRlX2RlcGVuZGVuY2VfaGVhZGVycykgewogICAgICAgICAgICAgYXV0byBwYWNrYWdlX3JlZmVyZW5jZSA9IEdlblBhY2thZ2VSZWZlcmVuY2UoZXYudW5pb25fdHlwZSk7CiAgICAgICAgICAgICBmaWVsZF90eXBlID0gcGFja2FnZV9yZWZlcmVuY2UgKyAiLiIgKyBmaWVsZF90eXBlOwpAQCAtOTI3LDggKzkyOSw3IEBACiAKICAgICAvLyBHZXRzIHRoZSBpbXBvcnQgbGlzdHMgZm9yIHRoZSB1bmlvbi4KICAgICBpZiAocGFyc2VyXy5vcHRzLmluY2x1ZGVfZGVwZW5kZW5jZV9oZWFkZXJzKSB7Ci0gICAgICBjb25zdCBhdXRvIHBhY2thZ2VfcmVmZXJlbmNlID0KLSAgICAgICAgICBHZW5QYWNrYWdlUmVmZXJlbmNlKCpmaWVsZC52YWx1ZS50eXBlLmVudW1fZGVmKTsKKyAgICAgIGNvbnN0IGF1dG8gcGFja2FnZV9yZWZlcmVuY2UgPSBHZW5QYWNrYWdlUmVmZXJlbmNlKGZpZWxkLnZhbHVlLnR5cGUpOwogICAgICAgaW1wb3J0X2xpc3QtPmluc2VydCgiaW1wb3J0ICIgKyBwYWNrYWdlX3JlZmVyZW5jZSk7CiAgICAgfQogICB9CkBAIC05MzksNyArOTQwLDcgQEAKICAgICBpbXBvcnRfdHlwaW5nX2xpc3QtPmluc2VydCgiT3B0aW9uYWwiKTsKICAgICBhdXRvICZvdXRwdXQgPSAqb3V0X3B0cjsKICAgICBjb25zdCBUeXBlICZ0eXBlID0gZmllbGQudmFsdWUudHlwZTsKLSAgICBjb25zdCBzdGQ6OnN0cmluZyBvYmplY3RfdHlwZSA9IG5hbWVyXy5PYmplY3RUeXBlKHR5cGUuc3RydWN0X2RlZi0+bmFtZSk7CisgICAgY29uc3Qgc3RkOjpzdHJpbmcgb2JqZWN0X3R5cGUgPSBuYW1lcl8uT2JqZWN0VHlwZSgqdHlwZS5zdHJ1Y3RfZGVmKTsKICAgICBpZiAocGFyc2VyXy5vcHRzLmluY2x1ZGVfZGVwZW5kZW5jZV9oZWFkZXJzKSB7CiAgICAgICBhdXRvIHBhY2thZ2VfcmVmZXJlbmNlID0gR2VuUGFja2FnZVJlZmVyZW5jZSh0eXBlKTsKICAgICAgIG91dHB1dCA9IHBhY2thZ2VfcmVmZXJlbmNlICsgIi4iICsgb2JqZWN0X3R5cGUgKyAiXSI7CkBAIC05NTksNyArOTYwLDcgQEAKICAgICBjb25zdCBCYXNlVHlwZSBiYXNlX3R5cGUgPSB2ZWN0b3JfdHlwZS5iYXNlX3R5cGU7CiAgICAgaWYgKGJhc2VfdHlwZSA9PSBCQVNFX1RZUEVfU1RSVUNUKSB7CiAgICAgICBjb25zdCBzdGQ6OnN0cmluZyBvYmplY3RfdHlwZSA9Ci0gICAgICAgICAgbmFtZXJfLk9iamVjdFR5cGUoR2VuVHlwZUdldCh2ZWN0b3JfdHlwZSkpOworICAgICAgICAgIG5hbWVyXy5PYmplY3RUeXBlKCp2ZWN0b3JfdHlwZS5zdHJ1Y3RfZGVmKTsKICAgICAgIGZpZWxkX3R5cGUgPSBvYmplY3RfdHlwZSArICJdIjsKICAgICAgIGlmIChwYXJzZXJfLm9wdHMuaW5jbHVkZV9kZXBlbmRlbmNlX2hlYWRlcnMpIHsKICAgICAgICAgYXV0byBwYWNrYWdlX3JlZmVyZW5jZSA9IEdlblBhY2thZ2VSZWZlcmVuY2UodmVjdG9yX3R5cGUpOwpAQCAtMTAwMiwxMiArMTAwMywxNSBAQAogICAgICAgICBkZWZhdWx0OgogICAgICAgICAgIC8vIFNjYWxhciBvciBzdGluZyBmaWVsZHMuCiAgICAgICAgICAgZmllbGRfdHlwZSA9IEdldEJhc2VQeXRob25UeXBlRm9yU2NhbGFyQW5kU3RyaW5nKGJhc2VfdHlwZSk7CisgICAgICAgICAgaWYgKGZpZWxkLklzU2NhbGFyT3B0aW9uYWwoKSkgeworICAgICAgICAgICAgZmllbGRfdHlwZSA9ICJPcHRpb25hbFsiICsgZmllbGRfdHlwZSArICJdIjsKKyAgICAgICAgICB9CiAgICAgICAgICAgYnJlYWs7CiAgICAgICB9CiAKICAgICAgIGNvbnN0IGF1dG8gZGVmYXVsdF92YWx1ZSA9IEdldERlZmF1bHRWYWx1ZShmaWVsZCk7CiAgICAgICAvLyBXcnRpZXMgdGhlIGluaXQgc3RhdGVtZW50LgotICAgICAgY29uc3QgYXV0byBmaWVsZF9maWVsZCA9IG5hbWVyXy5GaWVsZChmaWVsZC5uYW1lKTsKKyAgICAgIGNvbnN0IGF1dG8gZmllbGRfZmllbGQgPSBuYW1lcl8uRmllbGQoZmllbGQpOwogICAgICAgY29kZSArPSBHZW5JbmRlbnRzKDIpICsgInNlbGYuIiArIGZpZWxkX2ZpZWxkICsgIiA9ICIgKyBkZWZhdWx0X3ZhbHVlICsKICAgICAgICAgICAgICAgIiAgIyB0eXBlOiAiICsgZmllbGRfdHlwZTsKICAgICB9CkBAIC0xMDQ1LDE1ICsxMDQ5LDE1IEBACiAgICAgfQogCiAgICAgLy8gUmVtb3ZlcyB0aGUgaW1wb3J0IG9mIHRoZSBzdHJ1Y3QgaXRzZWxmLCBpZiBhcHBsaWVkLgotICAgIGF1dG8gc3RydWN0X2ltcG9ydCA9ICJpbXBvcnQgIiArIEdlblBhY2thZ2VSZWZlcmVuY2Uoc3RydWN0X2RlZik7CisgICAgYXV0byBzdHJ1Y3RfaW1wb3J0ID0gImltcG9ydCAiICsgbmFtZXJfLk5hbWVzcGFjZWRUeXBlKHN0cnVjdF9kZWYpOwogICAgIGltcG9ydF9saXN0LT5lcmFzZShzdHJ1Y3RfaW1wb3J0KTsKICAgfQogCiAgIHZvaWQgSW5pdGlhbGl6ZUZyb21CdWYoY29uc3QgU3RydWN0RGVmICZzdHJ1Y3RfZGVmLAogICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nICpjb2RlX3B0cikgY29uc3QgewogICAgIGF1dG8gJmNvZGUgPSAqY29kZV9wdHI7Ci0gICAgY29uc3QgYXV0byBzdHJ1Y3RfdmFyID0gbmFtZXJfLlZhcmlhYmxlKHN0cnVjdF9kZWYubmFtZSk7Ci0gICAgY29uc3QgYXV0byBzdHJ1Y3RfdHlwZSA9IG5hbWVyXy5UeXBlKHN0cnVjdF9kZWYubmFtZSk7CisgICAgY29uc3QgYXV0byBzdHJ1Y3RfdmFyID0gbmFtZXJfLlZhcmlhYmxlKHN0cnVjdF9kZWYpOworICAgIGNvbnN0IGF1dG8gc3RydWN0X3R5cGUgPSBuYW1lcl8uVHlwZShzdHJ1Y3RfZGVmKTsKIAogICAgIGNvZGUgKz0gR2VuSW5kZW50cygxKSArICJAY2xhc3NtZXRob2QiOwogICAgIGNvZGUgKz0gR2VuSW5kZW50cygxKSArICJkZWYgSW5pdEZyb21CdWYoY2xzLCBidWYsIHBvcyk6IjsKQEAgLTEwNjYsOCArMTA3MCw4IEBACiAgIHZvaWQgSW5pdGlhbGl6ZUZyb21PYmpGb3JPYmplY3QoY29uc3QgU3RydWN0RGVmICZzdHJ1Y3RfZGVmLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nICpjb2RlX3B0cikgY29uc3QgewogICAgIGF1dG8gJmNvZGUgPSAqY29kZV9wdHI7Ci0gICAgY29uc3QgYXV0byBzdHJ1Y3RfdmFyID0gbmFtZXJfLlZhcmlhYmxlKHN0cnVjdF9kZWYubmFtZSk7Ci0gICAgY29uc3QgYXV0byBzdHJ1Y3Rfb2JqZWN0ID0gbmFtZXJfLk9iamVjdFR5cGUoc3RydWN0X2RlZi5uYW1lKTsKKyAgICBjb25zdCBhdXRvIHN0cnVjdF92YXIgPSBuYW1lcl8uVmFyaWFibGUoc3RydWN0X2RlZik7CisgICAgY29uc3QgYXV0byBzdHJ1Y3Rfb2JqZWN0ID0gbmFtZXJfLk9iamVjdFR5cGUoc3RydWN0X2RlZik7CiAKICAgICBjb2RlICs9IEdlbkluZGVudHMoMSkgKyAiQGNsYXNzbWV0aG9kIjsKICAgICBjb2RlICs9IEdlbkluZGVudHMoMSkgKyAiZGVmIEluaXRGcm9tT2JqKGNscywgIiArIHN0cnVjdF92YXIgKyAiKToiOwpAQCAtMTA4MCw5ICsxMDg0LDkgQEAKICAgdm9pZCBHZW5VblBhY2tGb3JTdHJ1Y3QoY29uc3QgU3RydWN0RGVmICZzdHJ1Y3RfZGVmLCBjb25zdCBGaWVsZERlZiAmZmllbGQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nICpjb2RlX3B0cikgY29uc3QgewogICAgIGF1dG8gJmNvZGUgPSAqY29kZV9wdHI7Ci0gICAgY29uc3QgYXV0byBzdHJ1Y3RfdmFyID0gbmFtZXJfLlZhcmlhYmxlKHN0cnVjdF9kZWYubmFtZSk7Ci0gICAgY29uc3QgYXV0byBmaWVsZF9maWVsZCA9IG5hbWVyXy5GaWVsZChmaWVsZC5uYW1lKTsKLSAgICBjb25zdCBhdXRvIGZpZWxkX21ldGhvZCA9IG5hbWVyXy5NZXRob2QoZmllbGQubmFtZSk7CisgICAgY29uc3QgYXV0byBzdHJ1Y3RfdmFyID0gbmFtZXJfLlZhcmlhYmxlKHN0cnVjdF9kZWYpOworICAgIGNvbnN0IGF1dG8gZmllbGRfZmllbGQgPSBuYW1lcl8uRmllbGQoZmllbGQpOworICAgIGNvbnN0IGF1dG8gZmllbGRfbWV0aG9kID0gbmFtZXJfLk1ldGhvZChmaWVsZCk7CiAgICAgYXV0byBmaWVsZF90eXBlID0gVHlwZU5hbWUoZmllbGQpOwogCiAgICAgaWYgKHBhcnNlcl8ub3B0cy5pbmNsdWRlX2RlcGVuZGVuY2VfaGVhZGVycykgewpAQCAtMTEwOCwxNCArMTExMiwxNCBAQAogICB2b2lkIEdlblVuUGFja0ZvclVuaW9uKGNvbnN0IFN0cnVjdERlZiAmc3RydWN0X2RlZiwgY29uc3QgRmllbGREZWYgJmZpZWxkLAogICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nICpjb2RlX3B0cikgY29uc3QgewogICAgIGF1dG8gJmNvZGUgPSAqY29kZV9wdHI7Ci0gICAgY29uc3QgYXV0byBmaWVsZF9maWVsZCA9IG5hbWVyXy5GaWVsZChmaWVsZC5uYW1lKTsKLSAgICBjb25zdCBhdXRvIGZpZWxkX21ldGhvZCA9IG5hbWVyXy5NZXRob2QoZmllbGQubmFtZSk7Ci0gICAgY29uc3QgYXV0byBzdHJ1Y3RfdmFyID0gbmFtZXJfLlZhcmlhYmxlKHN0cnVjdF9kZWYubmFtZSk7CisgICAgY29uc3QgYXV0byBmaWVsZF9maWVsZCA9IG5hbWVyXy5GaWVsZChmaWVsZCk7CisgICAgY29uc3QgYXV0byBmaWVsZF9tZXRob2QgPSBuYW1lcl8uTWV0aG9kKGZpZWxkKTsKKyAgICBjb25zdCBhdXRvIHN0cnVjdF92YXIgPSBuYW1lcl8uVmFyaWFibGUoc3RydWN0X2RlZik7CiAgICAgY29uc3QgRW51bURlZiAmZW51bV9kZWYgPSAqZmllbGQudmFsdWUudHlwZS5lbnVtX2RlZjsKLSAgICBhdXRvIHVuaW9uX3R5cGUgPSBuYW1lcl8uTmFtZXNwYWNlKGVudW1fZGVmLm5hbWUpOworICAgIGF1dG8gdW5pb25fdHlwZSA9IG5hbWVyXy5UeXBlKGVudW1fZGVmKTsKIAogICAgIGlmIChwYXJzZXJfLm9wdHMuaW5jbHVkZV9kZXBlbmRlbmNlX2hlYWRlcnMpIHsKLSAgICAgIHVuaW9uX3R5cGUgPSBHZW5QYWNrYWdlUmVmZXJlbmNlKGVudW1fZGVmKSArICIuIiArIHVuaW9uX3R5cGU7CisgICAgICB1bmlvbl90eXBlID0gbmFtZXJfLk5hbWVzcGFjZWRUeXBlKGVudW1fZGVmKSArICIuIiArIHVuaW9uX3R5cGU7CiAgICAgfQogICAgIGNvZGUgKz0gR2VuSW5kZW50cygyKSArICJzZWxmLiIgKyBmaWVsZF9maWVsZCArICIgPSAiICsgdW5pb25fdHlwZSArCiAgICAgICAgICAgICAiQ3JlYXRvcigiICsgInNlbGYuIiArIGZpZWxkX2ZpZWxkICsgIlR5cGUsICIgKyBzdHJ1Y3RfdmFyICsgIi4iICsKQEAgLTExMjYsOSArMTEzMCw5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpZWxkRGVmICZmaWVsZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgKmNvZGVfcHRyKSBjb25zdCB7CiAgICAgYXV0byAmY29kZSA9ICpjb2RlX3B0cjsKLSAgICBjb25zdCBhdXRvIGZpZWxkX2ZpZWxkID0gbmFtZXJfLkZpZWxkKGZpZWxkLm5hbWUpOwotICAgIGNvbnN0IGF1dG8gZmllbGRfbWV0aG9kID0gbmFtZXJfLk1ldGhvZChmaWVsZC5uYW1lKTsKLSAgICBjb25zdCBhdXRvIHN0cnVjdF92YXIgPSBuYW1lcl8uVmFyaWFibGUoc3RydWN0X2RlZi5uYW1lKTsKKyAgICBjb25zdCBhdXRvIGZpZWxkX2ZpZWxkID0gbmFtZXJfLkZpZWxkKGZpZWxkKTsKKyAgICBjb25zdCBhdXRvIGZpZWxkX21ldGhvZCA9IG5hbWVyXy5NZXRob2QoZmllbGQpOworICAgIGNvbnN0IGF1dG8gc3RydWN0X3ZhciA9IG5hbWVyXy5WYXJpYWJsZShzdHJ1Y3RfZGVmKTsKIAogICAgIGNvZGUgKz0gR2VuSW5kZW50cygyKSArICJpZiBub3QgIiArIHN0cnVjdF92YXIgKyAiLiIgKyBmaWVsZF9tZXRob2QgKwogICAgICAgICAgICAgIklzTm9uZSgpOiI7CkBAIC0xMTYwLDkgKzExNjQsOSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyAqY29kZV9wdHIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRlbnRzKSBjb25zdCB7CiAgICAgYXV0byAmY29kZSA9ICpjb2RlX3B0cjsKLSAgICBjb25zdCBhdXRvIGZpZWxkX2ZpZWxkID0gbmFtZXJfLkZpZWxkKGZpZWxkLm5hbWUpOwotICAgIGNvbnN0IGF1dG8gZmllbGRfbWV0aG9kID0gbmFtZXJfLk1ldGhvZChmaWVsZC5uYW1lKTsKLSAgICBjb25zdCBhdXRvIHN0cnVjdF92YXIgPSBuYW1lcl8uVmFyaWFibGUoc3RydWN0X2RlZi5uYW1lKTsKKyAgICBjb25zdCBhdXRvIGZpZWxkX2ZpZWxkID0gbmFtZXJfLkZpZWxkKGZpZWxkKTsKKyAgICBjb25zdCBhdXRvIGZpZWxkX21ldGhvZCA9IG5hbWVyXy5NZXRob2QoZmllbGQpOworICAgIGNvbnN0IGF1dG8gc3RydWN0X3ZhciA9IG5hbWVyXy5WYXJpYWJsZShzdHJ1Y3RfZGVmKTsKIAogICAgIGNvZGUgKz0gR2VuSW5kZW50cyhpbmRlbnRzKSArICJzZWxmLiIgKyBmaWVsZF9maWVsZCArICIgPSBbXSI7CiAgICAgY29kZSArPSBHZW5JbmRlbnRzKGluZGVudHMpICsgImZvciBpIGluIHJhbmdlKCIgKyBzdHJ1Y3RfdmFyICsgIi4iICsKQEAgLTExNzUsOSArMTE3OSw5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpZWxkRGVmICZmaWVsZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgKmNvZGVfcHRyKSBjb25zdCB7CiAgICAgYXV0byAmY29kZSA9ICpjb2RlX3B0cjsKLSAgICBjb25zdCBhdXRvIGZpZWxkX2ZpZWxkID0gbmFtZXJfLkZpZWxkKGZpZWxkLm5hbWUpOwotICAgIGNvbnN0IGF1dG8gZmllbGRfbWV0aG9kID0gbmFtZXJfLk1ldGhvZChmaWVsZC5uYW1lKTsKLSAgICBjb25zdCBhdXRvIHN0cnVjdF92YXIgPSBuYW1lcl8uVmFyaWFibGUoc3RydWN0X2RlZi5uYW1lKTsKKyAgICBjb25zdCBhdXRvIGZpZWxkX2ZpZWxkID0gbmFtZXJfLkZpZWxkKGZpZWxkKTsKKyAgICBjb25zdCBhdXRvIGZpZWxkX21ldGhvZCA9IG5hbWVyXy5NZXRob2QoZmllbGQpOworICAgIGNvbnN0IGF1dG8gc3RydWN0X3ZhciA9IG5hbWVyXy5WYXJpYWJsZShzdHJ1Y3RfZGVmKTsKIAogICAgIGNvZGUgKz0gR2VuSW5kZW50cygyKSArICJpZiBub3QgIiArIHN0cnVjdF92YXIgKyAiLiIgKyBmaWVsZF9tZXRob2QgKwogICAgICAgICAgICAgIklzTm9uZSgpOiI7CkBAIC0xMjAwLDkgKzEyMDQsOSBAQAogICB2b2lkIEdlblVuUGFja0ZvclNjYWxhcihjb25zdCBTdHJ1Y3REZWYgJnN0cnVjdF9kZWYsIGNvbnN0IEZpZWxkRGVmICZmaWVsZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgKmNvZGVfcHRyKSBjb25zdCB7CiAgICAgYXV0byAmY29kZSA9ICpjb2RlX3B0cjsKLSAgICBjb25zdCBhdXRvIGZpZWxkX2ZpZWxkID0gbmFtZXJfLkZpZWxkKGZpZWxkLm5hbWUpOwotICAgIGNvbnN0IGF1dG8gZmllbGRfbWV0aG9kID0gbmFtZXJfLk1ldGhvZChmaWVsZC5uYW1lKTsKLSAgICBjb25zdCBhdXRvIHN0cnVjdF92YXIgPSBuYW1lcl8uVmFyaWFibGUoc3RydWN0X2RlZi5uYW1lKTsKKyAgICBjb25zdCBhdXRvIGZpZWxkX2ZpZWxkID0gbmFtZXJfLkZpZWxkKGZpZWxkKTsKKyAgICBjb25zdCBhdXRvIGZpZWxkX21ldGhvZCA9IG5hbWVyXy5NZXRob2QoZmllbGQpOworICAgIGNvbnN0IGF1dG8gc3RydWN0X3ZhciA9IG5hbWVyXy5WYXJpYWJsZShzdHJ1Y3RfZGVmKTsKIAogICAgIGNvZGUgKz0gR2VuSW5kZW50cygyKSArICJzZWxmLiIgKyBmaWVsZF9maWVsZCArICIgPSAiICsgc3RydWN0X3ZhciArICIuIiArCiAgICAgICAgICAgICBmaWVsZF9tZXRob2QgKyAiKCkiOwpAQCAtMTI0OCw3ICsxMjUyLDcgQEAKIAogICAgIC8vIFdyaXRlcyBpbXBvcnQgc3RhdGVtZW50cyBhbmQgY29kZSBpbnRvIHRoZSBnZW5lcmF0ZWQgZmlsZS4KICAgICBhdXRvICZjb2RlX2Jhc2UgPSAqY29kZV9wdHI7Ci0gICAgY29uc3QgYXV0byBzdHJ1Y3RfdmFyID0gbmFtZXJfLlZhcmlhYmxlKHN0cnVjdF9kZWYubmFtZSk7CisgICAgY29uc3QgYXV0byBzdHJ1Y3RfdmFyID0gbmFtZXJfLlZhcmlhYmxlKHN0cnVjdF9kZWYpOwogCiAgICAgR2VuUmVjZWl2ZXJGb3JPYmplY3RBUEkoc3RydWN0X2RlZiwgY29kZV9wdHIpOwogICAgIGNvZGVfYmFzZSArPSAiX1VuUGFjayhzZWxmLCAiICsgc3RydWN0X3ZhciArICIpOiI7CkBAIC0xMjY5LDcgKzEyNzMsNyBAQAogICB2b2lkIEdlblBhY2tGb3JTdHJ1Y3QoY29uc3QgU3RydWN0RGVmICZzdHJ1Y3RfZGVmLAogICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgKmNvZGVfcHRyKSBjb25zdCB7CiAgICAgYXV0byAmY29kZSA9ICpjb2RlX3B0cjsKLSAgICBjb25zdCBhdXRvIHN0cnVjdF9mbiA9IG5hbWVyXy5GdW5jdGlvbihzdHJ1Y3RfZGVmLm5hbWUpOworICAgIGNvbnN0IGF1dG8gc3RydWN0X2ZuID0gbmFtZXJfLkZ1bmN0aW9uKHN0cnVjdF9kZWYpOwogCiAgICAgR2VuUmVjZWl2ZXJGb3JPYmplY3RBUEkoc3RydWN0X2RlZiwgY29kZV9wdHIpOwogICAgIGNvZGUgKz0gIlBhY2soc2VsZiwgYnVpbGRlcik6IjsKQEAgLTEyODksOSArMTI5Myw5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nICpjb2RlX3B0cikgY29uc3QgewogICAgIGF1dG8gJmNvZGVfcHJlZml4ID0gKmNvZGVfcHJlZml4X3B0cjsKICAgICBhdXRvICZjb2RlID0gKmNvZGVfcHRyOwotICAgIGNvbnN0IGF1dG8gZmllbGRfZmllbGQgPSBuYW1lcl8uRmllbGQoZmllbGQubmFtZSk7Ci0gICAgY29uc3QgYXV0byBzdHJ1Y3RfdHlwZSA9IG5hbWVyXy5UeXBlKHN0cnVjdF9kZWYubmFtZSk7Ci0gICAgY29uc3QgYXV0byBmaWVsZF9tZXRob2QgPSBuYW1lcl8uTWV0aG9kKGZpZWxkLm5hbWUpOworICAgIGNvbnN0IGF1dG8gZmllbGRfZmllbGQgPSBuYW1lcl8uRmllbGQoZmllbGQpOworICAgIGNvbnN0IGF1dG8gc3RydWN0X3R5cGUgPSBuYW1lcl8uVHlwZShzdHJ1Y3RfZGVmKTsKKyAgICBjb25zdCBhdXRvIGZpZWxkX21ldGhvZCA9IG5hbWVyXy5NZXRob2QoZmllbGQpOwogCiAgICAgLy8gQ3JlYXRlcyB0aGUgZmllbGQuCiAgICAgY29kZV9wcmVmaXggKz0gR2VuSW5kZW50cygyKSArICJpZiBzZWxmLiIgKyBmaWVsZF9maWVsZCArICIgaXMgbm90IE5vbmU6IjsKQEAgLTEzMzIsOSArMTMzNiw5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nICpjb2RlX3B0ciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGVudHMpIGNvbnN0IHsKICAgICBhdXRvICZjb2RlID0gKmNvZGVfcHRyOwotICAgIGNvbnN0IGF1dG8gZmllbGRfZmllbGQgPSBuYW1lcl8uRmllbGQoZmllbGQubmFtZSk7Ci0gICAgY29uc3QgYXV0byBmaWVsZF9tZXRob2QgPSBuYW1lcl8uTWV0aG9kKGZpZWxkLm5hbWUpOwotICAgIGNvbnN0IGF1dG8gc3RydWN0X3R5cGUgPSBuYW1lcl8uVHlwZShzdHJ1Y3RfZGVmLm5hbWUpOworICAgIGNvbnN0IGF1dG8gZmllbGRfZmllbGQgPSBuYW1lcl8uRmllbGQoZmllbGQpOworICAgIGNvbnN0IGF1dG8gZmllbGRfbWV0aG9kID0gbmFtZXJfLk1ldGhvZChmaWVsZCk7CisgICAgY29uc3QgYXV0byBzdHJ1Y3RfdHlwZSA9IG5hbWVyXy5UeXBlKHN0cnVjdF9kZWYpOwogICAgIGNvbnN0IGF1dG8gdmVjdG9ydHlwZSA9IGZpZWxkLnZhbHVlLnR5cGUuVmVjdG9yVHlwZSgpOwogCiAgICAgY29kZSArPSBHZW5JbmRlbnRzKGluZGVudHMpICsgc3RydWN0X3R5cGUgKyAiU3RhcnQiICsgZmllbGRfbWV0aG9kICsKQEAgLTEzNjgsOSArMTM3Miw5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nICpjb2RlX3B0cikgY29uc3QgewogICAgIGF1dG8gJmNvZGUgPSAqY29kZV9wdHI7CiAgICAgYXV0byAmY29kZV9wcmVmaXggPSAqY29kZV9wcmVmaXhfcHRyOwotICAgIGNvbnN0IGF1dG8gZmllbGRfZmllbGQgPSBuYW1lcl8uRmllbGQoZmllbGQubmFtZSk7Ci0gICAgY29uc3QgYXV0byBmaWVsZF9tZXRob2QgPSBuYW1lcl8uTWV0aG9kKGZpZWxkLm5hbWUpOwotICAgIGNvbnN0IGF1dG8gc3RydWN0X3R5cGUgPSBuYW1lcl8uVHlwZShzdHJ1Y3RfZGVmLm5hbWUpOworICAgIGNvbnN0IGF1dG8gZmllbGRfZmllbGQgPSBuYW1lcl8uRmllbGQoZmllbGQpOworICAgIGNvbnN0IGF1dG8gZmllbGRfbWV0aG9kID0gbmFtZXJfLk1ldGhvZChmaWVsZCk7CisgICAgY29uc3QgYXV0byBzdHJ1Y3RfdHlwZSA9IG5hbWVyXy5UeXBlKHN0cnVjdF9kZWYpOwogCiAgICAgLy8gQWRkcyB0aGUgZmllbGQgaW50byB0aGUgc3RydWN0LgogICAgIGNvZGUgKz0gR2VuSW5kZW50cygyKSArICJpZiBzZWxmLiIgKyBmaWVsZF9maWVsZCArICIgaXMgbm90IE5vbmU6IjsKQEAgLTE0MTEsOSArMTQxNSw5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nICpjb2RlX3B0cikgY29uc3QgewogICAgIGF1dG8gJmNvZGVfcHJlZml4ID0gKmNvZGVfcHJlZml4X3B0cjsKICAgICBhdXRvICZjb2RlID0gKmNvZGVfcHRyOwotICAgIGNvbnN0IGF1dG8gZmllbGRfZmllbGQgPSBuYW1lcl8uRmllbGQoZmllbGQubmFtZSk7Ci0gICAgY29uc3QgYXV0byBmaWVsZF9tZXRob2QgPSBuYW1lcl8uTWV0aG9kKGZpZWxkLm5hbWUpOwotICAgIGNvbnN0IGF1dG8gc3RydWN0X3R5cGUgPSBuYW1lcl8uVHlwZShzdHJ1Y3RfZGVmLm5hbWUpOworICAgIGNvbnN0IGF1dG8gZmllbGRfZmllbGQgPSBuYW1lcl8uRmllbGQoZmllbGQpOworICAgIGNvbnN0IGF1dG8gZmllbGRfbWV0aG9kID0gbmFtZXJfLk1ldGhvZChmaWVsZCk7CisgICAgY29uc3QgYXV0byBzdHJ1Y3RfdHlwZSA9IG5hbWVyXy5UeXBlKHN0cnVjdF9kZWYpOwogCiAgICAgaWYgKGZpZWxkLnZhbHVlLnR5cGUuc3RydWN0X2RlZi0+Zml4ZWQpIHsKICAgICAgIC8vIFB1cmUgc3RydWN0IGZpZWxkcyBuZWVkIHRvIGJlIGNyZWF0ZWQgYWxvbmcgd2l0aCB0aGVpciBwYXJlbnQKQEAgLTE0MzgsOSArMTQ0Miw5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgKmNvZGVfcHRyKSBjb25zdCB7CiAgICAgYXV0byAmY29kZV9wcmVmaXggPSAqY29kZV9wcmVmaXhfcHRyOwogICAgIGF1dG8gJmNvZGUgPSAqY29kZV9wdHI7Ci0gICAgY29uc3QgYXV0byBmaWVsZF9maWVsZCA9IG5hbWVyXy5GaWVsZChmaWVsZC5uYW1lKTsKLSAgICBjb25zdCBhdXRvIGZpZWxkX21ldGhvZCA9IG5hbWVyXy5NZXRob2QoZmllbGQubmFtZSk7Ci0gICAgY29uc3QgYXV0byBzdHJ1Y3RfdHlwZSA9IG5hbWVyXy5UeXBlKHN0cnVjdF9kZWYubmFtZSk7CisgICAgY29uc3QgYXV0byBmaWVsZF9maWVsZCA9IG5hbWVyXy5GaWVsZChmaWVsZCk7CisgICAgY29uc3QgYXV0byBmaWVsZF9tZXRob2QgPSBuYW1lcl8uTWV0aG9kKGZpZWxkKTsKKyAgICBjb25zdCBhdXRvIHN0cnVjdF90eXBlID0gbmFtZXJfLlR5cGUoc3RydWN0X2RlZik7CiAKICAgICAvLyBUT0RPKGx1d2EpOiBUeXBlVCBzaG91bGQgYmUgbW92ZWQgdW5kZXIgdGhlIE5vbmUgY2hlY2sgYXMgd2VsbC4KICAgICBjb2RlX3ByZWZpeCArPSBHZW5JbmRlbnRzKDIpICsgImlmIHNlbGYuIiArIGZpZWxkX2ZpZWxkICsgIiBpcyBub3QgTm9uZToiOwpAQCAtMTQ1NSw4ICsxNDU5LDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgKmNvZGVfcHRyKSBjb25zdCB7CiAgICAgYXV0byAmY29kZV9iYXNlID0gKmNvZGVfcHRyOwogICAgIHN0ZDo6c3RyaW5nIGNvZGUsIGNvZGVfcHJlZml4OwotICAgIGNvbnN0IGF1dG8gc3RydWN0X3ZhciA9IG5hbWVyXy5WYXJpYWJsZShzdHJ1Y3RfZGVmLm5hbWUpOwotICAgIGNvbnN0IGF1dG8gc3RydWN0X3R5cGUgPSBuYW1lcl8uVHlwZShzdHJ1Y3RfZGVmLm5hbWUpOworICAgIGNvbnN0IGF1dG8gc3RydWN0X3ZhciA9IG5hbWVyXy5WYXJpYWJsZShzdHJ1Y3RfZGVmKTsKKyAgICBjb25zdCBhdXRvIHN0cnVjdF90eXBlID0gbmFtZXJfLlR5cGUoc3RydWN0X2RlZik7CiAKICAgICBHZW5SZWNlaXZlckZvck9iamVjdEFQSShzdHJ1Y3RfZGVmLCBjb2RlX3B0cik7CiAgICAgY29kZV9iYXNlICs9ICJQYWNrKHNlbGYsIGJ1aWxkZXIpOiI7CkBAIC0xNDY2LDggKzE0NzAsOCBAQAogICAgICAgYXV0byAmZmllbGQgPSAqKml0OwogICAgICAgaWYgKGZpZWxkLmRlcHJlY2F0ZWQpIGNvbnRpbnVlOwogCi0gICAgICBjb25zdCBhdXRvIGZpZWxkX21ldGhvZCA9IG5hbWVyXy5NZXRob2QoZmllbGQubmFtZSk7Ci0gICAgICBjb25zdCBhdXRvIGZpZWxkX2ZpZWxkID0gbmFtZXJfLkZpZWxkKGZpZWxkLm5hbWUpOworICAgICAgY29uc3QgYXV0byBmaWVsZF9tZXRob2QgPSBuYW1lcl8uTWV0aG9kKGZpZWxkKTsKKyAgICAgIGNvbnN0IGF1dG8gZmllbGRfZmllbGQgPSBuYW1lcl8uRmllbGQoZmllbGQpOwogCiAgICAgICBzd2l0Y2ggKGZpZWxkLnZhbHVlLnR5cGUuYmFzZV90eXBlKSB7CiAgICAgICAgIGNhc2UgQkFTRV9UWVBFX1NUUlVDVDogewpAQCAtMTU1NSwxMiArMTU1OSwxMiBAQAogICB2b2lkIEdlblVuaW9uQ3JlYXRvckZvclN0cnVjdChjb25zdCBFbnVtRGVmICZlbnVtX2RlZiwgY29uc3QgRW51bVZhbCAmZXYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nICpjb2RlX3B0cikgY29uc3QgewogICAgIGF1dG8gJmNvZGUgPSAqY29kZV9wdHI7Ci0gICAgY29uc3QgYXV0byB1bmlvbl90eXBlID0gbmFtZXJfLlR5cGUoZW51bV9kZWYubmFtZSk7Ci0gICAgY29uc3QgYXV0byB2YXJpYW50ID0gbmFtZXJfLlZhcmlhbnQoZXYubmFtZSk7Ci0gICAgYXV0byBmaWVsZF90eXBlID0gbmFtZXJfLk9iamVjdFR5cGUoR2VuVHlwZUdldChldi51bmlvbl90eXBlKSk7CisgICAgY29uc3QgYXV0byB1bmlvbl90eXBlID0gbmFtZXJfLlR5cGUoZW51bV9kZWYpOworICAgIGNvbnN0IGF1dG8gdmFyaWFudCA9IG5hbWVyXy5WYXJpYW50KGV2KTsKKyAgICBhdXRvIGZpZWxkX3R5cGUgPSBuYW1lcl8uT2JqZWN0VHlwZSgqZXYudW5pb25fdHlwZS5zdHJ1Y3RfZGVmKTsKIAotICAgIGNvZGUgKz0gR2VuSW5kZW50cygxKSArICJpZiB1bmlvblR5cGUgPT0gIiArIHVuaW9uX3R5cGUgKyAiKCkuIiArCi0gICAgICAgICAgICB2YXJpYW50ICsgIjoiOworICAgIGNvZGUgKz0KKyAgICAgICAgR2VuSW5kZW50cygxKSArICJpZiB1bmlvblR5cGUgPT0gIiArIHVuaW9uX3R5cGUgKyAiKCkuIiArIHZhcmlhbnQgKyAiOiI7CiAgICAgaWYgKHBhcnNlcl8ub3B0cy5pbmNsdWRlX2RlcGVuZGVuY2VfaGVhZGVycykgewogICAgICAgYXV0byBwYWNrYWdlX3JlZmVyZW5jZSA9IEdlblBhY2thZ2VSZWZlcmVuY2UoZXYudW5pb25fdHlwZSk7CiAgICAgICBjb2RlICs9IEdlbkluZGVudHMoMikgKyAiaW1wb3J0ICIgKyBwYWNrYWdlX3JlZmVyZW5jZTsKQEAgLTE1NzMsMTEgKzE1NzcsMTEgQEAKICAgdm9pZCBHZW5VbmlvbkNyZWF0b3JGb3JTdHJpbmcoY29uc3QgRW51bURlZiAmZW51bV9kZWYsIGNvbnN0IEVudW1WYWwgJmV2LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyAqY29kZV9wdHIpIGNvbnN0IHsKICAgICBhdXRvICZjb2RlID0gKmNvZGVfcHRyOwotICAgIGNvbnN0IGF1dG8gdW5pb25fdHlwZSA9IG5hbWVyXy5UeXBlKGVudW1fZGVmLm5hbWUpOwotICAgIGNvbnN0IGF1dG8gdmFyaWFudCA9IG5hbWVyXy5WYXJpYW50KGV2Lm5hbWUpOworICAgIGNvbnN0IGF1dG8gdW5pb25fdHlwZSA9IG5hbWVyXy5UeXBlKGVudW1fZGVmKTsKKyAgICBjb25zdCBhdXRvIHZhcmlhbnQgPSBuYW1lcl8uVmFyaWFudChldik7CiAKLSAgICBjb2RlICs9IEdlbkluZGVudHMoMSkgKyAiaWYgdW5pb25UeXBlID09ICIgKyB1bmlvbl90eXBlICsgIigpLiIgKwotICAgICAgICAgICAgdmFyaWFudCArICI6IjsKKyAgICBjb2RlICs9CisgICAgICAgIEdlbkluZGVudHMoMSkgKyAiaWYgdW5pb25UeXBlID09ICIgKyB1bmlvbl90eXBlICsgIigpLiIgKyB2YXJpYW50ICsgIjoiOwogICAgIGNvZGUgKz0gR2VuSW5kZW50cygyKSArICJ0YWIgPSBUYWJsZSh0YWJsZS5CeXRlcywgdGFibGUuUG9zKSI7CiAgICAgY29kZSArPSBHZW5JbmRlbnRzKDIpICsgInVuaW9uID0gdGFiLlN0cmluZyh0YWJsZS5Qb3MpIjsKICAgICBjb2RlICs9IEdlbkluZGVudHMoMikgKyAicmV0dXJuIHVuaW9uIjsKQEAgLTE1ODgsNyArMTU5Miw3IEBACiAgICAgaWYgKGVudW1fZGVmLmdlbmVyYXRlZCkgcmV0dXJuOwogCiAgICAgYXV0byAmY29kZSA9ICpjb2RlX3B0cjsKLSAgICBjb25zdCBhdXRvIGVudW1fZm4gPSBuYW1lcl8uRnVuY3Rpb24oZW51bV9kZWYubmFtZSk7CisgICAgY29uc3QgYXV0byBlbnVtX2ZuID0gbmFtZXJfLkZ1bmN0aW9uKGVudW1fZGVmKTsKIAogICAgIGNvZGUgKz0gIlxuIjsKICAgICBjb2RlICs9ICJkZWYgIiArIGVudW1fZm4gKyAiQ3JlYXRvcih1bmlvblR5cGUsIHRhYmxlKToiOwpAQCAtMTcyMSw3ICsxNzI1LDcgQEAKICAgICAgIGlmIChwYXJzZXJfLm9wdHMub25lX2ZpbGUgJiYgIWVudW1jb2RlLmVtcHR5KCkpIHsKICAgICAgICAgKm9uZV9maWxlX2NvZGUgKz0gZW51bWNvZGUgKyAiXG5cbiI7CiAgICAgICB9IGVsc2UgewotICAgICAgICBpZiAoIVNhdmVUeXBlKG5hbWVyXy5GaWxlKGVudW1fZGVmLm5hbWUsIFNraXBGaWxlOjpTdWZmaXgpLAorICAgICAgICBpZiAoIVNhdmVUeXBlKG5hbWVyXy5GaWxlKGVudW1fZGVmLCBTa2lwRmlsZTo6U3VmZml4KSwKICAgICAgICAgICAgICAgICAgICAgICAqZW51bV9kZWYuZGVmaW5lZF9uYW1lc3BhY2UsIGVudW1jb2RlLCBmYWxzZSkpCiAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgfQpAQCAtMTc0Miw3ICsxNzQ2LDcgQEAKICAgICAgIGlmIChwYXJzZXJfLm9wdHMub25lX2ZpbGUgJiYgIWRlY2xjb2RlLmVtcHR5KCkpIHsKICAgICAgICAgKm9uZV9maWxlX2NvZGUgKz0gZGVjbGNvZGUgKyAiXG5cbiI7CiAgICAgICB9IGVsc2UgewotICAgICAgICBpZiAoIVNhdmVUeXBlKG5hbWVyXy5GaWxlKHN0cnVjdF9kZWYubmFtZSwgU2tpcEZpbGU6OlN1ZmZpeCksCisgICAgICAgIGlmICghU2F2ZVR5cGUobmFtZXJfLkZpbGUoc3RydWN0X2RlZiwgU2tpcEZpbGU6OlN1ZmZpeCksCiAgICAgICAgICAgICAgICAgICAgICAgKnN0cnVjdF9kZWYuZGVmaW5lZF9uYW1lc3BhY2UsIGRlY2xjb2RlLCB0cnVlKSkKICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICB9CkBAIC0xNzg5LDcgKzE3OTMsNyBAQAogCiAgcHJpdmF0ZToKICAgY29uc3QgU2ltcGxlRmxvYXRDb25zdGFudEdlbmVyYXRvciBmbG9hdF9jb25zdF9nZW5fOwotICBjb25zdCBOYW1lciBuYW1lcl87CisgIGNvbnN0IElkbE5hbWVyIG5hbWVyXzsKIH07CiAKIH0gIC8vIG5hbWVzcGFjZSBweXRob24KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3NyYy9pZGxfZ2VuX3J1c3QuY3BwIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvc3JjL2lkbF9nZW5fcnVzdC5jcHAKaW5kZXggMGIwYWQ5YS4uNjQzOTFkMCAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvc3JjL2lkbF9nZW5fcnVzdC5jcHAKKysrIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvc3JjL2lkbF9nZW5fcnVzdC5jcHAKQEAgLTIwLDExICsyMCwxMiBAQAogI2luY2x1ZGUgImZsYXRidWZmZXJzL2ZsYXRidWZmZXJzLmgiCiAjaW5jbHVkZSAiZmxhdGJ1ZmZlcnMvaWRsLmgiCiAjaW5jbHVkZSAiZmxhdGJ1ZmZlcnMvdXRpbC5oIgotI2luY2x1ZGUgIm5hbWVyLmgiCisjaW5jbHVkZSAiaWRsX25hbWVyLmgiCiAKIG5hbWVzcGFjZSBmbGF0YnVmZmVycyB7CituYW1lc3BhY2UgewogCi1OYW1lcjo6Q29uZmlnIFJ1c3REZWZhdWx0Q29uZmlnKCkgeworc3RhdGljIE5hbWVyOjpDb25maWcgUnVzdERlZmF1bHRDb25maWcoKSB7CiAgIC8vIEhpc3RvcmljYWwgbm90ZTogV2UndmUgYmVlbiB1c2luZyAia2VlcCIgY2FzaW5nIHNpbmNlIHRoZSBvcmlnaW5hbAogICAvLyBpbXBsZW1lbnRhdGlvbiwgcHJlc3VtYWJseSBiZWNhdXNlIEZsYXRidWZmZXJzIHNjaGVtYSBzdHlsZSBhbmQgUnVzdCBzdHlsZQogICAvLyByb3VnaGx5IGFsaWduLiBXZSBhcmUgbm90IGdvaW5nIHRvIGVuZm9yY2UgcHJvcGVyIGNhc2luZyBzaW5jZSBpdHMgYW4KQEAgLTM3LDYgKzM4LDcgQEAKICAgICAgICAgICAgLyp2YXJpYWJsZXM9Ki9DYXNlOjprVW5rbm93biwgIC8vIFVudXNlZC4KICAgICAgICAgICAgLyp2YXJpYW50cz0qL0Nhc2U6OmtLZWVwLAogICAgICAgICAgICAvKmVudW1fdmFyaWFudF9zZXBlcmF0b3I9Ki8iOjoiLAorICAgICAgICAgICAvKmVzY2FwZV9rZXl3b3Jkcz0qL05hbWVyOjpDb25maWc6OkVzY2FwZTo6QmVmb3JlQ29udmVydGluZ0Nhc2UsCiAgICAgICAgICAgIC8qbmFtZXNwYWNlcz0qL0Nhc2U6OmtTbmFrZSwKICAgICAgICAgICAgLypuYW1lc3BhY2Vfc2VwZXJhdG9yPSovIjo6IiwKICAgICAgICAgICAgLypvYmplY3RfcHJlZml4PSovIiIsCkBAIC01MCw3ICs1Miw3IEBACiAgICAgICAgICAgIC8qZmlsZW5hbWVfZXh0ZW5zaW9uPSovIi5ycyIgfTsKIH0KIAotc3RkOjpzZXQ8c3RkOjpzdHJpbmc+IFJ1c3RLZXl3b3JkcygpIHsKK3N0YXRpYyBzdGQ6OnNldDxzdGQ6OnN0cmluZz4gUnVzdEtleXdvcmRzKCkgewogICByZXR1cm4gewogICAgIC8vIGh0dHBzOi8vZG9jLnJ1c3QtbGFuZy5vcmcvYm9vay9zZWNvbmQtZWRpdGlvbi9hcHBlbmRpeC0wMS1rZXl3b3Jkcy5odG1sCiAgICAgImFzIiwKQEAgLTE3Miw3ICsxNzQsNyBAQAogfTsKIAogLy8gQ29udmVydCBhIFR5cGUgdG8gYSBGdWxsVHlwZSAoZXhoYXVzdGl2ZSkuCi1GdWxsVHlwZSBHZXRGdWxsVHlwZShjb25zdCBUeXBlICZ0eXBlKSB7CitzdGF0aWMgRnVsbFR5cGUgR2V0RnVsbFR5cGUoY29uc3QgVHlwZSAmdHlwZSkgewogICAvLyBOLkIuIFRoZSBvcmRlciBvZiB0aGVzZSBjb25kaXRpb25hbHMgbWF0dGVycyBmb3Igc29tZSB0eXBlcy4KIAogICBpZiAoSXNTdHJpbmcodHlwZSkpIHsKQEAgLTI2MiwxNSArMjY0LDE2IEBACiAgIHJldHVybiBmdEJvb2w7CiB9CiAKLWJvb2wgSXNCaXRGbGFnc0VudW0oY29uc3QgRW51bURlZiAmZW51bV9kZWYpIHsKK3N0YXRpYyBib29sIElzQml0RmxhZ3NFbnVtKGNvbnN0IEVudW1EZWYgJmVudW1fZGVmKSB7CiAgIHJldHVybiBlbnVtX2RlZi5hdHRyaWJ1dGVzLkxvb2t1cCgiYml0X2ZsYWdzIikgIT0gbnVsbHB0cjsKIH0KIAogLy8gVGFibGVBcmdzIG1ha2UgcmVxdWlyZWQgbm9uLXNjYWxhcnMgIk9wdGlvbjxfPiIuCiAvLyBUT0RPKGNuZW8pOiBSZXdvcmsgaG93IHdlIGRvIGRlZmF1bHRzIGFuZCBzdHVmZi4KLWJvb2wgSXNPcHRpb25hbFRvQnVpbGRlcihjb25zdCBGaWVsZERlZiAmZmllbGQpIHsKK3N0YXRpYyBib29sIElzT3B0aW9uYWxUb0J1aWxkZXIoY29uc3QgRmllbGREZWYgJmZpZWxkKSB7CiAgIHJldHVybiBmaWVsZC5Jc09wdGlvbmFsKCkgfHwgIUlzU2NhbGFyKGZpZWxkLnZhbHVlLnR5cGUuYmFzZV90eXBlKTsKIH0KK30gLy8gbmFtZXNwYWNlCiAKIGJvb2wgR2VuZXJhdGVSdXN0TW9kdWxlUm9vdEZpbGUoY29uc3QgUGFyc2VyICZwYXJzZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nICZvdXRwdXRfZGlyKSB7CkBAIC0yNzksNyArMjgyLDcgQEAKICAgICAvLyBzbyByZXR1cm4gdHJ1ZS4KICAgICByZXR1cm4gdHJ1ZTsKICAgfQotICBOYW1lciBuYW1lcihSdXN0RGVmYXVsdENvbmZpZygpLldpdGhGbGFnT3B0aW9ucyhwYXJzZXIub3B0cywgb3V0cHV0X2RpciksCisgIE5hbWVyIG5hbWVyKFdpdGhGbGFnT3B0aW9ucyhSdXN0RGVmYXVsdENvbmZpZygpLCBwYXJzZXIub3B0cywgb3V0cHV0X2RpciksCiAgICAgICAgICAgICAgIFJ1c3RLZXl3b3JkcygpKTsKICAgLy8gV2UgZ2F0aGVyIHRoZSBzeW1ib2xzIGludG8gYSB0cmVlIG9mIG5hbWVzcGFjZXMgKHdoaWNoIGFyZSBydXN0IG1vZHMpIGFuZAogICAvLyBnZW5lcmF0ZSBhIGZpbGUgdGhhdCBnYXRoZXJzIHRoZW0gYWxsLgpAQCAtMzI5LDYgKzMzMiw3IEBACiAgIGNvZGUgKz0KICAgICAgICIvLyBBdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBieSB0aGUgRmxhdGJ1ZmZlcnMgY29tcGlsZXIuICIKICAgICAgICJEbyBub3QgbW9kaWZ5LiI7CisgIGNvZGUgKz0gIi8vIEBnZW5lcmF0ZWQiOwogICByb290X21vZHVsZS5HZW5lcmF0ZUltcG9ydHMoY29kZSk7CiAgIGNvbnN0IGJvb2wgc3VjY2VzcyA9CiAgICAgICBTYXZlRmlsZSgob3V0cHV0X2RpciArICJtb2QucnMiKS5jX3N0cigpLCBjb2RlLlRvU3RyaW5nKCksIGZhbHNlKTsKQEAgLTM0NCw4ICszNDgsOCBAQAogICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nICZmaWxlX25hbWUpCiAgICAgICA6IEJhc2VHZW5lcmF0b3IocGFyc2VyLCBwYXRoLCBmaWxlX25hbWUsICIiLCAiOjoiLCAicnMiKSwKICAgICAgICAgY3VyX25hbWVfc3BhY2VfKG51bGxwdHIpLAotICAgICAgICBuYW1lcl8oeyBSdXN0RGVmYXVsdENvbmZpZygpLldpdGhGbGFnT3B0aW9ucyhwYXJzZXIub3B0cywgcGF0aCksCi0gICAgICAgICAgICAgICAgIFJ1c3RLZXl3b3JkcygpIH0pIHsKKyAgICAgICAgbmFtZXJfKFdpdGhGbGFnT3B0aW9ucyhSdXN0RGVmYXVsdENvbmZpZygpLCBwYXJzZXIub3B0cywgcGF0aCksCisgICAgICAgICAgICAgICBSdXN0S2V5d29yZHMoKSkgewogICAgIC8vIFRPRE86IE5hbWVyIGZsYWcgb3ZlcnJpZGVzIHNob3VsZCBiZSBpbiBmbGF0YyBvciBmbGF0Y19tYWluLgogICAgIGNvZGVfLlNldFBhZGRpbmcoIiAgIik7CiAgIH0KQEAgLTM2Nyw5ICszNzEsMTQgQEAKICAgICAgIGNvZGVfLkNsZWFyKCk7CiAgICAgICBjb2RlXyArPSAiLy8gIiArIHN0ZDo6c3RyaW5nKEZsYXRCdWZmZXJzR2VuZXJhdGVkV2FybmluZygpKTsKICAgICAgIGNvZGVfICs9ICIjIVthbGxvdyh1bnVzZWRfaW1wb3J0cyldIjsKKyAgICAgIGNvZGVfICs9ICIvLyBAZ2VuZXJhdGVkIjsKKyAgICAgIGNvZGVfICs9ICJleHRlcm4gY3JhdGUgYWxsb2M7IjsKICAgICAgIGNvZGVfICs9ICJleHRlcm4gY3JhdGUgZmxhdGJ1ZmZlcnM7IjsKLSAgICAgIGNvZGVfICs9ICJ1c2Ugc3RkOjptZW07IjsKLSAgICAgIGNvZGVfICs9ICJ1c2Ugc3RkOjpjbXA6Ok9yZGVyaW5nOyI7CisgICAgICBjb2RlXyArPSAidXNlIGFsbG9jOjpib3hlZDo6Qm94OyI7CisgICAgICBjb2RlXyArPSAidXNlIGFsbG9jOjpzdHJpbmc6OntTdHJpbmcsIFRvU3RyaW5nfTsiOworICAgICAgY29kZV8gKz0gInVzZSBhbGxvYzo6dmVjOjpWZWM7IjsKKyAgICAgIGNvZGVfICs9ICJ1c2UgY29yZTo6bWVtOyI7CisgICAgICBjb2RlXyArPSAidXNlIGNvcmU6OmNtcDo6T3JkZXJpbmc7IjsKICAgICAgIGlmIChwYXJzZXJfLm9wdHMucnVzdF9zZXJpYWxpemUpIHsKICAgICAgICAgY29kZV8gKz0gImV4dGVybiBjcmF0ZSBzZXJkZTsiOwogICAgICAgICBjb2RlXyArPQpAQCAtMzgxLDkgKzM5MCw5IEBACiAgICAgICBnZW5fc3ltYm9sKHN5bWJvbCk7CiAKICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nIGRpcmVjdG9yaWVzID0KLSAgICAgICAgICBuYW1lcl8uRGlyZWN0b3JpZXMoc3ltYm9sLmRlZmluZWRfbmFtZXNwYWNlLT5jb21wb25lbnRzKTsKKyAgICAgICAgICBuYW1lcl8uRGlyZWN0b3JpZXMoKnN5bWJvbC5kZWZpbmVkX25hbWVzcGFjZSk7CiAgICAgICBFbnN1cmVEaXJFeGlzdHMoZGlyZWN0b3JpZXMpOwotICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgZmlsZV9wYXRoID0gZGlyZWN0b3JpZXMgKyBuYW1lcl8uRmlsZShzeW1ib2wubmFtZSk7CisgICAgICBjb25zdCBzdGQ6OnN0cmluZyBmaWxlX3BhdGggPSBkaXJlY3RvcmllcyArIG5hbWVyXy5GaWxlKHN5bWJvbCk7CiAgICAgICBjb25zdCBib29sIHNhdmVfc3VjY2VzcyA9CiAgICAgICAgICAgU2F2ZUZpbGUoZmlsZV9wYXRoLmNfc3RyKCksIGNvZGVfLlRvU3RyaW5nKCksIC8qYmluYXJ5PSovZmFsc2UpOwogICAgICAgaWYgKCFzYXZlX3N1Y2Nlc3MpIHJldHVybiBmYWxzZTsKQEAgLTQxOSw2ICs0MjgsNyBAQAogICBib29sIEdlbmVyYXRlT25lRmlsZSgpIHsKICAgICBjb2RlXy5DbGVhcigpOwogICAgIGNvZGVfICs9ICIvLyAiICsgc3RkOjpzdHJpbmcoRmxhdEJ1ZmZlcnNHZW5lcmF0ZWRXYXJuaW5nKCkpICsgIlxuXG4iOworICAgIGNvZGVfICs9ICIvLyBAZ2VuZXJhdGVkIjsKIAogICAgIGFzc2VydCghY3VyX25hbWVfc3BhY2VfKTsKIApAQCAtNTI3LDggKzUzNywxMSBAQAogICAgIHJldHVybiBmYWxzZTsKICAgfQogCi0gIHN0ZDo6c3RyaW5nIE5hbWVzcGFjZWROYXRpdmVOYW1lKGNvbnN0IERlZmluaXRpb24gJmRlZikgewotICAgIHJldHVybiBXcmFwSW5OYW1lU3BhY2UoZGVmLmRlZmluZWRfbmFtZXNwYWNlLCBuYW1lcl8uT2JqZWN0VHlwZShkZWYubmFtZSkpOworICBzdGQ6OnN0cmluZyBOYW1lc3BhY2VkTmF0aXZlTmFtZShjb25zdCBFbnVtRGVmICZkZWYpIHsKKyAgICByZXR1cm4gV3JhcEluTmFtZVNwYWNlKGRlZi5kZWZpbmVkX25hbWVzcGFjZSwgbmFtZXJfLk9iamVjdFR5cGUoZGVmKSk7CisgIH0KKyAgc3RkOjpzdHJpbmcgTmFtZXNwYWNlZE5hdGl2ZU5hbWUoY29uc3QgU3RydWN0RGVmICZkZWYpIHsKKyAgICByZXR1cm4gV3JhcEluTmFtZVNwYWNlKGRlZi5kZWZpbmVkX25hbWVzcGFjZSwgbmFtZXJfLk9iamVjdFR5cGUoZGVmKSk7CiAgIH0KIAogICBzdGQ6OnN0cmluZyBXcmFwSW5OYW1lU3BhY2UoY29uc3QgRGVmaW5pdGlvbiAmZGVmKSBjb25zdCB7CkBAIC02NjQsNyArNjc3LDcgQEAKIAogICBzdGQ6OnN0cmluZyBHZXRFbnVtVmFsdWUoY29uc3QgRW51bURlZiAmZW51bV9kZWYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBFbnVtVmFsICZlbnVtX3ZhbCkgY29uc3QgewotICAgIHJldHVybiBuYW1lcl8uRW51bVZhcmlhbnQoZW51bV9kZWYubmFtZSwgZW51bV92YWwubmFtZSk7CisgICAgcmV0dXJuIG5hbWVyXy5FbnVtVmFyaWFudChlbnVtX2RlZiwgZW51bV92YWwpOwogICB9CiAKICAgLy8gMSBzdWZmaXggc2luY2Ugb2xkIEMrKyBjYW4ndCBmaWd1cmUgb3V0IHRoZSBvdmVybG9hZC4KQEAgLTY3Miw3ICs2ODUsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6ZnVuY3Rpb248dm9pZChjb25zdCBFbnVtVmFsICYpPiBjYikgewogICAgIGZvciAoYXV0byBpdCA9IGVudW1fZGVmLlZhbHMoKS5iZWdpbigpOyBpdCAhPSBlbnVtX2RlZi5WYWxzKCkuZW5kKCk7ICsraXQpIHsKICAgICAgIGNvbnN0IGF1dG8gJmV2ID0gKippdDsKLSAgICAgIGNvZGVfLlNldFZhbHVlKCJWQVJJQU5UIiwgbmFtZXJfLlZhcmlhbnQoZXYubmFtZSkpOworICAgICAgY29kZV8uU2V0VmFsdWUoIlZBUklBTlQiLCBuYW1lcl8uVmFyaWFudChldikpOwogICAgICAgY29kZV8uU2V0VmFsdWUoIlZBTFVFIiwgZW51bV9kZWYuVG9TdHJpbmcoZXYpKTsKICAgICAgIGNvZGVfLkluY3JlbWVudElkZW50TGV2ZWwoKTsKICAgICAgIGNiKGV2KTsKQEAgLTY5MSw3ICs3MDQsMTAgQEAKICAgLy8gYW4gZW51bSBtYXRjaCBmdW5jdGlvbiwKICAgLy8gYW5kIGFuIGVudW0gYXJyYXkgb2YgdmFsdWVzCiAgIHZvaWQgR2VuRW51bShjb25zdCBFbnVtRGVmICZlbnVtX2RlZikgewotICAgIGNvZGVfLlNldFZhbHVlKCJFTlVNX1RZIiwgbmFtZXJfLlR5cGUoZW51bV9kZWYubmFtZSkpOworICAgIGNvbnN0IGJvb2wgaXNfcHJpdmF0ZSA9IHBhcnNlcl8ub3B0cy5ub19sZWFrX3ByaXZhdGVfYW5ub3RhdGlvbnMgJiYKKyAgICAgICAgKGVudW1fZGVmLmF0dHJpYnV0ZXMuTG9va3VwKCJwcml2YXRlIikgIT0gbnVsbHB0cik7CisgICAgY29kZV8uU2V0VmFsdWUoIkFDQ0VTU19UWVBFIiwgaXNfcHJpdmF0ZSA/ICJwdWIoY3JhdGUpIiA6ICJwdWIiKTsKKyAgICBjb2RlXy5TZXRWYWx1ZSgiRU5VTV9UWSIsIG5hbWVyXy5UeXBlKGVudW1fZGVmKSk7CiAgICAgY29kZV8uU2V0VmFsdWUoIkJBU0VfVFlQRSIsIEdldEVudW1UeXBlRm9yRGVjbChlbnVtX2RlZi51bmRlcmx5aW5nX3R5cGUpKTsKICAgICBjb2RlXy5TZXRWYWx1ZSgiRU5VTV9OQU1FU1BBQ0UiLCBuYW1lcl8uTmFtZXNwYWNlKGVudW1fZGVmLm5hbWUpKTsKICAgICBjb2RlXy5TZXRWYWx1ZSgiRU5VTV9DT05TVEFOVCIsIG5hbWVyXy5Db25zdGFudChlbnVtX2RlZi5uYW1lKSk7CkBAIC03MTEsNyArNzI3LDcgQEAKICAgICAgIGNvZGVfICs9ICIgIGZsYXRidWZmZXJzOjpiaXRmbGFnczo6Yml0ZmxhZ3MhIHsiOwogICAgICAgR2VuQ29tbWVudChlbnVtX2RlZi5kb2NfY29tbWVudCwgIiAgICAiKTsKICAgICAgIGNvZGVfICs9ICIgICAgI1tkZXJpdmUoRGVmYXVsdCldIjsKLSAgICAgIGNvZGVfICs9ICIgICAgcHViIHN0cnVjdCB7e0VOVU1fVFl9fToge3tCQVNFX1RZUEV9fSB7IjsKKyAgICAgIGNvZGVfICs9ICIgICAge3tBQ0NFU1NfVFlQRX19IHN0cnVjdCB7e0VOVU1fVFl9fToge3tCQVNFX1RZUEV9fSB7IjsKICAgICAgIEZvckFsbEVudW1WYWx1ZXMxKGVudW1fZGVmLCBbJl0oY29uc3QgRW51bVZhbCAmZXYpIHsKICAgICAgICAgdGhpcy0+R2VuQ29tbWVudChldi5kb2NfY29tbWVudCwgIiAgICAiKTsKICAgICAgICAgY29kZV8gKz0gIiAgICBjb25zdCB7e1ZBUklBTlR9fSA9IHt7VkFMVUV9fTsiOwpAQCAtNzQ0LDcgKzc2MCw3IEBACiAgICAgICBjb2RlXyArPSAicHViIGNvbnN0IEVOVU1fVkFMVUVTX3t7RU5VTV9DT05TVEFOVH19OiBbe3tFTlVNX1RZfX07ICIgKwogICAgICAgICAgICAgICAgbnVtX2ZpZWxkcyArICJdID0gWyI7CiAgICAgICBGb3JBbGxFbnVtVmFsdWVzMShlbnVtX2RlZiwgWyZdKGNvbnN0IEVudW1WYWwgJmV2KSB7Ci0gICAgICAgIGNvZGVfICs9IG5hbWVyXy5FbnVtVmFyaWFudChlbnVtX2RlZi5uYW1lLCBldi5uYW1lKSArICIsIjsKKyAgICAgICAgY29kZV8gKz0gbmFtZXJfLkVudW1WYXJpYW50KGVudW1fZGVmLCBldikgKyAiLCI7CiAgICAgICB9KTsKICAgICAgIGNvZGVfICs9ICJdOyI7CiAgICAgICBjb2RlXyArPSAiIjsKQEAgLTc1Nyw3ICs3NzMsNyBAQAogICAgICAgICAgICIjW2Rlcml2ZShDbG9uZSwgQ29weSwgUGFydGlhbEVxLCBFcSwgUGFydGlhbE9yZCwgT3JkLCBIYXNoLCAiCiAgICAgICAgICAgIkRlZmF1bHQpXSI7CiAgICAgICBjb2RlXyArPSAiI1tyZXByKHRyYW5zcGFyZW50KV0iOwotICAgICAgY29kZV8gKz0gInB1YiBzdHJ1Y3Qge3tFTlVNX1RZfX0ocHViIHt7QkFTRV9UWVBFfX0pOyI7CisgICAgICBjb2RlXyArPSAie3tBQ0NFU1NfVFlQRX19IHN0cnVjdCB7e0VOVU1fVFl9fShwdWIge3tCQVNFX1RZUEV9fSk7IjsKICAgICAgIGNvZGVfICs9ICIjW2FsbG93KG5vbl91cHBlcl9jYXNlX2dsb2JhbHMpXSI7CiAgICAgICBjb2RlXyArPSAiaW1wbCB7e0VOVU1fVFl9fSB7IjsKICAgICAgIEZvckFsbEVudW1WYWx1ZXMxKGVudW1fZGVmLCBbJl0oY29uc3QgRW51bVZhbCAmZXYpIHsKQEAgLTc4MywxMCArNzk5LDEwIEBACiAgICAgICBjb2RlXyArPSAifSI7CiAKICAgICAgIC8vIEdlbmVyYXRlIERlYnVnLiBVbmtub3duIHZhcmlhbnRzIGFyZSBwcmludGVkIGxpa2UgIjxVTktOT1dOIDQyPiIuCi0gICAgICBjb2RlXyArPSAiaW1wbCBzdGQ6OmZtdDo6RGVidWcgZm9yIHt7RU5VTV9UWX19IHsiOworICAgICAgY29kZV8gKz0gImltcGwgY29yZTo6Zm10OjpEZWJ1ZyBmb3Ige3tFTlVNX1RZfX0geyI7CiAgICAgICBjb2RlXyArPQotICAgICAgICAgICIgIGZuIGZtdCgmc2VsZiwgZjogJm11dCBzdGQ6OmZtdDo6Rm9ybWF0dGVyKSAtPiIKLSAgICAgICAgICAiIHN0ZDo6Zm10OjpSZXN1bHQgeyI7CisgICAgICAgICAgIiAgZm4gZm10KCZzZWxmLCBmOiAmbXV0IGNvcmU6OmZtdDo6Rm9ybWF0dGVyKSAtPiIKKyAgICAgICAgICAiIGNvcmU6OmZtdDo6UmVzdWx0IHsiOwogICAgICAgY29kZV8gKz0gIiAgICBpZiBsZXQgU29tZShuYW1lKSA9IHNlbGYudmFyaWFudF9uYW1lKCkgeyI7CiAgICAgICBjb2RlXyArPSAiICAgICAgZi53cml0ZV9zdHIobmFtZSkiOwogICAgICAgY29kZV8gKz0gIiAgICB9IGVsc2UgeyI7CkBAIC04NzMsOCArODg5LDggQEAKIAogICAgIGlmIChlbnVtX2RlZi5pc191bmlvbikgewogICAgICAgLy8gR2VuZXJhdGUgdHlwZXNhZmUgb2Zmc2V0KHMpIGZvciB1bmlvbnMKLSAgICAgIGNvZGVfLlNldFZhbHVlKCJVTklPTl9UWVBFIiwgbmFtZXJfLlR5cGUoZW51bV9kZWYubmFtZSkpOwotICAgICAgY29kZV8gKz0gInB1YiBzdHJ1Y3Qge3tVTklPTl9UWVBFfX1VbmlvblRhYmxlT2Zmc2V0IHt9IjsKKyAgICAgIGNvZGVfLlNldFZhbHVlKCJVTklPTl9UWVBFIiwgbmFtZXJfLlR5cGUoZW51bV9kZWYpKTsKKyAgICAgIGNvZGVfICs9ICJ7e0FDQ0VTU19UWVBFfX0gc3RydWN0IHt7VU5JT05fVFlQRX19VW5pb25UYWJsZU9mZnNldCB7fSI7CiAgICAgICBjb2RlXyArPSAiIjsKICAgICAgIGlmIChwYXJzZXJfLm9wdHMuZ2VuZXJhdGVfb2JqZWN0X2Jhc2VkX2FwaSkgeyBHZW5Vbmlvbk9iamVjdChlbnVtX2RlZik7IH0KICAgICB9CkBAIC04ODYsMTMgKzkwMiwxMiBAQAogICAgIGZvciAoYXV0byBpdCA9IGVudW1fZGVmLlZhbHMoKS5iZWdpbigpOyBpdCAhPSBlbnVtX2RlZi5WYWxzKCkuZW5kKCk7ICsraXQpIHsKICAgICAgIGF1dG8gJmVudW1fdmFsID0gKippdDsKICAgICAgIGlmIChlbnVtX3ZhbC51bmlvbl90eXBlLmJhc2VfdHlwZSA9PSBCQVNFX1RZUEVfTk9ORSkgY29udGludWU7Ci0gICAgICBjb2RlXy5TZXRWYWx1ZSgiVkFSSUFOVF9OQU1FIiwgbmFtZXJfLlZhcmlhbnQoZW51bV92YWwubmFtZSkpOworICAgICAgY29kZV8uU2V0VmFsdWUoIlZBUklBTlRfTkFNRSIsIG5hbWVyXy5WYXJpYW50KGVudW1fdmFsKSk7CiAgICAgICAvLyBGb3IgbGVnYWN5IHJlYXNvbnMsIGVudW0gdmFyaWFudHMgYXJlIEtlZXAgY2FzZSB3aGlsZSBlbnVtIG5hdGl2ZQogICAgICAgLy8gdmFyaWFudHMgYXJlIFVwcGVyQ2FtZWwgY2FzZS4KLSAgICAgIGNvZGVfLlNldFZhbHVlKAotICAgICAgICAgICJOQVRJVkVfVkFSSUFOVCIsCi0gICAgICAgICAgQ29udmVydENhc2UobmFtZXJfLkVzY2FwZUtleXdvcmQoZW51bV92YWwubmFtZSksIENhc2U6OmtVcHBlckNhbWVsKSk7Ci0gICAgICBjb2RlXy5TZXRWYWx1ZSgiVV9FTEVNRU5UX05BTUUiLCBuYW1lcl8uTWV0aG9kKGVudW1fdmFsLm5hbWUpKTsKKyAgICAgIGNvZGVfLlNldFZhbHVlKCJOQVRJVkVfVkFSSUFOVCIsCisgICAgICAgICAgICAgICAgICAgICBuYW1lcl8uTGVnYWN5UnVzdE5hdGl2ZVZhcmlhbnQoZW51bV92YWwpKTsKKyAgICAgIGNvZGVfLlNldFZhbHVlKCJVX0VMRU1FTlRfTkFNRSIsIG5hbWVyXy5NZXRob2QoZW51bV92YWwpKTsKICAgICAgIGNvZGVfLlNldFZhbHVlKCJVX0VMRU1FTlRfVEFCTEVfVFlQRSIsCiAgICAgICAgICAgICAgICAgICAgICBOYW1lc3BhY2VkTmF0aXZlTmFtZSgqZW51bV92YWwudW5pb25fdHlwZS5zdHJ1Y3RfZGVmKSk7CiAgICAgICBjb2RlXy5JbmNyZW1lbnRJZGVudExldmVsKCk7CkBAIC05MDEsMTYgKzkxNiwxNiBAQAogICAgIH0KICAgfQogICB2b2lkIEdlblVuaW9uT2JqZWN0KGNvbnN0IEVudW1EZWYgJmVudW1fZGVmKSB7Ci0gICAgY29kZV8uU2V0VmFsdWUoIkVOVU1fVFkiLCBuYW1lcl8uVHlwZShlbnVtX2RlZi5uYW1lKSk7Ci0gICAgY29kZV8uU2V0VmFsdWUoIkVOVU1fRk4iLCBuYW1lcl8uRnVuY3Rpb24oZW51bV9kZWYubmFtZSkpOwotICAgIGNvZGVfLlNldFZhbHVlKCJFTlVNX09UWSIsIG5hbWVyXy5PYmplY3RUeXBlKGVudW1fZGVmLm5hbWUpKTsKKyAgICBjb2RlXy5TZXRWYWx1ZSgiRU5VTV9UWSIsIG5hbWVyXy5UeXBlKGVudW1fZGVmKSk7CisgICAgY29kZV8uU2V0VmFsdWUoIkVOVU1fRk4iLCBuYW1lcl8uRnVuY3Rpb24oZW51bV9kZWYpKTsKKyAgICBjb2RlXy5TZXRWYWx1ZSgiRU5VTV9PVFkiLCBuYW1lcl8uT2JqZWN0VHlwZShlbnVtX2RlZikpOwogCiAgICAgLy8gR2VuZXJhdGUgbmF0aXZlIHVuaW9uLgogICAgIGNvZGVfICs9ICIjW2FsbG93KGNsaXBweTo6dXBwZXJfY2FzZV9hY3JvbnltcyldIjsgIC8vIE5PTkUncyBzcGVsbGluZyBpcwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGludGVuZGVkLgogICAgIGNvZGVfICs9ICIjW25vbl9leGhhdXN0aXZlXSI7CiAgICAgY29kZV8gKz0gIiNbZGVyaXZlKERlYnVnLCBDbG9uZSwgUGFydGlhbEVxKV0iOwotICAgIGNvZGVfICs9ICJwdWIgZW51bSB7e0VOVU1fT1RZfX0geyI7CisgICAgY29kZV8gKz0gInt7QUNDRVNTX1RZUEV9fSBlbnVtIHt7RU5VTV9PVFl9fSB7IjsKICAgICBjb2RlXyArPSAiICBOT05FLCI7CiAgICAgRm9yQWxsVW5pb25PYmplY3RWYXJpYW50c0Jlc2lkZXNOb25lKGVudW1fZGVmLCBbJl0gewogICAgICAgY29kZV8gKz0gInt7TkFUSVZFX1ZBUklBTlR9fShCb3g8e3tVX0VMRU1FTlRfVEFCTEVfVFlQRX19PiksIjsKQEAgLTk2Miw3ICs5NzcsNyBAQAogICAgICAgICAgICJwdWIgZm4gdGFrZV97e1VfRUxFTUVOVF9OQU1FfX0oJm11dCBzZWxmKSAtPiAiCiAgICAgICAgICAgIk9wdGlvbjxCb3g8e3tVX0VMRU1FTlRfVEFCTEVfVFlQRX19Pj4geyI7CiAgICAgICBjb2RlXyArPSAiICBpZiBsZXQgU2VsZjo6e3tOQVRJVkVfVkFSSUFOVH19KF8pID0gc2VsZiB7IjsKLSAgICAgIGNvZGVfICs9ICIgICAgbGV0IHYgPSBzdGQ6Om1lbTo6cmVwbGFjZShzZWxmLCBTZWxmOjpOT05FKTsiOworICAgICAgY29kZV8gKz0gIiAgICBsZXQgdiA9IGNvcmU6Om1lbTo6cmVwbGFjZShzZWxmLCBTZWxmOjpOT05FKTsiOwogICAgICAgY29kZV8gKz0gIiAgICBpZiBsZXQgU2VsZjo6e3tOQVRJVkVfVkFSSUFOVH19KHcpID0gdiB7IjsKICAgICAgIGNvZGVfICs9ICIgICAgICBTb21lKHcpIjsKICAgICAgIGNvZGVfICs9ICIgICAgfSBlbHNlIHsiOwpAQCAtOTk4LDEzICsxMDEzLDYgQEAKICAgICBjb2RlXyArPSAifSI7ICAvLyBFbmQgdW5pb24gbWV0aG9kcyBpbXBsLgogICB9CiAKLSAgc3RkOjpzdHJpbmcgR2V0RmllbGRPZmZzZXROYW1lKGNvbnN0IEZpZWxkRGVmICZmaWVsZCkgewotICAgIC8vIEZJWE1FOiBWVF9GSUVMRF9OQU1FIGlzIG5vdCBzY3JlYW1pbmcgc25ha2UgY2FzZSBieSBsZWdhY3kgbWlzdGFrZS4KLSAgICAvLyBidXQgY2hhbmdpbmcgdGhpcyBpcyBwcm9iYWJseSBhIGJyZWFraW5nIGNoYW5nZS4KLSAgICByZXR1cm4gIlZUXyIgKwotICAgICAgICAgICBDb252ZXJ0Q2FzZShuYW1lcl8uRXNjYXBlS2V5d29yZChmaWVsZC5uYW1lKSwgQ2FzZTo6a0FsbFVwcGVyKTsKLSAgfQotCiAgIGVudW0gRGVmYXVsdENvbnRleHQgeyBrQnVpbGRlciwga0FjY2Vzc29yLCBrT2JqZWN0IH07CiAgIHN0ZDo6c3RyaW5nIEdldERlZmF1bHRWYWx1ZShjb25zdCBGaWVsZERlZiAmZmllbGQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEZWZhdWx0Q29udGV4dCBjb250ZXh0KSB7CkBAIC0xMDM0LDcgKzEwNDIsNyBAQAogICAgICAgICBpZiAoIWV2KSByZXR1cm4gIkRlZmF1bHQ6OmRlZmF1bHQoKSI7ICAvLyBCaXRmbGFncyBlbnVtLgogICAgICAgICByZXR1cm4gV3JhcEluTmFtZVNwYWNlKAogICAgICAgICAgICAgZmllbGQudmFsdWUudHlwZS5lbnVtX2RlZi0+ZGVmaW5lZF9uYW1lc3BhY2UsCi0gICAgICAgICAgICBuYW1lcl8uRW51bVZhcmlhbnQoZmllbGQudmFsdWUudHlwZS5lbnVtX2RlZi0+bmFtZSwgZXYtPm5hbWUpKTsKKyAgICAgICAgICAgIG5hbWVyXy5FbnVtVmFyaWFudCgqZmllbGQudmFsdWUudHlwZS5lbnVtX2RlZiwgKmV2KSk7CiAgICAgICB9CiAgICAgICBjYXNlIGZ0VW5pb25WYWx1ZTogewogICAgICAgICByZXR1cm4gT2JqZWN0RmllbGRUeXBlKGZpZWxkLCB0cnVlKSArICI6Ok5PTkUiOwpAQCAtMTU0MCw3ICsxNTQ4LDcgQEAKIAogICBzdGQ6OnN0cmluZyBHZW5UYWJsZUFjY2Vzc29yRnVuY0JvZHkoY29uc3QgRmllbGREZWYgJmZpZWxkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgJmxpZmV0aW1lKSB7Ci0gICAgY29uc3Qgc3RkOjpzdHJpbmcgdnRfb2Zmc2V0ID0gR2V0RmllbGRPZmZzZXROYW1lKGZpZWxkKTsKKyAgICBjb25zdCBzdGQ6OnN0cmluZyB2dF9vZmZzZXQgPSBuYW1lcl8uTGVnYWN5UnVzdEZpZWxkT2Zmc2V0TmFtZShmaWVsZCk7CiAgICAgY29uc3Qgc3RkOjpzdHJpbmcgdHlwbmFtZSA9IEZvbGxvd1R5cGUoZmllbGQudmFsdWUudHlwZSwgbGlmZXRpbWUpOwogICAgIC8vIERlZmF1bHQteSBmaWVsZHMgKHNjYWxhcnMgc28gZmFyKSBhcmUgbmVpdGhlciBvcHRpb25hbCBub3IgcmVxdWlyZWQuCiAgICAgY29uc3Qgc3RkOjpzdHJpbmcgZGVmYXVsdF92YWx1ZSA9CkBAIC0xNTg3LDkgKzE1OTUsOSBAQAogICAgICAgY29uc3QgRW51bVZhbCAmZXYgPSAqKml0OwogICAgICAgLy8gVE9ETyhjbmVvKTogQ2FuIHZhcmlhbnRzIGJlIGRlcHJlY2F0ZWQsIHNob3VsZCB3ZSBza2lwIHRoZW0/CiAgICAgICBpZiAoZXYudW5pb25fdHlwZS5iYXNlX3R5cGUgPT0gQkFTRV9UWVBFX05PTkUpIHsgY29udGludWU7IH0KLSAgICAgIGNvZGVfLlNldFZhbHVlKCJVX0VMRU1FTlRfRU5VTV9UWVBFIiwKLSAgICAgICAgICAgICAgICAgICAgIFdyYXBJbk5hbWVTcGFjZShkZWYuZGVmaW5lZF9uYW1lc3BhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZXJfLkVudW1WYXJpYW50KGRlZi5uYW1lLCBldi5uYW1lKSkpOworICAgICAgY29kZV8uU2V0VmFsdWUoCisgICAgICAgICAgIlVfRUxFTUVOVF9FTlVNX1RZUEUiLAorICAgICAgICAgIFdyYXBJbk5hbWVTcGFjZShkZWYuZGVmaW5lZF9uYW1lc3BhY2UsIG5hbWVyXy5FbnVtVmFyaWFudChkZWYsIGV2KSkpOwogICAgICAgY29kZV8uU2V0VmFsdWUoCiAgICAgICAgICAgIlVfRUxFTUVOVF9UQUJMRV9UWVBFIiwKICAgICAgICAgICBXcmFwSW5OYW1lU3BhY2UoZXYudW5pb25fdHlwZS5zdHJ1Y3RfZGVmLT5kZWZpbmVkX25hbWVzcGFjZSwKQEAgLTE2MDYsMTEgKzE2MTQsMTEgQEAKICAgICAvLyBkaWZmIHdoZW4gcmVmYWN0b3JpbmcgdG8gdGhlIGBGb3JBbGxYYCBoZWxwZXIgZnVuY3Rpb25zLgogICAgIGF1dG8gZ28gPSBbJl0oY29uc3QgRmllbGREZWYgJmZpZWxkKSB7CiAgICAgICBpZiAoZmllbGQuZGVwcmVjYXRlZCkgcmV0dXJuOwotICAgICAgY29kZV8uU2V0VmFsdWUoIk9GRlNFVF9OQU1FIiwgR2V0RmllbGRPZmZzZXROYW1lKGZpZWxkKSk7CisgICAgICBjb2RlXy5TZXRWYWx1ZSgiT0ZGU0VUX05BTUUiLCBuYW1lcl8uTGVnYWN5UnVzdEZpZWxkT2Zmc2V0TmFtZShmaWVsZCkpOwogICAgICAgY29kZV8uU2V0VmFsdWUoIk9GRlNFVF9WQUxVRSIsIE51bVRvU3RyaW5nKGZpZWxkLnZhbHVlLm9mZnNldCkpOwotICAgICAgY29kZV8uU2V0VmFsdWUoIkZJRUxEIiwgbmFtZXJfLkZpZWxkKGZpZWxkLm5hbWUpKTsKKyAgICAgIGNvZGVfLlNldFZhbHVlKCJGSUVMRCIsIG5hbWVyXy5GaWVsZChmaWVsZCkpOwogICAgICAgY29kZV8uU2V0VmFsdWUoIkJMRFJfREVGX1ZBTCIsIEdldERlZmF1bHRWYWx1ZShmaWVsZCwga0J1aWxkZXIpKTsKLSAgICAgIGNvZGVfLlNldFZhbHVlKCJESVNDUklNSU5BTlQiLCBuYW1lcl8uTWV0aG9kKGZpZWxkLm5hbWUpICsgIl90eXBlIik7CisgICAgICBjb2RlXy5TZXRWYWx1ZSgiRElTQ1JJTUlOQU5UIiwgbmFtZXJfLkZpZWxkKGZpZWxkKSArICJfdHlwZSIpOwogICAgICAgY29kZV8uSW5jcmVtZW50SWRlbnRMZXZlbCgpOwogICAgICAgY2IoZmllbGQpOwogICAgICAgY29kZV8uRGVjcmVtZW50SWRlbnRMZXZlbCgpOwpAQCAtMTYyNSwxOCArMTYzMywyMiBAQAogICAvLyBHZW5lcmF0ZSBhbiBhY2Nlc3NvciBzdHJ1Y3QsIGJ1aWxkZXIgc3RydWN0LCBhbmQgY3JlYXRlIGZ1bmN0aW9uIGZvciBhCiAgIC8vIHRhYmxlLgogICB2b2lkIEdlblRhYmxlKGNvbnN0IFN0cnVjdERlZiAmc3RydWN0X2RlZikgewotICAgIGNvZGVfLlNldFZhbHVlKCJTVFJVQ1RfVFkiLCBuYW1lcl8uVHlwZShzdHJ1Y3RfZGVmLm5hbWUpKTsKLSAgICBjb2RlXy5TZXRWYWx1ZSgiU1RSVUNUX0ZOIiwgbmFtZXJfLkZ1bmN0aW9uKHN0cnVjdF9kZWYubmFtZSkpOworCisgICAgY29uc3QgYm9vbCBpc19wcml2YXRlID0gcGFyc2VyXy5vcHRzLm5vX2xlYWtfcHJpdmF0ZV9hbm5vdGF0aW9ucyAmJgorICAgICAgICAoc3RydWN0X2RlZi5hdHRyaWJ1dGVzLkxvb2t1cCgicHJpdmF0ZSIpICE9IG51bGxwdHIpOworICAgIGNvZGVfLlNldFZhbHVlKCJBQ0NFU1NfVFlQRSIsIGlzX3ByaXZhdGUgPyAicHViKGNyYXRlKSIgOiAicHViIik7CisgICAgY29kZV8uU2V0VmFsdWUoIlNUUlVDVF9UWSIsIG5hbWVyXy5UeXBlKHN0cnVjdF9kZWYpKTsKKyAgICBjb2RlXy5TZXRWYWx1ZSgiU1RSVUNUX0ZOIiwgbmFtZXJfLkZ1bmN0aW9uKHN0cnVjdF9kZWYpKTsKIAogICAgIC8vIEdlbmVyYXRlIGFuIG9mZnNldCB0eXBlLCB0aGUgYmFzZSB0eXBlLCB0aGUgRm9sbG93IGltcGwsIGFuZCB0aGUKICAgICAvLyBpbml0X2Zyb21fdGFibGUgaW1wbC4KLSAgICBjb2RlXyArPSAicHViIGVudW0ge3tTVFJVQ1RfVFl9fU9mZnNldCB7fSI7CisgICAgY29kZV8gKz0gInt7QUNDRVNTX1RZUEV9fSBlbnVtIHt7U1RSVUNUX1RZfX1PZmZzZXQge30iOwogICAgIGNvZGVfICs9ICIjW2Rlcml2ZShDb3B5LCBDbG9uZSwgUGFydGlhbEVxKV0iOwogICAgIGNvZGVfICs9ICIiOwogCiAgICAgR2VuQ29tbWVudChzdHJ1Y3RfZGVmLmRvY19jb21tZW50KTsKIAotICAgIGNvZGVfICs9ICJwdWIgc3RydWN0IHt7U1RSVUNUX1RZfX08J2E+IHsiOworICAgIGNvZGVfICs9ICJ7e0FDQ0VTU19UWVBFfX0gc3RydWN0IHt7U1RSVUNUX1RZfX08J2E+IHsiOwogICAgIGNvZGVfICs9ICIgIHB1YiBfdGFiOiBmbGF0YnVmZmVyczo6VGFibGU8J2E+LCI7CiAgICAgY29kZV8gKz0gIn0iOwogICAgIGNvZGVfICs9ICIiOwpAQCAtMTcwNyw3ICsxNzE5LDcgQEAKICAgICBpZiAocGFyc2VyXy5vcHRzLmdlbmVyYXRlX29iamVjdF9iYXNlZF9hcGkpIHsKICAgICAgIC8vIFRPRE8oY25lbyk6IFJlcGxhY2UgbW9yZSBmb3IgbG9vcHMgd2l0aCBGb3JBbGxYIHN0dWZmLgogICAgICAgLy8gVE9ETyhjbmVvKTogTWFuYWdlIGluZGVudGF0aW9uIHdpdGggSW5jcmVtZW50SWRlbnRMZXZlbD8KLSAgICAgIGNvZGVfLlNldFZhbHVlKCJTVFJVQ1RfT1RZIiwgbmFtZXJfLk9iamVjdFR5cGUoc3RydWN0X2RlZi5uYW1lKSk7CisgICAgICBjb2RlXy5TZXRWYWx1ZSgiU1RSVUNUX09UWSIsIG5hbWVyXy5PYmplY3RUeXBlKHN0cnVjdF9kZWYpKTsKICAgICAgIGNvZGVfICs9ICIgIHB1YiBmbiB1bnBhY2soJnNlbGYpIC0+IHt7U1RSVUNUX09UWX19IHsiOwogICAgICAgRm9yQWxsT2JqZWN0VGFibGVGaWVsZHMoc3RydWN0X2RlZiwgWyZdKGNvbnN0IEZpZWxkRGVmICZmaWVsZCkgewogICAgICAgICBjb25zdCBUeXBlICZ0eXBlID0gZmllbGQudmFsdWUudHlwZTsKQEAgLTE5NDgsNyArMTk2MCw3IEBACiAgICAgICBjb25zdCBFbnVtRGVmICZ1bmlvbl9kZWYgPSAqZmllbGQudmFsdWUudHlwZS5lbnVtX2RlZjsKICAgICAgIGNvZGVfLlNldFZhbHVlKCJVTklPTl9UWVBFIiwgV3JhcEluTmFtZVNwYWNlKHVuaW9uX2RlZikpOwogICAgICAgY29kZV8uU2V0VmFsdWUoIlVOSU9OX1RZUEVfT0ZGU0VUX05BTUUiLAotICAgICAgICAgICAgICAgICAgICAgR2V0RmllbGRPZmZzZXROYW1lKGZpZWxkKSArICJfVFlQRSIpOworICAgICAgICAgICAgICAgICAgICAgbmFtZXJfLkxlZ2FjeVJ1c3RGaWVsZE9mZnNldE5hbWUoZmllbGQpICsgIl9UWVBFIik7CiAgICAgICBjb2RlXyArPQogICAgICAgICAgICJcbiAgICAgLnZpc2l0X3VuaW9uOjo8e3tVTklPTl9UWVBFfX0sIF8+KCIKICAgICAgICAgICAiXCJ7e0ZJRUxEfX1fdHlwZVwiLCBTZWxmOjp7e1VOSU9OX1RZUEVfT0ZGU0VUX05BTUV9fSwgIgpAQCAtMTk3NCw3ICsxOTg2LDcgQEAKICAgICAvLyBHZW5lcmF0ZSBhbiBhcmdzIHN0cnVjdDoKICAgICBjb2RlXy5TZXRWYWx1ZSgiTUFZQkVfTFQiLAogICAgICAgICAgICAgICAgICAgIFRhYmxlQnVpbGRlckFyZ3NOZWVkc0xpZmV0aW1lKHN0cnVjdF9kZWYpID8gIjwnYT4iIDogIiIpOwotICAgIGNvZGVfICs9ICJwdWIgc3RydWN0IHt7U1RSVUNUX1RZfX1Bcmdze3tNQVlCRV9MVH19IHsiOworICAgIGNvZGVfICs9ICJ7e0FDQ0VTU19UWVBFfX0gc3RydWN0IHt7U1RSVUNUX1RZfX1Bcmdze3tNQVlCRV9MVH19IHsiOwogICAgIEZvckFsbFRhYmxlRmllbGRzKHN0cnVjdF9kZWYsIFsmXShjb25zdCBGaWVsZERlZiAmZmllbGQpIHsKICAgICAgIGNvZGVfLlNldFZhbHVlKCJQQVJBTV9UWVBFIiwgVGFibGVCdWlsZGVyQXJnc0RlZm5UeXBlKGZpZWxkLCAiJ2EiKSk7CiAgICAgICBjb2RlXyArPSAiICBwdWIge3tGSUVMRH19OiB7e1BBUkFNX1RZUEV9fSwiOwpAQCAtMjAxOSwxMiArMjAzMSwxMiBAQAogICAgICAgICAgIGlmICh0eXBlLmJhc2VfdHlwZSA9PSBCQVNFX1RZUEVfVU5JT04pIHsKICAgICAgICAgICAgIGNvbnN0IGF1dG8gJmVudW1fZGVmID0gKnR5cGUuZW51bV9kZWY7CiAgICAgICAgICAgICBjb2RlXy5TZXRWYWx1ZSgiRU5VTV9UWSIsIFdyYXBJbk5hbWVTcGFjZShlbnVtX2RlZikpOwotICAgICAgICAgICAgY29kZV8uU2V0VmFsdWUoIkZJRUxEIiwgbmFtZXJfLkZpZWxkKGZpZWxkLm5hbWUpKTsKKyAgICAgICAgICAgIGNvZGVfLlNldFZhbHVlKCJGSUVMRCIsIG5hbWVyXy5GaWVsZChmaWVsZCkpOwogCiAgICAgICAgICAgICBjb2RlXyArPSAiICAgIG1hdGNoIHNlbGYue3tGSUVMRH19X3R5cGUoKSB7IjsKICAgICAgICAgICAgIGNvZGVfICs9ICIgICAgICB7e0VOVU1fVFl9fTo6Tk9ORSA9PiAoKSwiOwogICAgICAgICAgICAgRm9yQWxsVW5pb25PYmplY3RWYXJpYW50c0Jlc2lkZXNOb25lKGVudW1fZGVmLCBbJl0gewotICAgICAgICAgICAgICBjb2RlXy5TZXRWYWx1ZSgiRklFTEQiLCBuYW1lcl8uRmllbGQoZmllbGQubmFtZSkpOworICAgICAgICAgICAgICBjb2RlXy5TZXRWYWx1ZSgiRklFTEQiLCBuYW1lcl8uRmllbGQoZmllbGQpKTsKICAgICAgICAgICAgICAgY29kZV8gKz0gIiAgICAgIHt7RU5VTV9UWX19Ojp7e1ZBUklBTlRfTkFNRX19ID0+IHsiOwogICAgICAgICAgICAgICBjb2RlXyArPQogICAgICAgICAgICAgICAgICAgIiAgICAgICAgbGV0IGYgPSAiCkBAIC0yMDYzLDcgKzIwNzUsNyBAQAogICAgIH0KIAogICAgIC8vIEdlbmVyYXRlIGEgYnVpbGRlciBzdHJ1Y3Q6Ci0gICAgY29kZV8gKz0gInB1YiBzdHJ1Y3Qge3tTVFJVQ1RfVFl9fUJ1aWxkZXI8J2E6ICdiLCAnYj4geyI7CisgICAgY29kZV8gKz0gInt7QUNDRVNTX1RZUEV9fSBzdHJ1Y3Qge3tTVFJVQ1RfVFl9fUJ1aWxkZXI8J2E6ICdiLCAnYj4geyI7CiAgICAgY29kZV8gKz0gIiAgZmJiXzogJidiIG11dCBmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXI8J2E+LCI7CiAgICAgY29kZV8gKz0KICAgICAgICAgIiAgc3RhcnRfOiBmbGF0YnVmZmVyczo6V0lQT2Zmc2V0PCIKQEAgLTIwNzQsNyArMjA4Niw3IEBACiAgICAgY29kZV8gKz0gImltcGw8J2E6ICdiLCAnYj4ge3tTVFJVQ1RfVFl9fUJ1aWxkZXI8J2EsICdiPiB7IjsKICAgICBGb3JBbGxUYWJsZUZpZWxkcyhzdHJ1Y3RfZGVmLCBbJl0oY29uc3QgRmllbGREZWYgJmZpZWxkKSB7CiAgICAgICBjb25zdCBib29sIGlzX3NjYWxhciA9IElzU2NhbGFyKGZpZWxkLnZhbHVlLnR5cGUuYmFzZV90eXBlKTsKLSAgICAgIHN0ZDo6c3RyaW5nIG9mZnNldCA9IEdldEZpZWxkT2Zmc2V0TmFtZShmaWVsZCk7CisgICAgICBzdGQ6OnN0cmluZyBvZmZzZXQgPSBuYW1lcl8uTGVnYWN5UnVzdEZpZWxkT2Zmc2V0TmFtZShmaWVsZCk7CiAgICAgICAvLyBHZW5lcmF0ZSBmdW5jdGlvbnMgdG8gYWRkIGRhdGEsIHdoaWNoIHRha2Ugb25lIG9mIHR3byBmb3Jtcy4KICAgICAgIC8vCiAgICAgICAvLyBJZiBhIHZhbHVlIGhhcyBhIGRlZmF1bHQ6CkBAIC0yMDg2LDggKzIwOTgsNyBAQAogICAgICAgLy8gICBmbiBhZGRfeCh4XzogdHlwZSkgewogICAgICAgLy8gICAgIGZiYl8ucHVzaF9zbG90X2Fsd2F5czo6PHR5cGU+KG9mZnNldCwgeF8pOwogICAgICAgLy8gICB9Ci0gICAgICBjb2RlXy5TZXRWYWx1ZSgiRklFTERfT0ZGU0VUIiwKLSAgICAgICAgICAgICAgICAgICAgIG5hbWVyXy5UeXBlKHN0cnVjdF9kZWYubmFtZSkgKyAiOjoiICsgb2Zmc2V0KTsKKyAgICAgIGNvZGVfLlNldFZhbHVlKCJGSUVMRF9PRkZTRVQiLCBuYW1lcl8uVHlwZShzdHJ1Y3RfZGVmKSArICI6OiIgKyBvZmZzZXQpOwogICAgICAgY29kZV8uU2V0VmFsdWUoIkZJRUxEX1RZUEUiLCBUYWJsZUJ1aWxkZXJBcmdzQWRkRnVuY1R5cGUoZmllbGQsICInYiAiKSk7CiAgICAgICBjb2RlXy5TZXRWYWx1ZSgiRlVOQ19CT0RZIiwgVGFibGVCdWlsZGVyQXJnc0FkZEZ1bmNCb2R5KGZpZWxkKSk7CiAgICAgICBjb2RlXyArPSAiI1tpbmxpbmVdIjsKQEAgLTIxMzUsMTAgKzIxNDYsMTAgQEAKICAgICBjb2RlXyArPSAifSI7CiAgICAgY29kZV8gKz0gIiI7CiAKLSAgICBjb2RlXyArPSAiaW1wbCBzdGQ6OmZtdDo6RGVidWcgZm9yIHt7U1RSVUNUX1RZfX08J18+IHsiOworICAgIGNvZGVfICs9ICJpbXBsIGNvcmU6OmZtdDo6RGVidWcgZm9yIHt7U1RSVUNUX1RZfX08J18+IHsiOwogICAgIGNvZGVfICs9Ci0gICAgICAgICIgIGZuIGZtdCgmc2VsZiwgZjogJm11dCBzdGQ6OmZtdDo6Rm9ybWF0dGVyPCdfPiIKLSAgICAgICAgIikgLT4gc3RkOjpmbXQ6OlJlc3VsdCB7IjsKKyAgICAgICAgIiAgZm4gZm10KCZzZWxmLCBmOiAmbXV0IGNvcmU6OmZtdDo6Rm9ybWF0dGVyPCdfPiIKKyAgICAgICAgIikgLT4gY29yZTo6Zm10OjpSZXN1bHQgeyI7CiAgICAgY29kZV8gKz0gIiAgICBsZXQgbXV0IGRzID0gZi5kZWJ1Z19zdHJ1Y3QoXCJ7e1NUUlVDVF9UWX19XCIpOyI7CiAgICAgRm9yQWxsVGFibGVGaWVsZHMoc3RydWN0X2RlZiwgWyZdKGNvbnN0IEZpZWxkRGVmICZmaWVsZCkgewogICAgICAgaWYgKEdldEZ1bGxUeXBlKGZpZWxkLnZhbHVlLnR5cGUpID09IGZ0VW5pb25WYWx1ZSkgewpAQCAtMjE3OSwxMyArMjE5MCwxMyBAQAogICB9CiAKICAgdm9pZCBHZW5UYWJsZU9iamVjdChjb25zdCBTdHJ1Y3REZWYgJnRhYmxlKSB7Ci0gICAgY29kZV8uU2V0VmFsdWUoIlNUUlVDVF9PVFkiLCBuYW1lcl8uT2JqZWN0VHlwZSh0YWJsZS5uYW1lKSk7Ci0gICAgY29kZV8uU2V0VmFsdWUoIlNUUlVDVF9UWSIsIG5hbWVyXy5UeXBlKHRhYmxlLm5hbWUpKTsKKyAgICBjb2RlXy5TZXRWYWx1ZSgiU1RSVUNUX09UWSIsIG5hbWVyXy5PYmplY3RUeXBlKHRhYmxlKSk7CisgICAgY29kZV8uU2V0VmFsdWUoIlNUUlVDVF9UWSIsIG5hbWVyXy5UeXBlKHRhYmxlKSk7CiAKICAgICAvLyBHZW5lcmF0ZSB0aGUgbmF0aXZlIG9iamVjdC4KICAgICBjb2RlXyArPSAiI1tub25fZXhoYXVzdGl2ZV0iOwogICAgIGNvZGVfICs9ICIjW2Rlcml2ZShEZWJ1ZywgQ2xvbmUsIFBhcnRpYWxFcSldIjsKLSAgICBjb2RlXyArPSAicHViIHN0cnVjdCB7e1NUUlVDVF9PVFl9fSB7IjsKKyAgICBjb2RlXyArPSAie3tBQ0NFU1NfVFlQRX19IHN0cnVjdCB7e1NUUlVDVF9PVFl9fSB7IjsKICAgICBGb3JBbGxPYmplY3RUYWJsZUZpZWxkcyh0YWJsZSwgWyZdKGNvbnN0IEZpZWxkRGVmICZmaWVsZCkgewogICAgICAgLy8gVW5pb24gb2JqZWN0cyBjb21iaW5lIGJvdGggdGhlIHVuaW9uIGRpc2NyaW1pbmFudCBhbmQgdmFsdWUsIHNvIHdlCiAgICAgICAvLyBza2lwIG1ha2luZyBhIGZpZWxkIGZvciB0aGUgZGlzY3JpbWluYW50LgpAQCAtMjIzMCw3ICsyMjQxLDcgQEAKICAgICAgICAgY2FzZSBmdFVuaW9uS2V5OiByZXR1cm47ICAvLyBHZW5lcmF0ZSB1bmlvbiB0eXBlIHdpdGggdW5pb24gdmFsdWUuCiAgICAgICAgIGNhc2UgZnRVbmlvblZhbHVlOiB7CiAgICAgICAgICAgY29kZV8uU2V0VmFsdWUoIkVOVU1fTUVUSE9EIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lcl8uTWV0aG9kKGZpZWxkLnZhbHVlLnR5cGUuZW51bV9kZWYtPm5hbWUpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lcl8uTWV0aG9kKCpmaWVsZC52YWx1ZS50eXBlLmVudW1fZGVmKSk7CiAgICAgICAgICAgY29kZV8gKz0KICAgICAgICAgICAgICAgIiAgbGV0IHt7RklFTER9fV90eXBlID0gIgogICAgICAgICAgICAgICAic2VsZi57e0ZJRUxEfX0ue3tFTlVNX01FVEhPRH19X3R5cGUoKTsiOwpAQCAtMjMxOCw3ICsyMzI5LDcgQEAKICAgICBmb3IgKGF1dG8gaXQgPSB2LmJlZ2luKCk7IGl0ICE9IHYuZW5kKCk7IGl0KyspIHsKICAgICAgIGNvbnN0IEZpZWxkRGVmICZmaWVsZCA9ICoqaXQ7CiAgICAgICBpZiAoZmllbGQuZGVwcmVjYXRlZCkgY29udGludWU7Ci0gICAgICBjb2RlXy5TZXRWYWx1ZSgiRklFTEQiLCBuYW1lcl8uRmllbGQoZmllbGQubmFtZSkpOworICAgICAgY29kZV8uU2V0VmFsdWUoIkZJRUxEIiwgbmFtZXJfLkZpZWxkKGZpZWxkKSk7CiAgICAgICBjb2RlXy5TZXRWYWx1ZSgiRklFTERfT1RZIiwgT2JqZWN0RmllbGRUeXBlKGZpZWxkLCB0cnVlKSk7CiAgICAgICBjb2RlXy5JbmNyZW1lbnRJZGVudExldmVsKCk7CiAgICAgICBjYihmaWVsZCk7CkBAIC0yMzU4LDcgKzIzNjksNyBAQAogICAgIGNvZGVfICs9ICIjW2lubGluZV0iOwogICAgIGNvZGVfICs9CiAgICAgICAgICJwdWIgZm4ga2V5X2NvbXBhcmVfd2l0aF92YWx1ZSgmc2VsZiwgdmFsOiB7e0tFWV9UWVBFfX0pIC0+ICIKLSAgICAgICAgIjo6c3RkOjpjbXA6Ok9yZGVyaW5nIHsiOworICAgICAgICAiOjpjb3JlOjpjbXA6Ok9yZGVyaW5nIHsiOwogICAgIGNvZGVfICs9ICIgIGxldCBrZXkgPSBzZWxmLnt7RklFTER9fSgpOyI7CiAgICAgY29kZV8gKz0gIiAga2V5LmNtcCh7e1JFRn19dmFsKSI7CiAgICAgY29kZV8gKz0gIn0iOwpAQCAtMjM2OCw4ICsyMzc5LDggQEAKICAgLy8gbXVzdCBvbmx5IGJlIGNhbGxlZCBpZiB0aGUgcm9vdCB0YWJsZSBpcyBkZWZpbmVkLgogICB2b2lkIEdlblJvb3RUYWJsZUZ1bmNzKGNvbnN0IFN0cnVjdERlZiAmc3RydWN0X2RlZikgewogICAgIEZMQVRCVUZGRVJTX0FTU0VSVChwYXJzZXJfLnJvb3Rfc3RydWN0X2RlZl8gJiYgInJvb3QgdGFibGUgbm90IGRlZmluZWQiKTsKLSAgICBjb2RlXy5TZXRWYWx1ZSgiU1RSVUNUX1RZIiwgbmFtZXJfLlR5cGUoc3RydWN0X2RlZi5uYW1lKSk7Ci0gICAgY29kZV8uU2V0VmFsdWUoIlNUUlVDVF9GTiIsIG5hbWVyXy5GdW5jdGlvbihzdHJ1Y3RfZGVmLm5hbWUpKTsKKyAgICBjb2RlXy5TZXRWYWx1ZSgiU1RSVUNUX1RZIiwgbmFtZXJfLlR5cGUoc3RydWN0X2RlZikpOworICAgIGNvZGVfLlNldFZhbHVlKCJTVFJVQ1RfRk4iLCBuYW1lcl8uRnVuY3Rpb24oc3RydWN0X2RlZikpOwogICAgIGNvZGVfLlNldFZhbHVlKCJTVFJVQ1RfQ09OU1QiLCBuYW1lcl8uQ29uc3RhbnQoc3RydWN0X2RlZi5uYW1lKSk7CiAKICAgICAvLyBUaGUgcm9vdCBkYXRhdHlwZSBhY2Nlc3NvcnM6CkBAIC0yNTc5LDcgKzI1OTAsNyBAQAogICAgICAgY29uc3QgYXV0byAmZmllbGQgPSAqKml0OwogICAgICAgY29kZV8uU2V0VmFsdWUoIkZJRUxEX1RZUEUiLCBHZXRUeXBlR2V0KGZpZWxkLnZhbHVlLnR5cGUpKTsKICAgICAgIGNvZGVfLlNldFZhbHVlKCJGSUVMRF9PVFkiLCBPYmplY3RGaWVsZFR5cGUoZmllbGQsIGZhbHNlKSk7Ci0gICAgICBjb2RlXy5TZXRWYWx1ZSgiRklFTEQiLCBuYW1lcl8uRmllbGQoZmllbGQubmFtZSkpOworICAgICAgY29kZV8uU2V0VmFsdWUoIkZJRUxEIiwgbmFtZXJfLkZpZWxkKGZpZWxkKSk7CiAgICAgICBjb2RlXy5TZXRWYWx1ZSgiRklFTERfT0ZGU0VUIiwgTnVtVG9TdHJpbmcob2Zmc2V0X3RvX2ZpZWxkKSk7CiAgICAgICBjb2RlXy5TZXRWYWx1ZSgKICAgICAgICAgICAiUkVGIiwKQEAgLTI1OTMsMTIgKzI2MDQsMTUgQEAKICAgfQogICAvLyBHZW5lcmF0ZSBhbiBhY2Nlc3NvciBzdHJ1Y3Qgd2l0aCBjb25zdHJ1Y3RvciBmb3IgYSBmbGF0YnVmZmVycyBzdHJ1Y3QuCiAgIHZvaWQgR2VuU3RydWN0KGNvbnN0IFN0cnVjdERlZiAmc3RydWN0X2RlZikgeworICAgIGNvbnN0IGJvb2wgaXNfcHJpdmF0ZSA9IHBhcnNlcl8ub3B0cy5ub19sZWFrX3ByaXZhdGVfYW5ub3RhdGlvbnMgJiYKKyAgICAgICAgKHN0cnVjdF9kZWYuYXR0cmlidXRlcy5Mb29rdXAoInByaXZhdGUiKSAhPSBudWxscHRyKTsKKyAgICBjb2RlXy5TZXRWYWx1ZSgiQUNDRVNTX1RZUEUiLCBpc19wcml2YXRlID8gInB1YihjcmF0ZSkiIDogInB1YiIpOwogICAgIC8vIEdlbmVyYXRlcyBtYW51YWwgcGFkZGluZyBhbmQgYWxpZ25tZW50LgogICAgIC8vIFZhcmlhYmxlcyBhcmUgcHJpdmF0ZSBiZWNhdXNlIHRoZXkgY29udGFpbiBsaXR0bGUgZW5kaWFuIGRhdGEgb24gYWxsCiAgICAgLy8gcGxhdGZvcm1zLgogICAgIEdlbkNvbW1lbnQoc3RydWN0X2RlZi5kb2NfY29tbWVudCk7CiAgICAgY29kZV8uU2V0VmFsdWUoIkFMSUdOIiwgTnVtVG9TdHJpbmcoc3RydWN0X2RlZi5taW5hbGlnbikpOwotICAgIGNvZGVfLlNldFZhbHVlKCJTVFJVQ1RfVFkiLCBuYW1lcl8uVHlwZShzdHJ1Y3RfZGVmLm5hbWUpKTsKKyAgICBjb2RlXy5TZXRWYWx1ZSgiU1RSVUNUX1RZIiwgbmFtZXJfLlR5cGUoc3RydWN0X2RlZikpOwogICAgIGNvZGVfLlNldFZhbHVlKCJTVFJVQ1RfU0laRSIsIE51bVRvU3RyaW5nKHN0cnVjdF9kZWYuYnl0ZXNpemUpKTsKIAogICAgIC8vIFdlIHJlcHJlc2VudCBGbGF0YnVmZmVycy1zdHJ1Y3RzIGluIFJ1c3QtdTgtYXJyYXlzIHNpbmNlIHRoZSBkYXRhIG1heSBiZQpAQCAtMjYxMCw3ICsyNjI0LDcgQEAKICAgICBjb2RlXyArPSAiLy8gc3RydWN0IHt7U1RSVUNUX1RZfX0sIGFsaWduZWQgdG8ge3tBTElHTn19IjsKICAgICBjb2RlXyArPSAiI1tyZXByKHRyYW5zcGFyZW50KV0iOwogICAgIGNvZGVfICs9ICIjW2Rlcml2ZShDbG9uZSwgQ29weSwgUGFydGlhbEVxKV0iOwotICAgIGNvZGVfICs9ICJwdWIgc3RydWN0IHt7U1RSVUNUX1RZfX0ocHViIFt1ODsge3tTVFJVQ1RfU0laRX19XSk7IjsKKyAgICBjb2RlXyArPSAie3tBQ0NFU1NfVFlQRX19IHN0cnVjdCB7e1NUUlVDVF9UWX19KHB1YiBbdTg7IHt7U1RSVUNUX1NJWkV9fV0pOyI7CiAgICAgY29kZV8gKz0gImltcGwgRGVmYXVsdCBmb3Ige3tTVFJVQ1RfVFl9fSB7ICI7CiAgICAgY29kZV8gKz0gIiAgZm4gZGVmYXVsdCgpIC0+IFNlbGYgeyAiOwogICAgIGNvZGVfICs9ICIgICAgU2VsZihbMDsge3tTVFJVQ1RfU0laRX19XSkiOwpAQCAtMjYxOCwxMCArMjYzMiwxMCBAQAogICAgIGNvZGVfICs9ICJ9IjsKIAogICAgIC8vIERlYnVnIGZvciBzdHJ1Y3RzLgotICAgIGNvZGVfICs9ICJpbXBsIHN0ZDo6Zm10OjpEZWJ1ZyBmb3Ige3tTVFJVQ1RfVFl9fSB7IjsKKyAgICBjb2RlXyArPSAiaW1wbCBjb3JlOjpmbXQ6OkRlYnVnIGZvciB7e1NUUlVDVF9UWX19IHsiOwogICAgIGNvZGVfICs9Ci0gICAgICAgICIgIGZuIGZtdCgmc2VsZiwgZjogJm11dCBzdGQ6OmZtdDo6Rm9ybWF0dGVyIgotICAgICAgICAiKSAtPiBzdGQ6OmZtdDo6UmVzdWx0IHsiOworICAgICAgICAiICBmbiBmbXQoJnNlbGYsIGY6ICZtdXQgY29yZTo6Zm10OjpGb3JtYXR0ZXIiCisgICAgICAgICIpIC0+IGNvcmU6OmZtdDo6UmVzdWx0IHsiOwogICAgIGNvZGVfICs9ICIgICAgZi5kZWJ1Z19zdHJ1Y3QoXCJ7e1NUUlVDVF9UWX19XCIpIjsKICAgICBGb3JBbGxTdHJ1Y3RGaWVsZHMoc3RydWN0X2RlZiwgWyZdKGNvbnN0IEZpZWxkRGVmICZ1bnVzZWQpIHsKICAgICAgICh2b2lkKXVudXNlZDsKQEAgLTI2NTcsNyArMjY3MSw3IEBACiAgICAgY29kZV8gKz0gIiAgICBmbiBwdXNoKCZzZWxmLCBkc3Q6ICZtdXQgW3U4XSwgX3Jlc3Q6ICZbdThdKSB7IjsKICAgICBjb2RlXyArPSAiICAgICAgICBsZXQgc3JjID0gdW5zYWZlIHsiOwogICAgIGNvZGVfICs9Ci0gICAgICAgICIgICAgICAgICAgICA6OnN0ZDo6c2xpY2U6OmZyb21fcmF3X3BhcnRzKCIKKyAgICAgICAgIiAgICAgICAgICAgIDo6Y29yZTo6c2xpY2U6OmZyb21fcmF3X3BhcnRzKCIKICAgICAgICAgInNlbGYgYXMgKmNvbnN0IHt7U1RSVUNUX1RZfX0gYXMgKmNvbnN0IHU4LCBTZWxmOjpzaXplKCkpIjsKICAgICBjb2RlXyArPSAiICAgICAgICB9OyI7CiAgICAgY29kZV8gKz0gIiAgICAgICAgZHN0LmNvcHlfZnJvbV9zbGljZShzcmMpOyI7CkBAIC0yNjcwLDcgKzI2ODQsNyBAQAogICAgIGNvZGVfICs9ICIgICAgZm4gcHVzaCgmc2VsZiwgZHN0OiAmbXV0IFt1OF0sIF9yZXN0OiAmW3U4XSkgeyI7CiAgICAgY29kZV8gKz0gIiAgICAgICAgbGV0IHNyYyA9IHVuc2FmZSB7IjsKICAgICBjb2RlXyArPQotICAgICAgICAiICAgICAgICAgICAgOjpzdGQ6OnNsaWNlOjpmcm9tX3Jhd19wYXJ0cygiCisgICAgICAgICIgICAgICAgICAgICA6OmNvcmU6OnNsaWNlOjpmcm9tX3Jhd19wYXJ0cygiCiAgICAgICAgICIqc2VsZiBhcyAqY29uc3Qge3tTVFJVQ1RfVFl9fSBhcyAqY29uc3QgdTgsIFNlbGY6OnNpemUoKSkiOwogICAgIGNvZGVfICs9ICIgICAgICAgIH07IjsKICAgICBjb2RlXyArPSAiICAgICAgICBkc3QuY29weV9mcm9tX3NsaWNlKHNyYyk7IjsKQEAgLTI3OTgsNyArMjgxMiw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgTnVtVG9TdHJpbmcoSW5saW5lU2l6ZShmaWVsZC52YWx1ZS50eXBlKSkpOwogICAgICAgICAgIGNvZGVfICs9ICJwdWIgZm4gc2V0X3t7RklFTER9fSgmbXV0IHNlbGYsIHg6ICZ7e0ZJRUxEX1RZUEV9fSkgeyI7CiAgICAgICAgICAgY29kZV8gKz0gIiAgdW5zYWZlIHsiOwotICAgICAgICAgIGNvZGVfICs9ICIgICAgc3RkOjpwdHI6OmNvcHkoIjsKKyAgICAgICAgICBjb2RlXyArPSAiICAgIGNvcmU6OnB0cjo6Y29weSgiOwogICAgICAgICAgIGNvZGVfICs9ICIgICAgICB4LmFzX3B0cigpIGFzICpjb25zdCB1OCwiOwogICAgICAgICAgIGNvZGVfICs9ICIgICAgICBzZWxmLjAuYXNfbXV0X3B0cigpLmFkZCh7e0ZJRUxEX09GRlNFVH19KSwiOwogICAgICAgICAgIGNvZGVfICs9ICIgICAgICB7e0ZJRUxEX1NJWkV9fSwiOwpAQCAtMjgyNCw3ICsyODM4LDcgQEAKIAogICAgIC8vIEdlbmVyYXRlIE9iamVjdCBBUEkgdW5wYWNrIG1ldGhvZC4KICAgICBpZiAocGFyc2VyXy5vcHRzLmdlbmVyYXRlX29iamVjdF9iYXNlZF9hcGkpIHsKLSAgICAgIGNvZGVfLlNldFZhbHVlKCJTVFJVQ1RfT1RZIiwgbmFtZXJfLk9iamVjdFR5cGUoc3RydWN0X2RlZi5uYW1lKSk7CisgICAgICBjb2RlXy5TZXRWYWx1ZSgiU1RSVUNUX09UWSIsIG5hbWVyXy5PYmplY3RUeXBlKHN0cnVjdF9kZWYpKTsKICAgICAgIGNvZGVfICs9ICIgIHB1YiBmbiB1bnBhY2soJnNlbGYpIC0+IHt7U1RSVUNUX09UWX19IHsiOwogICAgICAgY29kZV8gKz0gIiAgICB7e1NUUlVDVF9PVFl9fSB7IjsKICAgICAgIEZvckFsbFN0cnVjdEZpZWxkcyhzdHJ1Y3RfZGVmLCBbJl0oY29uc3QgRmllbGREZWYgJmZpZWxkKSB7CkBAIC0yODU3LDcgKzI4NzEsNyBAQAogICAgIGlmIChwYXJzZXJfLm9wdHMuZ2VuZXJhdGVfb2JqZWN0X2Jhc2VkX2FwaSkgewogICAgICAgLy8gU3RydWN0IGRlY2xhcmF0aW9uCiAgICAgICBjb2RlXyArPSAiI1tkZXJpdmUoRGVidWcsIENsb25lLCBQYXJ0aWFsRXEsIERlZmF1bHQpXSI7Ci0gICAgICBjb2RlXyArPSAicHViIHN0cnVjdCB7e1NUUlVDVF9PVFl9fSB7IjsKKyAgICAgIGNvZGVfICs9ICJ7e0FDQ0VTU19UWVBFfX0gc3RydWN0IHt7U1RSVUNUX09UWX19IHsiOwogICAgICAgRm9yQWxsU3RydWN0RmllbGRzKHN0cnVjdF9kZWYsIFsmXShjb25zdCBGaWVsZERlZiAmZmllbGQpIHsKICAgICAgICAgKHZvaWQpZmllbGQ7ICAvLyB1bnVzZWQuCiAgICAgICAgIGNvZGVfICs9ICJwdWIge3tGSUVMRH19OiB7e0ZJRUxEX09UWX19LCI7CkBAIC0yOTE1LDggKzI5MjksOCBAQAogICAgICAgICB9CiAgICAgICB9CiAgICAgfQotICAgIGNvZGVfICs9IGluZGVudCArICJ1c2Ugc3RkOjptZW07IjsKLSAgICBjb2RlXyArPSBpbmRlbnQgKyAidXNlIHN0ZDo6Y21wOjpPcmRlcmluZzsiOworICAgIGNvZGVfICs9IGluZGVudCArICJ1c2UgY29yZTo6bWVtOyI7CisgICAgY29kZV8gKz0gaW5kZW50ICsgInVzZSBjb3JlOjpjbXA6Ok9yZGVyaW5nOyI7CiAgICAgY29kZV8gKz0gIiI7CiAgICAgaWYgKHBhcnNlcl8ub3B0cy5ydXN0X3NlcmlhbGl6ZSkgewogICAgICAgY29kZV8gKz0gaW5kZW50ICsgImV4dGVybiBjcmF0ZSBzZXJkZTsiOwpAQCAtMjk3Myw3ICsyOTg3LDcgQEAKICAgfQogCiAgcHJpdmF0ZToKLSAgTmFtZXIgbmFtZXJfOworICBJZGxOYW1lciBuYW1lcl87CiB9OwogCiB9ICAvLyBuYW1lc3BhY2UgcnVzdApkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvc3JjL2lkbF9nZW5fc3dpZnQuY3BwIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvc3JjL2lkbF9nZW5fc3dpZnQuY3BwCmluZGV4IGMzYzMyMmYuLmIzYmFhMjggMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3NyYy9pZGxfZ2VuX3N3aWZ0LmNwcAorKysgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy9zcmMvaWRsX2dlbl9zd2lmdC5jcHAKQEAgLTIxLDIxICsyMSwxMzMgQEAKICNpbmNsdWRlICJmbGF0YnVmZmVycy9mbGF0YnVmZmVycy5oIgogI2luY2x1ZGUgImZsYXRidWZmZXJzL2lkbC5oIgogI2luY2x1ZGUgImZsYXRidWZmZXJzL3V0aWwuaCIKKyNpbmNsdWRlICJpZGxfbmFtZXIuaCIKIAogbmFtZXNwYWNlIGZsYXRidWZmZXJzIHsKIAogbmFtZXNwYWNlIHN3aWZ0IHsKIAotaW5saW5lIHN0ZDo6c3RyaW5nIEdlbkluZGlyZWN0KGNvbnN0IHN0ZDo6c3RyaW5nICZyZWFkaW5nKSB7CituYW1lc3BhY2UgeworCitzdGF0aWMgTmFtZXI6OkNvbmZpZyBTd2lmdERlZmF1bHRDb25maWcoKSB7CisgIHJldHVybiB7IC8qdHlwZXM9Ki9DYXNlOjprS2VlcCwKKyAgICAgICAgICAgLypjb25zdGFudHM9Ki9DYXNlOjprTG93ZXJDYW1lbCwKKyAgICAgICAgICAgLyptZXRob2RzPSovQ2FzZTo6a0xvd2VyQ2FtZWwsCisgICAgICAgICAgIC8qZnVuY3Rpb25zPSovQ2FzZTo6a0xvd2VyQ2FtZWwsCisgICAgICAgICAgIC8qZmllbGRzPSovQ2FzZTo6a0xvd2VyQ2FtZWwsCisgICAgICAgICAgIC8qdmFyaWFibGVzPSovQ2FzZTo6a0xvd2VyQ2FtZWwsCisgICAgICAgICAgIC8qdmFyaWFudHM9Ki9DYXNlOjprTG93ZXJDYW1lbCwKKyAgICAgICAgICAgLyplbnVtX3ZhcmlhbnRfc2VwZXJhdG9yPSovIi4iLAorICAgICAgICAgICAvKmVzY2FwZV9rZXl3b3Jkcz0qL05hbWVyOjpDb25maWc6OkVzY2FwZTo6QWZ0ZXJDb252ZXJ0aW5nQ2FzZSwKKyAgICAgICAgICAgLypuYW1lc3BhY2VzPSovQ2FzZTo6a0tlZXAsCisgICAgICAgICAgIC8qbmFtZXNwYWNlX3NlcGVyYXRvcj0qLyJfIiwKKyAgICAgICAgICAgLypvYmplY3RfcHJlZml4PSovIiIsCisgICAgICAgICAgIC8qb2JqZWN0X3N1ZmZpeD0qLyJUIiwKKyAgICAgICAgICAgLyprZXl3b3JkX3ByZWZpeD0qLyIiLAorICAgICAgICAgICAvKmtleXdvcmRfc3VmZml4PSovIl8iLAorICAgICAgICAgICAvKmZpbGVuYW1lcz0qL0Nhc2U6OmtLZWVwLAorICAgICAgICAgICAvKmRpcmVjdG9yaWVzPSovQ2FzZTo6a0tlZXAsCisgICAgICAgICAgIC8qb3V0cHV0X3BhdGg9Ki8iIiwKKyAgICAgICAgICAgLypmaWxlbmFtZV9zdWZmaXg9Ki8iX2dlbmVyYXRlZCIsCisgICAgICAgICAgIC8qZmlsZW5hbWVfZXh0ZW5zaW9uPSovIi5zd2lmdCIgfTsKK30KKworc3RhdGljIHN0ZDo6c2V0PHN0ZDo6c3RyaW5nPiBTd2lmdEtleXdvcmRzKCkgeworICByZXR1cm4geworICAgICJhc3NvY2lhdGVkdHlwZSIsCisgICAgImNsYXNzIiwKKyAgICAiZGVpbml0IiwKKyAgICAiZW51bSIsCisgICAgImV4dGVuc2lvbiIsCisgICAgImZpbGVwcml2YXRlIiwKKyAgICAiZnVuYyIsCisgICAgImltcG9ydCIsCisgICAgImluaXQiLAorICAgICJpbm91dCIsCisgICAgImludGVybmFsIiwKKyAgICAibGV0IiwKKyAgICAib3BlbiIsCisgICAgIm9wZXJhdG9yIiwKKyAgICAicHJpdmF0ZSIsCisgICAgInByb3RvY29sIiwKKyAgICAicHVibGljIiwKKyAgICAicmV0aHJvd3MiLAorICAgICJzdGF0aWMiLAorICAgICJzdHJ1Y3QiLAorICAgICJzdWJzY3JpcHQiLAorICAgICJ0eXBlYWxpYXMiLAorICAgICJ2YXIiLAorICAgICJicmVhayIsCisgICAgImNhc2UiLAorICAgICJjb250aW51ZSIsCisgICAgImRlZmF1bHQiLAorICAgICJkZWZlciIsCisgICAgImRvIiwKKyAgICAiZWxzZSIsCisgICAgImZhbGx0aHJvdWdoIiwKKyAgICAiZm9yIiwKKyAgICAiZ3VhcmQiLAorICAgICJpZiIsCisgICAgImluIiwKKyAgICAicmVwZWF0IiwKKyAgICAicmV0dXJuIiwKKyAgICAic3dpdGNoIiwKKyAgICAid2hlcmUiLAorICAgICJ3aGlsZSIsCisgICAgIkFueSIsCisgICAgImNhdGNoIiwKKyAgICAiZmFsc2UiLAorICAgICJpcyIsCisgICAgIm5pbCIsCisgICAgInN1cGVyIiwKKyAgICAic2VsZiIsCisgICAgIlNlbGYiLAorICAgICJ0aHJvdyIsCisgICAgInRocm93cyIsCisgICAgInRydWUiLAorICAgICJ0cnkiLAorICAgICJhc3NvY2lhdGl2aXR5IiwKKyAgICAiY29udmVuaWVuY2UiLAorICAgICJkeW5hbWljIiwKKyAgICAiZGlkU2V0IiwKKyAgICAiZmluYWwiLAorICAgICJnZXQiLAorICAgICJpbmZpeCIsCisgICAgImluZGlyZWN0IiwKKyAgICAibGF6eSIsCisgICAgImxlZnQiLAorICAgICJtdXRhdGluZyIsCisgICAgIm5vbmUiLAorICAgICJub25tdXRhdGluZyIsCisgICAgIm9wdGlvbmFsIiwKKyAgICAib3ZlcnJpZGUiLAorICAgICJwb3N0Zml4IiwKKyAgICAicHJlY2VkZW5jZSIsCisgICAgInByZWZpeCIsCisgICAgIlByb3RvY29sIiwKKyAgICAicmVxdWlyZWQiLAorICAgICJyaWdodCIsCisgICAgInNldCIsCisgICAgIlR5cGUiLAorICAgICJ1bm93bmVkIiwKKyAgICAid2VhayIsCisgICAgIndpbGxTZXQiLAorICAgICJWb2lkIiwKKyAgfTsKK30KKworc3RhdGljIHN0ZDo6c3RyaW5nIEdlbkluZGlyZWN0KGNvbnN0IHN0ZDo6c3RyaW5nICZyZWFkaW5nKSB7CiAgIHJldHVybiAie3tBQ0NFU1N9fS5pbmRpcmVjdCgiICsgcmVhZGluZyArICIpIjsKIH0KIAotaW5saW5lIHN0ZDo6c3RyaW5nIEdlbkFycmF5TWFpbkJvZHkoY29uc3Qgc3RkOjpzdHJpbmcgJm9wdGlvbmFsKSB7Ci0gIHJldHVybiAie3tBQ0NFU1NfVFlQRX19IGZ1bmMge3tWQUxVRU5BTUV9fShhdCBpbmRleDogSW50MzIpIC0+ICIKK3N0YXRpYyBzdGQ6OnN0cmluZyBHZW5BcnJheU1haW5Cb2R5KGNvbnN0IHN0ZDo6c3RyaW5nICZvcHRpb25hbCkgeworICByZXR1cm4gInt7QUNDRVNTX1RZUEV9fSBmdW5jIHt7RklFTERNRVRIT0R9fShhdCBpbmRleDogSW50MzIpIC0+ICIKICAgICAgICAgICJ7e1ZBTFVFVFlQRX19IiArCiAgICAgICAgICBvcHRpb25hbCArICIgeyAiOwogfQogCit9IC8vIG5hbWVzcGFjZQorCiBjbGFzcyBTd2lmdEdlbmVyYXRvciA6IHB1YmxpYyBCYXNlR2VuZXJhdG9yIHsKICBwcml2YXRlOgogICBDb2RlV3JpdGVyIGNvZGVfOwpAQCAtNDUsOTIgKzE1NywxMSBAQAogIHB1YmxpYzoKICAgU3dpZnRHZW5lcmF0b3IoY29uc3QgUGFyc2VyICZwYXJzZXIsIGNvbnN0IHN0ZDo6c3RyaW5nICZwYXRoLAogICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyAmZmlsZV9uYW1lKQotICAgICAgOiBCYXNlR2VuZXJhdG9yKHBhcnNlciwgcGF0aCwgZmlsZV9uYW1lLCAiIiwgIl8iLCAic3dpZnQiKSB7CisgICAgICA6IEJhc2VHZW5lcmF0b3IocGFyc2VyLCBwYXRoLCBmaWxlX25hbWUsICIiLCAiXyIsICJzd2lmdCIpLAorICAgICAgICBuYW1lcl8oV2l0aEZsYWdPcHRpb25zKFN3aWZ0RGVmYXVsdENvbmZpZygpLCBwYXJzZXIub3B0cywgcGF0aCksCisgICAgICAgICAgICAgICBTd2lmdEtleXdvcmRzKCkpIHsKICAgICBuYW1lc3BhY2VfZGVwdGggPSAwOwogICAgIGNvZGVfLlNldFBhZGRpbmcoIiAgIik7Ci0gICAgc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IGtleXdvcmRzW10gPSB7Ci0gICAgICAiYXNzb2NpYXRlZHR5cGUiLAotICAgICAgImNsYXNzIiwKLSAgICAgICJkZWluaXQiLAotICAgICAgImVudW0iLAotICAgICAgImV4dGVuc2lvbiIsCi0gICAgICAiZmlsZXByaXZhdGUiLAotICAgICAgImZ1bmMiLAotICAgICAgImltcG9ydCIsCi0gICAgICAiaW5pdCIsCi0gICAgICAiaW5vdXQiLAotICAgICAgImludGVybmFsIiwKLSAgICAgICJsZXQiLAotICAgICAgIm9wZW4iLAotICAgICAgIm9wZXJhdG9yIiwKLSAgICAgICJwcml2YXRlIiwKLSAgICAgICJwcm90b2NvbCIsCi0gICAgICAicHVibGljIiwKLSAgICAgICJyZXRocm93cyIsCi0gICAgICAic3RhdGljIiwKLSAgICAgICJzdHJ1Y3QiLAotICAgICAgInN1YnNjcmlwdCIsCi0gICAgICAidHlwZWFsaWFzIiwKLSAgICAgICJ2YXIiLAotICAgICAgImJyZWFrIiwKLSAgICAgICJjYXNlIiwKLSAgICAgICJjb250aW51ZSIsCi0gICAgICAiZGVmYXVsdCIsCi0gICAgICAiZGVmZXIiLAotICAgICAgImRvIiwKLSAgICAgICJlbHNlIiwKLSAgICAgICJmYWxsdGhyb3VnaCIsCi0gICAgICAiZm9yIiwKLSAgICAgICJndWFyZCIsCi0gICAgICAiaWYiLAotICAgICAgImluIiwKLSAgICAgICJyZXBlYXQiLAotICAgICAgInJldHVybiIsCi0gICAgICAic3dpdGNoIiwKLSAgICAgICJ3aGVyZSIsCi0gICAgICAid2hpbGUiLAotICAgICAgIkFueSIsCi0gICAgICAiY2F0Y2giLAotICAgICAgImZhbHNlIiwKLSAgICAgICJpcyIsCi0gICAgICAibmlsIiwKLSAgICAgICJzdXBlciIsCi0gICAgICAic2VsZiIsCi0gICAgICAiU2VsZiIsCi0gICAgICAidGhyb3ciLAotICAgICAgInRocm93cyIsCi0gICAgICAidHJ1ZSIsCi0gICAgICAidHJ5IiwKLSAgICAgICJhc3NvY2lhdGl2aXR5IiwKLSAgICAgICJjb252ZW5pZW5jZSIsCi0gICAgICAiZHluYW1pYyIsCi0gICAgICAiZGlkU2V0IiwKLSAgICAgICJmaW5hbCIsCi0gICAgICAiZ2V0IiwKLSAgICAgICJpbmZpeCIsCi0gICAgICAiaW5kaXJlY3QiLAotICAgICAgImxhenkiLAotICAgICAgImxlZnQiLAotICAgICAgIm11dGF0aW5nIiwKLSAgICAgICJub25lIiwKLSAgICAgICJub25tdXRhdGluZyIsCi0gICAgICAib3B0aW9uYWwiLAotICAgICAgIm92ZXJyaWRlIiwKLSAgICAgICJwb3N0Zml4IiwKLSAgICAgICJwcmVjZWRlbmNlIiwKLSAgICAgICJwcmVmaXgiLAotICAgICAgIlByb3RvY29sIiwKLSAgICAgICJyZXF1aXJlZCIsCi0gICAgICAicmlnaHQiLAotICAgICAgInNldCIsCi0gICAgICAiVHlwZSIsCi0gICAgICAidW5vd25lZCIsCi0gICAgICAid2VhayIsCi0gICAgICAid2lsbFNldCIsCi0gICAgICAiVm9pZCIsCi0gICAgICBudWxscHRyLAotICAgIH07Ci0gICAgZm9yIChhdXRvIGt3ID0ga2V5d29yZHM7ICprdzsga3crKykga2V5d29yZHNfLmluc2VydCgqa3cpOwogICB9CiAKICAgYm9vbCBnZW5lcmF0ZSgpIHsKQEAgLTE0MCw5ICsxNzEsMTQgQEAKICAgICBjb2RlXyArPSAiLy8gIiArIHN0ZDo6c3RyaW5nKEZsYXRCdWZmZXJzR2VuZXJhdGVkV2FybmluZygpKTsKICAgICBjb2RlXyArPSAiLy8gc3dpZnRsaW50OmRpc2FibGUgYWxsIjsKICAgICBjb2RlXyArPSAiLy8gc3dpZnRmb3JtYXQ6ZGlzYWJsZSBhbGxcbiI7Ci0gICAgY29kZV8gKz0gImltcG9ydCBGbGF0QnVmZmVyc1xuIjsKLSAgICAvLyBHZW5lcmF0ZSBjb2RlIGZvciBhbGwgdGhlIGVudW0gZGVjbGFyYXRpb25zLgorICAgIGlmIChwYXJzZXJfLm9wdHMuaW5jbHVkZV9kZXBlbmRlbmNlX2hlYWRlcnMgfHwgcGFyc2VyXy5vcHRzLmdlbmVyYXRlX2FsbCkgeworICAgICAgaWYgKHBhcnNlcl8ub3B0cy5zd2lmdF9pbXBsZW1lbnRhdGlvbl9vbmx5KQorICAgICAgICBjb2RlXyArPSAiQF9pbXBsZW1lbnRhdGlvbk9ubHkgXFwiOwogCisgICAgICBjb2RlXyArPSAiaW1wb3J0IEZsYXRCdWZmZXJzXG4iOworICAgIH0KKworICAgIC8vIEdlbmVyYXRlIGNvZGUgZm9yIGFsbCB0aGUgZW51bSBkZWNsYXJhdGlvbnMuCiAgICAgZm9yIChhdXRvIGl0ID0gcGFyc2VyXy5lbnVtc18udmVjLmJlZ2luKCk7IGl0ICE9IHBhcnNlcl8uZW51bXNfLnZlYy5lbmQoKTsKICAgICAgICAgICsraXQpIHsKICAgICAgIGNvbnN0IGF1dG8gJmVudW1fZGVmID0gKippdDsKQEAgLTE4MywxMCArMjE5LDEyIEBACiAKICAgLy8gR2VuZXJhdGVzIHRoZSByZWFkZXIgZm9yIHN3aWZ0CiAgIHZvaWQgR2VuU3RydWN0UmVhZGVyKGNvbnN0IFN0cnVjdERlZiAmc3RydWN0X2RlZikgewotICAgIGF1dG8gaXNfcHJpdmF0ZV9hY2Nlc3MgPSBzdHJ1Y3RfZGVmLmF0dHJpYnV0ZXMuTG9va3VwKCJwcml2YXRlIik7CisgICAgY29uc3QgYm9vbCBpc19wcml2YXRlX2FjY2VzcyA9CisgICAgICAgIHBhcnNlcl8ub3B0cy5zd2lmdF9pbXBsZW1lbnRhdGlvbl9vbmx5IHx8CisgICAgICAgIHN0cnVjdF9kZWYuYXR0cmlidXRlcy5Mb29rdXAoInByaXZhdGUiKSAhPSBudWxscHRyOwogICAgIGNvZGVfLlNldFZhbHVlKCJBQ0NFU1NfVFlQRSIsIGlzX3ByaXZhdGVfYWNjZXNzID8gImludGVybmFsIiA6ICJwdWJsaWMiKTsKICAgICBHZW5Db21tZW50KHN0cnVjdF9kZWYuZG9jX2NvbW1lbnQpOwotICAgIGNvZGVfLlNldFZhbHVlKCJTVFJVQ1ROQU1FIiwgTmFtZVdyYXBwZWRJbk5hbWVTcGFjZShzdHJ1Y3RfZGVmKSk7CisgICAgY29kZV8uU2V0VmFsdWUoIlNUUlVDVE5BTUUiLCBuYW1lcl8uTmFtZXNwYWNlZFR5cGUoc3RydWN0X2RlZikpOwogICAgIGNvZGVfICs9CiAgICAgICAgICJ7e0FDQ0VTU19UWVBFfX0gc3RydWN0IHt7U1RSVUNUTkFNRX19OiBOYXRpdmVTdHJ1Y3QsIFZlcmlmaWFibGUsICIKICAgICAgICAgIkZsYXRidWZmZXJzSW5pdGlhbGl6YWJsZVxcIjsKQEAgLTIwMywxNCArMjQxLDE0IEBACiAKICAgICBmb3IgKGF1dG8gaXQgPSBzdHJ1Y3RfZGVmLmZpZWxkcy52ZWMuYmVnaW4oKTsKICAgICAgICAgIGl0ICE9IHN0cnVjdF9kZWYuZmllbGRzLnZlYy5lbmQoKTsgKytpdCkgewotICAgICAgYXV0byAmZmllbGQgPSAqKml0OworICAgICAgY29uc3QgYXV0byAmZmllbGQgPSAqKml0OwogICAgICAgaWYgKGZpZWxkLmRlcHJlY2F0ZWQpIGNvbnRpbnVlOwogCiAgICAgICBpZiAoIWNvbnN0cnVjdG9yLmVtcHR5KCkpIGNvbnN0cnVjdG9yICs9ICIsICI7CiAKLSAgICAgIGF1dG8gbmFtZSA9IE5hbWUoZmllbGQpOwotICAgICAgYXV0byB0eXBlID0gR2VuVHlwZShmaWVsZC52YWx1ZS50eXBlKTsKLSAgICAgIGNvZGVfLlNldFZhbHVlKCJWQUxVRU5BTUUiLCBuYW1lKTsKKyAgICAgIGNvbnN0IGF1dG8gZmllbGRfdmFyID0gbmFtZXJfLlZhcmlhYmxlKGZpZWxkKTsKKyAgICAgIGNvbnN0IGF1dG8gdHlwZSA9IEdlblR5cGUoZmllbGQudmFsdWUudHlwZSk7CisgICAgICBjb2RlXy5TZXRWYWx1ZSgiRklFTERWQVIiLCBmaWVsZF92YXIpOwogICAgICAgaWYgKElzRW51bShmaWVsZC52YWx1ZS50eXBlKSkgewogICAgICAgICBjb2RlXy5TZXRWYWx1ZSgiQkFTRVZBTFVFIiwgR2VuVHlwZUJhc2ljKGZpZWxkLnZhbHVlLnR5cGUsIGZhbHNlKSk7CiAgICAgICB9CkBAIC0yMTgsMTggKzI1NiwyMCBAQAogICAgICAgR2VuQ29tbWVudChmaWVsZC5kb2NfY29tbWVudCk7CiAgICAgICBzdGQ6OnN0cmluZyB2YWx1ZVR5cGUgPQogICAgICAgICAgIElzRW51bShmaWVsZC52YWx1ZS50eXBlKSA/ICJ7e0JBU0VWQUxVRX19IiA6ICJ7e1ZBTFVFVFlQRX19IjsKLSAgICAgIGNvZGVfICs9ICJwcml2YXRlIHZhciBfe3tWQUxVRU5BTUV9fTogIiArIHZhbHVlVHlwZTsKLSAgICAgIGF1dG8gYWNjZXNzaW5nX3ZhbHVlID0gSXNFbnVtKGZpZWxkLnZhbHVlLnR5cGUpID8gIi52YWx1ZSIgOiAiIjsKLSAgICAgIGF1dG8gaXNfYm9vbCA9IElzQm9vbChmaWVsZC52YWx1ZS50eXBlLmJhc2VfdHlwZSk7Ci0gICAgICBhdXRvIGJhc2VfdmFsdWUgPSBJc1N0cnVjdChmaWVsZC52YWx1ZS50eXBlKSA/ICh0eXBlICsgIigpIikKLSAgICAgICAgOiBpc19ib29sID8gKCIwIiA9PSBmaWVsZC52YWx1ZS5jb25zdGFudCA/ICJmYWxzZSIgOiAidHJ1ZSIpCi0gICAgICAgIDogZmllbGQudmFsdWUuY29uc3RhbnQ7CisgICAgICBjb2RlXyArPSAicHJpdmF0ZSB2YXIgX3t7RklFTERWQVJ9fTogIiArIHZhbHVlVHlwZTsKKyAgICAgIGNvbnN0IGF1dG8gYWNjZXNzaW5nX3ZhbHVlID0gSXNFbnVtKGZpZWxkLnZhbHVlLnR5cGUpID8gIi52YWx1ZSIgOiAiIjsKKyAgICAgIGNvbnN0IGF1dG8gaXNfYm9vbCA9IElzQm9vbChmaWVsZC52YWx1ZS50eXBlLmJhc2VfdHlwZSk7CisgICAgICBjb25zdCBhdXRvIGJhc2VfdmFsdWUgPQorICAgICAgICAgIElzU3RydWN0KGZpZWxkLnZhbHVlLnR5cGUpID8gKHR5cGUgKyAiKCkiKQorICAgICAgICAgIDogaXNfYm9vbCA/ICgiMCIgPT0gZmllbGQudmFsdWUuY29uc3RhbnQgPyAiZmFsc2UiIDogInRydWUiKQorICAgICAgICAgICAgICAgICAgICA6IGZpZWxkLnZhbHVlLmNvbnN0YW50OwogCi0gICAgICBtYWluX2NvbnN0cnVjdG9yLnB1c2hfYmFjaygiXyIgKyBuYW1lICsgIiA9ICIgKyBuYW1lICsgYWNjZXNzaW5nX3ZhbHVlKTsKLSAgICAgIGJhc2VfY29uc3RydWN0b3IucHVzaF9iYWNrKCJfIiArIG5hbWUgKyAiID0gIiArIGJhc2VfdmFsdWUpOworICAgICAgbWFpbl9jb25zdHJ1Y3Rvci5wdXNoX2JhY2soIl8iICsgZmllbGRfdmFyICsgIiA9ICIgKyBmaWVsZF92YXIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWNjZXNzaW5nX3ZhbHVlKTsKKyAgICAgIGJhc2VfY29uc3RydWN0b3IucHVzaF9iYWNrKCJfIiArIGZpZWxkX3ZhciArICIgPSAiICsgYmFzZV92YWx1ZSk7CiAKICAgICAgIGlmIChmaWVsZC5wYWRkaW5nKSB7IEdlblBhZGRpbmcoZmllbGQsICZwYWRkaW5nX2lkKTsgfQotICAgICAgY29uc3RydWN0b3IgKz0gbmFtZSArICI6ICIgKyB0eXBlOworICAgICAgY29uc3RydWN0b3IgKz0gZmllbGRfdmFyICsgIjogIiArIHR5cGU7CiAgICAgfQogICAgIGNvZGVfICs9ICIiOwogICAgIEJ1aWxkU3RydWN0Q29uc3RydWN0b3Ioc3RydWN0X2RlZik7CkBAIC0yNDEsMjMgKzI4MSwyMiBAQAogCiAgICAgZm9yIChhdXRvIGl0ID0gc3RydWN0X2RlZi5maWVsZHMudmVjLmJlZ2luKCk7CiAgICAgICAgICBpdCAhPSBzdHJ1Y3RfZGVmLmZpZWxkcy52ZWMuZW5kKCk7ICsraXQpIHsKLSAgICAgIGF1dG8gJmZpZWxkID0gKippdDsKKyAgICAgIGNvbnN0IGF1dG8gJmZpZWxkID0gKippdDsKICAgICAgIGlmIChmaWVsZC5kZXByZWNhdGVkKSBjb250aW51ZTsKLSAgICAgIGF1dG8gbmFtZSA9IE5hbWUoZmllbGQpOwotICAgICAgYXV0byB0eXBlID0gR2VuVHlwZShmaWVsZC52YWx1ZS50eXBlKTsKLSAgICAgIGNvZGVfLlNldFZhbHVlKCJWQUxVRU5BTUUiLCBuYW1lKTsKLSAgICAgIGNvZGVfLlNldFZhbHVlKCJWQUxVRVRZUEUiLCB0eXBlKTsKKyAgICAgIGNvZGVfLlNldFZhbHVlKCJGSUVMRFZBUiIsIG5hbWVyXy5WYXJpYWJsZShmaWVsZCkpOworICAgICAgY29kZV8uU2V0VmFsdWUoIlZBTFVFVFlQRSIsIEdlblR5cGUoZmllbGQudmFsdWUudHlwZSkpOwogICAgICAgR2VuQ29tbWVudChmaWVsZC5kb2NfY29tbWVudCk7CiAgICAgICBpZiAoIUlzRW51bShmaWVsZC52YWx1ZS50eXBlKSkgewotICAgICAgICBjb2RlXyArPSBHZW5SZWFkZXJNYWluQm9keSgpICsgIl97e1ZBTFVFTkFNRX19IH0iOworICAgICAgICBjb2RlXyArPSBHZW5SZWFkZXJNYWluQm9keSgpICsgIl97e0ZJRUxEVkFSfX0gfSI7CiAgICAgICB9IGVsc2UgaWYgKElzRW51bShmaWVsZC52YWx1ZS50eXBlKSkgewogICAgICAgICBjb2RlXyArPQotICAgICAgICAgICAgR2VuUmVhZGVyTWFpbkJvZHkoKSArICJ7e1ZBTFVFVFlQRX19KHJhd1ZhbHVlOiBfe3tWQUxVRU5BTUV9fSkhIH0iOworICAgICAgICAgICAgR2VuUmVhZGVyTWFpbkJvZHkoKSArICJ7e1ZBTFVFVFlQRX19KHJhd1ZhbHVlOiBfe3tGSUVMRFZBUn19KSEgfSI7CiAgICAgICB9CiAgICAgfQogICAgIGNvZGVfICs9ICIiOwogICAgIGNvZGVfICs9Ci0gICAgICAgICJwdWJsaWMgc3RhdGljIGZ1bmMgdmVyaWZ5PFQ+KF8gdmVyaWZpZXI6IGlub3V0IFZlcmlmaWVyLCBhdCBwb3NpdGlvbjogIgorICAgICAgICAie3tBQ0NFU1NfVFlQRX19IHN0YXRpYyBmdW5jIHZlcmlmeTxUPihfIHZlcmlmaWVyOiBpbm91dCBWZXJpZmllciwgYXQgIgorICAgICAgICAicG9zaXRpb246ICIKICAgICAgICAgIkludCwgb2YgdHlwZTogVC5UeXBlKSB0aHJvd3Mgd2hlcmUgVDogVmVyaWZpYWJsZSB7IjsKICAgICBJbmRlbnQoKTsKICAgICBjb2RlXyArPQpAQCAtMjc1LDIyICszMTQsMjEgQEAKICAgICBjb2RlXyArPSAibGV0IHt7QUNDRVNTfX0gPSBTdHJ1Y3QoYmI6IGJiLCBwb3NpdGlvbjogbykiOwogICAgIGZvciAoYXV0byBpdCA9IHN0cnVjdF9kZWYuZmllbGRzLnZlYy5iZWdpbigpOwogICAgICAgICAgaXQgIT0gc3RydWN0X2RlZi5maWVsZHMudmVjLmVuZCgpOyArK2l0KSB7Ci0gICAgICBhdXRvICZmaWVsZCA9ICoqaXQ7CisgICAgICBjb25zdCBhdXRvICZmaWVsZCA9ICoqaXQ7CiAgICAgICBpZiAoZmllbGQuZGVwcmVjYXRlZCkgY29udGludWU7Ci0gICAgICBhdXRvIG5hbWUgPSBOYW1lKGZpZWxkKTsKLSAgICAgIGF1dG8gdHlwZSA9IGZpZWxkLnZhbHVlLnR5cGU7Ci0gICAgICBjb2RlXy5TZXRWYWx1ZSgiVkFMVUVOQU1FIiwgbmFtZSk7CisgICAgICBjb25zdCBhdXRvIHR5cGUgPSBmaWVsZC52YWx1ZS50eXBlOworICAgICAgY29kZV8uU2V0VmFsdWUoIkZJRUxEVkFSIiwgbmFtZXJfLlZhcmlhYmxlKGZpZWxkKSk7CiAgICAgICBjb2RlXy5TZXRWYWx1ZSgiVkFMVUVUWVBFIiwgR2VuVHlwZSh0eXBlKSk7CiAgICAgICBjb2RlXy5TZXRWYWx1ZSgiT0ZGU0VUIiwgTnVtVG9TdHJpbmcoZmllbGQudmFsdWUub2Zmc2V0KSk7CiAgICAgICBpZiAoSXNTY2FsYXIodHlwZS5iYXNlX3R5cGUpKSB7CiAgICAgICAgIGlmIChJc0VudW0odHlwZSkpCiAgICAgICAgICAgY29kZV8uU2V0VmFsdWUoIlZBTFVFVFlQRSIsIEdlblR5cGVCYXNpYyhmaWVsZC52YWx1ZS50eXBlLCBmYWxzZSkpOwogICAgICAgICBjb2RlXyArPQotICAgICAgICAgICAgIl97e1ZBTFVFTkFNRX19ID0ge3tBQ0NFU1N9fS5yZWFkQnVmZmVyKG9mOiB7e1ZBTFVFVFlQRX19LnNlbGYsICIKKyAgICAgICAgICAgICJfe3tGSUVMRFZBUn19ID0ge3tBQ0NFU1N9fS5yZWFkQnVmZmVyKG9mOiB7e1ZBTFVFVFlQRX19LnNlbGYsICIKICAgICAgICAgICAgICJhdDoge3tPRkZTRVR9fSkiOwogICAgICAgfSBlbHNlIHsKICAgICAgICAgY29kZV8gKz0KLSAgICAgICAgICAgICJfe3tWQUxVRU5BTUV9fSA9IHt7VkFMVUVUWVBFfX0oe3tBQ0NFU1N9fS5iYiwgbzogIgorICAgICAgICAgICAgIl97e0ZJRUxEVkFSfX0gPSB7e1ZBTFVFVFlQRX19KHt7QUNDRVNTfX0uYmIsIG86ICIKICAgICAgICAgICAgICJ7e0FDQ0VTU319LnBvc3Rpb24gKyB7e09GRlNFVH19KSI7CiAgICAgICB9CiAgICAgfQpAQCAtMzAzLDEyICszNDEsMTEgQEAKIAogICAgIGZvciAoYXV0byBpdCA9IHN0cnVjdF9kZWYuZmllbGRzLnZlYy5iZWdpbigpOwogICAgICAgICAgaXQgIT0gc3RydWN0X2RlZi5maWVsZHMudmVjLmVuZCgpOyArK2l0KSB7Ci0gICAgICBhdXRvICZmaWVsZCA9ICoqaXQ7CisgICAgICBjb25zdCBhdXRvICZmaWVsZCA9ICoqaXQ7CiAgICAgICBpZiAoZmllbGQuZGVwcmVjYXRlZCkgY29udGludWU7Ci0gICAgICBhdXRvIG9mZnNldCA9IE51bVRvU3RyaW5nKGZpZWxkLnZhbHVlLm9mZnNldCk7Ci0gICAgICBhdXRvIG5hbWUgPSBOYW1lKGZpZWxkKTsKLSAgICAgIGF1dG8gdHlwZSA9IEdlblR5cGUoZmllbGQudmFsdWUudHlwZSk7Ci0gICAgICBjb2RlXy5TZXRWYWx1ZSgiVkFMVUVOQU1FIiwgbmFtZSk7CisgICAgICBjb25zdCBhdXRvIG9mZnNldCA9IE51bVRvU3RyaW5nKGZpZWxkLnZhbHVlLm9mZnNldCk7CisgICAgICBjb25zdCBhdXRvIHR5cGUgPSBHZW5UeXBlKGZpZWxkLnZhbHVlLnR5cGUpOworICAgICAgY29kZV8uU2V0VmFsdWUoIkZJRUxEVkFSIiwgbmFtZXJfLlZhcmlhYmxlKGZpZWxkKSk7CiAgICAgICBpZiAoSXNFbnVtKGZpZWxkLnZhbHVlLnR5cGUpKSB7CiAgICAgICAgIGNvZGVfLlNldFZhbHVlKCJCQVNFVkFMVUUiLCBHZW5UeXBlQmFzaWMoZmllbGQudmFsdWUudHlwZSwgZmFsc2UpKTsKICAgICAgIH0KQEAgLTMzMiw3ICszNjksNyBAQAogICAgIH0KIAogICAgIGlmIChwYXJzZXJfLm9wdHMuZ2VuZXJhdGVfb2JqZWN0X2Jhc2VkX2FwaSkgewotICAgICAgR2VuZXJhdGVPYmplY3RBUElFeHRlbnNpb25IZWFkZXIoTmFtZVdyYXBwZWRJbk5hbWVTcGFjZShzdHJ1Y3RfZGVmKSk7CisgICAgICBHZW5lcmF0ZU9iamVjdEFQSUV4dGVuc2lvbkhlYWRlcihuYW1lcl8uTmFtZXNwYWNlZFR5cGUoc3RydWN0X2RlZikpOwogICAgICAgY29kZV8gKz0gInJldHVybiBidWlsZGVyLmNyZWF0ZShzdHJ1Y3Q6IG9iaikiOwogICAgICAgT3V0ZGVudCgpOwogICAgICAgY29kZV8gKz0gIn0iOwpAQCAtMzQzLDEwICszODAsMTIgQEAKIAogICAvLyBHZW5lcmF0ZXMgdGhlIGNyZWF0ZSBmdW5jdGlvbiBmb3Igc3dpZnQKICAgdm9pZCBHZW5TdHJ1Y3RXcml0ZXIoY29uc3QgU3RydWN0RGVmICZzdHJ1Y3RfZGVmKSB7Ci0gICAgYXV0byBpc19wcml2YXRlX2FjY2VzcyA9IHN0cnVjdF9kZWYuYXR0cmlidXRlcy5Mb29rdXAoInByaXZhdGUiKTsKKyAgICBjb25zdCBib29sIGlzX3ByaXZhdGVfYWNjZXNzID0KKyAgICAgICAgcGFyc2VyXy5vcHRzLnN3aWZ0X2ltcGxlbWVudGF0aW9uX29ubHkgfHwKKyAgICAgICAgc3RydWN0X2RlZi5hdHRyaWJ1dGVzLkxvb2t1cCgicHJpdmF0ZSIpICE9IG51bGxwdHI7CiAgICAgY29kZV8uU2V0VmFsdWUoIkFDQ0VTU19UWVBFIiwgaXNfcHJpdmF0ZV9hY2Nlc3MgPyAiaW50ZXJuYWwiIDogInB1YmxpYyIpOwotICAgIGNvZGVfLlNldFZhbHVlKCJTVFJVQ1ROQU1FIiwgTmFtZVdyYXBwZWRJbk5hbWVTcGFjZShzdHJ1Y3RfZGVmKSk7Ci0gICAgY29kZV8uU2V0VmFsdWUoIlNIT1JUX1NUUlVDVE5BTUUiLCBOYW1lKHN0cnVjdF9kZWYpKTsKKyAgICBjb2RlXy5TZXRWYWx1ZSgiU1RSVUNUTkFNRSIsIG5hbWVyXy5OYW1lc3BhY2VkVHlwZShzdHJ1Y3RfZGVmKSk7CisgICAgY29kZV8uU2V0VmFsdWUoIlNIT1JUX1NUUlVDVE5BTUUiLCBuYW1lcl8uTWV0aG9kKHN0cnVjdF9kZWYpKTsKICAgICBjb2RlXyArPSAiZXh0ZW5zaW9uIHt7U1RSVUNUTkFNRX19IHsiOwogICAgIEluZGVudCgpOwogICAgIGNvZGVfICs9ICJAZGlzY2FyZGFibGVSZXN1bHQiOwpAQCAtMzc2LDcgKzQxNSw3IEBACiAgICAgYXV0byAmY29kZSA9ICpjb2RlX3B0cjsKICAgICBmb3IgKGF1dG8gaXQgPSBzdHJ1Y3RfZGVmLmZpZWxkcy52ZWMuYmVnaW4oKTsKICAgICAgICAgIGl0ICE9IHN0cnVjdF9kZWYuZmllbGRzLnZlYy5lbmQoKTsgKytpdCkgewotICAgICAgYXV0byAmZmllbGQgPSAqKml0OworICAgICAgY29uc3QgYXV0byAmZmllbGQgPSAqKml0OwogICAgICAgaWYgKGZpZWxkLmRlcHJlY2F0ZWQpIGNvbnRpbnVlOwogICAgICAgY29uc3QgYXV0byAmZmllbGRfdHlwZSA9IGZpZWxkLnZhbHVlLnR5cGU7CiAgICAgICBpZiAoSXNTdHJ1Y3QoZmllbGQudmFsdWUudHlwZSkpIHsKQEAgLTM4NCwxNCArNDIzLDE1IEBACiAgICAgICAgICAgICAqZmllbGRfdHlwZS5zdHJ1Y3RfZGVmLCBjb2RlX3B0ciwgKG5hbWVwcmVmaXggKyBmaWVsZC5uYW1lKSwKICAgICAgICAgICAgIChvYmplY3RfbmFtZSArICIuIiArIGZpZWxkLm5hbWUpLCBvYmpfYXBpX25hbWVkLCBpc19vYmpfYXBpKTsKICAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGF1dG8gbmFtZSA9IE5hbWUoZmllbGQpOwotICAgICAgICBhdXRvIHR5cGUgPSBHZW5UeXBlKGZpZWxkLnZhbHVlLnR5cGUpOworICAgICAgICBjb25zdCBhdXRvIGZpZWxkX3ZhciA9IG5hbWVyXy5WYXJpYWJsZShmaWVsZCk7CisgICAgICAgIGNvbnN0IGF1dG8gZmllbGRfZmllbGQgPSBuYW1lcl8uRmllbGQoZmllbGQpOworICAgICAgICBjb25zdCBhdXRvIHR5cGUgPSBHZW5UeXBlKGZpZWxkLnZhbHVlLnR5cGUpOwogICAgICAgICBpZiAoIWlzX29ial9hcGkpIHsKLSAgICAgICAgICBjb2RlICs9IG5hbWVwcmVmaXggKyBuYW1lICsgIjogIiArIHR5cGU7CisgICAgICAgICAgY29kZSArPSBuYW1lcHJlZml4ICsgZmllbGRfdmFyICsgIjogIiArIHR5cGU7CiAgICAgICAgICAgaWYgKCFJc0VudW0oZmllbGQudmFsdWUudHlwZSkpIHsKICAgICAgICAgICAgIGNvZGUgKz0gIiA9ICI7Ci0gICAgICAgICAgICBhdXRvIGlzX2Jvb2wgPSBJc0Jvb2woZmllbGQudmFsdWUudHlwZS5iYXNlX3R5cGUpOwotICAgICAgICAgICAgYXV0byBjb25zdGFudCA9CisgICAgICAgICAgICBjb25zdCBhdXRvIGlzX2Jvb2wgPSBJc0Jvb2woZmllbGQudmFsdWUudHlwZS5iYXNlX3R5cGUpOworICAgICAgICAgICAgY29uc3QgYXV0byBjb25zdGFudCA9CiAgICAgICAgICAgICAgICAgaXNfYm9vbCA/ICgiMCIgPT0gZmllbGQudmFsdWUuY29uc3RhbnQgPyAiZmFsc2UiIDogInRydWUiKQogICAgICAgICAgICAgICAgICAgICAgICAgOiBmaWVsZC52YWx1ZS5jb25zdGFudDsKICAgICAgICAgICAgIGNvZGUgKz0gY29uc3RhbnQ7CkBAIC0zOTksOCArNDM5LDggQEAKICAgICAgICAgICBjb2RlICs9ICIsICI7CiAgICAgICAgICAgY29udGludWU7CiAgICAgICAgIH0KLSAgICAgICAgY29kZSArPQotICAgICAgICAgICAgbmFtZXByZWZpeCArIG5hbWUgKyAiOiAiICsgb2JqX2FwaV9uYW1lZCArIG9iamVjdF9uYW1lICsgIi4iICsgbmFtZTsKKyAgICAgICAgY29kZSArPSBuYW1lcHJlZml4ICsgZmllbGRfdmFyICsgIjogIiArIG9ial9hcGlfbmFtZWQgKyBvYmplY3RfbmFtZSArCisgICAgICAgICAgICAgICAgIi4iICsgZmllbGRfZmllbGQ7CiAgICAgICAgIGNvZGUgKz0gIiwgIjsKICAgICAgIH0KICAgICB9CkBAIC00MTAsNyArNDUwLDkgQEAKIAogICAvLyBHZW5lcmF0ZXMgdGhlIHJlYWRlciBmb3Igc3dpZnQKICAgdm9pZCBHZW5UYWJsZShjb25zdCBTdHJ1Y3REZWYgJnN0cnVjdF9kZWYpIHsKLSAgICBhdXRvIGlzX3ByaXZhdGVfYWNjZXNzID0gc3RydWN0X2RlZi5hdHRyaWJ1dGVzLkxvb2t1cCgicHJpdmF0ZSIpOworICAgIGNvbnN0IGJvb2wgaXNfcHJpdmF0ZV9hY2Nlc3MgPQorICAgICAgICBwYXJzZXJfLm9wdHMuc3dpZnRfaW1wbGVtZW50YXRpb25fb25seSB8fAorICAgICAgICBzdHJ1Y3RfZGVmLmF0dHJpYnV0ZXMuTG9va3VwKCJwcml2YXRlIikgIT0gbnVsbHB0cjsKICAgICBjb2RlXy5TZXRWYWx1ZSgiQUNDRVNTX1RZUEUiLCBpc19wcml2YXRlX2FjY2VzcyA/ICJpbnRlcm5hbCIgOiAicHVibGljIik7CiAgICAgR2VuT2JqZWN0SGVhZGVyKHN0cnVjdF9kZWYpOwogICAgIEdlblRhYmxlQWNjZXNzb3JzKHN0cnVjdF9kZWYpOwpAQCAtNDM1LDcgKzQ3Nyw3IEBACiAgICAgICAgICAgIGl0ICE9IHN0cnVjdF9kZWYuZmllbGRzLnZlYy5lbmQoKTsgKytpdCkgewogICAgICAgICBjb25zdCBhdXRvICZmaWVsZCA9ICoqaXQ7CiAgICAgICAgIGlmIChmaWVsZC5kZXByZWNhdGVkKSB7IGNvbnRpbnVlOyB9Ci0gICAgICAgIGNvZGVfLlNldFZhbHVlKCJPRkZTRVRfTkFNRSIsIE5hbWUoZmllbGQpKTsKKyAgICAgICAgY29kZV8uU2V0VmFsdWUoIk9GRlNFVF9OQU1FIiwgbmFtZXJfLlZhcmlhYmxlKGZpZWxkKSk7CiAgICAgICAgIGNvZGVfLlNldFZhbHVlKCJPRkZTRVRfVkFMVUUiLCBOdW1Ub1N0cmluZyhmaWVsZC52YWx1ZS5vZmZzZXQpKTsKICAgICAgICAgY29kZV8gKz0gImNhc2Uge3tPRkZTRVRfTkFNRX19ID0ge3tPRkZTRVRfVkFMVUV9fSI7CiAgICAgICB9CkBAIC00NTAsOCArNDkyLDggQEAKICAgdm9pZCBHZW5PYmplY3RIZWFkZXIoY29uc3QgU3RydWN0RGVmICZzdHJ1Y3RfZGVmKSB7CiAgICAgR2VuQ29tbWVudChzdHJ1Y3RfZGVmLmRvY19jb21tZW50KTsKIAotICAgIGNvZGVfLlNldFZhbHVlKCJTSE9SVF9TVFJVQ1ROQU1FIiwgTmFtZShzdHJ1Y3RfZGVmKSk7Ci0gICAgY29kZV8uU2V0VmFsdWUoIlNUUlVDVE5BTUUiLCBOYW1lV3JhcHBlZEluTmFtZVNwYWNlKHN0cnVjdF9kZWYpKTsKKyAgICBjb2RlXy5TZXRWYWx1ZSgiU0hPUlRfU1RSVUNUTkFNRSIsIG5hbWVyXy5UeXBlKHN0cnVjdF9kZWYpKTsKKyAgICBjb2RlXy5TZXRWYWx1ZSgiU1RSVUNUTkFNRSIsIG5hbWVyXy5OYW1lc3BhY2VkVHlwZShzdHJ1Y3RfZGVmKSk7CiAgICAgY29kZV8uU2V0VmFsdWUoIk9CSkVDVFRZUEUiLCBzdHJ1Y3RfZGVmLmZpeGVkID8gIlN0cnVjdCIgOiAiVGFibGUiKTsKICAgICBjb2RlXy5TZXRWYWx1ZSgiTVVUQUJMRSIsIHN0cnVjdF9kZWYuZml4ZWQgPyBNdXRhYmxlKCkgOiAiIik7CiAgICAgY29kZV8gKz0KQEAgLTQ2OCwxMiArNTEwLDEzIEBACiAgICAgaWYgKCFzdHJ1Y3RfZGVmLmZpeGVkKSB7CiAgICAgICBpZiAocGFyc2VyXy5maWxlX2lkZW50aWZpZXJfLmxlbmd0aCgpKSB7CiAgICAgICAgIGNvZGVfLlNldFZhbHVlKCJGSUxFTkFNRSIsIHBhcnNlcl8uZmlsZV9pZGVudGlmaWVyXyk7CisgICAgICAgIGNvZGVfICs9ICJ7e0FDQ0VTU19UWVBFfX0gc3RhdGljIHZhciBpZDogU3RyaW5nIHsgXCJ7e0ZJTEVOQU1FfX1cIiB9ICI7CiAgICAgICAgIGNvZGVfICs9CiAgICAgICAgICAgICAie3tBQ0NFU1NfVFlQRX19IHN0YXRpYyBmdW5jIGZpbmlzaChfIGZiYjogaW5vdXQgIgogICAgICAgICAgICAgIkZsYXRCdWZmZXJCdWlsZGVyLCBlbmQ6ICIKICAgICAgICAgICAgICJPZmZzZXQsIHByZWZpeDogQm9vbCA9IGZhbHNlKSB7IGZiYi5maW5pc2gob2Zmc2V0OiBlbmQsICIKICAgICAgICAgICAgICJmaWxlSWQ6ICIKLSAgICAgICAgICAgICJcInt7RklMRU5BTUV9fVwiLCBhZGRQcmVmaXg6IHByZWZpeCkgfSI7CisgICAgICAgICAgICAie3tTVFJVQ1ROQU1FfX0uaWQsIGFkZFByZWZpeDogcHJlZml4KSB9IjsKICAgICAgIH0KICAgICAgIGNvZGVfICs9CiAgICAgICAgICAgInt7QUNDRVNTX1RZUEV9fSBzdGF0aWMgZnVuYyBnZXRSb290QXN7e1NIT1JUX1NUUlVDVE5BTUV9fShiYjogIgpAQCAtNDk1LDcgKzUzOCw3IEBACiAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IHJlcXVpcmVfZmllbGRzOwogICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBjcmVhdGVfZnVuY19ib2R5OwogICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBjcmVhdGVfZnVuY19oZWFkZXI7Ci0gICAgYXV0byBzaG91bGRfZ2VuZXJhdGVfY3JlYXRlID0gc3RydWN0X2RlZi5maWVsZHMudmVjLnNpemUoKSAhPSAwOworICAgIGNvbnN0IGF1dG8gc2hvdWxkX2dlbmVyYXRlX2NyZWF0ZSA9IHN0cnVjdF9kZWYuZmllbGRzLnZlYy5zaXplKCkgIT0gMDsKIAogICAgIGNvZGVfLlNldFZhbHVlKCJOVU1CRVJPRkZJRUxEUyIsIE51bVRvU3RyaW5nKHN0cnVjdF9kZWYuZmllbGRzLnZlYy5zaXplKCkpKTsKICAgICBjb2RlXyArPQpAQCAtNTU1LDE0ICs1OTgsMTIgQEAKICAgICBzdGQ6OnN0cmluZyBzcGFjaW5nID0gIiI7CiAKICAgICBpZiAoa2V5X2ZpZWxkICE9IG51bGxwdHIgJiYgIXN0cnVjdF9kZWYuZml4ZWQgJiYgc3RydWN0X2RlZi5oYXNfa2V5KSB7Ci0gICAgICBjb2RlXy5TZXRWYWx1ZSgiVkFMVUVOQU1FIiwgTmFtZVdyYXBwZWRJbk5hbWVTcGFjZShzdHJ1Y3RfZGVmKSk7Ci0gICAgICBjb2RlXy5TZXRWYWx1ZSgiU0hPUlRfVkFMVUVOQU1FIiwgTmFtZShzdHJ1Y3RfZGVmKSk7CiAgICAgICBjb2RlXy5TZXRWYWx1ZSgiVk9GRlNFVCIsIE51bVRvU3RyaW5nKGtleV9maWVsZC0+dmFsdWUub2Zmc2V0KSk7CiAKLSAgICAgIGNvZGVfICs9Ci0gICAgICAgICAgInt7QUNDRVNTX1RZUEV9fSBzdGF0aWMgZnVuYyAiCi0gICAgICAgICAgInNvcnRWZWN0b3JPZnt7U0hPUlRfVkFMVUVOQU1FfX0ob2Zmc2V0czpbT2Zmc2V0XSwgIgotICAgICAgICAgICJfIGZiYjogaW5vdXQgRmxhdEJ1ZmZlckJ1aWxkZXIpIC0+IE9mZnNldCB7IjsKKyAgICAgIGNvZGVfICs9ICJ7e0FDQ0VTU19UWVBFfX0gc3RhdGljIGZ1bmMgIiArCisgICAgICAgICAgICAgICBuYW1lcl8uTWV0aG9kKCJzb3J0X3ZlY3Rvcl9vZiIsIHN0cnVjdF9kZWYpICsKKyAgICAgICAgICAgICAgICIob2Zmc2V0czpbT2Zmc2V0XSwgIgorICAgICAgICAgICAgICAgIl8gZmJiOiBpbm91dCBGbGF0QnVmZmVyQnVpbGRlcikgLT4gT2Zmc2V0IHsiOwogICAgICAgSW5kZW50KCk7CiAgICAgICBjb2RlXyArPSBzcGFjaW5nICsgInZhciBvZmYgPSBvZmZzZXRzIjsKICAgICAgIGNvZGVfICs9CkBAIC01NzMsNyArNjE0LDcgQEAKICAgICAgIGNvZGVfICs9IHNwYWNpbmcgKyAicmV0dXJuIGZiYi5jcmVhdGVWZWN0b3Iob2ZPZmZzZXRzOiBvZmYpIjsKICAgICAgIE91dGRlbnQoKTsKICAgICAgIGNvZGVfICs9ICJ9IjsKLSAgICAgIEdlbkxvb2t1cCgqa2V5X2ZpZWxkKTsKKyAgICAgIEdlbkxvb2t1cCgqa2V5X2ZpZWxkLCBuYW1lcl8uTmFtZXNwYWNlZFR5cGUoc3RydWN0X2RlZikpOwogICAgIH0KICAgfQogCkBAIC01ODMsNDIgKzYyNCw0NCBAQAogICAgIHN0ZDo6c3RyaW5nIGJ1aWxkZXJfc3RyaW5nID0gIiwgXyBmYmI6IGlub3V0IEZsYXRCdWZmZXJCdWlsZGVyKSB7ICI7CiAgICAgYXV0byAmY3JlYXRlX2Z1bmNfYm9keSA9ICpjcmVhdGVfYm9keTsKICAgICBhdXRvICZjcmVhdGVfZnVuY19oZWFkZXIgPSAqY3JlYXRlX2hlYWRlcjsKLSAgICBhdXRvIG5hbWUgPSBOYW1lKGZpZWxkKTsKLSAgICBhdXRvIHR5cGUgPSBHZW5UeXBlKGZpZWxkLnZhbHVlLnR5cGUpOwotICAgIGF1dG8gb3B0X3NjYWxhciA9CisgICAgY29uc3QgYXV0byBmaWVsZF9maWVsZCA9IG5hbWVyXy5GaWVsZChmaWVsZCk7CisgICAgY29uc3QgYXV0byBmaWVsZF92YXIgPSBuYW1lcl8uVmFyaWFibGUoZmllbGQpOworICAgIGNvbnN0IGF1dG8gdHlwZSA9IEdlblR5cGUoZmllbGQudmFsdWUudHlwZSk7CisgICAgY29uc3QgYXV0byBvcHRfc2NhbGFyID0KICAgICAgICAgZmllbGQuSXNPcHRpb25hbCgpICYmIElzU2NhbGFyKGZpZWxkLnZhbHVlLnR5cGUuYmFzZV90eXBlKTsKLSAgICBhdXRvIG51bGxhYmxlX3R5cGUgPSBvcHRfc2NhbGFyID8gdHlwZSArICI/IiA6IHR5cGU7Ci0gICAgY29kZV8uU2V0VmFsdWUoIlZBTFVFTkFNRSIsIG5hbWUpOworICAgIGNvbnN0IGF1dG8gbnVsbGFibGVfdHlwZSA9IG9wdF9zY2FsYXIgPyB0eXBlICsgIj8iIDogdHlwZTsKKyAgICBjb2RlXy5TZXRWYWx1ZSgiRklFTERWQVIiLCBuYW1lcl8uVmFyaWFibGUoZmllbGQpKTsKICAgICBjb2RlXy5TZXRWYWx1ZSgiVkFMVUVUWVBFIiwgbnVsbGFibGVfdHlwZSk7Ci0gICAgY29kZV8uU2V0VmFsdWUoIk9GRlNFVCIsIG5hbWUpOworICAgIGNvZGVfLlNldFZhbHVlKCJPRkZTRVQiLCBuYW1lcl8uRmllbGQoZmllbGQpKTsKICAgICBjb2RlXy5TZXRWYWx1ZSgiQ09OU1RBTlQiLCBmaWVsZC52YWx1ZS5jb25zdGFudCk7CiAgICAgc3RkOjpzdHJpbmcgY2hlY2tfaWZfdmVjdG9yID0KICAgICAgICAgKElzVmVjdG9yKGZpZWxkLnZhbHVlLnR5cGUpIHx8IElzQXJyYXkoZmllbGQudmFsdWUudHlwZSkpID8gIlZlY3Rvck9mKCIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogIigiOwotICAgIGF1dG8gYm9keSA9ICJhZGQiICsgY2hlY2tfaWZfdmVjdG9yICsgbmFtZSArICI6ICI7CisgICAgY29uc3QgYXV0byBib2R5ID0gImFkZCIgKyBjaGVja19pZl92ZWN0b3IgKyBmaWVsZF9maWVsZCArICI6ICI7CiAgICAgY29kZV8gKz0gInt7QUNDRVNTX1RZUEV9fSBzdGF0aWMgZnVuYyAiICsgYm9keSArICJcXCI7CiAKLSAgICBjcmVhdGVfZnVuY19ib2R5LnB1c2hfYmFjaygie3tTVFJVQ1ROQU1FfX0uIiArIGJvZHkgKyBuYW1lICsgIiwgJmZiYikiKTsKKyAgICBjcmVhdGVfZnVuY19ib2R5LnB1c2hfYmFjaygie3tTVFJVQ1ROQU1FfX0uIiArIGJvZHkgKyBmaWVsZF9maWVsZCArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiwgJmZiYikiKTsKIAogICAgIGlmIChJc1NjYWxhcihmaWVsZC52YWx1ZS50eXBlLmJhc2VfdHlwZSkgJiYKICAgICAgICAgIUlzQm9vbChmaWVsZC52YWx1ZS50eXBlLmJhc2VfdHlwZSkpIHsKLSAgICAgIHN0ZDo6c3RyaW5nIGlzX2VudW0gPSBJc0VudW0oZmllbGQudmFsdWUudHlwZSkgPyAiLnJhd1ZhbHVlIiA6ICIiOwotICAgICAgc3RkOjpzdHJpbmcgb3B0aW9uYWxfZW51bSA9CisgICAgICBjb25zdCBzdGQ6OnN0cmluZyBpc19lbnVtID0gSXNFbnVtKGZpZWxkLnZhbHVlLnR5cGUpID8gIi5yYXdWYWx1ZSIgOiAiIjsKKyAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nIG9wdGlvbmFsX2VudW0gPQogICAgICAgICAgIElzRW51bShmaWVsZC52YWx1ZS50eXBlKSA/ICgiPyIgKyBpc19lbnVtKSA6ICIiOwogICAgICAgY29kZV8gKz0KLSAgICAgICAgICAie3tWQUxVRVRZUEV9fSIgKyBidWlsZGVyX3N0cmluZyArICJmYmIuYWRkKGVsZW1lbnQ6IHt7VkFMVUVOQU1FfX1cXCI7CisgICAgICAgICAgInt7VkFMVUVUWVBFfX0iICsgYnVpbGRlcl9zdHJpbmcgKyAiZmJiLmFkZChlbGVtZW50OiB7e0ZJRUxEVkFSfX1cXCI7CiAKICAgICAgIGNvZGVfICs9IGZpZWxkLklzT3B0aW9uYWwoKSA/IChvcHRpb25hbF9lbnVtICsgIlxcIikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IChpc19lbnVtICsgIiwgZGVmOiB7e0NPTlNUQU5UfX1cXCIpOwogCiAgICAgICBjb2RlXyArPSAiLCBhdDoge3tUQUJMRU9GRlNFVH19Lnt7T0ZGU0VUfX0ucCkgfSI7CiAKLSAgICAgIGF1dG8gZGVmYXVsdF92YWx1ZSA9CisgICAgICBjb25zdCBhdXRvIGRlZmF1bHRfdmFsdWUgPQogICAgICAgICAgIElzRW51bShmaWVsZC52YWx1ZS50eXBlKQogICAgICAgICAgICAgICA/IChmaWVsZC5Jc09wdGlvbmFsKCkgPyAibmlsIiA6IEdlbkVudW1EZWZhdWx0VmFsdWUoZmllbGQpKQogICAgICAgICAgICAgICA6IGZpZWxkLnZhbHVlLmNvbnN0YW50OwogICAgICAgY3JlYXRlX2Z1bmNfaGVhZGVyLnB1c2hfYmFjaygKLSAgICAgICAgICAiIiArIG5hbWUgKyAiOiAiICsgbnVsbGFibGVfdHlwZSArICIgPSAiICsKKyAgICAgICAgICAiIiArIGZpZWxkX2ZpZWxkICsgIjogIiArIG51bGxhYmxlX3R5cGUgKyAiID0gIiArCiAgICAgICAgICAgKGZpZWxkLklzT3B0aW9uYWwoKSA/ICJuaWwiIDogZGVmYXVsdF92YWx1ZSkpOwogICAgICAgcmV0dXJuOwogICAgIH0KQEAgLTYyOSw0OCArNjcyLDQ5IEBACiAKICAgICAgIGNvZGVfLlNldFZhbHVlKCJDT05TVEFOVCIsIGRlZmF1bHRfdmFsdWUpOwogICAgICAgY29kZV8uU2V0VmFsdWUoIlZBTFVFVFlQRSIsIGZpZWxkLklzT3B0aW9uYWwoKSA/ICJCb29sPyIgOiAiQm9vbCIpOwotICAgICAgY29kZV8gKz0gInt7VkFMVUVUWVBFfX0iICsgYnVpbGRlcl9zdHJpbmcgKwotICAgICAgICAgICAgICAgImZiYi5hZGQoZWxlbWVudDoge3tWQUxVRU5BTUV9fSxcXCI7CisgICAgICBjb2RlXyArPQorICAgICAgICAgICJ7e1ZBTFVFVFlQRX19IiArIGJ1aWxkZXJfc3RyaW5nICsgImZiYi5hZGQoZWxlbWVudDoge3tGSUVMRFZBUn19LFxcIjsKICAgICAgIGNvZGVfICs9IGZpZWxkLklzT3B0aW9uYWwoKSA/ICJcXCIgOiAiIGRlZjoge3tDT05TVEFOVH19LCI7CiAgICAgICBjb2RlXyArPSAiIGF0OiB7e1RBQkxFT0ZGU0VUfX0ue3tPRkZTRVR9fS5wKSB9IjsKICAgICAgIGNyZWF0ZV9mdW5jX2hlYWRlci5wdXNoX2JhY2soCi0gICAgICAgICAgbmFtZSArICI6ICIgKyBudWxsYWJsZV90eXBlICsgIiA9ICIgKworICAgICAgICAgIGZpZWxkX3ZhciArICI6ICIgKyBudWxsYWJsZV90eXBlICsgIiA9ICIgKwogICAgICAgICAgIChmaWVsZC5Jc09wdGlvbmFsKCkgPyAibmlsIiA6IGRlZmF1bHRfdmFsdWUpKTsKICAgICAgIHJldHVybjsKICAgICB9CiAKICAgICBpZiAoSXNTdHJ1Y3QoZmllbGQudmFsdWUudHlwZSkpIHsKLSAgICAgIGF1dG8gY3JlYXRlX3N0cnVjdCA9Ci0gICAgICAgICAgImd1YXJkIGxldCB7e1ZBTFVFTkFNRX19ID0ge3tWQUxVRU5BTUV9fSBlbHNlIHsgcmV0dXJuIH07IgotICAgICAgICAgICIgZmJiLmNyZWF0ZShzdHJ1Y3Q6IHt7VkFMVUVOQU1FfX0sIHBvc2l0aW9uOiAiCisgICAgICBjb25zdCBhdXRvIGNyZWF0ZV9zdHJ1Y3QgPQorICAgICAgICAgICJndWFyZCBsZXQge3tGSUVMRFZBUn19ID0ge3tGSUVMRFZBUn19IGVsc2UgeyByZXR1cm4gfTsiCisgICAgICAgICAgIiBmYmIuY3JlYXRlKHN0cnVjdDoge3tGSUVMRFZBUn19LCBwb3NpdGlvbjogIgogICAgICAgICAgICJ7e1RBQkxFT0ZGU0VUfX0ue3tPRkZTRVR9fS5wKSB9IjsKICAgICAgIGNvZGVfICs9IHR5cGUgKyAiPyIgKyBidWlsZGVyX3N0cmluZyArIGNyZWF0ZV9zdHJ1Y3Q7CiAgICAgICAvLy8gT3B0aW9uYWwgaGFyZCBjb2RlZCBzaW5jZSBzdHJ1Y3RzIGFyZSBhbHdheXMgb3B0aW9uYWwKLSAgICAgIGNyZWF0ZV9mdW5jX2hlYWRlci5wdXNoX2JhY2sobmFtZSArICI6ICIgKyB0eXBlICsgIj8gPSBuaWwiKTsKKyAgICAgIGNyZWF0ZV9mdW5jX2hlYWRlci5wdXNoX2JhY2soZmllbGRfdmFyICsgIjogIiArIHR5cGUgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZmllbGQuSXNPcHRpb25hbCgpID8gIj8gPSBuaWwiIDogIiIpKTsKICAgICAgIHJldHVybjsKICAgICB9CiAKLSAgICBhdXRvIGNhbWVsX2Nhc2VfbmFtZSA9Ci0gICAgICAgIENvbnZlcnRDYXNlKG5hbWUsIENhc2U6OmtMb3dlckNhbWVsKSArCisgICAgY29uc3QgYXV0byBhcmdfbGFiZWwgPQorICAgICAgICBuYW1lcl8uVmFyaWFibGUoZmllbGQpICsKICAgICAgICAgKElzVmVjdG9yKGZpZWxkLnZhbHVlLnR5cGUpIHx8IElzQXJyYXkoZmllbGQudmFsdWUudHlwZSkKICAgICAgICAgICAgICA/ICJWZWN0b3JPZmZzZXQiCiAgICAgICAgICAgICAgOiAiT2Zmc2V0Iik7Ci0gICAgY3JlYXRlX2Z1bmNfaGVhZGVyLnB1c2hfYmFjayhjYW1lbF9jYXNlX25hbWUgKyAiICIgKyBuYW1lICsgIjogIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiT2Zmc2V0ID0gT2Zmc2V0KCkiKTsKLSAgICBhdXRvIHJlYWRlcl90eXBlID0KKyAgICBjcmVhdGVfZnVuY19oZWFkZXIucHVzaF9iYWNrKGFyZ19sYWJlbCArICIgIiArIGZpZWxkX3ZhciArICI6ICIgKyAiT2Zmc2V0IiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZmllbGQuSXNSZXF1aXJlZCgpID8gIiIgOiAiID0gT2Zmc2V0KCkiKSk7CisgICAgY29uc3QgYXV0byByZWFkZXJfdHlwZSA9CiAgICAgICAgIElzU3RydWN0KGZpZWxkLnZhbHVlLnR5cGUpICYmIGZpZWxkLnZhbHVlLnR5cGUuc3RydWN0X2RlZi0+Zml4ZWQKICAgICAgICAgICAgID8gInN0cnVjdE9mZnNldDoge3tUQUJMRU9GRlNFVH19Lnt7T0ZGU0VUfX0ucCkgfSIKLSAgICAgICAgICAgIDogIm9mZnNldDoge3tWQUxVRU5BTUV9fSwgYXQ6IHt7VEFCTEVPRkZTRVR9fS57e09GRlNFVH19LnApIH0iOworICAgICAgICAgICAgOiAib2Zmc2V0OiB7e0ZJRUxEVkFSfX0sIGF0OiB7e1RBQkxFT0ZGU0VUfX0ue3tPRkZTRVR9fS5wKSB9IjsKICAgICBjb2RlXyArPSAiT2Zmc2V0IiArIGJ1aWxkZXJfc3RyaW5nICsgImZiYi5hZGQoIiArIHJlYWRlcl90eXBlOwogCi0gICAgYXV0byB2ZWN0b3J0eXBlID0gZmllbGQudmFsdWUudHlwZS5WZWN0b3JUeXBlKCk7CisgICAgY29uc3QgYXV0byB2ZWN0b3J0eXBlID0gZmllbGQudmFsdWUudHlwZS5WZWN0b3JUeXBlKCk7CiAKICAgICBpZiAoKHZlY3RvcnR5cGUuYmFzZV90eXBlID09IEJBU0VfVFlQRV9TVFJVQ1QgJiYKICAgICAgICAgIGZpZWxkLnZhbHVlLnR5cGUuc3RydWN0X2RlZi0+Zml4ZWQpICYmCiAgICAgICAgIChJc1ZlY3RvcihmaWVsZC52YWx1ZS50eXBlKSB8fCBJc0FycmF5KGZpZWxkLnZhbHVlLnR5cGUpKSkgewotICAgICAgYXV0byBmaWVsZF9uYW1lID0gTmFtZVdyYXBwZWRJbk5hbWVTcGFjZSgqdmVjdG9ydHlwZS5zdHJ1Y3RfZGVmKTsKLSAgICAgIGNvZGVfICs9ICJwdWJsaWMgc3RhdGljIGZ1bmMgc3RhcnRWZWN0b3JPZiIgKwotICAgICAgICAgICAgICAgQ29udmVydENhc2UobmFtZSwgQ2FzZTo6a1VwcGVyQ2FtZWwpICsKKyAgICAgIGNvbnN0IGF1dG8gZmllbGRfbmFtZSA9IG5hbWVyXy5OYW1lc3BhY2VkVHlwZSgqdmVjdG9ydHlwZS5zdHJ1Y3RfZGVmKTsKKyAgICAgIGNvZGVfICs9ICJ7e0FDQ0VTU19UWVBFfX0gc3RhdGljIGZ1bmMgIiArCisgICAgICAgICAgICAgICBuYW1lcl8uTWV0aG9kKCJzdGFydF92ZWN0b3Jfb2YiLCBmaWVsZF92YXIpICsKICAgICAgICAgICAgICAgICIoXyBzaXplOiBJbnQsIGluIGJ1aWxkZXI6IGlub3V0ICIKICAgICAgICAgICAgICAgICJGbGF0QnVmZmVyQnVpbGRlcikgeyI7CiAgICAgICBJbmRlbnQoKTsKQEAgLTY4NSwyNSArNzI5LDI2IEBACiAgIHZvaWQgR2VuVGFibGVSZWFkZXIoY29uc3QgU3RydWN0RGVmICZzdHJ1Y3RfZGVmKSB7CiAgICAgZm9yIChhdXRvIGl0ID0gc3RydWN0X2RlZi5maWVsZHMudmVjLmJlZ2luKCk7CiAgICAgICAgICBpdCAhPSBzdHJ1Y3RfZGVmLmZpZWxkcy52ZWMuZW5kKCk7ICsraXQpIHsKLSAgICAgIGF1dG8gJmZpZWxkID0gKippdDsKKyAgICAgIGNvbnN0IGF1dG8gJmZpZWxkID0gKippdDsKICAgICAgIGlmIChmaWVsZC5kZXByZWNhdGVkKSBjb250aW51ZTsKICAgICAgIEdlblRhYmxlUmVhZGVyRmllbGRzKGZpZWxkKTsKICAgICB9CiAgIH0KIAogICB2b2lkIEdlblRhYmxlUmVhZGVyRmllbGRzKGNvbnN0IEZpZWxkRGVmICZmaWVsZCkgewotICAgIGF1dG8gb2Zmc2V0ID0gTnVtVG9TdHJpbmcoZmllbGQudmFsdWUub2Zmc2V0KTsKLSAgICBhdXRvIG5hbWUgPSBOYW1lKGZpZWxkKTsKLSAgICBhdXRvIHR5cGUgPSBHZW5UeXBlKGZpZWxkLnZhbHVlLnR5cGUpOwotICAgIGNvZGVfLlNldFZhbHVlKCJWQUxVRU5BTUUiLCBuYW1lKTsKKyAgICBjb25zdCBhdXRvIG9mZnNldCA9IE51bVRvU3RyaW5nKGZpZWxkLnZhbHVlLm9mZnNldCk7CisgICAgY29uc3QgYXV0byBmaWVsZF9maWVsZCA9IG5hbWVyXy5GaWVsZChmaWVsZCk7CisgICAgY29uc3QgYXV0byB0eXBlID0gR2VuVHlwZShmaWVsZC52YWx1ZS50eXBlKTsKKyAgICBjb2RlXy5TZXRWYWx1ZSgiRklFTERWQVIiLCBuYW1lcl8uVmFyaWFibGUoZmllbGQpKTsKKyAgICBjb2RlXy5TZXRWYWx1ZSgiRklFTERNRVRIT0QiLCBuYW1lcl8uTWV0aG9kKGZpZWxkKSk7CiAgICAgY29kZV8uU2V0VmFsdWUoIlZBTFVFVFlQRSIsIHR5cGUpOwotICAgIGNvZGVfLlNldFZhbHVlKCJPRkZTRVQiLCBuYW1lKTsKKyAgICBjb2RlXy5TZXRWYWx1ZSgiT0ZGU0VUIiwgbmFtZXJfLkNvbnN0YW50KGZpZWxkLm5hbWUpKTsKICAgICBjb2RlXy5TZXRWYWx1ZSgiQ09OU1RBTlQiLCBmaWVsZC52YWx1ZS5jb25zdGFudCk7CiAgICAgYm9vbCBvcHRfc2NhbGFyID0KICAgICAgICAgZmllbGQuSXNPcHRpb25hbCgpICYmIElzU2NhbGFyKGZpZWxkLnZhbHVlLnR5cGUuYmFzZV90eXBlKTsKICAgICBzdGQ6OnN0cmluZyBkZWZfVmFsID0gb3B0X3NjYWxhciA/ICJuaWwiIDogInt7Q09OU1RBTlR9fSI7CiAgICAgc3RkOjpzdHJpbmcgb3B0aW9uYWwgPSBvcHRfc2NhbGFyID8gIj8iIDogIiI7Ci0gICAgYXV0byBjb25zdF9zdHJpbmcgPSAicmV0dXJuIG8gPT0gMCA/ICIgKyBkZWZfVmFsICsgIiA6ICI7CisgICAgY29uc3QgYXV0byBjb25zdF9zdHJpbmcgPSAicmV0dXJuIG8gPT0gMCA/ICIgKyBkZWZfVmFsICsgIiA6ICI7CiAgICAgR2VuQ29tbWVudChmaWVsZC5kb2NfY29tbWVudCk7CiAgICAgaWYgKElzU2NhbGFyKGZpZWxkLnZhbHVlLnR5cGUuYmFzZV90eXBlKSAmJiAhSXNFbnVtKGZpZWxkLnZhbHVlLnR5cGUpICYmCiAgICAgICAgICFJc0Jvb2woZmllbGQudmFsdWUudHlwZS5iYXNlX3R5cGUpKSB7CkBAIC03MjgsNyArNzczLDcgQEAKICAgICB9CiAKICAgICBpZiAoSXNFbnVtKGZpZWxkLnZhbHVlLnR5cGUpKSB7Ci0gICAgICBhdXRvIGRlZmF1bHRfdmFsdWUgPQorICAgICAgY29uc3QgYXV0byBkZWZhdWx0X3ZhbHVlID0KICAgICAgICAgICBmaWVsZC5Jc09wdGlvbmFsKCkgPyAibmlsIiA6IEdlbkVudW1EZWZhdWx0VmFsdWUoZmllbGQpOwogICAgICAgY29kZV8uU2V0VmFsdWUoIkJBU0VWQUxVRSIsIEdlblR5cGVCYXNpYyhmaWVsZC52YWx1ZS50eXBlLCBmYWxzZSkpOwogICAgICAgY29kZV8gKz0gR2VuUmVhZGVyTWFpbkJvZHkob3B0aW9uYWwpICsgIlxcIjsKQEAgLTczOSwxNiArNzg0LDE1IEBACiAgICAgICByZXR1cm47CiAgICAgfQogCi0gICAgc3RkOjpzdHJpbmcgaXNfcmVxdWlyZWQgPSBmaWVsZC5Jc1JlcXVpcmVkKCkgPyAiISIgOiAiPyI7Ci0gICAgYXV0byByZXF1aXJlZF9yZWFkZXIgPSBmaWVsZC5Jc1JlcXVpcmVkKCkgPyAicmV0dXJuICIgOiBjb25zdF9zdHJpbmc7CisgICAgY29uc3Qgc3RkOjpzdHJpbmcgaXNfcmVxdWlyZWQgPSBmaWVsZC5Jc1JlcXVpcmVkKCkgPyAiISIgOiAiPyI7CisgICAgY29uc3QgYXV0byByZXF1aXJlZF9yZWFkZXIgPSBmaWVsZC5Jc1JlcXVpcmVkKCkgPyAicmV0dXJuICIgOiBjb25zdF9zdHJpbmc7CiAKICAgICBpZiAoSXNTdHJ1Y3QoZmllbGQudmFsdWUudHlwZSkgJiYgZmllbGQudmFsdWUudHlwZS5zdHJ1Y3RfZGVmLT5maXhlZCkgewogICAgICAgY29kZV8uU2V0VmFsdWUoIlZBTFVFVFlQRSIsIEdlblR5cGUoZmllbGQudmFsdWUudHlwZSkpOwogICAgICAgY29kZV8uU2V0VmFsdWUoIkNPTlNUQU5UIiwgIm5pbCIpOwogICAgICAgY29kZV8gKz0gR2VuUmVhZGVyTWFpbkJvZHkoaXNfcmVxdWlyZWQpICsgR2VuT2Zmc2V0KCkgKyByZXF1aXJlZF9yZWFkZXIgKwogICAgICAgICAgICAgICAgInt7QUNDRVNTfX0ucmVhZEJ1ZmZlcihvZjoge3tWQUxVRVRZUEV9fS5zZWxmLCBhdDogbykgfSI7Ci0gICAgICBjb2RlXy5TZXRWYWx1ZSgiVkFMVUVOQU1FIiwKLSAgICAgICAgICAgICAgICAgICAgICJtdXRhYmxlIiArIENvbnZlcnRDYXNlKG5hbWUsIENhc2U6OmtVcHBlckNhbWVsKSk7CisgICAgICBjb2RlXy5TZXRWYWx1ZSgiRklFTERWQVIiLCBuYW1lcl8uVmFyaWFibGUoIm11dGFibGUiLCBmaWVsZF9maWVsZCkpOwogICAgICAgY29kZV8uU2V0VmFsdWUoIlZBTFVFVFlQRSIsIEdlblR5cGUoZmllbGQudmFsdWUudHlwZSkgKyBNdXRhYmxlKCkpOwogICAgICAgY29kZV8uU2V0VmFsdWUoIkNPTlNUQU5UIiwgIm5pbCIpOwogICAgICAgY29kZV8gKz0gR2VuUmVhZGVyTWFpbkJvZHkoaXNfcmVxdWlyZWQpICsgR2VuT2Zmc2V0KCkgKyByZXF1aXJlZF9yZWFkZXIgKwpAQCAtNzY1LDEyICs4MDksMTIgQEAKICAgICAgICAgYnJlYWs7CiAKICAgICAgIGNhc2UgQkFTRV9UWVBFX1NUUklORzogewotICAgICAgICBhdXRvIGRlZmF1bHRfc3RyaW5nID0gIlwiIiArIGZpZWxkLnZhbHVlLmNvbnN0YW50ICsgIlwiIjsKKyAgICAgICAgY29uc3QgYXV0byBkZWZhdWx0X3N0cmluZyA9ICJcIiIgKyBmaWVsZC52YWx1ZS5jb25zdGFudCArICJcIiI7CiAgICAgICAgIGNvZGVfLlNldFZhbHVlKCJWQUxVRVRZUEUiLCBHZW5UeXBlKGZpZWxkLnZhbHVlLnR5cGUpKTsKICAgICAgICAgY29kZV8uU2V0VmFsdWUoIkNPTlNUQU5UIiwgZmllbGQuSXNEZWZhdWx0KCkgPyBkZWZhdWx0X3N0cmluZyA6ICJuaWwiKTsKICAgICAgICAgY29kZV8gKz0gR2VuUmVhZGVyTWFpbkJvZHkoaXNfcmVxdWlyZWQpICsgR2VuT2Zmc2V0KCkgKwogICAgICAgICAgICAgICAgICByZXF1aXJlZF9yZWFkZXIgKyAie3tBQ0NFU1N9fS5zdHJpbmcoYXQ6IG8pIH0iOwotICAgICAgICBjb2RlXyArPSAie3tBQ0NFU1NfVFlQRX19IHZhciB7e1ZBTFVFTkFNRX19U2VnbWVudEFycmF5OiBbVUludDhdIiArCisgICAgICAgIGNvZGVfICs9ICJ7e0FDQ0VTU19UWVBFfX0gdmFyIHt7RklFTERWQVJ9fVNlZ21lbnRBcnJheTogW1VJbnQ4XSIgKwogICAgICAgICAgICAgICAgICBpc19yZXF1aXJlZCArCiAgICAgICAgICAgICAgICAgICIgeyByZXR1cm4gIgogICAgICAgICAgICAgICAgICAie3tBQ0NFU1N9fS5nZXRWZWN0b3IoYXQ6IHt7VEFCTEVPRkZTRVR9fS57e09GRlNFVH19LnYpIH0iOwpAQCAtNzgxLDcgKzgyNSw3IEBACiAgICAgICBjYXNlIEJBU0VfVFlQRV9VTklPTjoKICAgICAgICAgY29kZV8uU2V0VmFsdWUoIkNPTlNUQU5UIiwgIm5pbCIpOwogICAgICAgICBjb2RlXyArPQotICAgICAgICAgICAgInt7QUNDRVNTX1RZUEV9fSBmdW5jIHt7VkFMVUVOQU1FfX08VDogIgorICAgICAgICAgICAgInt7QUNDRVNTX1RZUEV9fSBmdW5jIHt7RklFTERWQVJ9fTxUOiAiCiAgICAgICAgICAgICAiRmxhdGJ1ZmZlcnNJbml0aWFsaXphYmxlPih0eXBlOiAiCiAgICAgICAgICAgICAiVC5UeXBlKSAtPiBUIiArCiAgICAgICAgICAgICBpc19yZXF1aXJlZCArICIgeyAiICsgR2VuT2Zmc2V0KCkgKyByZXF1aXJlZF9yZWFkZXIgKwpAQCAtNzkzLDIwICs4MzcsMjIgQEAKIAogICB2b2lkIEdlblRhYmxlUmVhZGVyVmVjdG9yRmllbGRzKGNvbnN0IEZpZWxkRGVmICZmaWVsZCkgewogICAgIHN0ZDo6c3RyaW5nIGNvbnN0X3N0cmluZyA9ICJyZXR1cm4gbyA9PSAwID8ge3tDT05TVEFOVH19IDogIjsKLSAgICBhdXRvIHZlY3RvcnR5cGUgPSBmaWVsZC52YWx1ZS50eXBlLlZlY3RvclR5cGUoKTsKKyAgICBjb25zdCBhdXRvIHZlY3RvcnR5cGUgPSBmaWVsZC52YWx1ZS50eXBlLlZlY3RvclR5cGUoKTsKICAgICBjb2RlXy5TZXRWYWx1ZSgiU0laRSIsIE51bVRvU3RyaW5nKElubGluZVNpemUodmVjdG9ydHlwZSkpKTsKLSAgICBjb2RlXyArPSAie3tBQ0NFU1NfVFlQRX19IHZhciB7e1ZBTFVFTkFNRX19Q291bnQ6IEludDMyIHsgIiArIEdlbk9mZnNldCgpICsKKyAgICBjb2RlXy5TZXRWYWx1ZSgiSEFTX0ZJRUxEVkFSIiwgbmFtZXJfLlZhcmlhYmxlKCJoYXMiLCBmaWVsZCkpOworICAgIGNvZGVfICs9ICJ7e0FDQ0VTU19UWVBFfX0gdmFyIHt7SEFTX0ZJRUxEVkFSfX06IEJvb2wgeyAiICsgR2VuT2Zmc2V0KCkgKworICAgICAgICAgICAgICJyZXR1cm4gbyA9PSAwID8gZmFsc2UgOiB0cnVlIH0iOworICAgIGNvZGVfICs9ICJ7e0FDQ0VTU19UWVBFfX0gdmFyIHt7RklFTERWQVJ9fUNvdW50OiBJbnQzMiB7ICIgKyBHZW5PZmZzZXQoKSArCiAgICAgICAgICAgICAgInJldHVybiBvID09IDAgPyAwIDoge3tBQ0NFU1N9fS52ZWN0b3IoY291bnQ6IG8pIH0iOwotICAgIGNvZGVfLlNldFZhbHVlKCJDT05TVEFOVCIsCi0gICAgICAgICAgICAgICAgICAgSXNTY2FsYXIodmVjdG9ydHlwZS5iYXNlX3R5cGUpID09IHRydWUgPyAiMCIgOiAibmlsIik7Ci0gICAgYXV0byBudWxsYWJsZSA9IElzU2NhbGFyKHZlY3RvcnR5cGUuYmFzZV90eXBlKSA9PSB0cnVlID8gIiIgOiAiPyI7Ci0gICAgbnVsbGFibGUgPSBJc0VudW0odmVjdG9ydHlwZSkgPT0gdHJ1ZSA/ICI/IiA6IG51bGxhYmxlOworICAgIGNvZGVfLlNldFZhbHVlKCJDT05TVEFOVCIsIElzU2NhbGFyKHZlY3RvcnR5cGUuYmFzZV90eXBlKSA/ICIwIiA6ICJuaWwiKTsKKyAgICBjb25zdCBhdXRvIG51bGxhYmxlID0KKyAgICAgICAgSXNTY2FsYXIodmVjdG9ydHlwZS5iYXNlX3R5cGUpICYmICFJc0VudW0odmVjdG9ydHlwZSkgPyAiIiA6ICI/IjsKIAogICAgIGlmICh2ZWN0b3J0eXBlLmJhc2VfdHlwZSAhPSBCQVNFX1RZUEVfVU5JT04pIHsKICAgICAgIGNvZGVfICs9IEdlbkFycmF5TWFpbkJvZHkobnVsbGFibGUpICsgR2VuT2Zmc2V0KCkgKyAiXFwiOwogICAgIH0gZWxzZSB7CiAgICAgICBjb2RlXyArPQotICAgICAgICAgICJ7e0FDQ0VTU19UWVBFfX0gZnVuYyB7e1ZBTFVFTkFNRX19PFQ6IEZsYXRidWZmZXJzSW5pdGlhbGl6YWJsZT4oYXQgIgorICAgICAgICAgICJ7e0FDQ0VTU19UWVBFfX0gZnVuYyB7e0ZJRUxEVkFSfX08VDogRmxhdGJ1ZmZlcnNJbml0aWFsaXphYmxlPihhdCAiCiAgICAgICAgICAgImluZGV4OiAiCiAgICAgICAgICAgIkludDMyLCB0eXBlOiBULlR5cGUpIC0+IFQ/IHsgIiArCiAgICAgICAgICAgR2VuT2Zmc2V0KCkgKyAiXFwiOwpAQCAtODI1LDcgKzg3MSw3IEBACiAgICAgICAgICAgInt7QUNDRVNTfX0uZGlyZWN0UmVhZChvZjoge3tWQUxVRVRZUEV9fS5zZWxmLCBvZmZzZXQ6ICIKICAgICAgICAgICAie3tBQ0NFU1N9fS52ZWN0b3IoYXQ6IG8pICsgaW5kZXggKiB7e1NJWkV9fSkgfSI7CiAgICAgICBjb2RlXyArPQotICAgICAgICAgICJ7e0FDQ0VTU19UWVBFfX0gdmFyIHt7VkFMVUVOQU1FfX06IFt7e1ZBTFVFVFlQRX19XSB7IHJldHVybiAiCisgICAgICAgICAgInt7QUNDRVNTX1RZUEV9fSB2YXIge3tGSUVMRFZBUn19OiBbe3tWQUxVRVRZUEV9fV0geyByZXR1cm4gIgogICAgICAgICAgICJ7e0FDQ0VTU319LmdldFZlY3RvcihhdDoge3tUQUJMRU9GRlNFVH19Lnt7T0ZGU0VUfX0udikgPz8gW10gfSI7CiAgICAgICBpZiAocGFyc2VyXy5vcHRzLm11dGFibGVfYnVmZmVyKSBjb2RlXyArPSBHZW5NdXRhdGVBcnJheSgpOwogICAgICAgcmV0dXJuOwpAQCAtODM2LDggKzg4Miw3IEBACiAgICAgICBjb2RlXyArPQogICAgICAgICAgICJ7e0FDQ0VTU319LmRpcmVjdFJlYWQob2Y6IHt7VkFMVUVUWVBFfX0uc2VsZiwgb2Zmc2V0OiAiCiAgICAgICAgICAgInt7QUNDRVNTfX0udmVjdG9yKGF0OiBvKSArIGluZGV4ICoge3tTSVpFfX0pIH0iOwotICAgICAgY29kZV8uU2V0VmFsdWUoIlZBTFVFTkFNRSIsCi0gICAgICAgICAgICAgICAgICAgICAibXV0YWJsZSIgKyBDb252ZXJ0Q2FzZShOYW1lKGZpZWxkKSwgQ2FzZTo6a1VwcGVyQ2FtZWwpKTsKKyAgICAgIGNvZGVfLlNldFZhbHVlKCJGSUVMRE1FVEhPRCIsIG5hbWVyXy5NZXRob2QoIm11dGFibGUiLCBmaWVsZCkpOwogICAgICAgY29kZV8uU2V0VmFsdWUoIlZBTFVFVFlQRSIsIEdlblR5cGUoZmllbGQudmFsdWUudHlwZSkgKyBNdXRhYmxlKCkpOwogICAgICAgY29kZV8gKz0gR2VuQXJyYXlNYWluQm9keShudWxsYWJsZSkgKyBHZW5PZmZzZXQoKSArIGNvbnN0X3N0cmluZyArCiAgICAgICAgICAgICAgICBHZW5Db25zdHJ1Y3Rvcigie3tBQ0NFU1N9fS52ZWN0b3IoYXQ6IG8pICsgaW5kZXggKiB7e1NJWkV9fSIpOwpAQCAtODcyLDEwICs5MTcsMTAgQEAKICAgICAgIGNvZGVfICs9IEdlbkNvbnN0cnVjdG9yKAogICAgICAgICAgICJ7e0FDQ0VTU319LmluZGlyZWN0KHt7QUNDRVNTfX0udmVjdG9yKGF0OiBvKSArIGluZGV4ICogIgogICAgICAgICAgICJ7e1NJWkV9fSkiKTsKLSAgICAgIGF1dG8gJnNkID0gKmZpZWxkLnZhbHVlLnR5cGUuc3RydWN0X2RlZjsKLSAgICAgIGF1dG8gJmZpZWxkcyA9IHNkLmZpZWxkcy52ZWM7CisgICAgICBjb25zdCBhdXRvICZzZCA9ICpmaWVsZC52YWx1ZS50eXBlLnN0cnVjdF9kZWY7CisgICAgICBjb25zdCBhdXRvICZmaWVsZHMgPSBzZC5maWVsZHMudmVjOwogICAgICAgZm9yIChhdXRvIGtpdCA9IGZpZWxkcy5iZWdpbigpOyBraXQgIT0gZmllbGRzLmVuZCgpOyArK2tpdCkgewotICAgICAgICBhdXRvICZrZXlfZmllbGQgPSAqKmtpdDsKKyAgICAgICAgY29uc3QgYXV0byAma2V5X2ZpZWxkID0gKipraXQ7CiAgICAgICAgIGlmIChrZXlfZmllbGQua2V5KSB7CiAgICAgICAgICAgR2VuQnlLZXlGdW5jdGlvbnMoa2V5X2ZpZWxkKTsKICAgICAgICAgICBicmVhazsKQEAgLTg4OSwxMyArOTM0LDEyIEBACiAgICAgSW5kZW50KCk7CiAgICAgZm9yIChhdXRvIGl0ID0gc3RydWN0X2RlZi5maWVsZHMudmVjLmJlZ2luKCk7CiAgICAgICAgICBpdCAhPSBzdHJ1Y3RfZGVmLmZpZWxkcy52ZWMuZW5kKCk7ICsraXQpIHsKLSAgICAgIGF1dG8gJmZpZWxkID0gKippdDsKKyAgICAgIGNvbnN0IGF1dG8gJmZpZWxkID0gKippdDsKICAgICAgIGlmIChmaWVsZC5kZXByZWNhdGVkKSBjb250aW51ZTsKLSAgICAgIGF1dG8gbmFtZSA9IE5hbWUoZmllbGQpOwogCiAgICAgICBjb2RlXy5TZXRWYWx1ZSgiUkFXVkFMVUVOQU1FIiwgZmllbGQubmFtZSk7Ci0gICAgICBjb2RlXy5TZXRWYWx1ZSgiVkFMVUVOQU1FIiwgbmFtZSk7Ci0gICAgICBjb2RlXyArPSAiY2FzZSB7e1ZBTFVFTkFNRX19ID0gXCJ7e1JBV1ZBTFVFTkFNRX19XCIiOworICAgICAgY29kZV8uU2V0VmFsdWUoIkZJRUxEVkFSIiwgbmFtZXJfLlZhcmlhYmxlKGZpZWxkKSk7CisgICAgICBjb2RlXyArPSAiY2FzZSB7e0ZJRUxEVkFSfX0gPSBcInt7UkFXVkFMVUVOQU1FfX1cIiI7CiAgICAgfQogICAgIE91dGRlbnQoKTsKICAgICBjb2RlXyArPSAifSI7CkBAIC05MDMsOCArOTQ3LDggQEAKIAogICB2b2lkIEdlbmVyYXRlRW5jb2RlclVuaW9uQm9keShjb25zdCBGaWVsZERlZiAmZmllbGQpIHsKICAgICBFbnVtRGVmICZ1bmlvbl9kZWYgPSAqZmllbGQudmFsdWUudHlwZS5lbnVtX2RlZjsKLSAgICBhdXRvIGlzX3ZlY3RvciA9IGZpZWxkLnZhbHVlLnR5cGUuYmFzZV90eXBlID09IEJBU0VfVFlQRV9WRUNUT1IgfHwKLSAgICAgICAgICAgICAgICAgICAgIGZpZWxkLnZhbHVlLnR5cGUuYmFzZV90eXBlID09IEJBU0VfVFlQRV9BUlJBWTsKKyAgICBjb25zdCBhdXRvIGlzX3ZlY3RvciA9IGZpZWxkLnZhbHVlLnR5cGUuYmFzZV90eXBlID09IEJBU0VfVFlQRV9WRUNUT1IgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkLnZhbHVlLnR5cGUuYmFzZV90eXBlID09IEJBU0VfVFlQRV9BUlJBWTsKICAgICBpZiAoZmllbGQudmFsdWUudHlwZS5iYXNlX3R5cGUgPT0gQkFTRV9UWVBFX1VUWVBFIHx8CiAgICAgICAgIChpc192ZWN0b3IgJiYKICAgICAgICAgIGZpZWxkLnZhbHVlLnR5cGUuVmVjdG9yVHlwZSgpLmJhc2VfdHlwZSA9PSBCQVNFX1RZUEVfVVRZUEUpKQpAQCAtOTEyLDI4ICs5NTYsMjUgQEAKICAgICBpZiAoaXNfdmVjdG9yKSB7CiAgICAgICBjb2RlXyArPQogICAgICAgICAgICJ2YXIgZW51bXNFbmNvZGVyID0gY29udGFpbmVyLm5lc3RlZFVua2V5ZWRDb250YWluZXIoZm9yS2V5OiAiCi0gICAgICAgICAgIi57e1ZBTFVFTkFNRX19VHlwZSkiOworICAgICAgICAgICIue3tGSUVMRFZBUn19VHlwZSkiOwogICAgICAgY29kZV8gKz0KICAgICAgICAgICAidmFyIGNvbnRlbnRFbmNvZGVyID0gY29udGFpbmVyLm5lc3RlZFVua2V5ZWRDb250YWluZXIoZm9yS2V5OiAiCi0gICAgICAgICAgIi57e1ZBTFVFTkFNRX19KSI7Ci0gICAgICBjb2RlXyArPSAiZm9yIGluZGV4IGluIDAuLjx7e1ZBTFVFTkFNRX19Q291bnQgeyI7CisgICAgICAgICAgIi57e0ZJRUxEVkFSfX0pIjsKKyAgICAgIGNvZGVfICs9ICJmb3IgaW5kZXggaW4gMC4uPHt7RklFTERWQVJ9fUNvdW50IHsiOwogICAgICAgSW5kZW50KCk7Ci0gICAgICBjb2RlXyArPQotICAgICAgICAgICJndWFyZCBsZXQgdHlwZSA9IHt7VkFMVUVOQU1FfX1UeXBlKGF0OiBpbmRleCkgZWxzZSB7IGNvbnRpbnVlIH0iOworICAgICAgY29kZV8gKz0gImd1YXJkIGxldCB0eXBlID0ge3tGSUVMRFZBUn19VHlwZShhdDogaW5kZXgpIGVsc2UgeyBjb250aW51ZSB9IjsKICAgICAgIGNvZGVfICs9ICJ0cnkgZW51bXNFbmNvZGVyLmVuY29kZSh0eXBlKSI7CiAgICAgICBjb2RlXyArPSAic3dpdGNoIHR5cGUgeyI7CiAgICAgICBmb3IgKGF1dG8gaXQgPSB1bmlvbl9kZWYuVmFscygpLmJlZ2luKCk7IGl0ICE9IHVuaW9uX2RlZi5WYWxzKCkuZW5kKCk7CiAgICAgICAgICAgICsraXQpIHsKICAgICAgICAgY29uc3QgYXV0byAmZXYgPSAqKml0OwotCi0gICAgICAgIGF1dG8gbmFtZSA9IE5hbWUoZXYpOwotICAgICAgICBhdXRvIHR5cGUgPSBHZW5UeXBlKGV2LnVuaW9uX3R5cGUpOwotICAgICAgICBjb2RlXy5TZXRWYWx1ZSgiS0VZIiwgbmFtZSk7CisgICAgICAgIGNvbnN0IGF1dG8gdHlwZSA9IEdlblR5cGUoZXYudW5pb25fdHlwZSk7CisgICAgICAgIGNvZGVfLlNldFZhbHVlKCJLRVkiLCBuYW1lcl8uTGVnYWN5U3dpZnRWYXJpYW50KGV2KSk7CiAgICAgICAgIGNvZGVfLlNldFZhbHVlKCJWQUxVRVRZUEUiLCB0eXBlKTsKICAgICAgICAgaWYgKGV2LnVuaW9uX3R5cGUuYmFzZV90eXBlID09IEJBU0VfVFlQRV9OT05FKSB7IGNvbnRpbnVlOyB9CiAgICAgICAgIGNvZGVfICs9ICJjYXNlIC57e0tFWX19OiI7CiAgICAgICAgIEluZGVudCgpOwotICAgICAgICBjb2RlXyArPSAibGV0IF92ID0ge3tWQUxVRU5BTUV9fShhdDogaW5kZXgsIHR5cGU6IHt7VkFMVUVUWVBFfX0uc2VsZikiOworICAgICAgICBjb2RlXyArPSAibGV0IF92ID0ge3tGSUVMRFZBUn19KGF0OiBpbmRleCwgdHlwZToge3tWQUxVRVRZUEV9fS5zZWxmKSI7CiAgICAgICAgIGNvZGVfICs9ICJ0cnkgY29udGVudEVuY29kZXIuZW5jb2RlKF92KSI7CiAgICAgICAgIE91dGRlbnQoKTsKICAgICAgIH0KQEAgLTk0NCwyMCArOTg1LDE4IEBACiAgICAgICByZXR1cm47CiAgICAgfQogCi0gICAgY29kZV8gKz0gInN3aXRjaCB7e1ZBTFVFTkFNRX19VHlwZSB7IjsKKyAgICBjb2RlXyArPSAic3dpdGNoIHt7RklFTERWQVJ9fVR5cGUgeyI7CiAgICAgZm9yIChhdXRvIGl0ID0gdW5pb25fZGVmLlZhbHMoKS5iZWdpbigpOyBpdCAhPSB1bmlvbl9kZWYuVmFscygpLmVuZCgpOwogICAgICAgICAgKytpdCkgewogICAgICAgY29uc3QgYXV0byAmZXYgPSAqKml0OwotCi0gICAgICBhdXRvIG5hbWUgPSBOYW1lKGV2KTsKLSAgICAgIGF1dG8gdHlwZSA9IEdlblR5cGUoZXYudW5pb25fdHlwZSk7Ci0gICAgICBjb2RlXy5TZXRWYWx1ZSgiS0VZIiwgbmFtZSk7CisgICAgICBjb25zdCBhdXRvIHR5cGUgPSBHZW5UeXBlKGV2LnVuaW9uX3R5cGUpOworICAgICAgY29kZV8uU2V0VmFsdWUoIktFWSIsIG5hbWVyXy5MZWdhY3lTd2lmdFZhcmlhbnQoZXYpKTsKICAgICAgIGNvZGVfLlNldFZhbHVlKCJWQUxVRVRZUEUiLCB0eXBlKTsKICAgICAgIGlmIChldi51bmlvbl90eXBlLmJhc2VfdHlwZSA9PSBCQVNFX1RZUEVfTk9ORSkgeyBjb250aW51ZTsgfQogICAgICAgY29kZV8gKz0gImNhc2UgLnt7S0VZfX06IjsKICAgICAgIEluZGVudCgpOwotICAgICAgY29kZV8gKz0gImxldCBfdiA9IHt7VkFMVUVOQU1FfX0odHlwZToge3tWQUxVRVRZUEV9fS5zZWxmKSI7Ci0gICAgICBjb2RlXyArPSAidHJ5IGNvbnRhaW5lci5lbmNvZGVJZlByZXNlbnQoX3YsIGZvcktleTogLnt7VkFMVUVOQU1FfX0pIjsKKyAgICAgIGNvZGVfICs9ICJsZXQgX3YgPSB7e0ZJRUxEVkFSfX0odHlwZToge3tWQUxVRVRZUEV9fS5zZWxmKSI7CisgICAgICBjb2RlXyArPSAidHJ5IGNvbnRhaW5lci5lbmNvZGVJZlByZXNlbnQoX3YsIGZvcktleTogLnt7RklFTERWQVJ9fSkiOwogICAgICAgT3V0ZGVudCgpOwogICAgIH0KICAgICBjb2RlXyArPSAiZGVmYXVsdDogYnJlYWs7IjsKQEAgLTk2OCwzMyArMTAwNywzMSBAQAogICAgIGNvZGVfICs9ICJ2YXIgY29udGFpbmVyID0gZW5jb2Rlci5jb250YWluZXIoa2V5ZWRCeTogQ29kaW5nS2V5cy5zZWxmKSI7CiAgICAgZm9yIChhdXRvIGl0ID0gc3RydWN0X2RlZi5maWVsZHMudmVjLmJlZ2luKCk7CiAgICAgICAgICBpdCAhPSBzdHJ1Y3RfZGVmLmZpZWxkcy52ZWMuZW5kKCk7ICsraXQpIHsKLSAgICAgIGF1dG8gJmZpZWxkID0gKippdDsKKyAgICAgIGNvbnN0IGF1dG8gJmZpZWxkID0gKippdDsKICAgICAgIGlmIChmaWVsZC5kZXByZWNhdGVkKSBjb250aW51ZTsKLSAgICAgIGF1dG8gbmFtZSA9IE5hbWUoZmllbGQpOwotICAgICAgYXV0byB0eXBlID0gZmllbGQudmFsdWUudHlwZTsKKyAgICAgIGNvbnN0IGF1dG8gdHlwZSA9IGZpZWxkLnZhbHVlLnR5cGU7CiAKLSAgICAgIGF1dG8gaXNfbm9uX3VuaW9uX3ZlY3RvciA9CisgICAgICBjb25zdCBhdXRvIGlzX25vbl91bmlvbl92ZWN0b3IgPQogICAgICAgICAgIChmaWVsZC52YWx1ZS50eXBlLmJhc2VfdHlwZSA9PSBCQVNFX1RZUEVfQVJSQVkgfHwKICAgICAgICAgICAgZmllbGQudmFsdWUudHlwZS5iYXNlX3R5cGUgPT0gQkFTRV9UWVBFX1ZFQ1RPUikgJiYKICAgICAgICAgICBmaWVsZC52YWx1ZS50eXBlLlZlY3RvclR5cGUoKS5iYXNlX3R5cGUgIT0gQkFTRV9UWVBFX1VUWVBFOwogCi0gICAgICBjb2RlXy5TZXRWYWx1ZSgiUkFXVkFMVUVOQU1FIiwgZmllbGQubmFtZSk7Ci0gICAgICBjb2RlXy5TZXRWYWx1ZSgiVkFMVUVOQU1FIiwgbmFtZSk7CisgICAgICBjb2RlXy5TZXRWYWx1ZSgiRklFTERWQVIiLCBuYW1lcl8uVmFyaWFibGUoZmllbGQpKTsKICAgICAgIGNvZGVfLlNldFZhbHVlKCJDT05TVEFOVCIsIGZpZWxkLnZhbHVlLmNvbnN0YW50KTsKICAgICAgIGJvb2wgc2hvdWxkX2luZGVudCA9IHRydWU7CiAgICAgICBpZiAoaXNfbm9uX3VuaW9uX3ZlY3RvcikgewotICAgICAgICBjb2RlXyArPSAiaWYge3tWQUxVRU5BTUV9fUNvdW50ID4gMCB7IjsKKyAgICAgICAgY29kZV8gKz0gImlmIHt7RklFTERWQVJ9fUNvdW50ID4gMCB7IjsKICAgICAgIH0gZWxzZSBpZiAoSXNFbnVtKHR5cGUpICYmICFmaWVsZC5Jc09wdGlvbmFsKCkpIHsKICAgICAgICAgY29kZV8uU2V0VmFsdWUoIkNPTlNUQU5UIiwgR2VuRW51bURlZmF1bHRWYWx1ZShmaWVsZCkpOwotICAgICAgICBjb2RlXyArPSAiaWYge3tWQUxVRU5BTUV9fSAhPSB7e0NPTlNUQU5UfX0geyI7CisgICAgICAgIGNvZGVfICs9ICJpZiB7e0ZJRUxEVkFSfX0gIT0ge3tDT05TVEFOVH19IHsiOwogICAgICAgfSBlbHNlIGlmIChJc1NjYWxhcih0eXBlLmJhc2VfdHlwZSkgJiYgIUlzRW51bSh0eXBlKSAmJgogICAgICAgICAgICAgICAgICAhSXNCb29sKHR5cGUuYmFzZV90eXBlKSAmJiAhZmllbGQuSXNPcHRpb25hbCgpKSB7Ci0gICAgICAgIGNvZGVfICs9ICJpZiB7e1ZBTFVFTkFNRX19ICE9IHt7Q09OU1RBTlR9fSB7IjsKKyAgICAgICAgY29kZV8gKz0gImlmIHt7RklFTERWQVJ9fSAhPSB7e0NPTlNUQU5UfX0geyI7CiAgICAgICB9IGVsc2UgaWYgKElzQm9vbCh0eXBlLmJhc2VfdHlwZSkgJiYgIWZpZWxkLklzT3B0aW9uYWwoKSkgewogICAgICAgICBzdGQ6OnN0cmluZyBkZWZhdWx0X3ZhbHVlID0KICAgICAgICAgICAgICIwIiA9PSBmaWVsZC52YWx1ZS5jb25zdGFudCA/ICJmYWxzZSIgOiAidHJ1ZSI7CiAgICAgICAgIGNvZGVfLlNldFZhbHVlKCJDT05TVEFOVCIsIGRlZmF1bHRfdmFsdWUpOwotICAgICAgICBjb2RlXyArPSAiaWYge3tWQUxVRU5BTUV9fSAhPSB7e0NPTlNUQU5UfX0geyI7CisgICAgICAgIGNvZGVfICs9ICJpZiB7e0ZJRUxEVkFSfX0gIT0ge3tDT05TVEFOVH19IHsiOwogICAgICAgfSBlbHNlIHsKICAgICAgICAgc2hvdWxkX2luZGVudCA9IGZhbHNlOwogICAgICAgfQpAQCAtMTAwNywxNyArMTA0NCwxNyBAQAogICAgICAgICAgICAgICAgICAgSXNFbnVtKHR5cGUuVmVjdG9yVHlwZSgpKSkpIHsKICAgICAgICAgY29kZV8gKz0KICAgICAgICAgICAgICJ2YXIgY29udGVudEVuY29kZXIgPSBjb250YWluZXIubmVzdGVkVW5rZXllZENvbnRhaW5lcihmb3JLZXk6ICIKLSAgICAgICAgICAgICIue3tWQUxVRU5BTUV9fSkiOwotICAgICAgICBjb2RlXyArPSAiZm9yIGluZGV4IGluIDAuLjx7e1ZBTFVFTkFNRX19Q291bnQgeyI7CisgICAgICAgICAgICAiLnt7RklFTERWQVJ9fSkiOworICAgICAgICBjb2RlXyArPSAiZm9yIGluZGV4IGluIDAuLjx7e0ZJRUxEVkFSfX1Db3VudCB7IjsKICAgICAgICAgSW5kZW50KCk7Ci0gICAgICAgIGNvZGVfICs9ICJndWFyZCBsZXQgdHlwZSA9IHt7VkFMVUVOQU1FfX0oYXQ6IGluZGV4KSBlbHNlIHsgY29udGludWUgfSI7CisgICAgICAgIGNvZGVfICs9ICJndWFyZCBsZXQgdHlwZSA9IHt7RklFTERWQVJ9fShhdDogaW5kZXgpIGVsc2UgeyBjb250aW51ZSB9IjsKICAgICAgICAgY29kZV8gKz0gInRyeSBjb250ZW50RW5jb2Rlci5lbmNvZGUodHlwZSkiOwogICAgICAgICBPdXRkZW50KCk7CiAgICAgICAgIGNvZGVfICs9ICJ9IjsKICAgICAgIH0gZWxzZSB7CiAgICAgICAgIGNvZGVfICs9Ci0gICAgICAgICAgICAidHJ5IGNvbnRhaW5lci5lbmNvZGVJZlByZXNlbnQoe3tWQUxVRU5BTUV9fSwgZm9yS2V5OiAiCi0gICAgICAgICAgICAiLnt7VkFMVUVOQU1FfX0pIjsKKyAgICAgICAgICAgICJ0cnkgY29udGFpbmVyLmVuY29kZUlmUHJlc2VudCh7e0ZJRUxEVkFSfX0sIGZvcktleTogIgorICAgICAgICAgICAgIi57e0ZJRUxEVkFSfX0pIjsKICAgICAgIH0KICAgICAgIGlmIChzaG91bGRfaW5kZW50KSBPdXRkZW50KCk7CiAKQEAgLTEwMzQsNyArMTA3MSw3IEBACiAgICAgY29kZV8gKz0gIiI7CiAgICAgaWYgKHN0cnVjdF9kZWYuZmllbGRzLnZlYy5lbXB0eSgpID09IGZhbHNlKSBHZW5lcmF0ZUNvZGluZ0tleXMoc3RydWN0X2RlZik7CiAKLSAgICBjb2RlXyArPSAicHVibGljIGZ1bmMgZW5jb2RlKHRvIGVuY29kZXI6IEVuY29kZXIpIHRocm93cyB7IjsKKyAgICBjb2RlXyArPSAie3tBQ0NFU1NfVFlQRX19IGZ1bmMgZW5jb2RlKHRvIGVuY29kZXI6IEVuY29kZXIpIHRocm93cyB7IjsKICAgICBJbmRlbnQoKTsKICAgICBpZiAoc3RydWN0X2RlZi5maWVsZHMudmVjLmVtcHR5KCkgPT0gZmFsc2UpIEdlbmVyYXRlRW5jb2RlckJvZHkoc3RydWN0X2RlZik7CiAgICAgT3V0ZGVudCgpOwpAQCAtMTA0NiwyMCArMTA4MywyMCBAQAogCiAgIHZvaWQgR2VuZXJhdGVWZXJpZmllcihjb25zdCBTdHJ1Y3REZWYgJnN0cnVjdF9kZWYpIHsKICAgICBjb2RlXyArPQotICAgICAgICAicHVibGljIHN0YXRpYyBmdW5jIHZlcmlmeTxUPihfIHZlcmlmaWVyOiBpbm91dCBWZXJpZmllciwgYXQgcG9zaXRpb246ICIKKyAgICAgICAgInt7QUNDRVNTX1RZUEV9fSBzdGF0aWMgZnVuYyB2ZXJpZnk8VD4oXyB2ZXJpZmllcjogaW5vdXQgVmVyaWZpZXIsIGF0ICIKKyAgICAgICAgInBvc2l0aW9uOiAiCiAgICAgICAgICJJbnQsIG9mIHR5cGU6IFQuVHlwZSkgdGhyb3dzIHdoZXJlIFQ6IFZlcmlmaWFibGUgeyI7CiAgICAgSW5kZW50KCk7CiAgICAgY29kZV8gKz0gInZhciBfdiA9IHRyeSB2ZXJpZmllci52aXNpdFRhYmxlKGF0OiBwb3NpdGlvbikiOwogICAgIGZvciAoYXV0byBpdCA9IHN0cnVjdF9kZWYuZmllbGRzLnZlYy5iZWdpbigpOwogICAgICAgICAgaXQgIT0gc3RydWN0X2RlZi5maWVsZHMudmVjLmVuZCgpOyArK2l0KSB7Ci0gICAgICBhdXRvICZmaWVsZCA9ICoqaXQ7CisgICAgICBjb25zdCBhdXRvICZmaWVsZCA9ICoqaXQ7CiAgICAgICBpZiAoZmllbGQuZGVwcmVjYXRlZCkgY29udGludWU7Ci0gICAgICBhdXRvIG9mZnNldCA9IE51bVRvU3RyaW5nKGZpZWxkLnZhbHVlLm9mZnNldCk7Ci0gICAgICBhdXRvIG5hbWUgPSBOYW1lKGZpZWxkKTsKKyAgICAgIGNvbnN0IGF1dG8gb2Zmc2V0ID0gTnVtVG9TdHJpbmcoZmllbGQudmFsdWUub2Zmc2V0KTsKIAotICAgICAgY29kZV8uU2V0VmFsdWUoIlZBTFVFTkFNRSIsIG5hbWUpOworICAgICAgY29kZV8uU2V0VmFsdWUoIkZJRUxEVkFSIiwgbmFtZXJfLlZhcmlhYmxlKGZpZWxkKSk7CiAgICAgICBjb2RlXy5TZXRWYWx1ZSgiVkFMVUVUWVBFIiwgR2VuZXJhdGVWZXJpZmllclR5cGUoZmllbGQpKTsKLSAgICAgIGNvZGVfLlNldFZhbHVlKCJPRkZTRVQiLCBuYW1lKTsKKyAgICAgIGNvZGVfLlNldFZhbHVlKCJPRkZTRVQiLCBuYW1lcl8uRmllbGQoZmllbGQpKTsKICAgICAgIGNvZGVfLlNldFZhbHVlKCJJU1JFUVVJUkVEIiwgZmllbGQuSXNSZXF1aXJlZCgpID8gInRydWUiIDogImZhbHNlIik7CiAKICAgICAgIGlmIChJc1VuaW9uKGZpZWxkLnZhbHVlLnR5cGUpKSB7CkBAIC0xMDY5LDcgKzExMDYsNyBAQAogCiAgICAgICBjb2RlXyArPQogICAgICAgICAgICJ0cnkgX3YudmlzaXQoZmllbGQ6IHt7VEFCTEVPRkZTRVR9fS57e09GRlNFVH19LnAsIGZpZWxkTmFtZTogIgotICAgICAgICAgICJcInt7VkFMVUVOQU1FfX1cIiwgcmVxdWlyZWQ6IHt7SVNSRVFVSVJFRH19LCB0eXBlOiAiCisgICAgICAgICAgIlwie3tGSUVMRFZBUn19XCIsIHJlcXVpcmVkOiB7e0lTUkVRVUlSRUR9fSwgdHlwZTogIgogICAgICAgICAgICJ7e1ZBTFVFVFlQRX19LnNlbGYpIjsKICAgICB9CiAgICAgY29kZV8gKz0gIl92LmZpbmlzaCgpIjsKQEAgLTEwNzgsMjggKzExMTUsMjcgQEAKICAgfQogCiAgIHZvaWQgR2VuZXJhdGVVbmlvblR5cGVWZXJpZmllcihjb25zdCBGaWVsZERlZiAmZmllbGQpIHsKLSAgICBhdXRvIGlzX3ZlY3RvciA9IElzVmVjdG9yKGZpZWxkLnZhbHVlLnR5cGUpIHx8IElzQXJyYXkoZmllbGQudmFsdWUudHlwZSk7CisgICAgY29uc3QgYXV0byBpc192ZWN0b3IgPQorICAgICAgICBJc1ZlY3RvcihmaWVsZC52YWx1ZS50eXBlKSB8fCBJc0FycmF5KGZpZWxkLnZhbHVlLnR5cGUpOwogICAgIGlmIChmaWVsZC52YWx1ZS50eXBlLmJhc2VfdHlwZSA9PSBCQVNFX1RZUEVfVVRZUEUgfHwKICAgICAgICAgKGlzX3ZlY3RvciAmJgogICAgICAgICAgZmllbGQudmFsdWUudHlwZS5WZWN0b3JUeXBlKCkuYmFzZV90eXBlID09IEJBU0VfVFlQRV9VVFlQRSkpCiAgICAgICByZXR1cm47CiAgICAgRW51bURlZiAmdW5pb25fZGVmID0gKmZpZWxkLnZhbHVlLnR5cGUuZW51bV9kZWY7Ci0gICAgY29kZV8uU2V0VmFsdWUoIlZBTFVFVFlQRSIsIE5hbWVXcmFwcGVkSW5OYW1lU3BhY2UodW5pb25fZGVmKSk7CisgICAgY29kZV8uU2V0VmFsdWUoIlZBTFVFVFlQRSIsIG5hbWVyXy5OYW1lc3BhY2VkVHlwZSh1bmlvbl9kZWYpKTsKICAgICBjb2RlXy5TZXRWYWx1ZSgiRlVOQ1RJT05fTkFNRSIsIGlzX3ZlY3RvciA/ICJ2aXNpdFVuaW9uVmVjdG9yIiA6ICJ2aXNpdCIpOwogICAgIGNvZGVfICs9CiAgICAgICAgICJ0cnkgX3Yue3tGVU5DVElPTl9OQU1FfX0odW5pb25LZXk6IHt7VEFCTEVPRkZTRVR9fS57e09GRlNFVH19VHlwZS5wLCAiCiAgICAgICAgICJ1bmlvbkZpZWxkOiB7e1RBQkxFT0ZGU0VUfX0ue3tPRkZTRVR9fS5wLCB1bmlvbktleU5hbWU6ICIKLSAgICAgICAgIlwie3tWQUxVRU5BTUV9fVR5cGVcIiwgZmllbGROYW1lOiBcInt7VkFMVUVOQU1FfX1cIiwgcmVxdWlyZWQ6ICIKKyAgICAgICAgIlwie3tGSUVMRFZBUn19VHlwZVwiLCBmaWVsZE5hbWU6IFwie3tGSUVMRFZBUn19XCIsIHJlcXVpcmVkOiAiCiAgICAgICAgICJ7e0lTUkVRVUlSRUR9fSwgY29tcGxldGlvbjogeyAodmVyaWZpZXIsIGtleToge3tWQUxVRVRZUEV9fSwgcG9zKSBpbiI7CiAgICAgSW5kZW50KCk7CiAgICAgY29kZV8gKz0gInN3aXRjaCBrZXkgeyI7CiAgICAgZm9yIChhdXRvIGl0ID0gdW5pb25fZGVmLlZhbHMoKS5iZWdpbigpOyBpdCAhPSB1bmlvbl9kZWYuVmFscygpLmVuZCgpOwogICAgICAgICAgKytpdCkgewogICAgICAgY29uc3QgYXV0byAmZXYgPSAqKml0OwotCi0gICAgICBhdXRvIG5hbWUgPSBOYW1lKGV2KTsKLSAgICAgIGF1dG8gdHlwZSA9IEdlblR5cGUoZXYudW5pb25fdHlwZSk7Ci0gICAgICBjb2RlXy5TZXRWYWx1ZSgiS0VZIiwgbmFtZSk7CisgICAgICBjb25zdCBhdXRvIHR5cGUgPSBHZW5UeXBlKGV2LnVuaW9uX3R5cGUpOworICAgICAgY29kZV8uU2V0VmFsdWUoIktFWSIsIG5hbWVyXy5MZWdhY3lTd2lmdFZhcmlhbnQoZXYpKTsKICAgICAgIGNvZGVfLlNldFZhbHVlKCJWQUxVRVRZUEUiLCB0eXBlKTsKICAgICAgIGNvZGVfICs9ICJjYXNlIC57e0tFWX19OiI7CiAgICAgICBJbmRlbnQoKTsKQEAgLTExMjUsMTEgKzExNjEsMTEgQEAKICAgfQogCiAgIHN0ZDo6c3RyaW5nIEdlbmVyYXRlVmVyaWZpZXJUeXBlKGNvbnN0IEZpZWxkRGVmICZmaWVsZCkgewotICAgIGF1dG8gdHlwZSA9IGZpZWxkLnZhbHVlLnR5cGU7Ci0gICAgYXV0byBpc192ZWN0b3IgPSBJc1ZlY3Rvcih0eXBlKSB8fCBJc0FycmF5KHR5cGUpOworICAgIGNvbnN0IGF1dG8gdHlwZSA9IGZpZWxkLnZhbHVlLnR5cGU7CisgICAgY29uc3QgYXV0byBpc192ZWN0b3IgPSBJc1ZlY3Rvcih0eXBlKSB8fCBJc0FycmF5KHR5cGUpOwogCiAgICAgaWYgKGlzX3ZlY3RvcikgewotICAgICAgYXV0byB2ZWN0b3JfdHlwZSA9IGZpZWxkLnZhbHVlLnR5cGUuVmVjdG9yVHlwZSgpOworICAgICAgY29uc3QgYXV0byB2ZWN0b3JfdHlwZSA9IGZpZWxkLnZhbHVlLnR5cGUuVmVjdG9yVHlwZSgpOwogICAgICAgcmV0dXJuICJGb3J3YXJkT2Zmc2V0PFZlY3RvcjwiICsKICAgICAgICAgICAgICBHZW5lcmF0ZU5lc3RlZFZlcmlmaWVyVHlwZXModmVjdG9yX3R5cGUpICsgIiwgIiArCiAgICAgICAgICAgICAgR2VuVHlwZSh2ZWN0b3JfdHlwZSkgKyAiPj4iOwpAQCAtMTEzOSw3ICsxMTc1LDcgQEAKICAgfQogCiAgIHN0ZDo6c3RyaW5nIEdlbmVyYXRlTmVzdGVkVmVyaWZpZXJUeXBlcyhjb25zdCBUeXBlICZ0eXBlKSB7Ci0gICAgYXV0byBzdHJpbmdfdHlwZSA9IEdlblR5cGUodHlwZSk7CisgICAgY29uc3QgYXV0byBzdHJpbmdfdHlwZSA9IEdlblR5cGUodHlwZSk7CiAKICAgICBpZiAoSXNTY2FsYXIodHlwZS5iYXNlX3R5cGUpKSB7IHJldHVybiBzdHJpbmdfdHlwZTsgfQogCkBAIC0xMTUzLDcgKzExODksNyBAQAogICB2b2lkIEdlbkJ5S2V5RnVuY3Rpb25zKGNvbnN0IEZpZWxkRGVmICZrZXlfZmllbGQpIHsKICAgICBjb2RlXy5TZXRWYWx1ZSgiVFlQRSIsIEdlblR5cGUoa2V5X2ZpZWxkLnZhbHVlLnR5cGUpKTsKICAgICBjb2RlXyArPQotICAgICAgICAie3tBQ0NFU1NfVFlQRX19IGZ1bmMge3tWQUxVRU5BTUV9fUJ5KGtleToge3tUWVBFfX0pIC0+IHt7VkFMVUVUWVBFfX0/ICIKKyAgICAgICAgInt7QUNDRVNTX1RZUEV9fSBmdW5jIHt7RklFTERWQVJ9fUJ5KGtleToge3tUWVBFfX0pIC0+IHt7VkFMVUVUWVBFfX0/ICIKICAgICAgICAgInsgXFwiOwogICAgIGNvZGVfICs9IEdlbk9mZnNldCgpICsKICAgICAgICAgICAgICAicmV0dXJuIG8gPT0gMCA/IG5pbCA6IHt7VkFMVUVUWVBFfX0ubG9va3VwQnlLZXkodmVjdG9yOiAiCkBAIC0xMTYyLDExICsxMTk4LDExIEBACiAKICAgdm9pZCBHZW5FbnVtKGNvbnN0IEVudW1EZWYgJmVudW1fZGVmKSB7CiAgICAgaWYgKGVudW1fZGVmLmdlbmVyYXRlZCkgcmV0dXJuOwotICAgIGF1dG8gaXNfcHJpdmF0ZV9hY2Nlc3MgPSBlbnVtX2RlZi5hdHRyaWJ1dGVzLkxvb2t1cCgicHJpdmF0ZSIpOworICAgIGNvbnN0IGF1dG8gaXNfcHJpdmF0ZV9hY2Nlc3MgPSBlbnVtX2RlZi5hdHRyaWJ1dGVzLkxvb2t1cCgicHJpdmF0ZSIpOwogICAgIGNvZGVfLlNldFZhbHVlKCJFTlVNX1RZUEUiLAogICAgICAgICAgICAgICAgICAgIGVudW1fZGVmLmlzX3VuaW9uID8gIlVuaW9uRW51bSIgOiAiRW51bSwgVmVyaWZpYWJsZSIpOwogICAgIGNvZGVfLlNldFZhbHVlKCJBQ0NFU1NfVFlQRSIsIGlzX3ByaXZhdGVfYWNjZXNzID8gImludGVybmFsIiA6ICJwdWJsaWMiKTsKLSAgICBjb2RlXy5TZXRWYWx1ZSgiRU5VTV9OQU1FIiwgTmFtZVdyYXBwZWRJbk5hbWVTcGFjZShlbnVtX2RlZikpOworICAgIGNvZGVfLlNldFZhbHVlKCJFTlVNX05BTUUiLCBuYW1lcl8uTmFtZXNwYWNlZFR5cGUoZW51bV9kZWYpKTsKICAgICBjb2RlXy5TZXRWYWx1ZSgiQkFTRV9UWVBFIiwgR2VuVHlwZUJhc2ljKGVudW1fZGVmLnVuZGVybHlpbmdfdHlwZSwgZmFsc2UpKTsKICAgICBHZW5Db21tZW50KGVudW1fZGVmLmRvY19jb21tZW50KTsKICAgICBjb2RlXyArPQpAQCAtMTE4OSwxNSArMTIyNSwxNiBAQAogICAgICAgICAie3tBQ0NFU1NfVFlQRX19IHZhciB2YWx1ZToge3tCQVNFX1RZUEV9fSB7IHJldHVybiBzZWxmLnJhd1ZhbHVlIH0iOwogICAgIGZvciAoYXV0byBpdCA9IGVudW1fZGVmLlZhbHMoKS5iZWdpbigpOyBpdCAhPSBlbnVtX2RlZi5WYWxzKCkuZW5kKCk7ICsraXQpIHsKICAgICAgIGNvbnN0IGF1dG8gJmV2ID0gKippdDsKLSAgICAgIGF1dG8gbmFtZSA9IE5hbWUoZXYpOwotICAgICAgY29kZV8uU2V0VmFsdWUoIktFWSIsIG5hbWUpOworICAgICAgY29kZV8uU2V0VmFsdWUoIktFWSIsIG5hbWVyXy5MZWdhY3lTd2lmdFZhcmlhbnQoZXYpKTsKICAgICAgIGNvZGVfLlNldFZhbHVlKCJWQUxVRSIsIGVudW1fZGVmLlRvU3RyaW5nKGV2KSk7CiAgICAgICBHZW5Db21tZW50KGV2LmRvY19jb21tZW50KTsKICAgICAgIGNvZGVfICs9ICJjYXNlIHt7S0VZfX0gPSB7e1ZBTFVFfX0iOwogICAgIH0KICAgICBjb2RlXyArPSAiIjsKLSAgICBBZGRNaW5Pck1heEVudW1WYWx1ZShOYW1lKCplbnVtX2RlZi5NYXhWYWx1ZSgpKSwgIm1heCIpOwotICAgIEFkZE1pbk9yTWF4RW51bVZhbHVlKE5hbWUoKmVudW1fZGVmLk1pblZhbHVlKCkpLCAibWluIik7CisgICAgQWRkTWluT3JNYXhFbnVtVmFsdWUobmFtZXJfLkxlZ2FjeVN3aWZ0VmFyaWFudCgqZW51bV9kZWYuTWF4VmFsdWUoKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgIm1heCIpOworICAgIEFkZE1pbk9yTWF4RW51bVZhbHVlKG5hbWVyXy5MZWdhY3lTd2lmdFZhcmlhbnQoKmVudW1fZGVmLk1pblZhbHVlKCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICJtaW4iKTsKICAgICBPdXRkZW50KCk7CiAgICAgY29kZV8gKz0gIn1cbiI7CiAgICAgaWYgKHBhcnNlcl8ub3B0cy5nZW5fanNvbl9jb2RlcnMpIEVudW1FbmNvZGVyKGVudW1fZGVmKTsKQEAgLTEyMzUsOCArMTI3Miw3IEBACiAgICAgY29kZV8gKz0gInN3aXRjaCBzZWxmIHsiOwogICAgIGZvciAoYXV0byBpdCA9IGVudW1fZGVmLlZhbHMoKS5iZWdpbigpOyBpdCAhPSBlbnVtX2RlZi5WYWxzKCkuZW5kKCk7ICsraXQpIHsKICAgICAgIGNvbnN0IGF1dG8gJmV2ID0gKippdDsKLSAgICAgIGF1dG8gbmFtZSA9IE5hbWUoZXYpOwotICAgICAgY29kZV8uU2V0VmFsdWUoIktFWSIsIG5hbWUpOworICAgICAgY29kZV8uU2V0VmFsdWUoIktFWSIsIG5hbWVyXy5MZWdhY3lTd2lmdFZhcmlhbnQoZXYpKTsKICAgICAgIGNvZGVfLlNldFZhbHVlKCJSQVdLRVkiLCBldi5uYW1lKTsKICAgICAgIGNvZGVfICs9ICJjYXNlIC57e0tFWX19OiB0cnkgY29udGFpbmVyLmVuY29kZShcInt7UkFXS0VZfX1cIikiOwogICAgIH0KQEAgLTEyNDksMTggKzEyODUsMTggQEAKIAogICAvLyBNQVJLOiAtIE9iamVjdCBBUEkKIAotICB2b2lkIEdlbmVyYXRlT2JqZWN0QVBJRXh0ZW5zaW9uSGVhZGVyKHN0ZDo6c3RyaW5nIG5hbWUpIHsKKyAgdm9pZCBHZW5lcmF0ZU9iamVjdEFQSUV4dGVuc2lvbkhlYWRlcihzdGQ6OnN0cmluZyB0eXBlX25hbWUpIHsKICAgICBjb2RlXyArPSAiXG4iOwotICAgIGNvZGVfICs9ICJ7e0FDQ0VTU19UWVBFfX0gbXV0YXRpbmcgZnVuYyB1bnBhY2soKSAtPiAiICsgbmFtZSArICIgeyI7CisgICAgY29kZV8gKz0gInt7QUNDRVNTX1RZUEV9fSBtdXRhdGluZyBmdW5jIHVucGFjaygpIC0+ICIgKyB0eXBlX25hbWUgKyAiIHsiOwogICAgIEluZGVudCgpOwotICAgIGNvZGVfICs9ICJyZXR1cm4gIiArIG5hbWUgKyAiKCZzZWxmKSI7CisgICAgY29kZV8gKz0gInJldHVybiAiICsgdHlwZV9uYW1lICsgIigmc2VsZikiOwogICAgIE91dGRlbnQoKTsKICAgICBjb2RlXyArPSAifSI7CiAgICAgY29kZV8gKz0KICAgICAgICAgInt7QUNDRVNTX1RZUEV9fSBzdGF0aWMgZnVuYyBwYWNrKF8gYnVpbGRlcjogaW5vdXQgRmxhdEJ1ZmZlckJ1aWxkZXIsICIKICAgICAgICAgIm9iajogIgogICAgICAgICAiaW5vdXQgIiArCi0gICAgICAgIG5hbWUgKyAiPykgLT4gT2Zmc2V0IHsiOworICAgICAgICB0eXBlX25hbWUgKyAiPykgLT4gT2Zmc2V0IHsiOwogICAgIEluZGVudCgpOwogICAgIGNvZGVfICs9ICJndWFyZCB2YXIgb2JqID0gb2JqIGVsc2UgeyByZXR1cm4gT2Zmc2V0KCkgfSI7CiAgICAgY29kZV8gKz0gInJldHVybiBwYWNrKCZidWlsZGVyLCBvYmo6ICZvYmopIjsKQEAgLTEyNzEsNyArMTMwNyw3IEBACiAgICAgICAgICJ7e0FDQ0VTU19UWVBFfX0gc3RhdGljIGZ1bmMgcGFjayhfIGJ1aWxkZXI6IGlub3V0IEZsYXRCdWZmZXJCdWlsZGVyLCAiCiAgICAgICAgICJvYmo6ICIKICAgICAgICAgImlub3V0ICIgKwotICAgICAgICBuYW1lICsgIikgLT4gT2Zmc2V0IHsiOworICAgICAgICB0eXBlX25hbWUgKyAiKSAtPiBPZmZzZXQgeyI7CiAgICAgSW5kZW50KCk7CiAgIH0KIApAQCAtMTI4MSw0MCArMTMxNywzOSBAQAogICAgIEluZGVudCgpOwogICAgIGZvciAoYXV0byBpdCA9IHN0cnVjdF9kZWYuZmllbGRzLnZlYy5iZWdpbigpOwogICAgICAgICAgaXQgIT0gc3RydWN0X2RlZi5maWVsZHMudmVjLmVuZCgpOyArK2l0KSB7Ci0gICAgICBhdXRvICZmaWVsZCA9ICoqaXQ7CisgICAgICBjb25zdCBhdXRvICZmaWVsZCA9ICoqaXQ7CiAgICAgICBpZiAoZmllbGQuZGVwcmVjYXRlZCkgY29udGludWU7CiAKLSAgICAgIGF1dG8gbmFtZSA9IE5hbWUoZmllbGQpOwotICAgICAgYXV0byB0eXBlID0gR2VuVHlwZShmaWVsZC52YWx1ZS50eXBlKTsKLSAgICAgIGNvZGVfLlNldFZhbHVlKCJWQUxVRU5BTUUiLCBuYW1lKTsKKyAgICAgIGNvbnN0IGF1dG8gdHlwZSA9IEdlblR5cGUoZmllbGQudmFsdWUudHlwZSk7CisgICAgICBjb2RlXy5TZXRWYWx1ZSgiRklFTERWQVIiLCBuYW1lcl8uVmFyaWFibGUoZmllbGQpKTsKICAgICAgIGlmIChJc1N0cnVjdChmaWVsZC52YWx1ZS50eXBlKSkgewotICAgICAgICBjb2RlXyArPSAidmFyIF92e3tWQUxVRU5BTUV9fSA9IF90Lnt7VkFMVUVOQU1FfX0iOwotICAgICAgICBjb2RlXyArPSAiX3t7VkFMVUVOQU1FfX0gPSBfdnt7VkFMVUVOQU1FfX0udW5wYWNrKCkiOworICAgICAgICBjb2RlXyArPSAidmFyIF92e3tGSUVMRFZBUn19ID0gX3Que3tGSUVMRFZBUn19IjsKKyAgICAgICAgY29kZV8gKz0gIl97e0ZJRUxEVkFSfX0gPSBfdnt7RklFTERWQVJ9fS51bnBhY2soKSI7CiAgICAgICAgIGNvbnRpbnVlOwogICAgICAgfQogICAgICAgc3RkOjpzdHJpbmcgaXNfZW51bSA9IElzRW51bShmaWVsZC52YWx1ZS50eXBlKSA/ICIudmFsdWUiIDogIiI7Ci0gICAgICBjb2RlXyArPSAiX3t7VkFMVUVOQU1FfX0gPSBfdC57e1ZBTFVFTkFNRX19IiArIGlzX2VudW07CisgICAgICBjb2RlXyArPSAiX3t7RklFTERWQVJ9fSA9IF90Lnt7RklFTERWQVJ9fSIgKyBpc19lbnVtOwogICAgIH0KICAgICBPdXRkZW50KCk7CiAgICAgY29kZV8gKz0gIn1cbiI7CiAgIH0KIAogICB2b2lkIEdlbk9iamVjdEFQSShjb25zdCBTdHJ1Y3REZWYgJnN0cnVjdF9kZWYpIHsKLSAgICBjb2RlXyArPSAie3tBQ0NFU1NfVFlQRX19IGNsYXNzICIgKyBPYmplY3RBUElOYW1lKCJ7e1NUUlVDVE5BTUV9fSIpICsKLSAgICAgICAgICAgICAiOiBOYXRpdmVPYmplY3Qge1xuIjsKKyAgICBjb2RlXyArPSAie3tBQ0NFU1NfVFlQRX19IGNsYXNzICIgKworICAgICAgICAgICAgIG5hbWVyXy5OYW1lc3BhY2VkT2JqZWN0VHlwZShzdHJ1Y3RfZGVmKSArICI6IE5hdGl2ZU9iamVjdCB7XG4iOwogICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBidWZmZXJfY29uc3RydWN0b3I7CiAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IGJhc2VfY29uc3RydWN0b3I7CiAgICAgSW5kZW50KCk7CiAgICAgZm9yIChhdXRvIGl0ID0gc3RydWN0X2RlZi5maWVsZHMudmVjLmJlZ2luKCk7CiAgICAgICAgICBpdCAhPSBzdHJ1Y3RfZGVmLmZpZWxkcy52ZWMuZW5kKCk7ICsraXQpIHsKLSAgICAgIGF1dG8gJmZpZWxkID0gKippdDsKKyAgICAgIGNvbnN0IGF1dG8gJmZpZWxkID0gKippdDsKICAgICAgIGlmIChmaWVsZC5kZXByZWNhdGVkKSBjb250aW51ZTsKICAgICAgIEJ1aWxkT2JqZWN0QVBJQ29uc3RydWN0b3JCb2R5KGZpZWxkLCBzdHJ1Y3RfZGVmLmZpeGVkLCBidWZmZXJfY29uc3RydWN0b3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlX2NvbnN0cnVjdG9yKTsKICAgICB9CiAgICAgY29kZV8gKz0gIiI7CiAgICAgQnVpbGRPYmplY3RDb25zdHJ1Y3RvcihidWZmZXJfY29uc3RydWN0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAiXyBfdDogaW5vdXQgIiArIE5hbWVXcmFwcGVkSW5OYW1lU3BhY2Uoc3RydWN0X2RlZikpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIl8gX3Q6IGlub3V0ICIgKyBuYW1lcl8uTmFtZXNwYWNlZFR5cGUoc3RydWN0X2RlZikpOwogICAgIEJ1aWxkT2JqZWN0Q29uc3RydWN0b3IoYmFzZV9jb25zdHJ1Y3Rvcik7CiAgICAgaWYgKCFzdHJ1Y3RfZGVmLmZpeGVkKQogICAgICAgY29kZV8gKz0KQEAgLTEzMjYsMzUgKzEzNjEsMzcgQEAKICAgfQogCiAgIHZvaWQgR2VuZXJhdGVPYmplY3RBUElUYWJsZUV4dGVuc2lvbihjb25zdCBTdHJ1Y3REZWYgJnN0cnVjdF9kZWYpIHsKLSAgICBHZW5lcmF0ZU9iamVjdEFQSUV4dGVuc2lvbkhlYWRlcihPYmplY3RBUElOYW1lKCJ7e1NUUlVDVE5BTUV9fSIpKTsKKyAgICBHZW5lcmF0ZU9iamVjdEFQSUV4dGVuc2lvbkhlYWRlcihuYW1lcl8uTmFtZXNwYWNlZE9iamVjdFR5cGUoc3RydWN0X2RlZikpOwogICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiB1bnBhY2tfYm9keTsKICAgICBzdGQ6OnN0cmluZyBidWlsZGVyID0gIiwgJmJ1aWxkZXIpIjsKICAgICBmb3IgKGF1dG8gaXQgPSBzdHJ1Y3RfZGVmLmZpZWxkcy52ZWMuYmVnaW4oKTsKICAgICAgICAgIGl0ICE9IHN0cnVjdF9kZWYuZmllbGRzLnZlYy5lbmQoKTsgKytpdCkgewotICAgICAgYXV0byAmZmllbGQgPSAqKml0OworICAgICAgY29uc3QgYXV0byAmZmllbGQgPSAqKml0OwogICAgICAgaWYgKGZpZWxkLmRlcHJlY2F0ZWQpIGNvbnRpbnVlOwotICAgICAgYXV0byBuYW1lID0gTmFtZShmaWVsZCk7Ci0gICAgICBhdXRvIHR5cGUgPSBHZW5UeXBlKGZpZWxkLnZhbHVlLnR5cGUpOworICAgICAgY29uc3QgYXV0byBmaWVsZF92YXIgPSBuYW1lcl8uVmFyaWFibGUoZmllbGQpOworICAgICAgY29uc3QgYXV0byBmaWVsZF9maWVsZCA9IG5hbWVyXy5GaWVsZChmaWVsZCk7CisgICAgICBjb25zdCBhdXRvIGZpZWxkX21ldGhvZCA9IG5hbWVyXy5NZXRob2QoZmllbGQpOworICAgICAgY29uc3QgYXV0byB0eXBlID0gR2VuVHlwZShmaWVsZC52YWx1ZS50eXBlKTsKICAgICAgIHN0ZDo6c3RyaW5nIGNoZWNrX2lmX3ZlY3RvciA9CiAgICAgICAgICAgKElzVmVjdG9yKGZpZWxkLnZhbHVlLnR5cGUpIHx8IElzQXJyYXkoZmllbGQudmFsdWUudHlwZSkpCiAgICAgICAgICAgICAgID8gIlZlY3Rvck9mKCIKICAgICAgICAgICAgICAgOiAiKCI7Ci0gICAgICBzdGQ6OnN0cmluZyBib2R5ID0gImFkZCIgKyBjaGVja19pZl92ZWN0b3IgKyBuYW1lICsgIjogIjsKKyAgICAgIHN0ZDo6c3RyaW5nIGJvZHkgPSAiYWRkIiArIGNoZWNrX2lmX3ZlY3RvciArIGZpZWxkX21ldGhvZCArICI6ICI7CiAgICAgICBzd2l0Y2ggKGZpZWxkLnZhbHVlLnR5cGUuYmFzZV90eXBlKSB7CiAgICAgICAgIGNhc2UgQkFTRV9UWVBFX0FSUkFZOiBGTEFUQlVGRkVSU19GQUxMVEhST1VHSCgpOwogICAgICAgICBjYXNlIEJBU0VfVFlQRV9WRUNUT1I6IHsKLSAgICAgICAgICBHZW5lcmF0ZVZlY3Rvck9iamVjdEFQSVRhYmxlRXh0ZW5zaW9uKGZpZWxkLCBuYW1lLCB0eXBlKTsKLSAgICAgICAgICB1bnBhY2tfYm9keS5wdXNoX2JhY2soInt7U1RSVUNUTkFNRX19LiIgKyBib2R5ICsgIl9fIiArIG5hbWUgKworICAgICAgICAgIEdlbmVyYXRlVmVjdG9yT2JqZWN0QVBJVGFibGVFeHRlbnNpb24oZmllbGQpOworICAgICAgICAgIHVucGFja19ib2R5LnB1c2hfYmFjaygie3tTVFJVQ1ROQU1FfX0uIiArIGJvZHkgKyAiX18iICsgZmllbGRfdmFyICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVpbGRlcik7CiAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KICAgICAgICAgY2FzZSBCQVNFX1RZUEVfVU5JT046IHsKLSAgICAgICAgICBjb2RlXyArPSAibGV0IF9fIiArIG5hbWUgKyAiID0gb2JqLiIgKyBuYW1lICsKKyAgICAgICAgICBjb2RlXyArPSAibGV0IF9fIiArIGZpZWxkX3ZhciArICIgPSBvYmouIiArIGZpZWxkX3ZhciArCiAgICAgICAgICAgICAgICAgICAgIj8ucGFjayhidWlsZGVyOiAmYnVpbGRlcikgPz8gT2Zmc2V0KCkiOwotICAgICAgICAgIHVucGFja19ib2R5LnB1c2hfYmFjaygiaWYgbGV0IG8gPSBvYmouIiArIG5hbWUgKyAiPy50eXBlIHsiKTsKLSAgICAgICAgICB1bnBhY2tfYm9keS5wdXNoX2JhY2soIiAge3tTVFJVQ1ROQU1FfX0uYWRkKCIgKyBuYW1lICsgIlR5cGU6IG8iICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVpbGRlcik7Ci0gICAgICAgICAgdW5wYWNrX2JvZHkucHVzaF9iYWNrKCIgIHt7U1RSVUNUTkFNRX19LiIgKyBib2R5ICsgIl9fIiArIG5hbWUgKworICAgICAgICAgIHVucGFja19ib2R5LnB1c2hfYmFjaygiaWYgbGV0IG8gPSBvYmouIiArIGZpZWxkX3ZhciArICI/LnR5cGUgeyIpOworICAgICAgICAgIHVucGFja19ib2R5LnB1c2hfYmFjaygiICB7e1NUUlVDVE5BTUV9fS5hZGQoIiArIGZpZWxkX3ZhciArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUeXBlOiBvIiArIGJ1aWxkZXIpOworICAgICAgICAgIHVucGFja19ib2R5LnB1c2hfYmFjaygiICB7e1NUUlVDVE5BTUV9fS4iICsgYm9keSArICJfXyIgKyBmaWVsZF92YXIgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWlsZGVyKTsKICAgICAgICAgICB1bnBhY2tfYm9keS5wdXNoX2JhY2soIn1cbiIpOwogICAgICAgICAgIGJyZWFrOwpAQCAtMTM2OCwzMSArMTQwNSwzMSBAQAogICAgICAgICAgICAgR2VuZXJhdGVTdHJ1Y3RBcmdzKCpmaWVsZC52YWx1ZS50eXBlLnN0cnVjdF9kZWYsICZjb2RlLCAiIiwgIiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiQwIiwgdHJ1ZSk7CiAgICAgICAgICAgICBjb2RlID0gY29kZS5zdWJzdHIoMCwgY29kZS5zaXplKCkgLSAyKTsKLSAgICAgICAgICAgIHVucGFja19ib2R5LnB1c2hfYmFjaygie3tTVFJVQ1ROQU1FfX0uIiArIGJvZHkgKyAib2JqLiIgKyBuYW1lICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWlsZGVyKTsKKyAgICAgICAgICAgIHVucGFja19ib2R5LnB1c2hfYmFjaygie3tTVFJVQ1ROQU1FfX0uIiArIGJvZHkgKyAib2JqLiIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkX2ZpZWxkICsgYnVpbGRlcik7CiAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGNvZGVfICs9ICJsZXQgX18iICsgbmFtZSArICIgPSAiICsgdHlwZSArCi0gICAgICAgICAgICAgICAgICAgICAiLnBhY2soJmJ1aWxkZXIsIG9iajogJm9iai4iICsgbmFtZSArICIpIjsKLSAgICAgICAgICAgIHVucGFja19ib2R5LnB1c2hfYmFjaygie3tTVFJVQ1ROQU1FfX0uIiArIGJvZHkgKyAiX18iICsgbmFtZSArCisgICAgICAgICAgICBjb2RlXyArPSAibGV0IF9fIiArIGZpZWxkX3ZhciArICIgPSAiICsgdHlwZSArCisgICAgICAgICAgICAgICAgICAgICAiLnBhY2soJmJ1aWxkZXIsIG9iajogJm9iai4iICsgZmllbGRfZmllbGQgKyAiKSI7CisgICAgICAgICAgICB1bnBhY2tfYm9keS5wdXNoX2JhY2soInt7U1RSVUNUTkFNRX19LiIgKyBib2R5ICsgIl9fIiArIGZpZWxkX3ZhciArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVpbGRlcik7CiAgICAgICAgICAgfQogICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAgICAgICAgIGNhc2UgQkFTRV9UWVBFX1NUUklORzogewotICAgICAgICAgIHVucGFja19ib2R5LnB1c2hfYmFjaygie3tTVFJVQ1ROQU1FfX0uIiArIGJvZHkgKyAiX18iICsgbmFtZSArCisgICAgICAgICAgdW5wYWNrX2JvZHkucHVzaF9iYWNrKCJ7e1NUUlVDVE5BTUV9fS4iICsgYm9keSArICJfXyIgKyBmaWVsZF92YXIgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWlsZGVyKTsKICAgICAgICAgICBpZiAoZmllbGQuSXNSZXF1aXJlZCgpKSB7Ci0gICAgICAgICAgICBjb2RlXyArPQotICAgICAgICAgICAgICAgICJsZXQgX18iICsgbmFtZSArICIgPSBidWlsZGVyLmNyZWF0ZShzdHJpbmc6IG9iai4iICsgbmFtZSArICIpIjsKKyAgICAgICAgICAgIGNvZGVfICs9ICJsZXQgX18iICsgZmllbGRfdmFyICsgIiA9IGJ1aWxkZXIuY3JlYXRlKHN0cmluZzogb2JqLiIgKworICAgICAgICAgICAgICAgICAgICAgZmllbGRfZmllbGQgKyAiKSI7CiAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIEJ1aWxkaW5nT3B0aW9uYWxPYmplY3RzKG5hbWUsICJidWlsZGVyLmNyZWF0ZShzdHJpbmc6IHMpIik7CisgICAgICAgICAgICBCdWlsZGluZ09wdGlvbmFsT2JqZWN0cyhmaWVsZF9maWVsZCwgImJ1aWxkZXIuY3JlYXRlKHN0cmluZzogcykiKTsKICAgICAgICAgICB9CiAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KICAgICAgICAgY2FzZSBCQVNFX1RZUEVfVVRZUEU6IGJyZWFrOwogICAgICAgICBkZWZhdWx0OgotICAgICAgICAgIHVucGFja19ib2R5LnB1c2hfYmFjaygie3tTVFJVQ1ROQU1FfX0uIiArIGJvZHkgKyAib2JqLiIgKyBuYW1lICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVpbGRlcik7CisgICAgICAgICAgdW5wYWNrX2JvZHkucHVzaF9iYWNrKCJ7e1NUUlVDVE5BTUV9fS4iICsgYm9keSArICJvYmouIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkX2ZpZWxkICsgYnVpbGRlcik7CiAgICAgICB9CiAgICAgfQogICAgIGNvZGVfICs9ICJsZXQgX19yb290ID0ge3tTVFJVQ1ROQU1FfX0uc3RhcnR7e1NIT1JUX1NUUlVDVE5BTUV9fSgmYnVpbGRlcikiOwpAQCAtMTQwNSw3OSArMTQ0Miw3OSBAQAogICAgIGNvZGVfICs9ICJ9IjsKICAgfQogCi0gIHZvaWQgR2VuZXJhdGVWZWN0b3JPYmplY3RBUElUYWJsZUV4dGVuc2lvbihjb25zdCBGaWVsZERlZiAmZmllbGQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyAmbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nICZ0eXBlKSB7Ci0gICAgYXV0byB2ZWN0b3J0eXBlID0gZmllbGQudmFsdWUudHlwZS5WZWN0b3JUeXBlKCk7CisgIHZvaWQgR2VuZXJhdGVWZWN0b3JPYmplY3RBUElUYWJsZUV4dGVuc2lvbihjb25zdCBGaWVsZERlZiAmZmllbGRfZGVmKSB7CisgICAgY29uc3QgVHlwZSAmZmllbGRfdHlwZSA9IGZpZWxkX2RlZi52YWx1ZS50eXBlOworICAgIGNvbnN0IGF1dG8gdHlwZSA9IEdlblR5cGUoZmllbGRfdHlwZSk7CisgICAgY29uc3QgYXV0byB2YXIgPSBuYW1lcl8uVmFyaWFibGUoZmllbGRfZGVmKTsKKyAgICBjb25zdCBhdXRvIGZpZWxkID0gbmFtZXJfLkZpZWxkKGZpZWxkX2RlZik7CisKKyAgICBjb25zdCBhdXRvIHZlY3RvcnR5cGUgPSBmaWVsZF90eXBlLlZlY3RvclR5cGUoKTsKICAgICBzd2l0Y2ggKHZlY3RvcnR5cGUuYmFzZV90eXBlKSB7CiAgICAgICBjYXNlIEJBU0VfVFlQRV9VTklPTjogewotICAgICAgICBjb2RlXyArPSAidmFyIF9fIiArIG5hbWUgKyAiX186IFtPZmZzZXRdID0gW10iOwotICAgICAgICBjb2RlXyArPSAiZm9yIGkgaW4gb2JqLiIgKyBuYW1lICsgIiB7IjsKKyAgICAgICAgY29kZV8gKz0gInZhciBfXyIgKyB2YXIgKyAiX186IFtPZmZzZXRdID0gW10iOworICAgICAgICBjb2RlXyArPSAiZm9yIGkgaW4gb2JqLiIgKyB2YXIgKyAiIHsiOwogICAgICAgICBJbmRlbnQoKTsKICAgICAgICAgY29kZV8gKz0gImd1YXJkIGxldCBvZmYgPSBpPy5wYWNrKGJ1aWxkZXI6ICZidWlsZGVyKSBlbHNlIHsgY29udGludWUgfSI7Ci0gICAgICAgIGNvZGVfICs9ICJfXyIgKyBuYW1lICsgIl9fLmFwcGVuZChvZmYpIjsKKyAgICAgICAgY29kZV8gKz0gIl9fIiArIHZhciArICJfXy5hcHBlbmQob2ZmKSI7CiAgICAgICAgIE91dGRlbnQoKTsKICAgICAgICAgY29kZV8gKz0gIn0iOwotICAgICAgICBjb2RlXyArPSAibGV0IF9fIiArIG5hbWUgKyAiID0gYnVpbGRlci5jcmVhdGVWZWN0b3Iob2ZPZmZzZXRzOiBfXyIgKwotICAgICAgICAgICAgICAgICBuYW1lICsgIl9fKSI7Ci0gICAgICAgIGNvZGVfICs9ICJsZXQgX18iICsgbmFtZSArICJUeXBlID0gYnVpbGRlci5jcmVhdGVWZWN0b3Iob2JqLiIgKyBuYW1lICsKKyAgICAgICAgY29kZV8gKz0gImxldCBfXyIgKyB2YXIgKyAiID0gYnVpbGRlci5jcmVhdGVWZWN0b3Iob2ZPZmZzZXRzOiBfXyIgKworICAgICAgICAgICAgICAgICB2YXIgKyAiX18pIjsKKyAgICAgICAgY29kZV8gKz0gImxldCBfXyIgKyB2YXIgKyAiVHlwZSA9IGJ1aWxkZXIuY3JlYXRlVmVjdG9yKG9iai4iICsgZmllbGQgKwogICAgICAgICAgICAgICAgICAiLmNvbXBhY3RNYXAgeyAkMD8udHlwZSB9KSI7CiAgICAgICAgIGJyZWFrOwogICAgICAgfQogICAgICAgY2FzZSBCQVNFX1RZUEVfVVRZUEU6IGJyZWFrOwogICAgICAgY2FzZSBCQVNFX1RZUEVfU1RSVUNUOiB7Ci0gICAgICAgIGlmIChmaWVsZC52YWx1ZS50eXBlLnN0cnVjdF9kZWYgJiYKLSAgICAgICAgICAgICFmaWVsZC52YWx1ZS50eXBlLnN0cnVjdF9kZWYtPmZpeGVkKSB7Ci0gICAgICAgICAgY29kZV8gKz0gInZhciBfXyIgKyBuYW1lICsgIl9fOiBbT2Zmc2V0XSA9IFtdIjsKLSAgICAgICAgICBjb2RlXyArPSAiZm9yIHZhciBpIGluIG9iai4iICsgbmFtZSArICIgeyI7CisgICAgICAgIGlmIChmaWVsZF90eXBlLnN0cnVjdF9kZWYgJiYgIWZpZWxkX3R5cGUuc3RydWN0X2RlZi0+Zml4ZWQpIHsKKyAgICAgICAgICBjb2RlXyArPSAidmFyIF9fIiArIHZhciArICJfXzogW09mZnNldF0gPSBbXSI7CisgICAgICAgICAgY29kZV8gKz0gImZvciB2YXIgaSBpbiBvYmouIiArIHZhciArICIgeyI7CiAgICAgICAgICAgSW5kZW50KCk7CiAgICAgICAgICAgY29kZV8gKz0KLSAgICAgICAgICAgICAgIl9fIiArIG5hbWUgKyAiX18uYXBwZW5kKCIgKyB0eXBlICsgIi5wYWNrKCZidWlsZGVyLCBvYmo6ICZpKSkiOworICAgICAgICAgICAgICAiX18iICsgdmFyICsgIl9fLmFwcGVuZCgiICsgdHlwZSArICIucGFjaygmYnVpbGRlciwgb2JqOiAmaSkpIjsKICAgICAgICAgICBPdXRkZW50KCk7CiAgICAgICAgICAgY29kZV8gKz0gIn0iOwotICAgICAgICAgIGNvZGVfICs9ICJsZXQgX18iICsgbmFtZSArICIgPSBidWlsZGVyLmNyZWF0ZVZlY3RvcihvZk9mZnNldHM6IF9fIiArCi0gICAgICAgICAgICAgICAgICAgbmFtZSArICJfXykiOworICAgICAgICAgIGNvZGVfICs9ICJsZXQgX18iICsgdmFyICsgIiA9IGJ1aWxkZXIuY3JlYXRlVmVjdG9yKG9mT2Zmc2V0czogX18iICsKKyAgICAgICAgICAgICAgICAgICB2YXIgKyAiX18pIjsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBjb2RlXyArPSAie3tTVFJVQ1ROQU1FfX0uc3RhcnRWZWN0b3JPZiIgKwotICAgICAgICAgICAgICAgICAgIENvbnZlcnRDYXNlKG5hbWUsIENhc2U6OmtVcHBlckNhbWVsKSArICIob2JqLiIgKyBuYW1lICsKLSAgICAgICAgICAgICAgICAgICAiLmNvdW50LCBpbjogJmJ1aWxkZXIpIjsKKyAgICAgICAgICBjb2RlXyArPSAie3tTVFJVQ1ROQU1FfX0uIiArIG5hbWVyXy5NZXRob2QoInN0YXJ0X3ZlY3Rvcl9vZiIsIHZhcikgKworICAgICAgICAgICAgICAgICAgICIob2JqLiIgKyBmaWVsZCArICIuY291bnQsIGluOiAmYnVpbGRlcikiOwogICAgICAgICAgIHN0ZDo6c3RyaW5nIGNvZGU7Ci0gICAgICAgICAgR2VuZXJhdGVTdHJ1Y3RBcmdzKCpmaWVsZC52YWx1ZS50eXBlLnN0cnVjdF9kZWYsICZjb2RlLCAiIiwgIiIsICJfbyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUpOworICAgICAgICAgIEdlbmVyYXRlU3RydWN0QXJncygqZmllbGRfdHlwZS5zdHJ1Y3RfZGVmLCAmY29kZSwgIiIsICIiLCAiX28iLCB0cnVlKTsKICAgICAgICAgICBjb2RlID0gY29kZS5zdWJzdHIoMCwgY29kZS5zaXplKCkgLSAyKTsKLSAgICAgICAgICBjb2RlXyArPSAiZm9yIGkgaW4gb2JqLiIgKyBuYW1lICsgIiB7IjsKKyAgICAgICAgICBjb2RlXyArPSAiZm9yIGkgaW4gb2JqLiIgKyBmaWVsZCArICIgeyI7CiAgICAgICAgICAgSW5kZW50KCk7CiAgICAgICAgICAgY29kZV8gKz0gImd1YXJkIGxldCBfbyA9IGkgZWxzZSB7IGNvbnRpbnVlIH0iOwogICAgICAgICAgIGNvZGVfICs9ICJidWlsZGVyLmNyZWF0ZShzdHJ1Y3Q6IF9vKSI7CiAgICAgICAgICAgT3V0ZGVudCgpOwogICAgICAgICAgIGNvZGVfICs9ICJ9IjsKLSAgICAgICAgICBjb2RlXyArPSAibGV0IF9fIiArIG5hbWUgKyAiID0gYnVpbGRlci5lbmRWZWN0b3IobGVuOiBvYmouIiArIG5hbWUgKworICAgICAgICAgIGNvZGVfICs9ICJsZXQgX18iICsgdmFyICsgIiA9IGJ1aWxkZXIuZW5kVmVjdG9yKGxlbjogb2JqLiIgKyBmaWVsZCArCiAgICAgICAgICAgICAgICAgICAgIi5jb3VudCkiOwogICAgICAgICB9CiAgICAgICAgIGJyZWFrOwogICAgICAgfQogICAgICAgY2FzZSBCQVNFX1RZUEVfU1RSSU5HOiB7Ci0gICAgICAgIGNvZGVfICs9ICJsZXQgX18iICsgbmFtZSArICIgPSBidWlsZGVyLmNyZWF0ZVZlY3RvcihvZlN0cmluZ3M6IG9iai4iICsKLSAgICAgICAgICAgICAgICAgbmFtZSArICIuY29tcGFjdE1hcCh7ICQwIH0pICkiOworICAgICAgICBjb2RlXyArPSAibGV0IF9fIiArIHZhciArICIgPSBidWlsZGVyLmNyZWF0ZVZlY3RvcihvZlN0cmluZ3M6IG9iai4iICsKKyAgICAgICAgICAgICAgICAgdmFyICsgIi5jb21wYWN0TWFwKHsgJDAgfSkgKSI7CiAgICAgICAgIGJyZWFrOwogICAgICAgfQogICAgICAgZGVmYXVsdDogewotICAgICAgICBjb2RlXyArPSAibGV0IF9fIiArIG5hbWUgKyAiID0gYnVpbGRlci5jcmVhdGVWZWN0b3Iob2JqLiIgKyBuYW1lICsgIikiOworICAgICAgICBjb2RlXyArPSAibGV0IF9fIiArIHZhciArICIgPSBidWlsZGVyLmNyZWF0ZVZlY3RvcihvYmouIiArIGZpZWxkICsgIikiOwogICAgICAgICBicmVhazsKICAgICAgIH0KICAgICB9CiAgIH0KIAotICB2b2lkIEJ1aWxkaW5nT3B0aW9uYWxPYmplY3RzKGNvbnN0IHN0ZDo6c3RyaW5nICZuYW1lLAorICB2b2lkIEJ1aWxkaW5nT3B0aW9uYWxPYmplY3RzKGNvbnN0IHN0ZDo6c3RyaW5nICZ2YXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgJmJvZHlfZnJvbnQpIHsKLSAgICBjb2RlXyArPSAibGV0IF9fIiArIG5hbWUgKyAiOiBPZmZzZXQiOwotICAgIGNvZGVfICs9ICJpZiBsZXQgcyA9IG9iai4iICsgbmFtZSArICIgeyI7CisgICAgY29kZV8gKz0gImxldCBfXyIgKyB2YXIgKyAiOiBPZmZzZXQiOworICAgIGNvZGVfICs9ICJpZiBsZXQgcyA9IG9iai4iICsgdmFyICsgIiB7IjsKICAgICBJbmRlbnQoKTsKLSAgICBjb2RlXyArPSAiX18iICsgbmFtZSArICIgPSAiICsgYm9keV9mcm9udDsKKyAgICBjb2RlXyArPSAiX18iICsgdmFyICsgIiA9ICIgKyBib2R5X2Zyb250OwogICAgIE91dGRlbnQoKTsKICAgICBjb2RlXyArPSAifSBlbHNlIHsiOwogICAgIEluZGVudCgpOwotICAgIGNvZGVfICs9ICJfXyIgKyBuYW1lICsgIiA9IE9mZnNldCgpIjsKKyAgICBjb2RlXyArPSAiX18iICsgdmFyICsgIiA9IE9mZnNldCgpIjsKICAgICBPdXRkZW50KCk7CiAgICAgY29kZV8gKz0gIn0iOwogICAgIGNvZGVfICs9ICIiOwpAQCAtMTQ5NywxMjAgKzE1MzQsMTI1IEBACiAgICAgICBjb25zdCBGaWVsZERlZiAmZmllbGQsIGJvb2wgaXNfZml4ZWQsCiAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gJmJ1ZmZlcl9jb25zdHJ1Y3RvciwKICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiAmYmFzZV9jb25zdHJ1Y3RvcikgewotICAgIGF1dG8gbmFtZSA9IE5hbWUoZmllbGQpOwotICAgIGF1dG8gdHlwZSA9IEdlblR5cGUoZmllbGQudmFsdWUudHlwZSk7Ci0gICAgY29kZV8uU2V0VmFsdWUoIlZBTFVFTkFNRSIsIG5hbWUpOworICAgIGNvbnN0IGF1dG8gZmllbGRfZmllbGQgPSBuYW1lcl8uRmllbGQoZmllbGQpOworICAgIGNvbnN0IGF1dG8gZmllbGRfdmFyID0gbmFtZXJfLlZhcmlhYmxlKGZpZWxkKTsKKyAgICBjb25zdCBhdXRvIHR5cGUgPSBHZW5UeXBlKGZpZWxkLnZhbHVlLnR5cGUpOworICAgIGNvZGVfLlNldFZhbHVlKCJGSUVMRFZBUiIsIGZpZWxkX2ZpZWxkKTsKICAgICBjb2RlXy5TZXRWYWx1ZSgiVkFMVUVUWVBFIiwgdHlwZSk7CiAgICAgc3RkOjpzdHJpbmcgaXNfcmVxdWlyZWQgPSBmaWVsZC5Jc1JlcXVpcmVkKCkgPyAiIiA6ICI/IjsKIAogICAgIHN3aXRjaCAoZmllbGQudmFsdWUudHlwZS5iYXNlX3R5cGUpIHsKICAgICAgIGNhc2UgQkFTRV9UWVBFX1NUUlVDVDogewotICAgICAgICB0eXBlID0gR2VuVHlwZShmaWVsZC52YWx1ZS50eXBlLCB0cnVlKTsKLSAgICAgICAgY29kZV8uU2V0VmFsdWUoIlZBTFVFVFlQRSIsIHR5cGUpOwotICAgICAgICBhdXRvIG9wdGlvbmFsID0KKyAgICAgICAgY29uc3QgYXV0byBvYmp0eXBlID0gR2VuVHlwZShmaWVsZC52YWx1ZS50eXBlLCB0cnVlKTsKKyAgICAgICAgY29kZV8uU2V0VmFsdWUoIlZBTFVFVFlQRSIsIG9ianR5cGUpOworICAgICAgICBjb25zdCBhdXRvIG9wdGlvbmFsID0KICAgICAgICAgICAgIChmaWVsZC52YWx1ZS50eXBlLnN0cnVjdF9kZWYgJiYgZmllbGQudmFsdWUudHlwZS5zdHJ1Y3RfZGVmLT5maXhlZCk7CiAgICAgICAgIHN0ZDo6c3RyaW5nIHF1ZXN0aW9uX21hcmsgPQogICAgICAgICAgICAgKGZpZWxkLklzUmVxdWlyZWQoKSB8fCAob3B0aW9uYWwgJiYgaXNfZml4ZWQpID8gIiIgOiAiPyIpOwogCiAgICAgICAgIGNvZGVfICs9Ci0gICAgICAgICAgICAie3tBQ0NFU1NfVFlQRX19IHZhciB7e1ZBTFVFTkFNRX19OiB7e1ZBTFVFVFlQRX19IiArIHF1ZXN0aW9uX21hcms7Ci0gICAgICAgIGJhc2VfY29uc3RydWN0b3IucHVzaF9iYWNrKCIiICsgbmFtZSArICIgPSAiICsgdHlwZSArICIoKSIpOworICAgICAgICAgICAgInt7QUNDRVNTX1RZUEV9fSB2YXIge3tGSUVMRFZBUn19OiB7e1ZBTFVFVFlQRX19IiArIHF1ZXN0aW9uX21hcms7CisgICAgICAgIGJhc2VfY29uc3RydWN0b3IucHVzaF9iYWNrKCIiICsgZmllbGRfdmFyICsgIiA9ICIgKyBvYmp0eXBlICsgIigpIik7CiAKICAgICAgICAgaWYgKGZpZWxkLnZhbHVlLnR5cGUuc3RydWN0X2RlZi0+Zml4ZWQpIHsKLSAgICAgICAgICBidWZmZXJfY29uc3RydWN0b3IucHVzaF9iYWNrKCIiICsgbmFtZSArICIgPSBfdC4iICsgbmFtZSk7CisgICAgICAgICAgYnVmZmVyX2NvbnN0cnVjdG9yLnB1c2hfYmFjaygiIiArIGZpZWxkX3ZhciArICIgPSBfdC4iICsgZmllbGRfZmllbGQpOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGJ1ZmZlcl9jb25zdHJ1Y3Rvci5wdXNoX2JhY2soInZhciBfXyIgKyBuYW1lICsgIiA9IF90LiIgKyBuYW1lKTsKKyAgICAgICAgICBidWZmZXJfY29uc3RydWN0b3IucHVzaF9iYWNrKCJ2YXIgX18iICsgZmllbGRfdmFyICsgIiA9IF90LiIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRfZmllbGQpOwogICAgICAgICAgIGJ1ZmZlcl9jb25zdHJ1Y3Rvci5wdXNoX2JhY2soCi0gICAgICAgICAgICAgICIiICsgbmFtZSArICIgPSBfXyIgKyBuYW1lICsKKyAgICAgICAgICAgICAgIiIgKyBmaWVsZF92YXIgKyAiID0gX18iICsgZmllbGRfdmFyICsKICAgICAgICAgICAgICAgKGZpZWxkLklzUmVxdWlyZWQoKSA/ICIhIiA6IHF1ZXN0aW9uX21hcmspICsgIi51bnBhY2soKSIpOwogICAgICAgICB9CiAgICAgICAgIGJyZWFrOwogICAgICAgfQogICAgICAgY2FzZSBCQVNFX1RZUEVfQVJSQVk6IEZMQVRCVUZGRVJTX0ZBTExUSFJPVUdIKCk7CiAgICAgICBjYXNlIEJBU0VfVFlQRV9WRUNUT1I6IHsKLSAgICAgICAgQnVpbGRPYmplY3RBUElDb25zdHJ1Y3RvckJvZHlWZWN0b3JzKGZpZWxkLCBuYW1lLCBidWZmZXJfY29uc3RydWN0b3IsCisgICAgICAgIEJ1aWxkT2JqZWN0QVBJQ29uc3RydWN0b3JCb2R5VmVjdG9ycyhmaWVsZCwgYnVmZmVyX2NvbnN0cnVjdG9yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZV9jb25zdHJ1Y3RvciwgIiAgICAiKTsKICAgICAgICAgYnJlYWs7CiAgICAgICB9CiAgICAgICBjYXNlIEJBU0VfVFlQRV9TVFJJTkc6IHsKLSAgICAgICAgY29kZV8gKz0gInt7QUNDRVNTX1RZUEV9fSB2YXIge3tWQUxVRU5BTUV9fTogU3RyaW5nIiArIGlzX3JlcXVpcmVkOwotICAgICAgICBidWZmZXJfY29uc3RydWN0b3IucHVzaF9iYWNrKG5hbWUgKyAiID0gX3QuIiArIG5hbWUpOworICAgICAgICBjb2RlXyArPSAie3tBQ0NFU1NfVFlQRX19IHZhciB7e0ZJRUxEVkFSfX06IFN0cmluZyIgKyBpc19yZXF1aXJlZDsKKyAgICAgICAgYnVmZmVyX2NvbnN0cnVjdG9yLnB1c2hfYmFjayhmaWVsZF92YXIgKyAiID0gX3QuIiArIGZpZWxkX2ZpZWxkKTsKIAogICAgICAgICBpZiAoZmllbGQuSXNSZXF1aXJlZCgpKSB7CiAgICAgICAgICAgc3RkOjpzdHJpbmcgZGVmYXVsdF92YWx1ZSA9CiAgICAgICAgICAgICAgIGZpZWxkLklzRGVmYXVsdCgpID8gZmllbGQudmFsdWUuY29uc3RhbnQgOiAiIjsKLSAgICAgICAgICBiYXNlX2NvbnN0cnVjdG9yLnB1c2hfYmFjayhuYW1lICsgIiA9IFwiIiArIGRlZmF1bHRfdmFsdWUgKyAiXCIiKTsKKyAgICAgICAgICBiYXNlX2NvbnN0cnVjdG9yLnB1c2hfYmFjayhmaWVsZF92YXIgKyAiID0gXCIiICsgZGVmYXVsdF92YWx1ZSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlwiIik7CiAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KICAgICAgICAgaWYgKGZpZWxkLklzRGVmYXVsdCgpICYmICFmaWVsZC5Jc1JlcXVpcmVkKCkpIHsKICAgICAgICAgICBzdGQ6OnN0cmluZyB2YWx1ZSA9IGZpZWxkLklzRGVmYXVsdCgpID8gZmllbGQudmFsdWUuY29uc3RhbnQgOiAibmlsIjsKLSAgICAgICAgICBiYXNlX2NvbnN0cnVjdG9yLnB1c2hfYmFjayhuYW1lICsgIiA9IFwiIiArIHZhbHVlICsgIlwiIik7CisgICAgICAgICAgYmFzZV9jb25zdHJ1Y3Rvci5wdXNoX2JhY2soZmllbGRfdmFyICsgIiA9IFwiIiArIHZhbHVlICsgIlwiIik7CiAgICAgICAgIH0KICAgICAgICAgYnJlYWs7CiAgICAgICB9CiAgICAgICBjYXNlIEJBU0VfVFlQRV9VVFlQRTogYnJlYWs7CiAgICAgICBjYXNlIEJBU0VfVFlQRV9VTklPTjogewotICAgICAgICBCdWlsZFVuaW9uRW51bVN3aXRjaENhc2UoKmZpZWxkLnZhbHVlLnR5cGUuZW51bV9kZWYsIG5hbWUsCisgICAgICAgIEJ1aWxkVW5pb25FbnVtU3dpdGNoQ2FzZSgqZmllbGQudmFsdWUudHlwZS5lbnVtX2RlZiwgZmllbGRfdmFyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyX2NvbnN0cnVjdG9yKTsKICAgICAgICAgYnJlYWs7CiAgICAgICB9CiAgICAgICBkZWZhdWx0OiB7Ci0gICAgICAgIGJ1ZmZlcl9jb25zdHJ1Y3Rvci5wdXNoX2JhY2sobmFtZSArICIgPSBfdC4iICsgbmFtZSk7CisgICAgICAgIGJ1ZmZlcl9jb25zdHJ1Y3Rvci5wdXNoX2JhY2soZmllbGRfdmFyICsgIiA9IF90LiIgKyBmaWVsZF9maWVsZCk7CiAgICAgICAgIHN0ZDo6c3RyaW5nIG51bGxhYmxlID0gZmllbGQuSXNPcHRpb25hbCgpID8gIj8iIDogIiI7CiAgICAgICAgIGlmIChJc1NjYWxhcihmaWVsZC52YWx1ZS50eXBlLmJhc2VfdHlwZSkgJiYKICAgICAgICAgICAgICFJc0Jvb2woZmllbGQudmFsdWUudHlwZS5iYXNlX3R5cGUpICYmICFJc0VudW0oZmllbGQudmFsdWUudHlwZSkpIHsKLSAgICAgICAgICBjb2RlXyArPQotICAgICAgICAgICAgICAie3tBQ0NFU1NfVFlQRX19IHZhciB7e1ZBTFVFTkFNRX19OiB7e1ZBTFVFVFlQRX19IiArIG51bGxhYmxlOworICAgICAgICAgIGNvZGVfICs9ICJ7e0FDQ0VTU19UWVBFfX0gdmFyIHt7RklFTERWQVJ9fToge3tWQUxVRVRZUEV9fSIgKyBudWxsYWJsZTsKICAgICAgICAgICBpZiAoIWZpZWxkLklzT3B0aW9uYWwoKSkKLSAgICAgICAgICAgIGJhc2VfY29uc3RydWN0b3IucHVzaF9iYWNrKG5hbWUgKyAiID0gIiArIGZpZWxkLnZhbHVlLmNvbnN0YW50KTsKKyAgICAgICAgICAgIGJhc2VfY29uc3RydWN0b3IucHVzaF9iYWNrKGZpZWxkX3ZhciArICIgPSAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkLnZhbHVlLmNvbnN0YW50KTsKICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogCiAgICAgICAgIGlmIChJc0VudW0oZmllbGQudmFsdWUudHlwZSkpIHsKLSAgICAgICAgICBhdXRvIGRlZmF1bHRfdmFsdWUgPSBJc0VudW0oZmllbGQudmFsdWUudHlwZSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBHZW5FbnVtRGVmYXVsdFZhbHVlKGZpZWxkKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGZpZWxkLnZhbHVlLmNvbnN0YW50OwotICAgICAgICAgIGNvZGVfICs9ICJ7e0FDQ0VTU19UWVBFfX0gdmFyIHt7VkFMVUVOQU1FfX06IHt7VkFMVUVUWVBFfX0iOwotICAgICAgICAgIGJhc2VfY29uc3RydWN0b3IucHVzaF9iYWNrKG5hbWUgKyAiID0gIiArIGRlZmF1bHRfdmFsdWUpOworICAgICAgICAgIGNvbnN0IGF1dG8gZGVmYXVsdF92YWx1ZSA9IElzRW51bShmaWVsZC52YWx1ZS50eXBlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IEdlbkVudW1EZWZhdWx0VmFsdWUoZmllbGQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogZmllbGQudmFsdWUuY29uc3RhbnQ7CisgICAgICAgICAgY29kZV8gKz0gInt7QUNDRVNTX1RZUEV9fSB2YXIge3tGSUVMRFZBUn19OiB7e1ZBTFVFVFlQRX19IjsKKyAgICAgICAgICBiYXNlX2NvbnN0cnVjdG9yLnB1c2hfYmFjayhmaWVsZF92YXIgKyAiID0gIiArIGRlZmF1bHRfdmFsdWUpOwogICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAKICAgICAgICAgaWYgKElzQm9vbChmaWVsZC52YWx1ZS50eXBlLmJhc2VfdHlwZSkpIHsKLSAgICAgICAgICBjb2RlXyArPSAie3tBQ0NFU1NfVFlQRX19IHZhciB7e1ZBTFVFTkFNRX19OiBCb29sIiArIG51bGxhYmxlOworICAgICAgICAgIGNvZGVfICs9ICJ7e0FDQ0VTU19UWVBFfX0gdmFyIHt7RklFTERWQVJ9fTogQm9vbCIgKyBudWxsYWJsZTsKICAgICAgICAgICBzdGQ6OnN0cmluZyBkZWZhdWx0X3ZhbHVlID0KICAgICAgICAgICAgICAgIjAiID09IGZpZWxkLnZhbHVlLmNvbnN0YW50ID8gImZhbHNlIiA6ICJ0cnVlIjsKICAgICAgICAgICBpZiAoIWZpZWxkLklzT3B0aW9uYWwoKSkKLSAgICAgICAgICAgIGJhc2VfY29uc3RydWN0b3IucHVzaF9iYWNrKG5hbWUgKyAiID0gIiArIGRlZmF1bHRfdmFsdWUpOworICAgICAgICAgICAgYmFzZV9jb25zdHJ1Y3Rvci5wdXNoX2JhY2soZmllbGRfdmFyICsgIiA9ICIgKyBkZWZhdWx0X3ZhbHVlKTsKICAgICAgICAgfQogICAgICAgfQogICAgIH0KICAgfQogCiAgIHZvaWQgQnVpbGRPYmplY3RBUElDb25zdHJ1Y3RvckJvZHlWZWN0b3JzKAotICAgICAgY29uc3QgRmllbGREZWYgJmZpZWxkLCBjb25zdCBzdGQ6OnN0cmluZyAmbmFtZSwKLSAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiAmYnVmZmVyX2NvbnN0cnVjdG9yLAorICAgICAgY29uc3QgRmllbGREZWYgJmZpZWxkLCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gJmJ1ZmZlcl9jb25zdHJ1Y3RvciwKICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiAmYmFzZV9jb25zdHJ1Y3RvciwKICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nICZpbmRlbnRhdGlvbikgewotICAgIGF1dG8gdmVjdG9ydHlwZSA9IGZpZWxkLnZhbHVlLnR5cGUuVmVjdG9yVHlwZSgpOworICAgIGNvbnN0IGF1dG8gdmVjdG9ydHlwZSA9IGZpZWxkLnZhbHVlLnR5cGUuVmVjdG9yVHlwZSgpOworICAgIGNvbnN0IGF1dG8gZmllbGRfdmFyID0gbmFtZXJfLkZpZWxkKGZpZWxkKTsKKyAgICBjb25zdCBhdXRvIGZpZWxkX2ZpZWxkID0gbmFtZXJfLkZpZWxkKGZpZWxkKTsKIAogICAgIGlmICh2ZWN0b3J0eXBlLmJhc2VfdHlwZSAhPSBCQVNFX1RZUEVfVVRZUEUpIHsKLSAgICAgIGJ1ZmZlcl9jb25zdHJ1Y3Rvci5wdXNoX2JhY2sobmFtZSArICIgPSBbXSIpOwotICAgICAgYnVmZmVyX2NvbnN0cnVjdG9yLnB1c2hfYmFjaygiZm9yIGluZGV4IGluIDAuLjxfdC4iICsgbmFtZSArICJDb3VudCB7Iik7Ci0gICAgICBiYXNlX2NvbnN0cnVjdG9yLnB1c2hfYmFjayhuYW1lICsgIiA9IFtdIik7CisgICAgICBidWZmZXJfY29uc3RydWN0b3IucHVzaF9iYWNrKGZpZWxkX3ZhciArICIgPSBbXSIpOworICAgICAgYnVmZmVyX2NvbnN0cnVjdG9yLnB1c2hfYmFjaygiZm9yIGluZGV4IGluIDAuLjxfdC4iICsgZmllbGRfZmllbGQgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ291bnQgeyIpOworICAgICAgYmFzZV9jb25zdHJ1Y3Rvci5wdXNoX2JhY2soZmllbGRfdmFyICsgIiA9IFtdIik7CiAgICAgfQogCiAgICAgc3dpdGNoICh2ZWN0b3J0eXBlLmJhc2VfdHlwZSkgewogICAgICAgY2FzZSBCQVNFX1RZUEVfU1RSVUNUOiB7CiAgICAgICAgIGNvZGVfLlNldFZhbHVlKCJWQUxVRVRZUEUiLCBHZW5UeXBlKHZlY3RvcnR5cGUsIHRydWUpKTsKLSAgICAgICAgY29kZV8gKz0gInt7QUNDRVNTX1RZUEV9fSB2YXIge3tWQUxVRU5BTUV9fTogW3t7VkFMVUVUWVBFfX0/XSI7CisgICAgICAgIGNvZGVfICs9ICJ7e0FDQ0VTU19UWVBFfX0gdmFyIHt7RklFTERWQVJ9fTogW3t7VkFMVUVUWVBFfX0/XSI7CiAgICAgICAgIGlmICghdmVjdG9ydHlwZS5zdHJ1Y3RfZGVmLT5maXhlZCkgewotICAgICAgICAgIGJ1ZmZlcl9jb25zdHJ1Y3Rvci5wdXNoX2JhY2soaW5kZW50YXRpb24gKyAidmFyIF9fdl8gPSBfdC4iICsgbmFtZSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKGF0OiBpbmRleCkiKTsKLSAgICAgICAgICBidWZmZXJfY29uc3RydWN0b3IucHVzaF9iYWNrKGluZGVudGF0aW9uICsgbmFtZSArCisgICAgICAgICAgYnVmZmVyX2NvbnN0cnVjdG9yLnB1c2hfYmFjayhpbmRlbnRhdGlvbiArICJ2YXIgX192XyA9IF90LiIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRfZmllbGQgKyAiKGF0OiBpbmRleCkiKTsKKyAgICAgICAgICBidWZmZXJfY29uc3RydWN0b3IucHVzaF9iYWNrKGluZGVudGF0aW9uICsgZmllbGRfdmFyICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIuYXBwZW5kKF9fdl8/LnVucGFjaygpKSIpOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGJ1ZmZlcl9jb25zdHJ1Y3Rvci5wdXNoX2JhY2soaW5kZW50YXRpb24gKyBuYW1lICsgIi5hcHBlbmQoX3QuIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lICsgIihhdDogaW5kZXgpKSIpOworICAgICAgICAgIGJ1ZmZlcl9jb25zdHJ1Y3Rvci5wdXNoX2JhY2soaW5kZW50YXRpb24gKyBmaWVsZF92YXIgKyAiLmFwcGVuZChfdC4iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkX3ZhciArICIoYXQ6IGluZGV4KSkiKTsKICAgICAgICAgfQogICAgICAgICBicmVhazsKICAgICAgIH0KQEAgLTE2MTksNyArMTY2MSw3IEBACiAgICAgICAgIGJyZWFrOwogICAgICAgfQogICAgICAgY2FzZSBCQVNFX1RZUEVfVU5JT046IHsKLSAgICAgICAgQnVpbGRVbmlvbkVudW1Td2l0Y2hDYXNlKCpmaWVsZC52YWx1ZS50eXBlLmVudW1fZGVmLCBuYW1lLAorICAgICAgICBCdWlsZFVuaW9uRW51bVN3aXRjaENhc2UoKmZpZWxkLnZhbHVlLnR5cGUuZW51bV9kZWYsIGZpZWxkX3ZhciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlcl9jb25zdHJ1Y3RvciwgaW5kZW50YXRpb24sIHRydWUpOwogICAgICAgICBicmVhazsKICAgICAgIH0KQEAgLTE2MjgsMTggKzE2NzAsMTggQEAKICAgICAgICAgY29kZV8uU2V0VmFsdWUoCiAgICAgICAgICAgICAiVkFMVUVUWVBFIiwKICAgICAgICAgICAgIChJc1N0cmluZyh2ZWN0b3J0eXBlKSA/ICJTdHJpbmc/IiA6IEdlblR5cGUodmVjdG9ydHlwZSkpKTsKLSAgICAgICAgY29kZV8gKz0gInt7QUNDRVNTX1RZUEV9fSB2YXIge3tWQUxVRU5BTUV9fTogW3t7VkFMVUVUWVBFfX1dIjsKKyAgICAgICAgY29kZV8gKz0gInt7QUNDRVNTX1RZUEV9fSB2YXIge3tGSUVMRFZBUn19OiBbe3tWQUxVRVRZUEV9fV0iOwogCiAgICAgICAgIGlmIChJc0VudW0odmVjdG9ydHlwZSkgJiYgdmVjdG9ydHlwZS5iYXNlX3R5cGUgIT0gQkFTRV9UWVBFX1VOSU9OKSB7Ci0gICAgICAgICAgYXV0byBkZWZhdWx0X3ZhbHVlID0gSXNFbnVtKGZpZWxkLnZhbHVlLnR5cGUpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gR2VuRW51bURlZmF1bHRWYWx1ZShmaWVsZCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBmaWVsZC52YWx1ZS5jb25zdGFudDsKLSAgICAgICAgICBidWZmZXJfY29uc3RydWN0b3IucHVzaF9iYWNrKGluZGVudGF0aW9uICsgbmFtZSArICIuYXBwZW5kKF90LiIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSArICIoYXQ6IGluZGV4KSEpIik7CisgICAgICAgICAgY29uc3QgYXV0byBkZWZhdWx0X3ZhbHVlID0gSXNFbnVtKGZpZWxkLnZhbHVlLnR5cGUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gR2VuRW51bURlZmF1bHRWYWx1ZShmaWVsZCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBmaWVsZC52YWx1ZS5jb25zdGFudDsKKyAgICAgICAgICBidWZmZXJfY29uc3RydWN0b3IucHVzaF9iYWNrKGluZGVudGF0aW9uICsgZmllbGRfdmFyICsgIi5hcHBlbmQoX3QuIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZF9maWVsZCArICIoYXQ6IGluZGV4KSEpIik7CiAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KLSAgICAgICAgYnVmZmVyX2NvbnN0cnVjdG9yLnB1c2hfYmFjayhpbmRlbnRhdGlvbiArIG5hbWUgKyAiLmFwcGVuZChfdC4iICsgbmFtZSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIihhdDogaW5kZXgpKSIpOworICAgICAgICBidWZmZXJfY29uc3RydWN0b3IucHVzaF9iYWNrKGluZGVudGF0aW9uICsgZmllbGRfdmFyICsgIi5hcHBlbmQoX3QuIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRfZmllbGQgKyAiKGF0OiBpbmRleCkpIik7CiAgICAgICAgIGJyZWFrOwogICAgICAgfQogICAgIH0KQEAgLTE2NDcsMTkgKzE2ODksMTcgQEAKICAgICAgIGJ1ZmZlcl9jb25zdHJ1Y3Rvci5wdXNoX2JhY2soIn0iKTsKICAgfQogCi0gIHZvaWQgQnVpbGRVbmlvbkVudW1Td2l0Y2hDYXNlV3JpdHRlcihjb25zdCBFbnVtRGVmICZldikgewotICAgIGF1dG8gZmllbGRfbmFtZSA9IE5hbWUoZXYpOwotICAgIGNvZGVfLlNldFZhbHVlKCJWQUxVRVRZUEUiLCBmaWVsZF9uYW1lKTsKKyAgdm9pZCBCdWlsZFVuaW9uRW51bVN3aXRjaENhc2VXcml0dGVyKGNvbnN0IEVudW1EZWYgJmVkKSB7CiAgICAgY29kZV8gKz0gInN3aXRjaCB0eXBlIHsiOwotICAgIGZvciAoYXV0byBpdCA9IGV2LlZhbHMoKS5iZWdpbigpOyBpdCA8IGV2LlZhbHMoKS5lbmQoKTsgKytpdCkgewotICAgICAgYXV0byBmaWVsZCA9ICoqaXQ7Ci0gICAgICBhdXRvIGV2X25hbWUgPSBOYW1lKGZpZWxkKTsKLSAgICAgIGF1dG8gdHlwZSA9IEdlblR5cGUoZmllbGQudW5pb25fdHlwZSk7Ci0gICAgICBhdXRvIGlzX3N0cnVjdCA9IElzU3RydWN0KGZpZWxkLnVuaW9uX3R5cGUpID8gdHlwZSArIE11dGFibGUoKSA6IHR5cGU7Ci0gICAgICBpZiAoZmllbGQudW5pb25fdHlwZS5iYXNlX3R5cGUgPT0gQkFTRV9UWVBFX05PTkUpIHsgY29udGludWU7IH0KLSAgICAgIGNvZGVfICs9ICJjYXNlIC4iICsgZXZfbmFtZSArICI6IjsKKyAgICBmb3IgKGF1dG8gaXQgPSBlZC5WYWxzKCkuYmVnaW4oKTsgaXQgPCBlZC5WYWxzKCkuZW5kKCk7ICsraXQpIHsKKyAgICAgIGNvbnN0IGF1dG8gZXYgPSAqKml0OworICAgICAgY29uc3QgYXV0byB2YXJpYW50ID0gbmFtZXJfLkxlZ2FjeVN3aWZ0VmFyaWFudChldik7CisgICAgICBjb25zdCBhdXRvIHR5cGUgPSBHZW5UeXBlKGV2LnVuaW9uX3R5cGUpOworICAgICAgY29uc3QgYXV0byBpc19zdHJ1Y3QgPSBJc1N0cnVjdChldi51bmlvbl90eXBlKSA/IHR5cGUgKyBNdXRhYmxlKCkgOiB0eXBlOworICAgICAgaWYgKGV2LnVuaW9uX3R5cGUuYmFzZV90eXBlID09IEJBU0VfVFlQRV9OT05FKSB7IGNvbnRpbnVlOyB9CisgICAgICBjb2RlXyArPSAiY2FzZSAuIiArIHZhcmlhbnQgKyAiOiI7CiAgICAgICBJbmRlbnQoKTsKLSAgICAgIGNvZGVfICs9ICJ2YXIgX19vYmogPSB2YWx1ZSBhcz8gIiArIEdlblR5cGUoZmllbGQudW5pb25fdHlwZSwgdHJ1ZSk7CisgICAgICBjb2RlXyArPSAidmFyIF9fb2JqID0gdmFsdWUgYXM/ICIgKyBHZW5UeXBlKGV2LnVuaW9uX3R5cGUsIHRydWUpOwogICAgICAgY29kZV8gKz0gInJldHVybiAiICsgaXNfc3RydWN0ICsgIi5wYWNrKCZidWlsZGVyLCBvYmo6ICZfX29iaikiOwogICAgICAgT3V0ZGVudCgpOwogICAgIH0KQEAgLTE2NjcsMzQgKzE3MDcsMzQgQEAKICAgICBjb2RlXyArPSAifSI7CiAgIH0KIAotICB2b2lkIEJ1aWxkVW5pb25FbnVtU3dpdGNoQ2FzZShjb25zdCBFbnVtRGVmICZldiwgY29uc3Qgc3RkOjpzdHJpbmcgJm5hbWUsCisgIHZvaWQgQnVpbGRVbmlvbkVudW1Td2l0Y2hDYXNlKGNvbnN0IEVudW1EZWYgJmVkLCBjb25zdCBzdGQ6OnN0cmluZyAmZmllbGQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiAmYnVmZmVyX2NvbnN0cnVjdG9yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyAmaW5kZW50YXRpb24gPSAiIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYm9vbCBpc192ZWN0b3IgPSBmYWxzZSkgewotICAgIGF1dG8gZmllbGRfbmFtZSA9IE5hbWVXcmFwcGVkSW5OYW1lU3BhY2UoZXYpOwotICAgIGNvZGVfLlNldFZhbHVlKCJWQUxVRVRZUEUiLCBmaWVsZF9uYW1lKTsKLSAgICBjb2RlXyArPSAie3tBQ0NFU1NfVFlQRX19IHZhciB7e1ZBTFVFTkFNRX19OiBcXCI7CisgICAgY29uc3QgYXV0byBuc190eXBlID0gbmFtZXJfLk5hbWVzcGFjZWRUeXBlKGVkKTsKKyAgICBjb2RlXy5TZXRWYWx1ZSgiVkFMVUVUWVBFIiwgbnNfdHlwZSk7CisgICAgY29kZV8gKz0gInt7QUNDRVNTX1RZUEV9fSB2YXIge3tGSUVMRFZBUn19OiBcXCI7CiAgICAgY29kZV8gKz0gaXNfdmVjdG9yID8gIlt7e1ZBTFVFVFlQRX19VW5pb24/XSIgOiAie3tWQUxVRVRZUEV9fVVuaW9uPyI7CiAKLSAgICBhdXRvIHZlY3Rvcl9yZWFkZXIgPSBpc192ZWN0b3IgPyAiKGF0OiBpbmRleCIgOiAiIjsKLSAgICBidWZmZXJfY29uc3RydWN0b3IucHVzaF9iYWNrKGluZGVudGF0aW9uICsgInN3aXRjaCBfdC4iICsgbmFtZSArICJUeXBlIiArCisgICAgY29uc3QgYXV0byB2ZWN0b3JfcmVhZGVyID0gaXNfdmVjdG9yID8gIihhdDogaW5kZXgiIDogIiI7CisgICAgYnVmZmVyX2NvbnN0cnVjdG9yLnB1c2hfYmFjayhpbmRlbnRhdGlvbiArICJzd2l0Y2ggX3QuIiArIGZpZWxkICsgIlR5cGUiICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3Rvcl9yZWFkZXIgKyAoaXNfdmVjdG9yID8gIikiIDogIiIpICsgIiB7Iik7CiAKLSAgICBmb3IgKGF1dG8gaXQgPSBldi5WYWxzKCkuYmVnaW4oKTsgaXQgPCBldi5WYWxzKCkuZW5kKCk7ICsraXQpIHsKLSAgICAgIGF1dG8gZmllbGQgPSAqKml0OwotICAgICAgYXV0byBldl9uYW1lID0gTmFtZShmaWVsZCk7Ci0gICAgICBpZiAoZmllbGQudW5pb25fdHlwZS5iYXNlX3R5cGUgPT0gQkFTRV9UWVBFX05PTkUpIHsgY29udGludWU7IH0KLSAgICAgIGF1dG8gdHlwZSA9IElzU3RydWN0KGZpZWxkLnVuaW9uX3R5cGUpCi0gICAgICAgICAgICAgICAgICAgICAgPyBHZW5UeXBlKGZpZWxkLnVuaW9uX3R5cGUpICsgTXV0YWJsZSgpCi0gICAgICAgICAgICAgICAgICAgICAgOiBHZW5UeXBlKGZpZWxkLnVuaW9uX3R5cGUpOwotICAgICAgYnVmZmVyX2NvbnN0cnVjdG9yLnB1c2hfYmFjayhpbmRlbnRhdGlvbiArICJjYXNlIC4iICsgZXZfbmFtZSArICI6Iik7CisgICAgZm9yIChhdXRvIGl0ID0gZWQuVmFscygpLmJlZ2luKCk7IGl0IDwgZWQuVmFscygpLmVuZCgpOyArK2l0KSB7CisgICAgICBjb25zdCBhdXRvIGV2ID0gKippdDsKKyAgICAgIGNvbnN0IGF1dG8gdmFyaWFudCA9IG5hbWVyXy5MZWdhY3lTd2lmdFZhcmlhbnQoZXYpOworICAgICAgaWYgKGV2LnVuaW9uX3R5cGUuYmFzZV90eXBlID09IEJBU0VfVFlQRV9OT05FKSB7IGNvbnRpbnVlOyB9CisgICAgICBjb25zdCBhdXRvIHR5cGUgPSBJc1N0cnVjdChldi51bmlvbl90eXBlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gR2VuVHlwZShldi51bmlvbl90eXBlKSArIE11dGFibGUoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogR2VuVHlwZShldi51bmlvbl90eXBlKTsKKyAgICAgIGJ1ZmZlcl9jb25zdHJ1Y3Rvci5wdXNoX2JhY2soaW5kZW50YXRpb24gKyAiY2FzZSAuIiArIHZhcmlhbnQgKyAiOiIpOwogICAgICAgYnVmZmVyX2NvbnN0cnVjdG9yLnB1c2hfYmFjaygKLSAgICAgICAgICBpbmRlbnRhdGlvbiArICIgIHZhciBfdiA9IF90LiIgKyBuYW1lICsgKGlzX3ZlY3RvciA/ICIiIDogIigiKSArCisgICAgICAgICAgaW5kZW50YXRpb24gKyAiICB2YXIgX3YgPSBfdC4iICsgZmllbGQgKyAoaXNfdmVjdG9yID8gIiIgOiAiKCIpICsKICAgICAgICAgICB2ZWN0b3JfcmVhZGVyICsgKGlzX3ZlY3RvciA/ICIsICIgOiAiIikgKyAidHlwZTogIiArIHR5cGUgKyAiLnNlbGYpIik7Ci0gICAgICBhdXRvIGNvbnN0cnVjdG9yID0KLSAgICAgICAgICBmaWVsZF9uYW1lICsgIlVuaW9uKF92Py51bnBhY2soKSwgdHlwZTogLiIgKyBldl9uYW1lICsgIikiOworICAgICAgY29uc3QgYXV0byBjb25zdHJ1Y3RvciA9CisgICAgICAgICAgbnNfdHlwZSArICJVbmlvbihfdj8udW5wYWNrKCksIHR5cGU6IC4iICsgdmFyaWFudCArICIpIjsKICAgICAgIGJ1ZmZlcl9jb25zdHJ1Y3Rvci5wdXNoX2JhY2soCi0gICAgICAgICAgaW5kZW50YXRpb24gKyAiICAiICsgbmFtZSArCisgICAgICAgICAgaW5kZW50YXRpb24gKyAiICAiICsgZmllbGQgKwogICAgICAgICAgIChpc192ZWN0b3IgPyAiLmFwcGVuZCgiICsgY29uc3RydWN0b3IgKyAiKSIgOiAiID0gIiArIGNvbnN0cnVjdG9yKSk7CiAgICAgfQogICAgIGJ1ZmZlcl9jb25zdHJ1Y3Rvci5wdXNoX2JhY2soaW5kZW50YXRpb24gKyAiZGVmYXVsdDogYnJlYWsiKTsKQEAgLTE3MDIsMTMgKzE3NDIsMTQgQEAKICAgfQogCiAgIHZvaWQgQWRkTWluT3JNYXhFbnVtVmFsdWUoY29uc3Qgc3RkOjpzdHJpbmcgJnN0ciwgY29uc3Qgc3RkOjpzdHJpbmcgJnR5cGUpIHsKLSAgICBhdXRvIGN1cnJlbnRfdmFsdWUgPSBzdHI7CisgICAgY29uc3QgYXV0byBjdXJyZW50X3ZhbHVlID0gc3RyOwogICAgIGNvZGVfLlNldFZhbHVlKHR5cGUsIGN1cnJlbnRfdmFsdWUpOwogICAgIGNvZGVfICs9ICJ7e0FDQ0VTU19UWVBFfX0gc3RhdGljIHZhciAiICsgdHlwZSArCiAgICAgICAgICAgICAgIjoge3tFTlVNX05BTUV9fSB7IHJldHVybiAue3siICsgdHlwZSArICJ9fSB9IjsKICAgfQogCi0gIHZvaWQgR2VuTG9va3VwKGNvbnN0IEZpZWxkRGVmICZrZXlfZmllbGQpIHsKKyAgdm9pZCBHZW5Mb29rdXAoY29uc3QgRmllbGREZWYgJmtleV9maWVsZCwgY29uc3Qgc3RkOjpzdHJpbmcgJnN0cnVjdF90eXBlKSB7CisgICAgY29kZV8uU2V0VmFsdWUoIlNUUlVDVFRZUEUiLCBzdHJ1Y3RfdHlwZSk7CiAgICAgY29kZV8uU2V0VmFsdWUoIk9GRlNFVCIsIE51bVRvU3RyaW5nKGtleV9maWVsZC52YWx1ZS5vZmZzZXQpKTsKICAgICBzdGQ6OnN0cmluZyBvZmZzZXRfcmVhZGVyID0KICAgICAgICAgIlRhYmxlLm9mZnNldChJbnQzMihmYmIuY2FwYWNpdHkpIC0gdGFibGVPZmZzZXQsIHZPZmZzZXQ6IHt7T0ZGU0VUfX0sICIKQEAgLTE3MTgsNyArMTc1OSw3IEBACiAgICAgY29kZV8gKz0KICAgICAgICAgImZpbGVwcml2YXRlIHN0YXRpYyBmdW5jIGxvb2t1cEJ5S2V5KHZlY3RvcjogSW50MzIsIGtleToge3tUWVBFfX0sICIKICAgICAgICAgImZiYjogIgotICAgICAgICAiQnl0ZUJ1ZmZlcikgLT4ge3tWQUxVRU5BTUV9fT8geyI7CisgICAgICAgICJCeXRlQnVmZmVyKSAtPiB7e1NUUlVDVFRZUEV9fT8geyI7CiAgICAgSW5kZW50KCk7CiAgICAgaWYgKElzU3RyaW5nKGtleV9maWVsZC52YWx1ZS50eXBlKSkKICAgICAgIGNvZGVfICs9ICJsZXQga2V5ID0ga2V5LnV0ZjgubWFwIHsgJDAgfSI7CkBAIC0xNzQ4LDcgKzE3ODksNyBAQAogICAgIE91dGRlbnQoKTsKICAgICBjb2RlXyArPSAifSBlbHNlIHsiOwogICAgIEluZGVudCgpOwotICAgIGNvZGVfICs9ICJyZXR1cm4ge3tWQUxVRU5BTUV9fShmYmIsIG86IHRhYmxlT2Zmc2V0KSI7CisgICAgY29kZV8gKz0gInJldHVybiB7e1NUUlVDVFRZUEV9fShmYmIsIG86IHRhYmxlT2Zmc2V0KSI7CiAgICAgT3V0ZGVudCgpOwogICAgIGNvZGVfICs9ICJ9IjsKICAgICBPdXRkZW50KCk7CkBAIC0xNzYyLDcgKzE4MDMsNyBAQAogICAgIGlmIChmaWVsZC5wYWRkaW5nKSB7CiAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDQ7IGkrKykgewogICAgICAgICBpZiAoc3RhdGljX2Nhc3Q8aW50PihmaWVsZC5wYWRkaW5nKSAmICgxIDw8IGkpKSB7Ci0gICAgICAgICAgYXV0byBiaXRzID0gKDEgPDwgaSkgKiA4OworICAgICAgICAgIGNvbnN0IGF1dG8gYml0cyA9ICgxIDw8IGkpICogODsKICAgICAgICAgICBjb2RlXyArPSAicHJpdmF0ZSBsZXQgcGFkZGluZyIgKyBOdW1Ub1N0cmluZygoKmlkKSsrKSArICJfXzogVUludCIgKwogICAgICAgICAgICAgICAgICAgIE51bVRvU3RyaW5nKGJpdHMpICsgIiA9IDAiOwogICAgICAgICB9CkBAIC0xNzg0LDggKzE4MjUsNyBAQAogICB9CiAKICAgc3RkOjpzdHJpbmcgR2VuUmVhZGVyTWFpbkJvZHkoY29uc3Qgc3RkOjpzdHJpbmcgJm9wdGlvbmFsID0gIiIpIHsKLSAgICByZXR1cm4gInt7QUNDRVNTX1RZUEV9fSB2YXIge3tWQUxVRU5BTUV9fToge3tWQUxVRVRZUEV9fSIgKyBvcHRpb25hbCArCi0gICAgICAgICAgICIgeyAiOworICAgIHJldHVybiAie3tBQ0NFU1NfVFlQRX19IHZhciB7e0ZJRUxEVkFSfX06IHt7VkFMVUVUWVBFfX0iICsgb3B0aW9uYWwgKyAiIHsgIjsKICAgfQogCiAgIHN0ZDo6c3RyaW5nIEdlblJlYWRlcihjb25zdCBzdGQ6OnN0cmluZyAmdHlwZSwKQEAgLTE3OTksMzYgKzE4MzksMzMgQEAKIAogICBzdGQ6OnN0cmluZyBHZW5NdXRhdGUoY29uc3Qgc3RkOjpzdHJpbmcgJm9mZnNldCwKICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nICZnZXRfb2Zmc2V0LCBib29sIGlzUmF3ID0gZmFsc2UpIHsKLSAgICByZXR1cm4gIkBkaXNjYXJkYWJsZVJlc3VsdCB7e0FDQ0VTU19UWVBFfX0gZnVuYyBtdXRhdGUoe3tWQUxVRU5BTUV9fTogIgorICAgIHJldHVybiAiQGRpc2NhcmRhYmxlUmVzdWx0IHt7QUNDRVNTX1RZUEV9fSBmdW5jIG11dGF0ZSh7e0ZJRUxEVkFSfX06ICIKICAgICAgICAgICAgInt7VkFMVUVUWVBFfX0pIC0+IEJvb2wgeyIgKwotICAgICAgICAgICBnZXRfb2Zmc2V0ICsgIiByZXR1cm4ge3tBQ0NFU1N9fS5tdXRhdGUoe3tWQUxVRU5BTUV9fSIgKworICAgICAgICAgICBnZXRfb2Zmc2V0ICsgIiByZXR1cm4ge3tBQ0NFU1N9fS5tdXRhdGUoe3tGSUVMRFZBUn19IiArCiAgICAgICAgICAgIChpc1JhdyA/ICIucmF3VmFsdWUiIDogIiIpICsgIiwgaW5kZXg6ICIgKyBvZmZzZXQgKyAiKSB9IjsKICAgfQogCiAgIHN0ZDo6c3RyaW5nIEdlbk11dGF0ZUFycmF5KCkgewotICAgIHJldHVybiAie3tBQ0NFU1NfVFlQRX19IGZ1bmMgbXV0YXRlKHt7VkFMVUVOQU1FfX06IHt7VkFMVUVUWVBFfX0sIGF0ICIKLSAgICAgICAgICAgImluZGV4OiAiCi0gICAgICAgICAgICJJbnQzMikgLT4gQm9vbCB7ICIgKworICAgIHJldHVybiAie3tBQ0NFU1NfVFlQRX19IGZ1bmMgbXV0YXRlKHt7RklFTERWQVJ9fToge3tWQUxVRVRZUEV9fSwgYXQgIgorICAgICAgICAgICAiaW5kZXg6IEludDMyKSAtPiBCb29sIHsgIiArCiAgICAgICAgICAgIEdlbk9mZnNldCgpICsKLSAgICAgICAgICAgInJldHVybiB7e0FDQ0VTU319LmRpcmVjdE11dGF0ZSh7e1ZBTFVFTkFNRX19LCBpbmRleDogIgorICAgICAgICAgICAicmV0dXJuIHt7QUNDRVNTfX0uZGlyZWN0TXV0YXRlKHt7RklFTERWQVJ9fSwgaW5kZXg6ICIKICAgICAgICAgICAgInt7QUNDRVNTfX0udmVjdG9yKGF0OiBvKSArIGluZGV4ICoge3tTSVpFfX0pIH0iOwogICB9CiAKICAgc3RkOjpzdHJpbmcgR2VuRW51bURlZmF1bHRWYWx1ZShjb25zdCBGaWVsZERlZiAmZmllbGQpIHsKLSAgICBhdXRvICZ2YWx1ZSA9IGZpZWxkLnZhbHVlOworICAgIGNvbnN0IGF1dG8gJnZhbHVlID0gZmllbGQudmFsdWU7CiAgICAgRkxBVEJVRkZFUlNfQVNTRVJUKHZhbHVlLnR5cGUuZW51bV9kZWYpOwotICAgIGF1dG8gJmVudW1fZGVmID0gKnZhbHVlLnR5cGUuZW51bV9kZWY7CisgICAgY29uc3QgYXV0byAmZW51bV9kZWYgPSAqdmFsdWUudHlwZS5lbnVtX2RlZjsKICAgICAvLyBWZWN0b3Igb2YgZW51bSBkZWZhdWx0cyBhcmUgYWx3YXlzICJbXSIgd2hpY2ggbmV2ZXIgd29ya3MuCiAgICAgY29uc3Qgc3RkOjpzdHJpbmcgY29uc3RhbnQgPSBJc1ZlY3Rvcih2YWx1ZS50eXBlKSA/ICIwIiA6IHZhbHVlLmNvbnN0YW50OwotICAgIGF1dG8gZW51bV92YWwgPSBlbnVtX2RlZi5GaW5kQnlWYWx1ZShjb25zdGFudCk7Ci0gICAgc3RkOjpzdHJpbmcgbmFtZTsKKyAgICBjb25zdCBhdXRvIGVudW1fdmFsID0gZW51bV9kZWYuRmluZEJ5VmFsdWUoY29uc3RhbnQpOwogICAgIGlmIChlbnVtX3ZhbCkgewotICAgICAgbmFtZSA9IE5hbWUoKmVudW1fdmFsKTsKKyAgICAgIHJldHVybiAiLiIgKyBuYW1lcl8uTGVnYWN5U3dpZnRWYXJpYW50KCplbnVtX3ZhbCk7CiAgICAgfSBlbHNlIHsKICAgICAgIGNvbnN0IGF1dG8gJmV2ID0gKiplbnVtX2RlZi5WYWxzKCkuYmVnaW4oKTsKLSAgICAgIG5hbWUgPSBOYW1lKGV2KTsKKyAgICAgIHJldHVybiAiLiIgKyBuYW1lcl8uTGVnYWN5U3dpZnRWYXJpYW50KGV2KTsKICAgICB9Ci0gICAgcmV0dXJuICIuIiArIG5hbWU7CiAgIH0KIAogICBzdGQ6OnN0cmluZyBHZW5FbnVtQ29uc3RydWN0b3IoY29uc3Qgc3RkOjpzdHJpbmcgJmF0KSB7CkBAIC0xODM2LDE1ICsxODczLDE0IEBACiAgIH0KIAogICBzdGQ6OnN0cmluZyBWYWxpZGF0ZUZ1bmMoKSB7Ci0gICAgcmV0dXJuICJzdGF0aWMgZnVuYyB2YWxpZGF0ZVZlcnNpb24oKSB7IEZsYXRCdWZmZXJzVmVyc2lvbl8yXzBfMCgpIH0iOworICAgIHJldHVybiAic3RhdGljIGZ1bmMgdmFsaWRhdGVWZXJzaW9uKCkgeyBGbGF0QnVmZmVyc1ZlcnNpb25fMl8wXzgoKSB9IjsKICAgfQogCiAgIHN0ZDo6c3RyaW5nIEdlblR5cGUoY29uc3QgVHlwZSAmdHlwZSwKICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBib29sIHNob3VsZF9jb25zaWRlcl9zdWZmaXggPSBmYWxzZSkgY29uc3QgewotICAgIHJldHVybiBJc1NjYWxhcih0eXBlLmJhc2VfdHlwZSkKLSAgICAgICAgICAgICAgID8gR2VuVHlwZUJhc2ljKHR5cGUpCi0gICAgICAgICAgICAgICA6IChJc0FycmF5KHR5cGUpID8gR2VuVHlwZSh0eXBlLlZlY3RvclR5cGUoKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBHZW5UeXBlUG9pbnRlcih0eXBlLCBzaG91bGRfY29uc2lkZXJfc3VmZml4KSk7CisgICAgcmV0dXJuIElzU2NhbGFyKHR5cGUuYmFzZV90eXBlKSA/IEdlblR5cGVCYXNpYyh0eXBlKQorICAgICAgICAgICA6IElzQXJyYXkodHlwZSkgICAgICAgICAgPyBHZW5UeXBlKHR5cGUuVmVjdG9yVHlwZSgpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBHZW5UeXBlUG9pbnRlcih0eXBlLCBzaG91bGRfY29uc2lkZXJfc3VmZml4KTsKICAgfQogCiAgIHN0ZDo6c3RyaW5nIEdlblR5cGVQb2ludGVyKGNvbnN0IFR5cGUgJnR5cGUsCkBAIC0xODUzLDEyICsxODg5LDExIEBACiAgICAgICBjYXNlIEJBU0VfVFlQRV9TVFJJTkc6IHJldHVybiAiU3RyaW5nIjsKICAgICAgIGNhc2UgQkFTRV9UWVBFX1ZFQ1RPUjogcmV0dXJuIEdlblR5cGUodHlwZS5WZWN0b3JUeXBlKCkpOwogICAgICAgY2FzZSBCQVNFX1RZUEVfU1RSVUNUOiB7Ci0gICAgICAgIGF1dG8gJnN0cnVjdF8gPSAqdHlwZS5zdHJ1Y3RfZGVmOwotICAgICAgICBpZiAoc2hvdWxkX2NvbnNpZGVyX3N1ZmZpeCAmJiAhc3RydWN0Xy5maXhlZCkgewotICAgICAgICAgIHJldHVybiBXcmFwSW5OYW1lU3BhY2Uoc3RydWN0Xy5kZWZpbmVkX25hbWVzcGFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdEFQSU5hbWUoTmFtZShzdHJ1Y3RfKSkpOworICAgICAgICBjb25zdCBhdXRvICZzZCA9ICp0eXBlLnN0cnVjdF9kZWY7CisgICAgICAgIGlmIChzaG91bGRfY29uc2lkZXJfc3VmZml4ICYmICFzZC5maXhlZCkgeworICAgICAgICAgIHJldHVybiBuYW1lcl8uTmFtZXNwYWNlZE9iamVjdFR5cGUoc2QpOwogICAgICAgICB9Ci0gICAgICAgIHJldHVybiBXcmFwSW5OYW1lU3BhY2Uoc3RydWN0Xy5kZWZpbmVkX25hbWVzcGFjZSwgTmFtZShzdHJ1Y3RfKSk7CisgICAgICAgIHJldHVybiBuYW1lcl8uTmFtZXNwYWNlZFR5cGUoc2QpOwogICAgICAgfQogICAgICAgY2FzZSBCQVNFX1RZUEVfVU5JT046CiAgICAgICBkZWZhdWx0OiByZXR1cm4gIkZsYXRidWZmZXJzSW5pdGlhbGl6YWJsZSI7CkBAIC0xODY5LDIyICsxOTA0LDEwIEBACiAgICAgcmV0dXJuIEdlblR5cGVCYXNpYyh0eXBlLCB0cnVlKTsKICAgfQogCi0gIHN0ZDo6c3RyaW5nIE9iamVjdEFQSU5hbWUoY29uc3Qgc3RkOjpzdHJpbmcgJm5hbWUpIGNvbnN0IHsKLSAgICByZXR1cm4gcGFyc2VyXy5vcHRzLm9iamVjdF9wcmVmaXggKyBuYW1lICsgcGFyc2VyXy5vcHRzLm9iamVjdF9zdWZmaXg7Ci0gIH0KLQogICB2b2lkIEluZGVudCgpIHsgY29kZV8uSW5jcmVtZW50SWRlbnRMZXZlbCgpOyB9CiAKICAgdm9pZCBPdXRkZW50KCkgeyBjb2RlXy5EZWNyZW1lbnRJZGVudExldmVsKCk7IH0KIAotICBzdGQ6OnN0cmluZyBOYW1lV3JhcHBlZEluTmFtZVNwYWNlKGNvbnN0IEVudW1EZWYgJmVudW1fZGVmKSBjb25zdCB7Ci0gICAgcmV0dXJuIFdyYXBJbk5hbWVTcGFjZShlbnVtX2RlZi5kZWZpbmVkX25hbWVzcGFjZSwgTmFtZShlbnVtX2RlZikpOwotICB9Ci0KLSAgc3RkOjpzdHJpbmcgTmFtZVdyYXBwZWRJbk5hbWVTcGFjZShjb25zdCBTdHJ1Y3REZWYgJnN0cnVjdF9kZWYpIGNvbnN0IHsKLSAgICByZXR1cm4gV3JhcEluTmFtZVNwYWNlKHN0cnVjdF9kZWYuZGVmaW5lZF9uYW1lc3BhY2UsIE5hbWUoc3RydWN0X2RlZikpOwotICB9Ci0KICAgc3RkOjpzdHJpbmcgR2VuVHlwZUJhc2ljKGNvbnN0IFR5cGUgJnR5cGUsIGJvb2wgY2FuX292ZXJyaWRlKSBjb25zdCB7CiAgICAgLy8gY2xhbmctZm9ybWF0IG9mZgogICAgIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3Qgc3dpZnRfdHlwZVtdID0gewpAQCAtMTg5NiwyOSArMTkxOSwxNSBAQAogICAgIH07CiAgICAgLy8gY2xhbmctZm9ybWF0IG9uCiAgICAgaWYgKGNhbl9vdmVycmlkZSkgewotICAgICAgaWYgKHR5cGUuZW51bV9kZWYpIHJldHVybiBOYW1lV3JhcHBlZEluTmFtZVNwYWNlKCp0eXBlLmVudW1fZGVmKTsKKyAgICAgIGlmICh0eXBlLmVudW1fZGVmKSByZXR1cm4gbmFtZXJfLk5hbWVzcGFjZWRUeXBlKCp0eXBlLmVudW1fZGVmKTsKICAgICAgIGlmICh0eXBlLmJhc2VfdHlwZSA9PSBCQVNFX1RZUEVfQk9PTCkgcmV0dXJuICJCb29sIjsKICAgICB9CiAgICAgcmV0dXJuIHN3aWZ0X3R5cGVbc3RhdGljX2Nhc3Q8aW50Pih0eXBlLmJhc2VfdHlwZSldOwogICB9CiAKLSAgc3RkOjpzdHJpbmcgRXNjYXBlS2V5d29yZChjb25zdCBzdGQ6OnN0cmluZyAmbmFtZSkgY29uc3QgewotICAgIHJldHVybiBrZXl3b3Jkc18uZmluZChuYW1lKSA9PSBrZXl3b3Jkc18uZW5kKCkgPyBuYW1lIDogbmFtZSArICJfIjsKLSAgfQotCiAgIHN0ZDo6c3RyaW5nIE11dGFibGUoKSBjb25zdCB7IHJldHVybiAiX011dGFibGUiOyB9CiAKLSAgc3RkOjpzdHJpbmcgTmFtZShjb25zdCBFbnVtVmFsICZldikgY29uc3QgewotICAgIGF1dG8gbmFtZSA9IGV2Lm5hbWU7Ci0gICAgaWYgKGlzdXBwZXIobmFtZS5mcm9udCgpKSkgewotICAgICAgc3RkOjp0cmFuc2Zvcm0obmFtZS5iZWdpbigpLCBuYW1lLmVuZCgpLCBuYW1lLmJlZ2luKCksIENoYXJUb0xvd2VyKTsKLSAgICB9Ci0gICAgcmV0dXJuIEVzY2FwZUtleXdvcmQoQ29udmVydENhc2UobmFtZSwgQ2FzZTo6a0xvd2VyQ2FtZWwpKTsKLSAgfQotCi0gIHN0ZDo6c3RyaW5nIE5hbWUoY29uc3QgRGVmaW5pdGlvbiAmZGVmKSBjb25zdCB7Ci0gICAgcmV0dXJuIEVzY2FwZUtleXdvcmQoQ29udmVydENhc2UoZGVmLm5hbWUsIENhc2U6OmtMb3dlckNhbWVsKSk7Ci0gIH0KKyAgSWRsTmFtZXIgbmFtZXJfOwogfTsKIH0gIC8vIG5hbWVzcGFjZSBzd2lmdAogYm9vbCBHZW5lcmF0ZVN3aWZ0KGNvbnN0IFBhcnNlciAmcGFyc2VyLCBjb25zdCBzdGQ6OnN0cmluZyAmcGF0aCwKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3NyYy9pZGxfZ2VuX3RleHQuY3BwIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvc3JjL2lkbF9nZW5fdGV4dC5jcHAKaW5kZXggODA1ZTkzNC4uM2I2OWM5NSAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvc3JjL2lkbF9nZW5fdGV4dC5jcHAKKysrIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvc3JjL2lkbF9nZW5fdGV4dC5jcHAKQEAgLTI0OCwxMSArMjQ4LDIzIEBACiAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CiAgIGJvb2wgR2VuRmllbGQoY29uc3QgRmllbGREZWYgJmZkLCBjb25zdCBUYWJsZSAqdGFibGUsIGJvb2wgZml4ZWQsCiAgICAgICAgICAgICAgICAgaW50IGluZGVudCkgewotICAgIHJldHVybiBQcmludFNjYWxhcigKLSAgICAgICAgZml4ZWQgPyByZWludGVycHJldF9jYXN0PGNvbnN0IFN0cnVjdCAqPih0YWJsZSktPkdldEZpZWxkPFQ+KAotICAgICAgICAgICAgICAgICAgICBmZC52YWx1ZS5vZmZzZXQpCi0gICAgICAgICAgICAgIDogdGFibGUtPkdldEZpZWxkPFQ+KGZkLnZhbHVlLm9mZnNldCwgR2V0RmllbGREZWZhdWx0PFQ+KGZkKSksCi0gICAgICAgIGZkLnZhbHVlLnR5cGUsIGluZGVudCk7CisgICAgaWYgKGZpeGVkKSB7CisgICAgICByZXR1cm4gUHJpbnRTY2FsYXIoCisgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBTdHJ1Y3QgKj4odGFibGUpLT5HZXRGaWVsZDxUPihmZC52YWx1ZS5vZmZzZXQpLAorICAgICAgICAgIGZkLnZhbHVlLnR5cGUsIGluZGVudCk7CisgICAgfSBlbHNlIGlmIChmZC5Jc09wdGlvbmFsKCkpIHsKKyAgICAgIGF1dG8gb3B0ID0gdGFibGUtPkdldE9wdGlvbmFsPFQsIFQ+KGZkLnZhbHVlLm9mZnNldCk7CisgICAgICBpZiAob3B0KSB7CisgICAgICAgIHJldHVybiBQcmludFNjYWxhcigqb3B0LCBmZC52YWx1ZS50eXBlLCBpbmRlbnQpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgdGV4dCArPSAibnVsbCI7CisgICAgICAgIHJldHVybiB0cnVlOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICByZXR1cm4gUHJpbnRTY2FsYXIoCisgICAgICAgICAgdGFibGUtPkdldEZpZWxkPFQ+KGZkLnZhbHVlLm9mZnNldCwgR2V0RmllbGREZWZhdWx0PFQ+KGZkKSksCisgICAgICAgICAgZmQudmFsdWUudHlwZSwgaW5kZW50KTsKKyAgICB9CiAgIH0KIAogICAvLyBHZW5lcmF0ZSB0ZXh0IGZvciBub24tc2NhbGFyIGZpZWxkLgpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvc3JjL2lkbF9nZW5fdHMuY3BwIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvc3JjL2lkbF9nZW5fdHMuY3BwCmluZGV4IGI5NzE1NGMuLjMyYWI4NjMgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3NyYy9pZGxfZ2VuX3RzLmNwcAorKysgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy9zcmMvaWRsX2dlbl90cy5jcHAKQEAgLTE0LDcgKzE0LDYgQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKLS8vIGluZGVwZW5kZW50IGZyb20gaWRsX3BhcnNlciwgc2luY2UgdGhpcyBjb2RlIGlzIG5vdCBuZWVkZWQgZm9yIG1vc3QgY2xpZW50cwogI2luY2x1ZGUgPGFsZ29yaXRobT4KICNpbmNsdWRlIDxjYXNzZXJ0PgogI2luY2x1ZGUgPHVub3JkZXJlZF9tYXA+CkBAIC0yNCwyMSArMjMsNjcgQEAKICNpbmNsdWRlICJmbGF0YnVmZmVycy9mbGF0YnVmZmVycy5oIgogI2luY2x1ZGUgImZsYXRidWZmZXJzL2lkbC5oIgogI2luY2x1ZGUgImZsYXRidWZmZXJzL3V0aWwuaCIKKyNpbmNsdWRlICJpZGxfbmFtZXIuaCIKIAogbmFtZXNwYWNlIGZsYXRidWZmZXJzIHsKLQorbmFtZXNwYWNlIHsKIHN0cnVjdCBJbXBvcnREZWZpbml0aW9uIHsKICAgc3RkOjpzdHJpbmcgbmFtZTsKICAgc3RkOjpzdHJpbmcgaW1wb3J0X3N0YXRlbWVudDsKICAgc3RkOjpzdHJpbmcgZXhwb3J0X3N0YXRlbWVudDsKICAgc3RkOjpzdHJpbmcgYmFyZV9maWxlX3BhdGg7CiAgIHN0ZDo6c3RyaW5nIHJlbF9maWxlX3BhdGg7CisgIHN0ZDo6c3RyaW5nIG9iamVjdF9uYW1lOwogICBjb25zdCBEZWZpbml0aW9uICpkZXBlbmRlbnQgPSBudWxscHRyOwogICBjb25zdCBEZWZpbml0aW9uICpkZXBlbmRlbmN5ID0gbnVsbHB0cjsKIH07CiAKK05hbWVyOjpDb25maWcgVHlwZVNjcmlwdERlZmF1bHRDb25maWcoKSB7CisgIHJldHVybiB7IC8qdHlwZXM9Ki9DYXNlOjprS2VlcCwKKyAgICAgICAgICAgLypjb25zdGFudHM9Ki9DYXNlOjprVW5rbm93biwKKyAgICAgICAgICAgLyptZXRob2RzPSovQ2FzZTo6a0xvd2VyQ2FtZWwsCisgICAgICAgICAgIC8qZnVuY3Rpb25zPSovQ2FzZTo6a0xvd2VyQ2FtZWwsCisgICAgICAgICAgIC8qZmllbGRzPSovQ2FzZTo6a0xvd2VyQ2FtZWwsCisgICAgICAgICAgIC8qdmFyaWFibGVzPSovQ2FzZTo6a0xvd2VyQ2FtZWwsCisgICAgICAgICAgIC8qdmFyaWFudHM9Ki9DYXNlOjprS2VlcCwKKyAgICAgICAgICAgLyplbnVtX3ZhcmlhbnRfc2VwZXJhdG9yPSovIjo6IiwKKyAgICAgICAgICAgLyplc2NhcGVfa2V5d29yZHM9Ki9OYW1lcjo6Q29uZmlnOjpFc2NhcGU6OkFmdGVyQ29udmVydGluZ0Nhc2UsCisgICAgICAgICAgIC8qbmFtZXNwYWNlcz0qL0Nhc2U6OmtLZWVwLAorICAgICAgICAgICAvKm5hbWVzcGFjZV9zZXBlcmF0b3I9Ki8iXyIsCisgICAgICAgICAgIC8qb2JqZWN0X3ByZWZpeD0qLyIiLAorICAgICAgICAgICAvKm9iamVjdF9zdWZmaXg9Ki8iVCIsCisgICAgICAgICAgIC8qa2V5d29yZF9wcmVmaXg9Ki8iIiwKKyAgICAgICAgICAgLyprZXl3b3JkX3N1ZmZpeD0qLyJfIiwKKyAgICAgICAgICAgLypmaWxlbmFtZXM9Ki9DYXNlOjprRGFzaGVyLAorICAgICAgICAgICAvKmRpcmVjdG9yaWVzPSovQ2FzZTo6a0Rhc2hlciwKKyAgICAgICAgICAgLypvdXRwdXRfcGF0aD0qLyIiLAorICAgICAgICAgICAvKmZpbGVuYW1lX3N1ZmZpeD0qLyJfZ2VuZXJhdGVkIiwKKyAgICAgICAgICAgLypmaWxlbmFtZV9leHRlbnNpb249Ki8iLnRzIiB9OworfQorCitzdGQ6OnNldDxzdGQ6OnN0cmluZz4gVHlwZXNjcmlwdEtleXdvcmRzKCkgeworICAvLyBMaXN0IG9mIGtleXdvcmRzIHJldHJpZXZlZCBmcm9tIGhlcmU6CisgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9taWNyb3NvZnQvVHlwZVNjcmlwdC9pc3N1ZXMvMjUzNgorICByZXR1cm4geworICAgICJhcmd1bWVudHMiLCAiYnJlYWsiLCAgICAiY2FzZSIsICAgICAgImNhdGNoIiwgICAgICAiY2xhc3MiLCAgICAgICJjb25zdCIsCisgICAgImNvbnRpbnVlIiwgICJkZWJ1Z2dlciIsICJkZWZhdWx0IiwgICAiZGVsZXRlIiwgICAgICJkbyIsICAgICAgICAgImVsc2UiLAorICAgICJlbnVtIiwgICAgICAiZXhwb3J0IiwgICAiZXh0ZW5kcyIsICAgImZhbHNlIiwgICAgICAiZmluYWxseSIsICAgICJmb3IiLAorICAgICJmdW5jdGlvbiIsICAiaWYiLCAgICAgICAiaW1wb3J0IiwgICAgImluIiwgICAgICAgICAiaW5zdGFuY2VvZiIsICJuZXciLAorICAgICJudWxsIiwgICAgICAiT2JqZWN0IiwgICAicmV0dXJuIiwgICAgInN1cGVyIiwgICAgICAic3dpdGNoIiwgICAgICJ0aGlzIiwKKyAgICAidGhyb3ciLCAgICAgInRydWUiLCAgICAgInRyeSIsICAgICAgICJ0eXBlb2YiLCAgICAgInZhciIsICAgICAgICAidm9pZCIsCisgICAgIndoaWxlIiwgICAgICJ3aXRoIiwgICAgICJhcyIsICAgICAgICAiaW1wbGVtZW50cyIsICJpbnRlcmZhY2UiLCAgImxldCIsCisgICAgInBhY2thZ2UiLCAgICJwcml2YXRlIiwgICJwcm90ZWN0ZWQiLCAicHVibGljIiwgICAgICJzdGF0aWMiLCAgICAgInlpZWxkIiwKKyAgfTsKK30KKwogZW51bSBBbm5vdGF0aW9uVHlwZSB7IGtQYXJhbSA9IDAsIGtUeXBlID0gMSwga1JldHVybnMgPSAyIH07CiAKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+IHN0cnVjdCBTdXBwb3J0c09iamVjdEFQSSA6IHN0ZDo6ZmFsc2VfdHlwZSB7fTsKKwordGVtcGxhdGU8PiBzdHJ1Y3QgU3VwcG9ydHNPYmplY3RBUEk8U3RydWN0RGVmPiA6IHN0ZDo6dHJ1ZV90eXBlIHt9OworCit9ICAvLyBuYW1lc3BhY2UKKwogbmFtZXNwYWNlIHRzIHsKIC8vIEl0ZXJhdGUgdGhyb3VnaCBhbGwgZGVmaW5pdGlvbnMgd2UgaGF2ZW4ndCBnZW5lcmF0ZSBjb2RlIGZvciAoZW51bXMsIHN0cnVjdHMsCiAvLyBhbmQgdGFibGVzKSBhbmQgb3V0cHV0IHRoZW0gdG8gYSBzaW5nbGUgZmlsZS4KQEAgLTQ4LDgzICs5Myw1MyBAQAogCiAgIFRzR2VuZXJhdG9yKGNvbnN0IFBhcnNlciAmcGFyc2VyLCBjb25zdCBzdGQ6OnN0cmluZyAmcGF0aCwKICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgJmZpbGVfbmFtZSkKLSAgICAgIDogQmFzZUdlbmVyYXRvcihwYXJzZXIsIHBhdGgsIGZpbGVfbmFtZSwgIiIsICIuIiwgInRzIikgewotICAgIC8vIGNsYW5nLWZvcm1hdCBvZmYKKyAgICAgIDogQmFzZUdlbmVyYXRvcihwYXJzZXIsIHBhdGgsIGZpbGVfbmFtZSwgIiIsICJfIiwgInRzIiksCisgICAgICAgIG5hbWVyXyhXaXRoRmxhZ09wdGlvbnMoVHlwZVNjcmlwdERlZmF1bHRDb25maWcoKSwgcGFyc2VyLm9wdHMsIHBhdGgpLAorICAgICAgICAgICAgICAgVHlwZXNjcmlwdEtleXdvcmRzKCkpIHt9CiAKLSAgICAvLyBMaXN0IG9mIGtleXdvcmRzIHJldHJpZXZlZCBmcm9tIGhlcmU6Ci0gICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL21pY3Jvc29mdC9UeXBlU2NyaXB0L2lzc3Vlcy8yNTM2Ci0gICAgLy8gT25lIHBlciBsaW5lIHRvIGVhc2UgY29tcGFyaXNvbnMgdG8gdGhhdCBsaXN0IGFyZSBlYXNpZXIKLSAgICBzdGF0aWMgY29uc3QgY2hhciAqY29uc3Qga2V5d29yZHNbXSA9IHsKLSAgICAgICJhcmd1bWVudCIsCi0gICAgICAiYnJlYWsiLAotICAgICAgImNhc2UiLAotICAgICAgImNhdGNoIiwKLSAgICAgICJjbGFzcyIsCi0gICAgICAiY29uc3QiLAotICAgICAgImNvbnRpbnVlIiwKLSAgICAgICJkZWJ1Z2dlciIsCi0gICAgICAiZGVmYXVsdCIsCi0gICAgICAiZGVsZXRlIiwKLSAgICAgICJkbyIsCi0gICAgICAiZWxzZSIsCi0gICAgICAiZW51bSIsCi0gICAgICAiZXhwb3J0IiwKLSAgICAgICJleHRlbmRzIiwKLSAgICAgICJmYWxzZSIsCi0gICAgICAiZmluYWxseSIsCi0gICAgICAiZm9yIiwKLSAgICAgICJmdW5jdGlvbiIsCi0gICAgICAiaWYiLAotICAgICAgImltcG9ydCIsCi0gICAgICAiaW4iLAotICAgICAgImluc3RhbmNlb2YiLAotICAgICAgIm5ldyIsCi0gICAgICAibnVsbCIsCi0gICAgICAiT2JqZWN0IiwKLSAgICAgICJyZXR1cm4iLAotICAgICAgInN1cGVyIiwKLSAgICAgICJzd2l0Y2giLAotICAgICAgInRoaXMiLAotICAgICAgInRocm93IiwKLSAgICAgICJ0cnVlIiwKLSAgICAgICJ0cnkiLAotICAgICAgInR5cGVvZiIsCi0gICAgICAidmFyIiwKLSAgICAgICJ2b2lkIiwKLSAgICAgICJ3aGlsZSIsCi0gICAgICAid2l0aCIsCi0gICAgICAiYXMiLAotICAgICAgImltcGxlbWVudHMiLAotICAgICAgImludGVyZmFjZSIsCi0gICAgICAibGV0IiwKLSAgICAgICJwYWNrYWdlIiwKLSAgICAgICJwcml2YXRlIiwKLSAgICAgICJwcm90ZWN0ZWQiLAotICAgICAgInB1YmxpYyIsCi0gICAgICAic3RhdGljIiwKLSAgICAgICJ5aWVsZCIsCi0gICAgICBudWxscHRyLAotICAgICAgLy8gY2xhbmctZm9ybWF0IG9uCi0gICAgfTsKLQotICAgIGZvciAoYXV0byBrdyA9IGtleXdvcmRzOyAqa3c7IGt3KyspIGtleXdvcmRzXy5pbnNlcnQoKmt3KTsKLSAgfQogICBib29sIGdlbmVyYXRlKCkgewotICAgIGlmIChwYXJzZXJfLm9wdHMudHNfZmxhdF9maWxlICYmIHBhcnNlcl8ub3B0cy5nZW5lcmF0ZV9hbGwpIHsKLSAgICAgIC8vIE5vdCBpbXBsZW1lbnRlZDsgd2FybmluZyBtZXNzYWdlIHNob3VsZCBoYXZlIGJlZW0gZW1pdHRlZCBieSBmbGF0Yy4KLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9CiAgICAgZ2VuZXJhdGVFbnVtcygpOwogICAgIGdlbmVyYXRlU3RydWN0cygpOwogICAgIGdlbmVyYXRlRW50cnkoKTsKICAgICByZXR1cm4gdHJ1ZTsKICAgfQogCisgIGJvb2wgSW5jbHVkZU5hbWVzcGFjZSgpIGNvbnN0IHsKKyAgICAvLyBXaGVuIGdlbmVyYXRpbmcgYSBzaW5nbGUgZmxhdCBmaWxlIGFuZCBhbGwgaXRzIGluY2x1ZGVzLCBuYW1lc3BhY2VzIGFyZQorICAgIC8vIGltcG9ydGFudCB0byBhdm9pZCB0eXBlIG5hbWUgY2xhc2hlcy4KKyAgICByZXR1cm4gcGFyc2VyXy5vcHRzLnRzX2ZsYXRfZmlsZSAmJiBwYXJzZXJfLm9wdHMuZ2VuZXJhdGVfYWxsOworICB9CisKKyAgc3RkOjpzdHJpbmcgR2V0VHlwZU5hbWUoY29uc3QgRW51bURlZiAmZGVmLCBjb25zdCBib29sID0gZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJvb2wgZm9yY2VfbnNfd3JhcCA9IGZhbHNlKSB7CisgICAgaWYgKEluY2x1ZGVOYW1lc3BhY2UoKSB8fCBmb3JjZV9uc193cmFwKSB7CisgICAgICByZXR1cm4gbmFtZXJfLk5hbWVzcGFjZWRUeXBlKGRlZik7CisgICAgfQorICAgIHJldHVybiBuYW1lcl8uVHlwZShkZWYpOworICB9CisKKyAgc3RkOjpzdHJpbmcgR2V0VHlwZU5hbWUoY29uc3QgU3RydWN0RGVmICZkZWYsIGNvbnN0IGJvb2wgb2JqZWN0X2FwaSA9IGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBib29sIGZvcmNlX25zX3dyYXAgPSBmYWxzZSkgeworICAgIGlmIChvYmplY3RfYXBpICYmIHBhcnNlcl8ub3B0cy5nZW5lcmF0ZV9vYmplY3RfYmFzZWRfYXBpKSB7CisgICAgICBpZiAoSW5jbHVkZU5hbWVzcGFjZSgpIHx8IGZvcmNlX25zX3dyYXApIHsKKyAgICAgICAgcmV0dXJuIG5hbWVyXy5OYW1lc3BhY2VkT2JqZWN0VHlwZShkZWYpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIG5hbWVyXy5PYmplY3RUeXBlKGRlZik7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIGlmIChJbmNsdWRlTmFtZXNwYWNlKCkgfHwgZm9yY2VfbnNfd3JhcCkgeworICAgICAgICByZXR1cm4gbmFtZXJfLk5hbWVzcGFjZWRUeXBlKGRlZik7CisgICAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gbmFtZXJfLlR5cGUoZGVmKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKwogICAvLyBTYXZlIG91dCB0aGUgZ2VuZXJhdGVkIGNvZGUgZm9yIGEgc2luZ2xlIGNsYXNzIHdoaWxlIGFkZGluZwogICAvLyBkZWNsYXJhdGlvbiBib2lsZXJwbGF0ZS4KLSAgYm9vbCBTYXZlVHlwZShjb25zdCBEZWZpbml0aW9uICZkZWZpbml0aW9uLCBjb25zdCBzdGQ6OnN0cmluZyAmY2xhc3Njb2RlLAorICBib29sIFNhdmVUeXBlKGNvbnN0IERlZmluaXRpb24gJmRlZmluaXRpb24sIGNvbnN0IHN0ZDo6c3RyaW5nICZjbGFzc19jb2RlLAogICAgICAgICAgICAgICAgIGltcG9ydF9zZXQgJmltcG9ydHMsIGltcG9ydF9zZXQgJmJhcmVfaW1wb3J0cykgewotICAgIGlmICghY2xhc3Njb2RlLmxlbmd0aCgpKSByZXR1cm4gdHJ1ZTsKKyAgICBpZiAoIWNsYXNzX2NvZGUubGVuZ3RoKCkpIHJldHVybiB0cnVlOwogCiAgICAgc3RkOjpzdHJpbmcgY29kZTsKIApAQCAtMTQ0LDI1ICsxNTksMjQgQEAKICAgICAgIGlmICghaW1wb3J0cy5lbXB0eSgpKSBjb2RlICs9ICJcblxuIjsKICAgICB9CiAKLSAgICBjb2RlICs9IGNsYXNzY29kZTsKLSAgICBhdXRvIGZpbGVuYW1lID0KLSAgICAgICAgTmFtZXNwYWNlRGlyKCpkZWZpbml0aW9uLmRlZmluZWRfbmFtZXNwYWNlLCB0cnVlKSArCi0gICAgICAgIENvbnZlcnRDYXNlKGRlZmluaXRpb24ubmFtZSwgQ2FzZTo6a0Rhc2hlciwgQ2FzZTo6a1VwcGVyQ2FtZWwpICsgIi50cyI7CisgICAgY29kZSArPSBjbGFzc19jb2RlOworCiAgICAgaWYgKHBhcnNlcl8ub3B0cy50c19mbGF0X2ZpbGUpIHsKICAgICAgIGZsYXRfZmlsZV8gKz0gY29kZTsKKyAgICAgIGZsYXRfZmlsZV8gKz0gIlxuIjsKICAgICAgIGZsYXRfZmlsZV9kZWZpbml0aW9uc18uaW5zZXJ0KCZkZWZpbml0aW9uKTsKICAgICAgIHJldHVybiB0cnVlOwogICAgIH0gZWxzZSB7Ci0gICAgICByZXR1cm4gU2F2ZUZpbGUoZmlsZW5hbWUuY19zdHIoKSwgY29kZSwgZmFsc2UpOworICAgICAgYXV0byBkaXJzID0gbmFtZXJfLkRpcmVjdG9yaWVzKCpkZWZpbml0aW9uLmRlZmluZWRfbmFtZXNwYWNlKTsKKyAgICAgIEVuc3VyZURpckV4aXN0cyhkaXJzKTsKKyAgICAgIGF1dG8gYmFzZW5hbWUgPSBkaXJzICsgbmFtZXJfLkZpbGUoZGVmaW5pdGlvbiwgU2tpcEZpbGU6OlN1ZmZpeCk7CisKKyAgICAgIHJldHVybiBTYXZlRmlsZShiYXNlbmFtZS5jX3N0cigpLCBjb2RlLCBmYWxzZSk7CiAgICAgfQogICB9CiAKICBwcml2YXRlOgotICBzdGQ6OnVub3JkZXJlZF9zZXQ8c3RkOjpzdHJpbmc+IGtleXdvcmRzXzsKLQotICBzdGQ6OnN0cmluZyBFc2NhcGVLZXl3b3JkKGNvbnN0IHN0ZDo6c3RyaW5nICZuYW1lKSBjb25zdCB7Ci0gICAgcmV0dXJuIGtleXdvcmRzXy5maW5kKG5hbWUpID09IGtleXdvcmRzXy5lbmQoKSA/IG5hbWUgOiBuYW1lICsgIl8iOwotICB9CisgIElkbE5hbWVyIG5hbWVyXzsKIAogICBpbXBvcnRfc2V0IGltcG9ydHNfYWxsXzsKIApAQCAtMTc3LDYgKzE5MSwxMCBAQAogICAvLyBUaGlzIG1hcHMgZnJvbSBpbXBvcnQgbmFtZXMgdG8gdHlwZXMgdG8gaW1wb3J0LgogICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPj4KICAgICAgIGZsYXRfZmlsZV9pbXBvcnRfZGVjbGFyYXRpb25zXzsKKyAgLy8gRm9yIGZsYXQgZmlsZSBjb2RlZ2VuLCB0cmFja3Mgd2hldGhlciB3ZSBuZWVkIHRvIGltcG9ydCB0aGUgZmxhdGJ1ZmZlcnMKKyAgLy8gbGlicmFyeSBpdHNlbGYgKG5vdCBuZWNlc3NhcnkgZm9yIGZpbGVzIHRoYXQgc29sZWx5IGNvbnNpc3Qgb2YgZW51bQorICAvLyBkZWZpbml0aW9ucykuCisgIGJvb2wgaW1wb3J0X2ZsYXRidWZmZXJzX2xpYl8gPSBmYWxzZTsKIAogICAvLyBHZW5lcmF0ZSBjb2RlIGZvciBhbGwgZW51bXMuCiAgIHZvaWQgZ2VuZXJhdGVFbnVtcygpIHsKQEAgLTIwMCw2ICsyMTgsNyBAQAogICAgICAgaW1wb3J0X3NldCBiYXJlX2ltcG9ydHM7CiAgICAgICBpbXBvcnRfc2V0IGltcG9ydHM7CiAgICAgICBBZGRJbXBvcnQoYmFyZV9pbXBvcnRzLCAiKiBhcyBmbGF0YnVmZmVycyIsICJmbGF0YnVmZmVycyIpOworICAgICAgaW1wb3J0X2ZsYXRidWZmZXJzX2xpYl8gPSB0cnVlOwogICAgICAgYXV0byAmc3RydWN0X2RlZiA9ICoqaXQ7CiAgICAgICBzdGQ6OnN0cmluZyBkZWNsY29kZTsKICAgICAgIEdlblN0cnVjdChwYXJzZXJfLCBzdHJ1Y3RfZGVmLCAmZGVjbGNvZGUsIGltcG9ydHMpOwpAQCAtMjEwLDM4ICsyMjksNDUgQEAKIAogICAvLyBHZW5lcmF0ZSBjb2RlIGZvciBhIHNpbmdsZSBlbnRyeSBwb2ludCBtb2R1bGUuCiAgIHZvaWQgZ2VuZXJhdGVFbnRyeSgpIHsKLSAgICBzdGQ6OnN0cmluZyBjb2RlOworICAgIHN0ZDo6c3RyaW5nIGNvZGUgPQorICAgICAgICAiLy8gIiArIHN0ZDo6c3RyaW5nKEZsYXRCdWZmZXJzR2VuZXJhdGVkV2FybmluZygpKSArICJcblxuIjsKICAgICBpZiAocGFyc2VyXy5vcHRzLnRzX2ZsYXRfZmlsZSkgewotICAgICAgY29kZSArPSAiaW1wb3J0ICogYXMgZmxhdGJ1ZmZlcnMgZnJvbSAnZmxhdGJ1ZmZlcnMnO1xuIjsKLSAgICAgIGZvciAoY29uc3QgYXV0byAmaXQgOiBmbGF0X2ZpbGVfaW1wb3J0X2RlY2xhcmF0aW9uc18pIHsKLSAgICAgICAgLy8gTm90ZSB0aGF0IHdlIGRvIGVuZCB1cCBnZW5lcmF0aW5nIGFuIGltcG9ydCBmb3Igb3Vyc2VsdmVzLCB3aGljaAotICAgICAgICAvLyBzaG91bGQgZ2VuZXJhbGx5IGJlIGhhcm1sZXNzLgotICAgICAgICAvLyBUT0RPOiBNYWtlIGl0IHNvIHdlIGRvbid0IGdlbmVyYXRlIGEgc2VsZi1pbXBvcnQ7IHRoaXMgd2lsbCBhbHNvCi0gICAgICAgIC8vIHJlcXVpcmUgbW9kaWZ5aW5nIEFkZEltcG9ydCB0byBlbnN1cmUgdGhhdCB3ZSBkb24ndCB1c2UKLSAgICAgICAgLy8gbmFtZXNwYWNlLXByZWZpeGVkIG5hbWVzIGFueXdoZXJlLi4uCi0gICAgICAgIHN0ZDo6c3RyaW5nIGZpbGUgPSBpdC5maXJzdDsKLSAgICAgICAgaWYgKGZpbGUuZW1wdHkoKSkgewotICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIHN0ZDo6c3RyaW5nIG5vZXh0ID0gZmxhdGJ1ZmZlcnM6OlN0cmlwRXh0ZW5zaW9uKGZpbGUpOwotICAgICAgICBzdGQ6OnN0cmluZyBiYXNlbmFtZSA9IGZsYXRidWZmZXJzOjpTdHJpcFBhdGgobm9leHQpOwotICAgICAgICBzdGQ6OnN0cmluZyBpbmNsdWRlX2ZpbGUgPSBHZW5lcmF0ZWRGaWxlTmFtZSgKLSAgICAgICAgICAgIHBhcnNlcl8ub3B0cy5pbmNsdWRlX3ByZWZpeCwKLSAgICAgICAgICAgIHBhcnNlcl8ub3B0cy5rZWVwX2luY2x1ZGVfcGF0aCA/IG5vZXh0IDogYmFzZW5hbWUsIHBhcnNlcl8ub3B0cyk7Ci0gICAgICAgIC8vIFRPRE86IHdoYXQgaXMgdGhlIHJpZ2h0IGJlaGF2aW9yIHdoZW4gZGlmZmVyZW50IGluY2x1ZGUgZmxhZ3MgYXJlCi0gICAgICAgIC8vIHNwZWNpZmllZCBoZXJlPyBTaG91bGQgd2UgYWx3YXlzIGJlIGFkZGluZyB0aGUgIi4vIiBmb3IgYSByZWxhdGl2ZQotICAgICAgICAvLyBwYXRoIG9yIHR1cm4gaXQgb2ZmIGlmIC0taW5jbHVkZS1wcmVmaXggaXMgc3BlY2lmaWVkLCBvciBzb21ldGhpbmcKLSAgICAgICAgLy8gZWxzZT8KLSAgICAgICAgc3RkOjpzdHJpbmcgaW5jbHVkZV9uYW1lID0gIi4vIiArIGZsYXRidWZmZXJzOjpTdHJpcEV4dGVuc2lvbihpbmNsdWRlX2ZpbGUpOwotICAgICAgICBjb2RlICs9ICJpbXBvcnQgeyI7Ci0gICAgICAgIGZvciAoY29uc3QgYXV0byAmcGFpciA6IGl0LnNlY29uZCkgewotICAgICAgICAgIGNvZGUgKz0gRXNjYXBlS2V5d29yZChwYWlyLmZpcnN0KSArICIgYXMgIiArCi0gICAgICAgICAgICAgICAgICBFc2NhcGVLZXl3b3JkKHBhaXIuc2Vjb25kKSArICIsICI7Ci0gICAgICAgIH0KLSAgICAgICAgY29kZS5yZXNpemUoY29kZS5zaXplKCkgLSAyKTsKLSAgICAgICAgY29kZSArPSAifSBmcm9tICAnIiArIGluY2x1ZGVfbmFtZSArICInO1xuIjsKKyAgICAgIGlmIChpbXBvcnRfZmxhdGJ1ZmZlcnNfbGliXykgeworICAgICAgICBjb2RlICs9ICJpbXBvcnQgKiBhcyBmbGF0YnVmZmVycyBmcm9tICdmbGF0YnVmZmVycyc7XG4iOworICAgICAgICBjb2RlICs9ICJcbiI7CiAgICAgICB9Ci0gICAgICBjb2RlICs9ICJcblxuIjsKKyAgICAgIC8vIE9ubHkgaW5jbHVkZSBpbXBvcnQgc3RhdGVtZW50cyB3aGVuIG5vdCBnZW5lcmF0aW5nIGFsbC4KKyAgICAgIGlmICghcGFyc2VyXy5vcHRzLmdlbmVyYXRlX2FsbCkgeworICAgICAgICBmb3IgKGNvbnN0IGF1dG8gJml0IDogZmxhdF9maWxlX2ltcG9ydF9kZWNsYXJhdGlvbnNfKSB7CisgICAgICAgICAgLy8gTm90ZSB0aGF0IHdlIGRvIGVuZCB1cCBnZW5lcmF0aW5nIGFuIGltcG9ydCBmb3Igb3Vyc2VsdmVzLCB3aGljaAorICAgICAgICAgIC8vIHNob3VsZCBnZW5lcmFsbHkgYmUgaGFybWxlc3MuCisgICAgICAgICAgLy8gVE9ETzogTWFrZSBpdCBzbyB3ZSBkb24ndCBnZW5lcmF0ZSBhIHNlbGYtaW1wb3J0OyB0aGlzIHdpbGwgYWxzbworICAgICAgICAgIC8vIHJlcXVpcmUgbW9kaWZ5aW5nIEFkZEltcG9ydCB0byBlbnN1cmUgdGhhdCB3ZSBkb24ndCB1c2UKKyAgICAgICAgICAvLyBuYW1lc3BhY2UtcHJlZml4ZWQgbmFtZXMgYW55d2hlcmUuLi4KKyAgICAgICAgICBzdGQ6OnN0cmluZyBmaWxlID0gaXQuZmlyc3Q7CisgICAgICAgICAgaWYgKGZpbGUuZW1wdHkoKSkgeyBjb250aW51ZTsgfQorICAgICAgICAgIHN0ZDo6c3RyaW5nIG5vZXh0ID0gZmxhdGJ1ZmZlcnM6OlN0cmlwRXh0ZW5zaW9uKGZpbGUpOworICAgICAgICAgIHN0ZDo6c3RyaW5nIGJhc2VuYW1lID0gZmxhdGJ1ZmZlcnM6OlN0cmlwUGF0aChub2V4dCk7CisgICAgICAgICAgc3RkOjpzdHJpbmcgaW5jbHVkZV9maWxlID0gR2VuZXJhdGVkRmlsZU5hbWUoCisgICAgICAgICAgICAgIHBhcnNlcl8ub3B0cy5pbmNsdWRlX3ByZWZpeCwKKyAgICAgICAgICAgICAgcGFyc2VyXy5vcHRzLmtlZXBfcHJlZml4ID8gbm9leHQgOiBiYXNlbmFtZSwgcGFyc2VyXy5vcHRzKTsKKyAgICAgICAgICAvLyBUT0RPOiB3aGF0IGlzIHRoZSByaWdodCBiZWhhdmlvciB3aGVuIGRpZmZlcmVudCBpbmNsdWRlIGZsYWdzIGFyZQorICAgICAgICAgIC8vIHNwZWNpZmllZCBoZXJlPyBTaG91bGQgd2UgYWx3YXlzIGJlIGFkZGluZyB0aGUgIi4vIiBmb3IgYSByZWxhdGl2ZQorICAgICAgICAgIC8vIHBhdGggb3IgdHVybiBpdCBvZmYgaWYgLS1pbmNsdWRlLXByZWZpeCBpcyBzcGVjaWZpZWQsIG9yIHNvbWV0aGluZworICAgICAgICAgIC8vIGVsc2U/CisgICAgICAgICAgc3RkOjpzdHJpbmcgaW5jbHVkZV9uYW1lID0KKyAgICAgICAgICAgICAgIi4vIiArIGZsYXRidWZmZXJzOjpTdHJpcEV4dGVuc2lvbihpbmNsdWRlX2ZpbGUpOworICAgICAgICAgIGNvZGUgKz0gImltcG9ydCB7IjsKKyAgICAgICAgICBmb3IgKGNvbnN0IGF1dG8gJnBhaXIgOiBpdC5zZWNvbmQpIHsKKyAgICAgICAgICAgIGNvZGUgKz0gbmFtZXJfLkVzY2FwZUtleXdvcmQocGFpci5maXJzdCkgKyAiIGFzICIgKworICAgICAgICAgICAgICAgICAgICBuYW1lcl8uRXNjYXBlS2V5d29yZChwYWlyLnNlY29uZCkgKyAiLCAiOworICAgICAgICAgIH0KKyAgICAgICAgICBjb2RlLnJlc2l6ZShjb2RlLnNpemUoKSAtIDIpOworICAgICAgICAgIGNvZGUgKz0gIn0gZnJvbSAnIiArIGluY2x1ZGVfbmFtZSArICIuanMnO1xuIjsKKyAgICAgICAgfQorICAgICAgICBjb2RlICs9ICJcbiI7CisgICAgICB9CisKICAgICAgIGNvZGUgKz0gZmxhdF9maWxlXzsKICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nIGZpbGVuYW1lID0KICAgICAgICAgICBHZW5lcmF0ZWRGaWxlTmFtZShwYXRoXywgZmlsZV9uYW1lXywgcGFyc2VyXy5vcHRzKTsKQEAgLTI1MCw3ICsyNzYsOCBAQAogICAgICAgZm9yIChhdXRvIGl0ID0gaW1wb3J0c19hbGxfLmJlZ2luKCk7IGl0ICE9IGltcG9ydHNfYWxsXy5lbmQoKTsgaXQrKykgewogICAgICAgICBjb2RlICs9IGl0LT5zZWNvbmQuZXhwb3J0X3N0YXRlbWVudCArICJcbiI7CiAgICAgICB9Ci0gICAgICBzdGQ6OnN0cmluZyBwYXRoID0gIi4vIiArIHBhdGhfICsgZmlsZV9uYW1lXyArICIudHMiOworICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgcGF0aCA9CisgICAgICAgICAgR2VuZXJhdGVkRmlsZU5hbWUocGF0aF8sIGZpbGVfbmFtZV8sIHBhcnNlcl8ub3B0cyk7CiAgICAgICBTYXZlRmlsZShwYXRoLmNfc3RyKCksIGNvZGUsIGZhbHNlKTsKICAgICB9CiAgIH0KQEAgLTI4Niw3ICszMTMsOSBAQAogICAgIGlmIChyZXZlcnNlKSByZXR1cm47ICAvLyBGSVhNRS4KICAgICBzdGQ6OnN0cmluZyAmY29kZSA9ICpjb2RlX3B0cjsKICAgICBHZW5Eb2NDb21tZW50KGVudW1fZGVmLmRvY19jb21tZW50LCBjb2RlX3B0cik7Ci0gICAgY29kZSArPSAiZXhwb3J0IGVudW0gIiArIEVzY2FwZUtleXdvcmQoZW51bV9kZWYubmFtZSkgKyAie1xuIjsKKyAgICBjb2RlICs9ICJleHBvcnQgZW51bSAiOworICAgIGNvZGUgKz0gR2V0VHlwZU5hbWUoZW51bV9kZWYpOworICAgIGNvZGUgKz0gIiB7XG4iOwogICAgIGZvciAoYXV0byBpdCA9IGVudW1fZGVmLlZhbHMoKS5iZWdpbigpOyBpdCAhPSBlbnVtX2RlZi5WYWxzKCkuZW5kKCk7ICsraXQpIHsKICAgICAgIGF1dG8gJmV2ID0gKippdDsKICAgICAgIGlmICghZXYuZG9jX2NvbW1lbnQuZW1wdHkoKSkgewpAQCAtMjk0LDE1ICszMjMsMTMgQEAKICAgICAgICAgR2VuRG9jQ29tbWVudChldi5kb2NfY29tbWVudCwgY29kZV9wdHIsICIgICIpOwogICAgICAgfQogCi0gICAgICBjb25zdCBzdGQ6OnN0cmluZyBlc2NhcGVkX25hbWUgPSBFc2NhcGVLZXl3b3JkKGV2Lm5hbWUpOwotCiAgICAgICAvLyBHZW5lcmF0ZSBtYXBwaW5nIGJldHdlZW4gRW51bU5hbWU6IEVudW1WYWx1ZShpbnQpCiAgICAgICBpZiAocmV2ZXJzZSkgewogICAgICAgICBjb2RlICs9ICIgICciICsgZW51bV9kZWYuVG9TdHJpbmcoZXYpICsgIiciOwogICAgICAgICBjb2RlICs9ICIgPSAiOwotICAgICAgICBjb2RlICs9ICInIiArIGVzY2FwZWRfbmFtZSArICInIjsKKyAgICAgICAgY29kZSArPSAiJyIgKyBuYW1lcl8uVmFyaWFudChldikgKyAiJyI7CiAgICAgICB9IGVsc2UgewotICAgICAgICBjb2RlICs9ICIgICIgKyBlc2NhcGVkX25hbWU7CisgICAgICAgIGNvZGUgKz0gIiAgIiArIG5hbWVyXy5WYXJpYW50KGV2KTsKICAgICAgICAgY29kZSArPSAiID0gIjsKICAgICAgICAgLy8gVW5mb3J0dW5hdGVseSwgYmVjYXVzZSB0eXBlc2NyaXB0IGRvZXMgbm90IHN1cHBvcnQgYmlnaW50IGVudW1zLAogICAgICAgICAvLyBmb3IgNjQtYml0IGVudW1zLCB3ZSBpbnN0ZWFkIG1hcCB0aGUgZW51bSBuYW1lcyB0byBzdHJpbmdzLgpAQCAtMzI0LDcgKzM1MSw3IEBACiAgICAgICBjb2RlICs9IEdlblVuaW9uQ29udkZ1bmMoZW51bV9kZWYudW5kZXJseWluZ190eXBlLCBpbXBvcnRzKTsKICAgICB9CiAKLSAgICBjb2RlICs9ICJcblxuIjsKKyAgICBjb2RlICs9ICJcbiI7CiAgIH0KIAogICBzdGF0aWMgc3RkOjpzdHJpbmcgR2VuVHlwZShjb25zdCBUeXBlICZ0eXBlKSB7CkBAIC0zNTksOCArMzg2LDggQEAKICAgICAgICAgcmV0dXJuIEdlbkJCQWNjZXNzKCkgKyAiLl9fdW5pb25fd2l0aF9zdHJpbmciICsgYXJndW1lbnRzOwogICAgICAgY2FzZSBCQVNFX1RZUEVfVkVDVE9SOiByZXR1cm4gR2VuR2V0dGVyKHR5cGUuVmVjdG9yVHlwZSgpLCBhcmd1bWVudHMpOwogICAgICAgZGVmYXVsdDogewotICAgICAgICBhdXRvIGdldHRlciA9IEdlbkJCQWNjZXNzKCkgKyAiLnJlYWQiICsKLSAgICAgICAgICAgICAgICAgICAgICBDb252ZXJ0Q2FzZShHZW5UeXBlKHR5cGUpLCBDYXNlOjprVXBwZXJDYW1lbCkgKyBhcmd1bWVudHM7CisgICAgICAgIGF1dG8gZ2V0dGVyID0gR2VuQkJBY2Nlc3MoKSArICIuIiArCisgICAgICAgICAgICAgICAgICAgICAgbmFtZXJfLk1ldGhvZCgicmVhZF8iICsgR2VuVHlwZSh0eXBlKSkgKyBhcmd1bWVudHM7CiAgICAgICAgIGlmICh0eXBlLmJhc2VfdHlwZSA9PSBCQVNFX1RZUEVfQk9PTCkgeyBnZXR0ZXIgPSAiISEiICsgZ2V0dGVyOyB9CiAgICAgICAgIHJldHVybiBnZXR0ZXI7CiAgICAgICB9CkBAIC0zODUsOSArNDEyLDEwIEBACiAgICAgICAgIH0KICAgICAgICAgZGVmYXVsdDogewogICAgICAgICAgIGlmIChhdXRvIHZhbCA9IHZhbHVlLnR5cGUuZW51bV9kZWYtPkZpbmRCeVZhbHVlKHZhbHVlLmNvbnN0YW50KSkgewotICAgICAgICAgICAgcmV0dXJuIEVzY2FwZUtleXdvcmQoQWRkSW1wb3J0KGltcG9ydHMsICp2YWx1ZS50eXBlLmVudW1fZGVmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICp2YWx1ZS50eXBlLmVudW1fZGVmKSkgKwotICAgICAgICAgICAgICAgICAgICIuIiArIEVzY2FwZUtleXdvcmQodmFsLT5uYW1lKTsKKyAgICAgICAgICAgIHJldHVybiBBZGRJbXBvcnQoaW1wb3J0cywgKnZhbHVlLnR5cGUuZW51bV9kZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICp2YWx1ZS50eXBlLmVudW1fZGVmKQorICAgICAgICAgICAgICAgICAgICAgICAubmFtZSArCisgICAgICAgICAgICAgICAgICAgIi4iICsgbmFtZXJfLlZhcmlhbnQoKnZhbCk7CiAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIHJldHVybiB2YWx1ZS5jb25zdGFudDsKICAgICAgICAgICB9CkBAIC00MTEsNyArNDM5LDkgQEAKICAgICAgICAgcmV0dXJuICJCaWdJbnQoJyIgKyB2YWx1ZS5jb25zdGFudCArICInKSI7CiAgICAgICB9CiAKLSAgICAgIGRlZmF1bHQ6IHJldHVybiB2YWx1ZS5jb25zdGFudDsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIGlmICh2YWx1ZS5jb25zdGFudCA9PSAibmFuIikgeyByZXR1cm4gIk5hTiI7IH0KKyAgICAgICAgcmV0dXJuIHZhbHVlLmNvbnN0YW50OwogICAgIH0KICAgfQogCkBAIC00MjQsNyArNDU0LDcgQEAKICAgICAgICAgaWYgKElzU3RyaW5nKHR5cGUpKSB7CiAgICAgICAgICAgbmFtZSA9ICJzdHJpbmd8VWludDhBcnJheSI7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgbmFtZSA9IEVzY2FwZUtleXdvcmQoQWRkSW1wb3J0KGltcG9ydHMsIG93bmVyLCAqdHlwZS5zdHJ1Y3RfZGVmKSk7CisgICAgICAgICAgbmFtZSA9IEFkZEltcG9ydChpbXBvcnRzLCBvd25lciwgKnR5cGUuc3RydWN0X2RlZikubmFtZTsKICAgICAgICAgfQogICAgICAgICByZXR1cm4gYWxsb3dOdWxsID8gKG5hbWUgKyAifG51bGwiKSA6IG5hbWU7CiAgICAgICB9CkBAIC00MzcsNyArNDY3LDggQEAKICAgICAgIGRlZmF1bHQ6CiAgICAgICAgIGlmIChJc1NjYWxhcih0eXBlLmJhc2VfdHlwZSkpIHsKICAgICAgICAgICBpZiAodHlwZS5lbnVtX2RlZikgewotICAgICAgICAgICAgY29uc3QgYXV0byBlbnVtX25hbWUgPSBBZGRJbXBvcnQoaW1wb3J0cywgb3duZXIsICp0eXBlLmVudW1fZGVmKTsKKyAgICAgICAgICAgIGNvbnN0IGF1dG8gZW51bV9uYW1lID0KKyAgICAgICAgICAgICAgICBBZGRJbXBvcnQoaW1wb3J0cywgb3duZXIsICp0eXBlLmVudW1fZGVmKS5uYW1lOwogICAgICAgICAgICAgcmV0dXJuIGFsbG93TnVsbCA/IChlbnVtX25hbWUgKyAifG51bGwiKSA6IGVudW1fbmFtZTsKICAgICAgICAgICB9CiAgICAgICAgICAgcmV0dXJuIGFsbG93TnVsbCA/ICJudW1iZXJ8bnVsbCIgOiAibnVtYmVyIjsKQEAgLTQ0Nyw3ICs0NzgsNyBAQAogICB9CiAKICAgLy8gUmV0dXJucyB0aGUgbWV0aG9kIG5hbWUgZm9yIHVzZSB3aXRoIGFkZC9wdXQgY2FsbHMuCi0gIHN0YXRpYyBzdGQ6OnN0cmluZyBHZW5Xcml0ZU1ldGhvZChjb25zdCBUeXBlICZ0eXBlKSB7CisgIHN0ZDo6c3RyaW5nIEdlbldyaXRlTWV0aG9kKGNvbnN0IFR5cGUgJnR5cGUpIHsKICAgICAvLyBGb3J3YXJkIHRvIHNpZ25lZCB2ZXJzaW9ucyBzaW5jZSB1bnNpZ25lZCB2ZXJzaW9ucyBkb24ndCBleGlzdAogICAgIHN3aXRjaCAodHlwZS5iYXNlX3R5cGUpIHsKICAgICAgIGNhc2UgQkFTRV9UWVBFX1VUWVBFOgpAQCAtNDU4LDkgKzQ4OSw4IEBACiAgICAgICBkZWZhdWx0OiBicmVhazsKICAgICB9CiAKLSAgICByZXR1cm4gSXNTY2FsYXIodHlwZS5iYXNlX3R5cGUpCi0gICAgICAgICAgICAgICA/IENvbnZlcnRDYXNlKEdlblR5cGUodHlwZSksIENhc2U6OmtVcHBlckNhbWVsKQotICAgICAgICAgICAgICAgOiAoSXNTdHJ1Y3QodHlwZSkgPyAiU3RydWN0IiA6ICJPZmZzZXQiKTsKKyAgICByZXR1cm4gSXNTY2FsYXIodHlwZS5iYXNlX3R5cGUpID8gbmFtZXJfLlR5cGUoR2VuVHlwZSh0eXBlKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogKElzU3RydWN0KHR5cGUpID8gIlN0cnVjdCIgOiAiT2Zmc2V0Iik7CiAgIH0KIAogICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBzdGF0aWMgc3RkOjpzdHJpbmcgTWF5YmVBZGQoVCB2YWx1ZSkgewpAQCAtNDkwLDggKzUyMCw4IEBACiAgICAgfQogICB9CiAKLSAgc3RhdGljIHZvaWQgR2VuU3RydWN0Qm9keShjb25zdCBTdHJ1Y3REZWYgJnN0cnVjdF9kZWYsIHN0ZDo6c3RyaW5nICpib2R5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nICZuYW1lcHJlZml4KSB7CisgIHZvaWQgR2VuU3RydWN0Qm9keShjb25zdCBTdHJ1Y3REZWYgJnN0cnVjdF9kZWYsIHN0ZDo6c3RyaW5nICpib2R5LAorICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgJm5hbWVwcmVmaXgpIHsKICAgICAqYm9keSArPSAiICBidWlsZGVyLnByZXAoIjsKICAgICAqYm9keSArPSBOdW1Ub1N0cmluZyhzdHJ1Y3RfZGVmLm1pbmFsaWduKSArICIsICI7CiAgICAgKmJvZHkgKz0gTnVtVG9TdHJpbmcoc3RydWN0X2RlZi5ieXRlc2l6ZSkgKyAiKTtcbiI7CkBAIC01MTcsNyArNTQ3LDcgQEAKICAgfQogCiAgIHN0ZDo6c3RyaW5nIEdlbmVyYXRlTmV3RXhwcmVzc2lvbihjb25zdCBzdGQ6OnN0cmluZyAmb2JqZWN0X25hbWUpIHsKLSAgICByZXR1cm4gIm5ldyAiICsgRXNjYXBlS2V5d29yZChvYmplY3RfbmFtZSkgKyAiKCkiOworICAgIHJldHVybiAibmV3ICIgKyBuYW1lcl8uVHlwZShvYmplY3RfbmFtZSkgKyAiKCkiOwogICB9CiAKICAgdm9pZCBHZW5lcmF0ZVJvb3RBY2Nlc3NvcihTdHJ1Y3REZWYgJnN0cnVjdF9kZWYsIHN0ZDo6c3RyaW5nICpjb2RlX3B0ciwKQEAgLTU2MywxNiArNTkzLDYgQEAKICAgICB9CiAgIH0KIAotICBzdGF0aWMgc3RkOjpzdHJpbmcgR2V0T2JqQXBpQ2xhc3NOYW1lKGNvbnN0IFN0cnVjdERlZiAmc2QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSURMT3B0aW9ucyAmb3B0cykgewotICAgIHJldHVybiBHZXRPYmpBcGlDbGFzc05hbWUoc2QubmFtZSwgb3B0cyk7Ci0gIH0KLQotICBzdGF0aWMgc3RkOjpzdHJpbmcgR2V0T2JqQXBpQ2xhc3NOYW1lKGNvbnN0IHN0ZDo6c3RyaW5nICZuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElETE9wdGlvbnMgJm9wdHMpIHsKLSAgICByZXR1cm4gb3B0cy5vYmplY3RfcHJlZml4ICsgbmFtZSArIG9wdHMub2JqZWN0X3N1ZmZpeDsKLSAgfQotCiAgIGJvb2wgVW5pb25IYXNTdHJpbmdUeXBlKGNvbnN0IEVudW1EZWYgJnVuaW9uX2VudW0pIHsKICAgICByZXR1cm4gc3RkOjphbnlfb2YodW5pb25fZW51bS5WYWxzKCkuYmVnaW4oKSwgdW5pb25fZW51bS5WYWxzKCkuZW5kKCksCiAgICAgICAgICAgICAgICAgICAgICAgIFtdKGNvbnN0IEVudW1WYWwgKmV2KSB7CkBAIC02MDEsNyArNjIxLDcgQEAKICAgICAgIGlmIChJc1N0cmluZyhldi51bmlvbl90eXBlKSkgewogICAgICAgICB0eXBlID0gInN0cmluZyI7ICAvLyBubyBuZWVkIHRvIHdyYXAgc3RyaW5nIHR5cGUgaW4gbmFtZXNwYWNlCiAgICAgICB9IGVsc2UgaWYgKGV2LnVuaW9uX3R5cGUuYmFzZV90eXBlID09IEJBU0VfVFlQRV9TVFJVQ1QpIHsKLSAgICAgICAgdHlwZSA9IEFkZEltcG9ydChpbXBvcnRzLCB1bmlvbl9lbnVtLCAqZXYudW5pb25fdHlwZS5zdHJ1Y3RfZGVmKTsKKyAgICAgICAgdHlwZSA9IEFkZEltcG9ydChpbXBvcnRzLCB1bmlvbl9lbnVtLCAqZXYudW5pb25fdHlwZS5zdHJ1Y3RfZGVmKS5uYW1lOwogICAgICAgfSBlbHNlIHsKICAgICAgICAgRkxBVEJVRkZFUlNfQVNTRVJUKGZhbHNlKTsKICAgICAgIH0KQEAgLTYxNSwxNTYgKzYzNSwxNDAgQEAKICAgICByZXR1cm4gcmV0OwogICB9CiAKLSAgc3RkOjpzdHJpbmcgQWRkSW1wb3J0KGltcG9ydF9zZXQgJmltcG9ydHMsIGNvbnN0IERlZmluaXRpb24gJmRlcGVuZGVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cnVjdERlZiAmZGVwZW5kZW5jeSkgewotICAgIHN0ZDo6c3RyaW5nIG5zOwotICAgIGNvbnN0IGF1dG8gJmRlcGNfY29tcHMgPSBkZXBlbmRlbmN5LmRlZmluZWRfbmFtZXNwYWNlLT5jb21wb25lbnRzOwotICAgIGZvciAoYXV0byBpdCA9IGRlcGNfY29tcHMuYmVnaW4oKTsgaXQgIT0gZGVwY19jb21wcy5lbmQoKTsgaXQrKykgewotICAgICAgbnMgKz0gKml0OwotICAgIH0KLSAgICBzdGQ6OnN0cmluZyB1bmlxdWVfbmFtZSA9IG5zICsgZGVwZW5kZW5jeS5uYW1lOwotICAgIHN0ZDo6c3RyaW5nIGltcG9ydF9uYW1lID0gZGVwZW5kZW5jeS5uYW1lOwotICAgIHN0ZDo6c3RyaW5nIGxvbmdfaW1wb3J0X25hbWU7Ci0gICAgaWYgKGltcG9ydHMuZmluZCh1bmlxdWVfbmFtZSkgIT0gaW1wb3J0cy5lbmQoKSkKLSAgICAgIHJldHVybiBpbXBvcnRzLmZpbmQodW5pcXVlX25hbWUpLT5zZWNvbmQubmFtZTsKKyAgc3RhdGljIGJvb2wgQ2hlY2tJZk5hbWVDbGFzaGVzKGNvbnN0IGltcG9ydF9zZXQgJmltcG9ydHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyAmbmFtZSkgeworICAgIC8vIFRPRE86IHRoaXMgd291bGQgYmUgYmV0dGVyIGFzIGEgaGFzaHNldC4KICAgICBmb3IgKGF1dG8gaXQgPSBpbXBvcnRzLmJlZ2luKCk7IGl0ICE9IGltcG9ydHMuZW5kKCk7IGl0KyspIHsKLSAgICAgIGlmIChpdC0+c2Vjb25kLm5hbWUgPT0gaW1wb3J0X25hbWUpIHsKLSAgICAgICAgbG9uZ19pbXBvcnRfbmFtZSA9IG5zICsgaW1wb3J0X25hbWU7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQorICAgICAgaWYgKGl0LT5zZWNvbmQubmFtZSA9PSBuYW1lKSB7IHJldHVybiB0cnVlOyB9CiAgICAgfQotCi0gICAgaWYgKHBhcnNlcl8ub3B0cy50c19mbGF0X2ZpbGUpIHsKLSAgICAgIHN0ZDo6c3RyaW5nIGZpbGUgPSBkZXBlbmRlbmN5LmRlY2xhcmF0aW9uX2ZpbGUgPT0gbnVsbHB0cgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IGRlcGVuZGVuY3kuZmlsZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGRlcGVuZGVuY3kuZGVjbGFyYXRpb25fZmlsZS0+c3Vic3RyKDIpOwotICAgICAgZmlsZSA9IFJlbGF0aXZlVG9Sb290UGF0aChTdHJpcEZpbGVOYW1lKEFic29sdXRlUGF0aChkZXBlbmRlbnQuZmlsZSkpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXBlbmRlbmN5LmZpbGUpLnN1YnN0cigyKTsKLSAgICAgIGxvbmdfaW1wb3J0X25hbWUgPSBucyArIGltcG9ydF9uYW1lOwotICAgICAgZmxhdF9maWxlX2ltcG9ydF9kZWNsYXJhdGlvbnNfW2ZpbGVdW2ltcG9ydF9uYW1lXSA9IGxvbmdfaW1wb3J0X25hbWU7Ci0gICAgICBpZiAocGFyc2VyXy5vcHRzLmdlbmVyYXRlX29iamVjdF9iYXNlZF9hcGkpIHsKLSAgICAgICAgZmxhdF9maWxlX2ltcG9ydF9kZWNsYXJhdGlvbnNfW2ZpbGVdW2ltcG9ydF9uYW1lICsgIlQiXSA9IGxvbmdfaW1wb3J0X25hbWUgKyAiVCI7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgc3RkOjpzdHJpbmcgaW1wb3J0X3N0YXRlbWVudDsKLSAgICBzdGQ6OnN0cmluZyBleHBvcnRfc3RhdGVtZW50OwotICAgIGltcG9ydF9zdGF0ZW1lbnQgKz0gImltcG9ydCB7ICI7Ci0gICAgZXhwb3J0X3N0YXRlbWVudCArPSAiZXhwb3J0IHsgIjsKLSAgICBzdGQ6OnN0cmluZyBzeW1ib2xzX2V4cHJlc3Npb247Ci0gICAgaWYgKGxvbmdfaW1wb3J0X25hbWUuZW1wdHkoKSkgewotICAgICAgc3ltYm9sc19leHByZXNzaW9uICs9IEVzY2FwZUtleXdvcmQoaW1wb3J0X25hbWUpOwotICAgICAgaWYgKHBhcnNlcl8ub3B0cy5nZW5lcmF0ZV9vYmplY3RfYmFzZWRfYXBpKQotICAgICAgICBzeW1ib2xzX2V4cHJlc3Npb24gKz0gIiwgIiArIGltcG9ydF9uYW1lICsgIlQiOwotICAgIH0gZWxzZSB7Ci0gICAgICBzeW1ib2xzX2V4cHJlc3Npb24gKz0gRXNjYXBlS2V5d29yZChkZXBlbmRlbmN5Lm5hbWUpICsgIiBhcyAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBFc2NhcGVLZXl3b3JkKGxvbmdfaW1wb3J0X25hbWUpOwotICAgICAgaWYgKHBhcnNlcl8ub3B0cy5nZW5lcmF0ZV9vYmplY3RfYmFzZWRfYXBpKQotICAgICAgICBzeW1ib2xzX2V4cHJlc3Npb24gKz0KLSAgICAgICAgICAgICIsICIgKyBkZXBlbmRlbmN5Lm5hbWUgKyAiVCBhcyAiICsgbG9uZ19pbXBvcnRfbmFtZSArICJUIjsKLSAgICB9Ci0gICAgaW1wb3J0X3N0YXRlbWVudCArPSBzeW1ib2xzX2V4cHJlc3Npb24gKyAiIH0gZnJvbSAnIjsKLSAgICBleHBvcnRfc3RhdGVtZW50ICs9IHN5bWJvbHNfZXhwcmVzc2lvbiArICIgfSBmcm9tICciOwotICAgIHN0ZDo6c3RyaW5nIGJhcmVfZmlsZV9wYXRoOwotICAgIHN0ZDo6c3RyaW5nIHJlbF9maWxlX3BhdGg7Ci0gICAgY29uc3QgYXV0byAmZGVwX2NvbXBzID0gZGVwZW5kZW50LmRlZmluZWRfbmFtZXNwYWNlLT5jb21wb25lbnRzOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgZGVwX2NvbXBzLnNpemUoKTsgaSsrKQotICAgICAgcmVsX2ZpbGVfcGF0aCArPSBpID09IDAgPyAiLi4iIDogKGtQYXRoU2VwYXJhdG9yICsgc3RkOjpzdHJpbmcoIi4uIikpOwotICAgIGlmIChkZXBfY29tcHMuc2l6ZSgpID09IDApIHJlbF9maWxlX3BhdGggKz0gIi4iOwotICAgIGZvciAoYXV0byBpdCA9IGRlcGNfY29tcHMuYmVnaW4oKTsgaXQgIT0gZGVwY19jb21wcy5lbmQoKTsgaXQrKykKLSAgICAgIGJhcmVfZmlsZV9wYXRoICs9Ci0gICAgICAgICAga1BhdGhTZXBhcmF0b3IgKyBDb252ZXJ0Q2FzZSgqaXQsIENhc2U6OmtEYXNoZXIsIENhc2U6OmtVcHBlckNhbWVsKTsKLSAgICBiYXJlX2ZpbGVfcGF0aCArPQotICAgICAgICBrUGF0aFNlcGFyYXRvciArCi0gICAgICAgIENvbnZlcnRDYXNlKGRlcGVuZGVuY3kubmFtZSwgQ2FzZTo6a0Rhc2hlciwgQ2FzZTo6a1VwcGVyQ2FtZWwpOwotICAgIHJlbF9maWxlX3BhdGggKz0gYmFyZV9maWxlX3BhdGg7Ci0gICAgaW1wb3J0X3N0YXRlbWVudCArPSByZWxfZmlsZV9wYXRoICsgIic7IjsKLSAgICBleHBvcnRfc3RhdGVtZW50ICs9ICIuIiArIGJhcmVfZmlsZV9wYXRoICsgIic7IjsKLSAgICBJbXBvcnREZWZpbml0aW9uIGltcG9ydDsKLSAgICBpbXBvcnQubmFtZSA9IGxvbmdfaW1wb3J0X25hbWUuZW1wdHkoKSA/IGltcG9ydF9uYW1lIDogbG9uZ19pbXBvcnRfbmFtZTsKLSAgICBpbXBvcnQuYmFyZV9maWxlX3BhdGggPSBiYXJlX2ZpbGVfcGF0aDsKLSAgICBpbXBvcnQucmVsX2ZpbGVfcGF0aCA9IHJlbF9maWxlX3BhdGg7Ci0gICAgaW1wb3J0LmltcG9ydF9zdGF0ZW1lbnQgPSBpbXBvcnRfc3RhdGVtZW50OwotICAgIGltcG9ydC5leHBvcnRfc3RhdGVtZW50ID0gZXhwb3J0X3N0YXRlbWVudDsKLSAgICBpbXBvcnQuZGVwZW5kZW5jeSA9ICZkZXBlbmRlbmN5OwotICAgIGltcG9ydC5kZXBlbmRlbnQgPSAmZGVwZW5kZW50OwotICAgIGltcG9ydHMuaW5zZXJ0KHN0ZDo6bWFrZV9wYWlyKHVuaXF1ZV9uYW1lLCBpbXBvcnQpKTsKLSAgICByZXR1cm4gaW1wb3J0Lm5hbWU7CisgICAgcmV0dXJuIGZhbHNlOwogICB9CiAKLSAgLy8gVE9ETzogbGFyZ2VseSAoYnV0IG5vdCBpZGVudGljYWwpIGR1cGxpY2F0ZWQgY29kZSBmcm9tIGFib3ZlIGNvdWxuJ3QgZmluZCBhCi0gIC8vIGdvb2Qgd2F5IHRvIHJlZmFjdG9yCi0gIHN0ZDo6c3RyaW5nIEFkZEltcG9ydChpbXBvcnRfc2V0ICZpbXBvcnRzLCBjb25zdCBEZWZpbml0aW9uICZkZXBlbmRlbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBFbnVtRGVmICZkZXBlbmRlbmN5KSB7Ci0gICAgc3RkOjpzdHJpbmcgbnM7Ci0gICAgY29uc3QgYXV0byAmZGVwY19jb21wcyA9IGRlcGVuZGVuY3kuZGVmaW5lZF9uYW1lc3BhY2UtPmNvbXBvbmVudHM7Ci0gICAgZm9yIChhdXRvIGl0ID0gZGVwY19jb21wcy5iZWdpbigpOyBpdCAhPSBkZXBjX2NvbXBzLmVuZCgpOyBpdCsrKSB7Ci0gICAgICBucyArPSAqaXQ7Ci0gICAgfQotICAgIHN0ZDo6c3RyaW5nIHVuaXF1ZV9uYW1lID0gbnMgKyBkZXBlbmRlbmN5Lm5hbWU7Ci0gICAgc3RkOjpzdHJpbmcgaW1wb3J0X25hbWUgPSBFc2NhcGVLZXl3b3JkKGRlcGVuZGVuY3kubmFtZSk7Ci0gICAgc3RkOjpzdHJpbmcgbG9uZ19pbXBvcnRfbmFtZTsKLSAgICBpZiAoaW1wb3J0cy5maW5kKHVuaXF1ZV9uYW1lKSAhPSBpbXBvcnRzLmVuZCgpKSB7Ci0gICAgICByZXR1cm4gaW1wb3J0cy5maW5kKHVuaXF1ZV9uYW1lKS0+c2Vjb25kLm5hbWU7Ci0gICAgfQotICAgIGZvciAoYXV0byBpdCA9IGltcG9ydHMuYmVnaW4oKTsgaXQgIT0gaW1wb3J0cy5lbmQoKTsgaXQrKykgewotICAgICAgaWYgKGl0LT5zZWNvbmQubmFtZSA9PSBpbXBvcnRfbmFtZSkgewotICAgICAgICBsb25nX2ltcG9ydF9uYW1lID0gbnMgKyBpbXBvcnRfbmFtZTsKLSAgICAgICAgYnJlYWs7CisgIHN0ZDo6c3RyaW5nIEdlblN5bWJvbEV4cHJlc3Npb24oY29uc3QgU3RydWN0RGVmICZzdHJ1Y3RfZGVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJvb2wgaGFzX25hbWVfY2xhc2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgJmltcG9ydF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nICZuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nICZvYmplY3RfbmFtZSkgeworICAgIHN0ZDo6c3RyaW5nIHN5bWJvbHNfZXhwcmVzc2lvbjsKKworICAgIGlmIChoYXNfbmFtZV9jbGFzaCkgeworICAgICAgLy8gV2UgaGF2ZSBhIG5hbWUgY2xhc2gKKyAgICAgIHN5bWJvbHNfZXhwcmVzc2lvbiArPSBpbXBvcnRfbmFtZSArICIgYXMgIiArIG5hbWU7CisKKyAgICAgIGlmIChwYXJzZXJfLm9wdHMuZ2VuZXJhdGVfb2JqZWN0X2Jhc2VkX2FwaSkgeworICAgICAgICBzeW1ib2xzX2V4cHJlc3Npb24gKz0gIiwgIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHZXRUeXBlTmFtZShzdHJ1Y3RfZGVmLCAvKm9iamVjdF9hcGkgPSovdHJ1ZSkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBhcyAiICsgb2JqZWN0X25hbWU7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIC8vIE5vIG5hbWUgY2xhc2gsIHVzZSB0aGUgcHJvdmlkZWQgbmFtZQorICAgICAgc3ltYm9sc19leHByZXNzaW9uICs9IG5hbWU7CisKKyAgICAgIGlmIChwYXJzZXJfLm9wdHMuZ2VuZXJhdGVfb2JqZWN0X2Jhc2VkX2FwaSkgeworICAgICAgICBzeW1ib2xzX2V4cHJlc3Npb24gKz0gIiwgIiArIG9iamVjdF9uYW1lOwogICAgICAgfQogICAgIH0KIAotICAgIGlmIChwYXJzZXJfLm9wdHMudHNfZmxhdF9maWxlKSB7Ci0gICAgICBzdGQ6OnN0cmluZyBmaWxlID0gZGVwZW5kZW5jeS5kZWNsYXJhdGlvbl9maWxlID09IG51bGxwdHIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBkZXBlbmRlbmN5LmZpbGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBkZXBlbmRlbmN5LmRlY2xhcmF0aW9uX2ZpbGUtPnN1YnN0cigyKTsKLSAgICAgIGZpbGUgPSBSZWxhdGl2ZVRvUm9vdFBhdGgoU3RyaXBGaWxlTmFtZShBYnNvbHV0ZVBhdGgoZGVwZW5kZW50LmZpbGUpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVwZW5kZW5jeS5maWxlKS5zdWJzdHIoMik7Ci0gICAgICBsb25nX2ltcG9ydF9uYW1lID0gbnMgKyBpbXBvcnRfbmFtZTsKLSAgICAgIGZsYXRfZmlsZV9pbXBvcnRfZGVjbGFyYXRpb25zX1tmaWxlXVtpbXBvcnRfbmFtZV0gPSBsb25nX2ltcG9ydF9uYW1lOworICAgIHJldHVybiBzeW1ib2xzX2V4cHJlc3Npb247CisgIH0KKworICBzdGQ6OnN0cmluZyBHZW5TeW1ib2xFeHByZXNzaW9uKGNvbnN0IEVudW1EZWYgJmVudW1fZGVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJvb2wgaGFzX25hbWVfY2xhc2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgJmltcG9ydF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nICZuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nICYpIHsKKyAgICBzdGQ6OnN0cmluZyBzeW1ib2xzX2V4cHJlc3Npb247CisgICAgaWYgKGhhc19uYW1lX2NsYXNoKSB7CisgICAgICBzeW1ib2xzX2V4cHJlc3Npb24gKz0gaW1wb3J0X25hbWUgKyAiIGFzICIgKyBuYW1lOworICAgIH0gZWxzZSB7CisgICAgICBzeW1ib2xzX2V4cHJlc3Npb24gKz0gbmFtZTsKICAgICB9CiAKLSAgICBzdGQ6OnN0cmluZyBpbXBvcnRfc3RhdGVtZW50OwotICAgIHN0ZDo6c3RyaW5nIGV4cG9ydF9zdGF0ZW1lbnQ7Ci0gICAgaW1wb3J0X3N0YXRlbWVudCArPSAiaW1wb3J0IHsgIjsKLSAgICBleHBvcnRfc3RhdGVtZW50ICs9ICJleHBvcnQgeyAiOwotICAgIHN0ZDo6c3RyaW5nIHN5bWJvbHNfZXhwcmVzc2lvbjsKLSAgICBpZiAobG9uZ19pbXBvcnRfbmFtZS5lbXB0eSgpKQotICAgICAgc3ltYm9sc19leHByZXNzaW9uICs9IGltcG9ydF9uYW1lOwotICAgIGVsc2UKLSAgICAgIHN5bWJvbHNfZXhwcmVzc2lvbiArPSBFc2NhcGVLZXl3b3JkKGRlcGVuZGVuY3kubmFtZSkgKyAiIGFzICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVzY2FwZUtleXdvcmQobG9uZ19pbXBvcnRfbmFtZSk7Ci0gICAgaWYgKGRlcGVuZGVuY3kuaXNfdW5pb24pIHsKLSAgICAgIHN5bWJvbHNfZXhwcmVzc2lvbiArPSAiLCB1bmlvblRvIiArIGltcG9ydF9uYW1lOwotICAgICAgc3ltYm9sc19leHByZXNzaW9uICs9ICIsIHVuaW9uTGlzdFRvIiArIGltcG9ydF9uYW1lOworICAgIGlmIChlbnVtX2RlZi5pc191bmlvbikgeworICAgICAgc3ltYm9sc19leHByZXNzaW9uICs9ICIsIHVuaW9uVG8iICsgbmFtZTsKKyAgICAgIHN5bWJvbHNfZXhwcmVzc2lvbiArPSAiLCB1bmlvbkxpc3RUbyIgKyBuYW1lOwogICAgIH0KLSAgICBpbXBvcnRfc3RhdGVtZW50ICs9IHN5bWJvbHNfZXhwcmVzc2lvbiArICIgfSBmcm9tICciOwotICAgIGV4cG9ydF9zdGF0ZW1lbnQgKz0gc3ltYm9sc19leHByZXNzaW9uICsgIiB9IGZyb20gJyI7CisKKyAgICByZXR1cm4gc3ltYm9sc19leHByZXNzaW9uOworICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGVmaW5pdGlvblQ+CisgIEltcG9ydERlZmluaXRpb24gQWRkSW1wb3J0KGltcG9ydF9zZXQgJmltcG9ydHMsIGNvbnN0IERlZmluaXRpb24gJmRlcGVuZGVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRGVmaW5pdGlvblQgJmRlcGVuZGVuY3kpIHsKKyAgICAvLyBUaGUgdW5pcXVlIG5hbWUgb2YgdGhlIGRlcGVuZGVuY3ksIGZ1bGx5IHF1YWxpZmllZCBpbiBpdHMgbmFtZXNwYWNlLgorICAgIGNvbnN0IHN0ZDo6c3RyaW5nIHVuaXF1ZV9uYW1lID0gR2V0VHlwZU5hbWUoCisgICAgICAgIGRlcGVuZGVuY3ksIC8qb2JqZWN0X2FwaSA9ICovIGZhbHNlLCAvKmZvcmNlX25zX3dyYXA9Ki90cnVlKTsKKworICAgIC8vIExvb2sgaWYgd2UgaGF2ZSBhbHJlYWR5IGFkZGVkIHRoaXMgaW1wb3J0IGFuZCByZXR1cm4gaXRzIG5hbWUgaWYgZm91bmQuCisgICAgY29uc3QgYXV0byBpbXBvcnRfcGFpciA9IGltcG9ydHMuZmluZCh1bmlxdWVfbmFtZSk7CisgICAgaWYgKGltcG9ydF9wYWlyICE9IGltcG9ydHMuZW5kKCkpIHsgcmV0dXJuIGltcG9ydF9wYWlyLT5zZWNvbmQ7IH0KKworICAgIC8vIENoZWNrIGlmIHRoaXMgbmFtZSB3b3VsZCBoYXZlIGEgbmFtZSBjbGFzaCB3aXRoIGFub3RoZXIgdHlwZS4gSnVzdCB1c2UKKyAgICAvLyB0aGUgImJhc2UiIG5hbWUgKHByb3Blcmx5IGVzY2FwZWQpIHdpdGhvdXQgYW55IG5hbWVzcGFjaW5nIGFwcGxpZWQuCisgICAgY29uc3Qgc3RkOjpzdHJpbmcgaW1wb3J0X25hbWUgPSBHZXRUeXBlTmFtZShkZXBlbmRlbmN5KTsKKyAgICBjb25zdCBib29sIGhhc19uYW1lX2NsYXNoID0gQ2hlY2tJZk5hbWVDbGFzaGVzKGltcG9ydHMsIGltcG9ydF9uYW1lKTsKKworICAgIC8vIElmIHdlIGhhdmUgYSBuYW1lIGNsYXNoLCB1c2UgdGhlIHVuaXF1ZSBuYW1lLCBvdGhlcndpc2UgdXNlIHNpbXBsZSBuYW1lLgorICAgIHN0ZDo6c3RyaW5nIG5hbWUgPSBoYXNfbmFtZV9jbGFzaCA/IHVuaXF1ZV9uYW1lIDogaW1wb3J0X25hbWU7CisKKyAgICBjb25zdCBzdGQ6OnN0cmluZyBvYmplY3RfbmFtZSA9CisgICAgICAgIEdldFR5cGVOYW1lKGRlcGVuZGVuY3ksIC8qb2JqZWN0X2FwaT0qL3RydWUsIGhhc19uYW1lX2NsYXNoKTsKKworICAgIGlmIChwYXJzZXJfLm9wdHMudHNfZmxhdF9maWxlKSB7CisgICAgICAvLyBJbiBmbGF0LWZpbGUgZ2VuZXJhdGlvbiwgZG8gbm90IGF0dGVtcHQgdG8gaW1wb3J0IHRoaW5ncyBmcm9tIG91cnNlbHZlcworICAgICAgLy8gKmFuZCogZG8gbm90IHdyYXAgbmFtZXNwYWNlcyAobm90ZSB0aGF0IHRoaXMgZG9lcyBvdmVycmlkZSB0aGUgbG9naWMKKyAgICAgIC8vIGFib3ZlLCBidXQgc2luY2Ugd2UgZm9yY2UgYWxsIG5vbi1zZWxmLWltcG9ydHMgdG8gdXNlIG5hbWVzcGFjZS1iYXNlZAorICAgICAgLy8gbmFtZXMgaW4gZmxhdCBmaWxlIGdlbmVyYXRpb24sIGl0J3MgZmluZSkuCisgICAgICBpZiAoZGVwZW5kZW50LmZpbGUgPT0gZGVwZW5kZW5jeS5maWxlKSB7CisgICAgICAgIG5hbWUgPSBpbXBvcnRfbmFtZTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nIGZpbGUgPQorICAgICAgICAgICAgUmVsYXRpdmVUb1Jvb3RQYXRoKFN0cmlwRmlsZU5hbWUoQWJzb2x1dGVQYXRoKGRlcGVuZGVudC5maWxlKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVwZW5kZW5jeS5maWxlKQorICAgICAgICAgICAgICAgIC8vIFN0cmlwIHRoZSBsZWFkaW5nIC8vCisgICAgICAgICAgICAgICAgLnN1YnN0cigyKTsKKyAgICAgICAgZmxhdF9maWxlX2ltcG9ydF9kZWNsYXJhdGlvbnNfW2ZpbGVdW2ltcG9ydF9uYW1lXSA9IG5hbWU7CisKKyAgICAgICAgaWYgKHBhcnNlcl8ub3B0cy5nZW5lcmF0ZV9vYmplY3RfYmFzZWRfYXBpICYmCisgICAgICAgICAgICBTdXBwb3J0c09iamVjdEFQSTxEZWZpbml0aW9uVD46OnZhbHVlKSB7CisgICAgICAgICAgZmxhdF9maWxlX2ltcG9ydF9kZWNsYXJhdGlvbnNfW2ZpbGVdW2ltcG9ydF9uYW1lICsgIlQiXSA9IG9iamVjdF9uYW1lOworICAgICAgICB9CisgICAgICB9CisgICAgfQorCisgICAgY29uc3Qgc3RkOjpzdHJpbmcgc3ltYm9sc19leHByZXNzaW9uID0gR2VuU3ltYm9sRXhwcmVzc2lvbigKKyAgICAgICAgZGVwZW5kZW5jeSwgaGFzX25hbWVfY2xhc2gsIGltcG9ydF9uYW1lLCBuYW1lLCBvYmplY3RfbmFtZSk7CisKICAgICBzdGQ6OnN0cmluZyBiYXJlX2ZpbGVfcGF0aDsKICAgICBzdGQ6OnN0cmluZyByZWxfZmlsZV9wYXRoOwogICAgIGNvbnN0IGF1dG8gJmRlcF9jb21wcyA9IGRlcGVuZGVudC5kZWZpbmVkX25hbWVzcGFjZS0+Y29tcG9uZW50czsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGRlcF9jb21wcy5zaXplKCk7IGkrKykKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGRlcF9jb21wcy5zaXplKCk7IGkrKykgewogICAgICAgcmVsX2ZpbGVfcGF0aCArPSBpID09IDAgPyAiLi4iIDogKGtQYXRoU2VwYXJhdG9yICsgc3RkOjpzdHJpbmcoIi4uIikpOwotICAgIGlmIChkZXBfY29tcHMuc2l6ZSgpID09IDApIHJlbF9maWxlX3BhdGggKz0gIi4iOwotICAgIGZvciAoYXV0byBpdCA9IGRlcGNfY29tcHMuYmVnaW4oKTsgaXQgIT0gZGVwY19jb21wcy5lbmQoKTsgaXQrKykKLSAgICAgIGJhcmVfZmlsZV9wYXRoICs9Ci0gICAgICAgICAga1BhdGhTZXBhcmF0b3IgKyBDb252ZXJ0Q2FzZSgqaXQsIENhc2U6OmtEYXNoZXIsIENhc2U6OmtVcHBlckNhbWVsKTsKKyAgICB9CisgICAgaWYgKGRlcF9jb21wcy5zaXplKCkgPT0gMCkgeyByZWxfZmlsZV9wYXRoICs9ICIuIjsgfQorCiAgICAgYmFyZV9maWxlX3BhdGggKz0KICAgICAgICAga1BhdGhTZXBhcmF0b3IgKwotICAgICAgICBDb252ZXJ0Q2FzZShkZXBlbmRlbmN5Lm5hbWUsIENhc2U6OmtEYXNoZXIsIENhc2U6OmtVcHBlckNhbWVsKTsKKyAgICAgICAgbmFtZXJfLkRpcmVjdG9yaWVzKGRlcGVuZGVuY3kuZGVmaW5lZF9uYW1lc3BhY2UtPmNvbXBvbmVudHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBTa2lwRGlyOjpPdXRwdXRQYXRoKSArCisgICAgICAgIG5hbWVyXy5GaWxlKGRlcGVuZGVuY3ksIFNraXBGaWxlOjpTdWZmaXhBbmRFeHRlbnNpb24pOwogICAgIHJlbF9maWxlX3BhdGggKz0gYmFyZV9maWxlX3BhdGg7Ci0gICAgaW1wb3J0X3N0YXRlbWVudCArPSByZWxfZmlsZV9wYXRoICsgIic7IjsKLSAgICBleHBvcnRfc3RhdGVtZW50ICs9ICIuIiArIGJhcmVfZmlsZV9wYXRoICsgIic7IjsKKwogICAgIEltcG9ydERlZmluaXRpb24gaW1wb3J0OwotICAgIGltcG9ydC5uYW1lID0gbG9uZ19pbXBvcnRfbmFtZS5lbXB0eSgpID8gaW1wb3J0X25hbWUgOiBsb25nX2ltcG9ydF9uYW1lOworICAgIGltcG9ydC5uYW1lID0gbmFtZTsKKyAgICBpbXBvcnQub2JqZWN0X25hbWUgPSBvYmplY3RfbmFtZTsKICAgICBpbXBvcnQuYmFyZV9maWxlX3BhdGggPSBiYXJlX2ZpbGVfcGF0aDsKICAgICBpbXBvcnQucmVsX2ZpbGVfcGF0aCA9IHJlbF9maWxlX3BhdGg7Ci0gICAgaW1wb3J0LmltcG9ydF9zdGF0ZW1lbnQgPSBpbXBvcnRfc3RhdGVtZW50OwotICAgIGltcG9ydC5leHBvcnRfc3RhdGVtZW50ID0gZXhwb3J0X3N0YXRlbWVudDsKKyAgICBpbXBvcnQuaW1wb3J0X3N0YXRlbWVudCA9CisgICAgICAgICJpbXBvcnQgeyAiICsgc3ltYm9sc19leHByZXNzaW9uICsgIiB9IGZyb20gJyIgKyByZWxfZmlsZV9wYXRoICsgIi5qcyc7IjsKKyAgICBpbXBvcnQuZXhwb3J0X3N0YXRlbWVudCA9CisgICAgICAgICJleHBvcnQgeyAiICsgc3ltYm9sc19leHByZXNzaW9uICsgIiB9IGZyb20gJy4iICsgYmFyZV9maWxlX3BhdGggKyAiLmpzJzsiOwogICAgIGltcG9ydC5kZXBlbmRlbmN5ID0gJmRlcGVuZGVuY3k7CiAgICAgaW1wb3J0LmRlcGVuZGVudCA9ICZkZXBlbmRlbnQ7CisKICAgICBpbXBvcnRzLmluc2VydChzdGQ6Om1ha2VfcGFpcih1bmlxdWVfbmFtZSwgaW1wb3J0KSk7Ci0gICAgcmV0dXJuIGltcG9ydC5uYW1lOworCisgICAgcmV0dXJuIGltcG9ydDsKICAgfQogCiAgIHZvaWQgQWRkSW1wb3J0KGltcG9ydF9zZXQgJmltcG9ydHMsIHN0ZDo6c3RyaW5nIGltcG9ydF9uYW1lLApAQCAtNzc3LDcgKzc4MSw5IEBACiAgIH0KIAogICAvLyBHZW5lcmF0ZSBhIFRTIHVuaW9uIHR5cGUgYmFzZWQgb24gYSB1bmlvbidzIGVudW0KLSAgc3RkOjpzdHJpbmcgR2VuT2JqQXBpVW5pb25UeXBlVFMoaW1wb3J0X3NldCAmaW1wb3J0cywgY29uc3QgSURMT3B0aW9ucyAmb3B0cywKKyAgc3RkOjpzdHJpbmcgR2VuT2JqQXBpVW5pb25UeXBlVFMoaW1wb3J0X3NldCAmaW1wb3J0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RydWN0RGVmICZkZXBlbmRlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElETE9wdGlvbnMgJiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRW51bURlZiAmdW5pb25fZW51bSkgewogICAgIHN0ZDo6c3RyaW5nIHJldCA9ICIiOwogICAgIHN0ZDo6c2V0PHN0ZDo6c3RyaW5nPiB0eXBlX2xpc3Q7CkBAIC03OTEsOCArNzk3LDggQEAKICAgICAgIGlmIChJc1N0cmluZyhldi51bmlvbl90eXBlKSkgewogICAgICAgICB0eXBlID0gInN0cmluZyI7ICAvLyBubyBuZWVkIHRvIHdyYXAgc3RyaW5nIHR5cGUgaW4gbmFtZXNwYWNlCiAgICAgICB9IGVsc2UgaWYgKGV2LnVuaW9uX3R5cGUuYmFzZV90eXBlID09IEJBU0VfVFlQRV9TVFJVQ1QpIHsKLSAgICAgICAgdHlwZSA9IEdldE9iakFwaUNsYXNzTmFtZSgKLSAgICAgICAgICAgIEFkZEltcG9ydChpbXBvcnRzLCB1bmlvbl9lbnVtLCAqZXYudW5pb25fdHlwZS5zdHJ1Y3RfZGVmKSwgb3B0cyk7CisgICAgICAgIHR5cGUgPSBBZGRJbXBvcnQoaW1wb3J0cywgZGVwZW5kZW50LCAqZXYudW5pb25fdHlwZS5zdHJ1Y3RfZGVmKQorICAgICAgICAgICAgICAgICAgIC5vYmplY3RfbmFtZTsKICAgICAgIH0gZWxzZSB7CiAgICAgICAgIEZMQVRCVUZGRVJTX0FTU0VSVChmYWxzZSk7CiAgICAgICB9CkBAIC04MDksMTEgKzgxNSwxMSBAQAogICB9CiAKICAgc3RkOjpzdHJpbmcgR2VuVW5pb25Db252RnVuY05hbWUoY29uc3QgRW51bURlZiAmZW51bV9kZWYpIHsKLSAgICByZXR1cm4gInVuaW9uVG8iICsgZW51bV9kZWYubmFtZTsKKyAgICByZXR1cm4gbmFtZXJfLkZ1bmN0aW9uKCJ1bmlvblRvIiwgZW51bV9kZWYpOwogICB9CiAKICAgc3RkOjpzdHJpbmcgR2VuVW5pb25MaXN0Q29udkZ1bmNOYW1lKGNvbnN0IEVudW1EZWYgJmVudW1fZGVmKSB7Ci0gICAgcmV0dXJuICJ1bmlvbkxpc3RUbyIgKyBlbnVtX2RlZi5uYW1lOworICAgIHJldHVybiBuYW1lcl8uRnVuY3Rpb24oInVuaW9uTGlzdFRvIiwgZW51bV9kZWYpOwogICB9CiAKICAgc3RkOjpzdHJpbmcgR2VuVW5pb25Db252RnVuYyhjb25zdCBUeXBlICZ1bmlvbl90eXBlLCBpbXBvcnRfc2V0ICZpbXBvcnRzKSB7CkBAIC04MjQsMTIgKzgzMCwxMiBAQAogICAgICAgY29uc3QgYXV0byB2YWxpZF91bmlvbl90eXBlX3dpdGhfbnVsbCA9IHZhbGlkX3VuaW9uX3R5cGUgKyAifG51bGwiOwogCiAgICAgICBhdXRvIHJldCA9ICJcblxuZXhwb3J0IGZ1bmN0aW9uICIgKyBHZW5VbmlvbkNvbnZGdW5jTmFtZShlbnVtX2RlZikgKwotICAgICAgICAgICAgICAgICAiKFxuICB0eXBlOiAiICsgZW51bV9kZWYubmFtZSArCisgICAgICAgICAgICAgICAgICIoXG4gIHR5cGU6ICIgKyBHZXRUeXBlTmFtZShlbnVtX2RlZikgKwogICAgICAgICAgICAgICAgICAiLFxuICBhY2Nlc3NvcjogKG9iajoiICsgdmFsaWRfdW5pb25fdHlwZSArICIpID0+ICIgKwogICAgICAgICAgICAgICAgICB2YWxpZF91bmlvbl90eXBlX3dpdGhfbnVsbCArCiAgICAgICAgICAgICAgICAgICJcbik6ICIgKyB2YWxpZF91bmlvbl90eXBlX3dpdGhfbnVsbCArICIge1xuIjsKIAotICAgICAgY29uc3QgYXV0byBlbnVtX3R5cGUgPSBBZGRJbXBvcnQoaW1wb3J0cywgZW51bV9kZWYsIGVudW1fZGVmKTsKKyAgICAgIGNvbnN0IGF1dG8gZW51bV90eXBlID0gQWRkSW1wb3J0KGltcG9ydHMsIGVudW1fZGVmLCBlbnVtX2RlZikubmFtZTsKIAogICAgICAgY29uc3QgYXV0byB1bmlvbl9lbnVtX2xvb3AgPSBbJl0oY29uc3Qgc3RkOjpzdHJpbmcgJmFjY2Vzc29yX3N0cikgewogICAgICAgICByZXQgKz0gIiAgc3dpdGNoKCIgKyBlbnVtX3R5cGUgKyAiW3R5cGVdKSB7XG4iOwpAQCAtODQwLDEzICs4NDYsMTMgQEAKICAgICAgICAgICBjb25zdCBhdXRvICZldiA9ICoqaXQ7CiAgICAgICAgICAgaWYgKGV2LklzWmVybygpKSB7IGNvbnRpbnVlOyB9CiAKLSAgICAgICAgICByZXQgKz0gIiAgICBjYXNlICciICsgZXYubmFtZSArICInOiAiOworICAgICAgICAgIHJldCArPSAiICAgIGNhc2UgJyIgKyBuYW1lcl8uVmFyaWFudChldikgKyAiJzogIjsKIAogICAgICAgICAgIGlmIChJc1N0cmluZyhldi51bmlvbl90eXBlKSkgewogICAgICAgICAgICAgcmV0ICs9ICJyZXR1cm4gIiArIGFjY2Vzc29yX3N0ciArICInJykgYXMgc3RyaW5nOyI7CiAgICAgICAgICAgfSBlbHNlIGlmIChldi51bmlvbl90eXBlLmJhc2VfdHlwZSA9PSBCQVNFX1RZUEVfU1RSVUNUKSB7CiAgICAgICAgICAgICBjb25zdCBhdXRvIHR5cGUgPQotICAgICAgICAgICAgICAgIEFkZEltcG9ydChpbXBvcnRzLCBlbnVtX2RlZiwgKmV2LnVuaW9uX3R5cGUuc3RydWN0X2RlZik7CisgICAgICAgICAgICAgICAgQWRkSW1wb3J0KGltcG9ydHMsIGVudW1fZGVmLCAqZXYudW5pb25fdHlwZS5zdHJ1Y3RfZGVmKS5uYW1lOwogICAgICAgICAgICAgcmV0ICs9ICJyZXR1cm4gIiArIGFjY2Vzc29yX3N0ciArICJuZXcgIiArIHR5cGUgKyAiKCkpISBhcyAiICsKICAgICAgICAgICAgICAgICAgICB0eXBlICsgIjsiOwogICAgICAgICAgIH0gZWxzZSB7CkBAIC04NjMsNyArODY5LDcgQEAKICAgICAgIHJldCArPSAifSI7CiAKICAgICAgIHJldCArPSAiXG5cbmV4cG9ydCBmdW5jdGlvbiAiICsgR2VuVW5pb25MaXN0Q29udkZ1bmNOYW1lKGVudW1fZGVmKSArCi0gICAgICAgICAgICAgIihcbiAgdHlwZTogIiArIGVudW1fZGVmLm5hbWUgKworICAgICAgICAgICAgICIoXG4gIHR5cGU6ICIgKyBHZXRUeXBlTmFtZShlbnVtX2RlZikgKwogICAgICAgICAgICAgICIsIFxuICBhY2Nlc3NvcjogKGluZGV4OiBudW1iZXIsIG9iajoiICsgdmFsaWRfdW5pb25fdHlwZSArCiAgICAgICAgICAgICAgIikgPT4gIiArIHZhbGlkX3VuaW9uX3R5cGVfd2l0aF9udWxsICsKICAgICAgICAgICAgICAiLCBcbiAgaW5kZXg6IG51bWJlclxuKTogIiArIHZhbGlkX3VuaW9uX3R5cGVfd2l0aF9udWxsICsgIiB7XG4iOwpAQCAtODc5LDEyICs4ODUsMTMgQEAKICAgLy8gVXNlZCBmb3IgZ2VuZXJhdGluZyBhIHNob3J0IGZ1bmN0aW9uIHRoYXQgcmV0dXJucyB0aGUgY29ycmVjdCBjbGFzcwogICAvLyBiYXNlZCBvbiB1bmlvbiBlbnVtIHR5cGUuIEFzc3VtZSB0aGUgY29udGV4dCBpcyBpbnNpZGUgdGhlIG5vbiBvYmplY3QgYXBpCiAgIC8vIHR5cGUKLSAgc3RkOjpzdHJpbmcgR2VuVW5pb25WYWxUUyhpbXBvcnRfc2V0ICZpbXBvcnRzLCBjb25zdCBzdGQ6OnN0cmluZyAmZmllbGRfbmFtZSwKKyAgc3RkOjpzdHJpbmcgR2VuVW5pb25WYWxUUyhpbXBvcnRfc2V0ICZpbXBvcnRzLCBjb25zdCBTdHJ1Y3REZWYgJmRlcGVuZGVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyAmZmllbGRfbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUeXBlICZ1bmlvbl90eXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJvb2wgaXNfYXJyYXkgPSBmYWxzZSkgewogICAgIGlmICh1bmlvbl90eXBlLmVudW1fZGVmKSB7CiAgICAgICBjb25zdCBhdXRvICZlbnVtX2RlZiA9ICp1bmlvbl90eXBlLmVudW1fZGVmOwotICAgICAgY29uc3QgYXV0byBlbnVtX3R5cGUgPSBBZGRJbXBvcnQoaW1wb3J0cywgZW51bV9kZWYsIGVudW1fZGVmKTsKKyAgICAgIGNvbnN0IGF1dG8gZW51bV90eXBlID0gQWRkSW1wb3J0KGltcG9ydHMsIGRlcGVuZGVudCwgZW51bV9kZWYpLm5hbWU7CiAgICAgICBjb25zdCBzdGQ6OnN0cmluZyB1bmlvbl9hY2Nlc3NvciA9ICJ0aGlzLiIgKyBmaWVsZF9uYW1lOwogCiAgICAgICBjb25zdCBhdXRvIHVuaW9uX2hhc19zdHJpbmcgPSBVbmlvbkhhc1N0cmluZ1R5cGUoZW51bV9kZWYpOwpAQCAtODk0LDExICs5MDEsMTEgQEAKIAogICAgICAgaWYgKCFpc19hcnJheSkgewogICAgICAgICBjb25zdCBhdXRvIGNvbnZlcnNpb25fZnVuY3Rpb24gPSBHZW5VbmlvbkNvbnZGdW5jTmFtZShlbnVtX2RlZik7Ci0gICAgICAgIGNvbnN0IGF1dG8gdGFyZ2V0X2VudW0gPSAidGhpcy4iICsgZmllbGRfbmFtZSArICJUeXBlKCkiOwogCiAgICAgICAgIHJldCA9ICIoKCkgPT4ge1xuIjsKLSAgICAgICAgcmV0ICs9ICIgICAgICBsZXQgdGVtcCA9ICIgKyBjb252ZXJzaW9uX2Z1bmN0aW9uICsgIigiICsgdGFyZ2V0X2VudW0gKwotICAgICAgICAgICAgICAgIiwgIiArIGZpZWxkX2JpbmRlZF9tZXRob2QgKyAiKTtcbiI7CisgICAgICAgIHJldCArPSAiICAgICAgbGV0IHRlbXAgPSAiICsgY29udmVyc2lvbl9mdW5jdGlvbiArICIodGhpcy4iICsKKyAgICAgICAgICAgICAgIG5hbWVyXy5NZXRob2QoZmllbGRfbmFtZSwgIlR5cGUiKSArICIoKSwgIiArCisgICAgICAgICAgICAgICBmaWVsZF9iaW5kZWRfbWV0aG9kICsgIik7XG4iOwogICAgICAgICByZXQgKz0gIiAgICAgIGlmKHRlbXAgPT09IG51bGwpIHsgcmV0dXJuIG51bGw7IH1cbiI7CiAgICAgICAgIHJldCArPSB1bmlvbl9oYXNfc3RyaW5nCiAgICAgICAgICAgICAgICAgICAgPyAiICAgICAgaWYodHlwZW9mIHRlbXAgPT09ICdzdHJpbmcnKSB7IHJldHVybiB0ZW1wOyB9XG4iCkBAIC05MDcsMTcgKzkxNCwxNSBAQAogICAgICAgICByZXQgKz0gIiAgfSkoKSI7CiAgICAgICB9IGVsc2UgewogICAgICAgICBjb25zdCBhdXRvIGNvbnZlcnNpb25fZnVuY3Rpb24gPSBHZW5Vbmlvbkxpc3RDb252RnVuY05hbWUoZW51bV9kZWYpOwotICAgICAgICBjb25zdCBhdXRvIHRhcmdldF9lbnVtX2FjY2Vzb3IgPSAidGhpcy4iICsgZmllbGRfbmFtZSArICJUeXBlIjsKLSAgICAgICAgY29uc3QgYXV0byB0YXJnZXRfZW51bV9sZW5ndGggPSB0YXJnZXRfZW51bV9hY2Nlc29yICsgIkxlbmd0aCgpIjsKIAogICAgICAgICByZXQgPSAiKCgpID0+IHtcbiI7CiAgICAgICAgIHJldCArPSAiICAgIGxldCByZXQgPSBbXTtcbiI7Ci0gICAgICAgIHJldCArPSAiICAgIGZvcihsZXQgdGFyZ2V0RW51bUluZGV4ID0gMDsgdGFyZ2V0RW51bUluZGV4IDwgIiArCi0gICAgICAgICAgICAgICB0YXJnZXRfZW51bV9sZW5ndGggKworICAgICAgICByZXQgKz0gIiAgICBmb3IobGV0IHRhcmdldEVudW1JbmRleCA9IDA7IHRhcmdldEVudW1JbmRleCA8IHRoaXMuIiArCisgICAgICAgICAgICAgICBuYW1lcl8uTWV0aG9kKGZpZWxkX25hbWUsICJUeXBlTGVuZ3RoIikgKyAiKCkiICsKICAgICAgICAgICAgICAgICI7ICIKICAgICAgICAgICAgICAgICIrK3RhcmdldEVudW1JbmRleCkge1xuIjsKLSAgICAgICAgcmV0ICs9ICIgICAgICBsZXQgdGFyZ2V0RW51bSA9ICIgKyB0YXJnZXRfZW51bV9hY2Nlc29yICsKLSAgICAgICAgICAgICAgICIodGFyZ2V0RW51bUluZGV4KTtcbiI7CisgICAgICAgIHJldCArPSAiICAgICAgbGV0IHRhcmdldEVudW0gPSB0aGlzLiIgKworICAgICAgICAgICAgICAgbmFtZXJfLk1ldGhvZChmaWVsZF9uYW1lLCAiVHlwZSIpICsgIih0YXJnZXRFbnVtSW5kZXgpO1xuIjsKICAgICAgICAgcmV0ICs9ICIgICAgICBpZih0YXJnZXRFbnVtID09PSBudWxsIHx8ICIgKyBlbnVtX3R5cGUgKwogICAgICAgICAgICAgICAgIlt0YXJnZXRFbnVtIV0gPT09ICdOT05FJykgeyAiCiAgICAgICAgICAgICAgICAiY29udGludWU7IH1cblxuIjsKQEAgLTk1NiwxNSArOTYxLDIwIEBACiAgICAgICAgICBpdCAhPSBzdHJ1Y3RfZGVmLmZpZWxkcy52ZWMuZW5kKCk7ICsraXQpIHsKICAgICAgIGF1dG8gJmZpZWxkID0gKippdDsKIAotICAgICAgY29uc3QgYXV0byBjdXJyX21lbWJlcl9hY2Nlc3NvciA9Ci0gICAgICAgICAgcHJlZml4ICsgIi4iICsgQ29udmVydENhc2UoZmllbGQubmFtZSwgQ2FzZTo6a0xvd2VyQ2FtZWwpOworICAgICAgYXV0byBjdXJyX21lbWJlcl9hY2Nlc3NvciA9IHByZWZpeCArICIuIiArIG5hbWVyXy5NZXRob2QoZmllbGQpOworICAgICAgaWYgKHByZWZpeCAhPSAidGhpcyIpIHsKKyAgICAgICAgY3Vycl9tZW1iZXJfYWNjZXNzb3IgPSBwcmVmaXggKyAiPy4iICsgbmFtZXJfLk1ldGhvZChmaWVsZCk7CisgICAgICB9CiAgICAgICBpZiAoSXNTdHJ1Y3QoZmllbGQudmFsdWUudHlwZSkpIHsKICAgICAgICAgcmV0ICs9IEdlblN0cnVjdE1lbWJlclZhbHVlVFMoKmZpZWxkLnZhbHVlLnR5cGUuc3RydWN0X2RlZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3Vycl9tZW1iZXJfYWNjZXNzb3IsIGRlbGltaXRlcik7CiAgICAgICB9IGVsc2UgewogICAgICAgICBpZiAobnVsbENoZWNrKSB7Ci0gICAgICAgICAgcmV0ICs9Ci0gICAgICAgICAgICAgICIoIiArIHByZWZpeCArICIgPT09IG51bGwgPyAwIDogIiArIGN1cnJfbWVtYmVyX2FjY2Vzc29yICsgIiEpIjsKKyAgICAgICAgICBzdGQ6OnN0cmluZyBudWxsVmFsdWUgPSAiMCI7CisgICAgICAgICAgaWYgKGZpZWxkLnZhbHVlLnR5cGUuYmFzZV90eXBlID09IEJBU0VfVFlQRV9CT09MKSB7CisgICAgICAgICAgICBudWxsVmFsdWUgPSAiZmFsc2UiOworICAgICAgICAgIH0KKyAgICAgICAgICByZXQgKz0gIigiICsgY3Vycl9tZW1iZXJfYWNjZXNzb3IgKyAiID8/ICIgKyBudWxsVmFsdWUgKyAiKSI7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgcmV0ICs9IGN1cnJfbWVtYmVyX2FjY2Vzc29yOwogICAgICAgICB9CkBAIC05NzksNyArOTg5LDcgQEAKICAgdm9pZCBHZW5PYmpBcGkoY29uc3QgUGFyc2VyICZwYXJzZXIsIFN0cnVjdERlZiAmc3RydWN0X2RlZiwKICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgJm9ial9hcGlfdW5wYWNrX2Z1bmMsIHN0ZDo6c3RyaW5nICZvYmpfYXBpX2NsYXNzLAogICAgICAgICAgICAgICAgICBpbXBvcnRfc2V0ICZpbXBvcnRzKSB7Ci0gICAgY29uc3QgYXV0byBjbGFzc19uYW1lID0gR2V0T2JqQXBpQ2xhc3NOYW1lKHN0cnVjdF9kZWYsIHBhcnNlci5vcHRzKTsKKyAgICBjb25zdCBhdXRvIGNsYXNzX25hbWUgPSBHZXRUeXBlTmFtZShzdHJ1Y3RfZGVmLCAvKm9iamVjdF9hcGk9Ki90cnVlKTsKIAogICAgIHN0ZDo6c3RyaW5nIHVucGFja19mdW5jID0gIlxudW5wYWNrKCk6ICIgKyBjbGFzc19uYW1lICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIge1xuICByZXR1cm4gbmV3ICIgKyBjbGFzc19uYW1lICsgIigiICsKQEAgLTk5OSw4ICsxMDA5LDcgQEAKICAgICBzdGQ6OnN0cmluZyBwYWNrX2Z1bmNfb2Zmc2V0X2RlY2w7CiAgICAgc3RkOjpzdHJpbmcgcGFja19mdW5jX2NyZWF0ZV9jYWxsOwogCi0gICAgY29uc3QgYXV0byBzdHJ1Y3RfbmFtZSA9Ci0gICAgICAgIEVzY2FwZUtleXdvcmQoQWRkSW1wb3J0KGltcG9ydHMsIHN0cnVjdF9kZWYsIHN0cnVjdF9kZWYpKTsKKyAgICBjb25zdCBhdXRvIHN0cnVjdF9uYW1lID0gQWRkSW1wb3J0KGltcG9ydHMsIHN0cnVjdF9kZWYsIHN0cnVjdF9kZWYpLm5hbWU7CiAKICAgICBpZiAoaGFzX2NyZWF0ZSkgewogICAgICAgcGFja19mdW5jX2NyZWF0ZV9jYWxsID0gIiAgcmV0dXJuICIgKyBzdHJ1Y3RfbmFtZSArICIuY3JlYXRlIiArCkBAIC0xMDIzLDEwICsxMDMyLDEwIEBACiAgICAgICBhdXRvICZmaWVsZCA9ICoqaXQ7CiAgICAgICBpZiAoZmllbGQuZGVwcmVjYXRlZCkgY29udGludWU7CiAKLSAgICAgIGNvbnN0IGF1dG8gZmllbGRfbmFtZSA9IENvbnZlcnRDYXNlKGZpZWxkLm5hbWUsIENhc2U6OmtMb3dlckNhbWVsKTsKLSAgICAgIGNvbnN0IGF1dG8gZmllbGRfbmFtZV9lc2NhcGVkID0gRXNjYXBlS2V5d29yZChmaWVsZF9uYW1lKTsKKyAgICAgIGNvbnN0IGF1dG8gZmllbGRfbWV0aG9kID0gbmFtZXJfLk1ldGhvZChmaWVsZCk7CisgICAgICBjb25zdCBhdXRvIGZpZWxkX2ZpZWxkID0gbmFtZXJfLkZpZWxkKGZpZWxkKTsKICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nIGZpZWxkX2JpbmRlZF9tZXRob2QgPQotICAgICAgICAgICJ0aGlzLiIgKyBmaWVsZF9uYW1lICsgIi5iaW5kKHRoaXMpIjsKKyAgICAgICAgICAidGhpcy4iICsgZmllbGRfbWV0aG9kICsgIi5iaW5kKHRoaXMpIjsKIAogICAgICAgc3RkOjpzdHJpbmcgZmllbGRfdmFsOwogICAgICAgc3RkOjpzdHJpbmcgZmllbGRfdHlwZTsKQEAgLTEwNDYsMTQgKzEwNTUsMTQgQEAKIAogICAgICAgICBmaWVsZF90eXBlICs9IEdlblR5cGVOYW1lKGltcG9ydHMsIGZpZWxkLCBmaWVsZC52YWx1ZS50eXBlLCBmYWxzZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXNfbnVsbF9kZWZhdWx0KTsKLSAgICAgICAgZmllbGRfdmFsID0gInRoaXMuIiArIGZpZWxkX25hbWUgKyAiKCkiOworICAgICAgICBmaWVsZF92YWwgPSAidGhpcy4iICsgbmFtZXJfLk1ldGhvZChmaWVsZCkgKyAiKCkiOwogCiAgICAgICAgIGlmIChmaWVsZC52YWx1ZS50eXBlLmJhc2VfdHlwZSAhPSBCQVNFX1RZUEVfU1RSSU5HKSB7Ci0gICAgICAgICAgZmllbGRfb2Zmc2V0X3ZhbCA9ICJ0aGlzLiIgKyBmaWVsZF9uYW1lX2VzY2FwZWQ7CisgICAgICAgICAgZmllbGRfb2Zmc2V0X3ZhbCA9ICJ0aGlzLiIgKyBuYW1lcl8uRmllbGQoZmllbGQpOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgIGZpZWxkX29mZnNldF9kZWNsID0gR2VuTnVsbENoZWNrQ29uZGl0aW9uYWwoCi0gICAgICAgICAgICAgICJ0aGlzLiIgKyBmaWVsZF9uYW1lX2VzY2FwZWQsCi0gICAgICAgICAgICAgICJidWlsZGVyLmNyZWF0ZVN0cmluZyh0aGlzLiIgKyBmaWVsZF9uYW1lX2VzY2FwZWQgKyAiISkiLCAiMCIpOworICAgICAgICAgICAgICAidGhpcy4iICsgbmFtZXJfLkZpZWxkKGZpZWxkKSwKKyAgICAgICAgICAgICAgImJ1aWxkZXIuY3JlYXRlU3RyaW5nKHRoaXMuIiArIGZpZWxkX2ZpZWxkICsgIiEpIiwgIjAiKTsKICAgICAgICAgfQogICAgICAgfQogCkBAIC0xMDYzLDE3ICsxMDcyLDE1IEBACiAgICAgICAgIHN3aXRjaCAoZmllbGQudmFsdWUudHlwZS5iYXNlX3R5cGUpIHsKICAgICAgICAgICBjYXNlIEJBU0VfVFlQRV9TVFJVQ1Q6IHsKICAgICAgICAgICAgIGNvbnN0IGF1dG8gJnNkID0gKmZpZWxkLnZhbHVlLnR5cGUuc3RydWN0X2RlZjsKLSAgICAgICAgICAgIGZpZWxkX3R5cGUgKz0gR2V0T2JqQXBpQ2xhc3NOYW1lKEFkZEltcG9ydChpbXBvcnRzLCBzdHJ1Y3RfZGVmLCBzZCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJzZXIub3B0cyk7CisgICAgICAgICAgICBmaWVsZF90eXBlICs9IEFkZEltcG9ydChpbXBvcnRzLCBzdHJ1Y3RfZGVmLCBzZCkub2JqZWN0X25hbWU7CiAKICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nIGZpZWxkX2FjY2Vzc29yID0KLSAgICAgICAgICAgICAgICAidGhpcy4iICsgZmllbGRfbmFtZV9lc2NhcGVkICsgIigpIjsKKyAgICAgICAgICAgICAgICAidGhpcy4iICsgbmFtZXJfLk1ldGhvZChmaWVsZCkgKyAiKCkiOwogICAgICAgICAgICAgZmllbGRfdmFsID0gR2VuTnVsbENoZWNrQ29uZGl0aW9uYWwoZmllbGRfYWNjZXNzb3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZF9hY2Nlc3NvciArICIhLnVucGFjaygpIik7CiAgICAgICAgICAgICBhdXRvIHBhY2tpbmcgPSBHZW5OdWxsQ2hlY2tDb25kaXRpb25hbCgKLSAgICAgICAgICAgICAgICAidGhpcy4iICsgZmllbGRfbmFtZV9lc2NhcGVkLAotICAgICAgICAgICAgICAgICJ0aGlzLiIgKyBmaWVsZF9uYW1lX2VzY2FwZWQgKyAiIS5wYWNrKGJ1aWxkZXIpIiwKLSAgICAgICAgICAgICAgICAiMCIpOworICAgICAgICAgICAgICAgICJ0aGlzLiIgKyBmaWVsZF9maWVsZCwKKyAgICAgICAgICAgICAgICAidGhpcy4iICsgZmllbGRfZmllbGQgKyAiIS5wYWNrKGJ1aWxkZXIpIiwgIjAiKTsKIAogICAgICAgICAgICAgaWYgKHNkLmZpeGVkKSB7CiAgICAgICAgICAgICAgIGZpZWxkX29mZnNldF92YWwgPSBzdGQ6Om1vdmUocGFja2luZyk7CkBAIC0xMDk1LDI5ICsxMTAyLDI1IEBACiAgICAgICAgICAgICBzd2l0Y2ggKHZlY3RvcnR5cGUuYmFzZV90eXBlKSB7CiAgICAgICAgICAgICAgIGNhc2UgQkFTRV9UWVBFX1NUUlVDVDogewogICAgICAgICAgICAgICAgIGNvbnN0IGF1dG8gJnNkID0gKmZpZWxkLnZhbHVlLnR5cGUuc3RydWN0X2RlZjsKLSAgICAgICAgICAgICAgICBmaWVsZF90eXBlICs9IEdldE9iakFwaUNsYXNzTmFtZSgKLSAgICAgICAgICAgICAgICAgICAgQWRkSW1wb3J0KGltcG9ydHMsIHN0cnVjdF9kZWYsIHNkKSwgcGFyc2VyLm9wdHMpOworICAgICAgICAgICAgICAgIGZpZWxkX3R5cGUgKz0gR2V0VHlwZU5hbWUoc2QsIC8qb2JqZWN0X2FwaT0qL3RydWUpOworICAgICAgICAgICAgICAgIDsKICAgICAgICAgICAgICAgICBmaWVsZF90eXBlICs9ICIpW10iOwogCiAgICAgICAgICAgICAgICAgZmllbGRfdmFsID0gR2VuQkJBY2Nlc3MoKSArICIuY3JlYXRlT2JqTGlzdCgiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZF9iaW5kZWRfbWV0aG9kICsgIiwgdGhpcy4iICsgZmllbGRfbmFtZSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIkxlbmd0aCgpKSI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRfYmluZGVkX21ldGhvZCArICIsIHRoaXMuIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZXJfLk1ldGhvZChmaWVsZCwgIkxlbmd0aCIpICsgIigpKSI7CiAKICAgICAgICAgICAgICAgICBpZiAoc2QuZml4ZWQpIHsKICAgICAgICAgICAgICAgICAgIGZpZWxkX29mZnNldF9kZWNsID0KLSAgICAgICAgICAgICAgICAgICAgICAiYnVpbGRlci5jcmVhdGVTdHJ1Y3RPZmZzZXRMaXN0KHRoaXMuIiArCi0gICAgICAgICAgICAgICAgICAgICAgZmllbGRfbmFtZV9lc2NhcGVkICsgIiwgIiArCi0gICAgICAgICAgICAgICAgICAgICAgRXNjYXBlS2V5d29yZCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgQWRkSW1wb3J0KGltcG9ydHMsIHN0cnVjdF9kZWYsIHN0cnVjdF9kZWYpKSArCi0gICAgICAgICAgICAgICAgICAgICAgIi5zdGFydCIgKyBDb252ZXJ0Q2FzZShmaWVsZF9uYW1lLCBDYXNlOjprVXBwZXJDYW1lbCkgKwotICAgICAgICAgICAgICAgICAgICAgICJWZWN0b3IpIjsKKyAgICAgICAgICAgICAgICAgICAgICAiYnVpbGRlci5jcmVhdGVTdHJ1Y3RPZmZzZXRMaXN0KHRoaXMuIiArIGZpZWxkX2ZpZWxkICsKKyAgICAgICAgICAgICAgICAgICAgICAiLCAiICsgQWRkSW1wb3J0KGltcG9ydHMsIHN0cnVjdF9kZWYsIHN0cnVjdF9kZWYpLm5hbWUgKworICAgICAgICAgICAgICAgICAgICAgICIuIiArIG5hbWVyXy5NZXRob2QoInN0YXJ0IiwgZmllbGQsICJWZWN0b3IiKSArICIpIjsKICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgZmllbGRfb2Zmc2V0X2RlY2wgPQotICAgICAgICAgICAgICAgICAgICAgIEVzY2FwZUtleXdvcmQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEFkZEltcG9ydChpbXBvcnRzLCBzdHJ1Y3RfZGVmLCBzdHJ1Y3RfZGVmKSkgKwotICAgICAgICAgICAgICAgICAgICAgICIuY3JlYXRlIiArIENvbnZlcnRDYXNlKGZpZWxkX25hbWUsIENhc2U6OmtVcHBlckNhbWVsKSArCi0gICAgICAgICAgICAgICAgICAgICAgIlZlY3RvcihidWlsZGVyLCBidWlsZGVyLmNyZWF0ZU9iamVjdE9mZnNldExpc3QoIiArCi0gICAgICAgICAgICAgICAgICAgICAgInRoaXMuIiArIGZpZWxkX25hbWVfZXNjYXBlZCArICIpKSI7CisgICAgICAgICAgICAgICAgICAgICAgQWRkSW1wb3J0KGltcG9ydHMsIHN0cnVjdF9kZWYsIHN0cnVjdF9kZWYpLm5hbWUgKyAiLiIgKworICAgICAgICAgICAgICAgICAgICAgIG5hbWVyXy5NZXRob2QoImNyZWF0ZSIsIGZpZWxkLCAiVmVjdG9yIikgKworICAgICAgICAgICAgICAgICAgICAgICIoYnVpbGRlciwgYnVpbGRlci5jcmVhdGVPYmplY3RPZmZzZXRMaXN0KCIgKyAidGhpcy4iICsKKyAgICAgICAgICAgICAgICAgICAgICBmaWVsZF9maWVsZCArICIpKSI7CiAgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgYnJlYWs7CkBAIC0xMTI2LDI4ICsxMTI5LDI4IEBACiAgICAgICAgICAgICAgIGNhc2UgQkFTRV9UWVBFX1NUUklORzogewogICAgICAgICAgICAgICAgIGZpZWxkX3R5cGUgKz0gInN0cmluZylbXSI7CiAgICAgICAgICAgICAgICAgZmllbGRfdmFsID0gR2VuQkJBY2Nlc3MoKSArICIuY3JlYXRlU2NhbGFyTGlzdCgiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZF9iaW5kZWRfbWV0aG9kICsgIiwgdGhpcy4iICsgZmllbGRfbmFtZSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIkxlbmd0aCgpKSI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRfYmluZGVkX21ldGhvZCArICIsIHRoaXMuIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZXJfLkZpZWxkKGZpZWxkLCAiTGVuZ3RoIikgKyAiKCkpIjsKICAgICAgICAgICAgICAgICBmaWVsZF9vZmZzZXRfZGVjbCA9Ci0gICAgICAgICAgICAgICAgICAgIEVzY2FwZUtleXdvcmQoQWRkSW1wb3J0KGltcG9ydHMsIHN0cnVjdF9kZWYsIHN0cnVjdF9kZWYpKSArCi0gICAgICAgICAgICAgICAgICAgICIuY3JlYXRlIiArIENvbnZlcnRDYXNlKGZpZWxkX25hbWUsIENhc2U6OmtVcHBlckNhbWVsKSArCi0gICAgICAgICAgICAgICAgICAgICJWZWN0b3IoYnVpbGRlciwgYnVpbGRlci5jcmVhdGVPYmplY3RPZmZzZXRMaXN0KCIgKwotICAgICAgICAgICAgICAgICAgICAidGhpcy4iICsgZmllbGRfbmFtZV9lc2NhcGVkICsgIikpIjsKKyAgICAgICAgICAgICAgICAgICAgQWRkSW1wb3J0KGltcG9ydHMsIHN0cnVjdF9kZWYsIHN0cnVjdF9kZWYpLm5hbWUgKyAiLiIgKworICAgICAgICAgICAgICAgICAgICBuYW1lcl8uTWV0aG9kKCJjcmVhdGUiLCBmaWVsZCwgIlZlY3RvciIpICsKKyAgICAgICAgICAgICAgICAgICAgIihidWlsZGVyLCBidWlsZGVyLmNyZWF0ZU9iamVjdE9mZnNldExpc3QoIiArICJ0aGlzLiIgKworICAgICAgICAgICAgICAgICAgICBuYW1lcl8uRmllbGQoZmllbGQpICsgIikpIjsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgIGNhc2UgQkFTRV9UWVBFX1VOSU9OOiB7Ci0gICAgICAgICAgICAgICAgZmllbGRfdHlwZSArPSBHZW5PYmpBcGlVbmlvblR5cGVUUyhpbXBvcnRzLCBwYXJzZXIub3B0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoodmVjdG9ydHlwZS5lbnVtX2RlZikpOworICAgICAgICAgICAgICAgIGZpZWxkX3R5cGUgKz0gR2VuT2JqQXBpVW5pb25UeXBlVFMoCisgICAgICAgICAgICAgICAgICAgIGltcG9ydHMsIHN0cnVjdF9kZWYsIHBhcnNlci5vcHRzLCAqKHZlY3RvcnR5cGUuZW51bV9kZWYpKTsKICAgICAgICAgICAgICAgICBmaWVsZF90eXBlICs9ICIpW10iOwotICAgICAgICAgICAgICAgIGZpZWxkX3ZhbCA9Ci0gICAgICAgICAgICAgICAgICAgIEdlblVuaW9uVmFsVFMoaW1wb3J0cywgZmllbGRfbmFtZSwgdmVjdG9ydHlwZSwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgZmllbGRfdmFsID0gR2VuVW5pb25WYWxUUyhpbXBvcnRzLCBzdHJ1Y3RfZGVmLCBmaWVsZF9tZXRob2QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3J0eXBlLCB0cnVlKTsKIAogICAgICAgICAgICAgICAgIGZpZWxkX29mZnNldF9kZWNsID0KLSAgICAgICAgICAgICAgICAgICAgRXNjYXBlS2V5d29yZChBZGRJbXBvcnQoaW1wb3J0cywgc3RydWN0X2RlZiwgc3RydWN0X2RlZikpICsKLSAgICAgICAgICAgICAgICAgICAgIi5jcmVhdGUiICsgQ29udmVydENhc2UoZmllbGRfbmFtZSwgQ2FzZTo6a1VwcGVyQ2FtZWwpICsKLSAgICAgICAgICAgICAgICAgICAgIlZlY3RvcihidWlsZGVyLCBidWlsZGVyLmNyZWF0ZU9iamVjdE9mZnNldExpc3QoIiArCi0gICAgICAgICAgICAgICAgICAgICJ0aGlzLiIgKyBmaWVsZF9uYW1lX2VzY2FwZWQgKyAiKSkiOworICAgICAgICAgICAgICAgICAgICBBZGRJbXBvcnQoaW1wb3J0cywgc3RydWN0X2RlZiwgc3RydWN0X2RlZikubmFtZSArICIuIiArCisgICAgICAgICAgICAgICAgICAgIG5hbWVyXy5NZXRob2QoImNyZWF0ZSIsIGZpZWxkLCAiVmVjdG9yIikgKworICAgICAgICAgICAgICAgICAgICAiKGJ1aWxkZXIsIGJ1aWxkZXIuY3JlYXRlT2JqZWN0T2Zmc2V0TGlzdCgiICsgInRoaXMuIiArCisgICAgICAgICAgICAgICAgICAgIG5hbWVyXy5GaWVsZChmaWVsZCkgKyAiKSkiOwogCiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgIH0KQEAgLTExNjAsMTMgKzExNjMsMTMgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgZmllbGRfdHlwZSArPSAiKVtdIjsKICAgICAgICAgICAgICAgICBmaWVsZF92YWwgPSBHZW5CQkFjY2VzcygpICsgIi5jcmVhdGVTY2FsYXJMaXN0KCIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkX2JpbmRlZF9tZXRob2QgKyAiLCB0aGlzLiIgKyBmaWVsZF9uYW1lICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTGVuZ3RoKCkpIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZF9iaW5kZWRfbWV0aG9kICsgIiwgdGhpcy4iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lcl8uTWV0aG9kKGZpZWxkLCAiTGVuZ3RoIikgKyAiKCkpIjsKIAogICAgICAgICAgICAgICAgIGZpZWxkX29mZnNldF9kZWNsID0KLSAgICAgICAgICAgICAgICAgICAgRXNjYXBlS2V5d29yZChBZGRJbXBvcnQoaW1wb3J0cywgc3RydWN0X2RlZiwgc3RydWN0X2RlZikpICsKLSAgICAgICAgICAgICAgICAgICAgIi5jcmVhdGUiICsgQ29udmVydENhc2UoZmllbGRfbmFtZSwgQ2FzZTo6a1VwcGVyQ2FtZWwpICsKLSAgICAgICAgICAgICAgICAgICAgIlZlY3RvcihidWlsZGVyLCB0aGlzLiIgKyBmaWVsZF9uYW1lX2VzY2FwZWQgKyAiKSI7CisgICAgICAgICAgICAgICAgICAgIEFkZEltcG9ydChpbXBvcnRzLCBzdHJ1Y3RfZGVmLCBzdHJ1Y3RfZGVmKS5uYW1lICsgIi4iICsKKyAgICAgICAgICAgICAgICAgICAgbmFtZXJfLk1ldGhvZCgiY3JlYXRlIiwgZmllbGQsICJWZWN0b3IiKSArCisgICAgICAgICAgICAgICAgICAgICIoYnVpbGRlciwgdGhpcy4iICsgZmllbGRfZmllbGQgKyAiKSI7CiAKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgfQpAQCAtMTE3NiwxMiArMTE3OSwxMyBAQAogICAgICAgICAgIH0KIAogICAgICAgICAgIGNhc2UgQkFTRV9UWVBFX1VOSU9OOiB7Ci0gICAgICAgICAgICBmaWVsZF90eXBlICs9IEdlbk9iakFwaVVuaW9uVHlwZVRTKGltcG9ydHMsIHBhcnNlci5vcHRzLAorICAgICAgICAgICAgZmllbGRfdHlwZSArPSBHZW5PYmpBcGlVbmlvblR5cGVUUyhpbXBvcnRzLCBzdHJ1Y3RfZGVmLCBwYXJzZXIub3B0cywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKihmaWVsZC52YWx1ZS50eXBlLmVudW1fZGVmKSk7CiAKLSAgICAgICAgICAgIGZpZWxkX3ZhbCA9IEdlblVuaW9uVmFsVFMoaW1wb3J0cywgZmllbGRfbmFtZSwgZmllbGQudmFsdWUudHlwZSk7CisgICAgICAgICAgICBmaWVsZF92YWwgPSBHZW5VbmlvblZhbFRTKGltcG9ydHMsIHN0cnVjdF9kZWYsIGZpZWxkX21ldGhvZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQudmFsdWUudHlwZSk7CiAgICAgICAgICAgICBmaWVsZF9vZmZzZXRfZGVjbCA9Ci0gICAgICAgICAgICAgICAgImJ1aWxkZXIuY3JlYXRlT2JqZWN0T2Zmc2V0KHRoaXMuIiArIGZpZWxkX25hbWVfZXNjYXBlZCArICIpIjsKKyAgICAgICAgICAgICAgICAiYnVpbGRlci5jcmVhdGVPYmplY3RPZmZzZXQodGhpcy4iICsgZmllbGRfZmllbGQgKyAiKSI7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICB9CiAKQEAgLTExOTQsMTggKzExOTgsMTcgQEAKIAogICAgICAgaWYgKCFmaWVsZF9vZmZzZXRfZGVjbC5lbXB0eSgpKSB7CiAgICAgICAgIGZpZWxkX29mZnNldF9kZWNsID0KLSAgICAgICAgICAgICIgIGNvbnN0ICIgKyBmaWVsZF9uYW1lX2VzY2FwZWQgKyAiID0gIiArIGZpZWxkX29mZnNldF9kZWNsICsgIjsiOworICAgICAgICAgICAgIiAgY29uc3QgIiArIGZpZWxkX2ZpZWxkICsgIiA9ICIgKyBmaWVsZF9vZmZzZXRfZGVjbCArICI7IjsKICAgICAgIH0KLSAgICAgIGlmIChmaWVsZF9vZmZzZXRfdmFsLmVtcHR5KCkpIHsgZmllbGRfb2Zmc2V0X3ZhbCA9IGZpZWxkX25hbWVfZXNjYXBlZDsgfQorICAgICAgaWYgKGZpZWxkX29mZnNldF92YWwuZW1wdHkoKSkgeyBmaWVsZF9vZmZzZXRfdmFsID0gZmllbGRfZmllbGQ7IH0KIAogICAgICAgdW5wYWNrX2Z1bmMgKz0gIiAgICAiICsgZmllbGRfdmFsOwotICAgICAgdW5wYWNrX3RvX2Z1bmMgKz0gIiAgX28uIiArIGZpZWxkX25hbWVfZXNjYXBlZCArICIgPSAiICsgZmllbGRfdmFsICsgIjsiOworICAgICAgdW5wYWNrX3RvX2Z1bmMgKz0gIiAgX28uIiArIGZpZWxkX2ZpZWxkICsgIiA9ICIgKyBmaWVsZF92YWwgKyAiOyI7CiAKLSAgICAgIC8vIEZJWE1FOiBpZiBmaWVsZF90eXBlIGFuZCBmaWVsZF9uYW1lX2VzY2FwZWQgYXJlIGlkZW50aWNhbCwgdGhlbgorICAgICAgLy8gRklYTUU6IGlmIGZpZWxkX3R5cGUgYW5kIGZpZWxkX2ZpZWxkIGFyZSBpZGVudGljYWwsIHRoZW4KICAgICAgIC8vIHRoaXMgZ2VuZXJhdGVzIGludmFsaWQgdHlwZXNjcmlwdC4KLSAgICAgIGNvbnN0cnVjdG9yX2Z1bmMgKz0gIiAgcHVibGljICIgKyBmaWVsZF9uYW1lX2VzY2FwZWQgKyAiOiAiICsgZmllbGRfdHlwZSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICIgPSAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRfZGVmYXVsdF92YWw7CisgICAgICBjb25zdHJ1Y3Rvcl9mdW5jICs9ICIgIHB1YmxpYyAiICsgZmllbGRfZmllbGQgKyAiOiAiICsgZmllbGRfdHlwZSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICIgPSAiICsgZmllbGRfZGVmYXVsdF92YWw7CiAKICAgICAgIGlmICghc3RydWN0X2RlZi5maXhlZCkgewogICAgICAgICBpZiAoIWZpZWxkX29mZnNldF9kZWNsLmVtcHR5KCkpIHsKQEAgLTEyMTYsMTEgKzEyMTksMTIgQEAKICAgICAgICAgICBwYWNrX2Z1bmNfY3JlYXRlX2NhbGwgKz0gZmllbGRfb2Zmc2V0X3ZhbDsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICBpZiAoZmllbGQuSXNTY2FsYXJPcHRpb25hbCgpKSB7Ci0gICAgICAgICAgICBwYWNrX2Z1bmNfY3JlYXRlX2NhbGwgKz0gIiAgaWYgKCIgKyBmaWVsZF9vZmZzZXRfdmFsICsgIiAhPT0gbnVsbClcbiAgIjsKKyAgICAgICAgICAgIHBhY2tfZnVuY19jcmVhdGVfY2FsbCArPQorICAgICAgICAgICAgICAgICIgIGlmICgiICsgZmllbGRfb2Zmc2V0X3ZhbCArICIgIT09IG51bGwpXG4gICI7CiAgICAgICAgICAgfQotICAgICAgICAgIHBhY2tfZnVuY19jcmVhdGVfY2FsbCArPSAiICAiICsgc3RydWN0X25hbWUgKyAiLmFkZCIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb252ZXJ0Q2FzZShmaWVsZC5uYW1lLCBDYXNlOjprVXBwZXJDYW1lbCkgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKGJ1aWxkZXIsICIgKyBmaWVsZF9vZmZzZXRfdmFsICsgIik7XG4iOworICAgICAgICAgIHBhY2tfZnVuY19jcmVhdGVfY2FsbCArPSAiICAiICsgc3RydWN0X25hbWUgKyAiLiIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lcl8uTWV0aG9kKCJhZGQiLCBmaWVsZCkgKyAiKGJ1aWxkZXIsICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZF9vZmZzZXRfdmFsICsgIik7XG4iOwogICAgICAgICB9CiAgICAgICB9CiAKQEAgLTEyNTMsMTAgKzEyNTcsMTAgQEAKICAgICAgIHBhY2tfZnVuY19jcmVhdGVfY2FsbCArPSAicmV0dXJuICIgKyBzdHJ1Y3RfbmFtZSArICIuZW5kIiArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR2V0UHJlZml4ZWROYW1lKHN0cnVjdF9kZWYpICsgIihidWlsZGVyKTsiOwogICAgIH0KLQotICAgIG9ial9hcGlfY2xhc3MgPSAiXG5leHBvcnQgY2xhc3MgIiArCi0gICAgICAgICAgICAgICAgICAgIEdldE9iakFwaUNsYXNzTmFtZShzdHJ1Y3RfZGVmLCBwYXJzZXIub3B0cykgKyAiIHtcbiI7Ci0KKyAgICBvYmpfYXBpX2NsYXNzID0gIlxuIjsKKyAgICBvYmpfYXBpX2NsYXNzICs9ICJleHBvcnQgY2xhc3MgIjsKKyAgICBvYmpfYXBpX2NsYXNzICs9IEdldFR5cGVOYW1lKHN0cnVjdF9kZWYsIC8qb2JqZWN0X2FwaT0qL3RydWUpOworICAgIG9ial9hcGlfY2xhc3MgKz0gIiB7XG4iOwogICAgIG9ial9hcGlfY2xhc3MgKz0gY29uc3RydWN0b3JfZnVuYzsKICAgICBvYmpfYXBpX2NsYXNzICs9IHBhY2tfZnVuY19wcm90b3R5cGUgKyBwYWNrX2Z1bmNfb2Zmc2V0X2RlY2wgKwogICAgICAgICAgICAgICAgICAgICAgcGFja19mdW5jX2NyZWF0ZV9jYWxsICsgIlxufSI7CkBAIC0xMjg3LDEzICsxMjkxLDE4IEBACiAgICAgaWYgKHN0cnVjdF9kZWYuZ2VuZXJhdGVkKSByZXR1cm47CiAgICAgc3RkOjpzdHJpbmcgJmNvZGUgPSAqY29kZV9wdHI7CiAKLSAgICBzdGQ6OnN0cmluZyBvYmplY3RfbmFtZTsKLSAgICBzdGQ6OnN0cmluZyBvYmplY3RfbmFtZXNwYWNlID0gR2V0TmFtZVNwYWNlKHN0cnVjdF9kZWYpOworICAgIC8vIFNwZWNpYWwgY2FzZSBmb3IgdGhlIHJvb3Qgc3RydWN0LCBzaW5jZSBubyBvbmUgd2lsbCBuZWNlc3NhcmlseSByZWZlcmVuY2UKKyAgICAvLyBpdCwgd2UgaGF2ZSB0byBleHBsaWNpdGx5IGFkZCBpdCB0byB0aGUgaW1wb3J0IGxpc3QuCisgICAgaWYgKCZzdHJ1Y3RfZGVmID09IHBhcnNlcl8ucm9vdF9zdHJ1Y3RfZGVmXykgeworICAgICAgQWRkSW1wb3J0KGltcG9ydHMsIHN0cnVjdF9kZWYsIHN0cnVjdF9kZWYpOworICAgIH0KKworICAgIGNvbnN0IHN0ZDo6c3RyaW5nIG9iamVjdF9uYW1lID0gR2V0VHlwZU5hbWUoc3RydWN0X2RlZik7CiAKICAgICAvLyBFbWl0IGNvbnN0cnVjdG9yCi0gICAgb2JqZWN0X25hbWUgPSBFc2NhcGVLZXl3b3JkKHN0cnVjdF9kZWYubmFtZSk7CiAgICAgR2VuRG9jQ29tbWVudChzdHJ1Y3RfZGVmLmRvY19jb21tZW50LCBjb2RlX3B0cik7Ci0gICAgY29kZSArPSAiZXhwb3J0IGNsYXNzICIgKyBvYmplY3RfbmFtZTsKKyAgICBjb2RlICs9ICJleHBvcnQgY2xhc3MgIjsKKyAgICBjb2RlICs9IG9iamVjdF9uYW1lOwogICAgIGNvZGUgKz0gIiB7XG4iOwogICAgIGNvZGUgKz0gIiAgYmI6IGZsYXRidWZmZXJzLkJ5dGVCdWZmZXJ8bnVsbCA9IG51bGw7XG4iOwogICAgIGNvZGUgKz0gIiAgYmJfcG9zID0gMDtcbiI7CkBAIC0xMzAxLDcgKzEzMTAsNyBAQAogICAgIC8vIEdlbmVyYXRlIHRoZSBfX2luaXQgbWV0aG9kIHRoYXQgc2V0cyB0aGUgZmllbGQgaW4gYSBwcmUtZXhpc3RpbmcKICAgICAvLyBhY2Nlc3NvciBvYmplY3QuIFRoaXMgaXMgdG8gYWxsb3cgb2JqZWN0IHJldXNlLgogICAgIGNvZGUgKz0KLSAgICAgICAgIl9faW5pdChpOm51bWJlciwgYmI6ZmxhdGJ1ZmZlcnMuQnl0ZUJ1ZmZlcik6IiArIG9iamVjdF9uYW1lICsgIiB7XG4iOworICAgICAgICAiICBfX2luaXQoaTpudW1iZXIsIGJiOmZsYXRidWZmZXJzLkJ5dGVCdWZmZXIpOiIgKyBvYmplY3RfbmFtZSArICIge1xuIjsKICAgICBjb2RlICs9ICIgIHRoaXMuYmJfcG9zID0gaTtcbiI7CiAgICAgY29kZSArPSAiICB0aGlzLmJiID0gYmI7XG4iOwogICAgIGNvZGUgKz0gIiAgcmV0dXJuIHRoaXM7XG4iOwpAQCAtMTMzOCw3ICsxMzQ3LDcgQEAKICAgICAgICAgY29uc3QgYXV0byBoYXNfbnVsbF9kZWZhdWx0ID0gaXNfc3RyaW5nIHx8IEhhc051bGxEZWZhdWx0KGZpZWxkKTsKIAogICAgICAgICBHZW5Eb2NDb21tZW50KGZpZWxkLmRvY19jb21tZW50LCBjb2RlX3B0cik7Ci0gICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeCA9IENvbnZlcnRDYXNlKGZpZWxkLm5hbWUsIENhc2U6OmtMb3dlckNhbWVsKSArICIoIjsKKyAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4ID0gbmFtZXJfLk1ldGhvZChmaWVsZCkgKyAiKCI7CiAgICAgICAgIGlmIChpc19zdHJpbmcpIHsKICAgICAgICAgICBjb2RlICs9IHByZWZpeCArICIpOnN0cmluZ3xudWxsXG4iOwogICAgICAgICAgIGNvZGUgKz0KQEAgLTEzODEsMTAgKzEzOTAsMTEgQEAKICAgICAgIGVsc2UgewogICAgICAgICBzd2l0Y2ggKGZpZWxkLnZhbHVlLnR5cGUuYmFzZV90eXBlKSB7CiAgICAgICAgICAgY2FzZSBCQVNFX1RZUEVfU1RSVUNUOiB7Ci0gICAgICAgICAgICBjb25zdCBhdXRvIHR5cGUgPSBFc2NhcGVLZXl3b3JkKAotICAgICAgICAgICAgICAgIEFkZEltcG9ydChpbXBvcnRzLCBzdHJ1Y3RfZGVmLCAqZmllbGQudmFsdWUudHlwZS5zdHJ1Y3RfZGVmKSk7CisgICAgICAgICAgICBjb25zdCBhdXRvIHR5cGUgPQorICAgICAgICAgICAgICAgIEFkZEltcG9ydChpbXBvcnRzLCBzdHJ1Y3RfZGVmLCAqZmllbGQudmFsdWUudHlwZS5zdHJ1Y3RfZGVmKQorICAgICAgICAgICAgICAgICAgICAubmFtZTsKICAgICAgICAgICAgIEdlbkRvY0NvbW1lbnQoZmllbGQuZG9jX2NvbW1lbnQsIGNvZGVfcHRyKTsKLSAgICAgICAgICAgIGNvZGUgKz0gQ29udmVydENhc2UoZmllbGQubmFtZSwgQ2FzZTo6a0xvd2VyQ2FtZWwpOworICAgICAgICAgICAgY29kZSArPSBuYW1lcl8uTWV0aG9kKGZpZWxkKTsKICAgICAgICAgICAgIGNvZGUgKz0gIihvYmo/OiIgKyB0eXBlICsgIik6IiArIHR5cGUgKyAifG51bGwge1xuIjsKIAogICAgICAgICAgICAgaWYgKHN0cnVjdF9kZWYuZml4ZWQpIHsKQEAgLTE0MjQsNyArMTQzNCw3IEBACiAgICAgICAgICAgICAgIGRlZmF1bHQ6IHJldF90eXBlID0gdmVjdG9ydHlwZW5hbWU7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBHZW5Eb2NDb21tZW50KGZpZWxkLmRvY19jb21tZW50LCBjb2RlX3B0cik7Ci0gICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXggPSBDb252ZXJ0Q2FzZShmaWVsZC5uYW1lLCBDYXNlOjprTG93ZXJDYW1lbCk7CisgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXggPSBuYW1lcl8uTWV0aG9kKGZpZWxkKTsKICAgICAgICAgICAgIC8vIFRPRE86IG1ha2UgaXQgd29yayB3aXRob3V0IGFueQogICAgICAgICAgICAgLy8gaWYgKGlzX3VuaW9uKSB7IHByZWZpeCArPSAiPFQgZXh0ZW5kcyBmbGF0YnVmZmVycy5UYWJsZT4iOyB9CiAgICAgICAgICAgICBpZiAoaXNfdW5pb24pIHsgcHJlZml4ICs9ICIiOyB9CkBAIC0xNDg0LDcgKzE0OTQsNyBAQAogCiAgICAgICAgICAgY2FzZSBCQVNFX1RZUEVfVU5JT046IHsKICAgICAgICAgICAgIEdlbkRvY0NvbW1lbnQoZmllbGQuZG9jX2NvbW1lbnQsIGNvZGVfcHRyKTsKLSAgICAgICAgICAgIGNvZGUgKz0gQ29udmVydENhc2UoZmllbGQubmFtZSwgQ2FzZTo6a0xvd2VyQ2FtZWwpOworICAgICAgICAgICAgY29kZSArPSBuYW1lcl8uTWV0aG9kKGZpZWxkKTsKIAogICAgICAgICAgICAgY29uc3QgYXV0byAmdW5pb25fZW51bSA9ICooZmllbGQudmFsdWUudHlwZS5lbnVtX2RlZik7CiAgICAgICAgICAgICBjb25zdCBhdXRvIHVuaW9uX3R5cGUgPSBHZW5VbmlvbkdlbmVyaWNUeXBlVFModW5pb25fZW51bSk7CkBAIC0xNTA5LDEyICsxNTE5LDE1IEBACiAgICAgICAgIHN0ZDo6c3RyaW5nIHR5cGUgPQogICAgICAgICAgICAgR2VuVHlwZU5hbWUoaW1wb3J0cywgc3RydWN0X2RlZiwgZmllbGQudmFsdWUudHlwZSwgdHJ1ZSk7CiAKLSAgICAgICAgY29kZSArPSAibXV0YXRlXyIgKyBmaWVsZC5uYW1lICsgIih2YWx1ZToiICsgdHlwZSArICIpOmJvb2xlYW4ge1xuIjsKKyAgICAgICAgY29kZSArPSBuYW1lcl8uTGVnYWN5VHNNdXRhdGVNZXRob2QoZmllbGQpICsgIih2YWx1ZToiICsgdHlwZSArCisgICAgICAgICAgICAgICAgIik6Ym9vbGVhbiB7XG4iOworCisgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nIHdyaXRlX21ldGhvZCA9CisgICAgICAgICAgICAiLiIgKyBuYW1lcl8uTWV0aG9kKCJ3cml0ZSIsIEdlblR5cGUoZmllbGQudmFsdWUudHlwZSkpOwogCiAgICAgICAgIGlmIChzdHJ1Y3RfZGVmLmZpeGVkKSB7Ci0gICAgICAgICAgY29kZSArPSAiICAiICsgR2VuQkJBY2Nlc3MoKSArICIud3JpdGUiICsKLSAgICAgICAgICAgICAgICAgIENvbnZlcnRDYXNlKEdlblR5cGUoZmllbGQudmFsdWUudHlwZSksIENhc2U6OmtVcHBlckNhbWVsKSArCi0gICAgICAgICAgICAgICAgICAiKHRoaXMuYmJfcG9zICsgIiArIE51bVRvU3RyaW5nKGZpZWxkLnZhbHVlLm9mZnNldCkgKyAiLCAiOworICAgICAgICAgIGNvZGUgKz0gIiAgIiArIEdlbkJCQWNjZXNzKCkgKyB3cml0ZV9tZXRob2QgKyAiKHRoaXMuYmJfcG9zICsgIiArCisgICAgICAgICAgICAgICAgICBOdW1Ub1N0cmluZyhmaWVsZC52YWx1ZS5vZmZzZXQpICsgIiwgIjsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICBjb2RlICs9ICIgIGNvbnN0IG9mZnNldCA9ICIgKyBHZW5CQkFjY2VzcygpICsKICAgICAgICAgICAgICAgICAgICIuX19vZmZzZXQodGhpcy5iYl9wb3MsICIgKyBOdW1Ub1N0cmluZyhmaWVsZC52YWx1ZS5vZmZzZXQpICsKQEAgLTE1MjQsOSArMTUzNyw4IEBACiAgICAgICAgICAgY29kZSArPSAiICB9XG5cbiI7CiAKICAgICAgICAgICAvLyBzcGVjaWFsIGNhc2UgZm9yIGJvb2xzLCB3aGljaCBhcmUgdHJlYXRlZCBhcyB1aW50OAotICAgICAgICAgIGNvZGUgKz0gIiAgIiArIEdlbkJCQWNjZXNzKCkgKyAiLndyaXRlIiArCi0gICAgICAgICAgICAgICAgICBDb252ZXJ0Q2FzZShHZW5UeXBlKGZpZWxkLnZhbHVlLnR5cGUpLCBDYXNlOjprVXBwZXJDYW1lbCkgKwotICAgICAgICAgICAgICAgICAgIih0aGlzLmJiX3BvcyArIG9mZnNldCwgIjsKKyAgICAgICAgICBjb2RlICs9CisgICAgICAgICAgICAgICIgICIgKyBHZW5CQkFjY2VzcygpICsgd3JpdGVfbWV0aG9kICsgIih0aGlzLmJiX3BvcyArIG9mZnNldCwgIjsKICAgICAgICAgICBpZiAoZmllbGQudmFsdWUudHlwZS5iYXNlX3R5cGUgPT0gQkFTRV9UWVBFX0JPT0wpIHsgY29kZSArPSAiKyI7IH0KICAgICAgICAgfQogCkBAIC0xNTM5LDggKzE1NTEsOCBAQAogICAgICAgaWYgKElzVmVjdG9yKGZpZWxkLnZhbHVlLnR5cGUpKSB7CiAgICAgICAgIC8vIEVtaXQgYSBsZW5ndGggaGVscGVyCiAgICAgICAgIEdlbkRvY0NvbW1lbnQoY29kZV9wdHIpOwotICAgICAgICBjb2RlICs9IENvbnZlcnRDYXNlKGZpZWxkLm5hbWUsIENhc2U6OmtMb3dlckNhbWVsKTsKLSAgICAgICAgY29kZSArPSAiTGVuZ3RoKCk6bnVtYmVyIHtcbiIgKyBvZmZzZXRfcHJlZml4OworICAgICAgICBjb2RlICs9IG5hbWVyXy5NZXRob2QoZmllbGQsICJMZW5ndGgiKTsKKyAgICAgICAgY29kZSArPSAiKCk6bnVtYmVyIHtcbiIgKyBvZmZzZXRfcHJlZml4OwogCiAgICAgICAgIGNvZGUgKz0KICAgICAgICAgICAgIEdlbkJCQWNjZXNzKCkgKyAiLl9fdmVjdG9yX2xlbih0aGlzLmJiX3BvcyArIG9mZnNldCkgOiAwO1xufVxuXG4iOwpAQCAtMTU1MCw5ICsxNTYyLDkgQEAKICAgICAgICAgaWYgKElzU2NhbGFyKHZlY3RvclR5cGUuYmFzZV90eXBlKSAmJiAhSXNMb25nKHZlY3RvclR5cGUuYmFzZV90eXBlKSkgewogICAgICAgICAgIEdlbkRvY0NvbW1lbnQoY29kZV9wdHIpOwogCi0gICAgICAgICAgY29kZSArPSBDb252ZXJ0Q2FzZShmaWVsZC5uYW1lLCBDYXNlOjprTG93ZXJDYW1lbCk7Ci0gICAgICAgICAgY29kZSArPSAiQXJyYXkoKToiICsgR2VuVHlwZSh2ZWN0b3JUeXBlKSArICJBcnJheXxudWxsIHtcbiIgKwotICAgICAgICAgICAgICAgICAgb2Zmc2V0X3ByZWZpeDsKKyAgICAgICAgICBjb2RlICs9IG5hbWVyXy5NZXRob2QoZmllbGQsICJBcnJheSIpOworICAgICAgICAgIGNvZGUgKz0KKyAgICAgICAgICAgICAgIigpOiIgKyBHZW5UeXBlKHZlY3RvclR5cGUpICsgIkFycmF5fG51bGwge1xuIiArIG9mZnNldF9wcmVmaXg7CiAKICAgICAgICAgICBjb2RlICs9ICJuZXcgIiArIEdlblR5cGUodmVjdG9yVHlwZSkgKyAiQXJyYXkoIiArIEdlbkJCQWNjZXNzKCkgKwogICAgICAgICAgICAgICAgICAgIi5ieXRlcygpLmJ1ZmZlciwgIiArIEdlbkJCQWNjZXNzKCkgKwpAQCAtMTYxMSw3ICsxNjIzLDcgQEAKIAogICAgICAgICAvLyBHZW5lcmF0ZSB0aGUgZmllbGQgaW5zZXJ0aW9uIG1ldGhvZAogICAgICAgICBHZW5Eb2NDb21tZW50KGNvZGVfcHRyKTsKLSAgICAgICAgY29kZSArPSAic3RhdGljIGFkZCIgKyBDb252ZXJ0Q2FzZShmaWVsZC5uYW1lLCBDYXNlOjprVXBwZXJDYW1lbCk7CisgICAgICAgIGNvZGUgKz0gInN0YXRpYyAiICsgbmFtZXJfLk1ldGhvZCgiYWRkIiwgZmllbGQpOwogICAgICAgICBjb2RlICs9ICIoYnVpbGRlcjpmbGF0YnVmZmVycy5CdWlsZGVyLCAiICsgYXJnbmFtZSArICI6IiArCiAgICAgICAgICAgICAgICAgR2V0QXJnVHlwZShpbXBvcnRzLCBzdHJ1Y3RfZGVmLCBmaWVsZCwgZmFsc2UpICsgIikge1xuIjsKICAgICAgICAgY29kZSArPSAiICBidWlsZGVyLmFkZEZpZWxkIiArIEdlbldyaXRlTWV0aG9kKGZpZWxkLnZhbHVlLnR5cGUpICsgIigiOwpAQCAtMTY0Miw4ICsxNjU0LDggQEAKICAgICAgICAgICAgIEdlbkRvY0NvbW1lbnQoY29kZV9wdHIpOwogCiAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyBzaWdfYmVnaW4gPQotICAgICAgICAgICAgICAgICJzdGF0aWMgY3JlYXRlIiArIENvbnZlcnRDYXNlKGZpZWxkLm5hbWUsIENhc2U6OmtVcHBlckNhbWVsKSArCi0gICAgICAgICAgICAgICAgIlZlY3RvcihidWlsZGVyOmZsYXRidWZmZXJzLkJ1aWxkZXIsIGRhdGE6IjsKKyAgICAgICAgICAgICAgICAic3RhdGljICIgKyBuYW1lcl8uTWV0aG9kKCJjcmVhdGUiLCBmaWVsZCwgIlZlY3RvciIpICsKKyAgICAgICAgICAgICAgICAiKGJ1aWxkZXI6ZmxhdGJ1ZmZlcnMuQnVpbGRlciwgZGF0YToiOwogICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgc2lnX2VuZCA9ICIpOmZsYXRidWZmZXJzLk9mZnNldCI7CiAgICAgICAgICAgICBzdGQ6OnN0cmluZyB0eXBlID0KICAgICAgICAgICAgICAgICBHZW5UeXBlTmFtZShpbXBvcnRzLCBzdHJ1Y3RfZGVmLCB2ZWN0b3JfdHlwZSwgdHJ1ZSkgKyAiW10iOwpAQCAtMTY4MCw4ICsxNjkyLDkgQEAKICAgICAgICAgICAvLyBhZnRlcgogICAgICAgICAgIEdlbkRvY0NvbW1lbnQoY29kZV9wdHIpOwogCi0gICAgICAgICAgY29kZSArPSAic3RhdGljIHN0YXJ0IiArIENvbnZlcnRDYXNlKGZpZWxkLm5hbWUsIENhc2U6OmtVcHBlckNhbWVsKTsKLSAgICAgICAgICBjb2RlICs9ICJWZWN0b3IoYnVpbGRlcjpmbGF0YnVmZmVycy5CdWlsZGVyLCBudW1FbGVtczpudW1iZXIpIHtcbiI7CisgICAgICAgICAgY29kZSArPSAic3RhdGljICI7CisgICAgICAgICAgY29kZSArPSBuYW1lcl8uTWV0aG9kKCJzdGFydCIsIGZpZWxkLCAiVmVjdG9yIik7CisgICAgICAgICAgY29kZSArPSAiKGJ1aWxkZXI6ZmxhdGJ1ZmZlcnMuQnVpbGRlciwgbnVtRWxlbXM6bnVtYmVyKSB7XG4iOwogICAgICAgICAgIGNvZGUgKz0gIiAgYnVpbGRlci5zdGFydFZlY3RvcigiICsgTnVtVG9TdHJpbmcoZWxlbV9zaXplKTsKICAgICAgICAgICBjb2RlICs9ICIsIG51bUVsZW1zLCAiICsgTnVtVG9TdHJpbmcoYWxpZ25tZW50KSArICIpO1xuIjsKICAgICAgICAgICBjb2RlICs9ICJ9XG5cbiI7CkBAIC0xNzI0LDggKzE3MzcsOCBAQAogICAgICAgICB9CiAKICAgICAgICAgY29kZSArPSAiKTpmbGF0YnVmZmVycy5PZmZzZXQge1xuIjsKLSAgICAgICAgY29kZSArPSAiICAiICsgb2JqZWN0X25hbWUgKyAiLnN0YXJ0IiArCi0gICAgICAgICAgICAgICAgR2V0UHJlZml4ZWROYW1lKHN0cnVjdF9kZWYpICsgIihidWlsZGVyKTtcbiI7CisgICAgICAgIGNvZGUgKz0gIiAgIiArIG9iamVjdF9uYW1lICsgIi5zdGFydCIgKyBHZXRQcmVmaXhlZE5hbWUoc3RydWN0X2RlZikgKworICAgICAgICAgICAgICAgICIoYnVpbGRlcik7XG4iOwogCiAgICAgICAgIHN0ZDo6c3RyaW5nIG1ldGhvZFByZWZpeCA9IG9iamVjdF9uYW1lOwogICAgICAgICBmb3IgKGF1dG8gaXQgPSBzdHJ1Y3RfZGVmLmZpZWxkcy52ZWMuYmVnaW4oKTsKQEAgLTE3MzksOCArMTc1Miw3IEBACiAgICAgICAgICAgICBjb2RlICs9ICIgIGlmICgiICsgYXJnX25hbWUgKyAiICE9PSBudWxsKVxuICAiOwogICAgICAgICAgIH0KIAotICAgICAgICAgIGNvZGUgKz0gIiAgIiArIG1ldGhvZFByZWZpeCArICIuYWRkIiArCi0gICAgICAgICAgICAgICAgICBDb252ZXJ0Q2FzZShmaWVsZC5uYW1lLCBDYXNlOjprVXBwZXJDYW1lbCkgKyAiKCI7CisgICAgICAgICAgY29kZSArPSAiICAiICsgbWV0aG9kUHJlZml4ICsgIi4iICsgbmFtZXJfLk1ldGhvZCgiYWRkIiwgZmllbGQpICsgIigiOwogICAgICAgICAgIGNvZGUgKz0gImJ1aWxkZXIsICIgKyBhcmdfbmFtZSArICIpO1xuIjsKICAgICAgICAgfQogCkBAIC0xNzU4LDEwICsxNzcwLDkgQEAKICAgICAgIGNvZGUgKz0gIn1cbiI7CiAKICAgICAgIGNvZGUgKz0gIlxuIjsKLSAgICAgIGNvZGUgKz0gInN0YXRpYyBkZXNlcmlhbGl6ZShidWZmZXI6IFVpbnQ4QXJyYXkpOiIgKyBFc2NhcGVLZXl3b3JkKG5hbWUpICsKLSAgICAgICAgICAgICAgIiB7XG4iOwotICAgICAgY29kZSArPSAiICByZXR1cm4gIiArCi0gICAgICAgICAgICAgIEVzY2FwZUtleXdvcmQoQWRkSW1wb3J0KGltcG9ydHMsIHN0cnVjdF9kZWYsIHN0cnVjdF9kZWYpKSArCisgICAgICBjb2RlICs9ICJzdGF0aWMgZGVzZXJpYWxpemUoYnVmZmVyOiBVaW50OEFycmF5KToiICsKKyAgICAgICAgICAgICAgbmFtZXJfLkVzY2FwZUtleXdvcmQobmFtZSkgKyAiIHtcbiI7CisgICAgICBjb2RlICs9ICIgIHJldHVybiAiICsgQWRkSW1wb3J0KGltcG9ydHMsIHN0cnVjdF9kZWYsIHN0cnVjdF9kZWYpLm5hbWUgKwogICAgICAgICAgICAgICAiLmdldFJvb3RBcyIgKyBuYW1lICsgIihuZXcgZmxhdGJ1ZmZlcnMuQnl0ZUJ1ZmZlcihidWZmZXIpKVxuIjsKICAgICAgIGNvZGUgKz0gIn1cbiI7CiAgICAgfQpAQCAtMTc4OSwxMiArMTgwMCw4IEBACiAgIH0KIAogICBzdGQ6OnN0cmluZyBHZXRBcmdOYW1lKGNvbnN0IEZpZWxkRGVmICZmaWVsZCkgewotICAgIGF1dG8gYXJnbmFtZSA9IENvbnZlcnRDYXNlKGZpZWxkLm5hbWUsIENhc2U6OmtMb3dlckNhbWVsKTsKLSAgICBpZiAoIUlzU2NhbGFyKGZpZWxkLnZhbHVlLnR5cGUuYmFzZV90eXBlKSkgewotICAgICAgYXJnbmFtZSArPSAiT2Zmc2V0IjsKLSAgICB9IGVsc2UgewotICAgICAgYXJnbmFtZSA9IEVzY2FwZUtleXdvcmQoYXJnbmFtZSk7Ci0gICAgfQorICAgIGF1dG8gYXJnbmFtZSA9IG5hbWVyXy5WYXJpYWJsZShmaWVsZCk7CisgICAgaWYgKCFJc1NjYWxhcihmaWVsZC52YWx1ZS50eXBlLmJhc2VfdHlwZSkpIHsgYXJnbmFtZSArPSAiT2Zmc2V0IjsgfQogICAgIHJldHVybiBhcmduYW1lOwogICB9CiAKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3NyYy9pZGxfbmFtZXIuaCBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3NyYy9pZGxfbmFtZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNjBlMzBjCi0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvc3JjL2lkbF9uYW1lci5oCkBAIC0wLDAgKzEsMTY4IEBACisjaWZuZGVmIEZMQVRCVUZGRVJTX0lETF9OQU1FUgorI2RlZmluZSBGTEFUQlVGRkVSU19JRExfTkFNRVIKKworI2luY2x1ZGUgImZsYXRidWZmZXJzL2lkbC5oIgorI2luY2x1ZGUgIm5hbWVyLmgiCisKK25hbWVzcGFjZSBmbGF0YnVmZmVycyB7CisKKy8vIFByb3ZpZGVzIE5hbWVyIGNhcGFiaWxpdGllcyB0byB0eXBlcyBkZWZpbmVkIGluIHRoZSBmbGF0YnVmZmVycyBJREwuCitjbGFzcyBJZGxOYW1lciA6IHB1YmxpYyBOYW1lciB7CisgcHVibGljOgorICBleHBsaWNpdCBJZGxOYW1lcihDb25maWcgY29uZmlnLCBzdGQ6OnNldDxzdGQ6OnN0cmluZz4ga2V5d29yZHMpCisgICAgICA6IE5hbWVyKGNvbmZpZywgc3RkOjptb3ZlKGtleXdvcmRzKSkge30KKworICB1c2luZyBOYW1lcjo6Q29uc3RhbnQ7CisgIHVzaW5nIE5hbWVyOjpEaXJlY3RvcmllczsKKyAgdXNpbmcgTmFtZXI6OkZpZWxkOworICB1c2luZyBOYW1lcjo6RmlsZTsKKyAgdXNpbmcgTmFtZXI6OkZ1bmN0aW9uOworICB1c2luZyBOYW1lcjo6TWV0aG9kOworICB1c2luZyBOYW1lcjo6TmFtZXNwYWNlOworICB1c2luZyBOYW1lcjo6TmFtZXNwYWNlZFR5cGU7CisgIHVzaW5nIE5hbWVyOjpPYmplY3RUeXBlOworICB1c2luZyBOYW1lcjo6VHlwZTsKKyAgdXNpbmcgTmFtZXI6OlZhcmlhYmxlOworICB1c2luZyBOYW1lcjo6VmFyaWFudDsKKworICBzdGQ6OnN0cmluZyBDb25zdGFudChjb25zdCBGaWVsZERlZiAmZCkgY29uc3QgeyByZXR1cm4gQ29uc3RhbnQoZC5uYW1lKTsgfQorCisgIC8vIFR5cGVzIGFyZSBhbHdheXMgc3RydWN0cyBvciBlbnVtcyBzbyB3ZSBjYW4gb25seSBleHBvc2UgdGhlc2UgdHdvCisgIC8vIG92ZXJsb2Fkcy4KKyAgc3RkOjpzdHJpbmcgVHlwZShjb25zdCBTdHJ1Y3REZWYgJmQpIGNvbnN0IHsgcmV0dXJuIFR5cGUoZC5uYW1lKTsgfQorICBzdGQ6OnN0cmluZyBUeXBlKGNvbnN0IEVudW1EZWYgJmQpIGNvbnN0IHsgcmV0dXJuIFR5cGUoZC5uYW1lKTsgfQorCisgIHN0ZDo6c3RyaW5nIEZ1bmN0aW9uKGNvbnN0IERlZmluaXRpb24gJnMpIGNvbnN0IHsgcmV0dXJuIEZ1bmN0aW9uKHMubmFtZSk7IH0KKyAgc3RkOjpzdHJpbmcgRnVuY3Rpb24oY29uc3Qgc3RkOjpzdHJpbmcmIHByZWZpeCwgY29uc3QgRGVmaW5pdGlvbiAmcykgY29uc3QgeworICAgIHJldHVybiBGdW5jdGlvbihwcmVmaXggKyBzLm5hbWUpOworICB9CisKKyAgc3RkOjpzdHJpbmcgRmllbGQoY29uc3QgRmllbGREZWYgJnMpIGNvbnN0IHsgcmV0dXJuIEZpZWxkKHMubmFtZSk7IH0KKyAgc3RkOjpzdHJpbmcgRmllbGQoY29uc3QgRmllbGREZWYgJmQsIGNvbnN0IHN0ZDo6c3RyaW5nICZzKSBjb25zdCB7CisgICAgcmV0dXJuIEZpZWxkKGQubmFtZSArICJfIiArIHMpOworICB9CisKKyAgc3RkOjpzdHJpbmcgVmFyaWFibGUoY29uc3QgRmllbGREZWYgJnMpIGNvbnN0IHsgcmV0dXJuIFZhcmlhYmxlKHMubmFtZSk7IH0KKworICBzdGQ6OnN0cmluZyBWYXJpYWJsZShjb25zdCBTdHJ1Y3REZWYgJnMpIGNvbnN0IHsgcmV0dXJuIFZhcmlhYmxlKHMubmFtZSk7IH0KKworICBzdGQ6OnN0cmluZyBWYXJpYW50KGNvbnN0IEVudW1WYWwgJnMpIGNvbnN0IHsgcmV0dXJuIFZhcmlhbnQocy5uYW1lKTsgfQorCisgIHN0ZDo6c3RyaW5nIEVudW1WYXJpYW50KGNvbnN0IEVudW1EZWYgJmUsIGNvbnN0IEVudW1WYWwgJnYpIGNvbnN0IHsKKyAgICByZXR1cm4gVHlwZShlKSArIGNvbmZpZ18uZW51bV92YXJpYW50X3NlcGVyYXRvciArIFZhcmlhbnQodik7CisgIH0KKworICBzdGQ6OnN0cmluZyBPYmplY3RUeXBlKGNvbnN0IFN0cnVjdERlZiAmZCkgY29uc3QgeworICAgIHJldHVybiBPYmplY3RUeXBlKGQubmFtZSk7CisgIH0KKyAgc3RkOjpzdHJpbmcgT2JqZWN0VHlwZShjb25zdCBFbnVtRGVmICZkKSBjb25zdCB7IHJldHVybiBPYmplY3RUeXBlKGQubmFtZSk7IH0KKworICBzdGQ6OnN0cmluZyBNZXRob2QoY29uc3QgRmllbGREZWYgJmQsIGNvbnN0IHN0ZDo6c3RyaW5nICZzdWZmaXgpIGNvbnN0IHsKKyAgICByZXR1cm4gTWV0aG9kKGQubmFtZSwgc3VmZml4KTsKKyAgfQorICBzdGQ6OnN0cmluZyBNZXRob2QoY29uc3Qgc3RkOjpzdHJpbmcgJnByZWZpeCwgY29uc3QgU3RydWN0RGVmICZkKSBjb25zdCB7CisgICAgcmV0dXJuIE1ldGhvZChwcmVmaXgsIGQubmFtZSk7CisgIH0KKyAgc3RkOjpzdHJpbmcgTWV0aG9kKGNvbnN0IHN0ZDo6c3RyaW5nICZwcmVmaXgsIGNvbnN0IEZpZWxkRGVmICZkKSBjb25zdCB7CisgICAgcmV0dXJuIE1ldGhvZChwcmVmaXgsIGQubmFtZSk7CisgIH0KKyAgc3RkOjpzdHJpbmcgTWV0aG9kKGNvbnN0IHN0ZDo6c3RyaW5nICZwcmVmaXgsIGNvbnN0IEZpZWxkRGVmICZkLAorICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgJnN1ZmZpeCkgY29uc3QgeworICAgIHJldHVybiBNZXRob2QocHJlZml4LCBkLm5hbWUsIHN1ZmZpeCk7CisgIH0KKworICBzdGQ6OnN0cmluZyBOYW1lc3BhY2UoY29uc3Qgc3RydWN0IE5hbWVzcGFjZSAmbnMpIGNvbnN0IHsKKyAgICByZXR1cm4gTmFtZXNwYWNlKG5zLmNvbXBvbmVudHMpOworICB9CisKKyAgc3RkOjpzdHJpbmcgTmFtZXNwYWNlZEVudW1WYXJpYW50KGNvbnN0IEVudW1EZWYgJmUsIGNvbnN0IEVudW1WYWwgJnYpIGNvbnN0IHsKKyAgICByZXR1cm4gTmFtZXNwYWNlZFN0cmluZyhlLmRlZmluZWRfbmFtZXNwYWNlLCBFbnVtVmFyaWFudChlLCB2KSk7CisgIH0KKworICBzdGQ6OnN0cmluZyBOYW1lc3BhY2VkVHlwZShjb25zdCBEZWZpbml0aW9uICZkZWYpIGNvbnN0IHsKKyAgICByZXR1cm4gTmFtZXNwYWNlZFN0cmluZyhkZWYuZGVmaW5lZF9uYW1lc3BhY2UsIFR5cGUoZGVmLm5hbWUpKTsKKyAgfQorCisgIHN0ZDo6c3RyaW5nIE5hbWVzcGFjZWRPYmplY3RUeXBlKGNvbnN0IERlZmluaXRpb24gJmRlZikgY29uc3QgeworICAgIHJldHVybiBOYW1lc3BhY2VkU3RyaW5nKGRlZi5kZWZpbmVkX25hbWVzcGFjZSwgT2JqZWN0VHlwZShkZWYubmFtZSkpOworICB9CisKKyAgc3RkOjpzdHJpbmcgRGlyZWN0b3JpZXMoY29uc3Qgc3RydWN0IE5hbWVzcGFjZSAmbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFNraXBEaXIgc2tpcHMgPSBTa2lwRGlyOjpOb25lKSBjb25zdCB7CisgICAgcmV0dXJuIERpcmVjdG9yaWVzKG5zLmNvbXBvbmVudHMsIHNraXBzKTsKKyAgfQorCisgIC8vIExlZ2FjeSBmaWVsZHMgZG8gbm90IHJlYWxseSBmb2xsb3cgdGhlIHVzdWFsIGNvbmZpZyBhbmQgc2hvdWxkIGJlCisgIC8vIGNvbnNpZGVyZWQgZm9yIGRlcHJlY2F0aW9uLgorCisgIHN0ZDo6c3RyaW5nIExlZ2FjeVJ1c3ROYXRpdmVWYXJpYW50KGNvbnN0IEVudW1WYWwgJnYpIGNvbnN0IHsKKyAgICByZXR1cm4gQ29udmVydENhc2UoRXNjYXBlS2V5d29yZCh2Lm5hbWUpLCBDYXNlOjprVXBwZXJDYW1lbCk7CisgIH0KKworICBzdGQ6OnN0cmluZyBMZWdhY3lSdXN0RmllbGRPZmZzZXROYW1lKGNvbnN0IEZpZWxkRGVmICZmaWVsZCkgY29uc3QgeworICAgIHJldHVybiAiVlRfIiArIENvbnZlcnRDYXNlKEVzY2FwZUtleXdvcmQoZmllbGQubmFtZSksIENhc2U6OmtBbGxVcHBlcik7CisgIH0KKworICBzdGQ6OnN0cmluZyBMZWdhY3lTd2lmdFZhcmlhbnQoY29uc3QgRW51bVZhbCAmZXYpIGNvbnN0IHsKKyAgICBhdXRvIG5hbWUgPSBldi5uYW1lOworICAgIGlmIChpc3VwcGVyKG5hbWUuZnJvbnQoKSkpIHsKKyAgICAgIHN0ZDo6dHJhbnNmb3JtKG5hbWUuYmVnaW4oKSwgbmFtZS5lbmQoKSwgbmFtZS5iZWdpbigpLCBDaGFyVG9Mb3dlcik7CisgICAgfQorICAgIHJldHVybiBFc2NhcGVLZXl3b3JkKENvbnZlcnRDYXNlKG5hbWUsIENhc2U6OmtMb3dlckNhbWVsKSk7CisgIH0KKworICAvLyBBbHNvIHVzZWQgYnkgS290bGluLCBsb2wuCisgIHN0ZDo6c3RyaW5nIExlZ2FjeUphdmFNZXRob2QyKGNvbnN0IHN0ZDo6c3RyaW5nICZwcmVmaXgsIGNvbnN0IFN0cnVjdERlZiAmc2QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nICZzdWZmaXgpIGNvbnN0IHsKKyAgICByZXR1cm4gcHJlZml4ICsgc2QubmFtZSArIHN1ZmZpeDsKKyAgfQorCisgIHN0ZDo6c3RyaW5nIExlZ2FjeUtvdGxpblZhcmlhbnQoRW51bVZhbCAmZXYpIGNvbnN0IHsKKyAgICAvLyBOYW1lciBhc3N1bWVzIHRoZSBpbnB1dCBjYXNlIGlzIHNuYWtlIGNhc2Ugd2hpY2ggaXMgd3JvbmcuLi4KKyAgICByZXR1cm4gQ29udmVydENhc2UoRXNjYXBlS2V5d29yZChldi5uYW1lKSwgQ2FzZTo6a0xvd2VyQ2FtZWwpOworICB9CisgIC8vIEtvdGxpbiBtZXRob2RzIGVzY2FwZXMga2V5d29yZHMgYWZ0ZXIgY2FzZSBjb252ZXJzaW9uIGJ1dCBiZWZvcmUKKyAgLy8gcHJlZml4aW5nIGFuZCBzdWZmaXhpbmcuCisgIHN0ZDo6c3RyaW5nIExlZ2FjeUtvdGxpbk1ldGhvZChjb25zdCBzdGQ6OnN0cmluZyAmcHJlZml4LCBjb25zdCBGaWVsZERlZiAmZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nICZzdWZmaXgpIGNvbnN0IHsKKyAgICByZXR1cm4gcHJlZml4ICsgQ29udmVydENhc2UoRXNjYXBlS2V5d29yZChkLm5hbWUpLCBDYXNlOjprVXBwZXJDYW1lbCkgKworICAgICAgICAgICBzdWZmaXg7CisgIH0KKyAgc3RkOjpzdHJpbmcgTGVnYWN5S290bGluTWV0aG9kKGNvbnN0IHN0ZDo6c3RyaW5nICZwcmVmaXgsIGNvbnN0IFN0cnVjdERlZiAmZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nICZzdWZmaXgpIGNvbnN0IHsKKyAgICByZXR1cm4gcHJlZml4ICsgQ29udmVydENhc2UoRXNjYXBlS2V5d29yZChkLm5hbWUpLCBDYXNlOjprVXBwZXJDYW1lbCkgKworICAgICAgICAgICBzdWZmaXg7CisgIH0KKworICAvLyBUaGlzIGlzIGEgbWl4IG9mIHNuYWtlIGNhc2UgYW5kIGtlZXAgY2FzaW5nLCB3aGVuIFRzIHNob3VsZCBiZSB1c2luZworICAvLyBsb3dlciBjYW1lbCBjYXNlLgorICBzdGQ6OnN0cmluZyBMZWdhY3lUc011dGF0ZU1ldGhvZChjb25zdCBGaWVsZERlZiYgZCkgeworICAgIHJldHVybiAibXV0YXRlXyIgKyBkLm5hbWU7CisgIH0KKworIHByaXZhdGU6CisgIHN0ZDo6c3RyaW5nIE5hbWVzcGFjZWRTdHJpbmcoY29uc3Qgc3RydWN0IE5hbWVzcGFjZSAqbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgJnN0cikgY29uc3QgeworICAgIHN0ZDo6c3RyaW5nIHJldDsKKyAgICBpZiAobnMgIT0gbnVsbHB0cikgeyByZXQgKz0gTmFtZXNwYWNlKG5zLT5jb21wb25lbnRzKTsgfQorICAgIGlmICghcmV0LmVtcHR5KCkpIHJldCArPSBjb25maWdfLm5hbWVzcGFjZV9zZXBlcmF0b3I7CisgICAgcmV0dXJuIHJldCArIHN0cjsKKyAgfQorfTsKKworLy8gVGhpcyBpcyBhIHRlbXBvcmFyeSBoZWxwZXIgZnVuY3Rpb24gZm9yIGNvZGUgZ2VuZXJhdG9ycyB0byBjYWxsIHVudGlsIGFsbAorLy8gZmxhZy1vdmVycmlkaW5nIGxvZ2ljIGludG8gZmxhdGMuY3BwCitpbmxpbmUgTmFtZXI6OkNvbmZpZyBXaXRoRmxhZ09wdGlvbnMoY29uc3QgTmFtZXI6OkNvbmZpZyAmaW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSURMT3B0aW9ucyAmb3B0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyAmcGF0aCkgeworICBOYW1lcjo6Q29uZmlnIHJlc3VsdCA9IGlucHV0OworICByZXN1bHQub2JqZWN0X3ByZWZpeCA9IG9wdHMub2JqZWN0X3ByZWZpeDsKKyAgcmVzdWx0Lm9iamVjdF9zdWZmaXggPSBvcHRzLm9iamVjdF9zdWZmaXg7CisgIHJlc3VsdC5vdXRwdXRfcGF0aCA9IHBhdGg7CisgIHJlc3VsdC5maWxlbmFtZV9zdWZmaXggPSBvcHRzLmZpbGVuYW1lX3N1ZmZpeDsKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworfSAgLy8gbmFtZXNwYWNlIGZsYXRidWZmZXJzCisKKyNlbmRpZiAgLy8gRkxBVEJVRkZFUlNfSURMX05BTUVSCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy9zcmMvaWRsX3BhcnNlci5jcHAgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy9zcmMvaWRsX3BhcnNlci5jcHAKaW5kZXggZTlhYTQ3Ny4uNDk3ZTgyYiAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvc3JjL2lkbF9wYXJzZXIuY3BwCisrKyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3NyYy9pZGxfcGFyc2VyLmNwcApAQCAtMzYsMjQgKzM2LDkgQEAKICAgLy8gY2xhbmctZm9ybWF0IG9uCiB9CiAKLWNvbnN0IGRvdWJsZSBrUGkgPSAzLjE0MTU5MjY1MzU4OTc5MzIzODQ2OworbmFtZXNwYWNlIHsKIAotLy8gY2xhbmctZm9ybWF0IG9mZgotY29uc3QgY2hhciAqY29uc3Qga1R5cGVOYW1lc1tdID0gewotICAjZGVmaW5lIEZMQVRCVUZGRVJTX1REKEVOVU0sIElETFRZUEUsIC4uLikgXAotICAgIElETFRZUEUsCi0gICAgRkxBVEJVRkZFUlNfR0VOX1RZUEVTKEZMQVRCVUZGRVJTX1REKQotICAjdW5kZWYgRkxBVEJVRkZFUlNfVEQKLSAgbnVsbHB0cgotfTsKLQotY29uc3QgY2hhciBrVHlwZVNpemVzW10gPSB7Ci0gICNkZWZpbmUgRkxBVEJVRkZFUlNfVEQoRU5VTSwgSURMVFlQRSwgQ1RZUEUsIC4uLikgXAotICAgIHNpemVvZihDVFlQRSksCi0gICAgRkxBVEJVRkZFUlNfR0VOX1RZUEVTKEZMQVRCVUZGRVJTX1REKQotICAjdW5kZWYgRkxBVEJVRkZFUlNfVEQKLX07Ci0vLyBjbGFuZy1mb3JtYXQgb24KK3N0YXRpYyBjb25zdCBkb3VibGUga1BpID0gMy4xNDE1OTI2NTM1ODk3OTMyMzg0NjsKIAogLy8gVGhlIGVudW1zIGluIHRoZSByZWZsZWN0aW9uIHNjaGVtYSBzaG91bGQgbWF0Y2ggdGhlIG9uZXMgd2UgdXNlIGludGVybmFsbHkuCiAvLyBDb21wYXJlIHRoZSBsYXN0IGVsZW1lbnQgdG8gY2hlY2sgaWYgdGhlc2UgZ28gb3V0IG9mIHN5bmMuCkBAIC05Myw5NyArNzgsMzYgQEAKICAgcmV0dXJuIHRydWU7CiB9CiAKLXZvaWQgRGVzZXJpYWxpemVEb2Moc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+ICZkb2MsCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IFZlY3RvcjxPZmZzZXQ8U3RyaW5nPj4gKmRvY3VtZW50YXRpb24pIHsKK3N0YXRpYyB2b2lkIERlc2VyaWFsaXplRG9jKHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiAmZG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmVjdG9yPE9mZnNldDxTdHJpbmc+PiAqZG9jdW1lbnRhdGlvbikgewogICBpZiAoZG9jdW1lbnRhdGlvbiA9PSBudWxscHRyKSByZXR1cm47CiAgIGZvciAodW9mZnNldF90IGluZGV4ID0gMDsgaW5kZXggPCBkb2N1bWVudGF0aW9uLT5zaXplKCk7IGluZGV4KyspCiAgICAgZG9jLnB1c2hfYmFjayhkb2N1bWVudGF0aW9uLT5HZXQoaW5kZXgpLT5zdHIoKSk7CiB9CiAKLXZvaWQgUGFyc2VyOjpNZXNzYWdlKGNvbnN0IHN0ZDo6c3RyaW5nICZtc2cpIHsKLSAgaWYgKCFlcnJvcl8uZW1wdHkoKSkgZXJyb3JfICs9ICJcbiI7ICAvLyBsb2cgYWxsIHdhcm5pbmdzIGFuZCBlcnJvcnMKLSAgZXJyb3JfICs9IGZpbGVfYmVpbmdfcGFyc2VkXy5sZW5ndGgoKSA/IEFic29sdXRlUGF0aChmaWxlX2JlaW5nX3BhcnNlZF8pIDogIiI7Ci0gIC8vIGNsYW5nLWZvcm1hdCBvZmYKK3N0YXRpYyBDaGVja2VkRXJyb3IgTm9FcnJvcigpIHsgcmV0dXJuIENoZWNrZWRFcnJvcihmYWxzZSk7IH0KIAotICAjaWZkZWYgX1dJTjMyICAvLyBNU1ZDIGFsaWtlCi0gICAgZXJyb3JfICs9Ci0gICAgICAgICIoIiArIE51bVRvU3RyaW5nKGxpbmVfKSArICIsICIgKyBOdW1Ub1N0cmluZyhDdXJzb3JQb3NpdGlvbigpKSArICIpIjsKLSAgI2Vsc2UgIC8vIGdjYyBhbGlrZQotICAgIGlmIChmaWxlX2JlaW5nX3BhcnNlZF8ubGVuZ3RoKCkpIGVycm9yXyArPSAiOiI7Ci0gICAgZXJyb3JfICs9IE51bVRvU3RyaW5nKGxpbmVfKSArICI6ICIgKyBOdW1Ub1N0cmluZyhDdXJzb3JQb3NpdGlvbigpKTsKLSAgI2VuZGlmCi0gIC8vIGNsYW5nLWZvcm1hdCBvbgotICBlcnJvcl8gKz0gIjogIiArIG1zZzsKLX0KLQotdm9pZCBQYXJzZXI6Oldhcm5pbmcoY29uc3Qgc3RkOjpzdHJpbmcgJm1zZykgewotICBpZiAoIW9wdHMubm9fd2FybmluZ3MpIHsKLSAgICBNZXNzYWdlKCJ3YXJuaW5nOiAiICsgbXNnKTsKLSAgICBoYXNfd2FybmluZ18gPSB0cnVlOyAgLy8gZm9yIG9wdHMud2FybmluZ3NfYXNfZXJyb3JzCi0gIH0KLX0KLQotQ2hlY2tlZEVycm9yIFBhcnNlcjo6RXJyb3IoY29uc3Qgc3RkOjpzdHJpbmcgJm1zZykgewotICBNZXNzYWdlKCJlcnJvcjogIiArIG1zZyk7Ci0gIHJldHVybiBDaGVja2VkRXJyb3IodHJ1ZSk7Ci19Ci0KLWlubGluZSBDaGVja2VkRXJyb3IgTm9FcnJvcigpIHsgcmV0dXJuIENoZWNrZWRFcnJvcihmYWxzZSk7IH0KLQotQ2hlY2tlZEVycm9yIFBhcnNlcjo6UmVjdXJzZUVycm9yKCkgewotICByZXR1cm4gRXJyb3IoIm1heGltdW0gcGFyc2luZyBkZXB0aCAiICsgTnVtVG9TdHJpbmcocGFyc2VfZGVwdGhfY291bnRlcl8pICsKLSAgICAgICAgICAgICAgICIgcmVhY2hlZCIpOwotfQotCi1jb25zdCBzdGQ6OnN0cmluZyAmUGFyc2VyOjpHZXRQb29sZWRTdHJpbmcoY29uc3Qgc3RkOjpzdHJpbmcgJnMpIGNvbnN0IHsKLSAgcmV0dXJuICooc3RyaW5nX2NhY2hlXy5pbnNlcnQocykuZmlyc3QpOwotfQotCi1jbGFzcyBQYXJzZXI6OlBhcnNlRGVwdGhHdWFyZCB7Ci0gcHVibGljOgotICBleHBsaWNpdCBQYXJzZURlcHRoR3VhcmQoUGFyc2VyICpwYXJzZXJfbm90X251bGwpCi0gICAgICA6IHBhcnNlcl8oKnBhcnNlcl9ub3RfbnVsbCksIGNhbGxlcl9kZXB0aF8ocGFyc2VyXy5wYXJzZV9kZXB0aF9jb3VudGVyXykgewotICAgIEZMQVRCVUZGRVJTX0FTU0VSVChjYWxsZXJfZGVwdGhfIDw9IChGTEFUQlVGRkVSU19NQVhfUEFSU0lOR19ERVBUSCkgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgIkNoZWNrKCkgbXVzdCBiZSBjYWxsZWQgdG8gcHJldmVudCBzdGFjayBvdmVyZmxvdyIpOwotICAgIHBhcnNlcl8ucGFyc2VfZGVwdGhfY291bnRlcl8gKz0gMTsKLSAgfQotCi0gIH5QYXJzZURlcHRoR3VhcmQoKSB7IHBhcnNlcl8ucGFyc2VfZGVwdGhfY291bnRlcl8gLT0gMTsgfQotCi0gIENoZWNrZWRFcnJvciBDaGVjaygpIHsKLSAgICByZXR1cm4gY2FsbGVyX2RlcHRoXyA+PSAoRkxBVEJVRkZFUlNfTUFYX1BBUlNJTkdfREVQVEgpCi0gICAgICAgICAgICAgICA/IHBhcnNlcl8uUmVjdXJzZUVycm9yKCkKLSAgICAgICAgICAgICAgIDogQ2hlY2tlZEVycm9yKGZhbHNlKTsKLSAgfQotCi0gIEZMQVRCVUZGRVJTX0RFTEVURV9GVU5DKFBhcnNlRGVwdGhHdWFyZChjb25zdCBQYXJzZURlcHRoR3VhcmQgJikpOwotICBGTEFUQlVGRkVSU19ERUxFVEVfRlVOQyhQYXJzZURlcHRoR3VhcmQgJm9wZXJhdG9yPShjb25zdCBQYXJzZURlcHRoR3VhcmQgJikpOwotCi0gcHJpdmF0ZToKLSAgUGFyc2VyICZwYXJzZXJfOwotICBjb25zdCBpbnQgY2FsbGVyX2RlcHRoXzsKLX07Ci0KLXRlbXBsYXRlPHR5cGVuYW1lIFQ+IHN0ZDo6c3RyaW5nIFR5cGVUb0ludGVydmFsU3RyaW5nKCkgewordGVtcGxhdGU8dHlwZW5hbWUgVD4gc3RhdGljIHN0ZDo6c3RyaW5nIFR5cGVUb0ludGVydmFsU3RyaW5nKCkgewogICByZXR1cm4gIlsiICsgTnVtVG9TdHJpbmcoKGZsYXRidWZmZXJzOjpudW1lcmljX2xpbWl0czxUPjo6bG93ZXN0KSgpKSArICI7ICIgKwogICAgICAgICAgTnVtVG9TdHJpbmcoKGZsYXRidWZmZXJzOjpudW1lcmljX2xpbWl0czxUPjo6bWF4KSgpKSArICJdIjsKIH0KIAogLy8gYXRvdDogdGVtcGxhdGUgdmVyc2lvbiBvZiBhdG9pL2F0b2Y6IGNvbnZlcnQgYSBzdHJpbmcgdG8gYW4gaW5zdGFuY2Ugb2YgVC4KIHRlbXBsYXRlPHR5cGVuYW1lIFQ+Ci1ib29sIGF0b3Rfc2NhbGFyKGNvbnN0IGNoYXIgKnMsIFQgKnZhbCwgYm9vbF9jb25zdGFudDxmYWxzZT4pIHsKK3N0YXRpYyBib29sIGF0b3Rfc2NhbGFyKGNvbnN0IGNoYXIgKnMsIFQgKnZhbCwgYm9vbF9jb25zdGFudDxmYWxzZT4pIHsKICAgcmV0dXJuIFN0cmluZ1RvTnVtYmVyKHMsIHZhbCk7CiB9CiAKIHRlbXBsYXRlPHR5cGVuYW1lIFQ+Ci1ib29sIGF0b3Rfc2NhbGFyKGNvbnN0IGNoYXIgKnMsIFQgKnZhbCwgYm9vbF9jb25zdGFudDx0cnVlPikgeworc3RhdGljIGJvb2wgYXRvdF9zY2FsYXIoY29uc3QgY2hhciAqcywgVCAqdmFsLCBib29sX2NvbnN0YW50PHRydWU+KSB7CiAgIC8vIE5vcm1hbGl6ZSBOYU4gcGFyc2VkIGZyb20gZmJzIG9yIGpzb24gdG8gdW5zaWduZWQgTmFOLgogICBpZiAoZmFsc2UgPT0gU3RyaW5nVG9OdW1iZXIocywgdmFsKSkgcmV0dXJuIGZhbHNlOwogICAqdmFsID0gKCp2YWwgIT0gKnZhbCkgPyBzdGQ6OmZhYnMoKnZhbCkgOiAqdmFsOwogICByZXR1cm4gdHJ1ZTsKIH0KIAotdGVtcGxhdGU8dHlwZW5hbWUgVD4gQ2hlY2tlZEVycm9yIGF0b3QoY29uc3QgY2hhciAqcywgUGFyc2VyICZwYXJzZXIsIFQgKnZhbCkgewordGVtcGxhdGU8dHlwZW5hbWUgVD4KK3N0YXRpYyBDaGVja2VkRXJyb3IgYXRvdChjb25zdCBjaGFyICpzLCBQYXJzZXIgJnBhcnNlciwgVCAqdmFsKSB7CiAgIGF1dG8gZG9uZSA9IGF0b3Rfc2NhbGFyKHMsIHZhbCwgYm9vbF9jb25zdGFudDxpc19mbG9hdGluZ19wb2ludDxUPjo6dmFsdWU+KCkpOwogICBpZiAoZG9uZSkgcmV0dXJuIE5vRXJyb3IoKTsKICAgaWYgKDAgPT0gKnZhbCkKQEAgLTE5MywzMyArMTE3LDE4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAiLCBjb25zdGFudCBkb2VzIG5vdCBmaXQgIiArIFR5cGVUb0ludGVydmFsU3RyaW5nPFQ+KCkpOwogfQogdGVtcGxhdGU8PgotaW5saW5lIENoZWNrZWRFcnJvciBhdG90PE9mZnNldDx2b2lkPj4oY29uc3QgY2hhciAqcywgUGFyc2VyICZwYXJzZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPZmZzZXQ8dm9pZD4gKnZhbCkgeworQ2hlY2tlZEVycm9yIGF0b3Q8T2Zmc2V0PHZvaWQ+Pihjb25zdCBjaGFyICpzLCBQYXJzZXIgJnBhcnNlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2Zmc2V0PHZvaWQ+ICp2YWwpIHsKICAgKHZvaWQpcGFyc2VyOwogICAqdmFsID0gT2Zmc2V0PHZvaWQ+KGF0b2kocykpOwogICByZXR1cm4gTm9FcnJvcigpOwogfQogCi1zdGQ6OnN0cmluZyBOYW1lc3BhY2U6OkdldEZ1bGx5UXVhbGlmaWVkTmFtZShjb25zdCBzdGQ6OnN0cmluZyAmbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBtYXhfY29tcG9uZW50cykgY29uc3QgewotICAvLyBFYXJseSBleGl0IGlmIHdlIGRvbid0IGhhdmUgYSBkZWZpbmVkIG5hbWVzcGFjZS4KLSAgaWYgKGNvbXBvbmVudHMuZW1wdHkoKSB8fCAhbWF4X2NvbXBvbmVudHMpIHsgcmV0dXJuIG5hbWU7IH0KLSAgc3RkOjpzdHJpbmcgc3RyZWFtX3N0cjsKLSAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzdGQ6Om1pbihjb21wb25lbnRzLnNpemUoKSwgbWF4X2NvbXBvbmVudHMpOyBpKyspIHsKLSAgICBzdHJlYW1fc3RyICs9IGNvbXBvbmVudHNbaV07Ci0gICAgc3RyZWFtX3N0ciArPSAnLic7Ci0gIH0KLSAgaWYgKCFzdHJlYW1fc3RyLmVtcHR5KCkpIHN0cmVhbV9zdHIucG9wX2JhY2soKTsKLSAgaWYgKG5hbWUubGVuZ3RoKCkpIHsKLSAgICBzdHJlYW1fc3RyICs9ICcuJzsKLSAgICBzdHJlYW1fc3RyICs9IG5hbWU7Ci0gIH0KLSAgcmV0dXJuIHN0cmVhbV9zdHI7Ci19Ci0KIHRlbXBsYXRlPHR5cGVuYW1lIFQ+Ci1UICpMb29rdXBUYWJsZUJ5TmFtZShjb25zdCBTeW1ib2xUYWJsZTxUPiAmdGFibGUsIGNvbnN0IHN0ZDo6c3RyaW5nICZuYW1lLAotICAgICAgICAgICAgICAgICAgICAgY29uc3QgTmFtZXNwYWNlICZjdXJyZW50X25hbWVzcGFjZSwgc2l6ZV90IHNraXBfdG9wKSB7CitzdGF0aWMgVCAqTG9va3VwVGFibGVCeU5hbWUoY29uc3QgU3ltYm9sVGFibGU8VD4gJnRhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nICZuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE5hbWVzcGFjZSAmY3VycmVudF9uYW1lc3BhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHNraXBfdG9wKSB7CiAgIGNvbnN0IGF1dG8gJmNvbXBvbmVudHMgPSBjdXJyZW50X25hbWVzcGFjZS5jb21wb25lbnRzOwogICBpZiAodGFibGUuZGljdC5lbXB0eSgpKSByZXR1cm4gbnVsbHB0cjsKICAgaWYgKGNvbXBvbmVudHMuc2l6ZSgpIDwgc2tpcF90b3ApIHJldHVybiBudWxscHRyOwpAQCAtMjc4LDYgKzE4NywyNzEgQEAKIH0KIC8vIGNsYW5nLWZvcm1hdCBvbgogCitzdGF0aWMgYm9vbCBJc0lkZW50aWZpZXJTdGFydChjaGFyIGMpIHsgcmV0dXJuIGlzX2FscGhhKGMpIHx8IChjID09ICdfJyk7IH0KKworc3RhdGljIGJvb2wgQ29tcGFyZVNlcmlhbGl6ZWRTY2FsYXJzKGNvbnN0IHVpbnQ4X3QgKmEsIGNvbnN0IHVpbnQ4X3QgKmIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmllbGREZWYgJmtleSkgeworICBzd2l0Y2ggKGtleS52YWx1ZS50eXBlLmJhc2VfdHlwZSkgeworI2RlZmluZSBGTEFUQlVGRkVSU19URChFTlVNLCBJRExUWVBFLCBDVFlQRSwgLi4uKSAgICAgICAgICAgICAgICAgICAgICAgXAorICBjYXNlIEJBU0VfVFlQRV8jI0VOVU06IHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIENUWVBFIGRlZiA9IHN0YXRpY19jYXN0PENUWVBFPigwKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmICghYSB8fCAhYikgeyBTdHJpbmdUb051bWJlcihrZXkudmFsdWUuY29uc3RhbnQuY19zdHIoKSwgJmRlZik7IH0gXAorICAgIGNvbnN0IGF1dG8gYXYgPSBhID8gUmVhZFNjYWxhcjxDVFlQRT4oYSkgOiBkZWY7ICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNvbnN0IGF1dG8gYnYgPSBiID8gUmVhZFNjYWxhcjxDVFlQRT4oYikgOiBkZWY7ICAgICAgICAgICAgICAgICAgICAgXAorICAgIHJldHVybiBhdiA8IGJ2OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9CisgICAgRkxBVEJVRkZFUlNfR0VOX1RZUEVTX1NDQUxBUihGTEFUQlVGRkVSU19URCkKKyN1bmRlZiBGTEFUQlVGRkVSU19URAorICAgIGRlZmF1bHQ6IHsKKyAgICAgIEZMQVRCVUZGRVJTX0FTU0VSVChmYWxzZSAmJiAic2NhbGFyIHR5cGUgZXhwZWN0ZWQiKTsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgIH0KK30KKworc3RhdGljIGJvb2wgQ29tcGFyZVRhYmxlc0J5U2NhbGFyS2V5KGNvbnN0IE9mZnNldDxUYWJsZT4gKl9hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE9mZnNldDxUYWJsZT4gKl9iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpZWxkRGVmICZrZXkpIHsKKyAgY29uc3Qgdm9mZnNldF90IG9mZnNldCA9IGtleS52YWx1ZS5vZmZzZXQ7CisgIC8vIEluZGlyZWN0IG9mZnNldCBwb2ludGVyIHRvIHRhYmxlIHBvaW50ZXIuCisgIGF1dG8gYSA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCAqPihfYSkgKyBSZWFkU2NhbGFyPHVvZmZzZXRfdD4oX2EpOworICBhdXRvIGIgPSByZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QgKj4oX2IpICsgUmVhZFNjYWxhcjx1b2Zmc2V0X3Q+KF9iKTsKKyAgLy8gRmV0Y2ggZmllbGQgYWRkcmVzcyBmcm9tIHRhYmxlLgorICBhID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBUYWJsZSAqPihhKS0+R2V0QWRkcmVzc09mKG9mZnNldCk7CisgIGIgPSByZWludGVycHJldF9jYXN0PGNvbnN0IFRhYmxlICo+KGIpLT5HZXRBZGRyZXNzT2Yob2Zmc2V0KTsKKyAgcmV0dXJuIENvbXBhcmVTZXJpYWxpemVkU2NhbGFycyhhLCBiLCBrZXkpOworfQorCitzdGF0aWMgYm9vbCBDb21wYXJlVGFibGVzQnlTdHJpbmdLZXkoY29uc3QgT2Zmc2V0PFRhYmxlPiAqX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgT2Zmc2V0PFRhYmxlPiAqX2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmllbGREZWYgJmtleSkgeworICBjb25zdCB2b2Zmc2V0X3Qgb2Zmc2V0ID0ga2V5LnZhbHVlLm9mZnNldDsKKyAgLy8gSW5kaXJlY3Qgb2Zmc2V0IHBvaW50ZXIgdG8gdGFibGUgcG9pbnRlci4KKyAgYXV0byBhID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90ICo+KF9hKSArIFJlYWRTY2FsYXI8dW9mZnNldF90PihfYSk7CisgIGF1dG8gYiA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCAqPihfYikgKyBSZWFkU2NhbGFyPHVvZmZzZXRfdD4oX2IpOworICAvLyBGZXRjaCBmaWVsZCBhZGRyZXNzIGZyb20gdGFibGUuCisgIGEgPSByZWludGVycHJldF9jYXN0PGNvbnN0IFRhYmxlICo+KGEpLT5HZXRBZGRyZXNzT2Yob2Zmc2V0KTsKKyAgYiA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVGFibGUgKj4oYiktPkdldEFkZHJlc3NPZihvZmZzZXQpOworICBpZiAoYSAmJiBiKSB7CisgICAgLy8gSW5kaXJlY3Qgb2Zmc2V0IHBvaW50ZXIgdG8gc3RyaW5nIHBvaW50ZXIuCisgICAgYSArPSBSZWFkU2NhbGFyPHVvZmZzZXRfdD4oYSk7CisgICAgYiArPSBSZWFkU2NhbGFyPHVvZmZzZXRfdD4oYik7CisgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PGNvbnN0IFN0cmluZyAqPihhKSA8CisgICAgICAgICAgICpyZWludGVycHJldF9jYXN0PGNvbnN0IFN0cmluZyAqPihiKTsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gYSA/IHRydWUgOiBmYWxzZTsKKyAgfQorfQorCitzdGF0aWMgdm9pZCBTd2FwU2VyaWFsaXplZFRhYmxlcyhPZmZzZXQ8VGFibGU+ICphLCBPZmZzZXQ8VGFibGU+ICpiKSB7CisgIC8vIFRoZXNlIGFyZSBzZXJpYWxpemVkIG9mZnNldHMsIHNvIGFyZSByZWxhdGl2ZSB3aGVyZSB0aGV5IGFyZQorICAvLyBzdG9yZWQgaW4gbWVtb3J5LCBzbyBjb21wdXRlIHRoZSBkaXN0YW5jZSBiZXR3ZWVuIHRoZXNlIHBvaW50ZXJzOgorICBwdHJkaWZmX3QgZGlmZiA9IChiIC0gYSkgKiBzaXplb2YoT2Zmc2V0PFRhYmxlPik7CisgIEZMQVRCVUZGRVJTX0FTU0VSVChkaWZmID49IDApOyAgLy8gR3VhcmFudGVlZCBieSBTaW1wbGVRc29ydC4KKyAgYXV0byB1ZGlmZiA9IHN0YXRpY19jYXN0PHVvZmZzZXRfdD4oZGlmZik7CisgIGEtPm8gPSBFbmRpYW5TY2FsYXIoUmVhZFNjYWxhcjx1b2Zmc2V0X3Q+KGEpIC0gdWRpZmYpOworICBiLT5vID0gRW5kaWFuU2NhbGFyKFJlYWRTY2FsYXI8dW9mZnNldF90PihiKSArIHVkaWZmKTsKKyAgc3RkOjpzd2FwKCphLCAqYik7Cit9CisKKy8vIFNlZSBiZWxvdyBmb3Igd2h5IHdlIG5lZWQgb3VyIG93biBzb3J0IDooCit0ZW1wbGF0ZTx0eXBlbmFtZSBULCB0eXBlbmFtZSBGLCB0eXBlbmFtZSBTPgorc3RhdGljIHZvaWQgU2ltcGxlUXNvcnQoVCAqYmVnaW4sIFQgKmVuZCwgc2l6ZV90IHdpZHRoLCBGIGNvbXBhcmF0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICBTIHN3YXBwZXIpIHsKKyAgaWYgKGVuZCAtIGJlZ2luIDw9IHN0YXRpY19jYXN0PHB0cmRpZmZfdD4od2lkdGgpKSByZXR1cm47CisgIGF1dG8gbCA9IGJlZ2luICsgd2lkdGg7CisgIGF1dG8gciA9IGVuZDsKKyAgd2hpbGUgKGwgPCByKSB7CisgICAgaWYgKGNvbXBhcmF0b3IoYmVnaW4sIGwpKSB7CisgICAgICByIC09IHdpZHRoOworICAgICAgc3dhcHBlcihsLCByKTsKKyAgICB9IGVsc2UgeworICAgICAgbCArPSB3aWR0aDsKKyAgICB9CisgIH0KKyAgbCAtPSB3aWR0aDsKKyAgc3dhcHBlcihiZWdpbiwgbCk7CisgIFNpbXBsZVFzb3J0KGJlZ2luLCBsLCB3aWR0aCwgY29tcGFyYXRvciwgc3dhcHBlcik7CisgIFNpbXBsZVFzb3J0KHIsIGVuZCwgd2lkdGgsIGNvbXBhcmF0b3IsIHN3YXBwZXIpOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBzdGF0aWMgaW5saW5lIHZvaWQgU2luZ2xlVmFsdWVSZXBhY2soVmFsdWUgJmUsIFQgdmFsKSB7CisgIC8vIFJlbW92ZSBsZWFkaW5nIHplcm9zLgorICBpZiAoSXNJbnRlZ2VyKGUudHlwZS5iYXNlX3R5cGUpKSB7IGUuY29uc3RhbnQgPSBOdW1Ub1N0cmluZyh2YWwpOyB9Cit9CisKKyNpZiBkZWZpbmVkKEZMQVRCVUZGRVJTX0hBU19ORVdfU1RSVE9EKSAmJiAoRkxBVEJVRkZFUlNfSEFTX05FV19TVFJUT0QgPiAwKQorLy8gTm9ybWFsaXplIGRlZmF1bHRzIE5hTiB0byB1bnNpZ25lZCBxdWlldC1OYU4oMCkgaWYgdmFsdWUgd2FzIHBhcnNlZCBmcm9tCisvLyBoZXgtZmxvYXQgbGl0ZXJhbC4KK3N0YXRpYyB2b2lkIFNpbmdsZVZhbHVlUmVwYWNrKFZhbHVlICZlLCBmbG9hdCB2YWwpIHsKKyAgaWYgKHZhbCAhPSB2YWwpIGUuY29uc3RhbnQgPSAibmFuIjsKK30KK3N0YXRpYyB2b2lkIFNpbmdsZVZhbHVlUmVwYWNrKFZhbHVlICZlLCBkb3VibGUgdmFsKSB7CisgIGlmICh2YWwgIT0gdmFsKSBlLmNvbnN0YW50ID0gIm5hbiI7Cit9CisjZW5kaWYKKwordGVtcGxhdGU8dHlwZW5hbWUgVD4gc3RhdGljIHVpbnQ2NF90IEVudW1EaXN0YW5jZUltcGwoVCBlMSwgVCBlMikgeworICBpZiAoZTEgPCBlMikgeyBzdGQ6OnN3YXAoZTEsIGUyKTsgfSAgLy8gdXNlIHN0ZCBmb3Igc2NhbGFycworICAvLyBTaWduZWQgb3ZlcmZsb3cgbWF5IG9jY3VyLCB1c2UgdW5zaWduZWQgY2FsY3VsYXRpb24uCisgIC8vIFRoZSB1bnNpZ25lZCBvdmVyZmxvdyBpcyB3ZWxsLWRlZmluZWQgYnkgQysrIHN0YW5kYXJkIChtb2R1bG8gMl5uKS4KKyAgcmV0dXJuIHN0YXRpY19jYXN0PHVpbnQ2NF90PihlMSkgLSBzdGF0aWNfY2FzdDx1aW50NjRfdD4oZTIpOworfQorCitzdGF0aWMgYm9vbCBjb21wYXJlRmllbGREZWZzKGNvbnN0IEZpZWxkRGVmICphLCBjb25zdCBGaWVsZERlZiAqYikgeworICBhdXRvIGFfaWQgPSBhdG9pKGEtPmF0dHJpYnV0ZXMuTG9va3VwKCJpZCIpLT5jb25zdGFudC5jX3N0cigpKTsKKyAgYXV0byBiX2lkID0gYXRvaShiLT5hdHRyaWJ1dGVzLkxvb2t1cCgiaWQiKS0+Y29uc3RhbnQuY19zdHIoKSk7CisgIHJldHVybiBhX2lkIDwgYl9pZDsKK30KKworc3RhdGljIE5hbWVzcGFjZSAqR2V0TmFtZXNwYWNlKAorICAgIGNvbnN0IHN0ZDo6c3RyaW5nICZxdWFsaWZpZWRfbmFtZSwgc3RkOjp2ZWN0b3I8TmFtZXNwYWNlICo+ICZuYW1lc3BhY2VzLAorICAgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBOYW1lc3BhY2UgKj4gJm5hbWVzcGFjZXNfaW5kZXgpIHsKKyAgc2l6ZV90IGRvdCA9IHF1YWxpZmllZF9uYW1lLmZpbmRfbGFzdF9vZignLicpOworICBzdGQ6OnN0cmluZyBuYW1lc3BhY2VfbmFtZSA9IChkb3QgIT0gc3RkOjpzdHJpbmc6Om5wb3MpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gc3RkOjpzdHJpbmcocXVhbGlmaWVkX25hbWUuY19zdHIoKSwgZG90KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICIiOworICBOYW1lc3BhY2UgKiZucyA9IG5hbWVzcGFjZXNfaW5kZXhbbmFtZXNwYWNlX25hbWVdOworCisgIGlmICghbnMpIHsKKyAgICBucyA9IG5ldyBOYW1lc3BhY2UoKTsKKyAgICBuYW1lc3BhY2VzLnB1c2hfYmFjayhucyk7CisKKyAgICBzaXplX3QgcG9zID0gMDsKKworICAgIGZvciAoOzspIHsKKyAgICAgIGRvdCA9IHF1YWxpZmllZF9uYW1lLmZpbmQoJy4nLCBwb3MpOworICAgICAgaWYgKGRvdCA9PSBzdGQ6OnN0cmluZzo6bnBvcykgeyBicmVhazsgfQorICAgICAgbnMtPmNvbXBvbmVudHMucHVzaF9iYWNrKHF1YWxpZmllZF9uYW1lLnN1YnN0cihwb3MsIGRvdCAtIHBvcykpOworICAgICAgcG9zID0gZG90ICsgMTsKKyAgICB9CisgIH0KKworICByZXR1cm4gbnM7Cit9CisKKy8vIEdlbmVyYXRlIGEgdW5pcXVlIGhhc2ggZm9yIGEgZmlsZSBiYXNlZCBvbiBpdHMgbmFtZSBhbmQgY29udGVudHMgKGlmIGFueSkuCitzdGF0aWMgdWludDY0X3QgSGFzaEZpbGUoY29uc3QgY2hhciAqc291cmNlX2ZpbGVuYW1lLCBjb25zdCBjaGFyICpzb3VyY2UpIHsKKyAgdWludDY0X3QgaGFzaCA9IDA7CisKKyAgaWYgKHNvdXJjZV9maWxlbmFtZSkKKyAgICBoYXNoID0gSGFzaEZudjFhPHVpbnQ2NF90PihTdHJpcFBhdGgoc291cmNlX2ZpbGVuYW1lKS5jX3N0cigpKTsKKworICBpZiAoc291cmNlICYmICpzb3VyY2UpIGhhc2ggXj0gSGFzaEZudjFhPHVpbnQ2NF90Pihzb3VyY2UpOworCisgIHJldHVybiBoYXNoOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBzdGF0aWMgYm9vbCBjb21wYXJlTmFtZShjb25zdCBUICphLCBjb25zdCBUICpiKSB7CisgIHJldHVybiBhLT5kZWZpbmVkX25hbWVzcGFjZS0+R2V0RnVsbHlRdWFsaWZpZWROYW1lKGEtPm5hbWUpIDwKKyAgICAgICAgIGItPmRlZmluZWRfbmFtZXNwYWNlLT5HZXRGdWxseVF1YWxpZmllZE5hbWUoYi0+bmFtZSk7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+IHN0YXRpYyB2b2lkIEFzc2lnbkluZGljZXMoY29uc3Qgc3RkOjp2ZWN0b3I8VCAqPiAmZGVmdmVjKSB7CisgIC8vIFByZS1zb3J0IHRoZXNlIHZlY3RvcnMsIHN1Y2ggdGhhdCB3ZSBjYW4gc2V0IHRoZSBjb3JyZWN0IGluZGljZXMgZm9yIHRoZW0uCisgIGF1dG8gdmVjID0gZGVmdmVjOworICBzdGQ6OnNvcnQodmVjLmJlZ2luKCksIHZlYy5lbmQoKSwgY29tcGFyZU5hbWU8VD4pOworICBmb3IgKGludCBpID0gMDsgaSA8IHN0YXRpY19jYXN0PGludD4odmVjLnNpemUoKSk7IGkrKykgdmVjW2ldLT5pbmRleCA9IGk7Cit9CisKK30gIC8vIG5hbWVzcGFjZQorCisvLyBjbGFuZy1mb3JtYXQgb2ZmCitjb25zdCBjaGFyICpjb25zdCBrVHlwZU5hbWVzW10gPSB7CisgICNkZWZpbmUgRkxBVEJVRkZFUlNfVEQoRU5VTSwgSURMVFlQRSwgLi4uKSBcCisgICAgSURMVFlQRSwKKyAgICBGTEFUQlVGRkVSU19HRU5fVFlQRVMoRkxBVEJVRkZFUlNfVEQpCisgICN1bmRlZiBGTEFUQlVGRkVSU19URAorICBudWxscHRyCit9OworCitjb25zdCBjaGFyIGtUeXBlU2l6ZXNbXSA9IHsKKyAgI2RlZmluZSBGTEFUQlVGRkVSU19URChFTlVNLCBJRExUWVBFLCBDVFlQRSwgLi4uKSBcCisgICAgc2l6ZW9mKENUWVBFKSwKKyAgICBGTEFUQlVGRkVSU19HRU5fVFlQRVMoRkxBVEJVRkZFUlNfVEQpCisgICN1bmRlZiBGTEFUQlVGRkVSU19URAorfTsKKy8vIGNsYW5nLWZvcm1hdCBvbgorCit2b2lkIFBhcnNlcjo6TWVzc2FnZShjb25zdCBzdGQ6OnN0cmluZyAmbXNnKSB7CisgIGlmICghZXJyb3JfLmVtcHR5KCkpIGVycm9yXyArPSAiXG4iOyAgLy8gbG9nIGFsbCB3YXJuaW5ncyBhbmQgZXJyb3JzCisgIGVycm9yXyArPSBmaWxlX2JlaW5nX3BhcnNlZF8ubGVuZ3RoKCkgPyBBYnNvbHV0ZVBhdGgoZmlsZV9iZWluZ19wYXJzZWRfKSA6ICIiOworICAvLyBjbGFuZy1mb3JtYXQgb2ZmCisKKyAgI2lmZGVmIF9XSU4zMiAgLy8gTVNWQyBhbGlrZQorICAgIGVycm9yXyArPQorICAgICAgICAiKCIgKyBOdW1Ub1N0cmluZyhsaW5lXykgKyAiLCAiICsgTnVtVG9TdHJpbmcoQ3Vyc29yUG9zaXRpb24oKSkgKyAiKSI7CisgICNlbHNlICAvLyBnY2MgYWxpa2UKKyAgICBpZiAoZmlsZV9iZWluZ19wYXJzZWRfLmxlbmd0aCgpKSBlcnJvcl8gKz0gIjoiOworICAgIGVycm9yXyArPSBOdW1Ub1N0cmluZyhsaW5lXykgKyAiOiAiICsgTnVtVG9TdHJpbmcoQ3Vyc29yUG9zaXRpb24oKSk7CisgICNlbmRpZgorICAvLyBjbGFuZy1mb3JtYXQgb24KKyAgZXJyb3JfICs9ICI6ICIgKyBtc2c7Cit9CisKK3ZvaWQgUGFyc2VyOjpXYXJuaW5nKGNvbnN0IHN0ZDo6c3RyaW5nICZtc2cpIHsKKyAgaWYgKCFvcHRzLm5vX3dhcm5pbmdzKSB7CisgICAgTWVzc2FnZSgid2FybmluZzogIiArIG1zZyk7CisgICAgaGFzX3dhcm5pbmdfID0gdHJ1ZTsgIC8vIGZvciBvcHRzLndhcm5pbmdzX2FzX2Vycm9ycworICB9Cit9CisKK0NoZWNrZWRFcnJvciBQYXJzZXI6OkVycm9yKGNvbnN0IHN0ZDo6c3RyaW5nICZtc2cpIHsKKyAgTWVzc2FnZSgiZXJyb3I6ICIgKyBtc2cpOworICByZXR1cm4gQ2hlY2tlZEVycm9yKHRydWUpOworfQorCitDaGVja2VkRXJyb3IgUGFyc2VyOjpSZWN1cnNlRXJyb3IoKSB7CisgIHJldHVybiBFcnJvcigibWF4aW11bSBwYXJzaW5nIGRlcHRoICIgKyBOdW1Ub1N0cmluZyhwYXJzZV9kZXB0aF9jb3VudGVyXykgKworICAgICAgICAgICAgICAgIiByZWFjaGVkIik7Cit9CisKK2NvbnN0IHN0ZDo6c3RyaW5nICZQYXJzZXI6OkdldFBvb2xlZFN0cmluZyhjb25zdCBzdGQ6OnN0cmluZyAmcykgY29uc3QgeworICByZXR1cm4gKihzdHJpbmdfY2FjaGVfLmluc2VydChzKS5maXJzdCk7Cit9CisKK2NsYXNzIFBhcnNlcjo6UGFyc2VEZXB0aEd1YXJkIHsKKyBwdWJsaWM6CisgIGV4cGxpY2l0IFBhcnNlRGVwdGhHdWFyZChQYXJzZXIgKnBhcnNlcl9ub3RfbnVsbCkKKyAgICAgIDogcGFyc2VyXygqcGFyc2VyX25vdF9udWxsKSwgY2FsbGVyX2RlcHRoXyhwYXJzZXJfLnBhcnNlX2RlcHRoX2NvdW50ZXJfKSB7CisgICAgRkxBVEJVRkZFUlNfQVNTRVJUKGNhbGxlcl9kZXB0aF8gPD0gKEZMQVRCVUZGRVJTX01BWF9QQVJTSU5HX0RFUFRIKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAiQ2hlY2soKSBtdXN0IGJlIGNhbGxlZCB0byBwcmV2ZW50IHN0YWNrIG92ZXJmbG93Iik7CisgICAgcGFyc2VyXy5wYXJzZV9kZXB0aF9jb3VudGVyXyArPSAxOworICB9CisKKyAgflBhcnNlRGVwdGhHdWFyZCgpIHsgcGFyc2VyXy5wYXJzZV9kZXB0aF9jb3VudGVyXyAtPSAxOyB9CisKKyAgQ2hlY2tlZEVycm9yIENoZWNrKCkgeworICAgIHJldHVybiBjYWxsZXJfZGVwdGhfID49IChGTEFUQlVGRkVSU19NQVhfUEFSU0lOR19ERVBUSCkKKyAgICAgICAgICAgICAgID8gcGFyc2VyXy5SZWN1cnNlRXJyb3IoKQorICAgICAgICAgICAgICAgOiBDaGVja2VkRXJyb3IoZmFsc2UpOworICB9CisKKyAgRkxBVEJVRkZFUlNfREVMRVRFX0ZVTkMoUGFyc2VEZXB0aEd1YXJkKGNvbnN0IFBhcnNlRGVwdGhHdWFyZCAmKSk7CisgIEZMQVRCVUZGRVJTX0RFTEVURV9GVU5DKFBhcnNlRGVwdGhHdWFyZCAmb3BlcmF0b3I9KGNvbnN0IFBhcnNlRGVwdGhHdWFyZCAmKSk7CisKKyBwcml2YXRlOgorICBQYXJzZXIgJnBhcnNlcl87CisgIGNvbnN0IGludCBjYWxsZXJfZGVwdGhfOworfTsKKworc3RkOjpzdHJpbmcgTmFtZXNwYWNlOjpHZXRGdWxseVF1YWxpZmllZE5hbWUoY29uc3Qgc3RkOjpzdHJpbmcgJm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgbWF4X2NvbXBvbmVudHMpIGNvbnN0IHsKKyAgLy8gRWFybHkgZXhpdCBpZiB3ZSBkb24ndCBoYXZlIGEgZGVmaW5lZCBuYW1lc3BhY2UuCisgIGlmIChjb21wb25lbnRzLmVtcHR5KCkgfHwgIW1heF9jb21wb25lbnRzKSB7IHJldHVybiBuYW1lOyB9CisgIHN0ZDo6c3RyaW5nIHN0cmVhbV9zdHI7CisgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc3RkOjptaW4oY29tcG9uZW50cy5zaXplKCksIG1heF9jb21wb25lbnRzKTsgaSsrKSB7CisgICAgc3RyZWFtX3N0ciArPSBjb21wb25lbnRzW2ldOworICAgIHN0cmVhbV9zdHIgKz0gJy4nOworICB9CisgIGlmICghc3RyZWFtX3N0ci5lbXB0eSgpKSBzdHJlYW1fc3RyLnBvcF9iYWNrKCk7CisgIGlmIChuYW1lLmxlbmd0aCgpKSB7CisgICAgc3RyZWFtX3N0ciArPSAnLic7CisgICAgc3RyZWFtX3N0ciArPSBuYW1lOworICB9CisgIHJldHVybiBzdHJlYW1fc3RyOworfQorCiBzdGQ6OnN0cmluZyBQYXJzZXI6OlRva2VuVG9TdHJpbmdJZChpbnQgdCkgY29uc3QgewogICByZXR1cm4gdCA9PSBrVG9rZW5JZGVudGlmaWVyID8gYXR0cmlidXRlXyA6IFRva2VuVG9TdHJpbmcodCk7CiB9CkBAIC0zMDcsMTAgKzQ4MSw2IEBACiAgIHJldHVybiBOb0Vycm9yKCk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgYm9vbCBJc0lkZW50aWZpZXJTdGFydChjaGFyIGMpIHsKLSAgcmV0dXJuIGlzX2FscGhhKGMpIHx8IChjID09ICdfJyk7Ci19Ci0KIENoZWNrZWRFcnJvciBQYXJzZXI6Ok5leHQoKSB7CiAgIGRvY19jb21tZW50Xy5jbGVhcigpOwogICBib29sIHNlZW5fbmV3bGluZSA9IGN1cnNvcl8gPT0gc291cmNlXzsKQEAgLTQ4OSwxMCArNjU5LDIxIEBACiAgICAgICAgIH0KIAogICAgICAgICBjb25zdCBhdXRvIGhhc19zaWduID0gKGMgPT0gJysnKSB8fCAoYyA9PSAnLScpOwotICAgICAgICBpZiAoaGFzX3NpZ24gJiYgSXNJZGVudGlmaWVyU3RhcnQoKmN1cnNvcl8pKSB7Ci0gICAgICAgICAgLy8gJy0nLycrJyBhbmQgZm9sbG93aW5nIGlkZW50aWZpZXIgLSBpdCBjb3VsZCBiZSBhIHByZWRlZmluZWQKLSAgICAgICAgICAvLyBjb25zdGFudC4gUmV0dXJuIHRoZSBzaWduIGluIHRva2VuXywgc2VlIFBhcnNlU2luZ2xlVmFsdWUuCi0gICAgICAgICAgcmV0dXJuIE5vRXJyb3IoKTsKKyAgICAgICAgaWYgKGhhc19zaWduKSB7CisgICAgICAgICAgLy8gQ2hlY2sgZm9yICsvLWluZiB3aGljaCBpcyBjb25zaWRlcmVkIGEgZmxvYXQgY29uc3RhbnQuCisgICAgICAgICAgaWYgKHN0cm5jbXAoY3Vyc29yXywgImluZiIsIDMpID09IDAgJiYKKyAgICAgICAgICAgICAgIShJc0lkZW50aWZpZXJTdGFydChjdXJzb3JfWzNdKSB8fCBpc19kaWdpdChjdXJzb3JfWzNdKSkpIHsKKyAgICAgICAgICAgIGF0dHJpYnV0ZV8uYXNzaWduKGN1cnNvcl8gLSAxLCBjdXJzb3JfICsgMyk7CisgICAgICAgICAgICB0b2tlbl8gPSBrVG9rZW5GbG9hdENvbnN0YW50OworICAgICAgICAgICAgY3Vyc29yXyArPSAzOworICAgICAgICAgICAgcmV0dXJuIE5vRXJyb3IoKTsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBpZiAoSXNJZGVudGlmaWVyU3RhcnQoKmN1cnNvcl8pKSB7CisgICAgICAgICAgICAvLyAnLScvJysnIGFuZCBmb2xsb3dpbmcgaWRlbnRpZmllciAtIGl0IGNvdWxkIGJlIGEgcHJlZGVmaW5lZAorICAgICAgICAgICAgLy8gY29uc3RhbnQuIFJldHVybiB0aGUgc2lnbiBpbiB0b2tlbl8sIHNlZSBQYXJzZVNpbmdsZVZhbHVlLgorICAgICAgICAgICAgcmV0dXJuIE5vRXJyb3IoKTsKKyAgICAgICAgICB9CiAgICAgICAgIH0KIAogICAgICAgICBhdXRvIGRvdF9sdmwgPQpAQCAtOTU4LDggKzExMzksMTIgQEAKICAgICAgICAgImRlZmluaXRpb24iKTsKIAogICBmaWVsZC0+bmF0aXZlX2lubGluZSA9IGZpZWxkLT5hdHRyaWJ1dGVzLkxvb2t1cCgibmF0aXZlX2lubGluZSIpICE9IG51bGxwdHI7Ci0gIGlmIChmaWVsZC0+bmF0aXZlX2lubGluZSAmJiAhSXNTdHJ1Y3QoZmllbGQtPnZhbHVlLnR5cGUpKQotICAgIHJldHVybiBFcnJvcigibmF0aXZlX2lubGluZSBjYW4gb25seSBiZSBkZWZpbmVkIG9uIHN0cnVjdHMiKTsKKyAgaWYgKGZpZWxkLT5uYXRpdmVfaW5saW5lICYmICFJc1N0cnVjdChmaWVsZC0+dmFsdWUudHlwZSkgJiYKKyAgICAgICFJc1ZlY3Rvck9mU3RydWN0KGZpZWxkLT52YWx1ZS50eXBlKSAmJgorICAgICAgIUlzVmVjdG9yT2ZUYWJsZShmaWVsZC0+dmFsdWUudHlwZSkpCisgICAgcmV0dXJuIEVycm9yKAorICAgICAgICAiJ25hdGl2ZV9pbmxpbmUnIGNhbiBvbmx5IGJlIGRlZmluZWQgb24gc3RydWN0cywgdmVjdG9yIG9mIHN0cnVjdHMgb3IgIgorICAgICAgICAidmVjdG9yIG9mIHRhYmxlcyIpOwogCiAgIGF1dG8gbmVzdGVkID0gZmllbGQtPmF0dHJpYnV0ZXMuTG9va3VwKCJuZXN0ZWRfZmxhdGJ1ZmZlciIpOwogICBpZiAobmVzdGVkKSB7CkBAIC0xMTAyLDggKzEyODcsOSBAQAogICAgICAgdWludDhfdCBlbnVtX2lkeDsKICAgICAgIGlmICh2ZWN0b3Jfb2ZfdW5pb25fdHlwZXMpIHsKICAgICAgICAgaWYgKHZlY3Rvcl9vZl91bmlvbl90eXBlcy0+c2l6ZSgpIDw9IGNvdW50KQotICAgICAgICAgIHJldHVybiBFcnJvcigidW5pb24gdHlwZXMgdmVjdG9yIHNtYWxsZXIgdGhhbiB1bmlvbiB2YWx1ZXMgdmVjdG9yIgotICAgICAgICAgICAgICAgICAgICAgICAiIGZvcjogIiArIGZpZWxkLT5uYW1lKTsKKyAgICAgICAgICByZXR1cm4gRXJyb3IoCisgICAgICAgICAgICAgICJ1bmlvbiB0eXBlcyB2ZWN0b3Igc21hbGxlciB0aGFuIHVuaW9uIHZhbHVlcyB2ZWN0b3IgZm9yOiAiICsKKyAgICAgICAgICAgICAgZmllbGQtPm5hbWUpOwogICAgICAgICBlbnVtX2lkeCA9IHZlY3Rvcl9vZl91bmlvbl90eXBlcy0+R2V0KGNvdW50KTsKICAgICAgIH0gZWxzZSB7CiAgICAgICAgIEVDSEVDSyhhdG90KGNvbnN0YW50LmNfc3RyKCksICp0aGlzLCAmZW51bV9pZHgpKTsKQEAgLTEzMjMsMTAgKzE1MDksMTggQEAKICAgICAgICAgICAgICAgICBFQ0hFQ0soYXRvdChmaWVsZF92YWx1ZS5jb25zdGFudC5jX3N0cigpLCAqdGhpcywgJnZhbCkpOyBcCiAgICAgICAgICAgICAgICAgYnVpbGRlcl8uUHVzaEVsZW1lbnQodmFsKTsgXAogICAgICAgICAgICAgICB9IGVsc2UgeyBcCi0gICAgICAgICAgICAgICAgQ1RZUEUgdmFsLCB2YWxkZWY7IFwKLSAgICAgICAgICAgICAgICBFQ0hFQ0soYXRvdChmaWVsZF92YWx1ZS5jb25zdGFudC5jX3N0cigpLCAqdGhpcywgJnZhbCkpOyBcCi0gICAgICAgICAgICAgICAgRUNIRUNLKGF0b3QoZmllbGQtPnZhbHVlLmNvbnN0YW50LmNfc3RyKCksICp0aGlzLCAmdmFsZGVmKSk7IFwKLSAgICAgICAgICAgICAgICBidWlsZGVyXy5BZGRFbGVtZW50KGZpZWxkX3ZhbHVlLm9mZnNldCwgdmFsLCB2YWxkZWYpOyBcCisgICAgICAgICAgICAgICAgaWYgKGZpZWxkLT5Jc1NjYWxhck9wdGlvbmFsKCkpIHsgXAorICAgICAgICAgICAgICAgICAgaWYgKGZpZWxkX3ZhbHVlLmNvbnN0YW50ICE9ICJudWxsIikgeyBcCisgICAgICAgICAgICAgICAgICAgIENUWVBFIHZhbDsgXAorICAgICAgICAgICAgICAgICAgICBFQ0hFQ0soYXRvdChmaWVsZF92YWx1ZS5jb25zdGFudC5jX3N0cigpLCAqdGhpcywgJnZhbCkpOyBcCisgICAgICAgICAgICAgICAgICAgIGJ1aWxkZXJfLkFkZEVsZW1lbnQoZmllbGRfdmFsdWUub2Zmc2V0LCB2YWwpOyBcCisgICAgICAgICAgICAgICAgICB9IFwKKyAgICAgICAgICAgICAgICB9IGVsc2UgeyBcCisgICAgICAgICAgICAgICAgICBDVFlQRSB2YWwsIHZhbGRlZjsgXAorICAgICAgICAgICAgICAgICAgRUNIRUNLKGF0b3QoZmllbGRfdmFsdWUuY29uc3RhbnQuY19zdHIoKSwgKnRoaXMsICZ2YWwpKTsgXAorICAgICAgICAgICAgICAgICAgRUNIRUNLKGF0b3QoZmllbGQtPnZhbHVlLmNvbnN0YW50LmNfc3RyKCksICp0aGlzLCAmdmFsZGVmKSk7IFwKKyAgICAgICAgICAgICAgICAgIGJ1aWxkZXJfLkFkZEVsZW1lbnQoZmllbGRfdmFsdWUub2Zmc2V0LCB2YWwsIHZhbGRlZik7IFwKKyAgICAgICAgICAgICAgICB9IFwKICAgICAgICAgICAgICAgfSBcCiAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgRkxBVEJVRkZFUlNfR0VOX1RZUEVTX1NDQUxBUihGTEFUQlVGRkVSU19URCkKQEAgLTEzOTAsOTAgKzE1ODQsNiBAQAogICByZXR1cm4gTm9FcnJvcigpOwogfQogCi1zdGF0aWMgYm9vbCBDb21wYXJlU2VyaWFsaXplZFNjYWxhcnMoY29uc3QgdWludDhfdCAqYSwgY29uc3QgdWludDhfdCAqYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWVsZERlZiAma2V5KSB7Ci0gIHN3aXRjaCAoa2V5LnZhbHVlLnR5cGUuYmFzZV90eXBlKSB7Ci0jZGVmaW5lIEZMQVRCVUZGRVJTX1REKEVOVU0sIElETFRZUEUsIENUWVBFLCAuLi4pICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGNhc2UgQkFTRV9UWVBFXyMjRU5VTTogeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgQ1RZUEUgZGVmID0gc3RhdGljX2Nhc3Q8Q1RZUEU+KDApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgaWYgKCFhIHx8ICFiKSB7IFN0cmluZ1RvTnVtYmVyKGtleS52YWx1ZS5jb25zdGFudC5jX3N0cigpLCAmZGVmKTsgfSBcCi0gICAgY29uc3QgYXV0byBhdiA9IGEgPyBSZWFkU2NhbGFyPENUWVBFPihhKSA6IGRlZjsgICAgICAgICAgICAgICAgICAgICBcCi0gICAgY29uc3QgYXV0byBidiA9IGIgPyBSZWFkU2NhbGFyPENUWVBFPihiKSA6IGRlZjsgICAgICAgICAgICAgICAgICAgICBcCi0gICAgcmV0dXJuIGF2IDwgYnY7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIH0KLSAgICBGTEFUQlVGRkVSU19HRU5fVFlQRVNfU0NBTEFSKEZMQVRCVUZGRVJTX1REKQotI3VuZGVmIEZMQVRCVUZGRVJTX1RECi0gICAgZGVmYXVsdDogewotICAgICAgRkxBVEJVRkZFUlNfQVNTRVJUKGZhbHNlICYmICJzY2FsYXIgdHlwZSBleHBlY3RlZCIpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgfQotfQotCi1zdGF0aWMgYm9vbCBDb21wYXJlVGFibGVzQnlTY2FsYXJLZXkoY29uc3QgT2Zmc2V0PFRhYmxlPiAqX2EsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgT2Zmc2V0PFRhYmxlPiAqX2IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmllbGREZWYgJmtleSkgewotICBjb25zdCB2b2Zmc2V0X3Qgb2Zmc2V0ID0ga2V5LnZhbHVlLm9mZnNldDsKLSAgLy8gSW5kaXJlY3Qgb2Zmc2V0IHBvaW50ZXIgdG8gdGFibGUgcG9pbnRlci4KLSAgYXV0byBhID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90ICo+KF9hKSArIFJlYWRTY2FsYXI8dW9mZnNldF90PihfYSk7Ci0gIGF1dG8gYiA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCAqPihfYikgKyBSZWFkU2NhbGFyPHVvZmZzZXRfdD4oX2IpOwotICAvLyBGZXRjaCBmaWVsZCBhZGRyZXNzIGZyb20gdGFibGUuCi0gIGEgPSByZWludGVycHJldF9jYXN0PGNvbnN0IFRhYmxlICo+KGEpLT5HZXRBZGRyZXNzT2Yob2Zmc2V0KTsKLSAgYiA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVGFibGUgKj4oYiktPkdldEFkZHJlc3NPZihvZmZzZXQpOwotICByZXR1cm4gQ29tcGFyZVNlcmlhbGl6ZWRTY2FsYXJzKGEsIGIsIGtleSk7Ci19Ci0KLXN0YXRpYyBib29sIENvbXBhcmVUYWJsZXNCeVN0cmluZ0tleShjb25zdCBPZmZzZXQ8VGFibGU+ICpfYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBPZmZzZXQ8VGFibGU+ICpfYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWVsZERlZiAma2V5KSB7Ci0gIGNvbnN0IHZvZmZzZXRfdCBvZmZzZXQgPSBrZXkudmFsdWUub2Zmc2V0OwotICAvLyBJbmRpcmVjdCBvZmZzZXQgcG9pbnRlciB0byB0YWJsZSBwb2ludGVyLgotICBhdXRvIGEgPSByZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QgKj4oX2EpICsgUmVhZFNjYWxhcjx1b2Zmc2V0X3Q+KF9hKTsKLSAgYXV0byBiID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90ICo+KF9iKSArIFJlYWRTY2FsYXI8dW9mZnNldF90PihfYik7Ci0gIC8vIEZldGNoIGZpZWxkIGFkZHJlc3MgZnJvbSB0YWJsZS4KLSAgYSA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVGFibGUgKj4oYSktPkdldEFkZHJlc3NPZihvZmZzZXQpOwotICBiID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBUYWJsZSAqPihiKS0+R2V0QWRkcmVzc09mKG9mZnNldCk7Ci0gIGlmIChhICYmIGIpIHsKLSAgICAvLyBJbmRpcmVjdCBvZmZzZXQgcG9pbnRlciB0byBzdHJpbmcgcG9pbnRlci4KLSAgICBhICs9IFJlYWRTY2FsYXI8dW9mZnNldF90PihhKTsKLSAgICBiICs9IFJlYWRTY2FsYXI8dW9mZnNldF90PihiKTsKLSAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgU3RyaW5nICo+KGEpIDwKLSAgICAgICAgICAgKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgU3RyaW5nICo+KGIpOwotICB9IGVsc2UgewotICAgIHJldHVybiBhID8gdHJ1ZSA6IGZhbHNlOwotICB9Ci19Ci0KLXN0YXRpYyB2b2lkIFN3YXBTZXJpYWxpemVkVGFibGVzKE9mZnNldDxUYWJsZT4gKmEsIE9mZnNldDxUYWJsZT4gKmIpIHsKLSAgLy8gVGhlc2UgYXJlIHNlcmlhbGl6ZWQgb2Zmc2V0cywgc28gYXJlIHJlbGF0aXZlIHdoZXJlIHRoZXkgYXJlCi0gIC8vIHN0b3JlZCBpbiBtZW1vcnksIHNvIGNvbXB1dGUgdGhlIGRpc3RhbmNlIGJldHdlZW4gdGhlc2UgcG9pbnRlcnM6Ci0gIHB0cmRpZmZfdCBkaWZmID0gKGIgLSBhKSAqIHNpemVvZihPZmZzZXQ8VGFibGU+KTsKLSAgRkxBVEJVRkZFUlNfQVNTRVJUKGRpZmYgPj0gMCk7ICAvLyBHdWFyYW50ZWVkIGJ5IFNpbXBsZVFzb3J0LgotICBhdXRvIHVkaWZmID0gc3RhdGljX2Nhc3Q8dW9mZnNldF90PihkaWZmKTsKLSAgYS0+byA9IEVuZGlhblNjYWxhcihSZWFkU2NhbGFyPHVvZmZzZXRfdD4oYSkgLSB1ZGlmZik7Ci0gIGItPm8gPSBFbmRpYW5TY2FsYXIoUmVhZFNjYWxhcjx1b2Zmc2V0X3Q+KGIpICsgdWRpZmYpOwotICBzdGQ6OnN3YXAoKmEsICpiKTsKLX0KLQotLy8gU2VlIGJlbG93IGZvciB3aHkgd2UgbmVlZCBvdXIgb3duIHNvcnQgOigKLXRlbXBsYXRlPHR5cGVuYW1lIFQsIHR5cGVuYW1lIEYsIHR5cGVuYW1lIFM+Ci12b2lkIFNpbXBsZVFzb3J0KFQgKmJlZ2luLCBUICplbmQsIHNpemVfdCB3aWR0aCwgRiBjb21wYXJhdG9yLCBTIHN3YXBwZXIpIHsKLSAgaWYgKGVuZCAtIGJlZ2luIDw9IHN0YXRpY19jYXN0PHB0cmRpZmZfdD4od2lkdGgpKSByZXR1cm47Ci0gIGF1dG8gbCA9IGJlZ2luICsgd2lkdGg7Ci0gIGF1dG8gciA9IGVuZDsKLSAgd2hpbGUgKGwgPCByKSB7Ci0gICAgaWYgKGNvbXBhcmF0b3IoYmVnaW4sIGwpKSB7Ci0gICAgICByIC09IHdpZHRoOwotICAgICAgc3dhcHBlcihsLCByKTsKLSAgICB9IGVsc2UgewotICAgICAgbCArPSB3aWR0aDsKLSAgICB9Ci0gIH0KLSAgbCAtPSB3aWR0aDsKLSAgc3dhcHBlcihiZWdpbiwgbCk7Ci0gIFNpbXBsZVFzb3J0KGJlZ2luLCBsLCB3aWR0aCwgY29tcGFyYXRvciwgc3dhcHBlcik7Ci0gIFNpbXBsZVFzb3J0KHIsIGVuZCwgd2lkdGgsIGNvbXBhcmF0b3IsIHN3YXBwZXIpOwotfQogCiBDaGVja2VkRXJyb3IgUGFyc2VyOjpQYXJzZUFsaWduQXR0cmlidXRlKGNvbnN0IHN0ZDo6c3RyaW5nICZhbGlnbl9jb25zdGFudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IG1pbl9hbGlnbiwgc2l6ZV90ICphbGlnbikgewpAQCAtMTgwMSwyMiArMTkxMSw2IEBACiAgIHJldHVybiBFcnJvcigiY2Fubm90IHBhcnNlIHZhbHVlIHN0YXJ0aW5nIHdpdGg6ICIgKyBUb2tlblRvU3RyaW5nSWQodG9rZW5fKSk7CiB9CiAKLS8vIFJlLXBhY2sgaGVscGVyIChQYXJzZVNpbmdsZVZhbHVlKSB0byBub3JtYWxpemUgZGVmYXVsdHMgb2Ygc2NhbGFycy4KLXRlbXBsYXRlPHR5cGVuYW1lIFQ+IGlubGluZSB2b2lkIFNpbmdsZVZhbHVlUmVwYWNrKFZhbHVlICZlLCBUIHZhbCkgewotICAvLyBSZW1vdmUgbGVhZGluZyB6ZXJvcy4KLSAgaWYgKElzSW50ZWdlcihlLnR5cGUuYmFzZV90eXBlKSkgeyBlLmNvbnN0YW50ID0gTnVtVG9TdHJpbmcodmFsKTsgfQotfQotI2lmIGRlZmluZWQoRkxBVEJVRkZFUlNfSEFTX05FV19TVFJUT0QpICYmIChGTEFUQlVGRkVSU19IQVNfTkVXX1NUUlRPRCA+IDApCi0vLyBOb3JtYWxpemUgZGVmYXVsdHMgTmFOIHRvIHVuc2lnbmVkIHF1aWV0LU5hTigwKSBpZiB2YWx1ZSB3YXMgcGFyc2VkIGZyb20KLS8vIGhleC1mbG9hdCBsaXRlcmFsLgotc3RhdGljIGlubGluZSB2b2lkIFNpbmdsZVZhbHVlUmVwYWNrKFZhbHVlICZlLCBmbG9hdCB2YWwpIHsKLSAgaWYgKHZhbCAhPSB2YWwpIGUuY29uc3RhbnQgPSAibmFuIjsKLX0KLXN0YXRpYyBpbmxpbmUgdm9pZCBTaW5nbGVWYWx1ZVJlcGFjayhWYWx1ZSAmZSwgZG91YmxlIHZhbCkgewotICBpZiAodmFsICE9IHZhbCkgZS5jb25zdGFudCA9ICJuYW4iOwotfQotI2VuZGlmCi0KIENoZWNrZWRFcnJvciBQYXJzZXI6OlBhcnNlRnVuY3Rpb24oY29uc3Qgc3RkOjpzdHJpbmcgKm5hbWUsIFZhbHVlICZlKSB7CiAgIFBhcnNlRGVwdGhHdWFyZCBkZXB0aF9ndWFyZCh0aGlzKTsKICAgRUNIRUNLKGRlcHRoX2d1YXJkLkNoZWNrKCkpOwpAQCAtMjA4OCwxMyArMjE4Miw2IEBACiAgIHJldHVybiB2YWxzLnZlYy5lbXB0eSgpID8gbnVsbHB0ciA6IHZhbHMudmVjLmJhY2soKTsKIH0KIAotdGVtcGxhdGU8dHlwZW5hbWUgVD4gc3RhdGljIHVpbnQ2NF90IEVudW1EaXN0YW5jZUltcGwoVCBlMSwgVCBlMikgewotICBpZiAoZTEgPCBlMikgeyBzdGQ6OnN3YXAoZTEsIGUyKTsgfSAgLy8gdXNlIHN0ZCBmb3Igc2NhbGFycwotICAvLyBTaWduZWQgb3ZlcmZsb3cgbWF5IG9jY3VyLCB1c2UgdW5zaWduZWQgY2FsY3VsYXRpb24uCi0gIC8vIFRoZSB1bnNpZ25lZCBvdmVyZmxvdyBpcyB3ZWxsLWRlZmluZWQgYnkgQysrIHN0YW5kYXJkIChtb2R1bG8gMl5uKS4KLSAgcmV0dXJuIHN0YXRpY19jYXN0PHVpbnQ2NF90PihlMSkgLSBzdGF0aWNfY2FzdDx1aW50NjRfdD4oZTIpOwotfQotCiB1aW50NjRfdCBFbnVtRGVmOjpEaXN0YW5jZShjb25zdCBFbnVtVmFsICp2MSwgY29uc3QgRW51bVZhbCAqdjIpIGNvbnN0IHsKICAgcmV0dXJuIElzVUludDY0KCkgPyBFbnVtRGlzdGFuY2VJbXBsKHYxLT5HZXRBc1VJbnQ2NCgpLCB2Mi0+R2V0QXNVSW50NjQoKSkKICAgICAgICAgICAgICAgICAgICAgOiBFbnVtRGlzdGFuY2VJbXBsKHYxLT5HZXRBc0ludDY0KCksIHYyLT5HZXRBc0ludDY0KCkpOwpAQCAtMjMxMiw2ICsyMzk5LDkgQEAKICAgICAvLyB0b2RvOiBDb252ZXJ0IHRvIHRoZSBFcnJvciBpbiB0aGUgZnV0dXJlPwogICAgIFdhcm5pbmcoInVuZGVybHlpbmcgdHlwZSBvZiBiaXRfZmxhZ3MgZW51bSBtdXN0IGJlIHVuc2lnbmVkIik7CiAgIH0KKyAgaWYgKGVudW1fZGVmLT5hdHRyaWJ1dGVzLkxvb2t1cCgiZm9yY2VfYWxpZ24iKSkgeworICAgIHJldHVybiBFcnJvcigiYGZvcmNlX2FsaWduYCBpcyBub3QgYSB2YWxpZCBhdHRyaWJ1dGUgZm9yIEVudW1zLiAiKTsKKyAgfQogICBFbnVtVmFsQnVpbGRlciBldmIoKnRoaXMsICplbnVtX2RlZik7CiAgIEVYUEVDVCgneycpOwogICAvLyBBIGxvdCBvZiBjb2RlIGdlbmVyYXRvcyBleHBlY3QgdGhhdCBhbiBlbnVtIGlzIG5vdC1lbXB0eS4KQEAgLTI0NDgsMTIgKzI1MzgsMTkgQEAKICAgcmV0dXJuIE5vRXJyb3IoKTsKIH0KIAorc3RkOjp2ZWN0b3I8SW5jbHVkZWRGaWxlPiBQYXJzZXI6OkdldEluY2x1ZGVkRmlsZXMoKSBjb25zdCB7CisgIGNvbnN0IGF1dG8gaXQgPSBmaWxlc19pbmNsdWRlZF9wZXJfZmlsZV8uZmluZChmaWxlX2JlaW5nX3BhcnNlZF8pOworICBpZiAoaXQgPT0gZmlsZXNfaW5jbHVkZWRfcGVyX2ZpbGVfLmVuZCgpKSB7IHJldHVybiB7fTsgfQorCisgIHJldHVybiB7IGl0LT5zZWNvbmQuY2JlZ2luKCksIGl0LT5zZWNvbmQuY2VuZCgpIH07Cit9CisKIGJvb2wgUGFyc2VyOjpTdXBwb3J0c09wdGlvbmFsU2NhbGFycyhjb25zdCBmbGF0YnVmZmVyczo6SURMT3B0aW9ucyAmb3B0cykgewogICBzdGF0aWMgRkxBVEJVRkZFUlNfQ09OU1RFWFBSIHVuc2lnbmVkIGxvbmcgc3VwcG9ydGVkX2xhbmdzID0KICAgICAgIElETE9wdGlvbnM6OmtSdXN0IHwgSURMT3B0aW9uczo6a1N3aWZ0IHwgSURMT3B0aW9uczo6a0xvYnN0ZXIgfAogICAgICAgSURMT3B0aW9uczo6a0tvdGxpbiB8IElETE9wdGlvbnM6OmtDcHAgfCBJRExPcHRpb25zOjprSmF2YSB8CiAgICAgICBJRExPcHRpb25zOjprQ1NoYXJwIHwgSURMT3B0aW9uczo6a1RzIHwgSURMT3B0aW9uczo6a0JpbmFyeSB8Ci0gICAgICBJRExPcHRpb25zOjprR287CisgICAgICBJRExPcHRpb25zOjprR28gfCBJRExPcHRpb25zOjprUHl0aG9uIHwgSURMT3B0aW9uczo6a0pzb247CiAgIHVuc2lnbmVkIGxvbmcgbGFuZ3MgPSBvcHRzLmxhbmdfdG9fZ2VuZXJhdGU7CiAgIHJldHVybiAobGFuZ3MgPiAwICYmIGxhbmdzIDwgSURMT3B0aW9uczo6a01BWCkgJiYgIShsYW5ncyAmIH5zdXBwb3J0ZWRfbGFuZ3MpOwogfQpAQCAtMjUwOCwxMiArMjYwNSw2IEBACiAgIHJldHVybiBmdWxsX3F1YWxpZmllZF9uYW1lLnN1YnN0cihwcmV2aW91cywgY3VycmVudCAtIHByZXZpb3VzKTsKIH0KIAotc3RhdGljIGJvb2wgY29tcGFyZUZpZWxkRGVmcyhjb25zdCBGaWVsZERlZiAqYSwgY29uc3QgRmllbGREZWYgKmIpIHsKLSAgYXV0byBhX2lkID0gYXRvaShhLT5hdHRyaWJ1dGVzLkxvb2t1cCgiaWQiKS0+Y29uc3RhbnQuY19zdHIoKSk7Ci0gIGF1dG8gYl9pZCA9IGF0b2koYi0+YXR0cmlidXRlcy5Mb29rdXAoImlkIiktPmNvbnN0YW50LmNfc3RyKCkpOwotICByZXR1cm4gYV9pZCA8IGJfaWQ7Ci19Ci0KIENoZWNrZWRFcnJvciBQYXJzZXI6OlBhcnNlRGVjbChjb25zdCBjaGFyICpmaWxlbmFtZSkgewogICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gZGMgPSBkb2NfY29tbWVudF87CiAgIGJvb2wgZml4ZWQgPSBJc0lkZW50KCJzdHJ1Y3QiKTsKQEAgLTI4ODQsNyArMjk3NSwxMSBAQAogICAgICAgICAgIGlmIChrZXkgPT0gImRlZmF1bHQiKSB7CiAgICAgICAgICAgICAvLyBUZW1wOiBza2lwIG5vbi1udW1lcmljIGFuZCBub24tYm9vbGVhbiBkZWZhdWx0cyAoZW51bXMpLgogICAgICAgICAgICAgYXV0byBudW1lcmljID0gc3RycGJyayh2YWwuY19zdHIoKSwgIjAxMjM0NTY3ODktKy4iKTsKLSAgICAgICAgICAgIGlmIChJc1NjYWxhcih0eXBlLmJhc2VfdHlwZSkgJiYgbnVtZXJpYyA9PSB2YWwuY19zdHIoKSkgeworICAgICAgICAgICAgaWYgKElzRmxvYXQodHlwZS5iYXNlX3R5cGUpICYmCisgICAgICAgICAgICAgICAgKHZhbCA9PSAiaW5mIiB8fCB2YWwgPT0gIitpbmYiIHx8IHZhbCA9PSAiLWluZiIpKSB7CisgICAgICAgICAgICAgIC8vIFByZWZlciB0byBiZSBleHBsaWNpdCB3aXRoICtpbmYuCisgICAgICAgICAgICAgIGZpZWxkLT52YWx1ZS5jb25zdGFudCA9IHZhbCA9PSAiaW5mIiA/ICIraW5mIiA6IHZhbDsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoSXNTY2FsYXIodHlwZS5iYXNlX3R5cGUpICYmIG51bWVyaWMgPT0gdmFsLmNfc3RyKCkpIHsKICAgICAgICAgICAgICAgZmllbGQtPnZhbHVlLmNvbnN0YW50ID0gdmFsOwogICAgICAgICAgICAgfSBlbHNlIGlmICh2YWwgPT0gInRydWUiKSB7CiAgICAgICAgICAgICAgIGZpZWxkLT52YWx1ZS5jb25zdGFudCA9IHZhbDsKQEAgLTMwMzIsNyArMzEyNyw4IEBACiAgICAgY2FzZSBrVG9rZW5JbnRlZ2VyQ29uc3RhbnQ6CiAgICAgY2FzZSBrVG9rZW5GbG9hdENvbnN0YW50OiBORVhUKCk7IGJyZWFrOwogICAgIGRlZmF1bHQ6Ci0gICAgICBpZiAoSXNJZGVudCgidHJ1ZSIpIHx8IElzSWRlbnQoImZhbHNlIikgfHwgSXNJZGVudCgibnVsbCIpKSB7CisgICAgICBpZiAoSXNJZGVudCgidHJ1ZSIpIHx8IElzSWRlbnQoImZhbHNlIikgfHwgSXNJZGVudCgibnVsbCIpIHx8CisgICAgICAgICAgSXNJZGVudCgiaW5mIikpIHsKICAgICAgICAgTkVYVCgpOwogICAgICAgfSBlbHNlCiAgICAgICAgIHJldHVybiBUb2tlbkVycm9yKCk7CkBAIC0zMjQ1LDMyICszMzQxLDc5IEBACiAgICAgICBmb3IgKGF1dG8gdmFsX2l0ID0gZW51bV9kZWYuVmFscygpLmJlZ2luKCk7CiAgICAgICAgICAgIHZhbF9pdCAhPSBlbnVtX2RlZi5WYWxzKCkuZW5kKCk7ICsrdmFsX2l0KSB7CiAgICAgICAgIGF1dG8gJnZhbCA9ICoqdmFsX2l0OworCiAgICAgICAgIGlmICghKG9wdHMubGFuZ190b19nZW5lcmF0ZSAhPSAwICYmIFN1cHBvcnRzQWR2YW5jZWRVbmlvbkZlYXR1cmVzKCkpICYmCiAgICAgICAgICAgICAoSXNTdHJ1Y3QodmFsLnVuaW9uX3R5cGUpIHx8IElzU3RyaW5nKHZhbC51bmlvbl90eXBlKSkpCisKICAgICAgICAgICByZXR1cm4gRXJyb3IoCiAgICAgICAgICAgICAgICJvbmx5IHRhYmxlcyBjYW4gYmUgdW5pb24gZWxlbWVudHMgaW4gdGhlIGdlbmVyYXRlZCBsYW5ndWFnZTogIiArCiAgICAgICAgICAgICAgIHZhbC5uYW1lKTsKICAgICAgIH0KICAgICB9CiAgIH0KKworICBhdXRvIGVyciA9IENoZWNrUHJpdmF0ZUxlYWsoKTsKKyAgaWYgKGVyci5DaGVjaygpKSByZXR1cm4gZXJyOworCiAgIC8vIFBhcnNlIEpTT04gb2JqZWN0IG9ubHkgaWYgdGhlIHNjaGVtZSBoYXMgYmVlbiBwYXJzZWQuCiAgIGlmICh0b2tlbl8gPT0gJ3snKSB7IEVDSEVDSyhEb1BhcnNlSnNvbigpKTsgfQotICBFWFBFQ1Qoa1Rva2VuRW9mKTsKICAgcmV0dXJuIE5vRXJyb3IoKTsKIH0KIAotLy8gR2VuZXJhdGUgYSB1bmlxdWUgaGFzaCBmb3IgYSBmaWxlIGJhc2VkIG9uIGl0cyBuYW1lIGFuZCBjb250ZW50cyAoaWYgYW55KS4KLXN0YXRpYyB1aW50NjRfdCBIYXNoRmlsZShjb25zdCBjaGFyICpzb3VyY2VfZmlsZW5hbWUsIGNvbnN0IGNoYXIgKnNvdXJjZSkgewotICB1aW50NjRfdCBoYXNoID0gMDsKK0NoZWNrZWRFcnJvciBQYXJzZXI6OkNoZWNrUHJpdmF0ZUxlYWsoKSB7CisgIGlmICghb3B0cy5ub19sZWFrX3ByaXZhdGVfYW5ub3RhdGlvbnMpIHJldHVybiBOb0Vycm9yKCk7CisgIC8vIEl0ZXJhdGUgb3ZlciBhbGwgc3RydWN0cy90YWJsZXMgdG8gdmFsaWRhdGUgd2UgYXJlbnQgbGVha2luZworICAvLyBhbnkgcHJpdmF0ZSAoc3RydWN0cy90YWJsZXMvZW51bXMpCisgIGZvciAoYXV0byBpdCA9IHN0cnVjdHNfLnZlYy5iZWdpbigpOyBpdCAhPSBzdHJ1Y3RzXy52ZWMuZW5kKCk7IGl0KyspIHsKKyAgICBhdXRvICZzdHJ1Y3RfZGVmID0gKippdDsKKyAgICBmb3IgKGF1dG8gZmxkX2l0ID0gc3RydWN0X2RlZi5maWVsZHMudmVjLmJlZ2luKCk7CisgICAgICAgICBmbGRfaXQgIT0gc3RydWN0X2RlZi5maWVsZHMudmVjLmVuZCgpOyArK2ZsZF9pdCkgeworICAgICAgYXV0byAmZmllbGQgPSAqKmZsZF9pdDsKIAotICBpZiAoc291cmNlX2ZpbGVuYW1lKQotICAgIGhhc2ggPSBIYXNoRm52MWE8dWludDY0X3Q+KFN0cmlwUGF0aChzb3VyY2VfZmlsZW5hbWUpLmNfc3RyKCkpOwotCi0gIGlmIChzb3VyY2UgJiYgKnNvdXJjZSkgaGFzaCBePSBIYXNoRm52MWE8dWludDY0X3Q+KHNvdXJjZSk7Ci0KLSAgcmV0dXJuIGhhc2g7CisgICAgICBpZiAoZmllbGQudmFsdWUudHlwZS5lbnVtX2RlZikgeworICAgICAgICBhdXRvIGVyciA9CisgICAgICAgICAgICBDaGVja1ByaXZhdGVseUxlYWtlZEZpZWxkcyhzdHJ1Y3RfZGVmLCAqZmllbGQudmFsdWUudHlwZS5lbnVtX2RlZik7CisgICAgICAgIGlmIChlcnIuQ2hlY2soKSkgeyByZXR1cm4gZXJyOyB9CisgICAgICB9IGVsc2UgaWYgKGZpZWxkLnZhbHVlLnR5cGUuc3RydWN0X2RlZikgeworICAgICAgICBhdXRvIGVyciA9IENoZWNrUHJpdmF0ZWx5TGVha2VkRmllbGRzKHN0cnVjdF9kZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmZpZWxkLnZhbHVlLnR5cGUuc3RydWN0X2RlZik7CisgICAgICAgIGlmIChlcnIuQ2hlY2soKSkgeyByZXR1cm4gZXJyOyB9CisgICAgICB9CisgICAgfQorICB9CisgIC8vIEl0ZXJhdGUgb3ZlciBhbGwgZW51bXMgdG8gdmFsaWRhdGUgd2UgYXJlbnQgbGVha2luZworICAvLyBhbnkgcHJpdmF0ZSAoc3RydWN0cy90YWJsZXMpCisgIGZvciAoYXV0byBpdCA9IGVudW1zXy52ZWMuYmVnaW4oKTsgaXQgIT0gZW51bXNfLnZlYy5lbmQoKTsgKytpdCkgeworICAgIGF1dG8gJmVudW1fZGVmID0gKippdDsKKyAgICBpZiAoZW51bV9kZWYuaXNfdW5pb24pIHsKKyAgICAgIGZvciAoYXV0byB2YWxfaXQgPSBlbnVtX2RlZi5WYWxzKCkuYmVnaW4oKTsKKyAgICAgICAgICAgdmFsX2l0ICE9IGVudW1fZGVmLlZhbHMoKS5lbmQoKTsgKyt2YWxfaXQpIHsKKyAgICAgICAgYXV0byAmdmFsID0gKip2YWxfaXQ7CisgICAgICAgIGlmICh2YWwudW5pb25fdHlwZS5zdHJ1Y3RfZGVmKSB7CisgICAgICAgICAgYXV0byBlcnIgPQorICAgICAgICAgICAgICBDaGVja1ByaXZhdGVseUxlYWtlZEZpZWxkcyhlbnVtX2RlZiwgKnZhbC51bmlvbl90eXBlLnN0cnVjdF9kZWYpOworICAgICAgICAgIGlmIChlcnIuQ2hlY2soKSkgeyByZXR1cm4gZXJyOyB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKyAgcmV0dXJuIE5vRXJyb3IoKTsKIH0KIAorQ2hlY2tlZEVycm9yIFBhcnNlcjo6Q2hlY2tQcml2YXRlbHlMZWFrZWRGaWVsZHMoY29uc3QgRGVmaW5pdGlvbiAmZGVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRGVmaW5pdGlvbiAmdmFsdWVfdHlwZSkgeworICBpZiAoIW9wdHMubm9fbGVha19wcml2YXRlX2Fubm90YXRpb25zKSByZXR1cm4gTm9FcnJvcigpOworICBjb25zdCBhdXRvIGlzX3ByaXZhdGUgPSBkZWYuYXR0cmlidXRlcy5Mb29rdXAoInByaXZhdGUiKTsKKyAgY29uc3QgYXV0byBpc19maWVsZF9wcml2YXRlID0gdmFsdWVfdHlwZS5hdHRyaWJ1dGVzLkxvb2t1cCgicHJpdmF0ZSIpOworICBpZiAoIWlzX3ByaXZhdGUgJiYgaXNfZmllbGRfcHJpdmF0ZSkgeworICAgIHJldHVybiBFcnJvcigKKyAgICAgICAgIkxlYWtpbmcgcHJpdmF0ZSBpbXBsZW1lbnRhdGlvbiwgdmVyaWZ5IGFsbCBvYmplY3RzIGhhdmUgc2ltaWxhciAiCisgICAgICAgICJhbm5vdGF0aW9ucyIpOworICB9CisgIHJldHVybiBOb0Vycm9yKCk7Cit9CisKKwogQ2hlY2tlZEVycm9yIFBhcnNlcjo6RG9QYXJzZShjb25zdCBjaGFyICpzb3VyY2UsIGNvbnN0IGNoYXIgKippbmNsdWRlX3BhdGhzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpzb3VyY2VfZmlsZW5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmluY2x1ZGVfZmlsZW5hbWUpIHsKQEAgLTMyODUsNyArMzQyOCw3IEBACiAKICAgICBpZiAoaW5jbHVkZWRfZmlsZXNfLmZpbmQoc291cmNlX2hhc2gpID09IGluY2x1ZGVkX2ZpbGVzXy5lbmQoKSkgewogICAgICAgaW5jbHVkZWRfZmlsZXNfW3NvdXJjZV9oYXNoXSA9IGluY2x1ZGVfZmlsZW5hbWUgPyBpbmNsdWRlX2ZpbGVuYW1lIDogIiI7Ci0gICAgICBmaWxlc19pbmNsdWRlZF9wZXJfZmlsZV9bc291cmNlX2ZpbGVuYW1lXSA9IHN0ZDo6c2V0PHN0ZDo6c3RyaW5nPigpOworICAgICAgZmlsZXNfaW5jbHVkZWRfcGVyX2ZpbGVfW3NvdXJjZV9maWxlbmFtZV0gPSBzdGQ6OnNldDxJbmNsdWRlZEZpbGU+KCk7CiAgICAgfSBlbHNlIHsKICAgICAgIHJldHVybiBOb0Vycm9yKCk7CiAgICAgfQpAQCAtMzMzMyw4ICszNDc2LDEyIEBACiAgICAgICB9CiAgICAgICBpZiAoZmlsZXBhdGguZW1wdHkoKSkKICAgICAgICAgcmV0dXJuIEVycm9yKCJ1bmFibGUgdG8gbG9jYXRlIGluY2x1ZGUgZmlsZTogIiArIG5hbWUpOwotICAgICAgaWYgKHNvdXJjZV9maWxlbmFtZSkKLSAgICAgICAgZmlsZXNfaW5jbHVkZWRfcGVyX2ZpbGVfW3NvdXJjZV9maWxlbmFtZV0uaW5zZXJ0KGZpbGVwYXRoKTsKKyAgICAgIGlmIChzb3VyY2VfZmlsZW5hbWUpIHsKKyAgICAgICAgSW5jbHVkZWRGaWxlIGluY2x1ZGVkX2ZpbGU7CisgICAgICAgIGluY2x1ZGVkX2ZpbGUuZmlsZW5hbWUgPSBmaWxlcGF0aDsKKyAgICAgICAgaW5jbHVkZWRfZmlsZS5zY2hlbWFfbmFtZSA9IG5hbWU7CisgICAgICAgIGZpbGVzX2luY2x1ZGVkX3Blcl9maWxlX1tzb3VyY2VfZmlsZW5hbWVdLmluc2VydChpbmNsdWRlZF9maWxlKTsKKyAgICAgIH0KIAogICAgICAgc3RkOjpzdHJpbmcgY29udGVudHM7CiAgICAgICBib29sIGZpbGVfbG9hZGVkID0gTG9hZEZpbGUoZmlsZXBhdGguY19zdHIoKSwgdHJ1ZSwgJmNvbnRlbnRzKTsKQEAgLTM0MjMsNiArMzU3MCw3IEBACiAgICAgICBFQ0hFQ0soUGFyc2VEZWNsKHNvdXJjZV9maWxlbmFtZSkpOwogICAgIH0KICAgfQorICBFWFBFQ1Qoa1Rva2VuRW9mKTsKICAgaWYgKG9wdHMud2FybmluZ3NfYXNfZXJyb3JzICYmIGhhc193YXJuaW5nXykgewogICAgIHJldHVybiBFcnJvcigidHJlYXRpbmcgd2FybmluZ3MgYXMgZXJyb3JzLCBmYWlsZWQgZHVlIHRvIGFib3ZlIHdhcm5pbmdzIik7CiAgIH0KQEAgLTM0NzAsMTEgKzM2MTgsMTEgQEAKIAogICAgIC8vIFdvcmthcm91bmQgdGhlIGxhY2sgb2YgY29uc3QgYWNjZXNzb3IgaW4gQysrOTggbWFwcy4KICAgICBhdXRvICZuZXdfZmlsZXMgPQotICAgICAgICAoKmNvbnN0X2Nhc3Q8c3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c2V0PHN0ZDo6c3RyaW5nPj4gKj4oCisgICAgICAgICgqY29uc3RfY2FzdDxzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzZXQ8SW5jbHVkZWRGaWxlPj4gKj4oCiAgICAgICAgICAgICAmZmlsZXNfaW5jbHVkZWRfcGVyX2ZpbGVfKSlbY3VycmVudF07CiAgICAgZm9yIChhdXRvIGl0ID0gbmV3X2ZpbGVzLmJlZ2luKCk7IGl0ICE9IG5ld19maWxlcy5lbmQoKTsgKytpdCkgewotICAgICAgaWYgKGluY2x1ZGVkX2ZpbGVzLmZpbmQoKml0KSA9PSBpbmNsdWRlZF9maWxlcy5lbmQoKSkKLSAgICAgICAgdG9fcHJvY2Vzcy5wdXNoX2JhY2soKml0KTsKKyAgICAgIGlmIChpbmNsdWRlZF9maWxlcy5maW5kKGl0LT5maWxlbmFtZSkgPT0gaW5jbHVkZWRfZmlsZXMuZW5kKCkpCisgICAgICAgIHRvX3Byb2Nlc3MucHVzaF9iYWNrKGl0LT5maWxlbmFtZSk7CiAgICAgfQogICB9CiAKQEAgLTM0ODMsMTggKzM2MzEsNiBAQAogCiAvLyBTY2hlbWEgc2VyaWFsaXphdGlvbiBmdW5jdGlvbmFsaXR5OgogCi10ZW1wbGF0ZTx0eXBlbmFtZSBUPiBib29sIGNvbXBhcmVOYW1lKGNvbnN0IFQgKmEsIGNvbnN0IFQgKmIpIHsKLSAgcmV0dXJuIGEtPmRlZmluZWRfbmFtZXNwYWNlLT5HZXRGdWxseVF1YWxpZmllZE5hbWUoYS0+bmFtZSkgPAotICAgICAgICAgYi0+ZGVmaW5lZF9uYW1lc3BhY2UtPkdldEZ1bGx5UXVhbGlmaWVkTmFtZShiLT5uYW1lKTsKLX0KLQotdGVtcGxhdGU8dHlwZW5hbWUgVD4gdm9pZCBBc3NpZ25JbmRpY2VzKGNvbnN0IHN0ZDo6dmVjdG9yPFQgKj4gJmRlZnZlYykgewotICAvLyBQcmUtc29ydCB0aGVzZSB2ZWN0b3JzLCBzdWNoIHRoYXQgd2UgY2FuIHNldCB0aGUgY29ycmVjdCBpbmRpY2VzIGZvciB0aGVtLgotICBhdXRvIHZlYyA9IGRlZnZlYzsKLSAgc3RkOjpzb3J0KHZlYy5iZWdpbigpLCB2ZWMuZW5kKCksIGNvbXBhcmVOYW1lPFQ+KTsKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBzdGF0aWNfY2FzdDxpbnQ+KHZlYy5zaXplKCkpOyBpKyspIHZlY1tpXS0+aW5kZXggPSBpOwotfQotCiB2b2lkIFBhcnNlcjo6U2VyaWFsaXplKCkgewogICBidWlsZGVyXy5DbGVhcigpOwogICBBc3NpZ25JbmRpY2VzKHN0cnVjdHNfLnZlYyk7CkBAIC0zNTM1LDcgKzM2NzEsNyBAQAogICAgICAgLy8gZnJjOTcxIG1vZGlmaWNhdGlvbiB0byBtYWtlIGZpbGUgcGF0aHMgaW4gc2NoZW1hcyBkZXRlcm1pbmlzdGljLgogICAgICAgY29uc3QgYXV0byBmaWxlbmFtZV9fID0gYnVpbGRlcl8uQ3JlYXRlU2hhcmVkU3RyaW5nKGYtPmZpcnN0KTsKICAgICAgIGZvciAoYXV0byBpID0gZi0+c2Vjb25kLmJlZ2luKCk7IGkgIT0gZi0+c2Vjb25kLmVuZCgpOyBpKyspIHsKLSAgICAgICAgaW5jbHVkZWRfZmlsZXMucHVzaF9iYWNrKGJ1aWxkZXJfLkNyZWF0ZVNoYXJlZFN0cmluZygqaSkpOworICAgICAgICBpbmNsdWRlZF9maWxlcy5wdXNoX2JhY2soYnVpbGRlcl8uQ3JlYXRlU2hhcmVkU3RyaW5nKGktPnNjaGVtYV9uYW1lKSk7CiAgICAgICB9CiAgICAgICBjb25zdCBhdXRvIGluY2x1ZGVkX2ZpbGVzX18gPSBidWlsZGVyXy5DcmVhdGVWZWN0b3IoaW5jbHVkZWRfZmlsZXMpOwogICAgICAgaW5jbHVkZWRfZmlsZXMuY2xlYXIoKTsKQEAgLTM1NjMsMzIgKzM2OTksNiBAQAogICB9CiB9CiAKLXN0YXRpYyBOYW1lc3BhY2UgKkdldE5hbWVzcGFjZSgKLSAgICBjb25zdCBzdGQ6OnN0cmluZyAmcXVhbGlmaWVkX25hbWUsIHN0ZDo6dmVjdG9yPE5hbWVzcGFjZSAqPiAmbmFtZXNwYWNlcywKLSAgICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgTmFtZXNwYWNlICo+ICZuYW1lc3BhY2VzX2luZGV4KSB7Ci0gIHNpemVfdCBkb3QgPSBxdWFsaWZpZWRfbmFtZS5maW5kX2xhc3Rfb2YoJy4nKTsKLSAgc3RkOjpzdHJpbmcgbmFtZXNwYWNlX25hbWUgPSAoZG90ICE9IHN0ZDo6c3RyaW5nOjpucG9zKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IHN0ZDo6c3RyaW5nKHF1YWxpZmllZF9uYW1lLmNfc3RyKCksIGRvdCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAiIjsKLSAgTmFtZXNwYWNlICombnMgPSBuYW1lc3BhY2VzX2luZGV4W25hbWVzcGFjZV9uYW1lXTsKLQotICBpZiAoIW5zKSB7Ci0gICAgbnMgPSBuZXcgTmFtZXNwYWNlKCk7Ci0gICAgbmFtZXNwYWNlcy5wdXNoX2JhY2sobnMpOwotCi0gICAgc2l6ZV90IHBvcyA9IDA7Ci0KLSAgICBmb3IgKDs7KSB7Ci0gICAgICBkb3QgPSBxdWFsaWZpZWRfbmFtZS5maW5kKCcuJywgcG9zKTsKLSAgICAgIGlmIChkb3QgPT0gc3RkOjpzdHJpbmc6Om5wb3MpIHsgYnJlYWs7IH0KLSAgICAgIG5zLT5jb21wb25lbnRzLnB1c2hfYmFjayhxdWFsaWZpZWRfbmFtZS5zdWJzdHIocG9zLCBkb3QgLSBwb3MpKTsKLSAgICAgIHBvcyA9IGRvdCArIDE7Ci0gICAgfQotICB9Ci0KLSAgcmV0dXJuIG5zOwotfQotCiAvLyBmcmM5NzEgbW9kaWZpY2F0aW9uIHRvIG1ha2UgZGVjbGFyYXRpb24gZmlsZXMgaW4gc2NoZW1hcyBkZXRlcm1pbmlzdGljLgogLy8gVE9ETyhqYW1lcyk6IEZpZ3VyZSBvdXQgYSBjbGVhbiB3YXkgdG8gbWFrZSB0aGlzIHdvcmtzcGFjZSByb290IHJlbGF0aXZlLgogbmFtZXNwYWNlIHsKQEAgLTM2MzYsNiArMzc0NiwxNCBAQAogICAgICAgZGVsZXRlIGZpZWxkX2RlZjsKICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CisgICAgaWYgKGZpZWxkX2RlZi0+a2V5KSB7CisgICAgICBpZiAoaGFzX2tleSkgeworICAgICAgICAvLyBvbmx5IG9uZSBmaWVsZCBtYXkgYmUgc2V0IGFzIGtleQorICAgICAgICBkZWxldGUgZmllbGRfZGVmOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9CisgICAgICBoYXNfa2V5ID0gdHJ1ZTsKKyAgICB9CiAgICAgaWYgKGZpeGVkKSB7CiAgICAgICAvLyBSZWNvbXB1dGUgcGFkZGluZyBzaW5jZSB0aGF0J3MgY3VycmVudGx5IG5vdCBzZXJpYWxpemVkLgogICAgICAgYXV0byBzaXplID0gSW5saW5lU2l6ZShmaWVsZF9kZWYtPnZhbHVlLnR5cGUpOwpAQCAtMzk5Myw3ICs0MTExLDkgQEAKICAgICAgICAgICsrcykgewogICAgICAgZm9yIChhdXRvIGYgPSBzLT5pbmNsdWRlZF9maWxlbmFtZXMoKS0+YmVnaW4oKTsKICAgICAgICAgICAgZiAhPSBzLT5pbmNsdWRlZF9maWxlbmFtZXMoKS0+ZW5kKCk7ICsrZikgewotICAgICAgICBmaWxlc19pbmNsdWRlZF9wZXJfZmlsZV9bcy0+ZmlsZW5hbWUoKS0+c3RyKCldLmluc2VydChmLT5zdHIoKSk7CisgICAgICAgIEluY2x1ZGVkRmlsZSBpbmNsdWRlZF9maWxlOworICAgICAgICBpbmNsdWRlZF9maWxlLmZpbGVuYW1lID0gZi0+c3RyKCk7CisgICAgICAgIGZpbGVzX2luY2x1ZGVkX3Blcl9maWxlX1tzLT5maWxlbmFtZSgpLT5zdHIoKV0uaW5zZXJ0KGluY2x1ZGVkX2ZpbGUpOwogICAgICAgfQogICAgIH0KIApkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvc3JjL25hbWVyLmggYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy9zcmMvbmFtZXIuaAppbmRleCA2YzUzOWNiLi44ZmQ4MzU0IDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy9zcmMvbmFtZXIuaAorKysgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy9zcmMvbmFtZXIuaApAQCAtMSw3ICsxLDYgQEAKICNpZm5kZWYgRkxBVEJVRkZFUlNfTkFNRVIKICNkZWZpbmUgRkxBVEJVRkZFUlNfTkFNRVIKIAotI2luY2x1ZGUgImZsYXRidWZmZXJzL2lkbC5oIgogI2luY2x1ZGUgImZsYXRidWZmZXJzL3V0aWwuaCIKIAogbmFtZXNwYWNlIGZsYXRidWZmZXJzIHsKQEAgLTYyLDYgKzYxLDE2IEBACiAgICAgLy8gZS5nLiBgRW51bTo6TXlWYXJpYW50YCB1c2VzIGA6OmAuCiAgICAgc3RkOjpzdHJpbmcgZW51bV92YXJpYW50X3NlcGVyYXRvcjsKIAorICAgIC8vIENvbmZpZ3VyZXMsIHdoZW4gZm9ybWF0dGluZyBjb2RlLCB3aGV0aGVyIHN5bWJvbHMgYXJlIGNoZWNrZWQgYWdhaW5zdAorICAgIC8vIGtleXdvcmRzIGFuZCBlc2NhcGVkIGJlZm9yZSBvciBhZnRlciBjYXNlIGNvbnZlcnNpb24uIEl0IGRvZXMgbm90IG1ha2UKKyAgICAvLyBzZW5zZSB0byBkbyBzbyBiZWZvcmUsIGJ1dCBpdHMgbGVnYWN5IGJlaGF2aW9yLiA6c2hydWc6CisgICAgLy8gVE9ETyhjYXNwZXJuKTogRGVwcmVjYXRlLgorICAgIGVudW0gY2xhc3MgRXNjYXBlIHsKKyAgICAgIEJlZm9yZUNvbnZlcnRpbmdDYXNlLAorICAgICAgQWZ0ZXJDb252ZXJ0aW5nQ2FzZSwKKyAgICB9OworICAgIEVzY2FwZSBlc2NhcGVfa2V5d29yZHM7CisKICAgICAvLyBOYW1lc3BhY2VzCiAKICAgICAvLyBlLmcuIGBuYW1lc3BhY2UgbXlfbmFtZXNwYWNlIHt9YApAQCAtOTUsNjQgKzEwNCw1NSBAQAogICAgIHN0ZDo6c3RyaW5nIGZpbGVuYW1lX3N1ZmZpeDsKICAgICAvLyBFeHRlbnNpb24gZm9yIGdlbmVyYXRlZCBmaWxlcywgZS5nLiAiLmNwcCIgb3IgIi5ycyIuCiAgICAgc3RkOjpzdHJpbmcgZmlsZW5hbWVfZXh0ZW5zaW9uOwotCi0gICAgLy8gVGhpcyBpcyBhIHRlbXBvcmFyeSBoZWxwZXIgZnVuY3Rpb24gZm9yIGNvZGUgZ2VuZXJhdG9ycyB0byBjYWxsIHVudGlsIGFsbAotICAgIC8vIGNvZGUgZ2VuZXJhdG9ycyBhcmUgdXNpbmcgYE5hbWVyYC4gQWZ0ZXIgdGhhdCBwb2ludCwgd2UgY2FuIGNlbnRyYWxpemUKLSAgICAvLyBmbGFnLW92ZXJyaWRpbmcgbG9naWMgaW50byBmbGF0Yy5jcHAKLSAgICBDb25maWcgV2l0aEZsYWdPcHRpb25zKGNvbnN0IElETE9wdGlvbnMgJm9wdHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyAmcGF0aCkgY29uc3QgewotICAgICAgQ29uZmlnIHJlc3VsdCA9ICp0aGlzOwotICAgICAgcmVzdWx0Lm9iamVjdF9wcmVmaXggPSBvcHRzLm9iamVjdF9wcmVmaXg7Ci0gICAgICByZXN1bHQub2JqZWN0X3N1ZmZpeCA9IG9wdHMub2JqZWN0X3N1ZmZpeDsKLSAgICAgIHJlc3VsdC5vdXRwdXRfcGF0aCA9IHBhdGg7Ci0gICAgICByZXN1bHQuZmlsZW5hbWVfc3VmZml4ID0gb3B0cy5maWxlbmFtZV9zdWZmaXg7Ci0gICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KICAgfTsKICAgTmFtZXIoQ29uZmlnIGNvbmZpZywgc3RkOjpzZXQ8c3RkOjpzdHJpbmc+IGtleXdvcmRzKQogICAgICAgOiBjb25maWdfKGNvbmZpZyksIGtleXdvcmRzXyhzdGQ6Om1vdmUoa2V5d29yZHMpKSB7fQogCi0gIHN0ZDo6c3RyaW5nIFR5cGUoY29uc3Qgc3RkOjpzdHJpbmcgJnMpIGNvbnN0IHsKLSAgICByZXR1cm4gRm9ybWF0KHMsIGNvbmZpZ18udHlwZXMpOworICB2aXJ0dWFsIH5OYW1lcigpIHt9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgVD4gc3RkOjpzdHJpbmcgTWV0aG9kKGNvbnN0IFQgJnMpIGNvbnN0IHsKKyAgICByZXR1cm4gTWV0aG9kKHMubmFtZSk7CiAgIH0KIAotICBzdGQ6OnN0cmluZyBNZXRob2QoY29uc3Qgc3RkOjpzdHJpbmcgJnMpIGNvbnN0IHsKKyAgdmlydHVhbCBzdGQ6OnN0cmluZyBNZXRob2QoY29uc3Qgc3RkOjpzdHJpbmcgJnByZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgJm1pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgJnN1ZikgY29uc3QgeworICAgIHJldHVybiBGb3JtYXQocHJlICsgIl8iICsgIG1pZCArICJfIiArIHN1ZiwgY29uZmlnXy5tZXRob2RzKTsKKyAgfQorICB2aXJ0dWFsIHN0ZDo6c3RyaW5nIE1ldGhvZChjb25zdCBzdGQ6OnN0cmluZyAmcHJlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyAmc3VmKSBjb25zdCB7CisgICAgcmV0dXJuIEZvcm1hdChwcmUgKyAiXyIgKyBzdWYsIGNvbmZpZ18ubWV0aG9kcyk7CisgIH0KKyAgdmlydHVhbCBzdGQ6OnN0cmluZyBNZXRob2QoY29uc3Qgc3RkOjpzdHJpbmcgJnMpIGNvbnN0IHsKICAgICByZXR1cm4gRm9ybWF0KHMsIGNvbmZpZ18ubWV0aG9kcyk7CiAgIH0KIAotICBzdGQ6OnN0cmluZyBDb25zdGFudChjb25zdCBzdGQ6OnN0cmluZyAmcykgY29uc3QgeworICB2aXJ0dWFsIHN0ZDo6c3RyaW5nIENvbnN0YW50KGNvbnN0IHN0ZDo6c3RyaW5nICZzKSBjb25zdCB7CiAgICAgcmV0dXJuIEZvcm1hdChzLCBjb25maWdfLmNvbnN0YW50cyk7CiAgIH0KIAotICBzdGQ6OnN0cmluZyBGdW5jdGlvbihjb25zdCBzdGQ6OnN0cmluZyAmcykgY29uc3QgeworICB2aXJ0dWFsIHN0ZDo6c3RyaW5nIEZ1bmN0aW9uKGNvbnN0IHN0ZDo6c3RyaW5nICZzKSBjb25zdCB7CiAgICAgcmV0dXJuIEZvcm1hdChzLCBjb25maWdfLmZ1bmN0aW9ucyk7CiAgIH0KIAotICBzdGQ6OnN0cmluZyBGaWVsZChjb25zdCBzdGQ6OnN0cmluZyAmcykgY29uc3QgewotICAgIHJldHVybiBGb3JtYXQocywgY29uZmlnXy5maWVsZHMpOwotICB9Ci0KLSAgc3RkOjpzdHJpbmcgVmFyaWFibGUoY29uc3Qgc3RkOjpzdHJpbmcgJnMpIGNvbnN0IHsKKyAgdmlydHVhbCBzdGQ6OnN0cmluZyBWYXJpYWJsZShjb25zdCBzdGQ6OnN0cmluZyAmcykgY29uc3QgewogICAgIHJldHVybiBGb3JtYXQocywgY29uZmlnXy52YXJpYWJsZXMpOwogICB9CiAKLSAgc3RkOjpzdHJpbmcgVmFyaWFudChjb25zdCBzdGQ6OnN0cmluZyAmcykgY29uc3QgewotICAgIHJldHVybiBGb3JtYXQocywgY29uZmlnXy52YXJpYW50cyk7CisgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgIHN0ZDo6c3RyaW5nIFZhcmlhYmxlKGNvbnN0IHN0ZDo6c3RyaW5nICZwLCBjb25zdCBUICZzKSBjb25zdCB7CisgICAgcmV0dXJuIEZvcm1hdChwICsgIl8iICsgcy5uYW1lLCBjb25maWdfLnZhcmlhYmxlcyk7CisgIH0KKyAgdmlydHVhbCBzdGQ6OnN0cmluZyBWYXJpYWJsZShjb25zdCBzdGQ6OnN0cmluZyAmcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyAmcykgY29uc3QgeworICAgIHJldHVybiBGb3JtYXQocCArICJfIiArIHMsIGNvbmZpZ18udmFyaWFibGVzKTsKICAgfQogCi0gIHN0ZDo6c3RyaW5nIEVudW1WYXJpYW50KGNvbnN0IHN0ZDo6c3RyaW5nICZlLCBjb25zdCBzdGQ6OnN0cmluZyB2KSBjb25zdCB7Ci0gICAgcmV0dXJuIFR5cGUoZSkgKyBjb25maWdfLmVudW1fdmFyaWFudF9zZXBlcmF0b3IgKyBWYXJpYW50KHYpOwotICB9Ci0KLSAgc3RkOjpzdHJpbmcgT2JqZWN0VHlwZShjb25zdCBzdGQ6OnN0cmluZyAmcykgY29uc3QgewotICAgIHJldHVybiBjb25maWdfLm9iamVjdF9wcmVmaXggKyBUeXBlKHMpICsgY29uZmlnXy5vYmplY3Rfc3VmZml4OwotICB9Ci0KLSAgc3RkOjpzdHJpbmcgTmFtZXNwYWNlKGNvbnN0IHN0ZDo6c3RyaW5nICZzKSBjb25zdCB7CisgIHZpcnR1YWwgc3RkOjpzdHJpbmcgTmFtZXNwYWNlKGNvbnN0IHN0ZDo6c3RyaW5nICZzKSBjb25zdCB7CiAgICAgcmV0dXJuIEZvcm1hdChzLCBjb25maWdfLm5hbWVzcGFjZXMpOwogICB9CiAKLSAgc3RkOjpzdHJpbmcgTmFtZXNwYWNlKGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiAmbnMpIGNvbnN0IHsKKyAgdmlydHVhbCBzdGQ6OnN0cmluZyBOYW1lc3BhY2UoY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+ICZucykgY29uc3QgewogICAgIHN0ZDo6c3RyaW5nIHJlc3VsdDsKICAgICBmb3IgKGF1dG8gaXQgPSBucy5iZWdpbigpOyBpdCAhPSBucy5lbmQoKTsgaXQrKykgewogICAgICAgaWYgKGl0ICE9IG5zLmJlZ2luKCkpIHJlc3VsdCArPSBjb25maWdfLm5hbWVzcGFjZV9zZXBlcmF0b3I7CkBAIC0xNjEsMjYgKzE2MSwzMiBAQAogICAgIHJldHVybiByZXN1bHQ7CiAgIH0KIAotICBzdGQ6OnN0cmluZyBOYW1lc3BhY2VkVHlwZShjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gJm5zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyAmcykgY29uc3QgewotICAgIHJldHVybiBOYW1lc3BhY2UobnMpICsgY29uZmlnXy5uYW1lc3BhY2Vfc2VwZXJhdG9yICsgVHlwZShzKTsKKyAgdmlydHVhbCBzdGQ6OnN0cmluZyBOYW1lc3BhY2VkVHlwZShjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gJm5zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nICZzKSBjb25zdCB7CisgICAgcmV0dXJuIChucy5lbXB0eSgpID8gIiIgOiAoTmFtZXNwYWNlKG5zKSArIGNvbmZpZ18ubmFtZXNwYWNlX3NlcGVyYXRvcikpICsKKyAgICAgICAgICAgVHlwZShzKTsKICAgfQogCiAgIC8vIFJldHVybnMgYGZpbGVuYW1lYCB3aXRoIHRoZSByaWdodCBjYXNpbmcsIHN1ZmZpeCwgYW5kIGV4dGVuc2lvbi4KLSAgc3RkOjpzdHJpbmcgRmlsZShjb25zdCBzdGQ6OnN0cmluZyAmZmlsZW5hbWUsCi0gICAgICAgICAgICAgICAgICAgU2tpcEZpbGUgc2tpcHMgPSBTa2lwRmlsZTo6Tm9uZSkgY29uc3QgeworICB2aXJ0dWFsIHN0ZDo6c3RyaW5nIEZpbGUoY29uc3Qgc3RkOjpzdHJpbmcgJmZpbGVuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgU2tpcEZpbGUgc2tpcHMgPSBTa2lwRmlsZTo6Tm9uZSkgY29uc3QgewogICAgIGNvbnN0IGJvb2wgc2tpcF9zdWZmaXggPSAoc2tpcHMgJiBTa2lwRmlsZTo6U3VmZml4KSAhPSBTa2lwRmlsZTo6Tm9uZTsKICAgICBjb25zdCBib29sIHNraXBfZXh0ID0gKHNraXBzICYgU2tpcEZpbGU6OkV4dGVuc2lvbikgIT0gU2tpcEZpbGU6Ok5vbmU7CiAgICAgcmV0dXJuIENvbnZlcnRDYXNlKGZpbGVuYW1lLCBjb25maWdfLmZpbGVuYW1lcywgQ2FzZTo6a1VwcGVyQ2FtZWwpICsKICAgICAgICAgICAgKHNraXBfc3VmZml4ID8gIiIgOiBjb25maWdfLmZpbGVuYW1lX3N1ZmZpeCkgKwogICAgICAgICAgICAoc2tpcF9leHQgPyAiIiA6IGNvbmZpZ18uZmlsZW5hbWVfZXh0ZW5zaW9uKTsKICAgfQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICBzdGQ6OnN0cmluZyBGaWxlKGNvbnN0IFQgJmYsIFNraXBGaWxlIHNraXBzID0gU2tpcEZpbGU6Ok5vbmUpIGNvbnN0IHsKKyAgICByZXR1cm4gRmlsZShmLm5hbWUsIHNraXBzKTsKKyAgfQorCiAgIC8vIEZvcm1hdHMgYGRpcmVjdG9yaWVzYCBwcmVmaXhlZCB3aXRoIHRoZSBvdXRwdXRfcGF0aCBhbmQgam9pbmVkIHdpdGggdGhlCiAgIC8vIHJpZ2h0IHNlcGVyYXRvci4gT3V0cHV0IHBhdGggcHJlZml4aW5nIGFuZCB0aGUgdHJhaWxpbmcgc2VwYXJhdG9yIG1heSBiZQogICAvLyBza2lwZWQgdXNpbmcgYHNraXBzYC4KICAgLy8gQ2FsbGVycyBtYXkgd2FudCB0byB1c2UgYEVuc3VyZURpckV4aXN0c2Agd2l0aCB0aGUgcmVzdWx0LgotICBzdGQ6OnN0cmluZyBEaXJlY3Rvcmllcyhjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gJmRpcmVjdG9yaWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICBTa2lwRGlyIHNraXBzID0gU2tpcERpcjo6Tm9uZSkgY29uc3QgeworICB2aXJ0dWFsIHN0ZDo6c3RyaW5nIERpcmVjdG9yaWVzKGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiAmZGlyZWN0b3JpZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2tpcERpciBza2lwcyA9IFNraXBEaXI6Ok5vbmUpIGNvbnN0IHsKICAgICBjb25zdCBib29sIHNraXBfb3V0cHV0X3BhdGggPQogICAgICAgICAoc2tpcHMgJiBTa2lwRGlyOjpPdXRwdXRQYXRoKSAhPSBTa2lwRGlyOjpOb25lOwogICAgIGNvbnN0IGJvb2wgc2tpcF90cmFpbGluZ19zZXBlcmF0b3IgPQpAQCAtMTk0LDcgKzIwMCw3IEBACiAgICAgcmV0dXJuIHJlc3VsdDsKICAgfQogCi0gIHN0ZDo6c3RyaW5nIEVzY2FwZUtleXdvcmQoY29uc3Qgc3RkOjpzdHJpbmcgJm5hbWUpIGNvbnN0IHsKKyAgdmlydHVhbCBzdGQ6OnN0cmluZyBFc2NhcGVLZXl3b3JkKGNvbnN0IHN0ZDo6c3RyaW5nICZuYW1lKSBjb25zdCB7CiAgICAgaWYgKGtleXdvcmRzXy5maW5kKG5hbWUpID09IGtleXdvcmRzXy5lbmQoKSkgewogICAgICAgcmV0dXJuIG5hbWU7CiAgICAgfSBlbHNlIHsKQEAgLTIwMiwxMiArMjA4LDU1IEBACiAgICAgfQogICB9CiAKLSBwcml2YXRlOgotICBzdGQ6OnN0cmluZyBGb3JtYXQoY29uc3Qgc3RkOjpzdHJpbmcgJnMsIENhc2UgY2FzaW5nKSBjb25zdCB7Ci0gICAgLy8gTk9URTogSWYgeW91IG5lZWQgdG8gZXNjYXBlIGtleXdvcmRzIGFmdGVyIGNvbnZlcnRpbmcgY2FzZSwgd2hpY2ggd291bGQKLSAgICAvLyBtYWtlIG1vcmUgc2Vuc2UgdGhhbiB0aGlzLCBtYWtlIGl0IGEgY29uZmlnIG9wdGlvbi4KLSAgICByZXR1cm4gQ29udmVydENhc2UoRXNjYXBlS2V5d29yZChzKSwgY2FzaW5nLCBDYXNlOjprTG93ZXJDYW1lbCk7CisgIHZpcnR1YWwgc3RkOjpzdHJpbmcgVHlwZShjb25zdCBzdGQ6OnN0cmluZyAmcykgY29uc3QgeworICAgIHJldHVybiBGb3JtYXQocywgY29uZmlnXy50eXBlcyk7CiAgIH0KKyAgdmlydHVhbCBzdGQ6OnN0cmluZyBUeXBlKGNvbnN0IHN0ZDo6c3RyaW5nICZ0LCBjb25zdCBzdGQ6OnN0cmluZyAmcykgY29uc3QgeworICAgIHJldHVybiBGb3JtYXQodCArICJfIiArIHMsIGNvbmZpZ18udHlwZXMpOworICB9CisKKyAgdmlydHVhbCBzdGQ6OnN0cmluZyBPYmplY3RUeXBlKGNvbnN0IHN0ZDo6c3RyaW5nICZzKSBjb25zdCB7CisgICAgcmV0dXJuIGNvbmZpZ18ub2JqZWN0X3ByZWZpeCArIFR5cGUocykgKyBjb25maWdfLm9iamVjdF9zdWZmaXg7CisgIH0KKworICB2aXJ0dWFsIHN0ZDo6c3RyaW5nIEZpZWxkKGNvbnN0IHN0ZDo6c3RyaW5nICZzKSBjb25zdCB7CisgICAgcmV0dXJuIEZvcm1hdChzLCBjb25maWdfLmZpZWxkcyk7CisgIH0KKworICB2aXJ0dWFsIHN0ZDo6c3RyaW5nIFZhcmlhbnQoY29uc3Qgc3RkOjpzdHJpbmcgJnMpIGNvbnN0IHsKKyAgICByZXR1cm4gRm9ybWF0KHMsIGNvbmZpZ18udmFyaWFudHMpOworICB9CisKKyAgdmlydHVhbCBzdGQ6OnN0cmluZyBGb3JtYXQoY29uc3Qgc3RkOjpzdHJpbmcgJnMsIENhc2UgY2FzaW5nKSBjb25zdCB7CisgICAgaWYgKGNvbmZpZ18uZXNjYXBlX2tleXdvcmRzID09IENvbmZpZzo6RXNjYXBlOjpCZWZvcmVDb252ZXJ0aW5nQ2FzZSkgeworICAgICAgcmV0dXJuIENvbnZlcnRDYXNlKEVzY2FwZUtleXdvcmQocyksIGNhc2luZywgQ2FzZTo6a0xvd2VyQ2FtZWwpOworICAgIH0gZWxzZSB7CisgICAgICByZXR1cm4gRXNjYXBlS2V5d29yZChDb252ZXJ0Q2FzZShzLCBjYXNpbmcsIENhc2U6OmtMb3dlckNhbWVsKSk7CisgICAgfQorICB9CisKKyAgLy8gRGVuYW1lc3BhY2VzIGEgc3RyaW5nIChlLmcuIFRoZS5RdWljay5Ccm93bi5Gb3gpIGJ5IHJldHVybmluZyB0aGUgbGFzdCBwYXJ0CisgIC8vIGFmdGVyIHRoZSBgZGVsaW1pdGVyYCAoRm94KSBhbmQgcGxhY2luZyB0aGUgcmVzdCBpbiBgbmFtZXNwYWNlX3ByZWZpeGAKKyAgLy8gKFRoZS5RdWljay5Ccm93bikuCisgIHZpcnR1YWwgc3RkOjpzdHJpbmcgRGVuYW1lc3BhY2UoY29uc3Qgc3RkOjpzdHJpbmcgJnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgJm5hbWVzcGFjZV9wcmVmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciBkZWxpbWl0ZXIgPSAnLicpIGNvbnN0IHsKKyAgICBjb25zdCBzaXplX3QgcG9zID0gcy5maW5kX2xhc3Rfb2YoZGVsaW1pdGVyKTsKKyAgICBpZiAocG9zID09IHN0ZDo6c3RyaW5nOjpucG9zKSB7CisgICAgICBuYW1lc3BhY2VfcHJlZml4ID0gIiI7CisgICAgICByZXR1cm4gczsKKyAgICB9CisgICAgbmFtZXNwYWNlX3ByZWZpeCA9IHMuc3Vic3RyKDAsIHBvcyk7CisgICAgcmV0dXJuIHMuc3Vic3RyKHBvcyArIDEpOworICB9CisKKyAgLy8gU2FtZSBhcyBhYm92ZSwgYnV0IGRpc3JlZ2FyZHMgdGhlIHByZWZpeC4KKyAgdmlydHVhbCBzdGQ6OnN0cmluZyBEZW5hbWVzcGFjZShjb25zdCBzdGQ6OnN0cmluZyAmcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyIGRlbGltaXRlciA9ICcuJykgY29uc3QgeworICAgIHN0ZDo6c3RyaW5nIHByZWZpeDsKKyAgICByZXR1cm4gRGVuYW1lc3BhY2UocywgcHJlZml4LCBkZWxpbWl0ZXIpOworICB9CisKICAgY29uc3QgQ29uZmlnIGNvbmZpZ187CiAgIGNvbnN0IHN0ZDo6c2V0PHN0ZDo6c3RyaW5nPiBrZXl3b3Jkc187CiB9OwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvc3JjL3JlZmxlY3Rpb24uY3BwIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvc3JjL3JlZmxlY3Rpb24uY3BwCmluZGV4IDJkOTIyMjkuLjc1NDk4NTkgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3NyYy9yZWZsZWN0aW9uLmNwcAorKysgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy9zcmMvcmVmbGVjdGlvbi5jcHAKQEAgLTIyLDYgKzIyLDIzOCBAQAogCiBuYW1lc3BhY2UgZmxhdGJ1ZmZlcnMgewogCituYW1lc3BhY2UgeworCitzdGF0aWMgdm9pZCBDb3B5SW5saW5lKEZsYXRCdWZmZXJCdWlsZGVyICZmYmIsIGNvbnN0IHJlZmxlY3Rpb246OkZpZWxkICZmaWVsZGRlZiwKKyAgICAgICAgICAgICAgICBjb25zdCBUYWJsZSAmdGFibGUsIHNpemVfdCBhbGlnbiwgc2l6ZV90IHNpemUpIHsKKyAgZmJiLkFsaWduKGFsaWduKTsKKyAgZmJiLlB1c2hCeXRlcyh0YWJsZS5HZXRTdHJ1Y3Q8Y29uc3QgdWludDhfdCAqPihmaWVsZGRlZi5vZmZzZXQoKSksIHNpemUpOworICBmYmIuVHJhY2tGaWVsZChmaWVsZGRlZi5vZmZzZXQoKSwgZmJiLkdldFNpemUoKSk7Cit9CisKK3N0YXRpYyBib29sIFZlcmlmeVN0cnVjdChmbGF0YnVmZmVyczo6VmVyaWZpZXIgJnYsCisgICAgICAgICAgICAgICAgICBjb25zdCBmbGF0YnVmZmVyczo6VGFibGUgJnBhcmVudF90YWJsZSwKKyAgICAgICAgICAgICAgICAgIHZvZmZzZXRfdCBmaWVsZF9vZmZzZXQsIGNvbnN0IHJlZmxlY3Rpb246Ok9iamVjdCAmb2JqLAorICAgICAgICAgICAgICAgICAgYm9vbCByZXF1aXJlZCkgeworICBhdXRvIG9mZnNldCA9IHBhcmVudF90YWJsZS5HZXRPcHRpb25hbEZpZWxkT2Zmc2V0KGZpZWxkX29mZnNldCk7CisgIGlmIChyZXF1aXJlZCAmJiAhb2Zmc2V0KSB7IHJldHVybiBmYWxzZTsgfQorCisgIHJldHVybiAhb2Zmc2V0IHx8CisgICAgICAgICB2LlZlcmlmeUZpZWxkU3RydWN0KHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCAqPigmcGFyZW50X3RhYmxlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0LCBvYmouYnl0ZXNpemUoKSwgb2JqLm1pbmFsaWduKCkpOworfQorCitzdGF0aWMgYm9vbCBWZXJpZnlWZWN0b3JPZlN0cnVjdHMoZmxhdGJ1ZmZlcnM6OlZlcmlmaWVyICZ2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxhdGJ1ZmZlcnM6OlRhYmxlICZwYXJlbnRfdGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2Zmc2V0X3QgZmllbGRfb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVmbGVjdGlvbjo6T2JqZWN0ICZvYmosIGJvb2wgcmVxdWlyZWQpIHsKKyAgYXV0byBwID0gcGFyZW50X3RhYmxlLkdldFBvaW50ZXI8Y29uc3QgdWludDhfdCAqPihmaWVsZF9vZmZzZXQpOworICBpZiAocmVxdWlyZWQgJiYgIXApIHsgcmV0dXJuIGZhbHNlOyB9CisKKyAgcmV0dXJuICFwIHx8IHYuVmVyaWZ5VmVjdG9yT3JTdHJpbmcocCwgb2JqLmJ5dGVzaXplKCkpOworfQorCisvLyBmb3J3YXJkIGRlY2xhcmUgdG8gcmVzb2x2ZSBjeWNsaWMgZGVwcyBiZXR3ZWVuIFZlcmlmeU9iamVjdCBhbmQgVmVyaWZ5VmVjdG9yCitzdGF0aWMgYm9vbCBWZXJpZnlPYmplY3QoZmxhdGJ1ZmZlcnM6OlZlcmlmaWVyICZ2LCBjb25zdCByZWZsZWN0aW9uOjpTY2hlbWEgJnNjaGVtYSwKKyAgICAgICAgICAgICAgICAgIGNvbnN0IHJlZmxlY3Rpb246Ok9iamVjdCAmb2JqLAorICAgICAgICAgICAgICAgICAgY29uc3QgZmxhdGJ1ZmZlcnM6OlRhYmxlICp0YWJsZSwgYm9vbCByZXF1aXJlZCk7CisKK3N0YXRpYyBib29sIFZlcmlmeVVuaW9uKGZsYXRidWZmZXJzOjpWZXJpZmllciAmdiwgY29uc3QgcmVmbGVjdGlvbjo6U2NoZW1hICZzY2hlbWEsCisgICAgICAgICAgICAgICAgIHVpbnQ4X3QgdXR5cGUsIGNvbnN0IHVpbnQ4X3QgKmVsZW0sCisgICAgICAgICAgICAgICAgIGNvbnN0IHJlZmxlY3Rpb246OkZpZWxkICZ1bmlvbl9maWVsZCkgeworICBpZiAoIXV0eXBlKSByZXR1cm4gdHJ1ZTsgIC8vIE5vdCBwcmVzZW50LgorICBhdXRvIGZiX2VudW0gPSBzY2hlbWEuZW51bXMoKS0+R2V0KHVuaW9uX2ZpZWxkLnR5cGUoKS0+aW5kZXgoKSk7CisgIGlmICh1dHlwZSA+PSBmYl9lbnVtLT52YWx1ZXMoKS0+c2l6ZSgpKSByZXR1cm4gZmFsc2U7CisgIGF1dG8gZWxlbV90eXBlID0gZmJfZW51bS0+dmFsdWVzKCktPkdldCh1dHlwZSktPnVuaW9uX3R5cGUoKTsKKyAgc3dpdGNoIChlbGVtX3R5cGUtPmJhc2VfdHlwZSgpKSB7CisgICAgY2FzZSByZWZsZWN0aW9uOjpCYXNlVHlwZTo6T2JqOiB7CisgICAgICBhdXRvIGVsZW1fb2JqID0gc2NoZW1hLm9iamVjdHMoKS0+R2V0KGVsZW1fdHlwZS0+aW5kZXgoKSk7CisgICAgICBpZiAoZWxlbV9vYmotPmlzX3N0cnVjdCgpKSB7CisgICAgICAgIHJldHVybiB2LlZlcmlmeUZyb21Qb2ludGVyKGVsZW0sIGVsZW1fb2JqLT5ieXRlc2l6ZSgpKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBWZXJpZnlPYmplY3Qodiwgc2NoZW1hLCAqZWxlbV9vYmosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBmbGF0YnVmZmVyczo6VGFibGUgKj4oZWxlbSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSk7CisgICAgICB9CisgICAgfQorICAgIGNhc2UgcmVmbGVjdGlvbjo6QmFzZVR5cGU6OlN0cmluZzoKKyAgICAgIHJldHVybiB2LlZlcmlmeVN0cmluZygKKyAgICAgICAgICByZWludGVycHJldF9jYXN0PGNvbnN0IGZsYXRidWZmZXJzOjpTdHJpbmcgKj4oZWxlbSkpOworICAgIGRlZmF1bHQ6IHJldHVybiBmYWxzZTsKKyAgfQorfQorCitzdGF0aWMgYm9vbCBWZXJpZnlWZWN0b3IoZmxhdGJ1ZmZlcnM6OlZlcmlmaWVyICZ2LCBjb25zdCByZWZsZWN0aW9uOjpTY2hlbWEgJnNjaGVtYSwKKyAgICAgICAgICAgICAgICAgIGNvbnN0IGZsYXRidWZmZXJzOjpUYWJsZSAmdGFibGUsCisgICAgICAgICAgICAgICAgICBjb25zdCByZWZsZWN0aW9uOjpGaWVsZCAmdmVjX2ZpZWxkKSB7CisgIEZMQVRCVUZGRVJTX0FTU0VSVCh2ZWNfZmllbGQudHlwZSgpLT5iYXNlX3R5cGUoKSA9PSByZWZsZWN0aW9uOjpCYXNlVHlwZTo6VmVjdG9yKTsKKyAgaWYgKCF0YWJsZS5WZXJpZnlGaWVsZDx1b2Zmc2V0X3Q+KHYsIHZlY19maWVsZC5vZmZzZXQoKSwgc2l6ZW9mKHVvZmZzZXRfdCkpKQorICAgIHJldHVybiBmYWxzZTsKKworICBzd2l0Y2ggKHZlY19maWVsZC50eXBlKCktPmVsZW1lbnQoKSkgeworICAgIGNhc2UgcmVmbGVjdGlvbjo6QmFzZVR5cGU6OlVUeXBlOgorICAgICAgcmV0dXJuIHYuVmVyaWZ5VmVjdG9yKGZsYXRidWZmZXJzOjpHZXRGaWVsZFY8dWludDhfdD4odGFibGUsIHZlY19maWVsZCkpOworICAgIGNhc2UgcmVmbGVjdGlvbjo6QmFzZVR5cGU6OkJvb2w6CisgICAgY2FzZSByZWZsZWN0aW9uOjpCYXNlVHlwZTo6Qnl0ZToKKyAgICBjYXNlIHJlZmxlY3Rpb246OkJhc2VUeXBlOjpVQnl0ZToKKyAgICAgIHJldHVybiB2LlZlcmlmeVZlY3RvcihmbGF0YnVmZmVyczo6R2V0RmllbGRWPGludDhfdD4odGFibGUsIHZlY19maWVsZCkpOworICAgIGNhc2UgcmVmbGVjdGlvbjo6QmFzZVR5cGU6OlNob3J0OgorICAgIGNhc2UgcmVmbGVjdGlvbjo6QmFzZVR5cGU6OlVTaG9ydDoKKyAgICAgIHJldHVybiB2LlZlcmlmeVZlY3RvcihmbGF0YnVmZmVyczo6R2V0RmllbGRWPGludDE2X3Q+KHRhYmxlLCB2ZWNfZmllbGQpKTsKKyAgICBjYXNlIHJlZmxlY3Rpb246OkJhc2VUeXBlOjpJbnQ6CisgICAgY2FzZSByZWZsZWN0aW9uOjpCYXNlVHlwZTo6VUludDoKKyAgICAgIHJldHVybiB2LlZlcmlmeVZlY3RvcihmbGF0YnVmZmVyczo6R2V0RmllbGRWPGludDMyX3Q+KHRhYmxlLCB2ZWNfZmllbGQpKTsKKyAgICBjYXNlIHJlZmxlY3Rpb246OkJhc2VUeXBlOjpMb25nOgorICAgIGNhc2UgcmVmbGVjdGlvbjo6QmFzZVR5cGU6OlVMb25nOgorICAgICAgcmV0dXJuIHYuVmVyaWZ5VmVjdG9yKGZsYXRidWZmZXJzOjpHZXRGaWVsZFY8aW50NjRfdD4odGFibGUsIHZlY19maWVsZCkpOworICAgIGNhc2UgcmVmbGVjdGlvbjo6QmFzZVR5cGU6OkZsb2F0OgorICAgICAgcmV0dXJuIHYuVmVyaWZ5VmVjdG9yKGZsYXRidWZmZXJzOjpHZXRGaWVsZFY8ZmxvYXQ+KHRhYmxlLCB2ZWNfZmllbGQpKTsKKyAgICBjYXNlIHJlZmxlY3Rpb246OkJhc2VUeXBlOjpEb3VibGU6CisgICAgICByZXR1cm4gdi5WZXJpZnlWZWN0b3IoZmxhdGJ1ZmZlcnM6OkdldEZpZWxkVjxkb3VibGU+KHRhYmxlLCB2ZWNfZmllbGQpKTsKKyAgICBjYXNlIHJlZmxlY3Rpb246OkJhc2VUeXBlOjpTdHJpbmc6IHsKKyAgICAgIGF1dG8gdmVjX3N0cmluZyA9CisgICAgICAgICAgZmxhdGJ1ZmZlcnM6OkdldEZpZWxkVjxmbGF0YnVmZmVyczo6T2Zmc2V0PGZsYXRidWZmZXJzOjpTdHJpbmc+PigKKyAgICAgICAgICAgICAgdGFibGUsIHZlY19maWVsZCk7CisgICAgICBpZiAodi5WZXJpZnlWZWN0b3IodmVjX3N0cmluZykgJiYgdi5WZXJpZnlWZWN0b3JPZlN0cmluZ3ModmVjX3N0cmluZykpIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9CisgICAgfQorICAgIGNhc2UgcmVmbGVjdGlvbjo6QmFzZVR5cGU6Ok9iajogeworICAgICAgYXV0byBvYmogPSBzY2hlbWEub2JqZWN0cygpLT5HZXQodmVjX2ZpZWxkLnR5cGUoKS0+aW5kZXgoKSk7CisgICAgICBpZiAob2JqLT5pc19zdHJ1Y3QoKSkgeworICAgICAgICByZXR1cm4gVmVyaWZ5VmVjdG9yT2ZTdHJ1Y3RzKHYsIHRhYmxlLCB2ZWNfZmllbGQub2Zmc2V0KCksICpvYmosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjX2ZpZWxkLnJlcXVpcmVkKCkpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgYXV0byB2ZWMgPQorICAgICAgICAgICAgZmxhdGJ1ZmZlcnM6OkdldEZpZWxkVjxmbGF0YnVmZmVyczo6T2Zmc2V0PGZsYXRidWZmZXJzOjpUYWJsZT4+KAorICAgICAgICAgICAgICAgIHRhYmxlLCB2ZWNfZmllbGQpOworICAgICAgICBpZiAoIXYuVmVyaWZ5VmVjdG9yKHZlYykpIHJldHVybiBmYWxzZTsKKyAgICAgICAgaWYgKCF2ZWMpIHJldHVybiB0cnVlOworICAgICAgICBmb3IgKHVvZmZzZXRfdCBqID0gMDsgaiA8IHZlYy0+c2l6ZSgpOyBqKyspIHsKKyAgICAgICAgICBpZiAoIVZlcmlmeU9iamVjdCh2LCBzY2hlbWEsICpvYmosIHZlYy0+R2V0KGopLCB0cnVlKSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgIH0KKyAgICB9CisgICAgY2FzZSByZWZsZWN0aW9uOjpCYXNlVHlwZTo6VW5pb246IHsKKyAgICAgIGF1dG8gdmVjID0gZmxhdGJ1ZmZlcnM6OkdldEZpZWxkVjxmbGF0YnVmZmVyczo6T2Zmc2V0PHVpbnQ4X3Q+PigKKyAgICAgICAgICB0YWJsZSwgdmVjX2ZpZWxkKTsKKyAgICAgIGlmICghdi5WZXJpZnlWZWN0b3IodmVjKSkgcmV0dXJuIGZhbHNlOworICAgICAgaWYgKCF2ZWMpIHJldHVybiB0cnVlOworICAgICAgYXV0byB0eXBlX3ZlYyA9IHRhYmxlLkdldFBvaW50ZXI8VmVjdG9yPHVpbnQ4X3Q+ICo+KHZlY19maWVsZC5vZmZzZXQoKSAtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHZvZmZzZXRfdCkpOworICAgICAgaWYgKCF2LlZlcmlmeVZlY3Rvcih0eXBlX3ZlYykpIHJldHVybiBmYWxzZTsKKyAgICAgIGZvciAodW9mZnNldF90IGogPSAwOyBqIDwgdmVjLT5zaXplKCk7IGorKykgeworICAgICAgICAvLyAgZ2V0IHVuaW9uIHR5cGUgZnJvbSB0aGUgcHJldiBmaWVsZAorICAgICAgICBhdXRvIHV0eXBlID0gdHlwZV92ZWMtPkdldChqKTsKKyAgICAgICAgYXV0byBlbGVtID0gdmVjLT5HZXQoaik7CisgICAgICAgIGlmICghVmVyaWZ5VW5pb24odiwgc2NoZW1hLCB1dHlwZSwgZWxlbSwgdmVjX2ZpZWxkKSkgcmV0dXJuIGZhbHNlOworICAgICAgfQorICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIGNhc2UgcmVmbGVjdGlvbjo6QmFzZVR5cGU6OlZlY3RvcjoKKyAgICBjYXNlIHJlZmxlY3Rpb246OkJhc2VUeXBlOjpOb25lOgorICAgIGRlZmF1bHQ6IEZMQVRCVUZGRVJTX0FTU0VSVChmYWxzZSk7IHJldHVybiBmYWxzZTsKKyAgfQorfQorCitzdGF0aWMgYm9vbCBWZXJpZnlPYmplY3QoZmxhdGJ1ZmZlcnM6OlZlcmlmaWVyICZ2LCBjb25zdCByZWZsZWN0aW9uOjpTY2hlbWEgJnNjaGVtYSwKKyAgICAgICAgICAgICAgICAgIGNvbnN0IHJlZmxlY3Rpb246Ok9iamVjdCAmb2JqLAorICAgICAgICAgICAgICAgICAgY29uc3QgZmxhdGJ1ZmZlcnM6OlRhYmxlICp0YWJsZSwgYm9vbCByZXF1aXJlZCkgeworICBpZiAoIXRhYmxlKSByZXR1cm4gIXJlcXVpcmVkOworICBpZiAoIXRhYmxlLT5WZXJpZnlUYWJsZVN0YXJ0KHYpKSByZXR1cm4gZmFsc2U7CisgIGZvciAodW9mZnNldF90IGkgPSAwOyBpIDwgb2JqLmZpZWxkcygpLT5zaXplKCk7IGkrKykgeworICAgIGF1dG8gZmllbGRfZGVmID0gb2JqLmZpZWxkcygpLT5HZXQoaSk7CisgICAgc3dpdGNoIChmaWVsZF9kZWYtPnR5cGUoKS0+YmFzZV90eXBlKCkpIHsKKyAgICAgIGNhc2UgcmVmbGVjdGlvbjo6QmFzZVR5cGU6Ok5vbmU6IEZMQVRCVUZGRVJTX0FTU0VSVChmYWxzZSk7IGJyZWFrOworICAgICAgY2FzZSByZWZsZWN0aW9uOjpCYXNlVHlwZTo6VVR5cGU6CisgICAgICAgIGlmICghdGFibGUtPlZlcmlmeUZpZWxkPHVpbnQ4X3Q+KHYsIGZpZWxkX2RlZi0+b2Zmc2V0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZih1aW50OF90KSkpCisgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgcmVmbGVjdGlvbjo6QmFzZVR5cGU6OkJvb2w6CisgICAgICBjYXNlIHJlZmxlY3Rpb246OkJhc2VUeXBlOjpCeXRlOgorICAgICAgY2FzZSByZWZsZWN0aW9uOjpCYXNlVHlwZTo6VUJ5dGU6CisgICAgICAgIGlmICghdGFibGUtPlZlcmlmeUZpZWxkPGludDhfdD4odiwgZmllbGRfZGVmLT5vZmZzZXQoKSwgc2l6ZW9mKGludDhfdCkpKQorICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHJlZmxlY3Rpb246OkJhc2VUeXBlOjpTaG9ydDoKKyAgICAgIGNhc2UgcmVmbGVjdGlvbjo6QmFzZVR5cGU6OlVTaG9ydDoKKyAgICAgICAgaWYgKCF0YWJsZS0+VmVyaWZ5RmllbGQ8aW50MTZfdD4odiwgZmllbGRfZGVmLT5vZmZzZXQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGludDE2X3QpKSkKKyAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSByZWZsZWN0aW9uOjpCYXNlVHlwZTo6SW50OgorICAgICAgY2FzZSByZWZsZWN0aW9uOjpCYXNlVHlwZTo6VUludDoKKyAgICAgICAgaWYgKCF0YWJsZS0+VmVyaWZ5RmllbGQ8aW50MzJfdD4odiwgZmllbGRfZGVmLT5vZmZzZXQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGludDMyX3QpKSkKKyAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSByZWZsZWN0aW9uOjpCYXNlVHlwZTo6TG9uZzoKKyAgICAgIGNhc2UgcmVmbGVjdGlvbjo6QmFzZVR5cGU6OlVMb25nOgorICAgICAgICBpZiAoIXRhYmxlLT5WZXJpZnlGaWVsZDxpbnQ2NF90Pih2LCBmaWVsZF9kZWYtPm9mZnNldCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoaW50NjRfdCkpKQorICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHJlZmxlY3Rpb246OkJhc2VUeXBlOjpGbG9hdDoKKyAgICAgICAgaWYgKCF0YWJsZS0+VmVyaWZ5RmllbGQ8ZmxvYXQ+KHYsIGZpZWxkX2RlZi0+b2Zmc2V0KCksIHNpemVvZihmbG9hdCkpKQorICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHJlZmxlY3Rpb246OkJhc2VUeXBlOjpEb3VibGU6CisgICAgICAgIGlmICghdGFibGUtPlZlcmlmeUZpZWxkPGRvdWJsZT4odiwgZmllbGRfZGVmLT5vZmZzZXQoKSwgc2l6ZW9mKGRvdWJsZSkpKQorICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHJlZmxlY3Rpb246OkJhc2VUeXBlOjpTdHJpbmc6CisgICAgICAgIGlmICghdGFibGUtPlZlcmlmeUZpZWxkPHVvZmZzZXRfdD4odiwgZmllbGRfZGVmLT5vZmZzZXQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YodW9mZnNldF90KSkgfHwKKyAgICAgICAgICAgICF2LlZlcmlmeVN0cmluZyhmbGF0YnVmZmVyczo6R2V0RmllbGRTKCp0YWJsZSwgKmZpZWxkX2RlZikpKSB7CisgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSByZWZsZWN0aW9uOjpCYXNlVHlwZTo6VmVjdG9yOgorICAgICAgICBpZiAoIVZlcmlmeVZlY3Rvcih2LCBzY2hlbWEsICp0YWJsZSwgKmZpZWxkX2RlZikpIHJldHVybiBmYWxzZTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHJlZmxlY3Rpb246OkJhc2VUeXBlOjpPYmo6IHsKKyAgICAgICAgYXV0byBjaGlsZF9vYmogPSBzY2hlbWEub2JqZWN0cygpLT5HZXQoZmllbGRfZGVmLT50eXBlKCktPmluZGV4KCkpOworICAgICAgICBpZiAoY2hpbGRfb2JqLT5pc19zdHJ1Y3QoKSkgeworICAgICAgICAgIGlmICghVmVyaWZ5U3RydWN0KHYsICp0YWJsZSwgZmllbGRfZGVmLT5vZmZzZXQoKSwgKmNoaWxkX29iaiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZF9kZWYtPnJlcXVpcmVkKCkpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGlmICghVmVyaWZ5T2JqZWN0KHYsIHNjaGVtYSwgKmNoaWxkX29iaiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGF0YnVmZmVyczo6R2V0RmllbGRUKCp0YWJsZSwgKmZpZWxkX2RlZiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRfZGVmLT5yZXF1aXJlZCgpKSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGNhc2UgcmVmbGVjdGlvbjo6QmFzZVR5cGU6OlVuaW9uOiB7CisgICAgICAgIC8vICBnZXQgdW5pb24gdHlwZSBmcm9tIHRoZSBwcmV2IGZpZWxkCisgICAgICAgIHZvZmZzZXRfdCB1dHlwZV9vZmZzZXQgPSBmaWVsZF9kZWYtPm9mZnNldCgpIC0gc2l6ZW9mKHZvZmZzZXRfdCk7CisgICAgICAgIGF1dG8gdXR5cGUgPSB0YWJsZS0+R2V0RmllbGQ8dWludDhfdD4odXR5cGVfb2Zmc2V0LCAwKTsKKyAgICAgICAgYXV0byB1dmFsID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90ICo+KAorICAgICAgICAgICAgZmxhdGJ1ZmZlcnM6OkdldEZpZWxkVCgqdGFibGUsICpmaWVsZF9kZWYpKTsKKyAgICAgICAgaWYgKCFWZXJpZnlVbmlvbih2LCBzY2hlbWEsIHV0eXBlLCB1dmFsLCAqZmllbGRfZGVmKSkgeyByZXR1cm4gZmFsc2U7IH0KKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBkZWZhdWx0OiBGTEFUQlVGRkVSU19BU1NFUlQoZmFsc2UpOyBicmVhazsKKyAgICB9CisgIH0KKworICBpZiAoIXYuRW5kVGFibGUoKSkgcmV0dXJuIGZhbHNlOworCisgIHJldHVybiB0cnVlOworfQorCisKK30gLy8gbmFtZXNwYWNlCisKIGludDY0X3QgR2V0QW55VmFsdWVJKHJlZmxlY3Rpb246OkJhc2VUeXBlIHR5cGUsIGNvbnN0IHVpbnQ4X3QgKmRhdGEpIHsKICAgLy8gY2xhbmctZm9ybWF0IG9mZgogICAjZGVmaW5lIEZMQVRCVUZGRVJTX0dFVChUKSBzdGF0aWNfY2FzdDxpbnQ2NF90PihSZWFkU2NhbGFyPFQ+KGRhdGEpKQpAQCAtMTIwLDYgKzM1MiwyMyBAQAogICB9CiB9CiAKK3ZvaWQgRm9yQWxsRmllbGRzKGNvbnN0IHJlZmxlY3Rpb246Ok9iamVjdCAqb2JqZWN0LCBib29sIHJldmVyc2UsCisgICAgICAgICAgICAgICAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQoY29uc3QgcmVmbGVjdGlvbjo6RmllbGQgKik+IGZ1bmMpIHsKKyAgc3RkOjp2ZWN0b3I8dWludDMyX3Q+IGZpZWxkX3RvX2lkX21hcDsKKyAgZmllbGRfdG9faWRfbWFwLnJlc2l6ZShvYmplY3QtPmZpZWxkcygpLT5zaXplKCkpOworCisgIC8vIENyZWF0ZSB0aGUgbWFwcGluZyBvZiBmaWVsZCBJRCB0byB0aGUgaW5kZXggaW50byB0aGUgdmVjdG9yLgorICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgb2JqZWN0LT5maWVsZHMoKS0+c2l6ZSgpOyArK2kpIHsKKyAgICBhdXRvIGZpZWxkID0gb2JqZWN0LT5maWVsZHMoKS0+R2V0KGkpOworICAgIGZpZWxkX3RvX2lkX21hcFtmaWVsZC0+aWQoKV0gPSBpOworICB9CisKKyAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBmaWVsZF90b19pZF9tYXAuc2l6ZSgpOyArK2kpIHsKKyAgICBmdW5jKG9iamVjdC0+ZmllbGRzKCktPkdldCgKKyAgICAgICAgZmllbGRfdG9faWRfbWFwW3JldmVyc2UgPyBmaWVsZF90b19pZF9tYXAuc2l6ZSgpIC0gaSArIDEgOiBpXSkpOworICB9Cit9CisKIHZvaWQgU2V0QW55VmFsdWVJKHJlZmxlY3Rpb246OkJhc2VUeXBlIHR5cGUsIHVpbnQ4X3QgKmRhdGEsIGludDY0X3QgdmFsKSB7CiAgIC8vIGNsYW5nLWZvcm1hdCBvZmYKICAgI2RlZmluZSBGTEFUQlVGRkVSU19TRVQoVCkgV3JpdGVTY2FsYXIoZGF0YSwgc3RhdGljX2Nhc3Q8VD4odmFsKSkKQEAgLTM2NywxMiArNjE2LDggQEAKICAgcmV0dXJuIGZsYXRidWYuZGF0YSgpICsgaW5zZXJ0aW9uX3BvaW50ICsgcm9vdF9vZmZzZXQ7CiB9CiAKLXZvaWQgQ29weUlubGluZShGbGF0QnVmZmVyQnVpbGRlciAmZmJiLCBjb25zdCByZWZsZWN0aW9uOjpGaWVsZCAmZmllbGRkZWYsCi0gICAgICAgICAgICAgICAgY29uc3QgVGFibGUgJnRhYmxlLCBzaXplX3QgYWxpZ24sIHNpemVfdCBzaXplKSB7Ci0gIGZiYi5BbGlnbihhbGlnbik7Ci0gIGZiYi5QdXNoQnl0ZXModGFibGUuR2V0U3RydWN0PGNvbnN0IHVpbnQ4X3QgKj4oZmllbGRkZWYub2Zmc2V0KCkpLCBzaXplKTsKLSAgZmJiLlRyYWNrRmllbGQoZmllbGRkZWYub2Zmc2V0KCksIGZiYi5HZXRTaXplKCkpOwotfQorCisKIAogT2Zmc2V0PGNvbnN0IFRhYmxlICo+IENvcHlUYWJsZShGbGF0QnVmZmVyQnVpbGRlciAmZmJiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZWZsZWN0aW9uOjpTY2hlbWEgJnNjaGVtYSwKQEAgLTQ5OCwyMzEgKzc0MywyMiBAQAogICB9CiB9CiAKLWJvb2wgVmVyaWZ5U3RydWN0KGZsYXRidWZmZXJzOjpWZXJpZmllciAmdiwKLSAgICAgICAgICAgICAgICAgIGNvbnN0IGZsYXRidWZmZXJzOjpUYWJsZSAmcGFyZW50X3RhYmxlLAotICAgICAgICAgICAgICAgICAgdm9mZnNldF90IGZpZWxkX29mZnNldCwgY29uc3QgcmVmbGVjdGlvbjo6T2JqZWN0ICZvYmosCi0gICAgICAgICAgICAgICAgICBib29sIHJlcXVpcmVkKSB7Ci0gIGF1dG8gb2Zmc2V0ID0gcGFyZW50X3RhYmxlLkdldE9wdGlvbmFsRmllbGRPZmZzZXQoZmllbGRfb2Zmc2V0KTsKLSAgaWYgKHJlcXVpcmVkICYmICFvZmZzZXQpIHsgcmV0dXJuIGZhbHNlOyB9Ci0KLSAgcmV0dXJuICFvZmZzZXQgfHwKLSAgICAgICAgIHYuVmVyaWZ5RmllbGRTdHJ1Y3QocmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90ICo+KCZwYXJlbnRfdGFibGUpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQsIG9iai5ieXRlc2l6ZSgpLCBvYmoubWluYWxpZ24oKSk7Ci19Ci0KLWJvb2wgVmVyaWZ5VmVjdG9yT2ZTdHJ1Y3RzKGZsYXRidWZmZXJzOjpWZXJpZmllciAmdiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsYXRidWZmZXJzOjpUYWJsZSAmcGFyZW50X3RhYmxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9mZnNldF90IGZpZWxkX29mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlZmxlY3Rpb246Ok9iamVjdCAmb2JqLCBib29sIHJlcXVpcmVkKSB7Ci0gIGF1dG8gcCA9IHBhcmVudF90YWJsZS5HZXRQb2ludGVyPGNvbnN0IHVpbnQ4X3QgKj4oZmllbGRfb2Zmc2V0KTsKLSAgaWYgKHJlcXVpcmVkICYmICFwKSB7IHJldHVybiBmYWxzZTsgfQotCi0gIHJldHVybiAhcCB8fCB2LlZlcmlmeVZlY3Rvck9yU3RyaW5nKHAsIG9iai5ieXRlc2l6ZSgpKTsKLX0KLQotLy8gZm9yd2FyZCBkZWNsYXJlIHRvIHJlc29sdmUgY3ljbGljIGRlcHMgYmV0d2VlbiBWZXJpZnlPYmplY3QgYW5kIFZlcmlmeVZlY3RvcgotYm9vbCBWZXJpZnlPYmplY3QoZmxhdGJ1ZmZlcnM6OlZlcmlmaWVyICZ2LCBjb25zdCByZWZsZWN0aW9uOjpTY2hlbWEgJnNjaGVtYSwKLSAgICAgICAgICAgICAgICAgIGNvbnN0IHJlZmxlY3Rpb246Ok9iamVjdCAmb2JqLAotICAgICAgICAgICAgICAgICAgY29uc3QgZmxhdGJ1ZmZlcnM6OlRhYmxlICp0YWJsZSwgYm9vbCByZXF1aXJlZCk7Ci0KLWJvb2wgVmVyaWZ5VW5pb24oZmxhdGJ1ZmZlcnM6OlZlcmlmaWVyICZ2LCBjb25zdCByZWZsZWN0aW9uOjpTY2hlbWEgJnNjaGVtYSwKLSAgICAgICAgICAgICAgICAgdWludDhfdCB1dHlwZSwgY29uc3QgdWludDhfdCAqZWxlbSwKLSAgICAgICAgICAgICAgICAgY29uc3QgcmVmbGVjdGlvbjo6RmllbGQgJnVuaW9uX2ZpZWxkKSB7Ci0gIGlmICghdXR5cGUpIHJldHVybiB0cnVlOyAgLy8gTm90IHByZXNlbnQuCi0gIGF1dG8gZmJfZW51bSA9IHNjaGVtYS5lbnVtcygpLT5HZXQodW5pb25fZmllbGQudHlwZSgpLT5pbmRleCgpKTsKLSAgaWYgKHV0eXBlID49IGZiX2VudW0tPnZhbHVlcygpLT5zaXplKCkpIHJldHVybiBmYWxzZTsKLSAgYXV0byBlbGVtX3R5cGUgPSBmYl9lbnVtLT52YWx1ZXMoKS0+R2V0KHV0eXBlKS0+dW5pb25fdHlwZSgpOwotICBzd2l0Y2ggKGVsZW1fdHlwZS0+YmFzZV90eXBlKCkpIHsKLSAgICBjYXNlIHJlZmxlY3Rpb246OkJhc2VUeXBlOjpPYmo6IHsKLSAgICAgIGF1dG8gZWxlbV9vYmogPSBzY2hlbWEub2JqZWN0cygpLT5HZXQoZWxlbV90eXBlLT5pbmRleCgpKTsKLSAgICAgIGlmIChlbGVtX29iai0+aXNfc3RydWN0KCkpIHsKLSAgICAgICAgcmV0dXJuIHYuVmVyaWZ5RnJvbVBvaW50ZXIoZWxlbSwgZWxlbV9vYmotPmJ5dGVzaXplKCkpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgcmV0dXJuIFZlcmlmeU9iamVjdCh2LCBzY2hlbWEsICplbGVtX29iaiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PGNvbnN0IGZsYXRidWZmZXJzOjpUYWJsZSAqPihlbGVtKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgY2FzZSByZWZsZWN0aW9uOjpCYXNlVHlwZTo6U3RyaW5nOgotICAgICAgcmV0dXJuIHYuVmVyaWZ5U3RyaW5nKAotICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgZmxhdGJ1ZmZlcnM6OlN0cmluZyAqPihlbGVtKSk7Ci0gICAgZGVmYXVsdDogcmV0dXJuIGZhbHNlOwotICB9Ci19Ci0KLWJvb2wgVmVyaWZ5VmVjdG9yKGZsYXRidWZmZXJzOjpWZXJpZmllciAmdiwgY29uc3QgcmVmbGVjdGlvbjo6U2NoZW1hICZzY2hlbWEsCi0gICAgICAgICAgICAgICAgICBjb25zdCBmbGF0YnVmZmVyczo6VGFibGUgJnRhYmxlLAotICAgICAgICAgICAgICAgICAgY29uc3QgcmVmbGVjdGlvbjo6RmllbGQgJnZlY19maWVsZCkgewotICBGTEFUQlVGRkVSU19BU1NFUlQodmVjX2ZpZWxkLnR5cGUoKS0+YmFzZV90eXBlKCkgPT0gcmVmbGVjdGlvbjo6QmFzZVR5cGU6OlZlY3Rvcik7Ci0gIGlmICghdGFibGUuVmVyaWZ5RmllbGQ8dW9mZnNldF90Pih2LCB2ZWNfZmllbGQub2Zmc2V0KCksIHNpemVvZih1b2Zmc2V0X3QpKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgc3dpdGNoICh2ZWNfZmllbGQudHlwZSgpLT5lbGVtZW50KCkpIHsKLSAgICBjYXNlIHJlZmxlY3Rpb246OkJhc2VUeXBlOjpVVHlwZToKLSAgICAgIHJldHVybiB2LlZlcmlmeVZlY3RvcihmbGF0YnVmZmVyczo6R2V0RmllbGRWPHVpbnQ4X3Q+KHRhYmxlLCB2ZWNfZmllbGQpKTsKLSAgICBjYXNlIHJlZmxlY3Rpb246OkJhc2VUeXBlOjpCb29sOgotICAgIGNhc2UgcmVmbGVjdGlvbjo6QmFzZVR5cGU6OkJ5dGU6Ci0gICAgY2FzZSByZWZsZWN0aW9uOjpCYXNlVHlwZTo6VUJ5dGU6Ci0gICAgICByZXR1cm4gdi5WZXJpZnlWZWN0b3IoZmxhdGJ1ZmZlcnM6OkdldEZpZWxkVjxpbnQ4X3Q+KHRhYmxlLCB2ZWNfZmllbGQpKTsKLSAgICBjYXNlIHJlZmxlY3Rpb246OkJhc2VUeXBlOjpTaG9ydDoKLSAgICBjYXNlIHJlZmxlY3Rpb246OkJhc2VUeXBlOjpVU2hvcnQ6Ci0gICAgICByZXR1cm4gdi5WZXJpZnlWZWN0b3IoZmxhdGJ1ZmZlcnM6OkdldEZpZWxkVjxpbnQxNl90Pih0YWJsZSwgdmVjX2ZpZWxkKSk7Ci0gICAgY2FzZSByZWZsZWN0aW9uOjpCYXNlVHlwZTo6SW50OgotICAgIGNhc2UgcmVmbGVjdGlvbjo6QmFzZVR5cGU6OlVJbnQ6Ci0gICAgICByZXR1cm4gdi5WZXJpZnlWZWN0b3IoZmxhdGJ1ZmZlcnM6OkdldEZpZWxkVjxpbnQzMl90Pih0YWJsZSwgdmVjX2ZpZWxkKSk7Ci0gICAgY2FzZSByZWZsZWN0aW9uOjpCYXNlVHlwZTo6TG9uZzoKLSAgICBjYXNlIHJlZmxlY3Rpb246OkJhc2VUeXBlOjpVTG9uZzoKLSAgICAgIHJldHVybiB2LlZlcmlmeVZlY3RvcihmbGF0YnVmZmVyczo6R2V0RmllbGRWPGludDY0X3Q+KHRhYmxlLCB2ZWNfZmllbGQpKTsKLSAgICBjYXNlIHJlZmxlY3Rpb246OkJhc2VUeXBlOjpGbG9hdDoKLSAgICAgIHJldHVybiB2LlZlcmlmeVZlY3RvcihmbGF0YnVmZmVyczo6R2V0RmllbGRWPGZsb2F0Pih0YWJsZSwgdmVjX2ZpZWxkKSk7Ci0gICAgY2FzZSByZWZsZWN0aW9uOjpCYXNlVHlwZTo6RG91YmxlOgotICAgICAgcmV0dXJuIHYuVmVyaWZ5VmVjdG9yKGZsYXRidWZmZXJzOjpHZXRGaWVsZFY8ZG91YmxlPih0YWJsZSwgdmVjX2ZpZWxkKSk7Ci0gICAgY2FzZSByZWZsZWN0aW9uOjpCYXNlVHlwZTo6U3RyaW5nOiB7Ci0gICAgICBhdXRvIHZlY19zdHJpbmcgPQotICAgICAgICAgIGZsYXRidWZmZXJzOjpHZXRGaWVsZFY8ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxmbGF0YnVmZmVyczo6U3RyaW5nPj4oCi0gICAgICAgICAgICAgIHRhYmxlLCB2ZWNfZmllbGQpOwotICAgICAgaWYgKHYuVmVyaWZ5VmVjdG9yKHZlY19zdHJpbmcpICYmIHYuVmVyaWZ5VmVjdG9yT2ZTdHJpbmdzKHZlY19zdHJpbmcpKSB7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfQotICAgIH0KLSAgICBjYXNlIHJlZmxlY3Rpb246OkJhc2VUeXBlOjpPYmo6IHsKLSAgICAgIGF1dG8gb2JqID0gc2NoZW1hLm9iamVjdHMoKS0+R2V0KHZlY19maWVsZC50eXBlKCktPmluZGV4KCkpOwotICAgICAgaWYgKG9iai0+aXNfc3RydWN0KCkpIHsKLSAgICAgICAgcmV0dXJuIFZlcmlmeVZlY3Rvck9mU3RydWN0cyh2LCB0YWJsZSwgdmVjX2ZpZWxkLm9mZnNldCgpLCAqb2JqLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY19maWVsZC5yZXF1aXJlZCgpKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGF1dG8gdmVjID0KLSAgICAgICAgICAgIGZsYXRidWZmZXJzOjpHZXRGaWVsZFY8ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxmbGF0YnVmZmVyczo6VGFibGU+PigKLSAgICAgICAgICAgICAgICB0YWJsZSwgdmVjX2ZpZWxkKTsKLSAgICAgICAgaWYgKCF2LlZlcmlmeVZlY3Rvcih2ZWMpKSByZXR1cm4gZmFsc2U7Ci0gICAgICAgIGlmICghdmVjKSByZXR1cm4gdHJ1ZTsKLSAgICAgICAgZm9yICh1b2Zmc2V0X3QgaiA9IDA7IGogPCB2ZWMtPnNpemUoKTsgaisrKSB7Ci0gICAgICAgICAgaWYgKCFWZXJpZnlPYmplY3Qodiwgc2NoZW1hLCAqb2JqLCB2ZWMtPkdldChqKSwgdHJ1ZSkpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICB9Ci0gICAgfQotICAgIGNhc2UgcmVmbGVjdGlvbjo6QmFzZVR5cGU6OlVuaW9uOiB7Ci0gICAgICBhdXRvIHZlYyA9IGZsYXRidWZmZXJzOjpHZXRGaWVsZFY8ZmxhdGJ1ZmZlcnM6Ok9mZnNldDx1aW50OF90Pj4oCi0gICAgICAgICAgdGFibGUsIHZlY19maWVsZCk7Ci0gICAgICBpZiAoIXYuVmVyaWZ5VmVjdG9yKHZlYykpIHJldHVybiBmYWxzZTsKLSAgICAgIGlmICghdmVjKSByZXR1cm4gdHJ1ZTsKLSAgICAgIGF1dG8gdHlwZV92ZWMgPSB0YWJsZS5HZXRQb2ludGVyPFZlY3Rvcjx1aW50OF90PiAqPih2ZWNfZmllbGQub2Zmc2V0KCkgLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZih2b2Zmc2V0X3QpKTsKLSAgICAgIGlmICghdi5WZXJpZnlWZWN0b3IodHlwZV92ZWMpKSByZXR1cm4gZmFsc2U7Ci0gICAgICBmb3IgKHVvZmZzZXRfdCBqID0gMDsgaiA8IHZlYy0+c2l6ZSgpOyBqKyspIHsKLSAgICAgICAgLy8gIGdldCB1bmlvbiB0eXBlIGZyb20gdGhlIHByZXYgZmllbGQKLSAgICAgICAgYXV0byB1dHlwZSA9IHR5cGVfdmVjLT5HZXQoaik7Ci0gICAgICAgIGF1dG8gZWxlbSA9IHZlYy0+R2V0KGopOwotICAgICAgICBpZiAoIVZlcmlmeVVuaW9uKHYsIHNjaGVtYSwgdXR5cGUsIGVsZW0sIHZlY19maWVsZCkpIHJldHVybiBmYWxzZTsKLSAgICAgIH0KLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgICBjYXNlIHJlZmxlY3Rpb246OkJhc2VUeXBlOjpWZWN0b3I6Ci0gICAgY2FzZSByZWZsZWN0aW9uOjpCYXNlVHlwZTo6Tm9uZToKLSAgICBkZWZhdWx0OiBGTEFUQlVGRkVSU19BU1NFUlQoZmFsc2UpOyByZXR1cm4gZmFsc2U7Ci0gIH0KLX0KLQotYm9vbCBWZXJpZnlPYmplY3QoZmxhdGJ1ZmZlcnM6OlZlcmlmaWVyICZ2LCBjb25zdCByZWZsZWN0aW9uOjpTY2hlbWEgJnNjaGVtYSwKLSAgICAgICAgICAgICAgICAgIGNvbnN0IHJlZmxlY3Rpb246Ok9iamVjdCAmb2JqLAotICAgICAgICAgICAgICAgICAgY29uc3QgZmxhdGJ1ZmZlcnM6OlRhYmxlICp0YWJsZSwgYm9vbCByZXF1aXJlZCkgewotICBpZiAoIXRhYmxlKSByZXR1cm4gIXJlcXVpcmVkOwotICBpZiAoIXRhYmxlLT5WZXJpZnlUYWJsZVN0YXJ0KHYpKSByZXR1cm4gZmFsc2U7Ci0gIGZvciAodW9mZnNldF90IGkgPSAwOyBpIDwgb2JqLmZpZWxkcygpLT5zaXplKCk7IGkrKykgewotICAgIGF1dG8gZmllbGRfZGVmID0gb2JqLmZpZWxkcygpLT5HZXQoaSk7Ci0gICAgc3dpdGNoIChmaWVsZF9kZWYtPnR5cGUoKS0+YmFzZV90eXBlKCkpIHsKLSAgICAgIGNhc2UgcmVmbGVjdGlvbjo6QmFzZVR5cGU6Ok5vbmU6IEZMQVRCVUZGRVJTX0FTU0VSVChmYWxzZSk7IGJyZWFrOwotICAgICAgY2FzZSByZWZsZWN0aW9uOjpCYXNlVHlwZTo6VVR5cGU6Ci0gICAgICAgIGlmICghdGFibGUtPlZlcmlmeUZpZWxkPHVpbnQ4X3Q+KHYsIGZpZWxkX2RlZi0+b2Zmc2V0KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZih1aW50OF90KSkpCi0gICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgcmVmbGVjdGlvbjo6QmFzZVR5cGU6OkJvb2w6Ci0gICAgICBjYXNlIHJlZmxlY3Rpb246OkJhc2VUeXBlOjpCeXRlOgotICAgICAgY2FzZSByZWZsZWN0aW9uOjpCYXNlVHlwZTo6VUJ5dGU6Ci0gICAgICAgIGlmICghdGFibGUtPlZlcmlmeUZpZWxkPGludDhfdD4odiwgZmllbGRfZGVmLT5vZmZzZXQoKSwgc2l6ZW9mKGludDhfdCkpKQotICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHJlZmxlY3Rpb246OkJhc2VUeXBlOjpTaG9ydDoKLSAgICAgIGNhc2UgcmVmbGVjdGlvbjo6QmFzZVR5cGU6OlVTaG9ydDoKLSAgICAgICAgaWYgKCF0YWJsZS0+VmVyaWZ5RmllbGQ8aW50MTZfdD4odiwgZmllbGRfZGVmLT5vZmZzZXQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGludDE2X3QpKSkKLSAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSByZWZsZWN0aW9uOjpCYXNlVHlwZTo6SW50OgotICAgICAgY2FzZSByZWZsZWN0aW9uOjpCYXNlVHlwZTo6VUludDoKLSAgICAgICAgaWYgKCF0YWJsZS0+VmVyaWZ5RmllbGQ8aW50MzJfdD4odiwgZmllbGRfZGVmLT5vZmZzZXQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGludDMyX3QpKSkKLSAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSByZWZsZWN0aW9uOjpCYXNlVHlwZTo6TG9uZzoKLSAgICAgIGNhc2UgcmVmbGVjdGlvbjo6QmFzZVR5cGU6OlVMb25nOgotICAgICAgICBpZiAoIXRhYmxlLT5WZXJpZnlGaWVsZDxpbnQ2NF90Pih2LCBmaWVsZF9kZWYtPm9mZnNldCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoaW50NjRfdCkpKQotICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHJlZmxlY3Rpb246OkJhc2VUeXBlOjpGbG9hdDoKLSAgICAgICAgaWYgKCF0YWJsZS0+VmVyaWZ5RmllbGQ8ZmxvYXQ+KHYsIGZpZWxkX2RlZi0+b2Zmc2V0KCksIHNpemVvZihmbG9hdCkpKQotICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHJlZmxlY3Rpb246OkJhc2VUeXBlOjpEb3VibGU6Ci0gICAgICAgIGlmICghdGFibGUtPlZlcmlmeUZpZWxkPGRvdWJsZT4odiwgZmllbGRfZGVmLT5vZmZzZXQoKSwgc2l6ZW9mKGRvdWJsZSkpKQotICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHJlZmxlY3Rpb246OkJhc2VUeXBlOjpTdHJpbmc6Ci0gICAgICAgIGlmICghdGFibGUtPlZlcmlmeUZpZWxkPHVvZmZzZXRfdD4odiwgZmllbGRfZGVmLT5vZmZzZXQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YodW9mZnNldF90KSkgfHwKLSAgICAgICAgICAgICF2LlZlcmlmeVN0cmluZyhmbGF0YnVmZmVyczo6R2V0RmllbGRTKCp0YWJsZSwgKmZpZWxkX2RlZikpKSB7Ci0gICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSByZWZsZWN0aW9uOjpCYXNlVHlwZTo6VmVjdG9yOgotICAgICAgICBpZiAoIVZlcmlmeVZlY3Rvcih2LCBzY2hlbWEsICp0YWJsZSwgKmZpZWxkX2RlZikpIHJldHVybiBmYWxzZTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHJlZmxlY3Rpb246OkJhc2VUeXBlOjpPYmo6IHsKLSAgICAgICAgYXV0byBjaGlsZF9vYmogPSBzY2hlbWEub2JqZWN0cygpLT5HZXQoZmllbGRfZGVmLT50eXBlKCktPmluZGV4KCkpOwotICAgICAgICBpZiAoY2hpbGRfb2JqLT5pc19zdHJ1Y3QoKSkgewotICAgICAgICAgIGlmICghVmVyaWZ5U3RydWN0KHYsICp0YWJsZSwgZmllbGRfZGVmLT5vZmZzZXQoKSwgKmNoaWxkX29iaiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZF9kZWYtPnJlcXVpcmVkKCkpKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGlmICghVmVyaWZ5T2JqZWN0KHYsIHNjaGVtYSwgKmNoaWxkX29iaiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGF0YnVmZmVyczo6R2V0RmllbGRUKCp0YWJsZSwgKmZpZWxkX2RlZiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRfZGVmLT5yZXF1aXJlZCgpKSkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIGNhc2UgcmVmbGVjdGlvbjo6QmFzZVR5cGU6OlVuaW9uOiB7Ci0gICAgICAgIC8vICBnZXQgdW5pb24gdHlwZSBmcm9tIHRoZSBwcmV2IGZpZWxkCi0gICAgICAgIHZvZmZzZXRfdCB1dHlwZV9vZmZzZXQgPSBmaWVsZF9kZWYtPm9mZnNldCgpIC0gc2l6ZW9mKHZvZmZzZXRfdCk7Ci0gICAgICAgIGF1dG8gdXR5cGUgPSB0YWJsZS0+R2V0RmllbGQ8dWludDhfdD4odXR5cGVfb2Zmc2V0LCAwKTsKLSAgICAgICAgYXV0byB1dmFsID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90ICo+KAotICAgICAgICAgICAgZmxhdGJ1ZmZlcnM6OkdldEZpZWxkVCgqdGFibGUsICpmaWVsZF9kZWYpKTsKLSAgICAgICAgaWYgKCFWZXJpZnlVbmlvbih2LCBzY2hlbWEsIHV0eXBlLCB1dmFsLCAqZmllbGRfZGVmKSkgeyByZXR1cm4gZmFsc2U7IH0KLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICBkZWZhdWx0OiBGTEFUQlVGRkVSU19BU1NFUlQoZmFsc2UpOyBicmVhazsKLSAgICB9Ci0gIH0KLQotICBpZiAoIXYuRW5kVGFibGUoKSkgcmV0dXJuIGZhbHNlOwotCi0gIHJldHVybiB0cnVlOwotfQogCiBib29sIFZlcmlmeShjb25zdCByZWZsZWN0aW9uOjpTY2hlbWEgJnNjaGVtYSwgY29uc3QgcmVmbGVjdGlvbjo6T2JqZWN0ICZyb290LAotICAgICAgICAgICAgY29uc3QgdWludDhfdCAqYnVmLCBzaXplX3QgbGVuZ3RoLCB1b2Zmc2V0X3QgbWF4X2RlcHRoIC8qPSA2NCovLAotICAgICAgICAgICAgdW9mZnNldF90IG1heF90YWJsZXMgLyo9IDEwMDAwMDAqLykgeworICAgICAgICAgICAgY29uc3QgdWludDhfdCAqY29uc3QgYnVmLCBjb25zdCBzaXplX3QgbGVuZ3RoLAorICAgICAgICAgICAgY29uc3QgdW9mZnNldF90IG1heF9kZXB0aCwgY29uc3QgdW9mZnNldF90IG1heF90YWJsZXMpIHsKICAgVmVyaWZpZXIgdihidWYsIGxlbmd0aCwgbWF4X2RlcHRoLCBtYXhfdGFibGVzKTsKLSAgcmV0dXJuIFZlcmlmeU9iamVjdCh2LCBzY2hlbWEsIHJvb3QsIGZsYXRidWZmZXJzOjpHZXRBbnlSb290KGJ1ZiksIHRydWUpOworICByZXR1cm4gVmVyaWZ5T2JqZWN0KHYsIHNjaGVtYSwgcm9vdCwgZmxhdGJ1ZmZlcnM6OkdldEFueVJvb3QoYnVmKSwKKyAgICAgICAgICAgICAgICAgICAgICAvKnJlcXVpcmVkPSovdHJ1ZSk7Cit9CisKK2Jvb2wgVmVyaWZ5U2l6ZVByZWZpeGVkKGNvbnN0IHJlZmxlY3Rpb246OlNjaGVtYSAmc2NoZW1hLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVmbGVjdGlvbjo6T2JqZWN0ICZyb290LAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqY29uc3QgYnVmLCBjb25zdCBzaXplX3QgbGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdW9mZnNldF90IG1heF9kZXB0aCwgY29uc3QgdW9mZnNldF90IG1heF90YWJsZXMpIHsKKyAgVmVyaWZpZXIgdihidWYsIGxlbmd0aCwgbWF4X2RlcHRoLCBtYXhfdGFibGVzKTsKKyAgcmV0dXJuIFZlcmlmeU9iamVjdCh2LCBzY2hlbWEsIHJvb3QsIGZsYXRidWZmZXJzOjpHZXRBbnlTaXplUHJlZml4ZWRSb290KGJ1ZiksCisgICAgICAgICAgICAgICAgICAgICAgLypyZXF1aXJlZD0qL3RydWUpOwogfQogCiB9ICAvLyBuYW1lc3BhY2UgZmxhdGJ1ZmZlcnMKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3NyYy91dGlsLmNwcCBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3NyYy91dGlsLmNwcAppbmRleCBhMWVkNmMxLi5kZjMyNGU4IDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy9zcmMvdXRpbC5jcHAKKysrIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvc3JjL3V0aWwuY3BwCkBAIC0xNywxMyArMTcsMTQgQEAKIC8vIGNsYW5nLWZvcm1hdCBvZmYKIC8vIERvbnQndCByZW1vdmUgYGZvcm1hdCBvZmZgLCBpdCBwcmV2ZW50IHJlb3JkZXJpbmcgb2Ygd2luLWluY2x1ZGVzLgogCisjaW5jbHVkZSA8Y3N0cmluZz4KICNpZiBkZWZpbmVkKF9fTUlOR1czMl9fKSB8fCBkZWZpbmVkKF9fTUlOR1c2NF9fKSB8fCBkZWZpbmVkKF9fQ1lHV0lOX18pIHx8IFwKICAgICBkZWZpbmVkKF9fUU5YTlRPX18pCiAjICBkZWZpbmUgX1BPU0lYX0NfU09VUkNFIDIwMDgwOUwKICMgIGRlZmluZSBfWE9QRU5fU09VUkNFIDcwMEwKICNlbmRpZgogCi0jaWZkZWYgX1dJTjMyCisjaWYgZGVmaW5lZChfV0lOMzIpIHx8IGRlZmluZWQoX19NSU5HVzMyX18pIHx8IGRlZmluZWQoX19NSU5HVzY0X18pIHx8IGRlZmluZWQoX19DWUdXSU5fXykKICMgIGlmbmRlZiBXSU4zMl9MRUFOX0FORF9NRUFOCiAjICAgIGRlZmluZSBXSU4zMl9MRUFOX0FORF9NRUFOCiAjICBlbmRpZgpAQCAtMzQsNyArMzUsOSBAQAogIyAgICBpbmNsdWRlIDxjcnRkYmcuaD4KICMgIGVuZGlmCiAjICBpbmNsdWRlIDx3aW5kb3dzLmg+ICAvLyBNdXN0IGJlIGluY2x1ZGVkIGJlZm9yZSA8ZGlyZWN0Lmg+Ci0jICBpbmNsdWRlIDxkaXJlY3QuaD4KKyMgIGlmbmRlZiBfX0NZR1dJTl9fCisjICAgIGluY2x1ZGUgPGRpcmVjdC5oPgorIyAgZW5kaWYKICMgIGluY2x1ZGUgPHdpbmJhc2UuaD4KICMgIHVuZGVmIGludGVyZmFjZSAgLy8gVGhpcyBpcyBhbHNvIGltcG9ydGFudCBiZWNhdXNlIG9mIHJlYXNvbnMKICNlbmRpZgpAQCAtNDYsMTkgKzQ5LDIxIEBACiAKICNpbmNsdWRlIDxjbG9jYWxlPgogI2luY2x1ZGUgPGNzdGRsaWI+Ci0jaW5jbHVkZSA8ZnVuY3Rpb25hbD4KICNpbmNsdWRlIDxmc3RyZWFtPgorI2luY2x1ZGUgPGZ1bmN0aW9uYWw+CiAKICNpbmNsdWRlICJmbGF0YnVmZmVycy9iYXNlLmgiCiAKIG5hbWVzcGFjZSBmbGF0YnVmZmVycyB7CiAKLWJvb2wgRmlsZUV4aXN0c1Jhdyhjb25zdCBjaGFyICpuYW1lKSB7CituYW1lc3BhY2UgeworCitzdGF0aWMgYm9vbCBGaWxlRXhpc3RzUmF3KGNvbnN0IGNoYXIgKm5hbWUpIHsKICAgc3RkOjppZnN0cmVhbSBpZnMobmFtZSk7CiAgIHJldHVybiBpZnMuZ29vZCgpOwogfQogCi1ib29sIExvYWRGaWxlUmF3KGNvbnN0IGNoYXIgKm5hbWUsIGJvb2wgYmluYXJ5LCBzdGQ6OnN0cmluZyAqYnVmKSB7CitzdGF0aWMgYm9vbCBMb2FkRmlsZVJhdyhjb25zdCBjaGFyICpuYW1lLCBib29sIGJpbmFyeSwgc3RkOjpzdHJpbmcgKmJ1ZikgewogICBpZiAoRGlyRXhpc3RzKG5hbWUpKSByZXR1cm4gZmFsc2U7CiAgIHN0ZDo6aWZzdHJlYW0gaWZzKG5hbWUsIGJpbmFyeSA/IHN0ZDo6aWZzdHJlYW06OmJpbmFyeSA6IHN0ZDo6aWZzdHJlYW06OmluKTsKICAgaWYgKCFpZnMuaXNfb3BlbigpKSByZXR1cm4gZmFsc2U7CkBAIC03OCw4ICs4MywxMjQgQEAKICAgcmV0dXJuICFpZnMuYmFkKCk7CiB9CiAKLXN0YXRpYyBMb2FkRmlsZUZ1bmN0aW9uIGdfbG9hZF9maWxlX2Z1bmN0aW9uID0gTG9hZEZpbGVSYXc7Ci1zdGF0aWMgRmlsZUV4aXN0c0Z1bmN0aW9uIGdfZmlsZV9leGlzdHNfZnVuY3Rpb24gPSBGaWxlRXhpc3RzUmF3OworTG9hZEZpbGVGdW5jdGlvbiBnX2xvYWRfZmlsZV9mdW5jdGlvbiA9IExvYWRGaWxlUmF3OworRmlsZUV4aXN0c0Z1bmN0aW9uIGdfZmlsZV9leGlzdHNfZnVuY3Rpb24gPSBGaWxlRXhpc3RzUmF3OworCitzdGF0aWMgc3RkOjpzdHJpbmcgVG9DYW1lbENhc2UoY29uc3Qgc3RkOjpzdHJpbmcgJmlucHV0LCBib29sIGZpcnN0KSB7CisgIHN0ZDo6c3RyaW5nIHM7CisgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgaW5wdXQubGVuZ3RoKCk7IGkrKykgeworICAgIGlmICghaSAmJiBmaXJzdCkKKyAgICAgIHMgKz0gQ2hhclRvVXBwZXIoaW5wdXRbaV0pOworICAgIGVsc2UgaWYgKGlucHV0W2ldID09ICdfJyAmJiBpICsgMSA8IGlucHV0Lmxlbmd0aCgpKQorICAgICAgcyArPSBDaGFyVG9VcHBlcihpbnB1dFsrK2ldKTsKKyAgICBlbHNlCisgICAgICBzICs9IGlucHV0W2ldOworICB9CisgIHJldHVybiBzOworfQorCitzdGF0aWMgc3RkOjpzdHJpbmcgVG9TbmFrZUNhc2UoY29uc3Qgc3RkOjpzdHJpbmcgJmlucHV0LCBib29sIHNjcmVhbWluZykgeworICBzdGQ6OnN0cmluZyBzOworICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGlucHV0Lmxlbmd0aCgpOyBpKyspIHsKKyAgICBpZiAoaSA9PSAwKSB7CisgICAgICBzICs9IHNjcmVhbWluZyA/IENoYXJUb1VwcGVyKGlucHV0W2ldKSA6IENoYXJUb0xvd2VyKGlucHV0W2ldKTsKKyAgICB9IGVsc2UgaWYgKGlucHV0W2ldID09ICdfJykgeworICAgICAgcyArPSAnXyc7CisgICAgfSBlbHNlIGlmICghaXNsb3dlcihpbnB1dFtpXSkpIHsKKyAgICAgIC8vIFByZXZlbnQgZHVwbGljYXRlIHVuZGVyc2NvcmVzIGZvciBVcHBlcl9TbmFrZV9DYXNlIHN0cmluZ3MKKyAgICAgIC8vIGFuZCBVUFBFUkNBU0Ugc3RyaW5ncy4KKyAgICAgIGlmIChpc2xvd2VyKGlucHV0W2kgLSAxXSkpIHsgcyArPSAnXyc7IH0KKyAgICAgIHMgKz0gc2NyZWFtaW5nID8gQ2hhclRvVXBwZXIoaW5wdXRbaV0pIDogQ2hhclRvTG93ZXIoaW5wdXRbaV0pOworICAgIH0gZWxzZSB7CisgICAgICBzICs9IHNjcmVhbWluZyA/IENoYXJUb1VwcGVyKGlucHV0W2ldKSA6IGlucHV0W2ldOworICAgIH0KKyAgfQorICByZXR1cm4gczsKK30KKworc3RkOjpzdHJpbmcgVG9BbGwoY29uc3Qgc3RkOjpzdHJpbmcgJmlucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6ZnVuY3Rpb248Y2hhcihjb25zdCBjaGFyKT4gdHJhbnNmb3JtKSB7CisgIHN0ZDo6c3RyaW5nIHM7CisgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgaW5wdXQubGVuZ3RoKCk7IGkrKykgeyBzICs9IHRyYW5zZm9ybShpbnB1dFtpXSk7IH0KKyAgcmV0dXJuIHM7Cit9CisKK3N0ZDo6c3RyaW5nIENhbWVsVG9TbmFrZShjb25zdCBzdGQ6OnN0cmluZyAmaW5wdXQpIHsKKyAgc3RkOjpzdHJpbmcgczsKKyAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBpbnB1dC5sZW5ndGgoKTsgaSsrKSB7CisgICAgaWYgKGkgPT0gMCkgeworICAgICAgcyArPSBDaGFyVG9Mb3dlcihpbnB1dFtpXSk7CisgICAgfSBlbHNlIGlmIChpbnB1dFtpXSA9PSAnXycpIHsKKyAgICAgIHMgKz0gJ18nOworICAgIH0gZWxzZSBpZiAoIWlzbG93ZXIoaW5wdXRbaV0pKSB7CisgICAgICAvLyBQcmV2ZW50IGR1cGxpY2F0ZSB1bmRlcnNjb3JlcyBmb3IgVXBwZXJfU25ha2VfQ2FzZSBzdHJpbmdzCisgICAgICAvLyBhbmQgVVBQRVJDQVNFIHN0cmluZ3MuCisgICAgICBpZiAoaXNsb3dlcihpbnB1dFtpIC0gMV0pKSB7IHMgKz0gJ18nOyB9CisgICAgICBzICs9IENoYXJUb0xvd2VyKGlucHV0W2ldKTsKKyAgICB9IGVsc2UgeworICAgICAgcyArPSBpbnB1dFtpXTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIHM7Cit9CisKK3N0ZDo6c3RyaW5nIERhc2hlclRvU25ha2UoY29uc3Qgc3RkOjpzdHJpbmcgJmlucHV0KSB7CisgIHN0ZDo6c3RyaW5nIHM7CisgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgaW5wdXQubGVuZ3RoKCk7IGkrKykgeworICAgIGlmIChpbnB1dFtpXSA9PSAnLScpIHsKKyAgICAgIHMgKz0gIl8iOworICAgIH0gZWxzZSB7CisgICAgICBzICs9IGlucHV0W2ldOworICAgIH0KKyAgfQorICByZXR1cm4gczsKK30KKworc3RkOjpzdHJpbmcgVG9EYXNoZXIoY29uc3Qgc3RkOjpzdHJpbmcgJmlucHV0KSB7CisgIHN0ZDo6c3RyaW5nIHM7CisgIGNoYXIgcCA9IDA7CisgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgaW5wdXQubGVuZ3RoKCk7IGkrKykgeworICAgIGNoYXIgY29uc3QgJmMgPSBpbnB1dFtpXTsKKyAgICBpZiAoYyA9PSAnXycpIHsKKyAgICAgIGlmIChpID4gMCAmJiBwICE9IGtQYXRoU2VwYXJhdG9yICYmCisgICAgICAgICAgLy8gVGhlIGZvbGxvd2luZyBpcyBhIHNwZWNpYWwgY2FzZSB0byBpZ25vcmUgZGlnaXRzIGFmdGVyIGEgXy4gVGhpcyBpcworICAgICAgICAgIC8vIGJlY2F1c2UgVGhpc0V4YW1wbGUzIHdvdWxkIGJlIGNvbnZlcnRlZCB0byB0aGlzX2V4YW1wbGVfMyBpbiB0aGUKKyAgICAgICAgICAvLyBDYW1lbFRvU25ha2UgY29udmVyc2lvbiwgYW5kIHRoZW4gZGFzaGVyIHdvdWxkIGRvIHRoaXMtZXhhbXBsZS0zLAorICAgICAgICAgIC8vIGJ1dCBpdCBleHBlY3RzIHRoaXMtZXhhbXBsZTMuCisgICAgICAgICAgIShpICsgMSA8IGlucHV0Lmxlbmd0aCgpICYmIGlzZGlnaXQoaW5wdXRbaSArIDFdKSkpCisgICAgICAgIHMgKz0gIi0iOworICAgIH0gZWxzZSB7CisgICAgICBzICs9IGM7CisgICAgfQorICAgIHAgPSBjOworICB9CisgIHJldHVybiBzOworfQorCisKKy8vIENvbnZlcnRzIGZvb19iYXJfMTIzYmF6XzQ1NiB0byBmb29fYmFyMTIzX2JhejQ1Ngorc3RkOjpzdHJpbmcgU25ha2VUb1NuYWtlMihjb25zdCBzdGQ6OnN0cmluZyAmcykgeworICBpZiAocy5sZW5ndGgoKSA8PSAxKSByZXR1cm4gczsKKyAgc3RkOjpzdHJpbmcgcmVzdWx0OworICByZXN1bHQucmVzZXJ2ZShzLnNpemUoKSk7CisgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgcy5sZW5ndGgoKSAtIDE7IGkrKykgeworICAgIGlmIChzW2ldID09ICdfJyAmJiBpc2RpZ2l0KHNbaSArIDFdKSkgeworICAgICAgY29udGludWU7ICAvLyBNb3ZlIHRoZSBgX2AgdW50aWwgYWZ0ZXIgdGhlIGRpZ2l0cy4KKyAgICB9CisKKyAgICByZXN1bHQucHVzaF9iYWNrKHNbaV0pOworCisgICAgaWYgKGlzZGlnaXQoc1tpXSkgJiYgaXNhbHBoYShzW2kgKyAxXSkgJiYgaXNsb3dlcihzW2kgKyAxXSkpIHsKKyAgICAgIHJlc3VsdC5wdXNoX2JhY2soJ18nKTsKKyAgICB9CisgIH0KKyAgcmVzdWx0LnB1c2hfYmFjayhzLmJhY2soKSk7CisKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworfSAvLyBuYW1lc3BhY2UKKwogCiBib29sIExvYWRGaWxlKGNvbnN0IGNoYXIgKm5hbWUsIGJvb2wgYmluYXJ5LCBzdGQ6OnN0cmluZyAqYnVmKSB7CiAgIEZMQVRCVUZGRVJTX0FTU0VSVChnX2xvYWRfZmlsZV9mdW5jdGlvbik7CkBAIC0xNTUsNiArMjc2LDE1IEBACiAgIHJldHVybiBpICE9IHN0ZDo6c3RyaW5nOjpucG9zID8gZmlsZXBhdGguc3Vic3RyKDAsIGkpIDogIiI7CiB9CiAKK3N0ZDo6c3RyaW5nIFN0cmlwUHJlZml4KGNvbnN0IHN0ZDo6c3RyaW5nICZmaWxlcGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nICZwcmVmaXhfdG9fcmVtb3ZlKSB7CisgIGlmICghc3RybmNtcChmaWxlcGF0aC5jX3N0cigpLCBwcmVmaXhfdG9fcmVtb3ZlLmNfc3RyKCksCisgICAgICAgICAgICAgICBwcmVmaXhfdG9fcmVtb3ZlLnNpemUoKSkpIHsKKyAgICByZXR1cm4gZmlsZXBhdGguc3Vic3RyKHByZWZpeF90b19yZW1vdmUuc2l6ZSgpKTsKKyAgfQorICByZXR1cm4gZmlsZXBhdGg7Cit9CisKIHN0ZDo6c3RyaW5nIENvbkNhdFBhdGhGaWxlTmFtZShjb25zdCBzdGQ6OnN0cmluZyAmcGF0aCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyAmZmlsZW5hbWUpIHsKICAgc3RkOjpzdHJpbmcgZmlsZXBhdGggPSBwYXRoOwpAQCAtMjAyLDcgKzMzMiw3IEBACiAgICNpZmRlZiBGTEFUQlVGRkVSU19OT19BQlNPTFVURV9QQVRIX1JFU09MVVRJT04KICAgICByZXR1cm4gZmlsZXBhdGg7CiAgICNlbHNlCi0gICAgI2lmZGVmIF9XSU4zMgorICAgICNpZiBkZWZpbmVkKF9XSU4zMikgfHwgZGVmaW5lZChfX01JTkdXMzJfXykgfHwgZGVmaW5lZChfX01JTkdXNjRfXykgfHwgZGVmaW5lZChfX0NZR1dJTl9fKQogICAgICAgY2hhciBhYnNfcGF0aFtNQVhfUEFUSF07CiAgICAgICByZXR1cm4gR2V0RnVsbFBhdGhOYW1lQShmaWxlcGF0aC5jX3N0cigpLCBNQVhfUEFUSCwgYWJzX3BhdGgsIG51bGxwdHIpCiAgICAgI2Vsc2UKQEAgLTI5NiwxMjQgKzQyNiw2IEBACiAgIHJldHVybiB0cnVlOwogfQogCi12b2lkIFNldHVwRGVmYXVsdENSVFJlcG9ydE1vZGUoKSB7Ci0gIC8vIGNsYW5nLWZvcm1hdCBvZmYKLQotICAjaWZkZWYgX01TQ19WRVIKLSAgICAvLyBCeSBkZWZhdWx0LCBzZW5kIGFsbCByZXBvcnRzIHRvIFNURE9VVCB0byBwcmV2ZW50IENJIGhhbmdzLgotICAgIC8vIEVuYWJsZSBhc3NlcnQgcmVwb3J0IGJveCBbQWJvcnR8UmV0cnl8SWdub3JlXSBpZiBhIGRlYnVnZ2VyIGlzIHByZXNlbnQuCi0gICAgY29uc3QgaW50IGRiZ19tb2RlID0gKF9DUlREQkdfTU9ERV9GSUxFIHwgX0NSVERCR19NT0RFX0RFQlVHKSB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgKElzRGVidWdnZXJQcmVzZW50KCkgPyBfQ1JUREJHX01PREVfV05EVyA6IDApOwotICAgICh2b2lkKWRiZ19tb2RlOyAvLyByZWxlYXNlIG1vZGUgZml4Ci0gICAgLy8gQ3J0RGVidWcgcmVwb3J0cyB0byBfQ1JUX1dBUk4gY2hhbm5lbC4KLSAgICBfQ3J0U2V0UmVwb3J0TW9kZShfQ1JUX1dBUk4sIGRiZ19tb2RlKTsKLSAgICBfQ3J0U2V0UmVwb3J0RmlsZShfQ1JUX1dBUk4sIF9DUlREQkdfRklMRV9TVERPVVQpOwotICAgIC8vIFRoZSBhc3NlcnQgZnJvbSA8YXNzZXJ0Lmg+IHJlcG9ydHMgdG8gX0NSVF9FUlJPUiBjaGFubmVsCi0gICAgX0NydFNldFJlcG9ydE1vZGUoX0NSVF9FUlJPUiwgZGJnX21vZGUpOwotICAgIF9DcnRTZXRSZXBvcnRGaWxlKF9DUlRfRVJST1IsIF9DUlREQkdfRklMRV9TVERPVVQpOwotICAgIC8vIEludGVybmFsIENSVCBhc3NlcnQgY2hhbm5lbD8KLSAgICBfQ3J0U2V0UmVwb3J0TW9kZShfQ1JUX0FTU0VSVCwgZGJnX21vZGUpOwotICAgIF9DcnRTZXRSZXBvcnRGaWxlKF9DUlRfQVNTRVJULCBfQ1JUREJHX0ZJTEVfU1RET1VUKTsKLSAgI2VuZGlmCi0KLSAgLy8gY2xhbmctZm9ybWF0IG9uCi19Ci0KLW5hbWVzcGFjZSB7Ci0KLXN0YXRpYyBzdGQ6OnN0cmluZyBUb0NhbWVsQ2FzZShjb25zdCBzdGQ6OnN0cmluZyAmaW5wdXQsIGJvb2wgZmlyc3QpIHsKLSAgc3RkOjpzdHJpbmcgczsKLSAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBpbnB1dC5sZW5ndGgoKTsgaSsrKSB7Ci0gICAgaWYgKCFpICYmIGZpcnN0KQotICAgICAgcyArPSBDaGFyVG9VcHBlcihpbnB1dFtpXSk7Ci0gICAgZWxzZSBpZiAoaW5wdXRbaV0gPT0gJ18nICYmIGkgKyAxIDwgaW5wdXQubGVuZ3RoKCkpCi0gICAgICBzICs9IENoYXJUb1VwcGVyKGlucHV0WysraV0pOwotICAgIGVsc2UKLSAgICAgIHMgKz0gaW5wdXRbaV07Ci0gIH0KLSAgcmV0dXJuIHM7Ci19Ci0KLXN0YXRpYyBzdGQ6OnN0cmluZyBUb1NuYWtlQ2FzZShjb25zdCBzdGQ6OnN0cmluZyAmaW5wdXQsIGJvb2wgc2NyZWFtaW5nKSB7Ci0gIHN0ZDo6c3RyaW5nIHM7Ci0gIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgaW5wdXQubGVuZ3RoKCk7IGkrKykgewotICAgIGlmIChpID09IDApIHsKLSAgICAgIHMgKz0gc2NyZWFtaW5nID8gQ2hhclRvVXBwZXIoaW5wdXRbaV0pIDogQ2hhclRvTG93ZXIoaW5wdXRbaV0pOwotICAgIH0gZWxzZSBpZiAoaW5wdXRbaV0gPT0gJ18nKSB7Ci0gICAgICBzICs9ICdfJzsKLSAgICB9IGVsc2UgaWYgKCFpc2xvd2VyKGlucHV0W2ldKSkgewotICAgICAgLy8gUHJldmVudCBkdXBsaWNhdGUgdW5kZXJzY29yZXMgZm9yIFVwcGVyX1NuYWtlX0Nhc2Ugc3RyaW5ncwotICAgICAgLy8gYW5kIFVQUEVSQ0FTRSBzdHJpbmdzLgotICAgICAgaWYgKGlzbG93ZXIoaW5wdXRbaSAtIDFdKSkgeyBzICs9ICdfJzsgfQotICAgICAgcyArPSBzY3JlYW1pbmcgPyBDaGFyVG9VcHBlcihpbnB1dFtpXSkgOiBDaGFyVG9Mb3dlcihpbnB1dFtpXSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHMgKz0gc2NyZWFtaW5nID8gQ2hhclRvVXBwZXIoaW5wdXRbaV0pIDogaW5wdXRbaV07Ci0gICAgfQotICB9Ci0gIHJldHVybiBzOwotfQotCi1zdGF0aWMgc3RkOjpzdHJpbmcgVG9BbGwoY29uc3Qgc3RkOjpzdHJpbmcgJmlucHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6ZnVuY3Rpb248Y2hhcihjb25zdCBjaGFyKT4gdHJhbnNmb3JtKSB7Ci0gIHN0ZDo6c3RyaW5nIHM7Ci0gIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgaW5wdXQubGVuZ3RoKCk7IGkrKykgeyBzICs9IHRyYW5zZm9ybShpbnB1dFtpXSk7IH0KLSAgcmV0dXJuIHM7Ci19Ci0KLXN0YXRpYyBzdGQ6OnN0cmluZyBDYW1lbFRvU25ha2UoY29uc3Qgc3RkOjpzdHJpbmcgJmlucHV0KSB7Ci0gIHN0ZDo6c3RyaW5nIHM7Ci0gIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgaW5wdXQubGVuZ3RoKCk7IGkrKykgewotICAgIGlmIChpID09IDApIHsKLSAgICAgIHMgKz0gQ2hhclRvTG93ZXIoaW5wdXRbaV0pOwotICAgIH0gZWxzZSBpZiAoaW5wdXRbaV0gPT0gJ18nKSB7Ci0gICAgICBzICs9ICdfJzsKLSAgICB9IGVsc2UgaWYgKCFpc2xvd2VyKGlucHV0W2ldKSkgewotICAgICAgLy8gUHJldmVudCBkdXBsaWNhdGUgdW5kZXJzY29yZXMgZm9yIFVwcGVyX1NuYWtlX0Nhc2Ugc3RyaW5ncwotICAgICAgLy8gYW5kIFVQUEVSQ0FTRSBzdHJpbmdzLgotICAgICAgaWYgKGlzbG93ZXIoaW5wdXRbaSAtIDFdKSkgeyBzICs9ICdfJzsgfQotICAgICAgcyArPSBDaGFyVG9Mb3dlcihpbnB1dFtpXSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHMgKz0gaW5wdXRbaV07Ci0gICAgfQotICB9Ci0gIHJldHVybiBzOwotfQotCi1zdGF0aWMgc3RkOjpzdHJpbmcgRGFzaGVyVG9TbmFrZShjb25zdCBzdGQ6OnN0cmluZyAmaW5wdXQpIHsKLSAgc3RkOjpzdHJpbmcgczsKLSAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBpbnB1dC5sZW5ndGgoKTsgaSsrKSB7Ci0gICAgaWYgKGlucHV0W2ldID09ICctJykgewotICAgICAgcyArPSAiXyI7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHMgKz0gaW5wdXRbaV07Ci0gICAgfQotICB9Ci0gIHJldHVybiBzOwotfQotCi1zdGF0aWMgc3RkOjpzdHJpbmcgVG9EYXNoZXIoY29uc3Qgc3RkOjpzdHJpbmcgJmlucHV0KSB7Ci0gIHN0ZDo6c3RyaW5nIHM7Ci0gIGNoYXIgcCA9IDA7Ci0gIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgaW5wdXQubGVuZ3RoKCk7IGkrKykgewotICAgIGNoYXIgY29uc3QgJmMgPSBpbnB1dFtpXTsKLSAgICBpZiAoYyA9PSAnXycpIHsKLSAgICAgIGlmIChpID4gMCAmJiBwICE9IGtQYXRoU2VwYXJhdG9yICYmCi0gICAgICAgICAgLy8gVGhlIGZvbGxvd2luZyBpcyBhIHNwZWNpYWwgY2FzZSB0byBpZ25vcmUgZGlnaXRzIGFmdGVyIGEgXy4gVGhpcyBpcwotICAgICAgICAgIC8vIGJlY2F1c2UgVGhpc0V4YW1wbGUzIHdvdWxkIGJlIGNvbnZlcnRlZCB0byB0aGlzX2V4YW1wbGVfMyBpbiB0aGUKLSAgICAgICAgICAvLyBDYW1lbFRvU25ha2UgY29udmVyc2lvbiwgYW5kIHRoZW4gZGFzaGVyIHdvdWxkIGRvIHRoaXMtZXhhbXBsZS0zLAotICAgICAgICAgIC8vIGJ1dCBpdCBleHBlY3RzIHRoaXMtZXhhbXBsZTMuCi0gICAgICAgICAgIShpICsgMSA8IGlucHV0Lmxlbmd0aCgpICYmIGlzZGlnaXQoaW5wdXRbaSArIDFdKSkpCi0gICAgICAgIHMgKz0gIi0iOwotICAgIH0gZWxzZSB7Ci0gICAgICBzICs9IGM7Ci0gICAgfQotICAgIHAgPSBjOwotICB9Ci0gIHJldHVybiBzOwotfQotCi19ICAvLyBuYW1lc3BhY2UKLQogc3RkOjpzdHJpbmcgQ29udmVydENhc2UoY29uc3Qgc3RkOjpzdHJpbmcgJmlucHV0LCBDYXNlIG91dHB1dF9jYXNlLAogICAgICAgICAgICAgICAgICAgICAgICAgQ2FzZSBpbnB1dF9jYXNlKSB7CiAgIGlmIChvdXRwdXRfY2FzZSA9PSBDYXNlOjprS2VlcCkgcmV0dXJuIGlucHV0OwpAQCAtNDQwLDYgKzQ1Miw3IEBACiAgICAgY2FzZSBDYXNlOjprQWxsVXBwZXI6IHJldHVybiBUb0FsbChpbnB1dCwgQ2hhclRvVXBwZXIpOwogICAgIGNhc2UgQ2FzZTo6a0FsbExvd2VyOiByZXR1cm4gVG9BbGwoaW5wdXQsIENoYXJUb0xvd2VyKTsKICAgICBjYXNlIENhc2U6OmtEYXNoZXI6IHJldHVybiBUb0Rhc2hlcihpbnB1dCk7CisgICAgY2FzZSBDYXNlOjprU25ha2UyOiByZXR1cm4gU25ha2VUb1NuYWtlMihpbnB1dCk7CiAgICAgZGVmYXVsdDoKICAgICBjYXNlIENhc2U6OmtVbmtub3duOiByZXR1cm4gaW5wdXQ7CiAgIH0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3N3aWZ0L0JVSUxELmJhemVsIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvc3dpZnQvQlVJTEQuYmF6ZWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2JiZjI5OAotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3N3aWZ0L0JVSUxELmJhemVsCkBAIC0wLDAgKzEsOCBAQAorbG9hZCgiQGJ1aWxkX2JhemVsX3J1bGVzX3N3aWZ0Ly9zd2lmdDpzd2lmdC5iemwiLCAic3dpZnRfbGlicmFyeSIpCisKK3N3aWZ0X2xpYnJhcnkoCisgICAgbmFtZSA9ICJzd2lmdCIsCisgICAgc3JjcyA9IGdsb2IoWyJTb3VyY2VzL0ZsYXRCdWZmZXJzLyouc3dpZnQiXSksCisgICAgbW9kdWxlX25hbWUgPSAiRmxhdEJ1ZmZlcnMiLAorICAgIHZpc2liaWxpdHkgPSBbIi8vdmlzaWJpbGl0eTpwdWJsaWMiXSwKKykKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3N3aWZ0L0ZsYXRCdWZmZXJzLnBvZHNwZWMgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy9zd2lmdC9GbGF0QnVmZmVycy5wb2RzcGVjCmluZGV4IDAxMTk1MjkuLmMyNmQxYTIgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3N3aWZ0L0ZsYXRCdWZmZXJzLnBvZHNwZWMKKysrIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvc3dpZnQvRmxhdEJ1ZmZlcnMucG9kc3BlYwpAQCAtMSw2ICsxLDYgQEAKIFBvZDo6U3BlYy5uZXcgZG8gfHN8CiAgIHMubmFtZSAgICAgICAgICAgICA9ICdGbGF0QnVmZmVycycKLSAgcy52ZXJzaW9uICAgICAgICAgID0gJzIuMC4wJworICBzLnZlcnNpb24gICAgICAgICAgPSAnMi4wLjgnCiAgIHMuc3VtbWFyeSAgICAgICAgICA9ICdGbGF0QnVmZmVyczogTWVtb3J5IEVmZmljaWVudCBTZXJpYWxpemF0aW9uIExpYnJhcnknCiAKICAgcy5kZXNjcmlwdGlvbiAgICAgID0gIkZsYXRCdWZmZXJzIGlzIGEgY3Jvc3MgcGxhdGZvcm0gc2VyaWFsaXphdGlvbiBsaWJyYXJ5IGFyY2hpdGVjdGVkIGZvcgpAQCAtMTcsNSArMTcsNSBAQAogICBzLm9zeC5kZXBsb3ltZW50X3RhcmdldCA9ICcxMC4xNCcKIAogICBzLnN3aWZ0X3ZlcnNpb24gPSAnNS4wJwotICBzLnNvdXJjZV9maWxlcyA9ICdTb3VyY2VzLyoqLyonCisgIHMuc291cmNlX2ZpbGVzID0gJ1NvdXJjZXMvRmxhdGJ1ZmZlcnMvKi5zd2lmdCcKIGVuZApkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvc3dpZnQvU291cmNlcy9GbGF0QnVmZmVycy9CeXRlQnVmZmVyLnN3aWZ0IGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvc3dpZnQvU291cmNlcy9GbGF0QnVmZmVycy9CeXRlQnVmZmVyLnN3aWZ0CmluZGV4IGEwN2Y2NmEuLmZlYWQ2NWUgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3N3aWZ0L1NvdXJjZXMvRmxhdEJ1ZmZlcnMvQnl0ZUJ1ZmZlci5zd2lmdAorKysgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy9zd2lmdC9Tb3VyY2VzL0ZsYXRCdWZmZXJzL0J5dGVCdWZmZXIuc3dpZnQKQEAgLTE0LDcgKzE0LDExIEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCisjaWYgIW9zKFdBU0kpCiBpbXBvcnQgRm91bmRhdGlvbgorI2Vsc2UKK2ltcG9ydCBTd2lmdE92ZXJsYXlTaGltcworI2VuZGlmCiAKIC8vLyBgQnl0ZUJ1ZmZlcmAgaXMgdGhlIGludGVyZmFjZSB0aGF0IHN0b3JlcyB0aGUgZGF0YSBmb3IgYSBgRmxhdGJ1ZmZlcnNgIG9iamVjdAogLy8vIGl0IGFsbG93cyB1c2VycyB0byB3cml0ZSBhbmQgcmVhZCBkYXRhIGRpcmVjdGx5IGZyb20gbWVtb3J5IHRodXMgdGhlIHVzZSBvZiBpdHMKQEAgLTEyNSw2ICsxMjksNyBAQAogICAgIH0KICAgfQogCisgICNpZiAhb3MoV0FTSSkKICAgLy8vIENvbnN0cnVjdG9yIHRoYXQgY3JlYXRlcyBhIEZsYXRidWZmZXIgZnJvbSB0aGUgU3dpZnQgRGF0YSB0eXBlIG9iamVjdAogICAvLy8gLSBQYXJhbWV0ZXIgZGF0YTogU3dpZnQgZGF0YSBPYmplY3QKICAgcHVibGljIGluaXQoZGF0YTogRGF0YSkgewpAQCAtMTM1LDYgKzE0MCw3IEBACiAgICAgICBzZWxmLl9zdG9yYWdlLmNvcHkoZnJvbTogYnVmZmVyUG9pbnRlci5iYXNlQWRkcmVzcyEsIGNvdW50OiBkYXRhLmNvdW50KQogICAgIH0KICAgfQorICAjZW5kaWYKIAogICAvLy8gQ29uc3RydWN0b3IgdGhhdCBjcmVhdGVzIGEgRmxhdGJ1ZmZlciBpbnN0YW5jZSB3aXRoIGEgc2l6ZQogICAvLy8gLSBQYXJhbWV0ZXIgc2l6ZTogTGVuZ3RoIG9mIHRoZSBidWZmZXIKQEAgLTE0NCw3ICsxNTAsNyBAQAogICAgIF9zdG9yYWdlLmluaXRpYWxpemUoZm9yOiBzaXplKQogICB9CiAKLSAgI2lmIHN3aWZ0KD49NS4wKQorICAjaWYgc3dpZnQoPj01LjApICYmICFvcyhXQVNJKQogICAvLy8gQ29uc3RydWN0b3IgdGhhdCBjcmVhdGVzIGEgRmxhdGJ1ZmZlciBvYmplY3QgZnJvbSBhIENvbnRpZ3VvdXNCeXRlcwogICAvLy8gLSBQYXJhbWV0ZXJzOgogICAvLy8gICAtIGNvbnRpZ3VvdXNCeXRlczogQmluYXJ5IHN0cmlwZSB0byB1c2UgYXMgdGhlIGJ1ZmZlcgpAQCAtMTk5LDYgKzIwNSw3IEBACiAKICAgLy8vIEZpbGxzIHRoZSBidWZmZXIgd2l0aCBwYWRkaW5nIGJ5IGFkZGluZyB0byB0aGUgd3JpdGVyc2l6ZQogICAvLy8gLSBQYXJhbWV0ZXIgcGFkZGluZzogQW1vdW50IG9mIHBhZGRpbmcgYmV0d2VlbiB0d28gdG8gYmUgc2VyaWFsaXplZCBvYmplY3RzCisgIEBpbmxpbmUoX19hbHdheXMpCiAgIEB1c2FibGVGcm9tSW5saW5lCiAgIG11dGF0aW5nIGZ1bmMgZmlsbChwYWRkaW5nOiBJbnQpIHsKICAgICBhc3NlcnQocGFkZGluZyA+PSAwLCAiRmlsbCBzaG91bGQgYmUgbGFyZ2VyIHRoYW4gb3IgZXF1YWwgdG8gemVybyIpCkBAIC0yMDgsNiArMjE1LDcgQEAKIAogICAvLy8gQWRkcyBhbiBhcnJheSBvZiB0eXBlIFNjYWxhciB0byB0aGUgYnVmZmVyIG1lbW9yeQogICAvLy8gLSBQYXJhbWV0ZXIgZWxlbWVudHM6IEFuIGFycmF5IG9mIFNjYWxhcnMKKyAgQGlubGluZShfX2Fsd2F5cykKICAgQHVzYWJsZUZyb21JbmxpbmUKICAgbXV0YXRpbmcgZnVuYyBwdXNoPFQ6IFNjYWxhcj4oZWxlbWVudHM6IFtUXSkgewogICAgIGxldCBzaXplID0gZWxlbWVudHMuY291bnQgJiogTWVtb3J5TGF5b3V0PFQ+LnNpemUKQEAgLTIyMSw2ICsyMjksNyBAQAogICAvLy8gLSBQYXJhbWV0ZXJzOgogICAvLy8gICAtIHZhbHVlOiBPYmplY3QgIHRoYXQgd2lsbCBiZSB3cml0dGVuIHRvIHRoZSBidWZmZXIKICAgLy8vICAgLSBzaXplOiBzaXplIHRvIHN1YnRyYWN0IGZyb20gdGhlIFdyaXRlckluZGV4CisgIEB1c2FibGVGcm9tSW5saW5lCiAgIEBpbmxpbmUoX19hbHdheXMpCiAgIG11dGF0aW5nIGZ1bmMgcHVzaDxUOiBOYXRpdmVTdHJ1Y3Q+KHN0cnVjdCB2YWx1ZTogVCwgc2l6ZTogSW50KSB7CiAgICAgZW5zdXJlU3BhY2Uoc2l6ZTogc2l6ZSkKQEAgLTIzMyw2ICsyNDIsNyBAQAogICAvLy8gLSBQYXJhbWV0ZXJzOgogICAvLy8gICAtIHZhbHVlOiBPYmplY3QgIHRoYXQgd2lsbCBiZSB3cml0dGVuIHRvIHRoZSBidWZmZXIKICAgLy8vICAgLSBsZW46IE9mZnNldCB0byBzdWJ0cmFjdCBmcm9tIHRoZSBXcml0ZXJJbmRleAorICBAaW5saW5lKF9fYWx3YXlzKQogICBAdXNhYmxlRnJvbUlubGluZQogICBtdXRhdGluZyBmdW5jIHB1c2g8VDogU2NhbGFyPih2YWx1ZTogVCwgbGVuOiBJbnQpIHsKICAgICBlbnN1cmVTcGFjZShzaXplOiBsZW4pCkBAIC0yNDQsNiArMjU0LDcgQEAKICAgLy8vIEFkZHMgYSBzdHJpbmcgdG8gdGhlIGJ1ZmZlciB1c2luZyBzd2lmdC51dGY4IG9iamVjdAogICAvLy8gLSBQYXJhbWV0ZXIgc3RyOiBTdHJpbmcgdGhhdCB3aWxsIGJlIGFkZGVkIHRvIHRoZSBidWZmZXIKICAgLy8vIC0gUGFyYW1ldGVyIGxlbjogbGVuZ3RoIG9mIHRoZSBzdHJpbmcKKyAgQGlubGluZShfX2Fsd2F5cykKICAgQHVzYWJsZUZyb21JbmxpbmUKICAgbXV0YXRpbmcgZnVuYyBwdXNoKHN0cmluZyBzdHI6IFN0cmluZywgbGVuOiBJbnQpIHsKICAgICBlbnN1cmVTcGFjZShzaXplOiBsZW4pCkBAIC0yNjMsNiArMjc0LDcgQEAKICAgLy8vIC0gUGFyYW1ldGVyczoKICAgLy8vICAgLSBieXRlczogUG9pbnRlciB0byB0aGUgdmlldwogICAvLy8gICAtIGxlbjogU2l6ZSBvZiBzdHJpbmcKKyAgQHVzYWJsZUZyb21JbmxpbmUKICAgQGlubGluZShfX2Fsd2F5cykKICAgbXV0YXRpbmcgZnVuYyBwdXNoKAogICAgIGJ5dGVzOiBVbnNhZmVCdWZmZXJQb2ludGVyPFN0cmluZy5VVEY4Vmlldy5FbGVtZW50PiwKQEAgLTI4NCw2ICsyOTYsNyBAQAogICAvLy8gICAtIHZhbHVlOiBWYWx1ZSB0aGF0IG5lZWRzIHRvIGJlIHdyaXR0ZW4gdG8gdGhlIGJ1ZmZlcgogICAvLy8gICAtIGluZGV4OiBpbmRleCB0byB3cml0ZSB0bwogICAvLy8gICAtIGRpcmVjdDogU2hvdWxkIHRha2UgaW50byBjb25zaWRlcmF0aW9uIHRoZSBjYXBhY2l0eSBvZiB0aGUgYnVmZmVyCisgIEBpbmxpbmUoX19hbHdheXMpCiAgIGZ1bmMgd3JpdGU8VD4odmFsdWU6IFQsIGluZGV4OiBJbnQsIGRpcmVjdDogQm9vbCA9IGZhbHNlKSB7CiAgICAgdmFyIGluZGV4ID0gaW5kZXgKICAgICBpZiAhZGlyZWN0IHsKQEAgLTI5Nyw2ICszMTAsNyBAQAogICAvLy8gTWFrZXMgc3VyZSB0aGF0IGJ1ZmZlciBoYXMgZW5vdWNoIHNwYWNlIGZvciBlYWNoIG9mIHRoZSBvYmplY3RzIHRoYXQgd2lsbCBiZSB3cml0dGVuIGludG8gaXQKICAgLy8vIC0gUGFyYW1ldGVyIHNpemU6IHNpemUgb2Ygb2JqZWN0CiAgIEBkaXNjYXJkYWJsZVJlc3VsdAorICBAdXNhYmxlRnJvbUlubGluZQogICBAaW5saW5lKF9fYWx3YXlzKQogICBtdXRhdGluZyBmdW5jIGVuc3VyZVNwYWNlKHNpemU6IEludCkgLT4gSW50IHsKICAgICBpZiBzaXplICYrIF93cml0ZXJTaXplID4gX3N0b3JhZ2UuY2FwYWNpdHkgewpAQCAtMzA4LDYgKzMyMiw3IEBACiAKICAgLy8vIHBvcHMgdGhlIHdyaXR0ZW4gVlRhYmxlIGlmIGl0J3MgYWxyZWFkeSB3cml0dGVuIGludG8gdGhlIGJ1ZmZlcgogICAvLy8gLSBQYXJhbWV0ZXIgc2l6ZTogc2l6ZSBvZiB0aGUgYFZUYWJsZWAKKyAgQHVzYWJsZUZyb21JbmxpbmUKICAgQGlubGluZShfX2Fsd2F5cykKICAgbXV0YXRpbmcgZnVuYyBwb3AoXyBzaXplOiBJbnQpIHsKICAgICBhc3NlcnQoCkBAIC0zMTgsMTEgKzMzMywxMyBAQAogICB9CiAKICAgLy8vIENsZWFycyB0aGUgY3VycmVudCBzaXplIG9mIHRoZSBidWZmZXIKKyAgQGlubGluZShfX2Fsd2F5cykKICAgbXV0YXRpbmcgcHVibGljIGZ1bmMgY2xlYXJTaXplKCkgewogICAgIF93cml0ZXJTaXplID0gMAogICB9CiAKICAgLy8vIENsZWFycyB0aGUgY3VycmVudCBpbnN0YW5jZSBvZiB0aGUgYnVmZmVyLCByZXBsYWNpbmcgaXQgd2l0aCBuZXcgbWVtb3J5CisgIEBpbmxpbmUoX19hbHdheXMpCiAgIG11dGF0aW5nIHB1YmxpYyBmdW5jIGNsZWFyKCkgewogICAgIF93cml0ZXJTaXplID0gMAogICAgIGFsaWdubWVudCA9IDEKQEAgLTMzMyw2ICszNTAsNyBAQAogICAvLy8gLSBQYXJhbWV0ZXJzOgogICAvLy8gICAtIGRlZjogVHlwZSBvZiB0aGUgb2JqZWN0CiAgIC8vLyAgIC0gcG9zaXRpb246IHRoZSBpbmRleCBvZiB0aGUgb2JqZWN0IGluIHRoZSBidWZmZXIKKyAgQGlubGluZShfX2Fsd2F5cykKICAgcHVibGljIGZ1bmMgcmVhZDxUPihkZWY6IFQuVHlwZSwgcG9zaXRpb246IEludCkgLT4gVCB7CiAgICAgX3N0b3JhZ2UubWVtb3J5LmFkdmFuY2VkKGJ5OiBwb3NpdGlvbikubG9hZChhczogVC5zZWxmKQogICB9CkBAIC0zNTUsMTEgKzM3MywxMyBAQAogICAgIHJldHVybiBBcnJheShhcnJheSkKICAgfQogCisgICNpZiAhb3MoV0FTSSkKICAgLy8vIFJlYWRzIGEgc3RyaW5nIGZyb20gdGhlIGJ1ZmZlciBhbmQgZW5jb2RlcyBpdCB0byBhIHN3aWZ0IHN0cmluZwogICAvLy8gLSBQYXJhbWV0ZXJzOgogICAvLy8gICAtIGluZGV4OiBpbmRleCBvZiB0aGUgc3RyaW5nIGluIHRoZSBidWZmZXIKICAgLy8vICAgLSBjb3VudDogbGVuZ3RoIG9mIHRoZSBzdHJpbmcKICAgLy8vICAgLSB0eXBlOiBFbmNvZGluZyBvZiB0aGUgc3RyaW5nCisgIEBpbmxpbmUoX19hbHdheXMpCiAgIHB1YmxpYyBmdW5jIHJlYWRTdHJpbmcoCiAgICAgYXQgaW5kZXg6IEludCwKICAgICBjb3VudDogSW50LApAQCAtMzczLDkgKzM5MywzMCBAQAogICAgIGxldCBidWZwcnQgPSBVbnNhZmVCdWZmZXJQb2ludGVyKHN0YXJ0OiBzdGFydCwgY291bnQ6IGNvdW50KQogICAgIHJldHVybiBTdHJpbmcoYnl0ZXM6IEFycmF5KGJ1ZnBydCksIGVuY29kaW5nOiB0eXBlKQogICB9CisgICNlbHNlCisgIC8vLyBSZWFkcyBhIHN0cmluZyBmcm9tIHRoZSBidWZmZXIgYW5kIGVuY29kZXMgaXQgdG8gYSBzd2lmdCBzdHJpbmcKKyAgLy8vIC0gUGFyYW1ldGVyczoKKyAgLy8vICAgLSBpbmRleDogaW5kZXggb2YgdGhlIHN0cmluZyBpbiB0aGUgYnVmZmVyCisgIC8vLyAgIC0gY291bnQ6IGxlbmd0aCBvZiB0aGUgc3RyaW5nCisgIC8vLyAgIC0gdHlwZTogRW5jb2Rpbmcgb2YgdGhlIHN0cmluZworICBAaW5saW5lKF9fYWx3YXlzKQorICBwdWJsaWMgZnVuYyByZWFkU3RyaW5nKAorICAgIGF0IGluZGV4OiBJbnQsCisgICAgY291bnQ6IEludCkgLT4gU3RyaW5nPworICB7CisgICAgYXNzZXJ0KAorICAgICAgaW5kZXggKyBjb3VudCA8PSBfc3RvcmFnZS5jYXBhY2l0eSwKKyAgICAgICJSZWFkaW5nIG91dCBvZiBib3VuZHMgaXMgaWxsZWdhbCIpCisgICAgbGV0IHN0YXJ0ID0gX3N0b3JhZ2UubWVtb3J5LmFkdmFuY2VkKGJ5OiBpbmRleCkKKyAgICAgIC5hc3N1bWluZ01lbW9yeUJvdW5kKHRvOiBVSW50OC5zZWxmKQorICAgIGxldCBidWZwcnQgPSBVbnNhZmVCdWZmZXJQb2ludGVyKHN0YXJ0OiBzdGFydCwgY291bnQ6IGNvdW50KQorICAgIHJldHVybiBTdHJpbmcoY1N0cmluZzogYnVmcHJ0LmJhc2VBZGRyZXNzISkKKyAgfQorICAjZW5kaWYKIAogICAvLy8gQ3JlYXRlcyBhIG5ldyBGbGF0YnVmZmVyIG9iamVjdCB0aGF0J3MgZHVwbGljYXRlZCBmcm9tIHRoZSBjdXJyZW50IG9uZQogICAvLy8gLSBQYXJhbWV0ZXIgcmVtb3ZlQnl0ZXM6IHRoZSBhbW91bnQgb2YgYnl0ZXMgdG8gcmVtb3ZlIGZyb20gdGhlIGN1cnJlbnQgU2l6ZQorICBAaW5saW5lKF9fYWx3YXlzKQogICBwdWJsaWMgZnVuYyBkdXBsaWNhdGUocmVtb3ZpbmcgcmVtb3ZlQnl0ZXM6IEludCA9IDApIC0+IEJ5dGVCdWZmZXIgewogICAgIGFzc2VydChyZW1vdmVCeXRlcyA+IDAsICJDYW4gTk9UIHJlbW92ZSBuZWdhdGl2ZSBieXRlcyIpCiAgICAgYXNzZXJ0KApAQCAtNDAwLDEwICs0NDEsMTQgQEAKICAgLy8vIFNraXBQcmVmaXggU2tpcHMgdGhlIGZpcnN0IDQgYnl0ZXMgaW4gY2FzZSBvbmUgb2YgdGhlIGZvbGxvd2luZwogICAvLy8gZnVuY3Rpb25zIGFyZSBjYWxsZWQgYGdldFByZWZpeGVkU2l6ZUNoZWNrZWRSb290YCAmIGBnZXRQcmVmaXhlZFNpemVSb290YAogICAvLy8gd2hpY2ggYWxsb3dzIHVzIHRvIHNraXAgdGhlIGZpcnN0IDQgYnl0ZXMgaW5zdGVhZCBvZiByZWNyZWF0aW5nIHRoZSBidWZmZXIKKyAgQGRpc2NhcmRhYmxlUmVzdWx0CiAgIEB1c2FibGVGcm9tSW5saW5lCi0gIG11dGF0aW5nIGZ1bmMgc2tpcFByZWZpeCgpIHsKKyAgQGlubGluZShfX2Fsd2F5cykKKyAgbXV0YXRpbmcgZnVuYyBza2lwUHJlZml4KCkgLT4gSW50MzIgewogICAgIF93cml0ZXJTaXplID0gX3dyaXRlclNpemUgJi0gTWVtb3J5TGF5b3V0PEludDMyPi5zaXplCisgICAgcmV0dXJuIHJlYWQoZGVmOiBJbnQzMi5zZWxmLCBwb3NpdGlvbjogMCkKICAgfQorCiB9CiAKIGV4dGVuc2lvbiBCeXRlQnVmZmVyOiBDdXN0b21EZWJ1Z1N0cmluZ0NvbnZlcnRpYmxlIHsKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3N3aWZ0L1NvdXJjZXMvRmxhdEJ1ZmZlcnMvQ29uc3RhbnRzLnN3aWZ0IGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvc3dpZnQvU291cmNlcy9GbGF0QnVmZmVycy9Db25zdGFudHMuc3dpZnQKaW5kZXggOGU2NDNmZC4uYTJhMTA4MiAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvc3dpZnQvU291cmNlcy9GbGF0QnVmZmVycy9Db25zdGFudHMuc3dpZnQKKysrIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvc3dpZnQvU291cmNlcy9GbGF0QnVmZmVycy9Db25zdGFudHMuc3dpZnQKQEAgLTE0LDE1ICsxNCwyMSBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAotI2lmIG9zKExpbnV4KQotaW1wb3J0IENvcmVGb3VuZGF0aW9uCisjaWYgIW9zKFdBU0kpCisgICNpZiBvcyhMaW51eCkKKyAgaW1wb3J0IENvcmVGb3VuZGF0aW9uCisgICNlbHNlCisgIGltcG9ydCBGb3VuZGF0aW9uCisgICNlbmRpZgogI2Vsc2UKLWltcG9ydCBGb3VuZGF0aW9uCitpbXBvcnQgU3dpZnRPdmVybGF5U2hpbXMKICNlbmRpZgogCiAvLy8gQSBib29sZWFuIHRvIHNlZSBpZiB0aGUgc3lzdGVtIGlzIGxpdHRsZUVuZGlhbgotbGV0IGlzTGl0dGVFbmRpYW4gPSBDRkJ5dGVPcmRlckdldEN1cnJlbnQoKSA9PQotICBJbnQoQ0ZCeXRlT3JkZXJMaXR0bGVFbmRpYW4ucmF3VmFsdWUpCitsZXQgaXNMaXR0ZUVuZGlhbjogQm9vbCA9IHsKKyAgbGV0IG51bWJlcjogVUludDMyID0gMHgxMjM0NTY3OAorICByZXR1cm4gbnVtYmVyID09IG51bWJlci5saXR0bGVFbmRpYW4KK30oKQogLy8vIENvbnN0YW50IGZvciB0aGUgZmlsZSBpZCBsZW5ndGgKIGxldCBGaWxlSWRMZW5ndGggPSA0CiAvLy8gVHlwZSBhbGlhc2VzCkBAIC0xMTMsNCArMTE5LDQgQEAKICAgcHVibGljIHR5cGVhbGlhcyBOdW1lcmljVmFsdWUgPSBVSW50NjQKIH0KIAotcHVibGljIGZ1bmMgRmxhdEJ1ZmZlcnNWZXJzaW9uXzJfMF8wKCkge30KK3B1YmxpYyBmdW5jIEZsYXRCdWZmZXJzVmVyc2lvbl8yXzBfOCgpIHt9CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy9zd2lmdC9Tb3VyY2VzL0ZsYXRCdWZmZXJzL0VudW0uc3dpZnQgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy9zd2lmdC9Tb3VyY2VzL0ZsYXRCdWZmZXJzL0VudW0uc3dpZnQKaW5kZXggZWZiNjk4Yi4uZjBlOTlmMyAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvc3dpZnQvU291cmNlcy9GbGF0QnVmZmVycy9FbnVtLnN3aWZ0CisrKyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3N3aWZ0L1NvdXJjZXMvRmxhdEJ1ZmZlcnMvRW51bS5zd2lmdApAQCAtMTQsNyArMTQsMTEgQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKKyNpZiAhb3MoV0FTSSkKIGltcG9ydCBGb3VuZGF0aW9uCisjZWxzZQoraW1wb3J0IFN3aWZ0T3ZlcmxheVNoaW1zCisjZW5kaWYKIAogLy8vIEVudW0gaXMgYSBwcm90b2NvbCB0aGF0IGFsbCBmbGF0YnVmZmVycyBlbnVtcyBzaG91bGQgY29uZm9ybSB0bwogLy8vIFNpbmNlIGl0IGFsbG93cyB1cyB0byBnZXQgdGhlIGFjdHVhbCBgQnl0ZVNpemVgIGFuZCBgVmFsdWVgIGZyb20KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3N3aWZ0L1NvdXJjZXMvRmxhdEJ1ZmZlcnMvRmxhdEJ1ZmZlckJ1aWxkZXIuc3dpZnQgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy9zd2lmdC9Tb3VyY2VzL0ZsYXRCdWZmZXJzL0ZsYXRCdWZmZXJCdWlsZGVyLnN3aWZ0CmluZGV4IDVjY2M3ZTQuLmJmZTM2MTUgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3N3aWZ0L1NvdXJjZXMvRmxhdEJ1ZmZlcnMvRmxhdEJ1ZmZlckJ1aWxkZXIuc3dpZnQKKysrIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvc3dpZnQvU291cmNlcy9GbGF0QnVmZmVycy9GbGF0QnVmZmVyQnVpbGRlci5zd2lmdApAQCAtMTQsNyArMTQsMTEgQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKKyNpZiAhb3MoV0FTSSkKIGltcG9ydCBGb3VuZGF0aW9uCisjZWxzZQoraW1wb3J0IFN3aWZ0T3ZlcmxheVNoaW1zCisjZW5kaWYKIAogLy8vIGBgRmxhdEJ1ZmZlckJ1aWxkZXJgYCBidWlsZHMgYSBgRmxhdEJ1ZmZlcmAgdGhyb3VnaCBtYW5pcHVsYXRpbmcgaXRzIGludGVybmFsIHN0YXRlLgogLy8vCkBAIC01NSw2ICs1OSw3IEBACiAgIC8vLyBHaXZlcyBhIHJlYWQgYWNjZXNzIHRvIHRoZSBidWZmZXIncyBzaXplCiAgIHB1YmxpYyB2YXIgc2l6ZTogVU9mZnNldCB7IF9iYi5zaXplIH0KIAorICAjaWYgIW9zKFdBU0kpCiAgIC8vLyBEYXRhIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBidWZmZXIKICAgLy8vCiAgIC8vLyBTaG91bGQgb25seSBiZSB1c2VkIGFmdGVyIGBgZmluaXNoKG9mZnNldDphZGRQcmVmaXg6KWBgIGlzIGNhbGxlZApAQCAtNjQsNiArNjksNyBAQAogICAgICAgYnl0ZXM6IF9iYi5tZW1vcnkuYWR2YW5jZWQoYnk6IF9iYi53cml0ZXJJbmRleCksCiAgICAgICBjb3VudDogX2JiLmNhcGFjaXR5ICYtIF9iYi53cml0ZXJJbmRleCkKICAgfQorICAjZW5kaWYKIAogICAvLy8gUmV0dXJucyB0aGUgdW5kZXJseWluZyBieXRlcyBpbiB0aGUgYGBCeXRlQnVmZmVyYGAKICAgLy8vCkBAIC0xMjcsOCArMTMzLDggQEAKICAgbXV0YXRpbmcgcHVibGljIGZ1bmMgY2xlYXIoKSB7CiAgICAgX21pbkFsaWdubWVudCA9IDAKICAgICBpc05lc3RlZCA9IGZhbHNlCi0gICAgc3RyaW5nT2Zmc2V0TWFwID0gWzpdCi0gICAgX3Z0YWJsZXMgPSBbXQorICAgIHN0cmluZ09mZnNldE1hcC5yZW1vdmVBbGwoa2VlcGluZ0NhcGFjaXR5OiB0cnVlKQorICAgIF92dGFibGVzLnJlbW92ZUFsbChrZWVwaW5nQ2FwYWNpdHk6IHRydWUpCiAgICAgX3Z0YWJsZVN0b3JhZ2UuY2xlYXIoKQogICAgIF9iYi5jbGVhcigpCiAgIH0KQEAgLTE0Miw2ICsxNDgsNyBAQAogICAvLy8KICAgLy8vICpOT1RFOiBOZXZlciBjYWxsIHRoaXMgZnVuY3Rpb24sIHRoaXMgaXMgb25seSBzdXBwb3NlZCB0byBiZSBjYWxsZWQKICAgLy8vIGJ5IHRoZSBnZW5lcmF0ZWQgY29kZSoKKyAgQGlubGluZShfX2Fsd2F5cykKICAgbXV0YXRpbmcgcHVibGljIGZ1bmMgcmVxdWlyZSh0YWJsZTogT2Zmc2V0LCBmaWVsZHM6IFtJbnQzMl0pIHsKICAgICBmb3IgZmllbGQgaW4gZmllbGRzIHsKICAgICAgIGxldCBzdGFydCA9IF9iYi5jYXBhY2l0eSAmLSBJbnQodGFibGUubykKQEAgLTIyOCw2ICsyMzUsNyBAQAogICAvLy8gYGBgCiAgIC8vLyAtIFBhcmFtZXRlciBudW1PZkZpZWxkczogTnVtYmVyIG9mIGVsZW1lbnRzIHRvIGJlIHdyaXR0ZW4gdG8gdGhlIGJ1ZmZlcgogICAvLy8gLSBSZXR1cm5zOiBPZmZzZXQgb2YgdGhlIG5ld2x5IHN0YXJ0ZWQgdGFibGUKKyAgQGlubGluZShfX2Fsd2F5cykKICAgbXV0YXRpbmcgcHVibGljIGZ1bmMgc3RhcnRUYWJsZSh3aXRoIG51bU9mRmllbGRzOiBJbnQpIC0+IFVPZmZzZXQgewogICAgIG5vdE5lc3RlZCgpCiAgICAgaXNOZXN0ZWQgPSB0cnVlCkBAIC0zMDcsNiArMzE1LDcgQEAKICAgLy8gTUFSSzogLSBCdWlsZHMgQnVmZmVyCiAKICAgLy8vIEFzc2VydHMgdG8gc2VlIGlmIHRoZSBvYmplY3QgaXMgbm90IG5lc3RlZAorICBAaW5saW5lKF9fYWx3YXlzKQogICBAdXNhYmxlRnJvbUlubGluZQogICBtdXRhdGluZyBpbnRlcm5hbCBmdW5jIG5vdE5lc3RlZCgpICB7CiAgICAgYXNzZXJ0KCFpc05lc3RlZCwgIk9iamVjdCBzZXJpYWxpemF0aW9uIG11c3Qgbm90IGJlIG5lc3RlZCIpCkBAIC0zMTUsNiArMzI0LDcgQEAKICAgLy8vIENoYW5nZXMgdGhlIG1pbmltdWltIGFsaWdubWVudCBvZiB0aGUgYnVmZmVyCiAgIC8vLyAtIFBhcmFtZXRlciBzaXplOiBzaXplIG9mIHRoZSBjdXJyZW50IGFsaWdubWVudAogICBAaW5saW5lKF9fYWx3YXlzKQorICBAdXNhYmxlRnJvbUlubGluZQogICBtdXRhdGluZyBpbnRlcm5hbCBmdW5jIG1pbkFsaWdubWVudChzaXplOiBJbnQpIHsKICAgICBpZiBzaXplID4gX21pbkFsaWdubWVudCB7CiAgICAgICBfbWluQWxpZ25tZW50ID0gc2l6ZQpAQCAtMzI2LDYgKzMzNiw3IEBACiAgIC8vLyAgIC0gYnVmU2l6ZTogQ3VycmVudCBzaXplIG9mIHRoZSBidWZmZXIgKyB0aGUgb2Zmc2V0IG9mIHRoZSBvYmplY3QgdG8gYmUgd3JpdHRlbgogICAvLy8gICAtIGVsZW1lbnRTaXplOiBFbGVtZW50IHNpemUKICAgQGlubGluZShfX2Fsd2F5cykKKyAgQHVzYWJsZUZyb21JbmxpbmUKICAgbXV0YXRpbmcgaW50ZXJuYWwgZnVuYyBwYWRkaW5nKAogICAgIGJ1ZlNpemU6IFVJbnQzMiwKICAgICBlbGVtZW50U2l6ZTogVUludDMyKSAtPiBVSW50MzIKQEAgLTMzNyw2ICszNDgsNyBAQAogICAvLy8gLSBQYXJhbWV0ZXJzOgogICAvLy8gICAtIGxlbjpMZW5ndGggb2YgdGhlIG9iamVjdAogICAvLy8gICAtIGFsaWdubWVudDogQWxpZ25tZW50IHR5cGUKKyAgQGlubGluZShfX2Fsd2F5cykKICAgQHVzYWJsZUZyb21JbmxpbmUKICAgbXV0YXRpbmcgaW50ZXJuYWwgZnVuYyBwcmVBbGlnbihsZW46IEludCwgYWxpZ25tZW50OiBJbnQpIHsKICAgICBtaW5BbGlnbm1lbnQoc2l6ZTogYWxpZ25tZW50KQpAQCAtMzQ5LDYgKzM2MSw3IEBACiAgIC8vLyAtIFBhcmFtZXRlcnM6CiAgIC8vLyAgIC0gbGVuOiBMZW5ndGggb2YgdGhlIG9iamVjdAogICAvLy8gICAtIHR5cGU6IFR5cGUgb2YgdGhlIG9iamVjdCB0byBiZSB3cml0dGVuCisgIEBpbmxpbmUoX19hbHdheXMpCiAgIEB1c2FibGVGcm9tSW5saW5lCiAgIG11dGF0aW5nIGludGVybmFsIGZ1bmMgcHJlQWxpZ248VDogU2NhbGFyPihsZW46IEludCwgdHlwZTogVC5UeXBlKSB7CiAgICAgcHJlQWxpZ24obGVuOiBsZW4sIGFsaWdubWVudDogTWVtb3J5TGF5b3V0PFQ+LnNpemUpCkBAIC0zNTYsNiArMzY5LDcgQEAKIAogICAvLy8gUmVmZXJzIHRvIGFuIG9iamVjdCB0aGF0J3Mgd3JpdHRlbiBpbiB0aGUgYnVmZmVyCiAgIC8vLyAtIFBhcmFtZXRlciBvZmY6IHRoZSBvYmplY3RzIGluZGV4IHZhbHVlCisgIEBpbmxpbmUoX19hbHdheXMpCiAgIEB1c2FibGVGcm9tSW5saW5lCiAgIG11dGF0aW5nIGludGVybmFsIGZ1bmMgcmVmZXIodG8gb2ZmOiBVT2Zmc2V0KSAtPiBVT2Zmc2V0IHsKICAgICBsZXQgc2l6ZSA9IE1lbW9yeUxheW91dDxVT2Zmc2V0Pi5zaXplCkBAIC0zNjcsNiArMzgxLDcgQEAKICAgLy8vIC0gUGFyYW1ldGVyczoKICAgLy8vICAgLSBvZmZzZXQ6IFRoZSBvZmZzZXQgb2YgdGhlIGVsZW1lbnQgd2l0dGVuCiAgIC8vLyAgIC0gcG9zaXRpb246IFRoZSBwb3NpdGlvbiBvZiB0aGUgZWxlbWVudAorICBAaW5saW5lKF9fYWx3YXlzKQogICBAdXNhYmxlRnJvbUlubGluZQogICBtdXRhdGluZyBpbnRlcm5hbCBmdW5jIHRyYWNrKG9mZnNldDogVU9mZnNldCwgYXQgcG9zaXRpb246IFZPZmZzZXQpIHsKICAgICBfdnRhYmxlU3RvcmFnZS5hZGQobG9jOiBGaWVsZExvYyhvZmZzZXQ6IG9mZnNldCwgcG9zaXRpb246IHBvc2l0aW9uKSkKQEAgLTM4Niw2ICs0MDEsNyBAQAogICAvLy8gLSBQYXJhbWV0ZXJzOgogICAvLy8gICAtIGxlbjogTGVuZ3RoIG9mIHZlY3RvciB0byBiZSBjcmVhdGVkCiAgIC8vLyAgIC0gZWxlbWVudFNpemU6IFNpemUgb2Ygb2JqZWN0IHR5cGUgdG8gYmUgd3JpdHRlbgorICBAaW5saW5lKF9fYWx3YXlzKQogICBtdXRhdGluZyBwdWJsaWMgZnVuYyBzdGFydFZlY3RvcihfIGxlbjogSW50LCBlbGVtZW50U2l6ZTogSW50KSB7CiAgICAgbm90TmVzdGVkKCkKICAgICBpc05lc3RlZCA9IHRydWUKQEAgLTQwNyw2ICs0MjMsNyBAQAogICAvLy8KICAgLy8vIC0gUGFyYW1ldGVyIGxlbjogTGVuZ3RoIG9mIHRoZSBidWZmZXIKICAgLy8vIC0gUmV0dXJuczogUmV0dXJucyB0aGUgY3VycmVudCBgYE9mZnNldGBgIGluIHRoZSBgYEJ5dGVCdWZmZXJgYAorICBAaW5saW5lKF9fYWx3YXlzKQogICBtdXRhdGluZyBwdWJsaWMgZnVuYyBlbmRWZWN0b3IobGVuOiBJbnQpIC0+IE9mZnNldCB7CiAgICAgYXNzZXJ0KGlzTmVzdGVkLCAiQ2FsbGluZyBlbmRWZWN0b3Igd2l0aG91dCBjYWxsaW5nIHN0YXJ0VmVjdG9yIikKICAgICBpc05lc3RlZCA9IGZhbHNlCkBAIC00MjcsNiArNDQ0LDcgQEAKICAgLy8vCiAgIC8vLyAtIFBhcmFtZXRlciBlbGVtZW50czogZWxlbWVudHMgdG8gYmUgd3JpdHRlbiBpbnRvIHRoZSBidWZmZXIKICAgLy8vIC0gcmV0dXJuczogYGBPZmZzZXRgYCBvZiB0aGUgdmVjdG9yCisgIEBpbmxpbmUoX19hbHdheXMpCiAgIG11dGF0aW5nIHB1YmxpYyBmdW5jIGNyZWF0ZVZlY3RvcjxUOiBTY2FsYXI+KF8gZWxlbWVudHM6IFtUXSkgLT4gT2Zmc2V0IHsKICAgICBjcmVhdGVWZWN0b3IoZWxlbWVudHMsIHNpemU6IGVsZW1lbnRzLmNvdW50KQogICB9CkBAIC00NDQsNiArNDYyLDcgQEAKICAgLy8vIC0gUGFyYW1ldGVyIGVsZW1lbnRzOiBFbGVtZW50cyB0byBiZSB3cml0dGVuIGludG8gdGhlIGJ1ZmZlcgogICAvLy8gLSBQYXJhbWV0ZXIgc2l6ZTogQ291bnQgb2YgZWxlbWVudHMKICAgLy8vIC0gcmV0dXJuczogYGBPZmZzZXRgYCBvZiB0aGUgdmVjdG9yCisgIEBpbmxpbmUoX19hbHdheXMpCiAgIG11dGF0aW5nIHB1YmxpYyBmdW5jIGNyZWF0ZVZlY3RvcjxUOiBTY2FsYXI+KAogICAgIF8gZWxlbWVudHM6IFtUXSwKICAgICBzaXplOiBJbnQpIC0+IE9mZnNldApAQCAtNDY4LDYgKzQ4Nyw3IEBACiAgIC8vLwogICAvLy8gLSBQYXJhbWV0ZXIgZWxlbWVudHM6IGVsZW1lbnRzIHRvIGJlIHdyaXR0ZW4gaW50byB0aGUgYnVmZmVyCiAgIC8vLyAtIHJldHVybnM6IGBgT2Zmc2V0YGAgb2YgdGhlIHZlY3RvcgorICBAaW5saW5lKF9fYWx3YXlzKQogICBtdXRhdGluZyBwdWJsaWMgZnVuYyBjcmVhdGVWZWN0b3I8VDogRW51bT4oXyBlbGVtZW50czogW1RdKSAtPiBPZmZzZXQgewogICAgIGNyZWF0ZVZlY3RvcihlbGVtZW50cywgc2l6ZTogZWxlbWVudHMuY291bnQpCiAgIH0KQEAgLTQ4NSw2ICs1MDUsNyBAQAogICAvLy8gLSBQYXJhbWV0ZXIgZWxlbWVudHM6IEVsZW1lbnRzIHRvIGJlIHdyaXR0ZW4gaW50byB0aGUgYnVmZmVyCiAgIC8vLyAtIFBhcmFtZXRlciBzaXplOiBDb3VudCBvZiBlbGVtZW50cwogICAvLy8gLSByZXR1cm5zOiBgYE9mZnNldGBgIG9mIHRoZSB2ZWN0b3IKKyAgQGlubGluZShfX2Fsd2F5cykKICAgbXV0YXRpbmcgcHVibGljIGZ1bmMgY3JlYXRlVmVjdG9yPFQ6IEVudW0+KAogICAgIF8gZWxlbWVudHM6IFtUXSwKICAgICBzaXplOiBJbnQpIC0+IE9mZnNldApAQCAtNTExLDYgKzUzMiw3IEBACiAgIC8vLyBgYGAKICAgLy8vIC0gUGFyYW1ldGVyIG9mZnNldHM6IEFycmF5IG9mIG9mZnNldHMgb2YgdHlwZSBgYE9mZnNldGBgCiAgIC8vLyAtIHJldHVybnM6IGBgT2Zmc2V0YGAgb2YgdGhlIHZlY3RvcgorICBAaW5saW5lKF9fYWx3YXlzKQogICBtdXRhdGluZyBwdWJsaWMgZnVuYyBjcmVhdGVWZWN0b3Iob2ZPZmZzZXRzIG9mZnNldHM6IFtPZmZzZXRdKSAtPiBPZmZzZXQgewogICAgIGNyZWF0ZVZlY3RvcihvZk9mZnNldHM6IG9mZnNldHMsIGxlbjogb2Zmc2V0cy5jb3VudCkKICAgfQpAQCAtNTI5LDYgKzU1MSw3IEBACiAgIC8vLyAtIFBhcmFtZXRlciBvZmZzZXRzOiBBcnJheSBvZiBvZmZzZXRzIG9mIHR5cGUgYGBPZmZzZXRgYAogICAvLy8gLSBQYXJhbWV0ZXIgc2l6ZTogQ291bnQgb2YgZWxlbWVudHMKICAgLy8vIC0gcmV0dXJuczogYGBPZmZzZXRgYCBvZiB0aGUgdmVjdG9yCisgIEBpbmxpbmUoX19hbHdheXMpCiAgIG11dGF0aW5nIHB1YmxpYyBmdW5jIGNyZWF0ZVZlY3RvcigKICAgICBvZk9mZnNldHMgb2Zmc2V0czogW09mZnNldF0sCiAgICAgbGVuOiBJbnQpIC0+IE9mZnNldApAQCAtNTU1LDYgKzU3OCw3IEBACiAgIC8vLwogICAvLy8gLSBQYXJhbWV0ZXIgc3RyOiBBcnJheSBvZiBzdHJpbmcKICAgLy8vIC0gcmV0dXJuczogYGBPZmZzZXRgYCBvZiB0aGUgdmVjdG9yCisgIEBpbmxpbmUoX19hbHdheXMpCiAgIG11dGF0aW5nIHB1YmxpYyBmdW5jIGNyZWF0ZVZlY3RvcihvZlN0cmluZ3Mgc3RyOiBbU3RyaW5nXSkgLT4gT2Zmc2V0IHsKICAgICB2YXIgb2Zmc2V0czogW09mZnNldF0gPSBbXQogICAgIGZvciBzIGluIHN0ciB7CkBAIC01NzYsNiArNjAwLDcgQEAKICAgLy8vCiAgIC8vLyAtIFBhcmFtZXRlciBzdHJ1Y3RzOiBBIHZlY3RvciBvZiBgYE5hdGl2ZVN0cnVjdGBgCiAgIC8vLyAtIFJldHVybnM6IGBgT2Zmc2V0YGAgb2YgdGhlIHZlY3RvcgorICBAaW5saW5lKF9fYWx3YXlzKQogICBtdXRhdGluZyBwdWJsaWMgZnVuYyBjcmVhdGVWZWN0b3I8VDogTmF0aXZlU3RydWN0PihvZlN0cnVjdHMgc3RydWN0czogW1RdKQogICAgIC0+IE9mZnNldAogICB7CkBAIC02MDUsNiArNjMwLDcgQEAKICAgLy8vICAgLSBzOiBgYE5hdGl2ZVN0cnVjdGBgIHRvIGJlIGluc2VydGVkIGludG8gdGhlIGBgQnl0ZUJ1ZmZlcmBgCiAgIC8vLyAgIC0gcG9zaXRpb246IFRoZSAgcHJlZGVmaW5lZCBwb3NpdGlvbiBvZiB0aGUgb2JqZWN0CiAgIC8vLyAtIFJldHVybnM6IGBgT2Zmc2V0YGAgb2Ygd3JpdHRlbiBzdHJ1Y3QKKyAgQGlubGluZShfX2Fsd2F5cykKICAgQGRpc2NhcmRhYmxlUmVzdWx0CiAgIG11dGF0aW5nIHB1YmxpYyBmdW5jIGNyZWF0ZTxUOiBOYXRpdmVTdHJ1Y3Q+KAogICAgIHN0cnVjdCBzOiBULCBwb3NpdGlvbjogVk9mZnNldCkgLT4gT2Zmc2V0CkBAIC02MzAsNiArNjU2LDcgQEAKICAgLy8vIC0gUGFyYW1ldGVyczoKICAgLy8vICAgLSBzOiBgYE5hdGl2ZVN0cnVjdGBgIHRvIGJlIGluc2VydGVkIGludG8gdGhlIGBgQnl0ZUJ1ZmZlcmBgCiAgIC8vLyAtIFJldHVybnM6IGBgT2Zmc2V0YGAgb2Ygd3JpdHRlbiBzdHJ1Y3QKKyAgQGlubGluZShfX2Fsd2F5cykKICAgQGRpc2NhcmRhYmxlUmVzdWx0CiAgIG11dGF0aW5nIHB1YmxpYyBmdW5jIGNyZWF0ZTxUOiBOYXRpdmVTdHJ1Y3Q+KAogICAgIHN0cnVjdCBzOiBUKSAtPiBPZmZzZXQKQEAgLTY1NCw2ICs2ODEsNyBAQAogICAvLy8KICAgLy8vIC0gUGFyYW1ldGVyIHN0cjogU3RyaW5nIHRvIGJlIHNlcmlhbGl6ZWQKICAgLy8vIC0gcmV0dXJuczogYGBPZmZzZXRgYCBvZiBpbnNlcnRlZCBzdHJpbmcKKyAgQGlubGluZShfX2Fsd2F5cykKICAgbXV0YXRpbmcgcHVibGljIGZ1bmMgY3JlYXRlKHN0cmluZyBzdHI6IFN0cmluZz8pIC0+IE9mZnNldCB7CiAgICAgZ3VhcmQgbGV0IHN0ciA9IHN0ciBlbHNlIHsgcmV0dXJuIE9mZnNldCgpIH0KICAgICBsZXQgbGVuID0gc3RyLnV0ZjguY291bnQKQEAgLTY4NCw2ICs3MTIsNyBAQAogICAvLy8KICAgLy8vIC0gUGFyYW1ldGVyIHN0cjogU3RyaW5nIHRvIGJlIHNlcmlhbGl6ZWQKICAgLy8vIC0gcmV0dXJuczogYGBPZmZzZXRgYCBvZiBpbnNlcnRlZCBzdHJpbmcKKyAgQGlubGluZShfX2Fsd2F5cykKICAgbXV0YXRpbmcgcHVibGljIGZ1bmMgY3JlYXRlU2hhcmVkKHN0cmluZyBzdHI6IFN0cmluZz8pIC0+IE9mZnNldCB7CiAgICAgZ3VhcmQgbGV0IHN0ciA9IHN0ciBlbHNlIHsgcmV0dXJuIE9mZnNldCgpIH0KICAgICBpZiBsZXQgb2Zmc2V0ID0gc3RyaW5nT2Zmc2V0TWFwW3N0cl0gewpAQCAtNzA0LDYgKzczMyw3IEBACiAgIC8vLyAtIFBhcmFtZXRlcnM6CiAgIC8vLyAgIC0gb2Zmc2V0OiBgYE9mZnNldGBgIG9mIGFub3RoZXIgb2JqZWN0IHRvIGJlIHdyaXR0ZW4KICAgLy8vICAgLSBwb3NpdGlvbjogVGhlIHByZWRlZmluZWQgcG9zaXRpb24gb2YgdGhlIG9iamVjdAorICBAaW5saW5lKF9fYWx3YXlzKQogICBtdXRhdGluZyBwdWJsaWMgZnVuYyBhZGQob2Zmc2V0OiBPZmZzZXQsIGF0IHBvc2l0aW9uOiBWT2Zmc2V0KSB7CiAgICAgaWYgb2Zmc2V0LmlzRW1wdHkgeyByZXR1cm4gfQogICAgIGFkZChlbGVtZW50OiByZWZlcih0bzogb2Zmc2V0Lm8pLCBkZWY6IDAsIGF0OiBwb3NpdGlvbikKQEAgLTcxMiw2ICs3NDIsNyBAQAogICAvLy8gUHVzaGVzIGEgdmFsdWUgb2YgdHlwZSBgYE9mZnNldGBgIGludG8gdGhlIGBgQnl0ZUJ1ZmZlcmBgCiAgIC8vLyAtIFBhcmFtZXRlciBvOiBgYE9mZnNldGBgCiAgIC8vLyAtIHJldHVybnM6IEN1cnJlbnQgcG9zaXRpb24gb2YgdGhlIGBgT2Zmc2V0YGAKKyAgQGlubGluZShfX2Fsd2F5cykKICAgQGRpc2NhcmRhYmxlUmVzdWx0CiAgIG11dGF0aW5nIHB1YmxpYyBmdW5jIHB1c2goZWxlbWVudCBvOiBPZmZzZXQpIC0+IFVPZmZzZXQgewogICAgIHB1c2goZWxlbWVudDogcmVmZXIodG86IG8ubykpCkBAIC03NDAsNiArNzcxLDcgQEAKICAgLy8vICAgLSBlbGVtZW50OiBFbGVtZW50IHRvIGluc2VydAogICAvLy8gICAtIGRlZjogRGVmYXVsdCB2YWx1ZSBmb3IgdGhhdCBlbGVtZW50CiAgIC8vLyAgIC0gcG9zaXRpb246IFRoZSBwcmVkZWZpbmVkIHBvc2l0aW9uIG9mIHRoZSBlbGVtZW50CisgIEBpbmxpbmUoX19hbHdheXMpCiAgIG11dGF0aW5nIHB1YmxpYyBmdW5jIGFkZDxUOiBTY2FsYXI+KAogICAgIGVsZW1lbnQ6IFQsCiAgICAgZGVmOiBULApAQCAtNzU4LDYgKzc5MCw3IEBACiAgIC8vLyAtIFBhcmFtZXRlcnM6CiAgIC8vLyAgIC0gZWxlbWVudDogT3B0aW9uYWwgZWxlbWVudCBvZiB0eXBlIHNjYWxhcgogICAvLy8gICAtIHBvc2l0aW9uOiBUaGUgcHJlZGVmaW5lZCBwb3NpdGlvbiBvZiB0aGUgZWxlbWVudAorICBAaW5saW5lKF9fYWx3YXlzKQogICBtdXRhdGluZyBwdWJsaWMgZnVuYyBhZGQ8VDogU2NhbGFyPihlbGVtZW50OiBUPywgYXQgcG9zaXRpb246IFZPZmZzZXQpIHsKICAgICBndWFyZCBsZXQgZWxlbWVudCA9IGVsZW1lbnQgZWxzZSB7IHJldHVybiB9CiAgICAgdHJhY2sob2Zmc2V0OiBwdXNoKGVsZW1lbnQ6IGVsZW1lbnQpLCBhdDogcG9zaXRpb24pCkBAIC03NjksNiArODAyLDcgQEAKICAgLy8vCiAgIC8vLyAtIFBhcmFtZXRlciBlbGVtZW50OiBFbGVtZW50IHRvIGluc2VydAogICAvLy8gLSByZXR1cm5zOiBQb3N0aW9uIG9mIHRoZSBFbGVtZW50CisgIEBpbmxpbmUoX19hbHdheXMpCiAgIEBkaXNjYXJkYWJsZVJlc3VsdAogICBtdXRhdGluZyBwdWJsaWMgZnVuYyBwdXNoPFQ6IFNjYWxhcj4oZWxlbWVudDogVCkgLT4gVU9mZnNldCB7CiAgICAgbGV0IHNpemUgPSBNZW1vcnlMYXlvdXQ8VD4uc2l6ZQpAQCAtODE0LDEyICs4NDgsMTQgQEAKIAogICAgIC8vLyBDcmVhdGVzIHRoZSBtZW1vcnkgdG8gc3RvcmUgdGhlIGJ1ZmZlciBpbgogICAgIEB1c2FibGVGcm9tSW5saW5lCisgICAgQGlubGluZShfX2Fsd2F5cykKICAgICBpbml0KCkgewogICAgICAgbWVtb3J5ID0gVW5zYWZlTXV0YWJsZVJhd0J1ZmZlclBvaW50ZXIuYWxsb2NhdGUoCiAgICAgICAgIGJ5dGVDb3VudDogMCwKICAgICAgICAgYWxpZ25tZW50OiAwKQogICAgIH0KIAorICAgIEBpbmxpbmUoX19hbHdheXMpCiAgICAgZGVpbml0IHsKICAgICAgIG1lbW9yeS5kZWFsbG9jYXRlKCkKICAgICB9CkBAIC04MzYsNiArODcyLDcgQEAKICAgICAvLy8gQWRkcyBhIEZpZWxkTG9jIGludG8gdGhlIGJ1ZmZlciwgd2hpY2ggd291bGQgdHJhY2sgaG93IG1hbnkgaGF2ZSBiZWVuIHdyaXR0ZW4sCiAgICAgLy8vIGFuZCBtYXggb2Zmc2V0CiAgICAgLy8vIC0gUGFyYW1ldGVyIGxvYzogTG9jYXRpb24gb2YgZW5jb2RlZCBlbGVtZW50CisgICAgQGlubGluZShfX2Fsd2F5cykKICAgICBmdW5jIGFkZChsb2M6IEZpZWxkTG9jKSB7CiAgICAgICBtZW1vcnkuYmFzZUFkZHJlc3M/LmFkdmFuY2VkKGJ5OiB3cml0dGVuSW5kZXgpLnN0b3JlQnl0ZXMoCiAgICAgICAgIG9mOiBsb2MsCkBAIC04NDYsNiArODgzLDcgQEAKICAgICB9CiAKICAgICAvLy8gQ2xlYXJzIHRoZSBkYXRhIHN0b3JlZCByZWxhdGVkIHRvIHRoZSBlbmNvZGVkIGJ1ZmZlcgorICAgIEBpbmxpbmUoX19hbHdheXMpCiAgICAgZnVuYyBjbGVhcigpIHsKICAgICAgIG1heE9mZnNldCA9IDAKICAgICAgIG51bU9mRmllbGRzID0gMApkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvc3dpZnQvU291cmNlcy9GbGF0QnVmZmVycy9GbGF0QnVmZmVyT2JqZWN0LnN3aWZ0IGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvc3dpZnQvU291cmNlcy9GbGF0QnVmZmVycy9GbGF0QnVmZmVyT2JqZWN0LnN3aWZ0CmluZGV4IGRmOGFkOGQuLjUyMGNiMWQgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3N3aWZ0L1NvdXJjZXMvRmxhdEJ1ZmZlcnMvRmxhdEJ1ZmZlck9iamVjdC5zd2lmdAorKysgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy9zd2lmdC9Tb3VyY2VzL0ZsYXRCdWZmZXJzL0ZsYXRCdWZmZXJPYmplY3Quc3dpZnQKQEAgLTE0LDcgKzE0LDExIEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCisjaWYgIW9zKFdBU0kpCiBpbXBvcnQgRm91bmRhdGlvbgorI2Vsc2UKK2ltcG9ydCBTd2lmdE92ZXJsYXlTaGltcworI2VuZGlmCiAKIC8vLyBOYXRpdmVTdHJ1Y3QgaXMgYSBwcm90b2NvbCB0aGF0IGluZGljYXRlcyBpZiB0aGUgc3RydWN0IGlzIGEgbmF0aXZlIGBzd2lmdGAgc3RydWN0CiAvLy8gc2luY2Ugbm93IHdlIHdpbGwgYmUgc2VyaWFsaXppbmcgbmF0aXZlIHN0cnVjdHMgaW50byB0aGUgYnVmZmVyLgpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvc3dpZnQvU291cmNlcy9GbGF0QnVmZmVycy9GbGF0QnVmZmVyc1V0aWxzLnN3aWZ0IGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvc3dpZnQvU291cmNlcy9GbGF0QnVmZmVycy9GbGF0QnVmZmVyc1V0aWxzLnN3aWZ0CmluZGV4IGRjNWY3ODUuLjk5NDFiZDIgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3N3aWZ0L1NvdXJjZXMvRmxhdEJ1ZmZlcnMvRmxhdEJ1ZmZlcnNVdGlscy5zd2lmdAorKysgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy9zd2lmdC9Tb3VyY2VzL0ZsYXRCdWZmZXJzL0ZsYXRCdWZmZXJzVXRpbHMuc3dpZnQKQEAgLTE0LDcgKzE0LDExIEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCisjaWYgIW9zKFdBU0kpCiBpbXBvcnQgRm91bmRhdGlvbgorI2Vsc2UKK2ltcG9ydCBTd2lmdE92ZXJsYXlTaGltcworI2VuZGlmCiAKIC8vLyBGbGF0QnVmZmVyc1V0aWxzIGhvc3RzIHNvbWUgdXRpbGl0eSBmdW5jdGlvbnMgdGhhdCBtaWdodCBiZSB1c2VmdWwKIHB1YmxpYyBlbnVtIEZsYXRCdWZmZXJzVXRpbHMgewpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvc3dpZnQvU291cmNlcy9GbGF0QnVmZmVycy9GbGF0YnVmZmVyc0Vycm9ycy5zd2lmdCBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3N3aWZ0L1NvdXJjZXMvRmxhdEJ1ZmZlcnMvRmxhdGJ1ZmZlcnNFcnJvcnMuc3dpZnQKaW5kZXggNzRjMDZiOS4uNzdlMmYyYiAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvc3dpZnQvU291cmNlcy9GbGF0QnVmZmVycy9GbGF0YnVmZmVyc0Vycm9ycy5zd2lmdAorKysgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy9zd2lmdC9Tb3VyY2VzL0ZsYXRCdWZmZXJzL0ZsYXRidWZmZXJzRXJyb3JzLnN3aWZ0CkBAIC0xNCwxMSArMTQsMTkgQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKKyNpZiAhb3MoV0FTSSkKIGltcG9ydCBGb3VuZGF0aW9uCisjZWxzZQoraW1wb3J0IFN3aWZ0T3ZlcmxheVNoaW1zCisjZW5kaWYKIAogLy8vIENvbGxlY3Rpb24gb2YgdGhyb3duIGZyb20gdGhlIEZsYXRidWZmZXIgdmVyaWZpZXIKIHB1YmxpYyBlbnVtIEZsYXRidWZmZXJzRXJyb3JzOiBFcnJvciwgRXF1YXRhYmxlIHsKIAorICAvLy8gVGhyb3duIHdoZW4gdmVyaWZ5aW5nIGEgZmlsZSBpZCB0aGF0IGRvZXNudCBtYXRjaCBidWZmZXIgaWQKKyAgY2FzZSBidWZmZXJJZERpZG50TWF0Y2hQYXNzZWRJZAorICAvLy8gUHJlZml4ZWQgc2l6ZSBkb2VzbnQgbWF0Y2ggdGhlIGN1cnJlbnQgKHJlYWRhYmxlKSBidWZmZXIgc2l6ZQorICBjYXNlIHByZWZpeGVkU2l6ZU5vdEVxdWFsVG9CdWZmZXJTaXplCiAgIC8vLyBUaHJvd24gd2hlbiBidWZmZXIgaXMgYmlnZ2VyIHRoYW4gdGhlIGFsbG93ZWQgMkdpQgogICBjYXNlIGV4Y2VlZHNNYXhTaXplQWxsb3dlZAogICAvLy8gVGhyb3duIHdoZW4gdGhlcmUgaXMgYW4gbWlzc2FsaWduZWQgcG9pbnRlciBhdCBwb3NpdGlvbgpAQCAtNTMsMTAgKzYxLDE3IEBACiAgICAgZmllbGROYW1lOiBTdHJpbmcpCiAgIGNhc2UgYXBwYXJlbnRTaXplVG9vTGFyZ2UKIAotICBwdWJsaWMgc3RhdGljIGZ1bmMgPT0gKAotICAgIGxoczogRmxhdGJ1ZmZlcnNFcnJvcnMsCi0gICAgcmhzOiBGbGF0YnVmZmVyc0Vycm9ycykgLT4gQm9vbAotICB7Ci0gICAgbGhzLmxvY2FsaXplZERlc2NyaXB0aW9uID09IHJocy5sb2NhbGl6ZWREZXNjcmlwdGlvbgotICB9CiB9CisKKyNpZiAhb3MoV0FTSSkKKworZXh0ZW5zaW9uIEZsYXRidWZmZXJzRXJyb3JzIHsKKyAgICBwdWJsaWMgc3RhdGljIGZ1bmMgPT0gKAorICAgICAgbGhzOiBGbGF0YnVmZmVyc0Vycm9ycywKKyAgICAgIHJoczogRmxhdGJ1ZmZlcnNFcnJvcnMpIC0+IEJvb2wKKyAgICB7CisgICAgICBsaHMubG9jYWxpemVkRGVzY3JpcHRpb24gPT0gcmhzLmxvY2FsaXplZERlc2NyaXB0aW9uCisgICAgfQorfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3N3aWZ0L1NvdXJjZXMvRmxhdEJ1ZmZlcnMvSW50K2V4dGVuc2lvbi5zd2lmdCBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3N3aWZ0L1NvdXJjZXMvRmxhdEJ1ZmZlcnMvSW50K2V4dGVuc2lvbi5zd2lmdAppbmRleCA3Njk3N2JhLi5mMWMyNjFlIDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy9zd2lmdC9Tb3VyY2VzL0ZsYXRCdWZmZXJzL0ludCtleHRlbnNpb24uc3dpZnQKKysrIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvc3dpZnQvU291cmNlcy9GbGF0QnVmZmVycy9JbnQrZXh0ZW5zaW9uLnN3aWZ0CkBAIC0xNCw3ICsxNCwxMSBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAorI2lmICFvcyhXQVNJKQogaW1wb3J0IEZvdW5kYXRpb24KKyNlbHNlCitpbXBvcnQgU3dpZnRPdmVybGF5U2hpbXMKKyNlbmRpZgogCiBleHRlbnNpb24gSW50IHsKIApkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvc3dpZnQvU291cmNlcy9GbGF0QnVmZmVycy9NZXNzYWdlLnN3aWZ0IGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvc3dpZnQvU291cmNlcy9GbGF0QnVmZmVycy9NZXNzYWdlLnN3aWZ0CmluZGV4IGViMGJhZDkuLmU5NzM5ZGUgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3N3aWZ0L1NvdXJjZXMvRmxhdEJ1ZmZlcnMvTWVzc2FnZS5zd2lmdAorKysgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy9zd2lmdC9Tb3VyY2VzL0ZsYXRCdWZmZXJzL01lc3NhZ2Uuc3dpZnQKQEAgLTE0LDcgKzE0LDExIEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCisjaWYgIW9zKFdBU0kpCiBpbXBvcnQgRm91bmRhdGlvbgorI2Vsc2UKK2ltcG9ydCBTd2lmdE92ZXJsYXlTaGltcworI2VuZGlmCiAKIC8vLyBGbGF0QnVmZmVyR1JQQ01lc3NhZ2UgcHJvdG9jb2wgdGhhdCBzaG91bGQgYWxsb3cgdXMgdG8gaW52b2tlCiAvLy8gaW5pdGlhbGl6ZXJzIGRpcmVjdGx5IGZyb20gdGhlIEdSUEMgZ2VuZXJhdGVkIGNvZGUKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3N3aWZ0L1NvdXJjZXMvRmxhdEJ1ZmZlcnMvTXV0YWJsZS5zd2lmdCBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3N3aWZ0L1NvdXJjZXMvRmxhdEJ1ZmZlcnMvTXV0YWJsZS5zd2lmdAppbmRleCBmNzc5NDVjLi45NzYzYzNmIDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy9zd2lmdC9Tb3VyY2VzL0ZsYXRCdWZmZXJzL011dGFibGUuc3dpZnQKKysrIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvc3dpZnQvU291cmNlcy9GbGF0QnVmZmVycy9NdXRhYmxlLnN3aWZ0CkBAIC0xNCw3ICsxNCwxMSBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAorI2lmICFvcyhXQVNJKQogaW1wb3J0IEZvdW5kYXRpb24KKyNlbHNlCitpbXBvcnQgU3dpZnRPdmVybGF5U2hpbXMKKyNlbmRpZgogCiAvLy8gTXV0YWJsZSBpcyBhIHByb3RvY29sIHRoYXQgYWxsb3dzIHVzIHRvIG11dGF0ZSBTY2FsYXIgdmFsdWVzIHdpdGhpbiBhIGBgQnl0ZUJ1ZmZlcmBgCiBwdWJsaWMgcHJvdG9jb2wgTXV0YWJsZSB7CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy9zd2lmdC9Tb3VyY2VzL0ZsYXRCdWZmZXJzL05hdGl2ZU9iamVjdC5zd2lmdCBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3N3aWZ0L1NvdXJjZXMvRmxhdEJ1ZmZlcnMvTmF0aXZlT2JqZWN0LnN3aWZ0CmluZGV4IGJjODk2ZTYuLjU4MjkzMzggMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3N3aWZ0L1NvdXJjZXMvRmxhdEJ1ZmZlcnMvTmF0aXZlT2JqZWN0LnN3aWZ0CisrKyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3N3aWZ0L1NvdXJjZXMvRmxhdEJ1ZmZlcnMvTmF0aXZlT2JqZWN0LnN3aWZ0CkBAIC0xNCw3ICsxNCwxMSBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAorI2lmICFvcyhXQVNJKQogaW1wb3J0IEZvdW5kYXRpb24KKyNlbHNlCitpbXBvcnQgU3dpZnRPdmVybGF5U2hpbXMKKyNlbmRpZgogCiAvLy8gTmF0aXZlT2JqZWN0IGlzIGEgcHJvdG9jb2wgdGhhdCBhbGwgb2YgdGhlIGBPYmplY3QtQVBJYCBnZW5lcmF0ZWQgY29kZSBzaG91bGQgYmUKIC8vLyBjb25mb3JtaW5nIHRvIHNpbmNlIGl0IGFsbG93cyBkZXZlbG9wZXJzIHRoZSBlYXNlIG9mIHVzZSB0byBwYWNrIGFuZCB1bnBhY2sgdGhlaXIKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3N3aWZ0L1NvdXJjZXMvRmxhdEJ1ZmZlcnMvT2Zmc2V0LnN3aWZ0IGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvc3dpZnQvU291cmNlcy9GbGF0QnVmZmVycy9PZmZzZXQuc3dpZnQKaW5kZXggYmQzZjhhOC4uNWFkYjU3MiAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvc3dpZnQvU291cmNlcy9GbGF0QnVmZmVycy9PZmZzZXQuc3dpZnQKKysrIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvc3dpZnQvU291cmNlcy9GbGF0QnVmZmVycy9PZmZzZXQuc3dpZnQKQEAgLTE0LDcgKzE0LDExIEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCisjaWYgIW9zKFdBU0kpCiBpbXBvcnQgRm91bmRhdGlvbgorI2Vsc2UKK2ltcG9ydCBTd2lmdE92ZXJsYXlTaGltcworI2VuZGlmCiAKIC8vLyBPZmZzZXQgb2JqZWN0IGZvciBhbGwgdGhlIE9iamVjdHMgdGhhdCBhcmUgd3JpdHRlbiBpbnRvIHRoZSBidWZmZXIKIHB1YmxpYyBzdHJ1Y3QgT2Zmc2V0IHsKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3N3aWZ0L1NvdXJjZXMvRmxhdEJ1ZmZlcnMvUm9vdC5zd2lmdCBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3N3aWZ0L1NvdXJjZXMvRmxhdEJ1ZmZlcnMvUm9vdC5zd2lmdAppbmRleCA0ZDg4M2I3Li4wYzU5M2RjIDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy9zd2lmdC9Tb3VyY2VzL0ZsYXRCdWZmZXJzL1Jvb3Quc3dpZnQKKysrIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvc3dpZnQvU291cmNlcy9GbGF0QnVmZmVycy9Sb290LnN3aWZ0CkBAIC0xNCw3ICsxNCwxMSBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAorI2lmICFvcyhXQVNJKQogaW1wb3J0IEZvdW5kYXRpb24KKyNlbHNlCitpbXBvcnQgU3dpZnRPdmVybGF5U2hpbXMKKyNlbmRpZgogCiAvLy8gVGFrZXMgaW4gYSBwcmVmaXhlZCBzaXplZCBidWZmZXIsIHdoZXJlIHRoZSBwcmVmaXhlZCBzaXplIHdvdWxkIGJlIHNraXBwZWQuCiAvLy8gQW5kIHdvdWxkIHZlcmlmeSB0aGF0IHRoZSBidWZmZXIgcGFzc2VkIGlzIGEgdmFsaWQgYEZsYXRidWZmZXJzYCBPYmplY3QuCkBAIC0yOCwxMCArMzIsMzkgQEAKIC8vLyB0aGUgYGBCeXRlQnVmZmVyYGAgYW5kIHZlcmlmaWVzIHRoZSBidWZmZXIgYnkgY2FsbGluZyBgYGdldENoZWNrZWRSb290KGJ5dGVCdWZmZXI6b3B0aW9uczopYGAKIHB1YmxpYyBmdW5jIGdldFByZWZpeGVkU2l6ZUNoZWNrZWRSb290PFQ6IEZsYXRCdWZmZXJPYmplY3QgJiBWZXJpZmlhYmxlPigKICAgYnl0ZUJ1ZmZlcjogaW5vdXQgQnl0ZUJ1ZmZlciwKKyAgZmlsZUlkOiBTdHJpbmc/ID0gbmlsLAogICBvcHRpb25zOiBWZXJpZmllck9wdGlvbnMgPSAuaW5pdCgpKSB0aHJvd3MgLT4gVAogewogICBieXRlQnVmZmVyLnNraXBQcmVmaXgoKQotICByZXR1cm4gdHJ5IGdldENoZWNrZWRSb290KGJ5dGVCdWZmZXI6ICZieXRlQnVmZmVyLCBvcHRpb25zOiBvcHRpb25zKQorICByZXR1cm4gdHJ5IGdldENoZWNrZWRSb290KAorICAgIGJ5dGVCdWZmZXI6ICZieXRlQnVmZmVyLAorICAgIGZpbGVJZDogZmlsZUlkLAorICAgIG9wdGlvbnM6IG9wdGlvbnMpCit9CisKKy8vLyBUYWtlcyBpbiBhIHByZWZpeGVkIHNpemVkIGJ1ZmZlciwgd2hlcmUgd2UgY2hlY2sgaWYgdGhlIHNpemVkIGJ1ZmZlciBpcyBlcXVhbCB0byBwcmVmaXggc2l6ZS4KKy8vLyBBbmQgd291bGQgdmVyaWZ5IHRoYXQgdGhlIGJ1ZmZlciBwYXNzZWQgaXMgYSB2YWxpZCBgRmxhdGJ1ZmZlcnNgIE9iamVjdC4KKy8vLyAtIFBhcmFtZXRlcnM6CisvLy8gICAtIGJ5dGVCdWZmZXI6IEJ1ZmZlciB0aGF0IG5lZWRzIHRvIGJlIGNoZWNrZWQgYW5kIHJlYWQKKy8vLyAgIC0gb3B0aW9uczogVmVyaWZpZXIgb3B0aW9ucworLy8vIC0gVGhyb3dzOiBGbGF0YnVmZmVyc0Vycm9ycworLy8vIC0gUmV0dXJuczogUmV0dXJucyBhIHZhbGlkLCBjaGVja2VkIEZsYXRidWZmZXJzIG9iamVjdAorLy8vCisvLy8gYGBnZXRQcmVmaXhlZFNpemVDaGVja2VkUm9vdChieXRlQnVmZmVyOm9wdGlvbnM6KWBgIHdvdWxkIHNraXAgdGhlIGZpcnN0IEJ5dGVzIGluCisvLy8gdGhlIGBgQnl0ZUJ1ZmZlcmBgIGFuZCB2ZXJpZmllcyB0aGUgYnVmZmVyIGJ5IGNhbGxpbmcgYGBnZXRDaGVja2VkUm9vdChieXRlQnVmZmVyOm9wdGlvbnM6KWBgCitwdWJsaWMgZnVuYyBnZXRDaGVja2VkUHJlZml4ZWRTaXplUm9vdDxUOiBGbGF0QnVmZmVyT2JqZWN0ICYgVmVyaWZpYWJsZT4oCisgIGJ5dGVCdWZmZXI6IGlub3V0IEJ5dGVCdWZmZXIsCisgIGZpbGVJZDogU3RyaW5nPyA9IG5pbCwKKyAgb3B0aW9uczogVmVyaWZpZXJPcHRpb25zID0gLmluaXQoKSkgdGhyb3dzIC0+IFQKK3sKKyAgbGV0IHByZWZpeCA9IGJ5dGVCdWZmZXIuc2tpcFByZWZpeCgpCisgIGlmIHByZWZpeCAhPSBieXRlQnVmZmVyLnNpemUgeworICAgIHRocm93IEZsYXRidWZmZXJzRXJyb3JzLnByZWZpeGVkU2l6ZU5vdEVxdWFsVG9CdWZmZXJTaXplCisgIH0KKyAgcmV0dXJuIHRyeSBnZXRDaGVja2VkUm9vdCgKKyAgICBieXRlQnVmZmVyOiAmYnl0ZUJ1ZmZlciwKKyAgICBmaWxlSWQ6IGZpbGVJZCwKKyAgICBvcHRpb25zOiBvcHRpb25zKQogfQogCiAvLy8gVGFrZXMgaW4gYSBwcmVmaXhlZCBzaXplZCBidWZmZXIsIHdoZXJlIHRoZSBwcmVmaXhlZCBzaXplIHdvdWxkIGJlIHNraXBwZWQuCkBAIC02MSw5ICs5NCwxMyBAQAogLy8vIGFuZCB3aXRoaW4gdGhlIGBgQnl0ZUJ1ZmZlcmBgIHJhbmdlLgogcHVibGljIGZ1bmMgZ2V0Q2hlY2tlZFJvb3Q8VDogRmxhdEJ1ZmZlck9iamVjdCAmIFZlcmlmaWFibGU+KAogICBieXRlQnVmZmVyOiBpbm91dCBCeXRlQnVmZmVyLAorICBmaWxlSWQ6IFN0cmluZz8gPSBuaWwsCiAgIG9wdGlvbnM6IFZlcmlmaWVyT3B0aW9ucyA9IC5pbml0KCkpIHRocm93cyAtPiBUCiB7CiAgIHZhciB2ZXJpZmllciA9IHRyeSBWZXJpZmllcihidWZmZXI6ICZieXRlQnVmZmVyLCBvcHRpb25zOiBvcHRpb25zKQorICBpZiBsZXQgZmlsZUlkID0gZmlsZUlkIHsKKyAgICB0cnkgdmVyaWZpZXIudmVyaWZ5KGlkOiBmaWxlSWQpCisgIH0KICAgdHJ5IEZvcndhcmRPZmZzZXQ8VD4udmVyaWZ5KCZ2ZXJpZmllciwgYXQ6IDAsIG9mOiBULnNlbGYpCiAgIHJldHVybiBULmluaXQoCiAgICAgYnl0ZUJ1ZmZlciwKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3N3aWZ0L1NvdXJjZXMvRmxhdEJ1ZmZlcnMvU3RyaW5nK2V4dGVuc2lvbi5zd2lmdCBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3N3aWZ0L1NvdXJjZXMvRmxhdEJ1ZmZlcnMvU3RyaW5nK2V4dGVuc2lvbi5zd2lmdAppbmRleCAyZjMxNjhkLi5jZDkyZjdmIDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy9zd2lmdC9Tb3VyY2VzL0ZsYXRCdWZmZXJzL1N0cmluZytleHRlbnNpb24uc3dpZnQKKysrIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvc3dpZnQvU291cmNlcy9GbGF0QnVmZmVycy9TdHJpbmcrZXh0ZW5zaW9uLnN3aWZ0CkBAIC0xNCw3ICsxNCwxMSBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAorI2lmICFvcyhXQVNJKQogaW1wb3J0IEZvdW5kYXRpb24KKyNlbHNlCitpbXBvcnQgU3dpZnRPdmVybGF5U2hpbXMKKyNlbmRpZgogCiBleHRlbnNpb24gU3RyaW5nOiBWZXJpZmlhYmxlIHsKIApkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvc3dpZnQvU291cmNlcy9GbGF0QnVmZmVycy9TdHJ1Y3Quc3dpZnQgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy9zd2lmdC9Tb3VyY2VzL0ZsYXRCdWZmZXJzL1N0cnVjdC5zd2lmdAppbmRleCBhYzcwMWQ0Li45OTk2ZjQ0IDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy9zd2lmdC9Tb3VyY2VzL0ZsYXRCdWZmZXJzL1N0cnVjdC5zd2lmdAorKysgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy9zd2lmdC9Tb3VyY2VzL0ZsYXRCdWZmZXJzL1N0cnVjdC5zd2lmdApAQCAtMTQsNyArMTQsMTEgQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKKyNpZiAhb3MoV0FTSSkKIGltcG9ydCBGb3VuZGF0aW9uCisjZWxzZQoraW1wb3J0IFN3aWZ0T3ZlcmxheVNoaW1zCisjZW5kaWYKIAogLy8vIFN0cnVjdCBpcyBhIHJlcHJlc2VudGF0aW9uIG9mIGEgbXV0YWJsZSBgRmxhdGJ1ZmZlcnNgIHN0cnVjdAogLy8vIHNpbmNlIG5hdGl2ZSBzdHJ1Y3RzIGFyZSB2YWx1ZSB0eXBlcyBhbmQgY2FudCBiZSBtdXRhdGVkCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy9zd2lmdC9Tb3VyY2VzL0ZsYXRCdWZmZXJzL1RhYmxlLnN3aWZ0IGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvc3dpZnQvU291cmNlcy9GbGF0QnVmZmVycy9UYWJsZS5zd2lmdAppbmRleCBmZjUwMWZjLi41Yzc4MjI0IDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy9zd2lmdC9Tb3VyY2VzL0ZsYXRCdWZmZXJzL1RhYmxlLnN3aWZ0CisrKyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3N3aWZ0L1NvdXJjZXMvRmxhdEJ1ZmZlcnMvVGFibGUuc3dpZnQKQEAgLTE0LDcgKzE0LDExIEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCisjaWYgIW9zKFdBU0kpCiBpbXBvcnQgRm91bmRhdGlvbgorI2Vsc2UKK2ltcG9ydCBTd2lmdE92ZXJsYXlTaGltcworI2VuZGlmCiAKIC8vLyBgVGFibGVgIGlzIGEgRmxhdGJ1ZmZlcnMgb2JqZWN0IHRoYXQgY2FuIHJlYWQsCiAvLy8gbXV0YXRlIHNjYWxhciBmaWVsZHMgd2l0aGluIGEgdmFsaWQgZmxhdGJ1ZmZlcnMgYnVmZmVyCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy9zd2lmdC9Tb3VyY2VzL0ZsYXRCdWZmZXJzL1RhYmxlVmVyaWZpZXIuc3dpZnQgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy9zd2lmdC9Tb3VyY2VzL0ZsYXRCdWZmZXJzL1RhYmxlVmVyaWZpZXIuc3dpZnQKaW5kZXggNDJhMzdmMi4uMDMzOGYwZCAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvc3dpZnQvU291cmNlcy9GbGF0QnVmZmVycy9UYWJsZVZlcmlmaWVyLnN3aWZ0CisrKyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3N3aWZ0L1NvdXJjZXMvRmxhdEJ1ZmZlcnMvVGFibGVWZXJpZmllci5zd2lmdApAQCAtMTQsNyArMTQsMTEgQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKKyNpZiAhb3MoV0FTSSkKIGltcG9ydCBGb3VuZGF0aW9uCisjZWxzZQoraW1wb3J0IFN3aWZ0T3ZlcmxheVNoaW1zCisjZW5kaWYKIAogLy8vIGBUYWJsZVZlcmlmaWVyYCB2ZXJpZmllcyBhIHRhYmxlIG9iamVjdCBpcyB3aXRoaW4gYSBwcm92aWRlZCBtZW1vcnkuCiAvLy8gSXQgY2hlY2tzIGlmIGFsbCB0aGUgb2JqZWN0cyBmb3IgYSBzcGVjaWZpYyBnZW5lcmF0ZWQgdGFibGUsIGFyZSB3aXRoaW4KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3N3aWZ0L1NvdXJjZXMvRmxhdEJ1ZmZlcnMvVmVyaWZlck9wdGlvbnMuc3dpZnQgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy9zd2lmdC9Tb3VyY2VzL0ZsYXRCdWZmZXJzL1ZlcmlmZXJPcHRpb25zLnN3aWZ0CmluZGV4IDQ1NGRkNTEuLmJkODhiYTYgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3N3aWZ0L1NvdXJjZXMvRmxhdEJ1ZmZlcnMvVmVyaWZlck9wdGlvbnMuc3dpZnQKKysrIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvc3dpZnQvU291cmNlcy9GbGF0QnVmZmVycy9WZXJpZmVyT3B0aW9ucy5zd2lmdApAQCAtMTQsNyArMTQsMTEgQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKKyNpZiAhb3MoV0FTSSkKIGltcG9ydCBGb3VuZGF0aW9uCisjZWxzZQoraW1wb3J0IFN3aWZ0T3ZlcmxheVNoaW1zCisjZW5kaWYKIAogLy8vIGBWZXJpZmllck9wdGlvbnNgIGlzIGEgc2V0IG9mIG9wdGlvbnMgdG8gdmVyaWZ5IGEgZmxhdGJ1ZmZlcgogcHVibGljIHN0cnVjdCBWZXJpZmllck9wdGlvbnMgewpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvc3dpZnQvU291cmNlcy9GbGF0QnVmZmVycy9WZXJpZmlhYmxlLnN3aWZ0IGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvc3dpZnQvU291cmNlcy9GbGF0QnVmZmVycy9WZXJpZmlhYmxlLnN3aWZ0CmluZGV4IGU2MDFjZmMuLjdlY2I0NTQgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3N3aWZ0L1NvdXJjZXMvRmxhdEJ1ZmZlcnMvVmVyaWZpYWJsZS5zd2lmdAorKysgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy9zd2lmdC9Tb3VyY2VzL0ZsYXRCdWZmZXJzL1ZlcmlmaWFibGUuc3dpZnQKQEAgLTE0LDcgKzE0LDExIEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCisjaWYgIW9zKFdBU0kpCiBpbXBvcnQgRm91bmRhdGlvbgorI2Vsc2UKK2ltcG9ydCBTd2lmdE92ZXJsYXlTaGltcworI2VuZGlmCiAKIC8vLyBWZXJpZmlhYmxlIGlzIGEgcHJvdG9jb2wgYWxsIHN3aWZ0IGZsYXRidWZmZXJzIG9iamVjdCBzaG91bGQgY29uZm9ybSB0bywKIC8vLyBzaW5jZSBzd2lmdCBpcyBzaW1pbGFyIHRvIGBjcHBgIGFuZCBgcnVzdGAgd2hlcmUgdGhlIGRhdGEgaXMgcmVhZCBkaXJlY3RseQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvc3dpZnQvU291cmNlcy9GbGF0QnVmZmVycy9WZXJpZmllci5zd2lmdCBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3N3aWZ0L1NvdXJjZXMvRmxhdEJ1ZmZlcnMvVmVyaWZpZXIuc3dpZnQKaW5kZXggNmY2NWNlNy4uOWFjMzk3NCAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvc3dpZnQvU291cmNlcy9GbGF0QnVmZmVycy9WZXJpZmllci5zd2lmdAorKysgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy9zd2lmdC9Tb3VyY2VzL0ZsYXRCdWZmZXJzL1ZlcmlmaWVyLnN3aWZ0CkBAIC0xNCw3ICsxNCwxMSBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAorI2lmICFvcyhXQVNJKQogaW1wb3J0IEZvdW5kYXRpb24KKyNlbHNlCitpbXBvcnQgU3dpZnRPdmVybGF5U2hpbXMKKyNlbmRpZgogCiAvLy8gVmVyaWZpZXIgdGhhdCBjaGVjayBpZiB0aGUgYnVmZmVyIHBhc3NlZCBpbnRvIGl0IGlzIGEgdmFsaWQsCiAvLy8gc2FmZSwgYWxpZ25lZCBGbGF0YnVmZmVycyBvYmplY3Qgc2luY2Ugc3dpZnQgcmVhZCBmcm9tIGB1bnNhZmVNZW1vcnlgCkBAIC0yMDAsNCArMjA0LDE0IEBACiAgIGludGVybmFsIG11dGF0aW5nIGZ1bmMgZmluaXNoKCkgewogICAgIF9kZXB0aCAtPSAxCiAgIH0KKworICBtdXRhdGluZyBmdW5jIHZlcmlmeShpZDogU3RyaW5nKSB0aHJvd3MgeworICAgIGxldCBzaXplID0gTWVtb3J5TGF5b3V0PEludDMyPi5zaXplCisgICAgbGV0IHN0ciA9IF9idWZmZXIucmVhZFN0cmluZyhhdDogc2l6ZSwgY291bnQ6IHNpemUpCisgICAgaWYgaWQgPT0gc3RyIHsKKyAgICAgIHJldHVybgorICAgIH0KKyAgICB0aHJvdyBGbGF0YnVmZmVyc0Vycm9ycy5idWZmZXJJZERpZG50TWF0Y2hQYXNzZWRJZAorICB9CisKIH0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL0JVSUxELmJhemVsIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvQlVJTEQuYmF6ZWwKaW5kZXggNWE3MjdkZC4uNmMwY2EyMiAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvQlVJTEQuYmF6ZWwKKysrIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvQlVJTEQuYmF6ZWwKQEAgLTEsNSArMSw1IEBACiBsb2FkKCJAcnVsZXNfY2MvL2NjOmRlZnMuYnpsIiwgImNjX3Rlc3QiKQotbG9hZCgiLy86YnVpbGRfZGVmcy5iemwiLCAiZmxhdGJ1ZmZlcl9jY19saWJyYXJ5IiwgImZsYXRidWZmZXJfdHNfbGlicmFyeSIpCitsb2FkKCIvLzpidWlsZF9kZWZzLmJ6bCIsICJmbGF0YnVmZmVyX2NjX2xpYnJhcnkiKQogCiBwYWNrYWdlKGRlZmF1bHRfdmlzaWJpbGl0eSA9IFsiLy92aXNpYmlsaXR5OnByaXZhdGUiXSkKIApAQCAtOCwyMCArOCw0MiBAQAogICAgIG5hbWUgPSAiZmxhdGJ1ZmZlcnNfdGVzdCIsCiAgICAgdGVzdG9ubHkgPSAxLAogICAgIHNyY3MgPSBbCisgICAgICAgICJldm9sdXRpb25fdGVzdC5jcHAiLAorICAgICAgICAiZXZvbHV0aW9uX3Rlc3QuaCIsCiAgICAgICAgICJldm9sdXRpb25fdGVzdC9ldm9sdXRpb25fdjFfZ2VuZXJhdGVkLmgiLAogICAgICAgICAiZXZvbHV0aW9uX3Rlc3QvZXZvbHV0aW9uX3YyX2dlbmVyYXRlZC5oIiwKKyAgICAgICAgImZsZXhidWZmZXJzX3Rlc3QuY3BwIiwKKyAgICAgICAgImZsZXhidWZmZXJzX3Rlc3QuaCIsCisgICAgICAgICJmdXp6X3Rlc3QuY3BwIiwKKyAgICAgICAgImZ1enpfdGVzdC5oIiwKKyAgICAgICAgImlzX3F1aWV0X25hbi5oIiwKKyAgICAgICAgImpzb25fdGVzdC5jcHAiLAorICAgICAgICAianNvbl90ZXN0LmgiLAorICAgICAgICAibW9uc3Rlcl90ZXN0LmNwcCIsCisgICAgICAgICJtb25zdGVyX3Rlc3QuaCIsCiAgICAgICAgICJtb25zdGVyX3Rlc3RfYmZic19nZW5lcmF0ZWQuaCIsCiAgICAgICAgICJuYW1lc3BhY2VfdGVzdC9uYW1lc3BhY2VfdGVzdDFfZ2VuZXJhdGVkLmgiLAogICAgICAgICAibmFtZXNwYWNlX3Rlc3QvbmFtZXNwYWNlX3Rlc3QyX2dlbmVyYXRlZC5oIiwKKyAgICAgICAgIm5hdGl2ZV9pbmxpbmVfdGFibGVfdGVzdF9nZW5lcmF0ZWQuaCIsCiAgICAgICAgICJuYXRpdmVfdHlwZV90ZXN0X2ltcGwuY3BwIiwKICAgICAgICAgIm5hdGl2ZV90eXBlX3Rlc3RfaW1wbC5oIiwKICAgICAgICAgIm9wdGlvbmFsX3NjYWxhcnNfZ2VuZXJhdGVkLmgiLAorICAgICAgICAib3B0aW9uYWxfc2NhbGFyc190ZXN0LmNwcCIsCisgICAgICAgICJvcHRpb25hbF9zY2FsYXJzX3Rlc3QuaCIsCisgICAgICAgICJwYXJzZXJfdGVzdC5jcHAiLAorICAgICAgICAicGFyc2VyX3Rlc3QuaCIsCisgICAgICAgICJwcm90b190ZXN0LmNwcCIsCisgICAgICAgICJwcm90b190ZXN0LmgiLAorICAgICAgICAicmVmbGVjdGlvbl90ZXN0LmNwcCIsCisgICAgICAgICJyZWZsZWN0aW9uX3Rlc3QuaCIsCiAgICAgICAgICJ0ZXN0LmNwcCIsCiAgICAgICAgICJ0ZXN0X2Fzc2VydC5jcHAiLAogICAgICAgICAidGVzdF9hc3NlcnQuaCIsCiAgICAgICAgICJ0ZXN0X2J1aWxkZXIuY3BwIiwKICAgICAgICAgInRlc3RfYnVpbGRlci5oIiwKICAgICAgICAgInVuaW9uX3ZlY3Rvci91bmlvbl92ZWN0b3JfZ2VuZXJhdGVkLmgiLAorICAgICAgICAidXRpbF90ZXN0LmNwcCIsCisgICAgICAgICJ1dGlsX3Rlc3QuaCIsCiAgICAgXSwKICAgICBjb3B0cyA9IFsKICAgICAgICAgIi1ERkxBVEJVRkZFUlNfVFJBQ0tfVkVSSUZJRVJfQlVGRkVSX1NJWkUiLApAQCAtNDksNiArNzEsOCBAQAogICAgICAgICAiOm5hbWVfY2xhc2hfdGVzdC92YWxpZF90ZXN0Mi5mYnMiLAogICAgICAgICAiOm5hdGl2ZV90eXBlX3Rlc3QuZmJzIiwKICAgICAgICAgIjpvcHRpb25hbF9zY2FsYXJzLmZicyIsCisgICAgICAgICI6b3B0aW9uYWxfc2NhbGFycy5qc29uIiwKKyAgICAgICAgIjpvcHRpb25hbF9zY2FsYXJzX2RlZmF1bHRzLmpzb24iLAogICAgICAgICAiOnByb3RvdGVzdC9pbXBvcnRlZC5wcm90byIsCiAgICAgICAgICI6cHJvdG90ZXN0L3Rlc3QuZ29sZGVuIiwKICAgICAgICAgIjpwcm90b3Rlc3QvdGVzdC5wcm90byIsCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9EYXJ0VGVzdC5zaCBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL0RhcnRUZXN0LnNoCmluZGV4IDM2ZDFiMTQuLmUyYWM2YzcgMTAwNzU1Ci0tLSBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL0RhcnRUZXN0LnNoCisrKyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL0RhcnRUZXN0LnNoCkBAIC0yNSw2ICsyNSw5IEBACiAKIGNkIC4uL2RhcnQKIAorLi4vZmxhdGMgLS1kYXJ0IC0tZ2VuLW9iamVjdC1hcGkgLW8gLi90ZXN0IC4vdGVzdC9saXN0X29mX2VudW1zLmZicworLi4vZmxhdGMgLS1kYXJ0IC0tZ2VuLW9iamVjdC1hcGkgLW8gLi90ZXN0IC4vdGVzdC9ib29sX3N0cnVjdHMuZmJzCisKICMgdXBkYXRlIHBhY2thZ2VzCiBkYXJ0IHB1YiBnZXQKICMgRXhlY3V0ZSB0aGUgc2FtcGxlLgpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvRGljdGlvbmFyeUxvb2t1cC9Mb25nRmxvYXRFbnRyeS5qYXZhIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvRGljdGlvbmFyeUxvb2t1cC9Mb25nRmxvYXRFbnRyeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA0MTlmNzkKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9EaWN0aW9uYXJ5TG9va3VwL0xvbmdGbG9hdEVudHJ5LmphdmEKQEAgLTAsMCArMSw3NSBAQAorLy8gYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgYnkgdGhlIEZsYXRCdWZmZXJzIGNvbXBpbGVyLCBkbyBub3QgbW9kaWZ5CisKK3BhY2thZ2UgRGljdGlvbmFyeUxvb2t1cDsKKworaW1wb3J0IGphdmEubmlvLio7CitpbXBvcnQgamF2YS5sYW5nLio7CitpbXBvcnQgamF2YS51dGlsLio7CitpbXBvcnQgY29tLmdvb2dsZS5mbGF0YnVmZmVycy4qOworCitAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikKK3B1YmxpYyBmaW5hbCBjbGFzcyBMb25nRmxvYXRFbnRyeSBleHRlbmRzIFRhYmxlIHsKKyAgcHVibGljIHN0YXRpYyB2b2lkIFZhbGlkYXRlVmVyc2lvbigpIHsgQ29uc3RhbnRzLkZMQVRCVUZGRVJTXzJfMF84KCk7IH0KKyAgcHVibGljIHN0YXRpYyBMb25nRmxvYXRFbnRyeSBnZXRSb290QXNMb25nRmxvYXRFbnRyeShCeXRlQnVmZmVyIF9iYikgeyByZXR1cm4gZ2V0Um9vdEFzTG9uZ0Zsb2F0RW50cnkoX2JiLCBuZXcgTG9uZ0Zsb2F0RW50cnkoKSk7IH0KKyAgcHVibGljIHN0YXRpYyBMb25nRmxvYXRFbnRyeSBnZXRSb290QXNMb25nRmxvYXRFbnRyeShCeXRlQnVmZmVyIF9iYiwgTG9uZ0Zsb2F0RW50cnkgb2JqKSB7IF9iYi5vcmRlcihCeXRlT3JkZXIuTElUVExFX0VORElBTik7IHJldHVybiAob2JqLl9fYXNzaWduKF9iYi5nZXRJbnQoX2JiLnBvc2l0aW9uKCkpICsgX2JiLnBvc2l0aW9uKCksIF9iYikpOyB9CisgIHB1YmxpYyB2b2lkIF9faW5pdChpbnQgX2ksIEJ5dGVCdWZmZXIgX2JiKSB7IF9fcmVzZXQoX2ksIF9iYik7IH0KKyAgcHVibGljIExvbmdGbG9hdEVudHJ5IF9fYXNzaWduKGludCBfaSwgQnl0ZUJ1ZmZlciBfYmIpIHsgX19pbml0KF9pLCBfYmIpOyByZXR1cm4gdGhpczsgfQorCisgIHB1YmxpYyBsb25nIGtleSgpIHsgaW50IG8gPSBfX29mZnNldCg0KTsgcmV0dXJuIG8gIT0gMCA/IGJiLmdldExvbmcobyArIGJiX3BvcykgOiAwTDsgfQorICBwdWJsaWMgZmxvYXQgdmFsdWUoKSB7IGludCBvID0gX19vZmZzZXQoNik7IHJldHVybiBvICE9IDAgPyBiYi5nZXRGbG9hdChvICsgYmJfcG9zKSA6IDAuMGY7IH0KKworICBwdWJsaWMgc3RhdGljIGludCBjcmVhdGVMb25nRmxvYXRFbnRyeShGbGF0QnVmZmVyQnVpbGRlciBidWlsZGVyLAorICAgICAgbG9uZyBrZXksCisgICAgICBmbG9hdCB2YWx1ZSkgeworICAgIGJ1aWxkZXIuc3RhcnRUYWJsZSgyKTsKKyAgICBMb25nRmxvYXRFbnRyeS5hZGRLZXkoYnVpbGRlciwga2V5KTsKKyAgICBMb25nRmxvYXRFbnRyeS5hZGRWYWx1ZShidWlsZGVyLCB2YWx1ZSk7CisgICAgcmV0dXJuIExvbmdGbG9hdEVudHJ5LmVuZExvbmdGbG9hdEVudHJ5KGJ1aWxkZXIpOworICB9CisKKyAgcHVibGljIHN0YXRpYyB2b2lkIHN0YXJ0TG9uZ0Zsb2F0RW50cnkoRmxhdEJ1ZmZlckJ1aWxkZXIgYnVpbGRlcikgeyBidWlsZGVyLnN0YXJ0VGFibGUoMik7IH0KKyAgcHVibGljIHN0YXRpYyB2b2lkIGFkZEtleShGbGF0QnVmZmVyQnVpbGRlciBidWlsZGVyLCBsb25nIGtleSkgeyBidWlsZGVyLmFkZExvbmcoa2V5KTsgYnVpbGRlci5zbG90KDApOyB9CisgIHB1YmxpYyBzdGF0aWMgdm9pZCBhZGRWYWx1ZShGbGF0QnVmZmVyQnVpbGRlciBidWlsZGVyLCBmbG9hdCB2YWx1ZSkgeyBidWlsZGVyLmFkZEZsb2F0KDEsIHZhbHVlLCAwLjBmKTsgfQorICBwdWJsaWMgc3RhdGljIGludCBlbmRMb25nRmxvYXRFbnRyeShGbGF0QnVmZmVyQnVpbGRlciBidWlsZGVyKSB7CisgICAgaW50IG8gPSBidWlsZGVyLmVuZFRhYmxlKCk7CisgICAgcmV0dXJuIG87CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHJvdGVjdGVkIGludCBrZXlzQ29tcGFyZShJbnRlZ2VyIG8xLCBJbnRlZ2VyIG8yLCBCeXRlQnVmZmVyIF9iYikgeworICAgIGxvbmcgdmFsXzEgPSBfYmIuZ2V0TG9uZyhfX29mZnNldCg0LCBvMSwgX2JiKSk7CisgICAgbG9uZyB2YWxfMiA9IF9iYi5nZXRMb25nKF9fb2Zmc2V0KDQsIG8yLCBfYmIpKTsKKyAgICByZXR1cm4gdmFsXzEgPiB2YWxfMiA/IDEgOiB2YWxfMSA8IHZhbF8yID8gLTEgOiAwOworICB9CisKKyAgcHVibGljIHN0YXRpYyBMb25nRmxvYXRFbnRyeSBfX2xvb2t1cF9ieV9rZXkoTG9uZ0Zsb2F0RW50cnkgb2JqLCBpbnQgdmVjdG9yTG9jYXRpb24sIGxvbmcga2V5LCBCeXRlQnVmZmVyIGJiKSB7CisgICAgaW50IHNwYW4gPSBiYi5nZXRJbnQodmVjdG9yTG9jYXRpb24gLSA0KTsKKyAgICBpbnQgc3RhcnQgPSAwOworICAgIHdoaWxlIChzcGFuICE9IDApIHsKKyAgICAgIGludCBtaWRkbGUgPSBzcGFuIC8gMjsKKyAgICAgIGludCB0YWJsZU9mZnNldCA9IF9faW5kaXJlY3QodmVjdG9yTG9jYXRpb24gKyA0ICogKHN0YXJ0ICsgbWlkZGxlKSwgYmIpOworICAgICAgbG9uZyB2YWwgPSBiYi5nZXRMb25nKF9fb2Zmc2V0KDQsIGJiLmNhcGFjaXR5KCkgLSB0YWJsZU9mZnNldCwgYmIpKTsKKyAgICAgIGludCBjb21wID0gdmFsID4ga2V5ID8gMSA6IHZhbCA8IGtleSA/IC0xIDogMDsKKyAgICAgIGlmIChjb21wID4gMCkgeworICAgICAgICBzcGFuID0gbWlkZGxlOworICAgICAgfSBlbHNlIGlmIChjb21wIDwgMCkgeworICAgICAgICBtaWRkbGUrKzsKKyAgICAgICAgc3RhcnQgKz0gbWlkZGxlOworICAgICAgICBzcGFuIC09IG1pZGRsZTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiAob2JqID09IG51bGwgPyBuZXcgTG9uZ0Zsb2F0RW50cnkoKSA6IG9iaikuX19hc3NpZ24odGFibGVPZmZzZXQsIGJiKTsKKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIG51bGw7CisgIH0KKworICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIFZlY3RvciBleHRlbmRzIEJhc2VWZWN0b3IgeworICAgIHB1YmxpYyBWZWN0b3IgX19hc3NpZ24oaW50IF92ZWN0b3IsIGludCBfZWxlbWVudF9zaXplLCBCeXRlQnVmZmVyIF9iYikgeyBfX3Jlc2V0KF92ZWN0b3IsIF9lbGVtZW50X3NpemUsIF9iYik7IHJldHVybiB0aGlzOyB9CisKKyAgICBwdWJsaWMgTG9uZ0Zsb2F0RW50cnkgZ2V0KGludCBqKSB7IHJldHVybiBnZXQobmV3IExvbmdGbG9hdEVudHJ5KCksIGopOyB9CisgICAgcHVibGljIExvbmdGbG9hdEVudHJ5IGdldChMb25nRmxvYXRFbnRyeSBvYmosIGludCBqKSB7ICByZXR1cm4gb2JqLl9fYXNzaWduKF9faW5kaXJlY3QoX19lbGVtZW50KGopLCBiYiksIGJiKTsgfQorICAgIHB1YmxpYyBMb25nRmxvYXRFbnRyeSBnZXRCeUtleShsb25nIGtleSkgeyAgcmV0dXJuIF9fbG9va3VwX2J5X2tleShudWxsLCBfX3ZlY3RvcigpLCBrZXksIGJiKTsgfQorICAgIHB1YmxpYyBMb25nRmxvYXRFbnRyeSBnZXRCeUtleShMb25nRmxvYXRFbnRyeSBvYmosIGxvbmcga2V5KSB7ICByZXR1cm4gX19sb29rdXBfYnlfa2V5KG9iaiwgX192ZWN0b3IoKSwga2V5LCBiYik7IH0KKyAgfQorfQorCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9EaWN0aW9uYXJ5TG9va3VwL0xvbmdGbG9hdEVudHJ5Lmt0IGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvRGljdGlvbmFyeUxvb2t1cC9Mb25nRmxvYXRFbnRyeS5rdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YjFlNTAwCi0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvRGljdGlvbmFyeUxvb2t1cC9Mb25nRmxvYXRFbnRyeS5rdApAQCAtMCwwICsxLDgwIEBACisvLyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBieSB0aGUgRmxhdEJ1ZmZlcnMgY29tcGlsZXIsIGRvIG5vdCBtb2RpZnkKKworcGFja2FnZSBEaWN0aW9uYXJ5TG9va3VwCisKK2ltcG9ydCBqYXZhLm5pby4qCitpbXBvcnQga290bGluLm1hdGguc2lnbgoraW1wb3J0IGNvbS5nb29nbGUuZmxhdGJ1ZmZlcnMuKgorCitAU3VwcHJlc3MoInVudXNlZCIpCitjbGFzcyBMb25nRmxvYXRFbnRyeSA6IFRhYmxlKCkgeworCisgICAgZnVuIF9faW5pdChfaTogSW50LCBfYmI6IEJ5dGVCdWZmZXIpICB7CisgICAgICAgIF9fcmVzZXQoX2ksIF9iYikKKyAgICB9CisgICAgZnVuIF9fYXNzaWduKF9pOiBJbnQsIF9iYjogQnl0ZUJ1ZmZlcikgOiBMb25nRmxvYXRFbnRyeSB7CisgICAgICAgIF9faW5pdChfaSwgX2JiKQorICAgICAgICByZXR1cm4gdGhpcworICAgIH0KKyAgICB2YWwga2V5IDogTG9uZworICAgICAgICBnZXQoKSB7CisgICAgICAgICAgICB2YWwgbyA9IF9fb2Zmc2V0KDQpCisgICAgICAgICAgICByZXR1cm4gaWYobyAhPSAwKSBiYi5nZXRMb25nKG8gKyBiYl9wb3MpIGVsc2UgMEwKKyAgICAgICAgfQorICAgIHZhbCB2YWx1ZSA6IEZsb2F0CisgICAgICAgIGdldCgpIHsKKyAgICAgICAgICAgIHZhbCBvID0gX19vZmZzZXQoNikKKyAgICAgICAgICAgIHJldHVybiBpZihvICE9IDApIGJiLmdldEZsb2F0KG8gKyBiYl9wb3MpIGVsc2UgMC4wZgorICAgICAgICB9CisgICAgb3ZlcnJpZGUgZnVuIGtleXNDb21wYXJlKG8xOiBJbnQsIG8yOiBJbnQsIF9iYjogQnl0ZUJ1ZmZlcikgOiBJbnQgeworICAgICAgICB2YWwgdmFsXzEgPSBfYmIuZ2V0TG9uZyhfX29mZnNldCg0LCBvMSwgX2JiKSkKKyAgICAgICAgdmFsIHZhbF8yID0gX2JiLmdldExvbmcoX19vZmZzZXQoNCwgbzIsIF9iYikpCisgICAgICAgIHJldHVybiAodmFsXzEgLSB2YWxfMikuc2lnbgorICAgIH0KKyAgICBjb21wYW5pb24gb2JqZWN0IHsKKyAgICAgICAgZnVuIHZhbGlkYXRlVmVyc2lvbigpID0gQ29uc3RhbnRzLkZMQVRCVUZGRVJTXzJfMF84KCkKKyAgICAgICAgZnVuIGdldFJvb3RBc0xvbmdGbG9hdEVudHJ5KF9iYjogQnl0ZUJ1ZmZlcik6IExvbmdGbG9hdEVudHJ5ID0gZ2V0Um9vdEFzTG9uZ0Zsb2F0RW50cnkoX2JiLCBMb25nRmxvYXRFbnRyeSgpKQorICAgICAgICBmdW4gZ2V0Um9vdEFzTG9uZ0Zsb2F0RW50cnkoX2JiOiBCeXRlQnVmZmVyLCBvYmo6IExvbmdGbG9hdEVudHJ5KTogTG9uZ0Zsb2F0RW50cnkgeworICAgICAgICAgICAgX2JiLm9yZGVyKEJ5dGVPcmRlci5MSVRUTEVfRU5ESUFOKQorICAgICAgICAgICAgcmV0dXJuIChvYmouX19hc3NpZ24oX2JiLmdldEludChfYmIucG9zaXRpb24oKSkgKyBfYmIucG9zaXRpb24oKSwgX2JiKSkKKyAgICAgICAgfQorICAgICAgICBmdW4gY3JlYXRlTG9uZ0Zsb2F0RW50cnkoYnVpbGRlcjogRmxhdEJ1ZmZlckJ1aWxkZXIsIGtleTogTG9uZywgdmFsdWU6IEZsb2F0KSA6IEludCB7CisgICAgICAgICAgICBidWlsZGVyLnN0YXJ0VGFibGUoMikKKyAgICAgICAgICAgIGFkZEtleShidWlsZGVyLCBrZXkpCisgICAgICAgICAgICBhZGRWYWx1ZShidWlsZGVyLCB2YWx1ZSkKKyAgICAgICAgICAgIHJldHVybiBlbmRMb25nRmxvYXRFbnRyeShidWlsZGVyKQorICAgICAgICB9CisgICAgICAgIGZ1biBzdGFydExvbmdGbG9hdEVudHJ5KGJ1aWxkZXI6IEZsYXRCdWZmZXJCdWlsZGVyKSA9IGJ1aWxkZXIuc3RhcnRUYWJsZSgyKQorICAgICAgICBmdW4gYWRkS2V5KGJ1aWxkZXI6IEZsYXRCdWZmZXJCdWlsZGVyLCBrZXk6IExvbmcpICB7CisgICAgICAgICAgICBidWlsZGVyLmFkZExvbmcoa2V5KQorICAgICAgICAgICAgYnVpbGRlci5zbG90KDApCisgICAgICAgIH0KKyAgICAgICAgZnVuIGFkZFZhbHVlKGJ1aWxkZXI6IEZsYXRCdWZmZXJCdWlsZGVyLCB2YWx1ZTogRmxvYXQpID0gYnVpbGRlci5hZGRGbG9hdCgxLCB2YWx1ZSwgMC4wKQorICAgICAgICBmdW4gZW5kTG9uZ0Zsb2F0RW50cnkoYnVpbGRlcjogRmxhdEJ1ZmZlckJ1aWxkZXIpIDogSW50IHsKKyAgICAgICAgICAgIHZhbCBvID0gYnVpbGRlci5lbmRUYWJsZSgpCisgICAgICAgICAgICByZXR1cm4gbworICAgICAgICB9CisgICAgICAgIGZ1biBfX2xvb2t1cF9ieV9rZXkob2JqOiBMb25nRmxvYXRFbnRyeT8sIHZlY3RvckxvY2F0aW9uOiBJbnQsIGtleTogTG9uZywgYmI6IEJ5dGVCdWZmZXIpIDogTG9uZ0Zsb2F0RW50cnk/IHsKKyAgICAgICAgICAgIHZhciBzcGFuID0gYmIuZ2V0SW50KHZlY3RvckxvY2F0aW9uIC0gNCkKKyAgICAgICAgICAgIHZhciBzdGFydCA9IDAKKyAgICAgICAgICAgIHdoaWxlIChzcGFuICE9IDApIHsKKyAgICAgICAgICAgICAgICB2YXIgbWlkZGxlID0gc3BhbiAvIDIKKyAgICAgICAgICAgICAgICB2YWwgdGFibGVPZmZzZXQgPSBfX2luZGlyZWN0KHZlY3RvckxvY2F0aW9uICsgNCAqIChzdGFydCArIG1pZGRsZSksIGJiKQorICAgICAgICAgICAgICAgIHZhbCB2YWx1ZSA9IGJiLmdldExvbmcoX19vZmZzZXQoNCwgYmIuY2FwYWNpdHkoKSAtIHRhYmxlT2Zmc2V0LCBiYikpCisgICAgICAgICAgICAgICAgdmFsIGNvbXAgPSB2YWx1ZS5jb21wYXJlVG8oa2V5KQorICAgICAgICAgICAgICAgIHdoZW4geworICAgICAgICAgICAgICAgICAgICBjb21wID4gMCAtPiBzcGFuID0gbWlkZGxlCisgICAgICAgICAgICAgICAgICAgIGNvbXAgPCAwIC0+IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1pZGRsZSsrCisgICAgICAgICAgICAgICAgICAgICAgICBzdGFydCArPSBtaWRkbGUKKyAgICAgICAgICAgICAgICAgICAgICAgIHNwYW4gLT0gbWlkZGxlCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSAtPiB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKG9iaiA/OiBMb25nRmxvYXRFbnRyeSgpKS5fX2Fzc2lnbih0YWJsZU9mZnNldCwgYmIpCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gbnVsbAorICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvRGljdGlvbmFyeUxvb2t1cC9Mb25nRmxvYXRNYXAuamF2YSBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL0RpY3Rpb25hcnlMb29rdXAvTG9uZ0Zsb2F0TWFwLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWNjMzUwMAotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL0RpY3Rpb25hcnlMb29rdXAvTG9uZ0Zsb2F0TWFwLmphdmEKQEAgLTAsMCArMSw1MSBAQAorLy8gYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgYnkgdGhlIEZsYXRCdWZmZXJzIGNvbXBpbGVyLCBkbyBub3QgbW9kaWZ5CisKK3BhY2thZ2UgRGljdGlvbmFyeUxvb2t1cDsKKworaW1wb3J0IGphdmEubmlvLio7CitpbXBvcnQgamF2YS5sYW5nLio7CitpbXBvcnQgamF2YS51dGlsLio7CitpbXBvcnQgY29tLmdvb2dsZS5mbGF0YnVmZmVycy4qOworCitAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikKK3B1YmxpYyBmaW5hbCBjbGFzcyBMb25nRmxvYXRNYXAgZXh0ZW5kcyBUYWJsZSB7CisgIHB1YmxpYyBzdGF0aWMgdm9pZCBWYWxpZGF0ZVZlcnNpb24oKSB7IENvbnN0YW50cy5GTEFUQlVGRkVSU18yXzBfOCgpOyB9CisgIHB1YmxpYyBzdGF0aWMgTG9uZ0Zsb2F0TWFwIGdldFJvb3RBc0xvbmdGbG9hdE1hcChCeXRlQnVmZmVyIF9iYikgeyByZXR1cm4gZ2V0Um9vdEFzTG9uZ0Zsb2F0TWFwKF9iYiwgbmV3IExvbmdGbG9hdE1hcCgpKTsgfQorICBwdWJsaWMgc3RhdGljIExvbmdGbG9hdE1hcCBnZXRSb290QXNMb25nRmxvYXRNYXAoQnl0ZUJ1ZmZlciBfYmIsIExvbmdGbG9hdE1hcCBvYmopIHsgX2JiLm9yZGVyKEJ5dGVPcmRlci5MSVRUTEVfRU5ESUFOKTsgcmV0dXJuIChvYmouX19hc3NpZ24oX2JiLmdldEludChfYmIucG9zaXRpb24oKSkgKyBfYmIucG9zaXRpb24oKSwgX2JiKSk7IH0KKyAgcHVibGljIHZvaWQgX19pbml0KGludCBfaSwgQnl0ZUJ1ZmZlciBfYmIpIHsgX19yZXNldChfaSwgX2JiKTsgfQorICBwdWJsaWMgTG9uZ0Zsb2F0TWFwIF9fYXNzaWduKGludCBfaSwgQnl0ZUJ1ZmZlciBfYmIpIHsgX19pbml0KF9pLCBfYmIpOyByZXR1cm4gdGhpczsgfQorCisgIHB1YmxpYyBEaWN0aW9uYXJ5TG9va3VwLkxvbmdGbG9hdEVudHJ5IGVudHJpZXMoaW50IGopIHsgcmV0dXJuIGVudHJpZXMobmV3IERpY3Rpb25hcnlMb29rdXAuTG9uZ0Zsb2F0RW50cnkoKSwgaik7IH0KKyAgcHVibGljIERpY3Rpb25hcnlMb29rdXAuTG9uZ0Zsb2F0RW50cnkgZW50cmllcyhEaWN0aW9uYXJ5TG9va3VwLkxvbmdGbG9hdEVudHJ5IG9iaiwgaW50IGopIHsgaW50IG8gPSBfX29mZnNldCg0KTsgcmV0dXJuIG8gIT0gMCA/IG9iai5fX2Fzc2lnbihfX2luZGlyZWN0KF9fdmVjdG9yKG8pICsgaiAqIDQpLCBiYikgOiBudWxsOyB9CisgIHB1YmxpYyBpbnQgZW50cmllc0xlbmd0aCgpIHsgaW50IG8gPSBfX29mZnNldCg0KTsgcmV0dXJuIG8gIT0gMCA/IF9fdmVjdG9yX2xlbihvKSA6IDA7IH0KKyAgcHVibGljIERpY3Rpb25hcnlMb29rdXAuTG9uZ0Zsb2F0RW50cnkgZW50cmllc0J5S2V5KGxvbmcga2V5KSB7IGludCBvID0gX19vZmZzZXQoNCk7IHJldHVybiBvICE9IDAgPyBEaWN0aW9uYXJ5TG9va3VwLkxvbmdGbG9hdEVudHJ5Ll9fbG9va3VwX2J5X2tleShudWxsLCBfX3ZlY3RvcihvKSwga2V5LCBiYikgOiBudWxsOyB9CisgIHB1YmxpYyBEaWN0aW9uYXJ5TG9va3VwLkxvbmdGbG9hdEVudHJ5IGVudHJpZXNCeUtleShEaWN0aW9uYXJ5TG9va3VwLkxvbmdGbG9hdEVudHJ5IG9iaiwgbG9uZyBrZXkpIHsgaW50IG8gPSBfX29mZnNldCg0KTsgcmV0dXJuIG8gIT0gMCA/IERpY3Rpb25hcnlMb29rdXAuTG9uZ0Zsb2F0RW50cnkuX19sb29rdXBfYnlfa2V5KG9iaiwgX192ZWN0b3IobyksIGtleSwgYmIpIDogbnVsbDsgfQorICBwdWJsaWMgRGljdGlvbmFyeUxvb2t1cC5Mb25nRmxvYXRFbnRyeS5WZWN0b3IgZW50cmllc1ZlY3RvcigpIHsgcmV0dXJuIGVudHJpZXNWZWN0b3IobmV3IERpY3Rpb25hcnlMb29rdXAuTG9uZ0Zsb2F0RW50cnkuVmVjdG9yKCkpOyB9CisgIHB1YmxpYyBEaWN0aW9uYXJ5TG9va3VwLkxvbmdGbG9hdEVudHJ5LlZlY3RvciBlbnRyaWVzVmVjdG9yKERpY3Rpb25hcnlMb29rdXAuTG9uZ0Zsb2F0RW50cnkuVmVjdG9yIG9iaikgeyBpbnQgbyA9IF9fb2Zmc2V0KDQpOyByZXR1cm4gbyAhPSAwID8gb2JqLl9fYXNzaWduKF9fdmVjdG9yKG8pLCA0LCBiYikgOiBudWxsOyB9CisKKyAgcHVibGljIHN0YXRpYyBpbnQgY3JlYXRlTG9uZ0Zsb2F0TWFwKEZsYXRCdWZmZXJCdWlsZGVyIGJ1aWxkZXIsCisgICAgICBpbnQgZW50cmllc09mZnNldCkgeworICAgIGJ1aWxkZXIuc3RhcnRUYWJsZSgxKTsKKyAgICBMb25nRmxvYXRNYXAuYWRkRW50cmllcyhidWlsZGVyLCBlbnRyaWVzT2Zmc2V0KTsKKyAgICByZXR1cm4gTG9uZ0Zsb2F0TWFwLmVuZExvbmdGbG9hdE1hcChidWlsZGVyKTsKKyAgfQorCisgIHB1YmxpYyBzdGF0aWMgdm9pZCBzdGFydExvbmdGbG9hdE1hcChGbGF0QnVmZmVyQnVpbGRlciBidWlsZGVyKSB7IGJ1aWxkZXIuc3RhcnRUYWJsZSgxKTsgfQorICBwdWJsaWMgc3RhdGljIHZvaWQgYWRkRW50cmllcyhGbGF0QnVmZmVyQnVpbGRlciBidWlsZGVyLCBpbnQgZW50cmllc09mZnNldCkgeyBidWlsZGVyLmFkZE9mZnNldCgwLCBlbnRyaWVzT2Zmc2V0LCAwKTsgfQorICBwdWJsaWMgc3RhdGljIGludCBjcmVhdGVFbnRyaWVzVmVjdG9yKEZsYXRCdWZmZXJCdWlsZGVyIGJ1aWxkZXIsIGludFtdIGRhdGEpIHsgYnVpbGRlci5zdGFydFZlY3Rvcig0LCBkYXRhLmxlbmd0aCwgNCk7IGZvciAoaW50IGkgPSBkYXRhLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSBidWlsZGVyLmFkZE9mZnNldChkYXRhW2ldKTsgcmV0dXJuIGJ1aWxkZXIuZW5kVmVjdG9yKCk7IH0KKyAgcHVibGljIHN0YXRpYyB2b2lkIHN0YXJ0RW50cmllc1ZlY3RvcihGbGF0QnVmZmVyQnVpbGRlciBidWlsZGVyLCBpbnQgbnVtRWxlbXMpIHsgYnVpbGRlci5zdGFydFZlY3Rvcig0LCBudW1FbGVtcywgNCk7IH0KKyAgcHVibGljIHN0YXRpYyBpbnQgZW5kTG9uZ0Zsb2F0TWFwKEZsYXRCdWZmZXJCdWlsZGVyIGJ1aWxkZXIpIHsKKyAgICBpbnQgbyA9IGJ1aWxkZXIuZW5kVGFibGUoKTsKKyAgICByZXR1cm4gbzsKKyAgfQorICBwdWJsaWMgc3RhdGljIHZvaWQgZmluaXNoTG9uZ0Zsb2F0TWFwQnVmZmVyKEZsYXRCdWZmZXJCdWlsZGVyIGJ1aWxkZXIsIGludCBvZmZzZXQpIHsgYnVpbGRlci5maW5pc2gob2Zmc2V0KTsgfQorICBwdWJsaWMgc3RhdGljIHZvaWQgZmluaXNoU2l6ZVByZWZpeGVkTG9uZ0Zsb2F0TWFwQnVmZmVyKEZsYXRCdWZmZXJCdWlsZGVyIGJ1aWxkZXIsIGludCBvZmZzZXQpIHsgYnVpbGRlci5maW5pc2hTaXplUHJlZml4ZWQob2Zmc2V0KTsgfQorCisgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgVmVjdG9yIGV4dGVuZHMgQmFzZVZlY3RvciB7CisgICAgcHVibGljIFZlY3RvciBfX2Fzc2lnbihpbnQgX3ZlY3RvciwgaW50IF9lbGVtZW50X3NpemUsIEJ5dGVCdWZmZXIgX2JiKSB7IF9fcmVzZXQoX3ZlY3RvciwgX2VsZW1lbnRfc2l6ZSwgX2JiKTsgcmV0dXJuIHRoaXM7IH0KKworICAgIHB1YmxpYyBMb25nRmxvYXRNYXAgZ2V0KGludCBqKSB7IHJldHVybiBnZXQobmV3IExvbmdGbG9hdE1hcCgpLCBqKTsgfQorICAgIHB1YmxpYyBMb25nRmxvYXRNYXAgZ2V0KExvbmdGbG9hdE1hcCBvYmosIGludCBqKSB7ICByZXR1cm4gb2JqLl9fYXNzaWduKF9faW5kaXJlY3QoX19lbGVtZW50KGopLCBiYiksIGJiKTsgfQorICB9Cit9CisKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL0RpY3Rpb25hcnlMb29rdXAvTG9uZ0Zsb2F0TWFwLmt0IGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvRGljdGlvbmFyeUxvb2t1cC9Mb25nRmxvYXRNYXAua3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2FjMTVhYQotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL0RpY3Rpb25hcnlMb29rdXAvTG9uZ0Zsb2F0TWFwLmt0CkBAIC0wLDAgKzEsNzcgQEAKKy8vIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGJ5IHRoZSBGbGF0QnVmZmVycyBjb21waWxlciwgZG8gbm90IG1vZGlmeQorCitwYWNrYWdlIERpY3Rpb25hcnlMb29rdXAKKworaW1wb3J0IGphdmEubmlvLioKK2ltcG9ydCBrb3RsaW4ubWF0aC5zaWduCitpbXBvcnQgY29tLmdvb2dsZS5mbGF0YnVmZmVycy4qCisKK0BTdXBwcmVzcygidW51c2VkIikKK2NsYXNzIExvbmdGbG9hdE1hcCA6IFRhYmxlKCkgeworCisgICAgZnVuIF9faW5pdChfaTogSW50LCBfYmI6IEJ5dGVCdWZmZXIpICB7CisgICAgICAgIF9fcmVzZXQoX2ksIF9iYikKKyAgICB9CisgICAgZnVuIF9fYXNzaWduKF9pOiBJbnQsIF9iYjogQnl0ZUJ1ZmZlcikgOiBMb25nRmxvYXRNYXAgeworICAgICAgICBfX2luaXQoX2ksIF9iYikKKyAgICAgICAgcmV0dXJuIHRoaXMKKyAgICB9CisgICAgZnVuIGVudHJpZXMoajogSW50KSA6IERpY3Rpb25hcnlMb29rdXAuTG9uZ0Zsb2F0RW50cnk/ID0gZW50cmllcyhEaWN0aW9uYXJ5TG9va3VwLkxvbmdGbG9hdEVudHJ5KCksIGopCisgICAgZnVuIGVudHJpZXMob2JqOiBEaWN0aW9uYXJ5TG9va3VwLkxvbmdGbG9hdEVudHJ5LCBqOiBJbnQpIDogRGljdGlvbmFyeUxvb2t1cC5Mb25nRmxvYXRFbnRyeT8geworICAgICAgICB2YWwgbyA9IF9fb2Zmc2V0KDQpCisgICAgICAgIHJldHVybiBpZiAobyAhPSAwKSB7CisgICAgICAgICAgICBvYmouX19hc3NpZ24oX19pbmRpcmVjdChfX3ZlY3RvcihvKSArIGogKiA0KSwgYmIpCisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBudWxsCisgICAgICAgIH0KKyAgICB9CisgICAgdmFsIGVudHJpZXNMZW5ndGggOiBJbnQKKyAgICAgICAgZ2V0KCkgeworICAgICAgICAgICAgdmFsIG8gPSBfX29mZnNldCg0KTsgcmV0dXJuIGlmIChvICE9IDApIF9fdmVjdG9yX2xlbihvKSBlbHNlIDAKKyAgICAgICAgfQorICAgIGZ1biBlbnRyaWVzQnlLZXkoa2V5OiBMb25nKSA6IERpY3Rpb25hcnlMb29rdXAuTG9uZ0Zsb2F0RW50cnk/IHsKKyAgICAgICAgdmFsIG8gPSBfX29mZnNldCg0KQorICAgICAgICByZXR1cm4gaWYgKG8gIT0gMCkgeworICAgICAgICAgICAgRGljdGlvbmFyeUxvb2t1cC5Mb25nRmxvYXRFbnRyeS5fX2xvb2t1cF9ieV9rZXkobnVsbCwgX192ZWN0b3IobyksIGtleSwgYmIpCisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBudWxsCisgICAgICAgIH0KKyAgICB9CisgICAgZnVuIGVudHJpZXNCeUtleShvYmo6IERpY3Rpb25hcnlMb29rdXAuTG9uZ0Zsb2F0RW50cnksIGtleTogTG9uZykgOiBEaWN0aW9uYXJ5TG9va3VwLkxvbmdGbG9hdEVudHJ5PyB7CisgICAgICAgIHZhbCBvID0gX19vZmZzZXQoNCkKKyAgICAgICAgcmV0dXJuIGlmIChvICE9IDApIHsKKyAgICAgICAgICAgIERpY3Rpb25hcnlMb29rdXAuTG9uZ0Zsb2F0RW50cnkuX19sb29rdXBfYnlfa2V5KG9iaiwgX192ZWN0b3IobyksIGtleSwgYmIpCisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBudWxsCisgICAgICAgIH0KKyAgICB9CisgICAgY29tcGFuaW9uIG9iamVjdCB7CisgICAgICAgIGZ1biB2YWxpZGF0ZVZlcnNpb24oKSA9IENvbnN0YW50cy5GTEFUQlVGRkVSU18yXzBfOCgpCisgICAgICAgIGZ1biBnZXRSb290QXNMb25nRmxvYXRNYXAoX2JiOiBCeXRlQnVmZmVyKTogTG9uZ0Zsb2F0TWFwID0gZ2V0Um9vdEFzTG9uZ0Zsb2F0TWFwKF9iYiwgTG9uZ0Zsb2F0TWFwKCkpCisgICAgICAgIGZ1biBnZXRSb290QXNMb25nRmxvYXRNYXAoX2JiOiBCeXRlQnVmZmVyLCBvYmo6IExvbmdGbG9hdE1hcCk6IExvbmdGbG9hdE1hcCB7CisgICAgICAgICAgICBfYmIub3JkZXIoQnl0ZU9yZGVyLkxJVFRMRV9FTkRJQU4pCisgICAgICAgICAgICByZXR1cm4gKG9iai5fX2Fzc2lnbihfYmIuZ2V0SW50KF9iYi5wb3NpdGlvbigpKSArIF9iYi5wb3NpdGlvbigpLCBfYmIpKQorICAgICAgICB9CisgICAgICAgIGZ1biBjcmVhdGVMb25nRmxvYXRNYXAoYnVpbGRlcjogRmxhdEJ1ZmZlckJ1aWxkZXIsIGVudHJpZXNPZmZzZXQ6IEludCkgOiBJbnQgeworICAgICAgICAgICAgYnVpbGRlci5zdGFydFRhYmxlKDEpCisgICAgICAgICAgICBhZGRFbnRyaWVzKGJ1aWxkZXIsIGVudHJpZXNPZmZzZXQpCisgICAgICAgICAgICByZXR1cm4gZW5kTG9uZ0Zsb2F0TWFwKGJ1aWxkZXIpCisgICAgICAgIH0KKyAgICAgICAgZnVuIHN0YXJ0TG9uZ0Zsb2F0TWFwKGJ1aWxkZXI6IEZsYXRCdWZmZXJCdWlsZGVyKSA9IGJ1aWxkZXIuc3RhcnRUYWJsZSgxKQorICAgICAgICBmdW4gYWRkRW50cmllcyhidWlsZGVyOiBGbGF0QnVmZmVyQnVpbGRlciwgZW50cmllczogSW50KSA9IGJ1aWxkZXIuYWRkT2Zmc2V0KDAsIGVudHJpZXMsIDApCisgICAgICAgIGZ1biBjcmVhdGVFbnRyaWVzVmVjdG9yKGJ1aWxkZXI6IEZsYXRCdWZmZXJCdWlsZGVyLCBkYXRhOiBJbnRBcnJheSkgOiBJbnQgeworICAgICAgICAgICAgYnVpbGRlci5zdGFydFZlY3Rvcig0LCBkYXRhLnNpemUsIDQpCisgICAgICAgICAgICBmb3IgKGkgaW4gZGF0YS5zaXplIC0gMSBkb3duVG8gMCkgeworICAgICAgICAgICAgICAgIGJ1aWxkZXIuYWRkT2Zmc2V0KGRhdGFbaV0pCisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gYnVpbGRlci5lbmRWZWN0b3IoKQorICAgICAgICB9CisgICAgICAgIGZ1biBzdGFydEVudHJpZXNWZWN0b3IoYnVpbGRlcjogRmxhdEJ1ZmZlckJ1aWxkZXIsIG51bUVsZW1zOiBJbnQpID0gYnVpbGRlci5zdGFydFZlY3Rvcig0LCBudW1FbGVtcywgNCkKKyAgICAgICAgZnVuIGVuZExvbmdGbG9hdE1hcChidWlsZGVyOiBGbGF0QnVmZmVyQnVpbGRlcikgOiBJbnQgeworICAgICAgICAgICAgdmFsIG8gPSBidWlsZGVyLmVuZFRhYmxlKCkKKyAgICAgICAgICAgIHJldHVybiBvCisgICAgICAgIH0KKyAgICAgICAgZnVuIGZpbmlzaExvbmdGbG9hdE1hcEJ1ZmZlcihidWlsZGVyOiBGbGF0QnVmZmVyQnVpbGRlciwgb2Zmc2V0OiBJbnQpID0gYnVpbGRlci5maW5pc2gob2Zmc2V0KQorICAgICAgICBmdW4gZmluaXNoU2l6ZVByZWZpeGVkTG9uZ0Zsb2F0TWFwQnVmZmVyKGJ1aWxkZXI6IEZsYXRCdWZmZXJCdWlsZGVyLCBvZmZzZXQ6IEludCkgPSBidWlsZGVyLmZpbmlzaFNpemVQcmVmaXhlZChvZmZzZXQpCisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvRmxhdEJ1ZmZlcnMuQmVuY2htYXJrcy5zd2lmdC9Tb3VyY2VzL0ZsYXRCdWZmZXJzLkJlbmNobWFya3Muc3dpZnQvbWFpbi5zd2lmdCBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL0ZsYXRCdWZmZXJzLkJlbmNobWFya3Muc3dpZnQvU291cmNlcy9GbGF0QnVmZmVycy5CZW5jaG1hcmtzLnN3aWZ0L21haW4uc3dpZnQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ5NDkwMDQuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvRmxhdEJ1ZmZlcnMuQmVuY2htYXJrcy5zd2lmdC9Tb3VyY2VzL0ZsYXRCdWZmZXJzLkJlbmNobWFya3Muc3dpZnQvbWFpbi5zd2lmdAorKysgL2Rldi9udWxsCkBAIC0xLDE0MSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMjEgR29vZ2xlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1pbXBvcnQgQ29yZUZvdW5kYXRpb24KLWltcG9ydCBGbGF0QnVmZmVycwotCi1zdHJ1Y3QgQmVuY2htYXJrIHsKLSAgdmFyIG5hbWU6IFN0cmluZwotICB2YXIgdmFsdWU6IERvdWJsZQotCi0gIHZhciBkZXNjcmlwdGlvbjogU3RyaW5nIHsKLSAgICAiXChTdHJpbmcoZm9ybWF0OiAifFx0JUBcdFx0fFx0XHQlZnNcdHwiLCBuYW1lLCB2YWx1ZSkpIn0KLX0KLQotZnVuYyBydW4obmFtZTogU3RyaW5nLCBydW5zOiBJbnQsIGFjdGlvbjogKCkgLT4gVm9pZCkgLT4gQmVuY2htYXJrIHsKLSAgYWN0aW9uKCkKLSAgbGV0IHN0YXJ0ID0gQ0ZBYnNvbHV0ZVRpbWVHZXRDdXJyZW50KCkKLSAgZm9yIF8gaW4gMC4uPHJ1bnMgewotICAgIGFjdGlvbigpCi0gIH0KLSAgbGV0IGVuZHMgPSBDRkFic29sdXRlVGltZUdldEN1cnJlbnQoKQotICBsZXQgdmFsdWUgPSBEb3VibGUoZW5kcyAtIHN0YXJ0KSAvIERvdWJsZShydW5zKQotICBwcmludCgiZG9uZSBcKG5hbWUpOiBpbiBcKHZhbHVlKSIpCi0gIHJldHVybiBCZW5jaG1hcmsobmFtZTogbmFtZSwgdmFsdWU6IHZhbHVlKQotfQotCi0KLWZ1bmMgY3JlYXRlRG9jdW1lbnQoQmVuY2htYXJrczogW0JlbmNobWFya10pIC0+IFN0cmluZyB7Ci0gIGxldCBzZXBhcmF0b3IgPSAiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIKLSAgdmFyIGRvY3VtZW50ID0gIlwoc2VwYXJhdG9yKVxuIgotICBkb2N1bWVudCArPSAiXChTdHJpbmcoZm9ybWF0OiAifFx0JUBcdFx0ICB8XHRcdCVAXHRcdHwiLCAiTmFtZSIsICJTY29yZXMiKSlcbiIKLSAgZG9jdW1lbnQgKz0gIlwoc2VwYXJhdG9yKVxuIgotICBmb3IgaSBpbiBCZW5jaG1hcmtzIHsKLSAgICBkb2N1bWVudCArPSAiXChpLmRlc2NyaXB0aW9uKSBcbiIKLSAgICBkb2N1bWVudCArPSAiXChzZXBhcmF0b3IpXG4iCi0gIH0KLSAgcmV0dXJuIGRvY3VtZW50Ci19Ci0KLUBpbmxpbmFibGUKLWZ1bmMgY3JlYXRlMTBTdHJpbmdzKCkgewotICB2YXIgZmIgPSBGbGF0QnVmZmVyQnVpbGRlcihpbml0aWFsU2l6ZTogMTw8MjApCi0gIGZvciBfIGluIDAuLjwxMF8wMDAgewotICAgIF8gPSBmYi5jcmVhdGUoc3RyaW5nOiAiZm9vYmFyYmF6IikKLSAgfQotfQotCi1AaW5saW5hYmxlCi1mdW5jIGNyZWF0ZTEwMFN0cmluZ3Moc3RyOiBTdHJpbmcpIHsKLSAgdmFyIGZiID0gRmxhdEJ1ZmZlckJ1aWxkZXIoaW5pdGlhbFNpemU6IDE8PDIwKQotICBmb3IgXyBpbiAwLi48MTBfMDAwIHsKLSAgICBfID0gZmIuY3JlYXRlKHN0cmluZzogc3RyKQotICB9Ci19Ci0KLUBpbmxpbmFibGUKLWZ1bmMgYmVuY2htYXJrRml2ZUh1bmRyZWRBZGRzKCkgewotICB2YXIgZmIgPSBGbGF0QnVmZmVyQnVpbGRlcihpbml0aWFsU2l6ZTogMTAyNCAqIDEwMjQgKiAzMikKLSAgZm9yIF8gaW4gMC4uPDUwMF8wMDAgewotICAgIGxldCBvZmYgPSBmYi5jcmVhdGUoc3RyaW5nOiAiVCIpCi0gICAgbGV0IHMgPSBmYi5zdGFydFRhYmxlKHdpdGg6IDQpCi0gICAgZmIuYWRkKGVsZW1lbnQ6IDMuMiwgZGVmOiAwLCBhdDogMikKLSAgICBmYi5hZGQoZWxlbWVudDogNC4yLCBkZWY6IDAsIGF0OiA0KQotICAgIGZiLmFkZChlbGVtZW50OiA1LjIsIGRlZjogMCwgYXQ6IDYpCi0gICAgZmIuYWRkKG9mZnNldDogb2ZmLCBhdDogOCkKLSAgICBfID0gZmIuZW5kVGFibGUoYXQ6IHMpCi0gIH0KLX0KLQotQGlubGluYWJsZQotZnVuYyBiZW5jaG1hcmtUaHJlZU1pbGxpb25TdHJ1Y3RzKCkgewotICBsZXQgc3RydWN0Q291bnQgPSAzXzAwMF8wMDAKLQotICBsZXQgcmF3U2l6ZSA9ICgoMTYgKiA1KSAqIHN0cnVjdENvdW50KSAvIDEwMjQKLQotICB2YXIgZmIgPSBGbGF0QnVmZmVyQnVpbGRlcihpbml0aWFsU2l6ZTogSW50MzIocmF3U2l6ZSAqIDE2MDApKQotCi0gIHZhciBvZmZzZXRzOiBbT2Zmc2V0XSA9IFtdCi0gIGZvciBfIGluIDAuLjxzdHJ1Y3RDb3VudCB7Ci0gICAgZmIuc3RhcnRWZWN0b3IoCi0gICAgICA1ICogTWVtb3J5TGF5b3V0PEFBPi5zaXplLAotICAgICAgZWxlbWVudFNpemU6IE1lbW9yeUxheW91dDxBQT4uYWxpZ25tZW50KQotICAgIGZvciBfIGluIDAuLjw1IHsKLSAgICAgIF8gPSBmYi5jcmVhdGUoc3RydWN0OiBBQShhOiAyLjQsIGI6IDIuNCkpCi0gICAgfQotICAgIGxldCB2ZWN0b3IgPSBmYi5lbmRWZWN0b3IobGVuOiA1KQotICAgIGxldCBzdGFydCA9IGZiLnN0YXJ0VGFibGUod2l0aDogMSkKLSAgICBmYi5hZGQob2Zmc2V0OiB2ZWN0b3IsIGF0OiA0KQotICAgIG9mZnNldHMuYXBwZW5kKE9mZnNldChvZmZzZXQ6IGZiLmVuZFRhYmxlKGF0OiBzdGFydCkpKQotICB9Ci0gIGxldCB2ZWN0b3IgPSBmYi5jcmVhdGVWZWN0b3Iob2ZPZmZzZXRzOiBvZmZzZXRzKQotICBsZXQgc3RhcnQgPSBmYi5zdGFydFRhYmxlKHdpdGg6IDEpCi0gIGZiLmFkZChvZmZzZXQ6IHZlY3RvciwgYXQ6IDQpCi0gIGxldCByb290ID0gT2Zmc2V0KG9mZnNldDogZmIuZW5kVGFibGUoYXQ6IHN0YXJ0KSkKLSAgZmIuZmluaXNoKG9mZnNldDogcm9vdCkKLX0KLQotQHVzYWJsZUZyb21JbmxpbmUKLXN0cnVjdCBBQTogTmF0aXZlU3RydWN0IHsKLSAgcHVibGljIGluaXQoYTogRG91YmxlLCBiOiBEb3VibGUpIHsKLSAgICBzZWxmLmEgPSBhCi0gICAgc2VsZi5iID0gYgotICB9Ci0gIHZhciBhOiBEb3VibGUKLSAgdmFyIGI6IERvdWJsZQotCi19Ci0KLWZ1bmMgYmVuY2htYXJrKG51bWJlck9mUnVucyBydW5zOiBJbnQpIHsKLSAgdmFyIGJlbmNobWFya3M6IFtCZW5jaG1hcmtdID0gW10KLSAgbGV0IHN0ciA9ICgwLi4uOTkpLm1hcCB7IF8gLT4gU3RyaW5nIGluICJ4IiB9LmpvaW5lZCgpCi0gIGJlbmNobWFya3MuYXBwZW5kKHJ1bigKLSAgICBuYW1lOiAiNTAwXzAwMCIsCi0gICAgcnVuczogcnVucywKLSAgICBhY3Rpb246IGJlbmNobWFya0ZpdmVIdW5kcmVkQWRkcykpCi0gIGJlbmNobWFya3MuYXBwZW5kKHJ1bihuYW1lOiAiMTAgc3RyIiwgcnVuczogcnVucywgYWN0aW9uOiBjcmVhdGUxMFN0cmluZ3MpKQotICBsZXQgaHVuZHJlZFN0ciA9IHJ1bihuYW1lOiAiMTAwIHN0ciIsIHJ1bnM6IHJ1bnMpIHsKLSAgICBjcmVhdGUxMDBTdHJpbmdzKHN0cjogc3RyKQotICB9Ci0gIGJlbmNobWFya3MuYXBwZW5kKHJ1bigKLSAgICBuYW1lOiAiM00gc3RyYyIsCi0gICAgcnVuczogMSwKLSAgICBhY3Rpb246IGJlbmNobWFya1RocmVlTWlsbGlvblN0cnVjdHMpKQotICBiZW5jaG1hcmtzLmFwcGVuZChodW5kcmVkU3RyKQotICBwcmludChjcmVhdGVEb2N1bWVudChCZW5jaG1hcmtzOiBiZW5jaG1hcmtzKSkKLX0KLQotYmVuY2htYXJrKG51bWJlck9mUnVuczogMjApCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9GbGF0QnVmZmVycy5CZW5jaG1hcmtzL0ZsYXRCdWZmZXJCdWlsZGVyQmVuY2htYXJrLmNzIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvRmxhdEJ1ZmZlcnMuQmVuY2htYXJrcy9GbGF0QnVmZmVyQnVpbGRlckJlbmNobWFyay5jcwppbmRleCAxZGY1YWMzLi5iMzg1ODg1IDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9GbGF0QnVmZmVycy5CZW5jaG1hcmtzL0ZsYXRCdWZmZXJCdWlsZGVyQmVuY2htYXJrLmNzCisrKyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL0ZsYXRCdWZmZXJzLkJlbmNobWFya3MvRmxhdEJ1ZmZlckJ1aWxkZXJCZW5jaG1hcmsuY3MKQEAgLTE3LDcgKzE3LDcgQEAKIHVzaW5nIEJlbmNobWFya0RvdE5ldC5BdHRyaWJ1dGVzOwogdXNpbmcgTXlHYW1lLkV4YW1wbGU7CiAKLW5hbWVzcGFjZSBGbGF0QnVmZmVycy5CZW5jaG1hcmtzCituYW1lc3BhY2UgR29vZ2xlLkZsYXRCdWZmZXJzLkJlbmNobWFya3MKIHsKICAgICAvL1tFdHdQcm9maWxlcl0gLSBuZWVkcyBlbGV2YXRlZCBwcml2aWxlZ2VzCiAgICAgW01lbW9yeURpYWdub3Nlcl0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL0ZsYXRCdWZmZXJzLkJlbmNobWFya3MvUHJvZ3JhbS5jcyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL0ZsYXRCdWZmZXJzLkJlbmNobWFya3MvUHJvZ3JhbS5jcwppbmRleCA5ZTYzYjRiLi5mYTE1MmNhIDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9GbGF0QnVmZmVycy5CZW5jaG1hcmtzL1Byb2dyYW0uY3MKKysrIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvRmxhdEJ1ZmZlcnMuQmVuY2htYXJrcy9Qcm9ncmFtLmNzCkBAIC0xNiw3ICsxNiw3IEBACiAKIHVzaW5nIEJlbmNobWFya0RvdE5ldC5SdW5uaW5nOwogCi1uYW1lc3BhY2UgRmxhdEJ1ZmZlcnMuQmVuY2htYXJrcworbmFtZXNwYWNlIEdvb2dsZS5GbGF0QnVmZmVycy5CZW5jaG1hcmtzCiB7CiAgICAgcHVibGljIHN0YXRpYyBjbGFzcyBQcm9ncmFtCiAgICAgewpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvRmxhdEJ1ZmZlcnMuVGVzdC5Td2lmdC9Td2lmdFRlc3Quc2ggYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9GbGF0QnVmZmVycy5UZXN0LlN3aWZ0L1N3aWZ0VGVzdC5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOTlhYjFmMS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9GbGF0QnVmZmVycy5UZXN0LlN3aWZ0L1N3aWZ0VGVzdC5zaAorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLXN3aWZ0X2Rpcj1gcHdkYAotY2QgLi4KLXRlc3RfZGlyPWBwd2RgCi1hbGlhcyBmYmM9JyR7dGVzdF9kaXJ9Ly4uL2ZsYXRjJwotc2hvcHQgLXMgZXhwYW5kX2FsaWFzZXMKLQotY2QgJHtzd2lmdF9kaXJ9L1Rlc3RzL0ZsYXRCdWZmZXJzLlRlc3QuU3dpZnRUZXN0cwotZmJjIC0tc3dpZnQgLS1nZW4tbXV0YWJsZSAtLWdycGMgLS1nZW4tanNvbi1lbWl0IC0tZ2VuLW9iamVjdC1hcGkgLUkgJHt0ZXN0X2Rpcn0vaW5jbHVkZV90ZXN0ICR7dGVzdF9kaXJ9L21vbnN0ZXJfdGVzdC5mYnMgJHt0ZXN0X2Rpcn0vdW5pb25fdmVjdG9yL3VuaW9uX3ZlY3Rvci5mYnMKLWZiYyAtLXN3aWZ0IC0tZ2VuLWpzb24tZW1pdCAke3Rlc3RfZGlyfS9vcHRpb25hbF9zY2FsYXJzLmZicwotZmJjIC0tc3dpZnQgLS1nZW4tanNvbi1lbWl0IC0tZ2VuLW9iamVjdC1hcGkgJHt0ZXN0X2Rpcn0vbW9yZV9kZWZhdWx0cy5mYnMKLWZiYyAtLXN3aWZ0IC0tZ2VuLWpzb24tZW1pdCAtLWdlbi1tdXRhYmxlIC0tZ2VuLW9iamVjdC1hcGkgJHt0ZXN0X2Rpcn0vTXV0YXRpbmdCb29sLmZicwotY2QgJHtzd2lmdF9kaXJ9Ci0KLWNkICR7c3dpZnRfZGlyfS9Tb3VyY2VzL1N3aWZ0RmxhdEJ1ZmZlcnMKLSMgY3JlYXRlIGJldHRlciBmdXp6aW5nIHRlc3QgZmlsZQotZmJjIC0tc3dpZnQgLS1nZW4tanNvbi1lbWl0IGZ1enplci5mYnMKLWNkICR7c3dpZnRfZGlyfQotCi1zd2lmdCBidWlsZCAtLWJ1aWxkLXRlc3RzCi1zd2lmdCB0ZXN0Ci0KLWlmIFsgJCh1bmFtZSAtcykgIT0gRGFyd2luIF07IHRoZW4KLSAgZWNobyBmdXp6aW5nCi0gIHN3aWZ0IGJ1aWxkIC1jIGRlYnVnIC1Yc3dpZnRjIC1zYW5pdGl6ZT1mdXp6ZXIsYWRkcmVzcyAtWHN3aWZ0YyAtcGFyc2UtYXMtbGlicmFyeQotICBzd2lmdCBidWlsZCAtYyByZWxlYXNlIC1Yc3dpZnRjIC1zYW5pdGl6ZT1mdXp6ZXIsYWRkcmVzcyAtWHN3aWZ0YyAtcGFyc2UtYXMtbGlicmFyeQotZmkKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL0ZsYXRCdWZmZXJzLlRlc3QvQXNzZXJ0LmNzIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvRmxhdEJ1ZmZlcnMuVGVzdC9Bc3NlcnQuY3MKaW5kZXggNDg4YzMzOC4uN2JiODAwNCAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvRmxhdEJ1ZmZlcnMuVGVzdC9Bc3NlcnQuY3MKKysrIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvRmxhdEJ1ZmZlcnMuVGVzdC9Bc3NlcnQuY3MKQEAgLTE5LDcgKzE5LDcgQEAKIHVzaW5nIFN5c3RlbS5MaW5xOwogdXNpbmcgU3lzdGVtLlRleHQ7CiAKLW5hbWVzcGFjZSBGbGF0QnVmZmVycy5UZXN0CituYW1lc3BhY2UgR29vZ2xlLkZsYXRCdWZmZXJzLlRlc3QKIHsKIAogICAgIHB1YmxpYyBjbGFzcyBBc3NlcnRGYWlsZWRFeGNlcHRpb24gOiBFeGNlcHRpb24KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL0ZsYXRCdWZmZXJzLlRlc3QvQnl0ZUJ1ZmZlclRlc3RzLmNzIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvRmxhdEJ1ZmZlcnMuVGVzdC9CeXRlQnVmZmVyVGVzdHMuY3MKaW5kZXggOThlOTE3Yy4uNmJmZjJhYyAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvRmxhdEJ1ZmZlcnMuVGVzdC9CeXRlQnVmZmVyVGVzdHMuY3MKKysrIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvRmxhdEJ1ZmZlcnMuVGVzdC9CeXRlQnVmZmVyVGVzdHMuY3MKQEAgLTE1LDggKzE1LDkgQEAKICAqLwogCiB1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uUnVudGltZS5JbnRlcm9wU2VydmljZXM7CiAKLW5hbWVzcGFjZSBGbGF0QnVmZmVycy5UZXN0CituYW1lc3BhY2UgR29vZ2xlLkZsYXRCdWZmZXJzLlRlc3QKIHsKICAgICBbRmxhdEJ1ZmZlcnNUZXN0Q2xhc3NdCiAgICAgcHVibGljIGNsYXNzIEJ5dGVCdWZmZXJUZXN0cwpAQCAtNDA4LDYgKzQwOSw2MCBAQAogICAgICAgICAgICAgQXNzZXJ0LkFycmF5RXF1YWwoZGF0YSwgYmJBcnJheSk7CiAgICAgICAgIH0KIAorICAgICAgICBwdWJsaWMgdm9pZCBCeXRlQnVmZmVyX1B1dF9BcnJheVNlZ21lbnRfSGVscGVyPFQ+KEFycmF5U2VnbWVudDxUPiBkYXRhLCBpbnQgdHlwZVNpemUpCisgICAgICAgICAgICB3aGVyZSBUIDogc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIENyZWF0ZSB0aGUgQnl0ZSBCdWZmZXIKKyAgICAgICAgICAgIHZhciB1dXQgPSBuZXcgQnl0ZUJ1ZmZlcigxMDI0KTsKKworICAgICAgICAgICAgLy8gUHV0IHRoZSBkYXRhIGludG8gdGhlIGJ1ZmZlciBhbmQgbWFrZSBzdXJlIHRoZSBvZmZzZXQgaXMKKyAgICAgICAgICAgIC8vIGNhbGN1bGF0ZWQgY29ycmVjdGx5CisgICAgICAgICAgICBpbnQgbk9mZnNldCA9IHV1dC5QdXQoMTAyNCwgZGF0YSk7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMTAyNCAtIHR5cGVTaXplICogZGF0YS5Db3VudCwgbk9mZnNldCk7CisgICAgICAKKyAgICAgICAgICAgIC8vIEdldCB0aGUgZnVsbCBhcnJheSBiYWNrIG91dCBhbmQgZW5zdXJlIHRoZXkgYXJlIGVxdWl2YWxlbnQKKyAgICAgICAgICAgIHZhciBiYkFycmF5ID0gdXV0LlRvQXJyYXk8VD4obk9mZnNldCwgZGF0YS5Db3VudCk7CisgICAgICAgICAgICBBc3NlcnQuQXJyYXlFcXVhbChkYXRhLlRvQXJyYXkoKSwgYmJBcnJheSk7CisgICAgICAgIH0KKyAgICAKKyAgICAgICAgcHVibGljIHVuc2FmZSB2b2lkIEJ5dGVCdWZmZXJfUHV0X0ludFB0cl9IZWxwZXI8VD4oVFtdIGRhdGEsIGludCB0eXBlU2l6ZSkKKyAgICAgICAgICAgIHdoZXJlIFQgOiBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgR0NIYW5kbGUgaGFuZGxlID0gR0NIYW5kbGUuQWxsb2MoZGF0YSwgR0NIYW5kbGVUeXBlLlBpbm5lZCk7CisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgZGF0YVB0ciA9IGhhbmRsZS5BZGRyT2ZQaW5uZWRPYmplY3QoKTsKKyAgICAgICAgICAgICAgICB2YXIgc2l6ZUluQnl0ZXMgPSBkYXRhLkxlbmd0aCAqIHR5cGVTaXplOworCisgICAgICAgICAgICAgICAgLy8gQ3JlYXRlIHRoZSBCeXRlIEJ1ZmZlcgorICAgICAgICAgICAgICAgIHZhciB1dXQgPSBuZXcgQnl0ZUJ1ZmZlcigxMDI0KTsKKworICAgICAgICAgICAgICAgIC8vIFB1dCB0aGUgZGF0YSBpbnRvIHRoZSBidWZmZXIgYW5kIG1ha2Ugc3VyZSB0aGUgb2Zmc2V0IGlzCisgICAgICAgICAgICAgICAgLy8gY2FsY3VsYXRlZCBjb3JyZWN0bHkKKyAgICAgICAgICAgICAgICBpbnQgbk9mZnNldCA9IHV1dC5QdXQ8VD4oMTAyNCwgZGF0YVB0ciwgc2l6ZUluQnl0ZXMpOworICAgICAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgxMDI0IC0gc2l6ZUluQnl0ZXMsIG5PZmZzZXQpOworCisgICAgICAgICAgICAgICAgLy8gR2V0IHRoZSBmdWxsIGFycmF5IGJhY2sgb3V0IGFuZCBlbnN1cmUgdGhleSBhcmUgZXF1aXZhbGVudAorICAgICAgICAgICAgICAgIHZhciBiYkFycmF5ID0gdXV0LlRvQXJyYXk8VD4obk9mZnNldCwgZGF0YS5MZW5ndGgpOworICAgICAgICAgICAgICAgIEFzc2VydC5BcnJheUVxdWFsKGRhdGEsIGJiQXJyYXkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZmluYWxseQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGhhbmRsZS5GcmVlKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBCeXRlQnVmZmVyX1B1dF9BcnJheVR5cGVzX0hlbHBlcjxUPihUW10gZGF0YSwgaW50IHR5cGVTaXplKQorICAgICAgICAgICAgd2hlcmUgVCA6IHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBCeXRlQnVmZmVyX1B1dF9BcnJheV9IZWxwZXIoZGF0YSwgdHlwZVNpemUpOworCisgICAgICAgICAgICB2YXIgYXJyYXlTZWdtZW50ID0gQ3JlYXRlQXJyYXlTZWdtZW50KGRhdGEpOworICAgICAgICAgICAgQnl0ZUJ1ZmZlcl9QdXRfQXJyYXlTZWdtZW50X0hlbHBlcihhcnJheVNlZ21lbnQsIHR5cGVTaXplKTsKKworICAgICAgICAgICAgQnl0ZUJ1ZmZlcl9QdXRfSW50UHRyX0hlbHBlcihkYXRhLCB0eXBlU2l6ZSk7CisgICAgICAgIH0KKwogICAgICAgICBbRmxhdEJ1ZmZlcnNUZXN0TWV0aG9kXQogICAgICAgICBwdWJsaWMgdm9pZCBCeXRlQnVmZmVyX1B1dF9BcnJheV9GbG9hdCgpCiAgICAgICAgIHsKQEAgLTQyNSw3ICs0ODAsNyBAQAogICAgICAgICAgICAgZGF0YVs3XSA9IDE1Ljk5OTRGOwogICAgICAgICAgICAgZGF0YVs4XSA9IDE4Ljk5ODRGOwogCi0gICAgICAgICAgICBCeXRlQnVmZmVyX1B1dF9BcnJheV9IZWxwZXIoZGF0YSwgc2l6ZW9mKGZsb2F0KSk7CisgICAgICAgICAgICBCeXRlQnVmZmVyX1B1dF9BcnJheVR5cGVzX0hlbHBlcihkYXRhLCBzaXplb2YoZmxvYXQpKTsKICAgICAgICAgfQogCiAgICAgICAgIFtGbGF0QnVmZmVyc1Rlc3RNZXRob2RdCkBAIC00NDUsNyArNTAwLDcgQEAKICAgICAgICAgICAgIGRhdGFbN10gPSAxNS45OTk0OwogICAgICAgICAgICAgZGF0YVs4XSA9IDE4Ljk5ODQ7CiAKLSAgICAgICAgICAgIEJ5dGVCdWZmZXJfUHV0X0FycmF5X0hlbHBlcihkYXRhLCBzaXplb2YoZG91YmxlKSk7CisgICAgICAgICAgICBCeXRlQnVmZmVyX1B1dF9BcnJheVR5cGVzX0hlbHBlcihkYXRhLCBzaXplb2YoZG91YmxlKSk7CiAgICAgICAgIH0KIAogICAgICAgICBbRmxhdEJ1ZmZlcnNUZXN0TWV0aG9kXQpAQCAtNDY1LDcgKzUyMCw3IEBACiAgICAgICAgICAgICBkYXRhWzddID0gMTU7CiAgICAgICAgICAgICBkYXRhWzhdID0gMTg7CiAKLSAgICAgICAgICAgIEJ5dGVCdWZmZXJfUHV0X0FycmF5X0hlbHBlcihkYXRhLCBzaXplb2YoaW50KSk7CisgICAgICAgICAgICBCeXRlQnVmZmVyX1B1dF9BcnJheVR5cGVzX0hlbHBlcihkYXRhLCBzaXplb2YoaW50KSk7CiAgICAgICAgIH0KIAogCkBAIC00ODYsNyArNTQxLDcgQEAKICAgICAgICAgICAgIGRhdGFbN10gPSAxNTsKICAgICAgICAgICAgIGRhdGFbOF0gPSAxODsKIAotICAgICAgICAgICAgQnl0ZUJ1ZmZlcl9QdXRfQXJyYXlfSGVscGVyKGRhdGEsIHNpemVvZih1aW50KSk7CisgICAgICAgICAgICBCeXRlQnVmZmVyX1B1dF9BcnJheVR5cGVzX0hlbHBlcihkYXRhLCBzaXplb2YodWludCkpOwogICAgICAgICB9CiAKICAgICAgICAgW0ZsYXRCdWZmZXJzVGVzdE1ldGhvZF0KQEAgLTUwNiw3ICs1NjEsNyBAQAogICAgICAgICAgICAgZGF0YVs3XSA9IHRydWU7CiAgICAgICAgICAgICBkYXRhWzhdID0gZmFsc2U7CiAKLSAgICAgICAgICAgIEJ5dGVCdWZmZXJfUHV0X0FycmF5X0hlbHBlcihkYXRhLCBzaXplb2YoYm9vbCkpOworICAgICAgICAgICAgQnl0ZUJ1ZmZlcl9QdXRfQXJyYXlUeXBlc19IZWxwZXIoZGF0YSwgc2l6ZW9mKGJvb2wpKTsKICAgICAgICAgfQogCiAgICAgICAgIFtGbGF0QnVmZmVyc1Rlc3RNZXRob2RdCkBAIC01MjYsNyArNTgxLDcgQEAKICAgICAgICAgICAgIGRhdGFbN10gPSAxNTsKICAgICAgICAgICAgIGRhdGFbOF0gPSAxODsKIAotICAgICAgICAgICAgQnl0ZUJ1ZmZlcl9QdXRfQXJyYXlfSGVscGVyKGRhdGEsIHNpemVvZihsb25nKSk7CisgICAgICAgICAgICBCeXRlQnVmZmVyX1B1dF9BcnJheVR5cGVzX0hlbHBlcihkYXRhLCBzaXplb2YobG9uZykpOwogICAgICAgICB9CiAKICAgICAgICAgW0ZsYXRCdWZmZXJzVGVzdE1ldGhvZF0KQEAgLTU0Niw3ICs2MDEsNyBAQAogICAgICAgICAgICAgZGF0YVs3XSA9IDE1OwogICAgICAgICAgICAgZGF0YVs4XSA9IDE4OwogCi0gICAgICAgICAgICBCeXRlQnVmZmVyX1B1dF9BcnJheV9IZWxwZXIoZGF0YSwgc2l6ZW9mKGJ5dGUpKTsKKyAgICAgICAgICAgIEJ5dGVCdWZmZXJfUHV0X0FycmF5VHlwZXNfSGVscGVyKGRhdGEsIHNpemVvZihieXRlKSk7CiAgICAgICAgIH0KIAogICAgICAgICBbRmxhdEJ1ZmZlcnNUZXN0TWV0aG9kXQpAQCAtNTY2LDcgKzYyMSwxNiBAQAogICAgICAgICAgICAgZGF0YVs3XSA9IDE1OwogICAgICAgICAgICAgZGF0YVs4XSA9IDE4OwogCi0gICAgICAgICAgICBCeXRlQnVmZmVyX1B1dF9BcnJheV9IZWxwZXIoZGF0YSwgc2l6ZW9mKHNieXRlKSk7CisgICAgICAgICAgICBCeXRlQnVmZmVyX1B1dF9BcnJheVR5cGVzX0hlbHBlcihkYXRhLCBzaXplb2Yoc2J5dGUpKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIEFycmF5U2VnbWVudDxUPiBDcmVhdGVBcnJheVNlZ21lbnQ8VD4oVFtdIGRhdGEpCisgICAgICAgICAgICB3aGVyZSBUIDogc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGNvbnN0IGludCBhcnJheVNlZ21lbnRQYWRkaW5nID0gNzsKKyAgICAgICAgICAgIHZhciBuZXdEYXRhID0gbmV3IFRbZGF0YS5MZW5ndGggKyAyICogYXJyYXlTZWdtZW50UGFkZGluZ107CisgICAgICAgICAgICBBcnJheS5Db3B5KGRhdGEsIDAsIG5ld0RhdGEsIGFycmF5U2VnbWVudFBhZGRpbmcsIGRhdGEuTGVuZ3RoKTsKKyAgICAgICAgICAgIHJldHVybiBuZXcgQXJyYXlTZWdtZW50PFQ+KG5ld0RhdGEsIGFycmF5U2VnbWVudFBhZGRpbmcsIGRhdGEuTGVuZ3RoKTsKICAgICAgICAgfQogCiAgICAgICAgIFtGbGF0QnVmZmVyc1Rlc3RNZXRob2RdCkBAIC01NzgsMTAgKzY0MiwxNyBAQAogICAgICAgICAgICAgLy8gY3JlYXRlIGEgbnVsbCBhcnJheSBhbmQgdHJ5IHRvIHB1dCBpdCBpbnRvIHRoZSBidWZmZXIKICAgICAgICAgICAgIGZsb2F0W10gZGF0YSA9IG51bGw7CiAgICAgICAgICAgICBBc3NlcnQuVGhyb3dzPEFyZ3VtZW50TnVsbEV4Y2VwdGlvbj4oKCkgPT4gdXV0LlB1dCgxMDI0LCBkYXRhKSk7CisKKyAgICAgICAgICAgIEFycmF5U2VnbWVudDxmbG9hdD4gZGF0YUFycmF5U2VnbWVudCA9IGRlZmF1bHQ7CisgICAgICAgICAgICBBc3NlcnQuVGhyb3dzPEFyZ3VtZW50TnVsbEV4Y2VwdGlvbj4oKCkgPT4gdXV0LlB1dCgxMDI0LCBkYXRhQXJyYXlTZWdtZW50KSk7CisKKyAgICAgICAgICAgIEludFB0ciBkYXRhUHRyID0gSW50UHRyLlplcm87CisgICAgICAgICAgICBpbnQgZGF0YVB0ckxlbmd0aCA9IDEwMDsKKyAgICAgICAgICAgIEFzc2VydC5UaHJvd3M8QXJndW1lbnROdWxsRXhjZXB0aW9uPigoKSA9PiB1dXQuUHV0PGZsb2F0PigxMDI0LCBkYXRhUHRyLCBkYXRhUHRyTGVuZ3RoKSk7CiAgICAgICAgIH0KIAogICAgICAgICBbRmxhdEJ1ZmZlcnNUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBCeXRlQnVmZmVyX1B1dF9BcnJheV9FbXB0eV9UaHJvd3MoKQorICAgICAgICBwdWJsaWMgdW5zYWZlIHZvaWQgQnl0ZUJ1ZmZlcl9QdXRfQXJyYXlfRW1wdHlfVGhyb3dzKCkKICAgICAgICAgewogICAgICAgICAgICAgLy8gQ3JlYXRlIHRoZSBCeXRlIEJ1ZmZlcgogICAgICAgICAgICAgdmFyIHV1dCA9IG5ldyBCeXRlQnVmZmVyKDEwMjQpOwpAQCAtNTg5LDYgKzY2MCwzMiBAQAogICAgICAgICAgICAgLy8gY3JlYXRlIGFuIGFycmF5IG9mIGxlbmd0aCA9PSAwLCBhbmQgdHJ5IHRvIHB1dCBpdCBpbnRvIHRoZSBidWZmZXIKICAgICAgICAgICAgIGZsb2F0W10gZGF0YSA9IG5ldyBmbG9hdFswXTsKICAgICAgICAgICAgIEFzc2VydC5UaHJvd3M8QXJndW1lbnRFeGNlcHRpb24+KCgpID0+IHV1dC5QdXQoMTAyNCwgZGF0YSkpOworCisgICAgICAgICAgICB2YXIgZGF0YUFycmF5U2VnbWVudCA9IG5ldyBBcnJheVNlZ21lbnQ8ZmxvYXQ+KG5ldyBmbG9hdFsxMF0sIDUsIDApOworICAgICAgICAgICAgQXNzZXJ0LlRocm93czxBcmd1bWVudEV4Y2VwdGlvbj4oKCkgPT4gdXV0LlB1dCgxMDI0LCBkYXRhQXJyYXlTZWdtZW50KSk7CisKKyAgICAgICAgICAgIGZpeGVkKGZsb2F0KiBmbG9hdFB0ciA9IGRhdGEpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIGRhdGFQdHIgPSAoSW50UHRyKWZsb2F0UHRyOworICAgICAgICAgICAgICAgIHZhciBkYXRhUHRyTGVuZ3RoID0gMDsKKyAgICAgICAgICAgICAgICBBc3NlcnQuVGhyb3dzPEFyZ3VtZW50RXhjZXB0aW9uPigoKSA9PiB1dXQuUHV0PGZsb2F0PigxMDI0LCBkYXRhUHRyLCBkYXRhUHRyTGVuZ3RoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBbRmxhdEJ1ZmZlcnNUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdW5zYWZlIHZvaWQgQnl0ZUJ1ZmZlcl9QdXRfSW50UHRyX05lZ2F0aXZlU2l6ZV9UaHJvd3MoKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBDcmVhdGUgdGhlIEJ5dGUgQnVmZmVyCisgICAgICAgICAgICB2YXIgdXV0ID0gbmV3IEJ5dGVCdWZmZXIoMTAyNCk7CisKKyAgICAgICAgICAgIC8vIGNyZWF0ZSBhbiBhcnJheSBvZiBsZW5ndGggPT0gMCwgYW5kIHRyeSB0byBwdXQgaXQgaW50byB0aGUgYnVmZmVyCisgICAgICAgICAgICBmbG9hdFtdIGRhdGEgPSBuZXcgZmxvYXRbMTBdOworICAgICAgICAgICAgZml4ZWQoZmxvYXQqIGZsb2F0UHRyID0gZGF0YSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgZGF0YVB0ciA9IChJbnRQdHIpZmxvYXRQdHI7CisgICAgICAgICAgICAgICAgdmFyIGRhdGFQdHJMZW5ndGggPSAtMTsKKyAgICAgICAgICAgICAgICBBc3NlcnQuVGhyb3dzPEFyZ3VtZW50RXhjZXB0aW9uPigoKSA9PiB1dXQuUHV0PGZsb2F0PigxMDI0LCBkYXRhUHRyLCBkYXRhUHRyTGVuZ3RoKSk7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KIAogICAgICAgICAjcHJhZ21hIHdhcm5pbmcgZGlzYWJsZSAwMTY5CkBAIC02MDEsNyArNjk4LDcgQEAKICAgICAgICAgI3ByYWdtYSB3YXJuaW5nIHJlc3RvcmUgMDE2OQogCiAgICAgICAgIFtGbGF0QnVmZmVyc1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIEJ5dGVCdWZmZXJfUHV0X0FycmF5X0luY29ycmVjdFR5cGVfVGhyb3dzKCkKKyAgICAgICAgcHVibGljIHVuc2FmZSB2b2lkIEJ5dGVCdWZmZXJfUHV0X0FycmF5X0luY29ycmVjdFR5cGVfVGhyb3dzKCkKICAgICAgICAgewogICAgICAgICAgICAgLy8gQ3JlYXRlIHRoZSBCeXRlIEJ1ZmZlcgogICAgICAgICAgICAgdmFyIHV1dCA9IG5ldyBCeXRlQnVmZmVyKDEwMjQpOwpAQCAtNjEwLDYgKzcwNywxNiBAQAogICAgICAgICAgICAgLy8gYWJsZSB0byBiZSBwdXQgaW50byB0aGUgYnVmZmVyCiAgICAgICAgICAgICB2YXIgZGF0YSA9IG5ldyBkdW1teVN0cnVjdFsxMF07CiAgICAgICAgICAgICBBc3NlcnQuVGhyb3dzPEFyZ3VtZW50RXhjZXB0aW9uPigoKSA9PiB1dXQuUHV0KDEwMjQsIGRhdGEpKTsKKworICAgICAgICAgICAgdmFyIGRhdGFBcnJheVNlZ21lbnQgPSBuZXcgQXJyYXlTZWdtZW50PGR1bW15U3RydWN0PihkYXRhKTsKKyAgICAgICAgICAgIEFzc2VydC5UaHJvd3M8QXJndW1lbnRFeGNlcHRpb24+KCgpID0+IHV1dC5QdXQoMTAyNCwgZGF0YUFycmF5U2VnbWVudCkpOworCisgICAgICAgICAgICBmaXhlZChkdW1teVN0cnVjdCogZmxvYXRQdHIgPSBkYXRhKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhciBkYXRhUHRyID0gKEludFB0cilmbG9hdFB0cjsKKyAgICAgICAgICAgICAgICB2YXIgZGF0YVB0ckxlbmd0aCA9IGRhdGEuTGVuZ3RoICogc2l6ZW9mKGR1bW15U3RydWN0KTsKKyAgICAgICAgICAgICAgICBBc3NlcnQuVGhyb3dzPEFyZ3VtZW50RXhjZXB0aW9uPigoKSA9PiB1dXQuUHV0PGR1bW15U3RydWN0PigxMDI0LCBkYXRhUHRyLCBkYXRhUHRyTGVuZ3RoKSk7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KIAogICAgICAgICBbRmxhdEJ1ZmZlcnNUZXN0TWV0aG9kXQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvRmxhdEJ1ZmZlcnMuVGVzdC9GbGF0QnVmZmVyQnVpbGRlclRlc3RzLmNzIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvRmxhdEJ1ZmZlcnMuVGVzdC9GbGF0QnVmZmVyQnVpbGRlclRlc3RzLmNzCmluZGV4IGUyYjcyYzcuLjdmZTk3NDAgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL0ZsYXRCdWZmZXJzLlRlc3QvRmxhdEJ1ZmZlckJ1aWxkZXJUZXN0cy5jcworKysgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9GbGF0QnVmZmVycy5UZXN0L0ZsYXRCdWZmZXJCdWlsZGVyVGVzdHMuY3MKQEAgLTE2LDcgKzE2LDcgQEAKIAogdXNpbmcgU3lzdGVtOwogCi1uYW1lc3BhY2UgRmxhdEJ1ZmZlcnMuVGVzdAorbmFtZXNwYWNlIEdvb2dsZS5GbGF0QnVmZmVycy5UZXN0CiB7CiAgICAgW0ZsYXRCdWZmZXJzVGVzdENsYXNzXQogICAgIHB1YmxpYyBjbGFzcyBGbGF0QnVmZmVyQnVpbGRlclRlc3RzCkBAIC01NTMsNiArNTUzLDE4IEBACiAKICAgICAgICAgICAgIEFzc2VydC5UaHJvd3M8QXJndW1lbnROdWxsRXhjZXB0aW9uPigoKSA9PiBmYmIuQWRkKGRhdGEpKTsKICAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgW0ZsYXRCdWZmZXJzVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHVuc2FmZSB2b2lkIEZsYXRCdWZmZXJCdWlsZGVyX0FkZF9BcnJheV9VbnN1cHBvcnRlZFR5cGVfVGhyb3dzKCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIGZiYiA9IENyZWF0ZUJ1ZmZlcihmYWxzZSk7CisgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIHZhciBzdG9yZWRPZmZzZXQgPSBmYmIuT2Zmc2V0OworCisgICAgICAgICAgICAvLyBDb25zdHJ1Y3QgdGhlIGRhdGEgYXJyYXkKKyAgICAgICAgICAgIHZhciBkYXRhID0gbmV3IER1bW15U3RydWN0WzEwXTsKKyAgICAgICAgICAgIEFzc2VydC5UaHJvd3M8QXJndW1lbnRFeGNlcHRpb24+KCgpID0+IGZiYi5BZGQoZGF0YSkpOworICAgICAgICB9CiAKICAgICAgICAgW0ZsYXRCdWZmZXJzVGVzdE1ldGhvZF0KICAgICAgICAgcHVibGljIHZvaWQgRmxhdEJ1ZmZlckJ1aWxkZXJfQWRkX0FycmF5X0VtcHR5X05vb3AoKQpAQCAtNTcwLDYgKzU4MiwxNTkgQEAKICAgICAgICAgICAgIHZhciBlbmRPZmZzZXQgPSBmYmIuT2Zmc2V0OwogICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKGVuZE9mZnNldCwgc3RvcmVkT2Zmc2V0KTsKICAgICAgICAgfQorICAgIAorICAgICAgICBbRmxhdEJ1ZmZlcnNUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBGbGF0QnVmZmVyQnVpbGRlcl9BZGRfQXJyYXlTZWdtZW50X0RlZmF1bHRfVGhyb3dzKCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIGZiYiA9IENyZWF0ZUJ1ZmZlcihmYWxzZSk7CisKKyAgICAgICAgICAgIC8vIENvbnN0cnVjdCB0aGUgZGF0YSBhcnJheQorICAgICAgICAgICAgQXJyYXlTZWdtZW50PGZsb2F0PiBkYXRhID0gZGVmYXVsdDsKKworICAgICAgICAgICAgQXNzZXJ0LlRocm93czxBcmd1bWVudE51bGxFeGNlcHRpb24+KCgpID0+IGZiYi5BZGQoZGF0YSkpOworICAgICAgICB9CisgICAgICAgICAgICAKKyAgICAgICAgW0ZsYXRCdWZmZXJzVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHVuc2FmZSB2b2lkIEZsYXRCdWZmZXJCdWlsZGVyX0FkZF9BcnJheVNlZ21lbnRfVW5zdXBwb3J0ZWRUeXBlX1Rocm93cygpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBmYmIgPSBDcmVhdGVCdWZmZXIoZmFsc2UpOworICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB2YXIgc3RvcmVkT2Zmc2V0ID0gZmJiLk9mZnNldDsKKworICAgICAgICAgICAgLy8gQ29uc3RydWN0IHRoZSBkYXRhIGFycmF5CisgICAgICAgICAgICB2YXIgYXJyYXkgPSBuZXcgRHVtbXlTdHJ1Y3RbMTBdOworICAgICAgICAgICAgdmFyIGRhdGEgPSBuZXcgQXJyYXlTZWdtZW50PER1bW15U3RydWN0PihhcnJheSk7CisgICAgICAgICAgICBBc3NlcnQuVGhyb3dzPEFyZ3VtZW50RXhjZXB0aW9uPigoKSA9PiBmYmIuQWRkKGRhdGEpKTsKKyAgICAgICAgfQorCisgICAgICAgIFtGbGF0QnVmZmVyc1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIEZsYXRCdWZmZXJCdWlsZGVyX0FkZF9BcnJheVNlZ21lbnRfRW1wdHlfTm9vcCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBmYmIgPSBDcmVhdGVCdWZmZXIoZmFsc2UpOworICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB2YXIgc3RvcmVkT2Zmc2V0ID0gZmJiLk9mZnNldDsKKworICAgICAgICAgICAgLy8gQ29uc3RydWN0IHRoZSBkYXRhIGFycmF5CisgICAgICAgICAgICB2YXIgYXJyYXkgPSBuZXcgZmxvYXRbMTBdOworICAgICAgICAgICAgdmFyIGRhdGEgPSBuZXcgQXJyYXlTZWdtZW50PGZsb2F0PihhcnJheSwgNSwgMCk7CisgICAgICAgICAgICBmYmIuQWRkKGRhdGEpOworCisgICAgICAgICAgICAvLyBNYWtlIHN1cmUgdGhlIG9mZnNldCBkaWRuJ3QgY2hhbmdlIHNpbmNlIG5vdGhpbmcKKyAgICAgICAgICAgIC8vIHdhcyByZWFsbHkgYWRkZWQKKyAgICAgICAgICAgIHZhciBlbmRPZmZzZXQgPSBmYmIuT2Zmc2V0OworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKGVuZE9mZnNldCwgc3RvcmVkT2Zmc2V0KTsKKyAgICAgICAgfQorICAgIAorICAgICAgICBbRmxhdEJ1ZmZlcnNUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBGbGF0QnVmZmVyQnVpbGRlcl9BZGRfSW50UHRyX1plcm9fVGhyb3dzKCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIGZiYiA9IENyZWF0ZUJ1ZmZlcihmYWxzZSk7CisKKyAgICAgICAgICAgIC8vIENvbnN0cnVjdCB0aGUgZGF0YSBhcnJheQorICAgICAgICAgICAgdmFyIGRhdGEgPSBJbnRQdHIuWmVybzsKKyAgICAgICAgICAgIHZhciBsZW5ndGggPSAxMDA7CisKKyAgICAgICAgICAgIEFzc2VydC5UaHJvd3M8QXJndW1lbnROdWxsRXhjZXB0aW9uPigoKSA9PiBmYmIuQWRkPGZsb2F0PihkYXRhLCBsZW5ndGgpKTsKKyAgICAgICAgfQorICAgICAgICAgICAgCisgICAgICAgIFtGbGF0QnVmZmVyc1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB1bnNhZmUgdm9pZCBGbGF0QnVmZmVyQnVpbGRlcl9BZGRfSW50UHRyX1NpemVOZWdhdGl2ZV9UaHJvd3MoKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgZmJiID0gQ3JlYXRlQnVmZmVyKGZhbHNlKTsKKworICAgICAgICAgICAgLy8gQ29uc3RydWN0IHRoZSBkYXRhIGFycmF5CisgICAgICAgICAgICB2YXIgYXJyYXkgPSBuZXcgZmxvYXRbMTBdOworICAgICAgICAgICAgZml4ZWQoZmxvYXQqIHB0ciA9IGFycmF5KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhciBkYXRhID0gKEludFB0cilwdHI7CisgICAgICAgICAgICAgICAgdmFyIGxlbmd0aCA9IC0xOworICAgICAgICAgICAgICAgIEFzc2VydC5UaHJvd3M8QXJndW1lbnRPdXRPZlJhbmdlRXhjZXB0aW9uPigoKSA9PiBmYmIuQWRkPGZsb2F0PihkYXRhLCBsZW5ndGgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIFtGbGF0QnVmZmVyc1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIEZsYXRCdWZmZXJCdWlsZGVyX0FkZF9JbnRQdHJfWmVyb19FbXB0eV9Ob29wKCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIGZiYiA9IENyZWF0ZUJ1ZmZlcihmYWxzZSk7CisKKyAgICAgICAgICAgIHZhciBzdG9yZWRPZmZzZXQgPSBmYmIuT2Zmc2V0OworCisgICAgICAgICAgICAvLyBDb25zdHJ1Y3QgdGhlIGRhdGEgYXJyYXkKKyAgICAgICAgICAgIHZhciBkYXRhID0gSW50UHRyLlplcm87CisgICAgICAgICAgICB2YXIgbGVuZ3RoID0gMDsKKworICAgICAgICAgICAgZmJiLkFkZDxmbG9hdD4oZGF0YSwgbGVuZ3RoKTsKKworICAgICAgICAgICAgLy8gbWFrZSBzdXJlIHRoYXQgYSBsZW5ndGggb2YgMCBkb2Vzbid0IHRocm93IGFsc28gaWYgcHRyIGlzIFplcm8gYXMgd2VsbAorICAgICAgICAgICAgLy8gYW5kIHRoYXQgbm90aGluZyB3YXMgcmVhbGx5IGFkZGVkCisgICAgICAgICAgICB2YXIgZW5kT2Zmc2V0ID0gZmJiLk9mZnNldDsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChlbmRPZmZzZXQsIHN0b3JlZE9mZnNldCk7CisgICAgICAgIH0KKworICAgICAgICBbRmxhdEJ1ZmZlcnNUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdW5zYWZlIHZvaWQgRmxhdEJ1ZmZlckJ1aWxkZXJfQWRkX0ludFB0cl9FbXB0eV9Ob29wKCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIGZiYiA9IENyZWF0ZUJ1ZmZlcihmYWxzZSk7CisgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIHZhciBzdG9yZWRPZmZzZXQgPSBmYmIuT2Zmc2V0OworCisgICAgICAgICAgICAvLyBDb25zdHJ1Y3QgdGhlIGRhdGEgYXJyYXkKKyAgICAgICAgICAgIHZhciBhcnJheSA9IG5ldyBmbG9hdFsxMF07CisgICAgICAgICAgICBmaXhlZChmbG9hdCogcHRyID0gYXJyYXkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIGRhdGEgPSAoSW50UHRyKXB0cjsKKyAgICAgICAgICAgICAgICB2YXIgbGVuZ3RoID0gMDsKKyAgICAgICAgICAgICAgICBmYmIuQWRkPGZsb2F0PihkYXRhLCBsZW5ndGgpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBNYWtlIHN1cmUgdGhlIG9mZnNldCBkaWRuJ3QgY2hhbmdlIHNpbmNlIG5vdGhpbmcKKyAgICAgICAgICAgIC8vIHdhcyByZWFsbHkgYWRkZWQKKyAgICAgICAgICAgIHZhciBlbmRPZmZzZXQgPSBmYmIuT2Zmc2V0OworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKGVuZE9mZnNldCwgc3RvcmVkT2Zmc2V0KTsKKyAgICAgICAgfQorICAgIAorICAgICAgICBbRmxhdEJ1ZmZlcnNUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdW5zYWZlIHZvaWQgRmxhdEJ1ZmZlckJ1aWxkZXJfQWRkX0ludFB0cl9TaXplSW5CeXRlc05vdE1hdGNoaW5nRGF0YVR5cGVfVGhyb3dzKCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIGZiYiA9IENyZWF0ZUJ1ZmZlcihmYWxzZSk7CisgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIHZhciBzdG9yZWRPZmZzZXQgPSBmYmIuT2Zmc2V0OworCisgICAgICAgICAgICAvLyBDb25zdHJ1Y3QgdGhlIGRhdGEgYXJyYXkKKyAgICAgICAgICAgIHZhciBhcnJheSA9IG5ldyBmbG9hdFsxMF07CisgICAgICAgICAgICBmaXhlZChmbG9hdCogcHRyID0gYXJyYXkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY29uc3QgaW50IGludmFsaWRCeXRlcyA9IDE7CisgICAgICAgICAgICAgICAgdmFyIGRhdGEgPSAoSW50UHRyKXB0cjsKKyAgICAgICAgICAgICAgICAvLyBhZGQgc29tZSBpbnZhbGlkIGJ5dGVzIHRvIHRoZSBsZW5ndGgKKyAgICAgICAgICAgICAgICB2YXIgbGVuZ3RoID0gMiAqIHNpemVvZihmbG9hdCkgKyBpbnZhbGlkQnl0ZXM7CisgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBBc3NlcnQuVGhyb3dzPEFyZ3VtZW50RXhjZXB0aW9uPigoKSA9PiBmYmIuQWRkPGZsb2F0PihkYXRhLCBsZW5ndGgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIAorICAgICAgICBbRmxhdEJ1ZmZlcnNUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdW5zYWZlIHZvaWQgRmxhdEJ1ZmZlckJ1aWxkZXJfQWRkX0ludFB0cl9VbnN1cHBvcnRlZFR5cGVfVGhyb3dzKCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIGZiYiA9IENyZWF0ZUJ1ZmZlcihmYWxzZSk7CisgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIHZhciBzdG9yZWRPZmZzZXQgPSBmYmIuT2Zmc2V0OworCisgICAgICAgICAgICAvLyBDb25zdHJ1Y3QgdGhlIGRhdGEgYXJyYXkKKyAgICAgICAgICAgIHZhciBhcnJheSA9IG5ldyBEdW1teVN0cnVjdFsxMF07CisgICAgICAgICAgICBmaXhlZChEdW1teVN0cnVjdCogcHRyID0gYXJyYXkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIGRhdGEgPSAoSW50UHRyKXB0cjsKKyAgICAgICAgICAgICAgICB2YXIgbGVuZ3RoID0gMTAgKiBzaXplb2YoRHVtbXlTdHJ1Y3QpOworICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgQXNzZXJ0LlRocm93czxBcmd1bWVudEV4Y2VwdGlvbj4oKCkgPT4gZmJiLkFkZDxEdW1teVN0cnVjdD4oZGF0YSwgbGVuZ3RoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0cnVjdCBEdW1teVN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBpbnQgdmFsdWU7CisgICAgICAgIH0KIAogICAgICAgICBbRmxhdEJ1ZmZlcnNUZXN0TWV0aG9kXQogICAgICAgICBwdWJsaWMgdm9pZCBGbGF0QnVmZmVyQnVpbGRlcl9BZGRfbnVsbF9TdHJpbmcoKQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvRmxhdEJ1ZmZlcnMuVGVzdC9GbGF0QnVmZmVycy5Db3JlLlRlc3QuY3Nwcm9qIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvRmxhdEJ1ZmZlcnMuVGVzdC9GbGF0QnVmZmVycy5Db3JlLlRlc3QuY3Nwcm9qCmluZGV4IDZjZDRlNzguLmE3Njk3ODUgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL0ZsYXRCdWZmZXJzLlRlc3QvRmxhdEJ1ZmZlcnMuQ29yZS5UZXN0LmNzcHJvagorKysgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9GbGF0QnVmZmVycy5UZXN0L0ZsYXRCdWZmZXJzLkNvcmUuVGVzdC5jc3Byb2oKQEAgLTE5LDYgKzE5LDE0IEBACiAgICAgPERlZmluZUNvbnN0YW50cz4kKERlZmluZUNvbnN0YW50cyk7RU5BQkxFX1NQQU5fVDwvRGVmaW5lQ29uc3RhbnRzPgogICA8L1Byb3BlcnR5R3JvdXA+CiAKKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3xBbnlDUFUnIj4KKyAgICA8QWxsb3dVbnNhZmVCbG9ja3M+dHJ1ZTwvQWxsb3dVbnNhZmVCbG9ja3M+CisgIDwvUHJvcGVydHlHcm91cD4KKworICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8QW55Q1BVJyI+CisgICAgPEFsbG93VW5zYWZlQmxvY2tzPnRydWU8L0FsbG93VW5zYWZlQmxvY2tzPgorICA8L1Byb3BlcnR5R3JvdXA+CisKICAgPEl0ZW1Hcm91cD4KICAgICA8Q29tcGlsZSBJbmNsdWRlPSIuLlwuLlxuZXRcRmxhdEJ1ZmZlcnNcQnl0ZUJ1ZmZlci5jcyI+CiAgICAgICA8TGluaz5GbGF0QnVmZmVyc1xCeXRlQnVmZmVyLmNzPC9MaW5rPgpAQCAtMTgzLDcgKzE5MSw3IEBACiAgIDwvSXRlbUdyb3VwPgogCiAgIDxJdGVtR3JvdXA+Ci0gICAgPFBhY2thZ2VSZWZlcmVuY2UgSW5jbHVkZT0iTmV3dG9uc29mdC5Kc29uIiBWZXJzaW9uPSIxMi4wLjMiIC8+CisgICAgPFBhY2thZ2VSZWZlcmVuY2UgSW5jbHVkZT0iTmV3dG9uc29mdC5Kc29uIiBWZXJzaW9uPSIxMy4wLjEiIC8+CiAgIDwvSXRlbUdyb3VwPgogCiA8L1Byb2plY3Q+CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9GbGF0QnVmZmVycy5UZXN0L0ZsYXRCdWZmZXJzLlRlc3QuY3Nwcm9qIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvRmxhdEJ1ZmZlcnMuVGVzdC9GbGF0QnVmZmVycy5UZXN0LmNzcHJvagppbmRleCAxMjQ3NTk5Li4wZjY4M2NiIDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9GbGF0QnVmZmVycy5UZXN0L0ZsYXRCdWZmZXJzLlRlc3QuY3Nwcm9qCisrKyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL0ZsYXRCdWZmZXJzLlRlc3QvRmxhdEJ1ZmZlcnMuVGVzdC5jc3Byb2oKQEAgLTIxLDYgKzIxLDcgQEAKICAgICA8RGVmaW5lQ29uc3RhbnRzPlRSQUNFO0RFQlVHPC9EZWZpbmVDb25zdGFudHM+CiAgICAgPEVycm9yUmVwb3J0PnByb21wdDwvRXJyb3JSZXBvcnQ+CiAgICAgPFdhcm5pbmdMZXZlbD40PC9XYXJuaW5nTGV2ZWw+CisgICAgPEFsbG93VW5zYWZlQmxvY2tzPnRydWU8L0FsbG93VW5zYWZlQmxvY2tzPgogICA8L1Byb3BlcnR5R3JvdXA+CiAgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iICckKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJyA9PSAnUmVsZWFzZXxBbnlDUFUnICI+CiAgICAgPERlYnVnVHlwZT5wZGJvbmx5PC9EZWJ1Z1R5cGU+CkBAIC0yOSw2ICszMCw3IEBACiAgICAgPERlZmluZUNvbnN0YW50cz5UUkFDRTwvRGVmaW5lQ29uc3RhbnRzPgogICAgIDxFcnJvclJlcG9ydD5wcm9tcHQ8L0Vycm9yUmVwb3J0PgogICAgIDxXYXJuaW5nTGV2ZWw+NDwvV2FybmluZ0xldmVsPgorICAgIDxBbGxvd1Vuc2FmZUJsb2Nrcz50cnVlPC9BbGxvd1Vuc2FmZUJsb2Nrcz4KICAgPC9Qcm9wZXJ0eUdyb3VwPgogICA8UHJvcGVydHlHcm91cD4KICAgICA8U3RhcnR1cE9iamVjdCAvPgpAQCAtMzgsMTQgKzQwLDkgQEAKICAgICA8RGVmaW5lQ29uc3RhbnRzPiQoRGVmaW5lQ29uc3RhbnRzKTtVTlNBRkVfQllURUJVRkZFUjwvRGVmaW5lQ29uc3RhbnRzPgogICA8L1Byb3BlcnR5R3JvdXA+CiAgIDxJdGVtR3JvdXA+Ci0gICAgPFBhY2thZ2VSZWZlcmVuY2UgSW5jbHVkZT0iTmV3dG9uc29mdC5Kc29uIj4KLSAgICAgIDxWZXJzaW9uPjEyLjAuMzwvVmVyc2lvbj4KLSAgICA8L1BhY2thZ2VSZWZlcmVuY2U+CisgICAgPFBhY2thZ2VSZWZlcmVuY2UgSW5jbHVkZT0iTmV3dG9uc29mdC5Kc29uIiBWZXJzaW9uPSIxMy4wLjEiIC8+CiAgIDwvSXRlbUdyb3VwPgogICA8SXRlbUdyb3VwPgotICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iTmV3dG9uc29mdC5Kc29uLCBWZXJzaW9uPTEyLjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPTMwYWQ0ZmU2YjJhNmFlZWQsIHByb2Nlc3NvckFyY2hpdGVjdHVyZT1NU0lMIj4KLSAgICAgIDxIaW50UGF0aD5wYWNrYWdlc1xOZXd0b25zb2Z0Lkpzb24uMTIuMC4zXGxpYlxuZXQzNVxOZXd0b25zb2Z0Lkpzb24uZGxsPC9IaW50UGF0aD4KLSAgICA8L1JlZmVyZW5jZT4KICAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbSIgLz4KICAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbS5Db3JlIj4KICAgICA8L1JlZmVyZW5jZT4KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL0ZsYXRCdWZmZXJzLlRlc3QvRmxhdEJ1ZmZlcnNFeGFtcGxlVGVzdHMuY3MgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9GbGF0QnVmZmVycy5UZXN0L0ZsYXRCdWZmZXJzRXhhbXBsZVRlc3RzLmNzCmluZGV4IGVjM2IyZWEuLjZjOWUzMDkgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL0ZsYXRCdWZmZXJzLlRlc3QvRmxhdEJ1ZmZlcnNFeGFtcGxlVGVzdHMuY3MKKysrIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvRmxhdEJ1ZmZlcnMuVGVzdC9GbGF0QnVmZmVyc0V4YW1wbGVUZXN0cy5jcwpAQCAtMjEsNyArMjEsNyBAQAogdXNpbmcgb3B0aW9uYWxfc2NhbGFyczsKIHVzaW5nIEtleXdvcmRUZXN0OwogCi1uYW1lc3BhY2UgRmxhdEJ1ZmZlcnMuVGVzdAorbmFtZXNwYWNlIEdvb2dsZS5GbGF0QnVmZmVycy5UZXN0CiB7CiAgICAgW0ZsYXRCdWZmZXJzVGVzdENsYXNzXQogICAgIHB1YmxpYyBjbGFzcyBGbGF0QnVmZmVyc0V4YW1wbGVUZXN0cwpAQCAtMTU2LDggKzE1NiwxMSBAQAogCiAgICAgICAgICAgICAvLyBFeGFtcGxlIG9mIHNlYXJjaGluZyBmb3IgYSB0YWJsZSBieSB0aGUga2V5CiAgICAgICAgICAgICBBc3NlcnQuSXNUcnVlKG1vbnN0ZXIuVGVzdGFycmF5b2Z0YWJsZXNCeUtleSgiRnJvZG8iKSAhPSBudWxsKTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChtb25zdGVyLlRlc3RhcnJheW9mdGFibGVzQnlLZXkoIkZyb2RvIikuVmFsdWUuTmFtZSwgIkZyb2RvIik7CiAgICAgICAgICAgICBBc3NlcnQuSXNUcnVlKG1vbnN0ZXIuVGVzdGFycmF5b2Z0YWJsZXNCeUtleSgiQmFybmV5IikgIT0gbnVsbCk7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwobW9uc3Rlci5UZXN0YXJyYXlvZnRhYmxlc0J5S2V5KCJCYXJuZXkiKS5WYWx1ZS5OYW1lLCAiQmFybmV5Iik7CiAgICAgICAgICAgICBBc3NlcnQuSXNUcnVlKG1vbnN0ZXIuVGVzdGFycmF5b2Z0YWJsZXNCeUtleSgiV2lsbWEiKSAhPSBudWxsKTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChtb25zdGVyLlRlc3RhcnJheW9mdGFibGVzQnlLZXkoIldpbG1hIikuVmFsdWUuTmFtZSwgIldpbG1hIik7CiAKICAgICAgICAgICAgIC8vIHRlc3RUeXBlIGlzIGFuIGV4aXN0aW5nIGZpZWxkCiAgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwobW9uc3Rlci5UZXN0VHlwZSwgQW55Lk1vbnN0ZXIpOwpAQCAtMTE1Miw1ICsxMTU1LDQxIEBACiAgICAgICAgICAgU2NhbGFyU3R1ZmYgc2NhbGFyU3R1ZmYgPSBTY2FsYXJTdHVmZi5HZXRSb290QXNTY2FsYXJTdHVmZihmYmIuRGF0YUJ1ZmZlcik7CiAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKG51bGwsIHNjYWxhclN0dWZmLk1heWJlRW51bSk7CiAgICAgICAgIH0KKworCisgICAgICAgIFtGbGF0QnVmZmVyc1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIFNvcnRLZXlfV2l0aERlZmF1bHRlZFZhbHVlX0lzRmluZGFibGUoKSB7CisgICAgICAgICAgICAvLyBUaGlzIGNoZWNrcyBpZiB1c2luZyB0aGUgYGtleWAgYXR0cmlidXRlIHRoYXQgaW5jbHVkZXMgdGhlCisgICAgICAgICAgICAvLyBkZWZhdWx0IHZhbHVlIChlLmcuLCAwKSBpcyBzdGlsbCBzZWFyY2hhYmxlLiBUaGlzIGlzIGEgcmVncmVzc2lvbgorICAgICAgICAgICAgLy8gdGVzdCBmb3IgaHR0cHM6Ly9naXRodWIuY29tL2dvb2dsZS9mbGF0YnVmZmVycy9pc3N1ZXMvNzM4MC4KKyAgICAgICAgICAgIHZhciBmYmIgPSBuZXcgRmxhdEJ1ZmZlckJ1aWxkZXIoMSk7CisKKyAgICAgICAgICAgIC8vIENyZWF0ZSBhIHZlY3RvciBvZiBTdGF0IG9iamVjdHMsIHdpdGggQ291bnQgYmVpbmcgdGhlIGtleS4gCisgICAgICAgICAgICB2YXIgc3RhdF9vZmZzZXRzID0gbmV3IE9mZnNldDxTdGF0Pls0XTsKKyAgICAgICAgICAgIGZvcih1c2hvcnQgaSA9IDA7IGkgPCBzdGF0X29mZnNldHMuTGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICBTdGF0LlN0YXJ0U3RhdChmYmIpOworICAgICAgICAgICAgICAgIFN0YXQuQWRkQ291bnQoZmJiLCBpKTsKKyAgICAgICAgICAgICAgICBzdGF0X29mZnNldHNbc3RhdF9vZmZzZXRzLkxlbmd0aCAtIDEgLSBpXSA9IFN0YXQuRW5kU3RhdChmYmIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBFbnN1cmUgdGhlIHNvcnQgd29ya3MuCisgICAgICAgICAgICB2YXIgc29ydCA9IFN0YXQuQ3JlYXRlU29ydGVkVmVjdG9yT2ZTdGF0KGZiYiwgc3RhdF9vZmZzZXRzKTsKKworICAgICAgICAgICAgLy8gQ3JlYXRlIHRoZSBtb25zdGVyIHdpdGggdGhlIHNvcnRlZCB2ZWN0b3Igb2YgU3RhdCBvYmplY3RzLgorICAgICAgICAgICAgdmFyIHN0ciA9IGZiYi5DcmVhdGVTdHJpbmcoIk15TW9uc3RlciIpOworICAgICAgICAgICAgTW9uc3Rlci5TdGFydE1vbnN0ZXIoZmJiKTsKKyAgICAgICAgICAgIE1vbnN0ZXIuQWRkTmFtZShmYmIsIHN0cik7CisgICAgICAgICAgICBNb25zdGVyLkFkZFNjYWxhcktleVNvcnRlZFRhYmxlcyhmYmIsIHNvcnQpOworICAgICAgICAgICAgZmJiLkZpbmlzaChNb25zdGVyLkVuZE1vbnN0ZXIoZmJiKS5WYWx1ZSk7CisKKyAgICAgICAgICAgIC8vIEdldCB0aGUgbW9uc3Rlci4KKyAgICAgICAgICAgIHZhciBtb25zdGVyID0gTW9uc3Rlci5HZXRSb290QXNNb25zdGVyKGZiYi5EYXRhQnVmZmVyKTsKKworICAgICAgICAgICAgLy8gRW5zdXJlIGVhY2gga2V5IGlzIGZpbmRhYmxlLgorICAgICAgICAgICAgZm9yKHVzaG9ydCBpID0wIDsgaSA8IHN0YXRfb2Zmc2V0cy5MZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgIEFzc2VydC5Jc1RydWUobW9uc3Rlci5TY2FsYXJLZXlTb3J0ZWRUYWJsZXNCeUtleShpKSAhPSBudWxsKTsKKyAgICAgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwobW9uc3Rlci5TY2FsYXJLZXlTb3J0ZWRUYWJsZXNCeUtleShpKS5WYWx1ZS5Db3VudCwgaSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KICAgICB9CiB9CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9GbGF0QnVmZmVycy5UZXN0L0ZsYXRCdWZmZXJzRnV6elRlc3RzLmNzIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvRmxhdEJ1ZmZlcnMuVGVzdC9GbGF0QnVmZmVyc0Z1enpUZXN0cy5jcwppbmRleCBiNmM2MGVhLi4wMzc3YTdiIDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9GbGF0QnVmZmVycy5UZXN0L0ZsYXRCdWZmZXJzRnV6elRlc3RzLmNzCisrKyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL0ZsYXRCdWZmZXJzLlRlc3QvRmxhdEJ1ZmZlcnNGdXp6VGVzdHMuY3MKQEAgLTE2LDcgKzE2LDcgQEAKIAogdXNpbmcgU3lzdGVtOwogCi1uYW1lc3BhY2UgRmxhdEJ1ZmZlcnMuVGVzdAorbmFtZXNwYWNlIEdvb2dsZS5GbGF0QnVmZmVycy5UZXN0CiB7CiAgICAgW0ZsYXRCdWZmZXJzVGVzdENsYXNzXQogICAgIHB1YmxpYyBjbGFzcyBGbGF0QnVmZmVyc0Z1enpUZXN0cwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvRmxhdEJ1ZmZlcnMuVGVzdC9GbGF0QnVmZmVyc1Rlc3RDbGFzc0F0dHJpYnV0ZS5jcyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL0ZsYXRCdWZmZXJzLlRlc3QvRmxhdEJ1ZmZlcnNUZXN0Q2xhc3NBdHRyaWJ1dGUuY3MKaW5kZXggZjMxZTM4Yi4uN2FkN2RmNiAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvRmxhdEJ1ZmZlcnMuVGVzdC9GbGF0QnVmZmVyc1Rlc3RDbGFzc0F0dHJpYnV0ZS5jcworKysgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9GbGF0QnVmZmVycy5UZXN0L0ZsYXRCdWZmZXJzVGVzdENsYXNzQXR0cmlidXRlLmNzCkBAIC0xOSw3ICsxOSw3IEBACiB1c2luZyBTeXN0ZW0uTGlucTsKIHVzaW5nIFN5c3RlbS5UZXh0OwogCi1uYW1lc3BhY2UgRmxhdEJ1ZmZlcnMuVGVzdAorbmFtZXNwYWNlIEdvb2dsZS5GbGF0QnVmZmVycy5UZXN0CiB7CiAgICAgW0F0dHJpYnV0ZVVzYWdlKEF0dHJpYnV0ZVRhcmdldHMuQ2xhc3MpXQogICAgIHB1YmxpYyBjbGFzcyBGbGF0QnVmZmVyc1Rlc3RDbGFzc0F0dHJpYnV0ZSA6IEF0dHJpYnV0ZQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvRmxhdEJ1ZmZlcnMuVGVzdC9GbGF0QnVmZmVyc1Rlc3RNZXRob2RBdHRyaWJ1dGUuY3MgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9GbGF0QnVmZmVycy5UZXN0L0ZsYXRCdWZmZXJzVGVzdE1ldGhvZEF0dHJpYnV0ZS5jcwppbmRleCA5ODlkYWU1Li40Mjc2Yjc0IDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9GbGF0QnVmZmVycy5UZXN0L0ZsYXRCdWZmZXJzVGVzdE1ldGhvZEF0dHJpYnV0ZS5jcworKysgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9GbGF0QnVmZmVycy5UZXN0L0ZsYXRCdWZmZXJzVGVzdE1ldGhvZEF0dHJpYnV0ZS5jcwpAQCAtMTYsNyArMTYsNyBAQAogCiAgdXNpbmcgU3lzdGVtOwogCi1uYW1lc3BhY2UgRmxhdEJ1ZmZlcnMuVGVzdAorbmFtZXNwYWNlIEdvb2dsZS5GbGF0QnVmZmVycy5UZXN0CiB7CiAgICAgW0F0dHJpYnV0ZVVzYWdlKEF0dHJpYnV0ZVRhcmdldHMuTWV0aG9kKV0KICAgICBwdWJsaWMgY2xhc3MgRmxhdEJ1ZmZlcnNUZXN0TWV0aG9kQXR0cmlidXRlIDogQXR0cmlidXRlCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9GbGF0QnVmZmVycy5UZXN0L0Z1enpUZXN0RGF0YS5jcyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL0ZsYXRCdWZmZXJzLlRlc3QvRnV6elRlc3REYXRhLmNzCmluZGV4IDExOWU0NGUuLjE4NmUzMTIgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL0ZsYXRCdWZmZXJzLlRlc3QvRnV6elRlc3REYXRhLmNzCisrKyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL0ZsYXRCdWZmZXJzLlRlc3QvRnV6elRlc3REYXRhLmNzCkBAIC0xNiw3ICsxNiw3IEBACiAKIHVzaW5nIFN5c3RlbTsKIAotbmFtZXNwYWNlIEZsYXRCdWZmZXJzLlRlc3QKK25hbWVzcGFjZSBHb29nbGUuRmxhdEJ1ZmZlcnMuVGVzdAogewogICAgIGludGVybmFsIHN0YXRpYyBjbGFzcyBGdXp6VGVzdERhdGEKICAgICB7CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9GbGF0QnVmZmVycy5UZXN0L0xjZy5jcyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL0ZsYXRCdWZmZXJzLlRlc3QvTGNnLmNzCmluZGV4IGMzMjllZDguLmM2MzIyZDUgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL0ZsYXRCdWZmZXJzLlRlc3QvTGNnLmNzCisrKyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL0ZsYXRCdWZmZXJzLlRlc3QvTGNnLmNzCkBAIC0xNCw3ICsxNCw3IEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCi1uYW1lc3BhY2UgRmxhdEJ1ZmZlcnMuVGVzdAorbmFtZXNwYWNlIEdvb2dsZS5GbGF0QnVmZmVycy5UZXN0CiB7CiAgICAgLy8vIDxzdW1tYXJ5PgogICAgIC8vLyBMY2cgUHNldWRvIFJORwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvRmxhdEJ1ZmZlcnMuVGVzdC9Qcm9ncmFtLmNzIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvRmxhdEJ1ZmZlcnMuVGVzdC9Qcm9ncmFtLmNzCmluZGV4IGY4Y2VjNGUuLmNkMDRkMjUgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL0ZsYXRCdWZmZXJzLlRlc3QvUHJvZ3JhbS5jcworKysgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9GbGF0QnVmZmVycy5UZXN0L1Byb2dyYW0uY3MKQEAgLTE5LDcgKzE5LDcgQEAKIHVzaW5nIFN5c3RlbS5MaW5xOwogdXNpbmcgU3lzdGVtLlJlZmxlY3Rpb247CiAKLW5hbWVzcGFjZSBGbGF0QnVmZmVycy5UZXN0CituYW1lc3BhY2UgR29vZ2xlLkZsYXRCdWZmZXJzLlRlc3QKIHsKICAgICBzdGF0aWMgY2xhc3MgUHJvZ3JhbQogICAgIHsKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL0ZsYXRCdWZmZXJzLlRlc3QvVGVzdFRhYmxlLmNzIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvRmxhdEJ1ZmZlcnMuVGVzdC9UZXN0VGFibGUuY3MKaW5kZXggNGY2NjNmMC4uNjU5YWM4ZiAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvRmxhdEJ1ZmZlcnMuVGVzdC9UZXN0VGFibGUuY3MKKysrIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvRmxhdEJ1ZmZlcnMuVGVzdC9UZXN0VGFibGUuY3MKQEAgLTE0LDcgKzE0LDcgQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKLW5hbWVzcGFjZSBGbGF0QnVmZmVycy5UZXN0CituYW1lc3BhY2UgR29vZ2xlLkZsYXRCdWZmZXJzLlRlc3QKIHsKICAgICAvLy8gPHN1bW1hcnk+CiAgICAgLy8vIEEgdGVzdCBUYWJsZSBvYmplY3QgdGhhdCBnaXZlcyBlYXN5IGFjY2VzcyB0byB0aGUgc2xvdCBkYXRhCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9GbGF0QnVmZmVycy5UZXN0L3BhY2thZ2VzLmNvbmZpZyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL0ZsYXRCdWZmZXJzLlRlc3QvcGFja2FnZXMuY29uZmlnCmluZGV4IGQ3NjZkMDQuLjFkNDFkOGUgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL0ZsYXRCdWZmZXJzLlRlc3QvcGFja2FnZXMuY29uZmlnCisrKyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL0ZsYXRCdWZmZXJzLlRlc3QvcGFja2FnZXMuY29uZmlnCkBAIC0xLDQgKzEsNCBAQAog77u/PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KIDxwYWNrYWdlcz4KLSAgPHBhY2thZ2UgaWQ9Ik5ld3RvbnNvZnQuSnNvbiIgdmVyc2lvbj0iMTIuMC4zIiB0YXJnZXRGcmFtZXdvcms9Im5ldDM1IiAvPgorICA8cGFja2FnZSBpZD0iTmV3dG9uc29mdC5Kc29uIiB2ZXJzaW9uPSIxMy4wLjEiIHRhcmdldEZyYW1ld29yaz0ibmV0MzUiIC8+CiA8L3BhY2thZ2VzPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL0dvVGVzdC5zaCBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL0dvVGVzdC5zaAppbmRleCA5ZjdhZDc2Li44NTI1M2MxIDEwMDc1NQotLS0gYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9Hb1Rlc3Quc2gKKysrIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvR29UZXN0LnNoCkBAIC00MSw2ICs0MSwxMSBAQAogY3AgLWEgLi9nb190ZXN0LmdvIC4vZ29fZ2VuL3NyYy9mbGF0YnVmZmVyc190ZXN0LwogY3AgLWEgb3B0aW9uYWxfc2NhbGFycy8qLmdvIC4vZ29fZ2VuL3NyYy9vcHRpb25hbF9zY2FsYXJzCiAKKyMgaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9hLzYzNTQ1ODU3LzcwMjQ5NzgKKyMgV2UgbmVlZCB0byB0dXJuIG9mZiBnbyBtb2R1bGVzIGZvciB0aGlzIHNjcmlwdAorIyB0byB3b3JrLgorZ28gZW52IC13ICBHTzExMU1PRFVMRT1vZmYKKwogIyBSdW4gdGVzdHMgd2l0aCBuZWNlc3NhcnkgZmxhZ3MuCiAjIERldmVsb3BlcnMgbWF5IHdpc2ggdG8gc2VlIG1vcmUgZGV0YWlsIGJ5IGFwcGVuZGluZyB0aGUgdmVyYm9zaXR5IGZsYWcKICMgLXRlc3QudiB0byBhcmd1bWVudHMgZm9yIHRoaXMgY29tbWFuZCwgYXMgaW46CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9KYXZhVGVzdC5iYXQgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9KYXZhVGVzdC5iYXQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkyMTgxNWEuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvSmF2YVRlc3QuYmF0CisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotQGVjaG8gb2ZmCi1yZW0gQ29weXJpZ2h0IDIwMTQgR29vZ2xlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLXJlbQotcmVtIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotcmVtIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLXJlbSBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLXJlbQotcmVtICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLXJlbQotcmVtIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLXJlbSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotcmVtIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotcmVtIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLXJlbSBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotcmVtIENvbXBpbGUgdGhlbiBydW4gdGhlIEphdmEgdGVzdC4KLQotc2V0IGJhdGNoX2ZpbGVfZGlyPSV+ZDAlfnAwCi0KLWphdmFjIC1nIC1jbGFzc3BhdGggJWJhdGNoX2ZpbGVfZGlyJVwuLlxqYXZhOyViYXRjaF9maWxlX2RpciU7JWJhdGNoX2ZpbGVfZGlyJVxuYW1lc3BhY2VfdGVzdDslYmF0Y2hfZmlsZV9kaXIlXHVuaW9uX3ZlY3RvciBKYXZhVGVzdC5qYXZhCi1qYXZhIC1jbGFzc3BhdGggJWJhdGNoX2ZpbGVfZGlyJVwuLlxqYXZhOyViYXRjaF9maWxlX2RpciU7JWJhdGNoX2ZpbGVfZGlyJVxuYW1lc3BhY2VfdGVzdDslYmF0Y2hfZmlsZV9kaXIlXHVuaW9uX3ZlY3RvciBKYXZhVGVzdApkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvSmF2YVRlc3QuamF2YSBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL0phdmFUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBmMmFkMTIuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvSmF2YVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NTggKzAsMCBAQAotCi1pbXBvcnQgc3RhdGljIGNvbS5nb29nbGUuZmxhdGJ1ZmZlcnMuQ29uc3RhbnRzLio7Ci0KLWltcG9ydCBNeUdhbWUuRXhhbXBsZS4qOwotaW1wb3J0IG9wdGlvbmFsX3NjYWxhcnMuU2NhbGFyU3R1ZmY7Ci1pbXBvcnQgb3B0aW9uYWxfc2NhbGFycy5PcHRpb25hbEJ5dGU7Ci1pbXBvcnQgTXlHYW1lLk1vbnN0ZXJFeHRyYTsKLWltcG9ydCBOYW1lc3BhY2VBLio7Ci1pbXBvcnQgTmFtZXNwYWNlQS5OYW1lc3BhY2VCLio7Ci1pbXBvcnQgY29tLmdvb2dsZS5mbGF0YnVmZmVycy5CeXRlQnVmZmVyVXRpbDsKLWltcG9ydCBjb20uZ29vZ2xlLmZsYXRidWZmZXJzLkJ5dGVWZWN0b3I7Ci1pbXBvcnQgY29tLmdvb2dsZS5mbGF0YnVmZmVycy5GbGF0QnVmZmVyQnVpbGRlcjsKLWltcG9ydCBjb20uZ29vZ2xlLmZsYXRidWZmZXJzLkZsZXhCdWZmZXJzOwotaW1wb3J0IGNvbS5nb29nbGUuZmxhdGJ1ZmZlcnMuRmxleEJ1ZmZlcnNCdWlsZGVyOwotaW1wb3J0IGNvbS5nb29nbGUuZmxhdGJ1ZmZlcnMuU3RyaW5nVmVjdG9yOwotaW1wb3J0IGNvbS5nb29nbGUuZmxhdGJ1ZmZlcnMuVW5pb25WZWN0b3I7Ci0KLWltcG9ydCBjb20uZ29vZ2xlLmZsYXRidWZmZXJzLkZsZXhCdWZmZXJzLkZsZXhCdWZmZXJFeGNlcHRpb247Ci1pbXBvcnQgY29tLmdvb2dsZS5mbGF0YnVmZmVycy5GbGV4QnVmZmVycy5SZWZlcmVuY2U7Ci1pbXBvcnQgY29tLmdvb2dsZS5mbGF0YnVmZmVycy5GbGV4QnVmZmVycy5WZWN0b3I7Ci1pbXBvcnQgY29tLmdvb2dsZS5mbGF0YnVmZmVycy5BcnJheVJlYWRXcml0ZUJ1ZjsKLWltcG9ydCBjb20uZ29vZ2xlLmZsYXRidWZmZXJzLkZsZXhCdWZmZXJzLktleVZlY3RvcjsKLQotaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKLWltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOwotaW1wb3J0IGphdmEubmlvLkJ5dGVPcmRlcjsKLWltcG9ydCBqYXZhLm5pby5DaGFyQnVmZmVyOwotaW1wb3J0IGphdmEubmlvLmNoYW5uZWxzLkZpbGVDaGFubmVsOwotaW1wb3J0IGphdmEubmlvLmNoYXJzZXQuU3RhbmRhcmRDaGFyc2V0czsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLS8qCi0gKiBDb3B5cmlnaHQgMjAxNCBHb29nbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLQotCi1jbGFzcyBKYXZhVGVzdCB7Ci0gICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCi0gICAgICAgIC8vIEZpcnN0LCBsZXQncyB0ZXN0IHJlYWRpbmcgYSBGbGF0QnVmZmVyIGdlbmVyYXRlZCBieSBDKysgY29kZToKLSAgICAgICAgLy8gVGhpcyBmaWxlIHdhcyBnZW5lcmF0ZWQgZnJvbSBtb25zdGVyZGF0YV90ZXN0Lmpzb24KLQotICAgICAgICBieXRlW10gZGF0YSA9IG51bGw7Ci0gICAgICAgIEZpbGUgZmlsZSA9IG5ldyBGaWxlKCJtb25zdGVyZGF0YV90ZXN0Lm1vbiIpOwotICAgICAgICBSYW5kb21BY2Nlc3NGaWxlIGYgPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgZiA9IG5ldyBSYW5kb21BY2Nlc3NGaWxlKGZpbGUsICJyIik7Ci0gICAgICAgICAgICBkYXRhID0gbmV3IGJ5dGVbKGludClmLmxlbmd0aCgpXTsKLSAgICAgICAgICAgIGYucmVhZEZ1bGx5KGRhdGEpOwotICAgICAgICAgICAgZi5jbG9zZSgpOwotICAgICAgICB9IGNhdGNoKGphdmEuaW8uSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJGbGF0QnVmZmVycyB0ZXN0OiBjb3VsZG4ndCByZWFkIGZpbGUiKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIE5vdyB0ZXN0IGl0OgotCi0gICAgICAgIEJ5dGVCdWZmZXIgYmIgPSBCeXRlQnVmZmVyLndyYXAoZGF0YSk7Ci0gICAgICAgIFRlc3RCdWZmZXIoYmIpOwotCi0gICAgICAgIC8vIFNlY29uZCwgbGV0J3MgY3JlYXRlIGEgRmxhdEJ1ZmZlciBmcm9tIHNjcmF0Y2ggaW4gSmF2YSwgYW5kIHRlc3QgaXQgYWxzby4KLSAgICAgICAgLy8gV2UgdXNlIGFuIGluaXRpYWwgc2l6ZSBvZiAxIHRvIGV4ZXJjaXNlIHRoZSByZWFsbG9jYXRpb24gYWxnb3JpdGhtLAotICAgICAgICAvLyBub3JtYWxseSBhIHNpemUgbGFyZ2VyIHRoYW4gdGhlIHR5cGljYWwgRmxhdEJ1ZmZlciB5b3UgZ2VuZXJhdGUgd291bGQgYmUKLSAgICAgICAgLy8gYmV0dGVyIGZvciBwZXJmb3JtYW5jZS4KLSAgICAgICAgRmxhdEJ1ZmZlckJ1aWxkZXIgZmJiID0gbmV3IEZsYXRCdWZmZXJCdWlsZGVyKDEpOwotCi0gICAgICAgIFRlc3RCdWlsZGVyQmFzaWNzKGZiYiwgdHJ1ZSk7Ci0gICAgICAgIFRlc3RCdWlsZGVyQmFzaWNzKGZiYiwgZmFsc2UpOwotCi0gICAgICAgIFRlc3RFeHRlbmRlZEJ1ZmZlcihmYmIuZGF0YUJ1ZmZlcigpLmFzUmVhZE9ubHlCdWZmZXIoKSk7Ci0KLSAgICAgICAgVGVzdE5hbWVzcGFjZU5lc3RpbmcoKTsKLQotICAgICAgICBUZXN0TmVzdGVkRmxhdEJ1ZmZlcigpOwotCi0gICAgICAgIFRlc3RDcmVhdGVCeXRlVmVjdG9yKCk7Ci0KLSAgICAgICAgVGVzdENyZWF0ZVVuaW5pdGlhbGl6ZWRWZWN0b3IoKTsKLQotICAgICAgICBUZXN0Qnl0ZUJ1ZmZlckZhY3RvcnkoKTsKLQotICAgICAgICBUZXN0U2l6ZWRJbnB1dFN0cmVhbSgpOwotCi0gICAgICAgIFRlc3RWZWN0b3JPZlVuaW9ucygpOwotCi0gICAgICAgIFRlc3RGaXhlZExlbmd0aEFycmF5cygpOwotCi0gICAgICAgIFRlc3RGbGV4QnVmZmVycygpOwotCi0gICAgICAgIFRlc3RWZWN0b3JPZkJ5dGVzKCk7Ci0KLSAgICAgICAgVGVzdFNoYXJlZFN0cmluZ1Bvb2woKTsKLQotICAgICAgICBUZXN0U2NhbGFyT3B0aW9uYWwoKTsKLQotICAgICAgICBUZXN0UGFja1VucGFjayhiYik7Ci0KLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJGbGF0QnVmZmVycyB0ZXN0OiBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5Iik7Ci0gICAgfQotCi0gICAgc3RhdGljIHZvaWQgVGVzdEVudW1zKCkgewotICAgICAgVGVzdEVxKENvbG9yLm5hbWUoQ29sb3IuUmVkKSwgIlJlZCIpOwotICAgICAgVGVzdEVxKENvbG9yLm5hbWUoQ29sb3IuQmx1ZSksICJCbHVlIik7Ci0gICAgICBUZXN0RXEoQW55Lm5hbWUoQW55Lk5PTkUpLCAiTk9ORSIpOwotICAgICAgVGVzdEVxKEFueS5uYW1lKEFueS5Nb25zdGVyKSwgIk1vbnN0ZXIiKTsKLSAgICB9Ci0KLSAgICBzdGF0aWMgdm9pZCBUZXN0QnVmZmVyKEJ5dGVCdWZmZXIgYmIpIHsKLSAgICAgICAgVGVzdEVxKE1vbnN0ZXIuTW9uc3RlckJ1ZmZlckhhc0lkZW50aWZpZXIoYmIpLCB0cnVlKTsKLQotICAgICAgICBNb25zdGVyIG1vbnN0ZXIgPSBNb25zdGVyLmdldFJvb3RBc01vbnN0ZXIoYmIpOwotCi0gICAgICAgIFRlc3RFcShtb25zdGVyLmhwKCksIChzaG9ydCk4MCk7Ci0gICAgICAgIFRlc3RFcShtb25zdGVyLm1hbmEoKSwgKHNob3J0KTE1MCk7ICAvLyBkZWZhdWx0Ci0KLSAgICAgICAgVGVzdEVxKG1vbnN0ZXIubmFtZSgpLCAiTXlNb25zdGVyIik7Ci0gICAgICAgIC8vIG1vbnN0ZXIuZnJpZW5kbHkoKSAvLyBjYW4ndCBhY2Nlc3MsIGRlcHJlY2F0ZWQKLQotICAgICAgICBWZWMzIHBvcyA9IG1vbnN0ZXIucG9zKCk7Ci0gICAgICAgIFRlc3RFcShwb3MueCgpLCAxLjBmKTsKLSAgICAgICAgVGVzdEVxKHBvcy55KCksIDIuMGYpOwotICAgICAgICBUZXN0RXEocG9zLnooKSwgMy4wZik7Ci0gICAgICAgIFRlc3RFcShwb3MudGVzdDEoKSwgMy4wKTsKLSAgICAgICAgLy8gaXNzdWU6IGludCAhPSBieXRlCi0gICAgICAgIFRlc3RFcShwb3MudGVzdDIoKSwgKGludCkgQ29sb3IuR3JlZW4pOwotICAgICAgICBUZXN0IHQgPSBwb3MudGVzdDMoKTsKLSAgICAgICAgVGVzdEVxKHQuYSgpLCAoc2hvcnQpNSk7Ci0gICAgICAgIFRlc3RFcSh0LmIoKSwgKGJ5dGUpNik7Ci0KLSAgICAgICAgVGVzdEVxKG1vbnN0ZXIudGVzdFR5cGUoKSwgKGJ5dGUpQW55Lk1vbnN0ZXIpOwotICAgICAgICBNb25zdGVyIG1vbnN0ZXIyID0gbmV3IE1vbnN0ZXIoKTsKLSAgICAgICAgVGVzdEVxKG1vbnN0ZXIudGVzdChtb25zdGVyMikgIT0gbnVsbCwgdHJ1ZSk7Ci0gICAgICAgIFRlc3RFcShtb25zdGVyMi5uYW1lKCksICJGcmVkIik7Ci0KLSAgICAgICAgVGVzdEVxKG1vbnN0ZXIuaW52ZW50b3J5TGVuZ3RoKCksIDUpOwotICAgICAgICBpbnQgaW52c3VtID0gMDsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtb25zdGVyLmludmVudG9yeUxlbmd0aCgpOyBpKyspCi0gICAgICAgICAgICBpbnZzdW0gKz0gbW9uc3Rlci5pbnZlbnRvcnkoaSk7Ci0gICAgICAgIFRlc3RFcShpbnZzdW0sIDEwKTsKLQotICAgICAgICAvLyBNZXRob2QgdXNpbmcgYSB2ZWN0b3IgYWNjZXNzIG9iamVjdDoKLSAgICAgICAgQnl0ZVZlY3RvciBpbnZlbnRvcnlWZWN0b3IgPSBtb25zdGVyLmludmVudG9yeVZlY3RvcigpOwotICAgICAgICBUZXN0RXEoaW52ZW50b3J5VmVjdG9yLmxlbmd0aCgpLCA1KTsKLSAgICAgICAgaW52c3VtID0gMDsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpbnZlbnRvcnlWZWN0b3IubGVuZ3RoKCk7IGkrKykKLSAgICAgICAgICAgIGludnN1bSArPSBpbnZlbnRvcnlWZWN0b3IuZ2V0QXNVbnNpZ25lZChpKTsKLSAgICAgICAgVGVzdEVxKGludnN1bSwgMTApOwotCi0gICAgICAgIC8vIEFsdGVybmF0aXZlIHdheSBvZiBhY2Nlc3NpbmcgYSB2ZWN0b3I6Ci0gICAgICAgIEJ5dGVCdWZmZXIgaWJiID0gbW9uc3Rlci5pbnZlbnRvcnlBc0J5dGVCdWZmZXIoKTsKLSAgICAgICAgaW52c3VtID0gMDsKLSAgICAgICAgd2hpbGUgKGliYi5wb3NpdGlvbigpIDwgaWJiLmxpbWl0KCkpCi0gICAgICAgICAgICBpbnZzdW0gKz0gaWJiLmdldCgpOwotICAgICAgICBUZXN0RXEoaW52c3VtLCAxMCk7Ci0KLSAgICAgICAgVGVzdCB0ZXN0XzAgPSBtb25zdGVyLnRlc3Q0KDApOwotICAgICAgICBUZXN0IHRlc3RfMSA9IG1vbnN0ZXIudGVzdDQoMSk7Ci0gICAgICAgIFRlc3RFcShtb25zdGVyLnRlc3Q0TGVuZ3RoKCksIDIpOwotICAgICAgICBUZXN0RXEodGVzdF8wLmEoKSArIHRlc3RfMC5iKCkgKyB0ZXN0XzEuYSgpICsgdGVzdF8xLmIoKSwgMTAwKTsKLQotICAgICAgICBUZXN0LlZlY3RvciB0ZXN0NFZlY3RvciA9IG1vbnN0ZXIudGVzdDRWZWN0b3IoKTsKLSAgICAgICAgdGVzdF8wID0gdGVzdDRWZWN0b3IuZ2V0KDApOwotICAgICAgICB0ZXN0XzEgPSB0ZXN0NFZlY3Rvci5nZXQoMSk7Ci0gICAgICAgIFRlc3RFcSh0ZXN0NFZlY3Rvci5sZW5ndGgoKSwgMik7Ci0gICAgICAgIFRlc3RFcSh0ZXN0XzAuYSgpICsgdGVzdF8wLmIoKSArIHRlc3RfMS5hKCkgKyB0ZXN0XzEuYigpLCAxMDApOwotCi0gICAgICAgIFRlc3RFcShtb25zdGVyLnRlc3RhcnJheW9mc3RyaW5nTGVuZ3RoKCksIDIpOwotICAgICAgICBUZXN0RXEobW9uc3Rlci50ZXN0YXJyYXlvZnN0cmluZygwKSwidGVzdDEiKTsKLSAgICAgICAgVGVzdEVxKG1vbnN0ZXIudGVzdGFycmF5b2ZzdHJpbmcoMSksInRlc3QyIik7Ci0KLSAgICAgICAgLy8gTWV0aG9kIHVzaW5nIGEgdmVjdG9yIGFjY2VzcyBvYmplY3Q6Ci0gICAgICAgIFN0cmluZ1ZlY3RvciB0ZXN0YXJyYXlvZnN0cmluZ1ZlY3RvciA9IG1vbnN0ZXIudGVzdGFycmF5b2ZzdHJpbmdWZWN0b3IoKTsKLSAgICAgICAgVGVzdEVxKHRlc3RhcnJheW9mc3RyaW5nVmVjdG9yLmxlbmd0aCgpLCAyKTsKLSAgICAgICAgVGVzdEVxKHRlc3RhcnJheW9mc3RyaW5nVmVjdG9yLmdldCgwKSwidGVzdDEiKTsKLSAgICAgICAgVGVzdEVxKHRlc3RhcnJheW9mc3RyaW5nVmVjdG9yLmdldCgxKSwidGVzdDIiKTsKLQotICAgICAgICBUZXN0RXEobW9uc3Rlci50ZXN0Ym9vbCgpLCB0cnVlKTsKLSAgICB9Ci0KLSAgICAvLyB0aGlzIG1ldGhvZCBjaGVja3MgYWRkaXRpb25hbCBmaWVsZHMgbm90IHByZXNlbnQgaW4gdGhlIGJpbmFyeSBidWZmZXIgcmVhZCBmcm9tIGZpbGUKLSAgICAvLyB0aGVzZSBuZXcgdGVzdHMgYXJlIHBlcmZvcm1lZCBvbiB0b3Agb2YgdGhlIHJlZ3VsYXIgdGVzdHMKLSAgICBzdGF0aWMgdm9pZCBUZXN0RXh0ZW5kZWRCdWZmZXIoQnl0ZUJ1ZmZlciBiYikgewotICAgICAgICBUZXN0QnVmZmVyKGJiKTsKLQotICAgICAgICBNb25zdGVyIG1vbnN0ZXIgPSBNb25zdGVyLmdldFJvb3RBc01vbnN0ZXIoYmIpOwotCi0gICAgICAgIFRlc3RFcShtb25zdGVyLnRlc3RoYXNodTMyRm52MSgpLCBJbnRlZ2VyLk1BWF9WQUxVRSArIDFMKTsKLSAgICB9Ci0KLSAgICBzdGF0aWMgdm9pZCBUZXN0TmFtZXNwYWNlTmVzdGluZygpIHsKLSAgICAgICAgLy8gcmVmZXJlbmNlIC8gbWFuaXB1bGF0ZSB0aGVzZSB0byB2ZXJpZnkgY29tcGlsYXRpb24KLSAgICAgICAgRmxhdEJ1ZmZlckJ1aWxkZXIgZmJiID0gbmV3IEZsYXRCdWZmZXJCdWlsZGVyKDEpOwotCi0gICAgICAgIFRhYmxlSW5OZXN0ZWROUy5zdGFydFRhYmxlSW5OZXN0ZWROUyhmYmIpOwotICAgICAgICBUYWJsZUluTmVzdGVkTlMuYWRkRm9vKGZiYiwgMTIzNCk7Ci0gICAgICAgIGludCBuZXN0ZWRUYWJsZU9mZiA9IFRhYmxlSW5OZXN0ZWROUy5lbmRUYWJsZUluTmVzdGVkTlMoZmJiKTsKLQotICAgICAgICBUYWJsZUluRmlyc3ROUy5zdGFydFRhYmxlSW5GaXJzdE5TKGZiYik7Ci0gICAgICAgIFRhYmxlSW5GaXJzdE5TLmFkZEZvb1RhYmxlKGZiYiwgbmVzdGVkVGFibGVPZmYpOwotICAgICAgICBpbnQgb2ZmID0gVGFibGVJbkZpcnN0TlMuZW5kVGFibGVJbkZpcnN0TlMoZmJiKTsKLSAgICB9Ci0KLSAgICBzdGF0aWMgdm9pZCBUZXN0TmVzdGVkRmxhdEJ1ZmZlcigpIHsKLSAgICAgICAgZmluYWwgU3RyaW5nIG5lc3RlZE1vbnN0ZXJOYW1lID0gIk5lc3RlZE1vbnN0ZXJOYW1lIjsKLSAgICAgICAgZmluYWwgc2hvcnQgbmVzdGVkTW9uc3RlckhwID0gNjAwOwotICAgICAgICBmaW5hbCBzaG9ydCBuZXN0ZWRNb25zdGVyTWFuYSA9IDEwMjQ7Ci0KLSAgICAgICAgRmxhdEJ1ZmZlckJ1aWxkZXIgZmJiMSA9IG5ldyBGbGF0QnVmZmVyQnVpbGRlcigxNik7Ci0gICAgICAgIGludCBzdHIxID0gZmJiMS5jcmVhdGVTdHJpbmcobmVzdGVkTW9uc3Rlck5hbWUpOwotICAgICAgICBNb25zdGVyLnN0YXJ0TW9uc3RlcihmYmIxKTsKLSAgICAgICAgTW9uc3Rlci5hZGROYW1lKGZiYjEsIHN0cjEpOwotICAgICAgICBNb25zdGVyLmFkZEhwKGZiYjEsIG5lc3RlZE1vbnN0ZXJIcCk7Ci0gICAgICAgIE1vbnN0ZXIuYWRkTWFuYShmYmIxLCBuZXN0ZWRNb25zdGVyTWFuYSk7Ci0gICAgICAgIGludCBtb25zdGVyMSA9IE1vbnN0ZXIuZW5kTW9uc3RlcihmYmIxKTsKLSAgICAgICAgTW9uc3Rlci5maW5pc2hNb25zdGVyQnVmZmVyKGZiYjEsIG1vbnN0ZXIxKTsKLSAgICAgICAgYnl0ZVtdIGZiYjFCeXRlcyA9IGZiYjEuc2l6ZWRCeXRlQXJyYXkoKTsKLSAgICAgICAgZmJiMSA9IG51bGw7Ci0KLSAgICAgICAgRmxhdEJ1ZmZlckJ1aWxkZXIgZmJiMiA9IG5ldyBGbGF0QnVmZmVyQnVpbGRlcigxNik7Ci0gICAgICAgIGludCBzdHIyID0gZmJiMi5jcmVhdGVTdHJpbmcoIk15IE1vbnN0ZXIiKTsKLSAgICAgICAgaW50IG5lc3RlZEJ1ZmZlciA9IE1vbnN0ZXIuY3JlYXRlVGVzdG5lc3RlZGZsYXRidWZmZXJWZWN0b3IoZmJiMiwgZmJiMUJ5dGVzKTsKLSAgICAgICAgTW9uc3Rlci5zdGFydE1vbnN0ZXIoZmJiMik7Ci0gICAgICAgIE1vbnN0ZXIuYWRkTmFtZShmYmIyLCBzdHIyKTsKLSAgICAgICAgTW9uc3Rlci5hZGRIcChmYmIyLCAoc2hvcnQpNTApOwotICAgICAgICBNb25zdGVyLmFkZE1hbmEoZmJiMiwgKHNob3J0KTMyKTsKLSAgICAgICAgTW9uc3Rlci5hZGRUZXN0bmVzdGVkZmxhdGJ1ZmZlcihmYmIyLCBuZXN0ZWRCdWZmZXIpOwotICAgICAgICBpbnQgbW9uc3RlciA9IE1vbnN0ZXIuZW5kTW9uc3RlcihmYmIyKTsKLSAgICAgICAgTW9uc3Rlci5maW5pc2hNb25zdGVyQnVmZmVyKGZiYjIsIG1vbnN0ZXIpOwotCi0gICAgICAgIC8vIE5vdyB0ZXN0IHRoZSBkYXRhIGV4dHJhY3RlZCBmcm9tIHRoZSBuZXN0ZWQgYnVmZmVyCi0gICAgICAgIE1vbnN0ZXIgbW9ucyA9IE1vbnN0ZXIuZ2V0Um9vdEFzTW9uc3RlcihmYmIyLmRhdGFCdWZmZXIoKSk7Ci0gICAgICAgIE1vbnN0ZXIgbmVzdGVkTW9uc3RlciA9IG1vbnMudGVzdG5lc3RlZGZsYXRidWZmZXJBc01vbnN0ZXIoKTsKLQotICAgICAgICBUZXN0RXEobmVzdGVkTW9uc3Rlck1hbmEsIG5lc3RlZE1vbnN0ZXIubWFuYSgpKTsKLSAgICAgICAgVGVzdEVxKG5lc3RlZE1vbnN0ZXJIcCwgbmVzdGVkTW9uc3Rlci5ocCgpKTsKLSAgICAgICAgVGVzdEVxKG5lc3RlZE1vbnN0ZXJOYW1lLCBuZXN0ZWRNb25zdGVyLm5hbWUoKSk7Ci0gICAgfQotCi0gICAgc3RhdGljIHZvaWQgVGVzdENyZWF0ZUJ5dGVWZWN0b3IoKSB7Ci0gICAgICAgIEZsYXRCdWZmZXJCdWlsZGVyIGZiYiA9IG5ldyBGbGF0QnVmZmVyQnVpbGRlcigxNik7Ci0gICAgICAgIGludCBzdHIgPSBmYmIuY3JlYXRlU3RyaW5nKCJNeU1vbnN0ZXIiKTsKLSAgICAgICAgYnl0ZVtdIGludmVudG9yeSA9IG5ldyBieXRlW10geyAwLCAxLCAyLCAzLCA0IH07Ci0gICAgICAgIGludCB2ZWMgPSBmYmIuY3JlYXRlQnl0ZVZlY3RvcihpbnZlbnRvcnkpOwotICAgICAgICBNb25zdGVyLnN0YXJ0TW9uc3RlcihmYmIpOwotICAgICAgICBNb25zdGVyLmFkZEludmVudG9yeShmYmIsIHZlYyk7Ci0gICAgICAgIE1vbnN0ZXIuYWRkTmFtZShmYmIsIHN0cik7Ci0gICAgICAgIGludCBtb25zdGVyMSA9IE1vbnN0ZXIuZW5kTW9uc3RlcihmYmIpOwotICAgICAgICBNb25zdGVyLmZpbmlzaE1vbnN0ZXJCdWZmZXIoZmJiLCBtb25zdGVyMSk7Ci0gICAgICAgIE1vbnN0ZXIgbW9uc3Rlck9iamVjdCA9IE1vbnN0ZXIuZ2V0Um9vdEFzTW9uc3RlcihmYmIuZGF0YUJ1ZmZlcigpKTsKLQotICAgICAgICBUZXN0RXEobW9uc3Rlck9iamVjdC5pbnZlbnRvcnkoMSksIChpbnQpaW52ZW50b3J5WzFdKTsKLSAgICAgICAgVGVzdEVxKG1vbnN0ZXJPYmplY3QuaW52ZW50b3J5TGVuZ3RoKCksIGludmVudG9yeS5sZW5ndGgpOwotICAgICAgICBCeXRlVmVjdG9yIGludmVudG9yeVZlY3RvciA9IG1vbnN0ZXJPYmplY3QuaW52ZW50b3J5VmVjdG9yKCk7Ci0gICAgICAgIFRlc3RFcShpbnZlbnRvcnlWZWN0b3IuZ2V0QXNVbnNpZ25lZCgxKSwgKGludClpbnZlbnRvcnlbMV0pOwotICAgICAgICBUZXN0RXEoaW52ZW50b3J5VmVjdG9yLmxlbmd0aCgpLCBpbnZlbnRvcnkubGVuZ3RoKTsKLQotICAgICAgICBUZXN0RXEoQnl0ZUJ1ZmZlci53cmFwKGludmVudG9yeSksIG1vbnN0ZXJPYmplY3QuaW52ZW50b3J5QXNCeXRlQnVmZmVyKCkpOwotICAgIH0KLQotICAgIHN0YXRpYyB2b2lkIFRlc3RDcmVhdGVVbmluaXRpYWxpemVkVmVjdG9yKCkgewotICAgICAgICBGbGF0QnVmZmVyQnVpbGRlciBmYmIgPSBuZXcgRmxhdEJ1ZmZlckJ1aWxkZXIoMTYpOwotICAgICAgICBpbnQgc3RyID0gZmJiLmNyZWF0ZVN0cmluZygiTXlNb25zdGVyIik7Ci0gICAgICAgIGJ5dGVbXSBpbnZlbnRvcnkgPSBuZXcgYnl0ZVtdIHsgMCwgMSwgMiwgMywgNCB9OwotICAgICAgICBCeXRlQnVmZmVyIGJiID0gZmJiLmNyZWF0ZVVuaW50aWFsaXplZFZlY3RvcigxLCBpbnZlbnRvcnkubGVuZ3RoLCAxKTsKLSAgICAgICAgZm9yIChieXRlIGk6aW52ZW50b3J5KSB7Ci0gICAgICAgICAgICBiYi5wdXQoaSk7Ci0gICAgICAgIH0KLSAgICAgICAgaW50IHZlYyA9IGZiYi5lbmRWZWN0b3IoKTsKLSAgICAgICAgTW9uc3Rlci5zdGFydE1vbnN0ZXIoZmJiKTsKLSAgICAgICAgTW9uc3Rlci5hZGRJbnZlbnRvcnkoZmJiLCB2ZWMpOwotICAgICAgICBNb25zdGVyLmFkZE5hbWUoZmJiLCBzdHIpOwotICAgICAgICBpbnQgbW9uc3RlcjEgPSBNb25zdGVyLmVuZE1vbnN0ZXIoZmJiKTsKLSAgICAgICAgTW9uc3Rlci5maW5pc2hNb25zdGVyQnVmZmVyKGZiYiwgbW9uc3RlcjEpOwotICAgICAgICBNb25zdGVyIG1vbnN0ZXJPYmplY3QgPSBNb25zdGVyLmdldFJvb3RBc01vbnN0ZXIoZmJiLmRhdGFCdWZmZXIoKSk7Ci0KLSAgICAgICAgVGVzdEVxKG1vbnN0ZXJPYmplY3QuaW52ZW50b3J5KDEpLCAoaW50KWludmVudG9yeVsxXSk7Ci0gICAgICAgIFRlc3RFcShtb25zdGVyT2JqZWN0LmludmVudG9yeUxlbmd0aCgpLCBpbnZlbnRvcnkubGVuZ3RoKTsKLSAgICAgICAgQnl0ZVZlY3RvciBpbnZlbnRvcnlWZWN0b3IgPSBtb25zdGVyT2JqZWN0LmludmVudG9yeVZlY3RvcigpOwotICAgICAgICBUZXN0RXEoaW52ZW50b3J5VmVjdG9yLmdldEFzVW5zaWduZWQoMSksIChpbnQpaW52ZW50b3J5WzFdKTsKLSAgICAgICAgVGVzdEVxKGludmVudG9yeVZlY3Rvci5sZW5ndGgoKSwgaW52ZW50b3J5Lmxlbmd0aCk7Ci0gICAgICAgIFRlc3RFcShCeXRlQnVmZmVyLndyYXAoaW52ZW50b3J5KSwgbW9uc3Rlck9iamVjdC5pbnZlbnRvcnlBc0J5dGVCdWZmZXIoKSk7Ci0gICAgfQotCi0gICAgc3RhdGljIHZvaWQgVGVzdEJ5dGVCdWZmZXJGYWN0b3J5KCkgewotICAgICAgICBmaW5hbCBjbGFzcyBNYXBwZWRCeXRlQnVmZmVyRmFjdG9yeSBleHRlbmRzIEZsYXRCdWZmZXJCdWlsZGVyLkJ5dGVCdWZmZXJGYWN0b3J5IHsKLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIEJ5dGVCdWZmZXIgbmV3Qnl0ZUJ1ZmZlcihpbnQgY2FwYWNpdHkpIHsKLSAgICAgICAgICAgICAgICBCeXRlQnVmZmVyIGJiOwotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIFJhbmRvbUFjY2Vzc0ZpbGUgZiA9IG5ldyBSYW5kb21BY2Nlc3NGaWxlKCJqYXZhdGVzdC5iaW4iLCAicnciKTsKLSAgICAgICAgICAgICAgICAgICAgYmIgPSAgZi5nZXRDaGFubmVsKCkubWFwKEZpbGVDaGFubmVsLk1hcE1vZGUuUkVBRF9XUklURSwgMCwgY2FwYWNpdHkpLm9yZGVyKEJ5dGVPcmRlci5MSVRUTEVfRU5ESUFOKTsKLSAgICAgICAgICAgICAgICAgICAgZi5jbG9zZSgpOwotICAgICAgICAgICAgICAgIH0gY2F0Y2goVGhyb3dhYmxlIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJGbGF0QnVmZmVycyB0ZXN0OiBjb3VsZG4ndCBtYXAgQnl0ZUJ1ZmZlciB0byBhIGZpbGUiKTsKLSAgICAgICAgICAgICAgICAgICAgYmIgPSBudWxsOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gYmI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBGbGF0QnVmZmVyQnVpbGRlciBmYmIgPSBuZXcgRmxhdEJ1ZmZlckJ1aWxkZXIoMSwgbmV3IE1hcHBlZEJ5dGVCdWZmZXJGYWN0b3J5KCkpOwotCi0gICAgICAgIFRlc3RCdWlsZGVyQmFzaWNzKGZiYiwgZmFsc2UpOwotICAgIH0KLQotICAgIHN0YXRpYyB2b2lkIFRlc3RTaXplZElucHV0U3RyZWFtKCkgewotICAgICAgICAvLyBUZXN0IG9uIGRlZmF1bHQgRmxhdEJ1ZmZlckJ1aWxkZXIgdGhhdCB1c2VzIEhlYXBCeXRlQnVmZmVyCi0gICAgICAgIEZsYXRCdWZmZXJCdWlsZGVyIGZiYiA9IG5ldyBGbGF0QnVmZmVyQnVpbGRlcigxKTsKLQotICAgICAgICBUZXN0QnVpbGRlckJhc2ljcyhmYmIsIGZhbHNlKTsKLQotICAgICAgICBJbnB1dFN0cmVhbSBpbiA9IGZiYi5zaXplZElucHV0U3RyZWFtKCk7Ci0gICAgICAgIGJ5dGVbXSBhcnJheSA9IGZiYi5zaXplZEJ5dGVBcnJheSgpOwotICAgICAgICBpbnQgY291bnQgPSAwOwotICAgICAgICBpbnQgY3VycmVudFZhbCA9IDA7Ci0KLSAgICAgICAgd2hpbGUgKGN1cnJlbnRWYWwgIT0gLTEgJiYgY291bnQgPCBhcnJheS5sZW5ndGgpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgY3VycmVudFZhbCA9IGluLnJlYWQoKTsKLSAgICAgICAgICAgIH0gY2F0Y2goamF2YS5pby5JT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJGbGF0QnVmZmVycyB0ZXN0OiBjb3VsZG4ndCByZWFkIGZyb20gSW5wdXRTdHJlYW0iKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBUZXN0RXEoKGJ5dGUpY3VycmVudFZhbCwgYXJyYXlbY291bnRdKTsKLSAgICAgICAgICAgIGNvdW50Kys7Ci0gICAgICAgIH0KLSAgICAgICAgVGVzdEVxKGNvdW50LCBhcnJheS5sZW5ndGgpOwotICAgIH0KLQotICAgIHN0YXRpYyB2b2lkIFRlc3RCdWlsZGVyQmFzaWNzKEZsYXRCdWZmZXJCdWlsZGVyIGZiYiwgYm9vbGVhbiBzaXplUHJlZml4KSB7Ci0gICAgICAgIGludFtdIG5hbWVzID0ge2ZiYi5jcmVhdGVTdHJpbmcoIkZyb2RvIiksIGZiYi5jcmVhdGVTdHJpbmcoIkJhcm5leSIpLCBmYmIuY3JlYXRlU3RyaW5nKCJXaWxtYSIpfTsKLSAgICAgICAgaW50W10gb2ZmID0gbmV3IGludFszXTsKLSAgICAgICAgTW9uc3Rlci5zdGFydE1vbnN0ZXIoZmJiKTsKLSAgICAgICAgTW9uc3Rlci5hZGROYW1lKGZiYiwgbmFtZXNbMF0pOwotICAgICAgICBvZmZbMF0gPSBNb25zdGVyLmVuZE1vbnN0ZXIoZmJiKTsKLSAgICAgICAgTW9uc3Rlci5zdGFydE1vbnN0ZXIoZmJiKTsKLSAgICAgICAgTW9uc3Rlci5hZGROYW1lKGZiYiwgbmFtZXNbMV0pOwotICAgICAgICBvZmZbMV0gPSBNb25zdGVyLmVuZE1vbnN0ZXIoZmJiKTsKLSAgICAgICAgTW9uc3Rlci5zdGFydE1vbnN0ZXIoZmJiKTsKLSAgICAgICAgTW9uc3Rlci5hZGROYW1lKGZiYiwgbmFtZXNbMl0pOwotICAgICAgICBvZmZbMl0gPSBNb25zdGVyLmVuZE1vbnN0ZXIoZmJiKTsKLSAgICAgICAgaW50IHNvcnRNb25zID0gZmJiLmNyZWF0ZVNvcnRlZFZlY3Rvck9mVGFibGVzKG5ldyBNb25zdGVyKCksIG9mZik7Ci0KLSAgICAgICAgLy8gV2Ugc2V0IHVwIHRoZSBzYW1lIHZhbHVlcyBhcyBtb25zdGVyZGF0YS5qc29uOgotCi0gICAgICAgIGludCBzdHIgPSBmYmIuY3JlYXRlU3RyaW5nKCJNeU1vbnN0ZXIiKTsKLQotICAgICAgICBpbnQgaW52ID0gTW9uc3Rlci5jcmVhdGVJbnZlbnRvcnlWZWN0b3IoZmJiLCBuZXcgYnl0ZVtdIHsgMCwgMSwgMiwgMywgNCB9KTsKLQotICAgICAgICBpbnQgZnJlZCA9IGZiYi5jcmVhdGVTdHJpbmcoIkZyZWQiKTsKLSAgICAgICAgTW9uc3Rlci5zdGFydE1vbnN0ZXIoZmJiKTsKLSAgICAgICAgTW9uc3Rlci5hZGROYW1lKGZiYiwgZnJlZCk7Ci0gICAgICAgIGludCBtb24yID0gTW9uc3Rlci5lbmRNb25zdGVyKGZiYik7Ci0KLSAgICAgICAgTW9uc3Rlci5zdGFydFRlc3Q0VmVjdG9yKGZiYiwgMik7Ci0gICAgICAgIFRlc3QuY3JlYXRlVGVzdChmYmIsIChzaG9ydCkxMCwgKGJ5dGUpMjApOwotICAgICAgICBUZXN0LmNyZWF0ZVRlc3QoZmJiLCAoc2hvcnQpMzAsIChieXRlKTQwKTsKLSAgICAgICAgaW50IHRlc3Q0ID0gZmJiLmVuZFZlY3RvcigpOwotCi0gICAgICAgIGludCB0ZXN0QXJyYXlPZlN0cmluZyA9IE1vbnN0ZXIuY3JlYXRlVGVzdGFycmF5b2ZzdHJpbmdWZWN0b3IoZmJiLCBuZXcgaW50W10gewotICAgICAgICAgICAgICAgIGZiYi5jcmVhdGVTdHJpbmcoInRlc3QxIiksCi0gICAgICAgICAgICAgICAgZmJiLmNyZWF0ZVN0cmluZygidGVzdDIiKQotICAgICAgICB9KTsKLQotICAgICAgICBNb25zdGVyLnN0YXJ0TW9uc3RlcihmYmIpOwotICAgICAgICBNb25zdGVyLmFkZFBvcyhmYmIsIFZlYzMuY3JlYXRlVmVjMyhmYmIsIDEuMGYsIDIuMGYsIDMuMGYsIDMuMCwKLSAgICAgICAgICAgICAgICBDb2xvci5HcmVlbiwgKHNob3J0KTUsIChieXRlKTYpKTsKLSAgICAgICAgTW9uc3Rlci5hZGRIcChmYmIsIChzaG9ydCk4MCk7Ci0gICAgICAgIE1vbnN0ZXIuYWRkTmFtZShmYmIsIHN0cik7Ci0gICAgICAgIE1vbnN0ZXIuYWRkSW52ZW50b3J5KGZiYiwgaW52KTsKLSAgICAgICAgTW9uc3Rlci5hZGRUZXN0VHlwZShmYmIsIChieXRlKUFueS5Nb25zdGVyKTsKLSAgICAgICAgTW9uc3Rlci5hZGRUZXN0KGZiYiwgbW9uMik7Ci0gICAgICAgIE1vbnN0ZXIuYWRkVGVzdDQoZmJiLCB0ZXN0NCk7Ci0gICAgICAgIE1vbnN0ZXIuYWRkVGVzdGFycmF5b2ZzdHJpbmcoZmJiLCB0ZXN0QXJyYXlPZlN0cmluZyk7Ci0gICAgICAgIE1vbnN0ZXIuYWRkVGVzdGJvb2woZmJiLCB0cnVlKTsKLSAgICAgICAgTW9uc3Rlci5hZGRUZXN0aGFzaHUzMkZudjEoZmJiLCBJbnRlZ2VyLk1BWF9WQUxVRSArIDFMKTsKLSAgICAgICAgTW9uc3Rlci5hZGRUZXN0YXJyYXlvZnRhYmxlcyhmYmIsIHNvcnRNb25zKTsKLSAgICAgICAgaW50IG1vbiA9IE1vbnN0ZXIuZW5kTW9uc3RlcihmYmIpOwotCi0gICAgICAgIGlmIChzaXplUHJlZml4KSB7Ci0gICAgICAgICAgICBNb25zdGVyLmZpbmlzaFNpemVQcmVmaXhlZE1vbnN0ZXJCdWZmZXIoZmJiLCBtb24pOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgTW9uc3Rlci5maW5pc2hNb25zdGVyQnVmZmVyKGZiYiwgbW9uKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIFdyaXRlIHRoZSByZXN1bHQgdG8gYSBmaWxlIGZvciBkZWJ1Z2dpbmcgcHVycG9zZXM6Ci0gICAgICAgIC8vIE5vdGUgdGhhdCB0aGUgYmluYXJpZXMgYXJlIG5vdCBuZWNlc3NhcmlseSBpZGVudGljYWwsIHNpbmNlIHRoZSBKU09OCi0gICAgICAgIC8vIHBhcnNlciBtYXkgc2VyaWFsaXplIGluIGEgc2xpZ2h0bHkgZGlmZmVyZW50IG9yZGVyIHRoYW4gdGhlIGFib3ZlCi0gICAgICAgIC8vIEphdmEgY29kZS4gVGhleSBhcmUgZnVuY3Rpb25hbGx5IGVxdWl2YWxlbnQgdGhvdWdoLgotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBTdHJpbmcgZmlsZW5hbWUgPSAibW9uc3RlcmRhdGFfamF2YV93aXJlIiArIChzaXplUHJlZml4ID8gIl9zcCIgOiAiIikgKyAiLm1vbiI7Ci0gICAgICAgICAgICBGaWxlQ2hhbm5lbCBmYyA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKGZpbGVuYW1lKS5nZXRDaGFubmVsKCk7Ci0gICAgICAgICAgICBmYy53cml0ZShmYmIuZGF0YUJ1ZmZlcigpLmR1cGxpY2F0ZSgpKTsKLSAgICAgICAgICAgIGZjLmNsb3NlKCk7Ci0gICAgICAgIH0gY2F0Y2goamF2YS5pby5JT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkZsYXRCdWZmZXJzIHRlc3Q6IGNvdWxkbid0IHdyaXRlIGZpbGUiKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIFRlc3QgaXQ6Ci0gICAgICAgIEJ5dGVCdWZmZXIgZGF0YUJ1ZmZlciA9IGZiYi5kYXRhQnVmZmVyKCk7Ci0gICAgICAgIGlmIChzaXplUHJlZml4KSB7Ci0gICAgICAgICAgICBUZXN0RXEoQnl0ZUJ1ZmZlclV0aWwuZ2V0U2l6ZVByZWZpeChkYXRhQnVmZmVyKSArIFNJWkVfUFJFRklYX0xFTkdUSCwKLSAgICAgICAgICAgICAgICAgICBkYXRhQnVmZmVyLnJlbWFpbmluZygpKTsKLSAgICAgICAgICAgIGRhdGFCdWZmZXIgPSBCeXRlQnVmZmVyVXRpbC5yZW1vdmVTaXplUHJlZml4KGRhdGFCdWZmZXIpOwotICAgICAgICB9Ci0gICAgICAgIFRlc3RFeHRlbmRlZEJ1ZmZlcihkYXRhQnVmZmVyKTsKLQotICAgICAgICAvLyBNYWtlIHN1cmUgaXQgYWxzbyB3b3JrcyB3aXRoIHJlYWQgb25seSBCeXRlQnVmZmVycy4gVGhpcyBpcyBzbG93ZXIsCi0gICAgICAgIC8vIHNpbmNlIGNyZWF0aW5nIHN0cmluZ3MgaW5jdXJzIGFuIGFkZGl0aW9uYWwgY29weQotICAgICAgICAvLyAoc2VlIFRhYmxlLl9fc3RyaW5nKS4KLSAgICAgICAgVGVzdEV4dGVuZGVkQnVmZmVyKGRhdGFCdWZmZXIuYXNSZWFkT25seUJ1ZmZlcigpKTsKLQotICAgICAgICBUZXN0RW51bXMoKTsKLQotICAgICAgICAvL0F0dGVtcHQgdG8gbXV0YXRlIE1vbnN0ZXIgZmllbGRzIGFuZCBjaGVjayB3aGV0aGVyIHRoZSBidWZmZXIgaGFzIGJlZW4gbXV0YXRlZCBwcm9wZXJseQotICAgICAgICAvLyByZXZlcnQgdG8gb3JpZ2luYWwgdmFsdWVzIGFmdGVyIHRlc3RpbmcKLSAgICAgICAgTW9uc3RlciBtb25zdGVyID0gTW9uc3Rlci5nZXRSb290QXNNb25zdGVyKGRhdGFCdWZmZXIpOwotCi0gICAgICAgIC8vIG1hbmEgaXMgb3B0aW9uYWwgYW5kIGRvZXMgbm90IGV4aXN0IGluIHRoZSBidWZmZXIgc28gdGhlIG11dGF0aW9uIHNob3VsZCBmYWlsCi0gICAgICAgIC8vIHRoZSBtYW5hIGZpZWxkIHNob3VsZCByZXRhaW4gaXRzIGRlZmF1bHQgdmFsdWUKLSAgICAgICAgVGVzdEVxKG1vbnN0ZXIubXV0YXRlTWFuYSgoc2hvcnQpMTApLCBmYWxzZSk7Ci0gICAgICAgIFRlc3RFcShtb25zdGVyLm1hbmEoKSwgKHNob3J0KTE1MCk7Ci0KLSAgICAgICAgLy8gQWNjZXNzaW5nIGEgdmVjdG9yIG9mIHNvcnRlZCBieSB0aGUga2V5IHRhYmxlcwotICAgICAgICBUZXN0RXEobW9uc3Rlci50ZXN0YXJyYXlvZnRhYmxlcygwKS5uYW1lKCksICJCYXJuZXkiKTsKLSAgICAgICAgVGVzdEVxKG1vbnN0ZXIudGVzdGFycmF5b2Z0YWJsZXMoMSkubmFtZSgpLCAiRnJvZG8iKTsKLSAgICAgICAgVGVzdEVxKG1vbnN0ZXIudGVzdGFycmF5b2Z0YWJsZXMoMikubmFtZSgpLCAiV2lsbWEiKTsKLSAgICAgICAgTW9uc3Rlci5WZWN0b3IgdGVzdGFycmF5b2Z0YWJsZXNWZWN0b3IgPSBtb25zdGVyLnRlc3RhcnJheW9mdGFibGVzVmVjdG9yKCk7Ci0gICAgICAgIFRlc3RFcSh0ZXN0YXJyYXlvZnRhYmxlc1ZlY3Rvci5nZXQoMCkubmFtZSgpLCAiQmFybmV5Iik7Ci0gICAgICAgIFRlc3RFcSh0ZXN0YXJyYXlvZnRhYmxlc1ZlY3Rvci5nZXQoMSkubmFtZSgpLCAiRnJvZG8iKTsKLSAgICAgICAgVGVzdEVxKHRlc3RhcnJheW9mdGFibGVzVmVjdG9yLmdldCgyKS5uYW1lKCksICJXaWxtYSIpOwotCi0gICAgICAgIC8vIEV4YW1wbGUgb2Ygc2VhcmNoaW5nIGZvciBhIHRhYmxlIGJ5IHRoZSBrZXkKLSAgICAgICAgVGVzdEVxKG1vbnN0ZXIudGVzdGFycmF5b2Z0YWJsZXNCeUtleSgiRnJvZG8iKS5uYW1lKCksICJGcm9kbyIpOwotICAgICAgICBUZXN0RXEobW9uc3Rlci50ZXN0YXJyYXlvZnRhYmxlc0J5S2V5KCJCYXJuZXkiKS5uYW1lKCksICJCYXJuZXkiKTsKLSAgICAgICAgVGVzdEVxKG1vbnN0ZXIudGVzdGFycmF5b2Z0YWJsZXNCeUtleSgiV2lsbWEiKS5uYW1lKCksICJXaWxtYSIpOwotICAgICAgICBUZXN0RXEodGVzdGFycmF5b2Z0YWJsZXNWZWN0b3IuZ2V0QnlLZXkoIkZyb2RvIikubmFtZSgpLCAiRnJvZG8iKTsKLSAgICAgICAgVGVzdEVxKHRlc3RhcnJheW9mdGFibGVzVmVjdG9yLmdldEJ5S2V5KCJCYXJuZXkiKS5uYW1lKCksICJCYXJuZXkiKTsKLSAgICAgICAgVGVzdEVxKHRlc3RhcnJheW9mdGFibGVzVmVjdG9yLmdldEJ5S2V5KCJXaWxtYSIpLm5hbWUoKSwgIldpbG1hIik7Ci0KLSAgICAgICAgLy8gdGVzdFR5cGUgaXMgYW4gZXhpc3RpbmcgZmllbGQgYW5kIG11dGF0aW5nIGl0IHNob3VsZCBzdWNjZWVkCi0gICAgICAgIFRlc3RFcShtb25zdGVyLnRlc3RUeXBlKCksIChieXRlKUFueS5Nb25zdGVyKTsKLQotICAgICAgICAvL211dGF0ZSB0aGUgaW52ZW50b3J5IHZlY3RvcgotICAgICAgICBUZXN0RXEobW9uc3Rlci5tdXRhdGVJbnZlbnRvcnkoMCwgMSksIHRydWUpOwotICAgICAgICBUZXN0RXEobW9uc3Rlci5tdXRhdGVJbnZlbnRvcnkoMSwgMiksIHRydWUpOwotICAgICAgICBUZXN0RXEobW9uc3Rlci5tdXRhdGVJbnZlbnRvcnkoMiwgMyksIHRydWUpOwotICAgICAgICBUZXN0RXEobW9uc3Rlci5tdXRhdGVJbnZlbnRvcnkoMywgNCksIHRydWUpOwotICAgICAgICBUZXN0RXEobW9uc3Rlci5tdXRhdGVJbnZlbnRvcnkoNCwgNSksIHRydWUpOwotCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbW9uc3Rlci5pbnZlbnRvcnlMZW5ndGgoKTsgaSsrKSB7Ci0gICAgICAgICAgICBUZXN0RXEobW9uc3Rlci5pbnZlbnRvcnkoaSksIGkgKyAxKTsKLSAgICAgICAgfQotICAgICAgICBCeXRlVmVjdG9yIGludmVudG9yeVZlY3RvciA9ICBtb25zdGVyLmludmVudG9yeVZlY3RvcigpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGludmVudG9yeVZlY3Rvci5sZW5ndGgoKTsgaSsrKSB7Ci0gICAgICAgICAgICBUZXN0RXEoKGludClpbnZlbnRvcnlWZWN0b3IuZ2V0KGkpLCBpICsgMSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvL3JldmVyc2UgbXV0YXRpb24KLSAgICAgICAgVGVzdEVxKG1vbnN0ZXIubXV0YXRlSW52ZW50b3J5KDAsIDApLCB0cnVlKTsKLSAgICAgICAgVGVzdEVxKG1vbnN0ZXIubXV0YXRlSW52ZW50b3J5KDEsIDEpLCB0cnVlKTsKLSAgICAgICAgVGVzdEVxKG1vbnN0ZXIubXV0YXRlSW52ZW50b3J5KDIsIDIpLCB0cnVlKTsKLSAgICAgICAgVGVzdEVxKG1vbnN0ZXIubXV0YXRlSW52ZW50b3J5KDMsIDMpLCB0cnVlKTsKLSAgICAgICAgVGVzdEVxKG1vbnN0ZXIubXV0YXRlSW52ZW50b3J5KDQsIDQpLCB0cnVlKTsKLQotICAgICAgICAvLyBnZXQgYSBzdHJ1Y3QgZmllbGQgYW5kIGVkaXQgb25lIG9mIGl0cyBmaWVsZHMKLSAgICAgICAgVmVjMyBwb3MgPSBtb25zdGVyLnBvcygpOwotICAgICAgICBUZXN0RXEocG9zLngoKSwgMS4wZik7Ci0gICAgICAgIHBvcy5tdXRhdGVYKDU1LjBmKTsKLSAgICAgICAgVGVzdEVxKHBvcy54KCksIDU1LjBmKTsKLSAgICAgICAgcG9zLm11dGF0ZVgoMS4wZik7Ci0gICAgICAgIFRlc3RFcShwb3MueCgpLCAxLjBmKTsKLSAgICB9Ci0KLSAgICBzdGF0aWMgdm9pZCBUZXN0VmVjdG9yT2ZVbmlvbnMoKSB7Ci0gICAgICAgIGZpbmFsIEZsYXRCdWZmZXJCdWlsZGVyIGZiYiA9IG5ldyBGbGF0QnVmZmVyQnVpbGRlcigpOwotCi0gICAgICAgIGZpbmFsIGludCBzd29yZEF0dGFja0RhbWFnZSA9IDE7Ci0KLSAgICAgICAgZmluYWwgaW50W10gY2hhcmFjdGVyVmVjdG9yID0gbmV3IGludFtdIHsKLSAgICAgICAgICAgIEF0dGFja2VyLmNyZWF0ZUF0dGFja2VyKGZiYiwgc3dvcmRBdHRhY2tEYW1hZ2UpLAotICAgICAgICB9OwotCi0gICAgICAgIGZpbmFsIGJ5dGVbXSBjaGFyYWN0ZXJUeXBlVmVjdG9yID0gbmV3IGJ5dGVbXXsKLSAgICAgICAgICAgIENoYXJhY3Rlci5NdUxhbiwKLSAgICAgICAgfTsKLQotICAgICAgICBNb3ZpZS5maW5pc2hNb3ZpZUJ1ZmZlcigKLSAgICAgICAgICAgIGZiYiwKLSAgICAgICAgICAgIE1vdmllLmNyZWF0ZU1vdmllKAotICAgICAgICAgICAgICAgIGZiYiwKLSAgICAgICAgICAgICAgICAoYnl0ZSkwLAotICAgICAgICAgICAgICAgIChieXRlKTAsCi0gICAgICAgICAgICAgICAgTW92aWUuY3JlYXRlQ2hhcmFjdGVyc1R5cGVWZWN0b3IoZmJiLCBjaGFyYWN0ZXJUeXBlVmVjdG9yKSwKLSAgICAgICAgICAgICAgICBNb3ZpZS5jcmVhdGVDaGFyYWN0ZXJzVmVjdG9yKGZiYiwgY2hhcmFjdGVyVmVjdG9yKQotICAgICAgICAgICAgKQotICAgICAgICApOwotCi0gICAgICAgIGZpbmFsIE1vdmllIG1vdmllID0gTW92aWUuZ2V0Um9vdEFzTW92aWUoZmJiLmRhdGFCdWZmZXIoKSk7Ci0gICAgICAgIEJ5dGVWZWN0b3IgY2hhcmFjdGVyc1R5cGVCeXRlVmVjdG9yID0gbW92aWUuY2hhcmFjdGVyc1R5cGVWZWN0b3IoKTsKLSAgICAgICAgVW5pb25WZWN0b3IgY2hhcmFjdGVyc1ZlY3RvciA9IG1vdmllLmNoYXJhY3RlcnNWZWN0b3IoKTsKLQotICAgICAgICBUZXN0RXEobW92aWUuY2hhcmFjdGVyc1R5cGVMZW5ndGgoKSwgY2hhcmFjdGVyVHlwZVZlY3Rvci5sZW5ndGgpOwotICAgICAgICBUZXN0RXEoY2hhcmFjdGVyc1R5cGVCeXRlVmVjdG9yLmxlbmd0aCgpLCBjaGFyYWN0ZXJUeXBlVmVjdG9yLmxlbmd0aCk7Ci0gICAgICAgIFRlc3RFcShtb3ZpZS5jaGFyYWN0ZXJzTGVuZ3RoKCksIGNoYXJhY3RlclZlY3Rvci5sZW5ndGgpOwotICAgICAgICBUZXN0RXEoY2hhcmFjdGVyc1ZlY3Rvci5sZW5ndGgoKSwgY2hhcmFjdGVyVmVjdG9yLmxlbmd0aCk7Ci0KLSAgICAgICAgVGVzdEVxKG1vdmllLmNoYXJhY3RlcnNUeXBlKDApLCBjaGFyYWN0ZXJUeXBlVmVjdG9yWzBdKTsKLSAgICAgICAgVGVzdEVxKGNoYXJhY3RlcnNUeXBlQnl0ZVZlY3Rvci5nZXQoMCksIGNoYXJhY3RlclR5cGVWZWN0b3JbMF0pOwotCi0gICAgICAgIFRlc3RFcSgoKEF0dGFja2VyKW1vdmllLmNoYXJhY3RlcnMobmV3IEF0dGFja2VyKCksIDApKS5zd29yZEF0dGFja0RhbWFnZSgpLCBzd29yZEF0dGFja0RhbWFnZSk7Ci0gICAgfQotCi0gICAgc3RhdGljIHZvaWQgVGVzdEZpeGVkTGVuZ3RoQXJyYXlzKCkgewotICAgICAgICBGbGF0QnVmZmVyQnVpbGRlciBidWlsZGVyID0gbmV3IEZsYXRCdWZmZXJCdWlsZGVyKDApOwotCi0gICAgICAgIGZsb2F0ICAgICAgIGE7Ci0gICAgICAgIGludFtdICAgICAgIGIgPSBuZXcgaW50WzE1XTsKLSAgICAgICAgYnl0ZSAgICAgICAgYzsKLSAgICAgICAgaW50W11bXSAgICAgZF9hID0gbmV3IGludFsyXVsyXTsKLSAgICAgICAgYnl0ZVtdICAgICAgZF9iID0gbmV3IGJ5dGVbMl07Ci0gICAgICAgIGJ5dGVbXVtdICAgIGRfYyA9IG5ldyBieXRlWzJdWzJdOwotICAgICAgICBsb25nW11bXSAgICBkX2QgPSBuZXcgbG9uZ1syXVsyXTsKLSAgICAgICAgaW50ICAgICAgICAgZTsKLSAgICAgICAgbG9uZ1tdICAgICAgZiA9IG5ldyBsb25nWzJdOwotCi0gICAgICAgIGEgPSAwLjVmOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDE1OyBpKyspIGJbaV0gPSBpOwotICAgICAgICBjID0gMTsKLSAgICAgICAgZF9hWzBdWzBdID0gMTsKLSAgICAgICAgZF9hWzBdWzFdID0gMjsKLSAgICAgICAgZF9hWzFdWzBdID0gMzsKLSAgICAgICAgZF9hWzFdWzFdID0gNDsKLSAgICAgICAgZF9iWzBdID0gVGVzdEVudW0uQjsKLSAgICAgICAgZF9iWzFdID0gVGVzdEVudW0uQzsKLSAgICAgICAgZF9jWzBdWzBdID0gVGVzdEVudW0uQTsKLSAgICAgICAgZF9jWzBdWzFdID0gVGVzdEVudW0uQjsKLSAgICAgICAgZF9jWzFdWzBdID0gVGVzdEVudW0uQzsKLSAgICAgICAgZF9jWzFdWzFdID0gVGVzdEVudW0uQjsKLSAgICAgICAgZF9kWzBdWzBdID0gLTE7Ci0gICAgICAgIGRfZFswXVsxXSA9IDE7Ci0gICAgICAgIGRfZFsxXVswXSA9IC0yOwotICAgICAgICBkX2RbMV1bMV0gPSAyOwotICAgICAgICBlID0gMjsKLSAgICAgICAgZlswXSA9IC0xOwotICAgICAgICBmWzFdID0gMTsKLQotICAgICAgICBpbnQgYXJyYXlPZmZzZXQgPSBBcnJheVN0cnVjdC5jcmVhdGVBcnJheVN0cnVjdChidWlsZGVyLAotICAgICAgICAgICAgYSwgYiwgYywgZF9hLCBkX2IsIGRfYywgZF9kLCBlLCBmKTsKLQotICAgICAgICAvLyBDcmVhdGUgYSB0YWJsZSB3aXRoIHRoZSBBcnJheVN0cnVjdC4KLSAgICAgICAgQXJyYXlUYWJsZS5zdGFydEFycmF5VGFibGUoYnVpbGRlcik7Ci0gICAgICAgIEFycmF5VGFibGUuYWRkQShidWlsZGVyLCBhcnJheU9mZnNldCk7Ci0gICAgICAgIGludCB0YWJsZU9mZnNldCA9IEFycmF5VGFibGUuZW5kQXJyYXlUYWJsZShidWlsZGVyKTsKLQotICAgICAgICBBcnJheVRhYmxlLmZpbmlzaEFycmF5VGFibGVCdWZmZXIoYnVpbGRlciwgdGFibGVPZmZzZXQpOwotCi0gICAgICAgIEFycmF5VGFibGUgdGFibGUgPSBBcnJheVRhYmxlLmdldFJvb3RBc0FycmF5VGFibGUoYnVpbGRlci5kYXRhQnVmZmVyKCkpOwotICAgICAgICBOZXN0ZWRTdHJ1Y3QgbmVzdGVkID0gbmV3IE5lc3RlZFN0cnVjdCgpOwotCi0gICAgICAgIFRlc3RFcSh0YWJsZS5hKCkuYSgpLCAwLjVmKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAxNTsgaSsrKSBUZXN0RXEodGFibGUuYSgpLmIoaSksIGkpOwotICAgICAgICBUZXN0RXEodGFibGUuYSgpLmMoKSwgKGJ5dGUpMSk7Ci0gICAgICAgIFRlc3RFcSh0YWJsZS5hKCkuZChuZXN0ZWQsIDApLmEoMCksIDEpOwotICAgICAgICBUZXN0RXEodGFibGUuYSgpLmQobmVzdGVkLCAwKS5hKDEpLCAyKTsKLSAgICAgICAgVGVzdEVxKHRhYmxlLmEoKS5kKG5lc3RlZCwgMSkuYSgwKSwgMyk7Ci0gICAgICAgIFRlc3RFcSh0YWJsZS5hKCkuZChuZXN0ZWQsIDEpLmEoMSksIDQpOwotICAgICAgICBUZXN0RXEodGFibGUuYSgpLmQobmVzdGVkLCAwKS5iKCksIFRlc3RFbnVtLkIpOwotICAgICAgICBUZXN0RXEodGFibGUuYSgpLmQobmVzdGVkLCAxKS5iKCksIFRlc3RFbnVtLkMpOwotICAgICAgICBUZXN0RXEodGFibGUuYSgpLmQobmVzdGVkLCAwKS5jKDApLCBUZXN0RW51bS5BKTsKLSAgICAgICAgVGVzdEVxKHRhYmxlLmEoKS5kKG5lc3RlZCwgMCkuYygxKSwgVGVzdEVudW0uQik7Ci0gICAgICAgIFRlc3RFcSh0YWJsZS5hKCkuZChuZXN0ZWQsIDEpLmMoMCksIFRlc3RFbnVtLkMpOwotICAgICAgICBUZXN0RXEodGFibGUuYSgpLmQobmVzdGVkLCAxKS5jKDEpLCBUZXN0RW51bS5CKTsKLSAgICAgICAgVGVzdEVxKHRhYmxlLmEoKS5kKG5lc3RlZCwgMCkuZCgwKSwgKGxvbmcpLTEpOwotICAgICAgICBUZXN0RXEodGFibGUuYSgpLmQobmVzdGVkLCAwKS5kKDEpLCAobG9uZykxKTsKLSAgICAgICAgVGVzdEVxKHRhYmxlLmEoKS5kKG5lc3RlZCwgMSkuZCgwKSwgKGxvbmcpLTIpOwotICAgICAgICBUZXN0RXEodGFibGUuYSgpLmQobmVzdGVkLCAxKS5kKDEpLCAobG9uZykyKTsKLSAgICAgICAgVGVzdEVxKHRhYmxlLmEoKS5lKCksIDIpOwotICAgICAgICBUZXN0RXEodGFibGUuYSgpLmYoMCksIChsb25nKS0xKTsKLSAgICAgICAgVGVzdEVxKHRhYmxlLmEoKS5mKDEpLCAobG9uZykxKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgdGVzdEZsZXhCdWZmZXJzVGVzdCgpIHsKLSAgICAgICAgRmxleEJ1ZmZlcnNCdWlsZGVyIGJ1aWxkZXIgPSBuZXcgRmxleEJ1ZmZlcnNCdWlsZGVyKEJ5dGVCdWZmZXIuYWxsb2NhdGUoNTEyKSwKLSAgICAgICAgICAgICAgICBGbGV4QnVmZmVyc0J1aWxkZXIuQlVJTERFUl9GTEFHX1NIQVJFX0tFWVNfQU5EX1NUUklOR1MpOwotICAgICAgICB0ZXN0RmxleEJ1ZmZlcnNUZXN0KGJ1aWxkZXIpOwotICAgICAgICBpbnQgYnVmZmVyTGltaXQxID0gKChBcnJheVJlYWRXcml0ZUJ1ZikgYnVpbGRlci5nZXRCdWZmZXIoKSkubGltaXQoKTsKLQotICAgICAgICAvLyBSZXBlYXQgYWZ0ZXIgY2xlYXJpbmcgdGhlIGJ1aWxkZXIgdG8gZW5zdXJlIHRoZSBidWlsZGVyIGlzIHJldXNhYmxlCi0gICAgICAgIGJ1aWxkZXIuY2xlYXIoKTsKLSAgICAgICAgdGVzdEZsZXhCdWZmZXJzVGVzdChidWlsZGVyKTsKLSAgICAgICAgaW50IGJ1ZmZlckxpbWl0MiA9ICgoQXJyYXlSZWFkV3JpdGVCdWYpIGJ1aWxkZXIuZ2V0QnVmZmVyKCkpLmxpbWl0KCk7Ci0gICAgICAgIFRlc3RFcShidWZmZXJMaW1pdDEsIGJ1ZmZlckxpbWl0Mik7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHRlc3RGbGV4QnVmZmVyc1Rlc3QoRmxleEJ1ZmZlcnNCdWlsZGVyIGJ1aWxkZXIpIHsKLSAgICAgICAgLy8gV3JpdGUgdGhlIGVxdWl2YWxlbnQgb2Y6Ci0gICAgICAgIC8vIHsgdmVjOiBbIC0xMDAsICJGcmVkIiwgNC4wLCBmYWxzZSBdLCBiYXI6IFsgMSwgMiwgMyBdLCBiYXIzOiBbIDEsIDIsIDMgXSwKLSAgICAgICAgLy8gZm9vOiAxMDAsIGJvb2w6IHRydWUsIG15bWFwOiB7IGZvbzogIkZyZWQiIH0gfQotICAgICAgICAvLyBJdCdzIHBvc3NpYmxlIHRvIGRvIHRoaXMgd2l0aG91dCBzdGQ6OmZ1bmN0aW9uIHN1cHBvcnQgYXMgd2VsbC4KLSAgICAgICAgaW50IG1hcDEgPSBidWlsZGVyLnN0YXJ0TWFwKCk7Ci0KLSAgICAgICAgaW50IHZlYzEgPSBidWlsZGVyLnN0YXJ0VmVjdG9yKCk7Ci0gICAgICAgIGJ1aWxkZXIucHV0SW50KC0xMDApOwotICAgICAgICBidWlsZGVyLnB1dFN0cmluZygiRnJlZCIpOwotICAgICAgICBidWlsZGVyLnB1dEJsb2IobmV3IGJ5dGVbXXsoYnl0ZSkgNzd9KTsKLSAgICAgICAgYnVpbGRlci5wdXRCb29sZWFuKGZhbHNlKTsKLSAgICAgICAgYnVpbGRlci5wdXRJbnQoTG9uZy5NQVhfVkFMVUUpOwotCi0gICAgICAgIGludCBtYXAyID0gYnVpbGRlci5zdGFydE1hcCgpOwotICAgICAgICBidWlsZGVyLnB1dEludCgidGVzdCIsIDIwMCk7Ci0gICAgICAgIGJ1aWxkZXIuZW5kTWFwKG51bGwsIG1hcDIpOwotCi0gICAgICAgIGJ1aWxkZXIucHV0RmxvYXQoMTUwLjkpOwotICAgICAgICBidWlsZGVyLnB1dEZsb2F0KDE1MC45OTk5OTk4KTsKLSAgICAgICAgYnVpbGRlci5lbmRWZWN0b3IoInZlYyIsIHZlYzEsIGZhbHNlLCBmYWxzZSk7Ci0KLSAgICAgICAgdmVjMSA9IGJ1aWxkZXIuc3RhcnRWZWN0b3IoKTsKLSAgICAgICAgYnVpbGRlci5wdXRJbnQoMSk7Ci0gICAgICAgIGJ1aWxkZXIucHV0SW50KDIpOwotICAgICAgICBidWlsZGVyLnB1dEludCgzKTsKLSAgICAgICAgYnVpbGRlci5lbmRWZWN0b3IoImJhciIsIHZlYzEsIHRydWUsIGZhbHNlKTsKLQotICAgICAgICB2ZWMxID0gYnVpbGRlci5zdGFydFZlY3RvcigpOwotICAgICAgICBidWlsZGVyLnB1dEJvb2xlYW4odHJ1ZSk7Ci0gICAgICAgIGJ1aWxkZXIucHV0Qm9vbGVhbihmYWxzZSk7Ci0gICAgICAgIGJ1aWxkZXIucHV0Qm9vbGVhbih0cnVlKTsKLSAgICAgICAgYnVpbGRlci5wdXRCb29sZWFuKGZhbHNlKTsKLSAgICAgICAgYnVpbGRlci5lbmRWZWN0b3IoImJvb2xzIiwgdmVjMSwgdHJ1ZSwgZmFsc2UpOwotCi0gICAgICAgIGJ1aWxkZXIucHV0Qm9vbGVhbigiYm9vbCIsIHRydWUpOwotICAgICAgICBidWlsZGVyLnB1dEZsb2F0KCJmb28iLCAxMDApOwotCi0gICAgICAgIG1hcDIgPSBidWlsZGVyLnN0YXJ0TWFwKCk7Ci0gICAgICAgIGJ1aWxkZXIucHV0U3RyaW5nKCJiYXIiLCAiRnJlZCIpOyAgLy8gVGVzdGluZyBrZXkgYW5kIHN0cmluZyByZXVzZS4KLSAgICAgICAgYnVpbGRlci5wdXRJbnQoImludCIsIC0xMjApOwotICAgICAgICBidWlsZGVyLnB1dEZsb2F0KCJmbG9hdCIsIC0xMjMuMGYpOwotICAgICAgICBidWlsZGVyLnB1dEJsb2IoImJsb2IiLCBuZXcgYnl0ZVtdeyA2NSwgNjcgfSk7Ci0gICAgICAgIGJ1aWxkZXIuZW5kTWFwKCJteW1hcCIsIG1hcDIpOwotCi0gICAgICAgIGJ1aWxkZXIuZW5kTWFwKG51bGwsIG1hcDEpOwotICAgICAgICBidWlsZGVyLmZpbmlzaCgpOwotCi0gICAgICAgIEZsZXhCdWZmZXJzLk1hcCBtID0gRmxleEJ1ZmZlcnMuZ2V0Um9vdChidWlsZGVyLmdldEJ1ZmZlcigpKS5hc01hcCgpOwotCi0gICAgICAgIFRlc3RFcShtLnNpemUoKSwgNik7Ci0KLSAgICAgICAgLy8gdGVzdCBlbXB0eSAoYW4gbnVsbCkKLSAgICAgICAgVGVzdEVxKG0uZ2V0KCJub19rZXkiKS5hc1N0cmluZygpLCAiIik7IC8vIGVtcHR5IGlmIGZhaWwKLSAgICAgICAgVGVzdEVxKG0uZ2V0KCJub19rZXkiKS5hc01hcCgpLCBGbGV4QnVmZmVycy5NYXAuZW1wdHkoKSk7IC8vIGVtcHR5IGlmIGZhaWwKLSAgICAgICAgVGVzdEVxKG0uZ2V0KCJub19rZXkiKS5hc0tleSgpLCBGbGV4QnVmZmVycy5LZXkuZW1wdHkoKSk7IC8vIGVtcHR5IGlmIGZhaWwKLSAgICAgICAgVGVzdEVxKG0uZ2V0KCJub19rZXkiKS5hc1ZlY3RvcigpLCBGbGV4QnVmZmVycy5WZWN0b3IuZW1wdHkoKSk7IC8vIGVtcHR5IGlmIGZhaWwKLSAgICAgICAgVGVzdEVxKG0uZ2V0KCJub19rZXkiKS5hc0Jsb2IoKSwgRmxleEJ1ZmZlcnMuQmxvYi5lbXB0eSgpKTsgLy8gZW1wdHkgaWYgZmFpbAotICAgICAgICBhc3NlcnQobS5nZXQoIm5vX2tleSIpLmFzVmVjdG9yKCkuaXNFbXB0eSgpKTsgLy8gZW1wdHkgaWYgZmFpbAotCi0gICAgICAgIC8vIHRlc3RpbmcgInZlYyIgZmllbGQKLSAgICAgICAgRmxleEJ1ZmZlcnMuVmVjdG9yIHZlYyA9IG0uZ2V0KCJ2ZWMiKS5hc1ZlY3RvcigpOwotICAgICAgICBUZXN0RXEodmVjLnNpemUoKSwgOCk7Ci0gICAgICAgIFRlc3RFcSh2ZWMuZ2V0KDApLmFzTG9uZygpLCAobG9uZykgLTEwMCk7Ci0gICAgICAgIFRlc3RFcSh2ZWMuZ2V0KDEpLmFzU3RyaW5nKCksICJGcmVkIik7Ci0gICAgICAgIFRlc3RFcSh2ZWMuZ2V0KDIpLmlzQmxvYigpLCB0cnVlKTsKLSAgICAgICAgVGVzdEVxKHZlYy5nZXQoMikuYXNCbG9iKCkuc2l6ZSgpLCAxKTsKLSAgICAgICAgVGVzdEVxKHZlYy5nZXQoMikuYXNCbG9iKCkuZGF0YSgpLmdldCgwKSwgKGJ5dGUpIDc3KTsKLSAgICAgICAgVGVzdEVxKHZlYy5nZXQoMykuaXNCb29sZWFuKCksIHRydWUpOyAgIC8vIENoZWNrIGlmIHR5cGUgaXMgYSBib29sCi0gICAgICAgIFRlc3RFcSh2ZWMuZ2V0KDMpLmFzQm9vbGVhbigpLCBmYWxzZSk7ICAvLyBDaGVjayBpZiB2YWx1ZSBpcyBmYWxzZQotICAgICAgICBUZXN0RXEodmVjLmdldCg0KS5hc0xvbmcoKSwgTG9uZy5NQVhfVkFMVUUpOwotICAgICAgICBUZXN0RXEodmVjLmdldCg1KS5pc01hcCgpLCB0cnVlKTsKLSAgICAgICAgVGVzdEVxKHZlYy5nZXQoNSkuYXNNYXAoKS5nZXQoInRlc3QiKS5hc0ludCgpLCAyMDApOwotICAgICAgICBUZXN0RXEoRmxvYXQuY29tcGFyZSgoZmxvYXQpdmVjLmdldCg2KS5hc0Zsb2F0KCksIDE1MC45ZiksIDApOwotICAgICAgICBUZXN0RXEoRG91YmxlLmNvbXBhcmUodmVjLmdldCg3KS5hc0Zsb2F0KCksIDE1MC45OTk5OTk4KSwgMCk7Ci0gICAgICAgIFRlc3RFcSgobG9uZykwLCAobG9uZyl2ZWMuZ2V0KDEpLmFzTG9uZygpKTsgLy9jb252ZXJzaW9uIGZhaWwgcmV0dXJucyAwIGFzIEMrKwotCi0gICAgICAgIC8vIGJhciB2ZWN0b3IKLSAgICAgICAgRmxleEJ1ZmZlcnMuVmVjdG9yIHR2ZWMgPSBtLmdldCgiYmFyIikuYXNWZWN0b3IoKTsKLSAgICAgICAgVGVzdEVxKHR2ZWMuc2l6ZSgpLCAzKTsKLSAgICAgICAgVGVzdEVxKHR2ZWMuZ2V0KDApLmFzSW50KCksIDEpOwotICAgICAgICBUZXN0RXEodHZlYy5nZXQoMSkuYXNJbnQoKSwgMik7Ci0gICAgICAgIFRlc3RFcSh0dmVjLmdldCgyKS5hc0ludCgpLCAzKTsKLSAgICAgICAgVGVzdEVxKCgoRmxleEJ1ZmZlcnMuVHlwZWRWZWN0b3IpIHR2ZWMpLmdldEVsZW1UeXBlKCksIEZsZXhCdWZmZXJzLkZCVF9JTlQpOwotCi0gICAgICAgIC8vIGJvb2xzIHZlY3RvcgotICAgICAgICBGbGV4QnVmZmVycy5WZWN0b3IgYnZlYyA9IG0uZ2V0KCJib29scyIpLmFzVmVjdG9yKCk7Ci0gICAgICAgIFRlc3RFcShidmVjLnNpemUoKSwgNCk7Ci0gICAgICAgIFRlc3RFcShidmVjLmdldCgwKS5hc0Jvb2xlYW4oKSwgdHJ1ZSk7Ci0gICAgICAgIFRlc3RFcShidmVjLmdldCgxKS5hc0Jvb2xlYW4oKSwgZmFsc2UpOwotICAgICAgICBUZXN0RXEoYnZlYy5nZXQoMikuYXNCb29sZWFuKCksIHRydWUpOwotICAgICAgICBUZXN0RXEoYnZlYy5nZXQoMykuYXNCb29sZWFuKCksIGZhbHNlKTsKLSAgICAgICAgVGVzdEVxKCgoRmxleEJ1ZmZlcnMuVHlwZWRWZWN0b3IpIGJ2ZWMpLmdldEVsZW1UeXBlKCksIEZsZXhCdWZmZXJzLkZCVF9CT09MKTsKLQotCi0gICAgICAgIFRlc3RFcSgoZmxvYXQpbS5nZXQoImZvbyIpLmFzRmxvYXQoKSwgKGZsb2F0KSAxMDApOwotICAgICAgICBUZXN0RXEobS5nZXQoInVua25vd24iKS5pc051bGwoKSwgdHJ1ZSk7Ci0KLSAgICAgICAgLy8gbXltYXAgdmVjdG9yCi0gICAgICAgIEZsZXhCdWZmZXJzLk1hcCBteW1hcCA9IG0uZ2V0KCJteW1hcCIpLmFzTWFwKCk7Ci0gICAgICAgIFRlc3RFcShteW1hcC5rZXlzKCkuZ2V0KDApLCBtLmtleXMoKS5nZXQoMCkpOyAvLyBUaGVzZSBzaG91bGQgYmUgZXF1YWwgYnkgcG9pbnRlciBlcXVhbGl0eSwgc2luY2Uga2V5IGFuZCB2YWx1ZSBhcmUgc2hhcmVkLgotICAgICAgICBUZXN0RXEobXltYXAua2V5cygpLmdldCgwKS50b1N0cmluZygpLCAiYmFyIik7Ci0gICAgICAgIFRlc3RFcShteW1hcC52YWx1ZXMoKS5nZXQoMCkuYXNTdHJpbmcoKSwgdmVjLmdldCgxKS5hc1N0cmluZygpKTsKLSAgICAgICAgVGVzdEVxKG15bWFwLmdldCgiaW50IikuYXNJbnQoKSwgLTEyMCk7Ci0gICAgICAgIFRlc3RFcSgoZmxvYXQpbXltYXAuZ2V0KCJmbG9hdCIpLmFzRmxvYXQoKSwgLTEyMy4wZik7Ci0gICAgICAgIFRlc3RFcShBcnJheXMuZXF1YWxzKG15bWFwLmdldCgiYmxvYiIpLmFzQmxvYigpLmdldEJ5dGVzKCksIG5ldyBieXRlW117IDY1LCA2NyB9KSwgdHJ1ZSk7Ci0gICAgICAgIFRlc3RFcShteW1hcC5nZXQoImJsb2IiKS5hc0Jsb2IoKS50b1N0cmluZygpLCAiQUMiKTsKLSAgICAgICAgVGVzdEVxKG15bWFwLmdldCgiYmxvYiIpLnRvU3RyaW5nKCksICJcIkFDXCIiKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgdGVzdEZsZXhCdWZmZXJWZWN0b3JTdHJpbmdzKCkgewotICAgICAgICBGbGV4QnVmZmVyc0J1aWxkZXIgYnVpbGRlciA9IG5ldyBGbGV4QnVmZmVyc0J1aWxkZXIoQnl0ZUJ1ZmZlci5hbGxvY2F0ZSgxMDAwMDAwMCkpOwotCi0gICAgICAgIGludCBzaXplID0gMzAwMDsKLSAgICAgICAgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0gICAgICAgIGZvciAoaW50IGk9MDsgaTwgc2l6ZTsgaSsrKSB7Ci0gICAgICAgICAgICBzYi5hcHBlbmQoImEiKTsKLSAgICAgICAgfQotCi0gICAgICAgIFN0cmluZyB0ZXh0ID0gc2IudG9TdHJpbmcoKTsKLSAgICAgICAgVGVzdEVxKHRleHQubGVuZ3RoKCksIHNpemUpOwotCi0gICAgICAgIGludCBwb3MgPSBidWlsZGVyLnN0YXJ0VmVjdG9yKCk7Ci0KLSAgICAgICAgZm9yIChpbnQgaT0wOyBpPHNpemU7IGkrKykgewotICAgICAgICAgICAgYnVpbGRlci5wdXRTdHJpbmcodGV4dCk7Ci0gICAgICAgIH0KLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgYnVpbGRlci5lbmRWZWN0b3IobnVsbCwgcG9zLCB0cnVlLCBmYWxzZSk7Ci0gICAgICAgICAgICAvLyB0aGlzIHNob3VsZCByYWlzZSBhbiBleGNlcHRpb24gYXMKLSAgICAgICAgICAgIC8vIHR5cGVkIHZlY3RvciBvZiBzdHJpbmcgd2FzIGRlcHJlY2F0ZWQKLSAgICAgICAgICAgIGFzc2VydCBmYWxzZTsKLSAgICAgICAgfSBjYXRjaChGbGV4QnVmZmVyRXhjZXB0aW9uIGZiKSB7Ci0gICAgICAgICAgICAvLyBubyBvcAotICAgICAgICB9Ci0gICAgICAgIC8vIHdlIGZpbmlzaCB0aGUgdmVjdG9yIGFnYWluIGFzIG5vbi10eXBlZAotICAgICAgICBidWlsZGVyLmVuZFZlY3RvcihudWxsLCBwb3MsIGZhbHNlLCBmYWxzZSk7Ci0KLSAgICAgICAgQnl0ZUJ1ZmZlciBiID0gYnVpbGRlci5maW5pc2goKTsKLSAgICAgICAgVmVjdG9yIHYgPSBGbGV4QnVmZmVycy5nZXRSb290KGIpLmFzVmVjdG9yKCk7Ci0KLSAgICAgICAgVGVzdEVxKHYuc2l6ZSgpLCBzaXplKTsKLSAgICAgICAgZm9yIChpbnQgaT0wOyBpPHNpemU7IGkrKykgewotICAgICAgICAgICAgVGVzdEVxKHYuZ2V0KGkpLmFzU3RyaW5nKCkubGVuZ3RoKCksIHNpemUpOwotICAgICAgICAgICAgVGVzdEVxKHYuZ2V0KGkpLmFzU3RyaW5nKCksIHRleHQpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHRlc3REZXByZWNhdGVkVHlwZWRWZWN0b3JTdHJpbmcoKSB7Ci0gICAgICAgIC8vIHRlc3RzIHdoZXRoZXIgd2UgYXJlIGFibGUgdG8gc3VwcG9ydCByZWFkaW5nIGRlcHJlY2F0ZWQgdHlwZWQgdmVjdG9yIHN0cmluZwotICAgICAgICAvLyBkYXRhIGlzIGVxdWl2YWxlbnQgdG8gWyAiYWJjIiwgImFiYyIsICJhYmMiLCAiYWJjIl0KLSAgICAgICAgYnl0ZVtdIGRhdGEgPSBuZXcgYnl0ZVtdIHsweDAzLCAweDYxLCAweDYyLCAweDYzLCAweDAwLCAweDAzLCAweDYxLCAweDYyLCAweDYzLCAweDAwLAotICAgICAgICAgICAgMHgwMywgMHg2MSwgMHg2MiwgMHg2MywgMHgwMCwgMHgwMywgMHg2MSwgMHg2MiwgMHg2MywgMHgwMCwgMHgwNCwgMHgxNCwgMHgxMCwKLSAgICAgICAgICAgICAweDBjLCAweDA4LCAweDA0LCAweDNjLCAweDAxfTsKLSAgICAgICAgUmVmZXJlbmNlIHJlZiA9IEZsZXhCdWZmZXJzLmdldFJvb3QoQnl0ZUJ1ZmZlci53cmFwKGRhdGEpKTsKLSAgICAgICAgVGVzdEVxKHJlZi5nZXRUeXBlKCksIEZsZXhCdWZmZXJzLkZCVF9WRUNUT1JfU1RSSU5HX0RFUFJFQ0FURUQpOwotICAgICAgICBUZXN0RXEocmVmLmlzVHlwZWRWZWN0b3IoKSwgdHJ1ZSk7Ci0gICAgICAgIFZlY3RvciB2ZWMgPSByZWYuYXNWZWN0b3IoKTsKLSAgICAgICAgZm9yIChpbnQgaT0wOyBpPCB2ZWMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgIFRlc3RFcSgiYWJjIiwgdmVjLmdldChpKS5hc1N0cmluZygpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB0ZXN0U2luZ2xlRWxlbWVudEJvb2xlYW4oKSB7Ci0gICAgICAgIEZsZXhCdWZmZXJzQnVpbGRlciBidWlsZGVyID0gbmV3IEZsZXhCdWZmZXJzQnVpbGRlcihCeXRlQnVmZmVyLmFsbG9jYXRlKDEwMCkpOwotICAgICAgICBidWlsZGVyLnB1dEJvb2xlYW4odHJ1ZSk7Ci0gICAgICAgIEJ5dGVCdWZmZXIgYiA9IGJ1aWxkZXIuZmluaXNoKCk7Ci0gICAgICAgIGFzc2VydChGbGV4QnVmZmVycy5nZXRSb290KGIpLmFzQm9vbGVhbigpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgdGVzdFNpbmdsZUVsZW1lbnRCeXRlKCkgewotICAgICAgICBGbGV4QnVmZmVyc0J1aWxkZXIgYnVpbGRlciA9IG5ldyBGbGV4QnVmZmVyc0J1aWxkZXIoKTsKLSAgICAgICAgYnVpbGRlci5wdXRJbnQoMTApOwotICAgICAgICBCeXRlQnVmZmVyIGIgPSBidWlsZGVyLmZpbmlzaCgpOwotICAgICAgICBUZXN0RXEoMTAsIEZsZXhCdWZmZXJzLmdldFJvb3QoYikuYXNJbnQoKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHRlc3RTaW5nbGVFbGVtZW50U2hvcnQoKSB7Ci0gICAgICAgIEZsZXhCdWZmZXJzQnVpbGRlciBidWlsZGVyID0gbmV3IEZsZXhCdWZmZXJzQnVpbGRlcigpOwotICAgICAgICBidWlsZGVyLnB1dEludChTaG9ydC5NQVhfVkFMVUUpOwotICAgICAgICBCeXRlQnVmZmVyIGIgPSBidWlsZGVyLmZpbmlzaCgpOwotICAgICAgICBUZXN0RXEoU2hvcnQuTUFYX1ZBTFVFLCAoc2hvcnQpRmxleEJ1ZmZlcnMuZ2V0Um9vdChiKS5hc0ludCgpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgdGVzdFNpbmdsZUVsZW1lbnRJbnQoKSB7Ci0gICAgICAgIEZsZXhCdWZmZXJzQnVpbGRlciBidWlsZGVyID0gbmV3IEZsZXhCdWZmZXJzQnVpbGRlcigpOwotICAgICAgICBidWlsZGVyLnB1dEludChJbnRlZ2VyLk1JTl9WQUxVRSk7Ci0gICAgICAgIEJ5dGVCdWZmZXIgYiA9IGJ1aWxkZXIuZmluaXNoKCk7Ci0gICAgICAgIFRlc3RFcShJbnRlZ2VyLk1JTl9WQUxVRSwgRmxleEJ1ZmZlcnMuZ2V0Um9vdChiKS5hc0ludCgpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgdGVzdFNpbmdsZUVsZW1lbnRMb25nKCkgewotICAgICAgICBGbGV4QnVmZmVyc0J1aWxkZXIgYnVpbGRlciA9IG5ldyBGbGV4QnVmZmVyc0J1aWxkZXIoKTsKLSAgICAgICAgYnVpbGRlci5wdXRJbnQoTG9uZy5NQVhfVkFMVUUpOwotICAgICAgICBCeXRlQnVmZmVyIGIgPSBidWlsZGVyLmZpbmlzaCgpOwotICAgICAgICBUZXN0RXEoTG9uZy5NQVhfVkFMVUUsIEZsZXhCdWZmZXJzLmdldFJvb3QoYikuYXNMb25nKCkpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB0ZXN0U2luZ2xlRWxlbWVudEZsb2F0KCkgewotICAgICAgICBGbGV4QnVmZmVyc0J1aWxkZXIgYnVpbGRlciA9IG5ldyBGbGV4QnVmZmVyc0J1aWxkZXIoKTsKLSAgICAgICAgYnVpbGRlci5wdXRGbG9hdChGbG9hdC5NQVhfVkFMVUUpOwotICAgICAgICBCeXRlQnVmZmVyIGIgPSBidWlsZGVyLmZpbmlzaCgpOwotICAgICAgICBUZXN0RXEoRmxvYXQuY29tcGFyZShGbG9hdC5NQVhfVkFMVUUsIChmbG9hdCkgRmxleEJ1ZmZlcnMuZ2V0Um9vdChiKS5hc0Zsb2F0KCkpLCAwKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgdGVzdFNpbmdsZUVsZW1lbnREb3VibGUoKSB7Ci0gICAgICAgIEZsZXhCdWZmZXJzQnVpbGRlciBidWlsZGVyID0gbmV3IEZsZXhCdWZmZXJzQnVpbGRlcigpOwotICAgICAgICBidWlsZGVyLnB1dEZsb2F0KERvdWJsZS5NQVhfVkFMVUUpOwotICAgICAgICBCeXRlQnVmZmVyIGIgPSBidWlsZGVyLmZpbmlzaCgpOwotICAgICAgICBUZXN0RXEoRG91YmxlLmNvbXBhcmUoRG91YmxlLk1BWF9WQUxVRSwgRmxleEJ1ZmZlcnMuZ2V0Um9vdChiKS5hc0Zsb2F0KCkpLCAwKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgdGVzdFNpbmdsZUVsZW1lbnRCaWdTdHJpbmcoKSB7Ci0gICAgICAgIEZsZXhCdWZmZXJzQnVpbGRlciBidWlsZGVyID0gbmV3IEZsZXhCdWZmZXJzQnVpbGRlcihCeXRlQnVmZmVyLmFsbG9jYXRlKDEwMDAwKSk7Ci0gICAgICAgIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotCi0gICAgICAgIGZvciAoaW50IGk9MDsgaTwgMzAwMDsgaSsrKSB7Ci0gICAgICAgICAgICBzYi5hcHBlbmQoImEiKTsKLSAgICAgICAgfQotCi0gICAgICAgIGJ1aWxkZXIucHV0U3RyaW5nKHNiLnRvU3RyaW5nKCkpOwotICAgICAgICBCeXRlQnVmZmVyIGIgPSBidWlsZGVyLmZpbmlzaCgpOwotCi0gICAgICAgIEZsZXhCdWZmZXJzLlJlZmVyZW5jZSByID0gRmxleEJ1ZmZlcnMuZ2V0Um9vdChiKTsKLQotICAgICAgICBUZXN0RXEoRmxleEJ1ZmZlcnMuRkJUX1NUUklORywgci5nZXRUeXBlKCkpOwotICAgICAgICBUZXN0RXEoc2IudG9TdHJpbmcoKSwgci5hc1N0cmluZygpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgdGVzdFNpbmdsZUVsZW1lbnRTbWFsbFN0cmluZygpIHsKLSAgICAgICAgRmxleEJ1ZmZlcnNCdWlsZGVyIGJ1aWxkZXIgPSBuZXcgRmxleEJ1ZmZlcnNCdWlsZGVyKEJ5dGVCdWZmZXIuYWxsb2NhdGUoMTAwMDApKTsKLQotICAgICAgICBidWlsZGVyLnB1dFN0cmluZygiYWEiKTsKLSAgICAgICAgQnl0ZUJ1ZmZlciBiID0gYnVpbGRlci5maW5pc2goKTsKLSAgICAgICAgRmxleEJ1ZmZlcnMuUmVmZXJlbmNlIHIgPSBGbGV4QnVmZmVycy5nZXRSb290KGIpOwotCi0gICAgICAgIFRlc3RFcShGbGV4QnVmZmVycy5GQlRfU1RSSU5HLCByLmdldFR5cGUoKSk7Ci0gICAgICAgIFRlc3RFcSgiYWEiLCByLmFzU3RyaW5nKCkpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB0ZXN0U2luZ2xlRWxlbWVudEJsb2IoKSB7Ci0gICAgICAgIEZsZXhCdWZmZXJzQnVpbGRlciBidWlsZGVyID0gbmV3IEZsZXhCdWZmZXJzQnVpbGRlcigpOwotICAgICAgICBidWlsZGVyLnB1dEJsb2IobmV3IGJ5dGVbXXs1LCAxMjQsIDExOCwgLTF9KTsKLSAgICAgICAgQnl0ZUJ1ZmZlciBiID0gYnVpbGRlci5maW5pc2goKTsKLSAgICAgICAgRmxleEJ1ZmZlcnMuUmVmZXJlbmNlIHIgPSBGbGV4QnVmZmVycy5nZXRSb290KGIpOwotICAgICAgICBieXRlW10gcmVzdWx0ID0gci5hc0Jsb2IoKS5nZXRCeXRlcygpOwotICAgICAgICBUZXN0RXEoKGJ5dGUpNSwgcmVzdWx0WzBdKTsKLSAgICAgICAgVGVzdEVxKChieXRlKTEyNCwgcmVzdWx0WzFdKTsKLSAgICAgICAgVGVzdEVxKChieXRlKTExOCwgcmVzdWx0WzJdKTsKLSAgICAgICAgVGVzdEVxKChieXRlKS0xLCByZXN1bHRbM10pOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB0ZXN0U2luZ2xlRWxlbWVudExvbmdCbG9iKCkgewotCi0gICAgICAgIC8vIHZlcmlmaWVzIGJsb2JzIG9mIHVwIHRvIDJeMTYgaW4gbGVuZ3RoCi0gICAgICAgIGZvciAoaW50IGkgPSAyOyBpIDw9IDE8PDE2OyBpID0gaTw8MSkgewotICAgICAgICAgICAgYnl0ZVtdIGlucHV0ID0gbmV3IGJ5dGVbaS0xXTsKLSAgICAgICAgICAgIGZvciAoaW50IGluZGV4ID0gMDsgaW5kZXggPCBpbnB1dC5sZW5ndGg7IGluZGV4KyspIHsKLSAgICAgICAgICAgICAgICBpbnB1dFtpbmRleF0gPSAoYnl0ZSkoaW5kZXggJSA2NCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIEZsZXhCdWZmZXJzQnVpbGRlciBidWlsZGVyID0gbmV3IEZsZXhCdWZmZXJzQnVpbGRlcigpOwotICAgICAgICAgICAgYnVpbGRlci5wdXRCbG9iKGlucHV0KTsKLSAgICAgICAgICAgIEJ5dGVCdWZmZXIgYiA9IGJ1aWxkZXIuZmluaXNoKCk7Ci0gICAgICAgICAgICBGbGV4QnVmZmVycy5SZWZlcmVuY2UgciA9IEZsZXhCdWZmZXJzLmdldFJvb3QoYik7Ci0gICAgICAgICAgICBieXRlW10gcmVzdWx0ID0gci5hc0Jsb2IoKS5nZXRCeXRlcygpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBmb3IgKGludCBpbmRleCA9IDA7IGluZGV4IDwgaW5wdXQubGVuZ3RoOyBpbmRleCsrKSB7Ci0gICAgICAgICAgICAgICAgVGVzdEVxKChieXRlKShpbmRleCAlIDY0KSwgcmVzdWx0W2luZGV4XSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgdGVzdFNpbmdsZUVsZW1lbnRVQnl0ZSgpIHsKLSAgICAgICAgRmxleEJ1ZmZlcnNCdWlsZGVyIGJ1aWxkZXIgPSBuZXcgRmxleEJ1ZmZlcnNCdWlsZGVyKCk7Ci0gICAgICAgIGJ1aWxkZXIucHV0VUludCgweEZGKTsKLSAgICAgICAgQnl0ZUJ1ZmZlciBiID0gYnVpbGRlci5maW5pc2goKTsKLSAgICAgICAgRmxleEJ1ZmZlcnMuUmVmZXJlbmNlIHIgPSBGbGV4QnVmZmVycy5nZXRSb290KGIpOwotICAgICAgICBUZXN0RXEoMjU1LCAoaW50KXIuYXNVSW50KCkpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB0ZXN0U2luZ2xlRWxlbWVudFVTaG9ydCgpIHsKLSAgICAgICAgRmxleEJ1ZmZlcnNCdWlsZGVyIGJ1aWxkZXIgPSBuZXcgRmxleEJ1ZmZlcnNCdWlsZGVyKCk7Ci0gICAgICAgIGJ1aWxkZXIucHV0VUludCgweEZGRkYpOwotICAgICAgICBCeXRlQnVmZmVyIGIgPSBidWlsZGVyLmZpbmlzaCgpOwotICAgICAgICBGbGV4QnVmZmVycy5SZWZlcmVuY2UgciA9IEZsZXhCdWZmZXJzLmdldFJvb3QoYik7Ci0gICAgICAgIFRlc3RFcSg2NTUzNSwgKGludClyLmFzVUludCgpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgdGVzdFNpbmdsZUVsZW1lbnRVSW50KCkgewotICAgICAgICBGbGV4QnVmZmVyc0J1aWxkZXIgYnVpbGRlciA9IG5ldyBGbGV4QnVmZmVyc0J1aWxkZXIoKTsKLSAgICAgICAgYnVpbGRlci5wdXRVSW50KDB4RkZGRl9GRkZGTCk7Ci0gICAgICAgIEJ5dGVCdWZmZXIgYiA9IGJ1aWxkZXIuZmluaXNoKCk7Ci0gICAgICAgIEZsZXhCdWZmZXJzLlJlZmVyZW5jZSByID0gRmxleEJ1ZmZlcnMuZ2V0Um9vdChiKTsKLSAgICAgICAgVGVzdEVxKDQyOTQ5NjcyOTVMLCByLmFzVUludCgpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgdGVzdFNpbmdsZUZpeGVkVHlwZVZlY3RvcigpIHsKLQotICAgICAgICBpbnRbXSBpbnRzID0gbmV3IGludFtdezUsIDEyNCwgMTE4LCAtMX07Ci0gICAgICAgIGZsb2F0W10gZmxvYXRzID0gbmV3IGZsb2F0W117NS41ZiwgMTI0LjEyNGYsIDExOC4xMThmLCAtMS4xZn07Ci0gICAgICAgIFN0cmluZ1tdIHN0cmluZ3MgPSBuZXcgU3RyaW5nW117IlRoaXMiLCAiaXMiLCAiYSIsICJ0eXBlZCIsICJhcnJheSJ9OwotICAgICAgICBib29sZWFuW10gYm9vbGVhbnMgPSBuZXcgYm9vbGVhbltde2ZhbHNlLCB0cnVlLCB0cnVlLCBmYWxzZX07Ci0KLQotICAgICAgICBGbGV4QnVmZmVyc0J1aWxkZXIgYnVpbGRlciA9IG5ldyBGbGV4QnVmZmVyc0J1aWxkZXIoQnl0ZUJ1ZmZlci5hbGxvY2F0ZSg1MTIpLAotICAgICAgICAgICAgICAgIEZsZXhCdWZmZXJzQnVpbGRlci5CVUlMREVSX0ZMQUdfTk9ORSk7Ci0KLSAgICAgICAgaW50IG1hcFBvcyA9IGJ1aWxkZXIuc3RhcnRNYXAoKTsKLQotICAgICAgICBpbnQgdmVjUG9zID0gYnVpbGRlci5zdGFydFZlY3RvcigpOwotICAgICAgICBmb3IgKGZpbmFsIGludCBpIDogaW50cykgewotICAgICAgICAgICAgYnVpbGRlci5wdXRJbnQoaSk7Ci0gICAgICAgIH0KLSAgICAgICAgYnVpbGRlci5lbmRWZWN0b3IoImludHMiLCB2ZWNQb3MsIHRydWUsIGZhbHNlKTsKLQotICAgICAgICB2ZWNQb3MgPSBidWlsZGVyLnN0YXJ0VmVjdG9yKCk7Ci0gICAgICAgIGZvciAoZmluYWwgZmxvYXQgaSA6IGZsb2F0cykgewotICAgICAgICAgICAgYnVpbGRlci5wdXRGbG9hdChpKTsKLSAgICAgICAgfQotICAgICAgICBidWlsZGVyLmVuZFZlY3RvcigiZmxvYXRzIiwgdmVjUG9zLCB0cnVlLCBmYWxzZSk7Ci0KLSAgICAgICAgdmVjUG9zID0gYnVpbGRlci5zdGFydFZlY3RvcigpOwotICAgICAgICBmb3IgKGZpbmFsIGJvb2xlYW4gaSA6IGJvb2xlYW5zKSB7Ci0gICAgICAgICAgICBidWlsZGVyLnB1dEJvb2xlYW4oaSk7Ci0gICAgICAgIH0KLSAgICAgICAgYnVpbGRlci5lbmRWZWN0b3IoImJvb2xlYW5zIiwgdmVjUG9zLCB0cnVlLCBmYWxzZSk7Ci0KLSAgICAgICAgYnVpbGRlci5lbmRNYXAobnVsbCwgbWFwUG9zKTsKLQotCi0gICAgICAgIEJ5dGVCdWZmZXIgYiA9IGJ1aWxkZXIuZmluaXNoKCk7Ci0gICAgICAgIEZsZXhCdWZmZXJzLlJlZmVyZW5jZSByID0gRmxleEJ1ZmZlcnMuZ2V0Um9vdChiKTsKLSAgICAgICAgYXNzZXJ0KHIuYXNNYXAoKS5nZXQoImludHMiKS5pc1R5cGVkVmVjdG9yKCkpOwotICAgICAgICBhc3NlcnQoci5hc01hcCgpLmdldCgiZmxvYXRzIikuaXNUeXBlZFZlY3RvcigpKTsKLSAgICAgICAgYXNzZXJ0KHIuYXNNYXAoKS5nZXQoImJvb2xlYW5zIikuaXNUeXBlZFZlY3RvcigpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgdGVzdFNpbmdsZUVsZW1lbnRWZWN0b3IoKSB7Ci0gICAgICAgIEZsZXhCdWZmZXJzQnVpbGRlciBiID0gbmV3IEZsZXhCdWZmZXJzQnVpbGRlcigpOwotCi0gICAgICAgIGludCB2ZWNQb3MgPSBiLnN0YXJ0VmVjdG9yKCk7Ci0gICAgICAgIGIucHV0SW50KDk5KTsKLSAgICAgICAgYi5wdXRTdHJpbmcoIndvdyIpOwotICAgICAgICBpbnQgdmVjcG9zMiA9IGIuc3RhcnRWZWN0b3IoKTsKLSAgICAgICAgYi5wdXRJbnQoOTkpOwotICAgICAgICBiLnB1dFN0cmluZygid293Iik7Ci0gICAgICAgIGIuZW5kVmVjdG9yKG51bGwsIHZlY3BvczIsIGZhbHNlLCBmYWxzZSk7Ci0gICAgICAgIGIuZW5kVmVjdG9yKG51bGwsIHZlY1BvcywgZmFsc2UsIGZhbHNlKTsKLSAgICAgICAgYi5maW5pc2goKTsKLQotICAgICAgICBGbGV4QnVmZmVycy5SZWZlcmVuY2UgciA9IEZsZXhCdWZmZXJzLmdldFJvb3QoYi5nZXRCdWZmZXIoKSk7Ci0gICAgICAgIFRlc3RFcShGbGV4QnVmZmVycy5GQlRfVkVDVE9SLCByLmdldFR5cGUoKSk7Ci0gICAgICAgIEZsZXhCdWZmZXJzLlZlY3RvciB2ZWMgPSBGbGV4QnVmZmVycy5nZXRSb290KGIuZ2V0QnVmZmVyKCkpLmFzVmVjdG9yKCk7Ci0gICAgICAgIFRlc3RFcSgzLCB2ZWMuc2l6ZSgpKTsKLSAgICAgICAgVGVzdEVxKDk5LCB2ZWMuZ2V0KDApLmFzSW50KCkpOwotICAgICAgICBUZXN0RXEoIndvdyIsIHZlYy5nZXQoMSkuYXNTdHJpbmcoKSk7Ci0gICAgICAgIFRlc3RFcSgiWyA5OSwgXCJ3b3dcIiBdIiwgdmVjLmdldCgyKS50b1N0cmluZygpKTsKLSAgICAgICAgVGVzdEVxKCJbIDk5LCBcIndvd1wiLCBbIDk5LCBcIndvd1wiIF0gXSIsIEZsZXhCdWZmZXJzLmdldFJvb3QoYi5nZXRCdWZmZXIoKSkudG9TdHJpbmcoKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHRlc3RTaW5nbGVFbGVtZW50TWFwKCkgewotICAgICAgICBGbGV4QnVmZmVyc0J1aWxkZXIgYiA9IG5ldyBGbGV4QnVmZmVyc0J1aWxkZXIoKTsKLQotICAgICAgICBpbnQgbWFwUG9zdCA9IGIuc3RhcnRNYXAoKTsKLSAgICAgICAgYi5wdXRJbnQoIm15SW50IiwgMHg3ZmZmZmZiYmJmZmZmZmZmTCk7Ci0gICAgICAgIGIucHV0U3RyaW5nKCJteVN0cmluZyIsICJ3b3ciKTsKLSAgICAgICAgYi5wdXRTdHJpbmcoIm15U3RyaW5nMiIsICJpbmNyZWRpYmxlIik7Ci0gICAgICAgIGludCBzdGFydCA9IGIuc3RhcnRWZWN0b3IoKTsKLSAgICAgICAgYi5wdXRJbnQoOTkpOwotICAgICAgICBiLnB1dFN0cmluZygid293Iik7Ci0gICAgICAgIGIuZW5kVmVjdG9yKCJteVZlYyIsIHN0YXJ0LCBmYWxzZSwgZmFsc2UpOwotCi0gICAgICAgIGIucHV0RmxvYXQoImRvdWJsZSIsIDB4MS5mZmZmYmJiZmZmZmZmUCsxMDIzKTsKLSAgICAgICAgYi5lbmRNYXAobnVsbCwgbWFwUG9zdCk7Ci0gICAgICAgIGIuZmluaXNoKCk7Ci0KLSAgICAgICAgRmxleEJ1ZmZlcnMuUmVmZXJlbmNlIHIgPSBGbGV4QnVmZmVycy5nZXRSb290KGIuZ2V0QnVmZmVyKCkpOwotICAgICAgICBUZXN0RXEoRmxleEJ1ZmZlcnMuRkJUX01BUCwgci5nZXRUeXBlKCkpOwotICAgICAgICBGbGV4QnVmZmVycy5NYXAgbWFwID0gRmxleEJ1ZmZlcnMuZ2V0Um9vdChiLmdldEJ1ZmZlcigpKS5hc01hcCgpOwotICAgICAgICBUZXN0RXEoNSwgbWFwLnNpemUoKSk7Ci0gICAgICAgIFRlc3RFcSgweDdmZmZmZmJiYmZmZmZmZmZMLCBtYXAuZ2V0KCJteUludCIpLmFzTG9uZygpKTsKLSAgICAgICAgVGVzdEVxKCJ3b3ciLCBtYXAuZ2V0KCJteVN0cmluZyIpLmFzU3RyaW5nKCkpOwotICAgICAgICBUZXN0RXEoImluY3JlZGlibGUiLCBtYXAuZ2V0KCJteVN0cmluZzIiKS5hc1N0cmluZygpKTsKLSAgICAgICAgVGVzdEVxKDk5LCBtYXAuZ2V0KCJteVZlYyIpLmFzVmVjdG9yKCkuZ2V0KDApLmFzSW50KCkpOwotICAgICAgICBUZXN0RXEoIndvdyIsIG1hcC5nZXQoIm15VmVjIikuYXNWZWN0b3IoKS5nZXQoMSkuYXNTdHJpbmcoKSk7Ci0gICAgICAgIFRlc3RFcShEb3VibGUuY29tcGFyZSgweDEuZmZmZmJiYmZmZmZmZlArMTAyMywgbWFwLmdldCgiZG91YmxlIikuYXNGbG9hdCgpKSwgMCk7Ci0gICAgICAgIFRlc3RFcSgieyBcImRvdWJsZVwiIDogMS43OTc2ODk0NzgzMzkxOTM3RTMwOCwgXCJteUludFwiIDogOTIyMzM3MTc0MzcyMzI1Nzg1NSwgXCJteVN0cmluZ1wiIDogXCJ3b3dcIiwgXCJteVN0cmluZzJcIiA6IFwiaW5jcmVkaWJsZVwiLCBcIm15VmVjXCIgOiBbIDk5LCBcIndvd1wiIF0gfSIsCi0gICAgICAgICAgICAgICAgRmxleEJ1ZmZlcnMuZ2V0Um9vdChiLmdldEJ1ZmZlcigpKS50b1N0cmluZygpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgdGVzdEZsZXhCdWZlckVtcHR5KCkgewotICAgICAgICBGbGV4QnVmZmVycy5CbG9iIGJsb2IgPSBGbGV4QnVmZmVycy5CbG9iLmVtcHR5KCk7Ci0gICAgICAgIEZsZXhCdWZmZXJzLk1hcCBhcnkgPSBGbGV4QnVmZmVycy5NYXAuZW1wdHkoKTsKLSAgICAgICAgRmxleEJ1ZmZlcnMuVmVjdG9yIG1hcCA9IEZsZXhCdWZmZXJzLlZlY3Rvci5lbXB0eSgpOwotICAgICAgICBGbGV4QnVmZmVycy5UeXBlZFZlY3RvciB0eXBlZEFyeSA9IEZsZXhCdWZmZXJzLlR5cGVkVmVjdG9yLmVtcHR5KCk7Ci0gICAgICAgIFRlc3RFcShibG9iLnNpemUoKSwgMCk7Ci0gICAgICAgIFRlc3RFcShtYXAuc2l6ZSgpLCAwKTsKLSAgICAgICAgVGVzdEVxKGFyeS5zaXplKCksIDApOwotICAgICAgICBUZXN0RXEodHlwZWRBcnkuc2l6ZSgpLCAwKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgdGVzdEhhc2hNYXBUb01hcCgpIHsKLSAgICAgICAgaW50IGVudHJpZXNDb3VudCA9IDEyOwotCi0gICAgICAgIEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+IHNvdXJjZSA9ICBuZXcgSGFzaE1hcDw+KCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZW50cmllc0NvdW50OyBpKyspIHsKLSAgICAgICAgICAgIHNvdXJjZS5wdXQoImZvb19wYXJhbV8iICsgaSwgImZvb192YWx1ZV8iICsgaSk7Ci0gICAgICAgIH0KLQotICAgICAgICBGbGV4QnVmZmVyc0J1aWxkZXIgYnVpbGRlciA9IG5ldyBGbGV4QnVmZmVyc0J1aWxkZXIoMTAwMCk7Ci0gICAgICAgIGludCBtYXBTdGFydCA9IGJ1aWxkZXIuc3RhcnRNYXAoKTsKLSAgICAgICAgZm9yIChNYXAuRW50cnk8U3RyaW5nLCBTdHJpbmc+IGVudHJ5IDogc291cmNlLmVudHJ5U2V0KCkpIHsKLSAgICAgICAgICAgIGJ1aWxkZXIucHV0U3RyaW5nKGVudHJ5LmdldEtleSgpLCBlbnRyeS5nZXRWYWx1ZSgpKTsKLSAgICAgICAgfQotICAgICAgICBidWlsZGVyLmVuZE1hcChudWxsLCBtYXBTdGFydCk7Ci0gICAgICAgIEJ5dGVCdWZmZXIgYmIgPSBidWlsZGVyLmZpbmlzaCgpOwotICAgICAgICBiYi5yZXdpbmQoKTsKLQotICAgICAgICBGbGV4QnVmZmVycy5SZWZlcmVuY2Ugcm9vdFJlZmVyZW5jZSA9IEZsZXhCdWZmZXJzLmdldFJvb3QoYmIpOwotCi0gICAgICAgIFRlc3RFcShyb290UmVmZXJlbmNlLmlzTWFwKCksIHRydWUpOwotCi0gICAgICAgIEZsZXhCdWZmZXJzLk1hcCBmbGV4TWFwID0gcm9vdFJlZmVyZW5jZS5hc01hcCgpOwotCi0gICAgICAgIEZsZXhCdWZmZXJzLktleVZlY3RvciBrZXlzID0gZmxleE1hcC5rZXlzKCk7Ci0gICAgICAgIEZsZXhCdWZmZXJzLlZlY3RvciB2YWx1ZXMgPSBmbGV4TWFwLnZhbHVlcygpOwotCi0gICAgICAgIFRlc3RFcShlbnRyaWVzQ291bnQsIGtleXMuc2l6ZSgpKTsKLSAgICAgICAgVGVzdEVxKGVudHJpZXNDb3VudCwgdmFsdWVzLnNpemUoKSk7Ci0KLSAgICAgICAgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4gcmVzdWx0ID0gIG5ldyBIYXNoTWFwPD4oKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBrZXlzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICByZXN1bHQucHV0KGtleXMuZ2V0KGkpLnRvU3RyaW5nKCksIHZhbHVlcy5nZXQoaSkuYXNTdHJpbmcoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBUZXN0RXEoc291cmNlLCByZXN1bHQpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB0ZXN0QnVpbGRlckdyb3d0aCgpIHsKLSAgICAgICAgRmxleEJ1ZmZlcnNCdWlsZGVyIGJ1aWxkZXIgPSBuZXcgRmxleEJ1ZmZlcnNCdWlsZGVyKCk7Ci0gICAgICAgIFN0cmluZyBzb21lU3RyaW5nID0gIlRoaXMgaXMgYSBzbWFsbCBzdHJpbmciOwotICAgICAgICBidWlsZGVyLnB1dFN0cmluZyhzb21lU3RyaW5nKTsKLSAgICAgICAgQnl0ZUJ1ZmZlciBiID0gYnVpbGRlci5maW5pc2goKTsKLSAgICAgICAgVGVzdEVxKHNvbWVTdHJpbmcsIEZsZXhCdWZmZXJzLmdldFJvb3QoYikuYXNTdHJpbmcoKSk7Ci0KLSAgICAgICAgRmxleEJ1ZmZlcnNCdWlsZGVyIGZhaWxCdWlsZGVyID0gbmV3IEZsZXhCdWZmZXJzQnVpbGRlcihCeXRlQnVmZmVyLmFsbG9jYXRlKDEpKTsKLSAgICAgICAgZmFpbEJ1aWxkZXIucHV0U3RyaW5nKHNvbWVTdHJpbmcpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB0ZXN0RmxleEJ1ZmZlcnNVdGY4TWFwKCkgewotICAgICAgICBGbGV4QnVmZmVyc0J1aWxkZXIgYnVpbGRlciA9IG5ldyBGbGV4QnVmZmVyc0J1aWxkZXIoQnl0ZUJ1ZmZlci5hbGxvY2F0ZSg1MTIpLAotICAgICAgICAgICAgICAgIEZsZXhCdWZmZXJzQnVpbGRlci5CVUlMREVSX0ZMQUdfU0hBUkVfS0VZU19BTkRfU1RSSU5HUyk7Ci0KLSAgICAgICAgU3RyaW5nIGtleTAgPSAi8J+YqCBmYWNlMSI7Ci0gICAgICAgIFN0cmluZyBrZXkxID0gIvCfmKkgZmFjZTIiOwotICAgICAgICBTdHJpbmcga2V5MiA9ICLwn5ioIGZhY2UzIjsKLSAgICAgICAgU3RyaW5nIGtleTMgPSAidHJhZGVtYXJrIMKuIjsKLSAgICAgICAgU3RyaW5nIGtleTQgPSAi4oKsIGV1cm8iOwotICAgICAgICBTdHJpbmcgdXRmOGtleXNbXSA9IHsgIvCfmKggZmFjZTEiLCAi8J+YqSBmYWNlMiIsICLwn5ioIGZhY2UzIiwgInRyYWRlbWFyayDCriIsICLigqwgZXVybyJ9OwotCi0gICAgICAgIGludCBtYXAgPSBidWlsZGVyLnN0YXJ0TWFwKCk7Ci0KLSAgICAgICAgZm9yIChpbnQgaT0wOyBpPCB1dGY4a2V5cy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgYnVpbGRlci5wdXRTdHJpbmcodXRmOGtleXNbaV0sIHV0ZjhrZXlzW2ldKTsgIC8vIFRlc3Rpbmcga2V5IGFuZCBzdHJpbmcgcmV1c2UuCi0gICAgICAgIH0KLSAgICAgICAgYnVpbGRlci5lbmRNYXAobnVsbCwgbWFwKTsKLSAgICAgICAgYnVpbGRlci5maW5pc2goKTsKLQotICAgICAgICBGbGV4QnVmZmVycy5NYXAgbSA9IEZsZXhCdWZmZXJzLmdldFJvb3QoYnVpbGRlci5nZXRCdWZmZXIoKSkuYXNNYXAoKTsKLQotICAgICAgICBUZXN0RXEobS5zaXplKCksIDUpOwotCi0gICAgICAgIEtleVZlY3RvciBrdiA9IG0ua2V5cygpOwotICAgICAgICBmb3IgKGludCBpPTA7IGk8IHV0ZjhrZXlzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBUZXN0RXEoa3YuZ2V0KGkpLnRvU3RyaW5nKCksIG0uZ2V0KGkpLmFzU3RyaW5nKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgVGVzdEVxKG0uZ2V0KGtleTApLmFzU3RyaW5nKCksIHV0ZjhrZXlzWzBdKTsKLSAgICAgICAgVGVzdEVxKG0uZ2V0KGtleTEpLmFzU3RyaW5nKCksIHV0ZjhrZXlzWzFdKTsKLSAgICAgICAgVGVzdEVxKG0uZ2V0KGtleTIpLmFzU3RyaW5nKCksIHV0ZjhrZXlzWzJdKTsKLSAgICAgICAgVGVzdEVxKG0uZ2V0KGtleTMpLmFzU3RyaW5nKCksIHV0ZjhrZXlzWzNdKTsKLSAgICAgICAgVGVzdEVxKG0uZ2V0KGtleTQpLmFzU3RyaW5nKCksIHV0ZjhrZXlzWzRdKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgdGVzdEZsZXhCdWZmZXJzTWFwTG9va3VwKCkgewotICAgICAgICBGbGV4QnVmZmVyc0J1aWxkZXIgYnVpbGRlciA9IG5ldyBGbGV4QnVmZmVyc0J1aWxkZXIoQnl0ZUJ1ZmZlci5hbGxvY2F0ZSg1MTIpLAotICAgICAgICAgICAgICAgIEZsZXhCdWZmZXJzQnVpbGRlci5CVUlMREVSX0ZMQUdfU0hBUkVfS0VZU19BTkRfU1RSSU5HUyk7Ci0KLSAgICAgICAgU3RyaW5nIGtleTAgPSAiMTIzIjsKLSAgICAgICAgU3RyaW5nIGtleTEgPSAiMTIzNCI7Ci0gICAgICAgIFN0cmluZyBrZXkyID0gIjEyMzQ1IjsKLSAgICAgICAgU3RyaW5nW10ga2V5cyA9IG5ldyBTdHJpbmdbXXtrZXkwLCBrZXkxLCBrZXkyfTsKLQotICAgICAgICBpbnQgbWFwID0gYnVpbGRlci5zdGFydE1hcCgpOwotCi0gICAgICAgIGZvciAoaW50IGk9MDsgaTwga2V5cy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgYnVpbGRlci5wdXRTdHJpbmcoa2V5c1tpXSwga2V5c1tpXSk7ICAvLyBUZXN0aW5nIGtleSBhbmQgc3RyaW5nIHJldXNlLgotICAgICAgICB9Ci0gICAgICAgIGJ1aWxkZXIuZW5kTWFwKG51bGwsIG1hcCk7Ci0gICAgICAgIGJ1aWxkZXIuZmluaXNoKCk7Ci0KLSAgICAgICAgRmxleEJ1ZmZlcnMuTWFwIG0gPSBGbGV4QnVmZmVycy5nZXRSb290KGJ1aWxkZXIuZ2V0QnVmZmVyKCkpLmFzTWFwKCk7Ci0gICAgICAgIGZvciAoaW50IGk9MDsgaTwga2V5cy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgVGVzdEVxKG0uZ2V0KGtleXNbaV0pLmFzU3RyaW5nKCksIGtleXNbaV0pOwotICAgICAgICAgICAgVGVzdEVxKG0uZ2V0KGtleXNbaV0uZ2V0Qnl0ZXMoU3RhbmRhcmRDaGFyc2V0cy5VVEZfOCkpLmFzU3RyaW5nKCksIGtleXNbaV0pOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIFRlc3RGbGV4QnVmZmVycygpIHsKLSAgICAgICAgdGVzdFNpbmdsZUVsZW1lbnRCeXRlKCk7Ci0gICAgICAgIHRlc3RTaW5nbGVFbGVtZW50U2hvcnQoKTsKLSAgICAgICAgdGVzdFNpbmdsZUVsZW1lbnRJbnQoKTsKLSAgICAgICAgdGVzdFNpbmdsZUVsZW1lbnRMb25nKCk7Ci0gICAgICAgIHRlc3RTaW5nbGVFbGVtZW50RmxvYXQoKTsKLSAgICAgICAgdGVzdFNpbmdsZUVsZW1lbnREb3VibGUoKTsKLSAgICAgICAgdGVzdFNpbmdsZUVsZW1lbnRTbWFsbFN0cmluZygpOwotICAgICAgICB0ZXN0U2luZ2xlRWxlbWVudEJpZ1N0cmluZygpOwotICAgICAgICB0ZXN0U2luZ2xlRWxlbWVudEJsb2IoKTsKLSAgICAgICAgdGVzdFNpbmdsZUVsZW1lbnRMb25nQmxvYigpOwotICAgICAgICB0ZXN0U2luZ2xlRWxlbWVudFZlY3RvcigpOwotICAgICAgICB0ZXN0U2luZ2xlRml4ZWRUeXBlVmVjdG9yKCk7Ci0gICAgICAgIHRlc3RTaW5nbGVFbGVtZW50VVNob3J0KCk7Ci0gICAgICAgIHRlc3RTaW5nbGVFbGVtZW50VUludCgpOwotICAgICAgICB0ZXN0U2luZ2xlRWxlbWVudFVCeXRlKCk7Ci0gICAgICAgIHRlc3RTaW5nbGVFbGVtZW50TWFwKCk7Ci0gICAgICAgIHRlc3RGbGV4QnVmZmVyc1Rlc3QoKTsKLSAgICAgICAgdGVzdEhhc2hNYXBUb01hcCgpOwotICAgICAgICB0ZXN0RmxleEJ1ZmVyRW1wdHkoKTsKLSAgICAgICAgdGVzdEZsZXhCdWZmZXJWZWN0b3JTdHJpbmdzKCk7Ci0gICAgICAgIHRlc3REZXByZWNhdGVkVHlwZWRWZWN0b3JTdHJpbmcoKTsKLSAgICAgICAgdGVzdEJ1aWxkZXJHcm93dGgoKTsKLSAgICAgICAgdGVzdEZsZXhCdWZmZXJzVXRmOE1hcCgpOwotICAgICAgICB0ZXN0RmxleEJ1ZmZlcnNNYXBMb29rdXAoKTsKLSAgICB9Ci0KLSAgICBzdGF0aWMgdm9pZCBUZXN0VmVjdG9yT2ZCeXRlcygpIHsKLSAgICAgICAgRmxhdEJ1ZmZlckJ1aWxkZXIgZmJiID0gbmV3IEZsYXRCdWZmZXJCdWlsZGVyKDE2KTsKLSAgICAgICAgaW50IHN0ciA9IGZiYi5jcmVhdGVTdHJpbmcoIkJ5dGVNb25zdGVyIik7Ci0gICAgICAgIGJ5dGVbXSBkYXRhID0gbmV3IGJ5dGVbXSB7MCwgMSwgMiwgMywgNCwgNSwgNiwgNywgOCwgOX07Ci0gICAgICAgIGludCBvZmZzZXQgPSBNb25zdGVyLmNyZWF0ZUludmVudG9yeVZlY3RvcihmYmIsIGRhdGEpOwotICAgICAgICBNb25zdGVyLnN0YXJ0TW9uc3RlcihmYmIpOwotICAgICAgICBNb25zdGVyLmFkZE5hbWUoZmJiLCBzdHIpOwotICAgICAgICBNb25zdGVyLmFkZEludmVudG9yeShmYmIsIG9mZnNldCk7Ci0gICAgICAgIGludCBtb25zdGVyMSA9IE1vbnN0ZXIuZW5kTW9uc3RlcihmYmIpOwotICAgICAgICBNb25zdGVyLmZpbmlzaE1vbnN0ZXJCdWZmZXIoZmJiLCBtb25zdGVyMSk7Ci0gICAgICAgIE1vbnN0ZXIgbW9uc3Rlck9iamVjdCA9IE1vbnN0ZXIuZ2V0Um9vdEFzTW9uc3RlcihmYmIuZGF0YUJ1ZmZlcigpKTsKLQotICAgICAgICBUZXN0RXEobW9uc3Rlck9iamVjdC5pbnZlbnRvcnlMZW5ndGgoKSwgZGF0YS5sZW5ndGgpOwotICAgICAgICBUZXN0RXEobW9uc3Rlck9iamVjdC5pbnZlbnRvcnkoNCksIChpbnQpIGRhdGFbNF0pOwotICAgICAgICBUZXN0RXEoQnl0ZUJ1ZmZlci53cmFwKGRhdGEpLCBtb25zdGVyT2JqZWN0LmludmVudG9yeUFzQnl0ZUJ1ZmZlcigpKTsKLQotICAgICAgICBmYmIuY2xlYXIoKTsKLSAgICAgICAgQnl0ZUJ1ZmZlciBiYiA9IEJ5dGVCdWZmZXIud3JhcChkYXRhKTsKLSAgICAgICAgb2Zmc2V0ID0gZmJiLmNyZWF0ZUJ5dGVWZWN0b3IoYmIpOwotICAgICAgICBzdHIgPSBmYmIuY3JlYXRlU3RyaW5nKCJCeXRlTW9uc3RlciIpOwotICAgICAgICBNb25zdGVyLnN0YXJ0TW9uc3RlcihmYmIpOwotICAgICAgICBNb25zdGVyLmFkZE5hbWUoZmJiLCBzdHIpOwotICAgICAgICBNb25zdGVyLmFkZEludmVudG9yeShmYmIsIG9mZnNldCk7Ci0gICAgICAgIG1vbnN0ZXIxID0gTW9uc3Rlci5lbmRNb25zdGVyKGZiYik7Ci0gICAgICAgIE1vbnN0ZXIuZmluaXNoTW9uc3RlckJ1ZmZlcihmYmIsIG1vbnN0ZXIxKTsKLSAgICAgICAgTW9uc3RlciBtb25zdGVyT2JqZWN0MiA9IE1vbnN0ZXIuZ2V0Um9vdEFzTW9uc3RlcihmYmIuZGF0YUJ1ZmZlcigpKTsKLQotICAgICAgICBUZXN0RXEobW9uc3Rlck9iamVjdDIuaW52ZW50b3J5TGVuZ3RoKCksIGRhdGEubGVuZ3RoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBkYXRhLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgVGVzdEVxKG1vbnN0ZXJPYmplY3QyLmludmVudG9yeShpKSwgKGludCkgYmIuZ2V0KGkpKTsKLSAgICAgICAgfQotCi0gICAgICAgIGZiYi5jbGVhcigpOwotICAgICAgICBvZmZzZXQgPSBmYmIuY3JlYXRlQnl0ZVZlY3RvcihkYXRhLCAzLCA0KTsKLSAgICAgICAgc3RyID0gZmJiLmNyZWF0ZVN0cmluZygiQnl0ZU1vbnN0ZXIiKTsKLSAgICAgICAgTW9uc3Rlci5zdGFydE1vbnN0ZXIoZmJiKTsKLSAgICAgICAgTW9uc3Rlci5hZGROYW1lKGZiYiwgc3RyKTsKLSAgICAgICAgTW9uc3Rlci5hZGRJbnZlbnRvcnkoZmJiLCBvZmZzZXQpOwotICAgICAgICBtb25zdGVyMSA9IE1vbnN0ZXIuZW5kTW9uc3RlcihmYmIpOwotICAgICAgICBNb25zdGVyLmZpbmlzaE1vbnN0ZXJCdWZmZXIoZmJiLCBtb25zdGVyMSk7Ci0gICAgICAgIE1vbnN0ZXIgbW9uc3Rlck9iamVjdDMgPSBNb25zdGVyLmdldFJvb3RBc01vbnN0ZXIoZmJiLmRhdGFCdWZmZXIoKSk7Ci0KLSAgICAgICAgVGVzdEVxKG1vbnN0ZXJPYmplY3QzLmludmVudG9yeUxlbmd0aCgpLCA0KTsKLSAgICAgICAgVGVzdEVxKG1vbnN0ZXJPYmplY3QzLmludmVudG9yeSgwKSwgKGludCkgZGF0YVszXSk7Ci0KLSAgICAgICAgZmJiLmNsZWFyKCk7Ci0gICAgICAgIGJiID0gQnl0ZUJ1ZmZlci53cmFwKGRhdGEpOwotICAgICAgICBvZmZzZXQgPSBNb25zdGVyLmNyZWF0ZUludmVudG9yeVZlY3RvcihmYmIsIGJiKTsKLSAgICAgICAgc3RyID0gZmJiLmNyZWF0ZVN0cmluZygiQnl0ZU1vbnN0ZXIiKTsKLSAgICAgICAgTW9uc3Rlci5zdGFydE1vbnN0ZXIoZmJiKTsKLSAgICAgICAgTW9uc3Rlci5hZGROYW1lKGZiYiwgc3RyKTsKLSAgICAgICAgTW9uc3Rlci5hZGRJbnZlbnRvcnkoZmJiLCBvZmZzZXQpOwotICAgICAgICBtb25zdGVyMSA9IE1vbnN0ZXIuZW5kTW9uc3RlcihmYmIpOwotICAgICAgICBNb25zdGVyLmZpbmlzaE1vbnN0ZXJCdWZmZXIoZmJiLCBtb25zdGVyMSk7Ci0gICAgICAgIE1vbnN0ZXIgbW9uc3Rlck9iamVjdDQgPSBNb25zdGVyLmdldFJvb3RBc01vbnN0ZXIoZmJiLmRhdGFCdWZmZXIoKSk7Ci0KLSAgICAgICAgVGVzdEVxKG1vbnN0ZXJPYmplY3Q0LmludmVudG9yeUxlbmd0aCgpLCBkYXRhLmxlbmd0aCk7Ci0gICAgICAgIFRlc3RFcShtb25zdGVyT2JqZWN0NC5pbnZlbnRvcnkoOCksIChpbnQpIDgpOwotCi0gICAgICAgIGZiYi5jbGVhcigpOwotICAgICAgICBieXRlW10gbGFyZ2VEYXRhID0gbmV3IGJ5dGVbMTAyNF07Ci0gICAgICAgIG9mZnNldCA9IGZiYi5jcmVhdGVCeXRlVmVjdG9yKGxhcmdlRGF0YSk7Ci0gICAgICAgIHN0ciA9IGZiYi5jcmVhdGVTdHJpbmcoIkJ5dGVNb25zdGVyIik7Ci0gICAgICAgIE1vbnN0ZXIuc3RhcnRNb25zdGVyKGZiYik7Ci0gICAgICAgIE1vbnN0ZXIuYWRkTmFtZShmYmIsIHN0cik7Ci0gICAgICAgIE1vbnN0ZXIuYWRkSW52ZW50b3J5KGZiYiwgb2Zmc2V0KTsKLSAgICAgICAgbW9uc3RlcjEgPSBNb25zdGVyLmVuZE1vbnN0ZXIoZmJiKTsKLSAgICAgICAgTW9uc3Rlci5maW5pc2hNb25zdGVyQnVmZmVyKGZiYiwgbW9uc3RlcjEpOwotICAgICAgICBNb25zdGVyIG1vbnN0ZXJPYmplY3Q1ID0gTW9uc3Rlci5nZXRSb290QXNNb25zdGVyKGZiYi5kYXRhQnVmZmVyKCkpOwotCi0gICAgICAgIFRlc3RFcShtb25zdGVyT2JqZWN0NS5pbnZlbnRvcnlMZW5ndGgoKSwgbGFyZ2VEYXRhLmxlbmd0aCk7Ci0gICAgICAgIFRlc3RFcShtb25zdGVyT2JqZWN0NS5pbnZlbnRvcnkoMjUpLCAoaW50KSBsYXJnZURhdGFbMjVdKTsKLQotICAgICAgICBmYmIuY2xlYXIoKTsKLSAgICAgICAgYmIgPSBCeXRlQnVmZmVyLndyYXAobGFyZ2VEYXRhKTsKLSAgICAgICAgYmIucG9zaXRpb24oNTEyKTsKLSAgICAgICAgQnl0ZUJ1ZmZlciBiYjIgPSBiYi5zbGljZSgpOwotICAgICAgICBUZXN0RXEoYmIyLmFycmF5T2Zmc2V0KCksIDUxMik7Ci0gICAgICAgIG9mZnNldCA9IGZiYi5jcmVhdGVCeXRlVmVjdG9yKGJiMik7Ci0gICAgICAgIHN0ciA9IGZiYi5jcmVhdGVTdHJpbmcoIkJ5dGVNb25zdGVyIik7Ci0gICAgICAgIE1vbnN0ZXIuc3RhcnRNb25zdGVyKGZiYik7Ci0gICAgICAgIE1vbnN0ZXIuYWRkTmFtZShmYmIsIHN0cik7Ci0gICAgICAgIE1vbnN0ZXIuYWRkSW52ZW50b3J5KGZiYiwgb2Zmc2V0KTsKLSAgICAgICAgbW9uc3RlcjEgPSBNb25zdGVyLmVuZE1vbnN0ZXIoZmJiKTsKLSAgICAgICAgTW9uc3Rlci5maW5pc2hNb25zdGVyQnVmZmVyKGZiYiwgbW9uc3RlcjEpOwotICAgICAgICBNb25zdGVyIG1vbnN0ZXJPYmplY3Q2ID0gTW9uc3Rlci5nZXRSb290QXNNb25zdGVyKGZiYi5kYXRhQnVmZmVyKCkpOwotCi0gICAgICAgIFRlc3RFcShtb25zdGVyT2JqZWN0Ni5pbnZlbnRvcnlMZW5ndGgoKSwgNTEyKTsKLSAgICAgICAgVGVzdEVxKG1vbnN0ZXJPYmplY3Q2LmludmVudG9yeSgwKSwgKGludCkgbGFyZ2VEYXRhWzUxMl0pOwotCi0gICAgICAgIGZiYi5jbGVhcigpOwotICAgICAgICBiYiA9IEJ5dGVCdWZmZXIud3JhcChsYXJnZURhdGEpOwotICAgICAgICBiYi5saW1pdCgyNTYpOwotICAgICAgICBvZmZzZXQgPSBmYmIuY3JlYXRlQnl0ZVZlY3RvcihiYik7Ci0gICAgICAgIHN0ciA9IGZiYi5jcmVhdGVTdHJpbmcoIkJ5dGVNb25zdGVyIik7Ci0gICAgICAgIE1vbnN0ZXIuc3RhcnRNb25zdGVyKGZiYik7Ci0gICAgICAgIE1vbnN0ZXIuYWRkTmFtZShmYmIsIHN0cik7Ci0gICAgICAgIE1vbnN0ZXIuYWRkSW52ZW50b3J5KGZiYiwgb2Zmc2V0KTsKLSAgICAgICAgbW9uc3RlcjEgPSBNb25zdGVyLmVuZE1vbnN0ZXIoZmJiKTsKLSAgICAgICAgTW9uc3Rlci5maW5pc2hNb25zdGVyQnVmZmVyKGZiYiwgbW9uc3RlcjEpOwotICAgICAgICBNb25zdGVyIG1vbnN0ZXJPYmplY3Q3ID0gTW9uc3Rlci5nZXRSb290QXNNb25zdGVyKGZiYi5kYXRhQnVmZmVyKCkpOwotCi0gICAgICAgIFRlc3RFcShtb25zdGVyT2JqZWN0Ny5pbnZlbnRvcnlMZW5ndGgoKSwgMjU2KTsKLQotICAgICAgICBmYmIuY2xlYXIoKTsKLSAgICAgICAgYmIgPSBCeXRlQnVmZmVyLmFsbG9jYXRlRGlyZWN0KDIwNDgpOwotICAgICAgICBvZmZzZXQgPSBmYmIuY3JlYXRlQnl0ZVZlY3RvcihiYik7Ci0gICAgICAgIHN0ciA9IGZiYi5jcmVhdGVTdHJpbmcoIkJ5dGVNb25zdGVyIik7Ci0gICAgICAgIE1vbnN0ZXIuc3RhcnRNb25zdGVyKGZiYik7Ci0gICAgICAgIE1vbnN0ZXIuYWRkTmFtZShmYmIsIHN0cik7Ci0gICAgICAgIE1vbnN0ZXIuYWRkSW52ZW50b3J5KGZiYiwgb2Zmc2V0KTsKLSAgICAgICAgbW9uc3RlcjEgPSBNb25zdGVyLmVuZE1vbnN0ZXIoZmJiKTsKLSAgICAgICAgTW9uc3Rlci5maW5pc2hNb25zdGVyQnVmZmVyKGZiYiwgbW9uc3RlcjEpOwotICAgICAgICBNb25zdGVyIG1vbnN0ZXJPYmplY3Q4ID0gTW9uc3Rlci5nZXRSb290QXNNb25zdGVyKGZiYi5kYXRhQnVmZmVyKCkpOwotCi0gICAgICAgIFRlc3RFcShtb25zdGVyT2JqZWN0OC5pbnZlbnRvcnlMZW5ndGgoKSwgMjA0OCk7Ci0gICAgfQotCi0gICAgc3RhdGljIHZvaWQgVGVzdFNoYXJlZFN0cmluZ1Bvb2woKSB7Ci0gICAgICAgIEZsYXRCdWZmZXJCdWlsZGVyIGZiID0gbmV3IEZsYXRCdWZmZXJCdWlsZGVyKDEpOwotICAgICAgICBTdHJpbmcgdGVzdFN0cmluZyA9ICJNeSBzdHJpbmciOwotICAgICAgICBpbnQgb2Zmc2V0ID0gZmIuY3JlYXRlU2hhcmVkU3RyaW5nKHRlc3RTdHJpbmcpOwotICAgICAgICBmb3IgKGludCBpPTA7IGk8IDEwOyBpKyspIHsKLSAgICAgICAgICAgIFRlc3RFcShvZmZzZXQsIGZiLmNyZWF0ZVNoYXJlZFN0cmluZyh0ZXN0U3RyaW5nKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBzdGF0aWMgdm9pZCBUZXN0U2NhbGFyT3B0aW9uYWwoKSB7Ci0gICAgICAgIEZsYXRCdWZmZXJCdWlsZGVyIGZiYiA9IG5ldyBGbGF0QnVmZmVyQnVpbGRlcigxKTsKLSAgICAgICAgU2NhbGFyU3R1ZmYuc3RhcnRTY2FsYXJTdHVmZihmYmIpOwotICAgICAgICBpbnQgcG9zID0gU2NhbGFyU3R1ZmYuZW5kU2NhbGFyU3R1ZmYoZmJiKTsKLSAgICAgICAgZmJiLmZpbmlzaChwb3MpOwotCi0gICAgICAgIFNjYWxhclN0dWZmIHNjYWxhclN0dWZmID0gU2NhbGFyU3R1ZmYuZ2V0Um9vdEFzU2NhbGFyU3R1ZmYoZmJiLmRhdGFCdWZmZXIoKSk7Ci0gICAgICAgIFRlc3RFcShzY2FsYXJTdHVmZi5qdXN0STgoKSwgKGJ5dGUpMCk7Ci0gICAgICAgIFRlc3RFcShzY2FsYXJTdHVmZi5tYXliZUk4KCksIChieXRlKTApOwotICAgICAgICBUZXN0RXEoc2NhbGFyU3R1ZmYuZGVmYXVsdEk4KCksIChieXRlKTQyKTsKLSAgICAgICAgVGVzdEVxKHNjYWxhclN0dWZmLmp1c3RVOCgpLCAwKTsKLSAgICAgICAgVGVzdEVxKHNjYWxhclN0dWZmLm1heWJlVTgoKSwgMCk7Ci0gICAgICAgIFRlc3RFcShzY2FsYXJTdHVmZi5kZWZhdWx0VTgoKSwgNDIpOwotICAgICAgICBUZXN0RXEoc2NhbGFyU3R1ZmYuanVzdEkxNigpLCAoc2hvcnQpMCk7Ci0gICAgICAgIFRlc3RFcShzY2FsYXJTdHVmZi5tYXliZUkxNigpLCAoc2hvcnQpMCk7Ci0gICAgICAgIFRlc3RFcShzY2FsYXJTdHVmZi5kZWZhdWx0STE2KCksIChzaG9ydCk0Mik7Ci0gICAgICAgIFRlc3RFcShzY2FsYXJTdHVmZi5qdXN0VTE2KCksIDApOwotICAgICAgICBUZXN0RXEoc2NhbGFyU3R1ZmYubWF5YmVVMTYoKSwgMCk7Ci0gICAgICAgIFRlc3RFcShzY2FsYXJTdHVmZi5kZWZhdWx0VTE2KCksIDQyKTsKLSAgICAgICAgVGVzdEVxKHNjYWxhclN0dWZmLmp1c3RJMzIoKSwgMCk7Ci0gICAgICAgIFRlc3RFcShzY2FsYXJTdHVmZi5tYXliZUkzMigpLCAwKTsKLSAgICAgICAgVGVzdEVxKHNjYWxhclN0dWZmLmRlZmF1bHRJMzIoKSwgNDIpOwotICAgICAgICBUZXN0RXEoc2NhbGFyU3R1ZmYuanVzdFUzMigpLCAwTCk7Ci0gICAgICAgIFRlc3RFcShzY2FsYXJTdHVmZi5tYXliZVUzMigpLCAwTCk7Ci0gICAgICAgIFRlc3RFcShzY2FsYXJTdHVmZi5kZWZhdWx0VTMyKCksIDQyTCk7Ci0gICAgICAgIFRlc3RFcShzY2FsYXJTdHVmZi5qdXN0STY0KCksIDBMKTsKLSAgICAgICAgVGVzdEVxKHNjYWxhclN0dWZmLm1heWJlSTY0KCksIDBMKTsKLSAgICAgICAgVGVzdEVxKHNjYWxhclN0dWZmLmRlZmF1bHRJNjQoKSwgNDJMKTsKLSAgICAgICAgVGVzdEVxKHNjYWxhclN0dWZmLmp1c3RVNjQoKSwgMEwpOwotICAgICAgICBUZXN0RXEoc2NhbGFyU3R1ZmYubWF5YmVVNjQoKSwgMEwpOwotICAgICAgICBUZXN0RXEoc2NhbGFyU3R1ZmYuZGVmYXVsdFU2NCgpLCA0MkwpOwotICAgICAgICBUZXN0RXEoc2NhbGFyU3R1ZmYuanVzdEYzMigpLCAwLjBmKTsKLSAgICAgICAgVGVzdEVxKHNjYWxhclN0dWZmLm1heWJlRjMyKCksIDBmKTsKLSAgICAgICAgVGVzdEVxKHNjYWxhclN0dWZmLmRlZmF1bHRGMzIoKSwgNDIuMGYpOwotICAgICAgICBUZXN0RXEoc2NhbGFyU3R1ZmYuanVzdEY2NCgpLCAwLjApOwotICAgICAgICBUZXN0RXEoc2NhbGFyU3R1ZmYubWF5YmVGNjQoKSwgMC4wKTsKLSAgICAgICAgVGVzdEVxKHNjYWxhclN0dWZmLmRlZmF1bHRGNjQoKSwgNDIuMCk7Ci0gICAgICAgIFRlc3RFcShzY2FsYXJTdHVmZi5qdXN0Qm9vbCgpLCBmYWxzZSk7Ci0gICAgICAgIFRlc3RFcShzY2FsYXJTdHVmZi5tYXliZUJvb2woKSwgZmFsc2UpOwotICAgICAgICBUZXN0RXEoc2NhbGFyU3R1ZmYuZGVmYXVsdEJvb2woKSwgdHJ1ZSk7Ci0gICAgICAgIFRlc3RFcShzY2FsYXJTdHVmZi5qdXN0RW51bSgpLCBPcHRpb25hbEJ5dGUuTm9uZSk7Ci0gICAgICAgIFRlc3RFcShzY2FsYXJTdHVmZi5tYXliZUVudW0oKSwgT3B0aW9uYWxCeXRlLk5vbmUpOwotICAgICAgICBUZXN0RXEoc2NhbGFyU3R1ZmYuZGVmYXVsdEVudW0oKSwgT3B0aW9uYWxCeXRlLk9uZSk7Ci0KLSAgICAgICAgVGVzdEVxKHNjYWxhclN0dWZmLmhhc01heWJlSTgoKSwgZmFsc2UpOwotICAgICAgICBUZXN0RXEoc2NhbGFyU3R1ZmYuaGFzTWF5YmVJMTYoKSwgZmFsc2UpOwotICAgICAgICBUZXN0RXEoc2NhbGFyU3R1ZmYuaGFzTWF5YmVJMzIoKSwgZmFsc2UpOwotICAgICAgICBUZXN0RXEoc2NhbGFyU3R1ZmYuaGFzTWF5YmVJNjQoKSwgZmFsc2UpOwotICAgICAgICBUZXN0RXEoc2NhbGFyU3R1ZmYuaGFzTWF5YmVVOCgpLCBmYWxzZSk7Ci0gICAgICAgIFRlc3RFcShzY2FsYXJTdHVmZi5oYXNNYXliZVUxNigpLCBmYWxzZSk7Ci0gICAgICAgIFRlc3RFcShzY2FsYXJTdHVmZi5oYXNNYXliZVUzMigpLCBmYWxzZSk7Ci0gICAgICAgIFRlc3RFcShzY2FsYXJTdHVmZi5oYXNNYXliZVU2NCgpLCBmYWxzZSk7Ci0gICAgICAgIFRlc3RFcShzY2FsYXJTdHVmZi5oYXNNYXliZUYzMigpLCBmYWxzZSk7Ci0gICAgICAgIFRlc3RFcShzY2FsYXJTdHVmZi5oYXNNYXliZUY2NCgpLCBmYWxzZSk7Ci0gICAgICAgIFRlc3RFcShzY2FsYXJTdHVmZi5oYXNNYXliZUJvb2woKSwgZmFsc2UpOwotICAgICAgICBUZXN0RXEoc2NhbGFyU3R1ZmYuaGFzTWF5YmVFbnVtKCksIGZhbHNlKTsKLQotICAgICAgICBmYmIuY2xlYXIoKTsKLQotICAgICAgICBTY2FsYXJTdHVmZi5zdGFydFNjYWxhclN0dWZmKGZiYik7Ci0gICAgICAgIFNjYWxhclN0dWZmLmFkZEp1c3RJOChmYmIsIChieXRlKTUpOwotICAgICAgICBTY2FsYXJTdHVmZi5hZGRNYXliZUk4KGZiYiwgKGJ5dGUpNSk7Ci0gICAgICAgIFNjYWxhclN0dWZmLmFkZERlZmF1bHRJOChmYmIsIChieXRlKTUpOwotICAgICAgICBTY2FsYXJTdHVmZi5hZGRKdXN0VTgoZmJiLCA2KTsKLSAgICAgICAgU2NhbGFyU3R1ZmYuYWRkTWF5YmVVOChmYmIsIDYpOwotICAgICAgICBTY2FsYXJTdHVmZi5hZGREZWZhdWx0VTgoZmJiLCA2KTsKLSAgICAgICAgU2NhbGFyU3R1ZmYuYWRkSnVzdEkxNihmYmIsIChzaG9ydCk3KTsKLSAgICAgICAgU2NhbGFyU3R1ZmYuYWRkTWF5YmVJMTYoZmJiLCAoc2hvcnQpNyk7Ci0gICAgICAgIFNjYWxhclN0dWZmLmFkZERlZmF1bHRJMTYoZmJiLCAoc2hvcnQpNyk7Ci0gICAgICAgIFNjYWxhclN0dWZmLmFkZEp1c3RVMTYoZmJiLCA4KTsKLSAgICAgICAgU2NhbGFyU3R1ZmYuYWRkTWF5YmVVMTYoZmJiLCA4KTsKLSAgICAgICAgU2NhbGFyU3R1ZmYuYWRkRGVmYXVsdFUxNihmYmIsIDgpOwotICAgICAgICBTY2FsYXJTdHVmZi5hZGRKdXN0STMyKGZiYiwgOSk7Ci0gICAgICAgIFNjYWxhclN0dWZmLmFkZE1heWJlSTMyKGZiYiwgOSk7Ci0gICAgICAgIFNjYWxhclN0dWZmLmFkZERlZmF1bHRJMzIoZmJiLCA5KTsKLSAgICAgICAgU2NhbGFyU3R1ZmYuYWRkSnVzdFUzMihmYmIsIChsb25nKTEwKTsKLSAgICAgICAgU2NhbGFyU3R1ZmYuYWRkTWF5YmVVMzIoZmJiLCAobG9uZykxMCk7Ci0gICAgICAgIFNjYWxhclN0dWZmLmFkZERlZmF1bHRVMzIoZmJiLCAobG9uZykxMCk7Ci0gICAgICAgIFNjYWxhclN0dWZmLmFkZEp1c3RJNjQoZmJiLCAxMUwpOwotICAgICAgICBTY2FsYXJTdHVmZi5hZGRNYXliZUk2NChmYmIsIDExTCk7Ci0gICAgICAgIFNjYWxhclN0dWZmLmFkZERlZmF1bHRJNjQoZmJiLCAxMUwpOwotICAgICAgICBTY2FsYXJTdHVmZi5hZGRKdXN0VTY0KGZiYiwgMTJMKTsKLSAgICAgICAgU2NhbGFyU3R1ZmYuYWRkTWF5YmVVNjQoZmJiLCAxMkwpOwotICAgICAgICBTY2FsYXJTdHVmZi5hZGREZWZhdWx0VTY0KGZiYiwgMTJMKTsKLSAgICAgICAgU2NhbGFyU3R1ZmYuYWRkSnVzdEYzMihmYmIsIDEzLjBmKTsKLSAgICAgICAgU2NhbGFyU3R1ZmYuYWRkTWF5YmVGMzIoZmJiLCAxMy4wZik7Ci0gICAgICAgIFNjYWxhclN0dWZmLmFkZERlZmF1bHRGMzIoZmJiLCAxMy4wZik7Ci0gICAgICAgIFNjYWxhclN0dWZmLmFkZEp1c3RGNjQoZmJiLCAxNC4wKTsKLSAgICAgICAgU2NhbGFyU3R1ZmYuYWRkTWF5YmVGNjQoZmJiLCAxNC4wKTsKLSAgICAgICAgU2NhbGFyU3R1ZmYuYWRkRGVmYXVsdEY2NChmYmIsIDE0LjApOwotICAgICAgICBTY2FsYXJTdHVmZi5hZGRKdXN0Qm9vbChmYmIsIHRydWUpOwotICAgICAgICBTY2FsYXJTdHVmZi5hZGRNYXliZUJvb2woZmJiLCB0cnVlKTsKLSAgICAgICAgU2NhbGFyU3R1ZmYuYWRkRGVmYXVsdEJvb2woZmJiLCB0cnVlKTsKLSAgICAgICAgU2NhbGFyU3R1ZmYuYWRkSnVzdEVudW0oZmJiLCBPcHRpb25hbEJ5dGUuVHdvKTsKLSAgICAgICAgU2NhbGFyU3R1ZmYuYWRkTWF5YmVFbnVtKGZiYiwgT3B0aW9uYWxCeXRlLlR3byk7Ci0gICAgICAgIFNjYWxhclN0dWZmLmFkZERlZmF1bHRFbnVtKGZiYiwgT3B0aW9uYWxCeXRlLlR3byk7Ci0KLSAgICAgICAgcG9zID0gU2NhbGFyU3R1ZmYuZW5kU2NhbGFyU3R1ZmYoZmJiKTsKLQotICAgICAgICBmYmIuZmluaXNoKHBvcyk7Ci0KLSAgICAgICAgc2NhbGFyU3R1ZmYgPSBTY2FsYXJTdHVmZi5nZXRSb290QXNTY2FsYXJTdHVmZihmYmIuZGF0YUJ1ZmZlcigpKTsKLQotICAgICAgICBUZXN0RXEoc2NhbGFyU3R1ZmYuanVzdEk4KCksIChieXRlKTUpOwotICAgICAgICBUZXN0RXEoc2NhbGFyU3R1ZmYubWF5YmVJOCgpLCAoYnl0ZSk1KTsKLSAgICAgICAgVGVzdEVxKHNjYWxhclN0dWZmLmRlZmF1bHRJOCgpLCAoYnl0ZSk1KTsKLSAgICAgICAgVGVzdEVxKHNjYWxhclN0dWZmLmp1c3RVOCgpLCA2KTsKLSAgICAgICAgVGVzdEVxKHNjYWxhclN0dWZmLm1heWJlVTgoKSwgNik7Ci0gICAgICAgIFRlc3RFcShzY2FsYXJTdHVmZi5kZWZhdWx0VTgoKSwgNik7Ci0gICAgICAgIFRlc3RFcShzY2FsYXJTdHVmZi5qdXN0STE2KCksIChzaG9ydCk3KTsKLSAgICAgICAgVGVzdEVxKHNjYWxhclN0dWZmLm1heWJlSTE2KCksIChzaG9ydCk3KTsKLSAgICAgICAgVGVzdEVxKHNjYWxhclN0dWZmLmRlZmF1bHRJMTYoKSwgKHNob3J0KTcpOwotICAgICAgICBUZXN0RXEoc2NhbGFyU3R1ZmYuanVzdFUxNigpLCA4KTsKLSAgICAgICAgVGVzdEVxKHNjYWxhclN0dWZmLm1heWJlVTE2KCksIDgpOwotICAgICAgICBUZXN0RXEoc2NhbGFyU3R1ZmYuZGVmYXVsdFUxNigpLCA4KTsKLSAgICAgICAgVGVzdEVxKHNjYWxhclN0dWZmLmp1c3RJMzIoKSwgOSk7Ci0gICAgICAgIFRlc3RFcShzY2FsYXJTdHVmZi5tYXliZUkzMigpLCA5KTsKLSAgICAgICAgVGVzdEVxKHNjYWxhclN0dWZmLmRlZmF1bHRJMzIoKSwgOSk7Ci0gICAgICAgIFRlc3RFcShzY2FsYXJTdHVmZi5qdXN0VTMyKCksIDEwTCk7Ci0gICAgICAgIFRlc3RFcShzY2FsYXJTdHVmZi5tYXliZVUzMigpLCAxMEwpOwotICAgICAgICBUZXN0RXEoc2NhbGFyU3R1ZmYuZGVmYXVsdFUzMigpLCAxMEwpOwotICAgICAgICBUZXN0RXEoc2NhbGFyU3R1ZmYuanVzdEk2NCgpLCAxMUwpOwotICAgICAgICBUZXN0RXEoc2NhbGFyU3R1ZmYubWF5YmVJNjQoKSwgMTFMKTsKLSAgICAgICAgVGVzdEVxKHNjYWxhclN0dWZmLmRlZmF1bHRJNjQoKSwgMTFMKTsKLSAgICAgICAgVGVzdEVxKHNjYWxhclN0dWZmLmp1c3RVNjQoKSwgMTJMKTsKLSAgICAgICAgVGVzdEVxKHNjYWxhclN0dWZmLm1heWJlVTY0KCksIDEyTCk7Ci0gICAgICAgIFRlc3RFcShzY2FsYXJTdHVmZi5kZWZhdWx0VTY0KCksIDEyTCk7Ci0gICAgICAgIFRlc3RFcShzY2FsYXJTdHVmZi5qdXN0RjMyKCksIDEzLjBmKTsKLSAgICAgICAgVGVzdEVxKHNjYWxhclN0dWZmLm1heWJlRjMyKCksIDEzLjBmKTsKLSAgICAgICAgVGVzdEVxKHNjYWxhclN0dWZmLmRlZmF1bHRGMzIoKSwgMTMuMGYpOwotICAgICAgICBUZXN0RXEoc2NhbGFyU3R1ZmYuanVzdEY2NCgpLCAxNC4wKTsKLSAgICAgICAgVGVzdEVxKHNjYWxhclN0dWZmLm1heWJlRjY0KCksIDE0LjApOwotICAgICAgICBUZXN0RXEoc2NhbGFyU3R1ZmYuZGVmYXVsdEY2NCgpLCAxNC4wKTsKLSAgICAgICAgVGVzdEVxKHNjYWxhclN0dWZmLmp1c3RCb29sKCksIHRydWUpOwotICAgICAgICBUZXN0RXEoc2NhbGFyU3R1ZmYubWF5YmVCb29sKCksIHRydWUpOwotICAgICAgICBUZXN0RXEoc2NhbGFyU3R1ZmYuZGVmYXVsdEJvb2woKSwgdHJ1ZSk7Ci0gICAgICAgIFRlc3RFcShzY2FsYXJTdHVmZi5qdXN0RW51bSgpLCBPcHRpb25hbEJ5dGUuVHdvKTsKLSAgICAgICAgVGVzdEVxKHNjYWxhclN0dWZmLm1heWJlRW51bSgpLCBPcHRpb25hbEJ5dGUuVHdvKTsKLSAgICAgICAgVGVzdEVxKHNjYWxhclN0dWZmLmRlZmF1bHRFbnVtKCksIE9wdGlvbmFsQnl0ZS5Ud28pOwotCi0gICAgICAgIFRlc3RFcShzY2FsYXJTdHVmZi5oYXNNYXliZUk4KCksIHRydWUpOwotICAgICAgICBUZXN0RXEoc2NhbGFyU3R1ZmYuaGFzTWF5YmVJMTYoKSwgdHJ1ZSk7Ci0gICAgICAgIFRlc3RFcShzY2FsYXJTdHVmZi5oYXNNYXliZUkzMigpLCB0cnVlKTsKLSAgICAgICAgVGVzdEVxKHNjYWxhclN0dWZmLmhhc01heWJlSTY0KCksIHRydWUpOwotICAgICAgICBUZXN0RXEoc2NhbGFyU3R1ZmYuaGFzTWF5YmVVOCgpLCB0cnVlKTsKLSAgICAgICAgVGVzdEVxKHNjYWxhclN0dWZmLmhhc01heWJlVTE2KCksIHRydWUpOwotICAgICAgICBUZXN0RXEoc2NhbGFyU3R1ZmYuaGFzTWF5YmVVMzIoKSwgdHJ1ZSk7Ci0gICAgICAgIFRlc3RFcShzY2FsYXJTdHVmZi5oYXNNYXliZVU2NCgpLCB0cnVlKTsKLSAgICAgICAgVGVzdEVxKHNjYWxhclN0dWZmLmhhc01heWJlRjMyKCksIHRydWUpOwotICAgICAgICBUZXN0RXEoc2NhbGFyU3R1ZmYuaGFzTWF5YmVGNjQoKSwgdHJ1ZSk7Ci0gICAgICAgIFRlc3RFcShzY2FsYXJTdHVmZi5oYXNNYXliZUJvb2woKSwgdHJ1ZSk7Ci0gICAgICAgIFRlc3RFcShzY2FsYXJTdHVmZi5oYXNNYXliZUVudW0oKSwgdHJ1ZSk7Ci0gICAgfQotCi0gICAgc3RhdGljIHZvaWQgVGVzdE9iamVjdChNb25zdGVyVCBtb25zdGVyKSB7Ci0gICAgICAgIFRlc3RFcShtb25zdGVyLmdldEhwKCksIChzaG9ydCkgODApOwotICAgICAgICBUZXN0RXEobW9uc3Rlci5nZXRNYW5hKCksIChzaG9ydCkgMTUwKTsgIC8vIGRlZmF1bHQKLQotICAgICAgICBUZXN0RXEobW9uc3Rlci5nZXROYW1lKCksICJNeU1vbnN0ZXIiKTsKLSAgICAgICAgVGVzdEVxKG1vbnN0ZXIuZ2V0Q29sb3IoKSwgQ29sb3IuQmx1ZSk7Ci0gICAgICAgIC8vIG1vbnN0ZXIuZnJpZW5kbHkoKSAvLyBjYW4ndCBhY2Nlc3MsIGRlcHJlY2F0ZWQKLQotICAgICAgICBWZWMzVCBwb3MgPSBtb25zdGVyLmdldFBvcygpOwotICAgICAgICBUZXN0RXEocG9zLmdldFgoKSwgMS4wZik7Ci0gICAgICAgIFRlc3RFcShwb3MuZ2V0WSgpLCAyLjBmKTsKLSAgICAgICAgVGVzdEVxKHBvcy5nZXRaKCksIDMuMGYpOwotICAgICAgICBUZXN0RXEocG9zLmdldFRlc3QxKCksIDMuMCk7Ci0gICAgICAgIC8vIGlzc3VlOiBpbnQgIT0gYnl0ZQotICAgICAgICBUZXN0RXEocG9zLmdldFRlc3QyKCksIChpbnQpIENvbG9yLkdyZWVuKTsKLSAgICAgICAgVGVzdFQgdCA9IHBvcy5nZXRUZXN0MygpOwotICAgICAgICBUZXN0RXEodC5nZXRBKCksIChzaG9ydCkgNSk7Ci0gICAgICAgIFRlc3RFcSh0LmdldEIoKSwgKGJ5dGUpIDYpOwotCi0gICAgICAgIFRlc3RFcShtb25zdGVyLmdldFRlc3QoKS5nZXRUeXBlKCksIChieXRlKSBBbnkuTW9uc3Rlcik7Ci0gICAgICAgIE1vbnN0ZXJUIG1vbnN0ZXIyID0gKE1vbnN0ZXJUKSBtb25zdGVyLmdldFRlc3QoKS5nZXRWYWx1ZSgpOwotICAgICAgICBUZXN0RXEobW9uc3RlcjIgIT0gbnVsbCwgdHJ1ZSk7Ci0gICAgICAgIFRlc3RFcShtb25zdGVyMi5nZXROYW1lKCksICJGcmVkIik7Ci0KLSAgICAgICAgaW50W10gaW52ID0gbW9uc3Rlci5nZXRJbnZlbnRvcnkoKTsKLSAgICAgICAgVGVzdEVxKGludi5sZW5ndGgsIDUpOwotICAgICAgICBpbnRbXSBleHBJbnYgPSB7MCwgMSwgMiwgMywgNH07Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaW52Lmxlbmd0aDsgaSsrKQotICAgICAgICAgICAgVGVzdEVxKGV4cEludltpXSwgaW52W2ldKTsKLQotICAgICAgICBUZXN0VFtdIHRlc3Q0ID0gbW9uc3Rlci5nZXRUZXN0NCgpOwotICAgICAgICBUZXN0VCB0ZXN0XzAgPSB0ZXN0NFswXTsKLSAgICAgICAgVGVzdFQgdGVzdF8xID0gdGVzdDRbMV07Ci0gICAgICAgIFRlc3RFcSh0ZXN0NC5sZW5ndGgsIDIpOwotICAgICAgICBUZXN0RXEodGVzdF8wLmdldEEoKSwgKHNob3J0KSAxMCk7Ci0gICAgICAgIFRlc3RFcSh0ZXN0XzAuZ2V0QigpLCAoYnl0ZSkgMjApOwotICAgICAgICBUZXN0RXEodGVzdF8xLmdldEEoKSwgKHNob3J0KSAzMCk7Ci0gICAgICAgIFRlc3RFcSh0ZXN0XzEuZ2V0QigpLCAoYnl0ZSkgNDApOwotCi0gICAgICAgIFN0cmluZ1tdIHRlc3RhcnJheW9mc3RyaW5nID0gbW9uc3Rlci5nZXRUZXN0YXJyYXlvZnN0cmluZygpOwotICAgICAgICBUZXN0RXEodGVzdGFycmF5b2ZzdHJpbmcubGVuZ3RoLCAyKTsKLSAgICAgICAgVGVzdEVxKHRlc3RhcnJheW9mc3RyaW5nWzBdLCAidGVzdDEiKTsKLSAgICAgICAgVGVzdEVxKHRlc3RhcnJheW9mc3RyaW5nWzFdLCAidGVzdDIiKTsKLQotICAgICAgICBNb25zdGVyVFtdIHRlc3RhcnJheW9mdGFibGVzID0gbW9uc3Rlci5nZXRUZXN0YXJyYXlvZnRhYmxlcygpOwotICAgICAgICBUZXN0RXEodGVzdGFycmF5b2Z0YWJsZXMubGVuZ3RoLCAwKTsKLQotICAgICAgICBNb25zdGVyVCBlbmVteSA9IG1vbnN0ZXIuZ2V0RW5lbXkoKTsKLSAgICAgICAgVGVzdEVxKGVuZW15ICE9IG51bGwsIHRydWUpOwotICAgICAgICBUZXN0RXEoZW5lbXkuZ2V0TmFtZSgpLCAiRnJlZCIpOwotCi0gICAgICAgIGludFtdIHRlc3RuZXN0ZWRmbGF0YnVmZmVyID0gbW9uc3Rlci5nZXRUZXN0bmVzdGVkZmxhdGJ1ZmZlcigpOwotICAgICAgICBUZXN0RXEodGVzdG5lc3RlZGZsYXRidWZmZXIubGVuZ3RoLCAwKTsKLQotICAgICAgICBUZXN0RXEobW9uc3Rlci5nZXRUZXN0ZW1wdHkoKSA9PSBudWxsLCB0cnVlKTsKLQotICAgICAgICBUZXN0RXEobW9uc3Rlci5nZXRUZXN0Ym9vbCgpLCB0cnVlKTsKLQotICAgICAgICBib29sZWFuW10gdGVzdGFycmF5b2Zib29scyA9IG1vbnN0ZXIuZ2V0VGVzdGFycmF5b2Zib29scygpOwotICAgICAgICBUZXN0RXEodGVzdGFycmF5b2Zib29scy5sZW5ndGgsIDMpOwotICAgICAgICBUZXN0RXEodGVzdGFycmF5b2Zib29sc1swXSwgdHJ1ZSk7Ci0gICAgICAgIFRlc3RFcSh0ZXN0YXJyYXlvZmJvb2xzWzFdLCBmYWxzZSk7Ci0gICAgICAgIFRlc3RFcSh0ZXN0YXJyYXlvZmJvb2xzWzJdLCB0cnVlKTsKLQotICAgICAgICBUZXN0RXEobW9uc3Rlci5nZXRUZXN0ZigpLCAzLjE0MTU5Zik7Ci0gICAgICAgIFRlc3RFcShtb25zdGVyLmdldFRlc3RmMigpLCAzLjBmKTsKLSAgICAgICAgVGVzdEVxKG1vbnN0ZXIuZ2V0VGVzdGYzKCksIDAuMGYpOwotICAgICAgICBUZXN0RXEobW9uc3Rlci5nZXRUZXN0ZjMoKSwgMC4wZik7Ci0KLSAgICAgICAgQWJpbGl0eVRbXSB0ZXN0YXJyYXlvZnNvcnRlZHN0cnVjdCA9IG1vbnN0ZXIuZ2V0VGVzdGFycmF5b2Zzb3J0ZWRzdHJ1Y3QoKTsKLSAgICAgICAgVGVzdEVxKHRlc3RhcnJheW9mc29ydGVkc3RydWN0Lmxlbmd0aCwgMyk7Ci0gICAgICAgIFRlc3RFcSh0ZXN0YXJyYXlvZnNvcnRlZHN0cnVjdFswXS5nZXRJZCgpLCAobG9uZykgMCk7Ci0gICAgICAgIFRlc3RFcSh0ZXN0YXJyYXlvZnNvcnRlZHN0cnVjdFsxXS5nZXRJZCgpLCAobG9uZykgMSk7Ci0gICAgICAgIFRlc3RFcSh0ZXN0YXJyYXlvZnNvcnRlZHN0cnVjdFsyXS5nZXRJZCgpLCAobG9uZykgNSk7Ci0gICAgICAgIFRlc3RFcSh0ZXN0YXJyYXlvZnNvcnRlZHN0cnVjdFswXS5nZXREaXN0YW5jZSgpLCAobG9uZykgNDUpOwotICAgICAgICBUZXN0RXEodGVzdGFycmF5b2Zzb3J0ZWRzdHJ1Y3RbMV0uZ2V0RGlzdGFuY2UoKSwgKGxvbmcpIDIxKTsKLSAgICAgICAgVGVzdEVxKHRlc3RhcnJheW9mc29ydGVkc3RydWN0WzJdLmdldERpc3RhbmNlKCksIChsb25nKSAxMik7Ci0KLSAgICAgICAgaW50W10gZmxleCA9IG1vbnN0ZXIuZ2V0RmxleCgpOwotICAgICAgICBUZXN0RXEoZmxleC5sZW5ndGgsIDApOwotCi0gICAgICAgIGxvbmdbXSB2ZWN0b3JPZkxvbmdzID0gbW9uc3Rlci5nZXRWZWN0b3JPZkxvbmdzKCk7Ci0gICAgICAgIFRlc3RFcSh2ZWN0b3JPZkxvbmdzLmxlbmd0aCwgNSk7Ci0gICAgICAgIGxvbmcgbCA9IDE7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdmVjdG9yT2ZMb25ncy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgVGVzdEVxKHZlY3Rvck9mTG9uZ3NbaV0sIGwpOwotICAgICAgICAgICAgbCAqPSAxMDA7Ci0gICAgICAgIH0KLQotICAgICAgICBkb3VibGVbXSB2ZWN0b3JPZkRvdWJsZXMgPSBtb25zdGVyLmdldFZlY3Rvck9mRG91YmxlcygpOwotICAgICAgICBUZXN0RXEodmVjdG9yT2ZEb3VibGVzLmxlbmd0aCwgMyk7Ci0gICAgICAgIFRlc3RFcSh2ZWN0b3JPZkRvdWJsZXNbMF0sIC0xLjc5NzY5MzEzNDg2MjMxNTdFMzA4KTsKLSAgICAgICAgVGVzdEVxKHZlY3Rvck9mRG91Ymxlc1sxXSwgMC4wKTsKLSAgICAgICAgVGVzdEVxKHZlY3Rvck9mRG91Ymxlc1syXSwgMS43OTc2OTMxMzQ4NjIzMTU3RTMwOCk7Ci0KLSAgICAgICAgVGVzdEVxKG1vbnN0ZXIuZ2V0UGFyZW50TmFtZXNwYWNlVGVzdCgpID09IG51bGwsIHRydWUpOwotICAgICAgICBSZWZlcnJhYmxlVFtdIHZlY3Rvck9mUmVmZXJyYWJsZXMgPSBtb25zdGVyLmdldFZlY3Rvck9mUmVmZXJyYWJsZXMoKTsKLSAgICAgICAgVGVzdEVxKHZlY3Rvck9mUmVmZXJyYWJsZXMubGVuZ3RoLCAwKTsKLQotICAgICAgICBUZXN0RXEobW9uc3Rlci5nZXRTaWduZWRFbnVtKCksIChieXRlKSAtMSk7Ci0gICAgfQotCi0gICAgc3RhdGljIHZvaWQgVGVzdFBhY2tVbnBhY2soQnl0ZUJ1ZmZlciBiYikgewotICAgICAgICBNb25zdGVyIG0gPSBNb25zdGVyLmdldFJvb3RBc01vbnN0ZXIoYmIpOwotICAgICAgICBNb25zdGVyVCBtT2JqZWN0ID0gbS51bnBhY2soKTsKLSAgICAgICAgVGVzdE9iamVjdChtT2JqZWN0KTsKLSAgICAgICAgRmxhdEJ1ZmZlckJ1aWxkZXIgZmJiID0gbmV3IEZsYXRCdWZmZXJCdWlsZGVyKCk7Ci0gICAgICAgIGludCBtb25zdGVyID0gTW9uc3Rlci5wYWNrKGZiYiwgbU9iamVjdCk7Ci0gICAgICAgIE1vbnN0ZXIuZmluaXNoTW9uc3RlckJ1ZmZlcihmYmIsIG1vbnN0ZXIpOwotICAgICAgICBUZXN0QnVmZmVyKGZiYi5kYXRhQnVmZmVyKCkpOwotCi0gICAgICAgIGJ5dGVbXSBieXRlcyA9IG1PYmplY3Quc2VyaWFsaXplVG9CaW5hcnkoKTsKLSAgICAgICAgTW9uc3RlclQgbmV3TW9uc3RlclQgPSBNb25zdGVyVC5kZXNlcmlhbGl6ZUZyb21CaW5hcnkoYnl0ZXMpOwotICAgICAgICBUZXN0T2JqZWN0KG5ld01vbnN0ZXJUKTsKLSAgICB9Ci0KLSAgICBzdGF0aWMgPFQ+IHZvaWQgVGVzdEVxKFQgYSwgVCBiKSB7Ci0gICAgICAgIGlmICgoYSA9PSBudWxsICYmIGEgIT0gYikgfHwgKGEgIT0gbnVsbCAmJiAhYS5lcXVhbHMoYikpKSB7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIiIgKyBhLmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiAiICsgYi5nZXRDbGFzcygpLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkZsYXRCdWZmZXJzIHRlc3QgRkFJTEVEOiBcJyIgKyBhICsgIlwnICE9IFwnIiArIGIgKyAiXCciKTsKLSAgICAgICAgICAgIG5ldyBUaHJvd2FibGUoKS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgICAgIGFzc2VydCBmYWxzZTsKLSAgICAgICAgICAgIFN5c3RlbS5leGl0KDEpOwotICAgICAgICB9Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9KYXZhVGVzdC5zaCBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL0phdmFUZXN0LnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwOTk0NDdlLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL0phdmFUZXN0LnNoCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotIyEvYmluL2Jhc2gKLSMKLSMgQ29weXJpZ2h0IDIwMTQgR29vZ2xlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSMKLSMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0jIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotc2V0IC1vIGVycmV4aXQKLQotZWNobyBDb21waWxlIHRoZW4gcnVuIHRoZSBKYXZhIHRlc3QuCi0KLWphdmEgLXZlcnNpb24KLQotdGVzdGRpcj0kKGRpcm5hbWUgJDApCi0KLXRhcmdldGRpcj0iJHt0ZXN0ZGlyfS90YXJnZXQiCi0KLWlmIFtbIC1lICIke3RhcmdldGRpcn0iIF1dOyB0aGVuCi0gICAgZWNobyAiY2xlYW5pbmcgdGFyZ2V0IgotICAgIHJtIC1yZiAiJHt0YXJnZXRkaXJ9IgotZmkKLQotbWtkaXIgLXYgIiR7dGFyZ2V0ZGlyfSIKLQotaWYgISBmaW5kICIke3Rlc3RkaXJ9Ly4uL2phdmEiIC10eXBlIGYgLW5hbWUgIiouY2xhc3MiIC1kZWxldGU7IHRoZW4KLSAgICBlY2hvICJmYWlsZWQgdG8gY2xlYW4gLmNsYXNzIGZpbGVzIGZyb20gamF2YSBkaXJlY3RvcnkiID4mMgotICAgIGV4aXQgMQotZmkKLQotamF2YWMgLWQgIiR7dGFyZ2V0ZGlyfSIgLWNsYXNzcGF0aCAiJHt0ZXN0ZGlyfS9vcHRpb25hbF9zY2FsYXJzOiR7dGVzdGRpcn0vLi4vamF2YToke3Rlc3RkaXJ9OiR7dGVzdGRpcn0vbmFtZXNwYWNlX3Rlc3Q6JHt0ZXN0ZGlyfS91bmlvbl92ZWN0b3IiICIke3Rlc3RkaXJ9L0phdmFUZXN0LmphdmEiCi0KLShjZCAiJHt0ZXN0ZGlyfSIgJiYgamF2YSAtZWEgLWNsYXNzcGF0aCAiJHt0YXJnZXRkaXJ9IiBKYXZhVGVzdCApCi0KLXJtIC1yZiAiJHt0YXJnZXRkaXJ9IgpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvS2V5d29yZFRlc3QvS2V5d29yZHNJblRhYmxlLmNzIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvS2V5d29yZFRlc3QvS2V5d29yZHNJblRhYmxlLmNzCmluZGV4IDQ5NTY3MWIuLmFmMmEzNzUgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL0tleXdvcmRUZXN0L0tleXdvcmRzSW5UYWJsZS5jcworKysgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9LZXl3b3JkVGVzdC9LZXl3b3Jkc0luVGFibGUuY3MKQEAgLTcsMTMgKzcsMTMgQEAKIAogdXNpbmcgZ2xvYmFsOjpTeXN0ZW07CiB1c2luZyBnbG9iYWw6OlN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwotdXNpbmcgZ2xvYmFsOjpGbGF0QnVmZmVyczsKK3VzaW5nIGdsb2JhbDo6R29vZ2xlLkZsYXRCdWZmZXJzOwogCiBwdWJsaWMgc3RydWN0IEtleXdvcmRzSW5UYWJsZSA6IElGbGF0YnVmZmVyT2JqZWN0CiB7CiAgIHByaXZhdGUgVGFibGUgX19wOwogICBwdWJsaWMgQnl0ZUJ1ZmZlciBCeXRlQnVmZmVyIHsgZ2V0IHsgcmV0dXJuIF9fcC5iYjsgfSB9Ci0gIHB1YmxpYyBzdGF0aWMgdm9pZCBWYWxpZGF0ZVZlcnNpb24oKSB7IEZsYXRCdWZmZXJDb25zdGFudHMuRkxBVEJVRkZFUlNfMl8wXzAoKTsgfQorICBwdWJsaWMgc3RhdGljIHZvaWQgVmFsaWRhdGVWZXJzaW9uKCkgeyBGbGF0QnVmZmVyQ29uc3RhbnRzLkZMQVRCVUZGRVJTXzJfMF84KCk7IH0KICAgcHVibGljIHN0YXRpYyBLZXl3b3Jkc0luVGFibGUgR2V0Um9vdEFzS2V5d29yZHNJblRhYmxlKEJ5dGVCdWZmZXIgX2JiKSB7IHJldHVybiBHZXRSb290QXNLZXl3b3Jkc0luVGFibGUoX2JiLCBuZXcgS2V5d29yZHNJblRhYmxlKCkpOyB9CiAgIHB1YmxpYyBzdGF0aWMgS2V5d29yZHNJblRhYmxlIEdldFJvb3RBc0tleXdvcmRzSW5UYWJsZShCeXRlQnVmZmVyIF9iYiwgS2V5d29yZHNJblRhYmxlIG9iaikgeyByZXR1cm4gKG9iai5fX2Fzc2lnbihfYmIuR2V0SW50KF9iYi5Qb3NpdGlvbikgKyBfYmIuUG9zaXRpb24sIF9iYikpOyB9CiAgIHB1YmxpYyB2b2lkIF9faW5pdChpbnQgX2ksIEJ5dGVCdWZmZXIgX2JiKSB7IF9fcCA9IG5ldyBUYWJsZShfaSwgX2JiKTsgfQpAQCAtMjUsMjIgKzI1LDI3IEBACiAgIHB1YmxpYyBib29sIE11dGF0ZVByaXZhdGUoS2V5d29yZFRlc3QuQHB1YmxpYyBAcHJpdmF0ZSkgeyBpbnQgbyA9IF9fcC5fX29mZnNldCg2KTsgaWYgKG8gIT0gMCkgeyBfX3AuYmIuUHV0SW50KG8gKyBfX3AuYmJfcG9zLCAoaW50KUBwcml2YXRlKTsgcmV0dXJuIHRydWU7IH0gZWxzZSB7IHJldHVybiBmYWxzZTsgfSB9CiAgIHB1YmxpYyBpbnQgVHlwZSB7IGdldCB7IGludCBvID0gX19wLl9fb2Zmc2V0KDgpOyByZXR1cm4gbyAhPSAwID8gX19wLmJiLkdldEludChvICsgX19wLmJiX3BvcykgOiAoaW50KTA7IH0gfQogICBwdWJsaWMgYm9vbCBNdXRhdGVUeXBlKGludCB0eXBlKSB7IGludCBvID0gX19wLl9fb2Zmc2V0KDgpOyBpZiAobyAhPSAwKSB7IF9fcC5iYi5QdXRJbnQobyArIF9fcC5iYl9wb3MsIHR5cGUpOyByZXR1cm4gdHJ1ZTsgfSBlbHNlIHsgcmV0dXJuIGZhbHNlOyB9IH0KKyAgcHVibGljIGJvb2wgRGVmYXVsdCB7IGdldCB7IGludCBvID0gX19wLl9fb2Zmc2V0KDEwKTsgcmV0dXJuIG8gIT0gMCA/IDAhPV9fcC5iYi5HZXQobyArIF9fcC5iYl9wb3MpIDogKGJvb2wpZmFsc2U7IH0gfQorICBwdWJsaWMgYm9vbCBNdXRhdGVEZWZhdWx0KGJvb2wgQGRlZmF1bHQpIHsgaW50IG8gPSBfX3AuX19vZmZzZXQoMTApOyBpZiAobyAhPSAwKSB7IF9fcC5iYi5QdXQobyArIF9fcC5iYl9wb3MsIChieXRlKShAZGVmYXVsdCA/IDEgOiAwKSk7IHJldHVybiB0cnVlOyB9IGVsc2UgeyByZXR1cm4gZmFsc2U7IH0gfQogCiAgIHB1YmxpYyBzdGF0aWMgT2Zmc2V0PEtleXdvcmRUZXN0LktleXdvcmRzSW5UYWJsZT4gQ3JlYXRlS2V5d29yZHNJblRhYmxlKEZsYXRCdWZmZXJCdWlsZGVyIGJ1aWxkZXIsCiAgICAgICBLZXl3b3JkVGVzdC5BQkMgQGlzID0gS2V5d29yZFRlc3QuQUJDLkB2b2lkLAogICAgICAgS2V5d29yZFRlc3QuQHB1YmxpYyBAcHJpdmF0ZSA9IEtleXdvcmRUZXN0LkBwdWJsaWMuTk9ORSwKLSAgICAgIGludCB0eXBlID0gMCkgewotICAgIGJ1aWxkZXIuU3RhcnRUYWJsZSgzKTsKKyAgICAgIGludCB0eXBlID0gMCwKKyAgICAgIGJvb2wgQGRlZmF1bHQgPSBmYWxzZSkgeworICAgIGJ1aWxkZXIuU3RhcnRUYWJsZSg0KTsKICAgICBLZXl3b3Jkc0luVGFibGUuQWRkVHlwZShidWlsZGVyLCB0eXBlKTsKICAgICBLZXl3b3Jkc0luVGFibGUuQWRkUHJpdmF0ZShidWlsZGVyLCBAcHJpdmF0ZSk7CiAgICAgS2V5d29yZHNJblRhYmxlLkFkZElzKGJ1aWxkZXIsIEBpcyk7CisgICAgS2V5d29yZHNJblRhYmxlLkFkZERlZmF1bHQoYnVpbGRlciwgQGRlZmF1bHQpOwogICAgIHJldHVybiBLZXl3b3Jkc0luVGFibGUuRW5kS2V5d29yZHNJblRhYmxlKGJ1aWxkZXIpOwogICB9CiAKLSAgcHVibGljIHN0YXRpYyB2b2lkIFN0YXJ0S2V5d29yZHNJblRhYmxlKEZsYXRCdWZmZXJCdWlsZGVyIGJ1aWxkZXIpIHsgYnVpbGRlci5TdGFydFRhYmxlKDMpOyB9CisgIHB1YmxpYyBzdGF0aWMgdm9pZCBTdGFydEtleXdvcmRzSW5UYWJsZShGbGF0QnVmZmVyQnVpbGRlciBidWlsZGVyKSB7IGJ1aWxkZXIuU3RhcnRUYWJsZSg0KTsgfQogICBwdWJsaWMgc3RhdGljIHZvaWQgQWRkSXMoRmxhdEJ1ZmZlckJ1aWxkZXIgYnVpbGRlciwgS2V5d29yZFRlc3QuQUJDIEBpcykgeyBidWlsZGVyLkFkZEludCgwLCAoaW50KUBpcywgMCk7IH0KICAgcHVibGljIHN0YXRpYyB2b2lkIEFkZFByaXZhdGUoRmxhdEJ1ZmZlckJ1aWxkZXIgYnVpbGRlciwgS2V5d29yZFRlc3QuQHB1YmxpYyBAcHJpdmF0ZSkgeyBidWlsZGVyLkFkZEludCgxLCAoaW50KUBwcml2YXRlLCAwKTsgfQogICBwdWJsaWMgc3RhdGljIHZvaWQgQWRkVHlwZShGbGF0QnVmZmVyQnVpbGRlciBidWlsZGVyLCBpbnQgdHlwZSkgeyBidWlsZGVyLkFkZEludCgyLCB0eXBlLCAwKTsgfQorICBwdWJsaWMgc3RhdGljIHZvaWQgQWRkRGVmYXVsdChGbGF0QnVmZmVyQnVpbGRlciBidWlsZGVyLCBib29sIEBkZWZhdWx0KSB7IGJ1aWxkZXIuQWRkQm9vbCgzLCBAZGVmYXVsdCwgZmFsc2UpOyB9CiAgIHB1YmxpYyBzdGF0aWMgT2Zmc2V0PEtleXdvcmRUZXN0LktleXdvcmRzSW5UYWJsZT4gRW5kS2V5d29yZHNJblRhYmxlKEZsYXRCdWZmZXJCdWlsZGVyIGJ1aWxkZXIpIHsKICAgICBpbnQgbyA9IGJ1aWxkZXIuRW5kVGFibGUoKTsKICAgICByZXR1cm4gbmV3IE9mZnNldDxLZXl3b3JkVGVzdC5LZXl3b3Jkc0luVGFibGU+KG8pOwpAQCAtNTQsNiArNTksNyBAQAogICAgIF9vLklzID0gdGhpcy5JczsKICAgICBfby5Qcml2YXRlID0gdGhpcy5Qcml2YXRlOwogICAgIF9vLlR5cGUgPSB0aGlzLlR5cGU7CisgICAgX28uRGVmYXVsdCA9IHRoaXMuRGVmYXVsdDsKICAgfQogICBwdWJsaWMgc3RhdGljIE9mZnNldDxLZXl3b3JkVGVzdC5LZXl3b3Jkc0luVGFibGU+IFBhY2soRmxhdEJ1ZmZlckJ1aWxkZXIgYnVpbGRlciwgS2V5d29yZHNJblRhYmxlVCBfbykgewogICAgIGlmIChfbyA9PSBudWxsKSByZXR1cm4gZGVmYXVsdChPZmZzZXQ8S2V5d29yZFRlc3QuS2V5d29yZHNJblRhYmxlPik7CkBAIC02MSw3ICs2Nyw4IEBACiAgICAgICBidWlsZGVyLAogICAgICAgX28uSXMsCiAgICAgICBfby5Qcml2YXRlLAotICAgICAgX28uVHlwZSk7CisgICAgICBfby5UeXBlLAorICAgICAgX28uRGVmYXVsdCk7CiAgIH0KIH0KIApAQCAtNzMsMTEgKzgwLDE0IEBACiAgIHB1YmxpYyBLZXl3b3JkVGVzdC5AcHVibGljIFByaXZhdGUgeyBnZXQ7IHNldDsgfQogICBbTmV3dG9uc29mdC5Kc29uLkpzb25Qcm9wZXJ0eSgidHlwZSIpXQogICBwdWJsaWMgaW50IFR5cGUgeyBnZXQ7IHNldDsgfQorICBbTmV3dG9uc29mdC5Kc29uLkpzb25Qcm9wZXJ0eSgiZGVmYXVsdCIpXQorICBwdWJsaWMgYm9vbCBEZWZhdWx0IHsgZ2V0OyBzZXQ7IH0KIAogICBwdWJsaWMgS2V5d29yZHNJblRhYmxlVCgpIHsKICAgICB0aGlzLklzID0gS2V5d29yZFRlc3QuQUJDLkB2b2lkOwogICAgIHRoaXMuUHJpdmF0ZSA9IEtleXdvcmRUZXN0LkBwdWJsaWMuTk9ORTsKICAgICB0aGlzLlR5cGUgPSAwOworICAgIHRoaXMuRGVmYXVsdCA9IGZhbHNlOwogICB9CiB9CiAKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL0tleXdvcmRUZXN0L0tleXdvcmRzSW5Vbmlvbi5jcyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL0tleXdvcmRUZXN0L0tleXdvcmRzSW5Vbmlvbi5jcwppbmRleCA2OGMwNTBlLi4wZWZhMDY2IDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9LZXl3b3JkVGVzdC9LZXl3b3Jkc0luVW5pb24uY3MKKysrIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvS2V5d29yZFRlc3QvS2V5d29yZHNJblVuaW9uLmNzCkBAIC0yOCw3ICsyOCw3IEBACiAgIHB1YmxpYyBLZXl3b3JkVGVzdC5LZXl3b3Jkc0luVGFibGVUIEFzaW50ZXJuYWwoKSB7IHJldHVybiB0aGlzLkFzPEtleXdvcmRUZXN0LktleXdvcmRzSW5UYWJsZVQ+KCk7IH0KICAgcHVibGljIHN0YXRpYyBLZXl3b3Jkc0luVW5pb25VbmlvbiBGcm9taW50ZXJuYWwoS2V5d29yZFRlc3QuS2V5d29yZHNJblRhYmxlVCBfaW50ZXJuYWwpIHsgcmV0dXJuIG5ldyBLZXl3b3Jkc0luVW5pb25VbmlvbnsgVHlwZSA9IEtleXdvcmRzSW5Vbmlvbi5AaW50ZXJuYWwsIFZhbHVlID0gX2ludGVybmFsIH07IH0KIAotICBwdWJsaWMgc3RhdGljIGludCBQYWNrKEZsYXRCdWZmZXJzLkZsYXRCdWZmZXJCdWlsZGVyIGJ1aWxkZXIsIEtleXdvcmRzSW5VbmlvblVuaW9uIF9vKSB7CisgIHB1YmxpYyBzdGF0aWMgaW50IFBhY2soR29vZ2xlLkZsYXRCdWZmZXJzLkZsYXRCdWZmZXJCdWlsZGVyIGJ1aWxkZXIsIEtleXdvcmRzSW5VbmlvblVuaW9uIF9vKSB7CiAgICAgc3dpdGNoIChfby5UeXBlKSB7CiAgICAgICBkZWZhdWx0OiByZXR1cm4gMDsKICAgICAgIGNhc2UgS2V5d29yZHNJblVuaW9uLkBzdGF0aWM6IHJldHVybiBLZXl3b3JkVGVzdC5LZXl3b3Jkc0luVGFibGUuUGFjayhidWlsZGVyLCBfby5Bc3N0YXRpYygpKS5WYWx1ZTsKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL0tvdGxpblRlc3Qua3QgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9Lb3RsaW5UZXN0Lmt0CmluZGV4IGNmYjcwNTYuLjlhOGZlNWYgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL0tvdGxpblRlc3Qua3QKKysrIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvS290bGluVGVzdC5rdApAQCAtMTQsNiArMTQsNyBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAoraW1wb3J0IERpY3Rpb25hcnlMb29rdXAuKjsKIGltcG9ydCBNeUdhbWUuRXhhbXBsZS4qCiBpbXBvcnQgb3B0aW9uYWxfc2NhbGFycy4qCiBpbXBvcnQgY29tLmdvb2dsZS5mbGF0YnVmZmVycy5CeXRlQnVmZmVyVXRpbApAQCAtNzksOSArODAsMjkgQEAKIAogICAgICAgICBUZXN0U2hhcmVkU3RyaW5nUG9vbCgpCiAgICAgICAgIFRlc3RTY2FsYXJPcHRpb25hbCgpCisgICAgICAgIFRlc3REaWN0aW9uYXJ5TG9va3VwKCkKICAgICAgICAgcHJpbnRsbigiRmxhdEJ1ZmZlcnMgdGVzdDogY29tcGxldGVkIHN1Y2Nlc3NmdWxseSIpCiAgICAgfQogCisgICAgZnVuIFRlc3REaWN0aW9uYXJ5TG9va3VwKCkgeworICAgICAgICB2YWwgZmJiID0gRmxhdEJ1ZmZlckJ1aWxkZXIoMTYpCisgICAgICAgIHZhbCBsZkluZGV4ID0gTG9uZ0Zsb2F0RW50cnkuY3JlYXRlTG9uZ0Zsb2F0RW50cnkoZmJiLCAwLCA5OS4wZikKKyAgICAgICAgdmFsIHZlY3RvckVudHJpZXNJZHggPSBMb25nRmxvYXRNYXAuY3JlYXRlRW50cmllc1ZlY3RvcihmYmIsIGludEFycmF5T2YobGZJbmRleCkpCisgICAgICAgIHZhbCByb290SWR4ID0gTG9uZ0Zsb2F0TWFwLmNyZWF0ZUxvbmdGbG9hdE1hcChmYmIsIHZlY3RvckVudHJpZXNJZHgpCisKKyAgICAgICAgTG9uZ0Zsb2F0TWFwLmZpbmlzaExvbmdGbG9hdE1hcEJ1ZmZlcihmYmIsIHJvb3RJZHgpCisgICAgICAgIHZhbCBtYXAgPSBMb25nRmxvYXRNYXAuZ2V0Um9vdEFzTG9uZ0Zsb2F0TWFwKGZiYi5kYXRhQnVmZmVyKCkpCisgICAgICAgIGFzc2VydChtYXAuZW50cmllc0xlbmd0aCA9PSAxKQorCisgICAgICAgIHZhbCBlID0gbWFwLmVudHJpZXMoMCkhIQorICAgICAgICBhc3NlcnQoZS5rZXkgPT0gMEwpCisgICAgICAgIGFzc2VydChlLnZhbHVlID09IDk5LjBmKQorCisgICAgICAgIHZhbCBlMiA9IG1hcC5lbnRyaWVzQnlLZXkoMCkhIQorICAgICAgICBhc3NlcnQoZTIua2V5ID09IDBMKQorICAgICAgICBhc3NlcnQoZTIudmFsdWUgPT0gOTkuMGYpCisgICAgfQorCiAgICAgZnVuIFRlc3RFbnVtcygpIHsKICAgICAgICAgYXNzZXJ0KENvbG9yLm5hbWUoQ29sb3IuUmVkLnRvSW50KCkpID09ICJSZWQiKQogICAgICAgICBhc3NlcnQoQ29sb3IubmFtZShDb2xvci5CbHVlLnRvSW50KCkpID09ICJCbHVlIikKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL015R2FtZS9FeGFtcGxlL0FiaWxpdHkuY3MgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9NeUdhbWUvRXhhbXBsZS9BYmlsaXR5LmNzCmluZGV4IGFlNmE1YjQuLmUxOTQwNjMgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL015R2FtZS9FeGFtcGxlL0FiaWxpdHkuY3MKKysrIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvTXlHYW1lL0V4YW1wbGUvQWJpbGl0eS5jcwpAQCAtNyw3ICs3LDcgQEAKIAogdXNpbmcgZ2xvYmFsOjpTeXN0ZW07CiB1c2luZyBnbG9iYWw6OlN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwotdXNpbmcgZ2xvYmFsOjpGbGF0QnVmZmVyczsKK3VzaW5nIGdsb2JhbDo6R29vZ2xlLkZsYXRCdWZmZXJzOwogCiBwdWJsaWMgc3RydWN0IEFiaWxpdHkgOiBJRmxhdGJ1ZmZlck9iamVjdAogewpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvTXlHYW1lL0V4YW1wbGUvQWJpbGl0eS5nbyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL015R2FtZS9FeGFtcGxlL0FiaWxpdHkuZ28KaW5kZXggOTg1MmE3NS4uYWU4NjlhYSAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvTXlHYW1lL0V4YW1wbGUvQWJpbGl0eS5nbworKysgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9NeUdhbWUvRXhhbXBsZS9BYmlsaXR5LmdvCkBAIC03LDggKzcsOCBAQAogKQogCiB0eXBlIEFiaWxpdHlUIHN0cnVjdCB7Ci0JSWQgdWludDMyCi0JRGlzdGFuY2UgdWludDMyCisJSWQgdWludDMyIGBqc29uOiJpZCJgCisJRGlzdGFuY2UgdWludDMyIGBqc29uOiJkaXN0YW5jZSJgCiB9CiAKIGZ1bmMgKHQgKkFiaWxpdHlUKSBQYWNrKGJ1aWxkZXIgKmZsYXRidWZmZXJzLkJ1aWxkZXIpIGZsYXRidWZmZXJzLlVPZmZzZXRUIHsKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL015R2FtZS9FeGFtcGxlL0FiaWxpdHkubHVhIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvTXlHYW1lL0V4YW1wbGUvQWJpbGl0eS5sdWEKaW5kZXggODcwZmY4MS4uMDFjNzQ4MCAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvTXlHYW1lL0V4YW1wbGUvQWJpbGl0eS5sdWEKKysrIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvTXlHYW1lL0V4YW1wbGUvQWJpbGl0eS5sdWEKQEAgLTMsNyArMyw3IEBACiAgIEF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGJ5IHRoZSBGbGF0QnVmZmVycyBjb21waWxlciwgZG8gbm90IG1vZGlmeS4KICAgT3IgbW9kaWZ5LiBJJ20gYSBtZXNzYWdlLCBub3QgYSBjb3AuCiAKLSAgZmxhdGMgdmVyc2lvbjogMi4wLjYKKyAgZmxhdGMgdmVyc2lvbjogMi4wLjgKIAogICBEZWNsYXJlZCBieSAgOiAvL21vbnN0ZXJfdGVzdC5mYnMKICAgUm9vdGluZyB0eXBlIDogTXlHYW1lLkV4YW1wbGUuTW9uc3RlciAoLy9tb25zdGVyX3Rlc3QuZmJzKQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvTXlHYW1lL0V4YW1wbGUvQW55LmNzIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvTXlHYW1lL0V4YW1wbGUvQW55LmNzCmluZGV4IDJlMTcxN2IuLjkwY2QyMmIgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL015R2FtZS9FeGFtcGxlL0FueS5jcworKysgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9NeUdhbWUvRXhhbXBsZS9BbnkuY3MKQEAgLTMxLDcgKzMxLDcgQEAKICAgcHVibGljIE15R2FtZS5FeGFtcGxlMi5Nb25zdGVyVCBBc015R2FtZV9FeGFtcGxlMl9Nb25zdGVyKCkgeyByZXR1cm4gdGhpcy5BczxNeUdhbWUuRXhhbXBsZTIuTW9uc3RlclQ+KCk7IH0KICAgcHVibGljIHN0YXRpYyBBbnlVbmlvbiBGcm9tTXlHYW1lX0V4YW1wbGUyX01vbnN0ZXIoTXlHYW1lLkV4YW1wbGUyLk1vbnN0ZXJUIF9teWdhbWVfZXhhbXBsZTJfbW9uc3RlcikgeyByZXR1cm4gbmV3IEFueVVuaW9ueyBUeXBlID0gQW55Lk15R2FtZV9FeGFtcGxlMl9Nb25zdGVyLCBWYWx1ZSA9IF9teWdhbWVfZXhhbXBsZTJfbW9uc3RlciB9OyB9CiAKLSAgcHVibGljIHN0YXRpYyBpbnQgUGFjayhGbGF0QnVmZmVycy5GbGF0QnVmZmVyQnVpbGRlciBidWlsZGVyLCBBbnlVbmlvbiBfbykgeworICBwdWJsaWMgc3RhdGljIGludCBQYWNrKEdvb2dsZS5GbGF0QnVmZmVycy5GbGF0QnVmZmVyQnVpbGRlciBidWlsZGVyLCBBbnlVbmlvbiBfbykgewogICAgIHN3aXRjaCAoX28uVHlwZSkgewogICAgICAgZGVmYXVsdDogcmV0dXJuIDA7CiAgICAgICBjYXNlIEFueS5Nb25zdGVyOiByZXR1cm4gTXlHYW1lLkV4YW1wbGUuTW9uc3Rlci5QYWNrKGJ1aWxkZXIsIF9vLkFzTW9uc3RlcigpKS5WYWx1ZTsKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL015R2FtZS9FeGFtcGxlL0FueS5sdWEgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9NeUdhbWUvRXhhbXBsZS9BbnkubHVhCmluZGV4IDc2OWEyMjQuLmI5OWY0YzYgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL015R2FtZS9FeGFtcGxlL0FueS5sdWEKKysrIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvTXlHYW1lL0V4YW1wbGUvQW55Lmx1YQpAQCAtMyw3ICszLDcgQEAKICAgQXV0b21hdGljYWxseSBnZW5lcmF0ZWQgYnkgdGhlIEZsYXRCdWZmZXJzIGNvbXBpbGVyLCBkbyBub3QgbW9kaWZ5LgogICBPciBtb2RpZnkuIEknbSBhIG1lc3NhZ2UsIG5vdCBhIGNvcC4KIAotICBmbGF0YyB2ZXJzaW9uOiAyLjAuNgorICBmbGF0YyB2ZXJzaW9uOiAyLjAuOAogCiAgIERlY2xhcmVkIGJ5ICA6IC8vbW9uc3Rlcl90ZXN0LmZicwogICBSb290aW5nIHR5cGUgOiBNeUdhbWUuRXhhbXBsZS5Nb25zdGVyICgvL21vbnN0ZXJfdGVzdC5mYnMpCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9NeUdhbWUvRXhhbXBsZS9BbnlBbWJpZ3VvdXNBbGlhc2VzLmNzIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvTXlHYW1lL0V4YW1wbGUvQW55QW1iaWd1b3VzQWxpYXNlcy5jcwppbmRleCA5MjUzY2M5Li5lZWM0MTcyIDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9NeUdhbWUvRXhhbXBsZS9BbnlBbWJpZ3VvdXNBbGlhc2VzLmNzCisrKyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL015R2FtZS9FeGFtcGxlL0FueUFtYmlndW91c0FsaWFzZXMuY3MKQEAgLTMxLDcgKzMxLDcgQEAKICAgcHVibGljIE15R2FtZS5FeGFtcGxlLk1vbnN0ZXJUIEFzTTMoKSB7IHJldHVybiB0aGlzLkFzPE15R2FtZS5FeGFtcGxlLk1vbnN0ZXJUPigpOyB9CiAgIHB1YmxpYyBzdGF0aWMgQW55QW1iaWd1b3VzQWxpYXNlc1VuaW9uIEZyb21NMyhNeUdhbWUuRXhhbXBsZS5Nb25zdGVyVCBfbTMpIHsgcmV0dXJuIG5ldyBBbnlBbWJpZ3VvdXNBbGlhc2VzVW5pb257IFR5cGUgPSBBbnlBbWJpZ3VvdXNBbGlhc2VzLk0zLCBWYWx1ZSA9IF9tMyB9OyB9CiAKLSAgcHVibGljIHN0YXRpYyBpbnQgUGFjayhGbGF0QnVmZmVycy5GbGF0QnVmZmVyQnVpbGRlciBidWlsZGVyLCBBbnlBbWJpZ3VvdXNBbGlhc2VzVW5pb24gX28pIHsKKyAgcHVibGljIHN0YXRpYyBpbnQgUGFjayhHb29nbGUuRmxhdEJ1ZmZlcnMuRmxhdEJ1ZmZlckJ1aWxkZXIgYnVpbGRlciwgQW55QW1iaWd1b3VzQWxpYXNlc1VuaW9uIF9vKSB7CiAgICAgc3dpdGNoIChfby5UeXBlKSB7CiAgICAgICBkZWZhdWx0OiByZXR1cm4gMDsKICAgICAgIGNhc2UgQW55QW1iaWd1b3VzQWxpYXNlcy5NMTogcmV0dXJuIE15R2FtZS5FeGFtcGxlLk1vbnN0ZXIuUGFjayhidWlsZGVyLCBfby5Bc00xKCkpLlZhbHVlOwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvTXlHYW1lL0V4YW1wbGUvQW55QW1iaWd1b3VzQWxpYXNlcy5sdWEgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9NeUdhbWUvRXhhbXBsZS9BbnlBbWJpZ3VvdXNBbGlhc2VzLmx1YQppbmRleCBjMGQzNDA3Li4wZDYxMDZjIDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9NeUdhbWUvRXhhbXBsZS9BbnlBbWJpZ3VvdXNBbGlhc2VzLmx1YQorKysgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9NeUdhbWUvRXhhbXBsZS9BbnlBbWJpZ3VvdXNBbGlhc2VzLmx1YQpAQCAtMyw3ICszLDcgQEAKICAgQXV0b21hdGljYWxseSBnZW5lcmF0ZWQgYnkgdGhlIEZsYXRCdWZmZXJzIGNvbXBpbGVyLCBkbyBub3QgbW9kaWZ5LgogICBPciBtb2RpZnkuIEknbSBhIG1lc3NhZ2UsIG5vdCBhIGNvcC4KIAotICBmbGF0YyB2ZXJzaW9uOiAyLjAuNgorICBmbGF0YyB2ZXJzaW9uOiAyLjAuOAogCiAgIERlY2xhcmVkIGJ5ICA6IC8vbW9uc3Rlcl90ZXN0LmZicwogICBSb290aW5nIHR5cGUgOiBNeUdhbWUuRXhhbXBsZS5Nb25zdGVyICgvL21vbnN0ZXJfdGVzdC5mYnMpCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9NeUdhbWUvRXhhbXBsZS9BbnlVbmlxdWVBbGlhc2VzLmNzIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvTXlHYW1lL0V4YW1wbGUvQW55VW5pcXVlQWxpYXNlcy5jcwppbmRleCBhYjMzMjc2Li5iYjZhMjEyIDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9NeUdhbWUvRXhhbXBsZS9BbnlVbmlxdWVBbGlhc2VzLmNzCisrKyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL015R2FtZS9FeGFtcGxlL0FueVVuaXF1ZUFsaWFzZXMuY3MKQEAgLTMxLDcgKzMxLDcgQEAKICAgcHVibGljIE15R2FtZS5FeGFtcGxlMi5Nb25zdGVyVCBBc00yKCkgeyByZXR1cm4gdGhpcy5BczxNeUdhbWUuRXhhbXBsZTIuTW9uc3RlclQ+KCk7IH0KICAgcHVibGljIHN0YXRpYyBBbnlVbmlxdWVBbGlhc2VzVW5pb24gRnJvbU0yKE15R2FtZS5FeGFtcGxlMi5Nb25zdGVyVCBfbTIpIHsgcmV0dXJuIG5ldyBBbnlVbmlxdWVBbGlhc2VzVW5pb257IFR5cGUgPSBBbnlVbmlxdWVBbGlhc2VzLk0yLCBWYWx1ZSA9IF9tMiB9OyB9CiAKLSAgcHVibGljIHN0YXRpYyBpbnQgUGFjayhGbGF0QnVmZmVycy5GbGF0QnVmZmVyQnVpbGRlciBidWlsZGVyLCBBbnlVbmlxdWVBbGlhc2VzVW5pb24gX28pIHsKKyAgcHVibGljIHN0YXRpYyBpbnQgUGFjayhHb29nbGUuRmxhdEJ1ZmZlcnMuRmxhdEJ1ZmZlckJ1aWxkZXIgYnVpbGRlciwgQW55VW5pcXVlQWxpYXNlc1VuaW9uIF9vKSB7CiAgICAgc3dpdGNoIChfby5UeXBlKSB7CiAgICAgICBkZWZhdWx0OiByZXR1cm4gMDsKICAgICAgIGNhc2UgQW55VW5pcXVlQWxpYXNlcy5NOiByZXR1cm4gTXlHYW1lLkV4YW1wbGUuTW9uc3Rlci5QYWNrKGJ1aWxkZXIsIF9vLkFzTSgpKS5WYWx1ZTsKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL015R2FtZS9FeGFtcGxlL0FueVVuaXF1ZUFsaWFzZXMubHVhIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvTXlHYW1lL0V4YW1wbGUvQW55VW5pcXVlQWxpYXNlcy5sdWEKaW5kZXggMDA0MmI5My4uN2FiNGY5YyAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvTXlHYW1lL0V4YW1wbGUvQW55VW5pcXVlQWxpYXNlcy5sdWEKKysrIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvTXlHYW1lL0V4YW1wbGUvQW55VW5pcXVlQWxpYXNlcy5sdWEKQEAgLTMsNyArMyw3IEBACiAgIEF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGJ5IHRoZSBGbGF0QnVmZmVycyBjb21waWxlciwgZG8gbm90IG1vZGlmeS4KICAgT3IgbW9kaWZ5LiBJJ20gYSBtZXNzYWdlLCBub3QgYSBjb3AuCiAKLSAgZmxhdGMgdmVyc2lvbjogMi4wLjYKKyAgZmxhdGMgdmVyc2lvbjogMi4wLjgKIAogICBEZWNsYXJlZCBieSAgOiAvL21vbnN0ZXJfdGVzdC5mYnMKICAgUm9vdGluZyB0eXBlIDogTXlHYW1lLkV4YW1wbGUuTW9uc3RlciAoLy9tb25zdGVyX3Rlc3QuZmJzKQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvTXlHYW1lL0V4YW1wbGUvQXJyYXlTdHJ1Y3QuY3MgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9NeUdhbWUvRXhhbXBsZS9BcnJheVN0cnVjdC5jcwppbmRleCBkZjBlMmFjLi43MGE4YmRkIDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9NeUdhbWUvRXhhbXBsZS9BcnJheVN0cnVjdC5jcworKysgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9NeUdhbWUvRXhhbXBsZS9BcnJheVN0cnVjdC5jcwpAQCAtNyw3ICs3LDcgQEAKIAogdXNpbmcgZ2xvYmFsOjpTeXN0ZW07CiB1c2luZyBnbG9iYWw6OlN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwotdXNpbmcgZ2xvYmFsOjpGbGF0QnVmZmVyczsKK3VzaW5nIGdsb2JhbDo6R29vZ2xlLkZsYXRCdWZmZXJzOwogCiBwdWJsaWMgc3RydWN0IEFycmF5U3RydWN0IDogSUZsYXRidWZmZXJPYmplY3QKIHsKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL015R2FtZS9FeGFtcGxlL0FycmF5VGFibGUuY3MgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9NeUdhbWUvRXhhbXBsZS9BcnJheVRhYmxlLmNzCmluZGV4IDlkYzNkNDUuLmE1ZTRlNzkgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL015R2FtZS9FeGFtcGxlL0FycmF5VGFibGUuY3MKKysrIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvTXlHYW1lL0V4YW1wbGUvQXJyYXlUYWJsZS5jcwpAQCAtNywxMyArNywxMyBAQAogCiB1c2luZyBnbG9iYWw6OlN5c3RlbTsKIHVzaW5nIGdsb2JhbDo6U3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Ci11c2luZyBnbG9iYWw6OkZsYXRCdWZmZXJzOwordXNpbmcgZ2xvYmFsOjpHb29nbGUuRmxhdEJ1ZmZlcnM7CiAKIHB1YmxpYyBzdHJ1Y3QgQXJyYXlUYWJsZSA6IElGbGF0YnVmZmVyT2JqZWN0CiB7CiAgIHByaXZhdGUgVGFibGUgX19wOwogICBwdWJsaWMgQnl0ZUJ1ZmZlciBCeXRlQnVmZmVyIHsgZ2V0IHsgcmV0dXJuIF9fcC5iYjsgfSB9Ci0gIHB1YmxpYyBzdGF0aWMgdm9pZCBWYWxpZGF0ZVZlcnNpb24oKSB7IEZsYXRCdWZmZXJDb25zdGFudHMuRkxBVEJVRkZFUlNfMl8wXzAoKTsgfQorICBwdWJsaWMgc3RhdGljIHZvaWQgVmFsaWRhdGVWZXJzaW9uKCkgeyBGbGF0QnVmZmVyQ29uc3RhbnRzLkZMQVRCVUZGRVJTXzJfMF84KCk7IH0KICAgcHVibGljIHN0YXRpYyBBcnJheVRhYmxlIEdldFJvb3RBc0FycmF5VGFibGUoQnl0ZUJ1ZmZlciBfYmIpIHsgcmV0dXJuIEdldFJvb3RBc0FycmF5VGFibGUoX2JiLCBuZXcgQXJyYXlUYWJsZSgpKTsgfQogICBwdWJsaWMgc3RhdGljIEFycmF5VGFibGUgR2V0Um9vdEFzQXJyYXlUYWJsZShCeXRlQnVmZmVyIF9iYiwgQXJyYXlUYWJsZSBvYmopIHsgcmV0dXJuIChvYmouX19hc3NpZ24oX2JiLkdldEludChfYmIuUG9zaXRpb24pICsgX2JiLlBvc2l0aW9uLCBfYmIpKTsgfQogICBwdWJsaWMgc3RhdGljIGJvb2wgQXJyYXlUYWJsZUJ1ZmZlckhhc0lkZW50aWZpZXIoQnl0ZUJ1ZmZlciBfYmIpIHsgcmV0dXJuIFRhYmxlLl9faGFzX2lkZW50aWZpZXIoX2JiLCAiQVJSVCIpOyB9CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9NeUdhbWUvRXhhbXBsZS9BcnJheVRhYmxlLmphdmEgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9NeUdhbWUvRXhhbXBsZS9BcnJheVRhYmxlLmphdmEKaW5kZXggOGUzNzgyYi4uYzI1NWRhMyAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvTXlHYW1lL0V4YW1wbGUvQXJyYXlUYWJsZS5qYXZhCisrKyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL015R2FtZS9FeGFtcGxlL0FycmF5VGFibGUuamF2YQpAQCAtOSw3ICs5LDcgQEAKIAogQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpCiBwdWJsaWMgZmluYWwgY2xhc3MgQXJyYXlUYWJsZSBleHRlbmRzIFRhYmxlIHsKLSAgcHVibGljIHN0YXRpYyB2b2lkIFZhbGlkYXRlVmVyc2lvbigpIHsgQ29uc3RhbnRzLkZMQVRCVUZGRVJTXzJfMF8wKCk7IH0KKyAgcHVibGljIHN0YXRpYyB2b2lkIFZhbGlkYXRlVmVyc2lvbigpIHsgQ29uc3RhbnRzLkZMQVRCVUZGRVJTXzJfMF84KCk7IH0KICAgcHVibGljIHN0YXRpYyBBcnJheVRhYmxlIGdldFJvb3RBc0FycmF5VGFibGUoQnl0ZUJ1ZmZlciBfYmIpIHsgcmV0dXJuIGdldFJvb3RBc0FycmF5VGFibGUoX2JiLCBuZXcgQXJyYXlUYWJsZSgpKTsgfQogICBwdWJsaWMgc3RhdGljIEFycmF5VGFibGUgZ2V0Um9vdEFzQXJyYXlUYWJsZShCeXRlQnVmZmVyIF9iYiwgQXJyYXlUYWJsZSBvYmopIHsgX2JiLm9yZGVyKEJ5dGVPcmRlci5MSVRUTEVfRU5ESUFOKTsgcmV0dXJuIChvYmouX19hc3NpZ24oX2JiLmdldEludChfYmIucG9zaXRpb24oKSkgKyBfYmIucG9zaXRpb24oKSwgX2JiKSk7IH0KICAgcHVibGljIHN0YXRpYyBib29sZWFuIEFycmF5VGFibGVCdWZmZXJIYXNJZGVudGlmaWVyKEJ5dGVCdWZmZXIgX2JiKSB7IHJldHVybiBfX2hhc19pZGVudGlmaWVyKF9iYiwgIkFSUlQiKTsgfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvTXlHYW1lL0V4YW1wbGUvQ29sb3IubHVhIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvTXlHYW1lL0V4YW1wbGUvQ29sb3IubHVhCmluZGV4IDE5MDlhMWIuLmM3YTBiMWUgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL015R2FtZS9FeGFtcGxlL0NvbG9yLmx1YQorKysgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9NeUdhbWUvRXhhbXBsZS9Db2xvci5sdWEKQEAgLTMsNyArMyw3IEBACiAgIEF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGJ5IHRoZSBGbGF0QnVmZmVycyBjb21waWxlciwgZG8gbm90IG1vZGlmeS4KICAgT3IgbW9kaWZ5LiBJJ20gYSBtZXNzYWdlLCBub3QgYSBjb3AuCiAKLSAgZmxhdGMgdmVyc2lvbjogMi4wLjYKKyAgZmxhdGMgdmVyc2lvbjogMi4wLjgKIAogICBEZWNsYXJlZCBieSAgOiAvL21vbnN0ZXJfdGVzdC5mYnMKICAgUm9vdGluZyB0eXBlIDogTXlHYW1lLkV4YW1wbGUuTW9uc3RlciAoLy9tb25zdGVyX3Rlc3QuZmJzKQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvTXlHYW1lL0V4YW1wbGUvTG9uZ0VudW0ubHVhIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvTXlHYW1lL0V4YW1wbGUvTG9uZ0VudW0ubHVhCmluZGV4IDAwZmI2NzkuLmE0ZTNkYzUgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL015R2FtZS9FeGFtcGxlL0xvbmdFbnVtLmx1YQorKysgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9NeUdhbWUvRXhhbXBsZS9Mb25nRW51bS5sdWEKQEAgLTMsNyArMyw3IEBACiAgIEF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGJ5IHRoZSBGbGF0QnVmZmVycyBjb21waWxlciwgZG8gbm90IG1vZGlmeS4KICAgT3IgbW9kaWZ5LiBJJ20gYSBtZXNzYWdlLCBub3QgYSBjb3AuCiAKLSAgZmxhdGMgdmVyc2lvbjogMi4wLjYKKyAgZmxhdGMgdmVyc2lvbjogMi4wLjgKIAogICBEZWNsYXJlZCBieSAgOiAvL21vbnN0ZXJfdGVzdC5mYnMKICAgUm9vdGluZyB0eXBlIDogTXlHYW1lLkV4YW1wbGUuTW9uc3RlciAoLy9tb25zdGVyX3Rlc3QuZmJzKQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvTXlHYW1lL0V4YW1wbGUvTW9uc3Rlci5jcyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL015R2FtZS9FeGFtcGxlL01vbnN0ZXIuY3MKaW5kZXggNGExMTM4OS4uODdkOGVmMyAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvTXlHYW1lL0V4YW1wbGUvTW9uc3Rlci5jcworKysgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9NeUdhbWUvRXhhbXBsZS9Nb25zdGVyLmNzCkBAIC03LDE0ICs3LDE0IEBACiAKIHVzaW5nIGdsb2JhbDo6U3lzdGVtOwogdXNpbmcgZ2xvYmFsOjpTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKLXVzaW5nIGdsb2JhbDo6RmxhdEJ1ZmZlcnM7Cit1c2luZyBnbG9iYWw6Okdvb2dsZS5GbGF0QnVmZmVyczsKIAogLy8vIGFuIGV4YW1wbGUgZG9jdW1lbnRhdGlvbiBjb21tZW50OiAibW9uc3RlciBvYmplY3QiCiBwdWJsaWMgc3RydWN0IE1vbnN0ZXIgOiBJRmxhdGJ1ZmZlck9iamVjdAogewogICBwcml2YXRlIFRhYmxlIF9fcDsKICAgcHVibGljIEJ5dGVCdWZmZXIgQnl0ZUJ1ZmZlciB7IGdldCB7IHJldHVybiBfX3AuYmI7IH0gfQotICBwdWJsaWMgc3RhdGljIHZvaWQgVmFsaWRhdGVWZXJzaW9uKCkgeyBGbGF0QnVmZmVyQ29uc3RhbnRzLkZMQVRCVUZGRVJTXzJfMF8wKCk7IH0KKyAgcHVibGljIHN0YXRpYyB2b2lkIFZhbGlkYXRlVmVyc2lvbigpIHsgRmxhdEJ1ZmZlckNvbnN0YW50cy5GTEFUQlVGRkVSU18yXzBfOCgpOyB9CiAgIHB1YmxpYyBzdGF0aWMgTW9uc3RlciBHZXRSb290QXNNb25zdGVyKEJ5dGVCdWZmZXIgX2JiKSB7IHJldHVybiBHZXRSb290QXNNb25zdGVyKF9iYiwgbmV3IE1vbnN0ZXIoKSk7IH0KICAgcHVibGljIHN0YXRpYyBNb25zdGVyIEdldFJvb3RBc01vbnN0ZXIoQnl0ZUJ1ZmZlciBfYmIsIE1vbnN0ZXIgb2JqKSB7IHJldHVybiAob2JqLl9fYXNzaWduKF9iYi5HZXRJbnQoX2JiLlBvc2l0aW9uKSArIF9iYi5Qb3NpdGlvbiwgX2JiKSk7IH0KICAgcHVibGljIHN0YXRpYyBib29sIE1vbnN0ZXJCdWZmZXJIYXNJZGVudGlmaWVyKEJ5dGVCdWZmZXIgX2JiKSB7IHJldHVybiBUYWJsZS5fX2hhc19pZGVudGlmaWVyKF9iYiwgIk1PTlMiKTsgfQpAQCAtMzM1LDYgKzMzNSw4IEBACiAgIHB1YmxpYyBzdGF0aWMgdm9pZCBBZGRJbnZlbnRvcnkoRmxhdEJ1ZmZlckJ1aWxkZXIgYnVpbGRlciwgVmVjdG9yT2Zmc2V0IGludmVudG9yeU9mZnNldCkgeyBidWlsZGVyLkFkZE9mZnNldCg1LCBpbnZlbnRvcnlPZmZzZXQuVmFsdWUsIDApOyB9CiAgIHB1YmxpYyBzdGF0aWMgVmVjdG9yT2Zmc2V0IENyZWF0ZUludmVudG9yeVZlY3RvcihGbGF0QnVmZmVyQnVpbGRlciBidWlsZGVyLCBieXRlW10gZGF0YSkgeyBidWlsZGVyLlN0YXJ0VmVjdG9yKDEsIGRhdGEuTGVuZ3RoLCAxKTsgZm9yIChpbnQgaSA9IGRhdGEuTGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIGJ1aWxkZXIuQWRkQnl0ZShkYXRhW2ldKTsgcmV0dXJuIGJ1aWxkZXIuRW5kVmVjdG9yKCk7IH0KICAgcHVibGljIHN0YXRpYyBWZWN0b3JPZmZzZXQgQ3JlYXRlSW52ZW50b3J5VmVjdG9yQmxvY2soRmxhdEJ1ZmZlckJ1aWxkZXIgYnVpbGRlciwgYnl0ZVtdIGRhdGEpIHsgYnVpbGRlci5TdGFydFZlY3RvcigxLCBkYXRhLkxlbmd0aCwgMSk7IGJ1aWxkZXIuQWRkKGRhdGEpOyByZXR1cm4gYnVpbGRlci5FbmRWZWN0b3IoKTsgfQorICBwdWJsaWMgc3RhdGljIFZlY3Rvck9mZnNldCBDcmVhdGVJbnZlbnRvcnlWZWN0b3JCbG9jayhGbGF0QnVmZmVyQnVpbGRlciBidWlsZGVyLCBBcnJheVNlZ21lbnQ8Ynl0ZT4gZGF0YSkgeyBidWlsZGVyLlN0YXJ0VmVjdG9yKDEsIGRhdGEuQ291bnQsIDEpOyBidWlsZGVyLkFkZChkYXRhKTsgcmV0dXJuIGJ1aWxkZXIuRW5kVmVjdG9yKCk7IH0KKyAgcHVibGljIHN0YXRpYyBWZWN0b3JPZmZzZXQgQ3JlYXRlSW52ZW50b3J5VmVjdG9yQmxvY2soRmxhdEJ1ZmZlckJ1aWxkZXIgYnVpbGRlciwgSW50UHRyIGRhdGFQdHIsIGludCBzaXplSW5CeXRlcykgeyBidWlsZGVyLlN0YXJ0VmVjdG9yKDEsIHNpemVJbkJ5dGVzLCAxKTsgYnVpbGRlci5BZGQ8Ynl0ZT4oZGF0YVB0ciwgc2l6ZUluQnl0ZXMpOyByZXR1cm4gYnVpbGRlci5FbmRWZWN0b3IoKTsgfQogICBwdWJsaWMgc3RhdGljIHZvaWQgU3RhcnRJbnZlbnRvcnlWZWN0b3IoRmxhdEJ1ZmZlckJ1aWxkZXIgYnVpbGRlciwgaW50IG51bUVsZW1zKSB7IGJ1aWxkZXIuU3RhcnRWZWN0b3IoMSwgbnVtRWxlbXMsIDEpOyB9CiAgIHB1YmxpYyBzdGF0aWMgdm9pZCBBZGRDb2xvcihGbGF0QnVmZmVyQnVpbGRlciBidWlsZGVyLCBNeUdhbWUuRXhhbXBsZS5Db2xvciBjb2xvcikgeyBidWlsZGVyLkFkZEJ5dGUoNiwgKGJ5dGUpY29sb3IsIDgpOyB9CiAgIHB1YmxpYyBzdGF0aWMgdm9pZCBBZGRUZXN0VHlwZShGbGF0QnVmZmVyQnVpbGRlciBidWlsZGVyLCBNeUdhbWUuRXhhbXBsZS5BbnkgdGVzdFR5cGUpIHsgYnVpbGRlci5BZGRCeXRlKDcsIChieXRlKXRlc3RUeXBlLCAwKTsgfQpAQCAtMzQ0LDE1ICszNDYsMjEgQEAKICAgcHVibGljIHN0YXRpYyB2b2lkIEFkZFRlc3RhcnJheW9mc3RyaW5nKEZsYXRCdWZmZXJCdWlsZGVyIGJ1aWxkZXIsIFZlY3Rvck9mZnNldCB0ZXN0YXJyYXlvZnN0cmluZ09mZnNldCkgeyBidWlsZGVyLkFkZE9mZnNldCgxMCwgdGVzdGFycmF5b2ZzdHJpbmdPZmZzZXQuVmFsdWUsIDApOyB9CiAgIHB1YmxpYyBzdGF0aWMgVmVjdG9yT2Zmc2V0IENyZWF0ZVRlc3RhcnJheW9mc3RyaW5nVmVjdG9yKEZsYXRCdWZmZXJCdWlsZGVyIGJ1aWxkZXIsIFN0cmluZ09mZnNldFtdIGRhdGEpIHsgYnVpbGRlci5TdGFydFZlY3Rvcig0LCBkYXRhLkxlbmd0aCwgNCk7IGZvciAoaW50IGkgPSBkYXRhLkxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSBidWlsZGVyLkFkZE9mZnNldChkYXRhW2ldLlZhbHVlKTsgcmV0dXJuIGJ1aWxkZXIuRW5kVmVjdG9yKCk7IH0KICAgcHVibGljIHN0YXRpYyBWZWN0b3JPZmZzZXQgQ3JlYXRlVGVzdGFycmF5b2ZzdHJpbmdWZWN0b3JCbG9jayhGbGF0QnVmZmVyQnVpbGRlciBidWlsZGVyLCBTdHJpbmdPZmZzZXRbXSBkYXRhKSB7IGJ1aWxkZXIuU3RhcnRWZWN0b3IoNCwgZGF0YS5MZW5ndGgsIDQpOyBidWlsZGVyLkFkZChkYXRhKTsgcmV0dXJuIGJ1aWxkZXIuRW5kVmVjdG9yKCk7IH0KKyAgcHVibGljIHN0YXRpYyBWZWN0b3JPZmZzZXQgQ3JlYXRlVGVzdGFycmF5b2ZzdHJpbmdWZWN0b3JCbG9jayhGbGF0QnVmZmVyQnVpbGRlciBidWlsZGVyLCBBcnJheVNlZ21lbnQ8U3RyaW5nT2Zmc2V0PiBkYXRhKSB7IGJ1aWxkZXIuU3RhcnRWZWN0b3IoNCwgZGF0YS5Db3VudCwgNCk7IGJ1aWxkZXIuQWRkKGRhdGEpOyByZXR1cm4gYnVpbGRlci5FbmRWZWN0b3IoKTsgfQorICBwdWJsaWMgc3RhdGljIFZlY3Rvck9mZnNldCBDcmVhdGVUZXN0YXJyYXlvZnN0cmluZ1ZlY3RvckJsb2NrKEZsYXRCdWZmZXJCdWlsZGVyIGJ1aWxkZXIsIEludFB0ciBkYXRhUHRyLCBpbnQgc2l6ZUluQnl0ZXMpIHsgYnVpbGRlci5TdGFydFZlY3RvcigxLCBzaXplSW5CeXRlcywgMSk7IGJ1aWxkZXIuQWRkPFN0cmluZ09mZnNldD4oZGF0YVB0ciwgc2l6ZUluQnl0ZXMpOyByZXR1cm4gYnVpbGRlci5FbmRWZWN0b3IoKTsgfQogICBwdWJsaWMgc3RhdGljIHZvaWQgU3RhcnRUZXN0YXJyYXlvZnN0cmluZ1ZlY3RvcihGbGF0QnVmZmVyQnVpbGRlciBidWlsZGVyLCBpbnQgbnVtRWxlbXMpIHsgYnVpbGRlci5TdGFydFZlY3Rvcig0LCBudW1FbGVtcywgNCk7IH0KICAgcHVibGljIHN0YXRpYyB2b2lkIEFkZFRlc3RhcnJheW9mdGFibGVzKEZsYXRCdWZmZXJCdWlsZGVyIGJ1aWxkZXIsIFZlY3Rvck9mZnNldCB0ZXN0YXJyYXlvZnRhYmxlc09mZnNldCkgeyBidWlsZGVyLkFkZE9mZnNldCgxMSwgdGVzdGFycmF5b2Z0YWJsZXNPZmZzZXQuVmFsdWUsIDApOyB9CiAgIHB1YmxpYyBzdGF0aWMgVmVjdG9yT2Zmc2V0IENyZWF0ZVRlc3RhcnJheW9mdGFibGVzVmVjdG9yKEZsYXRCdWZmZXJCdWlsZGVyIGJ1aWxkZXIsIE9mZnNldDxNeUdhbWUuRXhhbXBsZS5Nb25zdGVyPltdIGRhdGEpIHsgYnVpbGRlci5TdGFydFZlY3Rvcig0LCBkYXRhLkxlbmd0aCwgNCk7IGZvciAoaW50IGkgPSBkYXRhLkxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSBidWlsZGVyLkFkZE9mZnNldChkYXRhW2ldLlZhbHVlKTsgcmV0dXJuIGJ1aWxkZXIuRW5kVmVjdG9yKCk7IH0KICAgcHVibGljIHN0YXRpYyBWZWN0b3JPZmZzZXQgQ3JlYXRlVGVzdGFycmF5b2Z0YWJsZXNWZWN0b3JCbG9jayhGbGF0QnVmZmVyQnVpbGRlciBidWlsZGVyLCBPZmZzZXQ8TXlHYW1lLkV4YW1wbGUuTW9uc3Rlcj5bXSBkYXRhKSB7IGJ1aWxkZXIuU3RhcnRWZWN0b3IoNCwgZGF0YS5MZW5ndGgsIDQpOyBidWlsZGVyLkFkZChkYXRhKTsgcmV0dXJuIGJ1aWxkZXIuRW5kVmVjdG9yKCk7IH0KKyAgcHVibGljIHN0YXRpYyBWZWN0b3JPZmZzZXQgQ3JlYXRlVGVzdGFycmF5b2Z0YWJsZXNWZWN0b3JCbG9jayhGbGF0QnVmZmVyQnVpbGRlciBidWlsZGVyLCBBcnJheVNlZ21lbnQ8T2Zmc2V0PE15R2FtZS5FeGFtcGxlLk1vbnN0ZXI+PiBkYXRhKSB7IGJ1aWxkZXIuU3RhcnRWZWN0b3IoNCwgZGF0YS5Db3VudCwgNCk7IGJ1aWxkZXIuQWRkKGRhdGEpOyByZXR1cm4gYnVpbGRlci5FbmRWZWN0b3IoKTsgfQorICBwdWJsaWMgc3RhdGljIFZlY3Rvck9mZnNldCBDcmVhdGVUZXN0YXJyYXlvZnRhYmxlc1ZlY3RvckJsb2NrKEZsYXRCdWZmZXJCdWlsZGVyIGJ1aWxkZXIsIEludFB0ciBkYXRhUHRyLCBpbnQgc2l6ZUluQnl0ZXMpIHsgYnVpbGRlci5TdGFydFZlY3RvcigxLCBzaXplSW5CeXRlcywgMSk7IGJ1aWxkZXIuQWRkPE9mZnNldDxNeUdhbWUuRXhhbXBsZS5Nb25zdGVyPj4oZGF0YVB0ciwgc2l6ZUluQnl0ZXMpOyByZXR1cm4gYnVpbGRlci5FbmRWZWN0b3IoKTsgfQogICBwdWJsaWMgc3RhdGljIHZvaWQgU3RhcnRUZXN0YXJyYXlvZnRhYmxlc1ZlY3RvcihGbGF0QnVmZmVyQnVpbGRlciBidWlsZGVyLCBpbnQgbnVtRWxlbXMpIHsgYnVpbGRlci5TdGFydFZlY3Rvcig0LCBudW1FbGVtcywgNCk7IH0KICAgcHVibGljIHN0YXRpYyB2b2lkIEFkZEVuZW15KEZsYXRCdWZmZXJCdWlsZGVyIGJ1aWxkZXIsIE9mZnNldDxNeUdhbWUuRXhhbXBsZS5Nb25zdGVyPiBlbmVteU9mZnNldCkgeyBidWlsZGVyLkFkZE9mZnNldCgxMiwgZW5lbXlPZmZzZXQuVmFsdWUsIDApOyB9CiAgIHB1YmxpYyBzdGF0aWMgdm9pZCBBZGRUZXN0bmVzdGVkZmxhdGJ1ZmZlcihGbGF0QnVmZmVyQnVpbGRlciBidWlsZGVyLCBWZWN0b3JPZmZzZXQgdGVzdG5lc3RlZGZsYXRidWZmZXJPZmZzZXQpIHsgYnVpbGRlci5BZGRPZmZzZXQoMTMsIHRlc3RuZXN0ZWRmbGF0YnVmZmVyT2Zmc2V0LlZhbHVlLCAwKTsgfQogICBwdWJsaWMgc3RhdGljIFZlY3Rvck9mZnNldCBDcmVhdGVUZXN0bmVzdGVkZmxhdGJ1ZmZlclZlY3RvcihGbGF0QnVmZmVyQnVpbGRlciBidWlsZGVyLCBieXRlW10gZGF0YSkgeyBidWlsZGVyLlN0YXJ0VmVjdG9yKDEsIGRhdGEuTGVuZ3RoLCAxKTsgZm9yIChpbnQgaSA9IGRhdGEuTGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIGJ1aWxkZXIuQWRkQnl0ZShkYXRhW2ldKTsgcmV0dXJuIGJ1aWxkZXIuRW5kVmVjdG9yKCk7IH0KICAgcHVibGljIHN0YXRpYyBWZWN0b3JPZmZzZXQgQ3JlYXRlVGVzdG5lc3RlZGZsYXRidWZmZXJWZWN0b3JCbG9jayhGbGF0QnVmZmVyQnVpbGRlciBidWlsZGVyLCBieXRlW10gZGF0YSkgeyBidWlsZGVyLlN0YXJ0VmVjdG9yKDEsIGRhdGEuTGVuZ3RoLCAxKTsgYnVpbGRlci5BZGQoZGF0YSk7IHJldHVybiBidWlsZGVyLkVuZFZlY3RvcigpOyB9CisgIHB1YmxpYyBzdGF0aWMgVmVjdG9yT2Zmc2V0IENyZWF0ZVRlc3RuZXN0ZWRmbGF0YnVmZmVyVmVjdG9yQmxvY2soRmxhdEJ1ZmZlckJ1aWxkZXIgYnVpbGRlciwgQXJyYXlTZWdtZW50PGJ5dGU+IGRhdGEpIHsgYnVpbGRlci5TdGFydFZlY3RvcigxLCBkYXRhLkNvdW50LCAxKTsgYnVpbGRlci5BZGQoZGF0YSk7IHJldHVybiBidWlsZGVyLkVuZFZlY3RvcigpOyB9CisgIHB1YmxpYyBzdGF0aWMgVmVjdG9yT2Zmc2V0IENyZWF0ZVRlc3RuZXN0ZWRmbGF0YnVmZmVyVmVjdG9yQmxvY2soRmxhdEJ1ZmZlckJ1aWxkZXIgYnVpbGRlciwgSW50UHRyIGRhdGFQdHIsIGludCBzaXplSW5CeXRlcykgeyBidWlsZGVyLlN0YXJ0VmVjdG9yKDEsIHNpemVJbkJ5dGVzLCAxKTsgYnVpbGRlci5BZGQ8Ynl0ZT4oZGF0YVB0ciwgc2l6ZUluQnl0ZXMpOyByZXR1cm4gYnVpbGRlci5FbmRWZWN0b3IoKTsgfQogICBwdWJsaWMgc3RhdGljIHZvaWQgU3RhcnRUZXN0bmVzdGVkZmxhdGJ1ZmZlclZlY3RvcihGbGF0QnVmZmVyQnVpbGRlciBidWlsZGVyLCBpbnQgbnVtRWxlbXMpIHsgYnVpbGRlci5TdGFydFZlY3RvcigxLCBudW1FbGVtcywgMSk7IH0KICAgcHVibGljIHN0YXRpYyB2b2lkIEFkZFRlc3RlbXB0eShGbGF0QnVmZmVyQnVpbGRlciBidWlsZGVyLCBPZmZzZXQ8TXlHYW1lLkV4YW1wbGUuU3RhdD4gdGVzdGVtcHR5T2Zmc2V0KSB7IGJ1aWxkZXIuQWRkT2Zmc2V0KDE0LCB0ZXN0ZW1wdHlPZmZzZXQuVmFsdWUsIDApOyB9CiAgIHB1YmxpYyBzdGF0aWMgdm9pZCBBZGRUZXN0Ym9vbChGbGF0QnVmZmVyQnVpbGRlciBidWlsZGVyLCBib29sIHRlc3Rib29sKSB7IGJ1aWxkZXIuQWRkQm9vbCgxNSwgdGVzdGJvb2wsIGZhbHNlKTsgfQpAQCAtMzY3LDYgKzM3NSw4IEBACiAgIHB1YmxpYyBzdGF0aWMgdm9pZCBBZGRUZXN0YXJyYXlvZmJvb2xzKEZsYXRCdWZmZXJCdWlsZGVyIGJ1aWxkZXIsIFZlY3Rvck9mZnNldCB0ZXN0YXJyYXlvZmJvb2xzT2Zmc2V0KSB7IGJ1aWxkZXIuQWRkT2Zmc2V0KDI0LCB0ZXN0YXJyYXlvZmJvb2xzT2Zmc2V0LlZhbHVlLCAwKTsgfQogICBwdWJsaWMgc3RhdGljIFZlY3Rvck9mZnNldCBDcmVhdGVUZXN0YXJyYXlvZmJvb2xzVmVjdG9yKEZsYXRCdWZmZXJCdWlsZGVyIGJ1aWxkZXIsIGJvb2xbXSBkYXRhKSB7IGJ1aWxkZXIuU3RhcnRWZWN0b3IoMSwgZGF0YS5MZW5ndGgsIDEpOyBmb3IgKGludCBpID0gZGF0YS5MZW5ndGggLSAxOyBpID49IDA7IGktLSkgYnVpbGRlci5BZGRCb29sKGRhdGFbaV0pOyByZXR1cm4gYnVpbGRlci5FbmRWZWN0b3IoKTsgfQogICBwdWJsaWMgc3RhdGljIFZlY3Rvck9mZnNldCBDcmVhdGVUZXN0YXJyYXlvZmJvb2xzVmVjdG9yQmxvY2soRmxhdEJ1ZmZlckJ1aWxkZXIgYnVpbGRlciwgYm9vbFtdIGRhdGEpIHsgYnVpbGRlci5TdGFydFZlY3RvcigxLCBkYXRhLkxlbmd0aCwgMSk7IGJ1aWxkZXIuQWRkKGRhdGEpOyByZXR1cm4gYnVpbGRlci5FbmRWZWN0b3IoKTsgfQorICBwdWJsaWMgc3RhdGljIFZlY3Rvck9mZnNldCBDcmVhdGVUZXN0YXJyYXlvZmJvb2xzVmVjdG9yQmxvY2soRmxhdEJ1ZmZlckJ1aWxkZXIgYnVpbGRlciwgQXJyYXlTZWdtZW50PGJvb2w+IGRhdGEpIHsgYnVpbGRlci5TdGFydFZlY3RvcigxLCBkYXRhLkNvdW50LCAxKTsgYnVpbGRlci5BZGQoZGF0YSk7IHJldHVybiBidWlsZGVyLkVuZFZlY3RvcigpOyB9CisgIHB1YmxpYyBzdGF0aWMgVmVjdG9yT2Zmc2V0IENyZWF0ZVRlc3RhcnJheW9mYm9vbHNWZWN0b3JCbG9jayhGbGF0QnVmZmVyQnVpbGRlciBidWlsZGVyLCBJbnRQdHIgZGF0YVB0ciwgaW50IHNpemVJbkJ5dGVzKSB7IGJ1aWxkZXIuU3RhcnRWZWN0b3IoMSwgc2l6ZUluQnl0ZXMsIDEpOyBidWlsZGVyLkFkZDxib29sPihkYXRhUHRyLCBzaXplSW5CeXRlcyk7IHJldHVybiBidWlsZGVyLkVuZFZlY3RvcigpOyB9CiAgIHB1YmxpYyBzdGF0aWMgdm9pZCBTdGFydFRlc3RhcnJheW9mYm9vbHNWZWN0b3IoRmxhdEJ1ZmZlckJ1aWxkZXIgYnVpbGRlciwgaW50IG51bUVsZW1zKSB7IGJ1aWxkZXIuU3RhcnRWZWN0b3IoMSwgbnVtRWxlbXMsIDEpOyB9CiAgIHB1YmxpYyBzdGF0aWMgdm9pZCBBZGRUZXN0ZihGbGF0QnVmZmVyQnVpbGRlciBidWlsZGVyLCBmbG9hdCB0ZXN0ZikgeyBidWlsZGVyLkFkZEZsb2F0KDI1LCB0ZXN0ZiwgMy4xNDE1OWYpOyB9CiAgIHB1YmxpYyBzdGF0aWMgdm9pZCBBZGRUZXN0ZjIoRmxhdEJ1ZmZlckJ1aWxkZXIgYnVpbGRlciwgZmxvYXQgdGVzdGYyKSB7IGJ1aWxkZXIuQWRkRmxvYXQoMjYsIHRlc3RmMiwgMy4wZik7IH0KQEAgLTM3NCw0NiArMzg0LDY0IEBACiAgIHB1YmxpYyBzdGF0aWMgdm9pZCBBZGRUZXN0YXJyYXlvZnN0cmluZzIoRmxhdEJ1ZmZlckJ1aWxkZXIgYnVpbGRlciwgVmVjdG9yT2Zmc2V0IHRlc3RhcnJheW9mc3RyaW5nMk9mZnNldCkgeyBidWlsZGVyLkFkZE9mZnNldCgyOCwgdGVzdGFycmF5b2ZzdHJpbmcyT2Zmc2V0LlZhbHVlLCAwKTsgfQogICBwdWJsaWMgc3RhdGljIFZlY3Rvck9mZnNldCBDcmVhdGVUZXN0YXJyYXlvZnN0cmluZzJWZWN0b3IoRmxhdEJ1ZmZlckJ1aWxkZXIgYnVpbGRlciwgU3RyaW5nT2Zmc2V0W10gZGF0YSkgeyBidWlsZGVyLlN0YXJ0VmVjdG9yKDQsIGRhdGEuTGVuZ3RoLCA0KTsgZm9yIChpbnQgaSA9IGRhdGEuTGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIGJ1aWxkZXIuQWRkT2Zmc2V0KGRhdGFbaV0uVmFsdWUpOyByZXR1cm4gYnVpbGRlci5FbmRWZWN0b3IoKTsgfQogICBwdWJsaWMgc3RhdGljIFZlY3Rvck9mZnNldCBDcmVhdGVUZXN0YXJyYXlvZnN0cmluZzJWZWN0b3JCbG9jayhGbGF0QnVmZmVyQnVpbGRlciBidWlsZGVyLCBTdHJpbmdPZmZzZXRbXSBkYXRhKSB7IGJ1aWxkZXIuU3RhcnRWZWN0b3IoNCwgZGF0YS5MZW5ndGgsIDQpOyBidWlsZGVyLkFkZChkYXRhKTsgcmV0dXJuIGJ1aWxkZXIuRW5kVmVjdG9yKCk7IH0KKyAgcHVibGljIHN0YXRpYyBWZWN0b3JPZmZzZXQgQ3JlYXRlVGVzdGFycmF5b2ZzdHJpbmcyVmVjdG9yQmxvY2soRmxhdEJ1ZmZlckJ1aWxkZXIgYnVpbGRlciwgQXJyYXlTZWdtZW50PFN0cmluZ09mZnNldD4gZGF0YSkgeyBidWlsZGVyLlN0YXJ0VmVjdG9yKDQsIGRhdGEuQ291bnQsIDQpOyBidWlsZGVyLkFkZChkYXRhKTsgcmV0dXJuIGJ1aWxkZXIuRW5kVmVjdG9yKCk7IH0KKyAgcHVibGljIHN0YXRpYyBWZWN0b3JPZmZzZXQgQ3JlYXRlVGVzdGFycmF5b2ZzdHJpbmcyVmVjdG9yQmxvY2soRmxhdEJ1ZmZlckJ1aWxkZXIgYnVpbGRlciwgSW50UHRyIGRhdGFQdHIsIGludCBzaXplSW5CeXRlcykgeyBidWlsZGVyLlN0YXJ0VmVjdG9yKDEsIHNpemVJbkJ5dGVzLCAxKTsgYnVpbGRlci5BZGQ8U3RyaW5nT2Zmc2V0PihkYXRhUHRyLCBzaXplSW5CeXRlcyk7IHJldHVybiBidWlsZGVyLkVuZFZlY3RvcigpOyB9CiAgIHB1YmxpYyBzdGF0aWMgdm9pZCBTdGFydFRlc3RhcnJheW9mc3RyaW5nMlZlY3RvcihGbGF0QnVmZmVyQnVpbGRlciBidWlsZGVyLCBpbnQgbnVtRWxlbXMpIHsgYnVpbGRlci5TdGFydFZlY3Rvcig0LCBudW1FbGVtcywgNCk7IH0KICAgcHVibGljIHN0YXRpYyB2b2lkIEFkZFRlc3RhcnJheW9mc29ydGVkc3RydWN0KEZsYXRCdWZmZXJCdWlsZGVyIGJ1aWxkZXIsIFZlY3Rvck9mZnNldCB0ZXN0YXJyYXlvZnNvcnRlZHN0cnVjdE9mZnNldCkgeyBidWlsZGVyLkFkZE9mZnNldCgyOSwgdGVzdGFycmF5b2Zzb3J0ZWRzdHJ1Y3RPZmZzZXQuVmFsdWUsIDApOyB9CiAgIHB1YmxpYyBzdGF0aWMgdm9pZCBTdGFydFRlc3RhcnJheW9mc29ydGVkc3RydWN0VmVjdG9yKEZsYXRCdWZmZXJCdWlsZGVyIGJ1aWxkZXIsIGludCBudW1FbGVtcykgeyBidWlsZGVyLlN0YXJ0VmVjdG9yKDgsIG51bUVsZW1zLCA0KTsgfQogICBwdWJsaWMgc3RhdGljIHZvaWQgQWRkRmxleChGbGF0QnVmZmVyQnVpbGRlciBidWlsZGVyLCBWZWN0b3JPZmZzZXQgZmxleE9mZnNldCkgeyBidWlsZGVyLkFkZE9mZnNldCgzMCwgZmxleE9mZnNldC5WYWx1ZSwgMCk7IH0KICAgcHVibGljIHN0YXRpYyBWZWN0b3JPZmZzZXQgQ3JlYXRlRmxleFZlY3RvcihGbGF0QnVmZmVyQnVpbGRlciBidWlsZGVyLCBieXRlW10gZGF0YSkgeyBidWlsZGVyLlN0YXJ0VmVjdG9yKDEsIGRhdGEuTGVuZ3RoLCAxKTsgZm9yIChpbnQgaSA9IGRhdGEuTGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIGJ1aWxkZXIuQWRkQnl0ZShkYXRhW2ldKTsgcmV0dXJuIGJ1aWxkZXIuRW5kVmVjdG9yKCk7IH0KICAgcHVibGljIHN0YXRpYyBWZWN0b3JPZmZzZXQgQ3JlYXRlRmxleFZlY3RvckJsb2NrKEZsYXRCdWZmZXJCdWlsZGVyIGJ1aWxkZXIsIGJ5dGVbXSBkYXRhKSB7IGJ1aWxkZXIuU3RhcnRWZWN0b3IoMSwgZGF0YS5MZW5ndGgsIDEpOyBidWlsZGVyLkFkZChkYXRhKTsgcmV0dXJuIGJ1aWxkZXIuRW5kVmVjdG9yKCk7IH0KKyAgcHVibGljIHN0YXRpYyBWZWN0b3JPZmZzZXQgQ3JlYXRlRmxleFZlY3RvckJsb2NrKEZsYXRCdWZmZXJCdWlsZGVyIGJ1aWxkZXIsIEFycmF5U2VnbWVudDxieXRlPiBkYXRhKSB7IGJ1aWxkZXIuU3RhcnRWZWN0b3IoMSwgZGF0YS5Db3VudCwgMSk7IGJ1aWxkZXIuQWRkKGRhdGEpOyByZXR1cm4gYnVpbGRlci5FbmRWZWN0b3IoKTsgfQorICBwdWJsaWMgc3RhdGljIFZlY3Rvck9mZnNldCBDcmVhdGVGbGV4VmVjdG9yQmxvY2soRmxhdEJ1ZmZlckJ1aWxkZXIgYnVpbGRlciwgSW50UHRyIGRhdGFQdHIsIGludCBzaXplSW5CeXRlcykgeyBidWlsZGVyLlN0YXJ0VmVjdG9yKDEsIHNpemVJbkJ5dGVzLCAxKTsgYnVpbGRlci5BZGQ8Ynl0ZT4oZGF0YVB0ciwgc2l6ZUluQnl0ZXMpOyByZXR1cm4gYnVpbGRlci5FbmRWZWN0b3IoKTsgfQogICBwdWJsaWMgc3RhdGljIHZvaWQgU3RhcnRGbGV4VmVjdG9yKEZsYXRCdWZmZXJCdWlsZGVyIGJ1aWxkZXIsIGludCBudW1FbGVtcykgeyBidWlsZGVyLlN0YXJ0VmVjdG9yKDEsIG51bUVsZW1zLCAxKTsgfQogICBwdWJsaWMgc3RhdGljIHZvaWQgQWRkVGVzdDUoRmxhdEJ1ZmZlckJ1aWxkZXIgYnVpbGRlciwgVmVjdG9yT2Zmc2V0IHRlc3Q1T2Zmc2V0KSB7IGJ1aWxkZXIuQWRkT2Zmc2V0KDMxLCB0ZXN0NU9mZnNldC5WYWx1ZSwgMCk7IH0KICAgcHVibGljIHN0YXRpYyB2b2lkIFN0YXJ0VGVzdDVWZWN0b3IoRmxhdEJ1ZmZlckJ1aWxkZXIgYnVpbGRlciwgaW50IG51bUVsZW1zKSB7IGJ1aWxkZXIuU3RhcnRWZWN0b3IoNCwgbnVtRWxlbXMsIDIpOyB9CiAgIHB1YmxpYyBzdGF0aWMgdm9pZCBBZGRWZWN0b3JPZkxvbmdzKEZsYXRCdWZmZXJCdWlsZGVyIGJ1aWxkZXIsIFZlY3Rvck9mZnNldCB2ZWN0b3JPZkxvbmdzT2Zmc2V0KSB7IGJ1aWxkZXIuQWRkT2Zmc2V0KDMyLCB2ZWN0b3JPZkxvbmdzT2Zmc2V0LlZhbHVlLCAwKTsgfQogICBwdWJsaWMgc3RhdGljIFZlY3Rvck9mZnNldCBDcmVhdGVWZWN0b3JPZkxvbmdzVmVjdG9yKEZsYXRCdWZmZXJCdWlsZGVyIGJ1aWxkZXIsIGxvbmdbXSBkYXRhKSB7IGJ1aWxkZXIuU3RhcnRWZWN0b3IoOCwgZGF0YS5MZW5ndGgsIDgpOyBmb3IgKGludCBpID0gZGF0YS5MZW5ndGggLSAxOyBpID49IDA7IGktLSkgYnVpbGRlci5BZGRMb25nKGRhdGFbaV0pOyByZXR1cm4gYnVpbGRlci5FbmRWZWN0b3IoKTsgfQogICBwdWJsaWMgc3RhdGljIFZlY3Rvck9mZnNldCBDcmVhdGVWZWN0b3JPZkxvbmdzVmVjdG9yQmxvY2soRmxhdEJ1ZmZlckJ1aWxkZXIgYnVpbGRlciwgbG9uZ1tdIGRhdGEpIHsgYnVpbGRlci5TdGFydFZlY3Rvcig4LCBkYXRhLkxlbmd0aCwgOCk7IGJ1aWxkZXIuQWRkKGRhdGEpOyByZXR1cm4gYnVpbGRlci5FbmRWZWN0b3IoKTsgfQorICBwdWJsaWMgc3RhdGljIFZlY3Rvck9mZnNldCBDcmVhdGVWZWN0b3JPZkxvbmdzVmVjdG9yQmxvY2soRmxhdEJ1ZmZlckJ1aWxkZXIgYnVpbGRlciwgQXJyYXlTZWdtZW50PGxvbmc+IGRhdGEpIHsgYnVpbGRlci5TdGFydFZlY3Rvcig4LCBkYXRhLkNvdW50LCA4KTsgYnVpbGRlci5BZGQoZGF0YSk7IHJldHVybiBidWlsZGVyLkVuZFZlY3RvcigpOyB9CisgIHB1YmxpYyBzdGF0aWMgVmVjdG9yT2Zmc2V0IENyZWF0ZVZlY3Rvck9mTG9uZ3NWZWN0b3JCbG9jayhGbGF0QnVmZmVyQnVpbGRlciBidWlsZGVyLCBJbnRQdHIgZGF0YVB0ciwgaW50IHNpemVJbkJ5dGVzKSB7IGJ1aWxkZXIuU3RhcnRWZWN0b3IoMSwgc2l6ZUluQnl0ZXMsIDEpOyBidWlsZGVyLkFkZDxsb25nPihkYXRhUHRyLCBzaXplSW5CeXRlcyk7IHJldHVybiBidWlsZGVyLkVuZFZlY3RvcigpOyB9CiAgIHB1YmxpYyBzdGF0aWMgdm9pZCBTdGFydFZlY3Rvck9mTG9uZ3NWZWN0b3IoRmxhdEJ1ZmZlckJ1aWxkZXIgYnVpbGRlciwgaW50IG51bUVsZW1zKSB7IGJ1aWxkZXIuU3RhcnRWZWN0b3IoOCwgbnVtRWxlbXMsIDgpOyB9CiAgIHB1YmxpYyBzdGF0aWMgdm9pZCBBZGRWZWN0b3JPZkRvdWJsZXMoRmxhdEJ1ZmZlckJ1aWxkZXIgYnVpbGRlciwgVmVjdG9yT2Zmc2V0IHZlY3Rvck9mRG91Ymxlc09mZnNldCkgeyBidWlsZGVyLkFkZE9mZnNldCgzMywgdmVjdG9yT2ZEb3VibGVzT2Zmc2V0LlZhbHVlLCAwKTsgfQogICBwdWJsaWMgc3RhdGljIFZlY3Rvck9mZnNldCBDcmVhdGVWZWN0b3JPZkRvdWJsZXNWZWN0b3IoRmxhdEJ1ZmZlckJ1aWxkZXIgYnVpbGRlciwgZG91YmxlW10gZGF0YSkgeyBidWlsZGVyLlN0YXJ0VmVjdG9yKDgsIGRhdGEuTGVuZ3RoLCA4KTsgZm9yIChpbnQgaSA9IGRhdGEuTGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIGJ1aWxkZXIuQWRkRG91YmxlKGRhdGFbaV0pOyByZXR1cm4gYnVpbGRlci5FbmRWZWN0b3IoKTsgfQogICBwdWJsaWMgc3RhdGljIFZlY3Rvck9mZnNldCBDcmVhdGVWZWN0b3JPZkRvdWJsZXNWZWN0b3JCbG9jayhGbGF0QnVmZmVyQnVpbGRlciBidWlsZGVyLCBkb3VibGVbXSBkYXRhKSB7IGJ1aWxkZXIuU3RhcnRWZWN0b3IoOCwgZGF0YS5MZW5ndGgsIDgpOyBidWlsZGVyLkFkZChkYXRhKTsgcmV0dXJuIGJ1aWxkZXIuRW5kVmVjdG9yKCk7IH0KKyAgcHVibGljIHN0YXRpYyBWZWN0b3JPZmZzZXQgQ3JlYXRlVmVjdG9yT2ZEb3VibGVzVmVjdG9yQmxvY2soRmxhdEJ1ZmZlckJ1aWxkZXIgYnVpbGRlciwgQXJyYXlTZWdtZW50PGRvdWJsZT4gZGF0YSkgeyBidWlsZGVyLlN0YXJ0VmVjdG9yKDgsIGRhdGEuQ291bnQsIDgpOyBidWlsZGVyLkFkZChkYXRhKTsgcmV0dXJuIGJ1aWxkZXIuRW5kVmVjdG9yKCk7IH0KKyAgcHVibGljIHN0YXRpYyBWZWN0b3JPZmZzZXQgQ3JlYXRlVmVjdG9yT2ZEb3VibGVzVmVjdG9yQmxvY2soRmxhdEJ1ZmZlckJ1aWxkZXIgYnVpbGRlciwgSW50UHRyIGRhdGFQdHIsIGludCBzaXplSW5CeXRlcykgeyBidWlsZGVyLlN0YXJ0VmVjdG9yKDEsIHNpemVJbkJ5dGVzLCAxKTsgYnVpbGRlci5BZGQ8ZG91YmxlPihkYXRhUHRyLCBzaXplSW5CeXRlcyk7IHJldHVybiBidWlsZGVyLkVuZFZlY3RvcigpOyB9CiAgIHB1YmxpYyBzdGF0aWMgdm9pZCBTdGFydFZlY3Rvck9mRG91Ymxlc1ZlY3RvcihGbGF0QnVmZmVyQnVpbGRlciBidWlsZGVyLCBpbnQgbnVtRWxlbXMpIHsgYnVpbGRlci5TdGFydFZlY3Rvcig4LCBudW1FbGVtcywgOCk7IH0KICAgcHVibGljIHN0YXRpYyB2b2lkIEFkZFBhcmVudE5hbWVzcGFjZVRlc3QoRmxhdEJ1ZmZlckJ1aWxkZXIgYnVpbGRlciwgT2Zmc2V0PE15R2FtZS5JblBhcmVudE5hbWVzcGFjZT4gcGFyZW50TmFtZXNwYWNlVGVzdE9mZnNldCkgeyBidWlsZGVyLkFkZE9mZnNldCgzNCwgcGFyZW50TmFtZXNwYWNlVGVzdE9mZnNldC5WYWx1ZSwgMCk7IH0KICAgcHVibGljIHN0YXRpYyB2b2lkIEFkZFZlY3Rvck9mUmVmZXJyYWJsZXMoRmxhdEJ1ZmZlckJ1aWxkZXIgYnVpbGRlciwgVmVjdG9yT2Zmc2V0IHZlY3Rvck9mUmVmZXJyYWJsZXNPZmZzZXQpIHsgYnVpbGRlci5BZGRPZmZzZXQoMzUsIHZlY3Rvck9mUmVmZXJyYWJsZXNPZmZzZXQuVmFsdWUsIDApOyB9CiAgIHB1YmxpYyBzdGF0aWMgVmVjdG9yT2Zmc2V0IENyZWF0ZVZlY3Rvck9mUmVmZXJyYWJsZXNWZWN0b3IoRmxhdEJ1ZmZlckJ1aWxkZXIgYnVpbGRlciwgT2Zmc2V0PE15R2FtZS5FeGFtcGxlLlJlZmVycmFibGU+W10gZGF0YSkgeyBidWlsZGVyLlN0YXJ0VmVjdG9yKDQsIGRhdGEuTGVuZ3RoLCA0KTsgZm9yIChpbnQgaSA9IGRhdGEuTGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIGJ1aWxkZXIuQWRkT2Zmc2V0KGRhdGFbaV0uVmFsdWUpOyByZXR1cm4gYnVpbGRlci5FbmRWZWN0b3IoKTsgfQogICBwdWJsaWMgc3RhdGljIFZlY3Rvck9mZnNldCBDcmVhdGVWZWN0b3JPZlJlZmVycmFibGVzVmVjdG9yQmxvY2soRmxhdEJ1ZmZlckJ1aWxkZXIgYnVpbGRlciwgT2Zmc2V0PE15R2FtZS5FeGFtcGxlLlJlZmVycmFibGU+W10gZGF0YSkgeyBidWlsZGVyLlN0YXJ0VmVjdG9yKDQsIGRhdGEuTGVuZ3RoLCA0KTsgYnVpbGRlci5BZGQoZGF0YSk7IHJldHVybiBidWlsZGVyLkVuZFZlY3RvcigpOyB9CisgIHB1YmxpYyBzdGF0aWMgVmVjdG9yT2Zmc2V0IENyZWF0ZVZlY3Rvck9mUmVmZXJyYWJsZXNWZWN0b3JCbG9jayhGbGF0QnVmZmVyQnVpbGRlciBidWlsZGVyLCBBcnJheVNlZ21lbnQ8T2Zmc2V0PE15R2FtZS5FeGFtcGxlLlJlZmVycmFibGU+PiBkYXRhKSB7IGJ1aWxkZXIuU3RhcnRWZWN0b3IoNCwgZGF0YS5Db3VudCwgNCk7IGJ1aWxkZXIuQWRkKGRhdGEpOyByZXR1cm4gYnVpbGRlci5FbmRWZWN0b3IoKTsgfQorICBwdWJsaWMgc3RhdGljIFZlY3Rvck9mZnNldCBDcmVhdGVWZWN0b3JPZlJlZmVycmFibGVzVmVjdG9yQmxvY2soRmxhdEJ1ZmZlckJ1aWxkZXIgYnVpbGRlciwgSW50UHRyIGRhdGFQdHIsIGludCBzaXplSW5CeXRlcykgeyBidWlsZGVyLlN0YXJ0VmVjdG9yKDEsIHNpemVJbkJ5dGVzLCAxKTsgYnVpbGRlci5BZGQ8T2Zmc2V0PE15R2FtZS5FeGFtcGxlLlJlZmVycmFibGU+PihkYXRhUHRyLCBzaXplSW5CeXRlcyk7IHJldHVybiBidWlsZGVyLkVuZFZlY3RvcigpOyB9CiAgIHB1YmxpYyBzdGF0aWMgdm9pZCBTdGFydFZlY3Rvck9mUmVmZXJyYWJsZXNWZWN0b3IoRmxhdEJ1ZmZlckJ1aWxkZXIgYnVpbGRlciwgaW50IG51bUVsZW1zKSB7IGJ1aWxkZXIuU3RhcnRWZWN0b3IoNCwgbnVtRWxlbXMsIDQpOyB9CiAgIHB1YmxpYyBzdGF0aWMgdm9pZCBBZGRTaW5nbGVXZWFrUmVmZXJlbmNlKEZsYXRCdWZmZXJCdWlsZGVyIGJ1aWxkZXIsIHVsb25nIHNpbmdsZVdlYWtSZWZlcmVuY2UpIHsgYnVpbGRlci5BZGRVbG9uZygzNiwgc2luZ2xlV2Vha1JlZmVyZW5jZSwgMCk7IH0KICAgcHVibGljIHN0YXRpYyB2b2lkIEFkZFZlY3Rvck9mV2Vha1JlZmVyZW5jZXMoRmxhdEJ1ZmZlckJ1aWxkZXIgYnVpbGRlciwgVmVjdG9yT2Zmc2V0IHZlY3Rvck9mV2Vha1JlZmVyZW5jZXNPZmZzZXQpIHsgYnVpbGRlci5BZGRPZmZzZXQoMzcsIHZlY3Rvck9mV2Vha1JlZmVyZW5jZXNPZmZzZXQuVmFsdWUsIDApOyB9CiAgIHB1YmxpYyBzdGF0aWMgVmVjdG9yT2Zmc2V0IENyZWF0ZVZlY3Rvck9mV2Vha1JlZmVyZW5jZXNWZWN0b3IoRmxhdEJ1ZmZlckJ1aWxkZXIgYnVpbGRlciwgdWxvbmdbXSBkYXRhKSB7IGJ1aWxkZXIuU3RhcnRWZWN0b3IoOCwgZGF0YS5MZW5ndGgsIDgpOyBmb3IgKGludCBpID0gZGF0YS5MZW5ndGggLSAxOyBpID49IDA7IGktLSkgYnVpbGRlci5BZGRVbG9uZyhkYXRhW2ldKTsgcmV0dXJuIGJ1aWxkZXIuRW5kVmVjdG9yKCk7IH0KICAgcHVibGljIHN0YXRpYyBWZWN0b3JPZmZzZXQgQ3JlYXRlVmVjdG9yT2ZXZWFrUmVmZXJlbmNlc1ZlY3RvckJsb2NrKEZsYXRCdWZmZXJCdWlsZGVyIGJ1aWxkZXIsIHVsb25nW10gZGF0YSkgeyBidWlsZGVyLlN0YXJ0VmVjdG9yKDgsIGRhdGEuTGVuZ3RoLCA4KTsgYnVpbGRlci5BZGQoZGF0YSk7IHJldHVybiBidWlsZGVyLkVuZFZlY3RvcigpOyB9CisgIHB1YmxpYyBzdGF0aWMgVmVjdG9yT2Zmc2V0IENyZWF0ZVZlY3Rvck9mV2Vha1JlZmVyZW5jZXNWZWN0b3JCbG9jayhGbGF0QnVmZmVyQnVpbGRlciBidWlsZGVyLCBBcnJheVNlZ21lbnQ8dWxvbmc+IGRhdGEpIHsgYnVpbGRlci5TdGFydFZlY3Rvcig4LCBkYXRhLkNvdW50LCA4KTsgYnVpbGRlci5BZGQoZGF0YSk7IHJldHVybiBidWlsZGVyLkVuZFZlY3RvcigpOyB9CisgIHB1YmxpYyBzdGF0aWMgVmVjdG9yT2Zmc2V0IENyZWF0ZVZlY3Rvck9mV2Vha1JlZmVyZW5jZXNWZWN0b3JCbG9jayhGbGF0QnVmZmVyQnVpbGRlciBidWlsZGVyLCBJbnRQdHIgZGF0YVB0ciwgaW50IHNpemVJbkJ5dGVzKSB7IGJ1aWxkZXIuU3RhcnRWZWN0b3IoMSwgc2l6ZUluQnl0ZXMsIDEpOyBidWlsZGVyLkFkZDx1bG9uZz4oZGF0YVB0ciwgc2l6ZUluQnl0ZXMpOyByZXR1cm4gYnVpbGRlci5FbmRWZWN0b3IoKTsgfQogICBwdWJsaWMgc3RhdGljIHZvaWQgU3RhcnRWZWN0b3JPZldlYWtSZWZlcmVuY2VzVmVjdG9yKEZsYXRCdWZmZXJCdWlsZGVyIGJ1aWxkZXIsIGludCBudW1FbGVtcykgeyBidWlsZGVyLlN0YXJ0VmVjdG9yKDgsIG51bUVsZW1zLCA4KTsgfQogICBwdWJsaWMgc3RhdGljIHZvaWQgQWRkVmVjdG9yT2ZTdHJvbmdSZWZlcnJhYmxlcyhGbGF0QnVmZmVyQnVpbGRlciBidWlsZGVyLCBWZWN0b3JPZmZzZXQgdmVjdG9yT2ZTdHJvbmdSZWZlcnJhYmxlc09mZnNldCkgeyBidWlsZGVyLkFkZE9mZnNldCgzOCwgdmVjdG9yT2ZTdHJvbmdSZWZlcnJhYmxlc09mZnNldC5WYWx1ZSwgMCk7IH0KICAgcHVibGljIHN0YXRpYyBWZWN0b3JPZmZzZXQgQ3JlYXRlVmVjdG9yT2ZTdHJvbmdSZWZlcnJhYmxlc1ZlY3RvcihGbGF0QnVmZmVyQnVpbGRlciBidWlsZGVyLCBPZmZzZXQ8TXlHYW1lLkV4YW1wbGUuUmVmZXJyYWJsZT5bXSBkYXRhKSB7IGJ1aWxkZXIuU3RhcnRWZWN0b3IoNCwgZGF0YS5MZW5ndGgsIDQpOyBmb3IgKGludCBpID0gZGF0YS5MZW5ndGggLSAxOyBpID49IDA7IGktLSkgYnVpbGRlci5BZGRPZmZzZXQoZGF0YVtpXS5WYWx1ZSk7IHJldHVybiBidWlsZGVyLkVuZFZlY3RvcigpOyB9CiAgIHB1YmxpYyBzdGF0aWMgVmVjdG9yT2Zmc2V0IENyZWF0ZVZlY3Rvck9mU3Ryb25nUmVmZXJyYWJsZXNWZWN0b3JCbG9jayhGbGF0QnVmZmVyQnVpbGRlciBidWlsZGVyLCBPZmZzZXQ8TXlHYW1lLkV4YW1wbGUuUmVmZXJyYWJsZT5bXSBkYXRhKSB7IGJ1aWxkZXIuU3RhcnRWZWN0b3IoNCwgZGF0YS5MZW5ndGgsIDQpOyBidWlsZGVyLkFkZChkYXRhKTsgcmV0dXJuIGJ1aWxkZXIuRW5kVmVjdG9yKCk7IH0KKyAgcHVibGljIHN0YXRpYyBWZWN0b3JPZmZzZXQgQ3JlYXRlVmVjdG9yT2ZTdHJvbmdSZWZlcnJhYmxlc1ZlY3RvckJsb2NrKEZsYXRCdWZmZXJCdWlsZGVyIGJ1aWxkZXIsIEFycmF5U2VnbWVudDxPZmZzZXQ8TXlHYW1lLkV4YW1wbGUuUmVmZXJyYWJsZT4+IGRhdGEpIHsgYnVpbGRlci5TdGFydFZlY3Rvcig0LCBkYXRhLkNvdW50LCA0KTsgYnVpbGRlci5BZGQoZGF0YSk7IHJldHVybiBidWlsZGVyLkVuZFZlY3RvcigpOyB9CisgIHB1YmxpYyBzdGF0aWMgVmVjdG9yT2Zmc2V0IENyZWF0ZVZlY3Rvck9mU3Ryb25nUmVmZXJyYWJsZXNWZWN0b3JCbG9jayhGbGF0QnVmZmVyQnVpbGRlciBidWlsZGVyLCBJbnRQdHIgZGF0YVB0ciwgaW50IHNpemVJbkJ5dGVzKSB7IGJ1aWxkZXIuU3RhcnRWZWN0b3IoMSwgc2l6ZUluQnl0ZXMsIDEpOyBidWlsZGVyLkFkZDxPZmZzZXQ8TXlHYW1lLkV4YW1wbGUuUmVmZXJyYWJsZT4+KGRhdGFQdHIsIHNpemVJbkJ5dGVzKTsgcmV0dXJuIGJ1aWxkZXIuRW5kVmVjdG9yKCk7IH0KICAgcHVibGljIHN0YXRpYyB2b2lkIFN0YXJ0VmVjdG9yT2ZTdHJvbmdSZWZlcnJhYmxlc1ZlY3RvcihGbGF0QnVmZmVyQnVpbGRlciBidWlsZGVyLCBpbnQgbnVtRWxlbXMpIHsgYnVpbGRlci5TdGFydFZlY3Rvcig0LCBudW1FbGVtcywgNCk7IH0KICAgcHVibGljIHN0YXRpYyB2b2lkIEFkZENvT3duaW5nUmVmZXJlbmNlKEZsYXRCdWZmZXJCdWlsZGVyIGJ1aWxkZXIsIHVsb25nIGNvT3duaW5nUmVmZXJlbmNlKSB7IGJ1aWxkZXIuQWRkVWxvbmcoMzksIGNvT3duaW5nUmVmZXJlbmNlLCAwKTsgfQogICBwdWJsaWMgc3RhdGljIHZvaWQgQWRkVmVjdG9yT2ZDb093bmluZ1JlZmVyZW5jZXMoRmxhdEJ1ZmZlckJ1aWxkZXIgYnVpbGRlciwgVmVjdG9yT2Zmc2V0IHZlY3Rvck9mQ29Pd25pbmdSZWZlcmVuY2VzT2Zmc2V0KSB7IGJ1aWxkZXIuQWRkT2Zmc2V0KDQwLCB2ZWN0b3JPZkNvT3duaW5nUmVmZXJlbmNlc09mZnNldC5WYWx1ZSwgMCk7IH0KICAgcHVibGljIHN0YXRpYyBWZWN0b3JPZmZzZXQgQ3JlYXRlVmVjdG9yT2ZDb093bmluZ1JlZmVyZW5jZXNWZWN0b3IoRmxhdEJ1ZmZlckJ1aWxkZXIgYnVpbGRlciwgdWxvbmdbXSBkYXRhKSB7IGJ1aWxkZXIuU3RhcnRWZWN0b3IoOCwgZGF0YS5MZW5ndGgsIDgpOyBmb3IgKGludCBpID0gZGF0YS5MZW5ndGggLSAxOyBpID49IDA7IGktLSkgYnVpbGRlci5BZGRVbG9uZyhkYXRhW2ldKTsgcmV0dXJuIGJ1aWxkZXIuRW5kVmVjdG9yKCk7IH0KICAgcHVibGljIHN0YXRpYyBWZWN0b3JPZmZzZXQgQ3JlYXRlVmVjdG9yT2ZDb093bmluZ1JlZmVyZW5jZXNWZWN0b3JCbG9jayhGbGF0QnVmZmVyQnVpbGRlciBidWlsZGVyLCB1bG9uZ1tdIGRhdGEpIHsgYnVpbGRlci5TdGFydFZlY3Rvcig4LCBkYXRhLkxlbmd0aCwgOCk7IGJ1aWxkZXIuQWRkKGRhdGEpOyByZXR1cm4gYnVpbGRlci5FbmRWZWN0b3IoKTsgfQorICBwdWJsaWMgc3RhdGljIFZlY3Rvck9mZnNldCBDcmVhdGVWZWN0b3JPZkNvT3duaW5nUmVmZXJlbmNlc1ZlY3RvckJsb2NrKEZsYXRCdWZmZXJCdWlsZGVyIGJ1aWxkZXIsIEFycmF5U2VnbWVudDx1bG9uZz4gZGF0YSkgeyBidWlsZGVyLlN0YXJ0VmVjdG9yKDgsIGRhdGEuQ291bnQsIDgpOyBidWlsZGVyLkFkZChkYXRhKTsgcmV0dXJuIGJ1aWxkZXIuRW5kVmVjdG9yKCk7IH0KKyAgcHVibGljIHN0YXRpYyBWZWN0b3JPZmZzZXQgQ3JlYXRlVmVjdG9yT2ZDb093bmluZ1JlZmVyZW5jZXNWZWN0b3JCbG9jayhGbGF0QnVmZmVyQnVpbGRlciBidWlsZGVyLCBJbnRQdHIgZGF0YVB0ciwgaW50IHNpemVJbkJ5dGVzKSB7IGJ1aWxkZXIuU3RhcnRWZWN0b3IoMSwgc2l6ZUluQnl0ZXMsIDEpOyBidWlsZGVyLkFkZDx1bG9uZz4oZGF0YVB0ciwgc2l6ZUluQnl0ZXMpOyByZXR1cm4gYnVpbGRlci5FbmRWZWN0b3IoKTsgfQogICBwdWJsaWMgc3RhdGljIHZvaWQgU3RhcnRWZWN0b3JPZkNvT3duaW5nUmVmZXJlbmNlc1ZlY3RvcihGbGF0QnVmZmVyQnVpbGRlciBidWlsZGVyLCBpbnQgbnVtRWxlbXMpIHsgYnVpbGRlci5TdGFydFZlY3Rvcig4LCBudW1FbGVtcywgOCk7IH0KICAgcHVibGljIHN0YXRpYyB2b2lkIEFkZE5vbk93bmluZ1JlZmVyZW5jZShGbGF0QnVmZmVyQnVpbGRlciBidWlsZGVyLCB1bG9uZyBub25Pd25pbmdSZWZlcmVuY2UpIHsgYnVpbGRlci5BZGRVbG9uZyg0MSwgbm9uT3duaW5nUmVmZXJlbmNlLCAwKTsgfQogICBwdWJsaWMgc3RhdGljIHZvaWQgQWRkVmVjdG9yT2ZOb25Pd25pbmdSZWZlcmVuY2VzKEZsYXRCdWZmZXJCdWlsZGVyIGJ1aWxkZXIsIFZlY3Rvck9mZnNldCB2ZWN0b3JPZk5vbk93bmluZ1JlZmVyZW5jZXNPZmZzZXQpIHsgYnVpbGRlci5BZGRPZmZzZXQoNDIsIHZlY3Rvck9mTm9uT3duaW5nUmVmZXJlbmNlc09mZnNldC5WYWx1ZSwgMCk7IH0KICAgcHVibGljIHN0YXRpYyBWZWN0b3JPZmZzZXQgQ3JlYXRlVmVjdG9yT2ZOb25Pd25pbmdSZWZlcmVuY2VzVmVjdG9yKEZsYXRCdWZmZXJCdWlsZGVyIGJ1aWxkZXIsIHVsb25nW10gZGF0YSkgeyBidWlsZGVyLlN0YXJ0VmVjdG9yKDgsIGRhdGEuTGVuZ3RoLCA4KTsgZm9yIChpbnQgaSA9IGRhdGEuTGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIGJ1aWxkZXIuQWRkVWxvbmcoZGF0YVtpXSk7IHJldHVybiBidWlsZGVyLkVuZFZlY3RvcigpOyB9CiAgIHB1YmxpYyBzdGF0aWMgVmVjdG9yT2Zmc2V0IENyZWF0ZVZlY3Rvck9mTm9uT3duaW5nUmVmZXJlbmNlc1ZlY3RvckJsb2NrKEZsYXRCdWZmZXJCdWlsZGVyIGJ1aWxkZXIsIHVsb25nW10gZGF0YSkgeyBidWlsZGVyLlN0YXJ0VmVjdG9yKDgsIGRhdGEuTGVuZ3RoLCA4KTsgYnVpbGRlci5BZGQoZGF0YSk7IHJldHVybiBidWlsZGVyLkVuZFZlY3RvcigpOyB9CisgIHB1YmxpYyBzdGF0aWMgVmVjdG9yT2Zmc2V0IENyZWF0ZVZlY3Rvck9mTm9uT3duaW5nUmVmZXJlbmNlc1ZlY3RvckJsb2NrKEZsYXRCdWZmZXJCdWlsZGVyIGJ1aWxkZXIsIEFycmF5U2VnbWVudDx1bG9uZz4gZGF0YSkgeyBidWlsZGVyLlN0YXJ0VmVjdG9yKDgsIGRhdGEuQ291bnQsIDgpOyBidWlsZGVyLkFkZChkYXRhKTsgcmV0dXJuIGJ1aWxkZXIuRW5kVmVjdG9yKCk7IH0KKyAgcHVibGljIHN0YXRpYyBWZWN0b3JPZmZzZXQgQ3JlYXRlVmVjdG9yT2ZOb25Pd25pbmdSZWZlcmVuY2VzVmVjdG9yQmxvY2soRmxhdEJ1ZmZlckJ1aWxkZXIgYnVpbGRlciwgSW50UHRyIGRhdGFQdHIsIGludCBzaXplSW5CeXRlcykgeyBidWlsZGVyLlN0YXJ0VmVjdG9yKDEsIHNpemVJbkJ5dGVzLCAxKTsgYnVpbGRlci5BZGQ8dWxvbmc+KGRhdGFQdHIsIHNpemVJbkJ5dGVzKTsgcmV0dXJuIGJ1aWxkZXIuRW5kVmVjdG9yKCk7IH0KICAgcHVibGljIHN0YXRpYyB2b2lkIFN0YXJ0VmVjdG9yT2ZOb25Pd25pbmdSZWZlcmVuY2VzVmVjdG9yKEZsYXRCdWZmZXJCdWlsZGVyIGJ1aWxkZXIsIGludCBudW1FbGVtcykgeyBidWlsZGVyLlN0YXJ0VmVjdG9yKDgsIG51bUVsZW1zLCA4KTsgfQogICBwdWJsaWMgc3RhdGljIHZvaWQgQWRkQW55VW5pcXVlVHlwZShGbGF0QnVmZmVyQnVpbGRlciBidWlsZGVyLCBNeUdhbWUuRXhhbXBsZS5BbnlVbmlxdWVBbGlhc2VzIGFueVVuaXF1ZVR5cGUpIHsgYnVpbGRlci5BZGRCeXRlKDQzLCAoYnl0ZSlhbnlVbmlxdWVUeXBlLCAwKTsgfQogICBwdWJsaWMgc3RhdGljIHZvaWQgQWRkQW55VW5pcXVlKEZsYXRCdWZmZXJCdWlsZGVyIGJ1aWxkZXIsIGludCBhbnlVbmlxdWVPZmZzZXQpIHsgYnVpbGRlci5BZGRPZmZzZXQoNDQsIGFueVVuaXF1ZU9mZnNldCwgMCk7IH0KQEAgLTQyMiwxNSArNDUwLDIxIEBACiAgIHB1YmxpYyBzdGF0aWMgdm9pZCBBZGRWZWN0b3JPZkVudW1zKEZsYXRCdWZmZXJCdWlsZGVyIGJ1aWxkZXIsIFZlY3Rvck9mZnNldCB2ZWN0b3JPZkVudW1zT2Zmc2V0KSB7IGJ1aWxkZXIuQWRkT2Zmc2V0KDQ3LCB2ZWN0b3JPZkVudW1zT2Zmc2V0LlZhbHVlLCAwKTsgfQogICBwdWJsaWMgc3RhdGljIFZlY3Rvck9mZnNldCBDcmVhdGVWZWN0b3JPZkVudW1zVmVjdG9yKEZsYXRCdWZmZXJCdWlsZGVyIGJ1aWxkZXIsIE15R2FtZS5FeGFtcGxlLkNvbG9yW10gZGF0YSkgeyBidWlsZGVyLlN0YXJ0VmVjdG9yKDEsIGRhdGEuTGVuZ3RoLCAxKTsgZm9yIChpbnQgaSA9IGRhdGEuTGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIGJ1aWxkZXIuQWRkQnl0ZSgoYnl0ZSlkYXRhW2ldKTsgcmV0dXJuIGJ1aWxkZXIuRW5kVmVjdG9yKCk7IH0KICAgcHVibGljIHN0YXRpYyBWZWN0b3JPZmZzZXQgQ3JlYXRlVmVjdG9yT2ZFbnVtc1ZlY3RvckJsb2NrKEZsYXRCdWZmZXJCdWlsZGVyIGJ1aWxkZXIsIE15R2FtZS5FeGFtcGxlLkNvbG9yW10gZGF0YSkgeyBidWlsZGVyLlN0YXJ0VmVjdG9yKDEsIGRhdGEuTGVuZ3RoLCAxKTsgYnVpbGRlci5BZGQoZGF0YSk7IHJldHVybiBidWlsZGVyLkVuZFZlY3RvcigpOyB9CisgIHB1YmxpYyBzdGF0aWMgVmVjdG9yT2Zmc2V0IENyZWF0ZVZlY3Rvck9mRW51bXNWZWN0b3JCbG9jayhGbGF0QnVmZmVyQnVpbGRlciBidWlsZGVyLCBBcnJheVNlZ21lbnQ8TXlHYW1lLkV4YW1wbGUuQ29sb3I+IGRhdGEpIHsgYnVpbGRlci5TdGFydFZlY3RvcigxLCBkYXRhLkNvdW50LCAxKTsgYnVpbGRlci5BZGQoZGF0YSk7IHJldHVybiBidWlsZGVyLkVuZFZlY3RvcigpOyB9CisgIHB1YmxpYyBzdGF0aWMgVmVjdG9yT2Zmc2V0IENyZWF0ZVZlY3Rvck9mRW51bXNWZWN0b3JCbG9jayhGbGF0QnVmZmVyQnVpbGRlciBidWlsZGVyLCBJbnRQdHIgZGF0YVB0ciwgaW50IHNpemVJbkJ5dGVzKSB7IGJ1aWxkZXIuU3RhcnRWZWN0b3IoMSwgc2l6ZUluQnl0ZXMsIDEpOyBidWlsZGVyLkFkZDxNeUdhbWUuRXhhbXBsZS5Db2xvcj4oZGF0YVB0ciwgc2l6ZUluQnl0ZXMpOyByZXR1cm4gYnVpbGRlci5FbmRWZWN0b3IoKTsgfQogICBwdWJsaWMgc3RhdGljIHZvaWQgU3RhcnRWZWN0b3JPZkVudW1zVmVjdG9yKEZsYXRCdWZmZXJCdWlsZGVyIGJ1aWxkZXIsIGludCBudW1FbGVtcykgeyBidWlsZGVyLlN0YXJ0VmVjdG9yKDEsIG51bUVsZW1zLCAxKTsgfQogICBwdWJsaWMgc3RhdGljIHZvaWQgQWRkU2lnbmVkRW51bShGbGF0QnVmZmVyQnVpbGRlciBidWlsZGVyLCBNeUdhbWUuRXhhbXBsZS5SYWNlIHNpZ25lZEVudW0pIHsgYnVpbGRlci5BZGRTYnl0ZSg0OCwgKHNieXRlKXNpZ25lZEVudW0sIC0xKTsgfQogICBwdWJsaWMgc3RhdGljIHZvaWQgQWRkVGVzdHJlcXVpcmVkbmVzdGVkZmxhdGJ1ZmZlcihGbGF0QnVmZmVyQnVpbGRlciBidWlsZGVyLCBWZWN0b3JPZmZzZXQgdGVzdHJlcXVpcmVkbmVzdGVkZmxhdGJ1ZmZlck9mZnNldCkgeyBidWlsZGVyLkFkZE9mZnNldCg0OSwgdGVzdHJlcXVpcmVkbmVzdGVkZmxhdGJ1ZmZlck9mZnNldC5WYWx1ZSwgMCk7IH0KICAgcHVibGljIHN0YXRpYyBWZWN0b3JPZmZzZXQgQ3JlYXRlVGVzdHJlcXVpcmVkbmVzdGVkZmxhdGJ1ZmZlclZlY3RvcihGbGF0QnVmZmVyQnVpbGRlciBidWlsZGVyLCBieXRlW10gZGF0YSkgeyBidWlsZGVyLlN0YXJ0VmVjdG9yKDEsIGRhdGEuTGVuZ3RoLCAxKTsgZm9yIChpbnQgaSA9IGRhdGEuTGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIGJ1aWxkZXIuQWRkQnl0ZShkYXRhW2ldKTsgcmV0dXJuIGJ1aWxkZXIuRW5kVmVjdG9yKCk7IH0KICAgcHVibGljIHN0YXRpYyBWZWN0b3JPZmZzZXQgQ3JlYXRlVGVzdHJlcXVpcmVkbmVzdGVkZmxhdGJ1ZmZlclZlY3RvckJsb2NrKEZsYXRCdWZmZXJCdWlsZGVyIGJ1aWxkZXIsIGJ5dGVbXSBkYXRhKSB7IGJ1aWxkZXIuU3RhcnRWZWN0b3IoMSwgZGF0YS5MZW5ndGgsIDEpOyBidWlsZGVyLkFkZChkYXRhKTsgcmV0dXJuIGJ1aWxkZXIuRW5kVmVjdG9yKCk7IH0KKyAgcHVibGljIHN0YXRpYyBWZWN0b3JPZmZzZXQgQ3JlYXRlVGVzdHJlcXVpcmVkbmVzdGVkZmxhdGJ1ZmZlclZlY3RvckJsb2NrKEZsYXRCdWZmZXJCdWlsZGVyIGJ1aWxkZXIsIEFycmF5U2VnbWVudDxieXRlPiBkYXRhKSB7IGJ1aWxkZXIuU3RhcnRWZWN0b3IoMSwgZGF0YS5Db3VudCwgMSk7IGJ1aWxkZXIuQWRkKGRhdGEpOyByZXR1cm4gYnVpbGRlci5FbmRWZWN0b3IoKTsgfQorICBwdWJsaWMgc3RhdGljIFZlY3Rvck9mZnNldCBDcmVhdGVUZXN0cmVxdWlyZWRuZXN0ZWRmbGF0YnVmZmVyVmVjdG9yQmxvY2soRmxhdEJ1ZmZlckJ1aWxkZXIgYnVpbGRlciwgSW50UHRyIGRhdGFQdHIsIGludCBzaXplSW5CeXRlcykgeyBidWlsZGVyLlN0YXJ0VmVjdG9yKDEsIHNpemVJbkJ5dGVzLCAxKTsgYnVpbGRlci5BZGQ8Ynl0ZT4oZGF0YVB0ciwgc2l6ZUluQnl0ZXMpOyByZXR1cm4gYnVpbGRlci5FbmRWZWN0b3IoKTsgfQogICBwdWJsaWMgc3RhdGljIHZvaWQgU3RhcnRUZXN0cmVxdWlyZWRuZXN0ZWRmbGF0YnVmZmVyVmVjdG9yKEZsYXRCdWZmZXJCdWlsZGVyIGJ1aWxkZXIsIGludCBudW1FbGVtcykgeyBidWlsZGVyLlN0YXJ0VmVjdG9yKDEsIG51bUVsZW1zLCAxKTsgfQogICBwdWJsaWMgc3RhdGljIHZvaWQgQWRkU2NhbGFyS2V5U29ydGVkVGFibGVzKEZsYXRCdWZmZXJCdWlsZGVyIGJ1aWxkZXIsIFZlY3Rvck9mZnNldCBzY2FsYXJLZXlTb3J0ZWRUYWJsZXNPZmZzZXQpIHsgYnVpbGRlci5BZGRPZmZzZXQoNTAsIHNjYWxhcktleVNvcnRlZFRhYmxlc09mZnNldC5WYWx1ZSwgMCk7IH0KICAgcHVibGljIHN0YXRpYyBWZWN0b3JPZmZzZXQgQ3JlYXRlU2NhbGFyS2V5U29ydGVkVGFibGVzVmVjdG9yKEZsYXRCdWZmZXJCdWlsZGVyIGJ1aWxkZXIsIE9mZnNldDxNeUdhbWUuRXhhbXBsZS5TdGF0PltdIGRhdGEpIHsgYnVpbGRlci5TdGFydFZlY3Rvcig0LCBkYXRhLkxlbmd0aCwgNCk7IGZvciAoaW50IGkgPSBkYXRhLkxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSBidWlsZGVyLkFkZE9mZnNldChkYXRhW2ldLlZhbHVlKTsgcmV0dXJuIGJ1aWxkZXIuRW5kVmVjdG9yKCk7IH0KICAgcHVibGljIHN0YXRpYyBWZWN0b3JPZmZzZXQgQ3JlYXRlU2NhbGFyS2V5U29ydGVkVGFibGVzVmVjdG9yQmxvY2soRmxhdEJ1ZmZlckJ1aWxkZXIgYnVpbGRlciwgT2Zmc2V0PE15R2FtZS5FeGFtcGxlLlN0YXQ+W10gZGF0YSkgeyBidWlsZGVyLlN0YXJ0VmVjdG9yKDQsIGRhdGEuTGVuZ3RoLCA0KTsgYnVpbGRlci5BZGQoZGF0YSk7IHJldHVybiBidWlsZGVyLkVuZFZlY3RvcigpOyB9CisgIHB1YmxpYyBzdGF0aWMgVmVjdG9yT2Zmc2V0IENyZWF0ZVNjYWxhcktleVNvcnRlZFRhYmxlc1ZlY3RvckJsb2NrKEZsYXRCdWZmZXJCdWlsZGVyIGJ1aWxkZXIsIEFycmF5U2VnbWVudDxPZmZzZXQ8TXlHYW1lLkV4YW1wbGUuU3RhdD4+IGRhdGEpIHsgYnVpbGRlci5TdGFydFZlY3Rvcig0LCBkYXRhLkNvdW50LCA0KTsgYnVpbGRlci5BZGQoZGF0YSk7IHJldHVybiBidWlsZGVyLkVuZFZlY3RvcigpOyB9CisgIHB1YmxpYyBzdGF0aWMgVmVjdG9yT2Zmc2V0IENyZWF0ZVNjYWxhcktleVNvcnRlZFRhYmxlc1ZlY3RvckJsb2NrKEZsYXRCdWZmZXJCdWlsZGVyIGJ1aWxkZXIsIEludFB0ciBkYXRhUHRyLCBpbnQgc2l6ZUluQnl0ZXMpIHsgYnVpbGRlci5TdGFydFZlY3RvcigxLCBzaXplSW5CeXRlcywgMSk7IGJ1aWxkZXIuQWRkPE9mZnNldDxNeUdhbWUuRXhhbXBsZS5TdGF0Pj4oZGF0YVB0ciwgc2l6ZUluQnl0ZXMpOyByZXR1cm4gYnVpbGRlci5FbmRWZWN0b3IoKTsgfQogICBwdWJsaWMgc3RhdGljIHZvaWQgU3RhcnRTY2FsYXJLZXlTb3J0ZWRUYWJsZXNWZWN0b3IoRmxhdEJ1ZmZlckJ1aWxkZXIgYnVpbGRlciwgaW50IG51bUVsZW1zKSB7IGJ1aWxkZXIuU3RhcnRWZWN0b3IoNCwgbnVtRWxlbXMsIDQpOyB9CiAgIHB1YmxpYyBzdGF0aWMgdm9pZCBBZGROYXRpdmVJbmxpbmUoRmxhdEJ1ZmZlckJ1aWxkZXIgYnVpbGRlciwgT2Zmc2V0PE15R2FtZS5FeGFtcGxlLlRlc3Q+IG5hdGl2ZUlubGluZU9mZnNldCkgeyBidWlsZGVyLkFkZFN0cnVjdCg1MSwgbmF0aXZlSW5saW5lT2Zmc2V0LlZhbHVlLCAwKTsgfQogICBwdWJsaWMgc3RhdGljIHZvaWQgQWRkTG9uZ0VudW1Ob25FbnVtRGVmYXVsdChGbGF0QnVmZmVyQnVpbGRlciBidWlsZGVyLCBNeUdhbWUuRXhhbXBsZS5Mb25nRW51bSBsb25nRW51bU5vbkVudW1EZWZhdWx0KSB7IGJ1aWxkZXIuQWRkVWxvbmcoNTIsICh1bG9uZylsb25nRW51bU5vbkVudW1EZWZhdWx0LCAwKTsgfQpAQCAtNDQ0LDE4ICs0NzgsMjEgQEAKICAgcHVibGljIHN0YXRpYyB2b2lkIEZpbmlzaFNpemVQcmVmaXhlZE1vbnN0ZXJCdWZmZXIoRmxhdEJ1ZmZlckJ1aWxkZXIgYnVpbGRlciwgT2Zmc2V0PE15R2FtZS5FeGFtcGxlLk1vbnN0ZXI+IG9mZnNldCkgeyBidWlsZGVyLkZpbmlzaFNpemVQcmVmaXhlZChvZmZzZXQuVmFsdWUsICJNT05TIik7IH0KIAogICBwdWJsaWMgc3RhdGljIFZlY3Rvck9mZnNldCBDcmVhdGVTb3J0ZWRWZWN0b3JPZk1vbnN0ZXIoRmxhdEJ1ZmZlckJ1aWxkZXIgYnVpbGRlciwgT2Zmc2V0PE1vbnN0ZXI+W10gb2Zmc2V0cykgewotICAgIEFycmF5LlNvcnQob2Zmc2V0cywgKE9mZnNldDxNb25zdGVyPiBvMSwgT2Zmc2V0PE1vbnN0ZXI+IG8yKSA9PiBUYWJsZS5Db21wYXJlU3RyaW5ncyhUYWJsZS5fX29mZnNldCgxMCwgbzEuVmFsdWUsIGJ1aWxkZXIuRGF0YUJ1ZmZlciksIFRhYmxlLl9fb2Zmc2V0KDEwLCBvMi5WYWx1ZSwgYnVpbGRlci5EYXRhQnVmZmVyKSwgYnVpbGRlci5EYXRhQnVmZmVyKSk7CisgICAgQXJyYXkuU29ydChvZmZzZXRzLAorICAgICAgKE9mZnNldDxNb25zdGVyPiBvMSwgT2Zmc2V0PE1vbnN0ZXI+IG8yKSA9PgorICAgICAgICBuZXcgTW9uc3RlcigpLl9fYXNzaWduKGJ1aWxkZXIuRGF0YUJ1ZmZlci5MZW5ndGggLSBvMS5WYWx1ZSwgYnVpbGRlci5EYXRhQnVmZmVyKS5OYW1lLkNvbXBhcmVUbyhuZXcgTW9uc3RlcigpLl9fYXNzaWduKGJ1aWxkZXIuRGF0YUJ1ZmZlci5MZW5ndGggLSBvMi5WYWx1ZSwgYnVpbGRlci5EYXRhQnVmZmVyKS5OYW1lKSk7CiAgICAgcmV0dXJuIGJ1aWxkZXIuQ3JlYXRlVmVjdG9yT2ZUYWJsZXMob2Zmc2V0cyk7CiAgIH0KIAogICBwdWJsaWMgc3RhdGljIE1vbnN0ZXI/IF9fbG9va3VwX2J5X2tleShpbnQgdmVjdG9yTG9jYXRpb24sIHN0cmluZyBrZXksIEJ5dGVCdWZmZXIgYmIpIHsKLSAgICBieXRlW10gYnl0ZUtleSA9IFN5c3RlbS5UZXh0LkVuY29kaW5nLlVURjguR2V0Qnl0ZXMoa2V5KTsKKyAgICBNb25zdGVyIG9ial8gPSBuZXcgTW9uc3RlcigpOwogICAgIGludCBzcGFuID0gYmIuR2V0SW50KHZlY3RvckxvY2F0aW9uIC0gNCk7CiAgICAgaW50IHN0YXJ0ID0gMDsKICAgICB3aGlsZSAoc3BhbiAhPSAwKSB7CiAgICAgICBpbnQgbWlkZGxlID0gc3BhbiAvIDI7CiAgICAgICBpbnQgdGFibGVPZmZzZXQgPSBUYWJsZS5fX2luZGlyZWN0KHZlY3RvckxvY2F0aW9uICsgNCAqIChzdGFydCArIG1pZGRsZSksIGJiKTsKLSAgICAgIGludCBjb21wID0gVGFibGUuQ29tcGFyZVN0cmluZ3MoVGFibGUuX19vZmZzZXQoMTAsIGJiLkxlbmd0aCAtIHRhYmxlT2Zmc2V0LCBiYiksIGJ5dGVLZXksIGJiKTsKKyAgICAgIG9ial8uX19hc3NpZ24odGFibGVPZmZzZXQsIGJiKTsKKyAgICAgIGludCBjb21wID0gb2JqXy5OYW1lLkNvbXBhcmVUbyhrZXkpOwogICAgICAgaWYgKGNvbXAgPiAwKSB7CiAgICAgICAgIHNwYW4gPSBtaWRkbGU7CiAgICAgICB9IGVsc2UgaWYgKGNvbXAgPCAwKSB7CkBAIC00NjMsNyArNTAwLDcgQEAKICAgICAgICAgc3RhcnQgKz0gbWlkZGxlOwogICAgICAgICBzcGFuIC09IG1pZGRsZTsKICAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHJldHVybiBuZXcgTW9uc3RlcigpLl9fYXNzaWduKHRhYmxlT2Zmc2V0LCBiYik7CisgICAgICAgIHJldHVybiBvYmpfOwogICAgICAgfQogICAgIH0KICAgICByZXR1cm4gbnVsbDsKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL015R2FtZS9FeGFtcGxlL01vbnN0ZXIuZ28gYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9NeUdhbWUvRXhhbXBsZS9Nb25zdGVyLmdvCmluZGV4IDA2N2JlMGQuLjIzNzg5NmMgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL015R2FtZS9FeGFtcGxlL01vbnN0ZXIuZ28KKysrIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvTXlHYW1lL0V4YW1wbGUvTW9uc3Rlci5nbwpAQCAtMTAsNTYgKzEwLDU2IEBACiAKIC8vLyBhbiBleGFtcGxlIGRvY3VtZW50YXRpb24gY29tbWVudDogIm1vbnN0ZXIgb2JqZWN0IgogdHlwZSBNb25zdGVyVCBzdHJ1Y3QgewotCVBvcyAqVmVjM1QKLQlNYW5hIGludDE2Ci0JSHAgaW50MTYKLQlOYW1lIHN0cmluZwotCUludmVudG9yeSBbXWJ5dGUKLQlDb2xvciBDb2xvcgotCVRlc3QgKkFueVQKLQlUZXN0NCBbXSpUZXN0VAotCVRlc3RhcnJheW9mc3RyaW5nIFtdc3RyaW5nCi0JVGVzdGFycmF5b2Z0YWJsZXMgW10qTW9uc3RlclQKLQlFbmVteSAqTW9uc3RlclQKLQlUZXN0bmVzdGVkZmxhdGJ1ZmZlciBbXWJ5dGUKLQlUZXN0ZW1wdHkgKlN0YXRUCi0JVGVzdGJvb2wgYm9vbAotCVRlc3RoYXNoczMyRm52MSBpbnQzMgotCVRlc3RoYXNodTMyRm52MSB1aW50MzIKLQlUZXN0aGFzaHM2NEZudjEgaW50NjQKLQlUZXN0aGFzaHU2NEZudjEgdWludDY0Ci0JVGVzdGhhc2hzMzJGbnYxYSBpbnQzMgotCVRlc3RoYXNodTMyRm52MWEgdWludDMyCi0JVGVzdGhhc2hzNjRGbnYxYSBpbnQ2NAotCVRlc3RoYXNodTY0Rm52MWEgdWludDY0Ci0JVGVzdGFycmF5b2Zib29scyBbXWJvb2wKLQlUZXN0ZiBmbG9hdDMyCi0JVGVzdGYyIGZsb2F0MzIKLQlUZXN0ZjMgZmxvYXQzMgotCVRlc3RhcnJheW9mc3RyaW5nMiBbXXN0cmluZwotCVRlc3RhcnJheW9mc29ydGVkc3RydWN0IFtdKkFiaWxpdHlUCi0JRmxleCBbXWJ5dGUKLQlUZXN0NSBbXSpUZXN0VAotCVZlY3Rvck9mTG9uZ3MgW11pbnQ2NAotCVZlY3Rvck9mRG91YmxlcyBbXWZsb2F0NjQKLQlQYXJlbnROYW1lc3BhY2VUZXN0ICpNeUdhbWUuSW5QYXJlbnROYW1lc3BhY2VUCi0JVmVjdG9yT2ZSZWZlcnJhYmxlcyBbXSpSZWZlcnJhYmxlVAotCVNpbmdsZVdlYWtSZWZlcmVuY2UgdWludDY0Ci0JVmVjdG9yT2ZXZWFrUmVmZXJlbmNlcyBbXXVpbnQ2NAotCVZlY3Rvck9mU3Ryb25nUmVmZXJyYWJsZXMgW10qUmVmZXJyYWJsZVQKLQlDb093bmluZ1JlZmVyZW5jZSB1aW50NjQKLQlWZWN0b3JPZkNvT3duaW5nUmVmZXJlbmNlcyBbXXVpbnQ2NAotCU5vbk93bmluZ1JlZmVyZW5jZSB1aW50NjQKLQlWZWN0b3JPZk5vbk93bmluZ1JlZmVyZW5jZXMgW111aW50NjQKLQlBbnlVbmlxdWUgKkFueVVuaXF1ZUFsaWFzZXNUCi0JQW55QW1iaWd1b3VzICpBbnlBbWJpZ3VvdXNBbGlhc2VzVAotCVZlY3Rvck9mRW51bXMgW11Db2xvcgotCVNpZ25lZEVudW0gUmFjZQotCVRlc3RyZXF1aXJlZG5lc3RlZGZsYXRidWZmZXIgW11ieXRlCi0JU2NhbGFyS2V5U29ydGVkVGFibGVzIFtdKlN0YXRUCi0JTmF0aXZlSW5saW5lICpUZXN0VAotCUxvbmdFbnVtTm9uRW51bURlZmF1bHQgTG9uZ0VudW0KLQlMb25nRW51bU5vcm1hbERlZmF1bHQgTG9uZ0VudW0KKwlQb3MgKlZlYzNUIGBqc29uOiJwb3MiYAorCU1hbmEgaW50MTYgYGpzb246Im1hbmEiYAorCUhwIGludDE2IGBqc29uOiJocCJgCisJTmFtZSBzdHJpbmcgYGpzb246Im5hbWUiYAorCUludmVudG9yeSBbXWJ5dGUgYGpzb246ImludmVudG9yeSJgCisJQ29sb3IgQ29sb3IgYGpzb246ImNvbG9yImAKKwlUZXN0ICpBbnlUIGBqc29uOiJ0ZXN0ImAKKwlUZXN0NCBbXSpUZXN0VCBganNvbjoidGVzdDQiYAorCVRlc3RhcnJheW9mc3RyaW5nIFtdc3RyaW5nIGBqc29uOiJ0ZXN0YXJyYXlvZnN0cmluZyJgCisJVGVzdGFycmF5b2Z0YWJsZXMgW10qTW9uc3RlclQgYGpzb246InRlc3RhcnJheW9mdGFibGVzImAKKwlFbmVteSAqTW9uc3RlclQgYGpzb246ImVuZW15ImAKKwlUZXN0bmVzdGVkZmxhdGJ1ZmZlciBbXWJ5dGUgYGpzb246InRlc3RuZXN0ZWRmbGF0YnVmZmVyImAKKwlUZXN0ZW1wdHkgKlN0YXRUIGBqc29uOiJ0ZXN0ZW1wdHkiYAorCVRlc3Rib29sIGJvb2wgYGpzb246InRlc3Rib29sImAKKwlUZXN0aGFzaHMzMkZudjEgaW50MzIgYGpzb246InRlc3RoYXNoczMyX2ZudjEiYAorCVRlc3RoYXNodTMyRm52MSB1aW50MzIgYGpzb246InRlc3RoYXNodTMyX2ZudjEiYAorCVRlc3RoYXNoczY0Rm52MSBpbnQ2NCBganNvbjoidGVzdGhhc2hzNjRfZm52MSJgCisJVGVzdGhhc2h1NjRGbnYxIHVpbnQ2NCBganNvbjoidGVzdGhhc2h1NjRfZm52MSJgCisJVGVzdGhhc2hzMzJGbnYxYSBpbnQzMiBganNvbjoidGVzdGhhc2hzMzJfZm52MWEiYAorCVRlc3RoYXNodTMyRm52MWEgdWludDMyIGBqc29uOiJ0ZXN0aGFzaHUzMl9mbnYxYSJgCisJVGVzdGhhc2hzNjRGbnYxYSBpbnQ2NCBganNvbjoidGVzdGhhc2hzNjRfZm52MWEiYAorCVRlc3RoYXNodTY0Rm52MWEgdWludDY0IGBqc29uOiJ0ZXN0aGFzaHU2NF9mbnYxYSJgCisJVGVzdGFycmF5b2Zib29scyBbXWJvb2wgYGpzb246InRlc3RhcnJheW9mYm9vbHMiYAorCVRlc3RmIGZsb2F0MzIgYGpzb246InRlc3RmImAKKwlUZXN0ZjIgZmxvYXQzMiBganNvbjoidGVzdGYyImAKKwlUZXN0ZjMgZmxvYXQzMiBganNvbjoidGVzdGYzImAKKwlUZXN0YXJyYXlvZnN0cmluZzIgW11zdHJpbmcgYGpzb246InRlc3RhcnJheW9mc3RyaW5nMiJgCisJVGVzdGFycmF5b2Zzb3J0ZWRzdHJ1Y3QgW10qQWJpbGl0eVQgYGpzb246InRlc3RhcnJheW9mc29ydGVkc3RydWN0ImAKKwlGbGV4IFtdYnl0ZSBganNvbjoiZmxleCJgCisJVGVzdDUgW10qVGVzdFQgYGpzb246InRlc3Q1ImAKKwlWZWN0b3JPZkxvbmdzIFtdaW50NjQgYGpzb246InZlY3Rvcl9vZl9sb25ncyJgCisJVmVjdG9yT2ZEb3VibGVzIFtdZmxvYXQ2NCBganNvbjoidmVjdG9yX29mX2RvdWJsZXMiYAorCVBhcmVudE5hbWVzcGFjZVRlc3QgKk15R2FtZS5JblBhcmVudE5hbWVzcGFjZVQgYGpzb246InBhcmVudF9uYW1lc3BhY2VfdGVzdCJgCisJVmVjdG9yT2ZSZWZlcnJhYmxlcyBbXSpSZWZlcnJhYmxlVCBganNvbjoidmVjdG9yX29mX3JlZmVycmFibGVzImAKKwlTaW5nbGVXZWFrUmVmZXJlbmNlIHVpbnQ2NCBganNvbjoic2luZ2xlX3dlYWtfcmVmZXJlbmNlImAKKwlWZWN0b3JPZldlYWtSZWZlcmVuY2VzIFtddWludDY0IGBqc29uOiJ2ZWN0b3Jfb2Zfd2Vha19yZWZlcmVuY2VzImAKKwlWZWN0b3JPZlN0cm9uZ1JlZmVycmFibGVzIFtdKlJlZmVycmFibGVUIGBqc29uOiJ2ZWN0b3Jfb2Zfc3Ryb25nX3JlZmVycmFibGVzImAKKwlDb093bmluZ1JlZmVyZW5jZSB1aW50NjQgYGpzb246ImNvX293bmluZ19yZWZlcmVuY2UiYAorCVZlY3Rvck9mQ29Pd25pbmdSZWZlcmVuY2VzIFtddWludDY0IGBqc29uOiJ2ZWN0b3Jfb2ZfY29fb3duaW5nX3JlZmVyZW5jZXMiYAorCU5vbk93bmluZ1JlZmVyZW5jZSB1aW50NjQgYGpzb246Im5vbl9vd25pbmdfcmVmZXJlbmNlImAKKwlWZWN0b3JPZk5vbk93bmluZ1JlZmVyZW5jZXMgW111aW50NjQgYGpzb246InZlY3Rvcl9vZl9ub25fb3duaW5nX3JlZmVyZW5jZXMiYAorCUFueVVuaXF1ZSAqQW55VW5pcXVlQWxpYXNlc1QgYGpzb246ImFueV91bmlxdWUiYAorCUFueUFtYmlndW91cyAqQW55QW1iaWd1b3VzQWxpYXNlc1QgYGpzb246ImFueV9hbWJpZ3VvdXMiYAorCVZlY3Rvck9mRW51bXMgW11Db2xvciBganNvbjoidmVjdG9yX29mX2VudW1zImAKKwlTaWduZWRFbnVtIFJhY2UgYGpzb246InNpZ25lZF9lbnVtImAKKwlUZXN0cmVxdWlyZWRuZXN0ZWRmbGF0YnVmZmVyIFtdYnl0ZSBganNvbjoidGVzdHJlcXVpcmVkbmVzdGVkZmxhdGJ1ZmZlciJgCisJU2NhbGFyS2V5U29ydGVkVGFibGVzIFtdKlN0YXRUIGBqc29uOiJzY2FsYXJfa2V5X3NvcnRlZF90YWJsZXMiYAorCU5hdGl2ZUlubGluZSAqVGVzdFQgYGpzb246Im5hdGl2ZV9pbmxpbmUiYAorCUxvbmdFbnVtTm9uRW51bURlZmF1bHQgTG9uZ0VudW0gYGpzb246ImxvbmdfZW51bV9ub25fZW51bV9kZWZhdWx0ImAKKwlMb25nRW51bU5vcm1hbERlZmF1bHQgTG9uZ0VudW0gYGpzb246ImxvbmdfZW51bV9ub3JtYWxfZGVmYXVsdCJgCiB9CiAKIGZ1bmMgKHQgKk1vbnN0ZXJUKSBQYWNrKGJ1aWxkZXIgKmZsYXRidWZmZXJzLkJ1aWxkZXIpIGZsYXRidWZmZXJzLlVPZmZzZXRUIHsKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL015R2FtZS9FeGFtcGxlL01vbnN0ZXIuamF2YSBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL015R2FtZS9FeGFtcGxlL01vbnN0ZXIuamF2YQppbmRleCBhZWFlMjU3Li41MzM5MDU0IDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9NeUdhbWUvRXhhbXBsZS9Nb25zdGVyLmphdmEKKysrIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvTXlHYW1lL0V4YW1wbGUvTW9uc3Rlci5qYXZhCkBAIC0xMiw3ICsxMiw3IEBACiAgKi8KIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKQogcHVibGljIGZpbmFsIGNsYXNzIE1vbnN0ZXIgZXh0ZW5kcyBUYWJsZSB7Ci0gIHB1YmxpYyBzdGF0aWMgdm9pZCBWYWxpZGF0ZVZlcnNpb24oKSB7IENvbnN0YW50cy5GTEFUQlVGRkVSU18yXzBfMCgpOyB9CisgIHB1YmxpYyBzdGF0aWMgdm9pZCBWYWxpZGF0ZVZlcnNpb24oKSB7IENvbnN0YW50cy5GTEFUQlVGRkVSU18yXzBfOCgpOyB9CiAgIHB1YmxpYyBzdGF0aWMgTW9uc3RlciBnZXRSb290QXNNb25zdGVyKEJ5dGVCdWZmZXIgX2JiKSB7IHJldHVybiBnZXRSb290QXNNb25zdGVyKF9iYiwgbmV3IE1vbnN0ZXIoKSk7IH0KICAgcHVibGljIHN0YXRpYyBNb25zdGVyIGdldFJvb3RBc01vbnN0ZXIoQnl0ZUJ1ZmZlciBfYmIsIE1vbnN0ZXIgb2JqKSB7IF9iYi5vcmRlcihCeXRlT3JkZXIuTElUVExFX0VORElBTik7IHJldHVybiAob2JqLl9fYXNzaWduKF9iYi5nZXRJbnQoX2JiLnBvc2l0aW9uKCkpICsgX2JiLnBvc2l0aW9uKCksIF9iYikpOyB9CiAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBNb25zdGVyQnVmZmVySGFzSWRlbnRpZmllcihCeXRlQnVmZmVyIF9iYikgeyByZXR1cm4gX19oYXNfaWRlbnRpZmllcihfYmIsICJNT05TIik7IH0KQEAgLTIyMSw3ICsyMjEsNyBAQAogICBwdWJsaWMgc3RhdGljIHZvaWQgYWRkUG9zKEZsYXRCdWZmZXJCdWlsZGVyIGJ1aWxkZXIsIGludCBwb3NPZmZzZXQpIHsgYnVpbGRlci5hZGRTdHJ1Y3QoMCwgcG9zT2Zmc2V0LCAwKTsgfQogICBwdWJsaWMgc3RhdGljIHZvaWQgYWRkTWFuYShGbGF0QnVmZmVyQnVpbGRlciBidWlsZGVyLCBzaG9ydCBtYW5hKSB7IGJ1aWxkZXIuYWRkU2hvcnQoMSwgbWFuYSwgMTUwKTsgfQogICBwdWJsaWMgc3RhdGljIHZvaWQgYWRkSHAoRmxhdEJ1ZmZlckJ1aWxkZXIgYnVpbGRlciwgc2hvcnQgaHApIHsgYnVpbGRlci5hZGRTaG9ydCgyLCBocCwgMTAwKTsgfQotICBwdWJsaWMgc3RhdGljIHZvaWQgYWRkTmFtZShGbGF0QnVmZmVyQnVpbGRlciBidWlsZGVyLCBpbnQgbmFtZU9mZnNldCkgeyBidWlsZGVyLmFkZE9mZnNldCgzLCBuYW1lT2Zmc2V0LCAwKTsgfQorICBwdWJsaWMgc3RhdGljIHZvaWQgYWRkTmFtZShGbGF0QnVmZmVyQnVpbGRlciBidWlsZGVyLCBpbnQgbmFtZU9mZnNldCkgeyBidWlsZGVyLmFkZE9mZnNldChuYW1lT2Zmc2V0KTsgYnVpbGRlci5zbG90KDMpOyB9CiAgIHB1YmxpYyBzdGF0aWMgdm9pZCBhZGRJbnZlbnRvcnkoRmxhdEJ1ZmZlckJ1aWxkZXIgYnVpbGRlciwgaW50IGludmVudG9yeU9mZnNldCkgeyBidWlsZGVyLmFkZE9mZnNldCg1LCBpbnZlbnRvcnlPZmZzZXQsIDApOyB9CiAgIHB1YmxpYyBzdGF0aWMgaW50IGNyZWF0ZUludmVudG9yeVZlY3RvcihGbGF0QnVmZmVyQnVpbGRlciBidWlsZGVyLCBieXRlW10gZGF0YSkgeyByZXR1cm4gYnVpbGRlci5jcmVhdGVCeXRlVmVjdG9yKGRhdGEpOyB9CiAgIHB1YmxpYyBzdGF0aWMgaW50IGNyZWF0ZUludmVudG9yeVZlY3RvcihGbGF0QnVmZmVyQnVpbGRlciBidWlsZGVyLCBCeXRlQnVmZmVyIGRhdGEpIHsgcmV0dXJuIGJ1aWxkZXIuY3JlYXRlQnl0ZVZlY3RvcihkYXRhKTsgfQpAQCAtNTQ5LDggKzU0OSw5IEBACiAgICAgaW50IF90ZXN0NCA9IDA7CiAgICAgTXlHYW1lLkV4YW1wbGUuVGVzdFRbXSBfb1Rlc3Q0ID0gX28uZ2V0VGVzdDQoKTsKICAgICBpZiAoX29UZXN0NCAhPSBudWxsKSB7CisgICAgICBpbnQgX3VudXNlZF9vZmZzZXQgPSAwOwogICAgICAgc3RhcnRUZXN0NFZlY3RvcihidWlsZGVyLCBfb1Rlc3Q0Lmxlbmd0aCk7Ci0gICAgICBmb3IgKGludCBfaiA9IF9vVGVzdDQubGVuZ3RoIC0gMTsgX2ogPj0wOyBfai0tKSB7IE15R2FtZS5FeGFtcGxlLlRlc3QucGFjayhidWlsZGVyLCBfb1Rlc3Q0W19qXSk7fQorICAgICAgZm9yIChpbnQgX2ogPSBfb1Rlc3Q0Lmxlbmd0aCAtIDE7IF9qID49MDsgX2otLSkgeyBfdW51c2VkX29mZnNldCA9IE15R2FtZS5FeGFtcGxlLlRlc3QucGFjayhidWlsZGVyLCBfb1Rlc3Q0W19qXSk7fQogICAgICAgX3Rlc3Q0ID0gYnVpbGRlci5lbmRWZWN0b3IoKTsKICAgICB9CiAgICAgaW50IF90ZXN0YXJyYXlvZnN0cmluZyA9IDA7CkBAIC01OTAsOCArNTkxLDkgQEAKICAgICBpbnQgX3Rlc3RhcnJheW9mc29ydGVkc3RydWN0ID0gMDsKICAgICBNeUdhbWUuRXhhbXBsZS5BYmlsaXR5VFtdIF9vVGVzdGFycmF5b2Zzb3J0ZWRzdHJ1Y3QgPSBfby5nZXRUZXN0YXJyYXlvZnNvcnRlZHN0cnVjdCgpOwogICAgIGlmIChfb1Rlc3RhcnJheW9mc29ydGVkc3RydWN0ICE9IG51bGwpIHsKKyAgICAgIGludCBfdW51c2VkX29mZnNldCA9IDA7CiAgICAgICBzdGFydFRlc3RhcnJheW9mc29ydGVkc3RydWN0VmVjdG9yKGJ1aWxkZXIsIF9vVGVzdGFycmF5b2Zzb3J0ZWRzdHJ1Y3QubGVuZ3RoKTsKLSAgICAgIGZvciAoaW50IF9qID0gX29UZXN0YXJyYXlvZnNvcnRlZHN0cnVjdC5sZW5ndGggLSAxOyBfaiA+PTA7IF9qLS0pIHsgTXlHYW1lLkV4YW1wbGUuQWJpbGl0eS5wYWNrKGJ1aWxkZXIsIF9vVGVzdGFycmF5b2Zzb3J0ZWRzdHJ1Y3RbX2pdKTt9CisgICAgICBmb3IgKGludCBfaiA9IF9vVGVzdGFycmF5b2Zzb3J0ZWRzdHJ1Y3QubGVuZ3RoIC0gMTsgX2ogPj0wOyBfai0tKSB7IF91bnVzZWRfb2Zmc2V0ID0gTXlHYW1lLkV4YW1wbGUuQWJpbGl0eS5wYWNrKGJ1aWxkZXIsIF9vVGVzdGFycmF5b2Zzb3J0ZWRzdHJ1Y3RbX2pdKTt9CiAgICAgICBfdGVzdGFycmF5b2Zzb3J0ZWRzdHJ1Y3QgPSBidWlsZGVyLmVuZFZlY3RvcigpOwogICAgIH0KICAgICBpbnQgX2ZsZXggPSAwOwpAQCAtNjA0LDggKzYwNiw5IEBACiAgICAgaW50IF90ZXN0NSA9IDA7CiAgICAgTXlHYW1lLkV4YW1wbGUuVGVzdFRbXSBfb1Rlc3Q1ID0gX28uZ2V0VGVzdDUoKTsKICAgICBpZiAoX29UZXN0NSAhPSBudWxsKSB7CisgICAgICBpbnQgX3VudXNlZF9vZmZzZXQgPSAwOwogICAgICAgc3RhcnRUZXN0NVZlY3RvcihidWlsZGVyLCBfb1Rlc3Q1Lmxlbmd0aCk7Ci0gICAgICBmb3IgKGludCBfaiA9IF9vVGVzdDUubGVuZ3RoIC0gMTsgX2ogPj0wOyBfai0tKSB7IE15R2FtZS5FeGFtcGxlLlRlc3QucGFjayhidWlsZGVyLCBfb1Rlc3Q1W19qXSk7fQorICAgICAgZm9yIChpbnQgX2ogPSBfb1Rlc3Q1Lmxlbmd0aCAtIDE7IF9qID49MDsgX2otLSkgeyBfdW51c2VkX29mZnNldCA9IE15R2FtZS5FeGFtcGxlLlRlc3QucGFjayhidWlsZGVyLCBfb1Rlc3Q1W19qXSk7fQogICAgICAgX3Rlc3Q1ID0gYnVpbGRlci5lbmRWZWN0b3IoKTsKICAgICB9CiAgICAgaW50IF92ZWN0b3JPZkxvbmdzID0gMDsKQEAgLTYxNiw3ICs2MTksNyBAQAogICAgIGlmIChfby5nZXRWZWN0b3JPZkRvdWJsZXMoKSAhPSBudWxsKSB7CiAgICAgICBfdmVjdG9yT2ZEb3VibGVzID0gY3JlYXRlVmVjdG9yT2ZEb3VibGVzVmVjdG9yKGJ1aWxkZXIsIF9vLmdldFZlY3Rvck9mRG91YmxlcygpKTsKICAgICB9Ci0gICAgaW50IF9wYXJlbnRfbmFtZXNwYWNlX3Rlc3QgPSBfby5nZXRQYXJlbnROYW1lc3BhY2VUZXN0KCkgPT0gbnVsbCA/IDAgOiBNeUdhbWUuSW5QYXJlbnROYW1lc3BhY2UucGFjayhidWlsZGVyLCBfby5nZXRQYXJlbnROYW1lc3BhY2VUZXN0KCkpOworICAgIGludCBfcGFyZW50TmFtZXNwYWNlVGVzdCA9IF9vLmdldFBhcmVudE5hbWVzcGFjZVRlc3QoKSA9PSBudWxsID8gMCA6IE15R2FtZS5JblBhcmVudE5hbWVzcGFjZS5wYWNrKGJ1aWxkZXIsIF9vLmdldFBhcmVudE5hbWVzcGFjZVRlc3QoKSk7CiAgICAgaW50IF92ZWN0b3JPZlJlZmVycmFibGVzID0gMDsKICAgICBpZiAoX28uZ2V0VmVjdG9yT2ZSZWZlcnJhYmxlcygpICE9IG51bGwpIHsKICAgICAgIGludFtdIF9fdmVjdG9yT2ZSZWZlcnJhYmxlcyA9IG5ldyBpbnRbX28uZ2V0VmVjdG9yT2ZSZWZlcnJhYmxlcygpLmxlbmd0aF07CkBAIC03MDIsNyArNzA1LDcgQEAKICAgICBhZGRUZXN0NShidWlsZGVyLCBfdGVzdDUpOwogICAgIGFkZFZlY3Rvck9mTG9uZ3MoYnVpbGRlciwgX3ZlY3Rvck9mTG9uZ3MpOwogICAgIGFkZFZlY3Rvck9mRG91YmxlcyhidWlsZGVyLCBfdmVjdG9yT2ZEb3VibGVzKTsKLSAgICBhZGRQYXJlbnROYW1lc3BhY2VUZXN0KGJ1aWxkZXIsIF9wYXJlbnRfbmFtZXNwYWNlX3Rlc3QpOworICAgIGFkZFBhcmVudE5hbWVzcGFjZVRlc3QoYnVpbGRlciwgX3BhcmVudE5hbWVzcGFjZVRlc3QpOwogICAgIGFkZFZlY3Rvck9mUmVmZXJyYWJsZXMoYnVpbGRlciwgX3ZlY3Rvck9mUmVmZXJyYWJsZXMpOwogICAgIGFkZFNpbmdsZVdlYWtSZWZlcmVuY2UoYnVpbGRlciwgX28uZ2V0U2luZ2xlV2Vha1JlZmVyZW5jZSgpKTsKICAgICBhZGRWZWN0b3JPZldlYWtSZWZlcmVuY2VzKGJ1aWxkZXIsIF92ZWN0b3JPZldlYWtSZWZlcmVuY2VzKTsKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL015R2FtZS9FeGFtcGxlL01vbnN0ZXIua3QgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9NeUdhbWUvRXhhbXBsZS9Nb25zdGVyLmt0CmluZGV4IDFhYmUwNWMuLmZlY2Y2NjUgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL015R2FtZS9FeGFtcGxlL01vbnN0ZXIua3QKKysrIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvTXlHYW1lL0V4YW1wbGUvTW9uc3Rlci5rdApAQCAtODc0LDcgKzg3NCw3IEBACiAgICAgICAgICByZXR1cm4gY29tcGFyZVN0cmluZ3MoX19vZmZzZXQoMTAsIG8xLCBfYmIpLCBfX29mZnNldCgxMCwgbzIsIF9iYiksIF9iYikKICAgICB9CiAgICAgY29tcGFuaW9uIG9iamVjdCB7Ci0gICAgICAgIGZ1biB2YWxpZGF0ZVZlcnNpb24oKSA9IENvbnN0YW50cy5GTEFUQlVGRkVSU18yXzBfMCgpCisgICAgICAgIGZ1biB2YWxpZGF0ZVZlcnNpb24oKSA9IENvbnN0YW50cy5GTEFUQlVGRkVSU18yXzBfOCgpCiAgICAgICAgIGZ1biBnZXRSb290QXNNb25zdGVyKF9iYjogQnl0ZUJ1ZmZlcik6IE1vbnN0ZXIgPSBnZXRSb290QXNNb25zdGVyKF9iYiwgTW9uc3RlcigpKQogICAgICAgICBmdW4gZ2V0Um9vdEFzTW9uc3RlcihfYmI6IEJ5dGVCdWZmZXIsIG9iajogTW9uc3Rlcik6IE1vbnN0ZXIgewogICAgICAgICAgICAgX2JiLm9yZGVyKEJ5dGVPcmRlci5MSVRUTEVfRU5ESUFOKQpAQCAtODg1LDcgKzg4NSwxMCBAQAogICAgICAgICBmdW4gYWRkUG9zKGJ1aWxkZXI6IEZsYXRCdWZmZXJCdWlsZGVyLCBwb3M6IEludCkgPSBidWlsZGVyLmFkZFN0cnVjdCgwLCBwb3MsIDApCiAgICAgICAgIGZ1biBhZGRNYW5hKGJ1aWxkZXI6IEZsYXRCdWZmZXJCdWlsZGVyLCBtYW5hOiBTaG9ydCkgPSBidWlsZGVyLmFkZFNob3J0KDEsIG1hbmEsIDE1MCkKICAgICAgICAgZnVuIGFkZEhwKGJ1aWxkZXI6IEZsYXRCdWZmZXJCdWlsZGVyLCBocDogU2hvcnQpID0gYnVpbGRlci5hZGRTaG9ydCgyLCBocCwgMTAwKQotICAgICAgICBmdW4gYWRkTmFtZShidWlsZGVyOiBGbGF0QnVmZmVyQnVpbGRlciwgbmFtZTogSW50KSA9IGJ1aWxkZXIuYWRkT2Zmc2V0KDMsIG5hbWUsIDApCisgICAgICAgIGZ1biBhZGROYW1lKGJ1aWxkZXI6IEZsYXRCdWZmZXJCdWlsZGVyLCBuYW1lOiBJbnQpICB7CisgICAgICAgICAgICBidWlsZGVyLmFkZE9mZnNldChuYW1lKQorICAgICAgICAgICAgYnVpbGRlci5zbG90KDMpCisgICAgICAgIH0KICAgICAgICAgZnVuIGFkZEludmVudG9yeShidWlsZGVyOiBGbGF0QnVmZmVyQnVpbGRlciwgaW52ZW50b3J5OiBJbnQpID0gYnVpbGRlci5hZGRPZmZzZXQoNSwgaW52ZW50b3J5LCAwKQogICAgICAgICBmdW4gY3JlYXRlSW52ZW50b3J5VmVjdG9yKGJ1aWxkZXI6IEZsYXRCdWZmZXJCdWlsZGVyLCBkYXRhOiBVQnl0ZUFycmF5KSA6IEludCB7CiAgICAgICAgICAgICBidWlsZGVyLnN0YXJ0VmVjdG9yKDEsIGRhdGEuc2l6ZSwgMSkKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL015R2FtZS9FeGFtcGxlL01vbnN0ZXIubHVhIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvTXlHYW1lL0V4YW1wbGUvTW9uc3Rlci5sdWEKaW5kZXggNzUxMDhlNS4uNjY5N2M5YiAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvTXlHYW1lL0V4YW1wbGUvTW9uc3Rlci5sdWEKKysrIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvTXlHYW1lL0V4YW1wbGUvTW9uc3Rlci5sdWEKQEAgLTMsNyArMyw3IEBACiAgIEF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGJ5IHRoZSBGbGF0QnVmZmVycyBjb21waWxlciwgZG8gbm90IG1vZGlmeS4KICAgT3IgbW9kaWZ5LiBJJ20gYSBtZXNzYWdlLCBub3QgYSBjb3AuCiAKLSAgZmxhdGMgdmVyc2lvbjogMi4wLjYKKyAgZmxhdGMgdmVyc2lvbjogMi4wLjgKIAogICBEZWNsYXJlZCBieSAgOiAvL21vbnN0ZXJfdGVzdC5mYnMKICAgUm9vdGluZyB0eXBlIDogTXlHYW1lLkV4YW1wbGUuTW9uc3RlciAoLy9tb25zdGVyX3Rlc3QuZmJzKQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvTXlHYW1lL0V4YW1wbGUvTmVzdGVkU3RydWN0LmNzIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvTXlHYW1lL0V4YW1wbGUvTmVzdGVkU3RydWN0LmNzCmluZGV4IGYzMjMzNDIuLjc4MTczYWMgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL015R2FtZS9FeGFtcGxlL05lc3RlZFN0cnVjdC5jcworKysgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9NeUdhbWUvRXhhbXBsZS9OZXN0ZWRTdHJ1Y3QuY3MKQEAgLTcsNyArNyw3IEBACiAKIHVzaW5nIGdsb2JhbDo6U3lzdGVtOwogdXNpbmcgZ2xvYmFsOjpTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKLXVzaW5nIGdsb2JhbDo6RmxhdEJ1ZmZlcnM7Cit1c2luZyBnbG9iYWw6Okdvb2dsZS5GbGF0QnVmZmVyczsKIAogcHVibGljIHN0cnVjdCBOZXN0ZWRTdHJ1Y3QgOiBJRmxhdGJ1ZmZlck9iamVjdAogewpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvTXlHYW1lL0V4YW1wbGUvUmFjZS5sdWEgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9NeUdhbWUvRXhhbXBsZS9SYWNlLmx1YQppbmRleCBmMjQxODcwLi43YWEzN2U1IDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9NeUdhbWUvRXhhbXBsZS9SYWNlLmx1YQorKysgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9NeUdhbWUvRXhhbXBsZS9SYWNlLmx1YQpAQCAtMyw3ICszLDcgQEAKICAgQXV0b21hdGljYWxseSBnZW5lcmF0ZWQgYnkgdGhlIEZsYXRCdWZmZXJzIGNvbXBpbGVyLCBkbyBub3QgbW9kaWZ5LgogICBPciBtb2RpZnkuIEknbSBhIG1lc3NhZ2UsIG5vdCBhIGNvcC4KIAotICBmbGF0YyB2ZXJzaW9uOiAyLjAuNgorICBmbGF0YyB2ZXJzaW9uOiAyLjAuOAogCiAgIERlY2xhcmVkIGJ5ICA6IC8vbW9uc3Rlcl90ZXN0LmZicwogICBSb290aW5nIHR5cGUgOiBNeUdhbWUuRXhhbXBsZS5Nb25zdGVyICgvL21vbnN0ZXJfdGVzdC5mYnMpCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9NeUdhbWUvRXhhbXBsZS9SZWZlcnJhYmxlLmNzIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvTXlHYW1lL0V4YW1wbGUvUmVmZXJyYWJsZS5jcwppbmRleCBlNmYzMTQ2Li5hOWI1OWM0IDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9NeUdhbWUvRXhhbXBsZS9SZWZlcnJhYmxlLmNzCisrKyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL015R2FtZS9FeGFtcGxlL1JlZmVycmFibGUuY3MKQEAgLTcsMTMgKzcsMTMgQEAKIAogdXNpbmcgZ2xvYmFsOjpTeXN0ZW07CiB1c2luZyBnbG9iYWw6OlN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwotdXNpbmcgZ2xvYmFsOjpGbGF0QnVmZmVyczsKK3VzaW5nIGdsb2JhbDo6R29vZ2xlLkZsYXRCdWZmZXJzOwogCiBwdWJsaWMgc3RydWN0IFJlZmVycmFibGUgOiBJRmxhdGJ1ZmZlck9iamVjdAogewogICBwcml2YXRlIFRhYmxlIF9fcDsKICAgcHVibGljIEJ5dGVCdWZmZXIgQnl0ZUJ1ZmZlciB7IGdldCB7IHJldHVybiBfX3AuYmI7IH0gfQotICBwdWJsaWMgc3RhdGljIHZvaWQgVmFsaWRhdGVWZXJzaW9uKCkgeyBGbGF0QnVmZmVyQ29uc3RhbnRzLkZMQVRCVUZGRVJTXzJfMF8wKCk7IH0KKyAgcHVibGljIHN0YXRpYyB2b2lkIFZhbGlkYXRlVmVyc2lvbigpIHsgRmxhdEJ1ZmZlckNvbnN0YW50cy5GTEFUQlVGRkVSU18yXzBfOCgpOyB9CiAgIHB1YmxpYyBzdGF0aWMgUmVmZXJyYWJsZSBHZXRSb290QXNSZWZlcnJhYmxlKEJ5dGVCdWZmZXIgX2JiKSB7IHJldHVybiBHZXRSb290QXNSZWZlcnJhYmxlKF9iYiwgbmV3IFJlZmVycmFibGUoKSk7IH0KICAgcHVibGljIHN0YXRpYyBSZWZlcnJhYmxlIEdldFJvb3RBc1JlZmVycmFibGUoQnl0ZUJ1ZmZlciBfYmIsIFJlZmVycmFibGUgb2JqKSB7IHJldHVybiAob2JqLl9fYXNzaWduKF9iYi5HZXRJbnQoX2JiLlBvc2l0aW9uKSArIF9iYi5Qb3NpdGlvbiwgX2JiKSk7IH0KICAgcHVibGljIHZvaWQgX19pbml0KGludCBfaSwgQnl0ZUJ1ZmZlciBfYmIpIHsgX19wID0gbmV3IFRhYmxlKF9pLCBfYmIpOyB9CkBAIC0zNywxNyArMzcsMjEgQEAKICAgfQogCiAgIHB1YmxpYyBzdGF0aWMgVmVjdG9yT2Zmc2V0IENyZWF0ZVNvcnRlZFZlY3Rvck9mUmVmZXJyYWJsZShGbGF0QnVmZmVyQnVpbGRlciBidWlsZGVyLCBPZmZzZXQ8UmVmZXJyYWJsZT5bXSBvZmZzZXRzKSB7Ci0gICAgQXJyYXkuU29ydChvZmZzZXRzLCAoT2Zmc2V0PFJlZmVycmFibGU+IG8xLCBPZmZzZXQ8UmVmZXJyYWJsZT4gbzIpID0+IGJ1aWxkZXIuRGF0YUJ1ZmZlci5HZXRVbG9uZyhUYWJsZS5fX29mZnNldCg0LCBvMS5WYWx1ZSwgYnVpbGRlci5EYXRhQnVmZmVyKSkuQ29tcGFyZVRvKGJ1aWxkZXIuRGF0YUJ1ZmZlci5HZXRVbG9uZyhUYWJsZS5fX29mZnNldCg0LCBvMi5WYWx1ZSwgYnVpbGRlci5EYXRhQnVmZmVyKSkpKTsKKyAgICBBcnJheS5Tb3J0KG9mZnNldHMsCisgICAgICAoT2Zmc2V0PFJlZmVycmFibGU+IG8xLCBPZmZzZXQ8UmVmZXJyYWJsZT4gbzIpID0+CisgICAgICAgIG5ldyBSZWZlcnJhYmxlKCkuX19hc3NpZ24oYnVpbGRlci5EYXRhQnVmZmVyLkxlbmd0aCAtIG8xLlZhbHVlLCBidWlsZGVyLkRhdGFCdWZmZXIpLklkLkNvbXBhcmVUbyhuZXcgUmVmZXJyYWJsZSgpLl9fYXNzaWduKGJ1aWxkZXIuRGF0YUJ1ZmZlci5MZW5ndGggLSBvMi5WYWx1ZSwgYnVpbGRlci5EYXRhQnVmZmVyKS5JZCkpOwogICAgIHJldHVybiBidWlsZGVyLkNyZWF0ZVZlY3Rvck9mVGFibGVzKG9mZnNldHMpOwogICB9CiAKICAgcHVibGljIHN0YXRpYyBSZWZlcnJhYmxlPyBfX2xvb2t1cF9ieV9rZXkoaW50IHZlY3RvckxvY2F0aW9uLCB1bG9uZyBrZXksIEJ5dGVCdWZmZXIgYmIpIHsKKyAgICBSZWZlcnJhYmxlIG9ial8gPSBuZXcgUmVmZXJyYWJsZSgpOwogICAgIGludCBzcGFuID0gYmIuR2V0SW50KHZlY3RvckxvY2F0aW9uIC0gNCk7CiAgICAgaW50IHN0YXJ0ID0gMDsKICAgICB3aGlsZSAoc3BhbiAhPSAwKSB7CiAgICAgICBpbnQgbWlkZGxlID0gc3BhbiAvIDI7CiAgICAgICBpbnQgdGFibGVPZmZzZXQgPSBUYWJsZS5fX2luZGlyZWN0KHZlY3RvckxvY2F0aW9uICsgNCAqIChzdGFydCArIG1pZGRsZSksIGJiKTsKLSAgICAgIGludCBjb21wID0gYmIuR2V0VWxvbmcoVGFibGUuX19vZmZzZXQoNCwgYmIuTGVuZ3RoIC0gdGFibGVPZmZzZXQsIGJiKSkuQ29tcGFyZVRvKGtleSk7CisgICAgICBvYmpfLl9fYXNzaWduKHRhYmxlT2Zmc2V0LCBiYik7CisgICAgICBpbnQgY29tcCA9IG9ial8uSWQuQ29tcGFyZVRvKGtleSk7CiAgICAgICBpZiAoY29tcCA+IDApIHsKICAgICAgICAgc3BhbiA9IG1pZGRsZTsKICAgICAgIH0gZWxzZSBpZiAoY29tcCA8IDApIHsKQEAgLTU1LDcgKzU5LDcgQEAKICAgICAgICAgc3RhcnQgKz0gbWlkZGxlOwogICAgICAgICBzcGFuIC09IG1pZGRsZTsKICAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHJldHVybiBuZXcgUmVmZXJyYWJsZSgpLl9fYXNzaWduKHRhYmxlT2Zmc2V0LCBiYik7CisgICAgICAgIHJldHVybiBvYmpfOwogICAgICAgfQogICAgIH0KICAgICByZXR1cm4gbnVsbDsKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL015R2FtZS9FeGFtcGxlL1JlZmVycmFibGUuZ28gYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9NeUdhbWUvRXhhbXBsZS9SZWZlcnJhYmxlLmdvCmluZGV4IDY2YzU5NzIuLmFhMjcwNzkgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL015R2FtZS9FeGFtcGxlL1JlZmVycmFibGUuZ28KKysrIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvTXlHYW1lL0V4YW1wbGUvUmVmZXJyYWJsZS5nbwpAQCAtNyw3ICs3LDcgQEAKICkKIAogdHlwZSBSZWZlcnJhYmxlVCBzdHJ1Y3QgewotCUlkIHVpbnQ2NAorCUlkIHVpbnQ2NCBganNvbjoiaWQiYAogfQogCiBmdW5jICh0ICpSZWZlcnJhYmxlVCkgUGFjayhidWlsZGVyICpmbGF0YnVmZmVycy5CdWlsZGVyKSBmbGF0YnVmZmVycy5VT2Zmc2V0VCB7CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9NeUdhbWUvRXhhbXBsZS9SZWZlcnJhYmxlLmphdmEgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9NeUdhbWUvRXhhbXBsZS9SZWZlcnJhYmxlLmphdmEKaW5kZXggZGE4ZGVhNi4uZjI4ZDZjYiAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvTXlHYW1lL0V4YW1wbGUvUmVmZXJyYWJsZS5qYXZhCisrKyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL015R2FtZS9FeGFtcGxlL1JlZmVycmFibGUuamF2YQpAQCAtOSw3ICs5LDcgQEAKIAogQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpCiBwdWJsaWMgZmluYWwgY2xhc3MgUmVmZXJyYWJsZSBleHRlbmRzIFRhYmxlIHsKLSAgcHVibGljIHN0YXRpYyB2b2lkIFZhbGlkYXRlVmVyc2lvbigpIHsgQ29uc3RhbnRzLkZMQVRCVUZGRVJTXzJfMF8wKCk7IH0KKyAgcHVibGljIHN0YXRpYyB2b2lkIFZhbGlkYXRlVmVyc2lvbigpIHsgQ29uc3RhbnRzLkZMQVRCVUZGRVJTXzJfMF84KCk7IH0KICAgcHVibGljIHN0YXRpYyBSZWZlcnJhYmxlIGdldFJvb3RBc1JlZmVycmFibGUoQnl0ZUJ1ZmZlciBfYmIpIHsgcmV0dXJuIGdldFJvb3RBc1JlZmVycmFibGUoX2JiLCBuZXcgUmVmZXJyYWJsZSgpKTsgfQogICBwdWJsaWMgc3RhdGljIFJlZmVycmFibGUgZ2V0Um9vdEFzUmVmZXJyYWJsZShCeXRlQnVmZmVyIF9iYiwgUmVmZXJyYWJsZSBvYmopIHsgX2JiLm9yZGVyKEJ5dGVPcmRlci5MSVRUTEVfRU5ESUFOKTsgcmV0dXJuIChvYmouX19hc3NpZ24oX2JiLmdldEludChfYmIucG9zaXRpb24oKSkgKyBfYmIucG9zaXRpb24oKSwgX2JiKSk7IH0KICAgcHVibGljIHZvaWQgX19pbml0KGludCBfaSwgQnl0ZUJ1ZmZlciBfYmIpIHsgX19yZXNldChfaSwgX2JiKTsgfQpAQCAtMjYsNyArMjYsNyBAQAogICB9CiAKICAgcHVibGljIHN0YXRpYyB2b2lkIHN0YXJ0UmVmZXJyYWJsZShGbGF0QnVmZmVyQnVpbGRlciBidWlsZGVyKSB7IGJ1aWxkZXIuc3RhcnRUYWJsZSgxKTsgfQotICBwdWJsaWMgc3RhdGljIHZvaWQgYWRkSWQoRmxhdEJ1ZmZlckJ1aWxkZXIgYnVpbGRlciwgbG9uZyBpZCkgeyBidWlsZGVyLmFkZExvbmcoMCwgaWQsIDBMKTsgfQorICBwdWJsaWMgc3RhdGljIHZvaWQgYWRkSWQoRmxhdEJ1ZmZlckJ1aWxkZXIgYnVpbGRlciwgbG9uZyBpZCkgeyBidWlsZGVyLmFkZExvbmcoaWQpOyBidWlsZGVyLnNsb3QoMCk7IH0KICAgcHVibGljIHN0YXRpYyBpbnQgZW5kUmVmZXJyYWJsZShGbGF0QnVmZmVyQnVpbGRlciBidWlsZGVyKSB7CiAgICAgaW50IG8gPSBidWlsZGVyLmVuZFRhYmxlKCk7CiAgICAgcmV0dXJuIG87CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9NeUdhbWUvRXhhbXBsZS9SZWZlcnJhYmxlLmt0IGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvTXlHYW1lL0V4YW1wbGUvUmVmZXJyYWJsZS5rdAppbmRleCA3ZjcyOGE3Li42ZDRiNjNlIDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9NeUdhbWUvRXhhbXBsZS9SZWZlcnJhYmxlLmt0CisrKyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL015R2FtZS9FeGFtcGxlL1JlZmVycmFibGUua3QKQEAgLTM2LDcgKzM2LDcgQEAKICAgICAgICAgcmV0dXJuICh2YWxfMSAtIHZhbF8yKS5zaWduCiAgICAgfQogICAgIGNvbXBhbmlvbiBvYmplY3QgewotICAgICAgICBmdW4gdmFsaWRhdGVWZXJzaW9uKCkgPSBDb25zdGFudHMuRkxBVEJVRkZFUlNfMl8wXzAoKQorICAgICAgICBmdW4gdmFsaWRhdGVWZXJzaW9uKCkgPSBDb25zdGFudHMuRkxBVEJVRkZFUlNfMl8wXzgoKQogICAgICAgICBmdW4gZ2V0Um9vdEFzUmVmZXJyYWJsZShfYmI6IEJ5dGVCdWZmZXIpOiBSZWZlcnJhYmxlID0gZ2V0Um9vdEFzUmVmZXJyYWJsZShfYmIsIFJlZmVycmFibGUoKSkKICAgICAgICAgZnVuIGdldFJvb3RBc1JlZmVycmFibGUoX2JiOiBCeXRlQnVmZmVyLCBvYmo6IFJlZmVycmFibGUpOiBSZWZlcnJhYmxlIHsKICAgICAgICAgICAgIF9iYi5vcmRlcihCeXRlT3JkZXIuTElUVExFX0VORElBTikKQEAgLTQ4LDcgKzQ4LDEwIEBACiAgICAgICAgICAgICByZXR1cm4gZW5kUmVmZXJyYWJsZShidWlsZGVyKQogICAgICAgICB9CiAgICAgICAgIGZ1biBzdGFydFJlZmVycmFibGUoYnVpbGRlcjogRmxhdEJ1ZmZlckJ1aWxkZXIpID0gYnVpbGRlci5zdGFydFRhYmxlKDEpCi0gICAgICAgIGZ1biBhZGRJZChidWlsZGVyOiBGbGF0QnVmZmVyQnVpbGRlciwgaWQ6IFVMb25nKSA9IGJ1aWxkZXIuYWRkTG9uZygwLCBpZC50b0xvbmcoKSwgMCkKKyAgICAgICAgZnVuIGFkZElkKGJ1aWxkZXI6IEZsYXRCdWZmZXJCdWlsZGVyLCBpZDogVUxvbmcpICB7CisgICAgICAgICAgICBidWlsZGVyLmFkZExvbmcoaWQudG9Mb25nKCkpCisgICAgICAgICAgICBidWlsZGVyLnNsb3QoMCkKKyAgICAgICAgfQogICAgICAgICBmdW4gZW5kUmVmZXJyYWJsZShidWlsZGVyOiBGbGF0QnVmZmVyQnVpbGRlcikgOiBJbnQgewogICAgICAgICAgICAgdmFsIG8gPSBidWlsZGVyLmVuZFRhYmxlKCkKICAgICAgICAgICAgIHJldHVybiBvCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9NeUdhbWUvRXhhbXBsZS9SZWZlcnJhYmxlLmx1YSBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL015R2FtZS9FeGFtcGxlL1JlZmVycmFibGUubHVhCmluZGV4IDNiZDZiMGEuLjE5MTE5MDYgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL015R2FtZS9FeGFtcGxlL1JlZmVycmFibGUubHVhCisrKyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL015R2FtZS9FeGFtcGxlL1JlZmVycmFibGUubHVhCkBAIC0zLDcgKzMsNyBAQAogICBBdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBieSB0aGUgRmxhdEJ1ZmZlcnMgY29tcGlsZXIsIGRvIG5vdCBtb2RpZnkuCiAgIE9yIG1vZGlmeS4gSSdtIGEgbWVzc2FnZSwgbm90IGEgY29wLgogCi0gIGZsYXRjIHZlcnNpb246IDIuMC42CisgIGZsYXRjIHZlcnNpb246IDIuMC44CiAKICAgRGVjbGFyZWQgYnkgIDogLy9tb25zdGVyX3Rlc3QuZmJzCiAgIFJvb3RpbmcgdHlwZSA6IE15R2FtZS5FeGFtcGxlLk1vbnN0ZXIgKC8vbW9uc3Rlcl90ZXN0LmZicykKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL015R2FtZS9FeGFtcGxlL1N0YXQuY3MgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9NeUdhbWUvRXhhbXBsZS9TdGF0LmNzCmluZGV4IDE0OWIxMzYuLjMyYzA1ZGMgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL015R2FtZS9FeGFtcGxlL1N0YXQuY3MKKysrIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvTXlHYW1lL0V4YW1wbGUvU3RhdC5jcwpAQCAtNywxMyArNywxMyBAQAogCiB1c2luZyBnbG9iYWw6OlN5c3RlbTsKIHVzaW5nIGdsb2JhbDo6U3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Ci11c2luZyBnbG9iYWw6OkZsYXRCdWZmZXJzOwordXNpbmcgZ2xvYmFsOjpHb29nbGUuRmxhdEJ1ZmZlcnM7CiAKIHB1YmxpYyBzdHJ1Y3QgU3RhdCA6IElGbGF0YnVmZmVyT2JqZWN0CiB7CiAgIHByaXZhdGUgVGFibGUgX19wOwogICBwdWJsaWMgQnl0ZUJ1ZmZlciBCeXRlQnVmZmVyIHsgZ2V0IHsgcmV0dXJuIF9fcC5iYjsgfSB9Ci0gIHB1YmxpYyBzdGF0aWMgdm9pZCBWYWxpZGF0ZVZlcnNpb24oKSB7IEZsYXRCdWZmZXJDb25zdGFudHMuRkxBVEJVRkZFUlNfMl8wXzAoKTsgfQorICBwdWJsaWMgc3RhdGljIHZvaWQgVmFsaWRhdGVWZXJzaW9uKCkgeyBGbGF0QnVmZmVyQ29uc3RhbnRzLkZMQVRCVUZGRVJTXzJfMF84KCk7IH0KICAgcHVibGljIHN0YXRpYyBTdGF0IEdldFJvb3RBc1N0YXQoQnl0ZUJ1ZmZlciBfYmIpIHsgcmV0dXJuIEdldFJvb3RBc1N0YXQoX2JiLCBuZXcgU3RhdCgpKTsgfQogICBwdWJsaWMgc3RhdGljIFN0YXQgR2V0Um9vdEFzU3RhdChCeXRlQnVmZmVyIF9iYiwgU3RhdCBvYmopIHsgcmV0dXJuIChvYmouX19hc3NpZ24oX2JiLkdldEludChfYmIuUG9zaXRpb24pICsgX2JiLlBvc2l0aW9uLCBfYmIpKTsgfQogICBwdWJsaWMgdm9pZCBfX2luaXQoaW50IF9pLCBCeXRlQnVmZmVyIF9iYikgeyBfX3AgPSBuZXcgVGFibGUoX2ksIF9iYik7IH0KQEAgLTUyLDE3ICs1MiwyMSBAQAogICB9CiAKICAgcHVibGljIHN0YXRpYyBWZWN0b3JPZmZzZXQgQ3JlYXRlU29ydGVkVmVjdG9yT2ZTdGF0KEZsYXRCdWZmZXJCdWlsZGVyIGJ1aWxkZXIsIE9mZnNldDxTdGF0PltdIG9mZnNldHMpIHsKLSAgICBBcnJheS5Tb3J0KG9mZnNldHMsIChPZmZzZXQ8U3RhdD4gbzEsIE9mZnNldDxTdGF0PiBvMikgPT4gYnVpbGRlci5EYXRhQnVmZmVyLkdldFVzaG9ydChUYWJsZS5fX29mZnNldCg4LCBvMS5WYWx1ZSwgYnVpbGRlci5EYXRhQnVmZmVyKSkuQ29tcGFyZVRvKGJ1aWxkZXIuRGF0YUJ1ZmZlci5HZXRVc2hvcnQoVGFibGUuX19vZmZzZXQoOCwgbzIuVmFsdWUsIGJ1aWxkZXIuRGF0YUJ1ZmZlcikpKSk7CisgICAgQXJyYXkuU29ydChvZmZzZXRzLAorICAgICAgKE9mZnNldDxTdGF0PiBvMSwgT2Zmc2V0PFN0YXQ+IG8yKSA9PgorICAgICAgICBuZXcgU3RhdCgpLl9fYXNzaWduKGJ1aWxkZXIuRGF0YUJ1ZmZlci5MZW5ndGggLSBvMS5WYWx1ZSwgYnVpbGRlci5EYXRhQnVmZmVyKS5Db3VudC5Db21wYXJlVG8obmV3IFN0YXQoKS5fX2Fzc2lnbihidWlsZGVyLkRhdGFCdWZmZXIuTGVuZ3RoIC0gbzIuVmFsdWUsIGJ1aWxkZXIuRGF0YUJ1ZmZlcikuQ291bnQpKTsKICAgICByZXR1cm4gYnVpbGRlci5DcmVhdGVWZWN0b3JPZlRhYmxlcyhvZmZzZXRzKTsKICAgfQogCiAgIHB1YmxpYyBzdGF0aWMgU3RhdD8gX19sb29rdXBfYnlfa2V5KGludCB2ZWN0b3JMb2NhdGlvbiwgdXNob3J0IGtleSwgQnl0ZUJ1ZmZlciBiYikgeworICAgIFN0YXQgb2JqXyA9IG5ldyBTdGF0KCk7CiAgICAgaW50IHNwYW4gPSBiYi5HZXRJbnQodmVjdG9yTG9jYXRpb24gLSA0KTsKICAgICBpbnQgc3RhcnQgPSAwOwogICAgIHdoaWxlIChzcGFuICE9IDApIHsKICAgICAgIGludCBtaWRkbGUgPSBzcGFuIC8gMjsKICAgICAgIGludCB0YWJsZU9mZnNldCA9IFRhYmxlLl9faW5kaXJlY3QodmVjdG9yTG9jYXRpb24gKyA0ICogKHN0YXJ0ICsgbWlkZGxlKSwgYmIpOwotICAgICAgaW50IGNvbXAgPSBiYi5HZXRVc2hvcnQoVGFibGUuX19vZmZzZXQoOCwgYmIuTGVuZ3RoIC0gdGFibGVPZmZzZXQsIGJiKSkuQ29tcGFyZVRvKGtleSk7CisgICAgICBvYmpfLl9fYXNzaWduKHRhYmxlT2Zmc2V0LCBiYik7CisgICAgICBpbnQgY29tcCA9IG9ial8uQ291bnQuQ29tcGFyZVRvKGtleSk7CiAgICAgICBpZiAoY29tcCA+IDApIHsKICAgICAgICAgc3BhbiA9IG1pZGRsZTsKICAgICAgIH0gZWxzZSBpZiAoY29tcCA8IDApIHsKQEAgLTcwLDcgKzc0LDcgQEAKICAgICAgICAgc3RhcnQgKz0gbWlkZGxlOwogICAgICAgICBzcGFuIC09IG1pZGRsZTsKICAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHJldHVybiBuZXcgU3RhdCgpLl9fYXNzaWduKHRhYmxlT2Zmc2V0LCBiYik7CisgICAgICAgIHJldHVybiBvYmpfOwogICAgICAgfQogICAgIH0KICAgICByZXR1cm4gbnVsbDsKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL015R2FtZS9FeGFtcGxlL1N0YXQuZ28gYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9NeUdhbWUvRXhhbXBsZS9TdGF0LmdvCmluZGV4IDVjMDYwZDEuLjcxNDk2NDAgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL015R2FtZS9FeGFtcGxlL1N0YXQuZ28KKysrIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvTXlHYW1lL0V4YW1wbGUvU3RhdC5nbwpAQCAtNyw5ICs3LDkgQEAKICkKIAogdHlwZSBTdGF0VCBzdHJ1Y3QgewotCUlkIHN0cmluZwotCVZhbCBpbnQ2NAotCUNvdW50IHVpbnQxNgorCUlkIHN0cmluZyBganNvbjoiaWQiYAorCVZhbCBpbnQ2NCBganNvbjoidmFsImAKKwlDb3VudCB1aW50MTYgYGpzb246ImNvdW50ImAKIH0KIAogZnVuYyAodCAqU3RhdFQpIFBhY2soYnVpbGRlciAqZmxhdGJ1ZmZlcnMuQnVpbGRlcikgZmxhdGJ1ZmZlcnMuVU9mZnNldFQgewpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvTXlHYW1lL0V4YW1wbGUvU3RhdC5qYXZhIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvTXlHYW1lL0V4YW1wbGUvU3RhdC5qYXZhCmluZGV4IGVmYzI2NzMuLjMwNDQ0MjEgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL015R2FtZS9FeGFtcGxlL1N0YXQuamF2YQorKysgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9NeUdhbWUvRXhhbXBsZS9TdGF0LmphdmEKQEAgLTksNyArOSw3IEBACiAKIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKQogcHVibGljIGZpbmFsIGNsYXNzIFN0YXQgZXh0ZW5kcyBUYWJsZSB7Ci0gIHB1YmxpYyBzdGF0aWMgdm9pZCBWYWxpZGF0ZVZlcnNpb24oKSB7IENvbnN0YW50cy5GTEFUQlVGRkVSU18yXzBfMCgpOyB9CisgIHB1YmxpYyBzdGF0aWMgdm9pZCBWYWxpZGF0ZVZlcnNpb24oKSB7IENvbnN0YW50cy5GTEFUQlVGRkVSU18yXzBfOCgpOyB9CiAgIHB1YmxpYyBzdGF0aWMgU3RhdCBnZXRSb290QXNTdGF0KEJ5dGVCdWZmZXIgX2JiKSB7IHJldHVybiBnZXRSb290QXNTdGF0KF9iYiwgbmV3IFN0YXQoKSk7IH0KICAgcHVibGljIHN0YXRpYyBTdGF0IGdldFJvb3RBc1N0YXQoQnl0ZUJ1ZmZlciBfYmIsIFN0YXQgb2JqKSB7IF9iYi5vcmRlcihCeXRlT3JkZXIuTElUVExFX0VORElBTik7IHJldHVybiAob2JqLl9fYXNzaWduKF9iYi5nZXRJbnQoX2JiLnBvc2l0aW9uKCkpICsgX2JiLnBvc2l0aW9uKCksIF9iYikpOyB9CiAgIHB1YmxpYyB2b2lkIF9faW5pdChpbnQgX2ksIEJ5dGVCdWZmZXIgX2JiKSB7IF9fcmVzZXQoX2ksIF9iYik7IH0KQEAgLTM3LDcgKzM3LDcgQEAKICAgcHVibGljIHN0YXRpYyB2b2lkIHN0YXJ0U3RhdChGbGF0QnVmZmVyQnVpbGRlciBidWlsZGVyKSB7IGJ1aWxkZXIuc3RhcnRUYWJsZSgzKTsgfQogICBwdWJsaWMgc3RhdGljIHZvaWQgYWRkSWQoRmxhdEJ1ZmZlckJ1aWxkZXIgYnVpbGRlciwgaW50IGlkT2Zmc2V0KSB7IGJ1aWxkZXIuYWRkT2Zmc2V0KDAsIGlkT2Zmc2V0LCAwKTsgfQogICBwdWJsaWMgc3RhdGljIHZvaWQgYWRkVmFsKEZsYXRCdWZmZXJCdWlsZGVyIGJ1aWxkZXIsIGxvbmcgdmFsKSB7IGJ1aWxkZXIuYWRkTG9uZygxLCB2YWwsIDBMKTsgfQotICBwdWJsaWMgc3RhdGljIHZvaWQgYWRkQ291bnQoRmxhdEJ1ZmZlckJ1aWxkZXIgYnVpbGRlciwgaW50IGNvdW50KSB7IGJ1aWxkZXIuYWRkU2hvcnQoMiwgKHNob3J0KSBjb3VudCwgKHNob3J0KSAwKTsgfQorICBwdWJsaWMgc3RhdGljIHZvaWQgYWRkQ291bnQoRmxhdEJ1ZmZlckJ1aWxkZXIgYnVpbGRlciwgaW50IGNvdW50KSB7IGJ1aWxkZXIuYWRkU2hvcnQoKHNob3J0KSBjb3VudCk7IGJ1aWxkZXIuc2xvdCgyKTsgfQogICBwdWJsaWMgc3RhdGljIGludCBlbmRTdGF0KEZsYXRCdWZmZXJCdWlsZGVyIGJ1aWxkZXIpIHsKICAgICBpbnQgbyA9IGJ1aWxkZXIuZW5kVGFibGUoKTsKICAgICByZXR1cm4gbzsKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL015R2FtZS9FeGFtcGxlL1N0YXQua3QgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9NeUdhbWUvRXhhbXBsZS9TdGF0Lmt0CmluZGV4IGU2Y2M5NGMuLmVmNmYzMWYgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL015R2FtZS9FeGFtcGxlL1N0YXQua3QKKysrIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvTXlHYW1lL0V4YW1wbGUvU3RhdC5rdApAQCAtNTcsNyArNTcsNyBAQAogICAgICAgICByZXR1cm4gKHZhbF8xIC0gdmFsXzIpLnNpZ24KICAgICB9CiAgICAgY29tcGFuaW9uIG9iamVjdCB7Ci0gICAgICAgIGZ1biB2YWxpZGF0ZVZlcnNpb24oKSA9IENvbnN0YW50cy5GTEFUQlVGRkVSU18yXzBfMCgpCisgICAgICAgIGZ1biB2YWxpZGF0ZVZlcnNpb24oKSA9IENvbnN0YW50cy5GTEFUQlVGRkVSU18yXzBfOCgpCiAgICAgICAgIGZ1biBnZXRSb290QXNTdGF0KF9iYjogQnl0ZUJ1ZmZlcik6IFN0YXQgPSBnZXRSb290QXNTdGF0KF9iYiwgU3RhdCgpKQogICAgICAgICBmdW4gZ2V0Um9vdEFzU3RhdChfYmI6IEJ5dGVCdWZmZXIsIG9iajogU3RhdCk6IFN0YXQgewogICAgICAgICAgICAgX2JiLm9yZGVyKEJ5dGVPcmRlci5MSVRUTEVfRU5ESUFOKQpAQCAtNzMsNyArNzMsMTAgQEAKICAgICAgICAgZnVuIHN0YXJ0U3RhdChidWlsZGVyOiBGbGF0QnVmZmVyQnVpbGRlcikgPSBidWlsZGVyLnN0YXJ0VGFibGUoMykKICAgICAgICAgZnVuIGFkZElkKGJ1aWxkZXI6IEZsYXRCdWZmZXJCdWlsZGVyLCBpZDogSW50KSA9IGJ1aWxkZXIuYWRkT2Zmc2V0KDAsIGlkLCAwKQogICAgICAgICBmdW4gYWRkVmFsXyhidWlsZGVyOiBGbGF0QnVmZmVyQnVpbGRlciwgdmFsXzogTG9uZykgPSBidWlsZGVyLmFkZExvbmcoMSwgdmFsXywgMEwpCi0gICAgICAgIGZ1biBhZGRDb3VudChidWlsZGVyOiBGbGF0QnVmZmVyQnVpbGRlciwgY291bnQ6IFVTaG9ydCkgPSBidWlsZGVyLmFkZFNob3J0KDIsIGNvdW50LnRvU2hvcnQoKSwgMCkKKyAgICAgICAgZnVuIGFkZENvdW50KGJ1aWxkZXI6IEZsYXRCdWZmZXJCdWlsZGVyLCBjb3VudDogVVNob3J0KSAgeworICAgICAgICAgICAgYnVpbGRlci5hZGRTaG9ydChjb3VudC50b1Nob3J0KCkpCisgICAgICAgICAgICBidWlsZGVyLnNsb3QoMikKKyAgICAgICAgfQogICAgICAgICBmdW4gZW5kU3RhdChidWlsZGVyOiBGbGF0QnVmZmVyQnVpbGRlcikgOiBJbnQgewogICAgICAgICAgICAgdmFsIG8gPSBidWlsZGVyLmVuZFRhYmxlKCkKICAgICAgICAgICAgIHJldHVybiBvCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9NeUdhbWUvRXhhbXBsZS9TdGF0Lmx1YSBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL015R2FtZS9FeGFtcGxlL1N0YXQubHVhCmluZGV4IGY2MjFmZDAuLmJmNTcwNGIgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL015R2FtZS9FeGFtcGxlL1N0YXQubHVhCisrKyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL015R2FtZS9FeGFtcGxlL1N0YXQubHVhCkBAIC0zLDcgKzMsNyBAQAogICBBdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBieSB0aGUgRmxhdEJ1ZmZlcnMgY29tcGlsZXIsIGRvIG5vdCBtb2RpZnkuCiAgIE9yIG1vZGlmeS4gSSdtIGEgbWVzc2FnZSwgbm90IGEgY29wLgogCi0gIGZsYXRjIHZlcnNpb246IDIuMC42CisgIGZsYXRjIHZlcnNpb246IDIuMC44CiAKICAgRGVjbGFyZWQgYnkgIDogLy9tb25zdGVyX3Rlc3QuZmJzCiAgIFJvb3RpbmcgdHlwZSA6IE15R2FtZS5FeGFtcGxlLk1vbnN0ZXIgKC8vbW9uc3Rlcl90ZXN0LmZicykKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL015R2FtZS9FeGFtcGxlL1N0cnVjdE9mU3RydWN0cy5jcyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL015R2FtZS9FeGFtcGxlL1N0cnVjdE9mU3RydWN0cy5jcwppbmRleCAzYTE2MDdkLi45NTVhZWFiIDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9NeUdhbWUvRXhhbXBsZS9TdHJ1Y3RPZlN0cnVjdHMuY3MKKysrIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvTXlHYW1lL0V4YW1wbGUvU3RydWN0T2ZTdHJ1Y3RzLmNzCkBAIC03LDcgKzcsNyBAQAogCiB1c2luZyBnbG9iYWw6OlN5c3RlbTsKIHVzaW5nIGdsb2JhbDo6U3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Ci11c2luZyBnbG9iYWw6OkZsYXRCdWZmZXJzOwordXNpbmcgZ2xvYmFsOjpHb29nbGUuRmxhdEJ1ZmZlcnM7CiAKIHB1YmxpYyBzdHJ1Y3QgU3RydWN0T2ZTdHJ1Y3RzIDogSUZsYXRidWZmZXJPYmplY3QKIHsKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL015R2FtZS9FeGFtcGxlL1N0cnVjdE9mU3RydWN0cy5nbyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL015R2FtZS9FeGFtcGxlL1N0cnVjdE9mU3RydWN0cy5nbwppbmRleCAzNWNjZmNiLi4yMjI4MWI2IDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9NeUdhbWUvRXhhbXBsZS9TdHJ1Y3RPZlN0cnVjdHMuZ28KKysrIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvTXlHYW1lL0V4YW1wbGUvU3RydWN0T2ZTdHJ1Y3RzLmdvCkBAIC03LDkgKzcsOSBAQAogKQogCiB0eXBlIFN0cnVjdE9mU3RydWN0c1Qgc3RydWN0IHsKLQlBICpBYmlsaXR5VAotCUIgKlRlc3RUCi0JQyAqQWJpbGl0eVQKKwlBICpBYmlsaXR5VCBganNvbjoiYSJgCisJQiAqVGVzdFQgYGpzb246ImIiYAorCUMgKkFiaWxpdHlUIGBqc29uOiJjImAKIH0KIAogZnVuYyAodCAqU3RydWN0T2ZTdHJ1Y3RzVCkgUGFjayhidWlsZGVyICpmbGF0YnVmZmVycy5CdWlsZGVyKSBmbGF0YnVmZmVycy5VT2Zmc2V0VCB7CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9NeUdhbWUvRXhhbXBsZS9TdHJ1Y3RPZlN0cnVjdHMubHVhIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvTXlHYW1lL0V4YW1wbGUvU3RydWN0T2ZTdHJ1Y3RzLmx1YQppbmRleCA3ZjU2YjM0Li5iZTAxNDhiIDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9NeUdhbWUvRXhhbXBsZS9TdHJ1Y3RPZlN0cnVjdHMubHVhCisrKyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL015R2FtZS9FeGFtcGxlL1N0cnVjdE9mU3RydWN0cy5sdWEKQEAgLTMsNyArMyw3IEBACiAgIEF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGJ5IHRoZSBGbGF0QnVmZmVycyBjb21waWxlciwgZG8gbm90IG1vZGlmeS4KICAgT3IgbW9kaWZ5LiBJJ20gYSBtZXNzYWdlLCBub3QgYSBjb3AuCiAKLSAgZmxhdGMgdmVyc2lvbjogMi4wLjYKKyAgZmxhdGMgdmVyc2lvbjogMi4wLjgKIAogICBEZWNsYXJlZCBieSAgOiAvL21vbnN0ZXJfdGVzdC5mYnMKICAgUm9vdGluZyB0eXBlIDogTXlHYW1lLkV4YW1wbGUuTW9uc3RlciAoLy9tb25zdGVyX3Rlc3QuZmJzKQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvTXlHYW1lL0V4YW1wbGUvU3RydWN0T2ZTdHJ1Y3RzT2ZTdHJ1Y3RzLmNzIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvTXlHYW1lL0V4YW1wbGUvU3RydWN0T2ZTdHJ1Y3RzT2ZTdHJ1Y3RzLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkwY2ZjMjkKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9NeUdhbWUvRXhhbXBsZS9TdHJ1Y3RPZlN0cnVjdHNPZlN0cnVjdHMuY3MKQEAgLTAsMCArMSw3NCBAQAorLy8gPGF1dG8tZ2VuZXJhdGVkPgorLy8gIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGJ5IHRoZSBGbGF0QnVmZmVycyBjb21waWxlciwgZG8gbm90IG1vZGlmeQorLy8gPC9hdXRvLWdlbmVyYXRlZD4KKworbmFtZXNwYWNlIE15R2FtZS5FeGFtcGxlCit7CisKK3VzaW5nIGdsb2JhbDo6U3lzdGVtOwordXNpbmcgZ2xvYmFsOjpTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIGdsb2JhbDo6R29vZ2xlLkZsYXRCdWZmZXJzOworCitwdWJsaWMgc3RydWN0IFN0cnVjdE9mU3RydWN0c09mU3RydWN0cyA6IElGbGF0YnVmZmVyT2JqZWN0Cit7CisgIHByaXZhdGUgU3RydWN0IF9fcDsKKyAgcHVibGljIEJ5dGVCdWZmZXIgQnl0ZUJ1ZmZlciB7IGdldCB7IHJldHVybiBfX3AuYmI7IH0gfQorICBwdWJsaWMgdm9pZCBfX2luaXQoaW50IF9pLCBCeXRlQnVmZmVyIF9iYikgeyBfX3AgPSBuZXcgU3RydWN0KF9pLCBfYmIpOyB9CisgIHB1YmxpYyBTdHJ1Y3RPZlN0cnVjdHNPZlN0cnVjdHMgX19hc3NpZ24oaW50IF9pLCBCeXRlQnVmZmVyIF9iYikgeyBfX2luaXQoX2ksIF9iYik7IHJldHVybiB0aGlzOyB9CisKKyAgcHVibGljIE15R2FtZS5FeGFtcGxlLlN0cnVjdE9mU3RydWN0cyBBIHsgZ2V0IHsgcmV0dXJuIChuZXcgTXlHYW1lLkV4YW1wbGUuU3RydWN0T2ZTdHJ1Y3RzKCkpLl9fYXNzaWduKF9fcC5iYl9wb3MgKyAwLCBfX3AuYmIpOyB9IH0KKworICBwdWJsaWMgc3RhdGljIE9mZnNldDxNeUdhbWUuRXhhbXBsZS5TdHJ1Y3RPZlN0cnVjdHNPZlN0cnVjdHM+IENyZWF0ZVN0cnVjdE9mU3RydWN0c09mU3RydWN0cyhGbGF0QnVmZmVyQnVpbGRlciBidWlsZGVyLCB1aW50IGFfYV9JZCwgdWludCBhX2FfRGlzdGFuY2UsIHNob3J0IGFfYl9BLCBzYnl0ZSBhX2JfQiwgdWludCBhX2NfSWQsIHVpbnQgYV9jX0Rpc3RhbmNlKSB7CisgICAgYnVpbGRlci5QcmVwKDQsIDIwKTsKKyAgICBidWlsZGVyLlByZXAoNCwgMjApOworICAgIGJ1aWxkZXIuUHJlcCg0LCA4KTsKKyAgICBidWlsZGVyLlB1dFVpbnQoYV9jX0Rpc3RhbmNlKTsKKyAgICBidWlsZGVyLlB1dFVpbnQoYV9jX0lkKTsKKyAgICBidWlsZGVyLlByZXAoMiwgNCk7CisgICAgYnVpbGRlci5QYWQoMSk7CisgICAgYnVpbGRlci5QdXRTYnl0ZShhX2JfQik7CisgICAgYnVpbGRlci5QdXRTaG9ydChhX2JfQSk7CisgICAgYnVpbGRlci5QcmVwKDQsIDgpOworICAgIGJ1aWxkZXIuUHV0VWludChhX2FfRGlzdGFuY2UpOworICAgIGJ1aWxkZXIuUHV0VWludChhX2FfSWQpOworICAgIHJldHVybiBuZXcgT2Zmc2V0PE15R2FtZS5FeGFtcGxlLlN0cnVjdE9mU3RydWN0c09mU3RydWN0cz4oYnVpbGRlci5PZmZzZXQpOworICB9CisgIHB1YmxpYyBTdHJ1Y3RPZlN0cnVjdHNPZlN0cnVjdHNUIFVuUGFjaygpIHsKKyAgICB2YXIgX28gPSBuZXcgU3RydWN0T2ZTdHJ1Y3RzT2ZTdHJ1Y3RzVCgpOworICAgIHRoaXMuVW5QYWNrVG8oX28pOworICAgIHJldHVybiBfbzsKKyAgfQorICBwdWJsaWMgdm9pZCBVblBhY2tUbyhTdHJ1Y3RPZlN0cnVjdHNPZlN0cnVjdHNUIF9vKSB7CisgICAgX28uQSA9IHRoaXMuQS5VblBhY2soKTsKKyAgfQorICBwdWJsaWMgc3RhdGljIE9mZnNldDxNeUdhbWUuRXhhbXBsZS5TdHJ1Y3RPZlN0cnVjdHNPZlN0cnVjdHM+IFBhY2soRmxhdEJ1ZmZlckJ1aWxkZXIgYnVpbGRlciwgU3RydWN0T2ZTdHJ1Y3RzT2ZTdHJ1Y3RzVCBfbykgeworICAgIGlmIChfbyA9PSBudWxsKSByZXR1cm4gZGVmYXVsdChPZmZzZXQ8TXlHYW1lLkV4YW1wbGUuU3RydWN0T2ZTdHJ1Y3RzT2ZTdHJ1Y3RzPik7CisgICAgdmFyIF9hX2FfaWQgPSBfby5BLkEuSWQ7CisgICAgdmFyIF9hX2FfZGlzdGFuY2UgPSBfby5BLkEuRGlzdGFuY2U7CisgICAgdmFyIF9hX2JfYSA9IF9vLkEuQi5BOworICAgIHZhciBfYV9iX2IgPSBfby5BLkIuQjsKKyAgICB2YXIgX2FfY19pZCA9IF9vLkEuQy5JZDsKKyAgICB2YXIgX2FfY19kaXN0YW5jZSA9IF9vLkEuQy5EaXN0YW5jZTsKKyAgICByZXR1cm4gQ3JlYXRlU3RydWN0T2ZTdHJ1Y3RzT2ZTdHJ1Y3RzKAorICAgICAgYnVpbGRlciwKKyAgICAgIF9hX2FfaWQsCisgICAgICBfYV9hX2Rpc3RhbmNlLAorICAgICAgX2FfYl9hLAorICAgICAgX2FfYl9iLAorICAgICAgX2FfY19pZCwKKyAgICAgIF9hX2NfZGlzdGFuY2UpOworICB9Cit9CisKK3B1YmxpYyBjbGFzcyBTdHJ1Y3RPZlN0cnVjdHNPZlN0cnVjdHNUCit7CisgIFtOZXd0b25zb2Z0Lkpzb24uSnNvblByb3BlcnR5KCJhIildCisgIHB1YmxpYyBNeUdhbWUuRXhhbXBsZS5TdHJ1Y3RPZlN0cnVjdHNUIEEgeyBnZXQ7IHNldDsgfQorCisgIHB1YmxpYyBTdHJ1Y3RPZlN0cnVjdHNPZlN0cnVjdHNUKCkgeworICAgIHRoaXMuQSA9IG5ldyBNeUdhbWUuRXhhbXBsZS5TdHJ1Y3RPZlN0cnVjdHNUKCk7CisgIH0KK30KKworCit9CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9NeUdhbWUvRXhhbXBsZS9TdHJ1Y3RPZlN0cnVjdHNPZlN0cnVjdHMuZ28gYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9NeUdhbWUvRXhhbXBsZS9TdHJ1Y3RPZlN0cnVjdHNPZlN0cnVjdHMuZ28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjhmMzJhMAotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL015R2FtZS9FeGFtcGxlL1N0cnVjdE9mU3RydWN0c09mU3RydWN0cy5nbwpAQCAtMCwwICsxLDYzIEBACisvLyBDb2RlIGdlbmVyYXRlZCBieSB0aGUgRmxhdEJ1ZmZlcnMgY29tcGlsZXIuIERPIE5PVCBFRElULgorCitwYWNrYWdlIEV4YW1wbGUKKworaW1wb3J0ICgKKwlmbGF0YnVmZmVycyAiZ2l0aHViLmNvbS9nb29nbGUvZmxhdGJ1ZmZlcnMvZ28iCispCisKK3R5cGUgU3RydWN0T2ZTdHJ1Y3RzT2ZTdHJ1Y3RzVCBzdHJ1Y3QgeworCUEgKlN0cnVjdE9mU3RydWN0c1QgYGpzb246ImEiYAorfQorCitmdW5jICh0ICpTdHJ1Y3RPZlN0cnVjdHNPZlN0cnVjdHNUKSBQYWNrKGJ1aWxkZXIgKmZsYXRidWZmZXJzLkJ1aWxkZXIpIGZsYXRidWZmZXJzLlVPZmZzZXRUIHsKKwlpZiB0ID09IG5pbCB7IHJldHVybiAwIH0KKwlyZXR1cm4gQ3JlYXRlU3RydWN0T2ZTdHJ1Y3RzT2ZTdHJ1Y3RzKGJ1aWxkZXIsIHQuQS5BLklkLCB0LkEuQS5EaXN0YW5jZSwgdC5BLkIuQSwgdC5BLkIuQiwgdC5BLkMuSWQsIHQuQS5DLkRpc3RhbmNlKQorfQorZnVuYyAocmN2ICpTdHJ1Y3RPZlN0cnVjdHNPZlN0cnVjdHMpIFVuUGFja1RvKHQgKlN0cnVjdE9mU3RydWN0c09mU3RydWN0c1QpIHsKKwl0LkEgPSByY3YuQShuaWwpLlVuUGFjaygpCit9CisKK2Z1bmMgKHJjdiAqU3RydWN0T2ZTdHJ1Y3RzT2ZTdHJ1Y3RzKSBVblBhY2soKSAqU3RydWN0T2ZTdHJ1Y3RzT2ZTdHJ1Y3RzVCB7CisJaWYgcmN2ID09IG5pbCB7IHJldHVybiBuaWwgfQorCXQgOj0gJlN0cnVjdE9mU3RydWN0c09mU3RydWN0c1R7fQorCXJjdi5VblBhY2tUbyh0KQorCXJldHVybiB0Cit9CisKK3R5cGUgU3RydWN0T2ZTdHJ1Y3RzT2ZTdHJ1Y3RzIHN0cnVjdCB7CisJX3RhYiBmbGF0YnVmZmVycy5TdHJ1Y3QKK30KKworZnVuYyAocmN2ICpTdHJ1Y3RPZlN0cnVjdHNPZlN0cnVjdHMpIEluaXQoYnVmIFtdYnl0ZSwgaSBmbGF0YnVmZmVycy5VT2Zmc2V0VCkgeworCXJjdi5fdGFiLkJ5dGVzID0gYnVmCisJcmN2Ll90YWIuUG9zID0gaQorfQorCitmdW5jIChyY3YgKlN0cnVjdE9mU3RydWN0c09mU3RydWN0cykgVGFibGUoKSBmbGF0YnVmZmVycy5UYWJsZSB7CisJcmV0dXJuIHJjdi5fdGFiLlRhYmxlCit9CisKK2Z1bmMgKHJjdiAqU3RydWN0T2ZTdHJ1Y3RzT2ZTdHJ1Y3RzKSBBKG9iaiAqU3RydWN0T2ZTdHJ1Y3RzKSAqU3RydWN0T2ZTdHJ1Y3RzIHsKKwlpZiBvYmogPT0gbmlsIHsKKwkJb2JqID0gbmV3KFN0cnVjdE9mU3RydWN0cykKKwl9CisJb2JqLkluaXQocmN2Ll90YWIuQnl0ZXMsIHJjdi5fdGFiLlBvcyswKQorCXJldHVybiBvYmoKK30KKworZnVuYyBDcmVhdGVTdHJ1Y3RPZlN0cnVjdHNPZlN0cnVjdHMoYnVpbGRlciAqZmxhdGJ1ZmZlcnMuQnVpbGRlciwgYV9hX2lkIHVpbnQzMiwgYV9hX2Rpc3RhbmNlIHVpbnQzMiwgYV9iX2EgaW50MTYsIGFfYl9iIGludDgsIGFfY19pZCB1aW50MzIsIGFfY19kaXN0YW5jZSB1aW50MzIpIGZsYXRidWZmZXJzLlVPZmZzZXRUIHsKKwlidWlsZGVyLlByZXAoNCwgMjApCisJYnVpbGRlci5QcmVwKDQsIDIwKQorCWJ1aWxkZXIuUHJlcCg0LCA4KQorCWJ1aWxkZXIuUHJlcGVuZFVpbnQzMihhX2NfZGlzdGFuY2UpCisJYnVpbGRlci5QcmVwZW5kVWludDMyKGFfY19pZCkKKwlidWlsZGVyLlByZXAoMiwgNCkKKwlidWlsZGVyLlBhZCgxKQorCWJ1aWxkZXIuUHJlcGVuZEludDgoYV9iX2IpCisJYnVpbGRlci5QcmVwZW5kSW50MTYoYV9iX2EpCisJYnVpbGRlci5QcmVwKDQsIDgpCisJYnVpbGRlci5QcmVwZW5kVWludDMyKGFfYV9kaXN0YW5jZSkKKwlidWlsZGVyLlByZXBlbmRVaW50MzIoYV9hX2lkKQorCXJldHVybiBidWlsZGVyLk9mZnNldCgpCit9CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9NeUdhbWUvRXhhbXBsZS9TdHJ1Y3RPZlN0cnVjdHNPZlN0cnVjdHMuamF2YSBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL015R2FtZS9FeGFtcGxlL1N0cnVjdE9mU3RydWN0c09mU3RydWN0cy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVkNWYwMGYKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9NeUdhbWUvRXhhbXBsZS9TdHJ1Y3RPZlN0cnVjdHNPZlN0cnVjdHMuamF2YQpAQCAtMCwwICsxLDY2IEBACisvLyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBieSB0aGUgRmxhdEJ1ZmZlcnMgY29tcGlsZXIsIGRvIG5vdCBtb2RpZnkKKworcGFja2FnZSBNeUdhbWUuRXhhbXBsZTsKKworaW1wb3J0IGphdmEubmlvLio7CitpbXBvcnQgamF2YS5sYW5nLio7CitpbXBvcnQgamF2YS51dGlsLio7CitpbXBvcnQgY29tLmdvb2dsZS5mbGF0YnVmZmVycy4qOworCitAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikKK3B1YmxpYyBmaW5hbCBjbGFzcyBTdHJ1Y3RPZlN0cnVjdHNPZlN0cnVjdHMgZXh0ZW5kcyBTdHJ1Y3QgeworICBwdWJsaWMgdm9pZCBfX2luaXQoaW50IF9pLCBCeXRlQnVmZmVyIF9iYikgeyBfX3Jlc2V0KF9pLCBfYmIpOyB9CisgIHB1YmxpYyBTdHJ1Y3RPZlN0cnVjdHNPZlN0cnVjdHMgX19hc3NpZ24oaW50IF9pLCBCeXRlQnVmZmVyIF9iYikgeyBfX2luaXQoX2ksIF9iYik7IHJldHVybiB0aGlzOyB9CisKKyAgcHVibGljIE15R2FtZS5FeGFtcGxlLlN0cnVjdE9mU3RydWN0cyBhKCkgeyByZXR1cm4gYShuZXcgTXlHYW1lLkV4YW1wbGUuU3RydWN0T2ZTdHJ1Y3RzKCkpOyB9CisgIHB1YmxpYyBNeUdhbWUuRXhhbXBsZS5TdHJ1Y3RPZlN0cnVjdHMgYShNeUdhbWUuRXhhbXBsZS5TdHJ1Y3RPZlN0cnVjdHMgb2JqKSB7IHJldHVybiBvYmouX19hc3NpZ24oYmJfcG9zICsgMCwgYmIpOyB9CisKKyAgcHVibGljIHN0YXRpYyBpbnQgY3JlYXRlU3RydWN0T2ZTdHJ1Y3RzT2ZTdHJ1Y3RzKEZsYXRCdWZmZXJCdWlsZGVyIGJ1aWxkZXIsIGxvbmcgYV9hX2lkLCBsb25nIGFfYV9kaXN0YW5jZSwgc2hvcnQgYV9iX2EsIGJ5dGUgYV9iX2IsIGxvbmcgYV9jX2lkLCBsb25nIGFfY19kaXN0YW5jZSkgeworICAgIGJ1aWxkZXIucHJlcCg0LCAyMCk7CisgICAgYnVpbGRlci5wcmVwKDQsIDIwKTsKKyAgICBidWlsZGVyLnByZXAoNCwgOCk7CisgICAgYnVpbGRlci5wdXRJbnQoKGludCkgYV9jX2Rpc3RhbmNlKTsKKyAgICBidWlsZGVyLnB1dEludCgoaW50KSBhX2NfaWQpOworICAgIGJ1aWxkZXIucHJlcCgyLCA0KTsKKyAgICBidWlsZGVyLnBhZCgxKTsKKyAgICBidWlsZGVyLnB1dEJ5dGUoYV9iX2IpOworICAgIGJ1aWxkZXIucHV0U2hvcnQoYV9iX2EpOworICAgIGJ1aWxkZXIucHJlcCg0LCA4KTsKKyAgICBidWlsZGVyLnB1dEludCgoaW50KSBhX2FfZGlzdGFuY2UpOworICAgIGJ1aWxkZXIucHV0SW50KChpbnQpIGFfYV9pZCk7CisgICAgcmV0dXJuIGJ1aWxkZXIub2Zmc2V0KCk7CisgIH0KKworICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIFZlY3RvciBleHRlbmRzIEJhc2VWZWN0b3IgeworICAgIHB1YmxpYyBWZWN0b3IgX19hc3NpZ24oaW50IF92ZWN0b3IsIGludCBfZWxlbWVudF9zaXplLCBCeXRlQnVmZmVyIF9iYikgeyBfX3Jlc2V0KF92ZWN0b3IsIF9lbGVtZW50X3NpemUsIF9iYik7IHJldHVybiB0aGlzOyB9CisKKyAgICBwdWJsaWMgU3RydWN0T2ZTdHJ1Y3RzT2ZTdHJ1Y3RzIGdldChpbnQgaikgeyByZXR1cm4gZ2V0KG5ldyBTdHJ1Y3RPZlN0cnVjdHNPZlN0cnVjdHMoKSwgaik7IH0KKyAgICBwdWJsaWMgU3RydWN0T2ZTdHJ1Y3RzT2ZTdHJ1Y3RzIGdldChTdHJ1Y3RPZlN0cnVjdHNPZlN0cnVjdHMgb2JqLCBpbnQgaikgeyAgcmV0dXJuIG9iai5fX2Fzc2lnbihfX2VsZW1lbnQoaiksIGJiKTsgfQorICB9CisgIHB1YmxpYyBTdHJ1Y3RPZlN0cnVjdHNPZlN0cnVjdHNUIHVucGFjaygpIHsKKyAgICBTdHJ1Y3RPZlN0cnVjdHNPZlN0cnVjdHNUIF9vID0gbmV3IFN0cnVjdE9mU3RydWN0c09mU3RydWN0c1QoKTsKKyAgICB1bnBhY2tUbyhfbyk7CisgICAgcmV0dXJuIF9vOworICB9CisgIHB1YmxpYyB2b2lkIHVucGFja1RvKFN0cnVjdE9mU3RydWN0c09mU3RydWN0c1QgX28pIHsKKyAgICBhKCkudW5wYWNrVG8oX28uZ2V0QSgpKTsKKyAgfQorICBwdWJsaWMgc3RhdGljIGludCBwYWNrKEZsYXRCdWZmZXJCdWlsZGVyIGJ1aWxkZXIsIFN0cnVjdE9mU3RydWN0c09mU3RydWN0c1QgX28pIHsKKyAgICBpZiAoX28gPT0gbnVsbCkgcmV0dXJuIDA7CisgICAgaW50IF9hX2FfaWQgPSBfby5nZXRBKCkuZ2V0QSgpLmdldElkKCk7CisgICAgaW50IF9hX2FfZGlzdGFuY2UgPSBfby5nZXRBKCkuZ2V0QSgpLmdldERpc3RhbmNlKCk7CisgICAgc2hvcnQgX2FfYl9hID0gX28uZ2V0QSgpLmdldEIoKS5nZXRBKCk7CisgICAgYnl0ZSBfYV9iX2IgPSBfby5nZXRBKCkuZ2V0QigpLmdldEIoKTsKKyAgICBpbnQgX2FfY19pZCA9IF9vLmdldEEoKS5nZXRDKCkuZ2V0SWQoKTsKKyAgICBpbnQgX2FfY19kaXN0YW5jZSA9IF9vLmdldEEoKS5nZXRDKCkuZ2V0RGlzdGFuY2UoKTsKKyAgICByZXR1cm4gY3JlYXRlU3RydWN0T2ZTdHJ1Y3RzT2ZTdHJ1Y3RzKAorICAgICAgYnVpbGRlciwKKyAgICAgIF9hX2FfaWQsCisgICAgICBfYV9hX2Rpc3RhbmNlLAorICAgICAgX2FfYl9hLAorICAgICAgX2FfYl9iLAorICAgICAgX2FfY19pZCwKKyAgICAgIF9hX2NfZGlzdGFuY2UpOworICB9Cit9CisKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL015R2FtZS9FeGFtcGxlL1N0cnVjdE9mU3RydWN0c09mU3RydWN0cy5rdCBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL015R2FtZS9FeGFtcGxlL1N0cnVjdE9mU3RydWN0c09mU3RydWN0cy5rdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NTViNjAwCi0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvTXlHYW1lL0V4YW1wbGUvU3RydWN0T2ZTdHJ1Y3RzT2ZTdHJ1Y3RzLmt0CkBAIC0wLDAgKzEsMzggQEAKKy8vIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGJ5IHRoZSBGbGF0QnVmZmVycyBjb21waWxlciwgZG8gbm90IG1vZGlmeQorCitwYWNrYWdlIE15R2FtZS5FeGFtcGxlCisKK2ltcG9ydCBqYXZhLm5pby4qCitpbXBvcnQga290bGluLm1hdGguc2lnbgoraW1wb3J0IGNvbS5nb29nbGUuZmxhdGJ1ZmZlcnMuKgorCitAU3VwcHJlc3MoInVudXNlZCIpCitjbGFzcyBTdHJ1Y3RPZlN0cnVjdHNPZlN0cnVjdHMgOiBTdHJ1Y3QoKSB7CisKKyAgICBmdW4gX19pbml0KF9pOiBJbnQsIF9iYjogQnl0ZUJ1ZmZlcikgIHsKKyAgICAgICAgX19yZXNldChfaSwgX2JiKQorICAgIH0KKyAgICBmdW4gX19hc3NpZ24oX2k6IEludCwgX2JiOiBCeXRlQnVmZmVyKSA6IFN0cnVjdE9mU3RydWN0c09mU3RydWN0cyB7CisgICAgICAgIF9faW5pdChfaSwgX2JiKQorICAgICAgICByZXR1cm4gdGhpcworICAgIH0KKyAgICB2YWwgYSA6IE15R2FtZS5FeGFtcGxlLlN0cnVjdE9mU3RydWN0cz8gZ2V0KCkgPSBhKE15R2FtZS5FeGFtcGxlLlN0cnVjdE9mU3RydWN0cygpKQorICAgIGZ1biBhKG9iajogTXlHYW1lLkV4YW1wbGUuU3RydWN0T2ZTdHJ1Y3RzKSA6IE15R2FtZS5FeGFtcGxlLlN0cnVjdE9mU3RydWN0cz8gPSBvYmouX19hc3NpZ24oYmJfcG9zICsgMCwgYmIpCisgICAgY29tcGFuaW9uIG9iamVjdCB7CisgICAgICAgIGZ1biBjcmVhdGVTdHJ1Y3RPZlN0cnVjdHNPZlN0cnVjdHMoYnVpbGRlcjogRmxhdEJ1ZmZlckJ1aWxkZXIsIGFfYV9pZDogVUludCwgYV9hX2Rpc3RhbmNlOiBVSW50LCBhX2JfYTogU2hvcnQsIGFfYl9iOiBCeXRlLCBhX2NfaWQ6IFVJbnQsIGFfY19kaXN0YW5jZTogVUludCkgOiBJbnQgeworICAgICAgICAgICAgYnVpbGRlci5wcmVwKDQsIDIwKQorICAgICAgICAgICAgYnVpbGRlci5wcmVwKDQsIDIwKQorICAgICAgICAgICAgYnVpbGRlci5wcmVwKDQsIDgpCisgICAgICAgICAgICBidWlsZGVyLnB1dEludChhX2NfZGlzdGFuY2UudG9JbnQoKSkKKyAgICAgICAgICAgIGJ1aWxkZXIucHV0SW50KGFfY19pZC50b0ludCgpKQorICAgICAgICAgICAgYnVpbGRlci5wcmVwKDIsIDQpCisgICAgICAgICAgICBidWlsZGVyLnBhZCgxKQorICAgICAgICAgICAgYnVpbGRlci5wdXRCeXRlKGFfYl9iKQorICAgICAgICAgICAgYnVpbGRlci5wdXRTaG9ydChhX2JfYSkKKyAgICAgICAgICAgIGJ1aWxkZXIucHJlcCg0LCA4KQorICAgICAgICAgICAgYnVpbGRlci5wdXRJbnQoYV9hX2Rpc3RhbmNlLnRvSW50KCkpCisgICAgICAgICAgICBidWlsZGVyLnB1dEludChhX2FfaWQudG9JbnQoKSkKKyAgICAgICAgICAgIHJldHVybiBidWlsZGVyLm9mZnNldCgpCisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9NeUdhbWUvRXhhbXBsZS9TdHJ1Y3RPZlN0cnVjdHNPZlN0cnVjdHMubHVhIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvTXlHYW1lL0V4YW1wbGUvU3RydWN0T2ZTdHJ1Y3RzT2ZTdHJ1Y3RzLmx1YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mODU4N2MxCi0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvTXlHYW1lL0V4YW1wbGUvU3RydWN0T2ZTdHJ1Y3RzT2ZTdHJ1Y3RzLmx1YQpAQCAtMCwwICsxLDQ5IEBACistLVtbIE15R2FtZS5FeGFtcGxlLlN0cnVjdE9mU3RydWN0c09mU3RydWN0cworCisgIEF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGJ5IHRoZSBGbGF0QnVmZmVycyBjb21waWxlciwgZG8gbm90IG1vZGlmeS4KKyAgT3IgbW9kaWZ5LiBJJ20gYSBtZXNzYWdlLCBub3QgYSBjb3AuCisKKyAgZmxhdGMgdmVyc2lvbjogMi4wLjgKKworICBEZWNsYXJlZCBieSAgOiAvL21vbnN0ZXJfdGVzdC5mYnMKKyAgUm9vdGluZyB0eXBlIDogTXlHYW1lLkV4YW1wbGUuTW9uc3RlciAoLy9tb25zdGVyX3Rlc3QuZmJzKQorCistLV1dCisKK2xvY2FsIGZsYXRidWZmZXJzID0gcmVxdWlyZSgnZmxhdGJ1ZmZlcnMnKQorCitsb2NhbCBTdHJ1Y3RPZlN0cnVjdHNPZlN0cnVjdHMgPSB7fQorbG9jYWwgbXQgPSB7fQorCitmdW5jdGlvbiBTdHJ1Y3RPZlN0cnVjdHNPZlN0cnVjdHMuTmV3KCkKKyAgbG9jYWwgbyA9IHt9CisgIHNldG1ldGF0YWJsZShvLCB7X19pbmRleCA9IG10fSkKKyAgcmV0dXJuIG8KK2VuZAorCitmdW5jdGlvbiBtdDpJbml0KGJ1ZiwgcG9zKQorICBzZWxmLnZpZXcgPSBmbGF0YnVmZmVycy52aWV3Lk5ldyhidWYsIHBvcykKK2VuZAorCitmdW5jdGlvbiBtdDpBKG9iaikKKyAgb2JqOkluaXQoc2VsZi52aWV3LmJ5dGVzLCBzZWxmLnZpZXcucG9zICsgMCkKKyAgcmV0dXJuIG9iagorZW5kCisKK2Z1bmN0aW9uIFN0cnVjdE9mU3RydWN0c09mU3RydWN0cy5DcmVhdGVTdHJ1Y3RPZlN0cnVjdHNPZlN0cnVjdHMoYnVpbGRlciwgYV9hX2lkLCBhX2FfZGlzdGFuY2UsIGFfYl9hLCBhX2JfYiwgYV9jX2lkLCBhX2NfZGlzdGFuY2UpCisgIGJ1aWxkZXI6UHJlcCg0LCAyMCkKKyAgYnVpbGRlcjpQcmVwKDQsIDIwKQorICBidWlsZGVyOlByZXAoNCwgOCkKKyAgYnVpbGRlcjpQcmVwZW5kVWludDMyKGFfY19kaXN0YW5jZSkKKyAgYnVpbGRlcjpQcmVwZW5kVWludDMyKGFfY19pZCkKKyAgYnVpbGRlcjpQcmVwKDIsIDQpCisgIGJ1aWxkZXI6UGFkKDEpCisgIGJ1aWxkZXI6UHJlcGVuZEludDgoYV9iX2IpCisgIGJ1aWxkZXI6UHJlcGVuZEludDE2KGFfYl9hKQorICBidWlsZGVyOlByZXAoNCwgOCkKKyAgYnVpbGRlcjpQcmVwZW5kVWludDMyKGFfYV9kaXN0YW5jZSkKKyAgYnVpbGRlcjpQcmVwZW5kVWludDMyKGFfYV9pZCkKKyAgcmV0dXJuIGJ1aWxkZXI6T2Zmc2V0KCkKK2VuZAorCityZXR1cm4gU3RydWN0T2ZTdHJ1Y3RzT2ZTdHJ1Y3RzClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvTXlHYW1lL0V4YW1wbGUvU3RydWN0T2ZTdHJ1Y3RzT2ZTdHJ1Y3RzLnBocCBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL015R2FtZS9FeGFtcGxlL1N0cnVjdE9mU3RydWN0c09mU3RydWN0cy5waHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmNkY2NhMAotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL015R2FtZS9FeGFtcGxlL1N0cnVjdE9mU3RydWN0c09mU3RydWN0cy5waHAKQEAgLTAsMCArMSw1NSBAQAorPD9waHAKKy8vIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGJ5IHRoZSBGbGF0QnVmZmVycyBjb21waWxlciwgZG8gbm90IG1vZGlmeQorCituYW1lc3BhY2UgTXlHYW1lXEV4YW1wbGU7CisKK3VzZSBcR29vZ2xlXEZsYXRCdWZmZXJzXFN0cnVjdDsKK3VzZSBcR29vZ2xlXEZsYXRCdWZmZXJzXFRhYmxlOwordXNlIFxHb29nbGVcRmxhdEJ1ZmZlcnNcQnl0ZUJ1ZmZlcjsKK3VzZSBcR29vZ2xlXEZsYXRCdWZmZXJzXEZsYXRCdWZmZXJCdWlsZGVyOworCitjbGFzcyBTdHJ1Y3RPZlN0cnVjdHNPZlN0cnVjdHMgZXh0ZW5kcyBTdHJ1Y3QKK3sKKyAgICAvKioKKyAgICAgKiBAcGFyYW0gaW50ICRfaSBvZmZzZXQKKyAgICAgKiBAcGFyYW0gQnl0ZUJ1ZmZlciAkX2JiCisgICAgICogQHJldHVybiBTdHJ1Y3RPZlN0cnVjdHNPZlN0cnVjdHMKKyAgICAgKiovCisgICAgcHVibGljIGZ1bmN0aW9uIGluaXQoJF9pLCBCeXRlQnVmZmVyICRfYmIpCisgICAgeworICAgICAgICAkdGhpcy0+YmJfcG9zID0gJF9pOworICAgICAgICAkdGhpcy0+YmIgPSAkX2JiOworICAgICAgICByZXR1cm4gJHRoaXM7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiBTdHJ1Y3RPZlN0cnVjdHMKKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0QSgpCisgICAgeworICAgICAgICAkb2JqID0gbmV3IFN0cnVjdE9mU3RydWN0cygpOworICAgICAgICAkb2JqLT5pbml0KCR0aGlzLT5iYl9wb3MgKyAwLCAkdGhpcy0+YmIpOworICAgICAgICByZXR1cm4gJG9iajsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIEByZXR1cm4gaW50IG9mZnNldAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gY3JlYXRlU3RydWN0T2ZTdHJ1Y3RzT2ZTdHJ1Y3RzKEZsYXRCdWZmZXJCdWlsZGVyICRidWlsZGVyLCAkYV9hX2lkLCAkYV9hX2Rpc3RhbmNlLCAkYV9iX2EsICRhX2JfYiwgJGFfY19pZCwgJGFfY19kaXN0YW5jZSkKKyAgICB7CisgICAgICAgICRidWlsZGVyLT5wcmVwKDQsIDIwKTsKKyAgICAgICAgJGJ1aWxkZXItPnByZXAoNCwgMjApOworICAgICAgICAkYnVpbGRlci0+cHJlcCg0LCA4KTsKKyAgICAgICAgJGJ1aWxkZXItPnB1dFVpbnQoJGFfY19kaXN0YW5jZSk7CisgICAgICAgICRidWlsZGVyLT5wdXRVaW50KCRhX2NfaWQpOworICAgICAgICAkYnVpbGRlci0+cHJlcCgyLCA0KTsKKyAgICAgICAgJGJ1aWxkZXItPnBhZCgxKTsKKyAgICAgICAgJGJ1aWxkZXItPnB1dFNieXRlKCRhX2JfYik7CisgICAgICAgICRidWlsZGVyLT5wdXRTaG9ydCgkYV9iX2EpOworICAgICAgICAkYnVpbGRlci0+cHJlcCg0LCA4KTsKKyAgICAgICAgJGJ1aWxkZXItPnB1dFVpbnQoJGFfYV9kaXN0YW5jZSk7CisgICAgICAgICRidWlsZGVyLT5wdXRVaW50KCRhX2FfaWQpOworICAgICAgICByZXR1cm4gJGJ1aWxkZXItPm9mZnNldCgpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL015R2FtZS9FeGFtcGxlL1N0cnVjdE9mU3RydWN0c09mU3RydWN0cy5weSBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL015R2FtZS9FeGFtcGxlL1N0cnVjdE9mU3RydWN0c09mU3RydWN0cy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZGJhOTgyCi0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvTXlHYW1lL0V4YW1wbGUvU3RydWN0T2ZTdHJ1Y3RzT2ZTdHJ1Y3RzLnB5CkBAIC0wLDAgKzEsNzQgQEAKKyMgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgYnkgdGhlIEZsYXRCdWZmZXJzIGNvbXBpbGVyLCBkbyBub3QgbW9kaWZ5CisKKyMgbmFtZXNwYWNlOiBFeGFtcGxlCisKK2ltcG9ydCBmbGF0YnVmZmVycworZnJvbSBmbGF0YnVmZmVycy5jb21wYXQgaW1wb3J0IGltcG9ydF9udW1weQorbnAgPSBpbXBvcnRfbnVtcHkoKQorCitjbGFzcyBTdHJ1Y3RPZlN0cnVjdHNPZlN0cnVjdHMob2JqZWN0KToKKyAgICBfX3Nsb3RzX18gPSBbJ190YWInXQorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIFNpemVPZihjbHMpOgorICAgICAgICByZXR1cm4gMjAKKworICAgICMgU3RydWN0T2ZTdHJ1Y3RzT2ZTdHJ1Y3RzCisgICAgZGVmIEluaXQoc2VsZiwgYnVmLCBwb3MpOgorICAgICAgICBzZWxmLl90YWIgPSBmbGF0YnVmZmVycy50YWJsZS5UYWJsZShidWYsIHBvcykKKworICAgICMgU3RydWN0T2ZTdHJ1Y3RzT2ZTdHJ1Y3RzCisgICAgZGVmIEEoc2VsZiwgb2JqKToKKyAgICAgICAgb2JqLkluaXQoc2VsZi5fdGFiLkJ5dGVzLCBzZWxmLl90YWIuUG9zICsgMCkKKyAgICAgICAgcmV0dXJuIG9iagorCisKK2RlZiBDcmVhdGVTdHJ1Y3RPZlN0cnVjdHNPZlN0cnVjdHMoYnVpbGRlciwgYV9hX2lkLCBhX2FfZGlzdGFuY2UsIGFfYl9hLCBhX2JfYiwgYV9jX2lkLCBhX2NfZGlzdGFuY2UpOgorICAgIGJ1aWxkZXIuUHJlcCg0LCAyMCkKKyAgICBidWlsZGVyLlByZXAoNCwgMjApCisgICAgYnVpbGRlci5QcmVwKDQsIDgpCisgICAgYnVpbGRlci5QcmVwZW5kVWludDMyKGFfY19kaXN0YW5jZSkKKyAgICBidWlsZGVyLlByZXBlbmRVaW50MzIoYV9jX2lkKQorICAgIGJ1aWxkZXIuUHJlcCgyLCA0KQorICAgIGJ1aWxkZXIuUGFkKDEpCisgICAgYnVpbGRlci5QcmVwZW5kSW50OChhX2JfYikKKyAgICBidWlsZGVyLlByZXBlbmRJbnQxNihhX2JfYSkKKyAgICBidWlsZGVyLlByZXAoNCwgOCkKKyAgICBidWlsZGVyLlByZXBlbmRVaW50MzIoYV9hX2Rpc3RhbmNlKQorICAgIGJ1aWxkZXIuUHJlcGVuZFVpbnQzMihhX2FfaWQpCisgICAgcmV0dXJuIGJ1aWxkZXIuT2Zmc2V0KCkKKworaW1wb3J0IE15R2FtZS5FeGFtcGxlLlN0cnVjdE9mU3RydWN0cwordHJ5OgorICAgIGZyb20gdHlwaW5nIGltcG9ydCBPcHRpb25hbAorZXhjZXB0OgorICAgIHBhc3MKKworY2xhc3MgU3RydWN0T2ZTdHJ1Y3RzT2ZTdHJ1Y3RzVChvYmplY3QpOgorCisgICAgIyBTdHJ1Y3RPZlN0cnVjdHNPZlN0cnVjdHNUCisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICBzZWxmLmEgPSBOb25lICAjIHR5cGU6IE9wdGlvbmFsW015R2FtZS5FeGFtcGxlLlN0cnVjdE9mU3RydWN0cy5TdHJ1Y3RPZlN0cnVjdHNUXQorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIEluaXRGcm9tQnVmKGNscywgYnVmLCBwb3MpOgorICAgICAgICBzdHJ1Y3RPZlN0cnVjdHNPZlN0cnVjdHMgPSBTdHJ1Y3RPZlN0cnVjdHNPZlN0cnVjdHMoKQorICAgICAgICBzdHJ1Y3RPZlN0cnVjdHNPZlN0cnVjdHMuSW5pdChidWYsIHBvcykKKyAgICAgICAgcmV0dXJuIGNscy5Jbml0RnJvbU9iaihzdHJ1Y3RPZlN0cnVjdHNPZlN0cnVjdHMpCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgSW5pdEZyb21PYmooY2xzLCBzdHJ1Y3RPZlN0cnVjdHNPZlN0cnVjdHMpOgorICAgICAgICB4ID0gU3RydWN0T2ZTdHJ1Y3RzT2ZTdHJ1Y3RzVCgpCisgICAgICAgIHguX1VuUGFjayhzdHJ1Y3RPZlN0cnVjdHNPZlN0cnVjdHMpCisgICAgICAgIHJldHVybiB4CisKKyAgICAjIFN0cnVjdE9mU3RydWN0c09mU3RydWN0c1QKKyAgICBkZWYgX1VuUGFjayhzZWxmLCBzdHJ1Y3RPZlN0cnVjdHNPZlN0cnVjdHMpOgorICAgICAgICBpZiBzdHJ1Y3RPZlN0cnVjdHNPZlN0cnVjdHMgaXMgTm9uZToKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBpZiBzdHJ1Y3RPZlN0cnVjdHNPZlN0cnVjdHMuQShNeUdhbWUuRXhhbXBsZS5TdHJ1Y3RPZlN0cnVjdHMuU3RydWN0T2ZTdHJ1Y3RzKCkpIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgc2VsZi5hID0gTXlHYW1lLkV4YW1wbGUuU3RydWN0T2ZTdHJ1Y3RzLlN0cnVjdE9mU3RydWN0c1QuSW5pdEZyb21PYmooc3RydWN0T2ZTdHJ1Y3RzT2ZTdHJ1Y3RzLkEoTXlHYW1lLkV4YW1wbGUuU3RydWN0T2ZTdHJ1Y3RzLlN0cnVjdE9mU3RydWN0cygpKSkKKworICAgICMgU3RydWN0T2ZTdHJ1Y3RzT2ZTdHJ1Y3RzVAorICAgIGRlZiBQYWNrKHNlbGYsIGJ1aWxkZXIpOgorICAgICAgICByZXR1cm4gQ3JlYXRlU3RydWN0T2ZTdHJ1Y3RzT2ZTdHJ1Y3RzKGJ1aWxkZXIsIHNlbGYuYS5hLmlkLCBzZWxmLmEuYS5kaXN0YW5jZSwgc2VsZi5hLmIuYSwgc2VsZi5hLmIuYiwgc2VsZi5hLmMuaWQsIHNlbGYuYS5jLmRpc3RhbmNlKQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvTXlHYW1lL0V4YW1wbGUvU3RydWN0T2ZTdHJ1Y3RzT2ZTdHJ1Y3RzVC5qYXZhIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvTXlHYW1lL0V4YW1wbGUvU3RydWN0T2ZTdHJ1Y3RzT2ZTdHJ1Y3RzVC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNmMjMwNDAKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9NeUdhbWUvRXhhbXBsZS9TdHJ1Y3RPZlN0cnVjdHNPZlN0cnVjdHNULmphdmEKQEAgLTAsMCArMSwyMiBAQAorLy8gYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgYnkgdGhlIEZsYXRCdWZmZXJzIGNvbXBpbGVyLCBkbyBub3QgbW9kaWZ5CisKK3BhY2thZ2UgTXlHYW1lLkV4YW1wbGU7CisKK2ltcG9ydCBqYXZhLm5pby4qOworaW1wb3J0IGphdmEubGFuZy4qOworaW1wb3J0IGphdmEudXRpbC4qOworaW1wb3J0IGNvbS5nb29nbGUuZmxhdGJ1ZmZlcnMuKjsKKworcHVibGljIGNsYXNzIFN0cnVjdE9mU3RydWN0c09mU3RydWN0c1QgeworICBwcml2YXRlIE15R2FtZS5FeGFtcGxlLlN0cnVjdE9mU3RydWN0c1QgYTsKKworICBwdWJsaWMgTXlHYW1lLkV4YW1wbGUuU3RydWN0T2ZTdHJ1Y3RzVCBnZXRBKCkgeyByZXR1cm4gYTsgfQorCisgIHB1YmxpYyB2b2lkIHNldEEoTXlHYW1lLkV4YW1wbGUuU3RydWN0T2ZTdHJ1Y3RzVCBhKSB7IHRoaXMuYSA9IGE7IH0KKworCisgIHB1YmxpYyBTdHJ1Y3RPZlN0cnVjdHNPZlN0cnVjdHNUKCkgeworICAgIHRoaXMuYSA9IG5ldyBNeUdhbWUuRXhhbXBsZS5TdHJ1Y3RPZlN0cnVjdHNUKCk7CisgIH0KK30KKwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvTXlHYW1lL0V4YW1wbGUvVGVzdC5jcyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL015R2FtZS9FeGFtcGxlL1Rlc3QuY3MKaW5kZXggYTgwNTIxOC4uNjhmMzM1NCAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvTXlHYW1lL0V4YW1wbGUvVGVzdC5jcworKysgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9NeUdhbWUvRXhhbXBsZS9UZXN0LmNzCkBAIC03LDcgKzcsNyBAQAogCiB1c2luZyBnbG9iYWw6OlN5c3RlbTsKIHVzaW5nIGdsb2JhbDo6U3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Ci11c2luZyBnbG9iYWw6OkZsYXRCdWZmZXJzOwordXNpbmcgZ2xvYmFsOjpHb29nbGUuRmxhdEJ1ZmZlcnM7CiAKIHB1YmxpYyBzdHJ1Y3QgVGVzdCA6IElGbGF0YnVmZmVyT2JqZWN0CiB7CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9NeUdhbWUvRXhhbXBsZS9UZXN0LmdvIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvTXlHYW1lL0V4YW1wbGUvVGVzdC5nbwppbmRleCBjYmY3ZTI5Li4xNDkxNzExIDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9NeUdhbWUvRXhhbXBsZS9UZXN0LmdvCisrKyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL015R2FtZS9FeGFtcGxlL1Rlc3QuZ28KQEAgLTcsOCArNyw4IEBACiApCiAKIHR5cGUgVGVzdFQgc3RydWN0IHsKLQlBIGludDE2Ci0JQiBpbnQ4CisJQSBpbnQxNiBganNvbjoiYSJgCisJQiBpbnQ4IGBqc29uOiJiImAKIH0KIAogZnVuYyAodCAqVGVzdFQpIFBhY2soYnVpbGRlciAqZmxhdGJ1ZmZlcnMuQnVpbGRlcikgZmxhdGJ1ZmZlcnMuVU9mZnNldFQgewpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvTXlHYW1lL0V4YW1wbGUvVGVzdC5sdWEgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9NeUdhbWUvRXhhbXBsZS9UZXN0Lmx1YQppbmRleCA2M2I1NjZjLi43NDIxN2NjIDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9NeUdhbWUvRXhhbXBsZS9UZXN0Lmx1YQorKysgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9NeUdhbWUvRXhhbXBsZS9UZXN0Lmx1YQpAQCAtMyw3ICszLDcgQEAKICAgQXV0b21hdGljYWxseSBnZW5lcmF0ZWQgYnkgdGhlIEZsYXRCdWZmZXJzIGNvbXBpbGVyLCBkbyBub3QgbW9kaWZ5LgogICBPciBtb2RpZnkuIEknbSBhIG1lc3NhZ2UsIG5vdCBhIGNvcC4KIAotICBmbGF0YyB2ZXJzaW9uOiAyLjAuNgorICBmbGF0YyB2ZXJzaW9uOiAyLjAuOAogCiAgIERlY2xhcmVkIGJ5ICA6IC8vbW9uc3Rlcl90ZXN0LmZicwogICBSb290aW5nIHR5cGUgOiBNeUdhbWUuRXhhbXBsZS5Nb25zdGVyICgvL21vbnN0ZXJfdGVzdC5mYnMpCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9NeUdhbWUvRXhhbXBsZS9UZXN0U2ltcGxlVGFibGVXaXRoRW51bS5jcyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL015R2FtZS9FeGFtcGxlL1Rlc3RTaW1wbGVUYWJsZVdpdGhFbnVtLmNzCmluZGV4IDk5YTQ5OGIuLjgzN2FkMTkgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL015R2FtZS9FeGFtcGxlL1Rlc3RTaW1wbGVUYWJsZVdpdGhFbnVtLmNzCisrKyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL015R2FtZS9FeGFtcGxlL1Rlc3RTaW1wbGVUYWJsZVdpdGhFbnVtLmNzCkBAIC03LDEzICs3LDEzIEBACiAKIHVzaW5nIGdsb2JhbDo6U3lzdGVtOwogdXNpbmcgZ2xvYmFsOjpTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKLXVzaW5nIGdsb2JhbDo6RmxhdEJ1ZmZlcnM7Cit1c2luZyBnbG9iYWw6Okdvb2dsZS5GbGF0QnVmZmVyczsKIAogaW50ZXJuYWwgcGFydGlhbCBzdHJ1Y3QgVGVzdFNpbXBsZVRhYmxlV2l0aEVudW0gOiBJRmxhdGJ1ZmZlck9iamVjdAogewogICBwcml2YXRlIFRhYmxlIF9fcDsKICAgcHVibGljIEJ5dGVCdWZmZXIgQnl0ZUJ1ZmZlciB7IGdldCB7IHJldHVybiBfX3AuYmI7IH0gfQotICBwdWJsaWMgc3RhdGljIHZvaWQgVmFsaWRhdGVWZXJzaW9uKCkgeyBGbGF0QnVmZmVyQ29uc3RhbnRzLkZMQVRCVUZGRVJTXzJfMF8wKCk7IH0KKyAgcHVibGljIHN0YXRpYyB2b2lkIFZhbGlkYXRlVmVyc2lvbigpIHsgRmxhdEJ1ZmZlckNvbnN0YW50cy5GTEFUQlVGRkVSU18yXzBfOCgpOyB9CiAgIHB1YmxpYyBzdGF0aWMgVGVzdFNpbXBsZVRhYmxlV2l0aEVudW0gR2V0Um9vdEFzVGVzdFNpbXBsZVRhYmxlV2l0aEVudW0oQnl0ZUJ1ZmZlciBfYmIpIHsgcmV0dXJuIEdldFJvb3RBc1Rlc3RTaW1wbGVUYWJsZVdpdGhFbnVtKF9iYiwgbmV3IFRlc3RTaW1wbGVUYWJsZVdpdGhFbnVtKCkpOyB9CiAgIHB1YmxpYyBzdGF0aWMgVGVzdFNpbXBsZVRhYmxlV2l0aEVudW0gR2V0Um9vdEFzVGVzdFNpbXBsZVRhYmxlV2l0aEVudW0oQnl0ZUJ1ZmZlciBfYmIsIFRlc3RTaW1wbGVUYWJsZVdpdGhFbnVtIG9iaikgeyByZXR1cm4gKG9iai5fX2Fzc2lnbihfYmIuR2V0SW50KF9iYi5Qb3NpdGlvbikgKyBfYmIuUG9zaXRpb24sIF9iYikpOyB9CiAgIHB1YmxpYyB2b2lkIF9faW5pdChpbnQgX2ksIEJ5dGVCdWZmZXIgX2JiKSB7IF9fcCA9IG5ldyBUYWJsZShfaSwgX2JiKTsgfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvTXlHYW1lL0V4YW1wbGUvVGVzdFNpbXBsZVRhYmxlV2l0aEVudW0uZ28gYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9NeUdhbWUvRXhhbXBsZS9UZXN0U2ltcGxlVGFibGVXaXRoRW51bS5nbwppbmRleCBiOGNkZTEyLi41NTM4NjdmIDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9NeUdhbWUvRXhhbXBsZS9UZXN0U2ltcGxlVGFibGVXaXRoRW51bS5nbworKysgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9NeUdhbWUvRXhhbXBsZS9UZXN0U2ltcGxlVGFibGVXaXRoRW51bS5nbwpAQCAtNyw3ICs3LDcgQEAKICkKIAogdHlwZSBUZXN0U2ltcGxlVGFibGVXaXRoRW51bVQgc3RydWN0IHsKLQlDb2xvciBDb2xvcgorCUNvbG9yIENvbG9yIGBqc29uOiJjb2xvciJgCiB9CiAKIGZ1bmMgKHQgKlRlc3RTaW1wbGVUYWJsZVdpdGhFbnVtVCkgUGFjayhidWlsZGVyICpmbGF0YnVmZmVycy5CdWlsZGVyKSBmbGF0YnVmZmVycy5VT2Zmc2V0VCB7CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9NeUdhbWUvRXhhbXBsZS9UZXN0U2ltcGxlVGFibGVXaXRoRW51bS5qYXZhIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvTXlHYW1lL0V4YW1wbGUvVGVzdFNpbXBsZVRhYmxlV2l0aEVudW0uamF2YQppbmRleCA5MmQwZDY5Li4zOWY5NDIxIDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9NeUdhbWUvRXhhbXBsZS9UZXN0U2ltcGxlVGFibGVXaXRoRW51bS5qYXZhCisrKyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL015R2FtZS9FeGFtcGxlL1Rlc3RTaW1wbGVUYWJsZVdpdGhFbnVtLmphdmEKQEAgLTksNyArOSw3IEBACiAKIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKQogZmluYWwgY2xhc3MgVGVzdFNpbXBsZVRhYmxlV2l0aEVudW0gZXh0ZW5kcyBUYWJsZSB7Ci0gIHB1YmxpYyBzdGF0aWMgdm9pZCBWYWxpZGF0ZVZlcnNpb24oKSB7IENvbnN0YW50cy5GTEFUQlVGRkVSU18yXzBfMCgpOyB9CisgIHB1YmxpYyBzdGF0aWMgdm9pZCBWYWxpZGF0ZVZlcnNpb24oKSB7IENvbnN0YW50cy5GTEFUQlVGRkVSU18yXzBfOCgpOyB9CiAgIHB1YmxpYyBzdGF0aWMgVGVzdFNpbXBsZVRhYmxlV2l0aEVudW0gZ2V0Um9vdEFzVGVzdFNpbXBsZVRhYmxlV2l0aEVudW0oQnl0ZUJ1ZmZlciBfYmIpIHsgcmV0dXJuIGdldFJvb3RBc1Rlc3RTaW1wbGVUYWJsZVdpdGhFbnVtKF9iYiwgbmV3IFRlc3RTaW1wbGVUYWJsZVdpdGhFbnVtKCkpOyB9CiAgIHB1YmxpYyBzdGF0aWMgVGVzdFNpbXBsZVRhYmxlV2l0aEVudW0gZ2V0Um9vdEFzVGVzdFNpbXBsZVRhYmxlV2l0aEVudW0oQnl0ZUJ1ZmZlciBfYmIsIFRlc3RTaW1wbGVUYWJsZVdpdGhFbnVtIG9iaikgeyBfYmIub3JkZXIoQnl0ZU9yZGVyLkxJVFRMRV9FTkRJQU4pOyByZXR1cm4gKG9iai5fX2Fzc2lnbihfYmIuZ2V0SW50KF9iYi5wb3NpdGlvbigpKSArIF9iYi5wb3NpdGlvbigpLCBfYmIpKTsgfQogICBwdWJsaWMgdm9pZCBfX2luaXQoaW50IF9pLCBCeXRlQnVmZmVyIF9iYikgeyBfX3Jlc2V0KF9pLCBfYmIpOyB9CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9NeUdhbWUvRXhhbXBsZS9UZXN0U2ltcGxlVGFibGVXaXRoRW51bS5rdCBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL015R2FtZS9FeGFtcGxlL1Rlc3RTaW1wbGVUYWJsZVdpdGhFbnVtLmt0CmluZGV4IDY0YmY3ZTIuLmNiMDgxZmMgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL015R2FtZS9FeGFtcGxlL1Rlc3RTaW1wbGVUYWJsZVdpdGhFbnVtLmt0CisrKyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL015R2FtZS9FeGFtcGxlL1Rlc3RTaW1wbGVUYWJsZVdpdGhFbnVtLmt0CkBAIC0zMSw3ICszMSw3IEBACiAgICAgICAgIH0KICAgICB9CiAgICAgY29tcGFuaW9uIG9iamVjdCB7Ci0gICAgICAgIGZ1biB2YWxpZGF0ZVZlcnNpb24oKSA9IENvbnN0YW50cy5GTEFUQlVGRkVSU18yXzBfMCgpCisgICAgICAgIGZ1biB2YWxpZGF0ZVZlcnNpb24oKSA9IENvbnN0YW50cy5GTEFUQlVGRkVSU18yXzBfOCgpCiAgICAgICAgIGZ1biBnZXRSb290QXNUZXN0U2ltcGxlVGFibGVXaXRoRW51bShfYmI6IEJ5dGVCdWZmZXIpOiBUZXN0U2ltcGxlVGFibGVXaXRoRW51bSA9IGdldFJvb3RBc1Rlc3RTaW1wbGVUYWJsZVdpdGhFbnVtKF9iYiwgVGVzdFNpbXBsZVRhYmxlV2l0aEVudW0oKSkKICAgICAgICAgZnVuIGdldFJvb3RBc1Rlc3RTaW1wbGVUYWJsZVdpdGhFbnVtKF9iYjogQnl0ZUJ1ZmZlciwgb2JqOiBUZXN0U2ltcGxlVGFibGVXaXRoRW51bSk6IFRlc3RTaW1wbGVUYWJsZVdpdGhFbnVtIHsKICAgICAgICAgICAgIF9iYi5vcmRlcihCeXRlT3JkZXIuTElUVExFX0VORElBTikKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL015R2FtZS9FeGFtcGxlL1Rlc3RTaW1wbGVUYWJsZVdpdGhFbnVtLmx1YSBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL015R2FtZS9FeGFtcGxlL1Rlc3RTaW1wbGVUYWJsZVdpdGhFbnVtLmx1YQppbmRleCAwMDBlNmUxLi45MGRjZjc5IDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9NeUdhbWUvRXhhbXBsZS9UZXN0U2ltcGxlVGFibGVXaXRoRW51bS5sdWEKKysrIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvTXlHYW1lL0V4YW1wbGUvVGVzdFNpbXBsZVRhYmxlV2l0aEVudW0ubHVhCkBAIC0zLDcgKzMsNyBAQAogICBBdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBieSB0aGUgRmxhdEJ1ZmZlcnMgY29tcGlsZXIsIGRvIG5vdCBtb2RpZnkuCiAgIE9yIG1vZGlmeS4gSSdtIGEgbWVzc2FnZSwgbm90IGEgY29wLgogCi0gIGZsYXRjIHZlcnNpb246IDIuMC42CisgIGZsYXRjIHZlcnNpb246IDIuMC44CiAKICAgRGVjbGFyZWQgYnkgIDogLy9tb25zdGVyX3Rlc3QuZmJzCiAgIFJvb3RpbmcgdHlwZSA6IE15R2FtZS5FeGFtcGxlLk1vbnN0ZXIgKC8vbW9uc3Rlcl90ZXN0LmZicykKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL015R2FtZS9FeGFtcGxlL1R5cGVBbGlhc2VzLmNzIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvTXlHYW1lL0V4YW1wbGUvVHlwZUFsaWFzZXMuY3MKaW5kZXggMTgwMWRjOC4uZjkzNmFkNiAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvTXlHYW1lL0V4YW1wbGUvVHlwZUFsaWFzZXMuY3MKKysrIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvTXlHYW1lL0V4YW1wbGUvVHlwZUFsaWFzZXMuY3MKQEAgLTcsMTMgKzcsMTMgQEAKIAogdXNpbmcgZ2xvYmFsOjpTeXN0ZW07CiB1c2luZyBnbG9iYWw6OlN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwotdXNpbmcgZ2xvYmFsOjpGbGF0QnVmZmVyczsKK3VzaW5nIGdsb2JhbDo6R29vZ2xlLkZsYXRCdWZmZXJzOwogCiBwdWJsaWMgc3RydWN0IFR5cGVBbGlhc2VzIDogSUZsYXRidWZmZXJPYmplY3QKIHsKICAgcHJpdmF0ZSBUYWJsZSBfX3A7CiAgIHB1YmxpYyBCeXRlQnVmZmVyIEJ5dGVCdWZmZXIgeyBnZXQgeyByZXR1cm4gX19wLmJiOyB9IH0KLSAgcHVibGljIHN0YXRpYyB2b2lkIFZhbGlkYXRlVmVyc2lvbigpIHsgRmxhdEJ1ZmZlckNvbnN0YW50cy5GTEFUQlVGRkVSU18yXzBfMCgpOyB9CisgIHB1YmxpYyBzdGF0aWMgdm9pZCBWYWxpZGF0ZVZlcnNpb24oKSB7IEZsYXRCdWZmZXJDb25zdGFudHMuRkxBVEJVRkZFUlNfMl8wXzgoKTsgfQogICBwdWJsaWMgc3RhdGljIFR5cGVBbGlhc2VzIEdldFJvb3RBc1R5cGVBbGlhc2VzKEJ5dGVCdWZmZXIgX2JiKSB7IHJldHVybiBHZXRSb290QXNUeXBlQWxpYXNlcyhfYmIsIG5ldyBUeXBlQWxpYXNlcygpKTsgfQogICBwdWJsaWMgc3RhdGljIFR5cGVBbGlhc2VzIEdldFJvb3RBc1R5cGVBbGlhc2VzKEJ5dGVCdWZmZXIgX2JiLCBUeXBlQWxpYXNlcyBvYmopIHsgcmV0dXJuIChvYmouX19hc3NpZ24oX2JiLkdldEludChfYmIuUG9zaXRpb24pICsgX2JiLlBvc2l0aW9uLCBfYmIpKTsgfQogICBwdWJsaWMgdm9pZCBfX2luaXQoaW50IF9pLCBCeXRlQnVmZmVyIF9iYikgeyBfX3AgPSBuZXcgVGFibGUoX2ksIF9iYik7IH0KQEAgLTEwMSwxMCArMTAxLDE0IEBACiAgIHB1YmxpYyBzdGF0aWMgdm9pZCBBZGRWOChGbGF0QnVmZmVyQnVpbGRlciBidWlsZGVyLCBWZWN0b3JPZmZzZXQgdjhPZmZzZXQpIHsgYnVpbGRlci5BZGRPZmZzZXQoMTAsIHY4T2Zmc2V0LlZhbHVlLCAwKTsgfQogICBwdWJsaWMgc3RhdGljIFZlY3Rvck9mZnNldCBDcmVhdGVWOFZlY3RvcihGbGF0QnVmZmVyQnVpbGRlciBidWlsZGVyLCBzYnl0ZVtdIGRhdGEpIHsgYnVpbGRlci5TdGFydFZlY3RvcigxLCBkYXRhLkxlbmd0aCwgMSk7IGZvciAoaW50IGkgPSBkYXRhLkxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSBidWlsZGVyLkFkZFNieXRlKGRhdGFbaV0pOyByZXR1cm4gYnVpbGRlci5FbmRWZWN0b3IoKTsgfQogICBwdWJsaWMgc3RhdGljIFZlY3Rvck9mZnNldCBDcmVhdGVWOFZlY3RvckJsb2NrKEZsYXRCdWZmZXJCdWlsZGVyIGJ1aWxkZXIsIHNieXRlW10gZGF0YSkgeyBidWlsZGVyLlN0YXJ0VmVjdG9yKDEsIGRhdGEuTGVuZ3RoLCAxKTsgYnVpbGRlci5BZGQoZGF0YSk7IHJldHVybiBidWlsZGVyLkVuZFZlY3RvcigpOyB9CisgIHB1YmxpYyBzdGF0aWMgVmVjdG9yT2Zmc2V0IENyZWF0ZVY4VmVjdG9yQmxvY2soRmxhdEJ1ZmZlckJ1aWxkZXIgYnVpbGRlciwgQXJyYXlTZWdtZW50PHNieXRlPiBkYXRhKSB7IGJ1aWxkZXIuU3RhcnRWZWN0b3IoMSwgZGF0YS5Db3VudCwgMSk7IGJ1aWxkZXIuQWRkKGRhdGEpOyByZXR1cm4gYnVpbGRlci5FbmRWZWN0b3IoKTsgfQorICBwdWJsaWMgc3RhdGljIFZlY3Rvck9mZnNldCBDcmVhdGVWOFZlY3RvckJsb2NrKEZsYXRCdWZmZXJCdWlsZGVyIGJ1aWxkZXIsIEludFB0ciBkYXRhUHRyLCBpbnQgc2l6ZUluQnl0ZXMpIHsgYnVpbGRlci5TdGFydFZlY3RvcigxLCBzaXplSW5CeXRlcywgMSk7IGJ1aWxkZXIuQWRkPHNieXRlPihkYXRhUHRyLCBzaXplSW5CeXRlcyk7IHJldHVybiBidWlsZGVyLkVuZFZlY3RvcigpOyB9CiAgIHB1YmxpYyBzdGF0aWMgdm9pZCBTdGFydFY4VmVjdG9yKEZsYXRCdWZmZXJCdWlsZGVyIGJ1aWxkZXIsIGludCBudW1FbGVtcykgeyBidWlsZGVyLlN0YXJ0VmVjdG9yKDEsIG51bUVsZW1zLCAxKTsgfQogICBwdWJsaWMgc3RhdGljIHZvaWQgQWRkVmY2NChGbGF0QnVmZmVyQnVpbGRlciBidWlsZGVyLCBWZWN0b3JPZmZzZXQgdmY2NE9mZnNldCkgeyBidWlsZGVyLkFkZE9mZnNldCgxMSwgdmY2NE9mZnNldC5WYWx1ZSwgMCk7IH0KICAgcHVibGljIHN0YXRpYyBWZWN0b3JPZmZzZXQgQ3JlYXRlVmY2NFZlY3RvcihGbGF0QnVmZmVyQnVpbGRlciBidWlsZGVyLCBkb3VibGVbXSBkYXRhKSB7IGJ1aWxkZXIuU3RhcnRWZWN0b3IoOCwgZGF0YS5MZW5ndGgsIDgpOyBmb3IgKGludCBpID0gZGF0YS5MZW5ndGggLSAxOyBpID49IDA7IGktLSkgYnVpbGRlci5BZGREb3VibGUoZGF0YVtpXSk7IHJldHVybiBidWlsZGVyLkVuZFZlY3RvcigpOyB9CiAgIHB1YmxpYyBzdGF0aWMgVmVjdG9yT2Zmc2V0IENyZWF0ZVZmNjRWZWN0b3JCbG9jayhGbGF0QnVmZmVyQnVpbGRlciBidWlsZGVyLCBkb3VibGVbXSBkYXRhKSB7IGJ1aWxkZXIuU3RhcnRWZWN0b3IoOCwgZGF0YS5MZW5ndGgsIDgpOyBidWlsZGVyLkFkZChkYXRhKTsgcmV0dXJuIGJ1aWxkZXIuRW5kVmVjdG9yKCk7IH0KKyAgcHVibGljIHN0YXRpYyBWZWN0b3JPZmZzZXQgQ3JlYXRlVmY2NFZlY3RvckJsb2NrKEZsYXRCdWZmZXJCdWlsZGVyIGJ1aWxkZXIsIEFycmF5U2VnbWVudDxkb3VibGU+IGRhdGEpIHsgYnVpbGRlci5TdGFydFZlY3Rvcig4LCBkYXRhLkNvdW50LCA4KTsgYnVpbGRlci5BZGQoZGF0YSk7IHJldHVybiBidWlsZGVyLkVuZFZlY3RvcigpOyB9CisgIHB1YmxpYyBzdGF0aWMgVmVjdG9yT2Zmc2V0IENyZWF0ZVZmNjRWZWN0b3JCbG9jayhGbGF0QnVmZmVyQnVpbGRlciBidWlsZGVyLCBJbnRQdHIgZGF0YVB0ciwgaW50IHNpemVJbkJ5dGVzKSB7IGJ1aWxkZXIuU3RhcnRWZWN0b3IoMSwgc2l6ZUluQnl0ZXMsIDEpOyBidWlsZGVyLkFkZDxkb3VibGU+KGRhdGFQdHIsIHNpemVJbkJ5dGVzKTsgcmV0dXJuIGJ1aWxkZXIuRW5kVmVjdG9yKCk7IH0KICAgcHVibGljIHN0YXRpYyB2b2lkIFN0YXJ0VmY2NFZlY3RvcihGbGF0QnVmZmVyQnVpbGRlciBidWlsZGVyLCBpbnQgbnVtRWxlbXMpIHsgYnVpbGRlci5TdGFydFZlY3Rvcig4LCBudW1FbGVtcywgOCk7IH0KICAgcHVibGljIHN0YXRpYyBPZmZzZXQ8TXlHYW1lLkV4YW1wbGUuVHlwZUFsaWFzZXM+IEVuZFR5cGVBbGlhc2VzKEZsYXRCdWZmZXJCdWlsZGVyIGJ1aWxkZXIpIHsKICAgICBpbnQgbyA9IGJ1aWxkZXIuRW5kVGFibGUoKTsKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL015R2FtZS9FeGFtcGxlL1R5cGVBbGlhc2VzLmdvIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvTXlHYW1lL0V4YW1wbGUvVHlwZUFsaWFzZXMuZ28KaW5kZXggZDAxOGZhMS4uOWRlZDM1ZSAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvTXlHYW1lL0V4YW1wbGUvVHlwZUFsaWFzZXMuZ28KKysrIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvTXlHYW1lL0V4YW1wbGUvVHlwZUFsaWFzZXMuZ28KQEAgLTcsMTggKzcsMTggQEAKICkKIAogdHlwZSBUeXBlQWxpYXNlc1Qgc3RydWN0IHsKLQlJOCBpbnQ4Ci0JVTggYnl0ZQotCUkxNiBpbnQxNgotCVUxNiB1aW50MTYKLQlJMzIgaW50MzIKLQlVMzIgdWludDMyCi0JSTY0IGludDY0Ci0JVTY0IHVpbnQ2NAotCUYzMiBmbG9hdDMyCi0JRjY0IGZsb2F0NjQKLQlWOCBbXWludDgKLQlWZjY0IFtdZmxvYXQ2NAorCUk4IGludDggYGpzb246Imk4ImAKKwlVOCBieXRlIGBqc29uOiJ1OCJgCisJSTE2IGludDE2IGBqc29uOiJpMTYiYAorCVUxNiB1aW50MTYgYGpzb246InUxNiJgCisJSTMyIGludDMyIGBqc29uOiJpMzIiYAorCVUzMiB1aW50MzIgYGpzb246InUzMiJgCisJSTY0IGludDY0IGBqc29uOiJpNjQiYAorCVU2NCB1aW50NjQgYGpzb246InU2NCJgCisJRjMyIGZsb2F0MzIgYGpzb246ImYzMiJgCisJRjY0IGZsb2F0NjQgYGpzb246ImY2NCJgCisJVjggW11pbnQ4IGBqc29uOiJ2OCJgCisJVmY2NCBbXWZsb2F0NjQgYGpzb246InZmNjQiYAogfQogCiBmdW5jICh0ICpUeXBlQWxpYXNlc1QpIFBhY2soYnVpbGRlciAqZmxhdGJ1ZmZlcnMuQnVpbGRlcikgZmxhdGJ1ZmZlcnMuVU9mZnNldFQgewpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvTXlHYW1lL0V4YW1wbGUvVHlwZUFsaWFzZXMuamF2YSBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL015R2FtZS9FeGFtcGxlL1R5cGVBbGlhc2VzLmphdmEKaW5kZXggZGI3NTdjYy4uZDkxY2E2NSAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvTXlHYW1lL0V4YW1wbGUvVHlwZUFsaWFzZXMuamF2YQorKysgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9NeUdhbWUvRXhhbXBsZS9UeXBlQWxpYXNlcy5qYXZhCkBAIC05LDcgKzksNyBAQAogCiBAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikKIHB1YmxpYyBmaW5hbCBjbGFzcyBUeXBlQWxpYXNlcyBleHRlbmRzIFRhYmxlIHsKLSAgcHVibGljIHN0YXRpYyB2b2lkIFZhbGlkYXRlVmVyc2lvbigpIHsgQ29uc3RhbnRzLkZMQVRCVUZGRVJTXzJfMF8wKCk7IH0KKyAgcHVibGljIHN0YXRpYyB2b2lkIFZhbGlkYXRlVmVyc2lvbigpIHsgQ29uc3RhbnRzLkZMQVRCVUZGRVJTXzJfMF84KCk7IH0KICAgcHVibGljIHN0YXRpYyBUeXBlQWxpYXNlcyBnZXRSb290QXNUeXBlQWxpYXNlcyhCeXRlQnVmZmVyIF9iYikgeyByZXR1cm4gZ2V0Um9vdEFzVHlwZUFsaWFzZXMoX2JiLCBuZXcgVHlwZUFsaWFzZXMoKSk7IH0KICAgcHVibGljIHN0YXRpYyBUeXBlQWxpYXNlcyBnZXRSb290QXNUeXBlQWxpYXNlcyhCeXRlQnVmZmVyIF9iYiwgVHlwZUFsaWFzZXMgb2JqKSB7IF9iYi5vcmRlcihCeXRlT3JkZXIuTElUVExFX0VORElBTik7IHJldHVybiAob2JqLl9fYXNzaWduKF9iYi5nZXRJbnQoX2JiLnBvc2l0aW9uKCkpICsgX2JiLnBvc2l0aW9uKCksIF9iYikpOyB9CiAgIHB1YmxpYyB2b2lkIF9faW5pdChpbnQgX2ksIEJ5dGVCdWZmZXIgX2JiKSB7IF9fcmVzZXQoX2ksIF9iYik7IH0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL015R2FtZS9FeGFtcGxlL1R5cGVBbGlhc2VzLmt0IGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvTXlHYW1lL0V4YW1wbGUvVHlwZUFsaWFzZXMua3QKaW5kZXggY2RjODJiNS4uOGEyZDgwZSAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvTXlHYW1lL0V4YW1wbGUvVHlwZUFsaWFzZXMua3QKKysrIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvTXlHYW1lL0V4YW1wbGUvVHlwZUFsaWFzZXMua3QKQEAgLTIwMyw3ICsyMDMsNyBAQAogICAgICAgICB9CiAgICAgfQogICAgIGNvbXBhbmlvbiBvYmplY3QgewotICAgICAgICBmdW4gdmFsaWRhdGVWZXJzaW9uKCkgPSBDb25zdGFudHMuRkxBVEJVRkZFUlNfMl8wXzAoKQorICAgICAgICBmdW4gdmFsaWRhdGVWZXJzaW9uKCkgPSBDb25zdGFudHMuRkxBVEJVRkZFUlNfMl8wXzgoKQogICAgICAgICBmdW4gZ2V0Um9vdEFzVHlwZUFsaWFzZXMoX2JiOiBCeXRlQnVmZmVyKTogVHlwZUFsaWFzZXMgPSBnZXRSb290QXNUeXBlQWxpYXNlcyhfYmIsIFR5cGVBbGlhc2VzKCkpCiAgICAgICAgIGZ1biBnZXRSb290QXNUeXBlQWxpYXNlcyhfYmI6IEJ5dGVCdWZmZXIsIG9iajogVHlwZUFsaWFzZXMpOiBUeXBlQWxpYXNlcyB7CiAgICAgICAgICAgICBfYmIub3JkZXIoQnl0ZU9yZGVyLkxJVFRMRV9FTkRJQU4pCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9NeUdhbWUvRXhhbXBsZS9UeXBlQWxpYXNlcy5sdWEgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9NeUdhbWUvRXhhbXBsZS9UeXBlQWxpYXNlcy5sdWEKaW5kZXggMTExYWUzZS4uY2Q0MDZjMyAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvTXlHYW1lL0V4YW1wbGUvVHlwZUFsaWFzZXMubHVhCisrKyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL015R2FtZS9FeGFtcGxlL1R5cGVBbGlhc2VzLmx1YQpAQCAtMyw3ICszLDcgQEAKICAgQXV0b21hdGljYWxseSBnZW5lcmF0ZWQgYnkgdGhlIEZsYXRCdWZmZXJzIGNvbXBpbGVyLCBkbyBub3QgbW9kaWZ5LgogICBPciBtb2RpZnkuIEknbSBhIG1lc3NhZ2UsIG5vdCBhIGNvcC4KIAotICBmbGF0YyB2ZXJzaW9uOiAyLjAuNgorICBmbGF0YyB2ZXJzaW9uOiAyLjAuOAogCiAgIERlY2xhcmVkIGJ5ICA6IC8vbW9uc3Rlcl90ZXN0LmZicwogICBSb290aW5nIHR5cGUgOiBNeUdhbWUuRXhhbXBsZS5Nb25zdGVyICgvL21vbnN0ZXJfdGVzdC5mYnMpCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9NeUdhbWUvRXhhbXBsZS9WZWMzLmNzIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvTXlHYW1lL0V4YW1wbGUvVmVjMy5jcwppbmRleCAzMWM5ZjdlLi5hNDg2MWZhIDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9NeUdhbWUvRXhhbXBsZS9WZWMzLmNzCisrKyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL015R2FtZS9FeGFtcGxlL1ZlYzMuY3MKQEAgLTcsNyArNyw3IEBACiAKIHVzaW5nIGdsb2JhbDo6U3lzdGVtOwogdXNpbmcgZ2xvYmFsOjpTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKLXVzaW5nIGdsb2JhbDo6RmxhdEJ1ZmZlcnM7Cit1c2luZyBnbG9iYWw6Okdvb2dsZS5GbGF0QnVmZmVyczsKIAogcHVibGljIHN0cnVjdCBWZWMzIDogSUZsYXRidWZmZXJPYmplY3QKIHsKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL015R2FtZS9FeGFtcGxlL1ZlYzMuZ28gYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9NeUdhbWUvRXhhbXBsZS9WZWMzLmdvCmluZGV4IDA4MzExZWQuLjE2YTA1Y2QgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL015R2FtZS9FeGFtcGxlL1ZlYzMuZ28KKysrIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvTXlHYW1lL0V4YW1wbGUvVmVjMy5nbwpAQCAtNywxMiArNywxMiBAQAogKQogCiB0eXBlIFZlYzNUIHN0cnVjdCB7Ci0JWCBmbG9hdDMyCi0JWSBmbG9hdDMyCi0JWiBmbG9hdDMyCi0JVGVzdDEgZmxvYXQ2NAotCVRlc3QyIENvbG9yCi0JVGVzdDMgKlRlc3RUCisJWCBmbG9hdDMyIGBqc29uOiJ4ImAKKwlZIGZsb2F0MzIgYGpzb246InkiYAorCVogZmxvYXQzMiBganNvbjoieiJgCisJVGVzdDEgZmxvYXQ2NCBganNvbjoidGVzdDEiYAorCVRlc3QyIENvbG9yIGBqc29uOiJ0ZXN0MiJgCisJVGVzdDMgKlRlc3RUIGBqc29uOiJ0ZXN0MyJgCiB9CiAKIGZ1bmMgKHQgKlZlYzNUKSBQYWNrKGJ1aWxkZXIgKmZsYXRidWZmZXJzLkJ1aWxkZXIpIGZsYXRidWZmZXJzLlVPZmZzZXRUIHsKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL015R2FtZS9FeGFtcGxlL1ZlYzMubHVhIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvTXlHYW1lL0V4YW1wbGUvVmVjMy5sdWEKaW5kZXggZWY1MTA1MS4uNzk2YWM3YSAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvTXlHYW1lL0V4YW1wbGUvVmVjMy5sdWEKKysrIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvTXlHYW1lL0V4YW1wbGUvVmVjMy5sdWEKQEAgLTMsNyArMyw3IEBACiAgIEF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGJ5IHRoZSBGbGF0QnVmZmVycyBjb21waWxlciwgZG8gbm90IG1vZGlmeS4KICAgT3IgbW9kaWZ5LiBJJ20gYSBtZXNzYWdlLCBub3QgYSBjb3AuCiAKLSAgZmxhdGMgdmVyc2lvbjogMi4wLjYKKyAgZmxhdGMgdmVyc2lvbjogMi4wLjgKIAogICBEZWNsYXJlZCBieSAgOiAvL21vbnN0ZXJfdGVzdC5mYnMKICAgUm9vdGluZyB0eXBlIDogTXlHYW1lLkV4YW1wbGUuTW9uc3RlciAoLy9tb25zdGVyX3Rlc3QuZmJzKQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvTXlHYW1lL0V4YW1wbGUyL01vbnN0ZXIuY3MgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9NeUdhbWUvRXhhbXBsZTIvTW9uc3Rlci5jcwppbmRleCAzMjMyYmQ2Li5hZjczNmU3IDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9NeUdhbWUvRXhhbXBsZTIvTW9uc3Rlci5jcworKysgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9NeUdhbWUvRXhhbXBsZTIvTW9uc3Rlci5jcwpAQCAtNywxMyArNywxMyBAQAogCiB1c2luZyBnbG9iYWw6OlN5c3RlbTsKIHVzaW5nIGdsb2JhbDo6U3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Ci11c2luZyBnbG9iYWw6OkZsYXRCdWZmZXJzOwordXNpbmcgZ2xvYmFsOjpHb29nbGUuRmxhdEJ1ZmZlcnM7CiAKIHB1YmxpYyBzdHJ1Y3QgTW9uc3RlciA6IElGbGF0YnVmZmVyT2JqZWN0CiB7CiAgIHByaXZhdGUgVGFibGUgX19wOwogICBwdWJsaWMgQnl0ZUJ1ZmZlciBCeXRlQnVmZmVyIHsgZ2V0IHsgcmV0dXJuIF9fcC5iYjsgfSB9Ci0gIHB1YmxpYyBzdGF0aWMgdm9pZCBWYWxpZGF0ZVZlcnNpb24oKSB7IEZsYXRCdWZmZXJDb25zdGFudHMuRkxBVEJVRkZFUlNfMl8wXzAoKTsgfQorICBwdWJsaWMgc3RhdGljIHZvaWQgVmFsaWRhdGVWZXJzaW9uKCkgeyBGbGF0QnVmZmVyQ29uc3RhbnRzLkZMQVRCVUZGRVJTXzJfMF84KCk7IH0KICAgcHVibGljIHN0YXRpYyBNb25zdGVyIEdldFJvb3RBc01vbnN0ZXIoQnl0ZUJ1ZmZlciBfYmIpIHsgcmV0dXJuIEdldFJvb3RBc01vbnN0ZXIoX2JiLCBuZXcgTW9uc3RlcigpKTsgfQogICBwdWJsaWMgc3RhdGljIE1vbnN0ZXIgR2V0Um9vdEFzTW9uc3RlcihCeXRlQnVmZmVyIF9iYiwgTW9uc3RlciBvYmopIHsgcmV0dXJuIChvYmouX19hc3NpZ24oX2JiLkdldEludChfYmIuUG9zaXRpb24pICsgX2JiLlBvc2l0aW9uLCBfYmIpKTsgfQogICBwdWJsaWMgdm9pZCBfX2luaXQoaW50IF9pLCBCeXRlQnVmZmVyIF9iYikgeyBfX3AgPSBuZXcgVGFibGUoX2ksIF9iYik7IH0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL015R2FtZS9FeGFtcGxlMi9Nb25zdGVyLmphdmEgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9NeUdhbWUvRXhhbXBsZTIvTW9uc3Rlci5qYXZhCmluZGV4IDYzMjNkZWYuLjgwNjUyMTggMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL015R2FtZS9FeGFtcGxlMi9Nb25zdGVyLmphdmEKKysrIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvTXlHYW1lL0V4YW1wbGUyL01vbnN0ZXIuamF2YQpAQCAtOSw3ICs5LDcgQEAKIAogQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpCiBwdWJsaWMgZmluYWwgY2xhc3MgTW9uc3RlciBleHRlbmRzIFRhYmxlIHsKLSAgcHVibGljIHN0YXRpYyB2b2lkIFZhbGlkYXRlVmVyc2lvbigpIHsgQ29uc3RhbnRzLkZMQVRCVUZGRVJTXzJfMF8wKCk7IH0KKyAgcHVibGljIHN0YXRpYyB2b2lkIFZhbGlkYXRlVmVyc2lvbigpIHsgQ29uc3RhbnRzLkZMQVRCVUZGRVJTXzJfMF84KCk7IH0KICAgcHVibGljIHN0YXRpYyBNb25zdGVyIGdldFJvb3RBc01vbnN0ZXIoQnl0ZUJ1ZmZlciBfYmIpIHsgcmV0dXJuIGdldFJvb3RBc01vbnN0ZXIoX2JiLCBuZXcgTW9uc3RlcigpKTsgfQogICBwdWJsaWMgc3RhdGljIE1vbnN0ZXIgZ2V0Um9vdEFzTW9uc3RlcihCeXRlQnVmZmVyIF9iYiwgTW9uc3RlciBvYmopIHsgX2JiLm9yZGVyKEJ5dGVPcmRlci5MSVRUTEVfRU5ESUFOKTsgcmV0dXJuIChvYmouX19hc3NpZ24oX2JiLmdldEludChfYmIucG9zaXRpb24oKSkgKyBfYmIucG9zaXRpb24oKSwgX2JiKSk7IH0KICAgcHVibGljIHZvaWQgX19pbml0KGludCBfaSwgQnl0ZUJ1ZmZlciBfYmIpIHsgX19yZXNldChfaSwgX2JiKTsgfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvTXlHYW1lL0V4YW1wbGUyL01vbnN0ZXIua3QgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9NeUdhbWUvRXhhbXBsZTIvTW9uc3Rlci5rdAppbmRleCA4OGI5ZDA1Li5iNWExNDhmIDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9NeUdhbWUvRXhhbXBsZTIvTW9uc3Rlci5rdAorKysgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9NeUdhbWUvRXhhbXBsZTIvTW9uc3Rlci5rdApAQCAtMTcsNyArMTcsNyBAQAogICAgICAgICByZXR1cm4gdGhpcwogICAgIH0KICAgICBjb21wYW5pb24gb2JqZWN0IHsKLSAgICAgICAgZnVuIHZhbGlkYXRlVmVyc2lvbigpID0gQ29uc3RhbnRzLkZMQVRCVUZGRVJTXzJfMF8wKCkKKyAgICAgICAgZnVuIHZhbGlkYXRlVmVyc2lvbigpID0gQ29uc3RhbnRzLkZMQVRCVUZGRVJTXzJfMF84KCkKICAgICAgICAgZnVuIGdldFJvb3RBc01vbnN0ZXIoX2JiOiBCeXRlQnVmZmVyKTogTW9uc3RlciA9IGdldFJvb3RBc01vbnN0ZXIoX2JiLCBNb25zdGVyKCkpCiAgICAgICAgIGZ1biBnZXRSb290QXNNb25zdGVyKF9iYjogQnl0ZUJ1ZmZlciwgb2JqOiBNb25zdGVyKTogTW9uc3RlciB7CiAgICAgICAgICAgICBfYmIub3JkZXIoQnl0ZU9yZGVyLkxJVFRMRV9FTkRJQU4pCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9NeUdhbWUvRXhhbXBsZTIvTW9uc3Rlci5sdWEgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9NeUdhbWUvRXhhbXBsZTIvTW9uc3Rlci5sdWEKaW5kZXggOWMzMzkwNC4uZGRmNDczOCAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvTXlHYW1lL0V4YW1wbGUyL01vbnN0ZXIubHVhCisrKyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL015R2FtZS9FeGFtcGxlMi9Nb25zdGVyLmx1YQpAQCAtMyw3ICszLDcgQEAKICAgQXV0b21hdGljYWxseSBnZW5lcmF0ZWQgYnkgdGhlIEZsYXRCdWZmZXJzIGNvbXBpbGVyLCBkbyBub3QgbW9kaWZ5LgogICBPciBtb2RpZnkuIEknbSBhIG1lc3NhZ2UsIG5vdCBhIGNvcC4KIAotICBmbGF0YyB2ZXJzaW9uOiAyLjAuNgorICBmbGF0YyB2ZXJzaW9uOiAyLjAuOAogCiAgIERlY2xhcmVkIGJ5ICA6IC8vbW9uc3Rlcl90ZXN0LmZicwogICBSb290aW5nIHR5cGUgOiBNeUdhbWUuRXhhbXBsZS5Nb25zdGVyICgvL21vbnN0ZXJfdGVzdC5mYnMpCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9NeUdhbWUvSW5QYXJlbnROYW1lc3BhY2UuY3MgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9NeUdhbWUvSW5QYXJlbnROYW1lc3BhY2UuY3MKaW5kZXggYjI2NmFhZS4uNjIzN2U3YyAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvTXlHYW1lL0luUGFyZW50TmFtZXNwYWNlLmNzCisrKyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL015R2FtZS9JblBhcmVudE5hbWVzcGFjZS5jcwpAQCAtNywxMyArNywxMyBAQAogCiB1c2luZyBnbG9iYWw6OlN5c3RlbTsKIHVzaW5nIGdsb2JhbDo6U3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Ci11c2luZyBnbG9iYWw6OkZsYXRCdWZmZXJzOwordXNpbmcgZ2xvYmFsOjpHb29nbGUuRmxhdEJ1ZmZlcnM7CiAKIHB1YmxpYyBzdHJ1Y3QgSW5QYXJlbnROYW1lc3BhY2UgOiBJRmxhdGJ1ZmZlck9iamVjdAogewogICBwcml2YXRlIFRhYmxlIF9fcDsKICAgcHVibGljIEJ5dGVCdWZmZXIgQnl0ZUJ1ZmZlciB7IGdldCB7IHJldHVybiBfX3AuYmI7IH0gfQotICBwdWJsaWMgc3RhdGljIHZvaWQgVmFsaWRhdGVWZXJzaW9uKCkgeyBGbGF0QnVmZmVyQ29uc3RhbnRzLkZMQVRCVUZGRVJTXzJfMF8wKCk7IH0KKyAgcHVibGljIHN0YXRpYyB2b2lkIFZhbGlkYXRlVmVyc2lvbigpIHsgRmxhdEJ1ZmZlckNvbnN0YW50cy5GTEFUQlVGRkVSU18yXzBfOCgpOyB9CiAgIHB1YmxpYyBzdGF0aWMgSW5QYXJlbnROYW1lc3BhY2UgR2V0Um9vdEFzSW5QYXJlbnROYW1lc3BhY2UoQnl0ZUJ1ZmZlciBfYmIpIHsgcmV0dXJuIEdldFJvb3RBc0luUGFyZW50TmFtZXNwYWNlKF9iYiwgbmV3IEluUGFyZW50TmFtZXNwYWNlKCkpOyB9CiAgIHB1YmxpYyBzdGF0aWMgSW5QYXJlbnROYW1lc3BhY2UgR2V0Um9vdEFzSW5QYXJlbnROYW1lc3BhY2UoQnl0ZUJ1ZmZlciBfYmIsIEluUGFyZW50TmFtZXNwYWNlIG9iaikgeyByZXR1cm4gKG9iai5fX2Fzc2lnbihfYmIuR2V0SW50KF9iYi5Qb3NpdGlvbikgKyBfYmIuUG9zaXRpb24sIF9iYikpOyB9CiAgIHB1YmxpYyB2b2lkIF9faW5pdChpbnQgX2ksIEJ5dGVCdWZmZXIgX2JiKSB7IF9fcCA9IG5ldyBUYWJsZShfaSwgX2JiKTsgfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvTXlHYW1lL0luUGFyZW50TmFtZXNwYWNlLmphdmEgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9NeUdhbWUvSW5QYXJlbnROYW1lc3BhY2UuamF2YQppbmRleCBhM2U2ODE5Li5jNTI1ZWQ1IDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9NeUdhbWUvSW5QYXJlbnROYW1lc3BhY2UuamF2YQorKysgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9NeUdhbWUvSW5QYXJlbnROYW1lc3BhY2UuamF2YQpAQCAtOSw3ICs5LDcgQEAKIAogQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpCiBwdWJsaWMgZmluYWwgY2xhc3MgSW5QYXJlbnROYW1lc3BhY2UgZXh0ZW5kcyBUYWJsZSB7Ci0gIHB1YmxpYyBzdGF0aWMgdm9pZCBWYWxpZGF0ZVZlcnNpb24oKSB7IENvbnN0YW50cy5GTEFUQlVGRkVSU18yXzBfMCgpOyB9CisgIHB1YmxpYyBzdGF0aWMgdm9pZCBWYWxpZGF0ZVZlcnNpb24oKSB7IENvbnN0YW50cy5GTEFUQlVGRkVSU18yXzBfOCgpOyB9CiAgIHB1YmxpYyBzdGF0aWMgSW5QYXJlbnROYW1lc3BhY2UgZ2V0Um9vdEFzSW5QYXJlbnROYW1lc3BhY2UoQnl0ZUJ1ZmZlciBfYmIpIHsgcmV0dXJuIGdldFJvb3RBc0luUGFyZW50TmFtZXNwYWNlKF9iYiwgbmV3IEluUGFyZW50TmFtZXNwYWNlKCkpOyB9CiAgIHB1YmxpYyBzdGF0aWMgSW5QYXJlbnROYW1lc3BhY2UgZ2V0Um9vdEFzSW5QYXJlbnROYW1lc3BhY2UoQnl0ZUJ1ZmZlciBfYmIsIEluUGFyZW50TmFtZXNwYWNlIG9iaikgeyBfYmIub3JkZXIoQnl0ZU9yZGVyLkxJVFRMRV9FTkRJQU4pOyByZXR1cm4gKG9iai5fX2Fzc2lnbihfYmIuZ2V0SW50KF9iYi5wb3NpdGlvbigpKSArIF9iYi5wb3NpdGlvbigpLCBfYmIpKTsgfQogICBwdWJsaWMgdm9pZCBfX2luaXQoaW50IF9pLCBCeXRlQnVmZmVyIF9iYikgeyBfX3Jlc2V0KF9pLCBfYmIpOyB9CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9NeUdhbWUvSW5QYXJlbnROYW1lc3BhY2Uua3QgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9NeUdhbWUvSW5QYXJlbnROYW1lc3BhY2Uua3QKaW5kZXggYmViNDE0YS4uN2JlZDA1OCAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvTXlHYW1lL0luUGFyZW50TmFtZXNwYWNlLmt0CisrKyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL015R2FtZS9JblBhcmVudE5hbWVzcGFjZS5rdApAQCAtMTcsNyArMTcsNyBAQAogICAgICAgICByZXR1cm4gdGhpcwogICAgIH0KICAgICBjb21wYW5pb24gb2JqZWN0IHsKLSAgICAgICAgZnVuIHZhbGlkYXRlVmVyc2lvbigpID0gQ29uc3RhbnRzLkZMQVRCVUZGRVJTXzJfMF8wKCkKKyAgICAgICAgZnVuIHZhbGlkYXRlVmVyc2lvbigpID0gQ29uc3RhbnRzLkZMQVRCVUZGRVJTXzJfMF84KCkKICAgICAgICAgZnVuIGdldFJvb3RBc0luUGFyZW50TmFtZXNwYWNlKF9iYjogQnl0ZUJ1ZmZlcik6IEluUGFyZW50TmFtZXNwYWNlID0gZ2V0Um9vdEFzSW5QYXJlbnROYW1lc3BhY2UoX2JiLCBJblBhcmVudE5hbWVzcGFjZSgpKQogICAgICAgICBmdW4gZ2V0Um9vdEFzSW5QYXJlbnROYW1lc3BhY2UoX2JiOiBCeXRlQnVmZmVyLCBvYmo6IEluUGFyZW50TmFtZXNwYWNlKTogSW5QYXJlbnROYW1lc3BhY2UgewogICAgICAgICAgICAgX2JiLm9yZGVyKEJ5dGVPcmRlci5MSVRUTEVfRU5ESUFOKQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvTXlHYW1lL0luUGFyZW50TmFtZXNwYWNlLmx1YSBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL015R2FtZS9JblBhcmVudE5hbWVzcGFjZS5sdWEKaW5kZXggODExMmMyNS4uOTExNTY2NiAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvTXlHYW1lL0luUGFyZW50TmFtZXNwYWNlLmx1YQorKysgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9NeUdhbWUvSW5QYXJlbnROYW1lc3BhY2UubHVhCkBAIC0zLDcgKzMsNyBAQAogICBBdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBieSB0aGUgRmxhdEJ1ZmZlcnMgY29tcGlsZXIsIGRvIG5vdCBtb2RpZnkuCiAgIE9yIG1vZGlmeS4gSSdtIGEgbWVzc2FnZSwgbm90IGEgY29wLgogCi0gIGZsYXRjIHZlcnNpb246IDIuMC42CisgIGZsYXRjIHZlcnNpb246IDIuMC44CiAKICAgRGVjbGFyZWQgYnkgIDogLy9tb25zdGVyX3Rlc3QuZmJzCiAgIFJvb3RpbmcgdHlwZSA6IE15R2FtZS5FeGFtcGxlLk1vbnN0ZXIgKC8vbW9uc3Rlcl90ZXN0LmZicykKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL015R2FtZS9Nb25zdGVyRXh0cmEuY3MgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9NeUdhbWUvTW9uc3RlckV4dHJhLmNzCmluZGV4IDZhZjk5MzIuLjAyMzY4NTYgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL015R2FtZS9Nb25zdGVyRXh0cmEuY3MKKysrIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvTXlHYW1lL01vbnN0ZXJFeHRyYS5jcwpAQCAtNywxMyArNywxMyBAQAogCiB1c2luZyBnbG9iYWw6OlN5c3RlbTsKIHVzaW5nIGdsb2JhbDo6U3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Ci11c2luZyBnbG9iYWw6OkZsYXRCdWZmZXJzOwordXNpbmcgZ2xvYmFsOjpHb29nbGUuRmxhdEJ1ZmZlcnM7CiAKIHB1YmxpYyBzdHJ1Y3QgTW9uc3RlckV4dHJhIDogSUZsYXRidWZmZXJPYmplY3QKIHsKICAgcHJpdmF0ZSBUYWJsZSBfX3A7CiAgIHB1YmxpYyBCeXRlQnVmZmVyIEJ5dGVCdWZmZXIgeyBnZXQgeyByZXR1cm4gX19wLmJiOyB9IH0KLSAgcHVibGljIHN0YXRpYyB2b2lkIFZhbGlkYXRlVmVyc2lvbigpIHsgRmxhdEJ1ZmZlckNvbnN0YW50cy5GTEFUQlVGRkVSU18yXzBfMCgpOyB9CisgIHB1YmxpYyBzdGF0aWMgdm9pZCBWYWxpZGF0ZVZlcnNpb24oKSB7IEZsYXRCdWZmZXJDb25zdGFudHMuRkxBVEJVRkZFUlNfMl8wXzgoKTsgfQogICBwdWJsaWMgc3RhdGljIE1vbnN0ZXJFeHRyYSBHZXRSb290QXNNb25zdGVyRXh0cmEoQnl0ZUJ1ZmZlciBfYmIpIHsgcmV0dXJuIEdldFJvb3RBc01vbnN0ZXJFeHRyYShfYmIsIG5ldyBNb25zdGVyRXh0cmEoKSk7IH0KICAgcHVibGljIHN0YXRpYyBNb25zdGVyRXh0cmEgR2V0Um9vdEFzTW9uc3RlckV4dHJhKEJ5dGVCdWZmZXIgX2JiLCBNb25zdGVyRXh0cmEgb2JqKSB7IHJldHVybiAob2JqLl9fYXNzaWduKF9iYi5HZXRJbnQoX2JiLlBvc2l0aW9uKSArIF9iYi5Qb3NpdGlvbiwgX2JiKSk7IH0KICAgcHVibGljIHN0YXRpYyBib29sIE1vbnN0ZXJFeHRyYUJ1ZmZlckhhc0lkZW50aWZpZXIoQnl0ZUJ1ZmZlciBfYmIpIHsgcmV0dXJuIFRhYmxlLl9faGFzX2lkZW50aWZpZXIoX2JiLCAiTU9ORSIpOyB9CkBAIC05MiwxMCArOTIsMTQgQEAKICAgcHVibGljIHN0YXRpYyB2b2lkIEFkZER2ZWMoRmxhdEJ1ZmZlckJ1aWxkZXIgYnVpbGRlciwgVmVjdG9yT2Zmc2V0IGR2ZWNPZmZzZXQpIHsgYnVpbGRlci5BZGRPZmZzZXQoOCwgZHZlY09mZnNldC5WYWx1ZSwgMCk7IH0KICAgcHVibGljIHN0YXRpYyBWZWN0b3JPZmZzZXQgQ3JlYXRlRHZlY1ZlY3RvcihGbGF0QnVmZmVyQnVpbGRlciBidWlsZGVyLCBkb3VibGVbXSBkYXRhKSB7IGJ1aWxkZXIuU3RhcnRWZWN0b3IoOCwgZGF0YS5MZW5ndGgsIDgpOyBmb3IgKGludCBpID0gZGF0YS5MZW5ndGggLSAxOyBpID49IDA7IGktLSkgYnVpbGRlci5BZGREb3VibGUoZGF0YVtpXSk7IHJldHVybiBidWlsZGVyLkVuZFZlY3RvcigpOyB9CiAgIHB1YmxpYyBzdGF0aWMgVmVjdG9yT2Zmc2V0IENyZWF0ZUR2ZWNWZWN0b3JCbG9jayhGbGF0QnVmZmVyQnVpbGRlciBidWlsZGVyLCBkb3VibGVbXSBkYXRhKSB7IGJ1aWxkZXIuU3RhcnRWZWN0b3IoOCwgZGF0YS5MZW5ndGgsIDgpOyBidWlsZGVyLkFkZChkYXRhKTsgcmV0dXJuIGJ1aWxkZXIuRW5kVmVjdG9yKCk7IH0KKyAgcHVibGljIHN0YXRpYyBWZWN0b3JPZmZzZXQgQ3JlYXRlRHZlY1ZlY3RvckJsb2NrKEZsYXRCdWZmZXJCdWlsZGVyIGJ1aWxkZXIsIEFycmF5U2VnbWVudDxkb3VibGU+IGRhdGEpIHsgYnVpbGRlci5TdGFydFZlY3Rvcig4LCBkYXRhLkNvdW50LCA4KTsgYnVpbGRlci5BZGQoZGF0YSk7IHJldHVybiBidWlsZGVyLkVuZFZlY3RvcigpOyB9CisgIHB1YmxpYyBzdGF0aWMgVmVjdG9yT2Zmc2V0IENyZWF0ZUR2ZWNWZWN0b3JCbG9jayhGbGF0QnVmZmVyQnVpbGRlciBidWlsZGVyLCBJbnRQdHIgZGF0YVB0ciwgaW50IHNpemVJbkJ5dGVzKSB7IGJ1aWxkZXIuU3RhcnRWZWN0b3IoMSwgc2l6ZUluQnl0ZXMsIDEpOyBidWlsZGVyLkFkZDxkb3VibGU+KGRhdGFQdHIsIHNpemVJbkJ5dGVzKTsgcmV0dXJuIGJ1aWxkZXIuRW5kVmVjdG9yKCk7IH0KICAgcHVibGljIHN0YXRpYyB2b2lkIFN0YXJ0RHZlY1ZlY3RvcihGbGF0QnVmZmVyQnVpbGRlciBidWlsZGVyLCBpbnQgbnVtRWxlbXMpIHsgYnVpbGRlci5TdGFydFZlY3Rvcig4LCBudW1FbGVtcywgOCk7IH0KICAgcHVibGljIHN0YXRpYyB2b2lkIEFkZEZ2ZWMoRmxhdEJ1ZmZlckJ1aWxkZXIgYnVpbGRlciwgVmVjdG9yT2Zmc2V0IGZ2ZWNPZmZzZXQpIHsgYnVpbGRlci5BZGRPZmZzZXQoOSwgZnZlY09mZnNldC5WYWx1ZSwgMCk7IH0KICAgcHVibGljIHN0YXRpYyBWZWN0b3JPZmZzZXQgQ3JlYXRlRnZlY1ZlY3RvcihGbGF0QnVmZmVyQnVpbGRlciBidWlsZGVyLCBmbG9hdFtdIGRhdGEpIHsgYnVpbGRlci5TdGFydFZlY3Rvcig0LCBkYXRhLkxlbmd0aCwgNCk7IGZvciAoaW50IGkgPSBkYXRhLkxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSBidWlsZGVyLkFkZEZsb2F0KGRhdGFbaV0pOyByZXR1cm4gYnVpbGRlci5FbmRWZWN0b3IoKTsgfQogICBwdWJsaWMgc3RhdGljIFZlY3Rvck9mZnNldCBDcmVhdGVGdmVjVmVjdG9yQmxvY2soRmxhdEJ1ZmZlckJ1aWxkZXIgYnVpbGRlciwgZmxvYXRbXSBkYXRhKSB7IGJ1aWxkZXIuU3RhcnRWZWN0b3IoNCwgZGF0YS5MZW5ndGgsIDQpOyBidWlsZGVyLkFkZChkYXRhKTsgcmV0dXJuIGJ1aWxkZXIuRW5kVmVjdG9yKCk7IH0KKyAgcHVibGljIHN0YXRpYyBWZWN0b3JPZmZzZXQgQ3JlYXRlRnZlY1ZlY3RvckJsb2NrKEZsYXRCdWZmZXJCdWlsZGVyIGJ1aWxkZXIsIEFycmF5U2VnbWVudDxmbG9hdD4gZGF0YSkgeyBidWlsZGVyLlN0YXJ0VmVjdG9yKDQsIGRhdGEuQ291bnQsIDQpOyBidWlsZGVyLkFkZChkYXRhKTsgcmV0dXJuIGJ1aWxkZXIuRW5kVmVjdG9yKCk7IH0KKyAgcHVibGljIHN0YXRpYyBWZWN0b3JPZmZzZXQgQ3JlYXRlRnZlY1ZlY3RvckJsb2NrKEZsYXRCdWZmZXJCdWlsZGVyIGJ1aWxkZXIsIEludFB0ciBkYXRhUHRyLCBpbnQgc2l6ZUluQnl0ZXMpIHsgYnVpbGRlci5TdGFydFZlY3RvcigxLCBzaXplSW5CeXRlcywgMSk7IGJ1aWxkZXIuQWRkPGZsb2F0PihkYXRhUHRyLCBzaXplSW5CeXRlcyk7IHJldHVybiBidWlsZGVyLkVuZFZlY3RvcigpOyB9CiAgIHB1YmxpYyBzdGF0aWMgdm9pZCBTdGFydEZ2ZWNWZWN0b3IoRmxhdEJ1ZmZlckJ1aWxkZXIgYnVpbGRlciwgaW50IG51bUVsZW1zKSB7IGJ1aWxkZXIuU3RhcnRWZWN0b3IoNCwgbnVtRWxlbXMsIDQpOyB9CiAgIHB1YmxpYyBzdGF0aWMgT2Zmc2V0PE15R2FtZS5Nb25zdGVyRXh0cmE+IEVuZE1vbnN0ZXJFeHRyYShGbGF0QnVmZmVyQnVpbGRlciBidWlsZGVyKSB7CiAgICAgaW50IG8gPSBidWlsZGVyLkVuZFRhYmxlKCk7CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9NeUdhbWUvTW9uc3RlckV4dHJhLmphdmEgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9NeUdhbWUvTW9uc3RlckV4dHJhLmphdmEKaW5kZXggYTJjMzQyZC4uZmRhZjQwYiAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvTXlHYW1lL01vbnN0ZXJFeHRyYS5qYXZhCisrKyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL015R2FtZS9Nb25zdGVyRXh0cmEuamF2YQpAQCAtOSw3ICs5LDcgQEAKIAogQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpCiBwdWJsaWMgZmluYWwgY2xhc3MgTW9uc3RlckV4dHJhIGV4dGVuZHMgVGFibGUgewotICBwdWJsaWMgc3RhdGljIHZvaWQgVmFsaWRhdGVWZXJzaW9uKCkgeyBDb25zdGFudHMuRkxBVEJVRkZFUlNfMl8wXzAoKTsgfQorICBwdWJsaWMgc3RhdGljIHZvaWQgVmFsaWRhdGVWZXJzaW9uKCkgeyBDb25zdGFudHMuRkxBVEJVRkZFUlNfMl8wXzgoKTsgfQogICBwdWJsaWMgc3RhdGljIE1vbnN0ZXJFeHRyYSBnZXRSb290QXNNb25zdGVyRXh0cmEoQnl0ZUJ1ZmZlciBfYmIpIHsgcmV0dXJuIGdldFJvb3RBc01vbnN0ZXJFeHRyYShfYmIsIG5ldyBNb25zdGVyRXh0cmEoKSk7IH0KICAgcHVibGljIHN0YXRpYyBNb25zdGVyRXh0cmEgZ2V0Um9vdEFzTW9uc3RlckV4dHJhKEJ5dGVCdWZmZXIgX2JiLCBNb25zdGVyRXh0cmEgb2JqKSB7IF9iYi5vcmRlcihCeXRlT3JkZXIuTElUVExFX0VORElBTik7IHJldHVybiAob2JqLl9fYXNzaWduKF9iYi5nZXRJbnQoX2JiLnBvc2l0aW9uKCkpICsgX2JiLnBvc2l0aW9uKCksIF9iYikpOyB9CiAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBNb25zdGVyRXh0cmFCdWZmZXJIYXNJZGVudGlmaWVyKEJ5dGVCdWZmZXIgX2JiKSB7IHJldHVybiBfX2hhc19pZGVudGlmaWVyKF9iYiwgIk1PTkUiKTsgfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvTXlHYW1lL01vbnN0ZXJFeHRyYS5rdCBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL015R2FtZS9Nb25zdGVyRXh0cmEua3QKaW5kZXggZjIyMjY0Ny4uM2M4NzYwYyAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvTXlHYW1lL01vbnN0ZXJFeHRyYS5rdAorKysgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9NeUdhbWUvTW9uc3RlckV4dHJhLmt0CkBAIC0xNzUsNyArMTc1LDcgQEAKICAgICAgICAgfQogICAgIH0KICAgICBjb21wYW5pb24gb2JqZWN0IHsKLSAgICAgICAgZnVuIHZhbGlkYXRlVmVyc2lvbigpID0gQ29uc3RhbnRzLkZMQVRCVUZGRVJTXzJfMF8wKCkKKyAgICAgICAgZnVuIHZhbGlkYXRlVmVyc2lvbigpID0gQ29uc3RhbnRzLkZMQVRCVUZGRVJTXzJfMF84KCkKICAgICAgICAgZnVuIGdldFJvb3RBc01vbnN0ZXJFeHRyYShfYmI6IEJ5dGVCdWZmZXIpOiBNb25zdGVyRXh0cmEgPSBnZXRSb290QXNNb25zdGVyRXh0cmEoX2JiLCBNb25zdGVyRXh0cmEoKSkKICAgICAgICAgZnVuIGdldFJvb3RBc01vbnN0ZXJFeHRyYShfYmI6IEJ5dGVCdWZmZXIsIG9iajogTW9uc3RlckV4dHJhKTogTW9uc3RlckV4dHJhIHsKICAgICAgICAgICAgIF9iYi5vcmRlcihCeXRlT3JkZXIuTElUVExFX0VORElBTikKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL015R2FtZS9PdGhlck5hbWVTcGFjZS9Gcm9tSW5jbHVkZS5sdWEgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9NeUdhbWUvT3RoZXJOYW1lU3BhY2UvRnJvbUluY2x1ZGUubHVhCmluZGV4IDJjMmJmMGEuLjY0ZDg5NGUgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL015R2FtZS9PdGhlck5hbWVTcGFjZS9Gcm9tSW5jbHVkZS5sdWEKKysrIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvTXlHYW1lL090aGVyTmFtZVNwYWNlL0Zyb21JbmNsdWRlLmx1YQpAQCAtMyw3ICszLDcgQEAKICAgQXV0b21hdGljYWxseSBnZW5lcmF0ZWQgYnkgdGhlIEZsYXRCdWZmZXJzIGNvbXBpbGVyLCBkbyBub3QgbW9kaWZ5LgogICBPciBtb2RpZnkuIEknbSBhIG1lc3NhZ2UsIG5vdCBhIGNvcC4KIAotICBmbGF0YyB2ZXJzaW9uOiAyLjAuNgorICBmbGF0YyB2ZXJzaW9uOiAyLjAuOAogCiAgIERlY2xhcmVkIGJ5ICA6IC8vaW5jbHVkZV90ZXN0L3N1Yi9pbmNsdWRlX3Rlc3QyLmZicwogICBSb290aW5nIHR5cGUgOiBNeUdhbWUuRXhhbXBsZS5Nb25zdGVyICgvL21vbnN0ZXJfdGVzdC5mYnMpCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9NeUdhbWUvT3RoZXJOYW1lU3BhY2UvVGFibGVCLmx1YSBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL015R2FtZS9PdGhlck5hbWVTcGFjZS9UYWJsZUIubHVhCmluZGV4IGJmYThiMDMuLjFmNzZjODggMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL015R2FtZS9PdGhlck5hbWVTcGFjZS9UYWJsZUIubHVhCisrKyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL015R2FtZS9PdGhlck5hbWVTcGFjZS9UYWJsZUIubHVhCkBAIC0zLDcgKzMsNyBAQAogICBBdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBieSB0aGUgRmxhdEJ1ZmZlcnMgY29tcGlsZXIsIGRvIG5vdCBtb2RpZnkuCiAgIE9yIG1vZGlmeS4gSSdtIGEgbWVzc2FnZSwgbm90IGEgY29wLgogCi0gIGZsYXRjIHZlcnNpb246IDIuMC42CisgIGZsYXRjIHZlcnNpb246IDIuMC44CiAKICAgRGVjbGFyZWQgYnkgIDogLy9pbmNsdWRlX3Rlc3Qvc3ViL2luY2x1ZGVfdGVzdDIuZmJzCiAgIFJvb3RpbmcgdHlwZSA6IE15R2FtZS5FeGFtcGxlLk1vbnN0ZXIgKC8vbW9uc3Rlcl90ZXN0LmZicykKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL015R2FtZS9PdGhlck5hbWVTcGFjZS9VbnVzZWQubHVhIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvTXlHYW1lL090aGVyTmFtZVNwYWNlL1VudXNlZC5sdWEKaW5kZXggMjc2OTYyNS4uMTU1YTA0ZSAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvTXlHYW1lL090aGVyTmFtZVNwYWNlL1VudXNlZC5sdWEKKysrIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvTXlHYW1lL090aGVyTmFtZVNwYWNlL1VudXNlZC5sdWEKQEAgLTMsNyArMyw3IEBACiAgIEF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGJ5IHRoZSBGbGF0QnVmZmVycyBjb21waWxlciwgZG8gbm90IG1vZGlmeS4KICAgT3IgbW9kaWZ5LiBJJ20gYSBtZXNzYWdlLCBub3QgYSBjb3AuCiAKLSAgZmxhdGMgdmVyc2lvbjogMi4wLjYKKyAgZmxhdGMgdmVyc2lvbjogMi4wLjgKIAogICBEZWNsYXJlZCBieSAgOiAvL2luY2x1ZGVfdGVzdC9zdWIvaW5jbHVkZV90ZXN0Mi5mYnMKICAgUm9vdGluZyB0eXBlIDogTXlHYW1lLkV4YW1wbGUuTW9uc3RlciAoLy9tb25zdGVyX3Rlc3QuZmJzKQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvVGFibGVBLmx1YSBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL1RhYmxlQS5sdWEKaW5kZXggOTBiOWM5NS4uMzEyZjgyZCAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvVGFibGVBLmx1YQorKysgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9UYWJsZUEubHVhCkBAIC0zLDcgKzMsNyBAQAogICBBdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBieSB0aGUgRmxhdEJ1ZmZlcnMgY29tcGlsZXIsIGRvIG5vdCBtb2RpZnkuCiAgIE9yIG1vZGlmeS4gSSdtIGEgbWVzc2FnZSwgbm90IGEgY29wLgogCi0gIGZsYXRjIHZlcnNpb246IDIuMC42CisgIGZsYXRjIHZlcnNpb246IDIuMC44CiAKICAgRGVjbGFyZWQgYnkgIDogLy9pbmNsdWRlX3Rlc3QvaW5jbHVkZV90ZXN0MS5mYnMKICAgUm9vdGluZyB0eXBlIDogTXlHYW1lLkV4YW1wbGUuTW9uc3RlciAoLy9tb25zdGVyX3Rlc3QuZmJzKQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvVGVzdEFsbC5zaCBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL1Rlc3RBbGwuc2gKaW5kZXggMDY1NDhhMi4uM2EzZmNkNyAxMDA3NTUKLS0tIGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvVGVzdEFsbC5zaAorKysgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9UZXN0QWxsLnNoCkBAIC0xNiw3ICsxNiw3IEBACiAKIGVjaG8gIioqKioqKioqKioqKioqKioqKioqKioqKiBUeXBlU2NyaXB0OiIKIAotc2ggVHlwZVNjcmlwdFRlc3Quc2gKK3B5dGhvbjMgVHlwZVNjcmlwdFRlc3QucHkKIAogZWNobyAiKioqKioqKioqKioqKioqKioqKioqKioqIEMrKzoiCiAKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL1R5cGVTY3JpcHRUZXN0LmJhdCBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL1R5cGVTY3JpcHRUZXN0LmJhdApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZGFhNTQ1MS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9UeXBlU2NyaXB0VGVzdC5iYXQKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLW5wbSBpbnN0YWxsCi0uLi9mbGF0Yy5leGUgLS10cyAtLWdlbi1uYW1lLXN0cmluZ3MgLS1nZW4tbXV0YWJsZSAtLWdlbi1vYmplY3QtYXBpIC1JIGluY2x1ZGVfdGVzdCBtb25zdGVyX3Rlc3QuZmJzCi0uLi9mbGF0Yy5leGUgLS1nZW4tb2JqZWN0LWFwaSAtYiAtSSBpbmNsdWRlX3Rlc3QgbW9uc3Rlcl90ZXN0LmZicyB1bmljb2RlX3Rlc3QuanNvbgotLi4vZmxhdGMuZXhlIC0tdHMgLS1nZW4tbmFtZS1zdHJpbmdzIC0tZ2VuLW11dGFibGUgLS1nZW4tb2JqZWN0LWFwaSAtbyB1bmlvbl92ZWN0b3IgdW5pb25fdmVjdG9yL3VuaW9uX3ZlY3Rvci5mYnMKLS4uL2ZsYXRjLmV4ZSAtLXRzIC0tZ2VuLW5hbWUtc3RyaW5ncyBvcHRpb25hbF9zY2FsYXJzLmZicwotdHNjCi1ub2RlIC1yIGVzbSBKYXZhU2NyaXB0VGVzdAotbm9kZSAtciBlc20gSmF2YVNjcmlwdFVuaW9uVmVjdG9yVGVzdAotbm9kZSAtciBlc20gSmF2YVNjcmlwdEZsZXhCdWZmZXJzVGVzdApkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvVHlwZVNjcmlwdFRlc3Quc2ggYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9UeXBlU2NyaXB0VGVzdC5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZmQ3YjgyZC4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9UeXBlU2NyaXB0VGVzdC5zaAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLSMhL2Jpbi9zaAotIwotIyBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotIwotIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0jIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0jIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0jIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1zZXQgLWUKLQotIyBjbGVhbiBub2RlX21vZHVsZXMgdG8gbWFrZSBzdXJlIHdlIGRlcGVuZCBvbiBsYXRlc3QgbG9jYWwgZmxhdGJ1ZmZlcnMgYXQgLi4vCi1ybSAtcmYgbm9kZV9tb2R1bGVzCi1ucG0gaW5zdGFsbAotCi1pZiBbIC14IC4uL2ZsYXRjIF07IHRoZW4KLSAgICAuLi9mbGF0YyAtLXRzIC0tZ2VuLW5hbWUtc3RyaW5ncyAtLWdlbi1tdXRhYmxlIC0tZ2VuLW9iamVjdC1hcGkgLUkgaW5jbHVkZV90ZXN0IG1vbnN0ZXJfdGVzdC5mYnMKLSAgICAuLi9mbGF0YyAtLWdlbi1vYmplY3QtYXBpIC1iIC1JIGluY2x1ZGVfdGVzdCBtb25zdGVyX3Rlc3QuZmJzIHVuaWNvZGVfdGVzdC5qc29uCi0gICAgLi4vZmxhdGMgLS10cyAtLWdlbi1uYW1lLXN0cmluZ3MgLS1nZW4tbXV0YWJsZSAtLWdlbi1vYmplY3QtYXBpIC1vIHVuaW9uX3ZlY3RvciB1bmlvbl92ZWN0b3IvdW5pb25fdmVjdG9yLmZicwotICAgIC4uL2ZsYXRjIC0tdHMgLS1nZW4tbmFtZS1zdHJpbmdzIG9wdGlvbmFsX3NjYWxhcnMuZmJzCi0gICAgLi4vZmxhdGMgLS10cyAtLWdlbi1uYW1lLXN0cmluZ3MgLS1nZW4tb2JqZWN0LWFwaSAtLWdlbi1tdXRhYmxlIC1JIC4uLyAuL3R5cGVzY3JpcHRfa2V5d29yZHMuZmJzIHRlc3RfZGlyL3R5cGVzY3JpcHRfaW5jbHVkZS5mYnMgdGVzdF9kaXIvdHlwZXNjcmlwdF90cmFuc2l0aXZlX2luY2x1ZGUuZmJzIC4uL3JlZmxlY3Rpb24vcmVmbGVjdGlvbi5mYnMKLSAgICAuLi9mbGF0YyAtLXRzIC0tZ2VuLW5hbWUtc3RyaW5ncyAtLWdlbi1vYmplY3QtYXBpIC0tZ2VuLW11dGFibGUgLS10cy1mbGF0LWZpbGVzIC1JIC4uLyAuL3R5cGVzY3JpcHRfa2V5d29yZHMuZmJzIHRlc3RfZGlyL3R5cGVzY3JpcHRfaW5jbHVkZS5mYnMgdGVzdF9kaXIvdHlwZXNjcmlwdF90cmFuc2l0aXZlX2luY2x1ZGUuZmJzIC4uL3JlZmxlY3Rpb24vcmVmbGVjdGlvbi5mYnMKLWZpCi10c2MKLW5vZGUgLXIgZXNtIEphdmFTY3JpcHRUZXN0Ci1ub2RlIC1yIGVzbSBKYXZhU2NyaXB0VW5pb25WZWN0b3JUZXN0Ci1ub2RlIC1yIGVzbSBKYXZhU2NyaXB0RmxleEJ1ZmZlcnNUZXN0CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9hbm5vdGF0ZWRfYmluYXJ5L1JFQURNRS5tZCBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL2Fubm90YXRlZF9iaW5hcnkvUkVBRE1FLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBjYjA0NjEKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9hbm5vdGF0ZWRfYmluYXJ5L1JFQURNRS5tZApAQCAtMCwwICsxLDEwMSBAQAorIyBBbm5vdGF0ZWQgRmxhdGJ1ZmZlciBCaW5hcnkKKworVGhpcyBkaXJlY3RvcnkgZGVtb25zdHJhdGVzIHRoZSBhYmlsaXR5IG9mIGZsYXRjIHRvIGFubm90YXRlIGJpbmFyeSBmbGF0YnVmZmVycyAKK3dpdGggaGVscGZ1bCBhbm5vdGF0aW9ucy4gVGhlIHJlc3VsdGluZyBhbm5vdGF0ZWQgZmxhdGJ1ZmZlciBiaW5hcnkgKGFmYikKK2NvbnRhaW5zIGFsbCB0aGUgYmluYXJ5IGRhdGEgd2l0aCBsaW5lLWJ5LWxpbmUgYW5ub3RhdGlvbnMuCisKKyMjIFVzYWdlCisKK0dpdmVuIGEgYHNjaGVtYWAgaW4gZWl0aGVyIHBsYWluLXRleHQgKC5mYnMpIG9yIGFscmVhZHkgY29tcGlsZWQgdG8gYSBiaW5hcnkKK3NjaGVtYSAoLmJmYnMpIGFuZCBgYmluYXJ5YCBmaWxlKHMpIHRoYXQgd2FzIGNyZWF0ZWQgYnkgdGhlIGBzY2hlbWFgLgorCitgYGBzaAorZmxhdGMgLS1hbm5vdGF0ZSB7c2NoZW1hX2ZpbGV9IC0tIHtiaW5hcnlfZmlsZX0uLi4KK2BgYAorCisjIyMgRXhhbXBsZQorCitUaGUgZm9sbG93aW5nIGNvbW1hbmQgc2hvdWxkIHByb2R1Y2UgYGFubm90YXRlZF9iaW5hcnkuYWZiYCBpbiB0aGlzIGRpcmVjdG9yeToKKworYGBgc2gKK2NkIHRlc3RzXGFubm90YXRlZF9iaW5hcnkKKy4uXC4uXGZsYXRjIC0tYW5ub3RhdGUgYW5ub3RhdGVkX2JpbmFyeS5mYnMgLS0gYW5ub3RhdGVkX2JpbmFyeS5iaW4KK2BgYAorCitUaGUgYGFubm90YXRlZF9iaW5hcnkuYmluYCBpcyB0aGUgZmxhdGJ1ZmVyIGJpbmFyeSBvZiB0aGUgZGF0YSBjb250YWluZWQgd2l0aGluCisgYGFubm90YXRlZF9iaW5hcnkuanNvbmAsIHdoaWNoIHdhcyBtYWRlIGJ5IHRoZSBmb2xsb3dpbmcgY29tbWFuZDoKKworYGBgc2gKKy4uXC4uXGZsYXRjIC1iIGFubm90YXRlZF9iaW5hcnkuZmJzIGFubm90YXRlZF9iaW5hcnkuanNvbgorYGBgCisKKyMjIFRleHQgRm9ybWF0CisKK0N1cnJlbnRseSB0aGVyZSBpcyBhIGJ1aWx0LWluIHRleHQtYmFzZWQgZm9ybWF0IGZvciBvdXRwdXR0aW5nIHRoZSBhbm5vdGF0aW9ucy4KK1RoZSBgYW5ub3RhdGVkX2JpbmFyeS5hZmJgIGlzIGFuIGV4YW1wbGUgb2YgdGhlIHRleHQgZm9ybWF0IG9mIGEgYmluYXJ5CitgYW5ub3RhdGVkX2JpbmFyeS5iaW5gIGFuZCB0aGUgYGFubm90YXRlZF9iaW5hcnkuZmJzYCAob3IgCitgYW5ub3RhdGVkX2JpbmFyeS5iZmJzYCkgc2NoZW1hLgorCitUaGUgZmlsZSBpcyBvcmRlcmVkIGluIGluY3JlYXNpbmcgdGhlIG9mZnNldHMgZnJvbSB0aGUgYmVnaW5uaW5nIG9mIHRoZSBiaW5hcnkuCitUaGUgb2Zmc2V0IGlzIHRoZSAxc3QgY29sdW1uLCBleHByZXNzZWQgaW4gaGV4YWRlY2ltYWwgZm9ybWF0IChlLmcuIGArMHgwMDNjYCkuCisKKyMjIyBCaW5hcnkgU2VjdGlvbnMKKworQmluYXJ5IHNlY3Rpb25zIGFyZSBjb21wcmlzZWQgb2YgY29udGlnaW91cyBbYmluYXJ5IHJlZ2lvbnNdKCNiaW5hcnktcmVnaW9ucykgCit0aGF0IGFyZSBsb2dpY2FsbHkgZ3JvdXBlZCB0b2dldGhlci4gRm9yIGV4YW1wbGUsIGEgYmluYXJ5IHNlY3Rpb24gbWF5IGJlIGEKK3NpbmdsZSBpbnN0YW5jZSBvZiBhIGZsYXRidWZmZXIgYFRhYmxlYCBvciBpdHMgYHZ0YWJsZWAuIFRoZSBzZWN0aW9ucyBtYXkgYmUgCitsYWJlbGxlZCB3aXRoIHRoZSBuYW1lIG9mIHRoZSBhc3NvY2lhdGVkIHR5cGUsIGFzIGRlZmluZWQgaW4gdGhlIGlucHV0IHNjaGVtYS4KKworRXhhbXBsZSBvZiBhIGB2dGFibGVgIEJpbmFyeSBTZWN0aW9uIHRoYXQgaXMgYXNzb2NpYXRlZCB3aXRoIHRoZSB1c2VyLWRlZmluZWQKK2BBbm5vdGF0ZUJpbmFyeS5CYXJgIHRhYmxlLgorCitgYGAKK3Z0YWJsZSAoQW5ub3RhdGVkQmluYXJ5LkJhcik6CisgICsweDAwQTAgfCAwOCAwMCAgICAgICAgICAgICAgICAgICB8IHVpbnQxNl90ICAgfCAweDAwMDggKDgpICAgICAgICAgICAgICAgICAgICAgICAgIHwgc2l6ZSBvZiB0aGlzIHZ0YWJsZQorICArMHgwMEEyIHwgMTMgMDAgICAgICAgICAgICAgICAgICAgfCB1aW50MTZfdCAgIHwgMHgwMDEzICgxOSkgICAgICAgICAgICAgICAgICAgICAgICB8IHNpemUgb2YgcmVmZXJyaW5nIHRhYmxlCisgICsweDAwQTQgfCAwOCAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgfCAweDAwMDggKDgpICAgICAgICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBhYCAoaWQ6IDApCisgICsweDAwQTYgfCAwNCAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgfCAweDAwMDQgKDQpICAgICAgICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBiYCAoaWQ6IDEpCitgYGAKKworIyMjIEJpbmFyeSBSZWdpb25zCisKK0JpbmFyeSByZWdpb25zIGFyZSBjb250aWdpb3VzIGJ5dGVzIHJlZ2lvbnMgdGhhdCBhcmUgZ3JvdXBlZCB0b2dldGhlciB0byBmb3JtIAorc29tZSBzb3J0IG9mIHZhbHVlLCBlLmcuIGEgYHNjYWxhcmAgb3IgYW4gYXJyYXkgb2Ygc2NhbGFycy4gQSBiaW5hcnkgcmVnaW9uIG1heQorYmUgc3BsaXQgdXAgb3ZlciBtdWx0aXBsZSB0ZXh0IGxpbmVzLCBpZiB0aGUgc2l6ZSBvZiB0aGUgcmVnaW9uIGlzIGxhcmdlLgorCitMb29raW5nIGF0IGFuIGV4YW1wbGUgYmluYXJ5IHJlZ2lvbjoKKworYGBgCit2dGFibGUgKEFubm90YXRlZEJpbmFyeS5CYXIpOgorICArMHgwMEEwIHwgMDggMDAgICAgICAgICAgICAgICAgICAgfCB1aW50MTZfdCAgIHwgMHgwMDA4ICg4KSAgICAgICAgICAgICAgICAgICAgICAgICB8IHNpemUgb2YgdGhpcyB2dGFibGUKK2BgYAorCitUaGUgZmlyc3QgY29sdW1uIChgKzB4MDBBMGApIGlzIHRoZSBvZmZzZXQgdG8gdGhpcyByZWdpb24gZnJvbSB0aGUgYmVnaW5uaW5nIG9mCit0aGUgYnVmZmVyLiAKKworVGhlIHNlY29uZCBjb2x1bW4gYXJlIHRoZSByYXcgYnl0ZXMgKGhleGFkZWNpbWFsKSB0aGF0IG1ha2UgdXAgdGhpcworcmVnaW9uLiBUaGVzZSBhcmUgZXhwcmVzc2VkIGluIHRoZSBsaXR0bGUtZW5kaWFuIGZvcm1hdCB0aGF0IGZsYXRidWZmZXJzIHVzZXMgCitmb3IgdGhlIHdpcmUgZm9ybWF0LgorCitUaGUgdGhpcmQgY29sdW1uIGlzIHRoZSB0eXBlIHRvIGludGVycHJldCB0aGUgYnl0ZXMgYXMuIFNvbWUgdHlwZXMgYXJlIHNwZWNpYWwKK3RvIGZsYXRidWZmZXIgaW50ZXJuYWxzIChlLmcuIGBTT2ZmZXQzMmAsIGBPZmZzZXQzMmAsIGFuZCBgVk9mZnNldDE2YCkgd2hpY2ggYXJlCit1c2VkIGJ5IGZsYXRidWZmZXJzIHRvIHBvaW50IHRvIHZhcmlvdXMgb2Zmc2V0ZXMuIFRoZSBvdGhlciB0eXBlcyBhcmUgc3BlY2lmaWVkCithcyBDKystbGlrZSB0eXBlcyB3aGljaCBhcmUgdGhlIHN0YW5kYXJkIGZpeC13aWR0aCBzY2FsYXJzLiBGb3IgdGhlIGFib3ZlCitleGFtcGxlLCB0aGUgdHlwZSBpcyBgdWludDE2X3RgIHdoaWNoIGlzIGEgMTYtYml0IHVuc2lnbmVkIGludGVnZXIgdHlwZS4KKworVGhlIGZvdXJ0aCBjb2x1bW4gc2hvd3MgdGhlIHJhdyBieXRlcyBhcyBhIGNvbXBhY3RlZCwgYmlnLWVuZGlhbiB2YWx1ZS4gVGhlIHJhdworYnl0ZXMgYXJlIGR1cGxpY2F0ZWQgaW4gdGhpcyBmYXNoaW9uIHNpbmNlIGl0IGlzIG1vcmUgaW50dXRpdmUgdG8gcmVhZCB0aGUgZGF0YQoraW4gdGhlIGJpZy1lbmRpYW4gZm9ybWF0IChlLmcuLCBgMHgwMDA4YCkuIFRoaXMgdmFsdWUgaXMgZm9sbG93ZWQgYnkgdGhlIGRlY2ltYWwKK3JlcHJlc2VudGF0aW9uIG9mIHRoZSB2YWx1ZSAoZS5nLiwgYCg4KWApLiAoRm9yIHN0cmluZ3MsIHRoZSByYXcgc3RyaW5nIHZhbHVlCitpcyBzaG93biBpbnN0ZWFkKS4gCisKK1RoZSBmaWZ0aCBjb2x1bW4gaXMgYSB0ZXh0dWFsIGNvbW1lbnQgb24gd2hhdCB0aGUgdmFsdWUgaXMuIEFzIG11Y2ggbWV0YWRhdGEgYXMKK2tub3duIGlzIHByb3ZpZGVkLgorCisjIyMjIE9mZnNldHMKKworSWYgdGhlIHR5cGUgaW4gdGhlIDNyZCBjb2x1bW4gaXMgb2YgYW4gYWJzb2x1dGUgb2Zmc2V0IChgU09mZmV0MzJgIG9yIAorYE9mZnNldDMyYCksIHRoZSBmb3VydGggY29sdW1uIGFsc28gc2hvd3MgYW4gYExvYzogKzB4MDI1QWAgdmFsdWUgd2hpY2ggc2hvd3MgCit3aGVyZSBpbiB0aGUgYmluYXJ5IHRoaXMgcmVnaW9uIGlzIHBvaW50aW5nIHRvLiBUaGVzZSB2YWx1ZXMgYXJlIGFic29sdXRlIGZyb20KK3RoZSBiZWdpbm5pbmcgb2YgdGhlIGZpbGUsIHRoZWlyIGNhbGN1bGF0aW9uIGZyb20gdGhlIHJhdyB2YWx1ZSBpbiB0aGUgNHRoCitjb2x1bW4gZGVwZW5kcyBvbiB0aGUgY29udGV4dC4KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL2Fubm90YXRlZF9iaW5hcnkvYW5ub3RhdGVkX2JpbmFyeS5hZmIgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9hbm5vdGF0ZWRfYmluYXJ5L2Fubm90YXRlZF9iaW5hcnkuYWZiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZiZDg0ZDcKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9hbm5vdGF0ZWRfYmluYXJ5L2Fubm90YXRlZF9iaW5hcnkuYWZiCkBAIC0wLDAgKzEsMjk3IEBACisvLyBBbm5vdGF0ZWQgRmxhdGJ1ZmZlciBCaW5hcnkKKy8vCisvLyBTY2hlbWEgZmlsZTogYW5ub3RhdGVkX2JpbmFyeS5mYnMKKy8vIEJpbmFyeSBmaWxlOiBhbm5vdGF0ZWRfYmluYXJ5LmJpbgorCitoZWFkZXI6CisgICsweDAwMDAgfCA0NCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgfCAweDAwMDAwMDQ0ICg2OCkgTG9jOiArMHgwMDQ0ICAgfCBvZmZzZXQgdG8gcm9vdCB0YWJsZSBgQW5ub3RhdGVkQmluYXJ5LkZvb2AKKyAgKzB4MDAwNCB8IDQxIDRFIDRFIDRGICAgICAgICAgICAgIHwgY2hhcls0XSAgICB8IEFOTk8gICAgICAgICAgICAgICAgICAgICAgICAgICB8IEZpbGUgSWRlbnRpZmllcgorCitwYWRkaW5nOgorICArMHgwMDA4IHwgMDAgMDAgICAgICAgICAgICAgICAgICAgfCB1aW50OF90WzJdIHwgLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgcGFkZGluZworCit2dGFibGUgKEFubm90YXRlZEJpbmFyeS5Gb28pOgorICArMHgwMDBBIHwgM0EgMDAgICAgICAgICAgICAgICAgICAgfCB1aW50MTZfdCAgIHwgMHgwMDNBICg1OCkgICAgICAgICAgICAgICAgICAgIHwgc2l6ZSBvZiB0aGlzIHZ0YWJsZQorICArMHgwMDBDIHwgNjggMDAgICAgICAgICAgICAgICAgICAgfCB1aW50MTZfdCAgIHwgMHgwMDY4ICgxMDQpICAgICAgICAgICAgICAgICAgIHwgc2l6ZSBvZiByZWZlcnJpbmcgdGFibGUKKyAgKzB4MDAwRSB8IDBDIDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICB8IDB4MDAwQyAoMTIpICAgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgY291bnRlcmAgKGlkOiAwKQorICArMHgwMDEwIHwgMDcgMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgIHwgMHgwMDA3ICg3KSAgICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBoZWFsdGh5YCAoaWQ6IDEpCisgICsweDAwMTIgfCAwMCAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgfCAweDAwMDAgKDApICAgICAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYGxldmVsYCAoaWQ6IDIpIDxkZWZhdWx0cyB0byA5OT4gKExvbmcpCisgICsweDAwMTQgfCAwOCAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgfCAweDAwMDggKDgpICAgICAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYG1lYWxgIChpZDogMykKKyAgKzB4MDAxNiB8IDEwIDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICB8IDB4MDAxMCAoMTYpICAgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgYmFyYCAoaWQ6IDQpCisgICsweDAwMTggfCAxNCAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgfCAweDAwMTQgKDIwKSAgICAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYGhvbWVgIChpZDogNSkKKyAgKzB4MDAxQSB8IDMwIDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICB8IDB4MDAzMCAoNDgpICAgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgbmFtZWAgKGlkOiA2KQorICArMHgwMDFDIHwgMzQgMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgIHwgMHgwMDM0ICg1MikgICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBiYXJzYCAoaWQ6IDcpCisgICsweDAwMUUgfCAwOSAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgfCAweDAwMDkgKDkpICAgICAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYGJhcl9iYXpfdHlwZWAgKGlkOiA4KQorICArMHgwMDIwIHwgMzggMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgIHwgMHgwMDM4ICg1NikgICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBiYXJfYmF6YCAoaWQ6IDkpCisgICsweDAwMjIgfCAzQyAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgfCAweDAwM0MgKDYwKSAgICAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYGFjY291bnRzYCAoaWQ6IDEwKQorICArMHgwMDI0IHwgNDAgMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgIHwgMHgwMDQwICg2NCkgICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBib2JgIChpZDogMTEpCisgICsweDAwMjYgfCA0NCAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgfCAweDAwNDQgKDY4KSAgICAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYGFsaWNlYCAoaWQ6IDEyKQorICArMHgwMDI4IHwgMDAgMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgIHwgMHgwMDAwICgwKSAgICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBtYXliZV9pMzJgIChpZDogMTMpIDxkZWZhdWx0cyB0byAwPiAoSW50KQorICArMHgwMDJBIHwgMDAgMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgIHwgMHgwMDAwICgwKSAgICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBkZWZhdWx0X2kzMmAgKGlkOiAxNCkgPGRlZmF1bHRzIHRvIDQyPiAoSW50KQorICArMHgwMDJDIHwgNDggMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgIHwgMHgwMDQ4ICg3MikgICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBqdXN0X2kzMmAgKGlkOiAxNSkKKyAgKzB4MDAyRSB8IDRDIDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICB8IDB4MDA0QyAoNzYpICAgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgbmFtZXNgIChpZDogMTYpCisgICsweDAwMzAgfCA1MCAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgfCAweDAwNTAgKDgwKSAgICAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYHBvaW50c19vZl9pbnRlcmVzdGAgKGlkOiAxNykKKyAgKzB4MDAzMiB8IDU0IDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICB8IDB4MDA1NCAoODQpICAgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgZm9vYmFyc190eXBlYCAoaWQ6IDE4KQorICArMHgwMDM0IHwgNTggMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgIHwgMHgwMDU4ICg4OCkgICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBmb29iYXJzYCAoaWQ6IDE5KQorICArMHgwMDM2IHwgMEEgMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgIHwgMHgwMDBBICgxMCkgICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBtZWFzdXJlbWVudF90eXBlYCAoaWQ6IDIwKQorICArMHgwMDM4IHwgNUMgMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgIHwgMHgwMDVDICg5MikgICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBtZWFzdXJlbWVudGAgKGlkOiAyMSkKKyAgKzB4MDAzQSB8IDBCIDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICB8IDB4MDAwQiAoMTEpICAgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgYW55dGhpbmdfdHlwZWAgKGlkOiAyMikKKyAgKzB4MDAzQyB8IDYwIDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICB8IDB4MDA2MCAoOTYpICAgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgYW55dGhpbmdgIChpZDogMjMpCisgICsweDAwM0UgfCAwMCAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgfCAweDAwMDAgKDApICAgICAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYHRlbXBlcmF0dXJlYCAoaWQ6IDI0KSA8ZGVmYXVsdHMgdG8gOTguNjAwMDAwPiAoRmxvYXQpCisgICsweDAwNDAgfCAwMCAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgfCAweDAwMDAgKDApICAgICAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYHRlZXRvdGFsZXJgIChpZDogMjUpIDxudWxsPiAoT2JqKQorICArMHgwMDQyIHwgNjQgMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgIHwgMHgwMDY0ICgxMDApICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBjaGFybGllYCAoaWQ6IDI2KQorCityb290X3RhYmxlIChBbm5vdGF0ZWRCaW5hcnkuRm9vKToKKyAgKzB4MDA0NCB8IDNBIDAwIDAwIDAwICAgICAgICAgICAgIHwgU09mZnNldDMyICB8IDB4MDAwMDAwM0EgKDU4KSBMb2M6ICsweDAwMEEgICB8IG9mZnNldCB0byB2dGFibGUKKyAgKzB4MDA0OCB8IDAwIDAwIDAwICAgICAgICAgICAgICAgIHwgdWludDhfdFszXSB8IC4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHBhZGRpbmcKKyAgKzB4MDA0QiB8IDAxICAgICAgICAgICAgICAgICAgICAgIHwgdWludDhfdCAgICB8IDB4MDEgKDEpICAgICAgICAgICAgICAgICAgICAgICB8IHRhYmxlIGZpZWxkIGBoZWFsdGh5YCAoQm9vbCkKKyAgKzB4MDA0QyB8IDAyICAgICAgICAgICAgICAgICAgICAgIHwgdWludDhfdCAgICB8IDB4MDIgKDIpICAgICAgICAgICAgICAgICAgICAgICB8IHRhYmxlIGZpZWxkIGBtZWFsYCAoQnl0ZSkKKyAgKzB4MDA0RCB8IDAyICAgICAgICAgICAgICAgICAgICAgIHwgVVR5cGU4ICAgICB8IDB4MDIgKDIpICAgICAgICAgICAgICAgICAgICAgICB8IHRhYmxlIGZpZWxkIGBiYXJfYmF6X3R5cGVgIChVVHlwZSkKKyAgKzB4MDA0RSB8IDAxICAgICAgICAgICAgICAgICAgICAgIHwgVVR5cGU4ICAgICB8IDB4MDEgKDEpICAgICAgICAgICAgICAgICAgICAgICB8IHRhYmxlIGZpZWxkIGBtZWFzdXJlbWVudF90eXBlYCAoVVR5cGUpCisgICsweDAwNEYgfCAwMSAgICAgICAgICAgICAgICAgICAgICB8IFVUeXBlOCAgICAgfCAweDAxICgxKSAgICAgICAgICAgICAgICAgICAgICAgfCB0YWJsZSBmaWVsZCBgYW55dGhpbmdfdHlwZWAgKFVUeXBlKQorICArMHgwMDUwIHwgRDIgMDQgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgIHwgMHgwMDAwMDREMiAoMTIzNCkgICAgICAgICAgICAgIHwgdGFibGUgZmllbGQgYGNvdW50ZXJgIChJbnQpCisgICsweDAwNTQgfCAyOCAwMiAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgfCAweDAwMDAwMjI4ICg1NTIpIExvYzogKzB4MDI3QyAgfCBvZmZzZXQgdG8gZmllbGQgYGJhcmAgKHRhYmxlKQorICArMHgwMDU4IHwgMDEgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgIHwgMHgwMDAwMDAwMSAoMSkgICAgICAgICAgICAgICAgIHwgc3RydWN0IGZpZWxkIGBBbm5vdGF0ZWRCaW5hcnkuQnVpbGRpbmcuZmxvb3JzYCAoSW50KQorICArMHgwMDVDIHwgMDIgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgIHwgMHgwMDAwMDAwMiAoMikgICAgICAgICAgICAgICAgIHwgc3RydWN0IGZpZWxkIGBBbm5vdGF0ZWRCaW5hcnkuQnVpbGRpbmcuZG9vcnNgIChJbnQpCisgICsweDAwNjAgfCAwQyAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgfCAweDAwMDAwMDBDICgxMikgICAgICAgICAgICAgICAgfCBzdHJ1Y3QgZmllbGQgYEFubm90YXRlZEJpbmFyeS5CdWlsZGluZy53aW5kb3dzYCAoSW50KQorICArMHgwMDY0IHwgMEEgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgIHwgMHgwMDAwMDAwQSAoMTApICAgICAgICAgICAgICAgIHwgYXJyYXkgZmllbGQgYEFubm90YXRlZEJpbmFyeS5EaW1lbnNpb24udmFsdWVzYFswXSAoSW50KQorICArMHgwMDY4IHwgMEMgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgIHwgMHgwMDAwMDAwQyAoMTIpICAgICAgICAgICAgICAgIHwgYXJyYXkgZmllbGQgYEFubm90YXRlZEJpbmFyeS5EaW1lbnNpb24udmFsdWVzYFsxXSAoSW50KQorICArMHgwMDZDIHwgMTQgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgIHwgMHgwMDAwMDAxNCAoMjApICAgICAgICAgICAgICAgIHwgYXJyYXkgZmllbGQgYEFubm90YXRlZEJpbmFyeS5EaW1lbnNpb24udmFsdWVzYFsyXSAoSW50KQorICArMHgwMDcwIHwgMDEgICAgICAgICAgICAgICAgICAgICAgfCB1aW50OF90ICAgIHwgMHgwMSAoMSkgICAgICAgICAgICAgICAgICAgICAgIHwgc3RydWN0IGZpZWxkIGBBbm5vdGF0ZWRCaW5hcnkuVG9sZXJhbmNlLndpZHRoYCAoVUJ5dGUpCisgICsweDAwNzEgfCAwMiAgICAgICAgICAgICAgICAgICAgICB8IHVpbnQ4X3QgICAgfCAweDAyICgyKSAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJ1Y3QgZmllbGQgYEFubm90YXRlZEJpbmFyeS5Ub2xlcmFuY2Uud2lkdGhgIChVQnl0ZSkKKyAgKzB4MDA3MiB8IDAzICAgICAgICAgICAgICAgICAgICAgIHwgdWludDhfdCAgICB8IDB4MDMgKDMpICAgICAgICAgICAgICAgICAgICAgICB8IHN0cnVjdCBmaWVsZCBgQW5ub3RhdGVkQmluYXJ5LlRvbGVyYW5jZS53aWR0aGAgKFVCeXRlKQorICArMHgwMDczIHwgMDAgICAgICAgICAgICAgICAgICAgICAgfCB1aW50OF90WzFdIHwgLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgcGFkZGluZworICArMHgwMDc0IHwgQzggMDEgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgIHwgMHgwMDAwMDFDOCAoNDU2KSBMb2M6ICsweDAyM0MgIHwgb2Zmc2V0IHRvIGZpZWxkIGBuYW1lYCAoc3RyaW5nKQorICArMHgwMDc4IHwgNUMgMDEgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgIHwgMHgwMDAwMDE1QyAoMzQ4KSBMb2M6ICsweDAxRDQgIHwgb2Zmc2V0IHRvIGZpZWxkIGBiYXJzYCAodmVjdG9yKQorICArMHgwMDdDIHwgNTAgMDEgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgIHwgMHgwMDAwMDE1MCAoMzM2KSBMb2M6ICsweDAxQ0MgIHwgb2Zmc2V0IHRvIGZpZWxkIGBiYXJfYmF6YCAodW5pb24gb2YgdHlwZSBgQmF6YCkKKyAgKzB4MDA4MCB8IDM0IDAxIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICB8IDB4MDAwMDAxMzQgKDMwOCkgTG9jOiArMHgwMUI0ICB8IG9mZnNldCB0byBmaWVsZCBgYWNjb3VudHNgICh2ZWN0b3IpCisgICsweDAwODQgfCAyNCAwMSAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgfCAweDAwMDAwMTI0ICgyOTIpIExvYzogKzB4MDFBOCAgfCBvZmZzZXQgdG8gZmllbGQgYGJvYmAgKHN0cmluZykKKyAgKzB4MDA4OCB8IDE0IDAxIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICB8IDB4MDAwMDAxMTQgKDI3NikgTG9jOiArMHgwMTlDICB8IG9mZnNldCB0byBmaWVsZCBgYWxpY2VgIChzdHJpbmcpCisgICsweDAwOEMgfCAwRCAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgfCAweDAwMDAwMDBEICgxMykgICAgICAgICAgICAgICAgfCB0YWJsZSBmaWVsZCBganVzdF9pMzJgIChJbnQpCisgICsweDAwOTAgfCBEQyAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgfCAweDAwMDAwMERDICgyMjApIExvYzogKzB4MDE2QyAgfCBvZmZzZXQgdG8gZmllbGQgYG5hbWVzYCAodmVjdG9yKQorICArMHgwMDk0IHwgQTAgMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgIHwgMHgwMDAwMDBBMCAoMTYwKSBMb2M6ICsweDAxMzQgIHwgb2Zmc2V0IHRvIGZpZWxkIGBwb2ludHNfb2ZfaW50ZXJlc3RgICh2ZWN0b3IpCisgICsweDAwOTggfCA5NCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgfCAweDAwMDAwMDk0ICgxNDgpIExvYzogKzB4MDEyQyAgfCBvZmZzZXQgdG8gZmllbGQgYGZvb2JhcnNfdHlwZWAgKHZlY3RvcikKKyAgKzB4MDA5QyB8IDM4IDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICB8IDB4MDAwMDAwMzggKDU2KSBMb2M6ICsweDAwRDQgICB8IG9mZnNldCB0byBmaWVsZCBgZm9vYmFyc2AgKHZlY3RvcikKKyAgKzB4MDBBMCB8IDMzIDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICB8IDB4MDAwMDAwMzMgKDUxKSBMb2M6ICsweDAwRDMgICB8IG9mZnNldCB0byBmaWVsZCBgbWVhc3VyZW1lbnRgICh1bmlvbiBvZiB0eXBlIGBUb2xlcmFuY2VgKQorICArMHgwMEE0IHwgMUMgMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgIHwgMHgwMDAwMDAxQyAoMjgpIExvYzogKzB4MDBDMCAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBhbnl0aGluZ2AgKHVuaW9uIG9mIHR5cGUgYEJhcmApCisgICsweDAwQTggfCAwNCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgfCAweDAwMDAwMDA0ICg0KSBMb2M6ICsweDAwQUMgICAgfCBvZmZzZXQgdG8gZmllbGQgYGNoYXJsaWVgIChzdHJpbmcpCisKK3N0cmluZyAoQW5ub3RhdGVkQmluYXJ5LkZvby5jaGFybGllKToKKyAgKzB4MDBBQyB8IDA1IDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICB8IDB4MDAwMDAwMDUgKDUpICAgICAgICAgICAgICAgICB8IGxlbmd0aCBvZiBzdHJpbmcKKyAgKzB4MDBCMCB8IDYxIDZDIDY5IDYzIDY1ICAgICAgICAgIHwgY2hhcls1XSAgICB8IGFsaWNlICAgICAgICAgICAgICAgICAgICAgICAgICB8IHN0cmluZyBsaXRlcmFsCisgICsweDAwQjUgfCAwMCAgICAgICAgICAgICAgICAgICAgICB8IGNoYXIgICAgICAgfCAweDAwICgwKSAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJpbmcgdGVybWluYXRvcgorCitwYWRkaW5nOgorICArMHgwMEI2IHwgMDAgMDAgICAgICAgICAgICAgICAgICAgfCB1aW50OF90WzJdIHwgLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgcGFkZGluZworCit2dGFibGUgKEFubm90YXRlZEJpbmFyeS5CYXIpOgorICArMHgwMEI4IHwgMDggMDAgICAgICAgICAgICAgICAgICAgfCB1aW50MTZfdCAgIHwgMHgwMDA4ICg4KSAgICAgICAgICAgICAgICAgICAgIHwgc2l6ZSBvZiB0aGlzIHZ0YWJsZQorICArMHgwMEJBIHwgMTMgMDAgICAgICAgICAgICAgICAgICAgfCB1aW50MTZfdCAgIHwgMHgwMDEzICgxOSkgICAgICAgICAgICAgICAgICAgIHwgc2l6ZSBvZiByZWZlcnJpbmcgdGFibGUKKyAgKzB4MDBCQyB8IDA4IDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICB8IDB4MDAwOCAoOCkgICAgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgYWAgKGlkOiAwKQorICArMHgwMEJFIHwgMDQgMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgIHwgMHgwMDA0ICg0KSAgICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBiYCAoaWQ6IDEpCisKK3RhYmxlIChBbm5vdGF0ZWRCaW5hcnkuQmFyKToKKyAgKzB4MDBDMCB8IDA4IDAwIDAwIDAwICAgICAgICAgICAgIHwgU09mZnNldDMyICB8IDB4MDAwMDAwMDggKDgpIExvYzogKzB4MDBCOCAgICB8IG9mZnNldCB0byB2dGFibGUKKyAgKzB4MDBDNCB8IDAwIDgwIDIzIDQ0ICAgICAgICAgICAgIHwgZmxvYXQgICAgICB8IDB4NDQyMzgwMDAgKDY1NCkgICAgICAgICAgICAgICB8IHRhYmxlIGZpZWxkIGBiYCAoRmxvYXQpCisgICsweDAwQzggfCAwMCAwMCAwMCAwMCAwMCAxMCA3NCA0MCB8IGRvdWJsZSAgICAgfCAweDQwNzQxMDAwMDAwMDAwMDAgKDMyMSkgICAgICAgfCB0YWJsZSBmaWVsZCBgYWAgKERvdWJsZSkKKyAgKzB4MDBEMCB8IDAwIDAwIDAwICAgICAgICAgICAgICAgIHwgdWludDhfdFszXSB8IC4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHBhZGRpbmcKKwordW5pb24gKEFubm90YXRlZEJpbmFyeS5Ub2xlcmFuY2UubWVhc3VyZW1lbnQpOgorICArMHgwMEQzIHwgMDUgICAgICAgICAgICAgICAgICAgICAgfCB1aW50OF90ICAgIHwgMHgwNSAoNSkgICAgICAgICAgICAgICAgICAgICAgIHwgc3RydWN0IGZpZWxkIGBBbm5vdGF0ZWRCaW5hcnkuVG9sZXJhbmNlLndpZHRoYCAoVUJ5dGUpCisKK3ZlY3RvciAoQW5ub3RhdGVkQmluYXJ5LkZvby5mb29iYXJzKToKKyAgKzB4MDBENCB8IDAzIDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICB8IDB4MDAwMDAwMDMgKDMpICAgICAgICAgICAgICAgICB8IGxlbmd0aCBvZiB2ZWN0b3IgKCMgaXRlbXMpCisgICsweDAwRDggfCAzNCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgfCAweDAwMDAwMDM0ICg1MikgTG9jOiArMHgwMTBDICAgfCBvZmZzZXQgdG8gdW5pb25bMF0gKGBCYXJgKQorICArMHgwMERDIHwgMkMgMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgIHwgMHgwMDAwMDAyQyAoNDQpIExvYzogKzB4MDEwOCAgIHwgb2Zmc2V0IHRvIHVuaW9uWzFdIChgQmF6YCkKKyAgKzB4MDBFMCB8IDA0IDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICB8IDB4MDAwMDAwMDQgKDQpIExvYzogKzB4MDBFNCAgICB8IG9mZnNldCB0byB1bmlvblsyXSAoYEJhcmApCisKK3RhYmxlIChBbm5vdGF0ZWRCaW5hcnkuQmFyKToKKyAgKzB4MDBFNCB8IEQyIEZFIEZGIEZGICAgICAgICAgICAgIHwgU09mZnNldDMyICB8IDB4RkZGRkZFRDIgKC0zMDIpIExvYzogKzB4MDIxMiB8IG9mZnNldCB0byB2dGFibGUKKyAgKzB4MDBFOCB8IDAwIDgwIDIzIDQ0ICAgICAgICAgICAgIHwgZmxvYXQgICAgICB8IDB4NDQyMzgwMDAgKDY1NCkgICAgICAgICAgICAgICB8IHRhYmxlIGZpZWxkIGBiYCAoRmxvYXQpCisgICsweDAwRUMgfCAxMCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgfCAweDAwMDAwMDEwICgxNikgTG9jOiArMHgwMEZDICAgfCBvZmZzZXQgdG8gZmllbGQgYGNgICh0YWJsZSkKKyAgKzB4MDBGMCB8IDAwIDAwIDAwIDAwIDAwIEQ4IDhFIDQwIHwgZG91YmxlICAgICB8IDB4NDA4RUQ4MDAwMDAwMDAwMCAoOTg3KSAgICAgICB8IHRhYmxlIGZpZWxkIGBhYCAoRG91YmxlKQorICArMHgwMEY4IHwgMDAgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50OF90WzRdIHwgLi4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgcGFkZGluZworCit0YWJsZSAoQW5ub3RhdGVkQmluYXJ5LkJheik6CisgICsweDAwRkMgfCA2QSBGRSBGRiBGRiAgICAgICAgICAgICB8IFNPZmZzZXQzMiAgfCAweEZGRkZGRTZBICgtNDA2KSBMb2M6ICsweDAyOTIgfCBvZmZzZXQgdG8gdnRhYmxlCisgICsweDAxMDAgfCAwMCAwMCAwMCAgICAgICAgICAgICAgICB8IHVpbnQ4X3RbM10gfCAuLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBwYWRkaW5nCisgICsweDAxMDMgfCAwMyAgICAgICAgICAgICAgICAgICAgICB8IHVpbnQ4X3QgICAgfCAweDAzICgzKSAgICAgICAgICAgICAgICAgICAgICAgfCB0YWJsZSBmaWVsZCBgbWVhbGAgKEJ5dGUpCisKK3Z0YWJsZSAoQW5ub3RhdGVkQmluYXJ5LkJheik6CisgICsweDAxMDQgfCAwNCAwMCAgICAgICAgICAgICAgICAgICB8IHVpbnQxNl90ICAgfCAweDAwMDQgKDQpICAgICAgICAgICAgICAgICAgICAgfCBzaXplIG9mIHRoaXMgdnRhYmxlCisgICsweDAxMDYgfCAwNCAwMCAgICAgICAgICAgICAgICAgICB8IHVpbnQxNl90ICAgfCAweDAwMDQgKDQpICAgICAgICAgICAgICAgICAgICAgfCBzaXplIG9mIHJlZmVycmluZyB0YWJsZQorCit0YWJsZSAoQW5ub3RhdGVkQmluYXJ5LkJheik6CisgICsweDAxMDggfCAwNCAwMCAwMCAwMCAgICAgICAgICAgICB8IFNPZmZzZXQzMiAgfCAweDAwMDAwMDA0ICg0KSBMb2M6ICsweDAxMDQgICAgfCBvZmZzZXQgdG8gdnRhYmxlCisKK3RhYmxlIChBbm5vdGF0ZWRCaW5hcnkuQmFyKToKKyAgKzB4MDEwQyB8IEZBIEZFIEZGIEZGICAgICAgICAgICAgIHwgU09mZnNldDMyICB8IDB4RkZGRkZFRkEgKC0yNjIpIExvYzogKzB4MDIxMiB8IG9mZnNldCB0byB2dGFibGUKKyAgKzB4MDExMCB8IDAwIDAwIEU0IDQzICAgICAgICAgICAgIHwgZmxvYXQgICAgICB8IDB4NDNFNDAwMDAgKDQ1NikgICAgICAgICAgICAgICB8IHRhYmxlIGZpZWxkIGBiYCAoRmxvYXQpCisgICsweDAxMTQgfCAxMCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgfCAweDAwMDAwMDEwICgxNikgTG9jOiArMHgwMTI0ICAgfCBvZmZzZXQgdG8gZmllbGQgYGNgICh0YWJsZSkKKyAgKzB4MDExOCB8IDAwIDAwIDAwIDAwIDAwIEMwIDVFIDQwIHwgZG91YmxlICAgICB8IDB4NDA1RUMwMDAwMDAwMDAwMCAoMTIzKSAgICAgICB8IHRhYmxlIGZpZWxkIGBhYCAoRG91YmxlKQorICArMHgwMTIwIHwgMDAgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50OF90WzRdIHwgLi4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgcGFkZGluZworCit0YWJsZSAoQW5ub3RhdGVkQmluYXJ5LkJheik6CisgICsweDAxMjQgfCA5MiBGRSBGRiBGRiAgICAgICAgICAgICB8IFNPZmZzZXQzMiAgfCAweEZGRkZGRTkyICgtMzY2KSBMb2M6ICsweDAyOTIgfCBvZmZzZXQgdG8gdnRhYmxlCisgICsweDAxMjggfCAwMCAwMCAwMCAgICAgICAgICAgICAgICB8IHVpbnQ4X3RbM10gfCAuLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBwYWRkaW5nCisgICsweDAxMkIgfCAwMSAgICAgICAgICAgICAgICAgICAgICB8IHVpbnQ4X3QgICAgfCAweDAxICgxKSAgICAgICAgICAgICAgICAgICAgICAgfCB0YWJsZSBmaWVsZCBgbWVhbGAgKEJ5dGUpCisKK3ZlY3RvciAoQW5ub3RhdGVkQmluYXJ5LkZvby5mb29iYXJzX3R5cGUpOgorICArMHgwMTJDIHwgMDMgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgIHwgMHgwMDAwMDAwMyAoMykgICAgICAgICAgICAgICAgIHwgbGVuZ3RoIG9mIHZlY3RvciAoIyBpdGVtcykKKyAgKzB4MDEzMCB8IDAxICAgICAgICAgICAgICAgICAgICAgIHwgVVR5cGU4ICAgICB8IDB4MDEgKDEpICAgICAgICAgICAgICAgICAgICAgICB8IHZhbHVlWzBdCisgICsweDAxMzEgfCAwMiAgICAgICAgICAgICAgICAgICAgICB8IFVUeXBlOCAgICAgfCAweDAyICgyKSAgICAgICAgICAgICAgICAgICAgICAgfCB2YWx1ZVsxXQorICArMHgwMTMyIHwgMDEgICAgICAgICAgICAgICAgICAgICAgfCBVVHlwZTggICAgIHwgMHgwMSAoMSkgICAgICAgICAgICAgICAgICAgICAgIHwgdmFsdWVbMl0KKwordmVjdG9yIChBbm5vdGF0ZWRCaW5hcnkuRm9vLnBvaW50c19vZl9pbnRlcmVzdCk6CisgICsweDAxMzQgfCAwMyAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgfCAweDAwMDAwMDAzICgzKSAgICAgICAgICAgICAgICAgfCBsZW5ndGggb2YgdmVjdG9yICgjIGl0ZW1zKQorICArMHgwMTM4IHwgMzMgMzMgMzMgMzMgMzMgQTMgNDUgNDAgfCBkb3VibGUgICAgIHwgMHg0MDQ1QTMzMzMzMzMzMzMzICg0My4yNzUpICAgIHwgc3RydWN0IGZpZWxkIGBBbm5vdGF0ZWRCaW5hcnkuTG9jYXRpb24ubGF0aXR1ZGVgIChEb3VibGUpCisgICsweDAxNDAgfCA3RSA1NyAwNCBGRiA1QiA4NyA1MyBDMCB8IGRvdWJsZSAgICAgfCAweEMwNTM4NzVCRkYwNDU3N0UgKC03OC4xMTUpICAgfCBzdHJ1Y3QgZmllbGQgYEFubm90YXRlZEJpbmFyeS5Mb2NhdGlvbi5sb25naXR1ZGVgIChEb3VibGUpCisgICsweDAxNDggfCA4RCBGMCBGNiAyMCAwNCBCNiA0MiA0MCB8IGRvdWJsZSAgICAgfCAweDQwNDJCNjA0MjBGNkYwOEQgKDM3LjQyMikgICAgfCBzdHJ1Y3QgZmllbGQgYEFubm90YXRlZEJpbmFyeS5Mb2NhdGlvbi5sYXRpdHVkZWAgKERvdWJsZSkKKyAgKzB4MDE1MCB8IDlGIDc3IDYzIDQxIDYxIDg1IDVFIEMwIHwgZG91YmxlICAgICB8IDB4QzA1RTg1NjE0MTYzNzc5RiAoLTEyMi4wODQpICB8IHN0cnVjdCBmaWVsZCBgQW5ub3RhdGVkQmluYXJ5LkxvY2F0aW9uLmxvbmdpdHVkZWAgKERvdWJsZSkKKyAgKzB4MDE1OCB8IDhGIDM1IDIzIDgzIERDIDM1IDRCIEMwIHwgZG91YmxlICAgICB8IDB4QzA0QjM1REM4MzIzMzU4RiAoLTU0LjQyMDgpICB8IHN0cnVjdCBmaWVsZCBgQW5ub3RhdGVkQmluYXJ5LkxvY2F0aW9uLmxhdGl0dWRlYCAoRG91YmxlKQorICArMHgwMTYwIHwgRjYgOTcgREQgOTMgODcgQzUgMEEgNDAgfCBkb3VibGUgICAgIHwgMHg0MDBBQzU4NzkzREQ5N0Y2ICgzLjM0NjQ1KSAgIHwgc3RydWN0IGZpZWxkIGBBbm5vdGF0ZWRCaW5hcnkuTG9jYXRpb24ubG9uZ2l0dWRlYCAoRG91YmxlKQorCitwYWRkaW5nOgorICArMHgwMTY4IHwgMDAgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50OF90WzRdIHwgLi4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgcGFkZGluZworCit2ZWN0b3IgKEFubm90YXRlZEJpbmFyeS5Gb28ubmFtZXMpOgorICArMHgwMTZDIHwgMDMgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgIHwgMHgwMDAwMDAwMyAoMykgICAgICAgICAgICAgICAgIHwgbGVuZ3RoIG9mIHZlY3RvciAoIyBpdGVtcykKKyAgKzB4MDE3MCB8IDIwIDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICB8IDB4MDAwMDAwMjAgKDMyKSBMb2M6ICsweDAxOTAgICB8IG9mZnNldCB0byBzdHJpbmdbMF0KKyAgKzB4MDE3NCB8IDE0IDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICB8IDB4MDAwMDAwMTQgKDIwKSBMb2M6ICsweDAxODggICB8IG9mZnNldCB0byBzdHJpbmdbMV0KKyAgKzB4MDE3OCB8IDA0IDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICB8IDB4MDAwMDAwMDQgKDQpIExvYzogKzB4MDE3QyAgICB8IG9mZnNldCB0byBzdHJpbmdbMl0KKworc3RyaW5nIChBbm5vdGF0ZWRCaW5hcnkuRm9vLm5hbWVzKToKKyAgKzB4MDE3QyB8IDA3IDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICB8IDB4MDAwMDAwMDcgKDcpICAgICAgICAgICAgICAgICB8IGxlbmd0aCBvZiBzdHJpbmcKKyAgKzB4MDE4MCB8IDYzIDY4IDYxIDcyIDZDIDY5IDY1ICAgIHwgY2hhcls3XSAgICB8IGNoYXJsaWUgICAgICAgICAgICAgICAgICAgICAgICB8IHN0cmluZyBsaXRlcmFsCisgICsweDAxODcgfCAwMCAgICAgICAgICAgICAgICAgICAgICB8IGNoYXIgICAgICAgfCAweDAwICgwKSAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJpbmcgdGVybWluYXRvcgorCitzdHJpbmcgKEFubm90YXRlZEJpbmFyeS5Gb28ubmFtZXMpOgorICArMHgwMTg4IHwgMDMgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgIHwgMHgwMDAwMDAwMyAoMykgICAgICAgICAgICAgICAgIHwgbGVuZ3RoIG9mIHN0cmluZworICArMHgwMThDIHwgNjIgNkYgNjIgICAgICAgICAgICAgICAgfCBjaGFyWzNdICAgIHwgYm9iICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nIGxpdGVyYWwKKyAgKzB4MDE4RiB8IDAwICAgICAgICAgICAgICAgICAgICAgIHwgY2hhciAgICAgICB8IDB4MDAgKDApICAgICAgICAgICAgICAgICAgICAgICB8IHN0cmluZyB0ZXJtaW5hdG9yCisKK3N0cmluZyAoQW5ub3RhdGVkQmluYXJ5LkZvby5uYW1lcyk6CisgICsweDAxOTAgfCAwNSAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgfCAweDAwMDAwMDA1ICg1KSAgICAgICAgICAgICAgICAgfCBsZW5ndGggb2Ygc3RyaW5nCisgICsweDAxOTQgfCA2MSA2QyA2OSA2MyA2NSAgICAgICAgICB8IGNoYXJbNV0gICAgfCBhbGljZSAgICAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJpbmcgbGl0ZXJhbAorICArMHgwMTk5IHwgMDAgICAgICAgICAgICAgICAgICAgICAgfCBjaGFyICAgICAgIHwgMHgwMCAoMCkgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nIHRlcm1pbmF0b3IKKworcGFkZGluZzoKKyAgKzB4MDE5QSB8IDAwIDAwICAgICAgICAgICAgICAgICAgIHwgdWludDhfdFsyXSB8IC4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHBhZGRpbmcKKworc3RyaW5nIChBbm5vdGF0ZWRCaW5hcnkuRm9vLmFsaWNlKToKKyAgKzB4MDE5QyB8IDA3IDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICB8IDB4MDAwMDAwMDcgKDcpICAgICAgICAgICAgICAgICB8IGxlbmd0aCBvZiBzdHJpbmcKKyAgKzB4MDFBMCB8IDYzIDY4IDYxIDcyIDZDIDY5IDY1ICAgIHwgY2hhcls3XSAgICB8IGNoYXJsaWUgICAgICAgICAgICAgICAgICAgICAgICB8IHN0cmluZyBsaXRlcmFsCisgICsweDAxQTcgfCAwMCAgICAgICAgICAgICAgICAgICAgICB8IGNoYXIgICAgICAgfCAweDAwICgwKSAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJpbmcgdGVybWluYXRvcgorCitzdHJpbmcgKEFubm90YXRlZEJpbmFyeS5Gb28uYm9iKToKKyAgKzB4MDFBOCB8IDA3IDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICB8IDB4MDAwMDAwMDcgKDcpICAgICAgICAgICAgICAgICB8IGxlbmd0aCBvZiBzdHJpbmcKKyAgKzB4MDFBQyB8IDYzIDY4IDYxIDcyIDZDIDY5IDY1ICAgIHwgY2hhcls3XSAgICB8IGNoYXJsaWUgICAgICAgICAgICAgICAgICAgICAgICB8IHN0cmluZyBsaXRlcmFsCisgICsweDAxQjMgfCAwMCAgICAgICAgICAgICAgICAgICAgICB8IGNoYXIgICAgICAgfCAweDAwICgwKSAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJpbmcgdGVybWluYXRvcgorCit2ZWN0b3IgKEFubm90YXRlZEJpbmFyeS5Gb28uYWNjb3VudHMpOgorICArMHgwMUI0IHwgMDkgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgIHwgMHgwMDAwMDAwOSAoOSkgICAgICAgICAgICAgICAgIHwgbGVuZ3RoIG9mIHZlY3RvciAoIyBpdGVtcykKKyAgKzB4MDFCOCB8IDA5IDAwICAgICAgICAgICAgICAgICAgIHwgdWludDE2X3QgICB8IDB4MDAwOSAoOSkgICAgICAgICAgICAgICAgICAgICB8IHZhbHVlWzBdCisgICsweDAxQkEgfCAwOCAwMCAgICAgICAgICAgICAgICAgICB8IHVpbnQxNl90ICAgfCAweDAwMDggKDgpICAgICAgICAgICAgICAgICAgICAgfCB2YWx1ZVsxXQorICArMHgwMUJDIHwgMDcgMDAgICAgICAgICAgICAgICAgICAgfCB1aW50MTZfdCAgIHwgMHgwMDA3ICg3KSAgICAgICAgICAgICAgICAgICAgIHwgdmFsdWVbMl0KKyAgKzB4MDFCRSB8IDAxIDAwICAgICAgICAgICAgICAgICAgIHwgdWludDE2X3QgICB8IDB4MDAwMSAoMSkgICAgICAgICAgICAgICAgICAgICB8IHZhbHVlWzNdCisgICsweDAxQzAgfCAwMiAwMCAgICAgICAgICAgICAgICAgICB8IHVpbnQxNl90ICAgfCAweDAwMDIgKDIpICAgICAgICAgICAgICAgICAgICAgfCB2YWx1ZVs0XQorICArMHgwMUMyIHwgMDMgMDAgICAgICAgICAgICAgICAgICAgfCB1aW50MTZfdCAgIHwgMHgwMDAzICgzKSAgICAgICAgICAgICAgICAgICAgIHwgdmFsdWVbNV0KKyAgKzB4MDFDNCB8IDA2IDAwICAgICAgICAgICAgICAgICAgIHwgdWludDE2X3QgICB8IDB4MDAwNiAoNikgICAgICAgICAgICAgICAgICAgICB8IHZhbHVlWzZdCisgICsweDAxQzYgfCAwNSAwMCAgICAgICAgICAgICAgICAgICB8IHVpbnQxNl90ICAgfCAweDAwMDUgKDUpICAgICAgICAgICAgICAgICAgICAgfCB2YWx1ZVs3XQorICArMHgwMUM4IHwgMDQgMDAgICAgICAgICAgICAgICAgICAgfCB1aW50MTZfdCAgIHwgMHgwMDA0ICg0KSAgICAgICAgICAgICAgICAgICAgIHwgdmFsdWVbOF0KKworcGFkZGluZzoKKyAgKzB4MDFDQSB8IDAwIDAwICAgICAgICAgICAgICAgICAgIHwgdWludDhfdFsyXSB8IC4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHBhZGRpbmcKKwordGFibGUgKEFubm90YXRlZEJpbmFyeS5CYXopOgorICArMHgwMUNDIHwgM0EgRkYgRkYgRkYgICAgICAgICAgICAgfCBTT2Zmc2V0MzIgIHwgMHhGRkZGRkYzQSAoLTE5OCkgTG9jOiArMHgwMjkyIHwgb2Zmc2V0IHRvIHZ0YWJsZQorICArMHgwMUQwIHwgMDAgMDAgMDAgICAgICAgICAgICAgICAgfCB1aW50OF90WzNdIHwgLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgcGFkZGluZworICArMHgwMUQzIHwgMDMgICAgICAgICAgICAgICAgICAgICAgfCB1aW50OF90ICAgIHwgMHgwMyAoMykgICAgICAgICAgICAgICAgICAgICAgIHwgdGFibGUgZmllbGQgYG1lYWxgIChCeXRlKQorCit2ZWN0b3IgKEFubm90YXRlZEJpbmFyeS5Gb28uYmFycyk6CisgICsweDAxRDQgfCAwMiAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgfCAweDAwMDAwMDAyICgyKSAgICAgICAgICAgICAgICAgfCBsZW5ndGggb2YgdmVjdG9yICgjIGl0ZW1zKQorICArMHgwMUQ4IHwgNDQgMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgIHwgMHgwMDAwMDA0NCAoNjgpIExvYzogKzB4MDIxQyAgIHwgb2Zmc2V0IHRvIHRhYmxlWzBdCisgICsweDAxREMgfCAxMCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgfCAweDAwMDAwMDEwICgxNikgTG9jOiArMHgwMUVDICAgfCBvZmZzZXQgdG8gdGFibGVbMV0KKworcGFkZGluZzoKKyAgKzB4MDFFMCB8IDAwIDAwICAgICAgICAgICAgICAgICAgIHwgdWludDhfdFsyXSB8IC4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHBhZGRpbmcKKwordnRhYmxlIChBbm5vdGF0ZWRCaW5hcnkuQmFyKToKKyAgKzB4MDFFMiB8IDBBIDAwICAgICAgICAgICAgICAgICAgIHwgdWludDE2X3QgICB8IDB4MDAwQSAoMTApICAgICAgICAgICAgICAgICAgICB8IHNpemUgb2YgdGhpcyB2dGFibGUKKyAgKzB4MDFFNCB8IDFBIDAwICAgICAgICAgICAgICAgICAgIHwgdWludDE2X3QgICB8IDB4MDAxQSAoMjYpICAgICAgICAgICAgICAgICAgICB8IHNpemUgb2YgcmVmZXJyaW5nIHRhYmxlCisgICsweDAxRTYgfCAwQyAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgfCAweDAwMEMgKDEyKSAgICAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYGFgIChpZDogMCkKKyAgKzB4MDFFOCB8IDA0IDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICB8IDB4MDAwNCAoNCkgICAgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgYmAgKGlkOiAxKQorICArMHgwMUVBIHwgMDggMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgIHwgMHgwMDA4ICg4KSAgICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBjYCAoaWQ6IDIpCisKK3RhYmxlIChBbm5vdGF0ZWRCaW5hcnkuQmFyKToKKyAgKzB4MDFFQyB8IDBBIDAwIDAwIDAwICAgICAgICAgICAgIHwgU09mZnNldDMyICB8IDB4MDAwMDAwMEEgKDEwKSBMb2M6ICsweDAxRTIgICB8IG9mZnNldCB0byB2dGFibGUKKyAgKzB4MDFGMCB8IDAwIDgwIDIzIDQ0ICAgICAgICAgICAgIHwgZmxvYXQgICAgICB8IDB4NDQyMzgwMDAgKDY1NCkgICAgICAgICAgICAgICB8IHRhYmxlIGZpZWxkIGBiYCAoRmxvYXQpCisgICsweDAxRjQgfCAxOCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgfCAweDAwMDAwMDE4ICgyNCkgTG9jOiArMHgwMjBDICAgfCBvZmZzZXQgdG8gZmllbGQgYGNgICh0YWJsZSkKKyAgKzB4MDFGOCB8IDAwIDAwIDAwIDAwIDAwIEQ4IDhFIDQwIHwgZG91YmxlICAgICB8IDB4NDA4RUQ4MDAwMDAwMDAwMCAoOTg3KSAgICAgICB8IHRhYmxlIGZpZWxkIGBhYCAoRG91YmxlKQorICArMHgwMjAwIHwgMDAgMDAgMDAgMDAgMDAgMDAgICAgICAgfCB1aW50OF90WzZdIHwgLi4uLi4uICAgICAgICAgICAgICAgICAgICAgICAgIHwgcGFkZGluZworCit2dGFibGUgKEFubm90YXRlZEJpbmFyeS5CYXopOgorICArMHgwMjA2IHwgMDYgMDAgICAgICAgICAgICAgICAgICAgfCB1aW50MTZfdCAgIHwgMHgwMDA2ICg2KSAgICAgICAgICAgICAgICAgICAgIHwgc2l6ZSBvZiB0aGlzIHZ0YWJsZQorICArMHgwMjA4IHwgMDYgMDAgICAgICAgICAgICAgICAgICAgfCB1aW50MTZfdCAgIHwgMHgwMDA2ICg2KSAgICAgICAgICAgICAgICAgICAgIHwgc2l6ZSBvZiByZWZlcnJpbmcgdGFibGUKKyAgKzB4MDIwQSB8IDA1IDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICB8IDB4MDAwNSAoNSkgICAgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgbWVhbGAgKGlkOiAwKQorCit0YWJsZSAoQW5ub3RhdGVkQmluYXJ5LkJheik6CisgICsweDAyMEMgfCAwNiAwMCAwMCAwMCAgICAgICAgICAgICB8IFNPZmZzZXQzMiAgfCAweDAwMDAwMDA2ICg2KSBMb2M6ICsweDAyMDYgICAgfCBvZmZzZXQgdG8gdnRhYmxlCisgICsweDAyMTAgfCAwMCAgICAgICAgICAgICAgICAgICAgICB8IHVpbnQ4X3RbMV0gfCAuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBwYWRkaW5nCisgICsweDAyMTEgfCAwMyAgICAgICAgICAgICAgICAgICAgICB8IHVpbnQ4X3QgICAgfCAweDAzICgzKSAgICAgICAgICAgICAgICAgICAgICAgfCB0YWJsZSBmaWVsZCBgbWVhbGAgKEJ5dGUpCisKK3Z0YWJsZSAoQW5ub3RhdGVkQmluYXJ5LkJhcik6CisgICsweDAyMTIgfCAwQSAwMCAgICAgICAgICAgICAgICAgICB8IHVpbnQxNl90ICAgfCAweDAwMEEgKDEwKSAgICAgICAgICAgICAgICAgICAgfCBzaXplIG9mIHRoaXMgdnRhYmxlCisgICsweDAyMTQgfCAxOCAwMCAgICAgICAgICAgICAgICAgICB8IHVpbnQxNl90ICAgfCAweDAwMTggKDI0KSAgICAgICAgICAgICAgICAgICAgfCBzaXplIG9mIHJlZmVycmluZyB0YWJsZQorICArMHgwMjE2IHwgMEMgMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgIHwgMHgwMDBDICgxMikgICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBhYCAoaWQ6IDApCisgICsweDAyMTggfCAwNCAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgfCAweDAwMDQgKDQpICAgICAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYGJgIChpZDogMSkKKyAgKzB4MDIxQSB8IDA4IDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICB8IDB4MDAwOCAoOCkgICAgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgY2AgKGlkOiAyKQorCit0YWJsZSAoQW5ub3RhdGVkQmluYXJ5LkJhcik6CisgICsweDAyMUMgfCAwQSAwMCAwMCAwMCAgICAgICAgICAgICB8IFNPZmZzZXQzMiAgfCAweDAwMDAwMDBBICgxMCkgTG9jOiArMHgwMjEyICAgfCBvZmZzZXQgdG8gdnRhYmxlCisgICsweDAyMjAgfCAwMCAwMCBFNCA0MyAgICAgICAgICAgICB8IGZsb2F0ICAgICAgfCAweDQzRTQwMDAwICg0NTYpICAgICAgICAgICAgICAgfCB0YWJsZSBmaWVsZCBgYmAgKEZsb2F0KQorICArMHgwMjI0IHwgMTAgMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgIHwgMHgwMDAwMDAxMCAoMTYpIExvYzogKzB4MDIzNCAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBjYCAodGFibGUpCisgICsweDAyMjggfCAwMCAwMCAwMCAwMCAwMCBDMCA1RSA0MCB8IGRvdWJsZSAgICAgfCAweDQwNUVDMDAwMDAwMDAwMDAgKDEyMykgICAgICAgfCB0YWJsZSBmaWVsZCBgYWAgKERvdWJsZSkKKyAgKzB4MDIzMCB8IDAwIDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDhfdFs0XSB8IC4uLi4gICAgICAgICAgICAgICAgICAgICAgICAgICB8IHBhZGRpbmcKKwordGFibGUgKEFubm90YXRlZEJpbmFyeS5CYXopOgorICArMHgwMjM0IHwgQTIgRkYgRkYgRkYgICAgICAgICAgICAgfCBTT2Zmc2V0MzIgIHwgMHhGRkZGRkZBMiAoLTk0KSBMb2M6ICsweDAyOTIgIHwgb2Zmc2V0IHRvIHZ0YWJsZQorICArMHgwMjM4IHwgMDAgMDAgMDAgICAgICAgICAgICAgICAgfCB1aW50OF90WzNdIHwgLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgcGFkZGluZworICArMHgwMjNCIHwgMDEgICAgICAgICAgICAgICAgICAgICAgfCB1aW50OF90ICAgIHwgMHgwMSAoMSkgICAgICAgICAgICAgICAgICAgICAgIHwgdGFibGUgZmllbGQgYG1lYWxgIChCeXRlKQorCitzdHJpbmcgKEFubm90YXRlZEJpbmFyeS5Gb28ubmFtZSk6CisgICsweDAyM0MgfCAyRiAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgfCAweDAwMDAwMDJGICg0NykgICAgICAgICAgICAgICAgfCBsZW5ndGggb2Ygc3RyaW5nCisgICsweDAyNDAgfCA1NCA2OCA2OSA3MyAyMCA2OSA3MyAyMCB8IGNoYXJbNDddICAgfCBUaGlzIGlzICAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJpbmcgbGl0ZXJhbAorICArMHgwMjQ4IHwgNjEgMjAgNkMgNkYgNkUgNjcgMjAgNzMgfCAgICAgICAgICAgIHwgYSBsb25nIHMKKyAgKzB4MDI1MCB8IDc0IDcyIDY5IDZFIDY3IDIwIDc0IDZGIHwgICAgICAgICAgICB8IHRyaW5nIHRvCisgICsweDAyNTggfCAyMCA3MyA2OCA2RiA3NyAyMCA2OCA2RiB8ICAgICAgICAgICAgfCAgc2hvdyBobworICArMHgwMjYwIHwgNzcgMjAgNjkgNzQgMjAgNjIgNzIgNjUgfCAgICAgICAgICAgIHwgdyBpdCBicmUKKyAgKzB4MDI2OCB8IDYxIDZCIDczIDIwIDc1IDcwIDJFICAgIHwgICAgICAgICAgICB8IGFrcyB1cC4KKyAgKzB4MDI2RiB8IDAwICAgICAgICAgICAgICAgICAgICAgIHwgY2hhciAgICAgICB8IDB4MDAgKDApICAgICAgICAgICAgICAgICAgICAgICB8IHN0cmluZyB0ZXJtaW5hdG9yCisKK3BhZGRpbmc6CisgICsweDAyNzAgfCAwMCAwMCAgICAgICAgICAgICAgICAgICB8IHVpbnQ4X3RbMl0gfCAuLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBwYWRkaW5nCisKK3Z0YWJsZSAoQW5ub3RhdGVkQmluYXJ5LkJhcik6CisgICsweDAyNzIgfCAwQSAwMCAgICAgICAgICAgICAgICAgICB8IHVpbnQxNl90ICAgfCAweDAwMEEgKDEwKSAgICAgICAgICAgICAgICAgICAgfCBzaXplIG9mIHRoaXMgdnRhYmxlCisgICsweDAyNzQgfCAxNiAwMCAgICAgICAgICAgICAgICAgICB8IHVpbnQxNl90ICAgfCAweDAwMTYgKDIyKSAgICAgICAgICAgICAgICAgICAgfCBzaXplIG9mIHJlZmVycmluZyB0YWJsZQorICArMHgwMjc2IHwgMEMgMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgIHwgMHgwMDBDICgxMikgICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBhYCAoaWQ6IDApCisgICsweDAyNzggfCAwNCAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgfCAweDAwMDQgKDQpICAgICAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYGJgIChpZDogMSkKKyAgKzB4MDI3QSB8IDA4IDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICB8IDB4MDAwOCAoOCkgICAgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgY2AgKGlkOiAyKQorCit0YWJsZSAoQW5ub3RhdGVkQmluYXJ5LkJhcik6CisgICsweDAyN0MgfCAwQSAwMCAwMCAwMCAgICAgICAgICAgICB8IFNPZmZzZXQzMiAgfCAweDAwMDAwMDBBICgxMCkgTG9jOiArMHgwMjcyICAgfCBvZmZzZXQgdG8gdnRhYmxlCisgICsweDAyODAgfCA2NSAyMCA3MSA0OSAgICAgICAgICAgICB8IGZsb2F0ICAgICAgfCAweDQ5NzEyMDY1ICg5ODc2NTQpICAgICAgICAgICAgfCB0YWJsZSBmaWVsZCBgYmAgKEZsb2F0KQorICArMHgwMjg0IHwgMTQgMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgIHwgMHgwMDAwMDAxNCAoMjApIExvYzogKzB4MDI5OCAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBjYCAodGFibGUpCisgICsweDAyODggfCBDOSA3NiBCRSA5RiAwQyAyNCBGRSA0MCB8IGRvdWJsZSAgICAgfCAweDQwRkUyNDBDOUZCRTc2QzkgKDEyMzQ1NykgICAgfCB0YWJsZSBmaWVsZCBgYWAgKERvdWJsZSkKKyAgKzB4MDI5MCB8IDAwIDAwICAgICAgICAgICAgICAgICAgIHwgdWludDhfdFsyXSB8IC4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHBhZGRpbmcKKwordnRhYmxlIChBbm5vdGF0ZWRCaW5hcnkuQmF6KToKKyAgKzB4MDI5MiB8IDA2IDAwICAgICAgICAgICAgICAgICAgIHwgdWludDE2X3QgICB8IDB4MDAwNiAoNikgICAgICAgICAgICAgICAgICAgICB8IHNpemUgb2YgdGhpcyB2dGFibGUKKyAgKzB4MDI5NCB8IDA4IDAwICAgICAgICAgICAgICAgICAgIHwgdWludDE2X3QgICB8IDB4MDAwOCAoOCkgICAgICAgICAgICAgICAgICAgICB8IHNpemUgb2YgcmVmZXJyaW5nIHRhYmxlCisgICsweDAyOTYgfCAwNyAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgfCAweDAwMDcgKDcpICAgICAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYG1lYWxgIChpZDogMCkKKwordGFibGUgKEFubm90YXRlZEJpbmFyeS5CYXopOgorICArMHgwMjk4IHwgMDYgMDAgMDAgMDAgICAgICAgICAgICAgfCBTT2Zmc2V0MzIgIHwgMHgwMDAwMDAwNiAoNikgTG9jOiArMHgwMjkyICAgIHwgb2Zmc2V0IHRvIHZ0YWJsZQorICArMHgwMjlDIHwgMDAgMDAgMDAgICAgICAgICAgICAgICAgfCB1aW50OF90WzNdIHwgLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgcGFkZGluZworICArMHgwMjlGIHwgMDEgICAgICAgICAgICAgICAgICAgICAgfCB1aW50OF90ICAgIHwgMHgwMSAoMSkgICAgICAgICAgICAgICAgICAgICAgIHwgdGFibGUgZmllbGQgYG1lYWxgIChCeXRlKQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvYW5ub3RhdGVkX2JpbmFyeS9hbm5vdGF0ZWRfYmluYXJ5LmJmYnMgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9hbm5vdGF0ZWRfYmluYXJ5L2Fubm90YXRlZF9iaW5hcnkuYmZicwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNGNmNDE5Ci0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvYW5ub3RhdGVkX2JpbmFyeS9hbm5vdGF0ZWRfYmluYXJ5LmJmYnMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvYW5ub3RhdGVkX2JpbmFyeS9hbm5vdGF0ZWRfYmluYXJ5LmJpbiBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL2Fubm90YXRlZF9iaW5hcnkvYW5ub3RhdGVkX2JpbmFyeS5iaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjU1N2FhZgotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL2Fubm90YXRlZF9iaW5hcnkvYW5ub3RhdGVkX2JpbmFyeS5iaW4KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvYW5ub3RhdGVkX2JpbmFyeS9hbm5vdGF0ZWRfYmluYXJ5LmZicyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL2Fubm90YXRlZF9iaW5hcnkvYW5ub3RhdGVkX2JpbmFyeS5mYnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjBlMzIwZgotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL2Fubm90YXRlZF9iaW5hcnkvYW5ub3RhdGVkX2JpbmFyeS5mYnMKQEAgLTAsMCArMSw5MiBAQAorbmFtZXNwYWNlIEFubm90YXRlZEJpbmFyeTsKKworZW51bSBGb29kIDogYnl0ZSB7CisgIE5vbmUgPSAwLAorICBBcHBsZSA9IDEsCisgIEJhbmFuYSA9IDIsCisgIEtpd2kgPSAzLAorfQorCit0YWJsZSBCYXogeworICBtZWFsOkZvb2QgPSBCYW5hbmE7Cit9CisKK3RhYmxlIEJhciB7CisgIGE6ZG91YmxlID0gMy4xNDsKKyAgYjpmbG9hdCA9IDEuNjg7CisgIGM6QmF6OworfQorCit1bmlvbiBCYXJCYXogeworICBCYXIsIEJhegorfQorCit1bmlvbiBNZWFzdXJlbWVudCB7CisgIFRvbGVyYW5jZSwgRGltZW5zaW9uCit9CisKK3N0cnVjdCBUb2xlcmFuY2UgeworICB3aWR0aDp1aW50ODsKK30KKwordW5pb24gQW55IHsKKyAgQmFyLCBUb2xlcmFuY2UKK30KKworc3RydWN0IERpbWVuc2lvbiB7CisgIHZhbHVlczpbaW50OjNdOworICB0b2xlcmFuY2VzOltUb2xlcmFuY2U6M107Cit9CisKK3N0cnVjdCBCdWlsZGluZyB7CisgIGZsb29yczppbnQ7CisgIGRvb3JzOmludDsKKyAgd2luZG93czppbnQ7CisgIGRpbWVuc2lvbnM6RGltZW5zaW9uOworfQorCitzdHJ1Y3QgTG9jYXRpb24geworICBsYXRpdHVkZTpkb3VibGU7CisgIGxvbmdpdHVkZTpkb3VibGU7Cit9CisKK3RhYmxlIEZvbyB7CisgIGNvdW50ZXI6aW50OworICBoZWFsdGh5OmJvb2w7CisgIGxldmVsOmxvbmcgPSA5OTsKKyAgbWVhbDpGb29kID0gQXBwbGU7CisgIGJhcjpCYXI7CisgIGhvbWU6QnVpbGRpbmc7CisgIG5hbWU6c3RyaW5nOworICAvLyBWZWN0b3Igb2YgdGFibGVzCisgIGJhcnM6W0Jhcl07CisgIC8vIFVuaW9uIG9mIHRhYmxlcworICBiYXJfYmF6OkJhckJhejsKKyAgLy8gVmVjdG9yIG9mIFNjYWxhcnMKKyAgYWNjb3VudHM6W3VpbnQxNl07CisgIGJvYjpzdHJpbmc7CisgIGFsaWNlOnN0cmluZzsKKyAgLy8gT3B0aW9uYWwgU2NhbGFycworICBtYXliZV9pMzI6IGludDMyID0gbnVsbDsKKyAgZGVmYXVsdF9pMzI6IGludDMyID0gNDI7CisgIGp1c3RfaTMyOiBpbnQzMjsKKyAgLy8gVmVjdG9yIG9mIHN0cmluZ3MKKyAgbmFtZXM6W3N0cmluZ107CisgIC8vIFZlY3RvciBvZiBzdHJ1Y3RzCisgIHBvaW50c19vZl9pbnRlcmVzdDpbTG9jYXRpb25dOworICAvLyBWZWN0b3Igb2YgdW5pb25zCisgIGZvb2JhcnM6W0JhckJhel07CisgIC8vIFVuaW9uIG9mIHN0cnVjdHMKKyAgbWVhc3VyZW1lbnQ6TWVhc3VyZW1lbnQ7CisgIC8vIFVuaW9uIG9mIHN0cnVjdC90YWJsZQorICBhbnl0aGluZzpBbnk7CisgIC8vIERlZmF1bHQgZmxvYXRpbmcgcG9pbnQKKyAgdGVtcGVyYXR1cmU6ZmxvYXQ9OTguNjsKKyAgLy8gTm90IHByZXNlbnQgb2JqZWN0CisgIHRlZXRvdGFsZXI6QmFyOworICBjaGFybGllOnN0cmluZzsKK30KKworZmlsZV9pZGVudGlmaWVyICJBTk5PIjsKKworcm9vdF90eXBlIEZvbzsKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9hbm5vdGF0ZWRfYmluYXJ5L2Fubm90YXRlZF9iaW5hcnkuanNvbiBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL2Fubm90YXRlZF9iaW5hcnkvYW5ub3RhdGVkX2JpbmFyeS5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc0NGUyNzQKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9hbm5vdGF0ZWRfYmluYXJ5L2Fubm90YXRlZF9iaW5hcnkuanNvbgpAQCAtMCwwICsxLDEyNCBAQAoreworICAgICJjb3VudGVyIjogMTIzNCwKKyAgICAiaGVhbHRoeSI6IHRydWUsCisgICAgIm1lYWwiOiAiQmFuYW5hIiwKKyAgICAiYmFyIjogeworICAgICAgICAiYSI6IDEyMzQ1Ni43ODksCisgICAgICAgICJiIjogOTg3NjU0LjMyMSwKKyAgICAgICAgImMiOiB7CisgICAgICAgICAgICAibWVhbCI6ICJBcHBsZSIKKyAgICAgICAgfQorICAgIH0sCisgICAgImhvbWUiOiB7CisgICAgICAgICJmbG9vcnMiOiAxLAorICAgICAgICAiZG9vcnMiOiAyLAorICAgICAgICAid2luZG93cyI6IDEyLAorICAgICAgICAiZGltZW5zaW9ucyI6IHsKKyAgICAgICAgICAgICJ2YWx1ZXMiOiBbCisgICAgICAgICAgICAgICAgMTAsCisgICAgICAgICAgICAgICAgMTIsCisgICAgICAgICAgICAgICAgMjAKKyAgICAgICAgICAgIF0sCisgICAgICAgICAgICAidG9sZXJhbmNlcyI6IFsKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICJ3aWR0aCI6IDEKKyAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgIndpZHRoIjogMgorICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAid2lkdGgiOiAzCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgXQorICAgICAgICB9CisgICAgfSwKKyAgICAibmFtZSI6ICJUaGlzIGlzIGEgbG9uZyBzdHJpbmcgdG8gc2hvdyBob3cgaXQgYnJlYWtzIHVwLiIsCisgICAgImJhcnMiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAgICJhIjogMTIzLAorICAgICAgICAgICAgImIiOiA0NTYsCisgICAgICAgICAgICAiYyI6IHsKKyAgICAgICAgICAgICAgICAibWVhbCI6ICJBcHBsZSIKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImEiOiA5ODcsCisgICAgICAgICAgICAiYiI6IDY1NCwKKyAgICAgICAgICAgICJjIjogeworICAgICAgICAgICAgICAgICJtZWFsIjogIktpd2kiCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICBdLAorICAgICJiYXJfYmF6X3R5cGUiOiAiQmF6IiwKKyAgICAiYmFyX2JheiI6IHsKKyAgICAgICAgIm1lYWwiOiAiS2l3aSIKKyAgICB9LAorICAgICJhY2NvdW50cyI6IFsKKyAgICAgICAgOSwKKyAgICAgICAgOCwKKyAgICAgICAgNywKKyAgICAgICAgMSwKKyAgICAgICAgMiwKKyAgICAgICAgMywKKyAgICAgICAgNiwKKyAgICAgICAgNSwKKyAgICAgICAgNCwKKyAgICBdLAorICAgIC8vIFVzZSB0aGUgc2FtZSBzdHJpbmcgdG8gc2hvdyBzaGFyZWQgc3RyaW5nIHN1cHBvcnQKKyAgICAiYm9iIjogImNoYXJsaWUiLAorICAgICJhbGljZSI6ICJjaGFybGllIiwKKyAgICAianVzdF9pMzIiOiAxMywKKyAgICAibmFtZXMiOiBbCisgICAgICAgICJhbGljZSIsCisgICAgICAgICJib2IiLAorICAgICAgICAiY2hhcmxpZSIKKyAgICBdLAorICAgICJwb2ludHNfb2ZfaW50ZXJlc3QiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAgICJsYXRpdHVkZSI6IDQzLjI3NSwKKyAgICAgICAgICAgICJsb25naXR1ZGUiOiAtNzguMTE0OTkwCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJsYXRpdHVkZSI6IDM3LjQyMjAwMSwKKyAgICAgICAgICAgICJsb25naXR1ZGUiOiAtMTIyLjA4NDA2MQorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAibGF0aXR1ZGUiOiAtNTQuNDIwNzkyLAorICAgICAgICAgICAgImxvbmdpdHVkZSI6IDMuMzQ2NDUwCisgICAgICAgIH0KKyAgICBdLAorICAgICJmb29iYXJzX3R5cGUiOiBbCisgICAgICAgICJCYXIiLAorICAgICAgICAiQmF6IiwKKyAgICAgICAgIkJhciIKKyAgICBdLAorICAgICJmb29iYXJzIiA6IFsKKyAgICAgICAgeworICAgICAgICAgICAgImEiOiAxMjMsCisgICAgICAgICAgICAiYiI6IDQ1NiwKKyAgICAgICAgICAgICJjIjogeworICAgICAgICAgICAgICAgICJtZWFsIjogIkFwcGxlIgorICAgICAgICAgICAgfSAgICAgICAgICAgIAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICJtZWFsIjogIkJhbmFuYSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImEiOiA5ODcsCisgICAgICAgICAgICAiYiI6IDY1NCwKKyAgICAgICAgICAgICJjIjogeworICAgICAgICAgICAgICAgICJtZWFsIjogIktpd2kiCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICBdLAorICAgICJtZWFzdXJlbWVudF90eXBlIjogIlRvbGVyYW5jZSIsCisgICAgIm1lYXN1cmVtZW50IjogeworICAgICAgICAid2lkdGgiOiA1CisgICAgfSwKKyAgICAiYW55dGhpbmdfdHlwZSI6ICJCYXIiLAorICAgICJhbnl0aGluZyI6ICB7CisgICAgICAgICJhIjogMzIxLAorICAgICAgICAiYiI6IDY1NAorICAgIH0sCisgICAgImNoYXJsaWUiOiAiYWxpY2UiCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvYW5ub3RhdGVkX2JpbmFyeS9hbm5vdGF0ZWRfYmluYXJ5X29sZC5hZmIgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9hbm5vdGF0ZWRfYmluYXJ5L2Fubm90YXRlZF9iaW5hcnlfb2xkLmFmYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YTBlNWIwCi0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvYW5ub3RhdGVkX2JpbmFyeS9hbm5vdGF0ZWRfYmluYXJ5X29sZC5hZmIKQEAgLTAsMCArMSwyOTMgQEAKKy8vIEFubm90YXRlZCBGbGF0YnVmZmVyIEJpbmFyeQorLy8KKy8vIFNjaGVtYSBmaWxlOiBhbm5vdGF0ZWRfYmluYXJ5X29sZC5mYnMKKy8vIEJpbmFyeSBmaWxlOiBhbm5vdGF0ZWRfYmluYXJ5LmJpbgorCitoZWFkZXI6CisgICsweDAwMDAgfCA0NCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgICB8IDB4MDAwMDAwNDQgKDY4KSBMb2M6ICsweDAwNDQgICAgICAgfCBvZmZzZXQgdG8gcm9vdCB0YWJsZSBgQW5ub3RhdGVkQmluYXJ5LkZvb2AKKyAgKzB4MDAwNCB8IDQxIDRFIDRFIDRGICAgICAgICAgICAgIHwgY2hhcls0XSAgICAgIHwgQU5OTyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEZpbGUgSWRlbnRpZmllcgorCitwYWRkaW5nOgorICArMHgwMDA4IHwgMDAgMDAgICAgICAgICAgICAgICAgICAgfCB1aW50OF90WzJdICAgfCAuLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgcGFkZGluZworCit2dGFibGUgKEFubm90YXRlZEJpbmFyeS5Gb28pOgorICArMHgwMDBBIHwgM0EgMDAgICAgICAgICAgICAgICAgICAgfCB1aW50MTZfdCAgICAgfCAweDAwM0EgKDU4KSAgICAgICAgICAgICAgICAgICAgICAgIHwgc2l6ZSBvZiB0aGlzIHZ0YWJsZQorICArMHgwMDBDIHwgNjggMDAgICAgICAgICAgICAgICAgICAgfCB1aW50MTZfdCAgICAgfCAweDAwNjggKDEwNCkgICAgICAgICAgICAgICAgICAgICAgIHwgc2l6ZSBvZiByZWZlcnJpbmcgdGFibGUKKyAgKzB4MDAwRSB8IDBDIDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgIHwgMHgwMDBDICgxMikgICAgICAgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgY291bnRlcmAgKGlkOiAwKQorICArMHgwMDEwIHwgMDcgMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgICAgfCAweDAwMDcgKDcpICAgICAgICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBoZWFsdGh5YCAoaWQ6IDEpCisgICsweDAwMTIgfCAwMCAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgICB8IDB4MDAwMCAoMCkgICAgICAgICAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYGxldmVsYCAoaWQ6IDIpIDxkZWZhdWx0cyB0byA5OT4gKExvbmcpCisgICsweDAwMTQgfCAwOCAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgICB8IDB4MDAwOCAoOCkgICAgICAgICAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYG1lYWxgIChpZDogMykKKyAgKzB4MDAxNiB8IDEwIDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgIHwgMHgwMDEwICgxNikgICAgICAgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgYmFyYCAoaWQ6IDQpCisgICsweDAwMTggfCAxNCAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgICB8IDB4MDAxNCAoMjApICAgICAgICAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYGhvbWVgIChpZDogNSkKKyAgKzB4MDAxQSB8IDMwIDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgIHwgMHgwMDMwICg0OCkgICAgICAgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgbmFtZWAgKGlkOiA2KQorICArMHgwMDFDIHwgMzQgMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgICAgfCAweDAwMzQgKDUyKSAgICAgICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBiYXJzYCAoaWQ6IDcpCisgICsweDAwMUUgfCAwOSAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgICB8IDB4MDAwOSAoOSkgICAgICAgICAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYGJhcl9iYXpfdHlwZWAgKGlkOiA4KQorICArMHgwMDIwIHwgMzggMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgICAgfCAweDAwMzggKDU2KSAgICAgICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBiYXJfYmF6YCAoaWQ6IDkpCisgICsweDAwMjIgfCAzQyAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgICB8IDB4MDAzQyAoNjApICAgICAgICAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYGFjY291bnRzYCAoaWQ6IDEwKQorICArMHgwMDI0IHwgNDAgMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgICAgfCAweDAwNDAgKDY0KSAgICAgICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBib2JgIChpZDogMTEpCisgICsweDAwMjYgfCA0NCAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgICB8IDB4MDA0NCAoNjgpICAgICAgICAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYGFsaWNlYCAoaWQ6IDEyKQorICArMHgwMDI4IHwgMDAgMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgICAgfCAweDAwMDAgKDApICAgICAgICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBtYXliZV9pMzJgIChpZDogMTMpIDxkZWZhdWx0cyB0byAwPiAoSW50KQorICArMHgwMDJBIHwgMDAgMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgICAgfCAweDAwMDAgKDApICAgICAgICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBkZWZhdWx0X2kzMmAgKGlkOiAxNCkgPGRlZmF1bHRzIHRvIDQyPiAoSW50KQorICArMHgwMDJDIHwgNDggMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgICAgfCAweDAwNDggKDcyKSAgICAgICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBqdXN0X2kzMmAgKGlkOiAxNSkKKyAgKzB4MDAyRSB8IDRDIDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgIHwgMHgwMDRDICg3NikgICAgICAgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgbmFtZXNgIChpZDogMTYpCisgICsweDAwMzAgfCA1MCAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgICB8IDB4MDA1MCAoODApICAgICAgICAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYHBvaW50c19vZl9pbnRlcmVzdGAgKGlkOiAxNykKKyAgKzB4MDAzMiB8IDU0IDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgIHwgMHgwMDU0ICg4NCkgICAgICAgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgZm9vYmFyc190eXBlYCAoaWQ6IDE4KQorICArMHgwMDM0IHwgNTggMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgICAgfCAweDAwNTggKDg4KSAgICAgICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBmb29iYXJzYCAoaWQ6IDE5KQorICArMHgwMDM2IHwgMEEgMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgICAgfCAweDAwMEEgKDEwKSAgICAgICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBtZWFzdXJlbWVudF90eXBlYCAoaWQ6IDIwKQorICArMHgwMDM4IHwgNUMgMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgICAgfCAweDAwNUMgKDkyKSAgICAgICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBtZWFzdXJlbWVudGAgKGlkOiAyMSkKKyAgKzB4MDAzQSB8IDBCIDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgIHwgMHgwMDBCICgxMSkgICAgICAgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgYW55dGhpbmdfdHlwZWAgKGlkOiAyMikKKyAgKzB4MDAzQyB8IDYwIDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgIHwgMHgwMDYwICg5NikgICAgICAgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgYW55dGhpbmdgIChpZDogMjMpCisgICsweDAwM0UgfCAwMCAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgICB8IDB4MDAwMCAoMCkgICAgICAgICAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYHRlbXBlcmF0dXJlYCAoaWQ6IDI0KSA8ZGVmYXVsdHMgdG8gOTguNjAwMDAwPiAoRmxvYXQpCisgICsweDAwNDAgfCAwMCAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgICB8IDB4MDAwMCAoMCkgICAgICAgICAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYHRlZXRvdGFsZXJgIChpZDogMjUpIDxudWxsPiAoT2JqKQorICArMHgwMDQyIHwgNjQgMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgICAgfCAweDAwNjQgKDEwMCkgICAgICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIHVua25vd24gZmllbGQgKGlkOiAyNikKKworcm9vdF90YWJsZSAoQW5ub3RhdGVkQmluYXJ5LkZvbyk6CisgICsweDAwNDQgfCAzQSAwMCAwMCAwMCAgICAgICAgICAgICB8IFNPZmZzZXQzMiAgICB8IDB4MDAwMDAwM0EgKDU4KSBMb2M6ICsweDAwMEEgICAgICAgfCBvZmZzZXQgdG8gdnRhYmxlCisgICsweDAwNDggfCAwMCAwMCAwMCAgICAgICAgICAgICAgICB8IHVpbnQ4X3RbM10gICB8IC4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBwYWRkaW5nCisgICsweDAwNEIgfCAwMSAgICAgICAgICAgICAgICAgICAgICB8IHVpbnQ4X3QgICAgICB8IDB4MDEgKDEpICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB0YWJsZSBmaWVsZCBgaGVhbHRoeWAgKEJvb2wpCisgICsweDAwNEMgfCAwMiAgICAgICAgICAgICAgICAgICAgICB8IHVpbnQ4X3QgICAgICB8IDB4MDIgKDIpICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB0YWJsZSBmaWVsZCBgbWVhbGAgKEJ5dGUpCisgICsweDAwNEQgfCAwMiAgICAgICAgICAgICAgICAgICAgICB8IHVpbnQ4X3QgICAgICB8IDB4MDIgKDIpICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB0YWJsZSBmaWVsZCBgYmFyX2Jhel90eXBlYCAoVVR5cGUpCisgICsweDAwNEUgfCAwMSAgICAgICAgICAgICAgICAgICAgICB8IHVpbnQ4X3QgICAgICB8IDB4MDEgKDEpICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB0YWJsZSBmaWVsZCBgbWVhc3VyZW1lbnRfdHlwZWAgKFVUeXBlKQorICArMHgwMDRGIHwgMDEgICAgICAgICAgICAgICAgICAgICAgfCB1aW50OF90ICAgICAgfCAweDAxICgxKSAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgdGFibGUgZmllbGQgYGFueXRoaW5nX3R5cGVgIChVVHlwZSkKKyAgKzB4MDA1MCB8IEQyIDA0IDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgIHwgMHgwMDAwMDREMiAoMTIzNCkgICAgICAgICAgICAgICAgICB8IHRhYmxlIGZpZWxkIGBjb3VudGVyYCAoSW50KQorICArMHgwMDU0IHwgMjggMDIgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICAgfCAweDAwMDAwMjI4ICg1NTIpIExvYzogKzB4MDI3QyAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBiYXJgCisgICsweDAwNTggfCAwMSAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgICB8IDB4MDAwMDAwMDEgKDEpICAgICAgICAgICAgICAgICAgICAgfCBzdHJ1Y3QgZmllbGQgYEFubm90YXRlZEJpbmFyeS5CdWlsZGluZy5mbG9vcnNgIChJbnQpCisgICsweDAwNUMgfCAwMiAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgICB8IDB4MDAwMDAwMDIgKDIpICAgICAgICAgICAgICAgICAgICAgfCBzdHJ1Y3QgZmllbGQgYEFubm90YXRlZEJpbmFyeS5CdWlsZGluZy5kb29yc2AgKEludCkKKyAgKzB4MDA2MCB8IDBDIDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgIHwgMHgwMDAwMDAwQyAoMTIpICAgICAgICAgICAgICAgICAgICB8IHN0cnVjdCBmaWVsZCBgQW5ub3RhdGVkQmluYXJ5LkJ1aWxkaW5nLndpbmRvd3NgIChJbnQpCisgICsweDAwNjQgfCAwQSAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgICB8IDB4MDAwMDAwMEEgKDEwKSAgICAgICAgICAgICAgICAgICAgfCBhcnJheSBmaWVsZCBgQW5ub3RhdGVkQmluYXJ5LkRpbWVuc2lvbi52YWx1ZXNbMF1gIChJbnQpCisgICsweDAwNjggfCAwQyAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgICB8IDB4MDAwMDAwMEMgKDEyKSAgICAgICAgICAgICAgICAgICAgfCBhcnJheSBmaWVsZCBgQW5ub3RhdGVkQmluYXJ5LkRpbWVuc2lvbi52YWx1ZXNbMV1gIChJbnQpCisgICsweDAwNkMgfCAxNCAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgICB8IDB4MDAwMDAwMTQgKDIwKSAgICAgICAgICAgICAgICAgICAgfCBhcnJheSBmaWVsZCBgQW5ub3RhdGVkQmluYXJ5LkRpbWVuc2lvbi52YWx1ZXNbMl1gIChJbnQpCisgICsweDAwNzAgfCAwMSAgICAgICAgICAgICAgICAgICAgICB8IHVpbnQ4X3QgICAgICB8IDB4MDEgKDEpICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJ1Y3QgZmllbGQgYEFubm90YXRlZEJpbmFyeS5Ub2xlcmFuY2Uud2lkdGhgIChVQnl0ZSkKKyAgKzB4MDA3MSB8IDAyICAgICAgICAgICAgICAgICAgICAgIHwgdWludDhfdCAgICAgIHwgMHgwMiAoMikgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHN0cnVjdCBmaWVsZCBgQW5ub3RhdGVkQmluYXJ5LlRvbGVyYW5jZS53aWR0aGAgKFVCeXRlKQorICArMHgwMDcyIHwgMDMgICAgICAgICAgICAgICAgICAgICAgfCB1aW50OF90ICAgICAgfCAweDAzICgzKSAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc3RydWN0IGZpZWxkIGBBbm5vdGF0ZWRCaW5hcnkuVG9sZXJhbmNlLndpZHRoYCAoVUJ5dGUpCisgICsweDAwNzMgfCAwMCAgICAgICAgICAgICAgICAgICAgICB8IHVpbnQ4X3RbMV0gICB8IC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBwYWRkaW5nCisgICsweDAwNzQgfCBDOCAwMSAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgICB8IDB4MDAwMDAxQzggKDQ1NikgTG9jOiArMHgwMjNDICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYG5hbWVgCisgICsweDAwNzggfCA1QyAwMSAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgICB8IDB4MDAwMDAxNUMgKDM0OCkgTG9jOiArMHgwMUQ0ICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYGJhcnNgCisgICsweDAwN0MgfCA1MCAwMSAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgICB8IDB4MDAwMDAxNTAgKDMzNikgTG9jOiArMHgwMUNDICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYGJhcl9iYXpgICh1bmlvbiBvZiB0eXBlIGBCYXpgKQorICArMHgwMDgwIHwgMzQgMDEgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICAgfCAweDAwMDAwMTM0ICgzMDgpIExvYzogKzB4MDFCNCAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBhY2NvdW50c2AKKyAgKzB4MDA4NCB8IDI0IDAxIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgIHwgMHgwMDAwMDEyNCAoMjkyKSBMb2M6ICsweDAxQTggICAgICB8IG9mZnNldCB0byBmaWVsZCBgYm9iYAorICArMHgwMDg4IHwgMTQgMDEgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICAgfCAweDAwMDAwMTE0ICgyNzYpIExvYzogKzB4MDE5QyAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBhbGljZWAKKyAgKzB4MDA4QyB8IDBEIDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgIHwgMHgwMDAwMDAwRCAoMTMpICAgICAgICAgICAgICAgICAgICB8IHRhYmxlIGZpZWxkIGBqdXN0X2kzMmAgKEludCkKKyAgKzB4MDA5MCB8IERDIDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgIHwgMHgwMDAwMDBEQyAoMjIwKSBMb2M6ICsweDAxNkMgICAgICB8IG9mZnNldCB0byBmaWVsZCBgbmFtZXNgCisgICsweDAwOTQgfCBBMCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgICB8IDB4MDAwMDAwQTAgKDE2MCkgTG9jOiArMHgwMTM0ICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYHBvaW50c19vZl9pbnRlcmVzdGAKKyAgKzB4MDA5OCB8IDk0IDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgIHwgMHgwMDAwMDA5NCAoMTQ4KSBMb2M6ICsweDAxMkMgICAgICB8IG9mZnNldCB0byBmaWVsZCBgZm9vYmFyc190eXBlYAorICArMHgwMDlDIHwgMzggMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICAgfCAweDAwMDAwMDM4ICg1NikgTG9jOiArMHgwMEQ0ICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBmb29iYXJzYAorICArMHgwMEEwIHwgMzMgMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICAgfCAweDAwMDAwMDMzICg1MSkgTG9jOiArMHgwMEQzICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBtZWFzdXJlbWVudGAgKHVuaW9uIG9mIHR5cGUgYFRvbGVyYW5jZWApCisgICsweDAwQTQgfCAxQyAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgICB8IDB4MDAwMDAwMUMgKDI4KSBMb2M6ICsweDAwQzAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYGFueXRoaW5nYCAodW5pb24gb2YgdHlwZSBgQmFyYCkKKyAgKzB4MDBBOCB8IDA0IDAwIDAwIDAwICAgICAgICAgICAgIHwgP3VpbnQ4X3RbNF0gIHwgLi4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFVua25vd24gZmllbGQgPHBvc3NpYmx5IGFuIG9mZnNldD8gQ2hlY2sgTG9jOiArMHgwMDAwMDBBQz4KKwordW5rbm93biAobm8ga25vd24gcmVmZXJlbmNlcyk6CisgICsweDAwQUMgfCAwNSAwMCAwMCAwMCA2MSA2QyA2OSA2MyB8ID91aW50OF90WzEyXSB8IC4uLi5hbGljICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBXQVJOOiBub3RoaW5nIHJlZmVycyB0byB0aGlzLiBDaGVjayBpZiBhbnkgYFVua293biBGaWVsZGBzIHBvaW50IHRvIHRoaXMuCisgICsweDAwQjQgfCA2NSAwMCAwMCAwMCAgICAgICAgICAgICB8ICAgICAgICAgICAgICB8IGUuLi4KKwordnRhYmxlIChBbm5vdGF0ZWRCaW5hcnkuQmFyKToKKyAgKzB4MDBCOCB8IDA4IDAwICAgICAgICAgICAgICAgICAgIHwgdWludDE2X3QgICAgIHwgMHgwMDA4ICg4KSAgICAgICAgICAgICAgICAgICAgICAgICB8IHNpemUgb2YgdGhpcyB2dGFibGUKKyAgKzB4MDBCQSB8IDEzIDAwICAgICAgICAgICAgICAgICAgIHwgdWludDE2X3QgICAgIHwgMHgwMDEzICgxOSkgICAgICAgICAgICAgICAgICAgICAgICB8IHNpemUgb2YgcmVmZXJyaW5nIHRhYmxlCisgICsweDAwQkMgfCAwOCAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgICB8IDB4MDAwOCAoOCkgICAgICAgICAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYGFgIChpZDogMCkKKyAgKzB4MDBCRSB8IDA0IDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgIHwgMHgwMDA0ICg0KSAgICAgICAgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgYmAgKGlkOiAxKQorCit0YWJsZSAoQW5ub3RhdGVkQmluYXJ5LkJhcik6CisgICsweDAwQzAgfCAwOCAwMCAwMCAwMCAgICAgICAgICAgICB8IFNPZmZzZXQzMiAgICB8IDB4MDAwMDAwMDggKDgpIExvYzogKzB4MDBCOCAgICAgICAgfCBvZmZzZXQgdG8gdnRhYmxlCisgICsweDAwQzQgfCAwMCA4MCAyMyA0NCAgICAgICAgICAgICB8IGZsb2F0ICAgICAgICB8IDB4NDQyMzgwMDAgKDY1NC4wMDAwMDApICAgICAgICAgICAgfCB0YWJsZSBmaWVsZCBgYmAgKEZsb2F0KQorICArMHgwMEM4IHwgMDAgMDAgMDAgMDAgMDAgMTAgNzQgNDAgfCBkb3VibGUgICAgICAgfCAweDQwNzQxMDAwMDAwMDAwMDAgKDMyMS4wMDAwMDApICAgIHwgdGFibGUgZmllbGQgYGFgIChEb3VibGUpCisgICsweDAwRDAgfCAwMCAwMCAwMCAgICAgICAgICAgICAgICB8IHVpbnQ4X3RbM10gICB8IC4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBwYWRkaW5nCisKK3VuaW9uIChBbm5vdGF0ZWRCaW5hcnkuVG9sZXJhbmNlLm1lYXN1cmVtZW50KToKKyAgKzB4MDBEMyB8IDA1ICAgICAgICAgICAgICAgICAgICAgIHwgdWludDhfdCAgICAgIHwgMHgwNSAoNSkgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHN0cnVjdCBmaWVsZCBgQW5ub3RhdGVkQmluYXJ5LlRvbGVyYW5jZS53aWR0aGAgKFVCeXRlKQorCit2ZWN0b3IgKEFubm90YXRlZEJpbmFyeS5Gb28uZm9vYmFycyk6CisgICsweDAwRDQgfCAwMyAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgICB8IDB4MDAwMDAwMDMgKDMpICAgICAgICAgICAgICAgICAgICAgfCBsZW5ndGggb2YgdmVjdG9yICgjIGl0ZW1zKQorICArMHgwMEQ4IHwgMzQgMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICAgfCAweDAwMDAwMDM0ICg1MikgTG9jOiArMHgwMTBDICAgICAgIHwgb2Zmc2V0IHRvIHVuaW9uWzBdIChgQmFyYCkKKyAgKzB4MDBEQyB8IDJDIDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgIHwgMHgwMDAwMDAyQyAoNDQpIExvYzogKzB4MDEwOCAgICAgICB8IG9mZnNldCB0byB1bmlvblsxXSAoYEJhemApCisgICsweDAwRTAgfCAwNCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgICB8IDB4MDAwMDAwMDQgKDQpIExvYzogKzB4MDBFNCAgICAgICAgfCBvZmZzZXQgdG8gdW5pb25bMl0gKGBCYXJgKQorCit0YWJsZSAoQW5ub3RhdGVkQmluYXJ5LkJhcik6CisgICsweDAwRTQgfCBEMiBGRSBGRiBGRiAgICAgICAgICAgICB8IFNPZmZzZXQzMiAgICB8IDB4RkZGRkZFRDIgKC0zMDIpIExvYzogKzB4MDIxMiAgICAgfCBvZmZzZXQgdG8gdnRhYmxlCisgICsweDAwRTggfCAwMCA4MCAyMyA0NCAgICAgICAgICAgICB8IGZsb2F0ICAgICAgICB8IDB4NDQyMzgwMDAgKDY1NC4wMDAwMDApICAgICAgICAgICAgfCB0YWJsZSBmaWVsZCBgYmAgKEZsb2F0KQorICArMHgwMEVDIHwgMTAgMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICAgfCAweDAwMDAwMDEwICgxNikgTG9jOiArMHgwMEZDICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBjYAorICArMHgwMEYwIHwgMDAgMDAgMDAgMDAgMDAgRDggOEUgNDAgfCBkb3VibGUgICAgICAgfCAweDQwOEVEODAwMDAwMDAwMDAgKDk4Ny4wMDAwMDApICAgIHwgdGFibGUgZmllbGQgYGFgIChEb3VibGUpCisgICsweDAwRjggfCAwMCAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQ4X3RbNF0gICB8IC4uLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBwYWRkaW5nCisKK3RhYmxlIChBbm5vdGF0ZWRCaW5hcnkuQmF6KToKKyAgKzB4MDBGQyB8IDZBIEZFIEZGIEZGICAgICAgICAgICAgIHwgU09mZnNldDMyICAgIHwgMHhGRkZGRkU2QSAoLTQwNikgTG9jOiArMHgwMjkyICAgICB8IG9mZnNldCB0byB2dGFibGUKKyAgKzB4MDEwMCB8IDAwIDAwIDAwICAgICAgICAgICAgICAgIHwgdWludDhfdFszXSAgIHwgLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHBhZGRpbmcKKyAgKzB4MDEwMyB8IDAzICAgICAgICAgICAgICAgICAgICAgIHwgdWludDhfdCAgICAgIHwgMHgwMyAoMykgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHRhYmxlIGZpZWxkIGBtZWFsYCAoQnl0ZSkKKwordnRhYmxlIChBbm5vdGF0ZWRCaW5hcnkuQmF6KToKKyAgKzB4MDEwNCB8IDA0IDAwICAgICAgICAgICAgICAgICAgIHwgdWludDE2X3QgICAgIHwgMHgwMDA0ICg0KSAgICAgICAgICAgICAgICAgICAgICAgICB8IHNpemUgb2YgdGhpcyB2dGFibGUKKyAgKzB4MDEwNiB8IDA0IDAwICAgICAgICAgICAgICAgICAgIHwgdWludDE2X3QgICAgIHwgMHgwMDA0ICg0KSAgICAgICAgICAgICAgICAgICAgICAgICB8IHNpemUgb2YgcmVmZXJyaW5nIHRhYmxlCisKK3RhYmxlIChBbm5vdGF0ZWRCaW5hcnkuQmF6KToKKyAgKzB4MDEwOCB8IDA0IDAwIDAwIDAwICAgICAgICAgICAgIHwgU09mZnNldDMyICAgIHwgMHgwMDAwMDAwNCAoNCkgTG9jOiArMHgwMTA0ICAgICAgICB8IG9mZnNldCB0byB2dGFibGUKKwordGFibGUgKEFubm90YXRlZEJpbmFyeS5CYXIpOgorICArMHgwMTBDIHwgRkEgRkUgRkYgRkYgICAgICAgICAgICAgfCBTT2Zmc2V0MzIgICAgfCAweEZGRkZGRUZBICgtMjYyKSBMb2M6ICsweDAyMTIgICAgIHwgb2Zmc2V0IHRvIHZ0YWJsZQorICArMHgwMTEwIHwgMDAgMDAgRTQgNDMgICAgICAgICAgICAgfCBmbG9hdCAgICAgICAgfCAweDQzRTQwMDAwICg0NTYuMDAwMDAwKSAgICAgICAgICAgIHwgdGFibGUgZmllbGQgYGJgIChGbG9hdCkKKyAgKzB4MDExNCB8IDEwIDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgIHwgMHgwMDAwMDAxMCAoMTYpIExvYzogKzB4MDEyNCAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgY2AKKyAgKzB4MDExOCB8IDAwIDAwIDAwIDAwIDAwIEMwIDVFIDQwIHwgZG91YmxlICAgICAgIHwgMHg0MDVFQzAwMDAwMDAwMDAwICgxMjMuMDAwMDAwKSAgICB8IHRhYmxlIGZpZWxkIGBhYCAoRG91YmxlKQorICArMHgwMTIwIHwgMDAgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50OF90WzRdICAgfCAuLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgcGFkZGluZworCit0YWJsZSAoQW5ub3RhdGVkQmluYXJ5LkJheik6CisgICsweDAxMjQgfCA5MiBGRSBGRiBGRiAgICAgICAgICAgICB8IFNPZmZzZXQzMiAgICB8IDB4RkZGRkZFOTIgKC0zNjYpIExvYzogKzB4MDI5MiAgICAgfCBvZmZzZXQgdG8gdnRhYmxlCisgICsweDAxMjggfCAwMCAwMCAwMCAgICAgICAgICAgICAgICB8IHVpbnQ4X3RbM10gICB8IC4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBwYWRkaW5nCisgICsweDAxMkIgfCAwMSAgICAgICAgICAgICAgICAgICAgICB8IHVpbnQ4X3QgICAgICB8IDB4MDEgKDEpICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB0YWJsZSBmaWVsZCBgbWVhbGAgKEJ5dGUpCisKK3ZlY3RvciAoQW5ub3RhdGVkQmluYXJ5LkZvby5mb29iYXJzX3R5cGUpOgorICArMHgwMTJDIHwgMDMgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICAgfCAweDAwMDAwMDAzICgzKSAgICAgICAgICAgICAgICAgICAgIHwgbGVuZ3RoIG9mIHZlY3RvciAoIyBpdGVtcykKKyAgKzB4MDEzMCB8IDAxICAgICAgICAgICAgICAgICAgICAgIHwgdWludDhfdCAgICAgIHwgMHgwMSAoMSkgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHZhbHVlWzBdCisgICsweDAxMzEgfCAwMiAgICAgICAgICAgICAgICAgICAgICB8IHVpbnQ4X3QgICAgICB8IDB4MDIgKDIpICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB2YWx1ZVsxXQorICArMHgwMTMyIHwgMDEgICAgICAgICAgICAgICAgICAgICAgfCB1aW50OF90ICAgICAgfCAweDAxICgxKSAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgdmFsdWVbMl0KKwordmVjdG9yIChBbm5vdGF0ZWRCaW5hcnkuRm9vLnBvaW50c19vZl9pbnRlcmVzdCk6CisgICsweDAxMzQgfCAwMyAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgICB8IDB4MDAwMDAwMDMgKDMpICAgICAgICAgICAgICAgICAgICAgfCBsZW5ndGggb2YgdmVjdG9yICgjIGl0ZW1zKQorICArMHgwMTM4IHwgMzMgMzMgMzMgMzMgMzMgQTMgNDUgNDAgfCBkb3VibGUgICAgICAgfCAweDQwNDVBMzMzMzMzMzMzMzMgKDQzLjI3NTAwMCkgICAgIHwgc3RydWN0IGZpZWxkIGBBbm5vdGF0ZWRCaW5hcnkuTG9jYXRpb24ubGF0aXR1ZGVgIChEb3VibGUpCisgICsweDAxNDAgfCA3RSA1NyAwNCBGRiA1QiA4NyA1MyBDMCB8IGRvdWJsZSAgICAgICB8IDB4QzA1Mzg3NUJGRjA0NTc3RSAoLTc4LjExNDk5MCkgICAgfCBzdHJ1Y3QgZmllbGQgYEFubm90YXRlZEJpbmFyeS5Mb2NhdGlvbi5sb25naXR1ZGVgIChEb3VibGUpCisgICsweDAxNDggfCA4RCBGMCBGNiAyMCAwNCBCNiA0MiA0MCB8IGRvdWJsZSAgICAgICB8IDB4NDA0MkI2MDQyMEY2RjA4RCAoMzcuNDIyMDAxKSAgICAgfCBzdHJ1Y3QgZmllbGQgYEFubm90YXRlZEJpbmFyeS5Mb2NhdGlvbi5sYXRpdHVkZWAgKERvdWJsZSkKKyAgKzB4MDE1MCB8IDlGIDc3IDYzIDQxIDYxIDg1IDVFIEMwIHwgZG91YmxlICAgICAgIHwgMHhDMDVFODU2MTQxNjM3NzlGICgtMTIyLjA4NDA2MSkgICB8IHN0cnVjdCBmaWVsZCBgQW5ub3RhdGVkQmluYXJ5LkxvY2F0aW9uLmxvbmdpdHVkZWAgKERvdWJsZSkKKyAgKzB4MDE1OCB8IDhGIDM1IDIzIDgzIERDIDM1IDRCIEMwIHwgZG91YmxlICAgICAgIHwgMHhDMDRCMzVEQzgzMjMzNThGICgtNTQuNDIwNzkyKSAgICB8IHN0cnVjdCBmaWVsZCBgQW5ub3RhdGVkQmluYXJ5LkxvY2F0aW9uLmxhdGl0dWRlYCAoRG91YmxlKQorICArMHgwMTYwIHwgRjYgOTcgREQgOTMgODcgQzUgMEEgNDAgfCBkb3VibGUgICAgICAgfCAweDQwMEFDNTg3OTNERDk3RjYgKDMuMzQ2NDUwKSAgICAgIHwgc3RydWN0IGZpZWxkIGBBbm5vdGF0ZWRCaW5hcnkuTG9jYXRpb24ubG9uZ2l0dWRlYCAoRG91YmxlKQorCitwYWRkaW5nOgorICArMHgwMTY4IHwgMDAgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50OF90WzRdICAgfCAuLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgcGFkZGluZworCit2ZWN0b3IgKEFubm90YXRlZEJpbmFyeS5Gb28ubmFtZXMpOgorICArMHgwMTZDIHwgMDMgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICAgfCAweDAwMDAwMDAzICgzKSAgICAgICAgICAgICAgICAgICAgIHwgbGVuZ3RoIG9mIHZlY3RvciAoIyBpdGVtcykKKyAgKzB4MDE3MCB8IDIwIDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgIHwgMHgwMDAwMDAyMCAoMzIpIExvYzogKzB4MDE5MCAgICAgICB8IG9mZnNldCB0byBzdHJpbmdbMF0KKyAgKzB4MDE3NCB8IDE0IDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgIHwgMHgwMDAwMDAxNCAoMjApIExvYzogKzB4MDE4OCAgICAgICB8IG9mZnNldCB0byBzdHJpbmdbMV0KKyAgKzB4MDE3OCB8IDA0IDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgIHwgMHgwMDAwMDAwNCAoNCkgTG9jOiArMHgwMTdDICAgICAgICB8IG9mZnNldCB0byBzdHJpbmdbMl0KKworc3RyaW5nIChBbm5vdGF0ZWRCaW5hcnkuRm9vLm5hbWVzKToKKyAgKzB4MDE3QyB8IDA3IDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgIHwgMHgwMDAwMDAwNyAoNykgICAgICAgICAgICAgICAgICAgICB8IGxlbmd0aCBvZiBzdHJpbmcKKyAgKzB4MDE4MCB8IDYzIDY4IDYxIDcyIDZDIDY5IDY1ICAgIHwgY2hhcls3XSAgICAgIHwgY2hhcmxpZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgKzB4MDE4NyB8IDAwICAgICAgICAgICAgICAgICAgICAgIHwgY2hhciAgICAgICAgIHwgMHgwMCAoMCkgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHN0cmluZyB0ZXJtaW5hdG9yCisKK3N0cmluZyAoQW5ub3RhdGVkQmluYXJ5LkZvby5uYW1lcyk6CisgICsweDAxODggfCAwMyAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgICB8IDB4MDAwMDAwMDMgKDMpICAgICAgICAgICAgICAgICAgICAgfCBsZW5ndGggb2Ygc3RyaW5nCisgICsweDAxOEMgfCA2MiA2RiA2MiAgICAgICAgICAgICAgICB8IGNoYXJbM10gICAgICB8IGJvYiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICsweDAxOEYgfCAwMCAgICAgICAgICAgICAgICAgICAgICB8IGNoYXIgICAgICAgICB8IDB4MDAgKDApICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJpbmcgdGVybWluYXRvcgorCitzdHJpbmcgKEFubm90YXRlZEJpbmFyeS5Gb28ubmFtZXMpOgorICArMHgwMTkwIHwgMDUgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICAgfCAweDAwMDAwMDA1ICg1KSAgICAgICAgICAgICAgICAgICAgIHwgbGVuZ3RoIG9mIHN0cmluZworICArMHgwMTk0IHwgNjEgNkMgNjkgNjMgNjUgICAgICAgICAgfCBjaGFyWzVdICAgICAgfCBhbGljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICArMHgwMTk5IHwgMDAgICAgICAgICAgICAgICAgICAgICAgfCBjaGFyICAgICAgICAgfCAweDAwICgwKSAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nIHRlcm1pbmF0b3IKKworcGFkZGluZzoKKyAgKzB4MDE5QSB8IDAwIDAwICAgICAgICAgICAgICAgICAgIHwgdWludDhfdFsyXSAgIHwgLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHBhZGRpbmcKKworc3RyaW5nIChBbm5vdGF0ZWRCaW5hcnkuRm9vLmFsaWNlKToKKyAgKzB4MDE5QyB8IDA3IDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgIHwgMHgwMDAwMDAwNyAoNykgICAgICAgICAgICAgICAgICAgICB8IGxlbmd0aCBvZiBzdHJpbmcKKyAgKzB4MDFBMCB8IDYzIDY4IDYxIDcyIDZDIDY5IDY1ICAgIHwgY2hhcls3XSAgICAgIHwgY2hhcmxpZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgKzB4MDFBNyB8IDAwICAgICAgICAgICAgICAgICAgICAgIHwgY2hhciAgICAgICAgIHwgMHgwMCAoMCkgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHN0cmluZyB0ZXJtaW5hdG9yCisKK3N0cmluZyAoQW5ub3RhdGVkQmluYXJ5LkZvby5ib2IpOgorICArMHgwMUE4IHwgMDcgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICAgfCAweDAwMDAwMDA3ICg3KSAgICAgICAgICAgICAgICAgICAgIHwgbGVuZ3RoIG9mIHN0cmluZworICArMHgwMUFDIHwgNjMgNjggNjEgNzIgNkMgNjkgNjUgICAgfCBjaGFyWzddICAgICAgfCBjaGFybGllICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICArMHgwMUIzIHwgMDAgICAgICAgICAgICAgICAgICAgICAgfCBjaGFyICAgICAgICAgfCAweDAwICgwKSAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nIHRlcm1pbmF0b3IKKwordmVjdG9yIChBbm5vdGF0ZWRCaW5hcnkuRm9vLmFjY291bnRzKToKKyAgKzB4MDFCNCB8IDA5IDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgIHwgMHgwMDAwMDAwOSAoOSkgICAgICAgICAgICAgICAgICAgICB8IGxlbmd0aCBvZiB2ZWN0b3IgKCMgaXRlbXMpCisgICsweDAxQjggfCAwOSAwMCAgICAgICAgICAgICAgICAgICB8IHVpbnQxNl90ICAgICB8IDB4MDAwOSAoOSkgICAgICAgICAgICAgICAgICAgICAgICAgfCB2YWx1ZVswXQorICArMHgwMUJBIHwgMDggMDAgICAgICAgICAgICAgICAgICAgfCB1aW50MTZfdCAgICAgfCAweDAwMDggKDgpICAgICAgICAgICAgICAgICAgICAgICAgIHwgdmFsdWVbMV0KKyAgKzB4MDFCQyB8IDA3IDAwICAgICAgICAgICAgICAgICAgIHwgdWludDE2X3QgICAgIHwgMHgwMDA3ICg3KSAgICAgICAgICAgICAgICAgICAgICAgICB8IHZhbHVlWzJdCisgICsweDAxQkUgfCAwMSAwMCAgICAgICAgICAgICAgICAgICB8IHVpbnQxNl90ICAgICB8IDB4MDAwMSAoMSkgICAgICAgICAgICAgICAgICAgICAgICAgfCB2YWx1ZVszXQorICArMHgwMUMwIHwgMDIgMDAgICAgICAgICAgICAgICAgICAgfCB1aW50MTZfdCAgICAgfCAweDAwMDIgKDIpICAgICAgICAgICAgICAgICAgICAgICAgIHwgdmFsdWVbNF0KKyAgKzB4MDFDMiB8IDAzIDAwICAgICAgICAgICAgICAgICAgIHwgdWludDE2X3QgICAgIHwgMHgwMDAzICgzKSAgICAgICAgICAgICAgICAgICAgICAgICB8IHZhbHVlWzVdCisgICsweDAxQzQgfCAwNiAwMCAgICAgICAgICAgICAgICAgICB8IHVpbnQxNl90ICAgICB8IDB4MDAwNiAoNikgICAgICAgICAgICAgICAgICAgICAgICAgfCB2YWx1ZVs2XQorICArMHgwMUM2IHwgMDUgMDAgICAgICAgICAgICAgICAgICAgfCB1aW50MTZfdCAgICAgfCAweDAwMDUgKDUpICAgICAgICAgICAgICAgICAgICAgICAgIHwgdmFsdWVbN10KKyAgKzB4MDFDOCB8IDA0IDAwICAgICAgICAgICAgICAgICAgIHwgdWludDE2X3QgICAgIHwgMHgwMDA0ICg0KSAgICAgICAgICAgICAgICAgICAgICAgICB8IHZhbHVlWzhdCisKK3BhZGRpbmc6CisgICsweDAxQ0EgfCAwMCAwMCAgICAgICAgICAgICAgICAgICB8IHVpbnQ4X3RbMl0gICB8IC4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBwYWRkaW5nCisKK3RhYmxlIChBbm5vdGF0ZWRCaW5hcnkuQmF6KToKKyAgKzB4MDFDQyB8IDNBIEZGIEZGIEZGICAgICAgICAgICAgIHwgU09mZnNldDMyICAgIHwgMHhGRkZGRkYzQSAoLTE5OCkgTG9jOiArMHgwMjkyICAgICB8IG9mZnNldCB0byB2dGFibGUKKyAgKzB4MDFEMCB8IDAwIDAwIDAwICAgICAgICAgICAgICAgIHwgdWludDhfdFszXSAgIHwgLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHBhZGRpbmcKKyAgKzB4MDFEMyB8IDAzICAgICAgICAgICAgICAgICAgICAgIHwgdWludDhfdCAgICAgIHwgMHgwMyAoMykgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHRhYmxlIGZpZWxkIGBtZWFsYCAoQnl0ZSkKKwordmVjdG9yIChBbm5vdGF0ZWRCaW5hcnkuRm9vLmJhcnMpOgorICArMHgwMUQ0IHwgMDIgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICAgfCAweDAwMDAwMDAyICgyKSAgICAgICAgICAgICAgICAgICAgIHwgbGVuZ3RoIG9mIHZlY3RvciAoIyBpdGVtcykKKyAgKzB4MDFEOCB8IDQ0IDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgIHwgMHgwMDAwMDA0NCAoNjgpIExvYzogKzB4MDIxQyAgICAgICB8IG9mZnNldCB0byB0YWJsZVswXQorICArMHgwMURDIHwgMTAgMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICAgfCAweDAwMDAwMDEwICgxNikgTG9jOiArMHgwMUVDICAgICAgIHwgb2Zmc2V0IHRvIHRhYmxlWzFdCisKK3BhZGRpbmc6CisgICsweDAxRTAgfCAwMCAwMCAgICAgICAgICAgICAgICAgICB8IHVpbnQ4X3RbMl0gICB8IC4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBwYWRkaW5nCisKK3Z0YWJsZSAoQW5ub3RhdGVkQmluYXJ5LkJhcik6CisgICsweDAxRTIgfCAwQSAwMCAgICAgICAgICAgICAgICAgICB8IHVpbnQxNl90ICAgICB8IDB4MDAwQSAoMTApICAgICAgICAgICAgICAgICAgICAgICAgfCBzaXplIG9mIHRoaXMgdnRhYmxlCisgICsweDAxRTQgfCAxQSAwMCAgICAgICAgICAgICAgICAgICB8IHVpbnQxNl90ICAgICB8IDB4MDAxQSAoMjYpICAgICAgICAgICAgICAgICAgICAgICAgfCBzaXplIG9mIHJlZmVycmluZyB0YWJsZQorICArMHgwMUU2IHwgMEMgMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgICAgfCAweDAwMEMgKDEyKSAgICAgICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBhYCAoaWQ6IDApCisgICsweDAxRTggfCAwNCAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgICB8IDB4MDAwNCAoNCkgICAgICAgICAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYGJgIChpZDogMSkKKyAgKzB4MDFFQSB8IDA4IDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgIHwgMHgwMDA4ICg4KSAgICAgICAgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgY2AgKGlkOiAyKQorCit0YWJsZSAoQW5ub3RhdGVkQmluYXJ5LkJhcik6CisgICsweDAxRUMgfCAwQSAwMCAwMCAwMCAgICAgICAgICAgICB8IFNPZmZzZXQzMiAgICB8IDB4MDAwMDAwMEEgKDEwKSBMb2M6ICsweDAxRTIgICAgICAgfCBvZmZzZXQgdG8gdnRhYmxlCisgICsweDAxRjAgfCAwMCA4MCAyMyA0NCAgICAgICAgICAgICB8IGZsb2F0ICAgICAgICB8IDB4NDQyMzgwMDAgKDY1NC4wMDAwMDApICAgICAgICAgICAgfCB0YWJsZSBmaWVsZCBgYmAgKEZsb2F0KQorICArMHgwMUY0IHwgMTggMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICAgfCAweDAwMDAwMDE4ICgyNCkgTG9jOiArMHgwMjBDICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBjYAorICArMHgwMUY4IHwgMDAgMDAgMDAgMDAgMDAgRDggOEUgNDAgfCBkb3VibGUgICAgICAgfCAweDQwOEVEODAwMDAwMDAwMDAgKDk4Ny4wMDAwMDApICAgIHwgdGFibGUgZmllbGQgYGFgIChEb3VibGUpCisgICsweDAyMDAgfCAwMCAwMCAwMCAwMCAwMCAwMCAgICAgICB8IHVpbnQ4X3RbNl0gICB8IC4uLi4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBwYWRkaW5nCisKK3Z0YWJsZSAoQW5ub3RhdGVkQmluYXJ5LkJheik6CisgICsweDAyMDYgfCAwNiAwMCAgICAgICAgICAgICAgICAgICB8IHVpbnQxNl90ICAgICB8IDB4MDAwNiAoNikgICAgICAgICAgICAgICAgICAgICAgICAgfCBzaXplIG9mIHRoaXMgdnRhYmxlCisgICsweDAyMDggfCAwNiAwMCAgICAgICAgICAgICAgICAgICB8IHVpbnQxNl90ICAgICB8IDB4MDAwNiAoNikgICAgICAgICAgICAgICAgICAgICAgICAgfCBzaXplIG9mIHJlZmVycmluZyB0YWJsZQorICArMHgwMjBBIHwgMDUgMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgICAgfCAweDAwMDUgKDUpICAgICAgICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBtZWFsYCAoaWQ6IDApCisKK3RhYmxlIChBbm5vdGF0ZWRCaW5hcnkuQmF6KToKKyAgKzB4MDIwQyB8IDA2IDAwIDAwIDAwICAgICAgICAgICAgIHwgU09mZnNldDMyICAgIHwgMHgwMDAwMDAwNiAoNikgTG9jOiArMHgwMjA2ICAgICAgICB8IG9mZnNldCB0byB2dGFibGUKKyAgKzB4MDIxMCB8IDAwICAgICAgICAgICAgICAgICAgICAgIHwgdWludDhfdFsxXSAgIHwgLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHBhZGRpbmcKKyAgKzB4MDIxMSB8IDAzICAgICAgICAgICAgICAgICAgICAgIHwgdWludDhfdCAgICAgIHwgMHgwMyAoMykgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHRhYmxlIGZpZWxkIGBtZWFsYCAoQnl0ZSkKKwordnRhYmxlIChBbm5vdGF0ZWRCaW5hcnkuQmFyKToKKyAgKzB4MDIxMiB8IDBBIDAwICAgICAgICAgICAgICAgICAgIHwgdWludDE2X3QgICAgIHwgMHgwMDBBICgxMCkgICAgICAgICAgICAgICAgICAgICAgICB8IHNpemUgb2YgdGhpcyB2dGFibGUKKyAgKzB4MDIxNCB8IDE4IDAwICAgICAgICAgICAgICAgICAgIHwgdWludDE2X3QgICAgIHwgMHgwMDE4ICgyNCkgICAgICAgICAgICAgICAgICAgICAgICB8IHNpemUgb2YgcmVmZXJyaW5nIHRhYmxlCisgICsweDAyMTYgfCAwQyAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgICB8IDB4MDAwQyAoMTIpICAgICAgICAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYGFgIChpZDogMCkKKyAgKzB4MDIxOCB8IDA0IDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgIHwgMHgwMDA0ICg0KSAgICAgICAgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgYmAgKGlkOiAxKQorICArMHgwMjFBIHwgMDggMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgICAgfCAweDAwMDggKDgpICAgICAgICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBjYCAoaWQ6IDIpCisKK3RhYmxlIChBbm5vdGF0ZWRCaW5hcnkuQmFyKToKKyAgKzB4MDIxQyB8IDBBIDAwIDAwIDAwICAgICAgICAgICAgIHwgU09mZnNldDMyICAgIHwgMHgwMDAwMDAwQSAoMTApIExvYzogKzB4MDIxMiAgICAgICB8IG9mZnNldCB0byB2dGFibGUKKyAgKzB4MDIyMCB8IDAwIDAwIEU0IDQzICAgICAgICAgICAgIHwgZmxvYXQgICAgICAgIHwgMHg0M0U0MDAwMCAoNDU2LjAwMDAwMCkgICAgICAgICAgICB8IHRhYmxlIGZpZWxkIGBiYCAoRmxvYXQpCisgICsweDAyMjQgfCAxMCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgICB8IDB4MDAwMDAwMTAgKDE2KSBMb2M6ICsweDAyMzQgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYGNgCisgICsweDAyMjggfCAwMCAwMCAwMCAwMCAwMCBDMCA1RSA0MCB8IGRvdWJsZSAgICAgICB8IDB4NDA1RUMwMDAwMDAwMDAwMCAoMTIzLjAwMDAwMCkgICAgfCB0YWJsZSBmaWVsZCBgYWAgKERvdWJsZSkKKyAgKzB4MDIzMCB8IDAwIDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDhfdFs0XSAgIHwgLi4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHBhZGRpbmcKKwordGFibGUgKEFubm90YXRlZEJpbmFyeS5CYXopOgorICArMHgwMjM0IHwgQTIgRkYgRkYgRkYgICAgICAgICAgICAgfCBTT2Zmc2V0MzIgICAgfCAweEZGRkZGRkEyICgtOTQpIExvYzogKzB4MDI5MiAgICAgIHwgb2Zmc2V0IHRvIHZ0YWJsZQorICArMHgwMjM4IHwgMDAgMDAgMDAgICAgICAgICAgICAgICAgfCB1aW50OF90WzNdICAgfCAuLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgcGFkZGluZworICArMHgwMjNCIHwgMDEgICAgICAgICAgICAgICAgICAgICAgfCB1aW50OF90ICAgICAgfCAweDAxICgxKSAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgdGFibGUgZmllbGQgYG1lYWxgIChCeXRlKQorCitzdHJpbmcgKEFubm90YXRlZEJpbmFyeS5Gb28ubmFtZSk6CisgICsweDAyM0MgfCAyRiAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgICB8IDB4MDAwMDAwMkYgKDQ3KSAgICAgICAgICAgICAgICAgICAgfCBsZW5ndGggb2Ygc3RyaW5nCisgICsweDAyNDAgfCA1NCA2OCA2OSA3MyAyMCA2OSA3MyAyMCB8IGNoYXJbNDddICAgICB8IFRoaXMgaXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICsweDAyNDggfCA2MSAyMCA2QyA2RiA2RSA2NyAyMCA3MyB8ICAgICAgICAgICAgICB8IGEgbG9uZyBzCisgICsweDAyNTAgfCA3NCA3MiA2OSA2RSA2NyAyMCA3NCA2RiB8ICAgICAgICAgICAgICB8IHRyaW5nIHRvCisgICsweDAyNTggfCAyMCA3MyA2OCA2RiA3NyAyMCA2OCA2RiB8ICAgICAgICAgICAgICB8ICBzaG93IGhvCisgICsweDAyNjAgfCA3NyAyMCA2OSA3NCAyMCA2MiA3MiA2NSB8ICAgICAgICAgICAgICB8IHcgaXQgYnJlCisgICsweDAyNjggfCA2MSA2QiA3MyAyMCA3NSA3MCAyRSAgICB8ICAgICAgICAgICAgICB8IGFrcyB1cC4KKyAgKzB4MDI2RiB8IDAwICAgICAgICAgICAgICAgICAgICAgIHwgY2hhciAgICAgICAgIHwgMHgwMCAoMCkgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHN0cmluZyB0ZXJtaW5hdG9yCisKK3BhZGRpbmc6CisgICsweDAyNzAgfCAwMCAwMCAgICAgICAgICAgICAgICAgICB8IHVpbnQ4X3RbMl0gICB8IC4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBwYWRkaW5nCisKK3Z0YWJsZSAoQW5ub3RhdGVkQmluYXJ5LkJhcik6CisgICsweDAyNzIgfCAwQSAwMCAgICAgICAgICAgICAgICAgICB8IHVpbnQxNl90ICAgICB8IDB4MDAwQSAoMTApICAgICAgICAgICAgICAgICAgICAgICAgfCBzaXplIG9mIHRoaXMgdnRhYmxlCisgICsweDAyNzQgfCAxNiAwMCAgICAgICAgICAgICAgICAgICB8IHVpbnQxNl90ICAgICB8IDB4MDAxNiAoMjIpICAgICAgICAgICAgICAgICAgICAgICAgfCBzaXplIG9mIHJlZmVycmluZyB0YWJsZQorICArMHgwMjc2IHwgMEMgMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgICAgfCAweDAwMEMgKDEyKSAgICAgICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBhYCAoaWQ6IDApCisgICsweDAyNzggfCAwNCAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgICB8IDB4MDAwNCAoNCkgICAgICAgICAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYGJgIChpZDogMSkKKyAgKzB4MDI3QSB8IDA4IDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgIHwgMHgwMDA4ICg4KSAgICAgICAgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgY2AgKGlkOiAyKQorCit0YWJsZSAoQW5ub3RhdGVkQmluYXJ5LkJhcik6CisgICsweDAyN0MgfCAwQSAwMCAwMCAwMCAgICAgICAgICAgICB8IFNPZmZzZXQzMiAgICB8IDB4MDAwMDAwMEEgKDEwKSBMb2M6ICsweDAyNzIgICAgICAgfCBvZmZzZXQgdG8gdnRhYmxlCisgICsweDAyODAgfCA2NSAyMCA3MSA0OSAgICAgICAgICAgICB8IGZsb2F0ICAgICAgICB8IDB4NDk3MTIwNjUgKDk4NzY1NC4zMTI1MDApICAgICAgICAgfCB0YWJsZSBmaWVsZCBgYmAgKEZsb2F0KQorICArMHgwMjg0IHwgMTQgMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICAgfCAweDAwMDAwMDE0ICgyMCkgTG9jOiArMHgwMjk4ICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBjYAorICArMHgwMjg4IHwgQzkgNzYgQkUgOUYgMEMgMjQgRkUgNDAgfCBkb3VibGUgICAgICAgfCAweDQwRkUyNDBDOUZCRTc2QzkgKDEyMzQ1Ni43ODkwMDApIHwgdGFibGUgZmllbGQgYGFgIChEb3VibGUpCisgICsweDAyOTAgfCAwMCAwMCAgICAgICAgICAgICAgICAgICB8IHVpbnQ4X3RbMl0gICB8IC4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBwYWRkaW5nCisKK3Z0YWJsZSAoQW5ub3RhdGVkQmluYXJ5LkJheik6CisgICsweDAyOTIgfCAwNiAwMCAgICAgICAgICAgICAgICAgICB8IHVpbnQxNl90ICAgICB8IDB4MDAwNiAoNikgICAgICAgICAgICAgICAgICAgICAgICAgfCBzaXplIG9mIHRoaXMgdnRhYmxlCisgICsweDAyOTQgfCAwOCAwMCAgICAgICAgICAgICAgICAgICB8IHVpbnQxNl90ICAgICB8IDB4MDAwOCAoOCkgICAgICAgICAgICAgICAgICAgICAgICAgfCBzaXplIG9mIHJlZmVycmluZyB0YWJsZQorICArMHgwMjk2IHwgMDcgMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgICAgfCAweDAwMDcgKDcpICAgICAgICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBtZWFsYCAoaWQ6IDApCisKK3RhYmxlIChBbm5vdGF0ZWRCaW5hcnkuQmF6KToKKyAgKzB4MDI5OCB8IDA2IDAwIDAwIDAwICAgICAgICAgICAgIHwgU09mZnNldDMyICAgIHwgMHgwMDAwMDAwNiAoNikgTG9jOiArMHgwMjkyICAgICAgICB8IG9mZnNldCB0byB2dGFibGUKKyAgKzB4MDI5QyB8IDAwIDAwIDAwICAgICAgICAgICAgICAgIHwgdWludDhfdFszXSAgIHwgLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHBhZGRpbmcKKyAgKzB4MDI5RiB8IDAxICAgICAgICAgICAgICAgICAgICAgIHwgdWludDhfdCAgICAgIHwgMHgwMSAoMSkgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHRhYmxlIGZpZWxkIGBtZWFsYCAoQnl0ZSkKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL2Fubm90YXRlZF9iaW5hcnkvYW5ub3RhdGVkX2JpbmFyeV9vbGQuZmJzIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvYW5ub3RhdGVkX2JpbmFyeS9hbm5vdGF0ZWRfYmluYXJ5X29sZC5mYnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzIyZDZkMgotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL2Fubm90YXRlZF9iaW5hcnkvYW5ub3RhdGVkX2JpbmFyeV9vbGQuZmJzCkBAIC0wLDAgKzEsOTQgQEAKK25hbWVzcGFjZSBBbm5vdGF0ZWRCaW5hcnk7CisKK2VudW0gRm9vZCA6IGJ5dGUgeworICBOb25lID0gMCwKKyAgQXBwbGUgPSAxLAorICBCYW5hbmEgPSAyLAorICBLaXdpID0gMywKK30KKwordGFibGUgQmF6IHsKKyAgbWVhbDpGb29kID0gQmFuYW5hOworfQorCit0YWJsZSBCYXIgeworICBhOmRvdWJsZSA9IDMuMTQ7CisgIGI6ZmxvYXQgPSAxLjY4OworICBjOkJhejsKK30KKwordW5pb24gQmFyQmF6IHsKKyAgQmFyLCBCYXoKK30KKwordW5pb24gTWVhc3VyZW1lbnQgeworICBUb2xlcmFuY2UsIERpbWVuc2lvbgorfQorCitzdHJ1Y3QgVG9sZXJhbmNlIHsKKyAgd2lkdGg6dWludDg7Cit9CisKK3VuaW9uIEFueSB7CisgIEJhciwgVG9sZXJhbmNlCit9CisKK3N0cnVjdCBEaW1lbnNpb24geworICB2YWx1ZXM6W2ludDozXTsKKyAgdG9sZXJhbmNlczpbVG9sZXJhbmNlOjNdOworfQorCitzdHJ1Y3QgQnVpbGRpbmcgeworICBmbG9vcnM6aW50OworICBkb29yczppbnQ7CisgIHdpbmRvd3M6aW50OworICBkaW1lbnNpb25zOkRpbWVuc2lvbjsKK30KKworc3RydWN0IExvY2F0aW9uIHsKKyAgbGF0aXR1ZGU6ZG91YmxlOworICBsb25naXR1ZGU6ZG91YmxlOworfQorCit0YWJsZSBGb28geworICBjb3VudGVyOmludDsKKyAgaGVhbHRoeTpib29sOworICBsZXZlbDpsb25nID0gOTk7CisgIG1lYWw6Rm9vZCA9IEFwcGxlOworICBiYXI6QmFyOworICBob21lOkJ1aWxkaW5nOworICBuYW1lOnN0cmluZzsKKyAgLy8gVmVjdG9yIG9mIHRhYmxlcworICBiYXJzOltCYXJdOworICAvLyBVbmlvbiBvZiB0YWJsZXMKKyAgYmFyX2JhejpCYXJCYXo7CisgIC8vIFZlY3RvciBvZiBTY2FsYXJzCisgIGFjY291bnRzOlt1aW50MTZdOworICBib2I6c3RyaW5nOworICBhbGljZTpzdHJpbmc7CisgIC8vIE9wdGlvbmFsIFNjYWxhcnMKKyAgbWF5YmVfaTMyOiBpbnQzMiA9IG51bGw7CisgIGRlZmF1bHRfaTMyOiBpbnQzMiA9IDQyOworICBqdXN0X2kzMjogaW50MzI7CisgIC8vIFZlY3RvciBvZiBzdHJpbmdzCisgIG5hbWVzOltzdHJpbmddOworICAvLyBWZWN0b3Igb2Ygc3RydWN0cworICBwb2ludHNfb2ZfaW50ZXJlc3Q6W0xvY2F0aW9uXTsKKyAgLy8gVmVjdG9yIG9mIHVuaW9ucworICBmb29iYXJzOltCYXJCYXpdOworICAvLyBVbmlvbiBvZiBzdHJ1Y3RzCisgIG1lYXN1cmVtZW50Ok1lYXN1cmVtZW50OworICAvLyBVbmlvbiBvZiBzdHJ1Y3QvdGFibGUKKyAgYW55dGhpbmc6QW55OworICAvLyBEZWZhdWx0IGZsb2F0aW5nIHBvaW50CisgIHRlbXBlcmF0dXJlOmZsb2F0PTk4LjY7CisgIC8vIE5vdCBwcmVzZW50IG9iamVjdAorICB0ZWV0b3RhbGVyOkJhcjsKKworICAvLyBOT1RFIFRISVMgSVMgQSBQVVJQT1NFTFkgT0xEIFZFUlNJT04gT0YgYW5ub3RhdGVkX2JpbmFyeS5mYnMgVE8gVEVTVCAKKyAgLy8gUFJPQ0VTU0lORyBPRiBORVdFUiBCSU5BUklFUyBUSEFOIFRIRSBTQ0hFTUEuIERPIE5PVCBBREQgVE8gVEhJUy4KK30KKworZmlsZV9pZGVudGlmaWVyICJBTk5PIjsKKworcm9vdF90eXBlIEZvbzsKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9hbm5vdGF0ZWRfYmluYXJ5L2dlbmVyYXRlX2Fubm90YXRpb25zLnB5IGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvYW5ub3RhdGVkX2JpbmFyeS9nZW5lcmF0ZV9hbm5vdGF0aW9ucy5weQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5iZDVkZTJiCi0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvYW5ub3RhdGVkX2JpbmFyeS9nZW5lcmF0ZV9hbm5vdGF0aW9ucy5weQpAQCAtMCwwICsxLDc2IEBACisjIS91c3IvYmluL2VudiBweXRob24zCisjCisjIENvcHlyaWdodCAyMDIxIEdvb2dsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK2ltcG9ydCBwbGF0Zm9ybQoraW1wb3J0IHN1YnByb2Nlc3MKK2Zyb20gcGF0aGxpYiBpbXBvcnQgUGF0aAorCisjIEdldCB0aGUgcGF0aCB3aGVyZSB0aGlzIHNjcmlwdCBpcyBsb2NhdGVkIHNvIHdlIGNhbiBpbnZva2UgdGhlIHNjcmlwdCBmcm9tCisjIGFueSBkaXJlY3RvcnkgYW5kIGhhdmUgdGhlIHBhdGhzIHdvcmsgY29ycmVjdGx5Lgorc2NyaXB0X3BhdGggPSBQYXRoKF9fZmlsZV9fKS5wYXJlbnQucmVzb2x2ZSgpCisKKyMgR2V0IHRoZSByb290IHBhdGggYXMgYW4gYWJzb2x1dGUgcGF0aCwgc28gYWxsIGRlcml2ZWQgcGF0aHMgYXJlIGFic29sdXRlLgorcm9vdF9wYXRoID0gc2NyaXB0X3BhdGgucGFyZW50LnBhcmVudC5hYnNvbHV0ZSgpCisKKyMgR2V0IHRoZSBsb2NhdGlvbiBvZiB0aGUgZmxhdGMgZXhlY3V0YWJsZSwgcmVhZGluZyBmcm9tIHRoZSBmaXJzdCBjb21tYW5kIGxpbmUKKyMgYXJndW1lbnQgb3IgZGVmYXVsdGluZyB0byBkZWZhdWx0IG5hbWVzLgorZmxhdGNfZXhlID0gUGF0aCgKKyAgICAoImZsYXRjIiBpZiBub3QgcGxhdGZvcm0uc3lzdGVtKCkgPT0gIldpbmRvd3MiIGVsc2UgImZsYXRjLmV4ZSIpCispCisKKyMgRmluZCBhbmQgYXNzZXJ0IGZsYXRjIGNvbXBpbGVyIGlzIHByZXNlbnQuCitpZiByb290X3BhdGggaW4gZmxhdGNfZXhlLnBhcmVudHM6CisgICAgZmxhdGNfZXhlID0gZmxhdGNfZXhlLnJlbGF0aXZlX3RvKHJvb3RfcGF0aCkKK2ZsYXRjX3BhdGggPSBQYXRoKHJvb3RfcGF0aCwgZmxhdGNfZXhlKQorYXNzZXJ0IGZsYXRjX3BhdGguZXhpc3RzKCksICJDYW5ub3QgZmluZCB0aGUgZmxhdGMgY29tcGlsZXIgIiArIHN0cihmbGF0Y19wYXRoKQorCisjIFNwZWNpZnkgdGhlIG90aGVyIHBhdGhzIHRoYXQgd2lsbCBiZSByZWZlcmVuY2VkCit0ZXN0c19wYXRoID0gUGF0aChzY3JpcHRfcGF0aCwgInRlc3RzIikKKworCitkZWYgZmxhdGNfYW5ub3RhdGUoc2NoZW1hLCBmaWxlLCBjd2Q9c2NyaXB0X3BhdGgpOgorICAgIGNtZCA9IFtzdHIoZmxhdGNfcGF0aCksICItLWFubm90YXRlIiwgc2NoZW1hLCBmaWxlXQorICAgIHJlc3VsdCA9IHN1YnByb2Nlc3MucnVuKGNtZCwgY3dkPXN0cihjd2QpLCBjaGVjaz1UcnVlKQorCisKK3Rlc3RfZmlsZXMgPSBbCisgICAgImFubm90YXRlZF9iaW5hcnkuYmluIiwKKyAgICAidGVzdHMvaW52YWxpZF9yb290X29mZnNldC5iaW4iLAorICAgICJ0ZXN0cy9pbnZhbGlkX3Jvb3RfdGFibGVfdG9vX3Nob3J0LmJpbiIsCisgICAgInRlc3RzL2ludmFsaWRfcm9vdF90YWJsZV92dGFibGVfb2Zmc2V0LmJpbiIsCisgICAgInRlc3RzL2ludmFsaWRfc3RyaW5nX2xlbmd0aC5iaW4iLAorICAgICJ0ZXN0cy9pbnZhbGlkX3N0cmluZ19sZW5ndGhfY3V0X3Nob3J0LmJpbiIsCisgICAgInRlc3RzL2ludmFsaWRfc3RydWN0X2FycmF5X2ZpZWxkX2N1dF9zaG9ydC5iaW4iLAorICAgICJ0ZXN0cy9pbnZhbGlkX3N0cnVjdF9maWVsZF9jdXRfc2hvcnQuYmluIiwKKyAgICAidGVzdHMvaW52YWxpZF90YWJsZV9maWVsZF9zaXplLmJpbiIsCisgICAgInRlc3RzL2ludmFsaWRfdGFibGVfZmllbGRfb2Zmc2V0LmJpbiIsCisgICAgInRlc3RzL2ludmFsaWRfdW5pb25fdHlwZV92YWx1ZS5iaW4iLAorICAgICJ0ZXN0cy9pbnZhbGlkX3ZlY3Rvcl9sZW5ndGhfY3V0X3Nob3J0LmJpbiIsCisgICAgInRlc3RzL2ludmFsaWRfdmVjdG9yX3NjYWxhcnNfY3V0X3Nob3J0LmJpbiIsCisgICAgInRlc3RzL2ludmFsaWRfdmVjdG9yX3N0cmluZ3NfY3V0X3Nob3J0LmJpbiIsCisgICAgInRlc3RzL2ludmFsaWRfdmVjdG9yX3N0cnVjdHNfY3V0X3Nob3J0LmJpbiIsCisgICAgInRlc3RzL2ludmFsaWRfdmVjdG9yX3RhYmxlc19jdXRfc2hvcnQuYmluIiwKKyAgICAidGVzdHMvaW52YWxpZF92ZWN0b3JfdW5pb25zX2N1dF9zaG9ydC5iaW4iLAorICAgICJ0ZXN0cy9pbnZhbGlkX3ZlY3Rvcl91bmlvbl90eXBlX3ZhbHVlLmJpbiIsCisgICAgInRlc3RzL2ludmFsaWRfdnRhYmxlX3JlZl90YWJsZV9zaXplX3Nob3J0LmJpbiIsCisgICAgInRlc3RzL2ludmFsaWRfdnRhYmxlX3JlZl90YWJsZV9zaXplLmJpbiIsCisgICAgInRlc3RzL2ludmFsaWRfdnRhYmxlX3NpemVfc2hvcnQuYmluIiwKKyAgICAidGVzdHMvaW52YWxpZF92dGFibGVfc2l6ZS5iaW4iLAorICAgICJ0ZXN0cy9pbnZhbGlkX3Z0YWJsZV9maWVsZF9vZmZzZXQuYmluIiwKK10KKworZm9yIHRlc3RfZmlsZSBpbiB0ZXN0X2ZpbGVzOgorICAgIGZsYXRjX2Fubm90YXRlKCJhbm5vdGF0ZWRfYmluYXJ5LmZicyIsIHRlc3RfZmlsZSkKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL2Fubm90YXRlZF9iaW5hcnkvdGVzdHMvUkVBRE1FLm1kIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvYW5ub3RhdGVkX2JpbmFyeS90ZXN0cy9SRUFETUUubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzBkNzNmNAotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL2Fubm90YXRlZF9iaW5hcnkvdGVzdHMvUkVBRE1FLm1kCkBAIC0wLDAgKzEsMTI1IEBACisjIFRlc3RzIGZvciBBbm5vdGF0ZWQgQmluYXJpZXMKKworIyMgSW52YWxpZCBCaW5hcnkgVGVzdHMKKworVGhlIGZvbGxvd2luZyBpcyBhIGNvbGxlY3Rpb24gb2YgbWFudWFsbHkgY29ycnVwdGVkIGJpbmFyaWVzIGJhc2VkIG9mZiBvZgorYC4uXGFubm90YXRlZF9iaW5hcnkuYmluYC4gRWFjaCBmaWxlIGNoYW5nZXMgc29tZSBvZmZzZXQgb3IgbGVuZ3RoL3NpemUgZW50cnkgdG8KK3BvaW50IHNvIGFuIGludmFsaWQgc3BvdCwgYW5kIHRoZSBnZW5lcmF0ZWQgYW5ub3RhdGVkIGJpbmFyaWVzIGRlbW9uc3RyYXRlIHRoYXQKK3Rob3NlIGNvcnJ1cHRpb25zIGNhbiBiZSBzcG90dGVkLgorCitFYWNoIG9mIHRoZXNlIGZpbGVzIHdlcmUgcmFuIHdpdGggdGhlIGZvbGxvd2luZyBjb21tYW5kOgorCitgYGBzaAorY2QgLnRlc3RzL2Fubm90YXRlZF9iaW5hcnkKKy4uLy4uL2ZsYXRjIC1hbm5vdGF0ZSBhbm5vdGF0ZWRfYmluYXJ5LmZicyB0ZXN0cy97YmluYXJ5X2ZpbGV9Li4uCitgYGAKKworIyMjIGBpbnZhbGlkX3Jvb3Rfb2Zmc2V0LmJpbmAKKworQ2hhbmdlZCBmaXJzdCB0d28gYnl0ZXMgZnJvbSBgNDQwMGAgdG8gYEZGRkZgIHdoaWNoIHByb2R1Y2VzIGFuIG9mZnNldCBsYXJnZXIKK3RoYW4gdGhlIGJpbmFyeS4KKworIyMjIGBpbnZhbGlkX3Jvb3RfdGFibGVfdnRhYmxlX29mZnNldC5iaW5gCisKK0NoYW5nZWQgdHdvIGJ5dGVzIGF0IDB4MDA0NCBmcm9tIGAzQTAwYCB0byBgRkZGRmAgd2hpY2ggcG9pbnRzIHRvIGFuIG9mZnNldAorb3V0c2lkZSB0aGUgYmluYXJ5LgorCisjIyMgYGludmFsaWRfcm9vdF90YWJsZV90b29fc2hvcnQuYmluYAorCitUcnVuY2F0ZWQgdGhlIGZpbGUgdG8gMHg0NiBieXRlcywgYXMgdGhhdCBjdXRzIGludG8gdGhlIHZ0YWJsZSBvZmZzZXQgZmllbGQgb2YKK3RoZSByb290IHRhYmxlLgorCitgYGBzaAordHJ1bmNhdGUgYW5ub3RhdGVkX2JpbmFyeS5iaW4gLS1zaXplPTcwID4+IGludmFsaWRfcm9vdF90YWJsZV90b29fc2hvcnQuYmluCitgYGAKKworIyMjIGBpbnZhbGlkX3Z0YWJsZV9zaXplLmJpbmAKKworQ2hhbmdlZCB0d28gYnl0ZXMgYXQgMHgwMDBBIGZyb20gYDNBMDBgIHRvIGBGRkZGYCB3aGljaCBzaXplIGlzIGxhcmdlciB0aGFuIHRoZQorYmluYXJ5LgorCisjIyMgYGludmFsaWRfdnRhYmxlX3NpemVfc2hvcnQuYmluYAorCitDaGFuZ2VkIHR3byBieXRlcyBhdCAweDAwMEEgZnJvbSBgM0EwMGAgdG8gYDAxMDBgIHdoaWNoIHNpemUgaXMgc21hbGxlciB0aGFuIHRoZQorbWluaW11bSBzaXplIG9mIDQgYnl0ZXMuCisKKyMjIyBgaW52YWxpZF92dGFibGVfcmVmX3RhYmxlX3NpemUuYmluYAorCitDaGFuZ2VkIHR3byBieXRlcyBhdCAweDAwMEMgZnJvbSBgNjgwMGAgdG8gYEZGRkZgIHdoaWNoIHNpemUgaXMgbGFyZ2VyIHRoYW4gdGhlCitiaW5hcnkuCisKKyMjIyBgaW52YWxpZF92dGFibGVfcmVmX3RhYmxlX3NpemVfc2hvcnQuYmluYAorCitDaGFuZ2VkIHR3byBieXRlcyBhdCAweDAwMEMgZnJvbSBgNjgwMGAgdG8gYDAxMDBgIHdoaWNoIHNpemUgaXMgc21hbGxlciB0aGFuIAordGhlIG1pbmltdW0gc2l6ZSBvZiA0IGJ5dGVzLgorCisjIyMgYGludmFsaWRfdnRhYmxlX2ZpZWxkX29mZnNldC5iaW5gCisKK0NoYW5nZWQgdHdvIGJ5dGVzIGF0IDB4MDAxNiBmcm9tIGAxMDAwYCB0byBgRkZGRmAgd2hpY2ggcG9pbnRzIHRvIGEgZmllbGQgbGFyZ2VyCit0aGFuIHRoZSBiaW5hcnkuCisKKyMjIyBgaW52YWxpZF90YWJsZV9maWVsZF9zaXplLmJpbmAKKworVHJ1bmNhdGVkIHRoZSBmaWxlIHRvIDB4NTIgYnl0ZXMsIGFzIHRoYXQgY3V0cyBhIFVpbnQzMnQgdmFsdWUgaW4gaGFsZi4KKworIyMjIGBpbnZhbGlkX3RhYmxlX2ZpZWxkX29mZnNldC5iaW5gCisKK1RydW5jYXRlZCB0aGUgZmlsZSB0byAweDk2IGJ5dGVzLCBhcyB0aGF0IGN1dHMgYSBVT2Zmc2V0MzIgdmFsdWUgaW4gaGFsZi4gQWxzbywKK2NoYW5nZWQgdHdvIGJ5dGVzIGF0IDB4OTAgZnJvbSBgREMwMGAgdG8gYEZGRkZgIHdoaWNoIHBvaW50cyB0byBhIHNlY3Rpb24gbGFyZ2VyCit0aGFuIHRoZSBiaW5hcnkuCisKKyMjIyBgaW52YWxpZF9zdHJpbmdfbGVuZ3RoX2N1dF9zaG9ydC5iaW5gCisKK1RydW5jYXRlZCB0aGUgZmlsZSB0byAweEFEIGJ5dGVzLCBhcyB0aGF0IGN1dHMgc3RyaW5nIGxlbmd0aCBVaW50MzJ0IHZhbHVlIGluIAoraGFsZi4KKworIyMjIGBpbnZhbGlkX3N0cmluZ19sZW5ndGguYmluYAorCitDaGFuZ2VkIHR3byBieXRlcyBhdCAweDAwQUMgZnJvbSBgMDUwMGAgdG8gYEZGRkZgIHdoaWNoIGlzIGEgc3RyaW5nIGxlbmd0aAorbGFyZ2VyIHRoYW4gdGhlIGJpbmFyeS4KKworIyMjIGBpbnZhbGlkX3ZlY3Rvcl9sZW5ndGhfY3V0X3Nob3J0LmJpbmAKKworVHJ1bmNhdGVkIHRoZSBmaWxlIHRvIDB4MDEzNiBieXRlcywgYXMgdGhhdCBjdXRzIHZlY3RvciBsZW5ndGggVWludDMydCB2YWx1ZSBpbiAKK2hhbGYuCisKKyMjIyBgaW52YWxpZF9zdHJ1Y3RfZmllbGRfY3V0X3Nob3J0LmJpbmAKKworVHJ1bmNhdGVkIHRoZSBmaWxlIHRvIDB4NWQgYnl0ZXMsIGFzIHRoYXQgY3V0cyBzdHJ1Y3QgZmllbGQgdmFsdWUgaW4gaGFsZi4KKworIyMjIGBpbnZhbGlkX3N0cnVjdF9hcnJheV9maWVsZF9jdXRfc2hvcnQuYmluYAorCitUcnVuY2F0ZWQgdGhlIGZpbGUgdG8gMHg2QSBieXRlcywgYXMgdGhhdCBjdXRzIHN0cnVjdCBhcnJheSBmaWVsZCB2YWx1ZSBpbiBoYWxmLgorCisjIyMgYGludmFsaWRfdmVjdG9yX3N0cnVjdHNfY3V0X3Nob3J0LmJpbmAKKworVHJ1bmNhdGVkIHRoZSBmaWxlIHRvIDB4MDE1NCBieXRlcywgYXMgdGhhdCBjdXRzIGludG8gYSB2ZWN0b3Igb2Ygc3RydWN0cy4KKworIyMjIGBpbnZhbGlkX3ZlY3Rvcl90YWJsZXNfY3V0X3Nob3J0LmJpbmAKKworVHJ1bmNhdGVkIHRoZSBmaWxlIHRvIDB4MDFERSBieXRlcywgYXMgdGhhdCBjdXRzIGludG8gYSB2ZWN0b3Igb2YgdGFibGUgb2Zmc2V0cy4KKworIyMjIGBpbnZhbGlkX3ZlY3Rvcl9zdHJpbmdzX2N1dF9zaG9ydC5iaW5gCisKK1RydW5jYXRlZCB0aGUgZmlsZSB0byAweDAxNzYgYnl0ZXMsIGFzIHRoYXQgY3V0cyBpbnRvIGEgdmVjdG9yIG9mIHN0cmluZworb2Zmc2V0cy4KKworIyMjIGBpbnZhbGlkX3ZlY3Rvcl9zY2FsYXJzX2N1dF9zaG9ydC5iaW5gCisKK1RydW5jYXRlZCB0aGUgZmlsZSB0byAweDAxQzEgYnl0ZXMsIGFzIHRoYXQgY3V0cyBpbnRvIGEgdmVjdG9yIG9mIHNjYWxhcnMgCit2YWx1ZXMuCisKKyMjIyBgaW52YWxpZF92ZWN0b3JfdW5pb25zX2N1dF9zaG9ydC5iaW5gCisKK1RydW5jYXRlZCB0aGUgZmlsZSB0byAweDAxREUgYnl0ZXMsIGFzIHRoYXQgY3V0cyBpbnRvIGEgdmVjdG9yIG9mIHVuaW9uIG9mZnNldCAKK3ZhbHVlcy4KKworIyMjIGBpbnZhbGlkX3VuaW9uX3R5cGVfdmFsdWUuYmluYAorCitDaGFuZ2VkIG9uZSBieXRlIGF0IDB4MDA0RCBmcm9tIGAwMmAgdG8gYEZGYCB3aGljaCBpcyBhIHVuaW9uIHR5cGUgdmFsdWUgdGhhdCBpcworbGFyZ2VyIHRoYW4gdGhlIGVudW0uCisKKyMjIyBgaW52YWxpZF92ZWN0b3JfdW5pb25fdHlwZV92YWx1ZS5iaW5gCisKK0NoYW5nZWQgb25lIGJ5dGUgYXQgMHgwMTMxIGZyb20gYDAyYCB0byBgRkZgIHdoaWNoIGlzIGEgdmVjdG9yIHVuaW9uIHR5cGUgdmFsdWUgCit0aGF0IGlzIGxhcmdlciB0aGFuIHRoZSBlbnVtLgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL2Fubm90YXRlZF9iaW5hcnkvdGVzdHMvaW52YWxpZF9yb290X29mZnNldC5hZmIgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9hbm5vdGF0ZWRfYmluYXJ5L3Rlc3RzL2ludmFsaWRfcm9vdF9vZmZzZXQuYWZiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZmNTA0MTcKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9hbm5vdGF0ZWRfYmluYXJ5L3Rlc3RzL2ludmFsaWRfcm9vdF9vZmZzZXQuYWZiCkBAIC0wLDAgKzEsOTMgQEAKKy8vIEFubm90YXRlZCBGbGF0YnVmZmVyIEJpbmFyeQorLy8KKy8vIFNjaGVtYSBmaWxlOiBhbm5vdGF0ZWRfYmluYXJ5LmZicworLy8gQmluYXJ5IGZpbGU6IHRlc3RzL2ludmFsaWRfcm9vdF9vZmZzZXQuYmluCisKK2hlYWRlcjoKKyAgKzB4MDAwMCB8IEZGIEZGIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgICB8IDB4MDAwMEZGRkYgKDY1NTM1KSBMb2M6ICsweEZGRkYgfCBFUlJPUjogb2Zmc2V0IHRvIHJvb3QgdGFibGUgYEFubm90YXRlZEJpbmFyeS5Gb29gLiBJbnZhbGlkIG9mZnNldCwgcG9pbnRzIG91dHNpZGUgdGhlIGJpbmFyeS4KKyAgKzB4MDAwNCB8IDQxIDRFIDRFIDRGICAgICAgICAgICAgIHwgY2hhcls0XSAgICAgICB8IEFOTk8gICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBGaWxlIElkZW50aWZpZXIKKwordW5rbm93biAobm8ga25vd24gcmVmZXJlbmNlcyk6CisgICsweDAwMDggfCAwMCAwMCAzQSAwMCA2OCAwMCAwQyAwMCB8ID91aW50OF90WzY2NF0gfCAuLjouaC4uLiAgICAgICAgICAgICAgICAgICAgICAgIHwgV0FSTjogbm90aGluZyByZWZlcnMgdG8gdGhpcyBzZWN0aW9uLgorICArMHgwMDEwIHwgMDcgMDAgMDAgMDAgMDggMDAgMTAgMDAgfCAgICAgICAgICAgICAgIHwgLi4uLi4uLi4KKyAgKzB4MDAxOCB8IDE0IDAwIDMwIDAwIDM0IDAwIDA5IDAwIHwgICAgICAgICAgICAgICB8IC4uMC40Li4uCisgICsweDAwMjAgfCAzOCAwMCAzQyAwMCA0MCAwMCA0NCAwMCB8ICAgICAgICAgICAgICAgfCA4LjwuQC5ELgorICArMHgwMDI4IHwgMDAgMDAgMDAgMDAgNDggMDAgNEMgMDAgfCAgICAgICAgICAgICAgIHwgLi4uLkguTC4KKyAgKzB4MDAzMCB8IDUwIDAwIDU0IDAwIDU4IDAwIDBBIDAwIHwgICAgICAgICAgICAgICB8IFAuVC5YLi4uCisgICsweDAwMzggfCA1QyAwMCAwQiAwMCA2MCAwMCAwMCAwMCB8ICAgICAgICAgICAgICAgfCBcLi4uYC4uLgorICArMHgwMDQwIHwgMDAgMDAgNjQgMDAgM0EgMDAgMDAgMDAgfCAgICAgICAgICAgICAgIHwgLi5kLjouLi4KKyAgKzB4MDA0OCB8IDAwIDAwIDAwIDAxIDAyIDAyIDAxIDAxIHwgICAgICAgICAgICAgICB8IC4uLi4uLi4uCisgICsweDAwNTAgfCBEMiAwNCAwMCAwMCAyOCAwMiAwMCAwMCB8ICAgICAgICAgICAgICAgfCAuLi4uKC4uLgorICArMHgwMDU4IHwgMDEgMDAgMDAgMDAgMDIgMDAgMDAgMDAgfCAgICAgICAgICAgICAgIHwgLi4uLi4uLi4KKyAgKzB4MDA2MCB8IDBDIDAwIDAwIDAwIDBBIDAwIDAwIDAwIHwgICAgICAgICAgICAgICB8IC4uLi4uLi4uCisgICsweDAwNjggfCAwQyAwMCAwMCAwMCAxNCAwMCAwMCAwMCB8ICAgICAgICAgICAgICAgfCAuLi4uLi4uLgorICArMHgwMDcwIHwgMDEgMDIgMDMgMDAgQzggMDEgMDAgMDAgfCAgICAgICAgICAgICAgIHwgLi4uLi4uLi4KKyAgKzB4MDA3OCB8IDVDIDAxIDAwIDAwIDUwIDAxIDAwIDAwIHwgICAgICAgICAgICAgICB8IFwuLi5QLi4uCisgICsweDAwODAgfCAzNCAwMSAwMCAwMCAyNCAwMSAwMCAwMCB8ICAgICAgICAgICAgICAgfCA0Li4uJC4uLgorICArMHgwMDg4IHwgMTQgMDEgMDAgMDAgMEQgMDAgMDAgMDAgfCAgICAgICAgICAgICAgIHwgLi4uLi4uLi4KKyAgKzB4MDA5MCB8IERDIDAwIDAwIDAwIEEwIDAwIDAwIDAwIHwgICAgICAgICAgICAgICB8IC4uLi4uLi4uCisgICsweDAwOTggfCA5NCAwMCAwMCAwMCAzOCAwMCAwMCAwMCB8ICAgICAgICAgICAgICAgfCAuLi4uOC4uLgorICArMHgwMEEwIHwgMzMgMDAgMDAgMDAgMUMgMDAgMDAgMDAgfCAgICAgICAgICAgICAgIHwgMy4uLi4uLi4KKyAgKzB4MDBBOCB8IDA0IDAwIDAwIDAwIDA1IDAwIDAwIDAwIHwgICAgICAgICAgICAgICB8IC4uLi4uLi4uCisgICsweDAwQjAgfCA2MSA2QyA2OSA2MyA2NSAwMCAwMCAwMCB8ICAgICAgICAgICAgICAgfCBhbGljZS4uLgorICArMHgwMEI4IHwgMDggMDAgMTMgMDAgMDggMDAgMDQgMDAgfCAgICAgICAgICAgICAgIHwgLi4uLi4uLi4KKyAgKzB4MDBDMCB8IDA4IDAwIDAwIDAwIDAwIDgwIDIzIDQ0IHwgICAgICAgICAgICAgICB8IC4uLi4uLiNECisgICsweDAwQzggfCAwMCAwMCAwMCAwMCAwMCAxMCA3NCA0MCB8ICAgICAgICAgICAgICAgfCAuLi4uLi50QAorICArMHgwMEQwIHwgMDAgMDAgMDAgMDUgMDMgMDAgMDAgMDAgfCAgICAgICAgICAgICAgIHwgLi4uLi4uLi4KKyAgKzB4MDBEOCB8IDM0IDAwIDAwIDAwIDJDIDAwIDAwIDAwIHwgICAgICAgICAgICAgICB8IDQuLi4sLi4uCisgICsweDAwRTAgfCAwNCAwMCAwMCAwMCBEMiBGRSBGRiBGRiB8ICAgICAgICAgICAgICAgfCAuLi4uLi4uLgorICArMHgwMEU4IHwgMDAgODAgMjMgNDQgMTAgMDAgMDAgMDAgfCAgICAgICAgICAgICAgIHwgLi4jRC4uLi4KKyAgKzB4MDBGMCB8IDAwIDAwIDAwIDAwIDAwIEQ4IDhFIDQwIHwgICAgICAgICAgICAgICB8IC4uLi4uLi5ACisgICsweDAwRjggfCAwMCAwMCAwMCAwMCA2QSBGRSBGRiBGRiB8ICAgICAgICAgICAgICAgfCAuLi4uai4uLgorICArMHgwMTAwIHwgMDAgMDAgMDAgMDMgMDQgMDAgMDQgMDAgfCAgICAgICAgICAgICAgIHwgLi4uLi4uLi4KKyAgKzB4MDEwOCB8IDA0IDAwIDAwIDAwIEZBIEZFIEZGIEZGIHwgICAgICAgICAgICAgICB8IC4uLi4uLi4uCisgICsweDAxMTAgfCAwMCAwMCBFNCA0MyAxMCAwMCAwMCAwMCB8ICAgICAgICAgICAgICAgfCAuLi5DLi4uLgorICArMHgwMTE4IHwgMDAgMDAgMDAgMDAgMDAgQzAgNUUgNDAgfCAgICAgICAgICAgICAgIHwgLi4uLi4uXkAKKyAgKzB4MDEyMCB8IDAwIDAwIDAwIDAwIDkyIEZFIEZGIEZGIHwgICAgICAgICAgICAgICB8IC4uLi4uLi4uCisgICsweDAxMjggfCAwMCAwMCAwMCAwMSAwMyAwMCAwMCAwMCB8ICAgICAgICAgICAgICAgfCAuLi4uLi4uLgorICArMHgwMTMwIHwgMDEgMDIgMDEgMDAgMDMgMDAgMDAgMDAgfCAgICAgICAgICAgICAgIHwgLi4uLi4uLi4KKyAgKzB4MDEzOCB8IDMzIDMzIDMzIDMzIDMzIEEzIDQ1IDQwIHwgICAgICAgICAgICAgICB8IDMzMzMzLkVACisgICsweDAxNDAgfCA3RSA1NyAwNCBGRiA1QiA4NyA1MyBDMCB8ICAgICAgICAgICAgICAgfCB+Vy4uWy5TLgorICArMHgwMTQ4IHwgOEQgRjAgRjYgMjAgMDQgQjYgNDIgNDAgfCAgICAgICAgICAgICAgIHwgLi4uIC4uQkAKKyAgKzB4MDE1MCB8IDlGIDc3IDYzIDQxIDYxIDg1IDVFIEMwIHwgICAgICAgICAgICAgICB8IC53Y0FhLl4uCisgICsweDAxNTggfCA4RiAzNSAyMyA4MyBEQyAzNSA0QiBDMCB8ICAgICAgICAgICAgICAgfCAuNSMuLjVLLgorICArMHgwMTYwIHwgRjYgOTcgREQgOTMgODcgQzUgMEEgNDAgfCAgICAgICAgICAgICAgIHwgLi4uLi4uLkAKKyAgKzB4MDE2OCB8IDAwIDAwIDAwIDAwIDAzIDAwIDAwIDAwIHwgICAgICAgICAgICAgICB8IC4uLi4uLi4uCisgICsweDAxNzAgfCAyMCAwMCAwMCAwMCAxNCAwMCAwMCAwMCB8ICAgICAgICAgICAgICAgfCAgLi4uLi4uLgorICArMHgwMTc4IHwgMDQgMDAgMDAgMDAgMDcgMDAgMDAgMDAgfCAgICAgICAgICAgICAgIHwgLi4uLi4uLi4KKyAgKzB4MDE4MCB8IDYzIDY4IDYxIDcyIDZDIDY5IDY1IDAwIHwgICAgICAgICAgICAgICB8IGNoYXJsaWUuCisgICsweDAxODggfCAwMyAwMCAwMCAwMCA2MiA2RiA2MiAwMCB8ICAgICAgICAgICAgICAgfCAuLi4uYm9iLgorICArMHgwMTkwIHwgMDUgMDAgMDAgMDAgNjEgNkMgNjkgNjMgfCAgICAgICAgICAgICAgIHwgLi4uLmFsaWMKKyAgKzB4MDE5OCB8IDY1IDAwIDAwIDAwIDA3IDAwIDAwIDAwIHwgICAgICAgICAgICAgICB8IGUuLi4uLi4uCisgICsweDAxQTAgfCA2MyA2OCA2MSA3MiA2QyA2OSA2NSAwMCB8ICAgICAgICAgICAgICAgfCBjaGFybGllLgorICArMHgwMUE4IHwgMDcgMDAgMDAgMDAgNjMgNjggNjEgNzIgfCAgICAgICAgICAgICAgIHwgLi4uLmNoYXIKKyAgKzB4MDFCMCB8IDZDIDY5IDY1IDAwIDA5IDAwIDAwIDAwIHwgICAgICAgICAgICAgICB8IGxpZS4uLi4uCisgICsweDAxQjggfCAwOSAwMCAwOCAwMCAwNyAwMCAwMSAwMCB8ICAgICAgICAgICAgICAgfCAuLi4uLi4uLgorICArMHgwMUMwIHwgMDIgMDAgMDMgMDAgMDYgMDAgMDUgMDAgfCAgICAgICAgICAgICAgIHwgLi4uLi4uLi4KKyAgKzB4MDFDOCB8IDA0IDAwIDAwIDAwIDNBIEZGIEZGIEZGIHwgICAgICAgICAgICAgICB8IC4uLi46Li4uCisgICsweDAxRDAgfCAwMCAwMCAwMCAwMyAwMiAwMCAwMCAwMCB8ICAgICAgICAgICAgICAgfCAuLi4uLi4uLgorICArMHgwMUQ4IHwgNDQgMDAgMDAgMDAgMTAgMDAgMDAgMDAgfCAgICAgICAgICAgICAgIHwgRC4uLi4uLi4KKyAgKzB4MDFFMCB8IDAwIDAwIDBBIDAwIDFBIDAwIDBDIDAwIHwgICAgICAgICAgICAgICB8IC4uLi4uLi4uCisgICsweDAxRTggfCAwNCAwMCAwOCAwMCAwQSAwMCAwMCAwMCB8ICAgICAgICAgICAgICAgfCAuLi4uLi4uLgorICArMHgwMUYwIHwgMDAgODAgMjMgNDQgMTggMDAgMDAgMDAgfCAgICAgICAgICAgICAgIHwgLi4jRC4uLi4KKyAgKzB4MDFGOCB8IDAwIDAwIDAwIDAwIDAwIEQ4IDhFIDQwIHwgICAgICAgICAgICAgICB8IC4uLi4uLi5ACisgICsweDAyMDAgfCAwMCAwMCAwMCAwMCAwMCAwMCAwNiAwMCB8ICAgICAgICAgICAgICAgfCAuLi4uLi4uLgorICArMHgwMjA4IHwgMDYgMDAgMDUgMDAgMDYgMDAgMDAgMDAgfCAgICAgICAgICAgICAgIHwgLi4uLi4uLi4KKyAgKzB4MDIxMCB8IDAwIDAzIDBBIDAwIDE4IDAwIDBDIDAwIHwgICAgICAgICAgICAgICB8IC4uLi4uLi4uCisgICsweDAyMTggfCAwNCAwMCAwOCAwMCAwQSAwMCAwMCAwMCB8ICAgICAgICAgICAgICAgfCAuLi4uLi4uLgorICArMHgwMjIwIHwgMDAgMDAgRTQgNDMgMTAgMDAgMDAgMDAgfCAgICAgICAgICAgICAgIHwgLi4uQy4uLi4KKyAgKzB4MDIyOCB8IDAwIDAwIDAwIDAwIDAwIEMwIDVFIDQwIHwgICAgICAgICAgICAgICB8IC4uLi4uLl5ACisgICsweDAyMzAgfCAwMCAwMCAwMCAwMCBBMiBGRiBGRiBGRiB8ICAgICAgICAgICAgICAgfCAuLi4uLi4uLgorICArMHgwMjM4IHwgMDAgMDAgMDAgMDEgMkYgMDAgMDAgMDAgfCAgICAgICAgICAgICAgIHwgLi4uLi8uLi4KKyAgKzB4MDI0MCB8IDU0IDY4IDY5IDczIDIwIDY5IDczIDIwIHwgICAgICAgICAgICAgICB8IFRoaXMgaXMgCisgICsweDAyNDggfCA2MSAyMCA2QyA2RiA2RSA2NyAyMCA3MyB8ICAgICAgICAgICAgICAgfCBhIGxvbmcgcworICArMHgwMjUwIHwgNzQgNzIgNjkgNkUgNjcgMjAgNzQgNkYgfCAgICAgICAgICAgICAgIHwgdHJpbmcgdG8KKyAgKzB4MDI1OCB8IDIwIDczIDY4IDZGIDc3IDIwIDY4IDZGIHwgICAgICAgICAgICAgICB8ICBzaG93IGhvCisgICsweDAyNjAgfCA3NyAyMCA2OSA3NCAyMCA2MiA3MiA2NSB8ICAgICAgICAgICAgICAgfCB3IGl0IGJyZQorICArMHgwMjY4IHwgNjEgNkIgNzMgMjAgNzUgNzAgMkUgMDAgfCAgICAgICAgICAgICAgIHwgYWtzIHVwLi4KKyAgKzB4MDI3MCB8IDAwIDAwIDBBIDAwIDE2IDAwIDBDIDAwIHwgICAgICAgICAgICAgICB8IC4uLi4uLi4uCisgICsweDAyNzggfCAwNCAwMCAwOCAwMCAwQSAwMCAwMCAwMCB8ICAgICAgICAgICAgICAgfCAuLi4uLi4uLgorICArMHgwMjgwIHwgNjUgMjAgNzEgNDkgMTQgMDAgMDAgMDAgfCAgICAgICAgICAgICAgIHwgZSBxSS4uLi4KKyAgKzB4MDI4OCB8IEM5IDc2IEJFIDlGIDBDIDI0IEZFIDQwIHwgICAgICAgICAgICAgICB8IC52Li4uJC5ACisgICsweDAyOTAgfCAwMCAwMCAwNiAwMCAwOCAwMCAwNyAwMCB8ICAgICAgICAgICAgICAgfCAuLi4uLi4uLgorICArMHgwMjk4IHwgMDYgMDAgMDAgMDAgMDAgMDAgMDAgMDEgfCAgICAgICAgICAgICAgIHwgLi4uLi4uLi4KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL2Fubm90YXRlZF9iaW5hcnkvdGVzdHMvaW52YWxpZF9yb290X29mZnNldC5iaW4gYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9hbm5vdGF0ZWRfYmluYXJ5L3Rlc3RzL2ludmFsaWRfcm9vdF9vZmZzZXQuYmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM1MzlhMDEKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9hbm5vdGF0ZWRfYmluYXJ5L3Rlc3RzL2ludmFsaWRfcm9vdF9vZmZzZXQuYmluCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL2Fubm90YXRlZF9iaW5hcnkvdGVzdHMvaW52YWxpZF9yb290X3RhYmxlX3Rvb19zaG9ydC5hZmIgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9hbm5vdGF0ZWRfYmluYXJ5L3Rlc3RzL2ludmFsaWRfcm9vdF90YWJsZV90b29fc2hvcnQuYWZiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIyNjlkNGUKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9hbm5vdGF0ZWRfYmluYXJ5L3Rlc3RzL2ludmFsaWRfcm9vdF90YWJsZV90b29fc2hvcnQuYWZiCkBAIC0wLDAgKzEsMjEgQEAKKy8vIEFubm90YXRlZCBGbGF0YnVmZmVyIEJpbmFyeQorLy8KKy8vIFNjaGVtYSBmaWxlOiBhbm5vdGF0ZWRfYmluYXJ5LmZicworLy8gQmluYXJ5IGZpbGU6IHRlc3RzL2ludmFsaWRfcm9vdF90YWJsZV90b29fc2hvcnQuYmluCisKK2hlYWRlcjoKKyAgKzB4MDAgfCA0NCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgICB8IDB4MDAwMDAwNDQgKDY4KSBMb2M6ICsweDQ0IHwgb2Zmc2V0IHRvIHJvb3QgdGFibGUgYEFubm90YXRlZEJpbmFyeS5Gb29gCisgICsweDA0IHwgNDEgNEUgNEUgNEYgICAgICAgICAgICAgfCBjaGFyWzRdICAgICAgfCBBTk5PICAgICAgICAgICAgICAgICAgICAgICB8IEZpbGUgSWRlbnRpZmllcgorCit1bmtub3duIChubyBrbm93biByZWZlcmVuY2VzKToKKyAgKzB4MDggfCAwMCAwMCAzQSAwMCA2OCAwMCAwQyAwMCB8ID91aW50OF90WzYwXSB8IC4uOi5oLi4uICAgICAgICAgICAgICAgICAgIHwgV0FSTjogbm90aGluZyByZWZlcnMgdG8gdGhpcyBzZWN0aW9uLgorICArMHgxMCB8IDA3IDAwIDAwIDAwIDA4IDAwIDEwIDAwIHwgICAgICAgICAgICAgIHwgLi4uLi4uLi4KKyAgKzB4MTggfCAxNCAwMCAzMCAwMCAzNCAwMCAwOSAwMCB8ICAgICAgICAgICAgICB8IC4uMC40Li4uCisgICsweDIwIHwgMzggMDAgM0MgMDAgNDAgMDAgNDQgMDAgfCAgICAgICAgICAgICAgfCA4LjwuQC5ELgorICArMHgyOCB8IDAwIDAwIDAwIDAwIDQ4IDAwIDRDIDAwIHwgICAgICAgICAgICAgIHwgLi4uLkguTC4KKyAgKzB4MzAgfCA1MCAwMCA1NCAwMCA1OCAwMCAwQSAwMCB8ICAgICAgICAgICAgICB8IFAuVC5YLi4uCisgICsweDM4IHwgNUMgMDAgMEIgMDAgNjAgMDAgMDAgMDAgfCAgICAgICAgICAgICAgfCBcLi4uYC4uLgorICArMHg0MCB8IDAwIDAwIDY0IDAwICAgICAgICAgICAgIHwgICAgICAgICAgICAgIHwgLi5kLgorCityb290X3RhYmxlIChBbm5vdGF0ZWRCaW5hcnkuRm9vKToKKyAgKzB4NDQgfCAzQSAwMCAgICAgICAgICAgICAgICAgICB8ID91aW50OF90WzJdICB8IDouICAgICAgICAgICAgICAgICAgICAgICAgIHwgRVJST1I6IG9mZnNldCB0byB2dGFibGUuIEluY29tcGxldGUgYmluYXJ5LCBleHBlY3RlZCB0byByZWFkIDQgYnl0ZXMuCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9hbm5vdGF0ZWRfYmluYXJ5L3Rlc3RzL2ludmFsaWRfcm9vdF90YWJsZV90b29fc2hvcnQuYmluIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvYW5ub3RhdGVkX2JpbmFyeS90ZXN0cy9pbnZhbGlkX3Jvb3RfdGFibGVfdG9vX3Nob3J0LmJpbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYjFjN2ZjCi0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvYW5ub3RhdGVkX2JpbmFyeS90ZXN0cy9pbnZhbGlkX3Jvb3RfdGFibGVfdG9vX3Nob3J0LmJpbgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9hbm5vdGF0ZWRfYmluYXJ5L3Rlc3RzL2ludmFsaWRfcm9vdF90YWJsZV92dGFibGVfb2Zmc2V0LmFmYiBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL2Fubm90YXRlZF9iaW5hcnkvdGVzdHMvaW52YWxpZF9yb290X3RhYmxlX3Z0YWJsZV9vZmZzZXQuYWZiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQxYzYyNjAKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9hbm5vdGF0ZWRfYmluYXJ5L3Rlc3RzL2ludmFsaWRfcm9vdF90YWJsZV92dGFibGVfb2Zmc2V0LmFmYgpAQCAtMCwwICsxLDk4IEBACisvLyBBbm5vdGF0ZWQgRmxhdGJ1ZmZlciBCaW5hcnkKKy8vCisvLyBTY2hlbWEgZmlsZTogYW5ub3RhdGVkX2JpbmFyeS5mYnMKKy8vIEJpbmFyeSBmaWxlOiB0ZXN0cy9pbnZhbGlkX3Jvb3RfdGFibGVfdnRhYmxlX29mZnNldC5iaW4KKworaGVhZGVyOgorICArMHgwMDAwIHwgNDQgMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICAgIHwgMHgwMDAwMDA0NCAoNjgpIExvYzogKzB4MDA0NCAgICAgICAgICAgICAgICB8IG9mZnNldCB0byByb290IHRhYmxlIGBBbm5vdGF0ZWRCaW5hcnkuRm9vYAorICArMHgwMDA0IHwgNDEgNEUgNEUgNEYgICAgICAgICAgICAgfCBjaGFyWzRdICAgICAgIHwgQU5OTyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEZpbGUgSWRlbnRpZmllcgorCit1bmtub3duIChubyBrbm93biByZWZlcmVuY2VzKToKKyAgKzB4MDAwOCB8IDAwIDAwIDNBIDAwIDY4IDAwIDBDIDAwIHwgP3VpbnQ4X3RbNjBdICB8IC4uOi5oLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBXQVJOOiBub3RoaW5nIHJlZmVycyB0byB0aGlzIHNlY3Rpb24uCisgICsweDAwMTAgfCAwNyAwMCAwMCAwMCAwOCAwMCAxMCAwMCB8ICAgICAgICAgICAgICAgfCAuLi4uLi4uLgorICArMHgwMDE4IHwgMTQgMDAgMzAgMDAgMzQgMDAgMDkgMDAgfCAgICAgICAgICAgICAgIHwgLi4wLjQuLi4KKyAgKzB4MDAyMCB8IDM4IDAwIDNDIDAwIDQwIDAwIDQ0IDAwIHwgICAgICAgICAgICAgICB8IDguPC5ALkQuCisgICsweDAwMjggfCAwMCAwMCAwMCAwMCA0OCAwMCA0QyAwMCB8ICAgICAgICAgICAgICAgfCAuLi4uSC5MLgorICArMHgwMDMwIHwgNTAgMDAgNTQgMDAgNTggMDAgMEEgMDAgfCAgICAgICAgICAgICAgIHwgUC5ULlguLi4KKyAgKzB4MDAzOCB8IDVDIDAwIDBCIDAwIDYwIDAwIDAwIDAwIHwgICAgICAgICAgICAgICB8IFwuLi5gLi4uCisgICsweDAwNDAgfCAwMCAwMCA2NCAwMCAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgfCAuLmQuCisKK3Jvb3RfdGFibGUgKEFubm90YXRlZEJpbmFyeS5Gb28pOgorICArMHgwMDQ0IHwgRkYgRkYgMDAgMDAgICAgICAgICAgICAgfCBTT2Zmc2V0MzIgICAgIHwgMHgwMDAwRkZGRiAoNjU1MzUpIExvYzogKzB4RkZGRkZGRkZGRkZGMDA0NSB8IEVSUk9SOiBvZmZzZXQgdG8gdnRhYmxlLiBJbnZhbGlkIG9mZnNldCwgcG9pbnRzIG91dHNpZGUgdGhlIGJpbmFyeS4KKwordW5rbm93biAobm8ga25vd24gcmVmZXJlbmNlcyk6CisgICsweDAwNDggfCAwMCAwMCAwMCAwMSAwMiAwMiAwMSAwMSB8ID91aW50OF90WzYwMF0gfCAuLi4uLi4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgV0FSTjogbm90aGluZyByZWZlcnMgdG8gdGhpcyBzZWN0aW9uLgorICArMHgwMDUwIHwgRDIgMDQgMDAgMDAgMjggMDIgMDAgMDAgfCAgICAgICAgICAgICAgIHwgLi4uLiguLi4KKyAgKzB4MDA1OCB8IDAxIDAwIDAwIDAwIDAyIDAwIDAwIDAwIHwgICAgICAgICAgICAgICB8IC4uLi4uLi4uCisgICsweDAwNjAgfCAwQyAwMCAwMCAwMCAwQSAwMCAwMCAwMCB8ICAgICAgICAgICAgICAgfCAuLi4uLi4uLgorICArMHgwMDY4IHwgMEMgMDAgMDAgMDAgMTQgMDAgMDAgMDAgfCAgICAgICAgICAgICAgIHwgLi4uLi4uLi4KKyAgKzB4MDA3MCB8IDAxIDAyIDAzIDAwIEM4IDAxIDAwIDAwIHwgICAgICAgICAgICAgICB8IC4uLi4uLi4uCisgICsweDAwNzggfCA1QyAwMSAwMCAwMCA1MCAwMSAwMCAwMCB8ICAgICAgICAgICAgICAgfCBcLi4uUC4uLgorICArMHgwMDgwIHwgMzQgMDEgMDAgMDAgMjQgMDEgMDAgMDAgfCAgICAgICAgICAgICAgIHwgNC4uLiQuLi4KKyAgKzB4MDA4OCB8IDE0IDAxIDAwIDAwIDBEIDAwIDAwIDAwIHwgICAgICAgICAgICAgICB8IC4uLi4uLi4uCisgICsweDAwOTAgfCBEQyAwMCAwMCAwMCBBMCAwMCAwMCAwMCB8ICAgICAgICAgICAgICAgfCAuLi4uLi4uLgorICArMHgwMDk4IHwgOTQgMDAgMDAgMDAgMzggMDAgMDAgMDAgfCAgICAgICAgICAgICAgIHwgLi4uLjguLi4KKyAgKzB4MDBBMCB8IDMzIDAwIDAwIDAwIDFDIDAwIDAwIDAwIHwgICAgICAgICAgICAgICB8IDMuLi4uLi4uCisgICsweDAwQTggfCAwNCAwMCAwMCAwMCAwNSAwMCAwMCAwMCB8ICAgICAgICAgICAgICAgfCAuLi4uLi4uLgorICArMHgwMEIwIHwgNjEgNkMgNjkgNjMgNjUgMDAgMDAgMDAgfCAgICAgICAgICAgICAgIHwgYWxpY2UuLi4KKyAgKzB4MDBCOCB8IDA4IDAwIDEzIDAwIDA4IDAwIDA0IDAwIHwgICAgICAgICAgICAgICB8IC4uLi4uLi4uCisgICsweDAwQzAgfCAwOCAwMCAwMCAwMCAwMCA4MCAyMyA0NCB8ICAgICAgICAgICAgICAgfCAuLi4uLi4jRAorICArMHgwMEM4IHwgMDAgMDAgMDAgMDAgMDAgMTAgNzQgNDAgfCAgICAgICAgICAgICAgIHwgLi4uLi4udEAKKyAgKzB4MDBEMCB8IDAwIDAwIDAwIDA1IDAzIDAwIDAwIDAwIHwgICAgICAgICAgICAgICB8IC4uLi4uLi4uCisgICsweDAwRDggfCAzNCAwMCAwMCAwMCAyQyAwMCAwMCAwMCB8ICAgICAgICAgICAgICAgfCA0Li4uLC4uLgorICArMHgwMEUwIHwgMDQgMDAgMDAgMDAgRDIgRkUgRkYgRkYgfCAgICAgICAgICAgICAgIHwgLi4uLi4uLi4KKyAgKzB4MDBFOCB8IDAwIDgwIDIzIDQ0IDEwIDAwIDAwIDAwIHwgICAgICAgICAgICAgICB8IC4uI0QuLi4uCisgICsweDAwRjAgfCAwMCAwMCAwMCAwMCAwMCBEOCA4RSA0MCB8ICAgICAgICAgICAgICAgfCAuLi4uLi4uQAorICArMHgwMEY4IHwgMDAgMDAgMDAgMDAgNkEgRkUgRkYgRkYgfCAgICAgICAgICAgICAgIHwgLi4uLmouLi4KKyAgKzB4MDEwMCB8IDAwIDAwIDAwIDAzIDA0IDAwIDA0IDAwIHwgICAgICAgICAgICAgICB8IC4uLi4uLi4uCisgICsweDAxMDggfCAwNCAwMCAwMCAwMCBGQSBGRSBGRiBGRiB8ICAgICAgICAgICAgICAgfCAuLi4uLi4uLgorICArMHgwMTEwIHwgMDAgMDAgRTQgNDMgMTAgMDAgMDAgMDAgfCAgICAgICAgICAgICAgIHwgLi4uQy4uLi4KKyAgKzB4MDExOCB8IDAwIDAwIDAwIDAwIDAwIEMwIDVFIDQwIHwgICAgICAgICAgICAgICB8IC4uLi4uLl5ACisgICsweDAxMjAgfCAwMCAwMCAwMCAwMCA5MiBGRSBGRiBGRiB8ICAgICAgICAgICAgICAgfCAuLi4uLi4uLgorICArMHgwMTI4IHwgMDAgMDAgMDAgMDEgMDMgMDAgMDAgMDAgfCAgICAgICAgICAgICAgIHwgLi4uLi4uLi4KKyAgKzB4MDEzMCB8IDAxIDAyIDAxIDAwIDAzIDAwIDAwIDAwIHwgICAgICAgICAgICAgICB8IC4uLi4uLi4uCisgICsweDAxMzggfCAzMyAzMyAzMyAzMyAzMyBBMyA0NSA0MCB8ICAgICAgICAgICAgICAgfCAzMzMzMy5FQAorICArMHgwMTQwIHwgN0UgNTcgMDQgRkYgNUIgODcgNTMgQzAgfCAgICAgICAgICAgICAgIHwgflcuLlsuUy4KKyAgKzB4MDE0OCB8IDhEIEYwIEY2IDIwIDA0IEI2IDQyIDQwIHwgICAgICAgICAgICAgICB8IC4uLiAuLkJACisgICsweDAxNTAgfCA5RiA3NyA2MyA0MSA2MSA4NSA1RSBDMCB8ICAgICAgICAgICAgICAgfCAud2NBYS5eLgorICArMHgwMTU4IHwgOEYgMzUgMjMgODMgREMgMzUgNEIgQzAgfCAgICAgICAgICAgICAgIHwgLjUjLi41Sy4KKyAgKzB4MDE2MCB8IEY2IDk3IEREIDkzIDg3IEM1IDBBIDQwIHwgICAgICAgICAgICAgICB8IC4uLi4uLi5ACisgICsweDAxNjggfCAwMCAwMCAwMCAwMCAwMyAwMCAwMCAwMCB8ICAgICAgICAgICAgICAgfCAuLi4uLi4uLgorICArMHgwMTcwIHwgMjAgMDAgMDAgMDAgMTQgMDAgMDAgMDAgfCAgICAgICAgICAgICAgIHwgIC4uLi4uLi4KKyAgKzB4MDE3OCB8IDA0IDAwIDAwIDAwIDA3IDAwIDAwIDAwIHwgICAgICAgICAgICAgICB8IC4uLi4uLi4uCisgICsweDAxODAgfCA2MyA2OCA2MSA3MiA2QyA2OSA2NSAwMCB8ICAgICAgICAgICAgICAgfCBjaGFybGllLgorICArMHgwMTg4IHwgMDMgMDAgMDAgMDAgNjIgNkYgNjIgMDAgfCAgICAgICAgICAgICAgIHwgLi4uLmJvYi4KKyAgKzB4MDE5MCB8IDA1IDAwIDAwIDAwIDYxIDZDIDY5IDYzIHwgICAgICAgICAgICAgICB8IC4uLi5hbGljCisgICsweDAxOTggfCA2NSAwMCAwMCAwMCAwNyAwMCAwMCAwMCB8ICAgICAgICAgICAgICAgfCBlLi4uLi4uLgorICArMHgwMUEwIHwgNjMgNjggNjEgNzIgNkMgNjkgNjUgMDAgfCAgICAgICAgICAgICAgIHwgY2hhcmxpZS4KKyAgKzB4MDFBOCB8IDA3IDAwIDAwIDAwIDYzIDY4IDYxIDcyIHwgICAgICAgICAgICAgICB8IC4uLi5jaGFyCisgICsweDAxQjAgfCA2QyA2OSA2NSAwMCAwOSAwMCAwMCAwMCB8ICAgICAgICAgICAgICAgfCBsaWUuLi4uLgorICArMHgwMUI4IHwgMDkgMDAgMDggMDAgMDcgMDAgMDEgMDAgfCAgICAgICAgICAgICAgIHwgLi4uLi4uLi4KKyAgKzB4MDFDMCB8IDAyIDAwIDAzIDAwIDA2IDAwIDA1IDAwIHwgICAgICAgICAgICAgICB8IC4uLi4uLi4uCisgICsweDAxQzggfCAwNCAwMCAwMCAwMCAzQSBGRiBGRiBGRiB8ICAgICAgICAgICAgICAgfCAuLi4uOi4uLgorICArMHgwMUQwIHwgMDAgMDAgMDAgMDMgMDIgMDAgMDAgMDAgfCAgICAgICAgICAgICAgIHwgLi4uLi4uLi4KKyAgKzB4MDFEOCB8IDQ0IDAwIDAwIDAwIDEwIDAwIDAwIDAwIHwgICAgICAgICAgICAgICB8IEQuLi4uLi4uCisgICsweDAxRTAgfCAwMCAwMCAwQSAwMCAxQSAwMCAwQyAwMCB8ICAgICAgICAgICAgICAgfCAuLi4uLi4uLgorICArMHgwMUU4IHwgMDQgMDAgMDggMDAgMEEgMDAgMDAgMDAgfCAgICAgICAgICAgICAgIHwgLi4uLi4uLi4KKyAgKzB4MDFGMCB8IDAwIDgwIDIzIDQ0IDE4IDAwIDAwIDAwIHwgICAgICAgICAgICAgICB8IC4uI0QuLi4uCisgICsweDAxRjggfCAwMCAwMCAwMCAwMCAwMCBEOCA4RSA0MCB8ICAgICAgICAgICAgICAgfCAuLi4uLi4uQAorICArMHgwMjAwIHwgMDAgMDAgMDAgMDAgMDAgMDAgMDYgMDAgfCAgICAgICAgICAgICAgIHwgLi4uLi4uLi4KKyAgKzB4MDIwOCB8IDA2IDAwIDA1IDAwIDA2IDAwIDAwIDAwIHwgICAgICAgICAgICAgICB8IC4uLi4uLi4uCisgICsweDAyMTAgfCAwMCAwMyAwQSAwMCAxOCAwMCAwQyAwMCB8ICAgICAgICAgICAgICAgfCAuLi4uLi4uLgorICArMHgwMjE4IHwgMDQgMDAgMDggMDAgMEEgMDAgMDAgMDAgfCAgICAgICAgICAgICAgIHwgLi4uLi4uLi4KKyAgKzB4MDIyMCB8IDAwIDAwIEU0IDQzIDEwIDAwIDAwIDAwIHwgICAgICAgICAgICAgICB8IC4uLkMuLi4uCisgICsweDAyMjggfCAwMCAwMCAwMCAwMCAwMCBDMCA1RSA0MCB8ICAgICAgICAgICAgICAgfCAuLi4uLi5eQAorICArMHgwMjMwIHwgMDAgMDAgMDAgMDAgQTIgRkYgRkYgRkYgfCAgICAgICAgICAgICAgIHwgLi4uLi4uLi4KKyAgKzB4MDIzOCB8IDAwIDAwIDAwIDAxIDJGIDAwIDAwIDAwIHwgICAgICAgICAgICAgICB8IC4uLi4vLi4uCisgICsweDAyNDAgfCA1NCA2OCA2OSA3MyAyMCA2OSA3MyAyMCB8ICAgICAgICAgICAgICAgfCBUaGlzIGlzIAorICArMHgwMjQ4IHwgNjEgMjAgNkMgNkYgNkUgNjcgMjAgNzMgfCAgICAgICAgICAgICAgIHwgYSBsb25nIHMKKyAgKzB4MDI1MCB8IDc0IDcyIDY5IDZFIDY3IDIwIDc0IDZGIHwgICAgICAgICAgICAgICB8IHRyaW5nIHRvCisgICsweDAyNTggfCAyMCA3MyA2OCA2RiA3NyAyMCA2OCA2RiB8ICAgICAgICAgICAgICAgfCAgc2hvdyBobworICArMHgwMjYwIHwgNzcgMjAgNjkgNzQgMjAgNjIgNzIgNjUgfCAgICAgICAgICAgICAgIHwgdyBpdCBicmUKKyAgKzB4MDI2OCB8IDYxIDZCIDczIDIwIDc1IDcwIDJFIDAwIHwgICAgICAgICAgICAgICB8IGFrcyB1cC4uCisgICsweDAyNzAgfCAwMCAwMCAwQSAwMCAxNiAwMCAwQyAwMCB8ICAgICAgICAgICAgICAgfCAuLi4uLi4uLgorICArMHgwMjc4IHwgMDQgMDAgMDggMDAgMEEgMDAgMDAgMDAgfCAgICAgICAgICAgICAgIHwgLi4uLi4uLi4KKyAgKzB4MDI4MCB8IDY1IDIwIDcxIDQ5IDE0IDAwIDAwIDAwIHwgICAgICAgICAgICAgICB8IGUgcUkuLi4uCisgICsweDAyODggfCBDOSA3NiBCRSA5RiAwQyAyNCBGRSA0MCB8ICAgICAgICAgICAgICAgfCAudi4uLiQuQAorICArMHgwMjkwIHwgMDAgMDAgMDYgMDAgMDggMDAgMDcgMDAgfCAgICAgICAgICAgICAgIHwgLi4uLi4uLi4KKyAgKzB4MDI5OCB8IDA2IDAwIDAwIDAwIDAwIDAwIDAwIDAxIHwgICAgICAgICAgICAgICB8IC4uLi4uLi4uCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9hbm5vdGF0ZWRfYmluYXJ5L3Rlc3RzL2ludmFsaWRfcm9vdF90YWJsZV92dGFibGVfb2Zmc2V0LmJpbiBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL2Fubm90YXRlZF9iaW5hcnkvdGVzdHMvaW52YWxpZF9yb290X3RhYmxlX3Z0YWJsZV9vZmZzZXQuYmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEzMDc1ZWEKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9hbm5vdGF0ZWRfYmluYXJ5L3Rlc3RzL2ludmFsaWRfcm9vdF90YWJsZV92dGFibGVfb2Zmc2V0LmJpbgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9hbm5vdGF0ZWRfYmluYXJ5L3Rlc3RzL2ludmFsaWRfc3RyaW5nX2xlbmd0aC5hZmIgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9hbm5vdGF0ZWRfYmluYXJ5L3Rlc3RzL2ludmFsaWRfc3RyaW5nX2xlbmd0aC5hZmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzMyY2JhZgotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL2Fubm90YXRlZF9iaW5hcnkvdGVzdHMvaW52YWxpZF9zdHJpbmdfbGVuZ3RoLmFmYgpAQCAtMCwwICsxLDI5NSBAQAorLy8gQW5ub3RhdGVkIEZsYXRidWZmZXIgQmluYXJ5CisvLworLy8gU2NoZW1hIGZpbGU6IGFubm90YXRlZF9iaW5hcnkuZmJzCisvLyBCaW5hcnkgZmlsZTogdGVzdHMvaW52YWxpZF9zdHJpbmdfbGVuZ3RoLmJpbgorCitoZWFkZXI6CisgICsweDAwMDAgfCA0NCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDA0NCAoNjgpIExvYzogKzB4MDA0NCAgIHwgb2Zmc2V0IHRvIHJvb3QgdGFibGUgYEFubm90YXRlZEJpbmFyeS5Gb29gCisgICsweDAwMDQgfCA0MSA0RSA0RSA0RiAgICAgICAgICAgICB8IGNoYXJbNF0gICAgIHwgQU5OTyAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgRmlsZSBJZGVudGlmaWVyCisKK3BhZGRpbmc6CisgICsweDAwMDggfCAwMCAwMCAgICAgICAgICAgICAgICAgICB8IHVpbnQ4X3RbMl0gIHwgLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgcGFkZGluZworCit2dGFibGUgKEFubm90YXRlZEJpbmFyeS5Gb28pOgorICArMHgwMDBBIHwgM0EgMDAgICAgICAgICAgICAgICAgICAgfCB1aW50MTZfdCAgICB8IDB4MDAzQSAoNTgpICAgICAgICAgICAgICAgICAgICB8IHNpemUgb2YgdGhpcyB2dGFibGUKKyAgKzB4MDAwQyB8IDY4IDAwICAgICAgICAgICAgICAgICAgIHwgdWludDE2X3QgICAgfCAweDAwNjggKDEwNCkgICAgICAgICAgICAgICAgICAgfCBzaXplIG9mIHJlZmVycmluZyB0YWJsZQorICArMHgwMDBFIHwgMEMgMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgICB8IDB4MDAwQyAoMTIpICAgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgY291bnRlcmAgKGlkOiAwKQorICArMHgwMDEwIHwgMDcgMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgICB8IDB4MDAwNyAoNykgICAgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgaGVhbHRoeWAgKGlkOiAxKQorICArMHgwMDEyIHwgMDAgMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgICB8IDB4MDAwMCAoMCkgICAgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgbGV2ZWxgIChpZDogMikgPGRlZmF1bHRzIHRvIDk5PiAoTG9uZykKKyAgKzB4MDAxNCB8IDA4IDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgfCAweDAwMDggKDgpICAgICAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYG1lYWxgIChpZDogMykKKyAgKzB4MDAxNiB8IDEwIDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgfCAweDAwMTAgKDE2KSAgICAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYGJhcmAgKGlkOiA0KQorICArMHgwMDE4IHwgMTQgMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgICB8IDB4MDAxNCAoMjApICAgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgaG9tZWAgKGlkOiA1KQorICArMHgwMDFBIHwgMzAgMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgICB8IDB4MDAzMCAoNDgpICAgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgbmFtZWAgKGlkOiA2KQorICArMHgwMDFDIHwgMzQgMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgICB8IDB4MDAzNCAoNTIpICAgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgYmFyc2AgKGlkOiA3KQorICArMHgwMDFFIHwgMDkgMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgICB8IDB4MDAwOSAoOSkgICAgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgYmFyX2Jhel90eXBlYCAoaWQ6IDgpCisgICsweDAwMjAgfCAzOCAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgIHwgMHgwMDM4ICg1NikgICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBiYXJfYmF6YCAoaWQ6IDkpCisgICsweDAwMjIgfCAzQyAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgIHwgMHgwMDNDICg2MCkgICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBhY2NvdW50c2AgKGlkOiAxMCkKKyAgKzB4MDAyNCB8IDQwIDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgfCAweDAwNDAgKDY0KSAgICAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYGJvYmAgKGlkOiAxMSkKKyAgKzB4MDAyNiB8IDQ0IDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgfCAweDAwNDQgKDY4KSAgICAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYGFsaWNlYCAoaWQ6IDEyKQorICArMHgwMDI4IHwgMDAgMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgICB8IDB4MDAwMCAoMCkgICAgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgbWF5YmVfaTMyYCAoaWQ6IDEzKSA8ZGVmYXVsdHMgdG8gMD4gKEludCkKKyAgKzB4MDAyQSB8IDAwIDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgfCAweDAwMDAgKDApICAgICAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYGRlZmF1bHRfaTMyYCAoaWQ6IDE0KSA8ZGVmYXVsdHMgdG8gNDI+IChJbnQpCisgICsweDAwMkMgfCA0OCAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgIHwgMHgwMDQ4ICg3MikgICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBqdXN0X2kzMmAgKGlkOiAxNSkKKyAgKzB4MDAyRSB8IDRDIDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgfCAweDAwNEMgKDc2KSAgICAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYG5hbWVzYCAoaWQ6IDE2KQorICArMHgwMDMwIHwgNTAgMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgICB8IDB4MDA1MCAoODApICAgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgcG9pbnRzX29mX2ludGVyZXN0YCAoaWQ6IDE3KQorICArMHgwMDMyIHwgNTQgMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgICB8IDB4MDA1NCAoODQpICAgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgZm9vYmFyc190eXBlYCAoaWQ6IDE4KQorICArMHgwMDM0IHwgNTggMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgICB8IDB4MDA1OCAoODgpICAgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgZm9vYmFyc2AgKGlkOiAxOSkKKyAgKzB4MDAzNiB8IDBBIDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgfCAweDAwMEEgKDEwKSAgICAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYG1lYXN1cmVtZW50X3R5cGVgIChpZDogMjApCisgICsweDAwMzggfCA1QyAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgIHwgMHgwMDVDICg5MikgICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBtZWFzdXJlbWVudGAgKGlkOiAyMSkKKyAgKzB4MDAzQSB8IDBCIDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgfCAweDAwMEIgKDExKSAgICAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYGFueXRoaW5nX3R5cGVgIChpZDogMjIpCisgICsweDAwM0MgfCA2MCAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgIHwgMHgwMDYwICg5NikgICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBhbnl0aGluZ2AgKGlkOiAyMykKKyAgKzB4MDAzRSB8IDAwIDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgfCAweDAwMDAgKDApICAgICAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYHRlbXBlcmF0dXJlYCAoaWQ6IDI0KSA8ZGVmYXVsdHMgdG8gOTguNjAwMDAwPiAoRmxvYXQpCisgICsweDAwNDAgfCAwMCAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgIHwgMHgwMDAwICgwKSAgICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGB0ZWV0b3RhbGVyYCAoaWQ6IDI1KSA8bnVsbD4gKE9iaikKKyAgKzB4MDA0MiB8IDY0IDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgfCAweDAwNjQgKDEwMCkgICAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYGNoYXJsaWVgIChpZDogMjYpCisKK3Jvb3RfdGFibGUgKEFubm90YXRlZEJpbmFyeS5Gb28pOgorICArMHgwMDQ0IHwgM0EgMDAgMDAgMDAgICAgICAgICAgICAgfCBTT2Zmc2V0MzIgICB8IDB4MDAwMDAwM0EgKDU4KSBMb2M6ICsweDAwMEEgICB8IG9mZnNldCB0byB2dGFibGUKKyAgKzB4MDA0OCB8IDAwIDAwIDAwICAgICAgICAgICAgICAgIHwgdWludDhfdFszXSAgfCAuLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBwYWRkaW5nCisgICsweDAwNEIgfCAwMSAgICAgICAgICAgICAgICAgICAgICB8IHVpbnQ4X3QgICAgIHwgMHgwMSAoMSkgICAgICAgICAgICAgICAgICAgICAgIHwgdGFibGUgZmllbGQgYGhlYWx0aHlgIChCb29sKQorICArMHgwMDRDIHwgMDIgICAgICAgICAgICAgICAgICAgICAgfCB1aW50OF90ICAgICB8IDB4MDIgKDIpICAgICAgICAgICAgICAgICAgICAgICB8IHRhYmxlIGZpZWxkIGBtZWFsYCAoQnl0ZSkKKyAgKzB4MDA0RCB8IDAyICAgICAgICAgICAgICAgICAgICAgIHwgVVR5cGU4ICAgICAgfCAweDAyICgyKSAgICAgICAgICAgICAgICAgICAgICAgfCB0YWJsZSBmaWVsZCBgYmFyX2Jhel90eXBlYCAoVVR5cGUpCisgICsweDAwNEUgfCAwMSAgICAgICAgICAgICAgICAgICAgICB8IFVUeXBlOCAgICAgIHwgMHgwMSAoMSkgICAgICAgICAgICAgICAgICAgICAgIHwgdGFibGUgZmllbGQgYG1lYXN1cmVtZW50X3R5cGVgIChVVHlwZSkKKyAgKzB4MDA0RiB8IDAxICAgICAgICAgICAgICAgICAgICAgIHwgVVR5cGU4ICAgICAgfCAweDAxICgxKSAgICAgICAgICAgICAgICAgICAgICAgfCB0YWJsZSBmaWVsZCBgYW55dGhpbmdfdHlwZWAgKFVUeXBlKQorICArMHgwMDUwIHwgRDIgMDQgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICB8IDB4MDAwMDA0RDIgKDEyMzQpICAgICAgICAgICAgICB8IHRhYmxlIGZpZWxkIGBjb3VudGVyYCAoSW50KQorICArMHgwMDU0IHwgMjggMDIgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDAyMjggKDU1MikgTG9jOiArMHgwMjdDICB8IG9mZnNldCB0byBmaWVsZCBgYmFyYCAodGFibGUpCisgICsweDAwNTggfCAwMSAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgIHwgMHgwMDAwMDAwMSAoMSkgICAgICAgICAgICAgICAgIHwgc3RydWN0IGZpZWxkIGBBbm5vdGF0ZWRCaW5hcnkuQnVpbGRpbmcuZmxvb3JzYCAoSW50KQorICArMHgwMDVDIHwgMDIgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICB8IDB4MDAwMDAwMDIgKDIpICAgICAgICAgICAgICAgICB8IHN0cnVjdCBmaWVsZCBgQW5ub3RhdGVkQmluYXJ5LkJ1aWxkaW5nLmRvb3JzYCAoSW50KQorICArMHgwMDYwIHwgMEMgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICB8IDB4MDAwMDAwMEMgKDEyKSAgICAgICAgICAgICAgICB8IHN0cnVjdCBmaWVsZCBgQW5ub3RhdGVkQmluYXJ5LkJ1aWxkaW5nLndpbmRvd3NgIChJbnQpCisgICsweDAwNjQgfCAwQSAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgIHwgMHgwMDAwMDAwQSAoMTApICAgICAgICAgICAgICAgIHwgYXJyYXkgZmllbGQgYEFubm90YXRlZEJpbmFyeS5EaW1lbnNpb24udmFsdWVzYFswXSAoSW50KQorICArMHgwMDY4IHwgMEMgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICB8IDB4MDAwMDAwMEMgKDEyKSAgICAgICAgICAgICAgICB8IGFycmF5IGZpZWxkIGBBbm5vdGF0ZWRCaW5hcnkuRGltZW5zaW9uLnZhbHVlc2BbMV0gKEludCkKKyAgKzB4MDA2QyB8IDE0IDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgfCAweDAwMDAwMDE0ICgyMCkgICAgICAgICAgICAgICAgfCBhcnJheSBmaWVsZCBgQW5ub3RhdGVkQmluYXJ5LkRpbWVuc2lvbi52YWx1ZXNgWzJdIChJbnQpCisgICsweDAwNzAgfCAwMSAgICAgICAgICAgICAgICAgICAgICB8IHVpbnQ4X3QgICAgIHwgMHgwMSAoMSkgICAgICAgICAgICAgICAgICAgICAgIHwgc3RydWN0IGZpZWxkIGBBbm5vdGF0ZWRCaW5hcnkuVG9sZXJhbmNlLndpZHRoYCAoVUJ5dGUpCisgICsweDAwNzEgfCAwMiAgICAgICAgICAgICAgICAgICAgICB8IHVpbnQ4X3QgICAgIHwgMHgwMiAoMikgICAgICAgICAgICAgICAgICAgICAgIHwgc3RydWN0IGZpZWxkIGBBbm5vdGF0ZWRCaW5hcnkuVG9sZXJhbmNlLndpZHRoYCAoVUJ5dGUpCisgICsweDAwNzIgfCAwMyAgICAgICAgICAgICAgICAgICAgICB8IHVpbnQ4X3QgICAgIHwgMHgwMyAoMykgICAgICAgICAgICAgICAgICAgICAgIHwgc3RydWN0IGZpZWxkIGBBbm5vdGF0ZWRCaW5hcnkuVG9sZXJhbmNlLndpZHRoYCAoVUJ5dGUpCisgICsweDAwNzMgfCAwMCAgICAgICAgICAgICAgICAgICAgICB8IHVpbnQ4X3RbMV0gIHwgLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgcGFkZGluZworICArMHgwMDc0IHwgQzggMDEgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDAxQzggKDQ1NikgTG9jOiArMHgwMjNDICB8IG9mZnNldCB0byBmaWVsZCBgbmFtZWAgKHN0cmluZykKKyAgKzB4MDA3OCB8IDVDIDAxIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMTVDICgzNDgpIExvYzogKzB4MDFENCAgfCBvZmZzZXQgdG8gZmllbGQgYGJhcnNgICh2ZWN0b3IpCisgICsweDAwN0MgfCA1MCAwMSAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDE1MCAoMzM2KSBMb2M6ICsweDAxQ0MgIHwgb2Zmc2V0IHRvIGZpZWxkIGBiYXJfYmF6YCAodW5pb24gb2YgdHlwZSBgQmF6YCkKKyAgKzB4MDA4MCB8IDM0IDAxIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMTM0ICgzMDgpIExvYzogKzB4MDFCNCAgfCBvZmZzZXQgdG8gZmllbGQgYGFjY291bnRzYCAodmVjdG9yKQorICArMHgwMDg0IHwgMjQgMDEgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDAxMjQgKDI5MikgTG9jOiArMHgwMUE4ICB8IG9mZnNldCB0byBmaWVsZCBgYm9iYCAoc3RyaW5nKQorICArMHgwMDg4IHwgMTQgMDEgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDAxMTQgKDI3NikgTG9jOiArMHgwMTlDICB8IG9mZnNldCB0byBmaWVsZCBgYWxpY2VgIChzdHJpbmcpCisgICsweDAwOEMgfCAwRCAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgIHwgMHgwMDAwMDAwRCAoMTMpICAgICAgICAgICAgICAgIHwgdGFibGUgZmllbGQgYGp1c3RfaTMyYCAoSW50KQorICArMHgwMDkwIHwgREMgMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDAwREMgKDIyMCkgTG9jOiArMHgwMTZDICB8IG9mZnNldCB0byBmaWVsZCBgbmFtZXNgICh2ZWN0b3IpCisgICsweDAwOTQgfCBBMCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDBBMCAoMTYwKSBMb2M6ICsweDAxMzQgIHwgb2Zmc2V0IHRvIGZpZWxkIGBwb2ludHNfb2ZfaW50ZXJlc3RgICh2ZWN0b3IpCisgICsweDAwOTggfCA5NCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDA5NCAoMTQ4KSBMb2M6ICsweDAxMkMgIHwgb2Zmc2V0IHRvIGZpZWxkIGBmb29iYXJzX3R5cGVgICh2ZWN0b3IpCisgICsweDAwOUMgfCAzOCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDAzOCAoNTYpIExvYzogKzB4MDBENCAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBmb29iYXJzYCAodmVjdG9yKQorICArMHgwMEEwIHwgMzMgMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDAwMzMgKDUxKSBMb2M6ICsweDAwRDMgICB8IG9mZnNldCB0byBmaWVsZCBgbWVhc3VyZW1lbnRgICh1bmlvbiBvZiB0eXBlIGBUb2xlcmFuY2VgKQorICArMHgwMEE0IHwgMUMgMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDAwMUMgKDI4KSBMb2M6ICsweDAwQzAgICB8IG9mZnNldCB0byBmaWVsZCBgYW55dGhpbmdgICh1bmlvbiBvZiB0eXBlIGBCYXJgKQorICArMHgwMEE4IHwgMDQgMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDAwMDQgKDQpIExvYzogKzB4MDBBQyAgICB8IG9mZnNldCB0byBmaWVsZCBgY2hhcmxpZWAgKHN0cmluZykKKworc3RyaW5nIChBbm5vdGF0ZWRCaW5hcnkuRm9vLmNoYXJsaWUpOgorICArMHgwMEFDIHwgRkYgRkYgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICB8IDB4MDAwMEZGRkYgKDY1NTM1KSAgICAgICAgICAgICB8IEVSUk9SOiBsZW5ndGggb2Ygc3RyaW5nLiBMb25nZXIgdGhhbiB0aGUgYmluYXJ5LgorCit1bmtub3duIChubyBrbm93biByZWZlcmVuY2VzKToKKyAgKzB4MDBCMCB8IDYxIDZDIDY5IDYzIDY1IDAwIDAwIDAwIHwgP3VpbnQ4X3RbOF0gfCBhbGljZS4uLiAgICAgICAgICAgICAgICAgICAgICAgfCBXQVJOOiBub3RoaW5nIHJlZmVycyB0byB0aGlzIHNlY3Rpb24uCisKK3Z0YWJsZSAoQW5ub3RhdGVkQmluYXJ5LkJhcik6CisgICsweDAwQjggfCAwOCAwMCAgICAgICAgICAgICAgICAgICB8IHVpbnQxNl90ICAgIHwgMHgwMDA4ICg4KSAgICAgICAgICAgICAgICAgICAgIHwgc2l6ZSBvZiB0aGlzIHZ0YWJsZQorICArMHgwMEJBIHwgMTMgMDAgICAgICAgICAgICAgICAgICAgfCB1aW50MTZfdCAgICB8IDB4MDAxMyAoMTkpICAgICAgICAgICAgICAgICAgICB8IHNpemUgb2YgcmVmZXJyaW5nIHRhYmxlCisgICsweDAwQkMgfCAwOCAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgIHwgMHgwMDA4ICg4KSAgICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBhYCAoaWQ6IDApCisgICsweDAwQkUgfCAwNCAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgIHwgMHgwMDA0ICg0KSAgICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBiYCAoaWQ6IDEpCisKK3RhYmxlIChBbm5vdGF0ZWRCaW5hcnkuQmFyKToKKyAgKzB4MDBDMCB8IDA4IDAwIDAwIDAwICAgICAgICAgICAgIHwgU09mZnNldDMyICAgfCAweDAwMDAwMDA4ICg4KSBMb2M6ICsweDAwQjggICAgfCBvZmZzZXQgdG8gdnRhYmxlCisgICsweDAwQzQgfCAwMCA4MCAyMyA0NCAgICAgICAgICAgICB8IGZsb2F0ICAgICAgIHwgMHg0NDIzODAwMCAoNjU0KSAgICAgICAgICAgICAgIHwgdGFibGUgZmllbGQgYGJgIChGbG9hdCkKKyAgKzB4MDBDOCB8IDAwIDAwIDAwIDAwIDAwIDEwIDc0IDQwIHwgZG91YmxlICAgICAgfCAweDQwNzQxMDAwMDAwMDAwMDAgKDMyMSkgICAgICAgfCB0YWJsZSBmaWVsZCBgYWAgKERvdWJsZSkKKyAgKzB4MDBEMCB8IDAwIDAwIDAwICAgICAgICAgICAgICAgIHwgdWludDhfdFszXSAgfCAuLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBwYWRkaW5nCisKK3VuaW9uIChBbm5vdGF0ZWRCaW5hcnkuVG9sZXJhbmNlLm1lYXN1cmVtZW50KToKKyAgKzB4MDBEMyB8IDA1ICAgICAgICAgICAgICAgICAgICAgIHwgdWludDhfdCAgICAgfCAweDA1ICg1KSAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJ1Y3QgZmllbGQgYEFubm90YXRlZEJpbmFyeS5Ub2xlcmFuY2Uud2lkdGhgIChVQnl0ZSkKKwordmVjdG9yIChBbm5vdGF0ZWRCaW5hcnkuRm9vLmZvb2JhcnMpOgorICArMHgwMEQ0IHwgMDMgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICB8IDB4MDAwMDAwMDMgKDMpICAgICAgICAgICAgICAgICB8IGxlbmd0aCBvZiB2ZWN0b3IgKCMgaXRlbXMpCisgICsweDAwRDggfCAzNCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDAzNCAoNTIpIExvYzogKzB4MDEwQyAgIHwgb2Zmc2V0IHRvIHVuaW9uWzBdIChgQmFyYCkKKyAgKzB4MDBEQyB8IDJDIDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMDJDICg0NCkgTG9jOiArMHgwMTA4ICAgfCBvZmZzZXQgdG8gdW5pb25bMV0gKGBCYXpgKQorICArMHgwMEUwIHwgMDQgMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDAwMDQgKDQpIExvYzogKzB4MDBFNCAgICB8IG9mZnNldCB0byB1bmlvblsyXSAoYEJhcmApCisKK3RhYmxlIChBbm5vdGF0ZWRCaW5hcnkuQmFyKToKKyAgKzB4MDBFNCB8IEQyIEZFIEZGIEZGICAgICAgICAgICAgIHwgU09mZnNldDMyICAgfCAweEZGRkZGRUQyICgtMzAyKSBMb2M6ICsweDAyMTIgfCBvZmZzZXQgdG8gdnRhYmxlCisgICsweDAwRTggfCAwMCA4MCAyMyA0NCAgICAgICAgICAgICB8IGZsb2F0ICAgICAgIHwgMHg0NDIzODAwMCAoNjU0KSAgICAgICAgICAgICAgIHwgdGFibGUgZmllbGQgYGJgIChGbG9hdCkKKyAgKzB4MDBFQyB8IDEwIDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMDEwICgxNikgTG9jOiArMHgwMEZDICAgfCBvZmZzZXQgdG8gZmllbGQgYGNgICh0YWJsZSkKKyAgKzB4MDBGMCB8IDAwIDAwIDAwIDAwIDAwIEQ4IDhFIDQwIHwgZG91YmxlICAgICAgfCAweDQwOEVEODAwMDAwMDAwMDAgKDk4NykgICAgICAgfCB0YWJsZSBmaWVsZCBgYWAgKERvdWJsZSkKKyAgKzB4MDBGOCB8IDAwIDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDhfdFs0XSAgfCAuLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBwYWRkaW5nCisKK3RhYmxlIChBbm5vdGF0ZWRCaW5hcnkuQmF6KToKKyAgKzB4MDBGQyB8IDZBIEZFIEZGIEZGICAgICAgICAgICAgIHwgU09mZnNldDMyICAgfCAweEZGRkZGRTZBICgtNDA2KSBMb2M6ICsweDAyOTIgfCBvZmZzZXQgdG8gdnRhYmxlCisgICsweDAxMDAgfCAwMCAwMCAwMCAgICAgICAgICAgICAgICB8IHVpbnQ4X3RbM10gIHwgLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgcGFkZGluZworICArMHgwMTAzIHwgMDMgICAgICAgICAgICAgICAgICAgICAgfCB1aW50OF90ICAgICB8IDB4MDMgKDMpICAgICAgICAgICAgICAgICAgICAgICB8IHRhYmxlIGZpZWxkIGBtZWFsYCAoQnl0ZSkKKwordnRhYmxlIChBbm5vdGF0ZWRCaW5hcnkuQmF6KToKKyAgKzB4MDEwNCB8IDA0IDAwICAgICAgICAgICAgICAgICAgIHwgdWludDE2X3QgICAgfCAweDAwMDQgKDQpICAgICAgICAgICAgICAgICAgICAgfCBzaXplIG9mIHRoaXMgdnRhYmxlCisgICsweDAxMDYgfCAwNCAwMCAgICAgICAgICAgICAgICAgICB8IHVpbnQxNl90ICAgIHwgMHgwMDA0ICg0KSAgICAgICAgICAgICAgICAgICAgIHwgc2l6ZSBvZiByZWZlcnJpbmcgdGFibGUKKwordGFibGUgKEFubm90YXRlZEJpbmFyeS5CYXopOgorICArMHgwMTA4IHwgMDQgMDAgMDAgMDAgICAgICAgICAgICAgfCBTT2Zmc2V0MzIgICB8IDB4MDAwMDAwMDQgKDQpIExvYzogKzB4MDEwNCAgICB8IG9mZnNldCB0byB2dGFibGUKKwordGFibGUgKEFubm90YXRlZEJpbmFyeS5CYXIpOgorICArMHgwMTBDIHwgRkEgRkUgRkYgRkYgICAgICAgICAgICAgfCBTT2Zmc2V0MzIgICB8IDB4RkZGRkZFRkEgKC0yNjIpIExvYzogKzB4MDIxMiB8IG9mZnNldCB0byB2dGFibGUKKyAgKzB4MDExMCB8IDAwIDAwIEU0IDQzICAgICAgICAgICAgIHwgZmxvYXQgICAgICAgfCAweDQzRTQwMDAwICg0NTYpICAgICAgICAgICAgICAgfCB0YWJsZSBmaWVsZCBgYmAgKEZsb2F0KQorICArMHgwMTE0IHwgMTAgMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDAwMTAgKDE2KSBMb2M6ICsweDAxMjQgICB8IG9mZnNldCB0byBmaWVsZCBgY2AgKHRhYmxlKQorICArMHgwMTE4IHwgMDAgMDAgMDAgMDAgMDAgQzAgNUUgNDAgfCBkb3VibGUgICAgICB8IDB4NDA1RUMwMDAwMDAwMDAwMCAoMTIzKSAgICAgICB8IHRhYmxlIGZpZWxkIGBhYCAoRG91YmxlKQorICArMHgwMTIwIHwgMDAgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50OF90WzRdICB8IC4uLi4gICAgICAgICAgICAgICAgICAgICAgICAgICB8IHBhZGRpbmcKKwordGFibGUgKEFubm90YXRlZEJpbmFyeS5CYXopOgorICArMHgwMTI0IHwgOTIgRkUgRkYgRkYgICAgICAgICAgICAgfCBTT2Zmc2V0MzIgICB8IDB4RkZGRkZFOTIgKC0zNjYpIExvYzogKzB4MDI5MiB8IG9mZnNldCB0byB2dGFibGUKKyAgKzB4MDEyOCB8IDAwIDAwIDAwICAgICAgICAgICAgICAgIHwgdWludDhfdFszXSAgfCAuLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBwYWRkaW5nCisgICsweDAxMkIgfCAwMSAgICAgICAgICAgICAgICAgICAgICB8IHVpbnQ4X3QgICAgIHwgMHgwMSAoMSkgICAgICAgICAgICAgICAgICAgICAgIHwgdGFibGUgZmllbGQgYG1lYWxgIChCeXRlKQorCit2ZWN0b3IgKEFubm90YXRlZEJpbmFyeS5Gb28uZm9vYmFyc190eXBlKToKKyAgKzB4MDEyQyB8IDAzIDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgfCAweDAwMDAwMDAzICgzKSAgICAgICAgICAgICAgICAgfCBsZW5ndGggb2YgdmVjdG9yICgjIGl0ZW1zKQorICArMHgwMTMwIHwgMDEgICAgICAgICAgICAgICAgICAgICAgfCBVVHlwZTggICAgICB8IDB4MDEgKDEpICAgICAgICAgICAgICAgICAgICAgICB8IHZhbHVlWzBdCisgICsweDAxMzEgfCAwMiAgICAgICAgICAgICAgICAgICAgICB8IFVUeXBlOCAgICAgIHwgMHgwMiAoMikgICAgICAgICAgICAgICAgICAgICAgIHwgdmFsdWVbMV0KKyAgKzB4MDEzMiB8IDAxICAgICAgICAgICAgICAgICAgICAgIHwgVVR5cGU4ICAgICAgfCAweDAxICgxKSAgICAgICAgICAgICAgICAgICAgICAgfCB2YWx1ZVsyXQorCit2ZWN0b3IgKEFubm90YXRlZEJpbmFyeS5Gb28ucG9pbnRzX29mX2ludGVyZXN0KToKKyAgKzB4MDEzNCB8IDAzIDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgfCAweDAwMDAwMDAzICgzKSAgICAgICAgICAgICAgICAgfCBsZW5ndGggb2YgdmVjdG9yICgjIGl0ZW1zKQorICArMHgwMTM4IHwgMzMgMzMgMzMgMzMgMzMgQTMgNDUgNDAgfCBkb3VibGUgICAgICB8IDB4NDA0NUEzMzMzMzMzMzMzMyAoNDMuMjc1KSAgICB8IHN0cnVjdCBmaWVsZCBgQW5ub3RhdGVkQmluYXJ5LkxvY2F0aW9uLmxhdGl0dWRlYCAoRG91YmxlKQorICArMHgwMTQwIHwgN0UgNTcgMDQgRkYgNUIgODcgNTMgQzAgfCBkb3VibGUgICAgICB8IDB4QzA1Mzg3NUJGRjA0NTc3RSAoLTc4LjExNSkgICB8IHN0cnVjdCBmaWVsZCBgQW5ub3RhdGVkQmluYXJ5LkxvY2F0aW9uLmxvbmdpdHVkZWAgKERvdWJsZSkKKyAgKzB4MDE0OCB8IDhEIEYwIEY2IDIwIDA0IEI2IDQyIDQwIHwgZG91YmxlICAgICAgfCAweDQwNDJCNjA0MjBGNkYwOEQgKDM3LjQyMikgICAgfCBzdHJ1Y3QgZmllbGQgYEFubm90YXRlZEJpbmFyeS5Mb2NhdGlvbi5sYXRpdHVkZWAgKERvdWJsZSkKKyAgKzB4MDE1MCB8IDlGIDc3IDYzIDQxIDYxIDg1IDVFIEMwIHwgZG91YmxlICAgICAgfCAweEMwNUU4NTYxNDE2Mzc3OUYgKC0xMjIuMDg0KSAgfCBzdHJ1Y3QgZmllbGQgYEFubm90YXRlZEJpbmFyeS5Mb2NhdGlvbi5sb25naXR1ZGVgIChEb3VibGUpCisgICsweDAxNTggfCA4RiAzNSAyMyA4MyBEQyAzNSA0QiBDMCB8IGRvdWJsZSAgICAgIHwgMHhDMDRCMzVEQzgzMjMzNThGICgtNTQuNDIwOCkgIHwgc3RydWN0IGZpZWxkIGBBbm5vdGF0ZWRCaW5hcnkuTG9jYXRpb24ubGF0aXR1ZGVgIChEb3VibGUpCisgICsweDAxNjAgfCBGNiA5NyBERCA5MyA4NyBDNSAwQSA0MCB8IGRvdWJsZSAgICAgIHwgMHg0MDBBQzU4NzkzREQ5N0Y2ICgzLjM0NjQ1KSAgIHwgc3RydWN0IGZpZWxkIGBBbm5vdGF0ZWRCaW5hcnkuTG9jYXRpb24ubG9uZ2l0dWRlYCAoRG91YmxlKQorCitwYWRkaW5nOgorICArMHgwMTY4IHwgMDAgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50OF90WzRdICB8IC4uLi4gICAgICAgICAgICAgICAgICAgICAgICAgICB8IHBhZGRpbmcKKwordmVjdG9yIChBbm5vdGF0ZWRCaW5hcnkuRm9vLm5hbWVzKToKKyAgKzB4MDE2QyB8IDAzIDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgfCAweDAwMDAwMDAzICgzKSAgICAgICAgICAgICAgICAgfCBsZW5ndGggb2YgdmVjdG9yICgjIGl0ZW1zKQorICArMHgwMTcwIHwgMjAgMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDAwMjAgKDMyKSBMb2M6ICsweDAxOTAgICB8IG9mZnNldCB0byBzdHJpbmdbMF0KKyAgKzB4MDE3NCB8IDE0IDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMDE0ICgyMCkgTG9jOiArMHgwMTg4ICAgfCBvZmZzZXQgdG8gc3RyaW5nWzFdCisgICsweDAxNzggfCAwNCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDAwNCAoNCkgTG9jOiArMHgwMTdDICAgIHwgb2Zmc2V0IHRvIHN0cmluZ1syXQorCitzdHJpbmcgKEFubm90YXRlZEJpbmFyeS5Gb28ubmFtZXMpOgorICArMHgwMTdDIHwgMDcgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICB8IDB4MDAwMDAwMDcgKDcpICAgICAgICAgICAgICAgICB8IGxlbmd0aCBvZiBzdHJpbmcKKyAgKzB4MDE4MCB8IDYzIDY4IDYxIDcyIDZDIDY5IDY1ICAgIHwgY2hhcls3XSAgICAgfCBjaGFybGllICAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJpbmcgbGl0ZXJhbAorICArMHgwMTg3IHwgMDAgICAgICAgICAgICAgICAgICAgICAgfCBjaGFyICAgICAgICB8IDB4MDAgKDApICAgICAgICAgICAgICAgICAgICAgICB8IHN0cmluZyB0ZXJtaW5hdG9yCisKK3N0cmluZyAoQW5ub3RhdGVkQmluYXJ5LkZvby5uYW1lcyk6CisgICsweDAxODggfCAwMyAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgIHwgMHgwMDAwMDAwMyAoMykgICAgICAgICAgICAgICAgIHwgbGVuZ3RoIG9mIHN0cmluZworICArMHgwMThDIHwgNjIgNkYgNjIgICAgICAgICAgICAgICAgfCBjaGFyWzNdICAgICB8IGJvYiAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHN0cmluZyBsaXRlcmFsCisgICsweDAxOEYgfCAwMCAgICAgICAgICAgICAgICAgICAgICB8IGNoYXIgICAgICAgIHwgMHgwMCAoMCkgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nIHRlcm1pbmF0b3IKKworc3RyaW5nIChBbm5vdGF0ZWRCaW5hcnkuRm9vLm5hbWVzKToKKyAgKzB4MDE5MCB8IDA1IDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgfCAweDAwMDAwMDA1ICg1KSAgICAgICAgICAgICAgICAgfCBsZW5ndGggb2Ygc3RyaW5nCisgICsweDAxOTQgfCA2MSA2QyA2OSA2MyA2NSAgICAgICAgICB8IGNoYXJbNV0gICAgIHwgYWxpY2UgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nIGxpdGVyYWwKKyAgKzB4MDE5OSB8IDAwICAgICAgICAgICAgICAgICAgICAgIHwgY2hhciAgICAgICAgfCAweDAwICgwKSAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJpbmcgdGVybWluYXRvcgorCitwYWRkaW5nOgorICArMHgwMTlBIHwgMDAgMDAgICAgICAgICAgICAgICAgICAgfCB1aW50OF90WzJdICB8IC4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHBhZGRpbmcKKworc3RyaW5nIChBbm5vdGF0ZWRCaW5hcnkuRm9vLmFsaWNlKToKKyAgKzB4MDE5QyB8IDA3IDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgfCAweDAwMDAwMDA3ICg3KSAgICAgICAgICAgICAgICAgfCBsZW5ndGggb2Ygc3RyaW5nCisgICsweDAxQTAgfCA2MyA2OCA2MSA3MiA2QyA2OSA2NSAgICB8IGNoYXJbN10gICAgIHwgY2hhcmxpZSAgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nIGxpdGVyYWwKKyAgKzB4MDFBNyB8IDAwICAgICAgICAgICAgICAgICAgICAgIHwgY2hhciAgICAgICAgfCAweDAwICgwKSAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJpbmcgdGVybWluYXRvcgorCitzdHJpbmcgKEFubm90YXRlZEJpbmFyeS5Gb28uYm9iKToKKyAgKzB4MDFBOCB8IDA3IDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgfCAweDAwMDAwMDA3ICg3KSAgICAgICAgICAgICAgICAgfCBsZW5ndGggb2Ygc3RyaW5nCisgICsweDAxQUMgfCA2MyA2OCA2MSA3MiA2QyA2OSA2NSAgICB8IGNoYXJbN10gICAgIHwgY2hhcmxpZSAgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nIGxpdGVyYWwKKyAgKzB4MDFCMyB8IDAwICAgICAgICAgICAgICAgICAgICAgIHwgY2hhciAgICAgICAgfCAweDAwICgwKSAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJpbmcgdGVybWluYXRvcgorCit2ZWN0b3IgKEFubm90YXRlZEJpbmFyeS5Gb28uYWNjb3VudHMpOgorICArMHgwMUI0IHwgMDkgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICB8IDB4MDAwMDAwMDkgKDkpICAgICAgICAgICAgICAgICB8IGxlbmd0aCBvZiB2ZWN0b3IgKCMgaXRlbXMpCisgICsweDAxQjggfCAwOSAwMCAgICAgICAgICAgICAgICAgICB8IHVpbnQxNl90ICAgIHwgMHgwMDA5ICg5KSAgICAgICAgICAgICAgICAgICAgIHwgdmFsdWVbMF0KKyAgKzB4MDFCQSB8IDA4IDAwICAgICAgICAgICAgICAgICAgIHwgdWludDE2X3QgICAgfCAweDAwMDggKDgpICAgICAgICAgICAgICAgICAgICAgfCB2YWx1ZVsxXQorICArMHgwMUJDIHwgMDcgMDAgICAgICAgICAgICAgICAgICAgfCB1aW50MTZfdCAgICB8IDB4MDAwNyAoNykgICAgICAgICAgICAgICAgICAgICB8IHZhbHVlWzJdCisgICsweDAxQkUgfCAwMSAwMCAgICAgICAgICAgICAgICAgICB8IHVpbnQxNl90ICAgIHwgMHgwMDAxICgxKSAgICAgICAgICAgICAgICAgICAgIHwgdmFsdWVbM10KKyAgKzB4MDFDMCB8IDAyIDAwICAgICAgICAgICAgICAgICAgIHwgdWludDE2X3QgICAgfCAweDAwMDIgKDIpICAgICAgICAgICAgICAgICAgICAgfCB2YWx1ZVs0XQorICArMHgwMUMyIHwgMDMgMDAgICAgICAgICAgICAgICAgICAgfCB1aW50MTZfdCAgICB8IDB4MDAwMyAoMykgICAgICAgICAgICAgICAgICAgICB8IHZhbHVlWzVdCisgICsweDAxQzQgfCAwNiAwMCAgICAgICAgICAgICAgICAgICB8IHVpbnQxNl90ICAgIHwgMHgwMDA2ICg2KSAgICAgICAgICAgICAgICAgICAgIHwgdmFsdWVbNl0KKyAgKzB4MDFDNiB8IDA1IDAwICAgICAgICAgICAgICAgICAgIHwgdWludDE2X3QgICAgfCAweDAwMDUgKDUpICAgICAgICAgICAgICAgICAgICAgfCB2YWx1ZVs3XQorICArMHgwMUM4IHwgMDQgMDAgICAgICAgICAgICAgICAgICAgfCB1aW50MTZfdCAgICB8IDB4MDAwNCAoNCkgICAgICAgICAgICAgICAgICAgICB8IHZhbHVlWzhdCisKK3BhZGRpbmc6CisgICsweDAxQ0EgfCAwMCAwMCAgICAgICAgICAgICAgICAgICB8IHVpbnQ4X3RbMl0gIHwgLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgcGFkZGluZworCit0YWJsZSAoQW5ub3RhdGVkQmluYXJ5LkJheik6CisgICsweDAxQ0MgfCAzQSBGRiBGRiBGRiAgICAgICAgICAgICB8IFNPZmZzZXQzMiAgIHwgMHhGRkZGRkYzQSAoLTE5OCkgTG9jOiArMHgwMjkyIHwgb2Zmc2V0IHRvIHZ0YWJsZQorICArMHgwMUQwIHwgMDAgMDAgMDAgICAgICAgICAgICAgICAgfCB1aW50OF90WzNdICB8IC4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHBhZGRpbmcKKyAgKzB4MDFEMyB8IDAzICAgICAgICAgICAgICAgICAgICAgIHwgdWludDhfdCAgICAgfCAweDAzICgzKSAgICAgICAgICAgICAgICAgICAgICAgfCB0YWJsZSBmaWVsZCBgbWVhbGAgKEJ5dGUpCisKK3ZlY3RvciAoQW5ub3RhdGVkQmluYXJ5LkZvby5iYXJzKToKKyAgKzB4MDFENCB8IDAyIDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgfCAweDAwMDAwMDAyICgyKSAgICAgICAgICAgICAgICAgfCBsZW5ndGggb2YgdmVjdG9yICgjIGl0ZW1zKQorICArMHgwMUQ4IHwgNDQgMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDAwNDQgKDY4KSBMb2M6ICsweDAyMUMgICB8IG9mZnNldCB0byB0YWJsZVswXQorICArMHgwMURDIHwgMTAgMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDAwMTAgKDE2KSBMb2M6ICsweDAxRUMgICB8IG9mZnNldCB0byB0YWJsZVsxXQorCitwYWRkaW5nOgorICArMHgwMUUwIHwgMDAgMDAgICAgICAgICAgICAgICAgICAgfCB1aW50OF90WzJdICB8IC4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHBhZGRpbmcKKwordnRhYmxlIChBbm5vdGF0ZWRCaW5hcnkuQmFyKToKKyAgKzB4MDFFMiB8IDBBIDAwICAgICAgICAgICAgICAgICAgIHwgdWludDE2X3QgICAgfCAweDAwMEEgKDEwKSAgICAgICAgICAgICAgICAgICAgfCBzaXplIG9mIHRoaXMgdnRhYmxlCisgICsweDAxRTQgfCAxQSAwMCAgICAgICAgICAgICAgICAgICB8IHVpbnQxNl90ICAgIHwgMHgwMDFBICgyNikgICAgICAgICAgICAgICAgICAgIHwgc2l6ZSBvZiByZWZlcnJpbmcgdGFibGUKKyAgKzB4MDFFNiB8IDBDIDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgfCAweDAwMEMgKDEyKSAgICAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYGFgIChpZDogMCkKKyAgKzB4MDFFOCB8IDA0IDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgfCAweDAwMDQgKDQpICAgICAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYGJgIChpZDogMSkKKyAgKzB4MDFFQSB8IDA4IDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgfCAweDAwMDggKDgpICAgICAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYGNgIChpZDogMikKKwordGFibGUgKEFubm90YXRlZEJpbmFyeS5CYXIpOgorICArMHgwMUVDIHwgMEEgMDAgMDAgMDAgICAgICAgICAgICAgfCBTT2Zmc2V0MzIgICB8IDB4MDAwMDAwMEEgKDEwKSBMb2M6ICsweDAxRTIgICB8IG9mZnNldCB0byB2dGFibGUKKyAgKzB4MDFGMCB8IDAwIDgwIDIzIDQ0ICAgICAgICAgICAgIHwgZmxvYXQgICAgICAgfCAweDQ0MjM4MDAwICg2NTQpICAgICAgICAgICAgICAgfCB0YWJsZSBmaWVsZCBgYmAgKEZsb2F0KQorICArMHgwMUY0IHwgMTggMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDAwMTggKDI0KSBMb2M6ICsweDAyMEMgICB8IG9mZnNldCB0byBmaWVsZCBgY2AgKHRhYmxlKQorICArMHgwMUY4IHwgMDAgMDAgMDAgMDAgMDAgRDggOEUgNDAgfCBkb3VibGUgICAgICB8IDB4NDA4RUQ4MDAwMDAwMDAwMCAoOTg3KSAgICAgICB8IHRhYmxlIGZpZWxkIGBhYCAoRG91YmxlKQorICArMHgwMjAwIHwgMDAgMDAgMDAgMDAgMDAgMDAgICAgICAgfCB1aW50OF90WzZdICB8IC4uLi4uLiAgICAgICAgICAgICAgICAgICAgICAgICB8IHBhZGRpbmcKKwordnRhYmxlIChBbm5vdGF0ZWRCaW5hcnkuQmF6KToKKyAgKzB4MDIwNiB8IDA2IDAwICAgICAgICAgICAgICAgICAgIHwgdWludDE2X3QgICAgfCAweDAwMDYgKDYpICAgICAgICAgICAgICAgICAgICAgfCBzaXplIG9mIHRoaXMgdnRhYmxlCisgICsweDAyMDggfCAwNiAwMCAgICAgICAgICAgICAgICAgICB8IHVpbnQxNl90ICAgIHwgMHgwMDA2ICg2KSAgICAgICAgICAgICAgICAgICAgIHwgc2l6ZSBvZiByZWZlcnJpbmcgdGFibGUKKyAgKzB4MDIwQSB8IDA1IDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgfCAweDAwMDUgKDUpICAgICAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYG1lYWxgIChpZDogMCkKKwordGFibGUgKEFubm90YXRlZEJpbmFyeS5CYXopOgorICArMHgwMjBDIHwgMDYgMDAgMDAgMDAgICAgICAgICAgICAgfCBTT2Zmc2V0MzIgICB8IDB4MDAwMDAwMDYgKDYpIExvYzogKzB4MDIwNiAgICB8IG9mZnNldCB0byB2dGFibGUKKyAgKzB4MDIxMCB8IDAwICAgICAgICAgICAgICAgICAgICAgIHwgdWludDhfdFsxXSAgfCAuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBwYWRkaW5nCisgICsweDAyMTEgfCAwMyAgICAgICAgICAgICAgICAgICAgICB8IHVpbnQ4X3QgICAgIHwgMHgwMyAoMykgICAgICAgICAgICAgICAgICAgICAgIHwgdGFibGUgZmllbGQgYG1lYWxgIChCeXRlKQorCit2dGFibGUgKEFubm90YXRlZEJpbmFyeS5CYXIpOgorICArMHgwMjEyIHwgMEEgMDAgICAgICAgICAgICAgICAgICAgfCB1aW50MTZfdCAgICB8IDB4MDAwQSAoMTApICAgICAgICAgICAgICAgICAgICB8IHNpemUgb2YgdGhpcyB2dGFibGUKKyAgKzB4MDIxNCB8IDE4IDAwICAgICAgICAgICAgICAgICAgIHwgdWludDE2X3QgICAgfCAweDAwMTggKDI0KSAgICAgICAgICAgICAgICAgICAgfCBzaXplIG9mIHJlZmVycmluZyB0YWJsZQorICArMHgwMjE2IHwgMEMgMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgICB8IDB4MDAwQyAoMTIpICAgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgYWAgKGlkOiAwKQorICArMHgwMjE4IHwgMDQgMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgICB8IDB4MDAwNCAoNCkgICAgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgYmAgKGlkOiAxKQorICArMHgwMjFBIHwgMDggMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgICB8IDB4MDAwOCAoOCkgICAgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgY2AgKGlkOiAyKQorCit0YWJsZSAoQW5ub3RhdGVkQmluYXJ5LkJhcik6CisgICsweDAyMUMgfCAwQSAwMCAwMCAwMCAgICAgICAgICAgICB8IFNPZmZzZXQzMiAgIHwgMHgwMDAwMDAwQSAoMTApIExvYzogKzB4MDIxMiAgIHwgb2Zmc2V0IHRvIHZ0YWJsZQorICArMHgwMjIwIHwgMDAgMDAgRTQgNDMgICAgICAgICAgICAgfCBmbG9hdCAgICAgICB8IDB4NDNFNDAwMDAgKDQ1NikgICAgICAgICAgICAgICB8IHRhYmxlIGZpZWxkIGBiYCAoRmxvYXQpCisgICsweDAyMjQgfCAxMCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDAxMCAoMTYpIExvYzogKzB4MDIzNCAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBjYCAodGFibGUpCisgICsweDAyMjggfCAwMCAwMCAwMCAwMCAwMCBDMCA1RSA0MCB8IGRvdWJsZSAgICAgIHwgMHg0MDVFQzAwMDAwMDAwMDAwICgxMjMpICAgICAgIHwgdGFibGUgZmllbGQgYGFgIChEb3VibGUpCisgICsweDAyMzAgfCAwMCAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQ4X3RbNF0gIHwgLi4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgcGFkZGluZworCit0YWJsZSAoQW5ub3RhdGVkQmluYXJ5LkJheik6CisgICsweDAyMzQgfCBBMiBGRiBGRiBGRiAgICAgICAgICAgICB8IFNPZmZzZXQzMiAgIHwgMHhGRkZGRkZBMiAoLTk0KSBMb2M6ICsweDAyOTIgIHwgb2Zmc2V0IHRvIHZ0YWJsZQorICArMHgwMjM4IHwgMDAgMDAgMDAgICAgICAgICAgICAgICAgfCB1aW50OF90WzNdICB8IC4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHBhZGRpbmcKKyAgKzB4MDIzQiB8IDAxICAgICAgICAgICAgICAgICAgICAgIHwgdWludDhfdCAgICAgfCAweDAxICgxKSAgICAgICAgICAgICAgICAgICAgICAgfCB0YWJsZSBmaWVsZCBgbWVhbGAgKEJ5dGUpCisKK3N0cmluZyAoQW5ub3RhdGVkQmluYXJ5LkZvby5uYW1lKToKKyAgKzB4MDIzQyB8IDJGIDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgfCAweDAwMDAwMDJGICg0NykgICAgICAgICAgICAgICAgfCBsZW5ndGggb2Ygc3RyaW5nCisgICsweDAyNDAgfCA1NCA2OCA2OSA3MyAyMCA2OSA3MyAyMCB8IGNoYXJbNDddICAgIHwgVGhpcyBpcyAgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nIGxpdGVyYWwKKyAgKzB4MDI0OCB8IDYxIDIwIDZDIDZGIDZFIDY3IDIwIDczIHwgICAgICAgICAgICAgfCBhIGxvbmcgcworICArMHgwMjUwIHwgNzQgNzIgNjkgNkUgNjcgMjAgNzQgNkYgfCAgICAgICAgICAgICB8IHRyaW5nIHRvCisgICsweDAyNTggfCAyMCA3MyA2OCA2RiA3NyAyMCA2OCA2RiB8ICAgICAgICAgICAgIHwgIHNob3cgaG8KKyAgKzB4MDI2MCB8IDc3IDIwIDY5IDc0IDIwIDYyIDcyIDY1IHwgICAgICAgICAgICAgfCB3IGl0IGJyZQorICArMHgwMjY4IHwgNjEgNkIgNzMgMjAgNzUgNzAgMkUgICAgfCAgICAgICAgICAgICB8IGFrcyB1cC4KKyAgKzB4MDI2RiB8IDAwICAgICAgICAgICAgICAgICAgICAgIHwgY2hhciAgICAgICAgfCAweDAwICgwKSAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJpbmcgdGVybWluYXRvcgorCitwYWRkaW5nOgorICArMHgwMjcwIHwgMDAgMDAgICAgICAgICAgICAgICAgICAgfCB1aW50OF90WzJdICB8IC4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHBhZGRpbmcKKwordnRhYmxlIChBbm5vdGF0ZWRCaW5hcnkuQmFyKToKKyAgKzB4MDI3MiB8IDBBIDAwICAgICAgICAgICAgICAgICAgIHwgdWludDE2X3QgICAgfCAweDAwMEEgKDEwKSAgICAgICAgICAgICAgICAgICAgfCBzaXplIG9mIHRoaXMgdnRhYmxlCisgICsweDAyNzQgfCAxNiAwMCAgICAgICAgICAgICAgICAgICB8IHVpbnQxNl90ICAgIHwgMHgwMDE2ICgyMikgICAgICAgICAgICAgICAgICAgIHwgc2l6ZSBvZiByZWZlcnJpbmcgdGFibGUKKyAgKzB4MDI3NiB8IDBDIDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgfCAweDAwMEMgKDEyKSAgICAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYGFgIChpZDogMCkKKyAgKzB4MDI3OCB8IDA0IDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgfCAweDAwMDQgKDQpICAgICAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYGJgIChpZDogMSkKKyAgKzB4MDI3QSB8IDA4IDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgfCAweDAwMDggKDgpICAgICAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYGNgIChpZDogMikKKwordGFibGUgKEFubm90YXRlZEJpbmFyeS5CYXIpOgorICArMHgwMjdDIHwgMEEgMDAgMDAgMDAgICAgICAgICAgICAgfCBTT2Zmc2V0MzIgICB8IDB4MDAwMDAwMEEgKDEwKSBMb2M6ICsweDAyNzIgICB8IG9mZnNldCB0byB2dGFibGUKKyAgKzB4MDI4MCB8IDY1IDIwIDcxIDQ5ICAgICAgICAgICAgIHwgZmxvYXQgICAgICAgfCAweDQ5NzEyMDY1ICg5ODc2NTQpICAgICAgICAgICAgfCB0YWJsZSBmaWVsZCBgYmAgKEZsb2F0KQorICArMHgwMjg0IHwgMTQgMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDAwMTQgKDIwKSBMb2M6ICsweDAyOTggICB8IG9mZnNldCB0byBmaWVsZCBgY2AgKHRhYmxlKQorICArMHgwMjg4IHwgQzkgNzYgQkUgOUYgMEMgMjQgRkUgNDAgfCBkb3VibGUgICAgICB8IDB4NDBGRTI0MEM5RkJFNzZDOSAoMTIzNDU3KSAgICB8IHRhYmxlIGZpZWxkIGBhYCAoRG91YmxlKQorICArMHgwMjkwIHwgMDAgMDAgICAgICAgICAgICAgICAgICAgfCB1aW50OF90WzJdICB8IC4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHBhZGRpbmcKKwordnRhYmxlIChBbm5vdGF0ZWRCaW5hcnkuQmF6KToKKyAgKzB4MDI5MiB8IDA2IDAwICAgICAgICAgICAgICAgICAgIHwgdWludDE2X3QgICAgfCAweDAwMDYgKDYpICAgICAgICAgICAgICAgICAgICAgfCBzaXplIG9mIHRoaXMgdnRhYmxlCisgICsweDAyOTQgfCAwOCAwMCAgICAgICAgICAgICAgICAgICB8IHVpbnQxNl90ICAgIHwgMHgwMDA4ICg4KSAgICAgICAgICAgICAgICAgICAgIHwgc2l6ZSBvZiByZWZlcnJpbmcgdGFibGUKKyAgKzB4MDI5NiB8IDA3IDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgfCAweDAwMDcgKDcpICAgICAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYG1lYWxgIChpZDogMCkKKwordGFibGUgKEFubm90YXRlZEJpbmFyeS5CYXopOgorICArMHgwMjk4IHwgMDYgMDAgMDAgMDAgICAgICAgICAgICAgfCBTT2Zmc2V0MzIgICB8IDB4MDAwMDAwMDYgKDYpIExvYzogKzB4MDI5MiAgICB8IG9mZnNldCB0byB2dGFibGUKKyAgKzB4MDI5QyB8IDAwIDAwIDAwICAgICAgICAgICAgICAgIHwgdWludDhfdFszXSAgfCAuLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBwYWRkaW5nCisgICsweDAyOUYgfCAwMSAgICAgICAgICAgICAgICAgICAgICB8IHVpbnQ4X3QgICAgIHwgMHgwMSAoMSkgICAgICAgICAgICAgICAgICAgICAgIHwgdGFibGUgZmllbGQgYG1lYWxgIChCeXRlKQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvYW5ub3RhdGVkX2JpbmFyeS90ZXN0cy9pbnZhbGlkX3N0cmluZ19sZW5ndGguYmluIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvYW5ub3RhdGVkX2JpbmFyeS90ZXN0cy9pbnZhbGlkX3N0cmluZ19sZW5ndGguYmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0ZWY2NzgKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9hbm5vdGF0ZWRfYmluYXJ5L3Rlc3RzL2ludmFsaWRfc3RyaW5nX2xlbmd0aC5iaW4KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvYW5ub3RhdGVkX2JpbmFyeS90ZXN0cy9pbnZhbGlkX3N0cmluZ19sZW5ndGhfY3V0X3Nob3J0LmFmYiBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL2Fubm90YXRlZF9iaW5hcnkvdGVzdHMvaW52YWxpZF9zdHJpbmdfbGVuZ3RoX2N1dF9zaG9ydC5hZmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjZmMzk3YQotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL2Fubm90YXRlZF9iaW5hcnkvdGVzdHMvaW52YWxpZF9zdHJpbmdfbGVuZ3RoX2N1dF9zaG9ydC5hZmIKQEAgLTAsMCArMSw4MCBAQAorLy8gQW5ub3RhdGVkIEZsYXRidWZmZXIgQmluYXJ5CisvLworLy8gU2NoZW1hIGZpbGU6IGFubm90YXRlZF9iaW5hcnkuZmJzCisvLyBCaW5hcnkgZmlsZTogdGVzdHMvaW52YWxpZF9zdHJpbmdfbGVuZ3RoX2N1dF9zaG9ydC5iaW4KKworaGVhZGVyOgorICArMHgwMCB8IDQ0IDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMDQ0ICg2OCkgTG9jOiArMHg0NCAgIHwgb2Zmc2V0IHRvIHJvb3QgdGFibGUgYEFubm90YXRlZEJpbmFyeS5Gb29gCisgICsweDA0IHwgNDEgNEUgNEUgNEYgICAgICAgICAgICAgfCBjaGFyWzRdICAgICB8IEFOTk8gICAgICAgICAgICAgICAgICAgICAgICAgfCBGaWxlIElkZW50aWZpZXIKKworcGFkZGluZzoKKyAgKzB4MDggfCAwMCAwMCAgICAgICAgICAgICAgICAgICB8IHVpbnQ4X3RbMl0gIHwgLi4gICAgICAgICAgICAgICAgICAgICAgICAgICB8IHBhZGRpbmcKKwordnRhYmxlIChBbm5vdGF0ZWRCaW5hcnkuRm9vKToKKyAgKzB4MEEgfCAzQSAwMCAgICAgICAgICAgICAgICAgICB8IHVpbnQxNl90ICAgIHwgMHgwMDNBICg1OCkgICAgICAgICAgICAgICAgICB8IHNpemUgb2YgdGhpcyB2dGFibGUKKyAgKzB4MEMgfCA2OCAwMCAgICAgICAgICAgICAgICAgICB8IHVpbnQxNl90ICAgIHwgMHgwMDY4ICgxMDQpICAgICAgICAgICAgICAgICB8IHNpemUgb2YgcmVmZXJyaW5nIHRhYmxlCisgICsweDBFIHwgMEMgMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgICB8IDB4MDAwQyAoMTIpICAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYGNvdW50ZXJgIChpZDogMCkKKyAgKzB4MTAgfCAwNyAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgIHwgMHgwMDA3ICg3KSAgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgaGVhbHRoeWAgKGlkOiAxKQorICArMHgxMiB8IDAwIDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgfCAweDAwMDAgKDApICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBsZXZlbGAgKGlkOiAyKSA8ZGVmYXVsdHMgdG8gOTk+IChMb25nKQorICArMHgxNCB8IDA4IDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgfCAweDAwMDggKDgpICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBtZWFsYCAoaWQ6IDMpCisgICsweDE2IHwgMTAgMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgICB8IDB4MDAxMCAoMTYpICAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYGJhcmAgKGlkOiA0KQorICArMHgxOCB8IDE0IDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgfCAweDAwMTQgKDIwKSAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBob21lYCAoaWQ6IDUpCisgICsweDFBIHwgMzAgMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgICB8IDB4MDAzMCAoNDgpICAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYG5hbWVgIChpZDogNikKKyAgKzB4MUMgfCAzNCAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgIHwgMHgwMDM0ICg1MikgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgYmFyc2AgKGlkOiA3KQorICArMHgxRSB8IDA5IDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgfCAweDAwMDkgKDkpICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBiYXJfYmF6X3R5cGVgIChpZDogOCkKKyAgKzB4MjAgfCAzOCAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgIHwgMHgwMDM4ICg1NikgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgYmFyX2JhemAgKGlkOiA5KQorICArMHgyMiB8IDNDIDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgfCAweDAwM0MgKDYwKSAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBhY2NvdW50c2AgKGlkOiAxMCkKKyAgKzB4MjQgfCA0MCAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgIHwgMHgwMDQwICg2NCkgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgYm9iYCAoaWQ6IDExKQorICArMHgyNiB8IDQ0IDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgfCAweDAwNDQgKDY4KSAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBhbGljZWAgKGlkOiAxMikKKyAgKzB4MjggfCAwMCAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgIHwgMHgwMDAwICgwKSAgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgbWF5YmVfaTMyYCAoaWQ6IDEzKSA8ZGVmYXVsdHMgdG8gMD4gKEludCkKKyAgKzB4MkEgfCAwMCAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgIHwgMHgwMDAwICgwKSAgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgZGVmYXVsdF9pMzJgIChpZDogMTQpIDxkZWZhdWx0cyB0byA0Mj4gKEludCkKKyAgKzB4MkMgfCA0OCAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgIHwgMHgwMDQ4ICg3MikgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBganVzdF9pMzJgIChpZDogMTUpCisgICsweDJFIHwgNEMgMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgICB8IDB4MDA0QyAoNzYpICAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYG5hbWVzYCAoaWQ6IDE2KQorICArMHgzMCB8IDUwIDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgfCAweDAwNTAgKDgwKSAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBwb2ludHNfb2ZfaW50ZXJlc3RgIChpZDogMTcpCisgICsweDMyIHwgNTQgMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgICB8IDB4MDA1NCAoODQpICAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYGZvb2JhcnNfdHlwZWAgKGlkOiAxOCkKKyAgKzB4MzQgfCA1OCAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgIHwgMHgwMDU4ICg4OCkgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgZm9vYmFyc2AgKGlkOiAxOSkKKyAgKzB4MzYgfCAwQSAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgIHwgMHgwMDBBICgxMCkgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgbWVhc3VyZW1lbnRfdHlwZWAgKGlkOiAyMCkKKyAgKzB4MzggfCA1QyAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgIHwgMHgwMDVDICg5MikgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgbWVhc3VyZW1lbnRgIChpZDogMjEpCisgICsweDNBIHwgMEIgMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgICB8IDB4MDAwQiAoMTEpICAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYGFueXRoaW5nX3R5cGVgIChpZDogMjIpCisgICsweDNDIHwgNjAgMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgICB8IDB4MDA2MCAoOTYpICAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYGFueXRoaW5nYCAoaWQ6IDIzKQorICArMHgzRSB8IDAwIDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgfCAweDAwMDAgKDApICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGB0ZW1wZXJhdHVyZWAgKGlkOiAyNCkgPGRlZmF1bHRzIHRvIDk4LjYwMDAwMD4gKEZsb2F0KQorICArMHg0MCB8IDAwIDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgfCAweDAwMDAgKDApICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGB0ZWV0b3RhbGVyYCAoaWQ6IDI1KSA8bnVsbD4gKE9iaikKKyAgKzB4NDIgfCA2NCAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgIHwgMHgwMDY0ICgxMDApICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgY2hhcmxpZWAgKGlkOiAyNikKKworcm9vdF90YWJsZSAoQW5ub3RhdGVkQmluYXJ5LkZvbyk6CisgICsweDQ0IHwgM0EgMDAgMDAgMDAgICAgICAgICAgICAgfCBTT2Zmc2V0MzIgICB8IDB4MDAwMDAwM0EgKDU4KSBMb2M6ICsweDBBICAgfCBvZmZzZXQgdG8gdnRhYmxlCisgICsweDQ4IHwgMDAgMDAgMDAgICAgICAgICAgICAgICAgfCB1aW50OF90WzNdICB8IC4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgfCBwYWRkaW5nCisgICsweDRCIHwgMDEgICAgICAgICAgICAgICAgICAgICAgfCB1aW50OF90ICAgICB8IDB4MDEgKDEpICAgICAgICAgICAgICAgICAgICAgfCB0YWJsZSBmaWVsZCBgaGVhbHRoeWAgKEJvb2wpCisgICsweDRDIHwgMDIgICAgICAgICAgICAgICAgICAgICAgfCB1aW50OF90ICAgICB8IDB4MDIgKDIpICAgICAgICAgICAgICAgICAgICAgfCB0YWJsZSBmaWVsZCBgbWVhbGAgKEJ5dGUpCisgICsweDREIHwgMDIgICAgICAgICAgICAgICAgICAgICAgfCBVVHlwZTggICAgICB8IDB4MDIgKDIpICAgICAgICAgICAgICAgICAgICAgfCB0YWJsZSBmaWVsZCBgYmFyX2Jhel90eXBlYCAoVVR5cGUpCisgICsweDRFIHwgMDEgICAgICAgICAgICAgICAgICAgICAgfCBVVHlwZTggICAgICB8IDB4MDEgKDEpICAgICAgICAgICAgICAgICAgICAgfCB0YWJsZSBmaWVsZCBgbWVhc3VyZW1lbnRfdHlwZWAgKFVUeXBlKQorICArMHg0RiB8IDAxICAgICAgICAgICAgICAgICAgICAgIHwgVVR5cGU4ICAgICAgfCAweDAxICgxKSAgICAgICAgICAgICAgICAgICAgIHwgdGFibGUgZmllbGQgYGFueXRoaW5nX3R5cGVgIChVVHlwZSkKKyAgKzB4NTAgfCBEMiAwNCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgIHwgMHgwMDAwMDREMiAoMTIzNCkgICAgICAgICAgICB8IHRhYmxlIGZpZWxkIGBjb3VudGVyYCAoSW50KQorICArMHg1NCB8IDI4IDAyIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMjI4ICg1NTIpIExvYzogKzB4MjdDIHwgRVJST1I6IG9mZnNldCB0byBmaWVsZCBgYmFyYC4gSW52YWxpZCBvZmZzZXQsIHBvaW50cyBvdXRzaWRlIHRoZSBiaW5hcnkuCisgICsweDU4IHwgMDEgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICB8IDB4MDAwMDAwMDEgKDEpICAgICAgICAgICAgICAgfCBzdHJ1Y3QgZmllbGQgYEFubm90YXRlZEJpbmFyeS5CdWlsZGluZy5mbG9vcnNgIChJbnQpCisgICsweDVDIHwgMDIgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICB8IDB4MDAwMDAwMDIgKDIpICAgICAgICAgICAgICAgfCBzdHJ1Y3QgZmllbGQgYEFubm90YXRlZEJpbmFyeS5CdWlsZGluZy5kb29yc2AgKEludCkKKyAgKzB4NjAgfCAwQyAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgIHwgMHgwMDAwMDAwQyAoMTIpICAgICAgICAgICAgICB8IHN0cnVjdCBmaWVsZCBgQW5ub3RhdGVkQmluYXJ5LkJ1aWxkaW5nLndpbmRvd3NgIChJbnQpCisgICsweDY0IHwgMEEgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICB8IDB4MDAwMDAwMEEgKDEwKSAgICAgICAgICAgICAgfCBhcnJheSBmaWVsZCBgQW5ub3RhdGVkQmluYXJ5LkRpbWVuc2lvbi52YWx1ZXNgWzBdIChJbnQpCisgICsweDY4IHwgMEMgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICB8IDB4MDAwMDAwMEMgKDEyKSAgICAgICAgICAgICAgfCBhcnJheSBmaWVsZCBgQW5ub3RhdGVkQmluYXJ5LkRpbWVuc2lvbi52YWx1ZXNgWzFdIChJbnQpCisgICsweDZDIHwgMTQgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICB8IDB4MDAwMDAwMTQgKDIwKSAgICAgICAgICAgICAgfCBhcnJheSBmaWVsZCBgQW5ub3RhdGVkQmluYXJ5LkRpbWVuc2lvbi52YWx1ZXNgWzJdIChJbnQpCisgICsweDcwIHwgMDEgICAgICAgICAgICAgICAgICAgICAgfCB1aW50OF90ICAgICB8IDB4MDEgKDEpICAgICAgICAgICAgICAgICAgICAgfCBzdHJ1Y3QgZmllbGQgYEFubm90YXRlZEJpbmFyeS5Ub2xlcmFuY2Uud2lkdGhgIChVQnl0ZSkKKyAgKzB4NzEgfCAwMiAgICAgICAgICAgICAgICAgICAgICB8IHVpbnQ4X3QgICAgIHwgMHgwMiAoMikgICAgICAgICAgICAgICAgICAgICB8IHN0cnVjdCBmaWVsZCBgQW5ub3RhdGVkQmluYXJ5LlRvbGVyYW5jZS53aWR0aGAgKFVCeXRlKQorICArMHg3MiB8IDAzICAgICAgICAgICAgICAgICAgICAgIHwgdWludDhfdCAgICAgfCAweDAzICgzKSAgICAgICAgICAgICAgICAgICAgIHwgc3RydWN0IGZpZWxkIGBBbm5vdGF0ZWRCaW5hcnkuVG9sZXJhbmNlLndpZHRoYCAoVUJ5dGUpCisgICsweDczIHwgMDAgICAgICAgICAgICAgICAgICAgICAgfCB1aW50OF90WzFdICB8IC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBwYWRkaW5nCisgICsweDc0IHwgQzggMDEgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDAxQzggKDQ1NikgTG9jOiArMHgyM0MgfCBFUlJPUjogb2Zmc2V0IHRvIGZpZWxkIGBuYW1lYC4gSW52YWxpZCBvZmZzZXQsIHBvaW50cyBvdXRzaWRlIHRoZSBiaW5hcnkuCisgICsweDc4IHwgNUMgMDEgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDAxNUMgKDM0OCkgTG9jOiArMHgxRDQgfCBFUlJPUjogb2Zmc2V0IHRvIGZpZWxkIGBiYXJzYC4gSW52YWxpZCBvZmZzZXQsIHBvaW50cyBvdXRzaWRlIHRoZSBiaW5hcnkuCisgICsweDdDIHwgNTAgMDEgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDAxNTAgKDMzNikgTG9jOiArMHgxQ0MgfCBFUlJPUjogb2Zmc2V0IHRvIGZpZWxkIGBiYXJfYmF6YC4gSW52YWxpZCBvZmZzZXQsIHBvaW50cyBvdXRzaWRlIHRoZSBiaW5hcnkuCisgICsweDgwIHwgMzQgMDEgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDAxMzQgKDMwOCkgTG9jOiArMHgxQjQgfCBFUlJPUjogb2Zmc2V0IHRvIGZpZWxkIGBhY2NvdW50c2AuIEludmFsaWQgb2Zmc2V0LCBwb2ludHMgb3V0c2lkZSB0aGUgYmluYXJ5LgorICArMHg4NCB8IDI0IDAxIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMTI0ICgyOTIpIExvYzogKzB4MUE4IHwgRVJST1I6IG9mZnNldCB0byBmaWVsZCBgYm9iYC4gSW52YWxpZCBvZmZzZXQsIHBvaW50cyBvdXRzaWRlIHRoZSBiaW5hcnkuCisgICsweDg4IHwgMTQgMDEgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDAxMTQgKDI3NikgTG9jOiArMHgxOUMgfCBFUlJPUjogb2Zmc2V0IHRvIGZpZWxkIGBhbGljZWAuIEludmFsaWQgb2Zmc2V0LCBwb2ludHMgb3V0c2lkZSB0aGUgYmluYXJ5LgorICArMHg4QyB8IDBEIDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgfCAweDAwMDAwMDBEICgxMykgICAgICAgICAgICAgIHwgdGFibGUgZmllbGQgYGp1c3RfaTMyYCAoSW50KQorICArMHg5MCB8IERDIDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMERDICgyMjApIExvYzogKzB4MTZDIHwgRVJST1I6IG9mZnNldCB0byBmaWVsZCBgbmFtZXNgLiBJbnZhbGlkIG9mZnNldCwgcG9pbnRzIG91dHNpZGUgdGhlIGJpbmFyeS4KKyAgKzB4OTQgfCBBMCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDBBMCAoMTYwKSBMb2M6ICsweDEzNCB8IEVSUk9SOiBvZmZzZXQgdG8gZmllbGQgYHBvaW50c19vZl9pbnRlcmVzdGAuIEludmFsaWQgb2Zmc2V0LCBwb2ludHMgb3V0c2lkZSB0aGUgYmluYXJ5LgorICArMHg5OCB8IDk0IDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMDk0ICgxNDgpIExvYzogKzB4MTJDIHwgRVJST1I6IG9mZnNldCB0byBmaWVsZCBgZm9vYmFyc190eXBlYC4gSW52YWxpZCBvZmZzZXQsIHBvaW50cyBvdXRzaWRlIHRoZSBiaW5hcnkuCisgICsweDlDIHwgMzggMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDAwMzggKDU2KSBMb2M6ICsweEQ0ICAgfCBFUlJPUjogb2Zmc2V0IHRvIGZpZWxkIGBmb29iYXJzYC4gSW52YWxpZCBvZmZzZXQsIHBvaW50cyBvdXRzaWRlIHRoZSBiaW5hcnkuCisgICsweEEwIHwgMzMgMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDAwMzMgKDUxKSBMb2M6ICsweEQzICAgfCBFUlJPUjogb2Zmc2V0IHRvIGZpZWxkIGBtZWFzdXJlbWVudGAuIEludmFsaWQgb2Zmc2V0LCBwb2ludHMgb3V0c2lkZSB0aGUgYmluYXJ5LgorICArMHhBNCB8IDFDIDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMDFDICgyOCkgTG9jOiArMHhDMCAgIHwgRVJST1I6IG9mZnNldCB0byBmaWVsZCBgYW55dGhpbmdgLiBJbnZhbGlkIG9mZnNldCwgcG9pbnRzIG91dHNpZGUgdGhlIGJpbmFyeS4KKyAgKzB4QTggfCAwNCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDAwNCAoNCkgTG9jOiArMHhBQyAgICB8IG9mZnNldCB0byBmaWVsZCBgY2hhcmxpZWAgKHN0cmluZykKKworc3RyaW5nIChBbm5vdGF0ZWRCaW5hcnkuRm9vLmNoYXJsaWUpOgorICArMHhBQyB8IDA1IDAwICAgICAgICAgICAgICAgICAgIHwgP3VpbnQ4X3RbMl0gfCAuLiAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgRVJST1I6IGxlbmd0aCBvZiBzdHJpbmcuIEluY29tcGxldGUgYmluYXJ5LCBleHBlY3RlZCB0byByZWFkIDQgYnl0ZXMuCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9hbm5vdGF0ZWRfYmluYXJ5L3Rlc3RzL2ludmFsaWRfc3RyaW5nX2xlbmd0aF9jdXRfc2hvcnQuYmluIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvYW5ub3RhdGVkX2JpbmFyeS90ZXN0cy9pbnZhbGlkX3N0cmluZ19sZW5ndGhfY3V0X3Nob3J0LmJpbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OWY3ZTExCi0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvYW5ub3RhdGVkX2JpbmFyeS90ZXN0cy9pbnZhbGlkX3N0cmluZ19sZW5ndGhfY3V0X3Nob3J0LmJpbgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9hbm5vdGF0ZWRfYmluYXJ5L3Rlc3RzL2ludmFsaWRfc3RydWN0X2FycmF5X2ZpZWxkX2N1dF9zaG9ydC5hZmIgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9hbm5vdGF0ZWRfYmluYXJ5L3Rlc3RzL2ludmFsaWRfc3RydWN0X2FycmF5X2ZpZWxkX2N1dF9zaG9ydC5hZmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzViZTY5YQotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL2Fubm90YXRlZF9iaW5hcnkvdGVzdHMvaW52YWxpZF9zdHJ1Y3RfYXJyYXlfZmllbGRfY3V0X3Nob3J0LmFmYgpAQCAtMCwwICsxLDcyIEBACisvLyBBbm5vdGF0ZWQgRmxhdGJ1ZmZlciBCaW5hcnkKKy8vCisvLyBTY2hlbWEgZmlsZTogYW5ub3RhdGVkX2JpbmFyeS5mYnMKKy8vIEJpbmFyeSBmaWxlOiB0ZXN0cy9pbnZhbGlkX3N0cnVjdF9hcnJheV9maWVsZF9jdXRfc2hvcnQuYmluCisKK2hlYWRlcjoKKyAgKzB4MDAgfCA0NCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDA0NCAoNjgpIExvYzogKzB4NDQgICB8IG9mZnNldCB0byByb290IHRhYmxlIGBBbm5vdGF0ZWRCaW5hcnkuRm9vYAorICArMHgwNCB8IDQxIDRFIDRFIDRGICAgICAgICAgICAgIHwgY2hhcls0XSAgICAgfCBBTk5PICAgICAgICAgICAgICAgICAgICAgICAgIHwgRmlsZSBJZGVudGlmaWVyCisKK3BhZGRpbmc6CisgICsweDA4IHwgMDAgMDAgICAgICAgICAgICAgICAgICAgfCB1aW50OF90WzJdICB8IC4uICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBwYWRkaW5nCisKK3Z0YWJsZSAoQW5ub3RhdGVkQmluYXJ5LkZvbyk6CisgICsweDBBIHwgM0EgMDAgICAgICAgICAgICAgICAgICAgfCB1aW50MTZfdCAgICB8IDB4MDAzQSAoNTgpICAgICAgICAgICAgICAgICAgfCBzaXplIG9mIHRoaXMgdnRhYmxlCisgICsweDBDIHwgNjggMDAgICAgICAgICAgICAgICAgICAgfCB1aW50MTZfdCAgICB8IDB4MDA2OCAoMTA0KSAgICAgICAgICAgICAgICAgfCBFUlJPUjogc2l6ZSBvZiByZWZlcnJpbmcgdGFibGUuIExvbmdlciB0aGFuIHRoZSBiaW5hcnkuCisgICsweDBFIHwgMEMgMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgICB8IDB4MDAwQyAoMTIpICAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYGNvdW50ZXJgIChpZDogMCkKKyAgKzB4MTAgfCAwNyAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgIHwgMHgwMDA3ICg3KSAgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgaGVhbHRoeWAgKGlkOiAxKQorICArMHgxMiB8IDAwIDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgfCAweDAwMDAgKDApICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBsZXZlbGAgKGlkOiAyKSA8ZGVmYXVsdHMgdG8gOTk+IChMb25nKQorICArMHgxNCB8IDA4IDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgfCAweDAwMDggKDgpICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBtZWFsYCAoaWQ6IDMpCisgICsweDE2IHwgMTAgMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgICB8IDB4MDAxMCAoMTYpICAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYGJhcmAgKGlkOiA0KQorICArMHgxOCB8IDE0IDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgfCAweDAwMTQgKDIwKSAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBob21lYCAoaWQ6IDUpCisgICsweDFBIHwgMzAgMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgICB8IDB4MDAzMCAoNDgpICAgICAgICAgICAgICAgICAgfCBFUlJPUjogb2Zmc2V0IHRvIGZpZWxkIGBuYW1lYCAoaWQ6IDYpLiBJbnZhbGlkIG9mZnNldCwgcG9pbnRzIG91dHNpZGUgdGhlIGJpbmFyeS4KKyAgKzB4MUMgfCAzNCAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgIHwgMHgwMDM0ICg1MikgICAgICAgICAgICAgICAgICB8IEVSUk9SOiBvZmZzZXQgdG8gZmllbGQgYGJhcnNgIChpZDogNykuIEludmFsaWQgb2Zmc2V0LCBwb2ludHMgb3V0c2lkZSB0aGUgYmluYXJ5LgorICArMHgxRSB8IDA5IDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgfCAweDAwMDkgKDkpICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBiYXJfYmF6X3R5cGVgIChpZDogOCkKKyAgKzB4MjAgfCAzOCAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgIHwgMHgwMDM4ICg1NikgICAgICAgICAgICAgICAgICB8IEVSUk9SOiBvZmZzZXQgdG8gZmllbGQgYGJhcl9iYXpgIChpZDogOSkuIEludmFsaWQgb2Zmc2V0LCBwb2ludHMgb3V0c2lkZSB0aGUgYmluYXJ5LgorICArMHgyMiB8IDNDIDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgfCAweDAwM0MgKDYwKSAgICAgICAgICAgICAgICAgIHwgRVJST1I6IG9mZnNldCB0byBmaWVsZCBgYWNjb3VudHNgIChpZDogMTApLiBJbnZhbGlkIG9mZnNldCwgcG9pbnRzIG91dHNpZGUgdGhlIGJpbmFyeS4KKyAgKzB4MjQgfCA0MCAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgIHwgMHgwMDQwICg2NCkgICAgICAgICAgICAgICAgICB8IEVSUk9SOiBvZmZzZXQgdG8gZmllbGQgYGJvYmAgKGlkOiAxMSkuIEludmFsaWQgb2Zmc2V0LCBwb2ludHMgb3V0c2lkZSB0aGUgYmluYXJ5LgorICArMHgyNiB8IDQ0IDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgfCAweDAwNDQgKDY4KSAgICAgICAgICAgICAgICAgIHwgRVJST1I6IG9mZnNldCB0byBmaWVsZCBgYWxpY2VgIChpZDogMTIpLiBJbnZhbGlkIG9mZnNldCwgcG9pbnRzIG91dHNpZGUgdGhlIGJpbmFyeS4KKyAgKzB4MjggfCAwMCAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgIHwgMHgwMDAwICgwKSAgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgbWF5YmVfaTMyYCAoaWQ6IDEzKSA8ZGVmYXVsdHMgdG8gMD4gKEludCkKKyAgKzB4MkEgfCAwMCAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgIHwgMHgwMDAwICgwKSAgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgZGVmYXVsdF9pMzJgIChpZDogMTQpIDxkZWZhdWx0cyB0byA0Mj4gKEludCkKKyAgKzB4MkMgfCA0OCAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgIHwgMHgwMDQ4ICg3MikgICAgICAgICAgICAgICAgICB8IEVSUk9SOiBvZmZzZXQgdG8gZmllbGQgYGp1c3RfaTMyYCAoaWQ6IDE1KS4gSW52YWxpZCBvZmZzZXQsIHBvaW50cyBvdXRzaWRlIHRoZSBiaW5hcnkuCisgICsweDJFIHwgNEMgMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgICB8IDB4MDA0QyAoNzYpICAgICAgICAgICAgICAgICAgfCBFUlJPUjogb2Zmc2V0IHRvIGZpZWxkIGBuYW1lc2AgKGlkOiAxNikuIEludmFsaWQgb2Zmc2V0LCBwb2ludHMgb3V0c2lkZSB0aGUgYmluYXJ5LgorICArMHgzMCB8IDUwIDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgfCAweDAwNTAgKDgwKSAgICAgICAgICAgICAgICAgIHwgRVJST1I6IG9mZnNldCB0byBmaWVsZCBgcG9pbnRzX29mX2ludGVyZXN0YCAoaWQ6IDE3KS4gSW52YWxpZCBvZmZzZXQsIHBvaW50cyBvdXRzaWRlIHRoZSBiaW5hcnkuCisgICsweDMyIHwgNTQgMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgICB8IDB4MDA1NCAoODQpICAgICAgICAgICAgICAgICAgfCBFUlJPUjogb2Zmc2V0IHRvIGZpZWxkIGBmb29iYXJzX3R5cGVgIChpZDogMTgpLiBJbnZhbGlkIG9mZnNldCwgcG9pbnRzIG91dHNpZGUgdGhlIGJpbmFyeS4KKyAgKzB4MzQgfCA1OCAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgIHwgMHgwMDU4ICg4OCkgICAgICAgICAgICAgICAgICB8IEVSUk9SOiBvZmZzZXQgdG8gZmllbGQgYGZvb2JhcnNgIChpZDogMTkpLiBJbnZhbGlkIG9mZnNldCwgcG9pbnRzIG91dHNpZGUgdGhlIGJpbmFyeS4KKyAgKzB4MzYgfCAwQSAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgIHwgMHgwMDBBICgxMCkgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgbWVhc3VyZW1lbnRfdHlwZWAgKGlkOiAyMCkKKyAgKzB4MzggfCA1QyAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgIHwgMHgwMDVDICg5MikgICAgICAgICAgICAgICAgICB8IEVSUk9SOiBvZmZzZXQgdG8gZmllbGQgYG1lYXN1cmVtZW50YCAoaWQ6IDIxKS4gSW52YWxpZCBvZmZzZXQsIHBvaW50cyBvdXRzaWRlIHRoZSBiaW5hcnkuCisgICsweDNBIHwgMEIgMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgICB8IDB4MDAwQiAoMTEpICAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYGFueXRoaW5nX3R5cGVgIChpZDogMjIpCisgICsweDNDIHwgNjAgMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgICB8IDB4MDA2MCAoOTYpICAgICAgICAgICAgICAgICAgfCBFUlJPUjogb2Zmc2V0IHRvIGZpZWxkIGBhbnl0aGluZ2AgKGlkOiAyMykuIEludmFsaWQgb2Zmc2V0LCBwb2ludHMgb3V0c2lkZSB0aGUgYmluYXJ5LgorICArMHgzRSB8IDAwIDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgfCAweDAwMDAgKDApICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGB0ZW1wZXJhdHVyZWAgKGlkOiAyNCkgPGRlZmF1bHRzIHRvIDk4LjYwMDAwMD4gKEZsb2F0KQorICArMHg0MCB8IDAwIDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgfCAweDAwMDAgKDApICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGB0ZWV0b3RhbGVyYCAoaWQ6IDI1KSA8bnVsbD4gKE9iaikKKyAgKzB4NDIgfCA2NCAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgIHwgMHgwMDY0ICgxMDApICAgICAgICAgICAgICAgICB8IEVSUk9SOiBvZmZzZXQgdG8gZmllbGQgYGNoYXJsaWVgIChpZDogMjYpLiBJbnZhbGlkIG9mZnNldCwgcG9pbnRzIG91dHNpZGUgdGhlIGJpbmFyeS4KKyAgKzB4MjggfCAwMCAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgIHwgMHgwMDAwICgwKSAgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byB1bmtub3duIGZpZWxkIChpZDogMTMpCisgICsweDJBIHwgMDAgMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgICB8IDB4MDAwMCAoMCkgICAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gdW5rbm93biBmaWVsZCAoaWQ6IDE0KQorICArMHgyQyB8IDQ4IDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgfCAweDAwNDggKDcyKSAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIHVua25vd24gZmllbGQgKGlkOiAxNSkKKyAgKzB4MkUgfCA0QyAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgIHwgMHgwMDRDICg3NikgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byB1bmtub3duIGZpZWxkIChpZDogMTYpCisgICsweDMwIHwgNTAgMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgICB8IDB4MDA1MCAoODApICAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gdW5rbm93biBmaWVsZCAoaWQ6IDE3KQorICArMHgzMiB8IDU0IDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgfCAweDAwNTQgKDg0KSAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIHVua25vd24gZmllbGQgKGlkOiAxOCkKKyAgKzB4MzQgfCA1OCAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgIHwgMHgwMDU4ICg4OCkgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byB1bmtub3duIGZpZWxkIChpZDogMTkpCisgICsweDM2IHwgMEEgMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgICB8IDB4MDAwQSAoMTApICAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gdW5rbm93biBmaWVsZCAoaWQ6IDIwKQorICArMHgzOCB8IDVDIDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgfCAweDAwNUMgKDkyKSAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIHVua25vd24gZmllbGQgKGlkOiAyMSkKKyAgKzB4M0EgfCAwQiAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgIHwgMHgwMDBCICgxMSkgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byB1bmtub3duIGZpZWxkIChpZDogMjIpCisgICsweDNDIHwgNjAgMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgICB8IDB4MDA2MCAoOTYpICAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gdW5rbm93biBmaWVsZCAoaWQ6IDIzKQorICArMHgzRSB8IDAwIDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgfCAweDAwMDAgKDApICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIHVua25vd24gZmllbGQgKGlkOiAyNCkKKyAgKzB4NDAgfCAwMCAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgIHwgMHgwMDAwICgwKSAgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byB1bmtub3duIGZpZWxkIChpZDogMjUpCisgICsweDQyIHwgNjQgMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgICB8IDB4MDA2NCAoMTAwKSAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gdW5rbm93biBmaWVsZCAoaWQ6IDI2KQorCityb290X3RhYmxlIChBbm5vdGF0ZWRCaW5hcnkuRm9vKToKKyAgKzB4NDQgfCAzQSAwMCAwMCAwMCAgICAgICAgICAgICB8IFNPZmZzZXQzMiAgIHwgMHgwMDAwMDAzQSAoNTgpIExvYzogKzB4MEEgICB8IG9mZnNldCB0byB2dGFibGUKKyAgKzB4NDggfCAwMCAwMCAwMCAgICAgICAgICAgICAgICB8IHVpbnQ4X3RbM10gIHwgLi4uICAgICAgICAgICAgICAgICAgICAgICAgICB8IHBhZGRpbmcKKyAgKzB4NEIgfCAwMSAgICAgICAgICAgICAgICAgICAgICB8IHVpbnQ4X3QgICAgIHwgMHgwMSAoMSkgICAgICAgICAgICAgICAgICAgICB8IHRhYmxlIGZpZWxkIGBoZWFsdGh5YCAoQm9vbCkKKyAgKzB4NEMgfCAwMiAgICAgICAgICAgICAgICAgICAgICB8IHVpbnQ4X3QgICAgIHwgMHgwMiAoMikgICAgICAgICAgICAgICAgICAgICB8IHRhYmxlIGZpZWxkIGBtZWFsYCAoQnl0ZSkKKyAgKzB4NEQgfCAwMiAgICAgICAgICAgICAgICAgICAgICB8IFVUeXBlOCAgICAgIHwgMHgwMiAoMikgICAgICAgICAgICAgICAgICAgICB8IHRhYmxlIGZpZWxkIGBiYXJfYmF6X3R5cGVgIChVVHlwZSkKKyAgKzB4NEUgfCAwMSAgICAgICAgICAgICAgICAgICAgICB8IFVUeXBlOCAgICAgIHwgMHgwMSAoMSkgICAgICAgICAgICAgICAgICAgICB8IHRhYmxlIGZpZWxkIGBtZWFzdXJlbWVudF90eXBlYCAoVVR5cGUpCisgICsweDRGIHwgMDEgICAgICAgICAgICAgICAgICAgICAgfCBVVHlwZTggICAgICB8IDB4MDEgKDEpICAgICAgICAgICAgICAgICAgICAgfCB0YWJsZSBmaWVsZCBgYW55dGhpbmdfdHlwZWAgKFVUeXBlKQorICArMHg1MCB8IEQyIDA0IDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgfCAweDAwMDAwNEQyICgxMjM0KSAgICAgICAgICAgIHwgdGFibGUgZmllbGQgYGNvdW50ZXJgIChJbnQpCisgICsweDU0IHwgMjggMDIgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDAyMjggKDU1MikgTG9jOiArMHgyN0MgfCBFUlJPUjogb2Zmc2V0IHRvIGZpZWxkIGBiYXJgLiBJbnZhbGlkIG9mZnNldCwgcG9pbnRzIG91dHNpZGUgdGhlIGJpbmFyeS4KKyAgKzB4NTggfCAwMSAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgIHwgMHgwMDAwMDAwMSAoMSkgICAgICAgICAgICAgICB8IHN0cnVjdCBmaWVsZCBgQW5ub3RhdGVkQmluYXJ5LkJ1aWxkaW5nLmZsb29yc2AgKEludCkKKyAgKzB4NUMgfCAwMiAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgIHwgMHgwMDAwMDAwMiAoMikgICAgICAgICAgICAgICB8IHN0cnVjdCBmaWVsZCBgQW5ub3RhdGVkQmluYXJ5LkJ1aWxkaW5nLmRvb3JzYCAoSW50KQorICArMHg2MCB8IDBDIDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgfCAweDAwMDAwMDBDICgxMikgICAgICAgICAgICAgIHwgc3RydWN0IGZpZWxkIGBBbm5vdGF0ZWRCaW5hcnkuQnVpbGRpbmcud2luZG93c2AgKEludCkKKyAgKzB4NjQgfCAwQSAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgIHwgMHgwMDAwMDAwQSAoMTApICAgICAgICAgICAgICB8IGFycmF5IGZpZWxkIGBBbm5vdGF0ZWRCaW5hcnkuRGltZW5zaW9uLnZhbHVlc2BbMF0gKEludCkKKyAgKzB4NjggfCAwQyAwMCAgICAgICAgICAgICAgICAgICB8ID91aW50OF90WzJdIHwgLi4gICAgICAgICAgICAgICAgICAgICAgICAgICB8IEVSUk9SOiBhcnJheSBmaWVsZCBgQW5ub3RhdGVkQmluYXJ5LkRpbWVuc2lvbi52YWx1ZXNgWzFdIChJbnQpLiBJbmNvbXBsZXRlIGJpbmFyeSwgZXhwZWN0ZWQgdG8gcmVhZCA0IGJ5dGVzLgpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvYW5ub3RhdGVkX2JpbmFyeS90ZXN0cy9pbnZhbGlkX3N0cnVjdF9hcnJheV9maWVsZF9jdXRfc2hvcnQuYmluIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvYW5ub3RhdGVkX2JpbmFyeS90ZXN0cy9pbnZhbGlkX3N0cnVjdF9hcnJheV9maWVsZF9jdXRfc2hvcnQuYmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI3MDFmNzMKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9hbm5vdGF0ZWRfYmluYXJ5L3Rlc3RzL2ludmFsaWRfc3RydWN0X2FycmF5X2ZpZWxkX2N1dF9zaG9ydC5iaW4KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvYW5ub3RhdGVkX2JpbmFyeS90ZXN0cy9pbnZhbGlkX3N0cnVjdF9maWVsZF9jdXRfc2hvcnQuYWZiIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvYW5ub3RhdGVkX2JpbmFyeS90ZXN0cy9pbnZhbGlkX3N0cnVjdF9maWVsZF9jdXRfc2hvcnQuYWZiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5ZjY0NmMKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9hbm5vdGF0ZWRfYmluYXJ5L3Rlc3RzL2ludmFsaWRfc3RydWN0X2ZpZWxkX2N1dF9zaG9ydC5hZmIKQEAgLTAsMCArMSw2OSBAQAorLy8gQW5ub3RhdGVkIEZsYXRidWZmZXIgQmluYXJ5CisvLworLy8gU2NoZW1hIGZpbGU6IGFubm90YXRlZF9iaW5hcnkuZmJzCisvLyBCaW5hcnkgZmlsZTogdGVzdHMvaW52YWxpZF9zdHJ1Y3RfZmllbGRfY3V0X3Nob3J0LmJpbgorCitoZWFkZXI6CisgICsweDAwIHwgNDQgMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDAwNDQgKDY4KSBMb2M6ICsweDQ0ICAgfCBvZmZzZXQgdG8gcm9vdCB0YWJsZSBgQW5ub3RhdGVkQmluYXJ5LkZvb2AKKyAgKzB4MDQgfCA0MSA0RSA0RSA0RiAgICAgICAgICAgICB8IGNoYXJbNF0gICAgIHwgQU5OTyAgICAgICAgICAgICAgICAgICAgICAgICB8IEZpbGUgSWRlbnRpZmllcgorCitwYWRkaW5nOgorICArMHgwOCB8IDAwIDAwICAgICAgICAgICAgICAgICAgIHwgdWludDhfdFsyXSAgfCAuLiAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgcGFkZGluZworCit2dGFibGUgKEFubm90YXRlZEJpbmFyeS5Gb28pOgorICArMHgwQSB8IDNBIDAwICAgICAgICAgICAgICAgICAgIHwgdWludDE2X3QgICAgfCAweDAwM0EgKDU4KSAgICAgICAgICAgICAgICAgIHwgc2l6ZSBvZiB0aGlzIHZ0YWJsZQorICArMHgwQyB8IDY4IDAwICAgICAgICAgICAgICAgICAgIHwgdWludDE2X3QgICAgfCAweDAwNjggKDEwNCkgICAgICAgICAgICAgICAgIHwgRVJST1I6IHNpemUgb2YgcmVmZXJyaW5nIHRhYmxlLiBMb25nZXIgdGhhbiB0aGUgYmluYXJ5LgorICArMHgwRSB8IDBDIDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgfCAweDAwMEMgKDEyKSAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBjb3VudGVyYCAoaWQ6IDApCisgICsweDEwIHwgMDcgMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgICB8IDB4MDAwNyAoNykgICAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYGhlYWx0aHlgIChpZDogMSkKKyAgKzB4MTIgfCAwMCAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgIHwgMHgwMDAwICgwKSAgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgbGV2ZWxgIChpZDogMikgPGRlZmF1bHRzIHRvIDk5PiAoTG9uZykKKyAgKzB4MTQgfCAwOCAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgIHwgMHgwMDA4ICg4KSAgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgbWVhbGAgKGlkOiAzKQorICArMHgxNiB8IDEwIDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgfCAweDAwMTAgKDE2KSAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBiYXJgIChpZDogNCkKKyAgKzB4MTggfCAxNCAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgIHwgMHgwMDE0ICgyMCkgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgaG9tZWAgKGlkOiA1KQorICArMHgxQSB8IDMwIDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgfCAweDAwMzAgKDQ4KSAgICAgICAgICAgICAgICAgIHwgRVJST1I6IG9mZnNldCB0byBmaWVsZCBgbmFtZWAgKGlkOiA2KS4gSW52YWxpZCBvZmZzZXQsIHBvaW50cyBvdXRzaWRlIHRoZSBiaW5hcnkuCisgICsweDFDIHwgMzQgMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgICB8IDB4MDAzNCAoNTIpICAgICAgICAgICAgICAgICAgfCBFUlJPUjogb2Zmc2V0IHRvIGZpZWxkIGBiYXJzYCAoaWQ6IDcpLiBJbnZhbGlkIG9mZnNldCwgcG9pbnRzIG91dHNpZGUgdGhlIGJpbmFyeS4KKyAgKzB4MUUgfCAwOSAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgIHwgMHgwMDA5ICg5KSAgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgYmFyX2Jhel90eXBlYCAoaWQ6IDgpCisgICsweDIwIHwgMzggMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgICB8IDB4MDAzOCAoNTYpICAgICAgICAgICAgICAgICAgfCBFUlJPUjogb2Zmc2V0IHRvIGZpZWxkIGBiYXJfYmF6YCAoaWQ6IDkpLiBJbnZhbGlkIG9mZnNldCwgcG9pbnRzIG91dHNpZGUgdGhlIGJpbmFyeS4KKyAgKzB4MjIgfCAzQyAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgIHwgMHgwMDNDICg2MCkgICAgICAgICAgICAgICAgICB8IEVSUk9SOiBvZmZzZXQgdG8gZmllbGQgYGFjY291bnRzYCAoaWQ6IDEwKS4gSW52YWxpZCBvZmZzZXQsIHBvaW50cyBvdXRzaWRlIHRoZSBiaW5hcnkuCisgICsweDI0IHwgNDAgMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgICB8IDB4MDA0MCAoNjQpICAgICAgICAgICAgICAgICAgfCBFUlJPUjogb2Zmc2V0IHRvIGZpZWxkIGBib2JgIChpZDogMTEpLiBJbnZhbGlkIG9mZnNldCwgcG9pbnRzIG91dHNpZGUgdGhlIGJpbmFyeS4KKyAgKzB4MjYgfCA0NCAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgIHwgMHgwMDQ0ICg2OCkgICAgICAgICAgICAgICAgICB8IEVSUk9SOiBvZmZzZXQgdG8gZmllbGQgYGFsaWNlYCAoaWQ6IDEyKS4gSW52YWxpZCBvZmZzZXQsIHBvaW50cyBvdXRzaWRlIHRoZSBiaW5hcnkuCisgICsweDI4IHwgMDAgMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgICB8IDB4MDAwMCAoMCkgICAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYG1heWJlX2kzMmAgKGlkOiAxMykgPGRlZmF1bHRzIHRvIDA+IChJbnQpCisgICsweDJBIHwgMDAgMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgICB8IDB4MDAwMCAoMCkgICAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYGRlZmF1bHRfaTMyYCAoaWQ6IDE0KSA8ZGVmYXVsdHMgdG8gNDI+IChJbnQpCisgICsweDJDIHwgNDggMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgICB8IDB4MDA0OCAoNzIpICAgICAgICAgICAgICAgICAgfCBFUlJPUjogb2Zmc2V0IHRvIGZpZWxkIGBqdXN0X2kzMmAgKGlkOiAxNSkuIEludmFsaWQgb2Zmc2V0LCBwb2ludHMgb3V0c2lkZSB0aGUgYmluYXJ5LgorICArMHgyRSB8IDRDIDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgfCAweDAwNEMgKDc2KSAgICAgICAgICAgICAgICAgIHwgRVJST1I6IG9mZnNldCB0byBmaWVsZCBgbmFtZXNgIChpZDogMTYpLiBJbnZhbGlkIG9mZnNldCwgcG9pbnRzIG91dHNpZGUgdGhlIGJpbmFyeS4KKyAgKzB4MzAgfCA1MCAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgIHwgMHgwMDUwICg4MCkgICAgICAgICAgICAgICAgICB8IEVSUk9SOiBvZmZzZXQgdG8gZmllbGQgYHBvaW50c19vZl9pbnRlcmVzdGAgKGlkOiAxNykuIEludmFsaWQgb2Zmc2V0LCBwb2ludHMgb3V0c2lkZSB0aGUgYmluYXJ5LgorICArMHgzMiB8IDU0IDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgfCAweDAwNTQgKDg0KSAgICAgICAgICAgICAgICAgIHwgRVJST1I6IG9mZnNldCB0byBmaWVsZCBgZm9vYmFyc190eXBlYCAoaWQ6IDE4KS4gSW52YWxpZCBvZmZzZXQsIHBvaW50cyBvdXRzaWRlIHRoZSBiaW5hcnkuCisgICsweDM0IHwgNTggMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgICB8IDB4MDA1OCAoODgpICAgICAgICAgICAgICAgICAgfCBFUlJPUjogb2Zmc2V0IHRvIGZpZWxkIGBmb29iYXJzYCAoaWQ6IDE5KS4gSW52YWxpZCBvZmZzZXQsIHBvaW50cyBvdXRzaWRlIHRoZSBiaW5hcnkuCisgICsweDM2IHwgMEEgMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgICB8IDB4MDAwQSAoMTApICAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYG1lYXN1cmVtZW50X3R5cGVgIChpZDogMjApCisgICsweDM4IHwgNUMgMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgICB8IDB4MDA1QyAoOTIpICAgICAgICAgICAgICAgICAgfCBFUlJPUjogb2Zmc2V0IHRvIGZpZWxkIGBtZWFzdXJlbWVudGAgKGlkOiAyMSkuIEludmFsaWQgb2Zmc2V0LCBwb2ludHMgb3V0c2lkZSB0aGUgYmluYXJ5LgorICArMHgzQSB8IDBCIDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgfCAweDAwMEIgKDExKSAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBhbnl0aGluZ190eXBlYCAoaWQ6IDIyKQorICArMHgzQyB8IDYwIDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgfCAweDAwNjAgKDk2KSAgICAgICAgICAgICAgICAgIHwgRVJST1I6IG9mZnNldCB0byBmaWVsZCBgYW55dGhpbmdgIChpZDogMjMpLiBJbnZhbGlkIG9mZnNldCwgcG9pbnRzIG91dHNpZGUgdGhlIGJpbmFyeS4KKyAgKzB4M0UgfCAwMCAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgIHwgMHgwMDAwICgwKSAgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgdGVtcGVyYXR1cmVgIChpZDogMjQpIDxkZWZhdWx0cyB0byA5OC42MDAwMDA+IChGbG9hdCkKKyAgKzB4NDAgfCAwMCAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgIHwgMHgwMDAwICgwKSAgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgdGVldG90YWxlcmAgKGlkOiAyNSkgPG51bGw+IChPYmopCisgICsweDQyIHwgNjQgMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgICB8IDB4MDA2NCAoMTAwKSAgICAgICAgICAgICAgICAgfCBFUlJPUjogb2Zmc2V0IHRvIGZpZWxkIGBjaGFybGllYCAoaWQ6IDI2KS4gSW52YWxpZCBvZmZzZXQsIHBvaW50cyBvdXRzaWRlIHRoZSBiaW5hcnkuCisgICsweDI4IHwgMDAgMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgICB8IDB4MDAwMCAoMCkgICAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gdW5rbm93biBmaWVsZCAoaWQ6IDEzKQorICArMHgyQSB8IDAwIDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgfCAweDAwMDAgKDApICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIHVua25vd24gZmllbGQgKGlkOiAxNCkKKyAgKzB4MkMgfCA0OCAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgIHwgMHgwMDQ4ICg3MikgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byB1bmtub3duIGZpZWxkIChpZDogMTUpCisgICsweDJFIHwgNEMgMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgICB8IDB4MDA0QyAoNzYpICAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gdW5rbm93biBmaWVsZCAoaWQ6IDE2KQorICArMHgzMCB8IDUwIDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgfCAweDAwNTAgKDgwKSAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIHVua25vd24gZmllbGQgKGlkOiAxNykKKyAgKzB4MzIgfCA1NCAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgIHwgMHgwMDU0ICg4NCkgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byB1bmtub3duIGZpZWxkIChpZDogMTgpCisgICsweDM0IHwgNTggMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgICB8IDB4MDA1OCAoODgpICAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gdW5rbm93biBmaWVsZCAoaWQ6IDE5KQorICArMHgzNiB8IDBBIDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgfCAweDAwMEEgKDEwKSAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIHVua25vd24gZmllbGQgKGlkOiAyMCkKKyAgKzB4MzggfCA1QyAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgIHwgMHgwMDVDICg5MikgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byB1bmtub3duIGZpZWxkIChpZDogMjEpCisgICsweDNBIHwgMEIgMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgICB8IDB4MDAwQiAoMTEpICAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gdW5rbm93biBmaWVsZCAoaWQ6IDIyKQorICArMHgzQyB8IDYwIDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgfCAweDAwNjAgKDk2KSAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIHVua25vd24gZmllbGQgKGlkOiAyMykKKyAgKzB4M0UgfCAwMCAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgIHwgMHgwMDAwICgwKSAgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byB1bmtub3duIGZpZWxkIChpZDogMjQpCisgICsweDQwIHwgMDAgMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgICB8IDB4MDAwMCAoMCkgICAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gdW5rbm93biBmaWVsZCAoaWQ6IDI1KQorICArMHg0MiB8IDY0IDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgfCAweDAwNjQgKDEwMCkgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIHVua25vd24gZmllbGQgKGlkOiAyNikKKworcm9vdF90YWJsZSAoQW5ub3RhdGVkQmluYXJ5LkZvbyk6CisgICsweDQ0IHwgM0EgMDAgMDAgMDAgICAgICAgICAgICAgfCBTT2Zmc2V0MzIgICB8IDB4MDAwMDAwM0EgKDU4KSBMb2M6ICsweDBBICAgfCBvZmZzZXQgdG8gdnRhYmxlCisgICsweDQ4IHwgMDAgMDAgMDAgICAgICAgICAgICAgICAgfCB1aW50OF90WzNdICB8IC4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgfCBwYWRkaW5nCisgICsweDRCIHwgMDEgICAgICAgICAgICAgICAgICAgICAgfCB1aW50OF90ICAgICB8IDB4MDEgKDEpICAgICAgICAgICAgICAgICAgICAgfCB0YWJsZSBmaWVsZCBgaGVhbHRoeWAgKEJvb2wpCisgICsweDRDIHwgMDIgICAgICAgICAgICAgICAgICAgICAgfCB1aW50OF90ICAgICB8IDB4MDIgKDIpICAgICAgICAgICAgICAgICAgICAgfCB0YWJsZSBmaWVsZCBgbWVhbGAgKEJ5dGUpCisgICsweDREIHwgMDIgICAgICAgICAgICAgICAgICAgICAgfCBVVHlwZTggICAgICB8IDB4MDIgKDIpICAgICAgICAgICAgICAgICAgICAgfCB0YWJsZSBmaWVsZCBgYmFyX2Jhel90eXBlYCAoVVR5cGUpCisgICsweDRFIHwgMDEgICAgICAgICAgICAgICAgICAgICAgfCBVVHlwZTggICAgICB8IDB4MDEgKDEpICAgICAgICAgICAgICAgICAgICAgfCB0YWJsZSBmaWVsZCBgbWVhc3VyZW1lbnRfdHlwZWAgKFVUeXBlKQorICArMHg0RiB8IDAxICAgICAgICAgICAgICAgICAgICAgIHwgVVR5cGU4ICAgICAgfCAweDAxICgxKSAgICAgICAgICAgICAgICAgICAgIHwgdGFibGUgZmllbGQgYGFueXRoaW5nX3R5cGVgIChVVHlwZSkKKyAgKzB4NTAgfCBEMiAwNCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgIHwgMHgwMDAwMDREMiAoMTIzNCkgICAgICAgICAgICB8IHRhYmxlIGZpZWxkIGBjb3VudGVyYCAoSW50KQorICArMHg1NCB8IDI4IDAyIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMjI4ICg1NTIpIExvYzogKzB4MjdDIHwgRVJST1I6IG9mZnNldCB0byBmaWVsZCBgYmFyYC4gSW52YWxpZCBvZmZzZXQsIHBvaW50cyBvdXRzaWRlIHRoZSBiaW5hcnkuCisgICsweDU4IHwgMDEgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICB8IDB4MDAwMDAwMDEgKDEpICAgICAgICAgICAgICAgfCBzdHJ1Y3QgZmllbGQgYEFubm90YXRlZEJpbmFyeS5CdWlsZGluZy5mbG9vcnNgIChJbnQpCisgICsweDVDIHwgMDIgMDAgICAgICAgICAgICAgICAgICAgfCA/dWludDhfdFsyXSB8IC4uICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBFUlJPUjogc3RydWN0IGZpZWxkIGBBbm5vdGF0ZWRCaW5hcnkuQnVpbGRpbmcuZG9vcnNgIChJbnQpLiBJbmNvbXBsZXRlIGJpbmFyeSwgZXhwZWN0ZWQgdG8gcmVhZCA0IGJ5dGVzLgpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvYW5ub3RhdGVkX2JpbmFyeS90ZXN0cy9pbnZhbGlkX3N0cnVjdF9maWVsZF9jdXRfc2hvcnQuYmluIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvYW5ub3RhdGVkX2JpbmFyeS90ZXN0cy9pbnZhbGlkX3N0cnVjdF9maWVsZF9jdXRfc2hvcnQuYmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUzNzM1MmQKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9hbm5vdGF0ZWRfYmluYXJ5L3Rlc3RzL2ludmFsaWRfc3RydWN0X2ZpZWxkX2N1dF9zaG9ydC5iaW4KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvYW5ub3RhdGVkX2JpbmFyeS90ZXN0cy9pbnZhbGlkX3RhYmxlX2ZpZWxkX29mZnNldC5hZmIgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9hbm5vdGF0ZWRfYmluYXJ5L3Rlc3RzL2ludmFsaWRfdGFibGVfZmllbGRfb2Zmc2V0LmFmYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40Y2NkM2E3Ci0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvYW5ub3RhdGVkX2JpbmFyeS90ZXN0cy9pbnZhbGlkX3RhYmxlX2ZpZWxkX29mZnNldC5hZmIKQEAgLTAsMCArMSw3NyBAQAorLy8gQW5ub3RhdGVkIEZsYXRidWZmZXIgQmluYXJ5CisvLworLy8gU2NoZW1hIGZpbGU6IGFubm90YXRlZF9iaW5hcnkuZmJzCisvLyBCaW5hcnkgZmlsZTogdGVzdHMvaW52YWxpZF90YWJsZV9maWVsZF9vZmZzZXQuYmluCisKK2hlYWRlcjoKKyAgKzB4MDAgfCA0NCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDA0NCAoNjgpIExvYzogKzB4NDQgICB8IG9mZnNldCB0byByb290IHRhYmxlIGBBbm5vdGF0ZWRCaW5hcnkuRm9vYAorICArMHgwNCB8IDQxIDRFIDRFIDRGICAgICAgICAgICAgIHwgY2hhcls0XSAgICAgfCBBTk5PICAgICAgICAgICAgICAgICAgICAgICAgIHwgRmlsZSBJZGVudGlmaWVyCisKK3BhZGRpbmc6CisgICsweDA4IHwgMDAgMDAgICAgICAgICAgICAgICAgICAgfCB1aW50OF90WzJdICB8IC4uICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBwYWRkaW5nCisKK3Z0YWJsZSAoQW5ub3RhdGVkQmluYXJ5LkZvbyk6CisgICsweDBBIHwgM0EgMDAgICAgICAgICAgICAgICAgICAgfCB1aW50MTZfdCAgICB8IDB4MDAzQSAoNTgpICAgICAgICAgICAgICAgICAgfCBzaXplIG9mIHRoaXMgdnRhYmxlCisgICsweDBDIHwgNjggMDAgICAgICAgICAgICAgICAgICAgfCB1aW50MTZfdCAgICB8IDB4MDA2OCAoMTA0KSAgICAgICAgICAgICAgICAgfCBFUlJPUjogc2l6ZSBvZiByZWZlcnJpbmcgdGFibGUuIExvbmdlciB0aGFuIHRoZSBiaW5hcnkuCisgICsweDBFIHwgMEMgMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgICB8IDB4MDAwQyAoMTIpICAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYGNvdW50ZXJgIChpZDogMCkKKyAgKzB4MTAgfCAwNyAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgIHwgMHgwMDA3ICg3KSAgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgaGVhbHRoeWAgKGlkOiAxKQorICArMHgxMiB8IDAwIDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgfCAweDAwMDAgKDApICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBsZXZlbGAgKGlkOiAyKSA8ZGVmYXVsdHMgdG8gOTk+IChMb25nKQorICArMHgxNCB8IDA4IDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgfCAweDAwMDggKDgpICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBtZWFsYCAoaWQ6IDMpCisgICsweDE2IHwgMTAgMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgICB8IDB4MDAxMCAoMTYpICAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYGJhcmAgKGlkOiA0KQorICArMHgxOCB8IDE0IDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgfCAweDAwMTQgKDIwKSAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBob21lYCAoaWQ6IDUpCisgICsweDFBIHwgMzAgMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgICB8IDB4MDAzMCAoNDgpICAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYG5hbWVgIChpZDogNikKKyAgKzB4MUMgfCAzNCAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgIHwgMHgwMDM0ICg1MikgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgYmFyc2AgKGlkOiA3KQorICArMHgxRSB8IDA5IDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgfCAweDAwMDkgKDkpICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBiYXJfYmF6X3R5cGVgIChpZDogOCkKKyAgKzB4MjAgfCAzOCAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgIHwgMHgwMDM4ICg1NikgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgYmFyX2JhemAgKGlkOiA5KQorICArMHgyMiB8IDNDIDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgfCAweDAwM0MgKDYwKSAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBhY2NvdW50c2AgKGlkOiAxMCkKKyAgKzB4MjQgfCA0MCAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgIHwgMHgwMDQwICg2NCkgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgYm9iYCAoaWQ6IDExKQorICArMHgyNiB8IDQ0IDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgfCAweDAwNDQgKDY4KSAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBhbGljZWAgKGlkOiAxMikKKyAgKzB4MjggfCAwMCAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgIHwgMHgwMDAwICgwKSAgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgbWF5YmVfaTMyYCAoaWQ6IDEzKSA8ZGVmYXVsdHMgdG8gMD4gKEludCkKKyAgKzB4MkEgfCAwMCAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgIHwgMHgwMDAwICgwKSAgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgZGVmYXVsdF9pMzJgIChpZDogMTQpIDxkZWZhdWx0cyB0byA0Mj4gKEludCkKKyAgKzB4MkMgfCA0OCAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgIHwgMHgwMDQ4ICg3MikgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBganVzdF9pMzJgIChpZDogMTUpCisgICsweDJFIHwgNEMgMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgICB8IDB4MDA0QyAoNzYpICAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYG5hbWVzYCAoaWQ6IDE2KQorICArMHgzMCB8IDUwIDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgfCAweDAwNTAgKDgwKSAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBwb2ludHNfb2ZfaW50ZXJlc3RgIChpZDogMTcpCisgICsweDMyIHwgNTQgMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgICB8IDB4MDA1NCAoODQpICAgICAgICAgICAgICAgICAgfCBFUlJPUjogb2Zmc2V0IHRvIGZpZWxkIGBmb29iYXJzX3R5cGVgIChpZDogMTgpLiBJbnZhbGlkIG9mZnNldCwgcG9pbnRzIG91dHNpZGUgdGhlIGJpbmFyeS4KKyAgKzB4MzQgfCA1OCAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgIHwgMHgwMDU4ICg4OCkgICAgICAgICAgICAgICAgICB8IEVSUk9SOiBvZmZzZXQgdG8gZmllbGQgYGZvb2JhcnNgIChpZDogMTkpLiBJbnZhbGlkIG9mZnNldCwgcG9pbnRzIG91dHNpZGUgdGhlIGJpbmFyeS4KKyAgKzB4MzYgfCAwQSAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgIHwgMHgwMDBBICgxMCkgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgbWVhc3VyZW1lbnRfdHlwZWAgKGlkOiAyMCkKKyAgKzB4MzggfCA1QyAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgIHwgMHgwMDVDICg5MikgICAgICAgICAgICAgICAgICB8IEVSUk9SOiBvZmZzZXQgdG8gZmllbGQgYG1lYXN1cmVtZW50YCAoaWQ6IDIxKS4gSW52YWxpZCBvZmZzZXQsIHBvaW50cyBvdXRzaWRlIHRoZSBiaW5hcnkuCisgICsweDNBIHwgMEIgMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgICB8IDB4MDAwQiAoMTEpICAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYGFueXRoaW5nX3R5cGVgIChpZDogMjIpCisgICsweDNDIHwgNjAgMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgICB8IDB4MDA2MCAoOTYpICAgICAgICAgICAgICAgICAgfCBFUlJPUjogb2Zmc2V0IHRvIGZpZWxkIGBhbnl0aGluZ2AgKGlkOiAyMykuIEludmFsaWQgb2Zmc2V0LCBwb2ludHMgb3V0c2lkZSB0aGUgYmluYXJ5LgorICArMHgzRSB8IDAwIDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgfCAweDAwMDAgKDApICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGB0ZW1wZXJhdHVyZWAgKGlkOiAyNCkgPGRlZmF1bHRzIHRvIDk4LjYwMDAwMD4gKEZsb2F0KQorICArMHg0MCB8IDAwIDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgfCAweDAwMDAgKDApICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGB0ZWV0b3RhbGVyYCAoaWQ6IDI1KSA8bnVsbD4gKE9iaikKKyAgKzB4NDIgfCA2NCAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgIHwgMHgwMDY0ICgxMDApICAgICAgICAgICAgICAgICB8IEVSUk9SOiBvZmZzZXQgdG8gZmllbGQgYGNoYXJsaWVgIChpZDogMjYpLiBJbnZhbGlkIG9mZnNldCwgcG9pbnRzIG91dHNpZGUgdGhlIGJpbmFyeS4KKyAgKzB4M0EgfCAwQiAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgIHwgMHgwMDBCICgxMSkgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byB1bmtub3duIGZpZWxkIChpZDogMjIpCisgICsweDNDIHwgNjAgMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgICB8IDB4MDA2MCAoOTYpICAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gdW5rbm93biBmaWVsZCAoaWQ6IDIzKQorICArMHgzRSB8IDAwIDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgfCAweDAwMDAgKDApICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIHVua25vd24gZmllbGQgKGlkOiAyNCkKKyAgKzB4NDAgfCAwMCAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgIHwgMHgwMDAwICgwKSAgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byB1bmtub3duIGZpZWxkIChpZDogMjUpCisgICsweDQyIHwgNjQgMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgICB8IDB4MDA2NCAoMTAwKSAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gdW5rbm93biBmaWVsZCAoaWQ6IDI2KQorCityb290X3RhYmxlIChBbm5vdGF0ZWRCaW5hcnkuRm9vKToKKyAgKzB4NDQgfCAzQSAwMCAwMCAwMCAgICAgICAgICAgICB8IFNPZmZzZXQzMiAgIHwgMHgwMDAwMDAzQSAoNTgpIExvYzogKzB4MEEgICB8IG9mZnNldCB0byB2dGFibGUKKyAgKzB4NDggfCAwMCAwMCAwMCAgICAgICAgICAgICAgICB8IHVpbnQ4X3RbM10gIHwgLi4uICAgICAgICAgICAgICAgICAgICAgICAgICB8IHBhZGRpbmcKKyAgKzB4NEIgfCAwMSAgICAgICAgICAgICAgICAgICAgICB8IHVpbnQ4X3QgICAgIHwgMHgwMSAoMSkgICAgICAgICAgICAgICAgICAgICB8IHRhYmxlIGZpZWxkIGBoZWFsdGh5YCAoQm9vbCkKKyAgKzB4NEMgfCAwMiAgICAgICAgICAgICAgICAgICAgICB8IHVpbnQ4X3QgICAgIHwgMHgwMiAoMikgICAgICAgICAgICAgICAgICAgICB8IHRhYmxlIGZpZWxkIGBtZWFsYCAoQnl0ZSkKKyAgKzB4NEQgfCAwMiAgICAgICAgICAgICAgICAgICAgICB8IFVUeXBlOCAgICAgIHwgMHgwMiAoMikgICAgICAgICAgICAgICAgICAgICB8IHRhYmxlIGZpZWxkIGBiYXJfYmF6X3R5cGVgIChVVHlwZSkKKyAgKzB4NEUgfCAwMSAgICAgICAgICAgICAgICAgICAgICB8IFVUeXBlOCAgICAgIHwgMHgwMSAoMSkgICAgICAgICAgICAgICAgICAgICB8IHRhYmxlIGZpZWxkIGBtZWFzdXJlbWVudF90eXBlYCAoVVR5cGUpCisgICsweDRGIHwgMDEgICAgICAgICAgICAgICAgICAgICAgfCBVVHlwZTggICAgICB8IDB4MDEgKDEpICAgICAgICAgICAgICAgICAgICAgfCB0YWJsZSBmaWVsZCBgYW55dGhpbmdfdHlwZWAgKFVUeXBlKQorICArMHg1MCB8IEQyIDA0IDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgfCAweDAwMDAwNEQyICgxMjM0KSAgICAgICAgICAgIHwgdGFibGUgZmllbGQgYGNvdW50ZXJgIChJbnQpCisgICsweDU0IHwgMjggMDIgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDAyMjggKDU1MikgTG9jOiArMHgyN0MgfCBFUlJPUjogb2Zmc2V0IHRvIGZpZWxkIGBiYXJgLiBJbnZhbGlkIG9mZnNldCwgcG9pbnRzIG91dHNpZGUgdGhlIGJpbmFyeS4KKyAgKzB4NTggfCAwMSAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgIHwgMHgwMDAwMDAwMSAoMSkgICAgICAgICAgICAgICB8IHN0cnVjdCBmaWVsZCBgQW5ub3RhdGVkQmluYXJ5LkJ1aWxkaW5nLmZsb29yc2AgKEludCkKKyAgKzB4NUMgfCAwMiAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgIHwgMHgwMDAwMDAwMiAoMikgICAgICAgICAgICAgICB8IHN0cnVjdCBmaWVsZCBgQW5ub3RhdGVkQmluYXJ5LkJ1aWxkaW5nLmRvb3JzYCAoSW50KQorICArMHg2MCB8IDBDIDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgfCAweDAwMDAwMDBDICgxMikgICAgICAgICAgICAgIHwgc3RydWN0IGZpZWxkIGBBbm5vdGF0ZWRCaW5hcnkuQnVpbGRpbmcud2luZG93c2AgKEludCkKKyAgKzB4NjQgfCAwQSAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgIHwgMHgwMDAwMDAwQSAoMTApICAgICAgICAgICAgICB8IGFycmF5IGZpZWxkIGBBbm5vdGF0ZWRCaW5hcnkuRGltZW5zaW9uLnZhbHVlc2BbMF0gKEludCkKKyAgKzB4NjggfCAwQyAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgIHwgMHgwMDAwMDAwQyAoMTIpICAgICAgICAgICAgICB8IGFycmF5IGZpZWxkIGBBbm5vdGF0ZWRCaW5hcnkuRGltZW5zaW9uLnZhbHVlc2BbMV0gKEludCkKKyAgKzB4NkMgfCAxNCAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgIHwgMHgwMDAwMDAxNCAoMjApICAgICAgICAgICAgICB8IGFycmF5IGZpZWxkIGBBbm5vdGF0ZWRCaW5hcnkuRGltZW5zaW9uLnZhbHVlc2BbMl0gKEludCkKKyAgKzB4NzAgfCAwMSAgICAgICAgICAgICAgICAgICAgICB8IHVpbnQ4X3QgICAgIHwgMHgwMSAoMSkgICAgICAgICAgICAgICAgICAgICB8IHN0cnVjdCBmaWVsZCBgQW5ub3RhdGVkQmluYXJ5LlRvbGVyYW5jZS53aWR0aGAgKFVCeXRlKQorICArMHg3MSB8IDAyICAgICAgICAgICAgICAgICAgICAgIHwgdWludDhfdCAgICAgfCAweDAyICgyKSAgICAgICAgICAgICAgICAgICAgIHwgc3RydWN0IGZpZWxkIGBBbm5vdGF0ZWRCaW5hcnkuVG9sZXJhbmNlLndpZHRoYCAoVUJ5dGUpCisgICsweDcyIHwgMDMgICAgICAgICAgICAgICAgICAgICAgfCB1aW50OF90ICAgICB8IDB4MDMgKDMpICAgICAgICAgICAgICAgICAgICAgfCBzdHJ1Y3QgZmllbGQgYEFubm90YXRlZEJpbmFyeS5Ub2xlcmFuY2Uud2lkdGhgIChVQnl0ZSkKKyAgKzB4NzMgfCAwMCAgICAgICAgICAgICAgICAgICAgICB8IHVpbnQ4X3RbMV0gIHwgLiAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHBhZGRpbmcKKyAgKzB4NzQgfCBDOCAwMSAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDFDOCAoNDU2KSBMb2M6ICsweDIzQyB8IEVSUk9SOiBvZmZzZXQgdG8gZmllbGQgYG5hbWVgLiBJbnZhbGlkIG9mZnNldCwgcG9pbnRzIG91dHNpZGUgdGhlIGJpbmFyeS4KKyAgKzB4NzggfCA1QyAwMSAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDE1QyAoMzQ4KSBMb2M6ICsweDFENCB8IEVSUk9SOiBvZmZzZXQgdG8gZmllbGQgYGJhcnNgLiBJbnZhbGlkIG9mZnNldCwgcG9pbnRzIG91dHNpZGUgdGhlIGJpbmFyeS4KKyAgKzB4N0MgfCA1MCAwMSAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDE1MCAoMzM2KSBMb2M6ICsweDFDQyB8IEVSUk9SOiBvZmZzZXQgdG8gZmllbGQgYGJhcl9iYXpgLiBJbnZhbGlkIG9mZnNldCwgcG9pbnRzIG91dHNpZGUgdGhlIGJpbmFyeS4KKyAgKzB4ODAgfCAzNCAwMSAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDEzNCAoMzA4KSBMb2M6ICsweDFCNCB8IEVSUk9SOiBvZmZzZXQgdG8gZmllbGQgYGFjY291bnRzYC4gSW52YWxpZCBvZmZzZXQsIHBvaW50cyBvdXRzaWRlIHRoZSBiaW5hcnkuCisgICsweDg0IHwgMjQgMDEgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDAxMjQgKDI5MikgTG9jOiArMHgxQTggfCBFUlJPUjogb2Zmc2V0IHRvIGZpZWxkIGBib2JgLiBJbnZhbGlkIG9mZnNldCwgcG9pbnRzIG91dHNpZGUgdGhlIGJpbmFyeS4KKyAgKzB4ODggfCAxNCAwMSAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDExNCAoMjc2KSBMb2M6ICsweDE5QyB8IEVSUk9SOiBvZmZzZXQgdG8gZmllbGQgYGFsaWNlYC4gSW52YWxpZCBvZmZzZXQsIHBvaW50cyBvdXRzaWRlIHRoZSBiaW5hcnkuCisgICsweDhDIHwgMEQgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICB8IDB4MDAwMDAwMEQgKDEzKSAgICAgICAgICAgICAgfCB0YWJsZSBmaWVsZCBganVzdF9pMzJgIChJbnQpCisgICsweDkwIHwgREMgMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDAwREMgKDIyMCkgTG9jOiArMHgxNkMgfCBFUlJPUjogb2Zmc2V0IHRvIGZpZWxkIGBuYW1lc2AuIEludmFsaWQgb2Zmc2V0LCBwb2ludHMgb3V0c2lkZSB0aGUgYmluYXJ5LgorICArMHg5NCB8IEEwIDAwICAgICAgICAgICAgICAgICAgIHwgP3VpbnQ4X3RbMl0gfCAuLiAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgRVJST1I6IG9mZnNldCB0byBmaWVsZCBgcG9pbnRzX29mX2ludGVyZXN0YC4gSW5jb21wbGV0ZSBiaW5hcnksIGV4cGVjdGVkIHRvIHJlYWQgNCBieXRlcy4KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL2Fubm90YXRlZF9iaW5hcnkvdGVzdHMvaW52YWxpZF90YWJsZV9maWVsZF9vZmZzZXQuYmluIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvYW5ub3RhdGVkX2JpbmFyeS90ZXN0cy9pbnZhbGlkX3RhYmxlX2ZpZWxkX29mZnNldC5iaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjNhNzllZAotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL2Fubm90YXRlZF9iaW5hcnkvdGVzdHMvaW52YWxpZF90YWJsZV9maWVsZF9vZmZzZXQuYmluCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL2Fubm90YXRlZF9iaW5hcnkvdGVzdHMvaW52YWxpZF90YWJsZV9maWVsZF9zaXplLmFmYiBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL2Fubm90YXRlZF9iaW5hcnkvdGVzdHMvaW52YWxpZF90YWJsZV9maWVsZF9zaXplLmFmYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mM2NhM2I5Ci0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvYW5ub3RhdGVkX2JpbmFyeS90ZXN0cy9pbnZhbGlkX3RhYmxlX2ZpZWxkX3NpemUuYWZiCkBAIC0wLDAgKzEsNjggQEAKKy8vIEFubm90YXRlZCBGbGF0YnVmZmVyIEJpbmFyeQorLy8KKy8vIFNjaGVtYSBmaWxlOiBhbm5vdGF0ZWRfYmluYXJ5LmZicworLy8gQmluYXJ5IGZpbGU6IHRlc3RzL2ludmFsaWRfdGFibGVfZmllbGRfc2l6ZS5iaW4KKworaGVhZGVyOgorICArMHgwMCB8IDQ0IDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMDQ0ICg2OCkgTG9jOiArMHg0NCB8IG9mZnNldCB0byByb290IHRhYmxlIGBBbm5vdGF0ZWRCaW5hcnkuRm9vYAorICArMHgwNCB8IDQxIDRFIDRFIDRGICAgICAgICAgICAgIHwgY2hhcls0XSAgICAgfCBBTk5PICAgICAgICAgICAgICAgICAgICAgICB8IEZpbGUgSWRlbnRpZmllcgorCitwYWRkaW5nOgorICArMHgwOCB8IDAwIDAwICAgICAgICAgICAgICAgICAgIHwgdWludDhfdFsyXSAgfCAuLiAgICAgICAgICAgICAgICAgICAgICAgICB8IHBhZGRpbmcKKwordnRhYmxlIChBbm5vdGF0ZWRCaW5hcnkuRm9vKToKKyAgKzB4MEEgfCAzQSAwMCAgICAgICAgICAgICAgICAgICB8IHVpbnQxNl90ICAgIHwgMHgwMDNBICg1OCkgICAgICAgICAgICAgICAgfCBzaXplIG9mIHRoaXMgdnRhYmxlCisgICsweDBDIHwgNjggMDAgICAgICAgICAgICAgICAgICAgfCB1aW50MTZfdCAgICB8IDB4MDA2OCAoMTA0KSAgICAgICAgICAgICAgIHwgRVJST1I6IHNpemUgb2YgcmVmZXJyaW5nIHRhYmxlLiBMb25nZXIgdGhhbiB0aGUgYmluYXJ5LgorICArMHgwRSB8IDBDIDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgfCAweDAwMEMgKDEyKSAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgY291bnRlcmAgKGlkOiAwKQorICArMHgxMCB8IDA3IDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgfCAweDAwMDcgKDcpICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgaGVhbHRoeWAgKGlkOiAxKQorICArMHgxMiB8IDAwIDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgfCAweDAwMDAgKDApICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgbGV2ZWxgIChpZDogMikgPGRlZmF1bHRzIHRvIDk5PiAoTG9uZykKKyAgKzB4MTQgfCAwOCAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgIHwgMHgwMDA4ICg4KSAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYG1lYWxgIChpZDogMykKKyAgKzB4MTYgfCAxMCAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgIHwgMHgwMDEwICgxNikgICAgICAgICAgICAgICAgfCBFUlJPUjogb2Zmc2V0IHRvIGZpZWxkIGBiYXJgIChpZDogNCkuIEludmFsaWQgb2Zmc2V0LCBwb2ludHMgb3V0c2lkZSB0aGUgYmluYXJ5LgorICArMHgxOCB8IDE0IDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgfCAweDAwMTQgKDIwKSAgICAgICAgICAgICAgICB8IEVSUk9SOiBvZmZzZXQgdG8gZmllbGQgYGhvbWVgIChpZDogNSkuIEludmFsaWQgb2Zmc2V0LCBwb2ludHMgb3V0c2lkZSB0aGUgYmluYXJ5LgorICArMHgxQSB8IDMwIDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgfCAweDAwMzAgKDQ4KSAgICAgICAgICAgICAgICB8IEVSUk9SOiBvZmZzZXQgdG8gZmllbGQgYG5hbWVgIChpZDogNikuIEludmFsaWQgb2Zmc2V0LCBwb2ludHMgb3V0c2lkZSB0aGUgYmluYXJ5LgorICArMHgxQyB8IDM0IDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgfCAweDAwMzQgKDUyKSAgICAgICAgICAgICAgICB8IEVSUk9SOiBvZmZzZXQgdG8gZmllbGQgYGJhcnNgIChpZDogNykuIEludmFsaWQgb2Zmc2V0LCBwb2ludHMgb3V0c2lkZSB0aGUgYmluYXJ5LgorICArMHgxRSB8IDA5IDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgfCAweDAwMDkgKDkpICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgYmFyX2Jhel90eXBlYCAoaWQ6IDgpCisgICsweDIwIHwgMzggMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgICB8IDB4MDAzOCAoNTYpICAgICAgICAgICAgICAgIHwgRVJST1I6IG9mZnNldCB0byBmaWVsZCBgYmFyX2JhemAgKGlkOiA5KS4gSW52YWxpZCBvZmZzZXQsIHBvaW50cyBvdXRzaWRlIHRoZSBiaW5hcnkuCisgICsweDIyIHwgM0MgMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgICB8IDB4MDAzQyAoNjApICAgICAgICAgICAgICAgIHwgRVJST1I6IG9mZnNldCB0byBmaWVsZCBgYWNjb3VudHNgIChpZDogMTApLiBJbnZhbGlkIG9mZnNldCwgcG9pbnRzIG91dHNpZGUgdGhlIGJpbmFyeS4KKyAgKzB4MjQgfCA0MCAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgIHwgMHgwMDQwICg2NCkgICAgICAgICAgICAgICAgfCBFUlJPUjogb2Zmc2V0IHRvIGZpZWxkIGBib2JgIChpZDogMTEpLiBJbnZhbGlkIG9mZnNldCwgcG9pbnRzIG91dHNpZGUgdGhlIGJpbmFyeS4KKyAgKzB4MjYgfCA0NCAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgIHwgMHgwMDQ0ICg2OCkgICAgICAgICAgICAgICAgfCBFUlJPUjogb2Zmc2V0IHRvIGZpZWxkIGBhbGljZWAgKGlkOiAxMikuIEludmFsaWQgb2Zmc2V0LCBwb2ludHMgb3V0c2lkZSB0aGUgYmluYXJ5LgorICArMHgyOCB8IDAwIDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgfCAweDAwMDAgKDApICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgbWF5YmVfaTMyYCAoaWQ6IDEzKSA8ZGVmYXVsdHMgdG8gMD4gKEludCkKKyAgKzB4MkEgfCAwMCAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgIHwgMHgwMDAwICgwKSAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYGRlZmF1bHRfaTMyYCAoaWQ6IDE0KSA8ZGVmYXVsdHMgdG8gNDI+IChJbnQpCisgICsweDJDIHwgNDggMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgICB8IDB4MDA0OCAoNzIpICAgICAgICAgICAgICAgIHwgRVJST1I6IG9mZnNldCB0byBmaWVsZCBganVzdF9pMzJgIChpZDogMTUpLiBJbnZhbGlkIG9mZnNldCwgcG9pbnRzIG91dHNpZGUgdGhlIGJpbmFyeS4KKyAgKzB4MkUgfCA0QyAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgIHwgMHgwMDRDICg3NikgICAgICAgICAgICAgICAgfCBFUlJPUjogb2Zmc2V0IHRvIGZpZWxkIGBuYW1lc2AgKGlkOiAxNikuIEludmFsaWQgb2Zmc2V0LCBwb2ludHMgb3V0c2lkZSB0aGUgYmluYXJ5LgorICArMHgzMCB8IDUwIDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgfCAweDAwNTAgKDgwKSAgICAgICAgICAgICAgICB8IEVSUk9SOiBvZmZzZXQgdG8gZmllbGQgYHBvaW50c19vZl9pbnRlcmVzdGAgKGlkOiAxNykuIEludmFsaWQgb2Zmc2V0LCBwb2ludHMgb3V0c2lkZSB0aGUgYmluYXJ5LgorICArMHgzMiB8IDU0IDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgfCAweDAwNTQgKDg0KSAgICAgICAgICAgICAgICB8IEVSUk9SOiBvZmZzZXQgdG8gZmllbGQgYGZvb2JhcnNfdHlwZWAgKGlkOiAxOCkuIEludmFsaWQgb2Zmc2V0LCBwb2ludHMgb3V0c2lkZSB0aGUgYmluYXJ5LgorICArMHgzNCB8IDU4IDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgfCAweDAwNTggKDg4KSAgICAgICAgICAgICAgICB8IEVSUk9SOiBvZmZzZXQgdG8gZmllbGQgYGZvb2JhcnNgIChpZDogMTkpLiBJbnZhbGlkIG9mZnNldCwgcG9pbnRzIG91dHNpZGUgdGhlIGJpbmFyeS4KKyAgKzB4MzYgfCAwQSAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgIHwgMHgwMDBBICgxMCkgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYG1lYXN1cmVtZW50X3R5cGVgIChpZDogMjApCisgICsweDM4IHwgNUMgMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgICB8IDB4MDA1QyAoOTIpICAgICAgICAgICAgICAgIHwgRVJST1I6IG9mZnNldCB0byBmaWVsZCBgbWVhc3VyZW1lbnRgIChpZDogMjEpLiBJbnZhbGlkIG9mZnNldCwgcG9pbnRzIG91dHNpZGUgdGhlIGJpbmFyeS4KKyAgKzB4M0EgfCAwQiAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgIHwgMHgwMDBCICgxMSkgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYGFueXRoaW5nX3R5cGVgIChpZDogMjIpCisgICsweDNDIHwgNjAgMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgICB8IDB4MDA2MCAoOTYpICAgICAgICAgICAgICAgIHwgRVJST1I6IG9mZnNldCB0byBmaWVsZCBgYW55dGhpbmdgIChpZDogMjMpLiBJbnZhbGlkIG9mZnNldCwgcG9pbnRzIG91dHNpZGUgdGhlIGJpbmFyeS4KKyAgKzB4M0UgfCAwMCAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgIHwgMHgwMDAwICgwKSAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYHRlbXBlcmF0dXJlYCAoaWQ6IDI0KSA8ZGVmYXVsdHMgdG8gOTguNjAwMDAwPiAoRmxvYXQpCisgICsweDQwIHwgMDAgMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgICB8IDB4MDAwMCAoMCkgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGB0ZWV0b3RhbGVyYCAoaWQ6IDI1KSA8bnVsbD4gKE9iaikKKyAgKzB4NDIgfCA2NCAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgIHwgMHgwMDY0ICgxMDApICAgICAgICAgICAgICAgfCBFUlJPUjogb2Zmc2V0IHRvIGZpZWxkIGBjaGFybGllYCAoaWQ6IDI2KS4gSW52YWxpZCBvZmZzZXQsIHBvaW50cyBvdXRzaWRlIHRoZSBiaW5hcnkuCisgICsweDI0IHwgNDAgMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgICB8IDB4MDA0MCAoNjQpICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIHVua25vd24gZmllbGQgKGlkOiAxMSkKKyAgKzB4MjYgfCA0NCAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgIHwgMHgwMDQ0ICg2OCkgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gdW5rbm93biBmaWVsZCAoaWQ6IDEyKQorICArMHgyOCB8IDAwIDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgfCAweDAwMDAgKDApICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byB1bmtub3duIGZpZWxkIChpZDogMTMpCisgICsweDJBIHwgMDAgMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgICB8IDB4MDAwMCAoMCkgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIHVua25vd24gZmllbGQgKGlkOiAxNCkKKyAgKzB4MkMgfCA0OCAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgIHwgMHgwMDQ4ICg3MikgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gdW5rbm93biBmaWVsZCAoaWQ6IDE1KQorICArMHgyRSB8IDRDIDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgfCAweDAwNEMgKDc2KSAgICAgICAgICAgICAgICB8IG9mZnNldCB0byB1bmtub3duIGZpZWxkIChpZDogMTYpCisgICsweDMwIHwgNTAgMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgICB8IDB4MDA1MCAoODApICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIHVua25vd24gZmllbGQgKGlkOiAxNykKKyAgKzB4MzIgfCA1NCAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgIHwgMHgwMDU0ICg4NCkgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gdW5rbm93biBmaWVsZCAoaWQ6IDE4KQorICArMHgzNCB8IDU4IDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgfCAweDAwNTggKDg4KSAgICAgICAgICAgICAgICB8IG9mZnNldCB0byB1bmtub3duIGZpZWxkIChpZDogMTkpCisgICsweDM2IHwgMEEgMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgICB8IDB4MDAwQSAoMTApICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIHVua25vd24gZmllbGQgKGlkOiAyMCkKKyAgKzB4MzggfCA1QyAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgIHwgMHgwMDVDICg5MikgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gdW5rbm93biBmaWVsZCAoaWQ6IDIxKQorICArMHgzQSB8IDBCIDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgfCAweDAwMEIgKDExKSAgICAgICAgICAgICAgICB8IG9mZnNldCB0byB1bmtub3duIGZpZWxkIChpZDogMjIpCisgICsweDNDIHwgNjAgMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgICB8IDB4MDA2MCAoOTYpICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIHVua25vd24gZmllbGQgKGlkOiAyMykKKyAgKzB4M0UgfCAwMCAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgIHwgMHgwMDAwICgwKSAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gdW5rbm93biBmaWVsZCAoaWQ6IDI0KQorICArMHg0MCB8IDAwIDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgfCAweDAwMDAgKDApICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byB1bmtub3duIGZpZWxkIChpZDogMjUpCisgICsweDQyIHwgNjQgMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgICB8IDB4MDA2NCAoMTAwKSAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIHVua25vd24gZmllbGQgKGlkOiAyNikKKworcm9vdF90YWJsZSAoQW5ub3RhdGVkQmluYXJ5LkZvbyk6CisgICsweDQ0IHwgM0EgMDAgMDAgMDAgICAgICAgICAgICAgfCBTT2Zmc2V0MzIgICB8IDB4MDAwMDAwM0EgKDU4KSBMb2M6ICsweDBBIHwgb2Zmc2V0IHRvIHZ0YWJsZQorICArMHg0OCB8IDAwIDAwIDAwICAgICAgICAgICAgICAgIHwgdWludDhfdFszXSAgfCAuLi4gICAgICAgICAgICAgICAgICAgICAgICB8IHBhZGRpbmcKKyAgKzB4NEIgfCAwMSAgICAgICAgICAgICAgICAgICAgICB8IHVpbnQ4X3QgICAgIHwgMHgwMSAoMSkgICAgICAgICAgICAgICAgICAgfCB0YWJsZSBmaWVsZCBgaGVhbHRoeWAgKEJvb2wpCisgICsweDRDIHwgMDIgICAgICAgICAgICAgICAgICAgICAgfCB1aW50OF90ICAgICB8IDB4MDIgKDIpICAgICAgICAgICAgICAgICAgIHwgdGFibGUgZmllbGQgYG1lYWxgIChCeXRlKQorICArMHg0RCB8IDAyICAgICAgICAgICAgICAgICAgICAgIHwgVVR5cGU4ICAgICAgfCAweDAyICgyKSAgICAgICAgICAgICAgICAgICB8IHRhYmxlIGZpZWxkIGBiYXJfYmF6X3R5cGVgIChVVHlwZSkKKyAgKzB4NEUgfCAwMSAgICAgICAgICAgICAgICAgICAgICB8IFVUeXBlOCAgICAgIHwgMHgwMSAoMSkgICAgICAgICAgICAgICAgICAgfCB0YWJsZSBmaWVsZCBgbWVhc3VyZW1lbnRfdHlwZWAgKFVUeXBlKQorICArMHg0RiB8IDAxICAgICAgICAgICAgICAgICAgICAgIHwgVVR5cGU4ICAgICAgfCAweDAxICgxKSAgICAgICAgICAgICAgICAgICB8IHRhYmxlIGZpZWxkIGBhbnl0aGluZ190eXBlYCAoVVR5cGUpCisgICsweDUwIHwgRDIgMDQgICAgICAgICAgICAgICAgICAgfCA/dWludDhfdFsyXSB8IC4uICAgICAgICAgICAgICAgICAgICAgICAgIHwgRVJST1I6IHRhYmxlIGZpZWxkIGBjb3VudGVyYCAoSW50KS4gSW5jb21wbGV0ZSBiaW5hcnksIGV4cGVjdGVkIHRvIHJlYWQgNCBieXRlcy4KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL2Fubm90YXRlZF9iaW5hcnkvdGVzdHMvaW52YWxpZF90YWJsZV9maWVsZF9zaXplLmJpbiBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL2Fubm90YXRlZF9iaW5hcnkvdGVzdHMvaW52YWxpZF90YWJsZV9maWVsZF9zaXplLmJpbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZmJiYmRmCi0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvYW5ub3RhdGVkX2JpbmFyeS90ZXN0cy9pbnZhbGlkX3RhYmxlX2ZpZWxkX3NpemUuYmluCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL2Fubm90YXRlZF9iaW5hcnkvdGVzdHMvaW52YWxpZF91bmlvbl90eXBlX3ZhbHVlLmFmYiBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL2Fubm90YXRlZF9iaW5hcnkvdGVzdHMvaW52YWxpZF91bmlvbl90eXBlX3ZhbHVlLmFmYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZTYzODUyCi0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvYW5ub3RhdGVkX2JpbmFyeS90ZXN0cy9pbnZhbGlkX3VuaW9uX3R5cGVfdmFsdWUuYWZiCkBAIC0wLDAgKzEsMjkzIEBACisvLyBBbm5vdGF0ZWQgRmxhdGJ1ZmZlciBCaW5hcnkKKy8vCisvLyBTY2hlbWEgZmlsZTogYW5ub3RhdGVkX2JpbmFyeS5mYnMKKy8vIEJpbmFyeSBmaWxlOiB0ZXN0cy9pbnZhbGlkX3VuaW9uX3R5cGVfdmFsdWUuYmluCisKK2hlYWRlcjoKKyAgKzB4MDAwMCB8IDQ0IDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgIHwgMHgwMDAwMDA0NCAoNjgpIExvYzogKzB4MDA0NCAgIHwgb2Zmc2V0IHRvIHJvb3QgdGFibGUgYEFubm90YXRlZEJpbmFyeS5Gb29gCisgICsweDAwMDQgfCA0MSA0RSA0RSA0RiAgICAgICAgICAgICB8IGNoYXJbNF0gICAgICB8IEFOTk8gICAgICAgICAgICAgICAgICAgICAgICAgICB8IEZpbGUgSWRlbnRpZmllcgorCitwYWRkaW5nOgorICArMHgwMDA4IHwgMDAgMDAgICAgICAgICAgICAgICAgICAgfCB1aW50OF90WzJdICAgfCAuLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBwYWRkaW5nCisKK3Z0YWJsZSAoQW5ub3RhdGVkQmluYXJ5LkZvbyk6CisgICsweDAwMEEgfCAzQSAwMCAgICAgICAgICAgICAgICAgICB8IHVpbnQxNl90ICAgICB8IDB4MDAzQSAoNTgpICAgICAgICAgICAgICAgICAgICB8IHNpemUgb2YgdGhpcyB2dGFibGUKKyAgKzB4MDAwQyB8IDY4IDAwICAgICAgICAgICAgICAgICAgIHwgdWludDE2X3QgICAgIHwgMHgwMDY4ICgxMDQpICAgICAgICAgICAgICAgICAgIHwgc2l6ZSBvZiByZWZlcnJpbmcgdGFibGUKKyAgKzB4MDAwRSB8IDBDIDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgIHwgMHgwMDBDICgxMikgICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBjb3VudGVyYCAoaWQ6IDApCisgICsweDAwMTAgfCAwNyAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgICB8IDB4MDAwNyAoNykgICAgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgaGVhbHRoeWAgKGlkOiAxKQorICArMHgwMDEyIHwgMDAgMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgICAgfCAweDAwMDAgKDApICAgICAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYGxldmVsYCAoaWQ6IDIpIDxkZWZhdWx0cyB0byA5OT4gKExvbmcpCisgICsweDAwMTQgfCAwOCAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgICB8IDB4MDAwOCAoOCkgICAgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgbWVhbGAgKGlkOiAzKQorICArMHgwMDE2IHwgMTAgMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgICAgfCAweDAwMTAgKDE2KSAgICAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYGJhcmAgKGlkOiA0KQorICArMHgwMDE4IHwgMTQgMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgICAgfCAweDAwMTQgKDIwKSAgICAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYGhvbWVgIChpZDogNSkKKyAgKzB4MDAxQSB8IDMwIDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgIHwgMHgwMDMwICg0OCkgICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBuYW1lYCAoaWQ6IDYpCisgICsweDAwMUMgfCAzNCAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgICB8IDB4MDAzNCAoNTIpICAgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgYmFyc2AgKGlkOiA3KQorICArMHgwMDFFIHwgMDkgMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgICAgfCAweDAwMDkgKDkpICAgICAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYGJhcl9iYXpfdHlwZWAgKGlkOiA4KQorICArMHgwMDIwIHwgMzggMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgICAgfCAweDAwMzggKDU2KSAgICAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYGJhcl9iYXpgIChpZDogOSkKKyAgKzB4MDAyMiB8IDNDIDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgIHwgMHgwMDNDICg2MCkgICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBhY2NvdW50c2AgKGlkOiAxMCkKKyAgKzB4MDAyNCB8IDQwIDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgIHwgMHgwMDQwICg2NCkgICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBib2JgIChpZDogMTEpCisgICsweDAwMjYgfCA0NCAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgICB8IDB4MDA0NCAoNjgpICAgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgYWxpY2VgIChpZDogMTIpCisgICsweDAwMjggfCAwMCAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgICB8IDB4MDAwMCAoMCkgICAgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgbWF5YmVfaTMyYCAoaWQ6IDEzKSA8ZGVmYXVsdHMgdG8gMD4gKEludCkKKyAgKzB4MDAyQSB8IDAwIDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgIHwgMHgwMDAwICgwKSAgICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBkZWZhdWx0X2kzMmAgKGlkOiAxNCkgPGRlZmF1bHRzIHRvIDQyPiAoSW50KQorICArMHgwMDJDIHwgNDggMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgICAgfCAweDAwNDggKDcyKSAgICAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYGp1c3RfaTMyYCAoaWQ6IDE1KQorICArMHgwMDJFIHwgNEMgMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgICAgfCAweDAwNEMgKDc2KSAgICAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYG5hbWVzYCAoaWQ6IDE2KQorICArMHgwMDMwIHwgNTAgMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgICAgfCAweDAwNTAgKDgwKSAgICAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYHBvaW50c19vZl9pbnRlcmVzdGAgKGlkOiAxNykKKyAgKzB4MDAzMiB8IDU0IDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgIHwgMHgwMDU0ICg4NCkgICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBmb29iYXJzX3R5cGVgIChpZDogMTgpCisgICsweDAwMzQgfCA1OCAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgICB8IDB4MDA1OCAoODgpICAgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgZm9vYmFyc2AgKGlkOiAxOSkKKyAgKzB4MDAzNiB8IDBBIDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgIHwgMHgwMDBBICgxMCkgICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBtZWFzdXJlbWVudF90eXBlYCAoaWQ6IDIwKQorICArMHgwMDM4IHwgNUMgMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgICAgfCAweDAwNUMgKDkyKSAgICAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYG1lYXN1cmVtZW50YCAoaWQ6IDIxKQorICArMHgwMDNBIHwgMEIgMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgICAgfCAweDAwMEIgKDExKSAgICAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYGFueXRoaW5nX3R5cGVgIChpZDogMjIpCisgICsweDAwM0MgfCA2MCAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgICB8IDB4MDA2MCAoOTYpICAgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgYW55dGhpbmdgIChpZDogMjMpCisgICsweDAwM0UgfCAwMCAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgICB8IDB4MDAwMCAoMCkgICAgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgdGVtcGVyYXR1cmVgIChpZDogMjQpIDxkZWZhdWx0cyB0byA5OC42MDAwMDA+IChGbG9hdCkKKyAgKzB4MDA0MCB8IDAwIDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgIHwgMHgwMDAwICgwKSAgICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGB0ZWV0b3RhbGVyYCAoaWQ6IDI1KSA8bnVsbD4gKE9iaikKKyAgKzB4MDA0MiB8IDY0IDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgIHwgMHgwMDY0ICgxMDApICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBjaGFybGllYCAoaWQ6IDI2KQorCityb290X3RhYmxlIChBbm5vdGF0ZWRCaW5hcnkuRm9vKToKKyAgKzB4MDA0NCB8IDNBIDAwIDAwIDAwICAgICAgICAgICAgIHwgU09mZnNldDMyICAgIHwgMHgwMDAwMDAzQSAoNTgpIExvYzogKzB4MDAwQSAgIHwgb2Zmc2V0IHRvIHZ0YWJsZQorICArMHgwMDQ4IHwgMDAgMDAgMDAgICAgICAgICAgICAgICAgfCB1aW50OF90WzNdICAgfCAuLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBwYWRkaW5nCisgICsweDAwNEIgfCAwMSAgICAgICAgICAgICAgICAgICAgICB8IHVpbnQ4X3QgICAgICB8IDB4MDEgKDEpICAgICAgICAgICAgICAgICAgICAgICB8IHRhYmxlIGZpZWxkIGBoZWFsdGh5YCAoQm9vbCkKKyAgKzB4MDA0QyB8IDAyICAgICAgICAgICAgICAgICAgICAgIHwgdWludDhfdCAgICAgIHwgMHgwMiAoMikgICAgICAgICAgICAgICAgICAgICAgIHwgdGFibGUgZmllbGQgYG1lYWxgIChCeXRlKQorICArMHgwMDREIHwgRkYgICAgICAgICAgICAgICAgICAgICAgfCBVVHlwZTggICAgICAgfCAweEZGICgyNTUpICAgICAgICAgICAgICAgICAgICAgfCBFUlJPUjogdGFibGUgZmllbGQgYGJhcl9iYXpfdHlwZWAgKFVUeXBlKS4gSW52YWxpZCB1bmlvbiB0eXBlIHZhbHVlLgorICArMHgwMDRFIHwgMDEgICAgICAgICAgICAgICAgICAgICAgfCBVVHlwZTggICAgICAgfCAweDAxICgxKSAgICAgICAgICAgICAgICAgICAgICAgfCB0YWJsZSBmaWVsZCBgbWVhc3VyZW1lbnRfdHlwZWAgKFVUeXBlKQorICArMHgwMDRGIHwgMDEgICAgICAgICAgICAgICAgICAgICAgfCBVVHlwZTggICAgICAgfCAweDAxICgxKSAgICAgICAgICAgICAgICAgICAgICAgfCB0YWJsZSBmaWVsZCBgYW55dGhpbmdfdHlwZWAgKFVUeXBlKQorICArMHgwMDUwIHwgRDIgMDQgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICAgfCAweDAwMDAwNEQyICgxMjM0KSAgICAgICAgICAgICAgfCB0YWJsZSBmaWVsZCBgY291bnRlcmAgKEludCkKKyAgKzB4MDA1NCB8IDI4IDAyIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgIHwgMHgwMDAwMDIyOCAoNTUyKSBMb2M6ICsweDAyN0MgIHwgb2Zmc2V0IHRvIGZpZWxkIGBiYXJgICh0YWJsZSkKKyAgKzB4MDA1OCB8IDAxIDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgIHwgMHgwMDAwMDAwMSAoMSkgICAgICAgICAgICAgICAgIHwgc3RydWN0IGZpZWxkIGBBbm5vdGF0ZWRCaW5hcnkuQnVpbGRpbmcuZmxvb3JzYCAoSW50KQorICArMHgwMDVDIHwgMDIgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICAgfCAweDAwMDAwMDAyICgyKSAgICAgICAgICAgICAgICAgfCBzdHJ1Y3QgZmllbGQgYEFubm90YXRlZEJpbmFyeS5CdWlsZGluZy5kb29yc2AgKEludCkKKyAgKzB4MDA2MCB8IDBDIDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgIHwgMHgwMDAwMDAwQyAoMTIpICAgICAgICAgICAgICAgIHwgc3RydWN0IGZpZWxkIGBBbm5vdGF0ZWRCaW5hcnkuQnVpbGRpbmcud2luZG93c2AgKEludCkKKyAgKzB4MDA2NCB8IDBBIDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgIHwgMHgwMDAwMDAwQSAoMTApICAgICAgICAgICAgICAgIHwgYXJyYXkgZmllbGQgYEFubm90YXRlZEJpbmFyeS5EaW1lbnNpb24udmFsdWVzYFswXSAoSW50KQorICArMHgwMDY4IHwgMEMgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICAgfCAweDAwMDAwMDBDICgxMikgICAgICAgICAgICAgICAgfCBhcnJheSBmaWVsZCBgQW5ub3RhdGVkQmluYXJ5LkRpbWVuc2lvbi52YWx1ZXNgWzFdIChJbnQpCisgICsweDAwNkMgfCAxNCAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgICB8IDB4MDAwMDAwMTQgKDIwKSAgICAgICAgICAgICAgICB8IGFycmF5IGZpZWxkIGBBbm5vdGF0ZWRCaW5hcnkuRGltZW5zaW9uLnZhbHVlc2BbMl0gKEludCkKKyAgKzB4MDA3MCB8IDAxICAgICAgICAgICAgICAgICAgICAgIHwgdWludDhfdCAgICAgIHwgMHgwMSAoMSkgICAgICAgICAgICAgICAgICAgICAgIHwgc3RydWN0IGZpZWxkIGBBbm5vdGF0ZWRCaW5hcnkuVG9sZXJhbmNlLndpZHRoYCAoVUJ5dGUpCisgICsweDAwNzEgfCAwMiAgICAgICAgICAgICAgICAgICAgICB8IHVpbnQ4X3QgICAgICB8IDB4MDIgKDIpICAgICAgICAgICAgICAgICAgICAgICB8IHN0cnVjdCBmaWVsZCBgQW5ub3RhdGVkQmluYXJ5LlRvbGVyYW5jZS53aWR0aGAgKFVCeXRlKQorICArMHgwMDcyIHwgMDMgICAgICAgICAgICAgICAgICAgICAgfCB1aW50OF90ICAgICAgfCAweDAzICgzKSAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJ1Y3QgZmllbGQgYEFubm90YXRlZEJpbmFyeS5Ub2xlcmFuY2Uud2lkdGhgIChVQnl0ZSkKKyAgKzB4MDA3MyB8IDAwICAgICAgICAgICAgICAgICAgICAgIHwgdWludDhfdFsxXSAgIHwgLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgcGFkZGluZworICArMHgwMDc0IHwgQzggMDEgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICAgfCAweDAwMDAwMUM4ICg0NTYpIExvYzogKzB4MDIzQyAgfCBvZmZzZXQgdG8gZmllbGQgYG5hbWVgIChzdHJpbmcpCisgICsweDAwNzggfCA1QyAwMSAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgICB8IDB4MDAwMDAxNUMgKDM0OCkgTG9jOiArMHgwMUQ0ICB8IG9mZnNldCB0byBmaWVsZCBgYmFyc2AgKHZlY3RvcikKKyAgKzB4MDA3QyB8IDUwIDAxIDAwIDAwICAgICAgICAgICAgIHwgP3VpbnQ4X3RbNF0gIHwgUC4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgV0FSTjogbm90aGluZyByZWZlcnMgdG8gdGhpcyBzZWN0aW9uLgorICArMHgwMDgwIHwgMzQgMDEgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICAgfCAweDAwMDAwMTM0ICgzMDgpIExvYzogKzB4MDFCNCAgfCBvZmZzZXQgdG8gZmllbGQgYGFjY291bnRzYCAodmVjdG9yKQorICArMHgwMDg0IHwgMjQgMDEgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICAgfCAweDAwMDAwMTI0ICgyOTIpIExvYzogKzB4MDFBOCAgfCBvZmZzZXQgdG8gZmllbGQgYGJvYmAgKHN0cmluZykKKyAgKzB4MDA4OCB8IDE0IDAxIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgIHwgMHgwMDAwMDExNCAoMjc2KSBMb2M6ICsweDAxOUMgIHwgb2Zmc2V0IHRvIGZpZWxkIGBhbGljZWAgKHN0cmluZykKKyAgKzB4MDA4QyB8IDBEIDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgIHwgMHgwMDAwMDAwRCAoMTMpICAgICAgICAgICAgICAgIHwgdGFibGUgZmllbGQgYGp1c3RfaTMyYCAoSW50KQorICArMHgwMDkwIHwgREMgMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICAgfCAweDAwMDAwMERDICgyMjApIExvYzogKzB4MDE2QyAgfCBvZmZzZXQgdG8gZmllbGQgYG5hbWVzYCAodmVjdG9yKQorICArMHgwMDk0IHwgQTAgMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICAgfCAweDAwMDAwMEEwICgxNjApIExvYzogKzB4MDEzNCAgfCBvZmZzZXQgdG8gZmllbGQgYHBvaW50c19vZl9pbnRlcmVzdGAgKHZlY3RvcikKKyAgKzB4MDA5OCB8IDk0IDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgIHwgMHgwMDAwMDA5NCAoMTQ4KSBMb2M6ICsweDAxMkMgIHwgb2Zmc2V0IHRvIGZpZWxkIGBmb29iYXJzX3R5cGVgICh2ZWN0b3IpCisgICsweDAwOUMgfCAzOCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgICB8IDB4MDAwMDAwMzggKDU2KSBMb2M6ICsweDAwRDQgICB8IG9mZnNldCB0byBmaWVsZCBgZm9vYmFyc2AgKHZlY3RvcikKKyAgKzB4MDBBMCB8IDMzIDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgIHwgMHgwMDAwMDAzMyAoNTEpIExvYzogKzB4MDBEMyAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBtZWFzdXJlbWVudGAgKHVuaW9uIG9mIHR5cGUgYFRvbGVyYW5jZWApCisgICsweDAwQTQgfCAxQyAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgICB8IDB4MDAwMDAwMUMgKDI4KSBMb2M6ICsweDAwQzAgICB8IG9mZnNldCB0byBmaWVsZCBgYW55dGhpbmdgICh1bmlvbiBvZiB0eXBlIGBCYXJgKQorICArMHgwMEE4IHwgMDQgMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICAgfCAweDAwMDAwMDA0ICg0KSBMb2M6ICsweDAwQUMgICAgfCBvZmZzZXQgdG8gZmllbGQgYGNoYXJsaWVgIChzdHJpbmcpCisKK3N0cmluZyAoQW5ub3RhdGVkQmluYXJ5LkZvby5jaGFybGllKToKKyAgKzB4MDBBQyB8IDA1IDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgIHwgMHgwMDAwMDAwNSAoNSkgICAgICAgICAgICAgICAgIHwgbGVuZ3RoIG9mIHN0cmluZworICArMHgwMEIwIHwgNjEgNkMgNjkgNjMgNjUgICAgICAgICAgfCBjaGFyWzVdICAgICAgfCBhbGljZSAgICAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJpbmcgbGl0ZXJhbAorICArMHgwMEI1IHwgMDAgICAgICAgICAgICAgICAgICAgICAgfCBjaGFyICAgICAgICAgfCAweDAwICgwKSAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJpbmcgdGVybWluYXRvcgorCitwYWRkaW5nOgorICArMHgwMEI2IHwgMDAgMDAgICAgICAgICAgICAgICAgICAgfCB1aW50OF90WzJdICAgfCAuLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBwYWRkaW5nCisKK3Z0YWJsZSAoQW5ub3RhdGVkQmluYXJ5LkJhcik6CisgICsweDAwQjggfCAwOCAwMCAgICAgICAgICAgICAgICAgICB8IHVpbnQxNl90ICAgICB8IDB4MDAwOCAoOCkgICAgICAgICAgICAgICAgICAgICB8IHNpemUgb2YgdGhpcyB2dGFibGUKKyAgKzB4MDBCQSB8IDEzIDAwICAgICAgICAgICAgICAgICAgIHwgdWludDE2X3QgICAgIHwgMHgwMDEzICgxOSkgICAgICAgICAgICAgICAgICAgIHwgc2l6ZSBvZiByZWZlcnJpbmcgdGFibGUKKyAgKzB4MDBCQyB8IDA4IDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgIHwgMHgwMDA4ICg4KSAgICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBhYCAoaWQ6IDApCisgICsweDAwQkUgfCAwNCAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgICB8IDB4MDAwNCAoNCkgICAgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgYmAgKGlkOiAxKQorCit0YWJsZSAoQW5ub3RhdGVkQmluYXJ5LkJhcik6CisgICsweDAwQzAgfCAwOCAwMCAwMCAwMCAgICAgICAgICAgICB8IFNPZmZzZXQzMiAgICB8IDB4MDAwMDAwMDggKDgpIExvYzogKzB4MDBCOCAgICB8IG9mZnNldCB0byB2dGFibGUKKyAgKzB4MDBDNCB8IDAwIDgwIDIzIDQ0ICAgICAgICAgICAgIHwgZmxvYXQgICAgICAgIHwgMHg0NDIzODAwMCAoNjU0KSAgICAgICAgICAgICAgIHwgdGFibGUgZmllbGQgYGJgIChGbG9hdCkKKyAgKzB4MDBDOCB8IDAwIDAwIDAwIDAwIDAwIDEwIDc0IDQwIHwgZG91YmxlICAgICAgIHwgMHg0MDc0MTAwMDAwMDAwMDAwICgzMjEpICAgICAgIHwgdGFibGUgZmllbGQgYGFgIChEb3VibGUpCisgICsweDAwRDAgfCAwMCAwMCAwMCAgICAgICAgICAgICAgICB8IHVpbnQ4X3RbM10gICB8IC4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHBhZGRpbmcKKwordW5pb24gKEFubm90YXRlZEJpbmFyeS5Ub2xlcmFuY2UubWVhc3VyZW1lbnQpOgorICArMHgwMEQzIHwgMDUgICAgICAgICAgICAgICAgICAgICAgfCB1aW50OF90ICAgICAgfCAweDA1ICg1KSAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJ1Y3QgZmllbGQgYEFubm90YXRlZEJpbmFyeS5Ub2xlcmFuY2Uud2lkdGhgIChVQnl0ZSkKKwordmVjdG9yIChBbm5vdGF0ZWRCaW5hcnkuRm9vLmZvb2JhcnMpOgorICArMHgwMEQ0IHwgMDMgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICAgfCAweDAwMDAwMDAzICgzKSAgICAgICAgICAgICAgICAgfCBsZW5ndGggb2YgdmVjdG9yICgjIGl0ZW1zKQorICArMHgwMEQ4IHwgMzQgMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICAgfCAweDAwMDAwMDM0ICg1MikgTG9jOiArMHgwMTBDICAgfCBvZmZzZXQgdG8gdW5pb25bMF0gKGBCYXJgKQorICArMHgwMERDIHwgMkMgMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICAgfCAweDAwMDAwMDJDICg0NCkgTG9jOiArMHgwMTA4ICAgfCBvZmZzZXQgdG8gdW5pb25bMV0gKGBCYXpgKQorICArMHgwMEUwIHwgMDQgMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICAgfCAweDAwMDAwMDA0ICg0KSBMb2M6ICsweDAwRTQgICAgfCBvZmZzZXQgdG8gdW5pb25bMl0gKGBCYXJgKQorCit0YWJsZSAoQW5ub3RhdGVkQmluYXJ5LkJhcik6CisgICsweDAwRTQgfCBEMiBGRSBGRiBGRiAgICAgICAgICAgICB8IFNPZmZzZXQzMiAgICB8IDB4RkZGRkZFRDIgKC0zMDIpIExvYzogKzB4MDIxMiB8IG9mZnNldCB0byB2dGFibGUKKyAgKzB4MDBFOCB8IDAwIDgwIDIzIDQ0ICAgICAgICAgICAgIHwgZmxvYXQgICAgICAgIHwgMHg0NDIzODAwMCAoNjU0KSAgICAgICAgICAgICAgIHwgdGFibGUgZmllbGQgYGJgIChGbG9hdCkKKyAgKzB4MDBFQyB8IDEwIDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgIHwgMHgwMDAwMDAxMCAoMTYpIExvYzogKzB4MDBGQyAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBjYCAodGFibGUpCisgICsweDAwRjAgfCAwMCAwMCAwMCAwMCAwMCBEOCA4RSA0MCB8IGRvdWJsZSAgICAgICB8IDB4NDA4RUQ4MDAwMDAwMDAwMCAoOTg3KSAgICAgICB8IHRhYmxlIGZpZWxkIGBhYCAoRG91YmxlKQorICArMHgwMEY4IHwgMDAgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50OF90WzRdICAgfCAuLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBwYWRkaW5nCisKK3RhYmxlIChBbm5vdGF0ZWRCaW5hcnkuQmF6KToKKyAgKzB4MDBGQyB8IDZBIEZFIEZGIEZGICAgICAgICAgICAgIHwgU09mZnNldDMyICAgIHwgMHhGRkZGRkU2QSAoLTQwNikgTG9jOiArMHgwMjkyIHwgb2Zmc2V0IHRvIHZ0YWJsZQorICArMHgwMTAwIHwgMDAgMDAgMDAgICAgICAgICAgICAgICAgfCB1aW50OF90WzNdICAgfCAuLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBwYWRkaW5nCisgICsweDAxMDMgfCAwMyAgICAgICAgICAgICAgICAgICAgICB8IHVpbnQ4X3QgICAgICB8IDB4MDMgKDMpICAgICAgICAgICAgICAgICAgICAgICB8IHRhYmxlIGZpZWxkIGBtZWFsYCAoQnl0ZSkKKwordnRhYmxlIChBbm5vdGF0ZWRCaW5hcnkuQmF6KToKKyAgKzB4MDEwNCB8IDA0IDAwICAgICAgICAgICAgICAgICAgIHwgdWludDE2X3QgICAgIHwgMHgwMDA0ICg0KSAgICAgICAgICAgICAgICAgICAgIHwgc2l6ZSBvZiB0aGlzIHZ0YWJsZQorICArMHgwMTA2IHwgMDQgMDAgICAgICAgICAgICAgICAgICAgfCB1aW50MTZfdCAgICAgfCAweDAwMDQgKDQpICAgICAgICAgICAgICAgICAgICAgfCBzaXplIG9mIHJlZmVycmluZyB0YWJsZQorCit0YWJsZSAoQW5ub3RhdGVkQmluYXJ5LkJheik6CisgICsweDAxMDggfCAwNCAwMCAwMCAwMCAgICAgICAgICAgICB8IFNPZmZzZXQzMiAgICB8IDB4MDAwMDAwMDQgKDQpIExvYzogKzB4MDEwNCAgICB8IG9mZnNldCB0byB2dGFibGUKKwordGFibGUgKEFubm90YXRlZEJpbmFyeS5CYXIpOgorICArMHgwMTBDIHwgRkEgRkUgRkYgRkYgICAgICAgICAgICAgfCBTT2Zmc2V0MzIgICAgfCAweEZGRkZGRUZBICgtMjYyKSBMb2M6ICsweDAyMTIgfCBvZmZzZXQgdG8gdnRhYmxlCisgICsweDAxMTAgfCAwMCAwMCBFNCA0MyAgICAgICAgICAgICB8IGZsb2F0ICAgICAgICB8IDB4NDNFNDAwMDAgKDQ1NikgICAgICAgICAgICAgICB8IHRhYmxlIGZpZWxkIGBiYCAoRmxvYXQpCisgICsweDAxMTQgfCAxMCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgICB8IDB4MDAwMDAwMTAgKDE2KSBMb2M6ICsweDAxMjQgICB8IG9mZnNldCB0byBmaWVsZCBgY2AgKHRhYmxlKQorICArMHgwMTE4IHwgMDAgMDAgMDAgMDAgMDAgQzAgNUUgNDAgfCBkb3VibGUgICAgICAgfCAweDQwNUVDMDAwMDAwMDAwMDAgKDEyMykgICAgICAgfCB0YWJsZSBmaWVsZCBgYWAgKERvdWJsZSkKKyAgKzB4MDEyMCB8IDAwIDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDhfdFs0XSAgIHwgLi4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgcGFkZGluZworCit0YWJsZSAoQW5ub3RhdGVkQmluYXJ5LkJheik6CisgICsweDAxMjQgfCA5MiBGRSBGRiBGRiAgICAgICAgICAgICB8IFNPZmZzZXQzMiAgICB8IDB4RkZGRkZFOTIgKC0zNjYpIExvYzogKzB4MDI5MiB8IG9mZnNldCB0byB2dGFibGUKKyAgKzB4MDEyOCB8IDAwIDAwIDAwICAgICAgICAgICAgICAgIHwgdWludDhfdFszXSAgIHwgLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgcGFkZGluZworICArMHgwMTJCIHwgMDEgICAgICAgICAgICAgICAgICAgICAgfCB1aW50OF90ICAgICAgfCAweDAxICgxKSAgICAgICAgICAgICAgICAgICAgICAgfCB0YWJsZSBmaWVsZCBgbWVhbGAgKEJ5dGUpCisKK3ZlY3RvciAoQW5ub3RhdGVkQmluYXJ5LkZvby5mb29iYXJzX3R5cGUpOgorICArMHgwMTJDIHwgMDMgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICAgfCAweDAwMDAwMDAzICgzKSAgICAgICAgICAgICAgICAgfCBsZW5ndGggb2YgdmVjdG9yICgjIGl0ZW1zKQorICArMHgwMTMwIHwgMDEgICAgICAgICAgICAgICAgICAgICAgfCBVVHlwZTggICAgICAgfCAweDAxICgxKSAgICAgICAgICAgICAgICAgICAgICAgfCB2YWx1ZVswXQorICArMHgwMTMxIHwgMDIgICAgICAgICAgICAgICAgICAgICAgfCBVVHlwZTggICAgICAgfCAweDAyICgyKSAgICAgICAgICAgICAgICAgICAgICAgfCB2YWx1ZVsxXQorICArMHgwMTMyIHwgMDEgICAgICAgICAgICAgICAgICAgICAgfCBVVHlwZTggICAgICAgfCAweDAxICgxKSAgICAgICAgICAgICAgICAgICAgICAgfCB2YWx1ZVsyXQorCit2ZWN0b3IgKEFubm90YXRlZEJpbmFyeS5Gb28ucG9pbnRzX29mX2ludGVyZXN0KToKKyAgKzB4MDEzNCB8IDAzIDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgIHwgMHgwMDAwMDAwMyAoMykgICAgICAgICAgICAgICAgIHwgbGVuZ3RoIG9mIHZlY3RvciAoIyBpdGVtcykKKyAgKzB4MDEzOCB8IDMzIDMzIDMzIDMzIDMzIEEzIDQ1IDQwIHwgZG91YmxlICAgICAgIHwgMHg0MDQ1QTMzMzMzMzMzMzMzICg0My4yNzUpICAgIHwgc3RydWN0IGZpZWxkIGBBbm5vdGF0ZWRCaW5hcnkuTG9jYXRpb24ubGF0aXR1ZGVgIChEb3VibGUpCisgICsweDAxNDAgfCA3RSA1NyAwNCBGRiA1QiA4NyA1MyBDMCB8IGRvdWJsZSAgICAgICB8IDB4QzA1Mzg3NUJGRjA0NTc3RSAoLTc4LjExNSkgICB8IHN0cnVjdCBmaWVsZCBgQW5ub3RhdGVkQmluYXJ5LkxvY2F0aW9uLmxvbmdpdHVkZWAgKERvdWJsZSkKKyAgKzB4MDE0OCB8IDhEIEYwIEY2IDIwIDA0IEI2IDQyIDQwIHwgZG91YmxlICAgICAgIHwgMHg0MDQyQjYwNDIwRjZGMDhEICgzNy40MjIpICAgIHwgc3RydWN0IGZpZWxkIGBBbm5vdGF0ZWRCaW5hcnkuTG9jYXRpb24ubGF0aXR1ZGVgIChEb3VibGUpCisgICsweDAxNTAgfCA5RiA3NyA2MyA0MSA2MSA4NSA1RSBDMCB8IGRvdWJsZSAgICAgICB8IDB4QzA1RTg1NjE0MTYzNzc5RiAoLTEyMi4wODQpICB8IHN0cnVjdCBmaWVsZCBgQW5ub3RhdGVkQmluYXJ5LkxvY2F0aW9uLmxvbmdpdHVkZWAgKERvdWJsZSkKKyAgKzB4MDE1OCB8IDhGIDM1IDIzIDgzIERDIDM1IDRCIEMwIHwgZG91YmxlICAgICAgIHwgMHhDMDRCMzVEQzgzMjMzNThGICgtNTQuNDIwOCkgIHwgc3RydWN0IGZpZWxkIGBBbm5vdGF0ZWRCaW5hcnkuTG9jYXRpb24ubGF0aXR1ZGVgIChEb3VibGUpCisgICsweDAxNjAgfCBGNiA5NyBERCA5MyA4NyBDNSAwQSA0MCB8IGRvdWJsZSAgICAgICB8IDB4NDAwQUM1ODc5M0REOTdGNiAoMy4zNDY0NSkgICB8IHN0cnVjdCBmaWVsZCBgQW5ub3RhdGVkQmluYXJ5LkxvY2F0aW9uLmxvbmdpdHVkZWAgKERvdWJsZSkKKworcGFkZGluZzoKKyAgKzB4MDE2OCB8IDAwIDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDhfdFs0XSAgIHwgLi4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgcGFkZGluZworCit2ZWN0b3IgKEFubm90YXRlZEJpbmFyeS5Gb28ubmFtZXMpOgorICArMHgwMTZDIHwgMDMgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICAgfCAweDAwMDAwMDAzICgzKSAgICAgICAgICAgICAgICAgfCBsZW5ndGggb2YgdmVjdG9yICgjIGl0ZW1zKQorICArMHgwMTcwIHwgMjAgMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICAgfCAweDAwMDAwMDIwICgzMikgTG9jOiArMHgwMTkwICAgfCBvZmZzZXQgdG8gc3RyaW5nWzBdCisgICsweDAxNzQgfCAxNCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgICB8IDB4MDAwMDAwMTQgKDIwKSBMb2M6ICsweDAxODggICB8IG9mZnNldCB0byBzdHJpbmdbMV0KKyAgKzB4MDE3OCB8IDA0IDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgIHwgMHgwMDAwMDAwNCAoNCkgTG9jOiArMHgwMTdDICAgIHwgb2Zmc2V0IHRvIHN0cmluZ1syXQorCitzdHJpbmcgKEFubm90YXRlZEJpbmFyeS5Gb28ubmFtZXMpOgorICArMHgwMTdDIHwgMDcgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICAgfCAweDAwMDAwMDA3ICg3KSAgICAgICAgICAgICAgICAgfCBsZW5ndGggb2Ygc3RyaW5nCisgICsweDAxODAgfCA2MyA2OCA2MSA3MiA2QyA2OSA2NSAgICB8IGNoYXJbN10gICAgICB8IGNoYXJsaWUgICAgICAgICAgICAgICAgICAgICAgICB8IHN0cmluZyBsaXRlcmFsCisgICsweDAxODcgfCAwMCAgICAgICAgICAgICAgICAgICAgICB8IGNoYXIgICAgICAgICB8IDB4MDAgKDApICAgICAgICAgICAgICAgICAgICAgICB8IHN0cmluZyB0ZXJtaW5hdG9yCisKK3N0cmluZyAoQW5ub3RhdGVkQmluYXJ5LkZvby5uYW1lcyk6CisgICsweDAxODggfCAwMyAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgICB8IDB4MDAwMDAwMDMgKDMpICAgICAgICAgICAgICAgICB8IGxlbmd0aCBvZiBzdHJpbmcKKyAgKzB4MDE4QyB8IDYyIDZGIDYyICAgICAgICAgICAgICAgIHwgY2hhclszXSAgICAgIHwgYm9iICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nIGxpdGVyYWwKKyAgKzB4MDE4RiB8IDAwICAgICAgICAgICAgICAgICAgICAgIHwgY2hhciAgICAgICAgIHwgMHgwMCAoMCkgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nIHRlcm1pbmF0b3IKKworc3RyaW5nIChBbm5vdGF0ZWRCaW5hcnkuRm9vLm5hbWVzKToKKyAgKzB4MDE5MCB8IDA1IDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgIHwgMHgwMDAwMDAwNSAoNSkgICAgICAgICAgICAgICAgIHwgbGVuZ3RoIG9mIHN0cmluZworICArMHgwMTk0IHwgNjEgNkMgNjkgNjMgNjUgICAgICAgICAgfCBjaGFyWzVdICAgICAgfCBhbGljZSAgICAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJpbmcgbGl0ZXJhbAorICArMHgwMTk5IHwgMDAgICAgICAgICAgICAgICAgICAgICAgfCBjaGFyICAgICAgICAgfCAweDAwICgwKSAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJpbmcgdGVybWluYXRvcgorCitwYWRkaW5nOgorICArMHgwMTlBIHwgMDAgMDAgICAgICAgICAgICAgICAgICAgfCB1aW50OF90WzJdICAgfCAuLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBwYWRkaW5nCisKK3N0cmluZyAoQW5ub3RhdGVkQmluYXJ5LkZvby5hbGljZSk6CisgICsweDAxOUMgfCAwNyAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgICB8IDB4MDAwMDAwMDcgKDcpICAgICAgICAgICAgICAgICB8IGxlbmd0aCBvZiBzdHJpbmcKKyAgKzB4MDFBMCB8IDYzIDY4IDYxIDcyIDZDIDY5IDY1ICAgIHwgY2hhcls3XSAgICAgIHwgY2hhcmxpZSAgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nIGxpdGVyYWwKKyAgKzB4MDFBNyB8IDAwICAgICAgICAgICAgICAgICAgICAgIHwgY2hhciAgICAgICAgIHwgMHgwMCAoMCkgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nIHRlcm1pbmF0b3IKKworc3RyaW5nIChBbm5vdGF0ZWRCaW5hcnkuRm9vLmJvYik6CisgICsweDAxQTggfCAwNyAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgICB8IDB4MDAwMDAwMDcgKDcpICAgICAgICAgICAgICAgICB8IGxlbmd0aCBvZiBzdHJpbmcKKyAgKzB4MDFBQyB8IDYzIDY4IDYxIDcyIDZDIDY5IDY1ICAgIHwgY2hhcls3XSAgICAgIHwgY2hhcmxpZSAgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nIGxpdGVyYWwKKyAgKzB4MDFCMyB8IDAwICAgICAgICAgICAgICAgICAgICAgIHwgY2hhciAgICAgICAgIHwgMHgwMCAoMCkgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nIHRlcm1pbmF0b3IKKwordmVjdG9yIChBbm5vdGF0ZWRCaW5hcnkuRm9vLmFjY291bnRzKToKKyAgKzB4MDFCNCB8IDA5IDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgIHwgMHgwMDAwMDAwOSAoOSkgICAgICAgICAgICAgICAgIHwgbGVuZ3RoIG9mIHZlY3RvciAoIyBpdGVtcykKKyAgKzB4MDFCOCB8IDA5IDAwICAgICAgICAgICAgICAgICAgIHwgdWludDE2X3QgICAgIHwgMHgwMDA5ICg5KSAgICAgICAgICAgICAgICAgICAgIHwgdmFsdWVbMF0KKyAgKzB4MDFCQSB8IDA4IDAwICAgICAgICAgICAgICAgICAgIHwgdWludDE2X3QgICAgIHwgMHgwMDA4ICg4KSAgICAgICAgICAgICAgICAgICAgIHwgdmFsdWVbMV0KKyAgKzB4MDFCQyB8IDA3IDAwICAgICAgICAgICAgICAgICAgIHwgdWludDE2X3QgICAgIHwgMHgwMDA3ICg3KSAgICAgICAgICAgICAgICAgICAgIHwgdmFsdWVbMl0KKyAgKzB4MDFCRSB8IDAxIDAwICAgICAgICAgICAgICAgICAgIHwgdWludDE2X3QgICAgIHwgMHgwMDAxICgxKSAgICAgICAgICAgICAgICAgICAgIHwgdmFsdWVbM10KKyAgKzB4MDFDMCB8IDAyIDAwICAgICAgICAgICAgICAgICAgIHwgdWludDE2X3QgICAgIHwgMHgwMDAyICgyKSAgICAgICAgICAgICAgICAgICAgIHwgdmFsdWVbNF0KKyAgKzB4MDFDMiB8IDAzIDAwICAgICAgICAgICAgICAgICAgIHwgdWludDE2X3QgICAgIHwgMHgwMDAzICgzKSAgICAgICAgICAgICAgICAgICAgIHwgdmFsdWVbNV0KKyAgKzB4MDFDNCB8IDA2IDAwICAgICAgICAgICAgICAgICAgIHwgdWludDE2X3QgICAgIHwgMHgwMDA2ICg2KSAgICAgICAgICAgICAgICAgICAgIHwgdmFsdWVbNl0KKyAgKzB4MDFDNiB8IDA1IDAwICAgICAgICAgICAgICAgICAgIHwgdWludDE2X3QgICAgIHwgMHgwMDA1ICg1KSAgICAgICAgICAgICAgICAgICAgIHwgdmFsdWVbN10KKyAgKzB4MDFDOCB8IDA0IDAwICAgICAgICAgICAgICAgICAgIHwgdWludDE2X3QgICAgIHwgMHgwMDA0ICg0KSAgICAgICAgICAgICAgICAgICAgIHwgdmFsdWVbOF0KKwordW5rbm93biAobm8ga25vd24gcmVmZXJlbmNlcyk6CisgICsweDAxQ0EgfCAwMCAwMCAzQSBGRiBGRiBGRiAwMCAwMCB8ID91aW50OF90WzEwXSB8IC4uOi4uLi4uICAgICAgICAgICAgICAgICAgICAgICB8IFdBUk46IG5vdGhpbmcgcmVmZXJzIHRvIHRoaXMgc2VjdGlvbi4KKyAgKzB4MDFEMiB8IDAwIDAzICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgIHwgLi4KKwordmVjdG9yIChBbm5vdGF0ZWRCaW5hcnkuRm9vLmJhcnMpOgorICArMHgwMUQ0IHwgMDIgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICAgfCAweDAwMDAwMDAyICgyKSAgICAgICAgICAgICAgICAgfCBsZW5ndGggb2YgdmVjdG9yICgjIGl0ZW1zKQorICArMHgwMUQ4IHwgNDQgMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICAgfCAweDAwMDAwMDQ0ICg2OCkgTG9jOiArMHgwMjFDICAgfCBvZmZzZXQgdG8gdGFibGVbMF0KKyAgKzB4MDFEQyB8IDEwIDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgIHwgMHgwMDAwMDAxMCAoMTYpIExvYzogKzB4MDFFQyAgIHwgb2Zmc2V0IHRvIHRhYmxlWzFdCisKK3BhZGRpbmc6CisgICsweDAxRTAgfCAwMCAwMCAgICAgICAgICAgICAgICAgICB8IHVpbnQ4X3RbMl0gICB8IC4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHBhZGRpbmcKKwordnRhYmxlIChBbm5vdGF0ZWRCaW5hcnkuQmFyKToKKyAgKzB4MDFFMiB8IDBBIDAwICAgICAgICAgICAgICAgICAgIHwgdWludDE2X3QgICAgIHwgMHgwMDBBICgxMCkgICAgICAgICAgICAgICAgICAgIHwgc2l6ZSBvZiB0aGlzIHZ0YWJsZQorICArMHgwMUU0IHwgMUEgMDAgICAgICAgICAgICAgICAgICAgfCB1aW50MTZfdCAgICAgfCAweDAwMUEgKDI2KSAgICAgICAgICAgICAgICAgICAgfCBzaXplIG9mIHJlZmVycmluZyB0YWJsZQorICArMHgwMUU2IHwgMEMgMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgICAgfCAweDAwMEMgKDEyKSAgICAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYGFgIChpZDogMCkKKyAgKzB4MDFFOCB8IDA0IDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgIHwgMHgwMDA0ICg0KSAgICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBiYCAoaWQ6IDEpCisgICsweDAxRUEgfCAwOCAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgICB8IDB4MDAwOCAoOCkgICAgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgY2AgKGlkOiAyKQorCit0YWJsZSAoQW5ub3RhdGVkQmluYXJ5LkJhcik6CisgICsweDAxRUMgfCAwQSAwMCAwMCAwMCAgICAgICAgICAgICB8IFNPZmZzZXQzMiAgICB8IDB4MDAwMDAwMEEgKDEwKSBMb2M6ICsweDAxRTIgICB8IG9mZnNldCB0byB2dGFibGUKKyAgKzB4MDFGMCB8IDAwIDgwIDIzIDQ0ICAgICAgICAgICAgIHwgZmxvYXQgICAgICAgIHwgMHg0NDIzODAwMCAoNjU0KSAgICAgICAgICAgICAgIHwgdGFibGUgZmllbGQgYGJgIChGbG9hdCkKKyAgKzB4MDFGNCB8IDE4IDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgIHwgMHgwMDAwMDAxOCAoMjQpIExvYzogKzB4MDIwQyAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBjYCAodGFibGUpCisgICsweDAxRjggfCAwMCAwMCAwMCAwMCAwMCBEOCA4RSA0MCB8IGRvdWJsZSAgICAgICB8IDB4NDA4RUQ4MDAwMDAwMDAwMCAoOTg3KSAgICAgICB8IHRhYmxlIGZpZWxkIGBhYCAoRG91YmxlKQorICArMHgwMjAwIHwgMDAgMDAgMDAgMDAgMDAgMDAgICAgICAgfCB1aW50OF90WzZdICAgfCAuLi4uLi4gICAgICAgICAgICAgICAgICAgICAgICAgfCBwYWRkaW5nCisKK3Z0YWJsZSAoQW5ub3RhdGVkQmluYXJ5LkJheik6CisgICsweDAyMDYgfCAwNiAwMCAgICAgICAgICAgICAgICAgICB8IHVpbnQxNl90ICAgICB8IDB4MDAwNiAoNikgICAgICAgICAgICAgICAgICAgICB8IHNpemUgb2YgdGhpcyB2dGFibGUKKyAgKzB4MDIwOCB8IDA2IDAwICAgICAgICAgICAgICAgICAgIHwgdWludDE2X3QgICAgIHwgMHgwMDA2ICg2KSAgICAgICAgICAgICAgICAgICAgIHwgc2l6ZSBvZiByZWZlcnJpbmcgdGFibGUKKyAgKzB4MDIwQSB8IDA1IDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgIHwgMHgwMDA1ICg1KSAgICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBtZWFsYCAoaWQ6IDApCisKK3RhYmxlIChBbm5vdGF0ZWRCaW5hcnkuQmF6KToKKyAgKzB4MDIwQyB8IDA2IDAwIDAwIDAwICAgICAgICAgICAgIHwgU09mZnNldDMyICAgIHwgMHgwMDAwMDAwNiAoNikgTG9jOiArMHgwMjA2ICAgIHwgb2Zmc2V0IHRvIHZ0YWJsZQorICArMHgwMjEwIHwgMDAgICAgICAgICAgICAgICAgICAgICAgfCB1aW50OF90WzFdICAgfCAuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBwYWRkaW5nCisgICsweDAyMTEgfCAwMyAgICAgICAgICAgICAgICAgICAgICB8IHVpbnQ4X3QgICAgICB8IDB4MDMgKDMpICAgICAgICAgICAgICAgICAgICAgICB8IHRhYmxlIGZpZWxkIGBtZWFsYCAoQnl0ZSkKKwordnRhYmxlIChBbm5vdGF0ZWRCaW5hcnkuQmFyKToKKyAgKzB4MDIxMiB8IDBBIDAwICAgICAgICAgICAgICAgICAgIHwgdWludDE2X3QgICAgIHwgMHgwMDBBICgxMCkgICAgICAgICAgICAgICAgICAgIHwgc2l6ZSBvZiB0aGlzIHZ0YWJsZQorICArMHgwMjE0IHwgMTggMDAgICAgICAgICAgICAgICAgICAgfCB1aW50MTZfdCAgICAgfCAweDAwMTggKDI0KSAgICAgICAgICAgICAgICAgICAgfCBzaXplIG9mIHJlZmVycmluZyB0YWJsZQorICArMHgwMjE2IHwgMEMgMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgICAgfCAweDAwMEMgKDEyKSAgICAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYGFgIChpZDogMCkKKyAgKzB4MDIxOCB8IDA0IDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgIHwgMHgwMDA0ICg0KSAgICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBiYCAoaWQ6IDEpCisgICsweDAyMUEgfCAwOCAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgICB8IDB4MDAwOCAoOCkgICAgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgY2AgKGlkOiAyKQorCit0YWJsZSAoQW5ub3RhdGVkQmluYXJ5LkJhcik6CisgICsweDAyMUMgfCAwQSAwMCAwMCAwMCAgICAgICAgICAgICB8IFNPZmZzZXQzMiAgICB8IDB4MDAwMDAwMEEgKDEwKSBMb2M6ICsweDAyMTIgICB8IG9mZnNldCB0byB2dGFibGUKKyAgKzB4MDIyMCB8IDAwIDAwIEU0IDQzICAgICAgICAgICAgIHwgZmxvYXQgICAgICAgIHwgMHg0M0U0MDAwMCAoNDU2KSAgICAgICAgICAgICAgIHwgdGFibGUgZmllbGQgYGJgIChGbG9hdCkKKyAgKzB4MDIyNCB8IDEwIDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgIHwgMHgwMDAwMDAxMCAoMTYpIExvYzogKzB4MDIzNCAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBjYCAodGFibGUpCisgICsweDAyMjggfCAwMCAwMCAwMCAwMCAwMCBDMCA1RSA0MCB8IGRvdWJsZSAgICAgICB8IDB4NDA1RUMwMDAwMDAwMDAwMCAoMTIzKSAgICAgICB8IHRhYmxlIGZpZWxkIGBhYCAoRG91YmxlKQorICArMHgwMjMwIHwgMDAgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50OF90WzRdICAgfCAuLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBwYWRkaW5nCisKK3RhYmxlIChBbm5vdGF0ZWRCaW5hcnkuQmF6KToKKyAgKzB4MDIzNCB8IEEyIEZGIEZGIEZGICAgICAgICAgICAgIHwgU09mZnNldDMyICAgIHwgMHhGRkZGRkZBMiAoLTk0KSBMb2M6ICsweDAyOTIgIHwgb2Zmc2V0IHRvIHZ0YWJsZQorICArMHgwMjM4IHwgMDAgMDAgMDAgICAgICAgICAgICAgICAgfCB1aW50OF90WzNdICAgfCAuLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBwYWRkaW5nCisgICsweDAyM0IgfCAwMSAgICAgICAgICAgICAgICAgICAgICB8IHVpbnQ4X3QgICAgICB8IDB4MDEgKDEpICAgICAgICAgICAgICAgICAgICAgICB8IHRhYmxlIGZpZWxkIGBtZWFsYCAoQnl0ZSkKKworc3RyaW5nIChBbm5vdGF0ZWRCaW5hcnkuRm9vLm5hbWUpOgorICArMHgwMjNDIHwgMkYgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICAgfCAweDAwMDAwMDJGICg0NykgICAgICAgICAgICAgICAgfCBsZW5ndGggb2Ygc3RyaW5nCisgICsweDAyNDAgfCA1NCA2OCA2OSA3MyAyMCA2OSA3MyAyMCB8IGNoYXJbNDddICAgICB8IFRoaXMgaXMgICAgICAgICAgICAgICAgICAgICAgICB8IHN0cmluZyBsaXRlcmFsCisgICsweDAyNDggfCA2MSAyMCA2QyA2RiA2RSA2NyAyMCA3MyB8ICAgICAgICAgICAgICB8IGEgbG9uZyBzCisgICsweDAyNTAgfCA3NCA3MiA2OSA2RSA2NyAyMCA3NCA2RiB8ICAgICAgICAgICAgICB8IHRyaW5nIHRvCisgICsweDAyNTggfCAyMCA3MyA2OCA2RiA3NyAyMCA2OCA2RiB8ICAgICAgICAgICAgICB8ICBzaG93IGhvCisgICsweDAyNjAgfCA3NyAyMCA2OSA3NCAyMCA2MiA3MiA2NSB8ICAgICAgICAgICAgICB8IHcgaXQgYnJlCisgICsweDAyNjggfCA2MSA2QiA3MyAyMCA3NSA3MCAyRSAgICB8ICAgICAgICAgICAgICB8IGFrcyB1cC4KKyAgKzB4MDI2RiB8IDAwICAgICAgICAgICAgICAgICAgICAgIHwgY2hhciAgICAgICAgIHwgMHgwMCAoMCkgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nIHRlcm1pbmF0b3IKKworcGFkZGluZzoKKyAgKzB4MDI3MCB8IDAwIDAwICAgICAgICAgICAgICAgICAgIHwgdWludDhfdFsyXSAgIHwgLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgcGFkZGluZworCit2dGFibGUgKEFubm90YXRlZEJpbmFyeS5CYXIpOgorICArMHgwMjcyIHwgMEEgMDAgICAgICAgICAgICAgICAgICAgfCB1aW50MTZfdCAgICAgfCAweDAwMEEgKDEwKSAgICAgICAgICAgICAgICAgICAgfCBzaXplIG9mIHRoaXMgdnRhYmxlCisgICsweDAyNzQgfCAxNiAwMCAgICAgICAgICAgICAgICAgICB8IHVpbnQxNl90ICAgICB8IDB4MDAxNiAoMjIpICAgICAgICAgICAgICAgICAgICB8IHNpemUgb2YgcmVmZXJyaW5nIHRhYmxlCisgICsweDAyNzYgfCAwQyAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgICB8IDB4MDAwQyAoMTIpICAgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgYWAgKGlkOiAwKQorICArMHgwMjc4IHwgMDQgMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgICAgfCAweDAwMDQgKDQpICAgICAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYGJgIChpZDogMSkKKyAgKzB4MDI3QSB8IDA4IDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgIHwgMHgwMDA4ICg4KSAgICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBjYCAoaWQ6IDIpCisKK3RhYmxlIChBbm5vdGF0ZWRCaW5hcnkuQmFyKToKKyAgKzB4MDI3QyB8IDBBIDAwIDAwIDAwICAgICAgICAgICAgIHwgU09mZnNldDMyICAgIHwgMHgwMDAwMDAwQSAoMTApIExvYzogKzB4MDI3MiAgIHwgb2Zmc2V0IHRvIHZ0YWJsZQorICArMHgwMjgwIHwgNjUgMjAgNzEgNDkgICAgICAgICAgICAgfCBmbG9hdCAgICAgICAgfCAweDQ5NzEyMDY1ICg5ODc2NTQpICAgICAgICAgICAgfCB0YWJsZSBmaWVsZCBgYmAgKEZsb2F0KQorICArMHgwMjg0IHwgMTQgMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICAgfCAweDAwMDAwMDE0ICgyMCkgTG9jOiArMHgwMjk4ICAgfCBvZmZzZXQgdG8gZmllbGQgYGNgICh0YWJsZSkKKyAgKzB4MDI4OCB8IEM5IDc2IEJFIDlGIDBDIDI0IEZFIDQwIHwgZG91YmxlICAgICAgIHwgMHg0MEZFMjQwQzlGQkU3NkM5ICgxMjM0NTcpICAgIHwgdGFibGUgZmllbGQgYGFgIChEb3VibGUpCisgICsweDAyOTAgfCAwMCAwMCAgICAgICAgICAgICAgICAgICB8IHVpbnQ4X3RbMl0gICB8IC4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHBhZGRpbmcKKwordnRhYmxlIChBbm5vdGF0ZWRCaW5hcnkuQmF6KToKKyAgKzB4MDI5MiB8IDA2IDAwICAgICAgICAgICAgICAgICAgIHwgdWludDE2X3QgICAgIHwgMHgwMDA2ICg2KSAgICAgICAgICAgICAgICAgICAgIHwgc2l6ZSBvZiB0aGlzIHZ0YWJsZQorICArMHgwMjk0IHwgMDggMDAgICAgICAgICAgICAgICAgICAgfCB1aW50MTZfdCAgICAgfCAweDAwMDggKDgpICAgICAgICAgICAgICAgICAgICAgfCBzaXplIG9mIHJlZmVycmluZyB0YWJsZQorICArMHgwMjk2IHwgMDcgMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgICAgfCAweDAwMDcgKDcpICAgICAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYG1lYWxgIChpZDogMCkKKwordGFibGUgKEFubm90YXRlZEJpbmFyeS5CYXopOgorICArMHgwMjk4IHwgMDYgMDAgMDAgMDAgICAgICAgICAgICAgfCBTT2Zmc2V0MzIgICAgfCAweDAwMDAwMDA2ICg2KSBMb2M6ICsweDAyOTIgICAgfCBvZmZzZXQgdG8gdnRhYmxlCisgICsweDAyOUMgfCAwMCAwMCAwMCAgICAgICAgICAgICAgICB8IHVpbnQ4X3RbM10gICB8IC4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHBhZGRpbmcKKyAgKzB4MDI5RiB8IDAxICAgICAgICAgICAgICAgICAgICAgIHwgdWludDhfdCAgICAgIHwgMHgwMSAoMSkgICAgICAgICAgICAgICAgICAgICAgIHwgdGFibGUgZmllbGQgYG1lYWxgIChCeXRlKQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvYW5ub3RhdGVkX2JpbmFyeS90ZXN0cy9pbnZhbGlkX3VuaW9uX3R5cGVfdmFsdWUuYmluIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvYW5ub3RhdGVkX2JpbmFyeS90ZXN0cy9pbnZhbGlkX3VuaW9uX3R5cGVfdmFsdWUuYmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIyZjJkZDUKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9hbm5vdGF0ZWRfYmluYXJ5L3Rlc3RzL2ludmFsaWRfdW5pb25fdHlwZV92YWx1ZS5iaW4KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvYW5ub3RhdGVkX2JpbmFyeS90ZXN0cy9pbnZhbGlkX3ZlY3Rvcl9sZW5ndGhfY3V0X3Nob3J0LmFmYiBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL2Fubm90YXRlZF9iaW5hcnkvdGVzdHMvaW52YWxpZF92ZWN0b3JfbGVuZ3RoX2N1dF9zaG9ydC5hZmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2QxMWQyYgotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL2Fubm90YXRlZF9iaW5hcnkvdGVzdHMvaW52YWxpZF92ZWN0b3JfbGVuZ3RoX2N1dF9zaG9ydC5hZmIKQEAgLTAsMCArMSwxNDAgQEAKKy8vIEFubm90YXRlZCBGbGF0YnVmZmVyIEJpbmFyeQorLy8KKy8vIFNjaGVtYSBmaWxlOiBhbm5vdGF0ZWRfYmluYXJ5LmZicworLy8gQmluYXJ5IGZpbGU6IHRlc3RzL2ludmFsaWRfdmVjdG9yX2xlbmd0aF9jdXRfc2hvcnQuYmluCisKK2hlYWRlcjoKKyAgKzB4MDAwMCB8IDQ0IDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgIHwgMHgwMDAwMDA0NCAoNjgpIExvYzogKzB4MDA0NCAgIHwgb2Zmc2V0IHRvIHJvb3QgdGFibGUgYEFubm90YXRlZEJpbmFyeS5Gb29gCisgICsweDAwMDQgfCA0MSA0RSA0RSA0RiAgICAgICAgICAgICB8IGNoYXJbNF0gICAgICB8IEFOTk8gICAgICAgICAgICAgICAgICAgICAgICAgICB8IEZpbGUgSWRlbnRpZmllcgorCitwYWRkaW5nOgorICArMHgwMDA4IHwgMDAgMDAgICAgICAgICAgICAgICAgICAgfCB1aW50OF90WzJdICAgfCAuLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBwYWRkaW5nCisKK3Z0YWJsZSAoQW5ub3RhdGVkQmluYXJ5LkZvbyk6CisgICsweDAwMEEgfCAzQSAwMCAgICAgICAgICAgICAgICAgICB8IHVpbnQxNl90ICAgICB8IDB4MDAzQSAoNTgpICAgICAgICAgICAgICAgICAgICB8IHNpemUgb2YgdGhpcyB2dGFibGUKKyAgKzB4MDAwQyB8IDY4IDAwICAgICAgICAgICAgICAgICAgIHwgdWludDE2X3QgICAgIHwgMHgwMDY4ICgxMDQpICAgICAgICAgICAgICAgICAgIHwgc2l6ZSBvZiByZWZlcnJpbmcgdGFibGUKKyAgKzB4MDAwRSB8IDBDIDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgIHwgMHgwMDBDICgxMikgICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBjb3VudGVyYCAoaWQ6IDApCisgICsweDAwMTAgfCAwNyAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgICB8IDB4MDAwNyAoNykgICAgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgaGVhbHRoeWAgKGlkOiAxKQorICArMHgwMDEyIHwgMDAgMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgICAgfCAweDAwMDAgKDApICAgICAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYGxldmVsYCAoaWQ6IDIpIDxkZWZhdWx0cyB0byA5OT4gKExvbmcpCisgICsweDAwMTQgfCAwOCAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgICB8IDB4MDAwOCAoOCkgICAgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgbWVhbGAgKGlkOiAzKQorICArMHgwMDE2IHwgMTAgMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgICAgfCAweDAwMTAgKDE2KSAgICAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYGJhcmAgKGlkOiA0KQorICArMHgwMDE4IHwgMTQgMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgICAgfCAweDAwMTQgKDIwKSAgICAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYGhvbWVgIChpZDogNSkKKyAgKzB4MDAxQSB8IDMwIDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgIHwgMHgwMDMwICg0OCkgICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBuYW1lYCAoaWQ6IDYpCisgICsweDAwMUMgfCAzNCAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgICB8IDB4MDAzNCAoNTIpICAgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgYmFyc2AgKGlkOiA3KQorICArMHgwMDFFIHwgMDkgMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgICAgfCAweDAwMDkgKDkpICAgICAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYGJhcl9iYXpfdHlwZWAgKGlkOiA4KQorICArMHgwMDIwIHwgMzggMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgICAgfCAweDAwMzggKDU2KSAgICAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYGJhcl9iYXpgIChpZDogOSkKKyAgKzB4MDAyMiB8IDNDIDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgIHwgMHgwMDNDICg2MCkgICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBhY2NvdW50c2AgKGlkOiAxMCkKKyAgKzB4MDAyNCB8IDQwIDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgIHwgMHgwMDQwICg2NCkgICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBib2JgIChpZDogMTEpCisgICsweDAwMjYgfCA0NCAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgICB8IDB4MDA0NCAoNjgpICAgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgYWxpY2VgIChpZDogMTIpCisgICsweDAwMjggfCAwMCAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgICB8IDB4MDAwMCAoMCkgICAgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgbWF5YmVfaTMyYCAoaWQ6IDEzKSA8ZGVmYXVsdHMgdG8gMD4gKEludCkKKyAgKzB4MDAyQSB8IDAwIDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgIHwgMHgwMDAwICgwKSAgICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBkZWZhdWx0X2kzMmAgKGlkOiAxNCkgPGRlZmF1bHRzIHRvIDQyPiAoSW50KQorICArMHgwMDJDIHwgNDggMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgICAgfCAweDAwNDggKDcyKSAgICAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYGp1c3RfaTMyYCAoaWQ6IDE1KQorICArMHgwMDJFIHwgNEMgMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgICAgfCAweDAwNEMgKDc2KSAgICAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYG5hbWVzYCAoaWQ6IDE2KQorICArMHgwMDMwIHwgNTAgMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgICAgfCAweDAwNTAgKDgwKSAgICAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYHBvaW50c19vZl9pbnRlcmVzdGAgKGlkOiAxNykKKyAgKzB4MDAzMiB8IDU0IDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgIHwgMHgwMDU0ICg4NCkgICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBmb29iYXJzX3R5cGVgIChpZDogMTgpCisgICsweDAwMzQgfCA1OCAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgICB8IDB4MDA1OCAoODgpICAgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgZm9vYmFyc2AgKGlkOiAxOSkKKyAgKzB4MDAzNiB8IDBBIDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgIHwgMHgwMDBBICgxMCkgICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBtZWFzdXJlbWVudF90eXBlYCAoaWQ6IDIwKQorICArMHgwMDM4IHwgNUMgMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgICAgfCAweDAwNUMgKDkyKSAgICAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYG1lYXN1cmVtZW50YCAoaWQ6IDIxKQorICArMHgwMDNBIHwgMEIgMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgICAgfCAweDAwMEIgKDExKSAgICAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYGFueXRoaW5nX3R5cGVgIChpZDogMjIpCisgICsweDAwM0MgfCA2MCAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgICB8IDB4MDA2MCAoOTYpICAgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgYW55dGhpbmdgIChpZDogMjMpCisgICsweDAwM0UgfCAwMCAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgICB8IDB4MDAwMCAoMCkgICAgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgdGVtcGVyYXR1cmVgIChpZDogMjQpIDxkZWZhdWx0cyB0byA5OC42MDAwMDA+IChGbG9hdCkKKyAgKzB4MDA0MCB8IDAwIDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgIHwgMHgwMDAwICgwKSAgICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGB0ZWV0b3RhbGVyYCAoaWQ6IDI1KSA8bnVsbD4gKE9iaikKKyAgKzB4MDA0MiB8IDY0IDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgIHwgMHgwMDY0ICgxMDApICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBjaGFybGllYCAoaWQ6IDI2KQorCityb290X3RhYmxlIChBbm5vdGF0ZWRCaW5hcnkuRm9vKToKKyAgKzB4MDA0NCB8IDNBIDAwIDAwIDAwICAgICAgICAgICAgIHwgU09mZnNldDMyICAgIHwgMHgwMDAwMDAzQSAoNTgpIExvYzogKzB4MDAwQSAgIHwgb2Zmc2V0IHRvIHZ0YWJsZQorICArMHgwMDQ4IHwgMDAgMDAgMDAgICAgICAgICAgICAgICAgfCB1aW50OF90WzNdICAgfCAuLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBwYWRkaW5nCisgICsweDAwNEIgfCAwMSAgICAgICAgICAgICAgICAgICAgICB8IHVpbnQ4X3QgICAgICB8IDB4MDEgKDEpICAgICAgICAgICAgICAgICAgICAgICB8IHRhYmxlIGZpZWxkIGBoZWFsdGh5YCAoQm9vbCkKKyAgKzB4MDA0QyB8IDAyICAgICAgICAgICAgICAgICAgICAgIHwgdWludDhfdCAgICAgIHwgMHgwMiAoMikgICAgICAgICAgICAgICAgICAgICAgIHwgdGFibGUgZmllbGQgYG1lYWxgIChCeXRlKQorICArMHgwMDREIHwgMDIgICAgICAgICAgICAgICAgICAgICAgfCBVVHlwZTggICAgICAgfCAweDAyICgyKSAgICAgICAgICAgICAgICAgICAgICAgfCB0YWJsZSBmaWVsZCBgYmFyX2Jhel90eXBlYCAoVVR5cGUpCisgICsweDAwNEUgfCAwMSAgICAgICAgICAgICAgICAgICAgICB8IFVUeXBlOCAgICAgICB8IDB4MDEgKDEpICAgICAgICAgICAgICAgICAgICAgICB8IHRhYmxlIGZpZWxkIGBtZWFzdXJlbWVudF90eXBlYCAoVVR5cGUpCisgICsweDAwNEYgfCAwMSAgICAgICAgICAgICAgICAgICAgICB8IFVUeXBlOCAgICAgICB8IDB4MDEgKDEpICAgICAgICAgICAgICAgICAgICAgICB8IHRhYmxlIGZpZWxkIGBhbnl0aGluZ190eXBlYCAoVVR5cGUpCisgICsweDAwNTAgfCBEMiAwNCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgICB8IDB4MDAwMDA0RDIgKDEyMzQpICAgICAgICAgICAgICB8IHRhYmxlIGZpZWxkIGBjb3VudGVyYCAoSW50KQorICArMHgwMDU0IHwgMjggMDIgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICAgfCAweDAwMDAwMjI4ICg1NTIpIExvYzogKzB4MDI3QyAgfCBFUlJPUjogb2Zmc2V0IHRvIGZpZWxkIGBiYXJgLiBJbnZhbGlkIG9mZnNldCwgcG9pbnRzIG91dHNpZGUgdGhlIGJpbmFyeS4KKyAgKzB4MDA1OCB8IDAxIDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgIHwgMHgwMDAwMDAwMSAoMSkgICAgICAgICAgICAgICAgIHwgc3RydWN0IGZpZWxkIGBBbm5vdGF0ZWRCaW5hcnkuQnVpbGRpbmcuZmxvb3JzYCAoSW50KQorICArMHgwMDVDIHwgMDIgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICAgfCAweDAwMDAwMDAyICgyKSAgICAgICAgICAgICAgICAgfCBzdHJ1Y3QgZmllbGQgYEFubm90YXRlZEJpbmFyeS5CdWlsZGluZy5kb29yc2AgKEludCkKKyAgKzB4MDA2MCB8IDBDIDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgIHwgMHgwMDAwMDAwQyAoMTIpICAgICAgICAgICAgICAgIHwgc3RydWN0IGZpZWxkIGBBbm5vdGF0ZWRCaW5hcnkuQnVpbGRpbmcud2luZG93c2AgKEludCkKKyAgKzB4MDA2NCB8IDBBIDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgIHwgMHgwMDAwMDAwQSAoMTApICAgICAgICAgICAgICAgIHwgYXJyYXkgZmllbGQgYEFubm90YXRlZEJpbmFyeS5EaW1lbnNpb24udmFsdWVzYFswXSAoSW50KQorICArMHgwMDY4IHwgMEMgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICAgfCAweDAwMDAwMDBDICgxMikgICAgICAgICAgICAgICAgfCBhcnJheSBmaWVsZCBgQW5ub3RhdGVkQmluYXJ5LkRpbWVuc2lvbi52YWx1ZXNgWzFdIChJbnQpCisgICsweDAwNkMgfCAxNCAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgICB8IDB4MDAwMDAwMTQgKDIwKSAgICAgICAgICAgICAgICB8IGFycmF5IGZpZWxkIGBBbm5vdGF0ZWRCaW5hcnkuRGltZW5zaW9uLnZhbHVlc2BbMl0gKEludCkKKyAgKzB4MDA3MCB8IDAxICAgICAgICAgICAgICAgICAgICAgIHwgdWludDhfdCAgICAgIHwgMHgwMSAoMSkgICAgICAgICAgICAgICAgICAgICAgIHwgc3RydWN0IGZpZWxkIGBBbm5vdGF0ZWRCaW5hcnkuVG9sZXJhbmNlLndpZHRoYCAoVUJ5dGUpCisgICsweDAwNzEgfCAwMiAgICAgICAgICAgICAgICAgICAgICB8IHVpbnQ4X3QgICAgICB8IDB4MDIgKDIpICAgICAgICAgICAgICAgICAgICAgICB8IHN0cnVjdCBmaWVsZCBgQW5ub3RhdGVkQmluYXJ5LlRvbGVyYW5jZS53aWR0aGAgKFVCeXRlKQorICArMHgwMDcyIHwgMDMgICAgICAgICAgICAgICAgICAgICAgfCB1aW50OF90ICAgICAgfCAweDAzICgzKSAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJ1Y3QgZmllbGQgYEFubm90YXRlZEJpbmFyeS5Ub2xlcmFuY2Uud2lkdGhgIChVQnl0ZSkKKyAgKzB4MDA3MyB8IDAwICAgICAgICAgICAgICAgICAgICAgIHwgdWludDhfdFsxXSAgIHwgLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgcGFkZGluZworICArMHgwMDc0IHwgQzggMDEgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICAgfCAweDAwMDAwMUM4ICg0NTYpIExvYzogKzB4MDIzQyAgfCBFUlJPUjogb2Zmc2V0IHRvIGZpZWxkIGBuYW1lYC4gSW52YWxpZCBvZmZzZXQsIHBvaW50cyBvdXRzaWRlIHRoZSBiaW5hcnkuCisgICsweDAwNzggfCA1QyAwMSAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgICB8IDB4MDAwMDAxNUMgKDM0OCkgTG9jOiArMHgwMUQ0ICB8IEVSUk9SOiBvZmZzZXQgdG8gZmllbGQgYGJhcnNgLiBJbnZhbGlkIG9mZnNldCwgcG9pbnRzIG91dHNpZGUgdGhlIGJpbmFyeS4KKyAgKzB4MDA3QyB8IDUwIDAxIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgIHwgMHgwMDAwMDE1MCAoMzM2KSBMb2M6ICsweDAxQ0MgIHwgRVJST1I6IG9mZnNldCB0byBmaWVsZCBgYmFyX2JhemAuIEludmFsaWQgb2Zmc2V0LCBwb2ludHMgb3V0c2lkZSB0aGUgYmluYXJ5LgorICArMHgwMDgwIHwgMzQgMDEgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICAgfCAweDAwMDAwMTM0ICgzMDgpIExvYzogKzB4MDFCNCAgfCBFUlJPUjogb2Zmc2V0IHRvIGZpZWxkIGBhY2NvdW50c2AuIEludmFsaWQgb2Zmc2V0LCBwb2ludHMgb3V0c2lkZSB0aGUgYmluYXJ5LgorICArMHgwMDg0IHwgMjQgMDEgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICAgfCAweDAwMDAwMTI0ICgyOTIpIExvYzogKzB4MDFBOCAgfCBFUlJPUjogb2Zmc2V0IHRvIGZpZWxkIGBib2JgLiBJbnZhbGlkIG9mZnNldCwgcG9pbnRzIG91dHNpZGUgdGhlIGJpbmFyeS4KKyAgKzB4MDA4OCB8IDE0IDAxIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgIHwgMHgwMDAwMDExNCAoMjc2KSBMb2M6ICsweDAxOUMgIHwgRVJST1I6IG9mZnNldCB0byBmaWVsZCBgYWxpY2VgLiBJbnZhbGlkIG9mZnNldCwgcG9pbnRzIG91dHNpZGUgdGhlIGJpbmFyeS4KKyAgKzB4MDA4QyB8IDBEIDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgIHwgMHgwMDAwMDAwRCAoMTMpICAgICAgICAgICAgICAgIHwgdGFibGUgZmllbGQgYGp1c3RfaTMyYCAoSW50KQorICArMHgwMDkwIHwgREMgMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICAgfCAweDAwMDAwMERDICgyMjApIExvYzogKzB4MDE2QyAgfCBFUlJPUjogb2Zmc2V0IHRvIGZpZWxkIGBuYW1lc2AuIEludmFsaWQgb2Zmc2V0LCBwb2ludHMgb3V0c2lkZSB0aGUgYmluYXJ5LgorICArMHgwMDk0IHwgQTAgMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICAgfCAweDAwMDAwMEEwICgxNjApIExvYzogKzB4MDEzNCAgfCBvZmZzZXQgdG8gZmllbGQgYHBvaW50c19vZl9pbnRlcmVzdGAgKHZlY3RvcikKKyAgKzB4MDA5OCB8IDk0IDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgIHwgMHgwMDAwMDA5NCAoMTQ4KSBMb2M6ICsweDAxMkMgIHwgb2Zmc2V0IHRvIGZpZWxkIGBmb29iYXJzX3R5cGVgICh2ZWN0b3IpCisgICsweDAwOUMgfCAzOCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgICB8IDB4MDAwMDAwMzggKDU2KSBMb2M6ICsweDAwRDQgICB8IG9mZnNldCB0byBmaWVsZCBgZm9vYmFyc2AgKHZlY3RvcikKKyAgKzB4MDBBMCB8IDMzIDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgIHwgMHgwMDAwMDAzMyAoNTEpIExvYzogKzB4MDBEMyAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBtZWFzdXJlbWVudGAgKHVuaW9uIG9mIHR5cGUgYFRvbGVyYW5jZWApCisgICsweDAwQTQgfCAxQyAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgICB8IDB4MDAwMDAwMUMgKDI4KSBMb2M6ICsweDAwQzAgICB8IG9mZnNldCB0byBmaWVsZCBgYW55dGhpbmdgICh1bmlvbiBvZiB0eXBlIGBCYXJgKQorICArMHgwMEE4IHwgMDQgMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICAgfCAweDAwMDAwMDA0ICg0KSBMb2M6ICsweDAwQUMgICAgfCBvZmZzZXQgdG8gZmllbGQgYGNoYXJsaWVgIChzdHJpbmcpCisKK3N0cmluZyAoQW5ub3RhdGVkQmluYXJ5LkZvby5jaGFybGllKToKKyAgKzB4MDBBQyB8IDA1IDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgIHwgMHgwMDAwMDAwNSAoNSkgICAgICAgICAgICAgICAgIHwgbGVuZ3RoIG9mIHN0cmluZworICArMHgwMEIwIHwgNjEgNkMgNjkgNjMgNjUgICAgICAgICAgfCBjaGFyWzVdICAgICAgfCBhbGljZSAgICAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJpbmcgbGl0ZXJhbAorICArMHgwMEI1IHwgMDAgICAgICAgICAgICAgICAgICAgICAgfCBjaGFyICAgICAgICAgfCAweDAwICgwKSAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJpbmcgdGVybWluYXRvcgorCitwYWRkaW5nOgorICArMHgwMEI2IHwgMDAgMDAgICAgICAgICAgICAgICAgICAgfCB1aW50OF90WzJdICAgfCAuLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBwYWRkaW5nCisKK3Z0YWJsZSAoQW5ub3RhdGVkQmluYXJ5LkJhcik6CisgICsweDAwQjggfCAwOCAwMCAgICAgICAgICAgICAgICAgICB8IHVpbnQxNl90ICAgICB8IDB4MDAwOCAoOCkgICAgICAgICAgICAgICAgICAgICB8IHNpemUgb2YgdGhpcyB2dGFibGUKKyAgKzB4MDBCQSB8IDEzIDAwICAgICAgICAgICAgICAgICAgIHwgdWludDE2X3QgICAgIHwgMHgwMDEzICgxOSkgICAgICAgICAgICAgICAgICAgIHwgc2l6ZSBvZiByZWZlcnJpbmcgdGFibGUKKyAgKzB4MDBCQyB8IDA4IDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgIHwgMHgwMDA4ICg4KSAgICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBhYCAoaWQ6IDApCisgICsweDAwQkUgfCAwNCAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgICB8IDB4MDAwNCAoNCkgICAgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgYmAgKGlkOiAxKQorCit0YWJsZSAoQW5ub3RhdGVkQmluYXJ5LkJhcik6CisgICsweDAwQzAgfCAwOCAwMCAwMCAwMCAgICAgICAgICAgICB8IFNPZmZzZXQzMiAgICB8IDB4MDAwMDAwMDggKDgpIExvYzogKzB4MDBCOCAgICB8IG9mZnNldCB0byB2dGFibGUKKyAgKzB4MDBDNCB8IDAwIDgwIDIzIDQ0ICAgICAgICAgICAgIHwgZmxvYXQgICAgICAgIHwgMHg0NDIzODAwMCAoNjU0KSAgICAgICAgICAgICAgIHwgdGFibGUgZmllbGQgYGJgIChGbG9hdCkKKyAgKzB4MDBDOCB8IDAwIDAwIDAwIDAwIDAwIDEwIDc0IDQwIHwgZG91YmxlICAgICAgIHwgMHg0MDc0MTAwMDAwMDAwMDAwICgzMjEpICAgICAgIHwgdGFibGUgZmllbGQgYGFgIChEb3VibGUpCisgICsweDAwRDAgfCAwMCAwMCAwMCAgICAgICAgICAgICAgICB8IHVpbnQ4X3RbM10gICB8IC4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHBhZGRpbmcKKwordW5pb24gKEFubm90YXRlZEJpbmFyeS5Ub2xlcmFuY2UubWVhc3VyZW1lbnQpOgorICArMHgwMEQzIHwgMDUgICAgICAgICAgICAgICAgICAgICAgfCB1aW50OF90ICAgICAgfCAweDA1ICg1KSAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJ1Y3QgZmllbGQgYEFubm90YXRlZEJpbmFyeS5Ub2xlcmFuY2Uud2lkdGhgIChVQnl0ZSkKKwordmVjdG9yIChBbm5vdGF0ZWRCaW5hcnkuRm9vLmZvb2JhcnMpOgorICArMHgwMEQ0IHwgMDMgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICAgfCAweDAwMDAwMDAzICgzKSAgICAgICAgICAgICAgICAgfCBsZW5ndGggb2YgdmVjdG9yICgjIGl0ZW1zKQorICArMHgwMEQ4IHwgMzQgMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICAgfCAweDAwMDAwMDM0ICg1MikgTG9jOiArMHgwMTBDICAgfCBvZmZzZXQgdG8gdW5pb25bMF0gKGBCYXJgKQorICArMHgwMERDIHwgMkMgMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICAgfCAweDAwMDAwMDJDICg0NCkgTG9jOiArMHgwMTA4ICAgfCBvZmZzZXQgdG8gdW5pb25bMV0gKGBCYXpgKQorICArMHgwMEUwIHwgMDQgMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICAgfCAweDAwMDAwMDA0ICg0KSBMb2M6ICsweDAwRTQgICAgfCBvZmZzZXQgdG8gdW5pb25bMl0gKGBCYXJgKQorCit0YWJsZSAoQW5ub3RhdGVkQmluYXJ5LkJhcik6CisgICsweDAwRTQgfCBEMiBGRSBGRiBGRiAgICAgICAgICAgICB8IFNPZmZzZXQzMiAgICB8IDB4RkZGRkZFRDIgKC0zMDIpIExvYzogKzB4MDIxMiB8IEVSUk9SOiBvZmZzZXQgdG8gdnRhYmxlLiBJbnZhbGlkIG9mZnNldCwgcG9pbnRzIG91dHNpZGUgdGhlIGJpbmFyeS4KKwordW5rbm93biAobm8ga25vd24gcmVmZXJlbmNlcyk6CisgICsweDAwRTggfCAwMCA4MCAyMyA0NCAxMCAwMCAwMCAwMCB8ID91aW50OF90WzI4XSB8IC4uI0QuLi4uICAgICAgICAgICAgICAgICAgICAgICB8IFdBUk46IG5vdGhpbmcgcmVmZXJzIHRvIHRoaXMgc2VjdGlvbi4KKyAgKzB4MDBGMCB8IDAwIDAwIDAwIDAwIDAwIEQ4IDhFIDQwIHwgICAgICAgICAgICAgIHwgLi4uLi4uLkAKKyAgKzB4MDBGOCB8IDAwIDAwIDAwIDAwIDZBIEZFIEZGIEZGIHwgICAgICAgICAgICAgIHwgLi4uLmouLi4KKyAgKzB4MDEwMCB8IDAwIDAwIDAwIDAzICAgICAgICAgICAgIHwgICAgICAgICAgICAgIHwgLi4uLgorCit2dGFibGUgKEFubm90YXRlZEJpbmFyeS5CYXopOgorICArMHgwMTA0IHwgMDQgMDAgICAgICAgICAgICAgICAgICAgfCB1aW50MTZfdCAgICAgfCAweDAwMDQgKDQpICAgICAgICAgICAgICAgICAgICAgfCBzaXplIG9mIHRoaXMgdnRhYmxlCisgICsweDAxMDYgfCAwNCAwMCAgICAgICAgICAgICAgICAgICB8IHVpbnQxNl90ICAgICB8IDB4MDAwNCAoNCkgICAgICAgICAgICAgICAgICAgICB8IHNpemUgb2YgcmVmZXJyaW5nIHRhYmxlCisKK3RhYmxlIChBbm5vdGF0ZWRCaW5hcnkuQmF6KToKKyAgKzB4MDEwOCB8IDA0IDAwIDAwIDAwICAgICAgICAgICAgIHwgU09mZnNldDMyICAgIHwgMHgwMDAwMDAwNCAoNCkgTG9jOiArMHgwMTA0ICAgIHwgb2Zmc2V0IHRvIHZ0YWJsZQorCit0YWJsZSAoQW5ub3RhdGVkQmluYXJ5LkJhcik6CisgICsweDAxMEMgfCBGQSBGRSBGRiBGRiAgICAgICAgICAgICB8IFNPZmZzZXQzMiAgICB8IDB4RkZGRkZFRkEgKC0yNjIpIExvYzogKzB4MDIxMiB8IEVSUk9SOiBvZmZzZXQgdG8gdnRhYmxlLiBJbnZhbGlkIG9mZnNldCwgcG9pbnRzIG91dHNpZGUgdGhlIGJpbmFyeS4KKwordW5rbm93biAobm8ga25vd24gcmVmZXJlbmNlcyk6CisgICsweDAxMTAgfCAwMCAwMCBFNCA0MyAxMCAwMCAwMCAwMCB8ID91aW50OF90WzI4XSB8IC4uLkMuLi4uICAgICAgICAgICAgICAgICAgICAgICB8IFdBUk46IG5vdGhpbmcgcmVmZXJzIHRvIHRoaXMgc2VjdGlvbi4KKyAgKzB4MDExOCB8IDAwIDAwIDAwIDAwIDAwIEMwIDVFIDQwIHwgICAgICAgICAgICAgIHwgLi4uLi4uXkAKKyAgKzB4MDEyMCB8IDAwIDAwIDAwIDAwIDkyIEZFIEZGIEZGIHwgICAgICAgICAgICAgIHwgLi4uLi4uLi4KKyAgKzB4MDEyOCB8IDAwIDAwIDAwIDAxICAgICAgICAgICAgIHwgICAgICAgICAgICAgIHwgLi4uLgorCit2ZWN0b3IgKEFubm90YXRlZEJpbmFyeS5Gb28uZm9vYmFyc190eXBlKToKKyAgKzB4MDEyQyB8IDAzIDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgIHwgMHgwMDAwMDAwMyAoMykgICAgICAgICAgICAgICAgIHwgbGVuZ3RoIG9mIHZlY3RvciAoIyBpdGVtcykKKyAgKzB4MDEzMCB8IDAxICAgICAgICAgICAgICAgICAgICAgIHwgVVR5cGU4ICAgICAgIHwgMHgwMSAoMSkgICAgICAgICAgICAgICAgICAgICAgIHwgdmFsdWVbMF0KKyAgKzB4MDEzMSB8IDAyICAgICAgICAgICAgICAgICAgICAgIHwgVVR5cGU4ICAgICAgIHwgMHgwMiAoMikgICAgICAgICAgICAgICAgICAgICAgIHwgdmFsdWVbMV0KKyAgKzB4MDEzMiB8IDAxICAgICAgICAgICAgICAgICAgICAgIHwgVVR5cGU4ICAgICAgIHwgMHgwMSAoMSkgICAgICAgICAgICAgICAgICAgICAgIHwgdmFsdWVbMl0KKwordmVjdG9yIChBbm5vdGF0ZWRCaW5hcnkuRm9vLnBvaW50c19vZl9pbnRlcmVzdCk6CisgICsweDAxMzQgfCAwMyAwMCAgICAgICAgICAgICAgICAgICB8ID91aW50OF90WzJdICB8IC4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEVSUk9SOiBsZW5ndGggb2YgdmVjdG9yICgjIGl0ZW1zKS4gSW5jb21wbGV0ZSBiaW5hcnksIGV4cGVjdGVkIHRvIHJlYWQgNCBieXRlcy4KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL2Fubm90YXRlZF9iaW5hcnkvdGVzdHMvaW52YWxpZF92ZWN0b3JfbGVuZ3RoX2N1dF9zaG9ydC5iaW4gYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9hbm5vdGF0ZWRfYmluYXJ5L3Rlc3RzL2ludmFsaWRfdmVjdG9yX2xlbmd0aF9jdXRfc2hvcnQuYmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJkNjIyZGEKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9hbm5vdGF0ZWRfYmluYXJ5L3Rlc3RzL2ludmFsaWRfdmVjdG9yX2xlbmd0aF9jdXRfc2hvcnQuYmluCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL2Fubm90YXRlZF9iaW5hcnkvdGVzdHMvaW52YWxpZF92ZWN0b3Jfc2NhbGFyc19jdXRfc2hvcnQuYWZiIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvYW5ub3RhdGVkX2JpbmFyeS90ZXN0cy9pbnZhbGlkX3ZlY3Rvcl9zY2FsYXJzX2N1dF9zaG9ydC5hZmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzYxOTg3YQotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL2Fubm90YXRlZF9iaW5hcnkvdGVzdHMvaW52YWxpZF92ZWN0b3Jfc2NhbGFyc19jdXRfc2hvcnQuYWZiCkBAIC0wLDAgKzEsMTkwIEBACisvLyBBbm5vdGF0ZWQgRmxhdGJ1ZmZlciBCaW5hcnkKKy8vCisvLyBTY2hlbWEgZmlsZTogYW5ub3RhdGVkX2JpbmFyeS5mYnMKKy8vIEJpbmFyeSBmaWxlOiB0ZXN0cy9pbnZhbGlkX3ZlY3Rvcl9zY2FsYXJzX2N1dF9zaG9ydC5iaW4KKworaGVhZGVyOgorICArMHgwMDAwIHwgNDQgMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICAgfCAweDAwMDAwMDQ0ICg2OCkgTG9jOiArMHgwMDQ0ICAgfCBvZmZzZXQgdG8gcm9vdCB0YWJsZSBgQW5ub3RhdGVkQmluYXJ5LkZvb2AKKyAgKzB4MDAwNCB8IDQxIDRFIDRFIDRGICAgICAgICAgICAgIHwgY2hhcls0XSAgICAgIHwgQU5OTyAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgRmlsZSBJZGVudGlmaWVyCisKK3BhZGRpbmc6CisgICsweDAwMDggfCAwMCAwMCAgICAgICAgICAgICAgICAgICB8IHVpbnQ4X3RbMl0gICB8IC4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHBhZGRpbmcKKwordnRhYmxlIChBbm5vdGF0ZWRCaW5hcnkuRm9vKToKKyAgKzB4MDAwQSB8IDNBIDAwICAgICAgICAgICAgICAgICAgIHwgdWludDE2X3QgICAgIHwgMHgwMDNBICg1OCkgICAgICAgICAgICAgICAgICAgIHwgc2l6ZSBvZiB0aGlzIHZ0YWJsZQorICArMHgwMDBDIHwgNjggMDAgICAgICAgICAgICAgICAgICAgfCB1aW50MTZfdCAgICAgfCAweDAwNjggKDEwNCkgICAgICAgICAgICAgICAgICAgfCBzaXplIG9mIHJlZmVycmluZyB0YWJsZQorICArMHgwMDBFIHwgMEMgMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgICAgfCAweDAwMEMgKDEyKSAgICAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYGNvdW50ZXJgIChpZDogMCkKKyAgKzB4MDAxMCB8IDA3IDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgIHwgMHgwMDA3ICg3KSAgICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBoZWFsdGh5YCAoaWQ6IDEpCisgICsweDAwMTIgfCAwMCAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgICB8IDB4MDAwMCAoMCkgICAgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgbGV2ZWxgIChpZDogMikgPGRlZmF1bHRzIHRvIDk5PiAoTG9uZykKKyAgKzB4MDAxNCB8IDA4IDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgIHwgMHgwMDA4ICg4KSAgICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBtZWFsYCAoaWQ6IDMpCisgICsweDAwMTYgfCAxMCAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgICB8IDB4MDAxMCAoMTYpICAgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgYmFyYCAoaWQ6IDQpCisgICsweDAwMTggfCAxNCAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgICB8IDB4MDAxNCAoMjApICAgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgaG9tZWAgKGlkOiA1KQorICArMHgwMDFBIHwgMzAgMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgICAgfCAweDAwMzAgKDQ4KSAgICAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYG5hbWVgIChpZDogNikKKyAgKzB4MDAxQyB8IDM0IDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgIHwgMHgwMDM0ICg1MikgICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBiYXJzYCAoaWQ6IDcpCisgICsweDAwMUUgfCAwOSAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgICB8IDB4MDAwOSAoOSkgICAgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgYmFyX2Jhel90eXBlYCAoaWQ6IDgpCisgICsweDAwMjAgfCAzOCAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgICB8IDB4MDAzOCAoNTYpICAgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgYmFyX2JhemAgKGlkOiA5KQorICArMHgwMDIyIHwgM0MgMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgICAgfCAweDAwM0MgKDYwKSAgICAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYGFjY291bnRzYCAoaWQ6IDEwKQorICArMHgwMDI0IHwgNDAgMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgICAgfCAweDAwNDAgKDY0KSAgICAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYGJvYmAgKGlkOiAxMSkKKyAgKzB4MDAyNiB8IDQ0IDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgIHwgMHgwMDQ0ICg2OCkgICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBhbGljZWAgKGlkOiAxMikKKyAgKzB4MDAyOCB8IDAwIDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgIHwgMHgwMDAwICgwKSAgICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBtYXliZV9pMzJgIChpZDogMTMpIDxkZWZhdWx0cyB0byAwPiAoSW50KQorICArMHgwMDJBIHwgMDAgMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgICAgfCAweDAwMDAgKDApICAgICAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYGRlZmF1bHRfaTMyYCAoaWQ6IDE0KSA8ZGVmYXVsdHMgdG8gNDI+IChJbnQpCisgICsweDAwMkMgfCA0OCAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgICB8IDB4MDA0OCAoNzIpICAgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBganVzdF9pMzJgIChpZDogMTUpCisgICsweDAwMkUgfCA0QyAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgICB8IDB4MDA0QyAoNzYpICAgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgbmFtZXNgIChpZDogMTYpCisgICsweDAwMzAgfCA1MCAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgICB8IDB4MDA1MCAoODApICAgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgcG9pbnRzX29mX2ludGVyZXN0YCAoaWQ6IDE3KQorICArMHgwMDMyIHwgNTQgMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgICAgfCAweDAwNTQgKDg0KSAgICAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYGZvb2JhcnNfdHlwZWAgKGlkOiAxOCkKKyAgKzB4MDAzNCB8IDU4IDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgIHwgMHgwMDU4ICg4OCkgICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBmb29iYXJzYCAoaWQ6IDE5KQorICArMHgwMDM2IHwgMEEgMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgICAgfCAweDAwMEEgKDEwKSAgICAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYG1lYXN1cmVtZW50X3R5cGVgIChpZDogMjApCisgICsweDAwMzggfCA1QyAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgICB8IDB4MDA1QyAoOTIpICAgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgbWVhc3VyZW1lbnRgIChpZDogMjEpCisgICsweDAwM0EgfCAwQiAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgICB8IDB4MDAwQiAoMTEpICAgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgYW55dGhpbmdfdHlwZWAgKGlkOiAyMikKKyAgKzB4MDAzQyB8IDYwIDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgIHwgMHgwMDYwICg5NikgICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBhbnl0aGluZ2AgKGlkOiAyMykKKyAgKzB4MDAzRSB8IDAwIDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgIHwgMHgwMDAwICgwKSAgICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGB0ZW1wZXJhdHVyZWAgKGlkOiAyNCkgPGRlZmF1bHRzIHRvIDk4LjYwMDAwMD4gKEZsb2F0KQorICArMHgwMDQwIHwgMDAgMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgICAgfCAweDAwMDAgKDApICAgICAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYHRlZXRvdGFsZXJgIChpZDogMjUpIDxudWxsPiAoT2JqKQorICArMHgwMDQyIHwgNjQgMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgICAgfCAweDAwNjQgKDEwMCkgICAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYGNoYXJsaWVgIChpZDogMjYpCisKK3Jvb3RfdGFibGUgKEFubm90YXRlZEJpbmFyeS5Gb28pOgorICArMHgwMDQ0IHwgM0EgMDAgMDAgMDAgICAgICAgICAgICAgfCBTT2Zmc2V0MzIgICAgfCAweDAwMDAwMDNBICg1OCkgTG9jOiArMHgwMDBBICAgfCBvZmZzZXQgdG8gdnRhYmxlCisgICsweDAwNDggfCAwMCAwMCAwMCAgICAgICAgICAgICAgICB8IHVpbnQ4X3RbM10gICB8IC4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHBhZGRpbmcKKyAgKzB4MDA0QiB8IDAxICAgICAgICAgICAgICAgICAgICAgIHwgdWludDhfdCAgICAgIHwgMHgwMSAoMSkgICAgICAgICAgICAgICAgICAgICAgIHwgdGFibGUgZmllbGQgYGhlYWx0aHlgIChCb29sKQorICArMHgwMDRDIHwgMDIgICAgICAgICAgICAgICAgICAgICAgfCB1aW50OF90ICAgICAgfCAweDAyICgyKSAgICAgICAgICAgICAgICAgICAgICAgfCB0YWJsZSBmaWVsZCBgbWVhbGAgKEJ5dGUpCisgICsweDAwNEQgfCAwMiAgICAgICAgICAgICAgICAgICAgICB8IFVUeXBlOCAgICAgICB8IDB4MDIgKDIpICAgICAgICAgICAgICAgICAgICAgICB8IHRhYmxlIGZpZWxkIGBiYXJfYmF6X3R5cGVgIChVVHlwZSkKKyAgKzB4MDA0RSB8IDAxICAgICAgICAgICAgICAgICAgICAgIHwgVVR5cGU4ICAgICAgIHwgMHgwMSAoMSkgICAgICAgICAgICAgICAgICAgICAgIHwgdGFibGUgZmllbGQgYG1lYXN1cmVtZW50X3R5cGVgIChVVHlwZSkKKyAgKzB4MDA0RiB8IDAxICAgICAgICAgICAgICAgICAgICAgIHwgVVR5cGU4ICAgICAgIHwgMHgwMSAoMSkgICAgICAgICAgICAgICAgICAgICAgIHwgdGFibGUgZmllbGQgYGFueXRoaW5nX3R5cGVgIChVVHlwZSkKKyAgKzB4MDA1MCB8IEQyIDA0IDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgIHwgMHgwMDAwMDREMiAoMTIzNCkgICAgICAgICAgICAgIHwgdGFibGUgZmllbGQgYGNvdW50ZXJgIChJbnQpCisgICsweDAwNTQgfCAyOCAwMiAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgICB8IDB4MDAwMDAyMjggKDU1MikgTG9jOiArMHgwMjdDICB8IEVSUk9SOiBvZmZzZXQgdG8gZmllbGQgYGJhcmAuIEludmFsaWQgb2Zmc2V0LCBwb2ludHMgb3V0c2lkZSB0aGUgYmluYXJ5LgorICArMHgwMDU4IHwgMDEgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICAgfCAweDAwMDAwMDAxICgxKSAgICAgICAgICAgICAgICAgfCBzdHJ1Y3QgZmllbGQgYEFubm90YXRlZEJpbmFyeS5CdWlsZGluZy5mbG9vcnNgIChJbnQpCisgICsweDAwNUMgfCAwMiAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgICB8IDB4MDAwMDAwMDIgKDIpICAgICAgICAgICAgICAgICB8IHN0cnVjdCBmaWVsZCBgQW5ub3RhdGVkQmluYXJ5LkJ1aWxkaW5nLmRvb3JzYCAoSW50KQorICArMHgwMDYwIHwgMEMgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICAgfCAweDAwMDAwMDBDICgxMikgICAgICAgICAgICAgICAgfCBzdHJ1Y3QgZmllbGQgYEFubm90YXRlZEJpbmFyeS5CdWlsZGluZy53aW5kb3dzYCAoSW50KQorICArMHgwMDY0IHwgMEEgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICAgfCAweDAwMDAwMDBBICgxMCkgICAgICAgICAgICAgICAgfCBhcnJheSBmaWVsZCBgQW5ub3RhdGVkQmluYXJ5LkRpbWVuc2lvbi52YWx1ZXNgWzBdIChJbnQpCisgICsweDAwNjggfCAwQyAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgICB8IDB4MDAwMDAwMEMgKDEyKSAgICAgICAgICAgICAgICB8IGFycmF5IGZpZWxkIGBBbm5vdGF0ZWRCaW5hcnkuRGltZW5zaW9uLnZhbHVlc2BbMV0gKEludCkKKyAgKzB4MDA2QyB8IDE0IDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgIHwgMHgwMDAwMDAxNCAoMjApICAgICAgICAgICAgICAgIHwgYXJyYXkgZmllbGQgYEFubm90YXRlZEJpbmFyeS5EaW1lbnNpb24udmFsdWVzYFsyXSAoSW50KQorICArMHgwMDcwIHwgMDEgICAgICAgICAgICAgICAgICAgICAgfCB1aW50OF90ICAgICAgfCAweDAxICgxKSAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJ1Y3QgZmllbGQgYEFubm90YXRlZEJpbmFyeS5Ub2xlcmFuY2Uud2lkdGhgIChVQnl0ZSkKKyAgKzB4MDA3MSB8IDAyICAgICAgICAgICAgICAgICAgICAgIHwgdWludDhfdCAgICAgIHwgMHgwMiAoMikgICAgICAgICAgICAgICAgICAgICAgIHwgc3RydWN0IGZpZWxkIGBBbm5vdGF0ZWRCaW5hcnkuVG9sZXJhbmNlLndpZHRoYCAoVUJ5dGUpCisgICsweDAwNzIgfCAwMyAgICAgICAgICAgICAgICAgICAgICB8IHVpbnQ4X3QgICAgICB8IDB4MDMgKDMpICAgICAgICAgICAgICAgICAgICAgICB8IHN0cnVjdCBmaWVsZCBgQW5ub3RhdGVkQmluYXJ5LlRvbGVyYW5jZS53aWR0aGAgKFVCeXRlKQorICArMHgwMDczIHwgMDAgICAgICAgICAgICAgICAgICAgICAgfCB1aW50OF90WzFdICAgfCAuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBwYWRkaW5nCisgICsweDAwNzQgfCBDOCAwMSAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgICB8IDB4MDAwMDAxQzggKDQ1NikgTG9jOiArMHgwMjNDICB8IEVSUk9SOiBvZmZzZXQgdG8gZmllbGQgYG5hbWVgLiBJbnZhbGlkIG9mZnNldCwgcG9pbnRzIG91dHNpZGUgdGhlIGJpbmFyeS4KKyAgKzB4MDA3OCB8IDVDIDAxIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgIHwgMHgwMDAwMDE1QyAoMzQ4KSBMb2M6ICsweDAxRDQgIHwgRVJST1I6IG9mZnNldCB0byBmaWVsZCBgYmFyc2AuIEludmFsaWQgb2Zmc2V0LCBwb2ludHMgb3V0c2lkZSB0aGUgYmluYXJ5LgorICArMHgwMDdDIHwgNTAgMDEgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICAgfCAweDAwMDAwMTUwICgzMzYpIExvYzogKzB4MDFDQyAgfCBFUlJPUjogb2Zmc2V0IHRvIGZpZWxkIGBiYXJfYmF6YC4gSW52YWxpZCBvZmZzZXQsIHBvaW50cyBvdXRzaWRlIHRoZSBiaW5hcnkuCisgICsweDAwODAgfCAzNCAwMSAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgICB8IDB4MDAwMDAxMzQgKDMwOCkgTG9jOiArMHgwMUI0ICB8IG9mZnNldCB0byBmaWVsZCBgYWNjb3VudHNgICh2ZWN0b3IpCisgICsweDAwODQgfCAyNCAwMSAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgICB8IDB4MDAwMDAxMjQgKDI5MikgTG9jOiArMHgwMUE4ICB8IG9mZnNldCB0byBmaWVsZCBgYm9iYCAoc3RyaW5nKQorICArMHgwMDg4IHwgMTQgMDEgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICAgfCAweDAwMDAwMTE0ICgyNzYpIExvYzogKzB4MDE5QyAgfCBvZmZzZXQgdG8gZmllbGQgYGFsaWNlYCAoc3RyaW5nKQorICArMHgwMDhDIHwgMEQgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICAgfCAweDAwMDAwMDBEICgxMykgICAgICAgICAgICAgICAgfCB0YWJsZSBmaWVsZCBganVzdF9pMzJgIChJbnQpCisgICsweDAwOTAgfCBEQyAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgICB8IDB4MDAwMDAwREMgKDIyMCkgTG9jOiArMHgwMTZDICB8IG9mZnNldCB0byBmaWVsZCBgbmFtZXNgICh2ZWN0b3IpCisgICsweDAwOTQgfCBBMCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgICB8IDB4MDAwMDAwQTAgKDE2MCkgTG9jOiArMHgwMTM0ICB8IG9mZnNldCB0byBmaWVsZCBgcG9pbnRzX29mX2ludGVyZXN0YCAodmVjdG9yKQorICArMHgwMDk4IHwgOTQgMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICAgfCAweDAwMDAwMDk0ICgxNDgpIExvYzogKzB4MDEyQyAgfCBvZmZzZXQgdG8gZmllbGQgYGZvb2JhcnNfdHlwZWAgKHZlY3RvcikKKyAgKzB4MDA5QyB8IDM4IDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgIHwgMHgwMDAwMDAzOCAoNTYpIExvYzogKzB4MDBENCAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBmb29iYXJzYCAodmVjdG9yKQorICArMHgwMEEwIHwgMzMgMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICAgfCAweDAwMDAwMDMzICg1MSkgTG9jOiArMHgwMEQzICAgfCBvZmZzZXQgdG8gZmllbGQgYG1lYXN1cmVtZW50YCAodW5pb24gb2YgdHlwZSBgVG9sZXJhbmNlYCkKKyAgKzB4MDBBNCB8IDFDIDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgIHwgMHgwMDAwMDAxQyAoMjgpIExvYzogKzB4MDBDMCAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBhbnl0aGluZ2AgKHVuaW9uIG9mIHR5cGUgYEJhcmApCisgICsweDAwQTggfCAwNCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgICB8IDB4MDAwMDAwMDQgKDQpIExvYzogKzB4MDBBQyAgICB8IG9mZnNldCB0byBmaWVsZCBgY2hhcmxpZWAgKHN0cmluZykKKworc3RyaW5nIChBbm5vdGF0ZWRCaW5hcnkuRm9vLmNoYXJsaWUpOgorICArMHgwMEFDIHwgMDUgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICAgfCAweDAwMDAwMDA1ICg1KSAgICAgICAgICAgICAgICAgfCBsZW5ndGggb2Ygc3RyaW5nCisgICsweDAwQjAgfCA2MSA2QyA2OSA2MyA2NSAgICAgICAgICB8IGNoYXJbNV0gICAgICB8IGFsaWNlICAgICAgICAgICAgICAgICAgICAgICAgICB8IHN0cmluZyBsaXRlcmFsCisgICsweDAwQjUgfCAwMCAgICAgICAgICAgICAgICAgICAgICB8IGNoYXIgICAgICAgICB8IDB4MDAgKDApICAgICAgICAgICAgICAgICAgICAgICB8IHN0cmluZyB0ZXJtaW5hdG9yCisKK3BhZGRpbmc6CisgICsweDAwQjYgfCAwMCAwMCAgICAgICAgICAgICAgICAgICB8IHVpbnQ4X3RbMl0gICB8IC4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHBhZGRpbmcKKwordnRhYmxlIChBbm5vdGF0ZWRCaW5hcnkuQmFyKToKKyAgKzB4MDBCOCB8IDA4IDAwICAgICAgICAgICAgICAgICAgIHwgdWludDE2X3QgICAgIHwgMHgwMDA4ICg4KSAgICAgICAgICAgICAgICAgICAgIHwgc2l6ZSBvZiB0aGlzIHZ0YWJsZQorICArMHgwMEJBIHwgMTMgMDAgICAgICAgICAgICAgICAgICAgfCB1aW50MTZfdCAgICAgfCAweDAwMTMgKDE5KSAgICAgICAgICAgICAgICAgICAgfCBzaXplIG9mIHJlZmVycmluZyB0YWJsZQorICArMHgwMEJDIHwgMDggMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgICAgfCAweDAwMDggKDgpICAgICAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYGFgIChpZDogMCkKKyAgKzB4MDBCRSB8IDA0IDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgIHwgMHgwMDA0ICg0KSAgICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBiYCAoaWQ6IDEpCisKK3RhYmxlIChBbm5vdGF0ZWRCaW5hcnkuQmFyKToKKyAgKzB4MDBDMCB8IDA4IDAwIDAwIDAwICAgICAgICAgICAgIHwgU09mZnNldDMyICAgIHwgMHgwMDAwMDAwOCAoOCkgTG9jOiArMHgwMEI4ICAgIHwgb2Zmc2V0IHRvIHZ0YWJsZQorICArMHgwMEM0IHwgMDAgODAgMjMgNDQgICAgICAgICAgICAgfCBmbG9hdCAgICAgICAgfCAweDQ0MjM4MDAwICg2NTQpICAgICAgICAgICAgICAgfCB0YWJsZSBmaWVsZCBgYmAgKEZsb2F0KQorICArMHgwMEM4IHwgMDAgMDAgMDAgMDAgMDAgMTAgNzQgNDAgfCBkb3VibGUgICAgICAgfCAweDQwNzQxMDAwMDAwMDAwMDAgKDMyMSkgICAgICAgfCB0YWJsZSBmaWVsZCBgYWAgKERvdWJsZSkKKyAgKzB4MDBEMCB8IDAwIDAwIDAwICAgICAgICAgICAgICAgIHwgdWludDhfdFszXSAgIHwgLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgcGFkZGluZworCit1bmlvbiAoQW5ub3RhdGVkQmluYXJ5LlRvbGVyYW5jZS5tZWFzdXJlbWVudCk6CisgICsweDAwRDMgfCAwNSAgICAgICAgICAgICAgICAgICAgICB8IHVpbnQ4X3QgICAgICB8IDB4MDUgKDUpICAgICAgICAgICAgICAgICAgICAgICB8IHN0cnVjdCBmaWVsZCBgQW5ub3RhdGVkQmluYXJ5LlRvbGVyYW5jZS53aWR0aGAgKFVCeXRlKQorCit2ZWN0b3IgKEFubm90YXRlZEJpbmFyeS5Gb28uZm9vYmFycyk6CisgICsweDAwRDQgfCAwMyAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgICB8IDB4MDAwMDAwMDMgKDMpICAgICAgICAgICAgICAgICB8IGxlbmd0aCBvZiB2ZWN0b3IgKCMgaXRlbXMpCisgICsweDAwRDggfCAzNCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgICB8IDB4MDAwMDAwMzQgKDUyKSBMb2M6ICsweDAxMEMgICB8IG9mZnNldCB0byB1bmlvblswXSAoYEJhcmApCisgICsweDAwREMgfCAyQyAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgICB8IDB4MDAwMDAwMkMgKDQ0KSBMb2M6ICsweDAxMDggICB8IG9mZnNldCB0byB1bmlvblsxXSAoYEJhemApCisgICsweDAwRTAgfCAwNCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgICB8IDB4MDAwMDAwMDQgKDQpIExvYzogKzB4MDBFNCAgICB8IG9mZnNldCB0byB1bmlvblsyXSAoYEJhcmApCisKK3RhYmxlIChBbm5vdGF0ZWRCaW5hcnkuQmFyKToKKyAgKzB4MDBFNCB8IEQyIEZFIEZGIEZGICAgICAgICAgICAgIHwgU09mZnNldDMyICAgIHwgMHhGRkZGRkVEMiAoLTMwMikgTG9jOiArMHgwMjEyIHwgRVJST1I6IG9mZnNldCB0byB2dGFibGUuIEludmFsaWQgb2Zmc2V0LCBwb2ludHMgb3V0c2lkZSB0aGUgYmluYXJ5LgorCit1bmtub3duIChubyBrbm93biByZWZlcmVuY2VzKToKKyAgKzB4MDBFOCB8IDAwIDgwIDIzIDQ0IDEwIDAwIDAwIDAwIHwgP3VpbnQ4X3RbMjhdIHwgLi4jRC4uLi4gICAgICAgICAgICAgICAgICAgICAgIHwgV0FSTjogbm90aGluZyByZWZlcnMgdG8gdGhpcyBzZWN0aW9uLgorICArMHgwMEYwIHwgMDAgMDAgMDAgMDAgMDAgRDggOEUgNDAgfCAgICAgICAgICAgICAgfCAuLi4uLi4uQAorICArMHgwMEY4IHwgMDAgMDAgMDAgMDAgNkEgRkUgRkYgRkYgfCAgICAgICAgICAgICAgfCAuLi4uai4uLgorICArMHgwMTAwIHwgMDAgMDAgMDAgMDMgICAgICAgICAgICAgfCAgICAgICAgICAgICAgfCAuLi4uCisKK3Z0YWJsZSAoQW5ub3RhdGVkQmluYXJ5LkJheik6CisgICsweDAxMDQgfCAwNCAwMCAgICAgICAgICAgICAgICAgICB8IHVpbnQxNl90ICAgICB8IDB4MDAwNCAoNCkgICAgICAgICAgICAgICAgICAgICB8IHNpemUgb2YgdGhpcyB2dGFibGUKKyAgKzB4MDEwNiB8IDA0IDAwICAgICAgICAgICAgICAgICAgIHwgdWludDE2X3QgICAgIHwgMHgwMDA0ICg0KSAgICAgICAgICAgICAgICAgICAgIHwgc2l6ZSBvZiByZWZlcnJpbmcgdGFibGUKKwordGFibGUgKEFubm90YXRlZEJpbmFyeS5CYXopOgorICArMHgwMTA4IHwgMDQgMDAgMDAgMDAgICAgICAgICAgICAgfCBTT2Zmc2V0MzIgICAgfCAweDAwMDAwMDA0ICg0KSBMb2M6ICsweDAxMDQgICAgfCBvZmZzZXQgdG8gdnRhYmxlCisKK3RhYmxlIChBbm5vdGF0ZWRCaW5hcnkuQmFyKToKKyAgKzB4MDEwQyB8IEZBIEZFIEZGIEZGICAgICAgICAgICAgIHwgU09mZnNldDMyICAgIHwgMHhGRkZGRkVGQSAoLTI2MikgTG9jOiArMHgwMjEyIHwgRVJST1I6IG9mZnNldCB0byB2dGFibGUuIEludmFsaWQgb2Zmc2V0LCBwb2ludHMgb3V0c2lkZSB0aGUgYmluYXJ5LgorCit1bmtub3duIChubyBrbm93biByZWZlcmVuY2VzKToKKyAgKzB4MDExMCB8IDAwIDAwIEU0IDQzIDEwIDAwIDAwIDAwIHwgP3VpbnQ4X3RbMjhdIHwgLi4uQy4uLi4gICAgICAgICAgICAgICAgICAgICAgIHwgV0FSTjogbm90aGluZyByZWZlcnMgdG8gdGhpcyBzZWN0aW9uLgorICArMHgwMTE4IHwgMDAgMDAgMDAgMDAgMDAgQzAgNUUgNDAgfCAgICAgICAgICAgICAgfCAuLi4uLi5eQAorICArMHgwMTIwIHwgMDAgMDAgMDAgMDAgOTIgRkUgRkYgRkYgfCAgICAgICAgICAgICAgfCAuLi4uLi4uLgorICArMHgwMTI4IHwgMDAgMDAgMDAgMDEgICAgICAgICAgICAgfCAgICAgICAgICAgICAgfCAuLi4uCisKK3ZlY3RvciAoQW5ub3RhdGVkQmluYXJ5LkZvby5mb29iYXJzX3R5cGUpOgorICArMHgwMTJDIHwgMDMgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICAgfCAweDAwMDAwMDAzICgzKSAgICAgICAgICAgICAgICAgfCBsZW5ndGggb2YgdmVjdG9yICgjIGl0ZW1zKQorICArMHgwMTMwIHwgMDEgICAgICAgICAgICAgICAgICAgICAgfCBVVHlwZTggICAgICAgfCAweDAxICgxKSAgICAgICAgICAgICAgICAgICAgICAgfCB2YWx1ZVswXQorICArMHgwMTMxIHwgMDIgICAgICAgICAgICAgICAgICAgICAgfCBVVHlwZTggICAgICAgfCAweDAyICgyKSAgICAgICAgICAgICAgICAgICAgICAgfCB2YWx1ZVsxXQorICArMHgwMTMyIHwgMDEgICAgICAgICAgICAgICAgICAgICAgfCBVVHlwZTggICAgICAgfCAweDAxICgxKSAgICAgICAgICAgICAgICAgICAgICAgfCB2YWx1ZVsyXQorCit2ZWN0b3IgKEFubm90YXRlZEJpbmFyeS5Gb28ucG9pbnRzX29mX2ludGVyZXN0KToKKyAgKzB4MDEzNCB8IDAzIDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgIHwgMHgwMDAwMDAwMyAoMykgICAgICAgICAgICAgICAgIHwgbGVuZ3RoIG9mIHZlY3RvciAoIyBpdGVtcykKKyAgKzB4MDEzOCB8IDMzIDMzIDMzIDMzIDMzIEEzIDQ1IDQwIHwgZG91YmxlICAgICAgIHwgMHg0MDQ1QTMzMzMzMzMzMzMzICg0My4yNzUpICAgIHwgc3RydWN0IGZpZWxkIGBBbm5vdGF0ZWRCaW5hcnkuTG9jYXRpb24ubGF0aXR1ZGVgIChEb3VibGUpCisgICsweDAxNDAgfCA3RSA1NyAwNCBGRiA1QiA4NyA1MyBDMCB8IGRvdWJsZSAgICAgICB8IDB4QzA1Mzg3NUJGRjA0NTc3RSAoLTc4LjExNSkgICB8IHN0cnVjdCBmaWVsZCBgQW5ub3RhdGVkQmluYXJ5LkxvY2F0aW9uLmxvbmdpdHVkZWAgKERvdWJsZSkKKyAgKzB4MDE0OCB8IDhEIEYwIEY2IDIwIDA0IEI2IDQyIDQwIHwgZG91YmxlICAgICAgIHwgMHg0MDQyQjYwNDIwRjZGMDhEICgzNy40MjIpICAgIHwgc3RydWN0IGZpZWxkIGBBbm5vdGF0ZWRCaW5hcnkuTG9jYXRpb24ubGF0aXR1ZGVgIChEb3VibGUpCisgICsweDAxNTAgfCA5RiA3NyA2MyA0MSA2MSA4NSA1RSBDMCB8IGRvdWJsZSAgICAgICB8IDB4QzA1RTg1NjE0MTYzNzc5RiAoLTEyMi4wODQpICB8IHN0cnVjdCBmaWVsZCBgQW5ub3RhdGVkQmluYXJ5LkxvY2F0aW9uLmxvbmdpdHVkZWAgKERvdWJsZSkKKyAgKzB4MDE1OCB8IDhGIDM1IDIzIDgzIERDIDM1IDRCIEMwIHwgZG91YmxlICAgICAgIHwgMHhDMDRCMzVEQzgzMjMzNThGICgtNTQuNDIwOCkgIHwgc3RydWN0IGZpZWxkIGBBbm5vdGF0ZWRCaW5hcnkuTG9jYXRpb24ubGF0aXR1ZGVgIChEb3VibGUpCisgICsweDAxNjAgfCBGNiA5NyBERCA5MyA4NyBDNSAwQSA0MCB8IGRvdWJsZSAgICAgICB8IDB4NDAwQUM1ODc5M0REOTdGNiAoMy4zNDY0NSkgICB8IHN0cnVjdCBmaWVsZCBgQW5ub3RhdGVkQmluYXJ5LkxvY2F0aW9uLmxvbmdpdHVkZWAgKERvdWJsZSkKKworcGFkZGluZzoKKyAgKzB4MDE2OCB8IDAwIDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDhfdFs0XSAgIHwgLi4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgcGFkZGluZworCit2ZWN0b3IgKEFubm90YXRlZEJpbmFyeS5Gb28ubmFtZXMpOgorICArMHgwMTZDIHwgMDMgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICAgfCAweDAwMDAwMDAzICgzKSAgICAgICAgICAgICAgICAgfCBsZW5ndGggb2YgdmVjdG9yICgjIGl0ZW1zKQorICArMHgwMTcwIHwgMjAgMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICAgfCAweDAwMDAwMDIwICgzMikgTG9jOiArMHgwMTkwICAgfCBvZmZzZXQgdG8gc3RyaW5nWzBdCisgICsweDAxNzQgfCAxNCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgICB8IDB4MDAwMDAwMTQgKDIwKSBMb2M6ICsweDAxODggICB8IG9mZnNldCB0byBzdHJpbmdbMV0KKyAgKzB4MDE3OCB8IDA0IDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgIHwgMHgwMDAwMDAwNCAoNCkgTG9jOiArMHgwMTdDICAgIHwgb2Zmc2V0IHRvIHN0cmluZ1syXQorCitzdHJpbmcgKEFubm90YXRlZEJpbmFyeS5Gb28ubmFtZXMpOgorICArMHgwMTdDIHwgMDcgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICAgfCAweDAwMDAwMDA3ICg3KSAgICAgICAgICAgICAgICAgfCBsZW5ndGggb2Ygc3RyaW5nCisgICsweDAxODAgfCA2MyA2OCA2MSA3MiA2QyA2OSA2NSAgICB8IGNoYXJbN10gICAgICB8IGNoYXJsaWUgICAgICAgICAgICAgICAgICAgICAgICB8IHN0cmluZyBsaXRlcmFsCisgICsweDAxODcgfCAwMCAgICAgICAgICAgICAgICAgICAgICB8IGNoYXIgICAgICAgICB8IDB4MDAgKDApICAgICAgICAgICAgICAgICAgICAgICB8IHN0cmluZyB0ZXJtaW5hdG9yCisKK3N0cmluZyAoQW5ub3RhdGVkQmluYXJ5LkZvby5uYW1lcyk6CisgICsweDAxODggfCAwMyAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgICB8IDB4MDAwMDAwMDMgKDMpICAgICAgICAgICAgICAgICB8IGxlbmd0aCBvZiBzdHJpbmcKKyAgKzB4MDE4QyB8IDYyIDZGIDYyICAgICAgICAgICAgICAgIHwgY2hhclszXSAgICAgIHwgYm9iICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nIGxpdGVyYWwKKyAgKzB4MDE4RiB8IDAwICAgICAgICAgICAgICAgICAgICAgIHwgY2hhciAgICAgICAgIHwgMHgwMCAoMCkgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nIHRlcm1pbmF0b3IKKworc3RyaW5nIChBbm5vdGF0ZWRCaW5hcnkuRm9vLm5hbWVzKToKKyAgKzB4MDE5MCB8IDA1IDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgIHwgMHgwMDAwMDAwNSAoNSkgICAgICAgICAgICAgICAgIHwgbGVuZ3RoIG9mIHN0cmluZworICArMHgwMTk0IHwgNjEgNkMgNjkgNjMgNjUgICAgICAgICAgfCBjaGFyWzVdICAgICAgfCBhbGljZSAgICAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJpbmcgbGl0ZXJhbAorICArMHgwMTk5IHwgMDAgICAgICAgICAgICAgICAgICAgICAgfCBjaGFyICAgICAgICAgfCAweDAwICgwKSAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJpbmcgdGVybWluYXRvcgorCitwYWRkaW5nOgorICArMHgwMTlBIHwgMDAgMDAgICAgICAgICAgICAgICAgICAgfCB1aW50OF90WzJdICAgfCAuLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBwYWRkaW5nCisKK3N0cmluZyAoQW5ub3RhdGVkQmluYXJ5LkZvby5hbGljZSk6CisgICsweDAxOUMgfCAwNyAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgICB8IDB4MDAwMDAwMDcgKDcpICAgICAgICAgICAgICAgICB8IGxlbmd0aCBvZiBzdHJpbmcKKyAgKzB4MDFBMCB8IDYzIDY4IDYxIDcyIDZDIDY5IDY1ICAgIHwgY2hhcls3XSAgICAgIHwgY2hhcmxpZSAgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nIGxpdGVyYWwKKyAgKzB4MDFBNyB8IDAwICAgICAgICAgICAgICAgICAgICAgIHwgY2hhciAgICAgICAgIHwgMHgwMCAoMCkgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nIHRlcm1pbmF0b3IKKworc3RyaW5nIChBbm5vdGF0ZWRCaW5hcnkuRm9vLmJvYik6CisgICsweDAxQTggfCAwNyAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgICB8IDB4MDAwMDAwMDcgKDcpICAgICAgICAgICAgICAgICB8IGxlbmd0aCBvZiBzdHJpbmcKKyAgKzB4MDFBQyB8IDYzIDY4IDYxIDcyIDZDIDY5IDY1ICAgIHwgY2hhcls3XSAgICAgIHwgY2hhcmxpZSAgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nIGxpdGVyYWwKKyAgKzB4MDFCMyB8IDAwICAgICAgICAgICAgICAgICAgICAgIHwgY2hhciAgICAgICAgIHwgMHgwMCAoMCkgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nIHRlcm1pbmF0b3IKKwordmVjdG9yIChBbm5vdGF0ZWRCaW5hcnkuRm9vLmFjY291bnRzKToKKyAgKzB4MDFCNCB8IDA5IDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgIHwgMHgwMDAwMDAwOSAoOSkgICAgICAgICAgICAgICAgIHwgRVJST1I6IGxlbmd0aCBvZiB2ZWN0b3IgKCMgaXRlbXMpLiBMb25nZXIgdGhhbiB0aGUgYmluYXJ5LgorCit1bmtub3duIChubyBrbm93biByZWZlcmVuY2VzKToKKyAgKzB4MDFCOCB8IDA5IDAwIDA4IDAwIDA3IDAwIDAxIDAwIHwgP3VpbnQ4X3RbOV0gIHwgLi4uLi4uLi4gICAgICAgICAgICAgICAgICAgICAgIHwgV0FSTjogbm90aGluZyByZWZlcnMgdG8gdGhpcyBzZWN0aW9uLgorICArMHgwMUMwIHwgMDIgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgfCAuCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9hbm5vdGF0ZWRfYmluYXJ5L3Rlc3RzL2ludmFsaWRfdmVjdG9yX3NjYWxhcnNfY3V0X3Nob3J0LmJpbiBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL2Fubm90YXRlZF9iaW5hcnkvdGVzdHMvaW52YWxpZF92ZWN0b3Jfc2NhbGFyc19jdXRfc2hvcnQuYmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc5ZGM3OTYKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9hbm5vdGF0ZWRfYmluYXJ5L3Rlc3RzL2ludmFsaWRfdmVjdG9yX3NjYWxhcnNfY3V0X3Nob3J0LmJpbgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9hbm5vdGF0ZWRfYmluYXJ5L3Rlc3RzL2ludmFsaWRfdmVjdG9yX3N0cmluZ3NfY3V0X3Nob3J0LmFmYiBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL2Fubm90YXRlZF9iaW5hcnkvdGVzdHMvaW52YWxpZF92ZWN0b3Jfc3RyaW5nc19jdXRfc2hvcnQuYWZiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhmMTdmNGUKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9hbm5vdGF0ZWRfYmluYXJ5L3Rlc3RzL2ludmFsaWRfdmVjdG9yX3N0cmluZ3NfY3V0X3Nob3J0LmFmYgpAQCAtMCwwICsxLDE1NSBAQAorLy8gQW5ub3RhdGVkIEZsYXRidWZmZXIgQmluYXJ5CisvLworLy8gU2NoZW1hIGZpbGU6IGFubm90YXRlZF9iaW5hcnkuZmJzCisvLyBCaW5hcnkgZmlsZTogdGVzdHMvaW52YWxpZF92ZWN0b3Jfc3RyaW5nc19jdXRfc2hvcnQuYmluCisKK2hlYWRlcjoKKyAgKzB4MDAwMCB8IDQ0IDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgIHwgMHgwMDAwMDA0NCAoNjgpIExvYzogKzB4MDA0NCAgIHwgb2Zmc2V0IHRvIHJvb3QgdGFibGUgYEFubm90YXRlZEJpbmFyeS5Gb29gCisgICsweDAwMDQgfCA0MSA0RSA0RSA0RiAgICAgICAgICAgICB8IGNoYXJbNF0gICAgICB8IEFOTk8gICAgICAgICAgICAgICAgICAgICAgICAgICB8IEZpbGUgSWRlbnRpZmllcgorCitwYWRkaW5nOgorICArMHgwMDA4IHwgMDAgMDAgICAgICAgICAgICAgICAgICAgfCB1aW50OF90WzJdICAgfCAuLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBwYWRkaW5nCisKK3Z0YWJsZSAoQW5ub3RhdGVkQmluYXJ5LkZvbyk6CisgICsweDAwMEEgfCAzQSAwMCAgICAgICAgICAgICAgICAgICB8IHVpbnQxNl90ICAgICB8IDB4MDAzQSAoNTgpICAgICAgICAgICAgICAgICAgICB8IHNpemUgb2YgdGhpcyB2dGFibGUKKyAgKzB4MDAwQyB8IDY4IDAwICAgICAgICAgICAgICAgICAgIHwgdWludDE2X3QgICAgIHwgMHgwMDY4ICgxMDQpICAgICAgICAgICAgICAgICAgIHwgc2l6ZSBvZiByZWZlcnJpbmcgdGFibGUKKyAgKzB4MDAwRSB8IDBDIDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgIHwgMHgwMDBDICgxMikgICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBjb3VudGVyYCAoaWQ6IDApCisgICsweDAwMTAgfCAwNyAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgICB8IDB4MDAwNyAoNykgICAgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgaGVhbHRoeWAgKGlkOiAxKQorICArMHgwMDEyIHwgMDAgMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgICAgfCAweDAwMDAgKDApICAgICAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYGxldmVsYCAoaWQ6IDIpIDxkZWZhdWx0cyB0byA5OT4gKExvbmcpCisgICsweDAwMTQgfCAwOCAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgICB8IDB4MDAwOCAoOCkgICAgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgbWVhbGAgKGlkOiAzKQorICArMHgwMDE2IHwgMTAgMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgICAgfCAweDAwMTAgKDE2KSAgICAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYGJhcmAgKGlkOiA0KQorICArMHgwMDE4IHwgMTQgMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgICAgfCAweDAwMTQgKDIwKSAgICAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYGhvbWVgIChpZDogNSkKKyAgKzB4MDAxQSB8IDMwIDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgIHwgMHgwMDMwICg0OCkgICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBuYW1lYCAoaWQ6IDYpCisgICsweDAwMUMgfCAzNCAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgICB8IDB4MDAzNCAoNTIpICAgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgYmFyc2AgKGlkOiA3KQorICArMHgwMDFFIHwgMDkgMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgICAgfCAweDAwMDkgKDkpICAgICAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYGJhcl9iYXpfdHlwZWAgKGlkOiA4KQorICArMHgwMDIwIHwgMzggMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgICAgfCAweDAwMzggKDU2KSAgICAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYGJhcl9iYXpgIChpZDogOSkKKyAgKzB4MDAyMiB8IDNDIDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgIHwgMHgwMDNDICg2MCkgICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBhY2NvdW50c2AgKGlkOiAxMCkKKyAgKzB4MDAyNCB8IDQwIDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgIHwgMHgwMDQwICg2NCkgICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBib2JgIChpZDogMTEpCisgICsweDAwMjYgfCA0NCAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgICB8IDB4MDA0NCAoNjgpICAgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgYWxpY2VgIChpZDogMTIpCisgICsweDAwMjggfCAwMCAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgICB8IDB4MDAwMCAoMCkgICAgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgbWF5YmVfaTMyYCAoaWQ6IDEzKSA8ZGVmYXVsdHMgdG8gMD4gKEludCkKKyAgKzB4MDAyQSB8IDAwIDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgIHwgMHgwMDAwICgwKSAgICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBkZWZhdWx0X2kzMmAgKGlkOiAxNCkgPGRlZmF1bHRzIHRvIDQyPiAoSW50KQorICArMHgwMDJDIHwgNDggMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgICAgfCAweDAwNDggKDcyKSAgICAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYGp1c3RfaTMyYCAoaWQ6IDE1KQorICArMHgwMDJFIHwgNEMgMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgICAgfCAweDAwNEMgKDc2KSAgICAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYG5hbWVzYCAoaWQ6IDE2KQorICArMHgwMDMwIHwgNTAgMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgICAgfCAweDAwNTAgKDgwKSAgICAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYHBvaW50c19vZl9pbnRlcmVzdGAgKGlkOiAxNykKKyAgKzB4MDAzMiB8IDU0IDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgIHwgMHgwMDU0ICg4NCkgICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBmb29iYXJzX3R5cGVgIChpZDogMTgpCisgICsweDAwMzQgfCA1OCAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgICB8IDB4MDA1OCAoODgpICAgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgZm9vYmFyc2AgKGlkOiAxOSkKKyAgKzB4MDAzNiB8IDBBIDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgIHwgMHgwMDBBICgxMCkgICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBtZWFzdXJlbWVudF90eXBlYCAoaWQ6IDIwKQorICArMHgwMDM4IHwgNUMgMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgICAgfCAweDAwNUMgKDkyKSAgICAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYG1lYXN1cmVtZW50YCAoaWQ6IDIxKQorICArMHgwMDNBIHwgMEIgMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgICAgfCAweDAwMEIgKDExKSAgICAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYGFueXRoaW5nX3R5cGVgIChpZDogMjIpCisgICsweDAwM0MgfCA2MCAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgICB8IDB4MDA2MCAoOTYpICAgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgYW55dGhpbmdgIChpZDogMjMpCisgICsweDAwM0UgfCAwMCAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgICB8IDB4MDAwMCAoMCkgICAgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgdGVtcGVyYXR1cmVgIChpZDogMjQpIDxkZWZhdWx0cyB0byA5OC42MDAwMDA+IChGbG9hdCkKKyAgKzB4MDA0MCB8IDAwIDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgIHwgMHgwMDAwICgwKSAgICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGB0ZWV0b3RhbGVyYCAoaWQ6IDI1KSA8bnVsbD4gKE9iaikKKyAgKzB4MDA0MiB8IDY0IDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgIHwgMHgwMDY0ICgxMDApICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBjaGFybGllYCAoaWQ6IDI2KQorCityb290X3RhYmxlIChBbm5vdGF0ZWRCaW5hcnkuRm9vKToKKyAgKzB4MDA0NCB8IDNBIDAwIDAwIDAwICAgICAgICAgICAgIHwgU09mZnNldDMyICAgIHwgMHgwMDAwMDAzQSAoNTgpIExvYzogKzB4MDAwQSAgIHwgb2Zmc2V0IHRvIHZ0YWJsZQorICArMHgwMDQ4IHwgMDAgMDAgMDAgICAgICAgICAgICAgICAgfCB1aW50OF90WzNdICAgfCAuLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBwYWRkaW5nCisgICsweDAwNEIgfCAwMSAgICAgICAgICAgICAgICAgICAgICB8IHVpbnQ4X3QgICAgICB8IDB4MDEgKDEpICAgICAgICAgICAgICAgICAgICAgICB8IHRhYmxlIGZpZWxkIGBoZWFsdGh5YCAoQm9vbCkKKyAgKzB4MDA0QyB8IDAyICAgICAgICAgICAgICAgICAgICAgIHwgdWludDhfdCAgICAgIHwgMHgwMiAoMikgICAgICAgICAgICAgICAgICAgICAgIHwgdGFibGUgZmllbGQgYG1lYWxgIChCeXRlKQorICArMHgwMDREIHwgMDIgICAgICAgICAgICAgICAgICAgICAgfCBVVHlwZTggICAgICAgfCAweDAyICgyKSAgICAgICAgICAgICAgICAgICAgICAgfCB0YWJsZSBmaWVsZCBgYmFyX2Jhel90eXBlYCAoVVR5cGUpCisgICsweDAwNEUgfCAwMSAgICAgICAgICAgICAgICAgICAgICB8IFVUeXBlOCAgICAgICB8IDB4MDEgKDEpICAgICAgICAgICAgICAgICAgICAgICB8IHRhYmxlIGZpZWxkIGBtZWFzdXJlbWVudF90eXBlYCAoVVR5cGUpCisgICsweDAwNEYgfCAwMSAgICAgICAgICAgICAgICAgICAgICB8IFVUeXBlOCAgICAgICB8IDB4MDEgKDEpICAgICAgICAgICAgICAgICAgICAgICB8IHRhYmxlIGZpZWxkIGBhbnl0aGluZ190eXBlYCAoVVR5cGUpCisgICsweDAwNTAgfCBEMiAwNCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgICB8IDB4MDAwMDA0RDIgKDEyMzQpICAgICAgICAgICAgICB8IHRhYmxlIGZpZWxkIGBjb3VudGVyYCAoSW50KQorICArMHgwMDU0IHwgMjggMDIgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICAgfCAweDAwMDAwMjI4ICg1NTIpIExvYzogKzB4MDI3QyAgfCBFUlJPUjogb2Zmc2V0IHRvIGZpZWxkIGBiYXJgLiBJbnZhbGlkIG9mZnNldCwgcG9pbnRzIG91dHNpZGUgdGhlIGJpbmFyeS4KKyAgKzB4MDA1OCB8IDAxIDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgIHwgMHgwMDAwMDAwMSAoMSkgICAgICAgICAgICAgICAgIHwgc3RydWN0IGZpZWxkIGBBbm5vdGF0ZWRCaW5hcnkuQnVpbGRpbmcuZmxvb3JzYCAoSW50KQorICArMHgwMDVDIHwgMDIgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICAgfCAweDAwMDAwMDAyICgyKSAgICAgICAgICAgICAgICAgfCBzdHJ1Y3QgZmllbGQgYEFubm90YXRlZEJpbmFyeS5CdWlsZGluZy5kb29yc2AgKEludCkKKyAgKzB4MDA2MCB8IDBDIDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgIHwgMHgwMDAwMDAwQyAoMTIpICAgICAgICAgICAgICAgIHwgc3RydWN0IGZpZWxkIGBBbm5vdGF0ZWRCaW5hcnkuQnVpbGRpbmcud2luZG93c2AgKEludCkKKyAgKzB4MDA2NCB8IDBBIDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgIHwgMHgwMDAwMDAwQSAoMTApICAgICAgICAgICAgICAgIHwgYXJyYXkgZmllbGQgYEFubm90YXRlZEJpbmFyeS5EaW1lbnNpb24udmFsdWVzYFswXSAoSW50KQorICArMHgwMDY4IHwgMEMgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICAgfCAweDAwMDAwMDBDICgxMikgICAgICAgICAgICAgICAgfCBhcnJheSBmaWVsZCBgQW5ub3RhdGVkQmluYXJ5LkRpbWVuc2lvbi52YWx1ZXNgWzFdIChJbnQpCisgICsweDAwNkMgfCAxNCAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgICB8IDB4MDAwMDAwMTQgKDIwKSAgICAgICAgICAgICAgICB8IGFycmF5IGZpZWxkIGBBbm5vdGF0ZWRCaW5hcnkuRGltZW5zaW9uLnZhbHVlc2BbMl0gKEludCkKKyAgKzB4MDA3MCB8IDAxICAgICAgICAgICAgICAgICAgICAgIHwgdWludDhfdCAgICAgIHwgMHgwMSAoMSkgICAgICAgICAgICAgICAgICAgICAgIHwgc3RydWN0IGZpZWxkIGBBbm5vdGF0ZWRCaW5hcnkuVG9sZXJhbmNlLndpZHRoYCAoVUJ5dGUpCisgICsweDAwNzEgfCAwMiAgICAgICAgICAgICAgICAgICAgICB8IHVpbnQ4X3QgICAgICB8IDB4MDIgKDIpICAgICAgICAgICAgICAgICAgICAgICB8IHN0cnVjdCBmaWVsZCBgQW5ub3RhdGVkQmluYXJ5LlRvbGVyYW5jZS53aWR0aGAgKFVCeXRlKQorICArMHgwMDcyIHwgMDMgICAgICAgICAgICAgICAgICAgICAgfCB1aW50OF90ICAgICAgfCAweDAzICgzKSAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJ1Y3QgZmllbGQgYEFubm90YXRlZEJpbmFyeS5Ub2xlcmFuY2Uud2lkdGhgIChVQnl0ZSkKKyAgKzB4MDA3MyB8IDAwICAgICAgICAgICAgICAgICAgICAgIHwgdWludDhfdFsxXSAgIHwgLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgcGFkZGluZworICArMHgwMDc0IHwgQzggMDEgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICAgfCAweDAwMDAwMUM4ICg0NTYpIExvYzogKzB4MDIzQyAgfCBFUlJPUjogb2Zmc2V0IHRvIGZpZWxkIGBuYW1lYC4gSW52YWxpZCBvZmZzZXQsIHBvaW50cyBvdXRzaWRlIHRoZSBiaW5hcnkuCisgICsweDAwNzggfCA1QyAwMSAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgICB8IDB4MDAwMDAxNUMgKDM0OCkgTG9jOiArMHgwMUQ0ICB8IEVSUk9SOiBvZmZzZXQgdG8gZmllbGQgYGJhcnNgLiBJbnZhbGlkIG9mZnNldCwgcG9pbnRzIG91dHNpZGUgdGhlIGJpbmFyeS4KKyAgKzB4MDA3QyB8IDUwIDAxIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgIHwgMHgwMDAwMDE1MCAoMzM2KSBMb2M6ICsweDAxQ0MgIHwgRVJST1I6IG9mZnNldCB0byBmaWVsZCBgYmFyX2JhemAuIEludmFsaWQgb2Zmc2V0LCBwb2ludHMgb3V0c2lkZSB0aGUgYmluYXJ5LgorICArMHgwMDgwIHwgMzQgMDEgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICAgfCAweDAwMDAwMTM0ICgzMDgpIExvYzogKzB4MDFCNCAgfCBFUlJPUjogb2Zmc2V0IHRvIGZpZWxkIGBhY2NvdW50c2AuIEludmFsaWQgb2Zmc2V0LCBwb2ludHMgb3V0c2lkZSB0aGUgYmluYXJ5LgorICArMHgwMDg0IHwgMjQgMDEgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICAgfCAweDAwMDAwMTI0ICgyOTIpIExvYzogKzB4MDFBOCAgfCBFUlJPUjogb2Zmc2V0IHRvIGZpZWxkIGBib2JgLiBJbnZhbGlkIG9mZnNldCwgcG9pbnRzIG91dHNpZGUgdGhlIGJpbmFyeS4KKyAgKzB4MDA4OCB8IDE0IDAxIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgIHwgMHgwMDAwMDExNCAoMjc2KSBMb2M6ICsweDAxOUMgIHwgRVJST1I6IG9mZnNldCB0byBmaWVsZCBgYWxpY2VgLiBJbnZhbGlkIG9mZnNldCwgcG9pbnRzIG91dHNpZGUgdGhlIGJpbmFyeS4KKyAgKzB4MDA4QyB8IDBEIDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgIHwgMHgwMDAwMDAwRCAoMTMpICAgICAgICAgICAgICAgIHwgdGFibGUgZmllbGQgYGp1c3RfaTMyYCAoSW50KQorICArMHgwMDkwIHwgREMgMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICAgfCAweDAwMDAwMERDICgyMjApIExvYzogKzB4MDE2QyAgfCBvZmZzZXQgdG8gZmllbGQgYG5hbWVzYCAodmVjdG9yKQorICArMHgwMDk0IHwgQTAgMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICAgfCAweDAwMDAwMEEwICgxNjApIExvYzogKzB4MDEzNCAgfCBvZmZzZXQgdG8gZmllbGQgYHBvaW50c19vZl9pbnRlcmVzdGAgKHZlY3RvcikKKyAgKzB4MDA5OCB8IDk0IDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgIHwgMHgwMDAwMDA5NCAoMTQ4KSBMb2M6ICsweDAxMkMgIHwgb2Zmc2V0IHRvIGZpZWxkIGBmb29iYXJzX3R5cGVgICh2ZWN0b3IpCisgICsweDAwOUMgfCAzOCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgICB8IDB4MDAwMDAwMzggKDU2KSBMb2M6ICsweDAwRDQgICB8IG9mZnNldCB0byBmaWVsZCBgZm9vYmFyc2AgKHZlY3RvcikKKyAgKzB4MDBBMCB8IDMzIDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgIHwgMHgwMDAwMDAzMyAoNTEpIExvYzogKzB4MDBEMyAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBtZWFzdXJlbWVudGAgKHVuaW9uIG9mIHR5cGUgYFRvbGVyYW5jZWApCisgICsweDAwQTQgfCAxQyAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgICB8IDB4MDAwMDAwMUMgKDI4KSBMb2M6ICsweDAwQzAgICB8IG9mZnNldCB0byBmaWVsZCBgYW55dGhpbmdgICh1bmlvbiBvZiB0eXBlIGBCYXJgKQorICArMHgwMEE4IHwgMDQgMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICAgfCAweDAwMDAwMDA0ICg0KSBMb2M6ICsweDAwQUMgICAgfCBvZmZzZXQgdG8gZmllbGQgYGNoYXJsaWVgIChzdHJpbmcpCisKK3N0cmluZyAoQW5ub3RhdGVkQmluYXJ5LkZvby5jaGFybGllKToKKyAgKzB4MDBBQyB8IDA1IDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgIHwgMHgwMDAwMDAwNSAoNSkgICAgICAgICAgICAgICAgIHwgbGVuZ3RoIG9mIHN0cmluZworICArMHgwMEIwIHwgNjEgNkMgNjkgNjMgNjUgICAgICAgICAgfCBjaGFyWzVdICAgICAgfCBhbGljZSAgICAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJpbmcgbGl0ZXJhbAorICArMHgwMEI1IHwgMDAgICAgICAgICAgICAgICAgICAgICAgfCBjaGFyICAgICAgICAgfCAweDAwICgwKSAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJpbmcgdGVybWluYXRvcgorCitwYWRkaW5nOgorICArMHgwMEI2IHwgMDAgMDAgICAgICAgICAgICAgICAgICAgfCB1aW50OF90WzJdICAgfCAuLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBwYWRkaW5nCisKK3Z0YWJsZSAoQW5ub3RhdGVkQmluYXJ5LkJhcik6CisgICsweDAwQjggfCAwOCAwMCAgICAgICAgICAgICAgICAgICB8IHVpbnQxNl90ICAgICB8IDB4MDAwOCAoOCkgICAgICAgICAgICAgICAgICAgICB8IHNpemUgb2YgdGhpcyB2dGFibGUKKyAgKzB4MDBCQSB8IDEzIDAwICAgICAgICAgICAgICAgICAgIHwgdWludDE2X3QgICAgIHwgMHgwMDEzICgxOSkgICAgICAgICAgICAgICAgICAgIHwgc2l6ZSBvZiByZWZlcnJpbmcgdGFibGUKKyAgKzB4MDBCQyB8IDA4IDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgIHwgMHgwMDA4ICg4KSAgICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBhYCAoaWQ6IDApCisgICsweDAwQkUgfCAwNCAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgICB8IDB4MDAwNCAoNCkgICAgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgYmAgKGlkOiAxKQorCit0YWJsZSAoQW5ub3RhdGVkQmluYXJ5LkJhcik6CisgICsweDAwQzAgfCAwOCAwMCAwMCAwMCAgICAgICAgICAgICB8IFNPZmZzZXQzMiAgICB8IDB4MDAwMDAwMDggKDgpIExvYzogKzB4MDBCOCAgICB8IG9mZnNldCB0byB2dGFibGUKKyAgKzB4MDBDNCB8IDAwIDgwIDIzIDQ0ICAgICAgICAgICAgIHwgZmxvYXQgICAgICAgIHwgMHg0NDIzODAwMCAoNjU0KSAgICAgICAgICAgICAgIHwgdGFibGUgZmllbGQgYGJgIChGbG9hdCkKKyAgKzB4MDBDOCB8IDAwIDAwIDAwIDAwIDAwIDEwIDc0IDQwIHwgZG91YmxlICAgICAgIHwgMHg0MDc0MTAwMDAwMDAwMDAwICgzMjEpICAgICAgIHwgdGFibGUgZmllbGQgYGFgIChEb3VibGUpCisgICsweDAwRDAgfCAwMCAwMCAwMCAgICAgICAgICAgICAgICB8IHVpbnQ4X3RbM10gICB8IC4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHBhZGRpbmcKKwordW5pb24gKEFubm90YXRlZEJpbmFyeS5Ub2xlcmFuY2UubWVhc3VyZW1lbnQpOgorICArMHgwMEQzIHwgMDUgICAgICAgICAgICAgICAgICAgICAgfCB1aW50OF90ICAgICAgfCAweDA1ICg1KSAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJ1Y3QgZmllbGQgYEFubm90YXRlZEJpbmFyeS5Ub2xlcmFuY2Uud2lkdGhgIChVQnl0ZSkKKwordmVjdG9yIChBbm5vdGF0ZWRCaW5hcnkuRm9vLmZvb2JhcnMpOgorICArMHgwMEQ0IHwgMDMgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICAgfCAweDAwMDAwMDAzICgzKSAgICAgICAgICAgICAgICAgfCBsZW5ndGggb2YgdmVjdG9yICgjIGl0ZW1zKQorICArMHgwMEQ4IHwgMzQgMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICAgfCAweDAwMDAwMDM0ICg1MikgTG9jOiArMHgwMTBDICAgfCBvZmZzZXQgdG8gdW5pb25bMF0gKGBCYXJgKQorICArMHgwMERDIHwgMkMgMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICAgfCAweDAwMDAwMDJDICg0NCkgTG9jOiArMHgwMTA4ICAgfCBvZmZzZXQgdG8gdW5pb25bMV0gKGBCYXpgKQorICArMHgwMEUwIHwgMDQgMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICAgfCAweDAwMDAwMDA0ICg0KSBMb2M6ICsweDAwRTQgICAgfCBvZmZzZXQgdG8gdW5pb25bMl0gKGBCYXJgKQorCit0YWJsZSAoQW5ub3RhdGVkQmluYXJ5LkJhcik6CisgICsweDAwRTQgfCBEMiBGRSBGRiBGRiAgICAgICAgICAgICB8IFNPZmZzZXQzMiAgICB8IDB4RkZGRkZFRDIgKC0zMDIpIExvYzogKzB4MDIxMiB8IEVSUk9SOiBvZmZzZXQgdG8gdnRhYmxlLiBJbnZhbGlkIG9mZnNldCwgcG9pbnRzIG91dHNpZGUgdGhlIGJpbmFyeS4KKwordW5rbm93biAobm8ga25vd24gcmVmZXJlbmNlcyk6CisgICsweDAwRTggfCAwMCA4MCAyMyA0NCAxMCAwMCAwMCAwMCB8ID91aW50OF90WzI4XSB8IC4uI0QuLi4uICAgICAgICAgICAgICAgICAgICAgICB8IFdBUk46IG5vdGhpbmcgcmVmZXJzIHRvIHRoaXMgc2VjdGlvbi4KKyAgKzB4MDBGMCB8IDAwIDAwIDAwIDAwIDAwIEQ4IDhFIDQwIHwgICAgICAgICAgICAgIHwgLi4uLi4uLkAKKyAgKzB4MDBGOCB8IDAwIDAwIDAwIDAwIDZBIEZFIEZGIEZGIHwgICAgICAgICAgICAgIHwgLi4uLmouLi4KKyAgKzB4MDEwMCB8IDAwIDAwIDAwIDAzICAgICAgICAgICAgIHwgICAgICAgICAgICAgIHwgLi4uLgorCit2dGFibGUgKEFubm90YXRlZEJpbmFyeS5CYXopOgorICArMHgwMTA0IHwgMDQgMDAgICAgICAgICAgICAgICAgICAgfCB1aW50MTZfdCAgICAgfCAweDAwMDQgKDQpICAgICAgICAgICAgICAgICAgICAgfCBzaXplIG9mIHRoaXMgdnRhYmxlCisgICsweDAxMDYgfCAwNCAwMCAgICAgICAgICAgICAgICAgICB8IHVpbnQxNl90ICAgICB8IDB4MDAwNCAoNCkgICAgICAgICAgICAgICAgICAgICB8IHNpemUgb2YgcmVmZXJyaW5nIHRhYmxlCisKK3RhYmxlIChBbm5vdGF0ZWRCaW5hcnkuQmF6KToKKyAgKzB4MDEwOCB8IDA0IDAwIDAwIDAwICAgICAgICAgICAgIHwgU09mZnNldDMyICAgIHwgMHgwMDAwMDAwNCAoNCkgTG9jOiArMHgwMTA0ICAgIHwgb2Zmc2V0IHRvIHZ0YWJsZQorCit0YWJsZSAoQW5ub3RhdGVkQmluYXJ5LkJhcik6CisgICsweDAxMEMgfCBGQSBGRSBGRiBGRiAgICAgICAgICAgICB8IFNPZmZzZXQzMiAgICB8IDB4RkZGRkZFRkEgKC0yNjIpIExvYzogKzB4MDIxMiB8IEVSUk9SOiBvZmZzZXQgdG8gdnRhYmxlLiBJbnZhbGlkIG9mZnNldCwgcG9pbnRzIG91dHNpZGUgdGhlIGJpbmFyeS4KKwordW5rbm93biAobm8ga25vd24gcmVmZXJlbmNlcyk6CisgICsweDAxMTAgfCAwMCAwMCBFNCA0MyAxMCAwMCAwMCAwMCB8ID91aW50OF90WzI4XSB8IC4uLkMuLi4uICAgICAgICAgICAgICAgICAgICAgICB8IFdBUk46IG5vdGhpbmcgcmVmZXJzIHRvIHRoaXMgc2VjdGlvbi4KKyAgKzB4MDExOCB8IDAwIDAwIDAwIDAwIDAwIEMwIDVFIDQwIHwgICAgICAgICAgICAgIHwgLi4uLi4uXkAKKyAgKzB4MDEyMCB8IDAwIDAwIDAwIDAwIDkyIEZFIEZGIEZGIHwgICAgICAgICAgICAgIHwgLi4uLi4uLi4KKyAgKzB4MDEyOCB8IDAwIDAwIDAwIDAxICAgICAgICAgICAgIHwgICAgICAgICAgICAgIHwgLi4uLgorCit2ZWN0b3IgKEFubm90YXRlZEJpbmFyeS5Gb28uZm9vYmFyc190eXBlKToKKyAgKzB4MDEyQyB8IDAzIDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgIHwgMHgwMDAwMDAwMyAoMykgICAgICAgICAgICAgICAgIHwgbGVuZ3RoIG9mIHZlY3RvciAoIyBpdGVtcykKKyAgKzB4MDEzMCB8IDAxICAgICAgICAgICAgICAgICAgICAgIHwgVVR5cGU4ICAgICAgIHwgMHgwMSAoMSkgICAgICAgICAgICAgICAgICAgICAgIHwgdmFsdWVbMF0KKyAgKzB4MDEzMSB8IDAyICAgICAgICAgICAgICAgICAgICAgIHwgVVR5cGU4ICAgICAgIHwgMHgwMiAoMikgICAgICAgICAgICAgICAgICAgICAgIHwgdmFsdWVbMV0KKyAgKzB4MDEzMiB8IDAxICAgICAgICAgICAgICAgICAgICAgIHwgVVR5cGU4ICAgICAgIHwgMHgwMSAoMSkgICAgICAgICAgICAgICAgICAgICAgIHwgdmFsdWVbMl0KKwordmVjdG9yIChBbm5vdGF0ZWRCaW5hcnkuRm9vLnBvaW50c19vZl9pbnRlcmVzdCk6CisgICsweDAxMzQgfCAwMyAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgICB8IDB4MDAwMDAwMDMgKDMpICAgICAgICAgICAgICAgICB8IGxlbmd0aCBvZiB2ZWN0b3IgKCMgaXRlbXMpCisgICsweDAxMzggfCAzMyAzMyAzMyAzMyAzMyBBMyA0NSA0MCB8IGRvdWJsZSAgICAgICB8IDB4NDA0NUEzMzMzMzMzMzMzMyAoNDMuMjc1KSAgICB8IHN0cnVjdCBmaWVsZCBgQW5ub3RhdGVkQmluYXJ5LkxvY2F0aW9uLmxhdGl0dWRlYCAoRG91YmxlKQorICArMHgwMTQwIHwgN0UgNTcgMDQgRkYgNUIgODcgNTMgQzAgfCBkb3VibGUgICAgICAgfCAweEMwNTM4NzVCRkYwNDU3N0UgKC03OC4xMTUpICAgfCBzdHJ1Y3QgZmllbGQgYEFubm90YXRlZEJpbmFyeS5Mb2NhdGlvbi5sb25naXR1ZGVgIChEb3VibGUpCisgICsweDAxNDggfCA4RCBGMCBGNiAyMCAwNCBCNiA0MiA0MCB8IGRvdWJsZSAgICAgICB8IDB4NDA0MkI2MDQyMEY2RjA4RCAoMzcuNDIyKSAgICB8IHN0cnVjdCBmaWVsZCBgQW5ub3RhdGVkQmluYXJ5LkxvY2F0aW9uLmxhdGl0dWRlYCAoRG91YmxlKQorICArMHgwMTUwIHwgOUYgNzcgNjMgNDEgNjEgODUgNUUgQzAgfCBkb3VibGUgICAgICAgfCAweEMwNUU4NTYxNDE2Mzc3OUYgKC0xMjIuMDg0KSAgfCBzdHJ1Y3QgZmllbGQgYEFubm90YXRlZEJpbmFyeS5Mb2NhdGlvbi5sb25naXR1ZGVgIChEb3VibGUpCisgICsweDAxNTggfCA4RiAzNSAyMyA4MyBEQyAzNSA0QiBDMCB8IGRvdWJsZSAgICAgICB8IDB4QzA0QjM1REM4MzIzMzU4RiAoLTU0LjQyMDgpICB8IHN0cnVjdCBmaWVsZCBgQW5ub3RhdGVkQmluYXJ5LkxvY2F0aW9uLmxhdGl0dWRlYCAoRG91YmxlKQorICArMHgwMTYwIHwgRjYgOTcgREQgOTMgODcgQzUgMEEgNDAgfCBkb3VibGUgICAgICAgfCAweDQwMEFDNTg3OTNERDk3RjYgKDMuMzQ2NDUpICAgfCBzdHJ1Y3QgZmllbGQgYEFubm90YXRlZEJpbmFyeS5Mb2NhdGlvbi5sb25naXR1ZGVgIChEb3VibGUpCisKK3BhZGRpbmc6CisgICsweDAxNjggfCAwMCAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQ4X3RbNF0gICB8IC4uLi4gICAgICAgICAgICAgICAgICAgICAgICAgICB8IHBhZGRpbmcKKwordmVjdG9yIChBbm5vdGF0ZWRCaW5hcnkuRm9vLm5hbWVzKToKKyAgKzB4MDE2QyB8IDAzIDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgIHwgMHgwMDAwMDAwMyAoMykgICAgICAgICAgICAgICAgIHwgRVJST1I6IGxlbmd0aCBvZiB2ZWN0b3IgKCMgaXRlbXMpLiBMb25nZXIgdGhhbiB0aGUgYmluYXJ5LgorCit1bmtub3duIChubyBrbm93biByZWZlcmVuY2VzKToKKyAgKzB4MDE3MCB8IDIwIDAwIDAwIDAwIDE0IDAwICAgICAgIHwgP3VpbnQ4X3RbNl0gIHwgIC4uLi4uICAgICAgICAgICAgICAgICAgICAgICAgIHwgV0FSTjogY291bGQgYmUgY29ycnVwdGVkIHBhZGRpbmcgcmVnaW9uLgpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvYW5ub3RhdGVkX2JpbmFyeS90ZXN0cy9pbnZhbGlkX3ZlY3Rvcl9zdHJpbmdzX2N1dF9zaG9ydC5iaW4gYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9hbm5vdGF0ZWRfYmluYXJ5L3Rlc3RzL2ludmFsaWRfdmVjdG9yX3N0cmluZ3NfY3V0X3Nob3J0LmJpbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MzRhYmExCi0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvYW5ub3RhdGVkX2JpbmFyeS90ZXN0cy9pbnZhbGlkX3ZlY3Rvcl9zdHJpbmdzX2N1dF9zaG9ydC5iaW4KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvYW5ub3RhdGVkX2JpbmFyeS90ZXN0cy9pbnZhbGlkX3ZlY3Rvcl9zdHJ1Y3RzX2N1dF9zaG9ydC5hZmIgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9hbm5vdGF0ZWRfYmluYXJ5L3Rlc3RzL2ludmFsaWRfdmVjdG9yX3N0cnVjdHNfY3V0X3Nob3J0LmFmYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNjJjNGRiCi0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvYW5ub3RhdGVkX2JpbmFyeS90ZXN0cy9pbnZhbGlkX3ZlY3Rvcl9zdHJ1Y3RzX2N1dF9zaG9ydC5hZmIKQEAgLTAsMCArMSwxNDYgQEAKKy8vIEFubm90YXRlZCBGbGF0YnVmZmVyIEJpbmFyeQorLy8KKy8vIFNjaGVtYSBmaWxlOiBhbm5vdGF0ZWRfYmluYXJ5LmZicworLy8gQmluYXJ5IGZpbGU6IHRlc3RzL2ludmFsaWRfdmVjdG9yX3N0cnVjdHNfY3V0X3Nob3J0LmJpbgorCitoZWFkZXI6CisgICsweDAwMDAgfCA0NCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgICB8IDB4MDAwMDAwNDQgKDY4KSBMb2M6ICsweDAwNDQgICB8IG9mZnNldCB0byByb290IHRhYmxlIGBBbm5vdGF0ZWRCaW5hcnkuRm9vYAorICArMHgwMDA0IHwgNDEgNEUgNEUgNEYgICAgICAgICAgICAgfCBjaGFyWzRdICAgICAgfCBBTk5PICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBGaWxlIElkZW50aWZpZXIKKworcGFkZGluZzoKKyAgKzB4MDAwOCB8IDAwIDAwICAgICAgICAgICAgICAgICAgIHwgdWludDhfdFsyXSAgIHwgLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgcGFkZGluZworCit2dGFibGUgKEFubm90YXRlZEJpbmFyeS5Gb28pOgorICArMHgwMDBBIHwgM0EgMDAgICAgICAgICAgICAgICAgICAgfCB1aW50MTZfdCAgICAgfCAweDAwM0EgKDU4KSAgICAgICAgICAgICAgICAgICAgfCBzaXplIG9mIHRoaXMgdnRhYmxlCisgICsweDAwMEMgfCA2OCAwMCAgICAgICAgICAgICAgICAgICB8IHVpbnQxNl90ICAgICB8IDB4MDA2OCAoMTA0KSAgICAgICAgICAgICAgICAgICB8IHNpemUgb2YgcmVmZXJyaW5nIHRhYmxlCisgICsweDAwMEUgfCAwQyAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgICB8IDB4MDAwQyAoMTIpICAgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgY291bnRlcmAgKGlkOiAwKQorICArMHgwMDEwIHwgMDcgMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgICAgfCAweDAwMDcgKDcpICAgICAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYGhlYWx0aHlgIChpZDogMSkKKyAgKzB4MDAxMiB8IDAwIDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgIHwgMHgwMDAwICgwKSAgICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBsZXZlbGAgKGlkOiAyKSA8ZGVmYXVsdHMgdG8gOTk+IChMb25nKQorICArMHgwMDE0IHwgMDggMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgICAgfCAweDAwMDggKDgpICAgICAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYG1lYWxgIChpZDogMykKKyAgKzB4MDAxNiB8IDEwIDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgIHwgMHgwMDEwICgxNikgICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBiYXJgIChpZDogNCkKKyAgKzB4MDAxOCB8IDE0IDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgIHwgMHgwMDE0ICgyMCkgICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBob21lYCAoaWQ6IDUpCisgICsweDAwMUEgfCAzMCAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgICB8IDB4MDAzMCAoNDgpICAgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgbmFtZWAgKGlkOiA2KQorICArMHgwMDFDIHwgMzQgMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgICAgfCAweDAwMzQgKDUyKSAgICAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYGJhcnNgIChpZDogNykKKyAgKzB4MDAxRSB8IDA5IDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgIHwgMHgwMDA5ICg5KSAgICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBiYXJfYmF6X3R5cGVgIChpZDogOCkKKyAgKzB4MDAyMCB8IDM4IDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgIHwgMHgwMDM4ICg1NikgICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBiYXJfYmF6YCAoaWQ6IDkpCisgICsweDAwMjIgfCAzQyAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgICB8IDB4MDAzQyAoNjApICAgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgYWNjb3VudHNgIChpZDogMTApCisgICsweDAwMjQgfCA0MCAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgICB8IDB4MDA0MCAoNjQpICAgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgYm9iYCAoaWQ6IDExKQorICArMHgwMDI2IHwgNDQgMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgICAgfCAweDAwNDQgKDY4KSAgICAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYGFsaWNlYCAoaWQ6IDEyKQorICArMHgwMDI4IHwgMDAgMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgICAgfCAweDAwMDAgKDApICAgICAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYG1heWJlX2kzMmAgKGlkOiAxMykgPGRlZmF1bHRzIHRvIDA+IChJbnQpCisgICsweDAwMkEgfCAwMCAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgICB8IDB4MDAwMCAoMCkgICAgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgZGVmYXVsdF9pMzJgIChpZDogMTQpIDxkZWZhdWx0cyB0byA0Mj4gKEludCkKKyAgKzB4MDAyQyB8IDQ4IDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgIHwgMHgwMDQ4ICg3MikgICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBqdXN0X2kzMmAgKGlkOiAxNSkKKyAgKzB4MDAyRSB8IDRDIDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgIHwgMHgwMDRDICg3NikgICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBuYW1lc2AgKGlkOiAxNikKKyAgKzB4MDAzMCB8IDUwIDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgIHwgMHgwMDUwICg4MCkgICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBwb2ludHNfb2ZfaW50ZXJlc3RgIChpZDogMTcpCisgICsweDAwMzIgfCA1NCAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgICB8IDB4MDA1NCAoODQpICAgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgZm9vYmFyc190eXBlYCAoaWQ6IDE4KQorICArMHgwMDM0IHwgNTggMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgICAgfCAweDAwNTggKDg4KSAgICAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYGZvb2JhcnNgIChpZDogMTkpCisgICsweDAwMzYgfCAwQSAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgICB8IDB4MDAwQSAoMTApICAgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgbWVhc3VyZW1lbnRfdHlwZWAgKGlkOiAyMCkKKyAgKzB4MDAzOCB8IDVDIDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgIHwgMHgwMDVDICg5MikgICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBtZWFzdXJlbWVudGAgKGlkOiAyMSkKKyAgKzB4MDAzQSB8IDBCIDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgIHwgMHgwMDBCICgxMSkgICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBhbnl0aGluZ190eXBlYCAoaWQ6IDIyKQorICArMHgwMDNDIHwgNjAgMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgICAgfCAweDAwNjAgKDk2KSAgICAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYGFueXRoaW5nYCAoaWQ6IDIzKQorICArMHgwMDNFIHwgMDAgMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgICAgfCAweDAwMDAgKDApICAgICAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYHRlbXBlcmF0dXJlYCAoaWQ6IDI0KSA8ZGVmYXVsdHMgdG8gOTguNjAwMDAwPiAoRmxvYXQpCisgICsweDAwNDAgfCAwMCAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgICB8IDB4MDAwMCAoMCkgICAgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgdGVldG90YWxlcmAgKGlkOiAyNSkgPG51bGw+IChPYmopCisgICsweDAwNDIgfCA2NCAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgICB8IDB4MDA2NCAoMTAwKSAgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgY2hhcmxpZWAgKGlkOiAyNikKKworcm9vdF90YWJsZSAoQW5ub3RhdGVkQmluYXJ5LkZvbyk6CisgICsweDAwNDQgfCAzQSAwMCAwMCAwMCAgICAgICAgICAgICB8IFNPZmZzZXQzMiAgICB8IDB4MDAwMDAwM0EgKDU4KSBMb2M6ICsweDAwMEEgICB8IG9mZnNldCB0byB2dGFibGUKKyAgKzB4MDA0OCB8IDAwIDAwIDAwICAgICAgICAgICAgICAgIHwgdWludDhfdFszXSAgIHwgLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgcGFkZGluZworICArMHgwMDRCIHwgMDEgICAgICAgICAgICAgICAgICAgICAgfCB1aW50OF90ICAgICAgfCAweDAxICgxKSAgICAgICAgICAgICAgICAgICAgICAgfCB0YWJsZSBmaWVsZCBgaGVhbHRoeWAgKEJvb2wpCisgICsweDAwNEMgfCAwMiAgICAgICAgICAgICAgICAgICAgICB8IHVpbnQ4X3QgICAgICB8IDB4MDIgKDIpICAgICAgICAgICAgICAgICAgICAgICB8IHRhYmxlIGZpZWxkIGBtZWFsYCAoQnl0ZSkKKyAgKzB4MDA0RCB8IDAyICAgICAgICAgICAgICAgICAgICAgIHwgVVR5cGU4ICAgICAgIHwgMHgwMiAoMikgICAgICAgICAgICAgICAgICAgICAgIHwgdGFibGUgZmllbGQgYGJhcl9iYXpfdHlwZWAgKFVUeXBlKQorICArMHgwMDRFIHwgMDEgICAgICAgICAgICAgICAgICAgICAgfCBVVHlwZTggICAgICAgfCAweDAxICgxKSAgICAgICAgICAgICAgICAgICAgICAgfCB0YWJsZSBmaWVsZCBgbWVhc3VyZW1lbnRfdHlwZWAgKFVUeXBlKQorICArMHgwMDRGIHwgMDEgICAgICAgICAgICAgICAgICAgICAgfCBVVHlwZTggICAgICAgfCAweDAxICgxKSAgICAgICAgICAgICAgICAgICAgICAgfCB0YWJsZSBmaWVsZCBgYW55dGhpbmdfdHlwZWAgKFVUeXBlKQorICArMHgwMDUwIHwgRDIgMDQgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICAgfCAweDAwMDAwNEQyICgxMjM0KSAgICAgICAgICAgICAgfCB0YWJsZSBmaWVsZCBgY291bnRlcmAgKEludCkKKyAgKzB4MDA1NCB8IDI4IDAyIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgIHwgMHgwMDAwMDIyOCAoNTUyKSBMb2M6ICsweDAyN0MgIHwgRVJST1I6IG9mZnNldCB0byBmaWVsZCBgYmFyYC4gSW52YWxpZCBvZmZzZXQsIHBvaW50cyBvdXRzaWRlIHRoZSBiaW5hcnkuCisgICsweDAwNTggfCAwMSAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgICB8IDB4MDAwMDAwMDEgKDEpICAgICAgICAgICAgICAgICB8IHN0cnVjdCBmaWVsZCBgQW5ub3RhdGVkQmluYXJ5LkJ1aWxkaW5nLmZsb29yc2AgKEludCkKKyAgKzB4MDA1QyB8IDAyIDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgIHwgMHgwMDAwMDAwMiAoMikgICAgICAgICAgICAgICAgIHwgc3RydWN0IGZpZWxkIGBBbm5vdGF0ZWRCaW5hcnkuQnVpbGRpbmcuZG9vcnNgIChJbnQpCisgICsweDAwNjAgfCAwQyAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgICB8IDB4MDAwMDAwMEMgKDEyKSAgICAgICAgICAgICAgICB8IHN0cnVjdCBmaWVsZCBgQW5ub3RhdGVkQmluYXJ5LkJ1aWxkaW5nLndpbmRvd3NgIChJbnQpCisgICsweDAwNjQgfCAwQSAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgICB8IDB4MDAwMDAwMEEgKDEwKSAgICAgICAgICAgICAgICB8IGFycmF5IGZpZWxkIGBBbm5vdGF0ZWRCaW5hcnkuRGltZW5zaW9uLnZhbHVlc2BbMF0gKEludCkKKyAgKzB4MDA2OCB8IDBDIDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgIHwgMHgwMDAwMDAwQyAoMTIpICAgICAgICAgICAgICAgIHwgYXJyYXkgZmllbGQgYEFubm90YXRlZEJpbmFyeS5EaW1lbnNpb24udmFsdWVzYFsxXSAoSW50KQorICArMHgwMDZDIHwgMTQgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICAgfCAweDAwMDAwMDE0ICgyMCkgICAgICAgICAgICAgICAgfCBhcnJheSBmaWVsZCBgQW5ub3RhdGVkQmluYXJ5LkRpbWVuc2lvbi52YWx1ZXNgWzJdIChJbnQpCisgICsweDAwNzAgfCAwMSAgICAgICAgICAgICAgICAgICAgICB8IHVpbnQ4X3QgICAgICB8IDB4MDEgKDEpICAgICAgICAgICAgICAgICAgICAgICB8IHN0cnVjdCBmaWVsZCBgQW5ub3RhdGVkQmluYXJ5LlRvbGVyYW5jZS53aWR0aGAgKFVCeXRlKQorICArMHgwMDcxIHwgMDIgICAgICAgICAgICAgICAgICAgICAgfCB1aW50OF90ICAgICAgfCAweDAyICgyKSAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJ1Y3QgZmllbGQgYEFubm90YXRlZEJpbmFyeS5Ub2xlcmFuY2Uud2lkdGhgIChVQnl0ZSkKKyAgKzB4MDA3MiB8IDAzICAgICAgICAgICAgICAgICAgICAgIHwgdWludDhfdCAgICAgIHwgMHgwMyAoMykgICAgICAgICAgICAgICAgICAgICAgIHwgc3RydWN0IGZpZWxkIGBBbm5vdGF0ZWRCaW5hcnkuVG9sZXJhbmNlLndpZHRoYCAoVUJ5dGUpCisgICsweDAwNzMgfCAwMCAgICAgICAgICAgICAgICAgICAgICB8IHVpbnQ4X3RbMV0gICB8IC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHBhZGRpbmcKKyAgKzB4MDA3NCB8IEM4IDAxIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgIHwgMHgwMDAwMDFDOCAoNDU2KSBMb2M6ICsweDAyM0MgIHwgRVJST1I6IG9mZnNldCB0byBmaWVsZCBgbmFtZWAuIEludmFsaWQgb2Zmc2V0LCBwb2ludHMgb3V0c2lkZSB0aGUgYmluYXJ5LgorICArMHgwMDc4IHwgNUMgMDEgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICAgfCAweDAwMDAwMTVDICgzNDgpIExvYzogKzB4MDFENCAgfCBFUlJPUjogb2Zmc2V0IHRvIGZpZWxkIGBiYXJzYC4gSW52YWxpZCBvZmZzZXQsIHBvaW50cyBvdXRzaWRlIHRoZSBiaW5hcnkuCisgICsweDAwN0MgfCA1MCAwMSAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgICB8IDB4MDAwMDAxNTAgKDMzNikgTG9jOiArMHgwMUNDICB8IEVSUk9SOiBvZmZzZXQgdG8gZmllbGQgYGJhcl9iYXpgLiBJbnZhbGlkIG9mZnNldCwgcG9pbnRzIG91dHNpZGUgdGhlIGJpbmFyeS4KKyAgKzB4MDA4MCB8IDM0IDAxIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgIHwgMHgwMDAwMDEzNCAoMzA4KSBMb2M6ICsweDAxQjQgIHwgRVJST1I6IG9mZnNldCB0byBmaWVsZCBgYWNjb3VudHNgLiBJbnZhbGlkIG9mZnNldCwgcG9pbnRzIG91dHNpZGUgdGhlIGJpbmFyeS4KKyAgKzB4MDA4NCB8IDI0IDAxIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgIHwgMHgwMDAwMDEyNCAoMjkyKSBMb2M6ICsweDAxQTggIHwgRVJST1I6IG9mZnNldCB0byBmaWVsZCBgYm9iYC4gSW52YWxpZCBvZmZzZXQsIHBvaW50cyBvdXRzaWRlIHRoZSBiaW5hcnkuCisgICsweDAwODggfCAxNCAwMSAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgICB8IDB4MDAwMDAxMTQgKDI3NikgTG9jOiArMHgwMTlDICB8IEVSUk9SOiBvZmZzZXQgdG8gZmllbGQgYGFsaWNlYC4gSW52YWxpZCBvZmZzZXQsIHBvaW50cyBvdXRzaWRlIHRoZSBiaW5hcnkuCisgICsweDAwOEMgfCAwRCAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgICB8IDB4MDAwMDAwMEQgKDEzKSAgICAgICAgICAgICAgICB8IHRhYmxlIGZpZWxkIGBqdXN0X2kzMmAgKEludCkKKyAgKzB4MDA5MCB8IERDIDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgIHwgMHgwMDAwMDBEQyAoMjIwKSBMb2M6ICsweDAxNkMgIHwgRVJST1I6IG9mZnNldCB0byBmaWVsZCBgbmFtZXNgLiBJbnZhbGlkIG9mZnNldCwgcG9pbnRzIG91dHNpZGUgdGhlIGJpbmFyeS4KKyAgKzB4MDA5NCB8IEEwIDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgIHwgMHgwMDAwMDBBMCAoMTYwKSBMb2M6ICsweDAxMzQgIHwgb2Zmc2V0IHRvIGZpZWxkIGBwb2ludHNfb2ZfaW50ZXJlc3RgICh2ZWN0b3IpCisgICsweDAwOTggfCA5NCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgICB8IDB4MDAwMDAwOTQgKDE0OCkgTG9jOiArMHgwMTJDICB8IG9mZnNldCB0byBmaWVsZCBgZm9vYmFyc190eXBlYCAodmVjdG9yKQorICArMHgwMDlDIHwgMzggMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICAgfCAweDAwMDAwMDM4ICg1NikgTG9jOiArMHgwMEQ0ICAgfCBvZmZzZXQgdG8gZmllbGQgYGZvb2JhcnNgICh2ZWN0b3IpCisgICsweDAwQTAgfCAzMyAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgICB8IDB4MDAwMDAwMzMgKDUxKSBMb2M6ICsweDAwRDMgICB8IG9mZnNldCB0byBmaWVsZCBgbWVhc3VyZW1lbnRgICh1bmlvbiBvZiB0eXBlIGBUb2xlcmFuY2VgKQorICArMHgwMEE0IHwgMUMgMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICAgfCAweDAwMDAwMDFDICgyOCkgTG9jOiArMHgwMEMwICAgfCBvZmZzZXQgdG8gZmllbGQgYGFueXRoaW5nYCAodW5pb24gb2YgdHlwZSBgQmFyYCkKKyAgKzB4MDBBOCB8IDA0IDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgIHwgMHgwMDAwMDAwNCAoNCkgTG9jOiArMHgwMEFDICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBjaGFybGllYCAoc3RyaW5nKQorCitzdHJpbmcgKEFubm90YXRlZEJpbmFyeS5Gb28uY2hhcmxpZSk6CisgICsweDAwQUMgfCAwNSAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgICB8IDB4MDAwMDAwMDUgKDUpICAgICAgICAgICAgICAgICB8IGxlbmd0aCBvZiBzdHJpbmcKKyAgKzB4MDBCMCB8IDYxIDZDIDY5IDYzIDY1ICAgICAgICAgIHwgY2hhcls1XSAgICAgIHwgYWxpY2UgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nIGxpdGVyYWwKKyAgKzB4MDBCNSB8IDAwICAgICAgICAgICAgICAgICAgICAgIHwgY2hhciAgICAgICAgIHwgMHgwMCAoMCkgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nIHRlcm1pbmF0b3IKKworcGFkZGluZzoKKyAgKzB4MDBCNiB8IDAwIDAwICAgICAgICAgICAgICAgICAgIHwgdWludDhfdFsyXSAgIHwgLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgcGFkZGluZworCit2dGFibGUgKEFubm90YXRlZEJpbmFyeS5CYXIpOgorICArMHgwMEI4IHwgMDggMDAgICAgICAgICAgICAgICAgICAgfCB1aW50MTZfdCAgICAgfCAweDAwMDggKDgpICAgICAgICAgICAgICAgICAgICAgfCBzaXplIG9mIHRoaXMgdnRhYmxlCisgICsweDAwQkEgfCAxMyAwMCAgICAgICAgICAgICAgICAgICB8IHVpbnQxNl90ICAgICB8IDB4MDAxMyAoMTkpICAgICAgICAgICAgICAgICAgICB8IHNpemUgb2YgcmVmZXJyaW5nIHRhYmxlCisgICsweDAwQkMgfCAwOCAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgICB8IDB4MDAwOCAoOCkgICAgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgYWAgKGlkOiAwKQorICArMHgwMEJFIHwgMDQgMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgICAgfCAweDAwMDQgKDQpICAgICAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYGJgIChpZDogMSkKKwordGFibGUgKEFubm90YXRlZEJpbmFyeS5CYXIpOgorICArMHgwMEMwIHwgMDggMDAgMDAgMDAgICAgICAgICAgICAgfCBTT2Zmc2V0MzIgICAgfCAweDAwMDAwMDA4ICg4KSBMb2M6ICsweDAwQjggICAgfCBvZmZzZXQgdG8gdnRhYmxlCisgICsweDAwQzQgfCAwMCA4MCAyMyA0NCAgICAgICAgICAgICB8IGZsb2F0ICAgICAgICB8IDB4NDQyMzgwMDAgKDY1NCkgICAgICAgICAgICAgICB8IHRhYmxlIGZpZWxkIGBiYCAoRmxvYXQpCisgICsweDAwQzggfCAwMCAwMCAwMCAwMCAwMCAxMCA3NCA0MCB8IGRvdWJsZSAgICAgICB8IDB4NDA3NDEwMDAwMDAwMDAwMCAoMzIxKSAgICAgICB8IHRhYmxlIGZpZWxkIGBhYCAoRG91YmxlKQorICArMHgwMEQwIHwgMDAgMDAgMDAgICAgICAgICAgICAgICAgfCB1aW50OF90WzNdICAgfCAuLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBwYWRkaW5nCisKK3VuaW9uIChBbm5vdGF0ZWRCaW5hcnkuVG9sZXJhbmNlLm1lYXN1cmVtZW50KToKKyAgKzB4MDBEMyB8IDA1ICAgICAgICAgICAgICAgICAgICAgIHwgdWludDhfdCAgICAgIHwgMHgwNSAoNSkgICAgICAgICAgICAgICAgICAgICAgIHwgc3RydWN0IGZpZWxkIGBBbm5vdGF0ZWRCaW5hcnkuVG9sZXJhbmNlLndpZHRoYCAoVUJ5dGUpCisKK3ZlY3RvciAoQW5ub3RhdGVkQmluYXJ5LkZvby5mb29iYXJzKToKKyAgKzB4MDBENCB8IDAzIDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgIHwgMHgwMDAwMDAwMyAoMykgICAgICAgICAgICAgICAgIHwgbGVuZ3RoIG9mIHZlY3RvciAoIyBpdGVtcykKKyAgKzB4MDBEOCB8IDM0IDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgIHwgMHgwMDAwMDAzNCAoNTIpIExvYzogKzB4MDEwQyAgIHwgb2Zmc2V0IHRvIHVuaW9uWzBdIChgQmFyYCkKKyAgKzB4MDBEQyB8IDJDIDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgIHwgMHgwMDAwMDAyQyAoNDQpIExvYzogKzB4MDEwOCAgIHwgb2Zmc2V0IHRvIHVuaW9uWzFdIChgQmF6YCkKKyAgKzB4MDBFMCB8IDA0IDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgIHwgMHgwMDAwMDAwNCAoNCkgTG9jOiArMHgwMEU0ICAgIHwgb2Zmc2V0IHRvIHVuaW9uWzJdIChgQmFyYCkKKwordGFibGUgKEFubm90YXRlZEJpbmFyeS5CYXIpOgorICArMHgwMEU0IHwgRDIgRkUgRkYgRkYgICAgICAgICAgICAgfCBTT2Zmc2V0MzIgICAgfCAweEZGRkZGRUQyICgtMzAyKSBMb2M6ICsweDAyMTIgfCBFUlJPUjogb2Zmc2V0IHRvIHZ0YWJsZS4gSW52YWxpZCBvZmZzZXQsIHBvaW50cyBvdXRzaWRlIHRoZSBiaW5hcnkuCisKK3Vua25vd24gKG5vIGtub3duIHJlZmVyZW5jZXMpOgorICArMHgwMEU4IHwgMDAgODAgMjMgNDQgMTAgMDAgMDAgMDAgfCA/dWludDhfdFsyOF0gfCAuLiNELi4uLiAgICAgICAgICAgICAgICAgICAgICAgfCBXQVJOOiBub3RoaW5nIHJlZmVycyB0byB0aGlzIHNlY3Rpb24uCisgICsweDAwRjAgfCAwMCAwMCAwMCAwMCAwMCBEOCA4RSA0MCB8ICAgICAgICAgICAgICB8IC4uLi4uLi5ACisgICsweDAwRjggfCAwMCAwMCAwMCAwMCA2QSBGRSBGRiBGRiB8ICAgICAgICAgICAgICB8IC4uLi5qLi4uCisgICsweDAxMDAgfCAwMCAwMCAwMCAwMyAgICAgICAgICAgICB8ICAgICAgICAgICAgICB8IC4uLi4KKwordnRhYmxlIChBbm5vdGF0ZWRCaW5hcnkuQmF6KToKKyAgKzB4MDEwNCB8IDA0IDAwICAgICAgICAgICAgICAgICAgIHwgdWludDE2X3QgICAgIHwgMHgwMDA0ICg0KSAgICAgICAgICAgICAgICAgICAgIHwgc2l6ZSBvZiB0aGlzIHZ0YWJsZQorICArMHgwMTA2IHwgMDQgMDAgICAgICAgICAgICAgICAgICAgfCB1aW50MTZfdCAgICAgfCAweDAwMDQgKDQpICAgICAgICAgICAgICAgICAgICAgfCBzaXplIG9mIHJlZmVycmluZyB0YWJsZQorCit0YWJsZSAoQW5ub3RhdGVkQmluYXJ5LkJheik6CisgICsweDAxMDggfCAwNCAwMCAwMCAwMCAgICAgICAgICAgICB8IFNPZmZzZXQzMiAgICB8IDB4MDAwMDAwMDQgKDQpIExvYzogKzB4MDEwNCAgICB8IG9mZnNldCB0byB2dGFibGUKKwordGFibGUgKEFubm90YXRlZEJpbmFyeS5CYXIpOgorICArMHgwMTBDIHwgRkEgRkUgRkYgRkYgICAgICAgICAgICAgfCBTT2Zmc2V0MzIgICAgfCAweEZGRkZGRUZBICgtMjYyKSBMb2M6ICsweDAyMTIgfCBFUlJPUjogb2Zmc2V0IHRvIHZ0YWJsZS4gSW52YWxpZCBvZmZzZXQsIHBvaW50cyBvdXRzaWRlIHRoZSBiaW5hcnkuCisKK3Vua25vd24gKG5vIGtub3duIHJlZmVyZW5jZXMpOgorICArMHgwMTEwIHwgMDAgMDAgRTQgNDMgMTAgMDAgMDAgMDAgfCA/dWludDhfdFsyOF0gfCAuLi5DLi4uLiAgICAgICAgICAgICAgICAgICAgICAgfCBXQVJOOiBub3RoaW5nIHJlZmVycyB0byB0aGlzIHNlY3Rpb24uCisgICsweDAxMTggfCAwMCAwMCAwMCAwMCAwMCBDMCA1RSA0MCB8ICAgICAgICAgICAgICB8IC4uLi4uLl5ACisgICsweDAxMjAgfCAwMCAwMCAwMCAwMCA5MiBGRSBGRiBGRiB8ICAgICAgICAgICAgICB8IC4uLi4uLi4uCisgICsweDAxMjggfCAwMCAwMCAwMCAwMSAgICAgICAgICAgICB8ICAgICAgICAgICAgICB8IC4uLi4KKwordmVjdG9yIChBbm5vdGF0ZWRCaW5hcnkuRm9vLmZvb2JhcnNfdHlwZSk6CisgICsweDAxMkMgfCAwMyAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgICB8IDB4MDAwMDAwMDMgKDMpICAgICAgICAgICAgICAgICB8IGxlbmd0aCBvZiB2ZWN0b3IgKCMgaXRlbXMpCisgICsweDAxMzAgfCAwMSAgICAgICAgICAgICAgICAgICAgICB8IFVUeXBlOCAgICAgICB8IDB4MDEgKDEpICAgICAgICAgICAgICAgICAgICAgICB8IHZhbHVlWzBdCisgICsweDAxMzEgfCAwMiAgICAgICAgICAgICAgICAgICAgICB8IFVUeXBlOCAgICAgICB8IDB4MDIgKDIpICAgICAgICAgICAgICAgICAgICAgICB8IHZhbHVlWzFdCisgICsweDAxMzIgfCAwMSAgICAgICAgICAgICAgICAgICAgICB8IFVUeXBlOCAgICAgICB8IDB4MDEgKDEpICAgICAgICAgICAgICAgICAgICAgICB8IHZhbHVlWzJdCisKK3ZlY3RvciAoQW5ub3RhdGVkQmluYXJ5LkZvby5wb2ludHNfb2ZfaW50ZXJlc3QpOgorICArMHgwMTM0IHwgMDMgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICAgfCAweDAwMDAwMDAzICgzKSAgICAgICAgICAgICAgICAgfCBFUlJPUjogbGVuZ3RoIG9mIHZlY3RvciAoIyBpdGVtcykuIExvbmdlciB0aGFuIHRoZSBiaW5hcnkuCisKK3Vua25vd24gKG5vIGtub3duIHJlZmVyZW5jZXMpOgorICArMHgwMTM4IHwgMzMgMzMgMzMgMzMgMzMgQTMgNDUgNDAgfCA/dWludDhfdFsyOF0gfCAzMzMzMy5FQCAgICAgICAgICAgICAgICAgICAgICAgfCBXQVJOOiBub3RoaW5nIHJlZmVycyB0byB0aGlzIHNlY3Rpb24uCisgICsweDAxNDAgfCA3RSA1NyAwNCBGRiA1QiA4NyA1MyBDMCB8ICAgICAgICAgICAgICB8IH5XLi5bLlMuCisgICsweDAxNDggfCA4RCBGMCBGNiAyMCAwNCBCNiA0MiA0MCB8ICAgICAgICAgICAgICB8IC4uLiAuLkJACisgICsweDAxNTAgfCA5RiA3NyA2MyA0MSAgICAgICAgICAgICB8ICAgICAgICAgICAgICB8IC53Y0EKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL2Fubm90YXRlZF9iaW5hcnkvdGVzdHMvaW52YWxpZF92ZWN0b3Jfc3RydWN0c19jdXRfc2hvcnQuYmluIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvYW5ub3RhdGVkX2JpbmFyeS90ZXN0cy9pbnZhbGlkX3ZlY3Rvcl9zdHJ1Y3RzX2N1dF9zaG9ydC5iaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDRkYTQwOAotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL2Fubm90YXRlZF9iaW5hcnkvdGVzdHMvaW52YWxpZF92ZWN0b3Jfc3RydWN0c19jdXRfc2hvcnQuYmluCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL2Fubm90YXRlZF9iaW5hcnkvdGVzdHMvaW52YWxpZF92ZWN0b3JfdGFibGVzX2N1dF9zaG9ydC5hZmIgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9hbm5vdGF0ZWRfYmluYXJ5L3Rlc3RzL2ludmFsaWRfdmVjdG9yX3RhYmxlc19jdXRfc2hvcnQuYWZiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhOGIxOGYKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9hbm5vdGF0ZWRfYmluYXJ5L3Rlc3RzL2ludmFsaWRfdmVjdG9yX3RhYmxlc19jdXRfc2hvcnQuYWZiCkBAIC0wLDAgKzEsMjEwIEBACisvLyBBbm5vdGF0ZWQgRmxhdGJ1ZmZlciBCaW5hcnkKKy8vCisvLyBTY2hlbWEgZmlsZTogYW5ub3RhdGVkX2JpbmFyeS5mYnMKKy8vIEJpbmFyeSBmaWxlOiB0ZXN0cy9pbnZhbGlkX3ZlY3Rvcl90YWJsZXNfY3V0X3Nob3J0LmJpbgorCitoZWFkZXI6CisgICsweDAwMDAgfCA0NCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgICB8IDB4MDAwMDAwNDQgKDY4KSBMb2M6ICsweDAwNDQgICB8IG9mZnNldCB0byByb290IHRhYmxlIGBBbm5vdGF0ZWRCaW5hcnkuRm9vYAorICArMHgwMDA0IHwgNDEgNEUgNEUgNEYgICAgICAgICAgICAgfCBjaGFyWzRdICAgICAgfCBBTk5PICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBGaWxlIElkZW50aWZpZXIKKworcGFkZGluZzoKKyAgKzB4MDAwOCB8IDAwIDAwICAgICAgICAgICAgICAgICAgIHwgdWludDhfdFsyXSAgIHwgLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgcGFkZGluZworCit2dGFibGUgKEFubm90YXRlZEJpbmFyeS5Gb28pOgorICArMHgwMDBBIHwgM0EgMDAgICAgICAgICAgICAgICAgICAgfCB1aW50MTZfdCAgICAgfCAweDAwM0EgKDU4KSAgICAgICAgICAgICAgICAgICAgfCBzaXplIG9mIHRoaXMgdnRhYmxlCisgICsweDAwMEMgfCA2OCAwMCAgICAgICAgICAgICAgICAgICB8IHVpbnQxNl90ICAgICB8IDB4MDA2OCAoMTA0KSAgICAgICAgICAgICAgICAgICB8IHNpemUgb2YgcmVmZXJyaW5nIHRhYmxlCisgICsweDAwMEUgfCAwQyAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgICB8IDB4MDAwQyAoMTIpICAgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgY291bnRlcmAgKGlkOiAwKQorICArMHgwMDEwIHwgMDcgMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgICAgfCAweDAwMDcgKDcpICAgICAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYGhlYWx0aHlgIChpZDogMSkKKyAgKzB4MDAxMiB8IDAwIDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgIHwgMHgwMDAwICgwKSAgICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBsZXZlbGAgKGlkOiAyKSA8ZGVmYXVsdHMgdG8gOTk+IChMb25nKQorICArMHgwMDE0IHwgMDggMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgICAgfCAweDAwMDggKDgpICAgICAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYG1lYWxgIChpZDogMykKKyAgKzB4MDAxNiB8IDEwIDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgIHwgMHgwMDEwICgxNikgICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBiYXJgIChpZDogNCkKKyAgKzB4MDAxOCB8IDE0IDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgIHwgMHgwMDE0ICgyMCkgICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBob21lYCAoaWQ6IDUpCisgICsweDAwMUEgfCAzMCAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgICB8IDB4MDAzMCAoNDgpICAgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgbmFtZWAgKGlkOiA2KQorICArMHgwMDFDIHwgMzQgMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgICAgfCAweDAwMzQgKDUyKSAgICAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYGJhcnNgIChpZDogNykKKyAgKzB4MDAxRSB8IDA5IDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgIHwgMHgwMDA5ICg5KSAgICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBiYXJfYmF6X3R5cGVgIChpZDogOCkKKyAgKzB4MDAyMCB8IDM4IDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgIHwgMHgwMDM4ICg1NikgICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBiYXJfYmF6YCAoaWQ6IDkpCisgICsweDAwMjIgfCAzQyAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgICB8IDB4MDAzQyAoNjApICAgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgYWNjb3VudHNgIChpZDogMTApCisgICsweDAwMjQgfCA0MCAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgICB8IDB4MDA0MCAoNjQpICAgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgYm9iYCAoaWQ6IDExKQorICArMHgwMDI2IHwgNDQgMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgICAgfCAweDAwNDQgKDY4KSAgICAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYGFsaWNlYCAoaWQ6IDEyKQorICArMHgwMDI4IHwgMDAgMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgICAgfCAweDAwMDAgKDApICAgICAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYG1heWJlX2kzMmAgKGlkOiAxMykgPGRlZmF1bHRzIHRvIDA+IChJbnQpCisgICsweDAwMkEgfCAwMCAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgICB8IDB4MDAwMCAoMCkgICAgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgZGVmYXVsdF9pMzJgIChpZDogMTQpIDxkZWZhdWx0cyB0byA0Mj4gKEludCkKKyAgKzB4MDAyQyB8IDQ4IDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgIHwgMHgwMDQ4ICg3MikgICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBqdXN0X2kzMmAgKGlkOiAxNSkKKyAgKzB4MDAyRSB8IDRDIDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgIHwgMHgwMDRDICg3NikgICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBuYW1lc2AgKGlkOiAxNikKKyAgKzB4MDAzMCB8IDUwIDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgIHwgMHgwMDUwICg4MCkgICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBwb2ludHNfb2ZfaW50ZXJlc3RgIChpZDogMTcpCisgICsweDAwMzIgfCA1NCAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgICB8IDB4MDA1NCAoODQpICAgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgZm9vYmFyc190eXBlYCAoaWQ6IDE4KQorICArMHgwMDM0IHwgNTggMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgICAgfCAweDAwNTggKDg4KSAgICAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYGZvb2JhcnNgIChpZDogMTkpCisgICsweDAwMzYgfCAwQSAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgICB8IDB4MDAwQSAoMTApICAgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgbWVhc3VyZW1lbnRfdHlwZWAgKGlkOiAyMCkKKyAgKzB4MDAzOCB8IDVDIDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgIHwgMHgwMDVDICg5MikgICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBtZWFzdXJlbWVudGAgKGlkOiAyMSkKKyAgKzB4MDAzQSB8IDBCIDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgIHwgMHgwMDBCICgxMSkgICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBhbnl0aGluZ190eXBlYCAoaWQ6IDIyKQorICArMHgwMDNDIHwgNjAgMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgICAgfCAweDAwNjAgKDk2KSAgICAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYGFueXRoaW5nYCAoaWQ6IDIzKQorICArMHgwMDNFIHwgMDAgMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgICAgfCAweDAwMDAgKDApICAgICAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYHRlbXBlcmF0dXJlYCAoaWQ6IDI0KSA8ZGVmYXVsdHMgdG8gOTguNjAwMDAwPiAoRmxvYXQpCisgICsweDAwNDAgfCAwMCAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgICB8IDB4MDAwMCAoMCkgICAgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgdGVldG90YWxlcmAgKGlkOiAyNSkgPG51bGw+IChPYmopCisgICsweDAwNDIgfCA2NCAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgICB8IDB4MDA2NCAoMTAwKSAgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgY2hhcmxpZWAgKGlkOiAyNikKKworcm9vdF90YWJsZSAoQW5ub3RhdGVkQmluYXJ5LkZvbyk6CisgICsweDAwNDQgfCAzQSAwMCAwMCAwMCAgICAgICAgICAgICB8IFNPZmZzZXQzMiAgICB8IDB4MDAwMDAwM0EgKDU4KSBMb2M6ICsweDAwMEEgICB8IG9mZnNldCB0byB2dGFibGUKKyAgKzB4MDA0OCB8IDAwIDAwIDAwICAgICAgICAgICAgICAgIHwgdWludDhfdFszXSAgIHwgLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgcGFkZGluZworICArMHgwMDRCIHwgMDEgICAgICAgICAgICAgICAgICAgICAgfCB1aW50OF90ICAgICAgfCAweDAxICgxKSAgICAgICAgICAgICAgICAgICAgICAgfCB0YWJsZSBmaWVsZCBgaGVhbHRoeWAgKEJvb2wpCisgICsweDAwNEMgfCAwMiAgICAgICAgICAgICAgICAgICAgICB8IHVpbnQ4X3QgICAgICB8IDB4MDIgKDIpICAgICAgICAgICAgICAgICAgICAgICB8IHRhYmxlIGZpZWxkIGBtZWFsYCAoQnl0ZSkKKyAgKzB4MDA0RCB8IDAyICAgICAgICAgICAgICAgICAgICAgIHwgVVR5cGU4ICAgICAgIHwgMHgwMiAoMikgICAgICAgICAgICAgICAgICAgICAgIHwgdGFibGUgZmllbGQgYGJhcl9iYXpfdHlwZWAgKFVUeXBlKQorICArMHgwMDRFIHwgMDEgICAgICAgICAgICAgICAgICAgICAgfCBVVHlwZTggICAgICAgfCAweDAxICgxKSAgICAgICAgICAgICAgICAgICAgICAgfCB0YWJsZSBmaWVsZCBgbWVhc3VyZW1lbnRfdHlwZWAgKFVUeXBlKQorICArMHgwMDRGIHwgMDEgICAgICAgICAgICAgICAgICAgICAgfCBVVHlwZTggICAgICAgfCAweDAxICgxKSAgICAgICAgICAgICAgICAgICAgICAgfCB0YWJsZSBmaWVsZCBgYW55dGhpbmdfdHlwZWAgKFVUeXBlKQorICArMHgwMDUwIHwgRDIgMDQgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICAgfCAweDAwMDAwNEQyICgxMjM0KSAgICAgICAgICAgICAgfCB0YWJsZSBmaWVsZCBgY291bnRlcmAgKEludCkKKyAgKzB4MDA1NCB8IDI4IDAyIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgIHwgMHgwMDAwMDIyOCAoNTUyKSBMb2M6ICsweDAyN0MgIHwgRVJST1I6IG9mZnNldCB0byBmaWVsZCBgYmFyYC4gSW52YWxpZCBvZmZzZXQsIHBvaW50cyBvdXRzaWRlIHRoZSBiaW5hcnkuCisgICsweDAwNTggfCAwMSAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgICB8IDB4MDAwMDAwMDEgKDEpICAgICAgICAgICAgICAgICB8IHN0cnVjdCBmaWVsZCBgQW5ub3RhdGVkQmluYXJ5LkJ1aWxkaW5nLmZsb29yc2AgKEludCkKKyAgKzB4MDA1QyB8IDAyIDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgIHwgMHgwMDAwMDAwMiAoMikgICAgICAgICAgICAgICAgIHwgc3RydWN0IGZpZWxkIGBBbm5vdGF0ZWRCaW5hcnkuQnVpbGRpbmcuZG9vcnNgIChJbnQpCisgICsweDAwNjAgfCAwQyAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgICB8IDB4MDAwMDAwMEMgKDEyKSAgICAgICAgICAgICAgICB8IHN0cnVjdCBmaWVsZCBgQW5ub3RhdGVkQmluYXJ5LkJ1aWxkaW5nLndpbmRvd3NgIChJbnQpCisgICsweDAwNjQgfCAwQSAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgICB8IDB4MDAwMDAwMEEgKDEwKSAgICAgICAgICAgICAgICB8IGFycmF5IGZpZWxkIGBBbm5vdGF0ZWRCaW5hcnkuRGltZW5zaW9uLnZhbHVlc2BbMF0gKEludCkKKyAgKzB4MDA2OCB8IDBDIDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgIHwgMHgwMDAwMDAwQyAoMTIpICAgICAgICAgICAgICAgIHwgYXJyYXkgZmllbGQgYEFubm90YXRlZEJpbmFyeS5EaW1lbnNpb24udmFsdWVzYFsxXSAoSW50KQorICArMHgwMDZDIHwgMTQgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICAgfCAweDAwMDAwMDE0ICgyMCkgICAgICAgICAgICAgICAgfCBhcnJheSBmaWVsZCBgQW5ub3RhdGVkQmluYXJ5LkRpbWVuc2lvbi52YWx1ZXNgWzJdIChJbnQpCisgICsweDAwNzAgfCAwMSAgICAgICAgICAgICAgICAgICAgICB8IHVpbnQ4X3QgICAgICB8IDB4MDEgKDEpICAgICAgICAgICAgICAgICAgICAgICB8IHN0cnVjdCBmaWVsZCBgQW5ub3RhdGVkQmluYXJ5LlRvbGVyYW5jZS53aWR0aGAgKFVCeXRlKQorICArMHgwMDcxIHwgMDIgICAgICAgICAgICAgICAgICAgICAgfCB1aW50OF90ICAgICAgfCAweDAyICgyKSAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJ1Y3QgZmllbGQgYEFubm90YXRlZEJpbmFyeS5Ub2xlcmFuY2Uud2lkdGhgIChVQnl0ZSkKKyAgKzB4MDA3MiB8IDAzICAgICAgICAgICAgICAgICAgICAgIHwgdWludDhfdCAgICAgIHwgMHgwMyAoMykgICAgICAgICAgICAgICAgICAgICAgIHwgc3RydWN0IGZpZWxkIGBBbm5vdGF0ZWRCaW5hcnkuVG9sZXJhbmNlLndpZHRoYCAoVUJ5dGUpCisgICsweDAwNzMgfCAwMCAgICAgICAgICAgICAgICAgICAgICB8IHVpbnQ4X3RbMV0gICB8IC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHBhZGRpbmcKKyAgKzB4MDA3NCB8IEM4IDAxIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgIHwgMHgwMDAwMDFDOCAoNDU2KSBMb2M6ICsweDAyM0MgIHwgRVJST1I6IG9mZnNldCB0byBmaWVsZCBgbmFtZWAuIEludmFsaWQgb2Zmc2V0LCBwb2ludHMgb3V0c2lkZSB0aGUgYmluYXJ5LgorICArMHgwMDc4IHwgNUMgMDEgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICAgfCAweDAwMDAwMTVDICgzNDgpIExvYzogKzB4MDFENCAgfCBvZmZzZXQgdG8gZmllbGQgYGJhcnNgICh2ZWN0b3IpCisgICsweDAwN0MgfCA1MCAwMSAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgICB8IDB4MDAwMDAxNTAgKDMzNikgTG9jOiArMHgwMUNDICB8IG9mZnNldCB0byBmaWVsZCBgYmFyX2JhemAgKHVuaW9uIG9mIHR5cGUgYEJhemApCisgICsweDAwODAgfCAzNCAwMSAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgICB8IDB4MDAwMDAxMzQgKDMwOCkgTG9jOiArMHgwMUI0ICB8IG9mZnNldCB0byBmaWVsZCBgYWNjb3VudHNgICh2ZWN0b3IpCisgICsweDAwODQgfCAyNCAwMSAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgICB8IDB4MDAwMDAxMjQgKDI5MikgTG9jOiArMHgwMUE4ICB8IG9mZnNldCB0byBmaWVsZCBgYm9iYCAoc3RyaW5nKQorICArMHgwMDg4IHwgMTQgMDEgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICAgfCAweDAwMDAwMTE0ICgyNzYpIExvYzogKzB4MDE5QyAgfCBvZmZzZXQgdG8gZmllbGQgYGFsaWNlYCAoc3RyaW5nKQorICArMHgwMDhDIHwgMEQgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICAgfCAweDAwMDAwMDBEICgxMykgICAgICAgICAgICAgICAgfCB0YWJsZSBmaWVsZCBganVzdF9pMzJgIChJbnQpCisgICsweDAwOTAgfCBEQyAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgICB8IDB4MDAwMDAwREMgKDIyMCkgTG9jOiArMHgwMTZDICB8IG9mZnNldCB0byBmaWVsZCBgbmFtZXNgICh2ZWN0b3IpCisgICsweDAwOTQgfCBBMCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgICB8IDB4MDAwMDAwQTAgKDE2MCkgTG9jOiArMHgwMTM0ICB8IG9mZnNldCB0byBmaWVsZCBgcG9pbnRzX29mX2ludGVyZXN0YCAodmVjdG9yKQorICArMHgwMDk4IHwgOTQgMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICAgfCAweDAwMDAwMDk0ICgxNDgpIExvYzogKzB4MDEyQyAgfCBvZmZzZXQgdG8gZmllbGQgYGZvb2JhcnNfdHlwZWAgKHZlY3RvcikKKyAgKzB4MDA5QyB8IDM4IDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgIHwgMHgwMDAwMDAzOCAoNTYpIExvYzogKzB4MDBENCAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBmb29iYXJzYCAodmVjdG9yKQorICArMHgwMEEwIHwgMzMgMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICAgfCAweDAwMDAwMDMzICg1MSkgTG9jOiArMHgwMEQzICAgfCBvZmZzZXQgdG8gZmllbGQgYG1lYXN1cmVtZW50YCAodW5pb24gb2YgdHlwZSBgVG9sZXJhbmNlYCkKKyAgKzB4MDBBNCB8IDFDIDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgIHwgMHgwMDAwMDAxQyAoMjgpIExvYzogKzB4MDBDMCAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBhbnl0aGluZ2AgKHVuaW9uIG9mIHR5cGUgYEJhcmApCisgICsweDAwQTggfCAwNCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgICB8IDB4MDAwMDAwMDQgKDQpIExvYzogKzB4MDBBQyAgICB8IG9mZnNldCB0byBmaWVsZCBgY2hhcmxpZWAgKHN0cmluZykKKworc3RyaW5nIChBbm5vdGF0ZWRCaW5hcnkuRm9vLmNoYXJsaWUpOgorICArMHgwMEFDIHwgMDUgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICAgfCAweDAwMDAwMDA1ICg1KSAgICAgICAgICAgICAgICAgfCBsZW5ndGggb2Ygc3RyaW5nCisgICsweDAwQjAgfCA2MSA2QyA2OSA2MyA2NSAgICAgICAgICB8IGNoYXJbNV0gICAgICB8IGFsaWNlICAgICAgICAgICAgICAgICAgICAgICAgICB8IHN0cmluZyBsaXRlcmFsCisgICsweDAwQjUgfCAwMCAgICAgICAgICAgICAgICAgICAgICB8IGNoYXIgICAgICAgICB8IDB4MDAgKDApICAgICAgICAgICAgICAgICAgICAgICB8IHN0cmluZyB0ZXJtaW5hdG9yCisKK3BhZGRpbmc6CisgICsweDAwQjYgfCAwMCAwMCAgICAgICAgICAgICAgICAgICB8IHVpbnQ4X3RbMl0gICB8IC4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHBhZGRpbmcKKwordnRhYmxlIChBbm5vdGF0ZWRCaW5hcnkuQmFyKToKKyAgKzB4MDBCOCB8IDA4IDAwICAgICAgICAgICAgICAgICAgIHwgdWludDE2X3QgICAgIHwgMHgwMDA4ICg4KSAgICAgICAgICAgICAgICAgICAgIHwgc2l6ZSBvZiB0aGlzIHZ0YWJsZQorICArMHgwMEJBIHwgMTMgMDAgICAgICAgICAgICAgICAgICAgfCB1aW50MTZfdCAgICAgfCAweDAwMTMgKDE5KSAgICAgICAgICAgICAgICAgICAgfCBzaXplIG9mIHJlZmVycmluZyB0YWJsZQorICArMHgwMEJDIHwgMDggMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgICAgfCAweDAwMDggKDgpICAgICAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYGFgIChpZDogMCkKKyAgKzB4MDBCRSB8IDA0IDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgIHwgMHgwMDA0ICg0KSAgICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBiYCAoaWQ6IDEpCisKK3RhYmxlIChBbm5vdGF0ZWRCaW5hcnkuQmFyKToKKyAgKzB4MDBDMCB8IDA4IDAwIDAwIDAwICAgICAgICAgICAgIHwgU09mZnNldDMyICAgIHwgMHgwMDAwMDAwOCAoOCkgTG9jOiArMHgwMEI4ICAgIHwgb2Zmc2V0IHRvIHZ0YWJsZQorICArMHgwMEM0IHwgMDAgODAgMjMgNDQgICAgICAgICAgICAgfCBmbG9hdCAgICAgICAgfCAweDQ0MjM4MDAwICg2NTQpICAgICAgICAgICAgICAgfCB0YWJsZSBmaWVsZCBgYmAgKEZsb2F0KQorICArMHgwMEM4IHwgMDAgMDAgMDAgMDAgMDAgMTAgNzQgNDAgfCBkb3VibGUgICAgICAgfCAweDQwNzQxMDAwMDAwMDAwMDAgKDMyMSkgICAgICAgfCB0YWJsZSBmaWVsZCBgYWAgKERvdWJsZSkKKyAgKzB4MDBEMCB8IDAwIDAwIDAwICAgICAgICAgICAgICAgIHwgdWludDhfdFszXSAgIHwgLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgcGFkZGluZworCit1bmlvbiAoQW5ub3RhdGVkQmluYXJ5LlRvbGVyYW5jZS5tZWFzdXJlbWVudCk6CisgICsweDAwRDMgfCAwNSAgICAgICAgICAgICAgICAgICAgICB8IHVpbnQ4X3QgICAgICB8IDB4MDUgKDUpICAgICAgICAgICAgICAgICAgICAgICB8IHN0cnVjdCBmaWVsZCBgQW5ub3RhdGVkQmluYXJ5LlRvbGVyYW5jZS53aWR0aGAgKFVCeXRlKQorCit2ZWN0b3IgKEFubm90YXRlZEJpbmFyeS5Gb28uZm9vYmFycyk6CisgICsweDAwRDQgfCAwMyAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgICB8IDB4MDAwMDAwMDMgKDMpICAgICAgICAgICAgICAgICB8IGxlbmd0aCBvZiB2ZWN0b3IgKCMgaXRlbXMpCisgICsweDAwRDggfCAzNCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgICB8IDB4MDAwMDAwMzQgKDUyKSBMb2M6ICsweDAxMEMgICB8IG9mZnNldCB0byB1bmlvblswXSAoYEJhcmApCisgICsweDAwREMgfCAyQyAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgICB8IDB4MDAwMDAwMkMgKDQ0KSBMb2M6ICsweDAxMDggICB8IG9mZnNldCB0byB1bmlvblsxXSAoYEJhemApCisgICsweDAwRTAgfCAwNCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgICB8IDB4MDAwMDAwMDQgKDQpIExvYzogKzB4MDBFNCAgICB8IG9mZnNldCB0byB1bmlvblsyXSAoYEJhcmApCisKK3RhYmxlIChBbm5vdGF0ZWRCaW5hcnkuQmFyKToKKyAgKzB4MDBFNCB8IEQyIEZFIEZGIEZGICAgICAgICAgICAgIHwgU09mZnNldDMyICAgIHwgMHhGRkZGRkVEMiAoLTMwMikgTG9jOiArMHgwMjEyIHwgRVJST1I6IG9mZnNldCB0byB2dGFibGUuIEludmFsaWQgb2Zmc2V0LCBwb2ludHMgb3V0c2lkZSB0aGUgYmluYXJ5LgorCit1bmtub3duIChubyBrbm93biByZWZlcmVuY2VzKToKKyAgKzB4MDBFOCB8IDAwIDgwIDIzIDQ0IDEwIDAwIDAwIDAwIHwgP3VpbnQ4X3RbMjhdIHwgLi4jRC4uLi4gICAgICAgICAgICAgICAgICAgICAgIHwgV0FSTjogbm90aGluZyByZWZlcnMgdG8gdGhpcyBzZWN0aW9uLgorICArMHgwMEYwIHwgMDAgMDAgMDAgMDAgMDAgRDggOEUgNDAgfCAgICAgICAgICAgICAgfCAuLi4uLi4uQAorICArMHgwMEY4IHwgMDAgMDAgMDAgMDAgNkEgRkUgRkYgRkYgfCAgICAgICAgICAgICAgfCAuLi4uai4uLgorICArMHgwMTAwIHwgMDAgMDAgMDAgMDMgICAgICAgICAgICAgfCAgICAgICAgICAgICAgfCAuLi4uCisKK3Z0YWJsZSAoQW5ub3RhdGVkQmluYXJ5LkJheik6CisgICsweDAxMDQgfCAwNCAwMCAgICAgICAgICAgICAgICAgICB8IHVpbnQxNl90ICAgICB8IDB4MDAwNCAoNCkgICAgICAgICAgICAgICAgICAgICB8IHNpemUgb2YgdGhpcyB2dGFibGUKKyAgKzB4MDEwNiB8IDA0IDAwICAgICAgICAgICAgICAgICAgIHwgdWludDE2X3QgICAgIHwgMHgwMDA0ICg0KSAgICAgICAgICAgICAgICAgICAgIHwgc2l6ZSBvZiByZWZlcnJpbmcgdGFibGUKKwordGFibGUgKEFubm90YXRlZEJpbmFyeS5CYXopOgorICArMHgwMTA4IHwgMDQgMDAgMDAgMDAgICAgICAgICAgICAgfCBTT2Zmc2V0MzIgICAgfCAweDAwMDAwMDA0ICg0KSBMb2M6ICsweDAxMDQgICAgfCBvZmZzZXQgdG8gdnRhYmxlCisKK3RhYmxlIChBbm5vdGF0ZWRCaW5hcnkuQmFyKToKKyAgKzB4MDEwQyB8IEZBIEZFIEZGIEZGICAgICAgICAgICAgIHwgU09mZnNldDMyICAgIHwgMHhGRkZGRkVGQSAoLTI2MikgTG9jOiArMHgwMjEyIHwgRVJST1I6IG9mZnNldCB0byB2dGFibGUuIEludmFsaWQgb2Zmc2V0LCBwb2ludHMgb3V0c2lkZSB0aGUgYmluYXJ5LgorCit1bmtub3duIChubyBrbm93biByZWZlcmVuY2VzKToKKyAgKzB4MDExMCB8IDAwIDAwIEU0IDQzIDEwIDAwIDAwIDAwIHwgP3VpbnQ4X3RbMjhdIHwgLi4uQy4uLi4gICAgICAgICAgICAgICAgICAgICAgIHwgV0FSTjogbm90aGluZyByZWZlcnMgdG8gdGhpcyBzZWN0aW9uLgorICArMHgwMTE4IHwgMDAgMDAgMDAgMDAgMDAgQzAgNUUgNDAgfCAgICAgICAgICAgICAgfCAuLi4uLi5eQAorICArMHgwMTIwIHwgMDAgMDAgMDAgMDAgOTIgRkUgRkYgRkYgfCAgICAgICAgICAgICAgfCAuLi4uLi4uLgorICArMHgwMTI4IHwgMDAgMDAgMDAgMDEgICAgICAgICAgICAgfCAgICAgICAgICAgICAgfCAuLi4uCisKK3ZlY3RvciAoQW5ub3RhdGVkQmluYXJ5LkZvby5mb29iYXJzX3R5cGUpOgorICArMHgwMTJDIHwgMDMgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICAgfCAweDAwMDAwMDAzICgzKSAgICAgICAgICAgICAgICAgfCBsZW5ndGggb2YgdmVjdG9yICgjIGl0ZW1zKQorICArMHgwMTMwIHwgMDEgICAgICAgICAgICAgICAgICAgICAgfCBVVHlwZTggICAgICAgfCAweDAxICgxKSAgICAgICAgICAgICAgICAgICAgICAgfCB2YWx1ZVswXQorICArMHgwMTMxIHwgMDIgICAgICAgICAgICAgICAgICAgICAgfCBVVHlwZTggICAgICAgfCAweDAyICgyKSAgICAgICAgICAgICAgICAgICAgICAgfCB2YWx1ZVsxXQorICArMHgwMTMyIHwgMDEgICAgICAgICAgICAgICAgICAgICAgfCBVVHlwZTggICAgICAgfCAweDAxICgxKSAgICAgICAgICAgICAgICAgICAgICAgfCB2YWx1ZVsyXQorCit2ZWN0b3IgKEFubm90YXRlZEJpbmFyeS5Gb28ucG9pbnRzX29mX2ludGVyZXN0KToKKyAgKzB4MDEzNCB8IDAzIDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgIHwgMHgwMDAwMDAwMyAoMykgICAgICAgICAgICAgICAgIHwgbGVuZ3RoIG9mIHZlY3RvciAoIyBpdGVtcykKKyAgKzB4MDEzOCB8IDMzIDMzIDMzIDMzIDMzIEEzIDQ1IDQwIHwgZG91YmxlICAgICAgIHwgMHg0MDQ1QTMzMzMzMzMzMzMzICg0My4yNzUpICAgIHwgc3RydWN0IGZpZWxkIGBBbm5vdGF0ZWRCaW5hcnkuTG9jYXRpb24ubGF0aXR1ZGVgIChEb3VibGUpCisgICsweDAxNDAgfCA3RSA1NyAwNCBGRiA1QiA4NyA1MyBDMCB8IGRvdWJsZSAgICAgICB8IDB4QzA1Mzg3NUJGRjA0NTc3RSAoLTc4LjExNSkgICB8IHN0cnVjdCBmaWVsZCBgQW5ub3RhdGVkQmluYXJ5LkxvY2F0aW9uLmxvbmdpdHVkZWAgKERvdWJsZSkKKyAgKzB4MDE0OCB8IDhEIEYwIEY2IDIwIDA0IEI2IDQyIDQwIHwgZG91YmxlICAgICAgIHwgMHg0MDQyQjYwNDIwRjZGMDhEICgzNy40MjIpICAgIHwgc3RydWN0IGZpZWxkIGBBbm5vdGF0ZWRCaW5hcnkuTG9jYXRpb24ubGF0aXR1ZGVgIChEb3VibGUpCisgICsweDAxNTAgfCA5RiA3NyA2MyA0MSA2MSA4NSA1RSBDMCB8IGRvdWJsZSAgICAgICB8IDB4QzA1RTg1NjE0MTYzNzc5RiAoLTEyMi4wODQpICB8IHN0cnVjdCBmaWVsZCBgQW5ub3RhdGVkQmluYXJ5LkxvY2F0aW9uLmxvbmdpdHVkZWAgKERvdWJsZSkKKyAgKzB4MDE1OCB8IDhGIDM1IDIzIDgzIERDIDM1IDRCIEMwIHwgZG91YmxlICAgICAgIHwgMHhDMDRCMzVEQzgzMjMzNThGICgtNTQuNDIwOCkgIHwgc3RydWN0IGZpZWxkIGBBbm5vdGF0ZWRCaW5hcnkuTG9jYXRpb24ubGF0aXR1ZGVgIChEb3VibGUpCisgICsweDAxNjAgfCBGNiA5NyBERCA5MyA4NyBDNSAwQSA0MCB8IGRvdWJsZSAgICAgICB8IDB4NDAwQUM1ODc5M0REOTdGNiAoMy4zNDY0NSkgICB8IHN0cnVjdCBmaWVsZCBgQW5ub3RhdGVkQmluYXJ5LkxvY2F0aW9uLmxvbmdpdHVkZWAgKERvdWJsZSkKKworcGFkZGluZzoKKyAgKzB4MDE2OCB8IDAwIDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDhfdFs0XSAgIHwgLi4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgcGFkZGluZworCit2ZWN0b3IgKEFubm90YXRlZEJpbmFyeS5Gb28ubmFtZXMpOgorICArMHgwMTZDIHwgMDMgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICAgfCAweDAwMDAwMDAzICgzKSAgICAgICAgICAgICAgICAgfCBsZW5ndGggb2YgdmVjdG9yICgjIGl0ZW1zKQorICArMHgwMTcwIHwgMjAgMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICAgfCAweDAwMDAwMDIwICgzMikgTG9jOiArMHgwMTkwICAgfCBvZmZzZXQgdG8gc3RyaW5nWzBdCisgICsweDAxNzQgfCAxNCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgICB8IDB4MDAwMDAwMTQgKDIwKSBMb2M6ICsweDAxODggICB8IG9mZnNldCB0byBzdHJpbmdbMV0KKyAgKzB4MDE3OCB8IDA0IDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgIHwgMHgwMDAwMDAwNCAoNCkgTG9jOiArMHgwMTdDICAgIHwgb2Zmc2V0IHRvIHN0cmluZ1syXQorCitzdHJpbmcgKEFubm90YXRlZEJpbmFyeS5Gb28ubmFtZXMpOgorICArMHgwMTdDIHwgMDcgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICAgfCAweDAwMDAwMDA3ICg3KSAgICAgICAgICAgICAgICAgfCBsZW5ndGggb2Ygc3RyaW5nCisgICsweDAxODAgfCA2MyA2OCA2MSA3MiA2QyA2OSA2NSAgICB8IGNoYXJbN10gICAgICB8IGNoYXJsaWUgICAgICAgICAgICAgICAgICAgICAgICB8IHN0cmluZyBsaXRlcmFsCisgICsweDAxODcgfCAwMCAgICAgICAgICAgICAgICAgICAgICB8IGNoYXIgICAgICAgICB8IDB4MDAgKDApICAgICAgICAgICAgICAgICAgICAgICB8IHN0cmluZyB0ZXJtaW5hdG9yCisKK3N0cmluZyAoQW5ub3RhdGVkQmluYXJ5LkZvby5uYW1lcyk6CisgICsweDAxODggfCAwMyAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgICB8IDB4MDAwMDAwMDMgKDMpICAgICAgICAgICAgICAgICB8IGxlbmd0aCBvZiBzdHJpbmcKKyAgKzB4MDE4QyB8IDYyIDZGIDYyICAgICAgICAgICAgICAgIHwgY2hhclszXSAgICAgIHwgYm9iICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nIGxpdGVyYWwKKyAgKzB4MDE4RiB8IDAwICAgICAgICAgICAgICAgICAgICAgIHwgY2hhciAgICAgICAgIHwgMHgwMCAoMCkgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nIHRlcm1pbmF0b3IKKworc3RyaW5nIChBbm5vdGF0ZWRCaW5hcnkuRm9vLm5hbWVzKToKKyAgKzB4MDE5MCB8IDA1IDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgIHwgMHgwMDAwMDAwNSAoNSkgICAgICAgICAgICAgICAgIHwgbGVuZ3RoIG9mIHN0cmluZworICArMHgwMTk0IHwgNjEgNkMgNjkgNjMgNjUgICAgICAgICAgfCBjaGFyWzVdICAgICAgfCBhbGljZSAgICAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJpbmcgbGl0ZXJhbAorICArMHgwMTk5IHwgMDAgICAgICAgICAgICAgICAgICAgICAgfCBjaGFyICAgICAgICAgfCAweDAwICgwKSAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJpbmcgdGVybWluYXRvcgorCitwYWRkaW5nOgorICArMHgwMTlBIHwgMDAgMDAgICAgICAgICAgICAgICAgICAgfCB1aW50OF90WzJdICAgfCAuLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBwYWRkaW5nCisKK3N0cmluZyAoQW5ub3RhdGVkQmluYXJ5LkZvby5hbGljZSk6CisgICsweDAxOUMgfCAwNyAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgICB8IDB4MDAwMDAwMDcgKDcpICAgICAgICAgICAgICAgICB8IGxlbmd0aCBvZiBzdHJpbmcKKyAgKzB4MDFBMCB8IDYzIDY4IDYxIDcyIDZDIDY5IDY1ICAgIHwgY2hhcls3XSAgICAgIHwgY2hhcmxpZSAgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nIGxpdGVyYWwKKyAgKzB4MDFBNyB8IDAwICAgICAgICAgICAgICAgICAgICAgIHwgY2hhciAgICAgICAgIHwgMHgwMCAoMCkgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nIHRlcm1pbmF0b3IKKworc3RyaW5nIChBbm5vdGF0ZWRCaW5hcnkuRm9vLmJvYik6CisgICsweDAxQTggfCAwNyAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgICB8IDB4MDAwMDAwMDcgKDcpICAgICAgICAgICAgICAgICB8IGxlbmd0aCBvZiBzdHJpbmcKKyAgKzB4MDFBQyB8IDYzIDY4IDYxIDcyIDZDIDY5IDY1ICAgIHwgY2hhcls3XSAgICAgIHwgY2hhcmxpZSAgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nIGxpdGVyYWwKKyAgKzB4MDFCMyB8IDAwICAgICAgICAgICAgICAgICAgICAgIHwgY2hhciAgICAgICAgIHwgMHgwMCAoMCkgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nIHRlcm1pbmF0b3IKKwordmVjdG9yIChBbm5vdGF0ZWRCaW5hcnkuRm9vLmFjY291bnRzKToKKyAgKzB4MDFCNCB8IDA5IDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgIHwgMHgwMDAwMDAwOSAoOSkgICAgICAgICAgICAgICAgIHwgbGVuZ3RoIG9mIHZlY3RvciAoIyBpdGVtcykKKyAgKzB4MDFCOCB8IDA5IDAwICAgICAgICAgICAgICAgICAgIHwgdWludDE2X3QgICAgIHwgMHgwMDA5ICg5KSAgICAgICAgICAgICAgICAgICAgIHwgdmFsdWVbMF0KKyAgKzB4MDFCQSB8IDA4IDAwICAgICAgICAgICAgICAgICAgIHwgdWludDE2X3QgICAgIHwgMHgwMDA4ICg4KSAgICAgICAgICAgICAgICAgICAgIHwgdmFsdWVbMV0KKyAgKzB4MDFCQyB8IDA3IDAwICAgICAgICAgICAgICAgICAgIHwgdWludDE2X3QgICAgIHwgMHgwMDA3ICg3KSAgICAgICAgICAgICAgICAgICAgIHwgdmFsdWVbMl0KKyAgKzB4MDFCRSB8IDAxIDAwICAgICAgICAgICAgICAgICAgIHwgdWludDE2X3QgICAgIHwgMHgwMDAxICgxKSAgICAgICAgICAgICAgICAgICAgIHwgdmFsdWVbM10KKyAgKzB4MDFDMCB8IDAyIDAwICAgICAgICAgICAgICAgICAgIHwgdWludDE2X3QgICAgIHwgMHgwMDAyICgyKSAgICAgICAgICAgICAgICAgICAgIHwgdmFsdWVbNF0KKyAgKzB4MDFDMiB8IDAzIDAwICAgICAgICAgICAgICAgICAgIHwgdWludDE2X3QgICAgIHwgMHgwMDAzICgzKSAgICAgICAgICAgICAgICAgICAgIHwgdmFsdWVbNV0KKyAgKzB4MDFDNCB8IDA2IDAwICAgICAgICAgICAgICAgICAgIHwgdWludDE2X3QgICAgIHwgMHgwMDA2ICg2KSAgICAgICAgICAgICAgICAgICAgIHwgdmFsdWVbNl0KKyAgKzB4MDFDNiB8IDA1IDAwICAgICAgICAgICAgICAgICAgIHwgdWludDE2X3QgICAgIHwgMHgwMDA1ICg1KSAgICAgICAgICAgICAgICAgICAgIHwgdmFsdWVbN10KKyAgKzB4MDFDOCB8IDA0IDAwICAgICAgICAgICAgICAgICAgIHwgdWludDE2X3QgICAgIHwgMHgwMDA0ICg0KSAgICAgICAgICAgICAgICAgICAgIHwgdmFsdWVbOF0KKworcGFkZGluZzoKKyAgKzB4MDFDQSB8IDAwIDAwICAgICAgICAgICAgICAgICAgIHwgdWludDhfdFsyXSAgIHwgLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgcGFkZGluZworCit0YWJsZSAoQW5ub3RhdGVkQmluYXJ5LkJheik6CisgICsweDAxQ0MgfCAzQSBGRiBGRiBGRiAgICAgICAgICAgICB8IFNPZmZzZXQzMiAgICB8IDB4RkZGRkZGM0EgKC0xOTgpIExvYzogKzB4MDI5MiB8IEVSUk9SOiBvZmZzZXQgdG8gdnRhYmxlLiBJbnZhbGlkIG9mZnNldCwgcG9pbnRzIG91dHNpZGUgdGhlIGJpbmFyeS4KKwordW5rbm93biAobm8ga25vd24gcmVmZXJlbmNlcyk6CisgICsweDAxRDAgfCAwMCAwMCAwMCAwMyAgICAgICAgICAgICB8ID91aW50OF90WzRdICB8IC4uLi4gICAgICAgICAgICAgICAgICAgICAgICAgICB8IFdBUk46IGNvdWxkIGJlIGNvcnJ1cHRlZCBwYWRkaW5nIHJlZ2lvbi4KKwordmVjdG9yIChBbm5vdGF0ZWRCaW5hcnkuRm9vLmJhcnMpOgorICArMHgwMUQ0IHwgMDIgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICAgfCAweDAwMDAwMDAyICgyKSAgICAgICAgICAgICAgICAgfCBFUlJPUjogbGVuZ3RoIG9mIHZlY3RvciAoIyBpdGVtcykuIExvbmdlciB0aGFuIHRoZSBiaW5hcnkuCisKK3Vua25vd24gKG5vIGtub3duIHJlZmVyZW5jZXMpOgorICArMHgwMUQ4IHwgNDQgMDAgMDAgMDAgMTAgMDAgICAgICAgfCA/dWludDhfdFs2XSAgfCBELi4uLi4gICAgICAgICAgICAgICAgICAgICAgICAgfCBXQVJOOiBjb3VsZCBiZSBjb3JydXB0ZWQgcGFkZGluZyByZWdpb24uCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9hbm5vdGF0ZWRfYmluYXJ5L3Rlc3RzL2ludmFsaWRfdmVjdG9yX3RhYmxlc19jdXRfc2hvcnQuYmluIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvYW5ub3RhdGVkX2JpbmFyeS90ZXN0cy9pbnZhbGlkX3ZlY3Rvcl90YWJsZXNfY3V0X3Nob3J0LmJpbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yODIzZDgzCi0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvYW5ub3RhdGVkX2JpbmFyeS90ZXN0cy9pbnZhbGlkX3ZlY3Rvcl90YWJsZXNfY3V0X3Nob3J0LmJpbgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9hbm5vdGF0ZWRfYmluYXJ5L3Rlc3RzL2ludmFsaWRfdmVjdG9yX3VuaW9uX3R5cGVfdmFsdWUuYWZiIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvYW5ub3RhdGVkX2JpbmFyeS90ZXN0cy9pbnZhbGlkX3ZlY3Rvcl91bmlvbl90eXBlX3ZhbHVlLmFmYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZmE2NzI4Ci0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvYW5ub3RhdGVkX2JpbmFyeS90ZXN0cy9pbnZhbGlkX3ZlY3Rvcl91bmlvbl90eXBlX3ZhbHVlLmFmYgpAQCAtMCwwICsxLDI5MyBAQAorLy8gQW5ub3RhdGVkIEZsYXRidWZmZXIgQmluYXJ5CisvLworLy8gU2NoZW1hIGZpbGU6IGFubm90YXRlZF9iaW5hcnkuZmJzCisvLyBCaW5hcnkgZmlsZTogdGVzdHMvaW52YWxpZF92ZWN0b3JfdW5pb25fdHlwZV92YWx1ZS5iaW4KKworaGVhZGVyOgorICArMHgwMDAwIHwgNDQgMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDAwNDQgKDY4KSBMb2M6ICsweDAwNDQgICB8IG9mZnNldCB0byByb290IHRhYmxlIGBBbm5vdGF0ZWRCaW5hcnkuRm9vYAorICArMHgwMDA0IHwgNDEgNEUgNEUgNEYgICAgICAgICAgICAgfCBjaGFyWzRdICAgICB8IEFOTk8gICAgICAgICAgICAgICAgICAgICAgICAgICB8IEZpbGUgSWRlbnRpZmllcgorCitwYWRkaW5nOgorICArMHgwMDA4IHwgMDAgMDAgICAgICAgICAgICAgICAgICAgfCB1aW50OF90WzJdICB8IC4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHBhZGRpbmcKKwordnRhYmxlIChBbm5vdGF0ZWRCaW5hcnkuRm9vKToKKyAgKzB4MDAwQSB8IDNBIDAwICAgICAgICAgICAgICAgICAgIHwgdWludDE2X3QgICAgfCAweDAwM0EgKDU4KSAgICAgICAgICAgICAgICAgICAgfCBzaXplIG9mIHRoaXMgdnRhYmxlCisgICsweDAwMEMgfCA2OCAwMCAgICAgICAgICAgICAgICAgICB8IHVpbnQxNl90ICAgIHwgMHgwMDY4ICgxMDQpICAgICAgICAgICAgICAgICAgIHwgc2l6ZSBvZiByZWZlcnJpbmcgdGFibGUKKyAgKzB4MDAwRSB8IDBDIDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgfCAweDAwMEMgKDEyKSAgICAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYGNvdW50ZXJgIChpZDogMCkKKyAgKzB4MDAxMCB8IDA3IDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgfCAweDAwMDcgKDcpICAgICAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYGhlYWx0aHlgIChpZDogMSkKKyAgKzB4MDAxMiB8IDAwIDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgfCAweDAwMDAgKDApICAgICAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYGxldmVsYCAoaWQ6IDIpIDxkZWZhdWx0cyB0byA5OT4gKExvbmcpCisgICsweDAwMTQgfCAwOCAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgIHwgMHgwMDA4ICg4KSAgICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBtZWFsYCAoaWQ6IDMpCisgICsweDAwMTYgfCAxMCAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgIHwgMHgwMDEwICgxNikgICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBiYXJgIChpZDogNCkKKyAgKzB4MDAxOCB8IDE0IDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgfCAweDAwMTQgKDIwKSAgICAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYGhvbWVgIChpZDogNSkKKyAgKzB4MDAxQSB8IDMwIDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgfCAweDAwMzAgKDQ4KSAgICAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYG5hbWVgIChpZDogNikKKyAgKzB4MDAxQyB8IDM0IDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgfCAweDAwMzQgKDUyKSAgICAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYGJhcnNgIChpZDogNykKKyAgKzB4MDAxRSB8IDA5IDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgfCAweDAwMDkgKDkpICAgICAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYGJhcl9iYXpfdHlwZWAgKGlkOiA4KQorICArMHgwMDIwIHwgMzggMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgICB8IDB4MDAzOCAoNTYpICAgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgYmFyX2JhemAgKGlkOiA5KQorICArMHgwMDIyIHwgM0MgMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgICB8IDB4MDAzQyAoNjApICAgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgYWNjb3VudHNgIChpZDogMTApCisgICsweDAwMjQgfCA0MCAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgIHwgMHgwMDQwICg2NCkgICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBib2JgIChpZDogMTEpCisgICsweDAwMjYgfCA0NCAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgIHwgMHgwMDQ0ICg2OCkgICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBhbGljZWAgKGlkOiAxMikKKyAgKzB4MDAyOCB8IDAwIDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgfCAweDAwMDAgKDApICAgICAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYG1heWJlX2kzMmAgKGlkOiAxMykgPGRlZmF1bHRzIHRvIDA+IChJbnQpCisgICsweDAwMkEgfCAwMCAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgIHwgMHgwMDAwICgwKSAgICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBkZWZhdWx0X2kzMmAgKGlkOiAxNCkgPGRlZmF1bHRzIHRvIDQyPiAoSW50KQorICArMHgwMDJDIHwgNDggMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgICB8IDB4MDA0OCAoNzIpICAgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBganVzdF9pMzJgIChpZDogMTUpCisgICsweDAwMkUgfCA0QyAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgIHwgMHgwMDRDICg3NikgICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBuYW1lc2AgKGlkOiAxNikKKyAgKzB4MDAzMCB8IDUwIDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgfCAweDAwNTAgKDgwKSAgICAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYHBvaW50c19vZl9pbnRlcmVzdGAgKGlkOiAxNykKKyAgKzB4MDAzMiB8IDU0IDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgfCAweDAwNTQgKDg0KSAgICAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYGZvb2JhcnNfdHlwZWAgKGlkOiAxOCkKKyAgKzB4MDAzNCB8IDU4IDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgfCAweDAwNTggKDg4KSAgICAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYGZvb2JhcnNgIChpZDogMTkpCisgICsweDAwMzYgfCAwQSAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgIHwgMHgwMDBBICgxMCkgICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBtZWFzdXJlbWVudF90eXBlYCAoaWQ6IDIwKQorICArMHgwMDM4IHwgNUMgMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgICB8IDB4MDA1QyAoOTIpICAgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgbWVhc3VyZW1lbnRgIChpZDogMjEpCisgICsweDAwM0EgfCAwQiAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgIHwgMHgwMDBCICgxMSkgICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBhbnl0aGluZ190eXBlYCAoaWQ6IDIyKQorICArMHgwMDNDIHwgNjAgMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgICB8IDB4MDA2MCAoOTYpICAgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgYW55dGhpbmdgIChpZDogMjMpCisgICsweDAwM0UgfCAwMCAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgIHwgMHgwMDAwICgwKSAgICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGB0ZW1wZXJhdHVyZWAgKGlkOiAyNCkgPGRlZmF1bHRzIHRvIDk4LjYwMDAwMD4gKEZsb2F0KQorICArMHgwMDQwIHwgMDAgMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgICB8IDB4MDAwMCAoMCkgICAgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgdGVldG90YWxlcmAgKGlkOiAyNSkgPG51bGw+IChPYmopCisgICsweDAwNDIgfCA2NCAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgIHwgMHgwMDY0ICgxMDApICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBjaGFybGllYCAoaWQ6IDI2KQorCityb290X3RhYmxlIChBbm5vdGF0ZWRCaW5hcnkuRm9vKToKKyAgKzB4MDA0NCB8IDNBIDAwIDAwIDAwICAgICAgICAgICAgIHwgU09mZnNldDMyICAgfCAweDAwMDAwMDNBICg1OCkgTG9jOiArMHgwMDBBICAgfCBvZmZzZXQgdG8gdnRhYmxlCisgICsweDAwNDggfCAwMCAwMCAwMCAgICAgICAgICAgICAgICB8IHVpbnQ4X3RbM10gIHwgLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgcGFkZGluZworICArMHgwMDRCIHwgMDEgICAgICAgICAgICAgICAgICAgICAgfCB1aW50OF90ICAgICB8IDB4MDEgKDEpICAgICAgICAgICAgICAgICAgICAgICB8IHRhYmxlIGZpZWxkIGBoZWFsdGh5YCAoQm9vbCkKKyAgKzB4MDA0QyB8IDAyICAgICAgICAgICAgICAgICAgICAgIHwgdWludDhfdCAgICAgfCAweDAyICgyKSAgICAgICAgICAgICAgICAgICAgICAgfCB0YWJsZSBmaWVsZCBgbWVhbGAgKEJ5dGUpCisgICsweDAwNEQgfCAwMiAgICAgICAgICAgICAgICAgICAgICB8IFVUeXBlOCAgICAgIHwgMHgwMiAoMikgICAgICAgICAgICAgICAgICAgICAgIHwgdGFibGUgZmllbGQgYGJhcl9iYXpfdHlwZWAgKFVUeXBlKQorICArMHgwMDRFIHwgMDEgICAgICAgICAgICAgICAgICAgICAgfCBVVHlwZTggICAgICB8IDB4MDEgKDEpICAgICAgICAgICAgICAgICAgICAgICB8IHRhYmxlIGZpZWxkIGBtZWFzdXJlbWVudF90eXBlYCAoVVR5cGUpCisgICsweDAwNEYgfCAwMSAgICAgICAgICAgICAgICAgICAgICB8IFVUeXBlOCAgICAgIHwgMHgwMSAoMSkgICAgICAgICAgICAgICAgICAgICAgIHwgdGFibGUgZmllbGQgYGFueXRoaW5nX3R5cGVgIChVVHlwZSkKKyAgKzB4MDA1MCB8IEQyIDA0IDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgfCAweDAwMDAwNEQyICgxMjM0KSAgICAgICAgICAgICAgfCB0YWJsZSBmaWVsZCBgY291bnRlcmAgKEludCkKKyAgKzB4MDA1NCB8IDI4IDAyIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMjI4ICg1NTIpIExvYzogKzB4MDI3QyAgfCBvZmZzZXQgdG8gZmllbGQgYGJhcmAgKHRhYmxlKQorICArMHgwMDU4IHwgMDEgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICB8IDB4MDAwMDAwMDEgKDEpICAgICAgICAgICAgICAgICB8IHN0cnVjdCBmaWVsZCBgQW5ub3RhdGVkQmluYXJ5LkJ1aWxkaW5nLmZsb29yc2AgKEludCkKKyAgKzB4MDA1QyB8IDAyIDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgfCAweDAwMDAwMDAyICgyKSAgICAgICAgICAgICAgICAgfCBzdHJ1Y3QgZmllbGQgYEFubm90YXRlZEJpbmFyeS5CdWlsZGluZy5kb29yc2AgKEludCkKKyAgKzB4MDA2MCB8IDBDIDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgfCAweDAwMDAwMDBDICgxMikgICAgICAgICAgICAgICAgfCBzdHJ1Y3QgZmllbGQgYEFubm90YXRlZEJpbmFyeS5CdWlsZGluZy53aW5kb3dzYCAoSW50KQorICArMHgwMDY0IHwgMEEgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICB8IDB4MDAwMDAwMEEgKDEwKSAgICAgICAgICAgICAgICB8IGFycmF5IGZpZWxkIGBBbm5vdGF0ZWRCaW5hcnkuRGltZW5zaW9uLnZhbHVlc2BbMF0gKEludCkKKyAgKzB4MDA2OCB8IDBDIDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgfCAweDAwMDAwMDBDICgxMikgICAgICAgICAgICAgICAgfCBhcnJheSBmaWVsZCBgQW5ub3RhdGVkQmluYXJ5LkRpbWVuc2lvbi52YWx1ZXNgWzFdIChJbnQpCisgICsweDAwNkMgfCAxNCAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgIHwgMHgwMDAwMDAxNCAoMjApICAgICAgICAgICAgICAgIHwgYXJyYXkgZmllbGQgYEFubm90YXRlZEJpbmFyeS5EaW1lbnNpb24udmFsdWVzYFsyXSAoSW50KQorICArMHgwMDcwIHwgMDEgICAgICAgICAgICAgICAgICAgICAgfCB1aW50OF90ICAgICB8IDB4MDEgKDEpICAgICAgICAgICAgICAgICAgICAgICB8IHN0cnVjdCBmaWVsZCBgQW5ub3RhdGVkQmluYXJ5LlRvbGVyYW5jZS53aWR0aGAgKFVCeXRlKQorICArMHgwMDcxIHwgMDIgICAgICAgICAgICAgICAgICAgICAgfCB1aW50OF90ICAgICB8IDB4MDIgKDIpICAgICAgICAgICAgICAgICAgICAgICB8IHN0cnVjdCBmaWVsZCBgQW5ub3RhdGVkQmluYXJ5LlRvbGVyYW5jZS53aWR0aGAgKFVCeXRlKQorICArMHgwMDcyIHwgMDMgICAgICAgICAgICAgICAgICAgICAgfCB1aW50OF90ICAgICB8IDB4MDMgKDMpICAgICAgICAgICAgICAgICAgICAgICB8IHN0cnVjdCBmaWVsZCBgQW5ub3RhdGVkQmluYXJ5LlRvbGVyYW5jZS53aWR0aGAgKFVCeXRlKQorICArMHgwMDczIHwgMDAgICAgICAgICAgICAgICAgICAgICAgfCB1aW50OF90WzFdICB8IC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHBhZGRpbmcKKyAgKzB4MDA3NCB8IEM4IDAxIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMUM4ICg0NTYpIExvYzogKzB4MDIzQyAgfCBvZmZzZXQgdG8gZmllbGQgYG5hbWVgIChzdHJpbmcpCisgICsweDAwNzggfCA1QyAwMSAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDE1QyAoMzQ4KSBMb2M6ICsweDAxRDQgIHwgb2Zmc2V0IHRvIGZpZWxkIGBiYXJzYCAodmVjdG9yKQorICArMHgwMDdDIHwgNTAgMDEgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDAxNTAgKDMzNikgTG9jOiArMHgwMUNDICB8IG9mZnNldCB0byBmaWVsZCBgYmFyX2JhemAgKHVuaW9uIG9mIHR5cGUgYEJhemApCisgICsweDAwODAgfCAzNCAwMSAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDEzNCAoMzA4KSBMb2M6ICsweDAxQjQgIHwgb2Zmc2V0IHRvIGZpZWxkIGBhY2NvdW50c2AgKHZlY3RvcikKKyAgKzB4MDA4NCB8IDI0IDAxIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMTI0ICgyOTIpIExvYzogKzB4MDFBOCAgfCBvZmZzZXQgdG8gZmllbGQgYGJvYmAgKHN0cmluZykKKyAgKzB4MDA4OCB8IDE0IDAxIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMTE0ICgyNzYpIExvYzogKzB4MDE5QyAgfCBvZmZzZXQgdG8gZmllbGQgYGFsaWNlYCAoc3RyaW5nKQorICArMHgwMDhDIHwgMEQgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICB8IDB4MDAwMDAwMEQgKDEzKSAgICAgICAgICAgICAgICB8IHRhYmxlIGZpZWxkIGBqdXN0X2kzMmAgKEludCkKKyAgKzB4MDA5MCB8IERDIDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMERDICgyMjApIExvYzogKzB4MDE2QyAgfCBvZmZzZXQgdG8gZmllbGQgYG5hbWVzYCAodmVjdG9yKQorICArMHgwMDk0IHwgQTAgMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDAwQTAgKDE2MCkgTG9jOiArMHgwMTM0ICB8IG9mZnNldCB0byBmaWVsZCBgcG9pbnRzX29mX2ludGVyZXN0YCAodmVjdG9yKQorICArMHgwMDk4IHwgOTQgMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDAwOTQgKDE0OCkgTG9jOiArMHgwMTJDICB8IG9mZnNldCB0byBmaWVsZCBgZm9vYmFyc190eXBlYCAodmVjdG9yKQorICArMHgwMDlDIHwgMzggMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDAwMzggKDU2KSBMb2M6ICsweDAwRDQgICB8IG9mZnNldCB0byBmaWVsZCBgZm9vYmFyc2AgKHZlY3RvcikKKyAgKzB4MDBBMCB8IDMzIDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMDMzICg1MSkgTG9jOiArMHgwMEQzICAgfCBvZmZzZXQgdG8gZmllbGQgYG1lYXN1cmVtZW50YCAodW5pb24gb2YgdHlwZSBgVG9sZXJhbmNlYCkKKyAgKzB4MDBBNCB8IDFDIDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMDFDICgyOCkgTG9jOiArMHgwMEMwICAgfCBvZmZzZXQgdG8gZmllbGQgYGFueXRoaW5nYCAodW5pb24gb2YgdHlwZSBgQmFyYCkKKyAgKzB4MDBBOCB8IDA0IDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMDA0ICg0KSBMb2M6ICsweDAwQUMgICAgfCBvZmZzZXQgdG8gZmllbGQgYGNoYXJsaWVgIChzdHJpbmcpCisKK3N0cmluZyAoQW5ub3RhdGVkQmluYXJ5LkZvby5jaGFybGllKToKKyAgKzB4MDBBQyB8IDA1IDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgfCAweDAwMDAwMDA1ICg1KSAgICAgICAgICAgICAgICAgfCBsZW5ndGggb2Ygc3RyaW5nCisgICsweDAwQjAgfCA2MSA2QyA2OSA2MyA2NSAgICAgICAgICB8IGNoYXJbNV0gICAgIHwgYWxpY2UgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nIGxpdGVyYWwKKyAgKzB4MDBCNSB8IDAwICAgICAgICAgICAgICAgICAgICAgIHwgY2hhciAgICAgICAgfCAweDAwICgwKSAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJpbmcgdGVybWluYXRvcgorCitwYWRkaW5nOgorICArMHgwMEI2IHwgMDAgMDAgICAgICAgICAgICAgICAgICAgfCB1aW50OF90WzJdICB8IC4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHBhZGRpbmcKKwordnRhYmxlIChBbm5vdGF0ZWRCaW5hcnkuQmFyKToKKyAgKzB4MDBCOCB8IDA4IDAwICAgICAgICAgICAgICAgICAgIHwgdWludDE2X3QgICAgfCAweDAwMDggKDgpICAgICAgICAgICAgICAgICAgICAgfCBzaXplIG9mIHRoaXMgdnRhYmxlCisgICsweDAwQkEgfCAxMyAwMCAgICAgICAgICAgICAgICAgICB8IHVpbnQxNl90ICAgIHwgMHgwMDEzICgxOSkgICAgICAgICAgICAgICAgICAgIHwgc2l6ZSBvZiByZWZlcnJpbmcgdGFibGUKKyAgKzB4MDBCQyB8IDA4IDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgfCAweDAwMDggKDgpICAgICAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYGFgIChpZDogMCkKKyAgKzB4MDBCRSB8IDA0IDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgfCAweDAwMDQgKDQpICAgICAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYGJgIChpZDogMSkKKwordGFibGUgKEFubm90YXRlZEJpbmFyeS5CYXIpOgorICArMHgwMEMwIHwgMDggMDAgMDAgMDAgICAgICAgICAgICAgfCBTT2Zmc2V0MzIgICB8IDB4MDAwMDAwMDggKDgpIExvYzogKzB4MDBCOCAgICB8IG9mZnNldCB0byB2dGFibGUKKyAgKzB4MDBDNCB8IDAwIDgwIDIzIDQ0ICAgICAgICAgICAgIHwgZmxvYXQgICAgICAgfCAweDQ0MjM4MDAwICg2NTQpICAgICAgICAgICAgICAgfCB0YWJsZSBmaWVsZCBgYmAgKEZsb2F0KQorICArMHgwMEM4IHwgMDAgMDAgMDAgMDAgMDAgMTAgNzQgNDAgfCBkb3VibGUgICAgICB8IDB4NDA3NDEwMDAwMDAwMDAwMCAoMzIxKSAgICAgICB8IHRhYmxlIGZpZWxkIGBhYCAoRG91YmxlKQorICArMHgwMEQwIHwgMDAgMDAgMDAgICAgICAgICAgICAgICAgfCB1aW50OF90WzNdICB8IC4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHBhZGRpbmcKKwordW5pb24gKEFubm90YXRlZEJpbmFyeS5Ub2xlcmFuY2UubWVhc3VyZW1lbnQpOgorICArMHgwMEQzIHwgMDUgICAgICAgICAgICAgICAgICAgICAgfCB1aW50OF90ICAgICB8IDB4MDUgKDUpICAgICAgICAgICAgICAgICAgICAgICB8IHN0cnVjdCBmaWVsZCBgQW5ub3RhdGVkQmluYXJ5LlRvbGVyYW5jZS53aWR0aGAgKFVCeXRlKQorCit2ZWN0b3IgKEFubm90YXRlZEJpbmFyeS5Gb28uZm9vYmFycyk6CisgICsweDAwRDQgfCAwMyAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgIHwgMHgwMDAwMDAwMyAoMykgICAgICAgICAgICAgICAgIHwgbGVuZ3RoIG9mIHZlY3RvciAoIyBpdGVtcykKKyAgKzB4MDBEOCB8IDM0IDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMDM0ICg1MikgTG9jOiArMHgwMTBDICAgfCBvZmZzZXQgdG8gdW5pb25bMF0gKGBCYXJgKQorICArMHgwMERDIHwgMkMgMDAgMDAgMDAgICAgICAgICAgICAgfCA/dWludDhfdFs0XSB8ICwuLi4gICAgICAgICAgICAgICAgICAgICAgICAgICB8IFdBUk46IG5vdGhpbmcgcmVmZXJzIHRvIHRoaXMgc2VjdGlvbi4KKyAgKzB4MDBFMCB8IDA0IDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMDA0ICg0KSBMb2M6ICsweDAwRTQgICAgfCBvZmZzZXQgdG8gdW5pb25bMl0gKGBCYXJgKQorCit0YWJsZSAoQW5ub3RhdGVkQmluYXJ5LkJhcik6CisgICsweDAwRTQgfCBEMiBGRSBGRiBGRiAgICAgICAgICAgICB8IFNPZmZzZXQzMiAgIHwgMHhGRkZGRkVEMiAoLTMwMikgTG9jOiArMHgwMjEyIHwgb2Zmc2V0IHRvIHZ0YWJsZQorICArMHgwMEU4IHwgMDAgODAgMjMgNDQgICAgICAgICAgICAgfCBmbG9hdCAgICAgICB8IDB4NDQyMzgwMDAgKDY1NCkgICAgICAgICAgICAgICB8IHRhYmxlIGZpZWxkIGBiYCAoRmxvYXQpCisgICsweDAwRUMgfCAxMCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDAxMCAoMTYpIExvYzogKzB4MDBGQyAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBjYCAodGFibGUpCisgICsweDAwRjAgfCAwMCAwMCAwMCAwMCAwMCBEOCA4RSA0MCB8IGRvdWJsZSAgICAgIHwgMHg0MDhFRDgwMDAwMDAwMDAwICg5ODcpICAgICAgIHwgdGFibGUgZmllbGQgYGFgIChEb3VibGUpCisgICsweDAwRjggfCAwMCAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQ4X3RbNF0gIHwgLi4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgcGFkZGluZworCit0YWJsZSAoQW5ub3RhdGVkQmluYXJ5LkJheik6CisgICsweDAwRkMgfCA2QSBGRSBGRiBGRiAgICAgICAgICAgICB8IFNPZmZzZXQzMiAgIHwgMHhGRkZGRkU2QSAoLTQwNikgTG9jOiArMHgwMjkyIHwgb2Zmc2V0IHRvIHZ0YWJsZQorICArMHgwMTAwIHwgMDAgMDAgMDAgICAgICAgICAgICAgICAgfCB1aW50OF90WzNdICB8IC4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHBhZGRpbmcKKyAgKzB4MDEwMyB8IDAzICAgICAgICAgICAgICAgICAgICAgIHwgdWludDhfdCAgICAgfCAweDAzICgzKSAgICAgICAgICAgICAgICAgICAgICAgfCB0YWJsZSBmaWVsZCBgbWVhbGAgKEJ5dGUpCisKK3Vua25vd24gKG5vIGtub3duIHJlZmVyZW5jZXMpOgorICArMHgwMTA0IHwgMDQgMDAgMDQgMDAgMDQgMDAgMDAgMDAgfCA/dWludDhfdFs4XSB8IC4uLi4uLi4uICAgICAgICAgICAgICAgICAgICAgICB8IFdBUk46IG5vdGhpbmcgcmVmZXJzIHRvIHRoaXMgc2VjdGlvbi4KKwordGFibGUgKEFubm90YXRlZEJpbmFyeS5CYXIpOgorICArMHgwMTBDIHwgRkEgRkUgRkYgRkYgICAgICAgICAgICAgfCBTT2Zmc2V0MzIgICB8IDB4RkZGRkZFRkEgKC0yNjIpIExvYzogKzB4MDIxMiB8IG9mZnNldCB0byB2dGFibGUKKyAgKzB4MDExMCB8IDAwIDAwIEU0IDQzICAgICAgICAgICAgIHwgZmxvYXQgICAgICAgfCAweDQzRTQwMDAwICg0NTYpICAgICAgICAgICAgICAgfCB0YWJsZSBmaWVsZCBgYmAgKEZsb2F0KQorICArMHgwMTE0IHwgMTAgMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDAwMTAgKDE2KSBMb2M6ICsweDAxMjQgICB8IG9mZnNldCB0byBmaWVsZCBgY2AgKHRhYmxlKQorICArMHgwMTE4IHwgMDAgMDAgMDAgMDAgMDAgQzAgNUUgNDAgfCBkb3VibGUgICAgICB8IDB4NDA1RUMwMDAwMDAwMDAwMCAoMTIzKSAgICAgICB8IHRhYmxlIGZpZWxkIGBhYCAoRG91YmxlKQorICArMHgwMTIwIHwgMDAgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50OF90WzRdICB8IC4uLi4gICAgICAgICAgICAgICAgICAgICAgICAgICB8IHBhZGRpbmcKKwordGFibGUgKEFubm90YXRlZEJpbmFyeS5CYXopOgorICArMHgwMTI0IHwgOTIgRkUgRkYgRkYgICAgICAgICAgICAgfCBTT2Zmc2V0MzIgICB8IDB4RkZGRkZFOTIgKC0zNjYpIExvYzogKzB4MDI5MiB8IG9mZnNldCB0byB2dGFibGUKKyAgKzB4MDEyOCB8IDAwIDAwIDAwICAgICAgICAgICAgICAgIHwgdWludDhfdFszXSAgfCAuLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBwYWRkaW5nCisgICsweDAxMkIgfCAwMSAgICAgICAgICAgICAgICAgICAgICB8IHVpbnQ4X3QgICAgIHwgMHgwMSAoMSkgICAgICAgICAgICAgICAgICAgICAgIHwgdGFibGUgZmllbGQgYG1lYWxgIChCeXRlKQorCit2ZWN0b3IgKEFubm90YXRlZEJpbmFyeS5Gb28uZm9vYmFyc190eXBlKToKKyAgKzB4MDEyQyB8IDAzIDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgfCAweDAwMDAwMDAzICgzKSAgICAgICAgICAgICAgICAgfCBsZW5ndGggb2YgdmVjdG9yICgjIGl0ZW1zKQorICArMHgwMTMwIHwgMDEgICAgICAgICAgICAgICAgICAgICAgfCBVVHlwZTggICAgICB8IDB4MDEgKDEpICAgICAgICAgICAgICAgICAgICAgICB8IHZhbHVlWzBdCisgICsweDAxMzEgfCBGRiAgICAgICAgICAgICAgICAgICAgICB8IFVUeXBlOCAgICAgIHwgMHhGRiAoMjU1KSAgICAgICAgICAgICAgICAgICAgIHwgRVJST1I6IHZhbHVlWzFdLiBJbnZhbGlkIHVuaW9uIHR5cGUgdmFsdWUuCisgICsweDAxMzIgfCAwMSAgICAgICAgICAgICAgICAgICAgICB8IFVUeXBlOCAgICAgIHwgMHgwMSAoMSkgICAgICAgICAgICAgICAgICAgICAgIHwgdmFsdWVbMl0KKwordmVjdG9yIChBbm5vdGF0ZWRCaW5hcnkuRm9vLnBvaW50c19vZl9pbnRlcmVzdCk6CisgICsweDAxMzQgfCAwMyAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgIHwgMHgwMDAwMDAwMyAoMykgICAgICAgICAgICAgICAgIHwgbGVuZ3RoIG9mIHZlY3RvciAoIyBpdGVtcykKKyAgKzB4MDEzOCB8IDMzIDMzIDMzIDMzIDMzIEEzIDQ1IDQwIHwgZG91YmxlICAgICAgfCAweDQwNDVBMzMzMzMzMzMzMzMgKDQzLjI3NSkgICAgfCBzdHJ1Y3QgZmllbGQgYEFubm90YXRlZEJpbmFyeS5Mb2NhdGlvbi5sYXRpdHVkZWAgKERvdWJsZSkKKyAgKzB4MDE0MCB8IDdFIDU3IDA0IEZGIDVCIDg3IDUzIEMwIHwgZG91YmxlICAgICAgfCAweEMwNTM4NzVCRkYwNDU3N0UgKC03OC4xMTUpICAgfCBzdHJ1Y3QgZmllbGQgYEFubm90YXRlZEJpbmFyeS5Mb2NhdGlvbi5sb25naXR1ZGVgIChEb3VibGUpCisgICsweDAxNDggfCA4RCBGMCBGNiAyMCAwNCBCNiA0MiA0MCB8IGRvdWJsZSAgICAgIHwgMHg0MDQyQjYwNDIwRjZGMDhEICgzNy40MjIpICAgIHwgc3RydWN0IGZpZWxkIGBBbm5vdGF0ZWRCaW5hcnkuTG9jYXRpb24ubGF0aXR1ZGVgIChEb3VibGUpCisgICsweDAxNTAgfCA5RiA3NyA2MyA0MSA2MSA4NSA1RSBDMCB8IGRvdWJsZSAgICAgIHwgMHhDMDVFODU2MTQxNjM3NzlGICgtMTIyLjA4NCkgIHwgc3RydWN0IGZpZWxkIGBBbm5vdGF0ZWRCaW5hcnkuTG9jYXRpb24ubG9uZ2l0dWRlYCAoRG91YmxlKQorICArMHgwMTU4IHwgOEYgMzUgMjMgODMgREMgMzUgNEIgQzAgfCBkb3VibGUgICAgICB8IDB4QzA0QjM1REM4MzIzMzU4RiAoLTU0LjQyMDgpICB8IHN0cnVjdCBmaWVsZCBgQW5ub3RhdGVkQmluYXJ5LkxvY2F0aW9uLmxhdGl0dWRlYCAoRG91YmxlKQorICArMHgwMTYwIHwgRjYgOTcgREQgOTMgODcgQzUgMEEgNDAgfCBkb3VibGUgICAgICB8IDB4NDAwQUM1ODc5M0REOTdGNiAoMy4zNDY0NSkgICB8IHN0cnVjdCBmaWVsZCBgQW5ub3RhdGVkQmluYXJ5LkxvY2F0aW9uLmxvbmdpdHVkZWAgKERvdWJsZSkKKworcGFkZGluZzoKKyAgKzB4MDE2OCB8IDAwIDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDhfdFs0XSAgfCAuLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBwYWRkaW5nCisKK3ZlY3RvciAoQW5ub3RhdGVkQmluYXJ5LkZvby5uYW1lcyk6CisgICsweDAxNkMgfCAwMyAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgIHwgMHgwMDAwMDAwMyAoMykgICAgICAgICAgICAgICAgIHwgbGVuZ3RoIG9mIHZlY3RvciAoIyBpdGVtcykKKyAgKzB4MDE3MCB8IDIwIDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMDIwICgzMikgTG9jOiArMHgwMTkwICAgfCBvZmZzZXQgdG8gc3RyaW5nWzBdCisgICsweDAxNzQgfCAxNCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDAxNCAoMjApIExvYzogKzB4MDE4OCAgIHwgb2Zmc2V0IHRvIHN0cmluZ1sxXQorICArMHgwMTc4IHwgMDQgMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDAwMDQgKDQpIExvYzogKzB4MDE3QyAgICB8IG9mZnNldCB0byBzdHJpbmdbMl0KKworc3RyaW5nIChBbm5vdGF0ZWRCaW5hcnkuRm9vLm5hbWVzKToKKyAgKzB4MDE3QyB8IDA3IDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgfCAweDAwMDAwMDA3ICg3KSAgICAgICAgICAgICAgICAgfCBsZW5ndGggb2Ygc3RyaW5nCisgICsweDAxODAgfCA2MyA2OCA2MSA3MiA2QyA2OSA2NSAgICB8IGNoYXJbN10gICAgIHwgY2hhcmxpZSAgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nIGxpdGVyYWwKKyAgKzB4MDE4NyB8IDAwICAgICAgICAgICAgICAgICAgICAgIHwgY2hhciAgICAgICAgfCAweDAwICgwKSAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJpbmcgdGVybWluYXRvcgorCitzdHJpbmcgKEFubm90YXRlZEJpbmFyeS5Gb28ubmFtZXMpOgorICArMHgwMTg4IHwgMDMgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICB8IDB4MDAwMDAwMDMgKDMpICAgICAgICAgICAgICAgICB8IGxlbmd0aCBvZiBzdHJpbmcKKyAgKzB4MDE4QyB8IDYyIDZGIDYyICAgICAgICAgICAgICAgIHwgY2hhclszXSAgICAgfCBib2IgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJpbmcgbGl0ZXJhbAorICArMHgwMThGIHwgMDAgICAgICAgICAgICAgICAgICAgICAgfCBjaGFyICAgICAgICB8IDB4MDAgKDApICAgICAgICAgICAgICAgICAgICAgICB8IHN0cmluZyB0ZXJtaW5hdG9yCisKK3N0cmluZyAoQW5ub3RhdGVkQmluYXJ5LkZvby5uYW1lcyk6CisgICsweDAxOTAgfCAwNSAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgIHwgMHgwMDAwMDAwNSAoNSkgICAgICAgICAgICAgICAgIHwgbGVuZ3RoIG9mIHN0cmluZworICArMHgwMTk0IHwgNjEgNkMgNjkgNjMgNjUgICAgICAgICAgfCBjaGFyWzVdICAgICB8IGFsaWNlICAgICAgICAgICAgICAgICAgICAgICAgICB8IHN0cmluZyBsaXRlcmFsCisgICsweDAxOTkgfCAwMCAgICAgICAgICAgICAgICAgICAgICB8IGNoYXIgICAgICAgIHwgMHgwMCAoMCkgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nIHRlcm1pbmF0b3IKKworcGFkZGluZzoKKyAgKzB4MDE5QSB8IDAwIDAwICAgICAgICAgICAgICAgICAgIHwgdWludDhfdFsyXSAgfCAuLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBwYWRkaW5nCisKK3N0cmluZyAoQW5ub3RhdGVkQmluYXJ5LkZvby5hbGljZSk6CisgICsweDAxOUMgfCAwNyAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgIHwgMHgwMDAwMDAwNyAoNykgICAgICAgICAgICAgICAgIHwgbGVuZ3RoIG9mIHN0cmluZworICArMHgwMUEwIHwgNjMgNjggNjEgNzIgNkMgNjkgNjUgICAgfCBjaGFyWzddICAgICB8IGNoYXJsaWUgICAgICAgICAgICAgICAgICAgICAgICB8IHN0cmluZyBsaXRlcmFsCisgICsweDAxQTcgfCAwMCAgICAgICAgICAgICAgICAgICAgICB8IGNoYXIgICAgICAgIHwgMHgwMCAoMCkgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nIHRlcm1pbmF0b3IKKworc3RyaW5nIChBbm5vdGF0ZWRCaW5hcnkuRm9vLmJvYik6CisgICsweDAxQTggfCAwNyAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgIHwgMHgwMDAwMDAwNyAoNykgICAgICAgICAgICAgICAgIHwgbGVuZ3RoIG9mIHN0cmluZworICArMHgwMUFDIHwgNjMgNjggNjEgNzIgNkMgNjkgNjUgICAgfCBjaGFyWzddICAgICB8IGNoYXJsaWUgICAgICAgICAgICAgICAgICAgICAgICB8IHN0cmluZyBsaXRlcmFsCisgICsweDAxQjMgfCAwMCAgICAgICAgICAgICAgICAgICAgICB8IGNoYXIgICAgICAgIHwgMHgwMCAoMCkgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nIHRlcm1pbmF0b3IKKwordmVjdG9yIChBbm5vdGF0ZWRCaW5hcnkuRm9vLmFjY291bnRzKToKKyAgKzB4MDFCNCB8IDA5IDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgfCAweDAwMDAwMDA5ICg5KSAgICAgICAgICAgICAgICAgfCBsZW5ndGggb2YgdmVjdG9yICgjIGl0ZW1zKQorICArMHgwMUI4IHwgMDkgMDAgICAgICAgICAgICAgICAgICAgfCB1aW50MTZfdCAgICB8IDB4MDAwOSAoOSkgICAgICAgICAgICAgICAgICAgICB8IHZhbHVlWzBdCisgICsweDAxQkEgfCAwOCAwMCAgICAgICAgICAgICAgICAgICB8IHVpbnQxNl90ICAgIHwgMHgwMDA4ICg4KSAgICAgICAgICAgICAgICAgICAgIHwgdmFsdWVbMV0KKyAgKzB4MDFCQyB8IDA3IDAwICAgICAgICAgICAgICAgICAgIHwgdWludDE2X3QgICAgfCAweDAwMDcgKDcpICAgICAgICAgICAgICAgICAgICAgfCB2YWx1ZVsyXQorICArMHgwMUJFIHwgMDEgMDAgICAgICAgICAgICAgICAgICAgfCB1aW50MTZfdCAgICB8IDB4MDAwMSAoMSkgICAgICAgICAgICAgICAgICAgICB8IHZhbHVlWzNdCisgICsweDAxQzAgfCAwMiAwMCAgICAgICAgICAgICAgICAgICB8IHVpbnQxNl90ICAgIHwgMHgwMDAyICgyKSAgICAgICAgICAgICAgICAgICAgIHwgdmFsdWVbNF0KKyAgKzB4MDFDMiB8IDAzIDAwICAgICAgICAgICAgICAgICAgIHwgdWludDE2X3QgICAgfCAweDAwMDMgKDMpICAgICAgICAgICAgICAgICAgICAgfCB2YWx1ZVs1XQorICArMHgwMUM0IHwgMDYgMDAgICAgICAgICAgICAgICAgICAgfCB1aW50MTZfdCAgICB8IDB4MDAwNiAoNikgICAgICAgICAgICAgICAgICAgICB8IHZhbHVlWzZdCisgICsweDAxQzYgfCAwNSAwMCAgICAgICAgICAgICAgICAgICB8IHVpbnQxNl90ICAgIHwgMHgwMDA1ICg1KSAgICAgICAgICAgICAgICAgICAgIHwgdmFsdWVbN10KKyAgKzB4MDFDOCB8IDA0IDAwICAgICAgICAgICAgICAgICAgIHwgdWludDE2X3QgICAgfCAweDAwMDQgKDQpICAgICAgICAgICAgICAgICAgICAgfCB2YWx1ZVs4XQorCitwYWRkaW5nOgorICArMHgwMUNBIHwgMDAgMDAgICAgICAgICAgICAgICAgICAgfCB1aW50OF90WzJdICB8IC4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHBhZGRpbmcKKwordGFibGUgKEFubm90YXRlZEJpbmFyeS5CYXopOgorICArMHgwMUNDIHwgM0EgRkYgRkYgRkYgICAgICAgICAgICAgfCBTT2Zmc2V0MzIgICB8IDB4RkZGRkZGM0EgKC0xOTgpIExvYzogKzB4MDI5MiB8IG9mZnNldCB0byB2dGFibGUKKyAgKzB4MDFEMCB8IDAwIDAwIDAwICAgICAgICAgICAgICAgIHwgdWludDhfdFszXSAgfCAuLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBwYWRkaW5nCisgICsweDAxRDMgfCAwMyAgICAgICAgICAgICAgICAgICAgICB8IHVpbnQ4X3QgICAgIHwgMHgwMyAoMykgICAgICAgICAgICAgICAgICAgICAgIHwgdGFibGUgZmllbGQgYG1lYWxgIChCeXRlKQorCit2ZWN0b3IgKEFubm90YXRlZEJpbmFyeS5Gb28uYmFycyk6CisgICsweDAxRDQgfCAwMiAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgIHwgMHgwMDAwMDAwMiAoMikgICAgICAgICAgICAgICAgIHwgbGVuZ3RoIG9mIHZlY3RvciAoIyBpdGVtcykKKyAgKzB4MDFEOCB8IDQ0IDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMDQ0ICg2OCkgTG9jOiArMHgwMjFDICAgfCBvZmZzZXQgdG8gdGFibGVbMF0KKyAgKzB4MDFEQyB8IDEwIDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMDEwICgxNikgTG9jOiArMHgwMUVDICAgfCBvZmZzZXQgdG8gdGFibGVbMV0KKworcGFkZGluZzoKKyAgKzB4MDFFMCB8IDAwIDAwICAgICAgICAgICAgICAgICAgIHwgdWludDhfdFsyXSAgfCAuLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBwYWRkaW5nCisKK3Z0YWJsZSAoQW5ub3RhdGVkQmluYXJ5LkJhcik6CisgICsweDAxRTIgfCAwQSAwMCAgICAgICAgICAgICAgICAgICB8IHVpbnQxNl90ICAgIHwgMHgwMDBBICgxMCkgICAgICAgICAgICAgICAgICAgIHwgc2l6ZSBvZiB0aGlzIHZ0YWJsZQorICArMHgwMUU0IHwgMUEgMDAgICAgICAgICAgICAgICAgICAgfCB1aW50MTZfdCAgICB8IDB4MDAxQSAoMjYpICAgICAgICAgICAgICAgICAgICB8IHNpemUgb2YgcmVmZXJyaW5nIHRhYmxlCisgICsweDAxRTYgfCAwQyAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgIHwgMHgwMDBDICgxMikgICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBhYCAoaWQ6IDApCisgICsweDAxRTggfCAwNCAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgIHwgMHgwMDA0ICg0KSAgICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBiYCAoaWQ6IDEpCisgICsweDAxRUEgfCAwOCAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgIHwgMHgwMDA4ICg4KSAgICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBjYCAoaWQ6IDIpCisKK3RhYmxlIChBbm5vdGF0ZWRCaW5hcnkuQmFyKToKKyAgKzB4MDFFQyB8IDBBIDAwIDAwIDAwICAgICAgICAgICAgIHwgU09mZnNldDMyICAgfCAweDAwMDAwMDBBICgxMCkgTG9jOiArMHgwMUUyICAgfCBvZmZzZXQgdG8gdnRhYmxlCisgICsweDAxRjAgfCAwMCA4MCAyMyA0NCAgICAgICAgICAgICB8IGZsb2F0ICAgICAgIHwgMHg0NDIzODAwMCAoNjU0KSAgICAgICAgICAgICAgIHwgdGFibGUgZmllbGQgYGJgIChGbG9hdCkKKyAgKzB4MDFGNCB8IDE4IDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMDE4ICgyNCkgTG9jOiArMHgwMjBDICAgfCBvZmZzZXQgdG8gZmllbGQgYGNgICh0YWJsZSkKKyAgKzB4MDFGOCB8IDAwIDAwIDAwIDAwIDAwIEQ4IDhFIDQwIHwgZG91YmxlICAgICAgfCAweDQwOEVEODAwMDAwMDAwMDAgKDk4NykgICAgICAgfCB0YWJsZSBmaWVsZCBgYWAgKERvdWJsZSkKKyAgKzB4MDIwMCB8IDAwIDAwIDAwIDAwIDAwIDAwICAgICAgIHwgdWludDhfdFs2XSAgfCAuLi4uLi4gICAgICAgICAgICAgICAgICAgICAgICAgfCBwYWRkaW5nCisKK3Z0YWJsZSAoQW5ub3RhdGVkQmluYXJ5LkJheik6CisgICsweDAyMDYgfCAwNiAwMCAgICAgICAgICAgICAgICAgICB8IHVpbnQxNl90ICAgIHwgMHgwMDA2ICg2KSAgICAgICAgICAgICAgICAgICAgIHwgc2l6ZSBvZiB0aGlzIHZ0YWJsZQorICArMHgwMjA4IHwgMDYgMDAgICAgICAgICAgICAgICAgICAgfCB1aW50MTZfdCAgICB8IDB4MDAwNiAoNikgICAgICAgICAgICAgICAgICAgICB8IHNpemUgb2YgcmVmZXJyaW5nIHRhYmxlCisgICsweDAyMEEgfCAwNSAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgIHwgMHgwMDA1ICg1KSAgICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBtZWFsYCAoaWQ6IDApCisKK3RhYmxlIChBbm5vdGF0ZWRCaW5hcnkuQmF6KToKKyAgKzB4MDIwQyB8IDA2IDAwIDAwIDAwICAgICAgICAgICAgIHwgU09mZnNldDMyICAgfCAweDAwMDAwMDA2ICg2KSBMb2M6ICsweDAyMDYgICAgfCBvZmZzZXQgdG8gdnRhYmxlCisgICsweDAyMTAgfCAwMCAgICAgICAgICAgICAgICAgICAgICB8IHVpbnQ4X3RbMV0gIHwgLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgcGFkZGluZworICArMHgwMjExIHwgMDMgICAgICAgICAgICAgICAgICAgICAgfCB1aW50OF90ICAgICB8IDB4MDMgKDMpICAgICAgICAgICAgICAgICAgICAgICB8IHRhYmxlIGZpZWxkIGBtZWFsYCAoQnl0ZSkKKwordnRhYmxlIChBbm5vdGF0ZWRCaW5hcnkuQmFyKToKKyAgKzB4MDIxMiB8IDBBIDAwICAgICAgICAgICAgICAgICAgIHwgdWludDE2X3QgICAgfCAweDAwMEEgKDEwKSAgICAgICAgICAgICAgICAgICAgfCBzaXplIG9mIHRoaXMgdnRhYmxlCisgICsweDAyMTQgfCAxOCAwMCAgICAgICAgICAgICAgICAgICB8IHVpbnQxNl90ICAgIHwgMHgwMDE4ICgyNCkgICAgICAgICAgICAgICAgICAgIHwgc2l6ZSBvZiByZWZlcnJpbmcgdGFibGUKKyAgKzB4MDIxNiB8IDBDIDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgfCAweDAwMEMgKDEyKSAgICAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYGFgIChpZDogMCkKKyAgKzB4MDIxOCB8IDA0IDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgfCAweDAwMDQgKDQpICAgICAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYGJgIChpZDogMSkKKyAgKzB4MDIxQSB8IDA4IDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgfCAweDAwMDggKDgpICAgICAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYGNgIChpZDogMikKKwordGFibGUgKEFubm90YXRlZEJpbmFyeS5CYXIpOgorICArMHgwMjFDIHwgMEEgMDAgMDAgMDAgICAgICAgICAgICAgfCBTT2Zmc2V0MzIgICB8IDB4MDAwMDAwMEEgKDEwKSBMb2M6ICsweDAyMTIgICB8IG9mZnNldCB0byB2dGFibGUKKyAgKzB4MDIyMCB8IDAwIDAwIEU0IDQzICAgICAgICAgICAgIHwgZmxvYXQgICAgICAgfCAweDQzRTQwMDAwICg0NTYpICAgICAgICAgICAgICAgfCB0YWJsZSBmaWVsZCBgYmAgKEZsb2F0KQorICArMHgwMjI0IHwgMTAgMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDAwMTAgKDE2KSBMb2M6ICsweDAyMzQgICB8IG9mZnNldCB0byBmaWVsZCBgY2AgKHRhYmxlKQorICArMHgwMjI4IHwgMDAgMDAgMDAgMDAgMDAgQzAgNUUgNDAgfCBkb3VibGUgICAgICB8IDB4NDA1RUMwMDAwMDAwMDAwMCAoMTIzKSAgICAgICB8IHRhYmxlIGZpZWxkIGBhYCAoRG91YmxlKQorICArMHgwMjMwIHwgMDAgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50OF90WzRdICB8IC4uLi4gICAgICAgICAgICAgICAgICAgICAgICAgICB8IHBhZGRpbmcKKwordGFibGUgKEFubm90YXRlZEJpbmFyeS5CYXopOgorICArMHgwMjM0IHwgQTIgRkYgRkYgRkYgICAgICAgICAgICAgfCBTT2Zmc2V0MzIgICB8IDB4RkZGRkZGQTIgKC05NCkgTG9jOiArMHgwMjkyICB8IG9mZnNldCB0byB2dGFibGUKKyAgKzB4MDIzOCB8IDAwIDAwIDAwICAgICAgICAgICAgICAgIHwgdWludDhfdFszXSAgfCAuLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBwYWRkaW5nCisgICsweDAyM0IgfCAwMSAgICAgICAgICAgICAgICAgICAgICB8IHVpbnQ4X3QgICAgIHwgMHgwMSAoMSkgICAgICAgICAgICAgICAgICAgICAgIHwgdGFibGUgZmllbGQgYG1lYWxgIChCeXRlKQorCitzdHJpbmcgKEFubm90YXRlZEJpbmFyeS5Gb28ubmFtZSk6CisgICsweDAyM0MgfCAyRiAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgIHwgMHgwMDAwMDAyRiAoNDcpICAgICAgICAgICAgICAgIHwgbGVuZ3RoIG9mIHN0cmluZworICArMHgwMjQwIHwgNTQgNjggNjkgNzMgMjAgNjkgNzMgMjAgfCBjaGFyWzQ3XSAgICB8IFRoaXMgaXMgICAgICAgICAgICAgICAgICAgICAgICB8IHN0cmluZyBsaXRlcmFsCisgICsweDAyNDggfCA2MSAyMCA2QyA2RiA2RSA2NyAyMCA3MyB8ICAgICAgICAgICAgIHwgYSBsb25nIHMKKyAgKzB4MDI1MCB8IDc0IDcyIDY5IDZFIDY3IDIwIDc0IDZGIHwgICAgICAgICAgICAgfCB0cmluZyB0bworICArMHgwMjU4IHwgMjAgNzMgNjggNkYgNzcgMjAgNjggNkYgfCAgICAgICAgICAgICB8ICBzaG93IGhvCisgICsweDAyNjAgfCA3NyAyMCA2OSA3NCAyMCA2MiA3MiA2NSB8ICAgICAgICAgICAgIHwgdyBpdCBicmUKKyAgKzB4MDI2OCB8IDYxIDZCIDczIDIwIDc1IDcwIDJFICAgIHwgICAgICAgICAgICAgfCBha3MgdXAuCisgICsweDAyNkYgfCAwMCAgICAgICAgICAgICAgICAgICAgICB8IGNoYXIgICAgICAgIHwgMHgwMCAoMCkgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nIHRlcm1pbmF0b3IKKworcGFkZGluZzoKKyAgKzB4MDI3MCB8IDAwIDAwICAgICAgICAgICAgICAgICAgIHwgdWludDhfdFsyXSAgfCAuLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBwYWRkaW5nCisKK3Z0YWJsZSAoQW5ub3RhdGVkQmluYXJ5LkJhcik6CisgICsweDAyNzIgfCAwQSAwMCAgICAgICAgICAgICAgICAgICB8IHVpbnQxNl90ICAgIHwgMHgwMDBBICgxMCkgICAgICAgICAgICAgICAgICAgIHwgc2l6ZSBvZiB0aGlzIHZ0YWJsZQorICArMHgwMjc0IHwgMTYgMDAgICAgICAgICAgICAgICAgICAgfCB1aW50MTZfdCAgICB8IDB4MDAxNiAoMjIpICAgICAgICAgICAgICAgICAgICB8IHNpemUgb2YgcmVmZXJyaW5nIHRhYmxlCisgICsweDAyNzYgfCAwQyAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgIHwgMHgwMDBDICgxMikgICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBhYCAoaWQ6IDApCisgICsweDAyNzggfCAwNCAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgIHwgMHgwMDA0ICg0KSAgICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBiYCAoaWQ6IDEpCisgICsweDAyN0EgfCAwOCAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgIHwgMHgwMDA4ICg4KSAgICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBjYCAoaWQ6IDIpCisKK3RhYmxlIChBbm5vdGF0ZWRCaW5hcnkuQmFyKToKKyAgKzB4MDI3QyB8IDBBIDAwIDAwIDAwICAgICAgICAgICAgIHwgU09mZnNldDMyICAgfCAweDAwMDAwMDBBICgxMCkgTG9jOiArMHgwMjcyICAgfCBvZmZzZXQgdG8gdnRhYmxlCisgICsweDAyODAgfCA2NSAyMCA3MSA0OSAgICAgICAgICAgICB8IGZsb2F0ICAgICAgIHwgMHg0OTcxMjA2NSAoOTg3NjU0KSAgICAgICAgICAgIHwgdGFibGUgZmllbGQgYGJgIChGbG9hdCkKKyAgKzB4MDI4NCB8IDE0IDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMDE0ICgyMCkgTG9jOiArMHgwMjk4ICAgfCBvZmZzZXQgdG8gZmllbGQgYGNgICh0YWJsZSkKKyAgKzB4MDI4OCB8IEM5IDc2IEJFIDlGIDBDIDI0IEZFIDQwIHwgZG91YmxlICAgICAgfCAweDQwRkUyNDBDOUZCRTc2QzkgKDEyMzQ1NykgICAgfCB0YWJsZSBmaWVsZCBgYWAgKERvdWJsZSkKKyAgKzB4MDI5MCB8IDAwIDAwICAgICAgICAgICAgICAgICAgIHwgdWludDhfdFsyXSAgfCAuLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBwYWRkaW5nCisKK3Z0YWJsZSAoQW5ub3RhdGVkQmluYXJ5LkJheik6CisgICsweDAyOTIgfCAwNiAwMCAgICAgICAgICAgICAgICAgICB8IHVpbnQxNl90ICAgIHwgMHgwMDA2ICg2KSAgICAgICAgICAgICAgICAgICAgIHwgc2l6ZSBvZiB0aGlzIHZ0YWJsZQorICArMHgwMjk0IHwgMDggMDAgICAgICAgICAgICAgICAgICAgfCB1aW50MTZfdCAgICB8IDB4MDAwOCAoOCkgICAgICAgICAgICAgICAgICAgICB8IHNpemUgb2YgcmVmZXJyaW5nIHRhYmxlCisgICsweDAyOTYgfCAwNyAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgIHwgMHgwMDA3ICg3KSAgICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBtZWFsYCAoaWQ6IDApCisKK3RhYmxlIChBbm5vdGF0ZWRCaW5hcnkuQmF6KToKKyAgKzB4MDI5OCB8IDA2IDAwIDAwIDAwICAgICAgICAgICAgIHwgU09mZnNldDMyICAgfCAweDAwMDAwMDA2ICg2KSBMb2M6ICsweDAyOTIgICAgfCBvZmZzZXQgdG8gdnRhYmxlCisgICsweDAyOUMgfCAwMCAwMCAwMCAgICAgICAgICAgICAgICB8IHVpbnQ4X3RbM10gIHwgLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgcGFkZGluZworICArMHgwMjlGIHwgMDEgICAgICAgICAgICAgICAgICAgICAgfCB1aW50OF90ICAgICB8IDB4MDEgKDEpICAgICAgICAgICAgICAgICAgICAgICB8IHRhYmxlIGZpZWxkIGBtZWFsYCAoQnl0ZSkKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL2Fubm90YXRlZF9iaW5hcnkvdGVzdHMvaW52YWxpZF92ZWN0b3JfdW5pb25fdHlwZV92YWx1ZS5iaW4gYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9hbm5vdGF0ZWRfYmluYXJ5L3Rlc3RzL2ludmFsaWRfdmVjdG9yX3VuaW9uX3R5cGVfdmFsdWUuYmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg3MjU5NzEKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9hbm5vdGF0ZWRfYmluYXJ5L3Rlc3RzL2ludmFsaWRfdmVjdG9yX3VuaW9uX3R5cGVfdmFsdWUuYmluCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL2Fubm90YXRlZF9iaW5hcnkvdGVzdHMvaW52YWxpZF92ZWN0b3JfdW5pb25zX2N1dF9zaG9ydC5hZmIgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9hbm5vdGF0ZWRfYmluYXJ5L3Rlc3RzL2ludmFsaWRfdmVjdG9yX3VuaW9uc19jdXRfc2hvcnQuYWZiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcyNjdjNzYKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9hbm5vdGF0ZWRfYmluYXJ5L3Rlc3RzL2ludmFsaWRfdmVjdG9yX3VuaW9uc19jdXRfc2hvcnQuYWZiCkBAIC0wLDAgKzEsMjEwIEBACisvLyBBbm5vdGF0ZWQgRmxhdGJ1ZmZlciBCaW5hcnkKKy8vCisvLyBTY2hlbWEgZmlsZTogYW5ub3RhdGVkX2JpbmFyeS5mYnMKKy8vIEJpbmFyeSBmaWxlOiB0ZXN0cy9pbnZhbGlkX3ZlY3Rvcl91bmlvbnNfY3V0X3Nob3J0LmJpbgorCitoZWFkZXI6CisgICsweDAwMDAgfCA0NCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgICB8IDB4MDAwMDAwNDQgKDY4KSBMb2M6ICsweDAwNDQgICB8IG9mZnNldCB0byByb290IHRhYmxlIGBBbm5vdGF0ZWRCaW5hcnkuRm9vYAorICArMHgwMDA0IHwgNDEgNEUgNEUgNEYgICAgICAgICAgICAgfCBjaGFyWzRdICAgICAgfCBBTk5PICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBGaWxlIElkZW50aWZpZXIKKworcGFkZGluZzoKKyAgKzB4MDAwOCB8IDAwIDAwICAgICAgICAgICAgICAgICAgIHwgdWludDhfdFsyXSAgIHwgLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgcGFkZGluZworCit2dGFibGUgKEFubm90YXRlZEJpbmFyeS5Gb28pOgorICArMHgwMDBBIHwgM0EgMDAgICAgICAgICAgICAgICAgICAgfCB1aW50MTZfdCAgICAgfCAweDAwM0EgKDU4KSAgICAgICAgICAgICAgICAgICAgfCBzaXplIG9mIHRoaXMgdnRhYmxlCisgICsweDAwMEMgfCA2OCAwMCAgICAgICAgICAgICAgICAgICB8IHVpbnQxNl90ICAgICB8IDB4MDA2OCAoMTA0KSAgICAgICAgICAgICAgICAgICB8IHNpemUgb2YgcmVmZXJyaW5nIHRhYmxlCisgICsweDAwMEUgfCAwQyAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgICB8IDB4MDAwQyAoMTIpICAgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgY291bnRlcmAgKGlkOiAwKQorICArMHgwMDEwIHwgMDcgMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgICAgfCAweDAwMDcgKDcpICAgICAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYGhlYWx0aHlgIChpZDogMSkKKyAgKzB4MDAxMiB8IDAwIDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgIHwgMHgwMDAwICgwKSAgICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBsZXZlbGAgKGlkOiAyKSA8ZGVmYXVsdHMgdG8gOTk+IChMb25nKQorICArMHgwMDE0IHwgMDggMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgICAgfCAweDAwMDggKDgpICAgICAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYG1lYWxgIChpZDogMykKKyAgKzB4MDAxNiB8IDEwIDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgIHwgMHgwMDEwICgxNikgICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBiYXJgIChpZDogNCkKKyAgKzB4MDAxOCB8IDE0IDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgIHwgMHgwMDE0ICgyMCkgICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBob21lYCAoaWQ6IDUpCisgICsweDAwMUEgfCAzMCAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgICB8IDB4MDAzMCAoNDgpICAgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgbmFtZWAgKGlkOiA2KQorICArMHgwMDFDIHwgMzQgMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgICAgfCAweDAwMzQgKDUyKSAgICAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYGJhcnNgIChpZDogNykKKyAgKzB4MDAxRSB8IDA5IDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgIHwgMHgwMDA5ICg5KSAgICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBiYXJfYmF6X3R5cGVgIChpZDogOCkKKyAgKzB4MDAyMCB8IDM4IDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgIHwgMHgwMDM4ICg1NikgICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBiYXJfYmF6YCAoaWQ6IDkpCisgICsweDAwMjIgfCAzQyAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgICB8IDB4MDAzQyAoNjApICAgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgYWNjb3VudHNgIChpZDogMTApCisgICsweDAwMjQgfCA0MCAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgICB8IDB4MDA0MCAoNjQpICAgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgYm9iYCAoaWQ6IDExKQorICArMHgwMDI2IHwgNDQgMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgICAgfCAweDAwNDQgKDY4KSAgICAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYGFsaWNlYCAoaWQ6IDEyKQorICArMHgwMDI4IHwgMDAgMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgICAgfCAweDAwMDAgKDApICAgICAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYG1heWJlX2kzMmAgKGlkOiAxMykgPGRlZmF1bHRzIHRvIDA+IChJbnQpCisgICsweDAwMkEgfCAwMCAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgICB8IDB4MDAwMCAoMCkgICAgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgZGVmYXVsdF9pMzJgIChpZDogMTQpIDxkZWZhdWx0cyB0byA0Mj4gKEludCkKKyAgKzB4MDAyQyB8IDQ4IDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgIHwgMHgwMDQ4ICg3MikgICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBqdXN0X2kzMmAgKGlkOiAxNSkKKyAgKzB4MDAyRSB8IDRDIDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgIHwgMHgwMDRDICg3NikgICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBuYW1lc2AgKGlkOiAxNikKKyAgKzB4MDAzMCB8IDUwIDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgIHwgMHgwMDUwICg4MCkgICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBwb2ludHNfb2ZfaW50ZXJlc3RgIChpZDogMTcpCisgICsweDAwMzIgfCA1NCAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgICB8IDB4MDA1NCAoODQpICAgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgZm9vYmFyc190eXBlYCAoaWQ6IDE4KQorICArMHgwMDM0IHwgNTggMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgICAgfCAweDAwNTggKDg4KSAgICAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYGZvb2JhcnNgIChpZDogMTkpCisgICsweDAwMzYgfCAwQSAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgICB8IDB4MDAwQSAoMTApICAgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgbWVhc3VyZW1lbnRfdHlwZWAgKGlkOiAyMCkKKyAgKzB4MDAzOCB8IDVDIDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgIHwgMHgwMDVDICg5MikgICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBtZWFzdXJlbWVudGAgKGlkOiAyMSkKKyAgKzB4MDAzQSB8IDBCIDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgIHwgMHgwMDBCICgxMSkgICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBhbnl0aGluZ190eXBlYCAoaWQ6IDIyKQorICArMHgwMDNDIHwgNjAgMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgICAgfCAweDAwNjAgKDk2KSAgICAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYGFueXRoaW5nYCAoaWQ6IDIzKQorICArMHgwMDNFIHwgMDAgMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgICAgfCAweDAwMDAgKDApICAgICAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYHRlbXBlcmF0dXJlYCAoaWQ6IDI0KSA8ZGVmYXVsdHMgdG8gOTguNjAwMDAwPiAoRmxvYXQpCisgICsweDAwNDAgfCAwMCAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgICB8IDB4MDAwMCAoMCkgICAgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgdGVldG90YWxlcmAgKGlkOiAyNSkgPG51bGw+IChPYmopCisgICsweDAwNDIgfCA2NCAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgICB8IDB4MDA2NCAoMTAwKSAgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgY2hhcmxpZWAgKGlkOiAyNikKKworcm9vdF90YWJsZSAoQW5ub3RhdGVkQmluYXJ5LkZvbyk6CisgICsweDAwNDQgfCAzQSAwMCAwMCAwMCAgICAgICAgICAgICB8IFNPZmZzZXQzMiAgICB8IDB4MDAwMDAwM0EgKDU4KSBMb2M6ICsweDAwMEEgICB8IG9mZnNldCB0byB2dGFibGUKKyAgKzB4MDA0OCB8IDAwIDAwIDAwICAgICAgICAgICAgICAgIHwgdWludDhfdFszXSAgIHwgLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgcGFkZGluZworICArMHgwMDRCIHwgMDEgICAgICAgICAgICAgICAgICAgICAgfCB1aW50OF90ICAgICAgfCAweDAxICgxKSAgICAgICAgICAgICAgICAgICAgICAgfCB0YWJsZSBmaWVsZCBgaGVhbHRoeWAgKEJvb2wpCisgICsweDAwNEMgfCAwMiAgICAgICAgICAgICAgICAgICAgICB8IHVpbnQ4X3QgICAgICB8IDB4MDIgKDIpICAgICAgICAgICAgICAgICAgICAgICB8IHRhYmxlIGZpZWxkIGBtZWFsYCAoQnl0ZSkKKyAgKzB4MDA0RCB8IDAyICAgICAgICAgICAgICAgICAgICAgIHwgVVR5cGU4ICAgICAgIHwgMHgwMiAoMikgICAgICAgICAgICAgICAgICAgICAgIHwgdGFibGUgZmllbGQgYGJhcl9iYXpfdHlwZWAgKFVUeXBlKQorICArMHgwMDRFIHwgMDEgICAgICAgICAgICAgICAgICAgICAgfCBVVHlwZTggICAgICAgfCAweDAxICgxKSAgICAgICAgICAgICAgICAgICAgICAgfCB0YWJsZSBmaWVsZCBgbWVhc3VyZW1lbnRfdHlwZWAgKFVUeXBlKQorICArMHgwMDRGIHwgMDEgICAgICAgICAgICAgICAgICAgICAgfCBVVHlwZTggICAgICAgfCAweDAxICgxKSAgICAgICAgICAgICAgICAgICAgICAgfCB0YWJsZSBmaWVsZCBgYW55dGhpbmdfdHlwZWAgKFVUeXBlKQorICArMHgwMDUwIHwgRDIgMDQgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICAgfCAweDAwMDAwNEQyICgxMjM0KSAgICAgICAgICAgICAgfCB0YWJsZSBmaWVsZCBgY291bnRlcmAgKEludCkKKyAgKzB4MDA1NCB8IDI4IDAyIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgIHwgMHgwMDAwMDIyOCAoNTUyKSBMb2M6ICsweDAyN0MgIHwgRVJST1I6IG9mZnNldCB0byBmaWVsZCBgYmFyYC4gSW52YWxpZCBvZmZzZXQsIHBvaW50cyBvdXRzaWRlIHRoZSBiaW5hcnkuCisgICsweDAwNTggfCAwMSAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgICB8IDB4MDAwMDAwMDEgKDEpICAgICAgICAgICAgICAgICB8IHN0cnVjdCBmaWVsZCBgQW5ub3RhdGVkQmluYXJ5LkJ1aWxkaW5nLmZsb29yc2AgKEludCkKKyAgKzB4MDA1QyB8IDAyIDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgIHwgMHgwMDAwMDAwMiAoMikgICAgICAgICAgICAgICAgIHwgc3RydWN0IGZpZWxkIGBBbm5vdGF0ZWRCaW5hcnkuQnVpbGRpbmcuZG9vcnNgIChJbnQpCisgICsweDAwNjAgfCAwQyAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgICB8IDB4MDAwMDAwMEMgKDEyKSAgICAgICAgICAgICAgICB8IHN0cnVjdCBmaWVsZCBgQW5ub3RhdGVkQmluYXJ5LkJ1aWxkaW5nLndpbmRvd3NgIChJbnQpCisgICsweDAwNjQgfCAwQSAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgICB8IDB4MDAwMDAwMEEgKDEwKSAgICAgICAgICAgICAgICB8IGFycmF5IGZpZWxkIGBBbm5vdGF0ZWRCaW5hcnkuRGltZW5zaW9uLnZhbHVlc2BbMF0gKEludCkKKyAgKzB4MDA2OCB8IDBDIDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgIHwgMHgwMDAwMDAwQyAoMTIpICAgICAgICAgICAgICAgIHwgYXJyYXkgZmllbGQgYEFubm90YXRlZEJpbmFyeS5EaW1lbnNpb24udmFsdWVzYFsxXSAoSW50KQorICArMHgwMDZDIHwgMTQgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICAgfCAweDAwMDAwMDE0ICgyMCkgICAgICAgICAgICAgICAgfCBhcnJheSBmaWVsZCBgQW5ub3RhdGVkQmluYXJ5LkRpbWVuc2lvbi52YWx1ZXNgWzJdIChJbnQpCisgICsweDAwNzAgfCAwMSAgICAgICAgICAgICAgICAgICAgICB8IHVpbnQ4X3QgICAgICB8IDB4MDEgKDEpICAgICAgICAgICAgICAgICAgICAgICB8IHN0cnVjdCBmaWVsZCBgQW5ub3RhdGVkQmluYXJ5LlRvbGVyYW5jZS53aWR0aGAgKFVCeXRlKQorICArMHgwMDcxIHwgMDIgICAgICAgICAgICAgICAgICAgICAgfCB1aW50OF90ICAgICAgfCAweDAyICgyKSAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJ1Y3QgZmllbGQgYEFubm90YXRlZEJpbmFyeS5Ub2xlcmFuY2Uud2lkdGhgIChVQnl0ZSkKKyAgKzB4MDA3MiB8IDAzICAgICAgICAgICAgICAgICAgICAgIHwgdWludDhfdCAgICAgIHwgMHgwMyAoMykgICAgICAgICAgICAgICAgICAgICAgIHwgc3RydWN0IGZpZWxkIGBBbm5vdGF0ZWRCaW5hcnkuVG9sZXJhbmNlLndpZHRoYCAoVUJ5dGUpCisgICsweDAwNzMgfCAwMCAgICAgICAgICAgICAgICAgICAgICB8IHVpbnQ4X3RbMV0gICB8IC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHBhZGRpbmcKKyAgKzB4MDA3NCB8IEM4IDAxIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgIHwgMHgwMDAwMDFDOCAoNDU2KSBMb2M6ICsweDAyM0MgIHwgRVJST1I6IG9mZnNldCB0byBmaWVsZCBgbmFtZWAuIEludmFsaWQgb2Zmc2V0LCBwb2ludHMgb3V0c2lkZSB0aGUgYmluYXJ5LgorICArMHgwMDc4IHwgNUMgMDEgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICAgfCAweDAwMDAwMTVDICgzNDgpIExvYzogKzB4MDFENCAgfCBvZmZzZXQgdG8gZmllbGQgYGJhcnNgICh2ZWN0b3IpCisgICsweDAwN0MgfCA1MCAwMSAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgICB8IDB4MDAwMDAxNTAgKDMzNikgTG9jOiArMHgwMUNDICB8IG9mZnNldCB0byBmaWVsZCBgYmFyX2JhemAgKHVuaW9uIG9mIHR5cGUgYEJhemApCisgICsweDAwODAgfCAzNCAwMSAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgICB8IDB4MDAwMDAxMzQgKDMwOCkgTG9jOiArMHgwMUI0ICB8IG9mZnNldCB0byBmaWVsZCBgYWNjb3VudHNgICh2ZWN0b3IpCisgICsweDAwODQgfCAyNCAwMSAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgICB8IDB4MDAwMDAxMjQgKDI5MikgTG9jOiArMHgwMUE4ICB8IG9mZnNldCB0byBmaWVsZCBgYm9iYCAoc3RyaW5nKQorICArMHgwMDg4IHwgMTQgMDEgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICAgfCAweDAwMDAwMTE0ICgyNzYpIExvYzogKzB4MDE5QyAgfCBvZmZzZXQgdG8gZmllbGQgYGFsaWNlYCAoc3RyaW5nKQorICArMHgwMDhDIHwgMEQgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICAgfCAweDAwMDAwMDBEICgxMykgICAgICAgICAgICAgICAgfCB0YWJsZSBmaWVsZCBganVzdF9pMzJgIChJbnQpCisgICsweDAwOTAgfCBEQyAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgICB8IDB4MDAwMDAwREMgKDIyMCkgTG9jOiArMHgwMTZDICB8IG9mZnNldCB0byBmaWVsZCBgbmFtZXNgICh2ZWN0b3IpCisgICsweDAwOTQgfCBBMCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgICB8IDB4MDAwMDAwQTAgKDE2MCkgTG9jOiArMHgwMTM0ICB8IG9mZnNldCB0byBmaWVsZCBgcG9pbnRzX29mX2ludGVyZXN0YCAodmVjdG9yKQorICArMHgwMDk4IHwgOTQgMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICAgfCAweDAwMDAwMDk0ICgxNDgpIExvYzogKzB4MDEyQyAgfCBvZmZzZXQgdG8gZmllbGQgYGZvb2JhcnNfdHlwZWAgKHZlY3RvcikKKyAgKzB4MDA5QyB8IDM4IDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgIHwgMHgwMDAwMDAzOCAoNTYpIExvYzogKzB4MDBENCAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBmb29iYXJzYCAodmVjdG9yKQorICArMHgwMEEwIHwgMzMgMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICAgfCAweDAwMDAwMDMzICg1MSkgTG9jOiArMHgwMEQzICAgfCBvZmZzZXQgdG8gZmllbGQgYG1lYXN1cmVtZW50YCAodW5pb24gb2YgdHlwZSBgVG9sZXJhbmNlYCkKKyAgKzB4MDBBNCB8IDFDIDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgIHwgMHgwMDAwMDAxQyAoMjgpIExvYzogKzB4MDBDMCAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBhbnl0aGluZ2AgKHVuaW9uIG9mIHR5cGUgYEJhcmApCisgICsweDAwQTggfCAwNCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgICB8IDB4MDAwMDAwMDQgKDQpIExvYzogKzB4MDBBQyAgICB8IG9mZnNldCB0byBmaWVsZCBgY2hhcmxpZWAgKHN0cmluZykKKworc3RyaW5nIChBbm5vdGF0ZWRCaW5hcnkuRm9vLmNoYXJsaWUpOgorICArMHgwMEFDIHwgMDUgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICAgfCAweDAwMDAwMDA1ICg1KSAgICAgICAgICAgICAgICAgfCBsZW5ndGggb2Ygc3RyaW5nCisgICsweDAwQjAgfCA2MSA2QyA2OSA2MyA2NSAgICAgICAgICB8IGNoYXJbNV0gICAgICB8IGFsaWNlICAgICAgICAgICAgICAgICAgICAgICAgICB8IHN0cmluZyBsaXRlcmFsCisgICsweDAwQjUgfCAwMCAgICAgICAgICAgICAgICAgICAgICB8IGNoYXIgICAgICAgICB8IDB4MDAgKDApICAgICAgICAgICAgICAgICAgICAgICB8IHN0cmluZyB0ZXJtaW5hdG9yCisKK3BhZGRpbmc6CisgICsweDAwQjYgfCAwMCAwMCAgICAgICAgICAgICAgICAgICB8IHVpbnQ4X3RbMl0gICB8IC4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHBhZGRpbmcKKwordnRhYmxlIChBbm5vdGF0ZWRCaW5hcnkuQmFyKToKKyAgKzB4MDBCOCB8IDA4IDAwICAgICAgICAgICAgICAgICAgIHwgdWludDE2X3QgICAgIHwgMHgwMDA4ICg4KSAgICAgICAgICAgICAgICAgICAgIHwgc2l6ZSBvZiB0aGlzIHZ0YWJsZQorICArMHgwMEJBIHwgMTMgMDAgICAgICAgICAgICAgICAgICAgfCB1aW50MTZfdCAgICAgfCAweDAwMTMgKDE5KSAgICAgICAgICAgICAgICAgICAgfCBzaXplIG9mIHJlZmVycmluZyB0YWJsZQorICArMHgwMEJDIHwgMDggMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgICAgfCAweDAwMDggKDgpICAgICAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYGFgIChpZDogMCkKKyAgKzB4MDBCRSB8IDA0IDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgIHwgMHgwMDA0ICg0KSAgICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBiYCAoaWQ6IDEpCisKK3RhYmxlIChBbm5vdGF0ZWRCaW5hcnkuQmFyKToKKyAgKzB4MDBDMCB8IDA4IDAwIDAwIDAwICAgICAgICAgICAgIHwgU09mZnNldDMyICAgIHwgMHgwMDAwMDAwOCAoOCkgTG9jOiArMHgwMEI4ICAgIHwgb2Zmc2V0IHRvIHZ0YWJsZQorICArMHgwMEM0IHwgMDAgODAgMjMgNDQgICAgICAgICAgICAgfCBmbG9hdCAgICAgICAgfCAweDQ0MjM4MDAwICg2NTQpICAgICAgICAgICAgICAgfCB0YWJsZSBmaWVsZCBgYmAgKEZsb2F0KQorICArMHgwMEM4IHwgMDAgMDAgMDAgMDAgMDAgMTAgNzQgNDAgfCBkb3VibGUgICAgICAgfCAweDQwNzQxMDAwMDAwMDAwMDAgKDMyMSkgICAgICAgfCB0YWJsZSBmaWVsZCBgYWAgKERvdWJsZSkKKyAgKzB4MDBEMCB8IDAwIDAwIDAwICAgICAgICAgICAgICAgIHwgdWludDhfdFszXSAgIHwgLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgcGFkZGluZworCit1bmlvbiAoQW5ub3RhdGVkQmluYXJ5LlRvbGVyYW5jZS5tZWFzdXJlbWVudCk6CisgICsweDAwRDMgfCAwNSAgICAgICAgICAgICAgICAgICAgICB8IHVpbnQ4X3QgICAgICB8IDB4MDUgKDUpICAgICAgICAgICAgICAgICAgICAgICB8IHN0cnVjdCBmaWVsZCBgQW5ub3RhdGVkQmluYXJ5LlRvbGVyYW5jZS53aWR0aGAgKFVCeXRlKQorCit2ZWN0b3IgKEFubm90YXRlZEJpbmFyeS5Gb28uZm9vYmFycyk6CisgICsweDAwRDQgfCAwMyAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgICB8IDB4MDAwMDAwMDMgKDMpICAgICAgICAgICAgICAgICB8IGxlbmd0aCBvZiB2ZWN0b3IgKCMgaXRlbXMpCisgICsweDAwRDggfCAzNCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgICB8IDB4MDAwMDAwMzQgKDUyKSBMb2M6ICsweDAxMEMgICB8IG9mZnNldCB0byB1bmlvblswXSAoYEJhcmApCisgICsweDAwREMgfCAyQyAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgICB8IDB4MDAwMDAwMkMgKDQ0KSBMb2M6ICsweDAxMDggICB8IG9mZnNldCB0byB1bmlvblsxXSAoYEJhemApCisgICsweDAwRTAgfCAwNCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgICB8IDB4MDAwMDAwMDQgKDQpIExvYzogKzB4MDBFNCAgICB8IG9mZnNldCB0byB1bmlvblsyXSAoYEJhcmApCisKK3RhYmxlIChBbm5vdGF0ZWRCaW5hcnkuQmFyKToKKyAgKzB4MDBFNCB8IEQyIEZFIEZGIEZGICAgICAgICAgICAgIHwgU09mZnNldDMyICAgIHwgMHhGRkZGRkVEMiAoLTMwMikgTG9jOiArMHgwMjEyIHwgRVJST1I6IG9mZnNldCB0byB2dGFibGUuIEludmFsaWQgb2Zmc2V0LCBwb2ludHMgb3V0c2lkZSB0aGUgYmluYXJ5LgorCit1bmtub3duIChubyBrbm93biByZWZlcmVuY2VzKToKKyAgKzB4MDBFOCB8IDAwIDgwIDIzIDQ0IDEwIDAwIDAwIDAwIHwgP3VpbnQ4X3RbMjhdIHwgLi4jRC4uLi4gICAgICAgICAgICAgICAgICAgICAgIHwgV0FSTjogbm90aGluZyByZWZlcnMgdG8gdGhpcyBzZWN0aW9uLgorICArMHgwMEYwIHwgMDAgMDAgMDAgMDAgMDAgRDggOEUgNDAgfCAgICAgICAgICAgICAgfCAuLi4uLi4uQAorICArMHgwMEY4IHwgMDAgMDAgMDAgMDAgNkEgRkUgRkYgRkYgfCAgICAgICAgICAgICAgfCAuLi4uai4uLgorICArMHgwMTAwIHwgMDAgMDAgMDAgMDMgICAgICAgICAgICAgfCAgICAgICAgICAgICAgfCAuLi4uCisKK3Z0YWJsZSAoQW5ub3RhdGVkQmluYXJ5LkJheik6CisgICsweDAxMDQgfCAwNCAwMCAgICAgICAgICAgICAgICAgICB8IHVpbnQxNl90ICAgICB8IDB4MDAwNCAoNCkgICAgICAgICAgICAgICAgICAgICB8IHNpemUgb2YgdGhpcyB2dGFibGUKKyAgKzB4MDEwNiB8IDA0IDAwICAgICAgICAgICAgICAgICAgIHwgdWludDE2X3QgICAgIHwgMHgwMDA0ICg0KSAgICAgICAgICAgICAgICAgICAgIHwgc2l6ZSBvZiByZWZlcnJpbmcgdGFibGUKKwordGFibGUgKEFubm90YXRlZEJpbmFyeS5CYXopOgorICArMHgwMTA4IHwgMDQgMDAgMDAgMDAgICAgICAgICAgICAgfCBTT2Zmc2V0MzIgICAgfCAweDAwMDAwMDA0ICg0KSBMb2M6ICsweDAxMDQgICAgfCBvZmZzZXQgdG8gdnRhYmxlCisKK3RhYmxlIChBbm5vdGF0ZWRCaW5hcnkuQmFyKToKKyAgKzB4MDEwQyB8IEZBIEZFIEZGIEZGICAgICAgICAgICAgIHwgU09mZnNldDMyICAgIHwgMHhGRkZGRkVGQSAoLTI2MikgTG9jOiArMHgwMjEyIHwgRVJST1I6IG9mZnNldCB0byB2dGFibGUuIEludmFsaWQgb2Zmc2V0LCBwb2ludHMgb3V0c2lkZSB0aGUgYmluYXJ5LgorCit1bmtub3duIChubyBrbm93biByZWZlcmVuY2VzKToKKyAgKzB4MDExMCB8IDAwIDAwIEU0IDQzIDEwIDAwIDAwIDAwIHwgP3VpbnQ4X3RbMjhdIHwgLi4uQy4uLi4gICAgICAgICAgICAgICAgICAgICAgIHwgV0FSTjogbm90aGluZyByZWZlcnMgdG8gdGhpcyBzZWN0aW9uLgorICArMHgwMTE4IHwgMDAgMDAgMDAgMDAgMDAgQzAgNUUgNDAgfCAgICAgICAgICAgICAgfCAuLi4uLi5eQAorICArMHgwMTIwIHwgMDAgMDAgMDAgMDAgOTIgRkUgRkYgRkYgfCAgICAgICAgICAgICAgfCAuLi4uLi4uLgorICArMHgwMTI4IHwgMDAgMDAgMDAgMDEgICAgICAgICAgICAgfCAgICAgICAgICAgICAgfCAuLi4uCisKK3ZlY3RvciAoQW5ub3RhdGVkQmluYXJ5LkZvby5mb29iYXJzX3R5cGUpOgorICArMHgwMTJDIHwgMDMgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICAgfCAweDAwMDAwMDAzICgzKSAgICAgICAgICAgICAgICAgfCBsZW5ndGggb2YgdmVjdG9yICgjIGl0ZW1zKQorICArMHgwMTMwIHwgMDEgICAgICAgICAgICAgICAgICAgICAgfCBVVHlwZTggICAgICAgfCAweDAxICgxKSAgICAgICAgICAgICAgICAgICAgICAgfCB2YWx1ZVswXQorICArMHgwMTMxIHwgMDIgICAgICAgICAgICAgICAgICAgICAgfCBVVHlwZTggICAgICAgfCAweDAyICgyKSAgICAgICAgICAgICAgICAgICAgICAgfCB2YWx1ZVsxXQorICArMHgwMTMyIHwgMDEgICAgICAgICAgICAgICAgICAgICAgfCBVVHlwZTggICAgICAgfCAweDAxICgxKSAgICAgICAgICAgICAgICAgICAgICAgfCB2YWx1ZVsyXQorCit2ZWN0b3IgKEFubm90YXRlZEJpbmFyeS5Gb28ucG9pbnRzX29mX2ludGVyZXN0KToKKyAgKzB4MDEzNCB8IDAzIDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgIHwgMHgwMDAwMDAwMyAoMykgICAgICAgICAgICAgICAgIHwgbGVuZ3RoIG9mIHZlY3RvciAoIyBpdGVtcykKKyAgKzB4MDEzOCB8IDMzIDMzIDMzIDMzIDMzIEEzIDQ1IDQwIHwgZG91YmxlICAgICAgIHwgMHg0MDQ1QTMzMzMzMzMzMzMzICg0My4yNzUpICAgIHwgc3RydWN0IGZpZWxkIGBBbm5vdGF0ZWRCaW5hcnkuTG9jYXRpb24ubGF0aXR1ZGVgIChEb3VibGUpCisgICsweDAxNDAgfCA3RSA1NyAwNCBGRiA1QiA4NyA1MyBDMCB8IGRvdWJsZSAgICAgICB8IDB4QzA1Mzg3NUJGRjA0NTc3RSAoLTc4LjExNSkgICB8IHN0cnVjdCBmaWVsZCBgQW5ub3RhdGVkQmluYXJ5LkxvY2F0aW9uLmxvbmdpdHVkZWAgKERvdWJsZSkKKyAgKzB4MDE0OCB8IDhEIEYwIEY2IDIwIDA0IEI2IDQyIDQwIHwgZG91YmxlICAgICAgIHwgMHg0MDQyQjYwNDIwRjZGMDhEICgzNy40MjIpICAgIHwgc3RydWN0IGZpZWxkIGBBbm5vdGF0ZWRCaW5hcnkuTG9jYXRpb24ubGF0aXR1ZGVgIChEb3VibGUpCisgICsweDAxNTAgfCA5RiA3NyA2MyA0MSA2MSA4NSA1RSBDMCB8IGRvdWJsZSAgICAgICB8IDB4QzA1RTg1NjE0MTYzNzc5RiAoLTEyMi4wODQpICB8IHN0cnVjdCBmaWVsZCBgQW5ub3RhdGVkQmluYXJ5LkxvY2F0aW9uLmxvbmdpdHVkZWAgKERvdWJsZSkKKyAgKzB4MDE1OCB8IDhGIDM1IDIzIDgzIERDIDM1IDRCIEMwIHwgZG91YmxlICAgICAgIHwgMHhDMDRCMzVEQzgzMjMzNThGICgtNTQuNDIwOCkgIHwgc3RydWN0IGZpZWxkIGBBbm5vdGF0ZWRCaW5hcnkuTG9jYXRpb24ubGF0aXR1ZGVgIChEb3VibGUpCisgICsweDAxNjAgfCBGNiA5NyBERCA5MyA4NyBDNSAwQSA0MCB8IGRvdWJsZSAgICAgICB8IDB4NDAwQUM1ODc5M0REOTdGNiAoMy4zNDY0NSkgICB8IHN0cnVjdCBmaWVsZCBgQW5ub3RhdGVkQmluYXJ5LkxvY2F0aW9uLmxvbmdpdHVkZWAgKERvdWJsZSkKKworcGFkZGluZzoKKyAgKzB4MDE2OCB8IDAwIDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDhfdFs0XSAgIHwgLi4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgcGFkZGluZworCit2ZWN0b3IgKEFubm90YXRlZEJpbmFyeS5Gb28ubmFtZXMpOgorICArMHgwMTZDIHwgMDMgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICAgfCAweDAwMDAwMDAzICgzKSAgICAgICAgICAgICAgICAgfCBsZW5ndGggb2YgdmVjdG9yICgjIGl0ZW1zKQorICArMHgwMTcwIHwgMjAgMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICAgfCAweDAwMDAwMDIwICgzMikgTG9jOiArMHgwMTkwICAgfCBvZmZzZXQgdG8gc3RyaW5nWzBdCisgICsweDAxNzQgfCAxNCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgICB8IDB4MDAwMDAwMTQgKDIwKSBMb2M6ICsweDAxODggICB8IG9mZnNldCB0byBzdHJpbmdbMV0KKyAgKzB4MDE3OCB8IDA0IDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgIHwgMHgwMDAwMDAwNCAoNCkgTG9jOiArMHgwMTdDICAgIHwgb2Zmc2V0IHRvIHN0cmluZ1syXQorCitzdHJpbmcgKEFubm90YXRlZEJpbmFyeS5Gb28ubmFtZXMpOgorICArMHgwMTdDIHwgMDcgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICAgfCAweDAwMDAwMDA3ICg3KSAgICAgICAgICAgICAgICAgfCBsZW5ndGggb2Ygc3RyaW5nCisgICsweDAxODAgfCA2MyA2OCA2MSA3MiA2QyA2OSA2NSAgICB8IGNoYXJbN10gICAgICB8IGNoYXJsaWUgICAgICAgICAgICAgICAgICAgICAgICB8IHN0cmluZyBsaXRlcmFsCisgICsweDAxODcgfCAwMCAgICAgICAgICAgICAgICAgICAgICB8IGNoYXIgICAgICAgICB8IDB4MDAgKDApICAgICAgICAgICAgICAgICAgICAgICB8IHN0cmluZyB0ZXJtaW5hdG9yCisKK3N0cmluZyAoQW5ub3RhdGVkQmluYXJ5LkZvby5uYW1lcyk6CisgICsweDAxODggfCAwMyAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgICB8IDB4MDAwMDAwMDMgKDMpICAgICAgICAgICAgICAgICB8IGxlbmd0aCBvZiBzdHJpbmcKKyAgKzB4MDE4QyB8IDYyIDZGIDYyICAgICAgICAgICAgICAgIHwgY2hhclszXSAgICAgIHwgYm9iICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nIGxpdGVyYWwKKyAgKzB4MDE4RiB8IDAwICAgICAgICAgICAgICAgICAgICAgIHwgY2hhciAgICAgICAgIHwgMHgwMCAoMCkgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nIHRlcm1pbmF0b3IKKworc3RyaW5nIChBbm5vdGF0ZWRCaW5hcnkuRm9vLm5hbWVzKToKKyAgKzB4MDE5MCB8IDA1IDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgIHwgMHgwMDAwMDAwNSAoNSkgICAgICAgICAgICAgICAgIHwgbGVuZ3RoIG9mIHN0cmluZworICArMHgwMTk0IHwgNjEgNkMgNjkgNjMgNjUgICAgICAgICAgfCBjaGFyWzVdICAgICAgfCBhbGljZSAgICAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJpbmcgbGl0ZXJhbAorICArMHgwMTk5IHwgMDAgICAgICAgICAgICAgICAgICAgICAgfCBjaGFyICAgICAgICAgfCAweDAwICgwKSAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJpbmcgdGVybWluYXRvcgorCitwYWRkaW5nOgorICArMHgwMTlBIHwgMDAgMDAgICAgICAgICAgICAgICAgICAgfCB1aW50OF90WzJdICAgfCAuLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBwYWRkaW5nCisKK3N0cmluZyAoQW5ub3RhdGVkQmluYXJ5LkZvby5hbGljZSk6CisgICsweDAxOUMgfCAwNyAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgICB8IDB4MDAwMDAwMDcgKDcpICAgICAgICAgICAgICAgICB8IGxlbmd0aCBvZiBzdHJpbmcKKyAgKzB4MDFBMCB8IDYzIDY4IDYxIDcyIDZDIDY5IDY1ICAgIHwgY2hhcls3XSAgICAgIHwgY2hhcmxpZSAgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nIGxpdGVyYWwKKyAgKzB4MDFBNyB8IDAwICAgICAgICAgICAgICAgICAgICAgIHwgY2hhciAgICAgICAgIHwgMHgwMCAoMCkgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nIHRlcm1pbmF0b3IKKworc3RyaW5nIChBbm5vdGF0ZWRCaW5hcnkuRm9vLmJvYik6CisgICsweDAxQTggfCAwNyAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgICB8IDB4MDAwMDAwMDcgKDcpICAgICAgICAgICAgICAgICB8IGxlbmd0aCBvZiBzdHJpbmcKKyAgKzB4MDFBQyB8IDYzIDY4IDYxIDcyIDZDIDY5IDY1ICAgIHwgY2hhcls3XSAgICAgIHwgY2hhcmxpZSAgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nIGxpdGVyYWwKKyAgKzB4MDFCMyB8IDAwICAgICAgICAgICAgICAgICAgICAgIHwgY2hhciAgICAgICAgIHwgMHgwMCAoMCkgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nIHRlcm1pbmF0b3IKKwordmVjdG9yIChBbm5vdGF0ZWRCaW5hcnkuRm9vLmFjY291bnRzKToKKyAgKzB4MDFCNCB8IDA5IDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgIHwgMHgwMDAwMDAwOSAoOSkgICAgICAgICAgICAgICAgIHwgbGVuZ3RoIG9mIHZlY3RvciAoIyBpdGVtcykKKyAgKzB4MDFCOCB8IDA5IDAwICAgICAgICAgICAgICAgICAgIHwgdWludDE2X3QgICAgIHwgMHgwMDA5ICg5KSAgICAgICAgICAgICAgICAgICAgIHwgdmFsdWVbMF0KKyAgKzB4MDFCQSB8IDA4IDAwICAgICAgICAgICAgICAgICAgIHwgdWludDE2X3QgICAgIHwgMHgwMDA4ICg4KSAgICAgICAgICAgICAgICAgICAgIHwgdmFsdWVbMV0KKyAgKzB4MDFCQyB8IDA3IDAwICAgICAgICAgICAgICAgICAgIHwgdWludDE2X3QgICAgIHwgMHgwMDA3ICg3KSAgICAgICAgICAgICAgICAgICAgIHwgdmFsdWVbMl0KKyAgKzB4MDFCRSB8IDAxIDAwICAgICAgICAgICAgICAgICAgIHwgdWludDE2X3QgICAgIHwgMHgwMDAxICgxKSAgICAgICAgICAgICAgICAgICAgIHwgdmFsdWVbM10KKyAgKzB4MDFDMCB8IDAyIDAwICAgICAgICAgICAgICAgICAgIHwgdWludDE2X3QgICAgIHwgMHgwMDAyICgyKSAgICAgICAgICAgICAgICAgICAgIHwgdmFsdWVbNF0KKyAgKzB4MDFDMiB8IDAzIDAwICAgICAgICAgICAgICAgICAgIHwgdWludDE2X3QgICAgIHwgMHgwMDAzICgzKSAgICAgICAgICAgICAgICAgICAgIHwgdmFsdWVbNV0KKyAgKzB4MDFDNCB8IDA2IDAwICAgICAgICAgICAgICAgICAgIHwgdWludDE2X3QgICAgIHwgMHgwMDA2ICg2KSAgICAgICAgICAgICAgICAgICAgIHwgdmFsdWVbNl0KKyAgKzB4MDFDNiB8IDA1IDAwICAgICAgICAgICAgICAgICAgIHwgdWludDE2X3QgICAgIHwgMHgwMDA1ICg1KSAgICAgICAgICAgICAgICAgICAgIHwgdmFsdWVbN10KKyAgKzB4MDFDOCB8IDA0IDAwICAgICAgICAgICAgICAgICAgIHwgdWludDE2X3QgICAgIHwgMHgwMDA0ICg0KSAgICAgICAgICAgICAgICAgICAgIHwgdmFsdWVbOF0KKworcGFkZGluZzoKKyAgKzB4MDFDQSB8IDAwIDAwICAgICAgICAgICAgICAgICAgIHwgdWludDhfdFsyXSAgIHwgLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgcGFkZGluZworCit0YWJsZSAoQW5ub3RhdGVkQmluYXJ5LkJheik6CisgICsweDAxQ0MgfCAzQSBGRiBGRiBGRiAgICAgICAgICAgICB8IFNPZmZzZXQzMiAgICB8IDB4RkZGRkZGM0EgKC0xOTgpIExvYzogKzB4MDI5MiB8IEVSUk9SOiBvZmZzZXQgdG8gdnRhYmxlLiBJbnZhbGlkIG9mZnNldCwgcG9pbnRzIG91dHNpZGUgdGhlIGJpbmFyeS4KKwordW5rbm93biAobm8ga25vd24gcmVmZXJlbmNlcyk6CisgICsweDAxRDAgfCAwMCAwMCAwMCAwMyAgICAgICAgICAgICB8ID91aW50OF90WzRdICB8IC4uLi4gICAgICAgICAgICAgICAgICAgICAgICAgICB8IFdBUk46IGNvdWxkIGJlIGNvcnJ1cHRlZCBwYWRkaW5nIHJlZ2lvbi4KKwordmVjdG9yIChBbm5vdGF0ZWRCaW5hcnkuRm9vLmJhcnMpOgorICArMHgwMUQ0IHwgMDIgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICAgfCAweDAwMDAwMDAyICgyKSAgICAgICAgICAgICAgICAgfCBFUlJPUjogbGVuZ3RoIG9mIHZlY3RvciAoIyBpdGVtcykuIExvbmdlciB0aGFuIHRoZSBiaW5hcnkuCisKK3Vua25vd24gKG5vIGtub3duIHJlZmVyZW5jZXMpOgorICArMHgwMUQ4IHwgNDQgMDAgMDAgMDAgMTAgMDAgICAgICAgfCA/dWludDhfdFs2XSAgfCBELi4uLi4gICAgICAgICAgICAgICAgICAgICAgICAgfCBXQVJOOiBjb3VsZCBiZSBjb3JydXB0ZWQgcGFkZGluZyByZWdpb24uCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9hbm5vdGF0ZWRfYmluYXJ5L3Rlc3RzL2ludmFsaWRfdmVjdG9yX3VuaW9uc19jdXRfc2hvcnQuYmluIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvYW5ub3RhdGVkX2JpbmFyeS90ZXN0cy9pbnZhbGlkX3ZlY3Rvcl91bmlvbnNfY3V0X3Nob3J0LmJpbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yODIzZDgzCi0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvYW5ub3RhdGVkX2JpbmFyeS90ZXN0cy9pbnZhbGlkX3ZlY3Rvcl91bmlvbnNfY3V0X3Nob3J0LmJpbgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9hbm5vdGF0ZWRfYmluYXJ5L3Rlc3RzL2ludmFsaWRfdnRhYmxlX2ZpZWxkX29mZnNldC5hZmIgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9hbm5vdGF0ZWRfYmluYXJ5L3Rlc3RzL2ludmFsaWRfdnRhYmxlX2ZpZWxkX29mZnNldC5hZmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGI3ODZiZQotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL2Fubm90YXRlZF9iaW5hcnkvdGVzdHMvaW52YWxpZF92dGFibGVfZmllbGRfb2Zmc2V0LmFmYgpAQCAtMCwwICsxLDI4NiBAQAorLy8gQW5ub3RhdGVkIEZsYXRidWZmZXIgQmluYXJ5CisvLworLy8gU2NoZW1hIGZpbGU6IGFubm90YXRlZF9iaW5hcnkuZmJzCisvLyBCaW5hcnkgZmlsZTogdGVzdHMvaW52YWxpZF92dGFibGVfZmllbGRfb2Zmc2V0LmJpbgorCitoZWFkZXI6CisgICsweDAwMDAgfCA0NCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgICB8IDB4MDAwMDAwNDQgKDY4KSBMb2M6ICsweDAwNDQgICB8IG9mZnNldCB0byByb290IHRhYmxlIGBBbm5vdGF0ZWRCaW5hcnkuRm9vYAorICArMHgwMDA0IHwgNDEgNEUgNEUgNEYgICAgICAgICAgICAgfCBjaGFyWzRdICAgICAgfCBBTk5PICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBGaWxlIElkZW50aWZpZXIKKworcGFkZGluZzoKKyAgKzB4MDAwOCB8IDAwIDAwICAgICAgICAgICAgICAgICAgIHwgdWludDhfdFsyXSAgIHwgLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgcGFkZGluZworCit2dGFibGUgKEFubm90YXRlZEJpbmFyeS5Gb28pOgorICArMHgwMDBBIHwgM0EgMDAgICAgICAgICAgICAgICAgICAgfCB1aW50MTZfdCAgICAgfCAweDAwM0EgKDU4KSAgICAgICAgICAgICAgICAgICAgfCBzaXplIG9mIHRoaXMgdnRhYmxlCisgICsweDAwMEMgfCA2OCAwMCAgICAgICAgICAgICAgICAgICB8IHVpbnQxNl90ICAgICB8IDB4MDA2OCAoMTA0KSAgICAgICAgICAgICAgICAgICB8IHNpemUgb2YgcmVmZXJyaW5nIHRhYmxlCisgICsweDAwMEUgfCAwQyAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgICB8IDB4MDAwQyAoMTIpICAgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgY291bnRlcmAgKGlkOiAwKQorICArMHgwMDEwIHwgMDcgMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgICAgfCAweDAwMDcgKDcpICAgICAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYGhlYWx0aHlgIChpZDogMSkKKyAgKzB4MDAxMiB8IDAwIDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgIHwgMHgwMDAwICgwKSAgICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBsZXZlbGAgKGlkOiAyKSA8ZGVmYXVsdHMgdG8gOTk+IChMb25nKQorICArMHgwMDE0IHwgMDggMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgICAgfCAweDAwMDggKDgpICAgICAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYG1lYWxgIChpZDogMykKKyAgKzB4MDAxNiB8IEZGIEZGICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgIHwgMHhGRkZGICg2NTUzNSkgICAgICAgICAgICAgICAgIHwgRVJST1I6IG9mZnNldCB0byBmaWVsZCBgYmFyYCAoaWQ6IDQpLiBJbnZhbGlkIG9mZnNldCwgcG9pbnRzIG91dHNpZGUgdGhlIGJpbmFyeS4KKyAgKzB4MDAxOCB8IDE0IDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgIHwgMHgwMDE0ICgyMCkgICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBob21lYCAoaWQ6IDUpCisgICsweDAwMUEgfCAzMCAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgICB8IDB4MDAzMCAoNDgpICAgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgbmFtZWAgKGlkOiA2KQorICArMHgwMDFDIHwgMzQgMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgICAgfCAweDAwMzQgKDUyKSAgICAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYGJhcnNgIChpZDogNykKKyAgKzB4MDAxRSB8IDA5IDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgIHwgMHgwMDA5ICg5KSAgICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBiYXJfYmF6X3R5cGVgIChpZDogOCkKKyAgKzB4MDAyMCB8IDM4IDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgIHwgMHgwMDM4ICg1NikgICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBiYXJfYmF6YCAoaWQ6IDkpCisgICsweDAwMjIgfCAzQyAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgICB8IDB4MDAzQyAoNjApICAgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgYWNjb3VudHNgIChpZDogMTApCisgICsweDAwMjQgfCA0MCAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgICB8IDB4MDA0MCAoNjQpICAgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgYm9iYCAoaWQ6IDExKQorICArMHgwMDI2IHwgNDQgMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgICAgfCAweDAwNDQgKDY4KSAgICAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYGFsaWNlYCAoaWQ6IDEyKQorICArMHgwMDI4IHwgMDAgMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgICAgfCAweDAwMDAgKDApICAgICAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYG1heWJlX2kzMmAgKGlkOiAxMykgPGRlZmF1bHRzIHRvIDA+IChJbnQpCisgICsweDAwMkEgfCAwMCAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgICB8IDB4MDAwMCAoMCkgICAgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgZGVmYXVsdF9pMzJgIChpZDogMTQpIDxkZWZhdWx0cyB0byA0Mj4gKEludCkKKyAgKzB4MDAyQyB8IDQ4IDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgIHwgMHgwMDQ4ICg3MikgICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBqdXN0X2kzMmAgKGlkOiAxNSkKKyAgKzB4MDAyRSB8IDRDIDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgIHwgMHgwMDRDICg3NikgICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBuYW1lc2AgKGlkOiAxNikKKyAgKzB4MDAzMCB8IDUwIDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgIHwgMHgwMDUwICg4MCkgICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBwb2ludHNfb2ZfaW50ZXJlc3RgIChpZDogMTcpCisgICsweDAwMzIgfCA1NCAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgICB8IDB4MDA1NCAoODQpICAgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgZm9vYmFyc190eXBlYCAoaWQ6IDE4KQorICArMHgwMDM0IHwgNTggMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgICAgfCAweDAwNTggKDg4KSAgICAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYGZvb2JhcnNgIChpZDogMTkpCisgICsweDAwMzYgfCAwQSAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgICB8IDB4MDAwQSAoMTApICAgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgbWVhc3VyZW1lbnRfdHlwZWAgKGlkOiAyMCkKKyAgKzB4MDAzOCB8IDVDIDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgIHwgMHgwMDVDICg5MikgICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBtZWFzdXJlbWVudGAgKGlkOiAyMSkKKyAgKzB4MDAzQSB8IDBCIDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgIHwgMHgwMDBCICgxMSkgICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBhbnl0aGluZ190eXBlYCAoaWQ6IDIyKQorICArMHgwMDNDIHwgNjAgMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgICAgfCAweDAwNjAgKDk2KSAgICAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYGFueXRoaW5nYCAoaWQ6IDIzKQorICArMHgwMDNFIHwgMDAgMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgICAgfCAweDAwMDAgKDApICAgICAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYHRlbXBlcmF0dXJlYCAoaWQ6IDI0KSA8ZGVmYXVsdHMgdG8gOTguNjAwMDAwPiAoRmxvYXQpCisgICsweDAwNDAgfCAwMCAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgICB8IDB4MDAwMCAoMCkgICAgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgdGVldG90YWxlcmAgKGlkOiAyNSkgPG51bGw+IChPYmopCisgICsweDAwNDIgfCA2NCAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgICB8IDB4MDA2NCAoMTAwKSAgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgY2hhcmxpZWAgKGlkOiAyNikKKyAgKzB4MDA0MiB8IDY0IDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgIHwgMHgwMDY0ICgxMDApICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIHVua25vd24gZmllbGQgKGlkOiAyNikKKworcm9vdF90YWJsZSAoQW5ub3RhdGVkQmluYXJ5LkZvbyk6CisgICsweDAwNDQgfCAzQSAwMCAwMCAwMCAgICAgICAgICAgICB8IFNPZmZzZXQzMiAgICB8IDB4MDAwMDAwM0EgKDU4KSBMb2M6ICsweDAwMEEgICB8IG9mZnNldCB0byB2dGFibGUKKyAgKzB4MDA0OCB8IDAwIDAwIDAwICAgICAgICAgICAgICAgIHwgdWludDhfdFszXSAgIHwgLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgcGFkZGluZworICArMHgwMDRCIHwgMDEgICAgICAgICAgICAgICAgICAgICAgfCB1aW50OF90ICAgICAgfCAweDAxICgxKSAgICAgICAgICAgICAgICAgICAgICAgfCB0YWJsZSBmaWVsZCBgaGVhbHRoeWAgKEJvb2wpCisgICsweDAwNEMgfCAwMiAgICAgICAgICAgICAgICAgICAgICB8IHVpbnQ4X3QgICAgICB8IDB4MDIgKDIpICAgICAgICAgICAgICAgICAgICAgICB8IHRhYmxlIGZpZWxkIGBtZWFsYCAoQnl0ZSkKKyAgKzB4MDA0RCB8IDAyICAgICAgICAgICAgICAgICAgICAgIHwgVVR5cGU4ICAgICAgIHwgMHgwMiAoMikgICAgICAgICAgICAgICAgICAgICAgIHwgdGFibGUgZmllbGQgYGJhcl9iYXpfdHlwZWAgKFVUeXBlKQorICArMHgwMDRFIHwgMDEgICAgICAgICAgICAgICAgICAgICAgfCBVVHlwZTggICAgICAgfCAweDAxICgxKSAgICAgICAgICAgICAgICAgICAgICAgfCB0YWJsZSBmaWVsZCBgbWVhc3VyZW1lbnRfdHlwZWAgKFVUeXBlKQorICArMHgwMDRGIHwgMDEgICAgICAgICAgICAgICAgICAgICAgfCBVVHlwZTggICAgICAgfCAweDAxICgxKSAgICAgICAgICAgICAgICAgICAgICAgfCB0YWJsZSBmaWVsZCBgYW55dGhpbmdfdHlwZWAgKFVUeXBlKQorICArMHgwMDUwIHwgRDIgMDQgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICAgfCAweDAwMDAwNEQyICgxMjM0KSAgICAgICAgICAgICAgfCB0YWJsZSBmaWVsZCBgY291bnRlcmAgKEludCkKKyAgKzB4MDA1NCB8IDI4IDAyIDAwIDAwICAgICAgICAgICAgIHwgP3VpbnQ4X3RbNF0gIHwgKC4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgV0FSTjogbm90aGluZyByZWZlcnMgdG8gdGhpcyBzZWN0aW9uLgorICArMHgwMDU4IHwgMDEgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICAgfCAweDAwMDAwMDAxICgxKSAgICAgICAgICAgICAgICAgfCBzdHJ1Y3QgZmllbGQgYEFubm90YXRlZEJpbmFyeS5CdWlsZGluZy5mbG9vcnNgIChJbnQpCisgICsweDAwNUMgfCAwMiAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgICB8IDB4MDAwMDAwMDIgKDIpICAgICAgICAgICAgICAgICB8IHN0cnVjdCBmaWVsZCBgQW5ub3RhdGVkQmluYXJ5LkJ1aWxkaW5nLmRvb3JzYCAoSW50KQorICArMHgwMDYwIHwgMEMgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICAgfCAweDAwMDAwMDBDICgxMikgICAgICAgICAgICAgICAgfCBzdHJ1Y3QgZmllbGQgYEFubm90YXRlZEJpbmFyeS5CdWlsZGluZy53aW5kb3dzYCAoSW50KQorICArMHgwMDY0IHwgMEEgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICAgfCAweDAwMDAwMDBBICgxMCkgICAgICAgICAgICAgICAgfCBhcnJheSBmaWVsZCBgQW5ub3RhdGVkQmluYXJ5LkRpbWVuc2lvbi52YWx1ZXNgWzBdIChJbnQpCisgICsweDAwNjggfCAwQyAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgICB8IDB4MDAwMDAwMEMgKDEyKSAgICAgICAgICAgICAgICB8IGFycmF5IGZpZWxkIGBBbm5vdGF0ZWRCaW5hcnkuRGltZW5zaW9uLnZhbHVlc2BbMV0gKEludCkKKyAgKzB4MDA2QyB8IDE0IDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgIHwgMHgwMDAwMDAxNCAoMjApICAgICAgICAgICAgICAgIHwgYXJyYXkgZmllbGQgYEFubm90YXRlZEJpbmFyeS5EaW1lbnNpb24udmFsdWVzYFsyXSAoSW50KQorICArMHgwMDcwIHwgMDEgICAgICAgICAgICAgICAgICAgICAgfCB1aW50OF90ICAgICAgfCAweDAxICgxKSAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJ1Y3QgZmllbGQgYEFubm90YXRlZEJpbmFyeS5Ub2xlcmFuY2Uud2lkdGhgIChVQnl0ZSkKKyAgKzB4MDA3MSB8IDAyICAgICAgICAgICAgICAgICAgICAgIHwgdWludDhfdCAgICAgIHwgMHgwMiAoMikgICAgICAgICAgICAgICAgICAgICAgIHwgc3RydWN0IGZpZWxkIGBBbm5vdGF0ZWRCaW5hcnkuVG9sZXJhbmNlLndpZHRoYCAoVUJ5dGUpCisgICsweDAwNzIgfCAwMyAgICAgICAgICAgICAgICAgICAgICB8IHVpbnQ4X3QgICAgICB8IDB4MDMgKDMpICAgICAgICAgICAgICAgICAgICAgICB8IHN0cnVjdCBmaWVsZCBgQW5ub3RhdGVkQmluYXJ5LlRvbGVyYW5jZS53aWR0aGAgKFVCeXRlKQorICArMHgwMDczIHwgMDAgICAgICAgICAgICAgICAgICAgICAgfCB1aW50OF90WzFdICAgfCAuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBwYWRkaW5nCisgICsweDAwNzQgfCBDOCAwMSAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgICB8IDB4MDAwMDAxQzggKDQ1NikgTG9jOiArMHgwMjNDICB8IG9mZnNldCB0byBmaWVsZCBgbmFtZWAgKHN0cmluZykKKyAgKzB4MDA3OCB8IDVDIDAxIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgIHwgMHgwMDAwMDE1QyAoMzQ4KSBMb2M6ICsweDAxRDQgIHwgb2Zmc2V0IHRvIGZpZWxkIGBiYXJzYCAodmVjdG9yKQorICArMHgwMDdDIHwgNTAgMDEgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICAgfCAweDAwMDAwMTUwICgzMzYpIExvYzogKzB4MDFDQyAgfCBvZmZzZXQgdG8gZmllbGQgYGJhcl9iYXpgICh1bmlvbiBvZiB0eXBlIGBCYXpgKQorICArMHgwMDgwIHwgMzQgMDEgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICAgfCAweDAwMDAwMTM0ICgzMDgpIExvYzogKzB4MDFCNCAgfCBvZmZzZXQgdG8gZmllbGQgYGFjY291bnRzYCAodmVjdG9yKQorICArMHgwMDg0IHwgMjQgMDEgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICAgfCAweDAwMDAwMTI0ICgyOTIpIExvYzogKzB4MDFBOCAgfCBvZmZzZXQgdG8gZmllbGQgYGJvYmAgKHN0cmluZykKKyAgKzB4MDA4OCB8IDE0IDAxIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgIHwgMHgwMDAwMDExNCAoMjc2KSBMb2M6ICsweDAxOUMgIHwgb2Zmc2V0IHRvIGZpZWxkIGBhbGljZWAgKHN0cmluZykKKyAgKzB4MDA4QyB8IDBEIDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgIHwgMHgwMDAwMDAwRCAoMTMpICAgICAgICAgICAgICAgIHwgdGFibGUgZmllbGQgYGp1c3RfaTMyYCAoSW50KQorICArMHgwMDkwIHwgREMgMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICAgfCAweDAwMDAwMERDICgyMjApIExvYzogKzB4MDE2QyAgfCBvZmZzZXQgdG8gZmllbGQgYG5hbWVzYCAodmVjdG9yKQorICArMHgwMDk0IHwgQTAgMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICAgfCAweDAwMDAwMEEwICgxNjApIExvYzogKzB4MDEzNCAgfCBvZmZzZXQgdG8gZmllbGQgYHBvaW50c19vZl9pbnRlcmVzdGAgKHZlY3RvcikKKyAgKzB4MDA5OCB8IDk0IDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgIHwgMHgwMDAwMDA5NCAoMTQ4KSBMb2M6ICsweDAxMkMgIHwgb2Zmc2V0IHRvIGZpZWxkIGBmb29iYXJzX3R5cGVgICh2ZWN0b3IpCisgICsweDAwOUMgfCAzOCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgICB8IDB4MDAwMDAwMzggKDU2KSBMb2M6ICsweDAwRDQgICB8IG9mZnNldCB0byBmaWVsZCBgZm9vYmFyc2AgKHZlY3RvcikKKyAgKzB4MDBBMCB8IDMzIDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgIHwgMHgwMDAwMDAzMyAoNTEpIExvYzogKzB4MDBEMyAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBtZWFzdXJlbWVudGAgKHVuaW9uIG9mIHR5cGUgYFRvbGVyYW5jZWApCisgICsweDAwQTQgfCAxQyAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgICB8IDB4MDAwMDAwMUMgKDI4KSBMb2M6ICsweDAwQzAgICB8IG9mZnNldCB0byBmaWVsZCBgYW55dGhpbmdgICh1bmlvbiBvZiB0eXBlIGBCYXJgKQorICArMHgwMEE4IHwgMDQgMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICAgfCAweDAwMDAwMDA0ICg0KSBMb2M6ICsweDAwQUMgICAgfCBvZmZzZXQgdG8gZmllbGQgYGNoYXJsaWVgIChzdHJpbmcpCisKK3N0cmluZyAoQW5ub3RhdGVkQmluYXJ5LkZvby5jaGFybGllKToKKyAgKzB4MDBBQyB8IDA1IDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgIHwgMHgwMDAwMDAwNSAoNSkgICAgICAgICAgICAgICAgIHwgbGVuZ3RoIG9mIHN0cmluZworICArMHgwMEIwIHwgNjEgNkMgNjkgNjMgNjUgICAgICAgICAgfCBjaGFyWzVdICAgICAgfCBhbGljZSAgICAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJpbmcgbGl0ZXJhbAorICArMHgwMEI1IHwgMDAgICAgICAgICAgICAgICAgICAgICAgfCBjaGFyICAgICAgICAgfCAweDAwICgwKSAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJpbmcgdGVybWluYXRvcgorCitwYWRkaW5nOgorICArMHgwMEI2IHwgMDAgMDAgICAgICAgICAgICAgICAgICAgfCB1aW50OF90WzJdICAgfCAuLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBwYWRkaW5nCisKK3Z0YWJsZSAoQW5ub3RhdGVkQmluYXJ5LkJhcik6CisgICsweDAwQjggfCAwOCAwMCAgICAgICAgICAgICAgICAgICB8IHVpbnQxNl90ICAgICB8IDB4MDAwOCAoOCkgICAgICAgICAgICAgICAgICAgICB8IHNpemUgb2YgdGhpcyB2dGFibGUKKyAgKzB4MDBCQSB8IDEzIDAwICAgICAgICAgICAgICAgICAgIHwgdWludDE2X3QgICAgIHwgMHgwMDEzICgxOSkgICAgICAgICAgICAgICAgICAgIHwgc2l6ZSBvZiByZWZlcnJpbmcgdGFibGUKKyAgKzB4MDBCQyB8IDA4IDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgIHwgMHgwMDA4ICg4KSAgICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBhYCAoaWQ6IDApCisgICsweDAwQkUgfCAwNCAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgICB8IDB4MDAwNCAoNCkgICAgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgYmAgKGlkOiAxKQorCit0YWJsZSAoQW5ub3RhdGVkQmluYXJ5LkJhcik6CisgICsweDAwQzAgfCAwOCAwMCAwMCAwMCAgICAgICAgICAgICB8IFNPZmZzZXQzMiAgICB8IDB4MDAwMDAwMDggKDgpIExvYzogKzB4MDBCOCAgICB8IG9mZnNldCB0byB2dGFibGUKKyAgKzB4MDBDNCB8IDAwIDgwIDIzIDQ0ICAgICAgICAgICAgIHwgZmxvYXQgICAgICAgIHwgMHg0NDIzODAwMCAoNjU0KSAgICAgICAgICAgICAgIHwgdGFibGUgZmllbGQgYGJgIChGbG9hdCkKKyAgKzB4MDBDOCB8IDAwIDAwIDAwIDAwIDAwIDEwIDc0IDQwIHwgZG91YmxlICAgICAgIHwgMHg0MDc0MTAwMDAwMDAwMDAwICgzMjEpICAgICAgIHwgdGFibGUgZmllbGQgYGFgIChEb3VibGUpCisgICsweDAwRDAgfCAwMCAwMCAwMCAgICAgICAgICAgICAgICB8IHVpbnQ4X3RbM10gICB8IC4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHBhZGRpbmcKKwordW5pb24gKEFubm90YXRlZEJpbmFyeS5Ub2xlcmFuY2UubWVhc3VyZW1lbnQpOgorICArMHgwMEQzIHwgMDUgICAgICAgICAgICAgICAgICAgICAgfCB1aW50OF90ICAgICAgfCAweDA1ICg1KSAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJ1Y3QgZmllbGQgYEFubm90YXRlZEJpbmFyeS5Ub2xlcmFuY2Uud2lkdGhgIChVQnl0ZSkKKwordmVjdG9yIChBbm5vdGF0ZWRCaW5hcnkuRm9vLmZvb2JhcnMpOgorICArMHgwMEQ0IHwgMDMgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICAgfCAweDAwMDAwMDAzICgzKSAgICAgICAgICAgICAgICAgfCBsZW5ndGggb2YgdmVjdG9yICgjIGl0ZW1zKQorICArMHgwMEQ4IHwgMzQgMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICAgfCAweDAwMDAwMDM0ICg1MikgTG9jOiArMHgwMTBDICAgfCBvZmZzZXQgdG8gdW5pb25bMF0gKGBCYXJgKQorICArMHgwMERDIHwgMkMgMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICAgfCAweDAwMDAwMDJDICg0NCkgTG9jOiArMHgwMTA4ICAgfCBvZmZzZXQgdG8gdW5pb25bMV0gKGBCYXpgKQorICArMHgwMEUwIHwgMDQgMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICAgfCAweDAwMDAwMDA0ICg0KSBMb2M6ICsweDAwRTQgICAgfCBvZmZzZXQgdG8gdW5pb25bMl0gKGBCYXJgKQorCit0YWJsZSAoQW5ub3RhdGVkQmluYXJ5LkJhcik6CisgICsweDAwRTQgfCBEMiBGRSBGRiBGRiAgICAgICAgICAgICB8IFNPZmZzZXQzMiAgICB8IDB4RkZGRkZFRDIgKC0zMDIpIExvYzogKzB4MDIxMiB8IG9mZnNldCB0byB2dGFibGUKKyAgKzB4MDBFOCB8IDAwIDgwIDIzIDQ0ICAgICAgICAgICAgIHwgZmxvYXQgICAgICAgIHwgMHg0NDIzODAwMCAoNjU0KSAgICAgICAgICAgICAgIHwgdGFibGUgZmllbGQgYGJgIChGbG9hdCkKKyAgKzB4MDBFQyB8IDEwIDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgIHwgMHgwMDAwMDAxMCAoMTYpIExvYzogKzB4MDBGQyAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBjYCAodGFibGUpCisgICsweDAwRjAgfCAwMCAwMCAwMCAwMCAwMCBEOCA4RSA0MCB8IGRvdWJsZSAgICAgICB8IDB4NDA4RUQ4MDAwMDAwMDAwMCAoOTg3KSAgICAgICB8IHRhYmxlIGZpZWxkIGBhYCAoRG91YmxlKQorICArMHgwMEY4IHwgMDAgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50OF90WzRdICAgfCAuLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBwYWRkaW5nCisKK3RhYmxlIChBbm5vdGF0ZWRCaW5hcnkuQmF6KToKKyAgKzB4MDBGQyB8IDZBIEZFIEZGIEZGICAgICAgICAgICAgIHwgU09mZnNldDMyICAgIHwgMHhGRkZGRkU2QSAoLTQwNikgTG9jOiArMHgwMjkyIHwgb2Zmc2V0IHRvIHZ0YWJsZQorICArMHgwMTAwIHwgMDAgMDAgMDAgICAgICAgICAgICAgICAgfCB1aW50OF90WzNdICAgfCAuLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBwYWRkaW5nCisgICsweDAxMDMgfCAwMyAgICAgICAgICAgICAgICAgICAgICB8IHVpbnQ4X3QgICAgICB8IDB4MDMgKDMpICAgICAgICAgICAgICAgICAgICAgICB8IHRhYmxlIGZpZWxkIGBtZWFsYCAoQnl0ZSkKKwordnRhYmxlIChBbm5vdGF0ZWRCaW5hcnkuQmF6KToKKyAgKzB4MDEwNCB8IDA0IDAwICAgICAgICAgICAgICAgICAgIHwgdWludDE2X3QgICAgIHwgMHgwMDA0ICg0KSAgICAgICAgICAgICAgICAgICAgIHwgc2l6ZSBvZiB0aGlzIHZ0YWJsZQorICArMHgwMTA2IHwgMDQgMDAgICAgICAgICAgICAgICAgICAgfCB1aW50MTZfdCAgICAgfCAweDAwMDQgKDQpICAgICAgICAgICAgICAgICAgICAgfCBzaXplIG9mIHJlZmVycmluZyB0YWJsZQorCit0YWJsZSAoQW5ub3RhdGVkQmluYXJ5LkJheik6CisgICsweDAxMDggfCAwNCAwMCAwMCAwMCAgICAgICAgICAgICB8IFNPZmZzZXQzMiAgICB8IDB4MDAwMDAwMDQgKDQpIExvYzogKzB4MDEwNCAgICB8IG9mZnNldCB0byB2dGFibGUKKwordGFibGUgKEFubm90YXRlZEJpbmFyeS5CYXIpOgorICArMHgwMTBDIHwgRkEgRkUgRkYgRkYgICAgICAgICAgICAgfCBTT2Zmc2V0MzIgICAgfCAweEZGRkZGRUZBICgtMjYyKSBMb2M6ICsweDAyMTIgfCBvZmZzZXQgdG8gdnRhYmxlCisgICsweDAxMTAgfCAwMCAwMCBFNCA0MyAgICAgICAgICAgICB8IGZsb2F0ICAgICAgICB8IDB4NDNFNDAwMDAgKDQ1NikgICAgICAgICAgICAgICB8IHRhYmxlIGZpZWxkIGBiYCAoRmxvYXQpCisgICsweDAxMTQgfCAxMCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgICB8IDB4MDAwMDAwMTAgKDE2KSBMb2M6ICsweDAxMjQgICB8IG9mZnNldCB0byBmaWVsZCBgY2AgKHRhYmxlKQorICArMHgwMTE4IHwgMDAgMDAgMDAgMDAgMDAgQzAgNUUgNDAgfCBkb3VibGUgICAgICAgfCAweDQwNUVDMDAwMDAwMDAwMDAgKDEyMykgICAgICAgfCB0YWJsZSBmaWVsZCBgYWAgKERvdWJsZSkKKyAgKzB4MDEyMCB8IDAwIDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDhfdFs0XSAgIHwgLi4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgcGFkZGluZworCit0YWJsZSAoQW5ub3RhdGVkQmluYXJ5LkJheik6CisgICsweDAxMjQgfCA5MiBGRSBGRiBGRiAgICAgICAgICAgICB8IFNPZmZzZXQzMiAgICB8IDB4RkZGRkZFOTIgKC0zNjYpIExvYzogKzB4MDI5MiB8IG9mZnNldCB0byB2dGFibGUKKyAgKzB4MDEyOCB8IDAwIDAwIDAwICAgICAgICAgICAgICAgIHwgdWludDhfdFszXSAgIHwgLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgcGFkZGluZworICArMHgwMTJCIHwgMDEgICAgICAgICAgICAgICAgICAgICAgfCB1aW50OF90ICAgICAgfCAweDAxICgxKSAgICAgICAgICAgICAgICAgICAgICAgfCB0YWJsZSBmaWVsZCBgbWVhbGAgKEJ5dGUpCisKK3ZlY3RvciAoQW5ub3RhdGVkQmluYXJ5LkZvby5mb29iYXJzX3R5cGUpOgorICArMHgwMTJDIHwgMDMgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICAgfCAweDAwMDAwMDAzICgzKSAgICAgICAgICAgICAgICAgfCBsZW5ndGggb2YgdmVjdG9yICgjIGl0ZW1zKQorICArMHgwMTMwIHwgMDEgICAgICAgICAgICAgICAgICAgICAgfCBVVHlwZTggICAgICAgfCAweDAxICgxKSAgICAgICAgICAgICAgICAgICAgICAgfCB2YWx1ZVswXQorICArMHgwMTMxIHwgMDIgICAgICAgICAgICAgICAgICAgICAgfCBVVHlwZTggICAgICAgfCAweDAyICgyKSAgICAgICAgICAgICAgICAgICAgICAgfCB2YWx1ZVsxXQorICArMHgwMTMyIHwgMDEgICAgICAgICAgICAgICAgICAgICAgfCBVVHlwZTggICAgICAgfCAweDAxICgxKSAgICAgICAgICAgICAgICAgICAgICAgfCB2YWx1ZVsyXQorCit2ZWN0b3IgKEFubm90YXRlZEJpbmFyeS5Gb28ucG9pbnRzX29mX2ludGVyZXN0KToKKyAgKzB4MDEzNCB8IDAzIDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgIHwgMHgwMDAwMDAwMyAoMykgICAgICAgICAgICAgICAgIHwgbGVuZ3RoIG9mIHZlY3RvciAoIyBpdGVtcykKKyAgKzB4MDEzOCB8IDMzIDMzIDMzIDMzIDMzIEEzIDQ1IDQwIHwgZG91YmxlICAgICAgIHwgMHg0MDQ1QTMzMzMzMzMzMzMzICg0My4yNzUpICAgIHwgc3RydWN0IGZpZWxkIGBBbm5vdGF0ZWRCaW5hcnkuTG9jYXRpb24ubGF0aXR1ZGVgIChEb3VibGUpCisgICsweDAxNDAgfCA3RSA1NyAwNCBGRiA1QiA4NyA1MyBDMCB8IGRvdWJsZSAgICAgICB8IDB4QzA1Mzg3NUJGRjA0NTc3RSAoLTc4LjExNSkgICB8IHN0cnVjdCBmaWVsZCBgQW5ub3RhdGVkQmluYXJ5LkxvY2F0aW9uLmxvbmdpdHVkZWAgKERvdWJsZSkKKyAgKzB4MDE0OCB8IDhEIEYwIEY2IDIwIDA0IEI2IDQyIDQwIHwgZG91YmxlICAgICAgIHwgMHg0MDQyQjYwNDIwRjZGMDhEICgzNy40MjIpICAgIHwgc3RydWN0IGZpZWxkIGBBbm5vdGF0ZWRCaW5hcnkuTG9jYXRpb24ubGF0aXR1ZGVgIChEb3VibGUpCisgICsweDAxNTAgfCA5RiA3NyA2MyA0MSA2MSA4NSA1RSBDMCB8IGRvdWJsZSAgICAgICB8IDB4QzA1RTg1NjE0MTYzNzc5RiAoLTEyMi4wODQpICB8IHN0cnVjdCBmaWVsZCBgQW5ub3RhdGVkQmluYXJ5LkxvY2F0aW9uLmxvbmdpdHVkZWAgKERvdWJsZSkKKyAgKzB4MDE1OCB8IDhGIDM1IDIzIDgzIERDIDM1IDRCIEMwIHwgZG91YmxlICAgICAgIHwgMHhDMDRCMzVEQzgzMjMzNThGICgtNTQuNDIwOCkgIHwgc3RydWN0IGZpZWxkIGBBbm5vdGF0ZWRCaW5hcnkuTG9jYXRpb24ubGF0aXR1ZGVgIChEb3VibGUpCisgICsweDAxNjAgfCBGNiA5NyBERCA5MyA4NyBDNSAwQSA0MCB8IGRvdWJsZSAgICAgICB8IDB4NDAwQUM1ODc5M0REOTdGNiAoMy4zNDY0NSkgICB8IHN0cnVjdCBmaWVsZCBgQW5ub3RhdGVkQmluYXJ5LkxvY2F0aW9uLmxvbmdpdHVkZWAgKERvdWJsZSkKKworcGFkZGluZzoKKyAgKzB4MDE2OCB8IDAwIDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDhfdFs0XSAgIHwgLi4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgcGFkZGluZworCit2ZWN0b3IgKEFubm90YXRlZEJpbmFyeS5Gb28ubmFtZXMpOgorICArMHgwMTZDIHwgMDMgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICAgfCAweDAwMDAwMDAzICgzKSAgICAgICAgICAgICAgICAgfCBsZW5ndGggb2YgdmVjdG9yICgjIGl0ZW1zKQorICArMHgwMTcwIHwgMjAgMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICAgfCAweDAwMDAwMDIwICgzMikgTG9jOiArMHgwMTkwICAgfCBvZmZzZXQgdG8gc3RyaW5nWzBdCisgICsweDAxNzQgfCAxNCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgICB8IDB4MDAwMDAwMTQgKDIwKSBMb2M6ICsweDAxODggICB8IG9mZnNldCB0byBzdHJpbmdbMV0KKyAgKzB4MDE3OCB8IDA0IDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgIHwgMHgwMDAwMDAwNCAoNCkgTG9jOiArMHgwMTdDICAgIHwgb2Zmc2V0IHRvIHN0cmluZ1syXQorCitzdHJpbmcgKEFubm90YXRlZEJpbmFyeS5Gb28ubmFtZXMpOgorICArMHgwMTdDIHwgMDcgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICAgfCAweDAwMDAwMDA3ICg3KSAgICAgICAgICAgICAgICAgfCBsZW5ndGggb2Ygc3RyaW5nCisgICsweDAxODAgfCA2MyA2OCA2MSA3MiA2QyA2OSA2NSAgICB8IGNoYXJbN10gICAgICB8IGNoYXJsaWUgICAgICAgICAgICAgICAgICAgICAgICB8IHN0cmluZyBsaXRlcmFsCisgICsweDAxODcgfCAwMCAgICAgICAgICAgICAgICAgICAgICB8IGNoYXIgICAgICAgICB8IDB4MDAgKDApICAgICAgICAgICAgICAgICAgICAgICB8IHN0cmluZyB0ZXJtaW5hdG9yCisKK3N0cmluZyAoQW5ub3RhdGVkQmluYXJ5LkZvby5uYW1lcyk6CisgICsweDAxODggfCAwMyAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgICB8IDB4MDAwMDAwMDMgKDMpICAgICAgICAgICAgICAgICB8IGxlbmd0aCBvZiBzdHJpbmcKKyAgKzB4MDE4QyB8IDYyIDZGIDYyICAgICAgICAgICAgICAgIHwgY2hhclszXSAgICAgIHwgYm9iICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nIGxpdGVyYWwKKyAgKzB4MDE4RiB8IDAwICAgICAgICAgICAgICAgICAgICAgIHwgY2hhciAgICAgICAgIHwgMHgwMCAoMCkgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nIHRlcm1pbmF0b3IKKworc3RyaW5nIChBbm5vdGF0ZWRCaW5hcnkuRm9vLm5hbWVzKToKKyAgKzB4MDE5MCB8IDA1IDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgIHwgMHgwMDAwMDAwNSAoNSkgICAgICAgICAgICAgICAgIHwgbGVuZ3RoIG9mIHN0cmluZworICArMHgwMTk0IHwgNjEgNkMgNjkgNjMgNjUgICAgICAgICAgfCBjaGFyWzVdICAgICAgfCBhbGljZSAgICAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJpbmcgbGl0ZXJhbAorICArMHgwMTk5IHwgMDAgICAgICAgICAgICAgICAgICAgICAgfCBjaGFyICAgICAgICAgfCAweDAwICgwKSAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJpbmcgdGVybWluYXRvcgorCitwYWRkaW5nOgorICArMHgwMTlBIHwgMDAgMDAgICAgICAgICAgICAgICAgICAgfCB1aW50OF90WzJdICAgfCAuLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBwYWRkaW5nCisKK3N0cmluZyAoQW5ub3RhdGVkQmluYXJ5LkZvby5hbGljZSk6CisgICsweDAxOUMgfCAwNyAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgICB8IDB4MDAwMDAwMDcgKDcpICAgICAgICAgICAgICAgICB8IGxlbmd0aCBvZiBzdHJpbmcKKyAgKzB4MDFBMCB8IDYzIDY4IDYxIDcyIDZDIDY5IDY1ICAgIHwgY2hhcls3XSAgICAgIHwgY2hhcmxpZSAgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nIGxpdGVyYWwKKyAgKzB4MDFBNyB8IDAwICAgICAgICAgICAgICAgICAgICAgIHwgY2hhciAgICAgICAgIHwgMHgwMCAoMCkgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nIHRlcm1pbmF0b3IKKworc3RyaW5nIChBbm5vdGF0ZWRCaW5hcnkuRm9vLmJvYik6CisgICsweDAxQTggfCAwNyAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgICB8IDB4MDAwMDAwMDcgKDcpICAgICAgICAgICAgICAgICB8IGxlbmd0aCBvZiBzdHJpbmcKKyAgKzB4MDFBQyB8IDYzIDY4IDYxIDcyIDZDIDY5IDY1ICAgIHwgY2hhcls3XSAgICAgIHwgY2hhcmxpZSAgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nIGxpdGVyYWwKKyAgKzB4MDFCMyB8IDAwICAgICAgICAgICAgICAgICAgICAgIHwgY2hhciAgICAgICAgIHwgMHgwMCAoMCkgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nIHRlcm1pbmF0b3IKKwordmVjdG9yIChBbm5vdGF0ZWRCaW5hcnkuRm9vLmFjY291bnRzKToKKyAgKzB4MDFCNCB8IDA5IDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgIHwgMHgwMDAwMDAwOSAoOSkgICAgICAgICAgICAgICAgIHwgbGVuZ3RoIG9mIHZlY3RvciAoIyBpdGVtcykKKyAgKzB4MDFCOCB8IDA5IDAwICAgICAgICAgICAgICAgICAgIHwgdWludDE2X3QgICAgIHwgMHgwMDA5ICg5KSAgICAgICAgICAgICAgICAgICAgIHwgdmFsdWVbMF0KKyAgKzB4MDFCQSB8IDA4IDAwICAgICAgICAgICAgICAgICAgIHwgdWludDE2X3QgICAgIHwgMHgwMDA4ICg4KSAgICAgICAgICAgICAgICAgICAgIHwgdmFsdWVbMV0KKyAgKzB4MDFCQyB8IDA3IDAwICAgICAgICAgICAgICAgICAgIHwgdWludDE2X3QgICAgIHwgMHgwMDA3ICg3KSAgICAgICAgICAgICAgICAgICAgIHwgdmFsdWVbMl0KKyAgKzB4MDFCRSB8IDAxIDAwICAgICAgICAgICAgICAgICAgIHwgdWludDE2X3QgICAgIHwgMHgwMDAxICgxKSAgICAgICAgICAgICAgICAgICAgIHwgdmFsdWVbM10KKyAgKzB4MDFDMCB8IDAyIDAwICAgICAgICAgICAgICAgICAgIHwgdWludDE2X3QgICAgIHwgMHgwMDAyICgyKSAgICAgICAgICAgICAgICAgICAgIHwgdmFsdWVbNF0KKyAgKzB4MDFDMiB8IDAzIDAwICAgICAgICAgICAgICAgICAgIHwgdWludDE2X3QgICAgIHwgMHgwMDAzICgzKSAgICAgICAgICAgICAgICAgICAgIHwgdmFsdWVbNV0KKyAgKzB4MDFDNCB8IDA2IDAwICAgICAgICAgICAgICAgICAgIHwgdWludDE2X3QgICAgIHwgMHgwMDA2ICg2KSAgICAgICAgICAgICAgICAgICAgIHwgdmFsdWVbNl0KKyAgKzB4MDFDNiB8IDA1IDAwICAgICAgICAgICAgICAgICAgIHwgdWludDE2X3QgICAgIHwgMHgwMDA1ICg1KSAgICAgICAgICAgICAgICAgICAgIHwgdmFsdWVbN10KKyAgKzB4MDFDOCB8IDA0IDAwICAgICAgICAgICAgICAgICAgIHwgdWludDE2X3QgICAgIHwgMHgwMDA0ICg0KSAgICAgICAgICAgICAgICAgICAgIHwgdmFsdWVbOF0KKworcGFkZGluZzoKKyAgKzB4MDFDQSB8IDAwIDAwICAgICAgICAgICAgICAgICAgIHwgdWludDhfdFsyXSAgIHwgLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgcGFkZGluZworCit0YWJsZSAoQW5ub3RhdGVkQmluYXJ5LkJheik6CisgICsweDAxQ0MgfCAzQSBGRiBGRiBGRiAgICAgICAgICAgICB8IFNPZmZzZXQzMiAgICB8IDB4RkZGRkZGM0EgKC0xOTgpIExvYzogKzB4MDI5MiB8IG9mZnNldCB0byB2dGFibGUKKyAgKzB4MDFEMCB8IDAwIDAwIDAwICAgICAgICAgICAgICAgIHwgdWludDhfdFszXSAgIHwgLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgcGFkZGluZworICArMHgwMUQzIHwgMDMgICAgICAgICAgICAgICAgICAgICAgfCB1aW50OF90ICAgICAgfCAweDAzICgzKSAgICAgICAgICAgICAgICAgICAgICAgfCB0YWJsZSBmaWVsZCBgbWVhbGAgKEJ5dGUpCisKK3ZlY3RvciAoQW5ub3RhdGVkQmluYXJ5LkZvby5iYXJzKToKKyAgKzB4MDFENCB8IDAyIDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgIHwgMHgwMDAwMDAwMiAoMikgICAgICAgICAgICAgICAgIHwgbGVuZ3RoIG9mIHZlY3RvciAoIyBpdGVtcykKKyAgKzB4MDFEOCB8IDQ0IDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgIHwgMHgwMDAwMDA0NCAoNjgpIExvYzogKzB4MDIxQyAgIHwgb2Zmc2V0IHRvIHRhYmxlWzBdCisgICsweDAxREMgfCAxMCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgICB8IDB4MDAwMDAwMTAgKDE2KSBMb2M6ICsweDAxRUMgICB8IG9mZnNldCB0byB0YWJsZVsxXQorCitwYWRkaW5nOgorICArMHgwMUUwIHwgMDAgMDAgICAgICAgICAgICAgICAgICAgfCB1aW50OF90WzJdICAgfCAuLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBwYWRkaW5nCisKK3Z0YWJsZSAoQW5ub3RhdGVkQmluYXJ5LkJhcik6CisgICsweDAxRTIgfCAwQSAwMCAgICAgICAgICAgICAgICAgICB8IHVpbnQxNl90ICAgICB8IDB4MDAwQSAoMTApICAgICAgICAgICAgICAgICAgICB8IHNpemUgb2YgdGhpcyB2dGFibGUKKyAgKzB4MDFFNCB8IDFBIDAwICAgICAgICAgICAgICAgICAgIHwgdWludDE2X3QgICAgIHwgMHgwMDFBICgyNikgICAgICAgICAgICAgICAgICAgIHwgc2l6ZSBvZiByZWZlcnJpbmcgdGFibGUKKyAgKzB4MDFFNiB8IDBDIDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgIHwgMHgwMDBDICgxMikgICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBhYCAoaWQ6IDApCisgICsweDAxRTggfCAwNCAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgICB8IDB4MDAwNCAoNCkgICAgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgYmAgKGlkOiAxKQorICArMHgwMUVBIHwgMDggMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgICAgfCAweDAwMDggKDgpICAgICAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYGNgIChpZDogMikKKwordGFibGUgKEFubm90YXRlZEJpbmFyeS5CYXIpOgorICArMHgwMUVDIHwgMEEgMDAgMDAgMDAgICAgICAgICAgICAgfCBTT2Zmc2V0MzIgICAgfCAweDAwMDAwMDBBICgxMCkgTG9jOiArMHgwMUUyICAgfCBvZmZzZXQgdG8gdnRhYmxlCisgICsweDAxRjAgfCAwMCA4MCAyMyA0NCAgICAgICAgICAgICB8IGZsb2F0ICAgICAgICB8IDB4NDQyMzgwMDAgKDY1NCkgICAgICAgICAgICAgICB8IHRhYmxlIGZpZWxkIGBiYCAoRmxvYXQpCisgICsweDAxRjQgfCAxOCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgICB8IDB4MDAwMDAwMTggKDI0KSBMb2M6ICsweDAyMEMgICB8IG9mZnNldCB0byBmaWVsZCBgY2AgKHRhYmxlKQorICArMHgwMUY4IHwgMDAgMDAgMDAgMDAgMDAgRDggOEUgNDAgfCBkb3VibGUgICAgICAgfCAweDQwOEVEODAwMDAwMDAwMDAgKDk4NykgICAgICAgfCB0YWJsZSBmaWVsZCBgYWAgKERvdWJsZSkKKyAgKzB4MDIwMCB8IDAwIDAwIDAwIDAwIDAwIDAwICAgICAgIHwgdWludDhfdFs2XSAgIHwgLi4uLi4uICAgICAgICAgICAgICAgICAgICAgICAgIHwgcGFkZGluZworCit2dGFibGUgKEFubm90YXRlZEJpbmFyeS5CYXopOgorICArMHgwMjA2IHwgMDYgMDAgICAgICAgICAgICAgICAgICAgfCB1aW50MTZfdCAgICAgfCAweDAwMDYgKDYpICAgICAgICAgICAgICAgICAgICAgfCBzaXplIG9mIHRoaXMgdnRhYmxlCisgICsweDAyMDggfCAwNiAwMCAgICAgICAgICAgICAgICAgICB8IHVpbnQxNl90ICAgICB8IDB4MDAwNiAoNikgICAgICAgICAgICAgICAgICAgICB8IHNpemUgb2YgcmVmZXJyaW5nIHRhYmxlCisgICsweDAyMEEgfCAwNSAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgICB8IDB4MDAwNSAoNSkgICAgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgbWVhbGAgKGlkOiAwKQorCit0YWJsZSAoQW5ub3RhdGVkQmluYXJ5LkJheik6CisgICsweDAyMEMgfCAwNiAwMCAwMCAwMCAgICAgICAgICAgICB8IFNPZmZzZXQzMiAgICB8IDB4MDAwMDAwMDYgKDYpIExvYzogKzB4MDIwNiAgICB8IG9mZnNldCB0byB2dGFibGUKKyAgKzB4MDIxMCB8IDAwICAgICAgICAgICAgICAgICAgICAgIHwgdWludDhfdFsxXSAgIHwgLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgcGFkZGluZworICArMHgwMjExIHwgMDMgICAgICAgICAgICAgICAgICAgICAgfCB1aW50OF90ICAgICAgfCAweDAzICgzKSAgICAgICAgICAgICAgICAgICAgICAgfCB0YWJsZSBmaWVsZCBgbWVhbGAgKEJ5dGUpCisKK3Z0YWJsZSAoQW5ub3RhdGVkQmluYXJ5LkJhcik6CisgICsweDAyMTIgfCAwQSAwMCAgICAgICAgICAgICAgICAgICB8IHVpbnQxNl90ICAgICB8IDB4MDAwQSAoMTApICAgICAgICAgICAgICAgICAgICB8IHNpemUgb2YgdGhpcyB2dGFibGUKKyAgKzB4MDIxNCB8IDE4IDAwICAgICAgICAgICAgICAgICAgIHwgdWludDE2X3QgICAgIHwgMHgwMDE4ICgyNCkgICAgICAgICAgICAgICAgICAgIHwgc2l6ZSBvZiByZWZlcnJpbmcgdGFibGUKKyAgKzB4MDIxNiB8IDBDIDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgIHwgMHgwMDBDICgxMikgICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBhYCAoaWQ6IDApCisgICsweDAyMTggfCAwNCAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgICB8IDB4MDAwNCAoNCkgICAgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgYmAgKGlkOiAxKQorICArMHgwMjFBIHwgMDggMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgICAgfCAweDAwMDggKDgpICAgICAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYGNgIChpZDogMikKKwordGFibGUgKEFubm90YXRlZEJpbmFyeS5CYXIpOgorICArMHgwMjFDIHwgMEEgMDAgMDAgMDAgICAgICAgICAgICAgfCBTT2Zmc2V0MzIgICAgfCAweDAwMDAwMDBBICgxMCkgTG9jOiArMHgwMjEyICAgfCBvZmZzZXQgdG8gdnRhYmxlCisgICsweDAyMjAgfCAwMCAwMCBFNCA0MyAgICAgICAgICAgICB8IGZsb2F0ICAgICAgICB8IDB4NDNFNDAwMDAgKDQ1NikgICAgICAgICAgICAgICB8IHRhYmxlIGZpZWxkIGBiYCAoRmxvYXQpCisgICsweDAyMjQgfCAxMCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgICB8IDB4MDAwMDAwMTAgKDE2KSBMb2M6ICsweDAyMzQgICB8IG9mZnNldCB0byBmaWVsZCBgY2AgKHRhYmxlKQorICArMHgwMjI4IHwgMDAgMDAgMDAgMDAgMDAgQzAgNUUgNDAgfCBkb3VibGUgICAgICAgfCAweDQwNUVDMDAwMDAwMDAwMDAgKDEyMykgICAgICAgfCB0YWJsZSBmaWVsZCBgYWAgKERvdWJsZSkKKyAgKzB4MDIzMCB8IDAwIDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDhfdFs0XSAgIHwgLi4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgcGFkZGluZworCit0YWJsZSAoQW5ub3RhdGVkQmluYXJ5LkJheik6CisgICsweDAyMzQgfCBBMiBGRiBGRiBGRiAgICAgICAgICAgICB8IFNPZmZzZXQzMiAgICB8IDB4RkZGRkZGQTIgKC05NCkgTG9jOiArMHgwMjkyICB8IG9mZnNldCB0byB2dGFibGUKKyAgKzB4MDIzOCB8IDAwIDAwIDAwICAgICAgICAgICAgICAgIHwgdWludDhfdFszXSAgIHwgLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgcGFkZGluZworICArMHgwMjNCIHwgMDEgICAgICAgICAgICAgICAgICAgICAgfCB1aW50OF90ICAgICAgfCAweDAxICgxKSAgICAgICAgICAgICAgICAgICAgICAgfCB0YWJsZSBmaWVsZCBgbWVhbGAgKEJ5dGUpCisKK3N0cmluZyAoQW5ub3RhdGVkQmluYXJ5LkZvby5uYW1lKToKKyAgKzB4MDIzQyB8IDJGIDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgIHwgMHgwMDAwMDAyRiAoNDcpICAgICAgICAgICAgICAgIHwgbGVuZ3RoIG9mIHN0cmluZworICArMHgwMjQwIHwgNTQgNjggNjkgNzMgMjAgNjkgNzMgMjAgfCBjaGFyWzQ3XSAgICAgfCBUaGlzIGlzICAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJpbmcgbGl0ZXJhbAorICArMHgwMjQ4IHwgNjEgMjAgNkMgNkYgNkUgNjcgMjAgNzMgfCAgICAgICAgICAgICAgfCBhIGxvbmcgcworICArMHgwMjUwIHwgNzQgNzIgNjkgNkUgNjcgMjAgNzQgNkYgfCAgICAgICAgICAgICAgfCB0cmluZyB0bworICArMHgwMjU4IHwgMjAgNzMgNjggNkYgNzcgMjAgNjggNkYgfCAgICAgICAgICAgICAgfCAgc2hvdyBobworICArMHgwMjYwIHwgNzcgMjAgNjkgNzQgMjAgNjIgNzIgNjUgfCAgICAgICAgICAgICAgfCB3IGl0IGJyZQorICArMHgwMjY4IHwgNjEgNkIgNzMgMjAgNzUgNzAgMkUgICAgfCAgICAgICAgICAgICAgfCBha3MgdXAuCisgICsweDAyNkYgfCAwMCAgICAgICAgICAgICAgICAgICAgICB8IGNoYXIgICAgICAgICB8IDB4MDAgKDApICAgICAgICAgICAgICAgICAgICAgICB8IHN0cmluZyB0ZXJtaW5hdG9yCisKK3Vua25vd24gKG5vIGtub3duIHJlZmVyZW5jZXMpOgorICArMHgwMjcwIHwgMDAgMDAgMEEgMDAgMTYgMDAgMEMgMDAgfCA/dWludDhfdFszNF0gfCAuLi4uLi4uLiAgICAgICAgICAgICAgICAgICAgICAgfCBXQVJOOiBub3RoaW5nIHJlZmVycyB0byB0aGlzIHNlY3Rpb24uCisgICsweDAyNzggfCAwNCAwMCAwOCAwMCAwQSAwMCAwMCAwMCB8ICAgICAgICAgICAgICB8IC4uLi4uLi4uCisgICsweDAyODAgfCA2NSAyMCA3MSA0OSAxNCAwMCAwMCAwMCB8ICAgICAgICAgICAgICB8IGUgcUkuLi4uCisgICsweDAyODggfCBDOSA3NiBCRSA5RiAwQyAyNCBGRSA0MCB8ICAgICAgICAgICAgICB8IC52Li4uJC5ACisgICsweDAyOTAgfCAwMCAwMCAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICB8IC4uCisKK3Z0YWJsZSAoQW5ub3RhdGVkQmluYXJ5LkJheik6CisgICsweDAyOTIgfCAwNiAwMCAgICAgICAgICAgICAgICAgICB8IHVpbnQxNl90ICAgICB8IDB4MDAwNiAoNikgICAgICAgICAgICAgICAgICAgICB8IHNpemUgb2YgdGhpcyB2dGFibGUKKyAgKzB4MDI5NCB8IDA4IDAwICAgICAgICAgICAgICAgICAgIHwgdWludDE2X3QgICAgIHwgMHgwMDA4ICg4KSAgICAgICAgICAgICAgICAgICAgIHwgc2l6ZSBvZiByZWZlcnJpbmcgdGFibGUKKyAgKzB4MDI5NiB8IDA3IDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgIHwgMHgwMDA3ICg3KSAgICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBtZWFsYCAoaWQ6IDApCisKK3Vua25vd24gKG5vIGtub3duIHJlZmVyZW5jZXMpOgorICArMHgwMjk4IHwgMDYgMDAgMDAgMDAgMDAgMDAgMDAgMDEgfCA/dWludDhfdFs4XSAgfCAuLi4uLi4uLiAgICAgICAgICAgICAgICAgICAgICAgfCBXQVJOOiBub3RoaW5nIHJlZmVycyB0byB0aGlzIHNlY3Rpb24uCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9hbm5vdGF0ZWRfYmluYXJ5L3Rlc3RzL2ludmFsaWRfdnRhYmxlX2ZpZWxkX29mZnNldC5iaW4gYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9hbm5vdGF0ZWRfYmluYXJ5L3Rlc3RzL2ludmFsaWRfdnRhYmxlX2ZpZWxkX29mZnNldC5iaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTMyY2U1YgotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL2Fubm90YXRlZF9iaW5hcnkvdGVzdHMvaW52YWxpZF92dGFibGVfZmllbGRfb2Zmc2V0LmJpbgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9hbm5vdGF0ZWRfYmluYXJ5L3Rlc3RzL2ludmFsaWRfdnRhYmxlX3JlZl90YWJsZV9zaXplLmFmYiBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL2Fubm90YXRlZF9iaW5hcnkvdGVzdHMvaW52YWxpZF92dGFibGVfcmVmX3RhYmxlX3NpemUuYWZiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUyMzhlOWQKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9hbm5vdGF0ZWRfYmluYXJ5L3Rlc3RzL2ludmFsaWRfdnRhYmxlX3JlZl90YWJsZV9zaXplLmFmYgpAQCAtMCwwICsxLDM2MCBAQAorLy8gQW5ub3RhdGVkIEZsYXRidWZmZXIgQmluYXJ5CisvLworLy8gU2NoZW1hIGZpbGU6IGFubm90YXRlZF9iaW5hcnkuZmJzCisvLyBCaW5hcnkgZmlsZTogdGVzdHMvaW52YWxpZF92dGFibGVfcmVmX3RhYmxlX3NpemUuYmluCisKK2hlYWRlcjoKKyAgKzB4MDAwMCB8IDQ0IDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgIHwgMHgwMDAwMDA0NCAoNjgpIExvYzogKzB4MDA0NCAgIHwgb2Zmc2V0IHRvIHJvb3QgdGFibGUgYEFubm90YXRlZEJpbmFyeS5Gb29gCisgICsweDAwMDQgfCA0MSA0RSA0RSA0RiAgICAgICAgICAgICB8IGNoYXJbNF0gICAgICB8IEFOTk8gICAgICAgICAgICAgICAgICAgICAgICAgICB8IEZpbGUgSWRlbnRpZmllcgorCitwYWRkaW5nOgorICArMHgwMDA4IHwgMDAgMDAgICAgICAgICAgICAgICAgICAgfCB1aW50OF90WzJdICAgfCAuLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBwYWRkaW5nCisKK3Z0YWJsZSAoQW5ub3RhdGVkQmluYXJ5LkZvbyk6CisgICsweDAwMEEgfCAzQSAwMCAgICAgICAgICAgICAgICAgICB8IHVpbnQxNl90ICAgICB8IDB4MDAzQSAoNTgpICAgICAgICAgICAgICAgICAgICB8IHNpemUgb2YgdGhpcyB2dGFibGUKKyAgKzB4MDAwQyB8IEZGIEZGICAgICAgICAgICAgICAgICAgIHwgdWludDE2X3QgICAgIHwgMHhGRkZGICg2NTUzNSkgICAgICAgICAgICAgICAgIHwgRVJST1I6IHNpemUgb2YgcmVmZXJyaW5nIHRhYmxlLiBMb25nZXIgdGhhbiB0aGUgYmluYXJ5LgorICArMHgwMDBFIHwgMEMgMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgICAgfCAweDAwMEMgKDEyKSAgICAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYGNvdW50ZXJgIChpZDogMCkKKyAgKzB4MDAxMCB8IDA3IDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgIHwgMHgwMDA3ICg3KSAgICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBoZWFsdGh5YCAoaWQ6IDEpCisgICsweDAwMTIgfCAwMCAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgICB8IDB4MDAwMCAoMCkgICAgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgbGV2ZWxgIChpZDogMikgPGRlZmF1bHRzIHRvIDk5PiAoTG9uZykKKyAgKzB4MDAxNCB8IDA4IDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgIHwgMHgwMDA4ICg4KSAgICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBtZWFsYCAoaWQ6IDMpCisgICsweDAwMTYgfCAxMCAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgICB8IDB4MDAxMCAoMTYpICAgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgYmFyYCAoaWQ6IDQpCisgICsweDAwMTggfCAxNCAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgICB8IDB4MDAxNCAoMjApICAgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgaG9tZWAgKGlkOiA1KQorICArMHgwMDFBIHwgMzAgMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgICAgfCAweDAwMzAgKDQ4KSAgICAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYG5hbWVgIChpZDogNikKKyAgKzB4MDAxQyB8IDM0IDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgIHwgMHgwMDM0ICg1MikgICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBiYXJzYCAoaWQ6IDcpCisgICsweDAwMUUgfCAwOSAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgICB8IDB4MDAwOSAoOSkgICAgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgYmFyX2Jhel90eXBlYCAoaWQ6IDgpCisgICsweDAwMjAgfCAzOCAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgICB8IDB4MDAzOCAoNTYpICAgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgYmFyX2JhemAgKGlkOiA5KQorICArMHgwMDIyIHwgM0MgMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgICAgfCAweDAwM0MgKDYwKSAgICAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYGFjY291bnRzYCAoaWQ6IDEwKQorICArMHgwMDI0IHwgNDAgMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgICAgfCAweDAwNDAgKDY0KSAgICAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYGJvYmAgKGlkOiAxMSkKKyAgKzB4MDAyNiB8IDQ0IDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgIHwgMHgwMDQ0ICg2OCkgICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBhbGljZWAgKGlkOiAxMikKKyAgKzB4MDAyOCB8IDAwIDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgIHwgMHgwMDAwICgwKSAgICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBtYXliZV9pMzJgIChpZDogMTMpIDxkZWZhdWx0cyB0byAwPiAoSW50KQorICArMHgwMDJBIHwgMDAgMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgICAgfCAweDAwMDAgKDApICAgICAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYGRlZmF1bHRfaTMyYCAoaWQ6IDE0KSA8ZGVmYXVsdHMgdG8gNDI+IChJbnQpCisgICsweDAwMkMgfCA0OCAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgICB8IDB4MDA0OCAoNzIpICAgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBganVzdF9pMzJgIChpZDogMTUpCisgICsweDAwMkUgfCA0QyAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgICB8IDB4MDA0QyAoNzYpICAgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgbmFtZXNgIChpZDogMTYpCisgICsweDAwMzAgfCA1MCAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgICB8IDB4MDA1MCAoODApICAgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgcG9pbnRzX29mX2ludGVyZXN0YCAoaWQ6IDE3KQorICArMHgwMDMyIHwgNTQgMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgICAgfCAweDAwNTQgKDg0KSAgICAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYGZvb2JhcnNfdHlwZWAgKGlkOiAxOCkKKyAgKzB4MDAzNCB8IDU4IDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgIHwgMHgwMDU4ICg4OCkgICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBmb29iYXJzYCAoaWQ6IDE5KQorICArMHgwMDM2IHwgMEEgMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgICAgfCAweDAwMEEgKDEwKSAgICAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYG1lYXN1cmVtZW50X3R5cGVgIChpZDogMjApCisgICsweDAwMzggfCA1QyAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgICB8IDB4MDA1QyAoOTIpICAgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgbWVhc3VyZW1lbnRgIChpZDogMjEpCisgICsweDAwM0EgfCAwQiAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgICB8IDB4MDAwQiAoMTEpICAgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgYW55dGhpbmdfdHlwZWAgKGlkOiAyMikKKyAgKzB4MDAzQyB8IDYwIDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgIHwgMHgwMDYwICg5NikgICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBhbnl0aGluZ2AgKGlkOiAyMykKKyAgKzB4MDAzRSB8IDAwIDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgIHwgMHgwMDAwICgwKSAgICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGB0ZW1wZXJhdHVyZWAgKGlkOiAyNCkgPGRlZmF1bHRzIHRvIDk4LjYwMDAwMD4gKEZsb2F0KQorICArMHgwMDQwIHwgMDAgMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgICAgfCAweDAwMDAgKDApICAgICAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYHRlZXRvdGFsZXJgIChpZDogMjUpIDxudWxsPiAoT2JqKQorICArMHgwMDQyIHwgNjQgMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgICAgfCAweDAwNjQgKDEwMCkgICAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYGNoYXJsaWVgIChpZDogMjYpCisKK3Jvb3RfdGFibGUgKEFubm90YXRlZEJpbmFyeS5Gb28pOgorICArMHgwMDQ0IHwgM0EgMDAgMDAgMDAgICAgICAgICAgICAgfCBTT2Zmc2V0MzIgICAgfCAweDAwMDAwMDNBICg1OCkgTG9jOiArMHgwMDBBICAgfCBvZmZzZXQgdG8gdnRhYmxlCisgICsweDAwNDggfCAwMCAwMCAwMCAgICAgICAgICAgICAgICB8IHVpbnQ4X3RbM10gICB8IC4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHBhZGRpbmcKKyAgKzB4MDA0QiB8IDAxICAgICAgICAgICAgICAgICAgICAgIHwgdWludDhfdCAgICAgIHwgMHgwMSAoMSkgICAgICAgICAgICAgICAgICAgICAgIHwgdGFibGUgZmllbGQgYGhlYWx0aHlgIChCb29sKQorICArMHgwMDRDIHwgMDIgICAgICAgICAgICAgICAgICAgICAgfCB1aW50OF90ICAgICAgfCAweDAyICgyKSAgICAgICAgICAgICAgICAgICAgICAgfCB0YWJsZSBmaWVsZCBgbWVhbGAgKEJ5dGUpCisgICsweDAwNEQgfCAwMiAgICAgICAgICAgICAgICAgICAgICB8IFVUeXBlOCAgICAgICB8IDB4MDIgKDIpICAgICAgICAgICAgICAgICAgICAgICB8IHRhYmxlIGZpZWxkIGBiYXJfYmF6X3R5cGVgIChVVHlwZSkKKyAgKzB4MDA0RSB8IDAxICAgICAgICAgICAgICAgICAgICAgIHwgVVR5cGU4ICAgICAgIHwgMHgwMSAoMSkgICAgICAgICAgICAgICAgICAgICAgIHwgdGFibGUgZmllbGQgYG1lYXN1cmVtZW50X3R5cGVgIChVVHlwZSkKKyAgKzB4MDA0RiB8IDAxICAgICAgICAgICAgICAgICAgICAgIHwgVVR5cGU4ICAgICAgIHwgMHgwMSAoMSkgICAgICAgICAgICAgICAgICAgICAgIHwgdGFibGUgZmllbGQgYGFueXRoaW5nX3R5cGVgIChVVHlwZSkKKyAgKzB4MDA1MCB8IEQyIDA0IDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgIHwgMHgwMDAwMDREMiAoMTIzNCkgICAgICAgICAgICAgIHwgdGFibGUgZmllbGQgYGNvdW50ZXJgIChJbnQpCisgICsweDAwNTQgfCAyOCAwMiAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgICB8IDB4MDAwMDAyMjggKDU1MikgTG9jOiArMHgwMjdDICB8IG9mZnNldCB0byBmaWVsZCBgYmFyYCAodGFibGUpCisgICsweDAwNTggfCAwMSAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgICB8IDB4MDAwMDAwMDEgKDEpICAgICAgICAgICAgICAgICB8IHN0cnVjdCBmaWVsZCBgQW5ub3RhdGVkQmluYXJ5LkJ1aWxkaW5nLmZsb29yc2AgKEludCkKKyAgKzB4MDA1QyB8IDAyIDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgIHwgMHgwMDAwMDAwMiAoMikgICAgICAgICAgICAgICAgIHwgc3RydWN0IGZpZWxkIGBBbm5vdGF0ZWRCaW5hcnkuQnVpbGRpbmcuZG9vcnNgIChJbnQpCisgICsweDAwNjAgfCAwQyAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgICB8IDB4MDAwMDAwMEMgKDEyKSAgICAgICAgICAgICAgICB8IHN0cnVjdCBmaWVsZCBgQW5ub3RhdGVkQmluYXJ5LkJ1aWxkaW5nLndpbmRvd3NgIChJbnQpCisgICsweDAwNjQgfCAwQSAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgICB8IDB4MDAwMDAwMEEgKDEwKSAgICAgICAgICAgICAgICB8IGFycmF5IGZpZWxkIGBBbm5vdGF0ZWRCaW5hcnkuRGltZW5zaW9uLnZhbHVlc2BbMF0gKEludCkKKyAgKzB4MDA2OCB8IDBDIDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgIHwgMHgwMDAwMDAwQyAoMTIpICAgICAgICAgICAgICAgIHwgYXJyYXkgZmllbGQgYEFubm90YXRlZEJpbmFyeS5EaW1lbnNpb24udmFsdWVzYFsxXSAoSW50KQorICArMHgwMDZDIHwgMTQgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICAgfCAweDAwMDAwMDE0ICgyMCkgICAgICAgICAgICAgICAgfCBhcnJheSBmaWVsZCBgQW5ub3RhdGVkQmluYXJ5LkRpbWVuc2lvbi52YWx1ZXNgWzJdIChJbnQpCisgICsweDAwNzAgfCAwMSAgICAgICAgICAgICAgICAgICAgICB8IHVpbnQ4X3QgICAgICB8IDB4MDEgKDEpICAgICAgICAgICAgICAgICAgICAgICB8IHN0cnVjdCBmaWVsZCBgQW5ub3RhdGVkQmluYXJ5LlRvbGVyYW5jZS53aWR0aGAgKFVCeXRlKQorICArMHgwMDcxIHwgMDIgICAgICAgICAgICAgICAgICAgICAgfCB1aW50OF90ICAgICAgfCAweDAyICgyKSAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJ1Y3QgZmllbGQgYEFubm90YXRlZEJpbmFyeS5Ub2xlcmFuY2Uud2lkdGhgIChVQnl0ZSkKKyAgKzB4MDA3MiB8IDAzICAgICAgICAgICAgICAgICAgICAgIHwgdWludDhfdCAgICAgIHwgMHgwMyAoMykgICAgICAgICAgICAgICAgICAgICAgIHwgc3RydWN0IGZpZWxkIGBBbm5vdGF0ZWRCaW5hcnkuVG9sZXJhbmNlLndpZHRoYCAoVUJ5dGUpCisgICsweDAwNzMgfCAwMCAgICAgICAgICAgICAgICAgICAgICB8IHVpbnQ4X3RbMV0gICB8IC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHBhZGRpbmcKKyAgKzB4MDA3NCB8IEM4IDAxIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgIHwgMHgwMDAwMDFDOCAoNDU2KSBMb2M6ICsweDAyM0MgIHwgb2Zmc2V0IHRvIGZpZWxkIGBuYW1lYCAoc3RyaW5nKQorICArMHgwMDc4IHwgNUMgMDEgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICAgfCAweDAwMDAwMTVDICgzNDgpIExvYzogKzB4MDFENCAgfCBvZmZzZXQgdG8gZmllbGQgYGJhcnNgICh2ZWN0b3IpCisgICsweDAwN0MgfCA1MCAwMSAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgICB8IDB4MDAwMDAxNTAgKDMzNikgTG9jOiArMHgwMUNDICB8IG9mZnNldCB0byBmaWVsZCBgYmFyX2JhemAgKHVuaW9uIG9mIHR5cGUgYEJhemApCisgICsweDAwODAgfCAzNCAwMSAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgICB8IDB4MDAwMDAxMzQgKDMwOCkgTG9jOiArMHgwMUI0ICB8IG9mZnNldCB0byBmaWVsZCBgYWNjb3VudHNgICh2ZWN0b3IpCisgICsweDAwODQgfCAyNCAwMSAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgICB8IDB4MDAwMDAxMjQgKDI5MikgTG9jOiArMHgwMUE4ICB8IG9mZnNldCB0byBmaWVsZCBgYm9iYCAoc3RyaW5nKQorICArMHgwMDg4IHwgMTQgMDEgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICAgfCAweDAwMDAwMTE0ICgyNzYpIExvYzogKzB4MDE5QyAgfCBvZmZzZXQgdG8gZmllbGQgYGFsaWNlYCAoc3RyaW5nKQorICArMHgwMDhDIHwgMEQgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICAgfCAweDAwMDAwMDBEICgxMykgICAgICAgICAgICAgICAgfCB0YWJsZSBmaWVsZCBganVzdF9pMzJgIChJbnQpCisgICsweDAwOTAgfCBEQyAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgICB8IDB4MDAwMDAwREMgKDIyMCkgTG9jOiArMHgwMTZDICB8IG9mZnNldCB0byBmaWVsZCBgbmFtZXNgICh2ZWN0b3IpCisgICsweDAwOTQgfCBBMCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgICB8IDB4MDAwMDAwQTAgKDE2MCkgTG9jOiArMHgwMTM0ICB8IG9mZnNldCB0byBmaWVsZCBgcG9pbnRzX29mX2ludGVyZXN0YCAodmVjdG9yKQorICArMHgwMDk4IHwgOTQgMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICAgfCAweDAwMDAwMDk0ICgxNDgpIExvYzogKzB4MDEyQyAgfCBvZmZzZXQgdG8gZmllbGQgYGZvb2JhcnNfdHlwZWAgKHZlY3RvcikKKyAgKzB4MDA5QyB8IDM4IDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgIHwgMHgwMDAwMDAzOCAoNTYpIExvYzogKzB4MDBENCAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBmb29iYXJzYCAodmVjdG9yKQorICArMHgwMEEwIHwgMzMgMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICAgfCAweDAwMDAwMDMzICg1MSkgTG9jOiArMHgwMEQzICAgfCBvZmZzZXQgdG8gZmllbGQgYG1lYXN1cmVtZW50YCAodW5pb24gb2YgdHlwZSBgVG9sZXJhbmNlYCkKKyAgKzB4MDBBNCB8IDFDIDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgIHwgMHgwMDAwMDAxQyAoMjgpIExvYzogKzB4MDBDMCAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBhbnl0aGluZ2AgKHVuaW9uIG9mIHR5cGUgYEJhcmApCisgICsweDAwQTggfCAwNCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgICB8IDB4MDAwMDAwMDQgKDQpIExvYzogKzB4MDBBQyAgICB8IG9mZnNldCB0byBmaWVsZCBgY2hhcmxpZWAgKHN0cmluZykKKyAgKzB4MDBBQyB8IDA1IDAwIDAwIDAwIDYxIDZDIDY5IDYzIHwgdWludDhfdFs1MDBdIHwgLi4uLmFsaWMgICAgICAgICAgICAgICAgICAgICAgIHwgcGFkZGluZworICArMHgwMEI0IHwgNjUgMDAgMDAgMDAgMDggMDAgMTMgMDAgfCAgICAgICAgICAgICAgfCBlLi4uLi4uLgorICArMHgwMEJDIHwgMDggMDAgMDQgMDAgMDggMDAgMDAgMDAgfCAgICAgICAgICAgICAgfCAuLi4uLi4uLgorICArMHgwMEM0IHwgMDAgODAgMjMgNDQgMDAgMDAgMDAgMDAgfCAgICAgICAgICAgICAgfCAuLiNELi4uLgorICArMHgwMENDIHwgMDAgMTAgNzQgNDAgMDAgMDAgMDAgMDUgfCAgICAgICAgICAgICAgfCAuLnRALi4uLgorICArMHgwMEQ0IHwgMDMgMDAgMDAgMDAgMzQgMDAgMDAgMDAgfCAgICAgICAgICAgICAgfCAuLi4uNC4uLgorICArMHgwMERDIHwgMkMgMDAgMDAgMDAgMDQgMDAgMDAgMDAgfCAgICAgICAgICAgICAgfCAsLi4uLi4uLgorICArMHgwMEU0IHwgRDIgRkUgRkYgRkYgMDAgODAgMjMgNDQgfCAgICAgICAgICAgICAgfCAuLi4uLi4jRAorICArMHgwMEVDIHwgMTAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgfCAgICAgICAgICAgICAgfCAuLi4uLi4uLgorICArMHgwMEY0IHwgMDAgRDggOEUgNDAgMDAgMDAgMDAgMDAgfCAgICAgICAgICAgICAgfCAuLi5ALi4uLgorICArMHgwMEZDIHwgNkEgRkUgRkYgRkYgMDAgMDAgMDAgMDMgfCAgICAgICAgICAgICAgfCBqLi4uLi4uLgorICArMHgwMTA0IHwgMDQgMDAgMDQgMDAgMDQgMDAgMDAgMDAgfCAgICAgICAgICAgICAgfCAuLi4uLi4uLgorICArMHgwMTBDIHwgRkEgRkUgRkYgRkYgMDAgMDAgRTQgNDMgfCAgICAgICAgICAgICAgfCAuLi4uLi4uQworICArMHgwMTE0IHwgMTAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgfCAgICAgICAgICAgICAgfCAuLi4uLi4uLgorICArMHgwMTFDIHwgMDAgQzAgNUUgNDAgMDAgMDAgMDAgMDAgfCAgICAgICAgICAgICAgfCAuLl5ALi4uLgorICArMHgwMTI0IHwgOTIgRkUgRkYgRkYgMDAgMDAgMDAgMDEgfCAgICAgICAgICAgICAgfCAuLi4uLi4uLgorICArMHgwMTJDIHwgMDMgMDAgMDAgMDAgMDEgMDIgMDEgMDAgfCAgICAgICAgICAgICAgfCAuLi4uLi4uLgorICArMHgwMTM0IHwgMDMgMDAgMDAgMDAgMzMgMzMgMzMgMzMgfCAgICAgICAgICAgICAgfCAuLi4uMzMzMworICArMHgwMTNDIHwgMzMgQTMgNDUgNDAgN0UgNTcgMDQgRkYgfCAgICAgICAgICAgICAgfCAzLkVAflcuLgorICArMHgwMTQ0IHwgNUIgODcgNTMgQzAgOEQgRjAgRjYgMjAgfCAgICAgICAgICAgICAgfCBbLlMuLi4uIAorICArMHgwMTRDIHwgMDQgQjYgNDIgNDAgOUYgNzcgNjMgNDEgfCAgICAgICAgICAgICAgfCAuLkJALndjQQorICArMHgwMTU0IHwgNjEgODUgNUUgQzAgOEYgMzUgMjMgODMgfCAgICAgICAgICAgICAgfCBhLl4uLjUjLgorICArMHgwMTVDIHwgREMgMzUgNEIgQzAgRjYgOTcgREQgOTMgfCAgICAgICAgICAgICAgfCAuNUsuLi4uLgorICArMHgwMTY0IHwgODcgQzUgMEEgNDAgMDAgMDAgMDAgMDAgfCAgICAgICAgICAgICAgfCAuLi5ALi4uLgorICArMHgwMTZDIHwgMDMgMDAgMDAgMDAgMjAgMDAgMDAgMDAgfCAgICAgICAgICAgICAgfCAuLi4uIC4uLgorICArMHgwMTc0IHwgMTQgMDAgMDAgMDAgMDQgMDAgMDAgMDAgfCAgICAgICAgICAgICAgfCAuLi4uLi4uLgorICArMHgwMTdDIHwgMDcgMDAgMDAgMDAgNjMgNjggNjEgNzIgfCAgICAgICAgICAgICAgfCAuLi4uY2hhcgorICArMHgwMTg0IHwgNkMgNjkgNjUgMDAgMDMgMDAgMDAgMDAgfCAgICAgICAgICAgICAgfCBsaWUuLi4uLgorICArMHgwMThDIHwgNjIgNkYgNjIgMDAgMDUgMDAgMDAgMDAgfCAgICAgICAgICAgICAgfCBib2IuLi4uLgorICArMHgwMTk0IHwgNjEgNkMgNjkgNjMgNjUgMDAgMDAgMDAgfCAgICAgICAgICAgICAgfCBhbGljZS4uLgorICArMHgwMTlDIHwgMDcgMDAgMDAgMDAgNjMgNjggNjEgNzIgfCAgICAgICAgICAgICAgfCAuLi4uY2hhcgorICArMHgwMUE0IHwgNkMgNjkgNjUgMDAgMDcgMDAgMDAgMDAgfCAgICAgICAgICAgICAgfCBsaWUuLi4uLgorICArMHgwMUFDIHwgNjMgNjggNjEgNzIgNkMgNjkgNjUgMDAgfCAgICAgICAgICAgICAgfCBjaGFybGllLgorICArMHgwMUI0IHwgMDkgMDAgMDAgMDAgMDkgMDAgMDggMDAgfCAgICAgICAgICAgICAgfCAuLi4uLi4uLgorICArMHgwMUJDIHwgMDcgMDAgMDEgMDAgMDIgMDAgMDMgMDAgfCAgICAgICAgICAgICAgfCAuLi4uLi4uLgorICArMHgwMUM0IHwgMDYgMDAgMDUgMDAgMDQgMDAgMDAgMDAgfCAgICAgICAgICAgICAgfCAuLi4uLi4uLgorICArMHgwMUNDIHwgM0EgRkYgRkYgRkYgMDAgMDAgMDAgMDMgfCAgICAgICAgICAgICAgfCA6Li4uLi4uLgorICArMHgwMUQ0IHwgMDIgMDAgMDAgMDAgNDQgMDAgMDAgMDAgfCAgICAgICAgICAgICAgfCAuLi4uRC4uLgorICArMHgwMURDIHwgMTAgMDAgMDAgMDAgMDAgMDAgMEEgMDAgfCAgICAgICAgICAgICAgfCAuLi4uLi4uLgorICArMHgwMUU0IHwgMUEgMDAgMEMgMDAgMDQgMDAgMDggMDAgfCAgICAgICAgICAgICAgfCAuLi4uLi4uLgorICArMHgwMUVDIHwgMEEgMDAgMDAgMDAgMDAgODAgMjMgNDQgfCAgICAgICAgICAgICAgfCAuLi4uLi4jRAorICArMHgwMUY0IHwgMTggMDAgMDAgMDAgMDAgMDAgMDAgMDAgfCAgICAgICAgICAgICAgfCAuLi4uLi4uLgorICArMHgwMUZDIHwgMDAgRDggOEUgNDAgMDAgMDAgMDAgMDAgfCAgICAgICAgICAgICAgfCAuLi5ALi4uLgorICArMHgwMjA0IHwgMDAgMDAgMDYgMDAgMDYgMDAgMDUgMDAgfCAgICAgICAgICAgICAgfCAuLi4uLi4uLgorICArMHgwMjBDIHwgMDYgMDAgMDAgMDAgMDAgMDMgMEEgMDAgfCAgICAgICAgICAgICAgfCAuLi4uLi4uLgorICArMHgwMjE0IHwgMTggMDAgMEMgMDAgMDQgMDAgMDggMDAgfCAgICAgICAgICAgICAgfCAuLi4uLi4uLgorICArMHgwMjFDIHwgMEEgMDAgMDAgMDAgMDAgMDAgRTQgNDMgfCAgICAgICAgICAgICAgfCAuLi4uLi4uQworICArMHgwMjI0IHwgMTAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgfCAgICAgICAgICAgICAgfCAuLi4uLi4uLgorICArMHgwMjJDIHwgMDAgQzAgNUUgNDAgMDAgMDAgMDAgMDAgfCAgICAgICAgICAgICAgfCAuLl5ALi4uLgorICArMHgwMjM0IHwgQTIgRkYgRkYgRkYgMDAgMDAgMDAgMDEgfCAgICAgICAgICAgICAgfCAuLi4uLi4uLgorICArMHgwMjNDIHwgMkYgMDAgMDAgMDAgNTQgNjggNjkgNzMgfCAgICAgICAgICAgICAgfCAvLi4uVGhpcworICArMHgwMjQ0IHwgMjAgNjkgNzMgMjAgNjEgMjAgNkMgNkYgfCAgICAgICAgICAgICAgfCAgaXMgYSBsbworICArMHgwMjRDIHwgNkUgNjcgMjAgNzMgNzQgNzIgNjkgNkUgfCAgICAgICAgICAgICAgfCBuZyBzdHJpbgorICArMHgwMjU0IHwgNjcgMjAgNzQgNkYgMjAgNzMgNjggNkYgfCAgICAgICAgICAgICAgfCBnIHRvIHNobworICArMHgwMjVDIHwgNzcgMjAgNjggNkYgNzcgMjAgNjkgNzQgfCAgICAgICAgICAgICAgfCB3IGhvdyBpdAorICArMHgwMjY0IHwgMjAgNjIgNzIgNjUgNjEgNkIgNzMgMjAgfCAgICAgICAgICAgICAgfCAgYnJlYWtzIAorICArMHgwMjZDIHwgNzUgNzAgMkUgMDAgMDAgMDAgMEEgMDAgfCAgICAgICAgICAgICAgfCB1cC4uLi4uLgorICArMHgwMjc0IHwgMTYgMDAgMEMgMDAgMDQgMDAgMDggMDAgfCAgICAgICAgICAgICAgfCAuLi4uLi4uLgorICArMHgwMjdDIHwgMEEgMDAgMDAgMDAgNjUgMjAgNzEgNDkgfCAgICAgICAgICAgICAgfCAuLi4uZSBxSQorICArMHgwMjg0IHwgMTQgMDAgMDAgMDAgQzkgNzYgQkUgOUYgfCAgICAgICAgICAgICAgfCAuLi4uLnYuLgorICArMHgwMjhDIHwgMEMgMjQgRkUgNDAgMDAgMDAgMDYgMDAgfCAgICAgICAgICAgICAgfCAuJC5ALi4uLgorICArMHgwMjk0IHwgMDggMDAgMDcgMDAgMDYgMDAgMDAgMDAgfCAgICAgICAgICAgICAgfCAuLi4uLi4uLgorICArMHgwMjlDIHwgMDAgMDAgMDAgMDEgICAgICAgICAgICAgfCAgICAgICAgICAgICAgfCAuLi4uCisKK3N0cmluZyAoQW5ub3RhdGVkQmluYXJ5LkZvby5jaGFybGllKToKKyAgKzB4MDBBQyB8IDA1IDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgIHwgMHgwMDAwMDAwNSAoNSkgICAgICAgICAgICAgICAgIHwgbGVuZ3RoIG9mIHN0cmluZworICArMHgwMEIwIHwgNjEgNkMgNjkgNjMgNjUgICAgICAgICAgfCBjaGFyWzVdICAgICAgfCBhbGljZSAgICAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJpbmcgbGl0ZXJhbAorICArMHgwMEI1IHwgMDAgICAgICAgICAgICAgICAgICAgICAgfCBjaGFyICAgICAgICAgfCAweDAwICgwKSAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJpbmcgdGVybWluYXRvcgorCitwYWRkaW5nOgorICArMHgwMEI2IHwgMDAgMDAgICAgICAgICAgICAgICAgICAgfCB1aW50OF90WzJdICAgfCAuLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBwYWRkaW5nCisKK3Z0YWJsZSAoQW5ub3RhdGVkQmluYXJ5LkJhcik6CisgICsweDAwQjggfCAwOCAwMCAgICAgICAgICAgICAgICAgICB8IHVpbnQxNl90ICAgICB8IDB4MDAwOCAoOCkgICAgICAgICAgICAgICAgICAgICB8IHNpemUgb2YgdGhpcyB2dGFibGUKKyAgKzB4MDBCQSB8IDEzIDAwICAgICAgICAgICAgICAgICAgIHwgdWludDE2X3QgICAgIHwgMHgwMDEzICgxOSkgICAgICAgICAgICAgICAgICAgIHwgc2l6ZSBvZiByZWZlcnJpbmcgdGFibGUKKyAgKzB4MDBCQyB8IDA4IDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgIHwgMHgwMDA4ICg4KSAgICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBhYCAoaWQ6IDApCisgICsweDAwQkUgfCAwNCAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgICB8IDB4MDAwNCAoNCkgICAgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgYmAgKGlkOiAxKQorCit0YWJsZSAoQW5ub3RhdGVkQmluYXJ5LkJhcik6CisgICsweDAwQzAgfCAwOCAwMCAwMCAwMCAgICAgICAgICAgICB8IFNPZmZzZXQzMiAgICB8IDB4MDAwMDAwMDggKDgpIExvYzogKzB4MDBCOCAgICB8IG9mZnNldCB0byB2dGFibGUKKyAgKzB4MDBDNCB8IDAwIDgwIDIzIDQ0ICAgICAgICAgICAgIHwgZmxvYXQgICAgICAgIHwgMHg0NDIzODAwMCAoNjU0KSAgICAgICAgICAgICAgIHwgdGFibGUgZmllbGQgYGJgIChGbG9hdCkKKyAgKzB4MDBDOCB8IDAwIDAwIDAwIDAwIDAwIDEwIDc0IDQwIHwgZG91YmxlICAgICAgIHwgMHg0MDc0MTAwMDAwMDAwMDAwICgzMjEpICAgICAgIHwgdGFibGUgZmllbGQgYGFgIChEb3VibGUpCisgICsweDAwRDAgfCAwMCAwMCAwMCAgICAgICAgICAgICAgICB8IHVpbnQ4X3RbM10gICB8IC4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHBhZGRpbmcKKwordW5pb24gKEFubm90YXRlZEJpbmFyeS5Ub2xlcmFuY2UubWVhc3VyZW1lbnQpOgorICArMHgwMEQzIHwgMDUgICAgICAgICAgICAgICAgICAgICAgfCB1aW50OF90ICAgICAgfCAweDA1ICg1KSAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJ1Y3QgZmllbGQgYEFubm90YXRlZEJpbmFyeS5Ub2xlcmFuY2Uud2lkdGhgIChVQnl0ZSkKKwordmVjdG9yIChBbm5vdGF0ZWRCaW5hcnkuRm9vLmZvb2JhcnMpOgorICArMHgwMEQ0IHwgMDMgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICAgfCAweDAwMDAwMDAzICgzKSAgICAgICAgICAgICAgICAgfCBsZW5ndGggb2YgdmVjdG9yICgjIGl0ZW1zKQorICArMHgwMEQ4IHwgMzQgMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICAgfCAweDAwMDAwMDM0ICg1MikgTG9jOiArMHgwMTBDICAgfCBvZmZzZXQgdG8gdW5pb25bMF0gKGBCYXJgKQorICArMHgwMERDIHwgMkMgMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICAgfCAweDAwMDAwMDJDICg0NCkgTG9jOiArMHgwMTA4ICAgfCBvZmZzZXQgdG8gdW5pb25bMV0gKGBCYXpgKQorICArMHgwMEUwIHwgMDQgMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICAgfCAweDAwMDAwMDA0ICg0KSBMb2M6ICsweDAwRTQgICAgfCBvZmZzZXQgdG8gdW5pb25bMl0gKGBCYXJgKQorCit0YWJsZSAoQW5ub3RhdGVkQmluYXJ5LkJhcik6CisgICsweDAwRTQgfCBEMiBGRSBGRiBGRiAgICAgICAgICAgICB8IFNPZmZzZXQzMiAgICB8IDB4RkZGRkZFRDIgKC0zMDIpIExvYzogKzB4MDIxMiB8IG9mZnNldCB0byB2dGFibGUKKyAgKzB4MDBFOCB8IDAwIDgwIDIzIDQ0ICAgICAgICAgICAgIHwgZmxvYXQgICAgICAgIHwgMHg0NDIzODAwMCAoNjU0KSAgICAgICAgICAgICAgIHwgdGFibGUgZmllbGQgYGJgIChGbG9hdCkKKyAgKzB4MDBFQyB8IDEwIDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgIHwgMHgwMDAwMDAxMCAoMTYpIExvYzogKzB4MDBGQyAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBjYCAodGFibGUpCisgICsweDAwRjAgfCAwMCAwMCAwMCAwMCAwMCBEOCA4RSA0MCB8IGRvdWJsZSAgICAgICB8IDB4NDA4RUQ4MDAwMDAwMDAwMCAoOTg3KSAgICAgICB8IHRhYmxlIGZpZWxkIGBhYCAoRG91YmxlKQorICArMHgwMEY4IHwgMDAgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50OF90WzRdICAgfCAuLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBwYWRkaW5nCisKK3RhYmxlIChBbm5vdGF0ZWRCaW5hcnkuQmF6KToKKyAgKzB4MDBGQyB8IDZBIEZFIEZGIEZGICAgICAgICAgICAgIHwgU09mZnNldDMyICAgIHwgMHhGRkZGRkU2QSAoLTQwNikgTG9jOiArMHgwMjkyIHwgb2Zmc2V0IHRvIHZ0YWJsZQorICArMHgwMTAwIHwgMDAgMDAgMDAgICAgICAgICAgICAgICAgfCB1aW50OF90WzNdICAgfCAuLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBwYWRkaW5nCisgICsweDAxMDMgfCAwMyAgICAgICAgICAgICAgICAgICAgICB8IHVpbnQ4X3QgICAgICB8IDB4MDMgKDMpICAgICAgICAgICAgICAgICAgICAgICB8IHRhYmxlIGZpZWxkIGBtZWFsYCAoQnl0ZSkKKwordnRhYmxlIChBbm5vdGF0ZWRCaW5hcnkuQmF6KToKKyAgKzB4MDEwNCB8IDA0IDAwICAgICAgICAgICAgICAgICAgIHwgdWludDE2X3QgICAgIHwgMHgwMDA0ICg0KSAgICAgICAgICAgICAgICAgICAgIHwgc2l6ZSBvZiB0aGlzIHZ0YWJsZQorICArMHgwMTA2IHwgMDQgMDAgICAgICAgICAgICAgICAgICAgfCB1aW50MTZfdCAgICAgfCAweDAwMDQgKDQpICAgICAgICAgICAgICAgICAgICAgfCBzaXplIG9mIHJlZmVycmluZyB0YWJsZQorCit0YWJsZSAoQW5ub3RhdGVkQmluYXJ5LkJheik6CisgICsweDAxMDggfCAwNCAwMCAwMCAwMCAgICAgICAgICAgICB8IFNPZmZzZXQzMiAgICB8IDB4MDAwMDAwMDQgKDQpIExvYzogKzB4MDEwNCAgICB8IG9mZnNldCB0byB2dGFibGUKKwordGFibGUgKEFubm90YXRlZEJpbmFyeS5CYXIpOgorICArMHgwMTBDIHwgRkEgRkUgRkYgRkYgICAgICAgICAgICAgfCBTT2Zmc2V0MzIgICAgfCAweEZGRkZGRUZBICgtMjYyKSBMb2M6ICsweDAyMTIgfCBvZmZzZXQgdG8gdnRhYmxlCisgICsweDAxMTAgfCAwMCAwMCBFNCA0MyAgICAgICAgICAgICB8IGZsb2F0ICAgICAgICB8IDB4NDNFNDAwMDAgKDQ1NikgICAgICAgICAgICAgICB8IHRhYmxlIGZpZWxkIGBiYCAoRmxvYXQpCisgICsweDAxMTQgfCAxMCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgICB8IDB4MDAwMDAwMTAgKDE2KSBMb2M6ICsweDAxMjQgICB8IG9mZnNldCB0byBmaWVsZCBgY2AgKHRhYmxlKQorICArMHgwMTE4IHwgMDAgMDAgMDAgMDAgMDAgQzAgNUUgNDAgfCBkb3VibGUgICAgICAgfCAweDQwNUVDMDAwMDAwMDAwMDAgKDEyMykgICAgICAgfCB0YWJsZSBmaWVsZCBgYWAgKERvdWJsZSkKKyAgKzB4MDEyMCB8IDAwIDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDhfdFs0XSAgIHwgLi4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgcGFkZGluZworCit0YWJsZSAoQW5ub3RhdGVkQmluYXJ5LkJheik6CisgICsweDAxMjQgfCA5MiBGRSBGRiBGRiAgICAgICAgICAgICB8IFNPZmZzZXQzMiAgICB8IDB4RkZGRkZFOTIgKC0zNjYpIExvYzogKzB4MDI5MiB8IG9mZnNldCB0byB2dGFibGUKKyAgKzB4MDEyOCB8IDAwIDAwIDAwICAgICAgICAgICAgICAgIHwgdWludDhfdFszXSAgIHwgLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgcGFkZGluZworICArMHgwMTJCIHwgMDEgICAgICAgICAgICAgICAgICAgICAgfCB1aW50OF90ICAgICAgfCAweDAxICgxKSAgICAgICAgICAgICAgICAgICAgICAgfCB0YWJsZSBmaWVsZCBgbWVhbGAgKEJ5dGUpCisKK3ZlY3RvciAoQW5ub3RhdGVkQmluYXJ5LkZvby5mb29iYXJzX3R5cGUpOgorICArMHgwMTJDIHwgMDMgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICAgfCAweDAwMDAwMDAzICgzKSAgICAgICAgICAgICAgICAgfCBsZW5ndGggb2YgdmVjdG9yICgjIGl0ZW1zKQorICArMHgwMTMwIHwgMDEgICAgICAgICAgICAgICAgICAgICAgfCBVVHlwZTggICAgICAgfCAweDAxICgxKSAgICAgICAgICAgICAgICAgICAgICAgfCB2YWx1ZVswXQorICArMHgwMTMxIHwgMDIgICAgICAgICAgICAgICAgICAgICAgfCBVVHlwZTggICAgICAgfCAweDAyICgyKSAgICAgICAgICAgICAgICAgICAgICAgfCB2YWx1ZVsxXQorICArMHgwMTMyIHwgMDEgICAgICAgICAgICAgICAgICAgICAgfCBVVHlwZTggICAgICAgfCAweDAxICgxKSAgICAgICAgICAgICAgICAgICAgICAgfCB2YWx1ZVsyXQorCit2ZWN0b3IgKEFubm90YXRlZEJpbmFyeS5Gb28ucG9pbnRzX29mX2ludGVyZXN0KToKKyAgKzB4MDEzNCB8IDAzIDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgIHwgMHgwMDAwMDAwMyAoMykgICAgICAgICAgICAgICAgIHwgbGVuZ3RoIG9mIHZlY3RvciAoIyBpdGVtcykKKyAgKzB4MDEzOCB8IDMzIDMzIDMzIDMzIDMzIEEzIDQ1IDQwIHwgZG91YmxlICAgICAgIHwgMHg0MDQ1QTMzMzMzMzMzMzMzICg0My4yNzUpICAgIHwgc3RydWN0IGZpZWxkIGBBbm5vdGF0ZWRCaW5hcnkuTG9jYXRpb24ubGF0aXR1ZGVgIChEb3VibGUpCisgICsweDAxNDAgfCA3RSA1NyAwNCBGRiA1QiA4NyA1MyBDMCB8IGRvdWJsZSAgICAgICB8IDB4QzA1Mzg3NUJGRjA0NTc3RSAoLTc4LjExNSkgICB8IHN0cnVjdCBmaWVsZCBgQW5ub3RhdGVkQmluYXJ5LkxvY2F0aW9uLmxvbmdpdHVkZWAgKERvdWJsZSkKKyAgKzB4MDE0OCB8IDhEIEYwIEY2IDIwIDA0IEI2IDQyIDQwIHwgZG91YmxlICAgICAgIHwgMHg0MDQyQjYwNDIwRjZGMDhEICgzNy40MjIpICAgIHwgc3RydWN0IGZpZWxkIGBBbm5vdGF0ZWRCaW5hcnkuTG9jYXRpb24ubGF0aXR1ZGVgIChEb3VibGUpCisgICsweDAxNTAgfCA5RiA3NyA2MyA0MSA2MSA4NSA1RSBDMCB8IGRvdWJsZSAgICAgICB8IDB4QzA1RTg1NjE0MTYzNzc5RiAoLTEyMi4wODQpICB8IHN0cnVjdCBmaWVsZCBgQW5ub3RhdGVkQmluYXJ5LkxvY2F0aW9uLmxvbmdpdHVkZWAgKERvdWJsZSkKKyAgKzB4MDE1OCB8IDhGIDM1IDIzIDgzIERDIDM1IDRCIEMwIHwgZG91YmxlICAgICAgIHwgMHhDMDRCMzVEQzgzMjMzNThGICgtNTQuNDIwOCkgIHwgc3RydWN0IGZpZWxkIGBBbm5vdGF0ZWRCaW5hcnkuTG9jYXRpb24ubGF0aXR1ZGVgIChEb3VibGUpCisgICsweDAxNjAgfCBGNiA5NyBERCA5MyA4NyBDNSAwQSA0MCB8IGRvdWJsZSAgICAgICB8IDB4NDAwQUM1ODc5M0REOTdGNiAoMy4zNDY0NSkgICB8IHN0cnVjdCBmaWVsZCBgQW5ub3RhdGVkQmluYXJ5LkxvY2F0aW9uLmxvbmdpdHVkZWAgKERvdWJsZSkKKworcGFkZGluZzoKKyAgKzB4MDE2OCB8IDAwIDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDhfdFs0XSAgIHwgLi4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgcGFkZGluZworCit2ZWN0b3IgKEFubm90YXRlZEJpbmFyeS5Gb28ubmFtZXMpOgorICArMHgwMTZDIHwgMDMgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICAgfCAweDAwMDAwMDAzICgzKSAgICAgICAgICAgICAgICAgfCBsZW5ndGggb2YgdmVjdG9yICgjIGl0ZW1zKQorICArMHgwMTcwIHwgMjAgMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICAgfCAweDAwMDAwMDIwICgzMikgTG9jOiArMHgwMTkwICAgfCBvZmZzZXQgdG8gc3RyaW5nWzBdCisgICsweDAxNzQgfCAxNCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgICB8IDB4MDAwMDAwMTQgKDIwKSBMb2M6ICsweDAxODggICB8IG9mZnNldCB0byBzdHJpbmdbMV0KKyAgKzB4MDE3OCB8IDA0IDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgIHwgMHgwMDAwMDAwNCAoNCkgTG9jOiArMHgwMTdDICAgIHwgb2Zmc2V0IHRvIHN0cmluZ1syXQorCitzdHJpbmcgKEFubm90YXRlZEJpbmFyeS5Gb28ubmFtZXMpOgorICArMHgwMTdDIHwgMDcgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICAgfCAweDAwMDAwMDA3ICg3KSAgICAgICAgICAgICAgICAgfCBsZW5ndGggb2Ygc3RyaW5nCisgICsweDAxODAgfCA2MyA2OCA2MSA3MiA2QyA2OSA2NSAgICB8IGNoYXJbN10gICAgICB8IGNoYXJsaWUgICAgICAgICAgICAgICAgICAgICAgICB8IHN0cmluZyBsaXRlcmFsCisgICsweDAxODcgfCAwMCAgICAgICAgICAgICAgICAgICAgICB8IGNoYXIgICAgICAgICB8IDB4MDAgKDApICAgICAgICAgICAgICAgICAgICAgICB8IHN0cmluZyB0ZXJtaW5hdG9yCisKK3N0cmluZyAoQW5ub3RhdGVkQmluYXJ5LkZvby5uYW1lcyk6CisgICsweDAxODggfCAwMyAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgICB8IDB4MDAwMDAwMDMgKDMpICAgICAgICAgICAgICAgICB8IGxlbmd0aCBvZiBzdHJpbmcKKyAgKzB4MDE4QyB8IDYyIDZGIDYyICAgICAgICAgICAgICAgIHwgY2hhclszXSAgICAgIHwgYm9iICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nIGxpdGVyYWwKKyAgKzB4MDE4RiB8IDAwICAgICAgICAgICAgICAgICAgICAgIHwgY2hhciAgICAgICAgIHwgMHgwMCAoMCkgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nIHRlcm1pbmF0b3IKKworc3RyaW5nIChBbm5vdGF0ZWRCaW5hcnkuRm9vLm5hbWVzKToKKyAgKzB4MDE5MCB8IDA1IDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgIHwgMHgwMDAwMDAwNSAoNSkgICAgICAgICAgICAgICAgIHwgbGVuZ3RoIG9mIHN0cmluZworICArMHgwMTk0IHwgNjEgNkMgNjkgNjMgNjUgICAgICAgICAgfCBjaGFyWzVdICAgICAgfCBhbGljZSAgICAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJpbmcgbGl0ZXJhbAorICArMHgwMTk5IHwgMDAgICAgICAgICAgICAgICAgICAgICAgfCBjaGFyICAgICAgICAgfCAweDAwICgwKSAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJpbmcgdGVybWluYXRvcgorCitwYWRkaW5nOgorICArMHgwMTlBIHwgMDAgMDAgICAgICAgICAgICAgICAgICAgfCB1aW50OF90WzJdICAgfCAuLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBwYWRkaW5nCisKK3N0cmluZyAoQW5ub3RhdGVkQmluYXJ5LkZvby5hbGljZSk6CisgICsweDAxOUMgfCAwNyAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgICB8IDB4MDAwMDAwMDcgKDcpICAgICAgICAgICAgICAgICB8IGxlbmd0aCBvZiBzdHJpbmcKKyAgKzB4MDFBMCB8IDYzIDY4IDYxIDcyIDZDIDY5IDY1ICAgIHwgY2hhcls3XSAgICAgIHwgY2hhcmxpZSAgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nIGxpdGVyYWwKKyAgKzB4MDFBNyB8IDAwICAgICAgICAgICAgICAgICAgICAgIHwgY2hhciAgICAgICAgIHwgMHgwMCAoMCkgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nIHRlcm1pbmF0b3IKKworc3RyaW5nIChBbm5vdGF0ZWRCaW5hcnkuRm9vLmJvYik6CisgICsweDAxQTggfCAwNyAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgICB8IDB4MDAwMDAwMDcgKDcpICAgICAgICAgICAgICAgICB8IGxlbmd0aCBvZiBzdHJpbmcKKyAgKzB4MDFBQyB8IDYzIDY4IDYxIDcyIDZDIDY5IDY1ICAgIHwgY2hhcls3XSAgICAgIHwgY2hhcmxpZSAgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nIGxpdGVyYWwKKyAgKzB4MDFCMyB8IDAwICAgICAgICAgICAgICAgICAgICAgIHwgY2hhciAgICAgICAgIHwgMHgwMCAoMCkgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nIHRlcm1pbmF0b3IKKwordmVjdG9yIChBbm5vdGF0ZWRCaW5hcnkuRm9vLmFjY291bnRzKToKKyAgKzB4MDFCNCB8IDA5IDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgIHwgMHgwMDAwMDAwOSAoOSkgICAgICAgICAgICAgICAgIHwgbGVuZ3RoIG9mIHZlY3RvciAoIyBpdGVtcykKKyAgKzB4MDFCOCB8IDA5IDAwICAgICAgICAgICAgICAgICAgIHwgdWludDE2X3QgICAgIHwgMHgwMDA5ICg5KSAgICAgICAgICAgICAgICAgICAgIHwgdmFsdWVbMF0KKyAgKzB4MDFCQSB8IDA4IDAwICAgICAgICAgICAgICAgICAgIHwgdWludDE2X3QgICAgIHwgMHgwMDA4ICg4KSAgICAgICAgICAgICAgICAgICAgIHwgdmFsdWVbMV0KKyAgKzB4MDFCQyB8IDA3IDAwICAgICAgICAgICAgICAgICAgIHwgdWludDE2X3QgICAgIHwgMHgwMDA3ICg3KSAgICAgICAgICAgICAgICAgICAgIHwgdmFsdWVbMl0KKyAgKzB4MDFCRSB8IDAxIDAwICAgICAgICAgICAgICAgICAgIHwgdWludDE2X3QgICAgIHwgMHgwMDAxICgxKSAgICAgICAgICAgICAgICAgICAgIHwgdmFsdWVbM10KKyAgKzB4MDFDMCB8IDAyIDAwICAgICAgICAgICAgICAgICAgIHwgdWludDE2X3QgICAgIHwgMHgwMDAyICgyKSAgICAgICAgICAgICAgICAgICAgIHwgdmFsdWVbNF0KKyAgKzB4MDFDMiB8IDAzIDAwICAgICAgICAgICAgICAgICAgIHwgdWludDE2X3QgICAgIHwgMHgwMDAzICgzKSAgICAgICAgICAgICAgICAgICAgIHwgdmFsdWVbNV0KKyAgKzB4MDFDNCB8IDA2IDAwICAgICAgICAgICAgICAgICAgIHwgdWludDE2X3QgICAgIHwgMHgwMDA2ICg2KSAgICAgICAgICAgICAgICAgICAgIHwgdmFsdWVbNl0KKyAgKzB4MDFDNiB8IDA1IDAwICAgICAgICAgICAgICAgICAgIHwgdWludDE2X3QgICAgIHwgMHgwMDA1ICg1KSAgICAgICAgICAgICAgICAgICAgIHwgdmFsdWVbN10KKyAgKzB4MDFDOCB8IDA0IDAwICAgICAgICAgICAgICAgICAgIHwgdWludDE2X3QgICAgIHwgMHgwMDA0ICg0KSAgICAgICAgICAgICAgICAgICAgIHwgdmFsdWVbOF0KKworcGFkZGluZzoKKyAgKzB4MDFDQSB8IDAwIDAwICAgICAgICAgICAgICAgICAgIHwgdWludDhfdFsyXSAgIHwgLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgcGFkZGluZworCit0YWJsZSAoQW5ub3RhdGVkQmluYXJ5LkJheik6CisgICsweDAxQ0MgfCAzQSBGRiBGRiBGRiAgICAgICAgICAgICB8IFNPZmZzZXQzMiAgICB8IDB4RkZGRkZGM0EgKC0xOTgpIExvYzogKzB4MDI5MiB8IG9mZnNldCB0byB2dGFibGUKKyAgKzB4MDFEMCB8IDAwIDAwIDAwICAgICAgICAgICAgICAgIHwgdWludDhfdFszXSAgIHwgLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgcGFkZGluZworICArMHgwMUQzIHwgMDMgICAgICAgICAgICAgICAgICAgICAgfCB1aW50OF90ICAgICAgfCAweDAzICgzKSAgICAgICAgICAgICAgICAgICAgICAgfCB0YWJsZSBmaWVsZCBgbWVhbGAgKEJ5dGUpCisKK3ZlY3RvciAoQW5ub3RhdGVkQmluYXJ5LkZvby5iYXJzKToKKyAgKzB4MDFENCB8IDAyIDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgIHwgMHgwMDAwMDAwMiAoMikgICAgICAgICAgICAgICAgIHwgbGVuZ3RoIG9mIHZlY3RvciAoIyBpdGVtcykKKyAgKzB4MDFEOCB8IDQ0IDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgIHwgMHgwMDAwMDA0NCAoNjgpIExvYzogKzB4MDIxQyAgIHwgb2Zmc2V0IHRvIHRhYmxlWzBdCisgICsweDAxREMgfCAxMCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgICB8IDB4MDAwMDAwMTAgKDE2KSBMb2M6ICsweDAxRUMgICB8IG9mZnNldCB0byB0YWJsZVsxXQorCitwYWRkaW5nOgorICArMHgwMUUwIHwgMDAgMDAgICAgICAgICAgICAgICAgICAgfCB1aW50OF90WzJdICAgfCAuLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBwYWRkaW5nCisKK3Z0YWJsZSAoQW5ub3RhdGVkQmluYXJ5LkJhcik6CisgICsweDAxRTIgfCAwQSAwMCAgICAgICAgICAgICAgICAgICB8IHVpbnQxNl90ICAgICB8IDB4MDAwQSAoMTApICAgICAgICAgICAgICAgICAgICB8IHNpemUgb2YgdGhpcyB2dGFibGUKKyAgKzB4MDFFNCB8IDFBIDAwICAgICAgICAgICAgICAgICAgIHwgdWludDE2X3QgICAgIHwgMHgwMDFBICgyNikgICAgICAgICAgICAgICAgICAgIHwgc2l6ZSBvZiByZWZlcnJpbmcgdGFibGUKKyAgKzB4MDFFNiB8IDBDIDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgIHwgMHgwMDBDICgxMikgICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBhYCAoaWQ6IDApCisgICsweDAxRTggfCAwNCAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgICB8IDB4MDAwNCAoNCkgICAgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgYmAgKGlkOiAxKQorICArMHgwMUVBIHwgMDggMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgICAgfCAweDAwMDggKDgpICAgICAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYGNgIChpZDogMikKKwordGFibGUgKEFubm90YXRlZEJpbmFyeS5CYXIpOgorICArMHgwMUVDIHwgMEEgMDAgMDAgMDAgICAgICAgICAgICAgfCBTT2Zmc2V0MzIgICAgfCAweDAwMDAwMDBBICgxMCkgTG9jOiArMHgwMUUyICAgfCBvZmZzZXQgdG8gdnRhYmxlCisgICsweDAxRjAgfCAwMCA4MCAyMyA0NCAgICAgICAgICAgICB8IGZsb2F0ICAgICAgICB8IDB4NDQyMzgwMDAgKDY1NCkgICAgICAgICAgICAgICB8IHRhYmxlIGZpZWxkIGBiYCAoRmxvYXQpCisgICsweDAxRjQgfCAxOCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgICB8IDB4MDAwMDAwMTggKDI0KSBMb2M6ICsweDAyMEMgICB8IG9mZnNldCB0byBmaWVsZCBgY2AgKHRhYmxlKQorICArMHgwMUY4IHwgMDAgMDAgMDAgMDAgMDAgRDggOEUgNDAgfCBkb3VibGUgICAgICAgfCAweDQwOEVEODAwMDAwMDAwMDAgKDk4NykgICAgICAgfCB0YWJsZSBmaWVsZCBgYWAgKERvdWJsZSkKKyAgKzB4MDIwMCB8IDAwIDAwIDAwIDAwIDAwIDAwICAgICAgIHwgdWludDhfdFs2XSAgIHwgLi4uLi4uICAgICAgICAgICAgICAgICAgICAgICAgIHwgcGFkZGluZworCit2dGFibGUgKEFubm90YXRlZEJpbmFyeS5CYXopOgorICArMHgwMjA2IHwgMDYgMDAgICAgICAgICAgICAgICAgICAgfCB1aW50MTZfdCAgICAgfCAweDAwMDYgKDYpICAgICAgICAgICAgICAgICAgICAgfCBzaXplIG9mIHRoaXMgdnRhYmxlCisgICsweDAyMDggfCAwNiAwMCAgICAgICAgICAgICAgICAgICB8IHVpbnQxNl90ICAgICB8IDB4MDAwNiAoNikgICAgICAgICAgICAgICAgICAgICB8IHNpemUgb2YgcmVmZXJyaW5nIHRhYmxlCisgICsweDAyMEEgfCAwNSAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgICB8IDB4MDAwNSAoNSkgICAgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgbWVhbGAgKGlkOiAwKQorCit0YWJsZSAoQW5ub3RhdGVkQmluYXJ5LkJheik6CisgICsweDAyMEMgfCAwNiAwMCAwMCAwMCAgICAgICAgICAgICB8IFNPZmZzZXQzMiAgICB8IDB4MDAwMDAwMDYgKDYpIExvYzogKzB4MDIwNiAgICB8IG9mZnNldCB0byB2dGFibGUKKyAgKzB4MDIxMCB8IDAwICAgICAgICAgICAgICAgICAgICAgIHwgdWludDhfdFsxXSAgIHwgLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgcGFkZGluZworICArMHgwMjExIHwgMDMgICAgICAgICAgICAgICAgICAgICAgfCB1aW50OF90ICAgICAgfCAweDAzICgzKSAgICAgICAgICAgICAgICAgICAgICAgfCB0YWJsZSBmaWVsZCBgbWVhbGAgKEJ5dGUpCisKK3Z0YWJsZSAoQW5ub3RhdGVkQmluYXJ5LkJhcik6CisgICsweDAyMTIgfCAwQSAwMCAgICAgICAgICAgICAgICAgICB8IHVpbnQxNl90ICAgICB8IDB4MDAwQSAoMTApICAgICAgICAgICAgICAgICAgICB8IHNpemUgb2YgdGhpcyB2dGFibGUKKyAgKzB4MDIxNCB8IDE4IDAwICAgICAgICAgICAgICAgICAgIHwgdWludDE2X3QgICAgIHwgMHgwMDE4ICgyNCkgICAgICAgICAgICAgICAgICAgIHwgc2l6ZSBvZiByZWZlcnJpbmcgdGFibGUKKyAgKzB4MDIxNiB8IDBDIDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgIHwgMHgwMDBDICgxMikgICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBhYCAoaWQ6IDApCisgICsweDAyMTggfCAwNCAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgICB8IDB4MDAwNCAoNCkgICAgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgYmAgKGlkOiAxKQorICArMHgwMjFBIHwgMDggMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgICAgfCAweDAwMDggKDgpICAgICAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYGNgIChpZDogMikKKwordGFibGUgKEFubm90YXRlZEJpbmFyeS5CYXIpOgorICArMHgwMjFDIHwgMEEgMDAgMDAgMDAgICAgICAgICAgICAgfCBTT2Zmc2V0MzIgICAgfCAweDAwMDAwMDBBICgxMCkgTG9jOiArMHgwMjEyICAgfCBvZmZzZXQgdG8gdnRhYmxlCisgICsweDAyMjAgfCAwMCAwMCBFNCA0MyAgICAgICAgICAgICB8IGZsb2F0ICAgICAgICB8IDB4NDNFNDAwMDAgKDQ1NikgICAgICAgICAgICAgICB8IHRhYmxlIGZpZWxkIGBiYCAoRmxvYXQpCisgICsweDAyMjQgfCAxMCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgICB8IDB4MDAwMDAwMTAgKDE2KSBMb2M6ICsweDAyMzQgICB8IG9mZnNldCB0byBmaWVsZCBgY2AgKHRhYmxlKQorICArMHgwMjI4IHwgMDAgMDAgMDAgMDAgMDAgQzAgNUUgNDAgfCBkb3VibGUgICAgICAgfCAweDQwNUVDMDAwMDAwMDAwMDAgKDEyMykgICAgICAgfCB0YWJsZSBmaWVsZCBgYWAgKERvdWJsZSkKKyAgKzB4MDIzMCB8IDAwIDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDhfdFs0XSAgIHwgLi4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgcGFkZGluZworCit0YWJsZSAoQW5ub3RhdGVkQmluYXJ5LkJheik6CisgICsweDAyMzQgfCBBMiBGRiBGRiBGRiAgICAgICAgICAgICB8IFNPZmZzZXQzMiAgICB8IDB4RkZGRkZGQTIgKC05NCkgTG9jOiArMHgwMjkyICB8IG9mZnNldCB0byB2dGFibGUKKyAgKzB4MDIzOCB8IDAwIDAwIDAwICAgICAgICAgICAgICAgIHwgdWludDhfdFszXSAgIHwgLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgcGFkZGluZworICArMHgwMjNCIHwgMDEgICAgICAgICAgICAgICAgICAgICAgfCB1aW50OF90ICAgICAgfCAweDAxICgxKSAgICAgICAgICAgICAgICAgICAgICAgfCB0YWJsZSBmaWVsZCBgbWVhbGAgKEJ5dGUpCisKK3N0cmluZyAoQW5ub3RhdGVkQmluYXJ5LkZvby5uYW1lKToKKyAgKzB4MDIzQyB8IDJGIDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgIHwgMHgwMDAwMDAyRiAoNDcpICAgICAgICAgICAgICAgIHwgbGVuZ3RoIG9mIHN0cmluZworICArMHgwMjQwIHwgNTQgNjggNjkgNzMgMjAgNjkgNzMgMjAgfCBjaGFyWzQ3XSAgICAgfCBUaGlzIGlzICAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJpbmcgbGl0ZXJhbAorICArMHgwMjQ4IHwgNjEgMjAgNkMgNkYgNkUgNjcgMjAgNzMgfCAgICAgICAgICAgICAgfCBhIGxvbmcgcworICArMHgwMjUwIHwgNzQgNzIgNjkgNkUgNjcgMjAgNzQgNkYgfCAgICAgICAgICAgICAgfCB0cmluZyB0bworICArMHgwMjU4IHwgMjAgNzMgNjggNkYgNzcgMjAgNjggNkYgfCAgICAgICAgICAgICAgfCAgc2hvdyBobworICArMHgwMjYwIHwgNzcgMjAgNjkgNzQgMjAgNjIgNzIgNjUgfCAgICAgICAgICAgICAgfCB3IGl0IGJyZQorICArMHgwMjY4IHwgNjEgNkIgNzMgMjAgNzUgNzAgMkUgICAgfCAgICAgICAgICAgICAgfCBha3MgdXAuCisgICsweDAyNkYgfCAwMCAgICAgICAgICAgICAgICAgICAgICB8IGNoYXIgICAgICAgICB8IDB4MDAgKDApICAgICAgICAgICAgICAgICAgICAgICB8IHN0cmluZyB0ZXJtaW5hdG9yCisKK3BhZGRpbmc6CisgICsweDAyNzAgfCAwMCAwMCAgICAgICAgICAgICAgICAgICB8IHVpbnQ4X3RbMl0gICB8IC4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHBhZGRpbmcKKwordnRhYmxlIChBbm5vdGF0ZWRCaW5hcnkuQmFyKToKKyAgKzB4MDI3MiB8IDBBIDAwICAgICAgICAgICAgICAgICAgIHwgdWludDE2X3QgICAgIHwgMHgwMDBBICgxMCkgICAgICAgICAgICAgICAgICAgIHwgc2l6ZSBvZiB0aGlzIHZ0YWJsZQorICArMHgwMjc0IHwgMTYgMDAgICAgICAgICAgICAgICAgICAgfCB1aW50MTZfdCAgICAgfCAweDAwMTYgKDIyKSAgICAgICAgICAgICAgICAgICAgfCBzaXplIG9mIHJlZmVycmluZyB0YWJsZQorICArMHgwMjc2IHwgMEMgMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgICAgfCAweDAwMEMgKDEyKSAgICAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYGFgIChpZDogMCkKKyAgKzB4MDI3OCB8IDA0IDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgIHwgMHgwMDA0ICg0KSAgICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBiYCAoaWQ6IDEpCisgICsweDAyN0EgfCAwOCAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgICB8IDB4MDAwOCAoOCkgICAgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgY2AgKGlkOiAyKQorCit0YWJsZSAoQW5ub3RhdGVkQmluYXJ5LkJhcik6CisgICsweDAyN0MgfCAwQSAwMCAwMCAwMCAgICAgICAgICAgICB8IFNPZmZzZXQzMiAgICB8IDB4MDAwMDAwMEEgKDEwKSBMb2M6ICsweDAyNzIgICB8IG9mZnNldCB0byB2dGFibGUKKyAgKzB4MDI4MCB8IDY1IDIwIDcxIDQ5ICAgICAgICAgICAgIHwgZmxvYXQgICAgICAgIHwgMHg0OTcxMjA2NSAoOTg3NjU0KSAgICAgICAgICAgIHwgdGFibGUgZmllbGQgYGJgIChGbG9hdCkKKyAgKzB4MDI4NCB8IDE0IDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgIHwgMHgwMDAwMDAxNCAoMjApIExvYzogKzB4MDI5OCAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBjYCAodGFibGUpCisgICsweDAyODggfCBDOSA3NiBCRSA5RiAwQyAyNCBGRSA0MCB8IGRvdWJsZSAgICAgICB8IDB4NDBGRTI0MEM5RkJFNzZDOSAoMTIzNDU3KSAgICB8IHRhYmxlIGZpZWxkIGBhYCAoRG91YmxlKQorICArMHgwMjkwIHwgMDAgMDAgICAgICAgICAgICAgICAgICAgfCB1aW50OF90WzJdICAgfCAuLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBwYWRkaW5nCisKK3Z0YWJsZSAoQW5ub3RhdGVkQmluYXJ5LkJheik6CisgICsweDAyOTIgfCAwNiAwMCAgICAgICAgICAgICAgICAgICB8IHVpbnQxNl90ICAgICB8IDB4MDAwNiAoNikgICAgICAgICAgICAgICAgICAgICB8IHNpemUgb2YgdGhpcyB2dGFibGUKKyAgKzB4MDI5NCB8IDA4IDAwICAgICAgICAgICAgICAgICAgIHwgdWludDE2X3QgICAgIHwgMHgwMDA4ICg4KSAgICAgICAgICAgICAgICAgICAgIHwgc2l6ZSBvZiByZWZlcnJpbmcgdGFibGUKKyAgKzB4MDI5NiB8IDA3IDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgIHwgMHgwMDA3ICg3KSAgICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBtZWFsYCAoaWQ6IDApCisKK3RhYmxlIChBbm5vdGF0ZWRCaW5hcnkuQmF6KToKKyAgKzB4MDI5OCB8IDA2IDAwIDAwIDAwICAgICAgICAgICAgIHwgU09mZnNldDMyICAgIHwgMHgwMDAwMDAwNiAoNikgTG9jOiArMHgwMjkyICAgIHwgb2Zmc2V0IHRvIHZ0YWJsZQorICArMHgwMjlDIHwgMDAgMDAgMDAgICAgICAgICAgICAgICAgfCB1aW50OF90WzNdICAgfCAuLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBwYWRkaW5nCisgICsweDAyOUYgfCAwMSAgICAgICAgICAgICAgICAgICAgICB8IHVpbnQ4X3QgICAgICB8IDB4MDEgKDEpICAgICAgICAgICAgICAgICAgICAgICB8IHRhYmxlIGZpZWxkIGBtZWFsYCAoQnl0ZSkKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL2Fubm90YXRlZF9iaW5hcnkvdGVzdHMvaW52YWxpZF92dGFibGVfcmVmX3RhYmxlX3NpemUuYmluIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvYW5ub3RhdGVkX2JpbmFyeS90ZXN0cy9pbnZhbGlkX3Z0YWJsZV9yZWZfdGFibGVfc2l6ZS5iaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmI1MDI0MgotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL2Fubm90YXRlZF9iaW5hcnkvdGVzdHMvaW52YWxpZF92dGFibGVfcmVmX3RhYmxlX3NpemUuYmluCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL2Fubm90YXRlZF9iaW5hcnkvdGVzdHMvaW52YWxpZF92dGFibGVfcmVmX3RhYmxlX3NpemVfc2hvcnQuYWZiIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvYW5ub3RhdGVkX2JpbmFyeS90ZXN0cy9pbnZhbGlkX3Z0YWJsZV9yZWZfdGFibGVfc2l6ZV9zaG9ydC5hZmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzVlYjZhOAotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL2Fubm90YXRlZF9iaW5hcnkvdGVzdHMvaW52YWxpZF92dGFibGVfcmVmX3RhYmxlX3NpemVfc2hvcnQuYWZiCkBAIC0wLDAgKzEsMjk3IEBACisvLyBBbm5vdGF0ZWQgRmxhdGJ1ZmZlciBCaW5hcnkKKy8vCisvLyBTY2hlbWEgZmlsZTogYW5ub3RhdGVkX2JpbmFyeS5mYnMKKy8vIEJpbmFyeSBmaWxlOiB0ZXN0cy9pbnZhbGlkX3Z0YWJsZV9yZWZfdGFibGVfc2l6ZV9zaG9ydC5iaW4KKworaGVhZGVyOgorICArMHgwMDAwIHwgNDQgMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgIHwgMHgwMDAwMDA0NCAoNjgpIExvYzogKzB4MDA0NCAgIHwgb2Zmc2V0IHRvIHJvb3QgdGFibGUgYEFubm90YXRlZEJpbmFyeS5Gb29gCisgICsweDAwMDQgfCA0MSA0RSA0RSA0RiAgICAgICAgICAgICB8IGNoYXJbNF0gICAgfCBBTk5PICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBGaWxlIElkZW50aWZpZXIKKworcGFkZGluZzoKKyAgKzB4MDAwOCB8IDAwIDAwICAgICAgICAgICAgICAgICAgIHwgdWludDhfdFsyXSB8IC4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHBhZGRpbmcKKwordnRhYmxlIChBbm5vdGF0ZWRCaW5hcnkuRm9vKToKKyAgKzB4MDAwQSB8IDNBIDAwICAgICAgICAgICAgICAgICAgIHwgdWludDE2X3QgICB8IDB4MDAzQSAoNTgpICAgICAgICAgICAgICAgICAgICB8IHNpemUgb2YgdGhpcyB2dGFibGUKKyAgKzB4MDAwQyB8IDAxIDAwICAgICAgICAgICAgICAgICAgIHwgdWludDE2X3QgICB8IDB4MDAwMSAoMSkgICAgICAgICAgICAgICAgICAgICB8IEVSUk9SOiBzaXplIG9mIHJlZmVycmluZyB0YWJsZS4gU2hvcnRlciB0aGFuIHRoZSBtaW5pbXVtIGxlbmd0aDogCisgICsweDAwMEUgfCAwQyAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgfCAweDAwMEMgKDEyKSAgICAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYGNvdW50ZXJgIChpZDogMCkKKyAgKzB4MDAxMCB8IDA3IDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICB8IDB4MDAwNyAoNykgICAgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgaGVhbHRoeWAgKGlkOiAxKQorICArMHgwMDEyIHwgMDAgMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgIHwgMHgwMDAwICgwKSAgICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBsZXZlbGAgKGlkOiAyKSA8ZGVmYXVsdHMgdG8gOTk+IChMb25nKQorICArMHgwMDE0IHwgMDggMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgIHwgMHgwMDA4ICg4KSAgICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBtZWFsYCAoaWQ6IDMpCisgICsweDAwMTYgfCAxMCAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgfCAweDAwMTAgKDE2KSAgICAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYGJhcmAgKGlkOiA0KQorICArMHgwMDE4IHwgMTQgMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgIHwgMHgwMDE0ICgyMCkgICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBob21lYCAoaWQ6IDUpCisgICsweDAwMUEgfCAzMCAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgfCAweDAwMzAgKDQ4KSAgICAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYG5hbWVgIChpZDogNikKKyAgKzB4MDAxQyB8IDM0IDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICB8IDB4MDAzNCAoNTIpICAgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgYmFyc2AgKGlkOiA3KQorICArMHgwMDFFIHwgMDkgMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgIHwgMHgwMDA5ICg5KSAgICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBiYXJfYmF6X3R5cGVgIChpZDogOCkKKyAgKzB4MDAyMCB8IDM4IDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICB8IDB4MDAzOCAoNTYpICAgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgYmFyX2JhemAgKGlkOiA5KQorICArMHgwMDIyIHwgM0MgMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgIHwgMHgwMDNDICg2MCkgICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBhY2NvdW50c2AgKGlkOiAxMCkKKyAgKzB4MDAyNCB8IDQwIDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICB8IDB4MDA0MCAoNjQpICAgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgYm9iYCAoaWQ6IDExKQorICArMHgwMDI2IHwgNDQgMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgIHwgMHgwMDQ0ICg2OCkgICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBhbGljZWAgKGlkOiAxMikKKyAgKzB4MDAyOCB8IDAwIDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICB8IDB4MDAwMCAoMCkgICAgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgbWF5YmVfaTMyYCAoaWQ6IDEzKSA8ZGVmYXVsdHMgdG8gMD4gKEludCkKKyAgKzB4MDAyQSB8IDAwIDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICB8IDB4MDAwMCAoMCkgICAgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgZGVmYXVsdF9pMzJgIChpZDogMTQpIDxkZWZhdWx0cyB0byA0Mj4gKEludCkKKyAgKzB4MDAyQyB8IDQ4IDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICB8IDB4MDA0OCAoNzIpICAgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBganVzdF9pMzJgIChpZDogMTUpCisgICsweDAwMkUgfCA0QyAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgfCAweDAwNEMgKDc2KSAgICAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYG5hbWVzYCAoaWQ6IDE2KQorICArMHgwMDMwIHwgNTAgMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgIHwgMHgwMDUwICg4MCkgICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBwb2ludHNfb2ZfaW50ZXJlc3RgIChpZDogMTcpCisgICsweDAwMzIgfCA1NCAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgfCAweDAwNTQgKDg0KSAgICAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYGZvb2JhcnNfdHlwZWAgKGlkOiAxOCkKKyAgKzB4MDAzNCB8IDU4IDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICB8IDB4MDA1OCAoODgpICAgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgZm9vYmFyc2AgKGlkOiAxOSkKKyAgKzB4MDAzNiB8IDBBIDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICB8IDB4MDAwQSAoMTApICAgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgbWVhc3VyZW1lbnRfdHlwZWAgKGlkOiAyMCkKKyAgKzB4MDAzOCB8IDVDIDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICB8IDB4MDA1QyAoOTIpICAgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgbWVhc3VyZW1lbnRgIChpZDogMjEpCisgICsweDAwM0EgfCAwQiAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgfCAweDAwMEIgKDExKSAgICAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYGFueXRoaW5nX3R5cGVgIChpZDogMjIpCisgICsweDAwM0MgfCA2MCAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgfCAweDAwNjAgKDk2KSAgICAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYGFueXRoaW5nYCAoaWQ6IDIzKQorICArMHgwMDNFIHwgMDAgMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgIHwgMHgwMDAwICgwKSAgICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGB0ZW1wZXJhdHVyZWAgKGlkOiAyNCkgPGRlZmF1bHRzIHRvIDk4LjYwMDAwMD4gKEZsb2F0KQorICArMHgwMDQwIHwgMDAgMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgIHwgMHgwMDAwICgwKSAgICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGB0ZWV0b3RhbGVyYCAoaWQ6IDI1KSA8bnVsbD4gKE9iaikKKyAgKzB4MDA0MiB8IDY0IDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICB8IDB4MDA2NCAoMTAwKSAgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgY2hhcmxpZWAgKGlkOiAyNikKKworcm9vdF90YWJsZSAoQW5ub3RhdGVkQmluYXJ5LkZvbyk6CisgICsweDAwNDQgfCAzQSAwMCAwMCAwMCAgICAgICAgICAgICB8IFNPZmZzZXQzMiAgfCAweDAwMDAwMDNBICg1OCkgTG9jOiArMHgwMDBBICAgfCBvZmZzZXQgdG8gdnRhYmxlCisgICsweDAwNDggfCAwMCAwMCAwMCAgICAgICAgICAgICAgICB8IHVpbnQ4X3RbM10gfCAuLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBwYWRkaW5nCisgICsweDAwNEIgfCAwMSAgICAgICAgICAgICAgICAgICAgICB8IHVpbnQ4X3QgICAgfCAweDAxICgxKSAgICAgICAgICAgICAgICAgICAgICAgfCB0YWJsZSBmaWVsZCBgaGVhbHRoeWAgKEJvb2wpCisgICsweDAwNEMgfCAwMiAgICAgICAgICAgICAgICAgICAgICB8IHVpbnQ4X3QgICAgfCAweDAyICgyKSAgICAgICAgICAgICAgICAgICAgICAgfCB0YWJsZSBmaWVsZCBgbWVhbGAgKEJ5dGUpCisgICsweDAwNEQgfCAwMiAgICAgICAgICAgICAgICAgICAgICB8IFVUeXBlOCAgICAgfCAweDAyICgyKSAgICAgICAgICAgICAgICAgICAgICAgfCB0YWJsZSBmaWVsZCBgYmFyX2Jhel90eXBlYCAoVVR5cGUpCisgICsweDAwNEUgfCAwMSAgICAgICAgICAgICAgICAgICAgICB8IFVUeXBlOCAgICAgfCAweDAxICgxKSAgICAgICAgICAgICAgICAgICAgICAgfCB0YWJsZSBmaWVsZCBgbWVhc3VyZW1lbnRfdHlwZWAgKFVUeXBlKQorICArMHgwMDRGIHwgMDEgICAgICAgICAgICAgICAgICAgICAgfCBVVHlwZTggICAgIHwgMHgwMSAoMSkgICAgICAgICAgICAgICAgICAgICAgIHwgdGFibGUgZmllbGQgYGFueXRoaW5nX3R5cGVgIChVVHlwZSkKKyAgKzB4MDA1MCB8IEQyIDA0IDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICB8IDB4MDAwMDA0RDIgKDEyMzQpICAgICAgICAgICAgICB8IHRhYmxlIGZpZWxkIGBjb3VudGVyYCAoSW50KQorICArMHgwMDU0IHwgMjggMDIgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgIHwgMHgwMDAwMDIyOCAoNTUyKSBMb2M6ICsweDAyN0MgIHwgb2Zmc2V0IHRvIGZpZWxkIGBiYXJgICh0YWJsZSkKKyAgKzB4MDA1OCB8IDAxIDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICB8IDB4MDAwMDAwMDEgKDEpICAgICAgICAgICAgICAgICB8IHN0cnVjdCBmaWVsZCBgQW5ub3RhdGVkQmluYXJ5LkJ1aWxkaW5nLmZsb29yc2AgKEludCkKKyAgKzB4MDA1QyB8IDAyIDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICB8IDB4MDAwMDAwMDIgKDIpICAgICAgICAgICAgICAgICB8IHN0cnVjdCBmaWVsZCBgQW5ub3RhdGVkQmluYXJ5LkJ1aWxkaW5nLmRvb3JzYCAoSW50KQorICArMHgwMDYwIHwgMEMgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgIHwgMHgwMDAwMDAwQyAoMTIpICAgICAgICAgICAgICAgIHwgc3RydWN0IGZpZWxkIGBBbm5vdGF0ZWRCaW5hcnkuQnVpbGRpbmcud2luZG93c2AgKEludCkKKyAgKzB4MDA2NCB8IDBBIDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICB8IDB4MDAwMDAwMEEgKDEwKSAgICAgICAgICAgICAgICB8IGFycmF5IGZpZWxkIGBBbm5vdGF0ZWRCaW5hcnkuRGltZW5zaW9uLnZhbHVlc2BbMF0gKEludCkKKyAgKzB4MDA2OCB8IDBDIDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICB8IDB4MDAwMDAwMEMgKDEyKSAgICAgICAgICAgICAgICB8IGFycmF5IGZpZWxkIGBBbm5vdGF0ZWRCaW5hcnkuRGltZW5zaW9uLnZhbHVlc2BbMV0gKEludCkKKyAgKzB4MDA2QyB8IDE0IDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICB8IDB4MDAwMDAwMTQgKDIwKSAgICAgICAgICAgICAgICB8IGFycmF5IGZpZWxkIGBBbm5vdGF0ZWRCaW5hcnkuRGltZW5zaW9uLnZhbHVlc2BbMl0gKEludCkKKyAgKzB4MDA3MCB8IDAxICAgICAgICAgICAgICAgICAgICAgIHwgdWludDhfdCAgICB8IDB4MDEgKDEpICAgICAgICAgICAgICAgICAgICAgICB8IHN0cnVjdCBmaWVsZCBgQW5ub3RhdGVkQmluYXJ5LlRvbGVyYW5jZS53aWR0aGAgKFVCeXRlKQorICArMHgwMDcxIHwgMDIgICAgICAgICAgICAgICAgICAgICAgfCB1aW50OF90ICAgIHwgMHgwMiAoMikgICAgICAgICAgICAgICAgICAgICAgIHwgc3RydWN0IGZpZWxkIGBBbm5vdGF0ZWRCaW5hcnkuVG9sZXJhbmNlLndpZHRoYCAoVUJ5dGUpCisgICsweDAwNzIgfCAwMyAgICAgICAgICAgICAgICAgICAgICB8IHVpbnQ4X3QgICAgfCAweDAzICgzKSAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJ1Y3QgZmllbGQgYEFubm90YXRlZEJpbmFyeS5Ub2xlcmFuY2Uud2lkdGhgIChVQnl0ZSkKKyAgKzB4MDA3MyB8IDAwICAgICAgICAgICAgICAgICAgICAgIHwgdWludDhfdFsxXSB8IC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHBhZGRpbmcKKyAgKzB4MDA3NCB8IEM4IDAxIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICB8IDB4MDAwMDAxQzggKDQ1NikgTG9jOiArMHgwMjNDICB8IG9mZnNldCB0byBmaWVsZCBgbmFtZWAgKHN0cmluZykKKyAgKzB4MDA3OCB8IDVDIDAxIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICB8IDB4MDAwMDAxNUMgKDM0OCkgTG9jOiArMHgwMUQ0ICB8IG9mZnNldCB0byBmaWVsZCBgYmFyc2AgKHZlY3RvcikKKyAgKzB4MDA3QyB8IDUwIDAxIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICB8IDB4MDAwMDAxNTAgKDMzNikgTG9jOiArMHgwMUNDICB8IG9mZnNldCB0byBmaWVsZCBgYmFyX2JhemAgKHVuaW9uIG9mIHR5cGUgYEJhemApCisgICsweDAwODAgfCAzNCAwMSAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgfCAweDAwMDAwMTM0ICgzMDgpIExvYzogKzB4MDFCNCAgfCBvZmZzZXQgdG8gZmllbGQgYGFjY291bnRzYCAodmVjdG9yKQorICArMHgwMDg0IHwgMjQgMDEgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgIHwgMHgwMDAwMDEyNCAoMjkyKSBMb2M6ICsweDAxQTggIHwgb2Zmc2V0IHRvIGZpZWxkIGBib2JgIChzdHJpbmcpCisgICsweDAwODggfCAxNCAwMSAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgfCAweDAwMDAwMTE0ICgyNzYpIExvYzogKzB4MDE5QyAgfCBvZmZzZXQgdG8gZmllbGQgYGFsaWNlYCAoc3RyaW5nKQorICArMHgwMDhDIHwgMEQgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgIHwgMHgwMDAwMDAwRCAoMTMpICAgICAgICAgICAgICAgIHwgdGFibGUgZmllbGQgYGp1c3RfaTMyYCAoSW50KQorICArMHgwMDkwIHwgREMgMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgIHwgMHgwMDAwMDBEQyAoMjIwKSBMb2M6ICsweDAxNkMgIHwgb2Zmc2V0IHRvIGZpZWxkIGBuYW1lc2AgKHZlY3RvcikKKyAgKzB4MDA5NCB8IEEwIDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICB8IDB4MDAwMDAwQTAgKDE2MCkgTG9jOiArMHgwMTM0ICB8IG9mZnNldCB0byBmaWVsZCBgcG9pbnRzX29mX2ludGVyZXN0YCAodmVjdG9yKQorICArMHgwMDk4IHwgOTQgMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgIHwgMHgwMDAwMDA5NCAoMTQ4KSBMb2M6ICsweDAxMkMgIHwgb2Zmc2V0IHRvIGZpZWxkIGBmb29iYXJzX3R5cGVgICh2ZWN0b3IpCisgICsweDAwOUMgfCAzOCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgfCAweDAwMDAwMDM4ICg1NikgTG9jOiArMHgwMEQ0ICAgfCBvZmZzZXQgdG8gZmllbGQgYGZvb2JhcnNgICh2ZWN0b3IpCisgICsweDAwQTAgfCAzMyAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgfCAweDAwMDAwMDMzICg1MSkgTG9jOiArMHgwMEQzICAgfCBvZmZzZXQgdG8gZmllbGQgYG1lYXN1cmVtZW50YCAodW5pb24gb2YgdHlwZSBgVG9sZXJhbmNlYCkKKyAgKzB4MDBBNCB8IDFDIDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICB8IDB4MDAwMDAwMUMgKDI4KSBMb2M6ICsweDAwQzAgICB8IG9mZnNldCB0byBmaWVsZCBgYW55dGhpbmdgICh1bmlvbiBvZiB0eXBlIGBCYXJgKQorICArMHgwMEE4IHwgMDQgMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgIHwgMHgwMDAwMDAwNCAoNCkgTG9jOiArMHgwMEFDICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBjaGFybGllYCAoc3RyaW5nKQorCitzdHJpbmcgKEFubm90YXRlZEJpbmFyeS5Gb28uY2hhcmxpZSk6CisgICsweDAwQUMgfCAwNSAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgfCAweDAwMDAwMDA1ICg1KSAgICAgICAgICAgICAgICAgfCBsZW5ndGggb2Ygc3RyaW5nCisgICsweDAwQjAgfCA2MSA2QyA2OSA2MyA2NSAgICAgICAgICB8IGNoYXJbNV0gICAgfCBhbGljZSAgICAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJpbmcgbGl0ZXJhbAorICArMHgwMEI1IHwgMDAgICAgICAgICAgICAgICAgICAgICAgfCBjaGFyICAgICAgIHwgMHgwMCAoMCkgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nIHRlcm1pbmF0b3IKKworcGFkZGluZzoKKyAgKzB4MDBCNiB8IDAwIDAwICAgICAgICAgICAgICAgICAgIHwgdWludDhfdFsyXSB8IC4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHBhZGRpbmcKKwordnRhYmxlIChBbm5vdGF0ZWRCaW5hcnkuQmFyKToKKyAgKzB4MDBCOCB8IDA4IDAwICAgICAgICAgICAgICAgICAgIHwgdWludDE2X3QgICB8IDB4MDAwOCAoOCkgICAgICAgICAgICAgICAgICAgICB8IHNpemUgb2YgdGhpcyB2dGFibGUKKyAgKzB4MDBCQSB8IDEzIDAwICAgICAgICAgICAgICAgICAgIHwgdWludDE2X3QgICB8IDB4MDAxMyAoMTkpICAgICAgICAgICAgICAgICAgICB8IHNpemUgb2YgcmVmZXJyaW5nIHRhYmxlCisgICsweDAwQkMgfCAwOCAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgfCAweDAwMDggKDgpICAgICAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYGFgIChpZDogMCkKKyAgKzB4MDBCRSB8IDA0IDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICB8IDB4MDAwNCAoNCkgICAgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgYmAgKGlkOiAxKQorCit0YWJsZSAoQW5ub3RhdGVkQmluYXJ5LkJhcik6CisgICsweDAwQzAgfCAwOCAwMCAwMCAwMCAgICAgICAgICAgICB8IFNPZmZzZXQzMiAgfCAweDAwMDAwMDA4ICg4KSBMb2M6ICsweDAwQjggICAgfCBvZmZzZXQgdG8gdnRhYmxlCisgICsweDAwQzQgfCAwMCA4MCAyMyA0NCAgICAgICAgICAgICB8IGZsb2F0ICAgICAgfCAweDQ0MjM4MDAwICg2NTQpICAgICAgICAgICAgICAgfCB0YWJsZSBmaWVsZCBgYmAgKEZsb2F0KQorICArMHgwMEM4IHwgMDAgMDAgMDAgMDAgMDAgMTAgNzQgNDAgfCBkb3VibGUgICAgIHwgMHg0MDc0MTAwMDAwMDAwMDAwICgzMjEpICAgICAgIHwgdGFibGUgZmllbGQgYGFgIChEb3VibGUpCisgICsweDAwRDAgfCAwMCAwMCAwMCAgICAgICAgICAgICAgICB8IHVpbnQ4X3RbM10gfCAuLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBwYWRkaW5nCisKK3VuaW9uIChBbm5vdGF0ZWRCaW5hcnkuVG9sZXJhbmNlLm1lYXN1cmVtZW50KToKKyAgKzB4MDBEMyB8IDA1ICAgICAgICAgICAgICAgICAgICAgIHwgdWludDhfdCAgICB8IDB4MDUgKDUpICAgICAgICAgICAgICAgICAgICAgICB8IHN0cnVjdCBmaWVsZCBgQW5ub3RhdGVkQmluYXJ5LlRvbGVyYW5jZS53aWR0aGAgKFVCeXRlKQorCit2ZWN0b3IgKEFubm90YXRlZEJpbmFyeS5Gb28uZm9vYmFycyk6CisgICsweDAwRDQgfCAwMyAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgfCAweDAwMDAwMDAzICgzKSAgICAgICAgICAgICAgICAgfCBsZW5ndGggb2YgdmVjdG9yICgjIGl0ZW1zKQorICArMHgwMEQ4IHwgMzQgMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgIHwgMHgwMDAwMDAzNCAoNTIpIExvYzogKzB4MDEwQyAgIHwgb2Zmc2V0IHRvIHVuaW9uWzBdIChgQmFyYCkKKyAgKzB4MDBEQyB8IDJDIDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICB8IDB4MDAwMDAwMkMgKDQ0KSBMb2M6ICsweDAxMDggICB8IG9mZnNldCB0byB1bmlvblsxXSAoYEJhemApCisgICsweDAwRTAgfCAwNCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgfCAweDAwMDAwMDA0ICg0KSBMb2M6ICsweDAwRTQgICAgfCBvZmZzZXQgdG8gdW5pb25bMl0gKGBCYXJgKQorCit0YWJsZSAoQW5ub3RhdGVkQmluYXJ5LkJhcik6CisgICsweDAwRTQgfCBEMiBGRSBGRiBGRiAgICAgICAgICAgICB8IFNPZmZzZXQzMiAgfCAweEZGRkZGRUQyICgtMzAyKSBMb2M6ICsweDAyMTIgfCBvZmZzZXQgdG8gdnRhYmxlCisgICsweDAwRTggfCAwMCA4MCAyMyA0NCAgICAgICAgICAgICB8IGZsb2F0ICAgICAgfCAweDQ0MjM4MDAwICg2NTQpICAgICAgICAgICAgICAgfCB0YWJsZSBmaWVsZCBgYmAgKEZsb2F0KQorICArMHgwMEVDIHwgMTAgMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgIHwgMHgwMDAwMDAxMCAoMTYpIExvYzogKzB4MDBGQyAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBjYCAodGFibGUpCisgICsweDAwRjAgfCAwMCAwMCAwMCAwMCAwMCBEOCA4RSA0MCB8IGRvdWJsZSAgICAgfCAweDQwOEVEODAwMDAwMDAwMDAgKDk4NykgICAgICAgfCB0YWJsZSBmaWVsZCBgYWAgKERvdWJsZSkKKyAgKzB4MDBGOCB8IDAwIDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDhfdFs0XSB8IC4uLi4gICAgICAgICAgICAgICAgICAgICAgICAgICB8IHBhZGRpbmcKKwordGFibGUgKEFubm90YXRlZEJpbmFyeS5CYXopOgorICArMHgwMEZDIHwgNkEgRkUgRkYgRkYgICAgICAgICAgICAgfCBTT2Zmc2V0MzIgIHwgMHhGRkZGRkU2QSAoLTQwNikgTG9jOiArMHgwMjkyIHwgb2Zmc2V0IHRvIHZ0YWJsZQorICArMHgwMTAwIHwgMDAgMDAgMDAgICAgICAgICAgICAgICAgfCB1aW50OF90WzNdIHwgLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgcGFkZGluZworICArMHgwMTAzIHwgMDMgICAgICAgICAgICAgICAgICAgICAgfCB1aW50OF90ICAgIHwgMHgwMyAoMykgICAgICAgICAgICAgICAgICAgICAgIHwgdGFibGUgZmllbGQgYG1lYWxgIChCeXRlKQorCit2dGFibGUgKEFubm90YXRlZEJpbmFyeS5CYXopOgorICArMHgwMTA0IHwgMDQgMDAgICAgICAgICAgICAgICAgICAgfCB1aW50MTZfdCAgIHwgMHgwMDA0ICg0KSAgICAgICAgICAgICAgICAgICAgIHwgc2l6ZSBvZiB0aGlzIHZ0YWJsZQorICArMHgwMTA2IHwgMDQgMDAgICAgICAgICAgICAgICAgICAgfCB1aW50MTZfdCAgIHwgMHgwMDA0ICg0KSAgICAgICAgICAgICAgICAgICAgIHwgc2l6ZSBvZiByZWZlcnJpbmcgdGFibGUKKwordGFibGUgKEFubm90YXRlZEJpbmFyeS5CYXopOgorICArMHgwMTA4IHwgMDQgMDAgMDAgMDAgICAgICAgICAgICAgfCBTT2Zmc2V0MzIgIHwgMHgwMDAwMDAwNCAoNCkgTG9jOiArMHgwMTA0ICAgIHwgb2Zmc2V0IHRvIHZ0YWJsZQorCit0YWJsZSAoQW5ub3RhdGVkQmluYXJ5LkJhcik6CisgICsweDAxMEMgfCBGQSBGRSBGRiBGRiAgICAgICAgICAgICB8IFNPZmZzZXQzMiAgfCAweEZGRkZGRUZBICgtMjYyKSBMb2M6ICsweDAyMTIgfCBvZmZzZXQgdG8gdnRhYmxlCisgICsweDAxMTAgfCAwMCAwMCBFNCA0MyAgICAgICAgICAgICB8IGZsb2F0ICAgICAgfCAweDQzRTQwMDAwICg0NTYpICAgICAgICAgICAgICAgfCB0YWJsZSBmaWVsZCBgYmAgKEZsb2F0KQorICArMHgwMTE0IHwgMTAgMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgIHwgMHgwMDAwMDAxMCAoMTYpIExvYzogKzB4MDEyNCAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBjYCAodGFibGUpCisgICsweDAxMTggfCAwMCAwMCAwMCAwMCAwMCBDMCA1RSA0MCB8IGRvdWJsZSAgICAgfCAweDQwNUVDMDAwMDAwMDAwMDAgKDEyMykgICAgICAgfCB0YWJsZSBmaWVsZCBgYWAgKERvdWJsZSkKKyAgKzB4MDEyMCB8IDAwIDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDhfdFs0XSB8IC4uLi4gICAgICAgICAgICAgICAgICAgICAgICAgICB8IHBhZGRpbmcKKwordGFibGUgKEFubm90YXRlZEJpbmFyeS5CYXopOgorICArMHgwMTI0IHwgOTIgRkUgRkYgRkYgICAgICAgICAgICAgfCBTT2Zmc2V0MzIgIHwgMHhGRkZGRkU5MiAoLTM2NikgTG9jOiArMHgwMjkyIHwgb2Zmc2V0IHRvIHZ0YWJsZQorICArMHgwMTI4IHwgMDAgMDAgMDAgICAgICAgICAgICAgICAgfCB1aW50OF90WzNdIHwgLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgcGFkZGluZworICArMHgwMTJCIHwgMDEgICAgICAgICAgICAgICAgICAgICAgfCB1aW50OF90ICAgIHwgMHgwMSAoMSkgICAgICAgICAgICAgICAgICAgICAgIHwgdGFibGUgZmllbGQgYG1lYWxgIChCeXRlKQorCit2ZWN0b3IgKEFubm90YXRlZEJpbmFyeS5Gb28uZm9vYmFyc190eXBlKToKKyAgKzB4MDEyQyB8IDAzIDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICB8IDB4MDAwMDAwMDMgKDMpICAgICAgICAgICAgICAgICB8IGxlbmd0aCBvZiB2ZWN0b3IgKCMgaXRlbXMpCisgICsweDAxMzAgfCAwMSAgICAgICAgICAgICAgICAgICAgICB8IFVUeXBlOCAgICAgfCAweDAxICgxKSAgICAgICAgICAgICAgICAgICAgICAgfCB2YWx1ZVswXQorICArMHgwMTMxIHwgMDIgICAgICAgICAgICAgICAgICAgICAgfCBVVHlwZTggICAgIHwgMHgwMiAoMikgICAgICAgICAgICAgICAgICAgICAgIHwgdmFsdWVbMV0KKyAgKzB4MDEzMiB8IDAxICAgICAgICAgICAgICAgICAgICAgIHwgVVR5cGU4ICAgICB8IDB4MDEgKDEpICAgICAgICAgICAgICAgICAgICAgICB8IHZhbHVlWzJdCisKK3ZlY3RvciAoQW5ub3RhdGVkQmluYXJ5LkZvby5wb2ludHNfb2ZfaW50ZXJlc3QpOgorICArMHgwMTM0IHwgMDMgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgIHwgMHgwMDAwMDAwMyAoMykgICAgICAgICAgICAgICAgIHwgbGVuZ3RoIG9mIHZlY3RvciAoIyBpdGVtcykKKyAgKzB4MDEzOCB8IDMzIDMzIDMzIDMzIDMzIEEzIDQ1IDQwIHwgZG91YmxlICAgICB8IDB4NDA0NUEzMzMzMzMzMzMzMyAoNDMuMjc1KSAgICB8IHN0cnVjdCBmaWVsZCBgQW5ub3RhdGVkQmluYXJ5LkxvY2F0aW9uLmxhdGl0dWRlYCAoRG91YmxlKQorICArMHgwMTQwIHwgN0UgNTcgMDQgRkYgNUIgODcgNTMgQzAgfCBkb3VibGUgICAgIHwgMHhDMDUzODc1QkZGMDQ1NzdFICgtNzguMTE1KSAgIHwgc3RydWN0IGZpZWxkIGBBbm5vdGF0ZWRCaW5hcnkuTG9jYXRpb24ubG9uZ2l0dWRlYCAoRG91YmxlKQorICArMHgwMTQ4IHwgOEQgRjAgRjYgMjAgMDQgQjYgNDIgNDAgfCBkb3VibGUgICAgIHwgMHg0MDQyQjYwNDIwRjZGMDhEICgzNy40MjIpICAgIHwgc3RydWN0IGZpZWxkIGBBbm5vdGF0ZWRCaW5hcnkuTG9jYXRpb24ubGF0aXR1ZGVgIChEb3VibGUpCisgICsweDAxNTAgfCA5RiA3NyA2MyA0MSA2MSA4NSA1RSBDMCB8IGRvdWJsZSAgICAgfCAweEMwNUU4NTYxNDE2Mzc3OUYgKC0xMjIuMDg0KSAgfCBzdHJ1Y3QgZmllbGQgYEFubm90YXRlZEJpbmFyeS5Mb2NhdGlvbi5sb25naXR1ZGVgIChEb3VibGUpCisgICsweDAxNTggfCA4RiAzNSAyMyA4MyBEQyAzNSA0QiBDMCB8IGRvdWJsZSAgICAgfCAweEMwNEIzNURDODMyMzM1OEYgKC01NC40MjA4KSAgfCBzdHJ1Y3QgZmllbGQgYEFubm90YXRlZEJpbmFyeS5Mb2NhdGlvbi5sYXRpdHVkZWAgKERvdWJsZSkKKyAgKzB4MDE2MCB8IEY2IDk3IEREIDkzIDg3IEM1IDBBIDQwIHwgZG91YmxlICAgICB8IDB4NDAwQUM1ODc5M0REOTdGNiAoMy4zNDY0NSkgICB8IHN0cnVjdCBmaWVsZCBgQW5ub3RhdGVkQmluYXJ5LkxvY2F0aW9uLmxvbmdpdHVkZWAgKERvdWJsZSkKKworcGFkZGluZzoKKyAgKzB4MDE2OCB8IDAwIDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDhfdFs0XSB8IC4uLi4gICAgICAgICAgICAgICAgICAgICAgICAgICB8IHBhZGRpbmcKKwordmVjdG9yIChBbm5vdGF0ZWRCaW5hcnkuRm9vLm5hbWVzKToKKyAgKzB4MDE2QyB8IDAzIDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICB8IDB4MDAwMDAwMDMgKDMpICAgICAgICAgICAgICAgICB8IGxlbmd0aCBvZiB2ZWN0b3IgKCMgaXRlbXMpCisgICsweDAxNzAgfCAyMCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgfCAweDAwMDAwMDIwICgzMikgTG9jOiArMHgwMTkwICAgfCBvZmZzZXQgdG8gc3RyaW5nWzBdCisgICsweDAxNzQgfCAxNCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgfCAweDAwMDAwMDE0ICgyMCkgTG9jOiArMHgwMTg4ICAgfCBvZmZzZXQgdG8gc3RyaW5nWzFdCisgICsweDAxNzggfCAwNCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgfCAweDAwMDAwMDA0ICg0KSBMb2M6ICsweDAxN0MgICAgfCBvZmZzZXQgdG8gc3RyaW5nWzJdCisKK3N0cmluZyAoQW5ub3RhdGVkQmluYXJ5LkZvby5uYW1lcyk6CisgICsweDAxN0MgfCAwNyAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgfCAweDAwMDAwMDA3ICg3KSAgICAgICAgICAgICAgICAgfCBsZW5ndGggb2Ygc3RyaW5nCisgICsweDAxODAgfCA2MyA2OCA2MSA3MiA2QyA2OSA2NSAgICB8IGNoYXJbN10gICAgfCBjaGFybGllICAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJpbmcgbGl0ZXJhbAorICArMHgwMTg3IHwgMDAgICAgICAgICAgICAgICAgICAgICAgfCBjaGFyICAgICAgIHwgMHgwMCAoMCkgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nIHRlcm1pbmF0b3IKKworc3RyaW5nIChBbm5vdGF0ZWRCaW5hcnkuRm9vLm5hbWVzKToKKyAgKzB4MDE4OCB8IDAzIDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICB8IDB4MDAwMDAwMDMgKDMpICAgICAgICAgICAgICAgICB8IGxlbmd0aCBvZiBzdHJpbmcKKyAgKzB4MDE4QyB8IDYyIDZGIDYyICAgICAgICAgICAgICAgIHwgY2hhclszXSAgICB8IGJvYiAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHN0cmluZyBsaXRlcmFsCisgICsweDAxOEYgfCAwMCAgICAgICAgICAgICAgICAgICAgICB8IGNoYXIgICAgICAgfCAweDAwICgwKSAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJpbmcgdGVybWluYXRvcgorCitzdHJpbmcgKEFubm90YXRlZEJpbmFyeS5Gb28ubmFtZXMpOgorICArMHgwMTkwIHwgMDUgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgIHwgMHgwMDAwMDAwNSAoNSkgICAgICAgICAgICAgICAgIHwgbGVuZ3RoIG9mIHN0cmluZworICArMHgwMTk0IHwgNjEgNkMgNjkgNjMgNjUgICAgICAgICAgfCBjaGFyWzVdICAgIHwgYWxpY2UgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nIGxpdGVyYWwKKyAgKzB4MDE5OSB8IDAwICAgICAgICAgICAgICAgICAgICAgIHwgY2hhciAgICAgICB8IDB4MDAgKDApICAgICAgICAgICAgICAgICAgICAgICB8IHN0cmluZyB0ZXJtaW5hdG9yCisKK3BhZGRpbmc6CisgICsweDAxOUEgfCAwMCAwMCAgICAgICAgICAgICAgICAgICB8IHVpbnQ4X3RbMl0gfCAuLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBwYWRkaW5nCisKK3N0cmluZyAoQW5ub3RhdGVkQmluYXJ5LkZvby5hbGljZSk6CisgICsweDAxOUMgfCAwNyAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgfCAweDAwMDAwMDA3ICg3KSAgICAgICAgICAgICAgICAgfCBsZW5ndGggb2Ygc3RyaW5nCisgICsweDAxQTAgfCA2MyA2OCA2MSA3MiA2QyA2OSA2NSAgICB8IGNoYXJbN10gICAgfCBjaGFybGllICAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJpbmcgbGl0ZXJhbAorICArMHgwMUE3IHwgMDAgICAgICAgICAgICAgICAgICAgICAgfCBjaGFyICAgICAgIHwgMHgwMCAoMCkgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nIHRlcm1pbmF0b3IKKworc3RyaW5nIChBbm5vdGF0ZWRCaW5hcnkuRm9vLmJvYik6CisgICsweDAxQTggfCAwNyAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgfCAweDAwMDAwMDA3ICg3KSAgICAgICAgICAgICAgICAgfCBsZW5ndGggb2Ygc3RyaW5nCisgICsweDAxQUMgfCA2MyA2OCA2MSA3MiA2QyA2OSA2NSAgICB8IGNoYXJbN10gICAgfCBjaGFybGllICAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJpbmcgbGl0ZXJhbAorICArMHgwMUIzIHwgMDAgICAgICAgICAgICAgICAgICAgICAgfCBjaGFyICAgICAgIHwgMHgwMCAoMCkgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nIHRlcm1pbmF0b3IKKwordmVjdG9yIChBbm5vdGF0ZWRCaW5hcnkuRm9vLmFjY291bnRzKToKKyAgKzB4MDFCNCB8IDA5IDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICB8IDB4MDAwMDAwMDkgKDkpICAgICAgICAgICAgICAgICB8IGxlbmd0aCBvZiB2ZWN0b3IgKCMgaXRlbXMpCisgICsweDAxQjggfCAwOSAwMCAgICAgICAgICAgICAgICAgICB8IHVpbnQxNl90ICAgfCAweDAwMDkgKDkpICAgICAgICAgICAgICAgICAgICAgfCB2YWx1ZVswXQorICArMHgwMUJBIHwgMDggMDAgICAgICAgICAgICAgICAgICAgfCB1aW50MTZfdCAgIHwgMHgwMDA4ICg4KSAgICAgICAgICAgICAgICAgICAgIHwgdmFsdWVbMV0KKyAgKzB4MDFCQyB8IDA3IDAwICAgICAgICAgICAgICAgICAgIHwgdWludDE2X3QgICB8IDB4MDAwNyAoNykgICAgICAgICAgICAgICAgICAgICB8IHZhbHVlWzJdCisgICsweDAxQkUgfCAwMSAwMCAgICAgICAgICAgICAgICAgICB8IHVpbnQxNl90ICAgfCAweDAwMDEgKDEpICAgICAgICAgICAgICAgICAgICAgfCB2YWx1ZVszXQorICArMHgwMUMwIHwgMDIgMDAgICAgICAgICAgICAgICAgICAgfCB1aW50MTZfdCAgIHwgMHgwMDAyICgyKSAgICAgICAgICAgICAgICAgICAgIHwgdmFsdWVbNF0KKyAgKzB4MDFDMiB8IDAzIDAwICAgICAgICAgICAgICAgICAgIHwgdWludDE2X3QgICB8IDB4MDAwMyAoMykgICAgICAgICAgICAgICAgICAgICB8IHZhbHVlWzVdCisgICsweDAxQzQgfCAwNiAwMCAgICAgICAgICAgICAgICAgICB8IHVpbnQxNl90ICAgfCAweDAwMDYgKDYpICAgICAgICAgICAgICAgICAgICAgfCB2YWx1ZVs2XQorICArMHgwMUM2IHwgMDUgMDAgICAgICAgICAgICAgICAgICAgfCB1aW50MTZfdCAgIHwgMHgwMDA1ICg1KSAgICAgICAgICAgICAgICAgICAgIHwgdmFsdWVbN10KKyAgKzB4MDFDOCB8IDA0IDAwICAgICAgICAgICAgICAgICAgIHwgdWludDE2X3QgICB8IDB4MDAwNCAoNCkgICAgICAgICAgICAgICAgICAgICB8IHZhbHVlWzhdCisKK3BhZGRpbmc6CisgICsweDAxQ0EgfCAwMCAwMCAgICAgICAgICAgICAgICAgICB8IHVpbnQ4X3RbMl0gfCAuLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBwYWRkaW5nCisKK3RhYmxlIChBbm5vdGF0ZWRCaW5hcnkuQmF6KToKKyAgKzB4MDFDQyB8IDNBIEZGIEZGIEZGICAgICAgICAgICAgIHwgU09mZnNldDMyICB8IDB4RkZGRkZGM0EgKC0xOTgpIExvYzogKzB4MDI5MiB8IG9mZnNldCB0byB2dGFibGUKKyAgKzB4MDFEMCB8IDAwIDAwIDAwICAgICAgICAgICAgICAgIHwgdWludDhfdFszXSB8IC4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHBhZGRpbmcKKyAgKzB4MDFEMyB8IDAzICAgICAgICAgICAgICAgICAgICAgIHwgdWludDhfdCAgICB8IDB4MDMgKDMpICAgICAgICAgICAgICAgICAgICAgICB8IHRhYmxlIGZpZWxkIGBtZWFsYCAoQnl0ZSkKKwordmVjdG9yIChBbm5vdGF0ZWRCaW5hcnkuRm9vLmJhcnMpOgorICArMHgwMUQ0IHwgMDIgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgIHwgMHgwMDAwMDAwMiAoMikgICAgICAgICAgICAgICAgIHwgbGVuZ3RoIG9mIHZlY3RvciAoIyBpdGVtcykKKyAgKzB4MDFEOCB8IDQ0IDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICB8IDB4MDAwMDAwNDQgKDY4KSBMb2M6ICsweDAyMUMgICB8IG9mZnNldCB0byB0YWJsZVswXQorICArMHgwMURDIHwgMTAgMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgIHwgMHgwMDAwMDAxMCAoMTYpIExvYzogKzB4MDFFQyAgIHwgb2Zmc2V0IHRvIHRhYmxlWzFdCisKK3BhZGRpbmc6CisgICsweDAxRTAgfCAwMCAwMCAgICAgICAgICAgICAgICAgICB8IHVpbnQ4X3RbMl0gfCAuLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBwYWRkaW5nCisKK3Z0YWJsZSAoQW5ub3RhdGVkQmluYXJ5LkJhcik6CisgICsweDAxRTIgfCAwQSAwMCAgICAgICAgICAgICAgICAgICB8IHVpbnQxNl90ICAgfCAweDAwMEEgKDEwKSAgICAgICAgICAgICAgICAgICAgfCBzaXplIG9mIHRoaXMgdnRhYmxlCisgICsweDAxRTQgfCAxQSAwMCAgICAgICAgICAgICAgICAgICB8IHVpbnQxNl90ICAgfCAweDAwMUEgKDI2KSAgICAgICAgICAgICAgICAgICAgfCBzaXplIG9mIHJlZmVycmluZyB0YWJsZQorICArMHgwMUU2IHwgMEMgMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgIHwgMHgwMDBDICgxMikgICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBhYCAoaWQ6IDApCisgICsweDAxRTggfCAwNCAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgfCAweDAwMDQgKDQpICAgICAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYGJgIChpZDogMSkKKyAgKzB4MDFFQSB8IDA4IDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICB8IDB4MDAwOCAoOCkgICAgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgY2AgKGlkOiAyKQorCit0YWJsZSAoQW5ub3RhdGVkQmluYXJ5LkJhcik6CisgICsweDAxRUMgfCAwQSAwMCAwMCAwMCAgICAgICAgICAgICB8IFNPZmZzZXQzMiAgfCAweDAwMDAwMDBBICgxMCkgTG9jOiArMHgwMUUyICAgfCBvZmZzZXQgdG8gdnRhYmxlCisgICsweDAxRjAgfCAwMCA4MCAyMyA0NCAgICAgICAgICAgICB8IGZsb2F0ICAgICAgfCAweDQ0MjM4MDAwICg2NTQpICAgICAgICAgICAgICAgfCB0YWJsZSBmaWVsZCBgYmAgKEZsb2F0KQorICArMHgwMUY0IHwgMTggMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgIHwgMHgwMDAwMDAxOCAoMjQpIExvYzogKzB4MDIwQyAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBjYCAodGFibGUpCisgICsweDAxRjggfCAwMCAwMCAwMCAwMCAwMCBEOCA4RSA0MCB8IGRvdWJsZSAgICAgfCAweDQwOEVEODAwMDAwMDAwMDAgKDk4NykgICAgICAgfCB0YWJsZSBmaWVsZCBgYWAgKERvdWJsZSkKKyAgKzB4MDIwMCB8IDAwIDAwIDAwIDAwIDAwIDAwICAgICAgIHwgdWludDhfdFs2XSB8IC4uLi4uLiAgICAgICAgICAgICAgICAgICAgICAgICB8IHBhZGRpbmcKKwordnRhYmxlIChBbm5vdGF0ZWRCaW5hcnkuQmF6KToKKyAgKzB4MDIwNiB8IDA2IDAwICAgICAgICAgICAgICAgICAgIHwgdWludDE2X3QgICB8IDB4MDAwNiAoNikgICAgICAgICAgICAgICAgICAgICB8IHNpemUgb2YgdGhpcyB2dGFibGUKKyAgKzB4MDIwOCB8IDA2IDAwICAgICAgICAgICAgICAgICAgIHwgdWludDE2X3QgICB8IDB4MDAwNiAoNikgICAgICAgICAgICAgICAgICAgICB8IHNpemUgb2YgcmVmZXJyaW5nIHRhYmxlCisgICsweDAyMEEgfCAwNSAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgfCAweDAwMDUgKDUpICAgICAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYG1lYWxgIChpZDogMCkKKwordGFibGUgKEFubm90YXRlZEJpbmFyeS5CYXopOgorICArMHgwMjBDIHwgMDYgMDAgMDAgMDAgICAgICAgICAgICAgfCBTT2Zmc2V0MzIgIHwgMHgwMDAwMDAwNiAoNikgTG9jOiArMHgwMjA2ICAgIHwgb2Zmc2V0IHRvIHZ0YWJsZQorICArMHgwMjEwIHwgMDAgICAgICAgICAgICAgICAgICAgICAgfCB1aW50OF90WzFdIHwgLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgcGFkZGluZworICArMHgwMjExIHwgMDMgICAgICAgICAgICAgICAgICAgICAgfCB1aW50OF90ICAgIHwgMHgwMyAoMykgICAgICAgICAgICAgICAgICAgICAgIHwgdGFibGUgZmllbGQgYG1lYWxgIChCeXRlKQorCit2dGFibGUgKEFubm90YXRlZEJpbmFyeS5CYXIpOgorICArMHgwMjEyIHwgMEEgMDAgICAgICAgICAgICAgICAgICAgfCB1aW50MTZfdCAgIHwgMHgwMDBBICgxMCkgICAgICAgICAgICAgICAgICAgIHwgc2l6ZSBvZiB0aGlzIHZ0YWJsZQorICArMHgwMjE0IHwgMTggMDAgICAgICAgICAgICAgICAgICAgfCB1aW50MTZfdCAgIHwgMHgwMDE4ICgyNCkgICAgICAgICAgICAgICAgICAgIHwgc2l6ZSBvZiByZWZlcnJpbmcgdGFibGUKKyAgKzB4MDIxNiB8IDBDIDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICB8IDB4MDAwQyAoMTIpICAgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgYWAgKGlkOiAwKQorICArMHgwMjE4IHwgMDQgMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgIHwgMHgwMDA0ICg0KSAgICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBiYCAoaWQ6IDEpCisgICsweDAyMUEgfCAwOCAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgfCAweDAwMDggKDgpICAgICAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYGNgIChpZDogMikKKwordGFibGUgKEFubm90YXRlZEJpbmFyeS5CYXIpOgorICArMHgwMjFDIHwgMEEgMDAgMDAgMDAgICAgICAgICAgICAgfCBTT2Zmc2V0MzIgIHwgMHgwMDAwMDAwQSAoMTApIExvYzogKzB4MDIxMiAgIHwgb2Zmc2V0IHRvIHZ0YWJsZQorICArMHgwMjIwIHwgMDAgMDAgRTQgNDMgICAgICAgICAgICAgfCBmbG9hdCAgICAgIHwgMHg0M0U0MDAwMCAoNDU2KSAgICAgICAgICAgICAgIHwgdGFibGUgZmllbGQgYGJgIChGbG9hdCkKKyAgKzB4MDIyNCB8IDEwIDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICB8IDB4MDAwMDAwMTAgKDE2KSBMb2M6ICsweDAyMzQgICB8IG9mZnNldCB0byBmaWVsZCBgY2AgKHRhYmxlKQorICArMHgwMjI4IHwgMDAgMDAgMDAgMDAgMDAgQzAgNUUgNDAgfCBkb3VibGUgICAgIHwgMHg0MDVFQzAwMDAwMDAwMDAwICgxMjMpICAgICAgIHwgdGFibGUgZmllbGQgYGFgIChEb3VibGUpCisgICsweDAyMzAgfCAwMCAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQ4X3RbNF0gfCAuLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBwYWRkaW5nCisKK3RhYmxlIChBbm5vdGF0ZWRCaW5hcnkuQmF6KToKKyAgKzB4MDIzNCB8IEEyIEZGIEZGIEZGICAgICAgICAgICAgIHwgU09mZnNldDMyICB8IDB4RkZGRkZGQTIgKC05NCkgTG9jOiArMHgwMjkyICB8IG9mZnNldCB0byB2dGFibGUKKyAgKzB4MDIzOCB8IDAwIDAwIDAwICAgICAgICAgICAgICAgIHwgdWludDhfdFszXSB8IC4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHBhZGRpbmcKKyAgKzB4MDIzQiB8IDAxICAgICAgICAgICAgICAgICAgICAgIHwgdWludDhfdCAgICB8IDB4MDEgKDEpICAgICAgICAgICAgICAgICAgICAgICB8IHRhYmxlIGZpZWxkIGBtZWFsYCAoQnl0ZSkKKworc3RyaW5nIChBbm5vdGF0ZWRCaW5hcnkuRm9vLm5hbWUpOgorICArMHgwMjNDIHwgMkYgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgIHwgMHgwMDAwMDAyRiAoNDcpICAgICAgICAgICAgICAgIHwgbGVuZ3RoIG9mIHN0cmluZworICArMHgwMjQwIHwgNTQgNjggNjkgNzMgMjAgNjkgNzMgMjAgfCBjaGFyWzQ3XSAgIHwgVGhpcyBpcyAgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nIGxpdGVyYWwKKyAgKzB4MDI0OCB8IDYxIDIwIDZDIDZGIDZFIDY3IDIwIDczIHwgICAgICAgICAgICB8IGEgbG9uZyBzCisgICsweDAyNTAgfCA3NCA3MiA2OSA2RSA2NyAyMCA3NCA2RiB8ICAgICAgICAgICAgfCB0cmluZyB0bworICArMHgwMjU4IHwgMjAgNzMgNjggNkYgNzcgMjAgNjggNkYgfCAgICAgICAgICAgIHwgIHNob3cgaG8KKyAgKzB4MDI2MCB8IDc3IDIwIDY5IDc0IDIwIDYyIDcyIDY1IHwgICAgICAgICAgICB8IHcgaXQgYnJlCisgICsweDAyNjggfCA2MSA2QiA3MyAyMCA3NSA3MCAyRSAgICB8ICAgICAgICAgICAgfCBha3MgdXAuCisgICsweDAyNkYgfCAwMCAgICAgICAgICAgICAgICAgICAgICB8IGNoYXIgICAgICAgfCAweDAwICgwKSAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJpbmcgdGVybWluYXRvcgorCitwYWRkaW5nOgorICArMHgwMjcwIHwgMDAgMDAgICAgICAgICAgICAgICAgICAgfCB1aW50OF90WzJdIHwgLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgcGFkZGluZworCit2dGFibGUgKEFubm90YXRlZEJpbmFyeS5CYXIpOgorICArMHgwMjcyIHwgMEEgMDAgICAgICAgICAgICAgICAgICAgfCB1aW50MTZfdCAgIHwgMHgwMDBBICgxMCkgICAgICAgICAgICAgICAgICAgIHwgc2l6ZSBvZiB0aGlzIHZ0YWJsZQorICArMHgwMjc0IHwgMTYgMDAgICAgICAgICAgICAgICAgICAgfCB1aW50MTZfdCAgIHwgMHgwMDE2ICgyMikgICAgICAgICAgICAgICAgICAgIHwgc2l6ZSBvZiByZWZlcnJpbmcgdGFibGUKKyAgKzB4MDI3NiB8IDBDIDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICB8IDB4MDAwQyAoMTIpICAgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgYWAgKGlkOiAwKQorICArMHgwMjc4IHwgMDQgMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgIHwgMHgwMDA0ICg0KSAgICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBiYCAoaWQ6IDEpCisgICsweDAyN0EgfCAwOCAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgfCAweDAwMDggKDgpICAgICAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYGNgIChpZDogMikKKwordGFibGUgKEFubm90YXRlZEJpbmFyeS5CYXIpOgorICArMHgwMjdDIHwgMEEgMDAgMDAgMDAgICAgICAgICAgICAgfCBTT2Zmc2V0MzIgIHwgMHgwMDAwMDAwQSAoMTApIExvYzogKzB4MDI3MiAgIHwgb2Zmc2V0IHRvIHZ0YWJsZQorICArMHgwMjgwIHwgNjUgMjAgNzEgNDkgICAgICAgICAgICAgfCBmbG9hdCAgICAgIHwgMHg0OTcxMjA2NSAoOTg3NjU0KSAgICAgICAgICAgIHwgdGFibGUgZmllbGQgYGJgIChGbG9hdCkKKyAgKzB4MDI4NCB8IDE0IDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICB8IDB4MDAwMDAwMTQgKDIwKSBMb2M6ICsweDAyOTggICB8IG9mZnNldCB0byBmaWVsZCBgY2AgKHRhYmxlKQorICArMHgwMjg4IHwgQzkgNzYgQkUgOUYgMEMgMjQgRkUgNDAgfCBkb3VibGUgICAgIHwgMHg0MEZFMjQwQzlGQkU3NkM5ICgxMjM0NTcpICAgIHwgdGFibGUgZmllbGQgYGFgIChEb3VibGUpCisgICsweDAyOTAgfCAwMCAwMCAgICAgICAgICAgICAgICAgICB8IHVpbnQ4X3RbMl0gfCAuLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBwYWRkaW5nCisKK3Z0YWJsZSAoQW5ub3RhdGVkQmluYXJ5LkJheik6CisgICsweDAyOTIgfCAwNiAwMCAgICAgICAgICAgICAgICAgICB8IHVpbnQxNl90ICAgfCAweDAwMDYgKDYpICAgICAgICAgICAgICAgICAgICAgfCBzaXplIG9mIHRoaXMgdnRhYmxlCisgICsweDAyOTQgfCAwOCAwMCAgICAgICAgICAgICAgICAgICB8IHVpbnQxNl90ICAgfCAweDAwMDggKDgpICAgICAgICAgICAgICAgICAgICAgfCBzaXplIG9mIHJlZmVycmluZyB0YWJsZQorICArMHgwMjk2IHwgMDcgMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgIHwgMHgwMDA3ICg3KSAgICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBtZWFsYCAoaWQ6IDApCisKK3RhYmxlIChBbm5vdGF0ZWRCaW5hcnkuQmF6KToKKyAgKzB4MDI5OCB8IDA2IDAwIDAwIDAwICAgICAgICAgICAgIHwgU09mZnNldDMyICB8IDB4MDAwMDAwMDYgKDYpIExvYzogKzB4MDI5MiAgICB8IG9mZnNldCB0byB2dGFibGUKKyAgKzB4MDI5QyB8IDAwIDAwIDAwICAgICAgICAgICAgICAgIHwgdWludDhfdFszXSB8IC4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHBhZGRpbmcKKyAgKzB4MDI5RiB8IDAxICAgICAgICAgICAgICAgICAgICAgIHwgdWludDhfdCAgICB8IDB4MDEgKDEpICAgICAgICAgICAgICAgICAgICAgICB8IHRhYmxlIGZpZWxkIGBtZWFsYCAoQnl0ZSkKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL2Fubm90YXRlZF9iaW5hcnkvdGVzdHMvaW52YWxpZF92dGFibGVfcmVmX3RhYmxlX3NpemVfc2hvcnQuYmluIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvYW5ub3RhdGVkX2JpbmFyeS90ZXN0cy9pbnZhbGlkX3Z0YWJsZV9yZWZfdGFibGVfc2l6ZV9zaG9ydC5iaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTFkYjliNwotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL2Fubm90YXRlZF9iaW5hcnkvdGVzdHMvaW52YWxpZF92dGFibGVfcmVmX3RhYmxlX3NpemVfc2hvcnQuYmluCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL2Fubm90YXRlZF9iaW5hcnkvdGVzdHMvaW52YWxpZF92dGFibGVfc2l6ZS5hZmIgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9hbm5vdGF0ZWRfYmluYXJ5L3Rlc3RzL2ludmFsaWRfdnRhYmxlX3NpemUuYWZiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQzZDE0ZDUKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9hbm5vdGF0ZWRfYmluYXJ5L3Rlc3RzL2ludmFsaWRfdnRhYmxlX3NpemUuYWZiCkBAIC0wLDAgKzEsOTkgQEAKKy8vIEFubm90YXRlZCBGbGF0YnVmZmVyIEJpbmFyeQorLy8KKy8vIFNjaGVtYSBmaWxlOiBhbm5vdGF0ZWRfYmluYXJ5LmZicworLy8gQmluYXJ5IGZpbGU6IHRlc3RzL2ludmFsaWRfdnRhYmxlX3NpemUuYmluCisKK2hlYWRlcjoKKyAgKzB4MDAwMCB8IDQ0IDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgICB8IDB4MDAwMDAwNDQgKDY4KSBMb2M6ICsweDAwNDQgfCBvZmZzZXQgdG8gcm9vdCB0YWJsZSBgQW5ub3RhdGVkQmluYXJ5LkZvb2AKKyAgKzB4MDAwNCB8IDQxIDRFIDRFIDRGICAgICAgICAgICAgIHwgY2hhcls0XSAgICAgICB8IEFOTk8gICAgICAgICAgICAgICAgICAgICAgICAgfCBGaWxlIElkZW50aWZpZXIKKworcGFkZGluZzoKKyAgKzB4MDAwOCB8IDAwIDAwICAgICAgICAgICAgICAgICAgIHwgdWludDhfdFsyXSAgICB8IC4uICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBwYWRkaW5nCisKK3Z0YWJsZSAoQW5ub3RhdGVkQmluYXJ5LkZvbyk6CisgICsweDAwMEEgfCBGRiBGRiAgICAgICAgICAgICAgICAgICB8IHVpbnQxNl90ICAgICAgfCAweEZGRkYgKDY1NTM1KSAgICAgICAgICAgICAgIHwgRVJST1I6IHNpemUgb2YgdGhpcyB2dGFibGUuIExvbmdlciB0aGFuIHRoZSBiaW5hcnkuCisKK3Vua25vd24gKG5vIGtub3duIHJlZmVyZW5jZXMpOgorICArMHgwMDBDIHwgNjggMDAgMEMgMDAgMDcgMDAgMDAgMDAgfCA/dWludDhfdFs2NjBdIHwgaC4uLi4uLi4gICAgICAgICAgICAgICAgICAgICB8IFdBUk46IG5vdGhpbmcgcmVmZXJzIHRvIHRoaXMgc2VjdGlvbi4KKyAgKzB4MDAxNCB8IDA4IDAwIDEwIDAwIDE0IDAwIDMwIDAwIHwgICAgICAgICAgICAgICB8IC4uLi4uLjAuCisgICsweDAwMUMgfCAzNCAwMCAwOSAwMCAzOCAwMCAzQyAwMCB8ICAgICAgICAgICAgICAgfCA0Li4uOC48LgorICArMHgwMDI0IHwgNDAgMDAgNDQgMDAgMDAgMDAgMDAgMDAgfCAgICAgICAgICAgICAgIHwgQC5ELi4uLi4KKyAgKzB4MDAyQyB8IDQ4IDAwIDRDIDAwIDUwIDAwIDU0IDAwIHwgICAgICAgICAgICAgICB8IEguTC5QLlQuCisgICsweDAwMzQgfCA1OCAwMCAwQSAwMCA1QyAwMCAwQiAwMCB8ICAgICAgICAgICAgICAgfCBYLi4uXC4uLgorICArMHgwMDNDIHwgNjAgMDAgMDAgMDAgMDAgMDAgNjQgMDAgfCAgICAgICAgICAgICAgIHwgYC4uLi4uZC4KKyAgKzB4MDA0NCB8IDNBIDAwIDAwIDAwIDAwIDAwIDAwIDAxIHwgICAgICAgICAgICAgICB8IDouLi4uLi4uCisgICsweDAwNEMgfCAwMiAwMiAwMSAwMSBEMiAwNCAwMCAwMCB8ICAgICAgICAgICAgICAgfCAuLi4uLi4uLgorICArMHgwMDU0IHwgMjggMDIgMDAgMDAgMDEgMDAgMDAgMDAgfCAgICAgICAgICAgICAgIHwgKC4uLi4uLi4KKyAgKzB4MDA1QyB8IDAyIDAwIDAwIDAwIDBDIDAwIDAwIDAwIHwgICAgICAgICAgICAgICB8IC4uLi4uLi4uCisgICsweDAwNjQgfCAwQSAwMCAwMCAwMCAwQyAwMCAwMCAwMCB8ICAgICAgICAgICAgICAgfCAuLi4uLi4uLgorICArMHgwMDZDIHwgMTQgMDAgMDAgMDAgMDEgMDIgMDMgMDAgfCAgICAgICAgICAgICAgIHwgLi4uLi4uLi4KKyAgKzB4MDA3NCB8IEM4IDAxIDAwIDAwIDVDIDAxIDAwIDAwIHwgICAgICAgICAgICAgICB8IC4uLi5cLi4uCisgICsweDAwN0MgfCA1MCAwMSAwMCAwMCAzNCAwMSAwMCAwMCB8ICAgICAgICAgICAgICAgfCBQLi4uNC4uLgorICArMHgwMDg0IHwgMjQgMDEgMDAgMDAgMTQgMDEgMDAgMDAgfCAgICAgICAgICAgICAgIHwgJC4uLi4uLi4KKyAgKzB4MDA4QyB8IDBEIDAwIDAwIDAwIERDIDAwIDAwIDAwIHwgICAgICAgICAgICAgICB8IC4uLi4uLi4uCisgICsweDAwOTQgfCBBMCAwMCAwMCAwMCA5NCAwMCAwMCAwMCB8ICAgICAgICAgICAgICAgfCAuLi4uLi4uLgorICArMHgwMDlDIHwgMzggMDAgMDAgMDAgMzMgMDAgMDAgMDAgfCAgICAgICAgICAgICAgIHwgOC4uLjMuLi4KKyAgKzB4MDBBNCB8IDFDIDAwIDAwIDAwIDA0IDAwIDAwIDAwIHwgICAgICAgICAgICAgICB8IC4uLi4uLi4uCisgICsweDAwQUMgfCAwNSAwMCAwMCAwMCA2MSA2QyA2OSA2MyB8ICAgICAgICAgICAgICAgfCAuLi4uYWxpYworICArMHgwMEI0IHwgNjUgMDAgMDAgMDAgMDggMDAgMTMgMDAgfCAgICAgICAgICAgICAgIHwgZS4uLi4uLi4KKyAgKzB4MDBCQyB8IDA4IDAwIDA0IDAwIDA4IDAwIDAwIDAwIHwgICAgICAgICAgICAgICB8IC4uLi4uLi4uCisgICsweDAwQzQgfCAwMCA4MCAyMyA0NCAwMCAwMCAwMCAwMCB8ICAgICAgICAgICAgICAgfCAuLiNELi4uLgorICArMHgwMENDIHwgMDAgMTAgNzQgNDAgMDAgMDAgMDAgMDUgfCAgICAgICAgICAgICAgIHwgLi50QC4uLi4KKyAgKzB4MDBENCB8IDAzIDAwIDAwIDAwIDM0IDAwIDAwIDAwIHwgICAgICAgICAgICAgICB8IC4uLi40Li4uCisgICsweDAwREMgfCAyQyAwMCAwMCAwMCAwNCAwMCAwMCAwMCB8ICAgICAgICAgICAgICAgfCAsLi4uLi4uLgorICArMHgwMEU0IHwgRDIgRkUgRkYgRkYgMDAgODAgMjMgNDQgfCAgICAgICAgICAgICAgIHwgLi4uLi4uI0QKKyAgKzB4MDBFQyB8IDEwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIHwgICAgICAgICAgICAgICB8IC4uLi4uLi4uCisgICsweDAwRjQgfCAwMCBEOCA4RSA0MCAwMCAwMCAwMCAwMCB8ICAgICAgICAgICAgICAgfCAuLi5ALi4uLgorICArMHgwMEZDIHwgNkEgRkUgRkYgRkYgMDAgMDAgMDAgMDMgfCAgICAgICAgICAgICAgIHwgai4uLi4uLi4KKyAgKzB4MDEwNCB8IDA0IDAwIDA0IDAwIDA0IDAwIDAwIDAwIHwgICAgICAgICAgICAgICB8IC4uLi4uLi4uCisgICsweDAxMEMgfCBGQSBGRSBGRiBGRiAwMCAwMCBFNCA0MyB8ICAgICAgICAgICAgICAgfCAuLi4uLi4uQworICArMHgwMTE0IHwgMTAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgfCAgICAgICAgICAgICAgIHwgLi4uLi4uLi4KKyAgKzB4MDExQyB8IDAwIEMwIDVFIDQwIDAwIDAwIDAwIDAwIHwgICAgICAgICAgICAgICB8IC4uXkAuLi4uCisgICsweDAxMjQgfCA5MiBGRSBGRiBGRiAwMCAwMCAwMCAwMSB8ICAgICAgICAgICAgICAgfCAuLi4uLi4uLgorICArMHgwMTJDIHwgMDMgMDAgMDAgMDAgMDEgMDIgMDEgMDAgfCAgICAgICAgICAgICAgIHwgLi4uLi4uLi4KKyAgKzB4MDEzNCB8IDAzIDAwIDAwIDAwIDMzIDMzIDMzIDMzIHwgICAgICAgICAgICAgICB8IC4uLi4zMzMzCisgICsweDAxM0MgfCAzMyBBMyA0NSA0MCA3RSA1NyAwNCBGRiB8ICAgICAgICAgICAgICAgfCAzLkVAflcuLgorICArMHgwMTQ0IHwgNUIgODcgNTMgQzAgOEQgRjAgRjYgMjAgfCAgICAgICAgICAgICAgIHwgWy5TLi4uLiAKKyAgKzB4MDE0QyB8IDA0IEI2IDQyIDQwIDlGIDc3IDYzIDQxIHwgICAgICAgICAgICAgICB8IC4uQkAud2NBCisgICsweDAxNTQgfCA2MSA4NSA1RSBDMCA4RiAzNSAyMyA4MyB8ICAgICAgICAgICAgICAgfCBhLl4uLjUjLgorICArMHgwMTVDIHwgREMgMzUgNEIgQzAgRjYgOTcgREQgOTMgfCAgICAgICAgICAgICAgIHwgLjVLLi4uLi4KKyAgKzB4MDE2NCB8IDg3IEM1IDBBIDQwIDAwIDAwIDAwIDAwIHwgICAgICAgICAgICAgICB8IC4uLkAuLi4uCisgICsweDAxNkMgfCAwMyAwMCAwMCAwMCAyMCAwMCAwMCAwMCB8ICAgICAgICAgICAgICAgfCAuLi4uIC4uLgorICArMHgwMTc0IHwgMTQgMDAgMDAgMDAgMDQgMDAgMDAgMDAgfCAgICAgICAgICAgICAgIHwgLi4uLi4uLi4KKyAgKzB4MDE3QyB8IDA3IDAwIDAwIDAwIDYzIDY4IDYxIDcyIHwgICAgICAgICAgICAgICB8IC4uLi5jaGFyCisgICsweDAxODQgfCA2QyA2OSA2NSAwMCAwMyAwMCAwMCAwMCB8ICAgICAgICAgICAgICAgfCBsaWUuLi4uLgorICArMHgwMThDIHwgNjIgNkYgNjIgMDAgMDUgMDAgMDAgMDAgfCAgICAgICAgICAgICAgIHwgYm9iLi4uLi4KKyAgKzB4MDE5NCB8IDYxIDZDIDY5IDYzIDY1IDAwIDAwIDAwIHwgICAgICAgICAgICAgICB8IGFsaWNlLi4uCisgICsweDAxOUMgfCAwNyAwMCAwMCAwMCA2MyA2OCA2MSA3MiB8ICAgICAgICAgICAgICAgfCAuLi4uY2hhcgorICArMHgwMUE0IHwgNkMgNjkgNjUgMDAgMDcgMDAgMDAgMDAgfCAgICAgICAgICAgICAgIHwgbGllLi4uLi4KKyAgKzB4MDFBQyB8IDYzIDY4IDYxIDcyIDZDIDY5IDY1IDAwIHwgICAgICAgICAgICAgICB8IGNoYXJsaWUuCisgICsweDAxQjQgfCAwOSAwMCAwMCAwMCAwOSAwMCAwOCAwMCB8ICAgICAgICAgICAgICAgfCAuLi4uLi4uLgorICArMHgwMUJDIHwgMDcgMDAgMDEgMDAgMDIgMDAgMDMgMDAgfCAgICAgICAgICAgICAgIHwgLi4uLi4uLi4KKyAgKzB4MDFDNCB8IDA2IDAwIDA1IDAwIDA0IDAwIDAwIDAwIHwgICAgICAgICAgICAgICB8IC4uLi4uLi4uCisgICsweDAxQ0MgfCAzQSBGRiBGRiBGRiAwMCAwMCAwMCAwMyB8ICAgICAgICAgICAgICAgfCA6Li4uLi4uLgorICArMHgwMUQ0IHwgMDIgMDAgMDAgMDAgNDQgMDAgMDAgMDAgfCAgICAgICAgICAgICAgIHwgLi4uLkQuLi4KKyAgKzB4MDFEQyB8IDEwIDAwIDAwIDAwIDAwIDAwIDBBIDAwIHwgICAgICAgICAgICAgICB8IC4uLi4uLi4uCisgICsweDAxRTQgfCAxQSAwMCAwQyAwMCAwNCAwMCAwOCAwMCB8ICAgICAgICAgICAgICAgfCAuLi4uLi4uLgorICArMHgwMUVDIHwgMEEgMDAgMDAgMDAgMDAgODAgMjMgNDQgfCAgICAgICAgICAgICAgIHwgLi4uLi4uI0QKKyAgKzB4MDFGNCB8IDE4IDAwIDAwIDAwIDAwIDAwIDAwIDAwIHwgICAgICAgICAgICAgICB8IC4uLi4uLi4uCisgICsweDAxRkMgfCAwMCBEOCA4RSA0MCAwMCAwMCAwMCAwMCB8ICAgICAgICAgICAgICAgfCAuLi5ALi4uLgorICArMHgwMjA0IHwgMDAgMDAgMDYgMDAgMDYgMDAgMDUgMDAgfCAgICAgICAgICAgICAgIHwgLi4uLi4uLi4KKyAgKzB4MDIwQyB8IDA2IDAwIDAwIDAwIDAwIDAzIDBBIDAwIHwgICAgICAgICAgICAgICB8IC4uLi4uLi4uCisgICsweDAyMTQgfCAxOCAwMCAwQyAwMCAwNCAwMCAwOCAwMCB8ICAgICAgICAgICAgICAgfCAuLi4uLi4uLgorICArMHgwMjFDIHwgMEEgMDAgMDAgMDAgMDAgMDAgRTQgNDMgfCAgICAgICAgICAgICAgIHwgLi4uLi4uLkMKKyAgKzB4MDIyNCB8IDEwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIHwgICAgICAgICAgICAgICB8IC4uLi4uLi4uCisgICsweDAyMkMgfCAwMCBDMCA1RSA0MCAwMCAwMCAwMCAwMCB8ICAgICAgICAgICAgICAgfCAuLl5ALi4uLgorICArMHgwMjM0IHwgQTIgRkYgRkYgRkYgMDAgMDAgMDAgMDEgfCAgICAgICAgICAgICAgIHwgLi4uLi4uLi4KKyAgKzB4MDIzQyB8IDJGIDAwIDAwIDAwIDU0IDY4IDY5IDczIHwgICAgICAgICAgICAgICB8IC8uLi5UaGlzCisgICsweDAyNDQgfCAyMCA2OSA3MyAyMCA2MSAyMCA2QyA2RiB8ICAgICAgICAgICAgICAgfCAgaXMgYSBsbworICArMHgwMjRDIHwgNkUgNjcgMjAgNzMgNzQgNzIgNjkgNkUgfCAgICAgICAgICAgICAgIHwgbmcgc3RyaW4KKyAgKzB4MDI1NCB8IDY3IDIwIDc0IDZGIDIwIDczIDY4IDZGIHwgICAgICAgICAgICAgICB8IGcgdG8gc2hvCisgICsweDAyNUMgfCA3NyAyMCA2OCA2RiA3NyAyMCA2OSA3NCB8ICAgICAgICAgICAgICAgfCB3IGhvdyBpdAorICArMHgwMjY0IHwgMjAgNjIgNzIgNjUgNjEgNkIgNzMgMjAgfCAgICAgICAgICAgICAgIHwgIGJyZWFrcyAKKyAgKzB4MDI2QyB8IDc1IDcwIDJFIDAwIDAwIDAwIDBBIDAwIHwgICAgICAgICAgICAgICB8IHVwLi4uLi4uCisgICsweDAyNzQgfCAxNiAwMCAwQyAwMCAwNCAwMCAwOCAwMCB8ICAgICAgICAgICAgICAgfCAuLi4uLi4uLgorICArMHgwMjdDIHwgMEEgMDAgMDAgMDAgNjUgMjAgNzEgNDkgfCAgICAgICAgICAgICAgIHwgLi4uLmUgcUkKKyAgKzB4MDI4NCB8IDE0IDAwIDAwIDAwIEM5IDc2IEJFIDlGIHwgICAgICAgICAgICAgICB8IC4uLi4udi4uCisgICsweDAyOEMgfCAwQyAyNCBGRSA0MCAwMCAwMCAwNiAwMCB8ICAgICAgICAgICAgICAgfCAuJC5ALi4uLgorICArMHgwMjk0IHwgMDggMDAgMDcgMDAgMDYgMDAgMDAgMDAgfCAgICAgICAgICAgICAgIHwgLi4uLi4uLi4KKyAgKzB4MDI5QyB8IDAwIDAwIDAwIDAxICAgICAgICAgICAgIHwgICAgICAgICAgICAgICB8IC4uLi4KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL2Fubm90YXRlZF9iaW5hcnkvdGVzdHMvaW52YWxpZF92dGFibGVfc2l6ZS5iaW4gYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9hbm5vdGF0ZWRfYmluYXJ5L3Rlc3RzL2ludmFsaWRfdnRhYmxlX3NpemUuYmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkYzdlOTgKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9hbm5vdGF0ZWRfYmluYXJ5L3Rlc3RzL2ludmFsaWRfdnRhYmxlX3NpemUuYmluCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL2Fubm90YXRlZF9iaW5hcnkvdGVzdHMvaW52YWxpZF92dGFibGVfc2l6ZV9zaG9ydC5hZmIgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9hbm5vdGF0ZWRfYmluYXJ5L3Rlc3RzL2ludmFsaWRfdnRhYmxlX3NpemVfc2hvcnQuYWZiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRiYTY1ZjMKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9hbm5vdGF0ZWRfYmluYXJ5L3Rlc3RzL2ludmFsaWRfdnRhYmxlX3NpemVfc2hvcnQuYWZiCkBAIC0wLDAgKzEsOTkgQEAKKy8vIEFubm90YXRlZCBGbGF0YnVmZmVyIEJpbmFyeQorLy8KKy8vIFNjaGVtYSBmaWxlOiBhbm5vdGF0ZWRfYmluYXJ5LmZicworLy8gQmluYXJ5IGZpbGU6IHRlc3RzL2ludmFsaWRfdnRhYmxlX3NpemVfc2hvcnQuYmluCisKK2hlYWRlcjoKKyAgKzB4MDAwMCB8IDQ0IDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgICB8IDB4MDAwMDAwNDQgKDY4KSBMb2M6ICsweDAwNDQgfCBvZmZzZXQgdG8gcm9vdCB0YWJsZSBgQW5ub3RhdGVkQmluYXJ5LkZvb2AKKyAgKzB4MDAwNCB8IDQxIDRFIDRFIDRGICAgICAgICAgICAgIHwgY2hhcls0XSAgICAgICB8IEFOTk8gICAgICAgICAgICAgICAgICAgICAgICAgfCBGaWxlIElkZW50aWZpZXIKKworcGFkZGluZzoKKyAgKzB4MDAwOCB8IDAwIDAwICAgICAgICAgICAgICAgICAgIHwgdWludDhfdFsyXSAgICB8IC4uICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBwYWRkaW5nCisKK3Z0YWJsZSAoQW5ub3RhdGVkQmluYXJ5LkZvbyk6CisgICsweDAwMEEgfCAwMSAwMCAgICAgICAgICAgICAgICAgICB8IHVpbnQxNl90ICAgICAgfCAweDAwMDEgKDEpICAgICAgICAgICAgICAgICAgIHwgRVJST1I6IHNpemUgb2YgdGhpcyB2dGFibGUuIFNob3J0ZXIgdGhhbiB0aGUgbWluaW11bSBsZW5ndGg6IAorCit1bmtub3duIChubyBrbm93biByZWZlcmVuY2VzKToKKyAgKzB4MDAwQyB8IDY4IDAwIDBDIDAwIDA3IDAwIDAwIDAwIHwgP3VpbnQ4X3RbNjYwXSB8IGguLi4uLi4uICAgICAgICAgICAgICAgICAgICAgfCBXQVJOOiBub3RoaW5nIHJlZmVycyB0byB0aGlzIHNlY3Rpb24uCisgICsweDAwMTQgfCAwOCAwMCAxMCAwMCAxNCAwMCAzMCAwMCB8ICAgICAgICAgICAgICAgfCAuLi4uLi4wLgorICArMHgwMDFDIHwgMzQgMDAgMDkgMDAgMzggMDAgM0MgMDAgfCAgICAgICAgICAgICAgIHwgNC4uLjguPC4KKyAgKzB4MDAyNCB8IDQwIDAwIDQ0IDAwIDAwIDAwIDAwIDAwIHwgICAgICAgICAgICAgICB8IEAuRC4uLi4uCisgICsweDAwMkMgfCA0OCAwMCA0QyAwMCA1MCAwMCA1NCAwMCB8ICAgICAgICAgICAgICAgfCBILkwuUC5ULgorICArMHgwMDM0IHwgNTggMDAgMEEgMDAgNUMgMDAgMEIgMDAgfCAgICAgICAgICAgICAgIHwgWC4uLlwuLi4KKyAgKzB4MDAzQyB8IDYwIDAwIDAwIDAwIDAwIDAwIDY0IDAwIHwgICAgICAgICAgICAgICB8IGAuLi4uLmQuCisgICsweDAwNDQgfCAzQSAwMCAwMCAwMCAwMCAwMCAwMCAwMSB8ICAgICAgICAgICAgICAgfCA6Li4uLi4uLgorICArMHgwMDRDIHwgMDIgMDIgMDEgMDEgRDIgMDQgMDAgMDAgfCAgICAgICAgICAgICAgIHwgLi4uLi4uLi4KKyAgKzB4MDA1NCB8IDI4IDAyIDAwIDAwIDAxIDAwIDAwIDAwIHwgICAgICAgICAgICAgICB8ICguLi4uLi4uCisgICsweDAwNUMgfCAwMiAwMCAwMCAwMCAwQyAwMCAwMCAwMCB8ICAgICAgICAgICAgICAgfCAuLi4uLi4uLgorICArMHgwMDY0IHwgMEEgMDAgMDAgMDAgMEMgMDAgMDAgMDAgfCAgICAgICAgICAgICAgIHwgLi4uLi4uLi4KKyAgKzB4MDA2QyB8IDE0IDAwIDAwIDAwIDAxIDAyIDAzIDAwIHwgICAgICAgICAgICAgICB8IC4uLi4uLi4uCisgICsweDAwNzQgfCBDOCAwMSAwMCAwMCA1QyAwMSAwMCAwMCB8ICAgICAgICAgICAgICAgfCAuLi4uXC4uLgorICArMHgwMDdDIHwgNTAgMDEgMDAgMDAgMzQgMDEgMDAgMDAgfCAgICAgICAgICAgICAgIHwgUC4uLjQuLi4KKyAgKzB4MDA4NCB8IDI0IDAxIDAwIDAwIDE0IDAxIDAwIDAwIHwgICAgICAgICAgICAgICB8ICQuLi4uLi4uCisgICsweDAwOEMgfCAwRCAwMCAwMCAwMCBEQyAwMCAwMCAwMCB8ICAgICAgICAgICAgICAgfCAuLi4uLi4uLgorICArMHgwMDk0IHwgQTAgMDAgMDAgMDAgOTQgMDAgMDAgMDAgfCAgICAgICAgICAgICAgIHwgLi4uLi4uLi4KKyAgKzB4MDA5QyB8IDM4IDAwIDAwIDAwIDMzIDAwIDAwIDAwIHwgICAgICAgICAgICAgICB8IDguLi4zLi4uCisgICsweDAwQTQgfCAxQyAwMCAwMCAwMCAwNCAwMCAwMCAwMCB8ICAgICAgICAgICAgICAgfCAuLi4uLi4uLgorICArMHgwMEFDIHwgMDUgMDAgMDAgMDAgNjEgNkMgNjkgNjMgfCAgICAgICAgICAgICAgIHwgLi4uLmFsaWMKKyAgKzB4MDBCNCB8IDY1IDAwIDAwIDAwIDA4IDAwIDEzIDAwIHwgICAgICAgICAgICAgICB8IGUuLi4uLi4uCisgICsweDAwQkMgfCAwOCAwMCAwNCAwMCAwOCAwMCAwMCAwMCB8ICAgICAgICAgICAgICAgfCAuLi4uLi4uLgorICArMHgwMEM0IHwgMDAgODAgMjMgNDQgMDAgMDAgMDAgMDAgfCAgICAgICAgICAgICAgIHwgLi4jRC4uLi4KKyAgKzB4MDBDQyB8IDAwIDEwIDc0IDQwIDAwIDAwIDAwIDA1IHwgICAgICAgICAgICAgICB8IC4udEAuLi4uCisgICsweDAwRDQgfCAwMyAwMCAwMCAwMCAzNCAwMCAwMCAwMCB8ICAgICAgICAgICAgICAgfCAuLi4uNC4uLgorICArMHgwMERDIHwgMkMgMDAgMDAgMDAgMDQgMDAgMDAgMDAgfCAgICAgICAgICAgICAgIHwgLC4uLi4uLi4KKyAgKzB4MDBFNCB8IEQyIEZFIEZGIEZGIDAwIDgwIDIzIDQ0IHwgICAgICAgICAgICAgICB8IC4uLi4uLiNECisgICsweDAwRUMgfCAxMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCB8ICAgICAgICAgICAgICAgfCAuLi4uLi4uLgorICArMHgwMEY0IHwgMDAgRDggOEUgNDAgMDAgMDAgMDAgMDAgfCAgICAgICAgICAgICAgIHwgLi4uQC4uLi4KKyAgKzB4MDBGQyB8IDZBIEZFIEZGIEZGIDAwIDAwIDAwIDAzIHwgICAgICAgICAgICAgICB8IGouLi4uLi4uCisgICsweDAxMDQgfCAwNCAwMCAwNCAwMCAwNCAwMCAwMCAwMCB8ICAgICAgICAgICAgICAgfCAuLi4uLi4uLgorICArMHgwMTBDIHwgRkEgRkUgRkYgRkYgMDAgMDAgRTQgNDMgfCAgICAgICAgICAgICAgIHwgLi4uLi4uLkMKKyAgKzB4MDExNCB8IDEwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIHwgICAgICAgICAgICAgICB8IC4uLi4uLi4uCisgICsweDAxMUMgfCAwMCBDMCA1RSA0MCAwMCAwMCAwMCAwMCB8ICAgICAgICAgICAgICAgfCAuLl5ALi4uLgorICArMHgwMTI0IHwgOTIgRkUgRkYgRkYgMDAgMDAgMDAgMDEgfCAgICAgICAgICAgICAgIHwgLi4uLi4uLi4KKyAgKzB4MDEyQyB8IDAzIDAwIDAwIDAwIDAxIDAyIDAxIDAwIHwgICAgICAgICAgICAgICB8IC4uLi4uLi4uCisgICsweDAxMzQgfCAwMyAwMCAwMCAwMCAzMyAzMyAzMyAzMyB8ICAgICAgICAgICAgICAgfCAuLi4uMzMzMworICArMHgwMTNDIHwgMzMgQTMgNDUgNDAgN0UgNTcgMDQgRkYgfCAgICAgICAgICAgICAgIHwgMy5FQH5XLi4KKyAgKzB4MDE0NCB8IDVCIDg3IDUzIEMwIDhEIEYwIEY2IDIwIHwgICAgICAgICAgICAgICB8IFsuUy4uLi4gCisgICsweDAxNEMgfCAwNCBCNiA0MiA0MCA5RiA3NyA2MyA0MSB8ICAgICAgICAgICAgICAgfCAuLkJALndjQQorICArMHgwMTU0IHwgNjEgODUgNUUgQzAgOEYgMzUgMjMgODMgfCAgICAgICAgICAgICAgIHwgYS5eLi41Iy4KKyAgKzB4MDE1QyB8IERDIDM1IDRCIEMwIEY2IDk3IEREIDkzIHwgICAgICAgICAgICAgICB8IC41Sy4uLi4uCisgICsweDAxNjQgfCA4NyBDNSAwQSA0MCAwMCAwMCAwMCAwMCB8ICAgICAgICAgICAgICAgfCAuLi5ALi4uLgorICArMHgwMTZDIHwgMDMgMDAgMDAgMDAgMjAgMDAgMDAgMDAgfCAgICAgICAgICAgICAgIHwgLi4uLiAuLi4KKyAgKzB4MDE3NCB8IDE0IDAwIDAwIDAwIDA0IDAwIDAwIDAwIHwgICAgICAgICAgICAgICB8IC4uLi4uLi4uCisgICsweDAxN0MgfCAwNyAwMCAwMCAwMCA2MyA2OCA2MSA3MiB8ICAgICAgICAgICAgICAgfCAuLi4uY2hhcgorICArMHgwMTg0IHwgNkMgNjkgNjUgMDAgMDMgMDAgMDAgMDAgfCAgICAgICAgICAgICAgIHwgbGllLi4uLi4KKyAgKzB4MDE4QyB8IDYyIDZGIDYyIDAwIDA1IDAwIDAwIDAwIHwgICAgICAgICAgICAgICB8IGJvYi4uLi4uCisgICsweDAxOTQgfCA2MSA2QyA2OSA2MyA2NSAwMCAwMCAwMCB8ICAgICAgICAgICAgICAgfCBhbGljZS4uLgorICArMHgwMTlDIHwgMDcgMDAgMDAgMDAgNjMgNjggNjEgNzIgfCAgICAgICAgICAgICAgIHwgLi4uLmNoYXIKKyAgKzB4MDFBNCB8IDZDIDY5IDY1IDAwIDA3IDAwIDAwIDAwIHwgICAgICAgICAgICAgICB8IGxpZS4uLi4uCisgICsweDAxQUMgfCA2MyA2OCA2MSA3MiA2QyA2OSA2NSAwMCB8ICAgICAgICAgICAgICAgfCBjaGFybGllLgorICArMHgwMUI0IHwgMDkgMDAgMDAgMDAgMDkgMDAgMDggMDAgfCAgICAgICAgICAgICAgIHwgLi4uLi4uLi4KKyAgKzB4MDFCQyB8IDA3IDAwIDAxIDAwIDAyIDAwIDAzIDAwIHwgICAgICAgICAgICAgICB8IC4uLi4uLi4uCisgICsweDAxQzQgfCAwNiAwMCAwNSAwMCAwNCAwMCAwMCAwMCB8ICAgICAgICAgICAgICAgfCAuLi4uLi4uLgorICArMHgwMUNDIHwgM0EgRkYgRkYgRkYgMDAgMDAgMDAgMDMgfCAgICAgICAgICAgICAgIHwgOi4uLi4uLi4KKyAgKzB4MDFENCB8IDAyIDAwIDAwIDAwIDQ0IDAwIDAwIDAwIHwgICAgICAgICAgICAgICB8IC4uLi5ELi4uCisgICsweDAxREMgfCAxMCAwMCAwMCAwMCAwMCAwMCAwQSAwMCB8ICAgICAgICAgICAgICAgfCAuLi4uLi4uLgorICArMHgwMUU0IHwgMUEgMDAgMEMgMDAgMDQgMDAgMDggMDAgfCAgICAgICAgICAgICAgIHwgLi4uLi4uLi4KKyAgKzB4MDFFQyB8IDBBIDAwIDAwIDAwIDAwIDgwIDIzIDQ0IHwgICAgICAgICAgICAgICB8IC4uLi4uLiNECisgICsweDAxRjQgfCAxOCAwMCAwMCAwMCAwMCAwMCAwMCAwMCB8ICAgICAgICAgICAgICAgfCAuLi4uLi4uLgorICArMHgwMUZDIHwgMDAgRDggOEUgNDAgMDAgMDAgMDAgMDAgfCAgICAgICAgICAgICAgIHwgLi4uQC4uLi4KKyAgKzB4MDIwNCB8IDAwIDAwIDA2IDAwIDA2IDAwIDA1IDAwIHwgICAgICAgICAgICAgICB8IC4uLi4uLi4uCisgICsweDAyMEMgfCAwNiAwMCAwMCAwMCAwMCAwMyAwQSAwMCB8ICAgICAgICAgICAgICAgfCAuLi4uLi4uLgorICArMHgwMjE0IHwgMTggMDAgMEMgMDAgMDQgMDAgMDggMDAgfCAgICAgICAgICAgICAgIHwgLi4uLi4uLi4KKyAgKzB4MDIxQyB8IDBBIDAwIDAwIDAwIDAwIDAwIEU0IDQzIHwgICAgICAgICAgICAgICB8IC4uLi4uLi5DCisgICsweDAyMjQgfCAxMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCB8ICAgICAgICAgICAgICAgfCAuLi4uLi4uLgorICArMHgwMjJDIHwgMDAgQzAgNUUgNDAgMDAgMDAgMDAgMDAgfCAgICAgICAgICAgICAgIHwgLi5eQC4uLi4KKyAgKzB4MDIzNCB8IEEyIEZGIEZGIEZGIDAwIDAwIDAwIDAxIHwgICAgICAgICAgICAgICB8IC4uLi4uLi4uCisgICsweDAyM0MgfCAyRiAwMCAwMCAwMCA1NCA2OCA2OSA3MyB8ICAgICAgICAgICAgICAgfCAvLi4uVGhpcworICArMHgwMjQ0IHwgMjAgNjkgNzMgMjAgNjEgMjAgNkMgNkYgfCAgICAgICAgICAgICAgIHwgIGlzIGEgbG8KKyAgKzB4MDI0QyB8IDZFIDY3IDIwIDczIDc0IDcyIDY5IDZFIHwgICAgICAgICAgICAgICB8IG5nIHN0cmluCisgICsweDAyNTQgfCA2NyAyMCA3NCA2RiAyMCA3MyA2OCA2RiB8ICAgICAgICAgICAgICAgfCBnIHRvIHNobworICArMHgwMjVDIHwgNzcgMjAgNjggNkYgNzcgMjAgNjkgNzQgfCAgICAgICAgICAgICAgIHwgdyBob3cgaXQKKyAgKzB4MDI2NCB8IDIwIDYyIDcyIDY1IDYxIDZCIDczIDIwIHwgICAgICAgICAgICAgICB8ICBicmVha3MgCisgICsweDAyNkMgfCA3NSA3MCAyRSAwMCAwMCAwMCAwQSAwMCB8ICAgICAgICAgICAgICAgfCB1cC4uLi4uLgorICArMHgwMjc0IHwgMTYgMDAgMEMgMDAgMDQgMDAgMDggMDAgfCAgICAgICAgICAgICAgIHwgLi4uLi4uLi4KKyAgKzB4MDI3QyB8IDBBIDAwIDAwIDAwIDY1IDIwIDcxIDQ5IHwgICAgICAgICAgICAgICB8IC4uLi5lIHFJCisgICsweDAyODQgfCAxNCAwMCAwMCAwMCBDOSA3NiBCRSA5RiB8ICAgICAgICAgICAgICAgfCAuLi4uLnYuLgorICArMHgwMjhDIHwgMEMgMjQgRkUgNDAgMDAgMDAgMDYgMDAgfCAgICAgICAgICAgICAgIHwgLiQuQC4uLi4KKyAgKzB4MDI5NCB8IDA4IDAwIDA3IDAwIDA2IDAwIDAwIDAwIHwgICAgICAgICAgICAgICB8IC4uLi4uLi4uCisgICsweDAyOUMgfCAwMCAwMCAwMCAwMSAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgfCAuLi4uCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9hbm5vdGF0ZWRfYmluYXJ5L3Rlc3RzL2ludmFsaWRfdnRhYmxlX3NpemVfc2hvcnQuYmluIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvYW5ub3RhdGVkX2JpbmFyeS90ZXN0cy9pbnZhbGlkX3Z0YWJsZV9zaXplX3Nob3J0LmJpbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MzViZDc0Ci0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvYW5ub3RhdGVkX2JpbmFyeS90ZXN0cy9pbnZhbGlkX3Z0YWJsZV9zaXplX3Nob3J0LmJpbgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9hcnJheXNfdGVzdC9tb2QucnMgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9hcnJheXNfdGVzdC9tb2QucnMKaW5kZXggODM3ODJkYy4uNWE2NDlkNSAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvYXJyYXlzX3Rlc3QvbW9kLnJzCisrKyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL2FycmF5c190ZXN0L21vZC5ycwpAQCAtMSw0ICsxLDUgQEAKIC8vIEF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGJ5IHRoZSBGbGF0YnVmZmVycyBjb21waWxlci4gRG8gbm90IG1vZGlmeS4KKy8vIEBnZW5lcmF0ZWQKIHB1YiBtb2QgbXlfZ2FtZSB7CiAgIHVzZSBzdXBlcjo6KjsKICAgcHViIG1vZCBleGFtcGxlIHsKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL2FycmF5c190ZXN0L215X2dhbWUvZXhhbXBsZS9hcnJheV9zdHJ1Y3RfZ2VuZXJhdGVkLnJzIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvYXJyYXlzX3Rlc3QvbXlfZ2FtZS9leGFtcGxlL2FycmF5X3N0cnVjdF9nZW5lcmF0ZWQucnMKaW5kZXggZGVhMzY1NS4uYmY0MTY5NiAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvYXJyYXlzX3Rlc3QvbXlfZ2FtZS9leGFtcGxlL2FycmF5X3N0cnVjdF9nZW5lcmF0ZWQucnMKKysrIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvYXJyYXlzX3Rlc3QvbXlfZ2FtZS9leGFtcGxlL2FycmF5X3N0cnVjdF9nZW5lcmF0ZWQucnMKQEAgLTEsNyArMSwxMiBAQAogLy8gYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgYnkgdGhlIEZsYXRCdWZmZXJzIGNvbXBpbGVyLCBkbyBub3QgbW9kaWZ5CisvLyBAZ2VuZXJhdGVkCitleHRlcm4gY3JhdGUgYWxsb2M7CiBleHRlcm4gY3JhdGUgZmxhdGJ1ZmZlcnM7Ci11c2Ugc3RkOjptZW07Ci11c2Ugc3RkOjpjbXA6Ok9yZGVyaW5nOwordXNlIGFsbG9jOjpib3hlZDo6Qm94OwordXNlIGFsbG9jOjpzdHJpbmc6OntTdHJpbmcsIFRvU3RyaW5nfTsKK3VzZSBhbGxvYzo6dmVjOjpWZWM7Cit1c2UgY29yZTo6bWVtOwordXNlIGNvcmU6OmNtcDo6T3JkZXJpbmc7CiB1c2Ugc2VsZjo6ZmxhdGJ1ZmZlcnM6OntFbmRpYW5TY2FsYXIsIEZvbGxvd307CiB1c2Ugc3VwZXI6Oio7CiAvLyBzdHJ1Y3QgQXJyYXlTdHJ1Y3QsIGFsaWduZWQgdG8gOApAQCAtMTMsOCArMTgsOCBAQAogICAgIFNlbGYoWzA7IDE2MF0pCiAgIH0KIH0KLWltcGwgc3RkOjpmbXQ6OkRlYnVnIGZvciBBcnJheVN0cnVjdCB7Ci0gIGZuIGZtdCgmc2VsZiwgZjogJm11dCBzdGQ6OmZtdDo6Rm9ybWF0dGVyKSAtPiBzdGQ6OmZtdDo6UmVzdWx0IHsKK2ltcGwgY29yZTo6Zm10OjpEZWJ1ZyBmb3IgQXJyYXlTdHJ1Y3QgeworICBmbiBmbXQoJnNlbGYsIGY6ICZtdXQgY29yZTo6Zm10OjpGb3JtYXR0ZXIpIC0+IGNvcmU6OmZtdDo6UmVzdWx0IHsKICAgICBmLmRlYnVnX3N0cnVjdCgiQXJyYXlTdHJ1Y3QiKQogICAgICAgLmZpZWxkKCJhIiwgJnNlbGYuYSgpKQogICAgICAgLmZpZWxkKCJiIiwgJnNlbGYuYigpKQpAQCAtNDcsNyArNTIsNyBAQAogICAgICNbaW5saW5lXQogICAgIGZuIHB1c2goJnNlbGYsIGRzdDogJm11dCBbdThdLCBfcmVzdDogJlt1OF0pIHsKICAgICAgICAgbGV0IHNyYyA9IHVuc2FmZSB7Ci0gICAgICAgICAgICA6OnN0ZDo6c2xpY2U6OmZyb21fcmF3X3BhcnRzKHNlbGYgYXMgKmNvbnN0IEFycmF5U3RydWN0IGFzICpjb25zdCB1OCwgU2VsZjo6c2l6ZSgpKQorICAgICAgICAgICAgOjpjb3JlOjpzbGljZTo6ZnJvbV9yYXdfcGFydHMoc2VsZiBhcyAqY29uc3QgQXJyYXlTdHJ1Y3QgYXMgKmNvbnN0IHU4LCBTZWxmOjpzaXplKCkpCiAgICAgICAgIH07CiAgICAgICAgIGRzdC5jb3B5X2Zyb21fc2xpY2Uoc3JjKTsKICAgICB9CkBAIC01OCw3ICs2Myw3IEBACiAgICAgI1tpbmxpbmVdCiAgICAgZm4gcHVzaCgmc2VsZiwgZHN0OiAmbXV0IFt1OF0sIF9yZXN0OiAmW3U4XSkgewogICAgICAgICBsZXQgc3JjID0gdW5zYWZlIHsKLSAgICAgICAgICAgIDo6c3RkOjpzbGljZTo6ZnJvbV9yYXdfcGFydHMoKnNlbGYgYXMgKmNvbnN0IEFycmF5U3RydWN0IGFzICpjb25zdCB1OCwgU2VsZjo6c2l6ZSgpKQorICAgICAgICAgICAgOjpjb3JlOjpzbGljZTo6ZnJvbV9yYXdfcGFydHMoKnNlbGYgYXMgKmNvbnN0IEFycmF5U3RydWN0IGFzICpjb25zdCB1OCwgU2VsZjo6c2l6ZSgpKQogICAgICAgICB9OwogICAgICAgICBkc3QuY29weV9mcm9tX3NsaWNlKHNyYyk7CiAgICAgfQpAQCAtMTU4LDcgKzE2Myw3IEBACiAKICAgcHViIGZuIHNldF9kKCZtdXQgc2VsZiwgeDogJltOZXN0ZWRTdHJ1Y3Q7IDJdKSB7CiAgICAgdW5zYWZlIHsKLSAgICAgIHN0ZDo6cHRyOjpjb3B5KAorICAgICAgY29yZTo6cHRyOjpjb3B5KAogICAgICAgICB4LmFzX3B0cigpIGFzICpjb25zdCB1OCwKICAgICAgICAgc2VsZi4wLmFzX211dF9wdHIoKS5hZGQoNzIpLAogICAgICAgICA2NCwKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL2FycmF5c190ZXN0L215X2dhbWUvZXhhbXBsZS9hcnJheV90YWJsZV9nZW5lcmF0ZWQucnMgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9hcnJheXNfdGVzdC9teV9nYW1lL2V4YW1wbGUvYXJyYXlfdGFibGVfZ2VuZXJhdGVkLnJzCmluZGV4IGY0NmFjNzQuLmJjNzhmYzEgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL2FycmF5c190ZXN0L215X2dhbWUvZXhhbXBsZS9hcnJheV90YWJsZV9nZW5lcmF0ZWQucnMKKysrIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvYXJyYXlzX3Rlc3QvbXlfZ2FtZS9leGFtcGxlL2FycmF5X3RhYmxlX2dlbmVyYXRlZC5ycwpAQCAtMSw3ICsxLDEyIEBACiAvLyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBieSB0aGUgRmxhdEJ1ZmZlcnMgY29tcGlsZXIsIGRvIG5vdCBtb2RpZnkKKy8vIEBnZW5lcmF0ZWQKK2V4dGVybiBjcmF0ZSBhbGxvYzsKIGV4dGVybiBjcmF0ZSBmbGF0YnVmZmVyczsKLXVzZSBzdGQ6Om1lbTsKLXVzZSBzdGQ6OmNtcDo6T3JkZXJpbmc7Cit1c2UgYWxsb2M6OmJveGVkOjpCb3g7Cit1c2UgYWxsb2M6OnN0cmluZzo6e1N0cmluZywgVG9TdHJpbmd9OwordXNlIGFsbG9jOjp2ZWM6OlZlYzsKK3VzZSBjb3JlOjptZW07Cit1c2UgY29yZTo6Y21wOjpPcmRlcmluZzsKIHVzZSBzZWxmOjpmbGF0YnVmZmVyczo6e0VuZGlhblNjYWxhciwgRm9sbG93fTsKIHVzZSBzdXBlcjo6KjsKIHB1YiBlbnVtIEFycmF5VGFibGVPZmZzZXQge30KQEAgLTEwMyw4ICsxMDgsOCBAQAogICB9CiB9CiAKLWltcGwgc3RkOjpmbXQ6OkRlYnVnIGZvciBBcnJheVRhYmxlPCdfPiB7Ci0gIGZuIGZtdCgmc2VsZiwgZjogJm11dCBzdGQ6OmZtdDo6Rm9ybWF0dGVyPCdfPikgLT4gc3RkOjpmbXQ6OlJlc3VsdCB7CitpbXBsIGNvcmU6OmZtdDo6RGVidWcgZm9yIEFycmF5VGFibGU8J18+IHsKKyAgZm4gZm10KCZzZWxmLCBmOiAmbXV0IGNvcmU6OmZtdDo6Rm9ybWF0dGVyPCdfPikgLT4gY29yZTo6Zm10OjpSZXN1bHQgewogICAgIGxldCBtdXQgZHMgPSBmLmRlYnVnX3N0cnVjdCgiQXJyYXlUYWJsZSIpOwogICAgICAgZHMuZmllbGQoImEiLCAmc2VsZi5hKCkpOwogICAgICAgZHMuZmluaXNoKCkKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL2FycmF5c190ZXN0L215X2dhbWUvZXhhbXBsZS9uZXN0ZWRfc3RydWN0X2dlbmVyYXRlZC5ycyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL2FycmF5c190ZXN0L215X2dhbWUvZXhhbXBsZS9uZXN0ZWRfc3RydWN0X2dlbmVyYXRlZC5ycwppbmRleCA0OGE2YjkxLi4zMzdhZmZjIDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9hcnJheXNfdGVzdC9teV9nYW1lL2V4YW1wbGUvbmVzdGVkX3N0cnVjdF9nZW5lcmF0ZWQucnMKKysrIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvYXJyYXlzX3Rlc3QvbXlfZ2FtZS9leGFtcGxlL25lc3RlZF9zdHJ1Y3RfZ2VuZXJhdGVkLnJzCkBAIC0xLDcgKzEsMTIgQEAKIC8vIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGJ5IHRoZSBGbGF0QnVmZmVycyBjb21waWxlciwgZG8gbm90IG1vZGlmeQorLy8gQGdlbmVyYXRlZAorZXh0ZXJuIGNyYXRlIGFsbG9jOwogZXh0ZXJuIGNyYXRlIGZsYXRidWZmZXJzOwotdXNlIHN0ZDo6bWVtOwotdXNlIHN0ZDo6Y21wOjpPcmRlcmluZzsKK3VzZSBhbGxvYzo6Ym94ZWQ6OkJveDsKK3VzZSBhbGxvYzo6c3RyaW5nOjp7U3RyaW5nLCBUb1N0cmluZ307Cit1c2UgYWxsb2M6OnZlYzo6VmVjOwordXNlIGNvcmU6Om1lbTsKK3VzZSBjb3JlOjpjbXA6Ok9yZGVyaW5nOwogdXNlIHNlbGY6OmZsYXRidWZmZXJzOjp7RW5kaWFuU2NhbGFyLCBGb2xsb3d9OwogdXNlIHN1cGVyOjoqOwogLy8gc3RydWN0IE5lc3RlZFN0cnVjdCwgYWxpZ25lZCB0byA4CkBAIC0xMyw4ICsxOCw4IEBACiAgICAgU2VsZihbMDsgMzJdKQogICB9CiB9Ci1pbXBsIHN0ZDo6Zm10OjpEZWJ1ZyBmb3IgTmVzdGVkU3RydWN0IHsKLSAgZm4gZm10KCZzZWxmLCBmOiAmbXV0IHN0ZDo6Zm10OjpGb3JtYXR0ZXIpIC0+IHN0ZDo6Zm10OjpSZXN1bHQgeworaW1wbCBjb3JlOjpmbXQ6OkRlYnVnIGZvciBOZXN0ZWRTdHJ1Y3QgeworICBmbiBmbXQoJnNlbGYsIGY6ICZtdXQgY29yZTo6Zm10OjpGb3JtYXR0ZXIpIC0+IGNvcmU6OmZtdDo6UmVzdWx0IHsKICAgICBmLmRlYnVnX3N0cnVjdCgiTmVzdGVkU3RydWN0IikKICAgICAgIC5maWVsZCgiYSIsICZzZWxmLmEoKSkKICAgICAgIC5maWVsZCgiYiIsICZzZWxmLmIoKSkKQEAgLTQ1LDcgKzUwLDcgQEAKICAgICAjW2lubGluZV0KICAgICBmbiBwdXNoKCZzZWxmLCBkc3Q6ICZtdXQgW3U4XSwgX3Jlc3Q6ICZbdThdKSB7CiAgICAgICAgIGxldCBzcmMgPSB1bnNhZmUgewotICAgICAgICAgICAgOjpzdGQ6OnNsaWNlOjpmcm9tX3Jhd19wYXJ0cyhzZWxmIGFzICpjb25zdCBOZXN0ZWRTdHJ1Y3QgYXMgKmNvbnN0IHU4LCBTZWxmOjpzaXplKCkpCisgICAgICAgICAgICA6OmNvcmU6OnNsaWNlOjpmcm9tX3Jhd19wYXJ0cyhzZWxmIGFzICpjb25zdCBOZXN0ZWRTdHJ1Y3QgYXMgKmNvbnN0IHU4LCBTZWxmOjpzaXplKCkpCiAgICAgICAgIH07CiAgICAgICAgIGRzdC5jb3B5X2Zyb21fc2xpY2Uoc3JjKTsKICAgICB9CkBAIC01Niw3ICs2MSw3IEBACiAgICAgI1tpbmxpbmVdCiAgICAgZm4gcHVzaCgmc2VsZiwgZHN0OiAmbXV0IFt1OF0sIF9yZXN0OiAmW3U4XSkgewogICAgICAgICBsZXQgc3JjID0gdW5zYWZlIHsKLSAgICAgICAgICAgIDo6c3RkOjpzbGljZTo6ZnJvbV9yYXdfcGFydHMoKnNlbGYgYXMgKmNvbnN0IE5lc3RlZFN0cnVjdCBhcyAqY29uc3QgdTgsIFNlbGY6OnNpemUoKSkKKyAgICAgICAgICAgIDo6Y29yZTo6c2xpY2U6OmZyb21fcmF3X3BhcnRzKCpzZWxmIGFzICpjb25zdCBOZXN0ZWRTdHJ1Y3QgYXMgKmNvbnN0IHU4LCBTZWxmOjpzaXplKCkpCiAgICAgICAgIH07CiAgICAgICAgIGRzdC5jb3B5X2Zyb21fc2xpY2Uoc3JjKTsKICAgICB9CkBAIC0xMjksNyArMTM0LDcgQEAKIAogICBwdWIgZm4gc2V0X2MoJm11dCBzZWxmLCB4OiAmW1Rlc3RFbnVtOyAyXSkgewogICAgIHVuc2FmZSB7Ci0gICAgICBzdGQ6OnB0cjo6Y29weSgKKyAgICAgIGNvcmU6OnB0cjo6Y29weSgKICAgICAgICAgeC5hc19wdHIoKSBhcyAqY29uc3QgdTgsCiAgICAgICAgIHNlbGYuMC5hc19tdXRfcHRyKCkuYWRkKDkpLAogICAgICAgICAyLApkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvYXJyYXlzX3Rlc3QvbXlfZ2FtZS9leGFtcGxlL3Rlc3RfZW51bV9nZW5lcmF0ZWQucnMgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9hcnJheXNfdGVzdC9teV9nYW1lL2V4YW1wbGUvdGVzdF9lbnVtX2dlbmVyYXRlZC5ycwppbmRleCA2ZGNjMWNiLi41MjUyMTMzIDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9hcnJheXNfdGVzdC9teV9nYW1lL2V4YW1wbGUvdGVzdF9lbnVtX2dlbmVyYXRlZC5ycworKysgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9hcnJheXNfdGVzdC9teV9nYW1lL2V4YW1wbGUvdGVzdF9lbnVtX2dlbmVyYXRlZC5ycwpAQCAtMSw3ICsxLDEyIEBACiAvLyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBieSB0aGUgRmxhdEJ1ZmZlcnMgY29tcGlsZXIsIGRvIG5vdCBtb2RpZnkKKy8vIEBnZW5lcmF0ZWQKK2V4dGVybiBjcmF0ZSBhbGxvYzsKIGV4dGVybiBjcmF0ZSBmbGF0YnVmZmVyczsKLXVzZSBzdGQ6Om1lbTsKLXVzZSBzdGQ6OmNtcDo6T3JkZXJpbmc7Cit1c2UgYWxsb2M6OmJveGVkOjpCb3g7Cit1c2UgYWxsb2M6OnN0cmluZzo6e1N0cmluZywgVG9TdHJpbmd9OwordXNlIGFsbG9jOjp2ZWM6OlZlYzsKK3VzZSBjb3JlOjptZW07Cit1c2UgY29yZTo6Y21wOjpPcmRlcmluZzsKIHVzZSBzZWxmOjpmbGF0YnVmZmVyczo6e0VuZGlhblNjYWxhciwgRm9sbG93fTsKIHVzZSBzdXBlcjo6KjsKICNbZGVwcmVjYXRlZChzaW5jZSA9ICIyLjAuMCIsIG5vdGUgPSAiVXNlIGFzc29jaWF0ZWQgY29uc3RhbnRzIGluc3RlYWQuIFRoaXMgd2lsbCBubyBsb25nZXIgYmUgZ2VuZXJhdGVkIGluIDIwMjEuIildCkBAIC00Miw4ICs0Nyw4IEBACiAgICAgfQogICB9CiB9Ci1pbXBsIHN0ZDo6Zm10OjpEZWJ1ZyBmb3IgVGVzdEVudW0gewotICBmbiBmbXQoJnNlbGYsIGY6ICZtdXQgc3RkOjpmbXQ6OkZvcm1hdHRlcikgLT4gc3RkOjpmbXQ6OlJlc3VsdCB7CitpbXBsIGNvcmU6OmZtdDo6RGVidWcgZm9yIFRlc3RFbnVtIHsKKyAgZm4gZm10KCZzZWxmLCBmOiAmbXV0IGNvcmU6OmZtdDo6Rm9ybWF0dGVyKSAtPiBjb3JlOjpmbXQ6OlJlc3VsdCB7CiAgICAgaWYgbGV0IFNvbWUobmFtZSkgPSBzZWxmLnZhcmlhbnRfbmFtZSgpIHsKICAgICAgIGYud3JpdGVfc3RyKG5hbWUpCiAgICAgfSBlbHNlIHsKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL2FycmF5c190ZXN0X2dlbmVyYXRlZC5oIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvYXJyYXlzX3Rlc3RfZ2VuZXJhdGVkLmgKaW5kZXggMTMwMGI5Mi4uMDkwZjQ2NCAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvYXJyYXlzX3Rlc3RfZ2VuZXJhdGVkLmgKKysrIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvYXJyYXlzX3Rlc3RfZ2VuZXJhdGVkLmgKQEAgLTYsNiArNiwxMyBAQAogCiAjaW5jbHVkZSAiZmxhdGJ1ZmZlcnMvZmxhdGJ1ZmZlcnMuaCIKIAorLy8gRW5zdXJlIHRoZSBpbmNsdWRlZCBmbGF0YnVmZmVycy5oIGlzIHRoZSBzYW1lIHZlcnNpb24gYXMgd2hlbiB0aGlzIGZpbGUgd2FzCisvLyBnZW5lcmF0ZWQsIG90aGVyd2lzZSBpdCBtYXkgbm90IGJlIGNvbXBhdGlibGUuCitzdGF0aWNfYXNzZXJ0KEZMQVRCVUZGRVJTX1ZFUlNJT05fTUFKT1IgPT0gMiAmJgorICAgICAgICAgICAgICBGTEFUQlVGRkVSU19WRVJTSU9OX01JTk9SID09IDAgJiYKKyAgICAgICAgICAgICAgRkxBVEJVRkZFUlNfVkVSU0lPTl9SRVZJU0lPTiA9PSA4LAorICAgICAgICAgICAgICJOb24tY29tcGF0aWJsZSBmbGF0YnVmZmVycyB2ZXJzaW9uIGluY2x1ZGVkIik7CisKIG5hbWVzcGFjZSBNeUdhbWUgewogbmFtZXNwYWNlIEV4YW1wbGUgewogCkBAIC0zNjQsNyArMzcxLDcgQEAKICAgKHZvaWQpX3JlaGFzaGVyOwogICAodm9pZClfbzsKICAgc3RydWN0IF9WZWN0b3JBcmdzIHsgZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICpfX2ZiYjsgY29uc3QgQXJyYXlUYWJsZVQqIF9fbzsgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9fcmVoYXNoZXI7IH0gX3ZhID0geyAmX2ZiYiwgX28sIF9yZWhhc2hlcn07ICh2b2lkKV92YTsKLSAgYXV0byBfYSA9IF9vLT5hID8gX28tPmEuZ2V0KCkgOiAwOworICBhdXRvIF9hID0gX28tPmEgPyBfby0+YS5nZXQoKSA6IG51bGxwdHI7CiAgIHJldHVybiBNeUdhbWU6OkV4YW1wbGU6OkNyZWF0ZUFycmF5VGFibGUoCiAgICAgICBfZmJiLAogICAgICAgX2EpOwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvY3BwMTcvZ2VuZXJhdGVkX2NwcDE3L21vbnN0ZXJfdGVzdF9nZW5lcmF0ZWQuaCBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL2NwcDE3L2dlbmVyYXRlZF9jcHAxNy9tb25zdGVyX3Rlc3RfZ2VuZXJhdGVkLmgKaW5kZXggNDQyYmE1MC4uYmUyN2I0NSAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvY3BwMTcvZ2VuZXJhdGVkX2NwcDE3L21vbnN0ZXJfdGVzdF9nZW5lcmF0ZWQuaAorKysgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9jcHAxNy9nZW5lcmF0ZWRfY3BwMTcvbW9uc3Rlcl90ZXN0X2dlbmVyYXRlZC5oCkBAIC02LDYgKzYsMTQgQEAKIAogI2luY2x1ZGUgImZsYXRidWZmZXJzL2ZsYXRidWZmZXJzLmgiCiAjaW5jbHVkZSAiZmxhdGJ1ZmZlcnMvZmxleGJ1ZmZlcnMuaCIKKyNpbmNsdWRlICJmbGF0YnVmZmVycy9mbGV4X2ZsYXRfdXRpbC5oIgorCisvLyBFbnN1cmUgdGhlIGluY2x1ZGVkIGZsYXRidWZmZXJzLmggaXMgdGhlIHNhbWUgdmVyc2lvbiBhcyB3aGVuIHRoaXMgZmlsZSB3YXMKKy8vIGdlbmVyYXRlZCwgb3RoZXJ3aXNlIGl0IG1heSBub3QgYmUgY29tcGF0aWJsZS4KK3N0YXRpY19hc3NlcnQoRkxBVEJVRkZFUlNfVkVSU0lPTl9NQUpPUiA9PSAyICYmCisgICAgICAgICAgICAgIEZMQVRCVUZGRVJTX1ZFUlNJT05fTUlOT1IgPT0gMCAmJgorICAgICAgICAgICAgICBGTEFUQlVGRkVSU19WRVJTSU9OX1JFVklTSU9OID09IDgsCisgICAgICAgICAgICAgIk5vbi1jb21wYXRpYmxlIGZsYXRidWZmZXJzIHZlcnNpb24gaW5jbHVkZWQiKTsKIAogbmFtZXNwYWNlIE15R2FtZSB7CiAKQEAgLTM1LDYgKzQzLDggQEAKIAogc3RydWN0IFN0cnVjdE9mU3RydWN0czsKIAorc3RydWN0IFN0cnVjdE9mU3RydWN0c09mU3RydWN0czsKKwogc3RydWN0IFN0YXQ7CiBzdHJ1Y3QgU3RhdEJ1aWxkZXI7CiBzdHJ1Y3QgU3RhdFQ7CkBAIC03Myw2ICs4Myw4IEBACiAKIGlubGluZSBjb25zdCBmbGF0YnVmZmVyczo6VHlwZVRhYmxlICpTdHJ1Y3RPZlN0cnVjdHNUeXBlVGFibGUoKTsKIAoraW5saW5lIGNvbnN0IGZsYXRidWZmZXJzOjpUeXBlVGFibGUgKlN0cnVjdE9mU3RydWN0c09mU3RydWN0c1R5cGVUYWJsZSgpOworCiBpbmxpbmUgY29uc3QgZmxhdGJ1ZmZlcnM6OlR5cGVUYWJsZSAqU3RhdFR5cGVUYWJsZSgpOwogCiBpbmxpbmUgY29uc3QgZmxhdGJ1ZmZlcnM6OlR5cGVUYWJsZSAqUmVmZXJyYWJsZVR5cGVUYWJsZSgpOwpAQCAtODE1LDYgKzgyNyw0NyBAQAogICB1c2luZyBGaWVsZFR5cGUgPSBkZWNsdHlwZShzdGQ6OmRlY2x2YWw8dHlwZT4oKS5nZXRfZmllbGQ8SW5kZXg+KCkpOwogfTsKIAorRkxBVEJVRkZFUlNfTUFOVUFMTFlfQUxJR05FRF9TVFJVQ1QoNCkgU3RydWN0T2ZTdHJ1Y3RzT2ZTdHJ1Y3RzIEZMQVRCVUZGRVJTX0ZJTkFMX0NMQVNTIHsKKyBwcml2YXRlOgorICBNeUdhbWU6OkV4YW1wbGU6OlN0cnVjdE9mU3RydWN0cyBhXzsKKworIHB1YmxpYzoKKyAgc3RydWN0IFRyYWl0czsKKyAgc3RhdGljIGNvbnN0IGZsYXRidWZmZXJzOjpUeXBlVGFibGUgKk1pbmlSZWZsZWN0VHlwZVRhYmxlKCkgeworICAgIHJldHVybiBTdHJ1Y3RPZlN0cnVjdHNPZlN0cnVjdHNUeXBlVGFibGUoKTsKKyAgfQorICBTdHJ1Y3RPZlN0cnVjdHNPZlN0cnVjdHMoKQorICAgICAgOiBhXygpIHsKKyAgfQorICBTdHJ1Y3RPZlN0cnVjdHNPZlN0cnVjdHMoY29uc3QgTXlHYW1lOjpFeGFtcGxlOjpTdHJ1Y3RPZlN0cnVjdHMgJl9hKQorICAgICAgOiBhXyhfYSkgeworICB9CisgIGNvbnN0IE15R2FtZTo6RXhhbXBsZTo6U3RydWN0T2ZTdHJ1Y3RzICZhKCkgY29uc3QgeworICAgIHJldHVybiBhXzsKKyAgfQorICBNeUdhbWU6OkV4YW1wbGU6OlN0cnVjdE9mU3RydWN0cyAmbXV0YWJsZV9hKCkgeworICAgIHJldHVybiBhXzsKKyAgfQorICB0ZW1wbGF0ZTxzaXplX3QgSW5kZXg+CisgIGF1dG8gZ2V0X2ZpZWxkKCkgY29uc3QgeworICAgICAgICAgaWYgY29uc3RleHByIChJbmRleCA9PSAwKSByZXR1cm4gYSgpOworICAgIGVsc2Ugc3RhdGljX2Fzc2VydChJbmRleCAhPSBJbmRleCwgIkludmFsaWQgRmllbGQgSW5kZXgiKTsKKyAgfQorfTsKK0ZMQVRCVUZGRVJTX1NUUlVDVF9FTkQoU3RydWN0T2ZTdHJ1Y3RzT2ZTdHJ1Y3RzLCAyMCk7CisKK3N0cnVjdCBTdHJ1Y3RPZlN0cnVjdHNPZlN0cnVjdHM6OlRyYWl0cyB7CisgIHVzaW5nIHR5cGUgPSBTdHJ1Y3RPZlN0cnVjdHNPZlN0cnVjdHM7CisgIHN0YXRpYyBjb25zdGV4cHIgYXV0byBuYW1lID0gIlN0cnVjdE9mU3RydWN0c09mU3RydWN0cyI7CisgIHN0YXRpYyBjb25zdGV4cHIgYXV0byBmdWxseV9xdWFsaWZpZWRfbmFtZSA9ICJNeUdhbWUuRXhhbXBsZS5TdHJ1Y3RPZlN0cnVjdHNPZlN0cnVjdHMiOworICBzdGF0aWMgY29uc3RleHByIHNpemVfdCBmaWVsZHNfbnVtYmVyID0gMTsKKyAgc3RhdGljIGNvbnN0ZXhwciBzdGQ6OmFycmF5PGNvbnN0IGNoYXIgKiwgZmllbGRzX251bWJlcj4gZmllbGRfbmFtZXMgPSB7CisgICAgImEiCisgIH07CisgIHRlbXBsYXRlPHNpemVfdCBJbmRleD4KKyAgdXNpbmcgRmllbGRUeXBlID0gZGVjbHR5cGUoc3RkOjpkZWNsdmFsPHR5cGU+KCkuZ2V0X2ZpZWxkPEluZGV4PigpKTsKK307CisKIH0gIC8vIG5hbWVzcGFjZSBFeGFtcGxlCiAKIHN0cnVjdCBJblBhcmVudE5hbWVzcGFjZVQgOiBwdWJsaWMgZmxhdGJ1ZmZlcnM6Ok5hdGl2ZVRhYmxlIHsKQEAgLTI5MTIsNTUgKzI5NjUsNDggQEAKICAgeyBhdXRvIF9lID0gY29sb3IoKTsgX28tPmNvbG9yID0gX2U7IH0KICAgeyBhdXRvIF9lID0gdGVzdF90eXBlKCk7IF9vLT50ZXN0LnR5cGUgPSBfZTsgfQogICB7IGF1dG8gX2UgPSB0ZXN0KCk7IGlmIChfZSkgX28tPnRlc3QudmFsdWUgPSBNeUdhbWU6OkV4YW1wbGU6OkFueVVuaW9uOjpVblBhY2soX2UsIHRlc3RfdHlwZSgpLCBfcmVzb2x2ZXIpOyB9Ci0gIHsgYXV0byBfZSA9IHRlc3Q0KCk7IGlmIChfZSkgeyBfby0+dGVzdDQucmVzaXplKF9lLT5zaXplKCkpOyBmb3IgKGZsYXRidWZmZXJzOjp1b2Zmc2V0X3QgX2kgPSAwOyBfaSA8IF9lLT5zaXplKCk7IF9pKyspIHsgX28tPnRlc3Q0W19pXSA9ICpfZS0+R2V0KF9pKTsgfSB9IH0KLSAgeyBhdXRvIF9lID0gdGVzdGFycmF5b2ZzdHJpbmcoKTsgaWYgKF9lKSB7IF9vLT50ZXN0YXJyYXlvZnN0cmluZy5yZXNpemUoX2UtPnNpemUoKSk7IGZvciAoZmxhdGJ1ZmZlcnM6OnVvZmZzZXRfdCBfaSA9IDA7IF9pIDwgX2UtPnNpemUoKTsgX2krKykgeyBfby0+dGVzdGFycmF5b2ZzdHJpbmdbX2ldID0gX2UtPkdldChfaSktPnN0cigpOyB9IH0gfQotICB7IGF1dG8gX2UgPSB0ZXN0YXJyYXlvZnRhYmxlcygpOyBpZiAoX2UpIHsgX28tPnRlc3RhcnJheW9mdGFibGVzLnJlc2l6ZShfZS0+c2l6ZSgpKTsgZm9yIChmbGF0YnVmZmVyczo6dW9mZnNldF90IF9pID0gMDsgX2kgPCBfZS0+c2l6ZSgpOyBfaSsrKSB7IGlmKF9vLT50ZXN0YXJyYXlvZnRhYmxlc1tfaV0pIHsgX2UtPkdldChfaSktPlVuUGFja1RvKF9vLT50ZXN0YXJyYXlvZnRhYmxlc1tfaV0uZ2V0KCksIF9yZXNvbHZlcik7IH0gZWxzZSB7IF9vLT50ZXN0YXJyYXlvZnRhYmxlc1tfaV0gPSBzdGQ6OnVuaXF1ZV9wdHI8TXlHYW1lOjpFeGFtcGxlOjpNb25zdGVyVD4oX2UtPkdldChfaSktPlVuUGFjayhfcmVzb2x2ZXIpKTsgfTsgfSB9IH0KLSAgeyBhdXRvIF9lID0gZW5lbXkoKTsgaWYgKF9lKSB7IGlmKF9vLT5lbmVteSkgeyBfZS0+VW5QYWNrVG8oX28tPmVuZW15LmdldCgpLCBfcmVzb2x2ZXIpOyB9IGVsc2UgeyBfby0+ZW5lbXkgPSBzdGQ6OnVuaXF1ZV9wdHI8TXlHYW1lOjpFeGFtcGxlOjpNb25zdGVyVD4oX2UtPlVuUGFjayhfcmVzb2x2ZXIpKTsgfSB9IH0KKyAgeyBhdXRvIF9lID0gdGVzdDQoKTsgaWYgKF9lKSB7IF9vLT50ZXN0NC5yZXNpemUoX2UtPnNpemUoKSk7IGZvciAoZmxhdGJ1ZmZlcnM6OnVvZmZzZXRfdCBfaSA9IDA7IF9pIDwgX2UtPnNpemUoKTsgX2krKykgeyBfby0+dGVzdDRbX2ldID0gKl9lLT5HZXQoX2kpOyB9IH0gZWxzZSB7IF9vLT50ZXN0NC5yZXNpemUoMCk7IH0gfQorICB7IGF1dG8gX2UgPSB0ZXN0YXJyYXlvZnN0cmluZygpOyBpZiAoX2UpIHsgX28tPnRlc3RhcnJheW9mc3RyaW5nLnJlc2l6ZShfZS0+c2l6ZSgpKTsgZm9yIChmbGF0YnVmZmVyczo6dW9mZnNldF90IF9pID0gMDsgX2kgPCBfZS0+c2l6ZSgpOyBfaSsrKSB7IF9vLT50ZXN0YXJyYXlvZnN0cmluZ1tfaV0gPSBfZS0+R2V0KF9pKS0+c3RyKCk7IH0gfSBlbHNlIHsgX28tPnRlc3RhcnJheW9mc3RyaW5nLnJlc2l6ZSgwKTsgfSB9CisgIHsgYXV0byBfZSA9IHRlc3RhcnJheW9mdGFibGVzKCk7IGlmIChfZSkgeyBfby0+dGVzdGFycmF5b2Z0YWJsZXMucmVzaXplKF9lLT5zaXplKCkpOyBmb3IgKGZsYXRidWZmZXJzOjp1b2Zmc2V0X3QgX2kgPSAwOyBfaSA8IF9lLT5zaXplKCk7IF9pKyspIHsgaWYoX28tPnRlc3RhcnJheW9mdGFibGVzW19pXSkgeyBfZS0+R2V0KF9pKS0+VW5QYWNrVG8oX28tPnRlc3RhcnJheW9mdGFibGVzW19pXS5nZXQoKSwgX3Jlc29sdmVyKTsgfSBlbHNlIHsgX28tPnRlc3RhcnJheW9mdGFibGVzW19pXSA9IHN0ZDo6dW5pcXVlX3B0cjxNeUdhbWU6OkV4YW1wbGU6Ok1vbnN0ZXJUPihfZS0+R2V0KF9pKS0+VW5QYWNrKF9yZXNvbHZlcikpOyB9OyB9IH0gZWxzZSB7IF9vLT50ZXN0YXJyYXlvZnRhYmxlcy5yZXNpemUoMCk7IH0gfQorICB7IGF1dG8gX2UgPSBlbmVteSgpOyBpZiAoX2UpIHsgaWYoX28tPmVuZW15KSB7IF9lLT5VblBhY2tUbyhfby0+ZW5lbXkuZ2V0KCksIF9yZXNvbHZlcik7IH0gZWxzZSB7IF9vLT5lbmVteSA9IHN0ZDo6dW5pcXVlX3B0cjxNeUdhbWU6OkV4YW1wbGU6Ok1vbnN0ZXJUPihfZS0+VW5QYWNrKF9yZXNvbHZlcikpOyB9IH0gZWxzZSBpZiAoX28tPmVuZW15KSB7IF9vLT5lbmVteS5yZXNldCgpOyB9IH0KICAgeyBhdXRvIF9lID0gdGVzdG5lc3RlZGZsYXRidWZmZXIoKTsgaWYgKF9lKSB7IF9vLT50ZXN0bmVzdGVkZmxhdGJ1ZmZlci5yZXNpemUoX2UtPnNpemUoKSk7IHN0ZDo6Y29weShfZS0+YmVnaW4oKSwgX2UtPmVuZCgpLCBfby0+dGVzdG5lc3RlZGZsYXRidWZmZXIuYmVnaW4oKSk7IH0gfQotICB7IGF1dG8gX2UgPSB0ZXN0ZW1wdHkoKTsgaWYgKF9lKSB7IGlmKF9vLT50ZXN0ZW1wdHkpIHsgX2UtPlVuUGFja1RvKF9vLT50ZXN0ZW1wdHkuZ2V0KCksIF9yZXNvbHZlcik7IH0gZWxzZSB7IF9vLT50ZXN0ZW1wdHkgPSBzdGQ6OnVuaXF1ZV9wdHI8TXlHYW1lOjpFeGFtcGxlOjpTdGF0VD4oX2UtPlVuUGFjayhfcmVzb2x2ZXIpKTsgfSB9IH0KKyAgeyBhdXRvIF9lID0gdGVzdGVtcHR5KCk7IGlmIChfZSkgeyBpZihfby0+dGVzdGVtcHR5KSB7IF9lLT5VblBhY2tUbyhfby0+dGVzdGVtcHR5LmdldCgpLCBfcmVzb2x2ZXIpOyB9IGVsc2UgeyBfby0+dGVzdGVtcHR5ID0gc3RkOjp1bmlxdWVfcHRyPE15R2FtZTo6RXhhbXBsZTo6U3RhdFQ+KF9lLT5VblBhY2soX3Jlc29sdmVyKSk7IH0gfSBlbHNlIGlmIChfby0+dGVzdGVtcHR5KSB7IF9vLT50ZXN0ZW1wdHkucmVzZXQoKTsgfSB9CiAgIHsgYXV0byBfZSA9IHRlc3Rib29sKCk7IF9vLT50ZXN0Ym9vbCA9IF9lOyB9CiAgIHsgYXV0byBfZSA9IHRlc3RoYXNoczMyX2ZudjEoKTsgX28tPnRlc3RoYXNoczMyX2ZudjEgPSBfZTsgfQogICB7IGF1dG8gX2UgPSB0ZXN0aGFzaHUzMl9mbnYxKCk7IF9vLT50ZXN0aGFzaHUzMl9mbnYxID0gX2U7IH0KICAgeyBhdXRvIF9lID0gdGVzdGhhc2hzNjRfZm52MSgpOyBfby0+dGVzdGhhc2hzNjRfZm52MSA9IF9lOyB9CiAgIHsgYXV0byBfZSA9IHRlc3RoYXNodTY0X2ZudjEoKTsgX28tPnRlc3RoYXNodTY0X2ZudjEgPSBfZTsgfQogICB7IGF1dG8gX2UgPSB0ZXN0aGFzaHMzMl9mbnYxYSgpOyBfby0+dGVzdGhhc2hzMzJfZm52MWEgPSBfZTsgfQotICB7IGF1dG8gX2UgPSB0ZXN0aGFzaHUzMl9mbnYxYSgpOyAvL3NjYWxhciByZXNvbHZlciwgbmFrZWQgCi1pZiAoX3Jlc29sdmVyKSAoKl9yZXNvbHZlcikocmVpbnRlcnByZXRfY2FzdDx2b2lkICoqPigmX28tPnRlc3RoYXNodTMyX2ZudjFhKSwgc3RhdGljX2Nhc3Q8ZmxhdGJ1ZmZlcnM6Omhhc2hfdmFsdWVfdD4oX2UpKTsgZWxzZSBfby0+dGVzdGhhc2h1MzJfZm52MWEgPSBudWxscHRyOyB9CisgIHsgYXV0byBfZSA9IHRlc3RoYXNodTMyX2ZudjFhKCk7IC8qc2NhbGFyIHJlc29sdmVyLCBuYWtlZCovIGlmIChfcmVzb2x2ZXIpICgqX3Jlc29sdmVyKShyZWludGVycHJldF9jYXN0PHZvaWQgKio+KCZfby0+dGVzdGhhc2h1MzJfZm52MWEpLCBzdGF0aWNfY2FzdDxmbGF0YnVmZmVyczo6aGFzaF92YWx1ZV90PihfZSkpOyBlbHNlIF9vLT50ZXN0aGFzaHUzMl9mbnYxYSA9IG51bGxwdHI7IH0KICAgeyBhdXRvIF9lID0gdGVzdGhhc2hzNjRfZm52MWEoKTsgX28tPnRlc3RoYXNoczY0X2ZudjFhID0gX2U7IH0KICAgeyBhdXRvIF9lID0gdGVzdGhhc2h1NjRfZm52MWEoKTsgX28tPnRlc3RoYXNodTY0X2ZudjFhID0gX2U7IH0KLSAgeyBhdXRvIF9lID0gdGVzdGFycmF5b2Zib29scygpOyBpZiAoX2UpIHsgX28tPnRlc3RhcnJheW9mYm9vbHMucmVzaXplKF9lLT5zaXplKCkpOyBmb3IgKGZsYXRidWZmZXJzOjp1b2Zmc2V0X3QgX2kgPSAwOyBfaSA8IF9lLT5zaXplKCk7IF9pKyspIHsgX28tPnRlc3RhcnJheW9mYm9vbHNbX2ldID0gX2UtPkdldChfaSkgIT0gMDsgfSB9IH0KKyAgeyBhdXRvIF9lID0gdGVzdGFycmF5b2Zib29scygpOyBpZiAoX2UpIHsgX28tPnRlc3RhcnJheW9mYm9vbHMucmVzaXplKF9lLT5zaXplKCkpOyBmb3IgKGZsYXRidWZmZXJzOjp1b2Zmc2V0X3QgX2kgPSAwOyBfaSA8IF9lLT5zaXplKCk7IF9pKyspIHsgX28tPnRlc3RhcnJheW9mYm9vbHNbX2ldID0gX2UtPkdldChfaSkgIT0gMDsgfSB9IGVsc2UgeyBfby0+dGVzdGFycmF5b2Zib29scy5yZXNpemUoMCk7IH0gfQogICB7IGF1dG8gX2UgPSB0ZXN0ZigpOyBfby0+dGVzdGYgPSBfZTsgfQogICB7IGF1dG8gX2UgPSB0ZXN0ZjIoKTsgX28tPnRlc3RmMiA9IF9lOyB9CiAgIHsgYXV0byBfZSA9IHRlc3RmMygpOyBfby0+dGVzdGYzID0gX2U7IH0KLSAgeyBhdXRvIF9lID0gdGVzdGFycmF5b2ZzdHJpbmcyKCk7IGlmIChfZSkgeyBfby0+dGVzdGFycmF5b2ZzdHJpbmcyLnJlc2l6ZShfZS0+c2l6ZSgpKTsgZm9yIChmbGF0YnVmZmVyczo6dW9mZnNldF90IF9pID0gMDsgX2kgPCBfZS0+c2l6ZSgpOyBfaSsrKSB7IF9vLT50ZXN0YXJyYXlvZnN0cmluZzJbX2ldID0gX2UtPkdldChfaSktPnN0cigpOyB9IH0gfQotICB7IGF1dG8gX2UgPSB0ZXN0YXJyYXlvZnNvcnRlZHN0cnVjdCgpOyBpZiAoX2UpIHsgX28tPnRlc3RhcnJheW9mc29ydGVkc3RydWN0LnJlc2l6ZShfZS0+c2l6ZSgpKTsgZm9yIChmbGF0YnVmZmVyczo6dW9mZnNldF90IF9pID0gMDsgX2kgPCBfZS0+c2l6ZSgpOyBfaSsrKSB7IF9vLT50ZXN0YXJyYXlvZnNvcnRlZHN0cnVjdFtfaV0gPSAqX2UtPkdldChfaSk7IH0gfSB9CisgIHsgYXV0byBfZSA9IHRlc3RhcnJheW9mc3RyaW5nMigpOyBpZiAoX2UpIHsgX28tPnRlc3RhcnJheW9mc3RyaW5nMi5yZXNpemUoX2UtPnNpemUoKSk7IGZvciAoZmxhdGJ1ZmZlcnM6OnVvZmZzZXRfdCBfaSA9IDA7IF9pIDwgX2UtPnNpemUoKTsgX2krKykgeyBfby0+dGVzdGFycmF5b2ZzdHJpbmcyW19pXSA9IF9lLT5HZXQoX2kpLT5zdHIoKTsgfSB9IGVsc2UgeyBfby0+dGVzdGFycmF5b2ZzdHJpbmcyLnJlc2l6ZSgwKTsgfSB9CisgIHsgYXV0byBfZSA9IHRlc3RhcnJheW9mc29ydGVkc3RydWN0KCk7IGlmIChfZSkgeyBfby0+dGVzdGFycmF5b2Zzb3J0ZWRzdHJ1Y3QucmVzaXplKF9lLT5zaXplKCkpOyBmb3IgKGZsYXRidWZmZXJzOjp1b2Zmc2V0X3QgX2kgPSAwOyBfaSA8IF9lLT5zaXplKCk7IF9pKyspIHsgX28tPnRlc3RhcnJheW9mc29ydGVkc3RydWN0W19pXSA9ICpfZS0+R2V0KF9pKTsgfSB9IGVsc2UgeyBfby0+dGVzdGFycmF5b2Zzb3J0ZWRzdHJ1Y3QucmVzaXplKDApOyB9IH0KICAgeyBhdXRvIF9lID0gZmxleCgpOyBpZiAoX2UpIHsgX28tPmZsZXgucmVzaXplKF9lLT5zaXplKCkpOyBzdGQ6OmNvcHkoX2UtPmJlZ2luKCksIF9lLT5lbmQoKSwgX28tPmZsZXguYmVnaW4oKSk7IH0gfQotICB7IGF1dG8gX2UgPSB0ZXN0NSgpOyBpZiAoX2UpIHsgX28tPnRlc3Q1LnJlc2l6ZShfZS0+c2l6ZSgpKTsgZm9yIChmbGF0YnVmZmVyczo6dW9mZnNldF90IF9pID0gMDsgX2kgPCBfZS0+c2l6ZSgpOyBfaSsrKSB7IF9vLT50ZXN0NVtfaV0gPSAqX2UtPkdldChfaSk7IH0gfSB9Ci0gIHsgYXV0byBfZSA9IHZlY3Rvcl9vZl9sb25ncygpOyBpZiAoX2UpIHsgX28tPnZlY3Rvcl9vZl9sb25ncy5yZXNpemUoX2UtPnNpemUoKSk7IGZvciAoZmxhdGJ1ZmZlcnM6OnVvZmZzZXRfdCBfaSA9IDA7IF9pIDwgX2UtPnNpemUoKTsgX2krKykgeyBfby0+dmVjdG9yX29mX2xvbmdzW19pXSA9IF9lLT5HZXQoX2kpOyB9IH0gfQotICB7IGF1dG8gX2UgPSB2ZWN0b3Jfb2ZfZG91YmxlcygpOyBpZiAoX2UpIHsgX28tPnZlY3Rvcl9vZl9kb3VibGVzLnJlc2l6ZShfZS0+c2l6ZSgpKTsgZm9yIChmbGF0YnVmZmVyczo6dW9mZnNldF90IF9pID0gMDsgX2kgPCBfZS0+c2l6ZSgpOyBfaSsrKSB7IF9vLT52ZWN0b3Jfb2ZfZG91Ymxlc1tfaV0gPSBfZS0+R2V0KF9pKTsgfSB9IH0KLSAgeyBhdXRvIF9lID0gcGFyZW50X25hbWVzcGFjZV90ZXN0KCk7IGlmIChfZSkgeyBpZihfby0+cGFyZW50X25hbWVzcGFjZV90ZXN0KSB7IF9lLT5VblBhY2tUbyhfby0+cGFyZW50X25hbWVzcGFjZV90ZXN0LmdldCgpLCBfcmVzb2x2ZXIpOyB9IGVsc2UgeyBfby0+cGFyZW50X25hbWVzcGFjZV90ZXN0ID0gc3RkOjp1bmlxdWVfcHRyPE15R2FtZTo6SW5QYXJlbnROYW1lc3BhY2VUPihfZS0+VW5QYWNrKF9yZXNvbHZlcikpOyB9IH0gfQotICB7IGF1dG8gX2UgPSB2ZWN0b3Jfb2ZfcmVmZXJyYWJsZXMoKTsgaWYgKF9lKSB7IF9vLT52ZWN0b3Jfb2ZfcmVmZXJyYWJsZXMucmVzaXplKF9lLT5zaXplKCkpOyBmb3IgKGZsYXRidWZmZXJzOjp1b2Zmc2V0X3QgX2kgPSAwOyBfaSA8IF9lLT5zaXplKCk7IF9pKyspIHsgaWYoX28tPnZlY3Rvcl9vZl9yZWZlcnJhYmxlc1tfaV0pIHsgX2UtPkdldChfaSktPlVuUGFja1RvKF9vLT52ZWN0b3Jfb2ZfcmVmZXJyYWJsZXNbX2ldLmdldCgpLCBfcmVzb2x2ZXIpOyB9IGVsc2UgeyBfby0+dmVjdG9yX29mX3JlZmVycmFibGVzW19pXSA9IHN0ZDo6dW5pcXVlX3B0cjxNeUdhbWU6OkV4YW1wbGU6OlJlZmVycmFibGVUPihfZS0+R2V0KF9pKS0+VW5QYWNrKF9yZXNvbHZlcikpOyB9OyB9IH0gfQotICB7IGF1dG8gX2UgPSBzaW5nbGVfd2Vha19yZWZlcmVuY2UoKTsgLy9zY2FsYXIgcmVzb2x2ZXIsIG5ha2VkIAotaWYgKF9yZXNvbHZlcikgKCpfcmVzb2x2ZXIpKHJlaW50ZXJwcmV0X2Nhc3Q8dm9pZCAqKj4oJl9vLT5zaW5nbGVfd2Vha19yZWZlcmVuY2UpLCBzdGF0aWNfY2FzdDxmbGF0YnVmZmVyczo6aGFzaF92YWx1ZV90PihfZSkpOyBlbHNlIF9vLT5zaW5nbGVfd2Vha19yZWZlcmVuY2UgPSBudWxscHRyOyB9Ci0gIHsgYXV0byBfZSA9IHZlY3Rvcl9vZl93ZWFrX3JlZmVyZW5jZXMoKTsgaWYgKF9lKSB7IF9vLT52ZWN0b3Jfb2Zfd2Vha19yZWZlcmVuY2VzLnJlc2l6ZShfZS0+c2l6ZSgpKTsgZm9yIChmbGF0YnVmZmVyczo6dW9mZnNldF90IF9pID0gMDsgX2kgPCBfZS0+c2l6ZSgpOyBfaSsrKSB7IC8vdmVjdG9yIHJlc29sdmVyLCBuYWtlZAotaWYgKF9yZXNvbHZlcikgKCpfcmVzb2x2ZXIpKHJlaW50ZXJwcmV0X2Nhc3Q8dm9pZCAqKj4oJl9vLT52ZWN0b3Jfb2Zfd2Vha19yZWZlcmVuY2VzW19pXSksIHN0YXRpY19jYXN0PGZsYXRidWZmZXJzOjpoYXNoX3ZhbHVlX3Q+KF9lLT5HZXQoX2kpKSk7IGVsc2UgX28tPnZlY3Rvcl9vZl93ZWFrX3JlZmVyZW5jZXNbX2ldID0gbnVsbHB0cjsgfSB9IH0KLSAgeyBhdXRvIF9lID0gdmVjdG9yX29mX3N0cm9uZ19yZWZlcnJhYmxlcygpOyBpZiAoX2UpIHsgX28tPnZlY3Rvcl9vZl9zdHJvbmdfcmVmZXJyYWJsZXMucmVzaXplKF9lLT5zaXplKCkpOyBmb3IgKGZsYXRidWZmZXJzOjp1b2Zmc2V0X3QgX2kgPSAwOyBfaSA8IF9lLT5zaXplKCk7IF9pKyspIHsgaWYoX28tPnZlY3Rvcl9vZl9zdHJvbmdfcmVmZXJyYWJsZXNbX2ldKSB7IF9lLT5HZXQoX2kpLT5VblBhY2tUbyhfby0+dmVjdG9yX29mX3N0cm9uZ19yZWZlcnJhYmxlc1tfaV0uZ2V0KCksIF9yZXNvbHZlcik7IH0gZWxzZSB7IF9vLT52ZWN0b3Jfb2Zfc3Ryb25nX3JlZmVycmFibGVzW19pXSA9IHN0ZDo6dW5pcXVlX3B0cjxNeUdhbWU6OkV4YW1wbGU6OlJlZmVycmFibGVUPihfZS0+R2V0KF9pKS0+VW5QYWNrKF9yZXNvbHZlcikpOyB9OyB9IH0gfQotICB7IGF1dG8gX2UgPSBjb19vd25pbmdfcmVmZXJlbmNlKCk7IC8vc2NhbGFyIHJlc29sdmVyLCBuYWtlZCAKLWlmIChfcmVzb2x2ZXIpICgqX3Jlc29sdmVyKShyZWludGVycHJldF9jYXN0PHZvaWQgKio+KCZfby0+Y29fb3duaW5nX3JlZmVyZW5jZSksIHN0YXRpY19jYXN0PGZsYXRidWZmZXJzOjpoYXNoX3ZhbHVlX3Q+KF9lKSk7IGVsc2UgX28tPmNvX293bmluZ19yZWZlcmVuY2UgPSBudWxscHRyOyB9Ci0gIHsgYXV0byBfZSA9IHZlY3Rvcl9vZl9jb19vd25pbmdfcmVmZXJlbmNlcygpOyBpZiAoX2UpIHsgX28tPnZlY3Rvcl9vZl9jb19vd25pbmdfcmVmZXJlbmNlcy5yZXNpemUoX2UtPnNpemUoKSk7IGZvciAoZmxhdGJ1ZmZlcnM6OnVvZmZzZXRfdCBfaSA9IDA7IF9pIDwgX2UtPnNpemUoKTsgX2krKykgeyAvL3ZlY3RvciByZXNvbHZlciwgZGVmYXVsdF9wdHJfdHlwZQotaWYgKF9yZXNvbHZlcikgKCpfcmVzb2x2ZXIpKHJlaW50ZXJwcmV0X2Nhc3Q8dm9pZCAqKj4oJl9vLT52ZWN0b3Jfb2ZfY29fb3duaW5nX3JlZmVyZW5jZXNbX2ldKSwgc3RhdGljX2Nhc3Q8ZmxhdGJ1ZmZlcnM6Omhhc2hfdmFsdWVfdD4oX2UtPkdldChfaSkpKTsvKiBlbHNlIGRvIG5vdGhpbmcgKi87IH0gfSB9Ci0gIHsgYXV0byBfZSA9IG5vbl9vd25pbmdfcmVmZXJlbmNlKCk7IC8vc2NhbGFyIHJlc29sdmVyLCBuYWtlZCAKLWlmIChfcmVzb2x2ZXIpICgqX3Jlc29sdmVyKShyZWludGVycHJldF9jYXN0PHZvaWQgKio+KCZfby0+bm9uX293bmluZ19yZWZlcmVuY2UpLCBzdGF0aWNfY2FzdDxmbGF0YnVmZmVyczo6aGFzaF92YWx1ZV90PihfZSkpOyBlbHNlIF9vLT5ub25fb3duaW5nX3JlZmVyZW5jZSA9IG51bGxwdHI7IH0KLSAgeyBhdXRvIF9lID0gdmVjdG9yX29mX25vbl9vd25pbmdfcmVmZXJlbmNlcygpOyBpZiAoX2UpIHsgX28tPnZlY3Rvcl9vZl9ub25fb3duaW5nX3JlZmVyZW5jZXMucmVzaXplKF9lLT5zaXplKCkpOyBmb3IgKGZsYXRidWZmZXJzOjp1b2Zmc2V0X3QgX2kgPSAwOyBfaSA8IF9lLT5zaXplKCk7IF9pKyspIHsgLy92ZWN0b3IgcmVzb2x2ZXIsIG5ha2VkCi1pZiAoX3Jlc29sdmVyKSAoKl9yZXNvbHZlcikocmVpbnRlcnByZXRfY2FzdDx2b2lkICoqPigmX28tPnZlY3Rvcl9vZl9ub25fb3duaW5nX3JlZmVyZW5jZXNbX2ldKSwgc3RhdGljX2Nhc3Q8ZmxhdGJ1ZmZlcnM6Omhhc2hfdmFsdWVfdD4oX2UtPkdldChfaSkpKTsgZWxzZSBfby0+dmVjdG9yX29mX25vbl9vd25pbmdfcmVmZXJlbmNlc1tfaV0gPSBudWxscHRyOyB9IH0gfQorICB7IGF1dG8gX2UgPSB0ZXN0NSgpOyBpZiAoX2UpIHsgX28tPnRlc3Q1LnJlc2l6ZShfZS0+c2l6ZSgpKTsgZm9yIChmbGF0YnVmZmVyczo6dW9mZnNldF90IF9pID0gMDsgX2kgPCBfZS0+c2l6ZSgpOyBfaSsrKSB7IF9vLT50ZXN0NVtfaV0gPSAqX2UtPkdldChfaSk7IH0gfSBlbHNlIHsgX28tPnRlc3Q1LnJlc2l6ZSgwKTsgfSB9CisgIHsgYXV0byBfZSA9IHZlY3Rvcl9vZl9sb25ncygpOyBpZiAoX2UpIHsgX28tPnZlY3Rvcl9vZl9sb25ncy5yZXNpemUoX2UtPnNpemUoKSk7IGZvciAoZmxhdGJ1ZmZlcnM6OnVvZmZzZXRfdCBfaSA9IDA7IF9pIDwgX2UtPnNpemUoKTsgX2krKykgeyBfby0+dmVjdG9yX29mX2xvbmdzW19pXSA9IF9lLT5HZXQoX2kpOyB9IH0gZWxzZSB7IF9vLT52ZWN0b3Jfb2ZfbG9uZ3MucmVzaXplKDApOyB9IH0KKyAgeyBhdXRvIF9lID0gdmVjdG9yX29mX2RvdWJsZXMoKTsgaWYgKF9lKSB7IF9vLT52ZWN0b3Jfb2ZfZG91Ymxlcy5yZXNpemUoX2UtPnNpemUoKSk7IGZvciAoZmxhdGJ1ZmZlcnM6OnVvZmZzZXRfdCBfaSA9IDA7IF9pIDwgX2UtPnNpemUoKTsgX2krKykgeyBfby0+dmVjdG9yX29mX2RvdWJsZXNbX2ldID0gX2UtPkdldChfaSk7IH0gfSBlbHNlIHsgX28tPnZlY3Rvcl9vZl9kb3VibGVzLnJlc2l6ZSgwKTsgfSB9CisgIHsgYXV0byBfZSA9IHBhcmVudF9uYW1lc3BhY2VfdGVzdCgpOyBpZiAoX2UpIHsgaWYoX28tPnBhcmVudF9uYW1lc3BhY2VfdGVzdCkgeyBfZS0+VW5QYWNrVG8oX28tPnBhcmVudF9uYW1lc3BhY2VfdGVzdC5nZXQoKSwgX3Jlc29sdmVyKTsgfSBlbHNlIHsgX28tPnBhcmVudF9uYW1lc3BhY2VfdGVzdCA9IHN0ZDo6dW5pcXVlX3B0cjxNeUdhbWU6OkluUGFyZW50TmFtZXNwYWNlVD4oX2UtPlVuUGFjayhfcmVzb2x2ZXIpKTsgfSB9IGVsc2UgaWYgKF9vLT5wYXJlbnRfbmFtZXNwYWNlX3Rlc3QpIHsgX28tPnBhcmVudF9uYW1lc3BhY2VfdGVzdC5yZXNldCgpOyB9IH0KKyAgeyBhdXRvIF9lID0gdmVjdG9yX29mX3JlZmVycmFibGVzKCk7IGlmIChfZSkgeyBfby0+dmVjdG9yX29mX3JlZmVycmFibGVzLnJlc2l6ZShfZS0+c2l6ZSgpKTsgZm9yIChmbGF0YnVmZmVyczo6dW9mZnNldF90IF9pID0gMDsgX2kgPCBfZS0+c2l6ZSgpOyBfaSsrKSB7IGlmKF9vLT52ZWN0b3Jfb2ZfcmVmZXJyYWJsZXNbX2ldKSB7IF9lLT5HZXQoX2kpLT5VblBhY2tUbyhfby0+dmVjdG9yX29mX3JlZmVycmFibGVzW19pXS5nZXQoKSwgX3Jlc29sdmVyKTsgfSBlbHNlIHsgX28tPnZlY3Rvcl9vZl9yZWZlcnJhYmxlc1tfaV0gPSBzdGQ6OnVuaXF1ZV9wdHI8TXlHYW1lOjpFeGFtcGxlOjpSZWZlcnJhYmxlVD4oX2UtPkdldChfaSktPlVuUGFjayhfcmVzb2x2ZXIpKTsgfTsgfSB9IGVsc2UgeyBfby0+dmVjdG9yX29mX3JlZmVycmFibGVzLnJlc2l6ZSgwKTsgfSB9CisgIHsgYXV0byBfZSA9IHNpbmdsZV93ZWFrX3JlZmVyZW5jZSgpOyAvKnNjYWxhciByZXNvbHZlciwgbmFrZWQqLyBpZiAoX3Jlc29sdmVyKSAoKl9yZXNvbHZlcikocmVpbnRlcnByZXRfY2FzdDx2b2lkICoqPigmX28tPnNpbmdsZV93ZWFrX3JlZmVyZW5jZSksIHN0YXRpY19jYXN0PGZsYXRidWZmZXJzOjpoYXNoX3ZhbHVlX3Q+KF9lKSk7IGVsc2UgX28tPnNpbmdsZV93ZWFrX3JlZmVyZW5jZSA9IG51bGxwdHI7IH0KKyAgeyBhdXRvIF9lID0gdmVjdG9yX29mX3dlYWtfcmVmZXJlbmNlcygpOyBpZiAoX2UpIHsgX28tPnZlY3Rvcl9vZl93ZWFrX3JlZmVyZW5jZXMucmVzaXplKF9lLT5zaXplKCkpOyBmb3IgKGZsYXRidWZmZXJzOjp1b2Zmc2V0X3QgX2kgPSAwOyBfaSA8IF9lLT5zaXplKCk7IF9pKyspIHsgLyp2ZWN0b3IgcmVzb2x2ZXIsIG5ha2VkKi8gaWYgKF9yZXNvbHZlcikgKCpfcmVzb2x2ZXIpKHJlaW50ZXJwcmV0X2Nhc3Q8dm9pZCAqKj4oJl9vLT52ZWN0b3Jfb2Zfd2Vha19yZWZlcmVuY2VzW19pXSksIHN0YXRpY19jYXN0PGZsYXRidWZmZXJzOjpoYXNoX3ZhbHVlX3Q+KF9lLT5HZXQoX2kpKSk7IGVsc2UgX28tPnZlY3Rvcl9vZl93ZWFrX3JlZmVyZW5jZXNbX2ldID0gbnVsbHB0cjsgfSB9IGVsc2UgeyBfby0+dmVjdG9yX29mX3dlYWtfcmVmZXJlbmNlcy5yZXNpemUoMCk7IH0gfQorICB7IGF1dG8gX2UgPSB2ZWN0b3Jfb2Zfc3Ryb25nX3JlZmVycmFibGVzKCk7IGlmIChfZSkgeyBfby0+dmVjdG9yX29mX3N0cm9uZ19yZWZlcnJhYmxlcy5yZXNpemUoX2UtPnNpemUoKSk7IGZvciAoZmxhdGJ1ZmZlcnM6OnVvZmZzZXRfdCBfaSA9IDA7IF9pIDwgX2UtPnNpemUoKTsgX2krKykgeyBpZihfby0+dmVjdG9yX29mX3N0cm9uZ19yZWZlcnJhYmxlc1tfaV0pIHsgX2UtPkdldChfaSktPlVuUGFja1RvKF9vLT52ZWN0b3Jfb2Zfc3Ryb25nX3JlZmVycmFibGVzW19pXS5nZXQoKSwgX3Jlc29sdmVyKTsgfSBlbHNlIHsgX28tPnZlY3Rvcl9vZl9zdHJvbmdfcmVmZXJyYWJsZXNbX2ldID0gc3RkOjp1bmlxdWVfcHRyPE15R2FtZTo6RXhhbXBsZTo6UmVmZXJyYWJsZVQ+KF9lLT5HZXQoX2kpLT5VblBhY2soX3Jlc29sdmVyKSk7IH07IH0gfSBlbHNlIHsgX28tPnZlY3Rvcl9vZl9zdHJvbmdfcmVmZXJyYWJsZXMucmVzaXplKDApOyB9IH0KKyAgeyBhdXRvIF9lID0gY29fb3duaW5nX3JlZmVyZW5jZSgpOyAvKnNjYWxhciByZXNvbHZlciwgbmFrZWQqLyBpZiAoX3Jlc29sdmVyKSAoKl9yZXNvbHZlcikocmVpbnRlcnByZXRfY2FzdDx2b2lkICoqPigmX28tPmNvX293bmluZ19yZWZlcmVuY2UpLCBzdGF0aWNfY2FzdDxmbGF0YnVmZmVyczo6aGFzaF92YWx1ZV90PihfZSkpOyBlbHNlIF9vLT5jb19vd25pbmdfcmVmZXJlbmNlID0gbnVsbHB0cjsgfQorICB7IGF1dG8gX2UgPSB2ZWN0b3Jfb2ZfY29fb3duaW5nX3JlZmVyZW5jZXMoKTsgaWYgKF9lKSB7IF9vLT52ZWN0b3Jfb2ZfY29fb3duaW5nX3JlZmVyZW5jZXMucmVzaXplKF9lLT5zaXplKCkpOyBmb3IgKGZsYXRidWZmZXJzOjp1b2Zmc2V0X3QgX2kgPSAwOyBfaSA8IF9lLT5zaXplKCk7IF9pKyspIHsgLyp2ZWN0b3IgcmVzb2x2ZXIsIGRlZmF1bHRfcHRyX3R5cGUqLyBpZiAoX3Jlc29sdmVyKSAoKl9yZXNvbHZlcikocmVpbnRlcnByZXRfY2FzdDx2b2lkICoqPigmX28tPnZlY3Rvcl9vZl9jb19vd25pbmdfcmVmZXJlbmNlc1tfaV0pLCBzdGF0aWNfY2FzdDxmbGF0YnVmZmVyczo6aGFzaF92YWx1ZV90PihfZS0+R2V0KF9pKSkpOy8qIGVsc2UgZG8gbm90aGluZyAqLzsgfSB9IGVsc2UgeyBfby0+dmVjdG9yX29mX2NvX293bmluZ19yZWZlcmVuY2VzLnJlc2l6ZSgwKTsgfSB9CisgIHsgYXV0byBfZSA9IG5vbl9vd25pbmdfcmVmZXJlbmNlKCk7IC8qc2NhbGFyIHJlc29sdmVyLCBuYWtlZCovIGlmIChfcmVzb2x2ZXIpICgqX3Jlc29sdmVyKShyZWludGVycHJldF9jYXN0PHZvaWQgKio+KCZfby0+bm9uX293bmluZ19yZWZlcmVuY2UpLCBzdGF0aWNfY2FzdDxmbGF0YnVmZmVyczo6aGFzaF92YWx1ZV90PihfZSkpOyBlbHNlIF9vLT5ub25fb3duaW5nX3JlZmVyZW5jZSA9IG51bGxwdHI7IH0KKyAgeyBhdXRvIF9lID0gdmVjdG9yX29mX25vbl9vd25pbmdfcmVmZXJlbmNlcygpOyBpZiAoX2UpIHsgX28tPnZlY3Rvcl9vZl9ub25fb3duaW5nX3JlZmVyZW5jZXMucmVzaXplKF9lLT5zaXplKCkpOyBmb3IgKGZsYXRidWZmZXJzOjp1b2Zmc2V0X3QgX2kgPSAwOyBfaSA8IF9lLT5zaXplKCk7IF9pKyspIHsgLyp2ZWN0b3IgcmVzb2x2ZXIsIG5ha2VkKi8gaWYgKF9yZXNvbHZlcikgKCpfcmVzb2x2ZXIpKHJlaW50ZXJwcmV0X2Nhc3Q8dm9pZCAqKj4oJl9vLT52ZWN0b3Jfb2Zfbm9uX293bmluZ19yZWZlcmVuY2VzW19pXSksIHN0YXRpY19jYXN0PGZsYXRidWZmZXJzOjpoYXNoX3ZhbHVlX3Q+KF9lLT5HZXQoX2kpKSk7IGVsc2UgX28tPnZlY3Rvcl9vZl9ub25fb3duaW5nX3JlZmVyZW5jZXNbX2ldID0gbnVsbHB0cjsgfSB9IGVsc2UgeyBfby0+dmVjdG9yX29mX25vbl9vd25pbmdfcmVmZXJlbmNlcy5yZXNpemUoMCk7IH0gfQogICB7IGF1dG8gX2UgPSBhbnlfdW5pcXVlX3R5cGUoKTsgX28tPmFueV91bmlxdWUudHlwZSA9IF9lOyB9CiAgIHsgYXV0byBfZSA9IGFueV91bmlxdWUoKTsgaWYgKF9lKSBfby0+YW55X3VuaXF1ZS52YWx1ZSA9IE15R2FtZTo6RXhhbXBsZTo6QW55VW5pcXVlQWxpYXNlc1VuaW9uOjpVblBhY2soX2UsIGFueV91bmlxdWVfdHlwZSgpLCBfcmVzb2x2ZXIpOyB9CiAgIHsgYXV0byBfZSA9IGFueV9hbWJpZ3VvdXNfdHlwZSgpOyBfby0+YW55X2FtYmlndW91cy50eXBlID0gX2U7IH0KICAgeyBhdXRvIF9lID0gYW55X2FtYmlndW91cygpOyBpZiAoX2UpIF9vLT5hbnlfYW1iaWd1b3VzLnZhbHVlID0gTXlHYW1lOjpFeGFtcGxlOjpBbnlBbWJpZ3VvdXNBbGlhc2VzVW5pb246OlVuUGFjayhfZSwgYW55X2FtYmlndW91c190eXBlKCksIF9yZXNvbHZlcik7IH0KLSAgeyBhdXRvIF9lID0gdmVjdG9yX29mX2VudW1zKCk7IGlmIChfZSkgeyBfby0+dmVjdG9yX29mX2VudW1zLnJlc2l6ZShfZS0+c2l6ZSgpKTsgZm9yIChmbGF0YnVmZmVyczo6dW9mZnNldF90IF9pID0gMDsgX2kgPCBfZS0+c2l6ZSgpOyBfaSsrKSB7IF9vLT52ZWN0b3Jfb2ZfZW51bXNbX2ldID0gc3RhdGljX2Nhc3Q8TXlHYW1lOjpFeGFtcGxlOjpDb2xvcj4oX2UtPkdldChfaSkpOyB9IH0gfQorICB7IGF1dG8gX2UgPSB2ZWN0b3Jfb2ZfZW51bXMoKTsgaWYgKF9lKSB7IF9vLT52ZWN0b3Jfb2ZfZW51bXMucmVzaXplKF9lLT5zaXplKCkpOyBmb3IgKGZsYXRidWZmZXJzOjp1b2Zmc2V0X3QgX2kgPSAwOyBfaSA8IF9lLT5zaXplKCk7IF9pKyspIHsgX28tPnZlY3Rvcl9vZl9lbnVtc1tfaV0gPSBzdGF0aWNfY2FzdDxNeUdhbWU6OkV4YW1wbGU6OkNvbG9yPihfZS0+R2V0KF9pKSk7IH0gfSBlbHNlIHsgX28tPnZlY3Rvcl9vZl9lbnVtcy5yZXNpemUoMCk7IH0gfQogICB7IGF1dG8gX2UgPSBzaWduZWRfZW51bSgpOyBfby0+c2lnbmVkX2VudW0gPSBfZTsgfQogICB7IGF1dG8gX2UgPSB0ZXN0cmVxdWlyZWRuZXN0ZWRmbGF0YnVmZmVyKCk7IGlmIChfZSkgeyBfby0+dGVzdHJlcXVpcmVkbmVzdGVkZmxhdGJ1ZmZlci5yZXNpemUoX2UtPnNpemUoKSk7IHN0ZDo6Y29weShfZS0+YmVnaW4oKSwgX2UtPmVuZCgpLCBfby0+dGVzdHJlcXVpcmVkbmVzdGVkZmxhdGJ1ZmZlci5iZWdpbigpKTsgfSB9Ci0gIHsgYXV0byBfZSA9IHNjYWxhcl9rZXlfc29ydGVkX3RhYmxlcygpOyBpZiAoX2UpIHsgX28tPnNjYWxhcl9rZXlfc29ydGVkX3RhYmxlcy5yZXNpemUoX2UtPnNpemUoKSk7IGZvciAoZmxhdGJ1ZmZlcnM6OnVvZmZzZXRfdCBfaSA9IDA7IF9pIDwgX2UtPnNpemUoKTsgX2krKykgeyBpZihfby0+c2NhbGFyX2tleV9zb3J0ZWRfdGFibGVzW19pXSkgeyBfZS0+R2V0KF9pKS0+VW5QYWNrVG8oX28tPnNjYWxhcl9rZXlfc29ydGVkX3RhYmxlc1tfaV0uZ2V0KCksIF9yZXNvbHZlcik7IH0gZWxzZSB7IF9vLT5zY2FsYXJfa2V5X3NvcnRlZF90YWJsZXNbX2ldID0gc3RkOjp1bmlxdWVfcHRyPE15R2FtZTo6RXhhbXBsZTo6U3RhdFQ+KF9lLT5HZXQoX2kpLT5VblBhY2soX3Jlc29sdmVyKSk7IH07IH0gfSB9CisgIHsgYXV0byBfZSA9IHNjYWxhcl9rZXlfc29ydGVkX3RhYmxlcygpOyBpZiAoX2UpIHsgX28tPnNjYWxhcl9rZXlfc29ydGVkX3RhYmxlcy5yZXNpemUoX2UtPnNpemUoKSk7IGZvciAoZmxhdGJ1ZmZlcnM6OnVvZmZzZXRfdCBfaSA9IDA7IF9pIDwgX2UtPnNpemUoKTsgX2krKykgeyBpZihfby0+c2NhbGFyX2tleV9zb3J0ZWRfdGFibGVzW19pXSkgeyBfZS0+R2V0KF9pKS0+VW5QYWNrVG8oX28tPnNjYWxhcl9rZXlfc29ydGVkX3RhYmxlc1tfaV0uZ2V0KCksIF9yZXNvbHZlcik7IH0gZWxzZSB7IF9vLT5zY2FsYXJfa2V5X3NvcnRlZF90YWJsZXNbX2ldID0gc3RkOjp1bmlxdWVfcHRyPE15R2FtZTo6RXhhbXBsZTo6U3RhdFQ+KF9lLT5HZXQoX2kpLT5VblBhY2soX3Jlc29sdmVyKSk7IH07IH0gfSBlbHNlIHsgX28tPnNjYWxhcl9rZXlfc29ydGVkX3RhYmxlcy5yZXNpemUoMCk7IH0gfQogICB7IGF1dG8gX2UgPSBuYXRpdmVfaW5saW5lKCk7IGlmIChfZSkgX28tPm5hdGl2ZV9pbmxpbmUgPSAqX2U7IH0KICAgeyBhdXRvIF9lID0gbG9uZ19lbnVtX25vbl9lbnVtX2RlZmF1bHQoKTsgX28tPmxvbmdfZW51bV9ub25fZW51bV9kZWZhdWx0ID0gX2U7IH0KICAgeyBhdXRvIF9lID0gbG9uZ19lbnVtX25vcm1hbF9kZWZhdWx0KCk7IF9vLT5sb25nX2VudW1fbm9ybWFsX2RlZmF1bHQgPSBfZTsgfQpAQCAtMjk3NCw3ICszMDIwLDcgQEAKICAgKHZvaWQpX3JlaGFzaGVyOwogICAodm9pZClfbzsKICAgc3RydWN0IF9WZWN0b3JBcmdzIHsgZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICpfX2ZiYjsgY29uc3QgTW9uc3RlclQqIF9fbzsgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9fcmVoYXNoZXI7IH0gX3ZhID0geyAmX2ZiYiwgX28sIF9yZWhhc2hlcn07ICh2b2lkKV92YTsKLSAgYXV0byBfcG9zID0gX28tPnBvcyA/IF9vLT5wb3MuZ2V0KCkgOiAwOworICBhdXRvIF9wb3MgPSBfby0+cG9zID8gX28tPnBvcy5nZXQoKSA6IG51bGxwdHI7CiAgIGF1dG8gX21hbmEgPSBfby0+bWFuYTsKICAgYXV0byBfaHAgPSBfby0+aHA7CiAgIGF1dG8gX25hbWUgPSBfZmJiLkNyZWF0ZVN0cmluZyhfby0+bmFtZSk7CkBAIC0zMTA0LDcgKzMxNTAsNyBAQAogICB7IGF1dG8gX2UgPSBmMzIoKTsgX28tPmYzMiA9IF9lOyB9CiAgIHsgYXV0byBfZSA9IGY2NCgpOyBfby0+ZjY0ID0gX2U7IH0KICAgeyBhdXRvIF9lID0gdjgoKTsgaWYgKF9lKSB7IF9vLT52OC5yZXNpemUoX2UtPnNpemUoKSk7IHN0ZDo6Y29weShfZS0+YmVnaW4oKSwgX2UtPmVuZCgpLCBfby0+djguYmVnaW4oKSk7IH0gfQotICB7IGF1dG8gX2UgPSB2ZjY0KCk7IGlmIChfZSkgeyBfby0+dmY2NC5yZXNpemUoX2UtPnNpemUoKSk7IGZvciAoZmxhdGJ1ZmZlcnM6OnVvZmZzZXRfdCBfaSA9IDA7IF9pIDwgX2UtPnNpemUoKTsgX2krKykgeyBfby0+dmY2NFtfaV0gPSBfZS0+R2V0KF9pKTsgfSB9IH0KKyAgeyBhdXRvIF9lID0gdmY2NCgpOyBpZiAoX2UpIHsgX28tPnZmNjQucmVzaXplKF9lLT5zaXplKCkpOyBmb3IgKGZsYXRidWZmZXJzOjp1b2Zmc2V0X3QgX2kgPSAwOyBfaSA8IF9lLT5zaXplKCk7IF9pKyspIHsgX28tPnZmNjRbX2ldID0gX2UtPkdldChfaSk7IH0gfSBlbHNlIHsgX28tPnZmNjQucmVzaXplKDApOyB9IH0KIH0KIAogaW5saW5lIGZsYXRidWZmZXJzOjpPZmZzZXQ8VHlwZUFsaWFzZXM+IFR5cGVBbGlhc2VzOjpQYWNrKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgVHlwZUFsaWFzZXNUKiBfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlcikgewpAQCAtMzczNyw2ICszNzgzLDIzIEBACiAgIHJldHVybiAmdHQ7CiB9CiAKK2lubGluZSBjb25zdCBmbGF0YnVmZmVyczo6VHlwZVRhYmxlICpTdHJ1Y3RPZlN0cnVjdHNPZlN0cnVjdHNUeXBlVGFibGUoKSB7CisgIHN0YXRpYyBjb25zdCBmbGF0YnVmZmVyczo6VHlwZUNvZGUgdHlwZV9jb2Rlc1tdID0geworICAgIHsgZmxhdGJ1ZmZlcnM6OkVUX1NFUVVFTkNFLCAwLCAwIH0KKyAgfTsKKyAgc3RhdGljIGNvbnN0IGZsYXRidWZmZXJzOjpUeXBlRnVuY3Rpb24gdHlwZV9yZWZzW10gPSB7CisgICAgTXlHYW1lOjpFeGFtcGxlOjpTdHJ1Y3RPZlN0cnVjdHNUeXBlVGFibGUKKyAgfTsKKyAgc3RhdGljIGNvbnN0IGludDY0X3QgdmFsdWVzW10gPSB7IDAsIDIwIH07CisgIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgbmFtZXNbXSA9IHsKKyAgICAiYSIKKyAgfTsKKyAgc3RhdGljIGNvbnN0IGZsYXRidWZmZXJzOjpUeXBlVGFibGUgdHQgPSB7CisgICAgZmxhdGJ1ZmZlcnM6OlNUX1NUUlVDVCwgMSwgdHlwZV9jb2RlcywgdHlwZV9yZWZzLCBudWxscHRyLCB2YWx1ZXMsIG5hbWVzCisgIH07CisgIHJldHVybiAmdHQ7Cit9CisKIGlubGluZSBjb25zdCBmbGF0YnVmZmVyczo6VHlwZVRhYmxlICpTdGF0VHlwZVRhYmxlKCkgewogICBzdGF0aWMgY29uc3QgZmxhdGJ1ZmZlcnM6OlR5cGVDb2RlIHR5cGVfY29kZXNbXSA9IHsKICAgICB7IGZsYXRidWZmZXJzOjpFVF9TVFJJTkcsIDAsIC0xIH0sCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9jcHAxNy9nZW5lcmF0ZWRfY3BwMTcvb3B0aW9uYWxfc2NhbGFyc19nZW5lcmF0ZWQuaCBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL2NwcDE3L2dlbmVyYXRlZF9jcHAxNy9vcHRpb25hbF9zY2FsYXJzX2dlbmVyYXRlZC5oCmluZGV4IDI0YjVjY2QuLmI0YjA2MjUgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL2NwcDE3L2dlbmVyYXRlZF9jcHAxNy9vcHRpb25hbF9zY2FsYXJzX2dlbmVyYXRlZC5oCisrKyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL2NwcDE3L2dlbmVyYXRlZF9jcHAxNy9vcHRpb25hbF9zY2FsYXJzX2dlbmVyYXRlZC5oCkBAIC02LDYgKzYsMTMgQEAKIAogI2luY2x1ZGUgImZsYXRidWZmZXJzL2ZsYXRidWZmZXJzLmgiCiAKKy8vIEVuc3VyZSB0aGUgaW5jbHVkZWQgZmxhdGJ1ZmZlcnMuaCBpcyB0aGUgc2FtZSB2ZXJzaW9uIGFzIHdoZW4gdGhpcyBmaWxlIHdhcworLy8gZ2VuZXJhdGVkLCBvdGhlcndpc2UgaXQgbWF5IG5vdCBiZSBjb21wYXRpYmxlLgorc3RhdGljX2Fzc2VydChGTEFUQlVGRkVSU19WRVJTSU9OX01BSk9SID09IDIgJiYKKyAgICAgICAgICAgICAgRkxBVEJVRkZFUlNfVkVSU0lPTl9NSU5PUiA9PSAwICYmCisgICAgICAgICAgICAgIEZMQVRCVUZGRVJTX1ZFUlNJT05fUkVWSVNJT04gPT0gOCwKKyAgICAgICAgICAgICAiTm9uLWNvbXBhdGlibGUgZmxhdGJ1ZmZlcnMgdmVyc2lvbiBpbmNsdWRlZCIpOworCiBuYW1lc3BhY2Ugb3B0aW9uYWxfc2NhbGFycyB7CiAKIHN0cnVjdCBTY2FsYXJTdHVmZjsKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL2NwcDE3L2dlbmVyYXRlZF9jcHAxNy91bmlvbl92ZWN0b3JfZ2VuZXJhdGVkLmggYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9jcHAxNy9nZW5lcmF0ZWRfY3BwMTcvdW5pb25fdmVjdG9yX2dlbmVyYXRlZC5oCmluZGV4IGFhMGRhZjguLjVkNDU2NDQgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL2NwcDE3L2dlbmVyYXRlZF9jcHAxNy91bmlvbl92ZWN0b3JfZ2VuZXJhdGVkLmgKKysrIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvY3BwMTcvZ2VuZXJhdGVkX2NwcDE3L3VuaW9uX3ZlY3Rvcl9nZW5lcmF0ZWQuaApAQCAtNiw2ICs2LDEzIEBACiAKICNpbmNsdWRlICJmbGF0YnVmZmVycy9mbGF0YnVmZmVycy5oIgogCisvLyBFbnN1cmUgdGhlIGluY2x1ZGVkIGZsYXRidWZmZXJzLmggaXMgdGhlIHNhbWUgdmVyc2lvbiBhcyB3aGVuIHRoaXMgZmlsZSB3YXMKKy8vIGdlbmVyYXRlZCwgb3RoZXJ3aXNlIGl0IG1heSBub3QgYmUgY29tcGF0aWJsZS4KK3N0YXRpY19hc3NlcnQoRkxBVEJVRkZFUlNfVkVSU0lPTl9NQUpPUiA9PSAyICYmCisgICAgICAgICAgICAgIEZMQVRCVUZGRVJTX1ZFUlNJT05fTUlOT1IgPT0gMCAmJgorICAgICAgICAgICAgICBGTEFUQlVGRkVSU19WRVJTSU9OX1JFVklTSU9OID09IDgsCisgICAgICAgICAgICAgIk5vbi1jb21wYXRpYmxlIGZsYXRidWZmZXJzIHZlcnNpb24gaW5jbHVkZWQiKTsKKwogc3RydWN0IEF0dGFja2VyOwogc3RydWN0IEF0dGFja2VyQnVpbGRlcjsKIHN0cnVjdCBBdHRhY2tlclQ7CkBAIC03NjAsOCArNzY3LDggQEAKICAgKHZvaWQpX3Jlc29sdmVyOwogICB7IGF1dG8gX2UgPSBtYWluX2NoYXJhY3Rlcl90eXBlKCk7IF9vLT5tYWluX2NoYXJhY3Rlci50eXBlID0gX2U7IH0KICAgeyBhdXRvIF9lID0gbWFpbl9jaGFyYWN0ZXIoKTsgaWYgKF9lKSBfby0+bWFpbl9jaGFyYWN0ZXIudmFsdWUgPSBDaGFyYWN0ZXJVbmlvbjo6VW5QYWNrKF9lLCBtYWluX2NoYXJhY3Rlcl90eXBlKCksIF9yZXNvbHZlcik7IH0KLSAgeyBhdXRvIF9lID0gY2hhcmFjdGVyc190eXBlKCk7IGlmIChfZSkgeyBfby0+Y2hhcmFjdGVycy5yZXNpemUoX2UtPnNpemUoKSk7IGZvciAoZmxhdGJ1ZmZlcnM6OnVvZmZzZXRfdCBfaSA9IDA7IF9pIDwgX2UtPnNpemUoKTsgX2krKykgeyBfby0+Y2hhcmFjdGVyc1tfaV0udHlwZSA9IHN0YXRpY19jYXN0PENoYXJhY3Rlcj4oX2UtPkdldChfaSkpOyB9IH0gfQotICB7IGF1dG8gX2UgPSBjaGFyYWN0ZXJzKCk7IGlmIChfZSkgeyBfby0+Y2hhcmFjdGVycy5yZXNpemUoX2UtPnNpemUoKSk7IGZvciAoZmxhdGJ1ZmZlcnM6OnVvZmZzZXRfdCBfaSA9IDA7IF9pIDwgX2UtPnNpemUoKTsgX2krKykgeyBfby0+Y2hhcmFjdGVyc1tfaV0udmFsdWUgPSBDaGFyYWN0ZXJVbmlvbjo6VW5QYWNrKF9lLT5HZXQoX2kpLCBjaGFyYWN0ZXJzX3R5cGUoKS0+R2V0RW51bTxDaGFyYWN0ZXI+KF9pKSwgX3Jlc29sdmVyKTsgfSB9IH0KKyAgeyBhdXRvIF9lID0gY2hhcmFjdGVyc190eXBlKCk7IGlmIChfZSkgeyBfby0+Y2hhcmFjdGVycy5yZXNpemUoX2UtPnNpemUoKSk7IGZvciAoZmxhdGJ1ZmZlcnM6OnVvZmZzZXRfdCBfaSA9IDA7IF9pIDwgX2UtPnNpemUoKTsgX2krKykgeyBfby0+Y2hhcmFjdGVyc1tfaV0udHlwZSA9IHN0YXRpY19jYXN0PENoYXJhY3Rlcj4oX2UtPkdldChfaSkpOyB9IH0gZWxzZSB7IF9vLT5jaGFyYWN0ZXJzLnJlc2l6ZSgwKTsgfSB9CisgIHsgYXV0byBfZSA9IGNoYXJhY3RlcnMoKTsgaWYgKF9lKSB7IF9vLT5jaGFyYWN0ZXJzLnJlc2l6ZShfZS0+c2l6ZSgpKTsgZm9yIChmbGF0YnVmZmVyczo6dW9mZnNldF90IF9pID0gMDsgX2kgPCBfZS0+c2l6ZSgpOyBfaSsrKSB7IF9vLT5jaGFyYWN0ZXJzW19pXS52YWx1ZSA9IENoYXJhY3RlclVuaW9uOjpVblBhY2soX2UtPkdldChfaSksIGNoYXJhY3RlcnNfdHlwZSgpLT5HZXRFbnVtPENoYXJhY3Rlcj4oX2kpLCBfcmVzb2x2ZXIpOyB9IH0gZWxzZSB7IF9vLT5jaGFyYWN0ZXJzLnJlc2l6ZSgwKTsgfSB9CiB9CiAKIGlubGluZSBmbGF0YnVmZmVyczo6T2Zmc2V0PE1vdmllPiBNb3ZpZTo6UGFjayhmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IE1vdmllVCogX28sIGNvbnN0IGZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIpIHsKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL2NwcDE3L3Rlc3RfY3BwMTcuY3BwIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvY3BwMTcvdGVzdF9jcHAxNy5jcHAKaW5kZXggYTE3MjA1YS4uY2ZiYTJiNiAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvY3BwMTcvdGVzdF9jcHAxNy5jcHAKKysrIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvY3BwMTcvdGVzdF9jcHAxNy5jcHAKQEAgLTIwLDYgKzIwLDcgQEAKIC8vIFRoaXMgaXMgYW4gZXhwZXJpbWVudGFsIGZlYXR1cmUgYW5kIGNvdWxkIGNoYW5nZSBhdCBhbnkgdGltZS4KIAogI2luY2x1ZGUgImZsYXRidWZmZXJzL2ZsYXRidWZmZXJzLmgiCisjaW5jbHVkZSAiZmxhdGJ1ZmZlcnMvZmxleF9mbGF0X3V0aWwuaCIKICNpbmNsdWRlICJmbGF0YnVmZmVycy9mbGV4YnVmZmVycy5oIgogI2luY2x1ZGUgImZsYXRidWZmZXJzL2lkbC5oIgogI2luY2x1ZGUgImZsYXRidWZmZXJzL21pbmlyZWZsZWN0LmgiCkBAIC00Niw2ICs0Nyw3IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiogQnVpbGQgc29tZSBGQiBvYmplY3RzLgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK25hbWVzcGFjZSB7CiBjb25zdCBNb25zdGVyICpCdWlsZE1vbnN0ZXIoZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZmYmIpIHsKICAgdXNpbmcgOjpjcHAxNzo6TXlHYW1lOjpFeGFtcGxlOjpDb2xvcjsKICAgdXNpbmcgOjpjcHAxNzo6TXlHYW1lOjpFeGFtcGxlOjpNb25zdGVyQnVpbGRlcjsKQEAgLTE0NCw2ICsxNDYsOCBAQAogICAgICAgICBhbnlfdW5pcXVlX3R5cGUgPSAwCiAgICAgICAgIGFueV9hbWJpZ3VvdXNfdHlwZSA9IDAKICAgICAgICAgc2lnbmVkX2VudW0gPSAtMQorICAgICAgICBsb25nX2VudW1fbm9uX2VudW1fZGVmYXVsdCA9IDAKKyAgICAgICAgbG9uZ19lbnVtX25vcm1hbF9kZWZhdWx0ID0gMgogICAgICAgfSkiOwogCiAgIC8vIENhbGwgYSBnZW5lcmljIGZ1bmN0aW9uIHRoYXQgaGFzIG5vIHNwZWNpZmljIGtub3dsZWRnZSBvZiB0aGUgZmxhdGJ1ZmZlciB3ZQpAQCAtMTY3LDEzICsxNzEsMTMgQEAKICoqIFRlc3QgVHJhaXRzOjpGaWVsZFR5cGUKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiB1c2luZyBwb3NfdHlwZSA9IE1vbnN0ZXI6OlRyYWl0czo6RmllbGRUeXBlPDA+Owotc3RhdGljX2Fzc2VydChzdGQ6OmlzX3NhbWVfdjxwb3NfdHlwZSwgY29uc3QgVmVjMyo+KTsKK3N0YXRpY19hc3NlcnQoc3RkOjppc19zYW1lX3Y8cG9zX3R5cGUsIGNvbnN0IFZlYzMgKj4pOwogCiB1c2luZyBtYW5hX3R5cGUgPSBNb25zdGVyOjpUcmFpdHM6OkZpZWxkVHlwZTwxPjsKIHN0YXRpY19hc3NlcnQoc3RkOjppc19zYW1lX3Y8bWFuYV90eXBlLCBpbnQxNl90Pik7CiAKIHVzaW5nIG5hbWVfdHlwZSA9IE1vbnN0ZXI6OlRyYWl0czo6RmllbGRUeXBlPDM+Owotc3RhdGljX2Fzc2VydChzdGQ6OmlzX3NhbWVfdjxuYW1lX3R5cGUsIGNvbnN0IGZsYXRidWZmZXJzOjpTdHJpbmcqPik7CitzdGF0aWNfYXNzZXJ0KHN0ZDo6aXNfc2FtZV92PG5hbWVfdHlwZSwgY29uc3QgZmxhdGJ1ZmZlcnM6OlN0cmluZyAqPik7CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqKiBHZW5lcmljIENyZWF0ZSBGdW5jdGlvbiBUZXN0LgpAQCAtMjQ5LDYgKzI1Myw3IEBACiAgIFN0cmluZ2lmeUFueUZsYXRidWZmZXJzVHlwZVRlc3QoKTsKICAgcmV0dXJuIDA7CiB9Cit9ICAvLyBuYW1lc3BhY2UKIAogaW50IG1haW4oaW50IC8qYXJnYyovLCBjb25zdCBjaGFyICogLyphcmd2Ki9bXSkgewogICBJbml0VGVzdEVuZ2luZSgpOwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvZGljdGlvbmFyeV9sb29rdXAuZmJzIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvZGljdGlvbmFyeV9sb29rdXAuZmJzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ1YjlkY2UKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9kaWN0aW9uYXJ5X2xvb2t1cC5mYnMKQEAgLTAsMCArMSwxMSBAQAorbmFtZXNwYWNlIERpY3Rpb25hcnlMb29rdXA7CisKK3RhYmxlIExvbmdGbG9hdEVudHJ5IHsKKyAga2V5OiBsb25nIChrZXkpOworICB2YWx1ZTogZmxvYXQ7Cit9CisKK3RhYmxlIExvbmdGbG9hdE1hcCB7CisgIGVudHJpZXM6IFtMb25nRmxvYXRFbnRyeV07Cit9Cityb290X3R5cGUgTG9uZ0Zsb2F0TWFwOwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvZG9ja2VyL2xhbmd1YWdlcy9Eb2NrZXJmaWxlLnRlc3Rpbmcuc3dpZnRfNV8yIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvZG9ja2VyL2xhbmd1YWdlcy9Eb2NrZXJmaWxlLnRlc3Rpbmcuc3dpZnRfNV8yCmluZGV4IGIzMDk0NzcuLjIyOTk1ZDIgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL2RvY2tlci9sYW5ndWFnZXMvRG9ja2VyZmlsZS50ZXN0aW5nLnN3aWZ0XzVfMgorKysgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9kb2NrZXIvbGFuZ3VhZ2VzL0RvY2tlcmZpbGUudGVzdGluZy5zd2lmdF81XzIKQEAgLTQsNSArNCw1IEBACiBSVU4gY3AgZmxhdGNfZGViaWFuX3N0cmV0Y2ggZmxhdGMKIFdPUktESVIgL2NvZGUvdGVzdHMKIFJVTiBzd2lmdCAtLXZlcnNpb24KLVdPUktESVIgL2NvZGUvdGVzdHMvRmxhdEJ1ZmZlcnMuVGVzdC5Td2lmdAorV09SS0RJUiAvY29kZS90ZXN0cy9zd2lmdC90ZXN0cy8KIFJVTiBzaCBTd2lmdFRlc3Quc2gKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL2V2b2x1dGlvbl90ZXN0LmNwcCBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL2V2b2x1dGlvbl90ZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYTBmZDc0Ci0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvZXZvbHV0aW9uX3Rlc3QuY3BwCkBAIC0wLDAgKzEsMTM5IEBACisjaW5jbHVkZSAiZXZvbHV0aW9uX3Rlc3QuaCIKKworI2luY2x1ZGUgImV2b2x1dGlvbl90ZXN0L2V2b2x1dGlvbl92MV9nZW5lcmF0ZWQuaCIKKyNpbmNsdWRlICJldm9sdXRpb25fdGVzdC9ldm9sdXRpb25fdjJfZ2VuZXJhdGVkLmgiCisjaW5jbHVkZSAiZmxhdGJ1ZmZlcnMvaWRsLmgiCisjaW5jbHVkZSAidGVzdF9hc3NlcnQuaCIKKworbmFtZXNwYWNlIGZsYXRidWZmZXJzIHsKK25hbWVzcGFjZSB0ZXN0cyB7CisKK3ZvaWQgRXZvbHV0aW9uVGVzdChjb25zdCBzdGQ6OnN0cmluZyAmdGVzdHNfZGF0YV9wYXRoKSB7CisgIC8vIFZTMTAgZG9lcyBub3Qgc3VwcG9ydCB0eXBlZCBlbnVtcywgZXhjbHVkZSBmcm9tIHRlc3RzCisjaWYgIWRlZmluZWQoX01TQ19WRVIpIHx8IF9NU0NfVkVSID49IDE3MDAKKyAgY29uc3QgaW50IE5VTV9WRVJTSU9OUyA9IDI7CisgIHN0ZDo6c3RyaW5nIHNjaGVtYXNbTlVNX1ZFUlNJT05TXTsKKyAgc3RkOjpzdHJpbmcganNvbmZpbGVzW05VTV9WRVJTSU9OU107CisgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGJpbmFyaWVzW05VTV9WRVJTSU9OU107CisKKyAgZmxhdGJ1ZmZlcnM6OklETE9wdGlvbnMgaWRsX29wdHM7CisgIGlkbF9vcHRzLmxhbmdfdG9fZ2VuZXJhdGUgfD0gZmxhdGJ1ZmZlcnM6OklETE9wdGlvbnM6OmtCaW5hcnk7CisgIGZsYXRidWZmZXJzOjpQYXJzZXIgcGFyc2VyKGlkbF9vcHRzKTsKKworICAvLyBMb2FkIGFsbCB0aGUgc2NoZW1hIHZlcnNpb25zIGFuZCB0aGVpciBhc3NvY2lhdGVkIGRhdGEuCisgIGZvciAoaW50IGkgPSAwOyBpIDwgTlVNX1ZFUlNJT05TOyArK2kpIHsKKyAgICBzdGQ6OnN0cmluZyBzY2hlbWEgPSB0ZXN0c19kYXRhX3BhdGggKyAiZXZvbHV0aW9uX3Rlc3QvZXZvbHV0aW9uX3YiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICBmbGF0YnVmZmVyczo6TnVtVG9TdHJpbmcoaSArIDEpICsgIi5mYnMiOworICAgIFRFU1RfQVNTRVJUKGZsYXRidWZmZXJzOjpMb2FkRmlsZShzY2hlbWEuY19zdHIoKSwgZmFsc2UsICZzY2hlbWFzW2ldKSk7CisgICAgc3RkOjpzdHJpbmcganNvbiA9IHRlc3RzX2RhdGFfcGF0aCArICJldm9sdXRpb25fdGVzdC9ldm9sdXRpb25fdiIgKworICAgICAgICAgICAgICAgICAgICAgICBmbGF0YnVmZmVyczo6TnVtVG9TdHJpbmcoaSArIDEpICsgIi5qc29uIjsKKyAgICBURVNUX0FTU0VSVChmbGF0YnVmZmVyczo6TG9hZEZpbGUoanNvbi5jX3N0cigpLCBmYWxzZSwgJmpzb25maWxlc1tpXSkpOworCisgICAgVEVTVF9BU1NFUlQocGFyc2VyLlBhcnNlKHNjaGVtYXNbaV0uY19zdHIoKSkpOworICAgIFRFU1RfQVNTRVJUKHBhcnNlci5QYXJzZShqc29uZmlsZXNbaV0uY19zdHIoKSkpOworCisgICAgYXV0byBidWZMZW4gPSBwYXJzZXIuYnVpbGRlcl8uR2V0U2l6ZSgpOworICAgIGF1dG8gYnVmID0gcGFyc2VyLmJ1aWxkZXJfLkdldEJ1ZmZlclBvaW50ZXIoKTsKKyAgICBiaW5hcmllc1tpXS5yZXNlcnZlKGJ1Zkxlbik7CisgICAgc3RkOjpjb3B5KGJ1ZiwgYnVmICsgYnVmTGVuLCBzdGQ6OmJhY2tfaW5zZXJ0ZXIoYmluYXJpZXNbaV0pKTsKKyAgfQorCisgIC8vIEFzc2VydCB0aGF0IGFsbCB0aGUgdmVyaWZpZXJzIGZvciB0aGUgZGlmZmVyZW50IHNjaGVtYSB2ZXJzaW9ucyBwcm9wZXJseQorICAvLyB2ZXJpZnkgYW55IHZlcnNpb24gZGF0YS4KKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBOVU1fVkVSU0lPTlM7ICsraSkgeworICAgIGZsYXRidWZmZXJzOjpWZXJpZmllciB2ZXJpZmllcigmYmluYXJpZXNbaV0uZnJvbnQoKSwgYmluYXJpZXNbaV0uc2l6ZSgpKTsKKyAgICBURVNUX0FTU0VSVChFdm9sdXRpb246OlYxOjpWZXJpZnlSb290QnVmZmVyKHZlcmlmaWVyKSk7CisgICAgVEVTVF9BU1NFUlQoRXZvbHV0aW9uOjpWMjo6VmVyaWZ5Um9vdEJ1ZmZlcih2ZXJpZmllcikpOworICB9CisKKyAgLy8gVGVzdCBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSBieSByZWFkaW5nIG9sZCBkYXRhIHdpdGggYW4gZXZvbHZlZCBzY2hlbWEuCisgIGF1dG8gcm9vdF92MV92aWV3ZWRfZnJvbV92MiA9IEV2b2x1dGlvbjo6VjI6OkdldFJvb3QoJmJpbmFyaWVzWzBdLmZyb250KCkpOworICAvLyBmaWVsZCAnaycgaXMgbmV3IGluIHZlcnNpb24gMiwgc28gaXQgc2hvdWxkIGJlIG51bGwuCisgIFRFU1RfQVNTRVJUKG51bGxwdHIgPT0gcm9vdF92MV92aWV3ZWRfZnJvbV92Mi0+aygpKTsKKyAgLy8gZmllbGQgJ2wnIGlzIG5ldyBpbiB2ZXJzaW9uIDIgd2l0aCBhIGRlZmF1bHQgb2YgNTYuCisgIFRFU1RfRVEocm9vdF92MV92aWV3ZWRfZnJvbV92Mi0+bCgpLCA1Nik7CisgIC8vIGZpZWxkICdjJyBvZiAnVGFibGVBJyBpcyBuZXcgaW4gdmVyc2lvbiAyLCBzbyBpdCBzaG91bGQgYmUgbnVsbC4KKyAgVEVTVF9BU1NFUlQobnVsbHB0ciA9PSByb290X3YxX3ZpZXdlZF9mcm9tX3YyLT5lKCktPmMoKSk7CisgIC8vICdUYWJsZUMnIHdhcyBhZGRlZCB0byBmaWVsZCAnYycgdW5pb24gaW4gdmVyc2lvbiAyLCBzbyBpdCBzaG91bGQgYmUgbnVsbC4KKyAgVEVTVF9BU1NFUlQobnVsbHB0ciA9PSByb290X3YxX3ZpZXdlZF9mcm9tX3YyLT5jX2FzX1RhYmxlQygpKTsKKyAgLy8gVGhlIGZpZWxkICdjJyB1bmlvbiBzaG91bGQgYmUgb2YgdHlwZSAnVGFibGVCJyByZWdhcmRsZXNzIG9mIHNjaGVtYSB2ZXJzaW9uCisgIFRFU1RfQVNTRVJUKHJvb3RfdjFfdmlld2VkX2Zyb21fdjItPmNfdHlwZSgpID09IEV2b2x1dGlvbjo6VjI6OlVuaW9uOjpUYWJsZUIpOworICAvLyBUaGUgZmllbGQgJ2YnIHdhcyByZW5hbWVkIHRvICdmZicgaW4gdmVyc2lvbiAyLCBpdCBzaG91bGQgc3RpbGwgYmUKKyAgLy8gcmVhZGFibGUuCisgIFRFU1RfRVEocm9vdF92MV92aWV3ZWRfZnJvbV92Mi0+ZmYoKS0+YSgpLCAxNik7CisKKyAgLy8gVGVzdCBmb3J3YXJkcyBjb21wYXRpYmlsaXR5IGJ5IHJlYWRpbmcgbmV3IGRhdGEgd2l0aCBhbiBvbGQgc2NoZW1hLgorICBhdXRvIHJvb3RfdjJfdmlld2VkX2Zyb21fdjEgPSBFdm9sdXRpb246OlYxOjpHZXRSb290KCZiaW5hcmllc1sxXS5mcm9udCgpKTsKKyAgLy8gVGhlIGZpZWxkICdjJyB1bmlvbiBpbiB2ZXJzaW9uIDIgaXMgYSBuZXcgdGFibGUgKGluZGV4ID0gMykgYW5kIHNob3VsZAorICAvLyBzdGlsbCBiZSBhY2Nlc3NpYmxlLCBidXQgbm90IGludGVycHJldGFibGUuCisgIFRFU1RfRVEoc3RhdGljX2Nhc3Q8dWludDhfdD4ocm9vdF92Ml92aWV3ZWRfZnJvbV92MS0+Y190eXBlKCkpLCAzKTsKKyAgVEVTVF9OT1ROVUxMKHJvb3RfdjJfdmlld2VkX2Zyb21fdjEtPmMoKSk7CisgIC8vIFRoZSBmaWVsZCAnZCcgZW51bSBpbiB2ZXJpc29uIDIgaGFzIG5ldyBtZW1iZXJzIGFuZCBzaG91bGQgc3RpbGwgYmUKKyAgLy8gYWNjZXNzaWJsZSwgYnV0IG5vdCBpbnRlcnByZXRhYmxlLgorICBURVNUX0VRKHN0YXRpY19jYXN0PGludDhfdD4ocm9vdF92Ml92aWV3ZWRfZnJvbV92MS0+ZCgpKSwgMyk7CisgIC8vIFRoZSBmaWVsZCAnYScgaW4gdmVyc2lvbiAyIGlzIGRlcHJlY2F0ZWQgYW5kIHNob3VsZCByZXR1cm4gdGhlIGRlZmF1bHQKKyAgLy8gdmFsdWUgKDApIGluc3RlYWQgb2YgdGhlIHZhbHVlIHN0b3JlZCBpbiB0aGUgaW4gdGhlIGJ1ZmZlciAoNDIpLgorICBURVNUX0VRKHJvb3RfdjJfdmlld2VkX2Zyb21fdjEtPmEoKSwgMCk7CisgIC8vIFRoZSBmaWVsZCAnZmYnIHdhcyBvcmlnaW5hbGx5IG5hbWVkICdmJyBpbiB2ZXJzaW9uIDEsIGl0IHNob3VsZCBzdGlsbCBiZQorICAvLyByZWFkYWJsZS4KKyAgVEVTVF9FUShyb290X3YyX3ZpZXdlZF9mcm9tX3YxLT5mKCktPmEoKSwgMzUpOworI2VuZGlmCit9CisKK3ZvaWQgQ29uZm9ybVRlc3QoKSB7CisgIGZsYXRidWZmZXJzOjpQYXJzZXIgcGFyc2VyOworICBURVNUX0VRKHBhcnNlci5QYXJzZSgidGFibGUgVCB7IEE6aW50OyB9IGVudW0gRTpieXRlIHsgQSB9IiksIHRydWUpOworCisgIGF1dG8gdGVzdF9jb25mb3JtID0gW10oZmxhdGJ1ZmZlcnM6OlBhcnNlciAmcGFyc2VyMSwgY29uc3QgY2hhciAqdGVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpleHBlY3RlZF9lcnIpIHsKKyAgICBmbGF0YnVmZmVyczo6UGFyc2VyIHBhcnNlcjI7CisgICAgVEVTVF9FUShwYXJzZXIyLlBhcnNlKHRlc3QpLCB0cnVlKTsKKyAgICBhdXRvIGVyciA9IHBhcnNlcjIuQ29uZm9ybVRvKHBhcnNlcjEpOworICAgIFRFU1RfTk9UTlVMTChzdHJzdHIoZXJyLmNfc3RyKCksIGV4cGVjdGVkX2VycikpOworICB9OworCisgIHRlc3RfY29uZm9ybShwYXJzZXIsICJ0YWJsZSBUIHsgQTpieXRlOyB9IiwgInR5cGVzIGRpZmZlciBmb3IgZmllbGQiKTsKKyAgdGVzdF9jb25mb3JtKHBhcnNlciwgInRhYmxlIFQgeyBCOmludDsgQTppbnQ7IH0iLCAib2Zmc2V0cyBkaWZmZXIgZm9yIGZpZWxkIik7CisgIHRlc3RfY29uZm9ybShwYXJzZXIsICJ0YWJsZSBUIHsgQTppbnQgPSAxOyB9IiwgImRlZmF1bHRzIGRpZmZlciBmb3IgZmllbGQiKTsKKyAgdGVzdF9jb25mb3JtKHBhcnNlciwgInRhYmxlIFQgeyBCOmZsb2F0OyB9IiwKKyAgICAgICAgICAgICAgICJmaWVsZCByZW5hbWVkIHRvIGRpZmZlcmVudCB0eXBlIik7CisgIHRlc3RfY29uZm9ybShwYXJzZXIsICJlbnVtIEU6Ynl0ZSB7IEIsIEEgfSIsICJ2YWx1ZXMgZGlmZmVyIGZvciBlbnVtIik7Cit9CisKK3ZvaWQgVW5pb25EZXByZWNhdGlvblRlc3QoY29uc3Qgc3RkOjpzdHJpbmcmIHRlc3RzX2RhdGFfcGF0aCkgeworICBjb25zdCBpbnQgTlVNX1ZFUlNJT05TID0gMjsKKyAgc3RkOjpzdHJpbmcgc2NoZW1hc1tOVU1fVkVSU0lPTlNdOworICBzdGQ6OnN0cmluZyBqc29uZmlsZXNbTlVNX1ZFUlNJT05TXTsKKyAgc3RkOjp2ZWN0b3I8dWludDhfdD4gYmluYXJpZXNbTlVNX1ZFUlNJT05TXTsKKworICBmbGF0YnVmZmVyczo6SURMT3B0aW9ucyBpZGxfb3B0czsKKyAgaWRsX29wdHMubGFuZ190b19nZW5lcmF0ZSB8PSBmbGF0YnVmZmVyczo6SURMT3B0aW9uczo6a0JpbmFyeTsKKyAgZmxhdGJ1ZmZlcnM6OlBhcnNlciBwYXJzZXIoaWRsX29wdHMpOworCisgIC8vIExvYWQgYWxsIHRoZSBzY2hlbWEgdmVyc2lvbnMgYW5kIHRoZWlyIGFzc29jaWF0ZWQgZGF0YS4KKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBOVU1fVkVSU0lPTlM7ICsraSkgeworICAgIHN0ZDo6c3RyaW5nIHNjaGVtYSA9IHRlc3RzX2RhdGFfcGF0aCArICJldm9sdXRpb25fdGVzdC9ldm9sdXRpb25fdiIgKworICAgICAgICAgICAgICAgICAgICAgICAgIGZsYXRidWZmZXJzOjpOdW1Ub1N0cmluZyhpICsgMSkgKyAiLmZicyI7CisgICAgVEVTVF9BU1NFUlQoZmxhdGJ1ZmZlcnM6OkxvYWRGaWxlKHNjaGVtYS5jX3N0cigpLCBmYWxzZSwgJnNjaGVtYXNbaV0pKTsKKyAgICBzdGQ6OnN0cmluZyBqc29uID0gdGVzdHNfZGF0YV9wYXRoICsgImV2b2x1dGlvbl90ZXN0L2V2b2x1dGlvbl92IiArCisgICAgICAgICAgICAgICAgICAgICAgIGZsYXRidWZmZXJzOjpOdW1Ub1N0cmluZyhpICsgMSkgKyAiLmpzb24iOworICAgIFRFU1RfQVNTRVJUKGZsYXRidWZmZXJzOjpMb2FkRmlsZShqc29uLmNfc3RyKCksIGZhbHNlLCAmanNvbmZpbGVzW2ldKSk7CisKKyAgICBURVNUX0FTU0VSVChwYXJzZXIuUGFyc2Uoc2NoZW1hc1tpXS5jX3N0cigpKSk7CisgICAgVEVTVF9BU1NFUlQocGFyc2VyLlBhcnNlKGpzb25maWxlc1tpXS5jX3N0cigpKSk7CisKKyAgICBhdXRvIGJ1ZkxlbiA9IHBhcnNlci5idWlsZGVyXy5HZXRTaXplKCk7CisgICAgYXV0byBidWYgPSBwYXJzZXIuYnVpbGRlcl8uR2V0QnVmZmVyUG9pbnRlcigpOworICAgIGJpbmFyaWVzW2ldLnJlc2VydmUoYnVmTGVuKTsKKyAgICBzdGQ6OmNvcHkoYnVmLCBidWYgKyBidWZMZW4sIHN0ZDo6YmFja19pbnNlcnRlcihiaW5hcmllc1tpXSkpOworICB9CisKKyAgYXV0byB2MiA9IHBhcnNlci5Mb29rdXBTdHJ1Y3QoIkV2b2x1dGlvbi5WMi5Sb290Iik7CisgIFRFU1RfTk9UTlVMTCh2Mik7CisgIGF1dG8gal90eXBlX2ZpZWxkID0gdjItPmZpZWxkcy5Mb29rdXAoImpfdHlwZSIpOworICBURVNUX05PVE5VTEwoal90eXBlX2ZpZWxkKTsKKyAgVEVTVF9BU1NFUlQoal90eXBlX2ZpZWxkLT5kZXByZWNhdGVkKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIHRlc3RzCit9ICAvLyBuYW1lc3BhY2UgZmxhdGJ1ZmZlcnMKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9ldm9sdXRpb25fdGVzdC5oIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvZXZvbHV0aW9uX3Rlc3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOTMzYzNiCi0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvZXZvbHV0aW9uX3Rlc3QuaApAQCAtMCwwICsxLDE2IEBACisjaWZuZGVmIFRFU1RTX0VWT0xVVElPTl9URVNUX0gKKyNkZWZpbmUgVEVTVFNfRVZPTFVUSU9OX1RFU1RfSAorCisjaW5jbHVkZSA8c3RyaW5nPgorCituYW1lc3BhY2UgZmxhdGJ1ZmZlcnMgeworbmFtZXNwYWNlIHRlc3RzIHsKKwordm9pZCBFdm9sdXRpb25UZXN0KGNvbnN0IHN0ZDo6c3RyaW5nICZ0ZXN0c19kYXRhX3BhdGgpOwordm9pZCBDb25mb3JtVGVzdCgpOwordm9pZCBVbmlvbkRlcHJlY2F0aW9uVGVzdChjb25zdCBzdGQ6OnN0cmluZyAmdGVzdHNfZGF0YV9wYXRoKTsKKworfSAgLy8gbmFtZXNwYWNlIHRlc3RzCit9ICAvLyBuYW1lc3BhY2UgZmxhdGJ1ZmZlcnMKKworI2VuZGlmCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9ldm9sdXRpb25fdGVzdC9ldm9sdXRpb25fdjFfZ2VuZXJhdGVkLmggYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9ldm9sdXRpb25fdGVzdC9ldm9sdXRpb25fdjFfZ2VuZXJhdGVkLmgKaW5kZXggZDVkZGY4Zi4uMzEzNzBkOCAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvZXZvbHV0aW9uX3Rlc3QvZXZvbHV0aW9uX3YxX2dlbmVyYXRlZC5oCisrKyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL2V2b2x1dGlvbl90ZXN0L2V2b2x1dGlvbl92MV9nZW5lcmF0ZWQuaApAQCAtNiw2ICs2LDEzIEBACiAKICNpbmNsdWRlICJmbGF0YnVmZmVycy9mbGF0YnVmZmVycy5oIgogCisvLyBFbnN1cmUgdGhlIGluY2x1ZGVkIGZsYXRidWZmZXJzLmggaXMgdGhlIHNhbWUgdmVyc2lvbiBhcyB3aGVuIHRoaXMgZmlsZSB3YXMKKy8vIGdlbmVyYXRlZCwgb3RoZXJ3aXNlIGl0IG1heSBub3QgYmUgY29tcGF0aWJsZS4KK3N0YXRpY19hc3NlcnQoRkxBVEJVRkZFUlNfVkVSU0lPTl9NQUpPUiA9PSAyICYmCisgICAgICAgICAgICAgIEZMQVRCVUZGRVJTX1ZFUlNJT05fTUlOT1IgPT0gMCAmJgorICAgICAgICAgICAgICBGTEFUQlVGRkVSU19WRVJTSU9OX1JFVklTSU9OID09IDgsCisgICAgICAgICAgICAgIk5vbi1jb21wYXRpYmxlIGZsYXRidWZmZXJzIHZlcnNpb24gaW5jbHVkZWQiKTsKKwogbmFtZXNwYWNlIEV2b2x1dGlvbiB7CiBuYW1lc3BhY2UgVjEgewogCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9ldm9sdXRpb25fdGVzdC9ldm9sdXRpb25fdjJfZ2VuZXJhdGVkLmggYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9ldm9sdXRpb25fdGVzdC9ldm9sdXRpb25fdjJfZ2VuZXJhdGVkLmgKaW5kZXggMmEwZWZjYi4uMjBkMDE5YyAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvZXZvbHV0aW9uX3Rlc3QvZXZvbHV0aW9uX3YyX2dlbmVyYXRlZC5oCisrKyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL2V2b2x1dGlvbl90ZXN0L2V2b2x1dGlvbl92Ml9nZW5lcmF0ZWQuaApAQCAtNiw2ICs2LDEzIEBACiAKICNpbmNsdWRlICJmbGF0YnVmZmVycy9mbGF0YnVmZmVycy5oIgogCisvLyBFbnN1cmUgdGhlIGluY2x1ZGVkIGZsYXRidWZmZXJzLmggaXMgdGhlIHNhbWUgdmVyc2lvbiBhcyB3aGVuIHRoaXMgZmlsZSB3YXMKKy8vIGdlbmVyYXRlZCwgb3RoZXJ3aXNlIGl0IG1heSBub3QgYmUgY29tcGF0aWJsZS4KK3N0YXRpY19hc3NlcnQoRkxBVEJVRkZFUlNfVkVSU0lPTl9NQUpPUiA9PSAyICYmCisgICAgICAgICAgICAgIEZMQVRCVUZGRVJTX1ZFUlNJT05fTUlOT1IgPT0gMCAmJgorICAgICAgICAgICAgICBGTEFUQlVGRkVSU19WRVJTSU9OX1JFVklTSU9OID09IDgsCisgICAgICAgICAgICAgIk5vbi1jb21wYXRpYmxlIGZsYXRidWZmZXJzIHZlcnNpb24gaW5jbHVkZWQiKTsKKwogbmFtZXNwYWNlIEV2b2x1dGlvbiB7CiBuYW1lc3BhY2UgVjIgewogCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9mbGF0Yy9iYXIvYmFyLmZicyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL2ZsYXRjL2Jhci9iYXIuZmJzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmZDRiZTkKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9mbGF0Yy9iYXIvYmFyLmZicwpAQCAtMCwwICsxLDUgQEAKK2luY2x1ZGUgImJhei9iYXouZmJzIjsKKwordGFibGUgQmFyIHsKKyAgYmF6OkJhejsKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9mbGF0Yy9iYXIvYmFyX3dpdGhfZm9vLmZicyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL2ZsYXRjL2Jhci9iYXJfd2l0aF9mb28uZmJzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ1YzBmOWMKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9mbGF0Yy9iYXIvYmFyX3dpdGhfZm9vLmZicwpAQCAtMCwwICsxLDYgQEAKK2luY2x1ZGUgImZvby5mYnMiOworaW5jbHVkZSAiYmF6L2Jhei5mYnMiOworCit0YWJsZSBCYXJXaXRoRm9vIHsKKyAgZm9vOkZvbzsKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9mbGF0Yy9iYXIvYmFyX3dpdGhfbnMuZmJzIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvZmxhdGMvYmFyL2Jhcl93aXRoX25zLmZicwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNWE4MDBkCi0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvZmxhdGMvYmFyL2Jhcl93aXRoX25zLmZicwpAQCAtMCwwICsxLDE0IEBACitpbmNsdWRlICJiYXovYmF6X3dpdGhfbnMuZmJzIjsKK2luY2x1ZGUgImJhei9iYXouZmJzIjsKKworbmFtZXNwYWNlIGJhcjsKKwordGFibGUgQmFyIHsKKyAgYmF6OmJhei5CYXo7CisgIGJhejI6QmF6OworICBmb286Rm9vOworfQorCit0YWJsZSBGb28geworICBhOmludDsKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9mbGF0Yy9iYXIvYmF6L2Jhei5mYnMgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9mbGF0Yy9iYXIvYmF6L2Jhei5mYnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjU0ZTk4MAotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL2ZsYXRjL2Jhci9iYXovYmF6LmZicwpAQCAtMCwwICsxLDYgQEAKK2VudW0gQmF6IDogc2hvcnQgeworICBOb25lID0gMCwKKyAgUmVkLAorICBHcmVlbiwKKyAgQmx1ZSwKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9mbGF0Yy9iYXIvYmF6L2Jhel93aXRoX25zLmZicyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL2ZsYXRjL2Jhci9iYXovYmF6X3dpdGhfbnMuZmJzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQyNTg0MTMKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9mbGF0Yy9iYXIvYmF6L2Jhel93aXRoX25zLmZicwpAQCAtMCwwICsxLDggQEAKK25hbWVzcGFjZSBiYXo7CisKK2VudW0gQmF6IDogc2hvcnQgeworICBOb25lID0gMCwKKyAgUmVkLAorICBHcmVlbiwKKyAgQmx1ZSwKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9mbGF0Yy9mbGF0Y19jcHBfdGVzdHMucHkgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9mbGF0Yy9mbGF0Y19jcHBfdGVzdHMucHkKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNzJiMmU5ZAotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL2ZsYXRjL2ZsYXRjX2NwcF90ZXN0cy5weQpAQCAtMCwwICsxLDI1NCBAQAorIyBDb3B5cmlnaHQgMjAyMiBHb29nbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitmcm9tIGZsYXRjX3Rlc3QgaW1wb3J0ICoKKworCitjbGFzcyBDcHBUZXN0czoKKyAgICBkZWYgRmxhdHRlbihzZWxmKToKKyAgICAgICAgIyBHZW5lcmF0ZSBqdXN0IGZvbyB3aXRoIGEgImZsYXR0ZW4iIGltcG9ydCBvZiBiYXIuCisgICAgICAgIGZsYXRjKFsiLS1jcHAiLCAiZm9vLmZicyJdKQorCisgICAgICAgICMgRm9vIHNob3VsZCBiZSBnZW5lcmF0ZWQgaW4gcGxhY2UgYW5kIGluY2x1ZGUgYmFyIGZsYXR0ZW4KKyAgICAgICAgYXNzZXJ0X2ZpbGVfYW5kX2NvbnRlbnRzKCJmb29fZ2VuZXJhdGVkLmgiLCAnI2luY2x1ZGUgImJhcl9nZW5lcmF0ZWQuaCInKQorCisgICAgZGVmIEZsYXR0ZW5BYnNvbHV0ZVBhdGgoc2VsZik6CisgICAgICAgICMgR2VuZXJhdGUganVzdCBmb28gd2l0aCBhICJmbGF0dGVuIiBpbXBvcnQgb2YgYmFyLgorICAgICAgICBmbGF0YyhbIi0tY3BwIiwgbWFrZV9hYnNvbHV0ZSgiZm9vLmZicyIpXSkKKworICAgICAgICAjIEZvbyBzaG91bGQgYmUgZ2VuZXJhdGVkIGluIHBsYWNlIGFuZCBpbmNsdWRlIGJhciBmbGF0dGVuCisgICAgICAgIGFzc2VydF9maWxlX2FuZF9jb250ZW50cygiZm9vX2dlbmVyYXRlZC5oIiwgJyNpbmNsdWRlICJiYXJfZ2VuZXJhdGVkLmgiJykKKworICAgIGRlZiBGbGF0dGVuU3ViRGlyZWN0b3J5KHNlbGYpOgorICAgICAgICAjIEdlbmVyYXRlIGp1c3QgZm9vIHdpdGggYSAiZmxhdHRlbiIgaW1wb3J0IG9mIGJhci4KKyAgICAgICAgZmxhdGMoWyItLWNwcCIsICJiYXIvYmFyLmZicyJdKQorCisgICAgICAgICMgQmFyIHNob3VsZCBiZSBnZW5lcmF0ZWQgaW4gcGxhY2UgYW5kIGluY2x1ZGUgYmF6CisgICAgICAgIGFzc2VydF9maWxlX2FuZF9jb250ZW50cygiYmFyX2dlbmVyYXRlZC5oIiwgJyNpbmNsdWRlICJiYXpfZ2VuZXJhdGVkLmgiJykKKworICAgIGRlZiBGbGF0dGVuT3V0UGF0aChzZWxmKToKKyAgICAgICAgIyBHZW5lcmF0ZSBqdXN0IGZvbyB3aXRoIGEgImZsYXR0ZW4iIGltcG9ydCBvZiBiYXIuCisgICAgICAgIGZsYXRjKFsiLS1jcHAiLCAiLW8iLCAiLnRtcCIsICJmb28uZmJzIl0pCisKKyAgICAgICAgIyBGb28gc2hvdWxkIGJlIGdlbmVyYXRlZCBpbiB0aGUgb3V0IHBhdGggYW5kIGluY2x1ZGUgYmFyIGZsYXR0ZW4gdG8gdGhlIG91dCBwYXRoLgorICAgICAgICBhc3NlcnRfZmlsZV9hbmRfY29udGVudHMoIi50bXAvZm9vX2dlbmVyYXRlZC5oIiwgJyNpbmNsdWRlICJiYXJfZ2VuZXJhdGVkLmgiJykKKworICAgIGRlZiBGbGF0dGVuT3V0UGF0aFN1cGVyRGlyZWN0b3J5KHNlbGYpOgorICAgICAgICAjIEdlbmVyYXRlIGp1c3QgZm9vIHdpdGggYSAiZmxhdHRlbiIgaW1wb3J0IG9mIGJhci4KKyAgICAgICAgZmxhdGMoWyItLWNwcCIsICItbyIsICIuLi8udG1wIiwgImZvby5mYnMiXSkKKworICAgICAgICAjIEZvbyBzaG91bGQgYmUgZ2VuZXJhdGVkIGluIHRoZSBvdXQgcGF0aCBhbmQgaW5jbHVkZSBiYXIgZmxhdHRlbiB0byB0aGUgb3V0IHBhdGguCisgICAgICAgIGFzc2VydF9maWxlX2FuZF9jb250ZW50cygKKyAgICAgICAgICAgICIuLi8udG1wL2Zvb19nZW5lcmF0ZWQuaCIsICcjaW5jbHVkZSAiYmFyX2dlbmVyYXRlZC5oIicKKyAgICAgICAgKQorCisgICAgZGVmIEZsYXR0ZW5PdXRQYXRoU3ViRGlyZWN0b3J5KHNlbGYpOgorICAgICAgICAjIEdlbmVyYXRlIGp1c3QgZm9vIHdpdGggYSAiZmxhdHRlbiIgaW1wb3J0IG9mIGJhci4KKyAgICAgICAgZmxhdGMoWyItLWNwcCIsICItbyIsICIudG1wIiwgImJhci9iYXIuZmJzIl0pCisKKyAgICAgICAgIyBCYXIgc2hvdWxkIGJlIGdlbmVyYXRlZCBpbiB0aGUgb3V0IHBhdGggYW5kIGluY2x1ZGUgYmF6IGZsYXR0ZW4gdG8gdGhlIG91dCBwYXRoLgorICAgICAgICBhc3NlcnRfZmlsZV9hbmRfY29udGVudHMoIi50bXAvYmFyX2dlbmVyYXRlZC5oIiwgJyNpbmNsdWRlICJiYXpfZ2VuZXJhdGVkLmgiJykKKworICAgIGRlZiBLZWVwUHJlZml4KHNlbGYpOgorICAgICAgICAjIEdlbmVyYXRlIGp1c3QgZm9vIHdpdGggdGhlIGltcG9ydCBvZiBiYXIga2VlcGluZyB0aGUgcHJlZml4IG9mIHdoZXJlIGl0IGlzIGxvY2F0ZWQuCisgICAgICAgIGZsYXRjKFsiLS1jcHAiLCAiLS1rZWVwLXByZWZpeCIsICJmb28uZmJzIl0pCisKKyAgICAgICAgYXNzZXJ0X2ZpbGVfYW5kX2NvbnRlbnRzKCJmb29fZ2VuZXJhdGVkLmgiLCAnI2luY2x1ZGUgImJhci9iYXJfZ2VuZXJhdGVkLmgiJykKKworICAgIGRlZiBLZWVwUHJlZml4QWJzb2x1dGVQYXRoKHNlbGYpOgorICAgICAgICAjIEdlbmVyYXRlIGp1c3QgZm9vIHdpdGggdGhlIGltcG9ydCBvZiBiYXIga2VlcGluZyB0aGUgcHJlZml4IG9mIHdoZXJlIGl0IGlzIGxvY2F0ZWQuCisgICAgICAgIGZsYXRjKFsiLS1jcHAiLCAiLS1rZWVwLXByZWZpeCIsIG1ha2VfYWJzb2x1dGUoImZvby5mYnMiKV0pCisKKyAgICAgICAgYXNzZXJ0X2ZpbGVfYW5kX2NvbnRlbnRzKCJmb29fZ2VuZXJhdGVkLmgiLCAnI2luY2x1ZGUgImJhci9iYXJfZ2VuZXJhdGVkLmgiJykKKworICAgIGRlZiBLZWVwUHJlZml4U3ViRGlyZWN0b3J5KHNlbGYpOgorICAgICAgICAjIEdlbmVyYXRlIHdpdGggdGhlIGltcG9ydCBvZiBiYXIga2VlcGluZyB0aGUgcHJlZml4IG9mIHdoZXJlIGl0IGlzIGxvY2F0ZWQuCisgICAgICAgIGZsYXRjKFsiLS1jcHAiLCAiLS1rZWVwLXByZWZpeCIsICJiYXIvYmFyLmZicyJdKQorCisgICAgICAgIGFzc2VydF9maWxlX2FuZF9jb250ZW50cygiYmFyX2dlbmVyYXRlZC5oIiwgJyNpbmNsdWRlICJiYXovYmF6X2dlbmVyYXRlZC5oIicpCisKKyAgICBkZWYgS2VlcFByZWZpeE91dFBhdGgoc2VsZik6CisgICAgICAgICMgR2VuZXJhdGUganVzdCBmb28gd2l0aCB0aGUgaW1wb3J0IG9mIGJhciBrZWVwaW5nIHRoZSBwcmVmaXggb2Ygd2hlcmUgaXQgaXMgbG9jYXRlZC4KKyAgICAgICAgZmxhdGMoWyItLWNwcCIsICItLWtlZXAtcHJlZml4IiwgIi1vIiwgIi50bXAiLCAiZm9vLmZicyJdKQorCisgICAgICAgIGFzc2VydF9maWxlX2FuZF9jb250ZW50cygKKyAgICAgICAgICAgICIudG1wL2Zvb19nZW5lcmF0ZWQuaCIsCisgICAgICAgICAgICAnI2luY2x1ZGUgImJhci9iYXJfZ2VuZXJhdGVkLmgiJywKKyAgICAgICAgKQorCisgICAgZGVmIEtlZXBQcmVmaXhPdXRQYXRoU3ViRGlyZWN0b3J5KHNlbGYpOgorICAgICAgICAjIEdlbmVyYXRlIHdpdGggdGhlIGltcG9ydCBvZiBiYXIga2VlcGluZyB0aGUgcHJlZml4IG9mIHdoZXJlIGl0IGlzIGxvY2F0ZWQuCisgICAgICAgIGZsYXRjKFsiLS1jcHAiLCAiLS1rZWVwLXByZWZpeCIsICItbyIsICIudG1wIiwgImJhci9iYXIuZmJzIl0pCisKKyAgICAgICAgYXNzZXJ0X2ZpbGVfYW5kX2NvbnRlbnRzKAorICAgICAgICAgICAgIi50bXAvYmFyX2dlbmVyYXRlZC5oIiwgJyNpbmNsdWRlICJiYXovYmF6X2dlbmVyYXRlZC5oIicKKyAgICAgICAgKQorCisgICAgZGVmIEluY2x1ZGVQcmVmaXgoc2VsZik6CisgICAgICAgICMgR2VuZXJhdGUganVzdCBmb28gd2l0aCB0aGUgaW1wb3J0IG9mIGJhciBrZWVwaW5nIHRoZSBwcmVmaXggb2Ygd2hlcmUgaXQgaXMgbG9jYXRlZC4KKyAgICAgICAgZmxhdGMoWyItLWNwcCIsICItLWluY2x1ZGUtcHJlZml4IiwgInRlc3QiLCAiZm9vLmZicyJdKQorCisgICAgICAgIGFzc2VydF9maWxlX2FuZF9jb250ZW50cygiZm9vX2dlbmVyYXRlZC5oIiwgJyNpbmNsdWRlICJ0ZXN0L2Jhcl9nZW5lcmF0ZWQuaCInKQorCisgICAgZGVmIEluY2x1ZGVQcmVmaXhBYm9sdXRlUGF0aChzZWxmKToKKyAgICAgICAgIyBHZW5lcmF0ZSBqdXN0IGZvbyB3aXRoIHRoZSBpbXBvcnQgb2YgYmFyIGtlZXBpbmcgdGhlIHByZWZpeCBvZiB3aGVyZSBpdCBpcyBsb2NhdGVkLgorICAgICAgICBmbGF0YyhbIi0tY3BwIiwgIi0taW5jbHVkZS1wcmVmaXgiLCAidGVzdCIsIG1ha2VfYWJzb2x1dGUoImZvby5mYnMiKV0pCisKKyAgICAgICAgYXNzZXJ0X2ZpbGVfYW5kX2NvbnRlbnRzKCJmb29fZ2VuZXJhdGVkLmgiLCAnI2luY2x1ZGUgInRlc3QvYmFyX2dlbmVyYXRlZC5oIicpCisKKyAgICBkZWYgSW5jbHVkZVByZWZpeFN1YkRpcmVjdG9yeShzZWxmKToKKyAgICAgICAgIyBHZW5lcmF0ZSBqdXN0IGZvbyB3aXRoIHRoZSBpbXBvcnQgb2YgYmFyIGtlZXBpbmcgdGhlIHByZWZpeCBvZiB3aGVyZSBpdCBpcyBsb2NhdGVkLgorICAgICAgICBmbGF0YyhbIi0tY3BwIiwgIi0taW5jbHVkZS1wcmVmaXgiLCAidGVzdCIsICJiYXIvYmFyLmZicyJdKQorCisgICAgICAgIGFzc2VydF9maWxlX2FuZF9jb250ZW50cygiYmFyX2dlbmVyYXRlZC5oIiwgJyNpbmNsdWRlICJ0ZXN0L2Jhel9nZW5lcmF0ZWQuaCInKQorCisgICAgZGVmIEluY2x1ZGVQcmVmaXhPdXRQYXRoKHNlbGYpOgorICAgICAgICAjIEdlbmVyYXRlIGp1c3QgZm9vIHdpdGggdGhlIGltcG9ydCBvZiBiYXIga2VlcGluZyB0aGUgcHJlZml4IG9mIHdoZXJlIGl0IGlzIGxvY2F0ZWQuCisgICAgICAgIGZsYXRjKFsiLS1jcHAiLCAiLS1pbmNsdWRlLXByZWZpeCIsICJ0ZXN0IiwgIi1vIiwgIi50bXAiLCAiZm9vLmZicyJdKQorCisgICAgICAgIGFzc2VydF9maWxlX2FuZF9jb250ZW50cygKKyAgICAgICAgICAgICIudG1wL2Zvb19nZW5lcmF0ZWQuaCIsICcjaW5jbHVkZSAidGVzdC9iYXJfZ2VuZXJhdGVkLmgiJworICAgICAgICApCisKKyAgICBkZWYgSW5jbHVkZVByZWZpeE91dFBhdGhTdWJEaXJlY3Rvcnkoc2VsZik6CisgICAgICAgICMgR2VuZXJhdGUganVzdCBmb28gd2l0aCB0aGUgaW1wb3J0IG9mIGJhciBrZWVwaW5nIHRoZSBwcmVmaXggb2Ygd2hlcmUgaXQgaXMgbG9jYXRlZC4KKyAgICAgICAgZmxhdGMoWyItLWNwcCIsICItLWluY2x1ZGUtcHJlZml4IiwgInRlc3QiLCAiLW8iLCAiLnRtcCIsICJiYXIvYmFyLmZicyJdKQorCisgICAgICAgIGFzc2VydF9maWxlX2FuZF9jb250ZW50cygKKyAgICAgICAgICAgICIudG1wL2Jhcl9nZW5lcmF0ZWQuaCIsICcjaW5jbHVkZSAidGVzdC9iYXpfZ2VuZXJhdGVkLmgiJworICAgICAgICApCisKKyAgICBkZWYgS2VlcFByZWZpeEluY2x1ZGVQcmVmaXgoc2VsZik6CisgICAgICAgICMgR2VuZXJhdGUganVzdCBmb28gd2l0aCB0aGUgaW1wb3J0IG9mIGJhciBrZWVwaW5nIHRoZSBwcmVmaXggb2Ygd2hlcmUgaXQgaXMgbG9jYXRlZC4KKyAgICAgICAgZmxhdGMoWyItLWNwcCIsICItLWtlZXAtcHJlZml4IiwgIi0taW5jbHVkZS1wcmVmaXgiLCAidGVzdCIsICJmb28uZmJzIl0pCisKKyAgICAgICAgIyBUaGUgaW5jbHVkZSBwcmVmaXggc2hvdWxkIGNvbWUgZmlyc3QsIHdpdGggdGhlIGtlcHQgcHJlZml4IG5leHQuCisgICAgICAgIGFzc2VydF9maWxlX2FuZF9jb250ZW50cygKKyAgICAgICAgICAgICJmb29fZ2VuZXJhdGVkLmgiLCAnI2luY2x1ZGUgInRlc3QvYmFyL2Jhcl9nZW5lcmF0ZWQuaCInCisgICAgICAgICkKKworICAgIGRlZiBLZWVwUHJlZml4SW5jbHVkZVByZWZpeEFic29sdXRlUGF0aChzZWxmKToKKyAgICAgICAgIyBHZW5lcmF0ZSBqdXN0IGZvbyB3aXRoIHRoZSBpbXBvcnQgb2YgYmFyIGtlZXBpbmcgdGhlIHByZWZpeCBvZiB3aGVyZSBpdCBpcyBsb2NhdGVkLgorICAgICAgICBmbGF0YygKKyAgICAgICAgICAgIFsKKyAgICAgICAgICAgICAgICAiLS1jcHAiLAorICAgICAgICAgICAgICAgICItLWtlZXAtcHJlZml4IiwKKyAgICAgICAgICAgICAgICAiLS1pbmNsdWRlLXByZWZpeCIsCisgICAgICAgICAgICAgICAgInRlc3QiLAorICAgICAgICAgICAgICAgIG1ha2VfYWJzb2x1dGUoImZvby5mYnMiKSwKKyAgICAgICAgICAgIF0KKyAgICAgICAgKQorCisgICAgICAgICMgVGhlIGluY2x1ZGUgcHJlZml4IHNob3VsZCBjb21lIGZpcnN0LCB3aXRoIHRoZSBrZXB0IHByZWZpeCBuZXh0LgorICAgICAgICBhc3NlcnRfZmlsZV9hbmRfY29udGVudHMoCisgICAgICAgICAgICAiZm9vX2dlbmVyYXRlZC5oIiwgJyNpbmNsdWRlICJ0ZXN0L2Jhci9iYXJfZ2VuZXJhdGVkLmgiJworICAgICAgICApCisKKyAgICBkZWYgS2VlcFByZWZpeEluY2x1ZGVQcmVmaXhTdWJEaXJlY3Rvcnkoc2VsZik6CisgICAgICAgICMgR2VuZXJhdGUganVzdCBmb28gd2l0aCB0aGUgaW1wb3J0IG9mIGJhciBrZWVwaW5nIHRoZSBwcmVmaXggb2Ygd2hlcmUgaXQgaXMgbG9jYXRlZC4KKyAgICAgICAgZmxhdGMoWyItLWNwcCIsICItLWtlZXAtcHJlZml4IiwgIi0taW5jbHVkZS1wcmVmaXgiLCAidGVzdCIsICJiYXIvYmFyLmZicyJdKQorCisgICAgICAgICMgVGhlIGluY2x1ZGUgcHJlZml4IHNob3VsZCBjb21lIGZpcnN0LCB3aXRoIHRoZSBrZXB0IHByZWZpeCBuZXh0LgorICAgICAgICBhc3NlcnRfZmlsZV9hbmRfY29udGVudHMoCisgICAgICAgICAgICAiYmFyX2dlbmVyYXRlZC5oIiwgJyNpbmNsdWRlICJ0ZXN0L2Jhei9iYXpfZ2VuZXJhdGVkLmgiJworICAgICAgICApCisKKyAgICBkZWYgS2VlcFByZWZpeEluY2x1ZGVQcmVmaXhPdXRQYXRoU3ViRGlyZWN0b3J5KHNlbGYpOgorICAgICAgICAjIEdlbmVyYXRlIGp1c3QgZm9vIHdpdGggdGhlIGltcG9ydCBvZiBiYXIga2VlcGluZyB0aGUgcHJlZml4IG9mIHdoZXJlIGl0IGlzIGxvY2F0ZWQuCisgICAgICAgIGZsYXRjKAorICAgICAgICAgICAgWworICAgICAgICAgICAgICAgICItLWNwcCIsCisgICAgICAgICAgICAgICAgIi0ta2VlcC1wcmVmaXgiLAorICAgICAgICAgICAgICAgICItLWluY2x1ZGUtcHJlZml4IiwKKyAgICAgICAgICAgICAgICAidGVzdCIsCisgICAgICAgICAgICAgICAgIi1vIiwKKyAgICAgICAgICAgICAgICAiLnRtcCIsCisgICAgICAgICAgICAgICAgImJhci9iYXIuZmJzIiwKKyAgICAgICAgICAgIF0KKyAgICAgICAgKQorCisgICAgICAgICMgVGhlIGluY2x1ZGUgcHJlZml4IHNob3VsZCBjb21lIGZpcnN0LCB3aXRoIHRoZSBrZXB0IHByZWZpeCBuZXh0LgorICAgICAgICBhc3NlcnRfZmlsZV9hbmRfY29udGVudHMoCisgICAgICAgICAgICAiLnRtcC9iYXJfZ2VuZXJhdGVkLmgiLCAnI2luY2x1ZGUgInRlc3QvYmF6L2Jhel9nZW5lcmF0ZWQuaCInCisgICAgICAgICkKKworICAgIGRlZiBLZWVwUHJlZml4SW5jbHVkZVByZWZpeE91dFBhdGhTdXBlckRpcmVjdG9yeShzZWxmKToKKyAgICAgICAgIyBHZW5lcmF0ZSBqdXN0IGZvbyB3aXRoIHRoZSBpbXBvcnQgb2YgYmFyIGtlZXBpbmcgdGhlIHByZWZpeCBvZiB3aGVyZSBpdCBpcyBsb2NhdGVkLgorICAgICAgICBmbGF0YygKKyAgICAgICAgICAgIFsKKyAgICAgICAgICAgICAgICAiLS1jcHAiLAorICAgICAgICAgICAgICAgICItLWtlZXAtcHJlZml4IiwKKyAgICAgICAgICAgICAgICAiLS1pbmNsdWRlLXByZWZpeCIsCisgICAgICAgICAgICAgICAgInRlc3QiLAorICAgICAgICAgICAgICAgICItbyIsCisgICAgICAgICAgICAgICAgIi4uLy50bXAiLAorICAgICAgICAgICAgICAgICJiYXIvYmFyLmZicyIsCisgICAgICAgICAgICBdCisgICAgICAgICkKKworICAgICAgICAjIFRoZSBpbmNsdWRlIHByZWZpeCBzaG91bGQgY29tZSBmaXJzdCwgd2l0aCB0aGUga2VwdCBwcmVmaXggbmV4dC4KKyAgICAgICAgYXNzZXJ0X2ZpbGVfYW5kX2NvbnRlbnRzKAorICAgICAgICAgICAgIi4uLy50bXAvYmFyX2dlbmVyYXRlZC5oIiwgJyNpbmNsdWRlICJ0ZXN0L2Jhei9iYXpfZ2VuZXJhdGVkLmgiJworICAgICAgICApCisKKyAgICBkZWYgS2VlcFByZWZpeEluY2x1ZGVQcmVmaXhvdXRQYXRoQWJzb2x1ZVBhdGhzX1N1cGVyRGlyZWN0b3J5UmVmZXJlbmNlKHNlbGYpOgorICAgICAgICAjIEdlbmVyYXRlIGJhcl93aXRoX2ZvbyB0aGF0IHJlZmVyZW5jZXMgYSB0eXBlIGluIGEgc3VwZXIgZGlyZWN0b3J5LgorICAgICAgICBmbGF0YygKKyAgICAgICAgICAgIFsKKyAgICAgICAgICAgICAgICAiLS1jcHAiLAorICAgICAgICAgICAgICAgICItLWtlZXAtcHJlZml4IiwKKyAgICAgICAgICAgICAgICAiLS1pbmNsdWRlLXByZWZpeCIsCisgICAgICAgICAgICAgICAgImdlbmVyYXRlZCIsCisgICAgICAgICAgICAgICAgIi1JIiwKKyAgICAgICAgICAgICAgICBzdHIoc2NyaXB0X3BhdGguYWJzb2x1dGUoKSksCisgICAgICAgICAgICAgICAgIi1vIiwKKyAgICAgICAgICAgICAgICBzdHIoUGF0aChzY3JpcHRfcGF0aCwgIi50bXAiKS5hYnNvbHV0ZSgpKSwKKyAgICAgICAgICAgICAgICBzdHIoUGF0aChzY3JpcHRfcGF0aCwgImJhci9iYXJfd2l0aF9mb28uZmJzIikuYWJzb2x1dGUoKSksCisgICAgICAgICAgICBdCisgICAgICAgICkKKworICAgICAgICAjIFRoZSBpbmNsdWRlIHByZWZpeCBzaG91bGQgY29tZSBmaXJzdCwgd2l0aCB0aGUga2VwdCBwcmVmaXggbmV4dC4KKyAgICAgICAgYXNzZXJ0X2ZpbGVfYW5kX2NvbnRlbnRzKAorICAgICAgICAgICAgIi50bXAvYmFyX3dpdGhfZm9vX2dlbmVyYXRlZC5oIiwKKyAgICAgICAgICAgIFsKKyAgICAgICAgICAgICAgICAnI2luY2x1ZGUgImdlbmVyYXRlZC9iYXovYmF6X2dlbmVyYXRlZC5oIicsCisgICAgICAgICAgICAgICAgJyNpbmNsdWRlICJnZW5lcmF0ZWQvZm9vX2dlbmVyYXRlZC5oIicsCisgICAgICAgICAgICBdLAorICAgICAgICApCisKKyAgICBkZWYgS2VlcFByZWZpeEluY2x1ZGVQcmVmaXhvdXRQYXRoX1N1cGVyRGlyZWN0b3J5UmVmZXJlbmNlKHNlbGYpOgorICAgICAgICAjIEdlbmVyYXRlIGJhcl93aXRoX2ZvbyB0aGF0IHJlZmVyZW5jZXMgYSB0eXBlIGluIGEgc3VwZXIgZGlyZWN0b3J5LgorICAgICAgICBmbGF0YygKKyAgICAgICAgICAgIFsKKyAgICAgICAgICAgICAgICAiLS1jcHAiLAorICAgICAgICAgICAgICAgICItLWtlZXAtcHJlZml4IiwKKyAgICAgICAgICAgICAgICAiLS1pbmNsdWRlLXByZWZpeCIsCisgICAgICAgICAgICAgICAgImdlbmVyYXRlZCIsCisgICAgICAgICAgICAgICAgIi1JIiwKKyAgICAgICAgICAgICAgICAiLi8iLAorICAgICAgICAgICAgICAgICItbyIsCisgICAgICAgICAgICAgICAgIi50bXAiLAorICAgICAgICAgICAgICAgICJiYXIvYmFyX3dpdGhfZm9vLmZicyIsCisgICAgICAgICAgICBdCisgICAgICAgICkKKworICAgICAgICAjIFRoZSBpbmNsdWRlIHByZWZpeCBzaG91bGQgY29tZSBmaXJzdCwgd2l0aCB0aGUga2VwdCBwcmVmaXggbmV4dC4KKyAgICAgICAgYXNzZXJ0X2ZpbGVfYW5kX2NvbnRlbnRzKAorICAgICAgICAgICAgIi50bXAvYmFyX3dpdGhfZm9vX2dlbmVyYXRlZC5oIiwKKyAgICAgICAgICAgIFsKKyAgICAgICAgICAgICAgICAnI2luY2x1ZGUgImdlbmVyYXRlZC9iYXovYmF6X2dlbmVyYXRlZC5oIicsCisgICAgICAgICAgICAgICAgJyNpbmNsdWRlICJnZW5lcmF0ZWQvZm9vX2dlbmVyYXRlZC5oIicsCisgICAgICAgICAgICBdLAorICAgICAgICAgICAgdW5saW5rPUZhbHNlLAorICAgICAgICApCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9mbGF0Yy9mbGF0Y190ZXN0LnB5IGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvZmxhdGMvZmxhdGNfdGVzdC5weQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5mY2MzMmM2Ci0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvZmxhdGMvZmxhdGNfdGVzdC5weQpAQCAtMCwwICsxLDEyNyBAQAorIyBDb3B5cmlnaHQgMjAyMiBHb29nbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitpbXBvcnQgYXJncGFyc2UKK2ltcG9ydCBwbGF0Zm9ybQoraW1wb3J0IHN1YnByb2Nlc3MKK2Zyb20gcGF0aGxpYiBpbXBvcnQgUGF0aAorCitwYXJzZXIgPSBhcmdwYXJzZS5Bcmd1bWVudFBhcnNlcigpCitwYXJzZXIuYWRkX2FyZ3VtZW50KAorICAgICItLWZsYXRjIiwgaGVscD0icGF0aCBvZiB0aGUgRmxhdCBDIGNvbXBpbGVyIHJlbGF0aXZlIHRvIHRoZSByb290IGRpcmVjdG9yeSIKKykKKworYXJncyA9IHBhcnNlci5wYXJzZV9hcmdzKCkKKworIyBHZXQgdGhlIHBhdGggd2hlcmUgdGhpcyBzY3JpcHQgaXMgbG9jYXRlZCBzbyB3ZSBjYW4gaW52b2tlIHRoZSBzY3JpcHQgZnJvbQorIyBhbnkgZGlyZWN0b3J5IGFuZCBoYXZlIHRoZSBwYXRocyB3b3JrIGNvcnJlY3RseS4KK3NjcmlwdF9wYXRoID0gUGF0aChfX2ZpbGVfXykucGFyZW50LnJlc29sdmUoKQorCisjIEdldCB0aGUgcm9vdCBwYXRoIGFzIGFuIGFic29sdXRlIHBhdGgsIHNvIGFsbCBkZXJpdmVkIHBhdGhzIGFyZSBhYnNvbHV0ZS4KK3Jvb3RfcGF0aCA9IHNjcmlwdF9wYXRoLnBhcmVudC5wYXJlbnQuYWJzb2x1dGUoKQorCisjIEdldCB0aGUgbG9jYXRpb24gb2YgdGhlIGZsYXRjIGV4ZWN1dGFibGUsIHJlYWRpbmcgZnJvbSB0aGUgZmlyc3QgY29tbWFuZCBsaW5lCisjIGFyZ3VtZW50IG9yIGRlZmF1bHRpbmcgdG8gZGVmYXVsdCBuYW1lcy4KK2ZsYXRjX2V4ZSA9IFBhdGgoCisgICAgKCJmbGF0YyIgaWYgbm90IHBsYXRmb3JtLnN5c3RlbSgpID09ICJXaW5kb3dzIiBlbHNlICJmbGF0Yy5leGUiKQorICAgIGlmIG5vdCBhcmdzLmZsYXRjCisgICAgZWxzZSBhcmdzLmZsYXRjCispCisKKyMgRmluZCBhbmQgYXNzZXJ0IGZsYXRjIGNvbXBpbGVyIGlzIHByZXNlbnQuCitpZiByb290X3BhdGggaW4gZmxhdGNfZXhlLnBhcmVudHM6CisgICAgZmxhdGNfZXhlID0gZmxhdGNfZXhlLnJlbGF0aXZlX3RvKHJvb3RfcGF0aCkKK2ZsYXRjX3BhdGggPSBQYXRoKHJvb3RfcGF0aCwgZmxhdGNfZXhlKQorYXNzZXJ0IGZsYXRjX3BhdGguZXhpc3RzKCksICJDYW5ub3QgZmluZCB0aGUgZmxhdGMgY29tcGlsZXIgIiArIHN0cihmbGF0Y19wYXRoKQorCisjIEV4ZWN1dGUgdGhlIGZsYXRjIGNvbXBpbGVyIHdpdGggdGhlIHNwZWNpZmllZCBwYXJhbWV0ZXJzCitkZWYgZmxhdGMob3B0aW9ucywgY3dkPXNjcmlwdF9wYXRoKToKKyAgICBjbWQgPSBbc3RyKGZsYXRjX3BhdGgpXSArIG9wdGlvbnMKKyAgICBzdWJwcm9jZXNzLmNoZWNrX2NhbGwoY21kLCBjd2Q9c3RyKGN3ZCkpCisKKworZGVmIG1ha2VfYWJzb2x1dGUoZmlsZW5hbWUsIHBhdGg9c2NyaXB0X3BhdGgpOgorICAgIHJldHVybiBzdHIoUGF0aChwYXRoLCBmaWxlbmFtZSkuYWJzb2x1dGUoKSkKKworCitkZWYgYXNzZXJ0X2ZpbGVfZXhpc3RzKGZpbGVuYW1lLCBwYXRoPXNjcmlwdF9wYXRoKToKKyAgICBmaWxlID0gUGF0aChwYXRoLCBmaWxlbmFtZSkKKyAgICBhc3NlcnQgZmlsZS5leGlzdHMoKSwgImNvdWxkIG5vdCBmaW5kIGZpbGU6ICIgKyBmaWxlbmFtZQorICAgIHJldHVybiBmaWxlCisKKworZGVmIGFzc2VydF9maWxlX2RvZXNudF9leGlzdHMoZmlsZW5hbWUsIHBhdGg9c2NyaXB0X3BhdGgpOgorICAgIGZpbGUgPSBQYXRoKHBhdGgsIGZpbGVuYW1lKQorICAgIGFzc2VydCBub3QgZmlsZS5leGlzdHMoKSwgImZpbGUgZXhpc3RzIGJ1dCBzaG91bGRuJ3Q6ICIgKyBmaWxlbmFtZQorICAgIHJldHVybiBmaWxlCisKKworZGVmIGFzc2VydF9maWxlX2NvbnRhaW5zKGZpbGUsIG5lZWRsZXMpOgorICAgIHdpdGggb3BlbihmaWxlKSBhcyBmaWxlOgorICAgICAgICBjb250ZW50cyA9IGZpbGUucmVhZCgpCisgICAgICAgIGZvciBuZWVkbGUgaW4gW25lZWRsZXNdIGlmIGlzaW5zdGFuY2UobmVlZGxlcywgc3RyKSBlbHNlIG5lZWRsZXM6CisgICAgICAgICAgICBhc3NlcnQgbmVlZGxlIGluIGNvbnRlbnRzLCAoCisgICAgICAgICAgICAgICAgImNvdWRuJ3QgZmluZCAnIiArIG5lZWRsZSArICInIGluIGZpbGU6ICIgKyBzdHIoZmlsZSkKKyAgICAgICAgICAgICkKKyAgICByZXR1cm4gZmlsZQorCisKK2RlZiBhc3NlcnRfZmlsZV9kb2VzbnRfY29udGFpbnMoZmlsZSwgbmVlZGxlcyk6CisgICAgd2l0aCBvcGVuKGZpbGUpIGFzIGZpbGU6CisgICAgICAgIGNvbnRlbnRzID0gZmlsZS5yZWFkKCkKKyAgICAgICAgZm9yIG5lZWRsZSBpbiBbbmVlZGxlc10gaWYgaXNpbnN0YW5jZShuZWVkbGVzLCBzdHIpIGVsc2UgbmVlZGxlczoKKyAgICAgICAgICAgIGFzc2VydCBuZWVkbGUgbm90IGluIGNvbnRlbnRzLCAoCisgICAgICAgICAgICAgICAgIkZvdW5kIHVuZXhwZWN0ZWQgJyIgKyBuZWVkbGUgKyAiJyBpbiBmaWxlOiAiICsgc3RyKGZpbGUpCisgICAgICAgICAgICApCisgICAgcmV0dXJuIGZpbGUKKworCitkZWYgYXNzZXJ0X2ZpbGVfYW5kX2NvbnRlbnRzKAorICAgIGZpbGUsIG5lZWRsZSwgZG9lc250X2NvbnRhaW49Tm9uZSwgcGF0aD1zY3JpcHRfcGF0aCwgdW5saW5rPVRydWUKKyk6CisgICAgYXNzZXJ0X2ZpbGVfY29udGFpbnMoYXNzZXJ0X2ZpbGVfZXhpc3RzKGZpbGUsIHBhdGgpLCBuZWVkbGUpCisgICAgaWYgZG9lc250X2NvbnRhaW46CisgICAgICAgIGFzc2VydF9maWxlX2RvZXNudF9jb250YWlucyhhc3NlcnRfZmlsZV9leGlzdHMoZmlsZSwgcGF0aCksIGRvZXNudF9jb250YWluKQorICAgIGlmIHVubGluazoKKyAgICAgICAgUGF0aChwYXRoLCBmaWxlKS51bmxpbmsoKQorCisKK2RlZiBydW5fYWxsKCptb2R1bGVzKToKKyAgICBmYWlsaW5nID0gMAorICAgIHBhc3NpbmcgPSAwCisgICAgZm9yIG1vZHVsZSBpbiBtb2R1bGVzOgorICAgICAgICBtZXRob2RzID0gWworICAgICAgICAgICAgZnVuYworICAgICAgICAgICAgZm9yIGZ1bmMgaW4gZGlyKG1vZHVsZSkKKyAgICAgICAgICAgIGlmIGNhbGxhYmxlKGdldGF0dHIobW9kdWxlLCBmdW5jKSkgYW5kIG5vdCBmdW5jLnN0YXJ0c3dpdGgoIl9fIikKKyAgICAgICAgXQorICAgICAgICBtb2R1bGVfZmFpbGluZyA9IDAKKyAgICAgICAgbW9kdWxlX3Bhc3NpbmcgPSAwCisgICAgICAgIGZvciBtZXRob2QgaW4gbWV0aG9kczoKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBwcmludCgiezB9LnsxfSIuZm9ybWF0KG1vZHVsZS5fX25hbWVfXywgbWV0aG9kKSkKKyAgICAgICAgICAgICAgICBnZXRhdHRyKG1vZHVsZSwgbWV0aG9kKShtb2R1bGUpCisgICAgICAgICAgICAgICAgcHJpbnQoIiBbUEFTU0VEXSIpCisgICAgICAgICAgICAgICAgbW9kdWxlX3Bhc3NpbmcgPSBtb2R1bGVfcGFzc2luZyArIDEKKyAgICAgICAgICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZToKKyAgICAgICAgICAgICAgICBwcmludCgiIFtGQUlMRURdOiAiICsgc3RyKGUpKQorICAgICAgICAgICAgICAgIG1vZHVsZV9mYWlsaW5nID0gbW9kdWxlX2ZhaWxpbmcgKyAxCisgICAgICAgIHByaW50KAorICAgICAgICAgICAgInswfTogezF9IG9mIHsyfSBwYXNzc2VkIi5mb3JtYXQoCisgICAgICAgICAgICAgICAgbW9kdWxlLl9fbmFtZV9fLCBtb2R1bGVfcGFzc2luZywgbW9kdWxlX3Bhc3NpbmcgKyBtb2R1bGVfZmFpbGluZworICAgICAgICAgICAgKQorICAgICAgICApCisgICAgICAgIHBhc3NpbmcgPSBwYXNzaW5nICsgbW9kdWxlX3Bhc3NpbmcKKyAgICAgICAgZmFpbGluZyA9IGZhaWxpbmcgKyBtb2R1bGVfZmFpbGluZworICAgIHJldHVybiBwYXNzaW5nLCBmYWlsaW5nCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9mbGF0Yy9mbGF0Y190c190ZXN0cy5weSBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL2ZsYXRjL2ZsYXRjX3RzX3Rlc3RzLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjZlNDQ0YmMKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9mbGF0Yy9mbGF0Y190c190ZXN0cy5weQpAQCAtMCwwICsxLDI0MiBAQAorIyBDb3B5cmlnaHQgMjAyMiBHb29nbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitmcm9tIGZsYXRjX3Rlc3QgaW1wb3J0ICoKKworCitjbGFzcyBUc1Rlc3RzKCk6CisKKyAgICBkZWYgQmFzZShzZWxmKToKKyAgICAgICAgIyBHZW5lcmF0ZSBqdXN0IGZvbyB3aXRoIG5vIGV4dHJhIGFyZ3VtZW50cworICAgICAgICBmbGF0YyhbIi0tdHMiLCAiZm9vLmZicyJdKQorCisgICAgICAgICMgU2hvdWxkIGdlbmVyYXRlIHRoZSBtb2R1bGUgdGhhdCBleHBvcnRzIGJvdGggZm9vIGFuZCBpdHMgZGlyZWN0CisgICAgICAgICMgaW5jbHVkZSwgYmFyLgorICAgICAgICBhc3NlcnRfZmlsZV9hbmRfY29udGVudHMoCisgICAgICAgICAgICAiZm9vX2dlbmVyYXRlZC50cyIsCisgICAgICAgICAgICBbCisgICAgICAgICAgICAgICAgImV4cG9ydCB7IEJhciB9IGZyb20gJy4vYmFyLmpzJzsiLAorICAgICAgICAgICAgICAgICJleHBvcnQgeyBGb28gfSBmcm9tICcuL2Zvby5qcyc7IiwKKyAgICAgICAgICAgIF0sCisgICAgICAgICkKKworICAgICAgICAjIEZvbyBzaG91bGQgYmUgZ2VuZXJhdGVkIGluIHBsYWNlIGFuZCBleHBvcnRzIHRoZSBGb28gdGFibGUuCisgICAgICAgIGFzc2VydF9maWxlX2FuZF9jb250ZW50cygiZm9vLnRzIiwgImV4cG9ydCBjbGFzcyBGb28geyIpCisKKyAgICAgICAgIyBJbmNsdWRlZCBmaWxlcywgbGlrZSBiYXIsIHNob3VsZCBub3QgYmUgZ2VuZXJhdGVkLgorICAgICAgICBhc3NlcnRfZmlsZV9kb2VzbnRfZXhpc3RzKCJiYXIudHMiKQorCisgICAgZGVmIEJhc2VNdWx0aXBsZUZpbGVzKHNlbGYpOgorICAgICAgICAjIEdlbmVyYXRlIGJvdGggZm9vIGFuZCBiYXIgd2l0aCBubyBleHRyYSBhcmd1bWVudHMKKyAgICAgICAgZmxhdGMoWyItLXRzIiwgImZvby5mYnMiLCAiYmFyL2Jhci5mYnMiXSkKKworICAgICAgICAjIFNob3VsZCBnZW5lcmF0ZSB0aGUgbW9kdWxlIHRoYXQgZXhwb3J0cyBib3RoIGZvbyBhbmQgaXRzIGRpcmVjdAorICAgICAgICAjIGluY2x1ZGUsIGJhci4KKyAgICAgICAgYXNzZXJ0X2ZpbGVfYW5kX2NvbnRlbnRzKAorICAgICAgICAgICAgImZvb19nZW5lcmF0ZWQudHMiLAorICAgICAgICAgICAgWworICAgICAgICAgICAgICAgICJleHBvcnQgeyBCYXIgfSBmcm9tICcuL2Jhci5qcyc7IiwKKyAgICAgICAgICAgICAgICAiZXhwb3J0IHsgRm9vIH0gZnJvbSAnLi9mb28uanMnOyIsCisgICAgICAgICAgICBdLAorICAgICAgICApCisKKyAgICAgICAgIyBGb28gc2hvdWxkIGJlIGdlbmVyYXRlZCBpbiBwbGFjZSBhbmQgZXhwb3J0cyB0aGUgRm9vIHRhYmxlLgorICAgICAgICBhc3NlcnRfZmlsZV9hbmRfY29udGVudHMoImZvby50cyIsICJleHBvcnQgY2xhc3MgRm9vIHsiKQorCisgICAgICAgICMgQmFyIHNob3VsZCBhbHNvIGJlIGdlbmVyYXRkIGluIHBsYWNlIGFuZCBleHBvcnRzIHRoZSBCYXIgdGFibGUuCisgICAgICAgIGFzc2VydF9maWxlX2FuZF9jb250ZW50cygiYmFyLnRzIiwgImV4cG9ydCBjbGFzcyBCYXIgeyIpCisKKyAgICBkZWYgQmFzZVdpdGhOYW1lc3BhY2Uoc2VsZik6CisgICAgICAgICMgR2VuZXJhdGUgZm9vIHdpdGggbmFtZXNwYWNpbmcsIHdpdGggbm8gZXh0cmEgYXJndW1lbnRzCisgICAgICAgIGZsYXRjKFsiLS10cyIsICJmb29fd2l0aF9ucy5mYnMiXSkKKworICAgICAgICAjIFNob3VsZCBnZW5lcmF0ZSB0aGUgbW9kdWxlIHRoYXQgZXhwb3J0cyBib3RoIGZvbyBpbiBpdHMgbmFtZXNwYWNlCisgICAgICAgICMgZGlyZWN0b3J5IGFuZCBpdHMgZGlyZWN0IGluY2x1ZGUsIGJhci4KKyAgICAgICAgYXNzZXJ0X2ZpbGVfYW5kX2NvbnRlbnRzKAorICAgICAgICAgICAgImZvb193aXRoX25zX2dlbmVyYXRlZC50cyIsCisgICAgICAgICAgICBbCisgICAgICAgICAgICAgICAgImV4cG9ydCB7IEJhciB9IGZyb20gJy4vYmFyL2Jhci5qcyc7IiwKKyAgICAgICAgICAgICAgICAiZXhwb3J0IHsgRm9vIH0gZnJvbSAnLi9zb21ldGhpbmcvZm9vLmpzJzsiLAorICAgICAgICAgICAgXSwKKyAgICAgICAgKQorCisgICAgICAgICMgRm9vIHNob3VsZCBiZSBwbGFjZWQgaW4gdGhlIG5hbWVzcGFjZWQgZGlyZWN0b3J5LiBJdCBzaG91bGQgZXhwb3J0CisgICAgICAgICMgRm9vLCBhbmQgdGhlIGltcG9ydCBvZiBCYXIgc2hvdWxkIGJlIHJlbGF0aXZlIHRvIGl0cyBsb2NhdGlvbi4KKyAgICAgICAgYXNzZXJ0X2ZpbGVfYW5kX2NvbnRlbnRzKAorICAgICAgICAgICAgInNvbWV0aGluZy9mb28udHMiLAorICAgICAgICAgICAgWworICAgICAgICAgICAgICAgICJleHBvcnQgY2xhc3MgRm9vIHsiLAorICAgICAgICAgICAgICAgICJpbXBvcnQgeyBCYXIgfSBmcm9tICcuLi9iYXIvYmFyLmpzJzsiLAorICAgICAgICAgICAgXSwKKyAgICAgICAgKQorCisgICAgICAgICMgSW5jbHVkZWQgZmlsZXMsIGxpa2UgYmFyLCBzaG91bGQgbm90IGJlIGdlbmVyYXRlZC4KKyAgICAgICAgYXNzZXJ0X2ZpbGVfZG9lc250X2V4aXN0cygiYmFyLnRzIikKKworICAgIGRlZiBHZW5BbGwoc2VsZik6CisgICAgICAgICMgR2VuZXJhdGUgZm9vIHdpdGggZ2VuZXJhdGUgYWxsIG9wdGlvbnMKKyAgICAgICAgZmxhdGMoWyItLXRzIiwgIi0tZ2VuLWFsbCIsICJmb28uZmJzIl0pCisKKyAgICAgICAgIyBTaG91bGQgZ2VuZXJhdGUgYSBzaW5nbGUgZmlsZSB0aGF0IGV4cG9ydHMgYWxsIHRoZSBnZW5lcmF0ZWQgdHlwZXMuCisgICAgICAgIGFzc2VydF9maWxlX2FuZF9jb250ZW50cygKKyAgICAgICAgICAgICJmb29fZ2VuZXJhdGVkLnRzIiwKKyAgICAgICAgICAgIFsKKyAgICAgICAgICAgICAgICAiZXhwb3J0IHsgQmFyIH0gZnJvbSAnLi9iYXIuanMnIiwKKyAgICAgICAgICAgICAgICAiZXhwb3J0IHsgQmF6IH0gZnJvbSAnLi9iYXouanMnIiwKKyAgICAgICAgICAgICAgICAiZXhwb3J0IHsgRm9vIH0gZnJvbSAnLi9mb28uanMnIiwKKyAgICAgICAgICAgIF0sCisgICAgICAgICkKKworICAgICAgICAjIEZvbyBzaG91bGQgYmUgZ2VuZXJhdGVkIHdpdGggYW4gaW1wb3J0IHRvIEJhciBhbmQgYW4gZXhwb3J0IG9mIGl0c2VsZi4KKyAgICAgICAgYXNzZXJ0X2ZpbGVfYW5kX2NvbnRlbnRzKAorICAgICAgICAgICAgImZvby50cyIsCisgICAgICAgICAgICBbCisgICAgICAgICAgICAgICAgImltcG9ydCB7IEJhciB9IGZyb20gJy4vYmFyLmpzJzsiLAorICAgICAgICAgICAgICAgICJleHBvcnQgY2xhc3MgRm9vIHsiLAorICAgICAgICAgICAgXSwKKyAgICAgICAgKQorCisgICAgICAgICMgQmFyIHNob3VsZCBiZSBnZW5lcmF0ZWQgd2l0aCBhbiBpbXBvcnQgdG8gQmF6IGFuZCBhbiBleHBvcnQgb2YgaXRzZWxmLgorICAgICAgICBhc3NlcnRfZmlsZV9hbmRfY29udGVudHMoCisgICAgICAgICAgICAiYmFyLnRzIiwKKyAgICAgICAgICAgIFsKKyAgICAgICAgICAgICAgICAiaW1wb3J0IHsgQmF6IH0gZnJvbSAnLi9iYXouanMnOyIsCisgICAgICAgICAgICAgICAgImV4cG9ydCBjbGFzcyBCYXIgeyIsCisgICAgICAgICAgICBdLAorICAgICAgICApCisKKyAgICAgICAgIyBCYXogc2hvdWxkIGJlIGdlbmVyYXRlZCB3aXRoIGFuIGV4cG9ydCBvZiBpdHNlbGYuCisgICAgICAgIGFzc2VydF9maWxlX2FuZF9jb250ZW50cygKKyAgICAgICAgICAgICJiYXoudHMiLAorICAgICAgICAgICAgWworICAgICAgICAgICAgICAgICJleHBvcnQgZW51bSBCYXogeyIsCisgICAgICAgICAgICBdLAorICAgICAgICApCisKKworICAgIGRlZiBGbGF0RmlsZXMoc2VsZik6CisgICAgICAgICMgR2VuZXJhdGUganVzdCBmb28gd2l0aCB0aGUgZmxhdCBmaWxlcyBvcHRpb24KKyAgICAgICAgZmxhdGMoWyItLXRzIiwgIi0tdHMtZmxhdC1maWxlcyIsICJmb28uZmJzIl0pCisKKyAgICAgICAgIyBTaG91bGQgZ2VuZXJhdGUgYSBzaW5nbGUgZmlsZSB0aGF0IGltcG9ydHMgYmFyIGFzIGEgc2luZ2xlIGZpbGUsIGFuZAorICAgICAgICAjIGV4cG9ydHMgdGhlIEZvbyB0YWJsZS4KKyAgICAgICAgYXNzZXJ0X2ZpbGVfYW5kX2NvbnRlbnRzKAorICAgICAgICAgICAgImZvb19nZW5lcmF0ZWQudHMiLAorICAgICAgICAgICAgWworICAgICAgICAgICAgICAgICJpbXBvcnQge0JhciBhcyBCYXJ9IGZyb20gJy4vYmFyX2dlbmVyYXRlZC5qcyc7IiwKKyAgICAgICAgICAgICAgICAiZXhwb3J0IGNsYXNzIEZvbyB7IiwKKyAgICAgICAgICAgIF0sCisgICAgICAgICkKKworICAgICAgICAjIFRoZSByb290IHR5cGUgRm9vIHNob3VsZCBub3QgYmUgZ2VuZXJhdGVkIGluIGl0cyBvd24gZmlsZS4KKyAgICAgICAgYXNzZXJ0X2ZpbGVfZG9lc250X2V4aXN0cygiZm9vLnRzIikKKworICAgIGRlZiBGbGF0RmlsZXNXaXRoTmFtZXNwYWNlKHNlbGYpOgorICAgICAgICAjIEdlbmVyYXRlIGp1c3QgZm9vIHdpdGggdGhlIGZsYXQgZmlsZXMgb3B0aW9uCisgICAgICAgIGZsYXRjKFsiLS10cyIsICItLXRzLWZsYXQtZmlsZXMiLCAiZm9vX3dpdGhfbnMuZmJzIl0pCisKKyAgICAgICAgIyBTaG91bGQgZ2VuZXJhdGUgYSBzaW5nbGUgZmlsZSB0aGF0IGltcG9ydHMgYmFyIGFzIGEgc2luZ2xlIGZpbGUsIGFuZAorICAgICAgICAjIGV4cG9ydHMgdGhlIEZvbyB0YWJsZS4KKyAgICAgICAgYXNzZXJ0X2ZpbGVfYW5kX2NvbnRlbnRzKAorICAgICAgICAgICAgImZvb193aXRoX25zX2dlbmVyYXRlZC50cyIsCisgICAgICAgICAgICBbCisgICAgICAgICAgICAgICAgImltcG9ydCB7QmFyIGFzIEJhcn0gZnJvbSAnLi9iYXJfd2l0aF9uc19nZW5lcmF0ZWQuanMnOyIsCisgICAgICAgICAgICAgICAgImV4cG9ydCBjbGFzcyBGb28geyIsCisgICAgICAgICAgICBdLAorICAgICAgICApCisKKyAgICAgICAgIyBUaGUgcm9vdCB0eXBlIEZvbyBzaG91bGQgbm90IGJlIGdlbmVyYXRlZCBpbiBpdHMgb3duIGZpbGUuCisgICAgICAgIGFzc2VydF9maWxlX2RvZXNudF9leGlzdHMoImZvby50cyIpCisKKyAgICBkZWYgRmxhdEZpbGVzTXVsdGlwbGVGaWxlcyhzZWxmKToKKyAgICAgICAgIyBHZW5lcmF0ZSBib3RoIGZvbyBhbmQgYmFyIHdpdGggdGhlIGZsYXQgZmlsZXMgb3B0aW9uCisgICAgICAgIGZsYXRjKFsiLS10cyIsICItLXRzLWZsYXQtZmlsZXMiLCAiZm9vLmZicyIsICJiYXIvYmFyLmZicyJdKQorCisgICAgICAgICMgU2hvdWxkIGdlbmVyYXRlIGEgc2luZ2xlIGZvbyBmaWxlIHRoYXQgaW1wb3J0cyBiYXIgYXMgYSBzaW5nbGUgZmlsZSwKKyAgICAgICAgIyBhbmQgZXhwb3J0cyB0aGUgRm9vIHRhYmxlLgorICAgICAgICBhc3NlcnRfZmlsZV9hbmRfY29udGVudHMoCisgICAgICAgICAgICAiZm9vX2dlbmVyYXRlZC50cyIsCisgICAgICAgICAgICBbCisgICAgICAgICAgICAgICAgImltcG9ydCB7QmFyIGFzIEJhcn0gZnJvbSAnLi9iYXJfZ2VuZXJhdGVkLmpzJzsiLAorICAgICAgICAgICAgICAgICJleHBvcnQgY2xhc3MgRm9vIHsiLAorICAgICAgICAgICAgXSwKKyAgICAgICAgKQorCisgICAgICAgICMgU2hvdWxkIGdlbmVyYXRlIGEgc2luZ2xlIGJhciBmaWxlIHRoYXQgaW1wb3J0cyBiYXIgYXMgYSBzaW5nbGUgZmlsZSwKKyAgICAgICAgIyBhbmQgZXhwb3J0cyB0aGUgQmFyIHRhYmxlLgorICAgICAgICBhc3NlcnRfZmlsZV9hbmRfY29udGVudHMoCisgICAgICAgICAgICAiYmFyX2dlbmVyYXRlZC50cyIsCisgICAgICAgICAgICBbCisgICAgICAgICAgICAgICAgImltcG9ydCB7QmF6IGFzIEJhen0gZnJvbSAnLi9iYXpfZ2VuZXJhdGVkLmpzJzsiLAorICAgICAgICAgICAgICAgICJleHBvcnQgY2xhc3MgQmFyIHsiLAorICAgICAgICAgICAgXSwKKyAgICAgICAgKQorCisgICAgICAgICMgVGhlIHR5cGVzIEZvbyBhbmQgQmFyIHNob3VsZCBub3QgYmUgZ2VuZXJhdGVkIGluIHRoZWlyIG93biBmaWxlcworICAgICAgICBhc3NlcnRfZmlsZV9kb2VzbnRfZXhpc3RzKCJmb28udHMiKQorICAgICAgICBhc3NlcnRfZmlsZV9kb2VzbnRfZXhpc3RzKCJiYXIudHMiKQorCisgICAgZGVmIEZsYXRGaWxlc0dlbkFsbChzZWxmKToKKyAgICAgICAgIyBHZW5lcmF0ZSBmb28gd2l0aCBhbGwgb2YgaXRzIGRlcGVuZGVudHMgd2l0aCB0aGUgZmxhdCBmaWxlcyBvcHRpb24KKyAgICAgICAgZmxhdGMoWyItLXRzIiwgIi0tdHMtZmxhdC1maWxlcyIsICItLWdlbi1hbGwiLCAiZm9vLmZicyJdKQorCisgICAgICAgICMgU2hvdWxkIGdlbmVyYXRlIGEgc2luZ2xlIGZvbyBmaWxlCisgICAgICAgIGFzc2VydF9maWxlX2FuZF9jb250ZW50cygKKyAgICAgICAgICAgICJmb29fZ2VuZXJhdGVkLnRzIiwKKyAgICAgICAgICAgICMgU2hvdWxkIGV4cG9ydCBlYWNoIG9mIHRoZSB0eXBlcyB3aXRoaW4gdGhlIHNpbmdsZSBmaWxlCisgICAgICAgICAgICBbCisgICAgICAgICAgICAgICAgImV4cG9ydCBjbGFzcyBGb28geyIsCisgICAgICAgICAgICAgICAgImV4cG9ydCBjbGFzcyBCYXIgeyIsCisgICAgICAgICAgICAgICAgImV4cG9ydCBlbnVtIEJheiB7IiwKKyAgICAgICAgICAgIF0sCisgICAgICAgICAgICAjIE5vIGluY2x1ZGVzIGZvciB0aGUgZGVwZW5kZW50IHR5cGVzIHNob3VsZCBiZSBwcmVzZW50LgorICAgICAgICAgICAgZG9lc250X2NvbnRhaW49WworICAgICAgICAgICAgICAgICJpbXBvcnQge0JhciBhcyBCYXJ9IiwKKyAgICAgICAgICAgICAgICAiaW1wb3J0IHtCYXogYXMgQmF6fSIsCisgICAgICAgICAgICBdLAorICAgICAgICApCisKKyAgICAgICAgIyBUaGUgdHlwZXMgRm9vLCBCYXIgYW5kIEJheiBzaG91bGQgbm90IGJlIGdlbmVyYXRlZCBpbiB0aGVpciBvd24gZmlsZXMuCisgICAgICAgIGFzc2VydF9maWxlX2RvZXNudF9leGlzdHMoImZvby50cyIpCisgICAgICAgIGFzc2VydF9maWxlX2RvZXNudF9leGlzdHMoImJhci50cyIpCisgICAgICAgIGFzc2VydF9maWxlX2RvZXNudF9leGlzdHMoImJhei50cyIpCisKKworICAgIGRlZiBaRmxhdEZpbGVzR2VuQWxsV2l0aE5hbWVzcGFjaW5nKHNlbGYpOgorICAgICAgICAjIEdlbmVyYXRlIGZvbyB3aXRoIGFsbCBvZiBpdHMgZGVwZW5kZW50cyB3aXRoIHRoZSBmbGF0IGZpbGVzIG9wdGlvbgorICAgICAgICBmbGF0YyhbIi0tdHMiLCAiLS10cy1mbGF0LWZpbGVzIiwgIi0tZ2VuLWFsbCIsICJmb29fd2l0aF9ucy5mYnMiXSkKKworICAgICAgICAjIFNob3VsZCBnZW5lcmF0ZSBhIHNpbmdsZSBmb28gZmlsZQorICAgICAgICBhc3NlcnRfZmlsZV9hbmRfY29udGVudHMoCisgICAgICAgICAgICAiZm9vX3dpdGhfbnNfZ2VuZXJhdGVkLnRzIiwKKyAgICAgICAgICAgICMgU2hvdWxkIGV4cG9ydCBlYWNoIG9mIHRoZSB0eXBlcyB3aXRoaW4gdGhlIHNpbmdsZSBmaWxlCisgICAgICAgICAgICBbCisgICAgICAgICAgICAgICAgImV4cG9ydCBjbGFzcyBiYXJfQmFyIHsiLAorICAgICAgICAgICAgICAgICJleHBvcnQgY2xhc3MgYmFyX0ZvbyB7IiwKKyAgICAgICAgICAgICAgICAiZXhwb3J0IGVudW0gQmF6IHsiLAorICAgICAgICAgICAgICAgICJleHBvcnQgZW51bSBiYXpfQmF6IHsiLAorICAgICAgICAgICAgICAgICJleHBvcnQgY2xhc3Mgc29tZXRoaW5nX0ZvbyB7IgorICAgICAgICAgICAgXSwKKyAgICAgICAgICAgICMgTm8gaW5jbHVkZXMgZm9yIHRoZSBkZXBlbmRlbnQgdHlwZXMgc2hvdWxkIGJlIHByZXNlbnQuCisgICAgICAgICAgICBkb2VzbnRfY29udGFpbj1bCisgICAgICAgICAgICAgICAgImltcG9ydCB7QmFyIGFzIEJhcn0iLAorICAgICAgICAgICAgICAgICJpbXBvcnQge0JheiBhcyBCYXp9IiwKKyAgICAgICAgICAgIF0sCisgICAgICAgICkKKworICAgICAgICAjIFRoZSB0eXBlcyBGb28sIEJhciBhbmQgQmF6IHNob3VsZCBub3QgYmUgZ2VuZXJhdGVkIGluIHRoZWlyIG93biBmaWxlcy4KKyAgICAgICAgYXNzZXJ0X2ZpbGVfZG9lc250X2V4aXN0cygiZm9vLnRzIikKKyAgICAgICAgYXNzZXJ0X2ZpbGVfZG9lc250X2V4aXN0cygiYmFyLnRzIikKKyAgICAgICAgYXNzZXJ0X2ZpbGVfZG9lc250X2V4aXN0cygiYmF6LnRzIikKKwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvZmxhdGMvZm9vLmZicyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL2ZsYXRjL2Zvby5mYnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTJmMjdhYQotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL2ZsYXRjL2Zvby5mYnMKQEAgLTAsMCArMSw5IEBACitpbmNsdWRlICJiYXIvYmFyLmZicyI7CitpbmNsdWRlICJiYXIvYmFyX3dpdGhfbnMuZmJzIjsKKwordGFibGUgRm9vIHsKKyAgYmFyOkJhcjsKKyAgYmFyMjpiYXIuQmFyOworfQorCityb290X3R5cGUgRm9vOwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL2ZsYXRjL2Zvb193aXRoX25zLmZicyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL2ZsYXRjL2Zvb193aXRoX25zLmZicwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMzQ4ZDliCi0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvZmxhdGMvZm9vX3dpdGhfbnMuZmJzCkBAIC0wLDAgKzEsOSBAQAoraW5jbHVkZSAiYmFyL2Jhcl93aXRoX25zLmZicyI7CisKK25hbWVzcGFjZSBzb21ldGhpbmc7CisKK3RhYmxlIEZvbyB7CisgIGJhcjpiYXIuQmFyOworfQorCityb290X3R5cGUgRm9vOwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL2ZsYXRjL21haW4ucHkgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9mbGF0Yy9tYWluLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjFiNmJlZTkKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9mbGF0Yy9tYWluLnB5CkBAIC0wLDAgKzEsMjkgQEAKKyMhL3Vzci9iaW4vZW52IHB5dGhvbjMKKyMKKyMgQ29weXJpZ2h0IDIwMjIgR29vZ2xlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworaW1wb3J0IHN5cworCitmcm9tIGZsYXRjX3Rlc3QgaW1wb3J0IHJ1bl9hbGwKK2Zyb20gZmxhdGNfY3BwX3Rlc3RzIGltcG9ydCBDcHBUZXN0cworZnJvbSBmbGF0Y190c190ZXN0cyBpbXBvcnQgVHNUZXN0cworCitwYXNzaW5nLCBmYWlsaW5nID0gcnVuX2FsbChDcHBUZXN0cywgVHNUZXN0cykKKworcHJpbnQoIiIpCitwcmludCgiezB9IG9mIHsxfSB0ZXN0cyBwYXNzZWQiLmZvcm1hdChwYXNzaW5nLCBwYXNzaW5nICsgZmFpbGluZykpCisKK2lmIGZhaWxpbmcgPiAwOgorICAgIHN5cy5leGl0KDEpCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9mbGV4YnVmZmVyc190ZXN0LmNwcCBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL2ZsZXhidWZmZXJzX3Rlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFiMzRmODUKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9mbGV4YnVmZmVyc190ZXN0LmNwcApAQCAtMCwwICsxLDI5MiBAQAorI2luY2x1ZGUgImZsZXhidWZmZXJzX3Rlc3QuaCIKKworI2luY2x1ZGUgImZsYXRidWZmZXJzL2ZsZXhidWZmZXJzLmgiCisjaW5jbHVkZSAiZmxhdGJ1ZmZlcnMvaWRsLmgiCisjaW5jbHVkZSAiaXNfcXVpZXRfbmFuLmgiCisjaW5jbHVkZSAidGVzdF9hc3NlcnQuaCIKKworbmFtZXNwYWNlIGZsYXRidWZmZXJzIHsKK25hbWVzcGFjZSB0ZXN0cyB7CisKKy8vIFNob3J0Y3V0cyBmb3IgdGhlIGluZmluaXR5Lgorc3RhdGljIGNvbnN0IGF1dG8gaW5maW5pdHlfZCA9IHN0ZDo6bnVtZXJpY19saW1pdHM8ZG91YmxlPjo6aW5maW5pdHkoKTsKKwordm9pZCBGbGV4QnVmZmVyc1Rlc3QoKSB7CisgIGZsZXhidWZmZXJzOjpCdWlsZGVyIHNsYig1MTIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGV4YnVmZmVyczo6QlVJTERFUl9GTEFHX1NIQVJFX0tFWVNfQU5EX1NUUklOR1MpOworCisgIC8vIFdyaXRlIHRoZSBlcXVpdmFsZW50IG9mOgorICAvLyB7IHZlYzogWyAtMTAwLCAiRnJlZCIsIDQuMCwgZmFsc2UgXSwgYmFyOiBbIDEsIDIsIDMgXSwgYmFyMzogWyAxLCAyLCAzIF0sCisgIC8vIGZvbzogMTAwLCBib29sOiB0cnVlLCBteW1hcDogeyBmb286ICJGcmVkIiB9IH0KKworICAvLyBJdCdzIHBvc3NpYmxlIHRvIGRvIHRoaXMgd2l0aG91dCBzdGQ6OmZ1bmN0aW9uIHN1cHBvcnQgYXMgd2VsbC4KKyAgc2xiLk1hcChbJl0oKSB7CisgICAgc2xiLlZlY3RvcigidmVjIiwgWyZdKCkgeworICAgICAgc2xiICs9IC0xMDA7ICAvLyBFcXVpdmFsZW50IHRvIHNsYi5BZGQoLTEwMCkgb3Igc2xiLkludCgtMTAwKTsKKyAgICAgIHNsYiArPSAiRnJlZCI7CisgICAgICBzbGIuSW5kaXJlY3RGbG9hdCg0LjBmKTsKKyAgICAgIGF1dG8gaV9mID0gc2xiLkxhc3RWYWx1ZSgpOworICAgICAgdWludDhfdCBibG9iW10gPSB7IDc3IH07CisgICAgICBzbGIuQmxvYihibG9iLCAxKTsKKyAgICAgIHNsYiArPSBmYWxzZTsKKyAgICAgIHNsYi5SZXVzZVZhbHVlKGlfZik7CisgICAgfSk7CisgICAgaW50IGludHNbXSA9IHsgMSwgMiwgMyB9OworICAgIHNsYi5WZWN0b3IoImJhciIsIGludHMsIDMpOworICAgIHNsYi5GaXhlZFR5cGVkVmVjdG9yKCJiYXIzIiwgaW50cywgMyk7CisgICAgYm9vbCBib29sc1tdID0geyB0cnVlLCBmYWxzZSwgdHJ1ZSwgZmFsc2UgfTsKKyAgICBzbGIuVmVjdG9yKCJib29scyIsIGJvb2xzLCA0KTsKKyAgICBzbGIuQm9vbCgiYm9vbCIsIHRydWUpOworICAgIHNsYi5Eb3VibGUoImZvbyIsIDEwMCk7CisgICAgc2xiLk1hcCgibXltYXAiLCBbJl0oKSB7CisgICAgICBzbGIuU3RyaW5nKCJmb28iLCAiRnJlZCIpOyAgLy8gVGVzdGluZyBrZXkgYW5kIHN0cmluZyByZXVzZS4KKyAgICB9KTsKKyAgfSk7CisgIHNsYi5GaW5pc2goKTsKKworICAvLyBjbGFuZy1mb3JtYXQgb2ZmCisgICNpZmRlZiBGTEFUQlVGRkVSU19URVNUX1ZFUkJPU0UKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNsYi5HZXRCdWZmZXIoKS5zaXplKCk7IGkrKykKKyAgICAgIHByaW50ZigiJWQgIiwgc2xiLkdldEJ1ZmZlcigpLmRhdGEoKVtpXSk7CisgICAgcHJpbnRmKCJcbiIpOworICAjZW5kaWYKKyAgLy8gY2xhbmctZm9ybWF0IG9uCisKKyAgc3RkOjp2ZWN0b3I8dWludDhfdD4gcmV1c2VfdHJhY2tlcjsKKyAgVEVTVF9FUShmbGV4YnVmZmVyczo6VmVyaWZ5QnVmZmVyKHNsYi5HZXRCdWZmZXIoKS5kYXRhKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbGIuR2V0QnVmZmVyKCkuc2l6ZSgpLCAmcmV1c2VfdHJhY2tlciksCisgICAgICAgICAgdHJ1ZSk7CisKKyAgYXV0byBtYXAgPSBmbGV4YnVmZmVyczo6R2V0Um9vdChzbGIuR2V0QnVmZmVyKCkpLkFzTWFwKCk7CisgIFRFU1RfRVEobWFwLnNpemUoKSwgNyk7CisgIGF1dG8gdmVjID0gbWFwWyJ2ZWMiXS5Bc1ZlY3RvcigpOworICBURVNUX0VRKHZlYy5zaXplKCksIDYpOworICBURVNUX0VRKHZlY1swXS5Bc0ludDY0KCksIC0xMDApOworICBURVNUX0VRX1NUUih2ZWNbMV0uQXNTdHJpbmcoKS5jX3N0cigpLCAiRnJlZCIpOworICBURVNUX0VRKHZlY1sxXS5Bc0ludDY0KCksIDApOyAgLy8gTnVtYmVyIHBhcnNpbmcgZmFpbGVkLgorICBURVNUX0VRKHZlY1syXS5Bc0RvdWJsZSgpLCA0LjApOworICBURVNUX0VRKHZlY1syXS5Bc1N0cmluZygpLklzVGhlRW1wdHlTdHJpbmcoKSwgdHJ1ZSk7ICAvLyBXcm9uZyBUeXBlLgorICBURVNUX0VRX1NUUih2ZWNbMl0uQXNTdHJpbmcoKS5jX3N0cigpLCAiIik7ICAgICAvLyBUaGlzIHN0aWxsIHdvcmtzIHRob3VnaC4KKyAgVEVTVF9FUV9TVFIodmVjWzJdLlRvU3RyaW5nKCkuY19zdHIoKSwgIjQuMCIpOyAgLy8gT3IgaGF2ZSBpdCBjb252ZXJ0ZWQuCisgIC8vIEZldyB0ZXN0cyBmb3IgdGVtcGxhdGVkIHZlcnNpb24gb2YgQXMuCisgIFRFU1RfRVEodmVjWzBdLkFzPGludDY0X3Q+KCksIC0xMDApOworICBURVNUX0VRX1NUUih2ZWNbMV0uQXM8c3RkOjpzdHJpbmc+KCkuY19zdHIoKSwgIkZyZWQiKTsKKyAgVEVTVF9FUSh2ZWNbMV0uQXM8aW50NjRfdD4oKSwgMCk7ICAvLyBOdW1iZXIgcGFyc2luZyBmYWlsZWQuCisgIFRFU1RfRVEodmVjWzJdLkFzPGRvdWJsZT4oKSwgNC4wKTsKKyAgLy8gVGVzdCB0aGF0IHRoZSBibG9iIGNhbiBiZSBhY2Nlc3NlZC4KKyAgVEVTVF9FUSh2ZWNbM10uSXNCbG9iKCksIHRydWUpOworICBhdXRvIGJsb2IgPSB2ZWNbM10uQXNCbG9iKCk7CisgIFRFU1RfRVEoYmxvYi5zaXplKCksIDEpOworICBURVNUX0VRKGJsb2IuZGF0YSgpWzBdLCA3Nyk7CisgIFRFU1RfRVEodmVjWzRdLklzQm9vbCgpLCB0cnVlKTsgICAvLyBDaGVjayBpZiB0eXBlIGlzIGEgYm9vbAorICBURVNUX0VRKHZlY1s0XS5Bc0Jvb2woKSwgZmFsc2UpOyAgLy8gQ2hlY2sgaWYgdmFsdWUgaXMgZmFsc2UKKyAgVEVTVF9FUSh2ZWNbNV0uQXNEb3VibGUoKSwgNC4wKTsgIC8vIFRoaXMgaXMgc2hhcmVkIHdpdGggdmVjWzJdICEKKyAgYXV0byB0dmVjID0gbWFwWyJiYXIiXS5Bc1R5cGVkVmVjdG9yKCk7CisgIFRFU1RfRVEodHZlYy5zaXplKCksIDMpOworICBURVNUX0VRKHR2ZWNbMl0uQXNJbnQ4KCksIDMpOworICBhdXRvIHR2ZWMzID0gbWFwWyJiYXIzIl0uQXNGaXhlZFR5cGVkVmVjdG9yKCk7CisgIFRFU1RfRVEodHZlYzMuc2l6ZSgpLCAzKTsKKyAgVEVTVF9FUSh0dmVjM1syXS5Bc0ludDgoKSwgMyk7CisgIFRFU1RfRVEobWFwWyJib29sIl0uQXNCb29sKCksIHRydWUpOworICBhdXRvIHR2ZWNiID0gbWFwWyJib29scyJdLkFzVHlwZWRWZWN0b3IoKTsKKyAgVEVTVF9FUSh0dmVjYi5FbGVtZW50VHlwZSgpLCBmbGV4YnVmZmVyczo6RkJUX0JPT0wpOworICBURVNUX0VRKG1hcFsiZm9vIl0uQXNVSW50OCgpLCAxMDApOworICBURVNUX0VRKG1hcFsidW5rbm93biJdLklzTnVsbCgpLCB0cnVlKTsKKyAgYXV0byBteW1hcCA9IG1hcFsibXltYXAiXS5Bc01hcCgpOworICAvLyBUaGVzZSBzaG91bGQgYmUgZXF1YWwgYnkgcG9pbnRlciBlcXVhbGl0eSwgc2luY2Uga2V5IGFuZCB2YWx1ZSBhcmUgc2hhcmVkLgorICBURVNUX0VRKG15bWFwLktleXMoKVswXS5Bc0tleSgpLCBtYXAuS2V5cygpWzRdLkFzS2V5KCkpOworICBURVNUX0VRKG15bWFwLlZhbHVlcygpWzBdLkFzU3RyaW5nKCkuY19zdHIoKSwgdmVjWzFdLkFzU3RyaW5nKCkuY19zdHIoKSk7CisgIC8vIFdlIGNhbiBtdXRhdGUgdmFsdWVzIGluIHRoZSBidWZmZXIuCisgIFRFU1RfRVEodmVjWzBdLk11dGF0ZUludCgtOTkpLCB0cnVlKTsKKyAgVEVTVF9FUSh2ZWNbMF0uQXNJbnQ2NCgpLCAtOTkpOworICBURVNUX0VRKHZlY1sxXS5NdXRhdGVTdHJpbmcoIkpvaG4iKSwgdHJ1ZSk7ICAvLyBTaXplIG11c3QgbWF0Y2guCisgIFRFU1RfRVFfU1RSKHZlY1sxXS5Bc1N0cmluZygpLmNfc3RyKCksICJKb2huIik7CisgIFRFU1RfRVEodmVjWzFdLk11dGF0ZVN0cmluZygiQWxmcmVkIiksIGZhbHNlKTsgIC8vIFRvbyBsb25nLgorICBURVNUX0VRKHZlY1syXS5NdXRhdGVGbG9hdCgyLjBmKSwgdHJ1ZSk7CisgIFRFU1RfRVEodmVjWzJdLkFzRmxvYXQoKSwgMi4wZik7CisgIFRFU1RfRVEodmVjWzJdLk11dGF0ZUZsb2F0KDMuMTQxNTkpLCBmYWxzZSk7ICAvLyBEb3VibGUgZG9lcyBub3QgZml0IGluIGZsb2F0LgorICBURVNUX0VRKHZlY1s0XS5Bc0Jvb2woKSwgZmFsc2UpOyAgICAgICAgICAgICAgLy8gSXMgZmFsc2UgYmVmb3JlIGNoYW5nZQorICBURVNUX0VRKHZlY1s0XS5NdXRhdGVCb29sKHRydWUpLCB0cnVlKTsgICAgICAgLy8gQ2FuIGNoYW5nZSBhIGJvb2wKKyAgVEVTVF9FUSh2ZWNbNF0uQXNCb29sKCksIHRydWUpOyAgICAgICAgICAgICAgIC8vIENoYW5nZWQgYm9vbCBpcyBub3cgdHJ1ZQorCisgIC8vIFBhcnNlIGZyb20gSlNPTjoKKyAgZmxhdGJ1ZmZlcnM6OlBhcnNlciBwYXJzZXI7CisgIHNsYi5DbGVhcigpOworICBhdXRvIGpzb250ZXN0ID0gInsgYTogWyAxMjMsIDQ1Ni4wIF0sIGI6IFwiaGVsbG9cIiwgYzogdHJ1ZSwgZDogZmFsc2UgfSI7CisgIFRFU1RfRVEocGFyc2VyLlBhcnNlRmxleEJ1ZmZlcihqc29udGVzdCwgbnVsbHB0ciwgJnNsYiksIHRydWUpOworICBURVNUX0VRKGZsZXhidWZmZXJzOjpWZXJpZnlCdWZmZXIoc2xiLkdldEJ1ZmZlcigpLmRhdGEoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNsYi5HZXRCdWZmZXIoKS5zaXplKCksICZyZXVzZV90cmFja2VyKSwKKyAgICAgICAgICB0cnVlKTsKKyAgYXV0byBqcm9vdCA9IGZsZXhidWZmZXJzOjpHZXRSb290KHNsYi5HZXRCdWZmZXIoKSk7CisgIGF1dG8gam1hcCA9IGpyb290LkFzTWFwKCk7CisgIGF1dG8ganZlYyA9IGptYXBbImEiXS5Bc1ZlY3RvcigpOworICBURVNUX0VRKGp2ZWNbMF0uQXNJbnQ2NCgpLCAxMjMpOworICBURVNUX0VRKGp2ZWNbMV0uQXNEb3VibGUoKSwgNDU2LjApOworICBURVNUX0VRX1NUUihqbWFwWyJiIl0uQXNTdHJpbmcoKS5jX3N0cigpLCAiaGVsbG8iKTsKKyAgVEVTVF9FUShqbWFwWyJjIl0uSXNCb29sKCksIHRydWUpOyAgIC8vIFBhcnNlZCBjb3JyZWN0bHkgdG8gYSBib29sCisgIFRFU1RfRVEoam1hcFsiYyJdLkFzQm9vbCgpLCB0cnVlKTsgICAvLyBQYXJzZWQgY29ycmVjdGx5IHRvIHRydWUKKyAgVEVTVF9FUShqbWFwWyJkIl0uSXNCb29sKCksIHRydWUpOyAgIC8vIFBhcnNlZCBjb3JyZWN0bHkgdG8gYSBib29sCisgIFRFU1RfRVEoam1hcFsiZCJdLkFzQm9vbCgpLCBmYWxzZSk7ICAvLyBQYXJzZWQgY29ycmVjdGx5IHRvIGZhbHNlCisgIC8vIEFuZCBmcm9tIEZsZXhCdWZmZXIgYmFjayB0byBKU09OOgorICBhdXRvIGpzb25iYWNrID0ganJvb3QuVG9TdHJpbmcoKTsKKyAgVEVTVF9FUV9TVFIoanNvbnRlc3QsIGpzb25iYWNrLmNfc3RyKCkpOworCisgIHNsYi5DbGVhcigpOworICBzbGIuVmVjdG9yKFsmXSgpIHsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IDEzMDsgKytpKSBzbGIuQWRkKHN0YXRpY19jYXN0PHVpbnQ4X3Q+KDI1NSkpOworICAgIHNsYi5WZWN0b3IoWyZdKCkgeworICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAxMzA7ICsraSkgc2xiLkFkZChzdGF0aWNfY2FzdDx1aW50OF90PigyNTUpKTsKKyAgICAgIHNsYi5WZWN0b3IoW10ge30pOworICAgIH0pOworICB9KTsKKyAgc2xiLkZpbmlzaCgpOworICBURVNUX0VRKHNsYi5HZXRTaXplKCksIDY2NCk7Cit9CisKK3ZvaWQgRmxleEJ1ZmZlcnNSZXVzZUJ1Z1Rlc3QoKSB7CisgIGZsZXhidWZmZXJzOjpCdWlsZGVyIHNsYjsKKyAgc2xiLk1hcChbJl0oKSB7CisgICAgc2xiLlZlY3RvcigidmVjIiwgWyZdKCkge30pOworICAgIHNsYi5Cb29sKCJib29sIiwgdHJ1ZSk7CisgIH0pOworICBzbGIuRmluaXNoKCk7CisgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHJldXNlX3RyYWNrZXI7CisgIC8vIFRoaXMgd291bGQgZmFpbCBiZWZvcmUsIHNpbmNlIHRoZSByZXVzZV90cmFja2VyIHdvdWxkIHVzZSB0aGUgYWRkcmVzcyBvZgorICAvLyB0aGUgdmVjdG9yIHJlZmVyZW5jZSB0byBjaGVjayBmb3IgcmV1c2UsIGJ1dCBpbiB0aGlzIGNhc2Ugd2UgaGF2ZSBhbiBlbXB0eQorICAvLyB2ZWN0b3IsIGFuZCBzaW5jZSB0aGUgc2l6ZSBmaWVsZCBpcyBiZWZvcmUgdGhlIHBvaW50ZXIsIGl0cyBhZGRyZXNzIGlzIHRoZQorICAvLyBzYW1lIGFzIHRoaW5nIGFmdGVyIGl0LCB0aGUga2V5ICJib29sIi4KKyAgLy8gV2UgZml4IHRoaXMgYnkgdXNpbmcgdGhlIGFkZHJlc3Mgb2YgdGhlIHNpemUgZmllbGQgZm9yIHRyYWNraW5nIHJldXNlLgorICBURVNUX0VRKGZsZXhidWZmZXJzOjpWZXJpZnlCdWZmZXIoc2xiLkdldEJ1ZmZlcigpLmRhdGEoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNsYi5HZXRCdWZmZXIoKS5zaXplKCksICZyZXVzZV90cmFja2VyKSwKKyAgICAgICAgICB0cnVlKTsKK30KKwordm9pZCBGbGV4QnVmZmVyc0Zsb2F0aW5nUG9pbnRUZXN0KCkgeworI2lmIGRlZmluZWQoRkxBVEJVRkZFUlNfSEFTX05FV19TVFJUT0QpICYmIChGTEFUQlVGRkVSU19IQVNfTkVXX1NUUlRPRCA+IDApCisgIGZsZXhidWZmZXJzOjpCdWlsZGVyIHNsYig1MTIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGV4YnVmZmVyczo6QlVJTERFUl9GTEFHX1NIQVJFX0tFWVNfQU5EX1NUUklOR1MpOworICAvLyBQYXJzZSBmbG9hdGluZy1wb2ludCB2YWx1ZXMgZnJvbSBKU09OOgorICBmbGF0YnVmZmVyczo6UGFyc2VyIHBhcnNlcjsKKyAgc2xiLkNsZWFyKCk7CisgIGF1dG8ganNvbnRlc3QgPQorICAgICAgInsgYTogWzEuMCwgbmFuLCBpbmYsIGluZmluaXR5LCAtaW5mLCAraW5mLCAtaW5maW5pdHksIDguMF0gfSI7CisgIFRFU1RfRVEocGFyc2VyLlBhcnNlRmxleEJ1ZmZlcihqc29udGVzdCwgbnVsbHB0ciwgJnNsYiksIHRydWUpOworICBhdXRvIGpyb290ID0gZmxleGJ1ZmZlcnM6OkdldFJvb3Qoc2xiLkdldEJ1ZmZlcigpKTsKKyAgVEVTVF9FUShmbGV4YnVmZmVyczo6VmVyaWZ5QnVmZmVyKHNsYi5HZXRCdWZmZXIoKS5kYXRhKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbGIuR2V0QnVmZmVyKCkuc2l6ZSgpLCBudWxscHRyKSwKKyAgICAgICAgICB0cnVlKTsKKyAgYXV0byBqbWFwID0ganJvb3QuQXNNYXAoKTsKKyAgYXV0byBqdmVjID0gam1hcFsiYSJdLkFzVmVjdG9yKCk7CisgIFRFU1RfRVEoOCwganZlYy5zaXplKCkpOworICBURVNUX0VRKDEuMCwganZlY1swXS5Bc0RvdWJsZSgpKTsKKyAgVEVTVF9BU1NFUlQoaXNfcXVpZXRfbmFuKGp2ZWNbMV0uQXNEb3VibGUoKSkpOworICBURVNUX0VRKGluZmluaXR5X2QsIGp2ZWNbMl0uQXNEb3VibGUoKSk7CisgIFRFU1RfRVEoaW5maW5pdHlfZCwganZlY1szXS5Bc0RvdWJsZSgpKTsKKyAgVEVTVF9FUSgtaW5maW5pdHlfZCwganZlY1s0XS5Bc0RvdWJsZSgpKTsKKyAgVEVTVF9FUSgraW5maW5pdHlfZCwganZlY1s1XS5Bc0RvdWJsZSgpKTsKKyAgVEVTVF9FUSgtaW5maW5pdHlfZCwganZlY1s2XS5Bc0RvdWJsZSgpKTsKKyAgVEVTVF9FUSg4LjAsIGp2ZWNbN10uQXNEb3VibGUoKSk7CisjZW5kaWYKK30KKwordm9pZCBGbGV4QnVmZmVyc0RlcHJlY2F0ZWRUZXN0KCkgeworICAvLyBGbGV4QnVmZmVycyBhcyBvcmlnaW5hbGx5IGRlc2lnbmVkIGhhZCBhIGZsYXcgaW52b2x2aW5nIHRoZQorICAvLyBGQlRfVkVDVE9SX1NUUklORyBkYXRhdHlwZSwgYW5kIHRoaXMgdGVzdCBkb2N1bWVudHMvdGVzdHMgdGhlIGZpeCBmb3IgaXQuCisgIC8vIERpc2N1c3Npb246IGh0dHBzOi8vZ2l0aHViLmNvbS9nb29nbGUvZmxhdGJ1ZmZlcnMvaXNzdWVzLzU2MjcKKyAgZmxleGJ1ZmZlcnM6OkJ1aWxkZXIgc2xiOworICAvLyBGQlRfVkVDVE9SXyogYXJlICJ0eXBlZCB2ZWN0b3JzIiB3aGVyZSBhbGwgZWxlbWVudHMgYXJlIG9mIHRoZSBzYW1lIHR5cGUuCisgIC8vIFByb2JsZW0gaXMsIHdoZW4gc3RvcmluZyBGQlRfU1RSSU5HIGVsZW1lbnRzLCBpdCByZWxpZXMgb24gdGhhdCB0eXBlIHRvCisgIC8vIGdldCB0aGUgYml0LXdpZHRoIGZvciB0aGUgc2l6ZSBmaWVsZCBvZiB0aGUgc3RyaW5nLCB3aGljaCBpbiB0aGlzIGNhc2UKKyAgLy8gaXNuJ3QgcHJlc2VudCwgYW5kIGluc3RlYWQgZGVmYXVsdHMgdG8gOC1iaXQuIFRoaXMgbWVhbnMgdGhhdCBhbnkgc3RyaW5ncworICAvLyBzdG9yZWQgaW5zaWRlIHN1Y2ggYSB2ZWN0b3IsIHdoZW4gYWNjZXNzZWQgdGhydSB0aGUgb2xkIEFQSSB0aGF0IHJldHVybnMKKyAgLy8gYSBTdHJpbmcgcmVmZXJlbmNlLCB3aWxsIGFwcGVhciB0byBiZSB0cnVuY2F0ZWQgaWYgdGhlIHN0cmluZyBzdG9yZWQgaXMKKyAgLy8gYWN0dWFsbHkgPj0yNTYgYnl0ZXMuCisgIHN0ZDo6c3RyaW5nIHRlc3RfZGF0YSgzMDAsICdBJyk7CisgIGF1dG8gc3RhcnQgPSBzbGIuU3RhcnRWZWN0b3IoKTsKKyAgLy8gVGhpcyBvbmUgd2lsbCBoYXZlIGEgMTYtYml0IHNpemUgZmllbGQuCisgIHNsYi5TdHJpbmcodGVzdF9kYXRhKTsKKyAgLy8gVGhpcyBvbmUgd2lsbCBoYXZlIGFuIDgtYml0IHNpemUgZmllbGQuCisgIHNsYi5TdHJpbmcoImhlbGxvIik7CisgIC8vIFdlJ3JlIGFza2luZyB0aGlzIHRvIGJlIHNlcmlhbGl6ZWQgYXMgYSB0eXBlZCB2ZWN0b3IgKHRydWUpLCBidXQgbm90CisgIC8vIGZpeGVkIHNpemUgKGZhbHNlKS4gVGhlIHR5cGUgd2lsbCBiZSBGQlRfVkVDVE9SX1NUUklORyB3aXRoIGEgYml0LXdpZHRoCisgIC8vIG9mIHdoYXRldmVyIHRoZSBvZmZzZXRzIGluIHRoZSB2ZWN0b3IgbmVlZCwgdGhlIGJpdC13aWR0aHMgb2YgdGhlIHN0cmluZ3MKKyAgLy8gYXJlIG5vdCBzdG9yZWQoISkgPC0gdGhlIGFjdHVhbCBkZXNpZ24gZmxhdy4KKyAgLy8gTm90ZSB0aGF0IGV2ZW4gaW4gdGhlIGZpeGVkIGNvZGUsIHdlIGNvbnRpbnVlIHRvIHNlcmlhbGl6ZSB0aGUgZWxlbWVudHMgb2YKKyAgLy8gRkJUX1ZFQ1RPUl9TVFJJTkcgYXMgRkJUX1NUUklORywgc2luY2UgdGhlcmUgbWF5IGJlIG9sZCBjb2RlIG91dCB0aGVyZQorICAvLyByZWFkaW5nIG5ldyBkYXRhIHRoYXQgd2Ugd2FudCB0byBjb250aW51ZSB0byBmdW5jdGlvbi4KKyAgLy8gVGh1cywgRkJUX1ZFQ1RPUl9TVFJJTkcsIHdoaWxlIGRlcHJlY2F0ZWQsIHdpbGwgYWx3YXlzIGJlIHJlcHJlc2VudGVkIHRoZQorICAvLyBzYW1lIHdheSwgdGhlIGZpeCBsaWVzIG9uIHRoZSByZWFkaW5nIHNpZGUuCisgIHNsYi5FbmRWZWN0b3Ioc3RhcnQsIHRydWUsIGZhbHNlKTsKKyAgc2xiLkZpbmlzaCgpOworICAvLyBWZXJpZnkgYmVjYXVzZSB3aHkgbm90LgorICBURVNUX0VRKGZsZXhidWZmZXJzOjpWZXJpZnlCdWZmZXIoc2xiLkdldEJ1ZmZlcigpLmRhdGEoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNsYi5HZXRCdWZmZXIoKS5zaXplKCksIG51bGxwdHIpLAorICAgICAgICAgIHRydWUpOworICAvLyBTbyBub3cgbGV0cyByZWFkIHRoaXMgZGF0YSBiYWNrLgorICAvLyBGb3IgZXhpc3RpbmcgZGF0YSwgc2luY2Ugd2UgaGF2ZSBubyB3YXkgb2Yga25vd2luZyB3aGF0IHRoZSBhY3R1YWwKKyAgLy8gYml0LXdpZHRoIG9mIHRoZSBzaXplIGZpZWxkIG9mIHRoZSBzdHJpbmcgaXMsIHdlIGFyZSBnb2luZyB0byBpZ25vcmUgdGhpcworICAvLyBmaWVsZCwgYW5kIGluc3RlYWQgdHJlYXQgdGhlc2Ugc3RyaW5ncyBhcyBGQlRfS0VZIChudWxsLXRlcm1pbmF0ZWQpLCBzbyB3ZQorICAvLyBjYW4gZGVhbCB3aXRoIHN0cmluZ3Mgb2YgYXJiaXRyYXJ5IGxlbmd0aC4gVGhpcyBvZiBjb3Vyc2UgdHJ1bmNhdGVzIHN0cmluZ3MKKyAgLy8gd2l0aCBlbWJlZGRlZCBudWxscywgYnV0IHdlIHRoaW5rIHRoYXQgdGhhdCBpcyBwcmVmZXJyYWJsZSBvdmVyIHRydW5jYXRpbmcKKyAgLy8gc3RyaW5ncyA+PSAyNTYgYnl0ZXMuCisgIGF1dG8gdmVjID0gZmxleGJ1ZmZlcnM6OkdldFJvb3Qoc2xiLkdldEJ1ZmZlcigpKS5Bc1R5cGVkVmVjdG9yKCk7CisgIC8vIEV2ZW4gdGhvdWdoIHRoaXMgd2FzIHNlcmlhbGl6ZWQgYXMgRkJUX1ZFQ1RPUl9TVFJJTkcsIGl0IGlzIHJlYWQgYXMKKyAgLy8gRkJUX1ZFQ1RPUl9LRVk6CisgIFRFU1RfRVEodmVjLkVsZW1lbnRUeXBlKCksIGZsZXhidWZmZXJzOjpGQlRfS0VZKTsKKyAgLy8gQWNjZXNzIHRoZSBsb25nIHN0cmluZy4gUHJldmlvdXNseSwgdGhpcyB3b3VsZCByZXR1cm4gYSBzdHJpbmcgb2Ygc2l6ZSAxLAorICAvLyBzaW5jZSBpdCB3b3VsZCByZWFkIHRoZSBoaWdoLWJ5dGUgb2YgdGhlIDE2LWJpdCBsZW5ndGguCisgIC8vIFRoaXMgc2hvdWxkIG5vdyBjb3JyZWN0bHkgdGVzdCB0aGUgZnVsbCAzMDAgYnl0ZXMsIHVzaW5nIEFzS2V5KCk6CisgIFRFU1RfRVFfU1RSKHZlY1swXS5Bc0tleSgpLCB0ZXN0X2RhdGEuY19zdHIoKSk7CisgIC8vIE9sZCBjb2RlIHRoYXQgY2FsbGVkIEFzU3RyaW5nIHdpbGwgY29udGludWUgdG8gd29yaywgYXMgdGhlIFN0cmluZworICAvLyBhY2Nlc3NvciBvYmplY3RzIG5vdyB1c2UgYSBjYWNoZWQgc2l6ZSB0aGF0IGNhbiBjb21lIGZyb20gYSBrZXkgYXMgd2VsbC4KKyAgVEVTVF9FUV9TVFIodmVjWzBdLkFzU3RyaW5nKCkuY19zdHIoKSwgdGVzdF9kYXRhLmNfc3RyKCkpOworICAvLyBTaG9ydCBzdHJpbmdzIHdvcmsgYXMgYmVmb3JlOgorICBURVNUX0VRX1NUUih2ZWNbMV0uQXNLZXkoKSwgImhlbGxvIik7CisgIFRFU1RfRVFfU1RSKHZlY1sxXS5Bc1N0cmluZygpLmNfc3RyKCksICJoZWxsbyIpOworICAvLyBTbywgd2hpbGUgZXhpc3RpbmcgY29kZSBhbmQgZGF0YSBtb3N0bHkgImp1c3Qgd29yayIgd2l0aCB0aGUgZml4ZXMgYXBwbGllZAorICAvLyB0byBBc1R5cGVkVmVjdG9yIGFuZCBBc1N0cmluZywgd2hhdCBkbyB5b3UgZG8gZ29pbmcgZm9yd2FyZD8KKyAgLy8gQ29kZSBhY2Nlc3NpbmcgZXhpc3RpbmcgZGF0YSBkb2Vzbid0IG5lY2Vzc2FyaWx5IG5lZWQgdG8gY2hhbmdlLCB0aG91Z2gKKyAgLy8geW91IGNvdWxkIGNvbnNpZGVyIHVzaW5nIEFzS2V5IGluc3RlYWQgb2YgQXNTdHJpbmcgZm9yIGEpIGRvY3VtZW50aW5nCisgIC8vIHRoYXQgeW91IGFyZSBhY2Nlc3Npbmcga2V5cywgb3IgYikgYSBzcGVlZHVwIGlmIHlvdSBkb24ndCBhY3R1YWxseSB1c2UKKyAgLy8gdGhlIHN0cmluZyBzaXplLgorICAvLyBGb3IgbmV3IGRhdGEsIG9yIGRhdGEgdGhhdCBkb2Vzbid0IG5lZWQgdG8gYmUgYmFja3dhcmRzIGNvbXBhdGlibGUsCisgIC8vIGluc3RlYWQgc2VyaWFsaXplIGFzIEZCVF9WRUNUT1IgKGNhbGwgRW5kVmVjdG9yIHdpdGggdHlwZWQgPSBmYWxzZSwgdGhlbgorICAvLyByZWFkIGVsZW1lbnRzIHdpdGggQXNTdHJpbmcpLCBvciwgZm9yIG1heGltdW0gY29tcGFjdG5lc3MsIHVzZQorICAvLyBGQlRfVkVDVE9SX0tFWSAoY2FsbCBzbGIuS2V5IGFib3ZlIGluc3RlYWQsIHJlYWQgd2l0aCBBc0tleSBvciBBc1N0cmluZykuCit9CisKK3ZvaWQgUGFyc2VGbGV4YnVmZmVyc0Zyb21Kc29uV2l0aE51bGxUZXN0KCkgeworICAvLyBUZXN0IG51bGxzIGFyZSBoYW5kbGVkIGFwcHJvcHJpYXRlbHkgdGhyb3VnaCBmbGV4YnVmZmVycyB0byBleGVyY2lzZSBvdGhlcgorICAvLyBjb2RlIHBhdGhzIG9mIFBhcnNlU2luZ2xlVmFsdWUgaW4gdGhlIG9wdGlvbmFsIHNjYWxhcnMgY2hhbmdlLgorICAvLyBUT0RPKGNuZW8pOiBKc29uIC0+IEZsYXRidWZmZXJzIHRlc3Qgb25jZSBzb21lIGxhbmd1YWdlIGNhbiBnZW5lcmF0ZSBjb2RlCisgIC8vIHdpdGggb3B0aW9uYWwgc2NhbGFycy4KKyAgeworICAgIGNoYXIganNvbltdID0gIntcIm9wdF9maWVsZFwiOiAxMjMgfSI7CisgICAgZmxhdGJ1ZmZlcnM6OlBhcnNlciBwYXJzZXI7CisgICAgZmxleGJ1ZmZlcnM6OkJ1aWxkZXIgZmxleGJ1aWxkOworICAgIHBhcnNlci5QYXJzZUZsZXhCdWZmZXIoanNvbiwgbnVsbHB0ciwgJmZsZXhidWlsZCk7CisgICAgYXV0byByb290ID0gZmxleGJ1ZmZlcnM6OkdldFJvb3QoZmxleGJ1aWxkLkdldEJ1ZmZlcigpKTsKKyAgICBURVNUX0VRKHJvb3QuQXNNYXAoKVsib3B0X2ZpZWxkIl0uQXNJbnQ2NCgpLCAxMjMpOworICB9CisgIHsKKyAgICBjaGFyIGpzb25bXSA9ICJ7XCJvcHRfZmllbGRcIjogMTIzLjQgfSI7CisgICAgZmxhdGJ1ZmZlcnM6OlBhcnNlciBwYXJzZXI7CisgICAgZmxleGJ1ZmZlcnM6OkJ1aWxkZXIgZmxleGJ1aWxkOworICAgIHBhcnNlci5QYXJzZUZsZXhCdWZmZXIoanNvbiwgbnVsbHB0ciwgJmZsZXhidWlsZCk7CisgICAgYXV0byByb290ID0gZmxleGJ1ZmZlcnM6OkdldFJvb3QoZmxleGJ1aWxkLkdldEJ1ZmZlcigpKTsKKyAgICBURVNUX0VRKHJvb3QuQXNNYXAoKVsib3B0X2ZpZWxkIl0uQXNEb3VibGUoKSwgMTIzLjQpOworICB9CisgIHsKKyAgICBjaGFyIGpzb25bXSA9ICJ7XCJvcHRfZmllbGRcIjogbnVsbCB9IjsKKyAgICBmbGF0YnVmZmVyczo6UGFyc2VyIHBhcnNlcjsKKyAgICBmbGV4YnVmZmVyczo6QnVpbGRlciBmbGV4YnVpbGQ7CisgICAgcGFyc2VyLlBhcnNlRmxleEJ1ZmZlcihqc29uLCBudWxscHRyLCAmZmxleGJ1aWxkKTsKKyAgICBhdXRvIHJvb3QgPSBmbGV4YnVmZmVyczo6R2V0Um9vdChmbGV4YnVpbGQuR2V0QnVmZmVyKCkpOworICAgIFRFU1RfQVNTRVJUKCFyb290LkFzTWFwKCkuSXNUaGVFbXB0eU1hcCgpKTsKKyAgICBURVNUX0FTU0VSVChyb290LkFzTWFwKClbIm9wdF9maWVsZCJdLklzTnVsbCgpKTsKKyAgICBURVNUX0VRKHJvb3QuVG9TdHJpbmcoKSwgc3RkOjpzdHJpbmcoInsgb3B0X2ZpZWxkOiBudWxsIH0iKSk7CisgIH0KK30KKworfSAgLy8gbmFtZXNwYWNlIHRlc3RzCit9ICAvLyBuYW1lc3BhY2UgZmxhdGJ1ZmZlcnMKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9mbGV4YnVmZmVyc190ZXN0LmggYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9mbGV4YnVmZmVyc190ZXN0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDJhMTBiNgotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL2ZsZXhidWZmZXJzX3Rlc3QuaApAQCAtMCwwICsxLDE2IEBACisjaWZuZGVmIFRFU1RTX0ZMRVhCVUZGRVJTX1RFU1RfSAorI2RlZmluZSBURVNUU19GTEVYQlVGRkVSU19URVNUX0gKKworbmFtZXNwYWNlIGZsYXRidWZmZXJzIHsKK25hbWVzcGFjZSB0ZXN0cyB7CisKK3ZvaWQgRmxleEJ1ZmZlcnNUZXN0KCk7Cit2b2lkIEZsZXhCdWZmZXJzUmV1c2VCdWdUZXN0KCk7Cit2b2lkIEZsZXhCdWZmZXJzRmxvYXRpbmdQb2ludFRlc3QoKTsKK3ZvaWQgRmxleEJ1ZmZlcnNEZXByZWNhdGVkVGVzdCgpOwordm9pZCBQYXJzZUZsZXhidWZmZXJzRnJvbUpzb25XaXRoTnVsbFRlc3QoKTsKKworfSAgLy8gbmFtZXNwYWNlIHRlc3RzCit9ICAvLyBuYW1lc3BhY2UgZmxhdGJ1ZmZlcnMKKworI2VuZGlmICAvLyBURVNUU19GTEVYQlVGRkVSU19URVNUX0gKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9mdXp6X3Rlc3QuY3BwIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvZnV6el90ZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42Njg4M2ZhCi0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvZnV6el90ZXN0LmNwcApAQCAtMCwwICsxLDMwNSBAQAorI2luY2x1ZGUgImZ1enpfdGVzdC5oIgorCisjaW5jbHVkZSAiZmxhdGJ1ZmZlcnMvZmxhdGJ1ZmZlcnMuaCIKKyNpbmNsdWRlICJmbGF0YnVmZmVycy9pZGwuaCIKKyNpbmNsdWRlICJ0ZXN0X2Fzc2VydC5oIgorCituYW1lc3BhY2UgZmxhdGJ1ZmZlcnMgeworbmFtZXNwYWNlIHRlc3RzIHsKK25hbWVzcGFjZSB7CisKKy8vIEluY2x1ZGUgc2ltcGxlIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yIHRvIGVuc3VyZSByZXN1bHRzIHdpbGwgYmUgdGhlCisvLyBzYW1lIGNyb3NzIHBsYXRmb3JtLgorLy8gaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9QYXJrJUUyJTgwJTkzTWlsbGVyX3JhbmRvbV9udW1iZXJfZ2VuZXJhdG9yCit1aW50MzJfdCBsY2dfc2VlZCA9IDQ4MjcxOwordWludDMyX3QgbGNnX3JhbmQoKSB7CisgIHJldHVybiBsY2dfc2VlZCA9CisgICAgICAgICAgICAgKHN0YXRpY19jYXN0PHVpbnQ2NF90PihsY2dfc2VlZCkgKiAyNzk0NzAyNzNVTCkgJSA0Mjk0OTY3MjkxVUw7Cit9Cit2b2lkIGxjZ19yZXNldCgpIHsgbGNnX3NlZWQgPSA0ODI3MTsgfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorc3RhdGljIHZvaWQgQ29tcGFyZVRhYmxlRmllbGRWYWx1ZShmbGF0YnVmZmVyczo6VGFibGUgKnRhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYXRidWZmZXJzOjp2b2Zmc2V0X3Qgdm9mZnNldCwgVCB2YWwpIHsKKyAgVCByZWFkID0gdGFibGUtPkdldEZpZWxkKHZvZmZzZXQsIHN0YXRpY19jYXN0PFQ+KDApKTsKKyAgVEVTVF9FUShyZWFkLCB2YWwpOworfQorCit9ICAvLyBuYW1lc3BhY2UKKworLy8gTG93IGxldmVsIHN0cmVzcy9mdXp6IHRlc3Q6IHNlcmlhbGl6ZS9kZXNlcmlhbGl6ZSBhIHZhcmlldHkgb2YKKy8vIGRpZmZlcmVudCBraW5kcyBvZiBkYXRhIGluIGRpZmZlcmVudCBjb21iaW5hdGlvbnMKK3ZvaWQgRnV6elRlc3QxKCkgeworICAvLyBWYWx1ZXMgd2UncmUgdGVzdGluZyBhZ2FpbnN0OiBjaG9zZW4gdG8gZW5zdXJlIG5vIGJpdHMgZ2V0IGNob3BwZWQKKyAgLy8gb2ZmIGFueXdoZXJlLCBhbmQgYWxzbyBiZSBkaWZmZXJlbnQgZnJvbSBlYWNob3RoZXIuCisgIGNvbnN0IHVpbnQ4X3QgYm9vbF92YWwgPSB0cnVlOworICBjb25zdCBpbnQ4X3QgY2hhcl92YWwgPSAtMTI3OyAgLy8gMHg4MQorICBjb25zdCB1aW50OF90IHVjaGFyX3ZhbCA9IDB4RkY7CisgIGNvbnN0IGludDE2X3Qgc2hvcnRfdmFsID0gLTMyMjIyOyAgLy8gMHg4MjIyOworICBjb25zdCB1aW50MTZfdCB1c2hvcnRfdmFsID0gMHhGRUVFOworICBjb25zdCBpbnQzMl90IGludF92YWwgPSAweDgzMzMzMzMzOworICBjb25zdCB1aW50MzJfdCB1aW50X3ZhbCA9IDB4RkREREREREQ7CisgIGNvbnN0IGludDY0X3QgbG9uZ192YWwgPSAweDg0NDQ0NDQ0NDQ0NDQ0NDRMTDsKKyAgY29uc3QgdWludDY0X3QgdWxvbmdfdmFsID0gMHhGQ0NDQ0NDQ0NDQ0NDQ0NDVUxMOworICBjb25zdCBmbG9hdCBmbG9hdF92YWwgPSAzLjE0MTU5ZjsKKyAgY29uc3QgZG91YmxlIGRvdWJsZV92YWwgPSAzLjE0MTU5MjY1MzU5OworCisgIGNvbnN0IGludCB0ZXN0X3ZhbHVlc19tYXggPSAxMTsKKyAgY29uc3QgZmxhdGJ1ZmZlcnM6OnZvZmZzZXRfdCBmaWVsZHNfcGVyX29iamVjdCA9IDQ7CisgIGNvbnN0IGludCBudW1fZnV6el9vYmplY3RzID0gMTAwMDA7ICAvLyBUaGUgaGlnaGVyLCB0aGUgbW9yZSB0aG9yb3VnaCA6KQorCisgIGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciBidWlsZGVyOworCisgIGxjZ19yZXNldCgpOyAgLy8gS2VlcCBpdCBkZXRlcm1pbmlzdGljLgorCisgIGZsYXRidWZmZXJzOjp1b2Zmc2V0X3Qgb2JqZWN0c1tudW1fZnV6el9vYmplY3RzXTsKKworICAvLyBHZW5lcmF0ZSBudW1fZnV6el9vYmplY3RzIHJhbmRvbSBvYmplY3RzIGVhY2ggY29uc2lzdGluZyBvZgorICAvLyBmaWVsZHNfcGVyX29iamVjdCBmaWVsZHMsIGVhY2ggb2YgYSByYW5kb20gdHlwZS4KKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1fZnV6el9vYmplY3RzOyBpKyspIHsKKyAgICBhdXRvIHN0YXJ0ID0gYnVpbGRlci5TdGFydFRhYmxlKCk7CisgICAgZm9yIChmbGF0YnVmZmVyczo6dm9mZnNldF90IGYgPSAwOyBmIDwgZmllbGRzX3Blcl9vYmplY3Q7IGYrKykgeworICAgICAgaW50IGNob2ljZSA9IGxjZ19yYW5kKCkgJSB0ZXN0X3ZhbHVlc19tYXg7CisgICAgICBhdXRvIG9mZiA9IGZsYXRidWZmZXJzOjpGaWVsZEluZGV4VG9PZmZzZXQoZik7CisgICAgICBzd2l0Y2ggKGNob2ljZSkgeworICAgICAgICBjYXNlIDA6IGJ1aWxkZXIuQWRkRWxlbWVudDx1aW50OF90PihvZmYsIGJvb2xfdmFsLCAwKTsgYnJlYWs7CisgICAgICAgIGNhc2UgMTogYnVpbGRlci5BZGRFbGVtZW50PGludDhfdD4ob2ZmLCBjaGFyX3ZhbCwgMCk7IGJyZWFrOworICAgICAgICBjYXNlIDI6IGJ1aWxkZXIuQWRkRWxlbWVudDx1aW50OF90PihvZmYsIHVjaGFyX3ZhbCwgMCk7IGJyZWFrOworICAgICAgICBjYXNlIDM6IGJ1aWxkZXIuQWRkRWxlbWVudDxpbnQxNl90PihvZmYsIHNob3J0X3ZhbCwgMCk7IGJyZWFrOworICAgICAgICBjYXNlIDQ6IGJ1aWxkZXIuQWRkRWxlbWVudDx1aW50MTZfdD4ob2ZmLCB1c2hvcnRfdmFsLCAwKTsgYnJlYWs7CisgICAgICAgIGNhc2UgNTogYnVpbGRlci5BZGRFbGVtZW50PGludDMyX3Q+KG9mZiwgaW50X3ZhbCwgMCk7IGJyZWFrOworICAgICAgICBjYXNlIDY6IGJ1aWxkZXIuQWRkRWxlbWVudDx1aW50MzJfdD4ob2ZmLCB1aW50X3ZhbCwgMCk7IGJyZWFrOworICAgICAgICBjYXNlIDc6IGJ1aWxkZXIuQWRkRWxlbWVudDxpbnQ2NF90PihvZmYsIGxvbmdfdmFsLCAwKTsgYnJlYWs7CisgICAgICAgIGNhc2UgODogYnVpbGRlci5BZGRFbGVtZW50PHVpbnQ2NF90PihvZmYsIHVsb25nX3ZhbCwgMCk7IGJyZWFrOworICAgICAgICBjYXNlIDk6IGJ1aWxkZXIuQWRkRWxlbWVudDxmbG9hdD4ob2ZmLCBmbG9hdF92YWwsIDApOyBicmVhazsKKyAgICAgICAgY2FzZSAxMDogYnVpbGRlci5BZGRFbGVtZW50PGRvdWJsZT4ob2ZmLCBkb3VibGVfdmFsLCAwKTsgYnJlYWs7CisgICAgICB9CisgICAgfQorICAgIG9iamVjdHNbaV0gPSBidWlsZGVyLkVuZFRhYmxlKHN0YXJ0KTsKKyAgfQorICBidWlsZGVyLlByZUFsaWduPGZsYXRidWZmZXJzOjpsYXJnZXN0X3NjYWxhcl90PigwKTsgIC8vIEFsaWduIHdob2xlIGJ1ZmZlci4KKworICBsY2dfcmVzZXQoKTsgIC8vIFJlc2V0LgorCisgIHVpbnQ4X3QgKmVvYiA9IGJ1aWxkZXIuR2V0Q3VycmVudEJ1ZmZlclBvaW50ZXIoKSArIGJ1aWxkZXIuR2V0U2l6ZSgpOworCisgIC8vIFRlc3QgdGhhdCBhbGwgb2JqZWN0cyB3ZSBnZW5lcmF0ZWQgYXJlIHJlYWRhYmxlIGFuZCByZXR1cm4gdGhlCisgIC8vIGV4cGVjdGVkIHZhbHVlcy4gV2UgZ2VuZXJhdGUgcmFuZG9tIG9iamVjdHMgaW4gdGhlIHNhbWUgb3JkZXIKKyAgLy8gc28gdGhpcyBpcyBkZXRlcm1pbmlzdGljLgorICBmb3IgKGludCBpID0gMDsgaSA8IG51bV9mdXp6X29iamVjdHM7IGkrKykgeworICAgIGF1dG8gdGFibGUgPSByZWludGVycHJldF9jYXN0PGZsYXRidWZmZXJzOjpUYWJsZSAqPihlb2IgLSBvYmplY3RzW2ldKTsKKyAgICBmb3IgKGZsYXRidWZmZXJzOjp2b2Zmc2V0X3QgZiA9IDA7IGYgPCBmaWVsZHNfcGVyX29iamVjdDsgZisrKSB7CisgICAgICBpbnQgY2hvaWNlID0gbGNnX3JhbmQoKSAlIHRlc3RfdmFsdWVzX21heDsKKyAgICAgIGZsYXRidWZmZXJzOjp2b2Zmc2V0X3Qgb2ZmID0gZmxhdGJ1ZmZlcnM6OkZpZWxkSW5kZXhUb09mZnNldChmKTsKKyAgICAgIHN3aXRjaCAoY2hvaWNlKSB7CisgICAgICAgIGNhc2UgMDogQ29tcGFyZVRhYmxlRmllbGRWYWx1ZSh0YWJsZSwgb2ZmLCBib29sX3ZhbCk7IGJyZWFrOworICAgICAgICBjYXNlIDE6IENvbXBhcmVUYWJsZUZpZWxkVmFsdWUodGFibGUsIG9mZiwgY2hhcl92YWwpOyBicmVhazsKKyAgICAgICAgY2FzZSAyOiBDb21wYXJlVGFibGVGaWVsZFZhbHVlKHRhYmxlLCBvZmYsIHVjaGFyX3ZhbCk7IGJyZWFrOworICAgICAgICBjYXNlIDM6IENvbXBhcmVUYWJsZUZpZWxkVmFsdWUodGFibGUsIG9mZiwgc2hvcnRfdmFsKTsgYnJlYWs7CisgICAgICAgIGNhc2UgNDogQ29tcGFyZVRhYmxlRmllbGRWYWx1ZSh0YWJsZSwgb2ZmLCB1c2hvcnRfdmFsKTsgYnJlYWs7CisgICAgICAgIGNhc2UgNTogQ29tcGFyZVRhYmxlRmllbGRWYWx1ZSh0YWJsZSwgb2ZmLCBpbnRfdmFsKTsgYnJlYWs7CisgICAgICAgIGNhc2UgNjogQ29tcGFyZVRhYmxlRmllbGRWYWx1ZSh0YWJsZSwgb2ZmLCB1aW50X3ZhbCk7IGJyZWFrOworICAgICAgICBjYXNlIDc6IENvbXBhcmVUYWJsZUZpZWxkVmFsdWUodGFibGUsIG9mZiwgbG9uZ192YWwpOyBicmVhazsKKyAgICAgICAgY2FzZSA4OiBDb21wYXJlVGFibGVGaWVsZFZhbHVlKHRhYmxlLCBvZmYsIHVsb25nX3ZhbCk7IGJyZWFrOworICAgICAgICBjYXNlIDk6IENvbXBhcmVUYWJsZUZpZWxkVmFsdWUodGFibGUsIG9mZiwgZmxvYXRfdmFsKTsgYnJlYWs7CisgICAgICAgIGNhc2UgMTA6IENvbXBhcmVUYWJsZUZpZWxkVmFsdWUodGFibGUsIG9mZiwgZG91YmxlX3ZhbCk7IGJyZWFrOworICAgICAgfQorICAgIH0KKyAgfQorfQorCisvLyBIaWdoIGxldmVsIHN0cmVzcy9mdXp6IHRlc3Q6IGdlbmVyYXRlIGEgYmlnIHNjaGVtYSBhbmQKKy8vIG1hdGNoaW5nIGpzb24gZGF0YSBpbiByYW5kb20gY29tYmluYXRpb25zLCB0aGVuIHBhcnNlIGJvdGgsCisvLyBnZW5lcmF0ZSBqc29uIGJhY2sgZnJvbSB0aGUgYmluYXJ5LCBhbmQgY29tcGFyZSB3aXRoIHRoZSBvcmlnaW5hbC4KK3ZvaWQgRnV6elRlc3QyKCkgeworICBsY2dfcmVzZXQoKTsgIC8vIEtlZXAgaXQgZGV0ZXJtaW5pc3RpYy4KKworICBjb25zdCBpbnQgbnVtX2RlZmluaXRpb25zID0gMzA7CisgIGNvbnN0IGludCBudW1fc3RydWN0X2RlZmluaXRpb25zID0gNTsgIC8vIFN1YnNldCBvZiBudW1fZGVmaW5pdGlvbnMuCisgIGNvbnN0IGludCBmaWVsZHNfcGVyX2RlZmluaXRpb24gPSAxNTsKKyAgY29uc3QgaW50IGluc3RhbmNlc19wZXJfZGVmaW5pdGlvbiA9IDU7CisgIGNvbnN0IGludCBkZXByZWNhdGlvbl9yYXRlID0gMTA7ICAvLyAxIGluIGRlcHJlY2F0aW9uX3JhdGUgZmllbGRzIHdpbGwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJlIGRlcHJlY2F0ZWQuCisKKyAgc3RkOjpzdHJpbmcgc2NoZW1hID0gIm5hbWVzcGFjZSB0ZXN0O1xuXG4iOworCisgIHN0cnVjdCBSbmREZWYgeworICAgIHN0ZDo6c3RyaW5nIGluc3RhbmNlc1tpbnN0YW5jZXNfcGVyX2RlZmluaXRpb25dOworCisgICAgLy8gU2luY2Ugd2UncmUgZ2VuZXJhdGluZyBzY2hlbWEgYW5kIGNvcnJlc3BvbmRpbmcgZGF0YSBpbiB0YW5kZW0sCisgICAgLy8gdGhpcyBjb252ZW5pZW5jZSBmdW5jdGlvbiBhZGRzIHN0cmluZ3MgdG8gYm90aCBhdCBvbmNlLgorICAgIHN0YXRpYyB2b2lkIEFkZChSbmREZWYgKCZkZWZpbml0aW9uc19sKVtudW1fZGVmaW5pdGlvbnNdLAorICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyAmc2NoZW1hX2wsIGNvbnN0IGludCBpbnN0YW5jZXNfcGVyX2RlZmluaXRpb25fbCwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqc2NoZW1hX2FkZCwgY29uc3QgY2hhciAqaW5zdGFuY2VfYWRkLAorICAgICAgICAgICAgICAgICAgICBpbnQgZGVmaW5pdGlvbikgeworICAgICAgc2NoZW1hX2wgKz0gc2NoZW1hX2FkZDsKKyAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaW5zdGFuY2VzX3Blcl9kZWZpbml0aW9uX2w7IGkrKykKKyAgICAgICAgZGVmaW5pdGlvbnNfbFtkZWZpbml0aW9uXS5pbnN0YW5jZXNbaV0gKz0gaW5zdGFuY2VfYWRkOworICAgIH0KKyAgfTsKKworICAvLyBjbGFuZy1mb3JtYXQgb2ZmCisgICNkZWZpbmUgQWRkVG9TY2hlbWFBbmRJbnN0YW5jZXMoc2NoZW1hX2FkZCwgaW5zdGFuY2VfYWRkKSBcCisgICAgUm5kRGVmOjpBZGQoZGVmaW5pdGlvbnMsIHNjaGVtYSwgaW5zdGFuY2VzX3Blcl9kZWZpbml0aW9uLCBcCisgICAgICAgICAgICAgICAgc2NoZW1hX2FkZCwgaW5zdGFuY2VfYWRkLCBkZWZpbml0aW9uKQorCisgICNkZWZpbmUgRHVtbXkoKSBcCisgICAgUm5kRGVmOjpBZGQoZGVmaW5pdGlvbnMsIHNjaGVtYSwgaW5zdGFuY2VzX3Blcl9kZWZpbml0aW9uLCBcCisgICAgICAgICAgICAgICAgImJ5dGUiLCAiMSIsIGRlZmluaXRpb24pCisgIC8vIGNsYW5nLWZvcm1hdCBvbgorCisgIFJuZERlZiBkZWZpbml0aW9uc1tudW1fZGVmaW5pdGlvbnNdOworCisgIC8vIFdlIGFyZSBnb2luZyB0byBnZW5lcmF0ZSBudW1fZGVmaW5pdGlvbnMsIHRoZSBmaXJzdAorICAvLyBudW1fc3RydWN0X2RlZmluaXRpb25zIHdpbGwgYmUgc3RydWN0cywgdGhlIHJlc3QgdGFibGVzLiBGb3IgZWFjaAorICAvLyBnZW5lcmF0ZSByYW5kb20gZmllbGRzLCBzb21lIG9mIHdoaWNoIG1heSBiZSBzdHJ1Y3QvdGFibGUgdHlwZXMKKyAgLy8gcmVmZXJyaW5nIHRvIHByZXZpb3VzbHkgZ2VuZXJhdGVkIHN0cnVjdHMvdGFibGVzLgorICAvLyBTaW11bHRhbmVub3VzbHksIHdlIGdlbmVyYXRlIGluc3RhbmNlc19wZXJfZGVmaW5pdGlvbiBKU09OIGRhdGEKKyAgLy8gZGVmaW5pdGlvbnMsIHdoaWNoIHdpbGwgaGF2ZSBpZGVudGljYWwgc3RydWN0dXJlIHRvIHRoZSBzY2hlbWEKKyAgLy8gYmVpbmcgZ2VuZXJhdGVkLiBXZSBnZW5lcmF0ZSBtdWx0aXBsZSBpbnN0YW5jZXMgc3VjaCB0aGF0IHdoZW4gY3JlYXRpbmcKKyAgLy8gaGllcmFyY2h5LCB3ZSBnZXQgc29tZSB2YXJpZXR5IGJ5IHBpY2tpbmcgb25lIHJhbmRvbWx5LgorICBmb3IgKGludCBkZWZpbml0aW9uID0gMDsgZGVmaW5pdGlvbiA8IG51bV9kZWZpbml0aW9uczsgZGVmaW5pdGlvbisrKSB7CisgICAgc3RkOjpzdHJpbmcgZGVmaW5pdGlvbl9uYW1lID0gIkQiICsgZmxhdGJ1ZmZlcnM6Ok51bVRvU3RyaW5nKGRlZmluaXRpb24pOworCisgICAgYm9vbCBpc19zdHJ1Y3QgPSBkZWZpbml0aW9uIDwgbnVtX3N0cnVjdF9kZWZpbml0aW9uczsKKworICAgIEFkZFRvU2NoZW1hQW5kSW5zdGFuY2VzKAorICAgICAgICAoKGlzX3N0cnVjdCA/ICJzdHJ1Y3QgIiA6ICJ0YWJsZSAiKSArIGRlZmluaXRpb25fbmFtZSArICIge1xuIikuY19zdHIoKSwKKyAgICAgICAgIntcbiIpOworCisgICAgZm9yIChpbnQgZmllbGQgPSAwOyBmaWVsZCA8IGZpZWxkc19wZXJfZGVmaW5pdGlvbjsgZmllbGQrKykgeworICAgICAgY29uc3QgYm9vbCBpc19sYXN0X2ZpZWxkID0gZmllbGQgPT0gZmllbGRzX3Blcl9kZWZpbml0aW9uIC0gMTsKKworICAgICAgLy8gRGVwcmVjYXRlIDEgaW4gZGVwcmVjYXRpb25fcmF0ZSBmaWVsZHMuIE9ubHkgdGFibGUgZmllbGRzIGNhbiBiZQorICAgICAgLy8gZGVwcmVjYXRlZC4KKyAgICAgIC8vIERvbid0IGRlcHJlY2F0ZSB0aGUgbGFzdCBmaWVsZCB0byBhdm9pZCBkYW5nbGluZyBjb21tYXMgaW4gSlNPTi4KKyAgICAgIGNvbnN0IGJvb2wgZGVwcmVjYXRlZCA9CisgICAgICAgICAgIWlzX3N0cnVjdCAmJiAhaXNfbGFzdF9maWVsZCAmJiAobGNnX3JhbmQoKSAlIGRlcHJlY2F0aW9uX3JhdGUgPT0gMCk7CisKKyAgICAgIHN0ZDo6c3RyaW5nIGZpZWxkX25hbWUgPSAiZiIgKyBmbGF0YnVmZmVyczo6TnVtVG9TdHJpbmcoZmllbGQpOworICAgICAgQWRkVG9TY2hlbWFBbmRJbnN0YW5jZXMoKCIgICIgKyBmaWVsZF9uYW1lICsgIjoiKS5jX3N0cigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVwcmVjYXRlZCA/ICIiIDogKGZpZWxkX25hbWUgKyAiOiAiKS5jX3N0cigpKTsKKyAgICAgIC8vIFBpY2sgcmFuZG9tIHR5cGU6CisgICAgICBhdXRvIGJhc2VfdHlwZSA9IHN0YXRpY19jYXN0PGZsYXRidWZmZXJzOjpCYXNlVHlwZT4oCisgICAgICAgICAgbGNnX3JhbmQoKSAlIChmbGF0YnVmZmVyczo6QkFTRV9UWVBFX1VOSU9OICsgMSkpOworICAgICAgc3dpdGNoIChiYXNlX3R5cGUpIHsKKyAgICAgICAgY2FzZSBmbGF0YnVmZmVyczo6QkFTRV9UWVBFX1NUUklORzoKKyAgICAgICAgICBpZiAoaXNfc3RydWN0KSB7CisgICAgICAgICAgICBEdW1teSgpOyAgLy8gTm8gc3RyaW5ncyBpbiBzdHJ1Y3RzLgorICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBBZGRUb1NjaGVtYUFuZEluc3RhbmNlcygic3RyaW5nIiwgZGVwcmVjYXRlZCA/ICIiIDogIlwiaGlcIiIpOworICAgICAgICAgIH0KKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBmbGF0YnVmZmVyczo6QkFTRV9UWVBFX1ZFQ1RPUjoKKyAgICAgICAgICBpZiAoaXNfc3RydWN0KSB7CisgICAgICAgICAgICBEdW1teSgpOyAgLy8gTm8gdmVjdG9ycyBpbiBzdHJ1Y3RzLgorICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBBZGRUb1NjaGVtYUFuZEluc3RhbmNlcygiW3VieXRlXSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXByZWNhdGVkID8gIiIgOiAiW1xuMCxcbjEsXG4yNTVcbl0iKTsKKyAgICAgICAgICB9CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgZmxhdGJ1ZmZlcnM6OkJBU0VfVFlQRV9OT05FOgorICAgICAgICBjYXNlIGZsYXRidWZmZXJzOjpCQVNFX1RZUEVfVVRZUEU6CisgICAgICAgIGNhc2UgZmxhdGJ1ZmZlcnM6OkJBU0VfVFlQRV9TVFJVQ1Q6CisgICAgICAgIGNhc2UgZmxhdGJ1ZmZlcnM6OkJBU0VfVFlQRV9VTklPTjoKKyAgICAgICAgICBpZiAoZGVmaW5pdGlvbikgeworICAgICAgICAgICAgLy8gUGljayBhIHJhbmRvbSBwcmV2aW91cyBkZWZpbml0aW9uIGFuZCByYW5kb20gZGF0YSBpbnN0YW5jZSBvZgorICAgICAgICAgICAgLy8gdGhhdCBkZWZpbml0aW9uLgorICAgICAgICAgICAgaW50IGRlZnJlZiA9IGxjZ19yYW5kKCkgJSBkZWZpbml0aW9uOworICAgICAgICAgICAgaW50IGluc3RhbmNlID0gbGNnX3JhbmQoKSAlIGluc3RhbmNlc19wZXJfZGVmaW5pdGlvbjsKKyAgICAgICAgICAgIEFkZFRvU2NoZW1hQW5kSW5zdGFuY2VzKAorICAgICAgICAgICAgICAgICgiRCIgKyBmbGF0YnVmZmVyczo6TnVtVG9TdHJpbmcoZGVmcmVmKSkuY19zdHIoKSwKKyAgICAgICAgICAgICAgICBkZXByZWNhdGVkID8gIiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDogZGVmaW5pdGlvbnNbZGVmcmVmXS5pbnN0YW5jZXNbaW5zdGFuY2VdLmNfc3RyKCkpOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBJZiB0aGlzIGlzIHRoZSBmaXJzdCBkZWZpbml0aW9uLCB3ZSBoYXZlIG5vIGRlZmluaXRpb24gd2UgY2FuCisgICAgICAgICAgICAvLyByZWZlciB0by4KKyAgICAgICAgICAgIER1bW15KCk7CisgICAgICAgICAgfQorICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGZsYXRidWZmZXJzOjpCQVNFX1RZUEVfQk9PTDoKKyAgICAgICAgICBBZGRUb1NjaGVtYUFuZEluc3RhbmNlcygKKyAgICAgICAgICAgICAgImJvb2wiLCBkZXByZWNhdGVkID8gIiIgOiAobGNnX3JhbmQoKSAlIDIgPyAidHJ1ZSIgOiAiZmFsc2UiKSk7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgZmxhdGJ1ZmZlcnM6OkJBU0VfVFlQRV9BUlJBWToKKyAgICAgICAgICBpZiAoIWlzX3N0cnVjdCkgeworICAgICAgICAgICAgQWRkVG9TY2hlbWFBbmRJbnN0YW5jZXMoCisgICAgICAgICAgICAgICAgInVieXRlIiwKKyAgICAgICAgICAgICAgICBkZXByZWNhdGVkID8gIiIgOiAiMjU1Iik7ICAvLyBObyBmaXhlZC1sZW5ndGggYXJyYXlzIGluIHRhYmxlcy4KKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgQWRkVG9TY2hlbWFBbmRJbnN0YW5jZXMoIltpbnQ6M10iLCBkZXByZWNhdGVkID8gIiIgOiAiW1xuLFxuLFxuXSIpOworICAgICAgICAgIH0KKyAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAvLyBBbGwgdGhlIHNjYWxhciB0eXBlcy4KKyAgICAgICAgICBzY2hlbWEgKz0gZmxhdGJ1ZmZlcnM6OmtUeXBlTmFtZXNbYmFzZV90eXBlXTsKKworICAgICAgICAgIGlmICghZGVwcmVjYXRlZCkgeworICAgICAgICAgICAgLy8gV2Ugd2FudCBlYWNoIGluc3RhbmNlIHRvIHVzZSBpdHMgb3duIHJhbmRvbSB2YWx1ZS4KKyAgICAgICAgICAgIGZvciAoaW50IGluc3QgPSAwOyBpbnN0IDwgaW5zdGFuY2VzX3Blcl9kZWZpbml0aW9uOyBpbnN0KyspCisgICAgICAgICAgICAgIGRlZmluaXRpb25zW2RlZmluaXRpb25dLmluc3RhbmNlc1tpbnN0XSArPQorICAgICAgICAgICAgICAgICAgZmxhdGJ1ZmZlcnM6OklzRmxvYXQoYmFzZV90eXBlKQorICAgICAgICAgICAgICAgICAgICAgID8gZmxhdGJ1ZmZlcnM6Ok51bVRvU3RyaW5nPGRvdWJsZT4obGNnX3JhbmQoKSAlIDEyOCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY19zdHIoKQorICAgICAgICAgICAgICAgICAgICAgIDogZmxhdGJ1ZmZlcnM6Ok51bVRvU3RyaW5nPGludD4obGNnX3JhbmQoKSAlIDEyOCkuY19zdHIoKTsKKyAgICAgICAgICB9CisgICAgICB9CisgICAgICBBZGRUb1NjaGVtYUFuZEluc3RhbmNlcyhkZXByZWNhdGVkID8gIihkZXByZWNhdGVkKTtcbiIgOiAiO1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlcHJlY2F0ZWQgICAgICA/ICIiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGlzX2xhc3RfZmllbGQgPyAiXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAiLFxuIik7CisgICAgfQorICAgIEFkZFRvU2NoZW1hQW5kSW5zdGFuY2VzKCJ9XG5cbiIsICJ9Iik7CisgIH0KKworICBzY2hlbWEgKz0gInJvb3RfdHlwZSBEIiArIGZsYXRidWZmZXJzOjpOdW1Ub1N0cmluZyhudW1fZGVmaW5pdGlvbnMgLSAxKTsKKyAgc2NoZW1hICs9ICI7XG4iOworCisgIGZsYXRidWZmZXJzOjpQYXJzZXIgcGFyc2VyOworCisgIC8vIFdpbGwgbm90IGNvbXBhcmUgYWdhaW5zdCB0aGUgb3JpZ2luYWwgaWYgd2UgZG9uJ3Qgd3JpdGUgZGVmYXVsdHMKKyAgcGFyc2VyLmJ1aWxkZXJfLkZvcmNlRGVmYXVsdHModHJ1ZSk7CisKKyAgLy8gUGFyc2UgdGhlIHNjaGVtYSwgcGFyc2UgdGhlIGdlbmVyYXRlZCBkYXRhLCB0aGVuIGdlbmVyYXRlIHRleHQgYmFjaworICAvLyBmcm9tIHRoZSBiaW5hcnkgYW5kIGNvbXBhcmUgYWdhaW5zdCB0aGUgb3JpZ2luYWwuCisgIFRFU1RfRVEocGFyc2VyLlBhcnNlKHNjaGVtYS5jX3N0cigpKSwgdHJ1ZSk7CisKKyAgY29uc3Qgc3RkOjpzdHJpbmcgJmpzb24gPQorICAgICAgZGVmaW5pdGlvbnNbbnVtX2RlZmluaXRpb25zIC0gMV0uaW5zdGFuY2VzWzBdICsgIlxuIjsKKworICBURVNUX0VRKHBhcnNlci5QYXJzZShqc29uLmNfc3RyKCkpLCB0cnVlKTsKKworICBzdGQ6OnN0cmluZyBqc29uZ2VuOworICBwYXJzZXIub3B0cy5pbmRlbnRfc3RlcCA9IDA7CisgIGF1dG8gcmVzdWx0ID0KKyAgICAgIEdlbmVyYXRlVGV4dChwYXJzZXIsIHBhcnNlci5idWlsZGVyXy5HZXRCdWZmZXJQb2ludGVyKCksICZqc29uZ2VuKTsKKyAgVEVTVF9FUShyZXN1bHQsIHRydWUpOworCisgIGlmIChqc29uZ2VuICE9IGpzb24pIHsKKyAgICAvLyBUaGVzZSBzdHJpbmdzIGFyZSBsYXJnZXIgdGhhbiBhIG1lZ2FieXRlLCBzbyB3ZSBzaG93IHRoZSBieXRlcyBhcm91bmQKKyAgICAvLyB0aGUgZmlyc3QgYnl0ZXMgdGhhdCBhcmUgZGlmZmVyZW50IHJhdGhlciB0aGFuIHRoZSB3aG9sZSBzdHJpbmcuCisgICAgc2l6ZV90IGxlbiA9IHN0ZDo6bWluKGpzb24ubGVuZ3RoKCksIGpzb25nZW4ubGVuZ3RoKCkpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKKyAgICAgIGlmIChqc29uW2ldICE9IGpzb25nZW5baV0pIHsKKyAgICAgICAgaSAtPSBzdGQ6Om1pbihzdGF0aWNfY2FzdDxzaXplX3Q+KDEwKSwgaSk7ICAvLyBzaG93IHNvbWUgY29udGV4dDsKKyAgICAgICAgc2l6ZV90IGVuZCA9IHN0ZDo6bWluKGxlbiwgaSArIDIwKTsKKyAgICAgICAgZm9yICg7IGkgPCBlbmQ7IGkrKykKKyAgICAgICAgICBURVNUX09VVFBVVF9MSU5FKCJhdCAlZDogZm91bmQgXCIlY1wiLCBleHBlY3RlZCBcIiVjXCJcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQ+KGkpLCBqc29uZ2VuW2ldLCBqc29uW2ldKTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorICAgIFRFU1RfTk9UTlVMTChudWxscHRyKTsgIC8vLVY1MDEgKHRoaXMgY29tbWVudCBzdXBwcmVzc2VzIENXRS01NzAgd2FybmluZykKKyAgfQorCisgIC8vIGNsYW5nLWZvcm1hdCBvZmYKKyAgI2lmZGVmIEZMQVRCVUZGRVJTX1RFU1RfVkVSQk9TRQorICAgIFRFU1RfT1VUUFVUX0xJTkUoIiVkayBzY2hlbWEgdGVzdGVkIHdpdGggJWRrIG9mIGpzb25cbiIsCisgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQ+KHNjaGVtYS5sZW5ndGgoKSAvIDEwMjQpLAorICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50Pihqc29uLmxlbmd0aCgpIC8gMTAyNCkpOworICAjZW5kaWYKKyAgLy8gY2xhbmctZm9ybWF0IG9uCit9CisKK30gIC8vIG5hbWVzcGFjZSB0ZXN0cworfSAgLy8gbmFtZXNwYWNlIGZsYXRidWZmZXJzClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvZnV6el90ZXN0LmggYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9mdXp6X3Rlc3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNzA4MTI4Ci0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvZnV6el90ZXN0LmgKQEAgLTAsMCArMSwxMyBAQAorI2lmbmRlZiBURVNUU19GVVpaX1RFU1RfSAorI2RlZmluZSBURVNUU19GVVpaX1RFU1RfSAorCituYW1lc3BhY2UgZmxhdGJ1ZmZlcnMgeworbmFtZXNwYWNlIHRlc3RzIHsKKwordm9pZCBGdXp6VGVzdDEoKTsKK3ZvaWQgRnV6elRlc3QyKCk7CisKK30gIC8vIG5hbWVzcGFjZSB0ZXN0cworfSAgLy8gbmFtZXNwYWNlIGZsYXRidWZmZXJzCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvZnV6emVyLy5naXRpZ25vcmUgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9mdXp6ZXIvLmdpdGlnbm9yZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZTRkMWQxCi0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvZnV6emVyLy5naXRpZ25vcmUKQEAgLTAsMCArMSwxOCBAQAorIyBUaGUgZ2VuZXJhdGVkIGZ1enplcnMKKypfZnV6emVyCisKKyMgRmluZGluZ3MgZnJvbSB0aGUgZnV6emVycworb29tLSoKK3Nsb3ctdW5pdC0qCitjcmFzaC0qCisKKyMgSW5kaXZpZHVhbCBmdXp6ZXIgbG9ncyBpZiBqb2I9TgorZnV6ei0qLmxvZworCisuY2xhbmdkLworCisjIFRoZXNlIGFyZSBjb3BpZWQgZnJvbSB0ZXN0cy9hbm5vdGF0ZWRfYmluYXJ5LyBhbmQgc2hvdWxkIHVzZSB0aGUgbGF0ZXN0IG9uZXMuCithbm5vdGF0ZWRfYmluYXJ5LmJmYnMKK2Fubm90YXRlZF9iaW5hcnkuYmluCisKK21vbnN0ZXJfdGVzdC5iZmJzClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvZnV6emVyL0NNYWtlTGlzdHMudHh0IGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvZnV6emVyL0NNYWtlTGlzdHMudHh0CmluZGV4IDljYzVhNWYuLjYzYmRhNjggMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL2Z1enplci9DTWFrZUxpc3RzLnR4dAorKysgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9mdXp6ZXIvQ01ha2VMaXN0cy50eHQKQEAgLTk1LDYgKzk1LDcgQEAKICAgICAke0ZMQVRCVUZGRVJTX0RJUn0vaW5jbHVkZS9mbGF0YnVmZmVycy9mbGF0YnVmZmVyX2J1aWxkZXIuaAogICAgICR7RkxBVEJVRkZFUlNfRElSfS9pbmNsdWRlL2ZsYXRidWZmZXJzL2ZsYXRidWZmZXJzLmgKICAgICAke0ZMQVRCVUZGRVJTX0RJUn0vaW5jbHVkZS9mbGF0YnVmZmVycy9mbGV4YnVmZmVycy5oCisgICAgJHtGTEFUQlVGRkVSU19ESVJ9L2luY2x1ZGUvZmxhdGJ1ZmZlcnMvZmxleF9mbGF0X3V0aWwuaAogICAgICR7RkxBVEJVRkZFUlNfRElSfS9pbmNsdWRlL2ZsYXRidWZmZXJzL2hhc2guaAogICAgICR7RkxBVEJVRkZFUlNfRElSfS9pbmNsdWRlL2ZsYXRidWZmZXJzL2lkbC5oCiAgICAgJHtGTEFUQlVGRkVSU19ESVJ9L2luY2x1ZGUvZmxhdGJ1ZmZlcnMvbWluaXJlZmxlY3QuaApAQCAtMTEyLDEyICsxMTMsMTUgQEAKICAgICAke0ZMQVRCVUZGRVJTX0RJUn0vc3JjL2lkbF9wYXJzZXIuY3BwCiAgICAgJHtGTEFUQlVGRkVSU19ESVJ9L3NyYy9pZGxfZ2VuX3RleHQuY3BwCiAgICAgJHtGTEFUQlVGRkVSU19ESVJ9L3NyYy9yZWZsZWN0aW9uLmNwcAorICAgICR7RkxBVEJVRkZFUlNfRElSfS9zcmMvYmluYXJ5X2Fubm90YXRvci5oCisgICAgJHtGTEFUQlVGRkVSU19ESVJ9L3NyYy9iaW5hcnlfYW5ub3RhdG9yLmNwcAogICAgICR7RkxBVEJVRkZFUlNfRElSfS9zcmMvdXRpbC5jcHAKICAgICAke0ZMQVRCVUZGRVJTX0RJUn0vdGVzdHMvdGVzdF9hc3NlcnQuY3BwCiApCiAKIGluY2x1ZGVfZGlyZWN0b3JpZXMoJHtGTEFUQlVGRkVSU19ESVJ9L2luY2x1ZGUpCiBpbmNsdWRlX2RpcmVjdG9yaWVzKCR7RkxBVEJVRkZFUlNfRElSfS90ZXN0cykKK2luY2x1ZGVfZGlyZWN0b3JpZXMoJHtGTEFUQlVGRkVSU19ESVJ9L3NyYykKIAogYWRkX2xpYnJhcnkoZmxhdGJ1ZmZlcnNfZnV6emVkIFNUQVRJQyAke0ZsYXRCdWZmZXJzX0xpYnJhcnlfU1JDU30pCiAjIFVzZSBQVUJMSUMgdG8gZm9yY2UgJ2Z1enplcl9jb25maWcnIGZvciBhbGwgZGVwZW5kZW50IHRhcmdldHMKQEAgLTE1Niw3ICsxNjAsMjAgQEAKICAgQ09NTUFORCAke0NNQUtFX0NPTU1BTkR9IC1FIGNvcHkKICAgJHtDTUFLRV9TT1VSQ0VfRElSfS8uLi9tb25zdGVyX3Rlc3QuYmZicwogICAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vbW9uc3Rlcl90ZXN0LmJmYnMpCi0gIAorCithZGRfZXhlY3V0YWJsZShhbm5vdGF0b3JfZnV6emVyIGZsYXRidWZmZXJzX2Fubm90YXRvcl9mdXp6ZXIuY2MpCit0YXJnZXRfbGlua19saWJyYXJpZXMoYW5ub3RhdG9yX2Z1enplciBQUklWQVRFIGZsYXRidWZmZXJzX2Z1enplZCkKK2FkZF9jdXN0b21fY29tbWFuZCgKKyAgVEFSR0VUIGFubm90YXRvcl9mdXp6ZXIgUFJFX0JVSUxECisKKyAgQ09NTUFORCAke0NNQUtFX0NPTU1BTkR9IC1FIGNvcHkKKyAgJHtDTUFLRV9TT1VSQ0VfRElSfS8uLi9hbm5vdGF0ZWRfYmluYXJ5L2Fubm90YXRlZF9iaW5hcnkuYmZicworICAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vYW5ub3RhdGVkX2JpbmFyeS5iZmJzCisKKyAgQ09NTUFORCAke0NNQUtFX0NPTU1BTkR9IC1FIGNvcHkKKyAgJHtDTUFLRV9TT1VSQ0VfRElSfS8uLi9hbm5vdGF0ZWRfYmluYXJ5L2Fubm90YXRlZF9iaW5hcnkuYmluCisgICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS9zZWVkX2Fubm90YXRvci9hbm5vdGF0ZWRfYmluYXJ5LmJpbgorKQogCiAjIEJ1aWxkIGRlYnVnZ2VyIGZvciB3ZWlyZCBjYXNlcyBmb3VuZCB3aXRoIGZ1enplci4KIGlmKEJVSUxEX0RFQlVHR0VSKQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvZnV6emVyL2ZsYXRidWZmZXJzX2Fubm90YXRvcl9mdXp6ZXIuY2MgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9mdXp6ZXIvZmxhdGJ1ZmZlcnNfYW5ub3RhdG9yX2Z1enplci5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZmY0MzEzCi0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvZnV6emVyL2ZsYXRidWZmZXJzX2Fubm90YXRvcl9mdXp6ZXIuY2MKQEAgLTAsMCArMSw1MyBAQAorCisjaW5jbHVkZSA8ZmlsZXN5c3RlbT4KKyNpbmNsdWRlIDxzdHJpbmc+CisKKyNpbmNsdWRlICJiaW5hcnlfYW5ub3RhdG9yLmgiCisjaW5jbHVkZSAidGVzdF9pbml0LmgiCisKK3N0YXRpYyBzdGQ6OmZpbGVzeXN0ZW06OnBhdGggZXhlX3BhdGhfOworc3RhdGljIGNvbnN0IHVpbnQ4X3QgKnNjaGVtYV9iZmJzXzsKK3N0YXRpYyBzaXplX3Qgc2NoZW1hX2JmYnNfbGVuZ3RoXzsKKworYm9vbCBUZXN0RmlsZUV4aXN0cyhzdGQ6OmZpbGVzeXN0ZW06OnBhdGggZmlsZV9wYXRoKSB7CisgIGlmIChmaWxlX3BhdGguaGFzX2ZpbGVuYW1lKCkgJiYgc3RkOjpmaWxlc3lzdGVtOjpleGlzdHMoZmlsZV9wYXRoKSkKKyAgICByZXR1cm4gdHJ1ZTsKKworICBURVNUX09VVFBVVF9MSU5FKCJAREVCVUc6IGZpbGUgJyVzJyBub3QgZm91bmQiLCBmaWxlX3BhdGguc3RyaW5nKCkuY19zdHIoKSk7CisgIGZvciAoY29uc3QgYXV0byAmZW50cnkgOgorICAgICAgIHN0ZDo6ZmlsZXN5c3RlbTo6ZGlyZWN0b3J5X2l0ZXJhdG9yKGZpbGVfcGF0aC5wYXJlbnRfcGF0aCgpKSkgeworICAgIFRFU1RfT1VUUFVUX0xJTkUoIkBERUJVRzogcGFyZW50IHBhdGggZW50cnk6ICclcyciLAorICAgICAgICAgICAgICAgICAgICAgZW50cnkucGF0aCgpLnN0cmluZygpLmNfc3RyKCkpOworICB9CisgIHJldHVybiBmYWxzZTsKK30KKworc3RkOjpzdHJpbmcgTG9hZEJpbmFyeVNjaGVtYShjb25zdCBjaGFyICpmaWxlX25hbWUpIHsKKyAgY29uc3QgYXV0byBmaWxlX3BhdGggPSBleGVfcGF0aF8ucGFyZW50X3BhdGgoKSAvIGZpbGVfbmFtZTsKKyAgVEVTVF9FUSh0cnVlLCBUZXN0RmlsZUV4aXN0cyhmaWxlX3BhdGgpKTsKKyAgc3RkOjpzdHJpbmcgc2NoZW1hZmlsZTsKKyAgVEVTVF9FUSh0cnVlLAorICAgICAgICAgIGZsYXRidWZmZXJzOjpMb2FkRmlsZShmaWxlX3BhdGguc3RyaW5nKCkuY19zdHIoKSwgdHJ1ZSwgJnNjaGVtYWZpbGUpKTsKKworICBmbGF0YnVmZmVyczo6VmVyaWZpZXIgdmVyaWZpZXIoCisgICAgICByZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QgKj4oc2NoZW1hZmlsZS5jX3N0cigpKSwgc2NoZW1hZmlsZS5zaXplKCkpOworICBURVNUX0VRKHRydWUsIHJlZmxlY3Rpb246OlZlcmlmeVNjaGVtYUJ1ZmZlcih2ZXJpZmllcikpOworICByZXR1cm4gc2NoZW1hZmlsZTsKK30KKworZXh0ZXJuICJDIiBpbnQgTExWTUZ1enplckluaXRpYWxpemUoaW50ICosIGNoYXIgKioqYXJndikgeworICBleGVfcGF0aF8gPSAoKmFyZ3YpWzBdOworICBzdGF0aWMgY29uc3Qgc3RkOjpzdHJpbmcgc2NoZW1hX2ZpbGUgPQorICAgICAgTG9hZEJpbmFyeVNjaGVtYSgiYW5ub3RhdGVkX2JpbmFyeS5iZmJzIik7CisgIHNjaGVtYV9iZmJzXyA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCAqPihzY2hlbWFfZmlsZS5jX3N0cigpKTsKKyAgc2NoZW1hX2JmYnNfbGVuZ3RoXyA9IHNjaGVtYV9maWxlLnNpemUoKTsKKyAgcmV0dXJuIDA7Cit9CisKK2V4dGVybiAiQyIgaW50IExMVk1GdXp6ZXJUZXN0T25lSW5wdXQoY29uc3QgdWludDhfdCAqZGF0YSwgc2l6ZV90IHNpemUpIHsKKyAgZmxhdGJ1ZmZlcnM6OkJpbmFyeUFubm90YXRvciBhbm5vdGF0b3Ioc2NoZW1hX2JmYnNfLCBzY2hlbWFfYmZic19sZW5ndGhfLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLCBzaXplKTsKKworICBhbm5vdGF0b3IuQW5ub3RhdGUoKTsKKyAgcmV0dXJuIDA7Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvZnV6emVyL2ZsYXRidWZmZXJzX21vbnN0ZXJfZnV6emVyLmNjIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvZnV6emVyL2ZsYXRidWZmZXJzX21vbnN0ZXJfZnV6emVyLmNjCmluZGV4IDg5ODFjMmYuLjRiOGI3OTAgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL2Z1enplci9mbGF0YnVmZmVyc19tb25zdGVyX2Z1enplci5jYworKysgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9mdXp6ZXIvZmxhdGJ1ZmZlcnNfbW9uc3Rlcl9mdXp6ZXIuY2MKQEAgLTIzLDYgKzIzLDcgQEAKIAogI2luY2x1ZGUgImNwcDE3L2dlbmVyYXRlZF9jcHAxNy9tb25zdGVyX3Rlc3RfZ2VuZXJhdGVkLmgiCiAjaW5jbHVkZSAiZmxhdGJ1ZmZlcnMvaWRsLmgiCisjaW5jbHVkZSAidGVzdF9hc3NlcnQuaCIKICNpbmNsdWRlICJ0ZXN0X2luaXQuaCIKIAogbmFtZXNwYWNlIGZzID0gc3RkOjpmaWxlc3lzdGVtOwpAQCAtMzIsNiArMzMsOCBAQAogLy8gVGhlIGN1cnJlbnQgZXhlY3V0YWJsZSBwYXRoIChzZWUgTExWTUZ1enplckluaXRpYWxpemUpLgogc3RhdGljIGZzOjpwYXRoIGV4ZV9wYXRoXzsKIAorc3RhdGljIGZsYXRidWZmZXJzOjpQYXJzZXIgcGFyc2VyXzsKKwogbmFtZXNwYWNlIHsKIAogc3RhdGljIGNvbnN0ZXhwciBzaXplX3Qga01pbklucHV0TGVuZ3RoID0gMTsKQEAgLTQ2LDcgKzQ5LDggQEAKIAogICBURVNUX09VVFBVVF9MSU5FKCJAREVCVUc6IGZpbGUgJyVzJyBub3QgZm91bmQiLCBmaWxlX3BhdGguc3RyaW5nKCkuY19zdHIoKSk7CiAgIGZvciAoY29uc3QgYXV0byAmZW50cnkgOiBmczo6ZGlyZWN0b3J5X2l0ZXJhdG9yKGZpbGVfcGF0aC5wYXJlbnRfcGF0aCgpKSkgewotICAgIFRFU1RfT1VUUFVUX0xJTkUoIkBERUJVRzogcGFyZW50IHBhdGggZW50cnk6ICclcyciLCBlbnRyeS5wYXRoKCkuc3RyaW5nKCkuY19zdHIoKSk7CisgICAgVEVTVF9PVVRQVVRfTElORSgiQERFQlVHOiBwYXJlbnQgcGF0aCBlbnRyeTogJyVzJyIsCisgICAgICAgICAgICAgICAgICAgICBlbnRyeS5wYXRoKCkuc3RyaW5nKCkuY19zdHIoKSk7CiAgIH0KICAgcmV0dXJuIGZhbHNlOwogfQpAQCAtNTUsNyArNTksOCBAQAogICBjb25zdCBhdXRvIGZpbGVfcGF0aCA9IGV4ZV9wYXRoXy5wYXJlbnRfcGF0aCgpIC8gZmlsZV9uYW1lOwogICBURVNUX0VRKHRydWUsIFRlc3RGaWxlRXhpc3RzKGZpbGVfcGF0aCkpOwogICBzdGQ6OnN0cmluZyBzY2hlbWFmaWxlOwotICBURVNUX0VRKHRydWUsIGZsYXRidWZmZXJzOjpMb2FkRmlsZShmaWxlX3BhdGguc3RyaW5nKCkuY19zdHIoKSwgdHJ1ZSwgJnNjaGVtYWZpbGUpKTsKKyAgVEVTVF9FUSh0cnVlLAorICAgICAgICAgIGZsYXRidWZmZXJzOjpMb2FkRmlsZShmaWxlX3BhdGguc3RyaW5nKCkuY19zdHIoKSwgdHJ1ZSwgJnNjaGVtYWZpbGUpKTsKIAogICBmbGF0YnVmZmVyczo6VmVyaWZpZXIgdmVyaWZpZXIoCiAgICAgICByZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QgKj4oc2NoZW1hZmlsZS5jX3N0cigpKSwgc2NoZW1hZmlsZS5zaXplKCkpOwpAQCAtNjUsMjYgKzcwLDE5IEBACiAKIHN0ZDo6c3RyaW5nIGRvX3Rlc3QoY29uc3QgZmxhdGJ1ZmZlcnM6OklETE9wdGlvbnMgJm9wdHMsCiAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nIGlucHV0X2pzb24sIGNvbnN0IGJvb2wgY2hlY2tfcGFyc2VyKSB7Ci0gIC8vIG9uY2UgbG9hZGVkIGZyb20gZGlzawotICBzdGF0aWMgY29uc3Qgc3RkOjpzdHJpbmcgc2NoZW1hZmlsZSA9IExvYWRCaW5hcnlTY2hlbWEoIm1vbnN0ZXJfdGVzdC5iZmJzIik7Ci0gIC8vIHBhcnNlIHNjaGVtYSBmaXJzdCwgc28gd2UgY2FuIHVzZSBpdCB0byBwYXJzZSB0aGUgZGF0YSBhZnRlcgotICBmbGF0YnVmZmVyczo6UGFyc2VyIHBhcnNlcjsKLSAgVEVTVF9FUSh0cnVlLCBwYXJzZXIuRGVzZXJpYWxpemUoCi0gICAgICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCAqPihzY2hlbWFmaWxlLmNfc3RyKCkpLAotICAgICAgICAgICAgICAgICAgICBzY2hlbWFmaWxlLnNpemUoKSkpOwogICAvLyAocmUpZGVmaW5lIHBhcnNlciBvcHRpb25zCi0gIHBhcnNlci5vcHRzID0gb3B0czsKKyAgcGFyc2VyXy5vcHRzID0gb3B0czsKIAogICBzdGQ6OnN0cmluZyBqc29uZ2VuOwotICBpZiAocGFyc2VyLlBhcnNlSnNvbihpbnB1dF9qc29uLmNfc3RyKCkpKSB7Ci0gICAgZmxhdGJ1ZmZlcnM6OlZlcmlmaWVyIHZlcmlmaWVyKHBhcnNlci5idWlsZGVyXy5HZXRCdWZmZXJQb2ludGVyKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlci5idWlsZGVyXy5HZXRTaXplKCkpOworICBpZiAocGFyc2VyXy5QYXJzZUpzb24oaW5wdXRfanNvbi5jX3N0cigpKSkgeworICAgIGZsYXRidWZmZXJzOjpWZXJpZmllciB2ZXJpZmllcihwYXJzZXJfLmJ1aWxkZXJfLkdldEJ1ZmZlclBvaW50ZXIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VyXy5idWlsZGVyXy5HZXRTaXplKCkpOwogICAgIFRFU1RfRVEodHJ1ZSwgTXlHYW1lOjpFeGFtcGxlOjpWZXJpZnlNb25zdGVyQnVmZmVyKHZlcmlmaWVyKSk7CiAgICAgVEVTVF9BU1NFUlQoCi0gICAgICAgIEdlbmVyYXRlVGV4dChwYXJzZXIsIHBhcnNlci5idWlsZGVyXy5HZXRCdWZmZXJQb2ludGVyKCksICZqc29uZ2VuKSk7CisgICAgICAgIEdlbmVyYXRlVGV4dChwYXJzZXJfLCBwYXJzZXJfLmJ1aWxkZXJfLkdldEJ1ZmZlclBvaW50ZXIoKSwgJmpzb25nZW4pKTsKICAgfSBlbHNlIGlmIChjaGVja19wYXJzZXIpIHsKICAgICBURVNUX09VVFBVVF9MSU5FKCJwYXJzZXIgZmFpbGVkIHdpdGggSlNPTjpcbiVzIiwgaW5wdXRfanNvbi5jX3N0cigpKTsKLSAgICBURVNUX0VRX1NUUigiIiwgcGFyc2VyLmVycm9yXy5jX3N0cigpKTsKKyAgICBURVNUX0VRX1NUUigiIiwgcGFyc2VyXy5lcnJvcl8uY19zdHIoKSk7CiAgICAgVEVTVF9BU1NFUlQoZmFsc2UpOwogICB9CiAgIHJldHVybiBqc29uZ2VuOwpAQCAtMTAwLDYgKzk4LDExIEBACiBleHRlcm4gIkMiIGludCBMTFZNRnV6emVySW5pdGlhbGl6ZShpbnQgKmFyZ2MsIGNoYXIgKioqYXJndikgewogICAodm9pZClhcmdjOwogICBleGVfcGF0aF8gPSAoKmFyZ3YpWzBdOworCisgIHN0YXRpYyBjb25zdCBzdGQ6OnN0cmluZyBzY2hlbWFmaWxlID0gTG9hZEJpbmFyeVNjaGVtYSgibW9uc3Rlcl90ZXN0LmJmYnMiKTsKKyAgLy8gcGFyc2Ugc2NoZW1hIGZpcnN0LCBzbyB3ZSBjYW4gdXNlIGl0IHRvIHBhcnNlIHRoZSBkYXRhIGFmdGVyCisgIHBhcnNlcl8uRGVzZXJpYWxpemUocmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90ICo+KHNjaGVtYWZpbGUuY19zdHIoKSksCisgICAgICAgICAgICAgICAgICAgICAgc2NoZW1hZmlsZS5zaXplKCkpOwogICByZXR1cm4gMDsKIH0KIApAQCAtMTIyLDEwICsxMjUsMjAgQEAKICAgICAgIChmbGFncyAmIGZsYWdzX3NraXBfdW5leHBlY3RlZF9maWVsZHNfaW5fanNvbik7CiAgIG9wdHMuYWxsb3dfbm9uX3V0ZjggPSAoZmxhZ3MgJiBmbGFnc19hbGxvd19ub25fdXRmOCk7CiAKLSAgY29uc3Qgc3RkOjpzdHJpbmcganNvbmdlbl8xID0gZG9fdGVzdChvcHRzLCBpbnB1dCwgZmFsc2UpOwotICBpZiAoIWpzb25nZW5fMS5lbXB0eSgpKSB7Ci0gICAgY29uc3Qgc3RkOjpzdHJpbmcganNvbmdlbl8yID0gZG9fdGVzdChvcHRzLCBqc29uZ2VuXzEsIHRydWUpOwotICAgIFRFU1RfRVEoanNvbmdlbl8xLCBqc29uZ2VuXzIpOwotICB9CisgIGRvIHsKKyAgICBjb25zdCBzdGQ6OnN0cmluZyBqc29uZ2VuXzEgPSBkb190ZXN0KG9wdHMsIGlucHV0LCBmYWxzZSk7CisgICAgaWYgKCFqc29uZ2VuXzEuZW1wdHkoKSkgeworICAgICAgY29uc3Qgc3RkOjpzdHJpbmcganNvbmdlbl8yID0gZG9fdGVzdChvcHRzLCBqc29uZ2VuXzEsIHRydWUpOworICAgICAgaWYgKGpzb25nZW5fMSAhPSBqc29uZ2VuXzIgJiYgIW9wdHMub3V0cHV0X2RlZmF1bHRfc2NhbGFyc19pbl9qc29uKSB7CisgICAgICAgIC8vIFRoaXMgZ2V0cyB0cmlja3kgd2hlbiB0aGUganNvbmdlbl8xIGluY2x1ZGVzIGEgZGVmYXVsdC12YWx1ZSwgYXMgdGhlCisgICAgICAgIC8vIGdlbmVyYXRlZCBqc29uZ2VuXzIgZG9lc24ndCBlbWl0IGRlZmF1bHQtdmFsdWVzLiBTbyBlbmFibGUgZGVmYXVsdAorICAgICAgICAvLyBzY2FsYXJzIGFuZCByZS1ydW4gaXQuCisgICAgICAgIG9wdHMub3V0cHV0X2RlZmF1bHRfc2NhbGFyc19pbl9qc29uID0gdHJ1ZTsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisgICAgICBURVNUX0VRKGpzb25nZW5fMSwganNvbmdlbl8yKTsKKyAgICB9CisgIH0gd2hpbGUgKDApOworCiAgIHJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvZnV6emVyL3JlYWRtZS5tZCBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL2Z1enplci9yZWFkbWUubWQKaW5kZXggMWQwYjM5Mi4uYzQ1MTMwMSAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvZnV6emVyL3JlYWRtZS5tZAorKysgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9mdXp6ZXIvcmVhZG1lLm1kCkBAIC0xMSw2ICsxMSw3IEBACiBUbyBidWlsZCBhbmQgcnVuIHRoZXNlIHRlc3RzIExMVk0gY29tcGlsZXIgKHdpdGggY2xhbmcgZnJvbnRlbmQpIGFuZCBDTWFrZSBzaG91bGQgYmUgaW5zdGFsbGVkIGJlZm9yZS4KIAogVGhlIGZ1enplciBzZWN0aW9uIGluY2x1ZGUgZm91ciB0ZXN0czoKKy0gYGFubm90YXRvcl9mdXp6ZXJgIGNoZWNrcyB0aGF0IGlucHV0cyBnaXZlbiB0byB0aGUgZmxhdGMgLS1hbm5vdGF0ZSBhcmUgYWx3YXlzIHBhcnNhYmxlOwogLSBgdmVyaWZpZXJfZnV6emVyYCBjaGVja3Mgc3RhYmlsaXR5IG9mIGRlc2VyaWFsaXphdGlvbiBlbmdpbmUgZm9yIGBNb25zdGVyYCBzY2hlbWE7CiAtIGBwYXJzZXJfZnV6emVyYCBjaGVja3Mgc3RhYmlsaXR5IG9mIHNjaGVtYSBhbmQganNvbiBwYXJzZXIgdW5kZXIgdmFyaW91cyBpbnB1dHM7CiAtIGBzY2FsYXJfcGFyc2VyYCBmb2N1c2VkIG9uIHZhbGlkYXRpb24gb2YgdGhlIHBhcnNlciB3aGlsZSBwYXJzZSBudW1lcmljIHNjYWxhcnMgaW4gc2NoZW1hIGFuZC9vciBqc29uIGZpbGVzOwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvZnV6emVyL3Rlc3RfaW5pdC5oIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvZnV6emVyL3Rlc3RfaW5pdC5oCmluZGV4IDZjOTExM2QuLjZjYjU4ZDMgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL2Z1enplci90ZXN0X2luaXQuaAorKysgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9mdXp6ZXIvdGVzdF9pbml0LmgKQEAgLTExLDcgKzExLDcgQEAKICAgLy8gVGhpcyBob29rIHRlcm1pbmF0ZSBwcm9ncmFtIGJvdGggaW4gRGVidWcgYW5kIFJlbGVhc2UuCiAgIHN0YXRpYyBib29sIFRlc3RGYWlsTGlzdGVuZXIoY29uc3QgY2hhciAqZXhwdmFsLCBjb25zdCBjaGFyICp2YWwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZXhwLCBjb25zdCBjaGFyICpmaWxlLCBpbnQgbGluZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpmdW5jID0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmZ1bmMgPSBudWxscHRyKSB7CiAgICAgKHZvaWQpZXhwdmFsOwogICAgICh2b2lkKXZhbDsKICAgICAodm9pZClleHA7CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9nb190ZXN0LmdvIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvZ29fdGVzdC5nbwppbmRleCAxMWIzZjBhLi44Y2I3Yjk3IDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9nb190ZXN0LmdvCisrKyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL2dvX3Rlc3QuZ28KQEAgLTE3LDE0ICsxNywxNCBAQAogcGFja2FnZSBtYWluCiAKIGltcG9ydCAoCi0JbXlnYW1lICJNeUdhbWUiICAgICAgICAgICAgICAgICAgICAgLy8gcmVmZXJzIHRvIGdlbmVyYXRlZCBjb2RlCi0JZXhhbXBsZSAiTXlHYW1lL0V4YW1wbGUiICAgICAgICAgICAgLy8gcmVmZXJzIHRvIGdlbmVyYXRlZCBjb2RlCisJbXlnYW1lICJNeUdhbWUiICAgICAgICAgIC8vIHJlZmVycyB0byBnZW5lcmF0ZWQgY29kZQorCWV4YW1wbGUgIk15R2FtZS9FeGFtcGxlIiAvLyByZWZlcnMgdG8gZ2VuZXJhdGVkIGNvZGUKKwkiZW5jb2RpbmcvanNvbiIKIAlvcHRpb25hbF9zY2FsYXJzICJvcHRpb25hbF9zY2FsYXJzIiAvLyByZWZlcnMgdG8gZ2VuZXJhdGVkIGNvZGUKIAogCSJieXRlcyIKIAkiZmxhZyIKIAkiZm10IgotCSJpby9pb3V0aWwiCiAJIm9zIgogCSJyZWZsZWN0IgogCSJzb3J0IgpAQCAtNjksNiArNjksMzUgQEAKIAlvcy5FeGl0KG0uUnVuKCkpCiB9CiAKKy8vIFRlc3RUZXh0UGFyc2luZyB0ZXN0IGlmIHRleHQgcGFyc2luZyB3b3JrcyB3aXRoIG9iamVjdCBBUEkuCitmdW5jIFRlc3RUZXh0UGFyc2luZyh0ICp0ZXN0aW5nLlQpIHsKKwlleHBlY3RlZE1vbnN0ZXIgOj0gZXhhbXBsZS5Nb25zdGVyVHsKKwkJTWFuYTogICAgICAgICAgICAgICAgICA0MiwKKwkJTmFtZTogICAgICAgICAgICAgICAgICAiZm9vIiwKKwkJTG9uZ0VudW1Ob3JtYWxEZWZhdWx0OiBleGFtcGxlLkxvbmdFbnVtTG9uZ1R3bywKKwl9CisKKwlidWYgOj0gbmV3KGJ5dGVzLkJ1ZmZlcikKKwlpZiBlcnIgOj0ganNvbi5OZXdFbmNvZGVyKGJ1ZikuRW5jb2RlKGV4cGVjdGVkTW9uc3Rlcik7IGVyciAhPSBuaWwgeworCQl0LkZhdGFsKGVycikKKwl9CisKKwl2YXIgbW9uc3RlciBleGFtcGxlLk1vbnN0ZXJUCisJaWYgZXJyIDo9IGpzb24uTmV3RGVjb2RlcihidWYpLkRlY29kZSgmbW9uc3Rlcik7IGVyciAhPSBuaWwgeworCQl0LkZhdGFsKGVycikKKwl9CisKKwlpZiBtb25zdGVyLk1hbmEgIT0gZXhwZWN0ZWRNb25zdGVyLk1hbmEgeworCQl0LkZhdGFsKCJ3cm9uZyBtYW5hOiIsIG1vbnN0ZXIuTWFuYSkKKwl9CisJaWYgbW9uc3Rlci5OYW1lICE9IGV4cGVjdGVkTW9uc3Rlci5OYW1lIHsKKwkJdC5GYXRhbCgid3JvbmcgbmFtZToiLCBtb25zdGVyLk5hbWUpCisJfQorCWlmIG1vbnN0ZXIuTG9uZ0VudW1Ob3JtYWxEZWZhdWx0ICE9IGV4cGVjdGVkTW9uc3Rlci5Mb25nRW51bU5vcm1hbERlZmF1bHQgeworCQl0LkZhdGFsKCJ3cm9uZyBlbnVtOiIsIG1vbnN0ZXIuTG9uZ0VudW1Ob3JtYWxEZWZhdWx0KQorCX0KK30KKwogLy8gVGVzdEFsbCBydW5zIGFsbCBjaGVja3MsIGZhaWxpbmcgaWYgYW55IGVycm9ycyBvY2N1ci4KIGZ1bmMgVGVzdEFsbCh0ICp0ZXN0aW5nLlQpIHsKIAkvLyBWZXJpZnkgdGhhdCB0aGUgR28gRmxhdEJ1ZmZlcnMgcnVudGltZSBsaWJyYXJ5IGdlbmVyYXRlcyB0aGUKQEAgLTEwMSw3ICsxMzAsNyBAQAogCiAJLy8gVmVyaWZ5IHRoYXQgdGhlIGJ1ZmZlciBnZW5lcmF0ZWQgYnkgQysrIGNvZGUgaXMgcmVhZGFibGUgYnkgdGhlCiAJLy8gZ2VuZXJhdGVkIEdvIGNvZGU6Ci0JbW9uc3RlckRhdGFDcHAsIGVyciA6PSBpb3V0aWwuUmVhZEZpbGUoY3BwRGF0YSkKKwltb25zdGVyRGF0YUNwcCwgZXJyIDo9IG9zLlJlYWRGaWxlKGNwcERhdGEpCiAJaWYgZXJyICE9IG5pbCB7CiAJCXQuRmF0YWwoZXJyKQogCX0KQEAgLTE0MSw3ICsxNzAsNyBAQAogCS8vIGlzIGdpdmVuLCBjaGVjayB0aGF0IEdvIGNvZGUgY2FuIHJlYWQgaXQsIGFuZCB0aGF0IEdvIGNvZGUKIAkvLyBnZW5lcmF0ZXMgYW4gaWRlbnRpY2FsIGJ1ZmZlciB3aGVuIHVzZWQgdG8gY3JlYXRlIHRoZSBleGFtcGxlIGRhdGE6CiAJaWYgamF2YURhdGEgIT0gIiIgewotCQltb25zdGVyRGF0YUphdmEsIGVyciA6PSBpb3V0aWwuUmVhZEZpbGUoamF2YURhdGEpCisJCW1vbnN0ZXJEYXRhSmF2YSwgZXJyIDo9IG9zLlJlYWRGaWxlKGphdmFEYXRhKQogCQlpZiBlcnIgIT0gbmlsIHsKIAkJCXQuRmF0YWwoZXJyKQogCQl9CkBAIC0xNTUsNyArMTg0LDcgQEAKIAl9CiAKIAkvLyBXcml0ZSB0aGUgZ2VuZXJhdGVkIGJ1ZmZlciBvdXQgdG8gYSBmaWxlOgotCWVyciA9IGlvdXRpbC5Xcml0ZUZpbGUob3V0RGF0YSwgZ2VuZXJhdGVkW29mZjpdLCBvcy5GaWxlTW9kZSgwNjQ0KSkKKwllcnIgPSBvcy5Xcml0ZUZpbGUob3V0RGF0YSwgZ2VuZXJhdGVkW29mZjpdLCBvcy5GaWxlTW9kZSgwNjQ0KSkKIAlpZiBlcnIgIT0gbmlsIHsKIAkJdC5GYXRhbChlcnIpCiAJfQpAQCAtMTY4NSw3ICsxNzE0LDcgQEAKIAlDaGVja09iamVjdEFQSShnZW5lcmF0ZWQsIG9mZiwgdHJ1ZSwgZmFpbCkKIAogCS8vIFdyaXRlIGdlbmVyYXRlZCBiZnVmZXIgb3V0IHRvIGEgZmlsZQotCWlmIGVyciA6PSBpb3V0aWwuV3JpdGVGaWxlKG91dERhdGErIi5zcCIsIGdlbmVyYXRlZFtvZmY6XSwgb3MuRmlsZU1vZGUoMDY0NCkpOyBlcnIgIT0gbmlsIHsKKwlpZiBlcnIgOj0gb3MuV3JpdGVGaWxlKG91dERhdGErIi5zcCIsIGdlbmVyYXRlZFtvZmY6XSwgb3MuRmlsZU1vZGUoMDY0NCkpOyBlcnIgIT0gbmlsIHsKIAkJZmFpbCgiZmFpbGVkIHRvIHdyaXRlIGZpbGU6ICVzIiwgZXJyKQogCX0KIH0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL2luY2x1ZGVfdGVzdDEvbW9kLnJzIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvaW5jbHVkZV90ZXN0MS9tb2QucnMKaW5kZXggM2E2YWZhOS4uY2E0ODk0ZCAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvaW5jbHVkZV90ZXN0MS9tb2QucnMKKysrIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvaW5jbHVkZV90ZXN0MS9tb2QucnMKQEAgLTEsNCArMSw1IEBACiAvLyBBdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBieSB0aGUgRmxhdGJ1ZmZlcnMgY29tcGlsZXIuIERvIG5vdCBtb2RpZnkuCisvLyBAZ2VuZXJhdGVkCiBwdWIgbW9kIG15X2dhbWUgewogICB1c2Ugc3VwZXI6Oio7CiAgIHB1YiBtb2Qgb3RoZXJfbmFtZV9zcGFjZSB7CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9pbmNsdWRlX3Rlc3QxL215X2dhbWUvb3RoZXJfbmFtZV9zcGFjZS9mcm9tX2luY2x1ZGVfZ2VuZXJhdGVkLnJzIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvaW5jbHVkZV90ZXN0MS9teV9nYW1lL290aGVyX25hbWVfc3BhY2UvZnJvbV9pbmNsdWRlX2dlbmVyYXRlZC5ycwppbmRleCAwNDhiYWZkLi4zYzUxNjVkIDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9pbmNsdWRlX3Rlc3QxL215X2dhbWUvb3RoZXJfbmFtZV9zcGFjZS9mcm9tX2luY2x1ZGVfZ2VuZXJhdGVkLnJzCisrKyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL2luY2x1ZGVfdGVzdDEvbXlfZ2FtZS9vdGhlcl9uYW1lX3NwYWNlL2Zyb21faW5jbHVkZV9nZW5lcmF0ZWQucnMKQEAgLTEsNyArMSwxMiBAQAogLy8gYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgYnkgdGhlIEZsYXRCdWZmZXJzIGNvbXBpbGVyLCBkbyBub3QgbW9kaWZ5CisvLyBAZ2VuZXJhdGVkCitleHRlcm4gY3JhdGUgYWxsb2M7CiBleHRlcm4gY3JhdGUgZmxhdGJ1ZmZlcnM7Ci11c2Ugc3RkOjptZW07Ci11c2Ugc3RkOjpjbXA6Ok9yZGVyaW5nOwordXNlIGFsbG9jOjpib3hlZDo6Qm94OwordXNlIGFsbG9jOjpzdHJpbmc6OntTdHJpbmcsIFRvU3RyaW5nfTsKK3VzZSBhbGxvYzo6dmVjOjpWZWM7Cit1c2UgY29yZTo6bWVtOwordXNlIGNvcmU6OmNtcDo6T3JkZXJpbmc7CiB1c2Ugc2VsZjo6ZmxhdGJ1ZmZlcnM6OntFbmRpYW5TY2FsYXIsIEZvbGxvd307CiB1c2Ugc3VwZXI6Oio7CiAjW2RlcHJlY2F0ZWQoc2luY2UgPSAiMi4wLjAiLCBub3RlID0gIlVzZSBhc3NvY2lhdGVkIGNvbnN0YW50cyBpbnN0ZWFkLiBUaGlzIHdpbGwgbm8gbG9uZ2VyIGJlIGdlbmVyYXRlZCBpbiAyMDIxLiIpXQpAQCAtMzQsOCArMzksOCBAQAogICAgIH0KICAgfQogfQotaW1wbCBzdGQ6OmZtdDo6RGVidWcgZm9yIEZyb21JbmNsdWRlIHsKLSAgZm4gZm10KCZzZWxmLCBmOiAmbXV0IHN0ZDo6Zm10OjpGb3JtYXR0ZXIpIC0+IHN0ZDo6Zm10OjpSZXN1bHQgeworaW1wbCBjb3JlOjpmbXQ6OkRlYnVnIGZvciBGcm9tSW5jbHVkZSB7CisgIGZuIGZtdCgmc2VsZiwgZjogJm11dCBjb3JlOjpmbXQ6OkZvcm1hdHRlcikgLT4gY29yZTo6Zm10OjpSZXN1bHQgewogICAgIGlmIGxldCBTb21lKG5hbWUpID0gc2VsZi52YXJpYW50X25hbWUoKSB7CiAgICAgICBmLndyaXRlX3N0cihuYW1lKQogICAgIH0gZWxzZSB7CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9pbmNsdWRlX3Rlc3QxL215X2dhbWUvb3RoZXJfbmFtZV9zcGFjZS90YWJsZV9iX2dlbmVyYXRlZC5ycyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL2luY2x1ZGVfdGVzdDEvbXlfZ2FtZS9vdGhlcl9uYW1lX3NwYWNlL3RhYmxlX2JfZ2VuZXJhdGVkLnJzCmluZGV4IDQ2YTk5Y2IuLmRhN2I5MzcgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL2luY2x1ZGVfdGVzdDEvbXlfZ2FtZS9vdGhlcl9uYW1lX3NwYWNlL3RhYmxlX2JfZ2VuZXJhdGVkLnJzCisrKyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL2luY2x1ZGVfdGVzdDEvbXlfZ2FtZS9vdGhlcl9uYW1lX3NwYWNlL3RhYmxlX2JfZ2VuZXJhdGVkLnJzCkBAIC0xLDcgKzEsMTIgQEAKIC8vIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGJ5IHRoZSBGbGF0QnVmZmVycyBjb21waWxlciwgZG8gbm90IG1vZGlmeQorLy8gQGdlbmVyYXRlZAorZXh0ZXJuIGNyYXRlIGFsbG9jOwogZXh0ZXJuIGNyYXRlIGZsYXRidWZmZXJzOwotdXNlIHN0ZDo6bWVtOwotdXNlIHN0ZDo6Y21wOjpPcmRlcmluZzsKK3VzZSBhbGxvYzo6Ym94ZWQ6OkJveDsKK3VzZSBhbGxvYzo6c3RyaW5nOjp7U3RyaW5nLCBUb1N0cmluZ307Cit1c2UgYWxsb2M6OnZlYzo6VmVjOwordXNlIGNvcmU6Om1lbTsKK3VzZSBjb3JlOjpjbXA6Ok9yZGVyaW5nOwogdXNlIHNlbGY6OmZsYXRidWZmZXJzOjp7RW5kaWFuU2NhbGFyLCBGb2xsb3d9OwogdXNlIHN1cGVyOjoqOwogcHViIGVudW0gVGFibGVCT2Zmc2V0IHt9CkBAIC0xMDMsOCArMTA4LDggQEAKICAgfQogfQogCi1pbXBsIHN0ZDo6Zm10OjpEZWJ1ZyBmb3IgVGFibGVCPCdfPiB7Ci0gIGZuIGZtdCgmc2VsZiwgZjogJm11dCBzdGQ6OmZtdDo6Rm9ybWF0dGVyPCdfPikgLT4gc3RkOjpmbXQ6OlJlc3VsdCB7CitpbXBsIGNvcmU6OmZtdDo6RGVidWcgZm9yIFRhYmxlQjwnXz4geworICBmbiBmbXQoJnNlbGYsIGY6ICZtdXQgY29yZTo6Zm10OjpGb3JtYXR0ZXI8J18+KSAtPiBjb3JlOjpmbXQ6OlJlc3VsdCB7CiAgICAgbGV0IG11dCBkcyA9IGYuZGVidWdfc3RydWN0KCJUYWJsZUIiKTsKICAgICAgIGRzLmZpZWxkKCJhIiwgJnNlbGYuYSgpKTsKICAgICAgIGRzLmZpbmlzaCgpCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9pbmNsdWRlX3Rlc3QxL215X2dhbWUvb3RoZXJfbmFtZV9zcGFjZS91bnVzZWRfZ2VuZXJhdGVkLnJzIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvaW5jbHVkZV90ZXN0MS9teV9nYW1lL290aGVyX25hbWVfc3BhY2UvdW51c2VkX2dlbmVyYXRlZC5ycwppbmRleCAxZGM1OTEzLi4xZTRhZDljIDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9pbmNsdWRlX3Rlc3QxL215X2dhbWUvb3RoZXJfbmFtZV9zcGFjZS91bnVzZWRfZ2VuZXJhdGVkLnJzCisrKyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL2luY2x1ZGVfdGVzdDEvbXlfZ2FtZS9vdGhlcl9uYW1lX3NwYWNlL3VudXNlZF9nZW5lcmF0ZWQucnMKQEAgLTEsNyArMSwxMiBAQAogLy8gYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgYnkgdGhlIEZsYXRCdWZmZXJzIGNvbXBpbGVyLCBkbyBub3QgbW9kaWZ5CisvLyBAZ2VuZXJhdGVkCitleHRlcm4gY3JhdGUgYWxsb2M7CiBleHRlcm4gY3JhdGUgZmxhdGJ1ZmZlcnM7Ci11c2Ugc3RkOjptZW07Ci11c2Ugc3RkOjpjbXA6Ok9yZGVyaW5nOwordXNlIGFsbG9jOjpib3hlZDo6Qm94OwordXNlIGFsbG9jOjpzdHJpbmc6OntTdHJpbmcsIFRvU3RyaW5nfTsKK3VzZSBhbGxvYzo6dmVjOjpWZWM7Cit1c2UgY29yZTo6bWVtOwordXNlIGNvcmU6OmNtcDo6T3JkZXJpbmc7CiB1c2Ugc2VsZjo6ZmxhdGJ1ZmZlcnM6OntFbmRpYW5TY2FsYXIsIEZvbGxvd307CiB1c2Ugc3VwZXI6Oio7CiAvLyBzdHJ1Y3QgVW51c2VkLCBhbGlnbmVkIHRvIDQKQEAgLTEzLDggKzE4LDggQEAKICAgICBTZWxmKFswOyA0XSkKICAgfQogfQotaW1wbCBzdGQ6OmZtdDo6RGVidWcgZm9yIFVudXNlZCB7Ci0gIGZuIGZtdCgmc2VsZiwgZjogJm11dCBzdGQ6OmZtdDo6Rm9ybWF0dGVyKSAtPiBzdGQ6OmZtdDo6UmVzdWx0IHsKK2ltcGwgY29yZTo6Zm10OjpEZWJ1ZyBmb3IgVW51c2VkIHsKKyAgZm4gZm10KCZzZWxmLCBmOiAmbXV0IGNvcmU6OmZtdDo6Rm9ybWF0dGVyKSAtPiBjb3JlOjpmbXQ6OlJlc3VsdCB7CiAgICAgZi5kZWJ1Z19zdHJ1Y3QoIlVudXNlZCIpCiAgICAgICAuZmllbGQoImEiLCAmc2VsZi5hKCkpCiAgICAgICAuZmluaXNoKCkKQEAgLTQyLDcgKzQ3LDcgQEAKICAgICAjW2lubGluZV0KICAgICBmbiBwdXNoKCZzZWxmLCBkc3Q6ICZtdXQgW3U4XSwgX3Jlc3Q6ICZbdThdKSB7CiAgICAgICAgIGxldCBzcmMgPSB1bnNhZmUgewotICAgICAgICAgICAgOjpzdGQ6OnNsaWNlOjpmcm9tX3Jhd19wYXJ0cyhzZWxmIGFzICpjb25zdCBVbnVzZWQgYXMgKmNvbnN0IHU4LCBTZWxmOjpzaXplKCkpCisgICAgICAgICAgICA6OmNvcmU6OnNsaWNlOjpmcm9tX3Jhd19wYXJ0cyhzZWxmIGFzICpjb25zdCBVbnVzZWQgYXMgKmNvbnN0IHU4LCBTZWxmOjpzaXplKCkpCiAgICAgICAgIH07CiAgICAgICAgIGRzdC5jb3B5X2Zyb21fc2xpY2Uoc3JjKTsKICAgICB9CkBAIC01Myw3ICs1OCw3IEBACiAgICAgI1tpbmxpbmVdCiAgICAgZm4gcHVzaCgmc2VsZiwgZHN0OiAmbXV0IFt1OF0sIF9yZXN0OiAmW3U4XSkgewogICAgICAgICBsZXQgc3JjID0gdW5zYWZlIHsKLSAgICAgICAgICAgIDo6c3RkOjpzbGljZTo6ZnJvbV9yYXdfcGFydHMoKnNlbGYgYXMgKmNvbnN0IFVudXNlZCBhcyAqY29uc3QgdTgsIFNlbGY6OnNpemUoKSkKKyAgICAgICAgICAgIDo6Y29yZTo6c2xpY2U6OmZyb21fcmF3X3BhcnRzKCpzZWxmIGFzICpjb25zdCBVbnVzZWQgYXMgKmNvbnN0IHU4LCBTZWxmOjpzaXplKCkpCiAgICAgICAgIH07CiAgICAgICAgIGRzdC5jb3B5X2Zyb21fc2xpY2Uoc3JjKTsKICAgICB9CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9pbmNsdWRlX3Rlc3QxL3RhYmxlX2FfZ2VuZXJhdGVkLnJzIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvaW5jbHVkZV90ZXN0MS90YWJsZV9hX2dlbmVyYXRlZC5ycwppbmRleCA5MTg4YjI5Li4wZTZhNzhkIDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9pbmNsdWRlX3Rlc3QxL3RhYmxlX2FfZ2VuZXJhdGVkLnJzCisrKyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL2luY2x1ZGVfdGVzdDEvdGFibGVfYV9nZW5lcmF0ZWQucnMKQEAgLTEsNyArMSwxMiBAQAogLy8gYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgYnkgdGhlIEZsYXRCdWZmZXJzIGNvbXBpbGVyLCBkbyBub3QgbW9kaWZ5CisvLyBAZ2VuZXJhdGVkCitleHRlcm4gY3JhdGUgYWxsb2M7CiBleHRlcm4gY3JhdGUgZmxhdGJ1ZmZlcnM7Ci11c2Ugc3RkOjptZW07Ci11c2Ugc3RkOjpjbXA6Ok9yZGVyaW5nOwordXNlIGFsbG9jOjpib3hlZDo6Qm94OwordXNlIGFsbG9jOjpzdHJpbmc6OntTdHJpbmcsIFRvU3RyaW5nfTsKK3VzZSBhbGxvYzo6dmVjOjpWZWM7Cit1c2UgY29yZTo6bWVtOwordXNlIGNvcmU6OmNtcDo6T3JkZXJpbmc7CiB1c2Ugc2VsZjo6ZmxhdGJ1ZmZlcnM6OntFbmRpYW5TY2FsYXIsIEZvbGxvd307CiB1c2Ugc3VwZXI6Oio7CiBwdWIgZW51bSBUYWJsZUFPZmZzZXQge30KQEAgLTEwMyw4ICsxMDgsOCBAQAogICB9CiB9CiAKLWltcGwgc3RkOjpmbXQ6OkRlYnVnIGZvciBUYWJsZUE8J18+IHsKLSAgZm4gZm10KCZzZWxmLCBmOiAmbXV0IHN0ZDo6Zm10OjpGb3JtYXR0ZXI8J18+KSAtPiBzdGQ6OmZtdDo6UmVzdWx0IHsKK2ltcGwgY29yZTo6Zm10OjpEZWJ1ZyBmb3IgVGFibGVBPCdfPiB7CisgIGZuIGZtdCgmc2VsZiwgZjogJm11dCBjb3JlOjpmbXQ6OkZvcm1hdHRlcjwnXz4pIC0+IGNvcmU6OmZtdDo6UmVzdWx0IHsKICAgICBsZXQgbXV0IGRzID0gZi5kZWJ1Z19zdHJ1Y3QoIlRhYmxlQSIpOwogICAgICAgZHMuZmllbGQoImIiLCAmc2VsZi5iKCkpOwogICAgICAgZHMuZmluaXNoKCkKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL2luY2x1ZGVfdGVzdDIvbW9kLnJzIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvaW5jbHVkZV90ZXN0Mi9tb2QucnMKaW5kZXggM2E2YWZhOS4uY2E0ODk0ZCAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvaW5jbHVkZV90ZXN0Mi9tb2QucnMKKysrIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvaW5jbHVkZV90ZXN0Mi9tb2QucnMKQEAgLTEsNCArMSw1IEBACiAvLyBBdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBieSB0aGUgRmxhdGJ1ZmZlcnMgY29tcGlsZXIuIERvIG5vdCBtb2RpZnkuCisvLyBAZ2VuZXJhdGVkCiBwdWIgbW9kIG15X2dhbWUgewogICB1c2Ugc3VwZXI6Oio7CiAgIHB1YiBtb2Qgb3RoZXJfbmFtZV9zcGFjZSB7CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9pbmNsdWRlX3Rlc3QyL215X2dhbWUvb3RoZXJfbmFtZV9zcGFjZS9mcm9tX2luY2x1ZGVfZ2VuZXJhdGVkLnJzIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvaW5jbHVkZV90ZXN0Mi9teV9nYW1lL290aGVyX25hbWVfc3BhY2UvZnJvbV9pbmNsdWRlX2dlbmVyYXRlZC5ycwppbmRleCAwNDhiYWZkLi4zYzUxNjVkIDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9pbmNsdWRlX3Rlc3QyL215X2dhbWUvb3RoZXJfbmFtZV9zcGFjZS9mcm9tX2luY2x1ZGVfZ2VuZXJhdGVkLnJzCisrKyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL2luY2x1ZGVfdGVzdDIvbXlfZ2FtZS9vdGhlcl9uYW1lX3NwYWNlL2Zyb21faW5jbHVkZV9nZW5lcmF0ZWQucnMKQEAgLTEsNyArMSwxMiBAQAogLy8gYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgYnkgdGhlIEZsYXRCdWZmZXJzIGNvbXBpbGVyLCBkbyBub3QgbW9kaWZ5CisvLyBAZ2VuZXJhdGVkCitleHRlcm4gY3JhdGUgYWxsb2M7CiBleHRlcm4gY3JhdGUgZmxhdGJ1ZmZlcnM7Ci11c2Ugc3RkOjptZW07Ci11c2Ugc3RkOjpjbXA6Ok9yZGVyaW5nOwordXNlIGFsbG9jOjpib3hlZDo6Qm94OwordXNlIGFsbG9jOjpzdHJpbmc6OntTdHJpbmcsIFRvU3RyaW5nfTsKK3VzZSBhbGxvYzo6dmVjOjpWZWM7Cit1c2UgY29yZTo6bWVtOwordXNlIGNvcmU6OmNtcDo6T3JkZXJpbmc7CiB1c2Ugc2VsZjo6ZmxhdGJ1ZmZlcnM6OntFbmRpYW5TY2FsYXIsIEZvbGxvd307CiB1c2Ugc3VwZXI6Oio7CiAjW2RlcHJlY2F0ZWQoc2luY2UgPSAiMi4wLjAiLCBub3RlID0gIlVzZSBhc3NvY2lhdGVkIGNvbnN0YW50cyBpbnN0ZWFkLiBUaGlzIHdpbGwgbm8gbG9uZ2VyIGJlIGdlbmVyYXRlZCBpbiAyMDIxLiIpXQpAQCAtMzQsOCArMzksOCBAQAogICAgIH0KICAgfQogfQotaW1wbCBzdGQ6OmZtdDo6RGVidWcgZm9yIEZyb21JbmNsdWRlIHsKLSAgZm4gZm10KCZzZWxmLCBmOiAmbXV0IHN0ZDo6Zm10OjpGb3JtYXR0ZXIpIC0+IHN0ZDo6Zm10OjpSZXN1bHQgeworaW1wbCBjb3JlOjpmbXQ6OkRlYnVnIGZvciBGcm9tSW5jbHVkZSB7CisgIGZuIGZtdCgmc2VsZiwgZjogJm11dCBjb3JlOjpmbXQ6OkZvcm1hdHRlcikgLT4gY29yZTo6Zm10OjpSZXN1bHQgewogICAgIGlmIGxldCBTb21lKG5hbWUpID0gc2VsZi52YXJpYW50X25hbWUoKSB7CiAgICAgICBmLndyaXRlX3N0cihuYW1lKQogICAgIH0gZWxzZSB7CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9pbmNsdWRlX3Rlc3QyL215X2dhbWUvb3RoZXJfbmFtZV9zcGFjZS90YWJsZV9iX2dlbmVyYXRlZC5ycyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL2luY2x1ZGVfdGVzdDIvbXlfZ2FtZS9vdGhlcl9uYW1lX3NwYWNlL3RhYmxlX2JfZ2VuZXJhdGVkLnJzCmluZGV4IDQ2YTk5Y2IuLmRhN2I5MzcgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL2luY2x1ZGVfdGVzdDIvbXlfZ2FtZS9vdGhlcl9uYW1lX3NwYWNlL3RhYmxlX2JfZ2VuZXJhdGVkLnJzCisrKyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL2luY2x1ZGVfdGVzdDIvbXlfZ2FtZS9vdGhlcl9uYW1lX3NwYWNlL3RhYmxlX2JfZ2VuZXJhdGVkLnJzCkBAIC0xLDcgKzEsMTIgQEAKIC8vIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGJ5IHRoZSBGbGF0QnVmZmVycyBjb21waWxlciwgZG8gbm90IG1vZGlmeQorLy8gQGdlbmVyYXRlZAorZXh0ZXJuIGNyYXRlIGFsbG9jOwogZXh0ZXJuIGNyYXRlIGZsYXRidWZmZXJzOwotdXNlIHN0ZDo6bWVtOwotdXNlIHN0ZDo6Y21wOjpPcmRlcmluZzsKK3VzZSBhbGxvYzo6Ym94ZWQ6OkJveDsKK3VzZSBhbGxvYzo6c3RyaW5nOjp7U3RyaW5nLCBUb1N0cmluZ307Cit1c2UgYWxsb2M6OnZlYzo6VmVjOwordXNlIGNvcmU6Om1lbTsKK3VzZSBjb3JlOjpjbXA6Ok9yZGVyaW5nOwogdXNlIHNlbGY6OmZsYXRidWZmZXJzOjp7RW5kaWFuU2NhbGFyLCBGb2xsb3d9OwogdXNlIHN1cGVyOjoqOwogcHViIGVudW0gVGFibGVCT2Zmc2V0IHt9CkBAIC0xMDMsOCArMTA4LDggQEAKICAgfQogfQogCi1pbXBsIHN0ZDo6Zm10OjpEZWJ1ZyBmb3IgVGFibGVCPCdfPiB7Ci0gIGZuIGZtdCgmc2VsZiwgZjogJm11dCBzdGQ6OmZtdDo6Rm9ybWF0dGVyPCdfPikgLT4gc3RkOjpmbXQ6OlJlc3VsdCB7CitpbXBsIGNvcmU6OmZtdDo6RGVidWcgZm9yIFRhYmxlQjwnXz4geworICBmbiBmbXQoJnNlbGYsIGY6ICZtdXQgY29yZTo6Zm10OjpGb3JtYXR0ZXI8J18+KSAtPiBjb3JlOjpmbXQ6OlJlc3VsdCB7CiAgICAgbGV0IG11dCBkcyA9IGYuZGVidWdfc3RydWN0KCJUYWJsZUIiKTsKICAgICAgIGRzLmZpZWxkKCJhIiwgJnNlbGYuYSgpKTsKICAgICAgIGRzLmZpbmlzaCgpCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9pbmNsdWRlX3Rlc3QyL215X2dhbWUvb3RoZXJfbmFtZV9zcGFjZS91bnVzZWRfZ2VuZXJhdGVkLnJzIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvaW5jbHVkZV90ZXN0Mi9teV9nYW1lL290aGVyX25hbWVfc3BhY2UvdW51c2VkX2dlbmVyYXRlZC5ycwppbmRleCAxZGM1OTEzLi4xZTRhZDljIDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9pbmNsdWRlX3Rlc3QyL215X2dhbWUvb3RoZXJfbmFtZV9zcGFjZS91bnVzZWRfZ2VuZXJhdGVkLnJzCisrKyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL2luY2x1ZGVfdGVzdDIvbXlfZ2FtZS9vdGhlcl9uYW1lX3NwYWNlL3VudXNlZF9nZW5lcmF0ZWQucnMKQEAgLTEsNyArMSwxMiBAQAogLy8gYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgYnkgdGhlIEZsYXRCdWZmZXJzIGNvbXBpbGVyLCBkbyBub3QgbW9kaWZ5CisvLyBAZ2VuZXJhdGVkCitleHRlcm4gY3JhdGUgYWxsb2M7CiBleHRlcm4gY3JhdGUgZmxhdGJ1ZmZlcnM7Ci11c2Ugc3RkOjptZW07Ci11c2Ugc3RkOjpjbXA6Ok9yZGVyaW5nOwordXNlIGFsbG9jOjpib3hlZDo6Qm94OwordXNlIGFsbG9jOjpzdHJpbmc6OntTdHJpbmcsIFRvU3RyaW5nfTsKK3VzZSBhbGxvYzo6dmVjOjpWZWM7Cit1c2UgY29yZTo6bWVtOwordXNlIGNvcmU6OmNtcDo6T3JkZXJpbmc7CiB1c2Ugc2VsZjo6ZmxhdGJ1ZmZlcnM6OntFbmRpYW5TY2FsYXIsIEZvbGxvd307CiB1c2Ugc3VwZXI6Oio7CiAvLyBzdHJ1Y3QgVW51c2VkLCBhbGlnbmVkIHRvIDQKQEAgLTEzLDggKzE4LDggQEAKICAgICBTZWxmKFswOyA0XSkKICAgfQogfQotaW1wbCBzdGQ6OmZtdDo6RGVidWcgZm9yIFVudXNlZCB7Ci0gIGZuIGZtdCgmc2VsZiwgZjogJm11dCBzdGQ6OmZtdDo6Rm9ybWF0dGVyKSAtPiBzdGQ6OmZtdDo6UmVzdWx0IHsKK2ltcGwgY29yZTo6Zm10OjpEZWJ1ZyBmb3IgVW51c2VkIHsKKyAgZm4gZm10KCZzZWxmLCBmOiAmbXV0IGNvcmU6OmZtdDo6Rm9ybWF0dGVyKSAtPiBjb3JlOjpmbXQ6OlJlc3VsdCB7CiAgICAgZi5kZWJ1Z19zdHJ1Y3QoIlVudXNlZCIpCiAgICAgICAuZmllbGQoImEiLCAmc2VsZi5hKCkpCiAgICAgICAuZmluaXNoKCkKQEAgLTQyLDcgKzQ3LDcgQEAKICAgICAjW2lubGluZV0KICAgICBmbiBwdXNoKCZzZWxmLCBkc3Q6ICZtdXQgW3U4XSwgX3Jlc3Q6ICZbdThdKSB7CiAgICAgICAgIGxldCBzcmMgPSB1bnNhZmUgewotICAgICAgICAgICAgOjpzdGQ6OnNsaWNlOjpmcm9tX3Jhd19wYXJ0cyhzZWxmIGFzICpjb25zdCBVbnVzZWQgYXMgKmNvbnN0IHU4LCBTZWxmOjpzaXplKCkpCisgICAgICAgICAgICA6OmNvcmU6OnNsaWNlOjpmcm9tX3Jhd19wYXJ0cyhzZWxmIGFzICpjb25zdCBVbnVzZWQgYXMgKmNvbnN0IHU4LCBTZWxmOjpzaXplKCkpCiAgICAgICAgIH07CiAgICAgICAgIGRzdC5jb3B5X2Zyb21fc2xpY2Uoc3JjKTsKICAgICB9CkBAIC01Myw3ICs1OCw3IEBACiAgICAgI1tpbmxpbmVdCiAgICAgZm4gcHVzaCgmc2VsZiwgZHN0OiAmbXV0IFt1OF0sIF9yZXN0OiAmW3U4XSkgewogICAgICAgICBsZXQgc3JjID0gdW5zYWZlIHsKLSAgICAgICAgICAgIDo6c3RkOjpzbGljZTo6ZnJvbV9yYXdfcGFydHMoKnNlbGYgYXMgKmNvbnN0IFVudXNlZCBhcyAqY29uc3QgdTgsIFNlbGY6OnNpemUoKSkKKyAgICAgICAgICAgIDo6Y29yZTo6c2xpY2U6OmZyb21fcmF3X3BhcnRzKCpzZWxmIGFzICpjb25zdCBVbnVzZWQgYXMgKmNvbnN0IHU4LCBTZWxmOjpzaXplKCkpCiAgICAgICAgIH07CiAgICAgICAgIGRzdC5jb3B5X2Zyb21fc2xpY2Uoc3JjKTsKICAgICB9CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9pbmNsdWRlX3Rlc3QyL3RhYmxlX2FfZ2VuZXJhdGVkLnJzIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvaW5jbHVkZV90ZXN0Mi90YWJsZV9hX2dlbmVyYXRlZC5ycwppbmRleCA5MTg4YjI5Li4wZTZhNzhkIDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9pbmNsdWRlX3Rlc3QyL3RhYmxlX2FfZ2VuZXJhdGVkLnJzCisrKyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL2luY2x1ZGVfdGVzdDIvdGFibGVfYV9nZW5lcmF0ZWQucnMKQEAgLTEsNyArMSwxMiBAQAogLy8gYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgYnkgdGhlIEZsYXRCdWZmZXJzIGNvbXBpbGVyLCBkbyBub3QgbW9kaWZ5CisvLyBAZ2VuZXJhdGVkCitleHRlcm4gY3JhdGUgYWxsb2M7CiBleHRlcm4gY3JhdGUgZmxhdGJ1ZmZlcnM7Ci11c2Ugc3RkOjptZW07Ci11c2Ugc3RkOjpjbXA6Ok9yZGVyaW5nOwordXNlIGFsbG9jOjpib3hlZDo6Qm94OwordXNlIGFsbG9jOjpzdHJpbmc6OntTdHJpbmcsIFRvU3RyaW5nfTsKK3VzZSBhbGxvYzo6dmVjOjpWZWM7Cit1c2UgY29yZTo6bWVtOwordXNlIGNvcmU6OmNtcDo6T3JkZXJpbmc7CiB1c2Ugc2VsZjo6ZmxhdGJ1ZmZlcnM6OntFbmRpYW5TY2FsYXIsIEZvbGxvd307CiB1c2Ugc3VwZXI6Oio7CiBwdWIgZW51bSBUYWJsZUFPZmZzZXQge30KQEAgLTEwMyw4ICsxMDgsOCBAQAogICB9CiB9CiAKLWltcGwgc3RkOjpmbXQ6OkRlYnVnIGZvciBUYWJsZUE8J18+IHsKLSAgZm4gZm10KCZzZWxmLCBmOiAmbXV0IHN0ZDo6Zm10OjpGb3JtYXR0ZXI8J18+KSAtPiBzdGQ6OmZtdDo6UmVzdWx0IHsKK2ltcGwgY29yZTo6Zm10OjpEZWJ1ZyBmb3IgVGFibGVBPCdfPiB7CisgIGZuIGZtdCgmc2VsZiwgZjogJm11dCBjb3JlOjpmbXQ6OkZvcm1hdHRlcjwnXz4pIC0+IGNvcmU6OmZtdDo6UmVzdWx0IHsKICAgICBsZXQgbXV0IGRzID0gZi5kZWJ1Z19zdHJ1Y3QoIlRhYmxlQSIpOwogICAgICAgZHMuZmllbGQoImIiLCAmc2VsZi5iKCkpOwogICAgICAgZHMuZmluaXNoKCkKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL2lzX3F1aWV0X25hbi5oIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvaXNfcXVpZXRfbmFuLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmQzMWMzZAotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL2lzX3F1aWV0X25hbi5oCkBAIC0wLDAgKzEsNDEgQEAKKyNpZm5kZWYgVEVTVFNfSVNfUVVJRVRfTkFOX0gKKyNkZWZpbmUgVEVTVFNfSVNfUVVJRVRfTkFOX0gKKworbmFtZXNwYWNlIGZsYXRidWZmZXJzIHsKK25hbWVzcGFjZSB0ZXN0cyB7CisKKyNpZiBkZWZpbmVkKEZMQVRCVUZGRVJTX0hBU19ORVdfU1RSVE9EKSAmJiAoRkxBVEJVRkZFUlNfSEFTX05FV19TVFJUT0QgPiAwKQorLy8gVGhlIElFRUUtNzU0IHF1aWV0X05hTiBpcyBub3Qgc2ltcGxlIGJpbmFyeSBjb25zdGFudC4KKy8vIEFsbCBiaW5hcnkgTmFOIGJpdCBzdHJpbmdzIGhhdmUgYWxsIHRoZSBiaXRzIG9mIHRoZSBiaWFzZWQgZXhwb25lbnQgZmllbGQgRQorLy8gc2V0IHRvIDEuIEEgcXVpZXQgTmFOIGJpdCBzdHJpbmcgc2hvdWxkIGJlIGVuY29kZWQgd2l0aCB0aGUgZmlyc3QgYml0IGRbMV0KKy8vIG9mIHRoZSB0cmFpbGluZyBzaWduaWZpY2FuZCBmaWVsZCBUIGJlaW5nIDEgKGRbMF0gaXMgaW1wbGljaXQgYml0KS4KKy8vIEl0IGlzIGFzc3VtZWQgdGhhdCBlbmRpYW5uZXNzIG9mIGZsb2F0aW5nLXBvaW50IGlzIHNhbWUgYXMgaW50ZWdlci4KK3RlbXBsYXRlPHR5cGVuYW1lIFQsIHR5cGVuYW1lIFUsIFUgcW5hbl9iYXNlPiBib29sIGlzX3F1aWV0X25hbl9pbXBsKFQgdikgeworICBzdGF0aWNfYXNzZXJ0KHNpemVvZihUKSA9PSBzaXplb2YoVSksICJ1bmV4cGVjdGVkIik7CisgIFUgYiA9IDA7CisgIHN0ZDo6bWVtY3B5KCZiLCAmdiwgc2l6ZW9mKFQpKTsKKyAgcmV0dXJuICgoYiAmIHFuYW5fYmFzZSkgPT0gcW5hbl9iYXNlKTsKK30KKyMgIGlmIGRlZmluZWQoX19taXBzX18pIHx8IGRlZmluZWQoX19ocHBhX18pCitpbmxpbmUgYm9vbCBpc19xdWlldF9uYW4oZmxvYXQgdikgeworICByZXR1cm4gaXNfcXVpZXRfbmFuX2ltcGw8ZmxvYXQsIHVpbnQzMl90LCAweDdGQzAwMDAwdT4odikgfHwKKyAgICAgICAgIGlzX3F1aWV0X25hbl9pbXBsPGZsb2F0LCB1aW50MzJfdCwgMHg3RkJGRkZGRnU+KHYpOworfQoraW5saW5lIGJvb2wgaXNfcXVpZXRfbmFuKGRvdWJsZSB2KSB7CisgIHJldHVybiBpc19xdWlldF9uYW5faW1wbDxkb3VibGUsIHVpbnQ2NF90LCAweDdGRjgwMDAwMDAwMDAwMDB1bD4odikgfHwKKyAgICAgICAgIGlzX3F1aWV0X25hbl9pbXBsPGRvdWJsZSwgdWludDY0X3QsIDB4N0ZGN0ZGRkZGRkZGRkZGRnU+KHYpOworfQorIyAgZWxzZQoraW5saW5lIGJvb2wgaXNfcXVpZXRfbmFuKGZsb2F0IHYpIHsKKyAgcmV0dXJuIGlzX3F1aWV0X25hbl9pbXBsPGZsb2F0LCB1aW50MzJfdCwgMHg3RkMwMDAwMHU+KHYpOworfQoraW5saW5lIGJvb2wgaXNfcXVpZXRfbmFuKGRvdWJsZSB2KSB7CisgIHJldHVybiBpc19xdWlldF9uYW5faW1wbDxkb3VibGUsIHVpbnQ2NF90LCAweDdGRjgwMDAwMDAwMDAwMDB1bD4odik7Cit9CisjICBlbmRpZgorI2VuZGlmCisKK30gIC8vIG5hbWVzcGFjZSB0ZXN0cworfSAgLy8gbmFtZXNwYWNlIGZsYXRidWZmZXJzCisKKyNlbmRpZiAgLy8gVEVTVFNfSVNfUVVJRVRfTkFOX0gKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL2pzb25fdGVzdC5jcHAgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9qc29uX3Rlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZkNDA2NGYKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9qc29uX3Rlc3QuY3BwCkBAIC0wLDAgKzEsMTc0IEBACisjaW5jbHVkZSAianNvbl90ZXN0LmgiCisKKyNpbmNsdWRlICJmbGF0YnVmZmVycy9mbGF0YnVmZmVycy5oIgorI2luY2x1ZGUgImZsYXRidWZmZXJzL2lkbC5oIgorI2luY2x1ZGUgIm1vbnN0ZXJfdGVzdF9nZW5lcmF0ZWQuaCIKKyNpbmNsdWRlICJtb25zdGVyX3Rlc3RfYmZic19nZW5lcmF0ZWQuaCIgIAorI2luY2x1ZGUgIm9wdGlvbmFsX3NjYWxhcnNfZ2VuZXJhdGVkLmgiCisjaW5jbHVkZSAidGVzdF9hc3NlcnQuaCIKKworbmFtZXNwYWNlIGZsYXRidWZmZXJzIHsKK25hbWVzcGFjZSB0ZXN0cyB7CisKK3VzaW5nIG5hbWVzcGFjZSBNeUdhbWU6OkV4YW1wbGU7CisKKy8vIENoZWNrIHN0cmluZ2lmeSBvZiBhbiBkZWZhdWx0IGVudW0gdmFsdWUgdG8ganNvbgordm9pZCBKc29uRGVmYXVsdFRlc3QoY29uc3Qgc3RkOjpzdHJpbmcmIHRlc3RzX2RhdGFfcGF0aCkgeworICAvLyBsb2FkIEZsYXRCdWZmZXIgc2NoZW1hICguZmJzKSBmcm9tIGRpc2sKKyAgc3RkOjpzdHJpbmcgc2NoZW1hZmlsZTsKKyAgVEVTVF9FUShmbGF0YnVmZmVyczo6TG9hZEZpbGUoKHRlc3RzX2RhdGFfcGF0aCArICJtb25zdGVyX3Rlc3QuZmJzIikuY19zdHIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UsICZzY2hlbWFmaWxlKSwKKyAgICAgICAgICB0cnVlKTsKKyAgLy8gcGFyc2Ugc2NoZW1hIGZpcnN0LCBzbyB3ZSBjYW4gdXNlIGl0IHRvIHBhcnNlIHRoZSBkYXRhIGFmdGVyCisgIGZsYXRidWZmZXJzOjpQYXJzZXIgcGFyc2VyOworICBhdXRvIGluY2x1ZGVfdGVzdF9wYXRoID0KKyAgICAgIGZsYXRidWZmZXJzOjpDb25DYXRQYXRoRmlsZU5hbWUodGVzdHNfZGF0YV9wYXRoLCAiaW5jbHVkZV90ZXN0Iik7CisgIGNvbnN0IGNoYXIgKmluY2x1ZGVfZGlyZWN0b3JpZXNbXSA9IHsgdGVzdHNfZGF0YV9wYXRoLmNfc3RyKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5jbHVkZV90ZXN0X3BhdGguY19zdHIoKSwgbnVsbHB0ciB9OworCisgIFRFU1RfRVEocGFyc2VyLlBhcnNlKHNjaGVtYWZpbGUuY19zdHIoKSwgaW5jbHVkZV9kaXJlY3RvcmllcyksIHRydWUpOworICAvLyBjcmVhdGUgaW5jb21wbGV0ZSBtb25zdGVyIGFuZCBzdG9yZSB0byBqc29uCisgIHBhcnNlci5vcHRzLm91dHB1dF9kZWZhdWx0X3NjYWxhcnNfaW5fanNvbiA9IHRydWU7CisgIHBhcnNlci5vcHRzLm91dHB1dF9lbnVtX2lkZW50aWZpZXJzID0gdHJ1ZTsKKyAgZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyIGJ1aWxkZXI7CisgIGF1dG8gbmFtZSA9IGJ1aWxkZXIuQ3JlYXRlU3RyaW5nKCJkZWZhdWx0X2VudW0iKTsKKyAgTW9uc3RlckJ1aWxkZXIgY29sb3JfbW9uc3RlcihidWlsZGVyKTsKKyAgY29sb3JfbW9uc3Rlci5hZGRfbmFtZShuYW1lKTsKKyAgRmluaXNoTW9uc3RlckJ1ZmZlcihidWlsZGVyLCBjb2xvcl9tb25zdGVyLkZpbmlzaCgpKTsKKyAgc3RkOjpzdHJpbmcganNvbmdlbjsKKyAgYXV0byByZXN1bHQgPSBHZW5lcmF0ZVRleHQocGFyc2VyLCBidWlsZGVyLkdldEJ1ZmZlclBvaW50ZXIoKSwgJmpzb25nZW4pOworICBURVNUX0VRKHJlc3VsdCwgdHJ1ZSk7CisgIC8vIGRlZmF1bHQgdmFsdWUgb2YgdGhlICJjb2xvciIgZmllbGQgaXMgQmx1ZQorICBURVNUX0VRKHN0ZDo6c3RyaW5nOjpucG9zICE9IGpzb25nZW4uZmluZCgiY29sb3I6IFwiQmx1ZVwiIiksIHRydWUpOworICAvLyBkZWZhdWx0IHZhbHVlIG9mIHRoZSAidGVzdGYiIGZpZWxkIGlzIDMuMTQxNTkKKyAgVEVTVF9FUShzdGQ6OnN0cmluZzo6bnBvcyAhPSBqc29uZ2VuLmZpbmQoInRlc3RmOiAzLjE0MTU5IiksIHRydWUpOworfQorCit2b2lkIEpzb25FbnVtc1Rlc3QoY29uc3Qgc3RkOjpzdHJpbmcmIHRlc3RzX2RhdGFfcGF0aCkgeworICAvLyBsb2FkIEZsYXRCdWZmZXIgc2NoZW1hICguZmJzKSBmcm9tIGRpc2sKKyAgc3RkOjpzdHJpbmcgc2NoZW1hZmlsZTsKKyAgVEVTVF9FUShmbGF0YnVmZmVyczo6TG9hZEZpbGUoKHRlc3RzX2RhdGFfcGF0aCArICJtb25zdGVyX3Rlc3QuZmJzIikuY19zdHIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UsICZzY2hlbWFmaWxlKSwKKyAgICAgICAgICB0cnVlKTsKKyAgLy8gcGFyc2Ugc2NoZW1hIGZpcnN0LCBzbyB3ZSBjYW4gdXNlIGl0IHRvIHBhcnNlIHRoZSBkYXRhIGFmdGVyCisgIGZsYXRidWZmZXJzOjpQYXJzZXIgcGFyc2VyOworICBhdXRvIGluY2x1ZGVfdGVzdF9wYXRoID0KKyAgICAgIGZsYXRidWZmZXJzOjpDb25DYXRQYXRoRmlsZU5hbWUodGVzdHNfZGF0YV9wYXRoLCAiaW5jbHVkZV90ZXN0Iik7CisgIGNvbnN0IGNoYXIgKmluY2x1ZGVfZGlyZWN0b3JpZXNbXSA9IHsgdGVzdHNfZGF0YV9wYXRoLmNfc3RyKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5jbHVkZV90ZXN0X3BhdGguY19zdHIoKSwgbnVsbHB0ciB9OworICBwYXJzZXIub3B0cy5vdXRwdXRfZW51bV9pZGVudGlmaWVycyA9IHRydWU7CisgIFRFU1RfRVEocGFyc2VyLlBhcnNlKHNjaGVtYWZpbGUuY19zdHIoKSwgaW5jbHVkZV9kaXJlY3RvcmllcyksIHRydWUpOworICBmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgYnVpbGRlcjsKKyAgYXV0byBuYW1lID0gYnVpbGRlci5DcmVhdGVTdHJpbmcoImJpdGZsYWdfZW51bSIpOworICBNb25zdGVyQnVpbGRlciBjb2xvcl9tb25zdGVyKGJ1aWxkZXIpOworICBjb2xvcl9tb25zdGVyLmFkZF9uYW1lKG5hbWUpOworICBjb2xvcl9tb25zdGVyLmFkZF9jb2xvcihDb2xvcihDb2xvcl9CbHVlIHwgQ29sb3JfUmVkKSk7CisgIEZpbmlzaE1vbnN0ZXJCdWZmZXIoYnVpbGRlciwgY29sb3JfbW9uc3Rlci5GaW5pc2goKSk7CisgIHN0ZDo6c3RyaW5nIGpzb25nZW47CisgIGF1dG8gcmVzdWx0ID0gR2VuZXJhdGVUZXh0KHBhcnNlciwgYnVpbGRlci5HZXRCdWZmZXJQb2ludGVyKCksICZqc29uZ2VuKTsKKyAgVEVTVF9FUShyZXN1bHQsIHRydWUpOworICBURVNUX0VRKHN0ZDo6c3RyaW5nOjpucG9zICE9IGpzb25nZW4uZmluZCgiY29sb3I6IFwiUmVkIEJsdWVcIiIpLCB0cnVlKTsKKyAgLy8gVGVzdCBmb3J3YXJkIGNvbXBhdGliaWxpdHkgd2l0aCAnb3V0cHV0X2VudW1faWRlbnRpZmllcnMgPSB0cnVlJy4KKyAgLy8gQ3VycmVudCBDb2xvciBkb2Vzbid0IGhhdmUgJygxdSA8PCAyKScgZmllbGQsIGxldCdzIGFkZCBpdC4KKyAgYnVpbGRlci5DbGVhcigpOworICBzdGQ6OnN0cmluZyBmdXR1cmVfanNvbjsKKyAgYXV0byBmdXR1cmVfbmFtZSA9IGJ1aWxkZXIuQ3JlYXRlU3RyaW5nKCJmdXR1cmUgYml0ZmxhZ19lbnVtIik7CisgIE1vbnN0ZXJCdWlsZGVyIGZ1dHVyZV9jb2xvcihidWlsZGVyKTsKKyAgZnV0dXJlX2NvbG9yLmFkZF9uYW1lKGZ1dHVyZV9uYW1lKTsKKyAgZnV0dXJlX2NvbG9yLmFkZF9jb2xvcigKKyAgICAgIHN0YXRpY19jYXN0PENvbG9yPigoMXUgPDwgMikgfCBDb2xvcl9CbHVlIHwgQ29sb3JfUmVkKSk7CisgIEZpbmlzaE1vbnN0ZXJCdWZmZXIoYnVpbGRlciwgZnV0dXJlX2NvbG9yLkZpbmlzaCgpKTsKKyAgcmVzdWx0ID0gR2VuZXJhdGVUZXh0KHBhcnNlciwgYnVpbGRlci5HZXRCdWZmZXJQb2ludGVyKCksICZmdXR1cmVfanNvbik7CisgIFRFU1RfRVEocmVzdWx0LCB0cnVlKTsKKyAgVEVTVF9FUShzdGQ6OnN0cmluZzo6bnBvcyAhPSBmdXR1cmVfanNvbi5maW5kKCJjb2xvcjogMTMiKSwgdHJ1ZSk7Cit9CisKK3ZvaWQgSnNvbk9wdGlvbmFsVGVzdChjb25zdCBzdGQ6OnN0cmluZyYgdGVzdHNfZGF0YV9wYXRoLCBib29sIGRlZmF1bHRfc2NhbGFycykgeworICAvLyBsb2FkIEZsYXRCdWZmZXIgc2NoZW1hICguZmJzKSBhbmQgSlNPTiBmcm9tIGRpc2sKKyAgc3RkOjpzdHJpbmcgc2NoZW1hZmlsZTsKKyAgc3RkOjpzdHJpbmcganNvbmZpbGU7CisgIFRFU1RfRVEoCisgICAgICBmbGF0YnVmZmVyczo6TG9hZEZpbGUoKHRlc3RzX2RhdGFfcGF0aCArICJvcHRpb25hbF9zY2FsYXJzLmZicyIpLmNfc3RyKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UsICZzY2hlbWFmaWxlKSwKKyAgICAgIHRydWUpOworICBURVNUX0VRKGZsYXRidWZmZXJzOjpMb2FkRmlsZSgodGVzdHNfZGF0YV9wYXRoICsgIm9wdGlvbmFsX3NjYWxhcnMiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChkZWZhdWx0X3NjYWxhcnMgPyAiX2RlZmF1bHRzIiA6ICIiKSArICIuanNvbiIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY19zdHIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UsICZqc29uZmlsZSksCisgICAgICAgICAgdHJ1ZSk7CisKKyAgYXV0byBpbmNsdWRlX3Rlc3RfcGF0aCA9CisgICAgICBmbGF0YnVmZmVyczo6Q29uQ2F0UGF0aEZpbGVOYW1lKHRlc3RzX2RhdGFfcGF0aCwgImluY2x1ZGVfdGVzdCIpOworICBjb25zdCBjaGFyICppbmNsdWRlX2RpcmVjdG9yaWVzW10gPSB7IHRlc3RzX2RhdGFfcGF0aC5jX3N0cigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluY2x1ZGVfdGVzdF9wYXRoLmNfc3RyKCksIG51bGxwdHIgfTsKKworICAvLyBwYXJzZSBzY2hlbWEgZmlyc3QsIHNvIHdlIGNhbiB1c2UgaXQgdG8gcGFyc2UgdGhlIGRhdGEgYWZ0ZXIKKyAgZmxhdGJ1ZmZlcnM6OlBhcnNlciBwYXJzZXI7CisgIHBhcnNlci5vcHRzLm91dHB1dF9kZWZhdWx0X3NjYWxhcnNfaW5fanNvbiA9IGRlZmF1bHRfc2NhbGFyczsKKyAgVEVTVF9FUShwYXJzZXIuUGFyc2Uoc2NoZW1hZmlsZS5jX3N0cigpLCBpbmNsdWRlX2RpcmVjdG9yaWVzKSwgdHJ1ZSk7CisgIFRFU1RfRVEocGFyc2VyLlBhcnNlSnNvbihqc29uZmlsZS5jX3N0cigpKSwgdHJ1ZSk7CisKKyAgLy8gaGVyZSwgcGFyc2VyLmJ1aWxkZXJfIGNvbnRhaW5zIGEgYmluYXJ5IGJ1ZmZlciB0aGF0IGlzIHRoZSBwYXJzZWQgZGF0YS4KKworICAvLyBGaXJzdCwgdmVyaWZ5IGl0LCBqdXN0IGluIGNhc2U6CisgIGZsYXRidWZmZXJzOjpWZXJpZmllciB2ZXJpZmllcihwYXJzZXIuYnVpbGRlcl8uR2V0QnVmZmVyUG9pbnRlcigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VyLmJ1aWxkZXJfLkdldFNpemUoKSk7CisgIFRFU1RfRVEob3B0aW9uYWxfc2NhbGFyczo6VmVyaWZ5U2NhbGFyU3R1ZmZCdWZmZXIodmVyaWZpZXIpLCB0cnVlKTsKKworICAvLyB0byBlbnN1cmUgaXQgaXMgY29ycmVjdCwgd2Ugbm93IGdlbmVyYXRlIHRleHQgYmFjayBmcm9tIHRoZSBiaW5hcnksCisgIC8vIGFuZCBjb21wYXJlIHRoZSB0d286CisgIHN0ZDo6c3RyaW5nIGpzb25nZW47CisgIGF1dG8gcmVzdWx0ID0KKyAgICAgIEdlbmVyYXRlVGV4dChwYXJzZXIsIHBhcnNlci5idWlsZGVyXy5HZXRCdWZmZXJQb2ludGVyKCksICZqc29uZ2VuKTsKKyAgVEVTVF9FUShyZXN1bHQsIHRydWUpOworICBURVNUX0VRX1NUUihqc29uZ2VuLmNfc3RyKCksIGpzb25maWxlLmNfc3RyKCkpOworfQorCit2b2lkIFBhcnNlSW5jb3JyZWN0TW9uc3Rlckpzb25UZXN0KGNvbnN0IHN0ZDo6c3RyaW5nJiB0ZXN0c19kYXRhX3BhdGgpIHsKKyAgc3RkOjpzdHJpbmcgc2NoZW1hZmlsZTsKKyAgVEVTVF9FUShmbGF0YnVmZmVyczo6TG9hZEZpbGUoKHRlc3RzX2RhdGFfcGF0aCArICJtb25zdGVyX3Rlc3QuYmZicyIpLmNfc3RyKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUsICZzY2hlbWFmaWxlKSwKKyAgICAgICAgICB0cnVlKTsKKyAgZmxhdGJ1ZmZlcnM6OlBhcnNlciBwYXJzZXI7CisgIGZsYXRidWZmZXJzOjpWZXJpZmllciB2ZXJpZmllcigKKyAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCAqPihzY2hlbWFmaWxlLmNfc3RyKCkpLCBzY2hlbWFmaWxlLnNpemUoKSk7CisgIFRFU1RfRVEocmVmbGVjdGlvbjo6VmVyaWZ5U2NoZW1hQnVmZmVyKHZlcmlmaWVyKSwgdHJ1ZSk7CisgIFRFU1RfRVEoCisgICAgICBwYXJzZXIuRGVzZXJpYWxpemUocmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90ICo+KHNjaGVtYWZpbGUuY19zdHIoKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgc2NoZW1hZmlsZS5zaXplKCkpLAorICAgICAgdHJ1ZSk7CisgIFRFU1RfRVEocGFyc2VyLlBhcnNlSnNvbigie25hbWU6XCJtb25zdGVyXCJ9IiksIHRydWUpOworICBURVNUX0VRKHBhcnNlci5QYXJzZUpzb24oIiIpLCBmYWxzZSk7CisgIFRFU1RfRVEocGFyc2VyLlBhcnNlSnNvbigie25hbWU6IDF9IiksIGZhbHNlKTsKKyAgVEVTVF9FUShwYXJzZXIuUGFyc2VKc29uKCJ7bmFtZTorMX0iKSwgZmFsc2UpOworICBURVNUX0VRKHBhcnNlci5QYXJzZUpzb24oIntuYW1lOi0xfSIpLCBmYWxzZSk7CisgIFRFU1RfRVEocGFyc2VyLlBhcnNlSnNvbigie25hbWU6LWZ9IiksIGZhbHNlKTsKKyAgVEVTVF9FUShwYXJzZXIuUGFyc2VKc29uKCJ7bmFtZTorZn0iKSwgZmFsc2UpOworfQorCit2b2lkIEpzb25VbnNvcnRlZEFycmF5VGVzdCgpIHsKKyAgZmxhdGJ1ZmZlcnM6OlBhcnNlciBwYXJzZXI7CisgIFRFU1RfRVEocGFyc2VyLkRlc2VyaWFsaXplKE15R2FtZTo6RXhhbXBsZTo6TW9uc3RlckJpbmFyeVNjaGVtYTo6ZGF0YSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNeUdhbWU6OkV4YW1wbGU6Ok1vbnN0ZXJCaW5hcnlTY2hlbWE6OnNpemUoKSksCisgICAgICAgICAgdHJ1ZSk7CisgIGF1dG8ganNvblN0ciA9IFIiKAorICB7CisgICAgIm5hbWUiOiAibG9va3VwVGVzdCIsCisgICAgInRlc3RhcnJheW9mdGFibGVzIjogWworICAgICAgeyAibmFtZSI6ICJhYWEiIH0sCisgICAgICB7ICJuYW1lIjogImNjYyIgfSwKKyAgICAgIHsgIm5hbWUiOiAiYmJiIiB9CisgICAgXQorICB9CisgICkiOworICBURVNUX0VRKHBhcnNlci5QYXJzZUpzb24oanNvblN0ciksIHRydWUpOworICBhdXRvIG1vbnN0ZXIgPSBmbGF0YnVmZmVyczo6R2V0Um9vdDxNeUdhbWU6OkV4YW1wbGU6Ok1vbnN0ZXI+KAorICAgICAgcGFyc2VyLmJ1aWxkZXJfLkdldEJ1ZmZlclBvaW50ZXIoKSk7CisKKyAgVEVTVF9OT1ROVUxMKG1vbnN0ZXItPnRlc3RhcnJheW9mdGFibGVzKCktPkxvb2t1cEJ5S2V5KCJhYWEiKSk7CisgIFRFU1RfTk9UTlVMTChtb25zdGVyLT50ZXN0YXJyYXlvZnRhYmxlcygpLT5Mb29rdXBCeUtleSgiYmJiIikpOworICBURVNUX05PVE5VTEwobW9uc3Rlci0+dGVzdGFycmF5b2Z0YWJsZXMoKS0+TG9va3VwQnlLZXkoImNjYyIpKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIHRlc3RzCit9ICAvLyBuYW1lc3BhY2UgZmxhdGJ1ZmZlcnMKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9qc29uX3Rlc3QuaCBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL2pzb25fdGVzdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZlNmVmZDQKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9qc29uX3Rlc3QuaApAQCAtMCwwICsxLDE4IEBACisjaWZuZGVmIFRFU1RTX0pTT05fVEVTVF9ICisjZGVmaW5lIFRFU1RTX0pTT05fVEVTVF9ICisKKyNpbmNsdWRlIDxzdHJpbmc+CisKK25hbWVzcGFjZSBmbGF0YnVmZmVycyB7CituYW1lc3BhY2UgdGVzdHMgeworCit2b2lkIEpzb25EZWZhdWx0VGVzdChjb25zdCBzdGQ6OnN0cmluZyYgdGVzdHNfZGF0YV9wYXRoKTsKK3ZvaWQgSnNvbkVudW1zVGVzdChjb25zdCBzdGQ6OnN0cmluZyYgdGVzdHNfZGF0YV9wYXRoKTsKK3ZvaWQgSnNvbk9wdGlvbmFsVGVzdChjb25zdCBzdGQ6OnN0cmluZyYgdGVzdHNfZGF0YV9wYXRoLCBib29sIGRlZmF1bHRfc2NhbGFycyk7Cit2b2lkIFBhcnNlSW5jb3JyZWN0TW9uc3Rlckpzb25UZXN0KGNvbnN0IHN0ZDo6c3RyaW5nJiB0ZXN0c19kYXRhX3BhdGgpOwordm9pZCBKc29uVW5zb3J0ZWRBcnJheVRlc3QoKTsKKworfSAgLy8gbmFtZXNwYWNlIHRlc3RzCit9ICAvLyBuYW1lc3BhY2UgZmxhdGJ1ZmZlcnMKKworI2VuZGlmClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMva2V5d29yZF90ZXN0LmZicyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL2tleXdvcmRfdGVzdC5mYnMKaW5kZXggNGNhNzYxYi4uNzdmYzQyYiAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMva2V5d29yZF90ZXN0LmZicworKysgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9rZXl3b3JkX3Rlc3QuZmJzCkBAIC04LDYgKzgsNyBAQAogICBpczogQUJDID0gdm9pZDsKICAgcHJpdmF0ZTogcHVibGljOwogICB0eXBlOiBpbnQ7CisgIGRlZmF1bHQ6IGJvb2wgPSBmYWxzZTsKIH0KIAogdW5pb24gS2V5d29yZHNJblVuaW9uIHsKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL2tleXdvcmRfdGVzdC9rZXl3b3JkX3Rlc3QvYWJjX2dlbmVyYXRlZC5ycyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL2tleXdvcmRfdGVzdC9rZXl3b3JkX3Rlc3QvYWJjX2dlbmVyYXRlZC5ycwppbmRleCA5OWI0M2U0Li44MjNiODgzIDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9rZXl3b3JkX3Rlc3Qva2V5d29yZF90ZXN0L2FiY19nZW5lcmF0ZWQucnMKKysrIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMva2V5d29yZF90ZXN0L2tleXdvcmRfdGVzdC9hYmNfZ2VuZXJhdGVkLnJzCkBAIC0xLDcgKzEsMTIgQEAKIC8vIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGJ5IHRoZSBGbGF0QnVmZmVycyBjb21waWxlciwgZG8gbm90IG1vZGlmeQorLy8gQGdlbmVyYXRlZAorZXh0ZXJuIGNyYXRlIGFsbG9jOwogZXh0ZXJuIGNyYXRlIGZsYXRidWZmZXJzOwotdXNlIHN0ZDo6bWVtOwotdXNlIHN0ZDo6Y21wOjpPcmRlcmluZzsKK3VzZSBhbGxvYzo6Ym94ZWQ6OkJveDsKK3VzZSBhbGxvYzo6c3RyaW5nOjp7U3RyaW5nLCBUb1N0cmluZ307Cit1c2UgYWxsb2M6OnZlYzo6VmVjOwordXNlIGNvcmU6Om1lbTsKK3VzZSBjb3JlOjpjbXA6Ok9yZGVyaW5nOwogdXNlIHNlbGY6OmZsYXRidWZmZXJzOjp7RW5kaWFuU2NhbGFyLCBGb2xsb3d9OwogdXNlIHN1cGVyOjoqOwogI1tkZXByZWNhdGVkKHNpbmNlID0gIjIuMC4wIiwgbm90ZSA9ICJVc2UgYXNzb2NpYXRlZCBjb25zdGFudHMgaW5zdGVhZC4gVGhpcyB3aWxsIG5vIGxvbmdlciBiZSBnZW5lcmF0ZWQgaW4gMjAyMS4iKV0KQEAgLTQyLDggKzQ3LDggQEAKICAgICB9CiAgIH0KIH0KLWltcGwgc3RkOjpmbXQ6OkRlYnVnIGZvciBBQkMgewotICBmbiBmbXQoJnNlbGYsIGY6ICZtdXQgc3RkOjpmbXQ6OkZvcm1hdHRlcikgLT4gc3RkOjpmbXQ6OlJlc3VsdCB7CitpbXBsIGNvcmU6OmZtdDo6RGVidWcgZm9yIEFCQyB7CisgIGZuIGZtdCgmc2VsZiwgZjogJm11dCBjb3JlOjpmbXQ6OkZvcm1hdHRlcikgLT4gY29yZTo6Zm10OjpSZXN1bHQgewogICAgIGlmIGxldCBTb21lKG5hbWUpID0gc2VsZi52YXJpYW50X25hbWUoKSB7CiAgICAgICBmLndyaXRlX3N0cihuYW1lKQogICAgIH0gZWxzZSB7CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9rZXl3b3JkX3Rlc3Qva2V5d29yZF90ZXN0L2tleXdvcmRzX2luX3RhYmxlX2dlbmVyYXRlZC5ycyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL2tleXdvcmRfdGVzdC9rZXl3b3JkX3Rlc3Qva2V5d29yZHNfaW5fdGFibGVfZ2VuZXJhdGVkLnJzCmluZGV4IDZhMTZmMDUuLjc0ZGRmYmEgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL2tleXdvcmRfdGVzdC9rZXl3b3JkX3Rlc3Qva2V5d29yZHNfaW5fdGFibGVfZ2VuZXJhdGVkLnJzCisrKyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL2tleXdvcmRfdGVzdC9rZXl3b3JkX3Rlc3Qva2V5d29yZHNfaW5fdGFibGVfZ2VuZXJhdGVkLnJzCkBAIC0xLDcgKzEsMTIgQEAKIC8vIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGJ5IHRoZSBGbGF0QnVmZmVycyBjb21waWxlciwgZG8gbm90IG1vZGlmeQorLy8gQGdlbmVyYXRlZAorZXh0ZXJuIGNyYXRlIGFsbG9jOwogZXh0ZXJuIGNyYXRlIGZsYXRidWZmZXJzOwotdXNlIHN0ZDo6bWVtOwotdXNlIHN0ZDo6Y21wOjpPcmRlcmluZzsKK3VzZSBhbGxvYzo6Ym94ZWQ6OkJveDsKK3VzZSBhbGxvYzo6c3RyaW5nOjp7U3RyaW5nLCBUb1N0cmluZ307Cit1c2UgYWxsb2M6OnZlYzo6VmVjOwordXNlIGNvcmU6Om1lbTsKK3VzZSBjb3JlOjpjbXA6Ok9yZGVyaW5nOwogdXNlIHNlbGY6OmZsYXRidWZmZXJzOjp7RW5kaWFuU2NhbGFyLCBGb2xsb3d9OwogdXNlIHN1cGVyOjoqOwogcHViIGVudW0gS2V5d29yZHNJblRhYmxlT2Zmc2V0IHt9CkBAIC0yMyw2ICsyOCw3IEBACiAgIHB1YiBjb25zdCBWVF9JUzogZmxhdGJ1ZmZlcnM6OlZPZmZzZXRUID0gNDsKICAgcHViIGNvbnN0IFZUX1BSSVZBVEU6IGZsYXRidWZmZXJzOjpWT2Zmc2V0VCA9IDY7CiAgIHB1YiBjb25zdCBWVF9UWVBFXzogZmxhdGJ1ZmZlcnM6OlZPZmZzZXRUID0gODsKKyAgcHViIGNvbnN0IFZUX0RFRkFVTFQ6IGZsYXRidWZmZXJzOjpWT2Zmc2V0VCA9IDEwOwogCiAgIHB1YiBjb25zdCBmbiBnZXRfZnVsbHlfcXVhbGlmaWVkX25hbWUoKSAtPiAmJ3N0YXRpYyBzdHIgewogICAgICJLZXl3b3JkVGVzdC5LZXl3b3Jkc0luVGFibGUiCkBAIC00MSw2ICs0Nyw3IEBACiAgICAgYnVpbGRlci5hZGRfdHlwZV8oYXJncy50eXBlXyk7CiAgICAgYnVpbGRlci5hZGRfcHJpdmF0ZShhcmdzLnByaXZhdGUpOwogICAgIGJ1aWxkZXIuYWRkX2lzKGFyZ3MuaXMpOworICAgIGJ1aWxkZXIuYWRkX2RlZmF1bHQoYXJncy5kZWZhdWx0KTsKICAgICBidWlsZGVyLmZpbmlzaCgpCiAgIH0KIApAQCAtNDgsMTAgKzU1LDEyIEBACiAgICAgbGV0IGlzID0gc2VsZi5pcygpOwogICAgIGxldCBwcml2YXRlID0gc2VsZi5wcml2YXRlKCk7CiAgICAgbGV0IHR5cGVfID0gc2VsZi50eXBlXygpOworICAgIGxldCBkZWZhdWx0ID0gc2VsZi5kZWZhdWx0KCk7CiAgICAgS2V5d29yZHNJblRhYmxlVCB7CiAgICAgICBpcywKICAgICAgIHByaXZhdGUsCiAgICAgICB0eXBlXywKKyAgICAgIGRlZmF1bHQsCiAgICAgfQogICB9CiAKQEAgLTY3LDYgKzc2LDEwIEBACiAgIHB1YiBmbiB0eXBlXygmc2VsZikgLT4gaTMyIHsKICAgICBzZWxmLl90YWIuZ2V0Ojo8aTMyPihLZXl3b3Jkc0luVGFibGU6OlZUX1RZUEVfLCBTb21lKDApKS51bndyYXAoKQogICB9CisgICNbaW5saW5lXQorICBwdWIgZm4gZGVmYXVsdCgmc2VsZikgLT4gYm9vbCB7CisgICAgc2VsZi5fdGFiLmdldDo6PGJvb2w+KEtleXdvcmRzSW5UYWJsZTo6VlRfREVGQVVMVCwgU29tZShmYWxzZSkpLnVud3JhcCgpCisgIH0KIH0KIAogaW1wbCBmbGF0YnVmZmVyczo6VmVyaWZpYWJsZSBmb3IgS2V5d29yZHNJblRhYmxlPCdfPiB7CkBAIC03OSw2ICs5Miw3IEBACiAgICAgIC52aXNpdF9maWVsZDo6PEFCQz4oImlzIiwgU2VsZjo6VlRfSVMsIGZhbHNlKT8KICAgICAgLnZpc2l0X2ZpZWxkOjo8cHVibGljPigicHJpdmF0ZSIsIFNlbGY6OlZUX1BSSVZBVEUsIGZhbHNlKT8KICAgICAgLnZpc2l0X2ZpZWxkOjo8aTMyPigidHlwZV8iLCBTZWxmOjpWVF9UWVBFXywgZmFsc2UpPworICAgICAudmlzaXRfZmllbGQ6Ojxib29sPigiZGVmYXVsdCIsIFNlbGY6OlZUX0RFRkFVTFQsIGZhbHNlKT8KICAgICAgLmZpbmlzaCgpOwogICAgIE9rKCgpKQogICB9CkBAIC04Nyw2ICsxMDEsNyBAQAogICAgIHB1YiBpczogQUJDLAogICAgIHB1YiBwcml2YXRlOiBwdWJsaWMsCiAgICAgcHViIHR5cGVfOiBpMzIsCisgICAgcHViIGRlZmF1bHQ6IGJvb2wsCiB9CiBpbXBsPCdhPiBEZWZhdWx0IGZvciBLZXl3b3Jkc0luVGFibGVBcmdzIHsKICAgI1tpbmxpbmVdCkBAIC05NSw2ICsxMTAsNyBAQAogICAgICAgaXM6IEFCQzo6dm9pZCwKICAgICAgIHByaXZhdGU6IHB1YmxpYzo6Tk9ORSwKICAgICAgIHR5cGVfOiAwLAorICAgICAgZGVmYXVsdDogZmFsc2UsCiAgICAgfQogICB9CiB9CkBAIC0xMTcsNiArMTMzLDEwIEBACiAgICAgc2VsZi5mYmJfLnB1c2hfc2xvdDo6PGkzMj4oS2V5d29yZHNJblRhYmxlOjpWVF9UWVBFXywgdHlwZV8sIDApOwogICB9CiAgICNbaW5saW5lXQorICBwdWIgZm4gYWRkX2RlZmF1bHQoJm11dCBzZWxmLCBkZWZhdWx0OiBib29sKSB7CisgICAgc2VsZi5mYmJfLnB1c2hfc2xvdDo6PGJvb2w+KEtleXdvcmRzSW5UYWJsZTo6VlRfREVGQVVMVCwgZGVmYXVsdCwgZmFsc2UpOworICB9CisgICNbaW5saW5lXQogICBwdWIgZm4gbmV3KF9mYmI6ICYnYiBtdXQgZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyPCdhPikgLT4gS2V5d29yZHNJblRhYmxlQnVpbGRlcjwnYSwgJ2I+IHsKICAgICBsZXQgc3RhcnQgPSBfZmJiLnN0YXJ0X3RhYmxlKCk7CiAgICAgS2V5d29yZHNJblRhYmxlQnVpbGRlciB7CkBAIC0xMzEsMTIgKzE1MSwxMyBAQAogICB9CiB9CiAKLWltcGwgc3RkOjpmbXQ6OkRlYnVnIGZvciBLZXl3b3Jkc0luVGFibGU8J18+IHsKLSAgZm4gZm10KCZzZWxmLCBmOiAmbXV0IHN0ZDo6Zm10OjpGb3JtYXR0ZXI8J18+KSAtPiBzdGQ6OmZtdDo6UmVzdWx0IHsKK2ltcGwgY29yZTo6Zm10OjpEZWJ1ZyBmb3IgS2V5d29yZHNJblRhYmxlPCdfPiB7CisgIGZuIGZtdCgmc2VsZiwgZjogJm11dCBjb3JlOjpmbXQ6OkZvcm1hdHRlcjwnXz4pIC0+IGNvcmU6OmZtdDo6UmVzdWx0IHsKICAgICBsZXQgbXV0IGRzID0gZi5kZWJ1Z19zdHJ1Y3QoIktleXdvcmRzSW5UYWJsZSIpOwogICAgICAgZHMuZmllbGQoImlzIiwgJnNlbGYuaXMoKSk7CiAgICAgICBkcy5maWVsZCgicHJpdmF0ZSIsICZzZWxmLnByaXZhdGUoKSk7CiAgICAgICBkcy5maWVsZCgidHlwZV8iLCAmc2VsZi50eXBlXygpKTsKKyAgICAgIGRzLmZpZWxkKCJkZWZhdWx0IiwgJnNlbGYuZGVmYXVsdCgpKTsKICAgICAgIGRzLmZpbmlzaCgpCiAgIH0KIH0KQEAgLTE0Niw2ICsxNjcsNyBAQAogICBwdWIgaXM6IEFCQywKICAgcHViIHByaXZhdGU6IHB1YmxpYywKICAgcHViIHR5cGVfOiBpMzIsCisgIHB1YiBkZWZhdWx0OiBib29sLAogfQogaW1wbCBEZWZhdWx0IGZvciBLZXl3b3Jkc0luVGFibGVUIHsKICAgZm4gZGVmYXVsdCgpIC0+IFNlbGYgewpAQCAtMTUzLDYgKzE3NSw3IEBACiAgICAgICBpczogQUJDOjp2b2lkLAogICAgICAgcHJpdmF0ZTogcHVibGljOjpOT05FLAogICAgICAgdHlwZV86IDAsCisgICAgICBkZWZhdWx0OiBmYWxzZSwKICAgICB9CiAgIH0KIH0KQEAgLTE2NCwxMCArMTg3LDEyIEBACiAgICAgbGV0IGlzID0gc2VsZi5pczsKICAgICBsZXQgcHJpdmF0ZSA9IHNlbGYucHJpdmF0ZTsKICAgICBsZXQgdHlwZV8gPSBzZWxmLnR5cGVfOworICAgIGxldCBkZWZhdWx0ID0gc2VsZi5kZWZhdWx0OwogICAgIEtleXdvcmRzSW5UYWJsZTo6Y3JlYXRlKF9mYmIsICZLZXl3b3Jkc0luVGFibGVBcmdzewogICAgICAgaXMsCiAgICAgICBwcml2YXRlLAogICAgICAgdHlwZV8sCisgICAgICBkZWZhdWx0LAogICAgIH0pCiAgIH0KIH0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL2tleXdvcmRfdGVzdC9rZXl3b3JkX3Rlc3Qva2V5d29yZHNfaW5fdW5pb25fZ2VuZXJhdGVkLnJzIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMva2V5d29yZF90ZXN0L2tleXdvcmRfdGVzdC9rZXl3b3Jkc19pbl91bmlvbl9nZW5lcmF0ZWQucnMKaW5kZXggY2YwMzc5Ny4uNzhkOGNkNyAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMva2V5d29yZF90ZXN0L2tleXdvcmRfdGVzdC9rZXl3b3Jkc19pbl91bmlvbl9nZW5lcmF0ZWQucnMKKysrIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMva2V5d29yZF90ZXN0L2tleXdvcmRfdGVzdC9rZXl3b3Jkc19pbl91bmlvbl9nZW5lcmF0ZWQucnMKQEAgLTEsNyArMSwxMiBAQAogLy8gYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgYnkgdGhlIEZsYXRCdWZmZXJzIGNvbXBpbGVyLCBkbyBub3QgbW9kaWZ5CisvLyBAZ2VuZXJhdGVkCitleHRlcm4gY3JhdGUgYWxsb2M7CiBleHRlcm4gY3JhdGUgZmxhdGJ1ZmZlcnM7Ci11c2Ugc3RkOjptZW07Ci11c2Ugc3RkOjpjbXA6Ok9yZGVyaW5nOwordXNlIGFsbG9jOjpib3hlZDo6Qm94OwordXNlIGFsbG9jOjpzdHJpbmc6OntTdHJpbmcsIFRvU3RyaW5nfTsKK3VzZSBhbGxvYzo6dmVjOjpWZWM7Cit1c2UgY29yZTo6bWVtOwordXNlIGNvcmU6OmNtcDo6T3JkZXJpbmc7CiB1c2Ugc2VsZjo6ZmxhdGJ1ZmZlcnM6OntFbmRpYW5TY2FsYXIsIEZvbGxvd307CiB1c2Ugc3VwZXI6Oio7CiAjW2RlcHJlY2F0ZWQoc2luY2UgPSAiMi4wLjAiLCBub3RlID0gIlVzZSBhc3NvY2lhdGVkIGNvbnN0YW50cyBpbnN0ZWFkLiBUaGlzIHdpbGwgbm8gbG9uZ2VyIGJlIGdlbmVyYXRlZCBpbiAyMDIxLiIpXQpAQCAtNDIsOCArNDcsOCBAQAogICAgIH0KICAgfQogfQotaW1wbCBzdGQ6OmZtdDo6RGVidWcgZm9yIEtleXdvcmRzSW5VbmlvbiB7Ci0gIGZuIGZtdCgmc2VsZiwgZjogJm11dCBzdGQ6OmZtdDo6Rm9ybWF0dGVyKSAtPiBzdGQ6OmZtdDo6UmVzdWx0IHsKK2ltcGwgY29yZTo6Zm10OjpEZWJ1ZyBmb3IgS2V5d29yZHNJblVuaW9uIHsKKyAgZm4gZm10KCZzZWxmLCBmOiAmbXV0IGNvcmU6OmZtdDo6Rm9ybWF0dGVyKSAtPiBjb3JlOjpmbXQ6OlJlc3VsdCB7CiAgICAgaWYgbGV0IFNvbWUobmFtZSkgPSBzZWxmLnZhcmlhbnRfbmFtZSgpIHsKICAgICAgIGYud3JpdGVfc3RyKG5hbWUpCiAgICAgfSBlbHNlIHsKQEAgLTEyOCw3ICsxMzMsNyBAQAogICAvLy8gSWYgdGhlIHVuaW9uIHZhcmlhbnQgbWF0Y2hlcywgcmV0dXJuIHRoZSBvd25lZCBLZXl3b3Jkc0luVGFibGVULCBzZXR0aW5nIHRoZSB1bmlvbiB0byBOT05FLgogICBwdWIgZm4gdGFrZV9zdGF0aWNfKCZtdXQgc2VsZikgLT4gT3B0aW9uPEJveDxLZXl3b3Jkc0luVGFibGVUPj4gewogICAgIGlmIGxldCBTZWxmOjpTdGF0aWNfKF8pID0gc2VsZiB7Ci0gICAgICBsZXQgdiA9IHN0ZDo6bWVtOjpyZXBsYWNlKHNlbGYsIFNlbGY6Ok5PTkUpOworICAgICAgbGV0IHYgPSBjb3JlOjptZW06OnJlcGxhY2Uoc2VsZiwgU2VsZjo6Tk9ORSk7CiAgICAgICBpZiBsZXQgU2VsZjo6U3RhdGljXyh3KSA9IHYgewogICAgICAgICBTb21lKHcpCiAgICAgICB9IGVsc2UgewpAQCAtMTQ5LDcgKzE1NCw3IEBACiAgIC8vLyBJZiB0aGUgdW5pb24gdmFyaWFudCBtYXRjaGVzLCByZXR1cm4gdGhlIG93bmVkIEtleXdvcmRzSW5UYWJsZVQsIHNldHRpbmcgdGhlIHVuaW9uIHRvIE5PTkUuCiAgIHB1YiBmbiB0YWtlX2ludGVybmFsKCZtdXQgc2VsZikgLT4gT3B0aW9uPEJveDxLZXl3b3Jkc0luVGFibGVUPj4gewogICAgIGlmIGxldCBTZWxmOjpJbnRlcm5hbChfKSA9IHNlbGYgewotICAgICAgbGV0IHYgPSBzdGQ6Om1lbTo6cmVwbGFjZShzZWxmLCBTZWxmOjpOT05FKTsKKyAgICAgIGxldCB2ID0gY29yZTo6bWVtOjpyZXBsYWNlKHNlbGYsIFNlbGY6Ok5PTkUpOwogICAgICAgaWYgbGV0IFNlbGY6OkludGVybmFsKHcpID0gdiB7CiAgICAgICAgIFNvbWUodykKICAgICAgIH0gZWxzZSB7CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9rZXl3b3JkX3Rlc3Qva2V5d29yZF90ZXN0L3B1YmxpY19nZW5lcmF0ZWQucnMgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9rZXl3b3JkX3Rlc3Qva2V5d29yZF90ZXN0L3B1YmxpY19nZW5lcmF0ZWQucnMKaW5kZXggMmRlNGMwYi4uNzZjNmVkMCAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMva2V5d29yZF90ZXN0L2tleXdvcmRfdGVzdC9wdWJsaWNfZ2VuZXJhdGVkLnJzCisrKyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL2tleXdvcmRfdGVzdC9rZXl3b3JkX3Rlc3QvcHVibGljX2dlbmVyYXRlZC5ycwpAQCAtMSw3ICsxLDEyIEBACiAvLyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBieSB0aGUgRmxhdEJ1ZmZlcnMgY29tcGlsZXIsIGRvIG5vdCBtb2RpZnkKKy8vIEBnZW5lcmF0ZWQKK2V4dGVybiBjcmF0ZSBhbGxvYzsKIGV4dGVybiBjcmF0ZSBmbGF0YnVmZmVyczsKLXVzZSBzdGQ6Om1lbTsKLXVzZSBzdGQ6OmNtcDo6T3JkZXJpbmc7Cit1c2UgYWxsb2M6OmJveGVkOjpCb3g7Cit1c2UgYWxsb2M6OnN0cmluZzo6e1N0cmluZywgVG9TdHJpbmd9OwordXNlIGFsbG9jOjp2ZWM6OlZlYzsKK3VzZSBjb3JlOjptZW07Cit1c2UgY29yZTo6Y21wOjpPcmRlcmluZzsKIHVzZSBzZWxmOjpmbGF0YnVmZmVyczo6e0VuZGlhblNjYWxhciwgRm9sbG93fTsKIHVzZSBzdXBlcjo6KjsKICNbZGVwcmVjYXRlZChzaW5jZSA9ICIyLjAuMCIsIG5vdGUgPSAiVXNlIGFzc29jaWF0ZWQgY29uc3RhbnRzIGluc3RlYWQuIFRoaXMgd2lsbCBubyBsb25nZXIgYmUgZ2VuZXJhdGVkIGluIDIwMjEuIildCkBAIC0zNCw4ICszOSw4IEBACiAgICAgfQogICB9CiB9Ci1pbXBsIHN0ZDo6Zm10OjpEZWJ1ZyBmb3IgcHVibGljIHsKLSAgZm4gZm10KCZzZWxmLCBmOiAmbXV0IHN0ZDo6Zm10OjpGb3JtYXR0ZXIpIC0+IHN0ZDo6Zm10OjpSZXN1bHQgeworaW1wbCBjb3JlOjpmbXQ6OkRlYnVnIGZvciBwdWJsaWMgeworICBmbiBmbXQoJnNlbGYsIGY6ICZtdXQgY29yZTo6Zm10OjpGb3JtYXR0ZXIpIC0+IGNvcmU6OmZtdDo6UmVzdWx0IHsKICAgICBpZiBsZXQgU29tZShuYW1lKSA9IHNlbGYudmFyaWFudF9uYW1lKCkgewogICAgICAgZi53cml0ZV9zdHIobmFtZSkKICAgICB9IGVsc2UgewpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMva2V5d29yZF90ZXN0L21vZC5ycyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL2tleXdvcmRfdGVzdC9tb2QucnMKaW5kZXggOTRjZTY1MC4uZDg3ZTVkMSAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMva2V5d29yZF90ZXN0L21vZC5ycworKysgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9rZXl3b3JkX3Rlc3QvbW9kLnJzCkBAIC0xLDQgKzEsNSBAQAogLy8gQXV0b21hdGljYWxseSBnZW5lcmF0ZWQgYnkgdGhlIEZsYXRidWZmZXJzIGNvbXBpbGVyLiBEbyBub3QgbW9kaWZ5LgorLy8gQGdlbmVyYXRlZAogcHViIG1vZCBrZXl3b3JkX3Rlc3QgewogICB1c2Ugc3VwZXI6Oio7CiAgIG1vZCBhYmNfZ2VuZXJhdGVkOwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvbW9uc3Rlcl9leHRyYV9nZW5lcmF0ZWQuaCBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL21vbnN0ZXJfZXh0cmFfZ2VuZXJhdGVkLmgKaW5kZXggYjI3ZTA5Mi4uYjIyNDY3NyAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvbW9uc3Rlcl9leHRyYV9nZW5lcmF0ZWQuaAorKysgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9tb25zdGVyX2V4dHJhX2dlbmVyYXRlZC5oCkBAIC02LDYgKzYsMTMgQEAKIAogI2luY2x1ZGUgImZsYXRidWZmZXJzL2ZsYXRidWZmZXJzLmgiCiAKKy8vIEVuc3VyZSB0aGUgaW5jbHVkZWQgZmxhdGJ1ZmZlcnMuaCBpcyB0aGUgc2FtZSB2ZXJzaW9uIGFzIHdoZW4gdGhpcyBmaWxlIHdhcworLy8gZ2VuZXJhdGVkLCBvdGhlcndpc2UgaXQgbWF5IG5vdCBiZSBjb21wYXRpYmxlLgorc3RhdGljX2Fzc2VydChGTEFUQlVGRkVSU19WRVJTSU9OX01BSk9SID09IDIgJiYKKyAgICAgICAgICAgICAgRkxBVEJVRkZFUlNfVkVSU0lPTl9NSU5PUiA9PSAwICYmCisgICAgICAgICAgICAgIEZMQVRCVUZGRVJTX1ZFUlNJT05fUkVWSVNJT04gPT0gOCwKKyAgICAgICAgICAgICAiTm9uLWNvbXBhdGlibGUgZmxhdGJ1ZmZlcnMgdmVyc2lvbiBpbmNsdWRlZCIpOworCiBuYW1lc3BhY2UgTXlHYW1lIHsKIAogc3RydWN0IE1vbnN0ZXJFeHRyYTsKQEAgLTI2OCw4ICsyNzUsOCBAQAogICB7IGF1dG8gX2UgPSBmMSgpOyBfby0+ZjEgPSBfZTsgfQogICB7IGF1dG8gX2UgPSBmMigpOyBfby0+ZjIgPSBfZTsgfQogICB7IGF1dG8gX2UgPSBmMygpOyBfby0+ZjMgPSBfZTsgfQotICB7IGF1dG8gX2UgPSBkdmVjKCk7IGlmIChfZSkgeyBfby0+ZHZlYy5yZXNpemUoX2UtPnNpemUoKSk7IGZvciAoZmxhdGJ1ZmZlcnM6OnVvZmZzZXRfdCBfaSA9IDA7IF9pIDwgX2UtPnNpemUoKTsgX2krKykgeyBfby0+ZHZlY1tfaV0gPSBfZS0+R2V0KF9pKTsgfSB9IH0KLSAgeyBhdXRvIF9lID0gZnZlYygpOyBpZiAoX2UpIHsgX28tPmZ2ZWMucmVzaXplKF9lLT5zaXplKCkpOyBmb3IgKGZsYXRidWZmZXJzOjp1b2Zmc2V0X3QgX2kgPSAwOyBfaSA8IF9lLT5zaXplKCk7IF9pKyspIHsgX28tPmZ2ZWNbX2ldID0gX2UtPkdldChfaSk7IH0gfSB9CisgIHsgYXV0byBfZSA9IGR2ZWMoKTsgaWYgKF9lKSB7IF9vLT5kdmVjLnJlc2l6ZShfZS0+c2l6ZSgpKTsgZm9yIChmbGF0YnVmZmVyczo6dW9mZnNldF90IF9pID0gMDsgX2kgPCBfZS0+c2l6ZSgpOyBfaSsrKSB7IF9vLT5kdmVjW19pXSA9IF9lLT5HZXQoX2kpOyB9IH0gZWxzZSB7IF9vLT5kdmVjLnJlc2l6ZSgwKTsgfSB9CisgIHsgYXV0byBfZSA9IGZ2ZWMoKTsgaWYgKF9lKSB7IF9vLT5mdmVjLnJlc2l6ZShfZS0+c2l6ZSgpKTsgZm9yIChmbGF0YnVmZmVyczo6dW9mZnNldF90IF9pID0gMDsgX2kgPCBfZS0+c2l6ZSgpOyBfaSsrKSB7IF9vLT5mdmVjW19pXSA9IF9lLT5HZXQoX2kpOyB9IH0gZWxzZSB7IF9vLT5mdmVjLnJlc2l6ZSgwKTsgfSB9CiB9CiAKIGlubGluZSBmbGF0YnVmZmVyczo6T2Zmc2V0PE1vbnN0ZXJFeHRyYT4gTW9uc3RlckV4dHJhOjpQYWNrKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgTW9uc3RlckV4dHJhVCogX28sIGNvbnN0IGZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIpIHsKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL21vbnN0ZXJfZXh0cmFfbXlfZ2FtZV9nZW5lcmF0ZWQuZGFydCBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL21vbnN0ZXJfZXh0cmFfbXlfZ2FtZV9nZW5lcmF0ZWQuZGFydAppbmRleCAyMzhhYjhmLi4yNjMxMGJlIDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9tb25zdGVyX2V4dHJhX215X2dhbWVfZ2VuZXJhdGVkLmRhcnQKKysrIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvbW9uc3Rlcl9leHRyYV9teV9nYW1lX2dlbmVyYXRlZC5kYXJ0CkBAIC0zMiw3ICszMiw3IEBACiAKICAgQG92ZXJyaWRlCiAgIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICByZXR1cm4gJ01vbnN0ZXJFeHRyYXtkMDogJGQwLCBkMTogJGQxLCBkMjogJGQyLCBkMzogJGQzLCBmMDogJGYwLCBmMTogJGYxLCBmMjogJGYyLCBmMzogJGYzLCBkdmVjOiAkZHZlYywgZnZlYzogJGZ2ZWN9JzsKKyAgICByZXR1cm4gJ01vbnN0ZXJFeHRyYXtkMDogJHtkMH0sIGQxOiAke2QxfSwgZDI6ICR7ZDJ9LCBkMzogJHtkM30sIGYwOiAke2YwfSwgZjE6ICR7ZjF9LCBmMjogJHtmMn0sIGYzOiAke2YzfSwgZHZlYzogJHtkdmVjfSwgZnZlYzogJHtmdmVjfX0nOwogICB9CiAKICAgTW9uc3RlckV4dHJhVCB1bnBhY2soKSA9PiBNb25zdGVyRXh0cmFUKApAQCAtOTksNyArOTksNyBAQAogCiAgIEBvdmVycmlkZQogICBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgcmV0dXJuICdNb25zdGVyRXh0cmFUe2QwOiAkZDAsIGQxOiAkZDEsIGQyOiAkZDIsIGQzOiAkZDMsIGYwOiAkZjAsIGYxOiAkZjEsIGYyOiAkZjIsIGYzOiAkZjMsIGR2ZWM6ICRkdmVjLCBmdmVjOiAkZnZlY30nOworICAgIHJldHVybiAnTW9uc3RlckV4dHJhVHtkMDogJHtkMH0sIGQxOiAke2QxfSwgZDI6ICR7ZDJ9LCBkMzogJHtkM30sIGYwOiAke2YwfSwgZjE6ICR7ZjF9LCBmMjogJHtmMn0sIGYzOiAke2YzfSwgZHZlYzogJHtkdmVjfSwgZnZlYzogJHtmdmVjfX0nOwogICB9CiB9CiAKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL21vbnN0ZXJfdGVzdC5hZmIgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9tb25zdGVyX3Rlc3QuYWZiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI5ODkzM2EKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9tb25zdGVyX3Rlc3QuYWZiCkBAIC0wLDAgKzEsNjY0NyBAQAorLy8gQW5ub3RhdGVkIEZsYXRidWZmZXIgQmluYXJ5CisvLworLy8gU2NoZW1hIGZpbGU6IC4uL3JlZmxlY3Rpb24vcmVmbGVjdGlvbi5mYnMKKy8vIEJpbmFyeSBmaWxlOiBtb25zdGVyX3Rlc3QuYmZicworCitoZWFkZXI6CisgICsweDAwMDAgfCAxQyAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDAxQyAoMjgpIExvYzogKzB4MDAxQyAgICAgICB8IG9mZnNldCB0byByb290IHRhYmxlIGByZWZsZWN0aW9uLlNjaGVtYWAKKyAgKzB4MDAwNCB8IDQyIDQ2IDQyIDUzICAgICAgICAgICAgIHwgY2hhcls0XSAgICAgfCBCRkJTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgRmlsZSBJZGVudGlmaWVyCisKK3Z0YWJsZSAocmVmbGVjdGlvbi5TY2hlbWEpOgorICArMHgwMDA4IHwgMTQgMDAgICAgICAgICAgICAgICAgICAgfCB1aW50MTZfdCAgICB8IDB4MDAxNCAoMjApICAgICAgICAgICAgICAgICAgICAgICAgfCBzaXplIG9mIHRoaXMgdnRhYmxlCisgICsweDAwMEEgfCAyMCAwMCAgICAgICAgICAgICAgICAgICB8IHVpbnQxNl90ICAgIHwgMHgwMDIwICgzMikgICAgICAgICAgICAgICAgICAgICAgICB8IHNpemUgb2YgcmVmZXJyaW5nIHRhYmxlCisgICsweDAwMEMgfCAwNCAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgIHwgMHgwMDA0ICg0KSAgICAgICAgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgb2JqZWN0c2AgKGlkOiAwKQorICArMHgwMDBFIHwgMDggMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgICB8IDB4MDAwOCAoOCkgICAgICAgICAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYGVudW1zYCAoaWQ6IDEpCisgICsweDAwMTAgfCAwQyAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgIHwgMHgwMDBDICgxMikgICAgICAgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgZmlsZV9pZGVudGAgKGlkOiAyKQorICArMHgwMDEyIHwgMTAgMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgICB8IDB4MDAxMCAoMTYpICAgICAgICAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYGZpbGVfZXh0YCAoaWQ6IDMpCisgICsweDAwMTQgfCAxNCAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgIHwgMHgwMDE0ICgyMCkgICAgICAgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgcm9vdF90YWJsZWAgKGlkOiA0KQorICArMHgwMDE2IHwgMTggMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgICB8IDB4MDAxOCAoMjQpICAgICAgICAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYHNlcnZpY2VzYCAoaWQ6IDUpCisgICsweDAwMTggfCAwMCAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgIHwgMHgwMDAwICgwKSAgICAgICAgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgYWR2YW5jZWRfZmVhdHVyZXNgIChpZDogNikgPGRlZmF1bHRzIHRvIDA+IChVTG9uZykKKyAgKzB4MDAxQSB8IDFDIDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgfCAweDAwMUMgKDI4KSAgICAgICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBmYnNfZmlsZXNgIChpZDogNykKKworcm9vdF90YWJsZSAocmVmbGVjdGlvbi5TY2hlbWEpOgorICArMHgwMDFDIHwgMTQgMDAgMDAgMDAgICAgICAgICAgICAgfCBTT2Zmc2V0MzIgICB8IDB4MDAwMDAwMTQgKDIwKSBMb2M6ICsweDAwMDggICAgICAgfCBvZmZzZXQgdG8gdnRhYmxlCisgICsweDAwMjAgfCA1OCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDA1OCAoODgpIExvYzogKzB4MDA3OCAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgb2JqZWN0c2AgKHZlY3RvcikKKyAgKzB4MDAyNCB8IDM0IDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMDM0ICg1MikgTG9jOiArMHgwMDU4ICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBlbnVtc2AgKHZlY3RvcikKKyAgKzB4MDAyOCB8IDI0IDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMDI0ICgzNikgTG9jOiArMHgwMDRDICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBmaWxlX2lkZW50YCAoc3RyaW5nKQorICArMHgwMDJDIHwgMTggMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDAwMTggKDI0KSBMb2M6ICsweDAwNDQgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYGZpbGVfZXh0YCAoc3RyaW5nKQorICArMHgwMDMwIHwgQTAgMEUgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDBFQTAgKDM3NDQpIExvYzogKzB4MEVEMCAgICAgfCBvZmZzZXQgdG8gZmllbGQgYHJvb3RfdGFibGVgICh0YWJsZSkKKyAgKzB4MDAzNCB8IDA4IDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMDA4ICg4KSBMb2M6ICsweDAwM0MgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBzZXJ2aWNlc2AgKHZlY3RvcikKKyAgKzB4MDAzOCB8IDgwIDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMDgwICgxMjgpIExvYzogKzB4MDBCOCAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBmYnNfZmlsZXNgICh2ZWN0b3IpCisKK3ZlY3RvciAocmVmbGVjdGlvbi5TY2hlbWEuc2VydmljZXMpOgorICArMHgwMDNDIHwgMDEgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICB8IDB4MDAwMDAwMDEgKDEpICAgICAgICAgICAgICAgICAgICAgfCBsZW5ndGggb2YgdmVjdG9yICgjIGl0ZW1zKQorICArMHgwMDQwIHwgREMgMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDAwREMgKDIyMCkgTG9jOiArMHgwMTFDICAgICAgfCBvZmZzZXQgdG8gdGFibGVbMF0KKworc3RyaW5nIChyZWZsZWN0aW9uLlNjaGVtYS5maWxlX2V4dCk6CisgICsweDAwNDQgfCAwMyAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgIHwgMHgwMDAwMDAwMyAoMykgICAgICAgICAgICAgICAgICAgICB8IGxlbmd0aCBvZiBzdHJpbmcKKyAgKzB4MDA0OCB8IDZEIDZGIDZFICAgICAgICAgICAgICAgIHwgY2hhclszXSAgICAgfCBtb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nIGxpdGVyYWwKKyAgKzB4MDA0QiB8IDAwICAgICAgICAgICAgICAgICAgICAgIHwgY2hhciAgICAgICAgfCAweDAwICgwKSAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nIHRlcm1pbmF0b3IKKworc3RyaW5nIChyZWZsZWN0aW9uLlNjaGVtYS5maWxlX2lkZW50KToKKyAgKzB4MDA0QyB8IDA0IDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgfCAweDAwMDAwMDA0ICg0KSAgICAgICAgICAgICAgICAgICAgIHwgbGVuZ3RoIG9mIHN0cmluZworICArMHgwMDUwIHwgNEQgNEYgNEUgNTMgICAgICAgICAgICAgfCBjaGFyWzRdICAgICB8IE1PTlMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJpbmcgbGl0ZXJhbAorICArMHgwMDU0IHwgMDAgICAgICAgICAgICAgICAgICAgICAgfCBjaGFyICAgICAgICB8IDB4MDAgKDApICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJpbmcgdGVybWluYXRvcgorCitwYWRkaW5nOgorICArMHgwMDU1IHwgMDAgMDAgMDAgICAgICAgICAgICAgICAgfCB1aW50OF90WzNdICB8IC4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBwYWRkaW5nCisKK3ZlY3RvciAocmVmbGVjdGlvbi5TY2hlbWEuZW51bXMpOgorICArMHgwMDU4IHwgMDcgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICB8IDB4MDAwMDAwMDcgKDcpICAgICAgICAgICAgICAgICAgICAgfCBsZW5ndGggb2YgdmVjdG9yICgjIGl0ZW1zKQorICArMHgwMDVDIHwgNEMgMDUgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDA1NEMgKDEzNTYpIExvYzogKzB4MDVBOCAgICAgfCBvZmZzZXQgdG8gdGFibGVbMF0KKyAgKzB4MDA2MCB8IEI4IDAyIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMkI4ICg2OTYpIExvYzogKzB4MDMxOCAgICAgIHwgb2Zmc2V0IHRvIHRhYmxlWzFdCisgICsweDAwNjQgfCBGOCAwMyAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDNGOCAoMTAxNikgTG9jOiArMHgwNDVDICAgICB8IG9mZnNldCB0byB0YWJsZVsyXQorICArMHgwMDY4IHwgMDQgMDkgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDA5MDQgKDIzMDgpIExvYzogKzB4MDk2QyAgICAgfCBvZmZzZXQgdG8gdGFibGVbM10KKyAgKzB4MDA2QyB8IDkwIDA2IDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwNjkwICgxNjgwKSBMb2M6ICsweDA2RkMgICAgIHwgb2Zmc2V0IHRvIHRhYmxlWzRdCisgICsweDAwNzAgfCBCQyAwNyAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDdCQyAoMTk4MCkgTG9jOiArMHgwODJDICAgICB8IG9mZnNldCB0byB0YWJsZVs1XQorICArMHgwMDc0IHwgRUMgMEEgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDBBRUMgKDI3OTYpIExvYzogKzB4MEI2MCAgICAgfCBvZmZzZXQgdG8gdGFibGVbNl0KKwordmVjdG9yIChyZWZsZWN0aW9uLlNjaGVtYS5vYmplY3RzKToKKyAgKzB4MDA3OCB8IDBGIDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgfCAweDAwMDAwMDBGICgxNSkgICAgICAgICAgICAgICAgICAgIHwgbGVuZ3RoIG9mIHZlY3RvciAoIyBpdGVtcykKKyAgKzB4MDA3QyB8IDlDIDMxIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAzMTlDICgxMjcwMCkgTG9jOiArMHgzMjE4ICAgIHwgb2Zmc2V0IHRvIHRhYmxlWzBdCisgICsweDAwODAgfCA1MCAwRSAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMEU1MCAoMzY2NCkgTG9jOiArMHgwRUQwICAgICB8IG9mZnNldCB0byB0YWJsZVsxXQorICArMHgwMDg0IHwgRTggMkQgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDJERTggKDExNzUyKSBMb2M6ICsweDJFNkMgICAgfCBvZmZzZXQgdG8gdGFibGVbMl0KKyAgKzB4MDA4OCB8IEM0IDJFIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAyRUM0ICgxMTk3MikgTG9jOiArMHgyRjRDICAgIHwgb2Zmc2V0IHRvIHRhYmxlWzNdCisgICsweDAwOEMgfCA2NCAzMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMzA2NCAoMTIzODgpIExvYzogKzB4MzBGMCAgICB8IG9mZnNldCB0byB0YWJsZVs0XQorICArMHgwMDkwIHwgRDggMkYgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDJGRDggKDEyMjQ4KSBMb2M6ICsweDMwNjggICAgfCBvZmZzZXQgdG8gdGFibGVbNV0KKyAgKzB4MDA5NCB8IEEwIDM1IDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAzNUEwICgxMzcyOCkgTG9jOiArMHgzNjM0ICAgIHwgb2Zmc2V0IHRvIHRhYmxlWzZdCisgICsweDAwOTggfCA4MCAzNCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMzQ4MCAoMTM0NDApIExvYzogKzB4MzUxOCAgICB8IG9mZnNldCB0byB0YWJsZVs3XQorICArMHgwMDlDIHwgNzAgMEIgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDBCNzAgKDI5MjgpIExvYzogKzB4MEMwQyAgICAgfCBvZmZzZXQgdG8gdGFibGVbOF0KKyAgKzB4MDBBMCB8IDc4IDMyIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAzMjc4ICgxMjkyMCkgTG9jOiArMHgzMzE4ICAgIHwgb2Zmc2V0IHRvIHRhYmxlWzldCisgICsweDAwQTQgfCA2OCAzNiAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMzY2OCAoMTM5MjgpIExvYzogKzB4MzcwQyAgICB8IG9mZnNldCB0byB0YWJsZVsxMF0KKyAgKzB4MDBBOCB8IEEwIDM2IDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAzNkEwICgxMzk4NCkgTG9jOiArMHgzNzQ4ICAgIHwgb2Zmc2V0IHRvIHRhYmxlWzExXQorICArMHgwMEFDIHwgOTAgMzcgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDM3OTAgKDE0MjI0KSBMb2M6ICsweDM4M0MgICAgfCBvZmZzZXQgdG8gdGFibGVbMTJdCisgICsweDAwQjAgfCA0NCAzOCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMzg0NCAoMTQ0MDQpIExvYzogKzB4MzhGNCAgICB8IG9mZnNldCB0byB0YWJsZVsxM10KKyAgKzB4MDBCNCB8IEVDIDM2IDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAzNkVDICgxNDA2MCkgTG9jOiArMHgzN0EwICAgIHwgb2Zmc2V0IHRvIHRhYmxlWzE0XQorCit2ZWN0b3IgKHJlZmxlY3Rpb24uU2NoZW1hLmZic19maWxlcyk6CisgICsweDAwQjggfCAwMyAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgIHwgMHgwMDAwMDAwMyAoMykgICAgICAgICAgICAgICAgICAgICB8IGxlbmd0aCBvZiB2ZWN0b3IgKCMgaXRlbXMpCisgICsweDAwQkMgfCAzOCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDAzOCAoNTYpIExvYzogKzB4MDBGNCAgICAgICB8IG9mZnNldCB0byB0YWJsZVswXQorICArMHgwMEMwIHwgMUMgMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDAwMUMgKDI4KSBMb2M6ICsweDAwREMgICAgICAgfCBvZmZzZXQgdG8gdGFibGVbMV0KKyAgKzB4MDBDNCB8IDA0IDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMDA0ICg0KSBMb2M6ICsweDAwQzggICAgICAgIHwgb2Zmc2V0IHRvIHRhYmxlWzJdCisKK3RhYmxlIChyZWZsZWN0aW9uLlNjaGVtYUZpbGUpOgorICArMHgwMEM4IHwgNjQgQ0IgRkYgRkYgICAgICAgICAgICAgfCBTT2Zmc2V0MzIgICB8IDB4RkZGRkNCNjQgKC0xMzQ2OCkgTG9jOiArMHgzNTY0ICAgfCBvZmZzZXQgdG8gdnRhYmxlCisgICsweDAwQ0MgfCA5NCAzNiAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMzY5NCAoMTM5NzIpIExvYzogKzB4Mzc2MCAgICB8IG9mZnNldCB0byBmaWVsZCBga2V5YCAoc3RyaW5nKQorICArMHgwMEQwIHwgMDQgMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDAwMDQgKDQpIExvYzogKzB4MDBENCAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYHZhbHVlYCAoc3RyaW5nKQorCitzdHJpbmcgKHJlZmxlY3Rpb24uU2NoZW1hRmlsZS52YWx1ZSk6CisgICsweDAwRDQgfCAwMSAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgIHwgMHgwMDAwMDAwMSAoMSkgICAgICAgICAgICAgICAgICAgICB8IGxlbmd0aCBvZiBzdHJpbmcKKyAgKzB4MDBEOCB8IEUwICAgICAgICAgICAgICAgICAgICAgIHwgY2hhclsxXSAgICAgfCDgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nIGxpdGVyYWwKKyAgKzB4MDBEOSB8IDM2ICAgICAgICAgICAgICAgICAgICAgIHwgY2hhciAgICAgICAgfCAweDM2ICg1NCkgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nIHRlcm1pbmF0b3IKKworcGFkZGluZzoKKyAgKzB4MDBEQSB8IDAwIDAwICAgICAgICAgICAgICAgICAgIHwgdWludDhfdFsyXSAgfCAuLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgcGFkZGluZworCit0YWJsZSAocmVmbGVjdGlvbi5TY2hlbWFGaWxlKToKKyAgKzB4MDBEQyB8IDc4IENCIEZGIEZGICAgICAgICAgICAgIHwgU09mZnNldDMyICAgfCAweEZGRkZDQjc4ICgtMTM0NDgpIExvYzogKzB4MzU2NCAgIHwgb2Zmc2V0IHRvIHZ0YWJsZQorICArMHgwMEUwIHwgMzQgMzggMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDM4MzQgKDE0Mzg4KSBMb2M6ICsweDM5MTQgICAgfCBvZmZzZXQgdG8gZmllbGQgYGtleWAgKHN0cmluZykKKyAgKzB4MDBFNCB8IDA0IDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMDA0ICg0KSBMb2M6ICsweDAwRTggICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGB2YWx1ZWAgKHN0cmluZykKKworc3RyaW5nIChyZWZsZWN0aW9uLlNjaGVtYUZpbGUudmFsdWUpOgorICArMHgwMEU4IHwgMDIgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICB8IDB4MDAwMDAwMDIgKDIpICAgICAgICAgICAgICAgICAgICAgfCBsZW5ndGggb2Ygc3RyaW5nCisgICsweDAwRUMgfCBDQyAzNiAgICAgICAgICAgICAgICAgICB8IGNoYXJbMl0gICAgIHwgzDYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHN0cmluZyBsaXRlcmFsCisgICsweDAwRUUgfCAwMCAgICAgICAgICAgICAgICAgICAgICB8IGNoYXIgICAgICAgIHwgMHgwMCAoMCkgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHN0cmluZyB0ZXJtaW5hdG9yCisKK3Vua25vd24gKG5vIGtub3duIHJlZmVyZW5jZXMpOgorICArMHgwMEVGIHwgMDAgMjQgMzggMDAgMDAgICAgICAgICAgfCA/dWludDhfdFs1XSB8IC4kOC4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBXQVJOOiBjb3VsZCBiZSBjb3JydXB0ZWQgcGFkZGluZyByZWdpb24uCisKK3RhYmxlIChyZWZsZWN0aW9uLlNjaGVtYUZpbGUpOgorICArMHgwMEY0IHwgOTAgQ0IgRkYgRkYgICAgICAgICAgICAgfCBTT2Zmc2V0MzIgICB8IDB4RkZGRkNCOTAgKC0xMzQyNCkgTG9jOiArMHgzNTY0ICAgfCBvZmZzZXQgdG8gdnRhYmxlCisgICsweDAwRjggfCBDMCAzNiAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMzZDMCAoMTQwMTYpIExvYzogKzB4MzdCOCAgICB8IG9mZnNldCB0byBmaWVsZCBga2V5YCAoc3RyaW5nKQorICArMHgwMEZDIHwgMDQgMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDAwMDQgKDQpIExvYzogKzB4MDEwMCAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYHZhbHVlYCAoc3RyaW5nKQorCitzdHJpbmcgKHJlZmxlY3Rpb24uU2NoZW1hRmlsZS52YWx1ZSk6CisgICsweDAxMDAgfCAwMiAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgIHwgMHgwMDAwMDAwMiAoMikgICAgICAgICAgICAgICAgICAgICB8IGxlbmd0aCBvZiBzdHJpbmcKKyAgKzB4MDEwNCB8IEI0IDM2ICAgICAgICAgICAgICAgICAgIHwgY2hhclsyXSAgICAgfCC0NiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nIGxpdGVyYWwKKyAgKzB4MDEwNiB8IDAwICAgICAgICAgICAgICAgICAgICAgIHwgY2hhciAgICAgICAgfCAweDAwICgwKSAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nIHRlcm1pbmF0b3IKKwordW5rbm93biAobm8ga25vd24gcmVmZXJlbmNlcyk6CisgICsweDAxMDcgfCAwMCAwQyAzOCAwMCAwMCAwMCAwMCAgICB8ID91aW50OF90WzddIHwgLi44Li4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFdBUk46IGNvdWxkIGJlIGNvcnJ1cHRlZCBwYWRkaW5nIHJlZ2lvbi4KKwordnRhYmxlIChyZWZsZWN0aW9uLlNlcnZpY2UpOgorICArMHgwMTBFIHwgMEUgMDAgICAgICAgICAgICAgICAgICAgfCB1aW50MTZfdCAgICB8IDB4MDAwRSAoMTQpICAgICAgICAgICAgICAgICAgICAgICAgfCBzaXplIG9mIHRoaXMgdnRhYmxlCisgICsweDAxMTAgfCAxNCAwMCAgICAgICAgICAgICAgICAgICB8IHVpbnQxNl90ICAgIHwgMHgwMDE0ICgyMCkgICAgICAgICAgICAgICAgICAgICAgICB8IHNpemUgb2YgcmVmZXJyaW5nIHRhYmxlCisgICsweDAxMTIgfCAwNCAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgIHwgMHgwMDA0ICg0KSAgICAgICAgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgbmFtZWAgKGlkOiAwKQorICArMHgwMTE0IHwgMDggMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgICB8IDB4MDAwOCAoOCkgICAgICAgICAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYGNhbGxzYCAoaWQ6IDEpCisgICsweDAxMTYgfCAwMCAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgIHwgMHgwMDAwICgwKSAgICAgICAgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgYXR0cmlidXRlc2AgKGlkOiAyKSA8bnVsbD4gKFZlY3RvcikKKyAgKzB4MDExOCB8IDBDIDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgfCAweDAwMEMgKDEyKSAgICAgICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBkb2N1bWVudGF0aW9uYCAoaWQ6IDMpCisgICsweDAxMUEgfCAxMCAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgIHwgMHgwMDEwICgxNikgICAgICAgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgZGVjbGFyYXRpb25fZmlsZWAgKGlkOiA0KQorCit0YWJsZSAocmVmbGVjdGlvbi5TZXJ2aWNlKToKKyAgKzB4MDExQyB8IDBFIDAwIDAwIDAwICAgICAgICAgICAgIHwgU09mZnNldDMyICAgfCAweDAwMDAwMDBFICgxNCkgTG9jOiArMHgwMTBFICAgICAgIHwgb2Zmc2V0IHRvIHZ0YWJsZQorICArMHgwMTIwIHwgMjggMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDAwMjggKDQwKSBMb2M6ICsweDAxNDggICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYG5hbWVgIChzdHJpbmcpCisgICsweDAxMjQgfCAxMCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDAxMCAoMTYpIExvYzogKzB4MDEzNCAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgY2FsbHNgICh2ZWN0b3IpCisgICsweDAxMjggfCAwOCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDAwOCAoOCkgTG9jOiArMHgwMTMwICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgZG9jdW1lbnRhdGlvbmAgKHZlY3RvcikKKyAgKzB4MDEyQyB8IDM0IDM2IDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAzNjM0ICgxMzg3NikgTG9jOiArMHgzNzYwICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBkZWNsYXJhdGlvbl9maWxlYCAoc3RyaW5nKQorCit2ZWN0b3IgKHJlZmxlY3Rpb24uU2VydmljZS5kb2N1bWVudGF0aW9uKToKKyAgKzB4MDEzMCB8IDAwIDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgfCAweDAwMDAwMDAwICgwKSAgICAgICAgICAgICAgICAgICAgIHwgbGVuZ3RoIG9mIHZlY3RvciAoIyBpdGVtcykKKwordmVjdG9yIChyZWZsZWN0aW9uLlNlcnZpY2UuY2FsbHMpOgorICArMHgwMTM0IHwgMDQgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICB8IDB4MDAwMDAwMDQgKDQpICAgICAgICAgICAgICAgICAgICAgfCBsZW5ndGggb2YgdmVjdG9yICgjIGl0ZW1zKQorICArMHgwMTM4IHwgODggMDEgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDAxODggKDM5MikgTG9jOiArMHgwMkMwICAgICAgfCBvZmZzZXQgdG8gdGFibGVbMF0KKyAgKzB4MDEzQyB8IEY0IDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMEY0ICgyNDQpIExvYzogKzB4MDIzMCAgICAgIHwgb2Zmc2V0IHRvIHRhYmxlWzFdCisgICsweDAxNDAgfCA5MCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDA5MCAoMTQ0KSBMb2M6ICsweDAxRDAgICAgICB8IG9mZnNldCB0byB0YWJsZVsyXQorICArMHgwMTQ0IHwgMjggMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDAwMjggKDQwKSBMb2M6ICsweDAxNkMgICAgICAgfCBvZmZzZXQgdG8gdGFibGVbM10KKworc3RyaW5nIChyZWZsZWN0aW9uLlNlcnZpY2UubmFtZSk6CisgICsweDAxNDggfCAxRCAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgIHwgMHgwMDAwMDAxRCAoMjkpICAgICAgICAgICAgICAgICAgICB8IGxlbmd0aCBvZiBzdHJpbmcKKyAgKzB4MDE0QyB8IDREIDc5IDQ3IDYxIDZEIDY1IDJFIDQ1IHwgY2hhclsyOV0gICAgfCBNeUdhbWUuRSAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nIGxpdGVyYWwKKyAgKzB4MDE1NCB8IDc4IDYxIDZEIDcwIDZDIDY1IDJFIDREIHwgICAgICAgICAgICAgfCB4YW1wbGUuTQorICArMHgwMTVDIHwgNkYgNkUgNzMgNzQgNjUgNzIgNTMgNzQgfCAgICAgICAgICAgICB8IG9uc3RlclN0CisgICsweDAxNjQgfCA2RiA3MiA2MSA2NyA2NSAgICAgICAgICB8ICAgICAgICAgICAgIHwgb3JhZ2UKKyAgKzB4MDE2OSB8IDAwICAgICAgICAgICAgICAgICAgICAgIHwgY2hhciAgICAgICAgfCAweDAwICgwKSAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nIHRlcm1pbmF0b3IKKworcGFkZGluZzoKKyAgKzB4MDE2QSB8IDAwIDAwICAgICAgICAgICAgICAgICAgIHwgdWludDhfdFsyXSAgfCAuLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgcGFkZGluZworCit0YWJsZSAocmVmbGVjdGlvbi5SUENDYWxsKToKKyAgKzB4MDE2QyB8IEJBIEZFIEZGIEZGICAgICAgICAgICAgIHwgU09mZnNldDMyICAgfCAweEZGRkZGRUJBICgtMzI2KSBMb2M6ICsweDAyQjIgICAgIHwgb2Zmc2V0IHRvIHZ0YWJsZQorICArMHgwMTcwIHwgNDggMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDAwNDggKDcyKSBMb2M6ICsweDAxQjggICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYG5hbWVgIChzdHJpbmcpCisgICsweDAxNzQgfCA1QyAwRCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMEQ1QyAoMzQyMCkgTG9jOiArMHgwRUQwICAgICB8IG9mZnNldCB0byBmaWVsZCBgcmVxdWVzdGAgKHRhYmxlKQorICArMHgwMTc4IHwgRDQgMkQgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDJERDQgKDExNzMyKSBMb2M6ICsweDJGNEMgICAgfCBvZmZzZXQgdG8gZmllbGQgYHJlc3BvbnNlYCAodGFibGUpCisgICsweDAxN0MgfCAwQyAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDAwQyAoMTIpIExvYzogKzB4MDE4OCAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgYXR0cmlidXRlc2AgKHZlY3RvcikKKyAgKzB4MDE4MCB8IDA0IDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMDA0ICg0KSBMb2M6ICsweDAxODQgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBkb2N1bWVudGF0aW9uYCAodmVjdG9yKQorCit2ZWN0b3IgKHJlZmxlY3Rpb24uUlBDQ2FsbC5kb2N1bWVudGF0aW9uKToKKyAgKzB4MDE4NCB8IDAwIDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgfCAweDAwMDAwMDAwICgwKSAgICAgICAgICAgICAgICAgICAgIHwgbGVuZ3RoIG9mIHZlY3RvciAoIyBpdGVtcykKKwordmVjdG9yIChyZWZsZWN0aW9uLlJQQ0NhbGwuYXR0cmlidXRlcyk6CisgICsweDAxODggfCAwMSAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgIHwgMHgwMDAwMDAwMSAoMSkgICAgICAgICAgICAgICAgICAgICB8IGxlbmd0aCBvZiB2ZWN0b3IgKCMgaXRlbXMpCisgICsweDAxOEMgfCAwNCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDAwNCAoNCkgTG9jOiArMHgwMTkwICAgICAgICB8IG9mZnNldCB0byB0YWJsZVswXQorCit0YWJsZSAocmVmbGVjdGlvbi5LZXlWYWx1ZSk6CisgICsweDAxOTAgfCAyQyBDQyBGRiBGRiAgICAgICAgICAgICB8IFNPZmZzZXQzMiAgIHwgMHhGRkZGQ0MyQyAoLTEzMjY4KSBMb2M6ICsweDM1NjQgICB8IG9mZnNldCB0byB2dGFibGUKKyAgKzB4MDE5NCB8IDE0IDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMDE0ICgyMCkgTG9jOiArMHgwMUE4ICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBrZXlgIChzdHJpbmcpCisgICsweDAxOTggfCAwNCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDAwNCAoNCkgTG9jOiArMHgwMTlDICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgdmFsdWVgIChzdHJpbmcpCisKK3N0cmluZyAocmVmbGVjdGlvbi5LZXlWYWx1ZS52YWx1ZSk6CisgICsweDAxOUMgfCAwNCAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgIHwgMHgwMDAwMDAwNCAoNCkgICAgICAgICAgICAgICAgICAgICB8IGxlbmd0aCBvZiBzdHJpbmcKKyAgKzB4MDFBMCB8IDYyIDY5IDY0IDY5ICAgICAgICAgICAgIHwgY2hhcls0XSAgICAgfCBiaWRpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nIGxpdGVyYWwKKyAgKzB4MDFBNCB8IDAwICAgICAgICAgICAgICAgICAgICAgIHwgY2hhciAgICAgICAgfCAweDAwICgwKSAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nIHRlcm1pbmF0b3IKKworcGFkZGluZzoKKyAgKzB4MDFBNSB8IDAwIDAwIDAwICAgICAgICAgICAgICAgIHwgdWludDhfdFszXSAgfCAuLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgcGFkZGluZworCitzdHJpbmcgKHJlZmxlY3Rpb24uS2V5VmFsdWUua2V5KToKKyAgKzB4MDFBOCB8IDA5IDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgfCAweDAwMDAwMDA5ICg5KSAgICAgICAgICAgICAgICAgICAgIHwgbGVuZ3RoIG9mIHN0cmluZworICArMHgwMUFDIHwgNzMgNzQgNzIgNjUgNjEgNkQgNjkgNkUgfCBjaGFyWzldICAgICB8IHN0cmVhbWluICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJpbmcgbGl0ZXJhbAorICArMHgwMUI0IHwgNjcgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICB8IGcKKyAgKzB4MDFCNSB8IDAwICAgICAgICAgICAgICAgICAgICAgIHwgY2hhciAgICAgICAgfCAweDAwICgwKSAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nIHRlcm1pbmF0b3IKKworcGFkZGluZzoKKyAgKzB4MDFCNiB8IDAwIDAwICAgICAgICAgICAgICAgICAgIHwgdWludDhfdFsyXSAgfCAuLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgcGFkZGluZworCitzdHJpbmcgKHJlZmxlY3Rpb24uUlBDQ2FsbC5uYW1lKToKKyAgKzB4MDFCOCB8IDEyIDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgfCAweDAwMDAwMDEyICgxOCkgICAgICAgICAgICAgICAgICAgIHwgbGVuZ3RoIG9mIHN0cmluZworICArMHgwMUJDIHwgNDcgNjUgNzQgNEQgNjkgNkUgNEQgNjEgfCBjaGFyWzE4XSAgICB8IEdldE1pbk1hICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJpbmcgbGl0ZXJhbAorICArMHgwMUM0IHwgNzggNDggNjkgNzQgNTAgNkYgNjkgNkUgfCAgICAgICAgICAgICB8IHhIaXRQb2luCisgICsweDAxQ0MgfCA3NCA3MyAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgIHwgdHMKKyAgKzB4MDFDRSB8IDAwICAgICAgICAgICAgICAgICAgICAgIHwgY2hhciAgICAgICAgfCAweDAwICgwKSAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nIHRlcm1pbmF0b3IKKwordGFibGUgKHJlZmxlY3Rpb24uUlBDQ2FsbCk6CisgICsweDAxRDAgfCAxRSBGRiBGRiBGRiAgICAgICAgICAgICB8IFNPZmZzZXQzMiAgIHwgMHhGRkZGRkYxRSAoLTIyNikgTG9jOiArMHgwMkIyICAgICB8IG9mZnNldCB0byB2dGFibGUKKyAgKzB4MDFENCB8IDQ4IDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMDQ4ICg3MikgTG9jOiArMHgwMjFDICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBuYW1lYCAoc3RyaW5nKQorICArMHgwMUQ4IHwgRjggMEMgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDBDRjggKDMzMjApIExvYzogKzB4MEVEMCAgICAgfCBvZmZzZXQgdG8gZmllbGQgYHJlcXVlc3RgICh0YWJsZSkKKyAgKzB4MDFEQyB8IDcwIDJEIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAyRDcwICgxMTYzMikgTG9jOiArMHgyRjRDICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGByZXNwb25zZWAgKHRhYmxlKQorICArMHgwMUUwIHwgMEMgMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDAwMEMgKDEyKSBMb2M6ICsweDAxRUMgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYGF0dHJpYnV0ZXNgICh2ZWN0b3IpCisgICsweDAxRTQgfCAwNCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDAwNCAoNCkgTG9jOiArMHgwMUU4ICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgZG9jdW1lbnRhdGlvbmAgKHZlY3RvcikKKwordmVjdG9yIChyZWZsZWN0aW9uLlJQQ0NhbGwuZG9jdW1lbnRhdGlvbik6CisgICsweDAxRTggfCAwMCAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgIHwgMHgwMDAwMDAwMCAoMCkgICAgICAgICAgICAgICAgICAgICB8IGxlbmd0aCBvZiB2ZWN0b3IgKCMgaXRlbXMpCisKK3ZlY3RvciAocmVmbGVjdGlvbi5SUENDYWxsLmF0dHJpYnV0ZXMpOgorICArMHgwMUVDIHwgMDEgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICB8IDB4MDAwMDAwMDEgKDEpICAgICAgICAgICAgICAgICAgICAgfCBsZW5ndGggb2YgdmVjdG9yICgjIGl0ZW1zKQorICArMHgwMUYwIHwgMDQgMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDAwMDQgKDQpIExvYzogKzB4MDFGNCAgICAgICAgfCBvZmZzZXQgdG8gdGFibGVbMF0KKwordGFibGUgKHJlZmxlY3Rpb24uS2V5VmFsdWUpOgorICArMHgwMUY0IHwgOTAgQ0MgRkYgRkYgICAgICAgICAgICAgfCBTT2Zmc2V0MzIgICB8IDB4RkZGRkNDOTAgKC0xMzE2OCkgTG9jOiArMHgzNTY0ICAgfCBvZmZzZXQgdG8gdnRhYmxlCisgICsweDAxRjggfCAxNCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDAxNCAoMjApIExvYzogKzB4MDIwQyAgICAgICB8IG9mZnNldCB0byBmaWVsZCBga2V5YCAoc3RyaW5nKQorICArMHgwMUZDIHwgMDQgMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDAwMDQgKDQpIExvYzogKzB4MDIwMCAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYHZhbHVlYCAoc3RyaW5nKQorCitzdHJpbmcgKHJlZmxlY3Rpb24uS2V5VmFsdWUudmFsdWUpOgorICArMHgwMjAwIHwgMDYgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICB8IDB4MDAwMDAwMDYgKDYpICAgICAgICAgICAgICAgICAgICAgfCBsZW5ndGggb2Ygc3RyaW5nCisgICsweDAyMDQgfCA2MyA2QyA2OSA2NSA2RSA3NCAgICAgICB8IGNoYXJbNl0gICAgIHwgY2xpZW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHN0cmluZyBsaXRlcmFsCisgICsweDAyMEEgfCAwMCAgICAgICAgICAgICAgICAgICAgICB8IGNoYXIgICAgICAgIHwgMHgwMCAoMCkgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHN0cmluZyB0ZXJtaW5hdG9yCisKK3N0cmluZyAocmVmbGVjdGlvbi5LZXlWYWx1ZS5rZXkpOgorICArMHgwMjBDIHwgMDkgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICB8IDB4MDAwMDAwMDkgKDkpICAgICAgICAgICAgICAgICAgICAgfCBsZW5ndGggb2Ygc3RyaW5nCisgICsweDAyMTAgfCA3MyA3NCA3MiA2NSA2MSA2RCA2OSA2RSB8IGNoYXJbOV0gICAgIHwgc3RyZWFtaW4gICAgICAgICAgICAgICAgICAgICAgICAgICB8IHN0cmluZyBsaXRlcmFsCisgICsweDAyMTggfCA2NyAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgIHwgZworICArMHgwMjE5IHwgMDAgICAgICAgICAgICAgICAgICAgICAgfCBjaGFyICAgICAgICB8IDB4MDAgKDApICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJpbmcgdGVybWluYXRvcgorCitwYWRkaW5nOgorICArMHgwMjFBIHwgMDAgMDAgICAgICAgICAgICAgICAgICAgfCB1aW50OF90WzJdICB8IC4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBwYWRkaW5nCisKK3N0cmluZyAocmVmbGVjdGlvbi5SUENDYWxsLm5hbWUpOgorICArMHgwMjFDIHwgMEUgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICB8IDB4MDAwMDAwMEUgKDE0KSAgICAgICAgICAgICAgICAgICAgfCBsZW5ndGggb2Ygc3RyaW5nCisgICsweDAyMjAgfCA0NyA2NSA3NCA0RCA2MSA3OCA0OCA2OSB8IGNoYXJbMTRdICAgIHwgR2V0TWF4SGkgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHN0cmluZyBsaXRlcmFsCisgICsweDAyMjggfCA3NCA1MCA2RiA2OSA2RSA3NCAgICAgICB8ICAgICAgICAgICAgIHwgdFBvaW50CisgICsweDAyMkUgfCAwMCAgICAgICAgICAgICAgICAgICAgICB8IGNoYXIgICAgICAgIHwgMHgwMCAoMCkgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHN0cmluZyB0ZXJtaW5hdG9yCisKK3RhYmxlIChyZWZsZWN0aW9uLlJQQ0NhbGwpOgorICArMHgwMjMwIHwgN0UgRkYgRkYgRkYgICAgICAgICAgICAgfCBTT2Zmc2V0MzIgICB8IDB4RkZGRkZGN0UgKC0xMzApIExvYzogKzB4MDJCMiAgICAgfCBvZmZzZXQgdG8gdnRhYmxlCisgICsweDAyMzQgfCA3MCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDA3MCAoMTEyKSBMb2M6ICsweDAyQTQgICAgICB8IG9mZnNldCB0byBmaWVsZCBgbmFtZWAgKHN0cmluZykKKyAgKzB4MDIzOCB8IDE0IDJEIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAyRDE0ICgxMTU0MCkgTG9jOiArMHgyRjRDICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGByZXF1ZXN0YCAodGFibGUpCisgICsweDAyM0MgfCA5NCAwQyAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMEM5NCAoMzIyMCkgTG9jOiArMHgwRUQwICAgICB8IG9mZnNldCB0byBmaWVsZCBgcmVzcG9uc2VgICh0YWJsZSkKKyAgKzB4MDI0MCB8IDBDIDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMDBDICgxMikgTG9jOiArMHgwMjRDICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBhdHRyaWJ1dGVzYCAodmVjdG9yKQorICArMHgwMjQ0IHwgMDQgMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDAwMDQgKDQpIExvYzogKzB4MDI0OCAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYGRvY3VtZW50YXRpb25gICh2ZWN0b3IpCisKK3ZlY3RvciAocmVmbGVjdGlvbi5SUENDYWxsLmRvY3VtZW50YXRpb24pOgorICArMHgwMjQ4IHwgMDAgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICB8IDB4MDAwMDAwMDAgKDApICAgICAgICAgICAgICAgICAgICAgfCBsZW5ndGggb2YgdmVjdG9yICgjIGl0ZW1zKQorCit2ZWN0b3IgKHJlZmxlY3Rpb24uUlBDQ2FsbC5hdHRyaWJ1dGVzKToKKyAgKzB4MDI0QyB8IDAyIDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgfCAweDAwMDAwMDAyICgyKSAgICAgICAgICAgICAgICAgICAgIHwgbGVuZ3RoIG9mIHZlY3RvciAoIyBpdGVtcykKKyAgKzB4MDI1MCB8IDMwIDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMDMwICg0OCkgTG9jOiArMHgwMjgwICAgICAgIHwgb2Zmc2V0IHRvIHRhYmxlWzBdCisgICsweDAyNTQgfCAwNCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDAwNCAoNCkgTG9jOiArMHgwMjU4ICAgICAgICB8IG9mZnNldCB0byB0YWJsZVsxXQorCit0YWJsZSAocmVmbGVjdGlvbi5LZXlWYWx1ZSk6CisgICsweDAyNTggfCBGNCBDQyBGRiBGRiAgICAgICAgICAgICB8IFNPZmZzZXQzMiAgIHwgMHhGRkZGQ0NGNCAoLTEzMDY4KSBMb2M6ICsweDM1NjQgICB8IG9mZnNldCB0byB2dGFibGUKKyAgKzB4MDI1QyB8IDE0IDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMDE0ICgyMCkgTG9jOiArMHgwMjcwICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBrZXlgIChzdHJpbmcpCisgICsweDAyNjAgfCAwNCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDAwNCAoNCkgTG9jOiArMHgwMjY0ICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgdmFsdWVgIChzdHJpbmcpCisKK3N0cmluZyAocmVmbGVjdGlvbi5LZXlWYWx1ZS52YWx1ZSk6CisgICsweDAyNjQgfCAwNiAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgIHwgMHgwMDAwMDAwNiAoNikgICAgICAgICAgICAgICAgICAgICB8IGxlbmd0aCBvZiBzdHJpbmcKKyAgKzB4MDI2OCB8IDczIDY1IDcyIDc2IDY1IDcyICAgICAgIHwgY2hhcls2XSAgICAgfCBzZXJ2ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nIGxpdGVyYWwKKyAgKzB4MDI2RSB8IDAwICAgICAgICAgICAgICAgICAgICAgIHwgY2hhciAgICAgICAgfCAweDAwICgwKSAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nIHRlcm1pbmF0b3IKKworc3RyaW5nIChyZWZsZWN0aW9uLktleVZhbHVlLmtleSk6CisgICsweDAyNzAgfCAwOSAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgIHwgMHgwMDAwMDAwOSAoOSkgICAgICAgICAgICAgICAgICAgICB8IGxlbmd0aCBvZiBzdHJpbmcKKyAgKzB4MDI3NCB8IDczIDc0IDcyIDY1IDYxIDZEIDY5IDZFIHwgY2hhcls5XSAgICAgfCBzdHJlYW1pbiAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nIGxpdGVyYWwKKyAgKzB4MDI3QyB8IDY3ICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgfCBnCisgICsweDAyN0QgfCAwMCAgICAgICAgICAgICAgICAgICAgICB8IGNoYXIgICAgICAgIHwgMHgwMCAoMCkgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHN0cmluZyB0ZXJtaW5hdG9yCisKK3BhZGRpbmc6CisgICsweDAyN0UgfCAwMCAwMCAgICAgICAgICAgICAgICAgICB8IHVpbnQ4X3RbMl0gIHwgLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHBhZGRpbmcKKwordGFibGUgKHJlZmxlY3Rpb24uS2V5VmFsdWUpOgorICArMHgwMjgwIHwgMUMgQ0QgRkYgRkYgICAgICAgICAgICAgfCBTT2Zmc2V0MzIgICB8IDB4RkZGRkNEMUMgKC0xMzAyOCkgTG9jOiArMHgzNTY0ICAgfCBvZmZzZXQgdG8gdnRhYmxlCisgICsweDAyODQgfCAxMCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDAxMCAoMTYpIExvYzogKzB4MDI5NCAgICAgICB8IG9mZnNldCB0byBmaWVsZCBga2V5YCAoc3RyaW5nKQorICArMHgwMjg4IHwgMDQgMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDAwMDQgKDQpIExvYzogKzB4MDI4QyAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYHZhbHVlYCAoc3RyaW5nKQorCitzdHJpbmcgKHJlZmxlY3Rpb24uS2V5VmFsdWUudmFsdWUpOgorICArMHgwMjhDIHwgMDEgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICB8IDB4MDAwMDAwMDEgKDEpICAgICAgICAgICAgICAgICAgICAgfCBsZW5ndGggb2Ygc3RyaW5nCisgICsweDAyOTAgfCAzMCAgICAgICAgICAgICAgICAgICAgICB8IGNoYXJbMV0gICAgIHwgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHN0cmluZyBsaXRlcmFsCisgICsweDAyOTEgfCAwMCAgICAgICAgICAgICAgICAgICAgICB8IGNoYXIgICAgICAgIHwgMHgwMCAoMCkgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHN0cmluZyB0ZXJtaW5hdG9yCisKK3BhZGRpbmc6CisgICsweDAyOTIgfCAwMCAwMCAgICAgICAgICAgICAgICAgICB8IHVpbnQ4X3RbMl0gIHwgLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHBhZGRpbmcKKworc3RyaW5nIChyZWZsZWN0aW9uLktleVZhbHVlLmtleSk6CisgICsweDAyOTQgfCAwQSAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgIHwgMHgwMDAwMDAwQSAoMTApICAgICAgICAgICAgICAgICAgICB8IGxlbmd0aCBvZiBzdHJpbmcKKyAgKzB4MDI5OCB8IDY5IDY0IDY1IDZEIDcwIDZGIDc0IDY1IHwgY2hhclsxMF0gICAgfCBpZGVtcG90ZSAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nIGxpdGVyYWwKKyAgKzB4MDJBMCB8IDZFIDc0ICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgfCBudAorICArMHgwMkEyIHwgMDAgICAgICAgICAgICAgICAgICAgICAgfCBjaGFyICAgICAgICB8IDB4MDAgKDApICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJpbmcgdGVybWluYXRvcgorCitzdHJpbmcgKHJlZmxlY3Rpb24uUlBDQ2FsbC5uYW1lKToKKyAgKzB4MDJBNCB8IDA4IDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgfCAweDAwMDAwMDA4ICg4KSAgICAgICAgICAgICAgICAgICAgIHwgbGVuZ3RoIG9mIHN0cmluZworICArMHgwMkE4IHwgNTIgNjUgNzQgNzIgNjkgNjUgNzYgNjUgfCBjaGFyWzhdICAgICB8IFJldHJpZXZlICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJpbmcgbGl0ZXJhbAorICArMHgwMkIwIHwgMDAgICAgICAgICAgICAgICAgICAgICAgfCBjaGFyICAgICAgICB8IDB4MDAgKDApICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJpbmcgdGVybWluYXRvcgorCit2dGFibGUgKHJlZmxlY3Rpb24uUlBDQ2FsbCk6CisgICsweDAyQjIgfCAwRSAwMCAgICAgICAgICAgICAgICAgICB8IHVpbnQxNl90ICAgIHwgMHgwMDBFICgxNCkgICAgICAgICAgICAgICAgICAgICAgICB8IHNpemUgb2YgdGhpcyB2dGFibGUKKyAgKzB4MDJCNCB8IDE4IDAwICAgICAgICAgICAgICAgICAgIHwgdWludDE2X3QgICAgfCAweDAwMTggKDI0KSAgICAgICAgICAgICAgICAgICAgICAgIHwgc2l6ZSBvZiByZWZlcnJpbmcgdGFibGUKKyAgKzB4MDJCNiB8IDA0IDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgfCAweDAwMDQgKDQpICAgICAgICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBuYW1lYCAoaWQ6IDApCisgICsweDAyQjggfCAwOCAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgIHwgMHgwMDA4ICg4KSAgICAgICAgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgcmVxdWVzdGAgKGlkOiAxKQorICArMHgwMkJBIHwgMEMgMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgICB8IDB4MDAwQyAoMTIpICAgICAgICAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYHJlc3BvbnNlYCAoaWQ6IDIpCisgICsweDAyQkMgfCAxMCAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgIHwgMHgwMDEwICgxNikgICAgICAgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgYXR0cmlidXRlc2AgKGlkOiAzKQorICArMHgwMkJFIHwgMTQgMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgICB8IDB4MDAxNCAoMjApICAgICAgICAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYGRvY3VtZW50YXRpb25gIChpZDogNCkKKwordGFibGUgKHJlZmxlY3Rpb24uUlBDQ2FsbCk6CisgICsweDAyQzAgfCAwRSAwMCAwMCAwMCAgICAgICAgICAgICB8IFNPZmZzZXQzMiAgIHwgMHgwMDAwMDAwRSAoMTQpIExvYzogKzB4MDJCMiAgICAgICB8IG9mZnNldCB0byB2dGFibGUKKyAgKzB4MDJDNCB8IDQ4IDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMDQ4ICg3MikgTG9jOiArMHgwMzBDICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBuYW1lYCAoc3RyaW5nKQorICArMHgwMkM4IHwgMDggMEMgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDBDMDggKDMwODApIExvYzogKzB4MEVEMCAgICAgfCBvZmZzZXQgdG8gZmllbGQgYHJlcXVlc3RgICh0YWJsZSkKKyAgKzB4MDJDQyB8IDgwIDJDIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAyQzgwICgxMTM5MikgTG9jOiArMHgyRjRDICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGByZXNwb25zZWAgKHRhYmxlKQorICArMHgwMkQwIHwgMEMgMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDAwMEMgKDEyKSBMb2M6ICsweDAyREMgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYGF0dHJpYnV0ZXNgICh2ZWN0b3IpCisgICsweDAyRDQgfCAwNCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDAwNCAoNCkgTG9jOiArMHgwMkQ4ICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgZG9jdW1lbnRhdGlvbmAgKHZlY3RvcikKKwordmVjdG9yIChyZWZsZWN0aW9uLlJQQ0NhbGwuZG9jdW1lbnRhdGlvbik6CisgICsweDAyRDggfCAwMCAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgIHwgMHgwMDAwMDAwMCAoMCkgICAgICAgICAgICAgICAgICAgICB8IGxlbmd0aCBvZiB2ZWN0b3IgKCMgaXRlbXMpCisKK3ZlY3RvciAocmVmbGVjdGlvbi5SUENDYWxsLmF0dHJpYnV0ZXMpOgorICArMHgwMkRDIHwgMDEgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICB8IDB4MDAwMDAwMDEgKDEpICAgICAgICAgICAgICAgICAgICAgfCBsZW5ndGggb2YgdmVjdG9yICgjIGl0ZW1zKQorICArMHgwMkUwIHwgMDQgMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDAwMDQgKDQpIExvYzogKzB4MDJFNCAgICAgICAgfCBvZmZzZXQgdG8gdGFibGVbMF0KKwordGFibGUgKHJlZmxlY3Rpb24uS2V5VmFsdWUpOgorICArMHgwMkU0IHwgODAgQ0QgRkYgRkYgICAgICAgICAgICAgfCBTT2Zmc2V0MzIgICB8IDB4RkZGRkNEODAgKC0xMjkyOCkgTG9jOiArMHgzNTY0ICAgfCBvZmZzZXQgdG8gdnRhYmxlCisgICsweDAyRTggfCAxNCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDAxNCAoMjApIExvYzogKzB4MDJGQyAgICAgICB8IG9mZnNldCB0byBmaWVsZCBga2V5YCAoc3RyaW5nKQorICArMHgwMkVDIHwgMDQgMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDAwMDQgKDQpIExvYzogKzB4MDJGMCAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYHZhbHVlYCAoc3RyaW5nKQorCitzdHJpbmcgKHJlZmxlY3Rpb24uS2V5VmFsdWUudmFsdWUpOgorICArMHgwMkYwIHwgMDQgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICB8IDB4MDAwMDAwMDQgKDQpICAgICAgICAgICAgICAgICAgICAgfCBsZW5ndGggb2Ygc3RyaW5nCisgICsweDAyRjQgfCA2RSA2RiA2RSA2NSAgICAgICAgICAgICB8IGNoYXJbNF0gICAgIHwgbm9uZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHN0cmluZyBsaXRlcmFsCisgICsweDAyRjggfCAwMCAgICAgICAgICAgICAgICAgICAgICB8IGNoYXIgICAgICAgIHwgMHgwMCAoMCkgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHN0cmluZyB0ZXJtaW5hdG9yCisKK3BhZGRpbmc6CisgICsweDAyRjkgfCAwMCAwMCAwMCAgICAgICAgICAgICAgICB8IHVpbnQ4X3RbM10gIHwgLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHBhZGRpbmcKKworc3RyaW5nIChyZWZsZWN0aW9uLktleVZhbHVlLmtleSk6CisgICsweDAyRkMgfCAwOSAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgIHwgMHgwMDAwMDAwOSAoOSkgICAgICAgICAgICAgICAgICAgICB8IGxlbmd0aCBvZiBzdHJpbmcKKyAgKzB4MDMwMCB8IDczIDc0IDcyIDY1IDYxIDZEIDY5IDZFIHwgY2hhcls5XSAgICAgfCBzdHJlYW1pbiAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nIGxpdGVyYWwKKyAgKzB4MDMwOCB8IDY3ICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgfCBnCisgICsweDAzMDkgfCAwMCAgICAgICAgICAgICAgICAgICAgICB8IGNoYXIgICAgICAgIHwgMHgwMCAoMCkgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHN0cmluZyB0ZXJtaW5hdG9yCisKK3BhZGRpbmc6CisgICsweDAzMEEgfCAwMCAwMCAgICAgICAgICAgICAgICAgICB8IHVpbnQ4X3RbMl0gIHwgLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHBhZGRpbmcKKworc3RyaW5nIChyZWZsZWN0aW9uLlJQQ0NhbGwubmFtZSk6CisgICsweDAzMEMgfCAwNSAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgIHwgMHgwMDAwMDAwNSAoNSkgICAgICAgICAgICAgICAgICAgICB8IGxlbmd0aCBvZiBzdHJpbmcKKyAgKzB4MDMxMCB8IDUzIDc0IDZGIDcyIDY1ICAgICAgICAgIHwgY2hhcls1XSAgICAgfCBTdG9yZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nIGxpdGVyYWwKKyAgKzB4MDMxNSB8IDAwICAgICAgICAgICAgICAgICAgICAgIHwgY2hhciAgICAgICAgfCAweDAwICgwKSAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nIHRlcm1pbmF0b3IKKworcGFkZGluZzoKKyAgKzB4MDMxNiB8IDAwIDAwICAgICAgICAgICAgICAgICAgIHwgdWludDhfdFsyXSAgfCAuLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgcGFkZGluZworCit0YWJsZSAocmVmbGVjdGlvbi5FbnVtKToKKyAgKzB4MDMxOCB8IDgyIEZEIEZGIEZGICAgICAgICAgICAgIHwgU09mZnNldDMyICAgfCAweEZGRkZGRDgyICgtNjM4KSBMb2M6ICsweDA1OTYgICAgIHwgb2Zmc2V0IHRvIHZ0YWJsZQorICArMHgwMzFDIHwgMDAgMDAgMDAgICAgICAgICAgICAgICAgfCB1aW50OF90WzNdICB8IC4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBwYWRkaW5nCisgICsweDAzMUYgfCAwMSAgICAgICAgICAgICAgICAgICAgICB8IHVpbnQ4X3QgICAgIHwgMHgwMSAoMSkgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHRhYmxlIGZpZWxkIGBpc191bmlvbmAgKEJvb2wpCisgICsweDAzMjAgfCA0MCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDA0MCAoNjQpIExvYzogKzB4MDM2MCAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgbmFtZWAgKHN0cmluZykKKyAgKzB4MDMyNCB8IDI4IDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMDI4ICg0MCkgTG9jOiArMHgwMzRDICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGB2YWx1ZXNgICh2ZWN0b3IpCisgICsweDAzMjggfCAxMCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDAxMCAoMTYpIExvYzogKzB4MDMzOCAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgdW5kZXJseWluZ190eXBlYCAodGFibGUpCisgICsweDAzMkMgfCAwOCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDAwOCAoOCkgTG9jOiArMHgwMzM0ICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgZG9jdW1lbnRhdGlvbmAgKHZlY3RvcikKKyAgKzB4MDMzMCB8IDMwIDM0IDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAzNDMwICgxMzM2MCkgTG9jOiArMHgzNzYwICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBkZWNsYXJhdGlvbl9maWxlYCAoc3RyaW5nKQorCit2ZWN0b3IgKHJlZmxlY3Rpb24uRW51bS5kb2N1bWVudGF0aW9uKToKKyAgKzB4MDMzNCB8IDAwIDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgfCAweDAwMDAwMDAwICgwKSAgICAgICAgICAgICAgICAgICAgIHwgbGVuZ3RoIG9mIHZlY3RvciAoIyBpdGVtcykKKwordGFibGUgKHJlZmxlY3Rpb24uVHlwZSk6CisgICsweDAzMzggfCAzNCBDRCBGRiBGRiAgICAgICAgICAgICB8IFNPZmZzZXQzMiAgIHwgMHhGRkZGQ0QzNCAoLTEzMDA0KSBMb2M6ICsweDM2MDQgICB8IG9mZnNldCB0byB2dGFibGUKKyAgKzB4MDMzQyB8IDAwIDAwIDAwICAgICAgICAgICAgICAgIHwgdWludDhfdFszXSAgfCAuLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgcGFkZGluZworICArMHgwMzNGIHwgMDEgICAgICAgICAgICAgICAgICAgICAgfCB1aW50OF90ICAgICB8IDB4MDEgKDEpICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB0YWJsZSBmaWVsZCBgYmFzZV90eXBlYCAoQnl0ZSkKKyAgKzB4MDM0MCB8IDAxIDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgfCAweDAwMDAwMDAxICgxKSAgICAgICAgICAgICAgICAgICAgIHwgdGFibGUgZmllbGQgYGluZGV4YCAoSW50KQorICArMHgwMzQ0IHwgMDEgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICB8IDB4MDAwMDAwMDEgKDEpICAgICAgICAgICAgICAgICAgICAgfCB0YWJsZSBmaWVsZCBgYmFzZV9zaXplYCAoVUludCkKKyAgKzB4MDM0OCB8IDAxIDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgfCAweDAwMDAwMDAxICgxKSAgICAgICAgICAgICAgICAgICAgIHwgdGFibGUgZmllbGQgYGVsZW1lbnRfc2l6ZWAgKFVJbnQpCisKK3ZlY3RvciAocmVmbGVjdGlvbi5FbnVtLnZhbHVlcyk6CisgICsweDAzNEMgfCAwNCAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgIHwgMHgwMDAwMDAwNCAoNCkgICAgICAgICAgICAgICAgICAgICB8IGxlbmd0aCBvZiB2ZWN0b3IgKCMgaXRlbXMpCisgICsweDAzNTAgfCBFMCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDBFMCAoMjI0KSBMb2M6ICsweDA0MzAgICAgICB8IG9mZnNldCB0byB0YWJsZVswXQorICArMHgwMzU0IHwgQTQgMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDAwQTQgKDE2NCkgTG9jOiArMHgwM0Y4ICAgICAgfCBvZmZzZXQgdG8gdGFibGVbMV0KKyAgKzB4MDM1OCB8IDY4IDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMDY4ICgxMDQpIExvYzogKzB4MDNDMCAgICAgIHwgb2Zmc2V0IHRvIHRhYmxlWzJdCisgICsweDAzNUMgfCAyQyAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDAyQyAoNDQpIExvYzogKzB4MDM4OCAgICAgICB8IG9mZnNldCB0byB0YWJsZVszXQorCitzdHJpbmcgKHJlZmxlY3Rpb24uRW51bS5uYW1lKToKKyAgKzB4MDM2MCB8IDIyIDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgfCAweDAwMDAwMDIyICgzNCkgICAgICAgICAgICAgICAgICAgIHwgbGVuZ3RoIG9mIHN0cmluZworICArMHgwMzY0IHwgNEQgNzkgNDcgNjEgNkQgNjUgMkUgNDUgfCBjaGFyWzM0XSAgICB8IE15R2FtZS5FICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJpbmcgbGl0ZXJhbAorICArMHgwMzZDIHwgNzggNjEgNkQgNzAgNkMgNjUgMkUgNDEgfCAgICAgICAgICAgICB8IHhhbXBsZS5BCisgICsweDAzNzQgfCA2RSA3OSA0MSA2RCA2MiA2OSA2NyA3NSB8ICAgICAgICAgICAgIHwgbnlBbWJpZ3UKKyAgKzB4MDM3QyB8IDZGIDc1IDczIDQxIDZDIDY5IDYxIDczIHwgICAgICAgICAgICAgfCBvdXNBbGlhcworICArMHgwMzg0IHwgNjUgNzMgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICB8IGVzCisgICsweDAzODYgfCAwMCAgICAgICAgICAgICAgICAgICAgICB8IGNoYXIgICAgICAgIHwgMHgwMCAoMCkgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHN0cmluZyB0ZXJtaW5hdG9yCisKK3RhYmxlIChyZWZsZWN0aW9uLkVudW1WYWwpOgorICArMHgwMzg4IHwgN0UgRjggRkYgRkYgICAgICAgICAgICAgfCBTT2Zmc2V0MzIgICB8IDB4RkZGRkY4N0UgKC0xOTIyKSBMb2M6ICsweDBCMEEgICAgfCBvZmZzZXQgdG8gdnRhYmxlCisgICsweDAzOEMgfCAyQyAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDAyQyAoNDQpIExvYzogKzB4MDNCOCAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgbmFtZWAgKHN0cmluZykKKyAgKzB4MDM5MCB8IDE4IDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMDE4ICgyNCkgTG9jOiArMHgwM0E4ICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGB1bmlvbl90eXBlYCAodGFibGUpCisgICsweDAzOTQgfCAxMCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDAxMCAoMTYpIExvYzogKzB4MDNBNCAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgZG9jdW1lbnRhdGlvbmAgKHZlY3RvcikKKyAgKzB4MDM5OCB8IDAzIDAwIDAwIDAwIDAwIDAwIDAwIDAwIHwgaW50NjRfdCAgICAgfCAweDAwMDAwMDAwMDAwMDAwMDMgKDMpICAgICAgICAgICAgIHwgdGFibGUgZmllbGQgYHZhbHVlYCAoTG9uZykKKyAgKzB4MDNBMCB8IDAwIDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDhfdFs0XSAgfCAuLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgcGFkZGluZworCit2ZWN0b3IgKHJlZmxlY3Rpb24uRW51bVZhbC5kb2N1bWVudGF0aW9uKToKKyAgKzB4MDNBNCB8IDAwIDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgfCAweDAwMDAwMDAwICgwKSAgICAgICAgICAgICAgICAgICAgIHwgbGVuZ3RoIG9mIHZlY3RvciAoIyBpdGVtcykKKwordGFibGUgKHJlZmxlY3Rpb24uVHlwZSk6CisgICsweDAzQTggfCBGMCBDQSBGRiBGRiAgICAgICAgICAgICB8IFNPZmZzZXQzMiAgIHwgMHhGRkZGQ0FGMCAoLTEzNTg0KSBMb2M6ICsweDM4QjggICB8IG9mZnNldCB0byB2dGFibGUKKyAgKzB4MDNBQyB8IDAwIDAwIDAwICAgICAgICAgICAgICAgIHwgdWludDhfdFszXSAgfCAuLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgcGFkZGluZworICArMHgwM0FGIHwgMEYgICAgICAgICAgICAgICAgICAgICAgfCB1aW50OF90ICAgICB8IDB4MEYgKDE1KSAgICAgICAgICAgICAgICAgICAgICAgICAgfCB0YWJsZSBmaWVsZCBgYmFzZV90eXBlYCAoQnl0ZSkKKyAgKzB4MDNCMCB8IDAxIDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgfCAweDAwMDAwMDAxICgxKSAgICAgICAgICAgICAgICAgICAgIHwgdGFibGUgZmllbGQgYGluZGV4YCAoSW50KQorICArMHgwM0I0IHwgMDEgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICB8IDB4MDAwMDAwMDEgKDEpICAgICAgICAgICAgICAgICAgICAgfCB0YWJsZSBmaWVsZCBgZWxlbWVudF9zaXplYCAoVUludCkKKworc3RyaW5nIChyZWZsZWN0aW9uLkVudW1WYWwubmFtZSk6CisgICsweDAzQjggfCAwMiAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgIHwgMHgwMDAwMDAwMiAoMikgICAgICAgICAgICAgICAgICAgICB8IGxlbmd0aCBvZiBzdHJpbmcKKyAgKzB4MDNCQyB8IDREIDMzICAgICAgICAgICAgICAgICAgIHwgY2hhclsyXSAgICAgfCBNMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nIGxpdGVyYWwKKyAgKzB4MDNCRSB8IDAwICAgICAgICAgICAgICAgICAgICAgIHwgY2hhciAgICAgICAgfCAweDAwICgwKSAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nIHRlcm1pbmF0b3IKKwordGFibGUgKHJlZmxlY3Rpb24uRW51bVZhbCk6CisgICsweDAzQzAgfCBCNiBGOCBGRiBGRiAgICAgICAgICAgICB8IFNPZmZzZXQzMiAgIHwgMHhGRkZGRjhCNiAoLTE4NjYpIExvYzogKzB4MEIwQSAgICB8IG9mZnNldCB0byB2dGFibGUKKyAgKzB4MDNDNCB8IDJDIDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMDJDICg0NCkgTG9jOiArMHgwM0YwICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBuYW1lYCAoc3RyaW5nKQorICArMHgwM0M4IHwgMTggMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDAwMTggKDI0KSBMb2M6ICsweDAzRTAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYHVuaW9uX3R5cGVgICh0YWJsZSkKKyAgKzB4MDNDQyB8IDEwIDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMDEwICgxNikgTG9jOiArMHgwM0RDICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBkb2N1bWVudGF0aW9uYCAodmVjdG9yKQorICArMHgwM0QwIHwgMDIgMDAgMDAgMDAgMDAgMDAgMDAgMDAgfCBpbnQ2NF90ICAgICB8IDB4MDAwMDAwMDAwMDAwMDAwMiAoMikgICAgICAgICAgICAgfCB0YWJsZSBmaWVsZCBgdmFsdWVgIChMb25nKQorICArMHgwM0Q4IHwgMDAgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50OF90WzRdICB8IC4uLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBwYWRkaW5nCisKK3ZlY3RvciAocmVmbGVjdGlvbi5FbnVtVmFsLmRvY3VtZW50YXRpb24pOgorICArMHgwM0RDIHwgMDAgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICB8IDB4MDAwMDAwMDAgKDApICAgICAgICAgICAgICAgICAgICAgfCBsZW5ndGggb2YgdmVjdG9yICgjIGl0ZW1zKQorCit0YWJsZSAocmVmbGVjdGlvbi5UeXBlKToKKyAgKzB4MDNFMCB8IDI4IENCIEZGIEZGICAgICAgICAgICAgIHwgU09mZnNldDMyICAgfCAweEZGRkZDQjI4ICgtMTM1MjgpIExvYzogKzB4MzhCOCAgIHwgb2Zmc2V0IHRvIHZ0YWJsZQorICArMHgwM0U0IHwgMDAgMDAgMDAgICAgICAgICAgICAgICAgfCB1aW50OF90WzNdICB8IC4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBwYWRkaW5nCisgICsweDAzRTcgfCAwRiAgICAgICAgICAgICAgICAgICAgICB8IHVpbnQ4X3QgICAgIHwgMHgwRiAoMTUpICAgICAgICAgICAgICAgICAgICAgICAgICB8IHRhYmxlIGZpZWxkIGBiYXNlX3R5cGVgIChCeXRlKQorICArMHgwM0U4IHwgMDEgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICB8IDB4MDAwMDAwMDEgKDEpICAgICAgICAgICAgICAgICAgICAgfCB0YWJsZSBmaWVsZCBgaW5kZXhgIChJbnQpCisgICsweDAzRUMgfCAwMSAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgIHwgMHgwMDAwMDAwMSAoMSkgICAgICAgICAgICAgICAgICAgICB8IHRhYmxlIGZpZWxkIGBlbGVtZW50X3NpemVgIChVSW50KQorCitzdHJpbmcgKHJlZmxlY3Rpb24uRW51bVZhbC5uYW1lKToKKyAgKzB4MDNGMCB8IDAyIDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgfCAweDAwMDAwMDAyICgyKSAgICAgICAgICAgICAgICAgICAgIHwgbGVuZ3RoIG9mIHN0cmluZworICArMHgwM0Y0IHwgNEQgMzIgICAgICAgICAgICAgICAgICAgfCBjaGFyWzJdICAgICB8IE0yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJpbmcgbGl0ZXJhbAorICArMHgwM0Y2IHwgMDAgICAgICAgICAgICAgICAgICAgICAgfCBjaGFyICAgICAgICB8IDB4MDAgKDApICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJpbmcgdGVybWluYXRvcgorCit0YWJsZSAocmVmbGVjdGlvbi5FbnVtVmFsKToKKyAgKzB4MDNGOCB8IEVFIEY4IEZGIEZGICAgICAgICAgICAgIHwgU09mZnNldDMyICAgfCAweEZGRkZGOEVFICgtMTgxMCkgTG9jOiArMHgwQjBBICAgIHwgb2Zmc2V0IHRvIHZ0YWJsZQorICArMHgwM0ZDIHwgMkMgMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDAwMkMgKDQ0KSBMb2M6ICsweDA0MjggICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYG5hbWVgIChzdHJpbmcpCisgICsweDA0MDAgfCAxOCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDAxOCAoMjQpIExvYzogKzB4MDQxOCAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgdW5pb25fdHlwZWAgKHRhYmxlKQorICArMHgwNDA0IHwgMTAgMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDAwMTAgKDE2KSBMb2M6ICsweDA0MTQgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYGRvY3VtZW50YXRpb25gICh2ZWN0b3IpCisgICsweDA0MDggfCAwMSAwMCAwMCAwMCAwMCAwMCAwMCAwMCB8IGludDY0X3QgICAgIHwgMHgwMDAwMDAwMDAwMDAwMDAxICgxKSAgICAgICAgICAgICB8IHRhYmxlIGZpZWxkIGB2YWx1ZWAgKExvbmcpCisgICsweDA0MTAgfCAwMCAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQ4X3RbNF0gIHwgLi4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHBhZGRpbmcKKwordmVjdG9yIChyZWZsZWN0aW9uLkVudW1WYWwuZG9jdW1lbnRhdGlvbik6CisgICsweDA0MTQgfCAwMCAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgIHwgMHgwMDAwMDAwMCAoMCkgICAgICAgICAgICAgICAgICAgICB8IGxlbmd0aCBvZiB2ZWN0b3IgKCMgaXRlbXMpCisKK3RhYmxlIChyZWZsZWN0aW9uLlR5cGUpOgorICArMHgwNDE4IHwgNjAgQ0IgRkYgRkYgICAgICAgICAgICAgfCBTT2Zmc2V0MzIgICB8IDB4RkZGRkNCNjAgKC0xMzQ3MikgTG9jOiArMHgzOEI4ICAgfCBvZmZzZXQgdG8gdnRhYmxlCisgICsweDA0MUMgfCAwMCAwMCAwMCAgICAgICAgICAgICAgICB8IHVpbnQ4X3RbM10gIHwgLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHBhZGRpbmcKKyAgKzB4MDQxRiB8IDBGICAgICAgICAgICAgICAgICAgICAgIHwgdWludDhfdCAgICAgfCAweDBGICgxNSkgICAgICAgICAgICAgICAgICAgICAgICAgIHwgdGFibGUgZmllbGQgYGJhc2VfdHlwZWAgKEJ5dGUpCisgICsweDA0MjAgfCAwMSAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgIHwgMHgwMDAwMDAwMSAoMSkgICAgICAgICAgICAgICAgICAgICB8IHRhYmxlIGZpZWxkIGBpbmRleGAgKEludCkKKyAgKzB4MDQyNCB8IDAxIDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgfCAweDAwMDAwMDAxICgxKSAgICAgICAgICAgICAgICAgICAgIHwgdGFibGUgZmllbGQgYGVsZW1lbnRfc2l6ZWAgKFVJbnQpCisKK3N0cmluZyAocmVmbGVjdGlvbi5FbnVtVmFsLm5hbWUpOgorICArMHgwNDI4IHwgMDIgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICB8IDB4MDAwMDAwMDIgKDIpICAgICAgICAgICAgICAgICAgICAgfCBsZW5ndGggb2Ygc3RyaW5nCisgICsweDA0MkMgfCA0RCAzMSAgICAgICAgICAgICAgICAgICB8IGNoYXJbMl0gICAgIHwgTTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHN0cmluZyBsaXRlcmFsCisgICsweDA0MkUgfCAwMCAgICAgICAgICAgICAgICAgICAgICB8IGNoYXIgICAgICAgIHwgMHgwMCAoMCkgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHN0cmluZyB0ZXJtaW5hdG9yCisKK3RhYmxlIChyZWZsZWN0aW9uLkVudW1WYWwpOgorICArMHgwNDMwIHwgNzIgRjggRkYgRkYgICAgICAgICAgICAgfCBTT2Zmc2V0MzIgICB8IDB4RkZGRkY4NzIgKC0xOTM0KSBMb2M6ICsweDBCQkUgICAgfCBvZmZzZXQgdG8gdnRhYmxlCisgICsweDA0MzQgfCAxQyAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDAxQyAoMjgpIExvYzogKzB4MDQ1MCAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgbmFtZWAgKHN0cmluZykKKyAgKzB4MDQzOCB8IDBDIDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMDBDICgxMikgTG9jOiArMHgwNDQ0ICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGB1bmlvbl90eXBlYCAodGFibGUpCisgICsweDA0M0MgfCAwNCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDAwNCAoNCkgTG9jOiArMHgwNDQwICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgZG9jdW1lbnRhdGlvbmAgKHZlY3RvcikKKwordmVjdG9yIChyZWZsZWN0aW9uLkVudW1WYWwuZG9jdW1lbnRhdGlvbik6CisgICsweDA0NDAgfCAwMCAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgIHwgMHgwMDAwMDAwMCAoMCkgICAgICAgICAgICAgICAgICAgICB8IGxlbmd0aCBvZiB2ZWN0b3IgKCMgaXRlbXMpCisKK3RhYmxlIChyZWZsZWN0aW9uLlR5cGUpOgorICArMHgwNDQ0IHwgNjQgRjggRkYgRkYgICAgICAgICAgICAgfCBTT2Zmc2V0MzIgICB8IDB4RkZGRkY4NjQgKC0xOTQ4KSBMb2M6ICsweDBCRTAgICAgfCBvZmZzZXQgdG8gdnRhYmxlCisgICsweDA0NDggfCAwMSAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgIHwgMHgwMDAwMDAwMSAoMSkgICAgICAgICAgICAgICAgICAgICB8IHRhYmxlIGZpZWxkIGBiYXNlX3NpemVgIChVSW50KQorICArMHgwNDRDIHwgMDEgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICB8IDB4MDAwMDAwMDEgKDEpICAgICAgICAgICAgICAgICAgICAgfCB0YWJsZSBmaWVsZCBgZWxlbWVudF9zaXplYCAoVUludCkKKworc3RyaW5nIChyZWZsZWN0aW9uLkVudW1WYWwubmFtZSk6CisgICsweDA0NTAgfCAwNCAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgIHwgMHgwMDAwMDAwNCAoNCkgICAgICAgICAgICAgICAgICAgICB8IGxlbmd0aCBvZiBzdHJpbmcKKyAgKzB4MDQ1NCB8IDRFIDRGIDRFIDQ1ICAgICAgICAgICAgIHwgY2hhcls0XSAgICAgfCBOT05FICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nIGxpdGVyYWwKKyAgKzB4MDQ1OCB8IDAwICAgICAgICAgICAgICAgICAgICAgIHwgY2hhciAgICAgICAgfCAweDAwICgwKSAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nIHRlcm1pbmF0b3IKKworcGFkZGluZzoKKyAgKzB4MDQ1OSB8IDAwIDAwIDAwICAgICAgICAgICAgICAgIHwgdWludDhfdFszXSAgfCAuLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgcGFkZGluZworCit0YWJsZSAocmVmbGVjdGlvbi5FbnVtKToKKyAgKzB4MDQ1QyB8IEM2IEZFIEZGIEZGICAgICAgICAgICAgIHwgU09mZnNldDMyICAgfCAweEZGRkZGRUM2ICgtMzE0KSBMb2M6ICsweDA1OTYgICAgIHwgb2Zmc2V0IHRvIHZ0YWJsZQorICArMHgwNDYwIHwgMDAgMDAgMDAgICAgICAgICAgICAgICAgfCB1aW50OF90WzNdICB8IC4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBwYWRkaW5nCisgICsweDA0NjMgfCAwMSAgICAgICAgICAgICAgICAgICAgICB8IHVpbnQ4X3QgICAgIHwgMHgwMSAoMSkgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHRhYmxlIGZpZWxkIGBpc191bmlvbmAgKEJvb2wpCisgICsweDA0NjQgfCA0MCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDA0MCAoNjQpIExvYzogKzB4MDRBNCAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgbmFtZWAgKHN0cmluZykKKyAgKzB4MDQ2OCB8IDI4IDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMDI4ICg0MCkgTG9jOiArMHgwNDkwICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGB2YWx1ZXNgICh2ZWN0b3IpCisgICsweDA0NkMgfCAxMCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDAxMCAoMTYpIExvYzogKzB4MDQ3QyAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgdW5kZXJseWluZ190eXBlYCAodGFibGUpCisgICsweDA0NzAgfCAwOCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDAwOCAoOCkgTG9jOiArMHgwNDc4ICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgZG9jdW1lbnRhdGlvbmAgKHZlY3RvcikKKyAgKzB4MDQ3NCB8IEVDIDMyIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAzMkVDICgxMzAzNikgTG9jOiArMHgzNzYwICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBkZWNsYXJhdGlvbl9maWxlYCAoc3RyaW5nKQorCit2ZWN0b3IgKHJlZmxlY3Rpb24uRW51bS5kb2N1bWVudGF0aW9uKToKKyAgKzB4MDQ3OCB8IDAwIDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgfCAweDAwMDAwMDAwICgwKSAgICAgICAgICAgICAgICAgICAgIHwgbGVuZ3RoIG9mIHZlY3RvciAoIyBpdGVtcykKKwordGFibGUgKHJlZmxlY3Rpb24uVHlwZSk6CisgICsweDA0N0MgfCA3OCBDRSBGRiBGRiAgICAgICAgICAgICB8IFNPZmZzZXQzMiAgIHwgMHhGRkZGQ0U3OCAoLTEyNjgwKSBMb2M6ICsweDM2MDQgICB8IG9mZnNldCB0byB2dGFibGUKKyAgKzB4MDQ4MCB8IDAwIDAwIDAwICAgICAgICAgICAgICAgIHwgdWludDhfdFszXSAgfCAuLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgcGFkZGluZworICArMHgwNDgzIHwgMDEgICAgICAgICAgICAgICAgICAgICAgfCB1aW50OF90ICAgICB8IDB4MDEgKDEpICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB0YWJsZSBmaWVsZCBgYmFzZV90eXBlYCAoQnl0ZSkKKyAgKzB4MDQ4NCB8IDAyIDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgfCAweDAwMDAwMDAyICgyKSAgICAgICAgICAgICAgICAgICAgIHwgdGFibGUgZmllbGQgYGluZGV4YCAoSW50KQorICArMHgwNDg4IHwgMDEgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICB8IDB4MDAwMDAwMDEgKDEpICAgICAgICAgICAgICAgICAgICAgfCB0YWJsZSBmaWVsZCBgYmFzZV9zaXplYCAoVUludCkKKyAgKzB4MDQ4QyB8IDAxIDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgfCAweDAwMDAwMDAxICgxKSAgICAgICAgICAgICAgICAgICAgIHwgdGFibGUgZmllbGQgYGVsZW1lbnRfc2l6ZWAgKFVJbnQpCisKK3ZlY3RvciAocmVmbGVjdGlvbi5FbnVtLnZhbHVlcyk6CisgICsweDA0OTAgfCAwNCAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgIHwgMHgwMDAwMDAwNCAoNCkgICAgICAgICAgICAgICAgICAgICB8IGxlbmd0aCBvZiB2ZWN0b3IgKCMgaXRlbXMpCisgICsweDA0OTQgfCBEOCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDBEOCAoMjE2KSBMb2M6ICsweDA1NkMgICAgICB8IG9mZnNldCB0byB0YWJsZVswXQorICArMHgwNDk4IHwgQTAgMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDAwQTAgKDE2MCkgTG9jOiArMHgwNTM4ICAgICAgfCBvZmZzZXQgdG8gdGFibGVbMV0KKyAgKzB4MDQ5QyB8IDY0IDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMDY0ICgxMDApIExvYzogKzB4MDUwMCAgICAgIHwgb2Zmc2V0IHRvIHRhYmxlWzJdCisgICsweDA0QTAgfCAyOCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDAyOCAoNDApIExvYzogKzB4MDRDOCAgICAgICB8IG9mZnNldCB0byB0YWJsZVszXQorCitzdHJpbmcgKHJlZmxlY3Rpb24uRW51bS5uYW1lKToKKyAgKzB4MDRBNCB8IDFGIDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgfCAweDAwMDAwMDFGICgzMSkgICAgICAgICAgICAgICAgICAgIHwgbGVuZ3RoIG9mIHN0cmluZworICArMHgwNEE4IHwgNEQgNzkgNDcgNjEgNkQgNjUgMkUgNDUgfCBjaGFyWzMxXSAgICB8IE15R2FtZS5FICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJpbmcgbGl0ZXJhbAorICArMHgwNEIwIHwgNzggNjEgNkQgNzAgNkMgNjUgMkUgNDEgfCAgICAgICAgICAgICB8IHhhbXBsZS5BCisgICsweDA0QjggfCA2RSA3OSA1NSA2RSA2OSA3MSA3NSA2NSB8ICAgICAgICAgICAgIHwgbnlVbmlxdWUKKyAgKzB4MDRDMCB8IDQxIDZDIDY5IDYxIDczIDY1IDczICAgIHwgICAgICAgICAgICAgfCBBbGlhc2VzCisgICsweDA0QzcgfCAwMCAgICAgICAgICAgICAgICAgICAgICB8IGNoYXIgICAgICAgIHwgMHgwMCAoMCkgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHN0cmluZyB0ZXJtaW5hdG9yCisKK3RhYmxlIChyZWZsZWN0aW9uLkVudW1WYWwpOgorICArMHgwNEM4IHwgQkUgRjkgRkYgRkYgICAgICAgICAgICAgfCBTT2Zmc2V0MzIgICB8IDB4RkZGRkY5QkUgKC0xNjAyKSBMb2M6ICsweDBCMEEgICAgfCBvZmZzZXQgdG8gdnRhYmxlCisgICsweDA0Q0MgfCAyQyAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDAyQyAoNDQpIExvYzogKzB4MDRGOCAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgbmFtZWAgKHN0cmluZykKKyAgKzB4MDREMCB8IDE4IDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMDE4ICgyNCkgTG9jOiArMHgwNEU4ICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGB1bmlvbl90eXBlYCAodGFibGUpCisgICsweDA0RDQgfCAxMCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDAxMCAoMTYpIExvYzogKzB4MDRFNCAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgZG9jdW1lbnRhdGlvbmAgKHZlY3RvcikKKyAgKzB4MDREOCB8IDAzIDAwIDAwIDAwIDAwIDAwIDAwIDAwIHwgaW50NjRfdCAgICAgfCAweDAwMDAwMDAwMDAwMDAwMDMgKDMpICAgICAgICAgICAgIHwgdGFibGUgZmllbGQgYHZhbHVlYCAoTG9uZykKKyAgKzB4MDRFMCB8IDAwIDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDhfdFs0XSAgfCAuLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgcGFkZGluZworCit2ZWN0b3IgKHJlZmxlY3Rpb24uRW51bVZhbC5kb2N1bWVudGF0aW9uKToKKyAgKzB4MDRFNCB8IDAwIDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgfCAweDAwMDAwMDAwICgwKSAgICAgICAgICAgICAgICAgICAgIHwgbGVuZ3RoIG9mIHZlY3RvciAoIyBpdGVtcykKKwordGFibGUgKHJlZmxlY3Rpb24uVHlwZSk6CisgICsweDA0RTggfCAzMCBDQyBGRiBGRiAgICAgICAgICAgICB8IFNPZmZzZXQzMiAgIHwgMHhGRkZGQ0MzMCAoLTEzMjY0KSBMb2M6ICsweDM4QjggICB8IG9mZnNldCB0byB2dGFibGUKKyAgKzB4MDRFQyB8IDAwIDAwIDAwICAgICAgICAgICAgICAgIHwgdWludDhfdFszXSAgfCAuLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgcGFkZGluZworICArMHgwNEVGIHwgMEYgICAgICAgICAgICAgICAgICAgICAgfCB1aW50OF90ICAgICB8IDB4MEYgKDE1KSAgICAgICAgICAgICAgICAgICAgICAgICAgfCB0YWJsZSBmaWVsZCBgYmFzZV90eXBlYCAoQnl0ZSkKKyAgKzB4MDRGMCB8IDBBIDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgfCAweDAwMDAwMDBBICgxMCkgICAgICAgICAgICAgICAgICAgIHwgdGFibGUgZmllbGQgYGluZGV4YCAoSW50KQorICArMHgwNEY0IHwgMDEgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICB8IDB4MDAwMDAwMDEgKDEpICAgICAgICAgICAgICAgICAgICAgfCB0YWJsZSBmaWVsZCBgZWxlbWVudF9zaXplYCAoVUludCkKKworc3RyaW5nIChyZWZsZWN0aW9uLkVudW1WYWwubmFtZSk6CisgICsweDA0RjggfCAwMiAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgIHwgMHgwMDAwMDAwMiAoMikgICAgICAgICAgICAgICAgICAgICB8IGxlbmd0aCBvZiBzdHJpbmcKKyAgKzB4MDRGQyB8IDREIDMyICAgICAgICAgICAgICAgICAgIHwgY2hhclsyXSAgICAgfCBNMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nIGxpdGVyYWwKKyAgKzB4MDRGRSB8IDAwICAgICAgICAgICAgICAgICAgICAgIHwgY2hhciAgICAgICAgfCAweDAwICgwKSAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nIHRlcm1pbmF0b3IKKwordGFibGUgKHJlZmxlY3Rpb24uRW51bVZhbCk6CisgICsweDA1MDAgfCBGNiBGOSBGRiBGRiAgICAgICAgICAgICB8IFNPZmZzZXQzMiAgIHwgMHhGRkZGRjlGNiAoLTE1NDYpIExvYzogKzB4MEIwQSAgICB8IG9mZnNldCB0byB2dGFibGUKKyAgKzB4MDUwNCB8IDJDIDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMDJDICg0NCkgTG9jOiArMHgwNTMwICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBuYW1lYCAoc3RyaW5nKQorICArMHgwNTA4IHwgMTggMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDAwMTggKDI0KSBMb2M6ICsweDA1MjAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYHVuaW9uX3R5cGVgICh0YWJsZSkKKyAgKzB4MDUwQyB8IDEwIDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMDEwICgxNikgTG9jOiArMHgwNTFDICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBkb2N1bWVudGF0aW9uYCAodmVjdG9yKQorICArMHgwNTEwIHwgMDIgMDAgMDAgMDAgMDAgMDAgMDAgMDAgfCBpbnQ2NF90ICAgICB8IDB4MDAwMDAwMDAwMDAwMDAwMiAoMikgICAgICAgICAgICAgfCB0YWJsZSBmaWVsZCBgdmFsdWVgIChMb25nKQorICArMHgwNTE4IHwgMDAgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50OF90WzRdICB8IC4uLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBwYWRkaW5nCisKK3ZlY3RvciAocmVmbGVjdGlvbi5FbnVtVmFsLmRvY3VtZW50YXRpb24pOgorICArMHgwNTFDIHwgMDAgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICB8IDB4MDAwMDAwMDAgKDApICAgICAgICAgICAgICAgICAgICAgfCBsZW5ndGggb2YgdmVjdG9yICgjIGl0ZW1zKQorCit0YWJsZSAocmVmbGVjdGlvbi5UeXBlKToKKyAgKzB4MDUyMCB8IDY4IENDIEZGIEZGICAgICAgICAgICAgIHwgU09mZnNldDMyICAgfCAweEZGRkZDQzY4ICgtMTMyMDgpIExvYzogKzB4MzhCOCAgIHwgb2Zmc2V0IHRvIHZ0YWJsZQorICArMHgwNTI0IHwgMDAgMDAgMDAgICAgICAgICAgICAgICAgfCB1aW50OF90WzNdICB8IC4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBwYWRkaW5nCisgICsweDA1MjcgfCAwRiAgICAgICAgICAgICAgICAgICAgICB8IHVpbnQ4X3QgICAgIHwgMHgwRiAoMTUpICAgICAgICAgICAgICAgICAgICAgICAgICB8IHRhYmxlIGZpZWxkIGBiYXNlX3R5cGVgIChCeXRlKQorICArMHgwNTI4IHwgMDcgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICB8IDB4MDAwMDAwMDcgKDcpICAgICAgICAgICAgICAgICAgICAgfCB0YWJsZSBmaWVsZCBgaW5kZXhgIChJbnQpCisgICsweDA1MkMgfCAwMSAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgIHwgMHgwMDAwMDAwMSAoMSkgICAgICAgICAgICAgICAgICAgICB8IHRhYmxlIGZpZWxkIGBlbGVtZW50X3NpemVgIChVSW50KQorCitzdHJpbmcgKHJlZmxlY3Rpb24uRW51bVZhbC5uYW1lKToKKyAgKzB4MDUzMCB8IDAyIDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgfCAweDAwMDAwMDAyICgyKSAgICAgICAgICAgICAgICAgICAgIHwgbGVuZ3RoIG9mIHN0cmluZworICArMHgwNTM0IHwgNTQgNTMgICAgICAgICAgICAgICAgICAgfCBjaGFyWzJdICAgICB8IFRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJpbmcgbGl0ZXJhbAorICArMHgwNTM2IHwgMDAgICAgICAgICAgICAgICAgICAgICAgfCBjaGFyICAgICAgICB8IDB4MDAgKDApICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJpbmcgdGVybWluYXRvcgorCit0YWJsZSAocmVmbGVjdGlvbi5FbnVtVmFsKToKKyAgKzB4MDUzOCB8IDFFIEZDIEZGIEZGICAgICAgICAgICAgIHwgU09mZnNldDMyICAgfCAweEZGRkZGQzFFICgtOTk0KSBMb2M6ICsweDA5MUEgICAgIHwgb2Zmc2V0IHRvIHZ0YWJsZQorICArMHgwNTNDIHwgMjggMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDAwMjggKDQwKSBMb2M6ICsweDA1NjQgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYG5hbWVgIChzdHJpbmcpCisgICsweDA1NDAgfCAxNCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDAxNCAoMjApIExvYzogKzB4MDU1NCAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgdW5pb25fdHlwZWAgKHRhYmxlKQorICArMHgwNTQ0IHwgMEMgMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDAwMEMgKDEyKSBMb2M6ICsweDA1NTAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYGRvY3VtZW50YXRpb25gICh2ZWN0b3IpCisgICsweDA1NDggfCAwMSAwMCAwMCAwMCAwMCAwMCAwMCAwMCB8IGludDY0X3QgICAgIHwgMHgwMDAwMDAwMDAwMDAwMDAxICgxKSAgICAgICAgICAgICB8IHRhYmxlIGZpZWxkIGB2YWx1ZWAgKExvbmcpCisKK3ZlY3RvciAocmVmbGVjdGlvbi5FbnVtVmFsLmRvY3VtZW50YXRpb24pOgorICArMHgwNTUwIHwgMDAgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICB8IDB4MDAwMDAwMDAgKDApICAgICAgICAgICAgICAgICAgICAgfCBsZW5ndGggb2YgdmVjdG9yICgjIGl0ZW1zKQorCit0YWJsZSAocmVmbGVjdGlvbi5UeXBlKToKKyAgKzB4MDU1NCB8IDlDIENDIEZGIEZGICAgICAgICAgICAgIHwgU09mZnNldDMyICAgfCAweEZGRkZDQzlDICgtMTMxNTYpIExvYzogKzB4MzhCOCAgIHwgb2Zmc2V0IHRvIHZ0YWJsZQorICArMHgwNTU4IHwgMDAgMDAgMDAgICAgICAgICAgICAgICAgfCB1aW50OF90WzNdICB8IC4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBwYWRkaW5nCisgICsweDA1NUIgfCAwRiAgICAgICAgICAgICAgICAgICAgICB8IHVpbnQ4X3QgICAgIHwgMHgwRiAoMTUpICAgICAgICAgICAgICAgICAgICAgICAgICB8IHRhYmxlIGZpZWxkIGBiYXNlX3R5cGVgIChCeXRlKQorICArMHgwNTVDIHwgMDEgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICB8IDB4MDAwMDAwMDEgKDEpICAgICAgICAgICAgICAgICAgICAgfCB0YWJsZSBmaWVsZCBgaW5kZXhgIChJbnQpCisgICsweDA1NjAgfCAwMSAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgIHwgMHgwMDAwMDAwMSAoMSkgICAgICAgICAgICAgICAgICAgICB8IHRhYmxlIGZpZWxkIGBlbGVtZW50X3NpemVgIChVSW50KQorCitzdHJpbmcgKHJlZmxlY3Rpb24uRW51bVZhbC5uYW1lKToKKyAgKzB4MDU2NCB8IDAxIDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgfCAweDAwMDAwMDAxICgxKSAgICAgICAgICAgICAgICAgICAgIHwgbGVuZ3RoIG9mIHN0cmluZworICArMHgwNTY4IHwgNEQgICAgICAgICAgICAgICAgICAgICAgfCBjaGFyWzFdICAgICB8IE0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJpbmcgbGl0ZXJhbAorICArMHgwNTY5IHwgMDAgICAgICAgICAgICAgICAgICAgICAgfCBjaGFyICAgICAgICB8IDB4MDAgKDApICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJpbmcgdGVybWluYXRvcgorCitwYWRkaW5nOgorICArMHgwNTZBIHwgMDAgMDAgICAgICAgICAgICAgICAgICAgfCB1aW50OF90WzJdICB8IC4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBwYWRkaW5nCisKK3RhYmxlIChyZWZsZWN0aW9uLkVudW1WYWwpOgorICArMHgwNTZDIHwgQUUgRjkgRkYgRkYgICAgICAgICAgICAgfCBTT2Zmc2V0MzIgICB8IDB4RkZGRkY5QUUgKC0xNjE4KSBMb2M6ICsweDBCQkUgICAgfCBvZmZzZXQgdG8gdnRhYmxlCisgICsweDA1NzAgfCAxQyAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDAxQyAoMjgpIExvYzogKzB4MDU4QyAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgbmFtZWAgKHN0cmluZykKKyAgKzB4MDU3NCB8IDBDIDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMDBDICgxMikgTG9jOiArMHgwNTgwICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGB1bmlvbl90eXBlYCAodGFibGUpCisgICsweDA1NzggfCAwNCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDAwNCAoNCkgTG9jOiArMHgwNTdDICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgZG9jdW1lbnRhdGlvbmAgKHZlY3RvcikKKwordmVjdG9yIChyZWZsZWN0aW9uLkVudW1WYWwuZG9jdW1lbnRhdGlvbik6CisgICsweDA1N0MgfCAwMCAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgIHwgMHgwMDAwMDAwMCAoMCkgICAgICAgICAgICAgICAgICAgICB8IGxlbmd0aCBvZiB2ZWN0b3IgKCMgaXRlbXMpCisKK3RhYmxlIChyZWZsZWN0aW9uLlR5cGUpOgorICArMHgwNTgwIHwgQTAgRjkgRkYgRkYgICAgICAgICAgICAgfCBTT2Zmc2V0MzIgICB8IDB4RkZGRkY5QTAgKC0xNjMyKSBMb2M6ICsweDBCRTAgICAgfCBvZmZzZXQgdG8gdnRhYmxlCisgICsweDA1ODQgfCAwMSAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgIHwgMHgwMDAwMDAwMSAoMSkgICAgICAgICAgICAgICAgICAgICB8IHRhYmxlIGZpZWxkIGBiYXNlX3NpemVgIChVSW50KQorICArMHgwNTg4IHwgMDEgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICB8IDB4MDAwMDAwMDEgKDEpICAgICAgICAgICAgICAgICAgICAgfCB0YWJsZSBmaWVsZCBgZWxlbWVudF9zaXplYCAoVUludCkKKworc3RyaW5nIChyZWZsZWN0aW9uLkVudW1WYWwubmFtZSk6CisgICsweDA1OEMgfCAwNCAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgIHwgMHgwMDAwMDAwNCAoNCkgICAgICAgICAgICAgICAgICAgICB8IGxlbmd0aCBvZiBzdHJpbmcKKyAgKzB4MDU5MCB8IDRFIDRGIDRFIDQ1ICAgICAgICAgICAgIHwgY2hhcls0XSAgICAgfCBOT05FICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nIGxpdGVyYWwKKyAgKzB4MDU5NCB8IDAwICAgICAgICAgICAgICAgICAgICAgIHwgY2hhciAgICAgICAgfCAweDAwICgwKSAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nIHRlcm1pbmF0b3IKKwordnRhYmxlIChyZWZsZWN0aW9uLkVudW0pOgorICArMHgwNTk2IHwgMTIgMDAgICAgICAgICAgICAgICAgICAgfCB1aW50MTZfdCAgICB8IDB4MDAxMiAoMTgpICAgICAgICAgICAgICAgICAgICAgICAgfCBzaXplIG9mIHRoaXMgdnRhYmxlCisgICsweDA1OTggfCAxQyAwMCAgICAgICAgICAgICAgICAgICB8IHVpbnQxNl90ICAgIHwgMHgwMDFDICgyOCkgICAgICAgICAgICAgICAgICAgICAgICB8IHNpemUgb2YgcmVmZXJyaW5nIHRhYmxlCisgICsweDA1OUEgfCAwOCAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgIHwgMHgwMDA4ICg4KSAgICAgICAgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgbmFtZWAgKGlkOiAwKQorICArMHgwNTlDIHwgMEMgMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgICB8IDB4MDAwQyAoMTIpICAgICAgICAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYHZhbHVlc2AgKGlkOiAxKQorICArMHgwNTlFIHwgMDcgMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgICB8IDB4MDAwNyAoNykgICAgICAgICAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYGlzX3VuaW9uYCAoaWQ6IDIpCisgICsweDA1QTAgfCAxMCAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgIHwgMHgwMDEwICgxNikgICAgICAgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgdW5kZXJseWluZ190eXBlYCAoaWQ6IDMpCisgICsweDA1QTIgfCAwMCAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgIHwgMHgwMDAwICgwKSAgICAgICAgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgYXR0cmlidXRlc2AgKGlkOiA0KSA8bnVsbD4gKFZlY3RvcikKKyAgKzB4MDVBNCB8IDE0IDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgfCAweDAwMTQgKDIwKSAgICAgICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBkb2N1bWVudGF0aW9uYCAoaWQ6IDUpCisgICsweDA1QTYgfCAxOCAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgIHwgMHgwMDE4ICgyNCkgICAgICAgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgZGVjbGFyYXRpb25fZmlsZWAgKGlkOiA2KQorCit0YWJsZSAocmVmbGVjdGlvbi5FbnVtKToKKyAgKzB4MDVBOCB8IDEyIDAwIDAwIDAwICAgICAgICAgICAgIHwgU09mZnNldDMyICAgfCAweDAwMDAwMDEyICgxOCkgTG9jOiArMHgwNTk2ICAgICAgIHwgb2Zmc2V0IHRvIHZ0YWJsZQorICArMHgwNUFDIHwgMDAgMDAgMDAgICAgICAgICAgICAgICAgfCB1aW50OF90WzNdICB8IC4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBwYWRkaW5nCisgICsweDA1QUYgfCAwMSAgICAgICAgICAgICAgICAgICAgICB8IHVpbnQ4X3QgICAgIHwgMHgwMSAoMSkgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHRhYmxlIGZpZWxkIGBpc191bmlvbmAgKEJvb2wpCisgICsweDA1QjAgfCA0MCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDA0MCAoNjQpIExvYzogKzB4MDVGMCAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgbmFtZWAgKHN0cmluZykKKyAgKzB4MDVCNCB8IDI4IDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMDI4ICg0MCkgTG9jOiArMHgwNURDICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGB2YWx1ZXNgICh2ZWN0b3IpCisgICsweDA1QjggfCAxMCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDAxMCAoMTYpIExvYzogKzB4MDVDOCAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgdW5kZXJseWluZ190eXBlYCAodGFibGUpCisgICsweDA1QkMgfCAwOCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDAwOCAoOCkgTG9jOiArMHgwNUM0ICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgZG9jdW1lbnRhdGlvbmAgKHZlY3RvcikKKyAgKzB4MDVDMCB8IEEwIDMxIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAzMUEwICgxMjcwNCkgTG9jOiArMHgzNzYwICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBkZWNsYXJhdGlvbl9maWxlYCAoc3RyaW5nKQorCit2ZWN0b3IgKHJlZmxlY3Rpb24uRW51bS5kb2N1bWVudGF0aW9uKToKKyAgKzB4MDVDNCB8IDAwIDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgfCAweDAwMDAwMDAwICgwKSAgICAgICAgICAgICAgICAgICAgIHwgbGVuZ3RoIG9mIHZlY3RvciAoIyBpdGVtcykKKwordGFibGUgKHJlZmxlY3Rpb24uVHlwZSk6CisgICsweDA1QzggfCBDNCBDRiBGRiBGRiAgICAgICAgICAgICB8IFNPZmZzZXQzMiAgIHwgMHhGRkZGQ0ZDNCAoLTEyMzQ4KSBMb2M6ICsweDM2MDQgICB8IG9mZnNldCB0byB2dGFibGUKKyAgKzB4MDVDQyB8IDAwIDAwIDAwICAgICAgICAgICAgICAgIHwgdWludDhfdFszXSAgfCAuLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgcGFkZGluZworICArMHgwNUNGIHwgMDEgICAgICAgICAgICAgICAgICAgICAgfCB1aW50OF90ICAgICB8IDB4MDEgKDEpICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB0YWJsZSBmaWVsZCBgYmFzZV90eXBlYCAoQnl0ZSkKKyAgKzB4MDVEMCB8IDAwIDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgfCAweDAwMDAwMDAwICgwKSAgICAgICAgICAgICAgICAgICAgIHwgdGFibGUgZmllbGQgYGluZGV4YCAoSW50KQorICArMHgwNUQ0IHwgMDEgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICB8IDB4MDAwMDAwMDEgKDEpICAgICAgICAgICAgICAgICAgICAgfCB0YWJsZSBmaWVsZCBgYmFzZV9zaXplYCAoVUludCkKKyAgKzB4MDVEOCB8IDAxIDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgfCAweDAwMDAwMDAxICgxKSAgICAgICAgICAgICAgICAgICAgIHwgdGFibGUgZmllbGQgYGVsZW1lbnRfc2l6ZWAgKFVJbnQpCisKK3ZlY3RvciAocmVmbGVjdGlvbi5FbnVtLnZhbHVlcyk6CisgICsweDA1REMgfCAwNCAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgIHwgMHgwMDAwMDAwNCAoNCkgICAgICAgICAgICAgICAgICAgICB8IGxlbmd0aCBvZiB2ZWN0b3IgKCMgaXRlbXMpCisgICsweDA1RTAgfCBGMCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDBGMCAoMjQwKSBMb2M6ICsweDA2RDAgICAgICB8IG9mZnNldCB0byB0YWJsZVswXQorICArMHgwNUU0IHwgQjQgMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDAwQjQgKDE4MCkgTG9jOiArMHgwNjk4ICAgICAgfCBvZmZzZXQgdG8gdGFibGVbMV0KKyAgKzB4MDVFOCB8IDY4IDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMDY4ICgxMDQpIExvYzogKzB4MDY1MCAgICAgIHwgb2Zmc2V0IHRvIHRhYmxlWzJdCisgICsweDA1RUMgfCAxQyAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDAxQyAoMjgpIExvYzogKzB4MDYwOCAgICAgICB8IG9mZnNldCB0byB0YWJsZVszXQorCitzdHJpbmcgKHJlZmxlY3Rpb24uRW51bS5uYW1lKToKKyAgKzB4MDVGMCB8IDEyIDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgfCAweDAwMDAwMDEyICgxOCkgICAgICAgICAgICAgICAgICAgIHwgbGVuZ3RoIG9mIHN0cmluZworICArMHgwNUY0IHwgNEQgNzkgNDcgNjEgNkQgNjUgMkUgNDUgfCBjaGFyWzE4XSAgICB8IE15R2FtZS5FICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJpbmcgbGl0ZXJhbAorICArMHgwNUZDIHwgNzggNjEgNkQgNzAgNkMgNjUgMkUgNDEgfCAgICAgICAgICAgICB8IHhhbXBsZS5BCisgICsweDA2MDQgfCA2RSA3OSAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgIHwgbnkKKyAgKzB4MDYwNiB8IDAwICAgICAgICAgICAgICAgICAgICAgIHwgY2hhciAgICAgICAgfCAweDAwICgwKSAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nIHRlcm1pbmF0b3IKKwordGFibGUgKHJlZmxlY3Rpb24uRW51bVZhbCk6CisgICsweDA2MDggfCBFRSBGQyBGRiBGRiAgICAgICAgICAgICB8IFNPZmZzZXQzMiAgIHwgMHhGRkZGRkNFRSAoLTc4NikgTG9jOiArMHgwOTFBICAgICB8IG9mZnNldCB0byB2dGFibGUKKyAgKzB4MDYwQyB8IDI4IDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMDI4ICg0MCkgTG9jOiArMHgwNjM0ICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBuYW1lYCAoc3RyaW5nKQorICArMHgwNjEwIHwgMTQgMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDAwMTQgKDIwKSBMb2M6ICsweDA2MjQgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYHVuaW9uX3R5cGVgICh0YWJsZSkKKyAgKzB4MDYxNCB8IDBDIDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMDBDICgxMikgTG9jOiArMHgwNjIwICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBkb2N1bWVudGF0aW9uYCAodmVjdG9yKQorICArMHgwNjE4IHwgMDMgMDAgMDAgMDAgMDAgMDAgMDAgMDAgfCBpbnQ2NF90ICAgICB8IDB4MDAwMDAwMDAwMDAwMDAwMyAoMykgICAgICAgICAgICAgfCB0YWJsZSBmaWVsZCBgdmFsdWVgIChMb25nKQorCit2ZWN0b3IgKHJlZmxlY3Rpb24uRW51bVZhbC5kb2N1bWVudGF0aW9uKToKKyAgKzB4MDYyMCB8IDAwIDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgfCAweDAwMDAwMDAwICgwKSAgICAgICAgICAgICAgICAgICAgIHwgbGVuZ3RoIG9mIHZlY3RvciAoIyBpdGVtcykKKwordGFibGUgKHJlZmxlY3Rpb24uVHlwZSk6CisgICsweDA2MjQgfCA2QyBDRCBGRiBGRiAgICAgICAgICAgICB8IFNPZmZzZXQzMiAgIHwgMHhGRkZGQ0Q2QyAoLTEyOTQ4KSBMb2M6ICsweDM4QjggICB8IG9mZnNldCB0byB2dGFibGUKKyAgKzB4MDYyOCB8IDAwIDAwIDAwICAgICAgICAgICAgICAgIHwgdWludDhfdFszXSAgfCAuLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgcGFkZGluZworICArMHgwNjJCIHwgMEYgICAgICAgICAgICAgICAgICAgICAgfCB1aW50OF90ICAgICB8IDB4MEYgKDE1KSAgICAgICAgICAgICAgICAgICAgICAgICAgfCB0YWJsZSBmaWVsZCBgYmFzZV90eXBlYCAoQnl0ZSkKKyAgKzB4MDYyQyB8IDBBIDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgfCAweDAwMDAwMDBBICgxMCkgICAgICAgICAgICAgICAgICAgIHwgdGFibGUgZmllbGQgYGluZGV4YCAoSW50KQorICArMHgwNjMwIHwgMDEgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICB8IDB4MDAwMDAwMDEgKDEpICAgICAgICAgICAgICAgICAgICAgfCB0YWJsZSBmaWVsZCBgZWxlbWVudF9zaXplYCAoVUludCkKKworc3RyaW5nIChyZWZsZWN0aW9uLkVudW1WYWwubmFtZSk6CisgICsweDA2MzQgfCAxNyAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgIHwgMHgwMDAwMDAxNyAoMjMpICAgICAgICAgICAgICAgICAgICB8IGxlbmd0aCBvZiBzdHJpbmcKKyAgKzB4MDYzOCB8IDREIDc5IDQ3IDYxIDZEIDY1IDVGIDQ1IHwgY2hhclsyM10gICAgfCBNeUdhbWVfRSAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nIGxpdGVyYWwKKyAgKzB4MDY0MCB8IDc4IDYxIDZEIDcwIDZDIDY1IDMyIDVGIHwgICAgICAgICAgICAgfCB4YW1wbGUyXworICArMHgwNjQ4IHwgNEQgNkYgNkUgNzMgNzQgNjUgNzIgICAgfCAgICAgICAgICAgICB8IE1vbnN0ZXIKKyAgKzB4MDY0RiB8IDAwICAgICAgICAgICAgICAgICAgICAgIHwgY2hhciAgICAgICAgfCAweDAwICgwKSAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nIHRlcm1pbmF0b3IKKwordGFibGUgKHJlZmxlY3Rpb24uRW51bVZhbCk6CisgICsweDA2NTAgfCAzNiBGRCBGRiBGRiAgICAgICAgICAgICB8IFNPZmZzZXQzMiAgIHwgMHhGRkZGRkQzNiAoLTcxNCkgTG9jOiArMHgwOTFBICAgICB8IG9mZnNldCB0byB2dGFibGUKKyAgKzB4MDY1NCB8IDI4IDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMDI4ICg0MCkgTG9jOiArMHgwNjdDICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBuYW1lYCAoc3RyaW5nKQorICArMHgwNjU4IHwgMTQgMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDAwMTQgKDIwKSBMb2M6ICsweDA2NkMgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYHVuaW9uX3R5cGVgICh0YWJsZSkKKyAgKzB4MDY1QyB8IDBDIDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMDBDICgxMikgTG9jOiArMHgwNjY4ICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBkb2N1bWVudGF0aW9uYCAodmVjdG9yKQorICArMHgwNjYwIHwgMDIgMDAgMDAgMDAgMDAgMDAgMDAgMDAgfCBpbnQ2NF90ICAgICB8IDB4MDAwMDAwMDAwMDAwMDAwMiAoMikgICAgICAgICAgICAgfCB0YWJsZSBmaWVsZCBgdmFsdWVgIChMb25nKQorCit2ZWN0b3IgKHJlZmxlY3Rpb24uRW51bVZhbC5kb2N1bWVudGF0aW9uKToKKyAgKzB4MDY2OCB8IDAwIDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgfCAweDAwMDAwMDAwICgwKSAgICAgICAgICAgICAgICAgICAgIHwgbGVuZ3RoIG9mIHZlY3RvciAoIyBpdGVtcykKKwordGFibGUgKHJlZmxlY3Rpb24uVHlwZSk6CisgICsweDA2NkMgfCBCNCBDRCBGRiBGRiAgICAgICAgICAgICB8IFNPZmZzZXQzMiAgIHwgMHhGRkZGQ0RCNCAoLTEyODc2KSBMb2M6ICsweDM4QjggICB8IG9mZnNldCB0byB2dGFibGUKKyAgKzB4MDY3MCB8IDAwIDAwIDAwICAgICAgICAgICAgICAgIHwgdWludDhfdFszXSAgfCAuLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgcGFkZGluZworICArMHgwNjczIHwgMEYgICAgICAgICAgICAgICAgICAgICAgfCB1aW50OF90ICAgICB8IDB4MEYgKDE1KSAgICAgICAgICAgICAgICAgICAgICAgICAgfCB0YWJsZSBmaWVsZCBgYmFzZV90eXBlYCAoQnl0ZSkKKyAgKzB4MDY3NCB8IDA3IDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgfCAweDAwMDAwMDA3ICg3KSAgICAgICAgICAgICAgICAgICAgIHwgdGFibGUgZmllbGQgYGluZGV4YCAoSW50KQorICArMHgwNjc4IHwgMDEgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICB8IDB4MDAwMDAwMDEgKDEpICAgICAgICAgICAgICAgICAgICAgfCB0YWJsZSBmaWVsZCBgZWxlbWVudF9zaXplYCAoVUludCkKKworc3RyaW5nIChyZWZsZWN0aW9uLkVudW1WYWwubmFtZSk6CisgICsweDA2N0MgfCAxNyAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgIHwgMHgwMDAwMDAxNyAoMjMpICAgICAgICAgICAgICAgICAgICB8IGxlbmd0aCBvZiBzdHJpbmcKKyAgKzB4MDY4MCB8IDU0IDY1IDczIDc0IDUzIDY5IDZEIDcwIHwgY2hhclsyM10gICAgfCBUZXN0U2ltcCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nIGxpdGVyYWwKKyAgKzB4MDY4OCB8IDZDIDY1IDU0IDYxIDYyIDZDIDY1IDU3IHwgICAgICAgICAgICAgfCBsZVRhYmxlVworICArMHgwNjkwIHwgNjkgNzQgNjggNDUgNkUgNzUgNkQgICAgfCAgICAgICAgICAgICB8IGl0aEVudW0KKyAgKzB4MDY5NyB8IDAwICAgICAgICAgICAgICAgICAgICAgIHwgY2hhciAgICAgICAgfCAweDAwICgwKSAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nIHRlcm1pbmF0b3IKKwordGFibGUgKHJlZmxlY3Rpb24uRW51bVZhbCk6CisgICsweDA2OTggfCA3RSBGRCBGRiBGRiAgICAgICAgICAgICB8IFNPZmZzZXQzMiAgIHwgMHhGRkZGRkQ3RSAoLTY0MikgTG9jOiArMHgwOTFBICAgICB8IG9mZnNldCB0byB2dGFibGUKKyAgKzB4MDY5QyB8IDI4IDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMDI4ICg0MCkgTG9jOiArMHgwNkM0ICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBuYW1lYCAoc3RyaW5nKQorICArMHgwNkEwIHwgMTQgMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDAwMTQgKDIwKSBMb2M6ICsweDA2QjQgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYHVuaW9uX3R5cGVgICh0YWJsZSkKKyAgKzB4MDZBNCB8IDBDIDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMDBDICgxMikgTG9jOiArMHgwNkIwICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBkb2N1bWVudGF0aW9uYCAodmVjdG9yKQorICArMHgwNkE4IHwgMDEgMDAgMDAgMDAgMDAgMDAgMDAgMDAgfCBpbnQ2NF90ICAgICB8IDB4MDAwMDAwMDAwMDAwMDAwMSAoMSkgICAgICAgICAgICAgfCB0YWJsZSBmaWVsZCBgdmFsdWVgIChMb25nKQorCit2ZWN0b3IgKHJlZmxlY3Rpb24uRW51bVZhbC5kb2N1bWVudGF0aW9uKToKKyAgKzB4MDZCMCB8IDAwIDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgfCAweDAwMDAwMDAwICgwKSAgICAgICAgICAgICAgICAgICAgIHwgbGVuZ3RoIG9mIHZlY3RvciAoIyBpdGVtcykKKwordGFibGUgKHJlZmxlY3Rpb24uVHlwZSk6CisgICsweDA2QjQgfCBGQyBDRCBGRiBGRiAgICAgICAgICAgICB8IFNPZmZzZXQzMiAgIHwgMHhGRkZGQ0RGQyAoLTEyODA0KSBMb2M6ICsweDM4QjggICB8IG9mZnNldCB0byB2dGFibGUKKyAgKzB4MDZCOCB8IDAwIDAwIDAwICAgICAgICAgICAgICAgIHwgdWludDhfdFszXSAgfCAuLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgcGFkZGluZworICArMHgwNkJCIHwgMEYgICAgICAgICAgICAgICAgICAgICAgfCB1aW50OF90ICAgICB8IDB4MEYgKDE1KSAgICAgICAgICAgICAgICAgICAgICAgICAgfCB0YWJsZSBmaWVsZCBgYmFzZV90eXBlYCAoQnl0ZSkKKyAgKzB4MDZCQyB8IDAxIDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgfCAweDAwMDAwMDAxICgxKSAgICAgICAgICAgICAgICAgICAgIHwgdGFibGUgZmllbGQgYGluZGV4YCAoSW50KQorICArMHgwNkMwIHwgMDEgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICB8IDB4MDAwMDAwMDEgKDEpICAgICAgICAgICAgICAgICAgICAgfCB0YWJsZSBmaWVsZCBgZWxlbWVudF9zaXplYCAoVUludCkKKworc3RyaW5nIChyZWZsZWN0aW9uLkVudW1WYWwubmFtZSk6CisgICsweDA2QzQgfCAwNyAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgIHwgMHgwMDAwMDAwNyAoNykgICAgICAgICAgICAgICAgICAgICB8IGxlbmd0aCBvZiBzdHJpbmcKKyAgKzB4MDZDOCB8IDREIDZGIDZFIDczIDc0IDY1IDcyICAgIHwgY2hhcls3XSAgICAgfCBNb25zdGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nIGxpdGVyYWwKKyAgKzB4MDZDRiB8IDAwICAgICAgICAgICAgICAgICAgICAgIHwgY2hhciAgICAgICAgfCAweDAwICgwKSAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nIHRlcm1pbmF0b3IKKwordGFibGUgKHJlZmxlY3Rpb24uRW51bVZhbCk6CisgICsweDA2RDAgfCAxMiBGQiBGRiBGRiAgICAgICAgICAgICB8IFNPZmZzZXQzMiAgIHwgMHhGRkZGRkIxMiAoLTEyNjIpIExvYzogKzB4MEJCRSAgICB8IG9mZnNldCB0byB2dGFibGUKKyAgKzB4MDZENCB8IDFDIDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMDFDICgyOCkgTG9jOiArMHgwNkYwICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBuYW1lYCAoc3RyaW5nKQorICArMHgwNkQ4IHwgMEMgMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDAwMEMgKDEyKSBMb2M6ICsweDA2RTQgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYHVuaW9uX3R5cGVgICh0YWJsZSkKKyAgKzB4MDZEQyB8IDA0IDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMDA0ICg0KSBMb2M6ICsweDA2RTAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBkb2N1bWVudGF0aW9uYCAodmVjdG9yKQorCit2ZWN0b3IgKHJlZmxlY3Rpb24uRW51bVZhbC5kb2N1bWVudGF0aW9uKToKKyAgKzB4MDZFMCB8IDAwIDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgfCAweDAwMDAwMDAwICgwKSAgICAgICAgICAgICAgICAgICAgIHwgbGVuZ3RoIG9mIHZlY3RvciAoIyBpdGVtcykKKwordGFibGUgKHJlZmxlY3Rpb24uVHlwZSk6CisgICsweDA2RTQgfCAwNCBGQiBGRiBGRiAgICAgICAgICAgICB8IFNPZmZzZXQzMiAgIHwgMHhGRkZGRkIwNCAoLTEyNzYpIExvYzogKzB4MEJFMCAgICB8IG9mZnNldCB0byB2dGFibGUKKyAgKzB4MDZFOCB8IDAxIDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgfCAweDAwMDAwMDAxICgxKSAgICAgICAgICAgICAgICAgICAgIHwgdGFibGUgZmllbGQgYGJhc2Vfc2l6ZWAgKFVJbnQpCisgICsweDA2RUMgfCAwMSAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgIHwgMHgwMDAwMDAwMSAoMSkgICAgICAgICAgICAgICAgICAgICB8IHRhYmxlIGZpZWxkIGBlbGVtZW50X3NpemVgIChVSW50KQorCitzdHJpbmcgKHJlZmxlY3Rpb24uRW51bVZhbC5uYW1lKToKKyAgKzB4MDZGMCB8IDA0IDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgfCAweDAwMDAwMDA0ICg0KSAgICAgICAgICAgICAgICAgICAgIHwgbGVuZ3RoIG9mIHN0cmluZworICArMHgwNkY0IHwgNEUgNEYgNEUgNDUgICAgICAgICAgICAgfCBjaGFyWzRdICAgICB8IE5PTkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJpbmcgbGl0ZXJhbAorICArMHgwNkY4IHwgMDAgICAgICAgICAgICAgICAgICAgICAgfCBjaGFyICAgICAgICB8IDB4MDAgKDApICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJpbmcgdGVybWluYXRvcgorCitwYWRkaW5nOgorICArMHgwNkY5IHwgMDAgMDAgMDAgICAgICAgICAgICAgICAgfCB1aW50OF90WzNdICB8IC4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBwYWRkaW5nCisKK3RhYmxlIChyZWZsZWN0aW9uLkVudW0pOgorICArMHgwNkZDIHwgQTIgRkQgRkYgRkYgICAgICAgICAgICAgfCBTT2Zmc2V0MzIgICB8IDB4RkZGRkZEQTIgKC02MDYpIExvYzogKzB4MDk1QSAgICAgfCBvZmZzZXQgdG8gdnRhYmxlCisgICsweDA3MDAgfCA2QyAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDA2QyAoMTA4KSBMb2M6ICsweDA3NkMgICAgICB8IG9mZnNldCB0byBmaWVsZCBgbmFtZWAgKHN0cmluZykKKyAgKzB4MDcwNCB8IDU4IDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMDU4ICg4OCkgTG9jOiArMHgwNzVDICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGB2YWx1ZXNgICh2ZWN0b3IpCisgICsweDA3MDggfCA0MCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDA0MCAoNjQpIExvYzogKzB4MDc0OCAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgdW5kZXJseWluZ190eXBlYCAodGFibGUpCisgICsweDA3MEMgfCAxMCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDAxMCAoMTYpIExvYzogKzB4MDcxQyAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgYXR0cmlidXRlc2AgKHZlY3RvcikKKyAgKzB4MDcxMCB8IDA4IDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMDA4ICg4KSBMb2M6ICsweDA3MTggICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBkb2N1bWVudGF0aW9uYCAodmVjdG9yKQorICArMHgwNzE0IHwgNEMgMzAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDMwNEMgKDEyMzY0KSBMb2M6ICsweDM3NjAgICAgfCBvZmZzZXQgdG8gZmllbGQgYGRlY2xhcmF0aW9uX2ZpbGVgIChzdHJpbmcpCisKK3ZlY3RvciAocmVmbGVjdGlvbi5FbnVtLmRvY3VtZW50YXRpb24pOgorICArMHgwNzE4IHwgMDAgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICB8IDB4MDAwMDAwMDAgKDApICAgICAgICAgICAgICAgICAgICAgfCBsZW5ndGggb2YgdmVjdG9yICgjIGl0ZW1zKQorCit2ZWN0b3IgKHJlZmxlY3Rpb24uRW51bS5hdHRyaWJ1dGVzKToKKyAgKzB4MDcxQyB8IDAxIDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgfCAweDAwMDAwMDAxICgxKSAgICAgICAgICAgICAgICAgICAgIHwgbGVuZ3RoIG9mIHZlY3RvciAoIyBpdGVtcykKKyAgKzB4MDcyMCB8IDA0IDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMDA0ICg0KSBMb2M6ICsweDA3MjQgICAgICAgIHwgb2Zmc2V0IHRvIHRhYmxlWzBdCisKK3RhYmxlIChyZWZsZWN0aW9uLktleVZhbHVlKToKKyAgKzB4MDcyNCB8IEMwIEQxIEZGIEZGICAgICAgICAgICAgIHwgU09mZnNldDMyICAgfCAweEZGRkZEMUMwICgtMTE4NDApIExvYzogKzB4MzU2NCAgIHwgb2Zmc2V0IHRvIHZ0YWJsZQorICArMHgwNzI4IHwgMTAgMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDAwMTAgKDE2KSBMb2M6ICsweDA3MzggICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYGtleWAgKHN0cmluZykKKyAgKzB4MDcyQyB8IDA0IDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMDA0ICg0KSBMb2M6ICsweDA3MzAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGB2YWx1ZWAgKHN0cmluZykKKworc3RyaW5nIChyZWZsZWN0aW9uLktleVZhbHVlLnZhbHVlKToKKyAgKzB4MDczMCB8IDAxIDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgfCAweDAwMDAwMDAxICgxKSAgICAgICAgICAgICAgICAgICAgIHwgbGVuZ3RoIG9mIHN0cmluZworICArMHgwNzM0IHwgMzAgICAgICAgICAgICAgICAgICAgICAgfCBjaGFyWzFdICAgICB8IDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJpbmcgbGl0ZXJhbAorICArMHgwNzM1IHwgMDAgICAgICAgICAgICAgICAgICAgICAgfCBjaGFyICAgICAgICB8IDB4MDAgKDApICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJpbmcgdGVybWluYXRvcgorCitwYWRkaW5nOgorICArMHgwNzM2IHwgMDAgMDAgICAgICAgICAgICAgICAgICAgfCB1aW50OF90WzJdICB8IC4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBwYWRkaW5nCisKK3N0cmluZyAocmVmbGVjdGlvbi5LZXlWYWx1ZS5rZXkpOgorICArMHgwNzM4IHwgMDkgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICB8IDB4MDAwMDAwMDkgKDkpICAgICAgICAgICAgICAgICAgICAgfCBsZW5ndGggb2Ygc3RyaW5nCisgICsweDA3M0MgfCA2MiA2OSA3NCA1RiA2NiA2QyA2MSA2NyB8IGNoYXJbOV0gICAgIHwgYml0X2ZsYWcgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHN0cmluZyBsaXRlcmFsCisgICsweDA3NDQgfCA3MyAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgIHwgcworICArMHgwNzQ1IHwgMDAgICAgICAgICAgICAgICAgICAgICAgfCBjaGFyICAgICAgICB8IDB4MDAgKDApICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJpbmcgdGVybWluYXRvcgorCitwYWRkaW5nOgorICArMHgwNzQ2IHwgMDAgMDAgICAgICAgICAgICAgICAgICAgfCB1aW50OF90WzJdICB8IC4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBwYWRkaW5nCisKK3RhYmxlIChyZWZsZWN0aW9uLlR5cGUpOgorICArMHgwNzQ4IHwgNDQgRDEgRkYgRkYgICAgICAgICAgICAgfCBTT2Zmc2V0MzIgICB8IDB4RkZGRkQxNDQgKC0xMTk2NCkgTG9jOiArMHgzNjA0ICAgfCBvZmZzZXQgdG8gdnRhYmxlCisgICsweDA3NEMgfCAwMCAwMCAwMCAgICAgICAgICAgICAgICB8IHVpbnQ4X3RbM10gIHwgLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHBhZGRpbmcKKyAgKzB4MDc0RiB8IDBBICAgICAgICAgICAgICAgICAgICAgIHwgdWludDhfdCAgICAgfCAweDBBICgxMCkgICAgICAgICAgICAgICAgICAgICAgICAgIHwgdGFibGUgZmllbGQgYGJhc2VfdHlwZWAgKEJ5dGUpCisgICsweDA3NTAgfCAwNCAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgIHwgMHgwMDAwMDAwNCAoNCkgICAgICAgICAgICAgICAgICAgICB8IHRhYmxlIGZpZWxkIGBpbmRleGAgKEludCkKKyAgKzB4MDc1NCB8IDA4IDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgfCAweDAwMDAwMDA4ICg4KSAgICAgICAgICAgICAgICAgICAgIHwgdGFibGUgZmllbGQgYGJhc2Vfc2l6ZWAgKFVJbnQpCisgICsweDA3NTggfCAwMSAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgIHwgMHgwMDAwMDAwMSAoMSkgICAgICAgICAgICAgICAgICAgICB8IHRhYmxlIGZpZWxkIGBlbGVtZW50X3NpemVgIChVSW50KQorCit2ZWN0b3IgKHJlZmxlY3Rpb24uRW51bS52YWx1ZXMpOgorICArMHgwNzVDIHwgMDMgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICB8IDB4MDAwMDAwMDMgKDMpICAgICAgICAgICAgICAgICAgICAgfCBsZW5ndGggb2YgdmVjdG9yICgjIGl0ZW1zKQorICArMHgwNzYwIHwgOTggMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDAwOTggKDE1MikgTG9jOiArMHgwN0Y4ICAgICAgfCBvZmZzZXQgdG8gdGFibGVbMF0KKyAgKzB4MDc2NCB8IDVDIDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMDVDICg5MikgTG9jOiArMHgwN0MwICAgICAgIHwgb2Zmc2V0IHRvIHRhYmxlWzFdCisgICsweDA3NjggfCAyMCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDAyMCAoMzIpIExvYzogKzB4MDc4OCAgICAgICB8IG9mZnNldCB0byB0YWJsZVsyXQorCitzdHJpbmcgKHJlZmxlY3Rpb24uRW51bS5uYW1lKToKKyAgKzB4MDc2QyB8IDE3IDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgfCAweDAwMDAwMDE3ICgyMykgICAgICAgICAgICAgICAgICAgIHwgbGVuZ3RoIG9mIHN0cmluZworICArMHgwNzcwIHwgNEQgNzkgNDcgNjEgNkQgNjUgMkUgNDUgfCBjaGFyWzIzXSAgICB8IE15R2FtZS5FICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJpbmcgbGl0ZXJhbAorICArMHgwNzc4IHwgNzggNjEgNkQgNzAgNkMgNjUgMkUgNEMgfCAgICAgICAgICAgICB8IHhhbXBsZS5MCisgICsweDA3ODAgfCA2RiA2RSA2NyA0NSA2RSA3NSA2RCAgICB8ICAgICAgICAgICAgIHwgb25nRW51bQorICArMHgwNzg3IHwgMDAgICAgICAgICAgICAgICAgICAgICAgfCBjaGFyICAgICAgICB8IDB4MDAgKDApICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJpbmcgdGVybWluYXRvcgorCit0YWJsZSAocmVmbGVjdGlvbi5FbnVtVmFsKToKKyAgKzB4MDc4OCB8IDdFIEZDIEZGIEZGICAgICAgICAgICAgIHwgU09mZnNldDMyICAgfCAweEZGRkZGQzdFICgtODk4KSBMb2M6ICsweDBCMEEgICAgIHwgb2Zmc2V0IHRvIHZ0YWJsZQorICArMHgwNzhDIHwgMjggMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDAwMjggKDQwKSBMb2M6ICsweDA3QjQgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYG5hbWVgIChzdHJpbmcpCisgICsweDA3OTAgfCAxOCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDAxOCAoMjQpIExvYzogKzB4MDdBOCAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgdW5pb25fdHlwZWAgKHRhYmxlKQorICArMHgwNzk0IHwgMTAgMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDAwMTAgKDE2KSBMb2M6ICsweDA3QTQgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYGRvY3VtZW50YXRpb25gICh2ZWN0b3IpCisgICsweDA3OTggfCAwMCAwMCAwMCAwMCAwMCAwMSAwMCAwMCB8IGludDY0X3QgICAgIHwgMHgwMDAwMDEwMDAwMDAwMDAwICgxMDk5NTExNjI3Nzc2KSB8IHRhYmxlIGZpZWxkIGB2YWx1ZWAgKExvbmcpCisgICsweDA3QTAgfCAwMCAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQ4X3RbNF0gIHwgLi4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHBhZGRpbmcKKwordmVjdG9yIChyZWZsZWN0aW9uLkVudW1WYWwuZG9jdW1lbnRhdGlvbik6CisgICsweDA3QTQgfCAwMCAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgIHwgMHgwMDAwMDAwMCAoMCkgICAgICAgICAgICAgICAgICAgICB8IGxlbmd0aCBvZiB2ZWN0b3IgKCMgaXRlbXMpCisKK3RhYmxlIChyZWZsZWN0aW9uLlR5cGUpOgorICArMHgwN0E4IHwgQzggRkIgRkYgRkYgICAgICAgICAgICAgfCBTT2Zmc2V0MzIgICB8IDB4RkZGRkZCQzggKC0xMDgwKSBMb2M6ICsweDBCRTAgICAgfCBvZmZzZXQgdG8gdnRhYmxlCisgICsweDA3QUMgfCAwMSAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgIHwgMHgwMDAwMDAwMSAoMSkgICAgICAgICAgICAgICAgICAgICB8IHRhYmxlIGZpZWxkIGBiYXNlX3NpemVgIChVSW50KQorICArMHgwN0IwIHwgMDEgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICB8IDB4MDAwMDAwMDEgKDEpICAgICAgICAgICAgICAgICAgICAgfCB0YWJsZSBmaWVsZCBgZWxlbWVudF9zaXplYCAoVUludCkKKworc3RyaW5nIChyZWZsZWN0aW9uLkVudW1WYWwubmFtZSk6CisgICsweDA3QjQgfCAwNyAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgIHwgMHgwMDAwMDAwNyAoNykgICAgICAgICAgICAgICAgICAgICB8IGxlbmd0aCBvZiBzdHJpbmcKKyAgKzB4MDdCOCB8IDRDIDZGIDZFIDY3IDQyIDY5IDY3ICAgIHwgY2hhcls3XSAgICAgfCBMb25nQmlnICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nIGxpdGVyYWwKKyAgKzB4MDdCRiB8IDAwICAgICAgICAgICAgICAgICAgICAgIHwgY2hhciAgICAgICAgfCAweDAwICgwKSAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nIHRlcm1pbmF0b3IKKwordGFibGUgKHJlZmxlY3Rpb24uRW51bVZhbCk6CisgICsweDA3QzAgfCBCNiBGQyBGRiBGRiAgICAgICAgICAgICB8IFNPZmZzZXQzMiAgIHwgMHhGRkZGRkNCNiAoLTg0MikgTG9jOiArMHgwQjBBICAgICB8IG9mZnNldCB0byB2dGFibGUKKyAgKzB4MDdDNCB8IDI4IDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMDI4ICg0MCkgTG9jOiArMHgwN0VDICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBuYW1lYCAoc3RyaW5nKQorICArMHgwN0M4IHwgMTggMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDAwMTggKDI0KSBMb2M6ICsweDA3RTAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYHVuaW9uX3R5cGVgICh0YWJsZSkKKyAgKzB4MDdDQyB8IDEwIDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMDEwICgxNikgTG9jOiArMHgwN0RDICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBkb2N1bWVudGF0aW9uYCAodmVjdG9yKQorICArMHgwN0QwIHwgMDQgMDAgMDAgMDAgMDAgMDAgMDAgMDAgfCBpbnQ2NF90ICAgICB8IDB4MDAwMDAwMDAwMDAwMDAwNCAoNCkgICAgICAgICAgICAgfCB0YWJsZSBmaWVsZCBgdmFsdWVgIChMb25nKQorICArMHgwN0Q4IHwgMDAgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50OF90WzRdICB8IC4uLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBwYWRkaW5nCisKK3ZlY3RvciAocmVmbGVjdGlvbi5FbnVtVmFsLmRvY3VtZW50YXRpb24pOgorICArMHgwN0RDIHwgMDAgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICB8IDB4MDAwMDAwMDAgKDApICAgICAgICAgICAgICAgICAgICAgfCBsZW5ndGggb2YgdmVjdG9yICgjIGl0ZW1zKQorCit0YWJsZSAocmVmbGVjdGlvbi5UeXBlKToKKyAgKzB4MDdFMCB8IDAwIEZDIEZGIEZGICAgICAgICAgICAgIHwgU09mZnNldDMyICAgfCAweEZGRkZGQzAwICgtMTAyNCkgTG9jOiArMHgwQkUwICAgIHwgb2Zmc2V0IHRvIHZ0YWJsZQorICArMHgwN0U0IHwgMDEgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICB8IDB4MDAwMDAwMDEgKDEpICAgICAgICAgICAgICAgICAgICAgfCB0YWJsZSBmaWVsZCBgYmFzZV9zaXplYCAoVUludCkKKyAgKzB4MDdFOCB8IDAxIDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgfCAweDAwMDAwMDAxICgxKSAgICAgICAgICAgICAgICAgICAgIHwgdGFibGUgZmllbGQgYGVsZW1lbnRfc2l6ZWAgKFVJbnQpCisKK3N0cmluZyAocmVmbGVjdGlvbi5FbnVtVmFsLm5hbWUpOgorICArMHgwN0VDIHwgMDcgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICB8IDB4MDAwMDAwMDcgKDcpICAgICAgICAgICAgICAgICAgICAgfCBsZW5ndGggb2Ygc3RyaW5nCisgICsweDA3RjAgfCA0QyA2RiA2RSA2NyA1NCA3NyA2RiAgICB8IGNoYXJbN10gICAgIHwgTG9uZ1R3byAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHN0cmluZyBsaXRlcmFsCisgICsweDA3RjcgfCAwMCAgICAgICAgICAgICAgICAgICAgICB8IGNoYXIgICAgICAgIHwgMHgwMCAoMCkgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHN0cmluZyB0ZXJtaW5hdG9yCisKK3RhYmxlIChyZWZsZWN0aW9uLkVudW1WYWwpOgorICArMHgwN0Y4IHwgREUgRkUgRkYgRkYgICAgICAgICAgICAgfCBTT2Zmc2V0MzIgICB8IDB4RkZGRkZFREUgKC0yOTApIExvYzogKzB4MDkxQSAgICAgfCBvZmZzZXQgdG8gdnRhYmxlCisgICsweDA3RkMgfCAyNCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDAyNCAoMzYpIExvYzogKzB4MDgyMCAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgbmFtZWAgKHN0cmluZykKKyAgKzB4MDgwMCB8IDE0IDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMDE0ICgyMCkgTG9jOiArMHgwODE0ICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGB1bmlvbl90eXBlYCAodGFibGUpCisgICsweDA4MDQgfCAwQyAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDAwQyAoMTIpIExvYzogKzB4MDgxMCAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgZG9jdW1lbnRhdGlvbmAgKHZlY3RvcikKKyAgKzB4MDgwOCB8IDAyIDAwIDAwIDAwIDAwIDAwIDAwIDAwIHwgaW50NjRfdCAgICAgfCAweDAwMDAwMDAwMDAwMDAwMDIgKDIpICAgICAgICAgICAgIHwgdGFibGUgZmllbGQgYHZhbHVlYCAoTG9uZykKKwordmVjdG9yIChyZWZsZWN0aW9uLkVudW1WYWwuZG9jdW1lbnRhdGlvbik6CisgICsweDA4MTAgfCAwMCAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgIHwgMHgwMDAwMDAwMCAoMCkgICAgICAgICAgICAgICAgICAgICB8IGxlbmd0aCBvZiB2ZWN0b3IgKCMgaXRlbXMpCisKK3RhYmxlIChyZWZsZWN0aW9uLlR5cGUpOgorICArMHgwODE0IHwgMzQgRkMgRkYgRkYgICAgICAgICAgICAgfCBTT2Zmc2V0MzIgICB8IDB4RkZGRkZDMzQgKC05NzIpIExvYzogKzB4MEJFMCAgICAgfCBvZmZzZXQgdG8gdnRhYmxlCisgICsweDA4MTggfCAwMSAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgIHwgMHgwMDAwMDAwMSAoMSkgICAgICAgICAgICAgICAgICAgICB8IHRhYmxlIGZpZWxkIGBiYXNlX3NpemVgIChVSW50KQorICArMHgwODFDIHwgMDEgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICB8IDB4MDAwMDAwMDEgKDEpICAgICAgICAgICAgICAgICAgICAgfCB0YWJsZSBmaWVsZCBgZWxlbWVudF9zaXplYCAoVUludCkKKworc3RyaW5nIChyZWZsZWN0aW9uLkVudW1WYWwubmFtZSk6CisgICsweDA4MjAgfCAwNyAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgIHwgMHgwMDAwMDAwNyAoNykgICAgICAgICAgICAgICAgICAgICB8IGxlbmd0aCBvZiBzdHJpbmcKKyAgKzB4MDgyNCB8IDRDIDZGIDZFIDY3IDRGIDZFIDY1ICAgIHwgY2hhcls3XSAgICAgfCBMb25nT25lICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nIGxpdGVyYWwKKyAgKzB4MDgyQiB8IDAwICAgICAgICAgICAgICAgICAgICAgIHwgY2hhciAgICAgICAgfCAweDAwICgwKSAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nIHRlcm1pbmF0b3IKKwordGFibGUgKHJlZmxlY3Rpb24uRW51bSk6CisgICsweDA4MkMgfCBERSBGQyBGRiBGRiAgICAgICAgICAgICB8IFNPZmZzZXQzMiAgIHwgMHhGRkZGRkNERSAoLTgwMikgTG9jOiArMHgwQjRFICAgICB8IG9mZnNldCB0byB2dGFibGUKKyAgKzB4MDgzMCB8IDQwIDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMDQwICg2NCkgTG9jOiArMHgwODcwICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBuYW1lYCAoc3RyaW5nKQorICArMHgwODM0IHwgMjggMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDAwMjggKDQwKSBMb2M6ICsweDA4NUMgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYHZhbHVlc2AgKHZlY3RvcikKKyAgKzB4MDgzOCB8IDEwIDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMDEwICgxNikgTG9jOiArMHgwODQ4ICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGB1bmRlcmx5aW5nX3R5cGVgICh0YWJsZSkKKyAgKzB4MDgzQyB8IDA4IDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMDA4ICg4KSBMb2M6ICsweDA4NDQgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBkb2N1bWVudGF0aW9uYCAodmVjdG9yKQorICArMHgwODQwIHwgMjAgMkYgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDJGMjAgKDEyMDY0KSBMb2M6ICsweDM3NjAgICAgfCBvZmZzZXQgdG8gZmllbGQgYGRlY2xhcmF0aW9uX2ZpbGVgIChzdHJpbmcpCisKK3ZlY3RvciAocmVmbGVjdGlvbi5FbnVtLmRvY3VtZW50YXRpb24pOgorICArMHgwODQ0IHwgMDAgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICB8IDB4MDAwMDAwMDAgKDApICAgICAgICAgICAgICAgICAgICAgfCBsZW5ndGggb2YgdmVjdG9yICgjIGl0ZW1zKQorCit0YWJsZSAocmVmbGVjdGlvbi5UeXBlKToKKyAgKzB4MDg0OCB8IDQ0IEQyIEZGIEZGICAgICAgICAgICAgIHwgU09mZnNldDMyICAgfCAweEZGRkZEMjQ0ICgtMTE3MDgpIExvYzogKzB4MzYwNCAgIHwgb2Zmc2V0IHRvIHZ0YWJsZQorICArMHgwODRDIHwgMDAgMDAgMDAgICAgICAgICAgICAgICAgfCB1aW50OF90WzNdICB8IC4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBwYWRkaW5nCisgICsweDA4NEYgfCAwMyAgICAgICAgICAgICAgICAgICAgICB8IHVpbnQ4X3QgICAgIHwgMHgwMyAoMykgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHRhYmxlIGZpZWxkIGBiYXNlX3R5cGVgIChCeXRlKQorICArMHgwODUwIHwgMDUgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICB8IDB4MDAwMDAwMDUgKDUpICAgICAgICAgICAgICAgICAgICAgfCB0YWJsZSBmaWVsZCBgaW5kZXhgIChJbnQpCisgICsweDA4NTQgfCAwMSAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgIHwgMHgwMDAwMDAwMSAoMSkgICAgICAgICAgICAgICAgICAgICB8IHRhYmxlIGZpZWxkIGBiYXNlX3NpemVgIChVSW50KQorICArMHgwODU4IHwgMDEgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICB8IDB4MDAwMDAwMDEgKDEpICAgICAgICAgICAgICAgICAgICAgfCB0YWJsZSBmaWVsZCBgZWxlbWVudF9zaXplYCAoVUludCkKKwordmVjdG9yIChyZWZsZWN0aW9uLkVudW0udmFsdWVzKToKKyAgKzB4MDg1QyB8IDA0IDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgfCAweDAwMDAwMDA0ICg0KSAgICAgICAgICAgICAgICAgICAgIHwgbGVuZ3RoIG9mIHZlY3RvciAoIyBpdGVtcykKKyAgKzB4MDg2MCB8IEM4IDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMEM4ICgyMDApIExvYzogKzB4MDkyOCAgICAgIHwgb2Zmc2V0IHRvIHRhYmxlWzBdCisgICsweDA4NjQgfCA4QyAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDA4QyAoMTQwKSBMb2M6ICsweDA4RjAgICAgICB8IG9mZnNldCB0byB0YWJsZVsxXQorICArMHgwODY4IHwgNTAgMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDAwNTAgKDgwKSBMb2M6ICsweDA4QjggICAgICAgfCBvZmZzZXQgdG8gdGFibGVbMl0KKyAgKzB4MDg2QyB8IDFDIDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMDFDICgyOCkgTG9jOiArMHgwODg4ICAgICAgIHwgb2Zmc2V0IHRvIHRhYmxlWzNdCisKK3N0cmluZyAocmVmbGVjdGlvbi5FbnVtLm5hbWUpOgorICArMHgwODcwIHwgMTMgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICB8IDB4MDAwMDAwMTMgKDE5KSAgICAgICAgICAgICAgICAgICAgfCBsZW5ndGggb2Ygc3RyaW5nCisgICsweDA4NzQgfCA0RCA3OSA0NyA2MSA2RCA2NSAyRSA0NSB8IGNoYXJbMTldICAgIHwgTXlHYW1lLkUgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHN0cmluZyBsaXRlcmFsCisgICsweDA4N0MgfCA3OCA2MSA2RCA3MCA2QyA2NSAyRSA1MiB8ICAgICAgICAgICAgIHwgeGFtcGxlLlIKKyAgKzB4MDg4NCB8IDYxIDYzIDY1ICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgfCBhY2UKKyAgKzB4MDg4NyB8IDAwICAgICAgICAgICAgICAgICAgICAgIHwgY2hhciAgICAgICAgfCAweDAwICgwKSAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nIHRlcm1pbmF0b3IKKwordGFibGUgKHJlZmxlY3Rpb24uRW51bVZhbCk6CisgICsweDA4ODggfCA2RSBGRiBGRiBGRiAgICAgICAgICAgICB8IFNPZmZzZXQzMiAgIHwgMHhGRkZGRkY2RSAoLTE0NikgTG9jOiArMHgwOTFBICAgICB8IG9mZnNldCB0byB2dGFibGUKKyAgKzB4MDg4QyB8IDI0IDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMDI0ICgzNikgTG9jOiArMHgwOEIwICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBuYW1lYCAoc3RyaW5nKQorICArMHgwODkwIHwgMTQgMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDAwMTQgKDIwKSBMb2M6ICsweDA4QTQgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYHVuaW9uX3R5cGVgICh0YWJsZSkKKyAgKzB4MDg5NCB8IDBDIDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMDBDICgxMikgTG9jOiArMHgwOEEwICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBkb2N1bWVudGF0aW9uYCAodmVjdG9yKQorICArMHgwODk4IHwgMDIgMDAgMDAgMDAgMDAgMDAgMDAgMDAgfCBpbnQ2NF90ICAgICB8IDB4MDAwMDAwMDAwMDAwMDAwMiAoMikgICAgICAgICAgICAgfCB0YWJsZSBmaWVsZCBgdmFsdWVgIChMb25nKQorCit2ZWN0b3IgKHJlZmxlY3Rpb24uRW51bVZhbC5kb2N1bWVudGF0aW9uKToKKyAgKzB4MDhBMCB8IDAwIDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgfCAweDAwMDAwMDAwICgwKSAgICAgICAgICAgICAgICAgICAgIHwgbGVuZ3RoIG9mIHZlY3RvciAoIyBpdGVtcykKKwordGFibGUgKHJlZmxlY3Rpb24uVHlwZSk6CisgICsweDA4QTQgfCBDNCBGQyBGRiBGRiAgICAgICAgICAgICB8IFNPZmZzZXQzMiAgIHwgMHhGRkZGRkNDNCAoLTgyOCkgTG9jOiArMHgwQkUwICAgICB8IG9mZnNldCB0byB2dGFibGUKKyAgKzB4MDhBOCB8IDAxIDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgfCAweDAwMDAwMDAxICgxKSAgICAgICAgICAgICAgICAgICAgIHwgdGFibGUgZmllbGQgYGJhc2Vfc2l6ZWAgKFVJbnQpCisgICsweDA4QUMgfCAwMSAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgIHwgMHgwMDAwMDAwMSAoMSkgICAgICAgICAgICAgICAgICAgICB8IHRhYmxlIGZpZWxkIGBlbGVtZW50X3NpemVgIChVSW50KQorCitzdHJpbmcgKHJlZmxlY3Rpb24uRW51bVZhbC5uYW1lKToKKyAgKzB4MDhCMCB8IDAzIDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgfCAweDAwMDAwMDAzICgzKSAgICAgICAgICAgICAgICAgICAgIHwgbGVuZ3RoIG9mIHN0cmluZworICArMHgwOEI0IHwgNDUgNkMgNjYgICAgICAgICAgICAgICAgfCBjaGFyWzNdICAgICB8IEVsZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJpbmcgbGl0ZXJhbAorICArMHgwOEI3IHwgMDAgICAgICAgICAgICAgICAgICAgICAgfCBjaGFyICAgICAgICB8IDB4MDAgKDApICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJpbmcgdGVybWluYXRvcgorCit0YWJsZSAocmVmbGVjdGlvbi5FbnVtVmFsKToKKyAgKzB4MDhCOCB8IEFFIEZEIEZGIEZGICAgICAgICAgICAgIHwgU09mZnNldDMyICAgfCAweEZGRkZGREFFICgtNTk0KSBMb2M6ICsweDBCMEEgICAgIHwgb2Zmc2V0IHRvIHZ0YWJsZQorICArMHgwOEJDIHwgMjggMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDAwMjggKDQwKSBMb2M6ICsweDA4RTQgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYG5hbWVgIChzdHJpbmcpCisgICsweDA4QzAgfCAxOCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDAxOCAoMjQpIExvYzogKzB4MDhEOCAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgdW5pb25fdHlwZWAgKHRhYmxlKQorICArMHgwOEM0IHwgMTAgMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDAwMTAgKDE2KSBMb2M6ICsweDA4RDQgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYGRvY3VtZW50YXRpb25gICh2ZWN0b3IpCisgICsweDA4QzggfCAwMSAwMCAwMCAwMCAwMCAwMCAwMCAwMCB8IGludDY0X3QgICAgIHwgMHgwMDAwMDAwMDAwMDAwMDAxICgxKSAgICAgICAgICAgICB8IHRhYmxlIGZpZWxkIGB2YWx1ZWAgKExvbmcpCisgICsweDA4RDAgfCAwMCAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQ4X3RbNF0gIHwgLi4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHBhZGRpbmcKKwordmVjdG9yIChyZWZsZWN0aW9uLkVudW1WYWwuZG9jdW1lbnRhdGlvbik6CisgICsweDA4RDQgfCAwMCAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgIHwgMHgwMDAwMDAwMCAoMCkgICAgICAgICAgICAgICAgICAgICB8IGxlbmd0aCBvZiB2ZWN0b3IgKCMgaXRlbXMpCisKK3RhYmxlIChyZWZsZWN0aW9uLlR5cGUpOgorICArMHgwOEQ4IHwgRjggRkMgRkYgRkYgICAgICAgICAgICAgfCBTT2Zmc2V0MzIgICB8IDB4RkZGRkZDRjggKC03NzYpIExvYzogKzB4MEJFMCAgICAgfCBvZmZzZXQgdG8gdnRhYmxlCisgICsweDA4REMgfCAwMSAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgIHwgMHgwMDAwMDAwMSAoMSkgICAgICAgICAgICAgICAgICAgICB8IHRhYmxlIGZpZWxkIGBiYXNlX3NpemVgIChVSW50KQorICArMHgwOEUwIHwgMDEgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICB8IDB4MDAwMDAwMDEgKDEpICAgICAgICAgICAgICAgICAgICAgfCB0YWJsZSBmaWVsZCBgZWxlbWVudF9zaXplYCAoVUludCkKKworc3RyaW5nIChyZWZsZWN0aW9uLkVudW1WYWwubmFtZSk6CisgICsweDA4RTQgfCAwNSAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgIHwgMHgwMDAwMDAwNSAoNSkgICAgICAgICAgICAgICAgICAgICB8IGxlbmd0aCBvZiBzdHJpbmcKKyAgKzB4MDhFOCB8IDQ0IDc3IDYxIDcyIDY2ICAgICAgICAgIHwgY2hhcls1XSAgICAgfCBEd2FyZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nIGxpdGVyYWwKKyAgKzB4MDhFRCB8IDAwICAgICAgICAgICAgICAgICAgICAgIHwgY2hhciAgICAgICAgfCAweDAwICgwKSAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nIHRlcm1pbmF0b3IKKworcGFkZGluZzoKKyAgKzB4MDhFRSB8IDAwIDAwICAgICAgICAgICAgICAgICAgIHwgdWludDhfdFsyXSAgfCAuLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgcGFkZGluZworCit0YWJsZSAocmVmbGVjdGlvbi5FbnVtVmFsKToKKyAgKzB4MDhGMCB8IDMyIEZEIEZGIEZGICAgICAgICAgICAgIHwgU09mZnNldDMyICAgfCAweEZGRkZGRDMyICgtNzE4KSBMb2M6ICsweDBCQkUgICAgIHwgb2Zmc2V0IHRvIHZ0YWJsZQorICArMHgwOEY0IHwgMUMgMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDAwMUMgKDI4KSBMb2M6ICsweDA5MTAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYG5hbWVgIChzdHJpbmcpCisgICsweDA4RjggfCAwQyAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDAwQyAoMTIpIExvYzogKzB4MDkwNCAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgdW5pb25fdHlwZWAgKHRhYmxlKQorICArMHgwOEZDIHwgMDQgMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDAwMDQgKDQpIExvYzogKzB4MDkwMCAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYGRvY3VtZW50YXRpb25gICh2ZWN0b3IpCisKK3ZlY3RvciAocmVmbGVjdGlvbi5FbnVtVmFsLmRvY3VtZW50YXRpb24pOgorICArMHgwOTAwIHwgMDAgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICB8IDB4MDAwMDAwMDAgKDApICAgICAgICAgICAgICAgICAgICAgfCBsZW5ndGggb2YgdmVjdG9yICgjIGl0ZW1zKQorCit0YWJsZSAocmVmbGVjdGlvbi5UeXBlKToKKyAgKzB4MDkwNCB8IDI0IEZEIEZGIEZGICAgICAgICAgICAgIHwgU09mZnNldDMyICAgfCAweEZGRkZGRDI0ICgtNzMyKSBMb2M6ICsweDBCRTAgICAgIHwgb2Zmc2V0IHRvIHZ0YWJsZQorICArMHgwOTA4IHwgMDEgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICB8IDB4MDAwMDAwMDEgKDEpICAgICAgICAgICAgICAgICAgICAgfCB0YWJsZSBmaWVsZCBgYmFzZV9zaXplYCAoVUludCkKKyAgKzB4MDkwQyB8IDAxIDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgfCAweDAwMDAwMDAxICgxKSAgICAgICAgICAgICAgICAgICAgIHwgdGFibGUgZmllbGQgYGVsZW1lbnRfc2l6ZWAgKFVJbnQpCisKK3N0cmluZyAocmVmbGVjdGlvbi5FbnVtVmFsLm5hbWUpOgorICArMHgwOTEwIHwgMDUgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICB8IDB4MDAwMDAwMDUgKDUpICAgICAgICAgICAgICAgICAgICAgfCBsZW5ndGggb2Ygc3RyaW5nCisgICsweDA5MTQgfCA0OCA3NSA2RCA2MSA2RSAgICAgICAgICB8IGNoYXJbNV0gICAgIHwgSHVtYW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHN0cmluZyBsaXRlcmFsCisgICsweDA5MTkgfCAwMCAgICAgICAgICAgICAgICAgICAgICB8IGNoYXIgICAgICAgIHwgMHgwMCAoMCkgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHN0cmluZyB0ZXJtaW5hdG9yCisKK3Z0YWJsZSAocmVmbGVjdGlvbi5FbnVtVmFsKToKKyAgKzB4MDkxQSB8IDBFIDAwICAgICAgICAgICAgICAgICAgIHwgdWludDE2X3QgICAgfCAweDAwMEUgKDE0KSAgICAgICAgICAgICAgICAgICAgICAgIHwgc2l6ZSBvZiB0aGlzIHZ0YWJsZQorICArMHgwOTFDIHwgMTggMDAgICAgICAgICAgICAgICAgICAgfCB1aW50MTZfdCAgICB8IDB4MDAxOCAoMjQpICAgICAgICAgICAgICAgICAgICAgICAgfCBzaXplIG9mIHJlZmVycmluZyB0YWJsZQorICArMHgwOTFFIHwgMDQgMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgICB8IDB4MDAwNCAoNCkgICAgICAgICAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYG5hbWVgIChpZDogMCkKKyAgKzB4MDkyMCB8IDEwIDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgfCAweDAwMTAgKDE2KSAgICAgICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGB2YWx1ZWAgKGlkOiAxKQorICArMHgwOTIyIHwgMDAgMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgICB8IDB4MDAwMCAoMCkgICAgICAgICAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYG9iamVjdGAgKGlkOiAyKSA8bnVsbD4gKE9iaikKKyAgKzB4MDkyNCB8IDA4IDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgfCAweDAwMDggKDgpICAgICAgICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGB1bmlvbl90eXBlYCAoaWQ6IDMpCisgICsweDA5MjYgfCAwQyAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgIHwgMHgwMDBDICgxMikgICAgICAgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgZG9jdW1lbnRhdGlvbmAgKGlkOiA0KQorCit0YWJsZSAocmVmbGVjdGlvbi5FbnVtVmFsKToKKyAgKzB4MDkyOCB8IDBFIDAwIDAwIDAwICAgICAgICAgICAgIHwgU09mZnNldDMyICAgfCAweDAwMDAwMDBFICgxNCkgTG9jOiArMHgwOTFBICAgICAgIHwgb2Zmc2V0IHRvIHZ0YWJsZQorICArMHgwOTJDIHwgMjQgMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDAwMjQgKDM2KSBMb2M6ICsweDA5NTAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYG5hbWVgIChzdHJpbmcpCisgICsweDA5MzAgfCAxNCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDAxNCAoMjApIExvYzogKzB4MDk0NCAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgdW5pb25fdHlwZWAgKHRhYmxlKQorICArMHgwOTM0IHwgMEMgMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDAwMEMgKDEyKSBMb2M6ICsweDA5NDAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYGRvY3VtZW50YXRpb25gICh2ZWN0b3IpCisgICsweDA5MzggfCBGRiBGRiBGRiBGRiBGRiBGRiBGRiBGRiB8IGludDY0X3QgICAgIHwgMHhGRkZGRkZGRkZGRkZGRkZGICgtMSkgICAgICAgICAgICB8IHRhYmxlIGZpZWxkIGB2YWx1ZWAgKExvbmcpCisKK3ZlY3RvciAocmVmbGVjdGlvbi5FbnVtVmFsLmRvY3VtZW50YXRpb24pOgorICArMHgwOTQwIHwgMDAgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICB8IDB4MDAwMDAwMDAgKDApICAgICAgICAgICAgICAgICAgICAgfCBsZW5ndGggb2YgdmVjdG9yICgjIGl0ZW1zKQorCit0YWJsZSAocmVmbGVjdGlvbi5UeXBlKToKKyAgKzB4MDk0NCB8IDY0IEZEIEZGIEZGICAgICAgICAgICAgIHwgU09mZnNldDMyICAgfCAweEZGRkZGRDY0ICgtNjY4KSBMb2M6ICsweDBCRTAgICAgIHwgb2Zmc2V0IHRvIHZ0YWJsZQorICArMHgwOTQ4IHwgMDEgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICB8IDB4MDAwMDAwMDEgKDEpICAgICAgICAgICAgICAgICAgICAgfCB0YWJsZSBmaWVsZCBgYmFzZV9zaXplYCAoVUludCkKKyAgKzB4MDk0QyB8IDAxIDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgfCAweDAwMDAwMDAxICgxKSAgICAgICAgICAgICAgICAgICAgIHwgdGFibGUgZmllbGQgYGVsZW1lbnRfc2l6ZWAgKFVJbnQpCisKK3N0cmluZyAocmVmbGVjdGlvbi5FbnVtVmFsLm5hbWUpOgorICArMHgwOTUwIHwgMDQgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICB8IDB4MDAwMDAwMDQgKDQpICAgICAgICAgICAgICAgICAgICAgfCBsZW5ndGggb2Ygc3RyaW5nCisgICsweDA5NTQgfCA0RSA2RiA2RSA2NSAgICAgICAgICAgICB8IGNoYXJbNF0gICAgIHwgTm9uZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHN0cmluZyBsaXRlcmFsCisgICsweDA5NTggfCAwMCAgICAgICAgICAgICAgICAgICAgICB8IGNoYXIgICAgICAgIHwgMHgwMCAoMCkgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHN0cmluZyB0ZXJtaW5hdG9yCisKK3Z0YWJsZSAocmVmbGVjdGlvbi5FbnVtKToKKyAgKzB4MDk1QSB8IDEyIDAwICAgICAgICAgICAgICAgICAgIHwgdWludDE2X3QgICAgfCAweDAwMTIgKDE4KSAgICAgICAgICAgICAgICAgICAgICAgIHwgc2l6ZSBvZiB0aGlzIHZ0YWJsZQorICArMHgwOTVDIHwgMUMgMDAgICAgICAgICAgICAgICAgICAgfCB1aW50MTZfdCAgICB8IDB4MDAxQyAoMjgpICAgICAgICAgICAgICAgICAgICAgICAgfCBzaXplIG9mIHJlZmVycmluZyB0YWJsZQorICArMHgwOTVFIHwgMDQgMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgICB8IDB4MDAwNCAoNCkgICAgICAgICAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYG5hbWVgIChpZDogMCkKKyAgKzB4MDk2MCB8IDA4IDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgfCAweDAwMDggKDgpICAgICAgICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGB2YWx1ZXNgIChpZDogMSkKKyAgKzB4MDk2MiB8IDAwIDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgfCAweDAwMDAgKDApICAgICAgICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBpc191bmlvbmAgKGlkOiAyKSA8ZGVmYXVsdHMgdG8gMD4gKEJvb2wpCisgICsweDA5NjQgfCAwQyAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgIHwgMHgwMDBDICgxMikgICAgICAgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgdW5kZXJseWluZ190eXBlYCAoaWQ6IDMpCisgICsweDA5NjYgfCAxMCAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgIHwgMHgwMDEwICgxNikgICAgICAgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgYXR0cmlidXRlc2AgKGlkOiA0KQorICArMHgwOTY4IHwgMTQgMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgICB8IDB4MDAxNCAoMjApICAgICAgICAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYGRvY3VtZW50YXRpb25gIChpZDogNSkKKyAgKzB4MDk2QSB8IDE4IDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgfCAweDAwMTggKDI0KSAgICAgICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBkZWNsYXJhdGlvbl9maWxlYCAoaWQ6IDYpCisKK3RhYmxlIChyZWZsZWN0aW9uLkVudW0pOgorICArMHgwOTZDIHwgMTIgMDAgMDAgMDAgICAgICAgICAgICAgfCBTT2Zmc2V0MzIgICB8IDB4MDAwMDAwMTIgKDE4KSBMb2M6ICsweDA5NUEgICAgICAgfCBvZmZzZXQgdG8gdnRhYmxlCisgICsweDA5NzAgfCA5QyAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDA5QyAoMTU2KSBMb2M6ICsweDBBMEMgICAgICB8IG9mZnNldCB0byBmaWVsZCBgbmFtZWAgKHN0cmluZykKKyAgKzB4MDk3NCB8IDg4IDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMDg4ICgxMzYpIExvYzogKzB4MDlGQyAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGB2YWx1ZXNgICh2ZWN0b3IpCisgICsweDA5NzggfCA3MCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDA3MCAoMTEyKSBMb2M6ICsweDA5RTggICAgICB8IG9mZnNldCB0byBmaWVsZCBgdW5kZXJseWluZ190eXBlYCAodGFibGUpCisgICsweDA5N0MgfCA0MCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDA0MCAoNjQpIExvYzogKzB4MDlCQyAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgYXR0cmlidXRlc2AgKHZlY3RvcikKKyAgKzB4MDk4MCB8IDA4IDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMDA4ICg4KSBMb2M6ICsweDA5ODggICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBkb2N1bWVudGF0aW9uYCAodmVjdG9yKQorICArMHgwOTg0IHwgREMgMkQgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDJEREMgKDExNzQwKSBMb2M6ICsweDM3NjAgICAgfCBvZmZzZXQgdG8gZmllbGQgYGRlY2xhcmF0aW9uX2ZpbGVgIChzdHJpbmcpCisKK3ZlY3RvciAocmVmbGVjdGlvbi5FbnVtLmRvY3VtZW50YXRpb24pOgorICArMHgwOTg4IHwgMDEgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICB8IDB4MDAwMDAwMDEgKDEpICAgICAgICAgICAgICAgICAgICAgfCBsZW5ndGggb2YgdmVjdG9yICgjIGl0ZW1zKQorICArMHgwOThDIHwgMDQgMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDAwMDQgKDQpIExvYzogKzB4MDk5MCAgICAgICAgfCBvZmZzZXQgdG8gc3RyaW5nWzBdCisKK3N0cmluZyAocmVmbGVjdGlvbi5FbnVtLmRvY3VtZW50YXRpb24pOgorICArMHgwOTkwIHwgMjcgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICB8IDB4MDAwMDAwMjcgKDM5KSAgICAgICAgICAgICAgICAgICAgfCBsZW5ndGggb2Ygc3RyaW5nCisgICsweDA5OTQgfCAyMCA0MyA2RiA2RCA3MCA2RiA3MyA2OSB8IGNoYXJbMzldICAgIHwgIENvbXBvc2kgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHN0cmluZyBsaXRlcmFsCisgICsweDA5OUMgfCA3NCA2NSAyMCA2MyA2RiA2RCA3MCA2RiB8ICAgICAgICAgICAgIHwgdGUgY29tcG8KKyAgKzB4MDlBNCB8IDZFIDY1IDZFIDc0IDczIDIwIDZGIDY2IHwgICAgICAgICAgICAgfCBuZW50cyBvZgorICArMHgwOUFDIHwgMjAgNEQgNkYgNkUgNzMgNzQgNjUgNzIgfCAgICAgICAgICAgICB8ICBNb25zdGVyCisgICsweDA5QjQgfCAyMCA2MyA2RiA2QyA2RiA3MiAyRSAgICB8ICAgICAgICAgICAgIHwgIGNvbG9yLgorICArMHgwOUJCIHwgMDAgICAgICAgICAgICAgICAgICAgICAgfCBjaGFyICAgICAgICB8IDB4MDAgKDApICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJpbmcgdGVybWluYXRvcgorCit2ZWN0b3IgKHJlZmxlY3Rpb24uRW51bS5hdHRyaWJ1dGVzKToKKyAgKzB4MDlCQyB8IDAxIDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgfCAweDAwMDAwMDAxICgxKSAgICAgICAgICAgICAgICAgICAgIHwgbGVuZ3RoIG9mIHZlY3RvciAoIyBpdGVtcykKKyAgKzB4MDlDMCB8IDA0IDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMDA0ICg0KSBMb2M6ICsweDA5QzQgICAgICAgIHwgb2Zmc2V0IHRvIHRhYmxlWzBdCisKK3RhYmxlIChyZWZsZWN0aW9uLktleVZhbHVlKToKKyAgKzB4MDlDNCB8IDYwIEQ0IEZGIEZGICAgICAgICAgICAgIHwgU09mZnNldDMyICAgfCAweEZGRkZENDYwICgtMTExNjgpIExvYzogKzB4MzU2NCAgIHwgb2Zmc2V0IHRvIHZ0YWJsZQorICArMHgwOUM4IHwgMTAgMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDAwMTAgKDE2KSBMb2M6ICsweDA5RDggICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYGtleWAgKHN0cmluZykKKyAgKzB4MDlDQyB8IDA0IDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMDA0ICg0KSBMb2M6ICsweDA5RDAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGB2YWx1ZWAgKHN0cmluZykKKworc3RyaW5nIChyZWZsZWN0aW9uLktleVZhbHVlLnZhbHVlKToKKyAgKzB4MDlEMCB8IDAxIDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgfCAweDAwMDAwMDAxICgxKSAgICAgICAgICAgICAgICAgICAgIHwgbGVuZ3RoIG9mIHN0cmluZworICArMHgwOUQ0IHwgMzAgICAgICAgICAgICAgICAgICAgICAgfCBjaGFyWzFdICAgICB8IDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJpbmcgbGl0ZXJhbAorICArMHgwOUQ1IHwgMDAgICAgICAgICAgICAgICAgICAgICAgfCBjaGFyICAgICAgICB8IDB4MDAgKDApICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJpbmcgdGVybWluYXRvcgorCitwYWRkaW5nOgorICArMHgwOUQ2IHwgMDAgMDAgICAgICAgICAgICAgICAgICAgfCB1aW50OF90WzJdICB8IC4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBwYWRkaW5nCisKK3N0cmluZyAocmVmbGVjdGlvbi5LZXlWYWx1ZS5rZXkpOgorICArMHgwOUQ4IHwgMDkgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICB8IDB4MDAwMDAwMDkgKDkpICAgICAgICAgICAgICAgICAgICAgfCBsZW5ndGggb2Ygc3RyaW5nCisgICsweDA5REMgfCA2MiA2OSA3NCA1RiA2NiA2QyA2MSA2NyB8IGNoYXJbOV0gICAgIHwgYml0X2ZsYWcgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHN0cmluZyBsaXRlcmFsCisgICsweDA5RTQgfCA3MyAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgIHwgcworICArMHgwOUU1IHwgMDAgICAgICAgICAgICAgICAgICAgICAgfCBjaGFyICAgICAgICB8IDB4MDAgKDApICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJpbmcgdGVybWluYXRvcgorCitwYWRkaW5nOgorICArMHgwOUU2IHwgMDAgMDAgICAgICAgICAgICAgICAgICAgfCB1aW50OF90WzJdICB8IC4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBwYWRkaW5nCisKK3RhYmxlIChyZWZsZWN0aW9uLlR5cGUpOgorICArMHgwOUU4IHwgRTQgRDMgRkYgRkYgICAgICAgICAgICAgfCBTT2Zmc2V0MzIgICB8IDB4RkZGRkQzRTQgKC0xMTI5MikgTG9jOiArMHgzNjA0ICAgfCBvZmZzZXQgdG8gdnRhYmxlCisgICsweDA5RUMgfCAwMCAwMCAwMCAgICAgICAgICAgICAgICB8IHVpbnQ4X3RbM10gIHwgLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHBhZGRpbmcKKyAgKzB4MDlFRiB8IDA0ICAgICAgICAgICAgICAgICAgICAgIHwgdWludDhfdCAgICAgfCAweDA0ICg0KSAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgdGFibGUgZmllbGQgYGJhc2VfdHlwZWAgKEJ5dGUpCisgICsweDA5RjAgfCAwMyAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgIHwgMHgwMDAwMDAwMyAoMykgICAgICAgICAgICAgICAgICAgICB8IHRhYmxlIGZpZWxkIGBpbmRleGAgKEludCkKKyAgKzB4MDlGNCB8IDAxIDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgfCAweDAwMDAwMDAxICgxKSAgICAgICAgICAgICAgICAgICAgIHwgdGFibGUgZmllbGQgYGJhc2Vfc2l6ZWAgKFVJbnQpCisgICsweDA5RjggfCAwMSAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgIHwgMHgwMDAwMDAwMSAoMSkgICAgICAgICAgICAgICAgICAgICB8IHRhYmxlIGZpZWxkIGBlbGVtZW50X3NpemVgIChVSW50KQorCit2ZWN0b3IgKHJlZmxlY3Rpb24uRW51bS52YWx1ZXMpOgorICArMHgwOUZDIHwgMDMgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICB8IDB4MDAwMDAwMDMgKDMpICAgICAgICAgICAgICAgICAgICAgfCBsZW5ndGggb2YgdmVjdG9yICgjIGl0ZW1zKQorICArMHgwQTAwIHwgMTggMDEgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDAxMTggKDI4MCkgTG9jOiArMHgwQjE4ICAgICAgfCBvZmZzZXQgdG8gdGFibGVbMF0KKyAgKzB4MEEwNCB8IDg0IDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMDg0ICgxMzIpIExvYzogKzB4MEE4OCAgICAgIHwgb2Zmc2V0IHRvIHRhYmxlWzFdCisgICsweDBBMDggfCAyMCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDAyMCAoMzIpIExvYzogKzB4MEEyOCAgICAgICB8IG9mZnNldCB0byB0YWJsZVsyXQorCitzdHJpbmcgKHJlZmxlY3Rpb24uRW51bS5uYW1lKToKKyAgKzB4MEEwQyB8IDE0IDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgfCAweDAwMDAwMDE0ICgyMCkgICAgICAgICAgICAgICAgICAgIHwgbGVuZ3RoIG9mIHN0cmluZworICArMHgwQTEwIHwgNEQgNzkgNDcgNjEgNkQgNjUgMkUgNDUgfCBjaGFyWzIwXSAgICB8IE15R2FtZS5FICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJpbmcgbGl0ZXJhbAorICArMHgwQTE4IHwgNzggNjEgNkQgNzAgNkMgNjUgMkUgNDMgfCAgICAgICAgICAgICB8IHhhbXBsZS5DCisgICsweDBBMjAgfCA2RiA2QyA2RiA3MiAgICAgICAgICAgICB8ICAgICAgICAgICAgIHwgb2xvcgorICArMHgwQTI0IHwgMDAgICAgICAgICAgICAgICAgICAgICAgfCBjaGFyICAgICAgICB8IDB4MDAgKDApICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJpbmcgdGVybWluYXRvcgorCitwYWRkaW5nOgorICArMHgwQTI1IHwgMDAgMDAgMDAgICAgICAgICAgICAgICAgfCB1aW50OF90WzNdICB8IC4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBwYWRkaW5nCisKK3RhYmxlIChyZWZsZWN0aW9uLkVudW1WYWwpOgorICArMHgwQTI4IHwgMUUgRkYgRkYgRkYgICAgICAgICAgICAgfCBTT2Zmc2V0MzIgICB8IDB4RkZGRkZGMUUgKC0yMjYpIExvYzogKzB4MEIwQSAgICAgfCBvZmZzZXQgdG8gdnRhYmxlCisgICsweDBBMkMgfCA1MCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDA1MCAoODApIExvYzogKzB4MEE3QyAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgbmFtZWAgKHN0cmluZykKKyAgKzB4MEEzMCB8IDQwIDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMDQwICg2NCkgTG9jOiArMHgwQTcwICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGB1bmlvbl90eXBlYCAodGFibGUpCisgICsweDBBMzQgfCAxMCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDAxMCAoMTYpIExvYzogKzB4MEE0NCAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgZG9jdW1lbnRhdGlvbmAgKHZlY3RvcikKKyAgKzB4MEEzOCB8IDA4IDAwIDAwIDAwIDAwIDAwIDAwIDAwIHwgaW50NjRfdCAgICAgfCAweDAwMDAwMDAwMDAwMDAwMDggKDgpICAgICAgICAgICAgIHwgdGFibGUgZmllbGQgYHZhbHVlYCAoTG9uZykKKyAgKzB4MEE0MCB8IDAwIDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDhfdFs0XSAgfCAuLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgcGFkZGluZworCit2ZWN0b3IgKHJlZmxlY3Rpb24uRW51bVZhbC5kb2N1bWVudGF0aW9uKToKKyAgKzB4MEE0NCB8IDAxIDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgfCAweDAwMDAwMDAxICgxKSAgICAgICAgICAgICAgICAgICAgIHwgbGVuZ3RoIG9mIHZlY3RvciAoIyBpdGVtcykKKyAgKzB4MEE0OCB8IDA0IDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMDA0ICg0KSBMb2M6ICsweDBBNEMgICAgICAgIHwgb2Zmc2V0IHRvIHN0cmluZ1swXQorCitzdHJpbmcgKHJlZmxlY3Rpb24uRW51bVZhbC5kb2N1bWVudGF0aW9uKToKKyAgKzB4MEE0QyB8IDFDIDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgfCAweDAwMDAwMDFDICgyOCkgICAgICAgICAgICAgICAgICAgIHwgbGVuZ3RoIG9mIHN0cmluZworICArMHgwQTUwIHwgMjAgNUMgNjIgNzIgNjkgNjUgNjYgMjAgfCBjaGFyWzI4XSAgICB8ICBcYnJpZWYgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJpbmcgbGl0ZXJhbAorICArMHgwQTU4IHwgNjMgNkYgNkMgNkYgNzIgMjAgNDIgNkMgfCAgICAgICAgICAgICB8IGNvbG9yIEJsCisgICsweDBBNjAgfCA3NSA2NSAyMCAyOCAzMSA3NSAyMCAzQyB8ICAgICAgICAgICAgIHwgdWUgKDF1IDwKKyAgKzB4MEE2OCB8IDNDIDIwIDMzIDI5ICAgICAgICAgICAgIHwgICAgICAgICAgICAgfCA8IDMpCisgICsweDBBNkMgfCAwMCAgICAgICAgICAgICAgICAgICAgICB8IGNoYXIgICAgICAgIHwgMHgwMCAoMCkgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHN0cmluZyB0ZXJtaW5hdG9yCisKK3BhZGRpbmc6CisgICsweDBBNkQgfCAwMCAwMCAwMCAgICAgICAgICAgICAgICB8IHVpbnQ4X3RbM10gIHwgLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHBhZGRpbmcKKwordGFibGUgKHJlZmxlY3Rpb24uVHlwZSk6CisgICsweDBBNzAgfCA5MCBGRSBGRiBGRiAgICAgICAgICAgICB8IFNPZmZzZXQzMiAgIHwgMHhGRkZGRkU5MCAoLTM2OCkgTG9jOiArMHgwQkUwICAgICB8IG9mZnNldCB0byB2dGFibGUKKyAgKzB4MEE3NCB8IDAxIDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgfCAweDAwMDAwMDAxICgxKSAgICAgICAgICAgICAgICAgICAgIHwgdGFibGUgZmllbGQgYGJhc2Vfc2l6ZWAgKFVJbnQpCisgICsweDBBNzggfCAwMSAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgIHwgMHgwMDAwMDAwMSAoMSkgICAgICAgICAgICAgICAgICAgICB8IHRhYmxlIGZpZWxkIGBlbGVtZW50X3NpemVgIChVSW50KQorCitzdHJpbmcgKHJlZmxlY3Rpb24uRW51bVZhbC5uYW1lKToKKyAgKzB4MEE3QyB8IDA0IDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgfCAweDAwMDAwMDA0ICg0KSAgICAgICAgICAgICAgICAgICAgIHwgbGVuZ3RoIG9mIHN0cmluZworICArMHgwQTgwIHwgNDIgNkMgNzUgNjUgICAgICAgICAgICAgfCBjaGFyWzRdICAgICB8IEJsdWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJpbmcgbGl0ZXJhbAorICArMHgwQTg0IHwgMDAgICAgICAgICAgICAgICAgICAgICAgfCBjaGFyICAgICAgICB8IDB4MDAgKDApICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJpbmcgdGVybWluYXRvcgorCitwYWRkaW5nOgorICArMHgwQTg1IHwgMDAgMDAgMDAgICAgICAgICAgICAgICAgfCB1aW50OF90WzNdICB8IC4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBwYWRkaW5nCisKK3RhYmxlIChyZWZsZWN0aW9uLkVudW1WYWwpOgorICArMHgwQTg4IHwgN0UgRkYgRkYgRkYgICAgICAgICAgICAgfCBTT2Zmc2V0MzIgICB8IDB4RkZGRkZGN0UgKC0xMzApIExvYzogKzB4MEIwQSAgICAgfCBvZmZzZXQgdG8gdnRhYmxlCisgICsweDBBOEMgfCA3NCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDA3NCAoMTE2KSBMb2M6ICsweDBCMDAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgbmFtZWAgKHN0cmluZykKKyAgKzB4MEE5MCB8IDY0IDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMDY0ICgxMDApIExvYzogKzB4MEFGNCAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGB1bmlvbl90eXBlYCAodGFibGUpCisgICsweDBBOTQgfCAxMCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDAxMCAoMTYpIExvYzogKzB4MEFBNCAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgZG9jdW1lbnRhdGlvbmAgKHZlY3RvcikKKyAgKzB4MEE5OCB8IDAyIDAwIDAwIDAwIDAwIDAwIDAwIDAwIHwgaW50NjRfdCAgICAgfCAweDAwMDAwMDAwMDAwMDAwMDIgKDIpICAgICAgICAgICAgIHwgdGFibGUgZmllbGQgYHZhbHVlYCAoTG9uZykKKyAgKzB4MEFBMCB8IDAwIDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDhfdFs0XSAgfCAuLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgcGFkZGluZworCit2ZWN0b3IgKHJlZmxlY3Rpb24uRW51bVZhbC5kb2N1bWVudGF0aW9uKToKKyAgKzB4MEFBNCB8IDAyIDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgfCAweDAwMDAwMDAyICgyKSAgICAgICAgICAgICAgICAgICAgIHwgbGVuZ3RoIG9mIHZlY3RvciAoIyBpdGVtcykKKyAgKzB4MEFBOCB8IDM0IDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMDM0ICg1MikgTG9jOiArMHgwQURDICAgICAgIHwgb2Zmc2V0IHRvIHN0cmluZ1swXQorICArMHgwQUFDIHwgMDQgMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDAwMDQgKDQpIExvYzogKzB4MEFCMCAgICAgICAgfCBvZmZzZXQgdG8gc3RyaW5nWzFdCisKK3N0cmluZyAocmVmbGVjdGlvbi5FbnVtVmFsLmRvY3VtZW50YXRpb24pOgorICArMHgwQUIwIHwgMjcgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICB8IDB4MDAwMDAwMjcgKDM5KSAgICAgICAgICAgICAgICAgICAgfCBsZW5ndGggb2Ygc3RyaW5nCisgICsweDBBQjQgfCAyMCA0NyA3MiA2NSA2NSA2RSAyMCA2OSB8IGNoYXJbMzldICAgIHwgIEdyZWVuIGkgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHN0cmluZyBsaXRlcmFsCisgICsweDBBQkMgfCA3MyAyMCA2MiA2OSA3NCA1RiA2NiA2QyB8ICAgICAgICAgICAgIHwgcyBiaXRfZmwKKyAgKzB4MEFDNCB8IDYxIDY3IDIwIDc3IDY5IDc0IDY4IDIwIHwgICAgICAgICAgICAgfCBhZyB3aXRoIAorICArMHgwQUNDIHwgNzYgNjEgNkMgNzUgNjUgMjAgMjggMzEgfCAgICAgICAgICAgICB8IHZhbHVlICgxCisgICsweDBBRDQgfCA3NSAyMCAzQyAzQyAyMCAzMSAyOSAgICB8ICAgICAgICAgICAgIHwgdSA8PCAxKQorICArMHgwQURCIHwgMDAgICAgICAgICAgICAgICAgICAgICAgfCBjaGFyICAgICAgICB8IDB4MDAgKDApICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJpbmcgdGVybWluYXRvcgorCitzdHJpbmcgKHJlZmxlY3Rpb24uRW51bVZhbC5kb2N1bWVudGF0aW9uKToKKyAgKzB4MEFEQyB8IDEzIDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgfCAweDAwMDAwMDEzICgxOSkgICAgICAgICAgICAgICAgICAgIHwgbGVuZ3RoIG9mIHN0cmluZworICArMHgwQUUwIHwgMjAgNUMgNjIgNzIgNjkgNjUgNjYgMjAgfCBjaGFyWzE5XSAgICB8ICBcYnJpZWYgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJpbmcgbGl0ZXJhbAorICArMHgwQUU4IHwgNjMgNkYgNkMgNkYgNzIgMjAgNDcgNzIgfCAgICAgICAgICAgICB8IGNvbG9yIEdyCisgICsweDBBRjAgfCA2NSA2NSA2RSAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgIHwgZWVuCisgICsweDBBRjMgfCAwMCAgICAgICAgICAgICAgICAgICAgICB8IGNoYXIgICAgICAgIHwgMHgwMCAoMCkgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHN0cmluZyB0ZXJtaW5hdG9yCisKK3RhYmxlIChyZWZsZWN0aW9uLlR5cGUpOgorICArMHgwQUY0IHwgMTQgRkYgRkYgRkYgICAgICAgICAgICAgfCBTT2Zmc2V0MzIgICB8IDB4RkZGRkZGMTQgKC0yMzYpIExvYzogKzB4MEJFMCAgICAgfCBvZmZzZXQgdG8gdnRhYmxlCisgICsweDBBRjggfCAwMSAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgIHwgMHgwMDAwMDAwMSAoMSkgICAgICAgICAgICAgICAgICAgICB8IHRhYmxlIGZpZWxkIGBiYXNlX3NpemVgIChVSW50KQorICArMHgwQUZDIHwgMDEgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICB8IDB4MDAwMDAwMDEgKDEpICAgICAgICAgICAgICAgICAgICAgfCB0YWJsZSBmaWVsZCBgZWxlbWVudF9zaXplYCAoVUludCkKKworc3RyaW5nIChyZWZsZWN0aW9uLkVudW1WYWwubmFtZSk6CisgICsweDBCMDAgfCAwNSAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgIHwgMHgwMDAwMDAwNSAoNSkgICAgICAgICAgICAgICAgICAgICB8IGxlbmd0aCBvZiBzdHJpbmcKKyAgKzB4MEIwNCB8IDQ3IDcyIDY1IDY1IDZFICAgICAgICAgIHwgY2hhcls1XSAgICAgfCBHcmVlbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nIGxpdGVyYWwKKyAgKzB4MEIwOSB8IDAwICAgICAgICAgICAgICAgICAgICAgIHwgY2hhciAgICAgICAgfCAweDAwICgwKSAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nIHRlcm1pbmF0b3IKKwordnRhYmxlIChyZWZsZWN0aW9uLkVudW1WYWwpOgorICArMHgwQjBBIHwgMEUgMDAgICAgICAgICAgICAgICAgICAgfCB1aW50MTZfdCAgICB8IDB4MDAwRSAoMTQpICAgICAgICAgICAgICAgICAgICAgICAgfCBzaXplIG9mIHRoaXMgdnRhYmxlCisgICsweDBCMEMgfCAxQyAwMCAgICAgICAgICAgICAgICAgICB8IHVpbnQxNl90ICAgIHwgMHgwMDFDICgyOCkgICAgICAgICAgICAgICAgICAgICAgICB8IHNpemUgb2YgcmVmZXJyaW5nIHRhYmxlCisgICsweDBCMEUgfCAwNCAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgIHwgMHgwMDA0ICg0KSAgICAgICAgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgbmFtZWAgKGlkOiAwKQorICArMHgwQjEwIHwgMTAgMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgICB8IDB4MDAxMCAoMTYpICAgICAgICAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYHZhbHVlYCAoaWQ6IDEpCisgICsweDBCMTIgfCAwMCAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgIHwgMHgwMDAwICgwKSAgICAgICAgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgb2JqZWN0YCAoaWQ6IDIpIDxudWxsPiAoT2JqKQorICArMHgwQjE0IHwgMDggMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgICB8IDB4MDAwOCAoOCkgICAgICAgICAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYHVuaW9uX3R5cGVgIChpZDogMykKKyAgKzB4MEIxNiB8IDBDIDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgfCAweDAwMEMgKDEyKSAgICAgICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBkb2N1bWVudGF0aW9uYCAoaWQ6IDQpCisKK3RhYmxlIChyZWZsZWN0aW9uLkVudW1WYWwpOgorICArMHgwQjE4IHwgMEUgMDAgMDAgMDAgICAgICAgICAgICAgfCBTT2Zmc2V0MzIgICB8IDB4MDAwMDAwMEUgKDE0KSBMb2M6ICsweDBCMEEgICAgICAgfCBvZmZzZXQgdG8gdnRhYmxlCisgICsweDBCMUMgfCAyOCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDAyOCAoNDApIExvYzogKzB4MEI0NCAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgbmFtZWAgKHN0cmluZykKKyAgKzB4MEIyMCB8IDE4IDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMDE4ICgyNCkgTG9jOiArMHgwQjM4ICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGB1bmlvbl90eXBlYCAodGFibGUpCisgICsweDBCMjQgfCAxMCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDAxMCAoMTYpIExvYzogKzB4MEIzNCAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgZG9jdW1lbnRhdGlvbmAgKHZlY3RvcikKKyAgKzB4MEIyOCB8IDAxIDAwIDAwIDAwIDAwIDAwIDAwIDAwIHwgaW50NjRfdCAgICAgfCAweDAwMDAwMDAwMDAwMDAwMDEgKDEpICAgICAgICAgICAgIHwgdGFibGUgZmllbGQgYHZhbHVlYCAoTG9uZykKKyAgKzB4MEIzMCB8IDAwIDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDhfdFs0XSAgfCAuLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgcGFkZGluZworCit2ZWN0b3IgKHJlZmxlY3Rpb24uRW51bVZhbC5kb2N1bWVudGF0aW9uKToKKyAgKzB4MEIzNCB8IDAwIDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgfCAweDAwMDAwMDAwICgwKSAgICAgICAgICAgICAgICAgICAgIHwgbGVuZ3RoIG9mIHZlY3RvciAoIyBpdGVtcykKKwordGFibGUgKHJlZmxlY3Rpb24uVHlwZSk6CisgICsweDBCMzggfCA1OCBGRiBGRiBGRiAgICAgICAgICAgICB8IFNPZmZzZXQzMiAgIHwgMHhGRkZGRkY1OCAoLTE2OCkgTG9jOiArMHgwQkUwICAgICB8IG9mZnNldCB0byB2dGFibGUKKyAgKzB4MEIzQyB8IDAxIDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgfCAweDAwMDAwMDAxICgxKSAgICAgICAgICAgICAgICAgICAgIHwgdGFibGUgZmllbGQgYGJhc2Vfc2l6ZWAgKFVJbnQpCisgICsweDBCNDAgfCAwMSAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgIHwgMHgwMDAwMDAwMSAoMSkgICAgICAgICAgICAgICAgICAgICB8IHRhYmxlIGZpZWxkIGBlbGVtZW50X3NpemVgIChVSW50KQorCitzdHJpbmcgKHJlZmxlY3Rpb24uRW51bVZhbC5uYW1lKToKKyAgKzB4MEI0NCB8IDAzIDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgfCAweDAwMDAwMDAzICgzKSAgICAgICAgICAgICAgICAgICAgIHwgbGVuZ3RoIG9mIHN0cmluZworICArMHgwQjQ4IHwgNTIgNjUgNjQgICAgICAgICAgICAgICAgfCBjaGFyWzNdICAgICB8IFJlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJpbmcgbGl0ZXJhbAorICArMHgwQjRCIHwgMDAgICAgICAgICAgICAgICAgICAgICAgfCBjaGFyICAgICAgICB8IDB4MDAgKDApICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJpbmcgdGVybWluYXRvcgorCitwYWRkaW5nOgorICArMHgwQjRDIHwgMDAgMDAgICAgICAgICAgICAgICAgICAgfCB1aW50OF90WzJdICB8IC4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBwYWRkaW5nCisKK3Z0YWJsZSAocmVmbGVjdGlvbi5FbnVtKToKKyAgKzB4MEI0RSB8IDEyIDAwICAgICAgICAgICAgICAgICAgIHwgdWludDE2X3QgICAgfCAweDAwMTIgKDE4KSAgICAgICAgICAgICAgICAgICAgICAgIHwgc2l6ZSBvZiB0aGlzIHZ0YWJsZQorICArMHgwQjUwIHwgMTggMDAgICAgICAgICAgICAgICAgICAgfCB1aW50MTZfdCAgICB8IDB4MDAxOCAoMjQpICAgICAgICAgICAgICAgICAgICAgICAgfCBzaXplIG9mIHJlZmVycmluZyB0YWJsZQorICArMHgwQjUyIHwgMDQgMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgICB8IDB4MDAwNCAoNCkgICAgICAgICAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYG5hbWVgIChpZDogMCkKKyAgKzB4MEI1NCB8IDA4IDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgfCAweDAwMDggKDgpICAgICAgICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGB2YWx1ZXNgIChpZDogMSkKKyAgKzB4MEI1NiB8IDAwIDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgfCAweDAwMDAgKDApICAgICAgICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBpc191bmlvbmAgKGlkOiAyKSA8ZGVmYXVsdHMgdG8gMD4gKEJvb2wpCisgICsweDBCNTggfCAwQyAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgIHwgMHgwMDBDICgxMikgICAgICAgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgdW5kZXJseWluZ190eXBlYCAoaWQ6IDMpCisgICsweDBCNUEgfCAwMCAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgIHwgMHgwMDAwICgwKSAgICAgICAgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgYXR0cmlidXRlc2AgKGlkOiA0KSA8bnVsbD4gKFZlY3RvcikKKyAgKzB4MEI1QyB8IDEwIDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgfCAweDAwMTAgKDE2KSAgICAgICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBkb2N1bWVudGF0aW9uYCAoaWQ6IDUpCisgICsweDBCNUUgfCAxNCAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgIHwgMHgwMDE0ICgyMCkgICAgICAgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgZGVjbGFyYXRpb25fZmlsZWAgKGlkOiA2KQorCit0YWJsZSAocmVmbGVjdGlvbi5FbnVtKToKKyAgKzB4MEI2MCB8IDEyIDAwIDAwIDAwICAgICAgICAgICAgIHwgU09mZnNldDMyICAgfCAweDAwMDAwMDEyICgxOCkgTG9jOiArMHgwQjRFICAgICAgIHwgb2Zmc2V0IHRvIHZ0YWJsZQorICArMHgwQjY0IHwgMzQgMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDAwMzQgKDUyKSBMb2M6ICsweDBCOTggICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYG5hbWVgIChzdHJpbmcpCisgICsweDBCNjggfCAyOCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDAyOCAoNDApIExvYzogKzB4MEI5MCAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgdmFsdWVzYCAodmVjdG9yKQorICArMHgwQjZDIHwgMTAgMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDAwMTAgKDE2KSBMb2M6ICsweDBCN0MgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYHVuZGVybHlpbmdfdHlwZWAgKHRhYmxlKQorICArMHgwQjcwIHwgMDggMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDAwMDggKDgpIExvYzogKzB4MEI3OCAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYGRvY3VtZW50YXRpb25gICh2ZWN0b3IpCisgICsweDBCNzQgfCBBMCAyRCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMkRBMCAoMTE2ODApIExvYzogKzB4MzkxNCAgICB8IG9mZnNldCB0byBmaWVsZCBgZGVjbGFyYXRpb25fZmlsZWAgKHN0cmluZykKKwordmVjdG9yIChyZWZsZWN0aW9uLkVudW0uZG9jdW1lbnRhdGlvbik6CisgICsweDBCNzggfCAwMCAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgIHwgMHgwMDAwMDAwMCAoMCkgICAgICAgICAgICAgICAgICAgICB8IGxlbmd0aCBvZiB2ZWN0b3IgKCMgaXRlbXMpCisKK3RhYmxlIChyZWZsZWN0aW9uLlR5cGUpOgorICArMHgwQjdDIHwgNzggRDUgRkYgRkYgICAgICAgICAgICAgfCBTT2Zmc2V0MzIgICB8IDB4RkZGRkQ1NzggKC0xMDg4OCkgTG9jOiArMHgzNjA0ICAgfCBvZmZzZXQgdG8gdnRhYmxlCisgICsweDBCODAgfCAwMCAwMCAwMCAgICAgICAgICAgICAgICB8IHVpbnQ4X3RbM10gIHwgLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHBhZGRpbmcKKyAgKzB4MEI4MyB8IDA5ICAgICAgICAgICAgICAgICAgICAgIHwgdWludDhfdCAgICAgfCAweDA5ICg5KSAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgdGFibGUgZmllbGQgYGJhc2VfdHlwZWAgKEJ5dGUpCisgICsweDBCODQgfCAwNiAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgIHwgMHgwMDAwMDAwNiAoNikgICAgICAgICAgICAgICAgICAgICB8IHRhYmxlIGZpZWxkIGBpbmRleGAgKEludCkKKyAgKzB4MEI4OCB8IDA4IDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgfCAweDAwMDAwMDA4ICg4KSAgICAgICAgICAgICAgICAgICAgIHwgdGFibGUgZmllbGQgYGJhc2Vfc2l6ZWAgKFVJbnQpCisgICsweDBCOEMgfCAwMSAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgIHwgMHgwMDAwMDAwMSAoMSkgICAgICAgICAgICAgICAgICAgICB8IHRhYmxlIGZpZWxkIGBlbGVtZW50X3NpemVgIChVSW50KQorCit2ZWN0b3IgKHJlZmxlY3Rpb24uRW51bS52YWx1ZXMpOgorICArMHgwQjkwIHwgMDEgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICB8IDB4MDAwMDAwMDEgKDEpICAgICAgICAgICAgICAgICAgICAgfCBsZW5ndGggb2YgdmVjdG9yICgjIGl0ZW1zKQorICArMHgwQjk0IHwgMzggMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDAwMzggKDU2KSBMb2M6ICsweDBCQ0MgICAgICAgfCBvZmZzZXQgdG8gdGFibGVbMF0KKworc3RyaW5nIChyZWZsZWN0aW9uLkVudW0ubmFtZSk6CisgICsweDBCOTggfCAyMSAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgIHwgMHgwMDAwMDAyMSAoMzMpICAgICAgICAgICAgICAgICAgICB8IGxlbmd0aCBvZiBzdHJpbmcKKyAgKzB4MEI5QyB8IDREIDc5IDQ3IDYxIDZEIDY1IDJFIDRGIHwgY2hhclszM10gICAgfCBNeUdhbWUuTyAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nIGxpdGVyYWwKKyAgKzB4MEJBNCB8IDc0IDY4IDY1IDcyIDRFIDYxIDZEIDY1IHwgICAgICAgICAgICAgfCB0aGVyTmFtZQorICArMHgwQkFDIHwgNTMgNzAgNjEgNjMgNjUgMkUgNDYgNzIgfCAgICAgICAgICAgICB8IFNwYWNlLkZyCisgICsweDBCQjQgfCA2RiA2RCA0OSA2RSA2MyA2QyA3NSA2NCB8ICAgICAgICAgICAgIHwgb21JbmNsdWQKKyAgKzB4MEJCQyB8IDY1ICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgfCBlCisgICsweDBCQkQgfCAwMCAgICAgICAgICAgICAgICAgICAgICB8IGNoYXIgICAgICAgIHwgMHgwMCAoMCkgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHN0cmluZyB0ZXJtaW5hdG9yCisKK3Z0YWJsZSAocmVmbGVjdGlvbi5FbnVtVmFsKToKKyAgKzB4MEJCRSB8IDBFIDAwICAgICAgICAgICAgICAgICAgIHwgdWludDE2X3QgICAgfCAweDAwMEUgKDE0KSAgICAgICAgICAgICAgICAgICAgICAgIHwgc2l6ZSBvZiB0aGlzIHZ0YWJsZQorICArMHgwQkMwIHwgMTAgMDAgICAgICAgICAgICAgICAgICAgfCB1aW50MTZfdCAgICB8IDB4MDAxMCAoMTYpICAgICAgICAgICAgICAgICAgICAgICAgfCBzaXplIG9mIHJlZmVycmluZyB0YWJsZQorICArMHgwQkMyIHwgMDQgMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgICB8IDB4MDAwNCAoNCkgICAgICAgICAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYG5hbWVgIChpZDogMCkKKyAgKzB4MEJDNCB8IDAwIDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgfCAweDAwMDAgKDApICAgICAgICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGB2YWx1ZWAgKGlkOiAxKSA8ZGVmYXVsdHMgdG8gMD4gKExvbmcpCisgICsweDBCQzYgfCAwMCAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgIHwgMHgwMDAwICgwKSAgICAgICAgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgb2JqZWN0YCAoaWQ6IDIpIDxudWxsPiAoT2JqKQorICArMHgwQkM4IHwgMDggMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgICB8IDB4MDAwOCAoOCkgICAgICAgICAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYHVuaW9uX3R5cGVgIChpZDogMykKKyAgKzB4MEJDQSB8IDBDIDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgfCAweDAwMEMgKDEyKSAgICAgICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBkb2N1bWVudGF0aW9uYCAoaWQ6IDQpCisKK3RhYmxlIChyZWZsZWN0aW9uLkVudW1WYWwpOgorICArMHgwQkNDIHwgMEUgMDAgMDAgMDAgICAgICAgICAgICAgfCBTT2Zmc2V0MzIgICB8IDB4MDAwMDAwMEUgKDE0KSBMb2M6ICsweDBCQkUgICAgICAgfCBvZmZzZXQgdG8gdnRhYmxlCisgICsweDBCRDAgfCAyQyAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDAyQyAoNDQpIExvYzogKzB4MEJGQyAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgbmFtZWAgKHN0cmluZykKKyAgKzB4MEJENCB8IDFDIDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMDFDICgyOCkgTG9jOiArMHgwQkYwICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGB1bmlvbl90eXBlYCAodGFibGUpCisgICsweDBCRDggfCAwNCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDAwNCAoNCkgTG9jOiArMHgwQkRDICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgZG9jdW1lbnRhdGlvbmAgKHZlY3RvcikKKwordmVjdG9yIChyZWZsZWN0aW9uLkVudW1WYWwuZG9jdW1lbnRhdGlvbik6CisgICsweDBCREMgfCAwMCAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgIHwgMHgwMDAwMDAwMCAoMCkgICAgICAgICAgICAgICAgICAgICB8IGxlbmd0aCBvZiB2ZWN0b3IgKCMgaXRlbXMpCisKK3Z0YWJsZSAocmVmbGVjdGlvbi5UeXBlKToKKyAgKzB4MEJFMCB8IDEwIDAwICAgICAgICAgICAgICAgICAgIHwgdWludDE2X3QgICAgfCAweDAwMTAgKDE2KSAgICAgICAgICAgICAgICAgICAgICAgIHwgc2l6ZSBvZiB0aGlzIHZ0YWJsZQorICArMHgwQkUyIHwgMEMgMDAgICAgICAgICAgICAgICAgICAgfCB1aW50MTZfdCAgICB8IDB4MDAwQyAoMTIpICAgICAgICAgICAgICAgICAgICAgICAgfCBzaXplIG9mIHJlZmVycmluZyB0YWJsZQorICArMHgwQkU0IHwgMDAgMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgICB8IDB4MDAwMCAoMCkgICAgICAgICAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYGJhc2VfdHlwZWAgKGlkOiAwKSA8ZGVmYXVsdHMgdG8gMD4gKEJ5dGUpCisgICsweDBCRTYgfCAwMCAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgIHwgMHgwMDAwICgwKSAgICAgICAgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgZWxlbWVudGAgKGlkOiAxKSA8ZGVmYXVsdHMgdG8gMD4gKEJ5dGUpCisgICsweDBCRTggfCAwMCAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgIHwgMHgwMDAwICgwKSAgICAgICAgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgaW5kZXhgIChpZDogMikgPGRlZmF1bHRzIHRvIC0xPiAoSW50KQorICArMHgwQkVBIHwgMDAgMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgICB8IDB4MDAwMCAoMCkgICAgICAgICAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYGZpeGVkX2xlbmd0aGAgKGlkOiAzKSA8ZGVmYXVsdHMgdG8gMD4gKFVTaG9ydCkKKyAgKzB4MEJFQyB8IDA0IDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgfCAweDAwMDQgKDQpICAgICAgICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBiYXNlX3NpemVgIChpZDogNCkKKyAgKzB4MEJFRSB8IDA4IDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgfCAweDAwMDggKDgpICAgICAgICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBlbGVtZW50X3NpemVgIChpZDogNSkKKwordGFibGUgKHJlZmxlY3Rpb24uVHlwZSk6CisgICsweDBCRjAgfCAxMCAwMCAwMCAwMCAgICAgICAgICAgICB8IFNPZmZzZXQzMiAgIHwgMHgwMDAwMDAxMCAoMTYpIExvYzogKzB4MEJFMCAgICAgICB8IG9mZnNldCB0byB2dGFibGUKKyAgKzB4MEJGNCB8IDAxIDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgfCAweDAwMDAwMDAxICgxKSAgICAgICAgICAgICAgICAgICAgIHwgdGFibGUgZmllbGQgYGJhc2Vfc2l6ZWAgKFVJbnQpCisgICsweDBCRjggfCAwMSAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgIHwgMHgwMDAwMDAwMSAoMSkgICAgICAgICAgICAgICAgICAgICB8IHRhYmxlIGZpZWxkIGBlbGVtZW50X3NpemVgIChVSW50KQorCitzdHJpbmcgKHJlZmxlY3Rpb24uRW51bVZhbC5uYW1lKToKKyAgKzB4MEJGQyB8IDBBIDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgfCAweDAwMDAwMDBBICgxMCkgICAgICAgICAgICAgICAgICAgIHwgbGVuZ3RoIG9mIHN0cmluZworICArMHgwQzAwIHwgNDkgNkUgNjMgNkMgNzUgNjQgNjUgNTYgfCBjaGFyWzEwXSAgICB8IEluY2x1ZGVWICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJpbmcgbGl0ZXJhbAorICArMHgwQzA4IHwgNjEgNkMgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICB8IGFsCisgICsweDBDMEEgfCAwMCAgICAgICAgICAgICAgICAgICAgICB8IGNoYXIgICAgICAgIHwgMHgwMCAoMCkgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHN0cmluZyB0ZXJtaW5hdG9yCisKK3RhYmxlIChyZWZsZWN0aW9uLk9iamVjdCk6CisgICsweDBDMEMgfCBFNCBEMyBGRiBGRiAgICAgICAgICAgICB8IFNPZmZzZXQzMiAgIHwgMHhGRkZGRDNFNCAoLTExMjkyKSBMb2M6ICsweDM4MjggICB8IG9mZnNldCB0byB2dGFibGUKKyAgKzB4MEMxMCB8IDRDIDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMDRDICg3NikgTG9jOiArMHgwQzVDICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBuYW1lYCAoc3RyaW5nKQorICArMHgwQzE0IHwgMTQgMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDAwMTQgKDIwKSBMb2M6ICsweDBDMjggICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYGZpZWxkc2AgKHZlY3RvcikKKyAgKzB4MEMxOCB8IDAxIDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgfCAweDAwMDAwMDAxICgxKSAgICAgICAgICAgICAgICAgICAgIHwgdGFibGUgZmllbGQgYG1pbmFsaWduYCAoSW50KQorICArMHgwQzFDIHwgMDggMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDAwMDggKDgpIExvYzogKzB4MEMyNCAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYGRvY3VtZW50YXRpb25gICh2ZWN0b3IpCisgICsweDBDMjAgfCA0MCAyQiAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMkI0MCAoMTEwNzIpIExvYzogKzB4Mzc2MCAgICB8IG9mZnNldCB0byBmaWVsZCBgZGVjbGFyYXRpb25fZmlsZWAgKHN0cmluZykKKwordmVjdG9yIChyZWZsZWN0aW9uLk9iamVjdC5kb2N1bWVudGF0aW9uKToKKyAgKzB4MEMyNCB8IDAwIDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgfCAweDAwMDAwMDAwICgwKSAgICAgICAgICAgICAgICAgICAgIHwgbGVuZ3RoIG9mIHZlY3RvciAoIyBpdGVtcykKKwordmVjdG9yIChyZWZsZWN0aW9uLk9iamVjdC5maWVsZHMpOgorICArMHgwQzI4IHwgMEMgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICB8IDB4MDAwMDAwMEMgKDEyKSAgICAgICAgICAgICAgICAgICAgfCBsZW5ndGggb2YgdmVjdG9yICgjIGl0ZW1zKQorICArMHgwQzJDIHwgRTQgMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDAwRTQgKDIyOCkgTG9jOiArMHgwRDEwICAgICAgfCBvZmZzZXQgdG8gdGFibGVbMF0KKyAgKzB4MEMzMCB8IEIwIDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMEIwICgxNzYpIExvYzogKzB4MENFMCAgICAgIHwgb2Zmc2V0IHRvIHRhYmxlWzFdCisgICsweDBDMzQgfCBGMCAwMSAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDFGMCAoNDk2KSBMb2M6ICsweDBFMjQgICAgICB8IG9mZnNldCB0byB0YWJsZVsyXQorICArMHgwQzM4IHwgOTAgMDEgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDAxOTAgKDQwMCkgTG9jOiArMHgwREM4ICAgICAgfCBvZmZzZXQgdG8gdGFibGVbM10KKyAgKzB4MEMzQyB8IDMwIDAxIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMTMwICgzMDQpIExvYzogKzB4MEQ2QyAgICAgIHwgb2Zmc2V0IHRvIHRhYmxlWzRdCisgICsweDBDNDAgfCA2MCAwMiAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDI2MCAoNjA4KSBMb2M6ICsweDBFQTAgICAgICB8IG9mZnNldCB0byB0YWJsZVs1XQorICArMHgwQzQ0IHwgQjAgMDEgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDAxQjAgKDQzMikgTG9jOiArMHgwREY0ICAgICAgfCBvZmZzZXQgdG8gdGFibGVbNl0KKyAgKzB4MEM0OCB8IDU0IDAxIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMTU0ICgzNDApIExvYzogKzB4MEQ5QyAgICAgIHwgb2Zmc2V0IHRvIHRhYmxlWzddCisgICsweDBDNEMgfCBGMCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDBGMCAoMjQwKSBMb2M6ICsweDBEM0MgICAgICB8IG9mZnNldCB0byB0YWJsZVs4XQorICArMHgwQzUwIHwgMDQgMDIgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDAyMDQgKDUxNikgTG9jOiArMHgwRTU0ICAgICAgfCBvZmZzZXQgdG8gdGFibGVbOV0KKyAgKzB4MEM1NCB8IDVDIDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMDVDICg5MikgTG9jOiArMHgwQ0IwICAgICAgIHwgb2Zmc2V0IHRvIHRhYmxlWzEwXQorICArMHgwQzU4IHwgMjQgMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDAwMjQgKDM2KSBMb2M6ICsweDBDN0MgICAgICAgfCBvZmZzZXQgdG8gdGFibGVbMTFdCisKK3N0cmluZyAocmVmbGVjdGlvbi5PYmplY3QubmFtZSk6CisgICsweDBDNUMgfCAxQSAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgIHwgMHgwMDAwMDAxQSAoMjYpICAgICAgICAgICAgICAgICAgICB8IGxlbmd0aCBvZiBzdHJpbmcKKyAgKzB4MEM2MCB8IDREIDc5IDQ3IDYxIDZEIDY1IDJFIDQ1IHwgY2hhclsyNl0gICAgfCBNeUdhbWUuRSAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nIGxpdGVyYWwKKyAgKzB4MEM2OCB8IDc4IDYxIDZEIDcwIDZDIDY1IDJFIDU0IHwgICAgICAgICAgICAgfCB4YW1wbGUuVAorICArMHgwQzcwIHwgNzkgNzAgNjUgNDEgNkMgNjkgNjEgNzMgfCAgICAgICAgICAgICB8IHlwZUFsaWFzCisgICsweDBDNzggfCA2NSA3MyAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgIHwgZXMKKyAgKzB4MEM3QSB8IDAwICAgICAgICAgICAgICAgICAgICAgIHwgY2hhciAgICAgICAgfCAweDAwICgwKSAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nIHRlcm1pbmF0b3IKKwordGFibGUgKHJlZmxlY3Rpb24uRmllbGQpOgorICArMHgwQzdDIHwgMDAgREIgRkYgRkYgICAgICAgICAgICAgfCBTT2Zmc2V0MzIgICB8IDB4RkZGRkRCMDAgKC05NDcyKSBMb2M6ICsweDMxN0MgICAgfCBvZmZzZXQgdG8gdnRhYmxlCisgICsweDBDODAgfCAwMCAwMCAwMCAgICAgICAgICAgICAgICB8IHVpbnQ4X3RbM10gIHwgLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHBhZGRpbmcKKyAgKzB4MEM4MyB8IDAxICAgICAgICAgICAgICAgICAgICAgIHwgdWludDhfdCAgICAgfCAweDAxICgxKSAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgdGFibGUgZmllbGQgYG9wdGlvbmFsYCAoQm9vbCkKKyAgKzB4MEM4NCB8IDBCIDAwICAgICAgICAgICAgICAgICAgIHwgdWludDE2X3QgICAgfCAweDAwMEIgKDExKSAgICAgICAgICAgICAgICAgICAgICAgIHwgdGFibGUgZmllbGQgYGlkYCAoVVNob3J0KQorICArMHgwQzg2IHwgMUEgMDAgICAgICAgICAgICAgICAgICAgfCB1aW50MTZfdCAgICB8IDB4MDAxQSAoMjYpICAgICAgICAgICAgICAgICAgICAgICAgfCB0YWJsZSBmaWVsZCBgb2Zmc2V0YCAoVVNob3J0KQorICArMHgwQzg4IHwgMUMgMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDAwMUMgKDI4KSBMb2M6ICsweDBDQTQgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYG5hbWVgIChzdHJpbmcpCisgICsweDBDOEMgfCAwQyAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDAwQyAoMTIpIExvYzogKzB4MEM5OCAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgdHlwZWAgKHRhYmxlKQorICArMHgwQzkwIHwgMDQgMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDAwMDQgKDQpIExvYzogKzB4MEM5NCAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYGRvY3VtZW50YXRpb25gICh2ZWN0b3IpCisKK3ZlY3RvciAocmVmbGVjdGlvbi5GaWVsZC5kb2N1bWVudGF0aW9uKToKKyAgKzB4MEM5NCB8IDAwIDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgfCAweDAwMDAwMDAwICgwKSAgICAgICAgICAgICAgICAgICAgIHwgbGVuZ3RoIG9mIHZlY3RvciAoIyBpdGVtcykKKwordGFibGUgKHJlZmxlY3Rpb24uVHlwZSk6CisgICsweDBDOTggfCAxNCBFMSBGRiBGRiAgICAgICAgICAgICB8IFNPZmZzZXQzMiAgIHwgMHhGRkZGRTExNCAoLTc5MTYpIExvYzogKzB4MkI4NCAgICB8IG9mZnNldCB0byB2dGFibGUKKyAgKzB4MEM5QyB8IDAwIDAwICAgICAgICAgICAgICAgICAgIHwgdWludDhfdFsyXSAgfCAuLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgcGFkZGluZworICArMHgwQzlFIHwgMEUgICAgICAgICAgICAgICAgICAgICAgfCB1aW50OF90ICAgICB8IDB4MEUgKDE0KSAgICAgICAgICAgICAgICAgICAgICAgICAgfCB0YWJsZSBmaWVsZCBgYmFzZV90eXBlYCAoQnl0ZSkKKyAgKzB4MEM5RiB8IDBDICAgICAgICAgICAgICAgICAgICAgIHwgdWludDhfdCAgICAgfCAweDBDICgxMikgICAgICAgICAgICAgICAgICAgICAgICAgIHwgdGFibGUgZmllbGQgYGVsZW1lbnRgIChCeXRlKQorICArMHgwQ0EwIHwgMDggMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICB8IDB4MDAwMDAwMDggKDgpICAgICAgICAgICAgICAgICAgICAgfCB0YWJsZSBmaWVsZCBgZWxlbWVudF9zaXplYCAoVUludCkKKworc3RyaW5nIChyZWZsZWN0aW9uLkZpZWxkLm5hbWUpOgorICArMHgwQ0E0IHwgMDQgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICB8IDB4MDAwMDAwMDQgKDQpICAgICAgICAgICAgICAgICAgICAgfCBsZW5ndGggb2Ygc3RyaW5nCisgICsweDBDQTggfCA3NiA2NiAzNiAzNCAgICAgICAgICAgICB8IGNoYXJbNF0gICAgIHwgdmY2NCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHN0cmluZyBsaXRlcmFsCisgICsweDBDQUMgfCAwMCAgICAgICAgICAgICAgICAgICAgICB8IGNoYXIgICAgICAgIHwgMHgwMCAoMCkgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHN0cmluZyB0ZXJtaW5hdG9yCisKK3BhZGRpbmc6CisgICsweDBDQUQgfCAwMCAwMCAwMCAgICAgICAgICAgICAgICB8IHVpbnQ4X3RbM10gIHwgLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHBhZGRpbmcKKwordGFibGUgKHJlZmxlY3Rpb24uRmllbGQpOgorICArMHgwQ0IwIHwgMzQgREIgRkYgRkYgICAgICAgICAgICAgfCBTT2Zmc2V0MzIgICB8IDB4RkZGRkRCMzQgKC05NDIwKSBMb2M6ICsweDMxN0MgICAgfCBvZmZzZXQgdG8gdnRhYmxlCisgICsweDBDQjQgfCAwMCAwMCAwMCAgICAgICAgICAgICAgICB8IHVpbnQ4X3RbM10gIHwgLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHBhZGRpbmcKKyAgKzB4MENCNyB8IDAxICAgICAgICAgICAgICAgICAgICAgIHwgdWludDhfdCAgICAgfCAweDAxICgxKSAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgdGFibGUgZmllbGQgYG9wdGlvbmFsYCAoQm9vbCkKKyAgKzB4MENCOCB8IDBBIDAwICAgICAgICAgICAgICAgICAgIHwgdWludDE2X3QgICAgfCAweDAwMEEgKDEwKSAgICAgICAgICAgICAgICAgICAgICAgIHwgdGFibGUgZmllbGQgYGlkYCAoVVNob3J0KQorICArMHgwQ0JBIHwgMTggMDAgICAgICAgICAgICAgICAgICAgfCB1aW50MTZfdCAgICB8IDB4MDAxOCAoMjQpICAgICAgICAgICAgICAgICAgICAgICAgfCB0YWJsZSBmaWVsZCBgb2Zmc2V0YCAoVVNob3J0KQorICArMHgwQ0JDIHwgMUMgMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDAwMUMgKDI4KSBMb2M6ICsweDBDRDggICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYG5hbWVgIChzdHJpbmcpCisgICsweDBDQzAgfCAwQyAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDAwQyAoMTIpIExvYzogKzB4MENDQyAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgdHlwZWAgKHRhYmxlKQorICArMHgwQ0M0IHwgMDQgMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDAwMDQgKDQpIExvYzogKzB4MENDOCAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYGRvY3VtZW50YXRpb25gICh2ZWN0b3IpCisKK3ZlY3RvciAocmVmbGVjdGlvbi5GaWVsZC5kb2N1bWVudGF0aW9uKToKKyAgKzB4MENDOCB8IDAwIDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgfCAweDAwMDAwMDAwICgwKSAgICAgICAgICAgICAgICAgICAgIHwgbGVuZ3RoIG9mIHZlY3RvciAoIyBpdGVtcykKKwordGFibGUgKHJlZmxlY3Rpb24uVHlwZSk6CisgICsweDBDQ0MgfCA0OCBFMSBGRiBGRiAgICAgICAgICAgICB8IFNPZmZzZXQzMiAgIHwgMHhGRkZGRTE0OCAoLTc4NjQpIExvYzogKzB4MkI4NCAgICB8IG9mZnNldCB0byB2dGFibGUKKyAgKzB4MENEMCB8IDAwIDAwICAgICAgICAgICAgICAgICAgIHwgdWludDhfdFsyXSAgfCAuLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgcGFkZGluZworICArMHgwQ0QyIHwgMEUgICAgICAgICAgICAgICAgICAgICAgfCB1aW50OF90ICAgICB8IDB4MEUgKDE0KSAgICAgICAgICAgICAgICAgICAgICAgICAgfCB0YWJsZSBmaWVsZCBgYmFzZV90eXBlYCAoQnl0ZSkKKyAgKzB4MENEMyB8IDAzICAgICAgICAgICAgICAgICAgICAgIHwgdWludDhfdCAgICAgfCAweDAzICgzKSAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgdGFibGUgZmllbGQgYGVsZW1lbnRgIChCeXRlKQorICArMHgwQ0Q0IHwgMDEgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICB8IDB4MDAwMDAwMDEgKDEpICAgICAgICAgICAgICAgICAgICAgfCB0YWJsZSBmaWVsZCBgZWxlbWVudF9zaXplYCAoVUludCkKKworc3RyaW5nIChyZWZsZWN0aW9uLkZpZWxkLm5hbWUpOgorICArMHgwQ0Q4IHwgMDIgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICB8IDB4MDAwMDAwMDIgKDIpICAgICAgICAgICAgICAgICAgICAgfCBsZW5ndGggb2Ygc3RyaW5nCisgICsweDBDREMgfCA3NiAzOCAgICAgICAgICAgICAgICAgICB8IGNoYXJbMl0gICAgIHwgdjggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHN0cmluZyBsaXRlcmFsCisgICsweDBDREUgfCAwMCAgICAgICAgICAgICAgICAgICAgICB8IGNoYXIgICAgICAgIHwgMHgwMCAoMCkgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHN0cmluZyB0ZXJtaW5hdG9yCisKK3RhYmxlIChyZWZsZWN0aW9uLkZpZWxkKToKKyAgKzB4MENFMCB8IDRBIEQ4IEZGIEZGICAgICAgICAgICAgIHwgU09mZnNldDMyICAgfCAweEZGRkZEODRBICgtMTAxNjYpIExvYzogKzB4MzQ5NiAgIHwgb2Zmc2V0IHRvIHZ0YWJsZQorICArMHgwQ0U0IHwgMDkgMDAgICAgICAgICAgICAgICAgICAgfCB1aW50MTZfdCAgICB8IDB4MDAwOSAoOSkgICAgICAgICAgICAgICAgICAgICAgICAgfCB0YWJsZSBmaWVsZCBgaWRgIChVU2hvcnQpCisgICsweDBDRTYgfCAxNiAwMCAgICAgICAgICAgICAgICAgICB8IHVpbnQxNl90ICAgIHwgMHgwMDE2ICgyMikgICAgICAgICAgICAgICAgICAgICAgICB8IHRhYmxlIGZpZWxkIGBvZmZzZXRgIChVU2hvcnQpCisgICsweDBDRTggfCAyMCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDAyMCAoMzIpIExvYzogKzB4MEQwOCAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgbmFtZWAgKHN0cmluZykKKyAgKzB4MENFQyB8IDBDIDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMDBDICgxMikgTG9jOiArMHgwQ0Y4ICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGB0eXBlYCAodGFibGUpCisgICsweDBDRjAgfCAwNCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDAwNCAoNCkgTG9jOiArMHgwQ0Y0ICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgZG9jdW1lbnRhdGlvbmAgKHZlY3RvcikKKwordmVjdG9yIChyZWZsZWN0aW9uLkZpZWxkLmRvY3VtZW50YXRpb24pOgorICArMHgwQ0Y0IHwgMDAgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICB8IDB4MDAwMDAwMDAgKDApICAgICAgICAgICAgICAgICAgICAgfCBsZW5ndGggb2YgdmVjdG9yICgjIGl0ZW1zKQorCit0YWJsZSAocmVmbGVjdGlvbi5UeXBlKToKKyAgKzB4MENGOCB8IDE0IEQ2IEZGIEZGICAgICAgICAgICAgIHwgU09mZnNldDMyICAgfCAweEZGRkZENjE0ICgtMTA3MzIpIExvYzogKzB4MzZFNCAgIHwgb2Zmc2V0IHRvIHZ0YWJsZQorICArMHgwQ0ZDIHwgMDAgMDAgMDAgICAgICAgICAgICAgICAgfCB1aW50OF90WzNdICB8IC4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBwYWRkaW5nCisgICsweDBDRkYgfCAwQyAgICAgICAgICAgICAgICAgICAgICB8IHVpbnQ4X3QgICAgIHwgMHgwQyAoMTIpICAgICAgICAgICAgICAgICAgICAgICAgICB8IHRhYmxlIGZpZWxkIGBiYXNlX3R5cGVgIChCeXRlKQorICArMHgwRDAwIHwgMDggMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICB8IDB4MDAwMDAwMDggKDgpICAgICAgICAgICAgICAgICAgICAgfCB0YWJsZSBmaWVsZCBgYmFzZV9zaXplYCAoVUludCkKKyAgKzB4MEQwNCB8IDAxIDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgfCAweDAwMDAwMDAxICgxKSAgICAgICAgICAgICAgICAgICAgIHwgdGFibGUgZmllbGQgYGVsZW1lbnRfc2l6ZWAgKFVJbnQpCisKK3N0cmluZyAocmVmbGVjdGlvbi5GaWVsZC5uYW1lKToKKyAgKzB4MEQwOCB8IDAzIDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgfCAweDAwMDAwMDAzICgzKSAgICAgICAgICAgICAgICAgICAgIHwgbGVuZ3RoIG9mIHN0cmluZworICArMHgwRDBDIHwgNjYgMzYgMzQgICAgICAgICAgICAgICAgfCBjaGFyWzNdICAgICB8IGY2NCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJpbmcgbGl0ZXJhbAorICArMHgwRDBGIHwgMDAgICAgICAgICAgICAgICAgICAgICAgfCBjaGFyICAgICAgICB8IDB4MDAgKDApICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJpbmcgdGVybWluYXRvcgorCit0YWJsZSAocmVmbGVjdGlvbi5GaWVsZCk6CisgICsweDBEMTAgfCA3QSBEOCBGRiBGRiAgICAgICAgICAgICB8IFNPZmZzZXQzMiAgIHwgMHhGRkZGRDg3QSAoLTEwMTE4KSBMb2M6ICsweDM0OTYgICB8IG9mZnNldCB0byB2dGFibGUKKyAgKzB4MEQxNCB8IDA4IDAwICAgICAgICAgICAgICAgICAgIHwgdWludDE2X3QgICAgfCAweDAwMDggKDgpICAgICAgICAgICAgICAgICAgICAgICAgIHwgdGFibGUgZmllbGQgYGlkYCAoVVNob3J0KQorICArMHgwRDE2IHwgMTQgMDAgICAgICAgICAgICAgICAgICAgfCB1aW50MTZfdCAgICB8IDB4MDAxNCAoMjApICAgICAgICAgICAgICAgICAgICAgICAgfCB0YWJsZSBmaWVsZCBgb2Zmc2V0YCAoVVNob3J0KQorICArMHgwRDE4IHwgMUMgMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDAwMUMgKDI4KSBMb2M6ICsweDBEMzQgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYG5hbWVgIChzdHJpbmcpCisgICsweDBEMUMgfCAwQyAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDAwQyAoMTIpIExvYzogKzB4MEQyOCAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgdHlwZWAgKHRhYmxlKQorICArMHgwRDIwIHwgMDQgMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDAwMDQgKDQpIExvYzogKzB4MEQyNCAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYGRvY3VtZW50YXRpb25gICh2ZWN0b3IpCisKK3ZlY3RvciAocmVmbGVjdGlvbi5GaWVsZC5kb2N1bWVudGF0aW9uKToKKyAgKzB4MEQyNCB8IDAwIDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgfCAweDAwMDAwMDAwICgwKSAgICAgICAgICAgICAgICAgICAgIHwgbGVuZ3RoIG9mIHZlY3RvciAoIyBpdGVtcykKKwordGFibGUgKHJlZmxlY3Rpb24uVHlwZSk6CisgICsweDBEMjggfCA4QyBEMyBGRiBGRiAgICAgICAgICAgICB8IFNPZmZzZXQzMiAgIHwgMHhGRkZGRDM4QyAoLTExMzgwKSBMb2M6ICsweDM5OUMgICB8IG9mZnNldCB0byB2dGFibGUKKyAgKzB4MEQyQyB8IDAwIDAwIDAwICAgICAgICAgICAgICAgIHwgdWludDhfdFszXSAgfCAuLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgcGFkZGluZworICArMHgwRDJGIHwgMEIgICAgICAgICAgICAgICAgICAgICAgfCB1aW50OF90ICAgICB8IDB4MEIgKDExKSAgICAgICAgICAgICAgICAgICAgICAgICAgfCB0YWJsZSBmaWVsZCBgYmFzZV90eXBlYCAoQnl0ZSkKKyAgKzB4MEQzMCB8IDAxIDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgfCAweDAwMDAwMDAxICgxKSAgICAgICAgICAgICAgICAgICAgIHwgdGFibGUgZmllbGQgYGVsZW1lbnRfc2l6ZWAgKFVJbnQpCisKK3N0cmluZyAocmVmbGVjdGlvbi5GaWVsZC5uYW1lKToKKyAgKzB4MEQzNCB8IDAzIDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgfCAweDAwMDAwMDAzICgzKSAgICAgICAgICAgICAgICAgICAgIHwgbGVuZ3RoIG9mIHN0cmluZworICArMHgwRDM4IHwgNjYgMzMgMzIgICAgICAgICAgICAgICAgfCBjaGFyWzNdICAgICB8IGYzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJpbmcgbGl0ZXJhbAorICArMHgwRDNCIHwgMDAgICAgICAgICAgICAgICAgICAgICAgfCBjaGFyICAgICAgICB8IDB4MDAgKDApICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJpbmcgdGVybWluYXRvcgorCit0YWJsZSAocmVmbGVjdGlvbi5GaWVsZCk6CisgICsweDBEM0MgfCBBNiBEOCBGRiBGRiAgICAgICAgICAgICB8IFNPZmZzZXQzMiAgIHwgMHhGRkZGRDhBNiAoLTEwMDc0KSBMb2M6ICsweDM0OTYgICB8IG9mZnNldCB0byB2dGFibGUKKyAgKzB4MEQ0MCB8IDA3IDAwICAgICAgICAgICAgICAgICAgIHwgdWludDE2X3QgICAgfCAweDAwMDcgKDcpICAgICAgICAgICAgICAgICAgICAgICAgIHwgdGFibGUgZmllbGQgYGlkYCAoVVNob3J0KQorICArMHgwRDQyIHwgMTIgMDAgICAgICAgICAgICAgICAgICAgfCB1aW50MTZfdCAgICB8IDB4MDAxMiAoMTgpICAgICAgICAgICAgICAgICAgICAgICAgfCB0YWJsZSBmaWVsZCBgb2Zmc2V0YCAoVVNob3J0KQorICArMHgwRDQ0IHwgMjAgMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDAwMjAgKDMyKSBMb2M6ICsweDBENjQgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYG5hbWVgIChzdHJpbmcpCisgICsweDBENDggfCAwQyAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDAwQyAoMTIpIExvYzogKzB4MEQ1NCAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgdHlwZWAgKHRhYmxlKQorICArMHgwRDRDIHwgMDQgMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDAwMDQgKDQpIExvYzogKzB4MEQ1MCAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYGRvY3VtZW50YXRpb25gICh2ZWN0b3IpCisKK3ZlY3RvciAocmVmbGVjdGlvbi5GaWVsZC5kb2N1bWVudGF0aW9uKToKKyAgKzB4MEQ1MCB8IDAwIDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgfCAweDAwMDAwMDAwICgwKSAgICAgICAgICAgICAgICAgICAgIHwgbGVuZ3RoIG9mIHZlY3RvciAoIyBpdGVtcykKKwordGFibGUgKHJlZmxlY3Rpb24uVHlwZSk6CisgICsweDBENTQgfCA3MCBENiBGRiBGRiAgICAgICAgICAgICB8IFNPZmZzZXQzMiAgIHwgMHhGRkZGRDY3MCAoLTEwNjQwKSBMb2M6ICsweDM2RTQgICB8IG9mZnNldCB0byB2dGFibGUKKyAgKzB4MEQ1OCB8IDAwIDAwIDAwICAgICAgICAgICAgICAgIHwgdWludDhfdFszXSAgfCAuLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgcGFkZGluZworICArMHgwRDVCIHwgMEEgICAgICAgICAgICAgICAgICAgICAgfCB1aW50OF90ICAgICB8IDB4MEEgKDEwKSAgICAgICAgICAgICAgICAgICAgICAgICAgfCB0YWJsZSBmaWVsZCBgYmFzZV90eXBlYCAoQnl0ZSkKKyAgKzB4MEQ1QyB8IDA4IDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgfCAweDAwMDAwMDA4ICg4KSAgICAgICAgICAgICAgICAgICAgIHwgdGFibGUgZmllbGQgYGJhc2Vfc2l6ZWAgKFVJbnQpCisgICsweDBENjAgfCAwMSAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgIHwgMHgwMDAwMDAwMSAoMSkgICAgICAgICAgICAgICAgICAgICB8IHRhYmxlIGZpZWxkIGBlbGVtZW50X3NpemVgIChVSW50KQorCitzdHJpbmcgKHJlZmxlY3Rpb24uRmllbGQubmFtZSk6CisgICsweDBENjQgfCAwMyAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgIHwgMHgwMDAwMDAwMyAoMykgICAgICAgICAgICAgICAgICAgICB8IGxlbmd0aCBvZiBzdHJpbmcKKyAgKzB4MEQ2OCB8IDc1IDM2IDM0ICAgICAgICAgICAgICAgIHwgY2hhclszXSAgICAgfCB1NjQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nIGxpdGVyYWwKKyAgKzB4MEQ2QiB8IDAwICAgICAgICAgICAgICAgICAgICAgIHwgY2hhciAgICAgICAgfCAweDAwICgwKSAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nIHRlcm1pbmF0b3IKKwordGFibGUgKHJlZmxlY3Rpb24uRmllbGQpOgorICArMHgwRDZDIHwgRDYgRDggRkYgRkYgICAgICAgICAgICAgfCBTT2Zmc2V0MzIgICB8IDB4RkZGRkQ4RDYgKC0xMDAyNikgTG9jOiArMHgzNDk2ICAgfCBvZmZzZXQgdG8gdnRhYmxlCisgICsweDBENzAgfCAwNiAwMCAgICAgICAgICAgICAgICAgICB8IHVpbnQxNl90ICAgIHwgMHgwMDA2ICg2KSAgICAgICAgICAgICAgICAgICAgICAgICB8IHRhYmxlIGZpZWxkIGBpZGAgKFVTaG9ydCkKKyAgKzB4MEQ3MiB8IDEwIDAwICAgICAgICAgICAgICAgICAgIHwgdWludDE2X3QgICAgfCAweDAwMTAgKDE2KSAgICAgICAgICAgICAgICAgICAgICAgIHwgdGFibGUgZmllbGQgYG9mZnNldGAgKFVTaG9ydCkKKyAgKzB4MEQ3NCB8IDIwIDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMDIwICgzMikgTG9jOiArMHgwRDk0ICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBuYW1lYCAoc3RyaW5nKQorICArMHgwRDc4IHwgMEMgMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDAwMEMgKDEyKSBMb2M6ICsweDBEODQgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYHR5cGVgICh0YWJsZSkKKyAgKzB4MEQ3QyB8IDA0IDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMDA0ICg0KSBMb2M6ICsweDBEODAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBkb2N1bWVudGF0aW9uYCAodmVjdG9yKQorCit2ZWN0b3IgKHJlZmxlY3Rpb24uRmllbGQuZG9jdW1lbnRhdGlvbik6CisgICsweDBEODAgfCAwMCAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgIHwgMHgwMDAwMDAwMCAoMCkgICAgICAgICAgICAgICAgICAgICB8IGxlbmd0aCBvZiB2ZWN0b3IgKCMgaXRlbXMpCisKK3RhYmxlIChyZWZsZWN0aW9uLlR5cGUpOgorICArMHgwRDg0IHwgQTAgRDYgRkYgRkYgICAgICAgICAgICAgfCBTT2Zmc2V0MzIgICB8IDB4RkZGRkQ2QTAgKC0xMDU5MikgTG9jOiArMHgzNkU0ICAgfCBvZmZzZXQgdG8gdnRhYmxlCisgICsweDBEODggfCAwMCAwMCAwMCAgICAgICAgICAgICAgICB8IHVpbnQ4X3RbM10gIHwgLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHBhZGRpbmcKKyAgKzB4MEQ4QiB8IDA5ICAgICAgICAgICAgICAgICAgICAgIHwgdWludDhfdCAgICAgfCAweDA5ICg5KSAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgdGFibGUgZmllbGQgYGJhc2VfdHlwZWAgKEJ5dGUpCisgICsweDBEOEMgfCAwOCAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgIHwgMHgwMDAwMDAwOCAoOCkgICAgICAgICAgICAgICAgICAgICB8IHRhYmxlIGZpZWxkIGBiYXNlX3NpemVgIChVSW50KQorICArMHgwRDkwIHwgMDEgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICB8IDB4MDAwMDAwMDEgKDEpICAgICAgICAgICAgICAgICAgICAgfCB0YWJsZSBmaWVsZCBgZWxlbWVudF9zaXplYCAoVUludCkKKworc3RyaW5nIChyZWZsZWN0aW9uLkZpZWxkLm5hbWUpOgorICArMHgwRDk0IHwgMDMgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICB8IDB4MDAwMDAwMDMgKDMpICAgICAgICAgICAgICAgICAgICAgfCBsZW5ndGggb2Ygc3RyaW5nCisgICsweDBEOTggfCA2OSAzNiAzNCAgICAgICAgICAgICAgICB8IGNoYXJbM10gICAgIHwgaTY0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHN0cmluZyBsaXRlcmFsCisgICsweDBEOUIgfCAwMCAgICAgICAgICAgICAgICAgICAgICB8IGNoYXIgICAgICAgIHwgMHgwMCAoMCkgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHN0cmluZyB0ZXJtaW5hdG9yCisKK3RhYmxlIChyZWZsZWN0aW9uLkZpZWxkKToKKyAgKzB4MEQ5QyB8IDA2IEQ5IEZGIEZGICAgICAgICAgICAgIHwgU09mZnNldDMyICAgfCAweEZGRkZEOTA2ICgtOTk3OCkgTG9jOiArMHgzNDk2ICAgIHwgb2Zmc2V0IHRvIHZ0YWJsZQorICArMHgwREEwIHwgMDUgMDAgICAgICAgICAgICAgICAgICAgfCB1aW50MTZfdCAgICB8IDB4MDAwNSAoNSkgICAgICAgICAgICAgICAgICAgICAgICAgfCB0YWJsZSBmaWVsZCBgaWRgIChVU2hvcnQpCisgICsweDBEQTIgfCAwRSAwMCAgICAgICAgICAgICAgICAgICB8IHVpbnQxNl90ICAgIHwgMHgwMDBFICgxNCkgICAgICAgICAgICAgICAgICAgICAgICB8IHRhYmxlIGZpZWxkIGBvZmZzZXRgIChVU2hvcnQpCisgICsweDBEQTQgfCAxQyAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDAxQyAoMjgpIExvYzogKzB4MERDMCAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgbmFtZWAgKHN0cmluZykKKyAgKzB4MERBOCB8IDBDIDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMDBDICgxMikgTG9jOiArMHgwREI0ICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGB0eXBlYCAodGFibGUpCisgICsweDBEQUMgfCAwNCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDAwNCAoNCkgTG9jOiArMHgwREIwICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgZG9jdW1lbnRhdGlvbmAgKHZlY3RvcikKKwordmVjdG9yIChyZWZsZWN0aW9uLkZpZWxkLmRvY3VtZW50YXRpb24pOgorICArMHgwREIwIHwgMDAgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICB8IDB4MDAwMDAwMDAgKDApICAgICAgICAgICAgICAgICAgICAgfCBsZW5ndGggb2YgdmVjdG9yICgjIGl0ZW1zKQorCit0YWJsZSAocmVmbGVjdGlvbi5UeXBlKToKKyAgKzB4MERCNCB8IDE4IEQ0IEZGIEZGICAgICAgICAgICAgIHwgU09mZnNldDMyICAgfCAweEZGRkZENDE4ICgtMTEyNDApIExvYzogKzB4Mzk5QyAgIHwgb2Zmc2V0IHRvIHZ0YWJsZQorICArMHgwREI4IHwgMDAgMDAgMDAgICAgICAgICAgICAgICAgfCB1aW50OF90WzNdICB8IC4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBwYWRkaW5nCisgICsweDBEQkIgfCAwOCAgICAgICAgICAgICAgICAgICAgICB8IHVpbnQ4X3QgICAgIHwgMHgwOCAoOCkgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHRhYmxlIGZpZWxkIGBiYXNlX3R5cGVgIChCeXRlKQorICArMHgwREJDIHwgMDEgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICB8IDB4MDAwMDAwMDEgKDEpICAgICAgICAgICAgICAgICAgICAgfCB0YWJsZSBmaWVsZCBgZWxlbWVudF9zaXplYCAoVUludCkKKworc3RyaW5nIChyZWZsZWN0aW9uLkZpZWxkLm5hbWUpOgorICArMHgwREMwIHwgMDMgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICB8IDB4MDAwMDAwMDMgKDMpICAgICAgICAgICAgICAgICAgICAgfCBsZW5ndGggb2Ygc3RyaW5nCisgICsweDBEQzQgfCA3NSAzMyAzMiAgICAgICAgICAgICAgICB8IGNoYXJbM10gICAgIHwgdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHN0cmluZyBsaXRlcmFsCisgICsweDBEQzcgfCAwMCAgICAgICAgICAgICAgICAgICAgICB8IGNoYXIgICAgICAgIHwgMHgwMCAoMCkgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHN0cmluZyB0ZXJtaW5hdG9yCisKK3RhYmxlIChyZWZsZWN0aW9uLkZpZWxkKToKKyAgKzB4MERDOCB8IDMyIEQ5IEZGIEZGICAgICAgICAgICAgIHwgU09mZnNldDMyICAgfCAweEZGRkZEOTMyICgtOTkzNCkgTG9jOiArMHgzNDk2ICAgIHwgb2Zmc2V0IHRvIHZ0YWJsZQorICArMHgwRENDIHwgMDQgMDAgICAgICAgICAgICAgICAgICAgfCB1aW50MTZfdCAgICB8IDB4MDAwNCAoNCkgICAgICAgICAgICAgICAgICAgICAgICAgfCB0YWJsZSBmaWVsZCBgaWRgIChVU2hvcnQpCisgICsweDBEQ0UgfCAwQyAwMCAgICAgICAgICAgICAgICAgICB8IHVpbnQxNl90ICAgIHwgMHgwMDBDICgxMikgICAgICAgICAgICAgICAgICAgICAgICB8IHRhYmxlIGZpZWxkIGBvZmZzZXRgIChVU2hvcnQpCisgICsweDBERDAgfCAxQyAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDAxQyAoMjgpIExvYzogKzB4MERFQyAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgbmFtZWAgKHN0cmluZykKKyAgKzB4MERENCB8IDBDIDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMDBDICgxMikgTG9jOiArMHgwREUwICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGB0eXBlYCAodGFibGUpCisgICsweDBERDggfCAwNCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDAwNCAoNCkgTG9jOiArMHgwRERDICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgZG9jdW1lbnRhdGlvbmAgKHZlY3RvcikKKwordmVjdG9yIChyZWZsZWN0aW9uLkZpZWxkLmRvY3VtZW50YXRpb24pOgorICArMHgwRERDIHwgMDAgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICB8IDB4MDAwMDAwMDAgKDApICAgICAgICAgICAgICAgICAgICAgfCBsZW5ndGggb2YgdmVjdG9yICgjIGl0ZW1zKQorCit0YWJsZSAocmVmbGVjdGlvbi5UeXBlKToKKyAgKzB4MERFMCB8IDQ0IEQ0IEZGIEZGICAgICAgICAgICAgIHwgU09mZnNldDMyICAgfCAweEZGRkZENDQ0ICgtMTExOTYpIExvYzogKzB4Mzk5QyAgIHwgb2Zmc2V0IHRvIHZ0YWJsZQorICArMHgwREU0IHwgMDAgMDAgMDAgICAgICAgICAgICAgICAgfCB1aW50OF90WzNdICB8IC4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBwYWRkaW5nCisgICsweDBERTcgfCAwNyAgICAgICAgICAgICAgICAgICAgICB8IHVpbnQ4X3QgICAgIHwgMHgwNyAoNykgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHRhYmxlIGZpZWxkIGBiYXNlX3R5cGVgIChCeXRlKQorICArMHgwREU4IHwgMDEgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICB8IDB4MDAwMDAwMDEgKDEpICAgICAgICAgICAgICAgICAgICAgfCB0YWJsZSBmaWVsZCBgZWxlbWVudF9zaXplYCAoVUludCkKKworc3RyaW5nIChyZWZsZWN0aW9uLkZpZWxkLm5hbWUpOgorICArMHgwREVDIHwgMDMgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICB8IDB4MDAwMDAwMDMgKDMpICAgICAgICAgICAgICAgICAgICAgfCBsZW5ndGggb2Ygc3RyaW5nCisgICsweDBERjAgfCA2OSAzMyAzMiAgICAgICAgICAgICAgICB8IGNoYXJbM10gICAgIHwgaTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHN0cmluZyBsaXRlcmFsCisgICsweDBERjMgfCAwMCAgICAgICAgICAgICAgICAgICAgICB8IGNoYXIgICAgICAgIHwgMHgwMCAoMCkgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHN0cmluZyB0ZXJtaW5hdG9yCisKK3RhYmxlIChyZWZsZWN0aW9uLkZpZWxkKToKKyAgKzB4MERGNCB8IDVFIEQ5IEZGIEZGICAgICAgICAgICAgIHwgU09mZnNldDMyICAgfCAweEZGRkZEOTVFICgtOTg5MCkgTG9jOiArMHgzNDk2ICAgIHwgb2Zmc2V0IHRvIHZ0YWJsZQorICArMHgwREY4IHwgMDMgMDAgICAgICAgICAgICAgICAgICAgfCB1aW50MTZfdCAgICB8IDB4MDAwMyAoMykgICAgICAgICAgICAgICAgICAgICAgICAgfCB0YWJsZSBmaWVsZCBgaWRgIChVU2hvcnQpCisgICsweDBERkEgfCAwQSAwMCAgICAgICAgICAgICAgICAgICB8IHVpbnQxNl90ICAgIHwgMHgwMDBBICgxMCkgICAgICAgICAgICAgICAgICAgICAgICB8IHRhYmxlIGZpZWxkIGBvZmZzZXRgIChVU2hvcnQpCisgICsweDBERkMgfCAyMCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDAyMCAoMzIpIExvYzogKzB4MEUxQyAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgbmFtZWAgKHN0cmluZykKKyAgKzB4MEUwMCB8IDBDIDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMDBDICgxMikgTG9jOiArMHgwRTBDICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGB0eXBlYCAodGFibGUpCisgICsweDBFMDQgfCAwNCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDAwNCAoNCkgTG9jOiArMHgwRTA4ICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgZG9jdW1lbnRhdGlvbmAgKHZlY3RvcikKKwordmVjdG9yIChyZWZsZWN0aW9uLkZpZWxkLmRvY3VtZW50YXRpb24pOgorICArMHgwRTA4IHwgMDAgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICB8IDB4MDAwMDAwMDAgKDApICAgICAgICAgICAgICAgICAgICAgfCBsZW5ndGggb2YgdmVjdG9yICgjIGl0ZW1zKQorCit0YWJsZSAocmVmbGVjdGlvbi5UeXBlKToKKyAgKzB4MEUwQyB8IDI4IEQ3IEZGIEZGICAgICAgICAgICAgIHwgU09mZnNldDMyICAgfCAweEZGRkZENzI4ICgtMTA0NTYpIExvYzogKzB4MzZFNCAgIHwgb2Zmc2V0IHRvIHZ0YWJsZQorICArMHgwRTEwIHwgMDAgMDAgMDAgICAgICAgICAgICAgICAgfCB1aW50OF90WzNdICB8IC4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBwYWRkaW5nCisgICsweDBFMTMgfCAwNiAgICAgICAgICAgICAgICAgICAgICB8IHVpbnQ4X3QgICAgIHwgMHgwNiAoNikgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHRhYmxlIGZpZWxkIGBiYXNlX3R5cGVgIChCeXRlKQorICArMHgwRTE0IHwgMDIgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICB8IDB4MDAwMDAwMDIgKDIpICAgICAgICAgICAgICAgICAgICAgfCB0YWJsZSBmaWVsZCBgYmFzZV9zaXplYCAoVUludCkKKyAgKzB4MEUxOCB8IDAxIDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgfCAweDAwMDAwMDAxICgxKSAgICAgICAgICAgICAgICAgICAgIHwgdGFibGUgZmllbGQgYGVsZW1lbnRfc2l6ZWAgKFVJbnQpCisKK3N0cmluZyAocmVmbGVjdGlvbi5GaWVsZC5uYW1lKToKKyAgKzB4MEUxQyB8IDAzIDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgfCAweDAwMDAwMDAzICgzKSAgICAgICAgICAgICAgICAgICAgIHwgbGVuZ3RoIG9mIHN0cmluZworICArMHgwRTIwIHwgNzUgMzEgMzYgICAgICAgICAgICAgICAgfCBjaGFyWzNdICAgICB8IHUxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJpbmcgbGl0ZXJhbAorICArMHgwRTIzIHwgMDAgICAgICAgICAgICAgICAgICAgICAgfCBjaGFyICAgICAgICB8IDB4MDAgKDApICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJpbmcgdGVybWluYXRvcgorCit0YWJsZSAocmVmbGVjdGlvbi5GaWVsZCk6CisgICsweDBFMjQgfCA4RSBEOSBGRiBGRiAgICAgICAgICAgICB8IFNPZmZzZXQzMiAgIHwgMHhGRkZGRDk4RSAoLTk4NDIpIExvYzogKzB4MzQ5NiAgICB8IG9mZnNldCB0byB2dGFibGUKKyAgKzB4MEUyOCB8IDAyIDAwICAgICAgICAgICAgICAgICAgIHwgdWludDE2X3QgICAgfCAweDAwMDIgKDIpICAgICAgICAgICAgICAgICAgICAgICAgIHwgdGFibGUgZmllbGQgYGlkYCAoVVNob3J0KQorICArMHgwRTJBIHwgMDggMDAgICAgICAgICAgICAgICAgICAgfCB1aW50MTZfdCAgICB8IDB4MDAwOCAoOCkgICAgICAgICAgICAgICAgICAgICAgICAgfCB0YWJsZSBmaWVsZCBgb2Zmc2V0YCAoVVNob3J0KQorICArMHgwRTJDIHwgMjAgMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDAwMjAgKDMyKSBMb2M6ICsweDBFNEMgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYG5hbWVgIChzdHJpbmcpCisgICsweDBFMzAgfCAwQyAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDAwQyAoMTIpIExvYzogKzB4MEUzQyAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgdHlwZWAgKHRhYmxlKQorICArMHgwRTM0IHwgMDQgMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDAwMDQgKDQpIExvYzogKzB4MEUzOCAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYGRvY3VtZW50YXRpb25gICh2ZWN0b3IpCisKK3ZlY3RvciAocmVmbGVjdGlvbi5GaWVsZC5kb2N1bWVudGF0aW9uKToKKyAgKzB4MEUzOCB8IDAwIDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgfCAweDAwMDAwMDAwICgwKSAgICAgICAgICAgICAgICAgICAgIHwgbGVuZ3RoIG9mIHZlY3RvciAoIyBpdGVtcykKKwordGFibGUgKHJlZmxlY3Rpb24uVHlwZSk6CisgICsweDBFM0MgfCA1OCBENyBGRiBGRiAgICAgICAgICAgICB8IFNPZmZzZXQzMiAgIHwgMHhGRkZGRDc1OCAoLTEwNDA4KSBMb2M6ICsweDM2RTQgICB8IG9mZnNldCB0byB2dGFibGUKKyAgKzB4MEU0MCB8IDAwIDAwIDAwICAgICAgICAgICAgICAgIHwgdWludDhfdFszXSAgfCAuLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgcGFkZGluZworICArMHgwRTQzIHwgMDUgICAgICAgICAgICAgICAgICAgICAgfCB1aW50OF90ICAgICB8IDB4MDUgKDUpICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB0YWJsZSBmaWVsZCBgYmFzZV90eXBlYCAoQnl0ZSkKKyAgKzB4MEU0NCB8IDAyIDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgfCAweDAwMDAwMDAyICgyKSAgICAgICAgICAgICAgICAgICAgIHwgdGFibGUgZmllbGQgYGJhc2Vfc2l6ZWAgKFVJbnQpCisgICsweDBFNDggfCAwMSAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgIHwgMHgwMDAwMDAwMSAoMSkgICAgICAgICAgICAgICAgICAgICB8IHRhYmxlIGZpZWxkIGBlbGVtZW50X3NpemVgIChVSW50KQorCitzdHJpbmcgKHJlZmxlY3Rpb24uRmllbGQubmFtZSk6CisgICsweDBFNEMgfCAwMyAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgIHwgMHgwMDAwMDAwMyAoMykgICAgICAgICAgICAgICAgICAgICB8IGxlbmd0aCBvZiBzdHJpbmcKKyAgKzB4MEU1MCB8IDY5IDMxIDM2ICAgICAgICAgICAgICAgIHwgY2hhclszXSAgICAgfCBpMTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nIGxpdGVyYWwKKyAgKzB4MEU1MyB8IDAwICAgICAgICAgICAgICAgICAgICAgIHwgY2hhciAgICAgICAgfCAweDAwICgwKSAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nIHRlcm1pbmF0b3IKKwordGFibGUgKHJlZmxlY3Rpb24uRmllbGQpOgorICArMHgwRTU0IHwgQkUgRDkgRkYgRkYgICAgICAgICAgICAgfCBTT2Zmc2V0MzIgICB8IDB4RkZGRkQ5QkUgKC05Nzk0KSBMb2M6ICsweDM0OTYgICAgfCBvZmZzZXQgdG8gdnRhYmxlCisgICsweDBFNTggfCAwMSAwMCAgICAgICAgICAgICAgICAgICB8IHVpbnQxNl90ICAgIHwgMHgwMDAxICgxKSAgICAgICAgICAgICAgICAgICAgICAgICB8IHRhYmxlIGZpZWxkIGBpZGAgKFVTaG9ydCkKKyAgKzB4MEU1QSB8IDA2IDAwICAgICAgICAgICAgICAgICAgIHwgdWludDE2X3QgICAgfCAweDAwMDYgKDYpICAgICAgICAgICAgICAgICAgICAgICAgIHwgdGFibGUgZmllbGQgYG9mZnNldGAgKFVTaG9ydCkKKyAgKzB4MEU1QyB8IDIwIDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMDIwICgzMikgTG9jOiArMHgwRTdDICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBuYW1lYCAoc3RyaW5nKQorICArMHgwRTYwIHwgMEMgMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDAwMEMgKDEyKSBMb2M6ICsweDBFNkMgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYHR5cGVgICh0YWJsZSkKKyAgKzB4MEU2NCB8IDA0IDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMDA0ICg0KSBMb2M6ICsweDBFNjggICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBkb2N1bWVudGF0aW9uYCAodmVjdG9yKQorCit2ZWN0b3IgKHJlZmxlY3Rpb24uRmllbGQuZG9jdW1lbnRhdGlvbik6CisgICsweDBFNjggfCAwMCAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgIHwgMHgwMDAwMDAwMCAoMCkgICAgICAgICAgICAgICAgICAgICB8IGxlbmd0aCBvZiB2ZWN0b3IgKCMgaXRlbXMpCisKK3RhYmxlIChyZWZsZWN0aW9uLlR5cGUpOgorICArMHgwRTZDIHwgODggRDcgRkYgRkYgICAgICAgICAgICAgfCBTT2Zmc2V0MzIgICB8IDB4RkZGRkQ3ODggKC0xMDM2MCkgTG9jOiArMHgzNkU0ICAgfCBvZmZzZXQgdG8gdnRhYmxlCisgICsweDBFNzAgfCAwMCAwMCAwMCAgICAgICAgICAgICAgICB8IHVpbnQ4X3RbM10gIHwgLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHBhZGRpbmcKKyAgKzB4MEU3MyB8IDA0ICAgICAgICAgICAgICAgICAgICAgIHwgdWludDhfdCAgICAgfCAweDA0ICg0KSAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgdGFibGUgZmllbGQgYGJhc2VfdHlwZWAgKEJ5dGUpCisgICsweDBFNzQgfCAwMSAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgIHwgMHgwMDAwMDAwMSAoMSkgICAgICAgICAgICAgICAgICAgICB8IHRhYmxlIGZpZWxkIGBiYXNlX3NpemVgIChVSW50KQorICArMHgwRTc4IHwgMDEgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICB8IDB4MDAwMDAwMDEgKDEpICAgICAgICAgICAgICAgICAgICAgfCB0YWJsZSBmaWVsZCBgZWxlbWVudF9zaXplYCAoVUludCkKKworc3RyaW5nIChyZWZsZWN0aW9uLkZpZWxkLm5hbWUpOgorICArMHgwRTdDIHwgMDIgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICB8IDB4MDAwMDAwMDIgKDIpICAgICAgICAgICAgICAgICAgICAgfCBsZW5ndGggb2Ygc3RyaW5nCisgICsweDBFODAgfCA3NSAzOCAgICAgICAgICAgICAgICAgICB8IGNoYXJbMl0gICAgIHwgdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHN0cmluZyBsaXRlcmFsCisgICsweDBFODIgfCAwMCAgICAgICAgICAgICAgICAgICAgICB8IGNoYXIgICAgICAgIHwgMHgwMCAoMCkgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHN0cmluZyB0ZXJtaW5hdG9yCisKK3BhZGRpbmc6CisgICsweDBFODMgfCAwMCAwMCAwMCAgICAgICAgICAgICAgICB8IHVpbnQ4X3RbM10gIHwgLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHBhZGRpbmcKKwordnRhYmxlIChyZWZsZWN0aW9uLkZpZWxkKToKKyAgKzB4MEU4NiB8IDFBIDAwICAgICAgICAgICAgICAgICAgIHwgdWludDE2X3QgICAgfCAweDAwMUEgKDI2KSAgICAgICAgICAgICAgICAgICAgICAgIHwgc2l6ZSBvZiB0aGlzIHZ0YWJsZQorICArMHgwRTg4IHwgMTQgMDAgICAgICAgICAgICAgICAgICAgfCB1aW50MTZfdCAgICB8IDB4MDAxNCAoMjApICAgICAgICAgICAgICAgICAgICAgICAgfCBzaXplIG9mIHJlZmVycmluZyB0YWJsZQorICArMHgwRThBIHwgMDggMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgICB8IDB4MDAwOCAoOCkgICAgICAgICAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYG5hbWVgIChpZDogMCkKKyAgKzB4MEU4QyB8IDBDIDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgfCAweDAwMEMgKDEyKSAgICAgICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGB0eXBlYCAoaWQ6IDEpCisgICsweDBFOEUgfCAwMCAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgIHwgMHgwMDAwICgwKSAgICAgICAgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgaWRgIChpZDogMikgPGRlZmF1bHRzIHRvIDA+IChVU2hvcnQpCisgICsweDBFOTAgfCAwNiAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgIHwgMHgwMDA2ICg2KSAgICAgICAgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgb2Zmc2V0YCAoaWQ6IDMpCisgICsweDBFOTIgfCAwMCAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgIHwgMHgwMDAwICgwKSAgICAgICAgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgZGVmYXVsdF9pbnRlZ2VyYCAoaWQ6IDQpIDxkZWZhdWx0cyB0byAwPiAoTG9uZykKKyAgKzB4MEU5NCB8IDAwIDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgfCAweDAwMDAgKDApICAgICAgICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBkZWZhdWx0X3JlYWxgIChpZDogNSkgPGRlZmF1bHRzIHRvIDAuMDAwMDAwPiAoRG91YmxlKQorICArMHgwRTk2IHwgMDAgMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgICB8IDB4MDAwMCAoMCkgICAgICAgICAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYGRlcHJlY2F0ZWRgIChpZDogNikgPGRlZmF1bHRzIHRvIDA+IChCb29sKQorICArMHgwRTk4IHwgMDAgMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgICB8IDB4MDAwMCAoMCkgICAgICAgICAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYHJlcXVpcmVkYCAoaWQ6IDcpIDxkZWZhdWx0cyB0byAwPiAoQm9vbCkKKyAgKzB4MEU5QSB8IDAwIDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgfCAweDAwMDAgKDApICAgICAgICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBrZXlgIChpZDogOCkgPGRlZmF1bHRzIHRvIDA+IChCb29sKQorICArMHgwRTlDIHwgMDAgMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgICB8IDB4MDAwMCAoMCkgICAgICAgICAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYGF0dHJpYnV0ZXNgIChpZDogOSkgPG51bGw+IChWZWN0b3IpCisgICsweDBFOUUgfCAxMCAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgIHwgMHgwMDEwICgxNikgICAgICAgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgZG9jdW1lbnRhdGlvbmAgKGlkOiAxMCkKKwordGFibGUgKHJlZmxlY3Rpb24uRmllbGQpOgorICArMHgwRUEwIHwgMUEgMDAgMDAgMDAgICAgICAgICAgICAgfCBTT2Zmc2V0MzIgICB8IDB4MDAwMDAwMUEgKDI2KSBMb2M6ICsweDBFODYgICAgICAgfCBvZmZzZXQgdG8gdnRhYmxlCisgICsweDBFQTQgfCAwMCAwMCAgICAgICAgICAgICAgICAgICB8IHVpbnQ4X3RbMl0gIHwgLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHBhZGRpbmcKKyAgKzB4MEVBNiB8IDA0IDAwICAgICAgICAgICAgICAgICAgIHwgdWludDE2X3QgICAgfCAweDAwMDQgKDQpICAgICAgICAgICAgICAgICAgICAgICAgIHwgdGFibGUgZmllbGQgYG9mZnNldGAgKFVTaG9ydCkKKyAgKzB4MEVBOCB8IDIwIDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMDIwICgzMikgTG9jOiArMHgwRUM4ICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBuYW1lYCAoc3RyaW5nKQorICArMHgwRUFDIHwgMEMgMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDAwMEMgKDEyKSBMb2M6ICsweDBFQjggICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYHR5cGVgICh0YWJsZSkKKyAgKzB4MEVCMCB8IDA0IDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMDA0ICg0KSBMb2M6ICsweDBFQjQgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBkb2N1bWVudGF0aW9uYCAodmVjdG9yKQorCit2ZWN0b3IgKHJlZmxlY3Rpb24uRmllbGQuZG9jdW1lbnRhdGlvbik6CisgICsweDBFQjQgfCAwMCAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgIHwgMHgwMDAwMDAwMCAoMCkgICAgICAgICAgICAgICAgICAgICB8IGxlbmd0aCBvZiB2ZWN0b3IgKCMgaXRlbXMpCisKK3RhYmxlIChyZWZsZWN0aW9uLlR5cGUpOgorICArMHgwRUI4IHwgRDQgRDcgRkYgRkYgICAgICAgICAgICAgfCBTT2Zmc2V0MzIgICB8IDB4RkZGRkQ3RDQgKC0xMDI4NCkgTG9jOiArMHgzNkU0ICAgfCBvZmZzZXQgdG8gdnRhYmxlCisgICsweDBFQkMgfCAwMCAwMCAwMCAgICAgICAgICAgICAgICB8IHVpbnQ4X3RbM10gIHwgLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHBhZGRpbmcKKyAgKzB4MEVCRiB8IDAzICAgICAgICAgICAgICAgICAgICAgIHwgdWludDhfdCAgICAgfCAweDAzICgzKSAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgdGFibGUgZmllbGQgYGJhc2VfdHlwZWAgKEJ5dGUpCisgICsweDBFQzAgfCAwMSAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgIHwgMHgwMDAwMDAwMSAoMSkgICAgICAgICAgICAgICAgICAgICB8IHRhYmxlIGZpZWxkIGBiYXNlX3NpemVgIChVSW50KQorICArMHgwRUM0IHwgMDEgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICB8IDB4MDAwMDAwMDEgKDEpICAgICAgICAgICAgICAgICAgICAgfCB0YWJsZSBmaWVsZCBgZWxlbWVudF9zaXplYCAoVUludCkKKworc3RyaW5nIChyZWZsZWN0aW9uLkZpZWxkLm5hbWUpOgorICArMHgwRUM4IHwgMDIgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICB8IDB4MDAwMDAwMDIgKDIpICAgICAgICAgICAgICAgICAgICAgfCBsZW5ndGggb2Ygc3RyaW5nCisgICsweDBFQ0MgfCA2OSAzOCAgICAgICAgICAgICAgICAgICB8IGNoYXJbMl0gICAgIHwgaTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHN0cmluZyBsaXRlcmFsCisgICsweDBFQ0UgfCAwMCAgICAgICAgICAgICAgICAgICAgICB8IGNoYXIgICAgICAgIHwgMHgwMCAoMCkgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHN0cmluZyB0ZXJtaW5hdG9yCisKK3RhYmxlIChyZWZsZWN0aW9uLk9iamVjdCk6CisgICsweDBFRDAgfCBBOCBENiBGRiBGRiAgICAgICAgICAgICB8IFNPZmZzZXQzMiAgIHwgMHhGRkZGRDZBOCAoLTEwNTg0KSBMb2M6ICsweDM4MjggICB8IG9mZnNldCB0byB2dGFibGUKKyAgKzB4MEVENCB8IDMwIDAxIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMTMwICgzMDQpIExvYzogKzB4MTAwNCAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBuYW1lYCAoc3RyaW5nKQorICArMHgwRUQ4IHwgNTAgMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDAwNTAgKDgwKSBMb2M6ICsweDBGMjggICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYGZpZWxkc2AgKHZlY3RvcikKKyAgKzB4MEVEQyB8IDAxIDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgfCAweDAwMDAwMDAxICgxKSAgICAgICAgICAgICAgICAgICAgIHwgdGFibGUgZmllbGQgYG1pbmFsaWduYCAoSW50KQorICArMHgwRUUwIHwgMDggMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDAwMDggKDgpIExvYzogKzB4MEVFOCAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYGRvY3VtZW50YXRpb25gICh2ZWN0b3IpCisgICsweDBFRTQgfCA3QyAyOCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMjg3QyAoMTAzNjQpIExvYzogKzB4Mzc2MCAgICB8IG9mZnNldCB0byBmaWVsZCBgZGVjbGFyYXRpb25fZmlsZWAgKHN0cmluZykKKwordmVjdG9yIChyZWZsZWN0aW9uLk9iamVjdC5kb2N1bWVudGF0aW9uKToKKyAgKzB4MEVFOCB8IDAxIDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgfCAweDAwMDAwMDAxICgxKSAgICAgICAgICAgICAgICAgICAgIHwgbGVuZ3RoIG9mIHZlY3RvciAoIyBpdGVtcykKKyAgKzB4MEVFQyB8IDA0IDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMDA0ICg0KSBMb2M6ICsweDBFRjAgICAgICAgIHwgb2Zmc2V0IHRvIHN0cmluZ1swXQorCitzdHJpbmcgKHJlZmxlY3Rpb24uT2JqZWN0LmRvY3VtZW50YXRpb24pOgorICArMHgwRUYwIHwgMzMgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICB8IDB4MDAwMDAwMzMgKDUxKSAgICAgICAgICAgICAgICAgICAgfCBsZW5ndGggb2Ygc3RyaW5nCisgICsweDBFRjQgfCAyMCA2MSA2RSAyMCA2NSA3OCA2MSA2RCB8IGNoYXJbNTFdICAgIHwgIGFuIGV4YW0gICAgICAgICAgICAgICAgICAgICAgICAgICB8IHN0cmluZyBsaXRlcmFsCisgICsweDBFRkMgfCA3MCA2QyA2NSAyMCA2NCA2RiA2MyA3NSB8ICAgICAgICAgICAgIHwgcGxlIGRvY3UKKyAgKzB4MEYwNCB8IDZEIDY1IDZFIDc0IDYxIDc0IDY5IDZGIHwgICAgICAgICAgICAgfCBtZW50YXRpbworICArMHgwRjBDIHwgNkUgMjAgNjMgNkYgNkQgNkQgNjUgNkUgfCAgICAgICAgICAgICB8IG4gY29tbWVuCisgICsweDBGMTQgfCA3NCAzQSAyMCAyMiA2RCA2RiA2RSA3MyB8ICAgICAgICAgICAgIHwgdDogIm1vbnMKKyAgKzB4MEYxQyB8IDc0IDY1IDcyIDIwIDZGIDYyIDZBIDY1IHwgICAgICAgICAgICAgfCB0ZXIgb2JqZQorICArMHgwRjI0IHwgNjMgNzQgMjIgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICB8IGN0IgorICArMHgwRjI3IHwgMDAgICAgICAgICAgICAgICAgICAgICAgfCBjaGFyICAgICAgICB8IDB4MDAgKDApICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJpbmcgdGVybWluYXRvcgorCit2ZWN0b3IgKHJlZmxlY3Rpb24uT2JqZWN0LmZpZWxkcyk6CisgICsweDBGMjggfCAzNiAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgIHwgMHgwMDAwMDAzNiAoNTQpICAgICAgICAgICAgICAgICAgICB8IGxlbmd0aCBvZiB2ZWN0b3IgKCMgaXRlbXMpCisgICsweDBGMkMgfCA4MCAwNCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDQ4MCAoMTE1MikgTG9jOiArMHgxM0FDICAgICB8IG9mZnNldCB0byB0YWJsZVswXQorICArMHgwRjMwIHwgRTQgMDQgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDA0RTQgKDEyNTIpIExvYzogKzB4MTQxNCAgICAgfCBvZmZzZXQgdG8gdGFibGVbMV0KKyAgKzB4MEYzNCB8IDRDIDA1IDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwNTRDICgxMzU2KSBMb2M6ICsweDE0ODAgICAgIHwgb2Zmc2V0IHRvIHRhYmxlWzJdCisgICsweDBGMzggfCBBQyAwNSAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDVBQyAoMTQ1MikgTG9jOiArMHgxNEU0ICAgICB8IG9mZnNldCB0byB0YWJsZVszXQorICArMHgwRjNDIHwgQTggMDkgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDA5QTggKDI0NzIpIExvYzogKzB4MThFNCAgICAgfCBvZmZzZXQgdG8gdGFibGVbNF0KKyAgKzB4MEY0MCB8IDc4IDFCIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAxQjc4ICg3MDMyKSBMb2M6ICsweDJBQjggICAgIHwgb2Zmc2V0IHRvIHRhYmxlWzVdCisgICsweDBGNDQgfCA4OCAxOCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMTg4OCAoNjI4MCkgTG9jOiArMHgyN0NDICAgICB8IG9mZnNldCB0byB0YWJsZVs2XQorICArMHgwRjQ4IHwgNDQgMEYgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDBGNDQgKDM5MDgpIExvYzogKzB4MUU4QyAgICAgfCBvZmZzZXQgdG8gdGFibGVbN10KKyAgKzB4MEY0QyB8IDdDIDFDIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAxQzdDICg3MjkyKSBMb2M6ICsweDJCQzggICAgIHwgb2Zmc2V0IHRvIHRhYmxlWzhdCisgICsweDBGNTAgfCBDMCAxRCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMURDMCAoNzYxNikgTG9jOiArMHgyRDEwICAgICB8IG9mZnNldCB0byB0YWJsZVs5XQorICArMHgwRjU0IHwgRUMgMUIgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDFCRUMgKDcxNDgpIExvYzogKzB4MkI0MCAgICAgfCBvZmZzZXQgdG8gdGFibGVbMTBdCisgICsweDBGNTggfCA0NCAwMSAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDE0NCAoMzI0KSBMb2M6ICsweDEwOUMgICAgICB8IG9mZnNldCB0byB0YWJsZVsxMV0KKyAgKzB4MEY1QyB8IEM0IDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMEM0ICgxOTYpIExvYzogKzB4MTAyMCAgICAgIHwgb2Zmc2V0IHRvIHRhYmxlWzEyXQorICArMHgwRjYwIHwgMzAgMUUgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDFFMzAgKDc3MjgpIExvYzogKzB4MkQ5MCAgICAgfCBvZmZzZXQgdG8gdGFibGVbMTNdCisgICsweDBGNjQgfCAzMCAxRCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMUQzMCAoNzQ3MikgTG9jOiArMHgyQzk0ICAgICB8IG9mZnNldCB0byB0YWJsZVsxNF0KKyAgKzB4MEY2OCB8IEE4IDAxIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMUE4ICg0MjQpIExvYzogKzB4MTExMCAgICAgIHwgb2Zmc2V0IHRvIHRhYmxlWzE1XQorICArMHgwRjZDIHwgMTAgMDcgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDA3MTAgKDE4MDgpIExvYzogKzB4MTY3QyAgICAgfCBvZmZzZXQgdG8gdGFibGVbMTZdCisgICsweDBGNzAgfCA4MCAwRCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMEQ4MCAoMzQ1NikgTG9jOiArMHgxQ0YwICAgICB8IG9mZnNldCB0byB0YWJsZVsxN10KKyAgKzB4MEY3NCB8IEEwIDFFIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAxRUEwICg3ODQwKSBMb2M6ICsweDJFMTQgICAgIHwgb2Zmc2V0IHRvIHRhYmxlWzE4XQorICArMHgwRjc4IHwgMkMgMDIgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDAyMkMgKDU1NikgTG9jOiArMHgxMUE0ICAgICAgfCBvZmZzZXQgdG8gdGFibGVbMTldCisgICsweDBGN0MgfCA1QyAwMyAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDM1QyAoODYwKSBMb2M6ICsweDEyRDggICAgICB8IG9mZnNldCB0byB0YWJsZVsyMF0KKyAgKzB4MEY4MCB8IDA4IDBDIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwQzA4ICgzMDgwKSBMb2M6ICsweDFCODggICAgIHwgb2Zmc2V0IHRvIHRhYmxlWzIxXQorICArMHgwRjg0IHwgNTggMUEgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDFBNTggKDY3NDQpIExvYzogKzB4MjlEQyAgICAgfCBvZmZzZXQgdG8gdGFibGVbMjJdCisgICsweDBGODggfCBFNCAxOSAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMTlFNCAoNjYyOCkgTG9jOiArMHgyOTZDICAgICB8IG9mZnNldCB0byB0YWJsZVsyM10KKyAgKzB4MEY4QyB8IEEwIDBFIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwRUEwICgzNzQ0KSBMb2M6ICsweDFFMkMgICAgIHwgb2Zmc2V0IHRvIHRhYmxlWzI0XQorICArMHgwRjkwIHwgQzQgMUEgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDFBQzQgKDY4NTIpIExvYzogKzB4MkE1NCAgICAgfCBvZmZzZXQgdG8gdGFibGVbMjVdCisgICsweDBGOTQgfCA5MCAxMSAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMTE5MCAoNDQ5NikgTG9jOiArMHgyMTI0ICAgICB8IG9mZnNldCB0byB0YWJsZVsyNl0KKyAgKzB4MEY5OCB8IDc4IDBGIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwRjc4ICgzOTYwKSBMb2M6ICsweDFGMTAgICAgIHwgb2Zmc2V0IHRvIHRhYmxlWzI3XQorICArMHgwRjlDIHwgNjggMTkgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDE5NjggKDY1MDQpIExvYzogKzB4MjkwNCAgICAgfCBvZmZzZXQgdG8gdGFibGVbMjhdCisgICsweDBGQTAgfCBFMCAwRiAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMEZFMCAoNDA2NCkgTG9jOiArMHgxRjgwICAgICB8IG9mZnNldCB0byB0YWJsZVsyOV0KKyAgKzB4MEZBNCB8IDg4IDE4IDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAxODg4ICg2MjgwKSBMb2M6ICsweDI4MkMgICAgIHwgb2Zmc2V0IHRvIHRhYmxlWzMwXQorICArMHgwRkE4IHwgQzAgMTYgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDE2QzAgKDU4MjQpIExvYzogKzB4MjY2OCAgICAgfCBvZmZzZXQgdG8gdGFibGVbMzFdCisgICsweDBGQUMgfCAxQyAxNyAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMTcxQyAoNTkxNikgTG9jOiArMHgyNkM4ICAgICB8IG9mZnNldCB0byB0YWJsZVszMl0KKyAgKzB4MEZCMCB8IDEwIDExIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAxMTEwICg0MzY4KSBMb2M6ICsweDIwQzAgICAgIHwgb2Zmc2V0IHRvIHRhYmxlWzMzXQorICArMHgwRkI0IHwgOEMgMTAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDEwOEMgKDQyMzYpIExvYzogKzB4MjA0MCAgICAgfCBvZmZzZXQgdG8gdGFibGVbMzRdCisgICsweDBGQjggfCAzMCAxMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMTAzMCAoNDE0NCkgTG9jOiArMHgxRkU4ICAgICB8IG9mZnNldCB0byB0YWJsZVszNV0KKyAgKzB4MEZCQyB8IDIwIDE2IDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAxNjIwICg1NjY0KSBMb2M6ICsweDI1REMgICAgIHwgb2Zmc2V0IHRvIHRhYmxlWzM2XQorICArMHgwRkMwIHwgRTAgMTMgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDEzRTAgKDUwODgpIExvYzogKzB4MjNBMCAgICAgfCBvZmZzZXQgdG8gdGFibGVbMzddCisgICsweDBGQzQgfCBGQyAxNCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMTRGQyAoNTM3MikgTG9jOiArMHgyNEMwICAgICB8IG9mZnNldCB0byB0YWJsZVszOF0KKyAgKzB4MEZDOCB8IDU4IDEyIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAxMjU4ICg0Njk2KSBMb2M6ICsweDIyMjAgICAgIHwgb2Zmc2V0IHRvIHRhYmxlWzM5XQorICArMHgwRkNDIHwgODQgMTUgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDE1ODQgKDU1MDgpIExvYzogKzB4MjU1MCAgICAgfCBvZmZzZXQgdG8gdGFibGVbNDBdCisgICsweDBGRDAgfCBFNCAxMiAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMTJFNCAoNDgzNikgTG9jOiArMHgyMkI0ICAgICB8IG9mZnNldCB0byB0YWJsZVs0MV0KKyAgKzB4MEZENCB8IDVDIDE0IDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAxNDVDICg1MjEyKSBMb2M6ICsweDI0MzAgICAgIHwgb2Zmc2V0IHRvIHRhYmxlWzQyXQorICArMHgwRkQ4IHwgQjQgMTEgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDExQjQgKDQ1MzIpIExvYzogKzB4MjE4QyAgICAgfCBvZmZzZXQgdG8gdGFibGVbNDNdCisgICsweDBGREMgfCA1MCAxNyAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMTc1MCAoNTk2OCkgTG9jOiArMHgyNzJDICAgICB8IG9mZnNldCB0byB0YWJsZVs0NF0KKyAgKzB4MEZFMCB8IDM4IDAyIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMjM4ICg1NjgpIExvYzogKzB4MTIxOCAgICAgIHwgb2Zmc2V0IHRvIHRhYmxlWzQ1XQorICArMHgwRkU0IHwgQzAgMDcgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDA3QzAgKDE5ODQpIExvYzogKzB4MTdBNCAgICAgfCBvZmZzZXQgdG8gdGFibGVbNDZdCisgICsweDBGRTggfCA3OCAwRCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMEQ3OCAoMzQ0OCkgTG9jOiArMHgxRDYwICAgICB8IG9mZnNldCB0byB0YWJsZVs0N10KKyAgKzB4MEZFQyB8IDU4IDAzIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMzU4ICg4NTYpIExvYzogKzB4MTM0NCAgICAgIHwgb2Zmc2V0IHRvIHRhYmxlWzQ4XQorICArMHgwRkYwIHwgRDggMEQgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDBERDggKDM1NDQpIExvYzogKzB4MURDOCAgICAgfCBvZmZzZXQgdG8gdGFibGVbNDldCisgICsweDBGRjQgfCA1OCAwNSAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDU1OCAoMTM2OCkgTG9jOiArMHgxNTRDICAgICB8IG9mZnNldCB0byB0YWJsZVs1MF0KKyAgKzB4MEZGOCB8IDg4IDBDIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwQzg4ICgzMjA4KSBMb2M6ICsweDFDODAgICAgIHwgb2Zmc2V0IHRvIHRhYmxlWzUxXQorICArMHgwRkZDIHwgREMgMDkgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDA5REMgKDI1MjQpIExvYzogKzB4MTlEOCAgICAgfCBvZmZzZXQgdG8gdGFibGVbNTJdCisgICsweDEwMDAgfCA4QyAwQSAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMEE4QyAoMjcwMCkgTG9jOiArMHgxQThDICAgICB8IG9mZnNldCB0byB0YWJsZVs1M10KKworc3RyaW5nIChyZWZsZWN0aW9uLk9iamVjdC5uYW1lKToKKyAgKzB4MTAwNCB8IDE2IDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgfCAweDAwMDAwMDE2ICgyMikgICAgICAgICAgICAgICAgICAgIHwgbGVuZ3RoIG9mIHN0cmluZworICArMHgxMDA4IHwgNEQgNzkgNDcgNjEgNkQgNjUgMkUgNDUgfCBjaGFyWzIyXSAgICB8IE15R2FtZS5FICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJpbmcgbGl0ZXJhbAorICArMHgxMDEwIHwgNzggNjEgNkQgNzAgNkMgNjUgMkUgNEQgfCAgICAgICAgICAgICB8IHhhbXBsZS5NCisgICsweDEwMTggfCA2RiA2RSA3MyA3NCA2NSA3MiAgICAgICB8ICAgICAgICAgICAgIHwgb25zdGVyCisgICsweDEwMUUgfCAwMCAgICAgICAgICAgICAgICAgICAgICB8IGNoYXIgICAgICAgIHwgMHgwMCAoMCkgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHN0cmluZyB0ZXJtaW5hdG9yCisKK3RhYmxlIChyZWZsZWN0aW9uLkZpZWxkKToKKyAgKzB4MTAyMCB8IDYyIEZEIEZGIEZGICAgICAgICAgICAgIHwgU09mZnNldDMyICAgfCAweEZGRkZGRDYyICgtNjcwKSBMb2M6ICsweDEyQkUgICAgIHwgb2Zmc2V0IHRvIHZ0YWJsZQorICArMHgxMDI0IHwgMzUgMDAgICAgICAgICAgICAgICAgICAgfCB1aW50MTZfdCAgICB8IDB4MDAzNSAoNTMpICAgICAgICAgICAgICAgICAgICAgICAgfCB0YWJsZSBmaWVsZCBgaWRgIChVU2hvcnQpCisgICsweDEwMjYgfCA2RSAwMCAgICAgICAgICAgICAgICAgICB8IHVpbnQxNl90ICAgIHwgMHgwMDZFICgxMTApICAgICAgICAgICAgICAgICAgICAgICB8IHRhYmxlIGZpZWxkIGBvZmZzZXRgIChVU2hvcnQpCisgICsweDEwMjggfCA1NCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDA1NCAoODQpIExvYzogKzB4MTA3QyAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgbmFtZWAgKHN0cmluZykKKyAgKzB4MTAyQyB8IDNDIDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMDNDICg2MCkgTG9jOiArMHgxMDY4ICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGB0eXBlYCAodGFibGUpCisgICsweDEwMzAgfCAxNCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDAxNCAoMjApIExvYzogKzB4MTA0NCAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgYXR0cmlidXRlc2AgKHZlY3RvcikKKyAgKzB4MTAzNCB8IDBDIDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMDBDICgxMikgTG9jOiArMHgxMDQwICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBkb2N1bWVudGF0aW9uYCAodmVjdG9yKQorICArMHgxMDM4IHwgMDIgMDAgMDAgMDAgMDAgMDAgMDAgMDAgfCBpbnQ2NF90ICAgICB8IDB4MDAwMDAwMDAwMDAwMDAwMiAoMikgICAgICAgICAgICAgfCB0YWJsZSBmaWVsZCBgZGVmYXVsdF9pbnRlZ2VyYCAoTG9uZykKKwordmVjdG9yIChyZWZsZWN0aW9uLkZpZWxkLmRvY3VtZW50YXRpb24pOgorICArMHgxMDQwIHwgMDAgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICB8IDB4MDAwMDAwMDAgKDApICAgICAgICAgICAgICAgICAgICAgfCBsZW5ndGggb2YgdmVjdG9yICgjIGl0ZW1zKQorCit2ZWN0b3IgKHJlZmxlY3Rpb24uRmllbGQuYXR0cmlidXRlcyk6CisgICsweDEwNDQgfCAwMSAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgIHwgMHgwMDAwMDAwMSAoMSkgICAgICAgICAgICAgICAgICAgICB8IGxlbmd0aCBvZiB2ZWN0b3IgKCMgaXRlbXMpCisgICsweDEwNDggfCAwNCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDAwNCAoNCkgTG9jOiArMHgxMDRDICAgICAgICB8IG9mZnNldCB0byB0YWJsZVswXQorCit0YWJsZSAocmVmbGVjdGlvbi5LZXlWYWx1ZSk6CisgICsweDEwNEMgfCBFOCBEQSBGRiBGRiAgICAgICAgICAgICB8IFNPZmZzZXQzMiAgIHwgMHhGRkZGREFFOCAoLTk0OTYpIExvYzogKzB4MzU2NCAgICB8IG9mZnNldCB0byB2dGFibGUKKyAgKzB4MTA1MCB8IDEwIDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMDEwICgxNikgTG9jOiArMHgxMDYwICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBrZXlgIChzdHJpbmcpCisgICsweDEwNTQgfCAwNCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDAwNCAoNCkgTG9jOiArMHgxMDU4ICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgdmFsdWVgIChzdHJpbmcpCisKK3N0cmluZyAocmVmbGVjdGlvbi5LZXlWYWx1ZS52YWx1ZSk6CisgICsweDEwNTggfCAwMiAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgIHwgMHgwMDAwMDAwMiAoMikgICAgICAgICAgICAgICAgICAgICB8IGxlbmd0aCBvZiBzdHJpbmcKKyAgKzB4MTA1QyB8IDM1IDMzICAgICAgICAgICAgICAgICAgIHwgY2hhclsyXSAgICAgfCA1MyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nIGxpdGVyYWwKKyAgKzB4MTA1RSB8IDAwICAgICAgICAgICAgICAgICAgICAgIHwgY2hhciAgICAgICAgfCAweDAwICgwKSAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nIHRlcm1pbmF0b3IKKworc3RyaW5nIChyZWZsZWN0aW9uLktleVZhbHVlLmtleSk6CisgICsweDEwNjAgfCAwMiAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgIHwgMHgwMDAwMDAwMiAoMikgICAgICAgICAgICAgICAgICAgICB8IGxlbmd0aCBvZiBzdHJpbmcKKyAgKzB4MTA2NCB8IDY5IDY0ICAgICAgICAgICAgICAgICAgIHwgY2hhclsyXSAgICAgfCBpZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nIGxpdGVyYWwKKyAgKzB4MTA2NiB8IDAwICAgICAgICAgICAgICAgICAgICAgIHwgY2hhciAgICAgICAgfCAweDAwICgwKSAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nIHRlcm1pbmF0b3IKKwordGFibGUgKHJlZmxlY3Rpb24uVHlwZSk6CisgICsweDEwNjggfCA2NCBEQSBGRiBGRiAgICAgICAgICAgICB8IFNPZmZzZXQzMiAgIHwgMHhGRkZGREE2NCAoLTk2MjgpIExvYzogKzB4MzYwNCAgICB8IG9mZnNldCB0byB2dGFibGUKKyAgKzB4MTA2QyB8IDAwIDAwIDAwICAgICAgICAgICAgICAgIHwgdWludDhfdFszXSAgfCAuLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgcGFkZGluZworICArMHgxMDZGIHwgMEEgICAgICAgICAgICAgICAgICAgICAgfCB1aW50OF90ICAgICB8IDB4MEEgKDEwKSAgICAgICAgICAgICAgICAgICAgICAgICAgfCB0YWJsZSBmaWVsZCBgYmFzZV90eXBlYCAoQnl0ZSkKKyAgKzB4MTA3MCB8IDA0IDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgfCAweDAwMDAwMDA0ICg0KSAgICAgICAgICAgICAgICAgICAgIHwgdGFibGUgZmllbGQgYGluZGV4YCAoSW50KQorICArMHgxMDc0IHwgMDggMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICB8IDB4MDAwMDAwMDggKDgpICAgICAgICAgICAgICAgICAgICAgfCB0YWJsZSBmaWVsZCBgYmFzZV9zaXplYCAoVUludCkKKyAgKzB4MTA3OCB8IDAxIDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgfCAweDAwMDAwMDAxICgxKSAgICAgICAgICAgICAgICAgICAgIHwgdGFibGUgZmllbGQgYGVsZW1lbnRfc2l6ZWAgKFVJbnQpCisKK3N0cmluZyAocmVmbGVjdGlvbi5GaWVsZC5uYW1lKToKKyAgKzB4MTA3QyB8IDE4IDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgfCAweDAwMDAwMDE4ICgyNCkgICAgICAgICAgICAgICAgICAgIHwgbGVuZ3RoIG9mIHN0cmluZworICArMHgxMDgwIHwgNkMgNkYgNkUgNjcgNUYgNjUgNkUgNzUgfCBjaGFyWzI0XSAgICB8IGxvbmdfZW51ICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJpbmcgbGl0ZXJhbAorICArMHgxMDg4IHwgNkQgNUYgNkUgNkYgNzIgNkQgNjEgNkMgfCAgICAgICAgICAgICB8IG1fbm9ybWFsCisgICsweDEwOTAgfCA1RiA2NCA2NSA2NiA2MSA3NSA2QyA3NCB8ICAgICAgICAgICAgIHwgX2RlZmF1bHQKKyAgKzB4MTA5OCB8IDAwICAgICAgICAgICAgICAgICAgICAgIHwgY2hhciAgICAgICAgfCAweDAwICgwKSAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nIHRlcm1pbmF0b3IKKworcGFkZGluZzoKKyAgKzB4MTA5OSB8IDAwIDAwIDAwICAgICAgICAgICAgICAgIHwgdWludDhfdFszXSAgfCAuLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgcGFkZGluZworCit0YWJsZSAocmVmbGVjdGlvbi5GaWVsZCk6CisgICsweDEwOUMgfCA2MiBFNiBGRiBGRiAgICAgICAgICAgICB8IFNPZmZzZXQzMiAgIHwgMHhGRkZGRTY2MiAoLTY1NTgpIExvYzogKzB4MkEzQSAgICB8IG9mZnNldCB0byB2dGFibGUKKyAgKzB4MTBBMCB8IDM0IDAwICAgICAgICAgICAgICAgICAgIHwgdWludDE2X3QgICAgfCAweDAwMzQgKDUyKSAgICAgICAgICAgICAgICAgICAgICAgIHwgdGFibGUgZmllbGQgYGlkYCAoVVNob3J0KQorICArMHgxMEEyIHwgNkMgMDAgICAgICAgICAgICAgICAgICAgfCB1aW50MTZfdCAgICB8IDB4MDA2QyAoMTA4KSAgICAgICAgICAgICAgICAgICAgICAgfCB0YWJsZSBmaWVsZCBgb2Zmc2V0YCAoVVNob3J0KQorICArMHgxMEE0IHwgNEMgMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDAwNEMgKDc2KSBMb2M6ICsweDEwRjAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYG5hbWVgIChzdHJpbmcpCisgICsweDEwQTggfCAzNCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDAzNCAoNTIpIExvYzogKzB4MTBEQyAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgdHlwZWAgKHRhYmxlKQorICArMHgxMEFDIHwgMEMgMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDAwMEMgKDEyKSBMb2M6ICsweDEwQjggICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYGF0dHJpYnV0ZXNgICh2ZWN0b3IpCisgICsweDEwQjAgfCAwNCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDAwNCAoNCkgTG9jOiArMHgxMEI0ICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgZG9jdW1lbnRhdGlvbmAgKHZlY3RvcikKKwordmVjdG9yIChyZWZsZWN0aW9uLkZpZWxkLmRvY3VtZW50YXRpb24pOgorICArMHgxMEI0IHwgMDAgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICB8IDB4MDAwMDAwMDAgKDApICAgICAgICAgICAgICAgICAgICAgfCBsZW5ndGggb2YgdmVjdG9yICgjIGl0ZW1zKQorCit2ZWN0b3IgKHJlZmxlY3Rpb24uRmllbGQuYXR0cmlidXRlcyk6CisgICsweDEwQjggfCAwMSAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgIHwgMHgwMDAwMDAwMSAoMSkgICAgICAgICAgICAgICAgICAgICB8IGxlbmd0aCBvZiB2ZWN0b3IgKCMgaXRlbXMpCisgICsweDEwQkMgfCAwNCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDAwNCAoNCkgTG9jOiArMHgxMEMwICAgICAgICB8IG9mZnNldCB0byB0YWJsZVswXQorCit0YWJsZSAocmVmbGVjdGlvbi5LZXlWYWx1ZSk6CisgICsweDEwQzAgfCA1QyBEQiBGRiBGRiAgICAgICAgICAgICB8IFNPZmZzZXQzMiAgIHwgMHhGRkZGREI1QyAoLTkzODApIExvYzogKzB4MzU2NCAgICB8IG9mZnNldCB0byB2dGFibGUKKyAgKzB4MTBDNCB8IDEwIDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMDEwICgxNikgTG9jOiArMHgxMEQ0ICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBrZXlgIChzdHJpbmcpCisgICsweDEwQzggfCAwNCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDAwNCAoNCkgTG9jOiArMHgxMENDICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgdmFsdWVgIChzdHJpbmcpCisKK3N0cmluZyAocmVmbGVjdGlvbi5LZXlWYWx1ZS52YWx1ZSk6CisgICsweDEwQ0MgfCAwMiAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgIHwgMHgwMDAwMDAwMiAoMikgICAgICAgICAgICAgICAgICAgICB8IGxlbmd0aCBvZiBzdHJpbmcKKyAgKzB4MTBEMCB8IDM1IDMyICAgICAgICAgICAgICAgICAgIHwgY2hhclsyXSAgICAgfCA1MiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nIGxpdGVyYWwKKyAgKzB4MTBEMiB8IDAwICAgICAgICAgICAgICAgICAgICAgIHwgY2hhciAgICAgICAgfCAweDAwICgwKSAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nIHRlcm1pbmF0b3IKKworc3RyaW5nIChyZWZsZWN0aW9uLktleVZhbHVlLmtleSk6CisgICsweDEwRDQgfCAwMiAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgIHwgMHgwMDAwMDAwMiAoMikgICAgICAgICAgICAgICAgICAgICB8IGxlbmd0aCBvZiBzdHJpbmcKKyAgKzB4MTBEOCB8IDY5IDY0ICAgICAgICAgICAgICAgICAgIHwgY2hhclsyXSAgICAgfCBpZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nIGxpdGVyYWwKKyAgKzB4MTBEQSB8IDAwICAgICAgICAgICAgICAgICAgICAgIHwgY2hhciAgICAgICAgfCAweDAwICgwKSAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nIHRlcm1pbmF0b3IKKwordGFibGUgKHJlZmxlY3Rpb24uVHlwZSk6CisgICsweDEwREMgfCBEOCBEQSBGRiBGRiAgICAgICAgICAgICB8IFNPZmZzZXQzMiAgIHwgMHhGRkZGREFEOCAoLTk1MTIpIExvYzogKzB4MzYwNCAgICB8IG9mZnNldCB0byB2dGFibGUKKyAgKzB4MTBFMCB8IDAwIDAwIDAwICAgICAgICAgICAgICAgIHwgdWludDhfdFszXSAgfCAuLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgcGFkZGluZworICArMHgxMEUzIHwgMEEgICAgICAgICAgICAgICAgICAgICAgfCB1aW50OF90ICAgICB8IDB4MEEgKDEwKSAgICAgICAgICAgICAgICAgICAgICAgICAgfCB0YWJsZSBmaWVsZCBgYmFzZV90eXBlYCAoQnl0ZSkKKyAgKzB4MTBFNCB8IDA0IDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgfCAweDAwMDAwMDA0ICg0KSAgICAgICAgICAgICAgICAgICAgIHwgdGFibGUgZmllbGQgYGluZGV4YCAoSW50KQorICArMHgxMEU4IHwgMDggMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICB8IDB4MDAwMDAwMDggKDgpICAgICAgICAgICAgICAgICAgICAgfCB0YWJsZSBmaWVsZCBgYmFzZV9zaXplYCAoVUludCkKKyAgKzB4MTBFQyB8IDAxIDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgfCAweDAwMDAwMDAxICgxKSAgICAgICAgICAgICAgICAgICAgIHwgdGFibGUgZmllbGQgYGVsZW1lbnRfc2l6ZWAgKFVJbnQpCisKK3N0cmluZyAocmVmbGVjdGlvbi5GaWVsZC5uYW1lKToKKyAgKzB4MTBGMCB8IDFBIDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgfCAweDAwMDAwMDFBICgyNikgICAgICAgICAgICAgICAgICAgIHwgbGVuZ3RoIG9mIHN0cmluZworICArMHgxMEY0IHwgNkMgNkYgNkUgNjcgNUYgNjUgNkUgNzUgfCBjaGFyWzI2XSAgICB8IGxvbmdfZW51ICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJpbmcgbGl0ZXJhbAorICArMHgxMEZDIHwgNkQgNUYgNkUgNkYgNkUgNUYgNjUgNkUgfCAgICAgICAgICAgICB8IG1fbm9uX2VuCisgICsweDExMDQgfCA3NSA2RCA1RiA2NCA2NSA2NiA2MSA3NSB8ICAgICAgICAgICAgIHwgdW1fZGVmYXUKKyAgKzB4MTEwQyB8IDZDIDc0ICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgfCBsdAorICArMHgxMTBFIHwgMDAgICAgICAgICAgICAgICAgICAgICAgfCBjaGFyICAgICAgICB8IDB4MDAgKDApICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJpbmcgdGVybWluYXRvcgorCit0YWJsZSAocmVmbGVjdGlvbi5GaWVsZCk6CisgICsweDExMTAgfCBFQyBFNSBGRiBGRiAgICAgICAgICAgICB8IFNPZmZzZXQzMiAgIHwgMHhGRkZGRTVFQyAoLTY2NzYpIExvYzogKzB4MkIyNCAgICB8IG9mZnNldCB0byB2dGFibGUKKyAgKzB4MTExNCB8IDAwIDAwIDAwICAgICAgICAgICAgICAgIHwgdWludDhfdFszXSAgfCAuLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgcGFkZGluZworICArMHgxMTE3IHwgMDEgICAgICAgICAgICAgICAgICAgICAgfCB1aW50OF90ICAgICB8IDB4MDEgKDEpICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB0YWJsZSBmaWVsZCBgb3B0aW9uYWxgIChCb29sKQorICArMHgxMTE4IHwgMzMgMDAgICAgICAgICAgICAgICAgICAgfCB1aW50MTZfdCAgICB8IDB4MDAzMyAoNTEpICAgICAgICAgICAgICAgICAgICAgICAgfCB0YWJsZSBmaWVsZCBgaWRgIChVU2hvcnQpCisgICsweDExMUEgfCA2QSAwMCAgICAgICAgICAgICAgICAgICB8IHVpbnQxNl90ICAgIHwgMHgwMDZBICgxMDYpICAgICAgICAgICAgICAgICAgICAgICB8IHRhYmxlIGZpZWxkIGBvZmZzZXRgIChVU2hvcnQpCisgICsweDExMUMgfCA3NCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDA3NCAoMTE2KSBMb2M6ICsweDExOTAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgbmFtZWAgKHN0cmluZykKKyAgKzB4MTEyMCB8IDYwIDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMDYwICg5NikgTG9jOiArMHgxMTgwICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGB0eXBlYCAodGFibGUpCisgICsweDExMjQgfCAwQyAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDAwQyAoMTIpIExvYzogKzB4MTEzMCAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgYXR0cmlidXRlc2AgKHZlY3RvcikKKyAgKzB4MTEyOCB8IDA0IDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMDA0ICg0KSBMb2M6ICsweDExMkMgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBkb2N1bWVudGF0aW9uYCAodmVjdG9yKQorCit2ZWN0b3IgKHJlZmxlY3Rpb24uRmllbGQuZG9jdW1lbnRhdGlvbik6CisgICsweDExMkMgfCAwMCAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgIHwgMHgwMDAwMDAwMCAoMCkgICAgICAgICAgICAgICAgICAgICB8IGxlbmd0aCBvZiB2ZWN0b3IgKCMgaXRlbXMpCisKK3ZlY3RvciAocmVmbGVjdGlvbi5GaWVsZC5hdHRyaWJ1dGVzKToKKyAgKzB4MTEzMCB8IDAyIDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgfCAweDAwMDAwMDAyICgyKSAgICAgICAgICAgICAgICAgICAgIHwgbGVuZ3RoIG9mIHZlY3RvciAoIyBpdGVtcykKKyAgKzB4MTEzNCB8IDMwIDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMDMwICg0OCkgTG9jOiArMHgxMTY0ICAgICAgIHwgb2Zmc2V0IHRvIHRhYmxlWzBdCisgICsweDExMzggfCAwNCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDAwNCAoNCkgTG9jOiArMHgxMTNDICAgICAgICB8IG9mZnNldCB0byB0YWJsZVsxXQorCit0YWJsZSAocmVmbGVjdGlvbi5LZXlWYWx1ZSk6CisgICsweDExM0MgfCBEOCBEQiBGRiBGRiAgICAgICAgICAgICB8IFNPZmZzZXQzMiAgIHwgMHhGRkZGREJEOCAoLTkyNTYpIExvYzogKzB4MzU2NCAgICB8IG9mZnNldCB0byB2dGFibGUKKyAgKzB4MTE0MCB8IDEwIDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMDEwICgxNikgTG9jOiArMHgxMTUwICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBrZXlgIChzdHJpbmcpCisgICsweDExNDQgfCAwNCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDAwNCAoNCkgTG9jOiArMHgxMTQ4ICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgdmFsdWVgIChzdHJpbmcpCisKK3N0cmluZyAocmVmbGVjdGlvbi5LZXlWYWx1ZS52YWx1ZSk6CisgICsweDExNDggfCAwMSAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgIHwgMHgwMDAwMDAwMSAoMSkgICAgICAgICAgICAgICAgICAgICB8IGxlbmd0aCBvZiBzdHJpbmcKKyAgKzB4MTE0QyB8IDMwICAgICAgICAgICAgICAgICAgICAgIHwgY2hhclsxXSAgICAgfCAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nIGxpdGVyYWwKKyAgKzB4MTE0RCB8IDAwICAgICAgICAgICAgICAgICAgICAgIHwgY2hhciAgICAgICAgfCAweDAwICgwKSAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nIHRlcm1pbmF0b3IKKworcGFkZGluZzoKKyAgKzB4MTE0RSB8IDAwIDAwICAgICAgICAgICAgICAgICAgIHwgdWludDhfdFsyXSAgfCAuLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgcGFkZGluZworCitzdHJpbmcgKHJlZmxlY3Rpb24uS2V5VmFsdWUua2V5KToKKyAgKzB4MTE1MCB8IDBEIDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgfCAweDAwMDAwMDBEICgxMykgICAgICAgICAgICAgICAgICAgIHwgbGVuZ3RoIG9mIHN0cmluZworICArMHgxMTU0IHwgNkUgNjEgNzQgNjkgNzYgNjUgNUYgNjkgfCBjaGFyWzEzXSAgICB8IG5hdGl2ZV9pICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJpbmcgbGl0ZXJhbAorICArMHgxMTVDIHwgNkUgNkMgNjkgNkUgNjUgICAgICAgICAgfCAgICAgICAgICAgICB8IG5saW5lCisgICsweDExNjEgfCAwMCAgICAgICAgICAgICAgICAgICAgICB8IGNoYXIgICAgICAgIHwgMHgwMCAoMCkgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHN0cmluZyB0ZXJtaW5hdG9yCisKK3BhZGRpbmc6CisgICsweDExNjIgfCAwMCAwMCAgICAgICAgICAgICAgICAgICB8IHVpbnQ4X3RbMl0gIHwgLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHBhZGRpbmcKKwordGFibGUgKHJlZmxlY3Rpb24uS2V5VmFsdWUpOgorICArMHgxMTY0IHwgMDAgREMgRkYgRkYgICAgICAgICAgICAgfCBTT2Zmc2V0MzIgICB8IDB4RkZGRkRDMDAgKC05MjE2KSBMb2M6ICsweDM1NjQgICAgfCBvZmZzZXQgdG8gdnRhYmxlCisgICsweDExNjggfCAxMCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDAxMCAoMTYpIExvYzogKzB4MTE3OCAgICAgICB8IG9mZnNldCB0byBmaWVsZCBga2V5YCAoc3RyaW5nKQorICArMHgxMTZDIHwgMDQgMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDAwMDQgKDQpIExvYzogKzB4MTE3MCAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYHZhbHVlYCAoc3RyaW5nKQorCitzdHJpbmcgKHJlZmxlY3Rpb24uS2V5VmFsdWUudmFsdWUpOgorICArMHgxMTcwIHwgMDIgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICB8IDB4MDAwMDAwMDIgKDIpICAgICAgICAgICAgICAgICAgICAgfCBsZW5ndGggb2Ygc3RyaW5nCisgICsweDExNzQgfCAzNSAzMSAgICAgICAgICAgICAgICAgICB8IGNoYXJbMl0gICAgIHwgNTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHN0cmluZyBsaXRlcmFsCisgICsweDExNzYgfCAwMCAgICAgICAgICAgICAgICAgICAgICB8IGNoYXIgICAgICAgIHwgMHgwMCAoMCkgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHN0cmluZyB0ZXJtaW5hdG9yCisKK3N0cmluZyAocmVmbGVjdGlvbi5LZXlWYWx1ZS5rZXkpOgorICArMHgxMTc4IHwgMDIgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICB8IDB4MDAwMDAwMDIgKDIpICAgICAgICAgICAgICAgICAgICAgfCBsZW5ndGggb2Ygc3RyaW5nCisgICsweDExN0MgfCA2OSA2NCAgICAgICAgICAgICAgICAgICB8IGNoYXJbMl0gICAgIHwgaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHN0cmluZyBsaXRlcmFsCisgICsweDExN0UgfCAwMCAgICAgICAgICAgICAgICAgICAgICB8IGNoYXIgICAgICAgIHwgMHgwMCAoMCkgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHN0cmluZyB0ZXJtaW5hdG9yCisKK3RhYmxlIChyZWZsZWN0aW9uLlR5cGUpOgorICArMHgxMTgwIHwgQzggRDggRkYgRkYgICAgICAgICAgICAgfCBTT2Zmc2V0MzIgICB8IDB4RkZGRkQ4QzggKC0xMDA0MCkgTG9jOiArMHgzOEI4ICAgfCBvZmZzZXQgdG8gdnRhYmxlCisgICsweDExODQgfCAwMCAwMCAwMCAgICAgICAgICAgICAgICB8IHVpbnQ4X3RbM10gIHwgLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHBhZGRpbmcKKyAgKzB4MTE4NyB8IDBGICAgICAgICAgICAgICAgICAgICAgIHwgdWludDhfdCAgICAgfCAweDBGICgxNSkgICAgICAgICAgICAgICAgICAgICAgICAgIHwgdGFibGUgZmllbGQgYGJhc2VfdHlwZWAgKEJ5dGUpCisgICsweDExODggfCAwNiAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgIHwgMHgwMDAwMDAwNiAoNikgICAgICAgICAgICAgICAgICAgICB8IHRhYmxlIGZpZWxkIGBpbmRleGAgKEludCkKKyAgKzB4MTE4QyB8IDAxIDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgfCAweDAwMDAwMDAxICgxKSAgICAgICAgICAgICAgICAgICAgIHwgdGFibGUgZmllbGQgYGVsZW1lbnRfc2l6ZWAgKFVJbnQpCisKK3N0cmluZyAocmVmbGVjdGlvbi5GaWVsZC5uYW1lKToKKyAgKzB4MTE5MCB8IDBEIDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgfCAweDAwMDAwMDBEICgxMykgICAgICAgICAgICAgICAgICAgIHwgbGVuZ3RoIG9mIHN0cmluZworICArMHgxMTk0IHwgNkUgNjEgNzQgNjkgNzYgNjUgNUYgNjkgfCBjaGFyWzEzXSAgICB8IG5hdGl2ZV9pICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJpbmcgbGl0ZXJhbAorICArMHgxMTlDIHwgNkUgNkMgNjkgNkUgNjUgICAgICAgICAgfCAgICAgICAgICAgICB8IG5saW5lCisgICsweDExQTEgfCAwMCAgICAgICAgICAgICAgICAgICAgICB8IGNoYXIgICAgICAgIHwgMHgwMCAoMCkgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHN0cmluZyB0ZXJtaW5hdG9yCisKK3BhZGRpbmc6CisgICsweDExQTIgfCAwMCAwMCAgICAgICAgICAgICAgICAgICB8IHVpbnQ4X3RbMl0gIHwgLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHBhZGRpbmcKKwordGFibGUgKHJlZmxlY3Rpb24uRmllbGQpOgorICArMHgxMUE0IHwgODAgRTYgRkYgRkYgICAgICAgICAgICAgfCBTT2Zmc2V0MzIgICB8IDB4RkZGRkU2ODAgKC02NTI4KSBMb2M6ICsweDJCMjQgICAgfCBvZmZzZXQgdG8gdnRhYmxlCisgICsweDExQTggfCAwMCAwMCAwMCAgICAgICAgICAgICAgICB8IHVpbnQ4X3RbM10gIHwgLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHBhZGRpbmcKKyAgKzB4MTFBQiB8IDAxICAgICAgICAgICAgICAgICAgICAgIHwgdWludDhfdCAgICAgfCAweDAxICgxKSAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgdGFibGUgZmllbGQgYG9wdGlvbmFsYCAoQm9vbCkKKyAgKzB4MTFBQyB8IDMyIDAwICAgICAgICAgICAgICAgICAgIHwgdWludDE2X3QgICAgfCAweDAwMzIgKDUwKSAgICAgICAgICAgICAgICAgICAgICAgIHwgdGFibGUgZmllbGQgYGlkYCAoVVNob3J0KQorICArMHgxMUFFIHwgNjggMDAgICAgICAgICAgICAgICAgICAgfCB1aW50MTZfdCAgICB8IDB4MDA2OCAoMTA0KSAgICAgICAgICAgICAgICAgICAgICAgfCB0YWJsZSBmaWVsZCBgb2Zmc2V0YCAoVVNob3J0KQorICArMHgxMUIwIHwgNDggMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDAwNDggKDcyKSBMb2M6ICsweDExRjggICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYG5hbWVgIChzdHJpbmcpCisgICsweDExQjQgfCAzNCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDAzNCAoNTIpIExvYzogKzB4MTFFOCAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgdHlwZWAgKHRhYmxlKQorICArMHgxMUI4IHwgMEMgMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDAwMEMgKDEyKSBMb2M6ICsweDExQzQgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYGF0dHJpYnV0ZXNgICh2ZWN0b3IpCisgICsweDExQkMgfCAwNCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDAwNCAoNCkgTG9jOiArMHgxMUMwICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgZG9jdW1lbnRhdGlvbmAgKHZlY3RvcikKKwordmVjdG9yIChyZWZsZWN0aW9uLkZpZWxkLmRvY3VtZW50YXRpb24pOgorICArMHgxMUMwIHwgMDAgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICB8IDB4MDAwMDAwMDAgKDApICAgICAgICAgICAgICAgICAgICAgfCBsZW5ndGggb2YgdmVjdG9yICgjIGl0ZW1zKQorCit2ZWN0b3IgKHJlZmxlY3Rpb24uRmllbGQuYXR0cmlidXRlcyk6CisgICsweDExQzQgfCAwMSAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgIHwgMHgwMDAwMDAwMSAoMSkgICAgICAgICAgICAgICAgICAgICB8IGxlbmd0aCBvZiB2ZWN0b3IgKCMgaXRlbXMpCisgICsweDExQzggfCAwNCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDAwNCAoNCkgTG9jOiArMHgxMUNDICAgICAgICB8IG9mZnNldCB0byB0YWJsZVswXQorCit0YWJsZSAocmVmbGVjdGlvbi5LZXlWYWx1ZSk6CisgICsweDExQ0MgfCA2OCBEQyBGRiBGRiAgICAgICAgICAgICB8IFNPZmZzZXQzMiAgIHwgMHhGRkZGREM2OCAoLTkxMTIpIExvYzogKzB4MzU2NCAgICB8IG9mZnNldCB0byB2dGFibGUKKyAgKzB4MTFEMCB8IDEwIDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMDEwICgxNikgTG9jOiArMHgxMUUwICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBrZXlgIChzdHJpbmcpCisgICsweDExRDQgfCAwNCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDAwNCAoNCkgTG9jOiArMHgxMUQ4ICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgdmFsdWVgIChzdHJpbmcpCisKK3N0cmluZyAocmVmbGVjdGlvbi5LZXlWYWx1ZS52YWx1ZSk6CisgICsweDExRDggfCAwMiAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgIHwgMHgwMDAwMDAwMiAoMikgICAgICAgICAgICAgICAgICAgICB8IGxlbmd0aCBvZiBzdHJpbmcKKyAgKzB4MTFEQyB8IDM1IDMwICAgICAgICAgICAgICAgICAgIHwgY2hhclsyXSAgICAgfCA1MCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nIGxpdGVyYWwKKyAgKzB4MTFERSB8IDAwICAgICAgICAgICAgICAgICAgICAgIHwgY2hhciAgICAgICAgfCAweDAwICgwKSAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nIHRlcm1pbmF0b3IKKworc3RyaW5nIChyZWZsZWN0aW9uLktleVZhbHVlLmtleSk6CisgICsweDExRTAgfCAwMiAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgIHwgMHgwMDAwMDAwMiAoMikgICAgICAgICAgICAgICAgICAgICB8IGxlbmd0aCBvZiBzdHJpbmcKKyAgKzB4MTFFNCB8IDY5IDY0ICAgICAgICAgICAgICAgICAgIHwgY2hhclsyXSAgICAgfCBpZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nIGxpdGVyYWwKKyAgKzB4MTFFNiB8IDAwICAgICAgICAgICAgICAgICAgICAgIHwgY2hhciAgICAgICAgfCAweDAwICgwKSAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nIHRlcm1pbmF0b3IKKwordGFibGUgKHJlZmxlY3Rpb24uVHlwZSk6CisgICsweDExRTggfCAzOCBFOCBGRiBGRiAgICAgICAgICAgICB8IFNPZmZzZXQzMiAgIHwgMHhGRkZGRTgzOCAoLTYwODgpIExvYzogKzB4MjlCMCAgICB8IG9mZnNldCB0byB2dGFibGUKKyAgKzB4MTFFQyB8IDAwIDAwICAgICAgICAgICAgICAgICAgIHwgdWludDhfdFsyXSAgfCAuLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgcGFkZGluZworICArMHgxMUVFIHwgMEUgICAgICAgICAgICAgICAgICAgICAgfCB1aW50OF90ICAgICB8IDB4MEUgKDE0KSAgICAgICAgICAgICAgICAgICAgICAgICAgfCB0YWJsZSBmaWVsZCBgYmFzZV90eXBlYCAoQnl0ZSkKKyAgKzB4MTFFRiB8IDBGICAgICAgICAgICAgICAgICAgICAgIHwgdWludDhfdCAgICAgfCAweDBGICgxNSkgICAgICAgICAgICAgICAgICAgICAgICAgIHwgdGFibGUgZmllbGQgYGVsZW1lbnRgIChCeXRlKQorICArMHgxMUYwIHwgMDMgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICB8IDB4MDAwMDAwMDMgKDMpICAgICAgICAgICAgICAgICAgICAgfCB0YWJsZSBmaWVsZCBgaW5kZXhgIChJbnQpCisgICsweDExRjQgfCAwNCAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgIHwgMHgwMDAwMDAwNCAoNCkgICAgICAgICAgICAgICAgICAgICB8IHRhYmxlIGZpZWxkIGBlbGVtZW50X3NpemVgIChVSW50KQorCitzdHJpbmcgKHJlZmxlY3Rpb24uRmllbGQubmFtZSk6CisgICsweDExRjggfCAxOCAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgIHwgMHgwMDAwMDAxOCAoMjQpICAgICAgICAgICAgICAgICAgICB8IGxlbmd0aCBvZiBzdHJpbmcKKyAgKzB4MTFGQyB8IDczIDYzIDYxIDZDIDYxIDcyIDVGIDZCIHwgY2hhclsyNF0gICAgfCBzY2FsYXJfayAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nIGxpdGVyYWwKKyAgKzB4MTIwNCB8IDY1IDc5IDVGIDczIDZGIDcyIDc0IDY1IHwgICAgICAgICAgICAgfCBleV9zb3J0ZQorICArMHgxMjBDIHwgNjQgNUYgNzQgNjEgNjIgNkMgNjUgNzMgfCAgICAgICAgICAgICB8IGRfdGFibGVzCisgICsweDEyMTQgfCAwMCAgICAgICAgICAgICAgICAgICAgICB8IGNoYXIgICAgICAgIHwgMHgwMCAoMCkgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHN0cmluZyB0ZXJtaW5hdG9yCisKK3BhZGRpbmc6CisgICsweDEyMTUgfCAwMCAwMCAwMCAgICAgICAgICAgICAgICB8IHVpbnQ4X3RbM10gIHwgLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHBhZGRpbmcKKwordGFibGUgKHJlZmxlY3Rpb24uRmllbGQpOgorICArMHgxMjE4IHwgRjQgRTYgRkYgRkYgICAgICAgICAgICAgfCBTT2Zmc2V0MzIgICB8IDB4RkZGRkU2RjQgKC02NDEyKSBMb2M6ICsweDJCMjQgICAgfCBvZmZzZXQgdG8gdnRhYmxlCisgICsweDEyMUMgfCAwMCAwMCAwMCAgICAgICAgICAgICAgICB8IHVpbnQ4X3RbM10gIHwgLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHBhZGRpbmcKKyAgKzB4MTIxRiB8IDAxICAgICAgICAgICAgICAgICAgICAgIHwgdWludDhfdCAgICAgfCAweDAxICgxKSAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgdGFibGUgZmllbGQgYG9wdGlvbmFsYCAoQm9vbCkKKyAgKzB4MTIyMCB8IDMxIDAwICAgICAgICAgICAgICAgICAgIHwgdWludDE2X3QgICAgfCAweDAwMzEgKDQ5KSAgICAgICAgICAgICAgICAgICAgICAgIHwgdGFibGUgZmllbGQgYGlkYCAoVVNob3J0KQorICArMHgxMjIyIHwgNjYgMDAgICAgICAgICAgICAgICAgICAgfCB1aW50MTZfdCAgICB8IDB4MDA2NiAoMTAyKSAgICAgICAgICAgICAgICAgICAgICAgfCB0YWJsZSBmaWVsZCBgb2Zmc2V0YCAoVVNob3J0KQorICArMHgxMjI0IHwgNzggMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDAwNzggKDEyMCkgTG9jOiArMHgxMjlDICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYG5hbWVgIChzdHJpbmcpCisgICsweDEyMjggfCA2OCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDA2OCAoMTA0KSBMb2M6ICsweDEyOTAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgdHlwZWAgKHRhYmxlKQorICArMHgxMjJDIHwgMEMgMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDAwMEMgKDEyKSBMb2M6ICsweDEyMzggICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYGF0dHJpYnV0ZXNgICh2ZWN0b3IpCisgICsweDEyMzAgfCAwNCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDAwNCAoNCkgTG9jOiArMHgxMjM0ICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgZG9jdW1lbnRhdGlvbmAgKHZlY3RvcikKKwordmVjdG9yIChyZWZsZWN0aW9uLkZpZWxkLmRvY3VtZW50YXRpb24pOgorICArMHgxMjM0IHwgMDAgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICB8IDB4MDAwMDAwMDAgKDApICAgICAgICAgICAgICAgICAgICAgfCBsZW5ndGggb2YgdmVjdG9yICgjIGl0ZW1zKQorCit2ZWN0b3IgKHJlZmxlY3Rpb24uRmllbGQuYXR0cmlidXRlcyk6CisgICsweDEyMzggfCAwMiAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgIHwgMHgwMDAwMDAwMiAoMikgICAgICAgICAgICAgICAgICAgICB8IGxlbmd0aCBvZiB2ZWN0b3IgKCMgaXRlbXMpCisgICsweDEyM0MgfCAzOCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDAzOCAoNTYpIExvYzogKzB4MTI3NCAgICAgICB8IG9mZnNldCB0byB0YWJsZVswXQorICArMHgxMjQwIHwgMDQgMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDAwMDQgKDQpIExvYzogKzB4MTI0NCAgICAgICAgfCBvZmZzZXQgdG8gdGFibGVbMV0KKwordGFibGUgKHJlZmxlY3Rpb24uS2V5VmFsdWUpOgorICArMHgxMjQ0IHwgRTAgREMgRkYgRkYgICAgICAgICAgICAgfCBTT2Zmc2V0MzIgICB8IDB4RkZGRkRDRTAgKC04OTkyKSBMb2M6ICsweDM1NjQgICAgfCBvZmZzZXQgdG8gdnRhYmxlCisgICsweDEyNDggfCAxNCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDAxNCAoMjApIExvYzogKzB4MTI1QyAgICAgICB8IG9mZnNldCB0byBmaWVsZCBga2V5YCAoc3RyaW5nKQorICArMHgxMjRDIHwgMDQgMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDAwMDQgKDQpIExvYzogKzB4MTI1MCAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYHZhbHVlYCAoc3RyaW5nKQorCitzdHJpbmcgKHJlZmxlY3Rpb24uS2V5VmFsdWUudmFsdWUpOgorICArMHgxMjUwIHwgMDcgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICB8IDB4MDAwMDAwMDcgKDcpICAgICAgICAgICAgICAgICAgICAgfCBsZW5ndGggb2Ygc3RyaW5nCisgICsweDEyNTQgfCA0RCA2RiA2RSA3MyA3NCA2NSA3MiAgICB8IGNoYXJbN10gICAgIHwgTW9uc3RlciAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHN0cmluZyBsaXRlcmFsCisgICsweDEyNUIgfCAwMCAgICAgICAgICAgICAgICAgICAgICB8IGNoYXIgICAgICAgIHwgMHgwMCAoMCkgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHN0cmluZyB0ZXJtaW5hdG9yCisKK3N0cmluZyAocmVmbGVjdGlvbi5LZXlWYWx1ZS5rZXkpOgorICArMHgxMjVDIHwgMTEgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICB8IDB4MDAwMDAwMTEgKDE3KSAgICAgICAgICAgICAgICAgICAgfCBsZW5ndGggb2Ygc3RyaW5nCisgICsweDEyNjAgfCA2RSA2NSA3MyA3NCA2NSA2NCA1RiA2NiB8IGNoYXJbMTddICAgIHwgbmVzdGVkX2YgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHN0cmluZyBsaXRlcmFsCisgICsweDEyNjggfCA2QyA2MSA3NCA2MiA3NSA2NiA2NiA2NSB8ICAgICAgICAgICAgIHwgbGF0YnVmZmUKKyAgKzB4MTI3MCB8IDcyICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgfCByCisgICsweDEyNzEgfCAwMCAgICAgICAgICAgICAgICAgICAgICB8IGNoYXIgICAgICAgIHwgMHgwMCAoMCkgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHN0cmluZyB0ZXJtaW5hdG9yCisKK3BhZGRpbmc6CisgICsweDEyNzIgfCAwMCAwMCAgICAgICAgICAgICAgICAgICB8IHVpbnQ4X3RbMl0gIHwgLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHBhZGRpbmcKKwordGFibGUgKHJlZmxlY3Rpb24uS2V5VmFsdWUpOgorICArMHgxMjc0IHwgMTAgREQgRkYgRkYgICAgICAgICAgICAgfCBTT2Zmc2V0MzIgICB8IDB4RkZGRkREMTAgKC04OTQ0KSBMb2M6ICsweDM1NjQgICAgfCBvZmZzZXQgdG8gdnRhYmxlCisgICsweDEyNzggfCAxMCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDAxMCAoMTYpIExvYzogKzB4MTI4OCAgICAgICB8IG9mZnNldCB0byBmaWVsZCBga2V5YCAoc3RyaW5nKQorICArMHgxMjdDIHwgMDQgMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDAwMDQgKDQpIExvYzogKzB4MTI4MCAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYHZhbHVlYCAoc3RyaW5nKQorCitzdHJpbmcgKHJlZmxlY3Rpb24uS2V5VmFsdWUudmFsdWUpOgorICArMHgxMjgwIHwgMDIgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICB8IDB4MDAwMDAwMDIgKDIpICAgICAgICAgICAgICAgICAgICAgfCBsZW5ndGggb2Ygc3RyaW5nCisgICsweDEyODQgfCAzNCAzOSAgICAgICAgICAgICAgICAgICB8IGNoYXJbMl0gICAgIHwgNDkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHN0cmluZyBsaXRlcmFsCisgICsweDEyODYgfCAwMCAgICAgICAgICAgICAgICAgICAgICB8IGNoYXIgICAgICAgIHwgMHgwMCAoMCkgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHN0cmluZyB0ZXJtaW5hdG9yCisKK3N0cmluZyAocmVmbGVjdGlvbi5LZXlWYWx1ZS5rZXkpOgorICArMHgxMjg4IHwgMDIgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICB8IDB4MDAwMDAwMDIgKDIpICAgICAgICAgICAgICAgICAgICAgfCBsZW5ndGggb2Ygc3RyaW5nCisgICsweDEyOEMgfCA2OSA2NCAgICAgICAgICAgICAgICAgICB8IGNoYXJbMl0gICAgIHwgaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHN0cmluZyBsaXRlcmFsCisgICsweDEyOEUgfCAwMCAgICAgICAgICAgICAgICAgICAgICB8IGNoYXIgICAgICAgIHwgMHgwMCAoMCkgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHN0cmluZyB0ZXJtaW5hdG9yCisKK3RhYmxlIChyZWZsZWN0aW9uLlR5cGUpOgorICArMHgxMjkwIHwgMEMgRTcgRkYgRkYgICAgICAgICAgICAgfCBTT2Zmc2V0MzIgICB8IDB4RkZGRkU3MEMgKC02Mzg4KSBMb2M6ICsweDJCODQgICAgfCBvZmZzZXQgdG8gdnRhYmxlCisgICsweDEyOTQgfCAwMCAwMCAgICAgICAgICAgICAgICAgICB8IHVpbnQ4X3RbMl0gIHwgLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHBhZGRpbmcKKyAgKzB4MTI5NiB8IDBFICAgICAgICAgICAgICAgICAgICAgIHwgdWludDhfdCAgICAgfCAweDBFICgxNCkgICAgICAgICAgICAgICAgICAgICAgICAgIHwgdGFibGUgZmllbGQgYGJhc2VfdHlwZWAgKEJ5dGUpCisgICsweDEyOTcgfCAwNCAgICAgICAgICAgICAgICAgICAgICB8IHVpbnQ4X3QgICAgIHwgMHgwNCAoNCkgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHRhYmxlIGZpZWxkIGBlbGVtZW50YCAoQnl0ZSkKKyAgKzB4MTI5OCB8IDAxIDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgfCAweDAwMDAwMDAxICgxKSAgICAgICAgICAgICAgICAgICAgIHwgdGFibGUgZmllbGQgYGVsZW1lbnRfc2l6ZWAgKFVJbnQpCisKK3N0cmluZyAocmVmbGVjdGlvbi5GaWVsZC5uYW1lKToKKyAgKzB4MTI5QyB8IDFDIDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgfCAweDAwMDAwMDFDICgyOCkgICAgICAgICAgICAgICAgICAgIHwgbGVuZ3RoIG9mIHN0cmluZworICArMHgxMkEwIHwgNzQgNjUgNzMgNzQgNzIgNjUgNzEgNzUgfCBjaGFyWzI4XSAgICB8IHRlc3RyZXF1ICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJpbmcgbGl0ZXJhbAorICArMHgxMkE4IHwgNjkgNzIgNjUgNjQgNkUgNjUgNzMgNzQgfCAgICAgICAgICAgICB8IGlyZWRuZXN0CisgICsweDEyQjAgfCA2NSA2NCA2NiA2QyA2MSA3NCA2MiA3NSB8ICAgICAgICAgICAgIHwgZWRmbGF0YnUKKyAgKzB4MTJCOCB8IDY2IDY2IDY1IDcyICAgICAgICAgICAgIHwgICAgICAgICAgICAgfCBmZmVyCisgICsweDEyQkMgfCAwMCAgICAgICAgICAgICAgICAgICAgICB8IGNoYXIgICAgICAgIHwgMHgwMCAoMCkgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHN0cmluZyB0ZXJtaW5hdG9yCisKK3Z0YWJsZSAocmVmbGVjdGlvbi5GaWVsZCk6CisgICsweDEyQkUgfCAxQSAwMCAgICAgICAgICAgICAgICAgICB8IHVpbnQxNl90ICAgIHwgMHgwMDFBICgyNikgICAgICAgICAgICAgICAgICAgICAgICB8IHNpemUgb2YgdGhpcyB2dGFibGUKKyAgKzB4MTJDMCB8IDIwIDAwICAgICAgICAgICAgICAgICAgIHwgdWludDE2X3QgICAgfCAweDAwMjAgKDMyKSAgICAgICAgICAgICAgICAgICAgICAgIHwgc2l6ZSBvZiByZWZlcnJpbmcgdGFibGUKKyAgKzB4MTJDMiB8IDA4IDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgfCAweDAwMDggKDgpICAgICAgICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBuYW1lYCAoaWQ6IDApCisgICsweDEyQzQgfCAwQyAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgIHwgMHgwMDBDICgxMikgICAgICAgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgdHlwZWAgKGlkOiAxKQorICArMHgxMkM2IHwgMDQgMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgICB8IDB4MDAwNCAoNCkgICAgICAgICAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYGlkYCAoaWQ6IDIpCisgICsweDEyQzggfCAwNiAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgIHwgMHgwMDA2ICg2KSAgICAgICAgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgb2Zmc2V0YCAoaWQ6IDMpCisgICsweDEyQ0EgfCAxOCAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgIHwgMHgwMDE4ICgyNCkgICAgICAgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgZGVmYXVsdF9pbnRlZ2VyYCAoaWQ6IDQpCisgICsweDEyQ0MgfCAwMCAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgIHwgMHgwMDAwICgwKSAgICAgICAgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgZGVmYXVsdF9yZWFsYCAoaWQ6IDUpIDxkZWZhdWx0cyB0byAwLjAwMDAwMD4gKERvdWJsZSkKKyAgKzB4MTJDRSB8IDAwIDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgfCAweDAwMDAgKDApICAgICAgICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBkZXByZWNhdGVkYCAoaWQ6IDYpIDxkZWZhdWx0cyB0byAwPiAoQm9vbCkKKyAgKzB4MTJEMCB8IDAwIDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgfCAweDAwMDAgKDApICAgICAgICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGByZXF1aXJlZGAgKGlkOiA3KSA8ZGVmYXVsdHMgdG8gMD4gKEJvb2wpCisgICsweDEyRDIgfCAwMCAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgIHwgMHgwMDAwICgwKSAgICAgICAgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBga2V5YCAoaWQ6IDgpIDxkZWZhdWx0cyB0byAwPiAoQm9vbCkKKyAgKzB4MTJENCB8IDEwIDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgfCAweDAwMTAgKDE2KSAgICAgICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBhdHRyaWJ1dGVzYCAoaWQ6IDkpCisgICsweDEyRDYgfCAxNCAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgIHwgMHgwMDE0ICgyMCkgICAgICAgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgZG9jdW1lbnRhdGlvbmAgKGlkOiAxMCkKKwordGFibGUgKHJlZmxlY3Rpb24uRmllbGQpOgorICArMHgxMkQ4IHwgMUEgMDAgMDAgMDAgICAgICAgICAgICAgfCBTT2Zmc2V0MzIgICB8IDB4MDAwMDAwMUEgKDI2KSBMb2M6ICsweDEyQkUgICAgICAgfCBvZmZzZXQgdG8gdnRhYmxlCisgICsweDEyREMgfCAzMCAwMCAgICAgICAgICAgICAgICAgICB8IHVpbnQxNl90ICAgIHwgMHgwMDMwICg0OCkgICAgICAgICAgICAgICAgICAgICAgICB8IHRhYmxlIGZpZWxkIGBpZGAgKFVTaG9ydCkKKyAgKzB4MTJERSB8IDY0IDAwICAgICAgICAgICAgICAgICAgIHwgdWludDE2X3QgICAgfCAweDAwNjQgKDEwMCkgICAgICAgICAgICAgICAgICAgICAgIHwgdGFibGUgZmllbGQgYG9mZnNldGAgKFVTaG9ydCkKKyAgKzB4MTJFMCB8IDU0IDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMDU0ICg4NCkgTG9jOiArMHgxMzM0ICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBuYW1lYCAoc3RyaW5nKQorICArMHgxMkU0IHwgM0MgMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDAwM0MgKDYwKSBMb2M6ICsweDEzMjAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYHR5cGVgICh0YWJsZSkKKyAgKzB4MTJFOCB8IDE0IDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMDE0ICgyMCkgTG9jOiArMHgxMkZDICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBhdHRyaWJ1dGVzYCAodmVjdG9yKQorICArMHgxMkVDIHwgMEMgMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDAwMEMgKDEyKSBMb2M6ICsweDEyRjggICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYGRvY3VtZW50YXRpb25gICh2ZWN0b3IpCisgICsweDEyRjAgfCBGRiBGRiBGRiBGRiBGRiBGRiBGRiBGRiB8IGludDY0X3QgICAgIHwgMHhGRkZGRkZGRkZGRkZGRkZGICgtMSkgICAgICAgICAgICB8IHRhYmxlIGZpZWxkIGBkZWZhdWx0X2ludGVnZXJgIChMb25nKQorCit2ZWN0b3IgKHJlZmxlY3Rpb24uRmllbGQuZG9jdW1lbnRhdGlvbik6CisgICsweDEyRjggfCAwMCAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgIHwgMHgwMDAwMDAwMCAoMCkgICAgICAgICAgICAgICAgICAgICB8IGxlbmd0aCBvZiB2ZWN0b3IgKCMgaXRlbXMpCisKK3ZlY3RvciAocmVmbGVjdGlvbi5GaWVsZC5hdHRyaWJ1dGVzKToKKyAgKzB4MTJGQyB8IDAxIDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgfCAweDAwMDAwMDAxICgxKSAgICAgICAgICAgICAgICAgICAgIHwgbGVuZ3RoIG9mIHZlY3RvciAoIyBpdGVtcykKKyAgKzB4MTMwMCB8IDA0IDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMDA0ICg0KSBMb2M6ICsweDEzMDQgICAgICAgIHwgb2Zmc2V0IHRvIHRhYmxlWzBdCisKK3RhYmxlIChyZWZsZWN0aW9uLktleVZhbHVlKToKKyAgKzB4MTMwNCB8IEEwIEREIEZGIEZGICAgICAgICAgICAgIHwgU09mZnNldDMyICAgfCAweEZGRkZEREEwICgtODgwMCkgTG9jOiArMHgzNTY0ICAgIHwgb2Zmc2V0IHRvIHZ0YWJsZQorICArMHgxMzA4IHwgMTAgMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDAwMTAgKDE2KSBMb2M6ICsweDEzMTggICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYGtleWAgKHN0cmluZykKKyAgKzB4MTMwQyB8IDA0IDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMDA0ICg0KSBMb2M6ICsweDEzMTAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGB2YWx1ZWAgKHN0cmluZykKKworc3RyaW5nIChyZWZsZWN0aW9uLktleVZhbHVlLnZhbHVlKToKKyAgKzB4MTMxMCB8IDAyIDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgfCAweDAwMDAwMDAyICgyKSAgICAgICAgICAgICAgICAgICAgIHwgbGVuZ3RoIG9mIHN0cmluZworICArMHgxMzE0IHwgMzQgMzggICAgICAgICAgICAgICAgICAgfCBjaGFyWzJdICAgICB8IDQ4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJpbmcgbGl0ZXJhbAorICArMHgxMzE2IHwgMDAgICAgICAgICAgICAgICAgICAgICAgfCBjaGFyICAgICAgICB8IDB4MDAgKDApICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJpbmcgdGVybWluYXRvcgorCitzdHJpbmcgKHJlZmxlY3Rpb24uS2V5VmFsdWUua2V5KToKKyAgKzB4MTMxOCB8IDAyIDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgfCAweDAwMDAwMDAyICgyKSAgICAgICAgICAgICAgICAgICAgIHwgbGVuZ3RoIG9mIHN0cmluZworICArMHgxMzFDIHwgNjkgNjQgICAgICAgICAgICAgICAgICAgfCBjaGFyWzJdICAgICB8IGlkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJpbmcgbGl0ZXJhbAorICArMHgxMzFFIHwgMDAgICAgICAgICAgICAgICAgICAgICAgfCBjaGFyICAgICAgICB8IDB4MDAgKDApICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJpbmcgdGVybWluYXRvcgorCit0YWJsZSAocmVmbGVjdGlvbi5UeXBlKToKKyAgKzB4MTMyMCB8IDFDIEREIEZGIEZGICAgICAgICAgICAgIHwgU09mZnNldDMyICAgfCAweEZGRkZERDFDICgtODkzMikgTG9jOiArMHgzNjA0ICAgIHwgb2Zmc2V0IHRvIHZ0YWJsZQorICArMHgxMzI0IHwgMDAgMDAgMDAgICAgICAgICAgICAgICAgfCB1aW50OF90WzNdICB8IC4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBwYWRkaW5nCisgICsweDEzMjcgfCAwMyAgICAgICAgICAgICAgICAgICAgICB8IHVpbnQ4X3QgICAgIHwgMHgwMyAoMykgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHRhYmxlIGZpZWxkIGBiYXNlX3R5cGVgIChCeXRlKQorICArMHgxMzI4IHwgMDUgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICB8IDB4MDAwMDAwMDUgKDUpICAgICAgICAgICAgICAgICAgICAgfCB0YWJsZSBmaWVsZCBgaW5kZXhgIChJbnQpCisgICsweDEzMkMgfCAwMSAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgIHwgMHgwMDAwMDAwMSAoMSkgICAgICAgICAgICAgICAgICAgICB8IHRhYmxlIGZpZWxkIGBiYXNlX3NpemVgIChVSW50KQorICArMHgxMzMwIHwgMDEgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICB8IDB4MDAwMDAwMDEgKDEpICAgICAgICAgICAgICAgICAgICAgfCB0YWJsZSBmaWVsZCBgZWxlbWVudF9zaXplYCAoVUludCkKKworc3RyaW5nIChyZWZsZWN0aW9uLkZpZWxkLm5hbWUpOgorICArMHgxMzM0IHwgMEIgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICB8IDB4MDAwMDAwMEIgKDExKSAgICAgICAgICAgICAgICAgICAgfCBsZW5ndGggb2Ygc3RyaW5nCisgICsweDEzMzggfCA3MyA2OSA2NyA2RSA2NSA2NCA1RiA2NSB8IGNoYXJbMTFdICAgIHwgc2lnbmVkX2UgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHN0cmluZyBsaXRlcmFsCisgICsweDEzNDAgfCA2RSA3NSA2RCAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgIHwgbnVtCisgICsweDEzNDMgfCAwMCAgICAgICAgICAgICAgICAgICAgICB8IGNoYXIgICAgICAgIHwgMHgwMCAoMCkgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHN0cmluZyB0ZXJtaW5hdG9yCisKK3RhYmxlIChyZWZsZWN0aW9uLkZpZWxkKToKKyAgKzB4MTM0NCB8IDIwIEU4IEZGIEZGICAgICAgICAgICAgIHwgU09mZnNldDMyICAgfCAweEZGRkZFODIwICgtNjExMikgTG9jOiArMHgyQjI0ICAgIHwgb2Zmc2V0IHRvIHZ0YWJsZQorICArMHgxMzQ4IHwgMDAgMDAgMDAgICAgICAgICAgICAgICAgfCB1aW50OF90WzNdICB8IC4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBwYWRkaW5nCisgICsweDEzNEIgfCAwMSAgICAgICAgICAgICAgICAgICAgICB8IHVpbnQ4X3QgICAgIHwgMHgwMSAoMSkgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHRhYmxlIGZpZWxkIGBvcHRpb25hbGAgKEJvb2wpCisgICsweDEzNEMgfCAyRiAwMCAgICAgICAgICAgICAgICAgICB8IHVpbnQxNl90ICAgIHwgMHgwMDJGICg0NykgICAgICAgICAgICAgICAgICAgICAgICB8IHRhYmxlIGZpZWxkIGBpZGAgKFVTaG9ydCkKKyAgKzB4MTM0RSB8IDYyIDAwICAgICAgICAgICAgICAgICAgIHwgdWludDE2X3QgICAgfCAweDAwNjIgKDk4KSAgICAgICAgICAgICAgICAgICAgICAgIHwgdGFibGUgZmllbGQgYG9mZnNldGAgKFVTaG9ydCkKKyAgKzB4MTM1MCB8IDQ4IDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMDQ4ICg3MikgTG9jOiArMHgxMzk4ICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBuYW1lYCAoc3RyaW5nKQorICArMHgxMzU0IHwgMzQgMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDAwMzQgKDUyKSBMb2M6ICsweDEzODggICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYHR5cGVgICh0YWJsZSkKKyAgKzB4MTM1OCB8IDBDIDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMDBDICgxMikgTG9jOiArMHgxMzY0ICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBhdHRyaWJ1dGVzYCAodmVjdG9yKQorICArMHgxMzVDIHwgMDQgMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDAwMDQgKDQpIExvYzogKzB4MTM2MCAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYGRvY3VtZW50YXRpb25gICh2ZWN0b3IpCisKK3ZlY3RvciAocmVmbGVjdGlvbi5GaWVsZC5kb2N1bWVudGF0aW9uKToKKyAgKzB4MTM2MCB8IDAwIDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgfCAweDAwMDAwMDAwICgwKSAgICAgICAgICAgICAgICAgICAgIHwgbGVuZ3RoIG9mIHZlY3RvciAoIyBpdGVtcykKKwordmVjdG9yIChyZWZsZWN0aW9uLkZpZWxkLmF0dHJpYnV0ZXMpOgorICArMHgxMzY0IHwgMDEgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICB8IDB4MDAwMDAwMDEgKDEpICAgICAgICAgICAgICAgICAgICAgfCBsZW5ndGggb2YgdmVjdG9yICgjIGl0ZW1zKQorICArMHgxMzY4IHwgMDQgMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDAwMDQgKDQpIExvYzogKzB4MTM2QyAgICAgICAgfCBvZmZzZXQgdG8gdGFibGVbMF0KKwordGFibGUgKHJlZmxlY3Rpb24uS2V5VmFsdWUpOgorICArMHgxMzZDIHwgMDggREUgRkYgRkYgICAgICAgICAgICAgfCBTT2Zmc2V0MzIgICB8IDB4RkZGRkRFMDggKC04Njk2KSBMb2M6ICsweDM1NjQgICAgfCBvZmZzZXQgdG8gdnRhYmxlCisgICsweDEzNzAgfCAxMCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDAxMCAoMTYpIExvYzogKzB4MTM4MCAgICAgICB8IG9mZnNldCB0byBmaWVsZCBga2V5YCAoc3RyaW5nKQorICArMHgxMzc0IHwgMDQgMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDAwMDQgKDQpIExvYzogKzB4MTM3OCAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYHZhbHVlYCAoc3RyaW5nKQorCitzdHJpbmcgKHJlZmxlY3Rpb24uS2V5VmFsdWUudmFsdWUpOgorICArMHgxMzc4IHwgMDIgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICB8IDB4MDAwMDAwMDIgKDIpICAgICAgICAgICAgICAgICAgICAgfCBsZW5ndGggb2Ygc3RyaW5nCisgICsweDEzN0MgfCAzNCAzNyAgICAgICAgICAgICAgICAgICB8IGNoYXJbMl0gICAgIHwgNDcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHN0cmluZyBsaXRlcmFsCisgICsweDEzN0UgfCAwMCAgICAgICAgICAgICAgICAgICAgICB8IGNoYXIgICAgICAgIHwgMHgwMCAoMCkgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHN0cmluZyB0ZXJtaW5hdG9yCisKK3N0cmluZyAocmVmbGVjdGlvbi5LZXlWYWx1ZS5rZXkpOgorICArMHgxMzgwIHwgMDIgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICB8IDB4MDAwMDAwMDIgKDIpICAgICAgICAgICAgICAgICAgICAgfCBsZW5ndGggb2Ygc3RyaW5nCisgICsweDEzODQgfCA2OSA2NCAgICAgICAgICAgICAgICAgICB8IGNoYXJbMl0gICAgIHwgaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHN0cmluZyBsaXRlcmFsCisgICsweDEzODYgfCAwMCAgICAgICAgICAgICAgICAgICAgICB8IGNoYXIgICAgICAgIHwgMHgwMCAoMCkgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHN0cmluZyB0ZXJtaW5hdG9yCisKK3RhYmxlIChyZWZsZWN0aW9uLlR5cGUpOgorICArMHgxMzg4IHwgRDggRTkgRkYgRkYgICAgICAgICAgICAgfCBTT2Zmc2V0MzIgICB8IDB4RkZGRkU5RDggKC01NjcyKSBMb2M6ICsweDI5QjAgICAgfCBvZmZzZXQgdG8gdnRhYmxlCisgICsweDEzOEMgfCAwMCAwMCAgICAgICAgICAgICAgICAgICB8IHVpbnQ4X3RbMl0gIHwgLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHBhZGRpbmcKKyAgKzB4MTM4RSB8IDBFICAgICAgICAgICAgICAgICAgICAgIHwgdWludDhfdCAgICAgfCAweDBFICgxNCkgICAgICAgICAgICAgICAgICAgICAgICAgIHwgdGFibGUgZmllbGQgYGJhc2VfdHlwZWAgKEJ5dGUpCisgICsweDEzOEYgfCAwNCAgICAgICAgICAgICAgICAgICAgICB8IHVpbnQ4X3QgICAgIHwgMHgwNCAoNCkgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHRhYmxlIGZpZWxkIGBlbGVtZW50YCAoQnl0ZSkKKyAgKzB4MTM5MCB8IDAzIDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgfCAweDAwMDAwMDAzICgzKSAgICAgICAgICAgICAgICAgICAgIHwgdGFibGUgZmllbGQgYGluZGV4YCAoSW50KQorICArMHgxMzk0IHwgMDEgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICB8IDB4MDAwMDAwMDEgKDEpICAgICAgICAgICAgICAgICAgICAgfCB0YWJsZSBmaWVsZCBgZWxlbWVudF9zaXplYCAoVUludCkKKworc3RyaW5nIChyZWZsZWN0aW9uLkZpZWxkLm5hbWUpOgorICArMHgxMzk4IHwgMEYgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICB8IDB4MDAwMDAwMEYgKDE1KSAgICAgICAgICAgICAgICAgICAgfCBsZW5ndGggb2Ygc3RyaW5nCisgICsweDEzOUMgfCA3NiA2NSA2MyA3NCA2RiA3MiA1RiA2RiB8IGNoYXJbMTVdICAgIHwgdmVjdG9yX28gICAgICAgICAgICAgICAgICAgICAgICAgICB8IHN0cmluZyBsaXRlcmFsCisgICsweDEzQTQgfCA2NiA1RiA2NSA2RSA3NSA2RCA3MyAgICB8ICAgICAgICAgICAgIHwgZl9lbnVtcworICArMHgxM0FCIHwgMDAgICAgICAgICAgICAgICAgICAgICAgfCBjaGFyICAgICAgICB8IDB4MDAgKDApICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJpbmcgdGVybWluYXRvcgorCit0YWJsZSAocmVmbGVjdGlvbi5GaWVsZCk6CisgICsweDEzQUMgfCA4OCBFOCBGRiBGRiAgICAgICAgICAgICB8IFNPZmZzZXQzMiAgIHwgMHhGRkZGRTg4OCAoLTYwMDgpIExvYzogKzB4MkIyNCAgICB8IG9mZnNldCB0byB2dGFibGUKKyAgKzB4MTNCMCB8IDAwIDAwIDAwICAgICAgICAgICAgICAgIHwgdWludDhfdFszXSAgfCAuLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgcGFkZGluZworICArMHgxM0IzIHwgMDEgICAgICAgICAgICAgICAgICAgICAgfCB1aW50OF90ICAgICB8IDB4MDEgKDEpICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB0YWJsZSBmaWVsZCBgb3B0aW9uYWxgIChCb29sKQorICArMHgxM0I0IHwgMkUgMDAgICAgICAgICAgICAgICAgICAgfCB1aW50MTZfdCAgICB8IDB4MDAyRSAoNDYpICAgICAgICAgICAgICAgICAgICAgICAgfCB0YWJsZSBmaWVsZCBgaWRgIChVU2hvcnQpCisgICsweDEzQjYgfCA2MCAwMCAgICAgICAgICAgICAgICAgICB8IHVpbnQxNl90ICAgIHwgMHgwMDYwICg5NikgICAgICAgICAgICAgICAgICAgICAgICB8IHRhYmxlIGZpZWxkIGBvZmZzZXRgIChVU2hvcnQpCisgICsweDEzQjggfCA0OCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDA0OCAoNzIpIExvYzogKzB4MTQwMCAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgbmFtZWAgKHN0cmluZykKKyAgKzB4MTNCQyB8IDM0IDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMDM0ICg1MikgTG9jOiArMHgxM0YwICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGB0eXBlYCAodGFibGUpCisgICsweDEzQzAgfCAwQyAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDAwQyAoMTIpIExvYzogKzB4MTNDQyAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgYXR0cmlidXRlc2AgKHZlY3RvcikKKyAgKzB4MTNDNCB8IDA0IDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMDA0ICg0KSBMb2M6ICsweDEzQzggICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBkb2N1bWVudGF0aW9uYCAodmVjdG9yKQorCit2ZWN0b3IgKHJlZmxlY3Rpb24uRmllbGQuZG9jdW1lbnRhdGlvbik6CisgICsweDEzQzggfCAwMCAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgIHwgMHgwMDAwMDAwMCAoMCkgICAgICAgICAgICAgICAgICAgICB8IGxlbmd0aCBvZiB2ZWN0b3IgKCMgaXRlbXMpCisKK3ZlY3RvciAocmVmbGVjdGlvbi5GaWVsZC5hdHRyaWJ1dGVzKToKKyAgKzB4MTNDQyB8IDAxIDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgfCAweDAwMDAwMDAxICgxKSAgICAgICAgICAgICAgICAgICAgIHwgbGVuZ3RoIG9mIHZlY3RvciAoIyBpdGVtcykKKyAgKzB4MTNEMCB8IDA0IDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMDA0ICg0KSBMb2M6ICsweDEzRDQgICAgICAgIHwgb2Zmc2V0IHRvIHRhYmxlWzBdCisKK3RhYmxlIChyZWZsZWN0aW9uLktleVZhbHVlKToKKyAgKzB4MTNENCB8IDcwIERFIEZGIEZGICAgICAgICAgICAgIHwgU09mZnNldDMyICAgfCAweEZGRkZERTcwICgtODU5MikgTG9jOiArMHgzNTY0ICAgIHwgb2Zmc2V0IHRvIHZ0YWJsZQorICArMHgxM0Q4IHwgMTAgMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDAwMTAgKDE2KSBMb2M6ICsweDEzRTggICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYGtleWAgKHN0cmluZykKKyAgKzB4MTNEQyB8IDA0IDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMDA0ICg0KSBMb2M6ICsweDEzRTAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGB2YWx1ZWAgKHN0cmluZykKKworc3RyaW5nIChyZWZsZWN0aW9uLktleVZhbHVlLnZhbHVlKToKKyAgKzB4MTNFMCB8IDAyIDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgfCAweDAwMDAwMDAyICgyKSAgICAgICAgICAgICAgICAgICAgIHwgbGVuZ3RoIG9mIHN0cmluZworICArMHgxM0U0IHwgMzQgMzYgICAgICAgICAgICAgICAgICAgfCBjaGFyWzJdICAgICB8IDQ2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJpbmcgbGl0ZXJhbAorICArMHgxM0U2IHwgMDAgICAgICAgICAgICAgICAgICAgICAgfCBjaGFyICAgICAgICB8IDB4MDAgKDApICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJpbmcgdGVybWluYXRvcgorCitzdHJpbmcgKHJlZmxlY3Rpb24uS2V5VmFsdWUua2V5KToKKyAgKzB4MTNFOCB8IDAyIDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgfCAweDAwMDAwMDAyICgyKSAgICAgICAgICAgICAgICAgICAgIHwgbGVuZ3RoIG9mIHN0cmluZworICArMHgxM0VDIHwgNjkgNjQgICAgICAgICAgICAgICAgICAgfCBjaGFyWzJdICAgICB8IGlkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJpbmcgbGl0ZXJhbAorICArMHgxM0VFIHwgMDAgICAgICAgICAgICAgICAgICAgICAgfCBjaGFyICAgICAgICB8IDB4MDAgKDApICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJpbmcgdGVybWluYXRvcgorCit0YWJsZSAocmVmbGVjdGlvbi5UeXBlKToKKyAgKzB4MTNGMCB8IDM4IERCIEZGIEZGICAgICAgICAgICAgIHwgU09mZnNldDMyICAgfCAweEZGRkZEQjM4ICgtOTQxNikgTG9jOiArMHgzOEI4ICAgIHwgb2Zmc2V0IHRvIHZ0YWJsZQorICArMHgxM0Y0IHwgMDAgMDAgMDAgICAgICAgICAgICAgICAgfCB1aW50OF90WzNdICB8IC4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBwYWRkaW5nCisgICsweDEzRjcgfCAxMCAgICAgICAgICAgICAgICAgICAgICB8IHVpbnQ4X3QgICAgIHwgMHgxMCAoMTYpICAgICAgICAgICAgICAgICAgICAgICAgICB8IHRhYmxlIGZpZWxkIGBiYXNlX3R5cGVgIChCeXRlKQorICArMHgxM0Y4IHwgMDEgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICB8IDB4MDAwMDAwMDEgKDEpICAgICAgICAgICAgICAgICAgICAgfCB0YWJsZSBmaWVsZCBgaW5kZXhgIChJbnQpCisgICsweDEzRkMgfCAwMSAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgIHwgMHgwMDAwMDAwMSAoMSkgICAgICAgICAgICAgICAgICAgICB8IHRhYmxlIGZpZWxkIGBlbGVtZW50X3NpemVgIChVSW50KQorCitzdHJpbmcgKHJlZmxlY3Rpb24uRmllbGQubmFtZSk6CisgICsweDE0MDAgfCAwRCAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgIHwgMHgwMDAwMDAwRCAoMTMpICAgICAgICAgICAgICAgICAgICB8IGxlbmd0aCBvZiBzdHJpbmcKKyAgKzB4MTQwNCB8IDYxIDZFIDc5IDVGIDYxIDZEIDYyIDY5IHwgY2hhclsxM10gICAgfCBhbnlfYW1iaSAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nIGxpdGVyYWwKKyAgKzB4MTQwQyB8IDY3IDc1IDZGIDc1IDczICAgICAgICAgIHwgICAgICAgICAgICAgfCBndW91cworICArMHgxNDExIHwgMDAgICAgICAgICAgICAgICAgICAgICAgfCBjaGFyICAgICAgICB8IDB4MDAgKDApICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJpbmcgdGVybWluYXRvcgorCitwYWRkaW5nOgorICArMHgxNDEyIHwgMDAgMDAgICAgICAgICAgICAgICAgICAgfCB1aW50OF90WzJdICB8IC4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBwYWRkaW5nCisKK3RhYmxlIChyZWZsZWN0aW9uLkZpZWxkKToKKyAgKzB4MTQxNCB8IERBIEU5IEZGIEZGICAgICAgICAgICAgIHwgU09mZnNldDMyICAgfCAweEZGRkZFOURBICgtNTY3MCkgTG9jOiArMHgyQTNBICAgIHwgb2Zmc2V0IHRvIHZ0YWJsZQorICArMHgxNDE4IHwgMkQgMDAgICAgICAgICAgICAgICAgICAgfCB1aW50MTZfdCAgICB8IDB4MDAyRCAoNDUpICAgICAgICAgICAgICAgICAgICAgICAgfCB0YWJsZSBmaWVsZCBgaWRgIChVU2hvcnQpCisgICsweDE0MUEgfCA1RSAwMCAgICAgICAgICAgICAgICAgICB8IHVpbnQxNl90ICAgIHwgMHgwMDVFICg5NCkgICAgICAgICAgICAgICAgICAgICAgICB8IHRhYmxlIGZpZWxkIGBvZmZzZXRgIChVU2hvcnQpCisgICsweDE0MUMgfCA0QyAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDA0QyAoNzYpIExvYzogKzB4MTQ2OCAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgbmFtZWAgKHN0cmluZykKKyAgKzB4MTQyMCB8IDM0IDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMDM0ICg1MikgTG9jOiArMHgxNDU0ICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGB0eXBlYCAodGFibGUpCisgICsweDE0MjQgfCAwQyAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDAwQyAoMTIpIExvYzogKzB4MTQzMCAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgYXR0cmlidXRlc2AgKHZlY3RvcikKKyAgKzB4MTQyOCB8IDA0IDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMDA0ICg0KSBMb2M6ICsweDE0MkMgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBkb2N1bWVudGF0aW9uYCAodmVjdG9yKQorCit2ZWN0b3IgKHJlZmxlY3Rpb24uRmllbGQuZG9jdW1lbnRhdGlvbik6CisgICsweDE0MkMgfCAwMCAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgIHwgMHgwMDAwMDAwMCAoMCkgICAgICAgICAgICAgICAgICAgICB8IGxlbmd0aCBvZiB2ZWN0b3IgKCMgaXRlbXMpCisKK3ZlY3RvciAocmVmbGVjdGlvbi5GaWVsZC5hdHRyaWJ1dGVzKToKKyAgKzB4MTQzMCB8IDAxIDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgfCAweDAwMDAwMDAxICgxKSAgICAgICAgICAgICAgICAgICAgIHwgbGVuZ3RoIG9mIHZlY3RvciAoIyBpdGVtcykKKyAgKzB4MTQzNCB8IDA0IDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMDA0ICg0KSBMb2M6ICsweDE0MzggICAgICAgIHwgb2Zmc2V0IHRvIHRhYmxlWzBdCisKK3RhYmxlIChyZWZsZWN0aW9uLktleVZhbHVlKToKKyAgKzB4MTQzOCB8IEQ0IERFIEZGIEZGICAgICAgICAgICAgIHwgU09mZnNldDMyICAgfCAweEZGRkZERUQ0ICgtODQ5MikgTG9jOiArMHgzNTY0ICAgIHwgb2Zmc2V0IHRvIHZ0YWJsZQorICArMHgxNDNDIHwgMTAgMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDAwMTAgKDE2KSBMb2M6ICsweDE0NEMgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYGtleWAgKHN0cmluZykKKyAgKzB4MTQ0MCB8IDA0IDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMDA0ICg0KSBMb2M6ICsweDE0NDQgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGB2YWx1ZWAgKHN0cmluZykKKworc3RyaW5nIChyZWZsZWN0aW9uLktleVZhbHVlLnZhbHVlKToKKyAgKzB4MTQ0NCB8IDAyIDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgfCAweDAwMDAwMDAyICgyKSAgICAgICAgICAgICAgICAgICAgIHwgbGVuZ3RoIG9mIHN0cmluZworICArMHgxNDQ4IHwgMzQgMzUgICAgICAgICAgICAgICAgICAgfCBjaGFyWzJdICAgICB8IDQ1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJpbmcgbGl0ZXJhbAorICArMHgxNDRBIHwgMDAgICAgICAgICAgICAgICAgICAgICAgfCBjaGFyICAgICAgICB8IDB4MDAgKDApICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJpbmcgdGVybWluYXRvcgorCitzdHJpbmcgKHJlZmxlY3Rpb24uS2V5VmFsdWUua2V5KToKKyAgKzB4MTQ0QyB8IDAyIDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgfCAweDAwMDAwMDAyICgyKSAgICAgICAgICAgICAgICAgICAgIHwgbGVuZ3RoIG9mIHN0cmluZworICArMHgxNDUwIHwgNjkgNjQgICAgICAgICAgICAgICAgICAgfCBjaGFyWzJdICAgICB8IGlkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJpbmcgbGl0ZXJhbAorICArMHgxNDUyIHwgMDAgICAgICAgICAgICAgICAgICAgICAgfCBjaGFyICAgICAgICB8IDB4MDAgKDApICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJpbmcgdGVybWluYXRvcgorCit0YWJsZSAocmVmbGVjdGlvbi5UeXBlKToKKyAgKzB4MTQ1NCB8IDUwIERFIEZGIEZGICAgICAgICAgICAgIHwgU09mZnNldDMyICAgfCAweEZGRkZERTUwICgtODYyNCkgTG9jOiArMHgzNjA0ICAgIHwgb2Zmc2V0IHRvIHZ0YWJsZQorICArMHgxNDU4IHwgMDAgMDAgMDAgICAgICAgICAgICAgICAgfCB1aW50OF90WzNdICB8IC4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBwYWRkaW5nCisgICsweDE0NUIgfCAwMSAgICAgICAgICAgICAgICAgICAgICB8IHVpbnQ4X3QgICAgIHwgMHgwMSAoMSkgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHRhYmxlIGZpZWxkIGBiYXNlX3R5cGVgIChCeXRlKQorICArMHgxNDVDIHwgMDEgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICB8IDB4MDAwMDAwMDEgKDEpICAgICAgICAgICAgICAgICAgICAgfCB0YWJsZSBmaWVsZCBgaW5kZXhgIChJbnQpCisgICsweDE0NjAgfCAwMSAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgIHwgMHgwMDAwMDAwMSAoMSkgICAgICAgICAgICAgICAgICAgICB8IHRhYmxlIGZpZWxkIGBiYXNlX3NpemVgIChVSW50KQorICArMHgxNDY0IHwgMDEgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICB8IDB4MDAwMDAwMDEgKDEpICAgICAgICAgICAgICAgICAgICAgfCB0YWJsZSBmaWVsZCBgZWxlbWVudF9zaXplYCAoVUludCkKKworc3RyaW5nIChyZWZsZWN0aW9uLkZpZWxkLm5hbWUpOgorICArMHgxNDY4IHwgMTIgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICB8IDB4MDAwMDAwMTIgKDE4KSAgICAgICAgICAgICAgICAgICAgfCBsZW5ndGggb2Ygc3RyaW5nCisgICsweDE0NkMgfCA2MSA2RSA3OSA1RiA2MSA2RCA2MiA2OSB8IGNoYXJbMThdICAgIHwgYW55X2FtYmkgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHN0cmluZyBsaXRlcmFsCisgICsweDE0NzQgfCA2NyA3NSA2RiA3NSA3MyA1RiA3NCA3OSB8ICAgICAgICAgICAgIHwgZ3VvdXNfdHkKKyAgKzB4MTQ3QyB8IDcwIDY1ICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgfCBwZQorICArMHgxNDdFIHwgMDAgICAgICAgICAgICAgICAgICAgICAgfCBjaGFyICAgICAgICB8IDB4MDAgKDApICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJpbmcgdGVybWluYXRvcgorCit0YWJsZSAocmVmbGVjdGlvbi5GaWVsZCk6CisgICsweDE0ODAgfCA1QyBFOSBGRiBGRiAgICAgICAgICAgICB8IFNPZmZzZXQzMiAgIHwgMHhGRkZGRTk1QyAoLTU3OTYpIExvYzogKzB4MkIyNCAgICB8IG9mZnNldCB0byB2dGFibGUKKyAgKzB4MTQ4NCB8IDAwIDAwIDAwICAgICAgICAgICAgICAgIHwgdWludDhfdFszXSAgfCAuLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgcGFkZGluZworICArMHgxNDg3IHwgMDEgICAgICAgICAgICAgICAgICAgICAgfCB1aW50OF90ICAgICB8IDB4MDEgKDEpICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB0YWJsZSBmaWVsZCBgb3B0aW9uYWxgIChCb29sKQorICArMHgxNDg4IHwgMkMgMDAgICAgICAgICAgICAgICAgICAgfCB1aW50MTZfdCAgICB8IDB4MDAyQyAoNDQpICAgICAgICAgICAgICAgICAgICAgICAgfCB0YWJsZSBmaWVsZCBgaWRgIChVU2hvcnQpCisgICsweDE0OEEgfCA1QyAwMCAgICAgICAgICAgICAgICAgICB8IHVpbnQxNl90ICAgIHwgMHgwMDVDICg5MikgICAgICAgICAgICAgICAgICAgICAgICB8IHRhYmxlIGZpZWxkIGBvZmZzZXRgIChVU2hvcnQpCisgICsweDE0OEMgfCA0OCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDA0OCAoNzIpIExvYzogKzB4MTRENCAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgbmFtZWAgKHN0cmluZykKKyAgKzB4MTQ5MCB8IDM0IDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMDM0ICg1MikgTG9jOiArMHgxNEM0ICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGB0eXBlYCAodGFibGUpCisgICsweDE0OTQgfCAwQyAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDAwQyAoMTIpIExvYzogKzB4MTRBMCAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgYXR0cmlidXRlc2AgKHZlY3RvcikKKyAgKzB4MTQ5OCB8IDA0IDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMDA0ICg0KSBMb2M6ICsweDE0OUMgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBkb2N1bWVudGF0aW9uYCAodmVjdG9yKQorCit2ZWN0b3IgKHJlZmxlY3Rpb24uRmllbGQuZG9jdW1lbnRhdGlvbik6CisgICsweDE0OUMgfCAwMCAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgIHwgMHgwMDAwMDAwMCAoMCkgICAgICAgICAgICAgICAgICAgICB8IGxlbmd0aCBvZiB2ZWN0b3IgKCMgaXRlbXMpCisKK3ZlY3RvciAocmVmbGVjdGlvbi5GaWVsZC5hdHRyaWJ1dGVzKToKKyAgKzB4MTRBMCB8IDAxIDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgfCAweDAwMDAwMDAxICgxKSAgICAgICAgICAgICAgICAgICAgIHwgbGVuZ3RoIG9mIHZlY3RvciAoIyBpdGVtcykKKyAgKzB4MTRBNCB8IDA0IDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMDA0ICg0KSBMb2M6ICsweDE0QTggICAgICAgIHwgb2Zmc2V0IHRvIHRhYmxlWzBdCisKK3RhYmxlIChyZWZsZWN0aW9uLktleVZhbHVlKToKKyAgKzB4MTRBOCB8IDQ0IERGIEZGIEZGICAgICAgICAgICAgIHwgU09mZnNldDMyICAgfCAweEZGRkZERjQ0ICgtODM4MCkgTG9jOiArMHgzNTY0ICAgIHwgb2Zmc2V0IHRvIHZ0YWJsZQorICArMHgxNEFDIHwgMTAgMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDAwMTAgKDE2KSBMb2M6ICsweDE0QkMgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYGtleWAgKHN0cmluZykKKyAgKzB4MTRCMCB8IDA0IDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMDA0ICg0KSBMb2M6ICsweDE0QjQgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGB2YWx1ZWAgKHN0cmluZykKKworc3RyaW5nIChyZWZsZWN0aW9uLktleVZhbHVlLnZhbHVlKToKKyAgKzB4MTRCNCB8IDAyIDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgfCAweDAwMDAwMDAyICgyKSAgICAgICAgICAgICAgICAgICAgIHwgbGVuZ3RoIG9mIHN0cmluZworICArMHgxNEI4IHwgMzQgMzQgICAgICAgICAgICAgICAgICAgfCBjaGFyWzJdICAgICB8IDQ0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJpbmcgbGl0ZXJhbAorICArMHgxNEJBIHwgMDAgICAgICAgICAgICAgICAgICAgICAgfCBjaGFyICAgICAgICB8IDB4MDAgKDApICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJpbmcgdGVybWluYXRvcgorCitzdHJpbmcgKHJlZmxlY3Rpb24uS2V5VmFsdWUua2V5KToKKyAgKzB4MTRCQyB8IDAyIDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgfCAweDAwMDAwMDAyICgyKSAgICAgICAgICAgICAgICAgICAgIHwgbGVuZ3RoIG9mIHN0cmluZworICArMHgxNEMwIHwgNjkgNjQgICAgICAgICAgICAgICAgICAgfCBjaGFyWzJdICAgICB8IGlkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJpbmcgbGl0ZXJhbAorICArMHgxNEMyIHwgMDAgICAgICAgICAgICAgICAgICAgICAgfCBjaGFyICAgICAgICB8IDB4MDAgKDApICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJpbmcgdGVybWluYXRvcgorCit0YWJsZSAocmVmbGVjdGlvbi5UeXBlKToKKyAgKzB4MTRDNCB8IDBDIERDIEZGIEZGICAgICAgICAgICAgIHwgU09mZnNldDMyICAgfCAweEZGRkZEQzBDICgtOTIwNCkgTG9jOiArMHgzOEI4ICAgIHwgb2Zmc2V0IHRvIHZ0YWJsZQorICArMHgxNEM4IHwgMDAgMDAgMDAgICAgICAgICAgICAgICAgfCB1aW50OF90WzNdICB8IC4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBwYWRkaW5nCisgICsweDE0Q0IgfCAxMCAgICAgICAgICAgICAgICAgICAgICB8IHVpbnQ4X3QgICAgIHwgMHgxMCAoMTYpICAgICAgICAgICAgICAgICAgICAgICAgICB8IHRhYmxlIGZpZWxkIGBiYXNlX3R5cGVgIChCeXRlKQorICArMHgxNENDIHwgMDIgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICB8IDB4MDAwMDAwMDIgKDIpICAgICAgICAgICAgICAgICAgICAgfCB0YWJsZSBmaWVsZCBgaW5kZXhgIChJbnQpCisgICsweDE0RDAgfCAwMSAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgIHwgMHgwMDAwMDAwMSAoMSkgICAgICAgICAgICAgICAgICAgICB8IHRhYmxlIGZpZWxkIGBlbGVtZW50X3NpemVgIChVSW50KQorCitzdHJpbmcgKHJlZmxlY3Rpb24uRmllbGQubmFtZSk6CisgICsweDE0RDQgfCAwQSAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgIHwgMHgwMDAwMDAwQSAoMTApICAgICAgICAgICAgICAgICAgICB8IGxlbmd0aCBvZiBzdHJpbmcKKyAgKzB4MTREOCB8IDYxIDZFIDc5IDVGIDc1IDZFIDY5IDcxIHwgY2hhclsxMF0gICAgfCBhbnlfdW5pcSAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nIGxpdGVyYWwKKyAgKzB4MTRFMCB8IDc1IDY1ICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgfCB1ZQorICArMHgxNEUyIHwgMDAgICAgICAgICAgICAgICAgICAgICAgfCBjaGFyICAgICAgICB8IDB4MDAgKDApICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJpbmcgdGVybWluYXRvcgorCit0YWJsZSAocmVmbGVjdGlvbi5GaWVsZCk6CisgICsweDE0RTQgfCBBQSBFQSBGRiBGRiAgICAgICAgICAgICB8IFNPZmZzZXQzMiAgIHwgMHhGRkZGRUFBQSAoLTU0NjIpIExvYzogKzB4MkEzQSAgICB8IG9mZnNldCB0byB2dGFibGUKKyAgKzB4MTRFOCB8IDJCIDAwICAgICAgICAgICAgICAgICAgIHwgdWludDE2X3QgICAgfCAweDAwMkIgKDQzKSAgICAgICAgICAgICAgICAgICAgICAgIHwgdGFibGUgZmllbGQgYGlkYCAoVVNob3J0KQorICArMHgxNEVBIHwgNUEgMDAgICAgICAgICAgICAgICAgICAgfCB1aW50MTZfdCAgICB8IDB4MDA1QSAoOTApICAgICAgICAgICAgICAgICAgICAgICAgfCB0YWJsZSBmaWVsZCBgb2Zmc2V0YCAoVVNob3J0KQorICArMHgxNEVDIHwgNEMgMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDAwNEMgKDc2KSBMb2M6ICsweDE1MzggICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYG5hbWVgIChzdHJpbmcpCisgICsweDE0RjAgfCAzNCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDAzNCAoNTIpIExvYzogKzB4MTUyNCAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgdHlwZWAgKHRhYmxlKQorICArMHgxNEY0IHwgMEMgMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDAwMEMgKDEyKSBMb2M6ICsweDE1MDAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYGF0dHJpYnV0ZXNgICh2ZWN0b3IpCisgICsweDE0RjggfCAwNCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDAwNCAoNCkgTG9jOiArMHgxNEZDICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgZG9jdW1lbnRhdGlvbmAgKHZlY3RvcikKKwordmVjdG9yIChyZWZsZWN0aW9uLkZpZWxkLmRvY3VtZW50YXRpb24pOgorICArMHgxNEZDIHwgMDAgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICB8IDB4MDAwMDAwMDAgKDApICAgICAgICAgICAgICAgICAgICAgfCBsZW5ndGggb2YgdmVjdG9yICgjIGl0ZW1zKQorCit2ZWN0b3IgKHJlZmxlY3Rpb24uRmllbGQuYXR0cmlidXRlcyk6CisgICsweDE1MDAgfCAwMSAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgIHwgMHgwMDAwMDAwMSAoMSkgICAgICAgICAgICAgICAgICAgICB8IGxlbmd0aCBvZiB2ZWN0b3IgKCMgaXRlbXMpCisgICsweDE1MDQgfCAwNCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDAwNCAoNCkgTG9jOiArMHgxNTA4ICAgICAgICB8IG9mZnNldCB0byB0YWJsZVswXQorCit0YWJsZSAocmVmbGVjdGlvbi5LZXlWYWx1ZSk6CisgICsweDE1MDggfCBBNCBERiBGRiBGRiAgICAgICAgICAgICB8IFNPZmZzZXQzMiAgIHwgMHhGRkZGREZBNCAoLTgyODQpIExvYzogKzB4MzU2NCAgICB8IG9mZnNldCB0byB2dGFibGUKKyAgKzB4MTUwQyB8IDEwIDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMDEwICgxNikgTG9jOiArMHgxNTFDICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBrZXlgIChzdHJpbmcpCisgICsweDE1MTAgfCAwNCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDAwNCAoNCkgTG9jOiArMHgxNTE0ICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgdmFsdWVgIChzdHJpbmcpCisKK3N0cmluZyAocmVmbGVjdGlvbi5LZXlWYWx1ZS52YWx1ZSk6CisgICsweDE1MTQgfCAwMiAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgIHwgMHgwMDAwMDAwMiAoMikgICAgICAgICAgICAgICAgICAgICB8IGxlbmd0aCBvZiBzdHJpbmcKKyAgKzB4MTUxOCB8IDM0IDMzICAgICAgICAgICAgICAgICAgIHwgY2hhclsyXSAgICAgfCA0MyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nIGxpdGVyYWwKKyAgKzB4MTUxQSB8IDAwICAgICAgICAgICAgICAgICAgICAgIHwgY2hhciAgICAgICAgfCAweDAwICgwKSAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nIHRlcm1pbmF0b3IKKworc3RyaW5nIChyZWZsZWN0aW9uLktleVZhbHVlLmtleSk6CisgICsweDE1MUMgfCAwMiAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgIHwgMHgwMDAwMDAwMiAoMikgICAgICAgICAgICAgICAgICAgICB8IGxlbmd0aCBvZiBzdHJpbmcKKyAgKzB4MTUyMCB8IDY5IDY0ICAgICAgICAgICAgICAgICAgIHwgY2hhclsyXSAgICAgfCBpZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nIGxpdGVyYWwKKyAgKzB4MTUyMiB8IDAwICAgICAgICAgICAgICAgICAgICAgIHwgY2hhciAgICAgICAgfCAweDAwICgwKSAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nIHRlcm1pbmF0b3IKKwordGFibGUgKHJlZmxlY3Rpb24uVHlwZSk6CisgICsweDE1MjQgfCAyMCBERiBGRiBGRiAgICAgICAgICAgICB8IFNPZmZzZXQzMiAgIHwgMHhGRkZGREYyMCAoLTg0MTYpIExvYzogKzB4MzYwNCAgICB8IG9mZnNldCB0byB2dGFibGUKKyAgKzB4MTUyOCB8IDAwIDAwIDAwICAgICAgICAgICAgICAgIHwgdWludDhfdFszXSAgfCAuLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgcGFkZGluZworICArMHgxNTJCIHwgMDEgICAgICAgICAgICAgICAgICAgICAgfCB1aW50OF90ICAgICB8IDB4MDEgKDEpICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB0YWJsZSBmaWVsZCBgYmFzZV90eXBlYCAoQnl0ZSkKKyAgKzB4MTUyQyB8IDAyIDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgfCAweDAwMDAwMDAyICgyKSAgICAgICAgICAgICAgICAgICAgIHwgdGFibGUgZmllbGQgYGluZGV4YCAoSW50KQorICArMHgxNTMwIHwgMDEgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICB8IDB4MDAwMDAwMDEgKDEpICAgICAgICAgICAgICAgICAgICAgfCB0YWJsZSBmaWVsZCBgYmFzZV9zaXplYCAoVUludCkKKyAgKzB4MTUzNCB8IDAxIDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgfCAweDAwMDAwMDAxICgxKSAgICAgICAgICAgICAgICAgICAgIHwgdGFibGUgZmllbGQgYGVsZW1lbnRfc2l6ZWAgKFVJbnQpCisKK3N0cmluZyAocmVmbGVjdGlvbi5GaWVsZC5uYW1lKToKKyAgKzB4MTUzOCB8IDBGIDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgfCAweDAwMDAwMDBGICgxNSkgICAgICAgICAgICAgICAgICAgIHwgbGVuZ3RoIG9mIHN0cmluZworICArMHgxNTNDIHwgNjEgNkUgNzkgNUYgNzUgNkUgNjkgNzEgfCBjaGFyWzE1XSAgICB8IGFueV91bmlxICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJpbmcgbGl0ZXJhbAorICArMHgxNTQ0IHwgNzUgNjUgNUYgNzQgNzkgNzAgNjUgICAgfCAgICAgICAgICAgICB8IHVlX3R5cGUKKyAgKzB4MTU0QiB8IDAwICAgICAgICAgICAgICAgICAgICAgIHwgY2hhciAgICAgICAgfCAweDAwICgwKSAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nIHRlcm1pbmF0b3IKKwordGFibGUgKHJlZmxlY3Rpb24uRmllbGQpOgorICArMHgxNTRDIHwgMjggRUEgRkYgRkYgICAgICAgICAgICAgfCBTT2Zmc2V0MzIgICB8IDB4RkZGRkVBMjggKC01NTkyKSBMb2M6ICsweDJCMjQgICAgfCBvZmZzZXQgdG8gdnRhYmxlCisgICsweDE1NTAgfCAwMCAwMCAwMCAgICAgICAgICAgICAgICB8IHVpbnQ4X3RbM10gIHwgLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHBhZGRpbmcKKyAgKzB4MTU1MyB8IDAxICAgICAgICAgICAgICAgICAgICAgIHwgdWludDhfdCAgICAgfCAweDAxICgxKSAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgdGFibGUgZmllbGQgYG9wdGlvbmFsYCAoQm9vbCkKKyAgKzB4MTU1NCB8IDJBIDAwICAgICAgICAgICAgICAgICAgIHwgdWludDE2X3QgICAgfCAweDAwMkEgKDQyKSAgICAgICAgICAgICAgICAgICAgICAgIHwgdGFibGUgZmllbGQgYGlkYCAoVVNob3J0KQorICArMHgxNTU2IHwgNTggMDAgICAgICAgICAgICAgICAgICAgfCB1aW50MTZfdCAgICB8IDB4MDA1OCAoODgpICAgICAgICAgICAgICAgICAgICAgICAgfCB0YWJsZSBmaWVsZCBgb2Zmc2V0YCAoVVNob3J0KQorICArMHgxNTU4IHwgMDAgMDEgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDAxMDAgKDI1NikgTG9jOiArMHgxNjU4ICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYG5hbWVgIChzdHJpbmcpCisgICsweDE1NUMgfCBGMCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDBGMCAoMjQwKSBMb2M6ICsweDE2NEMgICAgICB8IG9mZnNldCB0byBmaWVsZCBgdHlwZWAgKHRhYmxlKQorICArMHgxNTYwIHwgMEMgMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDAwMEMgKDEyKSBMb2M6ICsweDE1NkMgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYGF0dHJpYnV0ZXNgICh2ZWN0b3IpCisgICsweDE1NjQgfCAwNCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDAwNCAoNCkgTG9jOiArMHgxNTY4ICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgZG9jdW1lbnRhdGlvbmAgKHZlY3RvcikKKwordmVjdG9yIChyZWZsZWN0aW9uLkZpZWxkLmRvY3VtZW50YXRpb24pOgorICArMHgxNTY4IHwgMDAgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICB8IDB4MDAwMDAwMDAgKDApICAgICAgICAgICAgICAgICAgICAgfCBsZW5ndGggb2YgdmVjdG9yICgjIGl0ZW1zKQorCit2ZWN0b3IgKHJlZmxlY3Rpb24uRmllbGQuYXR0cmlidXRlcyk6CisgICsweDE1NkMgfCAwNSAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgIHwgMHgwMDAwMDAwNSAoNSkgICAgICAgICAgICAgICAgICAgICB8IGxlbmd0aCBvZiB2ZWN0b3IgKCMgaXRlbXMpCisgICsweDE1NzAgfCBCMCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDBCMCAoMTc2KSBMb2M6ICsweDE2MjAgICAgICB8IG9mZnNldCB0byB0YWJsZVswXQorICArMHgxNTc0IHwgODAgMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDAwODAgKDEyOCkgTG9jOiArMHgxNUY0ICAgICAgfCBvZmZzZXQgdG8gdGFibGVbMV0KKyAgKzB4MTU3OCB8IDUwIDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMDUwICg4MCkgTG9jOiArMHgxNUM4ICAgICAgIHwgb2Zmc2V0IHRvIHRhYmxlWzJdCisgICsweDE1N0MgfCAyNCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDAyNCAoMzYpIExvYzogKzB4MTVBMCAgICAgICB8IG9mZnNldCB0byB0YWJsZVszXQorICArMHgxNTgwIHwgMDQgMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDAwMDQgKDQpIExvYzogKzB4MTU4NCAgICAgICAgfCBvZmZzZXQgdG8gdGFibGVbNF0KKwordGFibGUgKHJlZmxlY3Rpb24uS2V5VmFsdWUpOgorICArMHgxNTg0IHwgMjAgRTAgRkYgRkYgICAgICAgICAgICAgfCBTT2Zmc2V0MzIgICB8IDB4RkZGRkUwMjAgKC04MTYwKSBMb2M6ICsweDM1NjQgICAgfCBvZmZzZXQgdG8gdnRhYmxlCisgICsweDE1ODggfCAxMCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDAxMCAoMTYpIExvYzogKzB4MTU5OCAgICAgICB8IG9mZnNldCB0byBmaWVsZCBga2V5YCAoc3RyaW5nKQorICArMHgxNThDIHwgMDQgMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDAwMDQgKDQpIExvYzogKzB4MTU5MCAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYHZhbHVlYCAoc3RyaW5nKQorCitzdHJpbmcgKHJlZmxlY3Rpb24uS2V5VmFsdWUudmFsdWUpOgorICArMHgxNTkwIHwgMDIgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICB8IDB4MDAwMDAwMDIgKDIpICAgICAgICAgICAgICAgICAgICAgfCBsZW5ndGggb2Ygc3RyaW5nCisgICsweDE1OTQgfCAzNCAzMiAgICAgICAgICAgICAgICAgICB8IGNoYXJbMl0gICAgIHwgNDIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHN0cmluZyBsaXRlcmFsCisgICsweDE1OTYgfCAwMCAgICAgICAgICAgICAgICAgICAgICB8IGNoYXIgICAgICAgIHwgMHgwMCAoMCkgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHN0cmluZyB0ZXJtaW5hdG9yCisKK3N0cmluZyAocmVmbGVjdGlvbi5LZXlWYWx1ZS5rZXkpOgorICArMHgxNTk4IHwgMDIgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICB8IDB4MDAwMDAwMDIgKDIpICAgICAgICAgICAgICAgICAgICAgfCBsZW5ndGggb2Ygc3RyaW5nCisgICsweDE1OUMgfCA2OSA2NCAgICAgICAgICAgICAgICAgICB8IGNoYXJbMl0gICAgIHwgaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHN0cmluZyBsaXRlcmFsCisgICsweDE1OUUgfCAwMCAgICAgICAgICAgICAgICAgICAgICB8IGNoYXIgICAgICAgIHwgMHgwMCAoMCkgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHN0cmluZyB0ZXJtaW5hdG9yCisKK3RhYmxlIChyZWZsZWN0aW9uLktleVZhbHVlKToKKyAgKzB4MTVBMCB8IDNDIEUwIEZGIEZGICAgICAgICAgICAgIHwgU09mZnNldDMyICAgfCAweEZGRkZFMDNDICgtODEzMikgTG9jOiArMHgzNTY0ICAgIHwgb2Zmc2V0IHRvIHZ0YWJsZQorICArMHgxNUE0IHwgMTggMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDAwMTggKDI0KSBMb2M6ICsweDE1QkMgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYGtleWAgKHN0cmluZykKKyAgKzB4MTVBOCB8IDA0IDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMDA0ICg0KSBMb2M6ICsweDE1QUMgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGB2YWx1ZWAgKHN0cmluZykKKworc3RyaW5nIChyZWZsZWN0aW9uLktleVZhbHVlLnZhbHVlKToKKyAgKzB4MTVBQyB8IDA4IDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgfCAweDAwMDAwMDA4ICg4KSAgICAgICAgICAgICAgICAgICAgIHwgbGVuZ3RoIG9mIHN0cmluZworICArMHgxNUIwIHwgNjYgNkUgNzYgMzEgNjEgNUYgMzYgMzQgfCBjaGFyWzhdICAgICB8IGZudjFhXzY0ICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJpbmcgbGl0ZXJhbAorICArMHgxNUI4IHwgMDAgICAgICAgICAgICAgICAgICAgICAgfCBjaGFyICAgICAgICB8IDB4MDAgKDApICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJpbmcgdGVybWluYXRvcgorCitwYWRkaW5nOgorICArMHgxNUI5IHwgMDAgMDAgMDAgICAgICAgICAgICAgICAgfCB1aW50OF90WzNdICB8IC4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBwYWRkaW5nCisKK3N0cmluZyAocmVmbGVjdGlvbi5LZXlWYWx1ZS5rZXkpOgorICArMHgxNUJDIHwgMDQgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICB8IDB4MDAwMDAwMDQgKDQpICAgICAgICAgICAgICAgICAgICAgfCBsZW5ndGggb2Ygc3RyaW5nCisgICsweDE1QzAgfCA2OCA2MSA3MyA2OCAgICAgICAgICAgICB8IGNoYXJbNF0gICAgIHwgaGFzaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHN0cmluZyBsaXRlcmFsCisgICsweDE1QzQgfCAwMCAgICAgICAgICAgICAgICAgICAgICB8IGNoYXIgICAgICAgIHwgMHgwMCAoMCkgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHN0cmluZyB0ZXJtaW5hdG9yCisKK3BhZGRpbmc6CisgICsweDE1QzUgfCAwMCAwMCAwMCAgICAgICAgICAgICAgICB8IHVpbnQ4X3RbM10gIHwgLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHBhZGRpbmcKKwordGFibGUgKHJlZmxlY3Rpb24uS2V5VmFsdWUpOgorICArMHgxNUM4IHwgNjQgRTAgRkYgRkYgICAgICAgICAgICAgfCBTT2Zmc2V0MzIgICB8IDB4RkZGRkUwNjQgKC04MDkyKSBMb2M6ICsweDM1NjQgICAgfCBvZmZzZXQgdG8gdnRhYmxlCisgICsweDE1Q0MgfCAxOCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDAxOCAoMjQpIExvYzogKzB4MTVFNCAgICAgICB8IG9mZnNldCB0byBmaWVsZCBga2V5YCAoc3RyaW5nKQorICArMHgxNUQwIHwgMDQgMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDAwMDQgKDQpIExvYzogKzB4MTVENCAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYHZhbHVlYCAoc3RyaW5nKQorCitzdHJpbmcgKHJlZmxlY3Rpb24uS2V5VmFsdWUudmFsdWUpOgorICArMHgxNUQ0IHwgMEIgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICB8IDB4MDAwMDAwMEIgKDExKSAgICAgICAgICAgICAgICAgICAgfCBsZW5ndGggb2Ygc3RyaW5nCisgICsweDE1RDggfCA1MiA2NSA2NiA2NSA3MiA3MiA2MSA2MiB8IGNoYXJbMTFdICAgIHwgUmVmZXJyYWIgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHN0cmluZyBsaXRlcmFsCisgICsweDE1RTAgfCA2QyA2NSA1NCAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgIHwgbGVUCisgICsweDE1RTMgfCAwMCAgICAgICAgICAgICAgICAgICAgICB8IGNoYXIgICAgICAgIHwgMHgwMCAoMCkgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHN0cmluZyB0ZXJtaW5hdG9yCisKK3N0cmluZyAocmVmbGVjdGlvbi5LZXlWYWx1ZS5rZXkpOgorICArMHgxNUU0IHwgMDggMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICB8IDB4MDAwMDAwMDggKDgpICAgICAgICAgICAgICAgICAgICAgfCBsZW5ndGggb2Ygc3RyaW5nCisgICsweDE1RTggfCA2MyA3MCA3MCA1RiA3NCA3OSA3MCA2NSB8IGNoYXJbOF0gICAgIHwgY3BwX3R5cGUgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHN0cmluZyBsaXRlcmFsCisgICsweDE1RjAgfCAwMCAgICAgICAgICAgICAgICAgICAgICB8IGNoYXIgICAgICAgIHwgMHgwMCAoMCkgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHN0cmluZyB0ZXJtaW5hdG9yCisKK3BhZGRpbmc6CisgICsweDE1RjEgfCAwMCAwMCAwMCAgICAgICAgICAgICAgICB8IHVpbnQ4X3RbM10gIHwgLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHBhZGRpbmcKKwordGFibGUgKHJlZmxlY3Rpb24uS2V5VmFsdWUpOgorICArMHgxNUY0IHwgOTAgRTAgRkYgRkYgICAgICAgICAgICAgfCBTT2Zmc2V0MzIgICB8IDB4RkZGRkUwOTAgKC04MDQ4KSBMb2M6ICsweDM1NjQgICAgfCBvZmZzZXQgdG8gdnRhYmxlCisgICsweDE1RjggfCAxMCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDAxMCAoMTYpIExvYzogKzB4MTYwOCAgICAgICB8IG9mZnNldCB0byBmaWVsZCBga2V5YCAoc3RyaW5nKQorICArMHgxNUZDIHwgMDQgMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDAwMDQgKDQpIExvYzogKzB4MTYwMCAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYHZhbHVlYCAoc3RyaW5nKQorCitzdHJpbmcgKHJlZmxlY3Rpb24uS2V5VmFsdWUudmFsdWUpOgorICArMHgxNjAwIHwgMDAgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICB8IDB4MDAwMDAwMDAgKDApICAgICAgICAgICAgICAgICAgICAgfCBsZW5ndGggb2Ygc3RyaW5nCisgICsweDE2MDQgfCAwMCAgICAgICAgICAgICAgICAgICAgICB8IGNoYXIgICAgICAgIHwgMHgwMCAoMCkgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHN0cmluZyB0ZXJtaW5hdG9yCisKK3BhZGRpbmc6CisgICsweDE2MDUgfCAwMCAwMCAwMCAgICAgICAgICAgICAgICB8IHVpbnQ4X3RbM10gIHwgLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHBhZGRpbmcKKworc3RyaW5nIChyZWZsZWN0aW9uLktleVZhbHVlLmtleSk6CisgICsweDE2MDggfCAxMCAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgIHwgMHgwMDAwMDAxMCAoMTYpICAgICAgICAgICAgICAgICAgICB8IGxlbmd0aCBvZiBzdHJpbmcKKyAgKzB4MTYwQyB8IDYzIDcwIDcwIDVGIDcwIDc0IDcyIDVGIHwgY2hhclsxNl0gICAgfCBjcHBfcHRyXyAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nIGxpdGVyYWwKKyAgKzB4MTYxNCB8IDc0IDc5IDcwIDY1IDVGIDY3IDY1IDc0IHwgICAgICAgICAgICAgfCB0eXBlX2dldAorICArMHgxNjFDIHwgMDAgICAgICAgICAgICAgICAgICAgICAgfCBjaGFyICAgICAgICB8IDB4MDAgKDApICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJpbmcgdGVybWluYXRvcgorCitwYWRkaW5nOgorICArMHgxNjFEIHwgMDAgMDAgMDAgICAgICAgICAgICAgICAgfCB1aW50OF90WzNdICB8IC4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBwYWRkaW5nCisKK3RhYmxlIChyZWZsZWN0aW9uLktleVZhbHVlKToKKyAgKzB4MTYyMCB8IEJDIEUwIEZGIEZGICAgICAgICAgICAgIHwgU09mZnNldDMyICAgfCAweEZGRkZFMEJDICgtODAwNCkgTG9jOiArMHgzNTY0ICAgIHwgb2Zmc2V0IHRvIHZ0YWJsZQorICArMHgxNjI0IHwgMTQgMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDAwMTQgKDIwKSBMb2M6ICsweDE2MzggICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYGtleWAgKHN0cmluZykKKyAgKzB4MTYyOCB8IDA0IDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMDA0ICg0KSBMb2M6ICsweDE2MkMgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGB2YWx1ZWAgKHN0cmluZykKKworc3RyaW5nIChyZWZsZWN0aW9uLktleVZhbHVlLnZhbHVlKToKKyAgKzB4MTYyQyB8IDA1IDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgfCAweDAwMDAwMDA1ICg1KSAgICAgICAgICAgICAgICAgICAgIHwgbGVuZ3RoIG9mIHN0cmluZworICArMHgxNjMwIHwgNkUgNjEgNkIgNjUgNjQgICAgICAgICAgfCBjaGFyWzVdICAgICB8IG5ha2VkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJpbmcgbGl0ZXJhbAorICArMHgxNjM1IHwgMDAgICAgICAgICAgICAgICAgICAgICAgfCBjaGFyICAgICAgICB8IDB4MDAgKDApICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJpbmcgdGVybWluYXRvcgorCitwYWRkaW5nOgorICArMHgxNjM2IHwgMDAgMDAgICAgICAgICAgICAgICAgICAgfCB1aW50OF90WzJdICB8IC4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBwYWRkaW5nCisKK3N0cmluZyAocmVmbGVjdGlvbi5LZXlWYWx1ZS5rZXkpOgorICArMHgxNjM4IHwgMEMgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICB8IDB4MDAwMDAwMEMgKDEyKSAgICAgICAgICAgICAgICAgICAgfCBsZW5ndGggb2Ygc3RyaW5nCisgICsweDE2M0MgfCA2MyA3MCA3MCA1RiA3MCA3NCA3MiA1RiB8IGNoYXJbMTJdICAgIHwgY3BwX3B0cl8gICAgICAgICAgICAgICAgICAgICAgICAgICB8IHN0cmluZyBsaXRlcmFsCisgICsweDE2NDQgfCA3NCA3OSA3MCA2NSAgICAgICAgICAgICB8ICAgICAgICAgICAgIHwgdHlwZQorICArMHgxNjQ4IHwgMDAgICAgICAgICAgICAgICAgICAgICAgfCBjaGFyICAgICAgICB8IDB4MDAgKDApICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJpbmcgdGVybWluYXRvcgorCitwYWRkaW5nOgorICArMHgxNjQ5IHwgMDAgMDAgMDAgICAgICAgICAgICAgICAgfCB1aW50OF90WzNdICB8IC4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBwYWRkaW5nCisKK3RhYmxlIChyZWZsZWN0aW9uLlR5cGUpOgorICArMHgxNjRDIHwgQzggRUEgRkYgRkYgICAgICAgICAgICAgfCBTT2Zmc2V0MzIgICB8IDB4RkZGRkVBQzggKC01NDMyKSBMb2M6ICsweDJCODQgICAgfCBvZmZzZXQgdG8gdnRhYmxlCisgICsweDE2NTAgfCAwMCAwMCAgICAgICAgICAgICAgICAgICB8IHVpbnQ4X3RbMl0gIHwgLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHBhZGRpbmcKKyAgKzB4MTY1MiB8IDBFICAgICAgICAgICAgICAgICAgICAgIHwgdWludDhfdCAgICAgfCAweDBFICgxNCkgICAgICAgICAgICAgICAgICAgICAgICAgIHwgdGFibGUgZmllbGQgYGJhc2VfdHlwZWAgKEJ5dGUpCisgICsweDE2NTMgfCAwQSAgICAgICAgICAgICAgICAgICAgICB8IHVpbnQ4X3QgICAgIHwgMHgwQSAoMTApICAgICAgICAgICAgICAgICAgICAgICAgICB8IHRhYmxlIGZpZWxkIGBlbGVtZW50YCAoQnl0ZSkKKyAgKzB4MTY1NCB8IDA4IDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgfCAweDAwMDAwMDA4ICg4KSAgICAgICAgICAgICAgICAgICAgIHwgdGFibGUgZmllbGQgYGVsZW1lbnRfc2l6ZWAgKFVJbnQpCisKK3N0cmluZyAocmVmbGVjdGlvbi5GaWVsZC5uYW1lKToKKyAgKzB4MTY1OCB8IDFGIDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgfCAweDAwMDAwMDFGICgzMSkgICAgICAgICAgICAgICAgICAgIHwgbGVuZ3RoIG9mIHN0cmluZworICArMHgxNjVDIHwgNzYgNjUgNjMgNzQgNkYgNzIgNUYgNkYgfCBjaGFyWzMxXSAgICB8IHZlY3Rvcl9vICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJpbmcgbGl0ZXJhbAorICArMHgxNjY0IHwgNjYgNUYgNkUgNkYgNkUgNUYgNkYgNzcgfCAgICAgICAgICAgICB8IGZfbm9uX293CisgICsweDE2NkMgfCA2RSA2OSA2RSA2NyA1RiA3MiA2NSA2NiB8ICAgICAgICAgICAgIHwgbmluZ19yZWYKKyAgKzB4MTY3NCB8IDY1IDcyIDY1IDZFIDYzIDY1IDczICAgIHwgICAgICAgICAgICAgfCBlcmVuY2VzCisgICsweDE2N0IgfCAwMCAgICAgICAgICAgICAgICAgICAgICB8IGNoYXIgICAgICAgIHwgMHgwMCAoMCkgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHN0cmluZyB0ZXJtaW5hdG9yCisKK3RhYmxlIChyZWZsZWN0aW9uLkZpZWxkKToKKyAgKzB4MTY3QyB8IDQyIEVDIEZGIEZGICAgICAgICAgICAgIHwgU09mZnNldDMyICAgfCAweEZGRkZFQzQyICgtNTA1NCkgTG9jOiArMHgyQTNBICAgIHwgb2Zmc2V0IHRvIHZ0YWJsZQorICArMHgxNjgwIHwgMjkgMDAgICAgICAgICAgICAgICAgICAgfCB1aW50MTZfdCAgICB8IDB4MDAyOSAoNDEpICAgICAgICAgICAgICAgICAgICAgICAgfCB0YWJsZSBmaWVsZCBgaWRgIChVU2hvcnQpCisgICsweDE2ODIgfCA1NiAwMCAgICAgICAgICAgICAgICAgICB8IHVpbnQxNl90ICAgIHwgMHgwMDU2ICg4NikgICAgICAgICAgICAgICAgICAgICAgICB8IHRhYmxlIGZpZWxkIGBvZmZzZXRgIChVU2hvcnQpCisgICsweDE2ODQgfCAwNCAwMSAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDEwNCAoMjYwKSBMb2M6ICsweDE3ODggICAgICB8IG9mZnNldCB0byBmaWVsZCBgbmFtZWAgKHN0cmluZykKKyAgKzB4MTY4OCB8IEYwIDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMEYwICgyNDApIExvYzogKzB4MTc3OCAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGB0eXBlYCAodGFibGUpCisgICsweDE2OEMgfCAwQyAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDAwQyAoMTIpIExvYzogKzB4MTY5OCAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgYXR0cmlidXRlc2AgKHZlY3RvcikKKyAgKzB4MTY5MCB8IDA0IDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMDA0ICg0KSBMb2M6ICsweDE2OTQgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBkb2N1bWVudGF0aW9uYCAodmVjdG9yKQorCit2ZWN0b3IgKHJlZmxlY3Rpb24uRmllbGQuZG9jdW1lbnRhdGlvbik6CisgICsweDE2OTQgfCAwMCAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgIHwgMHgwMDAwMDAwMCAoMCkgICAgICAgICAgICAgICAgICAgICB8IGxlbmd0aCBvZiB2ZWN0b3IgKCMgaXRlbXMpCisKK3ZlY3RvciAocmVmbGVjdGlvbi5GaWVsZC5hdHRyaWJ1dGVzKToKKyAgKzB4MTY5OCB8IDA1IDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgfCAweDAwMDAwMDA1ICg1KSAgICAgICAgICAgICAgICAgICAgIHwgbGVuZ3RoIG9mIHZlY3RvciAoIyBpdGVtcykKKyAgKzB4MTY5QyB8IEIwIDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMEIwICgxNzYpIExvYzogKzB4MTc0QyAgICAgIHwgb2Zmc2V0IHRvIHRhYmxlWzBdCisgICsweDE2QTAgfCA4MCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDA4MCAoMTI4KSBMb2M6ICsweDE3MjAgICAgICB8IG9mZnNldCB0byB0YWJsZVsxXQorICArMHgxNkE0IHwgNTAgMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDAwNTAgKDgwKSBMb2M6ICsweDE2RjQgICAgICAgfCBvZmZzZXQgdG8gdGFibGVbMl0KKyAgKzB4MTZBOCB8IDI0IDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMDI0ICgzNikgTG9jOiArMHgxNkNDICAgICAgIHwgb2Zmc2V0IHRvIHRhYmxlWzNdCisgICsweDE2QUMgfCAwNCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDAwNCAoNCkgTG9jOiArMHgxNkIwICAgICAgICB8IG9mZnNldCB0byB0YWJsZVs0XQorCit0YWJsZSAocmVmbGVjdGlvbi5LZXlWYWx1ZSk6CisgICsweDE2QjAgfCA0QyBFMSBGRiBGRiAgICAgICAgICAgICB8IFNPZmZzZXQzMiAgIHwgMHhGRkZGRTE0QyAoLTc4NjApIExvYzogKzB4MzU2NCAgICB8IG9mZnNldCB0byB2dGFibGUKKyAgKzB4MTZCNCB8IDEwIDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMDEwICgxNikgTG9jOiArMHgxNkM0ICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBrZXlgIChzdHJpbmcpCisgICsweDE2QjggfCAwNCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDAwNCAoNCkgTG9jOiArMHgxNkJDICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgdmFsdWVgIChzdHJpbmcpCisKK3N0cmluZyAocmVmbGVjdGlvbi5LZXlWYWx1ZS52YWx1ZSk6CisgICsweDE2QkMgfCAwMiAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgIHwgMHgwMDAwMDAwMiAoMikgICAgICAgICAgICAgICAgICAgICB8IGxlbmd0aCBvZiBzdHJpbmcKKyAgKzB4MTZDMCB8IDM0IDMxICAgICAgICAgICAgICAgICAgIHwgY2hhclsyXSAgICAgfCA0MSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nIGxpdGVyYWwKKyAgKzB4MTZDMiB8IDAwICAgICAgICAgICAgICAgICAgICAgIHwgY2hhciAgICAgICAgfCAweDAwICgwKSAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nIHRlcm1pbmF0b3IKKworc3RyaW5nIChyZWZsZWN0aW9uLktleVZhbHVlLmtleSk6CisgICsweDE2QzQgfCAwMiAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgIHwgMHgwMDAwMDAwMiAoMikgICAgICAgICAgICAgICAgICAgICB8IGxlbmd0aCBvZiBzdHJpbmcKKyAgKzB4MTZDOCB8IDY5IDY0ICAgICAgICAgICAgICAgICAgIHwgY2hhclsyXSAgICAgfCBpZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nIGxpdGVyYWwKKyAgKzB4MTZDQSB8IDAwICAgICAgICAgICAgICAgICAgICAgIHwgY2hhciAgICAgICAgfCAweDAwICgwKSAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nIHRlcm1pbmF0b3IKKwordGFibGUgKHJlZmxlY3Rpb24uS2V5VmFsdWUpOgorICArMHgxNkNDIHwgNjggRTEgRkYgRkYgICAgICAgICAgICAgfCBTT2Zmc2V0MzIgICB8IDB4RkZGRkUxNjggKC03ODMyKSBMb2M6ICsweDM1NjQgICAgfCBvZmZzZXQgdG8gdnRhYmxlCisgICsweDE2RDAgfCAxOCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDAxOCAoMjQpIExvYzogKzB4MTZFOCAgICAgICB8IG9mZnNldCB0byBmaWVsZCBga2V5YCAoc3RyaW5nKQorICArMHgxNkQ0IHwgMDQgMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDAwMDQgKDQpIExvYzogKzB4MTZEOCAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYHZhbHVlYCAoc3RyaW5nKQorCitzdHJpbmcgKHJlZmxlY3Rpb24uS2V5VmFsdWUudmFsdWUpOgorICArMHgxNkQ4IHwgMDggMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICB8IDB4MDAwMDAwMDggKDgpICAgICAgICAgICAgICAgICAgICAgfCBsZW5ndGggb2Ygc3RyaW5nCisgICsweDE2REMgfCA2NiA2RSA3NiAzMSA2MSA1RiAzNiAzNCB8IGNoYXJbOF0gICAgIHwgZm52MWFfNjQgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHN0cmluZyBsaXRlcmFsCisgICsweDE2RTQgfCAwMCAgICAgICAgICAgICAgICAgICAgICB8IGNoYXIgICAgICAgIHwgMHgwMCAoMCkgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHN0cmluZyB0ZXJtaW5hdG9yCisKK3BhZGRpbmc6CisgICsweDE2RTUgfCAwMCAwMCAwMCAgICAgICAgICAgICAgICB8IHVpbnQ4X3RbM10gIHwgLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHBhZGRpbmcKKworc3RyaW5nIChyZWZsZWN0aW9uLktleVZhbHVlLmtleSk6CisgICsweDE2RTggfCAwNCAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgIHwgMHgwMDAwMDAwNCAoNCkgICAgICAgICAgICAgICAgICAgICB8IGxlbmd0aCBvZiBzdHJpbmcKKyAgKzB4MTZFQyB8IDY4IDYxIDczIDY4ICAgICAgICAgICAgIHwgY2hhcls0XSAgICAgfCBoYXNoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nIGxpdGVyYWwKKyAgKzB4MTZGMCB8IDAwICAgICAgICAgICAgICAgICAgICAgIHwgY2hhciAgICAgICAgfCAweDAwICgwKSAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nIHRlcm1pbmF0b3IKKworcGFkZGluZzoKKyAgKzB4MTZGMSB8IDAwIDAwIDAwICAgICAgICAgICAgICAgIHwgdWludDhfdFszXSAgfCAuLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgcGFkZGluZworCit0YWJsZSAocmVmbGVjdGlvbi5LZXlWYWx1ZSk6CisgICsweDE2RjQgfCA5MCBFMSBGRiBGRiAgICAgICAgICAgICB8IFNPZmZzZXQzMiAgIHwgMHhGRkZGRTE5MCAoLTc3OTIpIExvYzogKzB4MzU2NCAgICB8IG9mZnNldCB0byB2dGFibGUKKyAgKzB4MTZGOCB8IDE4IDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMDE4ICgyNCkgTG9jOiArMHgxNzEwICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBrZXlgIChzdHJpbmcpCisgICsweDE2RkMgfCAwNCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDAwNCAoNCkgTG9jOiArMHgxNzAwICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgdmFsdWVgIChzdHJpbmcpCisKK3N0cmluZyAocmVmbGVjdGlvbi5LZXlWYWx1ZS52YWx1ZSk6CisgICsweDE3MDAgfCAwQiAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgIHwgMHgwMDAwMDAwQiAoMTEpICAgICAgICAgICAgICAgICAgICB8IGxlbmd0aCBvZiBzdHJpbmcKKyAgKzB4MTcwNCB8IDUyIDY1IDY2IDY1IDcyIDcyIDYxIDYyIHwgY2hhclsxMV0gICAgfCBSZWZlcnJhYiAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nIGxpdGVyYWwKKyAgKzB4MTcwQyB8IDZDIDY1IDU0ICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgfCBsZVQKKyAgKzB4MTcwRiB8IDAwICAgICAgICAgICAgICAgICAgICAgIHwgY2hhciAgICAgICAgfCAweDAwICgwKSAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nIHRlcm1pbmF0b3IKKworc3RyaW5nIChyZWZsZWN0aW9uLktleVZhbHVlLmtleSk6CisgICsweDE3MTAgfCAwOCAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgIHwgMHgwMDAwMDAwOCAoOCkgICAgICAgICAgICAgICAgICAgICB8IGxlbmd0aCBvZiBzdHJpbmcKKyAgKzB4MTcxNCB8IDYzIDcwIDcwIDVGIDc0IDc5IDcwIDY1IHwgY2hhcls4XSAgICAgfCBjcHBfdHlwZSAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nIGxpdGVyYWwKKyAgKzB4MTcxQyB8IDAwICAgICAgICAgICAgICAgICAgICAgIHwgY2hhciAgICAgICAgfCAweDAwICgwKSAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nIHRlcm1pbmF0b3IKKworcGFkZGluZzoKKyAgKzB4MTcxRCB8IDAwIDAwIDAwICAgICAgICAgICAgICAgIHwgdWludDhfdFszXSAgfCAuLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgcGFkZGluZworCit0YWJsZSAocmVmbGVjdGlvbi5LZXlWYWx1ZSk6CisgICsweDE3MjAgfCBCQyBFMSBGRiBGRiAgICAgICAgICAgICB8IFNPZmZzZXQzMiAgIHwgMHhGRkZGRTFCQyAoLTc3NDgpIExvYzogKzB4MzU2NCAgICB8IG9mZnNldCB0byB2dGFibGUKKyAgKzB4MTcyNCB8IDEwIDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMDEwICgxNikgTG9jOiArMHgxNzM0ICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBrZXlgIChzdHJpbmcpCisgICsweDE3MjggfCAwNCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDAwNCAoNCkgTG9jOiArMHgxNzJDICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgdmFsdWVgIChzdHJpbmcpCisKK3N0cmluZyAocmVmbGVjdGlvbi5LZXlWYWx1ZS52YWx1ZSk6CisgICsweDE3MkMgfCAwMCAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgIHwgMHgwMDAwMDAwMCAoMCkgICAgICAgICAgICAgICAgICAgICB8IGxlbmd0aCBvZiBzdHJpbmcKKyAgKzB4MTczMCB8IDAwICAgICAgICAgICAgICAgICAgICAgIHwgY2hhciAgICAgICAgfCAweDAwICgwKSAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nIHRlcm1pbmF0b3IKKworcGFkZGluZzoKKyAgKzB4MTczMSB8IDAwIDAwIDAwICAgICAgICAgICAgICAgIHwgdWludDhfdFszXSAgfCAuLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgcGFkZGluZworCitzdHJpbmcgKHJlZmxlY3Rpb24uS2V5VmFsdWUua2V5KToKKyAgKzB4MTczNCB8IDEwIDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgfCAweDAwMDAwMDEwICgxNikgICAgICAgICAgICAgICAgICAgIHwgbGVuZ3RoIG9mIHN0cmluZworICArMHgxNzM4IHwgNjMgNzAgNzAgNUYgNzAgNzQgNzIgNUYgfCBjaGFyWzE2XSAgICB8IGNwcF9wdHJfICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJpbmcgbGl0ZXJhbAorICArMHgxNzQwIHwgNzQgNzkgNzAgNjUgNUYgNjcgNjUgNzQgfCAgICAgICAgICAgICB8IHR5cGVfZ2V0CisgICsweDE3NDggfCAwMCAgICAgICAgICAgICAgICAgICAgICB8IGNoYXIgICAgICAgIHwgMHgwMCAoMCkgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHN0cmluZyB0ZXJtaW5hdG9yCisKK3BhZGRpbmc6CisgICsweDE3NDkgfCAwMCAwMCAwMCAgICAgICAgICAgICAgICB8IHVpbnQ4X3RbM10gIHwgLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHBhZGRpbmcKKwordGFibGUgKHJlZmxlY3Rpb24uS2V5VmFsdWUpOgorICArMHgxNzRDIHwgRTggRTEgRkYgRkYgICAgICAgICAgICAgfCBTT2Zmc2V0MzIgICB8IDB4RkZGRkUxRTggKC03NzA0KSBMb2M6ICsweDM1NjQgICAgfCBvZmZzZXQgdG8gdnRhYmxlCisgICsweDE3NTAgfCAxNCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDAxNCAoMjApIExvYzogKzB4MTc2NCAgICAgICB8IG9mZnNldCB0byBmaWVsZCBga2V5YCAoc3RyaW5nKQorICArMHgxNzU0IHwgMDQgMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDAwMDQgKDQpIExvYzogKzB4MTc1OCAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYHZhbHVlYCAoc3RyaW5nKQorCitzdHJpbmcgKHJlZmxlY3Rpb24uS2V5VmFsdWUudmFsdWUpOgorICArMHgxNzU4IHwgMDUgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICB8IDB4MDAwMDAwMDUgKDUpICAgICAgICAgICAgICAgICAgICAgfCBsZW5ndGggb2Ygc3RyaW5nCisgICsweDE3NUMgfCA2RSA2MSA2QiA2NSA2NCAgICAgICAgICB8IGNoYXJbNV0gICAgIHwgbmFrZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHN0cmluZyBsaXRlcmFsCisgICsweDE3NjEgfCAwMCAgICAgICAgICAgICAgICAgICAgICB8IGNoYXIgICAgICAgIHwgMHgwMCAoMCkgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHN0cmluZyB0ZXJtaW5hdG9yCisKK3BhZGRpbmc6CisgICsweDE3NjIgfCAwMCAwMCAgICAgICAgICAgICAgICAgICB8IHVpbnQ4X3RbMl0gIHwgLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHBhZGRpbmcKKworc3RyaW5nIChyZWZsZWN0aW9uLktleVZhbHVlLmtleSk6CisgICsweDE3NjQgfCAwQyAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgIHwgMHgwMDAwMDAwQyAoMTIpICAgICAgICAgICAgICAgICAgICB8IGxlbmd0aCBvZiBzdHJpbmcKKyAgKzB4MTc2OCB8IDYzIDcwIDcwIDVGIDcwIDc0IDcyIDVGIHwgY2hhclsxMl0gICAgfCBjcHBfcHRyXyAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nIGxpdGVyYWwKKyAgKzB4MTc3MCB8IDc0IDc5IDcwIDY1ICAgICAgICAgICAgIHwgICAgICAgICAgICAgfCB0eXBlCisgICsweDE3NzQgfCAwMCAgICAgICAgICAgICAgICAgICAgICB8IGNoYXIgICAgICAgIHwgMHgwMCAoMCkgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHN0cmluZyB0ZXJtaW5hdG9yCisKK3BhZGRpbmc6CisgICsweDE3NzUgfCAwMCAwMCAwMCAgICAgICAgICAgICAgICB8IHVpbnQ4X3RbM10gIHwgLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHBhZGRpbmcKKwordGFibGUgKHJlZmxlY3Rpb24uVHlwZSk6CisgICsweDE3NzggfCA5NCBFMCBGRiBGRiAgICAgICAgICAgICB8IFNPZmZzZXQzMiAgIHwgMHhGRkZGRTA5NCAoLTgwNDQpIExvYzogKzB4MzZFNCAgICB8IG9mZnNldCB0byB2dGFibGUKKyAgKzB4MTc3QyB8IDAwIDAwIDAwICAgICAgICAgICAgICAgIHwgdWludDhfdFszXSAgfCAuLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgcGFkZGluZworICArMHgxNzdGIHwgMEEgICAgICAgICAgICAgICAgICAgICAgfCB1aW50OF90ICAgICB8IDB4MEEgKDEwKSAgICAgICAgICAgICAgICAgICAgICAgICAgfCB0YWJsZSBmaWVsZCBgYmFzZV90eXBlYCAoQnl0ZSkKKyAgKzB4MTc4MCB8IDA4IDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgfCAweDAwMDAwMDA4ICg4KSAgICAgICAgICAgICAgICAgICAgIHwgdGFibGUgZmllbGQgYGJhc2Vfc2l6ZWAgKFVJbnQpCisgICsweDE3ODQgfCAwMSAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgIHwgMHgwMDAwMDAwMSAoMSkgICAgICAgICAgICAgICAgICAgICB8IHRhYmxlIGZpZWxkIGBlbGVtZW50X3NpemVgIChVSW50KQorCitzdHJpbmcgKHJlZmxlY3Rpb24uRmllbGQubmFtZSk6CisgICsweDE3ODggfCAxNCAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgIHwgMHgwMDAwMDAxNCAoMjApICAgICAgICAgICAgICAgICAgICB8IGxlbmd0aCBvZiBzdHJpbmcKKyAgKzB4MTc4QyB8IDZFIDZGIDZFIDVGIDZGIDc3IDZFIDY5IHwgY2hhclsyMF0gICAgfCBub25fb3duaSAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nIGxpdGVyYWwKKyAgKzB4MTc5NCB8IDZFIDY3IDVGIDcyIDY1IDY2IDY1IDcyIHwgICAgICAgICAgICAgfCBuZ19yZWZlcgorICArMHgxNzlDIHwgNjUgNkUgNjMgNjUgICAgICAgICAgICAgfCAgICAgICAgICAgICB8IGVuY2UKKyAgKzB4MTdBMCB8IDAwICAgICAgICAgICAgICAgICAgICAgIHwgY2hhciAgICAgICAgfCAweDAwICgwKSAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nIHRlcm1pbmF0b3IKKworcGFkZGluZzoKKyAgKzB4MTdBMSB8IDAwIDAwIDAwICAgICAgICAgICAgICAgIHwgdWludDhfdFszXSAgfCAuLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgcGFkZGluZworCit0YWJsZSAocmVmbGVjdGlvbi5GaWVsZCk6CisgICsweDE3QTQgfCA4MCBFQyBGRiBGRiAgICAgICAgICAgICB8IFNPZmZzZXQzMiAgIHwgMHhGRkZGRUM4MCAoLTQ5OTIpIExvYzogKzB4MkIyNCAgICB8IG9mZnNldCB0byB2dGFibGUKKyAgKzB4MTdBOCB8IDAwIDAwIDAwICAgICAgICAgICAgICAgIHwgdWludDhfdFszXSAgfCAuLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgcGFkZGluZworICArMHgxN0FCIHwgMDEgICAgICAgICAgICAgICAgICAgICAgfCB1aW50OF90ICAgICB8IDB4MDEgKDEpICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB0YWJsZSBmaWVsZCBgb3B0aW9uYWxgIChCb29sKQorICArMHgxN0FDIHwgMjggMDAgICAgICAgICAgICAgICAgICAgfCB1aW50MTZfdCAgICB8IDB4MDAyOCAoNDApICAgICAgICAgICAgICAgICAgICAgICAgfCB0YWJsZSBmaWVsZCBgaWRgIChVU2hvcnQpCisgICsweDE3QUUgfCA1NCAwMCAgICAgICAgICAgICAgICAgICB8IHVpbnQxNl90ICAgIHwgMHgwMDU0ICg4NCkgICAgICAgICAgICAgICAgICAgICAgICB8IHRhYmxlIGZpZWxkIGBvZmZzZXRgIChVU2hvcnQpCisgICsweDE3QjAgfCAxMCAwMSAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDExMCAoMjcyKSBMb2M6ICsweDE4QzAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgbmFtZWAgKHN0cmluZykKKyAgKzB4MTdCNCB8IDAwIDAxIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMTAwICgyNTYpIExvYzogKzB4MThCNCAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGB0eXBlYCAodGFibGUpCisgICsweDE3QjggfCAwQyAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDAwQyAoMTIpIExvYzogKzB4MTdDNCAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgYXR0cmlidXRlc2AgKHZlY3RvcikKKyAgKzB4MTdCQyB8IDA0IDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMDA0ICg0KSBMb2M6ICsweDE3QzAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBkb2N1bWVudGF0aW9uYCAodmVjdG9yKQorCit2ZWN0b3IgKHJlZmxlY3Rpb24uRmllbGQuZG9jdW1lbnRhdGlvbik6CisgICsweDE3QzAgfCAwMCAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgIHwgMHgwMDAwMDAwMCAoMCkgICAgICAgICAgICAgICAgICAgICB8IGxlbmd0aCBvZiB2ZWN0b3IgKCMgaXRlbXMpCisKK3ZlY3RvciAocmVmbGVjdGlvbi5GaWVsZC5hdHRyaWJ1dGVzKToKKyAgKzB4MTdDNCB8IDA1IDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgfCAweDAwMDAwMDA1ICg1KSAgICAgICAgICAgICAgICAgICAgIHwgbGVuZ3RoIG9mIHZlY3RvciAoIyBpdGVtcykKKyAgKzB4MTdDOCB8IEI0IDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMEI0ICgxODApIExvYzogKzB4MTg3QyAgICAgIHwgb2Zmc2V0IHRvIHRhYmxlWzBdCisgICsweDE3Q0MgfCA4MCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDA4MCAoMTI4KSBMb2M6ICsweDE4NEMgICAgICB8IG9mZnNldCB0byB0YWJsZVsxXQorICArMHgxN0QwIHwgNTAgMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDAwNTAgKDgwKSBMb2M6ICsweDE4MjAgICAgICAgfCBvZmZzZXQgdG8gdGFibGVbMl0KKyAgKzB4MTdENCB8IDI0IDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMDI0ICgzNikgTG9jOiArMHgxN0Y4ICAgICAgIHwgb2Zmc2V0IHRvIHRhYmxlWzNdCisgICsweDE3RDggfCAwNCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDAwNCAoNCkgTG9jOiArMHgxN0RDICAgICAgICB8IG9mZnNldCB0byB0YWJsZVs0XQorCit0YWJsZSAocmVmbGVjdGlvbi5LZXlWYWx1ZSk6CisgICsweDE3REMgfCA3OCBFMiBGRiBGRiAgICAgICAgICAgICB8IFNPZmZzZXQzMiAgIHwgMHhGRkZGRTI3OCAoLTc1NjApIExvYzogKzB4MzU2NCAgICB8IG9mZnNldCB0byB2dGFibGUKKyAgKzB4MTdFMCB8IDEwIDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMDEwICgxNikgTG9jOiArMHgxN0YwICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBrZXlgIChzdHJpbmcpCisgICsweDE3RTQgfCAwNCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDAwNCAoNCkgTG9jOiArMHgxN0U4ICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgdmFsdWVgIChzdHJpbmcpCisKK3N0cmluZyAocmVmbGVjdGlvbi5LZXlWYWx1ZS52YWx1ZSk6CisgICsweDE3RTggfCAwMiAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgIHwgMHgwMDAwMDAwMiAoMikgICAgICAgICAgICAgICAgICAgICB8IGxlbmd0aCBvZiBzdHJpbmcKKyAgKzB4MTdFQyB8IDM0IDMwICAgICAgICAgICAgICAgICAgIHwgY2hhclsyXSAgICAgfCA0MCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nIGxpdGVyYWwKKyAgKzB4MTdFRSB8IDAwICAgICAgICAgICAgICAgICAgICAgIHwgY2hhciAgICAgICAgfCAweDAwICgwKSAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nIHRlcm1pbmF0b3IKKworc3RyaW5nIChyZWZsZWN0aW9uLktleVZhbHVlLmtleSk6CisgICsweDE3RjAgfCAwMiAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgIHwgMHgwMDAwMDAwMiAoMikgICAgICAgICAgICAgICAgICAgICB8IGxlbmd0aCBvZiBzdHJpbmcKKyAgKzB4MTdGNCB8IDY5IDY0ICAgICAgICAgICAgICAgICAgIHwgY2hhclsyXSAgICAgfCBpZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nIGxpdGVyYWwKKyAgKzB4MTdGNiB8IDAwICAgICAgICAgICAgICAgICAgICAgIHwgY2hhciAgICAgICAgfCAweDAwICgwKSAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nIHRlcm1pbmF0b3IKKwordGFibGUgKHJlZmxlY3Rpb24uS2V5VmFsdWUpOgorICArMHgxN0Y4IHwgOTQgRTIgRkYgRkYgICAgICAgICAgICAgfCBTT2Zmc2V0MzIgICB8IDB4RkZGRkUyOTQgKC03NTMyKSBMb2M6ICsweDM1NjQgICAgfCBvZmZzZXQgdG8gdnRhYmxlCisgICsweDE3RkMgfCAxOCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDAxOCAoMjQpIExvYzogKzB4MTgxNCAgICAgICB8IG9mZnNldCB0byBmaWVsZCBga2V5YCAoc3RyaW5nKQorICArMHgxODAwIHwgMDQgMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDAwMDQgKDQpIExvYzogKzB4MTgwNCAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYHZhbHVlYCAoc3RyaW5nKQorCitzdHJpbmcgKHJlZmxlY3Rpb24uS2V5VmFsdWUudmFsdWUpOgorICArMHgxODA0IHwgMDggMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICB8IDB4MDAwMDAwMDggKDgpICAgICAgICAgICAgICAgICAgICAgfCBsZW5ndGggb2Ygc3RyaW5nCisgICsweDE4MDggfCA2NiA2RSA3NiAzMSA2MSA1RiAzNiAzNCB8IGNoYXJbOF0gICAgIHwgZm52MWFfNjQgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHN0cmluZyBsaXRlcmFsCisgICsweDE4MTAgfCAwMCAgICAgICAgICAgICAgICAgICAgICB8IGNoYXIgICAgICAgIHwgMHgwMCAoMCkgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHN0cmluZyB0ZXJtaW5hdG9yCisKK3BhZGRpbmc6CisgICsweDE4MTEgfCAwMCAwMCAwMCAgICAgICAgICAgICAgICB8IHVpbnQ4X3RbM10gIHwgLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHBhZGRpbmcKKworc3RyaW5nIChyZWZsZWN0aW9uLktleVZhbHVlLmtleSk6CisgICsweDE4MTQgfCAwNCAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgIHwgMHgwMDAwMDAwNCAoNCkgICAgICAgICAgICAgICAgICAgICB8IGxlbmd0aCBvZiBzdHJpbmcKKyAgKzB4MTgxOCB8IDY4IDYxIDczIDY4ICAgICAgICAgICAgIHwgY2hhcls0XSAgICAgfCBoYXNoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nIGxpdGVyYWwKKyAgKzB4MTgxQyB8IDAwICAgICAgICAgICAgICAgICAgICAgIHwgY2hhciAgICAgICAgfCAweDAwICgwKSAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nIHRlcm1pbmF0b3IKKworcGFkZGluZzoKKyAgKzB4MTgxRCB8IDAwIDAwIDAwICAgICAgICAgICAgICAgIHwgdWludDhfdFszXSAgfCAuLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgcGFkZGluZworCit0YWJsZSAocmVmbGVjdGlvbi5LZXlWYWx1ZSk6CisgICsweDE4MjAgfCBCQyBFMiBGRiBGRiAgICAgICAgICAgICB8IFNPZmZzZXQzMiAgIHwgMHhGRkZGRTJCQyAoLTc0OTIpIExvYzogKzB4MzU2NCAgICB8IG9mZnNldCB0byB2dGFibGUKKyAgKzB4MTgyNCB8IDE4IDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMDE4ICgyNCkgTG9jOiArMHgxODNDICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBrZXlgIChzdHJpbmcpCisgICsweDE4MjggfCAwNCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDAwNCAoNCkgTG9jOiArMHgxODJDICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgdmFsdWVgIChzdHJpbmcpCisKK3N0cmluZyAocmVmbGVjdGlvbi5LZXlWYWx1ZS52YWx1ZSk6CisgICsweDE4MkMgfCAwQiAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgIHwgMHgwMDAwMDAwQiAoMTEpICAgICAgICAgICAgICAgICAgICB8IGxlbmd0aCBvZiBzdHJpbmcKKyAgKzB4MTgzMCB8IDUyIDY1IDY2IDY1IDcyIDcyIDYxIDYyIHwgY2hhclsxMV0gICAgfCBSZWZlcnJhYiAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nIGxpdGVyYWwKKyAgKzB4MTgzOCB8IDZDIDY1IDU0ICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgfCBsZVQKKyAgKzB4MTgzQiB8IDAwICAgICAgICAgICAgICAgICAgICAgIHwgY2hhciAgICAgICAgfCAweDAwICgwKSAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nIHRlcm1pbmF0b3IKKworc3RyaW5nIChyZWZsZWN0aW9uLktleVZhbHVlLmtleSk6CisgICsweDE4M0MgfCAwOCAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgIHwgMHgwMDAwMDAwOCAoOCkgICAgICAgICAgICAgICAgICAgICB8IGxlbmd0aCBvZiBzdHJpbmcKKyAgKzB4MTg0MCB8IDYzIDcwIDcwIDVGIDc0IDc5IDcwIDY1IHwgY2hhcls4XSAgICAgfCBjcHBfdHlwZSAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nIGxpdGVyYWwKKyAgKzB4MTg0OCB8IDAwICAgICAgICAgICAgICAgICAgICAgIHwgY2hhciAgICAgICAgfCAweDAwICgwKSAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nIHRlcm1pbmF0b3IKKworcGFkZGluZzoKKyAgKzB4MTg0OSB8IDAwIDAwIDAwICAgICAgICAgICAgICAgIHwgdWludDhfdFszXSAgfCAuLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgcGFkZGluZworCit0YWJsZSAocmVmbGVjdGlvbi5LZXlWYWx1ZSk6CisgICsweDE4NEMgfCBFOCBFMiBGRiBGRiAgICAgICAgICAgICB8IFNPZmZzZXQzMiAgIHwgMHhGRkZGRTJFOCAoLTc0NDgpIExvYzogKzB4MzU2NCAgICB8IG9mZnNldCB0byB2dGFibGUKKyAgKzB4MTg1MCB8IDE0IDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMDE0ICgyMCkgTG9jOiArMHgxODY0ICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBrZXlgIChzdHJpbmcpCisgICsweDE4NTQgfCAwNCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDAwNCAoNCkgTG9jOiArMHgxODU4ICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgdmFsdWVgIChzdHJpbmcpCisKK3N0cmluZyAocmVmbGVjdGlvbi5LZXlWYWx1ZS52YWx1ZSk6CisgICsweDE4NTggfCAwNiAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgIHwgMHgwMDAwMDAwNiAoNikgICAgICAgICAgICAgICAgICAgICB8IGxlbmd0aCBvZiBzdHJpbmcKKyAgKzB4MTg1QyB8IDJFIDY3IDY1IDc0IDI4IDI5ICAgICAgIHwgY2hhcls2XSAgICAgfCAuZ2V0KCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nIGxpdGVyYWwKKyAgKzB4MTg2MiB8IDAwICAgICAgICAgICAgICAgICAgICAgIHwgY2hhciAgICAgICAgfCAweDAwICgwKSAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nIHRlcm1pbmF0b3IKKworc3RyaW5nIChyZWZsZWN0aW9uLktleVZhbHVlLmtleSk6CisgICsweDE4NjQgfCAxMCAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgIHwgMHgwMDAwMDAxMCAoMTYpICAgICAgICAgICAgICAgICAgICB8IGxlbmd0aCBvZiBzdHJpbmcKKyAgKzB4MTg2OCB8IDYzIDcwIDcwIDVGIDcwIDc0IDcyIDVGIHwgY2hhclsxNl0gICAgfCBjcHBfcHRyXyAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nIGxpdGVyYWwKKyAgKzB4MTg3MCB8IDc0IDc5IDcwIDY1IDVGIDY3IDY1IDc0IHwgICAgICAgICAgICAgfCB0eXBlX2dldAorICArMHgxODc4IHwgMDAgICAgICAgICAgICAgICAgICAgICAgfCBjaGFyICAgICAgICB8IDB4MDAgKDApICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJpbmcgdGVybWluYXRvcgorCitwYWRkaW5nOgorICArMHgxODc5IHwgMDAgMDAgMDAgICAgICAgICAgICAgICAgfCB1aW50OF90WzNdICB8IC4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBwYWRkaW5nCisKK3RhYmxlIChyZWZsZWN0aW9uLktleVZhbHVlKToKKyAgKzB4MTg3QyB8IDE4IEUzIEZGIEZGICAgICAgICAgICAgIHwgU09mZnNldDMyICAgfCAweEZGRkZFMzE4ICgtNzQwMCkgTG9jOiArMHgzNTY0ICAgIHwgb2Zmc2V0IHRvIHZ0YWJsZQorICArMHgxODgwIHwgMjAgMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDAwMjAgKDMyKSBMb2M6ICsweDE4QTAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYGtleWAgKHN0cmluZykKKyAgKzB4MTg4NCB8IDA0IDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMDA0ICg0KSBMb2M6ICsweDE4ODggICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGB2YWx1ZWAgKHN0cmluZykKKworc3RyaW5nIChyZWZsZWN0aW9uLktleVZhbHVlLnZhbHVlKToKKyAgKzB4MTg4OCB8IDEwIDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgfCAweDAwMDAwMDEwICgxNikgICAgICAgICAgICAgICAgICAgIHwgbGVuZ3RoIG9mIHN0cmluZworICArMHgxODhDIHwgNjQgNjUgNjYgNjEgNzUgNkMgNzQgNUYgfCBjaGFyWzE2XSAgICB8IGRlZmF1bHRfICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJpbmcgbGl0ZXJhbAorICArMHgxODk0IHwgNzAgNzQgNzIgNUYgNzQgNzkgNzAgNjUgfCAgICAgICAgICAgICB8IHB0cl90eXBlCisgICsweDE4OUMgfCAwMCAgICAgICAgICAgICAgICAgICAgICB8IGNoYXIgICAgICAgIHwgMHgwMCAoMCkgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHN0cmluZyB0ZXJtaW5hdG9yCisKK3BhZGRpbmc6CisgICsweDE4OUQgfCAwMCAwMCAwMCAgICAgICAgICAgICAgICB8IHVpbnQ4X3RbM10gIHwgLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHBhZGRpbmcKKworc3RyaW5nIChyZWZsZWN0aW9uLktleVZhbHVlLmtleSk6CisgICsweDE4QTAgfCAwQyAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgIHwgMHgwMDAwMDAwQyAoMTIpICAgICAgICAgICAgICAgICAgICB8IGxlbmd0aCBvZiBzdHJpbmcKKyAgKzB4MThBNCB8IDYzIDcwIDcwIDVGIDcwIDc0IDcyIDVGIHwgY2hhclsxMl0gICAgfCBjcHBfcHRyXyAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nIGxpdGVyYWwKKyAgKzB4MThBQyB8IDc0IDc5IDcwIDY1ICAgICAgICAgICAgIHwgICAgICAgICAgICAgfCB0eXBlCisgICsweDE4QjAgfCAwMCAgICAgICAgICAgICAgICAgICAgICB8IGNoYXIgICAgICAgIHwgMHgwMCAoMCkgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHN0cmluZyB0ZXJtaW5hdG9yCisKK3BhZGRpbmc6CisgICsweDE4QjEgfCAwMCAwMCAwMCAgICAgICAgICAgICAgICB8IHVpbnQ4X3RbM10gIHwgLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHBhZGRpbmcKKwordGFibGUgKHJlZmxlY3Rpb24uVHlwZSk6CisgICsweDE4QjQgfCAzMCBFRCBGRiBGRiAgICAgICAgICAgICB8IFNPZmZzZXQzMiAgIHwgMHhGRkZGRUQzMCAoLTQ4MTYpIExvYzogKzB4MkI4NCAgICB8IG9mZnNldCB0byB2dGFibGUKKyAgKzB4MThCOCB8IDAwIDAwICAgICAgICAgICAgICAgICAgIHwgdWludDhfdFsyXSAgfCAuLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgcGFkZGluZworICArMHgxOEJBIHwgMEUgICAgICAgICAgICAgICAgICAgICAgfCB1aW50OF90ICAgICB8IDB4MEUgKDE0KSAgICAgICAgICAgICAgICAgICAgICAgICAgfCB0YWJsZSBmaWVsZCBgYmFzZV90eXBlYCAoQnl0ZSkKKyAgKzB4MThCQiB8IDBBICAgICAgICAgICAgICAgICAgICAgIHwgdWludDhfdCAgICAgfCAweDBBICgxMCkgICAgICAgICAgICAgICAgICAgICAgICAgIHwgdGFibGUgZmllbGQgYGVsZW1lbnRgIChCeXRlKQorICArMHgxOEJDIHwgMDggMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICB8IDB4MDAwMDAwMDggKDgpICAgICAgICAgICAgICAgICAgICAgfCB0YWJsZSBmaWVsZCBgZWxlbWVudF9zaXplYCAoVUludCkKKworc3RyaW5nIChyZWZsZWN0aW9uLkZpZWxkLm5hbWUpOgorICArMHgxOEMwIHwgMUUgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICB8IDB4MDAwMDAwMUUgKDMwKSAgICAgICAgICAgICAgICAgICAgfCBsZW5ndGggb2Ygc3RyaW5nCisgICsweDE4QzQgfCA3NiA2NSA2MyA3NCA2RiA3MiA1RiA2RiB8IGNoYXJbMzBdICAgIHwgdmVjdG9yX28gICAgICAgICAgICAgICAgICAgICAgICAgICB8IHN0cmluZyBsaXRlcmFsCisgICsweDE4Q0MgfCA2NiA1RiA2MyA2RiA1RiA2RiA3NyA2RSB8ICAgICAgICAgICAgIHwgZl9jb19vd24KKyAgKzB4MThENCB8IDY5IDZFIDY3IDVGIDcyIDY1IDY2IDY1IHwgICAgICAgICAgICAgfCBpbmdfcmVmZQorICArMHgxOERDIHwgNzIgNjUgNkUgNjMgNjUgNzMgICAgICAgfCAgICAgICAgICAgICB8IHJlbmNlcworICArMHgxOEUyIHwgMDAgICAgICAgICAgICAgICAgICAgICAgfCBjaGFyICAgICAgICB8IDB4MDAgKDApICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJpbmcgdGVybWluYXRvcgorCit0YWJsZSAocmVmbGVjdGlvbi5GaWVsZCk6CisgICsweDE4RTQgfCBBQSBFRSBGRiBGRiAgICAgICAgICAgICB8IFNPZmZzZXQzMiAgIHwgMHhGRkZGRUVBQSAoLTQ0MzgpIExvYzogKzB4MkEzQSAgICB8IG9mZnNldCB0byB2dGFibGUKKyAgKzB4MThFOCB8IDI3IDAwICAgICAgICAgICAgICAgICAgIHwgdWludDE2X3QgICAgfCAweDAwMjcgKDM5KSAgICAgICAgICAgICAgICAgICAgICAgIHwgdGFibGUgZmllbGQgYGlkYCAoVVNob3J0KQorICArMHgxOEVBIHwgNTIgMDAgICAgICAgICAgICAgICAgICAgfCB1aW50MTZfdCAgICB8IDB4MDA1MiAoODIpICAgICAgICAgICAgICAgICAgICAgICAgfCB0YWJsZSBmaWVsZCBgb2Zmc2V0YCAoVVNob3J0KQorICArMHgxOEVDIHwgRDQgMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDAwRDQgKDIxMikgTG9jOiArMHgxOUMwICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYG5hbWVgIChzdHJpbmcpCisgICsweDE4RjAgfCBDMCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDBDMCAoMTkyKSBMb2M6ICsweDE5QjAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgdHlwZWAgKHRhYmxlKQorICArMHgxOEY0IHwgMEMgMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDAwMEMgKDEyKSBMb2M6ICsweDE5MDAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYGF0dHJpYnV0ZXNgICh2ZWN0b3IpCisgICsweDE4RjggfCAwNCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDAwNCAoNCkgTG9jOiArMHgxOEZDICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgZG9jdW1lbnRhdGlvbmAgKHZlY3RvcikKKwordmVjdG9yIChyZWZsZWN0aW9uLkZpZWxkLmRvY3VtZW50YXRpb24pOgorICArMHgxOEZDIHwgMDAgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICB8IDB4MDAwMDAwMDAgKDApICAgICAgICAgICAgICAgICAgICAgfCBsZW5ndGggb2YgdmVjdG9yICgjIGl0ZW1zKQorCit2ZWN0b3IgKHJlZmxlY3Rpb24uRmllbGQuYXR0cmlidXRlcyk6CisgICsweDE5MDAgfCAwNCAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgIHwgMHgwMDAwMDAwNCAoNCkgICAgICAgICAgICAgICAgICAgICB8IGxlbmd0aCBvZiB2ZWN0b3IgKCMgaXRlbXMpCisgICsweDE5MDQgfCA4MCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDA4MCAoMTI4KSBMb2M6ICsweDE5ODQgICAgICB8IG9mZnNldCB0byB0YWJsZVswXQorICArMHgxOTA4IHwgNTAgMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDAwNTAgKDgwKSBMb2M6ICsweDE5NTggICAgICAgfCBvZmZzZXQgdG8gdGFibGVbMV0KKyAgKzB4MTkwQyB8IDI0IDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMDI0ICgzNikgTG9jOiArMHgxOTMwICAgICAgIHwgb2Zmc2V0IHRvIHRhYmxlWzJdCisgICsweDE5MTAgfCAwNCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDAwNCAoNCkgTG9jOiArMHgxOTE0ICAgICAgICB8IG9mZnNldCB0byB0YWJsZVszXQorCit0YWJsZSAocmVmbGVjdGlvbi5LZXlWYWx1ZSk6CisgICsweDE5MTQgfCBCMCBFMyBGRiBGRiAgICAgICAgICAgICB8IFNPZmZzZXQzMiAgIHwgMHhGRkZGRTNCMCAoLTcyNDgpIExvYzogKzB4MzU2NCAgICB8IG9mZnNldCB0byB2dGFibGUKKyAgKzB4MTkxOCB8IDEwIDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMDEwICgxNikgTG9jOiArMHgxOTI4ICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBrZXlgIChzdHJpbmcpCisgICsweDE5MUMgfCAwNCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDAwNCAoNCkgTG9jOiArMHgxOTIwICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgdmFsdWVgIChzdHJpbmcpCisKK3N0cmluZyAocmVmbGVjdGlvbi5LZXlWYWx1ZS52YWx1ZSk6CisgICsweDE5MjAgfCAwMiAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgIHwgMHgwMDAwMDAwMiAoMikgICAgICAgICAgICAgICAgICAgICB8IGxlbmd0aCBvZiBzdHJpbmcKKyAgKzB4MTkyNCB8IDMzIDM5ICAgICAgICAgICAgICAgICAgIHwgY2hhclsyXSAgICAgfCAzOSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nIGxpdGVyYWwKKyAgKzB4MTkyNiB8IDAwICAgICAgICAgICAgICAgICAgICAgIHwgY2hhciAgICAgICAgfCAweDAwICgwKSAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nIHRlcm1pbmF0b3IKKworc3RyaW5nIChyZWZsZWN0aW9uLktleVZhbHVlLmtleSk6CisgICsweDE5MjggfCAwMiAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgIHwgMHgwMDAwMDAwMiAoMikgICAgICAgICAgICAgICAgICAgICB8IGxlbmd0aCBvZiBzdHJpbmcKKyAgKzB4MTkyQyB8IDY5IDY0ICAgICAgICAgICAgICAgICAgIHwgY2hhclsyXSAgICAgfCBpZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nIGxpdGVyYWwKKyAgKzB4MTkyRSB8IDAwICAgICAgICAgICAgICAgICAgICAgIHwgY2hhciAgICAgICAgfCAweDAwICgwKSAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nIHRlcm1pbmF0b3IKKwordGFibGUgKHJlZmxlY3Rpb24uS2V5VmFsdWUpOgorICArMHgxOTMwIHwgQ0MgRTMgRkYgRkYgICAgICAgICAgICAgfCBTT2Zmc2V0MzIgICB8IDB4RkZGRkUzQ0MgKC03MjIwKSBMb2M6ICsweDM1NjQgICAgfCBvZmZzZXQgdG8gdnRhYmxlCisgICsweDE5MzQgfCAxOCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDAxOCAoMjQpIExvYzogKzB4MTk0QyAgICAgICB8IG9mZnNldCB0byBmaWVsZCBga2V5YCAoc3RyaW5nKQorICArMHgxOTM4IHwgMDQgMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDAwMDQgKDQpIExvYzogKzB4MTkzQyAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYHZhbHVlYCAoc3RyaW5nKQorCitzdHJpbmcgKHJlZmxlY3Rpb24uS2V5VmFsdWUudmFsdWUpOgorICArMHgxOTNDIHwgMDggMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICB8IDB4MDAwMDAwMDggKDgpICAgICAgICAgICAgICAgICAgICAgfCBsZW5ndGggb2Ygc3RyaW5nCisgICsweDE5NDAgfCA2NiA2RSA3NiAzMSA2MSA1RiAzNiAzNCB8IGNoYXJbOF0gICAgIHwgZm52MWFfNjQgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHN0cmluZyBsaXRlcmFsCisgICsweDE5NDggfCAwMCAgICAgICAgICAgICAgICAgICAgICB8IGNoYXIgICAgICAgIHwgMHgwMCAoMCkgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHN0cmluZyB0ZXJtaW5hdG9yCisKK3BhZGRpbmc6CisgICsweDE5NDkgfCAwMCAwMCAwMCAgICAgICAgICAgICAgICB8IHVpbnQ4X3RbM10gIHwgLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHBhZGRpbmcKKworc3RyaW5nIChyZWZsZWN0aW9uLktleVZhbHVlLmtleSk6CisgICsweDE5NEMgfCAwNCAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgIHwgMHgwMDAwMDAwNCAoNCkgICAgICAgICAgICAgICAgICAgICB8IGxlbmd0aCBvZiBzdHJpbmcKKyAgKzB4MTk1MCB8IDY4IDYxIDczIDY4ICAgICAgICAgICAgIHwgY2hhcls0XSAgICAgfCBoYXNoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nIGxpdGVyYWwKKyAgKzB4MTk1NCB8IDAwICAgICAgICAgICAgICAgICAgICAgIHwgY2hhciAgICAgICAgfCAweDAwICgwKSAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nIHRlcm1pbmF0b3IKKworcGFkZGluZzoKKyAgKzB4MTk1NSB8IDAwIDAwIDAwICAgICAgICAgICAgICAgIHwgdWludDhfdFszXSAgfCAuLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgcGFkZGluZworCit0YWJsZSAocmVmbGVjdGlvbi5LZXlWYWx1ZSk6CisgICsweDE5NTggfCBGNCBFMyBGRiBGRiAgICAgICAgICAgICB8IFNPZmZzZXQzMiAgIHwgMHhGRkZGRTNGNCAoLTcxODApIExvYzogKzB4MzU2NCAgICB8IG9mZnNldCB0byB2dGFibGUKKyAgKzB4MTk1QyB8IDE4IDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMDE4ICgyNCkgTG9jOiArMHgxOTc0ICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBrZXlgIChzdHJpbmcpCisgICsweDE5NjAgfCAwNCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDAwNCAoNCkgTG9jOiArMHgxOTY0ICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgdmFsdWVgIChzdHJpbmcpCisKK3N0cmluZyAocmVmbGVjdGlvbi5LZXlWYWx1ZS52YWx1ZSk6CisgICsweDE5NjQgfCAwQiAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgIHwgMHgwMDAwMDAwQiAoMTEpICAgICAgICAgICAgICAgICAgICB8IGxlbmd0aCBvZiBzdHJpbmcKKyAgKzB4MTk2OCB8IDUyIDY1IDY2IDY1IDcyIDcyIDYxIDYyIHwgY2hhclsxMV0gICAgfCBSZWZlcnJhYiAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nIGxpdGVyYWwKKyAgKzB4MTk3MCB8IDZDIDY1IDU0ICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgfCBsZVQKKyAgKzB4MTk3MyB8IDAwICAgICAgICAgICAgICAgICAgICAgIHwgY2hhciAgICAgICAgfCAweDAwICgwKSAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nIHRlcm1pbmF0b3IKKworc3RyaW5nIChyZWZsZWN0aW9uLktleVZhbHVlLmtleSk6CisgICsweDE5NzQgfCAwOCAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgIHwgMHgwMDAwMDAwOCAoOCkgICAgICAgICAgICAgICAgICAgICB8IGxlbmd0aCBvZiBzdHJpbmcKKyAgKzB4MTk3OCB8IDYzIDcwIDcwIDVGIDc0IDc5IDcwIDY1IHwgY2hhcls4XSAgICAgfCBjcHBfdHlwZSAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nIGxpdGVyYWwKKyAgKzB4MTk4MCB8IDAwICAgICAgICAgICAgICAgICAgICAgIHwgY2hhciAgICAgICAgfCAweDAwICgwKSAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nIHRlcm1pbmF0b3IKKworcGFkZGluZzoKKyAgKzB4MTk4MSB8IDAwIDAwIDAwICAgICAgICAgICAgICAgIHwgdWludDhfdFszXSAgfCAuLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgcGFkZGluZworCit0YWJsZSAocmVmbGVjdGlvbi5LZXlWYWx1ZSk6CisgICsweDE5ODQgfCAyMCBFNCBGRiBGRiAgICAgICAgICAgICB8IFNPZmZzZXQzMiAgIHwgMHhGRkZGRTQyMCAoLTcxMzYpIExvYzogKzB4MzU2NCAgICB8IG9mZnNldCB0byB2dGFibGUKKyAgKzB4MTk4OCB8IDE0IDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMDE0ICgyMCkgTG9jOiArMHgxOTlDICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBrZXlgIChzdHJpbmcpCisgICsweDE5OEMgfCAwNCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDAwNCAoNCkgTG9jOiArMHgxOTkwICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgdmFsdWVgIChzdHJpbmcpCisKK3N0cmluZyAocmVmbGVjdGlvbi5LZXlWYWx1ZS52YWx1ZSk6CisgICsweDE5OTAgfCAwNSAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgIHwgMHgwMDAwMDAwNSAoNSkgICAgICAgICAgICAgICAgICAgICB8IGxlbmd0aCBvZiBzdHJpbmcKKyAgKzB4MTk5NCB8IDZFIDYxIDZCIDY1IDY0ICAgICAgICAgIHwgY2hhcls1XSAgICAgfCBuYWtlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nIGxpdGVyYWwKKyAgKzB4MTk5OSB8IDAwICAgICAgICAgICAgICAgICAgICAgIHwgY2hhciAgICAgICAgfCAweDAwICgwKSAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nIHRlcm1pbmF0b3IKKworcGFkZGluZzoKKyAgKzB4MTk5QSB8IDAwIDAwICAgICAgICAgICAgICAgICAgIHwgdWludDhfdFsyXSAgfCAuLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgcGFkZGluZworCitzdHJpbmcgKHJlZmxlY3Rpb24uS2V5VmFsdWUua2V5KToKKyAgKzB4MTk5QyB8IDBDIDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgfCAweDAwMDAwMDBDICgxMikgICAgICAgICAgICAgICAgICAgIHwgbGVuZ3RoIG9mIHN0cmluZworICArMHgxOUEwIHwgNjMgNzAgNzAgNUYgNzAgNzQgNzIgNUYgfCBjaGFyWzEyXSAgICB8IGNwcF9wdHJfICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJpbmcgbGl0ZXJhbAorICArMHgxOUE4IHwgNzQgNzkgNzAgNjUgICAgICAgICAgICAgfCAgICAgICAgICAgICB8IHR5cGUKKyAgKzB4MTlBQyB8IDAwICAgICAgICAgICAgICAgICAgICAgIHwgY2hhciAgICAgICAgfCAweDAwICgwKSAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nIHRlcm1pbmF0b3IKKworcGFkZGluZzoKKyAgKzB4MTlBRCB8IDAwIDAwIDAwICAgICAgICAgICAgICAgIHwgdWludDhfdFszXSAgfCAuLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgcGFkZGluZworCit0YWJsZSAocmVmbGVjdGlvbi5UeXBlKToKKyAgKzB4MTlCMCB8IENDIEUyIEZGIEZGICAgICAgICAgICAgIHwgU09mZnNldDMyICAgfCAweEZGRkZFMkNDICgtNzQ3NikgTG9jOiArMHgzNkU0ICAgIHwgb2Zmc2V0IHRvIHZ0YWJsZQorICArMHgxOUI0IHwgMDAgMDAgMDAgICAgICAgICAgICAgICAgfCB1aW50OF90WzNdICB8IC4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBwYWRkaW5nCisgICsweDE5QjcgfCAwQSAgICAgICAgICAgICAgICAgICAgICB8IHVpbnQ4X3QgICAgIHwgMHgwQSAoMTApICAgICAgICAgICAgICAgICAgICAgICAgICB8IHRhYmxlIGZpZWxkIGBiYXNlX3R5cGVgIChCeXRlKQorICArMHgxOUI4IHwgMDggMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICB8IDB4MDAwMDAwMDggKDgpICAgICAgICAgICAgICAgICAgICAgfCB0YWJsZSBmaWVsZCBgYmFzZV9zaXplYCAoVUludCkKKyAgKzB4MTlCQyB8IDAxIDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgfCAweDAwMDAwMDAxICgxKSAgICAgICAgICAgICAgICAgICAgIHwgdGFibGUgZmllbGQgYGVsZW1lbnRfc2l6ZWAgKFVJbnQpCisKK3N0cmluZyAocmVmbGVjdGlvbi5GaWVsZC5uYW1lKToKKyAgKzB4MTlDMCB8IDEzIDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgfCAweDAwMDAwMDEzICgxOSkgICAgICAgICAgICAgICAgICAgIHwgbGVuZ3RoIG9mIHN0cmluZworICArMHgxOUM0IHwgNjMgNkYgNUYgNkYgNzcgNkUgNjkgNkUgfCBjaGFyWzE5XSAgICB8IGNvX293bmluICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJpbmcgbGl0ZXJhbAorICArMHgxOUNDIHwgNjcgNUYgNzIgNjUgNjYgNjUgNzIgNjUgfCAgICAgICAgICAgICB8IGdfcmVmZXJlCisgICsweDE5RDQgfCA2RSA2MyA2NSAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgIHwgbmNlCisgICsweDE5RDcgfCAwMCAgICAgICAgICAgICAgICAgICAgICB8IGNoYXIgICAgICAgIHwgMHgwMCAoMCkgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHN0cmluZyB0ZXJtaW5hdG9yCisKK3RhYmxlIChyZWZsZWN0aW9uLkZpZWxkKToKKyAgKzB4MTlEOCB8IEI0IEVFIEZGIEZGICAgICAgICAgICAgIHwgU09mZnNldDMyICAgfCAweEZGRkZFRUI0ICgtNDQyOCkgTG9jOiArMHgyQjI0ICAgIHwgb2Zmc2V0IHRvIHZ0YWJsZQorICArMHgxOURDIHwgMDAgMDAgMDAgICAgICAgICAgICAgICAgfCB1aW50OF90WzNdICB8IC4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBwYWRkaW5nCisgICsweDE5REYgfCAwMSAgICAgICAgICAgICAgICAgICAgICB8IHVpbnQ4X3QgICAgIHwgMHgwMSAoMSkgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHRhYmxlIGZpZWxkIGBvcHRpb25hbGAgKEJvb2wpCisgICsweDE5RTAgfCAyNiAwMCAgICAgICAgICAgICAgICAgICB8IHVpbnQxNl90ICAgIHwgMHgwMDI2ICgzOCkgICAgICAgICAgICAgICAgICAgICAgICB8IHRhYmxlIGZpZWxkIGBpZGAgKFVTaG9ydCkKKyAgKzB4MTlFMiB8IDUwIDAwICAgICAgICAgICAgICAgICAgIHwgdWludDE2X3QgICAgfCAweDAwNTAgKDgwKSAgICAgICAgICAgICAgICAgICAgICAgIHwgdGFibGUgZmllbGQgYG9mZnNldGAgKFVTaG9ydCkKKyAgKzB4MTlFNCB8IDg0IDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMDg0ICgxMzIpIExvYzogKzB4MUE2OCAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBuYW1lYCAoc3RyaW5nKQorICArMHgxOUU4IHwgNzAgMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDAwNzAgKDExMikgTG9jOiArMHgxQTU4ICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYHR5cGVgICh0YWJsZSkKKyAgKzB4MTlFQyB8IDBDIDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMDBDICgxMikgTG9jOiArMHgxOUY4ICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBhdHRyaWJ1dGVzYCAodmVjdG9yKQorICArMHgxOUYwIHwgMDQgMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDAwMDQgKDQpIExvYzogKzB4MTlGNCAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYGRvY3VtZW50YXRpb25gICh2ZWN0b3IpCisKK3ZlY3RvciAocmVmbGVjdGlvbi5GaWVsZC5kb2N1bWVudGF0aW9uKToKKyAgKzB4MTlGNCB8IDAwIDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgfCAweDAwMDAwMDAwICgwKSAgICAgICAgICAgICAgICAgICAgIHwgbGVuZ3RoIG9mIHZlY3RvciAoIyBpdGVtcykKKwordmVjdG9yIChyZWZsZWN0aW9uLkZpZWxkLmF0dHJpYnV0ZXMpOgorICArMHgxOUY4IHwgMDIgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICB8IDB4MDAwMDAwMDIgKDIpICAgICAgICAgICAgICAgICAgICAgfCBsZW5ndGggb2YgdmVjdG9yICgjIGl0ZW1zKQorICArMHgxOUZDIHwgMjQgMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDAwMjQgKDM2KSBMb2M6ICsweDFBMjAgICAgICAgfCBvZmZzZXQgdG8gdGFibGVbMF0KKyAgKzB4MUEwMCB8IDA0IDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMDA0ICg0KSBMb2M6ICsweDFBMDQgICAgICAgIHwgb2Zmc2V0IHRvIHRhYmxlWzFdCisKK3RhYmxlIChyZWZsZWN0aW9uLktleVZhbHVlKToKKyAgKzB4MUEwNCB8IEEwIEU0IEZGIEZGICAgICAgICAgICAgIHwgU09mZnNldDMyICAgfCAweEZGRkZFNEEwICgtNzAwOCkgTG9jOiArMHgzNTY0ICAgIHwgb2Zmc2V0IHRvIHZ0YWJsZQorICArMHgxQTA4IHwgMTAgMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDAwMTAgKDE2KSBMb2M6ICsweDFBMTggICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYGtleWAgKHN0cmluZykKKyAgKzB4MUEwQyB8IDA0IDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMDA0ICg0KSBMb2M6ICsweDFBMTAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGB2YWx1ZWAgKHN0cmluZykKKworc3RyaW5nIChyZWZsZWN0aW9uLktleVZhbHVlLnZhbHVlKToKKyAgKzB4MUExMCB8IDAyIDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgfCAweDAwMDAwMDAyICgyKSAgICAgICAgICAgICAgICAgICAgIHwgbGVuZ3RoIG9mIHN0cmluZworICArMHgxQTE0IHwgMzMgMzggICAgICAgICAgICAgICAgICAgfCBjaGFyWzJdICAgICB8IDM4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJpbmcgbGl0ZXJhbAorICArMHgxQTE2IHwgMDAgICAgICAgICAgICAgICAgICAgICAgfCBjaGFyICAgICAgICB8IDB4MDAgKDApICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJpbmcgdGVybWluYXRvcgorCitzdHJpbmcgKHJlZmxlY3Rpb24uS2V5VmFsdWUua2V5KToKKyAgKzB4MUExOCB8IDAyIDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgfCAweDAwMDAwMDAyICgyKSAgICAgICAgICAgICAgICAgICAgIHwgbGVuZ3RoIG9mIHN0cmluZworICArMHgxQTFDIHwgNjkgNjQgICAgICAgICAgICAgICAgICAgfCBjaGFyWzJdICAgICB8IGlkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJpbmcgbGl0ZXJhbAorICArMHgxQTFFIHwgMDAgICAgICAgICAgICAgICAgICAgICAgfCBjaGFyICAgICAgICB8IDB4MDAgKDApICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJpbmcgdGVybWluYXRvcgorCit0YWJsZSAocmVmbGVjdGlvbi5LZXlWYWx1ZSk6CisgICsweDFBMjAgfCBCQyBFNCBGRiBGRiAgICAgICAgICAgICB8IFNPZmZzZXQzMiAgIHwgMHhGRkZGRTRCQyAoLTY5ODApIExvYzogKzB4MzU2NCAgICB8IG9mZnNldCB0byB2dGFibGUKKyAgKzB4MUEyNCB8IDIwIDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMDIwICgzMikgTG9jOiArMHgxQTQ0ICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBrZXlgIChzdHJpbmcpCisgICsweDFBMjggfCAwNCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDAwNCAoNCkgTG9jOiArMHgxQTJDICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgdmFsdWVgIChzdHJpbmcpCisKK3N0cmluZyAocmVmbGVjdGlvbi5LZXlWYWx1ZS52YWx1ZSk6CisgICsweDFBMkMgfCAxMCAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgIHwgMHgwMDAwMDAxMCAoMTYpICAgICAgICAgICAgICAgICAgICB8IGxlbmd0aCBvZiBzdHJpbmcKKyAgKzB4MUEzMCB8IDY0IDY1IDY2IDYxIDc1IDZDIDc0IDVGIHwgY2hhclsxNl0gICAgfCBkZWZhdWx0XyAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nIGxpdGVyYWwKKyAgKzB4MUEzOCB8IDcwIDc0IDcyIDVGIDc0IDc5IDcwIDY1IHwgICAgICAgICAgICAgfCBwdHJfdHlwZQorICArMHgxQTQwIHwgMDAgICAgICAgICAgICAgICAgICAgICAgfCBjaGFyICAgICAgICB8IDB4MDAgKDApICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJpbmcgdGVybWluYXRvcgorCitwYWRkaW5nOgorICArMHgxQTQxIHwgMDAgMDAgMDAgICAgICAgICAgICAgICAgfCB1aW50OF90WzNdICB8IC4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBwYWRkaW5nCisKK3N0cmluZyAocmVmbGVjdGlvbi5LZXlWYWx1ZS5rZXkpOgorICArMHgxQTQ0IHwgMEMgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICB8IDB4MDAwMDAwMEMgKDEyKSAgICAgICAgICAgICAgICAgICAgfCBsZW5ndGggb2Ygc3RyaW5nCisgICsweDFBNDggfCA2MyA3MCA3MCA1RiA3MCA3NCA3MiA1RiB8IGNoYXJbMTJdICAgIHwgY3BwX3B0cl8gICAgICAgICAgICAgICAgICAgICAgICAgICB8IHN0cmluZyBsaXRlcmFsCisgICsweDFBNTAgfCA3NCA3OSA3MCA2NSAgICAgICAgICAgICB8ICAgICAgICAgICAgIHwgdHlwZQorICArMHgxQTU0IHwgMDAgICAgICAgICAgICAgICAgICAgICAgfCBjaGFyICAgICAgICB8IDB4MDAgKDApICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJpbmcgdGVybWluYXRvcgorCitwYWRkaW5nOgorICArMHgxQTU1IHwgMDAgMDAgMDAgICAgICAgICAgICAgICAgfCB1aW50OF90WzNdICB8IC4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBwYWRkaW5nCisKK3RhYmxlIChyZWZsZWN0aW9uLlR5cGUpOgorICArMHgxQTU4IHwgQTggRjAgRkYgRkYgICAgICAgICAgICAgfCBTT2Zmc2V0MzIgICB8IDB4RkZGRkYwQTggKC0zOTI4KSBMb2M6ICsweDI5QjAgICAgfCBvZmZzZXQgdG8gdnRhYmxlCisgICsweDFBNUMgfCAwMCAwMCAgICAgICAgICAgICAgICAgICB8IHVpbnQ4X3RbMl0gIHwgLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHBhZGRpbmcKKyAgKzB4MUE1RSB8IDBFICAgICAgICAgICAgICAgICAgICAgIHwgdWludDhfdCAgICAgfCAweDBFICgxNCkgICAgICAgICAgICAgICAgICAgICAgICAgIHwgdGFibGUgZmllbGQgYGJhc2VfdHlwZWAgKEJ5dGUpCisgICsweDFBNUYgfCAwRiAgICAgICAgICAgICAgICAgICAgICB8IHVpbnQ4X3QgICAgIHwgMHgwRiAoMTUpICAgICAgICAgICAgICAgICAgICAgICAgICB8IHRhYmxlIGZpZWxkIGBlbGVtZW50YCAoQnl0ZSkKKyAgKzB4MUE2MCB8IDAyIDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgfCAweDAwMDAwMDAyICgyKSAgICAgICAgICAgICAgICAgICAgIHwgdGFibGUgZmllbGQgYGluZGV4YCAoSW50KQorICArMHgxQTY0IHwgMDQgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICB8IDB4MDAwMDAwMDQgKDQpICAgICAgICAgICAgICAgICAgICAgfCB0YWJsZSBmaWVsZCBgZWxlbWVudF9zaXplYCAoVUludCkKKworc3RyaW5nIChyZWZsZWN0aW9uLkZpZWxkLm5hbWUpOgorICArMHgxQTY4IHwgMUMgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICB8IDB4MDAwMDAwMUMgKDI4KSAgICAgICAgICAgICAgICAgICAgfCBsZW5ndGggb2Ygc3RyaW5nCisgICsweDFBNkMgfCA3NiA2NSA2MyA3NCA2RiA3MiA1RiA2RiB8IGNoYXJbMjhdICAgIHwgdmVjdG9yX28gICAgICAgICAgICAgICAgICAgICAgICAgICB8IHN0cmluZyBsaXRlcmFsCisgICsweDFBNzQgfCA2NiA1RiA3MyA3NCA3MiA2RiA2RSA2NyB8ICAgICAgICAgICAgIHwgZl9zdHJvbmcKKyAgKzB4MUE3QyB8IDVGIDcyIDY1IDY2IDY1IDcyIDcyIDYxIHwgICAgICAgICAgICAgfCBfcmVmZXJyYQorICArMHgxQTg0IHwgNjIgNkMgNjUgNzMgICAgICAgICAgICAgfCAgICAgICAgICAgICB8IGJsZXMKKyAgKzB4MUE4OCB8IDAwICAgICAgICAgICAgICAgICAgICAgIHwgY2hhciAgICAgICAgfCAweDAwICgwKSAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nIHRlcm1pbmF0b3IKKworcGFkZGluZzoKKyAgKzB4MUE4OSB8IDAwIDAwIDAwICAgICAgICAgICAgICAgIHwgdWludDhfdFszXSAgfCAuLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgcGFkZGluZworCit0YWJsZSAocmVmbGVjdGlvbi5GaWVsZCk6CisgICsweDFBOEMgfCA2OCBFRiBGRiBGRiAgICAgICAgICAgICB8IFNPZmZzZXQzMiAgIHwgMHhGRkZGRUY2OCAoLTQyNDgpIExvYzogKzB4MkIyNCAgICB8IG9mZnNldCB0byB2dGFibGUKKyAgKzB4MUE5MCB8IDAwIDAwIDAwICAgICAgICAgICAgICAgIHwgdWludDhfdFszXSAgfCAuLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgcGFkZGluZworICArMHgxQTkzIHwgMDEgICAgICAgICAgICAgICAgICAgICAgfCB1aW50OF90ICAgICB8IDB4MDEgKDEpICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB0YWJsZSBmaWVsZCBgb3B0aW9uYWxgIChCb29sKQorICArMHgxQTk0IHwgMjUgMDAgICAgICAgICAgICAgICAgICAgfCB1aW50MTZfdCAgICB8IDB4MDAyNSAoMzcpICAgICAgICAgICAgICAgICAgICAgICAgfCB0YWJsZSBmaWVsZCBgaWRgIChVU2hvcnQpCisgICsweDFBOTYgfCA0RSAwMCAgICAgICAgICAgICAgICAgICB8IHVpbnQxNl90ICAgIHwgMHgwMDRFICg3OCkgICAgICAgICAgICAgICAgICAgICAgICB8IHRhYmxlIGZpZWxkIGBvZmZzZXRgIChVU2hvcnQpCisgICsweDFBOTggfCBEMCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDBEMCAoMjA4KSBMb2M6ICsweDFCNjggICAgICB8IG9mZnNldCB0byBmaWVsZCBgbmFtZWAgKHN0cmluZykKKyAgKzB4MUE5QyB8IEMwIDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMEMwICgxOTIpIExvYzogKzB4MUI1QyAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGB0eXBlYCAodGFibGUpCisgICsweDFBQTAgfCAwQyAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDAwQyAoMTIpIExvYzogKzB4MUFBQyAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgYXR0cmlidXRlc2AgKHZlY3RvcikKKyAgKzB4MUFBNCB8IDA0IDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMDA0ICg0KSBMb2M6ICsweDFBQTggICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBkb2N1bWVudGF0aW9uYCAodmVjdG9yKQorCit2ZWN0b3IgKHJlZmxlY3Rpb24uRmllbGQuZG9jdW1lbnRhdGlvbik6CisgICsweDFBQTggfCAwMCAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgIHwgMHgwMDAwMDAwMCAoMCkgICAgICAgICAgICAgICAgICAgICB8IGxlbmd0aCBvZiB2ZWN0b3IgKCMgaXRlbXMpCisKK3ZlY3RvciAocmVmbGVjdGlvbi5GaWVsZC5hdHRyaWJ1dGVzKToKKyAgKzB4MUFBQyB8IDA0IDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgfCAweDAwMDAwMDA0ICg0KSAgICAgICAgICAgICAgICAgICAgIHwgbGVuZ3RoIG9mIHZlY3RvciAoIyBpdGVtcykKKyAgKzB4MUFCMCB8IDgwIDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMDgwICgxMjgpIExvYzogKzB4MUIzMCAgICAgIHwgb2Zmc2V0IHRvIHRhYmxlWzBdCisgICsweDFBQjQgfCA1MCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDA1MCAoODApIExvYzogKzB4MUIwNCAgICAgICB8IG9mZnNldCB0byB0YWJsZVsxXQorICArMHgxQUI4IHwgMjQgMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDAwMjQgKDM2KSBMb2M6ICsweDFBREMgICAgICAgfCBvZmZzZXQgdG8gdGFibGVbMl0KKyAgKzB4MUFCQyB8IDA0IDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMDA0ICg0KSBMb2M6ICsweDFBQzAgICAgICAgIHwgb2Zmc2V0IHRvIHRhYmxlWzNdCisKK3RhYmxlIChyZWZsZWN0aW9uLktleVZhbHVlKToKKyAgKzB4MUFDMCB8IDVDIEU1IEZGIEZGICAgICAgICAgICAgIHwgU09mZnNldDMyICAgfCAweEZGRkZFNTVDICgtNjgyMCkgTG9jOiArMHgzNTY0ICAgIHwgb2Zmc2V0IHRvIHZ0YWJsZQorICArMHgxQUM0IHwgMTAgMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDAwMTAgKDE2KSBMb2M6ICsweDFBRDQgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYGtleWAgKHN0cmluZykKKyAgKzB4MUFDOCB8IDA0IDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMDA0ICg0KSBMb2M6ICsweDFBQ0MgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGB2YWx1ZWAgKHN0cmluZykKKworc3RyaW5nIChyZWZsZWN0aW9uLktleVZhbHVlLnZhbHVlKToKKyAgKzB4MUFDQyB8IDAyIDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgfCAweDAwMDAwMDAyICgyKSAgICAgICAgICAgICAgICAgICAgIHwgbGVuZ3RoIG9mIHN0cmluZworICArMHgxQUQwIHwgMzMgMzcgICAgICAgICAgICAgICAgICAgfCBjaGFyWzJdICAgICB8IDM3ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJpbmcgbGl0ZXJhbAorICArMHgxQUQyIHwgMDAgICAgICAgICAgICAgICAgICAgICAgfCBjaGFyICAgICAgICB8IDB4MDAgKDApICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJpbmcgdGVybWluYXRvcgorCitzdHJpbmcgKHJlZmxlY3Rpb24uS2V5VmFsdWUua2V5KToKKyAgKzB4MUFENCB8IDAyIDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgfCAweDAwMDAwMDAyICgyKSAgICAgICAgICAgICAgICAgICAgIHwgbGVuZ3RoIG9mIHN0cmluZworICArMHgxQUQ4IHwgNjkgNjQgICAgICAgICAgICAgICAgICAgfCBjaGFyWzJdICAgICB8IGlkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJpbmcgbGl0ZXJhbAorICArMHgxQURBIHwgMDAgICAgICAgICAgICAgICAgICAgICAgfCBjaGFyICAgICAgICB8IDB4MDAgKDApICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJpbmcgdGVybWluYXRvcgorCit0YWJsZSAocmVmbGVjdGlvbi5LZXlWYWx1ZSk6CisgICsweDFBREMgfCA3OCBFNSBGRiBGRiAgICAgICAgICAgICB8IFNPZmZzZXQzMiAgIHwgMHhGRkZGRTU3OCAoLTY3OTIpIExvYzogKzB4MzU2NCAgICB8IG9mZnNldCB0byB2dGFibGUKKyAgKzB4MUFFMCB8IDE4IDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMDE4ICgyNCkgTG9jOiArMHgxQUY4ICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBrZXlgIChzdHJpbmcpCisgICsweDFBRTQgfCAwNCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDAwNCAoNCkgTG9jOiArMHgxQUU4ICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgdmFsdWVgIChzdHJpbmcpCisKK3N0cmluZyAocmVmbGVjdGlvbi5LZXlWYWx1ZS52YWx1ZSk6CisgICsweDFBRTggfCAwOCAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgIHwgMHgwMDAwMDAwOCAoOCkgICAgICAgICAgICAgICAgICAgICB8IGxlbmd0aCBvZiBzdHJpbmcKKyAgKzB4MUFFQyB8IDY2IDZFIDc2IDMxIDYxIDVGIDM2IDM0IHwgY2hhcls4XSAgICAgfCBmbnYxYV82NCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nIGxpdGVyYWwKKyAgKzB4MUFGNCB8IDAwICAgICAgICAgICAgICAgICAgICAgIHwgY2hhciAgICAgICAgfCAweDAwICgwKSAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nIHRlcm1pbmF0b3IKKworcGFkZGluZzoKKyAgKzB4MUFGNSB8IDAwIDAwIDAwICAgICAgICAgICAgICAgIHwgdWludDhfdFszXSAgfCAuLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgcGFkZGluZworCitzdHJpbmcgKHJlZmxlY3Rpb24uS2V5VmFsdWUua2V5KToKKyAgKzB4MUFGOCB8IDA0IDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgfCAweDAwMDAwMDA0ICg0KSAgICAgICAgICAgICAgICAgICAgIHwgbGVuZ3RoIG9mIHN0cmluZworICArMHgxQUZDIHwgNjggNjEgNzMgNjggICAgICAgICAgICAgfCBjaGFyWzRdICAgICB8IGhhc2ggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJpbmcgbGl0ZXJhbAorICArMHgxQjAwIHwgMDAgICAgICAgICAgICAgICAgICAgICAgfCBjaGFyICAgICAgICB8IDB4MDAgKDApICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJpbmcgdGVybWluYXRvcgorCitwYWRkaW5nOgorICArMHgxQjAxIHwgMDAgMDAgMDAgICAgICAgICAgICAgICAgfCB1aW50OF90WzNdICB8IC4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBwYWRkaW5nCisKK3RhYmxlIChyZWZsZWN0aW9uLktleVZhbHVlKToKKyAgKzB4MUIwNCB8IEEwIEU1IEZGIEZGICAgICAgICAgICAgIHwgU09mZnNldDMyICAgfCAweEZGRkZFNUEwICgtNjc1MikgTG9jOiArMHgzNTY0ICAgIHwgb2Zmc2V0IHRvIHZ0YWJsZQorICArMHgxQjA4IHwgMTggMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDAwMTggKDI0KSBMb2M6ICsweDFCMjAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYGtleWAgKHN0cmluZykKKyAgKzB4MUIwQyB8IDA0IDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMDA0ICg0KSBMb2M6ICsweDFCMTAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGB2YWx1ZWAgKHN0cmluZykKKworc3RyaW5nIChyZWZsZWN0aW9uLktleVZhbHVlLnZhbHVlKToKKyAgKzB4MUIxMCB8IDBCIDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgfCAweDAwMDAwMDBCICgxMSkgICAgICAgICAgICAgICAgICAgIHwgbGVuZ3RoIG9mIHN0cmluZworICArMHgxQjE0IHwgNTIgNjUgNjYgNjUgNzIgNzIgNjEgNjIgfCBjaGFyWzExXSAgICB8IFJlZmVycmFiICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJpbmcgbGl0ZXJhbAorICArMHgxQjFDIHwgNkMgNjUgNTQgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICB8IGxlVAorICArMHgxQjFGIHwgMDAgICAgICAgICAgICAgICAgICAgICAgfCBjaGFyICAgICAgICB8IDB4MDAgKDApICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJpbmcgdGVybWluYXRvcgorCitzdHJpbmcgKHJlZmxlY3Rpb24uS2V5VmFsdWUua2V5KToKKyAgKzB4MUIyMCB8IDA4IDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgfCAweDAwMDAwMDA4ICg4KSAgICAgICAgICAgICAgICAgICAgIHwgbGVuZ3RoIG9mIHN0cmluZworICArMHgxQjI0IHwgNjMgNzAgNzAgNUYgNzQgNzkgNzAgNjUgfCBjaGFyWzhdICAgICB8IGNwcF90eXBlICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJpbmcgbGl0ZXJhbAorICArMHgxQjJDIHwgMDAgICAgICAgICAgICAgICAgICAgICAgfCBjaGFyICAgICAgICB8IDB4MDAgKDApICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJpbmcgdGVybWluYXRvcgorCitwYWRkaW5nOgorICArMHgxQjJEIHwgMDAgMDAgMDAgICAgICAgICAgICAgICAgfCB1aW50OF90WzNdICB8IC4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBwYWRkaW5nCisKK3RhYmxlIChyZWZsZWN0aW9uLktleVZhbHVlKToKKyAgKzB4MUIzMCB8IENDIEU1IEZGIEZGICAgICAgICAgICAgIHwgU09mZnNldDMyICAgfCAweEZGRkZFNUNDICgtNjcwOCkgTG9jOiArMHgzNTY0ICAgIHwgb2Zmc2V0IHRvIHZ0YWJsZQorICArMHgxQjM0IHwgMTQgMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDAwMTQgKDIwKSBMb2M6ICsweDFCNDggICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYGtleWAgKHN0cmluZykKKyAgKzB4MUIzOCB8IDA0IDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMDA0ICg0KSBMb2M6ICsweDFCM0MgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGB2YWx1ZWAgKHN0cmluZykKKworc3RyaW5nIChyZWZsZWN0aW9uLktleVZhbHVlLnZhbHVlKToKKyAgKzB4MUIzQyB8IDA1IDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgfCAweDAwMDAwMDA1ICg1KSAgICAgICAgICAgICAgICAgICAgIHwgbGVuZ3RoIG9mIHN0cmluZworICArMHgxQjQwIHwgNkUgNjEgNkIgNjUgNjQgICAgICAgICAgfCBjaGFyWzVdICAgICB8IG5ha2VkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJpbmcgbGl0ZXJhbAorICArMHgxQjQ1IHwgMDAgICAgICAgICAgICAgICAgICAgICAgfCBjaGFyICAgICAgICB8IDB4MDAgKDApICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJpbmcgdGVybWluYXRvcgorCitwYWRkaW5nOgorICArMHgxQjQ2IHwgMDAgMDAgICAgICAgICAgICAgICAgICAgfCB1aW50OF90WzJdICB8IC4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBwYWRkaW5nCisKK3N0cmluZyAocmVmbGVjdGlvbi5LZXlWYWx1ZS5rZXkpOgorICArMHgxQjQ4IHwgMEMgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICB8IDB4MDAwMDAwMEMgKDEyKSAgICAgICAgICAgICAgICAgICAgfCBsZW5ndGggb2Ygc3RyaW5nCisgICsweDFCNEMgfCA2MyA3MCA3MCA1RiA3MCA3NCA3MiA1RiB8IGNoYXJbMTJdICAgIHwgY3BwX3B0cl8gICAgICAgICAgICAgICAgICAgICAgICAgICB8IHN0cmluZyBsaXRlcmFsCisgICsweDFCNTQgfCA3NCA3OSA3MCA2NSAgICAgICAgICAgICB8ICAgICAgICAgICAgIHwgdHlwZQorICArMHgxQjU4IHwgMDAgICAgICAgICAgICAgICAgICAgICAgfCBjaGFyICAgICAgICB8IDB4MDAgKDApICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJpbmcgdGVybWluYXRvcgorCitwYWRkaW5nOgorICArMHgxQjU5IHwgMDAgMDAgMDAgICAgICAgICAgICAgICAgfCB1aW50OF90WzNdICB8IC4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBwYWRkaW5nCisKK3RhYmxlIChyZWZsZWN0aW9uLlR5cGUpOgorICArMHgxQjVDIHwgRDggRUYgRkYgRkYgICAgICAgICAgICAgfCBTT2Zmc2V0MzIgICB8IDB4RkZGRkVGRDggKC00MTM2KSBMb2M6ICsweDJCODQgICAgfCBvZmZzZXQgdG8gdnRhYmxlCisgICsweDFCNjAgfCAwMCAwMCAgICAgICAgICAgICAgICAgICB8IHVpbnQ4X3RbMl0gIHwgLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHBhZGRpbmcKKyAgKzB4MUI2MiB8IDBFICAgICAgICAgICAgICAgICAgICAgIHwgdWludDhfdCAgICAgfCAweDBFICgxNCkgICAgICAgICAgICAgICAgICAgICAgICAgIHwgdGFibGUgZmllbGQgYGJhc2VfdHlwZWAgKEJ5dGUpCisgICsweDFCNjMgfCAwQSAgICAgICAgICAgICAgICAgICAgICB8IHVpbnQ4X3QgICAgIHwgMHgwQSAoMTApICAgICAgICAgICAgICAgICAgICAgICAgICB8IHRhYmxlIGZpZWxkIGBlbGVtZW50YCAoQnl0ZSkKKyAgKzB4MUI2NCB8IDA4IDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgfCAweDAwMDAwMDA4ICg4KSAgICAgICAgICAgICAgICAgICAgIHwgdGFibGUgZmllbGQgYGVsZW1lbnRfc2l6ZWAgKFVJbnQpCisKK3N0cmluZyAocmVmbGVjdGlvbi5GaWVsZC5uYW1lKToKKyAgKzB4MUI2OCB8IDE5IDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgfCAweDAwMDAwMDE5ICgyNSkgICAgICAgICAgICAgICAgICAgIHwgbGVuZ3RoIG9mIHN0cmluZworICArMHgxQjZDIHwgNzYgNjUgNjMgNzQgNkYgNzIgNUYgNkYgfCBjaGFyWzI1XSAgICB8IHZlY3Rvcl9vICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJpbmcgbGl0ZXJhbAorICArMHgxQjc0IHwgNjYgNUYgNzcgNjUgNjEgNkIgNUYgNzIgfCAgICAgICAgICAgICB8IGZfd2Vha19yCisgICsweDFCN0MgfCA2NSA2NiA2NSA3MiA2NSA2RSA2MyA2NSB8ICAgICAgICAgICAgIHwgZWZlcmVuY2UKKyAgKzB4MUI4NCB8IDczICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgfCBzCisgICsweDFCODUgfCAwMCAgICAgICAgICAgICAgICAgICAgICB8IGNoYXIgICAgICAgIHwgMHgwMCAoMCkgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHN0cmluZyB0ZXJtaW5hdG9yCisKK3BhZGRpbmc6CisgICsweDFCODYgfCAwMCAwMCAgICAgICAgICAgICAgICAgICB8IHVpbnQ4X3RbMl0gIHwgLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHBhZGRpbmcKKwordGFibGUgKHJlZmxlY3Rpb24uRmllbGQpOgorICArMHgxQjg4IHwgNEUgRjEgRkYgRkYgICAgICAgICAgICAgfCBTT2Zmc2V0MzIgICB8IDB4RkZGRkYxNEUgKC0zNzYyKSBMb2M6ICsweDJBM0EgICAgfCBvZmZzZXQgdG8gdnRhYmxlCisgICsweDFCOEMgfCAyNCAwMCAgICAgICAgICAgICAgICAgICB8IHVpbnQxNl90ICAgIHwgMHgwMDI0ICgzNikgICAgICAgICAgICAgICAgICAgICAgICB8IHRhYmxlIGZpZWxkIGBpZGAgKFVTaG9ydCkKKyAgKzB4MUI4RSB8IDRDIDAwICAgICAgICAgICAgICAgICAgIHwgdWludDE2X3QgICAgfCAweDAwNEMgKDc2KSAgICAgICAgICAgICAgICAgICAgICAgIHwgdGFibGUgZmllbGQgYG9mZnNldGAgKFVTaG9ydCkKKyAgKzB4MUI5MCB8IEQ0IDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMEQ0ICgyMTIpIExvYzogKzB4MUM2NCAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBuYW1lYCAoc3RyaW5nKQorICArMHgxQjk0IHwgQzAgMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDAwQzAgKDE5MikgTG9jOiArMHgxQzU0ICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYHR5cGVgICh0YWJsZSkKKyAgKzB4MUI5OCB8IDBDIDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMDBDICgxMikgTG9jOiArMHgxQkE0ICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBhdHRyaWJ1dGVzYCAodmVjdG9yKQorICArMHgxQjlDIHwgMDQgMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDAwMDQgKDQpIExvYzogKzB4MUJBMCAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYGRvY3VtZW50YXRpb25gICh2ZWN0b3IpCisKK3ZlY3RvciAocmVmbGVjdGlvbi5GaWVsZC5kb2N1bWVudGF0aW9uKToKKyAgKzB4MUJBMCB8IDAwIDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgfCAweDAwMDAwMDAwICgwKSAgICAgICAgICAgICAgICAgICAgIHwgbGVuZ3RoIG9mIHZlY3RvciAoIyBpdGVtcykKKwordmVjdG9yIChyZWZsZWN0aW9uLkZpZWxkLmF0dHJpYnV0ZXMpOgorICArMHgxQkE0IHwgMDQgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICB8IDB4MDAwMDAwMDQgKDQpICAgICAgICAgICAgICAgICAgICAgfCBsZW5ndGggb2YgdmVjdG9yICgjIGl0ZW1zKQorICArMHgxQkE4IHwgODAgMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDAwODAgKDEyOCkgTG9jOiArMHgxQzI4ICAgICAgfCBvZmZzZXQgdG8gdGFibGVbMF0KKyAgKzB4MUJBQyB8IDUwIDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMDUwICg4MCkgTG9jOiArMHgxQkZDICAgICAgIHwgb2Zmc2V0IHRvIHRhYmxlWzFdCisgICsweDFCQjAgfCAyNCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDAyNCAoMzYpIExvYzogKzB4MUJENCAgICAgICB8IG9mZnNldCB0byB0YWJsZVsyXQorICArMHgxQkI0IHwgMDQgMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDAwMDQgKDQpIExvYzogKzB4MUJCOCAgICAgICAgfCBvZmZzZXQgdG8gdGFibGVbM10KKwordGFibGUgKHJlZmxlY3Rpb24uS2V5VmFsdWUpOgorICArMHgxQkI4IHwgNTQgRTYgRkYgRkYgICAgICAgICAgICAgfCBTT2Zmc2V0MzIgICB8IDB4RkZGRkU2NTQgKC02NTcyKSBMb2M6ICsweDM1NjQgICAgfCBvZmZzZXQgdG8gdnRhYmxlCisgICsweDFCQkMgfCAxMCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDAxMCAoMTYpIExvYzogKzB4MUJDQyAgICAgICB8IG9mZnNldCB0byBmaWVsZCBga2V5YCAoc3RyaW5nKQorICArMHgxQkMwIHwgMDQgMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDAwMDQgKDQpIExvYzogKzB4MUJDNCAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYHZhbHVlYCAoc3RyaW5nKQorCitzdHJpbmcgKHJlZmxlY3Rpb24uS2V5VmFsdWUudmFsdWUpOgorICArMHgxQkM0IHwgMDIgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICB8IDB4MDAwMDAwMDIgKDIpICAgICAgICAgICAgICAgICAgICAgfCBsZW5ndGggb2Ygc3RyaW5nCisgICsweDFCQzggfCAzMyAzNiAgICAgICAgICAgICAgICAgICB8IGNoYXJbMl0gICAgIHwgMzYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHN0cmluZyBsaXRlcmFsCisgICsweDFCQ0EgfCAwMCAgICAgICAgICAgICAgICAgICAgICB8IGNoYXIgICAgICAgIHwgMHgwMCAoMCkgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHN0cmluZyB0ZXJtaW5hdG9yCisKK3N0cmluZyAocmVmbGVjdGlvbi5LZXlWYWx1ZS5rZXkpOgorICArMHgxQkNDIHwgMDIgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICB8IDB4MDAwMDAwMDIgKDIpICAgICAgICAgICAgICAgICAgICAgfCBsZW5ndGggb2Ygc3RyaW5nCisgICsweDFCRDAgfCA2OSA2NCAgICAgICAgICAgICAgICAgICB8IGNoYXJbMl0gICAgIHwgaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHN0cmluZyBsaXRlcmFsCisgICsweDFCRDIgfCAwMCAgICAgICAgICAgICAgICAgICAgICB8IGNoYXIgICAgICAgIHwgMHgwMCAoMCkgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHN0cmluZyB0ZXJtaW5hdG9yCisKK3RhYmxlIChyZWZsZWN0aW9uLktleVZhbHVlKToKKyAgKzB4MUJENCB8IDcwIEU2IEZGIEZGICAgICAgICAgICAgIHwgU09mZnNldDMyICAgfCAweEZGRkZFNjcwICgtNjU0NCkgTG9jOiArMHgzNTY0ICAgIHwgb2Zmc2V0IHRvIHZ0YWJsZQorICArMHgxQkQ4IHwgMTggMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDAwMTggKDI0KSBMb2M6ICsweDFCRjAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYGtleWAgKHN0cmluZykKKyAgKzB4MUJEQyB8IDA0IDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMDA0ICg0KSBMb2M6ICsweDFCRTAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGB2YWx1ZWAgKHN0cmluZykKKworc3RyaW5nIChyZWZsZWN0aW9uLktleVZhbHVlLnZhbHVlKToKKyAgKzB4MUJFMCB8IDA4IDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgfCAweDAwMDAwMDA4ICg4KSAgICAgICAgICAgICAgICAgICAgIHwgbGVuZ3RoIG9mIHN0cmluZworICArMHgxQkU0IHwgNjYgNkUgNzYgMzEgNjEgNUYgMzYgMzQgfCBjaGFyWzhdICAgICB8IGZudjFhXzY0ICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJpbmcgbGl0ZXJhbAorICArMHgxQkVDIHwgMDAgICAgICAgICAgICAgICAgICAgICAgfCBjaGFyICAgICAgICB8IDB4MDAgKDApICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJpbmcgdGVybWluYXRvcgorCitwYWRkaW5nOgorICArMHgxQkVEIHwgMDAgMDAgMDAgICAgICAgICAgICAgICAgfCB1aW50OF90WzNdICB8IC4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBwYWRkaW5nCisKK3N0cmluZyAocmVmbGVjdGlvbi5LZXlWYWx1ZS5rZXkpOgorICArMHgxQkYwIHwgMDQgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICB8IDB4MDAwMDAwMDQgKDQpICAgICAgICAgICAgICAgICAgICAgfCBsZW5ndGggb2Ygc3RyaW5nCisgICsweDFCRjQgfCA2OCA2MSA3MyA2OCAgICAgICAgICAgICB8IGNoYXJbNF0gICAgIHwgaGFzaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHN0cmluZyBsaXRlcmFsCisgICsweDFCRjggfCAwMCAgICAgICAgICAgICAgICAgICAgICB8IGNoYXIgICAgICAgIHwgMHgwMCAoMCkgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHN0cmluZyB0ZXJtaW5hdG9yCisKK3BhZGRpbmc6CisgICsweDFCRjkgfCAwMCAwMCAwMCAgICAgICAgICAgICAgICB8IHVpbnQ4X3RbM10gIHwgLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHBhZGRpbmcKKwordGFibGUgKHJlZmxlY3Rpb24uS2V5VmFsdWUpOgorICArMHgxQkZDIHwgOTggRTYgRkYgRkYgICAgICAgICAgICAgfCBTT2Zmc2V0MzIgICB8IDB4RkZGRkU2OTggKC02NTA0KSBMb2M6ICsweDM1NjQgICAgfCBvZmZzZXQgdG8gdnRhYmxlCisgICsweDFDMDAgfCAxOCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDAxOCAoMjQpIExvYzogKzB4MUMxOCAgICAgICB8IG9mZnNldCB0byBmaWVsZCBga2V5YCAoc3RyaW5nKQorICArMHgxQzA0IHwgMDQgMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDAwMDQgKDQpIExvYzogKzB4MUMwOCAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYHZhbHVlYCAoc3RyaW5nKQorCitzdHJpbmcgKHJlZmxlY3Rpb24uS2V5VmFsdWUudmFsdWUpOgorICArMHgxQzA4IHwgMEIgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICB8IDB4MDAwMDAwMEIgKDExKSAgICAgICAgICAgICAgICAgICAgfCBsZW5ndGggb2Ygc3RyaW5nCisgICsweDFDMEMgfCA1MiA2NSA2NiA2NSA3MiA3MiA2MSA2MiB8IGNoYXJbMTFdICAgIHwgUmVmZXJyYWIgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHN0cmluZyBsaXRlcmFsCisgICsweDFDMTQgfCA2QyA2NSA1NCAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgIHwgbGVUCisgICsweDFDMTcgfCAwMCAgICAgICAgICAgICAgICAgICAgICB8IGNoYXIgICAgICAgIHwgMHgwMCAoMCkgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHN0cmluZyB0ZXJtaW5hdG9yCisKK3N0cmluZyAocmVmbGVjdGlvbi5LZXlWYWx1ZS5rZXkpOgorICArMHgxQzE4IHwgMDggMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICB8IDB4MDAwMDAwMDggKDgpICAgICAgICAgICAgICAgICAgICAgfCBsZW5ndGggb2Ygc3RyaW5nCisgICsweDFDMUMgfCA2MyA3MCA3MCA1RiA3NCA3OSA3MCA2NSB8IGNoYXJbOF0gICAgIHwgY3BwX3R5cGUgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHN0cmluZyBsaXRlcmFsCisgICsweDFDMjQgfCAwMCAgICAgICAgICAgICAgICAgICAgICB8IGNoYXIgICAgICAgIHwgMHgwMCAoMCkgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHN0cmluZyB0ZXJtaW5hdG9yCisKK3BhZGRpbmc6CisgICsweDFDMjUgfCAwMCAwMCAwMCAgICAgICAgICAgICAgICB8IHVpbnQ4X3RbM10gIHwgLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHBhZGRpbmcKKwordGFibGUgKHJlZmxlY3Rpb24uS2V5VmFsdWUpOgorICArMHgxQzI4IHwgQzQgRTYgRkYgRkYgICAgICAgICAgICAgfCBTT2Zmc2V0MzIgICB8IDB4RkZGRkU2QzQgKC02NDYwKSBMb2M6ICsweDM1NjQgICAgfCBvZmZzZXQgdG8gdnRhYmxlCisgICsweDFDMkMgfCAxNCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDAxNCAoMjApIExvYzogKzB4MUM0MCAgICAgICB8IG9mZnNldCB0byBmaWVsZCBga2V5YCAoc3RyaW5nKQorICArMHgxQzMwIHwgMDQgMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDAwMDQgKDQpIExvYzogKzB4MUMzNCAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYHZhbHVlYCAoc3RyaW5nKQorCitzdHJpbmcgKHJlZmxlY3Rpb24uS2V5VmFsdWUudmFsdWUpOgorICArMHgxQzM0IHwgMDUgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICB8IDB4MDAwMDAwMDUgKDUpICAgICAgICAgICAgICAgICAgICAgfCBsZW5ndGggb2Ygc3RyaW5nCisgICsweDFDMzggfCA2RSA2MSA2QiA2NSA2NCAgICAgICAgICB8IGNoYXJbNV0gICAgIHwgbmFrZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHN0cmluZyBsaXRlcmFsCisgICsweDFDM0QgfCAwMCAgICAgICAgICAgICAgICAgICAgICB8IGNoYXIgICAgICAgIHwgMHgwMCAoMCkgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHN0cmluZyB0ZXJtaW5hdG9yCisKK3BhZGRpbmc6CisgICsweDFDM0UgfCAwMCAwMCAgICAgICAgICAgICAgICAgICB8IHVpbnQ4X3RbMl0gIHwgLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHBhZGRpbmcKKworc3RyaW5nIChyZWZsZWN0aW9uLktleVZhbHVlLmtleSk6CisgICsweDFDNDAgfCAwQyAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgIHwgMHgwMDAwMDAwQyAoMTIpICAgICAgICAgICAgICAgICAgICB8IGxlbmd0aCBvZiBzdHJpbmcKKyAgKzB4MUM0NCB8IDYzIDcwIDcwIDVGIDcwIDc0IDcyIDVGIHwgY2hhclsxMl0gICAgfCBjcHBfcHRyXyAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nIGxpdGVyYWwKKyAgKzB4MUM0QyB8IDc0IDc5IDcwIDY1ICAgICAgICAgICAgIHwgICAgICAgICAgICAgfCB0eXBlCisgICsweDFDNTAgfCAwMCAgICAgICAgICAgICAgICAgICAgICB8IGNoYXIgICAgICAgIHwgMHgwMCAoMCkgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHN0cmluZyB0ZXJtaW5hdG9yCisKK3BhZGRpbmc6CisgICsweDFDNTEgfCAwMCAwMCAwMCAgICAgICAgICAgICAgICB8IHVpbnQ4X3RbM10gIHwgLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHBhZGRpbmcKKwordGFibGUgKHJlZmxlY3Rpb24uVHlwZSk6CisgICsweDFDNTQgfCA3MCBFNSBGRiBGRiAgICAgICAgICAgICB8IFNPZmZzZXQzMiAgIHwgMHhGRkZGRTU3MCAoLTY4MDApIExvYzogKzB4MzZFNCAgICB8IG9mZnNldCB0byB2dGFibGUKKyAgKzB4MUM1OCB8IDAwIDAwIDAwICAgICAgICAgICAgICAgIHwgdWludDhfdFszXSAgfCAuLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgcGFkZGluZworICArMHgxQzVCIHwgMEEgICAgICAgICAgICAgICAgICAgICAgfCB1aW50OF90ICAgICB8IDB4MEEgKDEwKSAgICAgICAgICAgICAgICAgICAgICAgICAgfCB0YWJsZSBmaWVsZCBgYmFzZV90eXBlYCAoQnl0ZSkKKyAgKzB4MUM1QyB8IDA4IDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgfCAweDAwMDAwMDA4ICg4KSAgICAgICAgICAgICAgICAgICAgIHwgdGFibGUgZmllbGQgYGJhc2Vfc2l6ZWAgKFVJbnQpCisgICsweDFDNjAgfCAwMSAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgIHwgMHgwMDAwMDAwMSAoMSkgICAgICAgICAgICAgICAgICAgICB8IHRhYmxlIGZpZWxkIGBlbGVtZW50X3NpemVgIChVSW50KQorCitzdHJpbmcgKHJlZmxlY3Rpb24uRmllbGQubmFtZSk6CisgICsweDFDNjQgfCAxNSAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgIHwgMHgwMDAwMDAxNSAoMjEpICAgICAgICAgICAgICAgICAgICB8IGxlbmd0aCBvZiBzdHJpbmcKKyAgKzB4MUM2OCB8IDczIDY5IDZFIDY3IDZDIDY1IDVGIDc3IHwgY2hhclsyMV0gICAgfCBzaW5nbGVfdyAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nIGxpdGVyYWwKKyAgKzB4MUM3MCB8IDY1IDYxIDZCIDVGIDcyIDY1IDY2IDY1IHwgICAgICAgICAgICAgfCBlYWtfcmVmZQorICArMHgxQzc4IHwgNzIgNjUgNkUgNjMgNjUgICAgICAgICAgfCAgICAgICAgICAgICB8IHJlbmNlCisgICsweDFDN0QgfCAwMCAgICAgICAgICAgICAgICAgICAgICB8IGNoYXIgICAgICAgIHwgMHgwMCAoMCkgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHN0cmluZyB0ZXJtaW5hdG9yCisKK3BhZGRpbmc6CisgICsweDFDN0UgfCAwMCAwMCAgICAgICAgICAgICAgICAgICB8IHVpbnQ4X3RbMl0gIHwgLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHBhZGRpbmcKKwordGFibGUgKHJlZmxlY3Rpb24uRmllbGQpOgorICArMHgxQzgwIHwgNUMgRjEgRkYgRkYgICAgICAgICAgICAgfCBTT2Zmc2V0MzIgICB8IDB4RkZGRkYxNUMgKC0zNzQ4KSBMb2M6ICsweDJCMjQgICAgfCBvZmZzZXQgdG8gdnRhYmxlCisgICsweDFDODQgfCAwMCAwMCAwMCAgICAgICAgICAgICAgICB8IHVpbnQ4X3RbM10gIHwgLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHBhZGRpbmcKKyAgKzB4MUM4NyB8IDAxICAgICAgICAgICAgICAgICAgICAgIHwgdWludDhfdCAgICAgfCAweDAxICgxKSAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgdGFibGUgZmllbGQgYG9wdGlvbmFsYCAoQm9vbCkKKyAgKzB4MUM4OCB8IDIzIDAwICAgICAgICAgICAgICAgICAgIHwgdWludDE2X3QgICAgfCAweDAwMjMgKDM1KSAgICAgICAgICAgICAgICAgICAgICAgIHwgdGFibGUgZmllbGQgYGlkYCAoVVNob3J0KQorICArMHgxQzhBIHwgNEEgMDAgICAgICAgICAgICAgICAgICAgfCB1aW50MTZfdCAgICB8IDB4MDA0QSAoNzQpICAgICAgICAgICAgICAgICAgICAgICAgfCB0YWJsZSBmaWVsZCBgb2Zmc2V0YCAoVVNob3J0KQorICArMHgxQzhDIHwgNDggMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDAwNDggKDcyKSBMb2M6ICsweDFDRDQgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYG5hbWVgIChzdHJpbmcpCisgICsweDFDOTAgfCAzNCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDAzNCAoNTIpIExvYzogKzB4MUNDNCAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgdHlwZWAgKHRhYmxlKQorICArMHgxQzk0IHwgMEMgMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDAwMEMgKDEyKSBMb2M6ICsweDFDQTAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYGF0dHJpYnV0ZXNgICh2ZWN0b3IpCisgICsweDFDOTggfCAwNCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDAwNCAoNCkgTG9jOiArMHgxQzlDICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgZG9jdW1lbnRhdGlvbmAgKHZlY3RvcikKKwordmVjdG9yIChyZWZsZWN0aW9uLkZpZWxkLmRvY3VtZW50YXRpb24pOgorICArMHgxQzlDIHwgMDAgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICB8IDB4MDAwMDAwMDAgKDApICAgICAgICAgICAgICAgICAgICAgfCBsZW5ndGggb2YgdmVjdG9yICgjIGl0ZW1zKQorCit2ZWN0b3IgKHJlZmxlY3Rpb24uRmllbGQuYXR0cmlidXRlcyk6CisgICsweDFDQTAgfCAwMSAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgIHwgMHgwMDAwMDAwMSAoMSkgICAgICAgICAgICAgICAgICAgICB8IGxlbmd0aCBvZiB2ZWN0b3IgKCMgaXRlbXMpCisgICsweDFDQTQgfCAwNCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDAwNCAoNCkgTG9jOiArMHgxQ0E4ICAgICAgICB8IG9mZnNldCB0byB0YWJsZVswXQorCit0YWJsZSAocmVmbGVjdGlvbi5LZXlWYWx1ZSk6CisgICsweDFDQTggfCA0NCBFNyBGRiBGRiAgICAgICAgICAgICB8IFNPZmZzZXQzMiAgIHwgMHhGRkZGRTc0NCAoLTYzMzIpIExvYzogKzB4MzU2NCAgICB8IG9mZnNldCB0byB2dGFibGUKKyAgKzB4MUNBQyB8IDEwIDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMDEwICgxNikgTG9jOiArMHgxQ0JDICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBrZXlgIChzdHJpbmcpCisgICsweDFDQjAgfCAwNCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDAwNCAoNCkgTG9jOiArMHgxQ0I0ICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgdmFsdWVgIChzdHJpbmcpCisKK3N0cmluZyAocmVmbGVjdGlvbi5LZXlWYWx1ZS52YWx1ZSk6CisgICsweDFDQjQgfCAwMiAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgIHwgMHgwMDAwMDAwMiAoMikgICAgICAgICAgICAgICAgICAgICB8IGxlbmd0aCBvZiBzdHJpbmcKKyAgKzB4MUNCOCB8IDMzIDM1ICAgICAgICAgICAgICAgICAgIHwgY2hhclsyXSAgICAgfCAzNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nIGxpdGVyYWwKKyAgKzB4MUNCQSB8IDAwICAgICAgICAgICAgICAgICAgICAgIHwgY2hhciAgICAgICAgfCAweDAwICgwKSAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nIHRlcm1pbmF0b3IKKworc3RyaW5nIChyZWZsZWN0aW9uLktleVZhbHVlLmtleSk6CisgICsweDFDQkMgfCAwMiAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgIHwgMHgwMDAwMDAwMiAoMikgICAgICAgICAgICAgICAgICAgICB8IGxlbmd0aCBvZiBzdHJpbmcKKyAgKzB4MUNDMCB8IDY5IDY0ICAgICAgICAgICAgICAgICAgIHwgY2hhclsyXSAgICAgfCBpZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nIGxpdGVyYWwKKyAgKzB4MUNDMiB8IDAwICAgICAgICAgICAgICAgICAgICAgIHwgY2hhciAgICAgICAgfCAweDAwICgwKSAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nIHRlcm1pbmF0b3IKKwordGFibGUgKHJlZmxlY3Rpb24uVHlwZSk6CisgICsweDFDQzQgfCAxNCBGMyBGRiBGRiAgICAgICAgICAgICB8IFNPZmZzZXQzMiAgIHwgMHhGRkZGRjMxNCAoLTMzMDgpIExvYzogKzB4MjlCMCAgICB8IG9mZnNldCB0byB2dGFibGUKKyAgKzB4MUNDOCB8IDAwIDAwICAgICAgICAgICAgICAgICAgIHwgdWludDhfdFsyXSAgfCAuLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgcGFkZGluZworICArMHgxQ0NBIHwgMEUgICAgICAgICAgICAgICAgICAgICAgfCB1aW50OF90ICAgICB8IDB4MEUgKDE0KSAgICAgICAgICAgICAgICAgICAgICAgICAgfCB0YWJsZSBmaWVsZCBgYmFzZV90eXBlYCAoQnl0ZSkKKyAgKzB4MUNDQiB8IDBGICAgICAgICAgICAgICAgICAgICAgIHwgdWludDhfdCAgICAgfCAweDBGICgxNSkgICAgICAgICAgICAgICAgICAgICAgICAgIHwgdGFibGUgZmllbGQgYGVsZW1lbnRgIChCeXRlKQorICArMHgxQ0NDIHwgMDIgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICB8IDB4MDAwMDAwMDIgKDIpICAgICAgICAgICAgICAgICAgICAgfCB0YWJsZSBmaWVsZCBgaW5kZXhgIChJbnQpCisgICsweDFDRDAgfCAwNCAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgIHwgMHgwMDAwMDAwNCAoNCkgICAgICAgICAgICAgICAgICAgICB8IHRhYmxlIGZpZWxkIGBlbGVtZW50X3NpemVgIChVSW50KQorCitzdHJpbmcgKHJlZmxlY3Rpb24uRmllbGQubmFtZSk6CisgICsweDFDRDQgfCAxNSAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgIHwgMHgwMDAwMDAxNSAoMjEpICAgICAgICAgICAgICAgICAgICB8IGxlbmd0aCBvZiBzdHJpbmcKKyAgKzB4MUNEOCB8IDc2IDY1IDYzIDc0IDZGIDcyIDVGIDZGIHwgY2hhclsyMV0gICAgfCB2ZWN0b3JfbyAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nIGxpdGVyYWwKKyAgKzB4MUNFMCB8IDY2IDVGIDcyIDY1IDY2IDY1IDcyIDcyIHwgICAgICAgICAgICAgfCBmX3JlZmVycgorICArMHgxQ0U4IHwgNjEgNjIgNkMgNjUgNzMgICAgICAgICAgfCAgICAgICAgICAgICB8IGFibGVzCisgICsweDFDRUQgfCAwMCAgICAgICAgICAgICAgICAgICAgICB8IGNoYXIgICAgICAgIHwgMHgwMCAoMCkgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHN0cmluZyB0ZXJtaW5hdG9yCisKK3BhZGRpbmc6CisgICsweDFDRUUgfCAwMCAwMCAgICAgICAgICAgICAgICAgICB8IHVpbnQ4X3RbMl0gIHwgLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHBhZGRpbmcKKwordGFibGUgKHJlZmxlY3Rpb24uRmllbGQpOgorICArMHgxQ0YwIHwgQ0MgRjEgRkYgRkYgICAgICAgICAgICAgfCBTT2Zmc2V0MzIgICB8IDB4RkZGRkYxQ0MgKC0zNjM2KSBMb2M6ICsweDJCMjQgICAgfCBvZmZzZXQgdG8gdnRhYmxlCisgICsweDFDRjQgfCAwMCAwMCAwMCAgICAgICAgICAgICAgICB8IHVpbnQ4X3RbM10gIHwgLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHBhZGRpbmcKKyAgKzB4MUNGNyB8IDAxICAgICAgICAgICAgICAgICAgICAgIHwgdWludDhfdCAgICAgfCAweDAxICgxKSAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgdGFibGUgZmllbGQgYG9wdGlvbmFsYCAoQm9vbCkKKyAgKzB4MUNGOCB8IDIyIDAwICAgICAgICAgICAgICAgICAgIHwgdWludDE2X3QgICAgfCAweDAwMjIgKDM0KSAgICAgICAgICAgICAgICAgICAgICAgIHwgdGFibGUgZmllbGQgYGlkYCAoVVNob3J0KQorICArMHgxQ0ZBIHwgNDggMDAgICAgICAgICAgICAgICAgICAgfCB1aW50MTZfdCAgICB8IDB4MDA0OCAoNzIpICAgICAgICAgICAgICAgICAgICAgICAgfCB0YWJsZSBmaWVsZCBgb2Zmc2V0YCAoVVNob3J0KQorICArMHgxQ0ZDIHwgNDggMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDAwNDggKDcyKSBMb2M6ICsweDFENDQgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYG5hbWVgIChzdHJpbmcpCisgICsweDFEMDAgfCAzNCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDAzNCAoNTIpIExvYzogKzB4MUQzNCAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgdHlwZWAgKHRhYmxlKQorICArMHgxRDA0IHwgMEMgMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDAwMEMgKDEyKSBMb2M6ICsweDFEMTAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYGF0dHJpYnV0ZXNgICh2ZWN0b3IpCisgICsweDFEMDggfCAwNCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDAwNCAoNCkgTG9jOiArMHgxRDBDICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgZG9jdW1lbnRhdGlvbmAgKHZlY3RvcikKKwordmVjdG9yIChyZWZsZWN0aW9uLkZpZWxkLmRvY3VtZW50YXRpb24pOgorICArMHgxRDBDIHwgMDAgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICB8IDB4MDAwMDAwMDAgKDApICAgICAgICAgICAgICAgICAgICAgfCBsZW5ndGggb2YgdmVjdG9yICgjIGl0ZW1zKQorCit2ZWN0b3IgKHJlZmxlY3Rpb24uRmllbGQuYXR0cmlidXRlcyk6CisgICsweDFEMTAgfCAwMSAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgIHwgMHgwMDAwMDAwMSAoMSkgICAgICAgICAgICAgICAgICAgICB8IGxlbmd0aCBvZiB2ZWN0b3IgKCMgaXRlbXMpCisgICsweDFEMTQgfCAwNCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDAwNCAoNCkgTG9jOiArMHgxRDE4ICAgICAgICB8IG9mZnNldCB0byB0YWJsZVswXQorCit0YWJsZSAocmVmbGVjdGlvbi5LZXlWYWx1ZSk6CisgICsweDFEMTggfCBCNCBFNyBGRiBGRiAgICAgICAgICAgICB8IFNPZmZzZXQzMiAgIHwgMHhGRkZGRTdCNCAoLTYyMjApIExvYzogKzB4MzU2NCAgICB8IG9mZnNldCB0byB2dGFibGUKKyAgKzB4MUQxQyB8IDEwIDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMDEwICgxNikgTG9jOiArMHgxRDJDICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBrZXlgIChzdHJpbmcpCisgICsweDFEMjAgfCAwNCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDAwNCAoNCkgTG9jOiArMHgxRDI0ICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgdmFsdWVgIChzdHJpbmcpCisKK3N0cmluZyAocmVmbGVjdGlvbi5LZXlWYWx1ZS52YWx1ZSk6CisgICsweDFEMjQgfCAwMiAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgIHwgMHgwMDAwMDAwMiAoMikgICAgICAgICAgICAgICAgICAgICB8IGxlbmd0aCBvZiBzdHJpbmcKKyAgKzB4MUQyOCB8IDMzIDM0ICAgICAgICAgICAgICAgICAgIHwgY2hhclsyXSAgICAgfCAzNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nIGxpdGVyYWwKKyAgKzB4MUQyQSB8IDAwICAgICAgICAgICAgICAgICAgICAgIHwgY2hhciAgICAgICAgfCAweDAwICgwKSAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nIHRlcm1pbmF0b3IKKworc3RyaW5nIChyZWZsZWN0aW9uLktleVZhbHVlLmtleSk6CisgICsweDFEMkMgfCAwMiAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgIHwgMHgwMDAwMDAwMiAoMikgICAgICAgICAgICAgICAgICAgICB8IGxlbmd0aCBvZiBzdHJpbmcKKyAgKzB4MUQzMCB8IDY5IDY0ICAgICAgICAgICAgICAgICAgIHwgY2hhclsyXSAgICAgfCBpZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nIGxpdGVyYWwKKyAgKzB4MUQzMiB8IDAwICAgICAgICAgICAgICAgICAgICAgIHwgY2hhciAgICAgICAgfCAweDAwICgwKSAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nIHRlcm1pbmF0b3IKKwordGFibGUgKHJlZmxlY3Rpb24uVHlwZSk6CisgICsweDFEMzQgfCA3QyBFNCBGRiBGRiAgICAgICAgICAgICB8IFNPZmZzZXQzMiAgIHwgMHhGRkZGRTQ3QyAoLTcwNDQpIExvYzogKzB4MzhCOCAgICB8IG9mZnNldCB0byB2dGFibGUKKyAgKzB4MUQzOCB8IDAwIDAwIDAwICAgICAgICAgICAgICAgIHwgdWludDhfdFszXSAgfCAuLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgcGFkZGluZworICArMHgxRDNCIHwgMEYgICAgICAgICAgICAgICAgICAgICAgfCB1aW50OF90ICAgICB8IDB4MEYgKDE1KSAgICAgICAgICAgICAgICAgICAgICAgICAgfCB0YWJsZSBmaWVsZCBgYmFzZV90eXBlYCAoQnl0ZSkKKyAgKzB4MUQzQyB8IDBCIDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgfCAweDAwMDAwMDBCICgxMSkgICAgICAgICAgICAgICAgICAgIHwgdGFibGUgZmllbGQgYGluZGV4YCAoSW50KQorICArMHgxRDQwIHwgMDEgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICB8IDB4MDAwMDAwMDEgKDEpICAgICAgICAgICAgICAgICAgICAgfCB0YWJsZSBmaWVsZCBgZWxlbWVudF9zaXplYCAoVUludCkKKworc3RyaW5nIChyZWZsZWN0aW9uLkZpZWxkLm5hbWUpOgorICArMHgxRDQ0IHwgMTUgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICB8IDB4MDAwMDAwMTUgKDIxKSAgICAgICAgICAgICAgICAgICAgfCBsZW5ndGggb2Ygc3RyaW5nCisgICsweDFENDggfCA3MCA2MSA3MiA2NSA2RSA3NCA1RiA2RSB8IGNoYXJbMjFdICAgIHwgcGFyZW50X24gICAgICAgICAgICAgICAgICAgICAgICAgICB8IHN0cmluZyBsaXRlcmFsCisgICsweDFENTAgfCA2MSA2RCA2NSA3MyA3MCA2MSA2MyA2NSB8ICAgICAgICAgICAgIHwgYW1lc3BhY2UKKyAgKzB4MUQ1OCB8IDVGIDc0IDY1IDczIDc0ICAgICAgICAgIHwgICAgICAgICAgICAgfCBfdGVzdAorICArMHgxRDVEIHwgMDAgICAgICAgICAgICAgICAgICAgICAgfCBjaGFyICAgICAgICB8IDB4MDAgKDApICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJpbmcgdGVybWluYXRvcgorCitwYWRkaW5nOgorICArMHgxRDVFIHwgMDAgMDAgICAgICAgICAgICAgICAgICAgfCB1aW50OF90WzJdICB8IC4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBwYWRkaW5nCisKK3RhYmxlIChyZWZsZWN0aW9uLkZpZWxkKToKKyAgKzB4MUQ2MCB8IDNDIEYyIEZGIEZGICAgICAgICAgICAgIHwgU09mZnNldDMyICAgfCAweEZGRkZGMjNDICgtMzUyNCkgTG9jOiArMHgyQjI0ICAgIHwgb2Zmc2V0IHRvIHZ0YWJsZQorICArMHgxRDY0IHwgMDAgMDAgMDAgICAgICAgICAgICAgICAgfCB1aW50OF90WzNdICB8IC4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBwYWRkaW5nCisgICsweDFENjcgfCAwMSAgICAgICAgICAgICAgICAgICAgICB8IHVpbnQ4X3QgICAgIHwgMHgwMSAoMSkgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHRhYmxlIGZpZWxkIGBvcHRpb25hbGAgKEJvb2wpCisgICsweDFENjggfCAyMSAwMCAgICAgICAgICAgICAgICAgICB8IHVpbnQxNl90ICAgIHwgMHgwMDIxICgzMykgICAgICAgICAgICAgICAgICAgICAgICB8IHRhYmxlIGZpZWxkIGBpZGAgKFVTaG9ydCkKKyAgKzB4MUQ2QSB8IDQ2IDAwICAgICAgICAgICAgICAgICAgIHwgdWludDE2X3QgICAgfCAweDAwNDYgKDcwKSAgICAgICAgICAgICAgICAgICAgICAgIHwgdGFibGUgZmllbGQgYG9mZnNldGAgKFVTaG9ydCkKKyAgKzB4MUQ2QyB8IDQ0IDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMDQ0ICg2OCkgTG9jOiArMHgxREIwICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBuYW1lYCAoc3RyaW5nKQorICArMHgxRDcwIHwgMzQgMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDAwMzQgKDUyKSBMb2M6ICsweDFEQTQgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYHR5cGVgICh0YWJsZSkKKyAgKzB4MUQ3NCB8IDBDIDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMDBDICgxMikgTG9jOiArMHgxRDgwICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBhdHRyaWJ1dGVzYCAodmVjdG9yKQorICArMHgxRDc4IHwgMDQgMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDAwMDQgKDQpIExvYzogKzB4MUQ3QyAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYGRvY3VtZW50YXRpb25gICh2ZWN0b3IpCisKK3ZlY3RvciAocmVmbGVjdGlvbi5GaWVsZC5kb2N1bWVudGF0aW9uKToKKyAgKzB4MUQ3QyB8IDAwIDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgfCAweDAwMDAwMDAwICgwKSAgICAgICAgICAgICAgICAgICAgIHwgbGVuZ3RoIG9mIHZlY3RvciAoIyBpdGVtcykKKwordmVjdG9yIChyZWZsZWN0aW9uLkZpZWxkLmF0dHJpYnV0ZXMpOgorICArMHgxRDgwIHwgMDEgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICB8IDB4MDAwMDAwMDEgKDEpICAgICAgICAgICAgICAgICAgICAgfCBsZW5ndGggb2YgdmVjdG9yICgjIGl0ZW1zKQorICArMHgxRDg0IHwgMDQgMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDAwMDQgKDQpIExvYzogKzB4MUQ4OCAgICAgICAgfCBvZmZzZXQgdG8gdGFibGVbMF0KKwordGFibGUgKHJlZmxlY3Rpb24uS2V5VmFsdWUpOgorICArMHgxRDg4IHwgMjQgRTggRkYgRkYgICAgICAgICAgICAgfCBTT2Zmc2V0MzIgICB8IDB4RkZGRkU4MjQgKC02MTA4KSBMb2M6ICsweDM1NjQgICAgfCBvZmZzZXQgdG8gdnRhYmxlCisgICsweDFEOEMgfCAxMCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDAxMCAoMTYpIExvYzogKzB4MUQ5QyAgICAgICB8IG9mZnNldCB0byBmaWVsZCBga2V5YCAoc3RyaW5nKQorICArMHgxRDkwIHwgMDQgMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDAwMDQgKDQpIExvYzogKzB4MUQ5NCAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYHZhbHVlYCAoc3RyaW5nKQorCitzdHJpbmcgKHJlZmxlY3Rpb24uS2V5VmFsdWUudmFsdWUpOgorICArMHgxRDk0IHwgMDIgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICB8IDB4MDAwMDAwMDIgKDIpICAgICAgICAgICAgICAgICAgICAgfCBsZW5ndGggb2Ygc3RyaW5nCisgICsweDFEOTggfCAzMyAzMyAgICAgICAgICAgICAgICAgICB8IGNoYXJbMl0gICAgIHwgMzMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHN0cmluZyBsaXRlcmFsCisgICsweDFEOUEgfCAwMCAgICAgICAgICAgICAgICAgICAgICB8IGNoYXIgICAgICAgIHwgMHgwMCAoMCkgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHN0cmluZyB0ZXJtaW5hdG9yCisKK3N0cmluZyAocmVmbGVjdGlvbi5LZXlWYWx1ZS5rZXkpOgorICArMHgxRDlDIHwgMDIgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICB8IDB4MDAwMDAwMDIgKDIpICAgICAgICAgICAgICAgICAgICAgfCBsZW5ndGggb2Ygc3RyaW5nCisgICsweDFEQTAgfCA2OSA2NCAgICAgICAgICAgICAgICAgICB8IGNoYXJbMl0gICAgIHwgaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHN0cmluZyBsaXRlcmFsCisgICsweDFEQTIgfCAwMCAgICAgICAgICAgICAgICAgICAgICB8IGNoYXIgICAgICAgIHwgMHgwMCAoMCkgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHN0cmluZyB0ZXJtaW5hdG9yCisKK3RhYmxlIChyZWZsZWN0aW9uLlR5cGUpOgorICArMHgxREE0IHwgMjAgRjIgRkYgRkYgICAgICAgICAgICAgfCBTT2Zmc2V0MzIgICB8IDB4RkZGRkYyMjAgKC0zNTUyKSBMb2M6ICsweDJCODQgICAgfCBvZmZzZXQgdG8gdnRhYmxlCisgICsweDFEQTggfCAwMCAwMCAgICAgICAgICAgICAgICAgICB8IHVpbnQ4X3RbMl0gIHwgLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHBhZGRpbmcKKyAgKzB4MURBQSB8IDBFICAgICAgICAgICAgICAgICAgICAgIHwgdWludDhfdCAgICAgfCAweDBFICgxNCkgICAgICAgICAgICAgICAgICAgICAgICAgIHwgdGFibGUgZmllbGQgYGJhc2VfdHlwZWAgKEJ5dGUpCisgICsweDFEQUIgfCAwQyAgICAgICAgICAgICAgICAgICAgICB8IHVpbnQ4X3QgICAgIHwgMHgwQyAoMTIpICAgICAgICAgICAgICAgICAgICAgICAgICB8IHRhYmxlIGZpZWxkIGBlbGVtZW50YCAoQnl0ZSkKKyAgKzB4MURBQyB8IDA4IDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgfCAweDAwMDAwMDA4ICg4KSAgICAgICAgICAgICAgICAgICAgIHwgdGFibGUgZmllbGQgYGVsZW1lbnRfc2l6ZWAgKFVJbnQpCisKK3N0cmluZyAocmVmbGVjdGlvbi5GaWVsZC5uYW1lKToKKyAgKzB4MURCMCB8IDExIDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgfCAweDAwMDAwMDExICgxNykgICAgICAgICAgICAgICAgICAgIHwgbGVuZ3RoIG9mIHN0cmluZworICArMHgxREI0IHwgNzYgNjUgNjMgNzQgNkYgNzIgNUYgNkYgfCBjaGFyWzE3XSAgICB8IHZlY3Rvcl9vICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJpbmcgbGl0ZXJhbAorICArMHgxREJDIHwgNjYgNUYgNjQgNkYgNzUgNjIgNkMgNjUgfCAgICAgICAgICAgICB8IGZfZG91YmxlCisgICsweDFEQzQgfCA3MyAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgIHwgcworICArMHgxREM1IHwgMDAgICAgICAgICAgICAgICAgICAgICAgfCBjaGFyICAgICAgICB8IDB4MDAgKDApICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJpbmcgdGVybWluYXRvcgorCitwYWRkaW5nOgorICArMHgxREM2IHwgMDAgMDAgICAgICAgICAgICAgICAgICAgfCB1aW50OF90WzJdICB8IC4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBwYWRkaW5nCisKK3RhYmxlIChyZWZsZWN0aW9uLkZpZWxkKToKKyAgKzB4MURDOCB8IEE0IEYyIEZGIEZGICAgICAgICAgICAgIHwgU09mZnNldDMyICAgfCAweEZGRkZGMkE0ICgtMzQyMCkgTG9jOiArMHgyQjI0ICAgIHwgb2Zmc2V0IHRvIHZ0YWJsZQorICArMHgxRENDIHwgMDAgMDAgMDAgICAgICAgICAgICAgICAgfCB1aW50OF90WzNdICB8IC4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBwYWRkaW5nCisgICsweDFEQ0YgfCAwMSAgICAgICAgICAgICAgICAgICAgICB8IHVpbnQ4X3QgICAgIHwgMHgwMSAoMSkgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHRhYmxlIGZpZWxkIGBvcHRpb25hbGAgKEJvb2wpCisgICsweDFERDAgfCAyMCAwMCAgICAgICAgICAgICAgICAgICB8IHVpbnQxNl90ICAgIHwgMHgwMDIwICgzMikgICAgICAgICAgICAgICAgICAgICAgICB8IHRhYmxlIGZpZWxkIGBpZGAgKFVTaG9ydCkKKyAgKzB4MUREMiB8IDQ0IDAwICAgICAgICAgICAgICAgICAgIHwgdWludDE2X3QgICAgfCAweDAwNDQgKDY4KSAgICAgICAgICAgICAgICAgICAgICAgIHwgdGFibGUgZmllbGQgYG9mZnNldGAgKFVTaG9ydCkKKyAgKzB4MURENCB8IDQ0IDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMDQ0ICg2OCkgTG9jOiArMHgxRTE4ICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBuYW1lYCAoc3RyaW5nKQorICArMHgxREQ4IHwgMzQgMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDAwMzQgKDUyKSBMb2M6ICsweDFFMEMgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYHR5cGVgICh0YWJsZSkKKyAgKzB4MUREQyB8IDBDIDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMDBDICgxMikgTG9jOiArMHgxREU4ICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBhdHRyaWJ1dGVzYCAodmVjdG9yKQorICArMHgxREUwIHwgMDQgMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDAwMDQgKDQpIExvYzogKzB4MURFNCAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYGRvY3VtZW50YXRpb25gICh2ZWN0b3IpCisKK3ZlY3RvciAocmVmbGVjdGlvbi5GaWVsZC5kb2N1bWVudGF0aW9uKToKKyAgKzB4MURFNCB8IDAwIDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgfCAweDAwMDAwMDAwICgwKSAgICAgICAgICAgICAgICAgICAgIHwgbGVuZ3RoIG9mIHZlY3RvciAoIyBpdGVtcykKKwordmVjdG9yIChyZWZsZWN0aW9uLkZpZWxkLmF0dHJpYnV0ZXMpOgorICArMHgxREU4IHwgMDEgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICB8IDB4MDAwMDAwMDEgKDEpICAgICAgICAgICAgICAgICAgICAgfCBsZW5ndGggb2YgdmVjdG9yICgjIGl0ZW1zKQorICArMHgxREVDIHwgMDQgMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDAwMDQgKDQpIExvYzogKzB4MURGMCAgICAgICAgfCBvZmZzZXQgdG8gdGFibGVbMF0KKwordGFibGUgKHJlZmxlY3Rpb24uS2V5VmFsdWUpOgorICArMHgxREYwIHwgOEMgRTggRkYgRkYgICAgICAgICAgICAgfCBTT2Zmc2V0MzIgICB8IDB4RkZGRkU4OEMgKC02MDA0KSBMb2M6ICsweDM1NjQgICAgfCBvZmZzZXQgdG8gdnRhYmxlCisgICsweDFERjQgfCAxMCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDAxMCAoMTYpIExvYzogKzB4MUUwNCAgICAgICB8IG9mZnNldCB0byBmaWVsZCBga2V5YCAoc3RyaW5nKQorICArMHgxREY4IHwgMDQgMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDAwMDQgKDQpIExvYzogKzB4MURGQyAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYHZhbHVlYCAoc3RyaW5nKQorCitzdHJpbmcgKHJlZmxlY3Rpb24uS2V5VmFsdWUudmFsdWUpOgorICArMHgxREZDIHwgMDIgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICB8IDB4MDAwMDAwMDIgKDIpICAgICAgICAgICAgICAgICAgICAgfCBsZW5ndGggb2Ygc3RyaW5nCisgICsweDFFMDAgfCAzMyAzMiAgICAgICAgICAgICAgICAgICB8IGNoYXJbMl0gICAgIHwgMzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHN0cmluZyBsaXRlcmFsCisgICsweDFFMDIgfCAwMCAgICAgICAgICAgICAgICAgICAgICB8IGNoYXIgICAgICAgIHwgMHgwMCAoMCkgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHN0cmluZyB0ZXJtaW5hdG9yCisKK3N0cmluZyAocmVmbGVjdGlvbi5LZXlWYWx1ZS5rZXkpOgorICArMHgxRTA0IHwgMDIgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICB8IDB4MDAwMDAwMDIgKDIpICAgICAgICAgICAgICAgICAgICAgfCBsZW5ndGggb2Ygc3RyaW5nCisgICsweDFFMDggfCA2OSA2NCAgICAgICAgICAgICAgICAgICB8IGNoYXJbMl0gICAgIHwgaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHN0cmluZyBsaXRlcmFsCisgICsweDFFMEEgfCAwMCAgICAgICAgICAgICAgICAgICAgICB8IGNoYXIgICAgICAgIHwgMHgwMCAoMCkgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHN0cmluZyB0ZXJtaW5hdG9yCisKK3RhYmxlIChyZWZsZWN0aW9uLlR5cGUpOgorICArMHgxRTBDIHwgODggRjIgRkYgRkYgICAgICAgICAgICAgfCBTT2Zmc2V0MzIgICB8IDB4RkZGRkYyODggKC0zNDQ4KSBMb2M6ICsweDJCODQgICAgfCBvZmZzZXQgdG8gdnRhYmxlCisgICsweDFFMTAgfCAwMCAwMCAgICAgICAgICAgICAgICAgICB8IHVpbnQ4X3RbMl0gIHwgLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHBhZGRpbmcKKyAgKzB4MUUxMiB8IDBFICAgICAgICAgICAgICAgICAgICAgIHwgdWludDhfdCAgICAgfCAweDBFICgxNCkgICAgICAgICAgICAgICAgICAgICAgICAgIHwgdGFibGUgZmllbGQgYGJhc2VfdHlwZWAgKEJ5dGUpCisgICsweDFFMTMgfCAwOSAgICAgICAgICAgICAgICAgICAgICB8IHVpbnQ4X3QgICAgIHwgMHgwOSAoOSkgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHRhYmxlIGZpZWxkIGBlbGVtZW50YCAoQnl0ZSkKKyAgKzB4MUUxNCB8IDA4IDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgfCAweDAwMDAwMDA4ICg4KSAgICAgICAgICAgICAgICAgICAgIHwgdGFibGUgZmllbGQgYGVsZW1lbnRfc2l6ZWAgKFVJbnQpCisKK3N0cmluZyAocmVmbGVjdGlvbi5GaWVsZC5uYW1lKToKKyAgKzB4MUUxOCB8IDBGIDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgfCAweDAwMDAwMDBGICgxNSkgICAgICAgICAgICAgICAgICAgIHwgbGVuZ3RoIG9mIHN0cmluZworICArMHgxRTFDIHwgNzYgNjUgNjMgNzQgNkYgNzIgNUYgNkYgfCBjaGFyWzE1XSAgICB8IHZlY3Rvcl9vICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJpbmcgbGl0ZXJhbAorICArMHgxRTI0IHwgNjYgNUYgNkMgNkYgNkUgNjcgNzMgICAgfCAgICAgICAgICAgICB8IGZfbG9uZ3MKKyAgKzB4MUUyQiB8IDAwICAgICAgICAgICAgICAgICAgICAgIHwgY2hhciAgICAgICAgfCAweDAwICgwKSAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nIHRlcm1pbmF0b3IKKwordGFibGUgKHJlZmxlY3Rpb24uRmllbGQpOgorICArMHgxRTJDIHwgMDggRjMgRkYgRkYgICAgICAgICAgICAgfCBTT2Zmc2V0MzIgICB8IDB4RkZGRkYzMDggKC0zMzIwKSBMb2M6ICsweDJCMjQgICAgfCBvZmZzZXQgdG8gdnRhYmxlCisgICsweDFFMzAgfCAwMCAwMCAwMCAgICAgICAgICAgICAgICB8IHVpbnQ4X3RbM10gIHwgLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHBhZGRpbmcKKyAgKzB4MUUzMyB8IDAxICAgICAgICAgICAgICAgICAgICAgIHwgdWludDhfdCAgICAgfCAweDAxICgxKSAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgdGFibGUgZmllbGQgYG9wdGlvbmFsYCAoQm9vbCkKKyAgKzB4MUUzNCB8IDFGIDAwICAgICAgICAgICAgICAgICAgIHwgdWludDE2X3QgICAgfCAweDAwMUYgKDMxKSAgICAgICAgICAgICAgICAgICAgICAgIHwgdGFibGUgZmllbGQgYGlkYCAoVVNob3J0KQorICArMHgxRTM2IHwgNDIgMDAgICAgICAgICAgICAgICAgICAgfCB1aW50MTZfdCAgICB8IDB4MDA0MiAoNjYpICAgICAgICAgICAgICAgICAgICAgICAgfCB0YWJsZSBmaWVsZCBgb2Zmc2V0YCAoVVNob3J0KQorICArMHgxRTM4IHwgNDggMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDAwNDggKDcyKSBMb2M6ICsweDFFODAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYG5hbWVgIChzdHJpbmcpCisgICsweDFFM0MgfCAzNCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDAzNCAoNTIpIExvYzogKzB4MUU3MCAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgdHlwZWAgKHRhYmxlKQorICArMHgxRTQwIHwgMEMgMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDAwMEMgKDEyKSBMb2M6ICsweDFFNEMgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYGF0dHJpYnV0ZXNgICh2ZWN0b3IpCisgICsweDFFNDQgfCAwNCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDAwNCAoNCkgTG9jOiArMHgxRTQ4ICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgZG9jdW1lbnRhdGlvbmAgKHZlY3RvcikKKwordmVjdG9yIChyZWZsZWN0aW9uLkZpZWxkLmRvY3VtZW50YXRpb24pOgorICArMHgxRTQ4IHwgMDAgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICB8IDB4MDAwMDAwMDAgKDApICAgICAgICAgICAgICAgICAgICAgfCBsZW5ndGggb2YgdmVjdG9yICgjIGl0ZW1zKQorCit2ZWN0b3IgKHJlZmxlY3Rpb24uRmllbGQuYXR0cmlidXRlcyk6CisgICsweDFFNEMgfCAwMSAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgIHwgMHgwMDAwMDAwMSAoMSkgICAgICAgICAgICAgICAgICAgICB8IGxlbmd0aCBvZiB2ZWN0b3IgKCMgaXRlbXMpCisgICsweDFFNTAgfCAwNCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDAwNCAoNCkgTG9jOiArMHgxRTU0ICAgICAgICB8IG9mZnNldCB0byB0YWJsZVswXQorCit0YWJsZSAocmVmbGVjdGlvbi5LZXlWYWx1ZSk6CisgICsweDFFNTQgfCBGMCBFOCBGRiBGRiAgICAgICAgICAgICB8IFNPZmZzZXQzMiAgIHwgMHhGRkZGRThGMCAoLTU5MDQpIExvYzogKzB4MzU2NCAgICB8IG9mZnNldCB0byB2dGFibGUKKyAgKzB4MUU1OCB8IDEwIDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMDEwICgxNikgTG9jOiArMHgxRTY4ICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBrZXlgIChzdHJpbmcpCisgICsweDFFNUMgfCAwNCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDAwNCAoNCkgTG9jOiArMHgxRTYwICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgdmFsdWVgIChzdHJpbmcpCisKK3N0cmluZyAocmVmbGVjdGlvbi5LZXlWYWx1ZS52YWx1ZSk6CisgICsweDFFNjAgfCAwMiAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgIHwgMHgwMDAwMDAwMiAoMikgICAgICAgICAgICAgICAgICAgICB8IGxlbmd0aCBvZiBzdHJpbmcKKyAgKzB4MUU2NCB8IDMzIDMxICAgICAgICAgICAgICAgICAgIHwgY2hhclsyXSAgICAgfCAzMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nIGxpdGVyYWwKKyAgKzB4MUU2NiB8IDAwICAgICAgICAgICAgICAgICAgICAgIHwgY2hhciAgICAgICAgfCAweDAwICgwKSAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nIHRlcm1pbmF0b3IKKworc3RyaW5nIChyZWZsZWN0aW9uLktleVZhbHVlLmtleSk6CisgICsweDFFNjggfCAwMiAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgIHwgMHgwMDAwMDAwMiAoMikgICAgICAgICAgICAgICAgICAgICB8IGxlbmd0aCBvZiBzdHJpbmcKKyAgKzB4MUU2QyB8IDY5IDY0ICAgICAgICAgICAgICAgICAgIHwgY2hhclsyXSAgICAgfCBpZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nIGxpdGVyYWwKKyAgKzB4MUU2RSB8IDAwICAgICAgICAgICAgICAgICAgICAgIHwgY2hhciAgICAgICAgfCAweDAwICgwKSAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nIHRlcm1pbmF0b3IKKwordGFibGUgKHJlZmxlY3Rpb24uVHlwZSk6CisgICsweDFFNzAgfCBDMCBGNCBGRiBGRiAgICAgICAgICAgICB8IFNPZmZzZXQzMiAgIHwgMHhGRkZGRjRDMCAoLTI4ODApIExvYzogKzB4MjlCMCAgICB8IG9mZnNldCB0byB2dGFibGUKKyAgKzB4MUU3NCB8IDAwIDAwICAgICAgICAgICAgICAgICAgIHwgdWludDhfdFsyXSAgfCAuLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgcGFkZGluZworICArMHgxRTc2IHwgMEUgICAgICAgICAgICAgICAgICAgICAgfCB1aW50OF90ICAgICB8IDB4MEUgKDE0KSAgICAgICAgICAgICAgICAgICAgICAgICAgfCB0YWJsZSBmaWVsZCBgYmFzZV90eXBlYCAoQnl0ZSkKKyAgKzB4MUU3NyB8IDBGICAgICAgICAgICAgICAgICAgICAgIHwgdWludDhfdCAgICAgfCAweDBGICgxNSkgICAgICAgICAgICAgICAgICAgICAgICAgIHwgdGFibGUgZmllbGQgYGVsZW1lbnRgIChCeXRlKQorICArMHgxRTc4IHwgMDYgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICB8IDB4MDAwMDAwMDYgKDYpICAgICAgICAgICAgICAgICAgICAgfCB0YWJsZSBmaWVsZCBgaW5kZXhgIChJbnQpCisgICsweDFFN0MgfCAwNCAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgIHwgMHgwMDAwMDAwNCAoNCkgICAgICAgICAgICAgICAgICAgICB8IHRhYmxlIGZpZWxkIGBlbGVtZW50X3NpemVgIChVSW50KQorCitzdHJpbmcgKHJlZmxlY3Rpb24uRmllbGQubmFtZSk6CisgICsweDFFODAgfCAwNSAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgIHwgMHgwMDAwMDAwNSAoNSkgICAgICAgICAgICAgICAgICAgICB8IGxlbmd0aCBvZiBzdHJpbmcKKyAgKzB4MUU4NCB8IDc0IDY1IDczIDc0IDM1ICAgICAgICAgIHwgY2hhcls1XSAgICAgfCB0ZXN0NSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nIGxpdGVyYWwKKyAgKzB4MUU4OSB8IDAwICAgICAgICAgICAgICAgICAgICAgIHwgY2hhciAgICAgICAgfCAweDAwICgwKSAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nIHRlcm1pbmF0b3IKKworcGFkZGluZzoKKyAgKzB4MUU4QSB8IDAwIDAwICAgICAgICAgICAgICAgICAgIHwgdWludDhfdFsyXSAgfCAuLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgcGFkZGluZworCit0YWJsZSAocmVmbGVjdGlvbi5GaWVsZCk6CisgICsweDFFOEMgfCA2OCBGMyBGRiBGRiAgICAgICAgICAgICB8IFNPZmZzZXQzMiAgIHwgMHhGRkZGRjM2OCAoLTMyMjQpIExvYzogKzB4MkIyNCAgICB8IG9mZnNldCB0byB2dGFibGUKKyAgKzB4MUU5MCB8IDAwIDAwIDAwICAgICAgICAgICAgICAgIHwgdWludDhfdFszXSAgfCAuLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgcGFkZGluZworICArMHgxRTkzIHwgMDEgICAgICAgICAgICAgICAgICAgICAgfCB1aW50OF90ICAgICB8IDB4MDEgKDEpICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB0YWJsZSBmaWVsZCBgb3B0aW9uYWxgIChCb29sKQorICArMHgxRTk0IHwgMUUgMDAgICAgICAgICAgICAgICAgICAgfCB1aW50MTZfdCAgICB8IDB4MDAxRSAoMzApICAgICAgICAgICAgICAgICAgICAgICAgfCB0YWJsZSBmaWVsZCBgaWRgIChVU2hvcnQpCisgICsweDFFOTYgfCA0MCAwMCAgICAgICAgICAgICAgICAgICB8IHVpbnQxNl90ICAgIHwgMHgwMDQwICg2NCkgICAgICAgICAgICAgICAgICAgICAgICB8IHRhYmxlIGZpZWxkIGBvZmZzZXRgIChVU2hvcnQpCisgICsweDFFOTggfCA2QyAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDA2QyAoMTA4KSBMb2M6ICsweDFGMDQgICAgICB8IG9mZnNldCB0byBmaWVsZCBgbmFtZWAgKHN0cmluZykKKyAgKzB4MUU5QyB8IDVDIDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMDVDICg5MikgTG9jOiArMHgxRUY4ICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGB0eXBlYCAodGFibGUpCisgICsweDFFQTAgfCAwQyAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDAwQyAoMTIpIExvYzogKzB4MUVBQyAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgYXR0cmlidXRlc2AgKHZlY3RvcikKKyAgKzB4MUVBNCB8IDA0IDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMDA0ICg0KSBMb2M6ICsweDFFQTggICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBkb2N1bWVudGF0aW9uYCAodmVjdG9yKQorCit2ZWN0b3IgKHJlZmxlY3Rpb24uRmllbGQuZG9jdW1lbnRhdGlvbik6CisgICsweDFFQTggfCAwMCAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgIHwgMHgwMDAwMDAwMCAoMCkgICAgICAgICAgICAgICAgICAgICB8IGxlbmd0aCBvZiB2ZWN0b3IgKCMgaXRlbXMpCisKK3ZlY3RvciAocmVmbGVjdGlvbi5GaWVsZC5hdHRyaWJ1dGVzKToKKyAgKzB4MUVBQyB8IDAyIDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgfCAweDAwMDAwMDAyICgyKSAgICAgICAgICAgICAgICAgICAgIHwgbGVuZ3RoIG9mIHZlY3RvciAoIyBpdGVtcykKKyAgKzB4MUVCMCB8IDI0IDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMDI0ICgzNikgTG9jOiArMHgxRUQ0ICAgICAgIHwgb2Zmc2V0IHRvIHRhYmxlWzBdCisgICsweDFFQjQgfCAwNCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDAwNCAoNCkgTG9jOiArMHgxRUI4ICAgICAgICB8IG9mZnNldCB0byB0YWJsZVsxXQorCit0YWJsZSAocmVmbGVjdGlvbi5LZXlWYWx1ZSk6CisgICsweDFFQjggfCA1NCBFOSBGRiBGRiAgICAgICAgICAgICB8IFNPZmZzZXQzMiAgIHwgMHhGRkZGRTk1NCAoLTU4MDQpIExvYzogKzB4MzU2NCAgICB8IG9mZnNldCB0byB2dGFibGUKKyAgKzB4MUVCQyB8IDEwIDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMDEwICgxNikgTG9jOiArMHgxRUNDICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBrZXlgIChzdHJpbmcpCisgICsweDFFQzAgfCAwNCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDAwNCAoNCkgTG9jOiArMHgxRUM0ICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgdmFsdWVgIChzdHJpbmcpCisKK3N0cmluZyAocmVmbGVjdGlvbi5LZXlWYWx1ZS52YWx1ZSk6CisgICsweDFFQzQgfCAwMiAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgIHwgMHgwMDAwMDAwMiAoMikgICAgICAgICAgICAgICAgICAgICB8IGxlbmd0aCBvZiBzdHJpbmcKKyAgKzB4MUVDOCB8IDMzIDMwICAgICAgICAgICAgICAgICAgIHwgY2hhclsyXSAgICAgfCAzMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nIGxpdGVyYWwKKyAgKzB4MUVDQSB8IDAwICAgICAgICAgICAgICAgICAgICAgIHwgY2hhciAgICAgICAgfCAweDAwICgwKSAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nIHRlcm1pbmF0b3IKKworc3RyaW5nIChyZWZsZWN0aW9uLktleVZhbHVlLmtleSk6CisgICsweDFFQ0MgfCAwMiAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgIHwgMHgwMDAwMDAwMiAoMikgICAgICAgICAgICAgICAgICAgICB8IGxlbmd0aCBvZiBzdHJpbmcKKyAgKzB4MUVEMCB8IDY5IDY0ICAgICAgICAgICAgICAgICAgIHwgY2hhclsyXSAgICAgfCBpZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nIGxpdGVyYWwKKyAgKzB4MUVEMiB8IDAwICAgICAgICAgICAgICAgICAgICAgIHwgY2hhciAgICAgICAgfCAweDAwICgwKSAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nIHRlcm1pbmF0b3IKKwordGFibGUgKHJlZmxlY3Rpb24uS2V5VmFsdWUpOgorICArMHgxRUQ0IHwgNzAgRTkgRkYgRkYgICAgICAgICAgICAgfCBTT2Zmc2V0MzIgICB8IDB4RkZGRkU5NzAgKC01Nzc2KSBMb2M6ICsweDM1NjQgICAgfCBvZmZzZXQgdG8gdnRhYmxlCisgICsweDFFRDggfCAxMCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDAxMCAoMTYpIExvYzogKzB4MUVFOCAgICAgICB8IG9mZnNldCB0byBmaWVsZCBga2V5YCAoc3RyaW5nKQorICArMHgxRURDIHwgMDQgMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDAwMDQgKDQpIExvYzogKzB4MUVFMCAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYHZhbHVlYCAoc3RyaW5nKQorCitzdHJpbmcgKHJlZmxlY3Rpb24uS2V5VmFsdWUudmFsdWUpOgorICArMHgxRUUwIHwgMDEgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICB8IDB4MDAwMDAwMDEgKDEpICAgICAgICAgICAgICAgICAgICAgfCBsZW5ndGggb2Ygc3RyaW5nCisgICsweDFFRTQgfCAzMCAgICAgICAgICAgICAgICAgICAgICB8IGNoYXJbMV0gICAgIHwgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHN0cmluZyBsaXRlcmFsCisgICsweDFFRTUgfCAwMCAgICAgICAgICAgICAgICAgICAgICB8IGNoYXIgICAgICAgIHwgMHgwMCAoMCkgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHN0cmluZyB0ZXJtaW5hdG9yCisKK3BhZGRpbmc6CisgICsweDFFRTYgfCAwMCAwMCAgICAgICAgICAgICAgICAgICB8IHVpbnQ4X3RbMl0gIHwgLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHBhZGRpbmcKKworc3RyaW5nIChyZWZsZWN0aW9uLktleVZhbHVlLmtleSk6CisgICsweDFFRTggfCAwQSAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgIHwgMHgwMDAwMDAwQSAoMTApICAgICAgICAgICAgICAgICAgICB8IGxlbmd0aCBvZiBzdHJpbmcKKyAgKzB4MUVFQyB8IDY2IDZDIDY1IDc4IDYyIDc1IDY2IDY2IHwgY2hhclsxMF0gICAgfCBmbGV4YnVmZiAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nIGxpdGVyYWwKKyAgKzB4MUVGNCB8IDY1IDcyICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgfCBlcgorICArMHgxRUY2IHwgMDAgICAgICAgICAgICAgICAgICAgICAgfCBjaGFyICAgICAgICB8IDB4MDAgKDApICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJpbmcgdGVybWluYXRvcgorCit0YWJsZSAocmVmbGVjdGlvbi5UeXBlKToKKyAgKzB4MUVGOCB8IDc0IEYzIEZGIEZGICAgICAgICAgICAgIHwgU09mZnNldDMyICAgfCAweEZGRkZGMzc0ICgtMzIxMikgTG9jOiArMHgyQjg0ICAgIHwgb2Zmc2V0IHRvIHZ0YWJsZQorICArMHgxRUZDIHwgMDAgMDAgICAgICAgICAgICAgICAgICAgfCB1aW50OF90WzJdICB8IC4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBwYWRkaW5nCisgICsweDFFRkUgfCAwRSAgICAgICAgICAgICAgICAgICAgICB8IHVpbnQ4X3QgICAgIHwgMHgwRSAoMTQpICAgICAgICAgICAgICAgICAgICAgICAgICB8IHRhYmxlIGZpZWxkIGBiYXNlX3R5cGVgIChCeXRlKQorICArMHgxRUZGIHwgMDQgICAgICAgICAgICAgICAgICAgICAgfCB1aW50OF90ICAgICB8IDB4MDQgKDQpICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB0YWJsZSBmaWVsZCBgZWxlbWVudGAgKEJ5dGUpCisgICsweDFGMDAgfCAwMSAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgIHwgMHgwMDAwMDAwMSAoMSkgICAgICAgICAgICAgICAgICAgICB8IHRhYmxlIGZpZWxkIGBlbGVtZW50X3NpemVgIChVSW50KQorCitzdHJpbmcgKHJlZmxlY3Rpb24uRmllbGQubmFtZSk6CisgICsweDFGMDQgfCAwNCAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgIHwgMHgwMDAwMDAwNCAoNCkgICAgICAgICAgICAgICAgICAgICB8IGxlbmd0aCBvZiBzdHJpbmcKKyAgKzB4MUYwOCB8IDY2IDZDIDY1IDc4ICAgICAgICAgICAgIHwgY2hhcls0XSAgICAgfCBmbGV4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nIGxpdGVyYWwKKyAgKzB4MUYwQyB8IDAwICAgICAgICAgICAgICAgICAgICAgIHwgY2hhciAgICAgICAgfCAweDAwICgwKSAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nIHRlcm1pbmF0b3IKKworcGFkZGluZzoKKyAgKzB4MUYwRCB8IDAwIDAwIDAwICAgICAgICAgICAgICAgIHwgdWludDhfdFszXSAgfCAuLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgcGFkZGluZworCit0YWJsZSAocmVmbGVjdGlvbi5GaWVsZCk6CisgICsweDFGMTAgfCBFQyBGMyBGRiBGRiAgICAgICAgICAgICB8IFNPZmZzZXQzMiAgIHwgMHhGRkZGRjNFQyAoLTMwOTIpIExvYzogKzB4MkIyNCAgICB8IG9mZnNldCB0byB2dGFibGUKKyAgKzB4MUYxNCB8IDAwIDAwIDAwICAgICAgICAgICAgICAgIHwgdWludDhfdFszXSAgfCAuLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgcGFkZGluZworICArMHgxRjE3IHwgMDEgICAgICAgICAgICAgICAgICAgICAgfCB1aW50OF90ICAgICB8IDB4MDEgKDEpICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB0YWJsZSBmaWVsZCBgb3B0aW9uYWxgIChCb29sKQorICArMHgxRjE4IHwgMUQgMDAgICAgICAgICAgICAgICAgICAgfCB1aW50MTZfdCAgICB8IDB4MDAxRCAoMjkpICAgICAgICAgICAgICAgICAgICAgICAgfCB0YWJsZSBmaWVsZCBgaWRgIChVU2hvcnQpCisgICsweDFGMUEgfCAzRSAwMCAgICAgICAgICAgICAgICAgICB8IHVpbnQxNl90ICAgIHwgMHgwMDNFICg2MikgICAgICAgICAgICAgICAgICAgICAgICB8IHRhYmxlIGZpZWxkIGBvZmZzZXRgIChVU2hvcnQpCisgICsweDFGMUMgfCA0OCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDA0OCAoNzIpIExvYzogKzB4MUY2NCAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgbmFtZWAgKHN0cmluZykKKyAgKzB4MUYyMCB8IDM0IDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMDM0ICg1MikgTG9jOiArMHgxRjU0ICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGB0eXBlYCAodGFibGUpCisgICsweDFGMjQgfCAwQyAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDAwQyAoMTIpIExvYzogKzB4MUYzMCAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgYXR0cmlidXRlc2AgKHZlY3RvcikKKyAgKzB4MUYyOCB8IDA0IDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMDA0ICg0KSBMb2M6ICsweDFGMkMgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBkb2N1bWVudGF0aW9uYCAodmVjdG9yKQorCit2ZWN0b3IgKHJlZmxlY3Rpb24uRmllbGQuZG9jdW1lbnRhdGlvbik6CisgICsweDFGMkMgfCAwMCAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgIHwgMHgwMDAwMDAwMCAoMCkgICAgICAgICAgICAgICAgICAgICB8IGxlbmd0aCBvZiB2ZWN0b3IgKCMgaXRlbXMpCisKK3ZlY3RvciAocmVmbGVjdGlvbi5GaWVsZC5hdHRyaWJ1dGVzKToKKyAgKzB4MUYzMCB8IDAxIDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgfCAweDAwMDAwMDAxICgxKSAgICAgICAgICAgICAgICAgICAgIHwgbGVuZ3RoIG9mIHZlY3RvciAoIyBpdGVtcykKKyAgKzB4MUYzNCB8IDA0IDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMDA0ICg0KSBMb2M6ICsweDFGMzggICAgICAgIHwgb2Zmc2V0IHRvIHRhYmxlWzBdCisKK3RhYmxlIChyZWZsZWN0aW9uLktleVZhbHVlKToKKyAgKzB4MUYzOCB8IEQ0IEU5IEZGIEZGICAgICAgICAgICAgIHwgU09mZnNldDMyICAgfCAweEZGRkZFOUQ0ICgtNTY3NikgTG9jOiArMHgzNTY0ICAgIHwgb2Zmc2V0IHRvIHZ0YWJsZQorICArMHgxRjNDIHwgMTAgMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDAwMTAgKDE2KSBMb2M6ICsweDFGNEMgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYGtleWAgKHN0cmluZykKKyAgKzB4MUY0MCB8IDA0IDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMDA0ICg0KSBMb2M6ICsweDFGNDQgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGB2YWx1ZWAgKHN0cmluZykKKworc3RyaW5nIChyZWZsZWN0aW9uLktleVZhbHVlLnZhbHVlKToKKyAgKzB4MUY0NCB8IDAyIDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgfCAweDAwMDAwMDAyICgyKSAgICAgICAgICAgICAgICAgICAgIHwgbGVuZ3RoIG9mIHN0cmluZworICArMHgxRjQ4IHwgMzIgMzkgICAgICAgICAgICAgICAgICAgfCBjaGFyWzJdICAgICB8IDI5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJpbmcgbGl0ZXJhbAorICArMHgxRjRBIHwgMDAgICAgICAgICAgICAgICAgICAgICAgfCBjaGFyICAgICAgICB8IDB4MDAgKDApICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJpbmcgdGVybWluYXRvcgorCitzdHJpbmcgKHJlZmxlY3Rpb24uS2V5VmFsdWUua2V5KToKKyAgKzB4MUY0QyB8IDAyIDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgfCAweDAwMDAwMDAyICgyKSAgICAgICAgICAgICAgICAgICAgIHwgbGVuZ3RoIG9mIHN0cmluZworICArMHgxRjUwIHwgNjkgNjQgICAgICAgICAgICAgICAgICAgfCBjaGFyWzJdICAgICB8IGlkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJpbmcgbGl0ZXJhbAorICArMHgxRjUyIHwgMDAgICAgICAgICAgICAgICAgICAgICAgfCBjaGFyICAgICAgICB8IDB4MDAgKDApICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJpbmcgdGVybWluYXRvcgorCit0YWJsZSAocmVmbGVjdGlvbi5UeXBlKToKKyAgKzB4MUY1NCB8IEE0IEY1IEZGIEZGICAgICAgICAgICAgIHwgU09mZnNldDMyICAgfCAweEZGRkZGNUE0ICgtMjY1MikgTG9jOiArMHgyOUIwICAgIHwgb2Zmc2V0IHRvIHZ0YWJsZQorICArMHgxRjU4IHwgMDAgMDAgICAgICAgICAgICAgICAgICAgfCB1aW50OF90WzJdICB8IC4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBwYWRkaW5nCisgICsweDFGNUEgfCAwRSAgICAgICAgICAgICAgICAgICAgICB8IHVpbnQ4X3QgICAgIHwgMHgwRSAoMTQpICAgICAgICAgICAgICAgICAgICAgICAgICB8IHRhYmxlIGZpZWxkIGBiYXNlX3R5cGVgIChCeXRlKQorICArMHgxRjVCIHwgMEYgICAgICAgICAgICAgICAgICAgICAgfCB1aW50OF90ICAgICB8IDB4MEYgKDE1KSAgICAgICAgICAgICAgICAgICAgICAgICAgfCB0YWJsZSBmaWVsZCBgZWxlbWVudGAgKEJ5dGUpCisgICsweDFGNUMgfCAwMCAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgIHwgMHgwMDAwMDAwMCAoMCkgICAgICAgICAgICAgICAgICAgICB8IHRhYmxlIGZpZWxkIGBpbmRleGAgKEludCkKKyAgKzB4MUY2MCB8IDA0IDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgfCAweDAwMDAwMDA0ICg0KSAgICAgICAgICAgICAgICAgICAgIHwgdGFibGUgZmllbGQgYGVsZW1lbnRfc2l6ZWAgKFVJbnQpCisKK3N0cmluZyAocmVmbGVjdGlvbi5GaWVsZC5uYW1lKToKKyAgKzB4MUY2NCB8IDE3IDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgfCAweDAwMDAwMDE3ICgyMykgICAgICAgICAgICAgICAgICAgIHwgbGVuZ3RoIG9mIHN0cmluZworICArMHgxRjY4IHwgNzQgNjUgNzMgNzQgNjEgNzIgNzIgNjEgfCBjaGFyWzIzXSAgICB8IHRlc3RhcnJhICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJpbmcgbGl0ZXJhbAorICArMHgxRjcwIHwgNzkgNkYgNjYgNzMgNkYgNzIgNzQgNjUgfCAgICAgICAgICAgICB8IHlvZnNvcnRlCisgICsweDFGNzggfCA2NCA3MyA3NCA3MiA3NSA2MyA3NCAgICB8ICAgICAgICAgICAgIHwgZHN0cnVjdAorICArMHgxRjdGIHwgMDAgICAgICAgICAgICAgICAgICAgICAgfCBjaGFyICAgICAgICB8IDB4MDAgKDApICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJpbmcgdGVybWluYXRvcgorCit0YWJsZSAocmVmbGVjdGlvbi5GaWVsZCk6CisgICsweDFGODAgfCA1QyBGNCBGRiBGRiAgICAgICAgICAgICB8IFNPZmZzZXQzMiAgIHwgMHhGRkZGRjQ1QyAoLTI5ODApIExvYzogKzB4MkIyNCAgICB8IG9mZnNldCB0byB2dGFibGUKKyAgKzB4MUY4NCB8IDAwIDAwIDAwICAgICAgICAgICAgICAgIHwgdWludDhfdFszXSAgfCAuLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgcGFkZGluZworICArMHgxRjg3IHwgMDEgICAgICAgICAgICAgICAgICAgICAgfCB1aW50OF90ICAgICB8IDB4MDEgKDEpICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB0YWJsZSBmaWVsZCBgb3B0aW9uYWxgIChCb29sKQorICArMHgxRjg4IHwgMUMgMDAgICAgICAgICAgICAgICAgICAgfCB1aW50MTZfdCAgICB8IDB4MDAxQyAoMjgpICAgICAgICAgICAgICAgICAgICAgICAgfCB0YWJsZSBmaWVsZCBgaWRgIChVU2hvcnQpCisgICsweDFGOEEgfCAzQyAwMCAgICAgICAgICAgICAgICAgICB8IHVpbnQxNl90ICAgIHwgMHgwMDNDICg2MCkgICAgICAgICAgICAgICAgICAgICAgICB8IHRhYmxlIGZpZWxkIGBvZmZzZXRgIChVU2hvcnQpCisgICsweDFGOEMgfCA0NCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDA0NCAoNjgpIExvYzogKzB4MUZEMCAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgbmFtZWAgKHN0cmluZykKKyAgKzB4MUY5MCB8IDM0IDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMDM0ICg1MikgTG9jOiArMHgxRkM0ICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGB0eXBlYCAodGFibGUpCisgICsweDFGOTQgfCAwQyAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDAwQyAoMTIpIExvYzogKzB4MUZBMCAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgYXR0cmlidXRlc2AgKHZlY3RvcikKKyAgKzB4MUY5OCB8IDA0IDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMDA0ICg0KSBMb2M6ICsweDFGOUMgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBkb2N1bWVudGF0aW9uYCAodmVjdG9yKQorCit2ZWN0b3IgKHJlZmxlY3Rpb24uRmllbGQuZG9jdW1lbnRhdGlvbik6CisgICsweDFGOUMgfCAwMCAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgIHwgMHgwMDAwMDAwMCAoMCkgICAgICAgICAgICAgICAgICAgICB8IGxlbmd0aCBvZiB2ZWN0b3IgKCMgaXRlbXMpCisKK3ZlY3RvciAocmVmbGVjdGlvbi5GaWVsZC5hdHRyaWJ1dGVzKToKKyAgKzB4MUZBMCB8IDAxIDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgfCAweDAwMDAwMDAxICgxKSAgICAgICAgICAgICAgICAgICAgIHwgbGVuZ3RoIG9mIHZlY3RvciAoIyBpdGVtcykKKyAgKzB4MUZBNCB8IDA0IDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMDA0ICg0KSBMb2M6ICsweDFGQTggICAgICAgIHwgb2Zmc2V0IHRvIHRhYmxlWzBdCisKK3RhYmxlIChyZWZsZWN0aW9uLktleVZhbHVlKToKKyAgKzB4MUZBOCB8IDQ0IEVBIEZGIEZGICAgICAgICAgICAgIHwgU09mZnNldDMyICAgfCAweEZGRkZFQTQ0ICgtNTU2NCkgTG9jOiArMHgzNTY0ICAgIHwgb2Zmc2V0IHRvIHZ0YWJsZQorICArMHgxRkFDIHwgMTAgMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDAwMTAgKDE2KSBMb2M6ICsweDFGQkMgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYGtleWAgKHN0cmluZykKKyAgKzB4MUZCMCB8IDA0IDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMDA0ICg0KSBMb2M6ICsweDFGQjQgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGB2YWx1ZWAgKHN0cmluZykKKworc3RyaW5nIChyZWZsZWN0aW9uLktleVZhbHVlLnZhbHVlKToKKyAgKzB4MUZCNCB8IDAyIDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgfCAweDAwMDAwMDAyICgyKSAgICAgICAgICAgICAgICAgICAgIHwgbGVuZ3RoIG9mIHN0cmluZworICArMHgxRkI4IHwgMzIgMzggICAgICAgICAgICAgICAgICAgfCBjaGFyWzJdICAgICB8IDI4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJpbmcgbGl0ZXJhbAorICArMHgxRkJBIHwgMDAgICAgICAgICAgICAgICAgICAgICAgfCBjaGFyICAgICAgICB8IDB4MDAgKDApICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJpbmcgdGVybWluYXRvcgorCitzdHJpbmcgKHJlZmxlY3Rpb24uS2V5VmFsdWUua2V5KToKKyAgKzB4MUZCQyB8IDAyIDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgfCAweDAwMDAwMDAyICgyKSAgICAgICAgICAgICAgICAgICAgIHwgbGVuZ3RoIG9mIHN0cmluZworICArMHgxRkMwIHwgNjkgNjQgICAgICAgICAgICAgICAgICAgfCBjaGFyWzJdICAgICB8IGlkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJpbmcgbGl0ZXJhbAorICArMHgxRkMyIHwgMDAgICAgICAgICAgICAgICAgICAgICAgfCBjaGFyICAgICAgICB8IDB4MDAgKDApICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJpbmcgdGVybWluYXRvcgorCit0YWJsZSAocmVmbGVjdGlvbi5UeXBlKToKKyAgKzB4MUZDNCB8IDQwIEY0IEZGIEZGICAgICAgICAgICAgIHwgU09mZnNldDMyICAgfCAweEZGRkZGNDQwICgtMzAwOCkgTG9jOiArMHgyQjg0ICAgIHwgb2Zmc2V0IHRvIHZ0YWJsZQorICArMHgxRkM4IHwgMDAgMDAgICAgICAgICAgICAgICAgICAgfCB1aW50OF90WzJdICB8IC4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBwYWRkaW5nCisgICsweDFGQ0EgfCAwRSAgICAgICAgICAgICAgICAgICAgICB8IHVpbnQ4X3QgICAgIHwgMHgwRSAoMTQpICAgICAgICAgICAgICAgICAgICAgICAgICB8IHRhYmxlIGZpZWxkIGBiYXNlX3R5cGVgIChCeXRlKQorICArMHgxRkNCIHwgMEQgICAgICAgICAgICAgICAgICAgICAgfCB1aW50OF90ICAgICB8IDB4MEQgKDEzKSAgICAgICAgICAgICAgICAgICAgICAgICAgfCB0YWJsZSBmaWVsZCBgZWxlbWVudGAgKEJ5dGUpCisgICsweDFGQ0MgfCAwNCAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgIHwgMHgwMDAwMDAwNCAoNCkgICAgICAgICAgICAgICAgICAgICB8IHRhYmxlIGZpZWxkIGBlbGVtZW50X3NpemVgIChVSW50KQorCitzdHJpbmcgKHJlZmxlY3Rpb24uRmllbGQubmFtZSk6CisgICsweDFGRDAgfCAxMiAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgIHwgMHgwMDAwMDAxMiAoMTgpICAgICAgICAgICAgICAgICAgICB8IGxlbmd0aCBvZiBzdHJpbmcKKyAgKzB4MUZENCB8IDc0IDY1IDczIDc0IDYxIDcyIDcyIDYxIHwgY2hhclsxOF0gICAgfCB0ZXN0YXJyYSAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nIGxpdGVyYWwKKyAgKzB4MUZEQyB8IDc5IDZGIDY2IDczIDc0IDcyIDY5IDZFIHwgICAgICAgICAgICAgfCB5b2ZzdHJpbgorICArMHgxRkU0IHwgNjcgMzIgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICB8IGcyCisgICsweDFGRTYgfCAwMCAgICAgICAgICAgICAgICAgICAgICB8IGNoYXIgICAgICAgIHwgMHgwMCAoMCkgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHN0cmluZyB0ZXJtaW5hdG9yCisKK3RhYmxlIChyZWZsZWN0aW9uLkZpZWxkKToKKyAgKzB4MUZFOCB8IEFFIEY1IEZGIEZGICAgICAgICAgICAgIHwgU09mZnNldDMyICAgfCAweEZGRkZGNUFFICgtMjY0MikgTG9jOiArMHgyQTNBICAgIHwgb2Zmc2V0IHRvIHZ0YWJsZQorICArMHgxRkVDIHwgMUIgMDAgICAgICAgICAgICAgICAgICAgfCB1aW50MTZfdCAgICB8IDB4MDAxQiAoMjcpICAgICAgICAgICAgICAgICAgICAgICAgfCB0YWJsZSBmaWVsZCBgaWRgIChVU2hvcnQpCisgICsweDFGRUUgfCAzQSAwMCAgICAgICAgICAgICAgICAgICB8IHVpbnQxNl90ICAgIHwgMHgwMDNBICg1OCkgICAgICAgICAgICAgICAgICAgICAgICB8IHRhYmxlIGZpZWxkIGBvZmZzZXRgIChVU2hvcnQpCisgICsweDFGRjAgfCA0NCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDA0NCAoNjgpIExvYzogKzB4MjAzNCAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgbmFtZWAgKHN0cmluZykKKyAgKzB4MUZGNCB8IDM0IDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMDM0ICg1MikgTG9jOiArMHgyMDI4ICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGB0eXBlYCAodGFibGUpCisgICsweDFGRjggfCAwQyAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDAwQyAoMTIpIExvYzogKzB4MjAwNCAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgYXR0cmlidXRlc2AgKHZlY3RvcikKKyAgKzB4MUZGQyB8IDA0IDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMDA0ICg0KSBMb2M6ICsweDIwMDAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBkb2N1bWVudGF0aW9uYCAodmVjdG9yKQorCit2ZWN0b3IgKHJlZmxlY3Rpb24uRmllbGQuZG9jdW1lbnRhdGlvbik6CisgICsweDIwMDAgfCAwMCAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgIHwgMHgwMDAwMDAwMCAoMCkgICAgICAgICAgICAgICAgICAgICB8IGxlbmd0aCBvZiB2ZWN0b3IgKCMgaXRlbXMpCisKK3ZlY3RvciAocmVmbGVjdGlvbi5GaWVsZC5hdHRyaWJ1dGVzKToKKyAgKzB4MjAwNCB8IDAxIDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgfCAweDAwMDAwMDAxICgxKSAgICAgICAgICAgICAgICAgICAgIHwgbGVuZ3RoIG9mIHZlY3RvciAoIyBpdGVtcykKKyAgKzB4MjAwOCB8IDA0IDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMDA0ICg0KSBMb2M6ICsweDIwMEMgICAgICAgIHwgb2Zmc2V0IHRvIHRhYmxlWzBdCisKK3RhYmxlIChyZWZsZWN0aW9uLktleVZhbHVlKToKKyAgKzB4MjAwQyB8IEE4IEVBIEZGIEZGICAgICAgICAgICAgIHwgU09mZnNldDMyICAgfCAweEZGRkZFQUE4ICgtNTQ2NCkgTG9jOiArMHgzNTY0ICAgIHwgb2Zmc2V0IHRvIHZ0YWJsZQorICArMHgyMDEwIHwgMTAgMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDAwMTAgKDE2KSBMb2M6ICsweDIwMjAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYGtleWAgKHN0cmluZykKKyAgKzB4MjAxNCB8IDA0IDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMDA0ICg0KSBMb2M6ICsweDIwMTggICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGB2YWx1ZWAgKHN0cmluZykKKworc3RyaW5nIChyZWZsZWN0aW9uLktleVZhbHVlLnZhbHVlKToKKyAgKzB4MjAxOCB8IDAyIDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgfCAweDAwMDAwMDAyICgyKSAgICAgICAgICAgICAgICAgICAgIHwgbGVuZ3RoIG9mIHN0cmluZworICArMHgyMDFDIHwgMzIgMzcgICAgICAgICAgICAgICAgICAgfCBjaGFyWzJdICAgICB8IDI3ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJpbmcgbGl0ZXJhbAorICArMHgyMDFFIHwgMDAgICAgICAgICAgICAgICAgICAgICAgfCBjaGFyICAgICAgICB8IDB4MDAgKDApICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJpbmcgdGVybWluYXRvcgorCitzdHJpbmcgKHJlZmxlY3Rpb24uS2V5VmFsdWUua2V5KToKKyAgKzB4MjAyMCB8IDAyIDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgfCAweDAwMDAwMDAyICgyKSAgICAgICAgICAgICAgICAgICAgIHwgbGVuZ3RoIG9mIHN0cmluZworICArMHgyMDI0IHwgNjkgNjQgICAgICAgICAgICAgICAgICAgfCBjaGFyWzJdICAgICB8IGlkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJpbmcgbGl0ZXJhbAorICArMHgyMDI2IHwgMDAgICAgICAgICAgICAgICAgICAgICAgfCBjaGFyICAgICAgICB8IDB4MDAgKDApICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJpbmcgdGVybWluYXRvcgorCit0YWJsZSAocmVmbGVjdGlvbi5UeXBlKToKKyAgKzB4MjAyOCB8IDhDIEU2IEZGIEZGICAgICAgICAgICAgIHwgU09mZnNldDMyICAgfCAweEZGRkZFNjhDICgtNjUxNikgTG9jOiArMHgzOTlDICAgIHwgb2Zmc2V0IHRvIHZ0YWJsZQorICArMHgyMDJDIHwgMDAgMDAgMDAgICAgICAgICAgICAgICAgfCB1aW50OF90WzNdICB8IC4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBwYWRkaW5nCisgICsweDIwMkYgfCAwQiAgICAgICAgICAgICAgICAgICAgICB8IHVpbnQ4X3QgICAgIHwgMHgwQiAoMTEpICAgICAgICAgICAgICAgICAgICAgICAgICB8IHRhYmxlIGZpZWxkIGBiYXNlX3R5cGVgIChCeXRlKQorICArMHgyMDMwIHwgMDEgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICB8IDB4MDAwMDAwMDEgKDEpICAgICAgICAgICAgICAgICAgICAgfCB0YWJsZSBmaWVsZCBgZWxlbWVudF9zaXplYCAoVUludCkKKworc3RyaW5nIChyZWZsZWN0aW9uLkZpZWxkLm5hbWUpOgorICArMHgyMDM0IHwgMDYgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICB8IDB4MDAwMDAwMDYgKDYpICAgICAgICAgICAgICAgICAgICAgfCBsZW5ndGggb2Ygc3RyaW5nCisgICsweDIwMzggfCA3NCA2NSA3MyA3NCA2NiAzMyAgICAgICB8IGNoYXJbNl0gICAgIHwgdGVzdGYzICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHN0cmluZyBsaXRlcmFsCisgICsweDIwM0UgfCAwMCAgICAgICAgICAgICAgICAgICAgICB8IGNoYXIgICAgICAgIHwgMHgwMCAoMCkgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHN0cmluZyB0ZXJtaW5hdG9yCisKK3RhYmxlIChyZWZsZWN0aW9uLkZpZWxkKToKKyAgKzB4MjA0MCB8IDlBIEZGIEZGIEZGICAgICAgICAgICAgIHwgU09mZnNldDMyICAgfCAweEZGRkZGRjlBICgtMTAyKSBMb2M6ICsweDIwQTYgICAgIHwgb2Zmc2V0IHRvIHZ0YWJsZQorICArMHgyMDQ0IHwgMUEgMDAgICAgICAgICAgICAgICAgICAgfCB1aW50MTZfdCAgICB8IDB4MDAxQSAoMjYpICAgICAgICAgICAgICAgICAgICAgICAgfCB0YWJsZSBmaWVsZCBgaWRgIChVU2hvcnQpCisgICsweDIwNDYgfCAzOCAwMCAgICAgICAgICAgICAgICAgICB8IHVpbnQxNl90ICAgIHwgMHgwMDM4ICg1NikgICAgICAgICAgICAgICAgICAgICAgICB8IHRhYmxlIGZpZWxkIGBvZmZzZXRgIChVU2hvcnQpCisgICsweDIwNDggfCA1MCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDA1MCAoODApIExvYzogKzB4MjA5OCAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgbmFtZWAgKHN0cmluZykKKyAgKzB4MjA0QyB8IDQwIDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMDQwICg2NCkgTG9jOiArMHgyMDhDICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGB0eXBlYCAodGFibGUpCisgICsweDIwNTAgfCAxOCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDAxOCAoMjQpIExvYzogKzB4MjA2OCAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgYXR0cmlidXRlc2AgKHZlY3RvcikKKyAgKzB4MjA1NCB8IDEwIDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMDEwICgxNikgTG9jOiArMHgyMDY0ICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBkb2N1bWVudGF0aW9uYCAodmVjdG9yKQorICArMHgyMDU4IHwgMDAgMDAgMDAgMDAgMDAgMDAgMDggNDAgfCBkb3VibGUgICAgICB8IDB4NDAwODAwMDAwMDAwMDAwMCAoMykgICAgICAgICAgICAgfCB0YWJsZSBmaWVsZCBgZGVmYXVsdF9yZWFsYCAoRG91YmxlKQorICArMHgyMDYwIHwgMDAgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50OF90WzRdICB8IC4uLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBwYWRkaW5nCisKK3ZlY3RvciAocmVmbGVjdGlvbi5GaWVsZC5kb2N1bWVudGF0aW9uKToKKyAgKzB4MjA2NCB8IDAwIDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgfCAweDAwMDAwMDAwICgwKSAgICAgICAgICAgICAgICAgICAgIHwgbGVuZ3RoIG9mIHZlY3RvciAoIyBpdGVtcykKKwordmVjdG9yIChyZWZsZWN0aW9uLkZpZWxkLmF0dHJpYnV0ZXMpOgorICArMHgyMDY4IHwgMDEgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICB8IDB4MDAwMDAwMDEgKDEpICAgICAgICAgICAgICAgICAgICAgfCBsZW5ndGggb2YgdmVjdG9yICgjIGl0ZW1zKQorICArMHgyMDZDIHwgMDQgMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDAwMDQgKDQpIExvYzogKzB4MjA3MCAgICAgICAgfCBvZmZzZXQgdG8gdGFibGVbMF0KKwordGFibGUgKHJlZmxlY3Rpb24uS2V5VmFsdWUpOgorICArMHgyMDcwIHwgMEMgRUIgRkYgRkYgICAgICAgICAgICAgfCBTT2Zmc2V0MzIgICB8IDB4RkZGRkVCMEMgKC01MzY0KSBMb2M6ICsweDM1NjQgICAgfCBvZmZzZXQgdG8gdnRhYmxlCisgICsweDIwNzQgfCAxMCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDAxMCAoMTYpIExvYzogKzB4MjA4NCAgICAgICB8IG9mZnNldCB0byBmaWVsZCBga2V5YCAoc3RyaW5nKQorICArMHgyMDc4IHwgMDQgMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDAwMDQgKDQpIExvYzogKzB4MjA3QyAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYHZhbHVlYCAoc3RyaW5nKQorCitzdHJpbmcgKHJlZmxlY3Rpb24uS2V5VmFsdWUudmFsdWUpOgorICArMHgyMDdDIHwgMDIgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICB8IDB4MDAwMDAwMDIgKDIpICAgICAgICAgICAgICAgICAgICAgfCBsZW5ndGggb2Ygc3RyaW5nCisgICsweDIwODAgfCAzMiAzNiAgICAgICAgICAgICAgICAgICB8IGNoYXJbMl0gICAgIHwgMjYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHN0cmluZyBsaXRlcmFsCisgICsweDIwODIgfCAwMCAgICAgICAgICAgICAgICAgICAgICB8IGNoYXIgICAgICAgIHwgMHgwMCAoMCkgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHN0cmluZyB0ZXJtaW5hdG9yCisKK3N0cmluZyAocmVmbGVjdGlvbi5LZXlWYWx1ZS5rZXkpOgorICArMHgyMDg0IHwgMDIgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICB8IDB4MDAwMDAwMDIgKDIpICAgICAgICAgICAgICAgICAgICAgfCBsZW5ndGggb2Ygc3RyaW5nCisgICsweDIwODggfCA2OSA2NCAgICAgICAgICAgICAgICAgICB8IGNoYXJbMl0gICAgIHwgaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHN0cmluZyBsaXRlcmFsCisgICsweDIwOEEgfCAwMCAgICAgICAgICAgICAgICAgICAgICB8IGNoYXIgICAgICAgIHwgMHgwMCAoMCkgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHN0cmluZyB0ZXJtaW5hdG9yCisKK3RhYmxlIChyZWZsZWN0aW9uLlR5cGUpOgorICArMHgyMDhDIHwgRjAgRTYgRkYgRkYgICAgICAgICAgICAgfCBTT2Zmc2V0MzIgICB8IDB4RkZGRkU2RjAgKC02NDE2KSBMb2M6ICsweDM5OUMgICAgfCBvZmZzZXQgdG8gdnRhYmxlCisgICsweDIwOTAgfCAwMCAwMCAwMCAgICAgICAgICAgICAgICB8IHVpbnQ4X3RbM10gIHwgLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHBhZGRpbmcKKyAgKzB4MjA5MyB8IDBCICAgICAgICAgICAgICAgICAgICAgIHwgdWludDhfdCAgICAgfCAweDBCICgxMSkgICAgICAgICAgICAgICAgICAgICAgICAgIHwgdGFibGUgZmllbGQgYGJhc2VfdHlwZWAgKEJ5dGUpCisgICsweDIwOTQgfCAwMSAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgIHwgMHgwMDAwMDAwMSAoMSkgICAgICAgICAgICAgICAgICAgICB8IHRhYmxlIGZpZWxkIGBlbGVtZW50X3NpemVgIChVSW50KQorCitzdHJpbmcgKHJlZmxlY3Rpb24uRmllbGQubmFtZSk6CisgICsweDIwOTggfCAwNiAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgIHwgMHgwMDAwMDAwNiAoNikgICAgICAgICAgICAgICAgICAgICB8IGxlbmd0aCBvZiBzdHJpbmcKKyAgKzB4MjA5QyB8IDc0IDY1IDczIDc0IDY2IDMyICAgICAgIHwgY2hhcls2XSAgICAgfCB0ZXN0ZjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nIGxpdGVyYWwKKyAgKzB4MjBBMiB8IDAwICAgICAgICAgICAgICAgICAgICAgIHwgY2hhciAgICAgICAgfCAweDAwICgwKSAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nIHRlcm1pbmF0b3IKKworcGFkZGluZzoKKyAgKzB4MjBBMyB8IDAwIDAwIDAwICAgICAgICAgICAgICAgIHwgdWludDhfdFszXSAgfCAuLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgcGFkZGluZworCit2dGFibGUgKHJlZmxlY3Rpb24uRmllbGQpOgorICArMHgyMEE2IHwgMUEgMDAgICAgICAgICAgICAgICAgICAgfCB1aW50MTZfdCAgICB8IDB4MDAxQSAoMjYpICAgICAgICAgICAgICAgICAgICAgICAgfCBzaXplIG9mIHRoaXMgdnRhYmxlCisgICsweDIwQTggfCAyNCAwMCAgICAgICAgICAgICAgICAgICB8IHVpbnQxNl90ICAgIHwgMHgwMDI0ICgzNikgICAgICAgICAgICAgICAgICAgICAgICB8IHNpemUgb2YgcmVmZXJyaW5nIHRhYmxlCisgICsweDIwQUEgfCAwOCAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgIHwgMHgwMDA4ICg4KSAgICAgICAgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgbmFtZWAgKGlkOiAwKQorICArMHgyMEFDIHwgMEMgMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgICB8IDB4MDAwQyAoMTIpICAgICAgICAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYHR5cGVgIChpZDogMSkKKyAgKzB4MjBBRSB8IDA0IDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgfCAweDAwMDQgKDQpICAgICAgICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBpZGAgKGlkOiAyKQorICArMHgyMEIwIHwgMDYgMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgICB8IDB4MDAwNiAoNikgICAgICAgICAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYG9mZnNldGAgKGlkOiAzKQorICArMHgyMEIyIHwgMDAgMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgICB8IDB4MDAwMCAoMCkgICAgICAgICAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYGRlZmF1bHRfaW50ZWdlcmAgKGlkOiA0KSA8ZGVmYXVsdHMgdG8gMD4gKExvbmcpCisgICsweDIwQjQgfCAxOCAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgIHwgMHgwMDE4ICgyNCkgICAgICAgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgZGVmYXVsdF9yZWFsYCAoaWQ6IDUpCisgICsweDIwQjYgfCAwMCAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgIHwgMHgwMDAwICgwKSAgICAgICAgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgZGVwcmVjYXRlZGAgKGlkOiA2KSA8ZGVmYXVsdHMgdG8gMD4gKEJvb2wpCisgICsweDIwQjggfCAwMCAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgIHwgMHgwMDAwICgwKSAgICAgICAgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgcmVxdWlyZWRgIChpZDogNykgPGRlZmF1bHRzIHRvIDA+IChCb29sKQorICArMHgyMEJBIHwgMDAgMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgICB8IDB4MDAwMCAoMCkgICAgICAgICAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYGtleWAgKGlkOiA4KSA8ZGVmYXVsdHMgdG8gMD4gKEJvb2wpCisgICsweDIwQkMgfCAxMCAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgIHwgMHgwMDEwICgxNikgICAgICAgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgYXR0cmlidXRlc2AgKGlkOiA5KQorICArMHgyMEJFIHwgMTQgMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgICB8IDB4MDAxNCAoMjApICAgICAgICAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYGRvY3VtZW50YXRpb25gIChpZDogMTApCisKK3RhYmxlIChyZWZsZWN0aW9uLkZpZWxkKToKKyAgKzB4MjBDMCB8IDFBIDAwIDAwIDAwICAgICAgICAgICAgIHwgU09mZnNldDMyICAgfCAweDAwMDAwMDFBICgyNikgTG9jOiArMHgyMEE2ICAgICAgIHwgb2Zmc2V0IHRvIHZ0YWJsZQorICArMHgyMEM0IHwgMTkgMDAgICAgICAgICAgICAgICAgICAgfCB1aW50MTZfdCAgICB8IDB4MDAxOSAoMjUpICAgICAgICAgICAgICAgICAgICAgICAgfCB0YWJsZSBmaWVsZCBgaWRgIChVU2hvcnQpCisgICsweDIwQzYgfCAzNiAwMCAgICAgICAgICAgICAgICAgICB8IHVpbnQxNl90ICAgIHwgMHgwMDM2ICg1NCkgICAgICAgICAgICAgICAgICAgICAgICB8IHRhYmxlIGZpZWxkIGBvZmZzZXRgIChVU2hvcnQpCisgICsweDIwQzggfCA1MCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDA1MCAoODApIExvYzogKzB4MjExOCAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgbmFtZWAgKHN0cmluZykKKyAgKzB4MjBDQyB8IDQwIDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMDQwICg2NCkgTG9jOiArMHgyMTBDICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGB0eXBlYCAodGFibGUpCisgICsweDIwRDAgfCAxOCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDAxOCAoMjQpIExvYzogKzB4MjBFOCAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgYXR0cmlidXRlc2AgKHZlY3RvcikKKyAgKzB4MjBENCB8IDEwIDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMDEwICgxNikgTG9jOiArMHgyMEU0ICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBkb2N1bWVudGF0aW9uYCAodmVjdG9yKQorICArMHgyMEQ4IHwgNkUgODYgMUIgRjAgRjkgMjEgMDkgNDAgfCBkb3VibGUgICAgICB8IDB4NDAwOTIxRjlGMDFCODY2RSAoMy4xNDE1OSkgICAgICAgfCB0YWJsZSBmaWVsZCBgZGVmYXVsdF9yZWFsYCAoRG91YmxlKQorICArMHgyMEUwIHwgMDAgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50OF90WzRdICB8IC4uLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBwYWRkaW5nCisKK3ZlY3RvciAocmVmbGVjdGlvbi5GaWVsZC5kb2N1bWVudGF0aW9uKToKKyAgKzB4MjBFNCB8IDAwIDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgfCAweDAwMDAwMDAwICgwKSAgICAgICAgICAgICAgICAgICAgIHwgbGVuZ3RoIG9mIHZlY3RvciAoIyBpdGVtcykKKwordmVjdG9yIChyZWZsZWN0aW9uLkZpZWxkLmF0dHJpYnV0ZXMpOgorICArMHgyMEU4IHwgMDEgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICB8IDB4MDAwMDAwMDEgKDEpICAgICAgICAgICAgICAgICAgICAgfCBsZW5ndGggb2YgdmVjdG9yICgjIGl0ZW1zKQorICArMHgyMEVDIHwgMDQgMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDAwMDQgKDQpIExvYzogKzB4MjBGMCAgICAgICAgfCBvZmZzZXQgdG8gdGFibGVbMF0KKwordGFibGUgKHJlZmxlY3Rpb24uS2V5VmFsdWUpOgorICArMHgyMEYwIHwgOEMgRUIgRkYgRkYgICAgICAgICAgICAgfCBTT2Zmc2V0MzIgICB8IDB4RkZGRkVCOEMgKC01MjM2KSBMb2M6ICsweDM1NjQgICAgfCBvZmZzZXQgdG8gdnRhYmxlCisgICsweDIwRjQgfCAxMCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDAxMCAoMTYpIExvYzogKzB4MjEwNCAgICAgICB8IG9mZnNldCB0byBmaWVsZCBga2V5YCAoc3RyaW5nKQorICArMHgyMEY4IHwgMDQgMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDAwMDQgKDQpIExvYzogKzB4MjBGQyAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYHZhbHVlYCAoc3RyaW5nKQorCitzdHJpbmcgKHJlZmxlY3Rpb24uS2V5VmFsdWUudmFsdWUpOgorICArMHgyMEZDIHwgMDIgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICB8IDB4MDAwMDAwMDIgKDIpICAgICAgICAgICAgICAgICAgICAgfCBsZW5ndGggb2Ygc3RyaW5nCisgICsweDIxMDAgfCAzMiAzNSAgICAgICAgICAgICAgICAgICB8IGNoYXJbMl0gICAgIHwgMjUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHN0cmluZyBsaXRlcmFsCisgICsweDIxMDIgfCAwMCAgICAgICAgICAgICAgICAgICAgICB8IGNoYXIgICAgICAgIHwgMHgwMCAoMCkgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHN0cmluZyB0ZXJtaW5hdG9yCisKK3N0cmluZyAocmVmbGVjdGlvbi5LZXlWYWx1ZS5rZXkpOgorICArMHgyMTA0IHwgMDIgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICB8IDB4MDAwMDAwMDIgKDIpICAgICAgICAgICAgICAgICAgICAgfCBsZW5ndGggb2Ygc3RyaW5nCisgICsweDIxMDggfCA2OSA2NCAgICAgICAgICAgICAgICAgICB8IGNoYXJbMl0gICAgIHwgaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHN0cmluZyBsaXRlcmFsCisgICsweDIxMEEgfCAwMCAgICAgICAgICAgICAgICAgICAgICB8IGNoYXIgICAgICAgIHwgMHgwMCAoMCkgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHN0cmluZyB0ZXJtaW5hdG9yCisKK3RhYmxlIChyZWZsZWN0aW9uLlR5cGUpOgorICArMHgyMTBDIHwgNzAgRTcgRkYgRkYgICAgICAgICAgICAgfCBTT2Zmc2V0MzIgICB8IDB4RkZGRkU3NzAgKC02Mjg4KSBMb2M6ICsweDM5OUMgICAgfCBvZmZzZXQgdG8gdnRhYmxlCisgICsweDIxMTAgfCAwMCAwMCAwMCAgICAgICAgICAgICAgICB8IHVpbnQ4X3RbM10gIHwgLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHBhZGRpbmcKKyAgKzB4MjExMyB8IDBCICAgICAgICAgICAgICAgICAgICAgIHwgdWludDhfdCAgICAgfCAweDBCICgxMSkgICAgICAgICAgICAgICAgICAgICAgICAgIHwgdGFibGUgZmllbGQgYGJhc2VfdHlwZWAgKEJ5dGUpCisgICsweDIxMTQgfCAwMSAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgIHwgMHgwMDAwMDAwMSAoMSkgICAgICAgICAgICAgICAgICAgICB8IHRhYmxlIGZpZWxkIGBlbGVtZW50X3NpemVgIChVSW50KQorCitzdHJpbmcgKHJlZmxlY3Rpb24uRmllbGQubmFtZSk6CisgICsweDIxMTggfCAwNSAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgIHwgMHgwMDAwMDAwNSAoNSkgICAgICAgICAgICAgICAgICAgICB8IGxlbmd0aCBvZiBzdHJpbmcKKyAgKzB4MjExQyB8IDc0IDY1IDczIDc0IDY2ICAgICAgICAgIHwgY2hhcls1XSAgICAgfCB0ZXN0ZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nIGxpdGVyYWwKKyAgKzB4MjEyMSB8IDAwICAgICAgICAgICAgICAgICAgICAgIHwgY2hhciAgICAgICAgfCAweDAwICgwKSAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nIHRlcm1pbmF0b3IKKworcGFkZGluZzoKKyAgKzB4MjEyMiB8IDAwIDAwICAgICAgICAgICAgICAgICAgIHwgdWludDhfdFsyXSAgfCAuLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgcGFkZGluZworCit0YWJsZSAocmVmbGVjdGlvbi5GaWVsZCk6CisgICsweDIxMjQgfCAwMCBGNiBGRiBGRiAgICAgICAgICAgICB8IFNPZmZzZXQzMiAgIHwgMHhGRkZGRjYwMCAoLTI1NjApIExvYzogKzB4MkIyNCAgICB8IG9mZnNldCB0byB2dGFibGUKKyAgKzB4MjEyOCB8IDAwIDAwIDAwICAgICAgICAgICAgICAgIHwgdWludDhfdFszXSAgfCAuLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgcGFkZGluZworICArMHgyMTJCIHwgMDEgICAgICAgICAgICAgICAgICAgICAgfCB1aW50OF90ICAgICB8IDB4MDEgKDEpICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB0YWJsZSBmaWVsZCBgb3B0aW9uYWxgIChCb29sKQorICArMHgyMTJDIHwgMTggMDAgICAgICAgICAgICAgICAgICAgfCB1aW50MTZfdCAgICB8IDB4MDAxOCAoMjQpICAgICAgICAgICAgICAgICAgICAgICAgfCB0YWJsZSBmaWVsZCBgaWRgIChVU2hvcnQpCisgICsweDIxMkUgfCAzNCAwMCAgICAgICAgICAgICAgICAgICB8IHVpbnQxNl90ICAgIHwgMHgwMDM0ICg1MikgICAgICAgICAgICAgICAgICAgICAgICB8IHRhYmxlIGZpZWxkIGBvZmZzZXRgIChVU2hvcnQpCisgICsweDIxMzAgfCA0NCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDA0NCAoNjgpIExvYzogKzB4MjE3NCAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgbmFtZWAgKHN0cmluZykKKyAgKzB4MjEzNCB8IDM0IDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMDM0ICg1MikgTG9jOiArMHgyMTY4ICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGB0eXBlYCAodGFibGUpCisgICsweDIxMzggfCAwQyAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDAwQyAoMTIpIExvYzogKzB4MjE0NCAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgYXR0cmlidXRlc2AgKHZlY3RvcikKKyAgKzB4MjEzQyB8IDA0IDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMDA0ICg0KSBMb2M6ICsweDIxNDAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBkb2N1bWVudGF0aW9uYCAodmVjdG9yKQorCit2ZWN0b3IgKHJlZmxlY3Rpb24uRmllbGQuZG9jdW1lbnRhdGlvbik6CisgICsweDIxNDAgfCAwMCAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgIHwgMHgwMDAwMDAwMCAoMCkgICAgICAgICAgICAgICAgICAgICB8IGxlbmd0aCBvZiB2ZWN0b3IgKCMgaXRlbXMpCisKK3ZlY3RvciAocmVmbGVjdGlvbi5GaWVsZC5hdHRyaWJ1dGVzKToKKyAgKzB4MjE0NCB8IDAxIDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgfCAweDAwMDAwMDAxICgxKSAgICAgICAgICAgICAgICAgICAgIHwgbGVuZ3RoIG9mIHZlY3RvciAoIyBpdGVtcykKKyAgKzB4MjE0OCB8IDA0IDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMDA0ICg0KSBMb2M6ICsweDIxNEMgICAgICAgIHwgb2Zmc2V0IHRvIHRhYmxlWzBdCisKK3RhYmxlIChyZWZsZWN0aW9uLktleVZhbHVlKToKKyAgKzB4MjE0QyB8IEU4IEVCIEZGIEZGICAgICAgICAgICAgIHwgU09mZnNldDMyICAgfCAweEZGRkZFQkU4ICgtNTE0NCkgTG9jOiArMHgzNTY0ICAgIHwgb2Zmc2V0IHRvIHZ0YWJsZQorICArMHgyMTUwIHwgMTAgMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDAwMTAgKDE2KSBMb2M6ICsweDIxNjAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYGtleWAgKHN0cmluZykKKyAgKzB4MjE1NCB8IDA0IDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMDA0ICg0KSBMb2M6ICsweDIxNTggICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGB2YWx1ZWAgKHN0cmluZykKKworc3RyaW5nIChyZWZsZWN0aW9uLktleVZhbHVlLnZhbHVlKToKKyAgKzB4MjE1OCB8IDAyIDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgfCAweDAwMDAwMDAyICgyKSAgICAgICAgICAgICAgICAgICAgIHwgbGVuZ3RoIG9mIHN0cmluZworICArMHgyMTVDIHwgMzIgMzQgICAgICAgICAgICAgICAgICAgfCBjaGFyWzJdICAgICB8IDI0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJpbmcgbGl0ZXJhbAorICArMHgyMTVFIHwgMDAgICAgICAgICAgICAgICAgICAgICAgfCBjaGFyICAgICAgICB8IDB4MDAgKDApICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJpbmcgdGVybWluYXRvcgorCitzdHJpbmcgKHJlZmxlY3Rpb24uS2V5VmFsdWUua2V5KToKKyAgKzB4MjE2MCB8IDAyIDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgfCAweDAwMDAwMDAyICgyKSAgICAgICAgICAgICAgICAgICAgIHwgbGVuZ3RoIG9mIHN0cmluZworICArMHgyMTY0IHwgNjkgNjQgICAgICAgICAgICAgICAgICAgfCBjaGFyWzJdICAgICB8IGlkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJpbmcgbGl0ZXJhbAorICArMHgyMTY2IHwgMDAgICAgICAgICAgICAgICAgICAgICAgfCBjaGFyICAgICAgICB8IDB4MDAgKDApICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJpbmcgdGVybWluYXRvcgorCit0YWJsZSAocmVmbGVjdGlvbi5UeXBlKToKKyAgKzB4MjE2OCB8IEU0IEY1IEZGIEZGICAgICAgICAgICAgIHwgU09mZnNldDMyICAgfCAweEZGRkZGNUU0ICgtMjU4OCkgTG9jOiArMHgyQjg0ICAgIHwgb2Zmc2V0IHRvIHZ0YWJsZQorICArMHgyMTZDIHwgMDAgMDAgICAgICAgICAgICAgICAgICAgfCB1aW50OF90WzJdICB8IC4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBwYWRkaW5nCisgICsweDIxNkUgfCAwRSAgICAgICAgICAgICAgICAgICAgICB8IHVpbnQ4X3QgICAgIHwgMHgwRSAoMTQpICAgICAgICAgICAgICAgICAgICAgICAgICB8IHRhYmxlIGZpZWxkIGBiYXNlX3R5cGVgIChCeXRlKQorICArMHgyMTZGIHwgMDIgICAgICAgICAgICAgICAgICAgICAgfCB1aW50OF90ICAgICB8IDB4MDIgKDIpICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB0YWJsZSBmaWVsZCBgZWxlbWVudGAgKEJ5dGUpCisgICsweDIxNzAgfCAwMSAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgIHwgMHgwMDAwMDAwMSAoMSkgICAgICAgICAgICAgICAgICAgICB8IHRhYmxlIGZpZWxkIGBlbGVtZW50X3NpemVgIChVSW50KQorCitzdHJpbmcgKHJlZmxlY3Rpb24uRmllbGQubmFtZSk6CisgICsweDIxNzQgfCAxMCAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgIHwgMHgwMDAwMDAxMCAoMTYpICAgICAgICAgICAgICAgICAgICB8IGxlbmd0aCBvZiBzdHJpbmcKKyAgKzB4MjE3OCB8IDc0IDY1IDczIDc0IDYxIDcyIDcyIDYxIHwgY2hhclsxNl0gICAgfCB0ZXN0YXJyYSAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nIGxpdGVyYWwKKyAgKzB4MjE4MCB8IDc5IDZGIDY2IDYyIDZGIDZGIDZDIDczIHwgICAgICAgICAgICAgfCB5b2Zib29scworICArMHgyMTg4IHwgMDAgICAgICAgICAgICAgICAgICAgICAgfCBjaGFyICAgICAgICB8IDB4MDAgKDApICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJpbmcgdGVybWluYXRvcgorCitwYWRkaW5nOgorICArMHgyMTg5IHwgMDAgMDAgMDAgICAgICAgICAgICAgICAgfCB1aW50OF90WzNdICB8IC4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBwYWRkaW5nCisKK3RhYmxlIChyZWZsZWN0aW9uLkZpZWxkKToKKyAgKzB4MjE4QyB8IDUyIEY3IEZGIEZGICAgICAgICAgICAgIHwgU09mZnNldDMyICAgfCAweEZGRkZGNzUyICgtMjIyMikgTG9jOiArMHgyQTNBICAgIHwgb2Zmc2V0IHRvIHZ0YWJsZQorICArMHgyMTkwIHwgMTcgMDAgICAgICAgICAgICAgICAgICAgfCB1aW50MTZfdCAgICB8IDB4MDAxNyAoMjMpICAgICAgICAgICAgICAgICAgICAgICAgfCB0YWJsZSBmaWVsZCBgaWRgIChVU2hvcnQpCisgICsweDIxOTIgfCAzMiAwMCAgICAgICAgICAgICAgICAgICB8IHVpbnQxNl90ICAgIHwgMHgwMDMyICg1MCkgICAgICAgICAgICAgICAgICAgICAgICB8IHRhYmxlIGZpZWxkIGBvZmZzZXRgIChVU2hvcnQpCisgICsweDIxOTQgfCA3NCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDA3NCAoMTE2KSBMb2M6ICsweDIyMDggICAgICB8IG9mZnNldCB0byBmaWVsZCBgbmFtZWAgKHN0cmluZykKKyAgKzB4MjE5OCB8IDYwIDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMDYwICg5NikgTG9jOiArMHgyMUY4ICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGB0eXBlYCAodGFibGUpCisgICsweDIxOUMgfCAwQyAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDAwQyAoMTIpIExvYzogKzB4MjFBOCAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgYXR0cmlidXRlc2AgKHZlY3RvcikKKyAgKzB4MjFBMCB8IDA0IDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMDA0ICg0KSBMb2M6ICsweDIxQTQgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBkb2N1bWVudGF0aW9uYCAodmVjdG9yKQorCit2ZWN0b3IgKHJlZmxlY3Rpb24uRmllbGQuZG9jdW1lbnRhdGlvbik6CisgICsweDIxQTQgfCAwMCAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgIHwgMHgwMDAwMDAwMCAoMCkgICAgICAgICAgICAgICAgICAgICB8IGxlbmd0aCBvZiB2ZWN0b3IgKCMgaXRlbXMpCisKK3ZlY3RvciAocmVmbGVjdGlvbi5GaWVsZC5hdHRyaWJ1dGVzKToKKyAgKzB4MjFBOCB8IDAyIDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgfCAweDAwMDAwMDAyICgyKSAgICAgICAgICAgICAgICAgICAgIHwgbGVuZ3RoIG9mIHZlY3RvciAoIyBpdGVtcykKKyAgKzB4MjFBQyB8IDI0IDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMDI0ICgzNikgTG9jOiArMHgyMUQwICAgICAgIHwgb2Zmc2V0IHRvIHRhYmxlWzBdCisgICsweDIxQjAgfCAwNCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDAwNCAoNCkgTG9jOiArMHgyMUI0ICAgICAgICB8IG9mZnNldCB0byB0YWJsZVsxXQorCit0YWJsZSAocmVmbGVjdGlvbi5LZXlWYWx1ZSk6CisgICsweDIxQjQgfCA1MCBFQyBGRiBGRiAgICAgICAgICAgICB8IFNPZmZzZXQzMiAgIHwgMHhGRkZGRUM1MCAoLTUwNDApIExvYzogKzB4MzU2NCAgICB8IG9mZnNldCB0byB2dGFibGUKKyAgKzB4MjFCOCB8IDEwIDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMDEwICgxNikgTG9jOiArMHgyMUM4ICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBrZXlgIChzdHJpbmcpCisgICsweDIxQkMgfCAwNCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDAwNCAoNCkgTG9jOiArMHgyMUMwICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgdmFsdWVgIChzdHJpbmcpCisKK3N0cmluZyAocmVmbGVjdGlvbi5LZXlWYWx1ZS52YWx1ZSk6CisgICsweDIxQzAgfCAwMiAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgIHwgMHgwMDAwMDAwMiAoMikgICAgICAgICAgICAgICAgICAgICB8IGxlbmd0aCBvZiBzdHJpbmcKKyAgKzB4MjFDNCB8IDMyIDMzICAgICAgICAgICAgICAgICAgIHwgY2hhclsyXSAgICAgfCAyMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nIGxpdGVyYWwKKyAgKzB4MjFDNiB8IDAwICAgICAgICAgICAgICAgICAgICAgIHwgY2hhciAgICAgICAgfCAweDAwICgwKSAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nIHRlcm1pbmF0b3IKKworc3RyaW5nIChyZWZsZWN0aW9uLktleVZhbHVlLmtleSk6CisgICsweDIxQzggfCAwMiAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgIHwgMHgwMDAwMDAwMiAoMikgICAgICAgICAgICAgICAgICAgICB8IGxlbmd0aCBvZiBzdHJpbmcKKyAgKzB4MjFDQyB8IDY5IDY0ICAgICAgICAgICAgICAgICAgIHwgY2hhclsyXSAgICAgfCBpZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nIGxpdGVyYWwKKyAgKzB4MjFDRSB8IDAwICAgICAgICAgICAgICAgICAgICAgIHwgY2hhciAgICAgICAgfCAweDAwICgwKSAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nIHRlcm1pbmF0b3IKKwordGFibGUgKHJlZmxlY3Rpb24uS2V5VmFsdWUpOgorICArMHgyMUQwIHwgNkMgRUMgRkYgRkYgICAgICAgICAgICAgfCBTT2Zmc2V0MzIgICB8IDB4RkZGRkVDNkMgKC01MDEyKSBMb2M6ICsweDM1NjQgICAgfCBvZmZzZXQgdG8gdnRhYmxlCisgICsweDIxRDQgfCAxOCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDAxOCAoMjQpIExvYzogKzB4MjFFQyAgICAgICB8IG9mZnNldCB0byBmaWVsZCBga2V5YCAoc3RyaW5nKQorICArMHgyMUQ4IHwgMDQgMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDAwMDQgKDQpIExvYzogKzB4MjFEQyAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYHZhbHVlYCAoc3RyaW5nKQorCitzdHJpbmcgKHJlZmxlY3Rpb24uS2V5VmFsdWUudmFsdWUpOgorICArMHgyMURDIHwgMDggMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICB8IDB4MDAwMDAwMDggKDgpICAgICAgICAgICAgICAgICAgICAgfCBsZW5ndGggb2Ygc3RyaW5nCisgICsweDIxRTAgfCA2NiA2RSA3NiAzMSA2MSA1RiAzNiAzNCB8IGNoYXJbOF0gICAgIHwgZm52MWFfNjQgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHN0cmluZyBsaXRlcmFsCisgICsweDIxRTggfCAwMCAgICAgICAgICAgICAgICAgICAgICB8IGNoYXIgICAgICAgIHwgMHgwMCAoMCkgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHN0cmluZyB0ZXJtaW5hdG9yCisKK3BhZGRpbmc6CisgICsweDIxRTkgfCAwMCAwMCAwMCAgICAgICAgICAgICAgICB8IHVpbnQ4X3RbM10gIHwgLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHBhZGRpbmcKKworc3RyaW5nIChyZWZsZWN0aW9uLktleVZhbHVlLmtleSk6CisgICsweDIxRUMgfCAwNCAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgIHwgMHgwMDAwMDAwNCAoNCkgICAgICAgICAgICAgICAgICAgICB8IGxlbmd0aCBvZiBzdHJpbmcKKyAgKzB4MjFGMCB8IDY4IDYxIDczIDY4ICAgICAgICAgICAgIHwgY2hhcls0XSAgICAgfCBoYXNoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nIGxpdGVyYWwKKyAgKzB4MjFGNCB8IDAwICAgICAgICAgICAgICAgICAgICAgIHwgY2hhciAgICAgICAgfCAweDAwICgwKSAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nIHRlcm1pbmF0b3IKKworcGFkZGluZzoKKyAgKzB4MjFGNSB8IDAwIDAwIDAwICAgICAgICAgICAgICAgIHwgdWludDhfdFszXSAgfCAuLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgcGFkZGluZworCit0YWJsZSAocmVmbGVjdGlvbi5UeXBlKToKKyAgKzB4MjFGOCB8IDE0IEVCIEZGIEZGICAgICAgICAgICAgIHwgU09mZnNldDMyICAgfCAweEZGRkZFQjE0ICgtNTM1NikgTG9jOiArMHgzNkU0ICAgIHwgb2Zmc2V0IHRvIHZ0YWJsZQorICArMHgyMUZDIHwgMDAgMDAgMDAgICAgICAgICAgICAgICAgfCB1aW50OF90WzNdICB8IC4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBwYWRkaW5nCisgICsweDIxRkYgfCAwQSAgICAgICAgICAgICAgICAgICAgICB8IHVpbnQ4X3QgICAgIHwgMHgwQSAoMTApICAgICAgICAgICAgICAgICAgICAgICAgICB8IHRhYmxlIGZpZWxkIGBiYXNlX3R5cGVgIChCeXRlKQorICArMHgyMjAwIHwgMDggMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICB8IDB4MDAwMDAwMDggKDgpICAgICAgICAgICAgICAgICAgICAgfCB0YWJsZSBmaWVsZCBgYmFzZV9zaXplYCAoVUludCkKKyAgKzB4MjIwNCB8IDAxIDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgfCAweDAwMDAwMDAxICgxKSAgICAgICAgICAgICAgICAgICAgIHwgdGFibGUgZmllbGQgYGVsZW1lbnRfc2l6ZWAgKFVJbnQpCisKK3N0cmluZyAocmVmbGVjdGlvbi5GaWVsZC5uYW1lKToKKyAgKzB4MjIwOCB8IDExIDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgfCAweDAwMDAwMDExICgxNykgICAgICAgICAgICAgICAgICAgIHwgbGVuZ3RoIG9mIHN0cmluZworICArMHgyMjBDIHwgNzQgNjUgNzMgNzQgNjggNjEgNzMgNjggfCBjaGFyWzE3XSAgICB8IHRlc3RoYXNoICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJpbmcgbGl0ZXJhbAorICArMHgyMjE0IHwgNzUgMzYgMzQgNUYgNjYgNkUgNzYgMzEgfCAgICAgICAgICAgICB8IHU2NF9mbnYxCisgICsweDIyMUMgfCA2MSAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgIHwgYQorICArMHgyMjFEIHwgMDAgICAgICAgICAgICAgICAgICAgICAgfCBjaGFyICAgICAgICB8IDB4MDAgKDApICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJpbmcgdGVybWluYXRvcgorCitwYWRkaW5nOgorICArMHgyMjFFIHwgMDAgMDAgICAgICAgICAgICAgICAgICAgfCB1aW50OF90WzJdICB8IC4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBwYWRkaW5nCisKK3RhYmxlIChyZWZsZWN0aW9uLkZpZWxkKToKKyAgKzB4MjIyMCB8IEU2IEY3IEZGIEZGICAgICAgICAgICAgIHwgU09mZnNldDMyICAgfCAweEZGRkZGN0U2ICgtMjA3NCkgTG9jOiArMHgyQTNBICAgIHwgb2Zmc2V0IHRvIHZ0YWJsZQorICArMHgyMjI0IHwgMTYgMDAgICAgICAgICAgICAgICAgICAgfCB1aW50MTZfdCAgICB8IDB4MDAxNiAoMjIpICAgICAgICAgICAgICAgICAgICAgICAgfCB0YWJsZSBmaWVsZCBgaWRgIChVU2hvcnQpCisgICsweDIyMjYgfCAzMCAwMCAgICAgICAgICAgICAgICAgICB8IHVpbnQxNl90ICAgIHwgMHgwMDMwICg0OCkgICAgICAgICAgICAgICAgICAgICAgICB8IHRhYmxlIGZpZWxkIGBvZmZzZXRgIChVU2hvcnQpCisgICsweDIyMjggfCA3NCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDA3NCAoMTE2KSBMb2M6ICsweDIyOUMgICAgICB8IG9mZnNldCB0byBmaWVsZCBgbmFtZWAgKHN0cmluZykKKyAgKzB4MjIyQyB8IDYwIDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMDYwICg5NikgTG9jOiArMHgyMjhDICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGB0eXBlYCAodGFibGUpCisgICsweDIyMzAgfCAwQyAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDAwQyAoMTIpIExvYzogKzB4MjIzQyAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgYXR0cmlidXRlc2AgKHZlY3RvcikKKyAgKzB4MjIzNCB8IDA0IDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMDA0ICg0KSBMb2M6ICsweDIyMzggICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBkb2N1bWVudGF0aW9uYCAodmVjdG9yKQorCit2ZWN0b3IgKHJlZmxlY3Rpb24uRmllbGQuZG9jdW1lbnRhdGlvbik6CisgICsweDIyMzggfCAwMCAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgIHwgMHgwMDAwMDAwMCAoMCkgICAgICAgICAgICAgICAgICAgICB8IGxlbmd0aCBvZiB2ZWN0b3IgKCMgaXRlbXMpCisKK3ZlY3RvciAocmVmbGVjdGlvbi5GaWVsZC5hdHRyaWJ1dGVzKToKKyAgKzB4MjIzQyB8IDAyIDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgfCAweDAwMDAwMDAyICgyKSAgICAgICAgICAgICAgICAgICAgIHwgbGVuZ3RoIG9mIHZlY3RvciAoIyBpdGVtcykKKyAgKzB4MjI0MCB8IDI0IDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMDI0ICgzNikgTG9jOiArMHgyMjY0ICAgICAgIHwgb2Zmc2V0IHRvIHRhYmxlWzBdCisgICsweDIyNDQgfCAwNCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDAwNCAoNCkgTG9jOiArMHgyMjQ4ICAgICAgICB8IG9mZnNldCB0byB0YWJsZVsxXQorCit0YWJsZSAocmVmbGVjdGlvbi5LZXlWYWx1ZSk6CisgICsweDIyNDggfCBFNCBFQyBGRiBGRiAgICAgICAgICAgICB8IFNPZmZzZXQzMiAgIHwgMHhGRkZGRUNFNCAoLTQ4OTIpIExvYzogKzB4MzU2NCAgICB8IG9mZnNldCB0byB2dGFibGUKKyAgKzB4MjI0QyB8IDEwIDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMDEwICgxNikgTG9jOiArMHgyMjVDICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBrZXlgIChzdHJpbmcpCisgICsweDIyNTAgfCAwNCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDAwNCAoNCkgTG9jOiArMHgyMjU0ICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgdmFsdWVgIChzdHJpbmcpCisKK3N0cmluZyAocmVmbGVjdGlvbi5LZXlWYWx1ZS52YWx1ZSk6CisgICsweDIyNTQgfCAwMiAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgIHwgMHgwMDAwMDAwMiAoMikgICAgICAgICAgICAgICAgICAgICB8IGxlbmd0aCBvZiBzdHJpbmcKKyAgKzB4MjI1OCB8IDMyIDMyICAgICAgICAgICAgICAgICAgIHwgY2hhclsyXSAgICAgfCAyMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nIGxpdGVyYWwKKyAgKzB4MjI1QSB8IDAwICAgICAgICAgICAgICAgICAgICAgIHwgY2hhciAgICAgICAgfCAweDAwICgwKSAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nIHRlcm1pbmF0b3IKKworc3RyaW5nIChyZWZsZWN0aW9uLktleVZhbHVlLmtleSk6CisgICsweDIyNUMgfCAwMiAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgIHwgMHgwMDAwMDAwMiAoMikgICAgICAgICAgICAgICAgICAgICB8IGxlbmd0aCBvZiBzdHJpbmcKKyAgKzB4MjI2MCB8IDY5IDY0ICAgICAgICAgICAgICAgICAgIHwgY2hhclsyXSAgICAgfCBpZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nIGxpdGVyYWwKKyAgKzB4MjI2MiB8IDAwICAgICAgICAgICAgICAgICAgICAgIHwgY2hhciAgICAgICAgfCAweDAwICgwKSAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nIHRlcm1pbmF0b3IKKwordGFibGUgKHJlZmxlY3Rpb24uS2V5VmFsdWUpOgorICArMHgyMjY0IHwgMDAgRUQgRkYgRkYgICAgICAgICAgICAgfCBTT2Zmc2V0MzIgICB8IDB4RkZGRkVEMDAgKC00ODY0KSBMb2M6ICsweDM1NjQgICAgfCBvZmZzZXQgdG8gdnRhYmxlCisgICsweDIyNjggfCAxOCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDAxOCAoMjQpIExvYzogKzB4MjI4MCAgICAgICB8IG9mZnNldCB0byBmaWVsZCBga2V5YCAoc3RyaW5nKQorICArMHgyMjZDIHwgMDQgMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDAwMDQgKDQpIExvYzogKzB4MjI3MCAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYHZhbHVlYCAoc3RyaW5nKQorCitzdHJpbmcgKHJlZmxlY3Rpb24uS2V5VmFsdWUudmFsdWUpOgorICArMHgyMjcwIHwgMDggMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICB8IDB4MDAwMDAwMDggKDgpICAgICAgICAgICAgICAgICAgICAgfCBsZW5ndGggb2Ygc3RyaW5nCisgICsweDIyNzQgfCA2NiA2RSA3NiAzMSA2MSA1RiAzNiAzNCB8IGNoYXJbOF0gICAgIHwgZm52MWFfNjQgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHN0cmluZyBsaXRlcmFsCisgICsweDIyN0MgfCAwMCAgICAgICAgICAgICAgICAgICAgICB8IGNoYXIgICAgICAgIHwgMHgwMCAoMCkgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHN0cmluZyB0ZXJtaW5hdG9yCisKK3BhZGRpbmc6CisgICsweDIyN0QgfCAwMCAwMCAwMCAgICAgICAgICAgICAgICB8IHVpbnQ4X3RbM10gIHwgLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHBhZGRpbmcKKworc3RyaW5nIChyZWZsZWN0aW9uLktleVZhbHVlLmtleSk6CisgICsweDIyODAgfCAwNCAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgIHwgMHgwMDAwMDAwNCAoNCkgICAgICAgICAgICAgICAgICAgICB8IGxlbmd0aCBvZiBzdHJpbmcKKyAgKzB4MjI4NCB8IDY4IDYxIDczIDY4ICAgICAgICAgICAgIHwgY2hhcls0XSAgICAgfCBoYXNoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nIGxpdGVyYWwKKyAgKzB4MjI4OCB8IDAwICAgICAgICAgICAgICAgICAgICAgIHwgY2hhciAgICAgICAgfCAweDAwICgwKSAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nIHRlcm1pbmF0b3IKKworcGFkZGluZzoKKyAgKzB4MjI4OSB8IDAwIDAwIDAwICAgICAgICAgICAgICAgIHwgdWludDhfdFszXSAgfCAuLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgcGFkZGluZworCit0YWJsZSAocmVmbGVjdGlvbi5UeXBlKToKKyAgKzB4MjI4QyB8IEE4IEVCIEZGIEZGICAgICAgICAgICAgIHwgU09mZnNldDMyICAgfCAweEZGRkZFQkE4ICgtNTIwOCkgTG9jOiArMHgzNkU0ICAgIHwgb2Zmc2V0IHRvIHZ0YWJsZQorICArMHgyMjkwIHwgMDAgMDAgMDAgICAgICAgICAgICAgICAgfCB1aW50OF90WzNdICB8IC4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBwYWRkaW5nCisgICsweDIyOTMgfCAwOSAgICAgICAgICAgICAgICAgICAgICB8IHVpbnQ4X3QgICAgIHwgMHgwOSAoOSkgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHRhYmxlIGZpZWxkIGBiYXNlX3R5cGVgIChCeXRlKQorICArMHgyMjk0IHwgMDggMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICB8IDB4MDAwMDAwMDggKDgpICAgICAgICAgICAgICAgICAgICAgfCB0YWJsZSBmaWVsZCBgYmFzZV9zaXplYCAoVUludCkKKyAgKzB4MjI5OCB8IDAxIDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgfCAweDAwMDAwMDAxICgxKSAgICAgICAgICAgICAgICAgICAgIHwgdGFibGUgZmllbGQgYGVsZW1lbnRfc2l6ZWAgKFVJbnQpCisKK3N0cmluZyAocmVmbGVjdGlvbi5GaWVsZC5uYW1lKToKKyAgKzB4MjI5QyB8IDExIDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgfCAweDAwMDAwMDExICgxNykgICAgICAgICAgICAgICAgICAgIHwgbGVuZ3RoIG9mIHN0cmluZworICArMHgyMkEwIHwgNzQgNjUgNzMgNzQgNjggNjEgNzMgNjggfCBjaGFyWzE3XSAgICB8IHRlc3RoYXNoICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJpbmcgbGl0ZXJhbAorICArMHgyMkE4IHwgNzMgMzYgMzQgNUYgNjYgNkUgNzYgMzEgfCAgICAgICAgICAgICB8IHM2NF9mbnYxCisgICsweDIyQjAgfCA2MSAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgIHwgYQorICArMHgyMkIxIHwgMDAgICAgICAgICAgICAgICAgICAgICAgfCBjaGFyICAgICAgICB8IDB4MDAgKDApICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJpbmcgdGVybWluYXRvcgorCitwYWRkaW5nOgorICArMHgyMkIyIHwgMDAgMDAgICAgICAgICAgICAgICAgICAgfCB1aW50OF90WzJdICB8IC4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBwYWRkaW5nCisKK3RhYmxlIChyZWZsZWN0aW9uLkZpZWxkKToKKyAgKzB4MjJCNCB8IDdBIEY4IEZGIEZGICAgICAgICAgICAgIHwgU09mZnNldDMyICAgfCAweEZGRkZGODdBICgtMTkyNikgTG9jOiArMHgyQTNBICAgIHwgb2Zmc2V0IHRvIHZ0YWJsZQorICArMHgyMkI4IHwgMTUgMDAgICAgICAgICAgICAgICAgICAgfCB1aW50MTZfdCAgICB8IDB4MDAxNSAoMjEpICAgICAgICAgICAgICAgICAgICAgICAgfCB0YWJsZSBmaWVsZCBgaWRgIChVU2hvcnQpCisgICsweDIyQkEgfCAyRSAwMCAgICAgICAgICAgICAgICAgICB8IHVpbnQxNl90ICAgIHwgMHgwMDJFICg0NikgICAgICAgICAgICAgICAgICAgICAgICB8IHRhYmxlIGZpZWxkIGBvZmZzZXRgIChVU2hvcnQpCisgICsweDIyQkMgfCBDQyAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDBDQyAoMjA0KSBMb2M6ICsweDIzODggICAgICB8IG9mZnNldCB0byBmaWVsZCBgbmFtZWAgKHN0cmluZykKKyAgKzB4MjJDMCB8IEJDIDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMEJDICgxODgpIExvYzogKzB4MjM3QyAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGB0eXBlYCAodGFibGUpCisgICsweDIyQzQgfCAwQyAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDAwQyAoMTIpIExvYzogKzB4MjJEMCAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgYXR0cmlidXRlc2AgKHZlY3RvcikKKyAgKzB4MjJDOCB8IDA0IDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMDA0ICg0KSBMb2M6ICsweDIyQ0MgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBkb2N1bWVudGF0aW9uYCAodmVjdG9yKQorCit2ZWN0b3IgKHJlZmxlY3Rpb24uRmllbGQuZG9jdW1lbnRhdGlvbik6CisgICsweDIyQ0MgfCAwMCAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgIHwgMHgwMDAwMDAwMCAoMCkgICAgICAgICAgICAgICAgICAgICB8IGxlbmd0aCBvZiB2ZWN0b3IgKCMgaXRlbXMpCisKK3ZlY3RvciAocmVmbGVjdGlvbi5GaWVsZC5hdHRyaWJ1dGVzKToKKyAgKzB4MjJEMCB8IDA0IDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgfCAweDAwMDAwMDA0ICg0KSAgICAgICAgICAgICAgICAgICAgIHwgbGVuZ3RoIG9mIHZlY3RvciAoIyBpdGVtcykKKyAgKzB4MjJENCB8IDdDIDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMDdDICgxMjQpIExvYzogKzB4MjM1MCAgICAgIHwgb2Zmc2V0IHRvIHRhYmxlWzBdCisgICsweDIyRDggfCA1MCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDA1MCAoODApIExvYzogKzB4MjMyOCAgICAgICB8IG9mZnNldCB0byB0YWJsZVsxXQorICArMHgyMkRDIHwgMjQgMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDAwMjQgKDM2KSBMb2M6ICsweDIzMDAgICAgICAgfCBvZmZzZXQgdG8gdGFibGVbMl0KKyAgKzB4MjJFMCB8IDA0IDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMDA0ICg0KSBMb2M6ICsweDIyRTQgICAgICAgIHwgb2Zmc2V0IHRvIHRhYmxlWzNdCisKK3RhYmxlIChyZWZsZWN0aW9uLktleVZhbHVlKToKKyAgKzB4MjJFNCB8IDgwIEVEIEZGIEZGICAgICAgICAgICAgIHwgU09mZnNldDMyICAgfCAweEZGRkZFRDgwICgtNDczNikgTG9jOiArMHgzNTY0ICAgIHwgb2Zmc2V0IHRvIHZ0YWJsZQorICArMHgyMkU4IHwgMTAgMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDAwMTAgKDE2KSBMb2M6ICsweDIyRjggICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYGtleWAgKHN0cmluZykKKyAgKzB4MjJFQyB8IDA0IDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMDA0ICg0KSBMb2M6ICsweDIyRjAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGB2YWx1ZWAgKHN0cmluZykKKworc3RyaW5nIChyZWZsZWN0aW9uLktleVZhbHVlLnZhbHVlKToKKyAgKzB4MjJGMCB8IDAyIDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgfCAweDAwMDAwMDAyICgyKSAgICAgICAgICAgICAgICAgICAgIHwgbGVuZ3RoIG9mIHN0cmluZworICArMHgyMkY0IHwgMzIgMzEgICAgICAgICAgICAgICAgICAgfCBjaGFyWzJdICAgICB8IDIxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJpbmcgbGl0ZXJhbAorICArMHgyMkY2IHwgMDAgICAgICAgICAgICAgICAgICAgICAgfCBjaGFyICAgICAgICB8IDB4MDAgKDApICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJpbmcgdGVybWluYXRvcgorCitzdHJpbmcgKHJlZmxlY3Rpb24uS2V5VmFsdWUua2V5KToKKyAgKzB4MjJGOCB8IDAyIDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgfCAweDAwMDAwMDAyICgyKSAgICAgICAgICAgICAgICAgICAgIHwgbGVuZ3RoIG9mIHN0cmluZworICArMHgyMkZDIHwgNjkgNjQgICAgICAgICAgICAgICAgICAgfCBjaGFyWzJdICAgICB8IGlkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJpbmcgbGl0ZXJhbAorICArMHgyMkZFIHwgMDAgICAgICAgICAgICAgICAgICAgICAgfCBjaGFyICAgICAgICB8IDB4MDAgKDApICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJpbmcgdGVybWluYXRvcgorCit0YWJsZSAocmVmbGVjdGlvbi5LZXlWYWx1ZSk6CisgICsweDIzMDAgfCA5QyBFRCBGRiBGRiAgICAgICAgICAgICB8IFNPZmZzZXQzMiAgIHwgMHhGRkZGRUQ5QyAoLTQ3MDgpIExvYzogKzB4MzU2NCAgICB8IG9mZnNldCB0byB2dGFibGUKKyAgKzB4MjMwNCB8IDE4IDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMDE4ICgyNCkgTG9jOiArMHgyMzFDICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBrZXlgIChzdHJpbmcpCisgICsweDIzMDggfCAwNCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDAwNCAoNCkgTG9jOiArMHgyMzBDICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgdmFsdWVgIChzdHJpbmcpCisKK3N0cmluZyAocmVmbGVjdGlvbi5LZXlWYWx1ZS52YWx1ZSk6CisgICsweDIzMEMgfCAwOCAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgIHwgMHgwMDAwMDAwOCAoOCkgICAgICAgICAgICAgICAgICAgICB8IGxlbmd0aCBvZiBzdHJpbmcKKyAgKzB4MjMxMCB8IDY2IDZFIDc2IDMxIDYxIDVGIDMzIDMyIHwgY2hhcls4XSAgICAgfCBmbnYxYV8zMiAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nIGxpdGVyYWwKKyAgKzB4MjMxOCB8IDAwICAgICAgICAgICAgICAgICAgICAgIHwgY2hhciAgICAgICAgfCAweDAwICgwKSAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nIHRlcm1pbmF0b3IKKworcGFkZGluZzoKKyAgKzB4MjMxOSB8IDAwIDAwIDAwICAgICAgICAgICAgICAgIHwgdWludDhfdFszXSAgfCAuLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgcGFkZGluZworCitzdHJpbmcgKHJlZmxlY3Rpb24uS2V5VmFsdWUua2V5KToKKyAgKzB4MjMxQyB8IDA0IDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgfCAweDAwMDAwMDA0ICg0KSAgICAgICAgICAgICAgICAgICAgIHwgbGVuZ3RoIG9mIHN0cmluZworICArMHgyMzIwIHwgNjggNjEgNzMgNjggICAgICAgICAgICAgfCBjaGFyWzRdICAgICB8IGhhc2ggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJpbmcgbGl0ZXJhbAorICArMHgyMzI0IHwgMDAgICAgICAgICAgICAgICAgICAgICAgfCBjaGFyICAgICAgICB8IDB4MDAgKDApICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJpbmcgdGVybWluYXRvcgorCitwYWRkaW5nOgorICArMHgyMzI1IHwgMDAgMDAgMDAgICAgICAgICAgICAgICAgfCB1aW50OF90WzNdICB8IC4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBwYWRkaW5nCisKK3RhYmxlIChyZWZsZWN0aW9uLktleVZhbHVlKToKKyAgKzB4MjMyOCB8IEM0IEVEIEZGIEZGICAgICAgICAgICAgIHwgU09mZnNldDMyICAgfCAweEZGRkZFREM0ICgtNDY2OCkgTG9jOiArMHgzNTY0ICAgIHwgb2Zmc2V0IHRvIHZ0YWJsZQorICArMHgyMzJDIHwgMTQgMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDAwMTQgKDIwKSBMb2M6ICsweDIzNDAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYGtleWAgKHN0cmluZykKKyAgKzB4MjMzMCB8IDA0IDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMDA0ICg0KSBMb2M6ICsweDIzMzQgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGB2YWx1ZWAgKHN0cmluZykKKworc3RyaW5nIChyZWZsZWN0aW9uLktleVZhbHVlLnZhbHVlKToKKyAgKzB4MjMzNCB8IDA0IDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgfCAweDAwMDAwMDA0ICg0KSAgICAgICAgICAgICAgICAgICAgIHwgbGVuZ3RoIG9mIHN0cmluZworICArMHgyMzM4IHwgNTMgNzQgNjEgNzQgICAgICAgICAgICAgfCBjaGFyWzRdICAgICB8IFN0YXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJpbmcgbGl0ZXJhbAorICArMHgyMzNDIHwgMDAgICAgICAgICAgICAgICAgICAgICAgfCBjaGFyICAgICAgICB8IDB4MDAgKDApICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJpbmcgdGVybWluYXRvcgorCitwYWRkaW5nOgorICArMHgyMzNEIHwgMDAgMDAgMDAgICAgICAgICAgICAgICAgfCB1aW50OF90WzNdICB8IC4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBwYWRkaW5nCisKK3N0cmluZyAocmVmbGVjdGlvbi5LZXlWYWx1ZS5rZXkpOgorICArMHgyMzQwIHwgMDggMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICB8IDB4MDAwMDAwMDggKDgpICAgICAgICAgICAgICAgICAgICAgfCBsZW5ndGggb2Ygc3RyaW5nCisgICsweDIzNDQgfCA2MyA3MCA3MCA1RiA3NCA3OSA3MCA2NSB8IGNoYXJbOF0gICAgIHwgY3BwX3R5cGUgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHN0cmluZyBsaXRlcmFsCisgICsweDIzNEMgfCAwMCAgICAgICAgICAgICAgICAgICAgICB8IGNoYXIgICAgICAgIHwgMHgwMCAoMCkgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHN0cmluZyB0ZXJtaW5hdG9yCisKK3BhZGRpbmc6CisgICsweDIzNEQgfCAwMCAwMCAwMCAgICAgICAgICAgICAgICB8IHVpbnQ4X3RbM10gIHwgLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHBhZGRpbmcKKwordGFibGUgKHJlZmxlY3Rpb24uS2V5VmFsdWUpOgorICArMHgyMzUwIHwgRUMgRUQgRkYgRkYgICAgICAgICAgICAgfCBTT2Zmc2V0MzIgICB8IDB4RkZGRkVERUMgKC00NjI4KSBMb2M6ICsweDM1NjQgICAgfCBvZmZzZXQgdG8gdnRhYmxlCisgICsweDIzNTQgfCAxNCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDAxNCAoMjApIExvYzogKzB4MjM2OCAgICAgICB8IG9mZnNldCB0byBmaWVsZCBga2V5YCAoc3RyaW5nKQorICArMHgyMzU4IHwgMDQgMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDAwMDQgKDQpIExvYzogKzB4MjM1QyAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYHZhbHVlYCAoc3RyaW5nKQorCitzdHJpbmcgKHJlZmxlY3Rpb24uS2V5VmFsdWUudmFsdWUpOgorICArMHgyMzVDIHwgMDUgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICB8IDB4MDAwMDAwMDUgKDUpICAgICAgICAgICAgICAgICAgICAgfCBsZW5ndGggb2Ygc3RyaW5nCisgICsweDIzNjAgfCA2RSA2MSA2QiA2NSA2NCAgICAgICAgICB8IGNoYXJbNV0gICAgIHwgbmFrZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHN0cmluZyBsaXRlcmFsCisgICsweDIzNjUgfCAwMCAgICAgICAgICAgICAgICAgICAgICB8IGNoYXIgICAgICAgIHwgMHgwMCAoMCkgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHN0cmluZyB0ZXJtaW5hdG9yCisKK3BhZGRpbmc6CisgICsweDIzNjYgfCAwMCAwMCAgICAgICAgICAgICAgICAgICB8IHVpbnQ4X3RbMl0gIHwgLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHBhZGRpbmcKKworc3RyaW5nIChyZWZsZWN0aW9uLktleVZhbHVlLmtleSk6CisgICsweDIzNjggfCAwQyAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgIHwgMHgwMDAwMDAwQyAoMTIpICAgICAgICAgICAgICAgICAgICB8IGxlbmd0aCBvZiBzdHJpbmcKKyAgKzB4MjM2QyB8IDYzIDcwIDcwIDVGIDcwIDc0IDcyIDVGIHwgY2hhclsxMl0gICAgfCBjcHBfcHRyXyAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nIGxpdGVyYWwKKyAgKzB4MjM3NCB8IDc0IDc5IDcwIDY1ICAgICAgICAgICAgIHwgICAgICAgICAgICAgfCB0eXBlCisgICsweDIzNzggfCAwMCAgICAgICAgICAgICAgICAgICAgICB8IGNoYXIgICAgICAgIHwgMHgwMCAoMCkgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHN0cmluZyB0ZXJtaW5hdG9yCisKK3BhZGRpbmc6CisgICsweDIzNzkgfCAwMCAwMCAwMCAgICAgICAgICAgICAgICB8IHVpbnQ4X3RbM10gIHwgLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHBhZGRpbmcKKwordGFibGUgKHJlZmxlY3Rpb24uVHlwZSk6CisgICsweDIzN0MgfCBFMCBFOSBGRiBGRiAgICAgICAgICAgICB8IFNPZmZzZXQzMiAgIHwgMHhGRkZGRTlFMCAoLTU2NjQpIExvYzogKzB4Mzk5QyAgICB8IG9mZnNldCB0byB2dGFibGUKKyAgKzB4MjM4MCB8IDAwIDAwIDAwICAgICAgICAgICAgICAgIHwgdWludDhfdFszXSAgfCAuLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgcGFkZGluZworICArMHgyMzgzIHwgMDggICAgICAgICAgICAgICAgICAgICAgfCB1aW50OF90ICAgICB8IDB4MDggKDgpICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB0YWJsZSBmaWVsZCBgYmFzZV90eXBlYCAoQnl0ZSkKKyAgKzB4MjM4NCB8IDAxIDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgfCAweDAwMDAwMDAxICgxKSAgICAgICAgICAgICAgICAgICAgIHwgdGFibGUgZmllbGQgYGVsZW1lbnRfc2l6ZWAgKFVJbnQpCisKK3N0cmluZyAocmVmbGVjdGlvbi5GaWVsZC5uYW1lKToKKyAgKzB4MjM4OCB8IDExIDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgfCAweDAwMDAwMDExICgxNykgICAgICAgICAgICAgICAgICAgIHwgbGVuZ3RoIG9mIHN0cmluZworICArMHgyMzhDIHwgNzQgNjUgNzMgNzQgNjggNjEgNzMgNjggfCBjaGFyWzE3XSAgICB8IHRlc3RoYXNoICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJpbmcgbGl0ZXJhbAorICArMHgyMzk0IHwgNzUgMzMgMzIgNUYgNjYgNkUgNzYgMzEgfCAgICAgICAgICAgICB8IHUzMl9mbnYxCisgICsweDIzOUMgfCA2MSAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgIHwgYQorICArMHgyMzlEIHwgMDAgICAgICAgICAgICAgICAgICAgICAgfCBjaGFyICAgICAgICB8IDB4MDAgKDApICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJpbmcgdGVybWluYXRvcgorCitwYWRkaW5nOgorICArMHgyMzlFIHwgMDAgMDAgICAgICAgICAgICAgICAgICAgfCB1aW50OF90WzJdICB8IC4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBwYWRkaW5nCisKK3RhYmxlIChyZWZsZWN0aW9uLkZpZWxkKToKKyAgKzB4MjNBMCB8IDY2IEY5IEZGIEZGICAgICAgICAgICAgIHwgU09mZnNldDMyICAgfCAweEZGRkZGOTY2ICgtMTY5MCkgTG9jOiArMHgyQTNBICAgIHwgb2Zmc2V0IHRvIHZ0YWJsZQorICArMHgyM0E0IHwgMTQgMDAgICAgICAgICAgICAgICAgICAgfCB1aW50MTZfdCAgICB8IDB4MDAxNCAoMjApICAgICAgICAgICAgICAgICAgICAgICAgfCB0YWJsZSBmaWVsZCBgaWRgIChVU2hvcnQpCisgICsweDIzQTYgfCAyQyAwMCAgICAgICAgICAgICAgICAgICB8IHVpbnQxNl90ICAgIHwgMHgwMDJDICg0NCkgICAgICAgICAgICAgICAgICAgICAgICB8IHRhYmxlIGZpZWxkIGBvZmZzZXRgIChVU2hvcnQpCisgICsweDIzQTggfCA3MCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDA3MCAoMTEyKSBMb2M6ICsweDI0MTggICAgICB8IG9mZnNldCB0byBmaWVsZCBgbmFtZWAgKHN0cmluZykKKyAgKzB4MjNBQyB8IDYwIDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMDYwICg5NikgTG9jOiArMHgyNDBDICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGB0eXBlYCAodGFibGUpCisgICsweDIzQjAgfCAwQyAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDAwQyAoMTIpIExvYzogKzB4MjNCQyAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgYXR0cmlidXRlc2AgKHZlY3RvcikKKyAgKzB4MjNCNCB8IDA0IDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMDA0ICg0KSBMb2M6ICsweDIzQjggICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBkb2N1bWVudGF0aW9uYCAodmVjdG9yKQorCit2ZWN0b3IgKHJlZmxlY3Rpb24uRmllbGQuZG9jdW1lbnRhdGlvbik6CisgICsweDIzQjggfCAwMCAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgIHwgMHgwMDAwMDAwMCAoMCkgICAgICAgICAgICAgICAgICAgICB8IGxlbmd0aCBvZiB2ZWN0b3IgKCMgaXRlbXMpCisKK3ZlY3RvciAocmVmbGVjdGlvbi5GaWVsZC5hdHRyaWJ1dGVzKToKKyAgKzB4MjNCQyB8IDAyIDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgfCAweDAwMDAwMDAyICgyKSAgICAgICAgICAgICAgICAgICAgIHwgbGVuZ3RoIG9mIHZlY3RvciAoIyBpdGVtcykKKyAgKzB4MjNDMCB8IDI0IDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMDI0ICgzNikgTG9jOiArMHgyM0U0ICAgICAgIHwgb2Zmc2V0IHRvIHRhYmxlWzBdCisgICsweDIzQzQgfCAwNCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDAwNCAoNCkgTG9jOiArMHgyM0M4ICAgICAgICB8IG9mZnNldCB0byB0YWJsZVsxXQorCit0YWJsZSAocmVmbGVjdGlvbi5LZXlWYWx1ZSk6CisgICsweDIzQzggfCA2NCBFRSBGRiBGRiAgICAgICAgICAgICB8IFNPZmZzZXQzMiAgIHwgMHhGRkZGRUU2NCAoLTQ1MDgpIExvYzogKzB4MzU2NCAgICB8IG9mZnNldCB0byB2dGFibGUKKyAgKzB4MjNDQyB8IDEwIDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMDEwICgxNikgTG9jOiArMHgyM0RDICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBrZXlgIChzdHJpbmcpCisgICsweDIzRDAgfCAwNCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDAwNCAoNCkgTG9jOiArMHgyM0Q0ICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgdmFsdWVgIChzdHJpbmcpCisKK3N0cmluZyAocmVmbGVjdGlvbi5LZXlWYWx1ZS52YWx1ZSk6CisgICsweDIzRDQgfCAwMiAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgIHwgMHgwMDAwMDAwMiAoMikgICAgICAgICAgICAgICAgICAgICB8IGxlbmd0aCBvZiBzdHJpbmcKKyAgKzB4MjNEOCB8IDMyIDMwICAgICAgICAgICAgICAgICAgIHwgY2hhclsyXSAgICAgfCAyMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nIGxpdGVyYWwKKyAgKzB4MjNEQSB8IDAwICAgICAgICAgICAgICAgICAgICAgIHwgY2hhciAgICAgICAgfCAweDAwICgwKSAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nIHRlcm1pbmF0b3IKKworc3RyaW5nIChyZWZsZWN0aW9uLktleVZhbHVlLmtleSk6CisgICsweDIzREMgfCAwMiAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgIHwgMHgwMDAwMDAwMiAoMikgICAgICAgICAgICAgICAgICAgICB8IGxlbmd0aCBvZiBzdHJpbmcKKyAgKzB4MjNFMCB8IDY5IDY0ICAgICAgICAgICAgICAgICAgIHwgY2hhclsyXSAgICAgfCBpZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nIGxpdGVyYWwKKyAgKzB4MjNFMiB8IDAwICAgICAgICAgICAgICAgICAgICAgIHwgY2hhciAgICAgICAgfCAweDAwICgwKSAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nIHRlcm1pbmF0b3IKKwordGFibGUgKHJlZmxlY3Rpb24uS2V5VmFsdWUpOgorICArMHgyM0U0IHwgODAgRUUgRkYgRkYgICAgICAgICAgICAgfCBTT2Zmc2V0MzIgICB8IDB4RkZGRkVFODAgKC00NDgwKSBMb2M6ICsweDM1NjQgICAgfCBvZmZzZXQgdG8gdnRhYmxlCisgICsweDIzRTggfCAxOCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDAxOCAoMjQpIExvYzogKzB4MjQwMCAgICAgICB8IG9mZnNldCB0byBmaWVsZCBga2V5YCAoc3RyaW5nKQorICArMHgyM0VDIHwgMDQgMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDAwMDQgKDQpIExvYzogKzB4MjNGMCAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYHZhbHVlYCAoc3RyaW5nKQorCitzdHJpbmcgKHJlZmxlY3Rpb24uS2V5VmFsdWUudmFsdWUpOgorICArMHgyM0YwIHwgMDggMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICB8IDB4MDAwMDAwMDggKDgpICAgICAgICAgICAgICAgICAgICAgfCBsZW5ndGggb2Ygc3RyaW5nCisgICsweDIzRjQgfCA2NiA2RSA3NiAzMSA2MSA1RiAzMyAzMiB8IGNoYXJbOF0gICAgIHwgZm52MWFfMzIgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHN0cmluZyBsaXRlcmFsCisgICsweDIzRkMgfCAwMCAgICAgICAgICAgICAgICAgICAgICB8IGNoYXIgICAgICAgIHwgMHgwMCAoMCkgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHN0cmluZyB0ZXJtaW5hdG9yCisKK3BhZGRpbmc6CisgICsweDIzRkQgfCAwMCAwMCAwMCAgICAgICAgICAgICAgICB8IHVpbnQ4X3RbM10gIHwgLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHBhZGRpbmcKKworc3RyaW5nIChyZWZsZWN0aW9uLktleVZhbHVlLmtleSk6CisgICsweDI0MDAgfCAwNCAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgIHwgMHgwMDAwMDAwNCAoNCkgICAgICAgICAgICAgICAgICAgICB8IGxlbmd0aCBvZiBzdHJpbmcKKyAgKzB4MjQwNCB8IDY4IDYxIDczIDY4ICAgICAgICAgICAgIHwgY2hhcls0XSAgICAgfCBoYXNoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nIGxpdGVyYWwKKyAgKzB4MjQwOCB8IDAwICAgICAgICAgICAgICAgICAgICAgIHwgY2hhciAgICAgICAgfCAweDAwICgwKSAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nIHRlcm1pbmF0b3IKKworcGFkZGluZzoKKyAgKzB4MjQwOSB8IDAwIDAwIDAwICAgICAgICAgICAgICAgIHwgdWludDhfdFszXSAgfCAuLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgcGFkZGluZworCit0YWJsZSAocmVmbGVjdGlvbi5UeXBlKToKKyAgKzB4MjQwQyB8IDcwIEVBIEZGIEZGICAgICAgICAgICAgIHwgU09mZnNldDMyICAgfCAweEZGRkZFQTcwICgtNTUyMCkgTG9jOiArMHgzOTlDICAgIHwgb2Zmc2V0IHRvIHZ0YWJsZQorICArMHgyNDEwIHwgMDAgMDAgMDAgICAgICAgICAgICAgICAgfCB1aW50OF90WzNdICB8IC4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBwYWRkaW5nCisgICsweDI0MTMgfCAwNyAgICAgICAgICAgICAgICAgICAgICB8IHVpbnQ4X3QgICAgIHwgMHgwNyAoNykgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHRhYmxlIGZpZWxkIGBiYXNlX3R5cGVgIChCeXRlKQorICArMHgyNDE0IHwgMDEgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICB8IDB4MDAwMDAwMDEgKDEpICAgICAgICAgICAgICAgICAgICAgfCB0YWJsZSBmaWVsZCBgZWxlbWVudF9zaXplYCAoVUludCkKKworc3RyaW5nIChyZWZsZWN0aW9uLkZpZWxkLm5hbWUpOgorICArMHgyNDE4IHwgMTEgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICB8IDB4MDAwMDAwMTEgKDE3KSAgICAgICAgICAgICAgICAgICAgfCBsZW5ndGggb2Ygc3RyaW5nCisgICsweDI0MUMgfCA3NCA2NSA3MyA3NCA2OCA2MSA3MyA2OCB8IGNoYXJbMTddICAgIHwgdGVzdGhhc2ggICAgICAgICAgICAgICAgICAgICAgICAgICB8IHN0cmluZyBsaXRlcmFsCisgICsweDI0MjQgfCA3MyAzMyAzMiA1RiA2NiA2RSA3NiAzMSB8ICAgICAgICAgICAgIHwgczMyX2ZudjEKKyAgKzB4MjQyQyB8IDYxICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgfCBhCisgICsweDI0MkQgfCAwMCAgICAgICAgICAgICAgICAgICAgICB8IGNoYXIgICAgICAgIHwgMHgwMCAoMCkgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHN0cmluZyB0ZXJtaW5hdG9yCisKK3BhZGRpbmc6CisgICsweDI0MkUgfCAwMCAwMCAgICAgICAgICAgICAgICAgICB8IHVpbnQ4X3RbMl0gIHwgLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHBhZGRpbmcKKwordGFibGUgKHJlZmxlY3Rpb24uRmllbGQpOgorICArMHgyNDMwIHwgRjYgRjkgRkYgRkYgICAgICAgICAgICAgfCBTT2Zmc2V0MzIgICB8IDB4RkZGRkY5RjYgKC0xNTQ2KSBMb2M6ICsweDJBM0EgICAgfCBvZmZzZXQgdG8gdnRhYmxlCisgICsweDI0MzQgfCAxMyAwMCAgICAgICAgICAgICAgICAgICB8IHVpbnQxNl90ICAgIHwgMHgwMDEzICgxOSkgICAgICAgICAgICAgICAgICAgICAgICB8IHRhYmxlIGZpZWxkIGBpZGAgKFVTaG9ydCkKKyAgKzB4MjQzNiB8IDJBIDAwICAgICAgICAgICAgICAgICAgIHwgdWludDE2X3QgICAgfCAweDAwMkEgKDQyKSAgICAgICAgICAgICAgICAgICAgICAgIHwgdGFibGUgZmllbGQgYG9mZnNldGAgKFVTaG9ydCkKKyAgKzB4MjQzOCB8IDcwIDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMDcwICgxMTIpIExvYzogKzB4MjRBOCAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBuYW1lYCAoc3RyaW5nKQorICArMHgyNDNDIHwgNUMgMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDAwNUMgKDkyKSBMb2M6ICsweDI0OTggICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYHR5cGVgICh0YWJsZSkKKyAgKzB4MjQ0MCB8IDBDIDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMDBDICgxMikgTG9jOiArMHgyNDRDICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBhdHRyaWJ1dGVzYCAodmVjdG9yKQorICArMHgyNDQ0IHwgMDQgMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDAwMDQgKDQpIExvYzogKzB4MjQ0OCAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYGRvY3VtZW50YXRpb25gICh2ZWN0b3IpCisKK3ZlY3RvciAocmVmbGVjdGlvbi5GaWVsZC5kb2N1bWVudGF0aW9uKToKKyAgKzB4MjQ0OCB8IDAwIDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgfCAweDAwMDAwMDAwICgwKSAgICAgICAgICAgICAgICAgICAgIHwgbGVuZ3RoIG9mIHZlY3RvciAoIyBpdGVtcykKKwordmVjdG9yIChyZWZsZWN0aW9uLkZpZWxkLmF0dHJpYnV0ZXMpOgorICArMHgyNDRDIHwgMDIgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICB8IDB4MDAwMDAwMDIgKDIpICAgICAgICAgICAgICAgICAgICAgfCBsZW5ndGggb2YgdmVjdG9yICgjIGl0ZW1zKQorICArMHgyNDUwIHwgMjQgMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDAwMjQgKDM2KSBMb2M6ICsweDI0NzQgICAgICAgfCBvZmZzZXQgdG8gdGFibGVbMF0KKyAgKzB4MjQ1NCB8IDA0IDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMDA0ICg0KSBMb2M6ICsweDI0NTggICAgICAgIHwgb2Zmc2V0IHRvIHRhYmxlWzFdCisKK3RhYmxlIChyZWZsZWN0aW9uLktleVZhbHVlKToKKyAgKzB4MjQ1OCB8IEY0IEVFIEZGIEZGICAgICAgICAgICAgIHwgU09mZnNldDMyICAgfCAweEZGRkZFRUY0ICgtNDM2NCkgTG9jOiArMHgzNTY0ICAgIHwgb2Zmc2V0IHRvIHZ0YWJsZQorICArMHgyNDVDIHwgMTAgMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDAwMTAgKDE2KSBMb2M6ICsweDI0NkMgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYGtleWAgKHN0cmluZykKKyAgKzB4MjQ2MCB8IDA0IDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMDA0ICg0KSBMb2M6ICsweDI0NjQgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGB2YWx1ZWAgKHN0cmluZykKKworc3RyaW5nIChyZWZsZWN0aW9uLktleVZhbHVlLnZhbHVlKToKKyAgKzB4MjQ2NCB8IDAyIDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgfCAweDAwMDAwMDAyICgyKSAgICAgICAgICAgICAgICAgICAgIHwgbGVuZ3RoIG9mIHN0cmluZworICArMHgyNDY4IHwgMzEgMzkgICAgICAgICAgICAgICAgICAgfCBjaGFyWzJdICAgICB8IDE5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJpbmcgbGl0ZXJhbAorICArMHgyNDZBIHwgMDAgICAgICAgICAgICAgICAgICAgICAgfCBjaGFyICAgICAgICB8IDB4MDAgKDApICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJpbmcgdGVybWluYXRvcgorCitzdHJpbmcgKHJlZmxlY3Rpb24uS2V5VmFsdWUua2V5KToKKyAgKzB4MjQ2QyB8IDAyIDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgfCAweDAwMDAwMDAyICgyKSAgICAgICAgICAgICAgICAgICAgIHwgbGVuZ3RoIG9mIHN0cmluZworICArMHgyNDcwIHwgNjkgNjQgICAgICAgICAgICAgICAgICAgfCBjaGFyWzJdICAgICB8IGlkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJpbmcgbGl0ZXJhbAorICArMHgyNDcyIHwgMDAgICAgICAgICAgICAgICAgICAgICAgfCBjaGFyICAgICAgICB8IDB4MDAgKDApICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJpbmcgdGVybWluYXRvcgorCit0YWJsZSAocmVmbGVjdGlvbi5LZXlWYWx1ZSk6CisgICsweDI0NzQgfCAxMCBFRiBGRiBGRiAgICAgICAgICAgICB8IFNPZmZzZXQzMiAgIHwgMHhGRkZGRUYxMCAoLTQzMzYpIExvYzogKzB4MzU2NCAgICB8IG9mZnNldCB0byB2dGFibGUKKyAgKzB4MjQ3OCB8IDE0IDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMDE0ICgyMCkgTG9jOiArMHgyNDhDICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBrZXlgIChzdHJpbmcpCisgICsweDI0N0MgfCAwNCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDAwNCAoNCkgTG9jOiArMHgyNDgwICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgdmFsdWVgIChzdHJpbmcpCisKK3N0cmluZyAocmVmbGVjdGlvbi5LZXlWYWx1ZS52YWx1ZSk6CisgICsweDI0ODAgfCAwNyAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgIHwgMHgwMDAwMDAwNyAoNykgICAgICAgICAgICAgICAgICAgICB8IGxlbmd0aCBvZiBzdHJpbmcKKyAgKzB4MjQ4NCB8IDY2IDZFIDc2IDMxIDVGIDM2IDM0ICAgIHwgY2hhcls3XSAgICAgfCBmbnYxXzY0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nIGxpdGVyYWwKKyAgKzB4MjQ4QiB8IDAwICAgICAgICAgICAgICAgICAgICAgIHwgY2hhciAgICAgICAgfCAweDAwICgwKSAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nIHRlcm1pbmF0b3IKKworc3RyaW5nIChyZWZsZWN0aW9uLktleVZhbHVlLmtleSk6CisgICsweDI0OEMgfCAwNCAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgIHwgMHgwMDAwMDAwNCAoNCkgICAgICAgICAgICAgICAgICAgICB8IGxlbmd0aCBvZiBzdHJpbmcKKyAgKzB4MjQ5MCB8IDY4IDYxIDczIDY4ICAgICAgICAgICAgIHwgY2hhcls0XSAgICAgfCBoYXNoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nIGxpdGVyYWwKKyAgKzB4MjQ5NCB8IDAwICAgICAgICAgICAgICAgICAgICAgIHwgY2hhciAgICAgICAgfCAweDAwICgwKSAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nIHRlcm1pbmF0b3IKKworcGFkZGluZzoKKyAgKzB4MjQ5NSB8IDAwIDAwIDAwICAgICAgICAgICAgICAgIHwgdWludDhfdFszXSAgfCAuLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgcGFkZGluZworCit0YWJsZSAocmVmbGVjdGlvbi5UeXBlKToKKyAgKzB4MjQ5OCB8IEI0IEVEIEZGIEZGICAgICAgICAgICAgIHwgU09mZnNldDMyICAgfCAweEZGRkZFREI0ICgtNDY4NCkgTG9jOiArMHgzNkU0ICAgIHwgb2Zmc2V0IHRvIHZ0YWJsZQorICArMHgyNDlDIHwgMDAgMDAgMDAgICAgICAgICAgICAgICAgfCB1aW50OF90WzNdICB8IC4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBwYWRkaW5nCisgICsweDI0OUYgfCAwQSAgICAgICAgICAgICAgICAgICAgICB8IHVpbnQ4X3QgICAgIHwgMHgwQSAoMTApICAgICAgICAgICAgICAgICAgICAgICAgICB8IHRhYmxlIGZpZWxkIGBiYXNlX3R5cGVgIChCeXRlKQorICArMHgyNEEwIHwgMDggMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICB8IDB4MDAwMDAwMDggKDgpICAgICAgICAgICAgICAgICAgICAgfCB0YWJsZSBmaWVsZCBgYmFzZV9zaXplYCAoVUludCkKKyAgKzB4MjRBNCB8IDAxIDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgfCAweDAwMDAwMDAxICgxKSAgICAgICAgICAgICAgICAgICAgIHwgdGFibGUgZmllbGQgYGVsZW1lbnRfc2l6ZWAgKFVJbnQpCisKK3N0cmluZyAocmVmbGVjdGlvbi5GaWVsZC5uYW1lKToKKyAgKzB4MjRBOCB8IDEwIDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgfCAweDAwMDAwMDEwICgxNikgICAgICAgICAgICAgICAgICAgIHwgbGVuZ3RoIG9mIHN0cmluZworICArMHgyNEFDIHwgNzQgNjUgNzMgNzQgNjggNjEgNzMgNjggfCBjaGFyWzE2XSAgICB8IHRlc3RoYXNoICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJpbmcgbGl0ZXJhbAorICArMHgyNEI0IHwgNzUgMzYgMzQgNUYgNjYgNkUgNzYgMzEgfCAgICAgICAgICAgICB8IHU2NF9mbnYxCisgICsweDI0QkMgfCAwMCAgICAgICAgICAgICAgICAgICAgICB8IGNoYXIgICAgICAgIHwgMHgwMCAoMCkgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHN0cmluZyB0ZXJtaW5hdG9yCisKK3BhZGRpbmc6CisgICsweDI0QkQgfCAwMCAwMCAwMCAgICAgICAgICAgICAgICB8IHVpbnQ4X3RbM10gIHwgLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHBhZGRpbmcKKwordGFibGUgKHJlZmxlY3Rpb24uRmllbGQpOgorICArMHgyNEMwIHwgODYgRkEgRkYgRkYgICAgICAgICAgICAgfCBTT2Zmc2V0MzIgICB8IDB4RkZGRkZBODYgKC0xNDAyKSBMb2M6ICsweDJBM0EgICAgfCBvZmZzZXQgdG8gdnRhYmxlCisgICsweDI0QzQgfCAxMiAwMCAgICAgICAgICAgICAgICAgICB8IHVpbnQxNl90ICAgIHwgMHgwMDEyICgxOCkgICAgICAgICAgICAgICAgICAgICAgICB8IHRhYmxlIGZpZWxkIGBpZGAgKFVTaG9ydCkKKyAgKzB4MjRDNiB8IDI4IDAwICAgICAgICAgICAgICAgICAgIHwgdWludDE2X3QgICAgfCAweDAwMjggKDQwKSAgICAgICAgICAgICAgICAgICAgICAgIHwgdGFibGUgZmllbGQgYG9mZnNldGAgKFVTaG9ydCkKKyAgKzB4MjRDOCB8IDcwIDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMDcwICgxMTIpIExvYzogKzB4MjUzOCAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBuYW1lYCAoc3RyaW5nKQorICArMHgyNENDIHwgNUMgMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDAwNUMgKDkyKSBMb2M6ICsweDI1MjggICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYHR5cGVgICh0YWJsZSkKKyAgKzB4MjREMCB8IDBDIDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMDBDICgxMikgTG9jOiArMHgyNERDICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBhdHRyaWJ1dGVzYCAodmVjdG9yKQorICArMHgyNEQ0IHwgMDQgMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDAwMDQgKDQpIExvYzogKzB4MjREOCAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYGRvY3VtZW50YXRpb25gICh2ZWN0b3IpCisKK3ZlY3RvciAocmVmbGVjdGlvbi5GaWVsZC5kb2N1bWVudGF0aW9uKToKKyAgKzB4MjREOCB8IDAwIDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgfCAweDAwMDAwMDAwICgwKSAgICAgICAgICAgICAgICAgICAgIHwgbGVuZ3RoIG9mIHZlY3RvciAoIyBpdGVtcykKKwordmVjdG9yIChyZWZsZWN0aW9uLkZpZWxkLmF0dHJpYnV0ZXMpOgorICArMHgyNERDIHwgMDIgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICB8IDB4MDAwMDAwMDIgKDIpICAgICAgICAgICAgICAgICAgICAgfCBsZW5ndGggb2YgdmVjdG9yICgjIGl0ZW1zKQorICArMHgyNEUwIHwgMjQgMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDAwMjQgKDM2KSBMb2M6ICsweDI1MDQgICAgICAgfCBvZmZzZXQgdG8gdGFibGVbMF0KKyAgKzB4MjRFNCB8IDA0IDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMDA0ICg0KSBMb2M6ICsweDI0RTggICAgICAgIHwgb2Zmc2V0IHRvIHRhYmxlWzFdCisKK3RhYmxlIChyZWZsZWN0aW9uLktleVZhbHVlKToKKyAgKzB4MjRFOCB8IDg0IEVGIEZGIEZGICAgICAgICAgICAgIHwgU09mZnNldDMyICAgfCAweEZGRkZFRjg0ICgtNDIyMCkgTG9jOiArMHgzNTY0ICAgIHwgb2Zmc2V0IHRvIHZ0YWJsZQorICArMHgyNEVDIHwgMTAgMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDAwMTAgKDE2KSBMb2M6ICsweDI0RkMgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYGtleWAgKHN0cmluZykKKyAgKzB4MjRGMCB8IDA0IDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMDA0ICg0KSBMb2M6ICsweDI0RjQgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGB2YWx1ZWAgKHN0cmluZykKKworc3RyaW5nIChyZWZsZWN0aW9uLktleVZhbHVlLnZhbHVlKToKKyAgKzB4MjRGNCB8IDAyIDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgfCAweDAwMDAwMDAyICgyKSAgICAgICAgICAgICAgICAgICAgIHwgbGVuZ3RoIG9mIHN0cmluZworICArMHgyNEY4IHwgMzEgMzggICAgICAgICAgICAgICAgICAgfCBjaGFyWzJdICAgICB8IDE4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJpbmcgbGl0ZXJhbAorICArMHgyNEZBIHwgMDAgICAgICAgICAgICAgICAgICAgICAgfCBjaGFyICAgICAgICB8IDB4MDAgKDApICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJpbmcgdGVybWluYXRvcgorCitzdHJpbmcgKHJlZmxlY3Rpb24uS2V5VmFsdWUua2V5KToKKyAgKzB4MjRGQyB8IDAyIDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgfCAweDAwMDAwMDAyICgyKSAgICAgICAgICAgICAgICAgICAgIHwgbGVuZ3RoIG9mIHN0cmluZworICArMHgyNTAwIHwgNjkgNjQgICAgICAgICAgICAgICAgICAgfCBjaGFyWzJdICAgICB8IGlkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJpbmcgbGl0ZXJhbAorICArMHgyNTAyIHwgMDAgICAgICAgICAgICAgICAgICAgICAgfCBjaGFyICAgICAgICB8IDB4MDAgKDApICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJpbmcgdGVybWluYXRvcgorCit0YWJsZSAocmVmbGVjdGlvbi5LZXlWYWx1ZSk6CisgICsweDI1MDQgfCBBMCBFRiBGRiBGRiAgICAgICAgICAgICB8IFNPZmZzZXQzMiAgIHwgMHhGRkZGRUZBMCAoLTQxOTIpIExvYzogKzB4MzU2NCAgICB8IG9mZnNldCB0byB2dGFibGUKKyAgKzB4MjUwOCB8IDE0IDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMDE0ICgyMCkgTG9jOiArMHgyNTFDICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBrZXlgIChzdHJpbmcpCisgICsweDI1MEMgfCAwNCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDAwNCAoNCkgTG9jOiArMHgyNTEwICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgdmFsdWVgIChzdHJpbmcpCisKK3N0cmluZyAocmVmbGVjdGlvbi5LZXlWYWx1ZS52YWx1ZSk6CisgICsweDI1MTAgfCAwNyAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgIHwgMHgwMDAwMDAwNyAoNykgICAgICAgICAgICAgICAgICAgICB8IGxlbmd0aCBvZiBzdHJpbmcKKyAgKzB4MjUxNCB8IDY2IDZFIDc2IDMxIDVGIDM2IDM0ICAgIHwgY2hhcls3XSAgICAgfCBmbnYxXzY0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nIGxpdGVyYWwKKyAgKzB4MjUxQiB8IDAwICAgICAgICAgICAgICAgICAgICAgIHwgY2hhciAgICAgICAgfCAweDAwICgwKSAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nIHRlcm1pbmF0b3IKKworc3RyaW5nIChyZWZsZWN0aW9uLktleVZhbHVlLmtleSk6CisgICsweDI1MUMgfCAwNCAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgIHwgMHgwMDAwMDAwNCAoNCkgICAgICAgICAgICAgICAgICAgICB8IGxlbmd0aCBvZiBzdHJpbmcKKyAgKzB4MjUyMCB8IDY4IDYxIDczIDY4ICAgICAgICAgICAgIHwgY2hhcls0XSAgICAgfCBoYXNoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nIGxpdGVyYWwKKyAgKzB4MjUyNCB8IDAwICAgICAgICAgICAgICAgICAgICAgIHwgY2hhciAgICAgICAgfCAweDAwICgwKSAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nIHRlcm1pbmF0b3IKKworcGFkZGluZzoKKyAgKzB4MjUyNSB8IDAwIDAwIDAwICAgICAgICAgICAgICAgIHwgdWludDhfdFszXSAgfCAuLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgcGFkZGluZworCit0YWJsZSAocmVmbGVjdGlvbi5UeXBlKToKKyAgKzB4MjUyOCB8IDQ0IEVFIEZGIEZGICAgICAgICAgICAgIHwgU09mZnNldDMyICAgfCAweEZGRkZFRTQ0ICgtNDU0MCkgTG9jOiArMHgzNkU0ICAgIHwgb2Zmc2V0IHRvIHZ0YWJsZQorICArMHgyNTJDIHwgMDAgMDAgMDAgICAgICAgICAgICAgICAgfCB1aW50OF90WzNdICB8IC4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBwYWRkaW5nCisgICsweDI1MkYgfCAwOSAgICAgICAgICAgICAgICAgICAgICB8IHVpbnQ4X3QgICAgIHwgMHgwOSAoOSkgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHRhYmxlIGZpZWxkIGBiYXNlX3R5cGVgIChCeXRlKQorICArMHgyNTMwIHwgMDggMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICB8IDB4MDAwMDAwMDggKDgpICAgICAgICAgICAgICAgICAgICAgfCB0YWJsZSBmaWVsZCBgYmFzZV9zaXplYCAoVUludCkKKyAgKzB4MjUzNCB8IDAxIDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgfCAweDAwMDAwMDAxICgxKSAgICAgICAgICAgICAgICAgICAgIHwgdGFibGUgZmllbGQgYGVsZW1lbnRfc2l6ZWAgKFVJbnQpCisKK3N0cmluZyAocmVmbGVjdGlvbi5GaWVsZC5uYW1lKToKKyAgKzB4MjUzOCB8IDEwIDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgfCAweDAwMDAwMDEwICgxNikgICAgICAgICAgICAgICAgICAgIHwgbGVuZ3RoIG9mIHN0cmluZworICArMHgyNTNDIHwgNzQgNjUgNzMgNzQgNjggNjEgNzMgNjggfCBjaGFyWzE2XSAgICB8IHRlc3RoYXNoICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJpbmcgbGl0ZXJhbAorICArMHgyNTQ0IHwgNzMgMzYgMzQgNUYgNjYgNkUgNzYgMzEgfCAgICAgICAgICAgICB8IHM2NF9mbnYxCisgICsweDI1NEMgfCAwMCAgICAgICAgICAgICAgICAgICAgICB8IGNoYXIgICAgICAgIHwgMHgwMCAoMCkgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHN0cmluZyB0ZXJtaW5hdG9yCisKK3BhZGRpbmc6CisgICsweDI1NEQgfCAwMCAwMCAwMCAgICAgICAgICAgICAgICB8IHVpbnQ4X3RbM10gIHwgLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHBhZGRpbmcKKwordGFibGUgKHJlZmxlY3Rpb24uRmllbGQpOgorICArMHgyNTUwIHwgMTYgRkIgRkYgRkYgICAgICAgICAgICAgfCBTT2Zmc2V0MzIgICB8IDB4RkZGRkZCMTYgKC0xMjU4KSBMb2M6ICsweDJBM0EgICAgfCBvZmZzZXQgdG8gdnRhYmxlCisgICsweDI1NTQgfCAxMSAwMCAgICAgICAgICAgICAgICAgICB8IHVpbnQxNl90ICAgIHwgMHgwMDExICgxNykgICAgICAgICAgICAgICAgICAgICAgICB8IHRhYmxlIGZpZWxkIGBpZGAgKFVTaG9ydCkKKyAgKzB4MjU1NiB8IDI2IDAwICAgICAgICAgICAgICAgICAgIHwgdWludDE2X3QgICAgfCAweDAwMjYgKDM4KSAgICAgICAgICAgICAgICAgICAgICAgIHwgdGFibGUgZmllbGQgYG9mZnNldGAgKFVTaG9ydCkKKyAgKzB4MjU1OCB8IDZDIDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMDZDICgxMDgpIExvYzogKzB4MjVDNCAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBuYW1lYCAoc3RyaW5nKQorICArMHgyNTVDIHwgNUMgMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDAwNUMgKDkyKSBMb2M6ICsweDI1QjggICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYHR5cGVgICh0YWJsZSkKKyAgKzB4MjU2MCB8IDBDIDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMDBDICgxMikgTG9jOiArMHgyNTZDICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBhdHRyaWJ1dGVzYCAodmVjdG9yKQorICArMHgyNTY0IHwgMDQgMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDAwMDQgKDQpIExvYzogKzB4MjU2OCAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYGRvY3VtZW50YXRpb25gICh2ZWN0b3IpCisKK3ZlY3RvciAocmVmbGVjdGlvbi5GaWVsZC5kb2N1bWVudGF0aW9uKToKKyAgKzB4MjU2OCB8IDAwIDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgfCAweDAwMDAwMDAwICgwKSAgICAgICAgICAgICAgICAgICAgIHwgbGVuZ3RoIG9mIHZlY3RvciAoIyBpdGVtcykKKwordmVjdG9yIChyZWZsZWN0aW9uLkZpZWxkLmF0dHJpYnV0ZXMpOgorICArMHgyNTZDIHwgMDIgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICB8IDB4MDAwMDAwMDIgKDIpICAgICAgICAgICAgICAgICAgICAgfCBsZW5ndGggb2YgdmVjdG9yICgjIGl0ZW1zKQorICArMHgyNTcwIHwgMjQgMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDAwMjQgKDM2KSBMb2M6ICsweDI1OTQgICAgICAgfCBvZmZzZXQgdG8gdGFibGVbMF0KKyAgKzB4MjU3NCB8IDA0IDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMDA0ICg0KSBMb2M6ICsweDI1NzggICAgICAgIHwgb2Zmc2V0IHRvIHRhYmxlWzFdCisKK3RhYmxlIChyZWZsZWN0aW9uLktleVZhbHVlKToKKyAgKzB4MjU3OCB8IDE0IEYwIEZGIEZGICAgICAgICAgICAgIHwgU09mZnNldDMyICAgfCAweEZGRkZGMDE0ICgtNDA3NikgTG9jOiArMHgzNTY0ICAgIHwgb2Zmc2V0IHRvIHZ0YWJsZQorICArMHgyNTdDIHwgMTAgMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDAwMTAgKDE2KSBMb2M6ICsweDI1OEMgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYGtleWAgKHN0cmluZykKKyAgKzB4MjU4MCB8IDA0IDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMDA0ICg0KSBMb2M6ICsweDI1ODQgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGB2YWx1ZWAgKHN0cmluZykKKworc3RyaW5nIChyZWZsZWN0aW9uLktleVZhbHVlLnZhbHVlKToKKyAgKzB4MjU4NCB8IDAyIDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgfCAweDAwMDAwMDAyICgyKSAgICAgICAgICAgICAgICAgICAgIHwgbGVuZ3RoIG9mIHN0cmluZworICArMHgyNTg4IHwgMzEgMzcgICAgICAgICAgICAgICAgICAgfCBjaGFyWzJdICAgICB8IDE3ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJpbmcgbGl0ZXJhbAorICArMHgyNThBIHwgMDAgICAgICAgICAgICAgICAgICAgICAgfCBjaGFyICAgICAgICB8IDB4MDAgKDApICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJpbmcgdGVybWluYXRvcgorCitzdHJpbmcgKHJlZmxlY3Rpb24uS2V5VmFsdWUua2V5KToKKyAgKzB4MjU4QyB8IDAyIDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgfCAweDAwMDAwMDAyICgyKSAgICAgICAgICAgICAgICAgICAgIHwgbGVuZ3RoIG9mIHN0cmluZworICArMHgyNTkwIHwgNjkgNjQgICAgICAgICAgICAgICAgICAgfCBjaGFyWzJdICAgICB8IGlkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJpbmcgbGl0ZXJhbAorICArMHgyNTkyIHwgMDAgICAgICAgICAgICAgICAgICAgICAgfCBjaGFyICAgICAgICB8IDB4MDAgKDApICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJpbmcgdGVybWluYXRvcgorCit0YWJsZSAocmVmbGVjdGlvbi5LZXlWYWx1ZSk6CisgICsweDI1OTQgfCAzMCBGMCBGRiBGRiAgICAgICAgICAgICB8IFNPZmZzZXQzMiAgIHwgMHhGRkZGRjAzMCAoLTQwNDgpIExvYzogKzB4MzU2NCAgICB8IG9mZnNldCB0byB2dGFibGUKKyAgKzB4MjU5OCB8IDE0IDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMDE0ICgyMCkgTG9jOiArMHgyNUFDICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBrZXlgIChzdHJpbmcpCisgICsweDI1OUMgfCAwNCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDAwNCAoNCkgTG9jOiArMHgyNUEwICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgdmFsdWVgIChzdHJpbmcpCisKK3N0cmluZyAocmVmbGVjdGlvbi5LZXlWYWx1ZS52YWx1ZSk6CisgICsweDI1QTAgfCAwNyAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgIHwgMHgwMDAwMDAwNyAoNykgICAgICAgICAgICAgICAgICAgICB8IGxlbmd0aCBvZiBzdHJpbmcKKyAgKzB4MjVBNCB8IDY2IDZFIDc2IDMxIDVGIDMzIDMyICAgIHwgY2hhcls3XSAgICAgfCBmbnYxXzMyICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nIGxpdGVyYWwKKyAgKzB4MjVBQiB8IDAwICAgICAgICAgICAgICAgICAgICAgIHwgY2hhciAgICAgICAgfCAweDAwICgwKSAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nIHRlcm1pbmF0b3IKKworc3RyaW5nIChyZWZsZWN0aW9uLktleVZhbHVlLmtleSk6CisgICsweDI1QUMgfCAwNCAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgIHwgMHgwMDAwMDAwNCAoNCkgICAgICAgICAgICAgICAgICAgICB8IGxlbmd0aCBvZiBzdHJpbmcKKyAgKzB4MjVCMCB8IDY4IDYxIDczIDY4ICAgICAgICAgICAgIHwgY2hhcls0XSAgICAgfCBoYXNoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nIGxpdGVyYWwKKyAgKzB4MjVCNCB8IDAwICAgICAgICAgICAgICAgICAgICAgIHwgY2hhciAgICAgICAgfCAweDAwICgwKSAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nIHRlcm1pbmF0b3IKKworcGFkZGluZzoKKyAgKzB4MjVCNSB8IDAwIDAwIDAwICAgICAgICAgICAgICAgIHwgdWludDhfdFszXSAgfCAuLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgcGFkZGluZworCit0YWJsZSAocmVmbGVjdGlvbi5UeXBlKToKKyAgKzB4MjVCOCB8IDFDIEVDIEZGIEZGICAgICAgICAgICAgIHwgU09mZnNldDMyICAgfCAweEZGRkZFQzFDICgtNTA5MikgTG9jOiArMHgzOTlDICAgIHwgb2Zmc2V0IHRvIHZ0YWJsZQorICArMHgyNUJDIHwgMDAgMDAgMDAgICAgICAgICAgICAgICAgfCB1aW50OF90WzNdICB8IC4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBwYWRkaW5nCisgICsweDI1QkYgfCAwOCAgICAgICAgICAgICAgICAgICAgICB8IHVpbnQ4X3QgICAgIHwgMHgwOCAoOCkgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHRhYmxlIGZpZWxkIGBiYXNlX3R5cGVgIChCeXRlKQorICArMHgyNUMwIHwgMDEgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICB8IDB4MDAwMDAwMDEgKDEpICAgICAgICAgICAgICAgICAgICAgfCB0YWJsZSBmaWVsZCBgZWxlbWVudF9zaXplYCAoVUludCkKKworc3RyaW5nIChyZWZsZWN0aW9uLkZpZWxkLm5hbWUpOgorICArMHgyNUM0IHwgMTAgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICB8IDB4MDAwMDAwMTAgKDE2KSAgICAgICAgICAgICAgICAgICAgfCBsZW5ndGggb2Ygc3RyaW5nCisgICsweDI1QzggfCA3NCA2NSA3MyA3NCA2OCA2MSA3MyA2OCB8IGNoYXJbMTZdICAgIHwgdGVzdGhhc2ggICAgICAgICAgICAgICAgICAgICAgICAgICB8IHN0cmluZyBsaXRlcmFsCisgICsweDI1RDAgfCA3NSAzMyAzMiA1RiA2NiA2RSA3NiAzMSB8ICAgICAgICAgICAgIHwgdTMyX2ZudjEKKyAgKzB4MjVEOCB8IDAwICAgICAgICAgICAgICAgICAgICAgIHwgY2hhciAgICAgICAgfCAweDAwICgwKSAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nIHRlcm1pbmF0b3IKKworcGFkZGluZzoKKyAgKzB4MjVEOSB8IDAwIDAwIDAwICAgICAgICAgICAgICAgIHwgdWludDhfdFszXSAgfCAuLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgcGFkZGluZworCit0YWJsZSAocmVmbGVjdGlvbi5GaWVsZCk6CisgICsweDI1REMgfCBBMiBGQiBGRiBGRiAgICAgICAgICAgICB8IFNPZmZzZXQzMiAgIHwgMHhGRkZGRkJBMiAoLTExMTgpIExvYzogKzB4MkEzQSAgICB8IG9mZnNldCB0byB2dGFibGUKKyAgKzB4MjVFMCB8IDEwIDAwICAgICAgICAgICAgICAgICAgIHwgdWludDE2X3QgICAgfCAweDAwMTAgKDE2KSAgICAgICAgICAgICAgICAgICAgICAgIHwgdGFibGUgZmllbGQgYGlkYCAoVVNob3J0KQorICArMHgyNUUyIHwgMjQgMDAgICAgICAgICAgICAgICAgICAgfCB1aW50MTZfdCAgICB8IDB4MDAyNCAoMzYpICAgICAgICAgICAgICAgICAgICAgICAgfCB0YWJsZSBmaWVsZCBgb2Zmc2V0YCAoVVNob3J0KQorICArMHgyNUU0IHwgNkMgMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDAwNkMgKDEwOCkgTG9jOiArMHgyNjUwICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYG5hbWVgIChzdHJpbmcpCisgICsweDI1RTggfCA1QyAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDA1QyAoOTIpIExvYzogKzB4MjY0NCAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgdHlwZWAgKHRhYmxlKQorICArMHgyNUVDIHwgMEMgMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDAwMEMgKDEyKSBMb2M6ICsweDI1RjggICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYGF0dHJpYnV0ZXNgICh2ZWN0b3IpCisgICsweDI1RjAgfCAwNCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDAwNCAoNCkgTG9jOiArMHgyNUY0ICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgZG9jdW1lbnRhdGlvbmAgKHZlY3RvcikKKwordmVjdG9yIChyZWZsZWN0aW9uLkZpZWxkLmRvY3VtZW50YXRpb24pOgorICArMHgyNUY0IHwgMDAgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICB8IDB4MDAwMDAwMDAgKDApICAgICAgICAgICAgICAgICAgICAgfCBsZW5ndGggb2YgdmVjdG9yICgjIGl0ZW1zKQorCit2ZWN0b3IgKHJlZmxlY3Rpb24uRmllbGQuYXR0cmlidXRlcyk6CisgICsweDI1RjggfCAwMiAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgIHwgMHgwMDAwMDAwMiAoMikgICAgICAgICAgICAgICAgICAgICB8IGxlbmd0aCBvZiB2ZWN0b3IgKCMgaXRlbXMpCisgICsweDI1RkMgfCAyNCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDAyNCAoMzYpIExvYzogKzB4MjYyMCAgICAgICB8IG9mZnNldCB0byB0YWJsZVswXQorICArMHgyNjAwIHwgMDQgMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDAwMDQgKDQpIExvYzogKzB4MjYwNCAgICAgICAgfCBvZmZzZXQgdG8gdGFibGVbMV0KKwordGFibGUgKHJlZmxlY3Rpb24uS2V5VmFsdWUpOgorICArMHgyNjA0IHwgQTAgRjAgRkYgRkYgICAgICAgICAgICAgfCBTT2Zmc2V0MzIgICB8IDB4RkZGRkYwQTAgKC0zOTM2KSBMb2M6ICsweDM1NjQgICAgfCBvZmZzZXQgdG8gdnRhYmxlCisgICsweDI2MDggfCAxMCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDAxMCAoMTYpIExvYzogKzB4MjYxOCAgICAgICB8IG9mZnNldCB0byBmaWVsZCBga2V5YCAoc3RyaW5nKQorICArMHgyNjBDIHwgMDQgMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDAwMDQgKDQpIExvYzogKzB4MjYxMCAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYHZhbHVlYCAoc3RyaW5nKQorCitzdHJpbmcgKHJlZmxlY3Rpb24uS2V5VmFsdWUudmFsdWUpOgorICArMHgyNjEwIHwgMDIgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICB8IDB4MDAwMDAwMDIgKDIpICAgICAgICAgICAgICAgICAgICAgfCBsZW5ndGggb2Ygc3RyaW5nCisgICsweDI2MTQgfCAzMSAzNiAgICAgICAgICAgICAgICAgICB8IGNoYXJbMl0gICAgIHwgMTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHN0cmluZyBsaXRlcmFsCisgICsweDI2MTYgfCAwMCAgICAgICAgICAgICAgICAgICAgICB8IGNoYXIgICAgICAgIHwgMHgwMCAoMCkgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHN0cmluZyB0ZXJtaW5hdG9yCisKK3N0cmluZyAocmVmbGVjdGlvbi5LZXlWYWx1ZS5rZXkpOgorICArMHgyNjE4IHwgMDIgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICB8IDB4MDAwMDAwMDIgKDIpICAgICAgICAgICAgICAgICAgICAgfCBsZW5ndGggb2Ygc3RyaW5nCisgICsweDI2MUMgfCA2OSA2NCAgICAgICAgICAgICAgICAgICB8IGNoYXJbMl0gICAgIHwgaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHN0cmluZyBsaXRlcmFsCisgICsweDI2MUUgfCAwMCAgICAgICAgICAgICAgICAgICAgICB8IGNoYXIgICAgICAgIHwgMHgwMCAoMCkgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHN0cmluZyB0ZXJtaW5hdG9yCisKK3RhYmxlIChyZWZsZWN0aW9uLktleVZhbHVlKToKKyAgKzB4MjYyMCB8IEJDIEYwIEZGIEZGICAgICAgICAgICAgIHwgU09mZnNldDMyICAgfCAweEZGRkZGMEJDICgtMzkwOCkgTG9jOiArMHgzNTY0ICAgIHwgb2Zmc2V0IHRvIHZ0YWJsZQorICArMHgyNjI0IHwgMTQgMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDAwMTQgKDIwKSBMb2M6ICsweDI2MzggICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYGtleWAgKHN0cmluZykKKyAgKzB4MjYyOCB8IDA0IDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMDA0ICg0KSBMb2M6ICsweDI2MkMgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGB2YWx1ZWAgKHN0cmluZykKKworc3RyaW5nIChyZWZsZWN0aW9uLktleVZhbHVlLnZhbHVlKToKKyAgKzB4MjYyQyB8IDA3IDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgfCAweDAwMDAwMDA3ICg3KSAgICAgICAgICAgICAgICAgICAgIHwgbGVuZ3RoIG9mIHN0cmluZworICArMHgyNjMwIHwgNjYgNkUgNzYgMzEgNUYgMzMgMzIgICAgfCBjaGFyWzddICAgICB8IGZudjFfMzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJpbmcgbGl0ZXJhbAorICArMHgyNjM3IHwgMDAgICAgICAgICAgICAgICAgICAgICAgfCBjaGFyICAgICAgICB8IDB4MDAgKDApICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJpbmcgdGVybWluYXRvcgorCitzdHJpbmcgKHJlZmxlY3Rpb24uS2V5VmFsdWUua2V5KToKKyAgKzB4MjYzOCB8IDA0IDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgfCAweDAwMDAwMDA0ICg0KSAgICAgICAgICAgICAgICAgICAgIHwgbGVuZ3RoIG9mIHN0cmluZworICArMHgyNjNDIHwgNjggNjEgNzMgNjggICAgICAgICAgICAgfCBjaGFyWzRdICAgICB8IGhhc2ggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJpbmcgbGl0ZXJhbAorICArMHgyNjQwIHwgMDAgICAgICAgICAgICAgICAgICAgICAgfCBjaGFyICAgICAgICB8IDB4MDAgKDApICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJpbmcgdGVybWluYXRvcgorCitwYWRkaW5nOgorICArMHgyNjQxIHwgMDAgMDAgMDAgICAgICAgICAgICAgICAgfCB1aW50OF90WzNdICB8IC4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBwYWRkaW5nCisKK3RhYmxlIChyZWZsZWN0aW9uLlR5cGUpOgorICArMHgyNjQ0IHwgQTggRUMgRkYgRkYgICAgICAgICAgICAgfCBTT2Zmc2V0MzIgICB8IDB4RkZGRkVDQTggKC00OTUyKSBMb2M6ICsweDM5OUMgICAgfCBvZmZzZXQgdG8gdnRhYmxlCisgICsweDI2NDggfCAwMCAwMCAwMCAgICAgICAgICAgICAgICB8IHVpbnQ4X3RbM10gIHwgLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHBhZGRpbmcKKyAgKzB4MjY0QiB8IDA3ICAgICAgICAgICAgICAgICAgICAgIHwgdWludDhfdCAgICAgfCAweDA3ICg3KSAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgdGFibGUgZmllbGQgYGJhc2VfdHlwZWAgKEJ5dGUpCisgICsweDI2NEMgfCAwMSAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgIHwgMHgwMDAwMDAwMSAoMSkgICAgICAgICAgICAgICAgICAgICB8IHRhYmxlIGZpZWxkIGBlbGVtZW50X3NpemVgIChVSW50KQorCitzdHJpbmcgKHJlZmxlY3Rpb24uRmllbGQubmFtZSk6CisgICsweDI2NTAgfCAxMCAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgIHwgMHgwMDAwMDAxMCAoMTYpICAgICAgICAgICAgICAgICAgICB8IGxlbmd0aCBvZiBzdHJpbmcKKyAgKzB4MjY1NCB8IDc0IDY1IDczIDc0IDY4IDYxIDczIDY4IHwgY2hhclsxNl0gICAgfCB0ZXN0aGFzaCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nIGxpdGVyYWwKKyAgKzB4MjY1QyB8IDczIDMzIDMyIDVGIDY2IDZFIDc2IDMxIHwgICAgICAgICAgICAgfCBzMzJfZm52MQorICArMHgyNjY0IHwgMDAgICAgICAgICAgICAgICAgICAgICAgfCBjaGFyICAgICAgICB8IDB4MDAgKDApICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJpbmcgdGVybWluYXRvcgorCitwYWRkaW5nOgorICArMHgyNjY1IHwgMDAgMDAgMDAgICAgICAgICAgICAgICAgfCB1aW50OF90WzNdICB8IC4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBwYWRkaW5nCisKK3RhYmxlIChyZWZsZWN0aW9uLkZpZWxkKToKKyAgKzB4MjY2OCB8IDJFIEZDIEZGIEZGICAgICAgICAgICAgIHwgU09mZnNldDMyICAgfCAweEZGRkZGQzJFICgtOTc4KSBMb2M6ICsweDJBM0EgICAgIHwgb2Zmc2V0IHRvIHZ0YWJsZQorICArMHgyNjZDIHwgMEYgMDAgICAgICAgICAgICAgICAgICAgfCB1aW50MTZfdCAgICB8IDB4MDAwRiAoMTUpICAgICAgICAgICAgICAgICAgICAgICAgfCB0YWJsZSBmaWVsZCBgaWRgIChVU2hvcnQpCisgICsweDI2NkUgfCAyMiAwMCAgICAgICAgICAgICAgICAgICB8IHVpbnQxNl90ICAgIHwgMHgwMDIyICgzNCkgICAgICAgICAgICAgICAgICAgICAgICB8IHRhYmxlIGZpZWxkIGBvZmZzZXRgIChVU2hvcnQpCisgICsweDI2NzAgfCA0OCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDA0OCAoNzIpIExvYzogKzB4MjZCOCAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgbmFtZWAgKHN0cmluZykKKyAgKzB4MjY3NCB8IDM0IDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMDM0ICg1MikgTG9jOiArMHgyNkE4ICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGB0eXBlYCAodGFibGUpCisgICsweDI2NzggfCAwQyAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDAwQyAoMTIpIExvYzogKzB4MjY4NCAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgYXR0cmlidXRlc2AgKHZlY3RvcikKKyAgKzB4MjY3QyB8IDA0IDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMDA0ICg0KSBMb2M6ICsweDI2ODAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBkb2N1bWVudGF0aW9uYCAodmVjdG9yKQorCit2ZWN0b3IgKHJlZmxlY3Rpb24uRmllbGQuZG9jdW1lbnRhdGlvbik6CisgICsweDI2ODAgfCAwMCAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgIHwgMHgwMDAwMDAwMCAoMCkgICAgICAgICAgICAgICAgICAgICB8IGxlbmd0aCBvZiB2ZWN0b3IgKCMgaXRlbXMpCisKK3ZlY3RvciAocmVmbGVjdGlvbi5GaWVsZC5hdHRyaWJ1dGVzKToKKyAgKzB4MjY4NCB8IDAxIDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgfCAweDAwMDAwMDAxICgxKSAgICAgICAgICAgICAgICAgICAgIHwgbGVuZ3RoIG9mIHZlY3RvciAoIyBpdGVtcykKKyAgKzB4MjY4OCB8IDA0IDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMDA0ICg0KSBMb2M6ICsweDI2OEMgICAgICAgIHwgb2Zmc2V0IHRvIHRhYmxlWzBdCisKK3RhYmxlIChyZWZsZWN0aW9uLktleVZhbHVlKToKKyAgKzB4MjY4QyB8IDI4IEYxIEZGIEZGICAgICAgICAgICAgIHwgU09mZnNldDMyICAgfCAweEZGRkZGMTI4ICgtMzgwMCkgTG9jOiArMHgzNTY0ICAgIHwgb2Zmc2V0IHRvIHZ0YWJsZQorICArMHgyNjkwIHwgMTAgMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDAwMTAgKDE2KSBMb2M6ICsweDI2QTAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYGtleWAgKHN0cmluZykKKyAgKzB4MjY5NCB8IDA0IDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMDA0ICg0KSBMb2M6ICsweDI2OTggICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGB2YWx1ZWAgKHN0cmluZykKKworc3RyaW5nIChyZWZsZWN0aW9uLktleVZhbHVlLnZhbHVlKToKKyAgKzB4MjY5OCB8IDAyIDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgfCAweDAwMDAwMDAyICgyKSAgICAgICAgICAgICAgICAgICAgIHwgbGVuZ3RoIG9mIHN0cmluZworICArMHgyNjlDIHwgMzEgMzUgICAgICAgICAgICAgICAgICAgfCBjaGFyWzJdICAgICB8IDE1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJpbmcgbGl0ZXJhbAorICArMHgyNjlFIHwgMDAgICAgICAgICAgICAgICAgICAgICAgfCBjaGFyICAgICAgICB8IDB4MDAgKDApICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJpbmcgdGVybWluYXRvcgorCitzdHJpbmcgKHJlZmxlY3Rpb24uS2V5VmFsdWUua2V5KToKKyAgKzB4MjZBMCB8IDAyIDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgfCAweDAwMDAwMDAyICgyKSAgICAgICAgICAgICAgICAgICAgIHwgbGVuZ3RoIG9mIHN0cmluZworICArMHgyNkE0IHwgNjkgNjQgICAgICAgICAgICAgICAgICAgfCBjaGFyWzJdICAgICB8IGlkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJpbmcgbGl0ZXJhbAorICArMHgyNkE2IHwgMDAgICAgICAgICAgICAgICAgICAgICAgfCBjaGFyICAgICAgICB8IDB4MDAgKDApICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJpbmcgdGVybWluYXRvcgorCit0YWJsZSAocmVmbGVjdGlvbi5UeXBlKToKKyAgKzB4MjZBOCB8IEM0IEVGIEZGIEZGICAgICAgICAgICAgIHwgU09mZnNldDMyICAgfCAweEZGRkZFRkM0ICgtNDE1NikgTG9jOiArMHgzNkU0ICAgIHwgb2Zmc2V0IHRvIHZ0YWJsZQorICArMHgyNkFDIHwgMDAgMDAgMDAgICAgICAgICAgICAgICAgfCB1aW50OF90WzNdICB8IC4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBwYWRkaW5nCisgICsweDI2QUYgfCAwMiAgICAgICAgICAgICAgICAgICAgICB8IHVpbnQ4X3QgICAgIHwgMHgwMiAoMikgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHRhYmxlIGZpZWxkIGBiYXNlX3R5cGVgIChCeXRlKQorICArMHgyNkIwIHwgMDEgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICB8IDB4MDAwMDAwMDEgKDEpICAgICAgICAgICAgICAgICAgICAgfCB0YWJsZSBmaWVsZCBgYmFzZV9zaXplYCAoVUludCkKKyAgKzB4MjZCNCB8IDAxIDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgfCAweDAwMDAwMDAxICgxKSAgICAgICAgICAgICAgICAgICAgIHwgdGFibGUgZmllbGQgYGVsZW1lbnRfc2l6ZWAgKFVJbnQpCisKK3N0cmluZyAocmVmbGVjdGlvbi5GaWVsZC5uYW1lKToKKyAgKzB4MjZCOCB8IDA4IDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgfCAweDAwMDAwMDA4ICg4KSAgICAgICAgICAgICAgICAgICAgIHwgbGVuZ3RoIG9mIHN0cmluZworICArMHgyNkJDIHwgNzQgNjUgNzMgNzQgNjIgNkYgNkYgNkMgfCBjaGFyWzhdICAgICB8IHRlc3Rib29sICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJpbmcgbGl0ZXJhbAorICArMHgyNkM0IHwgMDAgICAgICAgICAgICAgICAgICAgICAgfCBjaGFyICAgICAgICB8IDB4MDAgKDApICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJpbmcgdGVybWluYXRvcgorCitwYWRkaW5nOgorICArMHgyNkM1IHwgMDAgMDAgMDAgICAgICAgICAgICAgICAgfCB1aW50OF90WzNdICB8IC4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBwYWRkaW5nCisKK3RhYmxlIChyZWZsZWN0aW9uLkZpZWxkKToKKyAgKzB4MjZDOCB8IEE0IEZCIEZGIEZGICAgICAgICAgICAgIHwgU09mZnNldDMyICAgfCAweEZGRkZGQkE0ICgtMTExNikgTG9jOiArMHgyQjI0ICAgIHwgb2Zmc2V0IHRvIHZ0YWJsZQorICArMHgyNkNDIHwgMDAgMDAgMDAgICAgICAgICAgICAgICAgfCB1aW50OF90WzNdICB8IC4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBwYWRkaW5nCisgICsweDI2Q0YgfCAwMSAgICAgICAgICAgICAgICAgICAgICB8IHVpbnQ4X3QgICAgIHwgMHgwMSAoMSkgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHRhYmxlIGZpZWxkIGBvcHRpb25hbGAgKEJvb2wpCisgICsweDI2RDAgfCAwRSAwMCAgICAgICAgICAgICAgICAgICB8IHVpbnQxNl90ICAgIHwgMHgwMDBFICgxNCkgICAgICAgICAgICAgICAgICAgICAgICB8IHRhYmxlIGZpZWxkIGBpZGAgKFVTaG9ydCkKKyAgKzB4MjZEMiB8IDIwIDAwICAgICAgICAgICAgICAgICAgIHwgdWludDE2X3QgICAgfCAweDAwMjAgKDMyKSAgICAgICAgICAgICAgICAgICAgICAgIHwgdGFibGUgZmllbGQgYG9mZnNldGAgKFVTaG9ydCkKKyAgKzB4MjZENCB8IDQ4IDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMDQ4ICg3MikgTG9jOiArMHgyNzFDICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBuYW1lYCAoc3RyaW5nKQorICArMHgyNkQ4IHwgMzQgMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDAwMzQgKDUyKSBMb2M6ICsweDI3MEMgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYHR5cGVgICh0YWJsZSkKKyAgKzB4MjZEQyB8IDBDIDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMDBDICgxMikgTG9jOiArMHgyNkU4ICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBhdHRyaWJ1dGVzYCAodmVjdG9yKQorICArMHgyNkUwIHwgMDQgMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDAwMDQgKDQpIExvYzogKzB4MjZFNCAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYGRvY3VtZW50YXRpb25gICh2ZWN0b3IpCisKK3ZlY3RvciAocmVmbGVjdGlvbi5GaWVsZC5kb2N1bWVudGF0aW9uKToKKyAgKzB4MjZFNCB8IDAwIDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgfCAweDAwMDAwMDAwICgwKSAgICAgICAgICAgICAgICAgICAgIHwgbGVuZ3RoIG9mIHZlY3RvciAoIyBpdGVtcykKKwordmVjdG9yIChyZWZsZWN0aW9uLkZpZWxkLmF0dHJpYnV0ZXMpOgorICArMHgyNkU4IHwgMDEgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICB8IDB4MDAwMDAwMDEgKDEpICAgICAgICAgICAgICAgICAgICAgfCBsZW5ndGggb2YgdmVjdG9yICgjIGl0ZW1zKQorICArMHgyNkVDIHwgMDQgMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDAwMDQgKDQpIExvYzogKzB4MjZGMCAgICAgICAgfCBvZmZzZXQgdG8gdGFibGVbMF0KKwordGFibGUgKHJlZmxlY3Rpb24uS2V5VmFsdWUpOgorICArMHgyNkYwIHwgOEMgRjEgRkYgRkYgICAgICAgICAgICAgfCBTT2Zmc2V0MzIgICB8IDB4RkZGRkYxOEMgKC0zNzAwKSBMb2M6ICsweDM1NjQgICAgfCBvZmZzZXQgdG8gdnRhYmxlCisgICsweDI2RjQgfCAxMCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDAxMCAoMTYpIExvYzogKzB4MjcwNCAgICAgICB8IG9mZnNldCB0byBmaWVsZCBga2V5YCAoc3RyaW5nKQorICArMHgyNkY4IHwgMDQgMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDAwMDQgKDQpIExvYzogKzB4MjZGQyAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYHZhbHVlYCAoc3RyaW5nKQorCitzdHJpbmcgKHJlZmxlY3Rpb24uS2V5VmFsdWUudmFsdWUpOgorICArMHgyNkZDIHwgMDIgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICB8IDB4MDAwMDAwMDIgKDIpICAgICAgICAgICAgICAgICAgICAgfCBsZW5ndGggb2Ygc3RyaW5nCisgICsweDI3MDAgfCAzMSAzNCAgICAgICAgICAgICAgICAgICB8IGNoYXJbMl0gICAgIHwgMTQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHN0cmluZyBsaXRlcmFsCisgICsweDI3MDIgfCAwMCAgICAgICAgICAgICAgICAgICAgICB8IGNoYXIgICAgICAgIHwgMHgwMCAoMCkgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHN0cmluZyB0ZXJtaW5hdG9yCisKK3N0cmluZyAocmVmbGVjdGlvbi5LZXlWYWx1ZS5rZXkpOgorICArMHgyNzA0IHwgMDIgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICB8IDB4MDAwMDAwMDIgKDIpICAgICAgICAgICAgICAgICAgICAgfCBsZW5ndGggb2Ygc3RyaW5nCisgICsweDI3MDggfCA2OSA2NCAgICAgICAgICAgICAgICAgICB8IGNoYXJbMl0gICAgIHwgaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHN0cmluZyBsaXRlcmFsCisgICsweDI3MEEgfCAwMCAgICAgICAgICAgICAgICAgICAgICB8IGNoYXIgICAgICAgIHwgMHgwMCAoMCkgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHN0cmluZyB0ZXJtaW5hdG9yCisKK3RhYmxlIChyZWZsZWN0aW9uLlR5cGUpOgorICArMHgyNzBDIHwgNTQgRUUgRkYgRkYgICAgICAgICAgICAgfCBTT2Zmc2V0MzIgICB8IDB4RkZGRkVFNTQgKC00NTI0KSBMb2M6ICsweDM4QjggICAgfCBvZmZzZXQgdG8gdnRhYmxlCisgICsweDI3MTAgfCAwMCAwMCAwMCAgICAgICAgICAgICAgICB8IHVpbnQ4X3RbM10gIHwgLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHBhZGRpbmcKKyAgKzB4MjcxMyB8IDBGICAgICAgICAgICAgICAgICAgICAgIHwgdWludDhfdCAgICAgfCAweDBGICgxNSkgICAgICAgICAgICAgICAgICAgICAgICAgIHwgdGFibGUgZmllbGQgYGJhc2VfdHlwZWAgKEJ5dGUpCisgICsweDI3MTQgfCAwMyAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgIHwgMHgwMDAwMDAwMyAoMykgICAgICAgICAgICAgICAgICAgICB8IHRhYmxlIGZpZWxkIGBpbmRleGAgKEludCkKKyAgKzB4MjcxOCB8IDAxIDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgfCAweDAwMDAwMDAxICgxKSAgICAgICAgICAgICAgICAgICAgIHwgdGFibGUgZmllbGQgYGVsZW1lbnRfc2l6ZWAgKFVJbnQpCisKK3N0cmluZyAocmVmbGVjdGlvbi5GaWVsZC5uYW1lKToKKyAgKzB4MjcxQyB8IDA5IDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgfCAweDAwMDAwMDA5ICg5KSAgICAgICAgICAgICAgICAgICAgIHwgbGVuZ3RoIG9mIHN0cmluZworICArMHgyNzIwIHwgNzQgNjUgNzMgNzQgNjUgNkQgNzAgNzQgfCBjaGFyWzldICAgICB8IHRlc3RlbXB0ICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJpbmcgbGl0ZXJhbAorICArMHgyNzI4IHwgNzkgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICB8IHkKKyAgKzB4MjcyOSB8IDAwICAgICAgICAgICAgICAgICAgICAgIHwgY2hhciAgICAgICAgfCAweDAwICgwKSAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nIHRlcm1pbmF0b3IKKworcGFkZGluZzoKKyAgKzB4MjcyQSB8IDAwIDAwICAgICAgICAgICAgICAgICAgIHwgdWludDhfdFsyXSAgfCAuLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgcGFkZGluZworCit0YWJsZSAocmVmbGVjdGlvbi5GaWVsZCk6CisgICsweDI3MkMgfCAwOCBGQyBGRiBGRiAgICAgICAgICAgICB8IFNPZmZzZXQzMiAgIHwgMHhGRkZGRkMwOCAoLTEwMTYpIExvYzogKzB4MkIyNCAgICB8IG9mZnNldCB0byB2dGFibGUKKyAgKzB4MjczMCB8IDAwIDAwIDAwICAgICAgICAgICAgICAgIHwgdWludDhfdFszXSAgfCAuLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgcGFkZGluZworICArMHgyNzMzIHwgMDEgICAgICAgICAgICAgICAgICAgICAgfCB1aW50OF90ICAgICB8IDB4MDEgKDEpICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB0YWJsZSBmaWVsZCBgb3B0aW9uYWxgIChCb29sKQorICArMHgyNzM0IHwgMEQgMDAgICAgICAgICAgICAgICAgICAgfCB1aW50MTZfdCAgICB8IDB4MDAwRCAoMTMpICAgICAgICAgICAgICAgICAgICAgICAgfCB0YWJsZSBmaWVsZCBgaWRgIChVU2hvcnQpCisgICsweDI3MzYgfCAxRSAwMCAgICAgICAgICAgICAgICAgICB8IHVpbnQxNl90ICAgIHwgMHgwMDFFICgzMCkgICAgICAgICAgICAgICAgICAgICAgICB8IHRhYmxlIGZpZWxkIGBvZmZzZXRgIChVU2hvcnQpCisgICsweDI3MzggfCA3OCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDA3OCAoMTIwKSBMb2M6ICsweDI3QjAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgbmFtZWAgKHN0cmluZykKKyAgKzB4MjczQyB8IDY4IDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMDY4ICgxMDQpIExvYzogKzB4MjdBNCAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGB0eXBlYCAodGFibGUpCisgICsweDI3NDAgfCAwQyAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDAwQyAoMTIpIExvYzogKzB4Mjc0QyAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgYXR0cmlidXRlc2AgKHZlY3RvcikKKyAgKzB4Mjc0NCB8IDA0IDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMDA0ICg0KSBMb2M6ICsweDI3NDggICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBkb2N1bWVudGF0aW9uYCAodmVjdG9yKQorCit2ZWN0b3IgKHJlZmxlY3Rpb24uRmllbGQuZG9jdW1lbnRhdGlvbik6CisgICsweDI3NDggfCAwMCAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgIHwgMHgwMDAwMDAwMCAoMCkgICAgICAgICAgICAgICAgICAgICB8IGxlbmd0aCBvZiB2ZWN0b3IgKCMgaXRlbXMpCisKK3ZlY3RvciAocmVmbGVjdGlvbi5GaWVsZC5hdHRyaWJ1dGVzKToKKyAgKzB4Mjc0QyB8IDAyIDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgfCAweDAwMDAwMDAyICgyKSAgICAgICAgICAgICAgICAgICAgIHwgbGVuZ3RoIG9mIHZlY3RvciAoIyBpdGVtcykKKyAgKzB4Mjc1MCB8IDM4IDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMDM4ICg1NikgTG9jOiArMHgyNzg4ICAgICAgIHwgb2Zmc2V0IHRvIHRhYmxlWzBdCisgICsweDI3NTQgfCAwNCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDAwNCAoNCkgTG9jOiArMHgyNzU4ICAgICAgICB8IG9mZnNldCB0byB0YWJsZVsxXQorCit0YWJsZSAocmVmbGVjdGlvbi5LZXlWYWx1ZSk6CisgICsweDI3NTggfCBGNCBGMSBGRiBGRiAgICAgICAgICAgICB8IFNPZmZzZXQzMiAgIHwgMHhGRkZGRjFGNCAoLTM1OTYpIExvYzogKzB4MzU2NCAgICB8IG9mZnNldCB0byB2dGFibGUKKyAgKzB4Mjc1QyB8IDE0IDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMDE0ICgyMCkgTG9jOiArMHgyNzcwICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBrZXlgIChzdHJpbmcpCisgICsweDI3NjAgfCAwNCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDAwNCAoNCkgTG9jOiArMHgyNzY0ICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgdmFsdWVgIChzdHJpbmcpCisKK3N0cmluZyAocmVmbGVjdGlvbi5LZXlWYWx1ZS52YWx1ZSk6CisgICsweDI3NjQgfCAwNyAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgIHwgMHgwMDAwMDAwNyAoNykgICAgICAgICAgICAgICAgICAgICB8IGxlbmd0aCBvZiBzdHJpbmcKKyAgKzB4Mjc2OCB8IDREIDZGIDZFIDczIDc0IDY1IDcyICAgIHwgY2hhcls3XSAgICAgfCBNb25zdGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nIGxpdGVyYWwKKyAgKzB4Mjc2RiB8IDAwICAgICAgICAgICAgICAgICAgICAgIHwgY2hhciAgICAgICAgfCAweDAwICgwKSAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nIHRlcm1pbmF0b3IKKworc3RyaW5nIChyZWZsZWN0aW9uLktleVZhbHVlLmtleSk6CisgICsweDI3NzAgfCAxMSAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgIHwgMHgwMDAwMDAxMSAoMTcpICAgICAgICAgICAgICAgICAgICB8IGxlbmd0aCBvZiBzdHJpbmcKKyAgKzB4Mjc3NCB8IDZFIDY1IDczIDc0IDY1IDY0IDVGIDY2IHwgY2hhclsxN10gICAgfCBuZXN0ZWRfZiAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nIGxpdGVyYWwKKyAgKzB4Mjc3QyB8IDZDIDYxIDc0IDYyIDc1IDY2IDY2IDY1IHwgICAgICAgICAgICAgfCBsYXRidWZmZQorICArMHgyNzg0IHwgNzIgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICB8IHIKKyAgKzB4Mjc4NSB8IDAwICAgICAgICAgICAgICAgICAgICAgIHwgY2hhciAgICAgICAgfCAweDAwICgwKSAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nIHRlcm1pbmF0b3IKKworcGFkZGluZzoKKyAgKzB4Mjc4NiB8IDAwIDAwICAgICAgICAgICAgICAgICAgIHwgdWludDhfdFsyXSAgfCAuLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgcGFkZGluZworCit0YWJsZSAocmVmbGVjdGlvbi5LZXlWYWx1ZSk6CisgICsweDI3ODggfCAyNCBGMiBGRiBGRiAgICAgICAgICAgICB8IFNPZmZzZXQzMiAgIHwgMHhGRkZGRjIyNCAoLTM1NDgpIExvYzogKzB4MzU2NCAgICB8IG9mZnNldCB0byB2dGFibGUKKyAgKzB4Mjc4QyB8IDEwIDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMDEwICgxNikgTG9jOiArMHgyNzlDICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBrZXlgIChzdHJpbmcpCisgICsweDI3OTAgfCAwNCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDAwNCAoNCkgTG9jOiArMHgyNzk0ICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgdmFsdWVgIChzdHJpbmcpCisKK3N0cmluZyAocmVmbGVjdGlvbi5LZXlWYWx1ZS52YWx1ZSk6CisgICsweDI3OTQgfCAwMiAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgIHwgMHgwMDAwMDAwMiAoMikgICAgICAgICAgICAgICAgICAgICB8IGxlbmd0aCBvZiBzdHJpbmcKKyAgKzB4Mjc5OCB8IDMxIDMzICAgICAgICAgICAgICAgICAgIHwgY2hhclsyXSAgICAgfCAxMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nIGxpdGVyYWwKKyAgKzB4Mjc5QSB8IDAwICAgICAgICAgICAgICAgICAgICAgIHwgY2hhciAgICAgICAgfCAweDAwICgwKSAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nIHRlcm1pbmF0b3IKKworc3RyaW5nIChyZWZsZWN0aW9uLktleVZhbHVlLmtleSk6CisgICsweDI3OUMgfCAwMiAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgIHwgMHgwMDAwMDAwMiAoMikgICAgICAgICAgICAgICAgICAgICB8IGxlbmd0aCBvZiBzdHJpbmcKKyAgKzB4MjdBMCB8IDY5IDY0ICAgICAgICAgICAgICAgICAgIHwgY2hhclsyXSAgICAgfCBpZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nIGxpdGVyYWwKKyAgKzB4MjdBMiB8IDAwICAgICAgICAgICAgICAgICAgICAgIHwgY2hhciAgICAgICAgfCAweDAwICgwKSAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nIHRlcm1pbmF0b3IKKwordGFibGUgKHJlZmxlY3Rpb24uVHlwZSk6CisgICsweDI3QTQgfCAyMCBGQyBGRiBGRiAgICAgICAgICAgICB8IFNPZmZzZXQzMiAgIHwgMHhGRkZGRkMyMCAoLTk5MikgTG9jOiArMHgyQjg0ICAgICB8IG9mZnNldCB0byB2dGFibGUKKyAgKzB4MjdBOCB8IDAwIDAwICAgICAgICAgICAgICAgICAgIHwgdWludDhfdFsyXSAgfCAuLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgcGFkZGluZworICArMHgyN0FBIHwgMEUgICAgICAgICAgICAgICAgICAgICAgfCB1aW50OF90ICAgICB8IDB4MEUgKDE0KSAgICAgICAgICAgICAgICAgICAgICAgICAgfCB0YWJsZSBmaWVsZCBgYmFzZV90eXBlYCAoQnl0ZSkKKyAgKzB4MjdBQiB8IDA0ICAgICAgICAgICAgICAgICAgICAgIHwgdWludDhfdCAgICAgfCAweDA0ICg0KSAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgdGFibGUgZmllbGQgYGVsZW1lbnRgIChCeXRlKQorICArMHgyN0FDIHwgMDEgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICB8IDB4MDAwMDAwMDEgKDEpICAgICAgICAgICAgICAgICAgICAgfCB0YWJsZSBmaWVsZCBgZWxlbWVudF9zaXplYCAoVUludCkKKworc3RyaW5nIChyZWZsZWN0aW9uLkZpZWxkLm5hbWUpOgorICArMHgyN0IwIHwgMTQgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICB8IDB4MDAwMDAwMTQgKDIwKSAgICAgICAgICAgICAgICAgICAgfCBsZW5ndGggb2Ygc3RyaW5nCisgICsweDI3QjQgfCA3NCA2NSA3MyA3NCA2RSA2NSA3MyA3NCB8IGNoYXJbMjBdICAgIHwgdGVzdG5lc3QgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHN0cmluZyBsaXRlcmFsCisgICsweDI3QkMgfCA2NSA2NCA2NiA2QyA2MSA3NCA2MiA3NSB8ICAgICAgICAgICAgIHwgZWRmbGF0YnUKKyAgKzB4MjdDNCB8IDY2IDY2IDY1IDcyICAgICAgICAgICAgIHwgICAgICAgICAgICAgfCBmZmVyCisgICsweDI3QzggfCAwMCAgICAgICAgICAgICAgICAgICAgICB8IGNoYXIgICAgICAgIHwgMHgwMCAoMCkgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHN0cmluZyB0ZXJtaW5hdG9yCisKK3BhZGRpbmc6CisgICsweDI3QzkgfCAwMCAwMCAwMCAgICAgICAgICAgICAgICB8IHVpbnQ4X3RbM10gIHwgLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHBhZGRpbmcKKwordGFibGUgKHJlZmxlY3Rpb24uRmllbGQpOgorICArMHgyN0NDIHwgQTggRkMgRkYgRkYgICAgICAgICAgICAgfCBTT2Zmc2V0MzIgICB8IDB4RkZGRkZDQTggKC04NTYpIExvYzogKzB4MkIyNCAgICAgfCBvZmZzZXQgdG8gdnRhYmxlCisgICsweDI3RDAgfCAwMCAwMCAwMCAgICAgICAgICAgICAgICB8IHVpbnQ4X3RbM10gIHwgLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHBhZGRpbmcKKyAgKzB4MjdEMyB8IDAxICAgICAgICAgICAgICAgICAgICAgIHwgdWludDhfdCAgICAgfCAweDAxICgxKSAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgdGFibGUgZmllbGQgYG9wdGlvbmFsYCAoQm9vbCkKKyAgKzB4MjdENCB8IDBDIDAwICAgICAgICAgICAgICAgICAgIHwgdWludDE2X3QgICAgfCAweDAwMEMgKDEyKSAgICAgICAgICAgICAgICAgICAgICAgIHwgdGFibGUgZmllbGQgYGlkYCAoVVNob3J0KQorICArMHgyN0Q2IHwgMUMgMDAgICAgICAgICAgICAgICAgICAgfCB1aW50MTZfdCAgICB8IDB4MDAxQyAoMjgpICAgICAgICAgICAgICAgICAgICAgICAgfCB0YWJsZSBmaWVsZCBgb2Zmc2V0YCAoVVNob3J0KQorICArMHgyN0Q4IHwgNDggMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDAwNDggKDcyKSBMb2M6ICsweDI4MjAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYG5hbWVgIChzdHJpbmcpCisgICsweDI3REMgfCAzNCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDAzNCAoNTIpIExvYzogKzB4MjgxMCAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgdHlwZWAgKHRhYmxlKQorICArMHgyN0UwIHwgMEMgMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDAwMEMgKDEyKSBMb2M6ICsweDI3RUMgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYGF0dHJpYnV0ZXNgICh2ZWN0b3IpCisgICsweDI3RTQgfCAwNCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDAwNCAoNCkgTG9jOiArMHgyN0U4ICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgZG9jdW1lbnRhdGlvbmAgKHZlY3RvcikKKwordmVjdG9yIChyZWZsZWN0aW9uLkZpZWxkLmRvY3VtZW50YXRpb24pOgorICArMHgyN0U4IHwgMDAgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICB8IDB4MDAwMDAwMDAgKDApICAgICAgICAgICAgICAgICAgICAgfCBsZW5ndGggb2YgdmVjdG9yICgjIGl0ZW1zKQorCit2ZWN0b3IgKHJlZmxlY3Rpb24uRmllbGQuYXR0cmlidXRlcyk6CisgICsweDI3RUMgfCAwMSAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgIHwgMHgwMDAwMDAwMSAoMSkgICAgICAgICAgICAgICAgICAgICB8IGxlbmd0aCBvZiB2ZWN0b3IgKCMgaXRlbXMpCisgICsweDI3RjAgfCAwNCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDAwNCAoNCkgTG9jOiArMHgyN0Y0ICAgICAgICB8IG9mZnNldCB0byB0YWJsZVswXQorCit0YWJsZSAocmVmbGVjdGlvbi5LZXlWYWx1ZSk6CisgICsweDI3RjQgfCA5MCBGMiBGRiBGRiAgICAgICAgICAgICB8IFNPZmZzZXQzMiAgIHwgMHhGRkZGRjI5MCAoLTM0NDApIExvYzogKzB4MzU2NCAgICB8IG9mZnNldCB0byB2dGFibGUKKyAgKzB4MjdGOCB8IDEwIDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMDEwICgxNikgTG9jOiArMHgyODA4ICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBrZXlgIChzdHJpbmcpCisgICsweDI3RkMgfCAwNCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDAwNCAoNCkgTG9jOiArMHgyODAwICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgdmFsdWVgIChzdHJpbmcpCisKK3N0cmluZyAocmVmbGVjdGlvbi5LZXlWYWx1ZS52YWx1ZSk6CisgICsweDI4MDAgfCAwMiAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgIHwgMHgwMDAwMDAwMiAoMikgICAgICAgICAgICAgICAgICAgICB8IGxlbmd0aCBvZiBzdHJpbmcKKyAgKzB4MjgwNCB8IDMxIDMyICAgICAgICAgICAgICAgICAgIHwgY2hhclsyXSAgICAgfCAxMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nIGxpdGVyYWwKKyAgKzB4MjgwNiB8IDAwICAgICAgICAgICAgICAgICAgICAgIHwgY2hhciAgICAgICAgfCAweDAwICgwKSAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nIHRlcm1pbmF0b3IKKworc3RyaW5nIChyZWZsZWN0aW9uLktleVZhbHVlLmtleSk6CisgICsweDI4MDggfCAwMiAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgIHwgMHgwMDAwMDAwMiAoMikgICAgICAgICAgICAgICAgICAgICB8IGxlbmd0aCBvZiBzdHJpbmcKKyAgKzB4MjgwQyB8IDY5IDY0ICAgICAgICAgICAgICAgICAgIHwgY2hhclsyXSAgICAgfCBpZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nIGxpdGVyYWwKKyAgKzB4MjgwRSB8IDAwICAgICAgICAgICAgICAgICAgICAgIHwgY2hhciAgICAgICAgfCAweDAwICgwKSAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nIHRlcm1pbmF0b3IKKwordGFibGUgKHJlZmxlY3Rpb24uVHlwZSk6CisgICsweDI4MTAgfCA1OCBFRiBGRiBGRiAgICAgICAgICAgICB8IFNPZmZzZXQzMiAgIHwgMHhGRkZGRUY1OCAoLTQyNjQpIExvYzogKzB4MzhCOCAgICB8IG9mZnNldCB0byB2dGFibGUKKyAgKzB4MjgxNCB8IDAwIDAwIDAwICAgICAgICAgICAgICAgIHwgdWludDhfdFszXSAgfCAuLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgcGFkZGluZworICArMHgyODE3IHwgMEYgICAgICAgICAgICAgICAgICAgICAgfCB1aW50OF90ICAgICB8IDB4MEYgKDE1KSAgICAgICAgICAgICAgICAgICAgICAgICAgfCB0YWJsZSBmaWVsZCBgYmFzZV90eXBlYCAoQnl0ZSkKKyAgKzB4MjgxOCB8IDAxIDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgfCAweDAwMDAwMDAxICgxKSAgICAgICAgICAgICAgICAgICAgIHwgdGFibGUgZmllbGQgYGluZGV4YCAoSW50KQorICArMHgyODFDIHwgMDEgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICB8IDB4MDAwMDAwMDEgKDEpICAgICAgICAgICAgICAgICAgICAgfCB0YWJsZSBmaWVsZCBgZWxlbWVudF9zaXplYCAoVUludCkKKworc3RyaW5nIChyZWZsZWN0aW9uLkZpZWxkLm5hbWUpOgorICArMHgyODIwIHwgMDUgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICB8IDB4MDAwMDAwMDUgKDUpICAgICAgICAgICAgICAgICAgICAgfCBsZW5ndGggb2Ygc3RyaW5nCisgICsweDI4MjQgfCA2NSA2RSA2NSA2RCA3OSAgICAgICAgICB8IGNoYXJbNV0gICAgIHwgZW5lbXkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHN0cmluZyBsaXRlcmFsCisgICsweDI4MjkgfCAwMCAgICAgICAgICAgICAgICAgICAgICB8IGNoYXIgICAgICAgIHwgMHgwMCAoMCkgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHN0cmluZyB0ZXJtaW5hdG9yCisKK3BhZGRpbmc6CisgICsweDI4MkEgfCAwMCAwMCAgICAgICAgICAgICAgICAgICB8IHVpbnQ4X3RbMl0gIHwgLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHBhZGRpbmcKKwordGFibGUgKHJlZmxlY3Rpb24uRmllbGQpOgorICArMHgyODJDIHwgMDggRkQgRkYgRkYgICAgICAgICAgICAgfCBTT2Zmc2V0MzIgICB8IDB4RkZGRkZEMDggKC03NjApIExvYzogKzB4MkIyNCAgICAgfCBvZmZzZXQgdG8gdnRhYmxlCisgICsweDI4MzAgfCAwMCAwMCAwMCAgICAgICAgICAgICAgICB8IHVpbnQ4X3RbM10gIHwgLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHBhZGRpbmcKKyAgKzB4MjgzMyB8IDAxICAgICAgICAgICAgICAgICAgICAgIHwgdWludDhfdCAgICAgfCAweDAxICgxKSAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgdGFibGUgZmllbGQgYG9wdGlvbmFsYCAoQm9vbCkKKyAgKzB4MjgzNCB8IDBCIDAwICAgICAgICAgICAgICAgICAgIHwgdWludDE2X3QgICAgfCAweDAwMEIgKDExKSAgICAgICAgICAgICAgICAgICAgICAgIHwgdGFibGUgZmllbGQgYGlkYCAoVVNob3J0KQorICArMHgyODM2IHwgMUEgMDAgICAgICAgICAgICAgICAgICAgfCB1aW50MTZfdCAgICB8IDB4MDAxQSAoMjYpICAgICAgICAgICAgICAgICAgICAgICAgfCB0YWJsZSBmaWVsZCBgb2Zmc2V0YCAoVVNob3J0KQorICArMHgyODM4IHwgQjQgMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDAwQjQgKDE4MCkgTG9jOiArMHgyOEVDICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYG5hbWVgIChzdHJpbmcpCisgICsweDI4M0MgfCBBMCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDBBMCAoMTYwKSBMb2M6ICsweDI4REMgICAgICB8IG9mZnNldCB0byBmaWVsZCBgdHlwZWAgKHRhYmxlKQorICArMHgyODQwIHwgNzggMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDAwNzggKDEyMCkgTG9jOiArMHgyOEI4ICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYGF0dHJpYnV0ZXNgICh2ZWN0b3IpCisgICsweDI4NDQgfCAwNCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDAwNCAoNCkgTG9jOiArMHgyODQ4ICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgZG9jdW1lbnRhdGlvbmAgKHZlY3RvcikKKwordmVjdG9yIChyZWZsZWN0aW9uLkZpZWxkLmRvY3VtZW50YXRpb24pOgorICArMHgyODQ4IHwgMDIgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICB8IDB4MDAwMDAwMDIgKDIpICAgICAgICAgICAgICAgICAgICAgfCBsZW5ndGggb2YgdmVjdG9yICgjIGl0ZW1zKQorICArMHgyODRDIHwgMUMgMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDAwMUMgKDI4KSBMb2M6ICsweDI4NjggICAgICAgfCBvZmZzZXQgdG8gc3RyaW5nWzBdCisgICsweDI4NTAgfCAwNCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDAwNCAoNCkgTG9jOiArMHgyODU0ICAgICAgICB8IG9mZnNldCB0byBzdHJpbmdbMV0KKworc3RyaW5nIChyZWZsZWN0aW9uLkZpZWxkLmRvY3VtZW50YXRpb24pOgorICArMHgyODU0IHwgMEUgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICB8IDB4MDAwMDAwMEUgKDE0KSAgICAgICAgICAgICAgICAgICAgfCBsZW5ndGggb2Ygc3RyaW5nCisgICsweDI4NTggfCAyMCA2RCA3NSA2QyA3NCA2OSA2QyA2OSB8IGNoYXJbMTRdICAgIHwgIG11bHRpbGkgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHN0cmluZyBsaXRlcmFsCisgICsweDI4NjAgfCA2RSA2NSAyMCA3NCA2RiA2RiAgICAgICB8ICAgICAgICAgICAgIHwgbmUgdG9vCisgICsweDI4NjYgfCAwMCAgICAgICAgICAgICAgICAgICAgICB8IGNoYXIgICAgICAgIHwgMHgwMCAoMCkgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHN0cmluZyB0ZXJtaW5hdG9yCisKK3N0cmluZyAocmVmbGVjdGlvbi5GaWVsZC5kb2N1bWVudGF0aW9uKToKKyAgKzB4Mjg2OCB8IDQ5IDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgfCAweDAwMDAwMDQ5ICg3MykgICAgICAgICAgICAgICAgICAgIHwgbGVuZ3RoIG9mIHN0cmluZworICArMHgyODZDIHwgMjAgNjEgNkUgMjAgNjUgNzggNjEgNkQgfCBjaGFyWzczXSAgICB8ICBhbiBleGFtICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJpbmcgbGl0ZXJhbAorICArMHgyODc0IHwgNzAgNkMgNjUgMjAgNjQgNkYgNjMgNzUgfCAgICAgICAgICAgICB8IHBsZSBkb2N1CisgICsweDI4N0MgfCA2RCA2NSA2RSA3NCA2MSA3NCA2OSA2RiB8ICAgICAgICAgICAgIHwgbWVudGF0aW8KKyAgKzB4Mjg4NCB8IDZFIDIwIDYzIDZGIDZEIDZEIDY1IDZFIHwgICAgICAgICAgICAgfCBuIGNvbW1lbgorICArMHgyODhDIHwgNzQgM0EgMjAgNzQgNjggNjkgNzMgMjAgfCAgICAgICAgICAgICB8IHQ6IHRoaXMgCisgICsweDI4OTQgfCA3NyA2OSA2QyA2QyAyMCA2NSA2RSA2NCB8ICAgICAgICAgICAgIHwgd2lsbCBlbmQKKyAgKzB4Mjg5QyB8IDIwIDc1IDcwIDIwIDY5IDZFIDIwIDc0IHwgICAgICAgICAgICAgfCAgdXAgaW4gdAorICArMHgyOEE0IHwgNjggNjUgMjAgNjcgNjUgNkUgNjUgNzIgfCAgICAgICAgICAgICB8IGhlIGdlbmVyCisgICsweDI4QUMgfCA2MSA3NCA2NSA2NCAyMCA2MyA2RiA2NCB8ICAgICAgICAgICAgIHwgYXRlZCBjb2QKKyAgKzB4MjhCNCB8IDY1ICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgfCBlCisgICsweDI4QjUgfCAwMCAgICAgICAgICAgICAgICAgICAgICB8IGNoYXIgICAgICAgIHwgMHgwMCAoMCkgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHN0cmluZyB0ZXJtaW5hdG9yCisKK3BhZGRpbmc6CisgICsweDI4QjYgfCAwMCAwMCAgICAgICAgICAgICAgICAgICB8IHVpbnQ4X3RbMl0gIHwgLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHBhZGRpbmcKKwordmVjdG9yIChyZWZsZWN0aW9uLkZpZWxkLmF0dHJpYnV0ZXMpOgorICArMHgyOEI4IHwgMDEgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICB8IDB4MDAwMDAwMDEgKDEpICAgICAgICAgICAgICAgICAgICAgfCBsZW5ndGggb2YgdmVjdG9yICgjIGl0ZW1zKQorICArMHgyOEJDIHwgMDQgMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDAwMDQgKDQpIExvYzogKzB4MjhDMCAgICAgICAgfCBvZmZzZXQgdG8gdGFibGVbMF0KKwordGFibGUgKHJlZmxlY3Rpb24uS2V5VmFsdWUpOgorICArMHgyOEMwIHwgNUMgRjMgRkYgRkYgICAgICAgICAgICAgfCBTT2Zmc2V0MzIgICB8IDB4RkZGRkYzNUMgKC0zMjM2KSBMb2M6ICsweDM1NjQgICAgfCBvZmZzZXQgdG8gdnRhYmxlCisgICsweDI4QzQgfCAxMCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDAxMCAoMTYpIExvYzogKzB4MjhENCAgICAgICB8IG9mZnNldCB0byBmaWVsZCBga2V5YCAoc3RyaW5nKQorICArMHgyOEM4IHwgMDQgMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDAwMDQgKDQpIExvYzogKzB4MjhDQyAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYHZhbHVlYCAoc3RyaW5nKQorCitzdHJpbmcgKHJlZmxlY3Rpb24uS2V5VmFsdWUudmFsdWUpOgorICArMHgyOENDIHwgMDIgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICB8IDB4MDAwMDAwMDIgKDIpICAgICAgICAgICAgICAgICAgICAgfCBsZW5ndGggb2Ygc3RyaW5nCisgICsweDI4RDAgfCAzMSAzMSAgICAgICAgICAgICAgICAgICB8IGNoYXJbMl0gICAgIHwgMTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHN0cmluZyBsaXRlcmFsCisgICsweDI4RDIgfCAwMCAgICAgICAgICAgICAgICAgICAgICB8IGNoYXIgICAgICAgIHwgMHgwMCAoMCkgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHN0cmluZyB0ZXJtaW5hdG9yCisKK3N0cmluZyAocmVmbGVjdGlvbi5LZXlWYWx1ZS5rZXkpOgorICArMHgyOEQ0IHwgMDIgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICB8IDB4MDAwMDAwMDIgKDIpICAgICAgICAgICAgICAgICAgICAgfCBsZW5ndGggb2Ygc3RyaW5nCisgICsweDI4RDggfCA2OSA2NCAgICAgICAgICAgICAgICAgICB8IGNoYXJbMl0gICAgIHwgaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHN0cmluZyBsaXRlcmFsCisgICsweDI4REEgfCAwMCAgICAgICAgICAgICAgICAgICAgICB8IGNoYXIgICAgICAgIHwgMHgwMCAoMCkgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHN0cmluZyB0ZXJtaW5hdG9yCisKK3RhYmxlIChyZWZsZWN0aW9uLlR5cGUpOgorICArMHgyOERDIHwgMkMgRkYgRkYgRkYgICAgICAgICAgICAgfCBTT2Zmc2V0MzIgICB8IDB4RkZGRkZGMkMgKC0yMTIpIExvYzogKzB4MjlCMCAgICAgfCBvZmZzZXQgdG8gdnRhYmxlCisgICsweDI4RTAgfCAwMCAwMCAgICAgICAgICAgICAgICAgICB8IHVpbnQ4X3RbMl0gIHwgLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHBhZGRpbmcKKyAgKzB4MjhFMiB8IDBFICAgICAgICAgICAgICAgICAgICAgIHwgdWludDhfdCAgICAgfCAweDBFICgxNCkgICAgICAgICAgICAgICAgICAgICAgICAgIHwgdGFibGUgZmllbGQgYGJhc2VfdHlwZWAgKEJ5dGUpCisgICsweDI4RTMgfCAwRiAgICAgICAgICAgICAgICAgICAgICB8IHVpbnQ4X3QgICAgIHwgMHgwRiAoMTUpICAgICAgICAgICAgICAgICAgICAgICAgICB8IHRhYmxlIGZpZWxkIGBlbGVtZW50YCAoQnl0ZSkKKyAgKzB4MjhFNCB8IDAxIDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgfCAweDAwMDAwMDAxICgxKSAgICAgICAgICAgICAgICAgICAgIHwgdGFibGUgZmllbGQgYGluZGV4YCAoSW50KQorICArMHgyOEU4IHwgMDQgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICB8IDB4MDAwMDAwMDQgKDQpICAgICAgICAgICAgICAgICAgICAgfCB0YWJsZSBmaWVsZCBgZWxlbWVudF9zaXplYCAoVUludCkKKworc3RyaW5nIChyZWZsZWN0aW9uLkZpZWxkLm5hbWUpOgorICArMHgyOEVDIHwgMTEgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICB8IDB4MDAwMDAwMTEgKDE3KSAgICAgICAgICAgICAgICAgICAgfCBsZW5ndGggb2Ygc3RyaW5nCisgICsweDI4RjAgfCA3NCA2NSA3MyA3NCA2MSA3MiA3MiA2MSB8IGNoYXJbMTddICAgIHwgdGVzdGFycmEgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHN0cmluZyBsaXRlcmFsCisgICsweDI4RjggfCA3OSA2RiA2NiA3NCA2MSA2MiA2QyA2NSB8ICAgICAgICAgICAgIHwgeW9mdGFibGUKKyAgKzB4MjkwMCB8IDczICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgfCBzCisgICsweDI5MDEgfCAwMCAgICAgICAgICAgICAgICAgICAgICB8IGNoYXIgICAgICAgIHwgMHgwMCAoMCkgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHN0cmluZyB0ZXJtaW5hdG9yCisKK3BhZGRpbmc6CisgICsweDI5MDIgfCAwMCAwMCAgICAgICAgICAgICAgICAgICB8IHVpbnQ4X3RbMl0gIHwgLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHBhZGRpbmcKKwordGFibGUgKHJlZmxlY3Rpb24uRmllbGQpOgorICArMHgyOTA0IHwgRTAgRkQgRkYgRkYgICAgICAgICAgICAgfCBTT2Zmc2V0MzIgICB8IDB4RkZGRkZERTAgKC01NDQpIExvYzogKzB4MkIyNCAgICAgfCBvZmZzZXQgdG8gdnRhYmxlCisgICsweDI5MDggfCAwMCAwMCAwMCAgICAgICAgICAgICAgICB8IHVpbnQ4X3RbM10gIHwgLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHBhZGRpbmcKKyAgKzB4MjkwQiB8IDAxICAgICAgICAgICAgICAgICAgICAgIHwgdWludDhfdCAgICAgfCAweDAxICgxKSAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgdGFibGUgZmllbGQgYG9wdGlvbmFsYCAoQm9vbCkKKyAgKzB4MjkwQyB8IDBBIDAwICAgICAgICAgICAgICAgICAgIHwgdWludDE2X3QgICAgfCAweDAwMEEgKDEwKSAgICAgICAgICAgICAgICAgICAgICAgIHwgdGFibGUgZmllbGQgYGlkYCAoVVNob3J0KQorICArMHgyOTBFIHwgMTggMDAgICAgICAgICAgICAgICAgICAgfCB1aW50MTZfdCAgICB8IDB4MDAxOCAoMjQpICAgICAgICAgICAgICAgICAgICAgICAgfCB0YWJsZSBmaWVsZCBgb2Zmc2V0YCAoVVNob3J0KQorICArMHgyOTEwIHwgNDQgMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDAwNDQgKDY4KSBMb2M6ICsweDI5NTQgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYG5hbWVgIChzdHJpbmcpCisgICsweDI5MTQgfCAzNCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDAzNCAoNTIpIExvYzogKzB4Mjk0OCAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgdHlwZWAgKHRhYmxlKQorICArMHgyOTE4IHwgMEMgMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDAwMEMgKDEyKSBMb2M6ICsweDI5MjQgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYGF0dHJpYnV0ZXNgICh2ZWN0b3IpCisgICsweDI5MUMgfCAwNCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDAwNCAoNCkgTG9jOiArMHgyOTIwICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgZG9jdW1lbnRhdGlvbmAgKHZlY3RvcikKKwordmVjdG9yIChyZWZsZWN0aW9uLkZpZWxkLmRvY3VtZW50YXRpb24pOgorICArMHgyOTIwIHwgMDAgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICB8IDB4MDAwMDAwMDAgKDApICAgICAgICAgICAgICAgICAgICAgfCBsZW5ndGggb2YgdmVjdG9yICgjIGl0ZW1zKQorCit2ZWN0b3IgKHJlZmxlY3Rpb24uRmllbGQuYXR0cmlidXRlcyk6CisgICsweDI5MjQgfCAwMSAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgIHwgMHgwMDAwMDAwMSAoMSkgICAgICAgICAgICAgICAgICAgICB8IGxlbmd0aCBvZiB2ZWN0b3IgKCMgaXRlbXMpCisgICsweDI5MjggfCAwNCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDAwNCAoNCkgTG9jOiArMHgyOTJDICAgICAgICB8IG9mZnNldCB0byB0YWJsZVswXQorCit0YWJsZSAocmVmbGVjdGlvbi5LZXlWYWx1ZSk6CisgICsweDI5MkMgfCBDOCBGMyBGRiBGRiAgICAgICAgICAgICB8IFNPZmZzZXQzMiAgIHwgMHhGRkZGRjNDOCAoLTMxMjgpIExvYzogKzB4MzU2NCAgICB8IG9mZnNldCB0byB2dGFibGUKKyAgKzB4MjkzMCB8IDEwIDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMDEwICgxNikgTG9jOiArMHgyOTQwICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBrZXlgIChzdHJpbmcpCisgICsweDI5MzQgfCAwNCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDAwNCAoNCkgTG9jOiArMHgyOTM4ICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgdmFsdWVgIChzdHJpbmcpCisKK3N0cmluZyAocmVmbGVjdGlvbi5LZXlWYWx1ZS52YWx1ZSk6CisgICsweDI5MzggfCAwMiAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgIHwgMHgwMDAwMDAwMiAoMikgICAgICAgICAgICAgICAgICAgICB8IGxlbmd0aCBvZiBzdHJpbmcKKyAgKzB4MjkzQyB8IDMxIDMwICAgICAgICAgICAgICAgICAgIHwgY2hhclsyXSAgICAgfCAxMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nIGxpdGVyYWwKKyAgKzB4MjkzRSB8IDAwICAgICAgICAgICAgICAgICAgICAgIHwgY2hhciAgICAgICAgfCAweDAwICgwKSAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nIHRlcm1pbmF0b3IKKworc3RyaW5nIChyZWZsZWN0aW9uLktleVZhbHVlLmtleSk6CisgICsweDI5NDAgfCAwMiAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgIHwgMHgwMDAwMDAwMiAoMikgICAgICAgICAgICAgICAgICAgICB8IGxlbmd0aCBvZiBzdHJpbmcKKyAgKzB4Mjk0NCB8IDY5IDY0ICAgICAgICAgICAgICAgICAgIHwgY2hhclsyXSAgICAgfCBpZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nIGxpdGVyYWwKKyAgKzB4Mjk0NiB8IDAwICAgICAgICAgICAgICAgICAgICAgIHwgY2hhciAgICAgICAgfCAweDAwICgwKSAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nIHRlcm1pbmF0b3IKKwordGFibGUgKHJlZmxlY3Rpb24uVHlwZSk6CisgICsweDI5NDggfCBDNCBGRCBGRiBGRiAgICAgICAgICAgICB8IFNPZmZzZXQzMiAgIHwgMHhGRkZGRkRDNCAoLTU3MikgTG9jOiArMHgyQjg0ICAgICB8IG9mZnNldCB0byB2dGFibGUKKyAgKzB4Mjk0QyB8IDAwIDAwICAgICAgICAgICAgICAgICAgIHwgdWludDhfdFsyXSAgfCAuLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgcGFkZGluZworICArMHgyOTRFIHwgMEUgICAgICAgICAgICAgICAgICAgICAgfCB1aW50OF90ICAgICB8IDB4MEUgKDE0KSAgICAgICAgICAgICAgICAgICAgICAgICAgfCB0YWJsZSBmaWVsZCBgYmFzZV90eXBlYCAoQnl0ZSkKKyAgKzB4Mjk0RiB8IDBEICAgICAgICAgICAgICAgICAgICAgIHwgdWludDhfdCAgICAgfCAweDBEICgxMykgICAgICAgICAgICAgICAgICAgICAgICAgIHwgdGFibGUgZmllbGQgYGVsZW1lbnRgIChCeXRlKQorICArMHgyOTUwIHwgMDQgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICB8IDB4MDAwMDAwMDQgKDQpICAgICAgICAgICAgICAgICAgICAgfCB0YWJsZSBmaWVsZCBgZWxlbWVudF9zaXplYCAoVUludCkKKworc3RyaW5nIChyZWZsZWN0aW9uLkZpZWxkLm5hbWUpOgorICArMHgyOTU0IHwgMTEgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICB8IDB4MDAwMDAwMTEgKDE3KSAgICAgICAgICAgICAgICAgICAgfCBsZW5ndGggb2Ygc3RyaW5nCisgICsweDI5NTggfCA3NCA2NSA3MyA3NCA2MSA3MiA3MiA2MSB8IGNoYXJbMTddICAgIHwgdGVzdGFycmEgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHN0cmluZyBsaXRlcmFsCisgICsweDI5NjAgfCA3OSA2RiA2NiA3MyA3NCA3MiA2OSA2RSB8ICAgICAgICAgICAgIHwgeW9mc3RyaW4KKyAgKzB4Mjk2OCB8IDY3ICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgfCBnCisgICsweDI5NjkgfCAwMCAgICAgICAgICAgICAgICAgICAgICB8IGNoYXIgICAgICAgIHwgMHgwMCAoMCkgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHN0cmluZyB0ZXJtaW5hdG9yCisKK3BhZGRpbmc6CisgICsweDI5NkEgfCAwMCAwMCAgICAgICAgICAgICAgICAgICB8IHVpbnQ4X3RbMl0gIHwgLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHBhZGRpbmcKKwordGFibGUgKHJlZmxlY3Rpb24uRmllbGQpOgorICArMHgyOTZDIHwgNDggRkUgRkYgRkYgICAgICAgICAgICAgfCBTT2Zmc2V0MzIgICB8IDB4RkZGRkZFNDggKC00NDApIExvYzogKzB4MkIyNCAgICAgfCBvZmZzZXQgdG8gdnRhYmxlCisgICsweDI5NzAgfCAwMCAwMCAwMCAgICAgICAgICAgICAgICB8IHVpbnQ4X3RbM10gIHwgLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHBhZGRpbmcKKyAgKzB4Mjk3MyB8IDAxICAgICAgICAgICAgICAgICAgICAgIHwgdWludDhfdCAgICAgfCAweDAxICgxKSAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgdGFibGUgZmllbGQgYG9wdGlvbmFsYCAoQm9vbCkKKyAgKzB4Mjk3NCB8IDA5IDAwICAgICAgICAgICAgICAgICAgIHwgdWludDE2X3QgICAgfCAweDAwMDkgKDkpICAgICAgICAgICAgICAgICAgICAgICAgIHwgdGFibGUgZmllbGQgYGlkYCAoVVNob3J0KQorICArMHgyOTc2IHwgMTYgMDAgICAgICAgICAgICAgICAgICAgfCB1aW50MTZfdCAgICB8IDB4MDAxNiAoMjIpICAgICAgICAgICAgICAgICAgICAgICAgfCB0YWJsZSBmaWVsZCBgb2Zmc2V0YCAoVVNob3J0KQorICArMHgyOTc4IHwgNTggMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDAwNTggKDg4KSBMb2M6ICsweDI5RDAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYG5hbWVgIChzdHJpbmcpCisgICsweDI5N0MgfCA0NCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDA0NCAoNjgpIExvYzogKzB4MjlDMCAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgdHlwZWAgKHRhYmxlKQorICArMHgyOTgwIHwgMEMgMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDAwMEMgKDEyKSBMb2M6ICsweDI5OEMgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYGF0dHJpYnV0ZXNgICh2ZWN0b3IpCisgICsweDI5ODQgfCAwNCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDAwNCAoNCkgTG9jOiArMHgyOTg4ICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgZG9jdW1lbnRhdGlvbmAgKHZlY3RvcikKKwordmVjdG9yIChyZWZsZWN0aW9uLkZpZWxkLmRvY3VtZW50YXRpb24pOgorICArMHgyOTg4IHwgMDAgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICB8IDB4MDAwMDAwMDAgKDApICAgICAgICAgICAgICAgICAgICAgfCBsZW5ndGggb2YgdmVjdG9yICgjIGl0ZW1zKQorCit2ZWN0b3IgKHJlZmxlY3Rpb24uRmllbGQuYXR0cmlidXRlcyk6CisgICsweDI5OEMgfCAwMSAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgIHwgMHgwMDAwMDAwMSAoMSkgICAgICAgICAgICAgICAgICAgICB8IGxlbmd0aCBvZiB2ZWN0b3IgKCMgaXRlbXMpCisgICsweDI5OTAgfCAwNCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDAwNCAoNCkgTG9jOiArMHgyOTk0ICAgICAgICB8IG9mZnNldCB0byB0YWJsZVswXQorCit0YWJsZSAocmVmbGVjdGlvbi5LZXlWYWx1ZSk6CisgICsweDI5OTQgfCAzMCBGNCBGRiBGRiAgICAgICAgICAgICB8IFNPZmZzZXQzMiAgIHwgMHhGRkZGRjQzMCAoLTMwMjQpIExvYzogKzB4MzU2NCAgICB8IG9mZnNldCB0byB2dGFibGUKKyAgKzB4Mjk5OCB8IDEwIDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMDEwICgxNikgTG9jOiArMHgyOUE4ICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBrZXlgIChzdHJpbmcpCisgICsweDI5OUMgfCAwNCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDAwNCAoNCkgTG9jOiArMHgyOUEwICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgdmFsdWVgIChzdHJpbmcpCisKK3N0cmluZyAocmVmbGVjdGlvbi5LZXlWYWx1ZS52YWx1ZSk6CisgICsweDI5QTAgfCAwMSAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgIHwgMHgwMDAwMDAwMSAoMSkgICAgICAgICAgICAgICAgICAgICB8IGxlbmd0aCBvZiBzdHJpbmcKKyAgKzB4MjlBNCB8IDM5ICAgICAgICAgICAgICAgICAgICAgIHwgY2hhclsxXSAgICAgfCA5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nIGxpdGVyYWwKKyAgKzB4MjlBNSB8IDAwICAgICAgICAgICAgICAgICAgICAgIHwgY2hhciAgICAgICAgfCAweDAwICgwKSAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nIHRlcm1pbmF0b3IKKworcGFkZGluZzoKKyAgKzB4MjlBNiB8IDAwIDAwICAgICAgICAgICAgICAgICAgIHwgdWludDhfdFsyXSAgfCAuLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgcGFkZGluZworCitzdHJpbmcgKHJlZmxlY3Rpb24uS2V5VmFsdWUua2V5KToKKyAgKzB4MjlBOCB8IDAyIDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgfCAweDAwMDAwMDAyICgyKSAgICAgICAgICAgICAgICAgICAgIHwgbGVuZ3RoIG9mIHN0cmluZworICArMHgyOUFDIHwgNjkgNjQgICAgICAgICAgICAgICAgICAgfCBjaGFyWzJdICAgICB8IGlkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJpbmcgbGl0ZXJhbAorICArMHgyOUFFIHwgMDAgICAgICAgICAgICAgICAgICAgICAgfCBjaGFyICAgICAgICB8IDB4MDAgKDApICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJpbmcgdGVybWluYXRvcgorCit2dGFibGUgKHJlZmxlY3Rpb24uVHlwZSk6CisgICsweDI5QjAgfCAxMCAwMCAgICAgICAgICAgICAgICAgICB8IHVpbnQxNl90ICAgIHwgMHgwMDEwICgxNikgICAgICAgICAgICAgICAgICAgICAgICB8IHNpemUgb2YgdGhpcyB2dGFibGUKKyAgKzB4MjlCMiB8IDEwIDAwICAgICAgICAgICAgICAgICAgIHwgdWludDE2X3QgICAgfCAweDAwMTAgKDE2KSAgICAgICAgICAgICAgICAgICAgICAgIHwgc2l6ZSBvZiByZWZlcnJpbmcgdGFibGUKKyAgKzB4MjlCNCB8IDA2IDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgfCAweDAwMDYgKDYpICAgICAgICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBiYXNlX3R5cGVgIChpZDogMCkKKyAgKzB4MjlCNiB8IDA3IDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgfCAweDAwMDcgKDcpICAgICAgICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBlbGVtZW50YCAoaWQ6IDEpCisgICsweDI5QjggfCAwOCAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgIHwgMHgwMDA4ICg4KSAgICAgICAgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgaW5kZXhgIChpZDogMikKKyAgKzB4MjlCQSB8IDAwIDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgfCAweDAwMDAgKDApICAgICAgICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBmaXhlZF9sZW5ndGhgIChpZDogMykgPGRlZmF1bHRzIHRvIDA+IChVU2hvcnQpCisgICsweDI5QkMgfCAwMCAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgIHwgMHgwMDAwICgwKSAgICAgICAgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgYmFzZV9zaXplYCAoaWQ6IDQpIDxkZWZhdWx0cyB0byA0PiAoVUludCkKKyAgKzB4MjlCRSB8IDBDIDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgfCAweDAwMEMgKDEyKSAgICAgICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBlbGVtZW50X3NpemVgIChpZDogNSkKKwordGFibGUgKHJlZmxlY3Rpb24uVHlwZSk6CisgICsweDI5QzAgfCAxMCAwMCAwMCAwMCAgICAgICAgICAgICB8IFNPZmZzZXQzMiAgIHwgMHgwMDAwMDAxMCAoMTYpIExvYzogKzB4MjlCMCAgICAgICB8IG9mZnNldCB0byB2dGFibGUKKyAgKzB4MjlDNCB8IDAwIDAwICAgICAgICAgICAgICAgICAgIHwgdWludDhfdFsyXSAgfCAuLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgcGFkZGluZworICArMHgyOUM2IHwgMEUgICAgICAgICAgICAgICAgICAgICAgfCB1aW50OF90ICAgICB8IDB4MEUgKDE0KSAgICAgICAgICAgICAgICAgICAgICAgICAgfCB0YWJsZSBmaWVsZCBgYmFzZV90eXBlYCAoQnl0ZSkKKyAgKzB4MjlDNyB8IDBGICAgICAgICAgICAgICAgICAgICAgIHwgdWludDhfdCAgICAgfCAweDBGICgxNSkgICAgICAgICAgICAgICAgICAgICAgICAgIHwgdGFibGUgZmllbGQgYGVsZW1lbnRgIChCeXRlKQorICArMHgyOUM4IHwgMDYgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICB8IDB4MDAwMDAwMDYgKDYpICAgICAgICAgICAgICAgICAgICAgfCB0YWJsZSBmaWVsZCBgaW5kZXhgIChJbnQpCisgICsweDI5Q0MgfCAwNCAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgIHwgMHgwMDAwMDAwNCAoNCkgICAgICAgICAgICAgICAgICAgICB8IHRhYmxlIGZpZWxkIGBlbGVtZW50X3NpemVgIChVSW50KQorCitzdHJpbmcgKHJlZmxlY3Rpb24uRmllbGQubmFtZSk6CisgICsweDI5RDAgfCAwNSAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgIHwgMHgwMDAwMDAwNSAoNSkgICAgICAgICAgICAgICAgICAgICB8IGxlbmd0aCBvZiBzdHJpbmcKKyAgKzB4MjlENCB8IDc0IDY1IDczIDc0IDM0ICAgICAgICAgIHwgY2hhcls1XSAgICAgfCB0ZXN0NCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nIGxpdGVyYWwKKyAgKzB4MjlEOSB8IDAwICAgICAgICAgICAgICAgICAgICAgIHwgY2hhciAgICAgICAgfCAweDAwICgwKSAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nIHRlcm1pbmF0b3IKKworcGFkZGluZzoKKyAgKzB4MjlEQSB8IDAwIDAwICAgICAgICAgICAgICAgICAgIHwgdWludDhfdFsyXSAgfCAuLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgcGFkZGluZworCit0YWJsZSAocmVmbGVjdGlvbi5GaWVsZCk6CisgICsweDI5REMgfCBCOCBGRSBGRiBGRiAgICAgICAgICAgICB8IFNPZmZzZXQzMiAgIHwgMHhGRkZGRkVCOCAoLTMyOCkgTG9jOiArMHgyQjI0ICAgICB8IG9mZnNldCB0byB2dGFibGUKKyAgKzB4MjlFMCB8IDAwIDAwIDAwICAgICAgICAgICAgICAgIHwgdWludDhfdFszXSAgfCAuLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgcGFkZGluZworICArMHgyOUUzIHwgMDEgICAgICAgICAgICAgICAgICAgICAgfCB1aW50OF90ICAgICB8IDB4MDEgKDEpICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB0YWJsZSBmaWVsZCBgb3B0aW9uYWxgIChCb29sKQorICArMHgyOUU0IHwgMDggMDAgICAgICAgICAgICAgICAgICAgfCB1aW50MTZfdCAgICB8IDB4MDAwOCAoOCkgICAgICAgICAgICAgICAgICAgICAgICAgfCB0YWJsZSBmaWVsZCBgaWRgIChVU2hvcnQpCisgICsweDI5RTYgfCAxNCAwMCAgICAgICAgICAgICAgICAgICB8IHVpbnQxNl90ICAgIHwgMHgwMDE0ICgyMCkgICAgICAgICAgICAgICAgICAgICAgICB8IHRhYmxlIGZpZWxkIGBvZmZzZXRgIChVU2hvcnQpCisgICsweDI5RTggfCA0OCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDA0OCAoNzIpIExvYzogKzB4MkEzMCAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgbmFtZWAgKHN0cmluZykKKyAgKzB4MjlFQyB8IDM0IDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMDM0ICg1MikgTG9jOiArMHgyQTIwICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGB0eXBlYCAodGFibGUpCisgICsweDI5RjAgfCAwQyAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDAwQyAoMTIpIExvYzogKzB4MjlGQyAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgYXR0cmlidXRlc2AgKHZlY3RvcikKKyAgKzB4MjlGNCB8IDA0IDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMDA0ICg0KSBMb2M6ICsweDI5RjggICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBkb2N1bWVudGF0aW9uYCAodmVjdG9yKQorCit2ZWN0b3IgKHJlZmxlY3Rpb24uRmllbGQuZG9jdW1lbnRhdGlvbik6CisgICsweDI5RjggfCAwMCAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgIHwgMHgwMDAwMDAwMCAoMCkgICAgICAgICAgICAgICAgICAgICB8IGxlbmd0aCBvZiB2ZWN0b3IgKCMgaXRlbXMpCisKK3ZlY3RvciAocmVmbGVjdGlvbi5GaWVsZC5hdHRyaWJ1dGVzKToKKyAgKzB4MjlGQyB8IDAxIDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgfCAweDAwMDAwMDAxICgxKSAgICAgICAgICAgICAgICAgICAgIHwgbGVuZ3RoIG9mIHZlY3RvciAoIyBpdGVtcykKKyAgKzB4MkEwMCB8IDA0IDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMDA0ICg0KSBMb2M6ICsweDJBMDQgICAgICAgIHwgb2Zmc2V0IHRvIHRhYmxlWzBdCisKK3RhYmxlIChyZWZsZWN0aW9uLktleVZhbHVlKToKKyAgKzB4MkEwNCB8IEEwIEY0IEZGIEZGICAgICAgICAgICAgIHwgU09mZnNldDMyICAgfCAweEZGRkZGNEEwICgtMjkxMikgTG9jOiArMHgzNTY0ICAgIHwgb2Zmc2V0IHRvIHZ0YWJsZQorICArMHgyQTA4IHwgMTAgMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDAwMTAgKDE2KSBMb2M6ICsweDJBMTggICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYGtleWAgKHN0cmluZykKKyAgKzB4MkEwQyB8IDA0IDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMDA0ICg0KSBMb2M6ICsweDJBMTAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGB2YWx1ZWAgKHN0cmluZykKKworc3RyaW5nIChyZWZsZWN0aW9uLktleVZhbHVlLnZhbHVlKToKKyAgKzB4MkExMCB8IDAxIDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgfCAweDAwMDAwMDAxICgxKSAgICAgICAgICAgICAgICAgICAgIHwgbGVuZ3RoIG9mIHN0cmluZworICArMHgyQTE0IHwgMzggICAgICAgICAgICAgICAgICAgICAgfCBjaGFyWzFdICAgICB8IDggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJpbmcgbGl0ZXJhbAorICArMHgyQTE1IHwgMDAgICAgICAgICAgICAgICAgICAgICAgfCBjaGFyICAgICAgICB8IDB4MDAgKDApICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJpbmcgdGVybWluYXRvcgorCitwYWRkaW5nOgorICArMHgyQTE2IHwgMDAgMDAgICAgICAgICAgICAgICAgICAgfCB1aW50OF90WzJdICB8IC4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBwYWRkaW5nCisKK3N0cmluZyAocmVmbGVjdGlvbi5LZXlWYWx1ZS5rZXkpOgorICArMHgyQTE4IHwgMDIgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICB8IDB4MDAwMDAwMDIgKDIpICAgICAgICAgICAgICAgICAgICAgfCBsZW5ndGggb2Ygc3RyaW5nCisgICsweDJBMUMgfCA2OSA2NCAgICAgICAgICAgICAgICAgICB8IGNoYXJbMl0gICAgIHwgaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHN0cmluZyBsaXRlcmFsCisgICsweDJBMUUgfCAwMCAgICAgICAgICAgICAgICAgICAgICB8IGNoYXIgICAgICAgIHwgMHgwMCAoMCkgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHN0cmluZyB0ZXJtaW5hdG9yCisKK3RhYmxlIChyZWZsZWN0aW9uLlR5cGUpOgorICArMHgyQTIwIHwgNjggRjEgRkYgRkYgICAgICAgICAgICAgfCBTT2Zmc2V0MzIgICB8IDB4RkZGRkYxNjggKC0zNzM2KSBMb2M6ICsweDM4QjggICAgfCBvZmZzZXQgdG8gdnRhYmxlCisgICsweDJBMjQgfCAwMCAwMCAwMCAgICAgICAgICAgICAgICB8IHVpbnQ4X3RbM10gIHwgLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHBhZGRpbmcKKyAgKzB4MkEyNyB8IDEwICAgICAgICAgICAgICAgICAgICAgIHwgdWludDhfdCAgICAgfCAweDEwICgxNikgICAgICAgICAgICAgICAgICAgICAgICAgIHwgdGFibGUgZmllbGQgYGJhc2VfdHlwZWAgKEJ5dGUpCisgICsweDJBMjggfCAwMCAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgIHwgMHgwMDAwMDAwMCAoMCkgICAgICAgICAgICAgICAgICAgICB8IHRhYmxlIGZpZWxkIGBpbmRleGAgKEludCkKKyAgKzB4MkEyQyB8IDAxIDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgfCAweDAwMDAwMDAxICgxKSAgICAgICAgICAgICAgICAgICAgIHwgdGFibGUgZmllbGQgYGVsZW1lbnRfc2l6ZWAgKFVJbnQpCisKK3N0cmluZyAocmVmbGVjdGlvbi5GaWVsZC5uYW1lKToKKyAgKzB4MkEzMCB8IDA0IDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgfCAweDAwMDAwMDA0ICg0KSAgICAgICAgICAgICAgICAgICAgIHwgbGVuZ3RoIG9mIHN0cmluZworICArMHgyQTM0IHwgNzQgNjUgNzMgNzQgICAgICAgICAgICAgfCBjaGFyWzRdICAgICB8IHRlc3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJpbmcgbGl0ZXJhbAorICArMHgyQTM4IHwgMDAgICAgICAgICAgICAgICAgICAgICAgfCBjaGFyICAgICAgICB8IDB4MDAgKDApICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJpbmcgdGVybWluYXRvcgorCit2dGFibGUgKHJlZmxlY3Rpb24uRmllbGQpOgorICArMHgyQTNBIHwgMUEgMDAgICAgICAgICAgICAgICAgICAgfCB1aW50MTZfdCAgICB8IDB4MDAxQSAoMjYpICAgICAgICAgICAgICAgICAgICAgICAgfCBzaXplIG9mIHRoaXMgdnRhYmxlCisgICsweDJBM0MgfCAxOCAwMCAgICAgICAgICAgICAgICAgICB8IHVpbnQxNl90ICAgIHwgMHgwMDE4ICgyNCkgICAgICAgICAgICAgICAgICAgICAgICB8IHNpemUgb2YgcmVmZXJyaW5nIHRhYmxlCisgICsweDJBM0UgfCAwOCAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgIHwgMHgwMDA4ICg4KSAgICAgICAgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgbmFtZWAgKGlkOiAwKQorICArMHgyQTQwIHwgMEMgMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgICB8IDB4MDAwQyAoMTIpICAgICAgICAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYHR5cGVgIChpZDogMSkKKyAgKzB4MkE0MiB8IDA0IDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgfCAweDAwMDQgKDQpICAgICAgICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBpZGAgKGlkOiAyKQorICArMHgyQTQ0IHwgMDYgMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgICB8IDB4MDAwNiAoNikgICAgICAgICAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYG9mZnNldGAgKGlkOiAzKQorICArMHgyQTQ2IHwgMDAgMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgICB8IDB4MDAwMCAoMCkgICAgICAgICAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYGRlZmF1bHRfaW50ZWdlcmAgKGlkOiA0KSA8ZGVmYXVsdHMgdG8gMD4gKExvbmcpCisgICsweDJBNDggfCAwMCAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgIHwgMHgwMDAwICgwKSAgICAgICAgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgZGVmYXVsdF9yZWFsYCAoaWQ6IDUpIDxkZWZhdWx0cyB0byAwLjAwMDAwMD4gKERvdWJsZSkKKyAgKzB4MkE0QSB8IDAwIDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgfCAweDAwMDAgKDApICAgICAgICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBkZXByZWNhdGVkYCAoaWQ6IDYpIDxkZWZhdWx0cyB0byAwPiAoQm9vbCkKKyAgKzB4MkE0QyB8IDAwIDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgfCAweDAwMDAgKDApICAgICAgICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGByZXF1aXJlZGAgKGlkOiA3KSA8ZGVmYXVsdHMgdG8gMD4gKEJvb2wpCisgICsweDJBNEUgfCAwMCAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgIHwgMHgwMDAwICgwKSAgICAgICAgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBga2V5YCAoaWQ6IDgpIDxkZWZhdWx0cyB0byAwPiAoQm9vbCkKKyAgKzB4MkE1MCB8IDEwIDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgfCAweDAwMTAgKDE2KSAgICAgICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBhdHRyaWJ1dGVzYCAoaWQ6IDkpCisgICsweDJBNTIgfCAxNCAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgIHwgMHgwMDE0ICgyMCkgICAgICAgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgZG9jdW1lbnRhdGlvbmAgKGlkOiAxMCkKKwordGFibGUgKHJlZmxlY3Rpb24uRmllbGQpOgorICArMHgyQTU0IHwgMUEgMDAgMDAgMDAgICAgICAgICAgICAgfCBTT2Zmc2V0MzIgICB8IDB4MDAwMDAwMUEgKDI2KSBMb2M6ICsweDJBM0EgICAgICAgfCBvZmZzZXQgdG8gdnRhYmxlCisgICsweDJBNTggfCAwNyAwMCAgICAgICAgICAgICAgICAgICB8IHVpbnQxNl90ICAgIHwgMHgwMDA3ICg3KSAgICAgICAgICAgICAgICAgICAgICAgICB8IHRhYmxlIGZpZWxkIGBpZGAgKFVTaG9ydCkKKyAgKzB4MkE1QSB8IDEyIDAwICAgICAgICAgICAgICAgICAgIHwgdWludDE2X3QgICAgfCAweDAwMTIgKDE4KSAgICAgICAgICAgICAgICAgICAgICAgIHwgdGFibGUgZmllbGQgYG9mZnNldGAgKFVTaG9ydCkKKyAgKzB4MkE1QyB8IDRDIDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMDRDICg3NikgTG9jOiArMHgyQUE4ICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBuYW1lYCAoc3RyaW5nKQorICArMHgyQTYwIHwgMzQgMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDAwMzQgKDUyKSBMb2M6ICsweDJBOTQgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYHR5cGVgICh0YWJsZSkKKyAgKzB4MkE2NCB8IDBDIDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMDBDICgxMikgTG9jOiArMHgyQTcwICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBhdHRyaWJ1dGVzYCAodmVjdG9yKQorICArMHgyQTY4IHwgMDQgMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDAwMDQgKDQpIExvYzogKzB4MkE2QyAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYGRvY3VtZW50YXRpb25gICh2ZWN0b3IpCisKK3ZlY3RvciAocmVmbGVjdGlvbi5GaWVsZC5kb2N1bWVudGF0aW9uKToKKyAgKzB4MkE2QyB8IDAwIDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgfCAweDAwMDAwMDAwICgwKSAgICAgICAgICAgICAgICAgICAgIHwgbGVuZ3RoIG9mIHZlY3RvciAoIyBpdGVtcykKKwordmVjdG9yIChyZWZsZWN0aW9uLkZpZWxkLmF0dHJpYnV0ZXMpOgorICArMHgyQTcwIHwgMDEgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICB8IDB4MDAwMDAwMDEgKDEpICAgICAgICAgICAgICAgICAgICAgfCBsZW5ndGggb2YgdmVjdG9yICgjIGl0ZW1zKQorICArMHgyQTc0IHwgMDQgMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDAwMDQgKDQpIExvYzogKzB4MkE3OCAgICAgICAgfCBvZmZzZXQgdG8gdGFibGVbMF0KKwordGFibGUgKHJlZmxlY3Rpb24uS2V5VmFsdWUpOgorICArMHgyQTc4IHwgMTQgRjUgRkYgRkYgICAgICAgICAgICAgfCBTT2Zmc2V0MzIgICB8IDB4RkZGRkY1MTQgKC0yNzk2KSBMb2M6ICsweDM1NjQgICAgfCBvZmZzZXQgdG8gdnRhYmxlCisgICsweDJBN0MgfCAxMCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDAxMCAoMTYpIExvYzogKzB4MkE4QyAgICAgICB8IG9mZnNldCB0byBmaWVsZCBga2V5YCAoc3RyaW5nKQorICArMHgyQTgwIHwgMDQgMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDAwMDQgKDQpIExvYzogKzB4MkE4NCAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYHZhbHVlYCAoc3RyaW5nKQorCitzdHJpbmcgKHJlZmxlY3Rpb24uS2V5VmFsdWUudmFsdWUpOgorICArMHgyQTg0IHwgMDEgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICB8IDB4MDAwMDAwMDEgKDEpICAgICAgICAgICAgICAgICAgICAgfCBsZW5ndGggb2Ygc3RyaW5nCisgICsweDJBODggfCAzNyAgICAgICAgICAgICAgICAgICAgICB8IGNoYXJbMV0gICAgIHwgNyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHN0cmluZyBsaXRlcmFsCisgICsweDJBODkgfCAwMCAgICAgICAgICAgICAgICAgICAgICB8IGNoYXIgICAgICAgIHwgMHgwMCAoMCkgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHN0cmluZyB0ZXJtaW5hdG9yCisKK3BhZGRpbmc6CisgICsweDJBOEEgfCAwMCAwMCAgICAgICAgICAgICAgICAgICB8IHVpbnQ4X3RbMl0gIHwgLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHBhZGRpbmcKKworc3RyaW5nIChyZWZsZWN0aW9uLktleVZhbHVlLmtleSk6CisgICsweDJBOEMgfCAwMiAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgIHwgMHgwMDAwMDAwMiAoMikgICAgICAgICAgICAgICAgICAgICB8IGxlbmd0aCBvZiBzdHJpbmcKKyAgKzB4MkE5MCB8IDY5IDY0ICAgICAgICAgICAgICAgICAgIHwgY2hhclsyXSAgICAgfCBpZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nIGxpdGVyYWwKKyAgKzB4MkE5MiB8IDAwICAgICAgICAgICAgICAgICAgICAgIHwgY2hhciAgICAgICAgfCAweDAwICgwKSAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nIHRlcm1pbmF0b3IKKwordGFibGUgKHJlZmxlY3Rpb24uVHlwZSk6CisgICsweDJBOTQgfCA5MCBGNCBGRiBGRiAgICAgICAgICAgICB8IFNPZmZzZXQzMiAgIHwgMHhGRkZGRjQ5MCAoLTI5MjgpIExvYzogKzB4MzYwNCAgICB8IG9mZnNldCB0byB2dGFibGUKKyAgKzB4MkE5OCB8IDAwIDAwIDAwICAgICAgICAgICAgICAgIHwgdWludDhfdFszXSAgfCAuLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgcGFkZGluZworICArMHgyQTlCIHwgMDEgICAgICAgICAgICAgICAgICAgICAgfCB1aW50OF90ICAgICB8IDB4MDEgKDEpICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB0YWJsZSBmaWVsZCBgYmFzZV90eXBlYCAoQnl0ZSkKKyAgKzB4MkE5QyB8IDAwIDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgfCAweDAwMDAwMDAwICgwKSAgICAgICAgICAgICAgICAgICAgIHwgdGFibGUgZmllbGQgYGluZGV4YCAoSW50KQorICArMHgyQUEwIHwgMDEgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICB8IDB4MDAwMDAwMDEgKDEpICAgICAgICAgICAgICAgICAgICAgfCB0YWJsZSBmaWVsZCBgYmFzZV9zaXplYCAoVUludCkKKyAgKzB4MkFBNCB8IDAxIDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgfCAweDAwMDAwMDAxICgxKSAgICAgICAgICAgICAgICAgICAgIHwgdGFibGUgZmllbGQgYGVsZW1lbnRfc2l6ZWAgKFVJbnQpCisKK3N0cmluZyAocmVmbGVjdGlvbi5GaWVsZC5uYW1lKToKKyAgKzB4MkFBOCB8IDA5IDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgfCAweDAwMDAwMDA5ICg5KSAgICAgICAgICAgICAgICAgICAgIHwgbGVuZ3RoIG9mIHN0cmluZworICArMHgyQUFDIHwgNzQgNjUgNzMgNzQgNUYgNzQgNzkgNzAgfCBjaGFyWzldICAgICB8IHRlc3RfdHlwICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJpbmcgbGl0ZXJhbAorICArMHgyQUI0IHwgNjUgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICB8IGUKKyAgKzB4MkFCNSB8IDAwICAgICAgICAgICAgICAgICAgICAgIHwgY2hhciAgICAgICAgfCAweDAwICgwKSAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nIHRlcm1pbmF0b3IKKworcGFkZGluZzoKKyAgKzB4MkFCNiB8IDAwIDAwICAgICAgICAgICAgICAgICAgIHwgdWludDhfdFsyXSAgfCAuLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgcGFkZGluZworCit0YWJsZSAocmVmbGVjdGlvbi5GaWVsZCk6CisgICsweDJBQjggfCA0MiBGRCBGRiBGRiAgICAgICAgICAgICB8IFNPZmZzZXQzMiAgIHwgMHhGRkZGRkQ0MiAoLTcwMikgTG9jOiArMHgyRDc2ICAgICB8IG9mZnNldCB0byB2dGFibGUKKyAgKzB4MkFCQyB8IDA2IDAwICAgICAgICAgICAgICAgICAgIHwgdWludDE2X3QgICAgfCAweDAwMDYgKDYpICAgICAgICAgICAgICAgICAgICAgICAgIHwgdGFibGUgZmllbGQgYGlkYCAoVVNob3J0KQorICArMHgyQUJFIHwgMTAgMDAgICAgICAgICAgICAgICAgICAgfCB1aW50MTZfdCAgICB8IDB4MDAxMCAoMTYpICAgICAgICAgICAgICAgICAgICAgICAgfCB0YWJsZSBmaWVsZCBgb2Zmc2V0YCAoVVNob3J0KQorICArMHgyQUMwIHwgNTggMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDAwNTggKDg4KSBMb2M6ICsweDJCMTggICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYG5hbWVgIChzdHJpbmcpCisgICsweDJBQzQgfCA0MCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDA0MCAoNjQpIExvYzogKzB4MkIwNCAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgdHlwZWAgKHRhYmxlKQorICArMHgyQUM4IHwgMTggMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDAwMTggKDI0KSBMb2M6ICsweDJBRTAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYGF0dHJpYnV0ZXNgICh2ZWN0b3IpCisgICsweDJBQ0MgfCAxMCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDAxMCAoMTYpIExvYzogKzB4MkFEQyAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgZG9jdW1lbnRhdGlvbmAgKHZlY3RvcikKKyAgKzB4MkFEMCB8IDA4IDAwIDAwIDAwIDAwIDAwIDAwIDAwIHwgaW50NjRfdCAgICAgfCAweDAwMDAwMDAwMDAwMDAwMDggKDgpICAgICAgICAgICAgIHwgdGFibGUgZmllbGQgYGRlZmF1bHRfaW50ZWdlcmAgKExvbmcpCisgICsweDJBRDggfCAwMCAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQ4X3RbNF0gIHwgLi4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHBhZGRpbmcKKwordmVjdG9yIChyZWZsZWN0aW9uLkZpZWxkLmRvY3VtZW50YXRpb24pOgorICArMHgyQURDIHwgMDAgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICB8IDB4MDAwMDAwMDAgKDApICAgICAgICAgICAgICAgICAgICAgfCBsZW5ndGggb2YgdmVjdG9yICgjIGl0ZW1zKQorCit2ZWN0b3IgKHJlZmxlY3Rpb24uRmllbGQuYXR0cmlidXRlcyk6CisgICsweDJBRTAgfCAwMSAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgIHwgMHgwMDAwMDAwMSAoMSkgICAgICAgICAgICAgICAgICAgICB8IGxlbmd0aCBvZiB2ZWN0b3IgKCMgaXRlbXMpCisgICsweDJBRTQgfCAwNCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDAwNCAoNCkgTG9jOiArMHgyQUU4ICAgICAgICB8IG9mZnNldCB0byB0YWJsZVswXQorCit0YWJsZSAocmVmbGVjdGlvbi5LZXlWYWx1ZSk6CisgICsweDJBRTggfCA4NCBGNSBGRiBGRiAgICAgICAgICAgICB8IFNPZmZzZXQzMiAgIHwgMHhGRkZGRjU4NCAoLTI2ODQpIExvYzogKzB4MzU2NCAgICB8IG9mZnNldCB0byB2dGFibGUKKyAgKzB4MkFFQyB8IDEwIDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMDEwICgxNikgTG9jOiArMHgyQUZDICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBrZXlgIChzdHJpbmcpCisgICsweDJBRjAgfCAwNCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDAwNCAoNCkgTG9jOiArMHgyQUY0ICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgdmFsdWVgIChzdHJpbmcpCisKK3N0cmluZyAocmVmbGVjdGlvbi5LZXlWYWx1ZS52YWx1ZSk6CisgICsweDJBRjQgfCAwMSAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgIHwgMHgwMDAwMDAwMSAoMSkgICAgICAgICAgICAgICAgICAgICB8IGxlbmd0aCBvZiBzdHJpbmcKKyAgKzB4MkFGOCB8IDM2ICAgICAgICAgICAgICAgICAgICAgIHwgY2hhclsxXSAgICAgfCA2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nIGxpdGVyYWwKKyAgKzB4MkFGOSB8IDAwICAgICAgICAgICAgICAgICAgICAgIHwgY2hhciAgICAgICAgfCAweDAwICgwKSAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nIHRlcm1pbmF0b3IKKworcGFkZGluZzoKKyAgKzB4MkFGQSB8IDAwIDAwICAgICAgICAgICAgICAgICAgIHwgdWludDhfdFsyXSAgfCAuLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgcGFkZGluZworCitzdHJpbmcgKHJlZmxlY3Rpb24uS2V5VmFsdWUua2V5KToKKyAgKzB4MkFGQyB8IDAyIDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgfCAweDAwMDAwMDAyICgyKSAgICAgICAgICAgICAgICAgICAgIHwgbGVuZ3RoIG9mIHN0cmluZworICArMHgyQjAwIHwgNjkgNjQgICAgICAgICAgICAgICAgICAgfCBjaGFyWzJdICAgICB8IGlkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJpbmcgbGl0ZXJhbAorICArMHgyQjAyIHwgMDAgICAgICAgICAgICAgICAgICAgICAgfCBjaGFyICAgICAgICB8IDB4MDAgKDApICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJpbmcgdGVybWluYXRvcgorCit0YWJsZSAocmVmbGVjdGlvbi5UeXBlKToKKyAgKzB4MkIwNCB8IDAwIEY1IEZGIEZGICAgICAgICAgICAgIHwgU09mZnNldDMyICAgfCAweEZGRkZGNTAwICgtMjgxNikgTG9jOiArMHgzNjA0ICAgIHwgb2Zmc2V0IHRvIHZ0YWJsZQorICArMHgyQjA4IHwgMDAgMDAgMDAgICAgICAgICAgICAgICAgfCB1aW50OF90WzNdICB8IC4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBwYWRkaW5nCisgICsweDJCMEIgfCAwNCAgICAgICAgICAgICAgICAgICAgICB8IHVpbnQ4X3QgICAgIHwgMHgwNCAoNCkgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHRhYmxlIGZpZWxkIGBiYXNlX3R5cGVgIChCeXRlKQorICArMHgyQjBDIHwgMDMgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICB8IDB4MDAwMDAwMDMgKDMpICAgICAgICAgICAgICAgICAgICAgfCB0YWJsZSBmaWVsZCBgaW5kZXhgIChJbnQpCisgICsweDJCMTAgfCAwMSAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgIHwgMHgwMDAwMDAwMSAoMSkgICAgICAgICAgICAgICAgICAgICB8IHRhYmxlIGZpZWxkIGBiYXNlX3NpemVgIChVSW50KQorICArMHgyQjE0IHwgMDEgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICB8IDB4MDAwMDAwMDEgKDEpICAgICAgICAgICAgICAgICAgICAgfCB0YWJsZSBmaWVsZCBgZWxlbWVudF9zaXplYCAoVUludCkKKworc3RyaW5nIChyZWZsZWN0aW9uLkZpZWxkLm5hbWUpOgorICArMHgyQjE4IHwgMDUgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICB8IDB4MDAwMDAwMDUgKDUpICAgICAgICAgICAgICAgICAgICAgfCBsZW5ndGggb2Ygc3RyaW5nCisgICsweDJCMUMgfCA2MyA2RiA2QyA2RiA3MiAgICAgICAgICB8IGNoYXJbNV0gICAgIHwgY29sb3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHN0cmluZyBsaXRlcmFsCisgICsweDJCMjEgfCAwMCAgICAgICAgICAgICAgICAgICAgICB8IGNoYXIgICAgICAgIHwgMHgwMCAoMCkgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHN0cmluZyB0ZXJtaW5hdG9yCisKK3BhZGRpbmc6CisgICsweDJCMjIgfCAwMCAwMCAgICAgICAgICAgICAgICAgICB8IHVpbnQ4X3RbMl0gIHwgLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHBhZGRpbmcKKwordnRhYmxlIChyZWZsZWN0aW9uLkZpZWxkKToKKyAgKzB4MkIyNCB8IDFDIDAwICAgICAgICAgICAgICAgICAgIHwgdWludDE2X3QgICAgfCAweDAwMUMgKDI4KSAgICAgICAgICAgICAgICAgICAgICAgIHwgc2l6ZSBvZiB0aGlzIHZ0YWJsZQorICArMHgyQjI2IHwgMUMgMDAgICAgICAgICAgICAgICAgICAgfCB1aW50MTZfdCAgICB8IDB4MDAxQyAoMjgpICAgICAgICAgICAgICAgICAgICAgICAgfCBzaXplIG9mIHJlZmVycmluZyB0YWJsZQorICArMHgyQjI4IHwgMEMgMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgICB8IDB4MDAwQyAoMTIpICAgICAgICAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYG5hbWVgIChpZDogMCkKKyAgKzB4MkIyQSB8IDEwIDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgfCAweDAwMTAgKDE2KSAgICAgICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGB0eXBlYCAoaWQ6IDEpCisgICsweDJCMkMgfCAwOCAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgIHwgMHgwMDA4ICg4KSAgICAgICAgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgaWRgIChpZDogMikKKyAgKzB4MkIyRSB8IDBBIDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgfCAweDAwMEEgKDEwKSAgICAgICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBvZmZzZXRgIChpZDogMykKKyAgKzB4MkIzMCB8IDAwIDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgfCAweDAwMDAgKDApICAgICAgICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBkZWZhdWx0X2ludGVnZXJgIChpZDogNCkgPGRlZmF1bHRzIHRvIDA+IChMb25nKQorICArMHgyQjMyIHwgMDAgMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgICB8IDB4MDAwMCAoMCkgICAgICAgICAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYGRlZmF1bHRfcmVhbGAgKGlkOiA1KSA8ZGVmYXVsdHMgdG8gMC4wMDAwMDA+IChEb3VibGUpCisgICsweDJCMzQgfCAwMCAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgIHwgMHgwMDAwICgwKSAgICAgICAgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgZGVwcmVjYXRlZGAgKGlkOiA2KSA8ZGVmYXVsdHMgdG8gMD4gKEJvb2wpCisgICsweDJCMzYgfCAwMCAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgIHwgMHgwMDAwICgwKSAgICAgICAgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgcmVxdWlyZWRgIChpZDogNykgPGRlZmF1bHRzIHRvIDA+IChCb29sKQorICArMHgyQjM4IHwgMDAgMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgICB8IDB4MDAwMCAoMCkgICAgICAgICAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYGtleWAgKGlkOiA4KSA8ZGVmYXVsdHMgdG8gMD4gKEJvb2wpCisgICsweDJCM0EgfCAxNCAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgIHwgMHgwMDE0ICgyMCkgICAgICAgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgYXR0cmlidXRlc2AgKGlkOiA5KQorICArMHgyQjNDIHwgMTggMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgICB8IDB4MDAxOCAoMjQpICAgICAgICAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYGRvY3VtZW50YXRpb25gIChpZDogMTApCisgICsweDJCM0UgfCAwNyAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgIHwgMHgwMDA3ICg3KSAgICAgICAgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgb3B0aW9uYWxgIChpZDogMTEpCisKK3RhYmxlIChyZWZsZWN0aW9uLkZpZWxkKToKKyAgKzB4MkI0MCB8IDFDIDAwIDAwIDAwICAgICAgICAgICAgIHwgU09mZnNldDMyICAgfCAweDAwMDAwMDFDICgyOCkgTG9jOiArMHgyQjI0ICAgICAgIHwgb2Zmc2V0IHRvIHZ0YWJsZQorICArMHgyQjQ0IHwgMDAgMDAgMDAgICAgICAgICAgICAgICAgfCB1aW50OF90WzNdICB8IC4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBwYWRkaW5nCisgICsweDJCNDcgfCAwMSAgICAgICAgICAgICAgICAgICAgICB8IHVpbnQ4X3QgICAgIHwgMHgwMSAoMSkgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHRhYmxlIGZpZWxkIGBvcHRpb25hbGAgKEJvb2wpCisgICsweDJCNDggfCAwNSAwMCAgICAgICAgICAgICAgICAgICB8IHVpbnQxNl90ICAgIHwgMHgwMDA1ICg1KSAgICAgICAgICAgICAgICAgICAgICAgICB8IHRhYmxlIGZpZWxkIGBpZGAgKFVTaG9ydCkKKyAgKzB4MkI0QSB8IDBFIDAwICAgICAgICAgICAgICAgICAgIHwgdWludDE2X3QgICAgfCAweDAwMEUgKDE0KSAgICAgICAgICAgICAgICAgICAgICAgIHwgdGFibGUgZmllbGQgYG9mZnNldGAgKFVTaG9ydCkKKyAgKzB4MkI0QyB8IDU0IDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMDU0ICg4NCkgTG9jOiArMHgyQkEwICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBuYW1lYCAoc3RyaW5nKQorICArMHgyQjUwIHwgNDQgMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDAwNDQgKDY4KSBMb2M6ICsweDJCOTQgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYHR5cGVgICh0YWJsZSkKKyAgKzB4MkI1NCB8IDBDIDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMDBDICgxMikgTG9jOiArMHgyQjYwICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBhdHRyaWJ1dGVzYCAodmVjdG9yKQorICArMHgyQjU4IHwgMDQgMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDAwMDQgKDQpIExvYzogKzB4MkI1QyAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYGRvY3VtZW50YXRpb25gICh2ZWN0b3IpCisKK3ZlY3RvciAocmVmbGVjdGlvbi5GaWVsZC5kb2N1bWVudGF0aW9uKToKKyAgKzB4MkI1QyB8IDAwIDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgfCAweDAwMDAwMDAwICgwKSAgICAgICAgICAgICAgICAgICAgIHwgbGVuZ3RoIG9mIHZlY3RvciAoIyBpdGVtcykKKwordmVjdG9yIChyZWZsZWN0aW9uLkZpZWxkLmF0dHJpYnV0ZXMpOgorICArMHgyQjYwIHwgMDEgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICB8IDB4MDAwMDAwMDEgKDEpICAgICAgICAgICAgICAgICAgICAgfCBsZW5ndGggb2YgdmVjdG9yICgjIGl0ZW1zKQorICArMHgyQjY0IHwgMDQgMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDAwMDQgKDQpIExvYzogKzB4MkI2OCAgICAgICAgfCBvZmZzZXQgdG8gdGFibGVbMF0KKwordGFibGUgKHJlZmxlY3Rpb24uS2V5VmFsdWUpOgorICArMHgyQjY4IHwgMDQgRjYgRkYgRkYgICAgICAgICAgICAgfCBTT2Zmc2V0MzIgICB8IDB4RkZGRkY2MDQgKC0yNTU2KSBMb2M6ICsweDM1NjQgICAgfCBvZmZzZXQgdG8gdnRhYmxlCisgICsweDJCNkMgfCAxMCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDAxMCAoMTYpIExvYzogKzB4MkI3QyAgICAgICB8IG9mZnNldCB0byBmaWVsZCBga2V5YCAoc3RyaW5nKQorICArMHgyQjcwIHwgMDQgMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDAwMDQgKDQpIExvYzogKzB4MkI3NCAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYHZhbHVlYCAoc3RyaW5nKQorCitzdHJpbmcgKHJlZmxlY3Rpb24uS2V5VmFsdWUudmFsdWUpOgorICArMHgyQjc0IHwgMDEgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICB8IDB4MDAwMDAwMDEgKDEpICAgICAgICAgICAgICAgICAgICAgfCBsZW5ndGggb2Ygc3RyaW5nCisgICsweDJCNzggfCAzNSAgICAgICAgICAgICAgICAgICAgICB8IGNoYXJbMV0gICAgIHwgNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHN0cmluZyBsaXRlcmFsCisgICsweDJCNzkgfCAwMCAgICAgICAgICAgICAgICAgICAgICB8IGNoYXIgICAgICAgIHwgMHgwMCAoMCkgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHN0cmluZyB0ZXJtaW5hdG9yCisKK3BhZGRpbmc6CisgICsweDJCN0EgfCAwMCAwMCAgICAgICAgICAgICAgICAgICB8IHVpbnQ4X3RbMl0gIHwgLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHBhZGRpbmcKKworc3RyaW5nIChyZWZsZWN0aW9uLktleVZhbHVlLmtleSk6CisgICsweDJCN0MgfCAwMiAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgIHwgMHgwMDAwMDAwMiAoMikgICAgICAgICAgICAgICAgICAgICB8IGxlbmd0aCBvZiBzdHJpbmcKKyAgKzB4MkI4MCB8IDY5IDY0ICAgICAgICAgICAgICAgICAgIHwgY2hhclsyXSAgICAgfCBpZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nIGxpdGVyYWwKKyAgKzB4MkI4MiB8IDAwICAgICAgICAgICAgICAgICAgICAgIHwgY2hhciAgICAgICAgfCAweDAwICgwKSAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nIHRlcm1pbmF0b3IKKwordnRhYmxlIChyZWZsZWN0aW9uLlR5cGUpOgorICArMHgyQjg0IHwgMTAgMDAgICAgICAgICAgICAgICAgICAgfCB1aW50MTZfdCAgICB8IDB4MDAxMCAoMTYpICAgICAgICAgICAgICAgICAgICAgICAgfCBzaXplIG9mIHRoaXMgdnRhYmxlCisgICsweDJCODYgfCAwQyAwMCAgICAgICAgICAgICAgICAgICB8IHVpbnQxNl90ICAgIHwgMHgwMDBDICgxMikgICAgICAgICAgICAgICAgICAgICAgICB8IHNpemUgb2YgcmVmZXJyaW5nIHRhYmxlCisgICsweDJCODggfCAwNiAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgIHwgMHgwMDA2ICg2KSAgICAgICAgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgYmFzZV90eXBlYCAoaWQ6IDApCisgICsweDJCOEEgfCAwNyAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgIHwgMHgwMDA3ICg3KSAgICAgICAgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgZWxlbWVudGAgKGlkOiAxKQorICArMHgyQjhDIHwgMDAgMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgICB8IDB4MDAwMCAoMCkgICAgICAgICAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYGluZGV4YCAoaWQ6IDIpIDxkZWZhdWx0cyB0byAtMT4gKEludCkKKyAgKzB4MkI4RSB8IDAwIDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgfCAweDAwMDAgKDApICAgICAgICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBmaXhlZF9sZW5ndGhgIChpZDogMykgPGRlZmF1bHRzIHRvIDA+IChVU2hvcnQpCisgICsweDJCOTAgfCAwMCAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgIHwgMHgwMDAwICgwKSAgICAgICAgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgYmFzZV9zaXplYCAoaWQ6IDQpIDxkZWZhdWx0cyB0byA0PiAoVUludCkKKyAgKzB4MkI5MiB8IDA4IDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgfCAweDAwMDggKDgpICAgICAgICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBlbGVtZW50X3NpemVgIChpZDogNSkKKwordGFibGUgKHJlZmxlY3Rpb24uVHlwZSk6CisgICsweDJCOTQgfCAxMCAwMCAwMCAwMCAgICAgICAgICAgICB8IFNPZmZzZXQzMiAgIHwgMHgwMDAwMDAxMCAoMTYpIExvYzogKzB4MkI4NCAgICAgICB8IG9mZnNldCB0byB2dGFibGUKKyAgKzB4MkI5OCB8IDAwIDAwICAgICAgICAgICAgICAgICAgIHwgdWludDhfdFsyXSAgfCAuLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgcGFkZGluZworICArMHgyQjlBIHwgMEUgICAgICAgICAgICAgICAgICAgICAgfCB1aW50OF90ICAgICB8IDB4MEUgKDE0KSAgICAgICAgICAgICAgICAgICAgICAgICAgfCB0YWJsZSBmaWVsZCBgYmFzZV90eXBlYCAoQnl0ZSkKKyAgKzB4MkI5QiB8IDA0ICAgICAgICAgICAgICAgICAgICAgIHwgdWludDhfdCAgICAgfCAweDA0ICg0KSAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgdGFibGUgZmllbGQgYGVsZW1lbnRgIChCeXRlKQorICArMHgyQjlDIHwgMDEgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICB8IDB4MDAwMDAwMDEgKDEpICAgICAgICAgICAgICAgICAgICAgfCB0YWJsZSBmaWVsZCBgZWxlbWVudF9zaXplYCAoVUludCkKKworc3RyaW5nIChyZWZsZWN0aW9uLkZpZWxkLm5hbWUpOgorICArMHgyQkEwIHwgMDkgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICB8IDB4MDAwMDAwMDkgKDkpICAgICAgICAgICAgICAgICAgICAgfCBsZW5ndGggb2Ygc3RyaW5nCisgICsweDJCQTQgfCA2OSA2RSA3NiA2NSA2RSA3NCA2RiA3MiB8IGNoYXJbOV0gICAgIHwgaW52ZW50b3IgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHN0cmluZyBsaXRlcmFsCisgICsweDJCQUMgfCA3OSAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgIHwgeQorICArMHgyQkFEIHwgMDAgICAgICAgICAgICAgICAgICAgICAgfCBjaGFyICAgICAgICB8IDB4MDAgKDApICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJpbmcgdGVybWluYXRvcgorCit2dGFibGUgKHJlZmxlY3Rpb24uRmllbGQpOgorICArMHgyQkFFIHwgMUEgMDAgICAgICAgICAgICAgICAgICAgfCB1aW50MTZfdCAgICB8IDB4MDAxQSAoMjYpICAgICAgICAgICAgICAgICAgICAgICAgfCBzaXplIG9mIHRoaXMgdnRhYmxlCisgICsweDJCQjAgfCAxQyAwMCAgICAgICAgICAgICAgICAgICB8IHVpbnQxNl90ICAgIHwgMHgwMDFDICgyOCkgICAgICAgICAgICAgICAgICAgICAgICB8IHNpemUgb2YgcmVmZXJyaW5nIHRhYmxlCisgICsweDJCQjIgfCAwQyAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgIHwgMHgwMDBDICgxMikgICAgICAgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgbmFtZWAgKGlkOiAwKQorICArMHgyQkI0IHwgMTAgMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgICB8IDB4MDAxMCAoMTYpICAgICAgICAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYHR5cGVgIChpZDogMSkKKyAgKzB4MkJCNiB8IDA4IDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgfCAweDAwMDggKDgpICAgICAgICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBpZGAgKGlkOiAyKQorICArMHgyQkI4IHwgMEEgMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgICB8IDB4MDAwQSAoMTApICAgICAgICAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYG9mZnNldGAgKGlkOiAzKQorICArMHgyQkJBIHwgMDAgMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgICB8IDB4MDAwMCAoMCkgICAgICAgICAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYGRlZmF1bHRfaW50ZWdlcmAgKGlkOiA0KSA8ZGVmYXVsdHMgdG8gMD4gKExvbmcpCisgICsweDJCQkMgfCAwMCAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgIHwgMHgwMDAwICgwKSAgICAgICAgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgZGVmYXVsdF9yZWFsYCAoaWQ6IDUpIDxkZWZhdWx0cyB0byAwLjAwMDAwMD4gKERvdWJsZSkKKyAgKzB4MkJCRSB8IDA3IDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgfCAweDAwMDcgKDcpICAgICAgICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBkZXByZWNhdGVkYCAoaWQ6IDYpCisgICsweDJCQzAgfCAwMCAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgIHwgMHgwMDAwICgwKSAgICAgICAgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgcmVxdWlyZWRgIChpZDogNykgPGRlZmF1bHRzIHRvIDA+IChCb29sKQorICArMHgyQkMyIHwgMDAgMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgICB8IDB4MDAwMCAoMCkgICAgICAgICAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYGtleWAgKGlkOiA4KSA8ZGVmYXVsdHMgdG8gMD4gKEJvb2wpCisgICsweDJCQzQgfCAxNCAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgIHwgMHgwMDE0ICgyMCkgICAgICAgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgYXR0cmlidXRlc2AgKGlkOiA5KQorICArMHgyQkM2IHwgMTggMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgICB8IDB4MDAxOCAoMjQpICAgICAgICAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYGRvY3VtZW50YXRpb25gIChpZDogMTApCisKK3RhYmxlIChyZWZsZWN0aW9uLkZpZWxkKToKKyAgKzB4MkJDOCB8IDFBIDAwIDAwIDAwICAgICAgICAgICAgIHwgU09mZnNldDMyICAgfCAweDAwMDAwMDFBICgyNikgTG9jOiArMHgyQkFFICAgICAgIHwgb2Zmc2V0IHRvIHZ0YWJsZQorICArMHgyQkNDIHwgMDAgMDAgMDAgICAgICAgICAgICAgICAgfCB1aW50OF90WzNdICB8IC4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBwYWRkaW5nCisgICsweDJCQ0YgfCAwMSAgICAgICAgICAgICAgICAgICAgICB8IHVpbnQ4X3QgICAgIHwgMHgwMSAoMSkgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHRhYmxlIGZpZWxkIGBkZXByZWNhdGVkYCAoQm9vbCkKKyAgKzB4MkJEMCB8IDA0IDAwICAgICAgICAgICAgICAgICAgIHwgdWludDE2X3QgICAgfCAweDAwMDQgKDQpICAgICAgICAgICAgICAgICAgICAgICAgIHwgdGFibGUgZmllbGQgYGlkYCAoVVNob3J0KQorICArMHgyQkQyIHwgMEMgMDAgICAgICAgICAgICAgICAgICAgfCB1aW50MTZfdCAgICB8IDB4MDAwQyAoMTIpICAgICAgICAgICAgICAgICAgICAgICAgfCB0YWJsZSBmaWVsZCBgb2Zmc2V0YCAoVVNob3J0KQorICArMHgyQkQ0IHwgOTggMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDAwOTggKDE1MikgTG9jOiArMHgyQzZDICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYG5hbWVgIChzdHJpbmcpCisgICsweDJCRDggfCA4NCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDA4NCAoMTMyKSBMb2M6ICsweDJDNUMgICAgICB8IG9mZnNldCB0byBmaWVsZCBgdHlwZWAgKHRhYmxlKQorICArMHgyQkRDIHwgMEMgMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDAwMEMgKDEyKSBMb2M6ICsweDJCRTggICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYGF0dHJpYnV0ZXNgICh2ZWN0b3IpCisgICsweDJCRTAgfCAwNCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDAwNCAoNCkgTG9jOiArMHgyQkU0ICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgZG9jdW1lbnRhdGlvbmAgKHZlY3RvcikKKwordmVjdG9yIChyZWZsZWN0aW9uLkZpZWxkLmRvY3VtZW50YXRpb24pOgorICArMHgyQkU0IHwgMDAgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICB8IDB4MDAwMDAwMDAgKDApICAgICAgICAgICAgICAgICAgICAgfCBsZW5ndGggb2YgdmVjdG9yICgjIGl0ZW1zKQorCit2ZWN0b3IgKHJlZmxlY3Rpb24uRmllbGQuYXR0cmlidXRlcyk6CisgICsweDJCRTggfCAwMyAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgIHwgMHgwMDAwMDAwMyAoMykgICAgICAgICAgICAgICAgICAgICB8IGxlbmd0aCBvZiB2ZWN0b3IgKCMgaXRlbXMpCisgICsweDJCRUMgfCA0QyAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDA0QyAoNzYpIExvYzogKzB4MkMzOCAgICAgICB8IG9mZnNldCB0byB0YWJsZVswXQorICArMHgyQkYwIHwgMkMgMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDAwMkMgKDQ0KSBMb2M6ICsweDJDMUMgICAgICAgfCBvZmZzZXQgdG8gdGFibGVbMV0KKyAgKzB4MkJGNCB8IDA0IDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMDA0ICg0KSBMb2M6ICsweDJCRjggICAgICAgIHwgb2Zmc2V0IHRvIHRhYmxlWzJdCisKK3RhYmxlIChyZWZsZWN0aW9uLktleVZhbHVlKToKKyAgKzB4MkJGOCB8IDk0IEY2IEZGIEZGICAgICAgICAgICAgIHwgU09mZnNldDMyICAgfCAweEZGRkZGNjk0ICgtMjQxMikgTG9jOiArMHgzNTY0ICAgIHwgb2Zmc2V0IHRvIHZ0YWJsZQorICArMHgyQkZDIHwgMTAgMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDAwMTAgKDE2KSBMb2M6ICsweDJDMEMgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYGtleWAgKHN0cmluZykKKyAgKzB4MkMwMCB8IDA0IDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMDA0ICg0KSBMb2M6ICsweDJDMDQgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGB2YWx1ZWAgKHN0cmluZykKKworc3RyaW5nIChyZWZsZWN0aW9uLktleVZhbHVlLnZhbHVlKToKKyAgKzB4MkMwNCB8IDAxIDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgfCAweDAwMDAwMDAxICgxKSAgICAgICAgICAgICAgICAgICAgIHwgbGVuZ3RoIG9mIHN0cmluZworICArMHgyQzA4IHwgMzEgICAgICAgICAgICAgICAgICAgICAgfCBjaGFyWzFdICAgICB8IDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJpbmcgbGl0ZXJhbAorICArMHgyQzA5IHwgMDAgICAgICAgICAgICAgICAgICAgICAgfCBjaGFyICAgICAgICB8IDB4MDAgKDApICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJpbmcgdGVybWluYXRvcgorCitwYWRkaW5nOgorICArMHgyQzBBIHwgMDAgMDAgICAgICAgICAgICAgICAgICAgfCB1aW50OF90WzJdICB8IC4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBwYWRkaW5nCisKK3N0cmluZyAocmVmbGVjdGlvbi5LZXlWYWx1ZS5rZXkpOgorICArMHgyQzBDIHwgMDggMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICB8IDB4MDAwMDAwMDggKDgpICAgICAgICAgICAgICAgICAgICAgfCBsZW5ndGggb2Ygc3RyaW5nCisgICsweDJDMTAgfCA3MCA3MiA2OSA2RiA3MiA2OSA3NCA3OSB8IGNoYXJbOF0gICAgIHwgcHJpb3JpdHkgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHN0cmluZyBsaXRlcmFsCisgICsweDJDMTggfCAwMCAgICAgICAgICAgICAgICAgICAgICB8IGNoYXIgICAgICAgIHwgMHgwMCAoMCkgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHN0cmluZyB0ZXJtaW5hdG9yCisKK3BhZGRpbmc6CisgICsweDJDMTkgfCAwMCAwMCAwMCAgICAgICAgICAgICAgICB8IHVpbnQ4X3RbM10gIHwgLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHBhZGRpbmcKKwordGFibGUgKHJlZmxlY3Rpb24uS2V5VmFsdWUpOgorICArMHgyQzFDIHwgQjggRjYgRkYgRkYgICAgICAgICAgICAgfCBTT2Zmc2V0MzIgICB8IDB4RkZGRkY2QjggKC0yMzc2KSBMb2M6ICsweDM1NjQgICAgfCBvZmZzZXQgdG8gdnRhYmxlCisgICsweDJDMjAgfCAxMCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDAxMCAoMTYpIExvYzogKzB4MkMzMCAgICAgICB8IG9mZnNldCB0byBmaWVsZCBga2V5YCAoc3RyaW5nKQorICArMHgyQzI0IHwgMDQgMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDAwMDQgKDQpIExvYzogKzB4MkMyOCAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYHZhbHVlYCAoc3RyaW5nKQorCitzdHJpbmcgKHJlZmxlY3Rpb24uS2V5VmFsdWUudmFsdWUpOgorICArMHgyQzI4IHwgMDEgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICB8IDB4MDAwMDAwMDEgKDEpICAgICAgICAgICAgICAgICAgICAgfCBsZW5ndGggb2Ygc3RyaW5nCisgICsweDJDMkMgfCAzNCAgICAgICAgICAgICAgICAgICAgICB8IGNoYXJbMV0gICAgIHwgNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHN0cmluZyBsaXRlcmFsCisgICsweDJDMkQgfCAwMCAgICAgICAgICAgICAgICAgICAgICB8IGNoYXIgICAgICAgIHwgMHgwMCAoMCkgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHN0cmluZyB0ZXJtaW5hdG9yCisKK3BhZGRpbmc6CisgICsweDJDMkUgfCAwMCAwMCAgICAgICAgICAgICAgICAgICB8IHVpbnQ4X3RbMl0gIHwgLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHBhZGRpbmcKKworc3RyaW5nIChyZWZsZWN0aW9uLktleVZhbHVlLmtleSk6CisgICsweDJDMzAgfCAwMiAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgIHwgMHgwMDAwMDAwMiAoMikgICAgICAgICAgICAgICAgICAgICB8IGxlbmd0aCBvZiBzdHJpbmcKKyAgKzB4MkMzNCB8IDY5IDY0ICAgICAgICAgICAgICAgICAgIHwgY2hhclsyXSAgICAgfCBpZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nIGxpdGVyYWwKKyAgKzB4MkMzNiB8IDAwICAgICAgICAgICAgICAgICAgICAgIHwgY2hhciAgICAgICAgfCAweDAwICgwKSAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nIHRlcm1pbmF0b3IKKwordGFibGUgKHJlZmxlY3Rpb24uS2V5VmFsdWUpOgorICArMHgyQzM4IHwgRDQgRjYgRkYgRkYgICAgICAgICAgICAgfCBTT2Zmc2V0MzIgICB8IDB4RkZGRkY2RDQgKC0yMzQ4KSBMb2M6ICsweDM1NjQgICAgfCBvZmZzZXQgdG8gdnRhYmxlCisgICsweDJDM0MgfCAxMCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDAxMCAoMTYpIExvYzogKzB4MkM0QyAgICAgICB8IG9mZnNldCB0byBmaWVsZCBga2V5YCAoc3RyaW5nKQorICArMHgyQzQwIHwgMDQgMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDAwMDQgKDQpIExvYzogKzB4MkM0NCAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYHZhbHVlYCAoc3RyaW5nKQorCitzdHJpbmcgKHJlZmxlY3Rpb24uS2V5VmFsdWUudmFsdWUpOgorICArMHgyQzQ0IHwgMDEgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICB8IDB4MDAwMDAwMDEgKDEpICAgICAgICAgICAgICAgICAgICAgfCBsZW5ndGggb2Ygc3RyaW5nCisgICsweDJDNDggfCAzMCAgICAgICAgICAgICAgICAgICAgICB8IGNoYXJbMV0gICAgIHwgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHN0cmluZyBsaXRlcmFsCisgICsweDJDNDkgfCAwMCAgICAgICAgICAgICAgICAgICAgICB8IGNoYXIgICAgICAgIHwgMHgwMCAoMCkgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHN0cmluZyB0ZXJtaW5hdG9yCisKK3BhZGRpbmc6CisgICsweDJDNEEgfCAwMCAwMCAgICAgICAgICAgICAgICAgICB8IHVpbnQ4X3RbMl0gIHwgLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHBhZGRpbmcKKworc3RyaW5nIChyZWZsZWN0aW9uLktleVZhbHVlLmtleSk6CisgICsweDJDNEMgfCAwQSAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgIHwgMHgwMDAwMDAwQSAoMTApICAgICAgICAgICAgICAgICAgICB8IGxlbmd0aCBvZiBzdHJpbmcKKyAgKzB4MkM1MCB8IDY0IDY1IDcwIDcyIDY1IDYzIDYxIDc0IHwgY2hhclsxMF0gICAgfCBkZXByZWNhdCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nIGxpdGVyYWwKKyAgKzB4MkM1OCB8IDY1IDY0ICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgfCBlZAorICArMHgyQzVBIHwgMDAgICAgICAgICAgICAgICAgICAgICAgfCBjaGFyICAgICAgICB8IDB4MDAgKDApICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJpbmcgdGVybWluYXRvcgorCit0YWJsZSAocmVmbGVjdGlvbi5UeXBlKToKKyAgKzB4MkM1QyB8IDc4IEY1IEZGIEZGICAgICAgICAgICAgIHwgU09mZnNldDMyICAgfCAweEZGRkZGNTc4ICgtMjY5NikgTG9jOiArMHgzNkU0ICAgIHwgb2Zmc2V0IHRvIHZ0YWJsZQorICArMHgyQzYwIHwgMDAgMDAgMDAgICAgICAgICAgICAgICAgfCB1aW50OF90WzNdICB8IC4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBwYWRkaW5nCisgICsweDJDNjMgfCAwMiAgICAgICAgICAgICAgICAgICAgICB8IHVpbnQ4X3QgICAgIHwgMHgwMiAoMikgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHRhYmxlIGZpZWxkIGBiYXNlX3R5cGVgIChCeXRlKQorICArMHgyQzY0IHwgMDEgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICB8IDB4MDAwMDAwMDEgKDEpICAgICAgICAgICAgICAgICAgICAgfCB0YWJsZSBmaWVsZCBgYmFzZV9zaXplYCAoVUludCkKKyAgKzB4MkM2OCB8IDAxIDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgfCAweDAwMDAwMDAxICgxKSAgICAgICAgICAgICAgICAgICAgIHwgdGFibGUgZmllbGQgYGVsZW1lbnRfc2l6ZWAgKFVJbnQpCisKK3N0cmluZyAocmVmbGVjdGlvbi5GaWVsZC5uYW1lKToKKyAgKzB4MkM2QyB8IDA4IDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgfCAweDAwMDAwMDA4ICg4KSAgICAgICAgICAgICAgICAgICAgIHwgbGVuZ3RoIG9mIHN0cmluZworICArMHgyQzcwIHwgNjYgNzIgNjkgNjUgNkUgNjQgNkMgNzkgfCBjaGFyWzhdICAgICB8IGZyaWVuZGx5ICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJpbmcgbGl0ZXJhbAorICArMHgyQzc4IHwgMDAgICAgICAgICAgICAgICAgICAgICAgfCBjaGFyICAgICAgICB8IDB4MDAgKDApICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJpbmcgdGVybWluYXRvcgorCit2dGFibGUgKHJlZmxlY3Rpb24uRmllbGQpOgorICArMHgyQzdBIHwgMUEgMDAgICAgICAgICAgICAgICAgICAgfCB1aW50MTZfdCAgICB8IDB4MDAxQSAoMjYpICAgICAgICAgICAgICAgICAgICAgICAgfCBzaXplIG9mIHRoaXMgdnRhYmxlCisgICsweDJDN0MgfCAxQyAwMCAgICAgICAgICAgICAgICAgICB8IHVpbnQxNl90ICAgIHwgMHgwMDFDICgyOCkgICAgICAgICAgICAgICAgICAgICAgICB8IHNpemUgb2YgcmVmZXJyaW5nIHRhYmxlCisgICsweDJDN0UgfCAwQyAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgIHwgMHgwMDBDICgxMikgICAgICAgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgbmFtZWAgKGlkOiAwKQorICArMHgyQzgwIHwgMTAgMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgICB8IDB4MDAxMCAoMTYpICAgICAgICAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYHR5cGVgIChpZDogMSkKKyAgKzB4MkM4MiB8IDA4IDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgfCAweDAwMDggKDgpICAgICAgICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBpZGAgKGlkOiAyKQorICArMHgyQzg0IHwgMEEgMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgICB8IDB4MDAwQSAoMTApICAgICAgICAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYG9mZnNldGAgKGlkOiAzKQorICArMHgyQzg2IHwgMDAgMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgICB8IDB4MDAwMCAoMCkgICAgICAgICAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYGRlZmF1bHRfaW50ZWdlcmAgKGlkOiA0KSA8ZGVmYXVsdHMgdG8gMD4gKExvbmcpCisgICsweDJDODggfCAwMCAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgIHwgMHgwMDAwICgwKSAgICAgICAgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgZGVmYXVsdF9yZWFsYCAoaWQ6IDUpIDxkZWZhdWx0cyB0byAwLjAwMDAwMD4gKERvdWJsZSkKKyAgKzB4MkM4QSB8IDAwIDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgfCAweDAwMDAgKDApICAgICAgICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBkZXByZWNhdGVkYCAoaWQ6IDYpIDxkZWZhdWx0cyB0byAwPiAoQm9vbCkKKyAgKzB4MkM4QyB8IDA2IDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgfCAweDAwMDYgKDYpICAgICAgICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGByZXF1aXJlZGAgKGlkOiA3KQorICArMHgyQzhFIHwgMDcgMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgICB8IDB4MDAwNyAoNykgICAgICAgICAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYGtleWAgKGlkOiA4KQorICArMHgyQzkwIHwgMTQgMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgICB8IDB4MDAxNCAoMjApICAgICAgICAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYGF0dHJpYnV0ZXNgIChpZDogOSkKKyAgKzB4MkM5MiB8IDE4IDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgfCAweDAwMTggKDI0KSAgICAgICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBkb2N1bWVudGF0aW9uYCAoaWQ6IDEwKQorCit0YWJsZSAocmVmbGVjdGlvbi5GaWVsZCk6CisgICsweDJDOTQgfCAxQSAwMCAwMCAwMCAgICAgICAgICAgICB8IFNPZmZzZXQzMiAgIHwgMHgwMDAwMDAxQSAoMjYpIExvYzogKzB4MkM3QSAgICAgICB8IG9mZnNldCB0byB2dGFibGUKKyAgKzB4MkM5OCB8IDAwIDAwICAgICAgICAgICAgICAgICAgIHwgdWludDhfdFsyXSAgfCAuLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgcGFkZGluZworICArMHgyQzlBIHwgMDEgICAgICAgICAgICAgICAgICAgICAgfCB1aW50OF90ICAgICB8IDB4MDEgKDEpICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB0YWJsZSBmaWVsZCBgcmVxdWlyZWRgIChCb29sKQorICArMHgyQzlCIHwgMDEgICAgICAgICAgICAgICAgICAgICAgfCB1aW50OF90ICAgICB8IDB4MDEgKDEpICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB0YWJsZSBmaWVsZCBga2V5YCAoQm9vbCkKKyAgKzB4MkM5QyB8IDAzIDAwICAgICAgICAgICAgICAgICAgIHwgdWludDE2X3QgICAgfCAweDAwMDMgKDMpICAgICAgICAgICAgICAgICAgICAgICAgIHwgdGFibGUgZmllbGQgYGlkYCAoVVNob3J0KQorICArMHgyQzlFIHwgMEEgMDAgICAgICAgICAgICAgICAgICAgfCB1aW50MTZfdCAgICB8IDB4MDAwQSAoMTApICAgICAgICAgICAgICAgICAgICAgICAgfCB0YWJsZSBmaWVsZCBgb2Zmc2V0YCAoVVNob3J0KQorICArMHgyQ0EwIHwgNjQgMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDAwNjQgKDEwMCkgTG9jOiArMHgyRDA0ICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYG5hbWVgIChzdHJpbmcpCisgICsweDJDQTQgfCA1NCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDA1NCAoODQpIExvYzogKzB4MkNGOCAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgdHlwZWAgKHRhYmxlKQorICArMHgyQ0E4IHwgMEMgMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDAwMEMgKDEyKSBMb2M6ICsweDJDQjQgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYGF0dHJpYnV0ZXNgICh2ZWN0b3IpCisgICsweDJDQUMgfCAwNCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDAwNCAoNCkgTG9jOiArMHgyQ0IwICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgZG9jdW1lbnRhdGlvbmAgKHZlY3RvcikKKwordmVjdG9yIChyZWZsZWN0aW9uLkZpZWxkLmRvY3VtZW50YXRpb24pOgorICArMHgyQ0IwIHwgMDAgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICB8IDB4MDAwMDAwMDAgKDApICAgICAgICAgICAgICAgICAgICAgfCBsZW5ndGggb2YgdmVjdG9yICgjIGl0ZW1zKQorCit2ZWN0b3IgKHJlZmxlY3Rpb24uRmllbGQuYXR0cmlidXRlcyk6CisgICsweDJDQjQgfCAwMiAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgIHwgMHgwMDAwMDAwMiAoMikgICAgICAgICAgICAgICAgICAgICB8IGxlbmd0aCBvZiB2ZWN0b3IgKCMgaXRlbXMpCisgICsweDJDQjggfCAyNCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDAyNCAoMzYpIExvYzogKzB4MkNEQyAgICAgICB8IG9mZnNldCB0byB0YWJsZVswXQorICArMHgyQ0JDIHwgMDQgMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDAwMDQgKDQpIExvYzogKzB4MkNDMCAgICAgICAgfCBvZmZzZXQgdG8gdGFibGVbMV0KKwordGFibGUgKHJlZmxlY3Rpb24uS2V5VmFsdWUpOgorICArMHgyQ0MwIHwgNUMgRjcgRkYgRkYgICAgICAgICAgICAgfCBTT2Zmc2V0MzIgICB8IDB4RkZGRkY3NUMgKC0yMjEyKSBMb2M6ICsweDM1NjQgICAgfCBvZmZzZXQgdG8gdnRhYmxlCisgICsweDJDQzQgfCAxMCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDAxMCAoMTYpIExvYzogKzB4MkNENCAgICAgICB8IG9mZnNldCB0byBmaWVsZCBga2V5YCAoc3RyaW5nKQorICArMHgyQ0M4IHwgMDQgMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDAwMDQgKDQpIExvYzogKzB4MkNDQyAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYHZhbHVlYCAoc3RyaW5nKQorCitzdHJpbmcgKHJlZmxlY3Rpb24uS2V5VmFsdWUudmFsdWUpOgorICArMHgyQ0NDIHwgMDEgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICB8IDB4MDAwMDAwMDEgKDEpICAgICAgICAgICAgICAgICAgICAgfCBsZW5ndGggb2Ygc3RyaW5nCisgICsweDJDRDAgfCAzMCAgICAgICAgICAgICAgICAgICAgICB8IGNoYXJbMV0gICAgIHwgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHN0cmluZyBsaXRlcmFsCisgICsweDJDRDEgfCAwMCAgICAgICAgICAgICAgICAgICAgICB8IGNoYXIgICAgICAgIHwgMHgwMCAoMCkgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHN0cmluZyB0ZXJtaW5hdG9yCisKK3BhZGRpbmc6CisgICsweDJDRDIgfCAwMCAwMCAgICAgICAgICAgICAgICAgICB8IHVpbnQ4X3RbMl0gIHwgLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHBhZGRpbmcKKworc3RyaW5nIChyZWZsZWN0aW9uLktleVZhbHVlLmtleSk6CisgICsweDJDRDQgfCAwMyAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgIHwgMHgwMDAwMDAwMyAoMykgICAgICAgICAgICAgICAgICAgICB8IGxlbmd0aCBvZiBzdHJpbmcKKyAgKzB4MkNEOCB8IDZCIDY1IDc5ICAgICAgICAgICAgICAgIHwgY2hhclszXSAgICAgfCBrZXkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nIGxpdGVyYWwKKyAgKzB4MkNEQiB8IDAwICAgICAgICAgICAgICAgICAgICAgIHwgY2hhciAgICAgICAgfCAweDAwICgwKSAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nIHRlcm1pbmF0b3IKKwordGFibGUgKHJlZmxlY3Rpb24uS2V5VmFsdWUpOgorICArMHgyQ0RDIHwgNzggRjcgRkYgRkYgICAgICAgICAgICAgfCBTT2Zmc2V0MzIgICB8IDB4RkZGRkY3NzggKC0yMTg0KSBMb2M6ICsweDM1NjQgICAgfCBvZmZzZXQgdG8gdnRhYmxlCisgICsweDJDRTAgfCAxMCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDAxMCAoMTYpIExvYzogKzB4MkNGMCAgICAgICB8IG9mZnNldCB0byBmaWVsZCBga2V5YCAoc3RyaW5nKQorICArMHgyQ0U0IHwgMDQgMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDAwMDQgKDQpIExvYzogKzB4MkNFOCAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYHZhbHVlYCAoc3RyaW5nKQorCitzdHJpbmcgKHJlZmxlY3Rpb24uS2V5VmFsdWUudmFsdWUpOgorICArMHgyQ0U4IHwgMDEgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICB8IDB4MDAwMDAwMDEgKDEpICAgICAgICAgICAgICAgICAgICAgfCBsZW5ndGggb2Ygc3RyaW5nCisgICsweDJDRUMgfCAzMyAgICAgICAgICAgICAgICAgICAgICB8IGNoYXJbMV0gICAgIHwgMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHN0cmluZyBsaXRlcmFsCisgICsweDJDRUQgfCAwMCAgICAgICAgICAgICAgICAgICAgICB8IGNoYXIgICAgICAgIHwgMHgwMCAoMCkgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHN0cmluZyB0ZXJtaW5hdG9yCisKK3BhZGRpbmc6CisgICsweDJDRUUgfCAwMCAwMCAgICAgICAgICAgICAgICAgICB8IHVpbnQ4X3RbMl0gIHwgLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHBhZGRpbmcKKworc3RyaW5nIChyZWZsZWN0aW9uLktleVZhbHVlLmtleSk6CisgICsweDJDRjAgfCAwMiAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgIHwgMHgwMDAwMDAwMiAoMikgICAgICAgICAgICAgICAgICAgICB8IGxlbmd0aCBvZiBzdHJpbmcKKyAgKzB4MkNGNCB8IDY5IDY0ICAgICAgICAgICAgICAgICAgIHwgY2hhclsyXSAgICAgfCBpZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nIGxpdGVyYWwKKyAgKzB4MkNGNiB8IDAwICAgICAgICAgICAgICAgICAgICAgIHwgY2hhciAgICAgICAgfCAweDAwICgwKSAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nIHRlcm1pbmF0b3IKKwordGFibGUgKHJlZmxlY3Rpb24uVHlwZSk6CisgICsweDJDRjggfCA1QyBGMyBGRiBGRiAgICAgICAgICAgICB8IFNPZmZzZXQzMiAgIHwgMHhGRkZGRjM1QyAoLTMyMzYpIExvYzogKzB4Mzk5QyAgICB8IG9mZnNldCB0byB2dGFibGUKKyAgKzB4MkNGQyB8IDAwIDAwIDAwICAgICAgICAgICAgICAgIHwgdWludDhfdFszXSAgfCAuLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgcGFkZGluZworICArMHgyQ0ZGIHwgMEQgICAgICAgICAgICAgICAgICAgICAgfCB1aW50OF90ICAgICB8IDB4MEQgKDEzKSAgICAgICAgICAgICAgICAgICAgICAgICAgfCB0YWJsZSBmaWVsZCBgYmFzZV90eXBlYCAoQnl0ZSkKKyAgKzB4MkQwMCB8IDAxIDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgfCAweDAwMDAwMDAxICgxKSAgICAgICAgICAgICAgICAgICAgIHwgdGFibGUgZmllbGQgYGVsZW1lbnRfc2l6ZWAgKFVJbnQpCisKK3N0cmluZyAocmVmbGVjdGlvbi5GaWVsZC5uYW1lKToKKyAgKzB4MkQwNCB8IDA0IDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgfCAweDAwMDAwMDA0ICg0KSAgICAgICAgICAgICAgICAgICAgIHwgbGVuZ3RoIG9mIHN0cmluZworICArMHgyRDA4IHwgNkUgNjEgNkQgNjUgICAgICAgICAgICAgfCBjaGFyWzRdICAgICB8IG5hbWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJpbmcgbGl0ZXJhbAorICArMHgyRDBDIHwgMDAgICAgICAgICAgICAgICAgICAgICAgfCBjaGFyICAgICAgICB8IDB4MDAgKDApICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJpbmcgdGVybWluYXRvcgorCitwYWRkaW5nOgorICArMHgyRDBEIHwgMDAgMDAgMDAgICAgICAgICAgICAgICAgfCB1aW50OF90WzNdICB8IC4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBwYWRkaW5nCisKK3RhYmxlIChyZWZsZWN0aW9uLkZpZWxkKToKKyAgKzB4MkQxMCB8IDlBIEZGIEZGIEZGICAgICAgICAgICAgIHwgU09mZnNldDMyICAgfCAweEZGRkZGRjlBICgtMTAyKSBMb2M6ICsweDJENzYgICAgIHwgb2Zmc2V0IHRvIHZ0YWJsZQorICArMHgyRDE0IHwgMDIgMDAgICAgICAgICAgICAgICAgICAgfCB1aW50MTZfdCAgICB8IDB4MDAwMiAoMikgICAgICAgICAgICAgICAgICAgICAgICAgfCB0YWJsZSBmaWVsZCBgaWRgIChVU2hvcnQpCisgICsweDJEMTYgfCAwOCAwMCAgICAgICAgICAgICAgICAgICB8IHVpbnQxNl90ICAgIHwgMHgwMDA4ICg4KSAgICAgICAgICAgICAgICAgICAgICAgICB8IHRhYmxlIGZpZWxkIGBvZmZzZXRgIChVU2hvcnQpCisgICsweDJEMTggfCA1NCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDA1NCAoODQpIExvYzogKzB4MkQ2QyAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgbmFtZWAgKHN0cmluZykKKyAgKzB4MkQxQyB8IDQwIDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMDQwICg2NCkgTG9jOiArMHgyRDVDICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGB0eXBlYCAodGFibGUpCisgICsweDJEMjAgfCAxOCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDAxOCAoMjQpIExvYzogKzB4MkQzOCAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgYXR0cmlidXRlc2AgKHZlY3RvcikKKyAgKzB4MkQyNCB8IDEwIDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMDEwICgxNikgTG9jOiArMHgyRDM0ICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBkb2N1bWVudGF0aW9uYCAodmVjdG9yKQorICArMHgyRDI4IHwgNjQgMDAgMDAgMDAgMDAgMDAgMDAgMDAgfCBpbnQ2NF90ICAgICB8IDB4MDAwMDAwMDAwMDAwMDA2NCAoMTAwKSAgICAgICAgICAgfCB0YWJsZSBmaWVsZCBgZGVmYXVsdF9pbnRlZ2VyYCAoTG9uZykKKyAgKzB4MkQzMCB8IDAwIDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDhfdFs0XSAgfCAuLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgcGFkZGluZworCit2ZWN0b3IgKHJlZmxlY3Rpb24uRmllbGQuZG9jdW1lbnRhdGlvbik6CisgICsweDJEMzQgfCAwMCAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgIHwgMHgwMDAwMDAwMCAoMCkgICAgICAgICAgICAgICAgICAgICB8IGxlbmd0aCBvZiB2ZWN0b3IgKCMgaXRlbXMpCisKK3ZlY3RvciAocmVmbGVjdGlvbi5GaWVsZC5hdHRyaWJ1dGVzKToKKyAgKzB4MkQzOCB8IDAxIDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgfCAweDAwMDAwMDAxICgxKSAgICAgICAgICAgICAgICAgICAgIHwgbGVuZ3RoIG9mIHZlY3RvciAoIyBpdGVtcykKKyAgKzB4MkQzQyB8IDA0IDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMDA0ICg0KSBMb2M6ICsweDJENDAgICAgICAgIHwgb2Zmc2V0IHRvIHRhYmxlWzBdCisKK3RhYmxlIChyZWZsZWN0aW9uLktleVZhbHVlKToKKyAgKzB4MkQ0MCB8IERDIEY3IEZGIEZGICAgICAgICAgICAgIHwgU09mZnNldDMyICAgfCAweEZGRkZGN0RDICgtMjA4NCkgTG9jOiArMHgzNTY0ICAgIHwgb2Zmc2V0IHRvIHZ0YWJsZQorICArMHgyRDQ0IHwgMTAgMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDAwMTAgKDE2KSBMb2M6ICsweDJENTQgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYGtleWAgKHN0cmluZykKKyAgKzB4MkQ0OCB8IDA0IDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMDA0ICg0KSBMb2M6ICsweDJENEMgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGB2YWx1ZWAgKHN0cmluZykKKworc3RyaW5nIChyZWZsZWN0aW9uLktleVZhbHVlLnZhbHVlKToKKyAgKzB4MkQ0QyB8IDAxIDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgfCAweDAwMDAwMDAxICgxKSAgICAgICAgICAgICAgICAgICAgIHwgbGVuZ3RoIG9mIHN0cmluZworICArMHgyRDUwIHwgMzIgICAgICAgICAgICAgICAgICAgICAgfCBjaGFyWzFdICAgICB8IDIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJpbmcgbGl0ZXJhbAorICArMHgyRDUxIHwgMDAgICAgICAgICAgICAgICAgICAgICAgfCBjaGFyICAgICAgICB8IDB4MDAgKDApICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJpbmcgdGVybWluYXRvcgorCitwYWRkaW5nOgorICArMHgyRDUyIHwgMDAgMDAgICAgICAgICAgICAgICAgICAgfCB1aW50OF90WzJdICB8IC4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBwYWRkaW5nCisKK3N0cmluZyAocmVmbGVjdGlvbi5LZXlWYWx1ZS5rZXkpOgorICArMHgyRDU0IHwgMDIgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICB8IDB4MDAwMDAwMDIgKDIpICAgICAgICAgICAgICAgICAgICAgfCBsZW5ndGggb2Ygc3RyaW5nCisgICsweDJENTggfCA2OSA2NCAgICAgICAgICAgICAgICAgICB8IGNoYXJbMl0gICAgIHwgaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHN0cmluZyBsaXRlcmFsCisgICsweDJENUEgfCAwMCAgICAgICAgICAgICAgICAgICAgICB8IGNoYXIgICAgICAgIHwgMHgwMCAoMCkgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHN0cmluZyB0ZXJtaW5hdG9yCisKK3RhYmxlIChyZWZsZWN0aW9uLlR5cGUpOgorICArMHgyRDVDIHwgNzggRjYgRkYgRkYgICAgICAgICAgICAgfCBTT2Zmc2V0MzIgICB8IDB4RkZGRkY2NzggKC0yNDQwKSBMb2M6ICsweDM2RTQgICAgfCBvZmZzZXQgdG8gdnRhYmxlCisgICsweDJENjAgfCAwMCAwMCAwMCAgICAgICAgICAgICAgICB8IHVpbnQ4X3RbM10gIHwgLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHBhZGRpbmcKKyAgKzB4MkQ2MyB8IDA1ICAgICAgICAgICAgICAgICAgICAgIHwgdWludDhfdCAgICAgfCAweDA1ICg1KSAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgdGFibGUgZmllbGQgYGJhc2VfdHlwZWAgKEJ5dGUpCisgICsweDJENjQgfCAwMiAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgIHwgMHgwMDAwMDAwMiAoMikgICAgICAgICAgICAgICAgICAgICB8IHRhYmxlIGZpZWxkIGBiYXNlX3NpemVgIChVSW50KQorICArMHgyRDY4IHwgMDEgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICB8IDB4MDAwMDAwMDEgKDEpICAgICAgICAgICAgICAgICAgICAgfCB0YWJsZSBmaWVsZCBgZWxlbWVudF9zaXplYCAoVUludCkKKworc3RyaW5nIChyZWZsZWN0aW9uLkZpZWxkLm5hbWUpOgorICArMHgyRDZDIHwgMDIgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICB8IDB4MDAwMDAwMDIgKDIpICAgICAgICAgICAgICAgICAgICAgfCBsZW5ndGggb2Ygc3RyaW5nCisgICsweDJENzAgfCA2OCA3MCAgICAgICAgICAgICAgICAgICB8IGNoYXJbMl0gICAgIHwgaHAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHN0cmluZyBsaXRlcmFsCisgICsweDJENzIgfCAwMCAgICAgICAgICAgICAgICAgICAgICB8IGNoYXIgICAgICAgIHwgMHgwMCAoMCkgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHN0cmluZyB0ZXJtaW5hdG9yCisKK3BhZGRpbmc6CisgICsweDJENzMgfCAwMCAwMCAwMCAgICAgICAgICAgICAgICB8IHVpbnQ4X3RbM10gIHwgLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHBhZGRpbmcKKwordnRhYmxlIChyZWZsZWN0aW9uLkZpZWxkKToKKyAgKzB4MkQ3NiB8IDFBIDAwICAgICAgICAgICAgICAgICAgIHwgdWludDE2X3QgICAgfCAweDAwMUEgKDI2KSAgICAgICAgICAgICAgICAgICAgICAgIHwgc2l6ZSBvZiB0aGlzIHZ0YWJsZQorICArMHgyRDc4IHwgMjQgMDAgICAgICAgICAgICAgICAgICAgfCB1aW50MTZfdCAgICB8IDB4MDAyNCAoMzYpICAgICAgICAgICAgICAgICAgICAgICAgfCBzaXplIG9mIHJlZmVycmluZyB0YWJsZQorICArMHgyRDdBIHwgMDggMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgICB8IDB4MDAwOCAoOCkgICAgICAgICAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYG5hbWVgIChpZDogMCkKKyAgKzB4MkQ3QyB8IDBDIDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgfCAweDAwMEMgKDEyKSAgICAgICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGB0eXBlYCAoaWQ6IDEpCisgICsweDJEN0UgfCAwNCAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgIHwgMHgwMDA0ICg0KSAgICAgICAgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgaWRgIChpZDogMikKKyAgKzB4MkQ4MCB8IDA2IDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgfCAweDAwMDYgKDYpICAgICAgICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBvZmZzZXRgIChpZDogMykKKyAgKzB4MkQ4MiB8IDE4IDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgfCAweDAwMTggKDI0KSAgICAgICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBkZWZhdWx0X2ludGVnZXJgIChpZDogNCkKKyAgKzB4MkQ4NCB8IDAwIDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgfCAweDAwMDAgKDApICAgICAgICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBkZWZhdWx0X3JlYWxgIChpZDogNSkgPGRlZmF1bHRzIHRvIDAuMDAwMDAwPiAoRG91YmxlKQorICArMHgyRDg2IHwgMDAgMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgICB8IDB4MDAwMCAoMCkgICAgICAgICAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYGRlcHJlY2F0ZWRgIChpZDogNikgPGRlZmF1bHRzIHRvIDA+IChCb29sKQorICArMHgyRDg4IHwgMDAgMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgICB8IDB4MDAwMCAoMCkgICAgICAgICAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYHJlcXVpcmVkYCAoaWQ6IDcpIDxkZWZhdWx0cyB0byAwPiAoQm9vbCkKKyAgKzB4MkQ4QSB8IDAwIDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgfCAweDAwMDAgKDApICAgICAgICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBrZXlgIChpZDogOCkgPGRlZmF1bHRzIHRvIDA+IChCb29sKQorICArMHgyRDhDIHwgMTAgMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgICB8IDB4MDAxMCAoMTYpICAgICAgICAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYGF0dHJpYnV0ZXNgIChpZDogOSkKKyAgKzB4MkQ4RSB8IDE0IDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgfCAweDAwMTQgKDIwKSAgICAgICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBkb2N1bWVudGF0aW9uYCAoaWQ6IDEwKQorCit0YWJsZSAocmVmbGVjdGlvbi5GaWVsZCk6CisgICsweDJEOTAgfCAxQSAwMCAwMCAwMCAgICAgICAgICAgICB8IFNPZmZzZXQzMiAgIHwgMHgwMDAwMDAxQSAoMjYpIExvYzogKzB4MkQ3NiAgICAgICB8IG9mZnNldCB0byB2dGFibGUKKyAgKzB4MkQ5NCB8IDAxIDAwICAgICAgICAgICAgICAgICAgIHwgdWludDE2X3QgICAgfCAweDAwMDEgKDEpICAgICAgICAgICAgICAgICAgICAgICAgIHwgdGFibGUgZmllbGQgYGlkYCAoVVNob3J0KQorICArMHgyRDk2IHwgMDYgMDAgICAgICAgICAgICAgICAgICAgfCB1aW50MTZfdCAgICB8IDB4MDAwNiAoNikgICAgICAgICAgICAgICAgICAgICAgICAgfCB0YWJsZSBmaWVsZCBgb2Zmc2V0YCAoVVNob3J0KQorICArMHgyRDk4IHwgNTQgMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDAwNTQgKDg0KSBMb2M6ICsweDJERUMgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYG5hbWVgIChzdHJpbmcpCisgICsweDJEOUMgfCA0MCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDA0MCAoNjQpIExvYzogKzB4MkREQyAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgdHlwZWAgKHRhYmxlKQorICArMHgyREEwIHwgMTggMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDAwMTggKDI0KSBMb2M6ICsweDJEQjggICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYGF0dHJpYnV0ZXNgICh2ZWN0b3IpCisgICsweDJEQTQgfCAxMCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDAxMCAoMTYpIExvYzogKzB4MkRCNCAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgZG9jdW1lbnRhdGlvbmAgKHZlY3RvcikKKyAgKzB4MkRBOCB8IDk2IDAwIDAwIDAwIDAwIDAwIDAwIDAwIHwgaW50NjRfdCAgICAgfCAweDAwMDAwMDAwMDAwMDAwOTYgKDE1MCkgICAgICAgICAgIHwgdGFibGUgZmllbGQgYGRlZmF1bHRfaW50ZWdlcmAgKExvbmcpCisgICsweDJEQjAgfCAwMCAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQ4X3RbNF0gIHwgLi4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHBhZGRpbmcKKwordmVjdG9yIChyZWZsZWN0aW9uLkZpZWxkLmRvY3VtZW50YXRpb24pOgorICArMHgyREI0IHwgMDAgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICB8IDB4MDAwMDAwMDAgKDApICAgICAgICAgICAgICAgICAgICAgfCBsZW5ndGggb2YgdmVjdG9yICgjIGl0ZW1zKQorCit2ZWN0b3IgKHJlZmxlY3Rpb24uRmllbGQuYXR0cmlidXRlcyk6CisgICsweDJEQjggfCAwMSAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgIHwgMHgwMDAwMDAwMSAoMSkgICAgICAgICAgICAgICAgICAgICB8IGxlbmd0aCBvZiB2ZWN0b3IgKCMgaXRlbXMpCisgICsweDJEQkMgfCAwNCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDAwNCAoNCkgTG9jOiArMHgyREMwICAgICAgICB8IG9mZnNldCB0byB0YWJsZVswXQorCit0YWJsZSAocmVmbGVjdGlvbi5LZXlWYWx1ZSk6CisgICsweDJEQzAgfCA1QyBGOCBGRiBGRiAgICAgICAgICAgICB8IFNPZmZzZXQzMiAgIHwgMHhGRkZGRjg1QyAoLTE5NTYpIExvYzogKzB4MzU2NCAgICB8IG9mZnNldCB0byB2dGFibGUKKyAgKzB4MkRDNCB8IDEwIDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMDEwICgxNikgTG9jOiArMHgyREQ0ICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBrZXlgIChzdHJpbmcpCisgICsweDJEQzggfCAwNCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDAwNCAoNCkgTG9jOiArMHgyRENDICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgdmFsdWVgIChzdHJpbmcpCisKK3N0cmluZyAocmVmbGVjdGlvbi5LZXlWYWx1ZS52YWx1ZSk6CisgICsweDJEQ0MgfCAwMSAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgIHwgMHgwMDAwMDAwMSAoMSkgICAgICAgICAgICAgICAgICAgICB8IGxlbmd0aCBvZiBzdHJpbmcKKyAgKzB4MkREMCB8IDMxICAgICAgICAgICAgICAgICAgICAgIHwgY2hhclsxXSAgICAgfCAxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nIGxpdGVyYWwKKyAgKzB4MkREMSB8IDAwICAgICAgICAgICAgICAgICAgICAgIHwgY2hhciAgICAgICAgfCAweDAwICgwKSAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nIHRlcm1pbmF0b3IKKworcGFkZGluZzoKKyAgKzB4MkREMiB8IDAwIDAwICAgICAgICAgICAgICAgICAgIHwgdWludDhfdFsyXSAgfCAuLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgcGFkZGluZworCitzdHJpbmcgKHJlZmxlY3Rpb24uS2V5VmFsdWUua2V5KToKKyAgKzB4MkRENCB8IDAyIDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgfCAweDAwMDAwMDAyICgyKSAgICAgICAgICAgICAgICAgICAgIHwgbGVuZ3RoIG9mIHN0cmluZworICArMHgyREQ4IHwgNjkgNjQgICAgICAgICAgICAgICAgICAgfCBjaGFyWzJdICAgICB8IGlkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJpbmcgbGl0ZXJhbAorICArMHgyRERBIHwgMDAgICAgICAgICAgICAgICAgICAgICAgfCBjaGFyICAgICAgICB8IDB4MDAgKDApICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJpbmcgdGVybWluYXRvcgorCit0YWJsZSAocmVmbGVjdGlvbi5UeXBlKToKKyAgKzB4MkREQyB8IEY4IEY2IEZGIEZGICAgICAgICAgICAgIHwgU09mZnNldDMyICAgfCAweEZGRkZGNkY4ICgtMjMxMikgTG9jOiArMHgzNkU0ICAgIHwgb2Zmc2V0IHRvIHZ0YWJsZQorICArMHgyREUwIHwgMDAgMDAgMDAgICAgICAgICAgICAgICAgfCB1aW50OF90WzNdICB8IC4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBwYWRkaW5nCisgICsweDJERTMgfCAwNSAgICAgICAgICAgICAgICAgICAgICB8IHVpbnQ4X3QgICAgIHwgMHgwNSAoNSkgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHRhYmxlIGZpZWxkIGBiYXNlX3R5cGVgIChCeXRlKQorICArMHgyREU0IHwgMDIgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICB8IDB4MDAwMDAwMDIgKDIpICAgICAgICAgICAgICAgICAgICAgfCB0YWJsZSBmaWVsZCBgYmFzZV9zaXplYCAoVUludCkKKyAgKzB4MkRFOCB8IDAxIDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgfCAweDAwMDAwMDAxICgxKSAgICAgICAgICAgICAgICAgICAgIHwgdGFibGUgZmllbGQgYGVsZW1lbnRfc2l6ZWAgKFVJbnQpCisKK3N0cmluZyAocmVmbGVjdGlvbi5GaWVsZC5uYW1lKToKKyAgKzB4MkRFQyB8IDA0IDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgfCAweDAwMDAwMDA0ICg0KSAgICAgICAgICAgICAgICAgICAgIHwgbGVuZ3RoIG9mIHN0cmluZworICArMHgyREYwIHwgNkQgNjEgNkUgNjEgICAgICAgICAgICAgfCBjaGFyWzRdICAgICB8IG1hbmEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJpbmcgbGl0ZXJhbAorICArMHgyREY0IHwgMDAgICAgICAgICAgICAgICAgICAgICAgfCBjaGFyICAgICAgICB8IDB4MDAgKDApICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJpbmcgdGVybWluYXRvcgorCitwYWRkaW5nOgorICArMHgyREY1IHwgMDAgMDAgMDAgICAgICAgICAgICAgICAgfCB1aW50OF90WzNdICB8IC4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBwYWRkaW5nCisKK3Z0YWJsZSAocmVmbGVjdGlvbi5GaWVsZCk6CisgICsweDJERjggfCAxQyAwMCAgICAgICAgICAgICAgICAgICB8IHVpbnQxNl90ICAgIHwgMHgwMDFDICgyOCkgICAgICAgICAgICAgICAgICAgICAgICB8IHNpemUgb2YgdGhpcyB2dGFibGUKKyAgKzB4MkRGQSB8IDE4IDAwICAgICAgICAgICAgICAgICAgIHwgdWludDE2X3QgICAgfCAweDAwMTggKDI0KSAgICAgICAgICAgICAgICAgICAgICAgIHwgc2l6ZSBvZiByZWZlcnJpbmcgdGFibGUKKyAgKzB4MkRGQyB8IDA4IDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgfCAweDAwMDggKDgpICAgICAgICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBuYW1lYCAoaWQ6IDApCisgICsweDJERkUgfCAwQyAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgIHwgMHgwMDBDICgxMikgICAgICAgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgdHlwZWAgKGlkOiAxKQorICArMHgyRTAwIHwgMDAgMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgICB8IDB4MDAwMCAoMCkgICAgICAgICAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYGlkYCAoaWQ6IDIpIDxkZWZhdWx0cyB0byAwPiAoVVNob3J0KQorICArMHgyRTAyIHwgMDYgMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgICB8IDB4MDAwNiAoNikgICAgICAgICAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYG9mZnNldGAgKGlkOiAzKQorICArMHgyRTA0IHwgMDAgMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgICB8IDB4MDAwMCAoMCkgICAgICAgICAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYGRlZmF1bHRfaW50ZWdlcmAgKGlkOiA0KSA8ZGVmYXVsdHMgdG8gMD4gKExvbmcpCisgICsweDJFMDYgfCAwMCAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgIHwgMHgwMDAwICgwKSAgICAgICAgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgZGVmYXVsdF9yZWFsYCAoaWQ6IDUpIDxkZWZhdWx0cyB0byAwLjAwMDAwMD4gKERvdWJsZSkKKyAgKzB4MkUwOCB8IDAwIDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgfCAweDAwMDAgKDApICAgICAgICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBkZXByZWNhdGVkYCAoaWQ6IDYpIDxkZWZhdWx0cyB0byAwPiAoQm9vbCkKKyAgKzB4MkUwQSB8IDAwIDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgfCAweDAwMDAgKDApICAgICAgICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGByZXF1aXJlZGAgKGlkOiA3KSA8ZGVmYXVsdHMgdG8gMD4gKEJvb2wpCisgICsweDJFMEMgfCAwMCAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgIHwgMHgwMDAwICgwKSAgICAgICAgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBga2V5YCAoaWQ6IDgpIDxkZWZhdWx0cyB0byAwPiAoQm9vbCkKKyAgKzB4MkUwRSB8IDEwIDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgfCAweDAwMTAgKDE2KSAgICAgICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBhdHRyaWJ1dGVzYCAoaWQ6IDkpCisgICsweDJFMTAgfCAxNCAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgIHwgMHgwMDE0ICgyMCkgICAgICAgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgZG9jdW1lbnRhdGlvbmAgKGlkOiAxMCkKKyAgKzB4MkUxMiB8IDA1IDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgfCAweDAwMDUgKDUpICAgICAgICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBvcHRpb25hbGAgKGlkOiAxMSkKKwordGFibGUgKHJlZmxlY3Rpb24uRmllbGQpOgorICArMHgyRTE0IHwgMUMgMDAgMDAgMDAgICAgICAgICAgICAgfCBTT2Zmc2V0MzIgICB8IDB4MDAwMDAwMUMgKDI4KSBMb2M6ICsweDJERjggICAgICAgfCBvZmZzZXQgdG8gdnRhYmxlCisgICsweDJFMTggfCAwMCAgICAgICAgICAgICAgICAgICAgICB8IHVpbnQ4X3RbMV0gIHwgLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHBhZGRpbmcKKyAgKzB4MkUxOSB8IDAxICAgICAgICAgICAgICAgICAgICAgIHwgdWludDhfdCAgICAgfCAweDAxICgxKSAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgdGFibGUgZmllbGQgYG9wdGlvbmFsYCAoQm9vbCkKKyAgKzB4MkUxQSB8IDA0IDAwICAgICAgICAgICAgICAgICAgIHwgdWludDE2X3QgICAgfCAweDAwMDQgKDQpICAgICAgICAgICAgICAgICAgICAgICAgIHwgdGFibGUgZmllbGQgYG9mZnNldGAgKFVTaG9ydCkKKyAgKzB4MkUxQyB8IDQ4IDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMDQ4ICg3MikgTG9jOiArMHgyRTY0ICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBuYW1lYCAoc3RyaW5nKQorICArMHgyRTIwIHwgMzQgMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDAwMzQgKDUyKSBMb2M6ICsweDJFNTQgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYHR5cGVgICh0YWJsZSkKKyAgKzB4MkUyNCB8IDBDIDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMDBDICgxMikgTG9jOiArMHgyRTMwICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBhdHRyaWJ1dGVzYCAodmVjdG9yKQorICArMHgyRTI4IHwgMDQgMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDAwMDQgKDQpIExvYzogKzB4MkUyQyAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYGRvY3VtZW50YXRpb25gICh2ZWN0b3IpCisKK3ZlY3RvciAocmVmbGVjdGlvbi5GaWVsZC5kb2N1bWVudGF0aW9uKToKKyAgKzB4MkUyQyB8IDAwIDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgfCAweDAwMDAwMDAwICgwKSAgICAgICAgICAgICAgICAgICAgIHwgbGVuZ3RoIG9mIHZlY3RvciAoIyBpdGVtcykKKwordmVjdG9yIChyZWZsZWN0aW9uLkZpZWxkLmF0dHJpYnV0ZXMpOgorICArMHgyRTMwIHwgMDEgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICB8IDB4MDAwMDAwMDEgKDEpICAgICAgICAgICAgICAgICAgICAgfCBsZW5ndGggb2YgdmVjdG9yICgjIGl0ZW1zKQorICArMHgyRTM0IHwgMDQgMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDAwMDQgKDQpIExvYzogKzB4MkUzOCAgICAgICAgfCBvZmZzZXQgdG8gdGFibGVbMF0KKwordGFibGUgKHJlZmxlY3Rpb24uS2V5VmFsdWUpOgorICArMHgyRTM4IHwgRDQgRjggRkYgRkYgICAgICAgICAgICAgfCBTT2Zmc2V0MzIgICB8IDB4RkZGRkY4RDQgKC0xODM2KSBMb2M6ICsweDM1NjQgICAgfCBvZmZzZXQgdG8gdnRhYmxlCisgICsweDJFM0MgfCAxMCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDAxMCAoMTYpIExvYzogKzB4MkU0QyAgICAgICB8IG9mZnNldCB0byBmaWVsZCBga2V5YCAoc3RyaW5nKQorICArMHgyRTQwIHwgMDQgMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDAwMDQgKDQpIExvYzogKzB4MkU0NCAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYHZhbHVlYCAoc3RyaW5nKQorCitzdHJpbmcgKHJlZmxlY3Rpb24uS2V5VmFsdWUudmFsdWUpOgorICArMHgyRTQ0IHwgMDEgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICB8IDB4MDAwMDAwMDEgKDEpICAgICAgICAgICAgICAgICAgICAgfCBsZW5ndGggb2Ygc3RyaW5nCisgICsweDJFNDggfCAzMCAgICAgICAgICAgICAgICAgICAgICB8IGNoYXJbMV0gICAgIHwgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHN0cmluZyBsaXRlcmFsCisgICsweDJFNDkgfCAwMCAgICAgICAgICAgICAgICAgICAgICB8IGNoYXIgICAgICAgIHwgMHgwMCAoMCkgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHN0cmluZyB0ZXJtaW5hdG9yCisKK3BhZGRpbmc6CisgICsweDJFNEEgfCAwMCAwMCAgICAgICAgICAgICAgICAgICB8IHVpbnQ4X3RbMl0gIHwgLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHBhZGRpbmcKKworc3RyaW5nIChyZWZsZWN0aW9uLktleVZhbHVlLmtleSk6CisgICsweDJFNEMgfCAwMiAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgIHwgMHgwMDAwMDAwMiAoMikgICAgICAgICAgICAgICAgICAgICB8IGxlbmd0aCBvZiBzdHJpbmcKKyAgKzB4MkU1MCB8IDY5IDY0ICAgICAgICAgICAgICAgICAgIHwgY2hhclsyXSAgICAgfCBpZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nIGxpdGVyYWwKKyAgKzB4MkU1MiB8IDAwICAgICAgICAgICAgICAgICAgICAgIHwgY2hhciAgICAgICAgfCAweDAwICgwKSAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nIHRlcm1pbmF0b3IKKwordGFibGUgKHJlZmxlY3Rpb24uVHlwZSk6CisgICsweDJFNTQgfCA5QyBGNSBGRiBGRiAgICAgICAgICAgICB8IFNPZmZzZXQzMiAgIHwgMHhGRkZGRjU5QyAoLTI2NjApIExvYzogKzB4MzhCOCAgICB8IG9mZnNldCB0byB2dGFibGUKKyAgKzB4MkU1OCB8IDAwIDAwIDAwICAgICAgICAgICAgICAgIHwgdWludDhfdFszXSAgfCAuLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgcGFkZGluZworICArMHgyRTVCIHwgMEYgICAgICAgICAgICAgICAgICAgICAgfCB1aW50OF90ICAgICB8IDB4MEYgKDE1KSAgICAgICAgICAgICAgICAgICAgICAgICAgfCB0YWJsZSBmaWVsZCBgYmFzZV90eXBlYCAoQnl0ZSkKKyAgKzB4MkU1QyB8IDA5IDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgfCAweDAwMDAwMDA5ICg5KSAgICAgICAgICAgICAgICAgICAgIHwgdGFibGUgZmllbGQgYGluZGV4YCAoSW50KQorICArMHgyRTYwIHwgMDEgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICB8IDB4MDAwMDAwMDEgKDEpICAgICAgICAgICAgICAgICAgICAgfCB0YWJsZSBmaWVsZCBgZWxlbWVudF9zaXplYCAoVUludCkKKworc3RyaW5nIChyZWZsZWN0aW9uLkZpZWxkLm5hbWUpOgorICArMHgyRTY0IHwgMDMgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICB8IDB4MDAwMDAwMDMgKDMpICAgICAgICAgICAgICAgICAgICAgfCBsZW5ndGggb2Ygc3RyaW5nCisgICsweDJFNjggfCA3MCA2RiA3MyAgICAgICAgICAgICAgICB8IGNoYXJbM10gICAgIHwgcG9zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHN0cmluZyBsaXRlcmFsCisgICsweDJFNkIgfCAwMCAgICAgICAgICAgICAgICAgICAgICB8IGNoYXIgICAgICAgIHwgMHgwMCAoMCkgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHN0cmluZyB0ZXJtaW5hdG9yCisKK3RhYmxlIChyZWZsZWN0aW9uLk9iamVjdCk6CisgICsweDJFNkMgfCA0NCBGNiBGRiBGRiAgICAgICAgICAgICB8IFNPZmZzZXQzMiAgIHwgMHhGRkZGRjY0NCAoLTI0OTIpIExvYzogKzB4MzgyOCAgICB8IG9mZnNldCB0byB2dGFibGUKKyAgKzB4MkU3MCB8IDIwIDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMDIwICgzMikgTG9jOiArMHgyRTkwICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBuYW1lYCAoc3RyaW5nKQorICArMHgyRTc0IHwgMTQgMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDAwMTQgKDIwKSBMb2M6ICsweDJFODggICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYGZpZWxkc2AgKHZlY3RvcikKKyAgKzB4MkU3OCB8IDAxIDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgfCAweDAwMDAwMDAxICgxKSAgICAgICAgICAgICAgICAgICAgIHwgdGFibGUgZmllbGQgYG1pbmFsaWduYCAoSW50KQorICArMHgyRTdDIHwgMDggMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDAwMDggKDgpIExvYzogKzB4MkU4NCAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYGRvY3VtZW50YXRpb25gICh2ZWN0b3IpCisgICsweDJFODAgfCBFMCAwOCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDhFMCAoMjI3MikgTG9jOiArMHgzNzYwICAgICB8IG9mZnNldCB0byBmaWVsZCBgZGVjbGFyYXRpb25fZmlsZWAgKHN0cmluZykKKwordmVjdG9yIChyZWZsZWN0aW9uLk9iamVjdC5kb2N1bWVudGF0aW9uKToKKyAgKzB4MkU4NCB8IDAwIDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgfCAweDAwMDAwMDAwICgwKSAgICAgICAgICAgICAgICAgICAgIHwgbGVuZ3RoIG9mIHZlY3RvciAoIyBpdGVtcykKKwordmVjdG9yIChyZWZsZWN0aW9uLk9iamVjdC5maWVsZHMpOgorICArMHgyRTg4IHwgMDEgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICB8IDB4MDAwMDAwMDEgKDEpICAgICAgICAgICAgICAgICAgICAgfCBsZW5ndGggb2YgdmVjdG9yICgjIGl0ZW1zKQorICArMHgyRThDIHwgM0MgMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDAwM0MgKDYwKSBMb2M6ICsweDJFQzggICAgICAgfCBvZmZzZXQgdG8gdGFibGVbMF0KKworc3RyaW5nIChyZWZsZWN0aW9uLk9iamVjdC5uYW1lKToKKyAgKzB4MkU5MCB8IDE5IDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgfCAweDAwMDAwMDE5ICgyNSkgICAgICAgICAgICAgICAgICAgIHwgbGVuZ3RoIG9mIHN0cmluZworICArMHgyRTk0IHwgNEQgNzkgNDcgNjEgNkQgNjUgMkUgNDUgfCBjaGFyWzI1XSAgICB8IE15R2FtZS5FICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJpbmcgbGl0ZXJhbAorICArMHgyRTlDIHwgNzggNjEgNkQgNzAgNkMgNjUgMkUgNTIgfCAgICAgICAgICAgICB8IHhhbXBsZS5SCisgICsweDJFQTQgfCA2NSA2NiA2NSA3MiA3MiA2MSA2MiA2QyB8ICAgICAgICAgICAgIHwgZWZlcnJhYmwKKyAgKzB4MkVBQyB8IDY1ICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgfCBlCisgICsweDJFQUQgfCAwMCAgICAgICAgICAgICAgICAgICAgICB8IGNoYXIgICAgICAgIHwgMHgwMCAoMCkgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHN0cmluZyB0ZXJtaW5hdG9yCisKK3Z0YWJsZSAocmVmbGVjdGlvbi5GaWVsZCk6CisgICsweDJFQUUgfCAxQSAwMCAgICAgICAgICAgICAgICAgICB8IHVpbnQxNl90ICAgIHwgMHgwMDFBICgyNikgICAgICAgICAgICAgICAgICAgICAgICB8IHNpemUgb2YgdGhpcyB2dGFibGUKKyAgKzB4MkVCMCB8IDE4IDAwICAgICAgICAgICAgICAgICAgIHwgdWludDE2X3QgICAgfCAweDAwMTggKDI0KSAgICAgICAgICAgICAgICAgICAgICAgIHwgc2l6ZSBvZiByZWZlcnJpbmcgdGFibGUKKyAgKzB4MkVCMiB8IDA4IDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgfCAweDAwMDggKDgpICAgICAgICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBuYW1lYCAoaWQ6IDApCisgICsweDJFQjQgfCAwQyAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgIHwgMHgwMDBDICgxMikgICAgICAgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgdHlwZWAgKGlkOiAxKQorICArMHgyRUI2IHwgMDAgMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgICB8IDB4MDAwMCAoMCkgICAgICAgICAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYGlkYCAoaWQ6IDIpIDxkZWZhdWx0cyB0byAwPiAoVVNob3J0KQorICArMHgyRUI4IHwgMDYgMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgICB8IDB4MDAwNiAoNikgICAgICAgICAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYG9mZnNldGAgKGlkOiAzKQorICArMHgyRUJBIHwgMDAgMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgICB8IDB4MDAwMCAoMCkgICAgICAgICAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYGRlZmF1bHRfaW50ZWdlcmAgKGlkOiA0KSA8ZGVmYXVsdHMgdG8gMD4gKExvbmcpCisgICsweDJFQkMgfCAwMCAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgIHwgMHgwMDAwICgwKSAgICAgICAgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgZGVmYXVsdF9yZWFsYCAoaWQ6IDUpIDxkZWZhdWx0cyB0byAwLjAwMDAwMD4gKERvdWJsZSkKKyAgKzB4MkVCRSB8IDAwIDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgfCAweDAwMDAgKDApICAgICAgICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBkZXByZWNhdGVkYCAoaWQ6IDYpIDxkZWZhdWx0cyB0byAwPiAoQm9vbCkKKyAgKzB4MkVDMCB8IDAwIDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgfCAweDAwMDAgKDApICAgICAgICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGByZXF1aXJlZGAgKGlkOiA3KSA8ZGVmYXVsdHMgdG8gMD4gKEJvb2wpCisgICsweDJFQzIgfCAwNSAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgIHwgMHgwMDA1ICg1KSAgICAgICAgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBga2V5YCAoaWQ6IDgpCisgICsweDJFQzQgfCAxMCAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgIHwgMHgwMDEwICgxNikgICAgICAgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgYXR0cmlidXRlc2AgKGlkOiA5KQorICArMHgyRUM2IHwgMTQgMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgICB8IDB4MDAxNCAoMjApICAgICAgICAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYGRvY3VtZW50YXRpb25gIChpZDogMTApCisKK3RhYmxlIChyZWZsZWN0aW9uLkZpZWxkKToKKyAgKzB4MkVDOCB8IDFBIDAwIDAwIDAwICAgICAgICAgICAgIHwgU09mZnNldDMyICAgfCAweDAwMDAwMDFBICgyNikgTG9jOiArMHgyRUFFICAgICAgIHwgb2Zmc2V0IHRvIHZ0YWJsZQorICArMHgyRUNDIHwgMDAgICAgICAgICAgICAgICAgICAgICAgfCB1aW50OF90WzFdICB8IC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBwYWRkaW5nCisgICsweDJFQ0QgfCAwMSAgICAgICAgICAgICAgICAgICAgICB8IHVpbnQ4X3QgICAgIHwgMHgwMSAoMSkgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHRhYmxlIGZpZWxkIGBrZXlgIChCb29sKQorICArMHgyRUNFIHwgMDQgMDAgICAgICAgICAgICAgICAgICAgfCB1aW50MTZfdCAgICB8IDB4MDAwNCAoNCkgICAgICAgICAgICAgICAgICAgICAgICAgfCB0YWJsZSBmaWVsZCBgb2Zmc2V0YCAoVVNob3J0KQorICArMHgyRUQwIHwgNzQgMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDAwNzQgKDExNikgTG9jOiArMHgyRjQ0ICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYG5hbWVgIChzdHJpbmcpCisgICsweDJFRDQgfCA2MCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDA2MCAoOTYpIExvYzogKzB4MkYzNCAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgdHlwZWAgKHRhYmxlKQorICArMHgyRUQ4IHwgMEMgMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDAwMEMgKDEyKSBMb2M6ICsweDJFRTQgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYGF0dHJpYnV0ZXNgICh2ZWN0b3IpCisgICsweDJFREMgfCAwNCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDAwNCAoNCkgTG9jOiArMHgyRUUwICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgZG9jdW1lbnRhdGlvbmAgKHZlY3RvcikKKwordmVjdG9yIChyZWZsZWN0aW9uLkZpZWxkLmRvY3VtZW50YXRpb24pOgorICArMHgyRUUwIHwgMDAgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICB8IDB4MDAwMDAwMDAgKDApICAgICAgICAgICAgICAgICAgICAgfCBsZW5ndGggb2YgdmVjdG9yICgjIGl0ZW1zKQorCit2ZWN0b3IgKHJlZmxlY3Rpb24uRmllbGQuYXR0cmlidXRlcyk6CisgICsweDJFRTQgfCAwMiAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgIHwgMHgwMDAwMDAwMiAoMikgICAgICAgICAgICAgICAgICAgICB8IGxlbmd0aCBvZiB2ZWN0b3IgKCMgaXRlbXMpCisgICsweDJFRTggfCAyNCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDAyNCAoMzYpIExvYzogKzB4MkYwQyAgICAgICB8IG9mZnNldCB0byB0YWJsZVswXQorICArMHgyRUVDIHwgMDQgMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDAwMDQgKDQpIExvYzogKzB4MkVGMCAgICAgICAgfCBvZmZzZXQgdG8gdGFibGVbMV0KKwordGFibGUgKHJlZmxlY3Rpb24uS2V5VmFsdWUpOgorICArMHgyRUYwIHwgOEMgRjkgRkYgRkYgICAgICAgICAgICAgfCBTT2Zmc2V0MzIgICB8IDB4RkZGRkY5OEMgKC0xNjUyKSBMb2M6ICsweDM1NjQgICAgfCBvZmZzZXQgdG8gdnRhYmxlCisgICsweDJFRjQgfCAxMCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDAxMCAoMTYpIExvYzogKzB4MkYwNCAgICAgICB8IG9mZnNldCB0byBmaWVsZCBga2V5YCAoc3RyaW5nKQorICArMHgyRUY4IHwgMDQgMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDAwMDQgKDQpIExvYzogKzB4MkVGQyAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYHZhbHVlYCAoc3RyaW5nKQorCitzdHJpbmcgKHJlZmxlY3Rpb24uS2V5VmFsdWUudmFsdWUpOgorICArMHgyRUZDIHwgMDEgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICB8IDB4MDAwMDAwMDEgKDEpICAgICAgICAgICAgICAgICAgICAgfCBsZW5ndGggb2Ygc3RyaW5nCisgICsweDJGMDAgfCAzMCAgICAgICAgICAgICAgICAgICAgICB8IGNoYXJbMV0gICAgIHwgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHN0cmluZyBsaXRlcmFsCisgICsweDJGMDEgfCAwMCAgICAgICAgICAgICAgICAgICAgICB8IGNoYXIgICAgICAgIHwgMHgwMCAoMCkgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHN0cmluZyB0ZXJtaW5hdG9yCisKK3BhZGRpbmc6CisgICsweDJGMDIgfCAwMCAwMCAgICAgICAgICAgICAgICAgICB8IHVpbnQ4X3RbMl0gIHwgLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHBhZGRpbmcKKworc3RyaW5nIChyZWZsZWN0aW9uLktleVZhbHVlLmtleSk6CisgICsweDJGMDQgfCAwMyAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgIHwgMHgwMDAwMDAwMyAoMykgICAgICAgICAgICAgICAgICAgICB8IGxlbmd0aCBvZiBzdHJpbmcKKyAgKzB4MkYwOCB8IDZCIDY1IDc5ICAgICAgICAgICAgICAgIHwgY2hhclszXSAgICAgfCBrZXkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nIGxpdGVyYWwKKyAgKzB4MkYwQiB8IDAwICAgICAgICAgICAgICAgICAgICAgIHwgY2hhciAgICAgICAgfCAweDAwICgwKSAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nIHRlcm1pbmF0b3IKKwordGFibGUgKHJlZmxlY3Rpb24uS2V5VmFsdWUpOgorICArMHgyRjBDIHwgQTggRjkgRkYgRkYgICAgICAgICAgICAgfCBTT2Zmc2V0MzIgICB8IDB4RkZGRkY5QTggKC0xNjI0KSBMb2M6ICsweDM1NjQgICAgfCBvZmZzZXQgdG8gdnRhYmxlCisgICsweDJGMTAgfCAxOCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDAxOCAoMjQpIExvYzogKzB4MkYyOCAgICAgICB8IG9mZnNldCB0byBmaWVsZCBga2V5YCAoc3RyaW5nKQorICArMHgyRjE0IHwgMDQgMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDAwMDQgKDQpIExvYzogKzB4MkYxOCAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYHZhbHVlYCAoc3RyaW5nKQorCitzdHJpbmcgKHJlZmxlY3Rpb24uS2V5VmFsdWUudmFsdWUpOgorICArMHgyRjE4IHwgMDggMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICB8IDB4MDAwMDAwMDggKDgpICAgICAgICAgICAgICAgICAgICAgfCBsZW5ndGggb2Ygc3RyaW5nCisgICsweDJGMUMgfCA2NiA2RSA3NiAzMSA2MSA1RiAzNiAzNCB8IGNoYXJbOF0gICAgIHwgZm52MWFfNjQgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHN0cmluZyBsaXRlcmFsCisgICsweDJGMjQgfCAwMCAgICAgICAgICAgICAgICAgICAgICB8IGNoYXIgICAgICAgIHwgMHgwMCAoMCkgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHN0cmluZyB0ZXJtaW5hdG9yCisKK3BhZGRpbmc6CisgICsweDJGMjUgfCAwMCAwMCAwMCAgICAgICAgICAgICAgICB8IHVpbnQ4X3RbM10gIHwgLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHBhZGRpbmcKKworc3RyaW5nIChyZWZsZWN0aW9uLktleVZhbHVlLmtleSk6CisgICsweDJGMjggfCAwNCAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgIHwgMHgwMDAwMDAwNCAoNCkgICAgICAgICAgICAgICAgICAgICB8IGxlbmd0aCBvZiBzdHJpbmcKKyAgKzB4MkYyQyB8IDY4IDYxIDczIDY4ICAgICAgICAgICAgIHwgY2hhcls0XSAgICAgfCBoYXNoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nIGxpdGVyYWwKKyAgKzB4MkYzMCB8IDAwICAgICAgICAgICAgICAgICAgICAgIHwgY2hhciAgICAgICAgfCAweDAwICgwKSAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nIHRlcm1pbmF0b3IKKworcGFkZGluZzoKKyAgKzB4MkYzMSB8IDAwIDAwIDAwICAgICAgICAgICAgICAgIHwgdWludDhfdFszXSAgfCAuLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgcGFkZGluZworCit0YWJsZSAocmVmbGVjdGlvbi5UeXBlKToKKyAgKzB4MkYzNCB8IDUwIEY4IEZGIEZGICAgICAgICAgICAgIHwgU09mZnNldDMyICAgfCAweEZGRkZGODUwICgtMTk2OCkgTG9jOiArMHgzNkU0ICAgIHwgb2Zmc2V0IHRvIHZ0YWJsZQorICArMHgyRjM4IHwgMDAgMDAgMDAgICAgICAgICAgICAgICAgfCB1aW50OF90WzNdICB8IC4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBwYWRkaW5nCisgICsweDJGM0IgfCAwQSAgICAgICAgICAgICAgICAgICAgICB8IHVpbnQ4X3QgICAgIHwgMHgwQSAoMTApICAgICAgICAgICAgICAgICAgICAgICAgICB8IHRhYmxlIGZpZWxkIGBiYXNlX3R5cGVgIChCeXRlKQorICArMHgyRjNDIHwgMDggMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICB8IDB4MDAwMDAwMDggKDgpICAgICAgICAgICAgICAgICAgICAgfCB0YWJsZSBmaWVsZCBgYmFzZV9zaXplYCAoVUludCkKKyAgKzB4MkY0MCB8IDAxIDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgfCAweDAwMDAwMDAxICgxKSAgICAgICAgICAgICAgICAgICAgIHwgdGFibGUgZmllbGQgYGVsZW1lbnRfc2l6ZWAgKFVJbnQpCisKK3N0cmluZyAocmVmbGVjdGlvbi5GaWVsZC5uYW1lKToKKyAgKzB4MkY0NCB8IDAyIDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgfCAweDAwMDAwMDAyICgyKSAgICAgICAgICAgICAgICAgICAgIHwgbGVuZ3RoIG9mIHN0cmluZworICArMHgyRjQ4IHwgNjkgNjQgICAgICAgICAgICAgICAgICAgfCBjaGFyWzJdICAgICB8IGlkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJpbmcgbGl0ZXJhbAorICArMHgyRjRBIHwgMDAgICAgICAgICAgICAgICAgICAgICAgfCBjaGFyICAgICAgICB8IDB4MDAgKDApICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJpbmcgdGVybWluYXRvcgorCit0YWJsZSAocmVmbGVjdGlvbi5PYmplY3QpOgorICArMHgyRjRDIHwgMjQgRjcgRkYgRkYgICAgICAgICAgICAgfCBTT2Zmc2V0MzIgICB8IDB4RkZGRkY3MjQgKC0yMjY4KSBMb2M6ICsweDM4MjggICAgfCBvZmZzZXQgdG8gdnRhYmxlCisgICsweDJGNTAgfCAyOCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDAyOCAoNDApIExvYzogKzB4MkY3OCAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgbmFtZWAgKHN0cmluZykKKyAgKzB4MkY1NCB8IDE0IDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMDE0ICgyMCkgTG9jOiArMHgyRjY4ICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBmaWVsZHNgICh2ZWN0b3IpCisgICsweDJGNTggfCAwMSAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgIHwgMHgwMDAwMDAwMSAoMSkgICAgICAgICAgICAgICAgICAgICB8IHRhYmxlIGZpZWxkIGBtaW5hbGlnbmAgKEludCkKKyAgKzB4MkY1QyB8IDA4IDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMDA4ICg4KSBMb2M6ICsweDJGNjQgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBkb2N1bWVudGF0aW9uYCAodmVjdG9yKQorICArMHgyRjYwIHwgMDAgMDggMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDA4MDAgKDIwNDgpIExvYzogKzB4Mzc2MCAgICAgfCBvZmZzZXQgdG8gZmllbGQgYGRlY2xhcmF0aW9uX2ZpbGVgIChzdHJpbmcpCisKK3ZlY3RvciAocmVmbGVjdGlvbi5PYmplY3QuZG9jdW1lbnRhdGlvbik6CisgICsweDJGNjQgfCAwMCAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgIHwgMHgwMDAwMDAwMCAoMCkgICAgICAgICAgICAgICAgICAgICB8IGxlbmd0aCBvZiB2ZWN0b3IgKCMgaXRlbXMpCisKK3ZlY3RvciAocmVmbGVjdGlvbi5PYmplY3QuZmllbGRzKToKKyAgKzB4MkY2OCB8IDAzIDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgfCAweDAwMDAwMDAzICgzKSAgICAgICAgICAgICAgICAgICAgIHwgbGVuZ3RoIG9mIHZlY3RvciAoIyBpdGVtcykKKyAgKzB4MkY2QyB8IDQwIDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMDQwICg2NCkgTG9jOiArMHgyRkFDICAgICAgIHwgb2Zmc2V0IHRvIHRhYmxlWzBdCisgICsweDJGNzAgfCBDQyAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDBDQyAoMjA0KSBMb2M6ICsweDMwM0MgICAgICB8IG9mZnNldCB0byB0YWJsZVsxXQorICArMHgyRjc0IHwgOTggMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDAwOTggKDE1MikgTG9jOiArMHgzMDBDICAgICAgfCBvZmZzZXQgdG8gdGFibGVbMl0KKworc3RyaW5nIChyZWZsZWN0aW9uLk9iamVjdC5uYW1lKToKKyAgKzB4MkY3OCB8IDEzIDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgfCAweDAwMDAwMDEzICgxOSkgICAgICAgICAgICAgICAgICAgIHwgbGVuZ3RoIG9mIHN0cmluZworICArMHgyRjdDIHwgNEQgNzkgNDcgNjEgNkQgNjUgMkUgNDUgfCBjaGFyWzE5XSAgICB8IE15R2FtZS5FICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJpbmcgbGl0ZXJhbAorICArMHgyRjg0IHwgNzggNjEgNkQgNzAgNkMgNjUgMkUgNTMgfCAgICAgICAgICAgICB8IHhhbXBsZS5TCisgICsweDJGOEMgfCA3NCA2MSA3NCAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgIHwgdGF0CisgICsweDJGOEYgfCAwMCAgICAgICAgICAgICAgICAgICAgICB8IGNoYXIgICAgICAgIHwgMHgwMCAoMCkgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHN0cmluZyB0ZXJtaW5hdG9yCisKK3BhZGRpbmc6CisgICsweDJGOTAgfCAwMCAwMCAgICAgICAgICAgICAgICAgICB8IHVpbnQ4X3RbMl0gIHwgLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHBhZGRpbmcKKwordnRhYmxlIChyZWZsZWN0aW9uLkZpZWxkKToKKyAgKzB4MkY5MiB8IDFBIDAwICAgICAgICAgICAgICAgICAgIHwgdWludDE2X3QgICAgfCAweDAwMUEgKDI2KSAgICAgICAgICAgICAgICAgICAgICAgIHwgc2l6ZSBvZiB0aGlzIHZ0YWJsZQorICArMHgyRjk0IHwgMUMgMDAgICAgICAgICAgICAgICAgICAgfCB1aW50MTZfdCAgICB8IDB4MDAxQyAoMjgpICAgICAgICAgICAgICAgICAgICAgICAgfCBzaXplIG9mIHJlZmVycmluZyB0YWJsZQorICArMHgyRjk2IHwgMEMgMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgICB8IDB4MDAwQyAoMTIpICAgICAgICAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYG5hbWVgIChpZDogMCkKKyAgKzB4MkY5OCB8IDEwIDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgfCAweDAwMTAgKDE2KSAgICAgICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGB0eXBlYCAoaWQ6IDEpCisgICsweDJGOUEgfCAwOCAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgIHwgMHgwMDA4ICg4KSAgICAgICAgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgaWRgIChpZDogMikKKyAgKzB4MkY5QyB8IDBBIDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgfCAweDAwMEEgKDEwKSAgICAgICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBvZmZzZXRgIChpZDogMykKKyAgKzB4MkY5RSB8IDAwIDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgfCAweDAwMDAgKDApICAgICAgICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBkZWZhdWx0X2ludGVnZXJgIChpZDogNCkgPGRlZmF1bHRzIHRvIDA+IChMb25nKQorICArMHgyRkEwIHwgMDAgMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgICB8IDB4MDAwMCAoMCkgICAgICAgICAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYGRlZmF1bHRfcmVhbGAgKGlkOiA1KSA8ZGVmYXVsdHMgdG8gMC4wMDAwMDA+IChEb3VibGUpCisgICsweDJGQTIgfCAwMCAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgIHwgMHgwMDAwICgwKSAgICAgICAgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgZGVwcmVjYXRlZGAgKGlkOiA2KSA8ZGVmYXVsdHMgdG8gMD4gKEJvb2wpCisgICsweDJGQTQgfCAwMCAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgIHwgMHgwMDAwICgwKSAgICAgICAgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgcmVxdWlyZWRgIChpZDogNykgPGRlZmF1bHRzIHRvIDA+IChCb29sKQorICArMHgyRkE2IHwgMDcgMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgICB8IDB4MDAwNyAoNykgICAgICAgICAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYGtleWAgKGlkOiA4KQorICArMHgyRkE4IHwgMTQgMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgICB8IDB4MDAxNCAoMjApICAgICAgICAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYGF0dHJpYnV0ZXNgIChpZDogOSkKKyAgKzB4MkZBQSB8IDE4IDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgfCAweDAwMTggKDI0KSAgICAgICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBkb2N1bWVudGF0aW9uYCAoaWQ6IDEwKQorCit0YWJsZSAocmVmbGVjdGlvbi5GaWVsZCk6CisgICsweDJGQUMgfCAxQSAwMCAwMCAwMCAgICAgICAgICAgICB8IFNPZmZzZXQzMiAgIHwgMHgwMDAwMDAxQSAoMjYpIExvYzogKzB4MkY5MiAgICAgICB8IG9mZnNldCB0byB2dGFibGUKKyAgKzB4MkZCMCB8IDAwIDAwIDAwICAgICAgICAgICAgICAgIHwgdWludDhfdFszXSAgfCAuLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgcGFkZGluZworICArMHgyRkIzIHwgMDEgICAgICAgICAgICAgICAgICAgICAgfCB1aW50OF90ICAgICB8IDB4MDEgKDEpICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB0YWJsZSBmaWVsZCBga2V5YCAoQm9vbCkKKyAgKzB4MkZCNCB8IDAyIDAwICAgICAgICAgICAgICAgICAgIHwgdWludDE2X3QgICAgfCAweDAwMDIgKDIpICAgICAgICAgICAgICAgICAgICAgICAgIHwgdGFibGUgZmllbGQgYGlkYCAoVVNob3J0KQorICArMHgyRkI2IHwgMDggMDAgICAgICAgICAgICAgICAgICAgfCB1aW50MTZfdCAgICB8IDB4MDAwOCAoOCkgICAgICAgICAgICAgICAgICAgICAgICAgfCB0YWJsZSBmaWVsZCBgb2Zmc2V0YCAoVVNob3J0KQorICArMHgyRkI4IHwgNDggMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDAwNDggKDcyKSBMb2M6ICsweDMwMDAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYG5hbWVgIChzdHJpbmcpCisgICsweDJGQkMgfCAzNCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDAzNCAoNTIpIExvYzogKzB4MkZGMCAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgdHlwZWAgKHRhYmxlKQorICArMHgyRkMwIHwgMEMgMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDAwMEMgKDEyKSBMb2M6ICsweDJGQ0MgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYGF0dHJpYnV0ZXNgICh2ZWN0b3IpCisgICsweDJGQzQgfCAwNCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDAwNCAoNCkgTG9jOiArMHgyRkM4ICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgZG9jdW1lbnRhdGlvbmAgKHZlY3RvcikKKwordmVjdG9yIChyZWZsZWN0aW9uLkZpZWxkLmRvY3VtZW50YXRpb24pOgorICArMHgyRkM4IHwgMDAgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICB8IDB4MDAwMDAwMDAgKDApICAgICAgICAgICAgICAgICAgICAgfCBsZW5ndGggb2YgdmVjdG9yICgjIGl0ZW1zKQorCit2ZWN0b3IgKHJlZmxlY3Rpb24uRmllbGQuYXR0cmlidXRlcyk6CisgICsweDJGQ0MgfCAwMSAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgIHwgMHgwMDAwMDAwMSAoMSkgICAgICAgICAgICAgICAgICAgICB8IGxlbmd0aCBvZiB2ZWN0b3IgKCMgaXRlbXMpCisgICsweDJGRDAgfCAwNCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDAwNCAoNCkgTG9jOiArMHgyRkQ0ICAgICAgICB8IG9mZnNldCB0byB0YWJsZVswXQorCit0YWJsZSAocmVmbGVjdGlvbi5LZXlWYWx1ZSk6CisgICsweDJGRDQgfCA3MCBGQSBGRiBGRiAgICAgICAgICAgICB8IFNPZmZzZXQzMiAgIHwgMHhGRkZGRkE3MCAoLTE0MjQpIExvYzogKzB4MzU2NCAgICB8IG9mZnNldCB0byB2dGFibGUKKyAgKzB4MkZEOCB8IDEwIDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMDEwICgxNikgTG9jOiArMHgyRkU4ICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBrZXlgIChzdHJpbmcpCisgICsweDJGREMgfCAwNCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDAwNCAoNCkgTG9jOiArMHgyRkUwICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgdmFsdWVgIChzdHJpbmcpCisKK3N0cmluZyAocmVmbGVjdGlvbi5LZXlWYWx1ZS52YWx1ZSk6CisgICsweDJGRTAgfCAwMSAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgIHwgMHgwMDAwMDAwMSAoMSkgICAgICAgICAgICAgICAgICAgICB8IGxlbmd0aCBvZiBzdHJpbmcKKyAgKzB4MkZFNCB8IDMwICAgICAgICAgICAgICAgICAgICAgIHwgY2hhclsxXSAgICAgfCAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nIGxpdGVyYWwKKyAgKzB4MkZFNSB8IDAwICAgICAgICAgICAgICAgICAgICAgIHwgY2hhciAgICAgICAgfCAweDAwICgwKSAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nIHRlcm1pbmF0b3IKKworcGFkZGluZzoKKyAgKzB4MkZFNiB8IDAwIDAwICAgICAgICAgICAgICAgICAgIHwgdWludDhfdFsyXSAgfCAuLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgcGFkZGluZworCitzdHJpbmcgKHJlZmxlY3Rpb24uS2V5VmFsdWUua2V5KToKKyAgKzB4MkZFOCB8IDAzIDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgfCAweDAwMDAwMDAzICgzKSAgICAgICAgICAgICAgICAgICAgIHwgbGVuZ3RoIG9mIHN0cmluZworICArMHgyRkVDIHwgNkIgNjUgNzkgICAgICAgICAgICAgICAgfCBjaGFyWzNdICAgICB8IGtleSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJpbmcgbGl0ZXJhbAorICArMHgyRkVGIHwgMDAgICAgICAgICAgICAgICAgICAgICAgfCBjaGFyICAgICAgICB8IDB4MDAgKDApICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJpbmcgdGVybWluYXRvcgorCit0YWJsZSAocmVmbGVjdGlvbi5UeXBlKToKKyAgKzB4MkZGMCB8IDBDIEY5IEZGIEZGICAgICAgICAgICAgIHwgU09mZnNldDMyICAgfCAweEZGRkZGOTBDICgtMTc4MCkgTG9jOiArMHgzNkU0ICAgIHwgb2Zmc2V0IHRvIHZ0YWJsZQorICArMHgyRkY0IHwgMDAgMDAgMDAgICAgICAgICAgICAgICAgfCB1aW50OF90WzNdICB8IC4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBwYWRkaW5nCisgICsweDJGRjcgfCAwNiAgICAgICAgICAgICAgICAgICAgICB8IHVpbnQ4X3QgICAgIHwgMHgwNiAoNikgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHRhYmxlIGZpZWxkIGBiYXNlX3R5cGVgIChCeXRlKQorICArMHgyRkY4IHwgMDIgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICB8IDB4MDAwMDAwMDIgKDIpICAgICAgICAgICAgICAgICAgICAgfCB0YWJsZSBmaWVsZCBgYmFzZV9zaXplYCAoVUludCkKKyAgKzB4MkZGQyB8IDAxIDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgfCAweDAwMDAwMDAxICgxKSAgICAgICAgICAgICAgICAgICAgIHwgdGFibGUgZmllbGQgYGVsZW1lbnRfc2l6ZWAgKFVJbnQpCisKK3N0cmluZyAocmVmbGVjdGlvbi5GaWVsZC5uYW1lKToKKyAgKzB4MzAwMCB8IDA1IDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgfCAweDAwMDAwMDA1ICg1KSAgICAgICAgICAgICAgICAgICAgIHwgbGVuZ3RoIG9mIHN0cmluZworICArMHgzMDA0IHwgNjMgNkYgNzUgNkUgNzQgICAgICAgICAgfCBjaGFyWzVdICAgICB8IGNvdW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJpbmcgbGl0ZXJhbAorICArMHgzMDA5IHwgMDAgICAgICAgICAgICAgICAgICAgICAgfCBjaGFyICAgICAgICB8IDB4MDAgKDApICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJpbmcgdGVybWluYXRvcgorCitwYWRkaW5nOgorICArMHgzMDBBIHwgMDAgMDAgICAgICAgICAgICAgICAgICAgfCB1aW50OF90WzJdICB8IC4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBwYWRkaW5nCisKK3RhYmxlIChyZWZsZWN0aW9uLkZpZWxkKToKKyAgKzB4MzAwQyB8IDc2IEZCIEZGIEZGICAgICAgICAgICAgIHwgU09mZnNldDMyICAgfCAweEZGRkZGQjc2ICgtMTE2MikgTG9jOiArMHgzNDk2ICAgIHwgb2Zmc2V0IHRvIHZ0YWJsZQorICArMHgzMDEwIHwgMDEgMDAgICAgICAgICAgICAgICAgICAgfCB1aW50MTZfdCAgICB8IDB4MDAwMSAoMSkgICAgICAgICAgICAgICAgICAgICAgICAgfCB0YWJsZSBmaWVsZCBgaWRgIChVU2hvcnQpCisgICsweDMwMTIgfCAwNiAwMCAgICAgICAgICAgICAgICAgICB8IHVpbnQxNl90ICAgIHwgMHgwMDA2ICg2KSAgICAgICAgICAgICAgICAgICAgICAgICB8IHRhYmxlIGZpZWxkIGBvZmZzZXRgIChVU2hvcnQpCisgICsweDMwMTQgfCAyMCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDAyMCAoMzIpIExvYzogKzB4MzAzNCAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgbmFtZWAgKHN0cmluZykKKyAgKzB4MzAxOCB8IDBDIDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMDBDICgxMikgTG9jOiArMHgzMDI0ICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGB0eXBlYCAodGFibGUpCisgICsweDMwMUMgfCAwNCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDAwNCAoNCkgTG9jOiArMHgzMDIwICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgZG9jdW1lbnRhdGlvbmAgKHZlY3RvcikKKwordmVjdG9yIChyZWZsZWN0aW9uLkZpZWxkLmRvY3VtZW50YXRpb24pOgorICArMHgzMDIwIHwgMDAgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICB8IDB4MDAwMDAwMDAgKDApICAgICAgICAgICAgICAgICAgICAgfCBsZW5ndGggb2YgdmVjdG9yICgjIGl0ZW1zKQorCit0YWJsZSAocmVmbGVjdGlvbi5UeXBlKToKKyAgKzB4MzAyNCB8IDQwIEY5IEZGIEZGICAgICAgICAgICAgIHwgU09mZnNldDMyICAgfCAweEZGRkZGOTQwICgtMTcyOCkgTG9jOiArMHgzNkU0ICAgIHwgb2Zmc2V0IHRvIHZ0YWJsZQorICArMHgzMDI4IHwgMDAgMDAgMDAgICAgICAgICAgICAgICAgfCB1aW50OF90WzNdICB8IC4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBwYWRkaW5nCisgICsweDMwMkIgfCAwOSAgICAgICAgICAgICAgICAgICAgICB8IHVpbnQ4X3QgICAgIHwgMHgwOSAoOSkgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHRhYmxlIGZpZWxkIGBiYXNlX3R5cGVgIChCeXRlKQorICArMHgzMDJDIHwgMDggMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICB8IDB4MDAwMDAwMDggKDgpICAgICAgICAgICAgICAgICAgICAgfCB0YWJsZSBmaWVsZCBgYmFzZV9zaXplYCAoVUludCkKKyAgKzB4MzAzMCB8IDAxIDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgfCAweDAwMDAwMDAxICgxKSAgICAgICAgICAgICAgICAgICAgIHwgdGFibGUgZmllbGQgYGVsZW1lbnRfc2l6ZWAgKFVJbnQpCisKK3N0cmluZyAocmVmbGVjdGlvbi5GaWVsZC5uYW1lKToKKyAgKzB4MzAzNCB8IDAzIDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgfCAweDAwMDAwMDAzICgzKSAgICAgICAgICAgICAgICAgICAgIHwgbGVuZ3RoIG9mIHN0cmluZworICArMHgzMDM4IHwgNzYgNjEgNkMgICAgICAgICAgICAgICAgfCBjaGFyWzNdICAgICB8IHZhbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJpbmcgbGl0ZXJhbAorICArMHgzMDNCIHwgMDAgICAgICAgICAgICAgICAgICAgICAgfCBjaGFyICAgICAgICB8IDB4MDAgKDApICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJpbmcgdGVybWluYXRvcgorCit0YWJsZSAocmVmbGVjdGlvbi5GaWVsZCk6CisgICsweDMwM0MgfCBCOCBGNyBGRiBGRiAgICAgICAgICAgICB8IFNPZmZzZXQzMiAgIHwgMHhGRkZGRjdCOCAoLTIxMjApIExvYzogKzB4Mzg4NCAgICB8IG9mZnNldCB0byB2dGFibGUKKyAgKzB4MzA0MCB8IDAwICAgICAgICAgICAgICAgICAgICAgIHwgdWludDhfdFsxXSAgfCAuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgcGFkZGluZworICArMHgzMDQxIHwgMDEgICAgICAgICAgICAgICAgICAgICAgfCB1aW50OF90ICAgICB8IDB4MDEgKDEpICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB0YWJsZSBmaWVsZCBgb3B0aW9uYWxgIChCb29sKQorICArMHgzMDQyIHwgMDQgMDAgICAgICAgICAgICAgICAgICAgfCB1aW50MTZfdCAgICB8IDB4MDAwNCAoNCkgICAgICAgICAgICAgICAgICAgICAgICAgfCB0YWJsZSBmaWVsZCBgb2Zmc2V0YCAoVVNob3J0KQorICArMHgzMDQ0IHwgMUMgMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDAwMUMgKDI4KSBMb2M6ICsweDMwNjAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYG5hbWVgIChzdHJpbmcpCisgICsweDMwNDggfCAwQyAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDAwQyAoMTIpIExvYzogKzB4MzA1NCAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgdHlwZWAgKHRhYmxlKQorICArMHgzMDRDIHwgMDQgMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDAwMDQgKDQpIExvYzogKzB4MzA1MCAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYGRvY3VtZW50YXRpb25gICh2ZWN0b3IpCisKK3ZlY3RvciAocmVmbGVjdGlvbi5GaWVsZC5kb2N1bWVudGF0aW9uKToKKyAgKzB4MzA1MCB8IDAwIDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgfCAweDAwMDAwMDAwICgwKSAgICAgICAgICAgICAgICAgICAgIHwgbGVuZ3RoIG9mIHZlY3RvciAoIyBpdGVtcykKKwordGFibGUgKHJlZmxlY3Rpb24uVHlwZSk6CisgICsweDMwNTQgfCBCOCBGNiBGRiBGRiAgICAgICAgICAgICB8IFNPZmZzZXQzMiAgIHwgMHhGRkZGRjZCOCAoLTIzNzYpIExvYzogKzB4Mzk5QyAgICB8IG9mZnNldCB0byB2dGFibGUKKyAgKzB4MzA1OCB8IDAwIDAwIDAwICAgICAgICAgICAgICAgIHwgdWludDhfdFszXSAgfCAuLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgcGFkZGluZworICArMHgzMDVCIHwgMEQgICAgICAgICAgICAgICAgICAgICAgfCB1aW50OF90ICAgICB8IDB4MEQgKDEzKSAgICAgICAgICAgICAgICAgICAgICAgICAgfCB0YWJsZSBmaWVsZCBgYmFzZV90eXBlYCAoQnl0ZSkKKyAgKzB4MzA1QyB8IDAxIDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgfCAweDAwMDAwMDAxICgxKSAgICAgICAgICAgICAgICAgICAgIHwgdGFibGUgZmllbGQgYGVsZW1lbnRfc2l6ZWAgKFVJbnQpCisKK3N0cmluZyAocmVmbGVjdGlvbi5GaWVsZC5uYW1lKToKKyAgKzB4MzA2MCB8IDAyIDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgfCAweDAwMDAwMDAyICgyKSAgICAgICAgICAgICAgICAgICAgIHwgbGVuZ3RoIG9mIHN0cmluZworICArMHgzMDY0IHwgNjkgNjQgICAgICAgICAgICAgICAgICAgfCBjaGFyWzJdICAgICB8IGlkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJpbmcgbGl0ZXJhbAorICArMHgzMDY2IHwgMDAgICAgICAgICAgICAgICAgICAgICAgfCBjaGFyICAgICAgICB8IDB4MDAgKDApICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJpbmcgdGVybWluYXRvcgorCit0YWJsZSAocmVmbGVjdGlvbi5PYmplY3QpOgorICArMHgzMDY4IHwgODggRjcgRkYgRkYgICAgICAgICAgICAgfCBTT2Zmc2V0MzIgICB8IDB4RkZGRkY3ODggKC0yMTY4KSBMb2M6ICsweDM4RTAgICAgfCBvZmZzZXQgdG8gdnRhYmxlCisgICsweDMwNkMgfCAwMCAwMCAwMCAgICAgICAgICAgICAgICB8IHVpbnQ4X3RbM10gIHwgLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHBhZGRpbmcKKyAgKzB4MzA2RiB8IDAxICAgICAgICAgICAgICAgICAgICAgIHwgdWludDhfdCAgICAgfCAweDAxICgxKSAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgdGFibGUgZmllbGQgYGlzX3N0cnVjdGAgKEJvb2wpCisgICsweDMwNzAgfCAyNCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDAyNCAoMzYpIExvYzogKzB4MzA5NCAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgbmFtZWAgKHN0cmluZykKKyAgKzB4MzA3NCB8IDE4IDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMDE4ICgyNCkgTG9jOiArMHgzMDhDICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBmaWVsZHNgICh2ZWN0b3IpCisgICsweDMwNzggfCAwNCAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgIHwgMHgwMDAwMDAwNCAoNCkgICAgICAgICAgICAgICAgICAgICB8IHRhYmxlIGZpZWxkIGBtaW5hbGlnbmAgKEludCkKKyAgKzB4MzA3QyB8IDE0IDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgfCAweDAwMDAwMDE0ICgyMCkgICAgICAgICAgICAgICAgICAgIHwgdGFibGUgZmllbGQgYGJ5dGVzaXplYCAoSW50KQorICArMHgzMDgwIHwgMDggMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDAwMDggKDgpIExvYzogKzB4MzA4OCAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYGRvY3VtZW50YXRpb25gICh2ZWN0b3IpCisgICsweDMwODQgfCBEQyAwNiAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDZEQyAoMTc1NikgTG9jOiArMHgzNzYwICAgICB8IG9mZnNldCB0byBmaWVsZCBgZGVjbGFyYXRpb25fZmlsZWAgKHN0cmluZykKKwordmVjdG9yIChyZWZsZWN0aW9uLk9iamVjdC5kb2N1bWVudGF0aW9uKToKKyAgKzB4MzA4OCB8IDAwIDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgfCAweDAwMDAwMDAwICgwKSAgICAgICAgICAgICAgICAgICAgIHwgbGVuZ3RoIG9mIHZlY3RvciAoIyBpdGVtcykKKwordmVjdG9yIChyZWZsZWN0aW9uLk9iamVjdC5maWVsZHMpOgorICArMHgzMDhDIHwgMDEgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICB8IDB4MDAwMDAwMDEgKDEpICAgICAgICAgICAgICAgICAgICAgfCBsZW5ndGggb2YgdmVjdG9yICgjIGl0ZW1zKQorICArMHgzMDkwIHwgMzAgMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDAwMzAgKDQ4KSBMb2M6ICsweDMwQzAgICAgICAgfCBvZmZzZXQgdG8gdGFibGVbMF0KKworc3RyaW5nIChyZWZsZWN0aW9uLk9iamVjdC5uYW1lKToKKyAgKzB4MzA5NCB8IDI3IDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgfCAweDAwMDAwMDI3ICgzOSkgICAgICAgICAgICAgICAgICAgIHwgbGVuZ3RoIG9mIHN0cmluZworICArMHgzMDk4IHwgNEQgNzkgNDcgNjEgNkQgNjUgMkUgNDUgfCBjaGFyWzM5XSAgICB8IE15R2FtZS5FICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJpbmcgbGl0ZXJhbAorICArMHgzMEEwIHwgNzggNjEgNkQgNzAgNkMgNjUgMkUgNTMgfCAgICAgICAgICAgICB8IHhhbXBsZS5TCisgICsweDMwQTggfCA3NCA3MiA3NSA2MyA3NCA0RiA2NiA1MyB8ICAgICAgICAgICAgIHwgdHJ1Y3RPZlMKKyAgKzB4MzBCMCB8IDc0IDcyIDc1IDYzIDc0IDczIDRGIDY2IHwgICAgICAgICAgICAgfCB0cnVjdHNPZgorICArMHgzMEI4IHwgNTMgNzQgNzIgNzUgNjMgNzQgNzMgICAgfCAgICAgICAgICAgICB8IFN0cnVjdHMKKyAgKzB4MzBCRiB8IDAwICAgICAgICAgICAgICAgICAgICAgIHwgY2hhciAgICAgICAgfCAweDAwICgwKSAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nIHRlcm1pbmF0b3IKKwordGFibGUgKHJlZmxlY3Rpb24uRmllbGQpOgorICArMHgzMEMwIHwgRjQgRkUgRkYgRkYgICAgICAgICAgICAgfCBTT2Zmc2V0MzIgICB8IDB4RkZGRkZFRjQgKC0yNjgpIExvYzogKzB4MzFDQyAgICAgfCBvZmZzZXQgdG8gdnRhYmxlCisgICsweDMwQzQgfCAwMCAwMCAwMCAgICAgICAgICAgICAgICB8IHVpbnQ4X3RbM10gIHwgLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHBhZGRpbmcKKyAgKzB4MzBDNyB8IDAxICAgICAgICAgICAgICAgICAgICAgIHwgdWludDhfdCAgICAgfCAweDAxICgxKSAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgdGFibGUgZmllbGQgYG9wdGlvbmFsYCAoQm9vbCkKKyAgKzB4MzBDOCB8IDIwIDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMDIwICgzMikgTG9jOiArMHgzMEU4ICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBuYW1lYCAoc3RyaW5nKQorICArMHgzMENDIHwgMEMgMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDAwMEMgKDEyKSBMb2M6ICsweDMwRDggICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYHR5cGVgICh0YWJsZSkKKyAgKzB4MzBEMCB8IDA0IDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMDA0ICg0KSBMb2M6ICsweDMwRDQgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBkb2N1bWVudGF0aW9uYCAodmVjdG9yKQorCit2ZWN0b3IgKHJlZmxlY3Rpb24uRmllbGQuZG9jdW1lbnRhdGlvbik6CisgICsweDMwRDQgfCAwMCAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgIHwgMHgwMDAwMDAwMCAoMCkgICAgICAgICAgICAgICAgICAgICB8IGxlbmd0aCBvZiB2ZWN0b3IgKCMgaXRlbXMpCisKK3RhYmxlIChyZWZsZWN0aW9uLlR5cGUpOgorICArMHgzMEQ4IHwgMjAgRjggRkYgRkYgICAgICAgICAgICAgfCBTT2Zmc2V0MzIgICB8IDB4RkZGRkY4MjAgKC0yMDE2KSBMb2M6ICsweDM4QjggICAgfCBvZmZzZXQgdG8gdnRhYmxlCisgICsweDMwREMgfCAwMCAwMCAwMCAgICAgICAgICAgICAgICB8IHVpbnQ4X3RbM10gIHwgLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHBhZGRpbmcKKyAgKzB4MzBERiB8IDBGICAgICAgICAgICAgICAgICAgICAgIHwgdWludDhfdCAgICAgfCAweDBGICgxNSkgICAgICAgICAgICAgICAgICAgICAgICAgIHwgdGFibGUgZmllbGQgYGJhc2VfdHlwZWAgKEJ5dGUpCisgICsweDMwRTAgfCAwNCAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgIHwgMHgwMDAwMDAwNCAoNCkgICAgICAgICAgICAgICAgICAgICB8IHRhYmxlIGZpZWxkIGBpbmRleGAgKEludCkKKyAgKzB4MzBFNCB8IDAxIDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgfCAweDAwMDAwMDAxICgxKSAgICAgICAgICAgICAgICAgICAgIHwgdGFibGUgZmllbGQgYGVsZW1lbnRfc2l6ZWAgKFVJbnQpCisKK3N0cmluZyAocmVmbGVjdGlvbi5GaWVsZC5uYW1lKToKKyAgKzB4MzBFOCB8IDAxIDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgfCAweDAwMDAwMDAxICgxKSAgICAgICAgICAgICAgICAgICAgIHwgbGVuZ3RoIG9mIHN0cmluZworICArMHgzMEVDIHwgNjEgICAgICAgICAgICAgICAgICAgICAgfCBjaGFyWzFdICAgICB8IGEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJpbmcgbGl0ZXJhbAorICArMHgzMEVEIHwgMDAgICAgICAgICAgICAgICAgICAgICAgfCBjaGFyICAgICAgICB8IDB4MDAgKDApICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJpbmcgdGVybWluYXRvcgorCitwYWRkaW5nOgorICArMHgzMEVFIHwgMDAgMDAgICAgICAgICAgICAgICAgICAgfCB1aW50OF90WzJdICB8IC4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBwYWRkaW5nCisKK3RhYmxlIChyZWZsZWN0aW9uLk9iamVjdCk6CisgICsweDMwRjAgfCAxMCBGOCBGRiBGRiAgICAgICAgICAgICB8IFNPZmZzZXQzMiAgIHwgMHhGRkZGRjgxMCAoLTIwMzIpIExvYzogKzB4MzhFMCAgICB8IG9mZnNldCB0byB2dGFibGUKKyAgKzB4MzBGNCB8IDAwIDAwIDAwICAgICAgICAgICAgICAgIHwgdWludDhfdFszXSAgfCAuLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgcGFkZGluZworICArMHgzMEY3IHwgMDEgICAgICAgICAgICAgICAgICAgICAgfCB1aW50OF90ICAgICB8IDB4MDEgKDEpICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB0YWJsZSBmaWVsZCBgaXNfc3RydWN0YCAoQm9vbCkKKyAgKzB4MzBGOCB8IDJDIDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMDJDICg0NCkgTG9jOiArMHgzMTI0ICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBuYW1lYCAoc3RyaW5nKQorICArMHgzMEZDIHwgMTggMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDAwMTggKDI0KSBMb2M6ICsweDMxMTQgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYGZpZWxkc2AgKHZlY3RvcikKKyAgKzB4MzEwMCB8IDA0IDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgfCAweDAwMDAwMDA0ICg0KSAgICAgICAgICAgICAgICAgICAgIHwgdGFibGUgZmllbGQgYG1pbmFsaWduYCAoSW50KQorICArMHgzMTA0IHwgMTQgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICB8IDB4MDAwMDAwMTQgKDIwKSAgICAgICAgICAgICAgICAgICAgfCB0YWJsZSBmaWVsZCBgYnl0ZXNpemVgIChJbnQpCisgICsweDMxMDggfCAwOCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDAwOCAoOCkgTG9jOiArMHgzMTEwICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgZG9jdW1lbnRhdGlvbmAgKHZlY3RvcikKKyAgKzB4MzEwQyB8IDU0IDA2IDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwNjU0ICgxNjIwKSBMb2M6ICsweDM3NjAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBkZWNsYXJhdGlvbl9maWxlYCAoc3RyaW5nKQorCit2ZWN0b3IgKHJlZmxlY3Rpb24uT2JqZWN0LmRvY3VtZW50YXRpb24pOgorICArMHgzMTEwIHwgMDAgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICB8IDB4MDAwMDAwMDAgKDApICAgICAgICAgICAgICAgICAgICAgfCBsZW5ndGggb2YgdmVjdG9yICgjIGl0ZW1zKQorCit2ZWN0b3IgKHJlZmxlY3Rpb24uT2JqZWN0LmZpZWxkcyk6CisgICsweDMxMTQgfCAwMyAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgIHwgMHgwMDAwMDAwMyAoMykgICAgICAgICAgICAgICAgICAgICB8IGxlbmd0aCBvZiB2ZWN0b3IgKCMgaXRlbXMpCisgICsweDMxMTggfCBEMCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDBEMCAoMjA4KSBMb2M6ICsweDMxRTggICAgICB8IG9mZnNldCB0byB0YWJsZVswXQorICArMHgzMTFDIHwgN0MgMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDAwN0MgKDEyNCkgTG9jOiArMHgzMTk4ICAgICAgfCBvZmZzZXQgdG8gdGFibGVbMV0KKyAgKzB4MzEyMCB8IDI4IDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMDI4ICg0MCkgTG9jOiArMHgzMTQ4ICAgICAgIHwgb2Zmc2V0IHRvIHRhYmxlWzJdCisKK3N0cmluZyAocmVmbGVjdGlvbi5PYmplY3QubmFtZSk6CisgICsweDMxMjQgfCAxRSAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgIHwgMHgwMDAwMDAxRSAoMzApICAgICAgICAgICAgICAgICAgICB8IGxlbmd0aCBvZiBzdHJpbmcKKyAgKzB4MzEyOCB8IDREIDc5IDQ3IDYxIDZEIDY1IDJFIDQ1IHwgY2hhclszMF0gICAgfCBNeUdhbWUuRSAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nIGxpdGVyYWwKKyAgKzB4MzEzMCB8IDc4IDYxIDZEIDcwIDZDIDY1IDJFIDUzIHwgICAgICAgICAgICAgfCB4YW1wbGUuUworICArMHgzMTM4IHwgNzQgNzIgNzUgNjMgNzQgNEYgNjYgNTMgfCAgICAgICAgICAgICB8IHRydWN0T2ZTCisgICsweDMxNDAgfCA3NCA3MiA3NSA2MyA3NCA3MyAgICAgICB8ICAgICAgICAgICAgIHwgdHJ1Y3RzCisgICsweDMxNDYgfCAwMCAgICAgICAgICAgICAgICAgICAgICB8IGNoYXIgICAgICAgIHwgMHgwMCAoMCkgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHN0cmluZyB0ZXJtaW5hdG9yCisKK3RhYmxlIChyZWZsZWN0aW9uLkZpZWxkKToKKyAgKzB4MzE0OCB8IENDIEZGIEZGIEZGICAgICAgICAgICAgIHwgU09mZnNldDMyICAgfCAweEZGRkZGRkNDICgtNTIpIExvYzogKzB4MzE3QyAgICAgIHwgb2Zmc2V0IHRvIHZ0YWJsZQorICArMHgzMTRDIHwgMDAgMDAgMDAgICAgICAgICAgICAgICAgfCB1aW50OF90WzNdICB8IC4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBwYWRkaW5nCisgICsweDMxNEYgfCAwMSAgICAgICAgICAgICAgICAgICAgICB8IHVpbnQ4X3QgICAgIHwgMHgwMSAoMSkgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHRhYmxlIGZpZWxkIGBvcHRpb25hbGAgKEJvb2wpCisgICsweDMxNTAgfCAwMiAwMCAgICAgICAgICAgICAgICAgICB8IHVpbnQxNl90ICAgIHwgMHgwMDAyICgyKSAgICAgICAgICAgICAgICAgICAgICAgICB8IHRhYmxlIGZpZWxkIGBpZGAgKFVTaG9ydCkKKyAgKzB4MzE1MiB8IDBDIDAwICAgICAgICAgICAgICAgICAgIHwgdWludDE2X3QgICAgfCAweDAwMEMgKDEyKSAgICAgICAgICAgICAgICAgICAgICAgIHwgdGFibGUgZmllbGQgYG9mZnNldGAgKFVTaG9ydCkKKyAgKzB4MzE1NCB8IDIwIDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMDIwICgzMikgTG9jOiArMHgzMTc0ICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBuYW1lYCAoc3RyaW5nKQorICArMHgzMTU4IHwgMEMgMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDAwMEMgKDEyKSBMb2M6ICsweDMxNjQgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYHR5cGVgICh0YWJsZSkKKyAgKzB4MzE1QyB8IDA0IDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMDA0ICg0KSBMb2M6ICsweDMxNjAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBkb2N1bWVudGF0aW9uYCAodmVjdG9yKQorCit2ZWN0b3IgKHJlZmxlY3Rpb24uRmllbGQuZG9jdW1lbnRhdGlvbik6CisgICsweDMxNjAgfCAwMCAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgIHwgMHgwMDAwMDAwMCAoMCkgICAgICAgICAgICAgICAgICAgICB8IGxlbmd0aCBvZiB2ZWN0b3IgKCMgaXRlbXMpCisKK3RhYmxlIChyZWZsZWN0aW9uLlR5cGUpOgorICArMHgzMTY0IHwgQUMgRjggRkYgRkYgICAgICAgICAgICAgfCBTT2Zmc2V0MzIgICB8IDB4RkZGRkY4QUMgKC0xODc2KSBMb2M6ICsweDM4QjggICAgfCBvZmZzZXQgdG8gdnRhYmxlCisgICsweDMxNjggfCAwMCAwMCAwMCAgICAgICAgICAgICAgICB8IHVpbnQ4X3RbM10gIHwgLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHBhZGRpbmcKKyAgKzB4MzE2QiB8IDBGICAgICAgICAgICAgICAgICAgICAgIHwgdWludDhfdCAgICAgfCAweDBGICgxNSkgICAgICAgICAgICAgICAgICAgICAgICAgIHwgdGFibGUgZmllbGQgYGJhc2VfdHlwZWAgKEJ5dGUpCisgICsweDMxNkMgfCAwMCAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgIHwgMHgwMDAwMDAwMCAoMCkgICAgICAgICAgICAgICAgICAgICB8IHRhYmxlIGZpZWxkIGBpbmRleGAgKEludCkKKyAgKzB4MzE3MCB8IDAxIDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgfCAweDAwMDAwMDAxICgxKSAgICAgICAgICAgICAgICAgICAgIHwgdGFibGUgZmllbGQgYGVsZW1lbnRfc2l6ZWAgKFVJbnQpCisKK3N0cmluZyAocmVmbGVjdGlvbi5GaWVsZC5uYW1lKToKKyAgKzB4MzE3NCB8IDAxIDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgfCAweDAwMDAwMDAxICgxKSAgICAgICAgICAgICAgICAgICAgIHwgbGVuZ3RoIG9mIHN0cmluZworICArMHgzMTc4IHwgNjMgICAgICAgICAgICAgICAgICAgICAgfCBjaGFyWzFdICAgICB8IGMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJpbmcgbGl0ZXJhbAorICArMHgzMTc5IHwgMDAgICAgICAgICAgICAgICAgICAgICAgfCBjaGFyICAgICAgICB8IDB4MDAgKDApICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJpbmcgdGVybWluYXRvcgorCitwYWRkaW5nOgorICArMHgzMTdBIHwgMDAgMDAgICAgICAgICAgICAgICAgICAgfCB1aW50OF90WzJdICB8IC4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBwYWRkaW5nCisKK3Z0YWJsZSAocmVmbGVjdGlvbi5GaWVsZCk6CisgICsweDMxN0MgfCAxQyAwMCAgICAgICAgICAgICAgICAgICB8IHVpbnQxNl90ICAgIHwgMHgwMDFDICgyOCkgICAgICAgICAgICAgICAgICAgICAgICB8IHNpemUgb2YgdGhpcyB2dGFibGUKKyAgKzB4MzE3RSB8IDE4IDAwICAgICAgICAgICAgICAgICAgIHwgdWludDE2X3QgICAgfCAweDAwMTggKDI0KSAgICAgICAgICAgICAgICAgICAgICAgIHwgc2l6ZSBvZiByZWZlcnJpbmcgdGFibGUKKyAgKzB4MzE4MCB8IDBDIDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgfCAweDAwMEMgKDEyKSAgICAgICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBuYW1lYCAoaWQ6IDApCisgICsweDMxODIgfCAxMCAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgIHwgMHgwMDEwICgxNikgICAgICAgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgdHlwZWAgKGlkOiAxKQorICArMHgzMTg0IHwgMDggMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgICB8IDB4MDAwOCAoOCkgICAgICAgICAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYGlkYCAoaWQ6IDIpCisgICsweDMxODYgfCAwQSAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgIHwgMHgwMDBBICgxMCkgICAgICAgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgb2Zmc2V0YCAoaWQ6IDMpCisgICsweDMxODggfCAwMCAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgIHwgMHgwMDAwICgwKSAgICAgICAgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgZGVmYXVsdF9pbnRlZ2VyYCAoaWQ6IDQpIDxkZWZhdWx0cyB0byAwPiAoTG9uZykKKyAgKzB4MzE4QSB8IDAwIDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgfCAweDAwMDAgKDApICAgICAgICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBkZWZhdWx0X3JlYWxgIChpZDogNSkgPGRlZmF1bHRzIHRvIDAuMDAwMDAwPiAoRG91YmxlKQorICArMHgzMThDIHwgMDAgMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgICB8IDB4MDAwMCAoMCkgICAgICAgICAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYGRlcHJlY2F0ZWRgIChpZDogNikgPGRlZmF1bHRzIHRvIDA+IChCb29sKQorICArMHgzMThFIHwgMDAgMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgICB8IDB4MDAwMCAoMCkgICAgICAgICAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYHJlcXVpcmVkYCAoaWQ6IDcpIDxkZWZhdWx0cyB0byAwPiAoQm9vbCkKKyAgKzB4MzE5MCB8IDAwIDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgfCAweDAwMDAgKDApICAgICAgICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBrZXlgIChpZDogOCkgPGRlZmF1bHRzIHRvIDA+IChCb29sKQorICArMHgzMTkyIHwgMDAgMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgICB8IDB4MDAwMCAoMCkgICAgICAgICAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYGF0dHJpYnV0ZXNgIChpZDogOSkgPG51bGw+IChWZWN0b3IpCisgICsweDMxOTQgfCAxNCAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgIHwgMHgwMDE0ICgyMCkgICAgICAgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgZG9jdW1lbnRhdGlvbmAgKGlkOiAxMCkKKyAgKzB4MzE5NiB8IDA3IDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgfCAweDAwMDcgKDcpICAgICAgICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBvcHRpb25hbGAgKGlkOiAxMSkKKwordGFibGUgKHJlZmxlY3Rpb24uRmllbGQpOgorICArMHgzMTk4IHwgMUMgMDAgMDAgMDAgICAgICAgICAgICAgfCBTT2Zmc2V0MzIgICB8IDB4MDAwMDAwMUMgKDI4KSBMb2M6ICsweDMxN0MgICAgICAgfCBvZmZzZXQgdG8gdnRhYmxlCisgICsweDMxOUMgfCAwMCAwMCAwMCAgICAgICAgICAgICAgICB8IHVpbnQ4X3RbM10gIHwgLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHBhZGRpbmcKKyAgKzB4MzE5RiB8IDAxICAgICAgICAgICAgICAgICAgICAgIHwgdWludDhfdCAgICAgfCAweDAxICgxKSAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgdGFibGUgZmllbGQgYG9wdGlvbmFsYCAoQm9vbCkKKyAgKzB4MzFBMCB8IDAxIDAwICAgICAgICAgICAgICAgICAgIHwgdWludDE2X3QgICAgfCAweDAwMDEgKDEpICAgICAgICAgICAgICAgICAgICAgICAgIHwgdGFibGUgZmllbGQgYGlkYCAoVVNob3J0KQorICArMHgzMUEyIHwgMDggMDAgICAgICAgICAgICAgICAgICAgfCB1aW50MTZfdCAgICB8IDB4MDAwOCAoOCkgICAgICAgICAgICAgICAgICAgICAgICAgfCB0YWJsZSBmaWVsZCBgb2Zmc2V0YCAoVVNob3J0KQorICArMHgzMUE0IHwgMjAgMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDAwMjAgKDMyKSBMb2M6ICsweDMxQzQgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYG5hbWVgIChzdHJpbmcpCisgICsweDMxQTggfCAwQyAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDAwQyAoMTIpIExvYzogKzB4MzFCNCAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgdHlwZWAgKHRhYmxlKQorICArMHgzMUFDIHwgMDQgMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDAwMDQgKDQpIExvYzogKzB4MzFCMCAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYGRvY3VtZW50YXRpb25gICh2ZWN0b3IpCisKK3ZlY3RvciAocmVmbGVjdGlvbi5GaWVsZC5kb2N1bWVudGF0aW9uKToKKyAgKzB4MzFCMCB8IDAwIDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgfCAweDAwMDAwMDAwICgwKSAgICAgICAgICAgICAgICAgICAgIHwgbGVuZ3RoIG9mIHZlY3RvciAoIyBpdGVtcykKKwordGFibGUgKHJlZmxlY3Rpb24uVHlwZSk6CisgICsweDMxQjQgfCBGQyBGOCBGRiBGRiAgICAgICAgICAgICB8IFNPZmZzZXQzMiAgIHwgMHhGRkZGRjhGQyAoLTE3OTYpIExvYzogKzB4MzhCOCAgICB8IG9mZnNldCB0byB2dGFibGUKKyAgKzB4MzFCOCB8IDAwIDAwIDAwICAgICAgICAgICAgICAgIHwgdWludDhfdFszXSAgfCAuLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgcGFkZGluZworICArMHgzMUJCIHwgMEYgICAgICAgICAgICAgICAgICAgICAgfCB1aW50OF90ICAgICB8IDB4MEYgKDE1KSAgICAgICAgICAgICAgICAgICAgICAgICAgfCB0YWJsZSBmaWVsZCBgYmFzZV90eXBlYCAoQnl0ZSkKKyAgKzB4MzFCQyB8IDA2IDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgfCAweDAwMDAwMDA2ICg2KSAgICAgICAgICAgICAgICAgICAgIHwgdGFibGUgZmllbGQgYGluZGV4YCAoSW50KQorICArMHgzMUMwIHwgMDEgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICB8IDB4MDAwMDAwMDEgKDEpICAgICAgICAgICAgICAgICAgICAgfCB0YWJsZSBmaWVsZCBgZWxlbWVudF9zaXplYCAoVUludCkKKworc3RyaW5nIChyZWZsZWN0aW9uLkZpZWxkLm5hbWUpOgorICArMHgzMUM0IHwgMDEgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICB8IDB4MDAwMDAwMDEgKDEpICAgICAgICAgICAgICAgICAgICAgfCBsZW5ndGggb2Ygc3RyaW5nCisgICsweDMxQzggfCA2MiAgICAgICAgICAgICAgICAgICAgICB8IGNoYXJbMV0gICAgIHwgYiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHN0cmluZyBsaXRlcmFsCisgICsweDMxQzkgfCAwMCAgICAgICAgICAgICAgICAgICAgICB8IGNoYXIgICAgICAgIHwgMHgwMCAoMCkgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHN0cmluZyB0ZXJtaW5hdG9yCisKK3BhZGRpbmc6CisgICsweDMxQ0EgfCAwMCAwMCAgICAgICAgICAgICAgICAgICB8IHVpbnQ4X3RbMl0gIHwgLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHBhZGRpbmcKKwordnRhYmxlIChyZWZsZWN0aW9uLkZpZWxkKToKKyAgKzB4MzFDQyB8IDFDIDAwICAgICAgICAgICAgICAgICAgIHwgdWludDE2X3QgICAgfCAweDAwMUMgKDI4KSAgICAgICAgICAgICAgICAgICAgICAgIHwgc2l6ZSBvZiB0aGlzIHZ0YWJsZQorICArMHgzMUNFIHwgMTQgMDAgICAgICAgICAgICAgICAgICAgfCB1aW50MTZfdCAgICB8IDB4MDAxNCAoMjApICAgICAgICAgICAgICAgICAgICAgICAgfCBzaXplIG9mIHJlZmVycmluZyB0YWJsZQorICArMHgzMUQwIHwgMDggMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgICB8IDB4MDAwOCAoOCkgICAgICAgICAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYG5hbWVgIChpZDogMCkKKyAgKzB4MzFEMiB8IDBDIDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgfCAweDAwMEMgKDEyKSAgICAgICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGB0eXBlYCAoaWQ6IDEpCisgICsweDMxRDQgfCAwMCAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgIHwgMHgwMDAwICgwKSAgICAgICAgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgaWRgIChpZDogMikgPGRlZmF1bHRzIHRvIDA+IChVU2hvcnQpCisgICsweDMxRDYgfCAwMCAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgIHwgMHgwMDAwICgwKSAgICAgICAgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgb2Zmc2V0YCAoaWQ6IDMpIDxkZWZhdWx0cyB0byAwPiAoVVNob3J0KQorICArMHgzMUQ4IHwgMDAgMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgICB8IDB4MDAwMCAoMCkgICAgICAgICAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYGRlZmF1bHRfaW50ZWdlcmAgKGlkOiA0KSA8ZGVmYXVsdHMgdG8gMD4gKExvbmcpCisgICsweDMxREEgfCAwMCAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgIHwgMHgwMDAwICgwKSAgICAgICAgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgZGVmYXVsdF9yZWFsYCAoaWQ6IDUpIDxkZWZhdWx0cyB0byAwLjAwMDAwMD4gKERvdWJsZSkKKyAgKzB4MzFEQyB8IDAwIDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgfCAweDAwMDAgKDApICAgICAgICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBkZXByZWNhdGVkYCAoaWQ6IDYpIDxkZWZhdWx0cyB0byAwPiAoQm9vbCkKKyAgKzB4MzFERSB8IDAwIDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgfCAweDAwMDAgKDApICAgICAgICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGByZXF1aXJlZGAgKGlkOiA3KSA8ZGVmYXVsdHMgdG8gMD4gKEJvb2wpCisgICsweDMxRTAgfCAwMCAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgIHwgMHgwMDAwICgwKSAgICAgICAgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBga2V5YCAoaWQ6IDgpIDxkZWZhdWx0cyB0byAwPiAoQm9vbCkKKyAgKzB4MzFFMiB8IDAwIDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgfCAweDAwMDAgKDApICAgICAgICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBhdHRyaWJ1dGVzYCAoaWQ6IDkpIDxudWxsPiAoVmVjdG9yKQorICArMHgzMUU0IHwgMTAgMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgICB8IDB4MDAxMCAoMTYpICAgICAgICAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYGRvY3VtZW50YXRpb25gIChpZDogMTApCisgICsweDMxRTYgfCAwNyAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgIHwgMHgwMDA3ICg3KSAgICAgICAgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgb3B0aW9uYWxgIChpZDogMTEpCisKK3RhYmxlIChyZWZsZWN0aW9uLkZpZWxkKToKKyAgKzB4MzFFOCB8IDFDIDAwIDAwIDAwICAgICAgICAgICAgIHwgU09mZnNldDMyICAgfCAweDAwMDAwMDFDICgyOCkgTG9jOiArMHgzMUNDICAgICAgIHwgb2Zmc2V0IHRvIHZ0YWJsZQorICArMHgzMUVDIHwgMDAgMDAgMDAgICAgICAgICAgICAgICAgfCB1aW50OF90WzNdICB8IC4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBwYWRkaW5nCisgICsweDMxRUYgfCAwMSAgICAgICAgICAgICAgICAgICAgICB8IHVpbnQ4X3QgICAgIHwgMHgwMSAoMSkgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHRhYmxlIGZpZWxkIGBvcHRpb25hbGAgKEJvb2wpCisgICsweDMxRjAgfCAyMCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDAyMCAoMzIpIExvYzogKzB4MzIxMCAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgbmFtZWAgKHN0cmluZykKKyAgKzB4MzFGNCB8IDBDIDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMDBDICgxMikgTG9jOiArMHgzMjAwICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGB0eXBlYCAodGFibGUpCisgICsweDMxRjggfCAwNCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDAwNCAoNCkgTG9jOiArMHgzMUZDICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgZG9jdW1lbnRhdGlvbmAgKHZlY3RvcikKKwordmVjdG9yIChyZWZsZWN0aW9uLkZpZWxkLmRvY3VtZW50YXRpb24pOgorICArMHgzMUZDIHwgMDAgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICB8IDB4MDAwMDAwMDAgKDApICAgICAgICAgICAgICAgICAgICAgfCBsZW5ndGggb2YgdmVjdG9yICgjIGl0ZW1zKQorCit0YWJsZSAocmVmbGVjdGlvbi5UeXBlKToKKyAgKzB4MzIwMCB8IDQ4IEY5IEZGIEZGICAgICAgICAgICAgIHwgU09mZnNldDMyICAgfCAweEZGRkZGOTQ4ICgtMTcyMCkgTG9jOiArMHgzOEI4ICAgIHwgb2Zmc2V0IHRvIHZ0YWJsZQorICArMHgzMjA0IHwgMDAgMDAgMDAgICAgICAgICAgICAgICAgfCB1aW50OF90WzNdICB8IC4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBwYWRkaW5nCisgICsweDMyMDcgfCAwRiAgICAgICAgICAgICAgICAgICAgICB8IHVpbnQ4X3QgICAgIHwgMHgwRiAoMTUpICAgICAgICAgICAgICAgICAgICAgICAgICB8IHRhYmxlIGZpZWxkIGBiYXNlX3R5cGVgIChCeXRlKQorICArMHgzMjA4IHwgMDAgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICB8IDB4MDAwMDAwMDAgKDApICAgICAgICAgICAgICAgICAgICAgfCB0YWJsZSBmaWVsZCBgaW5kZXhgIChJbnQpCisgICsweDMyMEMgfCAwMSAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgIHwgMHgwMDAwMDAwMSAoMSkgICAgICAgICAgICAgICAgICAgICB8IHRhYmxlIGZpZWxkIGBlbGVtZW50X3NpemVgIChVSW50KQorCitzdHJpbmcgKHJlZmxlY3Rpb24uRmllbGQubmFtZSk6CisgICsweDMyMTAgfCAwMSAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgIHwgMHgwMDAwMDAwMSAoMSkgICAgICAgICAgICAgICAgICAgICB8IGxlbmd0aCBvZiBzdHJpbmcKKyAgKzB4MzIxNCB8IDYxICAgICAgICAgICAgICAgICAgICAgIHwgY2hhclsxXSAgICAgfCBhICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nIGxpdGVyYWwKKyAgKzB4MzIxNSB8IDAwICAgICAgICAgICAgICAgICAgICAgIHwgY2hhciAgICAgICAgfCAweDAwICgwKSAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nIHRlcm1pbmF0b3IKKworcGFkZGluZzoKKyAgKzB4MzIxNiB8IDAwIDAwICAgICAgICAgICAgICAgICAgIHwgdWludDhfdFsyXSAgfCAuLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgcGFkZGluZworCit0YWJsZSAocmVmbGVjdGlvbi5PYmplY3QpOgorICArMHgzMjE4IHwgMzggRjkgRkYgRkYgICAgICAgICAgICAgfCBTT2Zmc2V0MzIgICB8IDB4RkZGRkY5MzggKC0xNzM2KSBMb2M6ICsweDM4RTAgICAgfCBvZmZzZXQgdG8gdnRhYmxlCisgICsweDMyMUMgfCAwMCAwMCAwMCAgICAgICAgICAgICAgICB8IHVpbnQ4X3RbM10gIHwgLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHBhZGRpbmcKKyAgKzB4MzIxRiB8IDAxICAgICAgICAgICAgICAgICAgICAgIHwgdWludDhfdCAgICAgfCAweDAxICgxKSAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgdGFibGUgZmllbGQgYGlzX3N0cnVjdGAgKEJvb2wpCisgICsweDMyMjAgfCAyOCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDAyOCAoNDApIExvYzogKzB4MzI0OCAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgbmFtZWAgKHN0cmluZykKKyAgKzB4MzIyNCB8IDE4IDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMDE4ICgyNCkgTG9jOiArMHgzMjNDICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBmaWVsZHNgICh2ZWN0b3IpCisgICsweDMyMjggfCAwNCAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgIHwgMHgwMDAwMDAwNCAoNCkgICAgICAgICAgICAgICAgICAgICB8IHRhYmxlIGZpZWxkIGBtaW5hbGlnbmAgKEludCkKKyAgKzB4MzIyQyB8IDA4IDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgfCAweDAwMDAwMDA4ICg4KSAgICAgICAgICAgICAgICAgICAgIHwgdGFibGUgZmllbGQgYGJ5dGVzaXplYCAoSW50KQorICArMHgzMjMwIHwgMDggMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDAwMDggKDgpIExvYzogKzB4MzIzOCAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYGRvY3VtZW50YXRpb25gICh2ZWN0b3IpCisgICsweDMyMzQgfCAyQyAwNSAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDUyQyAoMTMyNCkgTG9jOiArMHgzNzYwICAgICB8IG9mZnNldCB0byBmaWVsZCBgZGVjbGFyYXRpb25fZmlsZWAgKHN0cmluZykKKwordmVjdG9yIChyZWZsZWN0aW9uLk9iamVjdC5kb2N1bWVudGF0aW9uKToKKyAgKzB4MzIzOCB8IDAwIDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgfCAweDAwMDAwMDAwICgwKSAgICAgICAgICAgICAgICAgICAgIHwgbGVuZ3RoIG9mIHZlY3RvciAoIyBpdGVtcykKKwordmVjdG9yIChyZWZsZWN0aW9uLk9iamVjdC5maWVsZHMpOgorICArMHgzMjNDIHwgMDIgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICB8IDB4MDAwMDAwMDIgKDIpICAgICAgICAgICAgICAgICAgICAgfCBsZW5ndGggb2YgdmVjdG9yICgjIGl0ZW1zKQorICArMHgzMjQwIHwgMjQgMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDAwMjQgKDM2KSBMb2M6ICsweDMyNjQgICAgICAgfCBvZmZzZXQgdG8gdGFibGVbMF0KKyAgKzB4MzI0NCB8IDZDIDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMDZDICgxMDgpIExvYzogKzB4MzJCMCAgICAgIHwgb2Zmc2V0IHRvIHRhYmxlWzFdCisKK3N0cmluZyAocmVmbGVjdGlvbi5PYmplY3QubmFtZSk6CisgICsweDMyNDggfCAxNiAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgIHwgMHgwMDAwMDAxNiAoMjIpICAgICAgICAgICAgICAgICAgICB8IGxlbmd0aCBvZiBzdHJpbmcKKyAgKzB4MzI0QyB8IDREIDc5IDQ3IDYxIDZEIDY1IDJFIDQ1IHwgY2hhclsyMl0gICAgfCBNeUdhbWUuRSAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nIGxpdGVyYWwKKyAgKzB4MzI1NCB8IDc4IDYxIDZEIDcwIDZDIDY1IDJFIDQxIHwgICAgICAgICAgICAgfCB4YW1wbGUuQQorICArMHgzMjVDIHwgNjIgNjkgNkMgNjkgNzQgNzkgICAgICAgfCAgICAgICAgICAgICB8IGJpbGl0eQorICArMHgzMjYyIHwgMDAgICAgICAgICAgICAgICAgICAgICAgfCBjaGFyICAgICAgICB8IDB4MDAgKDApICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJpbmcgdGVybWluYXRvcgorCit0YWJsZSAocmVmbGVjdGlvbi5GaWVsZCk6CisgICsweDMyNjQgfCBDRSBGRCBGRiBGRiAgICAgICAgICAgICB8IFNPZmZzZXQzMiAgIHwgMHhGRkZGRkRDRSAoLTU2MikgTG9jOiArMHgzNDk2ICAgICB8IG9mZnNldCB0byB2dGFibGUKKyAgKzB4MzI2OCB8IDAxIDAwICAgICAgICAgICAgICAgICAgIHwgdWludDE2X3QgICAgfCAweDAwMDEgKDEpICAgICAgICAgICAgICAgICAgICAgICAgIHwgdGFibGUgZmllbGQgYGlkYCAoVVNob3J0KQorICArMHgzMjZBIHwgMDQgMDAgICAgICAgICAgICAgICAgICAgfCB1aW50MTZfdCAgICB8IDB4MDAwNCAoNCkgICAgICAgICAgICAgICAgICAgICAgICAgfCB0YWJsZSBmaWVsZCBgb2Zmc2V0YCAoVVNob3J0KQorICArMHgzMjZDIHwgMUMgMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDAwMUMgKDI4KSBMb2M6ICsweDMyODggICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYG5hbWVgIChzdHJpbmcpCisgICsweDMyNzAgfCAwQyAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDAwQyAoMTIpIExvYzogKzB4MzI3QyAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgdHlwZWAgKHRhYmxlKQorICArMHgzMjc0IHwgMDQgMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDAwMDQgKDQpIExvYzogKzB4MzI3OCAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYGRvY3VtZW50YXRpb25gICh2ZWN0b3IpCisKK3ZlY3RvciAocmVmbGVjdGlvbi5GaWVsZC5kb2N1bWVudGF0aW9uKToKKyAgKzB4MzI3OCB8IDAwIDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgfCAweDAwMDAwMDAwICgwKSAgICAgICAgICAgICAgICAgICAgIHwgbGVuZ3RoIG9mIHZlY3RvciAoIyBpdGVtcykKKwordGFibGUgKHJlZmxlY3Rpb24uVHlwZSk6CisgICsweDMyN0MgfCBFMCBGOCBGRiBGRiAgICAgICAgICAgICB8IFNPZmZzZXQzMiAgIHwgMHhGRkZGRjhFMCAoLTE4MjQpIExvYzogKzB4Mzk5QyAgICB8IG9mZnNldCB0byB2dGFibGUKKyAgKzB4MzI4MCB8IDAwIDAwIDAwICAgICAgICAgICAgICAgIHwgdWludDhfdFszXSAgfCAuLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgcGFkZGluZworICArMHgzMjgzIHwgMDggICAgICAgICAgICAgICAgICAgICAgfCB1aW50OF90ICAgICB8IDB4MDggKDgpICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB0YWJsZSBmaWVsZCBgYmFzZV90eXBlYCAoQnl0ZSkKKyAgKzB4MzI4NCB8IDAxIDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgfCAweDAwMDAwMDAxICgxKSAgICAgICAgICAgICAgICAgICAgIHwgdGFibGUgZmllbGQgYGVsZW1lbnRfc2l6ZWAgKFVJbnQpCisKK3N0cmluZyAocmVmbGVjdGlvbi5GaWVsZC5uYW1lKToKKyAgKzB4MzI4OCB8IDA4IDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgfCAweDAwMDAwMDA4ICg4KSAgICAgICAgICAgICAgICAgICAgIHwgbGVuZ3RoIG9mIHN0cmluZworICArMHgzMjhDIHwgNjQgNjkgNzMgNzQgNjEgNkUgNjMgNjUgfCBjaGFyWzhdICAgICB8IGRpc3RhbmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJpbmcgbGl0ZXJhbAorICArMHgzMjk0IHwgMDAgICAgICAgICAgICAgICAgICAgICAgfCBjaGFyICAgICAgICB8IDB4MDAgKDApICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJpbmcgdGVybWluYXRvcgorCit2dGFibGUgKHJlZmxlY3Rpb24uRmllbGQpOgorICArMHgzMjk2IHwgMUEgMDAgICAgICAgICAgICAgICAgICAgfCB1aW50MTZfdCAgICB8IDB4MDAxQSAoMjYpICAgICAgICAgICAgICAgICAgICAgICAgfCBzaXplIG9mIHRoaXMgdnRhYmxlCisgICsweDMyOTggfCAxOCAwMCAgICAgICAgICAgICAgICAgICB8IHVpbnQxNl90ICAgIHwgMHgwMDE4ICgyNCkgICAgICAgICAgICAgICAgICAgICAgICB8IHNpemUgb2YgcmVmZXJyaW5nIHRhYmxlCisgICsweDMyOUEgfCAwOCAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgIHwgMHgwMDA4ICg4KSAgICAgICAgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgbmFtZWAgKGlkOiAwKQorICArMHgzMjlDIHwgMEMgMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgICB8IDB4MDAwQyAoMTIpICAgICAgICAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYHR5cGVgIChpZDogMSkKKyAgKzB4MzI5RSB8IDAwIDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgfCAweDAwMDAgKDApICAgICAgICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBpZGAgKGlkOiAyKSA8ZGVmYXVsdHMgdG8gMD4gKFVTaG9ydCkKKyAgKzB4MzJBMCB8IDAwIDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgfCAweDAwMDAgKDApICAgICAgICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBvZmZzZXRgIChpZDogMykgPGRlZmF1bHRzIHRvIDA+IChVU2hvcnQpCisgICsweDMyQTIgfCAwMCAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgIHwgMHgwMDAwICgwKSAgICAgICAgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgZGVmYXVsdF9pbnRlZ2VyYCAoaWQ6IDQpIDxkZWZhdWx0cyB0byAwPiAoTG9uZykKKyAgKzB4MzJBNCB8IDAwIDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgfCAweDAwMDAgKDApICAgICAgICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBkZWZhdWx0X3JlYWxgIChpZDogNSkgPGRlZmF1bHRzIHRvIDAuMDAwMDAwPiAoRG91YmxlKQorICArMHgzMkE2IHwgMDAgMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgICB8IDB4MDAwMCAoMCkgICAgICAgICAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYGRlcHJlY2F0ZWRgIChpZDogNikgPGRlZmF1bHRzIHRvIDA+IChCb29sKQorICArMHgzMkE4IHwgMDAgMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgICB8IDB4MDAwMCAoMCkgICAgICAgICAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYHJlcXVpcmVkYCAoaWQ6IDcpIDxkZWZhdWx0cyB0byAwPiAoQm9vbCkKKyAgKzB4MzJBQSB8IDA3IDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgfCAweDAwMDcgKDcpICAgICAgICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBrZXlgIChpZDogOCkKKyAgKzB4MzJBQyB8IDEwIDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgfCAweDAwMTAgKDE2KSAgICAgICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBhdHRyaWJ1dGVzYCAoaWQ6IDkpCisgICsweDMyQUUgfCAxNCAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgIHwgMHgwMDE0ICgyMCkgICAgICAgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgZG9jdW1lbnRhdGlvbmAgKGlkOiAxMCkKKwordGFibGUgKHJlZmxlY3Rpb24uRmllbGQpOgorICArMHgzMkIwIHwgMUEgMDAgMDAgMDAgICAgICAgICAgICAgfCBTT2Zmc2V0MzIgICB8IDB4MDAwMDAwMUEgKDI2KSBMb2M6ICsweDMyOTYgICAgICAgfCBvZmZzZXQgdG8gdnRhYmxlCisgICsweDMyQjQgfCAwMCAwMCAwMCAgICAgICAgICAgICAgICB8IHVpbnQ4X3RbM10gIHwgLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHBhZGRpbmcKKyAgKzB4MzJCNyB8IDAxICAgICAgICAgICAgICAgICAgICAgIHwgdWludDhfdCAgICAgfCAweDAxICgxKSAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgdGFibGUgZmllbGQgYGtleWAgKEJvb2wpCisgICsweDMyQjggfCA0NCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDA0NCAoNjgpIExvYzogKzB4MzJGQyAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgbmFtZWAgKHN0cmluZykKKyAgKzB4MzJCQyB8IDM0IDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMDM0ICg1MikgTG9jOiArMHgzMkYwICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGB0eXBlYCAodGFibGUpCisgICsweDMyQzAgfCAwQyAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDAwQyAoMTIpIExvYzogKzB4MzJDQyAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgYXR0cmlidXRlc2AgKHZlY3RvcikKKyAgKzB4MzJDNCB8IDA0IDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMDA0ICg0KSBMb2M6ICsweDMyQzggICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBkb2N1bWVudGF0aW9uYCAodmVjdG9yKQorCit2ZWN0b3IgKHJlZmxlY3Rpb24uRmllbGQuZG9jdW1lbnRhdGlvbik6CisgICsweDMyQzggfCAwMCAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgIHwgMHgwMDAwMDAwMCAoMCkgICAgICAgICAgICAgICAgICAgICB8IGxlbmd0aCBvZiB2ZWN0b3IgKCMgaXRlbXMpCisKK3ZlY3RvciAocmVmbGVjdGlvbi5GaWVsZC5hdHRyaWJ1dGVzKToKKyAgKzB4MzJDQyB8IDAxIDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgfCAweDAwMDAwMDAxICgxKSAgICAgICAgICAgICAgICAgICAgIHwgbGVuZ3RoIG9mIHZlY3RvciAoIyBpdGVtcykKKyAgKzB4MzJEMCB8IDA0IDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMDA0ICg0KSBMb2M6ICsweDMyRDQgICAgICAgIHwgb2Zmc2V0IHRvIHRhYmxlWzBdCisKK3RhYmxlIChyZWZsZWN0aW9uLktleVZhbHVlKToKKyAgKzB4MzJENCB8IDcwIEZEIEZGIEZGICAgICAgICAgICAgIHwgU09mZnNldDMyICAgfCAweEZGRkZGRDcwICgtNjU2KSBMb2M6ICsweDM1NjQgICAgIHwgb2Zmc2V0IHRvIHZ0YWJsZQorICArMHgzMkQ4IHwgMTAgMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDAwMTAgKDE2KSBMb2M6ICsweDMyRTggICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYGtleWAgKHN0cmluZykKKyAgKzB4MzJEQyB8IDA0IDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMDA0ICg0KSBMb2M6ICsweDMyRTAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGB2YWx1ZWAgKHN0cmluZykKKworc3RyaW5nIChyZWZsZWN0aW9uLktleVZhbHVlLnZhbHVlKToKKyAgKzB4MzJFMCB8IDAxIDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgfCAweDAwMDAwMDAxICgxKSAgICAgICAgICAgICAgICAgICAgIHwgbGVuZ3RoIG9mIHN0cmluZworICArMHgzMkU0IHwgMzAgICAgICAgICAgICAgICAgICAgICAgfCBjaGFyWzFdICAgICB8IDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJpbmcgbGl0ZXJhbAorICArMHgzMkU1IHwgMDAgICAgICAgICAgICAgICAgICAgICAgfCBjaGFyICAgICAgICB8IDB4MDAgKDApICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJpbmcgdGVybWluYXRvcgorCitwYWRkaW5nOgorICArMHgzMkU2IHwgMDAgMDAgICAgICAgICAgICAgICAgICAgfCB1aW50OF90WzJdICB8IC4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBwYWRkaW5nCisKK3N0cmluZyAocmVmbGVjdGlvbi5LZXlWYWx1ZS5rZXkpOgorICArMHgzMkU4IHwgMDMgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICB8IDB4MDAwMDAwMDMgKDMpICAgICAgICAgICAgICAgICAgICAgfCBsZW5ndGggb2Ygc3RyaW5nCisgICsweDMyRUMgfCA2QiA2NSA3OSAgICAgICAgICAgICAgICB8IGNoYXJbM10gICAgIHwga2V5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHN0cmluZyBsaXRlcmFsCisgICsweDMyRUYgfCAwMCAgICAgICAgICAgICAgICAgICAgICB8IGNoYXIgICAgICAgIHwgMHgwMCAoMCkgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHN0cmluZyB0ZXJtaW5hdG9yCisKK3RhYmxlIChyZWZsZWN0aW9uLlR5cGUpOgorICArMHgzMkYwIHwgNTQgRjkgRkYgRkYgICAgICAgICAgICAgfCBTT2Zmc2V0MzIgICB8IDB4RkZGRkY5NTQgKC0xNzA4KSBMb2M6ICsweDM5OUMgICAgfCBvZmZzZXQgdG8gdnRhYmxlCisgICsweDMyRjQgfCAwMCAwMCAwMCAgICAgICAgICAgICAgICB8IHVpbnQ4X3RbM10gIHwgLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHBhZGRpbmcKKyAgKzB4MzJGNyB8IDA4ICAgICAgICAgICAgICAgICAgICAgIHwgdWludDhfdCAgICAgfCAweDA4ICg4KSAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgdGFibGUgZmllbGQgYGJhc2VfdHlwZWAgKEJ5dGUpCisgICsweDMyRjggfCAwMSAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgIHwgMHgwMDAwMDAwMSAoMSkgICAgICAgICAgICAgICAgICAgICB8IHRhYmxlIGZpZWxkIGBlbGVtZW50X3NpemVgIChVSW50KQorCitzdHJpbmcgKHJlZmxlY3Rpb24uRmllbGQubmFtZSk6CisgICsweDMyRkMgfCAwMiAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgIHwgMHgwMDAwMDAwMiAoMikgICAgICAgICAgICAgICAgICAgICB8IGxlbmd0aCBvZiBzdHJpbmcKKyAgKzB4MzMwMCB8IDY5IDY0ICAgICAgICAgICAgICAgICAgIHwgY2hhclsyXSAgICAgfCBpZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nIGxpdGVyYWwKKyAgKzB4MzMwMiB8IDAwICAgICAgICAgICAgICAgICAgICAgIHwgY2hhciAgICAgICAgfCAweDAwICgwKSAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nIHRlcm1pbmF0b3IKKwordnRhYmxlIChyZWZsZWN0aW9uLk9iamVjdCk6CisgICsweDMzMDQgfCAxNCAwMCAgICAgICAgICAgICAgICAgICB8IHVpbnQxNl90ICAgIHwgMHgwMDE0ICgyMCkgICAgICAgICAgICAgICAgICAgICAgICB8IHNpemUgb2YgdGhpcyB2dGFibGUKKyAgKzB4MzMwNiB8IDI0IDAwICAgICAgICAgICAgICAgICAgIHwgdWludDE2X3QgICAgfCAweDAwMjQgKDM2KSAgICAgICAgICAgICAgICAgICAgICAgIHwgc2l6ZSBvZiByZWZlcnJpbmcgdGFibGUKKyAgKzB4MzMwOCB8IDA4IDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgfCAweDAwMDggKDgpICAgICAgICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBuYW1lYCAoaWQ6IDApCisgICsweDMzMEEgfCAwQyAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgIHwgMHgwMDBDICgxMikgICAgICAgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgZmllbGRzYCAoaWQ6IDEpCisgICsweDMzMEMgfCAwNyAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgIHwgMHgwMDA3ICg3KSAgICAgICAgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgaXNfc3RydWN0YCAoaWQ6IDIpCisgICsweDMzMEUgfCAxMCAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgIHwgMHgwMDEwICgxNikgICAgICAgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgbWluYWxpZ25gIChpZDogMykKKyAgKzB4MzMxMCB8IDE0IDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgfCAweDAwMTQgKDIwKSAgICAgICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBieXRlc2l6ZWAgKGlkOiA0KQorICArMHgzMzEyIHwgMTggMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgICB8IDB4MDAxOCAoMjQpICAgICAgICAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYGF0dHJpYnV0ZXNgIChpZDogNSkKKyAgKzB4MzMxNCB8IDFDIDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgfCAweDAwMUMgKDI4KSAgICAgICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBkb2N1bWVudGF0aW9uYCAoaWQ6IDYpCisgICsweDMzMTYgfCAyMCAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgIHwgMHgwMDIwICgzMikgICAgICAgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgZGVjbGFyYXRpb25fZmlsZWAgKGlkOiA3KQorCit0YWJsZSAocmVmbGVjdGlvbi5PYmplY3QpOgorICArMHgzMzE4IHwgMTQgMDAgMDAgMDAgICAgICAgICAgICAgfCBTT2Zmc2V0MzIgICB8IDB4MDAwMDAwMTQgKDIwKSBMb2M6ICsweDMzMDQgICAgICAgfCBvZmZzZXQgdG8gdnRhYmxlCisgICsweDMzMUMgfCAwMCAwMCAwMCAgICAgICAgICAgICAgICB8IHVpbnQ4X3RbM10gIHwgLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHBhZGRpbmcKKyAgKzB4MzMxRiB8IDAxICAgICAgICAgICAgICAgICAgICAgIHwgdWludDhfdCAgICAgfCAweDAxICgxKSAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgdGFibGUgZmllbGQgYGlzX3N0cnVjdGAgKEJvb2wpCisgICsweDMzMjAgfCA2OCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDA2OCAoMTA0KSBMb2M6ICsweDMzODggICAgICB8IG9mZnNldCB0byBmaWVsZCBgbmFtZWAgKHN0cmluZykKKyAgKzB4MzMyNCB8IDQ4IDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMDQ4ICg3MikgTG9jOiArMHgzMzZDICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBmaWVsZHNgICh2ZWN0b3IpCisgICsweDMzMjggfCAwOCAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgIHwgMHgwMDAwMDAwOCAoOCkgICAgICAgICAgICAgICAgICAgICB8IHRhYmxlIGZpZWxkIGBtaW5hbGlnbmAgKEludCkKKyAgKzB4MzMyQyB8IDIwIDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgfCAweDAwMDAwMDIwICgzMikgICAgICAgICAgICAgICAgICAgIHwgdGFibGUgZmllbGQgYGJ5dGVzaXplYCAoSW50KQorICArMHgzMzMwIHwgMTAgMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDAwMTAgKDE2KSBMb2M6ICsweDMzNDAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYGF0dHJpYnV0ZXNgICh2ZWN0b3IpCisgICsweDMzMzQgfCAwOCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDAwOCAoOCkgTG9jOiArMHgzMzNDICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgZG9jdW1lbnRhdGlvbmAgKHZlY3RvcikKKyAgKzB4MzMzOCB8IDI4IDA0IDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwNDI4ICgxMDY0KSBMb2M6ICsweDM3NjAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBkZWNsYXJhdGlvbl9maWxlYCAoc3RyaW5nKQorCit2ZWN0b3IgKHJlZmxlY3Rpb24uT2JqZWN0LmRvY3VtZW50YXRpb24pOgorICArMHgzMzNDIHwgMDAgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICB8IDB4MDAwMDAwMDAgKDApICAgICAgICAgICAgICAgICAgICAgfCBsZW5ndGggb2YgdmVjdG9yICgjIGl0ZW1zKQorCit2ZWN0b3IgKHJlZmxlY3Rpb24uT2JqZWN0LmF0dHJpYnV0ZXMpOgorICArMHgzMzQwIHwgMDEgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICB8IDB4MDAwMDAwMDEgKDEpICAgICAgICAgICAgICAgICAgICAgfCBsZW5ndGggb2YgdmVjdG9yICgjIGl0ZW1zKQorICArMHgzMzQ0IHwgMDQgMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDAwMDQgKDQpIExvYzogKzB4MzM0OCAgICAgICAgfCBvZmZzZXQgdG8gdGFibGVbMF0KKwordGFibGUgKHJlZmxlY3Rpb24uS2V5VmFsdWUpOgorICArMHgzMzQ4IHwgRTQgRkQgRkYgRkYgICAgICAgICAgICAgfCBTT2Zmc2V0MzIgICB8IDB4RkZGRkZERTQgKC01NDApIExvYzogKzB4MzU2NCAgICAgfCBvZmZzZXQgdG8gdnRhYmxlCisgICsweDMzNEMgfCAxMCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDAxMCAoMTYpIExvYzogKzB4MzM1QyAgICAgICB8IG9mZnNldCB0byBmaWVsZCBga2V5YCAoc3RyaW5nKQorICArMHgzMzUwIHwgMDQgMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDAwMDQgKDQpIExvYzogKzB4MzM1NCAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYHZhbHVlYCAoc3RyaW5nKQorCitzdHJpbmcgKHJlZmxlY3Rpb24uS2V5VmFsdWUudmFsdWUpOgorICArMHgzMzU0IHwgMDEgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICB8IDB4MDAwMDAwMDEgKDEpICAgICAgICAgICAgICAgICAgICAgfCBsZW5ndGggb2Ygc3RyaW5nCisgICsweDMzNTggfCAzOCAgICAgICAgICAgICAgICAgICAgICB8IGNoYXJbMV0gICAgIHwgOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHN0cmluZyBsaXRlcmFsCisgICsweDMzNTkgfCAwMCAgICAgICAgICAgICAgICAgICAgICB8IGNoYXIgICAgICAgIHwgMHgwMCAoMCkgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHN0cmluZyB0ZXJtaW5hdG9yCisKK3BhZGRpbmc6CisgICsweDMzNUEgfCAwMCAwMCAgICAgICAgICAgICAgICAgICB8IHVpbnQ4X3RbMl0gIHwgLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHBhZGRpbmcKKworc3RyaW5nIChyZWZsZWN0aW9uLktleVZhbHVlLmtleSk6CisgICsweDMzNUMgfCAwQiAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgIHwgMHgwMDAwMDAwQiAoMTEpICAgICAgICAgICAgICAgICAgICB8IGxlbmd0aCBvZiBzdHJpbmcKKyAgKzB4MzM2MCB8IDY2IDZGIDcyIDYzIDY1IDVGIDYxIDZDIHwgY2hhclsxMV0gICAgfCBmb3JjZV9hbCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nIGxpdGVyYWwKKyAgKzB4MzM2OCB8IDY5IDY3IDZFICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgfCBpZ24KKyAgKzB4MzM2QiB8IDAwICAgICAgICAgICAgICAgICAgICAgIHwgY2hhciAgICAgICAgfCAweDAwICgwKSAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nIHRlcm1pbmF0b3IKKwordmVjdG9yIChyZWZsZWN0aW9uLk9iamVjdC5maWVsZHMpOgorICArMHgzMzZDIHwgMDYgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICB8IDB4MDAwMDAwMDYgKDYpICAgICAgICAgICAgICAgICAgICAgfCBsZW5ndGggb2YgdmVjdG9yICgjIGl0ZW1zKQorICArMHgzMzcwIHwgQzQgMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDAwQzQgKDE5NikgTG9jOiArMHgzNDM0ICAgICAgfCBvZmZzZXQgdG8gdGFibGVbMF0KKyAgKzB4MzM3NCB8IDg0IDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMDg0ICgxMzIpIExvYzogKzB4MzNGOCAgICAgIHwgb2Zmc2V0IHRvIHRhYmxlWzFdCisgICsweDMzNzggfCA0OCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDA0OCAoNzIpIExvYzogKzB4MzNDMCAgICAgICB8IG9mZnNldCB0byB0YWJsZVsyXQorICArMHgzMzdDIHwgNjAgMDEgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDAxNjAgKDM1MikgTG9jOiArMHgzNERDICAgICAgfCBvZmZzZXQgdG8gdGFibGVbM10KKyAgKzB4MzM4MCB8IDMwIDAxIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMTMwICgzMDQpIExvYzogKzB4MzRCMCAgICAgIHwgb2Zmc2V0IHRvIHRhYmxlWzRdCisgICsweDMzODQgfCBFNCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDBFNCAoMjI4KSBMb2M6ICsweDM0NjggICAgICB8IG9mZnNldCB0byB0YWJsZVs1XQorCitzdHJpbmcgKHJlZmxlY3Rpb24uT2JqZWN0Lm5hbWUpOgorICArMHgzMzg4IHwgMTMgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICB8IDB4MDAwMDAwMTMgKDE5KSAgICAgICAgICAgICAgICAgICAgfCBsZW5ndGggb2Ygc3RyaW5nCisgICsweDMzOEMgfCA0RCA3OSA0NyA2MSA2RCA2NSAyRSA0NSB8IGNoYXJbMTldICAgIHwgTXlHYW1lLkUgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHN0cmluZyBsaXRlcmFsCisgICsweDMzOTQgfCA3OCA2MSA2RCA3MCA2QyA2NSAyRSA1NiB8ICAgICAgICAgICAgIHwgeGFtcGxlLlYKKyAgKzB4MzM5QyB8IDY1IDYzIDMzICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgfCBlYzMKKyAgKzB4MzM5RiB8IDAwICAgICAgICAgICAgICAgICAgICAgIHwgY2hhciAgICAgICAgfCAweDAwICgwKSAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nIHRlcm1pbmF0b3IKKworcGFkZGluZzoKKyAgKzB4MzNBMCB8IDAwIDAwICAgICAgICAgICAgICAgICAgIHwgdWludDhfdFsyXSAgfCAuLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgcGFkZGluZworCit2dGFibGUgKHJlZmxlY3Rpb24uRmllbGQpOgorICArMHgzM0EyIHwgMUUgMDAgICAgICAgICAgICAgICAgICAgfCB1aW50MTZfdCAgICB8IDB4MDAxRSAoMzApICAgICAgICAgICAgICAgICAgICAgICAgfCBzaXplIG9mIHRoaXMgdnRhYmxlCisgICsweDMzQTQgfCAxOCAwMCAgICAgICAgICAgICAgICAgICB8IHVpbnQxNl90ICAgIHwgMHgwMDE4ICgyNCkgICAgICAgICAgICAgICAgICAgICAgICB8IHNpemUgb2YgcmVmZXJyaW5nIHRhYmxlCisgICsweDMzQTYgfCAwQyAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgIHwgMHgwMDBDICgxMikgICAgICAgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgbmFtZWAgKGlkOiAwKQorICArMHgzM0E4IHwgMTAgMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgICB8IDB4MDAxMCAoMTYpICAgICAgICAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYHR5cGVgIChpZDogMSkKKyAgKzB4MzNBQSB8IDA2IDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgfCAweDAwMDYgKDYpICAgICAgICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBpZGAgKGlkOiAyKQorICArMHgzM0FDIHwgMDggMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgICB8IDB4MDAwOCAoOCkgICAgICAgICAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYG9mZnNldGAgKGlkOiAzKQorICArMHgzM0FFIHwgMDAgMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgICB8IDB4MDAwMCAoMCkgICAgICAgICAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYGRlZmF1bHRfaW50ZWdlcmAgKGlkOiA0KSA8ZGVmYXVsdHMgdG8gMD4gKExvbmcpCisgICsweDMzQjAgfCAwMCAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgIHwgMHgwMDAwICgwKSAgICAgICAgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgZGVmYXVsdF9yZWFsYCAoaWQ6IDUpIDxkZWZhdWx0cyB0byAwLjAwMDAwMD4gKERvdWJsZSkKKyAgKzB4MzNCMiB8IDAwIDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgfCAweDAwMDAgKDApICAgICAgICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBkZXByZWNhdGVkYCAoaWQ6IDYpIDxkZWZhdWx0cyB0byAwPiAoQm9vbCkKKyAgKzB4MzNCNCB8IDAwIDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgfCAweDAwMDAgKDApICAgICAgICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGByZXF1aXJlZGAgKGlkOiA3KSA8ZGVmYXVsdHMgdG8gMD4gKEJvb2wpCisgICsweDMzQjYgfCAwMCAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgIHwgMHgwMDAwICgwKSAgICAgICAgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBga2V5YCAoaWQ6IDgpIDxkZWZhdWx0cyB0byAwPiAoQm9vbCkKKyAgKzB4MzNCOCB8IDAwIDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgfCAweDAwMDAgKDApICAgICAgICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBhdHRyaWJ1dGVzYCAoaWQ6IDkpIDxudWxsPiAoVmVjdG9yKQorICArMHgzM0JBIHwgMTQgMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgICB8IDB4MDAxNCAoMjApICAgICAgICAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYGRvY3VtZW50YXRpb25gIChpZDogMTApCisgICsweDMzQkMgfCAwNSAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgIHwgMHgwMDA1ICg1KSAgICAgICAgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgb3B0aW9uYWxgIChpZDogMTEpCisgICsweDMzQkUgfCAwQSAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgIHwgMHgwMDBBICgxMCkgICAgICAgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgcGFkZGluZ2AgKGlkOiAxMikKKwordGFibGUgKHJlZmxlY3Rpb24uRmllbGQpOgorICArMHgzM0MwIHwgMUUgMDAgMDAgMDAgICAgICAgICAgICAgfCBTT2Zmc2V0MzIgICB8IDB4MDAwMDAwMUUgKDMwKSBMb2M6ICsweDMzQTIgICAgICAgfCBvZmZzZXQgdG8gdnRhYmxlCisgICsweDMzQzQgfCAwMCAgICAgICAgICAgICAgICAgICAgICB8IHVpbnQ4X3RbMV0gIHwgLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHBhZGRpbmcKKyAgKzB4MzNDNSB8IDAxICAgICAgICAgICAgICAgICAgICAgIHwgdWludDhfdCAgICAgfCAweDAxICgxKSAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgdGFibGUgZmllbGQgYG9wdGlvbmFsYCAoQm9vbCkKKyAgKzB4MzNDNiB8IDA1IDAwICAgICAgICAgICAgICAgICAgIHwgdWludDE2X3QgICAgfCAweDAwMDUgKDUpICAgICAgICAgICAgICAgICAgICAgICAgIHwgdGFibGUgZmllbGQgYGlkYCAoVVNob3J0KQorICArMHgzM0M4IHwgMUEgMDAgICAgICAgICAgICAgICAgICAgfCB1aW50MTZfdCAgICB8IDB4MDAxQSAoMjYpICAgICAgICAgICAgICAgICAgICAgICAgfCB0YWJsZSBmaWVsZCBgb2Zmc2V0YCAoVVNob3J0KQorICArMHgzM0NBIHwgMDIgMDAgICAgICAgICAgICAgICAgICAgfCB1aW50MTZfdCAgICB8IDB4MDAwMiAoMikgICAgICAgICAgICAgICAgICAgICAgICAgfCB0YWJsZSBmaWVsZCBgcGFkZGluZ2AgKFVTaG9ydCkKKyAgKzB4MzNDQyB8IDIwIDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMDIwICgzMikgTG9jOiArMHgzM0VDICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBuYW1lYCAoc3RyaW5nKQorICArMHgzM0QwIHwgMEMgMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDAwMEMgKDEyKSBMb2M6ICsweDMzREMgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYHR5cGVgICh0YWJsZSkKKyAgKzB4MzNENCB8IDA0IDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMDA0ICg0KSBMb2M6ICsweDMzRDggICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBkb2N1bWVudGF0aW9uYCAodmVjdG9yKQorCit2ZWN0b3IgKHJlZmxlY3Rpb24uRmllbGQuZG9jdW1lbnRhdGlvbik6CisgICsweDMzRDggfCAwMCAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgIHwgMHgwMDAwMDAwMCAoMCkgICAgICAgICAgICAgICAgICAgICB8IGxlbmd0aCBvZiB2ZWN0b3IgKCMgaXRlbXMpCisKK3RhYmxlIChyZWZsZWN0aW9uLlR5cGUpOgorICArMHgzM0RDIHwgMjQgRkIgRkYgRkYgICAgICAgICAgICAgfCBTT2Zmc2V0MzIgICB8IDB4RkZGRkZCMjQgKC0xMjQ0KSBMb2M6ICsweDM4QjggICAgfCBvZmZzZXQgdG8gdnRhYmxlCisgICsweDMzRTAgfCAwMCAwMCAwMCAgICAgICAgICAgICAgICB8IHVpbnQ4X3RbM10gIHwgLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHBhZGRpbmcKKyAgKzB4MzNFMyB8IDBGICAgICAgICAgICAgICAgICAgICAgIHwgdWludDhfdCAgICAgfCAweDBGICgxNSkgICAgICAgICAgICAgICAgICAgICAgICAgIHwgdGFibGUgZmllbGQgYGJhc2VfdHlwZWAgKEJ5dGUpCisgICsweDMzRTQgfCAwNiAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgIHwgMHgwMDAwMDAwNiAoNikgICAgICAgICAgICAgICAgICAgICB8IHRhYmxlIGZpZWxkIGBpbmRleGAgKEludCkKKyAgKzB4MzNFOCB8IDAxIDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgfCAweDAwMDAwMDAxICgxKSAgICAgICAgICAgICAgICAgICAgIHwgdGFibGUgZmllbGQgYGVsZW1lbnRfc2l6ZWAgKFVJbnQpCisKK3N0cmluZyAocmVmbGVjdGlvbi5GaWVsZC5uYW1lKToKKyAgKzB4MzNFQyB8IDA1IDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgfCAweDAwMDAwMDA1ICg1KSAgICAgICAgICAgICAgICAgICAgIHwgbGVuZ3RoIG9mIHN0cmluZworICArMHgzM0YwIHwgNzQgNjUgNzMgNzQgMzMgICAgICAgICAgfCBjaGFyWzVdICAgICB8IHRlc3QzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJpbmcgbGl0ZXJhbAorICArMHgzM0Y1IHwgMDAgICAgICAgICAgICAgICAgICAgICAgfCBjaGFyICAgICAgICB8IDB4MDAgKDApICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJpbmcgdGVybWluYXRvcgorCitwYWRkaW5nOgorICArMHgzM0Y2IHwgMDAgMDAgICAgICAgICAgICAgICAgICAgfCB1aW50OF90WzJdICB8IC4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBwYWRkaW5nCisKK3RhYmxlIChyZWZsZWN0aW9uLkZpZWxkKToKKyAgKzB4MzNGOCB8IDdBIEZEIEZGIEZGICAgICAgICAgICAgIHwgU09mZnNldDMyICAgfCAweEZGRkZGRDdBICgtNjQ2KSBMb2M6ICsweDM2N0UgICAgIHwgb2Zmc2V0IHRvIHZ0YWJsZQorICArMHgzM0ZDIHwgMDAgMDAgICAgICAgICAgICAgICAgICAgfCB1aW50OF90WzJdICB8IC4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBwYWRkaW5nCisgICsweDMzRkUgfCAwNCAwMCAgICAgICAgICAgICAgICAgICB8IHVpbnQxNl90ICAgIHwgMHgwMDA0ICg0KSAgICAgICAgICAgICAgICAgICAgICAgICB8IHRhYmxlIGZpZWxkIGBpZGAgKFVTaG9ydCkKKyAgKzB4MzQwMCB8IDE4IDAwICAgICAgICAgICAgICAgICAgIHwgdWludDE2X3QgICAgfCAweDAwMTggKDI0KSAgICAgICAgICAgICAgICAgICAgICAgIHwgdGFibGUgZmllbGQgYG9mZnNldGAgKFVTaG9ydCkKKyAgKzB4MzQwMiB8IDAxIDAwICAgICAgICAgICAgICAgICAgIHwgdWludDE2X3QgICAgfCAweDAwMDEgKDEpICAgICAgICAgICAgICAgICAgICAgICAgIHwgdGFibGUgZmllbGQgYHBhZGRpbmdgIChVU2hvcnQpCisgICsweDM0MDQgfCAyNCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDAyNCAoMzYpIExvYzogKzB4MzQyOCAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgbmFtZWAgKHN0cmluZykKKyAgKzB4MzQwOCB8IDBDIDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMDBDICgxMikgTG9jOiArMHgzNDE0ICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGB0eXBlYCAodGFibGUpCisgICsweDM0MEMgfCAwNCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDAwNCAoNCkgTG9jOiArMHgzNDEwICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgZG9jdW1lbnRhdGlvbmAgKHZlY3RvcikKKwordmVjdG9yIChyZWZsZWN0aW9uLkZpZWxkLmRvY3VtZW50YXRpb24pOgorICArMHgzNDEwIHwgMDAgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICB8IDB4MDAwMDAwMDAgKDApICAgICAgICAgICAgICAgICAgICAgfCBsZW5ndGggb2YgdmVjdG9yICgjIGl0ZW1zKQorCit0YWJsZSAocmVmbGVjdGlvbi5UeXBlKToKKyAgKzB4MzQxNCB8IDEwIEZFIEZGIEZGICAgICAgICAgICAgIHwgU09mZnNldDMyICAgfCAweEZGRkZGRTEwICgtNDk2KSBMb2M6ICsweDM2MDQgICAgIHwgb2Zmc2V0IHRvIHZ0YWJsZQorICArMHgzNDE4IHwgMDAgMDAgMDAgICAgICAgICAgICAgICAgfCB1aW50OF90WzNdICB8IC4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBwYWRkaW5nCisgICsweDM0MUIgfCAwNCAgICAgICAgICAgICAgICAgICAgICB8IHVpbnQ4X3QgICAgIHwgMHgwNCAoNCkgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHRhYmxlIGZpZWxkIGBiYXNlX3R5cGVgIChCeXRlKQorICArMHgzNDFDIHwgMDMgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICB8IDB4MDAwMDAwMDMgKDMpICAgICAgICAgICAgICAgICAgICAgfCB0YWJsZSBmaWVsZCBgaW5kZXhgIChJbnQpCisgICsweDM0MjAgfCAwMSAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgIHwgMHgwMDAwMDAwMSAoMSkgICAgICAgICAgICAgICAgICAgICB8IHRhYmxlIGZpZWxkIGBiYXNlX3NpemVgIChVSW50KQorICArMHgzNDI0IHwgMDEgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICB8IDB4MDAwMDAwMDEgKDEpICAgICAgICAgICAgICAgICAgICAgfCB0YWJsZSBmaWVsZCBgZWxlbWVudF9zaXplYCAoVUludCkKKworc3RyaW5nIChyZWZsZWN0aW9uLkZpZWxkLm5hbWUpOgorICArMHgzNDI4IHwgMDUgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICB8IDB4MDAwMDAwMDUgKDUpICAgICAgICAgICAgICAgICAgICAgfCBsZW5ndGggb2Ygc3RyaW5nCisgICsweDM0MkMgfCA3NCA2NSA3MyA3NCAzMiAgICAgICAgICB8IGNoYXJbNV0gICAgIHwgdGVzdDIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHN0cmluZyBsaXRlcmFsCisgICsweDM0MzEgfCAwMCAgICAgICAgICAgICAgICAgICAgICB8IGNoYXIgICAgICAgIHwgMHgwMCAoMCkgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHN0cmluZyB0ZXJtaW5hdG9yCisKK3BhZGRpbmc6CisgICsweDM0MzIgfCAwMCAwMCAgICAgICAgICAgICAgICAgICB8IHVpbnQ4X3RbMl0gIHwgLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHBhZGRpbmcKKwordGFibGUgKHJlZmxlY3Rpb24uRmllbGQpOgorICArMHgzNDM0IHwgOUUgRkYgRkYgRkYgICAgICAgICAgICAgfCBTT2Zmc2V0MzIgICB8IDB4RkZGRkZGOUUgKC05OCkgTG9jOiArMHgzNDk2ICAgICAgfCBvZmZzZXQgdG8gdnRhYmxlCisgICsweDM0MzggfCAwMyAwMCAgICAgICAgICAgICAgICAgICB8IHVpbnQxNl90ICAgIHwgMHgwMDAzICgzKSAgICAgICAgICAgICAgICAgICAgICAgICB8IHRhYmxlIGZpZWxkIGBpZGAgKFVTaG9ydCkKKyAgKzB4MzQzQSB8IDEwIDAwICAgICAgICAgICAgICAgICAgIHwgdWludDE2X3QgICAgfCAweDAwMTAgKDE2KSAgICAgICAgICAgICAgICAgICAgICAgIHwgdGFibGUgZmllbGQgYG9mZnNldGAgKFVTaG9ydCkKKyAgKzB4MzQzQyB8IDIwIDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMDIwICgzMikgTG9jOiArMHgzNDVDICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBuYW1lYCAoc3RyaW5nKQorICArMHgzNDQwIHwgMEMgMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDAwMEMgKDEyKSBMb2M6ICsweDM0NEMgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYHR5cGVgICh0YWJsZSkKKyAgKzB4MzQ0NCB8IDA0IDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMDA0ICg0KSBMb2M6ICsweDM0NDggICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBkb2N1bWVudGF0aW9uYCAodmVjdG9yKQorCit2ZWN0b3IgKHJlZmxlY3Rpb24uRmllbGQuZG9jdW1lbnRhdGlvbik6CisgICsweDM0NDggfCAwMCAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgIHwgMHgwMDAwMDAwMCAoMCkgICAgICAgICAgICAgICAgICAgICB8IGxlbmd0aCBvZiB2ZWN0b3IgKCMgaXRlbXMpCisKK3RhYmxlIChyZWZsZWN0aW9uLlR5cGUpOgorICArMHgzNDRDIHwgNjggRkQgRkYgRkYgICAgICAgICAgICAgfCBTT2Zmc2V0MzIgICB8IDB4RkZGRkZENjggKC02NjQpIExvYzogKzB4MzZFNCAgICAgfCBvZmZzZXQgdG8gdnRhYmxlCisgICsweDM0NTAgfCAwMCAwMCAwMCAgICAgICAgICAgICAgICB8IHVpbnQ4X3RbM10gIHwgLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHBhZGRpbmcKKyAgKzB4MzQ1MyB8IDBDICAgICAgICAgICAgICAgICAgICAgIHwgdWludDhfdCAgICAgfCAweDBDICgxMikgICAgICAgICAgICAgICAgICAgICAgICAgIHwgdGFibGUgZmllbGQgYGJhc2VfdHlwZWAgKEJ5dGUpCisgICsweDM0NTQgfCAwOCAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgIHwgMHgwMDAwMDAwOCAoOCkgICAgICAgICAgICAgICAgICAgICB8IHRhYmxlIGZpZWxkIGBiYXNlX3NpemVgIChVSW50KQorICArMHgzNDU4IHwgMDEgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICB8IDB4MDAwMDAwMDEgKDEpICAgICAgICAgICAgICAgICAgICAgfCB0YWJsZSBmaWVsZCBgZWxlbWVudF9zaXplYCAoVUludCkKKworc3RyaW5nIChyZWZsZWN0aW9uLkZpZWxkLm5hbWUpOgorICArMHgzNDVDIHwgMDUgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICB8IDB4MDAwMDAwMDUgKDUpICAgICAgICAgICAgICAgICAgICAgfCBsZW5ndGggb2Ygc3RyaW5nCisgICsweDM0NjAgfCA3NCA2NSA3MyA3NCAzMSAgICAgICAgICB8IGNoYXJbNV0gICAgIHwgdGVzdDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHN0cmluZyBsaXRlcmFsCisgICsweDM0NjUgfCAwMCAgICAgICAgICAgICAgICAgICAgICB8IGNoYXIgICAgICAgIHwgMHgwMCAoMCkgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHN0cmluZyB0ZXJtaW5hdG9yCisKK3BhZGRpbmc6CisgICsweDM0NjYgfCAwMCAwMCAgICAgICAgICAgICAgICAgICB8IHVpbnQ4X3RbMl0gIHwgLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHBhZGRpbmcKKwordGFibGUgKHJlZmxlY3Rpb24uRmllbGQpOgorICArMHgzNDY4IHwgRUEgRkQgRkYgRkYgICAgICAgICAgICAgfCBTT2Zmc2V0MzIgICB8IDB4RkZGRkZERUEgKC01MzQpIExvYzogKzB4MzY3RSAgICAgfCBvZmZzZXQgdG8gdnRhYmxlCisgICsweDM0NkMgfCAwMCAwMCAgICAgICAgICAgICAgICAgICB8IHVpbnQ4X3RbMl0gIHwgLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHBhZGRpbmcKKyAgKzB4MzQ2RSB8IDAyIDAwICAgICAgICAgICAgICAgICAgIHwgdWludDE2X3QgICAgfCAweDAwMDIgKDIpICAgICAgICAgICAgICAgICAgICAgICAgIHwgdGFibGUgZmllbGQgYGlkYCAoVVNob3J0KQorICArMHgzNDcwIHwgMDggMDAgICAgICAgICAgICAgICAgICAgfCB1aW50MTZfdCAgICB8IDB4MDAwOCAoOCkgICAgICAgICAgICAgICAgICAgICAgICAgfCB0YWJsZSBmaWVsZCBgb2Zmc2V0YCAoVVNob3J0KQorICArMHgzNDcyIHwgMDQgMDAgICAgICAgICAgICAgICAgICAgfCB1aW50MTZfdCAgICB8IDB4MDAwNCAoNCkgICAgICAgICAgICAgICAgICAgICAgICAgfCB0YWJsZSBmaWVsZCBgcGFkZGluZ2AgKFVTaG9ydCkKKyAgKzB4MzQ3NCB8IDFDIDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMDFDICgyOCkgTG9jOiArMHgzNDkwICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBuYW1lYCAoc3RyaW5nKQorICArMHgzNDc4IHwgMEMgMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDAwMEMgKDEyKSBMb2M6ICsweDM0ODQgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYHR5cGVgICh0YWJsZSkKKyAgKzB4MzQ3QyB8IDA0IDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMDA0ICg0KSBMb2M6ICsweDM0ODAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBkb2N1bWVudGF0aW9uYCAodmVjdG9yKQorCit2ZWN0b3IgKHJlZmxlY3Rpb24uRmllbGQuZG9jdW1lbnRhdGlvbik6CisgICsweDM0ODAgfCAwMCAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgIHwgMHgwMDAwMDAwMCAoMCkgICAgICAgICAgICAgICAgICAgICB8IGxlbmd0aCBvZiB2ZWN0b3IgKCMgaXRlbXMpCisKK3RhYmxlIChyZWZsZWN0aW9uLlR5cGUpOgorICArMHgzNDg0IHwgRTggRkEgRkYgRkYgICAgICAgICAgICAgfCBTT2Zmc2V0MzIgICB8IDB4RkZGRkZBRTggKC0xMzA0KSBMb2M6ICsweDM5OUMgICAgfCBvZmZzZXQgdG8gdnRhYmxlCisgICsweDM0ODggfCAwMCAwMCAwMCAgICAgICAgICAgICAgICB8IHVpbnQ4X3RbM10gIHwgLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHBhZGRpbmcKKyAgKzB4MzQ4QiB8IDBCICAgICAgICAgICAgICAgICAgICAgIHwgdWludDhfdCAgICAgfCAweDBCICgxMSkgICAgICAgICAgICAgICAgICAgICAgICAgIHwgdGFibGUgZmllbGQgYGJhc2VfdHlwZWAgKEJ5dGUpCisgICsweDM0OEMgfCAwMSAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgIHwgMHgwMDAwMDAwMSAoMSkgICAgICAgICAgICAgICAgICAgICB8IHRhYmxlIGZpZWxkIGBlbGVtZW50X3NpemVgIChVSW50KQorCitzdHJpbmcgKHJlZmxlY3Rpb24uRmllbGQubmFtZSk6CisgICsweDM0OTAgfCAwMSAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgIHwgMHgwMDAwMDAwMSAoMSkgICAgICAgICAgICAgICAgICAgICB8IGxlbmd0aCBvZiBzdHJpbmcKKyAgKzB4MzQ5NCB8IDdBICAgICAgICAgICAgICAgICAgICAgIHwgY2hhclsxXSAgICAgfCB6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nIGxpdGVyYWwKKyAgKzB4MzQ5NSB8IDAwICAgICAgICAgICAgICAgICAgICAgIHwgY2hhciAgICAgICAgfCAweDAwICgwKSAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nIHRlcm1pbmF0b3IKKwordnRhYmxlIChyZWZsZWN0aW9uLkZpZWxkKToKKyAgKzB4MzQ5NiB8IDFBIDAwICAgICAgICAgICAgICAgICAgIHwgdWludDE2X3QgICAgfCAweDAwMUEgKDI2KSAgICAgICAgICAgICAgICAgICAgICAgIHwgc2l6ZSBvZiB0aGlzIHZ0YWJsZQorICArMHgzNDk4IHwgMTQgMDAgICAgICAgICAgICAgICAgICAgfCB1aW50MTZfdCAgICB8IDB4MDAxNCAoMjApICAgICAgICAgICAgICAgICAgICAgICAgfCBzaXplIG9mIHJlZmVycmluZyB0YWJsZQorICArMHgzNDlBIHwgMDggMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgICB8IDB4MDAwOCAoOCkgICAgICAgICAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYG5hbWVgIChpZDogMCkKKyAgKzB4MzQ5QyB8IDBDIDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgfCAweDAwMEMgKDEyKSAgICAgICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGB0eXBlYCAoaWQ6IDEpCisgICsweDM0OUUgfCAwNCAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgIHwgMHgwMDA0ICg0KSAgICAgICAgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgaWRgIChpZDogMikKKyAgKzB4MzRBMCB8IDA2IDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgfCAweDAwMDYgKDYpICAgICAgICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBvZmZzZXRgIChpZDogMykKKyAgKzB4MzRBMiB8IDAwIDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgfCAweDAwMDAgKDApICAgICAgICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBkZWZhdWx0X2ludGVnZXJgIChpZDogNCkgPGRlZmF1bHRzIHRvIDA+IChMb25nKQorICArMHgzNEE0IHwgMDAgMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgICB8IDB4MDAwMCAoMCkgICAgICAgICAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYGRlZmF1bHRfcmVhbGAgKGlkOiA1KSA8ZGVmYXVsdHMgdG8gMC4wMDAwMDA+IChEb3VibGUpCisgICsweDM0QTYgfCAwMCAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgIHwgMHgwMDAwICgwKSAgICAgICAgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgZGVwcmVjYXRlZGAgKGlkOiA2KSA8ZGVmYXVsdHMgdG8gMD4gKEJvb2wpCisgICsweDM0QTggfCAwMCAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgIHwgMHgwMDAwICgwKSAgICAgICAgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgcmVxdWlyZWRgIChpZDogNykgPGRlZmF1bHRzIHRvIDA+IChCb29sKQorICArMHgzNEFBIHwgMDAgMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgICB8IDB4MDAwMCAoMCkgICAgICAgICAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYGtleWAgKGlkOiA4KSA8ZGVmYXVsdHMgdG8gMD4gKEJvb2wpCisgICsweDM0QUMgfCAwMCAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgIHwgMHgwMDAwICgwKSAgICAgICAgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgYXR0cmlidXRlc2AgKGlkOiA5KSA8bnVsbD4gKFZlY3RvcikKKyAgKzB4MzRBRSB8IDEwIDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgfCAweDAwMTAgKDE2KSAgICAgICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBkb2N1bWVudGF0aW9uYCAoaWQ6IDEwKQorCit0YWJsZSAocmVmbGVjdGlvbi5GaWVsZCk6CisgICsweDM0QjAgfCAxQSAwMCAwMCAwMCAgICAgICAgICAgICB8IFNPZmZzZXQzMiAgIHwgMHgwMDAwMDAxQSAoMjYpIExvYzogKzB4MzQ5NiAgICAgICB8IG9mZnNldCB0byB2dGFibGUKKyAgKzB4MzRCNCB8IDAxIDAwICAgICAgICAgICAgICAgICAgIHwgdWludDE2X3QgICAgfCAweDAwMDEgKDEpICAgICAgICAgICAgICAgICAgICAgICAgIHwgdGFibGUgZmllbGQgYGlkYCAoVVNob3J0KQorICArMHgzNEI2IHwgMDQgMDAgICAgICAgICAgICAgICAgICAgfCB1aW50MTZfdCAgICB8IDB4MDAwNCAoNCkgICAgICAgICAgICAgICAgICAgICAgICAgfCB0YWJsZSBmaWVsZCBgb2Zmc2V0YCAoVVNob3J0KQorICArMHgzNEI4IHwgMUMgMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDAwMUMgKDI4KSBMb2M6ICsweDM0RDQgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYG5hbWVgIChzdHJpbmcpCisgICsweDM0QkMgfCAwQyAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDAwQyAoMTIpIExvYzogKzB4MzRDOCAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgdHlwZWAgKHRhYmxlKQorICArMHgzNEMwIHwgMDQgMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDAwMDQgKDQpIExvYzogKzB4MzRDNCAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYGRvY3VtZW50YXRpb25gICh2ZWN0b3IpCisKK3ZlY3RvciAocmVmbGVjdGlvbi5GaWVsZC5kb2N1bWVudGF0aW9uKToKKyAgKzB4MzRDNCB8IDAwIDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgfCAweDAwMDAwMDAwICgwKSAgICAgICAgICAgICAgICAgICAgIHwgbGVuZ3RoIG9mIHZlY3RvciAoIyBpdGVtcykKKwordGFibGUgKHJlZmxlY3Rpb24uVHlwZSk6CisgICsweDM0QzggfCAyQyBGQiBGRiBGRiAgICAgICAgICAgICB8IFNPZmZzZXQzMiAgIHwgMHhGRkZGRkIyQyAoLTEyMzYpIExvYzogKzB4Mzk5QyAgICB8IG9mZnNldCB0byB2dGFibGUKKyAgKzB4MzRDQyB8IDAwIDAwIDAwICAgICAgICAgICAgICAgIHwgdWludDhfdFszXSAgfCAuLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgcGFkZGluZworICArMHgzNENGIHwgMEIgICAgICAgICAgICAgICAgICAgICAgfCB1aW50OF90ICAgICB8IDB4MEIgKDExKSAgICAgICAgICAgICAgICAgICAgICAgICAgfCB0YWJsZSBmaWVsZCBgYmFzZV90eXBlYCAoQnl0ZSkKKyAgKzB4MzREMCB8IDAxIDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgfCAweDAwMDAwMDAxICgxKSAgICAgICAgICAgICAgICAgICAgIHwgdGFibGUgZmllbGQgYGVsZW1lbnRfc2l6ZWAgKFVJbnQpCisKK3N0cmluZyAocmVmbGVjdGlvbi5GaWVsZC5uYW1lKToKKyAgKzB4MzRENCB8IDAxIDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgfCAweDAwMDAwMDAxICgxKSAgICAgICAgICAgICAgICAgICAgIHwgbGVuZ3RoIG9mIHN0cmluZworICArMHgzNEQ4IHwgNzkgICAgICAgICAgICAgICAgICAgICAgfCBjaGFyWzFdICAgICB8IHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJpbmcgbGl0ZXJhbAorICArMHgzNEQ5IHwgMDAgICAgICAgICAgICAgICAgICAgICAgfCBjaGFyICAgICAgICB8IDB4MDAgKDApICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJpbmcgdGVybWluYXRvcgorCitwYWRkaW5nOgorICArMHgzNERBIHwgMDAgMDAgICAgICAgICAgICAgICAgICAgfCB1aW50OF90WzJdICB8IC4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBwYWRkaW5nCisKK3RhYmxlIChyZWZsZWN0aW9uLkZpZWxkKToKKyAgKzB4MzREQyB8IDZFIEZCIEZGIEZGICAgICAgICAgICAgIHwgU09mZnNldDMyICAgfCAweEZGRkZGQjZFICgtMTE3MCkgTG9jOiArMHgzOTZFICAgIHwgb2Zmc2V0IHRvIHZ0YWJsZQorICArMHgzNEUwIHwgMUMgMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDAwMUMgKDI4KSBMb2M6ICsweDM0RkMgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYG5hbWVgIChzdHJpbmcpCisgICsweDM0RTQgfCAwQyAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDAwQyAoMTIpIExvYzogKzB4MzRGMCAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgdHlwZWAgKHRhYmxlKQorICArMHgzNEU4IHwgMDQgMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDAwMDQgKDQpIExvYzogKzB4MzRFQyAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYGRvY3VtZW50YXRpb25gICh2ZWN0b3IpCisKK3ZlY3RvciAocmVmbGVjdGlvbi5GaWVsZC5kb2N1bWVudGF0aW9uKToKKyAgKzB4MzRFQyB8IDAwIDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgfCAweDAwMDAwMDAwICgwKSAgICAgICAgICAgICAgICAgICAgIHwgbGVuZ3RoIG9mIHZlY3RvciAoIyBpdGVtcykKKwordGFibGUgKHJlZmxlY3Rpb24uVHlwZSk6CisgICsweDM0RjAgfCA1NCBGQiBGRiBGRiAgICAgICAgICAgICB8IFNPZmZzZXQzMiAgIHwgMHhGRkZGRkI1NCAoLTExOTYpIExvYzogKzB4Mzk5QyAgICB8IG9mZnNldCB0byB2dGFibGUKKyAgKzB4MzRGNCB8IDAwIDAwIDAwICAgICAgICAgICAgICAgIHwgdWludDhfdFszXSAgfCAuLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgcGFkZGluZworICArMHgzNEY3IHwgMEIgICAgICAgICAgICAgICAgICAgICAgfCB1aW50OF90ICAgICB8IDB4MEIgKDExKSAgICAgICAgICAgICAgICAgICAgICAgICAgfCB0YWJsZSBmaWVsZCBgYmFzZV90eXBlYCAoQnl0ZSkKKyAgKzB4MzRGOCB8IDAxIDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgfCAweDAwMDAwMDAxICgxKSAgICAgICAgICAgICAgICAgICAgIHwgdGFibGUgZmllbGQgYGVsZW1lbnRfc2l6ZWAgKFVJbnQpCisKK3N0cmluZyAocmVmbGVjdGlvbi5GaWVsZC5uYW1lKToKKyAgKzB4MzRGQyB8IDAxIDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgfCAweDAwMDAwMDAxICgxKSAgICAgICAgICAgICAgICAgICAgIHwgbGVuZ3RoIG9mIHN0cmluZworICArMHgzNTAwIHwgNzggICAgICAgICAgICAgICAgICAgICAgfCBjaGFyWzFdICAgICB8IHggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJpbmcgbGl0ZXJhbAorICArMHgzNTAxIHwgMDAgICAgICAgICAgICAgICAgICAgICAgfCBjaGFyICAgICAgICB8IDB4MDAgKDApICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJpbmcgdGVybWluYXRvcgorCitwYWRkaW5nOgorICArMHgzNTAyIHwgMDAgMDAgICAgICAgICAgICAgICAgICAgfCB1aW50OF90WzJdICB8IC4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBwYWRkaW5nCisKK3Z0YWJsZSAocmVmbGVjdGlvbi5PYmplY3QpOgorICArMHgzNTA0IHwgMTQgMDAgICAgICAgICAgICAgICAgICAgfCB1aW50MTZfdCAgICB8IDB4MDAxNCAoMjApICAgICAgICAgICAgICAgICAgICAgICAgfCBzaXplIG9mIHRoaXMgdnRhYmxlCisgICsweDM1MDYgfCAxQyAwMCAgICAgICAgICAgICAgICAgICB8IHVpbnQxNl90ICAgIHwgMHgwMDFDICgyOCkgICAgICAgICAgICAgICAgICAgICAgICB8IHNpemUgb2YgcmVmZXJyaW5nIHRhYmxlCisgICsweDM1MDggfCAwNCAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgIHwgMHgwMDA0ICg0KSAgICAgICAgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgbmFtZWAgKGlkOiAwKQorICArMHgzNTBBIHwgMDggMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgICB8IDB4MDAwOCAoOCkgICAgICAgICAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYGZpZWxkc2AgKGlkOiAxKQorICArMHgzNTBDIHwgMDAgMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgICB8IDB4MDAwMCAoMCkgICAgICAgICAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYGlzX3N0cnVjdGAgKGlkOiAyKSA8ZGVmYXVsdHMgdG8gMD4gKEJvb2wpCisgICsweDM1MEUgfCAwQyAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgIHwgMHgwMDBDICgxMikgICAgICAgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgbWluYWxpZ25gIChpZDogMykKKyAgKzB4MzUxMCB8IDAwIDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgfCAweDAwMDAgKDApICAgICAgICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBieXRlc2l6ZWAgKGlkOiA0KSA8ZGVmYXVsdHMgdG8gMD4gKEludCkKKyAgKzB4MzUxMiB8IDEwIDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgfCAweDAwMTAgKDE2KSAgICAgICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBhdHRyaWJ1dGVzYCAoaWQ6IDUpCisgICsweDM1MTQgfCAxNCAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgIHwgMHgwMDE0ICgyMCkgICAgICAgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgZG9jdW1lbnRhdGlvbmAgKGlkOiA2KQorICArMHgzNTE2IHwgMTggMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgICB8IDB4MDAxOCAoMjQpICAgICAgICAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYGRlY2xhcmF0aW9uX2ZpbGVgIChpZDogNykKKwordGFibGUgKHJlZmxlY3Rpb24uT2JqZWN0KToKKyAgKzB4MzUxOCB8IDE0IDAwIDAwIDAwICAgICAgICAgICAgIHwgU09mZnNldDMyICAgfCAweDAwMDAwMDE0ICgyMCkgTG9jOiArMHgzNTA0ICAgICAgIHwgb2Zmc2V0IHRvIHZ0YWJsZQorICArMHgzNTFDIHwgODAgMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDAwODAgKDEyOCkgTG9jOiArMHgzNTlDICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYG5hbWVgIChzdHJpbmcpCisgICsweDM1MjAgfCA3NCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDA3NCAoMTE2KSBMb2M6ICsweDM1OTQgICAgICB8IG9mZnNldCB0byBmaWVsZCBgZmllbGRzYCAodmVjdG9yKQorICArMHgzNTI0IHwgMDEgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICB8IDB4MDAwMDAwMDEgKDEpICAgICAgICAgICAgICAgICAgICAgfCB0YWJsZSBmaWVsZCBgbWluYWxpZ25gIChJbnQpCisgICsweDM1MjggfCAxMCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDAxMCAoMTYpIExvYzogKzB4MzUzOCAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgYXR0cmlidXRlc2AgKHZlY3RvcikKKyAgKzB4MzUyQyB8IDA4IDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMDA4ICg4KSBMb2M6ICsweDM1MzQgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBkb2N1bWVudGF0aW9uYCAodmVjdG9yKQorICArMHgzNTMwIHwgMzAgMDIgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDAyMzAgKDU2MCkgTG9jOiArMHgzNzYwICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYGRlY2xhcmF0aW9uX2ZpbGVgIChzdHJpbmcpCisKK3ZlY3RvciAocmVmbGVjdGlvbi5PYmplY3QuZG9jdW1lbnRhdGlvbik6CisgICsweDM1MzQgfCAwMCAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgIHwgMHgwMDAwMDAwMCAoMCkgICAgICAgICAgICAgICAgICAgICB8IGxlbmd0aCBvZiB2ZWN0b3IgKCMgaXRlbXMpCisKK3ZlY3RvciAocmVmbGVjdGlvbi5PYmplY3QuYXR0cmlidXRlcyk6CisgICsweDM1MzggfCAwMiAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgIHwgMHgwMDAwMDAwMiAoMikgICAgICAgICAgICAgICAgICAgICB8IGxlbmd0aCBvZiB2ZWN0b3IgKCMgaXRlbXMpCisgICsweDM1M0MgfCAzMCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDAzMCAoNDgpIExvYzogKzB4MzU2QyAgICAgICB8IG9mZnNldCB0byB0YWJsZVswXQorICArMHgzNTQwIHwgMDQgMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDAwMDQgKDQpIExvYzogKzB4MzU0NCAgICAgICAgfCBvZmZzZXQgdG8gdGFibGVbMV0KKwordGFibGUgKHJlZmxlY3Rpb24uS2V5VmFsdWUpOgorICArMHgzNTQ0IHwgRTAgRkYgRkYgRkYgICAgICAgICAgICAgfCBTT2Zmc2V0MzIgICB8IDB4RkZGRkZGRTAgKC0zMikgTG9jOiArMHgzNTY0ICAgICAgfCBvZmZzZXQgdG8gdnRhYmxlCisgICsweDM1NDggfCAxMCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDAxMCAoMTYpIExvYzogKzB4MzU1OCAgICAgICB8IG9mZnNldCB0byBmaWVsZCBga2V5YCAoc3RyaW5nKQorICArMHgzNTRDIHwgMDQgMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDAwMDQgKDQpIExvYzogKzB4MzU1MCAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYHZhbHVlYCAoc3RyaW5nKQorCitzdHJpbmcgKHJlZmxlY3Rpb24uS2V5VmFsdWUudmFsdWUpOgorICArMHgzNTUwIHwgMDEgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICB8IDB4MDAwMDAwMDEgKDEpICAgICAgICAgICAgICAgICAgICAgfCBsZW5ndGggb2Ygc3RyaW5nCisgICsweDM1NTQgfCAzMCAgICAgICAgICAgICAgICAgICAgICB8IGNoYXJbMV0gICAgIHwgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHN0cmluZyBsaXRlcmFsCisgICsweDM1NTUgfCAwMCAgICAgICAgICAgICAgICAgICAgICB8IGNoYXIgICAgICAgIHwgMHgwMCAoMCkgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHN0cmluZyB0ZXJtaW5hdG9yCisKK3BhZGRpbmc6CisgICsweDM1NTYgfCAwMCAwMCAgICAgICAgICAgICAgICAgICB8IHVpbnQ4X3RbMl0gIHwgLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHBhZGRpbmcKKworc3RyaW5nIChyZWZsZWN0aW9uLktleVZhbHVlLmtleSk6CisgICsweDM1NTggfCAwNyAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgIHwgMHgwMDAwMDAwNyAoNykgICAgICAgICAgICAgICAgICAgICB8IGxlbmd0aCBvZiBzdHJpbmcKKyAgKzB4MzU1QyB8IDcwIDcyIDY5IDc2IDYxIDc0IDY1ICAgIHwgY2hhcls3XSAgICAgfCBwcml2YXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nIGxpdGVyYWwKKyAgKzB4MzU2MyB8IDAwICAgICAgICAgICAgICAgICAgICAgIHwgY2hhciAgICAgICAgfCAweDAwICgwKSAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nIHRlcm1pbmF0b3IKKwordnRhYmxlIChyZWZsZWN0aW9uLktleVZhbHVlKToKKyAgKzB4MzU2NCB8IDA4IDAwICAgICAgICAgICAgICAgICAgIHwgdWludDE2X3QgICAgfCAweDAwMDggKDgpICAgICAgICAgICAgICAgICAgICAgICAgIHwgc2l6ZSBvZiB0aGlzIHZ0YWJsZQorICArMHgzNTY2IHwgMEMgMDAgICAgICAgICAgICAgICAgICAgfCB1aW50MTZfdCAgICB8IDB4MDAwQyAoMTIpICAgICAgICAgICAgICAgICAgICAgICAgfCBzaXplIG9mIHJlZmVycmluZyB0YWJsZQorICArMHgzNTY4IHwgMDQgMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgICB8IDB4MDAwNCAoNCkgICAgICAgICAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYGtleWAgKGlkOiAwKQorICArMHgzNTZBIHwgMDggMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgICB8IDB4MDAwOCAoOCkgICAgICAgICAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYHZhbHVlYCAoaWQ6IDEpCisKK3RhYmxlIChyZWZsZWN0aW9uLktleVZhbHVlKToKKyAgKzB4MzU2QyB8IDA4IDAwIDAwIDAwICAgICAgICAgICAgIHwgU09mZnNldDMyICAgfCAweDAwMDAwMDA4ICg4KSBMb2M6ICsweDM1NjQgICAgICAgIHwgb2Zmc2V0IHRvIHZ0YWJsZQorICArMHgzNTcwIHwgMTAgMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDAwMTAgKDE2KSBMb2M6ICsweDM1ODAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYGtleWAgKHN0cmluZykKKyAgKzB4MzU3NCB8IDA0IDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMDA0ICg0KSBMb2M6ICsweDM1NzggICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGB2YWx1ZWAgKHN0cmluZykKKworc3RyaW5nIChyZWZsZWN0aW9uLktleVZhbHVlLnZhbHVlKToKKyAgKzB4MzU3OCB8IDAxIDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgfCAweDAwMDAwMDAxICgxKSAgICAgICAgICAgICAgICAgICAgIHwgbGVuZ3RoIG9mIHN0cmluZworICArMHgzNTdDIHwgMzAgICAgICAgICAgICAgICAgICAgICAgfCBjaGFyWzFdICAgICB8IDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJpbmcgbGl0ZXJhbAorICArMHgzNTdEIHwgMDAgICAgICAgICAgICAgICAgICAgICAgfCBjaGFyICAgICAgICB8IDB4MDAgKDApICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJpbmcgdGVybWluYXRvcgorCitwYWRkaW5nOgorICArMHgzNTdFIHwgMDAgMDAgICAgICAgICAgICAgICAgICAgfCB1aW50OF90WzJdICB8IC4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBwYWRkaW5nCisKK3N0cmluZyAocmVmbGVjdGlvbi5LZXlWYWx1ZS5rZXkpOgorICArMHgzNTgwIHwgMEUgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICB8IDB4MDAwMDAwMEUgKDE0KSAgICAgICAgICAgICAgICAgICAgfCBsZW5ndGggb2Ygc3RyaW5nCisgICsweDM1ODQgfCA2MyA3MyA2OCA2MSA3MiA3MCA1RiA3MCB8IGNoYXJbMTRdICAgIHwgY3NoYXJwX3AgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHN0cmluZyBsaXRlcmFsCisgICsweDM1OEMgfCA2MSA3MiA3NCA2OSA2MSA2QyAgICAgICB8ICAgICAgICAgICAgIHwgYXJ0aWFsCisgICsweDM1OTIgfCAwMCAgICAgICAgICAgICAgICAgICAgICB8IGNoYXIgICAgICAgIHwgMHgwMCAoMCkgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHN0cmluZyB0ZXJtaW5hdG9yCisKK3ZlY3RvciAocmVmbGVjdGlvbi5PYmplY3QuZmllbGRzKToKKyAgKzB4MzU5NCB8IDAxIDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgfCAweDAwMDAwMDAxICgxKSAgICAgICAgICAgICAgICAgICAgIHwgbGVuZ3RoIG9mIHZlY3RvciAoIyBpdGVtcykKKyAgKzB4MzU5OCB8IDRDIDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMDRDICg3NikgTG9jOiArMHgzNUU0ICAgICAgIHwgb2Zmc2V0IHRvIHRhYmxlWzBdCisKK3N0cmluZyAocmVmbGVjdGlvbi5PYmplY3QubmFtZSk6CisgICsweDM1OUMgfCAyNiAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgIHwgMHgwMDAwMDAyNiAoMzgpICAgICAgICAgICAgICAgICAgICB8IGxlbmd0aCBvZiBzdHJpbmcKKyAgKzB4MzVBMCB8IDREIDc5IDQ3IDYxIDZEIDY1IDJFIDQ1IHwgY2hhclszOF0gICAgfCBNeUdhbWUuRSAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nIGxpdGVyYWwKKyAgKzB4MzVBOCB8IDc4IDYxIDZEIDcwIDZDIDY1IDJFIDU0IHwgICAgICAgICAgICAgfCB4YW1wbGUuVAorICArMHgzNUIwIHwgNjUgNzMgNzQgNTMgNjkgNkQgNzAgNkMgfCAgICAgICAgICAgICB8IGVzdFNpbXBsCisgICsweDM1QjggfCA2NSA1NCA2MSA2MiA2QyA2NSA1NyA2OSB8ICAgICAgICAgICAgIHwgZVRhYmxlV2kKKyAgKzB4MzVDMCB8IDc0IDY4IDQ1IDZFIDc1IDZEICAgICAgIHwgICAgICAgICAgICAgfCB0aEVudW0KKyAgKzB4MzVDNiB8IDAwICAgICAgICAgICAgICAgICAgICAgIHwgY2hhciAgICAgICAgfCAweDAwICgwKSAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nIHRlcm1pbmF0b3IKKworcGFkZGluZzoKKyAgKzB4MzVDNyB8IDAwIDAwIDAwICAgICAgICAgICAgICAgIHwgdWludDhfdFszXSAgfCAuLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgcGFkZGluZworCit2dGFibGUgKHJlZmxlY3Rpb24uRmllbGQpOgorICArMHgzNUNBIHwgMUEgMDAgICAgICAgICAgICAgICAgICAgfCB1aW50MTZfdCAgICB8IDB4MDAxQSAoMjYpICAgICAgICAgICAgICAgICAgICAgICAgfCBzaXplIG9mIHRoaXMgdnRhYmxlCisgICsweDM1Q0MgfCAxQyAwMCAgICAgICAgICAgICAgICAgICB8IHVpbnQxNl90ICAgIHwgMHgwMDFDICgyOCkgICAgICAgICAgICAgICAgICAgICAgICB8IHNpemUgb2YgcmVmZXJyaW5nIHRhYmxlCisgICsweDM1Q0UgfCAwOCAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgIHwgMHgwMDA4ICg4KSAgICAgICAgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgbmFtZWAgKGlkOiAwKQorICArMHgzNUQwIHwgMEMgMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgICB8IDB4MDAwQyAoMTIpICAgICAgICAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYHR5cGVgIChpZDogMSkKKyAgKzB4MzVEMiB8IDAwIDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgfCAweDAwMDAgKDApICAgICAgICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBpZGAgKGlkOiAyKSA8ZGVmYXVsdHMgdG8gMD4gKFVTaG9ydCkKKyAgKzB4MzVENCB8IDA2IDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgfCAweDAwMDYgKDYpICAgICAgICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBvZmZzZXRgIChpZDogMykKKyAgKzB4MzVENiB8IDE0IDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgfCAweDAwMTQgKDIwKSAgICAgICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBkZWZhdWx0X2ludGVnZXJgIChpZDogNCkKKyAgKzB4MzVEOCB8IDAwIDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgfCAweDAwMDAgKDApICAgICAgICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBkZWZhdWx0X3JlYWxgIChpZDogNSkgPGRlZmF1bHRzIHRvIDAuMDAwMDAwPiAoRG91YmxlKQorICArMHgzNURBIHwgMDAgMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgICB8IDB4MDAwMCAoMCkgICAgICAgICAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYGRlcHJlY2F0ZWRgIChpZDogNikgPGRlZmF1bHRzIHRvIDA+IChCb29sKQorICArMHgzNURDIHwgMDAgMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgICB8IDB4MDAwMCAoMCkgICAgICAgICAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYHJlcXVpcmVkYCAoaWQ6IDcpIDxkZWZhdWx0cyB0byAwPiAoQm9vbCkKKyAgKzB4MzVERSB8IDAwIDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgfCAweDAwMDAgKDApICAgICAgICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBrZXlgIChpZDogOCkgPGRlZmF1bHRzIHRvIDA+IChCb29sKQorICArMHgzNUUwIHwgMDAgMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgICB8IDB4MDAwMCAoMCkgICAgICAgICAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYGF0dHJpYnV0ZXNgIChpZDogOSkgPG51bGw+IChWZWN0b3IpCisgICsweDM1RTIgfCAxMCAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgIHwgMHgwMDEwICgxNikgICAgICAgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgZG9jdW1lbnRhdGlvbmAgKGlkOiAxMCkKKwordGFibGUgKHJlZmxlY3Rpb24uRmllbGQpOgorICArMHgzNUU0IHwgMUEgMDAgMDAgMDAgICAgICAgICAgICAgfCBTT2Zmc2V0MzIgICB8IDB4MDAwMDAwMUEgKDI2KSBMb2M6ICsweDM1Q0EgICAgICAgfCBvZmZzZXQgdG8gdnRhYmxlCisgICsweDM1RTggfCAwMCAwMCAgICAgICAgICAgICAgICAgICB8IHVpbnQ4X3RbMl0gIHwgLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHBhZGRpbmcKKyAgKzB4MzVFQSB8IDA0IDAwICAgICAgICAgICAgICAgICAgIHwgdWludDE2X3QgICAgfCAweDAwMDQgKDQpICAgICAgICAgICAgICAgICAgICAgICAgIHwgdGFibGUgZmllbGQgYG9mZnNldGAgKFVTaG9ydCkKKyAgKzB4MzVFQyB8IDNDIDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMDNDICg2MCkgTG9jOiArMHgzNjI4ICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBuYW1lYCAoc3RyaW5nKQorICArMHgzNUYwIHwgMjQgMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDAwMjQgKDM2KSBMb2M6ICsweDM2MTQgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYHR5cGVgICh0YWJsZSkKKyAgKzB4MzVGNCB8IDBDIDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMDBDICgxMikgTG9jOiArMHgzNjAwICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBkb2N1bWVudGF0aW9uYCAodmVjdG9yKQorICArMHgzNUY4IHwgMDIgMDAgMDAgMDAgMDAgMDAgMDAgMDAgfCBpbnQ2NF90ICAgICB8IDB4MDAwMDAwMDAwMDAwMDAwMiAoMikgICAgICAgICAgICAgfCB0YWJsZSBmaWVsZCBgZGVmYXVsdF9pbnRlZ2VyYCAoTG9uZykKKwordmVjdG9yIChyZWZsZWN0aW9uLkZpZWxkLmRvY3VtZW50YXRpb24pOgorICArMHgzNjAwIHwgMDAgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICB8IDB4MDAwMDAwMDAgKDApICAgICAgICAgICAgICAgICAgICAgfCBsZW5ndGggb2YgdmVjdG9yICgjIGl0ZW1zKQorCit2dGFibGUgKHJlZmxlY3Rpb24uVHlwZSk6CisgICsweDM2MDQgfCAxMCAwMCAgICAgICAgICAgICAgICAgICB8IHVpbnQxNl90ICAgIHwgMHgwMDEwICgxNikgICAgICAgICAgICAgICAgICAgICAgICB8IHNpemUgb2YgdGhpcyB2dGFibGUKKyAgKzB4MzYwNiB8IDE0IDAwICAgICAgICAgICAgICAgICAgIHwgdWludDE2X3QgICAgfCAweDAwMTQgKDIwKSAgICAgICAgICAgICAgICAgICAgICAgIHwgc2l6ZSBvZiByZWZlcnJpbmcgdGFibGUKKyAgKzB4MzYwOCB8IDA3IDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgfCAweDAwMDcgKDcpICAgICAgICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBiYXNlX3R5cGVgIChpZDogMCkKKyAgKzB4MzYwQSB8IDAwIDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgfCAweDAwMDAgKDApICAgICAgICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBlbGVtZW50YCAoaWQ6IDEpIDxkZWZhdWx0cyB0byAwPiAoQnl0ZSkKKyAgKzB4MzYwQyB8IDA4IDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgfCAweDAwMDggKDgpICAgICAgICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBpbmRleGAgKGlkOiAyKQorICArMHgzNjBFIHwgMDAgMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgICB8IDB4MDAwMCAoMCkgICAgICAgICAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYGZpeGVkX2xlbmd0aGAgKGlkOiAzKSA8ZGVmYXVsdHMgdG8gMD4gKFVTaG9ydCkKKyAgKzB4MzYxMCB8IDBDIDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgfCAweDAwMEMgKDEyKSAgICAgICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBiYXNlX3NpemVgIChpZDogNCkKKyAgKzB4MzYxMiB8IDEwIDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgfCAweDAwMTAgKDE2KSAgICAgICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBlbGVtZW50X3NpemVgIChpZDogNSkKKwordGFibGUgKHJlZmxlY3Rpb24uVHlwZSk6CisgICsweDM2MTQgfCAxMCAwMCAwMCAwMCAgICAgICAgICAgICB8IFNPZmZzZXQzMiAgIHwgMHgwMDAwMDAxMCAoMTYpIExvYzogKzB4MzYwNCAgICAgICB8IG9mZnNldCB0byB2dGFibGUKKyAgKzB4MzYxOCB8IDAwIDAwIDAwICAgICAgICAgICAgICAgIHwgdWludDhfdFszXSAgfCAuLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgcGFkZGluZworICArMHgzNjFCIHwgMDQgICAgICAgICAgICAgICAgICAgICAgfCB1aW50OF90ICAgICB8IDB4MDQgKDQpICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB0YWJsZSBmaWVsZCBgYmFzZV90eXBlYCAoQnl0ZSkKKyAgKzB4MzYxQyB8IDAzIDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgfCAweDAwMDAwMDAzICgzKSAgICAgICAgICAgICAgICAgICAgIHwgdGFibGUgZmllbGQgYGluZGV4YCAoSW50KQorICArMHgzNjIwIHwgMDEgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICB8IDB4MDAwMDAwMDEgKDEpICAgICAgICAgICAgICAgICAgICAgfCB0YWJsZSBmaWVsZCBgYmFzZV9zaXplYCAoVUludCkKKyAgKzB4MzYyNCB8IDAxIDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgfCAweDAwMDAwMDAxICgxKSAgICAgICAgICAgICAgICAgICAgIHwgdGFibGUgZmllbGQgYGVsZW1lbnRfc2l6ZWAgKFVJbnQpCisKK3N0cmluZyAocmVmbGVjdGlvbi5GaWVsZC5uYW1lKToKKyAgKzB4MzYyOCB8IDA1IDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgfCAweDAwMDAwMDA1ICg1KSAgICAgICAgICAgICAgICAgICAgIHwgbGVuZ3RoIG9mIHN0cmluZworICArMHgzNjJDIHwgNjMgNkYgNkMgNkYgNzIgICAgICAgICAgfCBjaGFyWzVdICAgICB8IGNvbG9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJpbmcgbGl0ZXJhbAorICArMHgzNjMxIHwgMDAgICAgICAgICAgICAgICAgICAgICAgfCBjaGFyICAgICAgICB8IDB4MDAgKDApICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJpbmcgdGVybWluYXRvcgorCitwYWRkaW5nOgorICArMHgzNjMyIHwgMDAgMDAgICAgICAgICAgICAgICAgICAgfCB1aW50OF90WzJdICB8IC4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBwYWRkaW5nCisKK3RhYmxlIChyZWZsZWN0aW9uLk9iamVjdCk6CisgICsweDM2MzQgfCA1NCBGRCBGRiBGRiAgICAgICAgICAgICB8IFNPZmZzZXQzMiAgIHwgMHhGRkZGRkQ1NCAoLTY4NCkgTG9jOiArMHgzOEUwICAgICB8IG9mZnNldCB0byB2dGFibGUKKyAgKzB4MzYzOCB8IDAwIDAwIDAwICAgICAgICAgICAgICAgIHwgdWludDhfdFszXSAgfCAuLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgcGFkZGluZworICArMHgzNjNCIHwgMDEgICAgICAgICAgICAgICAgICAgICAgfCB1aW50OF90ICAgICB8IDB4MDEgKDEpICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB0YWJsZSBmaWVsZCBgaXNfc3RydWN0YCAoQm9vbCkKKyAgKzB4MzYzQyB8IDI4IDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMDI4ICg0MCkgTG9jOiArMHgzNjY0ICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBuYW1lYCAoc3RyaW5nKQorICArMHgzNjQwIHwgMTggMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDAwMTggKDI0KSBMb2M6ICsweDM2NTggICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYGZpZWxkc2AgKHZlY3RvcikKKyAgKzB4MzY0NCB8IDAyIDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgfCAweDAwMDAwMDAyICgyKSAgICAgICAgICAgICAgICAgICAgIHwgdGFibGUgZmllbGQgYG1pbmFsaWduYCAoSW50KQorICArMHgzNjQ4IHwgMDQgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICB8IDB4MDAwMDAwMDQgKDQpICAgICAgICAgICAgICAgICAgICAgfCB0YWJsZSBmaWVsZCBgYnl0ZXNpemVgIChJbnQpCisgICsweDM2NEMgfCAwOCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDAwOCAoOCkgTG9jOiArMHgzNjU0ICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgZG9jdW1lbnRhdGlvbmAgKHZlY3RvcikKKyAgKzB4MzY1MCB8IDEwIDAxIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMTEwICgyNzIpIExvYzogKzB4Mzc2MCAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBkZWNsYXJhdGlvbl9maWxlYCAoc3RyaW5nKQorCit2ZWN0b3IgKHJlZmxlY3Rpb24uT2JqZWN0LmRvY3VtZW50YXRpb24pOgorICArMHgzNjU0IHwgMDAgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICB8IDB4MDAwMDAwMDAgKDApICAgICAgICAgICAgICAgICAgICAgfCBsZW5ndGggb2YgdmVjdG9yICgjIGl0ZW1zKQorCit2ZWN0b3IgKHJlZmxlY3Rpb24uT2JqZWN0LmZpZWxkcyk6CisgICsweDM2NTggfCAwMiAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgIHwgMHgwMDAwMDAwMiAoMikgICAgICAgICAgICAgICAgICAgICB8IGxlbmd0aCBvZiB2ZWN0b3IgKCMgaXRlbXMpCisgICsweDM2NUMgfCA3NCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDA3NCAoMTE2KSBMb2M6ICsweDM2RDAgICAgICB8IG9mZnNldCB0byB0YWJsZVswXQorICArMHgzNjYwIHwgM0MgMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDAwM0MgKDYwKSBMb2M6ICsweDM2OUMgICAgICAgfCBvZmZzZXQgdG8gdGFibGVbMV0KKworc3RyaW5nIChyZWZsZWN0aW9uLk9iamVjdC5uYW1lKToKKyAgKzB4MzY2NCB8IDEzIDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgfCAweDAwMDAwMDEzICgxOSkgICAgICAgICAgICAgICAgICAgIHwgbGVuZ3RoIG9mIHN0cmluZworICArMHgzNjY4IHwgNEQgNzkgNDcgNjEgNkQgNjUgMkUgNDUgfCBjaGFyWzE5XSAgICB8IE15R2FtZS5FICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJpbmcgbGl0ZXJhbAorICArMHgzNjcwIHwgNzggNjEgNkQgNzAgNkMgNjUgMkUgNTQgfCAgICAgICAgICAgICB8IHhhbXBsZS5UCisgICsweDM2NzggfCA2NSA3MyA3NCAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgIHwgZXN0CisgICsweDM2N0IgfCAwMCAgICAgICAgICAgICAgICAgICAgICB8IGNoYXIgICAgICAgIHwgMHgwMCAoMCkgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHN0cmluZyB0ZXJtaW5hdG9yCisKK3BhZGRpbmc6CisgICsweDM2N0MgfCAwMCAwMCAgICAgICAgICAgICAgICAgICB8IHVpbnQ4X3RbMl0gIHwgLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHBhZGRpbmcKKwordnRhYmxlIChyZWZsZWN0aW9uLkZpZWxkKToKKyAgKzB4MzY3RSB8IDFFIDAwICAgICAgICAgICAgICAgICAgIHwgdWludDE2X3QgICAgfCAweDAwMUUgKDMwKSAgICAgICAgICAgICAgICAgICAgICAgIHwgc2l6ZSBvZiB0aGlzIHZ0YWJsZQorICArMHgzNjgwIHwgMTggMDAgICAgICAgICAgICAgICAgICAgfCB1aW50MTZfdCAgICB8IDB4MDAxOCAoMjQpICAgICAgICAgICAgICAgICAgICAgICAgfCBzaXplIG9mIHJlZmVycmluZyB0YWJsZQorICArMHgzNjgyIHwgMEMgMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgICB8IDB4MDAwQyAoMTIpICAgICAgICAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYG5hbWVgIChpZDogMCkKKyAgKzB4MzY4NCB8IDEwIDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgfCAweDAwMTAgKDE2KSAgICAgICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGB0eXBlYCAoaWQ6IDEpCisgICsweDM2ODYgfCAwNiAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgIHwgMHgwMDA2ICg2KSAgICAgICAgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgaWRgIChpZDogMikKKyAgKzB4MzY4OCB8IDA4IDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgfCAweDAwMDggKDgpICAgICAgICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBvZmZzZXRgIChpZDogMykKKyAgKzB4MzY4QSB8IDAwIDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgfCAweDAwMDAgKDApICAgICAgICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBkZWZhdWx0X2ludGVnZXJgIChpZDogNCkgPGRlZmF1bHRzIHRvIDA+IChMb25nKQorICArMHgzNjhDIHwgMDAgMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgICB8IDB4MDAwMCAoMCkgICAgICAgICAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYGRlZmF1bHRfcmVhbGAgKGlkOiA1KSA8ZGVmYXVsdHMgdG8gMC4wMDAwMDA+IChEb3VibGUpCisgICsweDM2OEUgfCAwMCAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgIHwgMHgwMDAwICgwKSAgICAgICAgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgZGVwcmVjYXRlZGAgKGlkOiA2KSA8ZGVmYXVsdHMgdG8gMD4gKEJvb2wpCisgICsweDM2OTAgfCAwMCAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgIHwgMHgwMDAwICgwKSAgICAgICAgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgcmVxdWlyZWRgIChpZDogNykgPGRlZmF1bHRzIHRvIDA+IChCb29sKQorICArMHgzNjkyIHwgMDAgMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgICB8IDB4MDAwMCAoMCkgICAgICAgICAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYGtleWAgKGlkOiA4KSA8ZGVmYXVsdHMgdG8gMD4gKEJvb2wpCisgICsweDM2OTQgfCAwMCAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgIHwgMHgwMDAwICgwKSAgICAgICAgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgYXR0cmlidXRlc2AgKGlkOiA5KSA8bnVsbD4gKFZlY3RvcikKKyAgKzB4MzY5NiB8IDE0IDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgfCAweDAwMTQgKDIwKSAgICAgICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBkb2N1bWVudGF0aW9uYCAoaWQ6IDEwKQorICArMHgzNjk4IHwgMDAgMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgICB8IDB4MDAwMCAoMCkgICAgICAgICAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYG9wdGlvbmFsYCAoaWQ6IDExKSA8ZGVmYXVsdHMgdG8gMD4gKEJvb2wpCisgICsweDM2OUEgfCAwQSAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgIHwgMHgwMDBBICgxMCkgICAgICAgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgcGFkZGluZ2AgKGlkOiAxMikKKwordGFibGUgKHJlZmxlY3Rpb24uRmllbGQpOgorICArMHgzNjlDIHwgMUUgMDAgMDAgMDAgICAgICAgICAgICAgfCBTT2Zmc2V0MzIgICB8IDB4MDAwMDAwMUUgKDMwKSBMb2M6ICsweDM2N0UgICAgICAgfCBvZmZzZXQgdG8gdnRhYmxlCisgICsweDM2QTAgfCAwMCAwMCAgICAgICAgICAgICAgICAgICB8IHVpbnQ4X3RbMl0gIHwgLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHBhZGRpbmcKKyAgKzB4MzZBMiB8IDAxIDAwICAgICAgICAgICAgICAgICAgIHwgdWludDE2X3QgICAgfCAweDAwMDEgKDEpICAgICAgICAgICAgICAgICAgICAgICAgIHwgdGFibGUgZmllbGQgYGlkYCAoVVNob3J0KQorICArMHgzNkE0IHwgMDIgMDAgICAgICAgICAgICAgICAgICAgfCB1aW50MTZfdCAgICB8IDB4MDAwMiAoMikgICAgICAgICAgICAgICAgICAgICAgICAgfCB0YWJsZSBmaWVsZCBgb2Zmc2V0YCAoVVNob3J0KQorICArMHgzNkE2IHwgMDEgMDAgICAgICAgICAgICAgICAgICAgfCB1aW50MTZfdCAgICB8IDB4MDAwMSAoMSkgICAgICAgICAgICAgICAgICAgICAgICAgfCB0YWJsZSBmaWVsZCBgcGFkZGluZ2AgKFVTaG9ydCkKKyAgKzB4MzZBOCB8IDIwIDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMDIwICgzMikgTG9jOiArMHgzNkM4ICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBuYW1lYCAoc3RyaW5nKQorICArMHgzNkFDIHwgMEMgMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDAwMEMgKDEyKSBMb2M6ICsweDM2QjggICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYHR5cGVgICh0YWJsZSkKKyAgKzB4MzZCMCB8IDA0IDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMDA0ICg0KSBMb2M6ICsweDM2QjQgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBkb2N1bWVudGF0aW9uYCAodmVjdG9yKQorCit2ZWN0b3IgKHJlZmxlY3Rpb24uRmllbGQuZG9jdW1lbnRhdGlvbik6CisgICsweDM2QjQgfCAwMCAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgIHwgMHgwMDAwMDAwMCAoMCkgICAgICAgICAgICAgICAgICAgICB8IGxlbmd0aCBvZiB2ZWN0b3IgKCMgaXRlbXMpCisKK3RhYmxlIChyZWZsZWN0aW9uLlR5cGUpOgorICArMHgzNkI4IHwgRDQgRkYgRkYgRkYgICAgICAgICAgICAgfCBTT2Zmc2V0MzIgICB8IDB4RkZGRkZGRDQgKC00NCkgTG9jOiArMHgzNkU0ICAgICAgfCBvZmZzZXQgdG8gdnRhYmxlCisgICsweDM2QkMgfCAwMCAwMCAwMCAgICAgICAgICAgICAgICB8IHVpbnQ4X3RbM10gIHwgLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHBhZGRpbmcKKyAgKzB4MzZCRiB8IDAzICAgICAgICAgICAgICAgICAgICAgIHwgdWludDhfdCAgICAgfCAweDAzICgzKSAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgdGFibGUgZmllbGQgYGJhc2VfdHlwZWAgKEJ5dGUpCisgICsweDM2QzAgfCAwMSAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgIHwgMHgwMDAwMDAwMSAoMSkgICAgICAgICAgICAgICAgICAgICB8IHRhYmxlIGZpZWxkIGBiYXNlX3NpemVgIChVSW50KQorICArMHgzNkM0IHwgMDEgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICB8IDB4MDAwMDAwMDEgKDEpICAgICAgICAgICAgICAgICAgICAgfCB0YWJsZSBmaWVsZCBgZWxlbWVudF9zaXplYCAoVUludCkKKworc3RyaW5nIChyZWZsZWN0aW9uLkZpZWxkLm5hbWUpOgorICArMHgzNkM4IHwgMDEgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICB8IDB4MDAwMDAwMDEgKDEpICAgICAgICAgICAgICAgICAgICAgfCBsZW5ndGggb2Ygc3RyaW5nCisgICsweDM2Q0MgfCA2MiAgICAgICAgICAgICAgICAgICAgICB8IGNoYXJbMV0gICAgIHwgYiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHN0cmluZyBsaXRlcmFsCisgICsweDM2Q0QgfCAwMCAgICAgICAgICAgICAgICAgICAgICB8IGNoYXIgICAgICAgIHwgMHgwMCAoMCkgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHN0cmluZyB0ZXJtaW5hdG9yCisKK3BhZGRpbmc6CisgICsweDM2Q0UgfCAwMCAwMCAgICAgICAgICAgICAgICAgICB8IHVpbnQ4X3RbMl0gIHwgLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHBhZGRpbmcKKwordGFibGUgKHJlZmxlY3Rpb24uRmllbGQpOgorICArMHgzNkQwIHwgNjIgRkQgRkYgRkYgICAgICAgICAgICAgfCBTT2Zmc2V0MzIgICB8IDB4RkZGRkZENjIgKC02NzApIExvYzogKzB4Mzk2RSAgICAgfCBvZmZzZXQgdG8gdnRhYmxlCisgICsweDM2RDQgfCAzMCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDAzMCAoNDgpIExvYzogKzB4MzcwNCAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgbmFtZWAgKHN0cmluZykKKyAgKzB4MzZEOCB8IDFDIDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMDFDICgyOCkgTG9jOiArMHgzNkY0ICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGB0eXBlYCAodGFibGUpCisgICsweDM2REMgfCAwNCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDAwNCAoNCkgTG9jOiArMHgzNkUwICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgZG9jdW1lbnRhdGlvbmAgKHZlY3RvcikKKwordmVjdG9yIChyZWZsZWN0aW9uLkZpZWxkLmRvY3VtZW50YXRpb24pOgorICArMHgzNkUwIHwgMDAgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICB8IDB4MDAwMDAwMDAgKDApICAgICAgICAgICAgICAgICAgICAgfCBsZW5ndGggb2YgdmVjdG9yICgjIGl0ZW1zKQorCit2dGFibGUgKHJlZmxlY3Rpb24uVHlwZSk6CisgICsweDM2RTQgfCAxMCAwMCAgICAgICAgICAgICAgICAgICB8IHVpbnQxNl90ICAgIHwgMHgwMDEwICgxNikgICAgICAgICAgICAgICAgICAgICAgICB8IHNpemUgb2YgdGhpcyB2dGFibGUKKyAgKzB4MzZFNiB8IDEwIDAwICAgICAgICAgICAgICAgICAgIHwgdWludDE2X3QgICAgfCAweDAwMTAgKDE2KSAgICAgICAgICAgICAgICAgICAgICAgIHwgc2l6ZSBvZiByZWZlcnJpbmcgdGFibGUKKyAgKzB4MzZFOCB8IDA3IDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgfCAweDAwMDcgKDcpICAgICAgICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBiYXNlX3R5cGVgIChpZDogMCkKKyAgKzB4MzZFQSB8IDAwIDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgfCAweDAwMDAgKDApICAgICAgICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBlbGVtZW50YCAoaWQ6IDEpIDxkZWZhdWx0cyB0byAwPiAoQnl0ZSkKKyAgKzB4MzZFQyB8IDAwIDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgfCAweDAwMDAgKDApICAgICAgICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBpbmRleGAgKGlkOiAyKSA8ZGVmYXVsdHMgdG8gLTE+IChJbnQpCisgICsweDM2RUUgfCAwMCAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgIHwgMHgwMDAwICgwKSAgICAgICAgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgZml4ZWRfbGVuZ3RoYCAoaWQ6IDMpIDxkZWZhdWx0cyB0byAwPiAoVVNob3J0KQorICArMHgzNkYwIHwgMDggMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgICB8IDB4MDAwOCAoOCkgICAgICAgICAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYGJhc2Vfc2l6ZWAgKGlkOiA0KQorICArMHgzNkYyIHwgMEMgMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgICB8IDB4MDAwQyAoMTIpICAgICAgICAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYGVsZW1lbnRfc2l6ZWAgKGlkOiA1KQorCit0YWJsZSAocmVmbGVjdGlvbi5UeXBlKToKKyAgKzB4MzZGNCB8IDEwIDAwIDAwIDAwICAgICAgICAgICAgIHwgU09mZnNldDMyICAgfCAweDAwMDAwMDEwICgxNikgTG9jOiArMHgzNkU0ICAgICAgIHwgb2Zmc2V0IHRvIHZ0YWJsZQorICArMHgzNkY4IHwgMDAgMDAgMDAgICAgICAgICAgICAgICAgfCB1aW50OF90WzNdICB8IC4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBwYWRkaW5nCisgICsweDM2RkIgfCAwNSAgICAgICAgICAgICAgICAgICAgICB8IHVpbnQ4X3QgICAgIHwgMHgwNSAoNSkgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHRhYmxlIGZpZWxkIGBiYXNlX3R5cGVgIChCeXRlKQorICArMHgzNkZDIHwgMDIgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICB8IDB4MDAwMDAwMDIgKDIpICAgICAgICAgICAgICAgICAgICAgfCB0YWJsZSBmaWVsZCBgYmFzZV9zaXplYCAoVUludCkKKyAgKzB4MzcwMCB8IDAxIDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgfCAweDAwMDAwMDAxICgxKSAgICAgICAgICAgICAgICAgICAgIHwgdGFibGUgZmllbGQgYGVsZW1lbnRfc2l6ZWAgKFVJbnQpCisKK3N0cmluZyAocmVmbGVjdGlvbi5GaWVsZC5uYW1lKToKKyAgKzB4MzcwNCB8IDAxIDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgfCAweDAwMDAwMDAxICgxKSAgICAgICAgICAgICAgICAgICAgIHwgbGVuZ3RoIG9mIHN0cmluZworICArMHgzNzA4IHwgNjEgICAgICAgICAgICAgICAgICAgICAgfCBjaGFyWzFdICAgICB8IGEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJpbmcgbGl0ZXJhbAorICArMHgzNzA5IHwgMDAgICAgICAgICAgICAgICAgICAgICAgfCBjaGFyICAgICAgICB8IDB4MDAgKDApICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJpbmcgdGVybWluYXRvcgorCitwYWRkaW5nOgorICArMHgzNzBBIHwgMDAgMDAgICAgICAgICAgICAgICAgICAgfCB1aW50OF90WzJdICB8IC4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBwYWRkaW5nCisKK3RhYmxlIChyZWZsZWN0aW9uLk9iamVjdCk6CisgICsweDM3MEMgfCBFNCBGRSBGRiBGRiAgICAgICAgICAgICB8IFNPZmZzZXQzMiAgIHwgMHhGRkZGRkVFNCAoLTI4NCkgTG9jOiArMHgzODI4ICAgICB8IG9mZnNldCB0byB2dGFibGUKKyAgKzB4MzcxMCB8IDFDIDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMDFDICgyOCkgTG9jOiArMHgzNzJDICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBuYW1lYCAoc3RyaW5nKQorICArMHgzNzE0IHwgMTQgMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDAwMTQgKDIwKSBMb2M6ICsweDM3MjggICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYGZpZWxkc2AgKHZlY3RvcikKKyAgKzB4MzcxOCB8IDAxIDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgfCAweDAwMDAwMDAxICgxKSAgICAgICAgICAgICAgICAgICAgIHwgdGFibGUgZmllbGQgYG1pbmFsaWduYCAoSW50KQorICArMHgzNzFDIHwgMDggMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDAwMDggKDgpIExvYzogKzB4MzcyNCAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYGRvY3VtZW50YXRpb25gICh2ZWN0b3IpCisgICsweDM3MjAgfCA0MCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDA0MCAoNjQpIExvYzogKzB4Mzc2MCAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgZGVjbGFyYXRpb25fZmlsZWAgKHN0cmluZykKKwordmVjdG9yIChyZWZsZWN0aW9uLk9iamVjdC5kb2N1bWVudGF0aW9uKToKKyAgKzB4MzcyNCB8IDAwIDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgfCAweDAwMDAwMDAwICgwKSAgICAgICAgICAgICAgICAgICAgIHwgbGVuZ3RoIG9mIHZlY3RvciAoIyBpdGVtcykKKwordmVjdG9yIChyZWZsZWN0aW9uLk9iamVjdC5maWVsZHMpOgorICArMHgzNzI4IHwgMDAgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICB8IDB4MDAwMDAwMDAgKDApICAgICAgICAgICAgICAgICAgICAgfCBsZW5ndGggb2YgdmVjdG9yICgjIGl0ZW1zKQorCitzdHJpbmcgKHJlZmxlY3Rpb24uT2JqZWN0Lm5hbWUpOgorICArMHgzNzJDIHwgMTcgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICB8IDB4MDAwMDAwMTcgKDIzKSAgICAgICAgICAgICAgICAgICAgfCBsZW5ndGggb2Ygc3RyaW5nCisgICsweDM3MzAgfCA0RCA3OSA0NyA2MSA2RCA2NSAyRSA0NSB8IGNoYXJbMjNdICAgIHwgTXlHYW1lLkUgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHN0cmluZyBsaXRlcmFsCisgICsweDM3MzggfCA3OCA2MSA2RCA3MCA2QyA2NSAzMiAyRSB8ICAgICAgICAgICAgIHwgeGFtcGxlMi4KKyAgKzB4Mzc0MCB8IDREIDZGIDZFIDczIDc0IDY1IDcyICAgIHwgICAgICAgICAgICAgfCBNb25zdGVyCisgICsweDM3NDcgfCAwMCAgICAgICAgICAgICAgICAgICAgICB8IGNoYXIgICAgICAgIHwgMHgwMCAoMCkgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHN0cmluZyB0ZXJtaW5hdG9yCisKK3RhYmxlIChyZWZsZWN0aW9uLk9iamVjdCk6CisgICsweDM3NDggfCAyMCBGRiBGRiBGRiAgICAgICAgICAgICB8IFNPZmZzZXQzMiAgIHwgMHhGRkZGRkYyMCAoLTIyNCkgTG9jOiArMHgzODI4ICAgICB8IG9mZnNldCB0byB2dGFibGUKKyAgKzB4Mzc0QyB8IDM0IDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMDM0ICg1MikgTG9jOiArMHgzNzgwICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBuYW1lYCAoc3RyaW5nKQorICArMHgzNzUwIHwgMkMgMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDAwMkMgKDQ0KSBMb2M6ICsweDM3N0MgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYGZpZWxkc2AgKHZlY3RvcikKKyAgKzB4Mzc1NCB8IDAxIDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgfCAweDAwMDAwMDAxICgxKSAgICAgICAgICAgICAgICAgICAgIHwgdGFibGUgZmllbGQgYG1pbmFsaWduYCAoSW50KQorICArMHgzNzU4IHwgMjAgMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDAwMjAgKDMyKSBMb2M6ICsweDM3NzggICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYGRvY3VtZW50YXRpb25gICh2ZWN0b3IpCisgICsweDM3NUMgfCAwNCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDAwNCAoNCkgTG9jOiArMHgzNzYwICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgZGVjbGFyYXRpb25fZmlsZWAgKHN0cmluZykKKworc3RyaW5nIChyZWZsZWN0aW9uLk9iamVjdC5kZWNsYXJhdGlvbl9maWxlKToKKyAgKzB4Mzc2MCB8IDEyIDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgfCAweDAwMDAwMDEyICgxOCkgICAgICAgICAgICAgICAgICAgIHwgbGVuZ3RoIG9mIHN0cmluZworICArMHgzNzY0IHwgMkYgMkYgNkQgNkYgNkUgNzMgNzQgNjUgfCBjaGFyWzE4XSAgICB8IC8vbW9uc3RlICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJpbmcgbGl0ZXJhbAorICArMHgzNzZDIHwgNzIgNUYgNzQgNjUgNzMgNzQgMkUgNjYgfCAgICAgICAgICAgICB8IHJfdGVzdC5mCisgICsweDM3NzQgfCA2MiA3MyAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgIHwgYnMKKyAgKzB4Mzc3NiB8IDAwICAgICAgICAgICAgICAgICAgICAgIHwgY2hhciAgICAgICAgfCAweDAwICgwKSAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nIHRlcm1pbmF0b3IKKwordmVjdG9yIChyZWZsZWN0aW9uLk9iamVjdC5kb2N1bWVudGF0aW9uKToKKyAgKzB4Mzc3OCB8IDAwIDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgfCAweDAwMDAwMDAwICgwKSAgICAgICAgICAgICAgICAgICAgIHwgbGVuZ3RoIG9mIHZlY3RvciAoIyBpdGVtcykKKwordmVjdG9yIChyZWZsZWN0aW9uLk9iamVjdC5maWVsZHMpOgorICArMHgzNzdDIHwgMDAgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICB8IDB4MDAwMDAwMDAgKDApICAgICAgICAgICAgICAgICAgICAgfCBsZW5ndGggb2YgdmVjdG9yICgjIGl0ZW1zKQorCitzdHJpbmcgKHJlZmxlY3Rpb24uT2JqZWN0Lm5hbWUpOgorICArMHgzNzgwIHwgMTggMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICB8IDB4MDAwMDAwMTggKDI0KSAgICAgICAgICAgICAgICAgICAgfCBsZW5ndGggb2Ygc3RyaW5nCisgICsweDM3ODQgfCA0RCA3OSA0NyA2MSA2RCA2NSAyRSA0OSB8IGNoYXJbMjRdICAgIHwgTXlHYW1lLkkgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHN0cmluZyBsaXRlcmFsCisgICsweDM3OEMgfCA2RSA1MCA2MSA3MiA2NSA2RSA3NCA0RSB8ICAgICAgICAgICAgIHwgblBhcmVudE4KKyAgKzB4Mzc5NCB8IDYxIDZEIDY1IDczIDcwIDYxIDYzIDY1IHwgICAgICAgICAgICAgfCBhbWVzcGFjZQorICArMHgzNzlDIHwgMDAgICAgICAgICAgICAgICAgICAgICAgfCBjaGFyICAgICAgICB8IDB4MDAgKDApICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJpbmcgdGVybWluYXRvcgorCitwYWRkaW5nOgorICArMHgzNzlEIHwgMDAgMDAgMDAgICAgICAgICAgICAgICAgfCB1aW50OF90WzNdICB8IC4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBwYWRkaW5nCisKK3RhYmxlIChyZWZsZWN0aW9uLk9iamVjdCk6CisgICsweDM3QTAgfCA3OCBGRiBGRiBGRiAgICAgICAgICAgICB8IFNPZmZzZXQzMiAgIHwgMHhGRkZGRkY3OCAoLTEzNikgTG9jOiArMHgzODI4ICAgICB8IG9mZnNldCB0byB2dGFibGUKKyAgKzB4MzdBNCB8IDQ4IDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMDQ4ICg3MikgTG9jOiArMHgzN0VDICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBuYW1lYCAoc3RyaW5nKQorICArMHgzN0E4IHwgM0MgMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDAwM0MgKDYwKSBMb2M6ICsweDM3RTQgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYGZpZWxkc2AgKHZlY3RvcikKKyAgKzB4MzdBQyB8IDAxIDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgfCAweDAwMDAwMDAxICgxKSAgICAgICAgICAgICAgICAgICAgIHwgdGFibGUgZmllbGQgYG1pbmFsaWduYCAoSW50KQorICArMHgzN0IwIHwgMzAgMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDAwMzAgKDQ4KSBMb2M6ICsweDM3RTAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYGRvY3VtZW50YXRpb25gICh2ZWN0b3IpCisgICsweDM3QjQgfCAwNCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDAwNCAoNCkgTG9jOiArMHgzN0I4ICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgZGVjbGFyYXRpb25fZmlsZWAgKHN0cmluZykKKworc3RyaW5nIChyZWZsZWN0aW9uLk9iamVjdC5kZWNsYXJhdGlvbl9maWxlKToKKyAgKzB4MzdCOCB8IDIwIDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgfCAweDAwMDAwMDIwICgzMikgICAgICAgICAgICAgICAgICAgIHwgbGVuZ3RoIG9mIHN0cmluZworICArMHgzN0JDIHwgMkYgMkYgNjkgNkUgNjMgNkMgNzUgNjQgfCBjaGFyWzMyXSAgICB8IC8vaW5jbHVkICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJpbmcgbGl0ZXJhbAorICArMHgzN0M0IHwgNjUgNUYgNzQgNjUgNzMgNzQgMkYgNjkgfCAgICAgICAgICAgICB8IGVfdGVzdC9pCisgICsweDM3Q0MgfCA2RSA2MyA2QyA3NSA2NCA2NSA1RiA3NCB8ICAgICAgICAgICAgIHwgbmNsdWRlX3QKKyAgKzB4MzdENCB8IDY1IDczIDc0IDMxIDJFIDY2IDYyIDczIHwgICAgICAgICAgICAgfCBlc3QxLmZicworICArMHgzN0RDIHwgMDAgICAgICAgICAgICAgICAgICAgICAgfCBjaGFyICAgICAgICB8IDB4MDAgKDApICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJpbmcgdGVybWluYXRvcgorCitwYWRkaW5nOgorICArMHgzN0REIHwgMDAgMDAgMDAgICAgICAgICAgICAgICAgfCB1aW50OF90WzNdICB8IC4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBwYWRkaW5nCisKK3ZlY3RvciAocmVmbGVjdGlvbi5PYmplY3QuZG9jdW1lbnRhdGlvbik6CisgICsweDM3RTAgfCAwMCAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgIHwgMHgwMDAwMDAwMCAoMCkgICAgICAgICAgICAgICAgICAgICB8IGxlbmd0aCBvZiB2ZWN0b3IgKCMgaXRlbXMpCisKK3ZlY3RvciAocmVmbGVjdGlvbi5PYmplY3QuZmllbGRzKToKKyAgKzB4MzdFNCB8IDAxIDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgfCAweDAwMDAwMDAxICgxKSAgICAgICAgICAgICAgICAgICAgIHwgbGVuZ3RoIG9mIHZlY3RvciAoIyBpdGVtcykKKyAgKzB4MzdFOCB8IDEwIDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMDEwICgxNikgTG9jOiArMHgzN0Y4ICAgICAgIHwgb2Zmc2V0IHRvIHRhYmxlWzBdCisKK3N0cmluZyAocmVmbGVjdGlvbi5PYmplY3QubmFtZSk6CisgICsweDM3RUMgfCAwNiAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgIHwgMHgwMDAwMDAwNiAoNikgICAgICAgICAgICAgICAgICAgICB8IGxlbmd0aCBvZiBzdHJpbmcKKyAgKzB4MzdGMCB8IDU0IDYxIDYyIDZDIDY1IDQxICAgICAgIHwgY2hhcls2XSAgICAgfCBUYWJsZUEgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nIGxpdGVyYWwKKyAgKzB4MzdGNiB8IDAwICAgICAgICAgICAgICAgICAgICAgIHwgY2hhciAgICAgICAgfCAweDAwICgwKSAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nIHRlcm1pbmF0b3IKKwordGFibGUgKHJlZmxlY3Rpb24uRmllbGQpOgorICArMHgzN0Y4IHwgNzQgRkYgRkYgRkYgICAgICAgICAgICAgfCBTT2Zmc2V0MzIgICB8IDB4RkZGRkZGNzQgKC0xNDApIExvYzogKzB4Mzg4NCAgICAgfCBvZmZzZXQgdG8gdnRhYmxlCisgICsweDM3RkMgfCAwMCAgICAgICAgICAgICAgICAgICAgICB8IHVpbnQ4X3RbMV0gIHwgLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHBhZGRpbmcKKyAgKzB4MzdGRCB8IDAxICAgICAgICAgICAgICAgICAgICAgIHwgdWludDhfdCAgICAgfCAweDAxICgxKSAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgdGFibGUgZmllbGQgYG9wdGlvbmFsYCAoQm9vbCkKKyAgKzB4MzdGRSB8IDA0IDAwICAgICAgICAgICAgICAgICAgIHwgdWludDE2X3QgICAgfCAweDAwMDQgKDQpICAgICAgICAgICAgICAgICAgICAgICAgIHwgdGFibGUgZmllbGQgYG9mZnNldGAgKFVTaG9ydCkKKyAgKzB4MzgwMCB8IDIwIDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMDIwICgzMikgTG9jOiArMHgzODIwICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBuYW1lYCAoc3RyaW5nKQorICArMHgzODA0IHwgMEMgMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDAwMEMgKDEyKSBMb2M6ICsweDM4MTAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYHR5cGVgICh0YWJsZSkKKyAgKzB4MzgwOCB8IDA0IDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMDA0ICg0KSBMb2M6ICsweDM4MEMgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBkb2N1bWVudGF0aW9uYCAodmVjdG9yKQorCit2ZWN0b3IgKHJlZmxlY3Rpb24uRmllbGQuZG9jdW1lbnRhdGlvbik6CisgICsweDM4MEMgfCAwMCAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgIHwgMHgwMDAwMDAwMCAoMCkgICAgICAgICAgICAgICAgICAgICB8IGxlbmd0aCBvZiB2ZWN0b3IgKCMgaXRlbXMpCisKK3RhYmxlIChyZWZsZWN0aW9uLlR5cGUpOgorICArMHgzODEwIHwgNTggRkYgRkYgRkYgICAgICAgICAgICAgfCBTT2Zmc2V0MzIgICB8IDB4RkZGRkZGNTggKC0xNjgpIExvYzogKzB4MzhCOCAgICAgfCBvZmZzZXQgdG8gdnRhYmxlCisgICsweDM4MTQgfCAwMCAwMCAwMCAgICAgICAgICAgICAgICB8IHVpbnQ4X3RbM10gIHwgLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHBhZGRpbmcKKyAgKzB4MzgxNyB8IDBGICAgICAgICAgICAgICAgICAgICAgIHwgdWludDhfdCAgICAgfCAweDBGICgxNSkgICAgICAgICAgICAgICAgICAgICAgICAgIHwgdGFibGUgZmllbGQgYGJhc2VfdHlwZWAgKEJ5dGUpCisgICsweDM4MTggfCAwQyAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgIHwgMHgwMDAwMDAwQyAoMTIpICAgICAgICAgICAgICAgICAgICB8IHRhYmxlIGZpZWxkIGBpbmRleGAgKEludCkKKyAgKzB4MzgxQyB8IDAxIDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgfCAweDAwMDAwMDAxICgxKSAgICAgICAgICAgICAgICAgICAgIHwgdGFibGUgZmllbGQgYGVsZW1lbnRfc2l6ZWAgKFVJbnQpCisKK3N0cmluZyAocmVmbGVjdGlvbi5GaWVsZC5uYW1lKToKKyAgKzB4MzgyMCB8IDAxIDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgfCAweDAwMDAwMDAxICgxKSAgICAgICAgICAgICAgICAgICAgIHwgbGVuZ3RoIG9mIHN0cmluZworICArMHgzODI0IHwgNjIgICAgICAgICAgICAgICAgICAgICAgfCBjaGFyWzFdICAgICB8IGIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJpbmcgbGl0ZXJhbAorICArMHgzODI1IHwgMDAgICAgICAgICAgICAgICAgICAgICAgfCBjaGFyICAgICAgICB8IDB4MDAgKDApICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJpbmcgdGVybWluYXRvcgorCitwYWRkaW5nOgorICArMHgzODI2IHwgMDAgMDAgICAgICAgICAgICAgICAgICAgfCB1aW50OF90WzJdICB8IC4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBwYWRkaW5nCisKK3Z0YWJsZSAocmVmbGVjdGlvbi5PYmplY3QpOgorICArMHgzODI4IHwgMTQgMDAgICAgICAgICAgICAgICAgICAgfCB1aW50MTZfdCAgICB8IDB4MDAxNCAoMjApICAgICAgICAgICAgICAgICAgICAgICAgfCBzaXplIG9mIHRoaXMgdnRhYmxlCisgICsweDM4MkEgfCAxOCAwMCAgICAgICAgICAgICAgICAgICB8IHVpbnQxNl90ICAgIHwgMHgwMDE4ICgyNCkgICAgICAgICAgICAgICAgICAgICAgICB8IHNpemUgb2YgcmVmZXJyaW5nIHRhYmxlCisgICsweDM4MkMgfCAwNCAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgIHwgMHgwMDA0ICg0KSAgICAgICAgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgbmFtZWAgKGlkOiAwKQorICArMHgzODJFIHwgMDggMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgICB8IDB4MDAwOCAoOCkgICAgICAgICAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYGZpZWxkc2AgKGlkOiAxKQorICArMHgzODMwIHwgMDAgMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgICB8IDB4MDAwMCAoMCkgICAgICAgICAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYGlzX3N0cnVjdGAgKGlkOiAyKSA8ZGVmYXVsdHMgdG8gMD4gKEJvb2wpCisgICsweDM4MzIgfCAwQyAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgIHwgMHgwMDBDICgxMikgICAgICAgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgbWluYWxpZ25gIChpZDogMykKKyAgKzB4MzgzNCB8IDAwIDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgfCAweDAwMDAgKDApICAgICAgICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBieXRlc2l6ZWAgKGlkOiA0KSA8ZGVmYXVsdHMgdG8gMD4gKEludCkKKyAgKzB4MzgzNiB8IDAwIDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgfCAweDAwMDAgKDApICAgICAgICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBhdHRyaWJ1dGVzYCAoaWQ6IDUpIDxudWxsPiAoVmVjdG9yKQorICArMHgzODM4IHwgMTAgMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgICB8IDB4MDAxMCAoMTYpICAgICAgICAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYGRvY3VtZW50YXRpb25gIChpZDogNikKKyAgKzB4MzgzQSB8IDE0IDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgfCAweDAwMTQgKDIwKSAgICAgICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBkZWNsYXJhdGlvbl9maWxlYCAoaWQ6IDcpCisKK3RhYmxlIChyZWZsZWN0aW9uLk9iamVjdCk6CisgICsweDM4M0MgfCAxNCAwMCAwMCAwMCAgICAgICAgICAgICB8IFNPZmZzZXQzMiAgIHwgMHgwMDAwMDAxNCAoMjApIExvYzogKzB4MzgyOCAgICAgICB8IG9mZnNldCB0byB2dGFibGUKKyAgKzB4Mzg0MCB8IDIwIDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMDIwICgzMikgTG9jOiArMHgzODYwICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBuYW1lYCAoc3RyaW5nKQorICArMHgzODQ0IHwgMTQgMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDAwMTQgKDIwKSBMb2M6ICsweDM4NTggICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYGZpZWxkc2AgKHZlY3RvcikKKyAgKzB4Mzg0OCB8IDAxIDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgfCAweDAwMDAwMDAxICgxKSAgICAgICAgICAgICAgICAgICAgIHwgdGFibGUgZmllbGQgYG1pbmFsaWduYCAoSW50KQorICArMHgzODRDIHwgMDggMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDAwMDggKDgpIExvYzogKzB4Mzg1NCAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYGRvY3VtZW50YXRpb25gICh2ZWN0b3IpCisgICsweDM4NTAgfCBDNCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDBDNCAoMTk2KSBMb2M6ICsweDM5MTQgICAgICB8IG9mZnNldCB0byBmaWVsZCBgZGVjbGFyYXRpb25fZmlsZWAgKHN0cmluZykKKwordmVjdG9yIChyZWZsZWN0aW9uLk9iamVjdC5kb2N1bWVudGF0aW9uKToKKyAgKzB4Mzg1NCB8IDAwIDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgfCAweDAwMDAwMDAwICgwKSAgICAgICAgICAgICAgICAgICAgIHwgbGVuZ3RoIG9mIHZlY3RvciAoIyBpdGVtcykKKwordmVjdG9yIChyZWZsZWN0aW9uLk9iamVjdC5maWVsZHMpOgorICArMHgzODU4IHwgMDEgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICB8IDB4MDAwMDAwMDEgKDEpICAgICAgICAgICAgICAgICAgICAgfCBsZW5ndGggb2YgdmVjdG9yICgjIGl0ZW1zKQorICArMHgzODVDIHwgNDQgMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDAwNDQgKDY4KSBMb2M6ICsweDM4QTAgICAgICAgfCBvZmZzZXQgdG8gdGFibGVbMF0KKworc3RyaW5nIChyZWZsZWN0aW9uLk9iamVjdC5uYW1lKToKKyAgKzB4Mzg2MCB8IDFDIDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgfCAweDAwMDAwMDFDICgyOCkgICAgICAgICAgICAgICAgICAgIHwgbGVuZ3RoIG9mIHN0cmluZworICArMHgzODY0IHwgNEQgNzkgNDcgNjEgNkQgNjUgMkUgNEYgfCBjaGFyWzI4XSAgICB8IE15R2FtZS5PICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJpbmcgbGl0ZXJhbAorICArMHgzODZDIHwgNzQgNjggNjUgNzIgNEUgNjEgNkQgNjUgfCAgICAgICAgICAgICB8IHRoZXJOYW1lCisgICsweDM4NzQgfCA1MyA3MCA2MSA2MyA2NSAyRSA1NCA2MSB8ICAgICAgICAgICAgIHwgU3BhY2UuVGEKKyAgKzB4Mzg3QyB8IDYyIDZDIDY1IDQyICAgICAgICAgICAgIHwgICAgICAgICAgICAgfCBibGVCCisgICsweDM4ODAgfCAwMCAgICAgICAgICAgICAgICAgICAgICB8IGNoYXIgICAgICAgIHwgMHgwMCAoMCkgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHN0cmluZyB0ZXJtaW5hdG9yCisKK3BhZGRpbmc6CisgICsweDM4ODEgfCAwMCAwMCAwMCAgICAgICAgICAgICAgICB8IHVpbnQ4X3RbM10gIHwgLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHBhZGRpbmcKKwordnRhYmxlIChyZWZsZWN0aW9uLkZpZWxkKToKKyAgKzB4Mzg4NCB8IDFDIDAwICAgICAgICAgICAgICAgICAgIHwgdWludDE2X3QgICAgfCAweDAwMUMgKDI4KSAgICAgICAgICAgICAgICAgICAgICAgIHwgc2l6ZSBvZiB0aGlzIHZ0YWJsZQorICArMHgzODg2IHwgMTQgMDAgICAgICAgICAgICAgICAgICAgfCB1aW50MTZfdCAgICB8IDB4MDAxNCAoMjApICAgICAgICAgICAgICAgICAgICAgICAgfCBzaXplIG9mIHJlZmVycmluZyB0YWJsZQorICArMHgzODg4IHwgMDggMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgICB8IDB4MDAwOCAoOCkgICAgICAgICAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYG5hbWVgIChpZDogMCkKKyAgKzB4Mzg4QSB8IDBDIDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgfCAweDAwMEMgKDEyKSAgICAgICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGB0eXBlYCAoaWQ6IDEpCisgICsweDM4OEMgfCAwMCAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgIHwgMHgwMDAwICgwKSAgICAgICAgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgaWRgIChpZDogMikgPGRlZmF1bHRzIHRvIDA+IChVU2hvcnQpCisgICsweDM4OEUgfCAwNiAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgIHwgMHgwMDA2ICg2KSAgICAgICAgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgb2Zmc2V0YCAoaWQ6IDMpCisgICsweDM4OTAgfCAwMCAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgIHwgMHgwMDAwICgwKSAgICAgICAgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgZGVmYXVsdF9pbnRlZ2VyYCAoaWQ6IDQpIDxkZWZhdWx0cyB0byAwPiAoTG9uZykKKyAgKzB4Mzg5MiB8IDAwIDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgfCAweDAwMDAgKDApICAgICAgICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBkZWZhdWx0X3JlYWxgIChpZDogNSkgPGRlZmF1bHRzIHRvIDAuMDAwMDAwPiAoRG91YmxlKQorICArMHgzODk0IHwgMDAgMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgICB8IDB4MDAwMCAoMCkgICAgICAgICAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYGRlcHJlY2F0ZWRgIChpZDogNikgPGRlZmF1bHRzIHRvIDA+IChCb29sKQorICArMHgzODk2IHwgMDAgMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgICB8IDB4MDAwMCAoMCkgICAgICAgICAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYHJlcXVpcmVkYCAoaWQ6IDcpIDxkZWZhdWx0cyB0byAwPiAoQm9vbCkKKyAgKzB4Mzg5OCB8IDAwIDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgfCAweDAwMDAgKDApICAgICAgICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBrZXlgIChpZDogOCkgPGRlZmF1bHRzIHRvIDA+IChCb29sKQorICArMHgzODlBIHwgMDAgMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgICB8IDB4MDAwMCAoMCkgICAgICAgICAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYGF0dHJpYnV0ZXNgIChpZDogOSkgPG51bGw+IChWZWN0b3IpCisgICsweDM4OUMgfCAxMCAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgIHwgMHgwMDEwICgxNikgICAgICAgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgZG9jdW1lbnRhdGlvbmAgKGlkOiAxMCkKKyAgKzB4Mzg5RSB8IDA1IDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgfCAweDAwMDUgKDUpICAgICAgICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBvcHRpb25hbGAgKGlkOiAxMSkKKwordGFibGUgKHJlZmxlY3Rpb24uRmllbGQpOgorICArMHgzOEEwIHwgMUMgMDAgMDAgMDAgICAgICAgICAgICAgfCBTT2Zmc2V0MzIgICB8IDB4MDAwMDAwMUMgKDI4KSBMb2M6ICsweDM4ODQgICAgICAgfCBvZmZzZXQgdG8gdnRhYmxlCisgICsweDM4QTQgfCAwMCAgICAgICAgICAgICAgICAgICAgICB8IHVpbnQ4X3RbMV0gIHwgLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHBhZGRpbmcKKyAgKzB4MzhBNSB8IDAxICAgICAgICAgICAgICAgICAgICAgIHwgdWludDhfdCAgICAgfCAweDAxICgxKSAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgdGFibGUgZmllbGQgYG9wdGlvbmFsYCAoQm9vbCkKKyAgKzB4MzhBNiB8IDA0IDAwICAgICAgICAgICAgICAgICAgIHwgdWludDE2X3QgICAgfCAweDAwMDQgKDQpICAgICAgICAgICAgICAgICAgICAgICAgIHwgdGFibGUgZmllbGQgYG9mZnNldGAgKFVTaG9ydCkKKyAgKzB4MzhBOCB8IDMwIDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMDMwICg0OCkgTG9jOiArMHgzOEQ4ICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBuYW1lYCAoc3RyaW5nKQorICArMHgzOEFDIHwgMUMgMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDAwMUMgKDI4KSBMb2M6ICsweDM4QzggICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYHR5cGVgICh0YWJsZSkKKyAgKzB4MzhCMCB8IDA0IDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMDA0ICg0KSBMb2M6ICsweDM4QjQgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBkb2N1bWVudGF0aW9uYCAodmVjdG9yKQorCit2ZWN0b3IgKHJlZmxlY3Rpb24uRmllbGQuZG9jdW1lbnRhdGlvbik6CisgICsweDM4QjQgfCAwMCAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgIHwgMHgwMDAwMDAwMCAoMCkgICAgICAgICAgICAgICAgICAgICB8IGxlbmd0aCBvZiB2ZWN0b3IgKCMgaXRlbXMpCisKK3Z0YWJsZSAocmVmbGVjdGlvbi5UeXBlKToKKyAgKzB4MzhCOCB8IDEwIDAwICAgICAgICAgICAgICAgICAgIHwgdWludDE2X3QgICAgfCAweDAwMTAgKDE2KSAgICAgICAgICAgICAgICAgICAgICAgIHwgc2l6ZSBvZiB0aGlzIHZ0YWJsZQorICArMHgzOEJBIHwgMTAgMDAgICAgICAgICAgICAgICAgICAgfCB1aW50MTZfdCAgICB8IDB4MDAxMCAoMTYpICAgICAgICAgICAgICAgICAgICAgICAgfCBzaXplIG9mIHJlZmVycmluZyB0YWJsZQorICArMHgzOEJDIHwgMDcgMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgICB8IDB4MDAwNyAoNykgICAgICAgICAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYGJhc2VfdHlwZWAgKGlkOiAwKQorICArMHgzOEJFIHwgMDAgMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgICB8IDB4MDAwMCAoMCkgICAgICAgICAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYGVsZW1lbnRgIChpZDogMSkgPGRlZmF1bHRzIHRvIDA+IChCeXRlKQorICArMHgzOEMwIHwgMDggMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgICB8IDB4MDAwOCAoOCkgICAgICAgICAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYGluZGV4YCAoaWQ6IDIpCisgICsweDM4QzIgfCAwMCAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgIHwgMHgwMDAwICgwKSAgICAgICAgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgZml4ZWRfbGVuZ3RoYCAoaWQ6IDMpIDxkZWZhdWx0cyB0byAwPiAoVVNob3J0KQorICArMHgzOEM0IHwgMDAgMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgICB8IDB4MDAwMCAoMCkgICAgICAgICAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYGJhc2Vfc2l6ZWAgKGlkOiA0KSA8ZGVmYXVsdHMgdG8gND4gKFVJbnQpCisgICsweDM4QzYgfCAwQyAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgIHwgMHgwMDBDICgxMikgICAgICAgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgZWxlbWVudF9zaXplYCAoaWQ6IDUpCisKK3RhYmxlIChyZWZsZWN0aW9uLlR5cGUpOgorICArMHgzOEM4IHwgMTAgMDAgMDAgMDAgICAgICAgICAgICAgfCBTT2Zmc2V0MzIgICB8IDB4MDAwMDAwMTAgKDE2KSBMb2M6ICsweDM4QjggICAgICAgfCBvZmZzZXQgdG8gdnRhYmxlCisgICsweDM4Q0MgfCAwMCAwMCAwMCAgICAgICAgICAgICAgICB8IHVpbnQ4X3RbM10gIHwgLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHBhZGRpbmcKKyAgKzB4MzhDRiB8IDBGICAgICAgICAgICAgICAgICAgICAgIHwgdWludDhfdCAgICAgfCAweDBGICgxNSkgICAgICAgICAgICAgICAgICAgICAgICAgIHwgdGFibGUgZmllbGQgYGJhc2VfdHlwZWAgKEJ5dGUpCisgICsweDM4RDAgfCAwRSAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgIHwgMHgwMDAwMDAwRSAoMTQpICAgICAgICAgICAgICAgICAgICB8IHRhYmxlIGZpZWxkIGBpbmRleGAgKEludCkKKyAgKzB4MzhENCB8IDAxIDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgfCAweDAwMDAwMDAxICgxKSAgICAgICAgICAgICAgICAgICAgIHwgdGFibGUgZmllbGQgYGVsZW1lbnRfc2l6ZWAgKFVJbnQpCisKK3N0cmluZyAocmVmbGVjdGlvbi5GaWVsZC5uYW1lKToKKyAgKzB4MzhEOCB8IDAxIDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgfCAweDAwMDAwMDAxICgxKSAgICAgICAgICAgICAgICAgICAgIHwgbGVuZ3RoIG9mIHN0cmluZworICArMHgzOERDIHwgNjEgICAgICAgICAgICAgICAgICAgICAgfCBjaGFyWzFdICAgICB8IGEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJpbmcgbGl0ZXJhbAorICArMHgzOEREIHwgMDAgICAgICAgICAgICAgICAgICAgICAgfCBjaGFyICAgICAgICB8IDB4MDAgKDApICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJpbmcgdGVybWluYXRvcgorCitwYWRkaW5nOgorICArMHgzOERFIHwgMDAgMDAgICAgICAgICAgICAgICAgICAgfCB1aW50OF90WzJdICB8IC4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBwYWRkaW5nCisKK3Z0YWJsZSAocmVmbGVjdGlvbi5PYmplY3QpOgorICArMHgzOEUwIHwgMTQgMDAgICAgICAgICAgICAgICAgICAgfCB1aW50MTZfdCAgICB8IDB4MDAxNCAoMjApICAgICAgICAgICAgICAgICAgICAgICAgfCBzaXplIG9mIHRoaXMgdnRhYmxlCisgICsweDM4RTIgfCAyMCAwMCAgICAgICAgICAgICAgICAgICB8IHVpbnQxNl90ICAgIHwgMHgwMDIwICgzMikgICAgICAgICAgICAgICAgICAgICAgICB8IHNpemUgb2YgcmVmZXJyaW5nIHRhYmxlCisgICsweDM4RTQgfCAwOCAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgIHwgMHgwMDA4ICg4KSAgICAgICAgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgbmFtZWAgKGlkOiAwKQorICArMHgzOEU2IHwgMEMgMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgICB8IDB4MDAwQyAoMTIpICAgICAgICAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYGZpZWxkc2AgKGlkOiAxKQorICArMHgzOEU4IHwgMDcgMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgICB8IDB4MDAwNyAoNykgICAgICAgICAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYGlzX3N0cnVjdGAgKGlkOiAyKQorICArMHgzOEVBIHwgMTAgMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgICB8IDB4MDAxMCAoMTYpICAgICAgICAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYG1pbmFsaWduYCAoaWQ6IDMpCisgICsweDM4RUMgfCAxNCAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgIHwgMHgwMDE0ICgyMCkgICAgICAgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgYnl0ZXNpemVgIChpZDogNCkKKyAgKzB4MzhFRSB8IDAwIDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgfCAweDAwMDAgKDApICAgICAgICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBhdHRyaWJ1dGVzYCAoaWQ6IDUpIDxudWxsPiAoVmVjdG9yKQorICArMHgzOEYwIHwgMTggMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgICB8IDB4MDAxOCAoMjQpICAgICAgICAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYGRvY3VtZW50YXRpb25gIChpZDogNikKKyAgKzB4MzhGMiB8IDFDIDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgfCAweDAwMUMgKDI4KSAgICAgICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBkZWNsYXJhdGlvbl9maWxlYCAoaWQ6IDcpCisKK3RhYmxlIChyZWZsZWN0aW9uLk9iamVjdCk6CisgICsweDM4RjQgfCAxNCAwMCAwMCAwMCAgICAgICAgICAgICB8IFNPZmZzZXQzMiAgIHwgMHgwMDAwMDAxNCAoMjApIExvYzogKzB4MzhFMCAgICAgICB8IG9mZnNldCB0byB2dGFibGUKKyAgKzB4MzhGOCB8IDAwIDAwIDAwICAgICAgICAgICAgICAgIHwgdWludDhfdFszXSAgfCAuLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgcGFkZGluZworICArMHgzOEZCIHwgMDEgICAgICAgICAgICAgICAgICAgICAgfCB1aW50OF90ICAgICB8IDB4MDEgKDEpICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB0YWJsZSBmaWVsZCBgaXNfc3RydWN0YCAoQm9vbCkKKyAgKzB4MzhGQyB8IDUwIDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMDUwICg4MCkgTG9jOiArMHgzOTRDICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBuYW1lYCAoc3RyaW5nKQorICArMHgzOTAwIHwgNDQgMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgICB8IDB4MDAwMDAwNDQgKDY4KSBMb2M6ICsweDM5NDQgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYGZpZWxkc2AgKHZlY3RvcikKKyAgKzB4MzkwNCB8IDA0IDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgfCAweDAwMDAwMDA0ICg0KSAgICAgICAgICAgICAgICAgICAgIHwgdGFibGUgZmllbGQgYG1pbmFsaWduYCAoSW50KQorICArMHgzOTA4IHwgMDQgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICB8IDB4MDAwMDAwMDQgKDQpICAgICAgICAgICAgICAgICAgICAgfCB0YWJsZSBmaWVsZCBgYnl0ZXNpemVgIChJbnQpCisgICsweDM5MEMgfCAzNCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDAzNCAoNTIpIExvYzogKzB4Mzk0MCAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgZG9jdW1lbnRhdGlvbmAgKHZlY3RvcikKKyAgKzB4MzkxMCB8IDA0IDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMDA0ICg0KSBMb2M6ICsweDM5MTQgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBkZWNsYXJhdGlvbl9maWxlYCAoc3RyaW5nKQorCitzdHJpbmcgKHJlZmxlY3Rpb24uT2JqZWN0LmRlY2xhcmF0aW9uX2ZpbGUpOgorICArMHgzOTE0IHwgMjQgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICB8IDB4MDAwMDAwMjQgKDM2KSAgICAgICAgICAgICAgICAgICAgfCBsZW5ndGggb2Ygc3RyaW5nCisgICsweDM5MTggfCAyRiAyRiA2OSA2RSA2MyA2QyA3NSA2NCB8IGNoYXJbMzZdICAgIHwgLy9pbmNsdWQgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHN0cmluZyBsaXRlcmFsCisgICsweDM5MjAgfCA2NSA1RiA3NCA2NSA3MyA3NCAyRiA3MyB8ICAgICAgICAgICAgIHwgZV90ZXN0L3MKKyAgKzB4MzkyOCB8IDc1IDYyIDJGIDY5IDZFIDYzIDZDIDc1IHwgICAgICAgICAgICAgfCB1Yi9pbmNsdQorICArMHgzOTMwIHwgNjQgNjUgNUYgNzQgNjUgNzMgNzQgMzIgfCAgICAgICAgICAgICB8IGRlX3Rlc3QyCisgICsweDM5MzggfCAyRSA2NiA2MiA3MyAgICAgICAgICAgICB8ICAgICAgICAgICAgIHwgLmZicworICArMHgzOTNDIHwgMDAgICAgICAgICAgICAgICAgICAgICAgfCBjaGFyICAgICAgICB8IDB4MDAgKDApICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJpbmcgdGVybWluYXRvcgorCitwYWRkaW5nOgorICArMHgzOTNEIHwgMDAgMDAgMDAgICAgICAgICAgICAgICAgfCB1aW50OF90WzNdICB8IC4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBwYWRkaW5nCisKK3ZlY3RvciAocmVmbGVjdGlvbi5PYmplY3QuZG9jdW1lbnRhdGlvbik6CisgICsweDM5NDAgfCAwMCAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgIHwgMHgwMDAwMDAwMCAoMCkgICAgICAgICAgICAgICAgICAgICB8IGxlbmd0aCBvZiB2ZWN0b3IgKCMgaXRlbXMpCisKK3ZlY3RvciAocmVmbGVjdGlvbi5PYmplY3QuZmllbGRzKToKKyAgKzB4Mzk0NCB8IDAxIDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICAgfCAweDAwMDAwMDAxICgxKSAgICAgICAgICAgICAgICAgICAgIHwgbGVuZ3RoIG9mIHZlY3RvciAoIyBpdGVtcykKKyAgKzB4Mzk0OCB8IDQwIDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMDQwICg2NCkgTG9jOiArMHgzOTg4ICAgICAgIHwgb2Zmc2V0IHRvIHRhYmxlWzBdCisKK3N0cmluZyAocmVmbGVjdGlvbi5PYmplY3QubmFtZSk6CisgICsweDM5NEMgfCAxQyAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgIHwgMHgwMDAwMDAxQyAoMjgpICAgICAgICAgICAgICAgICAgICB8IGxlbmd0aCBvZiBzdHJpbmcKKyAgKzB4Mzk1MCB8IDREIDc5IDQ3IDYxIDZEIDY1IDJFIDRGIHwgY2hhclsyOF0gICAgfCBNeUdhbWUuTyAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nIGxpdGVyYWwKKyAgKzB4Mzk1OCB8IDc0IDY4IDY1IDcyIDRFIDYxIDZEIDY1IHwgICAgICAgICAgICAgfCB0aGVyTmFtZQorICArMHgzOTYwIHwgNTMgNzAgNjEgNjMgNjUgMkUgNTUgNkUgfCAgICAgICAgICAgICB8IFNwYWNlLlVuCisgICsweDM5NjggfCA3NSA3MyA2NSA2NCAgICAgICAgICAgICB8ICAgICAgICAgICAgIHwgdXNlZAorICArMHgzOTZDIHwgMDAgICAgICAgICAgICAgICAgICAgICAgfCBjaGFyICAgICAgICB8IDB4MDAgKDApICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJpbmcgdGVybWluYXRvcgorCit2dGFibGUgKHJlZmxlY3Rpb24uRmllbGQpOgorICArMHgzOTZFIHwgMUEgMDAgICAgICAgICAgICAgICAgICAgfCB1aW50MTZfdCAgICB8IDB4MDAxQSAoMjYpICAgICAgICAgICAgICAgICAgICAgICAgfCBzaXplIG9mIHRoaXMgdnRhYmxlCisgICsweDM5NzAgfCAxMCAwMCAgICAgICAgICAgICAgICAgICB8IHVpbnQxNl90ICAgIHwgMHgwMDEwICgxNikgICAgICAgICAgICAgICAgICAgICAgICB8IHNpemUgb2YgcmVmZXJyaW5nIHRhYmxlCisgICsweDM5NzIgfCAwNCAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgIHwgMHgwMDA0ICg0KSAgICAgICAgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgbmFtZWAgKGlkOiAwKQorICArMHgzOTc0IHwgMDggMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgICB8IDB4MDAwOCAoOCkgICAgICAgICAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYHR5cGVgIChpZDogMSkKKyAgKzB4Mzk3NiB8IDAwIDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgfCAweDAwMDAgKDApICAgICAgICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBpZGAgKGlkOiAyKSA8ZGVmYXVsdHMgdG8gMD4gKFVTaG9ydCkKKyAgKzB4Mzk3OCB8IDAwIDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgfCAweDAwMDAgKDApICAgICAgICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBvZmZzZXRgIChpZDogMykgPGRlZmF1bHRzIHRvIDA+IChVU2hvcnQpCisgICsweDM5N0EgfCAwMCAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgIHwgMHgwMDAwICgwKSAgICAgICAgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgZGVmYXVsdF9pbnRlZ2VyYCAoaWQ6IDQpIDxkZWZhdWx0cyB0byAwPiAoTG9uZykKKyAgKzB4Mzk3QyB8IDAwIDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgfCAweDAwMDAgKDApICAgICAgICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBkZWZhdWx0X3JlYWxgIChpZDogNSkgPGRlZmF1bHRzIHRvIDAuMDAwMDAwPiAoRG91YmxlKQorICArMHgzOTdFIHwgMDAgMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgICB8IDB4MDAwMCAoMCkgICAgICAgICAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYGRlcHJlY2F0ZWRgIChpZDogNikgPGRlZmF1bHRzIHRvIDA+IChCb29sKQorICArMHgzOTgwIHwgMDAgMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgICB8IDB4MDAwMCAoMCkgICAgICAgICAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYHJlcXVpcmVkYCAoaWQ6IDcpIDxkZWZhdWx0cyB0byAwPiAoQm9vbCkKKyAgKzB4Mzk4MiB8IDAwIDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgfCAweDAwMDAgKDApICAgICAgICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBrZXlgIChpZDogOCkgPGRlZmF1bHRzIHRvIDA+IChCb29sKQorICArMHgzOTg0IHwgMDAgMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgICB8IDB4MDAwMCAoMCkgICAgICAgICAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYGF0dHJpYnV0ZXNgIChpZDogOSkgPG51bGw+IChWZWN0b3IpCisgICsweDM5ODYgfCAwQyAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgIHwgMHgwMDBDICgxMikgICAgICAgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgZG9jdW1lbnRhdGlvbmAgKGlkOiAxMCkKKwordGFibGUgKHJlZmxlY3Rpb24uRmllbGQpOgorICArMHgzOTg4IHwgMUEgMDAgMDAgMDAgICAgICAgICAgICAgfCBTT2Zmc2V0MzIgICB8IDB4MDAwMDAwMUEgKDI2KSBMb2M6ICsweDM5NkUgICAgICAgfCBvZmZzZXQgdG8gdnRhYmxlCisgICsweDM5OEMgfCAyQyAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDAyQyAoNDQpIExvYzogKzB4MzlCOCAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgbmFtZWAgKHN0cmluZykKKyAgKzB4Mzk5MCB8IDFDIDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICAgfCAweDAwMDAwMDFDICgyOCkgTG9jOiArMHgzOUFDICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGB0eXBlYCAodGFibGUpCisgICsweDM5OTQgfCAwNCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgIHwgMHgwMDAwMDAwNCAoNCkgTG9jOiArMHgzOTk4ICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgZG9jdW1lbnRhdGlvbmAgKHZlY3RvcikKKwordmVjdG9yIChyZWZsZWN0aW9uLkZpZWxkLmRvY3VtZW50YXRpb24pOgorICArMHgzOTk4IHwgMDAgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgICB8IDB4MDAwMDAwMDAgKDApICAgICAgICAgICAgICAgICAgICAgfCBsZW5ndGggb2YgdmVjdG9yICgjIGl0ZW1zKQorCit2dGFibGUgKHJlZmxlY3Rpb24uVHlwZSk6CisgICsweDM5OUMgfCAxMCAwMCAgICAgICAgICAgICAgICAgICB8IHVpbnQxNl90ICAgIHwgMHgwMDEwICgxNikgICAgICAgICAgICAgICAgICAgICAgICB8IHNpemUgb2YgdGhpcyB2dGFibGUKKyAgKzB4Mzk5RSB8IDBDIDAwICAgICAgICAgICAgICAgICAgIHwgdWludDE2X3QgICAgfCAweDAwMEMgKDEyKSAgICAgICAgICAgICAgICAgICAgICAgIHwgc2l6ZSBvZiByZWZlcnJpbmcgdGFibGUKKyAgKzB4MzlBMCB8IDA3IDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgfCAweDAwMDcgKDcpICAgICAgICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBiYXNlX3R5cGVgIChpZDogMCkKKyAgKzB4MzlBMiB8IDAwIDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgfCAweDAwMDAgKDApICAgICAgICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBlbGVtZW50YCAoaWQ6IDEpIDxkZWZhdWx0cyB0byAwPiAoQnl0ZSkKKyAgKzB4MzlBNCB8IDAwIDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICAgfCAweDAwMDAgKDApICAgICAgICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBpbmRleGAgKGlkOiAyKSA8ZGVmYXVsdHMgdG8gLTE+IChJbnQpCisgICsweDM5QTYgfCAwMCAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgIHwgMHgwMDAwICgwKSAgICAgICAgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgZml4ZWRfbGVuZ3RoYCAoaWQ6IDMpIDxkZWZhdWx0cyB0byAwPiAoVVNob3J0KQorICArMHgzOUE4IHwgMDAgMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgICB8IDB4MDAwMCAoMCkgICAgICAgICAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYGJhc2Vfc2l6ZWAgKGlkOiA0KSA8ZGVmYXVsdHMgdG8gND4gKFVJbnQpCisgICsweDM5QUEgfCAwOCAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgIHwgMHgwMDA4ICg4KSAgICAgICAgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgZWxlbWVudF9zaXplYCAoaWQ6IDUpCisKK3RhYmxlIChyZWZsZWN0aW9uLlR5cGUpOgorICArMHgzOUFDIHwgMTAgMDAgMDAgMDAgICAgICAgICAgICAgfCBTT2Zmc2V0MzIgICB8IDB4MDAwMDAwMTAgKDE2KSBMb2M6ICsweDM5OUMgICAgICAgfCBvZmZzZXQgdG8gdnRhYmxlCisgICsweDM5QjAgfCAwMCAwMCAwMCAgICAgICAgICAgICAgICB8IHVpbnQ4X3RbM10gIHwgLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHBhZGRpbmcKKyAgKzB4MzlCMyB8IDA3ICAgICAgICAgICAgICAgICAgICAgIHwgdWludDhfdCAgICAgfCAweDA3ICg3KSAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgdGFibGUgZmllbGQgYGJhc2VfdHlwZWAgKEJ5dGUpCisgICsweDM5QjQgfCAwMSAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgIHwgMHgwMDAwMDAwMSAoMSkgICAgICAgICAgICAgICAgICAgICB8IHRhYmxlIGZpZWxkIGBlbGVtZW50X3NpemVgIChVSW50KQorCitzdHJpbmcgKHJlZmxlY3Rpb24uRmllbGQubmFtZSk6CisgICsweDM5QjggfCAwMSAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgIHwgMHgwMDAwMDAwMSAoMSkgICAgICAgICAgICAgICAgICAgICB8IGxlbmd0aCBvZiBzdHJpbmcKKyAgKzB4MzlCQyB8IDYxICAgICAgICAgICAgICAgICAgICAgIHwgY2hhclsxXSAgICAgfCBhICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nIGxpdGVyYWwKKyAgKzB4MzlCRCB8IDAwICAgICAgICAgICAgICAgICAgICAgIHwgY2hhciAgICAgICAgfCAweDAwICgwKSAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nIHRlcm1pbmF0b3IKKworcGFkZGluZzoKKyAgKzB4MzlCRSB8IDAwIDAwICAgICAgICAgICAgICAgICAgIHwgdWludDhfdFsyXSAgfCAuLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgcGFkZGluZwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvbW9uc3Rlcl90ZXN0LmJmYnMgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9tb25zdGVyX3Rlc3QuYmZicwppbmRleCAwZWIxMzBhLi5kMzg5YWFiIDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9tb25zdGVyX3Rlc3QuYmZicworKysgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9tb25zdGVyX3Rlc3QuYmZicwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9tb25zdGVyX3Rlc3QuY3BwIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvbW9uc3Rlcl90ZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZmM5ZTE0Ci0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvbW9uc3Rlcl90ZXN0LmNwcApAQCAtMCwwICsxLDg0NSBAQAorI2luY2x1ZGUgIm1vbnN0ZXJfdGVzdC5oIgorCisjaW5jbHVkZSA8dmVjdG9yPgorCisjaW5jbHVkZSAiZmxhdGJ1ZmZlcnMvZmxhdGJ1ZmZlcl9idWlsZGVyLmgiCisjaW5jbHVkZSAiZmxhdGJ1ZmZlcnMvaWRsLmgiCisjaW5jbHVkZSAiZmxhdGJ1ZmZlcnMvcmVnaXN0cnkuaCIKKyNpbmNsdWRlICJmbGF0YnVmZmVycy92ZXJpZmllci5oIgorI2luY2x1ZGUgImlzX3F1aWV0X25hbi5oIgorI2luY2x1ZGUgIm1vbnN0ZXJfZXh0cmFfZ2VuZXJhdGVkLmgiCisjaW5jbHVkZSAibW9uc3Rlcl90ZXN0X2dlbmVyYXRlZC5oIgorI2luY2x1ZGUgInRlc3RfYXNzZXJ0LmgiCisKK25hbWVzcGFjZSBmbGF0YnVmZmVycyB7CituYW1lc3BhY2UgdGVzdHMgeworCisvLyBTaG9ydGN1dHMgZm9yIHRoZSBpbmZpbml0eS4KK3N0YXRpYyBjb25zdCBhdXRvIGluZmluaXR5X2YgPSBzdGQ6Om51bWVyaWNfbGltaXRzPGZsb2F0Pjo6aW5maW5pdHkoKTsKK3N0YXRpYyBjb25zdCBhdXRvIGluZmluaXR5X2QgPSBzdGQ6Om51bWVyaWNfbGltaXRzPGRvdWJsZT46OmluZmluaXR5KCk7CisKK3VzaW5nIG5hbWVzcGFjZSBNeUdhbWU6OkV4YW1wbGU7CisKKy8vIGV4YW1wbGUgb2YgaG93IHRvIGJ1aWxkIHVwIGEgc2VyaWFsaXplZCBidWZmZXIgYWxnb3JpdGhtaWNhbGx5OgorZmxhdGJ1ZmZlcnM6OkRldGFjaGVkQnVmZmVyIENyZWF0ZUZsYXRCdWZmZXJUZXN0KHN0ZDo6c3RyaW5nICZidWZmZXIpIHsKKyAgZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyIGJ1aWxkZXI7CisKKyAgYXV0byB2ZWMgPSBWZWMzKDEsIDIsIDMsIDAsIENvbG9yX1JlZCwgVGVzdCgxMCwgMjApKTsKKworICBhdXRvIG5hbWUgPSBidWlsZGVyLkNyZWF0ZVN0cmluZygiTXlNb25zdGVyIik7CisKKyAgLy8gVXNlIHRoZSBpbml0aWFsaXplcl9saXN0IHNwZWNpYWxpemF0aW9uIG9mIENyZWF0ZVZlY3Rvci4KKyAgYXV0byBpbnZlbnRvcnkgPQorICAgICAgYnVpbGRlci5DcmVhdGVWZWN0b3I8dWludDhfdD4oeyAwLCAxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5IH0pOworCisgIC8vIEFsdGVybmF0aXZlbHksIGNyZWF0ZSB0aGUgdmVjdG9yIGZpcnN0LCBhbmQgZmlsbCBpbiBkYXRhIGxhdGVyOgorICAvLyB1bnNpZ25lZCBjaGFyICppbnZfYnVmID0gbnVsbHB0cjsKKyAgLy8gYXV0byBpbnZlbnRvcnkgPSBidWlsZGVyLkNyZWF0ZVVuaW5pdGlhbGl6ZWRWZWN0b3I8dW5zaWduZWQgY2hhcj4oCisgIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMCwgJmludl9idWYpOworICAvLyBtZW1jcHkoaW52X2J1ZiwgaW52X2RhdGEsIDEwKTsKKworICBUZXN0IHRlc3RzW10gPSB7IFRlc3QoMTAsIDIwKSwgVGVzdCgzMCwgNDApIH07CisgIGF1dG8gdGVzdHYgPSBidWlsZGVyLkNyZWF0ZVZlY3Rvck9mU3RydWN0cyh0ZXN0cywgMik7CisKKyAgLy8gQ3JlYXRlIGEgdmVjdG9yIG9mIHN0cnVjdHVyZXMgZnJvbSBhIGxhbWJkYS4KKyAgYXV0byB0ZXN0djIgPSBidWlsZGVyLkNyZWF0ZVZlY3Rvck9mU3RydWN0czxUZXN0PigKKyAgICAgIDIsIFsmXShzaXplX3QgaSwgVGVzdCAqcykgLT4gdm9pZCB7ICpzID0gdGVzdHNbaV07IH0pOworCisgIC8vIGNyZWF0ZSBtb25zdGVyIHdpdGggdmVyeSBmZXcgZmllbGRzIHNldDoKKyAgLy8gKHNhbWUgZnVuY3Rpb25hbGl0eSBhcyBDcmVhdGVNb25zdGVyIGJlbG93LCBidXQgc2V0cyBmaWVsZHMgbWFudWFsbHkpCisgIGZsYXRidWZmZXJzOjpPZmZzZXQ8TW9uc3Rlcj4gbWxvY3NbM107CisgIGF1dG8gZnJlZCA9IGJ1aWxkZXIuQ3JlYXRlU3RyaW5nKCJGcmVkIik7CisgIGF1dG8gYmFybmV5ID0gYnVpbGRlci5DcmVhdGVTdHJpbmcoIkJhcm5leSIpOworICBhdXRvIHdpbG1hID0gYnVpbGRlci5DcmVhdGVTdHJpbmcoIldpbG1hIik7CisgIE1vbnN0ZXJCdWlsZGVyIG1iMShidWlsZGVyKTsKKyAgbWIxLmFkZF9uYW1lKGZyZWQpOworICBtbG9jc1swXSA9IG1iMS5GaW5pc2goKTsKKyAgTW9uc3RlckJ1aWxkZXIgbWIyKGJ1aWxkZXIpOworICBtYjIuYWRkX25hbWUoYmFybmV5KTsKKyAgbWIyLmFkZF9ocCgxMDAwKTsKKyAgbWxvY3NbMV0gPSBtYjIuRmluaXNoKCk7CisgIE1vbnN0ZXJCdWlsZGVyIG1iMyhidWlsZGVyKTsKKyAgbWIzLmFkZF9uYW1lKHdpbG1hKTsKKyAgbWxvY3NbMl0gPSBtYjMuRmluaXNoKCk7CisKKyAgLy8gQ3JlYXRlIGFuIGFycmF5IG9mIHN0cmluZ3MuIEFsc28gdGVzdCBzdHJpbmcgcG9vbGluZywgYW5kIGxhbWJkYXMuCisgIGF1dG8gdmVjb2ZzdHJpbmdzID0KKyAgICAgIGJ1aWxkZXIuQ3JlYXRlVmVjdG9yPGZsYXRidWZmZXJzOjpPZmZzZXQ8ZmxhdGJ1ZmZlcnM6OlN0cmluZz4+KAorICAgICAgICAgIDQsCisgICAgICAgICAgW10oc2l6ZV90IGksIGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAqYikKKyAgICAgICAgICAgICAgLT4gZmxhdGJ1ZmZlcnM6Ok9mZnNldDxmbGF0YnVmZmVyczo6U3RyaW5nPiB7CisgICAgICAgICAgICBzdGF0aWMgY29uc3QgY2hhciAqbmFtZXNbXSA9IHsgImJvYiIsICJmcmVkIiwgImJvYiIsICJmcmVkIiB9OworICAgICAgICAgICAgcmV0dXJuIGItPkNyZWF0ZVNoYXJlZFN0cmluZyhuYW1lc1tpXSk7CisgICAgICAgICAgfSwKKyAgICAgICAgICAmYnVpbGRlcik7CisKKyAgLy8gQ3JlYXRpbmcgdmVjdG9ycyBvZiBzdHJpbmdzIGluIG9uZSBjb252ZW5pZW50IGNhbGwuCisgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBuYW1lczI7CisgIG5hbWVzMi5wdXNoX2JhY2soImphbmUiKTsKKyAgbmFtZXMyLnB1c2hfYmFjaygibWFyeSIpOworICBhdXRvIHZlY29mc3RyaW5nczIgPSBidWlsZGVyLkNyZWF0ZVZlY3Rvck9mU3RyaW5ncyhuYW1lczIpOworCisgIC8vIENyZWF0aW5nIHZlY3RvcnMgZnJvbSB0eXBlcyB0aGF0IGFyZSBkaWZmZXJlbnQgZnJvbSBzdGQ6OnN0cmluZworICBzdGQ6OnZlY3Rvcjxjb25zdCBjaGFyICo+IG5hbWVzMzsKKyAgbmFtZXMzLnB1c2hfYmFjaygiZm9vIik7CisgIG5hbWVzMy5wdXNoX2JhY2soImJhciIpOworICBidWlsZGVyLkNyZWF0ZVZlY3Rvck9mU3RyaW5ncyhuYW1lczMpOyAgLy8gQWxzbyBhbiBhY2NlcHRlZCB0eXBlCisKKyNpZmRlZiBGTEFUQlVGRkVSU19IQVNfU1RSSU5HX1ZJRVcKKyAgc3RkOjp2ZWN0b3I8ZmxhdGJ1ZmZlcnM6OnN0cmluZ192aWV3PiBuYW1lczQ7CisgIG5hbWVzMy5wdXNoX2JhY2soImJheiIpOworICBuYW1lczMucHVzaF9iYWNrKCJxdXV4Iik7CisgIGJ1aWxkZXIuQ3JlYXRlVmVjdG9yT2ZTdHJpbmdzKG5hbWVzNCk7ICAvLyBBbHNvIGFuIGFjY2VwdGVkIHR5cGUKKyNlbmRpZgorCisgIC8vIE1ha2Ugc3VyZSB0aGUgdGVtcGxhdGUgZGVkdWNlcyBhbiBpbml0aWFsaXplciBhcyBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4KKyAgYnVpbGRlci5DcmVhdGVWZWN0b3JPZlN0cmluZ3MoeyAiaGVsbG8iLCAid29ybGQiIH0pOworCisgIC8vIENyZWF0ZSBtYW55IHZlY3RvcnMgb2Ygc3RyaW5ncworICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gbWFueU5hbWVzOworICBmb3IgKGF1dG8gaSA9IDA7IGkgPCAxMDA7IGkrKykgeyBtYW55TmFtZXMucHVzaF9iYWNrKCJqb2huX2RvZSIpOyB9CisgIGF1dG8gbWFueU5hbWVzVmVjID0gYnVpbGRlci5DcmVhdGVWZWN0b3JPZlN0cmluZ3MobWFueU5hbWVzKTsKKyAgVEVTVF9FUShmYWxzZSwgbWFueU5hbWVzVmVjLklzTnVsbCgpKTsKKyAgYXV0byBtYW55TmFtZXNWZWMyID0KKyAgICAgIGJ1aWxkZXIuQ3JlYXRlVmVjdG9yT2ZTdHJpbmdzKG1hbnlOYW1lcy5jYmVnaW4oKSwgbWFueU5hbWVzLmNlbmQoKSk7CisgIFRFU1RfRVEoZmFsc2UsIG1hbnlOYW1lc1ZlYzIuSXNOdWxsKCkpOworCisgIC8vIENyZWF0ZSBhbiBhcnJheSBvZiBzb3J0ZWQgdGFibGVzLCBjYW4gYmUgdXNlZCB3aXRoIGJpbmFyeSBzZWFyY2ggd2hlbiByZWFkOgorICBhdXRvIHZlY29mdGFibGVzID0gYnVpbGRlci5DcmVhdGVWZWN0b3JPZlNvcnRlZFRhYmxlcyhtbG9jcywgMyk7CisKKyAgLy8gQ3JlYXRlIGFuIGFycmF5IG9mIHNvcnRlZCBzdHJ1Y3RzLAorICAvLyBjYW4gYmUgdXNlZCB3aXRoIGJpbmFyeSBzZWFyY2ggd2hlbiByZWFkOgorICBzdGQ6OnZlY3RvcjxBYmlsaXR5PiBhYmlsaXRpZXM7CisgIGFiaWxpdGllcy5wdXNoX2JhY2soQWJpbGl0eSg0LCA0MCkpOworICBhYmlsaXRpZXMucHVzaF9iYWNrKEFiaWxpdHkoMywgMzApKTsKKyAgYWJpbGl0aWVzLnB1c2hfYmFjayhBYmlsaXR5KDIsIDIwKSk7CisgIGFiaWxpdGllcy5wdXNoX2JhY2soQWJpbGl0eSgwLCAwKSk7CisgIGF1dG8gdmVjb2ZzdHJ1Y3RzID0gYnVpbGRlci5DcmVhdGVWZWN0b3JPZlNvcnRlZFN0cnVjdHMoJmFiaWxpdGllcyk7CisKKyAgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxTdGF0PiBtbG9jc19zdGF0c1sxXTsKKyAgYXV0byBtaXNzID0gYnVpbGRlci5DcmVhdGVTdHJpbmcoIm1pc3MiKTsKKyAgU3RhdEJ1aWxkZXIgbWJfbWlzcyhidWlsZGVyKTsKKyAgbWJfbWlzcy5hZGRfaWQobWlzcyk7CisgIG1iX21pc3MuYWRkX3ZhbCgwKTsKKyAgbWJfbWlzcy5hZGRfY291bnQoMCk7ICAvLyBrZXkKKyAgbWxvY3Nfc3RhdHNbMF0gPSBtYl9taXNzLkZpbmlzaCgpOworICBhdXRvIHZlY19vZl9zdGF0cyA9IGJ1aWxkZXIuQ3JlYXRlVmVjdG9yT2ZTb3J0ZWRUYWJsZXMobWxvY3Nfc3RhdHMsIDEpOworCisgIC8vIENyZWF0ZSBhIG5lc3RlZCBGbGF0QnVmZmVyLgorICAvLyBOZXN0ZWQgRmxhdEJ1ZmZlcnMgYXJlIHN0b3JlZCBpbiBhIHVieXRlIHZlY3Rvciwgd2hpY2ggY2FuIGJlIGNvbnZlbmllbnQKKyAgLy8gc2luY2UgdGhleSBjYW4gYmUgbWVtY3B5J2QgYXJvdW5kIG11Y2ggZWFzaWVyIHRoYW4gb3RoZXIgRmxhdEJ1ZmZlcgorICAvLyB2YWx1ZXMuIFRoZXkgaGF2ZSBsaXR0bGUgb3ZlcmhlYWQgY29tcGFyZWQgdG8gc3RvcmluZyB0aGUgdGFibGUgZGlyZWN0bHkuCisgIC8vIEFzIGEgdGVzdCwgY3JlYXRlIGEgbW9zdGx5IGVtcHR5IE1vbnN0ZXIgYnVmZmVyOgorICBmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgbmVzdGVkX2J1aWxkZXI7CisgIGF1dG8gbm1sb2MgPSBDcmVhdGVNb25zdGVyKG5lc3RlZF9idWlsZGVyLCBudWxscHRyLCAwLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXN0ZWRfYnVpbGRlci5DcmVhdGVTdHJpbmcoIk5lc3RlZE1vbnN0ZXIiKSk7CisgIEZpbmlzaE1vbnN0ZXJCdWZmZXIobmVzdGVkX2J1aWxkZXIsIG5tbG9jKTsKKyAgLy8gTm93IHdlIGNhbiBzdG9yZSB0aGUgYnVmZmVyIGluIHRoZSBwYXJlbnQuIE5vdGUgdGhhdCBieSBkZWZhdWx0LCB2ZWN0b3JzCisgIC8vIGFyZSBvbmx5IGFsaWduZWQgdG8gdGhlaXIgZWxlbWVudHMgb3Igc2l6ZSBmaWVsZCwgc28gaW4gdGhpcyBjYXNlIGlmIHRoZQorICAvLyBidWZmZXIgY29udGFpbnMgNjQtYml0IGVsZW1lbnRzLCB0aGV5IG1heSBub3QgYmUgY29ycmVjdGx5IGFsaWduZWQuIFdlIGZpeAorICAvLyB0aGF0IHdpdGg6CisgIGJ1aWxkZXIuRm9yY2VWZWN0b3JBbGlnbm1lbnQobmVzdGVkX2J1aWxkZXIuR2V0U2l6ZSgpLCBzaXplb2YodWludDhfdCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmVzdGVkX2J1aWxkZXIuR2V0QnVmZmVyTWluQWxpZ25tZW50KCkpOworICAvLyBJZiBmb3Igd2hhdGV2ZXIgcmVhc29uIHlvdSBkb24ndCBoYXZlIHRoZSBuZXN0ZWRfYnVpbGRlciBhdmFpbGFibGUsIHlvdQorICAvLyBjYW4gc3Vic3RpdHV0ZSBmbGF0YnVmZmVyczo6bGFyZ2VzdF9zY2FsYXJfdCAoNjQtYml0KSBmb3IgdGhlIGFsaWdubWVudCwgb3IKKyAgLy8gdGhlIGxhcmdlc3QgZm9yY2VfYWxpZ24gdmFsdWUgaW4geW91ciBzY2hlbWEgaWYgeW91J3JlIHVzaW5nIGl0LgorICBhdXRvIG5lc3RlZF9mbGF0YnVmZmVyX3ZlY3RvciA9IGJ1aWxkZXIuQ3JlYXRlVmVjdG9yKAorICAgICAgbmVzdGVkX2J1aWxkZXIuR2V0QnVmZmVyUG9pbnRlcigpLCBuZXN0ZWRfYnVpbGRlci5HZXRTaXplKCkpOworCisgIC8vIFRlc3QgYSBuZXN0ZWQgRmxleEJ1ZmZlcjoKKyAgZmxleGJ1ZmZlcnM6OkJ1aWxkZXIgZmxleGJ1aWxkOworICBmbGV4YnVpbGQuSW50KDEyMzQpOworICBmbGV4YnVpbGQuRmluaXNoKCk7CisgIGF1dG8gZmxleCA9IGJ1aWxkZXIuQ3JlYXRlVmVjdG9yKGZsZXhidWlsZC5HZXRCdWZmZXIoKSk7CisgIC8vIFRlc3QgdmVjdG9yIG9mIGVudW1zLgorICBDb2xvciBjb2xvcnNbXSA9IHsgQ29sb3JfQmx1ZSwgQ29sb3JfR3JlZW4gfTsKKyAgLy8gV2UgdXNlIHRoaXMgc3BlY2lhbCBjcmVhdGlvbiBmdW5jdGlvbiBiZWNhdXNlIHdlIGhhdmUgYW4gYXJyYXkgb2YKKyAgLy8gcHJlLUMrKzExIChlbnVtIGNsYXNzKSBlbnVtcyB3aG9zZSBzaXplIGxpa2VseSBpcyBpbnQsIHlldCBpdHMgZGVjbGFyZWQKKyAgLy8gdHlwZSBpbiB0aGUgc2NoZW1hIGlzIGJ5dGUuCisgIGF1dG8gdmVjb2Zjb2xvcnMgPSBidWlsZGVyLkNyZWF0ZVZlY3RvclNjYWxhckNhc3Q8dWludDhfdCwgQ29sb3I+KGNvbG9ycywgMik7CisKKyAgLy8gc2hvcnRjdXQgZm9yIGNyZWF0aW5nIG1vbnN0ZXIgd2l0aCBhbGwgZmllbGRzIHNldDoKKyAgYXV0byBtbG9jID0gQ3JlYXRlTW9uc3RlcigKKyAgICAgIGJ1aWxkZXIsICZ2ZWMsIDE1MCwgODAsIG5hbWUsIGludmVudG9yeSwgQ29sb3JfQmx1ZSwgQW55X01vbnN0ZXIsCisgICAgICBtbG9jc1sxXS5VbmlvbigpLCAgLy8gU3RvcmUgYSB1bmlvbi4KKyAgICAgIHRlc3R2LCB2ZWNvZnN0cmluZ3MsIHZlY29mdGFibGVzLCAwLCBuZXN0ZWRfZmxhdGJ1ZmZlcl92ZWN0b3IsIDAsIGZhbHNlLAorICAgICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMy4xNDE1OWYsIDMuMGYsIDAuMGYsIHZlY29mc3RyaW5nczIsCisgICAgICB2ZWNvZnN0cnVjdHMsIGZsZXgsIHRlc3R2MiwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKKyAgICAgIEFueVVuaXF1ZUFsaWFzZXNfTk9ORSwgMCwgQW55QW1iaWd1b3VzQWxpYXNlc19OT05FLCAwLCB2ZWNvZmNvbG9ycywKKyAgICAgIE15R2FtZTo6RXhhbXBsZTo6UmFjZV9Ob25lLCAwLCB2ZWNfb2Zfc3RhdHMpOworCisgIEZpbmlzaE1vbnN0ZXJCdWZmZXIoYnVpbGRlciwgbWxvYyk7CisKKyAgLy8gY2xhbmctZm9ybWF0IG9mZgorICAjaWZkZWYgRkxBVEJVRkZFUlNfVEVTVF9WRVJCT1NFCisgIC8vIHByaW50IGJ5dGUgZGF0YSBmb3IgZGVidWdnaW5nOgorICBhdXRvIHAgPSBidWlsZGVyLkdldEJ1ZmZlclBvaW50ZXIoKTsKKyAgZm9yIChmbGF0YnVmZmVyczo6dW9mZnNldF90IGkgPSAwOyBpIDwgYnVpbGRlci5HZXRTaXplKCk7IGkrKykKKyAgICBwcmludGYoIiVkICIsIHBbaV0pOworICAjZW5kaWYKKyAgLy8gY2xhbmctZm9ybWF0IG9uCisKKyAgLy8gcmV0dXJuIHRoZSBidWZmZXIgZm9yIHRoZSBjYWxsZXIgdG8gdXNlLgorICBhdXRvIGJ1ZmZlcnBvaW50ZXIgPQorICAgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyICo+KGJ1aWxkZXIuR2V0QnVmZmVyUG9pbnRlcigpKTsKKyAgYnVmZmVyLmFzc2lnbihidWZmZXJwb2ludGVyLCBidWZmZXJwb2ludGVyICsgYnVpbGRlci5HZXRTaXplKCkpOworCisgIHJldHVybiBidWlsZGVyLlJlbGVhc2UoKTsKK30KKworLy8gIGV4YW1wbGUgb2YgYWNjZXNzaW5nIGEgYnVmZmVyIGxvYWRlZCBpbiBtZW1vcnk6Cit2b2lkIEFjY2Vzc0ZsYXRCdWZmZXJUZXN0KGNvbnN0IHVpbnQ4X3QgKmZsYXRidWYsIHNpemVfdCBsZW5ndGgsIGJvb2wgcG9vbGVkKSB7CisgIC8vIEZpcnN0LCB2ZXJpZnkgdGhlIGJ1ZmZlcnMgaW50ZWdyaXR5IChvcHRpb25hbCkKKyAgZmxhdGJ1ZmZlcnM6OlZlcmlmaWVyIHZlcmlmaWVyKGZsYXRidWYsIGxlbmd0aCk7CisgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGZsZXhfcmV1c2VfdHJhY2tlcjsKKyAgdmVyaWZpZXIuU2V0RmxleFJldXNlVHJhY2tlcigmZmxleF9yZXVzZV90cmFja2VyKTsKKyAgVEVTVF9FUShWZXJpZnlNb25zdGVyQnVmZmVyKHZlcmlmaWVyKSwgdHJ1ZSk7CisKKyAgLy8gY2xhbmctZm9ybWF0IG9mZgorICAjaWZkZWYgRkxBVEJVRkZFUlNfVFJBQ0tfVkVSSUZJRVJfQlVGRkVSX1NJWkUKKyAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiB0ZXN0X2J1ZmY7CisgICAgdGVzdF9idWZmLnJlc2l6ZShsZW5ndGggKiAyKTsKKyAgICBzdGQ6Om1lbWNweSgmdGVzdF9idWZmWzBdLCBmbGF0YnVmLCBsZW5ndGgpOworICAgIHN0ZDo6bWVtY3B5KCZ0ZXN0X2J1ZmZbbGVuZ3RoXSwgZmxhdGJ1ZiwgbGVuZ3RoKTsKKworICAgIGZsYXRidWZmZXJzOjpWZXJpZmllciB2ZXJpZmllcjEoJnRlc3RfYnVmZlswXSwgbGVuZ3RoKTsKKyAgICBURVNUX0VRKFZlcmlmeU1vbnN0ZXJCdWZmZXIodmVyaWZpZXIxKSwgdHJ1ZSk7CisgICAgVEVTVF9FUSh2ZXJpZmllcjEuR2V0Q29tcHV0ZWRTaXplKCksIGxlbmd0aCk7CisKKyAgICBmbGF0YnVmZmVyczo6VmVyaWZpZXIgdmVyaWZpZXIyKCZ0ZXN0X2J1ZmZbbGVuZ3RoXSwgbGVuZ3RoKTsKKyAgICBURVNUX0VRKFZlcmlmeU1vbnN0ZXJCdWZmZXIodmVyaWZpZXIyKSwgdHJ1ZSk7CisgICAgVEVTVF9FUSh2ZXJpZmllcjIuR2V0Q29tcHV0ZWRTaXplKCksIGxlbmd0aCk7CisgICNlbmRpZgorICAvLyBjbGFuZy1mb3JtYXQgb24KKworICBURVNUX0VRKHN0cmNtcChNb25zdGVySWRlbnRpZmllcigpLCAiTU9OUyIpLCAwKTsKKyAgVEVTVF9FUShNb25zdGVyQnVmZmVySGFzSWRlbnRpZmllcihmbGF0YnVmKSwgdHJ1ZSk7CisgIFRFU1RfRVEoc3RyY21wKE1vbnN0ZXJFeHRlbnNpb24oKSwgIm1vbiIpLCAwKTsKKworICAvLyBBY2Nlc3MgdGhlIGJ1ZmZlciBmcm9tIHRoZSByb290LgorICBhdXRvIG1vbnN0ZXIgPSBHZXRNb25zdGVyKGZsYXRidWYpOworCisgIFRFU1RfRVEobW9uc3Rlci0+aHAoKSwgODApOworICBURVNUX0VRKG1vbnN0ZXItPm1hbmEoKSwgMTUwKTsgIC8vIGRlZmF1bHQKKyAgVEVTVF9FUV9TVFIobW9uc3Rlci0+bmFtZSgpLT5jX3N0cigpLCAiTXlNb25zdGVyIik7CisgIC8vIENhbid0IGFjY2VzcyB0aGUgZm9sbG93aW5nIGZpZWxkLCBpdCBpcyBkZXByZWNhdGVkIGluIHRoZSBzY2hlbWEsCisgIC8vIHdoaWNoIG1lYW5zIGFjY2Vzc29ycyBhcmUgbm90IGdlbmVyYXRlZDoKKyAgLy8gbW9uc3Rlci5mcmllbmRseSgpCisKKyAgYXV0byBwb3MgPSBtb25zdGVyLT5wb3MoKTsKKyAgVEVTVF9OT1ROVUxMKHBvcyk7CisgIFRFU1RfRVEocG9zLT56KCksIDMpOworICBURVNUX0VRKHBvcy0+dGVzdDMoKS5hKCksIDEwKTsKKyAgVEVTVF9FUShwb3MtPnRlc3QzKCkuYigpLCAyMCk7CisKKyAgYXV0byBpbnZlbnRvcnkgPSBtb25zdGVyLT5pbnZlbnRvcnkoKTsKKyAgVEVTVF9FUShWZWN0b3JMZW5ndGgoaW52ZW50b3J5KSwgMTBVTCk7ICAvLyBXb3JrcyBldmVuIGlmIGludmVudG9yeSBpcyBudWxsLgorICBURVNUX05PVE5VTEwoaW52ZW50b3J5KTsKKyAgdW5zaWduZWQgY2hhciBpbnZfZGF0YVtdID0geyAwLCAxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5IH07CisgIC8vIENoZWNrIGNvbXBhdGliaWx0eSBvZiBpdGVyYXRvcnMgd2l0aCBTVEwuCisgIHN0ZDo6dmVjdG9yPHVuc2lnbmVkIGNoYXI+IGludl92ZWMoaW52ZW50b3J5LT5iZWdpbigpLCBpbnZlbnRvcnktPmVuZCgpKTsKKyAgc2l6ZV90IG4gPSAwOworICBmb3IgKGF1dG8gaXQgPSBpbnZlbnRvcnktPmJlZ2luKCk7IGl0ICE9IGludmVudG9yeS0+ZW5kKCk7ICsraXQsICsrbikgeworICAgIGF1dG8gaW5keCA9IGl0IC0gaW52ZW50b3J5LT5iZWdpbigpOworICAgIFRFU1RfRVEoKml0LCBpbnZfdmVjLmF0KGluZHgpKTsgIC8vIFVzZSBib3VuZHMtY2hlY2suCisgICAgVEVTVF9FUSgqaXQsIGludl9kYXRhW2luZHhdKTsKKyAgfQorICBURVNUX0VRKG4sIGludl92ZWMuc2l6ZSgpKTsKKworICBuID0gMDsKKyAgZm9yIChhdXRvIGl0ID0gaW52ZW50b3J5LT5jYmVnaW4oKTsgaXQgIT0gaW52ZW50b3J5LT5jZW5kKCk7ICsraXQsICsrbikgeworICAgIGF1dG8gaW5keCA9IGl0IC0gaW52ZW50b3J5LT5jYmVnaW4oKTsKKyAgICBURVNUX0VRKCppdCwgaW52X3ZlYy5hdChpbmR4KSk7ICAvLyBVc2UgYm91bmRzLWNoZWNrLgorICAgIFRFU1RfRVEoKml0LCBpbnZfZGF0YVtpbmR4XSk7CisgIH0KKyAgVEVTVF9FUShuLCBpbnZfdmVjLnNpemUoKSk7CisKKyAgbiA9IDA7CisgIGZvciAoYXV0byBpdCA9IGludmVudG9yeS0+cmJlZ2luKCk7IGl0ICE9IGludmVudG9yeS0+cmVuZCgpOyArK2l0LCArK24pIHsKKyAgICBhdXRvIGluZHggPSBpbnZlbnRvcnktPnJlbmQoKSAtIGl0IC0gMTsKKyAgICBURVNUX0VRKCppdCwgaW52X3ZlYy5hdChpbmR4KSk7ICAvLyBVc2UgYm91bmRzLWNoZWNrLgorICAgIFRFU1RfRVEoKml0LCBpbnZfZGF0YVtpbmR4XSk7CisgIH0KKyAgVEVTVF9FUShuLCBpbnZfdmVjLnNpemUoKSk7CisKKyAgbiA9IDA7CisgIGZvciAoYXV0byBpdCA9IGludmVudG9yeS0+Y3JiZWdpbigpOyBpdCAhPSBpbnZlbnRvcnktPmNyZW5kKCk7ICsraXQsICsrbikgeworICAgIGF1dG8gaW5keCA9IGludmVudG9yeS0+Y3JlbmQoKSAtIGl0IC0gMTsKKyAgICBURVNUX0VRKCppdCwgaW52X3ZlYy5hdChpbmR4KSk7ICAvLyBVc2UgYm91bmRzLWNoZWNrLgorICAgIFRFU1RfRVEoKml0LCBpbnZfZGF0YVtpbmR4XSk7CisgIH0KKyAgVEVTVF9FUShuLCBpbnZfdmVjLnNpemUoKSk7CisKKyAgVEVTVF9FUShtb25zdGVyLT5jb2xvcigpLCBDb2xvcl9CbHVlKTsKKworICAvLyBFeGFtcGxlIG9mIGFjY2Vzc2luZyBhIHVuaW9uOgorICBURVNUX0VRKG1vbnN0ZXItPnRlc3RfdHlwZSgpLCBBbnlfTW9uc3Rlcik7ICAvLyBGaXJzdCBtYWtlIHN1cmUgd2hpY2ggaXQgaXMuCisgIGF1dG8gbW9uc3RlcjIgPSByZWludGVycHJldF9jYXN0PGNvbnN0IE1vbnN0ZXIgKj4obW9uc3Rlci0+dGVzdCgpKTsKKyAgVEVTVF9OT1ROVUxMKG1vbnN0ZXIyKTsKKyAgVEVTVF9FUV9TVFIobW9uc3RlcjItPm5hbWUoKS0+Y19zdHIoKSwgIkZyZWQiKTsKKworICAvLyBFeGFtcGxlIG9mIGFjY2Vzc2luZyBhIHZlY3RvciBvZiBzdHJpbmdzOgorICBhdXRvIHZlY29mc3RyaW5ncyA9IG1vbnN0ZXItPnRlc3RhcnJheW9mc3RyaW5nKCk7CisgIFRFU1RfRVEodmVjb2ZzdHJpbmdzLT5zaXplKCksIDRVKTsKKyAgVEVTVF9FUV9TVFIodmVjb2ZzdHJpbmdzLT5HZXQoMCktPmNfc3RyKCksICJib2IiKTsKKyAgVEVTVF9FUV9TVFIodmVjb2ZzdHJpbmdzLT5HZXQoMSktPmNfc3RyKCksICJmcmVkIik7CisgIGlmIChwb29sZWQpIHsKKyAgICAvLyBUaGVzZSBzaG91bGQgaGF2ZSBwb2ludGVyIGVxdWFsaXR5IGJlY2F1c2Ugb2Ygc3RyaW5nIHBvb2xpbmcuCisgICAgVEVTVF9FUSh2ZWNvZnN0cmluZ3MtPkdldCgwKS0+Y19zdHIoKSwgdmVjb2ZzdHJpbmdzLT5HZXQoMiktPmNfc3RyKCkpOworICAgIFRFU1RfRVEodmVjb2ZzdHJpbmdzLT5HZXQoMSktPmNfc3RyKCksIHZlY29mc3RyaW5ncy0+R2V0KDMpLT5jX3N0cigpKTsKKyAgfQorCisgIGF1dG8gdmVjb2ZzdHJpbmdzMiA9IG1vbnN0ZXItPnRlc3RhcnJheW9mc3RyaW5nMigpOworICBpZiAodmVjb2ZzdHJpbmdzMikgeworICAgIFRFU1RfRVEodmVjb2ZzdHJpbmdzMi0+c2l6ZSgpLCAyVSk7CisgICAgVEVTVF9FUV9TVFIodmVjb2ZzdHJpbmdzMi0+R2V0KDApLT5jX3N0cigpLCAiamFuZSIpOworICAgIFRFU1RfRVFfU1RSKHZlY29mc3RyaW5nczItPkdldCgxKS0+Y19zdHIoKSwgIm1hcnkiKTsKKyAgfQorCisgIC8vIEV4YW1wbGUgb2YgYWNjZXNzaW5nIGEgdmVjdG9yIG9mIHRhYmxlczoKKyAgYXV0byB2ZWNvZnRhYmxlcyA9IG1vbnN0ZXItPnRlc3RhcnJheW9mdGFibGVzKCk7CisgIFRFU1RfRVEodmVjb2Z0YWJsZXMtPnNpemUoKSwgM1UpOworICBmb3IgKGF1dG8gaXQgPSB2ZWNvZnRhYmxlcy0+YmVnaW4oKTsgaXQgIT0gdmVjb2Z0YWJsZXMtPmVuZCgpOyArK2l0KSB7CisgICAgVEVTVF9FUShzdHJsZW4oaXQtPm5hbWUoKS0+Y19zdHIoKSkgPj0gNCwgdHJ1ZSk7CisgIH0KKyAgVEVTVF9FUV9TVFIodmVjb2Z0YWJsZXMtPkdldCgwKS0+bmFtZSgpLT5jX3N0cigpLCAiQmFybmV5Iik7CisgIFRFU1RfRVEodmVjb2Z0YWJsZXMtPkdldCgwKS0+aHAoKSwgMTAwMCk7CisgIFRFU1RfRVFfU1RSKHZlY29mdGFibGVzLT5HZXQoMSktPm5hbWUoKS0+Y19zdHIoKSwgIkZyZWQiKTsKKyAgVEVTVF9FUV9TVFIodmVjb2Z0YWJsZXMtPkdldCgyKS0+bmFtZSgpLT5jX3N0cigpLCAiV2lsbWEiKTsKKyAgVEVTVF9OT1ROVUxMKHZlY29mdGFibGVzLT5Mb29rdXBCeUtleSgiQmFybmV5IikpOworICBURVNUX05PVE5VTEwodmVjb2Z0YWJsZXMtPkxvb2t1cEJ5S2V5KCJGcmVkIikpOworICBURVNUX05PVE5VTEwodmVjb2Z0YWJsZXMtPkxvb2t1cEJ5S2V5KCJXaWxtYSIpKTsKKworICAvLyBUZXN0IGFjY2Vzc2luZyBhIHZlY3RvciBvZiBzb3J0ZWQgc3RydWN0cworICBhdXRvIHZlY29mc3RydWN0cyA9IG1vbnN0ZXItPnRlc3RhcnJheW9mc29ydGVkc3RydWN0KCk7CisgIGlmICh2ZWNvZnN0cnVjdHMpIHsgIC8vIG5vdCBmaWxsZWQgaW4gbW9uc3Rlcl90ZXN0LmJmYnMKKyAgICBmb3IgKGZsYXRidWZmZXJzOjp1b2Zmc2V0X3QgaSA9IDA7IGkgPCB2ZWNvZnN0cnVjdHMtPnNpemUoKSAtIDE7IGkrKykgeworICAgICAgYXV0byBsZWZ0ID0gdmVjb2ZzdHJ1Y3RzLT5HZXQoaSk7CisgICAgICBhdXRvIHJpZ2h0ID0gdmVjb2ZzdHJ1Y3RzLT5HZXQoaSArIDEpOworICAgICAgVEVTVF9FUSh0cnVlLCAobGVmdC0+S2V5Q29tcGFyZUxlc3NUaGFuKHJpZ2h0KSkpOworICAgIH0KKyAgICBURVNUX05PVE5VTEwodmVjb2ZzdHJ1Y3RzLT5Mb29rdXBCeUtleSgwKSk7ICAvLyB0ZXN0IGRlZmF1bHQgdmFsdWUKKyAgICBURVNUX05PVE5VTEwodmVjb2ZzdHJ1Y3RzLT5Mb29rdXBCeUtleSgzKSk7CisgICAgVEVTVF9FUShzdGF0aWNfY2FzdDxjb25zdCBBYmlsaXR5ICo+KG51bGxwdHIpLAorICAgICAgICAgICAgdmVjb2ZzdHJ1Y3RzLT5Mb29rdXBCeUtleSg1KSk7CisgIH0KKworICBpZiAoYXV0byB2ZWNfb2Zfc3RhdCA9IG1vbnN0ZXItPnNjYWxhcl9rZXlfc29ydGVkX3RhYmxlcygpKSB7CisgICAgYXV0byBzdGF0XzAgPSB2ZWNfb2Zfc3RhdC0+TG9va3VwQnlLZXkoc3RhdGljX2Nhc3Q8dWludDE2X3Q+KDB1KSk7CisgICAgVEVTVF9OT1ROVUxMKHN0YXRfMCk7CisgICAgVEVTVF9OT1ROVUxMKHN0YXRfMC0+aWQoKSk7CisgICAgVEVTVF9FUSgwLCBzdGF0XzAtPmNvdW50KCkpOworICAgIFRFU1RfRVFfU1RSKCJtaXNzIiwgc3RhdF8wLT5pZCgpLT5jX3N0cigpKTsKKyAgfQorCisgIC8vIFRlc3QgbmVzdGVkIEZsYXRCdWZmZXJzIGlmIGF2YWlsYWJsZToKKyAgYXV0byBuZXN0ZWRfYnVmZmVyID0gbW9uc3Rlci0+dGVzdG5lc3RlZGZsYXRidWZmZXIoKTsKKyAgaWYgKG5lc3RlZF9idWZmZXIpIHsKKyAgICAvLyBuZXN0ZWRfYnVmZmVyIGlzIGEgdmVjdG9yIG9mIGJ5dGVzIHlvdSBjYW4gbWVtY3B5LiBIb3dldmVyLCBpZiB5b3UKKyAgICAvLyBhY3R1YWxseSB3YW50IHRvIGFjY2VzcyB0aGUgbmVzdGVkIGRhdGEsIHRoaXMgaXMgYSBjb252ZW5pZW50CisgICAgLy8gYWNjZXNzb3IgdGhhdCBkaXJlY3RseSBnaXZlcyB5b3UgdGhlIHJvb3QgdGFibGU6CisgICAgYXV0byBuZXN0ZWRfbW9uc3RlciA9IG1vbnN0ZXItPnRlc3RuZXN0ZWRmbGF0YnVmZmVyX25lc3RlZF9yb290KCk7CisgICAgVEVTVF9FUV9TVFIobmVzdGVkX21vbnN0ZXItPm5hbWUoKS0+Y19zdHIoKSwgIk5lc3RlZE1vbnN0ZXIiKTsKKyAgfQorCisgIC8vIFRlc3QgZmxleGJ1ZmZlciBpZiBhdmFpbGFibGU6CisgIGF1dG8gZmxleCA9IG1vbnN0ZXItPmZsZXgoKTsKKyAgLy8gZmxleCBpcyBhIHZlY3RvciBvZiBieXRlcyB5b3UgY2FuIG1lbWNweSBldGMuCisgIFRFU1RfRVEoZmxleC0+c2l6ZSgpLCA0KTsgIC8vIEVuY29kZWQgRmxleEJ1ZmZlciBieXRlcy4KKyAgLy8gSG93ZXZlciwgaWYgeW91IGFjdHVhbGx5IHdhbnQgdG8gYWNjZXNzIHRoZSBuZXN0ZWQgZGF0YSwgdGhpcyBpcyBhCisgIC8vIGNvbnZlbmllbnQgYWNjZXNzb3IgdGhhdCBkaXJlY3RseSBnaXZlcyB5b3UgdGhlIHJvb3QgdmFsdWU6CisgIFRFU1RfRVEobW9uc3Rlci0+ZmxleF9mbGV4YnVmZmVyX3Jvb3QoKS5Bc0ludDE2KCksIDEyMzQpOworCisgIC8vIFRlc3QgdmVjdG9yIG9mIGVudW1zOgorICBhdXRvIGNvbG9ycyA9IG1vbnN0ZXItPnZlY3Rvcl9vZl9lbnVtcygpOworICBpZiAoY29sb3JzKSB7CisgICAgVEVTVF9FUShjb2xvcnMtPnNpemUoKSwgMik7CisgICAgVEVTVF9FUShjb2xvcnMtPkdldCgwKSwgQ29sb3JfQmx1ZSk7CisgICAgVEVTVF9FUShjb2xvcnMtPkdldCgxKSwgQ29sb3JfR3JlZW4pOworICB9CisKKyAgLy8gU2luY2UgRmxhdGJ1ZmZlcnMgdXNlcyBleHBsaWNpdCBtZWNoYW5pc21zIHRvIG92ZXJyaWRlIHRoZSBkZWZhdWx0CisgIC8vIGNvbXBpbGVyIGFsaWdubWVudCwgZG91YmxlIGNoZWNrIHRoYXQgdGhlIGNvbXBpbGVyIGluZGVlZCBvYmV5cyB0aGVtOgorICAvLyAoVGVzdCBjb25zaXN0cyBvZiBhIHNob3J0IGFuZCBieXRlKToKKyAgVEVTVF9FUShmbGF0YnVmZmVyczo6QWxpZ25PZjxUZXN0PigpLCAyVUwpOworICBURVNUX0VRKHNpemVvZihUZXN0KSwgNFVMKTsKKworICBjb25zdCBmbGF0YnVmZmVyczo6VmVjdG9yPGNvbnN0IFRlc3QgKj4gKnRlc3RzX2FycmF5W10gPSB7CisgICAgbW9uc3Rlci0+dGVzdDQoKSwKKyAgICBtb25zdGVyLT50ZXN0NSgpLAorICB9OworICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemVvZih0ZXN0c19hcnJheSkgLyBzaXplb2YodGVzdHNfYXJyYXlbMF0pOyArK2kpIHsKKyAgICBhdXRvIHRlc3RzID0gdGVzdHNfYXJyYXlbaV07CisgICAgVEVTVF9OT1ROVUxMKHRlc3RzKTsKKyAgICBhdXRvIHRlc3RfMCA9IHRlc3RzLT5HZXQoMCk7CisgICAgYXV0byB0ZXN0XzEgPSB0ZXN0cy0+R2V0KDEpOworICAgIFRFU1RfRVEodGVzdF8wLT5hKCksIDEwKTsKKyAgICBURVNUX0VRKHRlc3RfMC0+YigpLCAyMCk7CisgICAgVEVTVF9FUSh0ZXN0XzEtPmEoKSwgMzApOworICAgIFRFU1RfRVEodGVzdF8xLT5iKCksIDQwKTsKKyAgICBmb3IgKGF1dG8gaXQgPSB0ZXN0cy0+YmVnaW4oKTsgaXQgIT0gdGVzdHMtPmVuZCgpOyArK2l0KSB7CisgICAgICBURVNUX0VRKGl0LT5hKCkgPT0gMTAgfHwgaXQtPmEoKSA9PSAzMCwgdHJ1ZSk7ICAvLyBKdXN0IHRlc3RpbmcgaXRlcmF0b3JzLgorICAgIH0KKyAgfQorCisgIC8vIENoZWNraW5nIGZvciBwcmVzZW5jZSBvZiBmaWVsZHM6CisgIFRFU1RfRVEoZmxhdGJ1ZmZlcnM6OklzRmllbGRQcmVzZW50KG1vbnN0ZXIsIE1vbnN0ZXI6OlZUX0hQKSwgdHJ1ZSk7CisgIFRFU1RfRVEoZmxhdGJ1ZmZlcnM6OklzRmllbGRQcmVzZW50KG1vbnN0ZXIsIE1vbnN0ZXI6OlZUX01BTkEpLCBmYWxzZSk7CisKKyAgLy8gT2J0YWluaW5nIGEgYnVmZmVyIGZyb20gYSByb290OgorICBURVNUX0VRKEdldEJ1ZmZlclN0YXJ0RnJvbVJvb3RQb2ludGVyKG1vbnN0ZXIpLCBmbGF0YnVmKTsKK30KKworLy8gQ2hhbmdlIGEgRmxhdEJ1ZmZlciBpbi1wbGFjZSwgYWZ0ZXIgaXQgaGFzIGJlZW4gY29uc3RydWN0ZWQuCit2b2lkIE11dGF0ZUZsYXRCdWZmZXJzVGVzdCh1aW50OF90ICpmbGF0YnVmLCBzdGQ6OnNpemVfdCBsZW5ndGgpIHsKKyAgLy8gR2V0IG5vbi1jb25zdCBwb2ludGVyIHRvIHJvb3QuCisgIGF1dG8gbW9uc3RlciA9IEdldE11dGFibGVNb25zdGVyKGZsYXRidWYpOworCisgIC8vIEVhY2ggb2YgdGhlc2UgdGVzdHMgbXV0YXRlcywgdGhlbiB0ZXN0cywgdGhlbiBzZXQgYmFjayB0byB0aGUgb3JpZ2luYWwsCisgIC8vIHNvIHdlIGNhbiB0ZXN0IHRoYXQgdGhlIGJ1ZmZlciBpbiB0aGUgZW5kIHN0aWxsIHBhc3NlcyBvdXIgb3JpZ2luYWwgdGVzdC4KKyAgYXV0byBocF9vayA9IG1vbnN0ZXItPm11dGF0ZV9ocCgxMCk7CisgIFRFU1RfRVEoaHBfb2ssIHRydWUpOyAgLy8gRmllbGQgd2FzIHByZXNlbnQuCisgIFRFU1RfRVEobW9uc3Rlci0+aHAoKSwgMTApOworICAvLyBNdXRhdGUgdG8gZGVmYXVsdCB2YWx1ZQorICBhdXRvIGhwX29rX2RlZmF1bHQgPSBtb25zdGVyLT5tdXRhdGVfaHAoMTAwKTsKKyAgVEVTVF9FUShocF9va19kZWZhdWx0LCB0cnVlKTsgIC8vIEZpZWxkIHdhcyBwcmVzZW50LgorICBURVNUX0VRKG1vbnN0ZXItPmhwKCksIDEwMCk7CisgIC8vIFRlc3QgdGhhdCBtdXRhdGUgdG8gZGVmYXVsdCBhYm92ZSBrZWVwcyBmaWVsZCB2YWxpZCBmb3IgZnVydGhlciBtdXRhdGlvbnMKKyAgYXV0byBocF9va18yID0gbW9uc3Rlci0+bXV0YXRlX2hwKDIwKTsKKyAgVEVTVF9FUShocF9va18yLCB0cnVlKTsKKyAgVEVTVF9FUShtb25zdGVyLT5ocCgpLCAyMCk7CisgIG1vbnN0ZXItPm11dGF0ZV9ocCg4MCk7CisKKyAgLy8gTW9uc3RlciBvcmlnaW5hbGx5IGF0IDE1MCBtYW5hIChkZWZhdWx0IHZhbHVlKQorICBhdXRvIG1hbmFfZGVmYXVsdF9vayA9IG1vbnN0ZXItPm11dGF0ZV9tYW5hKDE1MCk7ICAvLyBNdXRhdGUgdG8gZGVmYXVsdCB2YWx1ZS4KKyAgVEVTVF9FUShtYW5hX2RlZmF1bHRfb2ssCisgICAgICAgICAgdHJ1ZSk7ICAvLyBNdXRhdGlvbiBzaG91bGQgc3VjY2VlZCwgYmVjYXVzZSBkZWZhdWx0IHZhbHVlLgorICBURVNUX0VRKG1vbnN0ZXItPm1hbmEoKSwgMTUwKTsKKyAgYXV0byBtYW5hX29rID0gbW9uc3Rlci0+bXV0YXRlX21hbmEoMTApOworICBURVNUX0VRKG1hbmFfb2ssIGZhbHNlKTsgIC8vIEZpZWxkIHdhcyBOT1QgcHJlc2VudCwgYmVjYXVzZSBkZWZhdWx0IHZhbHVlLgorICBURVNUX0VRKG1vbnN0ZXItPm1hbmEoKSwgMTUwKTsKKworICAvLyBNdXRhdGUgc3RydWN0cy4KKyAgYXV0byBwb3MgPSBtb25zdGVyLT5tdXRhYmxlX3BvcygpOworICBhdXRvIHRlc3QzID0gcG9zLT5tdXRhYmxlX3Rlc3QzKCk7ICAvLyBTdHJ1Y3QgaW5zaWRlIGEgc3RydWN0LgorICB0ZXN0My5tdXRhdGVfYSg1MCk7ICAgICAgICAgICAgICAgICAvLyBTdHJ1Y3QgZmllbGRzIG5ldmVyIGZhaWwuCisgIFRFU1RfRVEodGVzdDMuYSgpLCA1MCk7CisgIHRlc3QzLm11dGF0ZV9hKDEwKTsKKworICAvLyBNdXRhdGUgdmVjdG9ycy4KKyAgYXV0byBpbnZlbnRvcnkgPSBtb25zdGVyLT5tdXRhYmxlX2ludmVudG9yeSgpOworICBpbnZlbnRvcnktPk11dGF0ZSg5LCAxMDApOworICBURVNUX0VRKGludmVudG9yeS0+R2V0KDkpLCAxMDApOworICBpbnZlbnRvcnktPk11dGF0ZSg5LCA5KTsKKworICBhdXRvIHRhYmxlcyA9IG1vbnN0ZXItPm11dGFibGVfdGVzdGFycmF5b2Z0YWJsZXMoKTsKKyAgYXV0byBmaXJzdCA9IHRhYmxlcy0+R2V0TXV0YWJsZU9iamVjdCgwKTsKKyAgVEVTVF9FUShmaXJzdC0+aHAoKSwgMTAwMCk7CisgIGZpcnN0LT5tdXRhdGVfaHAoMCk7CisgIFRFU1RfRVEoZmlyc3QtPmhwKCksIDApOworICBmaXJzdC0+bXV0YXRlX2hwKDEwMDApOworCisgIC8vIE11dGF0ZSB2aWEgTG9va3VwQnlLZXkKKyAgVEVTVF9OT1ROVUxMKHRhYmxlcy0+TXV0YWJsZUxvb2t1cEJ5S2V5KCJCYXJuZXkiKSk7CisgIFRFU1RfRVEoc3RhdGljX2Nhc3Q8TW9uc3RlciAqPihudWxscHRyKSwKKyAgICAgICAgICB0YWJsZXMtPk11dGFibGVMb29rdXBCeUtleSgiRG9lc250RXhpc3QiKSk7CisgIFRFU1RfRVEodGFibGVzLT5NdXRhYmxlTG9va3VwQnlLZXkoIkJhcm5leSIpLT5ocCgpLCAxMDAwKTsKKyAgVEVTVF9FUSh0YWJsZXMtPk11dGFibGVMb29rdXBCeUtleSgiQmFybmV5IiktPm11dGF0ZV9ocCgwKSwgdHJ1ZSk7CisgIFRFU1RfRVEodGFibGVzLT5Mb29rdXBCeUtleSgiQmFybmV5IiktPmhwKCksIDApOworICBURVNUX0VRKHRhYmxlcy0+TXV0YWJsZUxvb2t1cEJ5S2V5KCJCYXJuZXkiKS0+bXV0YXRlX2hwKDEwMDApLCB0cnVlKTsKKworICAvLyBSdW4gdGhlIHZlcmlmaWVyIGFuZCB0aGUgcmVndWxhciB0ZXN0IHRvIG1ha2Ugc3VyZSB3ZSBkaWRuJ3QgdHJhbXBsZSBvbgorICAvLyBhbnl0aGluZy4KKyAgQWNjZXNzRmxhdEJ1ZmZlclRlc3QoZmxhdGJ1ZiwgbGVuZ3RoKTsKK30KKworLy8gVW5wYWNrIGEgRmxhdEJ1ZmZlciBpbnRvIG9iamVjdHMuCit2b2lkIE9iamVjdEZsYXRCdWZmZXJzVGVzdCh1aW50OF90ICpmbGF0YnVmKSB7CisgIC8vIE9wdGlvbmFsOiB3ZSBjYW4gc3BlY2lmeSByZXNvbHZlciBhbmQgcmVoYXNoZXIgZnVuY3Rpb25zIHRvIHR1cm4gaGFzaGVkCisgIC8vIHN0cmluZ3MgaW50byBvYmplY3QgcG9pbnRlcnMgYW5kIGJhY2ssIHRvIGltcGxlbWVudCByZW1vdGUgcmVmZXJlbmNlcworICAvLyBhbmQgc3VjaC4KKyAgYXV0byByZXNvbHZlciA9IGZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90KAorICAgICAgW10odm9pZCAqKnBvaW50ZXJfYWRyLCBmbGF0YnVmZmVyczo6aGFzaF92YWx1ZV90IGhhc2gpIHsKKyAgICAgICAgKHZvaWQpcG9pbnRlcl9hZHI7CisgICAgICAgICh2b2lkKWhhc2g7CisgICAgICAgIC8vIERvbid0IGFjdHVhbGx5IGRvIGFueXRoaW5nLCBsZWF2ZSB2YXJpYWJsZSBudWxsLgorICAgICAgfSk7CisgIGF1dG8gcmVoYXNoZXIgPSBmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCgKKyAgICAgIFtdKHZvaWQgKnBvaW50ZXIpIC0+IGZsYXRidWZmZXJzOjpoYXNoX3ZhbHVlX3QgeworICAgICAgICAodm9pZClwb2ludGVyOworICAgICAgICByZXR1cm4gMDsKKyAgICAgIH0pOworCisgIC8vIFR1cm4gYSBidWZmZXIgaW50byBDKysgb2JqZWN0cy4KKyAgYXV0byBtb25zdGVyMSA9IFVuUGFja01vbnN0ZXIoZmxhdGJ1ZiwgJnJlc29sdmVyKTsKKworICAvLyBSZS1zZXJpYWxpemUgdGhlIGRhdGEuCisgIGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciBmYmIxOworICBmYmIxLkZpbmlzaChDcmVhdGVNb25zdGVyKGZiYjEsIG1vbnN0ZXIxLmdldCgpLCAmcmVoYXNoZXIpLAorICAgICAgICAgICAgICBNb25zdGVySWRlbnRpZmllcigpKTsKKworICAvLyBVbnBhY2sgYWdhaW4sIGFuZCByZS1zZXJpYWxpemUgYWdhaW4uCisgIGF1dG8gbW9uc3RlcjIgPSBVblBhY2tNb25zdGVyKGZiYjEuR2V0QnVmZmVyUG9pbnRlcigpLCAmcmVzb2x2ZXIpOworICBmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgZmJiMjsKKyAgZmJiMi5GaW5pc2goQ3JlYXRlTW9uc3RlcihmYmIyLCBtb25zdGVyMi5nZXQoKSwgJnJlaGFzaGVyKSwKKyAgICAgICAgICAgICAgTW9uc3RlcklkZW50aWZpZXIoKSk7CisKKyAgLy8gTm93IHdlJ3ZlIGdvbmUgZnVsbCByb3VuZC10cmlwLCB0aGUgdHdvIGJ1ZmZlcnMgc2hvdWxkIG1hdGNoLgorICBjb25zdCBhdXRvIGxlbjEgPSBmYmIxLkdldFNpemUoKTsKKyAgY29uc3QgYXV0byBsZW4yID0gZmJiMi5HZXRTaXplKCk7CisgIFRFU1RfRVEobGVuMSwgbGVuMik7CisgIFRFU1RfRVEobWVtY21wKGZiYjEuR2V0QnVmZmVyUG9pbnRlcigpLCBmYmIyLkdldEJ1ZmZlclBvaW50ZXIoKSwgbGVuMSksIDApOworCisgIC8vIFRlc3QgaXQgd2l0aCB0aGUgb3JpZ2luYWwgYnVmZmVyIHRlc3QgdG8gbWFrZSBzdXJlIGFsbCBkYXRhIHN1cnZpdmVkLgorICBBY2Nlc3NGbGF0QnVmZmVyVGVzdChmYmIyLkdldEJ1ZmZlclBvaW50ZXIoKSwgbGVuMiwgZmFsc2UpOworCisgIC8vIFRlc3QgYWNjZXNzaW5nIGZpZWxkcywgc2ltaWxhciB0byBBY2Nlc3NGbGF0QnVmZmVyVGVzdCBhYm92ZS4KKyAgQ2hlY2tNb25zdGVyT2JqZWN0KG1vbnN0ZXIyLmdldCgpKTsKKworICAvLyBUZXN0IG9iamVjdCBjb3B5LgorICBhdXRvIG1vbnN0ZXIzID0gKm1vbnN0ZXIyOworICBmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgZmJiMzsKKyAgZmJiMy5GaW5pc2goQ3JlYXRlTW9uc3RlcihmYmIzLCAmbW9uc3RlcjMsICZyZWhhc2hlciksIE1vbnN0ZXJJZGVudGlmaWVyKCkpOworICBjb25zdCBhdXRvIGxlbjMgPSBmYmIzLkdldFNpemUoKTsKKyAgVEVTVF9FUShsZW4yLCBsZW4zKTsKKyAgVEVTVF9FUShtZW1jbXAoZmJiMi5HZXRCdWZmZXJQb2ludGVyKCksIGZiYjMuR2V0QnVmZmVyUG9pbnRlcigpLCBsZW4yKSwgMCk7CisgIC8vIERlbGV0ZSBtb25zdGVyMSBhbmQgbW9uc3RlcjIsIHRoZW4gdGVzdCBhY2Nlc3NpbmcgZmllbGRzIGluIG1vbnN0ZXIzLgorICBtb25zdGVyMS5yZXNldCgpOworICBtb25zdGVyMi5yZXNldCgpOworICBDaGVja01vbnN0ZXJPYmplY3QoJm1vbnN0ZXIzKTsKK30KKworLy8gVXRpbGl0eSBmdW5jdGlvbiB0byBjaGVjayBhIE1vbnN0ZXIgb2JqZWN0Lgordm9pZCBDaGVja01vbnN0ZXJPYmplY3QoTW9uc3RlclQgKm1vbnN0ZXIyKSB7CisgIFRFU1RfRVEobW9uc3RlcjItPmhwLCA4MCk7CisgIFRFU1RfRVEobW9uc3RlcjItPm1hbmEsIDE1MCk7ICAvLyBkZWZhdWx0CisgIFRFU1RfRVFfU1RSKG1vbnN0ZXIyLT5uYW1lLmNfc3RyKCksICJNeU1vbnN0ZXIiKTsKKworICBhdXRvICZwb3MgPSBtb25zdGVyMi0+cG9zOworICBURVNUX05PVE5VTEwocG9zKTsKKyAgVEVTVF9FUShwb3MtPnooKSwgMyk7CisgIFRFU1RfRVEocG9zLT50ZXN0MygpLmEoKSwgMTApOworICBURVNUX0VRKHBvcy0+dGVzdDMoKS5iKCksIDIwKTsKKworICBhdXRvICZpbnZlbnRvcnkgPSBtb25zdGVyMi0+aW52ZW50b3J5OworICBURVNUX0VRKGludmVudG9yeS5zaXplKCksIDEwVUwpOworICB1bnNpZ25lZCBjaGFyIGludl9kYXRhW10gPSB7IDAsIDEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDkgfTsKKyAgZm9yIChhdXRvIGl0ID0gaW52ZW50b3J5LmJlZ2luKCk7IGl0ICE9IGludmVudG9yeS5lbmQoKTsgKytpdCkKKyAgICBURVNUX0VRKCppdCwgaW52X2RhdGFbaXQgLSBpbnZlbnRvcnkuYmVnaW4oKV0pOworCisgIFRFU1RfRVEobW9uc3RlcjItPmNvbG9yLCBDb2xvcl9CbHVlKTsKKworICBhdXRvIG1vbnN0ZXIzID0gbW9uc3RlcjItPnRlc3QuQXNNb25zdGVyKCk7CisgIFRFU1RfTk9UTlVMTChtb25zdGVyMyk7CisgIFRFU1RfRVFfU1RSKG1vbnN0ZXIzLT5uYW1lLmNfc3RyKCksICJGcmVkIik7CisKKyAgYXV0byAmdmVjb2ZzdHJpbmdzID0gbW9uc3RlcjItPnRlc3RhcnJheW9mc3RyaW5nOworICBURVNUX0VRKHZlY29mc3RyaW5ncy5zaXplKCksIDRVKTsKKyAgVEVTVF9FUV9TVFIodmVjb2ZzdHJpbmdzWzBdLmNfc3RyKCksICJib2IiKTsKKyAgVEVTVF9FUV9TVFIodmVjb2ZzdHJpbmdzWzFdLmNfc3RyKCksICJmcmVkIik7CisKKyAgYXV0byAmdmVjb2ZzdHJpbmdzMiA9IG1vbnN0ZXIyLT50ZXN0YXJyYXlvZnN0cmluZzI7CisgIFRFU1RfRVEodmVjb2ZzdHJpbmdzMi5zaXplKCksIDJVKTsKKyAgVEVTVF9FUV9TVFIodmVjb2ZzdHJpbmdzMlswXS5jX3N0cigpLCAiamFuZSIpOworICBURVNUX0VRX1NUUih2ZWNvZnN0cmluZ3MyWzFdLmNfc3RyKCksICJtYXJ5Iik7CisKKyAgYXV0byAmdmVjb2Z0YWJsZXMgPSBtb25zdGVyMi0+dGVzdGFycmF5b2Z0YWJsZXM7CisgIFRFU1RfRVEodmVjb2Z0YWJsZXMuc2l6ZSgpLCAzVSk7CisgIFRFU1RfRVFfU1RSKHZlY29mdGFibGVzWzBdLT5uYW1lLmNfc3RyKCksICJCYXJuZXkiKTsKKyAgVEVTVF9FUSh2ZWNvZnRhYmxlc1swXS0+aHAsIDEwMDApOworICBURVNUX0VRX1NUUih2ZWNvZnRhYmxlc1sxXS0+bmFtZS5jX3N0cigpLCAiRnJlZCIpOworICBURVNUX0VRX1NUUih2ZWNvZnRhYmxlc1syXS0+bmFtZS5jX3N0cigpLCAiV2lsbWEiKTsKKworICBhdXRvICZ0ZXN0cyA9IG1vbnN0ZXIyLT50ZXN0NDsKKyAgVEVTVF9FUSh0ZXN0c1swXS5hKCksIDEwKTsKKyAgVEVTVF9FUSh0ZXN0c1swXS5iKCksIDIwKTsKKyAgVEVTVF9FUSh0ZXN0c1sxXS5hKCksIDMwKTsKKyAgVEVTVF9FUSh0ZXN0c1sxXS5iKCksIDQwKTsKK30KKworLy8gUHJlZml4IGEgRmxhdEJ1ZmZlciB3aXRoIGEgc2l6ZSBmaWVsZC4KK3ZvaWQgU2l6ZVByZWZpeGVkVGVzdCgpIHsKKyAgLy8gQ3JlYXRlIHNpemUgcHJlZml4ZWQgYnVmZmVyLgorICBmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgZmJiOworICBGaW5pc2hTaXplUHJlZml4ZWRNb25zdGVyQnVmZmVyKAorICAgICAgZmJiLCBDcmVhdGVNb25zdGVyKGZiYiwgbnVsbHB0ciwgMjAwLCAzMDAsIGZiYi5DcmVhdGVTdHJpbmcoImJvYiIpKSk7CisKKyAgLy8gVmVyaWZ5IGl0LgorICBmbGF0YnVmZmVyczo6VmVyaWZpZXIgdmVyaWZpZXIoZmJiLkdldEJ1ZmZlclBvaW50ZXIoKSwgZmJiLkdldFNpemUoKSk7CisgIFRFU1RfRVEoVmVyaWZ5U2l6ZVByZWZpeGVkTW9uc3RlckJ1ZmZlcih2ZXJpZmllciksIHRydWUpOworCisgIC8vIEFjY2VzcyBpdC4KKyAgYXV0byBtID0gR2V0U2l6ZVByZWZpeGVkTW9uc3RlcihmYmIuR2V0QnVmZmVyUG9pbnRlcigpKTsKKyAgVEVTVF9FUShtLT5tYW5hKCksIDIwMCk7CisgIFRFU1RfRVEobS0+aHAoKSwgMzAwKTsKKyAgVEVTVF9FUV9TVFIobS0+bmFtZSgpLT5jX3N0cigpLCAiYm9iIik7Cit9CisKK3ZvaWQgVGVzdE1vbnN0ZXJFeHRyYUZsb2F0cyhjb25zdCBzdGQ6OnN0cmluZyAmdGVzdHNfZGF0YV9wYXRoKSB7CisjaWYgZGVmaW5lZChGTEFUQlVGRkVSU19IQVNfTkVXX1NUUlRPRCkgJiYgKEZMQVRCVUZGRVJTX0hBU19ORVdfU1RSVE9EID4gMCkKKyAgVEVTVF9FUShpc19xdWlldF9uYW4oMS4wKSwgZmFsc2UpOworICBURVNUX0VRKGlzX3F1aWV0X25hbihpbmZpbml0eV9kKSwgZmFsc2UpOworICBURVNUX0VRKGlzX3F1aWV0X25hbigtaW5maW5pdHlfZiksIGZhbHNlKTsKKyAgVEVTVF9FUShpc19xdWlldF9uYW4oc3RkOjpudW1lcmljX2xpbWl0czxmbG9hdD46OnF1aWV0X05hTigpKSwgdHJ1ZSk7CisgIFRFU1RfRVEoaXNfcXVpZXRfbmFuKHN0ZDo6bnVtZXJpY19saW1pdHM8ZG91YmxlPjo6cXVpZXRfTmFOKCkpLCB0cnVlKTsKKworICB1c2luZyBuYW1lc3BhY2UgZmxhdGJ1ZmZlcnM7CisgIHVzaW5nIG5hbWVzcGFjZSBNeUdhbWU7CisgIC8vIExvYWQgRmxhdEJ1ZmZlciBzY2hlbWEgKC5mYnMpIGZyb20gZGlzay4KKyAgc3RkOjpzdHJpbmcgc2NoZW1hZmlsZTsKKyAgVEVTVF9FUShMb2FkRmlsZSgodGVzdHNfZGF0YV9wYXRoICsgIm1vbnN0ZXJfZXh0cmEuZmJzIikuY19zdHIoKSwgZmFsc2UsCisgICAgICAgICAgICAgICAgICAgJnNjaGVtYWZpbGUpLAorICAgICAgICAgIHRydWUpOworICAvLyBQYXJzZSBzY2hlbWEgZmlyc3QsIHNvIHdlIGNhbiB1c2UgaXQgdG8gcGFyc2UgdGhlIGRhdGEgYWZ0ZXIuCisgIFBhcnNlciBwYXJzZXI7CisgIGF1dG8gaW5jbHVkZV90ZXN0X3BhdGggPSBDb25DYXRQYXRoRmlsZU5hbWUodGVzdHNfZGF0YV9wYXRoLCAiaW5jbHVkZV90ZXN0Iik7CisgIGNvbnN0IGNoYXIgKmluY2x1ZGVfZGlyZWN0b3JpZXNbXSA9IHsgdGVzdHNfZGF0YV9wYXRoLmNfc3RyKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5jbHVkZV90ZXN0X3BhdGguY19zdHIoKSwgbnVsbHB0ciB9OworICBURVNUX0VRKHBhcnNlci5QYXJzZShzY2hlbWFmaWxlLmNfc3RyKCksIGluY2x1ZGVfZGlyZWN0b3JpZXMpLCB0cnVlKTsKKyAgLy8gQ3JlYXRlIGVtcHR5IGV4dHJhIGFuZCBzdG9yZSB0byBqc29uLgorICBwYXJzZXIub3B0cy5vdXRwdXRfZGVmYXVsdF9zY2FsYXJzX2luX2pzb24gPSB0cnVlOworICBwYXJzZXIub3B0cy5vdXRwdXRfZW51bV9pZGVudGlmaWVycyA9IHRydWU7CisgIEZsYXRCdWZmZXJCdWlsZGVyIGJ1aWxkZXI7CisgIGNvbnN0IGF1dG8gZGVmX3Jvb3QgPSBNb25zdGVyRXh0cmFCdWlsZGVyKGJ1aWxkZXIpLkZpbmlzaCgpOworICBGaW5pc2hNb25zdGVyRXh0cmFCdWZmZXIoYnVpbGRlciwgZGVmX3Jvb3QpOworICBjb25zdCBhdXRvIGRlZl9vYmogPSBidWlsZGVyLkdldEJ1ZmZlclBvaW50ZXIoKTsKKyAgY29uc3QgYXV0byBkZWZfZXh0cmEgPSBHZXRNb25zdGVyRXh0cmEoZGVmX29iaik7CisgIFRFU1RfTk9UTlVMTChkZWZfZXh0cmEpOworICBURVNUX0VRKGlzX3F1aWV0X25hbihkZWZfZXh0cmEtPmYwKCkpLCB0cnVlKTsKKyAgVEVTVF9FUShpc19xdWlldF9uYW4oZGVmX2V4dHJhLT5mMSgpKSwgdHJ1ZSk7CisgIFRFU1RfRVEoZGVmX2V4dHJhLT5mMigpLCAraW5maW5pdHlfZik7CisgIFRFU1RfRVEoZGVmX2V4dHJhLT5mMygpLCAtaW5maW5pdHlfZik7CisgIFRFU1RfRVEoaXNfcXVpZXRfbmFuKGRlZl9leHRyYS0+ZDAoKSksIHRydWUpOworICBURVNUX0VRKGlzX3F1aWV0X25hbihkZWZfZXh0cmEtPmQxKCkpLCB0cnVlKTsKKyAgVEVTVF9FUShkZWZfZXh0cmEtPmQyKCksICtpbmZpbml0eV9kKTsKKyAgVEVTVF9FUShkZWZfZXh0cmEtPmQzKCksIC1pbmZpbml0eV9kKTsKKyAgc3RkOjpzdHJpbmcganNvbmdlbjsKKyAgYXV0byByZXN1bHQgPSBHZW5lcmF0ZVRleHQocGFyc2VyLCBkZWZfb2JqLCAmanNvbmdlbik7CisgIFRFU1RfRVEocmVzdWx0LCB0cnVlKTsKKyAgLy8gQ2hlY2sgZXhwZWN0ZWQgZGVmYXVsdCB2YWx1ZXMuCisgIFRFU1RfRVEoc3RkOjpzdHJpbmc6Om5wb3MgIT0ganNvbmdlbi5maW5kKCJmMDogbmFuIiksIHRydWUpOworICBURVNUX0VRKHN0ZDo6c3RyaW5nOjpucG9zICE9IGpzb25nZW4uZmluZCgiZjE6IG5hbiIpLCB0cnVlKTsKKyAgVEVTVF9FUShzdGQ6OnN0cmluZzo6bnBvcyAhPSBqc29uZ2VuLmZpbmQoImYyOiBpbmYiKSwgdHJ1ZSk7CisgIFRFU1RfRVEoc3RkOjpzdHJpbmc6Om5wb3MgIT0ganNvbmdlbi5maW5kKCJmMzogLWluZiIpLCB0cnVlKTsKKyAgVEVTVF9FUShzdGQ6OnN0cmluZzo6bnBvcyAhPSBqc29uZ2VuLmZpbmQoImQwOiBuYW4iKSwgdHJ1ZSk7CisgIFRFU1RfRVEoc3RkOjpzdHJpbmc6Om5wb3MgIT0ganNvbmdlbi5maW5kKCJkMTogbmFuIiksIHRydWUpOworICBURVNUX0VRKHN0ZDo6c3RyaW5nOjpucG9zICE9IGpzb25nZW4uZmluZCgiZDI6IGluZiIpLCB0cnVlKTsKKyAgVEVTVF9FUShzdGQ6OnN0cmluZzo6bnBvcyAhPSBqc29uZ2VuLmZpbmQoImQzOiAtaW5mIiksIHRydWUpOworICAvLyBQYXJzZSAnbW9zdGVyZGF0YV9leHRyYS5qc29uJy4KKyAgY29uc3QgYXV0byBleHRyYV9iYXNlID0gdGVzdHNfZGF0YV9wYXRoICsgIm1vbnN0ZXJkYXRhX2V4dHJhIjsKKyAganNvbmdlbiA9ICIiOworICBURVNUX0VRKExvYWRGaWxlKChleHRyYV9iYXNlICsgIi5qc29uIikuY19zdHIoKSwgZmFsc2UsICZqc29uZ2VuKSwgdHJ1ZSk7CisgIFRFU1RfRVEocGFyc2VyLlBhcnNlKGpzb25nZW4uY19zdHIoKSksIHRydWUpOworICBjb25zdCBhdXRvIHRlc3RfZmlsZSA9IHBhcnNlci5idWlsZGVyXy5HZXRCdWZmZXJQb2ludGVyKCk7CisgIGNvbnN0IGF1dG8gdGVzdF9zaXplID0gcGFyc2VyLmJ1aWxkZXJfLkdldFNpemUoKTsKKyAgVmVyaWZpZXIgdmVyaWZpZXIodGVzdF9maWxlLCB0ZXN0X3NpemUpOworICBURVNUX0FTU0VSVChWZXJpZnlNb25zdGVyRXh0cmFCdWZmZXIodmVyaWZpZXIpKTsKKyAgY29uc3QgYXV0byBleHRyYSA9IEdldE1vbnN0ZXJFeHRyYSh0ZXN0X2ZpbGUpOworICBURVNUX05PVE5VTEwoZXh0cmEpOworICBURVNUX0VRKGlzX3F1aWV0X25hbihleHRyYS0+ZjAoKSksIHRydWUpOworICBURVNUX0VRKGlzX3F1aWV0X25hbihleHRyYS0+ZjEoKSksIHRydWUpOworICBURVNUX0VRKGV4dHJhLT5mMigpLCAraW5maW5pdHlfZik7CisgIFRFU1RfRVEoZXh0cmEtPmYzKCksIC1pbmZpbml0eV9mKTsKKyAgVEVTVF9FUShpc19xdWlldF9uYW4oZXh0cmEtPmQwKCkpLCB0cnVlKTsKKyAgVEVTVF9FUShleHRyYS0+ZDEoKSwgK2luZmluaXR5X2QpOworICBURVNUX0VRKGV4dHJhLT5kMigpLCAtaW5maW5pdHlfZCk7CisgIFRFU1RfRVEoaXNfcXVpZXRfbmFuKGV4dHJhLT5kMygpKSwgdHJ1ZSk7CisgIFRFU1RfTk9UTlVMTChleHRyYS0+ZnZlYygpKTsKKyAgVEVTVF9FUShleHRyYS0+ZnZlYygpLT5zaXplKCksIDQpOworICBURVNUX0VRKGV4dHJhLT5mdmVjKCktPkdldCgwKSwgMS4wZik7CisgIFRFU1RfRVEoZXh0cmEtPmZ2ZWMoKS0+R2V0KDEpLCAtaW5maW5pdHlfZik7CisgIFRFU1RfRVEoZXh0cmEtPmZ2ZWMoKS0+R2V0KDIpLCAraW5maW5pdHlfZik7CisgIFRFU1RfRVEoaXNfcXVpZXRfbmFuKGV4dHJhLT5mdmVjKCktPkdldCgzKSksIHRydWUpOworICBURVNUX05PVE5VTEwoZXh0cmEtPmR2ZWMoKSk7CisgIFRFU1RfRVEoZXh0cmEtPmR2ZWMoKS0+c2l6ZSgpLCA0KTsKKyAgVEVTVF9FUShleHRyYS0+ZHZlYygpLT5HZXQoMCksIDIuMCk7CisgIFRFU1RfRVEoZXh0cmEtPmR2ZWMoKS0+R2V0KDEpLCAraW5maW5pdHlfZCk7CisgIFRFU1RfRVEoZXh0cmEtPmR2ZWMoKS0+R2V0KDIpLCAtaW5maW5pdHlfZCk7CisgIFRFU1RfRVEoaXNfcXVpZXRfbmFuKGV4dHJhLT5kdmVjKCktPkdldCgzKSksIHRydWUpOworI2VuZGlmCit9CisKK3ZvaWQgRW51bU5hbWVzVGVzdCgpIHsKKyAgVEVTVF9FUV9TVFIoIlJlZCIsIEVudW1OYW1lQ29sb3IoQ29sb3JfUmVkKSk7CisgIFRFU1RfRVFfU1RSKCJHcmVlbiIsIEVudW1OYW1lQ29sb3IoQ29sb3JfR3JlZW4pKTsKKyAgVEVTVF9FUV9TVFIoIkJsdWUiLCBFbnVtTmFtZUNvbG9yKENvbG9yX0JsdWUpKTsKKyAgLy8gQ2hlY2sgdGhhdCBDb2xvciB0byBzdHJpbmcgZG9uJ3QgY3Jhc2ggd2hpbGUgZGVjb2RlIGEgbWl4dHVyZSBvZiBDb2xvcnMuCisgIC8vIDEpIEV4YW1wbGU6OkNvbG9yIGVudW0gaXMgZW51bSB3aXRoIHVuZml4ZWQgdW5kZXJseWluZyB0eXBlLgorICAvLyAyKSBWYWxpZCBlbnVtIHJhbmdlOiBbMDsgMl4oY2VpbChsb2cyKENvbG9yX0FOWSkpKSAtIDFdLgorICAvLyBDb25zZXF1ZW5jZTogQSB2YWx1ZSBpcyBvdXQgb2YgdGhpcyByYW5nZSB3aWxsIGxlYWQgdG8gVUIgKHNpbmNlIEMrKzE3KS4KKyAgLy8gRm9yIGRldGFpbHMgc2VlIEMrKzE3IHN0YW5kYXJkIG9yIGV4cGxhbmF0aW9uIG9uIHRoZSBTTzoKKyAgLy8gc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzE4MTk1MzEyL3doYXQtaGFwcGVucy1pZi15b3Utc3RhdGljLWNhc3QtaW52YWxpZC12YWx1ZS10by1lbnVtLWNsYXNzCisgIFRFU1RfRVFfU1RSKCIiLCBFbnVtTmFtZUNvbG9yKHN0YXRpY19jYXN0PENvbG9yPigwKSkpOworICBURVNUX0VRX1NUUigiIiwgRW51bU5hbWVDb2xvcihzdGF0aWNfY2FzdDxDb2xvcj4oQ29sb3JfQU5ZIC0gMSkpKTsKKyAgVEVTVF9FUV9TVFIoIiIsIEVudW1OYW1lQ29sb3Ioc3RhdGljX2Nhc3Q8Q29sb3I+KENvbG9yX0FOWSArIDEpKSk7Cit9CisKK3ZvaWQgVHlwZUFsaWFzZXNUZXN0KCkgeworICBmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgYnVpbGRlcjsKKworICBidWlsZGVyLkZpbmlzaChDcmVhdGVUeXBlQWxpYXNlcygKKyAgICAgIGJ1aWxkZXIsIGZsYXRidWZmZXJzOjpudW1lcmljX2xpbWl0czxpbnQ4X3Q+OjptaW4oKSwKKyAgICAgIGZsYXRidWZmZXJzOjpudW1lcmljX2xpbWl0czx1aW50OF90Pjo6bWF4KCksCisgICAgICBmbGF0YnVmZmVyczo6bnVtZXJpY19saW1pdHM8aW50MTZfdD46Om1pbigpLAorICAgICAgZmxhdGJ1ZmZlcnM6Om51bWVyaWNfbGltaXRzPHVpbnQxNl90Pjo6bWF4KCksCisgICAgICBmbGF0YnVmZmVyczo6bnVtZXJpY19saW1pdHM8aW50MzJfdD46Om1pbigpLAorICAgICAgZmxhdGJ1ZmZlcnM6Om51bWVyaWNfbGltaXRzPHVpbnQzMl90Pjo6bWF4KCksCisgICAgICBmbGF0YnVmZmVyczo6bnVtZXJpY19saW1pdHM8aW50NjRfdD46Om1pbigpLAorICAgICAgZmxhdGJ1ZmZlcnM6Om51bWVyaWNfbGltaXRzPHVpbnQ2NF90Pjo6bWF4KCksIDIuM2YsIDIuMykpOworCisgIGF1dG8gcCA9IGJ1aWxkZXIuR2V0QnVmZmVyUG9pbnRlcigpOworICBhdXRvIHRhID0gZmxhdGJ1ZmZlcnM6OkdldFJvb3Q8VHlwZUFsaWFzZXM+KHApOworCisgIFRFU1RfRVEodGEtPmk4KCksIGZsYXRidWZmZXJzOjpudW1lcmljX2xpbWl0czxpbnQ4X3Q+OjptaW4oKSk7CisgIFRFU1RfRVEodGEtPnU4KCksIGZsYXRidWZmZXJzOjpudW1lcmljX2xpbWl0czx1aW50OF90Pjo6bWF4KCkpOworICBURVNUX0VRKHRhLT5pMTYoKSwgZmxhdGJ1ZmZlcnM6Om51bWVyaWNfbGltaXRzPGludDE2X3Q+OjptaW4oKSk7CisgIFRFU1RfRVEodGEtPnUxNigpLCBmbGF0YnVmZmVyczo6bnVtZXJpY19saW1pdHM8dWludDE2X3Q+OjptYXgoKSk7CisgIFRFU1RfRVEodGEtPmkzMigpLCBmbGF0YnVmZmVyczo6bnVtZXJpY19saW1pdHM8aW50MzJfdD46Om1pbigpKTsKKyAgVEVTVF9FUSh0YS0+dTMyKCksIGZsYXRidWZmZXJzOjpudW1lcmljX2xpbWl0czx1aW50MzJfdD46Om1heCgpKTsKKyAgVEVTVF9FUSh0YS0+aTY0KCksIGZsYXRidWZmZXJzOjpudW1lcmljX2xpbWl0czxpbnQ2NF90Pjo6bWluKCkpOworICBURVNUX0VRKHRhLT51NjQoKSwgZmxhdGJ1ZmZlcnM6Om51bWVyaWNfbGltaXRzPHVpbnQ2NF90Pjo6bWF4KCkpOworICBURVNUX0VRKHRhLT5mMzIoKSwgMi4zZik7CisgIFRFU1RfRVEodGEtPmY2NCgpLCAyLjMpOworICB1c2luZyBuYW1lc3BhY2UgZmxhdGJ1ZmZlcnM7ICAvLyBpc19zYW1lCisgIHN0YXRpY19hc3NlcnQoaXNfc2FtZTxkZWNsdHlwZSh0YS0+aTgoKSksIGludDhfdD46OnZhbHVlLCAiaW52YWxpZCB0eXBlIik7CisgIHN0YXRpY19hc3NlcnQoaXNfc2FtZTxkZWNsdHlwZSh0YS0+aTE2KCkpLCBpbnQxNl90Pjo6dmFsdWUsICJpbnZhbGlkIHR5cGUiKTsKKyAgc3RhdGljX2Fzc2VydChpc19zYW1lPGRlY2x0eXBlKHRhLT5pMzIoKSksIGludDMyX3Q+Ojp2YWx1ZSwgImludmFsaWQgdHlwZSIpOworICBzdGF0aWNfYXNzZXJ0KGlzX3NhbWU8ZGVjbHR5cGUodGEtPmk2NCgpKSwgaW50NjRfdD46OnZhbHVlLCAiaW52YWxpZCB0eXBlIik7CisgIHN0YXRpY19hc3NlcnQoaXNfc2FtZTxkZWNsdHlwZSh0YS0+dTgoKSksIHVpbnQ4X3Q+Ojp2YWx1ZSwgImludmFsaWQgdHlwZSIpOworICBzdGF0aWNfYXNzZXJ0KGlzX3NhbWU8ZGVjbHR5cGUodGEtPnUxNigpKSwgdWludDE2X3Q+Ojp2YWx1ZSwgImludmFsaWQgdHlwZSIpOworICBzdGF0aWNfYXNzZXJ0KGlzX3NhbWU8ZGVjbHR5cGUodGEtPnUzMigpKSwgdWludDMyX3Q+Ojp2YWx1ZSwgImludmFsaWQgdHlwZSIpOworICBzdGF0aWNfYXNzZXJ0KGlzX3NhbWU8ZGVjbHR5cGUodGEtPnU2NCgpKSwgdWludDY0X3Q+Ojp2YWx1ZSwgImludmFsaWQgdHlwZSIpOworICBzdGF0aWNfYXNzZXJ0KGlzX3NhbWU8ZGVjbHR5cGUodGEtPmYzMigpKSwgZmxvYXQ+Ojp2YWx1ZSwgImludmFsaWQgdHlwZSIpOworICBzdGF0aWNfYXNzZXJ0KGlzX3NhbWU8ZGVjbHR5cGUodGEtPmY2NCgpKSwgZG91YmxlPjo6dmFsdWUsICJpbnZhbGlkIHR5cGUiKTsKK30KKworLy8gZXhhbXBsZSBvZiBwYXJzaW5nIHRleHQgc3RyYWlnaHQgaW50byBhIGJ1ZmZlciwgYW5kIGdlbmVyYXRpbmcKKy8vIHRleHQgYmFjayBmcm9tIGl0Ogordm9pZCBQYXJzZUFuZEdlbmVyYXRlVGV4dFRlc3QoY29uc3Qgc3RkOjpzdHJpbmcgJnRlc3RzX2RhdGFfcGF0aCwgYm9vbCBiaW5hcnkpIHsKKyAgLy8gbG9hZCBGbGF0QnVmZmVyIHNjaGVtYSAoLmZicykgYW5kIEpTT04gZnJvbSBkaXNrCisgIHN0ZDo6c3RyaW5nIHNjaGVtYWZpbGU7CisgIHN0ZDo6c3RyaW5nIGpzb25maWxlOworICBURVNUX0VRKGZsYXRidWZmZXJzOjpMb2FkRmlsZSgKKyAgICAgICAgICAgICAgKHRlc3RzX2RhdGFfcGF0aCArICJtb25zdGVyX3Rlc3QuIiArIChiaW5hcnkgPyAiYmZicyIgOiAiZmJzIikpCisgICAgICAgICAgICAgICAgICAuY19zdHIoKSwKKyAgICAgICAgICAgICAgYmluYXJ5LCAmc2NoZW1hZmlsZSksCisgICAgICAgICAgdHJ1ZSk7CisgIFRFU1RfRVEoZmxhdGJ1ZmZlcnM6OkxvYWRGaWxlKAorICAgICAgICAgICAgICAodGVzdHNfZGF0YV9wYXRoICsgIm1vbnN0ZXJkYXRhX3Rlc3QuZ29sZGVuIikuY19zdHIoKSwgZmFsc2UsCisgICAgICAgICAgICAgICZqc29uZmlsZSksCisgICAgICAgICAgdHJ1ZSk7CisKKyAgYXV0byBpbmNsdWRlX3Rlc3RfcGF0aCA9CisgICAgICBmbGF0YnVmZmVyczo6Q29uQ2F0UGF0aEZpbGVOYW1lKHRlc3RzX2RhdGFfcGF0aCwgImluY2x1ZGVfdGVzdCIpOworICBjb25zdCBjaGFyICppbmNsdWRlX2RpcmVjdG9yaWVzW10gPSB7IHRlc3RzX2RhdGFfcGF0aC5jX3N0cigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluY2x1ZGVfdGVzdF9wYXRoLmNfc3RyKCksIG51bGxwdHIgfTsKKworICAvLyBwYXJzZSBzY2hlbWEgZmlyc3QsIHNvIHdlIGNhbiB1c2UgaXQgdG8gcGFyc2UgdGhlIGRhdGEgYWZ0ZXIKKyAgZmxhdGJ1ZmZlcnM6OlBhcnNlciBwYXJzZXI7CisgIGlmIChiaW5hcnkpIHsKKyAgICBmbGF0YnVmZmVyczo6VmVyaWZpZXIgdmVyaWZpZXIoCisgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCAqPihzY2hlbWFmaWxlLmNfc3RyKCkpLAorICAgICAgICBzY2hlbWFmaWxlLnNpemUoKSk7CisgICAgVEVTVF9FUShyZWZsZWN0aW9uOjpWZXJpZnlTY2hlbWFCdWZmZXIodmVyaWZpZXIpLCB0cnVlKTsKKyAgICAvLyBhdXRvIHNjaGVtYSA9IHJlZmxlY3Rpb246OkdldFNjaGVtYShzY2hlbWFmaWxlLmNfc3RyKCkpOworICAgIFRFU1RfRVEocGFyc2VyLkRlc2VyaWFsaXplKAorICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCAqPihzY2hlbWFmaWxlLmNfc3RyKCkpLAorICAgICAgICAgICAgICAgIHNjaGVtYWZpbGUuc2l6ZSgpKSwKKyAgICAgICAgICAgIHRydWUpOworICB9IGVsc2UgeworICAgIFRFU1RfRVEocGFyc2VyLlBhcnNlKHNjaGVtYWZpbGUuY19zdHIoKSwgaW5jbHVkZV9kaXJlY3RvcmllcyksIHRydWUpOworICB9CisgIFRFU1RfRVEocGFyc2VyLlBhcnNlSnNvbihqc29uZmlsZS5jX3N0cigpKSwgdHJ1ZSk7CisKKyAgLy8gaGVyZSwgcGFyc2VyLmJ1aWxkZXJfIGNvbnRhaW5zIGEgYmluYXJ5IGJ1ZmZlciB0aGF0IGlzIHRoZSBwYXJzZWQgZGF0YS4KKworICAvLyBGaXJzdCwgdmVyaWZ5IGl0LCBqdXN0IGluIGNhc2U6CisgIGZsYXRidWZmZXJzOjpWZXJpZmllciB2ZXJpZmllcihwYXJzZXIuYnVpbGRlcl8uR2V0QnVmZmVyUG9pbnRlcigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VyLmJ1aWxkZXJfLkdldFNpemUoKSk7CisgIFRFU1RfRVEoVmVyaWZ5TW9uc3RlckJ1ZmZlcih2ZXJpZmllciksIHRydWUpOworCisgIEFjY2Vzc0ZsYXRCdWZmZXJUZXN0KHBhcnNlci5idWlsZGVyXy5HZXRCdWZmZXJQb2ludGVyKCksCisgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlci5idWlsZGVyXy5HZXRTaXplKCksIGZhbHNlKTsKKworICAvLyB0byBlbnN1cmUgaXQgaXMgY29ycmVjdCwgd2Ugbm93IGdlbmVyYXRlIHRleHQgYmFjayBmcm9tIHRoZSBiaW5hcnksCisgIC8vIGFuZCBjb21wYXJlIHRoZSB0d286CisgIHN0ZDo6c3RyaW5nIGpzb25nZW47CisgIGF1dG8gcmVzdWx0ID0KKyAgICAgIEdlbmVyYXRlVGV4dChwYXJzZXIsIHBhcnNlci5idWlsZGVyXy5HZXRCdWZmZXJQb2ludGVyKCksICZqc29uZ2VuKTsKKyAgVEVTVF9FUShyZXN1bHQsIHRydWUpOworICBURVNUX0VRX1NUUihqc29uZ2VuLmNfc3RyKCksIGpzb25maWxlLmNfc3RyKCkpOworCisgIC8vIFdlIGNhbiBhbHNvIGRvIHRoZSBhYm92ZSB1c2luZyB0aGUgY29udmVuaWVudCBSZWdpc3RyeSB0aGF0IGtub3dzIGFib3V0CisgIC8vIGEgc2V0IG9mIGZpbGVfaWRlbnRpZmllcnMgbWFwcGVkIHRvIHNjaGVtYXMuCisgIGZsYXRidWZmZXJzOjpSZWdpc3RyeSByZWdpc3RyeTsKKyAgLy8gTWFrZSBzdXJlIHNjaGVtYXMgY2FuIGZpbmQgdGhlaXIgaW5jbHVkZXMuCisgIHJlZ2lzdHJ5LkFkZEluY2x1ZGVEaXJlY3RvcnkodGVzdHNfZGF0YV9wYXRoLmNfc3RyKCkpOworICByZWdpc3RyeS5BZGRJbmNsdWRlRGlyZWN0b3J5KGluY2x1ZGVfdGVzdF9wYXRoLmNfc3RyKCkpOworICAvLyBDYWxsIHRoaXMgd2l0aCBtYW55IHNjaGVtYXMgaWYgcG9zc2libGUuCisgIHJlZ2lzdHJ5LlJlZ2lzdGVyKE1vbnN0ZXJJZGVudGlmaWVyKCksCisgICAgICAgICAgICAgICAgICAgICh0ZXN0c19kYXRhX3BhdGggKyAibW9uc3Rlcl90ZXN0LmZicyIpLmNfc3RyKCkpOworICAvLyBOb3cgd2UgZ290IHRoaXMgc2V0IHVwLCB3ZSBjYW4gcGFyc2UgYnkganVzdCBzcGVjaWZ5aW5nIHRoZSBpZGVudGlmaWVyLAorICAvLyB0aGUgY29ycmVjdCBzY2hlbWEgd2lsbCBiZSBsb2FkZWQgb24gdGhlIGZseToKKyAgYXV0byBidWYgPSByZWdpc3RyeS5UZXh0VG9GbGF0QnVmZmVyKGpzb25maWxlLmNfc3RyKCksIE1vbnN0ZXJJZGVudGlmaWVyKCkpOworICAvLyBJZiB0aGlzIGZhaWxzLCBjaGVjayByZWdpc3RyeS5sYXN0ZXJyb3JfLgorICBURVNUX05PVE5VTEwoYnVmLmRhdGEoKSk7CisgIC8vIFRlc3QgdGhlIGJ1ZmZlciwgdG8gYmUgc3VyZToKKyAgQWNjZXNzRmxhdEJ1ZmZlclRlc3QoYnVmLmRhdGEoKSwgYnVmLnNpemUoKSwgZmFsc2UpOworICAvLyBXZSBjYW4gdXNlIHRoZSByZWdpc3RyeSB0byB0dXJuIHRoaXMgYmFjayBpbnRvIHRleHQsIGluIHRoaXMgY2FzZSBpdAorICAvLyB3aWxsIGdldCB0aGUgZmlsZV9pZGVudGlmaWVyIGZyb20gdGhlIGJpbmFyeToKKyAgc3RkOjpzdHJpbmcgdGV4dDsKKyAgYXV0byBvayA9IHJlZ2lzdHJ5LkZsYXRCdWZmZXJUb1RleHQoYnVmLmRhdGEoKSwgYnVmLnNpemUoKSwgJnRleHQpOworICAvLyBJZiB0aGlzIGZhaWxzLCBjaGVjayByZWdpc3RyeS5sYXN0ZXJyb3JfLgorICBURVNUX0VRKG9rLCB0cnVlKTsKKyAgVEVTVF9FUV9TVFIodGV4dC5jX3N0cigpLCBqc29uZmlsZS5jX3N0cigpKTsKKworICAvLyBHZW5lcmF0ZSB0ZXh0IGZvciBVVEYtOCBzdHJpbmdzIHdpdGhvdXQgZXNjYXBlcy4KKyAgc3RkOjpzdHJpbmcganNvbmZpbGVfdXRmODsKKyAgVEVTVF9FUShmbGF0YnVmZmVyczo6TG9hZEZpbGUoKHRlc3RzX2RhdGFfcGF0aCArICJ1bmljb2RlX3Rlc3QuanNvbiIpLmNfc3RyKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlLCAmanNvbmZpbGVfdXRmOCksCisgICAgICAgICAgdHJ1ZSk7CisgIFRFU1RfRVEocGFyc2VyLlBhcnNlKGpzb25maWxlX3V0ZjguY19zdHIoKSwgaW5jbHVkZV9kaXJlY3RvcmllcyksIHRydWUpOworICAvLyBUbyBlbnN1cmUgaXQgaXMgY29ycmVjdCwgZ2VuZXJhdGUgdXRmLTggdGV4dCBiYWNrIGZyb20gdGhlIGJpbmFyeS4KKyAgc3RkOjpzdHJpbmcganNvbmdlbl91dGY4OworICAvLyByZXF1ZXN0IG5hdHVyYWwgcHJpbnRpbmcgZm9yIHV0Zi04IHN0cmluZ3MKKyAgcGFyc2VyLm9wdHMubmF0dXJhbF91dGY4ID0gdHJ1ZTsKKyAgcGFyc2VyLm9wdHMuc3RyaWN0X2pzb24gPSB0cnVlOworICBURVNUX0VRKAorICAgICAgR2VuZXJhdGVUZXh0KHBhcnNlciwgcGFyc2VyLmJ1aWxkZXJfLkdldEJ1ZmZlclBvaW50ZXIoKSwgJmpzb25nZW5fdXRmOCksCisgICAgICB0cnVlKTsKKyAgVEVTVF9FUV9TVFIoanNvbmdlbl91dGY4LmNfc3RyKCksIGpzb25maWxlX3V0ZjguY19zdHIoKSk7Cit9CisKK3ZvaWQgVW5QYWNrVG8oY29uc3QgdWludDhfdCAqZmxhdGJ1ZikgeworICAvLyBHZXQgYSBtb25zdGVyIHRoYXQgaGFzIGEgbmFtZSBhbmQgbm8gZW5lbXkKKyAgYXV0byBvcmlnX21vbnN0ZXIgPSBHZXRNb25zdGVyKGZsYXRidWYpOworICBURVNUX0VRX1NUUihvcmlnX21vbnN0ZXItPm5hbWUoKS0+Y19zdHIoKSwgIk15TW9uc3RlciIpOworICBURVNUX0FTU0VSVChvcmlnX21vbnN0ZXItPmVuZW15KCkgPT0gbnVsbHB0cik7CisKKyAgLy8gQ3JlYXRlIGFuIGVuZW15CisgIE1vbnN0ZXJUICplbmVteSA9IG5ldyBNb25zdGVyVCgpOworICBlbmVteS0+bmFtZSA9ICJFbmVteSI7CisKKyAgLy8gQW5kIGNyZWF0ZSBhbm90aGVyIG1vbnN0ZXIgb3duaW5nIHRoZSBlbmVteSwKKyAgTW9uc3RlclQgbW9uOworICBtb24ubmFtZSA9ICJJJ20gbW9uc3RlciAxIjsKKyAgbW9uLmVuZW15LnJlc2V0KGVuZW15KTsKKyAgVEVTVF9BU1NFUlQobW9uLmVuZW15ICE9IG51bGxwdHIpOworCisgIC8vIEFzc2VydCB0aGF0IGFsbCB0aGUgTW9uc3RlciBvYmplY3RzIGFyZSBjb3JyZWN0LgorICBURVNUX0VRX1NUUihtb24ubmFtZS5jX3N0cigpLCAiSSdtIG1vbnN0ZXIgMSIpOworICBURVNUX0VRX1NUUihlbmVteS0+bmFtZS5jX3N0cigpLCAiRW5lbXkiKTsKKyAgVEVTVF9FUV9TVFIobW9uLmVuZW15LT5uYW1lLmNfc3RyKCksICJFbmVteSIpOworCisgIC8vIE5vdyB1bnBhY2sgbW9uc3RlciAoIk15TW9uc3RlciIpIGludG8gbW9uc3RlcgorICBvcmlnX21vbnN0ZXItPlVuUGFja1RvKCZtb24pOworCisgIC8vIE1vbnN0ZXIgbmFtZSBzaG91bGQgYmUgZnJvbSBtb25zdGVyCisgIFRFU1RfRVFfU1RSKG1vbi5uYW1lLmNfc3RyKCksICJNeU1vbnN0ZXIiKTsKKworICAvLyBUaGUgbW9uc3RlciBzaG91bGRuJ3QgaGF2ZSBhbnkgZW5lbWllcywgYmVjYXVzZSBtb25zdGVyIGRpZG4ndC4KKyAgVEVTVF9BU1NFUlQobW9uLmVuZW15ID09IG51bGxwdHIpOworfQorCit9ICAvLyBuYW1lc3BhY2UgdGVzdHMKK30gIC8vIG5hbWVzcGFjZSBmbGF0YnVmZmVycwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL21vbnN0ZXJfdGVzdC5mYnMgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9tb25zdGVyX3Rlc3QuZmJzCmluZGV4IGIyOGRkYzguLjE0ZDM0Y2IgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL21vbnN0ZXJfdGVzdC5mYnMKKysrIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvbW9uc3Rlcl90ZXN0LmZicwpAQCAtNzAsNiArNzAsMTAgQEAKICAgYzogQWJpbGl0eTsKIH0KIAorc3RydWN0IFN0cnVjdE9mU3RydWN0c09mU3RydWN0cyB7CisgYTogU3RydWN0T2ZTdHJ1Y3RzOworfQorCiB0YWJsZSBTdGF0IHsKICAgaWQ6c3RyaW5nOwogICB2YWw6bG9uZzsKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL21vbnN0ZXJfdGVzdC5ncnBjLmZiLmggYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9tb25zdGVyX3Rlc3QuZ3JwYy5mYi5oCmluZGV4IDRkNzI2ZTEuLmUzZjMwMzcgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL21vbnN0ZXJfdGVzdC5ncnBjLmZiLmgKKysrIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvbW9uc3Rlcl90ZXN0LmdycGMuZmIuaApAQCAtMjAxLDcgKzIwMSw3IEBACiAgICAgICBCYXNlQ2xhc3NNdXN0QmVEZXJpdmVkRnJvbVNlcnZpY2UodGhpcyk7CiAgICAgfQogICAgIC8vIGRpc2FibGUgc3luY2hyb25vdXMgdmVyc2lvbiBvZiB0aGlzIG1ldGhvZAotICAgIDo6Z3JwYzo6U3RhdHVzIEdldE1heEhpdFBvaW50KDo6Z3JwYzo6U2VydmVyQ29udGV4dCogLypjb250ZXh0Ki8sIDo6Z3JwYzo6U2VydmVyUmVhZGVyPCBmbGF0YnVmZmVyczo6Z3JwYzo6TWVzc2FnZTxNb25zdGVyPj4qIC8qcmVhZGVyKi8sIGZsYXRidWZmZXJzOjpncnBjOjpNZXNzYWdlPFN0YXQ+KiByZXNwb25zZSkgZmluYWwgb3ZlcnJpZGUgeworICAgIDo6Z3JwYzo6U3RhdHVzIEdldE1heEhpdFBvaW50KDo6Z3JwYzo6U2VydmVyQ29udGV4dCogLypjb250ZXh0Ki8sIDo6Z3JwYzo6U2VydmVyUmVhZGVyPCBmbGF0YnVmZmVyczo6Z3JwYzo6TWVzc2FnZTxNb25zdGVyPj4qIC8qcmVhZGVyKi8sIGZsYXRidWZmZXJzOjpncnBjOjpNZXNzYWdlPFN0YXQ+KiAvKnJlc3BvbnNlKi8pIGZpbmFsIG92ZXJyaWRlIHsKICAgICAgIGFib3J0KCk7CiAgICAgICByZXR1cm4gOjpncnBjOjpTdGF0dXMoOjpncnBjOjpTdGF0dXNDb2RlOjpVTklNUExFTUVOVEVELCAiIik7CiAgICAgfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvbW9uc3Rlcl90ZXN0LmggYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9tb25zdGVyX3Rlc3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YWI5NjhiCi0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvbW9uc3Rlcl90ZXN0LmgKQEAgLTAsMCArMSwzOCBAQAorI2lmbmRlZiBURVNUU19NT05TVEVSX1RFU1RfSAorI2RlZmluZSBURVNUU19NT05TVEVSX1RFU1RfSAorCisjaW5jbHVkZSA8c3RyaW5nPgorCisjaW5jbHVkZSAiZmxhdGJ1ZmZlcnMvZGV0YWNoZWRfYnVmZmVyLmgiCisjaW5jbHVkZSAibW9uc3Rlcl90ZXN0X2dlbmVyYXRlZC5oIgorCituYW1lc3BhY2UgZmxhdGJ1ZmZlcnMgeworbmFtZXNwYWNlIHRlc3RzIHsKKworZmxhdGJ1ZmZlcnM6OkRldGFjaGVkQnVmZmVyIENyZWF0ZUZsYXRCdWZmZXJUZXN0KHN0ZDo6c3RyaW5nICZidWZmZXIpOworCit2b2lkIEFjY2Vzc0ZsYXRCdWZmZXJUZXN0KGNvbnN0IHVpbnQ4X3QgKmZsYXRidWYsIHNpemVfdCBsZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgcG9vbGVkID0gdHJ1ZSk7IAorCit2b2lkIE11dGF0ZUZsYXRCdWZmZXJzVGVzdCh1aW50OF90ICpmbGF0YnVmLCBzdGQ6OnNpemVfdCBsZW5ndGgpOworCit2b2lkIE9iamVjdEZsYXRCdWZmZXJzVGVzdCh1aW50OF90ICpmbGF0YnVmKTsKKwordm9pZCBDaGVja01vbnN0ZXJPYmplY3QoTXlHYW1lOjpFeGFtcGxlOjpNb25zdGVyVCAqbW9uc3RlcjIpOworCit2b2lkIFNpemVQcmVmaXhlZFRlc3QoKTsKKwordm9pZCBUZXN0TW9uc3RlckV4dHJhRmxvYXRzKGNvbnN0IHN0ZDo6c3RyaW5nJiB0ZXN0c19kYXRhX3BhdGgpOworCit2b2lkIEVudW1OYW1lc1Rlc3QoKTsKKwordm9pZCBUeXBlQWxpYXNlc1Rlc3QoKTsKKwordm9pZCBQYXJzZUFuZEdlbmVyYXRlVGV4dFRlc3QoY29uc3Qgc3RkOjpzdHJpbmcmIHRlc3RzX2RhdGFfcGF0aCwgYm9vbCBiaW5hcnkpOworCit2b2lkIFVuUGFja1RvKGNvbnN0IHVpbnQ4X3QgKmZsYXRidWYpOworCit9ICAvLyBuYW1lc3BhY2UgdGVzdHMKK30gIC8vIG5hbWVzcGFjZSBmbGF0YnVmZmVycworCisjZW5kaWYKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9tb25zdGVyX3Rlc3Quc2NoZW1hLmpzb24gYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9tb25zdGVyX3Rlc3Quc2NoZW1hLmpzb24KaW5kZXggNzUxNzI2OS4uNWU5OGVmNCAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvbW9uc3Rlcl90ZXN0LnNjaGVtYS5qc29uCisrKyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL21vbnN0ZXJfdGVzdC5zY2hlbWEuanNvbgpAQCAtMTQwLDYgKzE0MCwxNSBAQAogICAgICAgfSwKICAgICAgICJhZGRpdGlvbmFsUHJvcGVydGllcyIgOiBmYWxzZQogICAgIH0sCisgICAgIk15R2FtZV9FeGFtcGxlX1N0cnVjdE9mU3RydWN0c09mU3RydWN0cyIgOiB7CisgICAgICAidHlwZSIgOiAib2JqZWN0IiwKKyAgICAgICJwcm9wZXJ0aWVzIiA6IHsKKyAgICAgICAgImEiIDogeworICAgICAgICAgICAgICAgICIkcmVmIiA6ICIjL2RlZmluaXRpb25zL015R2FtZV9FeGFtcGxlX1N0cnVjdE9mU3RydWN0cyIKKyAgICAgICAgICAgICAgfQorICAgICAgfSwKKyAgICAgICJhZGRpdGlvbmFsUHJvcGVydGllcyIgOiBmYWxzZQorICAgIH0sCiAgICAgIk15R2FtZV9FeGFtcGxlX1N0YXQiIDogewogICAgICAgInR5cGUiIDogIm9iamVjdCIsCiAgICAgICAicHJvcGVydGllcyIgOiB7CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9tb25zdGVyX3Rlc3QvbW9kLnJzIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvbW9uc3Rlcl90ZXN0L21vZC5ycwppbmRleCBmZGJjMjZiLi43ZjFmYWIxIDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9tb25zdGVyX3Rlc3QvbW9kLnJzCisrKyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL21vbnN0ZXJfdGVzdC9tb2QucnMKQEAgLTEsNCArMSw1IEBACiAvLyBBdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBieSB0aGUgRmxhdGJ1ZmZlcnMgY29tcGlsZXIuIERvIG5vdCBtb2RpZnkuCisvLyBAZ2VuZXJhdGVkCiBwdWIgbW9kIG15X2dhbWUgewogICB1c2Ugc3VwZXI6Oio7CiAgIHB1YiBtb2QgZXhhbXBsZSB7CkBAIC0yNSw2ICsyNiw4IEBACiAgICAgcHViIHVzZSBzZWxmOjphYmlsaXR5X2dlbmVyYXRlZDo6KjsKICAgICBtb2Qgc3RydWN0X29mX3N0cnVjdHNfZ2VuZXJhdGVkOwogICAgIHB1YiB1c2Ugc2VsZjo6c3RydWN0X29mX3N0cnVjdHNfZ2VuZXJhdGVkOjoqOworICAgIG1vZCBzdHJ1Y3Rfb2Zfc3RydWN0c19vZl9zdHJ1Y3RzX2dlbmVyYXRlZDsKKyAgICBwdWIgdXNlIHNlbGY6OnN0cnVjdF9vZl9zdHJ1Y3RzX29mX3N0cnVjdHNfZ2VuZXJhdGVkOjoqOwogICAgIG1vZCBzdGF0X2dlbmVyYXRlZDsKICAgICBwdWIgdXNlIHNlbGY6OnN0YXRfZ2VuZXJhdGVkOjoqOwogICAgIG1vZCByZWZlcnJhYmxlX2dlbmVyYXRlZDsKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL21vbnN0ZXJfdGVzdC9teV9nYW1lL2V4YW1wbGUvYWJpbGl0eV9nZW5lcmF0ZWQucnMgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9tb25zdGVyX3Rlc3QvbXlfZ2FtZS9leGFtcGxlL2FiaWxpdHlfZ2VuZXJhdGVkLnJzCmluZGV4IDU3NDZlOGUuLmQxZjE3N2MgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL21vbnN0ZXJfdGVzdC9teV9nYW1lL2V4YW1wbGUvYWJpbGl0eV9nZW5lcmF0ZWQucnMKKysrIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvbW9uc3Rlcl90ZXN0L215X2dhbWUvZXhhbXBsZS9hYmlsaXR5X2dlbmVyYXRlZC5ycwpAQCAtMSw3ICsxLDEyIEBACiAvLyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBieSB0aGUgRmxhdEJ1ZmZlcnMgY29tcGlsZXIsIGRvIG5vdCBtb2RpZnkKKy8vIEBnZW5lcmF0ZWQKK2V4dGVybiBjcmF0ZSBhbGxvYzsKIGV4dGVybiBjcmF0ZSBmbGF0YnVmZmVyczsKLXVzZSBzdGQ6Om1lbTsKLXVzZSBzdGQ6OmNtcDo6T3JkZXJpbmc7Cit1c2UgYWxsb2M6OmJveGVkOjpCb3g7Cit1c2UgYWxsb2M6OnN0cmluZzo6e1N0cmluZywgVG9TdHJpbmd9OwordXNlIGFsbG9jOjp2ZWM6OlZlYzsKK3VzZSBjb3JlOjptZW07Cit1c2UgY29yZTo6Y21wOjpPcmRlcmluZzsKIHVzZSBzZWxmOjpmbGF0YnVmZmVyczo6e0VuZGlhblNjYWxhciwgRm9sbG93fTsKIHVzZSBzdXBlcjo6KjsKIC8vIHN0cnVjdCBBYmlsaXR5LCBhbGlnbmVkIHRvIDQKQEAgLTEzLDggKzE4LDggQEAKICAgICBTZWxmKFswOyA4XSkKICAgfQogfQotaW1wbCBzdGQ6OmZtdDo6RGVidWcgZm9yIEFiaWxpdHkgewotICBmbiBmbXQoJnNlbGYsIGY6ICZtdXQgc3RkOjpmbXQ6OkZvcm1hdHRlcikgLT4gc3RkOjpmbXQ6OlJlc3VsdCB7CitpbXBsIGNvcmU6OmZtdDo6RGVidWcgZm9yIEFiaWxpdHkgeworICBmbiBmbXQoJnNlbGYsIGY6ICZtdXQgY29yZTo6Zm10OjpGb3JtYXR0ZXIpIC0+IGNvcmU6OmZtdDo6UmVzdWx0IHsKICAgICBmLmRlYnVnX3N0cnVjdCgiQWJpbGl0eSIpCiAgICAgICAuZmllbGQoImlkIiwgJnNlbGYuaWQoKSkKICAgICAgIC5maWVsZCgiZGlzdGFuY2UiLCAmc2VsZi5kaXN0YW5jZSgpKQpAQCAtNDMsNyArNDgsNyBAQAogICAgICNbaW5saW5lXQogICAgIGZuIHB1c2goJnNlbGYsIGRzdDogJm11dCBbdThdLCBfcmVzdDogJlt1OF0pIHsKICAgICAgICAgbGV0IHNyYyA9IHVuc2FmZSB7Ci0gICAgICAgICAgICA6OnN0ZDo6c2xpY2U6OmZyb21fcmF3X3BhcnRzKHNlbGYgYXMgKmNvbnN0IEFiaWxpdHkgYXMgKmNvbnN0IHU4LCBTZWxmOjpzaXplKCkpCisgICAgICAgICAgICA6OmNvcmU6OnNsaWNlOjpmcm9tX3Jhd19wYXJ0cyhzZWxmIGFzICpjb25zdCBBYmlsaXR5IGFzICpjb25zdCB1OCwgU2VsZjo6c2l6ZSgpKQogICAgICAgICB9OwogICAgICAgICBkc3QuY29weV9mcm9tX3NsaWNlKHNyYyk7CiAgICAgfQpAQCAtNTQsNyArNTksNyBAQAogICAgICNbaW5saW5lXQogICAgIGZuIHB1c2goJnNlbGYsIGRzdDogJm11dCBbdThdLCBfcmVzdDogJlt1OF0pIHsKICAgICAgICAgbGV0IHNyYyA9IHVuc2FmZSB7Ci0gICAgICAgICAgICA6OnN0ZDo6c2xpY2U6OmZyb21fcmF3X3BhcnRzKCpzZWxmIGFzICpjb25zdCBBYmlsaXR5IGFzICpjb25zdCB1OCwgU2VsZjo6c2l6ZSgpKQorICAgICAgICAgICAgOjpjb3JlOjpzbGljZTo6ZnJvbV9yYXdfcGFydHMoKnNlbGYgYXMgKmNvbnN0IEFiaWxpdHkgYXMgKmNvbnN0IHU4LCBTZWxmOjpzaXplKCkpCiAgICAgICAgIH07CiAgICAgICAgIGRzdC5jb3B5X2Zyb21fc2xpY2Uoc3JjKTsKICAgICB9CkBAIC0xMTUsNyArMTIwLDcgQEAKICAgfQogCiAgICNbaW5saW5lXQotICBwdWIgZm4ga2V5X2NvbXBhcmVfd2l0aF92YWx1ZSgmc2VsZiwgdmFsOiB1MzIpIC0+IDo6c3RkOjpjbXA6Ok9yZGVyaW5nIHsKKyAgcHViIGZuIGtleV9jb21wYXJlX3dpdGhfdmFsdWUoJnNlbGYsIHZhbDogdTMyKSAtPiA6OmNvcmU6OmNtcDo6T3JkZXJpbmcgewogICAgIGxldCBrZXkgPSBzZWxmLmlkKCk7CiAgICAga2V5LmNtcCgmdmFsKQogICB9CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9tb25zdGVyX3Rlc3QvbXlfZ2FtZS9leGFtcGxlL2FueV9hbWJpZ3VvdXNfYWxpYXNlc19nZW5lcmF0ZWQucnMgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9tb25zdGVyX3Rlc3QvbXlfZ2FtZS9leGFtcGxlL2FueV9hbWJpZ3VvdXNfYWxpYXNlc19nZW5lcmF0ZWQucnMKaW5kZXggMzIxMDA3YS4uZWU4Y2JhNyAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvbW9uc3Rlcl90ZXN0L215X2dhbWUvZXhhbXBsZS9hbnlfYW1iaWd1b3VzX2FsaWFzZXNfZ2VuZXJhdGVkLnJzCisrKyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL21vbnN0ZXJfdGVzdC9teV9nYW1lL2V4YW1wbGUvYW55X2FtYmlndW91c19hbGlhc2VzX2dlbmVyYXRlZC5ycwpAQCAtMSw3ICsxLDEyIEBACiAvLyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBieSB0aGUgRmxhdEJ1ZmZlcnMgY29tcGlsZXIsIGRvIG5vdCBtb2RpZnkKKy8vIEBnZW5lcmF0ZWQKK2V4dGVybiBjcmF0ZSBhbGxvYzsKIGV4dGVybiBjcmF0ZSBmbGF0YnVmZmVyczsKLXVzZSBzdGQ6Om1lbTsKLXVzZSBzdGQ6OmNtcDo6T3JkZXJpbmc7Cit1c2UgYWxsb2M6OmJveGVkOjpCb3g7Cit1c2UgYWxsb2M6OnN0cmluZzo6e1N0cmluZywgVG9TdHJpbmd9OwordXNlIGFsbG9jOjp2ZWM6OlZlYzsKK3VzZSBjb3JlOjptZW07Cit1c2UgY29yZTo6Y21wOjpPcmRlcmluZzsKIHVzZSBzZWxmOjpmbGF0YnVmZmVyczo6e0VuZGlhblNjYWxhciwgRm9sbG93fTsKIHVzZSBzdXBlcjo6KjsKICNbZGVwcmVjYXRlZChzaW5jZSA9ICIyLjAuMCIsIG5vdGUgPSAiVXNlIGFzc29jaWF0ZWQgY29uc3RhbnRzIGluc3RlYWQuIFRoaXMgd2lsbCBubyBsb25nZXIgYmUgZ2VuZXJhdGVkIGluIDIwMjEuIildCkBAIC00Niw4ICs1MSw4IEBACiAgICAgfQogICB9CiB9Ci1pbXBsIHN0ZDo6Zm10OjpEZWJ1ZyBmb3IgQW55QW1iaWd1b3VzQWxpYXNlcyB7Ci0gIGZuIGZtdCgmc2VsZiwgZjogJm11dCBzdGQ6OmZtdDo6Rm9ybWF0dGVyKSAtPiBzdGQ6OmZtdDo6UmVzdWx0IHsKK2ltcGwgY29yZTo6Zm10OjpEZWJ1ZyBmb3IgQW55QW1iaWd1b3VzQWxpYXNlcyB7CisgIGZuIGZtdCgmc2VsZiwgZjogJm11dCBjb3JlOjpmbXQ6OkZvcm1hdHRlcikgLT4gY29yZTo6Zm10OjpSZXN1bHQgewogICAgIGlmIGxldCBTb21lKG5hbWUpID0gc2VsZi52YXJpYW50X25hbWUoKSB7CiAgICAgICBmLndyaXRlX3N0cihuYW1lKQogICAgIH0gZWxzZSB7CkBAIC0xMzUsNyArMTQwLDcgQEAKICAgLy8vIElmIHRoZSB1bmlvbiB2YXJpYW50IG1hdGNoZXMsIHJldHVybiB0aGUgb3duZWQgTW9uc3RlclQsIHNldHRpbmcgdGhlIHVuaW9uIHRvIE5PTkUuCiAgIHB1YiBmbiB0YWtlX20xKCZtdXQgc2VsZikgLT4gT3B0aW9uPEJveDxNb25zdGVyVD4+IHsKICAgICBpZiBsZXQgU2VsZjo6TTEoXykgPSBzZWxmIHsKLSAgICAgIGxldCB2ID0gc3RkOjptZW06OnJlcGxhY2Uoc2VsZiwgU2VsZjo6Tk9ORSk7CisgICAgICBsZXQgdiA9IGNvcmU6Om1lbTo6cmVwbGFjZShzZWxmLCBTZWxmOjpOT05FKTsKICAgICAgIGlmIGxldCBTZWxmOjpNMSh3KSA9IHYgewogICAgICAgICBTb21lKHcpCiAgICAgICB9IGVsc2UgewpAQCAtMTU2LDcgKzE2MSw3IEBACiAgIC8vLyBJZiB0aGUgdW5pb24gdmFyaWFudCBtYXRjaGVzLCByZXR1cm4gdGhlIG93bmVkIE1vbnN0ZXJULCBzZXR0aW5nIHRoZSB1bmlvbiB0byBOT05FLgogICBwdWIgZm4gdGFrZV9tMigmbXV0IHNlbGYpIC0+IE9wdGlvbjxCb3g8TW9uc3RlclQ+PiB7CiAgICAgaWYgbGV0IFNlbGY6Ok0yKF8pID0gc2VsZiB7Ci0gICAgICBsZXQgdiA9IHN0ZDo6bWVtOjpyZXBsYWNlKHNlbGYsIFNlbGY6Ok5PTkUpOworICAgICAgbGV0IHYgPSBjb3JlOjptZW06OnJlcGxhY2Uoc2VsZiwgU2VsZjo6Tk9ORSk7CiAgICAgICBpZiBsZXQgU2VsZjo6TTIodykgPSB2IHsKICAgICAgICAgU29tZSh3KQogICAgICAgfSBlbHNlIHsKQEAgLTE3Nyw3ICsxODIsNyBAQAogICAvLy8gSWYgdGhlIHVuaW9uIHZhcmlhbnQgbWF0Y2hlcywgcmV0dXJuIHRoZSBvd25lZCBNb25zdGVyVCwgc2V0dGluZyB0aGUgdW5pb24gdG8gTk9ORS4KICAgcHViIGZuIHRha2VfbTMoJm11dCBzZWxmKSAtPiBPcHRpb248Qm94PE1vbnN0ZXJUPj4gewogICAgIGlmIGxldCBTZWxmOjpNMyhfKSA9IHNlbGYgewotICAgICAgbGV0IHYgPSBzdGQ6Om1lbTo6cmVwbGFjZShzZWxmLCBTZWxmOjpOT05FKTsKKyAgICAgIGxldCB2ID0gY29yZTo6bWVtOjpyZXBsYWNlKHNlbGYsIFNlbGY6Ok5PTkUpOwogICAgICAgaWYgbGV0IFNlbGY6Ok0zKHcpID0gdiB7CiAgICAgICAgIFNvbWUodykKICAgICAgIH0gZWxzZSB7CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9tb25zdGVyX3Rlc3QvbXlfZ2FtZS9leGFtcGxlL2FueV9nZW5lcmF0ZWQucnMgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9tb25zdGVyX3Rlc3QvbXlfZ2FtZS9leGFtcGxlL2FueV9nZW5lcmF0ZWQucnMKaW5kZXggNmY3ZjZmZC4uYWRkZGMxMCAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvbW9uc3Rlcl90ZXN0L215X2dhbWUvZXhhbXBsZS9hbnlfZ2VuZXJhdGVkLnJzCisrKyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL21vbnN0ZXJfdGVzdC9teV9nYW1lL2V4YW1wbGUvYW55X2dlbmVyYXRlZC5ycwpAQCAtMSw3ICsxLDEyIEBACiAvLyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBieSB0aGUgRmxhdEJ1ZmZlcnMgY29tcGlsZXIsIGRvIG5vdCBtb2RpZnkKKy8vIEBnZW5lcmF0ZWQKK2V4dGVybiBjcmF0ZSBhbGxvYzsKIGV4dGVybiBjcmF0ZSBmbGF0YnVmZmVyczsKLXVzZSBzdGQ6Om1lbTsKLXVzZSBzdGQ6OmNtcDo6T3JkZXJpbmc7Cit1c2UgYWxsb2M6OmJveGVkOjpCb3g7Cit1c2UgYWxsb2M6OnN0cmluZzo6e1N0cmluZywgVG9TdHJpbmd9OwordXNlIGFsbG9jOjp2ZWM6OlZlYzsKK3VzZSBjb3JlOjptZW07Cit1c2UgY29yZTo6Y21wOjpPcmRlcmluZzsKIHVzZSBzZWxmOjpmbGF0YnVmZmVyczo6e0VuZGlhblNjYWxhciwgRm9sbG93fTsKIHVzZSBzdXBlcjo6KjsKICNbZGVwcmVjYXRlZChzaW5jZSA9ICIyLjAuMCIsIG5vdGUgPSAiVXNlIGFzc29jaWF0ZWQgY29uc3RhbnRzIGluc3RlYWQuIFRoaXMgd2lsbCBubyBsb25nZXIgYmUgZ2VuZXJhdGVkIGluIDIwMjEuIildCkBAIC00Niw4ICs1MSw4IEBACiAgICAgfQogICB9CiB9Ci1pbXBsIHN0ZDo6Zm10OjpEZWJ1ZyBmb3IgQW55IHsKLSAgZm4gZm10KCZzZWxmLCBmOiAmbXV0IHN0ZDo6Zm10OjpGb3JtYXR0ZXIpIC0+IHN0ZDo6Zm10OjpSZXN1bHQgeworaW1wbCBjb3JlOjpmbXQ6OkRlYnVnIGZvciBBbnkgeworICBmbiBmbXQoJnNlbGYsIGY6ICZtdXQgY29yZTo6Zm10OjpGb3JtYXR0ZXIpIC0+IGNvcmU6OmZtdDo6UmVzdWx0IHsKICAgICBpZiBsZXQgU29tZShuYW1lKSA9IHNlbGYudmFyaWFudF9uYW1lKCkgewogICAgICAgZi53cml0ZV9zdHIobmFtZSkKICAgICB9IGVsc2UgewpAQCAtMTM1LDcgKzE0MCw3IEBACiAgIC8vLyBJZiB0aGUgdW5pb24gdmFyaWFudCBtYXRjaGVzLCByZXR1cm4gdGhlIG93bmVkIE1vbnN0ZXJULCBzZXR0aW5nIHRoZSB1bmlvbiB0byBOT05FLgogICBwdWIgZm4gdGFrZV9tb25zdGVyKCZtdXQgc2VsZikgLT4gT3B0aW9uPEJveDxNb25zdGVyVD4+IHsKICAgICBpZiBsZXQgU2VsZjo6TW9uc3RlcihfKSA9IHNlbGYgewotICAgICAgbGV0IHYgPSBzdGQ6Om1lbTo6cmVwbGFjZShzZWxmLCBTZWxmOjpOT05FKTsKKyAgICAgIGxldCB2ID0gY29yZTo6bWVtOjpyZXBsYWNlKHNlbGYsIFNlbGY6Ok5PTkUpOwogICAgICAgaWYgbGV0IFNlbGY6Ok1vbnN0ZXIodykgPSB2IHsKICAgICAgICAgU29tZSh3KQogICAgICAgfSBlbHNlIHsKQEAgLTE1Niw3ICsxNjEsNyBAQAogICAvLy8gSWYgdGhlIHVuaW9uIHZhcmlhbnQgbWF0Y2hlcywgcmV0dXJuIHRoZSBvd25lZCBUZXN0U2ltcGxlVGFibGVXaXRoRW51bVQsIHNldHRpbmcgdGhlIHVuaW9uIHRvIE5PTkUuCiAgIHB1YiBmbiB0YWtlX3Rlc3Rfc2ltcGxlX3RhYmxlX3dpdGhfZW51bSgmbXV0IHNlbGYpIC0+IE9wdGlvbjxCb3g8VGVzdFNpbXBsZVRhYmxlV2l0aEVudW1UPj4gewogICAgIGlmIGxldCBTZWxmOjpUZXN0U2ltcGxlVGFibGVXaXRoRW51bShfKSA9IHNlbGYgewotICAgICAgbGV0IHYgPSBzdGQ6Om1lbTo6cmVwbGFjZShzZWxmLCBTZWxmOjpOT05FKTsKKyAgICAgIGxldCB2ID0gY29yZTo6bWVtOjpyZXBsYWNlKHNlbGYsIFNlbGY6Ok5PTkUpOwogICAgICAgaWYgbGV0IFNlbGY6OlRlc3RTaW1wbGVUYWJsZVdpdGhFbnVtKHcpID0gdiB7CiAgICAgICAgIFNvbWUodykKICAgICAgIH0gZWxzZSB7CkBAIC0xNzcsNyArMTgyLDcgQEAKICAgLy8vIElmIHRoZSB1bmlvbiB2YXJpYW50IG1hdGNoZXMsIHJldHVybiB0aGUgb3duZWQgc3VwZXI6OmV4YW1wbGVfMjo6TW9uc3RlclQsIHNldHRpbmcgdGhlIHVuaW9uIHRvIE5PTkUuCiAgIHB1YiBmbiB0YWtlX215X2dhbWVfZXhhbXBsZV8yX21vbnN0ZXIoJm11dCBzZWxmKSAtPiBPcHRpb248Qm94PHN1cGVyOjpleGFtcGxlXzI6Ok1vbnN0ZXJUPj4gewogICAgIGlmIGxldCBTZWxmOjpNeUdhbWVFeGFtcGxlMk1vbnN0ZXIoXykgPSBzZWxmIHsKLSAgICAgIGxldCB2ID0gc3RkOjptZW06OnJlcGxhY2Uoc2VsZiwgU2VsZjo6Tk9ORSk7CisgICAgICBsZXQgdiA9IGNvcmU6Om1lbTo6cmVwbGFjZShzZWxmLCBTZWxmOjpOT05FKTsKICAgICAgIGlmIGxldCBTZWxmOjpNeUdhbWVFeGFtcGxlMk1vbnN0ZXIodykgPSB2IHsKICAgICAgICAgU29tZSh3KQogICAgICAgfSBlbHNlIHsKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL21vbnN0ZXJfdGVzdC9teV9nYW1lL2V4YW1wbGUvYW55X3VuaXF1ZV9hbGlhc2VzX2dlbmVyYXRlZC5ycyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL21vbnN0ZXJfdGVzdC9teV9nYW1lL2V4YW1wbGUvYW55X3VuaXF1ZV9hbGlhc2VzX2dlbmVyYXRlZC5ycwppbmRleCAxNzQ5ZDVkLi41MTQyZDBlIDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9tb25zdGVyX3Rlc3QvbXlfZ2FtZS9leGFtcGxlL2FueV91bmlxdWVfYWxpYXNlc19nZW5lcmF0ZWQucnMKKysrIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvbW9uc3Rlcl90ZXN0L215X2dhbWUvZXhhbXBsZS9hbnlfdW5pcXVlX2FsaWFzZXNfZ2VuZXJhdGVkLnJzCkBAIC0xLDcgKzEsMTIgQEAKIC8vIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGJ5IHRoZSBGbGF0QnVmZmVycyBjb21waWxlciwgZG8gbm90IG1vZGlmeQorLy8gQGdlbmVyYXRlZAorZXh0ZXJuIGNyYXRlIGFsbG9jOwogZXh0ZXJuIGNyYXRlIGZsYXRidWZmZXJzOwotdXNlIHN0ZDo6bWVtOwotdXNlIHN0ZDo6Y21wOjpPcmRlcmluZzsKK3VzZSBhbGxvYzo6Ym94ZWQ6OkJveDsKK3VzZSBhbGxvYzo6c3RyaW5nOjp7U3RyaW5nLCBUb1N0cmluZ307Cit1c2UgYWxsb2M6OnZlYzo6VmVjOwordXNlIGNvcmU6Om1lbTsKK3VzZSBjb3JlOjpjbXA6Ok9yZGVyaW5nOwogdXNlIHNlbGY6OmZsYXRidWZmZXJzOjp7RW5kaWFuU2NhbGFyLCBGb2xsb3d9OwogdXNlIHN1cGVyOjoqOwogI1tkZXByZWNhdGVkKHNpbmNlID0gIjIuMC4wIiwgbm90ZSA9ICJVc2UgYXNzb2NpYXRlZCBjb25zdGFudHMgaW5zdGVhZC4gVGhpcyB3aWxsIG5vIGxvbmdlciBiZSBnZW5lcmF0ZWQgaW4gMjAyMS4iKV0KQEAgLTQ2LDggKzUxLDggQEAKICAgICB9CiAgIH0KIH0KLWltcGwgc3RkOjpmbXQ6OkRlYnVnIGZvciBBbnlVbmlxdWVBbGlhc2VzIHsKLSAgZm4gZm10KCZzZWxmLCBmOiAmbXV0IHN0ZDo6Zm10OjpGb3JtYXR0ZXIpIC0+IHN0ZDo6Zm10OjpSZXN1bHQgeworaW1wbCBjb3JlOjpmbXQ6OkRlYnVnIGZvciBBbnlVbmlxdWVBbGlhc2VzIHsKKyAgZm4gZm10KCZzZWxmLCBmOiAmbXV0IGNvcmU6OmZtdDo6Rm9ybWF0dGVyKSAtPiBjb3JlOjpmbXQ6OlJlc3VsdCB7CiAgICAgaWYgbGV0IFNvbWUobmFtZSkgPSBzZWxmLnZhcmlhbnRfbmFtZSgpIHsKICAgICAgIGYud3JpdGVfc3RyKG5hbWUpCiAgICAgfSBlbHNlIHsKQEAgLTEzNSw3ICsxNDAsNyBAQAogICAvLy8gSWYgdGhlIHVuaW9uIHZhcmlhbnQgbWF0Y2hlcywgcmV0dXJuIHRoZSBvd25lZCBNb25zdGVyVCwgc2V0dGluZyB0aGUgdW5pb24gdG8gTk9ORS4KICAgcHViIGZuIHRha2VfbSgmbXV0IHNlbGYpIC0+IE9wdGlvbjxCb3g8TW9uc3RlclQ+PiB7CiAgICAgaWYgbGV0IFNlbGY6Ok0oXykgPSBzZWxmIHsKLSAgICAgIGxldCB2ID0gc3RkOjptZW06OnJlcGxhY2Uoc2VsZiwgU2VsZjo6Tk9ORSk7CisgICAgICBsZXQgdiA9IGNvcmU6Om1lbTo6cmVwbGFjZShzZWxmLCBTZWxmOjpOT05FKTsKICAgICAgIGlmIGxldCBTZWxmOjpNKHcpID0gdiB7CiAgICAgICAgIFNvbWUodykKICAgICAgIH0gZWxzZSB7CkBAIC0xNTYsNyArMTYxLDcgQEAKICAgLy8vIElmIHRoZSB1bmlvbiB2YXJpYW50IG1hdGNoZXMsIHJldHVybiB0aGUgb3duZWQgVGVzdFNpbXBsZVRhYmxlV2l0aEVudW1ULCBzZXR0aW5nIHRoZSB1bmlvbiB0byBOT05FLgogICBwdWIgZm4gdGFrZV90cygmbXV0IHNlbGYpIC0+IE9wdGlvbjxCb3g8VGVzdFNpbXBsZVRhYmxlV2l0aEVudW1UPj4gewogICAgIGlmIGxldCBTZWxmOjpUUyhfKSA9IHNlbGYgewotICAgICAgbGV0IHYgPSBzdGQ6Om1lbTo6cmVwbGFjZShzZWxmLCBTZWxmOjpOT05FKTsKKyAgICAgIGxldCB2ID0gY29yZTo6bWVtOjpyZXBsYWNlKHNlbGYsIFNlbGY6Ok5PTkUpOwogICAgICAgaWYgbGV0IFNlbGY6OlRTKHcpID0gdiB7CiAgICAgICAgIFNvbWUodykKICAgICAgIH0gZWxzZSB7CkBAIC0xNzcsNyArMTgyLDcgQEAKICAgLy8vIElmIHRoZSB1bmlvbiB2YXJpYW50IG1hdGNoZXMsIHJldHVybiB0aGUgb3duZWQgc3VwZXI6OmV4YW1wbGVfMjo6TW9uc3RlclQsIHNldHRpbmcgdGhlIHVuaW9uIHRvIE5PTkUuCiAgIHB1YiBmbiB0YWtlX20yKCZtdXQgc2VsZikgLT4gT3B0aW9uPEJveDxzdXBlcjo6ZXhhbXBsZV8yOjpNb25zdGVyVD4+IHsKICAgICBpZiBsZXQgU2VsZjo6TTIoXykgPSBzZWxmIHsKLSAgICAgIGxldCB2ID0gc3RkOjptZW06OnJlcGxhY2Uoc2VsZiwgU2VsZjo6Tk9ORSk7CisgICAgICBsZXQgdiA9IGNvcmU6Om1lbTo6cmVwbGFjZShzZWxmLCBTZWxmOjpOT05FKTsKICAgICAgIGlmIGxldCBTZWxmOjpNMih3KSA9IHYgewogICAgICAgICBTb21lKHcpCiAgICAgICB9IGVsc2UgewpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvbW9uc3Rlcl90ZXN0L215X2dhbWUvZXhhbXBsZS9jb2xvcl9nZW5lcmF0ZWQucnMgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9tb25zdGVyX3Rlc3QvbXlfZ2FtZS9leGFtcGxlL2NvbG9yX2dlbmVyYXRlZC5ycwppbmRleCA0YTMyODJiLi4xYjkyODdmIDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9tb25zdGVyX3Rlc3QvbXlfZ2FtZS9leGFtcGxlL2NvbG9yX2dlbmVyYXRlZC5ycworKysgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9tb25zdGVyX3Rlc3QvbXlfZ2FtZS9leGFtcGxlL2NvbG9yX2dlbmVyYXRlZC5ycwpAQCAtMSw3ICsxLDEyIEBACiAvLyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBieSB0aGUgRmxhdEJ1ZmZlcnMgY29tcGlsZXIsIGRvIG5vdCBtb2RpZnkKKy8vIEBnZW5lcmF0ZWQKK2V4dGVybiBjcmF0ZSBhbGxvYzsKIGV4dGVybiBjcmF0ZSBmbGF0YnVmZmVyczsKLXVzZSBzdGQ6Om1lbTsKLXVzZSBzdGQ6OmNtcDo6T3JkZXJpbmc7Cit1c2UgYWxsb2M6OmJveGVkOjpCb3g7Cit1c2UgYWxsb2M6OnN0cmluZzo6e1N0cmluZywgVG9TdHJpbmd9OwordXNlIGFsbG9jOjp2ZWM6OlZlYzsKK3VzZSBjb3JlOjptZW07Cit1c2UgY29yZTo6Y21wOjpPcmRlcmluZzsKIHVzZSBzZWxmOjpmbGF0YnVmZmVyczo6e0VuZGlhblNjYWxhciwgRm9sbG93fTsKIHVzZSBzdXBlcjo6KjsKICNbYWxsb3cobm9uX3VwcGVyX2Nhc2VfZ2xvYmFscyldCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9tb25zdGVyX3Rlc3QvbXlfZ2FtZS9leGFtcGxlL2xvbmdfZW51bV9nZW5lcmF0ZWQucnMgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9tb25zdGVyX3Rlc3QvbXlfZ2FtZS9leGFtcGxlL2xvbmdfZW51bV9nZW5lcmF0ZWQucnMKaW5kZXggYjIyZjgyNi4uNmEyNGQ3NCAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvbW9uc3Rlcl90ZXN0L215X2dhbWUvZXhhbXBsZS9sb25nX2VudW1fZ2VuZXJhdGVkLnJzCisrKyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL21vbnN0ZXJfdGVzdC9teV9nYW1lL2V4YW1wbGUvbG9uZ19lbnVtX2dlbmVyYXRlZC5ycwpAQCAtMSw3ICsxLDEyIEBACiAvLyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBieSB0aGUgRmxhdEJ1ZmZlcnMgY29tcGlsZXIsIGRvIG5vdCBtb2RpZnkKKy8vIEBnZW5lcmF0ZWQKK2V4dGVybiBjcmF0ZSBhbGxvYzsKIGV4dGVybiBjcmF0ZSBmbGF0YnVmZmVyczsKLXVzZSBzdGQ6Om1lbTsKLXVzZSBzdGQ6OmNtcDo6T3JkZXJpbmc7Cit1c2UgYWxsb2M6OmJveGVkOjpCb3g7Cit1c2UgYWxsb2M6OnN0cmluZzo6e1N0cmluZywgVG9TdHJpbmd9OwordXNlIGFsbG9jOjp2ZWM6OlZlYzsKK3VzZSBjb3JlOjptZW07Cit1c2UgY29yZTo6Y21wOjpPcmRlcmluZzsKIHVzZSBzZWxmOjpmbGF0YnVmZmVyczo6e0VuZGlhblNjYWxhciwgRm9sbG93fTsKIHVzZSBzdXBlcjo6KjsKICNbYWxsb3cobm9uX3VwcGVyX2Nhc2VfZ2xvYmFscyldCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9tb25zdGVyX3Rlc3QvbXlfZ2FtZS9leGFtcGxlL21vbnN0ZXJfZ2VuZXJhdGVkLnJzIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvbW9uc3Rlcl90ZXN0L215X2dhbWUvZXhhbXBsZS9tb25zdGVyX2dlbmVyYXRlZC5ycwppbmRleCA1OGU3NjI4Li5kZDMyNWIyIDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9tb25zdGVyX3Rlc3QvbXlfZ2FtZS9leGFtcGxlL21vbnN0ZXJfZ2VuZXJhdGVkLnJzCisrKyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL21vbnN0ZXJfdGVzdC9teV9nYW1lL2V4YW1wbGUvbW9uc3Rlcl9nZW5lcmF0ZWQucnMKQEAgLTEsNyArMSwxMiBAQAogLy8gYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgYnkgdGhlIEZsYXRCdWZmZXJzIGNvbXBpbGVyLCBkbyBub3QgbW9kaWZ5CisvLyBAZ2VuZXJhdGVkCitleHRlcm4gY3JhdGUgYWxsb2M7CiBleHRlcm4gY3JhdGUgZmxhdGJ1ZmZlcnM7Ci11c2Ugc3RkOjptZW07Ci11c2Ugc3RkOjpjbXA6Ok9yZGVyaW5nOwordXNlIGFsbG9jOjpib3hlZDo6Qm94OwordXNlIGFsbG9jOjpzdHJpbmc6OntTdHJpbmcsIFRvU3RyaW5nfTsKK3VzZSBhbGxvYzo6dmVjOjpWZWM7Cit1c2UgY29yZTo6bWVtOwordXNlIGNvcmU6OmNtcDo6T3JkZXJpbmc7CiB1c2Ugc2VsZjo6ZmxhdGJ1ZmZlcnM6OntFbmRpYW5TY2FsYXIsIEZvbGxvd307CiB1c2Ugc3VwZXI6Oio7CiBwdWIgZW51bSBNb25zdGVyT2Zmc2V0IHt9CkBAIC0zNzksNyArMzg0LDcgQEAKICAgfQogCiAgICNbaW5saW5lXQotICBwdWIgZm4ga2V5X2NvbXBhcmVfd2l0aF92YWx1ZSgmc2VsZiwgdmFsOiAmIHN0cikgLT4gOjpzdGQ6OmNtcDo6T3JkZXJpbmcgeworICBwdWIgZm4ga2V5X2NvbXBhcmVfd2l0aF92YWx1ZSgmc2VsZiwgdmFsOiAmIHN0cikgLT4gOjpjb3JlOjpjbXA6Ok9yZGVyaW5nIHsKICAgICBsZXQga2V5ID0gc2VsZi5uYW1lKCk7CiAgICAga2V5LmNtcCh2YWwpCiAgIH0KQEAgLTExMTYsOCArMTEyMSw4IEBACiAgIH0KIH0KIAotaW1wbCBzdGQ6OmZtdDo6RGVidWcgZm9yIE1vbnN0ZXI8J18+IHsKLSAgZm4gZm10KCZzZWxmLCBmOiAmbXV0IHN0ZDo6Zm10OjpGb3JtYXR0ZXI8J18+KSAtPiBzdGQ6OmZtdDo6UmVzdWx0IHsKK2ltcGwgY29yZTo6Zm10OjpEZWJ1ZyBmb3IgTW9uc3RlcjwnXz4geworICBmbiBmbXQoJnNlbGYsIGY6ICZtdXQgY29yZTo6Zm10OjpGb3JtYXR0ZXI8J18+KSAtPiBjb3JlOjpmbXQ6OlJlc3VsdCB7CiAgICAgbGV0IG11dCBkcyA9IGYuZGVidWdfc3RydWN0KCJNb25zdGVyIik7CiAgICAgICBkcy5maWVsZCgicG9zIiwgJnNlbGYucG9zKCkpOwogICAgICAgZHMuZmllbGQoIm1hbmEiLCAmc2VsZi5tYW5hKCkpOwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvbW9uc3Rlcl90ZXN0L215X2dhbWUvZXhhbXBsZS9yYWNlX2dlbmVyYXRlZC5ycyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL21vbnN0ZXJfdGVzdC9teV9nYW1lL2V4YW1wbGUvcmFjZV9nZW5lcmF0ZWQucnMKaW5kZXggYWIwMTJmOS4uNDdmMzg1NSAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvbW9uc3Rlcl90ZXN0L215X2dhbWUvZXhhbXBsZS9yYWNlX2dlbmVyYXRlZC5ycworKysgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9tb25zdGVyX3Rlc3QvbXlfZ2FtZS9leGFtcGxlL3JhY2VfZ2VuZXJhdGVkLnJzCkBAIC0xLDcgKzEsMTIgQEAKIC8vIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGJ5IHRoZSBGbGF0QnVmZmVycyBjb21waWxlciwgZG8gbm90IG1vZGlmeQorLy8gQGdlbmVyYXRlZAorZXh0ZXJuIGNyYXRlIGFsbG9jOwogZXh0ZXJuIGNyYXRlIGZsYXRidWZmZXJzOwotdXNlIHN0ZDo6bWVtOwotdXNlIHN0ZDo6Y21wOjpPcmRlcmluZzsKK3VzZSBhbGxvYzo6Ym94ZWQ6OkJveDsKK3VzZSBhbGxvYzo6c3RyaW5nOjp7U3RyaW5nLCBUb1N0cmluZ307Cit1c2UgYWxsb2M6OnZlYzo6VmVjOwordXNlIGNvcmU6Om1lbTsKK3VzZSBjb3JlOjpjbXA6Ok9yZGVyaW5nOwogdXNlIHNlbGY6OmZsYXRidWZmZXJzOjp7RW5kaWFuU2NhbGFyLCBGb2xsb3d9OwogdXNlIHN1cGVyOjoqOwogI1tkZXByZWNhdGVkKHNpbmNlID0gIjIuMC4wIiwgbm90ZSA9ICJVc2UgYXNzb2NpYXRlZCBjb25zdGFudHMgaW5zdGVhZC4gVGhpcyB3aWxsIG5vIGxvbmdlciBiZSBnZW5lcmF0ZWQgaW4gMjAyMS4iKV0KQEAgLTQ2LDggKzUxLDggQEAKICAgICB9CiAgIH0KIH0KLWltcGwgc3RkOjpmbXQ6OkRlYnVnIGZvciBSYWNlIHsKLSAgZm4gZm10KCZzZWxmLCBmOiAmbXV0IHN0ZDo6Zm10OjpGb3JtYXR0ZXIpIC0+IHN0ZDo6Zm10OjpSZXN1bHQgeworaW1wbCBjb3JlOjpmbXQ6OkRlYnVnIGZvciBSYWNlIHsKKyAgZm4gZm10KCZzZWxmLCBmOiAmbXV0IGNvcmU6OmZtdDo6Rm9ybWF0dGVyKSAtPiBjb3JlOjpmbXQ6OlJlc3VsdCB7CiAgICAgaWYgbGV0IFNvbWUobmFtZSkgPSBzZWxmLnZhcmlhbnRfbmFtZSgpIHsKICAgICAgIGYud3JpdGVfc3RyKG5hbWUpCiAgICAgfSBlbHNlIHsKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL21vbnN0ZXJfdGVzdC9teV9nYW1lL2V4YW1wbGUvcmVmZXJyYWJsZV9nZW5lcmF0ZWQucnMgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9tb25zdGVyX3Rlc3QvbXlfZ2FtZS9leGFtcGxlL3JlZmVycmFibGVfZ2VuZXJhdGVkLnJzCmluZGV4IDg3N2UzYjguLjgxYTlkNjAgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL21vbnN0ZXJfdGVzdC9teV9nYW1lL2V4YW1wbGUvcmVmZXJyYWJsZV9nZW5lcmF0ZWQucnMKKysrIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvbW9uc3Rlcl90ZXN0L215X2dhbWUvZXhhbXBsZS9yZWZlcnJhYmxlX2dlbmVyYXRlZC5ycwpAQCAtMSw3ICsxLDEyIEBACiAvLyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBieSB0aGUgRmxhdEJ1ZmZlcnMgY29tcGlsZXIsIGRvIG5vdCBtb2RpZnkKKy8vIEBnZW5lcmF0ZWQKK2V4dGVybiBjcmF0ZSBhbGxvYzsKIGV4dGVybiBjcmF0ZSBmbGF0YnVmZmVyczsKLXVzZSBzdGQ6Om1lbTsKLXVzZSBzdGQ6OmNtcDo6T3JkZXJpbmc7Cit1c2UgYWxsb2M6OmJveGVkOjpCb3g7Cit1c2UgYWxsb2M6OnN0cmluZzo6e1N0cmluZywgVG9TdHJpbmd9OwordXNlIGFsbG9jOjp2ZWM6OlZlYzsKK3VzZSBjb3JlOjptZW07Cit1c2UgY29yZTo6Y21wOjpPcmRlcmluZzsKIHVzZSBzZWxmOjpmbGF0YnVmZmVyczo6e0VuZGlhblNjYWxhciwgRm9sbG93fTsKIHVzZSBzdXBlcjo6KjsKIHB1YiBlbnVtIFJlZmVycmFibGVPZmZzZXQge30KQEAgLTU3LDcgKzYyLDcgQEAKICAgfQogCiAgICNbaW5saW5lXQotICBwdWIgZm4ga2V5X2NvbXBhcmVfd2l0aF92YWx1ZSgmc2VsZiwgdmFsOiB1NjQpIC0+IDo6c3RkOjpjbXA6Ok9yZGVyaW5nIHsKKyAgcHViIGZuIGtleV9jb21wYXJlX3dpdGhfdmFsdWUoJnNlbGYsIHZhbDogdTY0KSAtPiA6OmNvcmU6OmNtcDo6T3JkZXJpbmcgewogICAgIGxldCBrZXkgPSBzZWxmLmlkKCk7CiAgICAga2V5LmNtcCgmdmFsKQogICB9CkBAIC0xMTEsOCArMTE2LDggQEAKICAgfQogfQogCi1pbXBsIHN0ZDo6Zm10OjpEZWJ1ZyBmb3IgUmVmZXJyYWJsZTwnXz4gewotICBmbiBmbXQoJnNlbGYsIGY6ICZtdXQgc3RkOjpmbXQ6OkZvcm1hdHRlcjwnXz4pIC0+IHN0ZDo6Zm10OjpSZXN1bHQgeworaW1wbCBjb3JlOjpmbXQ6OkRlYnVnIGZvciBSZWZlcnJhYmxlPCdfPiB7CisgIGZuIGZtdCgmc2VsZiwgZjogJm11dCBjb3JlOjpmbXQ6OkZvcm1hdHRlcjwnXz4pIC0+IGNvcmU6OmZtdDo6UmVzdWx0IHsKICAgICBsZXQgbXV0IGRzID0gZi5kZWJ1Z19zdHJ1Y3QoIlJlZmVycmFibGUiKTsKICAgICAgIGRzLmZpZWxkKCJpZCIsICZzZWxmLmlkKCkpOwogICAgICAgZHMuZmluaXNoKCkKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL21vbnN0ZXJfdGVzdC9teV9nYW1lL2V4YW1wbGUvc3RhdF9nZW5lcmF0ZWQucnMgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9tb25zdGVyX3Rlc3QvbXlfZ2FtZS9leGFtcGxlL3N0YXRfZ2VuZXJhdGVkLnJzCmluZGV4IGQ2ZTVmYWQuLjk4YmMzMzEgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL21vbnN0ZXJfdGVzdC9teV9nYW1lL2V4YW1wbGUvc3RhdF9nZW5lcmF0ZWQucnMKKysrIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvbW9uc3Rlcl90ZXN0L215X2dhbWUvZXhhbXBsZS9zdGF0X2dlbmVyYXRlZC5ycwpAQCAtMSw3ICsxLDEyIEBACiAvLyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBieSB0aGUgRmxhdEJ1ZmZlcnMgY29tcGlsZXIsIGRvIG5vdCBtb2RpZnkKKy8vIEBnZW5lcmF0ZWQKK2V4dGVybiBjcmF0ZSBhbGxvYzsKIGV4dGVybiBjcmF0ZSBmbGF0YnVmZmVyczsKLXVzZSBzdGQ6Om1lbTsKLXVzZSBzdGQ6OmNtcDo6T3JkZXJpbmc7Cit1c2UgYWxsb2M6OmJveGVkOjpCb3g7Cit1c2UgYWxsb2M6OnN0cmluZzo6e1N0cmluZywgVG9TdHJpbmd9OwordXNlIGFsbG9jOjp2ZWM6OlZlYzsKK3VzZSBjb3JlOjptZW07Cit1c2UgY29yZTo6Y21wOjpPcmRlcmluZzsKIHVzZSBzZWxmOjpmbGF0YnVmZmVyczo6e0VuZGlhblNjYWxhciwgRm9sbG93fTsKIHVzZSBzdXBlcjo6KjsKIHB1YiBlbnVtIFN0YXRPZmZzZXQge30KQEAgLTc1LDcgKzgwLDcgQEAKICAgfQogCiAgICNbaW5saW5lXQotICBwdWIgZm4ga2V5X2NvbXBhcmVfd2l0aF92YWx1ZSgmc2VsZiwgdmFsOiB1MTYpIC0+IDo6c3RkOjpjbXA6Ok9yZGVyaW5nIHsKKyAgcHViIGZuIGtleV9jb21wYXJlX3dpdGhfdmFsdWUoJnNlbGYsIHZhbDogdTE2KSAtPiA6OmNvcmU6OmNtcDo6T3JkZXJpbmcgewogICAgIGxldCBrZXkgPSBzZWxmLmNvdW50KCk7CiAgICAga2V5LmNtcCgmdmFsKQogICB9CkBAIC0xNDMsOCArMTQ4LDggQEAKICAgfQogfQogCi1pbXBsIHN0ZDo6Zm10OjpEZWJ1ZyBmb3IgU3RhdDwnXz4gewotICBmbiBmbXQoJnNlbGYsIGY6ICZtdXQgc3RkOjpmbXQ6OkZvcm1hdHRlcjwnXz4pIC0+IHN0ZDo6Zm10OjpSZXN1bHQgeworaW1wbCBjb3JlOjpmbXQ6OkRlYnVnIGZvciBTdGF0PCdfPiB7CisgIGZuIGZtdCgmc2VsZiwgZjogJm11dCBjb3JlOjpmbXQ6OkZvcm1hdHRlcjwnXz4pIC0+IGNvcmU6OmZtdDo6UmVzdWx0IHsKICAgICBsZXQgbXV0IGRzID0gZi5kZWJ1Z19zdHJ1Y3QoIlN0YXQiKTsKICAgICAgIGRzLmZpZWxkKCJpZCIsICZzZWxmLmlkKCkpOwogICAgICAgZHMuZmllbGQoInZhbCIsICZzZWxmLnZhbCgpKTsKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL21vbnN0ZXJfdGVzdC9teV9nYW1lL2V4YW1wbGUvc3RydWN0X29mX3N0cnVjdHNfZ2VuZXJhdGVkLnJzIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvbW9uc3Rlcl90ZXN0L215X2dhbWUvZXhhbXBsZS9zdHJ1Y3Rfb2Zfc3RydWN0c19nZW5lcmF0ZWQucnMKaW5kZXggOTk5NGY3ZS4uYmMwNWM3NyAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvbW9uc3Rlcl90ZXN0L215X2dhbWUvZXhhbXBsZS9zdHJ1Y3Rfb2Zfc3RydWN0c19nZW5lcmF0ZWQucnMKKysrIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvbW9uc3Rlcl90ZXN0L215X2dhbWUvZXhhbXBsZS9zdHJ1Y3Rfb2Zfc3RydWN0c19nZW5lcmF0ZWQucnMKQEAgLTEsNyArMSwxMiBAQAogLy8gYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgYnkgdGhlIEZsYXRCdWZmZXJzIGNvbXBpbGVyLCBkbyBub3QgbW9kaWZ5CisvLyBAZ2VuZXJhdGVkCitleHRlcm4gY3JhdGUgYWxsb2M7CiBleHRlcm4gY3JhdGUgZmxhdGJ1ZmZlcnM7Ci11c2Ugc3RkOjptZW07Ci11c2Ugc3RkOjpjbXA6Ok9yZGVyaW5nOwordXNlIGFsbG9jOjpib3hlZDo6Qm94OwordXNlIGFsbG9jOjpzdHJpbmc6OntTdHJpbmcsIFRvU3RyaW5nfTsKK3VzZSBhbGxvYzo6dmVjOjpWZWM7Cit1c2UgY29yZTo6bWVtOwordXNlIGNvcmU6OmNtcDo6T3JkZXJpbmc7CiB1c2Ugc2VsZjo6ZmxhdGJ1ZmZlcnM6OntFbmRpYW5TY2FsYXIsIEZvbGxvd307CiB1c2Ugc3VwZXI6Oio7CiAvLyBzdHJ1Y3QgU3RydWN0T2ZTdHJ1Y3RzLCBhbGlnbmVkIHRvIDQKQEAgLTEzLDggKzE4LDggQEAKICAgICBTZWxmKFswOyAyMF0pCiAgIH0KIH0KLWltcGwgc3RkOjpmbXQ6OkRlYnVnIGZvciBTdHJ1Y3RPZlN0cnVjdHMgewotICBmbiBmbXQoJnNlbGYsIGY6ICZtdXQgc3RkOjpmbXQ6OkZvcm1hdHRlcikgLT4gc3RkOjpmbXQ6OlJlc3VsdCB7CitpbXBsIGNvcmU6OmZtdDo6RGVidWcgZm9yIFN0cnVjdE9mU3RydWN0cyB7CisgIGZuIGZtdCgmc2VsZiwgZjogJm11dCBjb3JlOjpmbXQ6OkZvcm1hdHRlcikgLT4gY29yZTo6Zm10OjpSZXN1bHQgewogICAgIGYuZGVidWdfc3RydWN0KCJTdHJ1Y3RPZlN0cnVjdHMiKQogICAgICAgLmZpZWxkKCJhIiwgJnNlbGYuYSgpKQogICAgICAgLmZpZWxkKCJiIiwgJnNlbGYuYigpKQpAQCAtNDQsNyArNDksNyBAQAogICAgICNbaW5saW5lXQogICAgIGZuIHB1c2goJnNlbGYsIGRzdDogJm11dCBbdThdLCBfcmVzdDogJlt1OF0pIHsKICAgICAgICAgbGV0IHNyYyA9IHVuc2FmZSB7Ci0gICAgICAgICAgICA6OnN0ZDo6c2xpY2U6OmZyb21fcmF3X3BhcnRzKHNlbGYgYXMgKmNvbnN0IFN0cnVjdE9mU3RydWN0cyBhcyAqY29uc3QgdTgsIFNlbGY6OnNpemUoKSkKKyAgICAgICAgICAgIDo6Y29yZTo6c2xpY2U6OmZyb21fcmF3X3BhcnRzKHNlbGYgYXMgKmNvbnN0IFN0cnVjdE9mU3RydWN0cyBhcyAqY29uc3QgdTgsIFNlbGY6OnNpemUoKSkKICAgICAgICAgfTsKICAgICAgICAgZHN0LmNvcHlfZnJvbV9zbGljZShzcmMpOwogICAgIH0KQEAgLTU1LDcgKzYwLDcgQEAKICAgICAjW2lubGluZV0KICAgICBmbiBwdXNoKCZzZWxmLCBkc3Q6ICZtdXQgW3U4XSwgX3Jlc3Q6ICZbdThdKSB7CiAgICAgICAgIGxldCBzcmMgPSB1bnNhZmUgewotICAgICAgICAgICAgOjpzdGQ6OnNsaWNlOjpmcm9tX3Jhd19wYXJ0cygqc2VsZiBhcyAqY29uc3QgU3RydWN0T2ZTdHJ1Y3RzIGFzICpjb25zdCB1OCwgU2VsZjo6c2l6ZSgpKQorICAgICAgICAgICAgOjpjb3JlOjpzbGljZTo6ZnJvbV9yYXdfcGFydHMoKnNlbGYgYXMgKmNvbnN0IFN0cnVjdE9mU3RydWN0cyBhcyAqY29uc3QgdTgsIFNlbGY6OnNpemUoKSkKICAgICAgICAgfTsKICAgICAgICAgZHN0LmNvcHlfZnJvbV9zbGljZShzcmMpOwogICAgIH0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL21vbnN0ZXJfdGVzdC9teV9nYW1lL2V4YW1wbGUvc3RydWN0X29mX3N0cnVjdHNfb2Zfc3RydWN0c19nZW5lcmF0ZWQucnMgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9tb25zdGVyX3Rlc3QvbXlfZ2FtZS9leGFtcGxlL3N0cnVjdF9vZl9zdHJ1Y3RzX29mX3N0cnVjdHNfZ2VuZXJhdGVkLnJzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjljN2FlMGIKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9tb25zdGVyX3Rlc3QvbXlfZ2FtZS9leGFtcGxlL3N0cnVjdF9vZl9zdHJ1Y3RzX29mX3N0cnVjdHNfZ2VuZXJhdGVkLnJzCkBAIC0wLDAgKzEsMTE4IEBACisvLyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBieSB0aGUgRmxhdEJ1ZmZlcnMgY29tcGlsZXIsIGRvIG5vdCBtb2RpZnkKKy8vIEBnZW5lcmF0ZWQKK2V4dGVybiBjcmF0ZSBhbGxvYzsKK2V4dGVybiBjcmF0ZSBmbGF0YnVmZmVyczsKK3VzZSBhbGxvYzo6Ym94ZWQ6OkJveDsKK3VzZSBhbGxvYzo6c3RyaW5nOjp7U3RyaW5nLCBUb1N0cmluZ307Cit1c2UgYWxsb2M6OnZlYzo6VmVjOwordXNlIGNvcmU6Om1lbTsKK3VzZSBjb3JlOjpjbXA6Ok9yZGVyaW5nOwordXNlIHNlbGY6OmZsYXRidWZmZXJzOjp7RW5kaWFuU2NhbGFyLCBGb2xsb3d9OwordXNlIHN1cGVyOjoqOworLy8gc3RydWN0IFN0cnVjdE9mU3RydWN0c09mU3RydWN0cywgYWxpZ25lZCB0byA0CisjW3JlcHIodHJhbnNwYXJlbnQpXQorI1tkZXJpdmUoQ2xvbmUsIENvcHksIFBhcnRpYWxFcSldCitwdWIgc3RydWN0IFN0cnVjdE9mU3RydWN0c09mU3RydWN0cyhwdWIgW3U4OyAyMF0pOworaW1wbCBEZWZhdWx0IGZvciBTdHJ1Y3RPZlN0cnVjdHNPZlN0cnVjdHMgeyAKKyAgZm4gZGVmYXVsdCgpIC0+IFNlbGYgeyAKKyAgICBTZWxmKFswOyAyMF0pCisgIH0KK30KK2ltcGwgY29yZTo6Zm10OjpEZWJ1ZyBmb3IgU3RydWN0T2ZTdHJ1Y3RzT2ZTdHJ1Y3RzIHsKKyAgZm4gZm10KCZzZWxmLCBmOiAmbXV0IGNvcmU6OmZtdDo6Rm9ybWF0dGVyKSAtPiBjb3JlOjpmbXQ6OlJlc3VsdCB7CisgICAgZi5kZWJ1Z19zdHJ1Y3QoIlN0cnVjdE9mU3RydWN0c09mU3RydWN0cyIpCisgICAgICAuZmllbGQoImEiLCAmc2VsZi5hKCkpCisgICAgICAuZmluaXNoKCkKKyAgfQorfQorCitpbXBsIGZsYXRidWZmZXJzOjpTaW1wbGVUb1ZlcmlmeUluU2xpY2UgZm9yIFN0cnVjdE9mU3RydWN0c09mU3RydWN0cyB7fQoraW1wbCBmbGF0YnVmZmVyczo6U2FmZVNsaWNlQWNjZXNzIGZvciBTdHJ1Y3RPZlN0cnVjdHNPZlN0cnVjdHMge30KK2ltcGw8J2E+IGZsYXRidWZmZXJzOjpGb2xsb3c8J2E+IGZvciBTdHJ1Y3RPZlN0cnVjdHNPZlN0cnVjdHMgeworICB0eXBlIElubmVyID0gJidhIFN0cnVjdE9mU3RydWN0c09mU3RydWN0czsKKyAgI1tpbmxpbmVdCisgIGZuIGZvbGxvdyhidWY6ICYnYSBbdThdLCBsb2M6IHVzaXplKSAtPiBTZWxmOjpJbm5lciB7CisgICAgPCYnYSBTdHJ1Y3RPZlN0cnVjdHNPZlN0cnVjdHM+Ojpmb2xsb3coYnVmLCBsb2MpCisgIH0KK30KK2ltcGw8J2E+IGZsYXRidWZmZXJzOjpGb2xsb3c8J2E+IGZvciAmJ2EgU3RydWN0T2ZTdHJ1Y3RzT2ZTdHJ1Y3RzIHsKKyAgdHlwZSBJbm5lciA9ICYnYSBTdHJ1Y3RPZlN0cnVjdHNPZlN0cnVjdHM7CisgICNbaW5saW5lXQorICBmbiBmb2xsb3coYnVmOiAmJ2EgW3U4XSwgbG9jOiB1c2l6ZSkgLT4gU2VsZjo6SW5uZXIgeworICAgIGZsYXRidWZmZXJzOjpmb2xsb3dfY2FzdF9yZWY6OjxTdHJ1Y3RPZlN0cnVjdHNPZlN0cnVjdHM+KGJ1ZiwgbG9jKQorICB9Cit9CitpbXBsPCdiPiBmbGF0YnVmZmVyczo6UHVzaCBmb3IgU3RydWN0T2ZTdHJ1Y3RzT2ZTdHJ1Y3RzIHsKKyAgICB0eXBlIE91dHB1dCA9IFN0cnVjdE9mU3RydWN0c09mU3RydWN0czsKKyAgICAjW2lubGluZV0KKyAgICBmbiBwdXNoKCZzZWxmLCBkc3Q6ICZtdXQgW3U4XSwgX3Jlc3Q6ICZbdThdKSB7CisgICAgICAgIGxldCBzcmMgPSB1bnNhZmUgeworICAgICAgICAgICAgOjpjb3JlOjpzbGljZTo6ZnJvbV9yYXdfcGFydHMoc2VsZiBhcyAqY29uc3QgU3RydWN0T2ZTdHJ1Y3RzT2ZTdHJ1Y3RzIGFzICpjb25zdCB1OCwgU2VsZjo6c2l6ZSgpKQorICAgICAgICB9OworICAgICAgICBkc3QuY29weV9mcm9tX3NsaWNlKHNyYyk7CisgICAgfQorfQoraW1wbDwnYj4gZmxhdGJ1ZmZlcnM6OlB1c2ggZm9yICYnYiBTdHJ1Y3RPZlN0cnVjdHNPZlN0cnVjdHMgeworICAgIHR5cGUgT3V0cHV0ID0gU3RydWN0T2ZTdHJ1Y3RzT2ZTdHJ1Y3RzOworCisgICAgI1tpbmxpbmVdCisgICAgZm4gcHVzaCgmc2VsZiwgZHN0OiAmbXV0IFt1OF0sIF9yZXN0OiAmW3U4XSkgeworICAgICAgICBsZXQgc3JjID0gdW5zYWZlIHsKKyAgICAgICAgICAgIDo6Y29yZTo6c2xpY2U6OmZyb21fcmF3X3BhcnRzKCpzZWxmIGFzICpjb25zdCBTdHJ1Y3RPZlN0cnVjdHNPZlN0cnVjdHMgYXMgKmNvbnN0IHU4LCBTZWxmOjpzaXplKCkpCisgICAgICAgIH07CisgICAgICAgIGRzdC5jb3B5X2Zyb21fc2xpY2Uoc3JjKTsKKyAgICB9Cit9CisKK2ltcGw8J2E+IGZsYXRidWZmZXJzOjpWZXJpZmlhYmxlIGZvciBTdHJ1Y3RPZlN0cnVjdHNPZlN0cnVjdHMgeworICAjW2lubGluZV0KKyAgZm4gcnVuX3ZlcmlmaWVyKAorICAgIHY6ICZtdXQgZmxhdGJ1ZmZlcnM6OlZlcmlmaWVyLCBwb3M6IHVzaXplCisgICkgLT4gUmVzdWx0PCgpLCBmbGF0YnVmZmVyczo6SW52YWxpZEZsYXRidWZmZXI+IHsKKyAgICB1c2Ugc2VsZjo6ZmxhdGJ1ZmZlcnM6OlZlcmlmaWFibGU7CisgICAgdi5pbl9idWZmZXI6OjxTZWxmPihwb3MpCisgIH0KK30KKworaW1wbDwnYT4gU3RydWN0T2ZTdHJ1Y3RzT2ZTdHJ1Y3RzIHsKKyAgI1thbGxvdyhjbGlwcHk6OnRvb19tYW55X2FyZ3VtZW50cyldCisgIHB1YiBmbiBuZXcoCisgICAgYTogJlN0cnVjdE9mU3RydWN0cywKKyAgKSAtPiBTZWxmIHsKKyAgICBsZXQgbXV0IHMgPSBTZWxmKFswOyAyMF0pOworICAgIHMuc2V0X2EoYSk7CisgICAgcworICB9CisKKyAgcHViIGNvbnN0IGZuIGdldF9mdWxseV9xdWFsaWZpZWRfbmFtZSgpIC0+ICYnc3RhdGljIHN0ciB7CisgICAgIk15R2FtZS5FeGFtcGxlLlN0cnVjdE9mU3RydWN0c09mU3RydWN0cyIKKyAgfQorCisgIHB1YiBmbiBhKCZzZWxmKSAtPiAmU3RydWN0T2ZTdHJ1Y3RzIHsKKyAgICB1bnNhZmUgeyAmKihzZWxmLjBbMC4uXS5hc19wdHIoKSBhcyAqY29uc3QgU3RydWN0T2ZTdHJ1Y3RzKSB9CisgIH0KKworICAjW2FsbG93KGNsaXBweTo6aWRlbnRpdHlfb3ApXQorICBwdWIgZm4gc2V0X2EoJm11dCBzZWxmLCB4OiAmU3RydWN0T2ZTdHJ1Y3RzKSB7CisgICAgc2VsZi4wWzAuLjAgKyAyMF0uY29weV9mcm9tX3NsaWNlKCZ4LjApCisgIH0KKworICBwdWIgZm4gdW5wYWNrKCZzZWxmKSAtPiBTdHJ1Y3RPZlN0cnVjdHNPZlN0cnVjdHNUIHsKKyAgICBTdHJ1Y3RPZlN0cnVjdHNPZlN0cnVjdHNUIHsKKyAgICAgIGE6IHNlbGYuYSgpLnVucGFjaygpLAorICAgIH0KKyAgfQorfQorCisjW2Rlcml2ZShEZWJ1ZywgQ2xvbmUsIFBhcnRpYWxFcSwgRGVmYXVsdCldCitwdWIgc3RydWN0IFN0cnVjdE9mU3RydWN0c09mU3RydWN0c1QgeworICBwdWIgYTogU3RydWN0T2ZTdHJ1Y3RzVCwKK30KK2ltcGwgU3RydWN0T2ZTdHJ1Y3RzT2ZTdHJ1Y3RzVCB7CisgIHB1YiBmbiBwYWNrKCZzZWxmKSAtPiBTdHJ1Y3RPZlN0cnVjdHNPZlN0cnVjdHMgeworICAgIFN0cnVjdE9mU3RydWN0c09mU3RydWN0czo6bmV3KAorICAgICAgJnNlbGYuYS5wYWNrKCksCisgICAgKQorICB9Cit9CisKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL21vbnN0ZXJfdGVzdC9teV9nYW1lL2V4YW1wbGUvdGVzdF9nZW5lcmF0ZWQucnMgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9tb25zdGVyX3Rlc3QvbXlfZ2FtZS9leGFtcGxlL3Rlc3RfZ2VuZXJhdGVkLnJzCmluZGV4IDE4N2I3Y2QuLjFiNzJlZTYgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL21vbnN0ZXJfdGVzdC9teV9nYW1lL2V4YW1wbGUvdGVzdF9nZW5lcmF0ZWQucnMKKysrIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvbW9uc3Rlcl90ZXN0L215X2dhbWUvZXhhbXBsZS90ZXN0X2dlbmVyYXRlZC5ycwpAQCAtMSw3ICsxLDEyIEBACiAvLyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBieSB0aGUgRmxhdEJ1ZmZlcnMgY29tcGlsZXIsIGRvIG5vdCBtb2RpZnkKKy8vIEBnZW5lcmF0ZWQKK2V4dGVybiBjcmF0ZSBhbGxvYzsKIGV4dGVybiBjcmF0ZSBmbGF0YnVmZmVyczsKLXVzZSBzdGQ6Om1lbTsKLXVzZSBzdGQ6OmNtcDo6T3JkZXJpbmc7Cit1c2UgYWxsb2M6OmJveGVkOjpCb3g7Cit1c2UgYWxsb2M6OnN0cmluZzo6e1N0cmluZywgVG9TdHJpbmd9OwordXNlIGFsbG9jOjp2ZWM6OlZlYzsKK3VzZSBjb3JlOjptZW07Cit1c2UgY29yZTo6Y21wOjpPcmRlcmluZzsKIHVzZSBzZWxmOjpmbGF0YnVmZmVyczo6e0VuZGlhblNjYWxhciwgRm9sbG93fTsKIHVzZSBzdXBlcjo6KjsKIC8vIHN0cnVjdCBUZXN0LCBhbGlnbmVkIHRvIDIKQEAgLTEzLDggKzE4LDggQEAKICAgICBTZWxmKFswOyA0XSkKICAgfQogfQotaW1wbCBzdGQ6OmZtdDo6RGVidWcgZm9yIFRlc3QgewotICBmbiBmbXQoJnNlbGYsIGY6ICZtdXQgc3RkOjpmbXQ6OkZvcm1hdHRlcikgLT4gc3RkOjpmbXQ6OlJlc3VsdCB7CitpbXBsIGNvcmU6OmZtdDo6RGVidWcgZm9yIFRlc3QgeworICBmbiBmbXQoJnNlbGYsIGY6ICZtdXQgY29yZTo6Zm10OjpGb3JtYXR0ZXIpIC0+IGNvcmU6OmZtdDo6UmVzdWx0IHsKICAgICBmLmRlYnVnX3N0cnVjdCgiVGVzdCIpCiAgICAgICAuZmllbGQoImEiLCAmc2VsZi5hKCkpCiAgICAgICAuZmllbGQoImIiLCAmc2VsZi5iKCkpCkBAIC00Myw3ICs0OCw3IEBACiAgICAgI1tpbmxpbmVdCiAgICAgZm4gcHVzaCgmc2VsZiwgZHN0OiAmbXV0IFt1OF0sIF9yZXN0OiAmW3U4XSkgewogICAgICAgICBsZXQgc3JjID0gdW5zYWZlIHsKLSAgICAgICAgICAgIDo6c3RkOjpzbGljZTo6ZnJvbV9yYXdfcGFydHMoc2VsZiBhcyAqY29uc3QgVGVzdCBhcyAqY29uc3QgdTgsIFNlbGY6OnNpemUoKSkKKyAgICAgICAgICAgIDo6Y29yZTo6c2xpY2U6OmZyb21fcmF3X3BhcnRzKHNlbGYgYXMgKmNvbnN0IFRlc3QgYXMgKmNvbnN0IHU4LCBTZWxmOjpzaXplKCkpCiAgICAgICAgIH07CiAgICAgICAgIGRzdC5jb3B5X2Zyb21fc2xpY2Uoc3JjKTsKICAgICB9CkBAIC01NCw3ICs1OSw3IEBACiAgICAgI1tpbmxpbmVdCiAgICAgZm4gcHVzaCgmc2VsZiwgZHN0OiAmbXV0IFt1OF0sIF9yZXN0OiAmW3U4XSkgewogICAgICAgICBsZXQgc3JjID0gdW5zYWZlIHsKLSAgICAgICAgICAgIDo6c3RkOjpzbGljZTo6ZnJvbV9yYXdfcGFydHMoKnNlbGYgYXMgKmNvbnN0IFRlc3QgYXMgKmNvbnN0IHU4LCBTZWxmOjpzaXplKCkpCisgICAgICAgICAgICA6OmNvcmU6OnNsaWNlOjpmcm9tX3Jhd19wYXJ0cygqc2VsZiBhcyAqY29uc3QgVGVzdCBhcyAqY29uc3QgdTgsIFNlbGY6OnNpemUoKSkKICAgICAgICAgfTsKICAgICAgICAgZHN0LmNvcHlfZnJvbV9zbGljZShzcmMpOwogICAgIH0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL21vbnN0ZXJfdGVzdC9teV9nYW1lL2V4YW1wbGUvdGVzdF9zaW1wbGVfdGFibGVfd2l0aF9lbnVtX2dlbmVyYXRlZC5ycyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL21vbnN0ZXJfdGVzdC9teV9nYW1lL2V4YW1wbGUvdGVzdF9zaW1wbGVfdGFibGVfd2l0aF9lbnVtX2dlbmVyYXRlZC5ycwppbmRleCA2ZWJlMzFmLi5lOTdkZmEwIDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9tb25zdGVyX3Rlc3QvbXlfZ2FtZS9leGFtcGxlL3Rlc3Rfc2ltcGxlX3RhYmxlX3dpdGhfZW51bV9nZW5lcmF0ZWQucnMKKysrIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvbW9uc3Rlcl90ZXN0L215X2dhbWUvZXhhbXBsZS90ZXN0X3NpbXBsZV90YWJsZV93aXRoX2VudW1fZ2VuZXJhdGVkLnJzCkBAIC0xLDcgKzEsMTIgQEAKIC8vIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGJ5IHRoZSBGbGF0QnVmZmVycyBjb21waWxlciwgZG8gbm90IG1vZGlmeQorLy8gQGdlbmVyYXRlZAorZXh0ZXJuIGNyYXRlIGFsbG9jOwogZXh0ZXJuIGNyYXRlIGZsYXRidWZmZXJzOwotdXNlIHN0ZDo6bWVtOwotdXNlIHN0ZDo6Y21wOjpPcmRlcmluZzsKK3VzZSBhbGxvYzo6Ym94ZWQ6OkJveDsKK3VzZSBhbGxvYzo6c3RyaW5nOjp7U3RyaW5nLCBUb1N0cmluZ307Cit1c2UgYWxsb2M6OnZlYzo6VmVjOwordXNlIGNvcmU6Om1lbTsKK3VzZSBjb3JlOjpjbXA6Ok9yZGVyaW5nOwogdXNlIHNlbGY6OmZsYXRidWZmZXJzOjp7RW5kaWFuU2NhbGFyLCBGb2xsb3d9OwogdXNlIHN1cGVyOjoqOwogcHViIGVudW0gVGVzdFNpbXBsZVRhYmxlV2l0aEVudW1PZmZzZXQge30KQEAgLTEwMSw4ICsxMDYsOCBAQAogICB9CiB9CiAKLWltcGwgc3RkOjpmbXQ6OkRlYnVnIGZvciBUZXN0U2ltcGxlVGFibGVXaXRoRW51bTwnXz4gewotICBmbiBmbXQoJnNlbGYsIGY6ICZtdXQgc3RkOjpmbXQ6OkZvcm1hdHRlcjwnXz4pIC0+IHN0ZDo6Zm10OjpSZXN1bHQgeworaW1wbCBjb3JlOjpmbXQ6OkRlYnVnIGZvciBUZXN0U2ltcGxlVGFibGVXaXRoRW51bTwnXz4geworICBmbiBmbXQoJnNlbGYsIGY6ICZtdXQgY29yZTo6Zm10OjpGb3JtYXR0ZXI8J18+KSAtPiBjb3JlOjpmbXQ6OlJlc3VsdCB7CiAgICAgbGV0IG11dCBkcyA9IGYuZGVidWdfc3RydWN0KCJUZXN0U2ltcGxlVGFibGVXaXRoRW51bSIpOwogICAgICAgZHMuZmllbGQoImNvbG9yIiwgJnNlbGYuY29sb3IoKSk7CiAgICAgICBkcy5maW5pc2goKQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvbW9uc3Rlcl90ZXN0L215X2dhbWUvZXhhbXBsZS90eXBlX2FsaWFzZXNfZ2VuZXJhdGVkLnJzIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvbW9uc3Rlcl90ZXN0L215X2dhbWUvZXhhbXBsZS90eXBlX2FsaWFzZXNfZ2VuZXJhdGVkLnJzCmluZGV4IDViM2VkZTUuLmRmYThkNTYgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL21vbnN0ZXJfdGVzdC9teV9nYW1lL2V4YW1wbGUvdHlwZV9hbGlhc2VzX2dlbmVyYXRlZC5ycworKysgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9tb25zdGVyX3Rlc3QvbXlfZ2FtZS9leGFtcGxlL3R5cGVfYWxpYXNlc19nZW5lcmF0ZWQucnMKQEAgLTEsNyArMSwxMiBAQAogLy8gYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgYnkgdGhlIEZsYXRCdWZmZXJzIGNvbXBpbGVyLCBkbyBub3QgbW9kaWZ5CisvLyBAZ2VuZXJhdGVkCitleHRlcm4gY3JhdGUgYWxsb2M7CiBleHRlcm4gY3JhdGUgZmxhdGJ1ZmZlcnM7Ci11c2Ugc3RkOjptZW07Ci11c2Ugc3RkOjpjbXA6Ok9yZGVyaW5nOwordXNlIGFsbG9jOjpib3hlZDo6Qm94OwordXNlIGFsbG9jOjpzdHJpbmc6OntTdHJpbmcsIFRvU3RyaW5nfTsKK3VzZSBhbGxvYzo6dmVjOjpWZWM7Cit1c2UgY29yZTo6bWVtOwordXNlIGNvcmU6OmNtcDo6T3JkZXJpbmc7CiB1c2Ugc2VsZjo6ZmxhdGJ1ZmZlcnM6OntFbmRpYW5TY2FsYXIsIEZvbGxvd307CiB1c2Ugc3VwZXI6Oio7CiBwdWIgZW51bSBUeXBlQWxpYXNlc09mZnNldCB7fQpAQCAtMjcwLDggKzI3NSw4IEBACiAgIH0KIH0KIAotaW1wbCBzdGQ6OmZtdDo6RGVidWcgZm9yIFR5cGVBbGlhc2VzPCdfPiB7Ci0gIGZuIGZtdCgmc2VsZiwgZjogJm11dCBzdGQ6OmZtdDo6Rm9ybWF0dGVyPCdfPikgLT4gc3RkOjpmbXQ6OlJlc3VsdCB7CitpbXBsIGNvcmU6OmZtdDo6RGVidWcgZm9yIFR5cGVBbGlhc2VzPCdfPiB7CisgIGZuIGZtdCgmc2VsZiwgZjogJm11dCBjb3JlOjpmbXQ6OkZvcm1hdHRlcjwnXz4pIC0+IGNvcmU6OmZtdDo6UmVzdWx0IHsKICAgICBsZXQgbXV0IGRzID0gZi5kZWJ1Z19zdHJ1Y3QoIlR5cGVBbGlhc2VzIik7CiAgICAgICBkcy5maWVsZCgiaThfIiwgJnNlbGYuaThfKCkpOwogICAgICAgZHMuZmllbGQoInU4XyIsICZzZWxmLnU4XygpKTsKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL21vbnN0ZXJfdGVzdC9teV9nYW1lL2V4YW1wbGUvdmVjXzNfZ2VuZXJhdGVkLnJzIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvbW9uc3Rlcl90ZXN0L215X2dhbWUvZXhhbXBsZS92ZWNfM19nZW5lcmF0ZWQucnMKaW5kZXggZTVhMjViYi4uZmEwYWI1MyAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvbW9uc3Rlcl90ZXN0L215X2dhbWUvZXhhbXBsZS92ZWNfM19nZW5lcmF0ZWQucnMKKysrIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvbW9uc3Rlcl90ZXN0L215X2dhbWUvZXhhbXBsZS92ZWNfM19nZW5lcmF0ZWQucnMKQEAgLTEsNyArMSwxMiBAQAogLy8gYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgYnkgdGhlIEZsYXRCdWZmZXJzIGNvbXBpbGVyLCBkbyBub3QgbW9kaWZ5CisvLyBAZ2VuZXJhdGVkCitleHRlcm4gY3JhdGUgYWxsb2M7CiBleHRlcm4gY3JhdGUgZmxhdGJ1ZmZlcnM7Ci11c2Ugc3RkOjptZW07Ci11c2Ugc3RkOjpjbXA6Ok9yZGVyaW5nOwordXNlIGFsbG9jOjpib3hlZDo6Qm94OwordXNlIGFsbG9jOjpzdHJpbmc6OntTdHJpbmcsIFRvU3RyaW5nfTsKK3VzZSBhbGxvYzo6dmVjOjpWZWM7Cit1c2UgY29yZTo6bWVtOwordXNlIGNvcmU6OmNtcDo6T3JkZXJpbmc7CiB1c2Ugc2VsZjo6ZmxhdGJ1ZmZlcnM6OntFbmRpYW5TY2FsYXIsIEZvbGxvd307CiB1c2Ugc3VwZXI6Oio7CiAvLyBzdHJ1Y3QgVmVjMywgYWxpZ25lZCB0byA4CkBAIC0xMyw4ICsxOCw4IEBACiAgICAgU2VsZihbMDsgMzJdKQogICB9CiB9Ci1pbXBsIHN0ZDo6Zm10OjpEZWJ1ZyBmb3IgVmVjMyB7Ci0gIGZuIGZtdCgmc2VsZiwgZjogJm11dCBzdGQ6OmZtdDo6Rm9ybWF0dGVyKSAtPiBzdGQ6OmZtdDo6UmVzdWx0IHsKK2ltcGwgY29yZTo6Zm10OjpEZWJ1ZyBmb3IgVmVjMyB7CisgIGZuIGZtdCgmc2VsZiwgZjogJm11dCBjb3JlOjpmbXQ6OkZvcm1hdHRlcikgLT4gY29yZTo6Zm10OjpSZXN1bHQgewogICAgIGYuZGVidWdfc3RydWN0KCJWZWMzIikKICAgICAgIC5maWVsZCgieCIsICZzZWxmLngoKSkKICAgICAgIC5maWVsZCgieSIsICZzZWxmLnkoKSkKQEAgLTQ3LDcgKzUyLDcgQEAKICAgICAjW2lubGluZV0KICAgICBmbiBwdXNoKCZzZWxmLCBkc3Q6ICZtdXQgW3U4XSwgX3Jlc3Q6ICZbdThdKSB7CiAgICAgICAgIGxldCBzcmMgPSB1bnNhZmUgewotICAgICAgICAgICAgOjpzdGQ6OnNsaWNlOjpmcm9tX3Jhd19wYXJ0cyhzZWxmIGFzICpjb25zdCBWZWMzIGFzICpjb25zdCB1OCwgU2VsZjo6c2l6ZSgpKQorICAgICAgICAgICAgOjpjb3JlOjpzbGljZTo6ZnJvbV9yYXdfcGFydHMoc2VsZiBhcyAqY29uc3QgVmVjMyBhcyAqY29uc3QgdTgsIFNlbGY6OnNpemUoKSkKICAgICAgICAgfTsKICAgICAgICAgZHN0LmNvcHlfZnJvbV9zbGljZShzcmMpOwogICAgIH0KQEAgLTU4LDcgKzYzLDcgQEAKICAgICAjW2lubGluZV0KICAgICBmbiBwdXNoKCZzZWxmLCBkc3Q6ICZtdXQgW3U4XSwgX3Jlc3Q6ICZbdThdKSB7CiAgICAgICAgIGxldCBzcmMgPSB1bnNhZmUgewotICAgICAgICAgICAgOjpzdGQ6OnNsaWNlOjpmcm9tX3Jhd19wYXJ0cygqc2VsZiBhcyAqY29uc3QgVmVjMyBhcyAqY29uc3QgdTgsIFNlbGY6OnNpemUoKSkKKyAgICAgICAgICAgIDo6Y29yZTo6c2xpY2U6OmZyb21fcmF3X3BhcnRzKCpzZWxmIGFzICpjb25zdCBWZWMzIGFzICpjb25zdCB1OCwgU2VsZjo6c2l6ZSgpKQogICAgICAgICB9OwogICAgICAgICBkc3QuY29weV9mcm9tX3NsaWNlKHNyYyk7CiAgICAgfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvbW9uc3Rlcl90ZXN0L215X2dhbWUvZXhhbXBsZV8yL21vbnN0ZXJfZ2VuZXJhdGVkLnJzIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvbW9uc3Rlcl90ZXN0L215X2dhbWUvZXhhbXBsZV8yL21vbnN0ZXJfZ2VuZXJhdGVkLnJzCmluZGV4IDU0Mzg0YjUuLjM0ZTBkYjEgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL21vbnN0ZXJfdGVzdC9teV9nYW1lL2V4YW1wbGVfMi9tb25zdGVyX2dlbmVyYXRlZC5ycworKysgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9tb25zdGVyX3Rlc3QvbXlfZ2FtZS9leGFtcGxlXzIvbW9uc3Rlcl9nZW5lcmF0ZWQucnMKQEAgLTEsNyArMSwxMiBAQAogLy8gYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgYnkgdGhlIEZsYXRCdWZmZXJzIGNvbXBpbGVyLCBkbyBub3QgbW9kaWZ5CisvLyBAZ2VuZXJhdGVkCitleHRlcm4gY3JhdGUgYWxsb2M7CiBleHRlcm4gY3JhdGUgZmxhdGJ1ZmZlcnM7Ci11c2Ugc3RkOjptZW07Ci11c2Ugc3RkOjpjbXA6Ok9yZGVyaW5nOwordXNlIGFsbG9jOjpib3hlZDo6Qm94OwordXNlIGFsbG9jOjpzdHJpbmc6OntTdHJpbmcsIFRvU3RyaW5nfTsKK3VzZSBhbGxvYzo6dmVjOjpWZWM7Cit1c2UgY29yZTo6bWVtOwordXNlIGNvcmU6OmNtcDo6T3JkZXJpbmc7CiB1c2Ugc2VsZjo6ZmxhdGJ1ZmZlcnM6OntFbmRpYW5TY2FsYXIsIEZvbGxvd307CiB1c2Ugc3VwZXI6Oio7CiBwdWIgZW51bSBNb25zdGVyT2Zmc2V0IHt9CkBAIC04NSw4ICs5MCw4IEBACiAgIH0KIH0KIAotaW1wbCBzdGQ6OmZtdDo6RGVidWcgZm9yIE1vbnN0ZXI8J18+IHsKLSAgZm4gZm10KCZzZWxmLCBmOiAmbXV0IHN0ZDo6Zm10OjpGb3JtYXR0ZXI8J18+KSAtPiBzdGQ6OmZtdDo6UmVzdWx0IHsKK2ltcGwgY29yZTo6Zm10OjpEZWJ1ZyBmb3IgTW9uc3RlcjwnXz4geworICBmbiBmbXQoJnNlbGYsIGY6ICZtdXQgY29yZTo6Zm10OjpGb3JtYXR0ZXI8J18+KSAtPiBjb3JlOjpmbXQ6OlJlc3VsdCB7CiAgICAgbGV0IG11dCBkcyA9IGYuZGVidWdfc3RydWN0KCJNb25zdGVyIik7CiAgICAgICBkcy5maW5pc2goKQogICB9CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9tb25zdGVyX3Rlc3QvbXlfZ2FtZS9pbl9wYXJlbnRfbmFtZXNwYWNlX2dlbmVyYXRlZC5ycyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL21vbnN0ZXJfdGVzdC9teV9nYW1lL2luX3BhcmVudF9uYW1lc3BhY2VfZ2VuZXJhdGVkLnJzCmluZGV4IGFhYmQ0YjguLjI2M2ZhZTcgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL21vbnN0ZXJfdGVzdC9teV9nYW1lL2luX3BhcmVudF9uYW1lc3BhY2VfZ2VuZXJhdGVkLnJzCisrKyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL21vbnN0ZXJfdGVzdC9teV9nYW1lL2luX3BhcmVudF9uYW1lc3BhY2VfZ2VuZXJhdGVkLnJzCkBAIC0xLDcgKzEsMTIgQEAKIC8vIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGJ5IHRoZSBGbGF0QnVmZmVycyBjb21waWxlciwgZG8gbm90IG1vZGlmeQorLy8gQGdlbmVyYXRlZAorZXh0ZXJuIGNyYXRlIGFsbG9jOwogZXh0ZXJuIGNyYXRlIGZsYXRidWZmZXJzOwotdXNlIHN0ZDo6bWVtOwotdXNlIHN0ZDo6Y21wOjpPcmRlcmluZzsKK3VzZSBhbGxvYzo6Ym94ZWQ6OkJveDsKK3VzZSBhbGxvYzo6c3RyaW5nOjp7U3RyaW5nLCBUb1N0cmluZ307Cit1c2UgYWxsb2M6OnZlYzo6VmVjOwordXNlIGNvcmU6Om1lbTsKK3VzZSBjb3JlOjpjbXA6Ok9yZGVyaW5nOwogdXNlIHNlbGY6OmZsYXRidWZmZXJzOjp7RW5kaWFuU2NhbGFyLCBGb2xsb3d9OwogdXNlIHN1cGVyOjoqOwogcHViIGVudW0gSW5QYXJlbnROYW1lc3BhY2VPZmZzZXQge30KQEAgLTg1LDggKzkwLDggQEAKICAgfQogfQogCi1pbXBsIHN0ZDo6Zm10OjpEZWJ1ZyBmb3IgSW5QYXJlbnROYW1lc3BhY2U8J18+IHsKLSAgZm4gZm10KCZzZWxmLCBmOiAmbXV0IHN0ZDo6Zm10OjpGb3JtYXR0ZXI8J18+KSAtPiBzdGQ6OmZtdDo6UmVzdWx0IHsKK2ltcGwgY29yZTo6Zm10OjpEZWJ1ZyBmb3IgSW5QYXJlbnROYW1lc3BhY2U8J18+IHsKKyAgZm4gZm10KCZzZWxmLCBmOiAmbXV0IGNvcmU6OmZtdDo6Rm9ybWF0dGVyPCdfPikgLT4gY29yZTo6Zm10OjpSZXN1bHQgewogICAgIGxldCBtdXQgZHMgPSBmLmRlYnVnX3N0cnVjdCgiSW5QYXJlbnROYW1lc3BhY2UiKTsKICAgICAgIGRzLmZpbmlzaCgpCiAgIH0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL21vbnN0ZXJfdGVzdC9teV9nYW1lL290aGVyX25hbWVfc3BhY2UvZnJvbV9pbmNsdWRlX2dlbmVyYXRlZC5ycyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL21vbnN0ZXJfdGVzdC9teV9nYW1lL290aGVyX25hbWVfc3BhY2UvZnJvbV9pbmNsdWRlX2dlbmVyYXRlZC5ycwppbmRleCAwNDhiYWZkLi4zYzUxNjVkIDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9tb25zdGVyX3Rlc3QvbXlfZ2FtZS9vdGhlcl9uYW1lX3NwYWNlL2Zyb21faW5jbHVkZV9nZW5lcmF0ZWQucnMKKysrIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvbW9uc3Rlcl90ZXN0L215X2dhbWUvb3RoZXJfbmFtZV9zcGFjZS9mcm9tX2luY2x1ZGVfZ2VuZXJhdGVkLnJzCkBAIC0xLDcgKzEsMTIgQEAKIC8vIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGJ5IHRoZSBGbGF0QnVmZmVycyBjb21waWxlciwgZG8gbm90IG1vZGlmeQorLy8gQGdlbmVyYXRlZAorZXh0ZXJuIGNyYXRlIGFsbG9jOwogZXh0ZXJuIGNyYXRlIGZsYXRidWZmZXJzOwotdXNlIHN0ZDo6bWVtOwotdXNlIHN0ZDo6Y21wOjpPcmRlcmluZzsKK3VzZSBhbGxvYzo6Ym94ZWQ6OkJveDsKK3VzZSBhbGxvYzo6c3RyaW5nOjp7U3RyaW5nLCBUb1N0cmluZ307Cit1c2UgYWxsb2M6OnZlYzo6VmVjOwordXNlIGNvcmU6Om1lbTsKK3VzZSBjb3JlOjpjbXA6Ok9yZGVyaW5nOwogdXNlIHNlbGY6OmZsYXRidWZmZXJzOjp7RW5kaWFuU2NhbGFyLCBGb2xsb3d9OwogdXNlIHN1cGVyOjoqOwogI1tkZXByZWNhdGVkKHNpbmNlID0gIjIuMC4wIiwgbm90ZSA9ICJVc2UgYXNzb2NpYXRlZCBjb25zdGFudHMgaW5zdGVhZC4gVGhpcyB3aWxsIG5vIGxvbmdlciBiZSBnZW5lcmF0ZWQgaW4gMjAyMS4iKV0KQEAgLTM0LDggKzM5LDggQEAKICAgICB9CiAgIH0KIH0KLWltcGwgc3RkOjpmbXQ6OkRlYnVnIGZvciBGcm9tSW5jbHVkZSB7Ci0gIGZuIGZtdCgmc2VsZiwgZjogJm11dCBzdGQ6OmZtdDo6Rm9ybWF0dGVyKSAtPiBzdGQ6OmZtdDo6UmVzdWx0IHsKK2ltcGwgY29yZTo6Zm10OjpEZWJ1ZyBmb3IgRnJvbUluY2x1ZGUgeworICBmbiBmbXQoJnNlbGYsIGY6ICZtdXQgY29yZTo6Zm10OjpGb3JtYXR0ZXIpIC0+IGNvcmU6OmZtdDo6UmVzdWx0IHsKICAgICBpZiBsZXQgU29tZShuYW1lKSA9IHNlbGYudmFyaWFudF9uYW1lKCkgewogICAgICAgZi53cml0ZV9zdHIobmFtZSkKICAgICB9IGVsc2UgewpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvbW9uc3Rlcl90ZXN0L215X2dhbWUvb3RoZXJfbmFtZV9zcGFjZS90YWJsZV9iX2dlbmVyYXRlZC5ycyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL21vbnN0ZXJfdGVzdC9teV9nYW1lL290aGVyX25hbWVfc3BhY2UvdGFibGVfYl9nZW5lcmF0ZWQucnMKaW5kZXggNDZhOTljYi4uZGE3YjkzNyAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvbW9uc3Rlcl90ZXN0L215X2dhbWUvb3RoZXJfbmFtZV9zcGFjZS90YWJsZV9iX2dlbmVyYXRlZC5ycworKysgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9tb25zdGVyX3Rlc3QvbXlfZ2FtZS9vdGhlcl9uYW1lX3NwYWNlL3RhYmxlX2JfZ2VuZXJhdGVkLnJzCkBAIC0xLDcgKzEsMTIgQEAKIC8vIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGJ5IHRoZSBGbGF0QnVmZmVycyBjb21waWxlciwgZG8gbm90IG1vZGlmeQorLy8gQGdlbmVyYXRlZAorZXh0ZXJuIGNyYXRlIGFsbG9jOwogZXh0ZXJuIGNyYXRlIGZsYXRidWZmZXJzOwotdXNlIHN0ZDo6bWVtOwotdXNlIHN0ZDo6Y21wOjpPcmRlcmluZzsKK3VzZSBhbGxvYzo6Ym94ZWQ6OkJveDsKK3VzZSBhbGxvYzo6c3RyaW5nOjp7U3RyaW5nLCBUb1N0cmluZ307Cit1c2UgYWxsb2M6OnZlYzo6VmVjOwordXNlIGNvcmU6Om1lbTsKK3VzZSBjb3JlOjpjbXA6Ok9yZGVyaW5nOwogdXNlIHNlbGY6OmZsYXRidWZmZXJzOjp7RW5kaWFuU2NhbGFyLCBGb2xsb3d9OwogdXNlIHN1cGVyOjoqOwogcHViIGVudW0gVGFibGVCT2Zmc2V0IHt9CkBAIC0xMDMsOCArMTA4LDggQEAKICAgfQogfQogCi1pbXBsIHN0ZDo6Zm10OjpEZWJ1ZyBmb3IgVGFibGVCPCdfPiB7Ci0gIGZuIGZtdCgmc2VsZiwgZjogJm11dCBzdGQ6OmZtdDo6Rm9ybWF0dGVyPCdfPikgLT4gc3RkOjpmbXQ6OlJlc3VsdCB7CitpbXBsIGNvcmU6OmZtdDo6RGVidWcgZm9yIFRhYmxlQjwnXz4geworICBmbiBmbXQoJnNlbGYsIGY6ICZtdXQgY29yZTo6Zm10OjpGb3JtYXR0ZXI8J18+KSAtPiBjb3JlOjpmbXQ6OlJlc3VsdCB7CiAgICAgbGV0IG11dCBkcyA9IGYuZGVidWdfc3RydWN0KCJUYWJsZUIiKTsKICAgICAgIGRzLmZpZWxkKCJhIiwgJnNlbGYuYSgpKTsKICAgICAgIGRzLmZpbmlzaCgpCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9tb25zdGVyX3Rlc3QvbXlfZ2FtZS9vdGhlcl9uYW1lX3NwYWNlL3VudXNlZF9nZW5lcmF0ZWQucnMgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9tb25zdGVyX3Rlc3QvbXlfZ2FtZS9vdGhlcl9uYW1lX3NwYWNlL3VudXNlZF9nZW5lcmF0ZWQucnMKaW5kZXggMWRjNTkxMy4uMWU0YWQ5YyAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvbW9uc3Rlcl90ZXN0L215X2dhbWUvb3RoZXJfbmFtZV9zcGFjZS91bnVzZWRfZ2VuZXJhdGVkLnJzCisrKyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL21vbnN0ZXJfdGVzdC9teV9nYW1lL290aGVyX25hbWVfc3BhY2UvdW51c2VkX2dlbmVyYXRlZC5ycwpAQCAtMSw3ICsxLDEyIEBACiAvLyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBieSB0aGUgRmxhdEJ1ZmZlcnMgY29tcGlsZXIsIGRvIG5vdCBtb2RpZnkKKy8vIEBnZW5lcmF0ZWQKK2V4dGVybiBjcmF0ZSBhbGxvYzsKIGV4dGVybiBjcmF0ZSBmbGF0YnVmZmVyczsKLXVzZSBzdGQ6Om1lbTsKLXVzZSBzdGQ6OmNtcDo6T3JkZXJpbmc7Cit1c2UgYWxsb2M6OmJveGVkOjpCb3g7Cit1c2UgYWxsb2M6OnN0cmluZzo6e1N0cmluZywgVG9TdHJpbmd9OwordXNlIGFsbG9jOjp2ZWM6OlZlYzsKK3VzZSBjb3JlOjptZW07Cit1c2UgY29yZTo6Y21wOjpPcmRlcmluZzsKIHVzZSBzZWxmOjpmbGF0YnVmZmVyczo6e0VuZGlhblNjYWxhciwgRm9sbG93fTsKIHVzZSBzdXBlcjo6KjsKIC8vIHN0cnVjdCBVbnVzZWQsIGFsaWduZWQgdG8gNApAQCAtMTMsOCArMTgsOCBAQAogICAgIFNlbGYoWzA7IDRdKQogICB9CiB9Ci1pbXBsIHN0ZDo6Zm10OjpEZWJ1ZyBmb3IgVW51c2VkIHsKLSAgZm4gZm10KCZzZWxmLCBmOiAmbXV0IHN0ZDo6Zm10OjpGb3JtYXR0ZXIpIC0+IHN0ZDo6Zm10OjpSZXN1bHQgeworaW1wbCBjb3JlOjpmbXQ6OkRlYnVnIGZvciBVbnVzZWQgeworICBmbiBmbXQoJnNlbGYsIGY6ICZtdXQgY29yZTo6Zm10OjpGb3JtYXR0ZXIpIC0+IGNvcmU6OmZtdDo6UmVzdWx0IHsKICAgICBmLmRlYnVnX3N0cnVjdCgiVW51c2VkIikKICAgICAgIC5maWVsZCgiYSIsICZzZWxmLmEoKSkKICAgICAgIC5maW5pc2goKQpAQCAtNDIsNyArNDcsNyBAQAogICAgICNbaW5saW5lXQogICAgIGZuIHB1c2goJnNlbGYsIGRzdDogJm11dCBbdThdLCBfcmVzdDogJlt1OF0pIHsKICAgICAgICAgbGV0IHNyYyA9IHVuc2FmZSB7Ci0gICAgICAgICAgICA6OnN0ZDo6c2xpY2U6OmZyb21fcmF3X3BhcnRzKHNlbGYgYXMgKmNvbnN0IFVudXNlZCBhcyAqY29uc3QgdTgsIFNlbGY6OnNpemUoKSkKKyAgICAgICAgICAgIDo6Y29yZTo6c2xpY2U6OmZyb21fcmF3X3BhcnRzKHNlbGYgYXMgKmNvbnN0IFVudXNlZCBhcyAqY29uc3QgdTgsIFNlbGY6OnNpemUoKSkKICAgICAgICAgfTsKICAgICAgICAgZHN0LmNvcHlfZnJvbV9zbGljZShzcmMpOwogICAgIH0KQEAgLTUzLDcgKzU4LDcgQEAKICAgICAjW2lubGluZV0KICAgICBmbiBwdXNoKCZzZWxmLCBkc3Q6ICZtdXQgW3U4XSwgX3Jlc3Q6ICZbdThdKSB7CiAgICAgICAgIGxldCBzcmMgPSB1bnNhZmUgewotICAgICAgICAgICAgOjpzdGQ6OnNsaWNlOjpmcm9tX3Jhd19wYXJ0cygqc2VsZiBhcyAqY29uc3QgVW51c2VkIGFzICpjb25zdCB1OCwgU2VsZjo6c2l6ZSgpKQorICAgICAgICAgICAgOjpjb3JlOjpzbGljZTo6ZnJvbV9yYXdfcGFydHMoKnNlbGYgYXMgKmNvbnN0IFVudXNlZCBhcyAqY29uc3QgdTgsIFNlbGY6OnNpemUoKSkKICAgICAgICAgfTsKICAgICAgICAgZHN0LmNvcHlfZnJvbV9zbGljZShzcmMpOwogICAgIH0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL21vbnN0ZXJfdGVzdC90YWJsZV9hX2dlbmVyYXRlZC5ycyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL21vbnN0ZXJfdGVzdC90YWJsZV9hX2dlbmVyYXRlZC5ycwppbmRleCA5MTg4YjI5Li4wZTZhNzhkIDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9tb25zdGVyX3Rlc3QvdGFibGVfYV9nZW5lcmF0ZWQucnMKKysrIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvbW9uc3Rlcl90ZXN0L3RhYmxlX2FfZ2VuZXJhdGVkLnJzCkBAIC0xLDcgKzEsMTIgQEAKIC8vIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGJ5IHRoZSBGbGF0QnVmZmVycyBjb21waWxlciwgZG8gbm90IG1vZGlmeQorLy8gQGdlbmVyYXRlZAorZXh0ZXJuIGNyYXRlIGFsbG9jOwogZXh0ZXJuIGNyYXRlIGZsYXRidWZmZXJzOwotdXNlIHN0ZDo6bWVtOwotdXNlIHN0ZDo6Y21wOjpPcmRlcmluZzsKK3VzZSBhbGxvYzo6Ym94ZWQ6OkJveDsKK3VzZSBhbGxvYzo6c3RyaW5nOjp7U3RyaW5nLCBUb1N0cmluZ307Cit1c2UgYWxsb2M6OnZlYzo6VmVjOwordXNlIGNvcmU6Om1lbTsKK3VzZSBjb3JlOjpjbXA6Ok9yZGVyaW5nOwogdXNlIHNlbGY6OmZsYXRidWZmZXJzOjp7RW5kaWFuU2NhbGFyLCBGb2xsb3d9OwogdXNlIHN1cGVyOjoqOwogcHViIGVudW0gVGFibGVBT2Zmc2V0IHt9CkBAIC0xMDMsOCArMTA4LDggQEAKICAgfQogfQogCi1pbXBsIHN0ZDo6Zm10OjpEZWJ1ZyBmb3IgVGFibGVBPCdfPiB7Ci0gIGZuIGZtdCgmc2VsZiwgZjogJm11dCBzdGQ6OmZtdDo6Rm9ybWF0dGVyPCdfPikgLT4gc3RkOjpmbXQ6OlJlc3VsdCB7CitpbXBsIGNvcmU6OmZtdDo6RGVidWcgZm9yIFRhYmxlQTwnXz4geworICBmbiBmbXQoJnNlbGYsIGY6ICZtdXQgY29yZTo6Zm10OjpGb3JtYXR0ZXI8J18+KSAtPiBjb3JlOjpmbXQ6OlJlc3VsdCB7CiAgICAgbGV0IG11dCBkcyA9IGYuZGVidWdfc3RydWN0KCJUYWJsZUEiKTsKICAgICAgIGRzLmZpZWxkKCJiIiwgJnNlbGYuYigpKTsKICAgICAgIGRzLmZpbmlzaCgpCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9tb25zdGVyX3Rlc3RfYmZic19nZW5lcmF0ZWQuaCBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL21vbnN0ZXJfdGVzdF9iZmJzX2dlbmVyYXRlZC5oCmluZGV4IGZjNjExZGIuLmY4YmM0YWEgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL21vbnN0ZXJfdGVzdF9iZmJzX2dlbmVyYXRlZC5oCisrKyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL21vbnN0ZXJfdGVzdF9iZmJzX2dlbmVyYXRlZC5oCkBAIC02LDEwNyArNiwxMTQgQEAKIAogI2luY2x1ZGUgImZsYXRidWZmZXJzL2ZsYXRidWZmZXJzLmgiCiAKKy8vIEVuc3VyZSB0aGUgaW5jbHVkZWQgZmxhdGJ1ZmZlcnMuaCBpcyB0aGUgc2FtZSB2ZXJzaW9uIGFzIHdoZW4gdGhpcyBmaWxlIHdhcworLy8gZ2VuZXJhdGVkLCBvdGhlcndpc2UgaXQgbWF5IG5vdCBiZSBjb21wYXRpYmxlLgorc3RhdGljX2Fzc2VydChGTEFUQlVGRkVSU19WRVJTSU9OX01BSk9SID09IDIgJiYKKyAgICAgICAgICAgICAgRkxBVEJVRkZFUlNfVkVSU0lPTl9NSU5PUiA9PSAwICYmCisgICAgICAgICAgICAgIEZMQVRCVUZGRVJTX1ZFUlNJT05fUkVWSVNJT04gPT0gOCwKKyAgICAgICAgICAgICAiTm9uLWNvbXBhdGlibGUgZmxhdGJ1ZmZlcnMgdmVyc2lvbiBpbmNsdWRlZCIpOworCiBuYW1lc3BhY2UgTXlHYW1lIHsKIG5hbWVzcGFjZSBFeGFtcGxlIHsKIAogc3RydWN0IE1vbnN0ZXJCaW5hcnlTY2hlbWEgewogICBzdGF0aWMgY29uc3QgdWludDhfdCAqZGF0YSgpIHsKICAgICAvLyBCdWZmZXIgY29udGFpbmluZyB0aGUgYmluYXJ5IHNjaGVtYS4KLSAgICBzdGF0aWMgY29uc3QgdWludDhfdCBiZmJzRGF0YVsxNDY0OF0gPSB7Ci0gICAgICAweDIwLDB4MDAsMHgwMCwweDAwLDB4NDIsMHg0NiwweDQyLDB4NTMsMHgwMCwweDAwLDB4MDAsMHgwMCwweDE0LDB4MDAsMHgyMCwweDAwLDB4MDQsMHgwMCwweDA4LDB4MDAsCi0gICAgICAweDBDLDB4MDAsMHgxMCwweDAwLDB4MTQsMHgwMCwweDE4LDB4MDAsMHgwMCwweDAwLDB4MUMsMHgwMCwweDE0LDB4MDAsMHgwMCwweDAwLDB4NTgsMHgwMCwweDAwLDB4MDAsCi0gICAgICAweDM0LDB4MDAsMHgwMCwweDAwLDB4MjQsMHgwMCwweDAwLDB4MDAsMHgxOCwweDAwLDB4MDAsMHgwMCwweDlDLDB4MEUsMHgwMCwweDAwLDB4MDgsMHgwMCwweDAwLDB4MDAsCi0gICAgICAweDdDLDB4MDAsMHgwMCwweDAwLDB4MDEsMHgwMCwweDAwLDB4MDAsMHhEOCwweDAwLDB4MDAsMHgwMCwweDAzLDB4MDAsMHgwMCwweDAwLDB4NkQsMHg2RiwweDZFLDB4MDAsCi0gICAgICAweDA0LDB4MDAsMHgwMCwweDAwLDB4NEQsMHg0RiwweDRFLDB4NTMsMHgwMCwweDAwLDB4MDAsMHgwMCwweDA3LDB4MDAsMHgwMCwweDAwLDB4NDgsMHgwNSwweDAwLDB4MDAsCi0gICAgICAweEI0LDB4MDIsMHgwMCwweDAwLDB4RjQsMHgwMywweDAwLDB4MDAsMHgwMCwweDA5LDB4MDAsMHgwMCwweDhDLDB4MDYsMHgwMCwweDAwLDB4QjgsMHgwNywweDAwLDB4MDAsCi0gICAgICAweEU4LDB4MEEsMHgwMCwweDAwLDB4MEUsMHgwMCwweDAwLDB4MDAsMHgxMCwweDMxLDB4MDAsMHgwMCwweDRDLDB4MEUsMHgwMCwweDAwLDB4RTQsMHgyRCwweDAwLDB4MDAsCi0gICAgICAweEMwLDB4MkUsMHgwMCwweDAwLDB4RDgsMHgyRiwweDAwLDB4MDAsMHgxOCwweDM1LDB4MDAsMHgwMCwweEY4LDB4MzMsMHgwMCwweDAwLDB4NzAsMHgwQiwweDAwLDB4MDAsCi0gICAgICAweEYwLDB4MzEsMHgwMCwweDAwLDB4RTAsMHgzNSwweDAwLDB4MDAsMHgxOCwweDM2LDB4MDAsMHgwMCwweDA4LDB4MzcsMHgwMCwweDAwLDB4QkMsMHgzNywweDAwLDB4MDAsCi0gICAgICAweDY0LDB4MzYsMHgwMCwweDAwLDB4MDMsMHgwMCwweDAwLDB4MDAsMHgzOCwweDAwLDB4MDAsMHgwMCwweDFDLDB4MDAsMHgwMCwweDAwLDB4MDQsMHgwMCwweDAwLDB4MDAsCi0gICAgICAweEVDLDB4Q0IsMHhGRiwweEZGLDB4MEMsMHgzNiwweDAwLDB4MDAsMHgwNCwweDAwLDB4MDAsMHgwMCwweDAxLDB4MDAsMHgwMCwweDAwLDB4NTgsMHgzNiwweDAwLDB4MDAsCi0gICAgICAweDAwLDB4Q0MsMHhGRiwweEZGLDB4QUMsMHgzNywweDAwLDB4MDAsMHgwNCwweDAwLDB4MDAsMHgwMCwweDAyLDB4MDAsMHgwMCwweDAwLDB4NDQsMHgzNiwweDAwLDB4MDAsCi0gICAgICAweDlDLDB4MzcsMHgwMCwweDAwLDB4MTgsMHhDQywweEZGLDB4RkYsMHgzOCwweDM2LDB4MDAsMHgwMCwweDA0LDB4MDAsMHgwMCwweDAwLDB4MDIsMHgwMCwweDAwLDB4MDAsCi0gICAgICAweDJDLDB4MzYsMHgwMCwweDAwLDB4ODQsMHgzNywweDAwLDB4MDAsMHgwMCwweDAwLDB4MEUsMHgwMCwweDE0LDB4MDAsMHgwNCwweDAwLDB4MDgsMHgwMCwweDAwLDB4MDAsCisgICAgc3RhdGljIGNvbnN0IHVpbnQ4X3QgYmZic0RhdGFbMTQ3ODRdID0geworICAgICAgMHgxQywweDAwLDB4MDAsMHgwMCwweDQyLDB4NDYsMHg0MiwweDUzLDB4MTQsMHgwMCwweDIwLDB4MDAsMHgwNCwweDAwLDB4MDgsMHgwMCwweDBDLDB4MDAsMHgxMCwweDAwLAorICAgICAgMHgxNCwweDAwLDB4MTgsMHgwMCwweDAwLDB4MDAsMHgxQywweDAwLDB4MTQsMHgwMCwweDAwLDB4MDAsMHg1OCwweDAwLDB4MDAsMHgwMCwweDM0LDB4MDAsMHgwMCwweDAwLAorICAgICAgMHgyNCwweDAwLDB4MDAsMHgwMCwweDE4LDB4MDAsMHgwMCwweDAwLDB4QTAsMHgwRSwweDAwLDB4MDAsMHgwOCwweDAwLDB4MDAsMHgwMCwweDgwLDB4MDAsMHgwMCwweDAwLAorICAgICAgMHgwMSwweDAwLDB4MDAsMHgwMCwweERDLDB4MDAsMHgwMCwweDAwLDB4MDMsMHgwMCwweDAwLDB4MDAsMHg2RCwweDZGLDB4NkUsMHgwMCwweDA0LDB4MDAsMHgwMCwweDAwLAorICAgICAgMHg0RCwweDRGLDB4NEUsMHg1MywweDAwLDB4MDAsMHgwMCwweDAwLDB4MDcsMHgwMCwweDAwLDB4MDAsMHg0QywweDA1LDB4MDAsMHgwMCwweEI4LDB4MDIsMHgwMCwweDAwLAorICAgICAgMHhGOCwweDAzLDB4MDAsMHgwMCwweDA0LDB4MDksMHgwMCwweDAwLDB4OTAsMHgwNiwweDAwLDB4MDAsMHhCQywweDA3LDB4MDAsMHgwMCwweEVDLDB4MEEsMHgwMCwweDAwLAorICAgICAgMHgwRiwweDAwLDB4MDAsMHgwMCwweDlDLDB4MzEsMHgwMCwweDAwLDB4NTAsMHgwRSwweDAwLDB4MDAsMHhFOCwweDJELDB4MDAsMHgwMCwweEM0LDB4MkUsMHgwMCwweDAwLAorICAgICAgMHg2NCwweDMwLDB4MDAsMHgwMCwweEQ4LDB4MkYsMHgwMCwweDAwLDB4QTAsMHgzNSwweDAwLDB4MDAsMHg4MCwweDM0LDB4MDAsMHgwMCwweDcwLDB4MEIsMHgwMCwweDAwLAorICAgICAgMHg3OCwweDMyLDB4MDAsMHgwMCwweDY4LDB4MzYsMHgwMCwweDAwLDB4QTAsMHgzNiwweDAwLDB4MDAsMHg5MCwweDM3LDB4MDAsMHgwMCwweDQ0LDB4MzgsMHgwMCwweDAwLAorICAgICAgMHhFQywweDM2LDB4MDAsMHgwMCwweDAzLDB4MDAsMHgwMCwweDAwLDB4MzgsMHgwMCwweDAwLDB4MDAsMHgxQywweDAwLDB4MDAsMHgwMCwweDA0LDB4MDAsMHgwMCwweDAwLAorICAgICAgMHg2NCwweENCLDB4RkYsMHhGRiwweDk0LDB4MzYsMHgwMCwweDAwLDB4MDQsMHgwMCwweDAwLDB4MDAsMHgwMSwweDAwLDB4MDAsMHgwMCwweEUwLDB4MzYsMHgwMCwweDAwLAorICAgICAgMHg3OCwweENCLDB4RkYsMHhGRiwweDM0LDB4MzgsMHgwMCwweDAwLDB4MDQsMHgwMCwweDAwLDB4MDAsMHgwMiwweDAwLDB4MDAsMHgwMCwweENDLDB4MzYsMHgwMCwweDAwLAorICAgICAgMHgyNCwweDM4LDB4MDAsMHgwMCwweDkwLDB4Q0IsMHhGRiwweEZGLDB4QzAsMHgzNiwweDAwLDB4MDAsMHgwNCwweDAwLDB4MDAsMHgwMCwweDAyLDB4MDAsMHgwMCwweDAwLAorICAgICAgMHhCNCwweDM2LDB4MDAsMHgwMCwweDBDLDB4MzgsMHgwMCwweDAwLDB4MDAsMHgwMCwweDBFLDB4MDAsMHgxNCwweDAwLDB4MDQsMHgwMCwweDA4LDB4MDAsMHgwMCwweDAwLAogICAgICAgMHgwQywweDAwLDB4MTAsMHgwMCwweDBFLDB4MDAsMHgwMCwweDAwLDB4MjgsMHgwMCwweDAwLDB4MDAsMHgxMCwweDAwLDB4MDAsMHgwMCwweDA4LDB4MDAsMHgwMCwweDAwLAotICAgICAgMHhBQywweDM1LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDQsMHgwMCwweDAwLDB4MDAsMHg4OCwweDAxLDB4MDAsMHgwMCwweEY0LDB4MDAsMHgwMCwweDAwLAorICAgICAgMHgzNCwweDM2LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDQsMHgwMCwweDAwLDB4MDAsMHg4OCwweDAxLDB4MDAsMHgwMCwweEY0LDB4MDAsMHgwMCwweDAwLAogICAgICAgMHg5MCwweDAwLDB4MDAsMHgwMCwweDI4LDB4MDAsMHgwMCwweDAwLDB4MUQsMHgwMCwweDAwLDB4MDAsMHg0RCwweDc5LDB4NDcsMHg2MSwweDZELDB4NjUsMHgyRSwweDQ1LAogICAgICAgMHg3OCwweDYxLDB4NkQsMHg3MCwweDZDLDB4NjUsMHgyRSwweDRELDB4NkYsMHg2RSwweDczLDB4NzQsMHg2NSwweDcyLDB4NTMsMHg3NCwweDZGLDB4NzIsMHg2MSwweDY3LAogICAgICAgMHg2NSwweDAwLDB4MDAsMHgwMCwweEJBLDB4RkUsMHhGRiwweEZGLDB4NDgsMHgwMCwweDAwLDB4MDAsMHg1QywweDBELDB4MDAsMHgwMCwweEQ0LDB4MkQsMHgwMCwweDAwLAogICAgICAgMHgwQywweDAwLDB4MDAsMHgwMCwweDA0LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMSwweDAwLDB4MDAsMHgwMCwweDA0LDB4MDAsMHgwMCwweDAwLAotICAgICAgMHhCNCwweENDLDB4RkYsMHhGRiwweDE0LDB4MDAsMHgwMCwweDAwLDB4MDQsMHgwMCwweDAwLDB4MDAsMHgwNCwweDAwLDB4MDAsMHgwMCwweDYyLDB4NjksMHg2NCwweDY5LAorICAgICAgMHgyQywweENDLDB4RkYsMHhGRiwweDE0LDB4MDAsMHgwMCwweDAwLDB4MDQsMHgwMCwweDAwLDB4MDAsMHgwNCwweDAwLDB4MDAsMHgwMCwweDYyLDB4NjksMHg2NCwweDY5LAogICAgICAgMHgwMCwweDAwLDB4MDAsMHgwMCwweDA5LDB4MDAsMHgwMCwweDAwLDB4NzMsMHg3NCwweDcyLDB4NjUsMHg2MSwweDZELDB4NjksMHg2RSwweDY3LDB4MDAsMHgwMCwweDAwLAogICAgICAgMHgxMiwweDAwLDB4MDAsMHgwMCwweDQ3LDB4NjUsMHg3NCwweDRELDB4NjksMHg2RSwweDRELDB4NjEsMHg3OCwweDQ4LDB4NjksMHg3NCwweDUwLDB4NkYsMHg2OSwweDZFLAogICAgICAgMHg3NCwweDczLDB4MDAsMHgwMCwweDFFLDB4RkYsMHhGRiwweEZGLDB4NDgsMHgwMCwweDAwLDB4MDAsMHhGOCwweDBDLDB4MDAsMHgwMCwweDcwLDB4MkQsMHgwMCwweDAwLAogICAgICAgMHgwQywweDAwLDB4MDAsMHgwMCwweDA0LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMSwweDAwLDB4MDAsMHgwMCwweDA0LDB4MDAsMHgwMCwweDAwLAotICAgICAgMHgxOCwweENELDB4RkYsMHhGRiwweDE0LDB4MDAsMHgwMCwweDAwLDB4MDQsMHgwMCwweDAwLDB4MDAsMHgwNiwweDAwLDB4MDAsMHgwMCwweDYzLDB4NkMsMHg2OSwweDY1LAorICAgICAgMHg5MCwweENDLDB4RkYsMHhGRiwweDE0LDB4MDAsMHgwMCwweDAwLDB4MDQsMHgwMCwweDAwLDB4MDAsMHgwNiwweDAwLDB4MDAsMHgwMCwweDYzLDB4NkMsMHg2OSwweDY1LAogICAgICAgMHg2RSwweDc0LDB4MDAsMHgwMCwweDA5LDB4MDAsMHgwMCwweDAwLDB4NzMsMHg3NCwweDcyLDB4NjUsMHg2MSwweDZELDB4NjksMHg2RSwweDY3LDB4MDAsMHgwMCwweDAwLAogICAgICAgMHgwRSwweDAwLDB4MDAsMHgwMCwweDQ3LDB4NjUsMHg3NCwweDRELDB4NjEsMHg3OCwweDQ4LDB4NjksMHg3NCwweDUwLDB4NkYsMHg2OSwweDZFLDB4NzQsMHgwMCwweDAwLAogICAgICAgMHg3RSwweEZGLDB4RkYsMHhGRiwweDcwLDB4MDAsMHgwMCwweDAwLDB4MTQsMHgyRCwweDAwLDB4MDAsMHg5NCwweDBDLDB4MDAsMHgwMCwweDBDLDB4MDAsMHgwMCwweDAwLAogICAgICAgMHgwNCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDIsMHgwMCwweDAwLDB4MDAsMHgzMCwweDAwLDB4MDAsMHgwMCwweDA0LDB4MDAsMHgwMCwweDAwLAotICAgICAgMHg3QywweENELDB4RkYsMHhGRiwweDE0LDB4MDAsMHgwMCwweDAwLDB4MDQsMHgwMCwweDAwLDB4MDAsMHgwNiwweDAwLDB4MDAsMHgwMCwweDczLDB4NjUsMHg3MiwweDc2LAorICAgICAgMHhGNCwweENDLDB4RkYsMHhGRiwweDE0LDB4MDAsMHgwMCwweDAwLDB4MDQsMHgwMCwweDAwLDB4MDAsMHgwNiwweDAwLDB4MDAsMHgwMCwweDczLDB4NjUsMHg3MiwweDc2LAogICAgICAgMHg2NSwweDcyLDB4MDAsMHgwMCwweDA5LDB4MDAsMHgwMCwweDAwLDB4NzMsMHg3NCwweDcyLDB4NjUsMHg2MSwweDZELDB4NjksMHg2RSwweDY3LDB4MDAsMHgwMCwweDAwLAotICAgICAgMHhBNCwweENELDB4RkYsMHhGRiwweDEwLDB4MDAsMHgwMCwweDAwLDB4MDQsMHgwMCwweDAwLDB4MDAsMHgwMSwweDAwLDB4MDAsMHgwMCwweDMwLDB4MDAsMHgwMCwweDAwLAorICAgICAgMHgxQywweENELDB4RkYsMHhGRiwweDEwLDB4MDAsMHgwMCwweDAwLDB4MDQsMHgwMCwweDAwLDB4MDAsMHgwMSwweDAwLDB4MDAsMHgwMCwweDMwLDB4MDAsMHgwMCwweDAwLAogICAgICAgMHgwQSwweDAwLDB4MDAsMHgwMCwweDY5LDB4NjQsMHg2NSwweDZELDB4NzAsMHg2RiwweDc0LDB4NjUsMHg2RSwweDc0LDB4MDAsMHgwMCwweDA4LDB4MDAsMHgwMCwweDAwLAogICAgICAgMHg1MiwweDY1LDB4NzQsMHg3MiwweDY5LDB4NjUsMHg3NiwweDY1LDB4MDAsMHgwMCwweDBFLDB4MDAsMHgxOCwweDAwLDB4MDQsMHgwMCwweDA4LDB4MDAsMHgwQywweDAwLAogICAgICAgMHgxMCwweDAwLDB4MTQsMHgwMCwweDBFLDB4MDAsMHgwMCwweDAwLDB4NDgsMHgwMCwweDAwLDB4MDAsMHgwOCwweDBDLDB4MDAsMHgwMCwweDgwLDB4MkMsMHgwMCwweDAwLAogICAgICAgMHgwQywweDAwLDB4MDAsMHgwMCwweDA0LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMSwweDAwLDB4MDAsMHgwMCwweDA0LDB4MDAsMHgwMCwweDAwLAotICAgICAgMHgwOCwweENFLDB4RkYsMHhGRiwweDE0LDB4MDAsMHgwMCwweDAwLDB4MDQsMHgwMCwweDAwLDB4MDAsMHgwNCwweDAwLDB4MDAsMHgwMCwweDZFLDB4NkYsMHg2RSwweDY1LAorICAgICAgMHg4MCwweENELDB4RkYsMHhGRiwweDE0LDB4MDAsMHgwMCwweDAwLDB4MDQsMHgwMCwweDAwLDB4MDAsMHgwNCwweDAwLDB4MDAsMHgwMCwweDZFLDB4NkYsMHg2RSwweDY1LAogICAgICAgMHgwMCwweDAwLDB4MDAsMHgwMCwweDA5LDB4MDAsMHgwMCwweDAwLDB4NzMsMHg3NCwweDcyLDB4NjUsMHg2MSwweDZELDB4NjksMHg2RSwweDY3LDB4MDAsMHgwMCwweDAwLAogICAgICAgMHgwNSwweDAwLDB4MDAsMHgwMCwweDUzLDB4NzQsMHg2RiwweDcyLDB4NjUsMHgwMCwweDAwLDB4MDAsMHg4MiwweEZELDB4RkYsMHhGRiwweDAwLDB4MDAsMHgwMCwweDAxLAotICAgICAgMHg0MCwweDAwLDB4MDAsMHgwMCwweDI4LDB4MDAsMHgwMCwweDAwLDB4MTAsMHgwMCwweDAwLDB4MDAsMHgwOCwweDAwLDB4MDAsMHgwMCwweEE4LDB4MzMsMHgwMCwweDAwLAotICAgICAgMHgwMCwweDAwLDB4MDAsMHgwMCwweEJDLDB4Q0QsMHhGRiwweEZGLDB4MDAsMHgwMCwweDAwLDB4MDEsMHgwMSwweDAwLDB4MDAsMHgwMCwweDAxLDB4MDAsMHgwMCwweDAwLAorICAgICAgMHg0MCwweDAwLDB4MDAsMHgwMCwweDI4LDB4MDAsMHgwMCwweDAwLDB4MTAsMHgwMCwweDAwLDB4MDAsMHgwOCwweDAwLDB4MDAsMHgwMCwweDMwLDB4MzQsMHgwMCwweDAwLAorICAgICAgMHgwMCwweDAwLDB4MDAsMHgwMCwweDM0LDB4Q0QsMHhGRiwweEZGLDB4MDAsMHgwMCwweDAwLDB4MDEsMHgwMSwweDAwLDB4MDAsMHgwMCwweDAxLDB4MDAsMHgwMCwweDAwLAogICAgICAgMHgwMSwweDAwLDB4MDAsMHgwMCwweDA0LDB4MDAsMHgwMCwweDAwLDB4RTAsMHgwMCwweDAwLDB4MDAsMHhBNCwweDAwLDB4MDAsMHgwMCwweDY4LDB4MDAsMHgwMCwweDAwLAogICAgICAgMHgyQywweDAwLDB4MDAsMHgwMCwweDIyLDB4MDAsMHgwMCwweDAwLDB4NEQsMHg3OSwweDQ3LDB4NjEsMHg2RCwweDY1LDB4MkUsMHg0NSwweDc4LDB4NjEsMHg2RCwweDcwLAogICAgICAgMHg2QywweDY1LDB4MkUsMHg0MSwweDZFLDB4NzksMHg0MSwweDZELDB4NjIsMHg2OSwweDY3LDB4NzUsMHg2RiwweDc1LDB4NzMsMHg0MSwweDZDLDB4NjksMHg2MSwweDczLAogICAgICAgMHg2NSwweDczLDB4MDAsMHgwMCwweDdFLDB4RjgsMHhGRiwweEZGLDB4MkMsMHgwMCwweDAwLDB4MDAsMHgxOCwweDAwLDB4MDAsMHgwMCwweDEwLDB4MDAsMHgwMCwweDAwLAotICAgICAgMHgwMywweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDc4LDB4Q0IsMHhGRiwweEZGLAorICAgICAgMHgwMywweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweEYwLDB4Q0EsMHhGRiwweEZGLAogICAgICAgMHgwMCwweDAwLDB4MDAsMHgwRiwweDAxLDB4MDAsMHgwMCwweDAwLDB4MDEsMHgwMCwweDAwLDB4MDAsMHgwMiwweDAwLDB4MDAsMHgwMCwweDRELDB4MzMsMHgwMCwweDAwLAogICAgICAgMHhCNiwweEY4LDB4RkYsMHhGRiwweDJDLDB4MDAsMHgwMCwweDAwLDB4MTgsMHgwMCwweDAwLDB4MDAsMHgxMCwweDAwLDB4MDAsMHgwMCwweDAyLDB4MDAsMHgwMCwweDAwLAotICAgICAgMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHhCMCwweENCLDB4RkYsMHhGRiwweDAwLDB4MDAsMHgwMCwweDBGLAorICAgICAgMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgyOCwweENCLDB4RkYsMHhGRiwweDAwLDB4MDAsMHgwMCwweDBGLAogICAgICAgMHgwMSwweDAwLDB4MDAsMHgwMCwweDAxLDB4MDAsMHgwMCwweDAwLDB4MDIsMHgwMCwweDAwLDB4MDAsMHg0RCwweDMyLDB4MDAsMHgwMCwweEVFLDB4RjgsMHhGRiwweEZGLAogICAgICAgMHgyQywweDAwLDB4MDAsMHgwMCwweDE4LDB4MDAsMHgwMCwweDAwLDB4MTAsMHgwMCwweDAwLDB4MDAsMHgwMSwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAotICAgICAgMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4RTgsMHhDQiwweEZGLDB4RkYsMHgwMCwweDAwLDB4MDAsMHgwRiwweDAxLDB4MDAsMHgwMCwweDAwLAorICAgICAgMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4NjAsMHhDQiwweEZGLDB4RkYsMHgwMCwweDAwLDB4MDAsMHgwRiwweDAxLDB4MDAsMHgwMCwweDAwLAogICAgICAgMHgwMSwweDAwLDB4MDAsMHgwMCwweDAyLDB4MDAsMHgwMCwweDAwLDB4NEQsMHgzMSwweDAwLDB4MDAsMHg3MiwweEY4LDB4RkYsMHhGRiwweDFDLDB4MDAsMHgwMCwweDAwLAogICAgICAgMHgwQywweDAwLDB4MDAsMHgwMCwweDA0LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHg2NCwweEY4LDB4RkYsMHhGRiwweDAxLDB4MDAsMHgwMCwweDAwLAogICAgICAgMHgwMSwweDAwLDB4MDAsMHgwMCwweDA0LDB4MDAsMHgwMCwweDAwLDB4NEUsMHg0RiwweDRFLDB4NDUsMHgwMCwweDAwLDB4MDAsMHgwMCwweEM2LDB4RkUsMHhGRiwweEZGLAogICAgICAgMHgwMCwweDAwLDB4MDAsMHgwMSwweDQwLDB4MDAsMHgwMCwweDAwLDB4MjgsMHgwMCwweDAwLDB4MDAsMHgxMCwweDAwLDB4MDAsMHgwMCwweDA4LDB4MDAsMHgwMCwweDAwLAotICAgICAgMHg2NCwweDMyLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHhDRiwweEZGLDB4RkYsMHgwMCwweDAwLDB4MDAsMHgwMSwweDAyLDB4MDAsMHgwMCwweDAwLAorICAgICAgMHhFQywweDMyLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4NzgsMHhDRSwweEZGLDB4RkYsMHgwMCwweDAwLDB4MDAsMHgwMSwweDAyLDB4MDAsMHgwMCwweDAwLAogICAgICAgMHgwMSwweDAwLDB4MDAsMHgwMCwweDAxLDB4MDAsMHgwMCwweDAwLDB4MDQsMHgwMCwweDAwLDB4MDAsMHhEOCwweDAwLDB4MDAsMHgwMCwweEEwLDB4MDAsMHgwMCwweDAwLAogICAgICAgMHg2NCwweDAwLDB4MDAsMHgwMCwweDI4LDB4MDAsMHgwMCwweDAwLDB4MUYsMHgwMCwweDAwLDB4MDAsMHg0RCwweDc5LDB4NDcsMHg2MSwweDZELDB4NjUsMHgyRSwweDQ1LAogICAgICAgMHg3OCwweDYxLDB4NkQsMHg3MCwweDZDLDB4NjUsMHgyRSwweDQxLDB4NkUsMHg3OSwweDU1LDB4NkUsMHg2OSwweDcxLDB4NzUsMHg2NSwweDQxLDB4NkMsMHg2OSwweDYxLAogICAgICAgMHg3MywweDY1LDB4NzMsMHgwMCwweEJFLDB4RjksMHhGRiwweEZGLDB4MkMsMHgwMCwweDAwLDB4MDAsMHgxOCwweDAwLDB4MDAsMHgwMCwweDEwLDB4MDAsMHgwMCwweDAwLAotICAgICAgMHgwMywweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweEI4LDB4Q0MsMHhGRiwweEZGLAotICAgICAgMHgwMCwweDAwLDB4MDAsMHgwRiwweDA5LDB4MDAsMHgwMCwweDAwLDB4MDEsMHgwMCwweDAwLDB4MDAsMHgwMiwweDAwLDB4MDAsMHgwMCwweDRELDB4MzIsMHgwMCwweDAwLAorICAgICAgMHgwMywweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDMwLDB4Q0MsMHhGRiwweEZGLAorICAgICAgMHgwMCwweDAwLDB4MDAsMHgwRiwweDBBLDB4MDAsMHgwMCwweDAwLDB4MDEsMHgwMCwweDAwLDB4MDAsMHgwMiwweDAwLDB4MDAsMHgwMCwweDRELDB4MzIsMHgwMCwweDAwLAogICAgICAgMHhGNiwweEY5LDB4RkYsMHhGRiwweDJDLDB4MDAsMHgwMCwweDAwLDB4MTgsMHgwMCwweDAwLDB4MDAsMHgxMCwweDAwLDB4MDAsMHgwMCwweDAyLDB4MDAsMHgwMCwweDAwLAotICAgICAgMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHhGMCwweENDLDB4RkYsMHhGRiwweDAwLDB4MDAsMHgwMCwweDBGLAotICAgICAgMHgwNiwweDAwLDB4MDAsMHgwMCwweDAxLDB4MDAsMHgwMCwweDAwLDB4MDIsMHgwMCwweDAwLDB4MDAsMHg1NCwweDUzLDB4MDAsMHgwMCwweDFFLDB4RkMsMHhGRiwweEZGLAorICAgICAgMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHg2OCwweENDLDB4RkYsMHhGRiwweDAwLDB4MDAsMHgwMCwweDBGLAorICAgICAgMHgwNywweDAwLDB4MDAsMHgwMCwweDAxLDB4MDAsMHgwMCwweDAwLDB4MDIsMHgwMCwweDAwLDB4MDAsMHg1NCwweDUzLDB4MDAsMHgwMCwweDFFLDB4RkMsMHhGRiwweEZGLAogICAgICAgMHgyOCwweDAwLDB4MDAsMHgwMCwweDE0LDB4MDAsMHgwMCwweDAwLDB4MEMsMHgwMCwweDAwLDB4MDAsMHgwMSwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAotICAgICAgMHgwMCwweDAwLDB4MDAsMHgwMCwweDI0LDB4Q0QsMHhGRiwweEZGLDB4MDAsMHgwMCwweDAwLDB4MEYsMHgwMSwweDAwLDB4MDAsMHgwMCwweDAxLDB4MDAsMHgwMCwweDAwLAorICAgICAgMHgwMCwweDAwLDB4MDAsMHgwMCwweDlDLDB4Q0MsMHhGRiwweEZGLDB4MDAsMHgwMCwweDAwLDB4MEYsMHgwMSwweDAwLDB4MDAsMHgwMCwweDAxLDB4MDAsMHgwMCwweDAwLAogICAgICAgMHgwMSwweDAwLDB4MDAsMHgwMCwweDRELDB4MDAsMHgwMCwweDAwLDB4QUUsMHhGOSwweEZGLDB4RkYsMHgxQywweDAwLDB4MDAsMHgwMCwweDBDLDB4MDAsMHgwMCwweDAwLAogICAgICAgMHgwNCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4QTAsMHhGOSwweEZGLDB4RkYsMHgwMSwweDAwLDB4MDAsMHgwMCwweDAxLDB4MDAsMHgwMCwweDAwLAogICAgICAgMHgwNCwweDAwLDB4MDAsMHgwMCwweDRFLDB4NEYsMHg0RSwweDQ1LDB4MDAsMHgwMCwweDEyLDB4MDAsMHgxQywweDAwLDB4MDgsMHgwMCwweDBDLDB4MDAsMHgwNywweDAwLAogICAgICAgMHgxMCwweDAwLDB4MDAsMHgwMCwweDE0LDB4MDAsMHgxOCwweDAwLDB4MTIsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMSwweDQwLDB4MDAsMHgwMCwweDAwLAotICAgICAgMHgyOCwweDAwLDB4MDAsMHgwMCwweDEwLDB4MDAsMHgwMCwweDAwLDB4MDgsMHgwMCwweDAwLDB4MDAsMHgxOCwweDMxLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAotICAgICAgMHg0QywweEQwLDB4RkYsMHhGRiwweDAwLDB4MDAsMHgwMCwweDAxLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMSwweDAwLDB4MDAsMHgwMCwweDAxLDB4MDAsMHgwMCwweDAwLAorICAgICAgMHgyOCwweDAwLDB4MDAsMHgwMCwweDEwLDB4MDAsMHgwMCwweDAwLDB4MDgsMHgwMCwweDAwLDB4MDAsMHhBMCwweDMxLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorICAgICAgMHhDNCwweENGLDB4RkYsMHhGRiwweDAwLDB4MDAsMHgwMCwweDAxLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMSwweDAwLDB4MDAsMHgwMCwweDAxLDB4MDAsMHgwMCwweDAwLAogICAgICAgMHgwNCwweDAwLDB4MDAsMHgwMCwweEYwLDB4MDAsMHgwMCwweDAwLDB4QjQsMHgwMCwweDAwLDB4MDAsMHg2OCwweDAwLDB4MDAsMHgwMCwweDFDLDB4MDAsMHgwMCwweDAwLAogICAgICAgMHgxMiwweDAwLDB4MDAsMHgwMCwweDRELDB4NzksMHg0NywweDYxLDB4NkQsMHg2NSwweDJFLDB4NDUsMHg3OCwweDYxLDB4NkQsMHg3MCwweDZDLDB4NjUsMHgyRSwweDQxLAogICAgICAgMHg2RSwweDc5LDB4MDAsMHgwMCwweEVFLDB4RkMsMHhGRiwweEZGLDB4MjgsMHgwMCwweDAwLDB4MDAsMHgxNCwweDAwLDB4MDAsMHgwMCwweDBDLDB4MDAsMHgwMCwweDAwLAotICAgICAgMHgwMywweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHhGNCwweENELDB4RkYsMHhGRiwweDAwLDB4MDAsMHgwMCwweDBGLAotICAgICAgMHgwOSwweDAwLDB4MDAsMHgwMCwweDAxLDB4MDAsMHgwMCwweDAwLDB4MTcsMHgwMCwweDAwLDB4MDAsMHg0RCwweDc5LDB4NDcsMHg2MSwweDZELDB4NjUsMHg1RiwweDQ1LAorICAgICAgMHgwMywweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHg2QywweENELDB4RkYsMHhGRiwweDAwLDB4MDAsMHgwMCwweDBGLAorICAgICAgMHgwQSwweDAwLDB4MDAsMHgwMCwweDAxLDB4MDAsMHgwMCwweDAwLDB4MTcsMHgwMCwweDAwLDB4MDAsMHg0RCwweDc5LDB4NDcsMHg2MSwweDZELDB4NjUsMHg1RiwweDQ1LAogICAgICAgMHg3OCwweDYxLDB4NkQsMHg3MCwweDZDLDB4NjUsMHgzMiwweDVGLDB4NEQsMHg2RiwweDZFLDB4NzMsMHg3NCwweDY1LDB4NzIsMHgwMCwweDM2LDB4RkQsMHhGRiwweEZGLAogICAgICAgMHgyOCwweDAwLDB4MDAsMHgwMCwweDE0LDB4MDAsMHgwMCwweDAwLDB4MEMsMHgwMCwweDAwLDB4MDAsMHgwMiwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAotICAgICAgMHgwMCwweDAwLDB4MDAsMHgwMCwweDNDLDB4Q0UsMHhGRiwweEZGLDB4MDAsMHgwMCwweDAwLDB4MEYsMHgwNiwweDAwLDB4MDAsMHgwMCwweDAxLDB4MDAsMHgwMCwweDAwLAorICAgICAgMHgwMCwweDAwLDB4MDAsMHgwMCwweEI0LDB4Q0QsMHhGRiwweEZGLDB4MDAsMHgwMCwweDAwLDB4MEYsMHgwNywweDAwLDB4MDAsMHgwMCwweDAxLDB4MDAsMHgwMCwweDAwLAogICAgICAgMHgxNywweDAwLDB4MDAsMHgwMCwweDU0LDB4NjUsMHg3MywweDc0LDB4NTMsMHg2OSwweDZELDB4NzAsMHg2QywweDY1LDB4NTQsMHg2MSwweDYyLDB4NkMsMHg2NSwweDU3LAogICAgICAgMHg2OSwweDc0LDB4NjgsMHg0NSwweDZFLDB4NzUsMHg2RCwweDAwLDB4N0UsMHhGRCwweEZGLDB4RkYsMHgyOCwweDAwLDB4MDAsMHgwMCwweDE0LDB4MDAsMHgwMCwweDAwLAotICAgICAgMHgwQywweDAwLDB4MDAsMHgwMCwweDAxLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDg0LDB4Q0UsMHhGRiwweEZGLAorICAgICAgMHgwQywweDAwLDB4MDAsMHgwMCwweDAxLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweEZDLDB4Q0QsMHhGRiwweEZGLAogICAgICAgMHgwMCwweDAwLDB4MDAsMHgwRiwweDAxLDB4MDAsMHgwMCwweDAwLDB4MDEsMHgwMCwweDAwLDB4MDAsMHgwNywweDAwLDB4MDAsMHgwMCwweDRELDB4NkYsMHg2RSwweDczLAogICAgICAgMHg3NCwweDY1LDB4NzIsMHgwMCwweDEyLDB4RkIsMHhGRiwweEZGLDB4MUMsMHgwMCwweDAwLDB4MDAsMHgwQywweDAwLDB4MDAsMHgwMCwweDA0LDB4MDAsMHgwMCwweDAwLAogICAgICAgMHgwMCwweDAwLDB4MDAsMHgwMCwweDA0LDB4RkIsMHhGRiwweEZGLDB4MDEsMHgwMCwweDAwLDB4MDAsMHgwMSwweDAwLDB4MDAsMHgwMCwweDA0LDB4MDAsMHgwMCwweDAwLAogICAgICAgMHg0RSwweDRGLDB4NEUsMHg0NSwweDAwLDB4MDAsMHgwMCwweDAwLDB4QTIsMHhGRCwweEZGLDB4RkYsMHg2QywweDAwLDB4MDAsMHgwMCwweDU4LDB4MDAsMHgwMCwweDAwLAotICAgICAgMHg0MCwweDAwLDB4MDAsMHgwMCwweDEwLDB4MDAsMHgwMCwweDAwLDB4MDgsMHgwMCwweDAwLDB4MDAsMHhDNCwweDJGLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAotICAgICAgMHgwMSwweDAwLDB4MDAsMHgwMCwweDA0LDB4MDAsMHgwMCwweDAwLDB4NDgsMHhEMiwweEZGLDB4RkYsMHgxMCwweDAwLDB4MDAsMHgwMCwweDA0LDB4MDAsMHgwMCwweDAwLAorICAgICAgMHg0MCwweDAwLDB4MDAsMHgwMCwweDEwLDB4MDAsMHgwMCwweDAwLDB4MDgsMHgwMCwweDAwLDB4MDAsMHg0QywweDMwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorICAgICAgMHgwMSwweDAwLDB4MDAsMHgwMCwweDA0LDB4MDAsMHgwMCwweDAwLDB4QzAsMHhEMSwweEZGLDB4RkYsMHgxMCwweDAwLDB4MDAsMHgwMCwweDA0LDB4MDAsMHgwMCwweDAwLAogICAgICAgMHgwMSwweDAwLDB4MDAsMHgwMCwweDMwLDB4MDAsMHgwMCwweDAwLDB4MDksMHgwMCwweDAwLDB4MDAsMHg2MiwweDY5LDB4NzQsMHg1RiwweDY2LDB4NkMsMHg2MSwweDY3LAotICAgICAgMHg3MywweDAwLDB4MDAsMHgwMCwweENDLDB4RDEsMHhGRiwweEZGLDB4MDAsMHgwMCwweDAwLDB4MEEsMHgwNCwweDAwLDB4MDAsMHgwMCwweDA4LDB4MDAsMHgwMCwweDAwLAorICAgICAgMHg3MywweDAwLDB4MDAsMHgwMCwweDQ0LDB4RDEsMHhGRiwweEZGLDB4MDAsMHgwMCwweDAwLDB4MEEsMHgwNCwweDAwLDB4MDAsMHgwMCwweDA4LDB4MDAsMHgwMCwweDAwLAogICAgICAgMHgwMSwweDAwLDB4MDAsMHgwMCwweDAzLDB4MDAsMHgwMCwweDAwLDB4OTgsMHgwMCwweDAwLDB4MDAsMHg1QywweDAwLDB4MDAsMHgwMCwweDIwLDB4MDAsMHgwMCwweDAwLAogICAgICAgMHgxNywweDAwLDB4MDAsMHgwMCwweDRELDB4NzksMHg0NywweDYxLDB4NkQsMHg2NSwweDJFLDB4NDUsMHg3OCwweDYxLDB4NkQsMHg3MCwweDZDLDB4NjUsMHgyRSwweDRDLAogICAgICAgMHg2RiwweDZFLDB4NjcsMHg0NSwweDZFLDB4NzUsMHg2RCwweDAwLDB4N0UsMHhGQywweEZGLDB4RkYsMHgyOCwweDAwLDB4MDAsMHgwMCwweDE4LDB4MDAsMHgwMCwweDAwLApAQCAtMTE4LDggKzEyNSw4IEBACiAgICAgICAweERFLDB4RkUsMHhGRiwweEZGLDB4MjQsMHgwMCwweDAwLDB4MDAsMHgxNCwweDAwLDB4MDAsMHgwMCwweDBDLDB4MDAsMHgwMCwweDAwLDB4MDIsMHgwMCwweDAwLDB4MDAsCiAgICAgICAweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgzNCwweEZDLDB4RkYsMHhGRiwweDAxLDB4MDAsMHgwMCwweDAwLDB4MDEsMHgwMCwweDAwLDB4MDAsCiAgICAgICAweDA3LDB4MDAsMHgwMCwweDAwLDB4NEMsMHg2RiwweDZFLDB4NjcsMHg0RiwweDZFLDB4NjUsMHgwMCwweERFLDB4RkMsMHhGRiwweEZGLDB4NDAsMHgwMCwweDAwLDB4MDAsCi0gICAgICAweDI4LDB4MDAsMHgwMCwweDAwLDB4MTAsMHgwMCwweDAwLDB4MDAsMHgwOCwweDAwLDB4MDAsMHgwMCwweDk4LDB4MkUsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCi0gICAgICAweENDLDB4RDIsMHhGRiwweEZGLDB4MDAsMHgwMCwweDAwLDB4MDMsMHgwNSwweDAwLDB4MDAsMHgwMCwweDAxLDB4MDAsMHgwMCwweDAwLDB4MDEsMHgwMCwweDAwLDB4MDAsCisgICAgICAweDI4LDB4MDAsMHgwMCwweDAwLDB4MTAsMHgwMCwweDAwLDB4MDAsMHgwOCwweDAwLDB4MDAsMHgwMCwweDIwLDB4MkYsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisgICAgICAweDQ0LDB4RDIsMHhGRiwweEZGLDB4MDAsMHgwMCwweDAwLDB4MDMsMHgwNSwweDAwLDB4MDAsMHgwMCwweDAxLDB4MDAsMHgwMCwweDAwLDB4MDEsMHgwMCwweDAwLDB4MDAsCiAgICAgICAweDA0LDB4MDAsMHgwMCwweDAwLDB4QzgsMHgwMCwweDAwLDB4MDAsMHg4QywweDAwLDB4MDAsMHgwMCwweDUwLDB4MDAsMHgwMCwweDAwLDB4MUMsMHgwMCwweDAwLDB4MDAsCiAgICAgICAweDEzLDB4MDAsMHgwMCwweDAwLDB4NEQsMHg3OSwweDQ3LDB4NjEsMHg2RCwweDY1LDB4MkUsMHg0NSwweDc4LDB4NjEsMHg2RCwweDcwLDB4NkMsMHg2NSwweDJFLDB4NTIsCiAgICAgICAweDYxLDB4NjMsMHg2NSwweDAwLDB4NkUsMHhGRiwweEZGLDB4RkYsMHgyNCwweDAwLDB4MDAsMHgwMCwweDE0LDB4MDAsMHgwMCwweDAwLDB4MEMsMHgwMCwweDAwLDB4MDAsCkBAIC0xMzQsMTIgKzE0MSwxMiBAQAogICAgICAgMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLDB4MDAsMHgwMCwweDAwLDB4MDAsMHg2NCwweEZELDB4RkYsMHhGRiwweDAxLDB4MDAsMHgwMCwweDAwLAogICAgICAgMHgwMSwweDAwLDB4MDAsMHgwMCwweDA0LDB4MDAsMHgwMCwweDAwLDB4NEUsMHg2RiwweDZFLDB4NjUsMHgwMCwweDAwLDB4MTIsMHgwMCwweDFDLDB4MDAsMHgwNCwweDAwLAogICAgICAgMHgwOCwweDAwLDB4MDAsMHgwMCwweDBDLDB4MDAsMHgxMCwweDAwLDB4MTQsMHgwMCwweDE4LDB4MDAsMHgxMiwweDAwLDB4MDAsMHgwMCwweDlDLDB4MDAsMHgwMCwweDAwLAotICAgICAgMHg4OCwweDAwLDB4MDAsMHgwMCwweDcwLDB4MDAsMHgwMCwweDAwLDB4NDAsMHgwMCwweDAwLDB4MDAsMHgwOCwweDAwLDB4MDAsMHgwMCwweDU0LDB4MkQsMHgwMCwweDAwLAorICAgICAgMHg4OCwweDAwLDB4MDAsMHgwMCwweDcwLDB4MDAsMHgwMCwweDAwLDB4NDAsMHgwMCwweDAwLDB4MDAsMHgwOCwweDAwLDB4MDAsMHgwMCwweERDLDB4MkQsMHgwMCwweDAwLAogICAgICAgMHgwMSwweDAwLDB4MDAsMHgwMCwweDA0LDB4MDAsMHgwMCwweDAwLDB4MjcsMHgwMCwweDAwLDB4MDAsMHgyMCwweDQzLDB4NkYsMHg2RCwweDcwLDB4NkYsMHg3MywweDY5LAogICAgICAgMHg3NCwweDY1LDB4MjAsMHg2MywweDZGLDB4NkQsMHg3MCwweDZGLDB4NkUsMHg2NSwweDZFLDB4NzQsMHg3MywweDIwLDB4NkYsMHg2NiwweDIwLDB4NEQsMHg2RiwweDZFLAogICAgICAgMHg3MywweDc0LDB4NjUsMHg3MiwweDIwLDB4NjMsMHg2RiwweDZDLDB4NkYsMHg3MiwweDJFLDB4MDAsMHgwMSwweDAwLDB4MDAsMHgwMCwweDA0LDB4MDAsMHgwMCwweDAwLAotICAgICAgMHhFOCwweEQ0LDB4RkYsMHhGRiwweDEwLDB4MDAsMHgwMCwweDAwLDB4MDQsMHgwMCwweDAwLDB4MDAsMHgwMSwweDAwLDB4MDAsMHgwMCwweDMwLDB4MDAsMHgwMCwweDAwLAotICAgICAgMHgwOSwweDAwLDB4MDAsMHgwMCwweDYyLDB4NjksMHg3NCwweDVGLDB4NjYsMHg2QywweDYxLDB4NjcsMHg3MywweDAwLDB4MDAsMHgwMCwweDZDLDB4RDQsMHhGRiwweEZGLAorICAgICAgMHg2MCwweEQ0LDB4RkYsMHhGRiwweDEwLDB4MDAsMHgwMCwweDAwLDB4MDQsMHgwMCwweDAwLDB4MDAsMHgwMSwweDAwLDB4MDAsMHgwMCwweDMwLDB4MDAsMHgwMCwweDAwLAorICAgICAgMHgwOSwweDAwLDB4MDAsMHgwMCwweDYyLDB4NjksMHg3NCwweDVGLDB4NjYsMHg2QywweDYxLDB4NjcsMHg3MywweDAwLDB4MDAsMHgwMCwweEU0LDB4RDMsMHhGRiwweEZGLAogICAgICAgMHgwMCwweDAwLDB4MDAsMHgwNCwweDAzLDB4MDAsMHgwMCwweDAwLDB4MDEsMHgwMCwweDAwLDB4MDAsMHgwMSwweDAwLDB4MDAsMHgwMCwweDAzLDB4MDAsMHgwMCwweDAwLAogICAgICAgMHgxOCwweDAxLDB4MDAsMHgwMCwweDg0LDB4MDAsMHgwMCwweDAwLDB4MjAsMHgwMCwweDAwLDB4MDAsMHgxNCwweDAwLDB4MDAsMHgwMCwweDRELDB4NzksMHg0NywweDYxLAogICAgICAgMHg2RCwweDY1LDB4MkUsMHg0NSwweDc4LDB4NjEsMHg2RCwweDcwLDB4NkMsMHg2NSwweDJFLDB4NDMsMHg2RiwweDZDLDB4NkYsMHg3MiwweDAwLDB4MDAsMHgwMCwweDAwLApAQCAtMTU5LDUxICsxNjYsNTEgQEAKICAgICAgIDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4NTgsMHhGRiwweEZGLDB4RkYsMHgwMSwweDAwLDB4MDAsMHgwMCwKICAgICAgIDB4MDEsMHgwMCwweDAwLDB4MDAsMHgwMywweDAwLDB4MDAsMHgwMCwweDUyLDB4NjUsMHg2NCwweDAwLDB4MDAsMHgwMCwweDEyLDB4MDAsMHgxOCwweDAwLDB4MDQsMHgwMCwKICAgICAgIDB4MDgsMHgwMCwweDAwLDB4MDAsMHgwQywweDAwLDB4MDAsMHgwMCwweDEwLDB4MDAsMHgxNCwweDAwLDB4MTIsMHgwMCwweDAwLDB4MDAsMHgzNCwweDAwLDB4MDAsMHgwMCwKLSAgICAgIDB4MjgsMHgwMCwweDAwLDB4MDAsMHgxMCwweDAwLDB4MDAsMHgwMCwweDA4LDB4MDAsMHgwMCwweDAwLDB4MTgsMHgyRCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKLSAgICAgIDB4MDAsMHhENiwweEZGLDB4RkYsMHgwMCwweDAwLDB4MDAsMHgwOSwweDA2LDB4MDAsMHgwMCwweDAwLDB4MDgsMHgwMCwweDAwLDB4MDAsMHgwMSwweDAwLDB4MDAsMHgwMCwKKyAgICAgIDB4MjgsMHgwMCwweDAwLDB4MDAsMHgxMCwweDAwLDB4MDAsMHgwMCwweDA4LDB4MDAsMHgwMCwweDAwLDB4QTAsMHgyRCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKyAgICAgIDB4NzgsMHhENSwweEZGLDB4RkYsMHgwMCwweDAwLDB4MDAsMHgwOSwweDA2LDB4MDAsMHgwMCwweDAwLDB4MDgsMHgwMCwweDAwLDB4MDAsMHgwMSwweDAwLDB4MDAsMHgwMCwKICAgICAgIDB4MDEsMHgwMCwweDAwLDB4MDAsMHgzOCwweDAwLDB4MDAsMHgwMCwweDIxLDB4MDAsMHgwMCwweDAwLDB4NEQsMHg3OSwweDQ3LDB4NjEsMHg2RCwweDY1LDB4MkUsMHg0RiwKICAgICAgIDB4NzQsMHg2OCwweDY1LDB4NzIsMHg0RSwweDYxLDB4NkQsMHg2NSwweDUzLDB4NzAsMHg2MSwweDYzLDB4NjUsMHgyRSwweDQ2LDB4NzIsMHg2RiwweDZELDB4NDksMHg2RSwKICAgICAgIDB4NjMsMHg2QywweDc1LDB4NjQsMHg2NSwweDAwLDB4MEUsMHgwMCwweDEwLDB4MDAsMHgwNCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwOCwweDAwLDB4MEMsMHgwMCwKICAgICAgIDB4MEUsMHgwMCwweDAwLDB4MDAsMHgyQywweDAwLDB4MDAsMHgwMCwweDFDLDB4MDAsMHgwMCwweDAwLDB4MDQsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKICAgICAgIDB4MTAsMHgwMCwweDBDLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDQsMHgwMCwweDA4LDB4MDAsMHgxMCwweDAwLDB4MDAsMHgwMCwKICAgICAgIDB4MDEsMHgwMCwweDAwLDB4MDAsMHgwMSwweDAwLDB4MDAsMHgwMCwweDBBLDB4MDAsMHgwMCwweDAwLDB4NDksMHg2RSwweDYzLDB4NkMsMHg3NSwweDY0LDB4NjUsMHg1NiwKLSAgICAgIDB4NjEsMHg2QywweDAwLDB4MDAsMHg2QywweEQ0LDB4RkYsMHhGRiwweDRDLDB4MDAsMHgwMCwweDAwLDB4MTQsMHgwMCwweDAwLDB4MDAsMHgwMSwweDAwLDB4MDAsMHgwMCwKLSAgICAgIDB4MDgsMHgwMCwweDAwLDB4MDAsMHhCOCwweDJBLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MEMsMHgwMCwweDAwLDB4MDAsMHhFNCwweDAwLDB4MDAsMHgwMCwKKyAgICAgIDB4NjEsMHg2QywweDAwLDB4MDAsMHhFNCwweEQzLDB4RkYsMHhGRiwweDRDLDB4MDAsMHgwMCwweDAwLDB4MTQsMHgwMCwweDAwLDB4MDAsMHgwMSwweDAwLDB4MDAsMHgwMCwKKyAgICAgIDB4MDgsMHgwMCwweDAwLDB4MDAsMHg0MCwweDJCLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MEMsMHgwMCwweDAwLDB4MDAsMHhFNCwweDAwLDB4MDAsMHgwMCwKICAgICAgIDB4QjAsMHgwMCwweDAwLDB4MDAsMHhGMCwweDAxLDB4MDAsMHgwMCwweDkwLDB4MDEsMHgwMCwweDAwLDB4MzAsMHgwMSwweDAwLDB4MDAsMHg2MCwweDAyLDB4MDAsMHgwMCwKICAgICAgIDB4QjAsMHgwMSwweDAwLDB4MDAsMHg1NCwweDAxLDB4MDAsMHgwMCwweEYwLDB4MDAsMHgwMCwweDAwLDB4MDQsMHgwMiwweDAwLDB4MDAsMHg1QywweDAwLDB4MDAsMHgwMCwKICAgICAgIDB4MjQsMHgwMCwweDAwLDB4MDAsMHgxQSwweDAwLDB4MDAsMHgwMCwweDRELDB4NzksMHg0NywweDYxLDB4NkQsMHg2NSwweDJFLDB4NDUsMHg3OCwweDYxLDB4NkQsMHg3MCwKLSAgICAgIDB4NkMsMHg2NSwweDJFLDB4NTQsMHg3OSwweDcwLDB4NjUsMHg0MSwweDZDLDB4NjksMHg2MSwweDczLDB4NjUsMHg3MywweDAwLDB4MDAsMHg4OCwweERCLDB4RkYsMHhGRiwKKyAgICAgIDB4NkMsMHg2NSwweDJFLDB4NTQsMHg3OSwweDcwLDB4NjUsMHg0MSwweDZDLDB4NjksMHg2MSwweDczLDB4NjUsMHg3MywweDAwLDB4MDAsMHgwMCwweERCLDB4RkYsMHhGRiwKICAgICAgIDB4MDAsMHgwMCwweDAwLDB4MDEsMHgwQiwweDAwLDB4MUEsMHgwMCwweDFDLDB4MDAsMHgwMCwweDAwLDB4MEMsMHgwMCwweDAwLDB4MDAsMHgwNCwweDAwLDB4MDAsMHgwMCwKICAgICAgIDB4MDAsMHgwMCwweDAwLDB4MDAsMHgxNCwweEUxLDB4RkYsMHhGRiwweDAwLDB4MDAsMHgwRSwweDBDLDB4MDgsMHgwMCwweDAwLDB4MDAsMHgwNCwweDAwLDB4MDAsMHgwMCwKLSAgICAgIDB4NzYsMHg2NiwweDM2LDB4MzQsMHgwMCwweDAwLDB4MDAsMHgwMCwweEJDLDB4REIsMHhGRiwweEZGLDB4MDAsMHgwMCwweDAwLDB4MDEsMHgwQSwweDAwLDB4MTgsMHgwMCwKKyAgICAgIDB4NzYsMHg2NiwweDM2LDB4MzQsMHgwMCwweDAwLDB4MDAsMHgwMCwweDM0LDB4REIsMHhGRiwweEZGLDB4MDAsMHgwMCwweDAwLDB4MDEsMHgwQSwweDAwLDB4MTgsMHgwMCwKICAgICAgIDB4MUMsMHgwMCwweDAwLDB4MDAsMHgwQywweDAwLDB4MDAsMHgwMCwweDA0LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHg0OCwweEUxLDB4RkYsMHhGRiwKLSAgICAgIDB4MDAsMHgwMCwweDBFLDB4MDMsMHgwMSwweDAwLDB4MDAsMHgwMCwweDAyLDB4MDAsMHgwMCwweDAwLDB4NzYsMHgzOCwweDAwLDB4MDAsMHhEMiwweEQ4LDB4RkYsMHhGRiwKKyAgICAgIDB4MDAsMHgwMCwweDBFLDB4MDMsMHgwMSwweDAwLDB4MDAsMHgwMCwweDAyLDB4MDAsMHgwMCwweDAwLDB4NzYsMHgzOCwweDAwLDB4MDAsMHg0QSwweEQ4LDB4RkYsMHhGRiwKICAgICAgIDB4MDksMHgwMCwweDE2LDB4MDAsMHgyMCwweDAwLDB4MDAsMHgwMCwweDBDLDB4MDAsMHgwMCwweDAwLDB4MDQsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKLSAgICAgIDB4OUMsMHhENiwweEZGLDB4RkYsMHgwMCwweDAwLDB4MDAsMHgwQywweDA4LDB4MDAsMHgwMCwweDAwLDB4MDEsMHgwMCwweDAwLDB4MDAsMHgwMywweDAwLDB4MDAsMHgwMCwKLSAgICAgIDB4NjYsMHgzNiwweDM0LDB4MDAsMHgwMiwweEQ5LDB4RkYsMHhGRiwweDA4LDB4MDAsMHgxNCwweDAwLDB4MUMsMHgwMCwweDAwLDB4MDAsMHgwQywweDAwLDB4MDAsMHgwMCwKLSAgICAgIDB4MDQsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDE0LDB4RDQsMHhGRiwweEZGLDB4MDAsMHgwMCwweDAwLDB4MEIsMHgwMSwweDAwLDB4MDAsMHgwMCwKLSAgICAgIDB4MDMsMHgwMCwweDAwLDB4MDAsMHg2NiwweDMzLDB4MzIsMHgwMCwweDJFLDB4RDksMHhGRiwweEZGLDB4MDcsMHgwMCwweDEyLDB4MDAsMHgyMCwweDAwLDB4MDAsMHgwMCwKLSAgICAgIDB4MEMsMHgwMCwweDAwLDB4MDAsMHgwNCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4RjgsMHhENiwweEZGLDB4RkYsMHgwMCwweDAwLDB4MDAsMHgwQSwKLSAgICAgIDB4MDgsMHgwMCwweDAwLDB4MDAsMHgwMSwweDAwLDB4MDAsMHgwMCwweDAzLDB4MDAsMHgwMCwweDAwLDB4NzUsMHgzNiwweDM0LDB4MDAsMHg1RSwweEQ5LDB4RkYsMHhGRiwKKyAgICAgIDB4MTQsMHhENiwweEZGLDB4RkYsMHgwMCwweDAwLDB4MDAsMHgwQywweDA4LDB4MDAsMHgwMCwweDAwLDB4MDEsMHgwMCwweDAwLDB4MDAsMHgwMywweDAwLDB4MDAsMHgwMCwKKyAgICAgIDB4NjYsMHgzNiwweDM0LDB4MDAsMHg3QSwweEQ4LDB4RkYsMHhGRiwweDA4LDB4MDAsMHgxNCwweDAwLDB4MUMsMHgwMCwweDAwLDB4MDAsMHgwQywweDAwLDB4MDAsMHgwMCwKKyAgICAgIDB4MDQsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDhDLDB4RDMsMHhGRiwweEZGLDB4MDAsMHgwMCwweDAwLDB4MEIsMHgwMSwweDAwLDB4MDAsMHgwMCwKKyAgICAgIDB4MDMsMHgwMCwweDAwLDB4MDAsMHg2NiwweDMzLDB4MzIsMHgwMCwweEE2LDB4RDgsMHhGRiwweEZGLDB4MDcsMHgwMCwweDEyLDB4MDAsMHgyMCwweDAwLDB4MDAsMHgwMCwKKyAgICAgIDB4MEMsMHgwMCwweDAwLDB4MDAsMHgwNCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4NzAsMHhENiwweEZGLDB4RkYsMHgwMCwweDAwLDB4MDAsMHgwQSwKKyAgICAgIDB4MDgsMHgwMCwweDAwLDB4MDAsMHgwMSwweDAwLDB4MDAsMHgwMCwweDAzLDB4MDAsMHgwMCwweDAwLDB4NzUsMHgzNiwweDM0LDB4MDAsMHhENiwweEQ4LDB4RkYsMHhGRiwKICAgICAgIDB4MDYsMHgwMCwweDEwLDB4MDAsMHgyMCwweDAwLDB4MDAsMHgwMCwweDBDLDB4MDAsMHgwMCwweDAwLDB4MDQsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKLSAgICAgIDB4MjgsMHhENywweEZGLDB4RkYsMHgwMCwweDAwLDB4MDAsMHgwOSwweDA4LDB4MDAsMHgwMCwweDAwLDB4MDEsMHgwMCwweDAwLDB4MDAsMHgwMywweDAwLDB4MDAsMHgwMCwKLSAgICAgIDB4NjksMHgzNiwweDM0LDB4MDAsMHg4RSwweEQ5LDB4RkYsMHhGRiwweDA1LDB4MDAsMHgwRSwweDAwLDB4MUMsMHgwMCwweDAwLDB4MDAsMHgwQywweDAwLDB4MDAsMHgwMCwKLSAgICAgIDB4MDQsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweEEwLDB4RDQsMHhGRiwweEZGLDB4MDAsMHgwMCwweDAwLDB4MDgsMHgwMSwweDAwLDB4MDAsMHgwMCwKLSAgICAgIDB4MDMsMHgwMCwweDAwLDB4MDAsMHg3NSwweDMzLDB4MzIsMHgwMCwweEJBLDB4RDksMHhGRiwweEZGLDB4MDQsMHgwMCwweDBDLDB4MDAsMHgxQywweDAwLDB4MDAsMHgwMCwKLSAgICAgIDB4MEMsMHgwMCwweDAwLDB4MDAsMHgwNCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4Q0MsMHhENCwweEZGLDB4RkYsMHgwMCwweDAwLDB4MDAsMHgwNywKLSAgICAgIDB4MDEsMHgwMCwweDAwLDB4MDAsMHgwMywweDAwLDB4MDAsMHgwMCwweDY5LDB4MzMsMHgzMiwweDAwLDB4RTYsMHhEOSwweEZGLDB4RkYsMHgwMywweDAwLDB4MEEsMHgwMCwKLSAgICAgIDB4MjAsMHgwMCwweDAwLDB4MDAsMHgwQywweDAwLDB4MDAsMHgwMCwweDA0LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHhCMCwweEQ3LDB4RkYsMHhGRiwKKyAgICAgIDB4QTAsMHhENiwweEZGLDB4RkYsMHgwMCwweDAwLDB4MDAsMHgwOSwweDA4LDB4MDAsMHgwMCwweDAwLDB4MDEsMHgwMCwweDAwLDB4MDAsMHgwMywweDAwLDB4MDAsMHgwMCwKKyAgICAgIDB4NjksMHgzNiwweDM0LDB4MDAsMHgwNiwweEQ5LDB4RkYsMHhGRiwweDA1LDB4MDAsMHgwRSwweDAwLDB4MUMsMHgwMCwweDAwLDB4MDAsMHgwQywweDAwLDB4MDAsMHgwMCwKKyAgICAgIDB4MDQsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDE4LDB4RDQsMHhGRiwweEZGLDB4MDAsMHgwMCwweDAwLDB4MDgsMHgwMSwweDAwLDB4MDAsMHgwMCwKKyAgICAgIDB4MDMsMHgwMCwweDAwLDB4MDAsMHg3NSwweDMzLDB4MzIsMHgwMCwweDMyLDB4RDksMHhGRiwweEZGLDB4MDQsMHgwMCwweDBDLDB4MDAsMHgxQywweDAwLDB4MDAsMHgwMCwKKyAgICAgIDB4MEMsMHgwMCwweDAwLDB4MDAsMHgwNCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4NDQsMHhENCwweEZGLDB4RkYsMHgwMCwweDAwLDB4MDAsMHgwNywKKyAgICAgIDB4MDEsMHgwMCwweDAwLDB4MDAsMHgwMywweDAwLDB4MDAsMHgwMCwweDY5LDB4MzMsMHgzMiwweDAwLDB4NUUsMHhEOSwweEZGLDB4RkYsMHgwMywweDAwLDB4MEEsMHgwMCwKKyAgICAgIDB4MjAsMHgwMCwweDAwLDB4MDAsMHgwQywweDAwLDB4MDAsMHgwMCwweDA0LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgyOCwweEQ3LDB4RkYsMHhGRiwKICAgICAgIDB4MDAsMHgwMCwweDAwLDB4MDYsMHgwMiwweDAwLDB4MDAsMHgwMCwweDAxLDB4MDAsMHgwMCwweDAwLDB4MDMsMHgwMCwweDAwLDB4MDAsMHg3NSwweDMxLDB4MzYsMHgwMCwKLSAgICAgIDB4MTYsMHhEQSwweEZGLDB4RkYsMHgwMiwweDAwLDB4MDgsMHgwMCwweDIwLDB4MDAsMHgwMCwweDAwLDB4MEMsMHgwMCwweDAwLDB4MDAsMHgwNCwweDAwLDB4MDAsMHgwMCwKLSAgICAgIDB4MDAsMHgwMCwweDAwLDB4MDAsMHhFMCwweEQ3LDB4RkYsMHhGRiwweDAwLDB4MDAsMHgwMCwweDA1LDB4MDIsMHgwMCwweDAwLDB4MDAsMHgwMSwweDAwLDB4MDAsMHgwMCwKLSAgICAgIDB4MDMsMHgwMCwweDAwLDB4MDAsMHg2OSwweDMxLDB4MzYsMHgwMCwweDQ2LDB4REEsMHhGRiwweEZGLDB4MDEsMHgwMCwweDA2LDB4MDAsMHgyMCwweDAwLDB4MDAsMHgwMCwKLSAgICAgIDB4MEMsMHgwMCwweDAwLDB4MDAsMHgwNCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MTAsMHhEOCwweEZGLDB4RkYsMHgwMCwweDAwLDB4MDAsMHgwNCwKKyAgICAgIDB4OEUsMHhEOSwweEZGLDB4RkYsMHgwMiwweDAwLDB4MDgsMHgwMCwweDIwLDB4MDAsMHgwMCwweDAwLDB4MEMsMHgwMCwweDAwLDB4MDAsMHgwNCwweDAwLDB4MDAsMHgwMCwKKyAgICAgIDB4MDAsMHgwMCwweDAwLDB4MDAsMHg1OCwweEQ3LDB4RkYsMHhGRiwweDAwLDB4MDAsMHgwMCwweDA1LDB4MDIsMHgwMCwweDAwLDB4MDAsMHgwMSwweDAwLDB4MDAsMHgwMCwKKyAgICAgIDB4MDMsMHgwMCwweDAwLDB4MDAsMHg2OSwweDMxLDB4MzYsMHgwMCwweEJFLDB4RDksMHhGRiwweEZGLDB4MDEsMHgwMCwweDA2LDB4MDAsMHgyMCwweDAwLDB4MDAsMHgwMCwKKyAgICAgIDB4MEMsMHgwMCwweDAwLDB4MDAsMHgwNCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4ODgsMHhENywweEZGLDB4RkYsMHgwMCwweDAwLDB4MDAsMHgwNCwKICAgICAgIDB4MDEsMHgwMCwweDAwLDB4MDAsMHgwMSwweDAwLDB4MDAsMHgwMCwweDAyLDB4MDAsMHgwMCwweDAwLDB4NzUsMHgzOCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MUEsMHgwMCwKICAgICAgIDB4MTQsMHgwMCwweDA4LDB4MDAsMHgwQywweDAwLDB4MDAsMHgwMCwweDA2LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKICAgICAgIDB4MDAsMHgwMCwweDEwLDB4MDAsMHgxQSwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwNCwweDAwLDB4MjAsMHgwMCwweDAwLDB4MDAsMHgwQywweDAwLDB4MDAsMHgwMCwKLSAgICAgIDB4MDQsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDVDLDB4RDgsMHhGRiwweEZGLDB4MDAsMHgwMCwweDAwLDB4MDMsMHgwMSwweDAwLDB4MDAsMHgwMCwKLSAgICAgIDB4MDEsMHgwMCwweDAwLDB4MDAsMHgwMiwweDAwLDB4MDAsMHgwMCwweDY5LDB4MzgsMHgwMCwweDAwLDB4MzAsMHhENywweEZGLDB4RkYsMHgzMCwweDAxLDB4MDAsMHgwMCwKLSAgICAgIDB4NTAsMHgwMCwweDAwLDB4MDAsMHgwMSwweDAwLDB4MDAsMHgwMCwweDA4LDB4MDAsMHgwMCwweDAwLDB4RjQsMHgyNywweDAwLDB4MDAsMHgwMSwweDAwLDB4MDAsMHgwMCwKKyAgICAgIDB4MDQsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweEQ0LDB4RDcsMHhGRiwweEZGLDB4MDAsMHgwMCwweDAwLDB4MDMsMHgwMSwweDAwLDB4MDAsMHgwMCwKKyAgICAgIDB4MDEsMHgwMCwweDAwLDB4MDAsMHgwMiwweDAwLDB4MDAsMHgwMCwweDY5LDB4MzgsMHgwMCwweDAwLDB4QTgsMHhENiwweEZGLDB4RkYsMHgzMCwweDAxLDB4MDAsMHgwMCwKKyAgICAgIDB4NTAsMHgwMCwweDAwLDB4MDAsMHgwMSwweDAwLDB4MDAsMHgwMCwweDA4LDB4MDAsMHgwMCwweDAwLDB4N0MsMHgyOCwweDAwLDB4MDAsMHgwMSwweDAwLDB4MDAsMHgwMCwKICAgICAgIDB4MDQsMHgwMCwweDAwLDB4MDAsMHgzMywweDAwLDB4MDAsMHgwMCwweDIwLDB4NjEsMHg2RSwweDIwLDB4NjUsMHg3OCwweDYxLDB4NkQsMHg3MCwweDZDLDB4NjUsMHgyMCwKICAgICAgIDB4NjQsMHg2RiwweDYzLDB4NzUsMHg2RCwweDY1LDB4NkUsMHg3NCwweDYxLDB4NzQsMHg2OSwweDZGLDB4NkUsMHgyMCwweDYzLDB4NkYsMHg2RCwweDZELDB4NjUsMHg2RSwKICAgICAgIDB4NzQsMHgzQSwweDIwLDB4MjIsMHg2RCwweDZGLDB4NkUsMHg3MywweDc0LDB4NjUsMHg3MiwweDIwLDB4NkYsMHg2MiwweDZBLDB4NjUsMHg2MywweDc0LDB4MjIsMHgwMCwKQEAgLTIyMSwxMTIgKzIyOCwxMTIgQEAKICAgICAgIDB4MTYsMHgwMCwweDAwLDB4MDAsMHg0RCwweDc5LDB4NDcsMHg2MSwweDZELDB4NjUsMHgyRSwweDQ1LDB4NzgsMHg2MSwweDZELDB4NzAsMHg2QywweDY1LDB4MkUsMHg0RCwKICAgICAgIDB4NkYsMHg2RSwweDczLDB4NzQsMHg2NSwweDcyLDB4MDAsMHgwMCwweDYyLDB4RkQsMHhGRiwweEZGLDB4MzUsMHgwMCwweDZFLDB4MDAsMHg1NCwweDAwLDB4MDAsMHgwMCwKICAgICAgIDB4M0MsMHgwMCwweDAwLDB4MDAsMHgxNCwweDAwLDB4MDAsMHgwMCwweDBDLDB4MDAsMHgwMCwweDAwLDB4MDIsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKLSAgICAgIDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMSwweDAwLDB4MDAsMHgwMCwweDA0LDB4MDAsMHgwMCwweDAwLDB4NzAsMHhEQiwweEZGLDB4RkYsMHgxMCwweDAwLDB4MDAsMHgwMCwKKyAgICAgIDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMSwweDAwLDB4MDAsMHgwMCwweDA0LDB4MDAsMHgwMCwweDAwLDB4RTgsMHhEQSwweEZGLDB4RkYsMHgxMCwweDAwLDB4MDAsMHgwMCwKICAgICAgIDB4MDQsMHgwMCwweDAwLDB4MDAsMHgwMiwweDAwLDB4MDAsMHgwMCwweDM1LDB4MzMsMHgwMCwweDAwLDB4MDIsMHgwMCwweDAwLDB4MDAsMHg2OSwweDY0LDB4MDAsMHgwMCwKLSAgICAgIDB4RUMsMHhEQSwweEZGLDB4RkYsMHgwMCwweDAwLDB4MDAsMHgwQSwweDA0LDB4MDAsMHgwMCwweDAwLDB4MDgsMHgwMCwweDAwLDB4MDAsMHgwMSwweDAwLDB4MDAsMHgwMCwKKyAgICAgIDB4NjQsMHhEQSwweEZGLDB4RkYsMHgwMCwweDAwLDB4MDAsMHgwQSwweDA0LDB4MDAsMHgwMCwweDAwLDB4MDgsMHgwMCwweDAwLDB4MDAsMHgwMSwweDAwLDB4MDAsMHgwMCwKICAgICAgIDB4MTgsMHgwMCwweDAwLDB4MDAsMHg2QywweDZGLDB4NkUsMHg2NywweDVGLDB4NjUsMHg2RSwweDc1LDB4NkQsMHg1RiwweDZFLDB4NkYsMHg3MiwweDZELDB4NjEsMHg2QywKICAgICAgIDB4NUYsMHg2NCwweDY1LDB4NjYsMHg2MSwweDc1LDB4NkMsMHg3NCwweDAwLDB4MDAsMHgwMCwweDAwLDB4NjIsMHhFNiwweEZGLDB4RkYsMHgzNCwweDAwLDB4NkMsMHgwMCwKICAgICAgIDB4NEMsMHgwMCwweDAwLDB4MDAsMHgzNCwweDAwLDB4MDAsMHgwMCwweDBDLDB4MDAsMHgwMCwweDAwLDB4MDQsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKLSAgICAgIDB4MDEsMHgwMCwweDAwLDB4MDAsMHgwNCwweDAwLDB4MDAsMHgwMCwweEU0LDB4REIsMHhGRiwweEZGLDB4MTAsMHgwMCwweDAwLDB4MDAsMHgwNCwweDAwLDB4MDAsMHgwMCwKLSAgICAgIDB4MDIsMHgwMCwweDAwLDB4MDAsMHgzNSwweDMyLDB4MDAsMHgwMCwweDAyLDB4MDAsMHgwMCwweDAwLDB4NjksMHg2NCwweDAwLDB4MDAsMHg2MCwweERCLDB4RkYsMHhGRiwKKyAgICAgIDB4MDEsMHgwMCwweDAwLDB4MDAsMHgwNCwweDAwLDB4MDAsMHgwMCwweDVDLDB4REIsMHhGRiwweEZGLDB4MTAsMHgwMCwweDAwLDB4MDAsMHgwNCwweDAwLDB4MDAsMHgwMCwKKyAgICAgIDB4MDIsMHgwMCwweDAwLDB4MDAsMHgzNSwweDMyLDB4MDAsMHgwMCwweDAyLDB4MDAsMHgwMCwweDAwLDB4NjksMHg2NCwweDAwLDB4MDAsMHhEOCwweERBLDB4RkYsMHhGRiwKICAgICAgIDB4MDAsMHgwMCwweDAwLDB4MEEsMHgwNCwweDAwLDB4MDAsMHgwMCwweDA4LDB4MDAsMHgwMCwweDAwLDB4MDEsMHgwMCwweDAwLDB4MDAsMHgxQSwweDAwLDB4MDAsMHgwMCwKICAgICAgIDB4NkMsMHg2RiwweDZFLDB4NjcsMHg1RiwweDY1LDB4NkUsMHg3NSwweDZELDB4NUYsMHg2RSwweDZGLDB4NkUsMHg1RiwweDY1LDB4NkUsMHg3NSwweDZELDB4NUYsMHg2NCwKICAgICAgIDB4NjUsMHg2NiwweDYxLDB4NzUsMHg2QywweDc0LDB4MDAsMHgwMCwweEVDLDB4RTUsMHhGRiwweEZGLDB4MDAsMHgwMCwweDAwLDB4MDEsMHgzMywweDAwLDB4NkEsMHgwMCwKICAgICAgIDB4NzQsMHgwMCwweDAwLDB4MDAsMHg2MCwweDAwLDB4MDAsMHgwMCwweDBDLDB4MDAsMHgwMCwweDAwLDB4MDQsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKLSAgICAgIDB4MDIsMHgwMCwweDAwLDB4MDAsMHgzMCwweDAwLDB4MDAsMHgwMCwweDA0LDB4MDAsMHgwMCwweDAwLDB4NjAsMHhEQywweEZGLDB4RkYsMHgxMCwweDAwLDB4MDAsMHgwMCwKKyAgICAgIDB4MDIsMHgwMCwweDAwLDB4MDAsMHgzMCwweDAwLDB4MDAsMHgwMCwweDA0LDB4MDAsMHgwMCwweDAwLDB4RDgsMHhEQiwweEZGLDB4RkYsMHgxMCwweDAwLDB4MDAsMHgwMCwKICAgICAgIDB4MDQsMHgwMCwweDAwLDB4MDAsMHgwMSwweDAwLDB4MDAsMHgwMCwweDMwLDB4MDAsMHgwMCwweDAwLDB4MEQsMHgwMCwweDAwLDB4MDAsMHg2RSwweDYxLDB4NzQsMHg2OSwKLSAgICAgIDB4NzYsMHg2NSwweDVGLDB4NjksMHg2RSwweDZDLDB4NjksMHg2RSwweDY1LDB4MDAsMHgwMCwweDAwLDB4ODgsMHhEQywweEZGLDB4RkYsMHgxMCwweDAwLDB4MDAsMHgwMCwKKyAgICAgIDB4NzYsMHg2NSwweDVGLDB4NjksMHg2RSwweDZDLDB4NjksMHg2RSwweDY1LDB4MDAsMHgwMCwweDAwLDB4MDAsMHhEQywweEZGLDB4RkYsMHgxMCwweDAwLDB4MDAsMHgwMCwKICAgICAgIDB4MDQsMHgwMCwweDAwLDB4MDAsMHgwMiwweDAwLDB4MDAsMHgwMCwweDM1LDB4MzEsMHgwMCwweDAwLDB4MDIsMHgwMCwweDAwLDB4MDAsMHg2OSwweDY0LDB4MDAsMHgwMCwKLSAgICAgIDB4NTAsMHhEOSwweEZGLDB4RkYsMHgwMCwweDAwLDB4MDAsMHgwRiwweDA1LDB4MDAsMHgwMCwweDAwLDB4MDEsMHgwMCwweDAwLDB4MDAsMHgwRCwweDAwLDB4MDAsMHgwMCwKKyAgICAgIDB4QzgsMHhEOCwweEZGLDB4RkYsMHgwMCwweDAwLDB4MDAsMHgwRiwweDA2LDB4MDAsMHgwMCwweDAwLDB4MDEsMHgwMCwweDAwLDB4MDAsMHgwRCwweDAwLDB4MDAsMHgwMCwKICAgICAgIDB4NkUsMHg2MSwweDc0LDB4NjksMHg3NiwweDY1LDB4NUYsMHg2OSwweDZFLDB4NkMsMHg2OSwweDZFLDB4NjUsMHgwMCwweDAwLDB4MDAsMHg4MCwweEU2LDB4RkYsMHhGRiwKICAgICAgIDB4MDAsMHgwMCwweDAwLDB4MDEsMHgzMiwweDAwLDB4NjgsMHgwMCwweDQ4LDB4MDAsMHgwMCwweDAwLDB4MzQsMHgwMCwweDAwLDB4MDAsMHgwQywweDAwLDB4MDAsMHgwMCwKLSAgICAgIDB4MDQsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAxLDB4MDAsMHgwMCwweDAwLDB4MDQsMHgwMCwweDAwLDB4MDAsMHhGMCwweERDLDB4RkYsMHhGRiwKKyAgICAgIDB4MDQsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAxLDB4MDAsMHgwMCwweDAwLDB4MDQsMHgwMCwweDAwLDB4MDAsMHg2OCwweERDLDB4RkYsMHhGRiwKICAgICAgIDB4MTAsMHgwMCwweDAwLDB4MDAsMHgwNCwweDAwLDB4MDAsMHgwMCwweDAyLDB4MDAsMHgwMCwweDAwLDB4MzUsMHgzMCwweDAwLDB4MDAsMHgwMiwweDAwLDB4MDAsMHgwMCwKICAgICAgIDB4NjksMHg2NCwweDAwLDB4MDAsMHgzOCwweEU4LDB4RkYsMHhGRiwweDAwLDB4MDAsMHgwRSwweDBGLDB4MDMsMHgwMCwweDAwLDB4MDAsMHgwNCwweDAwLDB4MDAsMHgwMCwKICAgICAgIDB4MTgsMHgwMCwweDAwLDB4MDAsMHg3MywweDYzLDB4NjEsMHg2QywweDYxLDB4NzIsMHg1RiwweDZCLDB4NjUsMHg3OSwweDVGLDB4NzMsMHg2RiwweDcyLDB4NzQsMHg2NSwKICAgICAgIDB4NjQsMHg1RiwweDc0LDB4NjEsMHg2MiwweDZDLDB4NjUsMHg3MywweDAwLDB4MDAsMHgwMCwweDAwLDB4RjQsMHhFNiwweEZGLDB4RkYsMHgwMCwweDAwLDB4MDAsMHgwMSwKICAgICAgIDB4MzEsMHgwMCwweDY2LDB4MDAsMHg3OCwweDAwLDB4MDAsMHgwMCwweDY4LDB4MDAsMHgwMCwweDAwLDB4MEMsMHgwMCwweDAwLDB4MDAsMHgwNCwweDAwLDB4MDAsMHgwMCwKLSAgICAgIDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMiwweDAwLDB4MDAsMHgwMCwweDM4LDB4MDAsMHgwMCwweDAwLDB4MDQsMHgwMCwweDAwLDB4MDAsMHg2OCwweERELDB4RkYsMHhGRiwKKyAgICAgIDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMiwweDAwLDB4MDAsMHgwMCwweDM4LDB4MDAsMHgwMCwweDAwLDB4MDQsMHgwMCwweDAwLDB4MDAsMHhFMCwweERDLDB4RkYsMHhGRiwKICAgICAgIDB4MTQsMHgwMCwweDAwLDB4MDAsMHgwNCwweDAwLDB4MDAsMHgwMCwweDA3LDB4MDAsMHgwMCwweDAwLDB4NEQsMHg2RiwweDZFLDB4NzMsMHg3NCwweDY1LDB4NzIsMHgwMCwKICAgICAgIDB4MTEsMHgwMCwweDAwLDB4MDAsMHg2RSwweDY1LDB4NzMsMHg3NCwweDY1LDB4NjQsMHg1RiwweDY2LDB4NkMsMHg2MSwweDc0LDB4NjIsMHg3NSwweDY2LDB4NjYsMHg2NSwKLSAgICAgIDB4NzIsMHgwMCwweDAwLDB4MDAsMHg5OCwweERELDB4RkYsMHhGRiwweDEwLDB4MDAsMHgwMCwweDAwLDB4MDQsMHgwMCwweDAwLDB4MDAsMHgwMiwweDAwLDB4MDAsMHgwMCwKKyAgICAgIDB4NzIsMHgwMCwweDAwLDB4MDAsMHgxMCwweERELDB4RkYsMHhGRiwweDEwLDB4MDAsMHgwMCwweDAwLDB4MDQsMHgwMCwweDAwLDB4MDAsMHgwMiwweDAwLDB4MDAsMHgwMCwKICAgICAgIDB4MzQsMHgzOSwweDAwLDB4MDAsMHgwMiwweDAwLDB4MDAsMHgwMCwweDY5LDB4NjQsMHgwMCwweDAwLDB4MEMsMHhFNywweEZGLDB4RkYsMHgwMCwweDAwLDB4MEUsMHgwNCwKICAgICAgIDB4MDEsMHgwMCwweDAwLDB4MDAsMHgxQywweDAwLDB4MDAsMHgwMCwweDc0LDB4NjUsMHg3MywweDc0LDB4NzIsMHg2NSwweDcxLDB4NzUsMHg2OSwweDcyLDB4NjUsMHg2NCwKICAgICAgIDB4NkUsMHg2NSwweDczLDB4NzQsMHg2NSwweDY0LDB4NjYsMHg2QywweDYxLDB4NzQsMHg2MiwweDc1LDB4NjYsMHg2NiwweDY1LDB4NzIsMHgwMCwweDAwLDB4MUEsMHgwMCwKICAgICAgIDB4MjAsMHgwMCwweDA4LDB4MDAsMHgwQywweDAwLDB4MDQsMHgwMCwweDA2LDB4MDAsMHgxOCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKICAgICAgIDB4MTAsMHgwMCwweDE0LDB4MDAsMHgxQSwweDAwLDB4MDAsMHgwMCwweDMwLDB4MDAsMHg2NCwweDAwLDB4NTQsMHgwMCwweDAwLDB4MDAsMHgzQywweDAwLDB4MDAsMHgwMCwKICAgICAgIDB4MTQsMHgwMCwweDAwLDB4MDAsMHgwQywweDAwLDB4MDAsMHgwMCwweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsMHgwMCwweDAwLDB4MDAsMHgwMCwKLSAgICAgIDB4MDEsMHgwMCwweDAwLDB4MDAsMHgwNCwweDAwLDB4MDAsMHgwMCwweDI4LDB4REUsMHhGRiwweEZGLDB4MTAsMHgwMCwweDAwLDB4MDAsMHgwNCwweDAwLDB4MDAsMHgwMCwKLSAgICAgIDB4MDIsMHgwMCwweDAwLDB4MDAsMHgzNCwweDM4LDB4MDAsMHgwMCwweDAyLDB4MDAsMHgwMCwweDAwLDB4NjksMHg2NCwweDAwLDB4MDAsMHhBNCwweERELDB4RkYsMHhGRiwKKyAgICAgIDB4MDEsMHgwMCwweDAwLDB4MDAsMHgwNCwweDAwLDB4MDAsMHgwMCwweEEwLDB4REQsMHhGRiwweEZGLDB4MTAsMHgwMCwweDAwLDB4MDAsMHgwNCwweDAwLDB4MDAsMHgwMCwKKyAgICAgIDB4MDIsMHgwMCwweDAwLDB4MDAsMHgzNCwweDM4LDB4MDAsMHgwMCwweDAyLDB4MDAsMHgwMCwweDAwLDB4NjksMHg2NCwweDAwLDB4MDAsMHgxQywweERELDB4RkYsMHhGRiwKICAgICAgIDB4MDAsMHgwMCwweDAwLDB4MDMsMHgwNSwweDAwLDB4MDAsMHgwMCwweDAxLDB4MDAsMHgwMCwweDAwLDB4MDEsMHgwMCwweDAwLDB4MDAsMHgwQiwweDAwLDB4MDAsMHgwMCwKICAgICAgIDB4NzMsMHg2OSwweDY3LDB4NkUsMHg2NSwweDY0LDB4NUYsMHg2NSwweDZFLDB4NzUsMHg2RCwweDAwLDB4MjAsMHhFOCwweEZGLDB4RkYsMHgwMCwweDAwLDB4MDAsMHgwMSwKICAgICAgIDB4MkYsMHgwMCwweDYyLDB4MDAsMHg0OCwweDAwLDB4MDAsMHgwMCwweDM0LDB4MDAsMHgwMCwweDAwLDB4MEMsMHgwMCwweDAwLDB4MDAsMHgwNCwweDAwLDB4MDAsMHgwMCwKLSAgICAgIDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMSwweDAwLDB4MDAsMHgwMCwweDA0LDB4MDAsMHgwMCwweDAwLDB4OTAsMHhERSwweEZGLDB4RkYsMHgxMCwweDAwLDB4MDAsMHgwMCwKKyAgICAgIDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMSwweDAwLDB4MDAsMHgwMCwweDA0LDB4MDAsMHgwMCwweDAwLDB4MDgsMHhERSwweEZGLDB4RkYsMHgxMCwweDAwLDB4MDAsMHgwMCwKICAgICAgIDB4MDQsMHgwMCwweDAwLDB4MDAsMHgwMiwweDAwLDB4MDAsMHgwMCwweDM0LDB4MzcsMHgwMCwweDAwLDB4MDIsMHgwMCwweDAwLDB4MDAsMHg2OSwweDY0LDB4MDAsMHgwMCwKICAgICAgIDB4RDgsMHhFOSwweEZGLDB4RkYsMHgwMCwweDAwLDB4MEUsMHgwNCwweDAzLDB4MDAsMHgwMCwweDAwLDB4MDEsMHgwMCwweDAwLDB4MDAsMHgwRiwweDAwLDB4MDAsMHgwMCwKICAgICAgIDB4NzYsMHg2NSwweDYzLDB4NzQsMHg2RiwweDcyLDB4NUYsMHg2RiwweDY2LDB4NUYsMHg2NSwweDZFLDB4NzUsMHg2RCwweDczLDB4MDAsMHg4OCwweEU4LDB4RkYsMHhGRiwKICAgICAgIDB4MDAsMHgwMCwweDAwLDB4MDEsMHgyRSwweDAwLDB4NjAsMHgwMCwweDQ4LDB4MDAsMHgwMCwweDAwLDB4MzQsMHgwMCwweDAwLDB4MDAsMHgwQywweDAwLDB4MDAsMHgwMCwKLSAgICAgIDB4MDQsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAxLDB4MDAsMHgwMCwweDAwLDB4MDQsMHgwMCwweDAwLDB4MDAsMHhGOCwweERFLDB4RkYsMHhGRiwKKyAgICAgIDB4MDQsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAxLDB4MDAsMHgwMCwweDAwLDB4MDQsMHgwMCwweDAwLDB4MDAsMHg3MCwweERFLDB4RkYsMHhGRiwKICAgICAgIDB4MTAsMHgwMCwweDAwLDB4MDAsMHgwNCwweDAwLDB4MDAsMHgwMCwweDAyLDB4MDAsMHgwMCwweDAwLDB4MzQsMHgzNiwweDAwLDB4MDAsMHgwMiwweDAwLDB4MDAsMHgwMCwKLSAgICAgIDB4NjksMHg2NCwweDAwLDB4MDAsMHhDMCwweERCLDB4RkYsMHhGRiwweDAwLDB4MDAsMHgwMCwweDEwLDB4MDEsMHgwMCwweDAwLDB4MDAsMHgwMSwweDAwLDB4MDAsMHgwMCwKKyAgICAgIDB4NjksMHg2NCwweDAwLDB4MDAsMHgzOCwweERCLDB4RkYsMHhGRiwweDAwLDB4MDAsMHgwMCwweDEwLDB4MDEsMHgwMCwweDAwLDB4MDAsMHgwMSwweDAwLDB4MDAsMHgwMCwKICAgICAgIDB4MEQsMHgwMCwweDAwLDB4MDAsMHg2MSwweDZFLDB4NzksMHg1RiwweDYxLDB4NkQsMHg2MiwweDY5LDB4NjcsMHg3NSwweDZGLDB4NzUsMHg3MywweDAwLDB4MDAsMHgwMCwKICAgICAgIDB4REEsMHhFOSwweEZGLDB4RkYsMHgyRCwweDAwLDB4NUUsMHgwMCwweDRDLDB4MDAsMHgwMCwweDAwLDB4MzQsMHgwMCwweDAwLDB4MDAsMHgwQywweDAwLDB4MDAsMHgwMCwKLSAgICAgIDB4MDQsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAxLDB4MDAsMHgwMCwweDAwLDB4MDQsMHgwMCwweDAwLDB4MDAsMHg1QywweERGLDB4RkYsMHhGRiwKKyAgICAgIDB4MDQsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAxLDB4MDAsMHgwMCwweDAwLDB4MDQsMHgwMCwweDAwLDB4MDAsMHhENCwweERFLDB4RkYsMHhGRiwKICAgICAgIDB4MTAsMHgwMCwweDAwLDB4MDAsMHgwNCwweDAwLDB4MDAsMHgwMCwweDAyLDB4MDAsMHgwMCwweDAwLDB4MzQsMHgzNSwweDAwLDB4MDAsMHgwMiwweDAwLDB4MDAsMHgwMCwKLSAgICAgIDB4NjksMHg2NCwweDAwLDB4MDAsMHhEOCwweERFLDB4RkYsMHhGRiwweDAwLDB4MDAsMHgwMCwweDAxLDB4MDEsMHgwMCwweDAwLDB4MDAsMHgwMSwweDAwLDB4MDAsMHgwMCwKKyAgICAgIDB4NjksMHg2NCwweDAwLDB4MDAsMHg1MCwweERFLDB4RkYsMHhGRiwweDAwLDB4MDAsMHgwMCwweDAxLDB4MDEsMHgwMCwweDAwLDB4MDAsMHgwMSwweDAwLDB4MDAsMHgwMCwKICAgICAgIDB4MDEsMHgwMCwweDAwLDB4MDAsMHgxMiwweDAwLDB4MDAsMHgwMCwweDYxLDB4NkUsMHg3OSwweDVGLDB4NjEsMHg2RCwweDYyLDB4NjksMHg2NywweDc1LDB4NkYsMHg3NSwKICAgICAgIDB4NzMsMHg1RiwweDc0LDB4NzksMHg3MCwweDY1LDB4MDAsMHgwMCwweDVDLDB4RTksMHhGRiwweEZGLDB4MDAsMHgwMCwweDAwLDB4MDEsMHgyQywweDAwLDB4NUMsMHgwMCwKICAgICAgIDB4NDgsMHgwMCwweDAwLDB4MDAsMHgzNCwweDAwLDB4MDAsMHgwMCwweDBDLDB4MDAsMHgwMCwweDAwLDB4MDQsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKLSAgICAgIDB4MDEsMHgwMCwweDAwLDB4MDAsMHgwNCwweDAwLDB4MDAsMHgwMCwweENDLDB4REYsMHhGRiwweEZGLDB4MTAsMHgwMCwweDAwLDB4MDAsMHgwNCwweDAwLDB4MDAsMHgwMCwKLSAgICAgIDB4MDIsMHgwMCwweDAwLDB4MDAsMHgzNCwweDM0LDB4MDAsMHgwMCwweDAyLDB4MDAsMHgwMCwweDAwLDB4NjksMHg2NCwweDAwLDB4MDAsMHg5NCwweERDLDB4RkYsMHhGRiwKKyAgICAgIDB4MDEsMHgwMCwweDAwLDB4MDAsMHgwNCwweDAwLDB4MDAsMHgwMCwweDQ0LDB4REYsMHhGRiwweEZGLDB4MTAsMHgwMCwweDAwLDB4MDAsMHgwNCwweDAwLDB4MDAsMHgwMCwKKyAgICAgIDB4MDIsMHgwMCwweDAwLDB4MDAsMHgzNCwweDM0LDB4MDAsMHgwMCwweDAyLDB4MDAsMHgwMCwweDAwLDB4NjksMHg2NCwweDAwLDB4MDAsMHgwQywweERDLDB4RkYsMHhGRiwKICAgICAgIDB4MDAsMHgwMCwweDAwLDB4MTAsMHgwMiwweDAwLDB4MDAsMHgwMCwweDAxLDB4MDAsMHgwMCwweDAwLDB4MEEsMHgwMCwweDAwLDB4MDAsMHg2MSwweDZFLDB4NzksMHg1RiwKICAgICAgIDB4NzUsMHg2RSwweDY5LDB4NzEsMHg3NSwweDY1LDB4MDAsMHgwMCwweEFBLDB4RUEsMHhGRiwweEZGLDB4MkIsMHgwMCwweDVBLDB4MDAsMHg0QywweDAwLDB4MDAsMHgwMCwKICAgICAgIDB4MzQsMHgwMCwweDAwLDB4MDAsMHgwQywweDAwLDB4MDAsMHgwMCwweDA0LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMSwweDAwLDB4MDAsMHgwMCwKLSAgICAgIDB4MDQsMHgwMCwweDAwLDB4MDAsMHgyQywweEUwLDB4RkYsMHhGRiwweDEwLDB4MDAsMHgwMCwweDAwLDB4MDQsMHgwMCwweDAwLDB4MDAsMHgwMiwweDAwLDB4MDAsMHgwMCwKLSAgICAgIDB4MzQsMHgzMywweDAwLDB4MDAsMHgwMiwweDAwLDB4MDAsMHgwMCwweDY5LDB4NjQsMHgwMCwweDAwLDB4QTgsMHhERiwweEZGLDB4RkYsMHgwMCwweDAwLDB4MDAsMHgwMSwKKyAgICAgIDB4MDQsMHgwMCwweDAwLDB4MDAsMHhBNCwweERGLDB4RkYsMHhGRiwweDEwLDB4MDAsMHgwMCwweDAwLDB4MDQsMHgwMCwweDAwLDB4MDAsMHgwMiwweDAwLDB4MDAsMHgwMCwKKyAgICAgIDB4MzQsMHgzMywweDAwLDB4MDAsMHgwMiwweDAwLDB4MDAsMHgwMCwweDY5LDB4NjQsMHgwMCwweDAwLDB4MjAsMHhERiwweEZGLDB4RkYsMHgwMCwweDAwLDB4MDAsMHgwMSwKICAgICAgIDB4MDIsMHgwMCwweDAwLDB4MDAsMHgwMSwweDAwLDB4MDAsMHgwMCwweDAxLDB4MDAsMHgwMCwweDAwLDB4MEYsMHgwMCwweDAwLDB4MDAsMHg2MSwweDZFLDB4NzksMHg1RiwKICAgICAgIDB4NzUsMHg2RSwweDY5LDB4NzEsMHg3NSwweDY1LDB4NUYsMHg3NCwweDc5LDB4NzAsMHg2NSwweDAwLDB4MjgsMHhFQSwweEZGLDB4RkYsMHgwMCwweDAwLDB4MDAsMHgwMSwKICAgICAgIDB4MkEsMHgwMCwweDU4LDB4MDAsMHgwMCwweDAxLDB4MDAsMHgwMCwweEYwLDB4MDAsMHgwMCwweDAwLDB4MEMsMHgwMCwweDAwLDB4MDAsMHgwNCwweDAwLDB4MDAsMHgwMCwKICAgICAgIDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwNSwweDAwLDB4MDAsMHgwMCwweEIwLDB4MDAsMHgwMCwweDAwLDB4ODAsMHgwMCwweDAwLDB4MDAsMHg1MCwweDAwLDB4MDAsMHgwMCwKLSAgICAgIDB4MjQsMHgwMCwweDAwLDB4MDAsMHgwNCwweDAwLDB4MDAsMHgwMCwweEE4LDB4RTAsMHhGRiwweEZGLDB4MTAsMHgwMCwweDAwLDB4MDAsMHgwNCwweDAwLDB4MDAsMHgwMCwKLSAgICAgIDB4MDIsMHgwMCwweDAwLDB4MDAsMHgzNCwweDMyLDB4MDAsMHgwMCwweDAyLDB4MDAsMHgwMCwweDAwLDB4NjksMHg2NCwweDAwLDB4MDAsMHhDNCwweEUwLDB4RkYsMHhGRiwKKyAgICAgIDB4MjQsMHgwMCwweDAwLDB4MDAsMHgwNCwweDAwLDB4MDAsMHgwMCwweDIwLDB4RTAsMHhGRiwweEZGLDB4MTAsMHgwMCwweDAwLDB4MDAsMHgwNCwweDAwLDB4MDAsMHgwMCwKKyAgICAgIDB4MDIsMHgwMCwweDAwLDB4MDAsMHgzNCwweDMyLDB4MDAsMHgwMCwweDAyLDB4MDAsMHgwMCwweDAwLDB4NjksMHg2NCwweDAwLDB4MDAsMHgzQywweEUwLDB4RkYsMHhGRiwKICAgICAgIDB4MTgsMHgwMCwweDAwLDB4MDAsMHgwNCwweDAwLDB4MDAsMHgwMCwweDA4LDB4MDAsMHgwMCwweDAwLDB4NjYsMHg2RSwweDc2LDB4MzEsMHg2MSwweDVGLDB4MzYsMHgzNCwKLSAgICAgIDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwNCwweDAwLDB4MDAsMHgwMCwweDY4LDB4NjEsMHg3MywweDY4LDB4MDAsMHgwMCwweDAwLDB4MDAsMHhFQywweEUwLDB4RkYsMHhGRiwKKyAgICAgIDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwNCwweDAwLDB4MDAsMHgwMCwweDY4LDB4NjEsMHg3MywweDY4LDB4MDAsMHgwMCwweDAwLDB4MDAsMHg2NCwweEUwLDB4RkYsMHhGRiwKICAgICAgIDB4MTgsMHgwMCwweDAwLDB4MDAsMHgwNCwweDAwLDB4MDAsMHgwMCwweDBCLDB4MDAsMHgwMCwweDAwLDB4NTIsMHg2NSwweDY2LDB4NjUsMHg3MiwweDcyLDB4NjEsMHg2MiwKICAgICAgIDB4NkMsMHg2NSwweDU0LDB4MDAsMHgwOCwweDAwLDB4MDAsMHgwMCwweDYzLDB4NzAsMHg3MCwweDVGLDB4NzQsMHg3OSwweDcwLDB4NjUsMHgwMCwweDAwLDB4MDAsMHgwMCwKLSAgICAgIDB4MTgsMHhFMSwweEZGLDB4RkYsMHgxMCwweDAwLDB4MDAsMHgwMCwweDA0LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKyAgICAgIDB4OTAsMHhFMCwweEZGLDB4RkYsMHgxMCwweDAwLDB4MDAsMHgwMCwweDA0LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKICAgICAgIDB4MTAsMHgwMCwweDAwLDB4MDAsMHg2MywweDcwLDB4NzAsMHg1RiwweDcwLDB4NzQsMHg3MiwweDVGLDB4NzQsMHg3OSwweDcwLDB4NjUsMHg1RiwweDY3LDB4NjUsMHg3NCwKLSAgICAgIDB4MDAsMHgwMCwweDAwLDB4MDAsMHg0NCwweEUxLDB4RkYsMHhGRiwweDE0LDB4MDAsMHgwMCwweDAwLDB4MDQsMHgwMCwweDAwLDB4MDAsMHgwNSwweDAwLDB4MDAsMHgwMCwKKyAgICAgIDB4MDAsMHgwMCwweDAwLDB4MDAsMHhCQywweEUwLDB4RkYsMHhGRiwweDE0LDB4MDAsMHgwMCwweDAwLDB4MDQsMHgwMCwweDAwLDB4MDAsMHgwNSwweDAwLDB4MDAsMHgwMCwKICAgICAgIDB4NkUsMHg2MSwweDZCLDB4NjUsMHg2NCwweDAwLDB4MDAsMHgwMCwweDBDLDB4MDAsMHgwMCwweDAwLDB4NjMsMHg3MCwweDcwLDB4NUYsMHg3MCwweDc0LDB4NzIsMHg1RiwKICAgICAgIDB4NzQsMHg3OSwweDcwLDB4NjUsMHgwMCwweDAwLDB4MDAsMHgwMCwweEM4LDB4RUEsMHhGRiwweEZGLDB4MDAsMHgwMCwweDBFLDB4MEEsMHgwOCwweDAwLDB4MDAsMHgwMCwKICAgICAgIDB4MUYsMHgwMCwweDAwLDB4MDAsMHg3NiwweDY1LDB4NjMsMHg3NCwweDZGLDB4NzIsMHg1RiwweDZGLDB4NjYsMHg1RiwweDZFLDB4NkYsMHg2RSwweDVGLDB4NkYsMHg3NywKICAgICAgIDB4NkUsMHg2OSwweDZFLDB4NjcsMHg1RiwweDcyLDB4NjUsMHg2NiwweDY1LDB4NzIsMHg2NSwweDZFLDB4NjMsMHg2NSwweDczLDB4MDAsMHg0MiwweEVDLDB4RkYsMHhGRiwKICAgICAgIDB4MjksMHgwMCwweDU2LDB4MDAsMHgwNCwweDAxLDB4MDAsMHgwMCwweEYwLDB4MDAsMHgwMCwweDAwLDB4MEMsMHgwMCwweDAwLDB4MDAsMHgwNCwweDAwLDB4MDAsMHgwMCwKICAgICAgIDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwNSwweDAwLDB4MDAsMHgwMCwweEIwLDB4MDAsMHgwMCwweDAwLDB4ODAsMHgwMCwweDAwLDB4MDAsMHg1MCwweDAwLDB4MDAsMHgwMCwKLSAgICAgIDB4MjQsMHgwMCwweDAwLDB4MDAsMHgwNCwweDAwLDB4MDAsMHgwMCwweEQ0LDB4RTEsMHhGRiwweEZGLDB4MTAsMHgwMCwweDAwLDB4MDAsMHgwNCwweDAwLDB4MDAsMHgwMCwKLSAgICAgIDB4MDIsMHgwMCwweDAwLDB4MDAsMHgzNCwweDMxLDB4MDAsMHgwMCwweDAyLDB4MDAsMHgwMCwweDAwLDB4NjksMHg2NCwweDAwLDB4MDAsMHhGMCwweEUxLDB4RkYsMHhGRiwKKyAgICAgIDB4MjQsMHgwMCwweDAwLDB4MDAsMHgwNCwweDAwLDB4MDAsMHgwMCwweDRDLDB4RTEsMHhGRiwweEZGLDB4MTAsMHgwMCwweDAwLDB4MDAsMHgwNCwweDAwLDB4MDAsMHgwMCwKKyAgICAgIDB4MDIsMHgwMCwweDAwLDB4MDAsMHgzNCwweDMxLDB4MDAsMHgwMCwweDAyLDB4MDAsMHgwMCwweDAwLDB4NjksMHg2NCwweDAwLDB4MDAsMHg2OCwweEUxLDB4RkYsMHhGRiwKICAgICAgIDB4MTgsMHgwMCwweDAwLDB4MDAsMHgwNCwweDAwLDB4MDAsMHgwMCwweDA4LDB4MDAsMHgwMCwweDAwLDB4NjYsMHg2RSwweDc2LDB4MzEsMHg2MSwweDVGLDB4MzYsMHgzNCwKLSAgICAgIDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwNCwweDAwLDB4MDAsMHgwMCwweDY4LDB4NjEsMHg3MywweDY4LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgxOCwweEUyLDB4RkYsMHhGRiwKKyAgICAgIDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwNCwweDAwLDB4MDAsMHgwMCwweDY4LDB4NjEsMHg3MywweDY4LDB4MDAsMHgwMCwweDAwLDB4MDAsMHg5MCwweEUxLDB4RkYsMHhGRiwKICAgICAgIDB4MTgsMHgwMCwweDAwLDB4MDAsMHgwNCwweDAwLDB4MDAsMHgwMCwweDBCLDB4MDAsMHgwMCwweDAwLDB4NTIsMHg2NSwweDY2LDB4NjUsMHg3MiwweDcyLDB4NjEsMHg2MiwKICAgICAgIDB4NkMsMHg2NSwweDU0LDB4MDAsMHgwOCwweDAwLDB4MDAsMHgwMCwweDYzLDB4NzAsMHg3MCwweDVGLDB4NzQsMHg3OSwweDcwLDB4NjUsMHgwMCwweDAwLDB4MDAsMHgwMCwKLSAgICAgIDB4NDQsMHhFMiwweEZGLDB4RkYsMHgxMCwweDAwLDB4MDAsMHgwMCwweDA0LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKyAgICAgIDB4QkMsMHhFMSwweEZGLDB4RkYsMHgxMCwweDAwLDB4MDAsMHgwMCwweDA0LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKICAgICAgIDB4MTAsMHgwMCwweDAwLDB4MDAsMHg2MywweDcwLDB4NzAsMHg1RiwweDcwLDB4NzQsMHg3MiwweDVGLDB4NzQsMHg3OSwweDcwLDB4NjUsMHg1RiwweDY3LDB4NjUsMHg3NCwKLSAgICAgIDB4MDAsMHgwMCwweDAwLDB4MDAsMHg3MCwweEUyLDB4RkYsMHhGRiwweDE0LDB4MDAsMHgwMCwweDAwLDB4MDQsMHgwMCwweDAwLDB4MDAsMHgwNSwweDAwLDB4MDAsMHgwMCwKKyAgICAgIDB4MDAsMHgwMCwweDAwLDB4MDAsMHhFOCwweEUxLDB4RkYsMHhGRiwweDE0LDB4MDAsMHgwMCwweDAwLDB4MDQsMHgwMCwweDAwLDB4MDAsMHgwNSwweDAwLDB4MDAsMHgwMCwKICAgICAgIDB4NkUsMHg2MSwweDZCLDB4NjUsMHg2NCwweDAwLDB4MDAsMHgwMCwweDBDLDB4MDAsMHgwMCwweDAwLDB4NjMsMHg3MCwweDcwLDB4NUYsMHg3MCwweDc0LDB4NzIsMHg1RiwKLSAgICAgIDB4NzQsMHg3OSwweDcwLDB4NjUsMHgwMCwweDAwLDB4MDAsMHgwMCwweDFDLDB4RTEsMHhGRiwweEZGLDB4MDAsMHgwMCwweDAwLDB4MEEsMHgwOCwweDAwLDB4MDAsMHgwMCwKKyAgICAgIDB4NzQsMHg3OSwweDcwLDB4NjUsMHgwMCwweDAwLDB4MDAsMHgwMCwweDk0LDB4RTAsMHhGRiwweEZGLDB4MDAsMHgwMCwweDAwLDB4MEEsMHgwOCwweDAwLDB4MDAsMHgwMCwKICAgICAgIDB4MDEsMHgwMCwweDAwLDB4MDAsMHgxNCwweDAwLDB4MDAsMHgwMCwweDZFLDB4NkYsMHg2RSwweDVGLDB4NkYsMHg3NywweDZFLDB4NjksMHg2RSwweDY3LDB4NUYsMHg3MiwKICAgICAgIDB4NjUsMHg2NiwweDY1LDB4NzIsMHg2NSwweDZFLDB4NjMsMHg2NSwweDAwLDB4MDAsMHgwMCwweDAwLDB4ODAsMHhFQywweEZGLDB4RkYsMHgwMCwweDAwLDB4MDAsMHgwMSwKICAgICAgIDB4MjgsMHgwMCwweDU0LDB4MDAsMHgxMCwweDAxLDB4MDAsMHgwMCwweDAwLDB4MDEsMHgwMCwweDAwLDB4MEMsMHgwMCwweDAwLDB4MDAsMHgwNCwweDAwLDB4MDAsMHgwMCwKICAgICAgIDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwNSwweDAwLDB4MDAsMHgwMCwweEI0LDB4MDAsMHgwMCwweDAwLDB4ODAsMHgwMCwweDAwLDB4MDAsMHg1MCwweDAwLDB4MDAsMHgwMCwKLSAgICAgIDB4MjQsMHgwMCwweDAwLDB4MDAsMHgwNCwweDAwLDB4MDAsMHgwMCwweDAwLDB4RTMsMHhGRiwweEZGLDB4MTAsMHgwMCwweDAwLDB4MDAsMHgwNCwweDAwLDB4MDAsMHgwMCwKLSAgICAgIDB4MDIsMHgwMCwweDAwLDB4MDAsMHgzNCwweDMwLDB4MDAsMHgwMCwweDAyLDB4MDAsMHgwMCwweDAwLDB4NjksMHg2NCwweDAwLDB4MDAsMHgxQywweEUzLDB4RkYsMHhGRiwKKyAgICAgIDB4MjQsMHgwMCwweDAwLDB4MDAsMHgwNCwweDAwLDB4MDAsMHgwMCwweDc4LDB4RTIsMHhGRiwweEZGLDB4MTAsMHgwMCwweDAwLDB4MDAsMHgwNCwweDAwLDB4MDAsMHgwMCwKKyAgICAgIDB4MDIsMHgwMCwweDAwLDB4MDAsMHgzNCwweDMwLDB4MDAsMHgwMCwweDAyLDB4MDAsMHgwMCwweDAwLDB4NjksMHg2NCwweDAwLDB4MDAsMHg5NCwweEUyLDB4RkYsMHhGRiwKICAgICAgIDB4MTgsMHgwMCwweDAwLDB4MDAsMHgwNCwweDAwLDB4MDAsMHgwMCwweDA4LDB4MDAsMHgwMCwweDAwLDB4NjYsMHg2RSwweDc2LDB4MzEsMHg2MSwweDVGLDB4MzYsMHgzNCwKLSAgICAgIDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwNCwweDAwLDB4MDAsMHgwMCwweDY4LDB4NjEsMHg3MywweDY4LDB4MDAsMHgwMCwweDAwLDB4MDAsMHg0NCwweEUzLDB4RkYsMHhGRiwKKyAgICAgIDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwNCwweDAwLDB4MDAsMHgwMCwweDY4LDB4NjEsMHg3MywweDY4LDB4MDAsMHgwMCwweDAwLDB4MDAsMHhCQywweEUyLDB4RkYsMHhGRiwKICAgICAgIDB4MTgsMHgwMCwweDAwLDB4MDAsMHgwNCwweDAwLDB4MDAsMHgwMCwweDBCLDB4MDAsMHgwMCwweDAwLDB4NTIsMHg2NSwweDY2LDB4NjUsMHg3MiwweDcyLDB4NjEsMHg2MiwKICAgICAgIDB4NkMsMHg2NSwweDU0LDB4MDAsMHgwOCwweDAwLDB4MDAsMHgwMCwweDYzLDB4NzAsMHg3MCwweDVGLDB4NzQsMHg3OSwweDcwLDB4NjUsMHgwMCwweDAwLDB4MDAsMHgwMCwKLSAgICAgIDB4NzAsMHhFMywweEZGLDB4RkYsMHgxNCwweDAwLDB4MDAsMHgwMCwweDA0LDB4MDAsMHgwMCwweDAwLDB4MDYsMHgwMCwweDAwLDB4MDAsMHgyRSwweDY3LDB4NjUsMHg3NCwKKyAgICAgIDB4RTgsMHhFMiwweEZGLDB4RkYsMHgxNCwweDAwLDB4MDAsMHgwMCwweDA0LDB4MDAsMHgwMCwweDAwLDB4MDYsMHgwMCwweDAwLDB4MDAsMHgyRSwweDY3LDB4NjUsMHg3NCwKICAgICAgIDB4MjgsMHgyOSwweDAwLDB4MDAsMHgxMCwweDAwLDB4MDAsMHgwMCwweDYzLDB4NzAsMHg3MCwweDVGLDB4NzAsMHg3NCwweDcyLDB4NUYsMHg3NCwweDc5LDB4NzAsMHg2NSwKLSAgICAgIDB4NUYsMHg2NywweDY1LDB4NzQsMHgwMCwweDAwLDB4MDAsMHgwMCwweEEwLDB4RTMsMHhGRiwweEZGLDB4MjAsMHgwMCwweDAwLDB4MDAsMHgwNCwweDAwLDB4MDAsMHgwMCwKKyAgICAgIDB4NUYsMHg2NywweDY1LDB4NzQsMHgwMCwweDAwLDB4MDAsMHgwMCwweDE4LDB4RTMsMHhGRiwweEZGLDB4MjAsMHgwMCwweDAwLDB4MDAsMHgwNCwweDAwLDB4MDAsMHgwMCwKICAgICAgIDB4MTAsMHgwMCwweDAwLDB4MDAsMHg2NCwweDY1LDB4NjYsMHg2MSwweDc1LDB4NkMsMHg3NCwweDVGLDB4NzAsMHg3NCwweDcyLDB4NUYsMHg3NCwweDc5LDB4NzAsMHg2NSwKICAgICAgIDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwQywweDAwLDB4MDAsMHgwMCwweDYzLDB4NzAsMHg3MCwweDVGLDB4NzAsMHg3NCwweDcyLDB4NUYsMHg3NCwweDc5LDB4NzAsMHg2NSwKICAgICAgIDB4MDAsMHgwMCwweDAwLDB4MDAsMHgzMCwweEVELDB4RkYsMHhGRiwweDAwLDB4MDAsMHgwRSwweDBBLDB4MDgsMHgwMCwweDAwLDB4MDAsMHgxRSwweDAwLDB4MDAsMHgwMCwKQEAgLTMzNCwyMCArMzQxLDIwIEBACiAgICAgICAweDcyLDB4NjUsMHg2NiwweDY1LDB4NzIsMHg2NSwweDZFLDB4NjMsMHg2NSwweDczLDB4MDAsMHgwMCwweEFBLDB4RUUsMHhGRiwweEZGLDB4MjcsMHgwMCwweDUyLDB4MDAsCiAgICAgICAweEQ0LDB4MDAsMHgwMCwweDAwLDB4QzAsMHgwMCwweDAwLDB4MDAsMHgwQywweDAwLDB4MDAsMHgwMCwweDA0LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCiAgICAgICAweDA0LDB4MDAsMHgwMCwweDAwLDB4ODAsMHgwMCwweDAwLDB4MDAsMHg1MCwweDAwLDB4MDAsMHgwMCwweDI0LDB4MDAsMHgwMCwweDAwLDB4MDQsMHgwMCwweDAwLDB4MDAsCi0gICAgICAweDM4LDB4RTQsMHhGRiwweEZGLDB4MTAsMHgwMCwweDAwLDB4MDAsMHgwNCwweDAwLDB4MDAsMHgwMCwweDAyLDB4MDAsMHgwMCwweDAwLDB4MzMsMHgzOSwweDAwLDB4MDAsCi0gICAgICAweDAyLDB4MDAsMHgwMCwweDAwLDB4NjksMHg2NCwweDAwLDB4MDAsMHg1NCwweEU0LDB4RkYsMHhGRiwweDE4LDB4MDAsMHgwMCwweDAwLDB4MDQsMHgwMCwweDAwLDB4MDAsCisgICAgICAweEIwLDB4RTMsMHhGRiwweEZGLDB4MTAsMHgwMCwweDAwLDB4MDAsMHgwNCwweDAwLDB4MDAsMHgwMCwweDAyLDB4MDAsMHgwMCwweDAwLDB4MzMsMHgzOSwweDAwLDB4MDAsCisgICAgICAweDAyLDB4MDAsMHgwMCwweDAwLDB4NjksMHg2NCwweDAwLDB4MDAsMHhDQywweEUzLDB4RkYsMHhGRiwweDE4LDB4MDAsMHgwMCwweDAwLDB4MDQsMHgwMCwweDAwLDB4MDAsCiAgICAgICAweDA4LDB4MDAsMHgwMCwweDAwLDB4NjYsMHg2RSwweDc2LDB4MzEsMHg2MSwweDVGLDB4MzYsMHgzNCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDQsMHgwMCwweDAwLDB4MDAsCi0gICAgICAweDY4LDB4NjEsMHg3MywweDY4LDB4MDAsMHgwMCwweDAwLDB4MDAsMHg3QywweEU0LDB4RkYsMHhGRiwweDE4LDB4MDAsMHgwMCwweDAwLDB4MDQsMHgwMCwweDAwLDB4MDAsCisgICAgICAweDY4LDB4NjEsMHg3MywweDY4LDB4MDAsMHgwMCwweDAwLDB4MDAsMHhGNCwweEUzLDB4RkYsMHhGRiwweDE4LDB4MDAsMHgwMCwweDAwLDB4MDQsMHgwMCwweDAwLDB4MDAsCiAgICAgICAweDBCLDB4MDAsMHgwMCwweDAwLDB4NTIsMHg2NSwweDY2LDB4NjUsMHg3MiwweDcyLDB4NjEsMHg2MiwweDZDLDB4NjUsMHg1NCwweDAwLDB4MDgsMHgwMCwweDAwLDB4MDAsCi0gICAgICAweDYzLDB4NzAsMHg3MCwweDVGLDB4NzQsMHg3OSwweDcwLDB4NjUsMHgwMCwweDAwLDB4MDAsMHgwMCwweEE4LDB4RTQsMHhGRiwweEZGLDB4MTQsMHgwMCwweDAwLDB4MDAsCisgICAgICAweDYzLDB4NzAsMHg3MCwweDVGLDB4NzQsMHg3OSwweDcwLDB4NjUsMHgwMCwweDAwLDB4MDAsMHgwMCwweDIwLDB4RTQsMHhGRiwweEZGLDB4MTQsMHgwMCwweDAwLDB4MDAsCiAgICAgICAweDA0LDB4MDAsMHgwMCwweDAwLDB4MDUsMHgwMCwweDAwLDB4MDAsMHg2RSwweDYxLDB4NkIsMHg2NSwweDY0LDB4MDAsMHgwMCwweDAwLDB4MEMsMHgwMCwweDAwLDB4MDAsCi0gICAgICAweDYzLDB4NzAsMHg3MCwweDVGLDB4NzAsMHg3NCwweDcyLDB4NUYsMHg3NCwweDc5LDB4NzAsMHg2NSwweDAwLDB4MDAsMHgwMCwweDAwLDB4NTQsMHhFMywweEZGLDB4RkYsCisgICAgICAweDYzLDB4NzAsMHg3MCwweDVGLDB4NzAsMHg3NCwweDcyLDB4NUYsMHg3NCwweDc5LDB4NzAsMHg2NSwweDAwLDB4MDAsMHgwMCwweDAwLDB4Q0MsMHhFMiwweEZGLDB4RkYsCiAgICAgICAweDAwLDB4MDAsMHgwMCwweDBBLDB4MDgsMHgwMCwweDAwLDB4MDAsMHgwMSwweDAwLDB4MDAsMHgwMCwweDEzLDB4MDAsMHgwMCwweDAwLDB4NjMsMHg2RiwweDVGLDB4NkYsCiAgICAgICAweDc3LDB4NkUsMHg2OSwweDZFLDB4NjcsMHg1RiwweDcyLDB4NjUsMHg2NiwweDY1LDB4NzIsMHg2NSwweDZFLDB4NjMsMHg2NSwweDAwLDB4QjQsMHhFRSwweEZGLDB4RkYsCiAgICAgICAweDAwLDB4MDAsMHgwMCwweDAxLDB4MjYsMHgwMCwweDUwLDB4MDAsMHg4NCwweDAwLDB4MDAsMHgwMCwweDcwLDB4MDAsMHgwMCwweDAwLDB4MEMsMHgwMCwweDAwLDB4MDAsCiAgICAgICAweDA0LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMiwweDAwLDB4MDAsMHgwMCwweDI0LDB4MDAsMHgwMCwweDAwLDB4MDQsMHgwMCwweDAwLDB4MDAsCi0gICAgICAweDI4LDB4RTUsMHhGRiwweEZGLDB4MTAsMHgwMCwweDAwLDB4MDAsMHgwNCwweDAwLDB4MDAsMHgwMCwweDAyLDB4MDAsMHgwMCwweDAwLDB4MzMsMHgzOCwweDAwLDB4MDAsCi0gICAgICAweDAyLDB4MDAsMHgwMCwweDAwLDB4NjksMHg2NCwweDAwLDB4MDAsMHg0NCwweEU1LDB4RkYsMHhGRiwweDIwLDB4MDAsMHgwMCwweDAwLDB4MDQsMHgwMCwweDAwLDB4MDAsCisgICAgICAweEEwLDB4RTQsMHhGRiwweEZGLDB4MTAsMHgwMCwweDAwLDB4MDAsMHgwNCwweDAwLDB4MDAsMHgwMCwweDAyLDB4MDAsMHgwMCwweDAwLDB4MzMsMHgzOCwweDAwLDB4MDAsCisgICAgICAweDAyLDB4MDAsMHgwMCwweDAwLDB4NjksMHg2NCwweDAwLDB4MDAsMHhCQywweEU0LDB4RkYsMHhGRiwweDIwLDB4MDAsMHgwMCwweDAwLDB4MDQsMHgwMCwweDAwLDB4MDAsCiAgICAgICAweDEwLDB4MDAsMHgwMCwweDAwLDB4NjQsMHg2NSwweDY2LDB4NjEsMHg3NSwweDZDLDB4NzQsMHg1RiwweDcwLDB4NzQsMHg3MiwweDVGLDB4NzQsMHg3OSwweDcwLDB4NjUsCiAgICAgICAweDAwLDB4MDAsMHgwMCwweDAwLDB4MEMsMHgwMCwweDAwLDB4MDAsMHg2MywweDcwLDB4NzAsMHg1RiwweDcwLDB4NzQsMHg3MiwweDVGLDB4NzQsMHg3OSwweDcwLDB4NjUsCiAgICAgICAweDAwLDB4MDAsMHgwMCwweDAwLDB4QTgsMHhGMCwweEZGLDB4RkYsMHgwMCwweDAwLDB4MEUsMHgwRiwweDAyLDB4MDAsMHgwMCwweDAwLDB4MDQsMHgwMCwweDAwLDB4MDAsCkBAIC0zNTUsMTc3ICszNjIsMTc3IEBACiAgICAgICAweDVGLDB4NzIsMHg2NSwweDY2LDB4NjUsMHg3MiwweDcyLDB4NjEsMHg2MiwweDZDLDB4NjUsMHg3MywweDAwLDB4MDAsMHgwMCwweDAwLDB4NjgsMHhFRiwweEZGLDB4RkYsCiAgICAgICAweDAwLDB4MDAsMHgwMCwweDAxLDB4MjUsMHgwMCwweDRFLDB4MDAsMHhEMCwweDAwLDB4MDAsMHgwMCwweEMwLDB4MDAsMHgwMCwweDAwLDB4MEMsMHgwMCwweDAwLDB4MDAsCiAgICAgICAweDA0LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwNCwweDAwLDB4MDAsMHgwMCwweDgwLDB4MDAsMHgwMCwweDAwLDB4NTAsMHgwMCwweDAwLDB4MDAsCi0gICAgICAweDI0LDB4MDAsMHgwMCwweDAwLDB4MDQsMHgwMCwweDAwLDB4MDAsMHhFNCwweEU1LDB4RkYsMHhGRiwweDEwLDB4MDAsMHgwMCwweDAwLDB4MDQsMHgwMCwweDAwLDB4MDAsCi0gICAgICAweDAyLDB4MDAsMHgwMCwweDAwLDB4MzMsMHgzNywweDAwLDB4MDAsMHgwMiwweDAwLDB4MDAsMHgwMCwweDY5LDB4NjQsMHgwMCwweDAwLDB4MDAsMHhFNiwweEZGLDB4RkYsCisgICAgICAweDI0LDB4MDAsMHgwMCwweDAwLDB4MDQsMHgwMCwweDAwLDB4MDAsMHg1QywweEU1LDB4RkYsMHhGRiwweDEwLDB4MDAsMHgwMCwweDAwLDB4MDQsMHgwMCwweDAwLDB4MDAsCisgICAgICAweDAyLDB4MDAsMHgwMCwweDAwLDB4MzMsMHgzNywweDAwLDB4MDAsMHgwMiwweDAwLDB4MDAsMHgwMCwweDY5LDB4NjQsMHgwMCwweDAwLDB4NzgsMHhFNSwweEZGLDB4RkYsCiAgICAgICAweDE4LDB4MDAsMHgwMCwweDAwLDB4MDQsMHgwMCwweDAwLDB4MDAsMHgwOCwweDAwLDB4MDAsMHgwMCwweDY2LDB4NkUsMHg3NiwweDMxLDB4NjEsMHg1RiwweDM2LDB4MzQsCi0gICAgICAweDAwLDB4MDAsMHgwMCwweDAwLDB4MDQsMHgwMCwweDAwLDB4MDAsMHg2OCwweDYxLDB4NzMsMHg2OCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MjgsMHhFNiwweEZGLDB4RkYsCisgICAgICAweDAwLDB4MDAsMHgwMCwweDAwLDB4MDQsMHgwMCwweDAwLDB4MDAsMHg2OCwweDYxLDB4NzMsMHg2OCwweDAwLDB4MDAsMHgwMCwweDAwLDB4QTAsMHhFNSwweEZGLDB4RkYsCiAgICAgICAweDE4LDB4MDAsMHgwMCwweDAwLDB4MDQsMHgwMCwweDAwLDB4MDAsMHgwQiwweDAwLDB4MDAsMHgwMCwweDUyLDB4NjUsMHg2NiwweDY1LDB4NzIsMHg3MiwweDYxLDB4NjIsCiAgICAgICAweDZDLDB4NjUsMHg1NCwweDAwLDB4MDgsMHgwMCwweDAwLDB4MDAsMHg2MywweDcwLDB4NzAsMHg1RiwweDc0LDB4NzksMHg3MCwweDY1LDB4MDAsMHgwMCwweDAwLDB4MDAsCi0gICAgICAweDU0LDB4RTYsMHhGRiwweEZGLDB4MTQsMHgwMCwweDAwLDB4MDAsMHgwNCwweDAwLDB4MDAsMHgwMCwweDA1LDB4MDAsMHgwMCwweDAwLDB4NkUsMHg2MSwweDZCLDB4NjUsCisgICAgICAweENDLDB4RTUsMHhGRiwweEZGLDB4MTQsMHgwMCwweDAwLDB4MDAsMHgwNCwweDAwLDB4MDAsMHgwMCwweDA1LDB4MDAsMHgwMCwweDAwLDB4NkUsMHg2MSwweDZCLDB4NjUsCiAgICAgICAweDY0LDB4MDAsMHgwMCwweDAwLDB4MEMsMHgwMCwweDAwLDB4MDAsMHg2MywweDcwLDB4NzAsMHg1RiwweDcwLDB4NzQsMHg3MiwweDVGLDB4NzQsMHg3OSwweDcwLDB4NjUsCiAgICAgICAweDAwLDB4MDAsMHgwMCwweDAwLDB4RDgsMHhFRiwweEZGLDB4RkYsMHgwMCwweDAwLDB4MEUsMHgwQSwweDA4LDB4MDAsMHgwMCwweDAwLDB4MTksMHgwMCwweDAwLDB4MDAsCiAgICAgICAweDc2LDB4NjUsMHg2MywweDc0LDB4NkYsMHg3MiwweDVGLDB4NkYsMHg2NiwweDVGLDB4NzcsMHg2NSwweDYxLDB4NkIsMHg1RiwweDcyLDB4NjUsMHg2NiwweDY1LDB4NzIsCiAgICAgICAweDY1LDB4NkUsMHg2MywweDY1LDB4NzMsMHgwMCwweDAwLDB4MDAsMHg0RSwweEYxLDB4RkYsMHhGRiwweDI0LDB4MDAsMHg0QywweDAwLDB4RDQsMHgwMCwweDAwLDB4MDAsCiAgICAgICAweEMwLDB4MDAsMHgwMCwweDAwLDB4MEMsMHgwMCwweDAwLDB4MDAsMHgwNCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDQsMHgwMCwweDAwLDB4MDAsCi0gICAgICAweDgwLDB4MDAsMHgwMCwweDAwLDB4NTAsMHgwMCwweDAwLDB4MDAsMHgyNCwweDAwLDB4MDAsMHgwMCwweDA0LDB4MDAsMHgwMCwweDAwLDB4REMsMHhFNiwweEZGLDB4RkYsCisgICAgICAweDgwLDB4MDAsMHgwMCwweDAwLDB4NTAsMHgwMCwweDAwLDB4MDAsMHgyNCwweDAwLDB4MDAsMHgwMCwweDA0LDB4MDAsMHgwMCwweDAwLDB4NTQsMHhFNiwweEZGLDB4RkYsCiAgICAgICAweDEwLDB4MDAsMHgwMCwweDAwLDB4MDQsMHgwMCwweDAwLDB4MDAsMHgwMiwweDAwLDB4MDAsMHgwMCwweDMzLDB4MzYsMHgwMCwweDAwLDB4MDIsMHgwMCwweDAwLDB4MDAsCi0gICAgICAweDY5LDB4NjQsMHgwMCwweDAwLDB4RjgsMHhFNiwweEZGLDB4RkYsMHgxOCwweDAwLDB4MDAsMHgwMCwweDA0LDB4MDAsMHgwMCwweDAwLDB4MDgsMHgwMCwweDAwLDB4MDAsCisgICAgICAweDY5LDB4NjQsMHgwMCwweDAwLDB4NzAsMHhFNiwweEZGLDB4RkYsMHgxOCwweDAwLDB4MDAsMHgwMCwweDA0LDB4MDAsMHgwMCwweDAwLDB4MDgsMHgwMCwweDAwLDB4MDAsCiAgICAgICAweDY2LDB4NkUsMHg3NiwweDMxLDB4NjEsMHg1RiwweDM2LDB4MzQsMHgwMCwweDAwLDB4MDAsMHgwMCwweDA0LDB4MDAsMHgwMCwweDAwLDB4NjgsMHg2MSwweDczLDB4NjgsCi0gICAgICAweDAwLDB4MDAsMHgwMCwweDAwLDB4MjAsMHhFNywweEZGLDB4RkYsMHgxOCwweDAwLDB4MDAsMHgwMCwweDA0LDB4MDAsMHgwMCwweDAwLDB4MEIsMHgwMCwweDAwLDB4MDAsCisgICAgICAweDAwLDB4MDAsMHgwMCwweDAwLDB4OTgsMHhFNiwweEZGLDB4RkYsMHgxOCwweDAwLDB4MDAsMHgwMCwweDA0LDB4MDAsMHgwMCwweDAwLDB4MEIsMHgwMCwweDAwLDB4MDAsCiAgICAgICAweDUyLDB4NjUsMHg2NiwweDY1LDB4NzIsMHg3MiwweDYxLDB4NjIsMHg2QywweDY1LDB4NTQsMHgwMCwweDA4LDB4MDAsMHgwMCwweDAwLDB4NjMsMHg3MCwweDcwLDB4NUYsCi0gICAgICAweDc0LDB4NzksMHg3MCwweDY1LDB4MDAsMHgwMCwweDAwLDB4MDAsMHg0QywweEU3LDB4RkYsMHhGRiwweDE0LDB4MDAsMHgwMCwweDAwLDB4MDQsMHgwMCwweDAwLDB4MDAsCisgICAgICAweDc0LDB4NzksMHg3MCwweDY1LDB4MDAsMHgwMCwweDAwLDB4MDAsMHhDNCwweEU2LDB4RkYsMHhGRiwweDE0LDB4MDAsMHgwMCwweDAwLDB4MDQsMHgwMCwweDAwLDB4MDAsCiAgICAgICAweDA1LDB4MDAsMHgwMCwweDAwLDB4NkUsMHg2MSwweDZCLDB4NjUsMHg2NCwweDAwLDB4MDAsMHgwMCwweDBDLDB4MDAsMHgwMCwweDAwLDB4NjMsMHg3MCwweDcwLDB4NUYsCi0gICAgICAweDcwLDB4NzQsMHg3MiwweDVGLDB4NzQsMHg3OSwweDcwLDB4NjUsMHgwMCwweDAwLDB4MDAsMHgwMCwweEY4LDB4RTUsMHhGRiwweEZGLDB4MDAsMHgwMCwweDAwLDB4MEEsCisgICAgICAweDcwLDB4NzQsMHg3MiwweDVGLDB4NzQsMHg3OSwweDcwLDB4NjUsMHgwMCwweDAwLDB4MDAsMHgwMCwweDcwLDB4RTUsMHhGRiwweEZGLDB4MDAsMHgwMCwweDAwLDB4MEEsCiAgICAgICAweDA4LDB4MDAsMHgwMCwweDAwLDB4MDEsMHgwMCwweDAwLDB4MDAsMHgxNSwweDAwLDB4MDAsMHgwMCwweDczLDB4NjksMHg2RSwweDY3LDB4NkMsMHg2NSwweDVGLDB4NzcsCiAgICAgICAweDY1LDB4NjEsMHg2QiwweDVGLDB4NzIsMHg2NSwweDY2LDB4NjUsMHg3MiwweDY1LDB4NkUsMHg2MywweDY1LDB4MDAsMHgwMCwweDAwLDB4NUMsMHhGMSwweEZGLDB4RkYsCiAgICAgICAweDAwLDB4MDAsMHgwMCwweDAxLDB4MjMsMHgwMCwweDRBLDB4MDAsMHg0OCwweDAwLDB4MDAsMHgwMCwweDM0LDB4MDAsMHgwMCwweDAwLDB4MEMsMHgwMCwweDAwLDB4MDAsCi0gICAgICAweDA0LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMSwweDAwLDB4MDAsMHgwMCwweDA0LDB4MDAsMHgwMCwweDAwLDB4Q0MsMHhFNywweEZGLDB4RkYsCisgICAgICAweDA0LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMSwweDAwLDB4MDAsMHgwMCwweDA0LDB4MDAsMHgwMCwweDAwLDB4NDQsMHhFNywweEZGLDB4RkYsCiAgICAgICAweDEwLDB4MDAsMHgwMCwweDAwLDB4MDQsMHgwMCwweDAwLDB4MDAsMHgwMiwweDAwLDB4MDAsMHgwMCwweDMzLDB4MzUsMHgwMCwweDAwLDB4MDIsMHgwMCwweDAwLDB4MDAsCiAgICAgICAweDY5LDB4NjQsMHgwMCwweDAwLDB4MTQsMHhGMywweEZGLDB4RkYsMHgwMCwweDAwLDB4MEUsMHgwRiwweDAyLDB4MDAsMHgwMCwweDAwLDB4MDQsMHgwMCwweDAwLDB4MDAsCiAgICAgICAweDE1LDB4MDAsMHgwMCwweDAwLDB4NzYsMHg2NSwweDYzLDB4NzQsMHg2RiwweDcyLDB4NUYsMHg2RiwweDY2LDB4NUYsMHg3MiwweDY1LDB4NjYsMHg2NSwweDcyLDB4NzIsCiAgICAgICAweDYxLDB4NjIsMHg2QywweDY1LDB4NzMsMHgwMCwweDAwLDB4MDAsMHhDQywweEYxLDB4RkYsMHhGRiwweDAwLDB4MDAsMHgwMCwweDAxLDB4MjIsMHgwMCwweDQ4LDB4MDAsCiAgICAgICAweDQ4LDB4MDAsMHgwMCwweDAwLDB4MzQsMHgwMCwweDAwLDB4MDAsMHgwQywweDAwLDB4MDAsMHgwMCwweDA0LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCi0gICAgICAweDAxLDB4MDAsMHgwMCwweDAwLDB4MDQsMHgwMCwweDAwLDB4MDAsMHgzQywweEU4LDB4RkYsMHhGRiwweDEwLDB4MDAsMHgwMCwweDAwLDB4MDQsMHgwMCwweDAwLDB4MDAsCi0gICAgICAweDAyLDB4MDAsMHgwMCwweDAwLDB4MzMsMHgzNCwweDAwLDB4MDAsMHgwMiwweDAwLDB4MDAsMHgwMCwweDY5LDB4NjQsMHgwMCwweDAwLDB4MDQsMHhFNSwweEZGLDB4RkYsCi0gICAgICAweDAwLDB4MDAsMHgwMCwweDBGLDB4MEEsMHgwMCwweDAwLDB4MDAsMHgwMSwweDAwLDB4MDAsMHgwMCwweDE1LDB4MDAsMHgwMCwweDAwLDB4NzAsMHg2MSwweDcyLDB4NjUsCisgICAgICAweDAxLDB4MDAsMHgwMCwweDAwLDB4MDQsMHgwMCwweDAwLDB4MDAsMHhCNCwweEU3LDB4RkYsMHhGRiwweDEwLDB4MDAsMHgwMCwweDAwLDB4MDQsMHgwMCwweDAwLDB4MDAsCisgICAgICAweDAyLDB4MDAsMHgwMCwweDAwLDB4MzMsMHgzNCwweDAwLDB4MDAsMHgwMiwweDAwLDB4MDAsMHgwMCwweDY5LDB4NjQsMHgwMCwweDAwLDB4N0MsMHhFNCwweEZGLDB4RkYsCisgICAgICAweDAwLDB4MDAsMHgwMCwweDBGLDB4MEIsMHgwMCwweDAwLDB4MDAsMHgwMSwweDAwLDB4MDAsMHgwMCwweDE1LDB4MDAsMHgwMCwweDAwLDB4NzAsMHg2MSwweDcyLDB4NjUsCiAgICAgICAweDZFLDB4NzQsMHg1RiwweDZFLDB4NjEsMHg2RCwweDY1LDB4NzMsMHg3MCwweDYxLDB4NjMsMHg2NSwweDVGLDB4NzQsMHg2NSwweDczLDB4NzQsMHgwMCwweDAwLDB4MDAsCiAgICAgICAweDNDLDB4RjIsMHhGRiwweEZGLDB4MDAsMHgwMCwweDAwLDB4MDEsMHgyMSwweDAwLDB4NDYsMHgwMCwweDQ0LDB4MDAsMHgwMCwweDAwLDB4MzQsMHgwMCwweDAwLDB4MDAsCiAgICAgICAweDBDLDB4MDAsMHgwMCwweDAwLDB4MDQsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAxLDB4MDAsMHgwMCwweDAwLDB4MDQsMHgwMCwweDAwLDB4MDAsCi0gICAgICAweEFDLDB4RTgsMHhGRiwweEZGLDB4MTAsMHgwMCwweDAwLDB4MDAsMHgwNCwweDAwLDB4MDAsMHgwMCwweDAyLDB4MDAsMHgwMCwweDAwLDB4MzMsMHgzMywweDAwLDB4MDAsCisgICAgICAweDI0LDB4RTgsMHhGRiwweEZGLDB4MTAsMHgwMCwweDAwLDB4MDAsMHgwNCwweDAwLDB4MDAsMHgwMCwweDAyLDB4MDAsMHgwMCwweDAwLDB4MzMsMHgzMywweDAwLDB4MDAsCiAgICAgICAweDAyLDB4MDAsMHgwMCwweDAwLDB4NjksMHg2NCwweDAwLDB4MDAsMHgyMCwweEYyLDB4RkYsMHhGRiwweDAwLDB4MDAsMHgwRSwweDBDLDB4MDgsMHgwMCwweDAwLDB4MDAsCiAgICAgICAweDExLDB4MDAsMHgwMCwweDAwLDB4NzYsMHg2NSwweDYzLDB4NzQsMHg2RiwweDcyLDB4NUYsMHg2RiwweDY2LDB4NUYsMHg2NCwweDZGLDB4NzUsMHg2MiwweDZDLDB4NjUsCiAgICAgICAweDczLDB4MDAsMHgwMCwweDAwLDB4QTQsMHhGMiwweEZGLDB4RkYsMHgwMCwweDAwLDB4MDAsMHgwMSwweDIwLDB4MDAsMHg0NCwweDAwLDB4NDQsMHgwMCwweDAwLDB4MDAsCiAgICAgICAweDM0LDB4MDAsMHgwMCwweDAwLDB4MEMsMHgwMCwweDAwLDB4MDAsMHgwNCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDEsMHgwMCwweDAwLDB4MDAsCi0gICAgICAweDA0LDB4MDAsMHgwMCwweDAwLDB4MTQsMHhFOSwweEZGLDB4RkYsMHgxMCwweDAwLDB4MDAsMHgwMCwweDA0LDB4MDAsMHgwMCwweDAwLDB4MDIsMHgwMCwweDAwLDB4MDAsCisgICAgICAweDA0LDB4MDAsMHgwMCwweDAwLDB4OEMsMHhFOCwweEZGLDB4RkYsMHgxMCwweDAwLDB4MDAsMHgwMCwweDA0LDB4MDAsMHgwMCwweDAwLDB4MDIsMHgwMCwweDAwLDB4MDAsCiAgICAgICAweDMzLDB4MzIsMHgwMCwweDAwLDB4MDIsMHgwMCwweDAwLDB4MDAsMHg2OSwweDY0LDB4MDAsMHgwMCwweDg4LDB4RjIsMHhGRiwweEZGLDB4MDAsMHgwMCwweDBFLDB4MDksCiAgICAgICAweDA4LDB4MDAsMHgwMCwweDAwLDB4MEYsMHgwMCwweDAwLDB4MDAsMHg3NiwweDY1LDB4NjMsMHg3NCwweDZGLDB4NzIsMHg1RiwweDZGLDB4NjYsMHg1RiwweDZDLDB4NkYsCiAgICAgICAweDZFLDB4NjcsMHg3MywweDAwLDB4MDgsMHhGMywweEZGLDB4RkYsMHgwMCwweDAwLDB4MDAsMHgwMSwweDFGLDB4MDAsMHg0MiwweDAwLDB4NDgsMHgwMCwweDAwLDB4MDAsCiAgICAgICAweDM0LDB4MDAsMHgwMCwweDAwLDB4MEMsMHgwMCwweDAwLDB4MDAsMHgwNCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDEsMHgwMCwweDAwLDB4MDAsCi0gICAgICAweDA0LDB4MDAsMHgwMCwweDAwLDB4NzgsMHhFOSwweEZGLDB4RkYsMHgxMCwweDAwLDB4MDAsMHgwMCwweDA0LDB4MDAsMHgwMCwweDAwLDB4MDIsMHgwMCwweDAwLDB4MDAsCisgICAgICAweDA0LDB4MDAsMHgwMCwweDAwLDB4RjAsMHhFOCwweEZGLDB4RkYsMHgxMCwweDAwLDB4MDAsMHgwMCwweDA0LDB4MDAsMHgwMCwweDAwLDB4MDIsMHgwMCwweDAwLDB4MDAsCiAgICAgICAweDMzLDB4MzEsMHgwMCwweDAwLDB4MDIsMHgwMCwweDAwLDB4MDAsMHg2OSwweDY0LDB4MDAsMHgwMCwweEMwLDB4RjQsMHhGRiwweEZGLDB4MDAsMHgwMCwweDBFLDB4MEYsCi0gICAgICAweDA1LDB4MDAsMHgwMCwweDAwLDB4MDQsMHgwMCwweDAwLDB4MDAsMHgwNSwweDAwLDB4MDAsMHgwMCwweDc0LDB4NjUsMHg3MywweDc0LDB4MzUsMHgwMCwweDAwLDB4MDAsCisgICAgICAweDA2LDB4MDAsMHgwMCwweDAwLDB4MDQsMHgwMCwweDAwLDB4MDAsMHgwNSwweDAwLDB4MDAsMHgwMCwweDc0LDB4NjUsMHg3MywweDc0LDB4MzUsMHgwMCwweDAwLDB4MDAsCiAgICAgICAweDY4LDB4RjMsMHhGRiwweEZGLDB4MDAsMHgwMCwweDAwLDB4MDEsMHgxRSwweDAwLDB4NDAsMHgwMCwweDZDLDB4MDAsMHgwMCwweDAwLDB4NUMsMHgwMCwweDAwLDB4MDAsCiAgICAgICAweDBDLDB4MDAsMHgwMCwweDAwLDB4MDQsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAyLDB4MDAsMHgwMCwweDAwLDB4MjQsMHgwMCwweDAwLDB4MDAsCi0gICAgICAweDA0LDB4MDAsMHgwMCwweDAwLDB4REMsMHhFOSwweEZGLDB4RkYsMHgxMCwweDAwLDB4MDAsMHgwMCwweDA0LDB4MDAsMHgwMCwweDAwLDB4MDIsMHgwMCwweDAwLDB4MDAsCi0gICAgICAweDMzLDB4MzAsMHgwMCwweDAwLDB4MDIsMHgwMCwweDAwLDB4MDAsMHg2OSwweDY0LDB4MDAsMHgwMCwweEY4LDB4RTksMHhGRiwweEZGLDB4MTAsMHgwMCwweDAwLDB4MDAsCisgICAgICAweDA0LDB4MDAsMHgwMCwweDAwLDB4NTQsMHhFOSwweEZGLDB4RkYsMHgxMCwweDAwLDB4MDAsMHgwMCwweDA0LDB4MDAsMHgwMCwweDAwLDB4MDIsMHgwMCwweDAwLDB4MDAsCisgICAgICAweDMzLDB4MzAsMHgwMCwweDAwLDB4MDIsMHgwMCwweDAwLDB4MDAsMHg2OSwweDY0LDB4MDAsMHgwMCwweDcwLDB4RTksMHhGRiwweEZGLDB4MTAsMHgwMCwweDAwLDB4MDAsCiAgICAgICAweDA0LDB4MDAsMHgwMCwweDAwLDB4MDEsMHgwMCwweDAwLDB4MDAsMHgzMCwweDAwLDB4MDAsMHgwMCwweDBBLDB4MDAsMHgwMCwweDAwLDB4NjYsMHg2QywweDY1LDB4NzgsCiAgICAgICAweDYyLDB4NzUsMHg2NiwweDY2LDB4NjUsMHg3MiwweDAwLDB4MDAsMHg3NCwweEYzLDB4RkYsMHhGRiwweDAwLDB4MDAsMHgwRSwweDA0LDB4MDEsMHgwMCwweDAwLDB4MDAsCiAgICAgICAweDA0LDB4MDAsMHgwMCwweDAwLDB4NjYsMHg2QywweDY1LDB4NzgsMHgwMCwweDAwLDB4MDAsMHgwMCwweEVDLDB4RjMsMHhGRiwweEZGLDB4MDAsMHgwMCwweDAwLDB4MDEsCiAgICAgICAweDFELDB4MDAsMHgzRSwweDAwLDB4NDgsMHgwMCwweDAwLDB4MDAsMHgzNCwweDAwLDB4MDAsMHgwMCwweDBDLDB4MDAsMHgwMCwweDAwLDB4MDQsMHgwMCwweDAwLDB4MDAsCi0gICAgICAweDAwLDB4MDAsMHgwMCwweDAwLDB4MDEsMHgwMCwweDAwLDB4MDAsMHgwNCwweDAwLDB4MDAsMHgwMCwweDVDLDB4RUEsMHhGRiwweEZGLDB4MTAsMHgwMCwweDAwLDB4MDAsCisgICAgICAweDAwLDB4MDAsMHgwMCwweDAwLDB4MDEsMHgwMCwweDAwLDB4MDAsMHgwNCwweDAwLDB4MDAsMHgwMCwweEQ0LDB4RTksMHhGRiwweEZGLDB4MTAsMHgwMCwweDAwLDB4MDAsCiAgICAgICAweDA0LDB4MDAsMHgwMCwweDAwLDB4MDIsMHgwMCwweDAwLDB4MDAsMHgzMiwweDM5LDB4MDAsMHgwMCwweDAyLDB4MDAsMHgwMCwweDAwLDB4NjksMHg2NCwweDAwLDB4MDAsCiAgICAgICAweEE0LDB4RjUsMHhGRiwweEZGLDB4MDAsMHgwMCwweDBFLDB4MEYsMHgwMCwweDAwLDB4MDAsMHgwMCwweDA0LDB4MDAsMHgwMCwweDAwLDB4MTcsMHgwMCwweDAwLDB4MDAsCiAgICAgICAweDc0LDB4NjUsMHg3MywweDc0LDB4NjEsMHg3MiwweDcyLDB4NjEsMHg3OSwweDZGLDB4NjYsMHg3MywweDZGLDB4NzIsMHg3NCwweDY1LDB4NjQsMHg3MywweDc0LDB4NzIsCiAgICAgICAweDc1LDB4NjMsMHg3NCwweDAwLDB4NUMsMHhGNCwweEZGLDB4RkYsMHgwMCwweDAwLDB4MDAsMHgwMSwweDFDLDB4MDAsMHgzQywweDAwLDB4NDQsMHgwMCwweDAwLDB4MDAsCiAgICAgICAweDM0LDB4MDAsMHgwMCwweDAwLDB4MEMsMHgwMCwweDAwLDB4MDAsMHgwNCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDEsMHgwMCwweDAwLDB4MDAsCi0gICAgICAweDA0LDB4MDAsMHgwMCwweDAwLDB4Q0MsMHhFQSwweEZGLDB4RkYsMHgxMCwweDAwLDB4MDAsMHgwMCwweDA0LDB4MDAsMHgwMCwweDAwLDB4MDIsMHgwMCwweDAwLDB4MDAsCisgICAgICAweDA0LDB4MDAsMHgwMCwweDAwLDB4NDQsMHhFQSwweEZGLDB4RkYsMHgxMCwweDAwLDB4MDAsMHgwMCwweDA0LDB4MDAsMHgwMCwweDAwLDB4MDIsMHgwMCwweDAwLDB4MDAsCiAgICAgICAweDMyLDB4MzgsMHgwMCwweDAwLDB4MDIsMHgwMCwweDAwLDB4MDAsMHg2OSwweDY0LDB4MDAsMHgwMCwweDQwLDB4RjQsMHhGRiwweEZGLDB4MDAsMHgwMCwweDBFLDB4MEQsCiAgICAgICAweDA0LDB4MDAsMHgwMCwweDAwLDB4MTIsMHgwMCwweDAwLDB4MDAsMHg3NCwweDY1LDB4NzMsMHg3NCwweDYxLDB4NzIsMHg3MiwweDYxLDB4NzksMHg2RiwweDY2LDB4NzMsCiAgICAgICAweDc0LDB4NzIsMHg2OSwweDZFLDB4NjcsMHgzMiwweDAwLDB4MDAsMHhBRSwweEY1LDB4RkYsMHhGRiwweDFCLDB4MDAsMHgzQSwweDAwLDB4NDQsMHgwMCwweDAwLDB4MDAsCiAgICAgICAweDM0LDB4MDAsMHgwMCwweDAwLDB4MEMsMHgwMCwweDAwLDB4MDAsMHgwNCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDEsMHgwMCwweDAwLDB4MDAsCi0gICAgICAweDA0LDB4MDAsMHgwMCwweDAwLDB4MzAsMHhFQiwweEZGLDB4RkYsMHgxMCwweDAwLDB4MDAsMHgwMCwweDA0LDB4MDAsMHgwMCwweDAwLDB4MDIsMHgwMCwweDAwLDB4MDAsCi0gICAgICAweDMyLDB4MzcsMHgwMCwweDAwLDB4MDIsMHgwMCwweDAwLDB4MDAsMHg2OSwweDY0LDB4MDAsMHgwMCwweDE0LDB4RTcsMHhGRiwweEZGLDB4MDAsMHgwMCwweDAwLDB4MEIsCisgICAgICAweDA0LDB4MDAsMHgwMCwweDAwLDB4QTgsMHhFQSwweEZGLDB4RkYsMHgxMCwweDAwLDB4MDAsMHgwMCwweDA0LDB4MDAsMHgwMCwweDAwLDB4MDIsMHgwMCwweDAwLDB4MDAsCisgICAgICAweDMyLDB4MzcsMHgwMCwweDAwLDB4MDIsMHgwMCwweDAwLDB4MDAsMHg2OSwweDY0LDB4MDAsMHgwMCwweDhDLDB4RTYsMHhGRiwweEZGLDB4MDAsMHgwMCwweDAwLDB4MEIsCiAgICAgICAweDAxLDB4MDAsMHgwMCwweDAwLDB4MDYsMHgwMCwweDAwLDB4MDAsMHg3NCwweDY1LDB4NzMsMHg3NCwweDY2LDB4MzMsMHgwMCwweDAwLDB4OUEsMHhGRiwweEZGLDB4RkYsCiAgICAgICAweDFBLDB4MDAsMHgzOCwweDAwLDB4NTAsMHgwMCwweDAwLDB4MDAsMHg0MCwweDAwLDB4MDAsMHgwMCwweDE4LDB4MDAsMHgwMCwweDAwLDB4MTAsMHgwMCwweDAwLDB4MDAsCiAgICAgICAweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDA4LDB4NDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDEsMHgwMCwweDAwLDB4MDAsCi0gICAgICAweDA0LDB4MDAsMHgwMCwweDAwLDB4OTQsMHhFQiwweEZGLDB4RkYsMHgxMCwweDAwLDB4MDAsMHgwMCwweDA0LDB4MDAsMHgwMCwweDAwLDB4MDIsMHgwMCwweDAwLDB4MDAsCi0gICAgICAweDMyLDB4MzYsMHgwMCwweDAwLDB4MDIsMHgwMCwweDAwLDB4MDAsMHg2OSwweDY0LDB4MDAsMHgwMCwweDc4LDB4RTcsMHhGRiwweEZGLDB4MDAsMHgwMCwweDAwLDB4MEIsCisgICAgICAweDA0LDB4MDAsMHgwMCwweDAwLDB4MEMsMHhFQiwweEZGLDB4RkYsMHgxMCwweDAwLDB4MDAsMHgwMCwweDA0LDB4MDAsMHgwMCwweDAwLDB4MDIsMHgwMCwweDAwLDB4MDAsCisgICAgICAweDMyLDB4MzYsMHgwMCwweDAwLDB4MDIsMHgwMCwweDAwLDB4MDAsMHg2OSwweDY0LDB4MDAsMHgwMCwweEYwLDB4RTYsMHhGRiwweEZGLDB4MDAsMHgwMCwweDAwLDB4MEIsCiAgICAgICAweDAxLDB4MDAsMHgwMCwweDAwLDB4MDYsMHgwMCwweDAwLDB4MDAsMHg3NCwweDY1LDB4NzMsMHg3NCwweDY2LDB4MzIsMHgwMCwweDAwLDB4MDAsMHgwMCwweDFBLDB4MDAsCiAgICAgICAweDI0LDB4MDAsMHgwOCwweDAwLDB4MEMsMHgwMCwweDA0LDB4MDAsMHgwNiwweDAwLDB4MDAsMHgwMCwweDE4LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCiAgICAgICAweDEwLDB4MDAsMHgxNCwweDAwLDB4MUEsMHgwMCwweDAwLDB4MDAsMHgxOSwweDAwLDB4MzYsMHgwMCwweDUwLDB4MDAsMHgwMCwweDAwLDB4NDAsMHgwMCwweDAwLDB4MDAsCiAgICAgICAweDE4LDB4MDAsMHgwMCwweDAwLDB4MTAsMHgwMCwweDAwLDB4MDAsMHg2RSwweDg2LDB4MUIsMHhGMCwweEY5LDB4MjEsMHgwOSwweDQwLDB4MDAsMHgwMCwweDAwLDB4MDAsCi0gICAgICAweDAwLDB4MDAsMHgwMCwweDAwLDB4MDEsMHgwMCwweDAwLDB4MDAsMHgwNCwweDAwLDB4MDAsMHgwMCwweDE0LDB4RUMsMHhGRiwweEZGLDB4MTAsMHgwMCwweDAwLDB4MDAsCisgICAgICAweDAwLDB4MDAsMHgwMCwweDAwLDB4MDEsMHgwMCwweDAwLDB4MDAsMHgwNCwweDAwLDB4MDAsMHgwMCwweDhDLDB4RUIsMHhGRiwweEZGLDB4MTAsMHgwMCwweDAwLDB4MDAsCiAgICAgICAweDA0LDB4MDAsMHgwMCwweDAwLDB4MDIsMHgwMCwweDAwLDB4MDAsMHgzMiwweDM1LDB4MDAsMHgwMCwweDAyLDB4MDAsMHgwMCwweDAwLDB4NjksMHg2NCwweDAwLDB4MDAsCi0gICAgICAweEY4LDB4RTcsMHhGRiwweEZGLDB4MDAsMHgwMCwweDAwLDB4MEIsMHgwMSwweDAwLDB4MDAsMHgwMCwweDA1LDB4MDAsMHgwMCwweDAwLDB4NzQsMHg2NSwweDczLDB4NzQsCisgICAgICAweDcwLDB4RTcsMHhGRiwweEZGLDB4MDAsMHgwMCwweDAwLDB4MEIsMHgwMSwweDAwLDB4MDAsMHgwMCwweDA1LDB4MDAsMHgwMCwweDAwLDB4NzQsMHg2NSwweDczLDB4NzQsCiAgICAgICAweDY2LDB4MDAsMHgwMCwweDAwLDB4MDAsMHhGNiwweEZGLDB4RkYsMHgwMCwweDAwLDB4MDAsMHgwMSwweDE4LDB4MDAsMHgzNCwweDAwLDB4NDQsMHgwMCwweDAwLDB4MDAsCiAgICAgICAweDM0LDB4MDAsMHgwMCwweDAwLDB4MEMsMHgwMCwweDAwLDB4MDAsMHgwNCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDEsMHgwMCwweDAwLDB4MDAsCi0gICAgICAweDA0LDB4MDAsMHgwMCwweDAwLDB4NzAsMHhFQywweEZGLDB4RkYsMHgxMCwweDAwLDB4MDAsMHgwMCwweDA0LDB4MDAsMHgwMCwweDAwLDB4MDIsMHgwMCwweDAwLDB4MDAsCisgICAgICAweDA0LDB4MDAsMHgwMCwweDAwLDB4RTgsMHhFQiwweEZGLDB4RkYsMHgxMCwweDAwLDB4MDAsMHgwMCwweDA0LDB4MDAsMHgwMCwweDAwLDB4MDIsMHgwMCwweDAwLDB4MDAsCiAgICAgICAweDMyLDB4MzQsMHgwMCwweDAwLDB4MDIsMHgwMCwweDAwLDB4MDAsMHg2OSwweDY0LDB4MDAsMHgwMCwweEU0LDB4RjUsMHhGRiwweEZGLDB4MDAsMHgwMCwweDBFLDB4MDIsCiAgICAgICAweDAxLDB4MDAsMHgwMCwweDAwLDB4MTAsMHgwMCwweDAwLDB4MDAsMHg3NCwweDY1LDB4NzMsMHg3NCwweDYxLDB4NzIsMHg3MiwweDYxLDB4NzksMHg2RiwweDY2LDB4NjIsCiAgICAgICAweDZGLDB4NkYsMHg2QywweDczLDB4MDAsMHgwMCwweDAwLDB4MDAsMHg1MiwweEY3LDB4RkYsMHhGRiwweDE3LDB4MDAsMHgzMiwweDAwLDB4NzQsMHgwMCwweDAwLDB4MDAsCiAgICAgICAweDYwLDB4MDAsMHgwMCwweDAwLDB4MEMsMHgwMCwweDAwLDB4MDAsMHgwNCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDIsMHgwMCwweDAwLDB4MDAsCi0gICAgICAweDI0LDB4MDAsMHgwMCwweDAwLDB4MDQsMHgwMCwweDAwLDB4MDAsMHhEOCwweEVDLDB4RkYsMHhGRiwweDEwLDB4MDAsMHgwMCwweDAwLDB4MDQsMHgwMCwweDAwLDB4MDAsCi0gICAgICAweDAyLDB4MDAsMHgwMCwweDAwLDB4MzIsMHgzMywweDAwLDB4MDAsMHgwMiwweDAwLDB4MDAsMHgwMCwweDY5LDB4NjQsMHgwMCwweDAwLDB4RjQsMHhFQywweEZGLDB4RkYsCisgICAgICAweDI0LDB4MDAsMHgwMCwweDAwLDB4MDQsMHgwMCwweDAwLDB4MDAsMHg1MCwweEVDLDB4RkYsMHhGRiwweDEwLDB4MDAsMHgwMCwweDAwLDB4MDQsMHgwMCwweDAwLDB4MDAsCisgICAgICAweDAyLDB4MDAsMHgwMCwweDAwLDB4MzIsMHgzMywweDAwLDB4MDAsMHgwMiwweDAwLDB4MDAsMHgwMCwweDY5LDB4NjQsMHgwMCwweDAwLDB4NkMsMHhFQywweEZGLDB4RkYsCiAgICAgICAweDE4LDB4MDAsMHgwMCwweDAwLDB4MDQsMHgwMCwweDAwLDB4MDAsMHgwOCwweDAwLDB4MDAsMHgwMCwweDY2LDB4NkUsMHg3NiwweDMxLDB4NjEsMHg1RiwweDM2LDB4MzQsCi0gICAgICAweDAwLDB4MDAsMHgwMCwweDAwLDB4MDQsMHgwMCwweDAwLDB4MDAsMHg2OCwweDYxLDB4NzMsMHg2OCwweDAwLDB4MDAsMHgwMCwweDAwLDB4OUMsMHhFQiwweEZGLDB4RkYsCisgICAgICAweDAwLDB4MDAsMHgwMCwweDAwLDB4MDQsMHgwMCwweDAwLDB4MDAsMHg2OCwweDYxLDB4NzMsMHg2OCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MTQsMHhFQiwweEZGLDB4RkYsCiAgICAgICAweDAwLDB4MDAsMHgwMCwweDBBLDB4MDgsMHgwMCwweDAwLDB4MDAsMHgwMSwweDAwLDB4MDAsMHgwMCwweDExLDB4MDAsMHgwMCwweDAwLDB4NzQsMHg2NSwweDczLDB4NzQsCiAgICAgICAweDY4LDB4NjEsMHg3MywweDY4LDB4NzUsMHgzNiwweDM0LDB4NUYsMHg2NiwweDZFLDB4NzYsMHgzMSwweDYxLDB4MDAsMHgwMCwweDAwLDB4RTYsMHhGNywweEZGLDB4RkYsCiAgICAgICAweDE2LDB4MDAsMHgzMCwweDAwLDB4NzQsMHgwMCwweDAwLDB4MDAsMHg2MCwweDAwLDB4MDAsMHgwMCwweDBDLDB4MDAsMHgwMCwweDAwLDB4MDQsMHgwMCwweDAwLDB4MDAsCi0gICAgICAweDAwLDB4MDAsMHgwMCwweDAwLDB4MDIsMHgwMCwweDAwLDB4MDAsMHgyNCwweDAwLDB4MDAsMHgwMCwweDA0LDB4MDAsMHgwMCwweDAwLDB4NkMsMHhFRCwweEZGLDB4RkYsCisgICAgICAweDAwLDB4MDAsMHgwMCwweDAwLDB4MDIsMHgwMCwweDAwLDB4MDAsMHgyNCwweDAwLDB4MDAsMHgwMCwweDA0LDB4MDAsMHgwMCwweDAwLDB4RTQsMHhFQywweEZGLDB4RkYsCiAgICAgICAweDEwLDB4MDAsMHgwMCwweDAwLDB4MDQsMHgwMCwweDAwLDB4MDAsMHgwMiwweDAwLDB4MDAsMHgwMCwweDMyLDB4MzIsMHgwMCwweDAwLDB4MDIsMHgwMCwweDAwLDB4MDAsCi0gICAgICAweDY5LDB4NjQsMHgwMCwweDAwLDB4ODgsMHhFRCwweEZGLDB4RkYsMHgxOCwweDAwLDB4MDAsMHgwMCwweDA0LDB4MDAsMHgwMCwweDAwLDB4MDgsMHgwMCwweDAwLDB4MDAsCisgICAgICAweDY5LDB4NjQsMHgwMCwweDAwLDB4MDAsMHhFRCwweEZGLDB4RkYsMHgxOCwweDAwLDB4MDAsMHgwMCwweDA0LDB4MDAsMHgwMCwweDAwLDB4MDgsMHgwMCwweDAwLDB4MDAsCiAgICAgICAweDY2LDB4NkUsMHg3NiwweDMxLDB4NjEsMHg1RiwweDM2LDB4MzQsMHgwMCwweDAwLDB4MDAsMHgwMCwweDA0LDB4MDAsMHgwMCwweDAwLDB4NjgsMHg2MSwweDczLDB4NjgsCi0gICAgICAweDAwLDB4MDAsMHgwMCwweDAwLDB4MzAsMHhFQywweEZGLDB4RkYsMHgwMCwweDAwLDB4MDAsMHgwOSwweDA4LDB4MDAsMHgwMCwweDAwLDB4MDEsMHgwMCwweDAwLDB4MDAsCisgICAgICAweDAwLDB4MDAsMHgwMCwweDAwLDB4QTgsMHhFQiwweEZGLDB4RkYsMHgwMCwweDAwLDB4MDAsMHgwOSwweDA4LDB4MDAsMHgwMCwweDAwLDB4MDEsMHgwMCwweDAwLDB4MDAsCiAgICAgICAweDExLDB4MDAsMHgwMCwweDAwLDB4NzQsMHg2NSwweDczLDB4NzQsMHg2OCwweDYxLDB4NzMsMHg2OCwweDczLDB4MzYsMHgzNCwweDVGLDB4NjYsMHg2RSwweDc2LDB4MzEsCiAgICAgICAweDYxLDB4MDAsMHgwMCwweDAwLDB4N0EsMHhGOCwweEZGLDB4RkYsMHgxNSwweDAwLDB4MkUsMHgwMCwweENDLDB4MDAsMHgwMCwweDAwLDB4QkMsMHgwMCwweDAwLDB4MDAsCiAgICAgICAweDBDLDB4MDAsMHgwMCwweDAwLDB4MDQsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDA0LDB4MDAsMHgwMCwweDAwLDB4N0MsMHgwMCwweDAwLDB4MDAsCi0gICAgICAweDUwLDB4MDAsMHgwMCwweDAwLDB4MjQsMHgwMCwweDAwLDB4MDAsMHgwNCwweDAwLDB4MDAsMHgwMCwweDA4LDB4RUUsMHhGRiwweEZGLDB4MTAsMHgwMCwweDAwLDB4MDAsCisgICAgICAweDUwLDB4MDAsMHgwMCwweDAwLDB4MjQsMHgwMCwweDAwLDB4MDAsMHgwNCwweDAwLDB4MDAsMHgwMCwweDgwLDB4RUQsMHhGRiwweEZGLDB4MTAsMHgwMCwweDAwLDB4MDAsCiAgICAgICAweDA0LDB4MDAsMHgwMCwweDAwLDB4MDIsMHgwMCwweDAwLDB4MDAsMHgzMiwweDMxLDB4MDAsMHgwMCwweDAyLDB4MDAsMHgwMCwweDAwLDB4NjksMHg2NCwweDAwLDB4MDAsCi0gICAgICAweDI0LDB4RUUsMHhGRiwweEZGLDB4MTgsMHgwMCwweDAwLDB4MDAsMHgwNCwweDAwLDB4MDAsMHgwMCwweDA4LDB4MDAsMHgwMCwweDAwLDB4NjYsMHg2RSwweDc2LDB4MzEsCisgICAgICAweDlDLDB4RUQsMHhGRiwweEZGLDB4MTgsMHgwMCwweDAwLDB4MDAsMHgwNCwweDAwLDB4MDAsMHgwMCwweDA4LDB4MDAsMHgwMCwweDAwLDB4NjYsMHg2RSwweDc2LDB4MzEsCiAgICAgICAweDYxLDB4NUYsMHgzMywweDMyLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwNCwweDAwLDB4MDAsMHgwMCwweDY4LDB4NjEsMHg3MywweDY4LDB4MDAsMHgwMCwweDAwLDB4MDAsCi0gICAgICAweDRDLDB4RUUsMHhGRiwweEZGLDB4MTQsMHgwMCwweDAwLDB4MDAsMHgwNCwweDAwLDB4MDAsMHgwMCwweDA0LDB4MDAsMHgwMCwweDAwLDB4NTMsMHg3NCwweDYxLDB4NzQsCisgICAgICAweEM0LDB4RUQsMHhGRiwweEZGLDB4MTQsMHgwMCwweDAwLDB4MDAsMHgwNCwweDAwLDB4MDAsMHgwMCwweDA0LDB4MDAsMHgwMCwweDAwLDB4NTMsMHg3NCwweDYxLDB4NzQsCiAgICAgICAweDAwLDB4MDAsMHgwMCwweDAwLDB4MDgsMHgwMCwweDAwLDB4MDAsMHg2MywweDcwLDB4NzAsMHg1RiwweDc0LDB4NzksMHg3MCwweDY1LDB4MDAsMHgwMCwweDAwLDB4MDAsCi0gICAgICAweDc0LDB4RUUsMHhGRiwweEZGLDB4MTQsMHgwMCwweDAwLDB4MDAsMHgwNCwweDAwLDB4MDAsMHgwMCwweDA1LDB4MDAsMHgwMCwweDAwLDB4NkUsMHg2MSwweDZCLDB4NjUsCisgICAgICAweEVDLDB4RUQsMHhGRiwweEZGLDB4MTQsMHgwMCwweDAwLDB4MDAsMHgwNCwweDAwLDB4MDAsMHgwMCwweDA1LDB4MDAsMHgwMCwweDAwLDB4NkUsMHg2MSwweDZCLDB4NjUsCiAgICAgICAweDY0LDB4MDAsMHgwMCwweDAwLDB4MEMsMHgwMCwweDAwLDB4MDAsMHg2MywweDcwLDB4NzAsMHg1RiwweDcwLDB4NzQsMHg3MiwweDVGLDB4NzQsMHg3OSwweDcwLDB4NjUsCi0gICAgICAweDAwLDB4MDAsMHgwMCwweDAwLDB4NjgsMHhFQSwweEZGLDB4RkYsMHgwMCwweDAwLDB4MDAsMHgwOCwweDAxLDB4MDAsMHgwMCwweDAwLDB4MTEsMHgwMCwweDAwLDB4MDAsCisgICAgICAweDAwLDB4MDAsMHgwMCwweDAwLDB4RTAsMHhFOSwweEZGLDB4RkYsMHgwMCwweDAwLDB4MDAsMHgwOCwweDAxLDB4MDAsMHgwMCwweDAwLDB4MTEsMHgwMCwweDAwLDB4MDAsCiAgICAgICAweDc0LDB4NjUsMHg3MywweDc0LDB4NjgsMHg2MSwweDczLDB4NjgsMHg3NSwweDMzLDB4MzIsMHg1RiwweDY2LDB4NkUsMHg3NiwweDMxLDB4NjEsMHgwMCwweDAwLDB4MDAsCiAgICAgICAweDY2LDB4RjksMHhGRiwweEZGLDB4MTQsMHgwMCwweDJDLDB4MDAsMHg3MCwweDAwLDB4MDAsMHgwMCwweDYwLDB4MDAsMHgwMCwweDAwLDB4MEMsMHgwMCwweDAwLDB4MDAsCiAgICAgICAweDA0LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMiwweDAwLDB4MDAsMHgwMCwweDI0LDB4MDAsMHgwMCwweDAwLDB4MDQsMHgwMCwweDAwLDB4MDAsCi0gICAgICAweEVDLDB4RUUsMHhGRiwweEZGLDB4MTAsMHgwMCwweDAwLDB4MDAsMHgwNCwweDAwLDB4MDAsMHgwMCwweDAyLDB4MDAsMHgwMCwweDAwLDB4MzIsMHgzMCwweDAwLDB4MDAsCi0gICAgICAweDAyLDB4MDAsMHgwMCwweDAwLDB4NjksMHg2NCwweDAwLDB4MDAsMHgwOCwweEVGLDB4RkYsMHhGRiwweDE4LDB4MDAsMHgwMCwweDAwLDB4MDQsMHgwMCwweDAwLDB4MDAsCisgICAgICAweDY0LDB4RUUsMHhGRiwweEZGLDB4MTAsMHgwMCwweDAwLDB4MDAsMHgwNCwweDAwLDB4MDAsMHgwMCwweDAyLDB4MDAsMHgwMCwweDAwLDB4MzIsMHgzMCwweDAwLDB4MDAsCisgICAgICAweDAyLDB4MDAsMHgwMCwweDAwLDB4NjksMHg2NCwweDAwLDB4MDAsMHg4MCwweEVFLDB4RkYsMHhGRiwweDE4LDB4MDAsMHgwMCwweDAwLDB4MDQsMHgwMCwweDAwLDB4MDAsCiAgICAgICAweDA4LDB4MDAsMHgwMCwweDAwLDB4NjYsMHg2RSwweDc2LDB4MzEsMHg2MSwweDVGLDB4MzMsMHgzMiwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDQsMHgwMCwweDAwLDB4MDAsCi0gICAgICAweDY4LDB4NjEsMHg3MywweDY4LDB4MDAsMHgwMCwweDAwLDB4MDAsMHhGOCwweEVBLDB4RkYsMHhGRiwweDAwLDB4MDAsMHgwMCwweDA3LDB4MDEsMHgwMCwweDAwLDB4MDAsCisgICAgICAweDY4LDB4NjEsMHg3MywweDY4LDB4MDAsMHgwMCwweDAwLDB4MDAsMHg3MCwweEVBLDB4RkYsMHhGRiwweDAwLDB4MDAsMHgwMCwweDA3LDB4MDEsMHgwMCwweDAwLDB4MDAsCiAgICAgICAweDExLDB4MDAsMHgwMCwweDAwLDB4NzQsMHg2NSwweDczLDB4NzQsMHg2OCwweDYxLDB4NzMsMHg2OCwweDczLDB4MzMsMHgzMiwweDVGLDB4NjYsMHg2RSwweDc2LDB4MzEsCiAgICAgICAweDYxLDB4MDAsMHgwMCwweDAwLDB4RjYsMHhGOSwweEZGLDB4RkYsMHgxMywweDAwLDB4MkEsMHgwMCwweDcwLDB4MDAsMHgwMCwweDAwLDB4NUMsMHgwMCwweDAwLDB4MDAsCiAgICAgICAweDBDLDB4MDAsMHgwMCwweDAwLDB4MDQsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAyLDB4MDAsMHgwMCwweDAwLDB4MjQsMHgwMCwweDAwLDB4MDAsCi0gICAgICAweDA0LDB4MDAsMHgwMCwweDAwLDB4N0MsMHhFRiwweEZGLDB4RkYsMHgxMCwweDAwLDB4MDAsMHgwMCwweDA0LDB4MDAsMHgwMCwweDAwLDB4MDIsMHgwMCwweDAwLDB4MDAsCi0gICAgICAweDMxLDB4MzksMHgwMCwweDAwLDB4MDIsMHgwMCwweDAwLDB4MDAsMHg2OSwweDY0LDB4MDAsMHgwMCwweDk4LDB4RUYsMHhGRiwweEZGLDB4MTQsMHgwMCwweDAwLDB4MDAsCisgICAgICAweDA0LDB4MDAsMHgwMCwweDAwLDB4RjQsMHhFRSwweEZGLDB4RkYsMHgxMCwweDAwLDB4MDAsMHgwMCwweDA0LDB4MDAsMHgwMCwweDAwLDB4MDIsMHgwMCwweDAwLDB4MDAsCisgICAgICAweDMxLDB4MzksMHgwMCwweDAwLDB4MDIsMHgwMCwweDAwLDB4MDAsMHg2OSwweDY0LDB4MDAsMHgwMCwweDEwLDB4RUYsMHhGRiwweEZGLDB4MTQsMHgwMCwweDAwLDB4MDAsCiAgICAgICAweDA0LDB4MDAsMHgwMCwweDAwLDB4MDcsMHgwMCwweDAwLDB4MDAsMHg2NiwweDZFLDB4NzYsMHgzMSwweDVGLDB4MzYsMHgzNCwweDAwLDB4MDQsMHgwMCwweDAwLDB4MDAsCi0gICAgICAweDY4LDB4NjEsMHg3MywweDY4LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgzQywweEVFLDB4RkYsMHhGRiwweDAwLDB4MDAsMHgwMCwweDBBLDB4MDgsMHgwMCwweDAwLDB4MDAsCisgICAgICAweDY4LDB4NjEsMHg3MywweDY4LDB4MDAsMHgwMCwweDAwLDB4MDAsMHhCNCwweEVELDB4RkYsMHhGRiwweDAwLDB4MDAsMHgwMCwweDBBLDB4MDgsMHgwMCwweDAwLDB4MDAsCiAgICAgICAweDAxLDB4MDAsMHgwMCwweDAwLDB4MTAsMHgwMCwweDAwLDB4MDAsMHg3NCwweDY1LDB4NzMsMHg3NCwweDY4LDB4NjEsMHg3MywweDY4LDB4NzUsMHgzNiwweDM0LDB4NUYsCiAgICAgICAweDY2LDB4NkUsMHg3NiwweDMxLDB4MDAsMHgwMCwweDAwLDB4MDAsMHg4NiwweEZBLDB4RkYsMHhGRiwweDEyLDB4MDAsMHgyOCwweDAwLDB4NzAsMHgwMCwweDAwLDB4MDAsCiAgICAgICAweDVDLDB4MDAsMHgwMCwweDAwLDB4MEMsMHgwMCwweDAwLDB4MDAsMHgwNCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDIsMHgwMCwweDAwLDB4MDAsCi0gICAgICAweDI0LDB4MDAsMHgwMCwweDAwLDB4MDQsMHgwMCwweDAwLDB4MDAsMHgwQywweEYwLDB4RkYsMHhGRiwweDEwLDB4MDAsMHgwMCwweDAwLDB4MDQsMHgwMCwweDAwLDB4MDAsCi0gICAgICAweDAyLDB4MDAsMHgwMCwweDAwLDB4MzEsMHgzOCwweDAwLDB4MDAsMHgwMiwweDAwLDB4MDAsMHgwMCwweDY5LDB4NjQsMHgwMCwweDAwLDB4MjgsMHhGMCwweEZGLDB4RkYsCisgICAgICAweDI0LDB4MDAsMHgwMCwweDAwLDB4MDQsMHgwMCwweDAwLDB4MDAsMHg4NCwweEVGLDB4RkYsMHhGRiwweDEwLDB4MDAsMHgwMCwweDAwLDB4MDQsMHgwMCwweDAwLDB4MDAsCisgICAgICAweDAyLDB4MDAsMHgwMCwweDAwLDB4MzEsMHgzOCwweDAwLDB4MDAsMHgwMiwweDAwLDB4MDAsMHgwMCwweDY5LDB4NjQsMHgwMCwweDAwLDB4QTAsMHhFRiwweEZGLDB4RkYsCiAgICAgICAweDE0LDB4MDAsMHgwMCwweDAwLDB4MDQsMHgwMCwweDAwLDB4MDAsMHgwNywweDAwLDB4MDAsMHgwMCwweDY2LDB4NkUsMHg3NiwweDMxLDB4NUYsMHgzNiwweDM0LDB4MDAsCi0gICAgICAweDA0LDB4MDAsMHgwMCwweDAwLDB4NjgsMHg2MSwweDczLDB4NjgsMHgwMCwweDAwLDB4MDAsMHgwMCwweENDLDB4RUUsMHhGRiwweEZGLDB4MDAsMHgwMCwweDAwLDB4MDksCisgICAgICAweDA0LDB4MDAsMHgwMCwweDAwLDB4NjgsMHg2MSwweDczLDB4NjgsMHgwMCwweDAwLDB4MDAsMHgwMCwweDQ0LDB4RUUsMHhGRiwweEZGLDB4MDAsMHgwMCwweDAwLDB4MDksCiAgICAgICAweDA4LDB4MDAsMHgwMCwweDAwLDB4MDEsMHgwMCwweDAwLDB4MDAsMHgxMCwweDAwLDB4MDAsMHgwMCwweDc0LDB4NjUsMHg3MywweDc0LDB4NjgsMHg2MSwweDczLDB4NjgsCiAgICAgICAweDczLDB4MzYsMHgzNCwweDVGLDB4NjYsMHg2RSwweDc2LDB4MzEsMHgwMCwweDAwLDB4MDAsMHgwMCwweDE2LDB4RkIsMHhGRiwweEZGLDB4MTEsMHgwMCwweDI2LDB4MDAsCiAgICAgICAweDZDLDB4MDAsMHgwMCwweDAwLDB4NUMsMHgwMCwweDAwLDB4MDAsMHgwQywweDAwLDB4MDAsMHgwMCwweDA0LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCi0gICAgICAweDAyLDB4MDAsMHgwMCwweDAwLDB4MjQsMHgwMCwweDAwLDB4MDAsMHgwNCwweDAwLDB4MDAsMHgwMCwweDlDLDB4RjAsMHhGRiwweEZGLDB4MTAsMHgwMCwweDAwLDB4MDAsCisgICAgICAweDAyLDB4MDAsMHgwMCwweDAwLDB4MjQsMHgwMCwweDAwLDB4MDAsMHgwNCwweDAwLDB4MDAsMHgwMCwweDE0LDB4RjAsMHhGRiwweEZGLDB4MTAsMHgwMCwweDAwLDB4MDAsCiAgICAgICAweDA0LDB4MDAsMHgwMCwweDAwLDB4MDIsMHgwMCwweDAwLDB4MDAsMHgzMSwweDM3LDB4MDAsMHgwMCwweDAyLDB4MDAsMHgwMCwweDAwLDB4NjksMHg2NCwweDAwLDB4MDAsCi0gICAgICAweEI4LDB4RjAsMHhGRiwweEZGLDB4MTQsMHgwMCwweDAwLDB4MDAsMHgwNCwweDAwLDB4MDAsMHgwMCwweDA3LDB4MDAsMHgwMCwweDAwLDB4NjYsMHg2RSwweDc2LDB4MzEsCi0gICAgICAweDVGLDB4MzMsMHgzMiwweDAwLDB4MDQsMHgwMCwweDAwLDB4MDAsMHg2OCwweDYxLDB4NzMsMHg2OCwweDAwLDB4MDAsMHgwMCwweDAwLDB4QTQsMHhFQywweEZGLDB4RkYsCisgICAgICAweDMwLDB4RjAsMHhGRiwweEZGLDB4MTQsMHgwMCwweDAwLDB4MDAsMHgwNCwweDAwLDB4MDAsMHgwMCwweDA3LDB4MDAsMHgwMCwweDAwLDB4NjYsMHg2RSwweDc2LDB4MzEsCisgICAgICAweDVGLDB4MzMsMHgzMiwweDAwLDB4MDQsMHgwMCwweDAwLDB4MDAsMHg2OCwweDYxLDB4NzMsMHg2OCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MUMsMHhFQywweEZGLDB4RkYsCiAgICAgICAweDAwLDB4MDAsMHgwMCwweDA4LDB4MDEsMHgwMCwweDAwLDB4MDAsMHgxMCwweDAwLDB4MDAsMHgwMCwweDc0LDB4NjUsMHg3MywweDc0LDB4NjgsMHg2MSwweDczLDB4NjgsCiAgICAgICAweDc1LDB4MzMsMHgzMiwweDVGLDB4NjYsMHg2RSwweDc2LDB4MzEsMHgwMCwweDAwLDB4MDAsMHgwMCwweEEyLDB4RkIsMHhGRiwweEZGLDB4MTAsMHgwMCwweDI0LDB4MDAsCiAgICAgICAweDZDLDB4MDAsMHgwMCwweDAwLDB4NUMsMHgwMCwweDAwLDB4MDAsMHgwQywweDAwLDB4MDAsMHgwMCwweDA0LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCi0gICAgICAweDAyLDB4MDAsMHgwMCwweDAwLDB4MjQsMHgwMCwweDAwLDB4MDAsMHgwNCwweDAwLDB4MDAsMHgwMCwweDI4LDB4RjEsMHhGRiwweEZGLDB4MTAsMHgwMCwweDAwLDB4MDAsCisgICAgICAweDAyLDB4MDAsMHgwMCwweDAwLDB4MjQsMHgwMCwweDAwLDB4MDAsMHgwNCwweDAwLDB4MDAsMHgwMCwweEEwLDB4RjAsMHhGRiwweEZGLDB4MTAsMHgwMCwweDAwLDB4MDAsCiAgICAgICAweDA0LDB4MDAsMHgwMCwweDAwLDB4MDIsMHgwMCwweDAwLDB4MDAsMHgzMSwweDM2LDB4MDAsMHgwMCwweDAyLDB4MDAsMHgwMCwweDAwLDB4NjksMHg2NCwweDAwLDB4MDAsCi0gICAgICAweDQ0LDB4RjEsMHhGRiwweEZGLDB4MTQsMHgwMCwweDAwLDB4MDAsMHgwNCwweDAwLDB4MDAsMHgwMCwweDA3LDB4MDAsMHgwMCwweDAwLDB4NjYsMHg2RSwweDc2LDB4MzEsCi0gICAgICAweDVGLDB4MzMsMHgzMiwweDAwLDB4MDQsMHgwMCwweDAwLDB4MDAsMHg2OCwweDYxLDB4NzMsMHg2OCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MzAsMHhFRCwweEZGLDB4RkYsCisgICAgICAweEJDLDB4RjAsMHhGRiwweEZGLDB4MTQsMHgwMCwweDAwLDB4MDAsMHgwNCwweDAwLDB4MDAsMHgwMCwweDA3LDB4MDAsMHgwMCwweDAwLDB4NjYsMHg2RSwweDc2LDB4MzEsCisgICAgICAweDVGLDB4MzMsMHgzMiwweDAwLDB4MDQsMHgwMCwweDAwLDB4MDAsMHg2OCwweDYxLDB4NzMsMHg2OCwweDAwLDB4MDAsMHgwMCwweDAwLDB4QTgsMHhFQywweEZGLDB4RkYsCiAgICAgICAweDAwLDB4MDAsMHgwMCwweDA3LDB4MDEsMHgwMCwweDAwLDB4MDAsMHgxMCwweDAwLDB4MDAsMHgwMCwweDc0LDB4NjUsMHg3MywweDc0LDB4NjgsMHg2MSwweDczLDB4NjgsCiAgICAgICAweDczLDB4MzMsMHgzMiwweDVGLDB4NjYsMHg2RSwweDc2LDB4MzEsMHgwMCwweDAwLDB4MDAsMHgwMCwweDJFLDB4RkMsMHhGRiwweEZGLDB4MEYsMHgwMCwweDIyLDB4MDAsCiAgICAgICAweDQ4LDB4MDAsMHgwMCwweDAwLDB4MzQsMHgwMCwweDAwLDB4MDAsMHgwQywweDAwLDB4MDAsMHgwMCwweDA0LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCi0gICAgICAweDAxLDB4MDAsMHgwMCwweDAwLDB4MDQsMHgwMCwweDAwLDB4MDAsMHhCMCwweEYxLDB4RkYsMHhGRiwweDEwLDB4MDAsMHgwMCwweDAwLDB4MDQsMHgwMCwweDAwLDB4MDAsCi0gICAgICAweDAyLDB4MDAsMHgwMCwweDAwLDB4MzEsMHgzNSwweDAwLDB4MDAsMHgwMiwweDAwLDB4MDAsMHgwMCwweDY5LDB4NjQsMHgwMCwweDAwLDB4NEMsMHhGMCwweEZGLDB4RkYsCisgICAgICAweDAxLDB4MDAsMHgwMCwweDAwLDB4MDQsMHgwMCwweDAwLDB4MDAsMHgyOCwweEYxLDB4RkYsMHhGRiwweDEwLDB4MDAsMHgwMCwweDAwLDB4MDQsMHgwMCwweDAwLDB4MDAsCisgICAgICAweDAyLDB4MDAsMHgwMCwweDAwLDB4MzEsMHgzNSwweDAwLDB4MDAsMHgwMiwweDAwLDB4MDAsMHgwMCwweDY5LDB4NjQsMHgwMCwweDAwLDB4QzQsMHhFRiwweEZGLDB4RkYsCiAgICAgICAweDAwLDB4MDAsMHgwMCwweDAyLDB4MDEsMHgwMCwweDAwLDB4MDAsMHgwMSwweDAwLDB4MDAsMHgwMCwweDA4LDB4MDAsMHgwMCwweDAwLDB4NzQsMHg2NSwweDczLDB4NzQsCiAgICAgICAweDYyLDB4NkYsMHg2RiwweDZDLDB4MDAsMHgwMCwweDAwLDB4MDAsMHhBNCwweEZCLDB4RkYsMHhGRiwweDAwLDB4MDAsMHgwMCwweDAxLDB4MEUsMHgwMCwweDIwLDB4MDAsCiAgICAgICAweDQ4LDB4MDAsMHgwMCwweDAwLDB4MzQsMHgwMCwweDAwLDB4MDAsMHgwQywweDAwLDB4MDAsMHgwMCwweDA0LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCi0gICAgICAweDAxLDB4MDAsMHgwMCwweDAwLDB4MDQsMHgwMCwweDAwLDB4MDAsMHgxNCwweEYyLDB4RkYsMHhGRiwweDEwLDB4MDAsMHgwMCwweDAwLDB4MDQsMHgwMCwweDAwLDB4MDAsCi0gICAgICAweDAyLDB4MDAsMHgwMCwweDAwLDB4MzEsMHgzNCwweDAwLDB4MDAsMHgwMiwweDAwLDB4MDAsMHgwMCwweDY5LDB4NjQsMHgwMCwweDAwLDB4REMsMHhFRSwweEZGLDB4RkYsCisgICAgICAweDAxLDB4MDAsMHgwMCwweDAwLDB4MDQsMHgwMCwweDAwLDB4MDAsMHg4QywweEYxLDB4RkYsMHhGRiwweDEwLDB4MDAsMHgwMCwweDAwLDB4MDQsMHgwMCwweDAwLDB4MDAsCisgICAgICAweDAyLDB4MDAsMHgwMCwweDAwLDB4MzEsMHgzNCwweDAwLDB4MDAsMHgwMiwweDAwLDB4MDAsMHgwMCwweDY5LDB4NjQsMHgwMCwweDAwLDB4NTQsMHhFRSwweEZGLDB4RkYsCiAgICAgICAweDAwLDB4MDAsMHgwMCwweDBGLDB4MDMsMHgwMCwweDAwLDB4MDAsMHgwMSwweDAwLDB4MDAsMHgwMCwweDA5LDB4MDAsMHgwMCwweDAwLDB4NzQsMHg2NSwweDczLDB4NzQsCiAgICAgICAweDY1LDB4NkQsMHg3MCwweDc0LDB4NzksMHgwMCwweDAwLDB4MDAsMHgwOCwweEZDLDB4RkYsMHhGRiwweDAwLDB4MDAsMHgwMCwweDAxLDB4MEQsMHgwMCwweDFFLDB4MDAsCiAgICAgICAweDc4LDB4MDAsMHgwMCwweDAwLDB4NjgsMHgwMCwweDAwLDB4MDAsMHgwQywweDAwLDB4MDAsMHgwMCwweDA0LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCi0gICAgICAweDAyLDB4MDAsMHgwMCwweDAwLDB4MzgsMHgwMCwweDAwLDB4MDAsMHgwNCwweDAwLDB4MDAsMHgwMCwweDdDLDB4RjIsMHhGRiwweEZGLDB4MTQsMHgwMCwweDAwLDB4MDAsCisgICAgICAweDAyLDB4MDAsMHgwMCwweDAwLDB4MzgsMHgwMCwweDAwLDB4MDAsMHgwNCwweDAwLDB4MDAsMHgwMCwweEY0LDB4RjEsMHhGRiwweEZGLDB4MTQsMHgwMCwweDAwLDB4MDAsCiAgICAgICAweDA0LDB4MDAsMHgwMCwweDAwLDB4MDcsMHgwMCwweDAwLDB4MDAsMHg0RCwweDZGLDB4NkUsMHg3MywweDc0LDB4NjUsMHg3MiwweDAwLDB4MTEsMHgwMCwweDAwLDB4MDAsCiAgICAgICAweDZFLDB4NjUsMHg3MywweDc0LDB4NjUsMHg2NCwweDVGLDB4NjYsMHg2QywweDYxLDB4NzQsMHg2MiwweDc1LDB4NjYsMHg2NiwweDY1LDB4NzIsMHgwMCwweDAwLDB4MDAsCi0gICAgICAweEFDLDB4RjIsMHhGRiwweEZGLDB4MTAsMHgwMCwweDAwLDB4MDAsMHgwNCwweDAwLDB4MDAsMHgwMCwweDAyLDB4MDAsMHgwMCwweDAwLDB4MzEsMHgzMywweDAwLDB4MDAsCisgICAgICAweDI0LDB4RjIsMHhGRiwweEZGLDB4MTAsMHgwMCwweDAwLDB4MDAsMHgwNCwweDAwLDB4MDAsMHgwMCwweDAyLDB4MDAsMHgwMCwweDAwLDB4MzEsMHgzMywweDAwLDB4MDAsCiAgICAgICAweDAyLDB4MDAsMHgwMCwweDAwLDB4NjksMHg2NCwweDAwLDB4MDAsMHgyMCwweEZDLDB4RkYsMHhGRiwweDAwLDB4MDAsMHgwRSwweDA0LDB4MDEsMHgwMCwweDAwLDB4MDAsCiAgICAgICAweDE0LDB4MDAsMHgwMCwweDAwLDB4NzQsMHg2NSwweDczLDB4NzQsMHg2RSwweDY1LDB4NzMsMHg3NCwweDY1LDB4NjQsMHg2NiwweDZDLDB4NjEsMHg3NCwweDYyLDB4NzUsCiAgICAgICAweDY2LDB4NjYsMHg2NSwweDcyLDB4MDAsMHgwMCwweDAwLDB4MDAsMHhBOCwweEZDLDB4RkYsMHhGRiwweDAwLDB4MDAsMHgwMCwweDAxLDB4MEMsMHgwMCwweDFDLDB4MDAsCiAgICAgICAweDQ4LDB4MDAsMHgwMCwweDAwLDB4MzQsMHgwMCwweDAwLDB4MDAsMHgwQywweDAwLDB4MDAsMHgwMCwweDA0LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCi0gICAgICAweDAxLDB4MDAsMHgwMCwweDAwLDB4MDQsMHgwMCwweDAwLDB4MDAsMHgxOCwweEYzLDB4RkYsMHhGRiwweDEwLDB4MDAsMHgwMCwweDAwLDB4MDQsMHgwMCwweDAwLDB4MDAsCi0gICAgICAweDAyLDB4MDAsMHgwMCwweDAwLDB4MzEsMHgzMiwweDAwLDB4MDAsMHgwMiwweDAwLDB4MDAsMHgwMCwweDY5LDB4NjQsMHgwMCwweDAwLDB4RTAsMHhFRiwweEZGLDB4RkYsCisgICAgICAweDAxLDB4MDAsMHgwMCwweDAwLDB4MDQsMHgwMCwweDAwLDB4MDAsMHg5MCwweEYyLDB4RkYsMHhGRiwweDEwLDB4MDAsMHgwMCwweDAwLDB4MDQsMHgwMCwweDAwLDB4MDAsCisgICAgICAweDAyLDB4MDAsMHgwMCwweDAwLDB4MzEsMHgzMiwweDAwLDB4MDAsMHgwMiwweDAwLDB4MDAsMHgwMCwweDY5LDB4NjQsMHgwMCwweDAwLDB4NTgsMHhFRiwweEZGLDB4RkYsCiAgICAgICAweDAwLDB4MDAsMHgwMCwweDBGLDB4MDEsMHgwMCwweDAwLDB4MDAsMHgwMSwweDAwLDB4MDAsMHgwMCwweDA1LDB4MDAsMHgwMCwweDAwLDB4NjUsMHg2RSwweDY1LDB4NkQsCiAgICAgICAweDc5LDB4MDAsMHgwMCwweDAwLDB4MDgsMHhGRCwweEZGLDB4RkYsMHgwMCwweDAwLDB4MDAsMHgwMSwweDBCLDB4MDAsMHgxQSwweDAwLDB4QjQsMHgwMCwweDAwLDB4MDAsCiAgICAgICAweEEwLDB4MDAsMHgwMCwweDAwLDB4NzgsMHgwMCwweDAwLDB4MDAsMHgwNCwweDAwLDB4MDAsMHgwMCwweDAyLDB4MDAsMHgwMCwweDAwLDB4MUMsMHgwMCwweDAwLDB4MDAsCkBAIC01MzQsMjIzICs1NDEsMjMwIEBACiAgICAgICAweDY0LDB4NkYsMHg2MywweDc1LDB4NkQsMHg2NSwweDZFLDB4NzQsMHg2MSwweDc0LDB4NjksMHg2RiwweDZFLDB4MjAsMHg2MywweDZGLDB4NkQsMHg2RCwweDY1LDB4NkUsCiAgICAgICAweDc0LDB4M0EsMHgyMCwweDc0LDB4NjgsMHg2OSwweDczLDB4MjAsMHg3NywweDY5LDB4NkMsMHg2QywweDIwLDB4NjUsMHg2RSwweDY0LDB4MjAsMHg3NSwweDcwLDB4MjAsCiAgICAgICAweDY5LDB4NkUsMHgyMCwweDc0LDB4NjgsMHg2NSwweDIwLDB4NjcsMHg2NSwweDZFLDB4NjUsMHg3MiwweDYxLDB4NzQsMHg2NSwweDY0LDB4MjAsMHg2MywweDZGLDB4NjQsCi0gICAgICAweDY1LDB4MDAsMHgwMCwweDAwLDB4MDEsMHgwMCwweDAwLDB4MDAsMHgwNCwweDAwLDB4MDAsMHgwMCwweEU0LDB4RjMsMHhGRiwweEZGLDB4MTAsMHgwMCwweDAwLDB4MDAsCisgICAgICAweDY1LDB4MDAsMHgwMCwweDAwLDB4MDEsMHgwMCwweDAwLDB4MDAsMHgwNCwweDAwLDB4MDAsMHgwMCwweDVDLDB4RjMsMHhGRiwweEZGLDB4MTAsMHgwMCwweDAwLDB4MDAsCiAgICAgICAweDA0LDB4MDAsMHgwMCwweDAwLDB4MDIsMHgwMCwweDAwLDB4MDAsMHgzMSwweDMxLDB4MDAsMHgwMCwweDAyLDB4MDAsMHgwMCwweDAwLDB4NjksMHg2NCwweDAwLDB4MDAsCiAgICAgICAweDJDLDB4RkYsMHhGRiwweEZGLDB4MDAsMHgwMCwweDBFLDB4MEYsMHgwMSwweDAwLDB4MDAsMHgwMCwweDA0LDB4MDAsMHgwMCwweDAwLDB4MTEsMHgwMCwweDAwLDB4MDAsCiAgICAgICAweDc0LDB4NjUsMHg3MywweDc0LDB4NjEsMHg3MiwweDcyLDB4NjEsMHg3OSwweDZGLDB4NjYsMHg3NCwweDYxLDB4NjIsMHg2QywweDY1LDB4NzMsMHgwMCwweDAwLDB4MDAsCiAgICAgICAweEUwLDB4RkQsMHhGRiwweEZGLDB4MDAsMHgwMCwweDAwLDB4MDEsMHgwQSwweDAwLDB4MTgsMHgwMCwweDQ0LDB4MDAsMHgwMCwweDAwLDB4MzQsMHgwMCwweDAwLDB4MDAsCiAgICAgICAweDBDLDB4MDAsMHgwMCwweDAwLDB4MDQsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAxLDB4MDAsMHgwMCwweDAwLDB4MDQsMHgwMCwweDAwLDB4MDAsCi0gICAgICAweDUwLDB4RjQsMHhGRiwweEZGLDB4MTAsMHgwMCwweDAwLDB4MDAsMHgwNCwweDAwLDB4MDAsMHgwMCwweDAyLDB4MDAsMHgwMCwweDAwLDB4MzEsMHgzMCwweDAwLDB4MDAsCisgICAgICAweEM4LDB4RjMsMHhGRiwweEZGLDB4MTAsMHgwMCwweDAwLDB4MDAsMHgwNCwweDAwLDB4MDAsMHgwMCwweDAyLDB4MDAsMHgwMCwweDAwLDB4MzEsMHgzMCwweDAwLDB4MDAsCiAgICAgICAweDAyLDB4MDAsMHgwMCwweDAwLDB4NjksMHg2NCwweDAwLDB4MDAsMHhDNCwweEZELDB4RkYsMHhGRiwweDAwLDB4MDAsMHgwRSwweDBELDB4MDQsMHgwMCwweDAwLDB4MDAsCiAgICAgICAweDExLDB4MDAsMHgwMCwweDAwLDB4NzQsMHg2NSwweDczLDB4NzQsMHg2MSwweDcyLDB4NzIsMHg2MSwweDc5LDB4NkYsMHg2NiwweDczLDB4NzQsMHg3MiwweDY5LDB4NkUsCiAgICAgICAweDY3LDB4MDAsMHgwMCwweDAwLDB4NDgsMHhGRSwweEZGLDB4RkYsMHgwMCwweDAwLDB4MDAsMHgwMSwweDA5LDB4MDAsMHgxNiwweDAwLDB4NTgsMHgwMCwweDAwLDB4MDAsCiAgICAgICAweDQ0LDB4MDAsMHgwMCwweDAwLDB4MEMsMHgwMCwweDAwLDB4MDAsMHgwNCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDEsMHgwMCwweDAwLDB4MDAsCi0gICAgICAweDA0LDB4MDAsMHgwMCwweDAwLDB4QjgsMHhGNCwweEZGLDB4RkYsMHgxMCwweDAwLDB4MDAsMHgwMCwweDA0LDB4MDAsMHgwMCwweDAwLDB4MDEsMHgwMCwweDAwLDB4MDAsCisgICAgICAweDA0LDB4MDAsMHgwMCwweDAwLDB4MzAsMHhGNCwweEZGLDB4RkYsMHgxMCwweDAwLDB4MDAsMHgwMCwweDA0LDB4MDAsMHgwMCwweDAwLDB4MDEsMHgwMCwweDAwLDB4MDAsCiAgICAgICAweDM5LDB4MDAsMHgwMCwweDAwLDB4MDIsMHgwMCwweDAwLDB4MDAsMHg2OSwweDY0LDB4MDAsMHgwMCwweDEwLDB4MDAsMHgxMCwweDAwLDB4MDYsMHgwMCwweDA3LDB4MDAsCi0gICAgICAweDA4LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDBDLDB4MDAsMHgxMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwRSwweDBGLDB4MDUsMHgwMCwweDAwLDB4MDAsCisgICAgICAweDA4LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDBDLDB4MDAsMHgxMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwRSwweDBGLDB4MDYsMHgwMCwweDAwLDB4MDAsCiAgICAgICAweDA0LDB4MDAsMHgwMCwweDAwLDB4MDUsMHgwMCwweDAwLDB4MDAsMHg3NCwweDY1LDB4NzMsMHg3NCwweDM0LDB4MDAsMHgwMCwweDAwLDB4QjgsMHhGRSwweEZGLDB4RkYsCiAgICAgICAweDAwLDB4MDAsMHgwMCwweDAxLDB4MDgsMHgwMCwweDE0LDB4MDAsMHg0OCwweDAwLDB4MDAsMHgwMCwweDM0LDB4MDAsMHgwMCwweDAwLDB4MEMsMHgwMCwweDAwLDB4MDAsCi0gICAgICAweDA0LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMSwweDAwLDB4MDAsMHgwMCwweDA0LDB4MDAsMHgwMCwweDAwLDB4MjgsMHhGNSwweEZGLDB4RkYsCisgICAgICAweDA0LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMSwweDAwLDB4MDAsMHgwMCwweDA0LDB4MDAsMHgwMCwweDAwLDB4QTAsMHhGNCwweEZGLDB4RkYsCiAgICAgICAweDEwLDB4MDAsMHgwMCwweDAwLDB4MDQsMHgwMCwweDAwLDB4MDAsMHgwMSwweDAwLDB4MDAsMHgwMCwweDM4LDB4MDAsMHgwMCwweDAwLDB4MDIsMHgwMCwweDAwLDB4MDAsCi0gICAgICAweDY5LDB4NjQsMHgwMCwweDAwLDB4RjAsMHhGMSwweEZGLDB4RkYsMHgwMCwweDAwLDB4MDAsMHgxMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDEsMHgwMCwweDAwLDB4MDAsCisgICAgICAweDY5LDB4NjQsMHgwMCwweDAwLDB4NjgsMHhGMSwweEZGLDB4RkYsMHgwMCwweDAwLDB4MDAsMHgxMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDEsMHgwMCwweDAwLDB4MDAsCiAgICAgICAweDA0LDB4MDAsMHgwMCwweDAwLDB4NzQsMHg2NSwweDczLDB4NzQsMHgwMCwweDAwLDB4MUEsMHgwMCwweDE4LDB4MDAsMHgwOCwweDAwLDB4MEMsMHgwMCwweDA0LDB4MDAsCiAgICAgICAweDA2LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDEwLDB4MDAsMHgxNCwweDAwLDB4MUEsMHgwMCwweDAwLDB4MDAsCiAgICAgICAweDA3LDB4MDAsMHgxMiwweDAwLDB4NEMsMHgwMCwweDAwLDB4MDAsMHgzNCwweDAwLDB4MDAsMHgwMCwweDBDLDB4MDAsMHgwMCwweDAwLDB4MDQsMHgwMCwweDAwLDB4MDAsCi0gICAgICAweDAwLDB4MDAsMHgwMCwweDAwLDB4MDEsMHgwMCwweDAwLDB4MDAsMHgwNCwweDAwLDB4MDAsMHgwMCwweDlDLDB4RjUsMHhGRiwweEZGLDB4MTAsMHgwMCwweDAwLDB4MDAsCisgICAgICAweDAwLDB4MDAsMHgwMCwweDAwLDB4MDEsMHgwMCwweDAwLDB4MDAsMHgwNCwweDAwLDB4MDAsMHgwMCwweDE0LDB4RjUsMHhGRiwweEZGLDB4MTAsMHgwMCwweDAwLDB4MDAsCiAgICAgICAweDA0LDB4MDAsMHgwMCwweDAwLDB4MDEsMHgwMCwweDAwLDB4MDAsMHgzNywweDAwLDB4MDAsMHgwMCwweDAyLDB4MDAsMHgwMCwweDAwLDB4NjksMHg2NCwweDAwLDB4MDAsCi0gICAgICAweDE4LDB4RjUsMHhGRiwweEZGLDB4MDAsMHgwMCwweDAwLDB4MDEsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAxLDB4MDAsMHgwMCwweDAwLDB4MDEsMHgwMCwweDAwLDB4MDAsCisgICAgICAweDkwLDB4RjQsMHhGRiwweEZGLDB4MDAsMHgwMCwweDAwLDB4MDEsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAxLDB4MDAsMHgwMCwweDAwLDB4MDEsMHgwMCwweDAwLDB4MDAsCiAgICAgICAweDA5LDB4MDAsMHgwMCwweDAwLDB4NzQsMHg2NSwweDczLDB4NzQsMHg1RiwweDc0LDB4NzksMHg3MCwweDY1LDB4MDAsMHgwMCwweDAwLDB4NDIsMHhGRCwweEZGLDB4RkYsCiAgICAgICAweDA2LDB4MDAsMHgxMCwweDAwLDB4NTgsMHgwMCwweDAwLDB4MDAsMHg0MCwweDAwLDB4MDAsMHgwMCwweDE4LDB4MDAsMHgwMCwweDAwLDB4MTAsMHgwMCwweDAwLDB4MDAsCiAgICAgICAweDA4LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDEsMHgwMCwweDAwLDB4MDAsCi0gICAgICAweDA0LDB4MDAsMHgwMCwweDAwLDB4MEMsMHhGNiwweEZGLDB4RkYsMHgxMCwweDAwLDB4MDAsMHgwMCwweDA0LDB4MDAsMHgwMCwweDAwLDB4MDEsMHgwMCwweDAwLDB4MDAsCi0gICAgICAweDM2LDB4MDAsMHgwMCwweDAwLDB4MDIsMHgwMCwweDAwLDB4MDAsMHg2OSwweDY0LDB4MDAsMHgwMCwweDg4LDB4RjUsMHhGRiwweEZGLDB4MDAsMHgwMCwweDAwLDB4MDQsCisgICAgICAweDA0LDB4MDAsMHgwMCwweDAwLDB4ODQsMHhGNSwweEZGLDB4RkYsMHgxMCwweDAwLDB4MDAsMHgwMCwweDA0LDB4MDAsMHgwMCwweDAwLDB4MDEsMHgwMCwweDAwLDB4MDAsCisgICAgICAweDM2LDB4MDAsMHgwMCwweDAwLDB4MDIsMHgwMCwweDAwLDB4MDAsMHg2OSwweDY0LDB4MDAsMHgwMCwweDAwLDB4RjUsMHhGRiwweEZGLDB4MDAsMHgwMCwweDAwLDB4MDQsCiAgICAgICAweDAzLDB4MDAsMHgwMCwweDAwLDB4MDEsMHgwMCwweDAwLDB4MDAsMHgwMSwweDAwLDB4MDAsMHgwMCwweDA1LDB4MDAsMHgwMCwweDAwLDB4NjMsMHg2RiwweDZDLDB4NkYsCiAgICAgICAweDcyLDB4MDAsMHgwMCwweDAwLDB4MUMsMHgwMCwweDFDLDB4MDAsMHgwQywweDAwLDB4MTAsMHgwMCwweDA4LDB4MDAsMHgwQSwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCiAgICAgICAweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDE0LDB4MDAsMHgxOCwweDAwLDB4MDcsMHgwMCwweDFDLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDEsCiAgICAgICAweDA1LDB4MDAsMHgwRSwweDAwLDB4NTQsMHgwMCwweDAwLDB4MDAsMHg0NCwweDAwLDB4MDAsMHgwMCwweDBDLDB4MDAsMHgwMCwweDAwLDB4MDQsMHgwMCwweDAwLDB4MDAsCi0gICAgICAweDAwLDB4MDAsMHgwMCwweDAwLDB4MDEsMHgwMCwweDAwLDB4MDAsMHgwNCwweDAwLDB4MDAsMHgwMCwweDhDLDB4RjYsMHhGRiwweEZGLDB4MTAsMHgwMCwweDAwLDB4MDAsCisgICAgICAweDAwLDB4MDAsMHgwMCwweDAwLDB4MDEsMHgwMCwweDAwLDB4MDAsMHgwNCwweDAwLDB4MDAsMHgwMCwweDA0LDB4RjYsMHhGRiwweEZGLDB4MTAsMHgwMCwweDAwLDB4MDAsCiAgICAgICAweDA0LDB4MDAsMHgwMCwweDAwLDB4MDEsMHgwMCwweDAwLDB4MDAsMHgzNSwweDAwLDB4MDAsMHgwMCwweDAyLDB4MDAsMHgwMCwweDAwLDB4NjksMHg2NCwweDAwLDB4MDAsCiAgICAgICAweDEwLDB4MDAsMHgwQywweDAwLDB4MDYsMHgwMCwweDA3LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwOCwweDAwLDB4MTAsMHgwMCwweDAwLDB4MDAsCiAgICAgICAweDAwLDB4MDAsMHgwRSwweDA0LDB4MDEsMHgwMCwweDAwLDB4MDAsMHgwOSwweDAwLDB4MDAsMHgwMCwweDY5LDB4NkUsMHg3NiwweDY1LDB4NkUsMHg3NCwweDZGLDB4NzIsCiAgICAgICAweDc5LDB4MDAsMHgxQSwweDAwLDB4MUMsMHgwMCwweDBDLDB4MDAsMHgxMCwweDAwLDB4MDgsMHgwMCwweDBBLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDA3LDB4MDAsCiAgICAgICAweDAwLDB4MDAsMHgwMCwweDAwLDB4MTQsMHgwMCwweDE4LDB4MDAsMHgxQSwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAxLDB4MDQsMHgwMCwweDBDLDB4MDAsCiAgICAgICAweDk4LDB4MDAsMHgwMCwweDAwLDB4ODQsMHgwMCwweDAwLDB4MDAsMHgwQywweDAwLDB4MDAsMHgwMCwweDA0LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCi0gICAgICAweDAzLDB4MDAsMHgwMCwweDAwLDB4NEMsMHgwMCwweDAwLDB4MDAsMHgyQywweDAwLDB4MDAsMHgwMCwweDA0LDB4MDAsMHgwMCwweDAwLDB4MUMsMHhGNywweEZGLDB4RkYsCisgICAgICAweDAzLDB4MDAsMHgwMCwweDAwLDB4NEMsMHgwMCwweDAwLDB4MDAsMHgyQywweDAwLDB4MDAsMHgwMCwweDA0LDB4MDAsMHgwMCwweDAwLDB4OTQsMHhGNiwweEZGLDB4RkYsCiAgICAgICAweDEwLDB4MDAsMHgwMCwweDAwLDB4MDQsMHgwMCwweDAwLDB4MDAsMHgwMSwweDAwLDB4MDAsMHgwMCwweDMxLDB4MDAsMHgwMCwweDAwLDB4MDgsMHgwMCwweDAwLDB4MDAsCi0gICAgICAweDcwLDB4NzIsMHg2OSwweDZGLDB4NzIsMHg2OSwweDc0LDB4NzksMHgwMCwweDAwLDB4MDAsMHgwMCwweDQwLDB4RjcsMHhGRiwweEZGLDB4MTAsMHgwMCwweDAwLDB4MDAsCisgICAgICAweDcwLDB4NzIsMHg2OSwweDZGLDB4NzIsMHg2OSwweDc0LDB4NzksMHgwMCwweDAwLDB4MDAsMHgwMCwweEI4LDB4RjYsMHhGRiwweEZGLDB4MTAsMHgwMCwweDAwLDB4MDAsCiAgICAgICAweDA0LDB4MDAsMHgwMCwweDAwLDB4MDEsMHgwMCwweDAwLDB4MDAsMHgzNCwweDAwLDB4MDAsMHgwMCwweDAyLDB4MDAsMHgwMCwweDAwLDB4NjksMHg2NCwweDAwLDB4MDAsCi0gICAgICAweDVDLDB4RjcsMHhGRiwweEZGLDB4MTAsMHgwMCwweDAwLDB4MDAsMHgwNCwweDAwLDB4MDAsMHgwMCwweDAxLDB4MDAsMHgwMCwweDAwLDB4MzAsMHgwMCwweDAwLDB4MDAsCi0gICAgICAweDBBLDB4MDAsMHgwMCwweDAwLDB4NjQsMHg2NSwweDcwLDB4NzIsMHg2NSwweDYzLDB4NjEsMHg3NCwweDY1LDB4NjQsMHgwMCwweDAwLDB4MDAsMHhGNiwweEZGLDB4RkYsCisgICAgICAweEQ0LDB4RjYsMHhGRiwweEZGLDB4MTAsMHgwMCwweDAwLDB4MDAsMHgwNCwweDAwLDB4MDAsMHgwMCwweDAxLDB4MDAsMHgwMCwweDAwLDB4MzAsMHgwMCwweDAwLDB4MDAsCisgICAgICAweDBBLDB4MDAsMHgwMCwweDAwLDB4NjQsMHg2NSwweDcwLDB4NzIsMHg2NSwweDYzLDB4NjEsMHg3NCwweDY1LDB4NjQsMHgwMCwweDAwLDB4NzgsMHhGNSwweEZGLDB4RkYsCiAgICAgICAweDAwLDB4MDAsMHgwMCwweDAyLDB4MDEsMHgwMCwweDAwLDB4MDAsMHgwMSwweDAwLDB4MDAsMHgwMCwweDA4LDB4MDAsMHgwMCwweDAwLDB4NjYsMHg3MiwweDY5LDB4NjUsCiAgICAgICAweDZFLDB4NjQsMHg2QywweDc5LDB4MDAsMHgwMCwweDFBLDB4MDAsMHgxQywweDAwLDB4MEMsMHgwMCwweDEwLDB4MDAsMHgwOCwweDAwLDB4MEEsMHgwMCwweDAwLDB4MDAsCiAgICAgICAweDAwLDB4MDAsMHgwMCwweDAwLDB4MDYsMHgwMCwweDA3LDB4MDAsMHgxNCwweDAwLDB4MTgsMHgwMCwweDFBLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAxLDB4MDEsCiAgICAgICAweDAzLDB4MDAsMHgwQSwweDAwLDB4NjQsMHgwMCwweDAwLDB4MDAsMHg1NCwweDAwLDB4MDAsMHgwMCwweDBDLDB4MDAsMHgwMCwweDAwLDB4MDQsMHgwMCwweDAwLDB4MDAsCi0gICAgICAweDAwLDB4MDAsMHgwMCwweDAwLDB4MDIsMHgwMCwweDAwLDB4MDAsMHgyNCwweDAwLDB4MDAsMHgwMCwweDA0LDB4MDAsMHgwMCwweDAwLDB4RTQsMHhGNywweEZGLDB4RkYsCisgICAgICAweDAwLDB4MDAsMHgwMCwweDAwLDB4MDIsMHgwMCwweDAwLDB4MDAsMHgyNCwweDAwLDB4MDAsMHgwMCwweDA0LDB4MDAsMHgwMCwweDAwLDB4NUMsMHhGNywweEZGLDB4RkYsCiAgICAgICAweDEwLDB4MDAsMHgwMCwweDAwLDB4MDQsMHgwMCwweDAwLDB4MDAsMHgwMSwweDAwLDB4MDAsMHgwMCwweDMwLDB4MDAsMHgwMCwweDAwLDB4MDMsMHgwMCwweDAwLDB4MDAsCi0gICAgICAweDZCLDB4NjUsMHg3OSwweDAwLDB4MDAsMHhGOCwweEZGLDB4RkYsMHgxMCwweDAwLDB4MDAsMHgwMCwweDA0LDB4MDAsMHgwMCwweDAwLDB4MDEsMHgwMCwweDAwLDB4MDAsCi0gICAgICAweDMzLDB4MDAsMHgwMCwweDAwLDB4MDIsMHgwMCwweDAwLDB4MDAsMHg2OSwweDY0LDB4MDAsMHgwMCwweEU0LDB4RjMsMHhGRiwweEZGLDB4MDAsMHgwMCwweDAwLDB4MEQsCisgICAgICAweDZCLDB4NjUsMHg3OSwweDAwLDB4NzgsMHhGNywweEZGLDB4RkYsMHgxMCwweDAwLDB4MDAsMHgwMCwweDA0LDB4MDAsMHgwMCwweDAwLDB4MDEsMHgwMCwweDAwLDB4MDAsCisgICAgICAweDMzLDB4MDAsMHgwMCwweDAwLDB4MDIsMHgwMCwweDAwLDB4MDAsMHg2OSwweDY0LDB4MDAsMHgwMCwweDVDLDB4RjMsMHhGRiwweEZGLDB4MDAsMHgwMCwweDAwLDB4MEQsCiAgICAgICAweDAxLDB4MDAsMHgwMCwweDAwLDB4MDQsMHgwMCwweDAwLDB4MDAsMHg2RSwweDYxLDB4NkQsMHg2NSwweDAwLDB4MDAsMHgwMCwweDAwLDB4OUEsMHhGRiwweEZGLDB4RkYsCiAgICAgICAweDAyLDB4MDAsMHgwOCwweDAwLDB4NTQsMHgwMCwweDAwLDB4MDAsMHg0MCwweDAwLDB4MDAsMHgwMCwweDE4LDB4MDAsMHgwMCwweDAwLDB4MTAsMHgwMCwweDAwLDB4MDAsCiAgICAgICAweDY0LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDEsMHgwMCwweDAwLDB4MDAsCi0gICAgICAweDA0LDB4MDAsMHgwMCwweDAwLDB4NjQsMHhGOCwweEZGLDB4RkYsMHgxMCwweDAwLDB4MDAsMHgwMCwweDA0LDB4MDAsMHgwMCwweDAwLDB4MDEsMHgwMCwweDAwLDB4MDAsCi0gICAgICAweDMyLDB4MDAsMHgwMCwweDAwLDB4MDIsMHgwMCwweDAwLDB4MDAsMHg2OSwweDY0LDB4MDAsMHgwMCwweDAwLDB4RjcsMHhGRiwweEZGLDB4MDAsMHgwMCwweDAwLDB4MDUsCisgICAgICAweDA0LDB4MDAsMHgwMCwweDAwLDB4REMsMHhGNywweEZGLDB4RkYsMHgxMCwweDAwLDB4MDAsMHgwMCwweDA0LDB4MDAsMHgwMCwweDAwLDB4MDEsMHgwMCwweDAwLDB4MDAsCisgICAgICAweDMyLDB4MDAsMHgwMCwweDAwLDB4MDIsMHgwMCwweDAwLDB4MDAsMHg2OSwweDY0LDB4MDAsMHgwMCwweDc4LDB4RjYsMHhGRiwweEZGLDB4MDAsMHgwMCwweDAwLDB4MDUsCiAgICAgICAweDAyLDB4MDAsMHgwMCwweDAwLDB4MDEsMHgwMCwweDAwLDB4MDAsMHgwMiwweDAwLDB4MDAsMHgwMCwweDY4LDB4NzAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDFBLDB4MDAsCiAgICAgICAweDI0LDB4MDAsMHgwOCwweDAwLDB4MEMsMHgwMCwweDA0LDB4MDAsMHgwNiwweDAwLDB4MTgsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCiAgICAgICAweDEwLDB4MDAsMHgxNCwweDAwLDB4MUEsMHgwMCwweDAwLDB4MDAsMHgwMSwweDAwLDB4MDYsMHgwMCwweDU0LDB4MDAsMHgwMCwweDAwLDB4NDAsMHgwMCwweDAwLDB4MDAsCiAgICAgICAweDE4LDB4MDAsMHgwMCwweDAwLDB4MTAsMHgwMCwweDAwLDB4MDAsMHg5NiwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCi0gICAgICAweDAwLDB4MDAsMHgwMCwweDAwLDB4MDEsMHgwMCwweDAwLDB4MDAsMHgwNCwweDAwLDB4MDAsMHgwMCwweEU0LDB4RjgsMHhGRiwweEZGLDB4MTAsMHgwMCwweDAwLDB4MDAsCisgICAgICAweDAwLDB4MDAsMHgwMCwweDAwLDB4MDEsMHgwMCwweDAwLDB4MDAsMHgwNCwweDAwLDB4MDAsMHgwMCwweDVDLDB4RjgsMHhGRiwweEZGLDB4MTAsMHgwMCwweDAwLDB4MDAsCiAgICAgICAweDA0LDB4MDAsMHgwMCwweDAwLDB4MDEsMHgwMCwweDAwLDB4MDAsMHgzMSwweDAwLDB4MDAsMHgwMCwweDAyLDB4MDAsMHgwMCwweDAwLDB4NjksMHg2NCwweDAwLDB4MDAsCi0gICAgICAweDgwLDB4RjcsMHhGRiwweEZGLDB4MDAsMHgwMCwweDAwLDB4MDUsMHgwMiwweDAwLDB4MDAsMHgwMCwweDAxLDB4MDAsMHgwMCwweDAwLDB4MDQsMHgwMCwweDAwLDB4MDAsCisgICAgICAweEY4LDB4RjYsMHhGRiwweEZGLDB4MDAsMHgwMCwweDAwLDB4MDUsMHgwMiwweDAwLDB4MDAsMHgwMCwweDAxLDB4MDAsMHgwMCwweDAwLDB4MDQsMHgwMCwweDAwLDB4MDAsCiAgICAgICAweDZELDB4NjEsMHg2RSwweDYxLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgxQywweDAwLDB4MTgsMHgwMCwweDA4LDB4MDAsMHgwQywweDAwLDB4MDAsMHgwMCwweDA2LDB4MDAsCiAgICAgICAweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MTAsMHgwMCwweDE0LDB4MDAsMHgwNSwweDAwLDB4MUMsMHgwMCwweDAwLDB4MDAsCiAgICAgICAweDAwLDB4MDEsMHgwNCwweDAwLDB4NDgsMHgwMCwweDAwLDB4MDAsMHgzNCwweDAwLDB4MDAsMHgwMCwweDBDLDB4MDAsMHgwMCwweDAwLDB4MDQsMHgwMCwweDAwLDB4MDAsCi0gICAgICAweDAwLDB4MDAsMHgwMCwweDAwLDB4MDEsMHgwMCwweDAwLDB4MDAsMHgwNCwweDAwLDB4MDAsMHgwMCwweDVDLDB4RjksMHhGRiwweEZGLDB4MTAsMHgwMCwweDAwLDB4MDAsCisgICAgICAweDAwLDB4MDAsMHgwMCwweDAwLDB4MDEsMHgwMCwweDAwLDB4MDAsMHgwNCwweDAwLDB4MDAsMHgwMCwweEQ0LDB4RjgsMHhGRiwweEZGLDB4MTAsMHgwMCwweDAwLDB4MDAsCiAgICAgICAweDA0LDB4MDAsMHgwMCwweDAwLDB4MDEsMHgwMCwweDAwLDB4MDAsMHgzMCwweDAwLDB4MDAsMHgwMCwweDAyLDB4MDAsMHgwMCwweDAwLDB4NjksMHg2NCwweDAwLDB4MDAsCi0gICAgICAweDI0LDB4RjYsMHhGRiwweEZGLDB4MDAsMHgwMCwweDAwLDB4MEYsMHgwOCwweDAwLDB4MDAsMHgwMCwweDAxLDB4MDAsMHgwMCwweDAwLDB4MDMsMHgwMCwweDAwLDB4MDAsCi0gICAgICAweDcwLDB4NkYsMHg3MywweDAwLDB4Q0MsMHhGNiwweEZGLDB4RkYsMHgyMCwweDAwLDB4MDAsMHgwMCwweDE0LDB4MDAsMHgwMCwweDAwLDB4MDEsMHgwMCwweDAwLDB4MDAsCi0gICAgICAweDA4LDB4MDAsMHgwMCwweDAwLDB4NTgsMHgwOCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAxLDB4MDAsMHgwMCwweDAwLDB4M0MsMHgwMCwweDAwLDB4MDAsCisgICAgICAweDlDLDB4RjUsMHhGRiwweEZGLDB4MDAsMHgwMCwweDAwLDB4MEYsMHgwOSwweDAwLDB4MDAsMHgwMCwweDAxLDB4MDAsMHgwMCwweDAwLDB4MDMsMHgwMCwweDAwLDB4MDAsCisgICAgICAweDcwLDB4NkYsMHg3MywweDAwLDB4NDQsMHhGNiwweEZGLDB4RkYsMHgyMCwweDAwLDB4MDAsMHgwMCwweDE0LDB4MDAsMHgwMCwweDAwLDB4MDEsMHgwMCwweDAwLDB4MDAsCisgICAgICAweDA4LDB4MDAsMHgwMCwweDAwLDB4RTAsMHgwOCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAxLDB4MDAsMHgwMCwweDAwLDB4M0MsMHgwMCwweDAwLDB4MDAsCiAgICAgICAweDE5LDB4MDAsMHgwMCwweDAwLDB4NEQsMHg3OSwweDQ3LDB4NjEsMHg2RCwweDY1LDB4MkUsMHg0NSwweDc4LDB4NjEsMHg2RCwweDcwLDB4NkMsMHg2NSwweDJFLDB4NTIsCiAgICAgICAweDY1LDB4NjYsMHg2NSwweDcyLDB4NzIsMHg2MSwweDYyLDB4NkMsMHg2NSwweDAwLDB4MUEsMHgwMCwweDE4LDB4MDAsMHgwOCwweDAwLDB4MEMsMHgwMCwweDAwLDB4MDAsCiAgICAgICAweDA2LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDUsMHgwMCwweDEwLDB4MDAsMHgxNCwweDAwLDB4MUEsMHgwMCwweDAwLDB4MDAsCiAgICAgICAweDAwLDB4MDEsMHgwNCwweDAwLDB4NzQsMHgwMCwweDAwLDB4MDAsMHg2MCwweDAwLDB4MDAsMHgwMCwweDBDLDB4MDAsMHgwMCwweDAwLDB4MDQsMHgwMCwweDAwLDB4MDAsCi0gICAgICAweDAwLDB4MDAsMHgwMCwweDAwLDB4MDIsMHgwMCwweDAwLDB4MDAsMHgyNCwweDAwLDB4MDAsMHgwMCwweDA0LDB4MDAsMHgwMCwweDAwLDB4MTQsMHhGQSwweEZGLDB4RkYsCisgICAgICAweDAwLDB4MDAsMHgwMCwweDAwLDB4MDIsMHgwMCwweDAwLDB4MDAsMHgyNCwweDAwLDB4MDAsMHgwMCwweDA0LDB4MDAsMHgwMCwweDAwLDB4OEMsMHhGOSwweEZGLDB4RkYsCiAgICAgICAweDEwLDB4MDAsMHgwMCwweDAwLDB4MDQsMHgwMCwweDAwLDB4MDAsMHgwMSwweDAwLDB4MDAsMHgwMCwweDMwLDB4MDAsMHgwMCwweDAwLDB4MDMsMHgwMCwweDAwLDB4MDAsCi0gICAgICAweDZCLDB4NjUsMHg3OSwweDAwLDB4MzAsMHhGQSwweEZGLDB4RkYsMHgxOCwweDAwLDB4MDAsMHgwMCwweDA0LDB4MDAsMHgwMCwweDAwLDB4MDgsMHgwMCwweDAwLDB4MDAsCisgICAgICAweDZCLDB4NjUsMHg3OSwweDAwLDB4QTgsMHhGOSwweEZGLDB4RkYsMHgxOCwweDAwLDB4MDAsMHgwMCwweDA0LDB4MDAsMHgwMCwweDAwLDB4MDgsMHgwMCwweDAwLDB4MDAsCiAgICAgICAweDY2LDB4NkUsMHg3NiwweDMxLDB4NjEsMHg1RiwweDM2LDB4MzQsMHgwMCwweDAwLDB4MDAsMHgwMCwweDA0LDB4MDAsMHgwMCwweDAwLDB4NjgsMHg2MSwweDczLDB4NjgsCi0gICAgICAweDAwLDB4MDAsMHgwMCwweDAwLDB4RDgsMHhGOCwweEZGLDB4RkYsMHgwMCwweDAwLDB4MDAsMHgwQSwweDA4LDB4MDAsMHgwMCwweDAwLDB4MDEsMHgwMCwweDAwLDB4MDAsCi0gICAgICAweDAyLDB4MDAsMHgwMCwweDAwLDB4NjksMHg2NCwweDAwLDB4MDAsMHhBQywweEY3LDB4RkYsMHhGRiwweDI4LDB4MDAsMHgwMCwweDAwLDB4MTQsMHgwMCwweDAwLDB4MDAsCi0gICAgICAweDAxLDB4MDAsMHgwMCwweDAwLDB4MDgsMHgwMCwweDAwLDB4MDAsMHg3OCwweDA3LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDMsMHgwMCwweDAwLDB4MDAsCisgICAgICAweDAwLDB4MDAsMHgwMCwweDAwLDB4NTAsMHhGOCwweEZGLDB4RkYsMHgwMCwweDAwLDB4MDAsMHgwQSwweDA4LDB4MDAsMHgwMCwweDAwLDB4MDEsMHgwMCwweDAwLDB4MDAsCisgICAgICAweDAyLDB4MDAsMHgwMCwweDAwLDB4NjksMHg2NCwweDAwLDB4MDAsMHgyNCwweEY3LDB4RkYsMHhGRiwweDI4LDB4MDAsMHgwMCwweDAwLDB4MTQsMHgwMCwweDAwLDB4MDAsCisgICAgICAweDAxLDB4MDAsMHgwMCwweDAwLDB4MDgsMHgwMCwweDAwLDB4MDAsMHgwMCwweDA4LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDMsMHgwMCwweDAwLDB4MDAsCiAgICAgICAweDQwLDB4MDAsMHgwMCwweDAwLDB4Q0MsMHgwMCwweDAwLDB4MDAsMHg5OCwweDAwLDB4MDAsMHgwMCwweDEzLDB4MDAsMHgwMCwweDAwLDB4NEQsMHg3OSwweDQ3LDB4NjEsCiAgICAgICAweDZELDB4NjUsMHgyRSwweDQ1LDB4NzgsMHg2MSwweDZELDB4NzAsMHg2QywweDY1LDB4MkUsMHg1MywweDc0LDB4NjEsMHg3NCwweDAwLDB4MDAsMHgwMCwweDFBLDB4MDAsCiAgICAgICAweDFDLDB4MDAsMHgwQywweDAwLDB4MTAsMHgwMCwweDA4LDB4MDAsMHgwQSwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDA3LDB4MDAsCiAgICAgICAweDE0LDB4MDAsMHgxOCwweDAwLDB4MUEsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMSwweDAyLDB4MDAsMHgwOCwweDAwLDB4NDgsMHgwMCwweDAwLDB4MDAsCiAgICAgICAweDM0LDB4MDAsMHgwMCwweDAwLDB4MEMsMHgwMCwweDAwLDB4MDAsMHgwNCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDEsMHgwMCwweDAwLDB4MDAsCi0gICAgICAweDA0LDB4MDAsMHgwMCwweDAwLDB4RjgsMHhGQSwweEZGLDB4RkYsMHgxMCwweDAwLDB4MDAsMHgwMCwweDA0LDB4MDAsMHgwMCwweDAwLDB4MDEsMHgwMCwweDAwLDB4MDAsCi0gICAgICAweDMwLDB4MDAsMHgwMCwweDAwLDB4MDMsMHgwMCwweDAwLDB4MDAsMHg2QiwweDY1LDB4NzksMHgwMCwweDk0LDB4RjksMHhGRiwweEZGLDB4MDAsMHgwMCwweDAwLDB4MDYsCisgICAgICAweDA0LDB4MDAsMHgwMCwweDAwLDB4NzAsMHhGQSwweEZGLDB4RkYsMHgxMCwweDAwLDB4MDAsMHgwMCwweDA0LDB4MDAsMHgwMCwweDAwLDB4MDEsMHgwMCwweDAwLDB4MDAsCisgICAgICAweDMwLDB4MDAsMHgwMCwweDAwLDB4MDMsMHgwMCwweDAwLDB4MDAsMHg2QiwweDY1LDB4NzksMHgwMCwweDBDLDB4RjksMHhGRiwweEZGLDB4MDAsMHgwMCwweDAwLDB4MDYsCiAgICAgICAweDAyLDB4MDAsMHgwMCwweDAwLDB4MDEsMHgwMCwweDAwLDB4MDAsMHgwNSwweDAwLDB4MDAsMHgwMCwweDYzLDB4NkYsMHg3NSwweDZFLDB4NzQsMHgwMCwweDAwLDB4MDAsCi0gICAgICAweEZFLDB4RkIsMHhGRiwweEZGLDB4MDEsMHgwMCwweDA2LDB4MDAsMHgyMCwweDAwLDB4MDAsMHgwMCwweDBDLDB4MDAsMHgwMCwweDAwLDB4MDQsMHgwMCwweDAwLDB4MDAsCi0gICAgICAweDAwLDB4MDAsMHgwMCwweDAwLDB4QzgsMHhGOSwweEZGLDB4RkYsMHgwMCwweDAwLDB4MDAsMHgwOSwweDA4LDB4MDAsMHgwMCwweDAwLDB4MDEsMHgwMCwweDAwLDB4MDAsCi0gICAgICAweDAzLDB4MDAsMHgwMCwweDAwLDB4NzYsMHg2MSwweDZDLDB4MDAsMHg0MCwweEY4LDB4RkYsMHhGRiwweDAwLDB4MDEsMHgwNCwweDAwLDB4MUMsMHgwMCwweDAwLDB4MDAsCi0gICAgICAweDBDLDB4MDAsMHgwMCwweDAwLDB4MDQsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDQwLDB4RjcsMHhGRiwweEZGLDB4MDAsMHgwMCwweDAwLDB4MEQsCi0gICAgICAweDAxLDB4MDAsMHgwMCwweDAwLDB4MDIsMHgwMCwweDAwLDB4MDAsMHg2OSwweDY0LDB4MDAsMHgwMCwweDEwLDB4RjgsMHhGRiwweEZGLDB4MDAsMHgwMCwweDAwLDB4MDEsCi0gICAgICAweDJDLDB4MDAsMHgwMCwweDAwLDB4MTgsMHgwMCwweDAwLDB4MDAsMHgwNCwweDAwLDB4MDAsMHgwMCwweDE0LDB4MDAsMHgwMCwweDAwLDB4MDgsMHgwMCwweDAwLDB4MDAsCi0gICAgICAweDU0LDB4MDYsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMywweDAwLDB4MDAsMHgwMCwweEQwLDB4MDAsMHgwMCwweDAwLDB4N0MsMHgwMCwweDAwLDB4MDAsCi0gICAgICAweDI4LDB4MDAsMHgwMCwweDAwLDB4MUUsMHgwMCwweDAwLDB4MDAsMHg0RCwweDc5LDB4NDcsMHg2MSwweDZELDB4NjUsMHgyRSwweDQ1LDB4NzgsMHg2MSwweDZELDB4NzAsCi0gICAgICAweDZDLDB4NjUsMHgyRSwweDUzLDB4NzQsMHg3MiwweDc1LDB4NjMsMHg3NCwweDRGLDB4NjYsMHg1MywweDc0LDB4NzIsMHg3NSwweDYzLDB4NzQsMHg3MywweDAwLDB4MDAsCi0gICAgICAweENDLDB4RkYsMHhGRiwweEZGLDB4MDAsMHgwMCwweDAwLDB4MDEsMHgwMiwweDAwLDB4MEMsMHgwMCwweDIwLDB4MDAsMHgwMCwweDAwLDB4MEMsMHgwMCwweDAwLDB4MDAsCi0gICAgICAweDA0LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHhBQywweEY4LDB4RkYsMHhGRiwweDAwLDB4MDAsMHgwMCwweDBGLDB4MDAsMHgwMCwweDAwLDB4MDAsCi0gICAgICAweDAxLDB4MDAsMHgwMCwweDAwLDB4MDEsMHgwMCwweDAwLDB4MDAsMHg2MywweDAwLDB4MDAsMHgwMCwweDFDLDB4MDAsMHgxOCwweDAwLDB4MEMsMHgwMCwweDEwLDB4MDAsCi0gICAgICAweDA4LDB4MDAsMHgwQSwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MTQsMHgwMCwweDA3LDB4MDAsCi0gICAgICAweDFDLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDEsMHgwMSwweDAwLDB4MDgsMHgwMCwweDIwLDB4MDAsMHgwMCwweDAwLDB4MEMsMHgwMCwweDAwLDB4MDAsCi0gICAgICAweDA0LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHhGQywweEY4LDB4RkYsMHhGRiwweDAwLDB4MDAsMHgwMCwweDBGLDB4MDUsMHgwMCwweDAwLDB4MDAsCi0gICAgICAweDAxLDB4MDAsMHgwMCwweDAwLDB4MDEsMHgwMCwweDAwLDB4MDAsMHg2MiwweDAwLDB4MDAsMHgwMCwweDFDLDB4MDAsMHgxNCwweDAwLDB4MDgsMHgwMCwweDBDLDB4MDAsCi0gICAgICAweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MTAsMHgwMCwweDA3LDB4MDAsCi0gICAgICAweDFDLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDEsMHgyMCwweDAwLDB4MDAsMHgwMCwweDBDLDB4MDAsMHgwMCwweDAwLDB4MDQsMHgwMCwweDAwLDB4MDAsCi0gICAgICAweDAwLDB4MDAsMHgwMCwweDAwLDB4NDgsMHhGOSwweEZGLDB4RkYsMHgwMCwweDAwLDB4MDAsMHgwRiwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDEsMHgwMCwweDAwLDB4MDAsCi0gICAgICAweDAxLDB4MDAsMHgwMCwweDAwLDB4NjEsMHgwMCwweDAwLDB4MDAsMHgzOCwweEY5LDB4RkYsMHhGRiwweDAwLDB4MDAsMHgwMCwweDAxLDB4MjgsMHgwMCwweDAwLDB4MDAsCi0gICAgICAweDE4LDB4MDAsMHgwMCwweDAwLDB4MDQsMHgwMCwweDAwLDB4MDAsMHgwOCwweDAwLDB4MDAsMHgwMCwweDA4LDB4MDAsMHgwMCwweDAwLDB4MkMsMHgwNSwweDAwLDB4MDAsCi0gICAgICAweDAwLDB4MDAsMHgwMCwweDAwLDB4MDIsMHgwMCwweDAwLDB4MDAsMHgyNCwweDAwLDB4MDAsMHgwMCwweDZDLDB4MDAsMHgwMCwweDAwLDB4MTYsMHgwMCwweDAwLDB4MDAsCi0gICAgICAweDRELDB4NzksMHg0NywweDYxLDB4NkQsMHg2NSwweDJFLDB4NDUsMHg3OCwweDYxLDB4NkQsMHg3MCwweDZDLDB4NjUsMHgyRSwweDQxLDB4NjIsMHg2OSwweDZDLDB4NjksCi0gICAgICAweDc0LDB4NzksMHgwMCwweDAwLDB4Q0UsMHhGRCwweEZGLDB4RkYsMHgwMSwweDAwLDB4MDQsMHgwMCwweDFDLDB4MDAsMHgwMCwweDAwLDB4MEMsMHgwMCwweDAwLDB4MDAsCi0gICAgICAweDA0LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHhFMCwweEY4LDB4RkYsMHhGRiwweDAwLDB4MDAsMHgwMCwweDA4LDB4MDEsMHgwMCwweDAwLDB4MDAsCi0gICAgICAweDA4LDB4MDAsMHgwMCwweDAwLDB4NjQsMHg2OSwweDczLDB4NzQsMHg2MSwweDZFLDB4NjMsMHg2NSwweDAwLDB4MDAsMHgxQSwweDAwLDB4MTgsMHgwMCwweDA4LDB4MDAsCi0gICAgICAweDBDLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwNywweDAwLDB4MTAsMHgwMCwweDE0LDB4MDAsCi0gICAgICAweDFBLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDEsMHg0NCwweDAwLDB4MDAsMHgwMCwweDM0LDB4MDAsMHgwMCwweDAwLDB4MEMsMHgwMCwweDAwLDB4MDAsCi0gICAgICAweDA0LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMSwweDAwLDB4MDAsMHgwMCwweDA0LDB4MDAsMHgwMCwweDAwLDB4NzAsMHhGRCwweEZGLDB4RkYsCi0gICAgICAweDEwLDB4MDAsMHgwMCwweDAwLDB4MDQsMHgwMCwweDAwLDB4MDAsMHgwMSwweDAwLDB4MDAsMHgwMCwweDMwLDB4MDAsMHgwMCwweDAwLDB4MDMsMHgwMCwweDAwLDB4MDAsCi0gICAgICAweDZCLDB4NjUsMHg3OSwweDAwLDB4NTQsMHhGOSwweEZGLDB4RkYsMHgwMCwweDAwLDB4MDAsMHgwOCwweDAxLDB4MDAsMHgwMCwweDAwLDB4MDIsMHgwMCwweDAwLDB4MDAsCi0gICAgICAweDY5LDB4NjQsMHgwMCwweDAwLDB4MTQsMHgwMCwweDI0LDB4MDAsMHgwOCwweDAwLDB4MEMsMHgwMCwweDA3LDB4MDAsMHgxMCwweDAwLDB4MTQsMHgwMCwweDE4LDB4MDAsCi0gICAgICAweDFDLDB4MDAsMHgyMCwweDAwLDB4MTQsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMSwweDY4LDB4MDAsMHgwMCwweDAwLDB4NDgsMHgwMCwweDAwLDB4MDAsCi0gICAgICAweDA4LDB4MDAsMHgwMCwweDAwLDB4MjAsMHgwMCwweDAwLDB4MDAsMHgxMCwweDAwLDB4MDAsMHgwMCwweDA4LDB4MDAsMHgwMCwweDAwLDB4MjgsMHgwNCwweDAwLDB4MDAsCi0gICAgICAweDAwLDB4MDAsMHgwMCwweDAwLDB4MDEsMHgwMCwweDAwLDB4MDAsMHgwNCwweDAwLDB4MDAsMHgwMCwweEU0LDB4RkQsMHhGRiwweEZGLDB4MTAsMHgwMCwweDAwLDB4MDAsCi0gICAgICAweDA0LDB4MDAsMHgwMCwweDAwLDB4MDEsMHgwMCwweDAwLDB4MDAsMHgzOCwweDAwLDB4MDAsMHgwMCwweDBCLDB4MDAsMHgwMCwweDAwLDB4NjYsMHg2RiwweDcyLDB4NjMsCi0gICAgICAweDY1LDB4NUYsMHg2MSwweDZDLDB4NjksMHg2NywweDZFLDB4MDAsMHgwNiwweDAwLDB4MDAsMHgwMCwweEM0LDB4MDAsMHgwMCwweDAwLDB4ODQsMHgwMCwweDAwLDB4MDAsCi0gICAgICAweDQ4LDB4MDAsMHgwMCwweDAwLDB4NjAsMHgwMSwweDAwLDB4MDAsMHgzMCwweDAxLDB4MDAsMHgwMCwweEU0LDB4MDAsMHgwMCwweDAwLDB4MTMsMHgwMCwweDAwLDB4MDAsCi0gICAgICAweDRELDB4NzksMHg0NywweDYxLDB4NkQsMHg2NSwweDJFLDB4NDUsMHg3OCwweDYxLDB4NkQsMHg3MCwweDZDLDB4NjUsMHgyRSwweDU2LDB4NjUsMHg2MywweDMzLDB4MDAsCi0gICAgICAweDAwLDB4MDAsMHgxRSwweDAwLDB4MTgsMHgwMCwweDBDLDB4MDAsMHgxMCwweDAwLDB4MDYsMHgwMCwweDA4LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCi0gICAgICAweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDE0LDB4MDAsMHgwNSwweDAwLDB4MEEsMHgwMCwweDFFLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMSwweDA1LDB4MDAsCi0gICAgICAweDFBLDB4MDAsMHgwMiwweDAwLDB4MjAsMHgwMCwweDAwLDB4MDAsMHgwQywweDAwLDB4MDAsMHgwMCwweDA0LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCi0gICAgICAweDI0LDB4RkIsMHhGRiwweEZGLDB4MDAsMHgwMCwweDAwLDB4MEYsMHgwNSwweDAwLDB4MDAsMHgwMCwweDAxLDB4MDAsMHgwMCwweDAwLDB4MDUsMHgwMCwweDAwLDB4MDAsCi0gICAgICAweDc0LDB4NjUsMHg3MywweDc0LDB4MzMsMHgwMCwweDAwLDB4MDAsMHg3QSwweEZELDB4RkYsMHhGRiwweDAwLDB4MDAsMHgwNCwweDAwLDB4MTgsMHgwMCwweDAxLDB4MDAsCi0gICAgICAweDI0LDB4MDAsMHgwMCwweDAwLDB4MEMsMHgwMCwweDAwLDB4MDAsMHgwNCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MTAsMHhGRSwweEZGLDB4RkYsCi0gICAgICAweDAwLDB4MDAsMHgwMCwweDA0LDB4MDMsMHgwMCwweDAwLDB4MDAsMHgwMSwweDAwLDB4MDAsMHgwMCwweDAxLDB4MDAsMHgwMCwweDAwLDB4MDUsMHgwMCwweDAwLDB4MDAsCi0gICAgICAweDc0LDB4NjUsMHg3MywweDc0LDB4MzIsMHgwMCwweDAwLDB4MDAsMHg5RSwweEZGLDB4RkYsMHhGRiwweDAzLDB4MDAsMHgxMCwweDAwLDB4MjAsMHgwMCwweDAwLDB4MDAsCi0gICAgICAweDBDLDB4MDAsMHgwMCwweDAwLDB4MDQsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDY4LDB4RkQsMHhGRiwweEZGLDB4MDAsMHgwMCwweDAwLDB4MEMsCi0gICAgICAweDA4LDB4MDAsMHgwMCwweDAwLDB4MDEsMHgwMCwweDAwLDB4MDAsMHgwNSwweDAwLDB4MDAsMHgwMCwweDc0LDB4NjUsMHg3MywweDc0LDB4MzEsMHgwMCwweDAwLDB4MDAsCi0gICAgICAweEVBLDB4RkQsMHhGRiwweEZGLDB4MDAsMHgwMCwweDAyLDB4MDAsMHgwOCwweDAwLDB4MDQsMHgwMCwweDFDLDB4MDAsMHgwMCwweDAwLDB4MEMsMHgwMCwweDAwLDB4MDAsCi0gICAgICAweDA0LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHhFOCwweEZBLDB4RkYsMHhGRiwweDAwLDB4MDAsMHgwMCwweDBCLDB4MDEsMHgwMCwweDAwLDB4MDAsCi0gICAgICAweDAxLDB4MDAsMHgwMCwweDAwLDB4N0EsMHgwMCwweDFBLDB4MDAsMHgxNCwweDAwLDB4MDgsMHgwMCwweDBDLDB4MDAsMHgwNCwweDAwLDB4MDYsMHgwMCwweDAwLDB4MDAsCi0gICAgICAweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MTAsMHgwMCwweDFBLDB4MDAsMHgwMCwweDAwLDB4MDEsMHgwMCwweDA0LDB4MDAsCi0gICAgICAweDFDLDB4MDAsMHgwMCwweDAwLDB4MEMsMHgwMCwweDAwLDB4MDAsMHgwNCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MkMsMHhGQiwweEZGLDB4RkYsCi0gICAgICAweDAwLDB4MDAsMHgwMCwweDBCLDB4MDEsMHgwMCwweDAwLDB4MDAsMHgwMSwweDAwLDB4MDAsMHgwMCwweDc5LDB4MDAsMHgwMCwweDAwLDB4NkUsMHhGQiwweEZGLDB4RkYsCi0gICAgICAweDFDLDB4MDAsMHgwMCwweDAwLDB4MEMsMHgwMCwweDAwLDB4MDAsMHgwNCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4NTQsMHhGQiwweEZGLDB4RkYsCi0gICAgICAweDAwLDB4MDAsMHgwMCwweDBCLDB4MDEsMHgwMCwweDAwLDB4MDAsMHgwMSwweDAwLDB4MDAsMHgwMCwweDc4LDB4MDAsMHgwMCwweDAwLDB4MTQsMHgwMCwweDFDLDB4MDAsCi0gICAgICAweDA0LDB4MDAsMHgwOCwweDAwLDB4MDAsMHgwMCwweDBDLDB4MDAsMHgwMCwweDAwLDB4MTAsMHgwMCwweDE0LDB4MDAsMHgxOCwweDAwLDB4MTQsMHgwMCwweDAwLDB4MDAsCi0gICAgICAweDgwLDB4MDAsMHgwMCwweDAwLDB4NzQsMHgwMCwweDAwLDB4MDAsMHgwMSwweDAwLDB4MDAsMHgwMCwweDEwLDB4MDAsMHgwMCwweDAwLDB4MDgsMHgwMCwweDAwLDB4MDAsCi0gICAgICAweDMwLDB4MDIsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMiwweDAwLDB4MDAsMHgwMCwweDMwLDB4MDAsMHgwMCwweDAwLDB4MDQsMHgwMCwweDAwLDB4MDAsCi0gICAgICAweEUwLDB4RkYsMHhGRiwweEZGLDB4MTAsMHgwMCwweDAwLDB4MDAsMHgwNCwweDAwLDB4MDAsMHgwMCwweDAxLDB4MDAsMHgwMCwweDAwLDB4MzAsMHgwMCwweDAwLDB4MDAsCi0gICAgICAweDA3LDB4MDAsMHgwMCwweDAwLDB4NzAsMHg3MiwweDY5LDB4NzYsMHg2MSwweDc0LDB4NjUsMHgwMCwweDA4LDB4MDAsMHgwQywweDAwLDB4MDQsMHgwMCwweDA4LDB4MDAsCi0gICAgICAweDA4LDB4MDAsMHgwMCwweDAwLDB4MTAsMHgwMCwweDAwLDB4MDAsMHgwNCwweDAwLDB4MDAsMHgwMCwweDAxLDB4MDAsMHgwMCwweDAwLDB4MzAsMHgwMCwweDAwLDB4MDAsCi0gICAgICAweDBFLDB4MDAsMHgwMCwweDAwLDB4NjMsMHg3MywweDY4LDB4NjEsMHg3MiwweDcwLDB4NUYsMHg3MCwweDYxLDB4NzIsMHg3NCwweDY5LDB4NjEsMHg2QywweDAwLDB4MDAsCi0gICAgICAweDAxLDB4MDAsMHgwMCwweDAwLDB4NEMsMHgwMCwweDAwLDB4MDAsMHgyNiwweDAwLDB4MDAsMHgwMCwweDRELDB4NzksMHg0NywweDYxLDB4NkQsMHg2NSwweDJFLDB4NDUsCi0gICAgICAweDc4LDB4NjEsMHg2RCwweDcwLDB4NkMsMHg2NSwweDJFLDB4NTQsMHg2NSwweDczLDB4NzQsMHg1MywweDY5LDB4NkQsMHg3MCwweDZDLDB4NjUsMHg1NCwweDYxLDB4NjIsCi0gICAgICAweDZDLDB4NjUsMHg1NywweDY5LDB4NzQsMHg2OCwweDQ1LDB4NkUsMHg3NSwweDZELDB4MDAsMHgwMCwweDAwLDB4MDAsMHgxQSwweDAwLDB4MUMsMHgwMCwweDA4LDB4MDAsCi0gICAgICAweDBDLDB4MDAsMHgwMCwweDAwLDB4MDYsMHgwMCwweDE0LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDEwLDB4MDAsCi0gICAgICAweDFBLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDA0LDB4MDAsMHgzQywweDAwLDB4MDAsMHgwMCwweDI0LDB4MDAsMHgwMCwweDAwLDB4MEMsMHgwMCwweDAwLDB4MDAsCi0gICAgICAweDAyLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDEwLDB4MDAsMHgxNCwweDAwLDB4MDcsMHgwMCwweDAwLDB4MDAsCi0gICAgICAweDA4LDB4MDAsMHgwMCwweDAwLDB4MEMsMHgwMCwweDEwLDB4MDAsMHgxMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDA0LDB4MDMsMHgwMCwweDAwLDB4MDAsCi0gICAgICAweDAxLDB4MDAsMHgwMCwweDAwLDB4MDEsMHgwMCwweDAwLDB4MDAsMHgwNSwweDAwLDB4MDAsMHgwMCwweDYzLDB4NkYsMHg2QywweDZGLDB4NzIsMHgwMCwweDAwLDB4MDAsCi0gICAgICAweDU0LDB4RkQsMHhGRiwweEZGLDB4MDAsMHgwMCwweDAwLDB4MDEsMHgyOCwweDAwLDB4MDAsMHgwMCwweDE4LDB4MDAsMHgwMCwweDAwLDB4MDIsMHgwMCwweDAwLDB4MDAsCi0gICAgICAweDA0LDB4MDAsMHgwMCwweDAwLDB4MDgsMHgwMCwweDAwLDB4MDAsMHgxMCwweDAxLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDIsMHgwMCwweDAwLDB4MDAsCi0gICAgICAweDc0LDB4MDAsMHgwMCwweDAwLDB4M0MsMHgwMCwweDAwLDB4MDAsMHgxMywweDAwLDB4MDAsMHgwMCwweDRELDB4NzksMHg0NywweDYxLDB4NkQsMHg2NSwweDJFLDB4NDUsCi0gICAgICAweDc4LDB4NjEsMHg2RCwweDcwLDB4NkMsMHg2NSwweDJFLDB4NTQsMHg2NSwweDczLDB4NzQsMHgwMCwweDAwLDB4MDAsMHgxRSwweDAwLDB4MTgsMHgwMCwweDBDLDB4MDAsCi0gICAgICAweDEwLDB4MDAsMHgwNiwweDAwLDB4MDgsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDE0LDB4MDAsCi0gICAgICAweDAwLDB4MDAsMHgwQSwweDAwLDB4MUUsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDEsMHgwMCwweDAyLDB4MDAsMHgwMSwweDAwLDB4MjAsMHgwMCwweDAwLDB4MDAsCi0gICAgICAweDBDLDB4MDAsMHgwMCwweDAwLDB4MDQsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweEQ0LDB4RkYsMHhGRiwweEZGLDB4MDAsMHgwMCwweDAwLDB4MDMsCi0gICAgICAweDAxLDB4MDAsMHgwMCwweDAwLDB4MDEsMHgwMCwweDAwLDB4MDAsMHgwMSwweDAwLDB4MDAsMHgwMCwweDYyLDB4MDAsMHgwMCwweDAwLDB4NjIsMHhGRCwweEZGLDB4RkYsCi0gICAgICAweDMwLDB4MDAsMHgwMCwweDAwLDB4MUMsMHgwMCwweDAwLDB4MDAsMHgwNCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MTAsMHgwMCwweDEwLDB4MDAsCi0gICAgICAweDA3LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwOCwweDAwLDB4MEMsMHgwMCwweDEwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDUsCi0gICAgICAweDAyLDB4MDAsMHgwMCwweDAwLDB4MDEsMHgwMCwweDAwLDB4MDAsMHgwMSwweDAwLDB4MDAsMHgwMCwweDYxLDB4MDAsMHgwMCwweDAwLDB4RTQsMHhGRSwweEZGLDB4RkYsCi0gICAgICAweDFDLDB4MDAsMHgwMCwweDAwLDB4MTQsMHgwMCwweDAwLDB4MDAsMHgwMSwweDAwLDB4MDAsMHgwMCwweDA4LDB4MDAsMHgwMCwweDAwLDB4NDAsMHgwMCwweDAwLDB4MDAsCi0gICAgICAweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgxNywweDAwLDB4MDAsMHgwMCwweDRELDB4NzksMHg0NywweDYxLDB4NkQsMHg2NSwweDJFLDB4NDUsCi0gICAgICAweDc4LDB4NjEsMHg2RCwweDcwLDB4NkMsMHg2NSwweDMyLDB4MkUsMHg0RCwweDZGLDB4NkUsMHg3MywweDc0LDB4NjUsMHg3MiwweDAwLDB4MjAsMHhGRiwweEZGLDB4RkYsCi0gICAgICAweDM0LDB4MDAsMHgwMCwweDAwLDB4MkMsMHgwMCwweDAwLDB4MDAsMHgwMSwweDAwLDB4MDAsMHgwMCwweDIwLDB4MDAsMHgwMCwweDAwLDB4MDQsMHgwMCwweDAwLDB4MDAsCi0gICAgICAweDEyLDB4MDAsMHgwMCwweDAwLDB4MkYsMHgyRiwweDZELDB4NkYsMHg2RSwweDczLDB4NzQsMHg2NSwweDcyLDB4NUYsMHg3NCwweDY1LDB4NzMsMHg3NCwweDJFLDB4NjYsCi0gICAgICAweDYyLDB4NzMsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDE4LDB4MDAsMHgwMCwweDAwLDB4NEQsMHg3OSwweDQ3LDB4NjEsCi0gICAgICAweDZELDB4NjUsMHgyRSwweDQ5LDB4NkUsMHg1MCwweDYxLDB4NzIsMHg2NSwweDZFLDB4NzQsMHg0RSwweDYxLDB4NkQsMHg2NSwweDczLDB4NzAsMHg2MSwweDYzLDB4NjUsCi0gICAgICAweDAwLDB4MDAsMHgwMCwweDAwLDB4NzgsMHhGRiwweEZGLDB4RkYsMHg0OCwweDAwLDB4MDAsMHgwMCwweDNDLDB4MDAsMHgwMCwweDAwLDB4MDEsMHgwMCwweDAwLDB4MDAsCi0gICAgICAweDMwLDB4MDAsMHgwMCwweDAwLDB4MDQsMHgwMCwweDAwLDB4MDAsMHgyMCwweDAwLDB4MDAsMHgwMCwweDJGLDB4MkYsMHg2OSwweDZFLDB4NjMsMHg2QywweDc1LDB4NjQsCi0gICAgICAweDY1LDB4NUYsMHg3NCwweDY1LDB4NzMsMHg3NCwweDJGLDB4NjksMHg2RSwweDYzLDB4NkMsMHg3NSwweDY0LDB4NjUsMHg1RiwweDc0LDB4NjUsMHg3MywweDc0LDB4MzEsCi0gICAgICAweDJFLDB4NjYsMHg2MiwweDczLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAxLDB4MDAsMHgwMCwweDAwLDB4MTAsMHgwMCwweDAwLDB4MDAsCi0gICAgICAweDA2LDB4MDAsMHgwMCwweDAwLDB4NTQsMHg2MSwweDYyLDB4NkMsMHg2NSwweDQxLDB4MDAsMHgwMCwweDc0LDB4RkYsMHhGRiwweEZGLDB4MDAsMHgwMSwweDA0LDB4MDAsCi0gICAgICAweDIwLDB4MDAsMHgwMCwweDAwLDB4MEMsMHgwMCwweDAwLDB4MDAsMHgwNCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4NTgsMHhGRiwweEZGLDB4RkYsCi0gICAgICAweDAwLDB4MDAsMHgwMCwweDBGLDB4MEIsMHgwMCwweDAwLDB4MDAsMHgwMSwweDAwLDB4MDAsMHgwMCwweDAxLDB4MDAsMHgwMCwweDAwLDB4NjIsMHgwMCwweDAwLDB4MDAsCi0gICAgICAweDE0LDB4MDAsMHgxOCwweDAwLDB4MDQsMHgwMCwweDA4LDB4MDAsMHgwMCwweDAwLDB4MEMsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MTAsMHgwMCwweDE0LDB4MDAsCi0gICAgICAweDE0LDB4MDAsMHgwMCwweDAwLDB4MjAsMHgwMCwweDAwLDB4MDAsMHgxNCwweDAwLDB4MDAsMHgwMCwweDAxLDB4MDAsMHgwMCwweDAwLDB4MDgsMHgwMCwweDAwLDB4MDAsCi0gICAgICAweEM0LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMSwweDAwLDB4MDAsMHgwMCwweDQ0LDB4MDAsMHgwMCwweDAwLDB4MUMsMHgwMCwweDAwLDB4MDAsCi0gICAgICAweDRELDB4NzksMHg0NywweDYxLDB4NkQsMHg2NSwweDJFLDB4NEYsMHg3NCwweDY4LDB4NjUsMHg3MiwweDRFLDB4NjEsMHg2RCwweDY1LDB4NTMsMHg3MCwweDYxLDB4NjMsCi0gICAgICAweDY1LDB4MkUsMHg1NCwweDYxLDB4NjIsMHg2QywweDY1LDB4NDIsMHgwMCwweDAwLDB4MDAsMHgwMCwweDFDLDB4MDAsMHgxNCwweDAwLDB4MDgsMHgwMCwweDBDLDB4MDAsCi0gICAgICAweDAwLDB4MDAsMHgwNiwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MTAsMHgwMCwweDA1LDB4MDAsCi0gICAgICAweDFDLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMSwweDA0LDB4MDAsMHgzMCwweDAwLDB4MDAsMHgwMCwweDFDLDB4MDAsMHgwMCwweDAwLDB4MDQsMHgwMCwweDAwLDB4MDAsCi0gICAgICAweDAwLDB4MDAsMHgwMCwweDAwLDB4MTAsMHgwMCwweDEwLDB4MDAsMHgwNywweDAwLDB4MDAsMHgwMCwweDA4LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDBDLDB4MDAsCi0gICAgICAweDEwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MEYsMHgwRCwweDAwLDB4MDAsMHgwMCwweDAxLDB4MDAsMHgwMCwweDAwLDB4MDEsMHgwMCwweDAwLDB4MDAsCi0gICAgICAweDYxLDB4MDAsMHgwMCwweDAwLDB4MTQsMHgwMCwweDIwLDB4MDAsMHgwOCwweDAwLDB4MEMsMHgwMCwweDA3LDB4MDAsMHgxMCwweDAwLDB4MTQsMHgwMCwweDAwLDB4MDAsCi0gICAgICAweDE4LDB4MDAsMHgxQywweDAwLDB4MTQsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMSwweDUwLDB4MDAsMHgwMCwweDAwLDB4NDQsMHgwMCwweDAwLDB4MDAsCi0gICAgICAweDA0LDB4MDAsMHgwMCwweDAwLDB4MDQsMHgwMCwweDAwLDB4MDAsMHgzNCwweDAwLDB4MDAsMHgwMCwweDA0LDB4MDAsMHgwMCwweDAwLDB4MjQsMHgwMCwweDAwLDB4MDAsCi0gICAgICAweDJGLDB4MkYsMHg2OSwweDZFLDB4NjMsMHg2QywweDc1LDB4NjQsMHg2NSwweDVGLDB4NzQsMHg2NSwweDczLDB4NzQsMHgyRiwweDczLDB4NzUsMHg2MiwweDJGLDB4NjksCi0gICAgICAweDZFLDB4NjMsMHg2QywweDc1LDB4NjQsMHg2NSwweDVGLDB4NzQsMHg2NSwweDczLDB4NzQsMHgzMiwweDJFLDB4NjYsMHg2MiwweDczLDB4MDAsMHgwMCwweDAwLDB4MDAsCi0gICAgICAweDAwLDB4MDAsMHgwMCwweDAwLDB4MDEsMHgwMCwweDAwLDB4MDAsMHg0MCwweDAwLDB4MDAsMHgwMCwweDFDLDB4MDAsMHgwMCwweDAwLDB4NEQsMHg3OSwweDQ3LDB4NjEsCi0gICAgICAweDZELDB4NjUsMHgyRSwweDRGLDB4NzQsMHg2OCwweDY1LDB4NzIsMHg0RSwweDYxLDB4NkQsMHg2NSwweDUzLDB4NzAsMHg2MSwweDYzLDB4NjUsMHgyRSwweDU1LDB4NkUsCi0gICAgICAweDc1LDB4NzMsMHg2NSwweDY0LDB4MDAsMHgwMCwweDFBLDB4MDAsMHgxMCwweDAwLDB4MDQsMHgwMCwweDA4LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCi0gICAgICAweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MEMsMHgwMCwweDFBLDB4MDAsMHgwMCwweDAwLDB4MkMsMHgwMCwweDAwLDB4MDAsCi0gICAgICAweDFDLDB4MDAsMHgwMCwweDAwLDB4MDQsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDEwLDB4MDAsMHgwQywweDAwLDB4MDcsMHgwMCwweDAwLDB4MDAsCi0gICAgICAweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDA4LDB4MDAsMHgxMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDA3LDB4MDEsMHgwMCwweDAwLDB4MDAsCi0gICAgICAweDAxLDB4MDAsMHgwMCwweDAwLDB4NjEsMHgwMCwweDAwLDB4MDAKKyAgICAgIDB4NzYsMHhGQiwweEZGLDB4RkYsMHgwMSwweDAwLDB4MDYsMHgwMCwweDIwLDB4MDAsMHgwMCwweDAwLDB4MEMsMHgwMCwweDAwLDB4MDAsMHgwNCwweDAwLDB4MDAsMHgwMCwKKyAgICAgIDB4MDAsMHgwMCwweDAwLDB4MDAsMHg0MCwweEY5LDB4RkYsMHhGRiwweDAwLDB4MDAsMHgwMCwweDA5LDB4MDgsMHgwMCwweDAwLDB4MDAsMHgwMSwweDAwLDB4MDAsMHgwMCwKKyAgICAgIDB4MDMsMHgwMCwweDAwLDB4MDAsMHg3NiwweDYxLDB4NkMsMHgwMCwweEI4LDB4RjcsMHhGRiwweEZGLDB4MDAsMHgwMSwweDA0LDB4MDAsMHgxQywweDAwLDB4MDAsMHgwMCwKKyAgICAgIDB4MEMsMHgwMCwweDAwLDB4MDAsMHgwNCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4QjgsMHhGNiwweEZGLDB4RkYsMHgwMCwweDAwLDB4MDAsMHgwRCwKKyAgICAgIDB4MDEsMHgwMCwweDAwLDB4MDAsMHgwMiwweDAwLDB4MDAsMHgwMCwweDY5LDB4NjQsMHgwMCwweDAwLDB4ODgsMHhGNywweEZGLDB4RkYsMHgwMCwweDAwLDB4MDAsMHgwMSwKKyAgICAgIDB4MjQsMHgwMCwweDAwLDB4MDAsMHgxOCwweDAwLDB4MDAsMHgwMCwweDA0LDB4MDAsMHgwMCwweDAwLDB4MTQsMHgwMCwweDAwLDB4MDAsMHgwOCwweDAwLDB4MDAsMHgwMCwKKyAgICAgIDB4REMsMHgwNiwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAxLDB4MDAsMHgwMCwweDAwLDB4MzAsMHgwMCwweDAwLDB4MDAsMHgyNywweDAwLDB4MDAsMHgwMCwKKyAgICAgIDB4NEQsMHg3OSwweDQ3LDB4NjEsMHg2RCwweDY1LDB4MkUsMHg0NSwweDc4LDB4NjEsMHg2RCwweDcwLDB4NkMsMHg2NSwweDJFLDB4NTMsMHg3NCwweDcyLDB4NzUsMHg2MywKKyAgICAgIDB4NzQsMHg0RiwweDY2LDB4NTMsMHg3NCwweDcyLDB4NzUsMHg2MywweDc0LDB4NzMsMHg0RiwweDY2LDB4NTMsMHg3NCwweDcyLDB4NzUsMHg2MywweDc0LDB4NzMsMHgwMCwKKyAgICAgIDB4RjQsMHhGRSwweEZGLDB4RkYsMHgwMCwweDAwLDB4MDAsMHgwMSwweDIwLDB4MDAsMHgwMCwweDAwLDB4MEMsMHgwMCwweDAwLDB4MDAsMHgwNCwweDAwLDB4MDAsMHgwMCwKKyAgICAgIDB4MDAsMHgwMCwweDAwLDB4MDAsMHgyMCwweEY4LDB4RkYsMHhGRiwweDAwLDB4MDAsMHgwMCwweDBGLDB4MDQsMHgwMCwweDAwLDB4MDAsMHgwMSwweDAwLDB4MDAsMHgwMCwKKyAgICAgIDB4MDEsMHgwMCwweDAwLDB4MDAsMHg2MSwweDAwLDB4MDAsMHgwMCwweDEwLDB4RjgsMHhGRiwweEZGLDB4MDAsMHgwMCwweDAwLDB4MDEsMHgyQywweDAwLDB4MDAsMHgwMCwKKyAgICAgIDB4MTgsMHgwMCwweDAwLDB4MDAsMHgwNCwweDAwLDB4MDAsMHgwMCwweDE0LDB4MDAsMHgwMCwweDAwLDB4MDgsMHgwMCwweDAwLDB4MDAsMHg1NCwweDA2LDB4MDAsMHgwMCwKKyAgICAgIDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMywweDAwLDB4MDAsMHgwMCwweEQwLDB4MDAsMHgwMCwweDAwLDB4N0MsMHgwMCwweDAwLDB4MDAsMHgyOCwweDAwLDB4MDAsMHgwMCwKKyAgICAgIDB4MUUsMHgwMCwweDAwLDB4MDAsMHg0RCwweDc5LDB4NDcsMHg2MSwweDZELDB4NjUsMHgyRSwweDQ1LDB4NzgsMHg2MSwweDZELDB4NzAsMHg2QywweDY1LDB4MkUsMHg1MywKKyAgICAgIDB4NzQsMHg3MiwweDc1LDB4NjMsMHg3NCwweDRGLDB4NjYsMHg1MywweDc0LDB4NzIsMHg3NSwweDYzLDB4NzQsMHg3MywweDAwLDB4MDAsMHhDQywweEZGLDB4RkYsMHhGRiwKKyAgICAgIDB4MDAsMHgwMCwweDAwLDB4MDEsMHgwMiwweDAwLDB4MEMsMHgwMCwweDIwLDB4MDAsMHgwMCwweDAwLDB4MEMsMHgwMCwweDAwLDB4MDAsMHgwNCwweDAwLDB4MDAsMHgwMCwKKyAgICAgIDB4MDAsMHgwMCwweDAwLDB4MDAsMHhBQywweEY4LDB4RkYsMHhGRiwweDAwLDB4MDAsMHgwMCwweDBGLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMSwweDAwLDB4MDAsMHgwMCwKKyAgICAgIDB4MDEsMHgwMCwweDAwLDB4MDAsMHg2MywweDAwLDB4MDAsMHgwMCwweDFDLDB4MDAsMHgxOCwweDAwLDB4MEMsMHgwMCwweDEwLDB4MDAsMHgwOCwweDAwLDB4MEEsMHgwMCwKKyAgICAgIDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MTQsMHgwMCwweDA3LDB4MDAsMHgxQywweDAwLDB4MDAsMHgwMCwKKyAgICAgIDB4MDAsMHgwMCwweDAwLDB4MDEsMHgwMSwweDAwLDB4MDgsMHgwMCwweDIwLDB4MDAsMHgwMCwweDAwLDB4MEMsMHgwMCwweDAwLDB4MDAsMHgwNCwweDAwLDB4MDAsMHgwMCwKKyAgICAgIDB4MDAsMHgwMCwweDAwLDB4MDAsMHhGQywweEY4LDB4RkYsMHhGRiwweDAwLDB4MDAsMHgwMCwweDBGLDB4MDYsMHgwMCwweDAwLDB4MDAsMHgwMSwweDAwLDB4MDAsMHgwMCwKKyAgICAgIDB4MDEsMHgwMCwweDAwLDB4MDAsMHg2MiwweDAwLDB4MDAsMHgwMCwweDFDLDB4MDAsMHgxNCwweDAwLDB4MDgsMHgwMCwweDBDLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKyAgICAgIDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MTAsMHgwMCwweDA3LDB4MDAsMHgxQywweDAwLDB4MDAsMHgwMCwKKyAgICAgIDB4MDAsMHgwMCwweDAwLDB4MDEsMHgyMCwweDAwLDB4MDAsMHgwMCwweDBDLDB4MDAsMHgwMCwweDAwLDB4MDQsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKyAgICAgIDB4NDgsMHhGOSwweEZGLDB4RkYsMHgwMCwweDAwLDB4MDAsMHgwRiwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDEsMHgwMCwweDAwLDB4MDAsMHgwMSwweDAwLDB4MDAsMHgwMCwKKyAgICAgIDB4NjEsMHgwMCwweDAwLDB4MDAsMHgzOCwweEY5LDB4RkYsMHhGRiwweDAwLDB4MDAsMHgwMCwweDAxLDB4MjgsMHgwMCwweDAwLDB4MDAsMHgxOCwweDAwLDB4MDAsMHgwMCwKKyAgICAgIDB4MDQsMHgwMCwweDAwLDB4MDAsMHgwOCwweDAwLDB4MDAsMHgwMCwweDA4LDB4MDAsMHgwMCwweDAwLDB4MkMsMHgwNSwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKyAgICAgIDB4MDIsMHgwMCwweDAwLDB4MDAsMHgyNCwweDAwLDB4MDAsMHgwMCwweDZDLDB4MDAsMHgwMCwweDAwLDB4MTYsMHgwMCwweDAwLDB4MDAsMHg0RCwweDc5LDB4NDcsMHg2MSwKKyAgICAgIDB4NkQsMHg2NSwweDJFLDB4NDUsMHg3OCwweDYxLDB4NkQsMHg3MCwweDZDLDB4NjUsMHgyRSwweDQxLDB4NjIsMHg2OSwweDZDLDB4NjksMHg3NCwweDc5LDB4MDAsMHgwMCwKKyAgICAgIDB4Q0UsMHhGRCwweEZGLDB4RkYsMHgwMSwweDAwLDB4MDQsMHgwMCwweDFDLDB4MDAsMHgwMCwweDAwLDB4MEMsMHgwMCwweDAwLDB4MDAsMHgwNCwweDAwLDB4MDAsMHgwMCwKKyAgICAgIDB4MDAsMHgwMCwweDAwLDB4MDAsMHhFMCwweEY4LDB4RkYsMHhGRiwweDAwLDB4MDAsMHgwMCwweDA4LDB4MDEsMHgwMCwweDAwLDB4MDAsMHgwOCwweDAwLDB4MDAsMHgwMCwKKyAgICAgIDB4NjQsMHg2OSwweDczLDB4NzQsMHg2MSwweDZFLDB4NjMsMHg2NSwweDAwLDB4MDAsMHgxQSwweDAwLDB4MTgsMHgwMCwweDA4LDB4MDAsMHgwQywweDAwLDB4MDAsMHgwMCwKKyAgICAgIDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwNywweDAwLDB4MTAsMHgwMCwweDE0LDB4MDAsMHgxQSwweDAwLDB4MDAsMHgwMCwKKyAgICAgIDB4MDAsMHgwMCwweDAwLDB4MDEsMHg0NCwweDAwLDB4MDAsMHgwMCwweDM0LDB4MDAsMHgwMCwweDAwLDB4MEMsMHgwMCwweDAwLDB4MDAsMHgwNCwweDAwLDB4MDAsMHgwMCwKKyAgICAgIDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMSwweDAwLDB4MDAsMHgwMCwweDA0LDB4MDAsMHgwMCwweDAwLDB4NzAsMHhGRCwweEZGLDB4RkYsMHgxMCwweDAwLDB4MDAsMHgwMCwKKyAgICAgIDB4MDQsMHgwMCwweDAwLDB4MDAsMHgwMSwweDAwLDB4MDAsMHgwMCwweDMwLDB4MDAsMHgwMCwweDAwLDB4MDMsMHgwMCwweDAwLDB4MDAsMHg2QiwweDY1LDB4NzksMHgwMCwKKyAgICAgIDB4NTQsMHhGOSwweEZGLDB4RkYsMHgwMCwweDAwLDB4MDAsMHgwOCwweDAxLDB4MDAsMHgwMCwweDAwLDB4MDIsMHgwMCwweDAwLDB4MDAsMHg2OSwweDY0LDB4MDAsMHgwMCwKKyAgICAgIDB4MTQsMHgwMCwweDI0LDB4MDAsMHgwOCwweDAwLDB4MEMsMHgwMCwweDA3LDB4MDAsMHgxMCwweDAwLDB4MTQsMHgwMCwweDE4LDB4MDAsMHgxQywweDAwLDB4MjAsMHgwMCwKKyAgICAgIDB4MTQsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMSwweDY4LDB4MDAsMHgwMCwweDAwLDB4NDgsMHgwMCwweDAwLDB4MDAsMHgwOCwweDAwLDB4MDAsMHgwMCwKKyAgICAgIDB4MjAsMHgwMCwweDAwLDB4MDAsMHgxMCwweDAwLDB4MDAsMHgwMCwweDA4LDB4MDAsMHgwMCwweDAwLDB4MjgsMHgwNCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKyAgICAgIDB4MDEsMHgwMCwweDAwLDB4MDAsMHgwNCwweDAwLDB4MDAsMHgwMCwweEU0LDB4RkQsMHhGRiwweEZGLDB4MTAsMHgwMCwweDAwLDB4MDAsMHgwNCwweDAwLDB4MDAsMHgwMCwKKyAgICAgIDB4MDEsMHgwMCwweDAwLDB4MDAsMHgzOCwweDAwLDB4MDAsMHgwMCwweDBCLDB4MDAsMHgwMCwweDAwLDB4NjYsMHg2RiwweDcyLDB4NjMsMHg2NSwweDVGLDB4NjEsMHg2QywKKyAgICAgIDB4NjksMHg2NywweDZFLDB4MDAsMHgwNiwweDAwLDB4MDAsMHgwMCwweEM0LDB4MDAsMHgwMCwweDAwLDB4ODQsMHgwMCwweDAwLDB4MDAsMHg0OCwweDAwLDB4MDAsMHgwMCwKKyAgICAgIDB4NjAsMHgwMSwweDAwLDB4MDAsMHgzMCwweDAxLDB4MDAsMHgwMCwweEU0LDB4MDAsMHgwMCwweDAwLDB4MTMsMHgwMCwweDAwLDB4MDAsMHg0RCwweDc5LDB4NDcsMHg2MSwKKyAgICAgIDB4NkQsMHg2NSwweDJFLDB4NDUsMHg3OCwweDYxLDB4NkQsMHg3MCwweDZDLDB4NjUsMHgyRSwweDU2LDB4NjUsMHg2MywweDMzLDB4MDAsMHgwMCwweDAwLDB4MUUsMHgwMCwKKyAgICAgIDB4MTgsMHgwMCwweDBDLDB4MDAsMHgxMCwweDAwLDB4MDYsMHgwMCwweDA4LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKyAgICAgIDB4MDAsMHgwMCwweDE0LDB4MDAsMHgwNSwweDAwLDB4MEEsMHgwMCwweDFFLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMSwweDA1LDB4MDAsMHgxQSwweDAwLDB4MDIsMHgwMCwKKyAgICAgIDB4MjAsMHgwMCwweDAwLDB4MDAsMHgwQywweDAwLDB4MDAsMHgwMCwweDA0LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgyNCwweEZCLDB4RkYsMHhGRiwKKyAgICAgIDB4MDAsMHgwMCwweDAwLDB4MEYsMHgwNiwweDAwLDB4MDAsMHgwMCwweDAxLDB4MDAsMHgwMCwweDAwLDB4MDUsMHgwMCwweDAwLDB4MDAsMHg3NCwweDY1LDB4NzMsMHg3NCwKKyAgICAgIDB4MzMsMHgwMCwweDAwLDB4MDAsMHg3QSwweEZELDB4RkYsMHhGRiwweDAwLDB4MDAsMHgwNCwweDAwLDB4MTgsMHgwMCwweDAxLDB4MDAsMHgyNCwweDAwLDB4MDAsMHgwMCwKKyAgICAgIDB4MEMsMHgwMCwweDAwLDB4MDAsMHgwNCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MTAsMHhGRSwweEZGLDB4RkYsMHgwMCwweDAwLDB4MDAsMHgwNCwKKyAgICAgIDB4MDMsMHgwMCwweDAwLDB4MDAsMHgwMSwweDAwLDB4MDAsMHgwMCwweDAxLDB4MDAsMHgwMCwweDAwLDB4MDUsMHgwMCwweDAwLDB4MDAsMHg3NCwweDY1LDB4NzMsMHg3NCwKKyAgICAgIDB4MzIsMHgwMCwweDAwLDB4MDAsMHg5RSwweEZGLDB4RkYsMHhGRiwweDAzLDB4MDAsMHgxMCwweDAwLDB4MjAsMHgwMCwweDAwLDB4MDAsMHgwQywweDAwLDB4MDAsMHgwMCwKKyAgICAgIDB4MDQsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDY4LDB4RkQsMHhGRiwweEZGLDB4MDAsMHgwMCwweDAwLDB4MEMsMHgwOCwweDAwLDB4MDAsMHgwMCwKKyAgICAgIDB4MDEsMHgwMCwweDAwLDB4MDAsMHgwNSwweDAwLDB4MDAsMHgwMCwweDc0LDB4NjUsMHg3MywweDc0LDB4MzEsMHgwMCwweDAwLDB4MDAsMHhFQSwweEZELDB4RkYsMHhGRiwKKyAgICAgIDB4MDAsMHgwMCwweDAyLDB4MDAsMHgwOCwweDAwLDB4MDQsMHgwMCwweDFDLDB4MDAsMHgwMCwweDAwLDB4MEMsMHgwMCwweDAwLDB4MDAsMHgwNCwweDAwLDB4MDAsMHgwMCwKKyAgICAgIDB4MDAsMHgwMCwweDAwLDB4MDAsMHhFOCwweEZBLDB4RkYsMHhGRiwweDAwLDB4MDAsMHgwMCwweDBCLDB4MDEsMHgwMCwweDAwLDB4MDAsMHgwMSwweDAwLDB4MDAsMHgwMCwKKyAgICAgIDB4N0EsMHgwMCwweDFBLDB4MDAsMHgxNCwweDAwLDB4MDgsMHgwMCwweDBDLDB4MDAsMHgwNCwweDAwLDB4MDYsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKyAgICAgIDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MTAsMHgwMCwweDFBLDB4MDAsMHgwMCwweDAwLDB4MDEsMHgwMCwweDA0LDB4MDAsMHgxQywweDAwLDB4MDAsMHgwMCwKKyAgICAgIDB4MEMsMHgwMCwweDAwLDB4MDAsMHgwNCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MkMsMHhGQiwweEZGLDB4RkYsMHgwMCwweDAwLDB4MDAsMHgwQiwKKyAgICAgIDB4MDEsMHgwMCwweDAwLDB4MDAsMHgwMSwweDAwLDB4MDAsMHgwMCwweDc5LDB4MDAsMHgwMCwweDAwLDB4NkUsMHhGQiwweEZGLDB4RkYsMHgxQywweDAwLDB4MDAsMHgwMCwKKyAgICAgIDB4MEMsMHgwMCwweDAwLDB4MDAsMHgwNCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4NTQsMHhGQiwweEZGLDB4RkYsMHgwMCwweDAwLDB4MDAsMHgwQiwKKyAgICAgIDB4MDEsMHgwMCwweDAwLDB4MDAsMHgwMSwweDAwLDB4MDAsMHgwMCwweDc4LDB4MDAsMHgwMCwweDAwLDB4MTQsMHgwMCwweDFDLDB4MDAsMHgwNCwweDAwLDB4MDgsMHgwMCwKKyAgICAgIDB4MDAsMHgwMCwweDBDLDB4MDAsMHgwMCwweDAwLDB4MTAsMHgwMCwweDE0LDB4MDAsMHgxOCwweDAwLDB4MTQsMHgwMCwweDAwLDB4MDAsMHg4MCwweDAwLDB4MDAsMHgwMCwKKyAgICAgIDB4NzQsMHgwMCwweDAwLDB4MDAsMHgwMSwweDAwLDB4MDAsMHgwMCwweDEwLDB4MDAsMHgwMCwweDAwLDB4MDgsMHgwMCwweDAwLDB4MDAsMHgzMCwweDAyLDB4MDAsMHgwMCwKKyAgICAgIDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMiwweDAwLDB4MDAsMHgwMCwweDMwLDB4MDAsMHgwMCwweDAwLDB4MDQsMHgwMCwweDAwLDB4MDAsMHhFMCwweEZGLDB4RkYsMHhGRiwKKyAgICAgIDB4MTAsMHgwMCwweDAwLDB4MDAsMHgwNCwweDAwLDB4MDAsMHgwMCwweDAxLDB4MDAsMHgwMCwweDAwLDB4MzAsMHgwMCwweDAwLDB4MDAsMHgwNywweDAwLDB4MDAsMHgwMCwKKyAgICAgIDB4NzAsMHg3MiwweDY5LDB4NzYsMHg2MSwweDc0LDB4NjUsMHgwMCwweDA4LDB4MDAsMHgwQywweDAwLDB4MDQsMHgwMCwweDA4LDB4MDAsMHgwOCwweDAwLDB4MDAsMHgwMCwKKyAgICAgIDB4MTAsMHgwMCwweDAwLDB4MDAsMHgwNCwweDAwLDB4MDAsMHgwMCwweDAxLDB4MDAsMHgwMCwweDAwLDB4MzAsMHgwMCwweDAwLDB4MDAsMHgwRSwweDAwLDB4MDAsMHgwMCwKKyAgICAgIDB4NjMsMHg3MywweDY4LDB4NjEsMHg3MiwweDcwLDB4NUYsMHg3MCwweDYxLDB4NzIsMHg3NCwweDY5LDB4NjEsMHg2QywweDAwLDB4MDAsMHgwMSwweDAwLDB4MDAsMHgwMCwKKyAgICAgIDB4NEMsMHgwMCwweDAwLDB4MDAsMHgyNiwweDAwLDB4MDAsMHgwMCwweDRELDB4NzksMHg0NywweDYxLDB4NkQsMHg2NSwweDJFLDB4NDUsMHg3OCwweDYxLDB4NkQsMHg3MCwKKyAgICAgIDB4NkMsMHg2NSwweDJFLDB4NTQsMHg2NSwweDczLDB4NzQsMHg1MywweDY5LDB4NkQsMHg3MCwweDZDLDB4NjUsMHg1NCwweDYxLDB4NjIsMHg2QywweDY1LDB4NTcsMHg2OSwKKyAgICAgIDB4NzQsMHg2OCwweDQ1LDB4NkUsMHg3NSwweDZELDB4MDAsMHgwMCwweDAwLDB4MDAsMHgxQSwweDAwLDB4MUMsMHgwMCwweDA4LDB4MDAsMHgwQywweDAwLDB4MDAsMHgwMCwKKyAgICAgIDB4MDYsMHgwMCwweDE0LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDEwLDB4MDAsMHgxQSwweDAwLDB4MDAsMHgwMCwKKyAgICAgIDB4MDAsMHgwMCwweDA0LDB4MDAsMHgzQywweDAwLDB4MDAsMHgwMCwweDI0LDB4MDAsMHgwMCwweDAwLDB4MEMsMHgwMCwweDAwLDB4MDAsMHgwMiwweDAwLDB4MDAsMHgwMCwKKyAgICAgIDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDEwLDB4MDAsMHgxNCwweDAwLDB4MDcsMHgwMCwweDAwLDB4MDAsMHgwOCwweDAwLDB4MDAsMHgwMCwKKyAgICAgIDB4MEMsMHgwMCwweDEwLDB4MDAsMHgxMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDA0LDB4MDMsMHgwMCwweDAwLDB4MDAsMHgwMSwweDAwLDB4MDAsMHgwMCwKKyAgICAgIDB4MDEsMHgwMCwweDAwLDB4MDAsMHgwNSwweDAwLDB4MDAsMHgwMCwweDYzLDB4NkYsMHg2QywweDZGLDB4NzIsMHgwMCwweDAwLDB4MDAsMHg1NCwweEZELDB4RkYsMHhGRiwKKyAgICAgIDB4MDAsMHgwMCwweDAwLDB4MDEsMHgyOCwweDAwLDB4MDAsMHgwMCwweDE4LDB4MDAsMHgwMCwweDAwLDB4MDIsMHgwMCwweDAwLDB4MDAsMHgwNCwweDAwLDB4MDAsMHgwMCwKKyAgICAgIDB4MDgsMHgwMCwweDAwLDB4MDAsMHgxMCwweDAxLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDIsMHgwMCwweDAwLDB4MDAsMHg3NCwweDAwLDB4MDAsMHgwMCwKKyAgICAgIDB4M0MsMHgwMCwweDAwLDB4MDAsMHgxMywweDAwLDB4MDAsMHgwMCwweDRELDB4NzksMHg0NywweDYxLDB4NkQsMHg2NSwweDJFLDB4NDUsMHg3OCwweDYxLDB4NkQsMHg3MCwKKyAgICAgIDB4NkMsMHg2NSwweDJFLDB4NTQsMHg2NSwweDczLDB4NzQsMHgwMCwweDAwLDB4MDAsMHgxRSwweDAwLDB4MTgsMHgwMCwweDBDLDB4MDAsMHgxMCwweDAwLDB4MDYsMHgwMCwKKyAgICAgIDB4MDgsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDE0LDB4MDAsMHgwMCwweDAwLDB4MEEsMHgwMCwKKyAgICAgIDB4MUUsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDEsMHgwMCwweDAyLDB4MDAsMHgwMSwweDAwLDB4MjAsMHgwMCwweDAwLDB4MDAsMHgwQywweDAwLDB4MDAsMHgwMCwKKyAgICAgIDB4MDQsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweEQ0LDB4RkYsMHhGRiwweEZGLDB4MDAsMHgwMCwweDAwLDB4MDMsMHgwMSwweDAwLDB4MDAsMHgwMCwKKyAgICAgIDB4MDEsMHgwMCwweDAwLDB4MDAsMHgwMSwweDAwLDB4MDAsMHgwMCwweDYyLDB4MDAsMHgwMCwweDAwLDB4NjIsMHhGRCwweEZGLDB4RkYsMHgzMCwweDAwLDB4MDAsMHgwMCwKKyAgICAgIDB4MUMsMHgwMCwweDAwLDB4MDAsMHgwNCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MTAsMHgwMCwweDEwLDB4MDAsMHgwNywweDAwLDB4MDAsMHgwMCwKKyAgICAgIDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwOCwweDAwLDB4MEMsMHgwMCwweDEwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDUsMHgwMiwweDAwLDB4MDAsMHgwMCwKKyAgICAgIDB4MDEsMHgwMCwweDAwLDB4MDAsMHgwMSwweDAwLDB4MDAsMHgwMCwweDYxLDB4MDAsMHgwMCwweDAwLDB4RTQsMHhGRSwweEZGLDB4RkYsMHgxQywweDAwLDB4MDAsMHgwMCwKKyAgICAgIDB4MTQsMHgwMCwweDAwLDB4MDAsMHgwMSwweDAwLDB4MDAsMHgwMCwweDA4LDB4MDAsMHgwMCwweDAwLDB4NDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKyAgICAgIDB4MDAsMHgwMCwweDAwLDB4MDAsMHgxNywweDAwLDB4MDAsMHgwMCwweDRELDB4NzksMHg0NywweDYxLDB4NkQsMHg2NSwweDJFLDB4NDUsMHg3OCwweDYxLDB4NkQsMHg3MCwKKyAgICAgIDB4NkMsMHg2NSwweDMyLDB4MkUsMHg0RCwweDZGLDB4NkUsMHg3MywweDc0LDB4NjUsMHg3MiwweDAwLDB4MjAsMHhGRiwweEZGLDB4RkYsMHgzNCwweDAwLDB4MDAsMHgwMCwKKyAgICAgIDB4MkMsMHgwMCwweDAwLDB4MDAsMHgwMSwweDAwLDB4MDAsMHgwMCwweDIwLDB4MDAsMHgwMCwweDAwLDB4MDQsMHgwMCwweDAwLDB4MDAsMHgxMiwweDAwLDB4MDAsMHgwMCwKKyAgICAgIDB4MkYsMHgyRiwweDZELDB4NkYsMHg2RSwweDczLDB4NzQsMHg2NSwweDcyLDB4NUYsMHg3NCwweDY1LDB4NzMsMHg3NCwweDJFLDB4NjYsMHg2MiwweDczLDB4MDAsMHgwMCwKKyAgICAgIDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDE4LDB4MDAsMHgwMCwweDAwLDB4NEQsMHg3OSwweDQ3LDB4NjEsMHg2RCwweDY1LDB4MkUsMHg0OSwKKyAgICAgIDB4NkUsMHg1MCwweDYxLDB4NzIsMHg2NSwweDZFLDB4NzQsMHg0RSwweDYxLDB4NkQsMHg2NSwweDczLDB4NzAsMHg2MSwweDYzLDB4NjUsMHgwMCwweDAwLDB4MDAsMHgwMCwKKyAgICAgIDB4NzgsMHhGRiwweEZGLDB4RkYsMHg0OCwweDAwLDB4MDAsMHgwMCwweDNDLDB4MDAsMHgwMCwweDAwLDB4MDEsMHgwMCwweDAwLDB4MDAsMHgzMCwweDAwLDB4MDAsMHgwMCwKKyAgICAgIDB4MDQsMHgwMCwweDAwLDB4MDAsMHgyMCwweDAwLDB4MDAsMHgwMCwweDJGLDB4MkYsMHg2OSwweDZFLDB4NjMsMHg2QywweDc1LDB4NjQsMHg2NSwweDVGLDB4NzQsMHg2NSwKKyAgICAgIDB4NzMsMHg3NCwweDJGLDB4NjksMHg2RSwweDYzLDB4NkMsMHg3NSwweDY0LDB4NjUsMHg1RiwweDc0LDB4NjUsMHg3MywweDc0LDB4MzEsMHgyRSwweDY2LDB4NjIsMHg3MywKKyAgICAgIDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAxLDB4MDAsMHgwMCwweDAwLDB4MTAsMHgwMCwweDAwLDB4MDAsMHgwNiwweDAwLDB4MDAsMHgwMCwKKyAgICAgIDB4NTQsMHg2MSwweDYyLDB4NkMsMHg2NSwweDQxLDB4MDAsMHgwMCwweDc0LDB4RkYsMHhGRiwweEZGLDB4MDAsMHgwMSwweDA0LDB4MDAsMHgyMCwweDAwLDB4MDAsMHgwMCwKKyAgICAgIDB4MEMsMHgwMCwweDAwLDB4MDAsMHgwNCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4NTgsMHhGRiwweEZGLDB4RkYsMHgwMCwweDAwLDB4MDAsMHgwRiwKKyAgICAgIDB4MEMsMHgwMCwweDAwLDB4MDAsMHgwMSwweDAwLDB4MDAsMHgwMCwweDAxLDB4MDAsMHgwMCwweDAwLDB4NjIsMHgwMCwweDAwLDB4MDAsMHgxNCwweDAwLDB4MTgsMHgwMCwKKyAgICAgIDB4MDQsMHgwMCwweDA4LDB4MDAsMHgwMCwweDAwLDB4MEMsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MTAsMHgwMCwweDE0LDB4MDAsMHgxNCwweDAwLDB4MDAsMHgwMCwKKyAgICAgIDB4MjAsMHgwMCwweDAwLDB4MDAsMHgxNCwweDAwLDB4MDAsMHgwMCwweDAxLDB4MDAsMHgwMCwweDAwLDB4MDgsMHgwMCwweDAwLDB4MDAsMHhDNCwweDAwLDB4MDAsMHgwMCwKKyAgICAgIDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMSwweDAwLDB4MDAsMHgwMCwweDQ0LDB4MDAsMHgwMCwweDAwLDB4MUMsMHgwMCwweDAwLDB4MDAsMHg0RCwweDc5LDB4NDcsMHg2MSwKKyAgICAgIDB4NkQsMHg2NSwweDJFLDB4NEYsMHg3NCwweDY4LDB4NjUsMHg3MiwweDRFLDB4NjEsMHg2RCwweDY1LDB4NTMsMHg3MCwweDYxLDB4NjMsMHg2NSwweDJFLDB4NTQsMHg2MSwKKyAgICAgIDB4NjIsMHg2QywweDY1LDB4NDIsMHgwMCwweDAwLDB4MDAsMHgwMCwweDFDLDB4MDAsMHgxNCwweDAwLDB4MDgsMHgwMCwweDBDLDB4MDAsMHgwMCwweDAwLDB4MDYsMHgwMCwKKyAgICAgIDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MTAsMHgwMCwweDA1LDB4MDAsMHgxQywweDAwLDB4MDAsMHgwMCwKKyAgICAgIDB4MDAsMHgwMSwweDA0LDB4MDAsMHgzMCwweDAwLDB4MDAsMHgwMCwweDFDLDB4MDAsMHgwMCwweDAwLDB4MDQsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKyAgICAgIDB4MTAsMHgwMCwweDEwLDB4MDAsMHgwNywweDAwLDB4MDAsMHgwMCwweDA4LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDBDLDB4MDAsMHgxMCwweDAwLDB4MDAsMHgwMCwKKyAgICAgIDB4MDAsMHgwMCwweDAwLDB4MEYsMHgwRSwweDAwLDB4MDAsMHgwMCwweDAxLDB4MDAsMHgwMCwweDAwLDB4MDEsMHgwMCwweDAwLDB4MDAsMHg2MSwweDAwLDB4MDAsMHgwMCwKKyAgICAgIDB4MTQsMHgwMCwweDIwLDB4MDAsMHgwOCwweDAwLDB4MEMsMHgwMCwweDA3LDB4MDAsMHgxMCwweDAwLDB4MTQsMHgwMCwweDAwLDB4MDAsMHgxOCwweDAwLDB4MUMsMHgwMCwKKyAgICAgIDB4MTQsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMSwweDUwLDB4MDAsMHgwMCwweDAwLDB4NDQsMHgwMCwweDAwLDB4MDAsMHgwNCwweDAwLDB4MDAsMHgwMCwKKyAgICAgIDB4MDQsMHgwMCwweDAwLDB4MDAsMHgzNCwweDAwLDB4MDAsMHgwMCwweDA0LDB4MDAsMHgwMCwweDAwLDB4MjQsMHgwMCwweDAwLDB4MDAsMHgyRiwweDJGLDB4NjksMHg2RSwKKyAgICAgIDB4NjMsMHg2QywweDc1LDB4NjQsMHg2NSwweDVGLDB4NzQsMHg2NSwweDczLDB4NzQsMHgyRiwweDczLDB4NzUsMHg2MiwweDJGLDB4NjksMHg2RSwweDYzLDB4NkMsMHg3NSwKKyAgICAgIDB4NjQsMHg2NSwweDVGLDB4NzQsMHg2NSwweDczLDB4NzQsMHgzMiwweDJFLDB4NjYsMHg2MiwweDczLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKyAgICAgIDB4MDEsMHgwMCwweDAwLDB4MDAsMHg0MCwweDAwLDB4MDAsMHgwMCwweDFDLDB4MDAsMHgwMCwweDAwLDB4NEQsMHg3OSwweDQ3LDB4NjEsMHg2RCwweDY1LDB4MkUsMHg0RiwKKyAgICAgIDB4NzQsMHg2OCwweDY1LDB4NzIsMHg0RSwweDYxLDB4NkQsMHg2NSwweDUzLDB4NzAsMHg2MSwweDYzLDB4NjUsMHgyRSwweDU1LDB4NkUsMHg3NSwweDczLDB4NjUsMHg2NCwKKyAgICAgIDB4MDAsMHgwMCwweDFBLDB4MDAsMHgxMCwweDAwLDB4MDQsMHgwMCwweDA4LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKyAgICAgIDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MEMsMHgwMCwweDFBLDB4MDAsMHgwMCwweDAwLDB4MkMsMHgwMCwweDAwLDB4MDAsMHgxQywweDAwLDB4MDAsMHgwMCwKKyAgICAgIDB4MDQsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDEwLDB4MDAsMHgwQywweDAwLDB4MDcsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKyAgICAgIDB4MDAsMHgwMCwweDA4LDB4MDAsMHgxMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDA3LDB4MDEsMHgwMCwweDAwLDB4MDAsMHgwMSwweDAwLDB4MDAsMHgwMCwKKyAgICAgIDB4NjEsMHgwMCwweDAwLDB4MDAKICAgICB9OwogICAgIHJldHVybiBiZmJzRGF0YTsKICAgfQogICBzdGF0aWMgc2l6ZV90IHNpemUoKSB7Ci0gICAgcmV0dXJuIDE0NjQ4OworICAgIHJldHVybiAxNDc4NDsKICAgfQogICBjb25zdCB1aW50OF90ICpiZWdpbigpIHsKICAgICByZXR1cm4gZGF0YSgpOwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvbW9uc3Rlcl90ZXN0X2dlbmVyYXRlZC5oIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvbW9uc3Rlcl90ZXN0X2dlbmVyYXRlZC5oCmluZGV4IGVlYWEzNDEuLmRlYWI3N2IgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL21vbnN0ZXJfdGVzdF9nZW5lcmF0ZWQuaAorKysgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9tb25zdGVyX3Rlc3RfZ2VuZXJhdGVkLmgKQEAgLTYsNiArNiwxNCBAQAogCiAjaW5jbHVkZSAiZmxhdGJ1ZmZlcnMvZmxhdGJ1ZmZlcnMuaCIKICNpbmNsdWRlICJmbGF0YnVmZmVycy9mbGV4YnVmZmVycy5oIgorI2luY2x1ZGUgImZsYXRidWZmZXJzL2ZsZXhfZmxhdF91dGlsLmgiCisKKy8vIEVuc3VyZSB0aGUgaW5jbHVkZWQgZmxhdGJ1ZmZlcnMuaCBpcyB0aGUgc2FtZSB2ZXJzaW9uIGFzIHdoZW4gdGhpcyBmaWxlIHdhcworLy8gZ2VuZXJhdGVkLCBvdGhlcndpc2UgaXQgbWF5IG5vdCBiZSBjb21wYXRpYmxlLgorc3RhdGljX2Fzc2VydChGTEFUQlVGRkVSU19WRVJTSU9OX01BSk9SID09IDIgJiYKKyAgICAgICAgICAgICAgRkxBVEJVRkZFUlNfVkVSU0lPTl9NSU5PUiA9PSAwICYmCisgICAgICAgICAgICAgIEZMQVRCVUZGRVJTX1ZFUlNJT05fUkVWSVNJT04gPT0gOCwKKyAgICAgICAgICAgICAiTm9uLWNvbXBhdGlibGUgZmxhdGJ1ZmZlcnMgdmVyc2lvbiBpbmNsdWRlZCIpOwogCiBuYW1lc3BhY2UgTXlHYW1lIHsKIApAQCAtMzUsNiArNDMsOCBAQAogCiBzdHJ1Y3QgU3RydWN0T2ZTdHJ1Y3RzOwogCitzdHJ1Y3QgU3RydWN0T2ZTdHJ1Y3RzT2ZTdHJ1Y3RzOworCiBzdHJ1Y3QgU3RhdDsKIHN0cnVjdCBTdGF0QnVpbGRlcjsKIHN0cnVjdCBTdGF0VDsKQEAgLTczLDYgKzgzLDggQEAKIGJvb2wgb3BlcmF0b3IhPShjb25zdCBBYmlsaXR5ICZsaHMsIGNvbnN0IEFiaWxpdHkgJnJocyk7CiBib29sIG9wZXJhdG9yPT0oY29uc3QgU3RydWN0T2ZTdHJ1Y3RzICZsaHMsIGNvbnN0IFN0cnVjdE9mU3RydWN0cyAmcmhzKTsKIGJvb2wgb3BlcmF0b3IhPShjb25zdCBTdHJ1Y3RPZlN0cnVjdHMgJmxocywgY29uc3QgU3RydWN0T2ZTdHJ1Y3RzICZyaHMpOworYm9vbCBvcGVyYXRvcj09KGNvbnN0IFN0cnVjdE9mU3RydWN0c09mU3RydWN0cyAmbGhzLCBjb25zdCBTdHJ1Y3RPZlN0cnVjdHNPZlN0cnVjdHMgJnJocyk7Citib29sIG9wZXJhdG9yIT0oY29uc3QgU3RydWN0T2ZTdHJ1Y3RzT2ZTdHJ1Y3RzICZsaHMsIGNvbnN0IFN0cnVjdE9mU3RydWN0c09mU3RydWN0cyAmcmhzKTsKIGJvb2wgb3BlcmF0b3I9PShjb25zdCBTdGF0VCAmbGhzLCBjb25zdCBTdGF0VCAmcmhzKTsKIGJvb2wgb3BlcmF0b3IhPShjb25zdCBTdGF0VCAmbGhzLCBjb25zdCBTdGF0VCAmcmhzKTsKIGJvb2wgb3BlcmF0b3I9PShjb25zdCBSZWZlcnJhYmxlVCAmbGhzLCBjb25zdCBSZWZlcnJhYmxlVCAmcmhzKTsKQEAgLTEwNCw2ICsxMTYsOCBAQAogCiBpbmxpbmUgY29uc3QgZmxhdGJ1ZmZlcnM6OlR5cGVUYWJsZSAqU3RydWN0T2ZTdHJ1Y3RzVHlwZVRhYmxlKCk7CiAKK2lubGluZSBjb25zdCBmbGF0YnVmZmVyczo6VHlwZVRhYmxlICpTdHJ1Y3RPZlN0cnVjdHNPZlN0cnVjdHNUeXBlVGFibGUoKTsKKwogaW5saW5lIGNvbnN0IGZsYXRidWZmZXJzOjpUeXBlVGFibGUgKlN0YXRUeXBlVGFibGUoKTsKIAogaW5saW5lIGNvbnN0IGZsYXRidWZmZXJzOjpUeXBlVGFibGUgKlJlZmVycmFibGVUeXBlVGFibGUoKTsKQEAgLTg5MCw2ICs5MDQsMzkgQEAKIH0KIAogCitGTEFUQlVGRkVSU19NQU5VQUxMWV9BTElHTkVEX1NUUlVDVCg0KSBTdHJ1Y3RPZlN0cnVjdHNPZlN0cnVjdHMgRkxBVEJVRkZFUlNfRklOQUxfQ0xBU1MgeworIHByaXZhdGU6CisgIE15R2FtZTo6RXhhbXBsZTo6U3RydWN0T2ZTdHJ1Y3RzIGFfOworCisgcHVibGljOgorICBzdGF0aWMgY29uc3QgZmxhdGJ1ZmZlcnM6OlR5cGVUYWJsZSAqTWluaVJlZmxlY3RUeXBlVGFibGUoKSB7CisgICAgcmV0dXJuIFN0cnVjdE9mU3RydWN0c09mU3RydWN0c1R5cGVUYWJsZSgpOworICB9CisgIFN0cnVjdE9mU3RydWN0c09mU3RydWN0cygpCisgICAgICA6IGFfKCkgeworICB9CisgIFN0cnVjdE9mU3RydWN0c09mU3RydWN0cyhjb25zdCBNeUdhbWU6OkV4YW1wbGU6OlN0cnVjdE9mU3RydWN0cyAmX2EpCisgICAgICA6IGFfKF9hKSB7CisgIH0KKyAgY29uc3QgTXlHYW1lOjpFeGFtcGxlOjpTdHJ1Y3RPZlN0cnVjdHMgJmEoKSBjb25zdCB7CisgICAgcmV0dXJuIGFfOworICB9CisgIE15R2FtZTo6RXhhbXBsZTo6U3RydWN0T2ZTdHJ1Y3RzICZtdXRhYmxlX2EoKSB7CisgICAgcmV0dXJuIGFfOworICB9Cit9OworRkxBVEJVRkZFUlNfU1RSVUNUX0VORChTdHJ1Y3RPZlN0cnVjdHNPZlN0cnVjdHMsIDIwKTsKKworaW5saW5lIGJvb2wgb3BlcmF0b3I9PShjb25zdCBTdHJ1Y3RPZlN0cnVjdHNPZlN0cnVjdHMgJmxocywgY29uc3QgU3RydWN0T2ZTdHJ1Y3RzT2ZTdHJ1Y3RzICZyaHMpIHsKKyAgcmV0dXJuCisgICAgICAobGhzLmEoKSA9PSByaHMuYSgpKTsKK30KKworaW5saW5lIGJvb2wgb3BlcmF0b3IhPShjb25zdCBTdHJ1Y3RPZlN0cnVjdHNPZlN0cnVjdHMgJmxocywgY29uc3QgU3RydWN0T2ZTdHJ1Y3RzT2ZTdHJ1Y3RzICZyaHMpIHsKKyAgICByZXR1cm4gIShsaHMgPT0gcmhzKTsKK30KKworCiB9ICAvLyBuYW1lc3BhY2UgRXhhbXBsZQogCiBzdHJ1Y3QgSW5QYXJlbnROYW1lc3BhY2VUIDogcHVibGljIGZsYXRidWZmZXJzOjpOYXRpdmVUYWJsZSB7CkBAIC0yNjgwLDcgKzI3MjcsNyBAQAogICAgICAgKGxocy50ZXN0ID09IHJocy50ZXN0KSAmJgogICAgICAgKGxocy50ZXN0NCA9PSByaHMudGVzdDQpICYmCiAgICAgICAobGhzLnRlc3RhcnJheW9mc3RyaW5nID09IHJocy50ZXN0YXJyYXlvZnN0cmluZykgJiYKLSAgICAgIChsaHMudGVzdGFycmF5b2Z0YWJsZXMgPT0gcmhzLnRlc3RhcnJheW9mdGFibGVzKSAmJgorICAgICAgKGxocy50ZXN0YXJyYXlvZnRhYmxlcy5zaXplKCkgPT0gcmhzLnRlc3RhcnJheW9mdGFibGVzLnNpemUoKSAmJiBzdGQ6OmVxdWFsKGxocy50ZXN0YXJyYXlvZnRhYmxlcy5jYmVnaW4oKSwgbGhzLnRlc3RhcnJheW9mdGFibGVzLmNlbmQoKSwgcmhzLnRlc3RhcnJheW9mdGFibGVzLmNiZWdpbigpLCBbXShmbGF0YnVmZmVyczo6dW5pcXVlX3B0cjxNeUdhbWU6OkV4YW1wbGU6Ok1vbnN0ZXJUPiBjb25zdCAmYSwgZmxhdGJ1ZmZlcnM6OnVuaXF1ZV9wdHI8TXlHYW1lOjpFeGFtcGxlOjpNb25zdGVyVD4gY29uc3QgJmIpIHsgcmV0dXJuIChhID09IGIpIHx8IChhICYmIGIgJiYgKmEgPT0gKmIpOyB9KSkgJiYKICAgICAgICgobGhzLmVuZW15ID09IHJocy5lbmVteSkgfHwgKGxocy5lbmVteSAmJiByaHMuZW5lbXkgJiYgKmxocy5lbmVteSA9PSAqcmhzLmVuZW15KSkgJiYKICAgICAgIChsaHMudGVzdG5lc3RlZGZsYXRidWZmZXIgPT0gcmhzLnRlc3RuZXN0ZWRmbGF0YnVmZmVyKSAmJgogICAgICAgKChsaHMudGVzdGVtcHR5ID09IHJocy50ZXN0ZW1wdHkpIHx8IChsaHMudGVzdGVtcHR5ICYmIHJocy50ZXN0ZW1wdHkgJiYgKmxocy50ZXN0ZW1wdHkgPT0gKnJocy50ZXN0ZW1wdHkpKSAmJgpAQCAtMjcwNCwxMCArMjc1MSwxMCBAQAogICAgICAgKGxocy52ZWN0b3Jfb2ZfbG9uZ3MgPT0gcmhzLnZlY3Rvcl9vZl9sb25ncykgJiYKICAgICAgIChsaHMudmVjdG9yX29mX2RvdWJsZXMgPT0gcmhzLnZlY3Rvcl9vZl9kb3VibGVzKSAmJgogICAgICAgKChsaHMucGFyZW50X25hbWVzcGFjZV90ZXN0ID09IHJocy5wYXJlbnRfbmFtZXNwYWNlX3Rlc3QpIHx8IChsaHMucGFyZW50X25hbWVzcGFjZV90ZXN0ICYmIHJocy5wYXJlbnRfbmFtZXNwYWNlX3Rlc3QgJiYgKmxocy5wYXJlbnRfbmFtZXNwYWNlX3Rlc3QgPT0gKnJocy5wYXJlbnRfbmFtZXNwYWNlX3Rlc3QpKSAmJgotICAgICAgKGxocy52ZWN0b3Jfb2ZfcmVmZXJyYWJsZXMgPT0gcmhzLnZlY3Rvcl9vZl9yZWZlcnJhYmxlcykgJiYKKyAgICAgIChsaHMudmVjdG9yX29mX3JlZmVycmFibGVzLnNpemUoKSA9PSByaHMudmVjdG9yX29mX3JlZmVycmFibGVzLnNpemUoKSAmJiBzdGQ6OmVxdWFsKGxocy52ZWN0b3Jfb2ZfcmVmZXJyYWJsZXMuY2JlZ2luKCksIGxocy52ZWN0b3Jfb2ZfcmVmZXJyYWJsZXMuY2VuZCgpLCByaHMudmVjdG9yX29mX3JlZmVycmFibGVzLmNiZWdpbigpLCBbXShmbGF0YnVmZmVyczo6dW5pcXVlX3B0cjxNeUdhbWU6OkV4YW1wbGU6OlJlZmVycmFibGVUPiBjb25zdCAmYSwgZmxhdGJ1ZmZlcnM6OnVuaXF1ZV9wdHI8TXlHYW1lOjpFeGFtcGxlOjpSZWZlcnJhYmxlVD4gY29uc3QgJmIpIHsgcmV0dXJuIChhID09IGIpIHx8IChhICYmIGIgJiYgKmEgPT0gKmIpOyB9KSkgJiYKICAgICAgIChsaHMuc2luZ2xlX3dlYWtfcmVmZXJlbmNlID09IHJocy5zaW5nbGVfd2Vha19yZWZlcmVuY2UpICYmCiAgICAgICAobGhzLnZlY3Rvcl9vZl93ZWFrX3JlZmVyZW5jZXMgPT0gcmhzLnZlY3Rvcl9vZl93ZWFrX3JlZmVyZW5jZXMpICYmCi0gICAgICAobGhzLnZlY3Rvcl9vZl9zdHJvbmdfcmVmZXJyYWJsZXMgPT0gcmhzLnZlY3Rvcl9vZl9zdHJvbmdfcmVmZXJyYWJsZXMpICYmCisgICAgICAobGhzLnZlY3Rvcl9vZl9zdHJvbmdfcmVmZXJyYWJsZXMuc2l6ZSgpID09IHJocy52ZWN0b3Jfb2Zfc3Ryb25nX3JlZmVycmFibGVzLnNpemUoKSAmJiBzdGQ6OmVxdWFsKGxocy52ZWN0b3Jfb2Zfc3Ryb25nX3JlZmVycmFibGVzLmNiZWdpbigpLCBsaHMudmVjdG9yX29mX3N0cm9uZ19yZWZlcnJhYmxlcy5jZW5kKCksIHJocy52ZWN0b3Jfb2Zfc3Ryb25nX3JlZmVycmFibGVzLmNiZWdpbigpLCBbXShmbGF0YnVmZmVyczo6dW5pcXVlX3B0cjxNeUdhbWU6OkV4YW1wbGU6OlJlZmVycmFibGVUPiBjb25zdCAmYSwgZmxhdGJ1ZmZlcnM6OnVuaXF1ZV9wdHI8TXlHYW1lOjpFeGFtcGxlOjpSZWZlcnJhYmxlVD4gY29uc3QgJmIpIHsgcmV0dXJuIChhID09IGIpIHx8IChhICYmIGIgJiYgKmEgPT0gKmIpOyB9KSkgJiYKICAgICAgIChsaHMuY29fb3duaW5nX3JlZmVyZW5jZSA9PSByaHMuY29fb3duaW5nX3JlZmVyZW5jZSkgJiYKICAgICAgIChsaHMudmVjdG9yX29mX2NvX293bmluZ19yZWZlcmVuY2VzID09IHJocy52ZWN0b3Jfb2ZfY29fb3duaW5nX3JlZmVyZW5jZXMpICYmCiAgICAgICAobGhzLm5vbl9vd25pbmdfcmVmZXJlbmNlID09IHJocy5ub25fb3duaW5nX3JlZmVyZW5jZSkgJiYKQEAgLTI3MTcsNyArMjc2NCw3IEBACiAgICAgICAobGhzLnZlY3Rvcl9vZl9lbnVtcyA9PSByaHMudmVjdG9yX29mX2VudW1zKSAmJgogICAgICAgKGxocy5zaWduZWRfZW51bSA9PSByaHMuc2lnbmVkX2VudW0pICYmCiAgICAgICAobGhzLnRlc3RyZXF1aXJlZG5lc3RlZGZsYXRidWZmZXIgPT0gcmhzLnRlc3RyZXF1aXJlZG5lc3RlZGZsYXRidWZmZXIpICYmCi0gICAgICAobGhzLnNjYWxhcl9rZXlfc29ydGVkX3RhYmxlcyA9PSByaHMuc2NhbGFyX2tleV9zb3J0ZWRfdGFibGVzKSAmJgorICAgICAgKGxocy5zY2FsYXJfa2V5X3NvcnRlZF90YWJsZXMuc2l6ZSgpID09IHJocy5zY2FsYXJfa2V5X3NvcnRlZF90YWJsZXMuc2l6ZSgpICYmIHN0ZDo6ZXF1YWwobGhzLnNjYWxhcl9rZXlfc29ydGVkX3RhYmxlcy5jYmVnaW4oKSwgbGhzLnNjYWxhcl9rZXlfc29ydGVkX3RhYmxlcy5jZW5kKCksIHJocy5zY2FsYXJfa2V5X3NvcnRlZF90YWJsZXMuY2JlZ2luKCksIFtdKGZsYXRidWZmZXJzOjp1bmlxdWVfcHRyPE15R2FtZTo6RXhhbXBsZTo6U3RhdFQ+IGNvbnN0ICZhLCBmbGF0YnVmZmVyczo6dW5pcXVlX3B0cjxNeUdhbWU6OkV4YW1wbGU6OlN0YXRUPiBjb25zdCAmYikgeyByZXR1cm4gKGEgPT0gYikgfHwgKGEgJiYgYiAmJiAqYSA9PSAqYik7IH0pKSAmJgogICAgICAgKGxocy5uYXRpdmVfaW5saW5lID09IHJocy5uYXRpdmVfaW5saW5lKSAmJgogICAgICAgKGxocy5sb25nX2VudW1fbm9uX2VudW1fZGVmYXVsdCA9PSByaHMubG9uZ19lbnVtX25vbl9lbnVtX2RlZmF1bHQpICYmCiAgICAgICAobGhzLmxvbmdfZW51bV9ub3JtYWxfZGVmYXVsdCA9PSByaHMubG9uZ19lbnVtX25vcm1hbF9kZWZhdWx0KTsKQEAgLTI4NTcsNTUgKzI5MDQsNDggQEAKICAgeyBhdXRvIF9lID0gY29sb3IoKTsgX28tPmNvbG9yID0gX2U7IH0KICAgeyBhdXRvIF9lID0gdGVzdF90eXBlKCk7IF9vLT50ZXN0LnR5cGUgPSBfZTsgfQogICB7IGF1dG8gX2UgPSB0ZXN0KCk7IGlmIChfZSkgX28tPnRlc3QudmFsdWUgPSBNeUdhbWU6OkV4YW1wbGU6OkFueVVuaW9uOjpVblBhY2soX2UsIHRlc3RfdHlwZSgpLCBfcmVzb2x2ZXIpOyB9Ci0gIHsgYXV0byBfZSA9IHRlc3Q0KCk7IGlmIChfZSkgeyBfby0+dGVzdDQucmVzaXplKF9lLT5zaXplKCkpOyBmb3IgKGZsYXRidWZmZXJzOjp1b2Zmc2V0X3QgX2kgPSAwOyBfaSA8IF9lLT5zaXplKCk7IF9pKyspIHsgX28tPnRlc3Q0W19pXSA9ICpfZS0+R2V0KF9pKTsgfSB9IH0KLSAgeyBhdXRvIF9lID0gdGVzdGFycmF5b2ZzdHJpbmcoKTsgaWYgKF9lKSB7IF9vLT50ZXN0YXJyYXlvZnN0cmluZy5yZXNpemUoX2UtPnNpemUoKSk7IGZvciAoZmxhdGJ1ZmZlcnM6OnVvZmZzZXRfdCBfaSA9IDA7IF9pIDwgX2UtPnNpemUoKTsgX2krKykgeyBfby0+dGVzdGFycmF5b2ZzdHJpbmdbX2ldID0gX2UtPkdldChfaSktPnN0cigpOyB9IH0gfQotICB7IGF1dG8gX2UgPSB0ZXN0YXJyYXlvZnRhYmxlcygpOyBpZiAoX2UpIHsgX28tPnRlc3RhcnJheW9mdGFibGVzLnJlc2l6ZShfZS0+c2l6ZSgpKTsgZm9yIChmbGF0YnVmZmVyczo6dW9mZnNldF90IF9pID0gMDsgX2kgPCBfZS0+c2l6ZSgpOyBfaSsrKSB7IGlmKF9vLT50ZXN0YXJyYXlvZnRhYmxlc1tfaV0pIHsgX2UtPkdldChfaSktPlVuUGFja1RvKF9vLT50ZXN0YXJyYXlvZnRhYmxlc1tfaV0uZ2V0KCksIF9yZXNvbHZlcik7IH0gZWxzZSB7IF9vLT50ZXN0YXJyYXlvZnRhYmxlc1tfaV0gPSBmbGF0YnVmZmVyczo6dW5pcXVlX3B0cjxNeUdhbWU6OkV4YW1wbGU6Ok1vbnN0ZXJUPihfZS0+R2V0KF9pKS0+VW5QYWNrKF9yZXNvbHZlcikpOyB9OyB9IH0gfQotICB7IGF1dG8gX2UgPSBlbmVteSgpOyBpZiAoX2UpIHsgaWYoX28tPmVuZW15KSB7IF9lLT5VblBhY2tUbyhfby0+ZW5lbXkuZ2V0KCksIF9yZXNvbHZlcik7IH0gZWxzZSB7IF9vLT5lbmVteSA9IGZsYXRidWZmZXJzOjp1bmlxdWVfcHRyPE15R2FtZTo6RXhhbXBsZTo6TW9uc3RlclQ+KF9lLT5VblBhY2soX3Jlc29sdmVyKSk7IH0gfSB9CisgIHsgYXV0byBfZSA9IHRlc3Q0KCk7IGlmIChfZSkgeyBfby0+dGVzdDQucmVzaXplKF9lLT5zaXplKCkpOyBmb3IgKGZsYXRidWZmZXJzOjp1b2Zmc2V0X3QgX2kgPSAwOyBfaSA8IF9lLT5zaXplKCk7IF9pKyspIHsgX28tPnRlc3Q0W19pXSA9ICpfZS0+R2V0KF9pKTsgfSB9IGVsc2UgeyBfby0+dGVzdDQucmVzaXplKDApOyB9IH0KKyAgeyBhdXRvIF9lID0gdGVzdGFycmF5b2ZzdHJpbmcoKTsgaWYgKF9lKSB7IF9vLT50ZXN0YXJyYXlvZnN0cmluZy5yZXNpemUoX2UtPnNpemUoKSk7IGZvciAoZmxhdGJ1ZmZlcnM6OnVvZmZzZXRfdCBfaSA9IDA7IF9pIDwgX2UtPnNpemUoKTsgX2krKykgeyBfby0+dGVzdGFycmF5b2ZzdHJpbmdbX2ldID0gX2UtPkdldChfaSktPnN0cigpOyB9IH0gZWxzZSB7IF9vLT50ZXN0YXJyYXlvZnN0cmluZy5yZXNpemUoMCk7IH0gfQorICB7IGF1dG8gX2UgPSB0ZXN0YXJyYXlvZnRhYmxlcygpOyBpZiAoX2UpIHsgX28tPnRlc3RhcnJheW9mdGFibGVzLnJlc2l6ZShfZS0+c2l6ZSgpKTsgZm9yIChmbGF0YnVmZmVyczo6dW9mZnNldF90IF9pID0gMDsgX2kgPCBfZS0+c2l6ZSgpOyBfaSsrKSB7IGlmKF9vLT50ZXN0YXJyYXlvZnRhYmxlc1tfaV0pIHsgX2UtPkdldChfaSktPlVuUGFja1RvKF9vLT50ZXN0YXJyYXlvZnRhYmxlc1tfaV0uZ2V0KCksIF9yZXNvbHZlcik7IH0gZWxzZSB7IF9vLT50ZXN0YXJyYXlvZnRhYmxlc1tfaV0gPSBmbGF0YnVmZmVyczo6dW5pcXVlX3B0cjxNeUdhbWU6OkV4YW1wbGU6Ok1vbnN0ZXJUPihfZS0+R2V0KF9pKS0+VW5QYWNrKF9yZXNvbHZlcikpOyB9OyB9IH0gZWxzZSB7IF9vLT50ZXN0YXJyYXlvZnRhYmxlcy5yZXNpemUoMCk7IH0gfQorICB7IGF1dG8gX2UgPSBlbmVteSgpOyBpZiAoX2UpIHsgaWYoX28tPmVuZW15KSB7IF9lLT5VblBhY2tUbyhfby0+ZW5lbXkuZ2V0KCksIF9yZXNvbHZlcik7IH0gZWxzZSB7IF9vLT5lbmVteSA9IGZsYXRidWZmZXJzOjp1bmlxdWVfcHRyPE15R2FtZTo6RXhhbXBsZTo6TW9uc3RlclQ+KF9lLT5VblBhY2soX3Jlc29sdmVyKSk7IH0gfSBlbHNlIGlmIChfby0+ZW5lbXkpIHsgX28tPmVuZW15LnJlc2V0KCk7IH0gfQogICB7IGF1dG8gX2UgPSB0ZXN0bmVzdGVkZmxhdGJ1ZmZlcigpOyBpZiAoX2UpIHsgX28tPnRlc3RuZXN0ZWRmbGF0YnVmZmVyLnJlc2l6ZShfZS0+c2l6ZSgpKTsgc3RkOjpjb3B5KF9lLT5iZWdpbigpLCBfZS0+ZW5kKCksIF9vLT50ZXN0bmVzdGVkZmxhdGJ1ZmZlci5iZWdpbigpKTsgfSB9Ci0gIHsgYXV0byBfZSA9IHRlc3RlbXB0eSgpOyBpZiAoX2UpIHsgaWYoX28tPnRlc3RlbXB0eSkgeyBfZS0+VW5QYWNrVG8oX28tPnRlc3RlbXB0eS5nZXQoKSwgX3Jlc29sdmVyKTsgfSBlbHNlIHsgX28tPnRlc3RlbXB0eSA9IGZsYXRidWZmZXJzOjp1bmlxdWVfcHRyPE15R2FtZTo6RXhhbXBsZTo6U3RhdFQ+KF9lLT5VblBhY2soX3Jlc29sdmVyKSk7IH0gfSB9CisgIHsgYXV0byBfZSA9IHRlc3RlbXB0eSgpOyBpZiAoX2UpIHsgaWYoX28tPnRlc3RlbXB0eSkgeyBfZS0+VW5QYWNrVG8oX28tPnRlc3RlbXB0eS5nZXQoKSwgX3Jlc29sdmVyKTsgfSBlbHNlIHsgX28tPnRlc3RlbXB0eSA9IGZsYXRidWZmZXJzOjp1bmlxdWVfcHRyPE15R2FtZTo6RXhhbXBsZTo6U3RhdFQ+KF9lLT5VblBhY2soX3Jlc29sdmVyKSk7IH0gfSBlbHNlIGlmIChfby0+dGVzdGVtcHR5KSB7IF9vLT50ZXN0ZW1wdHkucmVzZXQoKTsgfSB9CiAgIHsgYXV0byBfZSA9IHRlc3Rib29sKCk7IF9vLT50ZXN0Ym9vbCA9IF9lOyB9CiAgIHsgYXV0byBfZSA9IHRlc3RoYXNoczMyX2ZudjEoKTsgX28tPnRlc3RoYXNoczMyX2ZudjEgPSBfZTsgfQogICB7IGF1dG8gX2UgPSB0ZXN0aGFzaHUzMl9mbnYxKCk7IF9vLT50ZXN0aGFzaHUzMl9mbnYxID0gX2U7IH0KICAgeyBhdXRvIF9lID0gdGVzdGhhc2hzNjRfZm52MSgpOyBfby0+dGVzdGhhc2hzNjRfZm52MSA9IF9lOyB9CiAgIHsgYXV0byBfZSA9IHRlc3RoYXNodTY0X2ZudjEoKTsgX28tPnRlc3RoYXNodTY0X2ZudjEgPSBfZTsgfQogICB7IGF1dG8gX2UgPSB0ZXN0aGFzaHMzMl9mbnYxYSgpOyBfby0+dGVzdGhhc2hzMzJfZm52MWEgPSBfZTsgfQotICB7IGF1dG8gX2UgPSB0ZXN0aGFzaHUzMl9mbnYxYSgpOyAvL3NjYWxhciByZXNvbHZlciwgbmFrZWQgCi1pZiAoX3Jlc29sdmVyKSAoKl9yZXNvbHZlcikocmVpbnRlcnByZXRfY2FzdDx2b2lkICoqPigmX28tPnRlc3RoYXNodTMyX2ZudjFhKSwgc3RhdGljX2Nhc3Q8ZmxhdGJ1ZmZlcnM6Omhhc2hfdmFsdWVfdD4oX2UpKTsgZWxzZSBfby0+dGVzdGhhc2h1MzJfZm52MWEgPSBudWxscHRyOyB9CisgIHsgYXV0byBfZSA9IHRlc3RoYXNodTMyX2ZudjFhKCk7IC8qc2NhbGFyIHJlc29sdmVyLCBuYWtlZCovIGlmIChfcmVzb2x2ZXIpICgqX3Jlc29sdmVyKShyZWludGVycHJldF9jYXN0PHZvaWQgKio+KCZfby0+dGVzdGhhc2h1MzJfZm52MWEpLCBzdGF0aWNfY2FzdDxmbGF0YnVmZmVyczo6aGFzaF92YWx1ZV90PihfZSkpOyBlbHNlIF9vLT50ZXN0aGFzaHUzMl9mbnYxYSA9IG51bGxwdHI7IH0KICAgeyBhdXRvIF9lID0gdGVzdGhhc2hzNjRfZm52MWEoKTsgX28tPnRlc3RoYXNoczY0X2ZudjFhID0gX2U7IH0KICAgeyBhdXRvIF9lID0gdGVzdGhhc2h1NjRfZm52MWEoKTsgX28tPnRlc3RoYXNodTY0X2ZudjFhID0gX2U7IH0KLSAgeyBhdXRvIF9lID0gdGVzdGFycmF5b2Zib29scygpOyBpZiAoX2UpIHsgX28tPnRlc3RhcnJheW9mYm9vbHMucmVzaXplKF9lLT5zaXplKCkpOyBmb3IgKGZsYXRidWZmZXJzOjp1b2Zmc2V0X3QgX2kgPSAwOyBfaSA8IF9lLT5zaXplKCk7IF9pKyspIHsgX28tPnRlc3RhcnJheW9mYm9vbHNbX2ldID0gX2UtPkdldChfaSkgIT0gMDsgfSB9IH0KKyAgeyBhdXRvIF9lID0gdGVzdGFycmF5b2Zib29scygpOyBpZiAoX2UpIHsgX28tPnRlc3RhcnJheW9mYm9vbHMucmVzaXplKF9lLT5zaXplKCkpOyBmb3IgKGZsYXRidWZmZXJzOjp1b2Zmc2V0X3QgX2kgPSAwOyBfaSA8IF9lLT5zaXplKCk7IF9pKyspIHsgX28tPnRlc3RhcnJheW9mYm9vbHNbX2ldID0gX2UtPkdldChfaSkgIT0gMDsgfSB9IGVsc2UgeyBfby0+dGVzdGFycmF5b2Zib29scy5yZXNpemUoMCk7IH0gfQogICB7IGF1dG8gX2UgPSB0ZXN0ZigpOyBfby0+dGVzdGYgPSBfZTsgfQogICB7IGF1dG8gX2UgPSB0ZXN0ZjIoKTsgX28tPnRlc3RmMiA9IF9lOyB9CiAgIHsgYXV0byBfZSA9IHRlc3RmMygpOyBfby0+dGVzdGYzID0gX2U7IH0KLSAgeyBhdXRvIF9lID0gdGVzdGFycmF5b2ZzdHJpbmcyKCk7IGlmIChfZSkgeyBfby0+dGVzdGFycmF5b2ZzdHJpbmcyLnJlc2l6ZShfZS0+c2l6ZSgpKTsgZm9yIChmbGF0YnVmZmVyczo6dW9mZnNldF90IF9pID0gMDsgX2kgPCBfZS0+c2l6ZSgpOyBfaSsrKSB7IF9vLT50ZXN0YXJyYXlvZnN0cmluZzJbX2ldID0gX2UtPkdldChfaSktPnN0cigpOyB9IH0gfQotICB7IGF1dG8gX2UgPSB0ZXN0YXJyYXlvZnNvcnRlZHN0cnVjdCgpOyBpZiAoX2UpIHsgX28tPnRlc3RhcnJheW9mc29ydGVkc3RydWN0LnJlc2l6ZShfZS0+c2l6ZSgpKTsgZm9yIChmbGF0YnVmZmVyczo6dW9mZnNldF90IF9pID0gMDsgX2kgPCBfZS0+c2l6ZSgpOyBfaSsrKSB7IF9vLT50ZXN0YXJyYXlvZnNvcnRlZHN0cnVjdFtfaV0gPSAqX2UtPkdldChfaSk7IH0gfSB9CisgIHsgYXV0byBfZSA9IHRlc3RhcnJheW9mc3RyaW5nMigpOyBpZiAoX2UpIHsgX28tPnRlc3RhcnJheW9mc3RyaW5nMi5yZXNpemUoX2UtPnNpemUoKSk7IGZvciAoZmxhdGJ1ZmZlcnM6OnVvZmZzZXRfdCBfaSA9IDA7IF9pIDwgX2UtPnNpemUoKTsgX2krKykgeyBfby0+dGVzdGFycmF5b2ZzdHJpbmcyW19pXSA9IF9lLT5HZXQoX2kpLT5zdHIoKTsgfSB9IGVsc2UgeyBfby0+dGVzdGFycmF5b2ZzdHJpbmcyLnJlc2l6ZSgwKTsgfSB9CisgIHsgYXV0byBfZSA9IHRlc3RhcnJheW9mc29ydGVkc3RydWN0KCk7IGlmIChfZSkgeyBfby0+dGVzdGFycmF5b2Zzb3J0ZWRzdHJ1Y3QucmVzaXplKF9lLT5zaXplKCkpOyBmb3IgKGZsYXRidWZmZXJzOjp1b2Zmc2V0X3QgX2kgPSAwOyBfaSA8IF9lLT5zaXplKCk7IF9pKyspIHsgX28tPnRlc3RhcnJheW9mc29ydGVkc3RydWN0W19pXSA9ICpfZS0+R2V0KF9pKTsgfSB9IGVsc2UgeyBfby0+dGVzdGFycmF5b2Zzb3J0ZWRzdHJ1Y3QucmVzaXplKDApOyB9IH0KICAgeyBhdXRvIF9lID0gZmxleCgpOyBpZiAoX2UpIHsgX28tPmZsZXgucmVzaXplKF9lLT5zaXplKCkpOyBzdGQ6OmNvcHkoX2UtPmJlZ2luKCksIF9lLT5lbmQoKSwgX28tPmZsZXguYmVnaW4oKSk7IH0gfQotICB7IGF1dG8gX2UgPSB0ZXN0NSgpOyBpZiAoX2UpIHsgX28tPnRlc3Q1LnJlc2l6ZShfZS0+c2l6ZSgpKTsgZm9yIChmbGF0YnVmZmVyczo6dW9mZnNldF90IF9pID0gMDsgX2kgPCBfZS0+c2l6ZSgpOyBfaSsrKSB7IF9vLT50ZXN0NVtfaV0gPSAqX2UtPkdldChfaSk7IH0gfSB9Ci0gIHsgYXV0byBfZSA9IHZlY3Rvcl9vZl9sb25ncygpOyBpZiAoX2UpIHsgX28tPnZlY3Rvcl9vZl9sb25ncy5yZXNpemUoX2UtPnNpemUoKSk7IGZvciAoZmxhdGJ1ZmZlcnM6OnVvZmZzZXRfdCBfaSA9IDA7IF9pIDwgX2UtPnNpemUoKTsgX2krKykgeyBfby0+dmVjdG9yX29mX2xvbmdzW19pXSA9IF9lLT5HZXQoX2kpOyB9IH0gfQotICB7IGF1dG8gX2UgPSB2ZWN0b3Jfb2ZfZG91YmxlcygpOyBpZiAoX2UpIHsgX28tPnZlY3Rvcl9vZl9kb3VibGVzLnJlc2l6ZShfZS0+c2l6ZSgpKTsgZm9yIChmbGF0YnVmZmVyczo6dW9mZnNldF90IF9pID0gMDsgX2kgPCBfZS0+c2l6ZSgpOyBfaSsrKSB7IF9vLT52ZWN0b3Jfb2ZfZG91Ymxlc1tfaV0gPSBfZS0+R2V0KF9pKTsgfSB9IH0KLSAgeyBhdXRvIF9lID0gcGFyZW50X25hbWVzcGFjZV90ZXN0KCk7IGlmIChfZSkgeyBpZihfby0+cGFyZW50X25hbWVzcGFjZV90ZXN0KSB7IF9lLT5VblBhY2tUbyhfby0+cGFyZW50X25hbWVzcGFjZV90ZXN0LmdldCgpLCBfcmVzb2x2ZXIpOyB9IGVsc2UgeyBfby0+cGFyZW50X25hbWVzcGFjZV90ZXN0ID0gZmxhdGJ1ZmZlcnM6OnVuaXF1ZV9wdHI8TXlHYW1lOjpJblBhcmVudE5hbWVzcGFjZVQ+KF9lLT5VblBhY2soX3Jlc29sdmVyKSk7IH0gfSB9Ci0gIHsgYXV0byBfZSA9IHZlY3Rvcl9vZl9yZWZlcnJhYmxlcygpOyBpZiAoX2UpIHsgX28tPnZlY3Rvcl9vZl9yZWZlcnJhYmxlcy5yZXNpemUoX2UtPnNpemUoKSk7IGZvciAoZmxhdGJ1ZmZlcnM6OnVvZmZzZXRfdCBfaSA9IDA7IF9pIDwgX2UtPnNpemUoKTsgX2krKykgeyBpZihfby0+dmVjdG9yX29mX3JlZmVycmFibGVzW19pXSkgeyBfZS0+R2V0KF9pKS0+VW5QYWNrVG8oX28tPnZlY3Rvcl9vZl9yZWZlcnJhYmxlc1tfaV0uZ2V0KCksIF9yZXNvbHZlcik7IH0gZWxzZSB7IF9vLT52ZWN0b3Jfb2ZfcmVmZXJyYWJsZXNbX2ldID0gZmxhdGJ1ZmZlcnM6OnVuaXF1ZV9wdHI8TXlHYW1lOjpFeGFtcGxlOjpSZWZlcnJhYmxlVD4oX2UtPkdldChfaSktPlVuUGFjayhfcmVzb2x2ZXIpKTsgfTsgfSB9IH0KLSAgeyBhdXRvIF9lID0gc2luZ2xlX3dlYWtfcmVmZXJlbmNlKCk7IC8vc2NhbGFyIHJlc29sdmVyLCBuYWtlZCAKLWlmIChfcmVzb2x2ZXIpICgqX3Jlc29sdmVyKShyZWludGVycHJldF9jYXN0PHZvaWQgKio+KCZfby0+c2luZ2xlX3dlYWtfcmVmZXJlbmNlKSwgc3RhdGljX2Nhc3Q8ZmxhdGJ1ZmZlcnM6Omhhc2hfdmFsdWVfdD4oX2UpKTsgZWxzZSBfby0+c2luZ2xlX3dlYWtfcmVmZXJlbmNlID0gbnVsbHB0cjsgfQotICB7IGF1dG8gX2UgPSB2ZWN0b3Jfb2Zfd2Vha19yZWZlcmVuY2VzKCk7IGlmIChfZSkgeyBfby0+dmVjdG9yX29mX3dlYWtfcmVmZXJlbmNlcy5yZXNpemUoX2UtPnNpemUoKSk7IGZvciAoZmxhdGJ1ZmZlcnM6OnVvZmZzZXRfdCBfaSA9IDA7IF9pIDwgX2UtPnNpemUoKTsgX2krKykgeyAvL3ZlY3RvciByZXNvbHZlciwgbmFrZWQKLWlmIChfcmVzb2x2ZXIpICgqX3Jlc29sdmVyKShyZWludGVycHJldF9jYXN0PHZvaWQgKio+KCZfby0+dmVjdG9yX29mX3dlYWtfcmVmZXJlbmNlc1tfaV0pLCBzdGF0aWNfY2FzdDxmbGF0YnVmZmVyczo6aGFzaF92YWx1ZV90PihfZS0+R2V0KF9pKSkpOyBlbHNlIF9vLT52ZWN0b3Jfb2Zfd2Vha19yZWZlcmVuY2VzW19pXSA9IG51bGxwdHI7IH0gfSB9Ci0gIHsgYXV0byBfZSA9IHZlY3Rvcl9vZl9zdHJvbmdfcmVmZXJyYWJsZXMoKTsgaWYgKF9lKSB7IF9vLT52ZWN0b3Jfb2Zfc3Ryb25nX3JlZmVycmFibGVzLnJlc2l6ZShfZS0+c2l6ZSgpKTsgZm9yIChmbGF0YnVmZmVyczo6dW9mZnNldF90IF9pID0gMDsgX2kgPCBfZS0+c2l6ZSgpOyBfaSsrKSB7IGlmKF9vLT52ZWN0b3Jfb2Zfc3Ryb25nX3JlZmVycmFibGVzW19pXSkgeyBfZS0+R2V0KF9pKS0+VW5QYWNrVG8oX28tPnZlY3Rvcl9vZl9zdHJvbmdfcmVmZXJyYWJsZXNbX2ldLmdldCgpLCBfcmVzb2x2ZXIpOyB9IGVsc2UgeyBfby0+dmVjdG9yX29mX3N0cm9uZ19yZWZlcnJhYmxlc1tfaV0gPSBmbGF0YnVmZmVyczo6dW5pcXVlX3B0cjxNeUdhbWU6OkV4YW1wbGU6OlJlZmVycmFibGVUPihfZS0+R2V0KF9pKS0+VW5QYWNrKF9yZXNvbHZlcikpOyB9OyB9IH0gfQotICB7IGF1dG8gX2UgPSBjb19vd25pbmdfcmVmZXJlbmNlKCk7IC8vc2NhbGFyIHJlc29sdmVyLCBuYWtlZCAKLWlmIChfcmVzb2x2ZXIpICgqX3Jlc29sdmVyKShyZWludGVycHJldF9jYXN0PHZvaWQgKio+KCZfby0+Y29fb3duaW5nX3JlZmVyZW5jZSksIHN0YXRpY19jYXN0PGZsYXRidWZmZXJzOjpoYXNoX3ZhbHVlX3Q+KF9lKSk7IGVsc2UgX28tPmNvX293bmluZ19yZWZlcmVuY2UgPSBudWxscHRyOyB9Ci0gIHsgYXV0byBfZSA9IHZlY3Rvcl9vZl9jb19vd25pbmdfcmVmZXJlbmNlcygpOyBpZiAoX2UpIHsgX28tPnZlY3Rvcl9vZl9jb19vd25pbmdfcmVmZXJlbmNlcy5yZXNpemUoX2UtPnNpemUoKSk7IGZvciAoZmxhdGJ1ZmZlcnM6OnVvZmZzZXRfdCBfaSA9IDA7IF9pIDwgX2UtPnNpemUoKTsgX2krKykgeyAvL3ZlY3RvciByZXNvbHZlciwgZGVmYXVsdF9wdHJfdHlwZQotaWYgKF9yZXNvbHZlcikgKCpfcmVzb2x2ZXIpKHJlaW50ZXJwcmV0X2Nhc3Q8dm9pZCAqKj4oJl9vLT52ZWN0b3Jfb2ZfY29fb3duaW5nX3JlZmVyZW5jZXNbX2ldKSwgc3RhdGljX2Nhc3Q8ZmxhdGJ1ZmZlcnM6Omhhc2hfdmFsdWVfdD4oX2UtPkdldChfaSkpKTsvKiBlbHNlIGRvIG5vdGhpbmcgKi87IH0gfSB9Ci0gIHsgYXV0byBfZSA9IG5vbl9vd25pbmdfcmVmZXJlbmNlKCk7IC8vc2NhbGFyIHJlc29sdmVyLCBuYWtlZCAKLWlmIChfcmVzb2x2ZXIpICgqX3Jlc29sdmVyKShyZWludGVycHJldF9jYXN0PHZvaWQgKio+KCZfby0+bm9uX293bmluZ19yZWZlcmVuY2UpLCBzdGF0aWNfY2FzdDxmbGF0YnVmZmVyczo6aGFzaF92YWx1ZV90PihfZSkpOyBlbHNlIF9vLT5ub25fb3duaW5nX3JlZmVyZW5jZSA9IG51bGxwdHI7IH0KLSAgeyBhdXRvIF9lID0gdmVjdG9yX29mX25vbl9vd25pbmdfcmVmZXJlbmNlcygpOyBpZiAoX2UpIHsgX28tPnZlY3Rvcl9vZl9ub25fb3duaW5nX3JlZmVyZW5jZXMucmVzaXplKF9lLT5zaXplKCkpOyBmb3IgKGZsYXRidWZmZXJzOjp1b2Zmc2V0X3QgX2kgPSAwOyBfaSA8IF9lLT5zaXplKCk7IF9pKyspIHsgLy92ZWN0b3IgcmVzb2x2ZXIsIG5ha2VkCi1pZiAoX3Jlc29sdmVyKSAoKl9yZXNvbHZlcikocmVpbnRlcnByZXRfY2FzdDx2b2lkICoqPigmX28tPnZlY3Rvcl9vZl9ub25fb3duaW5nX3JlZmVyZW5jZXNbX2ldKSwgc3RhdGljX2Nhc3Q8ZmxhdGJ1ZmZlcnM6Omhhc2hfdmFsdWVfdD4oX2UtPkdldChfaSkpKTsgZWxzZSBfby0+dmVjdG9yX29mX25vbl9vd25pbmdfcmVmZXJlbmNlc1tfaV0gPSBudWxscHRyOyB9IH0gfQorICB7IGF1dG8gX2UgPSB0ZXN0NSgpOyBpZiAoX2UpIHsgX28tPnRlc3Q1LnJlc2l6ZShfZS0+c2l6ZSgpKTsgZm9yIChmbGF0YnVmZmVyczo6dW9mZnNldF90IF9pID0gMDsgX2kgPCBfZS0+c2l6ZSgpOyBfaSsrKSB7IF9vLT50ZXN0NVtfaV0gPSAqX2UtPkdldChfaSk7IH0gfSBlbHNlIHsgX28tPnRlc3Q1LnJlc2l6ZSgwKTsgfSB9CisgIHsgYXV0byBfZSA9IHZlY3Rvcl9vZl9sb25ncygpOyBpZiAoX2UpIHsgX28tPnZlY3Rvcl9vZl9sb25ncy5yZXNpemUoX2UtPnNpemUoKSk7IGZvciAoZmxhdGJ1ZmZlcnM6OnVvZmZzZXRfdCBfaSA9IDA7IF9pIDwgX2UtPnNpemUoKTsgX2krKykgeyBfby0+dmVjdG9yX29mX2xvbmdzW19pXSA9IF9lLT5HZXQoX2kpOyB9IH0gZWxzZSB7IF9vLT52ZWN0b3Jfb2ZfbG9uZ3MucmVzaXplKDApOyB9IH0KKyAgeyBhdXRvIF9lID0gdmVjdG9yX29mX2RvdWJsZXMoKTsgaWYgKF9lKSB7IF9vLT52ZWN0b3Jfb2ZfZG91Ymxlcy5yZXNpemUoX2UtPnNpemUoKSk7IGZvciAoZmxhdGJ1ZmZlcnM6OnVvZmZzZXRfdCBfaSA9IDA7IF9pIDwgX2UtPnNpemUoKTsgX2krKykgeyBfby0+dmVjdG9yX29mX2RvdWJsZXNbX2ldID0gX2UtPkdldChfaSk7IH0gfSBlbHNlIHsgX28tPnZlY3Rvcl9vZl9kb3VibGVzLnJlc2l6ZSgwKTsgfSB9CisgIHsgYXV0byBfZSA9IHBhcmVudF9uYW1lc3BhY2VfdGVzdCgpOyBpZiAoX2UpIHsgaWYoX28tPnBhcmVudF9uYW1lc3BhY2VfdGVzdCkgeyBfZS0+VW5QYWNrVG8oX28tPnBhcmVudF9uYW1lc3BhY2VfdGVzdC5nZXQoKSwgX3Jlc29sdmVyKTsgfSBlbHNlIHsgX28tPnBhcmVudF9uYW1lc3BhY2VfdGVzdCA9IGZsYXRidWZmZXJzOjp1bmlxdWVfcHRyPE15R2FtZTo6SW5QYXJlbnROYW1lc3BhY2VUPihfZS0+VW5QYWNrKF9yZXNvbHZlcikpOyB9IH0gZWxzZSBpZiAoX28tPnBhcmVudF9uYW1lc3BhY2VfdGVzdCkgeyBfby0+cGFyZW50X25hbWVzcGFjZV90ZXN0LnJlc2V0KCk7IH0gfQorICB7IGF1dG8gX2UgPSB2ZWN0b3Jfb2ZfcmVmZXJyYWJsZXMoKTsgaWYgKF9lKSB7IF9vLT52ZWN0b3Jfb2ZfcmVmZXJyYWJsZXMucmVzaXplKF9lLT5zaXplKCkpOyBmb3IgKGZsYXRidWZmZXJzOjp1b2Zmc2V0X3QgX2kgPSAwOyBfaSA8IF9lLT5zaXplKCk7IF9pKyspIHsgaWYoX28tPnZlY3Rvcl9vZl9yZWZlcnJhYmxlc1tfaV0pIHsgX2UtPkdldChfaSktPlVuUGFja1RvKF9vLT52ZWN0b3Jfb2ZfcmVmZXJyYWJsZXNbX2ldLmdldCgpLCBfcmVzb2x2ZXIpOyB9IGVsc2UgeyBfby0+dmVjdG9yX29mX3JlZmVycmFibGVzW19pXSA9IGZsYXRidWZmZXJzOjp1bmlxdWVfcHRyPE15R2FtZTo6RXhhbXBsZTo6UmVmZXJyYWJsZVQ+KF9lLT5HZXQoX2kpLT5VblBhY2soX3Jlc29sdmVyKSk7IH07IH0gfSBlbHNlIHsgX28tPnZlY3Rvcl9vZl9yZWZlcnJhYmxlcy5yZXNpemUoMCk7IH0gfQorICB7IGF1dG8gX2UgPSBzaW5nbGVfd2Vha19yZWZlcmVuY2UoKTsgLypzY2FsYXIgcmVzb2x2ZXIsIG5ha2VkKi8gaWYgKF9yZXNvbHZlcikgKCpfcmVzb2x2ZXIpKHJlaW50ZXJwcmV0X2Nhc3Q8dm9pZCAqKj4oJl9vLT5zaW5nbGVfd2Vha19yZWZlcmVuY2UpLCBzdGF0aWNfY2FzdDxmbGF0YnVmZmVyczo6aGFzaF92YWx1ZV90PihfZSkpOyBlbHNlIF9vLT5zaW5nbGVfd2Vha19yZWZlcmVuY2UgPSBudWxscHRyOyB9CisgIHsgYXV0byBfZSA9IHZlY3Rvcl9vZl93ZWFrX3JlZmVyZW5jZXMoKTsgaWYgKF9lKSB7IF9vLT52ZWN0b3Jfb2Zfd2Vha19yZWZlcmVuY2VzLnJlc2l6ZShfZS0+c2l6ZSgpKTsgZm9yIChmbGF0YnVmZmVyczo6dW9mZnNldF90IF9pID0gMDsgX2kgPCBfZS0+c2l6ZSgpOyBfaSsrKSB7IC8qdmVjdG9yIHJlc29sdmVyLCBuYWtlZCovIGlmIChfcmVzb2x2ZXIpICgqX3Jlc29sdmVyKShyZWludGVycHJldF9jYXN0PHZvaWQgKio+KCZfby0+dmVjdG9yX29mX3dlYWtfcmVmZXJlbmNlc1tfaV0pLCBzdGF0aWNfY2FzdDxmbGF0YnVmZmVyczo6aGFzaF92YWx1ZV90PihfZS0+R2V0KF9pKSkpOyBlbHNlIF9vLT52ZWN0b3Jfb2Zfd2Vha19yZWZlcmVuY2VzW19pXSA9IG51bGxwdHI7IH0gfSBlbHNlIHsgX28tPnZlY3Rvcl9vZl93ZWFrX3JlZmVyZW5jZXMucmVzaXplKDApOyB9IH0KKyAgeyBhdXRvIF9lID0gdmVjdG9yX29mX3N0cm9uZ19yZWZlcnJhYmxlcygpOyBpZiAoX2UpIHsgX28tPnZlY3Rvcl9vZl9zdHJvbmdfcmVmZXJyYWJsZXMucmVzaXplKF9lLT5zaXplKCkpOyBmb3IgKGZsYXRidWZmZXJzOjp1b2Zmc2V0X3QgX2kgPSAwOyBfaSA8IF9lLT5zaXplKCk7IF9pKyspIHsgaWYoX28tPnZlY3Rvcl9vZl9zdHJvbmdfcmVmZXJyYWJsZXNbX2ldKSB7IF9lLT5HZXQoX2kpLT5VblBhY2tUbyhfby0+dmVjdG9yX29mX3N0cm9uZ19yZWZlcnJhYmxlc1tfaV0uZ2V0KCksIF9yZXNvbHZlcik7IH0gZWxzZSB7IF9vLT52ZWN0b3Jfb2Zfc3Ryb25nX3JlZmVycmFibGVzW19pXSA9IGZsYXRidWZmZXJzOjp1bmlxdWVfcHRyPE15R2FtZTo6RXhhbXBsZTo6UmVmZXJyYWJsZVQ+KF9lLT5HZXQoX2kpLT5VblBhY2soX3Jlc29sdmVyKSk7IH07IH0gfSBlbHNlIHsgX28tPnZlY3Rvcl9vZl9zdHJvbmdfcmVmZXJyYWJsZXMucmVzaXplKDApOyB9IH0KKyAgeyBhdXRvIF9lID0gY29fb3duaW5nX3JlZmVyZW5jZSgpOyAvKnNjYWxhciByZXNvbHZlciwgbmFrZWQqLyBpZiAoX3Jlc29sdmVyKSAoKl9yZXNvbHZlcikocmVpbnRlcnByZXRfY2FzdDx2b2lkICoqPigmX28tPmNvX293bmluZ19yZWZlcmVuY2UpLCBzdGF0aWNfY2FzdDxmbGF0YnVmZmVyczo6aGFzaF92YWx1ZV90PihfZSkpOyBlbHNlIF9vLT5jb19vd25pbmdfcmVmZXJlbmNlID0gbnVsbHB0cjsgfQorICB7IGF1dG8gX2UgPSB2ZWN0b3Jfb2ZfY29fb3duaW5nX3JlZmVyZW5jZXMoKTsgaWYgKF9lKSB7IF9vLT52ZWN0b3Jfb2ZfY29fb3duaW5nX3JlZmVyZW5jZXMucmVzaXplKF9lLT5zaXplKCkpOyBmb3IgKGZsYXRidWZmZXJzOjp1b2Zmc2V0X3QgX2kgPSAwOyBfaSA8IF9lLT5zaXplKCk7IF9pKyspIHsgLyp2ZWN0b3IgcmVzb2x2ZXIsIGRlZmF1bHRfcHRyX3R5cGUqLyBpZiAoX3Jlc29sdmVyKSAoKl9yZXNvbHZlcikocmVpbnRlcnByZXRfY2FzdDx2b2lkICoqPigmX28tPnZlY3Rvcl9vZl9jb19vd25pbmdfcmVmZXJlbmNlc1tfaV0pLCBzdGF0aWNfY2FzdDxmbGF0YnVmZmVyczo6aGFzaF92YWx1ZV90PihfZS0+R2V0KF9pKSkpOy8qIGVsc2UgZG8gbm90aGluZyAqLzsgfSB9IGVsc2UgeyBfby0+dmVjdG9yX29mX2NvX293bmluZ19yZWZlcmVuY2VzLnJlc2l6ZSgwKTsgfSB9CisgIHsgYXV0byBfZSA9IG5vbl9vd25pbmdfcmVmZXJlbmNlKCk7IC8qc2NhbGFyIHJlc29sdmVyLCBuYWtlZCovIGlmIChfcmVzb2x2ZXIpICgqX3Jlc29sdmVyKShyZWludGVycHJldF9jYXN0PHZvaWQgKio+KCZfby0+bm9uX293bmluZ19yZWZlcmVuY2UpLCBzdGF0aWNfY2FzdDxmbGF0YnVmZmVyczo6aGFzaF92YWx1ZV90PihfZSkpOyBlbHNlIF9vLT5ub25fb3duaW5nX3JlZmVyZW5jZSA9IG51bGxwdHI7IH0KKyAgeyBhdXRvIF9lID0gdmVjdG9yX29mX25vbl9vd25pbmdfcmVmZXJlbmNlcygpOyBpZiAoX2UpIHsgX28tPnZlY3Rvcl9vZl9ub25fb3duaW5nX3JlZmVyZW5jZXMucmVzaXplKF9lLT5zaXplKCkpOyBmb3IgKGZsYXRidWZmZXJzOjp1b2Zmc2V0X3QgX2kgPSAwOyBfaSA8IF9lLT5zaXplKCk7IF9pKyspIHsgLyp2ZWN0b3IgcmVzb2x2ZXIsIG5ha2VkKi8gaWYgKF9yZXNvbHZlcikgKCpfcmVzb2x2ZXIpKHJlaW50ZXJwcmV0X2Nhc3Q8dm9pZCAqKj4oJl9vLT52ZWN0b3Jfb2Zfbm9uX293bmluZ19yZWZlcmVuY2VzW19pXSksIHN0YXRpY19jYXN0PGZsYXRidWZmZXJzOjpoYXNoX3ZhbHVlX3Q+KF9lLT5HZXQoX2kpKSk7IGVsc2UgX28tPnZlY3Rvcl9vZl9ub25fb3duaW5nX3JlZmVyZW5jZXNbX2ldID0gbnVsbHB0cjsgfSB9IGVsc2UgeyBfby0+dmVjdG9yX29mX25vbl9vd25pbmdfcmVmZXJlbmNlcy5yZXNpemUoMCk7IH0gfQogICB7IGF1dG8gX2UgPSBhbnlfdW5pcXVlX3R5cGUoKTsgX28tPmFueV91bmlxdWUudHlwZSA9IF9lOyB9CiAgIHsgYXV0byBfZSA9IGFueV91bmlxdWUoKTsgaWYgKF9lKSBfby0+YW55X3VuaXF1ZS52YWx1ZSA9IE15R2FtZTo6RXhhbXBsZTo6QW55VW5pcXVlQWxpYXNlc1VuaW9uOjpVblBhY2soX2UsIGFueV91bmlxdWVfdHlwZSgpLCBfcmVzb2x2ZXIpOyB9CiAgIHsgYXV0byBfZSA9IGFueV9hbWJpZ3VvdXNfdHlwZSgpOyBfby0+YW55X2FtYmlndW91cy50eXBlID0gX2U7IH0KICAgeyBhdXRvIF9lID0gYW55X2FtYmlndW91cygpOyBpZiAoX2UpIF9vLT5hbnlfYW1iaWd1b3VzLnZhbHVlID0gTXlHYW1lOjpFeGFtcGxlOjpBbnlBbWJpZ3VvdXNBbGlhc2VzVW5pb246OlVuUGFjayhfZSwgYW55X2FtYmlndW91c190eXBlKCksIF9yZXNvbHZlcik7IH0KLSAgeyBhdXRvIF9lID0gdmVjdG9yX29mX2VudW1zKCk7IGlmIChfZSkgeyBfby0+dmVjdG9yX29mX2VudW1zLnJlc2l6ZShfZS0+c2l6ZSgpKTsgZm9yIChmbGF0YnVmZmVyczo6dW9mZnNldF90IF9pID0gMDsgX2kgPCBfZS0+c2l6ZSgpOyBfaSsrKSB7IF9vLT52ZWN0b3Jfb2ZfZW51bXNbX2ldID0gc3RhdGljX2Nhc3Q8TXlHYW1lOjpFeGFtcGxlOjpDb2xvcj4oX2UtPkdldChfaSkpOyB9IH0gfQorICB7IGF1dG8gX2UgPSB2ZWN0b3Jfb2ZfZW51bXMoKTsgaWYgKF9lKSB7IF9vLT52ZWN0b3Jfb2ZfZW51bXMucmVzaXplKF9lLT5zaXplKCkpOyBmb3IgKGZsYXRidWZmZXJzOjp1b2Zmc2V0X3QgX2kgPSAwOyBfaSA8IF9lLT5zaXplKCk7IF9pKyspIHsgX28tPnZlY3Rvcl9vZl9lbnVtc1tfaV0gPSBzdGF0aWNfY2FzdDxNeUdhbWU6OkV4YW1wbGU6OkNvbG9yPihfZS0+R2V0KF9pKSk7IH0gfSBlbHNlIHsgX28tPnZlY3Rvcl9vZl9lbnVtcy5yZXNpemUoMCk7IH0gfQogICB7IGF1dG8gX2UgPSBzaWduZWRfZW51bSgpOyBfby0+c2lnbmVkX2VudW0gPSBfZTsgfQogICB7IGF1dG8gX2UgPSB0ZXN0cmVxdWlyZWRuZXN0ZWRmbGF0YnVmZmVyKCk7IGlmIChfZSkgeyBfby0+dGVzdHJlcXVpcmVkbmVzdGVkZmxhdGJ1ZmZlci5yZXNpemUoX2UtPnNpemUoKSk7IHN0ZDo6Y29weShfZS0+YmVnaW4oKSwgX2UtPmVuZCgpLCBfby0+dGVzdHJlcXVpcmVkbmVzdGVkZmxhdGJ1ZmZlci5iZWdpbigpKTsgfSB9Ci0gIHsgYXV0byBfZSA9IHNjYWxhcl9rZXlfc29ydGVkX3RhYmxlcygpOyBpZiAoX2UpIHsgX28tPnNjYWxhcl9rZXlfc29ydGVkX3RhYmxlcy5yZXNpemUoX2UtPnNpemUoKSk7IGZvciAoZmxhdGJ1ZmZlcnM6OnVvZmZzZXRfdCBfaSA9IDA7IF9pIDwgX2UtPnNpemUoKTsgX2krKykgeyBpZihfby0+c2NhbGFyX2tleV9zb3J0ZWRfdGFibGVzW19pXSkgeyBfZS0+R2V0KF9pKS0+VW5QYWNrVG8oX28tPnNjYWxhcl9rZXlfc29ydGVkX3RhYmxlc1tfaV0uZ2V0KCksIF9yZXNvbHZlcik7IH0gZWxzZSB7IF9vLT5zY2FsYXJfa2V5X3NvcnRlZF90YWJsZXNbX2ldID0gZmxhdGJ1ZmZlcnM6OnVuaXF1ZV9wdHI8TXlHYW1lOjpFeGFtcGxlOjpTdGF0VD4oX2UtPkdldChfaSktPlVuUGFjayhfcmVzb2x2ZXIpKTsgfTsgfSB9IH0KKyAgeyBhdXRvIF9lID0gc2NhbGFyX2tleV9zb3J0ZWRfdGFibGVzKCk7IGlmIChfZSkgeyBfby0+c2NhbGFyX2tleV9zb3J0ZWRfdGFibGVzLnJlc2l6ZShfZS0+c2l6ZSgpKTsgZm9yIChmbGF0YnVmZmVyczo6dW9mZnNldF90IF9pID0gMDsgX2kgPCBfZS0+c2l6ZSgpOyBfaSsrKSB7IGlmKF9vLT5zY2FsYXJfa2V5X3NvcnRlZF90YWJsZXNbX2ldKSB7IF9lLT5HZXQoX2kpLT5VblBhY2tUbyhfby0+c2NhbGFyX2tleV9zb3J0ZWRfdGFibGVzW19pXS5nZXQoKSwgX3Jlc29sdmVyKTsgfSBlbHNlIHsgX28tPnNjYWxhcl9rZXlfc29ydGVkX3RhYmxlc1tfaV0gPSBmbGF0YnVmZmVyczo6dW5pcXVlX3B0cjxNeUdhbWU6OkV4YW1wbGU6OlN0YXRUPihfZS0+R2V0KF9pKS0+VW5QYWNrKF9yZXNvbHZlcikpOyB9OyB9IH0gZWxzZSB7IF9vLT5zY2FsYXJfa2V5X3NvcnRlZF90YWJsZXMucmVzaXplKDApOyB9IH0KICAgeyBhdXRvIF9lID0gbmF0aXZlX2lubGluZSgpOyBpZiAoX2UpIF9vLT5uYXRpdmVfaW5saW5lID0gKl9lOyB9CiAgIHsgYXV0byBfZSA9IGxvbmdfZW51bV9ub25fZW51bV9kZWZhdWx0KCk7IF9vLT5sb25nX2VudW1fbm9uX2VudW1fZGVmYXVsdCA9IF9lOyB9CiAgIHsgYXV0byBfZSA9IGxvbmdfZW51bV9ub3JtYWxfZGVmYXVsdCgpOyBfby0+bG9uZ19lbnVtX25vcm1hbF9kZWZhdWx0ID0gX2U7IH0KQEAgLTI5MTksNyArMjk1OSw3IEBACiAgICh2b2lkKV9yZWhhc2hlcjsKICAgKHZvaWQpX287CiAgIHN0cnVjdCBfVmVjdG9yQXJncyB7IGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAqX19mYmI7IGNvbnN0IE1vbnN0ZXJUKiBfX287IGNvbnN0IGZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfX3JlaGFzaGVyOyB9IF92YSA9IHsgJl9mYmIsIF9vLCBfcmVoYXNoZXJ9OyAodm9pZClfdmE7Ci0gIGF1dG8gX3BvcyA9IF9vLT5wb3MgPyBfby0+cG9zLmdldCgpIDogMDsKKyAgYXV0byBfcG9zID0gX28tPnBvcyA/IF9vLT5wb3MuZ2V0KCkgOiBudWxscHRyOwogICBhdXRvIF9tYW5hID0gX28tPm1hbmE7CiAgIGF1dG8gX2hwID0gX28tPmhwOwogICBhdXRvIF9uYW1lID0gX2ZiYi5DcmVhdGVTdHJpbmcoX28tPm5hbWUpOwpAQCAtMzA3MSw3ICszMTExLDcgQEAKICAgeyBhdXRvIF9lID0gZjMyKCk7IF9vLT5mMzIgPSBfZTsgfQogICB7IGF1dG8gX2UgPSBmNjQoKTsgX28tPmY2NCA9IF9lOyB9CiAgIHsgYXV0byBfZSA9IHY4KCk7IGlmIChfZSkgeyBfby0+djgucmVzaXplKF9lLT5zaXplKCkpOyBzdGQ6OmNvcHkoX2UtPmJlZ2luKCksIF9lLT5lbmQoKSwgX28tPnY4LmJlZ2luKCkpOyB9IH0KLSAgeyBhdXRvIF9lID0gdmY2NCgpOyBpZiAoX2UpIHsgX28tPnZmNjQucmVzaXplKF9lLT5zaXplKCkpOyBmb3IgKGZsYXRidWZmZXJzOjp1b2Zmc2V0X3QgX2kgPSAwOyBfaSA8IF9lLT5zaXplKCk7IF9pKyspIHsgX28tPnZmNjRbX2ldID0gX2UtPkdldChfaSk7IH0gfSB9CisgIHsgYXV0byBfZSA9IHZmNjQoKTsgaWYgKF9lKSB7IF9vLT52ZjY0LnJlc2l6ZShfZS0+c2l6ZSgpKTsgZm9yIChmbGF0YnVmZmVyczo6dW9mZnNldF90IF9pID0gMDsgX2kgPCBfZS0+c2l6ZSgpOyBfaSsrKSB7IF9vLT52ZjY0W19pXSA9IF9lLT5HZXQoX2kpOyB9IH0gZWxzZSB7IF9vLT52ZjY0LnJlc2l6ZSgwKTsgfSB9CiB9CiAKIGlubGluZSBmbGF0YnVmZmVyczo6T2Zmc2V0PFR5cGVBbGlhc2VzPiBUeXBlQWxpYXNlczo6UGFjayhmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IFR5cGVBbGlhc2VzVCogX28sIGNvbnN0IGZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIpIHsKQEAgLTM3MDQsNiArMzc0NCwyMyBAQAogICByZXR1cm4gJnR0OwogfQogCitpbmxpbmUgY29uc3QgZmxhdGJ1ZmZlcnM6OlR5cGVUYWJsZSAqU3RydWN0T2ZTdHJ1Y3RzT2ZTdHJ1Y3RzVHlwZVRhYmxlKCkgeworICBzdGF0aWMgY29uc3QgZmxhdGJ1ZmZlcnM6OlR5cGVDb2RlIHR5cGVfY29kZXNbXSA9IHsKKyAgICB7IGZsYXRidWZmZXJzOjpFVF9TRVFVRU5DRSwgMCwgMCB9CisgIH07CisgIHN0YXRpYyBjb25zdCBmbGF0YnVmZmVyczo6VHlwZUZ1bmN0aW9uIHR5cGVfcmVmc1tdID0geworICAgIE15R2FtZTo6RXhhbXBsZTo6U3RydWN0T2ZTdHJ1Y3RzVHlwZVRhYmxlCisgIH07CisgIHN0YXRpYyBjb25zdCBpbnQ2NF90IHZhbHVlc1tdID0geyAwLCAyMCB9OworICBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IG5hbWVzW10gPSB7CisgICAgImEiCisgIH07CisgIHN0YXRpYyBjb25zdCBmbGF0YnVmZmVyczo6VHlwZVRhYmxlIHR0ID0geworICAgIGZsYXRidWZmZXJzOjpTVF9TVFJVQ1QsIDEsIHR5cGVfY29kZXMsIHR5cGVfcmVmcywgbnVsbHB0ciwgdmFsdWVzLCBuYW1lcworICB9OworICByZXR1cm4gJnR0OworfQorCiBpbmxpbmUgY29uc3QgZmxhdGJ1ZmZlcnM6OlR5cGVUYWJsZSAqU3RhdFR5cGVUYWJsZSgpIHsKICAgc3RhdGljIGNvbnN0IGZsYXRidWZmZXJzOjpUeXBlQ29kZSB0eXBlX2NvZGVzW10gPSB7CiAgICAgeyBmbGF0YnVmZmVyczo6RVRfU1RSSU5HLCAwLCAtMSB9LApkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvbW9uc3Rlcl90ZXN0X2dlbmVyYXRlZC5sb2JzdGVyIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvbW9uc3Rlcl90ZXN0X2dlbmVyYXRlZC5sb2JzdGVyCmluZGV4IDIzODIwNmYuLmMzZWU3ODUgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL21vbnN0ZXJfdGVzdF9nZW5lcmF0ZWQubG9ic3RlcgorKysgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9tb25zdGVyX3Rlc3RfZ2VuZXJhdGVkLmxvYnN0ZXIKQEAgLTYxLDYgKzYxLDggQEAKIAogY2xhc3MgU3RydWN0T2ZTdHJ1Y3RzCiAKK2NsYXNzIFN0cnVjdE9mU3RydWN0c09mU3RydWN0cworCiBjbGFzcyBTdGF0CiAKIGNsYXNzIFJlZmVycmFibGUKQEAgLTEwMCw5ICsxMDIsOSBAQAogbmFtZXNwYWNlIE15R2FtZV9FeGFtcGxlCiAKIGNsYXNzIFRlc3QgOiBmbGF0YnVmZmVyc19oYW5kbGUKLSAgICBkZWYgYSgpOgorICAgIGRlZiBhKCkgLT4gaW50OgogICAgICAgICByZXR1cm4gYnVmXy5yZWFkX2ludDE2X2xlKHBvc18gKyAwKQotICAgIGRlZiBiKCk6CisgICAgZGVmIGIoKSAtPiBpbnQ6CiAgICAgICAgIHJldHVybiBidWZfLnJlYWRfaW50OF9sZShwb3NfICsgMikKIAogZGVmIENyZWF0ZVRlc3QoYl86ZmxhdGJ1ZmZlcnNfYnVpbGRlciwgYTppbnQsIGI6aW50KToKQEAgLTExMyw3ICsxMTUsNyBAQAogICAgIHJldHVybiBiXy5PZmZzZXQoKQogCiBjbGFzcyBUZXN0U2ltcGxlVGFibGVXaXRoRW51bSA6IGZsYXRidWZmZXJzX2hhbmRsZQotICAgIGRlZiBjb2xvcigpOgorICAgIGRlZiBjb2xvcigpIC0+IENvbG9yOgogICAgICAgICByZXR1cm4gQ29sb3IoYnVmXy5mbGF0YnVmZmVyc19maWVsZF91aW50OChwb3NfLCA0LCAyKSkKIAogZGVmIEdldFJvb3RBc1Rlc3RTaW1wbGVUYWJsZVdpdGhFbnVtKGJ1ZjpzdHJpbmcpOiByZXR1cm4gVGVzdFNpbXBsZVRhYmxlV2l0aEVudW0geyBidWYsIGJ1Zi5mbGF0YnVmZmVyc19pbmRpcmVjdCgwKSB9CkBAIC0xMzAsMTcgKzEzMiwxNyBAQAogICAgICAgICByZXR1cm4gYl8uRW5kT2JqZWN0KCkKIAogY2xhc3MgVmVjMyA6IGZsYXRidWZmZXJzX2hhbmRsZQotICAgIGRlZiB4KCk6CisgICAgZGVmIHgoKSAtPiBmbG9hdDoKICAgICAgICAgcmV0dXJuIGJ1Zl8ucmVhZF9mbG9hdDMyX2xlKHBvc18gKyAwKQotICAgIGRlZiB5KCk6CisgICAgZGVmIHkoKSAtPiBmbG9hdDoKICAgICAgICAgcmV0dXJuIGJ1Zl8ucmVhZF9mbG9hdDMyX2xlKHBvc18gKyA0KQotICAgIGRlZiB6KCk6CisgICAgZGVmIHooKSAtPiBmbG9hdDoKICAgICAgICAgcmV0dXJuIGJ1Zl8ucmVhZF9mbG9hdDMyX2xlKHBvc18gKyA4KQotICAgIGRlZiB0ZXN0MSgpOgorICAgIGRlZiB0ZXN0MSgpIC0+IGZsb2F0OgogICAgICAgICByZXR1cm4gYnVmXy5yZWFkX2Zsb2F0NjRfbGUocG9zXyArIDE2KQotICAgIGRlZiB0ZXN0MigpOgorICAgIGRlZiB0ZXN0MigpIC0+IENvbG9yOgogICAgICAgICByZXR1cm4gQ29sb3IoYnVmXy5yZWFkX3VpbnQ4X2xlKHBvc18gKyAyNCkpCi0gICAgZGVmIHRlc3QzKCk6CisgICAgZGVmIHRlc3QzKCkgLT4gTXlHYW1lX0V4YW1wbGVfVGVzdDoKICAgICAgICAgcmV0dXJuIE15R2FtZV9FeGFtcGxlX1Rlc3R7IGJ1Zl8sIHBvc18gKyAyNiB9CiAKIGRlZiBDcmVhdGVWZWMzKGJfOmZsYXRidWZmZXJzX2J1aWxkZXIsIHg6ZmxvYXQsIHk6ZmxvYXQsIHo6ZmxvYXQsIHRlc3QxOmZsb2F0LCB0ZXN0MjpDb2xvciwgdGVzdDNfYTppbnQsIHRlc3QzX2I6aW50KToKQEAgLTE2MCw5ICsxNjIsOSBAQAogICAgIHJldHVybiBiXy5PZmZzZXQoKQogCiBjbGFzcyBBYmlsaXR5IDogZmxhdGJ1ZmZlcnNfaGFuZGxlCi0gICAgZGVmIGlkKCk6CisgICAgZGVmIGlkKCkgLT4gaW50OgogICAgICAgICByZXR1cm4gYnVmXy5yZWFkX3VpbnQzMl9sZShwb3NfICsgMCkKLSAgICBkZWYgZGlzdGFuY2UoKToKKyAgICBkZWYgZGlzdGFuY2UoKSAtPiBpbnQ6CiAgICAgICAgIHJldHVybiBidWZfLnJlYWRfdWludDMyX2xlKHBvc18gKyA0KQogCiBkZWYgQ3JlYXRlQWJpbGl0eShiXzpmbGF0YnVmZmVyc19idWlsZGVyLCBpZDppbnQsIGRpc3RhbmNlOmludCk6CkBAIC0xNzIsMTEgKzE3NCwxMSBAQAogICAgIHJldHVybiBiXy5PZmZzZXQoKQogCiBjbGFzcyBTdHJ1Y3RPZlN0cnVjdHMgOiBmbGF0YnVmZmVyc19oYW5kbGUKLSAgICBkZWYgYSgpOgorICAgIGRlZiBhKCkgLT4gTXlHYW1lX0V4YW1wbGVfQWJpbGl0eToKICAgICAgICAgcmV0dXJuIE15R2FtZV9FeGFtcGxlX0FiaWxpdHl7IGJ1Zl8sIHBvc18gKyAwIH0KLSAgICBkZWYgYigpOgorICAgIGRlZiBiKCkgLT4gTXlHYW1lX0V4YW1wbGVfVGVzdDoKICAgICAgICAgcmV0dXJuIE15R2FtZV9FeGFtcGxlX1Rlc3R7IGJ1Zl8sIHBvc18gKyA4IH0KLSAgICBkZWYgYygpOgorICAgIGRlZiBjKCkgLT4gTXlHYW1lX0V4YW1wbGVfQWJpbGl0eToKICAgICAgICAgcmV0dXJuIE15R2FtZV9FeGFtcGxlX0FiaWxpdHl7IGJ1Zl8sIHBvc18gKyAxMiB9CiAKIGRlZiBDcmVhdGVTdHJ1Y3RPZlN0cnVjdHMoYl86ZmxhdGJ1ZmZlcnNfYnVpbGRlciwgYV9pZDppbnQsIGFfZGlzdGFuY2U6aW50LCBiX2E6aW50LCBiX2I6aW50LCBjX2lkOmludCwgY19kaXN0YW5jZTppbnQpOgpAQCAtMTkzLDEyICsxOTUsMzEgQEAKICAgICBiXy5QcmVwZW5kVWludDMyKGFfaWQpCiAgICAgcmV0dXJuIGJfLk9mZnNldCgpCiAKK2NsYXNzIFN0cnVjdE9mU3RydWN0c09mU3RydWN0cyA6IGZsYXRidWZmZXJzX2hhbmRsZQorICAgIGRlZiBhKCkgLT4gTXlHYW1lX0V4YW1wbGVfU3RydWN0T2ZTdHJ1Y3RzOgorICAgICAgICByZXR1cm4gTXlHYW1lX0V4YW1wbGVfU3RydWN0T2ZTdHJ1Y3RzeyBidWZfLCBwb3NfICsgMCB9CisKK2RlZiBDcmVhdGVTdHJ1Y3RPZlN0cnVjdHNPZlN0cnVjdHMoYl86ZmxhdGJ1ZmZlcnNfYnVpbGRlciwgYV9hX2lkOmludCwgYV9hX2Rpc3RhbmNlOmludCwgYV9iX2E6aW50LCBhX2JfYjppbnQsIGFfY19pZDppbnQsIGFfY19kaXN0YW5jZTppbnQpOgorICAgIGJfLlByZXAoNCwgMjApCisgICAgYl8uUHJlcCg0LCAyMCkKKyAgICBiXy5QcmVwKDQsIDgpCisgICAgYl8uUHJlcGVuZFVpbnQzMihhX2NfZGlzdGFuY2UpCisgICAgYl8uUHJlcGVuZFVpbnQzMihhX2NfaWQpCisgICAgYl8uUHJlcCgyLCA0KQorICAgIGJfLlBhZCgxKQorICAgIGJfLlByZXBlbmRJbnQ4KGFfYl9iKQorICAgIGJfLlByZXBlbmRJbnQxNihhX2JfYSkKKyAgICBiXy5QcmVwKDQsIDgpCisgICAgYl8uUHJlcGVuZFVpbnQzMihhX2FfZGlzdGFuY2UpCisgICAgYl8uUHJlcGVuZFVpbnQzMihhX2FfaWQpCisgICAgcmV0dXJuIGJfLk9mZnNldCgpCisKIGNsYXNzIFN0YXQgOiBmbGF0YnVmZmVyc19oYW5kbGUKLSAgICBkZWYgaWQoKToKKyAgICBkZWYgaWQoKSAtPiBzdHJpbmc6CiAgICAgICAgIHJldHVybiBidWZfLmZsYXRidWZmZXJzX2ZpZWxkX3N0cmluZyhwb3NfLCA0KQotICAgIGRlZiB2YWwoKToKKyAgICBkZWYgdmFsKCkgLT4gaW50OgogICAgICAgICByZXR1cm4gYnVmXy5mbGF0YnVmZmVyc19maWVsZF9pbnQ2NChwb3NfLCA2LCAwKQotICAgIGRlZiBjb3VudCgpOgorICAgIGRlZiBjb3VudCgpIC0+IGludDoKICAgICAgICAgcmV0dXJuIGJ1Zl8uZmxhdGJ1ZmZlcnNfZmllbGRfdWludDE2KHBvc18sIDgsIDApCiAKIGRlZiBHZXRSb290QXNTdGF0KGJ1ZjpzdHJpbmcpOiByZXR1cm4gU3RhdCB7IGJ1ZiwgYnVmLmZsYXRidWZmZXJzX2luZGlyZWN0KDApIH0KQEAgLTIyMSw3ICsyNDIsNyBAQAogICAgICAgICByZXR1cm4gYl8uRW5kT2JqZWN0KCkKIAogY2xhc3MgUmVmZXJyYWJsZSA6IGZsYXRidWZmZXJzX2hhbmRsZQotICAgIGRlZiBpZCgpOgorICAgIGRlZiBpZCgpIC0+IGludDoKICAgICAgICAgcmV0dXJuIGJ1Zl8uZmxhdGJ1ZmZlcnNfZmllbGRfdWludDY0KHBvc18sIDQsIDApCiAKIGRlZiBHZXRSb290QXNSZWZlcnJhYmxlKGJ1ZjpzdHJpbmcpOiByZXR1cm4gUmVmZXJyYWJsZSB7IGJ1ZiwgYnVmLmZsYXRidWZmZXJzX2luZGlyZWN0KDApIH0KQEAgLTIzOSwyMiArMjYwLDIyIEBACiAKIC8vLyBhbiBleGFtcGxlIGRvY3VtZW50YXRpb24gY29tbWVudDogIm1vbnN0ZXIgb2JqZWN0IgogY2xhc3MgTW9uc3RlciA6IGZsYXRidWZmZXJzX2hhbmRsZQotICAgIGRlZiBwb3MoKToKKyAgICBkZWYgcG9zKCkgLT4gTXlHYW1lX0V4YW1wbGVfVmVjMz86CiAgICAgICAgIGxldCBvID0gYnVmXy5mbGF0YnVmZmVyc19maWVsZF9zdHJ1Y3QocG9zXywgNCkKICAgICAgICAgcmV0dXJuIGlmIG86IE15R2FtZV9FeGFtcGxlX1ZlYzMgeyBidWZfLCBvIH0gZWxzZTogbmlsCi0gICAgZGVmIG1hbmEoKToKKyAgICBkZWYgbWFuYSgpIC0+IGludDoKICAgICAgICAgcmV0dXJuIGJ1Zl8uZmxhdGJ1ZmZlcnNfZmllbGRfaW50MTYocG9zXywgNiwgMTUwKQotICAgIGRlZiBocCgpOgorICAgIGRlZiBocCgpIC0+IGludDoKICAgICAgICAgcmV0dXJuIGJ1Zl8uZmxhdGJ1ZmZlcnNfZmllbGRfaW50MTYocG9zXywgOCwgMTAwKQotICAgIGRlZiBuYW1lKCk6CisgICAgZGVmIG5hbWUoKSAtPiBzdHJpbmc6CiAgICAgICAgIHJldHVybiBidWZfLmZsYXRidWZmZXJzX2ZpZWxkX3N0cmluZyhwb3NfLCAxMCkKLSAgICBkZWYgaW52ZW50b3J5KGk6aW50KToKKyAgICBkZWYgaW52ZW50b3J5KGk6aW50KSAtPiBpbnQ6CiAgICAgICAgIHJldHVybiBidWZfLnJlYWRfdWludDhfbGUoYnVmXy5mbGF0YnVmZmVyc19maWVsZF92ZWN0b3IocG9zXywgMTQpICsgaSAqIDEpCi0gICAgZGVmIGludmVudG9yeV9sZW5ndGgoKToKKyAgICBkZWYgaW52ZW50b3J5X2xlbmd0aCgpIC0+IGludDoKICAgICAgICAgcmV0dXJuIGJ1Zl8uZmxhdGJ1ZmZlcnNfZmllbGRfdmVjdG9yX2xlbihwb3NfLCAxNCkKLSAgICBkZWYgY29sb3IoKToKKyAgICBkZWYgY29sb3IoKSAtPiBDb2xvcjoKICAgICAgICAgcmV0dXJuIENvbG9yKGJ1Zl8uZmxhdGJ1ZmZlcnNfZmllbGRfdWludDgocG9zXywgMTYsIDgpKQotICAgIGRlZiB0ZXN0X3R5cGUoKToKKyAgICBkZWYgdGVzdF90eXBlKCkgLT4gQW55OgogICAgICAgICByZXR1cm4gQW55KGJ1Zl8uZmxhdGJ1ZmZlcnNfZmllbGRfdWludDgocG9zXywgMTgsIDApKQogICAgIGRlZiB0ZXN0X2FzX01vbnN0ZXIoKToKICAgICAgICAgcmV0dXJuIE15R2FtZV9FeGFtcGxlX01vbnN0ZXIgeyBidWZfLCBidWZfLmZsYXRidWZmZXJzX2ZpZWxkX3RhYmxlKHBvc18sIDIwKSB9CkBAIC0yNjIsMTEyICsyODMsMTEyIEBACiAgICAgICAgIHJldHVybiBNeUdhbWVfRXhhbXBsZV9UZXN0U2ltcGxlVGFibGVXaXRoRW51bSB7IGJ1Zl8sIGJ1Zl8uZmxhdGJ1ZmZlcnNfZmllbGRfdGFibGUocG9zXywgMjApIH0KICAgICBkZWYgdGVzdF9hc19NeUdhbWVfRXhhbXBsZTJfTW9uc3RlcigpOgogICAgICAgICByZXR1cm4gTXlHYW1lX0V4YW1wbGUyX01vbnN0ZXIgeyBidWZfLCBidWZfLmZsYXRidWZmZXJzX2ZpZWxkX3RhYmxlKHBvc18sIDIwKSB9Ci0gICAgZGVmIHRlc3Q0KGk6aW50KToKKyAgICBkZWYgdGVzdDQoaTppbnQpIC0+IE15R2FtZV9FeGFtcGxlX1Rlc3Q6CiAgICAgICAgIHJldHVybiBNeUdhbWVfRXhhbXBsZV9UZXN0IHsgYnVmXywgYnVmXy5mbGF0YnVmZmVyc19maWVsZF92ZWN0b3IocG9zXywgMjIpICsgaSAqIDQgfQotICAgIGRlZiB0ZXN0NF9sZW5ndGgoKToKKyAgICBkZWYgdGVzdDRfbGVuZ3RoKCkgLT4gaW50OgogICAgICAgICByZXR1cm4gYnVmXy5mbGF0YnVmZmVyc19maWVsZF92ZWN0b3JfbGVuKHBvc18sIDIyKQotICAgIGRlZiB0ZXN0YXJyYXlvZnN0cmluZyhpOmludCk6CisgICAgZGVmIHRlc3RhcnJheW9mc3RyaW5nKGk6aW50KSAtPiBzdHJpbmc6CiAgICAgICAgIHJldHVybiBidWZfLmZsYXRidWZmZXJzX3N0cmluZyhidWZfLmZsYXRidWZmZXJzX2ZpZWxkX3ZlY3Rvcihwb3NfLCAyNCkgKyBpICogNCkKLSAgICBkZWYgdGVzdGFycmF5b2ZzdHJpbmdfbGVuZ3RoKCk6CisgICAgZGVmIHRlc3RhcnJheW9mc3RyaW5nX2xlbmd0aCgpIC0+IGludDoKICAgICAgICAgcmV0dXJuIGJ1Zl8uZmxhdGJ1ZmZlcnNfZmllbGRfdmVjdG9yX2xlbihwb3NfLCAyNCkKICAgICAvLy8gYW4gZXhhbXBsZSBkb2N1bWVudGF0aW9uIGNvbW1lbnQ6IHRoaXMgd2lsbCBlbmQgdXAgaW4gdGhlIGdlbmVyYXRlZCBjb2RlCiAgICAgLy8vIG11bHRpbGluZSB0b28KLSAgICBkZWYgdGVzdGFycmF5b2Z0YWJsZXMoaTppbnQpOgorICAgIGRlZiB0ZXN0YXJyYXlvZnRhYmxlcyhpOmludCkgLT4gTXlHYW1lX0V4YW1wbGVfTW9uc3RlcjoKICAgICAgICAgcmV0dXJuIE15R2FtZV9FeGFtcGxlX01vbnN0ZXIgeyBidWZfLCBidWZfLmZsYXRidWZmZXJzX2luZGlyZWN0KGJ1Zl8uZmxhdGJ1ZmZlcnNfZmllbGRfdmVjdG9yKHBvc18sIDI2KSArIGkgKiA0KSB9Ci0gICAgZGVmIHRlc3RhcnJheW9mdGFibGVzX2xlbmd0aCgpOgorICAgIGRlZiB0ZXN0YXJyYXlvZnRhYmxlc19sZW5ndGgoKSAtPiBpbnQ6CiAgICAgICAgIHJldHVybiBidWZfLmZsYXRidWZmZXJzX2ZpZWxkX3ZlY3Rvcl9sZW4ocG9zXywgMjYpCi0gICAgZGVmIGVuZW15KCk6CisgICAgZGVmIGVuZW15KCkgLT4gTXlHYW1lX0V4YW1wbGVfTW9uc3Rlcj86CiAgICAgICAgIGxldCBvID0gYnVmXy5mbGF0YnVmZmVyc19maWVsZF90YWJsZShwb3NfLCAyOCkKICAgICAgICAgcmV0dXJuIGlmIG86IE15R2FtZV9FeGFtcGxlX01vbnN0ZXIgeyBidWZfLCBvIH0gZWxzZTogbmlsCi0gICAgZGVmIHRlc3RuZXN0ZWRmbGF0YnVmZmVyKGk6aW50KToKKyAgICBkZWYgdGVzdG5lc3RlZGZsYXRidWZmZXIoaTppbnQpIC0+IGludDoKICAgICAgICAgcmV0dXJuIGJ1Zl8ucmVhZF91aW50OF9sZShidWZfLmZsYXRidWZmZXJzX2ZpZWxkX3ZlY3Rvcihwb3NfLCAzMCkgKyBpICogMSkKLSAgICBkZWYgdGVzdG5lc3RlZGZsYXRidWZmZXJfbGVuZ3RoKCk6CisgICAgZGVmIHRlc3RuZXN0ZWRmbGF0YnVmZmVyX2xlbmd0aCgpIC0+IGludDoKICAgICAgICAgcmV0dXJuIGJ1Zl8uZmxhdGJ1ZmZlcnNfZmllbGRfdmVjdG9yX2xlbihwb3NfLCAzMCkKLSAgICBkZWYgdGVzdGVtcHR5KCk6CisgICAgZGVmIHRlc3RlbXB0eSgpIC0+IE15R2FtZV9FeGFtcGxlX1N0YXQ/OgogICAgICAgICBsZXQgbyA9IGJ1Zl8uZmxhdGJ1ZmZlcnNfZmllbGRfdGFibGUocG9zXywgMzIpCiAgICAgICAgIHJldHVybiBpZiBvOiBNeUdhbWVfRXhhbXBsZV9TdGF0IHsgYnVmXywgbyB9IGVsc2U6IG5pbAotICAgIGRlZiB0ZXN0Ym9vbCgpOgotICAgICAgICByZXR1cm4gYnVmXy5mbGF0YnVmZmVyc19maWVsZF9pbnQ4KHBvc18sIDM0LCAwKQotICAgIGRlZiB0ZXN0aGFzaHMzMl9mbnYxKCk6CisgICAgZGVmIHRlc3Rib29sKCkgLT4gYm9vbDoKKyAgICAgICAgcmV0dXJuIGJvb2woYnVmXy5mbGF0YnVmZmVyc19maWVsZF9pbnQ4KHBvc18sIDM0LCAwKSkKKyAgICBkZWYgdGVzdGhhc2hzMzJfZm52MSgpIC0+IGludDoKICAgICAgICAgcmV0dXJuIGJ1Zl8uZmxhdGJ1ZmZlcnNfZmllbGRfaW50MzIocG9zXywgMzYsIDApCi0gICAgZGVmIHRlc3RoYXNodTMyX2ZudjEoKToKKyAgICBkZWYgdGVzdGhhc2h1MzJfZm52MSgpIC0+IGludDoKICAgICAgICAgcmV0dXJuIGJ1Zl8uZmxhdGJ1ZmZlcnNfZmllbGRfdWludDMyKHBvc18sIDM4LCAwKQotICAgIGRlZiB0ZXN0aGFzaHM2NF9mbnYxKCk6CisgICAgZGVmIHRlc3RoYXNoczY0X2ZudjEoKSAtPiBpbnQ6CiAgICAgICAgIHJldHVybiBidWZfLmZsYXRidWZmZXJzX2ZpZWxkX2ludDY0KHBvc18sIDQwLCAwKQotICAgIGRlZiB0ZXN0aGFzaHU2NF9mbnYxKCk6CisgICAgZGVmIHRlc3RoYXNodTY0X2ZudjEoKSAtPiBpbnQ6CiAgICAgICAgIHJldHVybiBidWZfLmZsYXRidWZmZXJzX2ZpZWxkX3VpbnQ2NChwb3NfLCA0MiwgMCkKLSAgICBkZWYgdGVzdGhhc2hzMzJfZm52MWEoKToKKyAgICBkZWYgdGVzdGhhc2hzMzJfZm52MWEoKSAtPiBpbnQ6CiAgICAgICAgIHJldHVybiBidWZfLmZsYXRidWZmZXJzX2ZpZWxkX2ludDMyKHBvc18sIDQ0LCAwKQotICAgIGRlZiB0ZXN0aGFzaHUzMl9mbnYxYSgpOgorICAgIGRlZiB0ZXN0aGFzaHUzMl9mbnYxYSgpIC0+IGludDoKICAgICAgICAgcmV0dXJuIGJ1Zl8uZmxhdGJ1ZmZlcnNfZmllbGRfdWludDMyKHBvc18sIDQ2LCAwKQotICAgIGRlZiB0ZXN0aGFzaHM2NF9mbnYxYSgpOgorICAgIGRlZiB0ZXN0aGFzaHM2NF9mbnYxYSgpIC0+IGludDoKICAgICAgICAgcmV0dXJuIGJ1Zl8uZmxhdGJ1ZmZlcnNfZmllbGRfaW50NjQocG9zXywgNDgsIDApCi0gICAgZGVmIHRlc3RoYXNodTY0X2ZudjFhKCk6CisgICAgZGVmIHRlc3RoYXNodTY0X2ZudjFhKCkgLT4gaW50OgogICAgICAgICByZXR1cm4gYnVmXy5mbGF0YnVmZmVyc19maWVsZF91aW50NjQocG9zXywgNTAsIDApCi0gICAgZGVmIHRlc3RhcnJheW9mYm9vbHMoaTppbnQpOgorICAgIGRlZiB0ZXN0YXJyYXlvZmJvb2xzKGk6aW50KSAtPiBib29sOgogICAgICAgICByZXR1cm4gYnVmXy5yZWFkX2ludDhfbGUoYnVmXy5mbGF0YnVmZmVyc19maWVsZF92ZWN0b3IocG9zXywgNTIpICsgaSAqIDEpCi0gICAgZGVmIHRlc3RhcnJheW9mYm9vbHNfbGVuZ3RoKCk6CisgICAgZGVmIHRlc3RhcnJheW9mYm9vbHNfbGVuZ3RoKCkgLT4gaW50OgogICAgICAgICByZXR1cm4gYnVmXy5mbGF0YnVmZmVyc19maWVsZF92ZWN0b3JfbGVuKHBvc18sIDUyKQotICAgIGRlZiB0ZXN0ZigpOgorICAgIGRlZiB0ZXN0ZigpIC0+IGZsb2F0OgogICAgICAgICByZXR1cm4gYnVmXy5mbGF0YnVmZmVyc19maWVsZF9mbG9hdDMyKHBvc18sIDU0LCAzLjE0MTU5KQotICAgIGRlZiB0ZXN0ZjIoKToKKyAgICBkZWYgdGVzdGYyKCkgLT4gZmxvYXQ6CiAgICAgICAgIHJldHVybiBidWZfLmZsYXRidWZmZXJzX2ZpZWxkX2Zsb2F0MzIocG9zXywgNTYsIDMuMCkKLSAgICBkZWYgdGVzdGYzKCk6CisgICAgZGVmIHRlc3RmMygpIC0+IGZsb2F0OgogICAgICAgICByZXR1cm4gYnVmXy5mbGF0YnVmZmVyc19maWVsZF9mbG9hdDMyKHBvc18sIDU4LCAwLjApCi0gICAgZGVmIHRlc3RhcnJheW9mc3RyaW5nMihpOmludCk6CisgICAgZGVmIHRlc3RhcnJheW9mc3RyaW5nMihpOmludCkgLT4gc3RyaW5nOgogICAgICAgICByZXR1cm4gYnVmXy5mbGF0YnVmZmVyc19zdHJpbmcoYnVmXy5mbGF0YnVmZmVyc19maWVsZF92ZWN0b3IocG9zXywgNjApICsgaSAqIDQpCi0gICAgZGVmIHRlc3RhcnJheW9mc3RyaW5nMl9sZW5ndGgoKToKKyAgICBkZWYgdGVzdGFycmF5b2ZzdHJpbmcyX2xlbmd0aCgpIC0+IGludDoKICAgICAgICAgcmV0dXJuIGJ1Zl8uZmxhdGJ1ZmZlcnNfZmllbGRfdmVjdG9yX2xlbihwb3NfLCA2MCkKLSAgICBkZWYgdGVzdGFycmF5b2Zzb3J0ZWRzdHJ1Y3QoaTppbnQpOgorICAgIGRlZiB0ZXN0YXJyYXlvZnNvcnRlZHN0cnVjdChpOmludCkgLT4gTXlHYW1lX0V4YW1wbGVfQWJpbGl0eToKICAgICAgICAgcmV0dXJuIE15R2FtZV9FeGFtcGxlX0FiaWxpdHkgeyBidWZfLCBidWZfLmZsYXRidWZmZXJzX2ZpZWxkX3ZlY3Rvcihwb3NfLCA2MikgKyBpICogOCB9Ci0gICAgZGVmIHRlc3RhcnJheW9mc29ydGVkc3RydWN0X2xlbmd0aCgpOgorICAgIGRlZiB0ZXN0YXJyYXlvZnNvcnRlZHN0cnVjdF9sZW5ndGgoKSAtPiBpbnQ6CiAgICAgICAgIHJldHVybiBidWZfLmZsYXRidWZmZXJzX2ZpZWxkX3ZlY3Rvcl9sZW4ocG9zXywgNjIpCi0gICAgZGVmIGZsZXgoaTppbnQpOgorICAgIGRlZiBmbGV4KGk6aW50KSAtPiBpbnQ6CiAgICAgICAgIHJldHVybiBidWZfLnJlYWRfdWludDhfbGUoYnVmXy5mbGF0YnVmZmVyc19maWVsZF92ZWN0b3IocG9zXywgNjQpICsgaSAqIDEpCi0gICAgZGVmIGZsZXhfbGVuZ3RoKCk6CisgICAgZGVmIGZsZXhfbGVuZ3RoKCkgLT4gaW50OgogICAgICAgICByZXR1cm4gYnVmXy5mbGF0YnVmZmVyc19maWVsZF92ZWN0b3JfbGVuKHBvc18sIDY0KQotICAgIGRlZiB0ZXN0NShpOmludCk6CisgICAgZGVmIHRlc3Q1KGk6aW50KSAtPiBNeUdhbWVfRXhhbXBsZV9UZXN0OgogICAgICAgICByZXR1cm4gTXlHYW1lX0V4YW1wbGVfVGVzdCB7IGJ1Zl8sIGJ1Zl8uZmxhdGJ1ZmZlcnNfZmllbGRfdmVjdG9yKHBvc18sIDY2KSArIGkgKiA0IH0KLSAgICBkZWYgdGVzdDVfbGVuZ3RoKCk6CisgICAgZGVmIHRlc3Q1X2xlbmd0aCgpIC0+IGludDoKICAgICAgICAgcmV0dXJuIGJ1Zl8uZmxhdGJ1ZmZlcnNfZmllbGRfdmVjdG9yX2xlbihwb3NfLCA2NikKLSAgICBkZWYgdmVjdG9yX29mX2xvbmdzKGk6aW50KToKKyAgICBkZWYgdmVjdG9yX29mX2xvbmdzKGk6aW50KSAtPiBpbnQ6CiAgICAgICAgIHJldHVybiBidWZfLnJlYWRfaW50NjRfbGUoYnVmXy5mbGF0YnVmZmVyc19maWVsZF92ZWN0b3IocG9zXywgNjgpICsgaSAqIDgpCi0gICAgZGVmIHZlY3Rvcl9vZl9sb25nc19sZW5ndGgoKToKKyAgICBkZWYgdmVjdG9yX29mX2xvbmdzX2xlbmd0aCgpIC0+IGludDoKICAgICAgICAgcmV0dXJuIGJ1Zl8uZmxhdGJ1ZmZlcnNfZmllbGRfdmVjdG9yX2xlbihwb3NfLCA2OCkKLSAgICBkZWYgdmVjdG9yX29mX2RvdWJsZXMoaTppbnQpOgorICAgIGRlZiB2ZWN0b3Jfb2ZfZG91YmxlcyhpOmludCkgLT4gZmxvYXQ6CiAgICAgICAgIHJldHVybiBidWZfLnJlYWRfZmxvYXQ2NF9sZShidWZfLmZsYXRidWZmZXJzX2ZpZWxkX3ZlY3Rvcihwb3NfLCA3MCkgKyBpICogOCkKLSAgICBkZWYgdmVjdG9yX29mX2RvdWJsZXNfbGVuZ3RoKCk6CisgICAgZGVmIHZlY3Rvcl9vZl9kb3VibGVzX2xlbmd0aCgpIC0+IGludDoKICAgICAgICAgcmV0dXJuIGJ1Zl8uZmxhdGJ1ZmZlcnNfZmllbGRfdmVjdG9yX2xlbihwb3NfLCA3MCkKLSAgICBkZWYgcGFyZW50X25hbWVzcGFjZV90ZXN0KCk6CisgICAgZGVmIHBhcmVudF9uYW1lc3BhY2VfdGVzdCgpIC0+IE15R2FtZV9JblBhcmVudE5hbWVzcGFjZT86CiAgICAgICAgIGxldCBvID0gYnVmXy5mbGF0YnVmZmVyc19maWVsZF90YWJsZShwb3NfLCA3MikKICAgICAgICAgcmV0dXJuIGlmIG86IE15R2FtZV9JblBhcmVudE5hbWVzcGFjZSB7IGJ1Zl8sIG8gfSBlbHNlOiBuaWwKLSAgICBkZWYgdmVjdG9yX29mX3JlZmVycmFibGVzKGk6aW50KToKKyAgICBkZWYgdmVjdG9yX29mX3JlZmVycmFibGVzKGk6aW50KSAtPiBNeUdhbWVfRXhhbXBsZV9SZWZlcnJhYmxlOgogICAgICAgICByZXR1cm4gTXlHYW1lX0V4YW1wbGVfUmVmZXJyYWJsZSB7IGJ1Zl8sIGJ1Zl8uZmxhdGJ1ZmZlcnNfaW5kaXJlY3QoYnVmXy5mbGF0YnVmZmVyc19maWVsZF92ZWN0b3IocG9zXywgNzQpICsgaSAqIDQpIH0KLSAgICBkZWYgdmVjdG9yX29mX3JlZmVycmFibGVzX2xlbmd0aCgpOgorICAgIGRlZiB2ZWN0b3Jfb2ZfcmVmZXJyYWJsZXNfbGVuZ3RoKCkgLT4gaW50OgogICAgICAgICByZXR1cm4gYnVmXy5mbGF0YnVmZmVyc19maWVsZF92ZWN0b3JfbGVuKHBvc18sIDc0KQotICAgIGRlZiBzaW5nbGVfd2Vha19yZWZlcmVuY2UoKToKKyAgICBkZWYgc2luZ2xlX3dlYWtfcmVmZXJlbmNlKCkgLT4gaW50OgogICAgICAgICByZXR1cm4gYnVmXy5mbGF0YnVmZmVyc19maWVsZF91aW50NjQocG9zXywgNzYsIDApCi0gICAgZGVmIHZlY3Rvcl9vZl93ZWFrX3JlZmVyZW5jZXMoaTppbnQpOgorICAgIGRlZiB2ZWN0b3Jfb2Zfd2Vha19yZWZlcmVuY2VzKGk6aW50KSAtPiBpbnQ6CiAgICAgICAgIHJldHVybiBidWZfLnJlYWRfdWludDY0X2xlKGJ1Zl8uZmxhdGJ1ZmZlcnNfZmllbGRfdmVjdG9yKHBvc18sIDc4KSArIGkgKiA4KQotICAgIGRlZiB2ZWN0b3Jfb2Zfd2Vha19yZWZlcmVuY2VzX2xlbmd0aCgpOgorICAgIGRlZiB2ZWN0b3Jfb2Zfd2Vha19yZWZlcmVuY2VzX2xlbmd0aCgpIC0+IGludDoKICAgICAgICAgcmV0dXJuIGJ1Zl8uZmxhdGJ1ZmZlcnNfZmllbGRfdmVjdG9yX2xlbihwb3NfLCA3OCkKLSAgICBkZWYgdmVjdG9yX29mX3N0cm9uZ19yZWZlcnJhYmxlcyhpOmludCk6CisgICAgZGVmIHZlY3Rvcl9vZl9zdHJvbmdfcmVmZXJyYWJsZXMoaTppbnQpIC0+IE15R2FtZV9FeGFtcGxlX1JlZmVycmFibGU6CiAgICAgICAgIHJldHVybiBNeUdhbWVfRXhhbXBsZV9SZWZlcnJhYmxlIHsgYnVmXywgYnVmXy5mbGF0YnVmZmVyc19pbmRpcmVjdChidWZfLmZsYXRidWZmZXJzX2ZpZWxkX3ZlY3Rvcihwb3NfLCA4MCkgKyBpICogNCkgfQotICAgIGRlZiB2ZWN0b3Jfb2Zfc3Ryb25nX3JlZmVycmFibGVzX2xlbmd0aCgpOgorICAgIGRlZiB2ZWN0b3Jfb2Zfc3Ryb25nX3JlZmVycmFibGVzX2xlbmd0aCgpIC0+IGludDoKICAgICAgICAgcmV0dXJuIGJ1Zl8uZmxhdGJ1ZmZlcnNfZmllbGRfdmVjdG9yX2xlbihwb3NfLCA4MCkKLSAgICBkZWYgY29fb3duaW5nX3JlZmVyZW5jZSgpOgorICAgIGRlZiBjb19vd25pbmdfcmVmZXJlbmNlKCkgLT4gaW50OgogICAgICAgICByZXR1cm4gYnVmXy5mbGF0YnVmZmVyc19maWVsZF91aW50NjQocG9zXywgODIsIDApCi0gICAgZGVmIHZlY3Rvcl9vZl9jb19vd25pbmdfcmVmZXJlbmNlcyhpOmludCk6CisgICAgZGVmIHZlY3Rvcl9vZl9jb19vd25pbmdfcmVmZXJlbmNlcyhpOmludCkgLT4gaW50OgogICAgICAgICByZXR1cm4gYnVmXy5yZWFkX3VpbnQ2NF9sZShidWZfLmZsYXRidWZmZXJzX2ZpZWxkX3ZlY3Rvcihwb3NfLCA4NCkgKyBpICogOCkKLSAgICBkZWYgdmVjdG9yX29mX2NvX293bmluZ19yZWZlcmVuY2VzX2xlbmd0aCgpOgorICAgIGRlZiB2ZWN0b3Jfb2ZfY29fb3duaW5nX3JlZmVyZW5jZXNfbGVuZ3RoKCkgLT4gaW50OgogICAgICAgICByZXR1cm4gYnVmXy5mbGF0YnVmZmVyc19maWVsZF92ZWN0b3JfbGVuKHBvc18sIDg0KQotICAgIGRlZiBub25fb3duaW5nX3JlZmVyZW5jZSgpOgorICAgIGRlZiBub25fb3duaW5nX3JlZmVyZW5jZSgpIC0+IGludDoKICAgICAgICAgcmV0dXJuIGJ1Zl8uZmxhdGJ1ZmZlcnNfZmllbGRfdWludDY0KHBvc18sIDg2LCAwKQotICAgIGRlZiB2ZWN0b3Jfb2Zfbm9uX293bmluZ19yZWZlcmVuY2VzKGk6aW50KToKKyAgICBkZWYgdmVjdG9yX29mX25vbl9vd25pbmdfcmVmZXJlbmNlcyhpOmludCkgLT4gaW50OgogICAgICAgICByZXR1cm4gYnVmXy5yZWFkX3VpbnQ2NF9sZShidWZfLmZsYXRidWZmZXJzX2ZpZWxkX3ZlY3Rvcihwb3NfLCA4OCkgKyBpICogOCkKLSAgICBkZWYgdmVjdG9yX29mX25vbl9vd25pbmdfcmVmZXJlbmNlc19sZW5ndGgoKToKKyAgICBkZWYgdmVjdG9yX29mX25vbl9vd25pbmdfcmVmZXJlbmNlc19sZW5ndGgoKSAtPiBpbnQ6CiAgICAgICAgIHJldHVybiBidWZfLmZsYXRidWZmZXJzX2ZpZWxkX3ZlY3Rvcl9sZW4ocG9zXywgODgpCi0gICAgZGVmIGFueV91bmlxdWVfdHlwZSgpOgorICAgIGRlZiBhbnlfdW5pcXVlX3R5cGUoKSAtPiBBbnlVbmlxdWVBbGlhc2VzOgogICAgICAgICByZXR1cm4gQW55VW5pcXVlQWxpYXNlcyhidWZfLmZsYXRidWZmZXJzX2ZpZWxkX3VpbnQ4KHBvc18sIDkwLCAwKSkKICAgICBkZWYgYW55X3VuaXF1ZV9hc19NKCk6CiAgICAgICAgIHJldHVybiBNeUdhbWVfRXhhbXBsZV9Nb25zdGVyIHsgYnVmXywgYnVmXy5mbGF0YnVmZmVyc19maWVsZF90YWJsZShwb3NfLCA5MikgfQpAQCAtMzc1LDcgKzM5Niw3IEBACiAgICAgICAgIHJldHVybiBNeUdhbWVfRXhhbXBsZV9UZXN0U2ltcGxlVGFibGVXaXRoRW51bSB7IGJ1Zl8sIGJ1Zl8uZmxhdGJ1ZmZlcnNfZmllbGRfdGFibGUocG9zXywgOTIpIH0KICAgICBkZWYgYW55X3VuaXF1ZV9hc19NMigpOgogICAgICAgICByZXR1cm4gTXlHYW1lX0V4YW1wbGUyX01vbnN0ZXIgeyBidWZfLCBidWZfLmZsYXRidWZmZXJzX2ZpZWxkX3RhYmxlKHBvc18sIDkyKSB9Ci0gICAgZGVmIGFueV9hbWJpZ3VvdXNfdHlwZSgpOgorICAgIGRlZiBhbnlfYW1iaWd1b3VzX3R5cGUoKSAtPiBBbnlBbWJpZ3VvdXNBbGlhc2VzOgogICAgICAgICByZXR1cm4gQW55QW1iaWd1b3VzQWxpYXNlcyhidWZfLmZsYXRidWZmZXJzX2ZpZWxkX3VpbnQ4KHBvc18sIDk0LCAwKSkKICAgICBkZWYgYW55X2FtYmlndW91c19hc19NMSgpOgogICAgICAgICByZXR1cm4gTXlHYW1lX0V4YW1wbGVfTW9uc3RlciB7IGJ1Zl8sIGJ1Zl8uZmxhdGJ1ZmZlcnNfZmllbGRfdGFibGUocG9zXywgOTYpIH0KQEAgLTM4MywyNiArNDA0LDI2IEBACiAgICAgICAgIHJldHVybiBNeUdhbWVfRXhhbXBsZV9Nb25zdGVyIHsgYnVmXywgYnVmXy5mbGF0YnVmZmVyc19maWVsZF90YWJsZShwb3NfLCA5NikgfQogICAgIGRlZiBhbnlfYW1iaWd1b3VzX2FzX00zKCk6CiAgICAgICAgIHJldHVybiBNeUdhbWVfRXhhbXBsZV9Nb25zdGVyIHsgYnVmXywgYnVmXy5mbGF0YnVmZmVyc19maWVsZF90YWJsZShwb3NfLCA5NikgfQotICAgIGRlZiB2ZWN0b3Jfb2ZfZW51bXMoaTppbnQpOgorICAgIGRlZiB2ZWN0b3Jfb2ZfZW51bXMoaTppbnQpIC0+IENvbG9yOgogICAgICAgICByZXR1cm4gYnVmXy5yZWFkX3VpbnQ4X2xlKGJ1Zl8uZmxhdGJ1ZmZlcnNfZmllbGRfdmVjdG9yKHBvc18sIDk4KSArIGkgKiAxKQotICAgIGRlZiB2ZWN0b3Jfb2ZfZW51bXNfbGVuZ3RoKCk6CisgICAgZGVmIHZlY3Rvcl9vZl9lbnVtc19sZW5ndGgoKSAtPiBpbnQ6CiAgICAgICAgIHJldHVybiBidWZfLmZsYXRidWZmZXJzX2ZpZWxkX3ZlY3Rvcl9sZW4ocG9zXywgOTgpCi0gICAgZGVmIHNpZ25lZF9lbnVtKCk6CisgICAgZGVmIHNpZ25lZF9lbnVtKCkgLT4gUmFjZToKICAgICAgICAgcmV0dXJuIFJhY2UoYnVmXy5mbGF0YnVmZmVyc19maWVsZF9pbnQ4KHBvc18sIDEwMCwgLTEpKQotICAgIGRlZiB0ZXN0cmVxdWlyZWRuZXN0ZWRmbGF0YnVmZmVyKGk6aW50KToKKyAgICBkZWYgdGVzdHJlcXVpcmVkbmVzdGVkZmxhdGJ1ZmZlcihpOmludCkgLT4gaW50OgogICAgICAgICByZXR1cm4gYnVmXy5yZWFkX3VpbnQ4X2xlKGJ1Zl8uZmxhdGJ1ZmZlcnNfZmllbGRfdmVjdG9yKHBvc18sIDEwMikgKyBpICogMSkKLSAgICBkZWYgdGVzdHJlcXVpcmVkbmVzdGVkZmxhdGJ1ZmZlcl9sZW5ndGgoKToKKyAgICBkZWYgdGVzdHJlcXVpcmVkbmVzdGVkZmxhdGJ1ZmZlcl9sZW5ndGgoKSAtPiBpbnQ6CiAgICAgICAgIHJldHVybiBidWZfLmZsYXRidWZmZXJzX2ZpZWxkX3ZlY3Rvcl9sZW4ocG9zXywgMTAyKQotICAgIGRlZiBzY2FsYXJfa2V5X3NvcnRlZF90YWJsZXMoaTppbnQpOgorICAgIGRlZiBzY2FsYXJfa2V5X3NvcnRlZF90YWJsZXMoaTppbnQpIC0+IE15R2FtZV9FeGFtcGxlX1N0YXQ6CiAgICAgICAgIHJldHVybiBNeUdhbWVfRXhhbXBsZV9TdGF0IHsgYnVmXywgYnVmXy5mbGF0YnVmZmVyc19pbmRpcmVjdChidWZfLmZsYXRidWZmZXJzX2ZpZWxkX3ZlY3Rvcihwb3NfLCAxMDQpICsgaSAqIDQpIH0KLSAgICBkZWYgc2NhbGFyX2tleV9zb3J0ZWRfdGFibGVzX2xlbmd0aCgpOgorICAgIGRlZiBzY2FsYXJfa2V5X3NvcnRlZF90YWJsZXNfbGVuZ3RoKCkgLT4gaW50OgogICAgICAgICByZXR1cm4gYnVmXy5mbGF0YnVmZmVyc19maWVsZF92ZWN0b3JfbGVuKHBvc18sIDEwNCkKLSAgICBkZWYgbmF0aXZlX2lubGluZSgpOgorICAgIGRlZiBuYXRpdmVfaW5saW5lKCkgLT4gTXlHYW1lX0V4YW1wbGVfVGVzdD86CiAgICAgICAgIGxldCBvID0gYnVmXy5mbGF0YnVmZmVyc19maWVsZF9zdHJ1Y3QocG9zXywgMTA2KQogICAgICAgICByZXR1cm4gaWYgbzogTXlHYW1lX0V4YW1wbGVfVGVzdCB7IGJ1Zl8sIG8gfSBlbHNlOiBuaWwKLSAgICBkZWYgbG9uZ19lbnVtX25vbl9lbnVtX2RlZmF1bHQoKToKKyAgICBkZWYgbG9uZ19lbnVtX25vbl9lbnVtX2RlZmF1bHQoKSAtPiBMb25nRW51bToKICAgICAgICAgcmV0dXJuIExvbmdFbnVtKGJ1Zl8uZmxhdGJ1ZmZlcnNfZmllbGRfdWludDY0KHBvc18sIDEwOCwgMCkpCi0gICAgZGVmIGxvbmdfZW51bV9ub3JtYWxfZGVmYXVsdCgpOgorICAgIGRlZiBsb25nX2VudW1fbm9ybWFsX2RlZmF1bHQoKSAtPiBMb25nRW51bToKICAgICAgICAgcmV0dXJuIExvbmdFbnVtKGJ1Zl8uZmxhdGJ1ZmZlcnNfZmllbGRfdWludDY0KHBvc18sIDExMCwgMikpCiAKIGRlZiBHZXRSb290QXNNb25zdGVyKGJ1ZjpzdHJpbmcpOiByZXR1cm4gTW9uc3RlciB7IGJ1ZiwgYnVmLmZsYXRidWZmZXJzX2luZGlyZWN0KDApIH0KQEAgLTQ1NCw3ICs0NzUsNyBAQAogICAgIGRlZiBhZGRfdGVzdGVtcHR5KHRlc3RlbXB0eTpmbGF0YnVmZmVyc19vZmZzZXQpOgogICAgICAgICBiXy5QcmVwZW5kVU9mZnNldFRSZWxhdGl2ZVNsb3QoMTQsIHRlc3RlbXB0eSkKICAgICAgICAgcmV0dXJuIHRoaXMKLSAgICBkZWYgYWRkX3Rlc3Rib29sKHRlc3Rib29sOmludCk6CisgICAgZGVmIGFkZF90ZXN0Ym9vbCh0ZXN0Ym9vbDpib29sKToKICAgICAgICAgYl8uUHJlcGVuZEJvb2xTbG90KDE1LCB0ZXN0Ym9vbCwgMCkKICAgICAgICAgcmV0dXJuIHRoaXMKICAgICBkZWYgYWRkX3Rlc3RoYXNoczMyX2ZudjEodGVzdGhhc2hzMzJfZm52MTppbnQpOgpAQCAtNjA3LDcgKzYyOCw3IEBACiAKIGRlZiBNb25zdGVyU3RhcnRUZXN0YXJyYXlvZmJvb2xzVmVjdG9yKGJfOmZsYXRidWZmZXJzX2J1aWxkZXIsIG5fOmludCk6CiAgICAgYl8uU3RhcnRWZWN0b3IoMSwgbl8sIDEpCi1kZWYgTW9uc3RlckNyZWF0ZVRlc3RhcnJheW9mYm9vbHNWZWN0b3IoYl86ZmxhdGJ1ZmZlcnNfYnVpbGRlciwgdl86W2ludF0pOgorZGVmIE1vbnN0ZXJDcmVhdGVUZXN0YXJyYXlvZmJvb2xzVmVjdG9yKGJfOmZsYXRidWZmZXJzX2J1aWxkZXIsIHZfOltib29sXSk6CiAgICAgYl8uU3RhcnRWZWN0b3IoMSwgdl8ubGVuZ3RoLCAxKQogICAgIHJldmVyc2Uodl8pIGVfOiBiXy5QcmVwZW5kQm9vbChlXykKICAgICByZXR1cm4gYl8uRW5kVmVjdG9yKHZfLmxlbmd0aCkKQEAgLTcwMywzMyArNzI0LDMzIEBACiAgICAgcmV0dXJuIGJfLkVuZFZlY3Rvcih2Xy5sZW5ndGgpCiAKIGNsYXNzIFR5cGVBbGlhc2VzIDogZmxhdGJ1ZmZlcnNfaGFuZGxlCi0gICAgZGVmIGk4KCk6CisgICAgZGVmIGk4KCkgLT4gaW50OgogICAgICAgICByZXR1cm4gYnVmXy5mbGF0YnVmZmVyc19maWVsZF9pbnQ4KHBvc18sIDQsIDApCi0gICAgZGVmIHU4KCk6CisgICAgZGVmIHU4KCkgLT4gaW50OgogICAgICAgICByZXR1cm4gYnVmXy5mbGF0YnVmZmVyc19maWVsZF91aW50OChwb3NfLCA2LCAwKQotICAgIGRlZiBpMTYoKToKKyAgICBkZWYgaTE2KCkgLT4gaW50OgogICAgICAgICByZXR1cm4gYnVmXy5mbGF0YnVmZmVyc19maWVsZF9pbnQxNihwb3NfLCA4LCAwKQotICAgIGRlZiB1MTYoKToKKyAgICBkZWYgdTE2KCkgLT4gaW50OgogICAgICAgICByZXR1cm4gYnVmXy5mbGF0YnVmZmVyc19maWVsZF91aW50MTYocG9zXywgMTAsIDApCi0gICAgZGVmIGkzMigpOgorICAgIGRlZiBpMzIoKSAtPiBpbnQ6CiAgICAgICAgIHJldHVybiBidWZfLmZsYXRidWZmZXJzX2ZpZWxkX2ludDMyKHBvc18sIDEyLCAwKQotICAgIGRlZiB1MzIoKToKKyAgICBkZWYgdTMyKCkgLT4gaW50OgogICAgICAgICByZXR1cm4gYnVmXy5mbGF0YnVmZmVyc19maWVsZF91aW50MzIocG9zXywgMTQsIDApCi0gICAgZGVmIGk2NCgpOgorICAgIGRlZiBpNjQoKSAtPiBpbnQ6CiAgICAgICAgIHJldHVybiBidWZfLmZsYXRidWZmZXJzX2ZpZWxkX2ludDY0KHBvc18sIDE2LCAwKQotICAgIGRlZiB1NjQoKToKKyAgICBkZWYgdTY0KCkgLT4gaW50OgogICAgICAgICByZXR1cm4gYnVmXy5mbGF0YnVmZmVyc19maWVsZF91aW50NjQocG9zXywgMTgsIDApCi0gICAgZGVmIGYzMigpOgorICAgIGRlZiBmMzIoKSAtPiBmbG9hdDoKICAgICAgICAgcmV0dXJuIGJ1Zl8uZmxhdGJ1ZmZlcnNfZmllbGRfZmxvYXQzMihwb3NfLCAyMCwgMC4wKQotICAgIGRlZiBmNjQoKToKKyAgICBkZWYgZjY0KCkgLT4gZmxvYXQ6CiAgICAgICAgIHJldHVybiBidWZfLmZsYXRidWZmZXJzX2ZpZWxkX2Zsb2F0NjQocG9zXywgMjIsIDAuMCkKLSAgICBkZWYgdjgoaTppbnQpOgorICAgIGRlZiB2OChpOmludCkgLT4gaW50OgogICAgICAgICByZXR1cm4gYnVmXy5yZWFkX2ludDhfbGUoYnVmXy5mbGF0YnVmZmVyc19maWVsZF92ZWN0b3IocG9zXywgMjQpICsgaSAqIDEpCi0gICAgZGVmIHY4X2xlbmd0aCgpOgorICAgIGRlZiB2OF9sZW5ndGgoKSAtPiBpbnQ6CiAgICAgICAgIHJldHVybiBidWZfLmZsYXRidWZmZXJzX2ZpZWxkX3ZlY3Rvcl9sZW4ocG9zXywgMjQpCi0gICAgZGVmIHZmNjQoaTppbnQpOgorICAgIGRlZiB2ZjY0KGk6aW50KSAtPiBmbG9hdDoKICAgICAgICAgcmV0dXJuIGJ1Zl8ucmVhZF9mbG9hdDY0X2xlKGJ1Zl8uZmxhdGJ1ZmZlcnNfZmllbGRfdmVjdG9yKHBvc18sIDI2KSArIGkgKiA4KQotICAgIGRlZiB2ZjY0X2xlbmd0aCgpOgorICAgIGRlZiB2ZjY0X2xlbmd0aCgpIC0+IGludDoKICAgICAgICAgcmV0dXJuIGJ1Zl8uZmxhdGJ1ZmZlcnNfZmllbGRfdmVjdG9yX2xlbihwb3NfLCAyNikKIAogZGVmIEdldFJvb3RBc1R5cGVBbGlhc2VzKGJ1ZjpzdHJpbmcpOiByZXR1cm4gVHlwZUFsaWFzZXMgeyBidWYsIGJ1Zi5mbGF0YnVmZmVyc19pbmRpcmVjdCgwKSB9CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9tb25zdGVyX3Rlc3RfZ2VuZXJhdGVkLnB5IGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvbW9uc3Rlcl90ZXN0X2dlbmVyYXRlZC5weQppbmRleCA3MWUyNjZkLi4wZmEyMTQwIDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9tb25zdGVyX3Rlc3RfZ2VuZXJhdGVkLnB5CisrKyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL21vbnN0ZXJfdGVzdF9nZW5lcmF0ZWQucHkKQEAgLTU0Myw2ICs1NDMsNzMgQEAKICAgICAgICAgcmV0dXJuIENyZWF0ZVN0cnVjdE9mU3RydWN0cyhidWlsZGVyLCBzZWxmLmEuaWQsIHNlbGYuYS5kaXN0YW5jZSwgc2VsZi5iLmEsIHNlbGYuYi5iLCBzZWxmLmMuaWQsIHNlbGYuYy5kaXN0YW5jZSkKIAogCitjbGFzcyBTdHJ1Y3RPZlN0cnVjdHNPZlN0cnVjdHMob2JqZWN0KToKKyAgICBfX3Nsb3RzX18gPSBbJ190YWInXQorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIFNpemVPZihjbHMpOgorICAgICAgICByZXR1cm4gMjAKKworICAgICMgU3RydWN0T2ZTdHJ1Y3RzT2ZTdHJ1Y3RzCisgICAgZGVmIEluaXQoc2VsZiwgYnVmLCBwb3MpOgorICAgICAgICBzZWxmLl90YWIgPSBmbGF0YnVmZmVycy50YWJsZS5UYWJsZShidWYsIHBvcykKKworICAgICMgU3RydWN0T2ZTdHJ1Y3RzT2ZTdHJ1Y3RzCisgICAgZGVmIEEoc2VsZiwgb2JqKToKKyAgICAgICAgb2JqLkluaXQoc2VsZi5fdGFiLkJ5dGVzLCBzZWxmLl90YWIuUG9zICsgMCkKKyAgICAgICAgcmV0dXJuIG9iagorCisKK2RlZiBDcmVhdGVTdHJ1Y3RPZlN0cnVjdHNPZlN0cnVjdHMoYnVpbGRlciwgYV9hX2lkLCBhX2FfZGlzdGFuY2UsIGFfYl9hLCBhX2JfYiwgYV9jX2lkLCBhX2NfZGlzdGFuY2UpOgorICAgIGJ1aWxkZXIuUHJlcCg0LCAyMCkKKyAgICBidWlsZGVyLlByZXAoNCwgMjApCisgICAgYnVpbGRlci5QcmVwKDQsIDgpCisgICAgYnVpbGRlci5QcmVwZW5kVWludDMyKGFfY19kaXN0YW5jZSkKKyAgICBidWlsZGVyLlByZXBlbmRVaW50MzIoYV9jX2lkKQorICAgIGJ1aWxkZXIuUHJlcCgyLCA0KQorICAgIGJ1aWxkZXIuUGFkKDEpCisgICAgYnVpbGRlci5QcmVwZW5kSW50OChhX2JfYikKKyAgICBidWlsZGVyLlByZXBlbmRJbnQxNihhX2JfYSkKKyAgICBidWlsZGVyLlByZXAoNCwgOCkKKyAgICBidWlsZGVyLlByZXBlbmRVaW50MzIoYV9hX2Rpc3RhbmNlKQorICAgIGJ1aWxkZXIuUHJlcGVuZFVpbnQzMihhX2FfaWQpCisgICAgcmV0dXJuIGJ1aWxkZXIuT2Zmc2V0KCkKKwordHJ5OgorICAgIGZyb20gdHlwaW5nIGltcG9ydCBPcHRpb25hbAorZXhjZXB0OgorICAgIHBhc3MKKworY2xhc3MgU3RydWN0T2ZTdHJ1Y3RzT2ZTdHJ1Y3RzVChvYmplY3QpOgorCisgICAgIyBTdHJ1Y3RPZlN0cnVjdHNPZlN0cnVjdHNUCisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICBzZWxmLmEgPSBOb25lICAjIHR5cGU6IE9wdGlvbmFsW1N0cnVjdE9mU3RydWN0c1RdCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgSW5pdEZyb21CdWYoY2xzLCBidWYsIHBvcyk6CisgICAgICAgIHN0cnVjdE9mU3RydWN0c09mU3RydWN0cyA9IFN0cnVjdE9mU3RydWN0c09mU3RydWN0cygpCisgICAgICAgIHN0cnVjdE9mU3RydWN0c09mU3RydWN0cy5Jbml0KGJ1ZiwgcG9zKQorICAgICAgICByZXR1cm4gY2xzLkluaXRGcm9tT2JqKHN0cnVjdE9mU3RydWN0c09mU3RydWN0cykKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBJbml0RnJvbU9iaihjbHMsIHN0cnVjdE9mU3RydWN0c09mU3RydWN0cyk6CisgICAgICAgIHggPSBTdHJ1Y3RPZlN0cnVjdHNPZlN0cnVjdHNUKCkKKyAgICAgICAgeC5fVW5QYWNrKHN0cnVjdE9mU3RydWN0c09mU3RydWN0cykKKyAgICAgICAgcmV0dXJuIHgKKworICAgICMgU3RydWN0T2ZTdHJ1Y3RzT2ZTdHJ1Y3RzVAorICAgIGRlZiBfVW5QYWNrKHNlbGYsIHN0cnVjdE9mU3RydWN0c09mU3RydWN0cyk6CisgICAgICAgIGlmIHN0cnVjdE9mU3RydWN0c09mU3RydWN0cyBpcyBOb25lOgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIGlmIHN0cnVjdE9mU3RydWN0c09mU3RydWN0cy5BKFN0cnVjdE9mU3RydWN0cygpKSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHNlbGYuYSA9IFN0cnVjdE9mU3RydWN0c1QuSW5pdEZyb21PYmooc3RydWN0T2ZTdHJ1Y3RzT2ZTdHJ1Y3RzLkEoU3RydWN0T2ZTdHJ1Y3RzKCkpKQorCisgICAgIyBTdHJ1Y3RPZlN0cnVjdHNPZlN0cnVjdHNUCisgICAgZGVmIFBhY2soc2VsZiwgYnVpbGRlcik6CisgICAgICAgIHJldHVybiBDcmVhdGVTdHJ1Y3RPZlN0cnVjdHNPZlN0cnVjdHMoYnVpbGRlciwgc2VsZi5hLmEuaWQsIHNlbGYuYS5hLmRpc3RhbmNlLCBzZWxmLmEuYi5hLCBzZWxmLmEuYi5iLCBzZWxmLmEuYy5pZCwgc2VsZi5hLmMuZGlzdGFuY2UpCisKKwogY2xhc3MgU3RhdChvYmplY3QpOgogICAgIF9fc2xvdHNfXyA9IFsnX3RhYiddCiAKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL21vbnN0ZXJfdGVzdC5qcyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL21vbnN0ZXJfdGVzdF9nZW5lcmF0ZWQudHMKc2ltaWxhcml0eSBpbmRleCA3OCUKY29weSBmcm9tIHRoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL21vbnN0ZXJfdGVzdC5qcwpjb3B5IHRvIHRoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL21vbnN0ZXJfdGVzdF9nZW5lcmF0ZWQudHMKaW5kZXggYjRlMTNkMS4uNWZkMDgwZSAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvbW9uc3Rlcl90ZXN0LmpzCisrKyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL21vbnN0ZXJfdGVzdF9nZW5lcmF0ZWQudHMKQEAgLTEsNCArMSw2IEBACi1leHBvcnQgeyBNb25zdGVyIGFzIE15R2FtZUV4YW1wbGUyTW9uc3RlciwgTW9uc3RlclQgYXMgTXlHYW1lRXhhbXBsZTJNb25zdGVyVCB9IGZyb20gJy4vbXktZ2FtZS9leGFtcGxlMi9tb25zdGVyJzsKKy8vIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGJ5IHRoZSBGbGF0QnVmZmVycyBjb21waWxlciwgZG8gbm90IG1vZGlmeQorCitleHBvcnQgeyBNb25zdGVyIGFzIE15R2FtZV9FeGFtcGxlMl9Nb25zdGVyLCBNb25zdGVyVCBhcyBNeUdhbWVfRXhhbXBsZTJfTW9uc3RlclQgfSBmcm9tICcuL215LWdhbWUvZXhhbXBsZTIvbW9uc3Rlcic7CiBleHBvcnQgeyBBYmlsaXR5LCBBYmlsaXR5VCB9IGZyb20gJy4vbXktZ2FtZS9leGFtcGxlL2FiaWxpdHknOwogZXhwb3J0IHsgQW55LCB1bmlvblRvQW55LCB1bmlvbkxpc3RUb0FueSB9IGZyb20gJy4vbXktZ2FtZS9leGFtcGxlL2FueSc7CiBleHBvcnQgeyBBbnlBbWJpZ3VvdXNBbGlhc2VzLCB1bmlvblRvQW55QW1iaWd1b3VzQWxpYXNlcywgdW5pb25MaXN0VG9BbnlBbWJpZ3VvdXNBbGlhc2VzIH0gZnJvbSAnLi9teS1nYW1lL2V4YW1wbGUvYW55LWFtYmlndW91cy1hbGlhc2VzJzsKQEAgLTksNiArMTEsNyBAQAogZXhwb3J0IHsgUmVmZXJyYWJsZSwgUmVmZXJyYWJsZVQgfSBmcm9tICcuL215LWdhbWUvZXhhbXBsZS9yZWZlcnJhYmxlJzsKIGV4cG9ydCB7IFN0YXQsIFN0YXRUIH0gZnJvbSAnLi9teS1nYW1lL2V4YW1wbGUvc3RhdCc7CiBleHBvcnQgeyBTdHJ1Y3RPZlN0cnVjdHMsIFN0cnVjdE9mU3RydWN0c1QgfSBmcm9tICcuL215LWdhbWUvZXhhbXBsZS9zdHJ1Y3Qtb2Ytc3RydWN0cyc7CitleHBvcnQgeyBTdHJ1Y3RPZlN0cnVjdHNPZlN0cnVjdHMsIFN0cnVjdE9mU3RydWN0c09mU3RydWN0c1QgfSBmcm9tICcuL215LWdhbWUvZXhhbXBsZS9zdHJ1Y3Qtb2Ytc3RydWN0cy1vZi1zdHJ1Y3RzJzsKIGV4cG9ydCB7IFRlc3QsIFRlc3RUIH0gZnJvbSAnLi9teS1nYW1lL2V4YW1wbGUvdGVzdCc7CiBleHBvcnQgeyBUZXN0U2ltcGxlVGFibGVXaXRoRW51bSwgVGVzdFNpbXBsZVRhYmxlV2l0aEVudW1UIH0gZnJvbSAnLi9teS1nYW1lL2V4YW1wbGUvdGVzdC1zaW1wbGUtdGFibGUtd2l0aC1lbnVtJzsKIGV4cG9ydCB7IFR5cGVBbGlhc2VzLCBUeXBlQWxpYXNlc1QgfSBmcm9tICcuL215LWdhbWUvZXhhbXBsZS90eXBlLWFsaWFzZXMnOwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvbW9uc3Rlcl90ZXN0X215X2dhbWUuZXhhbXBsZV9nZW5lcmF0ZWQuZGFydCBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL21vbnN0ZXJfdGVzdF9teV9nYW1lLmV4YW1wbGVfZ2VuZXJhdGVkLmRhcnQKaW5kZXggZGQ4MTZkOS4uMTc0ZmUxZCAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvbW9uc3Rlcl90ZXN0X215X2dhbWUuZXhhbXBsZV9nZW5lcmF0ZWQuZGFydAorKysgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9tb25zdGVyX3Rlc3RfbXlfZ2FtZS5leGFtcGxlX2dlbmVyYXRlZC5kYXJ0CkBAIC0xNTIsNyArMTUyLDcgQEAKICAgY29uc3QgX0xvbmdFbnVtUmVhZGVyKCk7CiAKICAgQG92ZXJyaWRlCi0gIGludCBnZXQgc2l6ZSA9PiAxOworICBpbnQgZ2V0IHNpemUgPT4gODsKIAogICBAb3ZlcnJpZGUKICAgTG9uZ0VudW0gcmVhZChmYi5CdWZmZXJDb250ZXh0IGJjLCBpbnQgb2Zmc2V0KSA9PgpAQCAtMzE2LDcgKzMxNiw3IEBACiAKICAgQG92ZXJyaWRlCiAgIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICByZXR1cm4gJ1Rlc3R7YTogJGEsIGI6ICRifSc7CisgICAgcmV0dXJuICdUZXN0e2E6ICR7YX0sIGI6ICR7Yn19JzsKICAgfQogCiAgIFRlc3RUIHVucGFjaygpID0+IFRlc3RUKApAQCAtMzQ3LDcgKzM0Nyw3IEBACiAKICAgQG92ZXJyaWRlCiAgIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICByZXR1cm4gJ1Rlc3RUe2E6ICRhLCBiOiAkYn0nOworICAgIHJldHVybiAnVGVzdFR7YTogJHthfSwgYjogJHtifX0nOwogICB9CiB9CiAKQEAgLTQyMCw3ICs0MjAsNyBAQAogCiAgIEBvdmVycmlkZQogICBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgcmV0dXJuICdUZXN0U2ltcGxlVGFibGVXaXRoRW51bXtjb2xvcjogJGNvbG9yfSc7CisgICAgcmV0dXJuICdUZXN0U2ltcGxlVGFibGVXaXRoRW51bXtjb2xvcjogJHtjb2xvcn19JzsKICAgfQogCiAgIFRlc3RTaW1wbGVUYWJsZVdpdGhFbnVtVCB1bnBhY2soKSA9PiBUZXN0U2ltcGxlVGFibGVXaXRoRW51bVQoCkBAIC00NDcsNyArNDQ3LDcgQEAKIAogICBAb3ZlcnJpZGUKICAgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgIHJldHVybiAnVGVzdFNpbXBsZVRhYmxlV2l0aEVudW1Ue2NvbG9yOiAkY29sb3J9JzsKKyAgICByZXR1cm4gJ1Rlc3RTaW1wbGVUYWJsZVdpdGhFbnVtVHtjb2xvcjogJHtjb2xvcn19JzsKICAgfQogfQogCkBAIC01MTksNyArNTE5LDcgQEAKIAogICBAb3ZlcnJpZGUKICAgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgIHJldHVybiAnVmVjM3t4OiAkeCwgeTogJHksIHo6ICR6LCB0ZXN0MTogJHRlc3QxLCB0ZXN0MjogJHRlc3QyLCB0ZXN0MzogJHRlc3QzfSc7CisgICAgcmV0dXJuICdWZWMze3g6ICR7eH0sIHk6ICR7eX0sIHo6ICR7en0sIHRlc3QxOiAke3Rlc3QxfSwgdGVzdDI6ICR7dGVzdDJ9LCB0ZXN0MzogJHt0ZXN0M319JzsKICAgfQogCiAgIFZlYzNUIHVucGFjaygpID0+IFZlYzNUKApAQCAtNTY4LDcgKzU2OCw3IEBACiAKICAgQG92ZXJyaWRlCiAgIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICByZXR1cm4gJ1ZlYzNUe3g6ICR4LCB5OiAkeSwgejogJHosIHRlc3QxOiAkdGVzdDEsIHRlc3QyOiAkdGVzdDIsIHRlc3QzOiAkdGVzdDN9JzsKKyAgICByZXR1cm4gJ1ZlYzNUe3g6ICR7eH0sIHk6ICR7eX0sIHo6ICR7en0sIHRlc3QxOiAke3Rlc3QxfSwgdGVzdDI6ICR7dGVzdDJ9LCB0ZXN0MzogJHt0ZXN0M319JzsKICAgfQogfQogCkBAIC02NjIsNyArNjYyLDcgQEAKIAogICBAb3ZlcnJpZGUKICAgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgIHJldHVybiAnQWJpbGl0eXtpZDogJGlkLCBkaXN0YW5jZTogJGRpc3RhbmNlfSc7CisgICAgcmV0dXJuICdBYmlsaXR5e2lkOiAke2lkfSwgZGlzdGFuY2U6ICR7ZGlzdGFuY2V9fSc7CiAgIH0KIAogICBBYmlsaXR5VCB1bnBhY2soKSA9PiBBYmlsaXR5VCgKQEAgLTY5Miw3ICs2OTIsNyBAQAogCiAgIEBvdmVycmlkZQogICBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgcmV0dXJuICdBYmlsaXR5VHtpZDogJGlkLCBkaXN0YW5jZTogJGRpc3RhbmNlfSc7CisgICAgcmV0dXJuICdBYmlsaXR5VHtpZDogJHtpZH0sIGRpc3RhbmNlOiAke2Rpc3RhbmNlfX0nOwogICB9CiB9CiAKQEAgLTc2MSw3ICs3NjEsNyBAQAogCiAgIEBvdmVycmlkZQogICBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgcmV0dXJuICdTdHJ1Y3RPZlN0cnVjdHN7YTogJGEsIGI6ICRiLCBjOiAkY30nOworICAgIHJldHVybiAnU3RydWN0T2ZTdHJ1Y3Rze2E6ICR7YX0sIGI6ICR7Yn0sIGM6ICR7Y319JzsKICAgfQogCiAgIFN0cnVjdE9mU3RydWN0c1QgdW5wYWNrKCkgPT4gU3RydWN0T2ZTdHJ1Y3RzVCgKQEAgLTc5NSw3ICs3OTUsNyBAQAogCiAgIEBvdmVycmlkZQogICBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgcmV0dXJuICdTdHJ1Y3RPZlN0cnVjdHNUe2E6ICRhLCBiOiAkYiwgYzogJGN9JzsKKyAgICByZXR1cm4gJ1N0cnVjdE9mU3RydWN0c1R7YTogJHthfSwgYjogJHtifSwgYzogJHtjfX0nOwogICB9CiB9CiAKQEAgLTg1NSw2ICs4NTUsOTQgQEAKICAgICByZXR1cm4gZmJCdWlsZGVyLmJ1ZmZlcjsKICAgfQogfQorY2xhc3MgU3RydWN0T2ZTdHJ1Y3RzT2ZTdHJ1Y3RzIHsKKyAgU3RydWN0T2ZTdHJ1Y3RzT2ZTdHJ1Y3RzLl8odGhpcy5fYmMsIHRoaXMuX2JjT2Zmc2V0KTsKKworICBzdGF0aWMgY29uc3QgZmIuUmVhZGVyPFN0cnVjdE9mU3RydWN0c09mU3RydWN0cz4gcmVhZGVyID0gX1N0cnVjdE9mU3RydWN0c09mU3RydWN0c1JlYWRlcigpOworCisgIGZpbmFsIGZiLkJ1ZmZlckNvbnRleHQgX2JjOworICBmaW5hbCBpbnQgX2JjT2Zmc2V0OworCisgIFN0cnVjdE9mU3RydWN0cyBnZXQgYSA9PiBTdHJ1Y3RPZlN0cnVjdHMucmVhZGVyLnJlYWQoX2JjLCBfYmNPZmZzZXQgKyAwKTsKKworICBAb3ZlcnJpZGUKKyAgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgIHJldHVybiAnU3RydWN0T2ZTdHJ1Y3RzT2ZTdHJ1Y3Rze2E6ICR7YX19JzsKKyAgfQorCisgIFN0cnVjdE9mU3RydWN0c09mU3RydWN0c1QgdW5wYWNrKCkgPT4gU3RydWN0T2ZTdHJ1Y3RzT2ZTdHJ1Y3RzVCgKKyAgICAgIGE6IGEudW5wYWNrKCkpOworCisgIHN0YXRpYyBpbnQgcGFjayhmYi5CdWlsZGVyIGZiQnVpbGRlciwgU3RydWN0T2ZTdHJ1Y3RzT2ZTdHJ1Y3RzVD8gb2JqZWN0KSB7CisgICAgaWYgKG9iamVjdCA9PSBudWxsKSByZXR1cm4gMDsKKyAgICByZXR1cm4gb2JqZWN0LnBhY2soZmJCdWlsZGVyKTsKKyAgfQorfQorCitjbGFzcyBTdHJ1Y3RPZlN0cnVjdHNPZlN0cnVjdHNUIGltcGxlbWVudHMgZmIuUGFja2FibGUgeworICBTdHJ1Y3RPZlN0cnVjdHNUIGE7CisKKyAgU3RydWN0T2ZTdHJ1Y3RzT2ZTdHJ1Y3RzVCh7CisgICAgICByZXF1aXJlZCB0aGlzLmF9KTsKKworICBAb3ZlcnJpZGUKKyAgaW50IHBhY2soZmIuQnVpbGRlciBmYkJ1aWxkZXIpIHsKKyAgICBhLnBhY2soZmJCdWlsZGVyKTsKKyAgICByZXR1cm4gZmJCdWlsZGVyLm9mZnNldDsKKyAgfQorCisgIEBvdmVycmlkZQorICBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgcmV0dXJuICdTdHJ1Y3RPZlN0cnVjdHNPZlN0cnVjdHNUe2E6ICR7YX19JzsKKyAgfQorfQorCitjbGFzcyBfU3RydWN0T2ZTdHJ1Y3RzT2ZTdHJ1Y3RzUmVhZGVyIGV4dGVuZHMgZmIuU3RydWN0UmVhZGVyPFN0cnVjdE9mU3RydWN0c09mU3RydWN0cz4geworICBjb25zdCBfU3RydWN0T2ZTdHJ1Y3RzT2ZTdHJ1Y3RzUmVhZGVyKCk7CisKKyAgQG92ZXJyaWRlCisgIGludCBnZXQgc2l6ZSA9PiAyMDsKKworICBAb3ZlcnJpZGUKKyAgU3RydWN0T2ZTdHJ1Y3RzT2ZTdHJ1Y3RzIGNyZWF0ZU9iamVjdChmYi5CdWZmZXJDb250ZXh0IGJjLCBpbnQgb2Zmc2V0KSA9PiAKKyAgICBTdHJ1Y3RPZlN0cnVjdHNPZlN0cnVjdHMuXyhiYywgb2Zmc2V0KTsKK30KKworY2xhc3MgU3RydWN0T2ZTdHJ1Y3RzT2ZTdHJ1Y3RzQnVpbGRlciB7CisgIFN0cnVjdE9mU3RydWN0c09mU3RydWN0c0J1aWxkZXIodGhpcy5mYkJ1aWxkZXIpOworCisgIGZpbmFsIGZiLkJ1aWxkZXIgZmJCdWlsZGVyOworCisgIGludCBmaW5pc2goZmIuU3RydWN0QnVpbGRlciBhKSB7CisgICAgYSgpOworICAgIHJldHVybiBmYkJ1aWxkZXIub2Zmc2V0OworICB9CisKK30KKworY2xhc3MgU3RydWN0T2ZTdHJ1Y3RzT2ZTdHJ1Y3RzT2JqZWN0QnVpbGRlciBleHRlbmRzIGZiLk9iamVjdEJ1aWxkZXIgeworICBmaW5hbCBTdHJ1Y3RPZlN0cnVjdHNPYmplY3RCdWlsZGVyIF9hOworCisgIFN0cnVjdE9mU3RydWN0c09mU3RydWN0c09iamVjdEJ1aWxkZXIoeworICAgIHJlcXVpcmVkIFN0cnVjdE9mU3RydWN0c09iamVjdEJ1aWxkZXIgYSwKKyAgfSkKKyAgICAgIDogX2EgPSBhOworCisgIC8vLyBGaW5pc2ggYnVpbGRpbmcsIGFuZCBzdG9yZSBpbnRvIHRoZSBbZmJCdWlsZGVyXS4KKyAgQG92ZXJyaWRlCisgIGludCBmaW5pc2goZmIuQnVpbGRlciBmYkJ1aWxkZXIpIHsKKyAgICBfYS5maW5pc2goZmJCdWlsZGVyKTsKKyAgICByZXR1cm4gZmJCdWlsZGVyLm9mZnNldDsKKyAgfQorCisgIC8vLyBDb252ZW5pZW5jZSBtZXRob2QgdG8gc2VyaWFsaXplIHRvIGJ5dGUgbGlzdC4KKyAgQG92ZXJyaWRlCisgIFVpbnQ4TGlzdCB0b0J5dGVzKFtTdHJpbmc/IGZpbGVJZGVudGlmaWVyXSkgeworICAgIGZpbmFsIGZiQnVpbGRlciA9IGZiLkJ1aWxkZXIoZGVkdXBsaWNhdGVUYWJsZXM6IGZhbHNlKTsKKyAgICBmYkJ1aWxkZXIuZmluaXNoKGZpbmlzaChmYkJ1aWxkZXIpLCBmaWxlSWRlbnRpZmllcik7CisgICAgcmV0dXJuIGZiQnVpbGRlci5idWZmZXI7CisgIH0KK30KIGNsYXNzIFN0YXQgewogICBTdGF0Ll8odGhpcy5fYmMsIHRoaXMuX2JjT2Zmc2V0KTsKICAgZmFjdG9yeSBTdGF0KExpc3Q8aW50PiBieXRlcykgewpAQCAtODczLDcgKzk2MSw3IEBACiAKICAgQG92ZXJyaWRlCiAgIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICByZXR1cm4gJ1N0YXR7aWQ6ICRpZCwgdmFsOiAkdmFsLCBjb3VudDogJGNvdW50fSc7CisgICAgcmV0dXJuICdTdGF0e2lkOiAke2lkfSwgdmFsOiAke3ZhbH0sIGNvdW50OiAke2NvdW50fX0nOwogICB9CiAKICAgU3RhdFQgdW5wYWNrKCkgPT4gU3RhdFQoCkBAIC05MTAsNyArOTk4LDcgQEAKIAogICBAb3ZlcnJpZGUKICAgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgIHJldHVybiAnU3RhdFR7aWQ6ICRpZCwgdmFsOiAkdmFsLCBjb3VudDogJGNvdW50fSc7CisgICAgcmV0dXJuICdTdGF0VHtpZDogJHtpZH0sIHZhbDogJHt2YWx9LCBjb3VudDogJHtjb3VudH19JzsKICAgfQogfQogCkBAIC05OTksNyArMTA4Nyw3IEBACiAKICAgQG92ZXJyaWRlCiAgIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICByZXR1cm4gJ1JlZmVycmFibGV7aWQ6ICRpZH0nOworICAgIHJldHVybiAnUmVmZXJyYWJsZXtpZDogJHtpZH19JzsKICAgfQogCiAgIFJlZmVycmFibGVUIHVucGFjaygpID0+IFJlZmVycmFibGVUKApAQCAtMTAyNiw3ICsxMTE0LDcgQEAKIAogICBAb3ZlcnJpZGUKICAgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgIHJldHVybiAnUmVmZXJyYWJsZVR7aWQ6ICRpZH0nOworICAgIHJldHVybiAnUmVmZXJyYWJsZVR7aWQ6ICR7aWR9fSc7CiAgIH0KIH0KIApAQCAtMTE3Myw3ICsxMjYxLDcgQEAKIAogICBAb3ZlcnJpZGUKICAgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgIHJldHVybiAnTW9uc3Rlcntwb3M6ICRwb3MsIG1hbmE6ICRtYW5hLCBocDogJGhwLCBuYW1lOiAkbmFtZSwgaW52ZW50b3J5OiAkaW52ZW50b3J5LCBjb2xvcjogJGNvbG9yLCB0ZXN0VHlwZTogJHRlc3RUeXBlLCB0ZXN0OiAkdGVzdCwgdGVzdDQ6ICR0ZXN0NCwgdGVzdGFycmF5b2ZzdHJpbmc6ICR0ZXN0YXJyYXlvZnN0cmluZywgdGVzdGFycmF5b2Z0YWJsZXM6ICR0ZXN0YXJyYXlvZnRhYmxlcywgZW5lbXk6ICRlbmVteSwgdGVzdG5lc3RlZGZsYXRidWZmZXI6ICR0ZXN0bmVzdGVkZmxhdGJ1ZmZlciwgdGVzdGVtcHR5OiAkdGVzdGVtcHR5LCB0ZXN0Ym9vbDogJHRlc3Rib29sLCB0ZXN0aGFzaHMzMkZudjE6ICR0ZXN0aGFzaHMzMkZudjEsIHRlc3RoYXNodTMyRm52MTogJHRlc3RoYXNodTMyRm52MSwgdGVzdGhhc2hzNjRGbnYxOiAkdGVzdGhhc2hzNjRGbnYxLCB0ZXN0aGFzaHU2NEZudjE6ICR0ZXN0aGFzaHU2NEZudjEsIHRlc3RoYXNoczMyRm52MWE6ICR0ZXN0aGFzaHMzMkZudjFhLCB0ZXN0aGFzaHUzMkZudjFhOiAkdGVzdGhhc2h1MzJGbnYxYSwgdGVzdGhhc2hzNjRGbnYxYTogJHRlc3RoYXNoczY0Rm52MWEsIHRlc3RoYXNodTY0Rm52MWE6ICR0ZXN0aGFzaHU2NEZudjFhLCB0ZXN0YXJyYXlvZmJvb2xzOiAkdGVzdGFycmF5b2Zib29scywgdGVzdGY6ICR0ZXN0ZiwgdGVzdGYyOiAkdGVzdGYyLCB0ZXN0ZjM6ICR0ZXN0ZjMsIHRlc3RhcnJheW9mc3RyaW5nMjogJHRlc3RhcnJheW9mc3RyaW5nMiwgdGVzdGFycmF5b2Zzb3J0ZWRzdHJ1Y3Q6ICR0ZXN0YXJyYXlvZnNvcnRlZHN0cnVjdCwgZmxleDogJGZsZXgsIHRlc3Q1OiAkdGVzdDUsIHZlY3Rvck9mTG9uZ3M6ICR2ZWN0b3JPZkxvbmdzLCB2ZWN0b3JPZkRvdWJsZXM6ICR2ZWN0b3JPZkRvdWJsZXMsIHBhcmVudE5hbWVzcGFjZVRlc3Q6ICRwYXJlbnROYW1lc3BhY2VUZXN0LCB2ZWN0b3JPZlJlZmVycmFibGVzOiAkdmVjdG9yT2ZSZWZlcnJhYmxlcywgc2luZ2xlV2Vha1JlZmVyZW5jZTogJHNpbmdsZVdlYWtSZWZlcmVuY2UsIHZlY3Rvck9mV2Vha1JlZmVyZW5jZXM6ICR2ZWN0b3JPZldlYWtSZWZlcmVuY2VzLCB2ZWN0b3JPZlN0cm9uZ1JlZmVycmFibGVzOiAkdmVjdG9yT2ZTdHJvbmdSZWZlcnJhYmxlcywgY29Pd25pbmdSZWZlcmVuY2U6ICRjb093bmluZ1JlZmVyZW5jZSwgdmVjdG9yT2ZDb093bmluZ1JlZmVyZW5jZXM6ICR2ZWN0b3JPZkNvT3duaW5nUmVmZXJlbmNlcywgbm9uT3duaW5nUmVmZXJlbmNlOiAkbm9uT3duaW5nUmVmZXJlbmNlLCB2ZWN0b3JPZk5vbk93bmluZ1JlZmVyZW5jZXM6ICR2ZWN0b3JPZk5vbk93bmluZ1JlZmVyZW5jZXMsIGFueVVuaXF1ZVR5cGU6ICRhbnlVbmlxdWVUeXBlLCBhbnlVbmlxdWU6ICRhbnlVbmlxdWUsIGFueUFtYmlndW91c1R5cGU6ICRhbnlBbWJpZ3VvdXNUeXBlLCBhbnlBbWJpZ3VvdXM6ICRhbnlBbWJpZ3VvdXMsIHZlY3Rvck9mRW51bXM6ICR2ZWN0b3JPZkVudW1zLCBzaWduZWRFbnVtOiAkc2lnbmVkRW51bSwgdGVzdHJlcXVpcmVkbmVzdGVkZmxhdGJ1ZmZlcjogJHRlc3RyZXF1aXJlZG5lc3RlZGZsYXRidWZmZXIsIHNjYWxhcktleVNvcnRlZFRhYmxlczogJHNjYWxhcktleVNvcnRlZFRhYmxlcywgbmF0aXZlSW5saW5lOiAkbmF0aXZlSW5saW5lLCBsb25nRW51bU5vbkVudW1EZWZhdWx0OiAkbG9uZ0VudW1Ob25FbnVtRGVmYXVsdCwgbG9uZ0VudW1Ob3JtYWxEZWZhdWx0OiAkbG9uZ0VudW1Ob3JtYWxEZWZhdWx0fSc7CisgICAgcmV0dXJuICdNb25zdGVye3BvczogJHtwb3N9LCBtYW5hOiAke21hbmF9LCBocDogJHtocH0sIG5hbWU6ICR7bmFtZX0sIGludmVudG9yeTogJHtpbnZlbnRvcnl9LCBjb2xvcjogJHtjb2xvcn0sIHRlc3RUeXBlOiAke3Rlc3RUeXBlfSwgdGVzdDogJHt0ZXN0fSwgdGVzdDQ6ICR7dGVzdDR9LCB0ZXN0YXJyYXlvZnN0cmluZzogJHt0ZXN0YXJyYXlvZnN0cmluZ30sIHRlc3RhcnJheW9mdGFibGVzOiAke3Rlc3RhcnJheW9mdGFibGVzfSwgZW5lbXk6ICR7ZW5lbXl9LCB0ZXN0bmVzdGVkZmxhdGJ1ZmZlcjogJHt0ZXN0bmVzdGVkZmxhdGJ1ZmZlcn0sIHRlc3RlbXB0eTogJHt0ZXN0ZW1wdHl9LCB0ZXN0Ym9vbDogJHt0ZXN0Ym9vbH0sIHRlc3RoYXNoczMyRm52MTogJHt0ZXN0aGFzaHMzMkZudjF9LCB0ZXN0aGFzaHUzMkZudjE6ICR7dGVzdGhhc2h1MzJGbnYxfSwgdGVzdGhhc2hzNjRGbnYxOiAke3Rlc3RoYXNoczY0Rm52MX0sIHRlc3RoYXNodTY0Rm52MTogJHt0ZXN0aGFzaHU2NEZudjF9LCB0ZXN0aGFzaHMzMkZudjFhOiAke3Rlc3RoYXNoczMyRm52MWF9LCB0ZXN0aGFzaHUzMkZudjFhOiAke3Rlc3RoYXNodTMyRm52MWF9LCB0ZXN0aGFzaHM2NEZudjFhOiAke3Rlc3RoYXNoczY0Rm52MWF9LCB0ZXN0aGFzaHU2NEZudjFhOiAke3Rlc3RoYXNodTY0Rm52MWF9LCB0ZXN0YXJyYXlvZmJvb2xzOiAke3Rlc3RhcnJheW9mYm9vbHN9LCB0ZXN0ZjogJHt0ZXN0Zn0sIHRlc3RmMjogJHt0ZXN0ZjJ9LCB0ZXN0ZjM6ICR7dGVzdGYzfSwgdGVzdGFycmF5b2ZzdHJpbmcyOiAke3Rlc3RhcnJheW9mc3RyaW5nMn0sIHRlc3RhcnJheW9mc29ydGVkc3RydWN0OiAke3Rlc3RhcnJheW9mc29ydGVkc3RydWN0fSwgZmxleDogJHtmbGV4fSwgdGVzdDU6ICR7dGVzdDV9LCB2ZWN0b3JPZkxvbmdzOiAke3ZlY3Rvck9mTG9uZ3N9LCB2ZWN0b3JPZkRvdWJsZXM6ICR7dmVjdG9yT2ZEb3VibGVzfSwgcGFyZW50TmFtZXNwYWNlVGVzdDogJHtwYXJlbnROYW1lc3BhY2VUZXN0fSwgdmVjdG9yT2ZSZWZlcnJhYmxlczogJHt2ZWN0b3JPZlJlZmVycmFibGVzfSwgc2luZ2xlV2Vha1JlZmVyZW5jZTogJHtzaW5nbGVXZWFrUmVmZXJlbmNlfSwgdmVjdG9yT2ZXZWFrUmVmZXJlbmNlczogJHt2ZWN0b3JPZldlYWtSZWZlcmVuY2VzfSwgdmVjdG9yT2ZTdHJvbmdSZWZlcnJhYmxlczogJHt2ZWN0b3JPZlN0cm9uZ1JlZmVycmFibGVzfSwgY29Pd25pbmdSZWZlcmVuY2U6ICR7Y29Pd25pbmdSZWZlcmVuY2V9LCB2ZWN0b3JPZkNvT3duaW5nUmVmZXJlbmNlczogJHt2ZWN0b3JPZkNvT3duaW5nUmVmZXJlbmNlc30sIG5vbk93bmluZ1JlZmVyZW5jZTogJHtub25Pd25pbmdSZWZlcmVuY2V9LCB2ZWN0b3JPZk5vbk93bmluZ1JlZmVyZW5jZXM6ICR7dmVjdG9yT2ZOb25Pd25pbmdSZWZlcmVuY2VzfSwgYW55VW5pcXVlVHlwZTogJHthbnlVbmlxdWVUeXBlfSwgYW55VW5pcXVlOiAke2FueVVuaXF1ZX0sIGFueUFtYmlndW91c1R5cGU6ICR7YW55QW1iaWd1b3VzVHlwZX0sIGFueUFtYmlndW91czogJHthbnlBbWJpZ3VvdXN9LCB2ZWN0b3JPZkVudW1zOiAke3ZlY3Rvck9mRW51bXN9LCBzaWduZWRFbnVtOiAke3NpZ25lZEVudW19LCB0ZXN0cmVxdWlyZWRuZXN0ZWRmbGF0YnVmZmVyOiAke3Rlc3RyZXF1aXJlZG5lc3RlZGZsYXRidWZmZXJ9LCBzY2FsYXJLZXlTb3J0ZWRUYWJsZXM6ICR7c2NhbGFyS2V5U29ydGVkVGFibGVzfSwgbmF0aXZlSW5saW5lOiAke25hdGl2ZUlubGluZX0sIGxvbmdFbnVtTm9uRW51bURlZmF1bHQ6ICR7bG9uZ0VudW1Ob25FbnVtRGVmYXVsdH0sIGxvbmdFbnVtTm9ybWFsRGVmYXVsdDogJHtsb25nRW51bU5vcm1hbERlZmF1bHR9fSc7CiAgIH0KIAogICBNb25zdGVyVCB1bnBhY2soKSA9PiBNb25zdGVyVCgKQEAgLTE0NzIsNyArMTU2MCw3IEBACiAKICAgQG92ZXJyaWRlCiAgIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICByZXR1cm4gJ01vbnN0ZXJUe3BvczogJHBvcywgbWFuYTogJG1hbmEsIGhwOiAkaHAsIG5hbWU6ICRuYW1lLCBpbnZlbnRvcnk6ICRpbnZlbnRvcnksIGNvbG9yOiAkY29sb3IsIHRlc3RUeXBlOiAkdGVzdFR5cGUsIHRlc3Q6ICR0ZXN0LCB0ZXN0NDogJHRlc3Q0LCB0ZXN0YXJyYXlvZnN0cmluZzogJHRlc3RhcnJheW9mc3RyaW5nLCB0ZXN0YXJyYXlvZnRhYmxlczogJHRlc3RhcnJheW9mdGFibGVzLCBlbmVteTogJGVuZW15LCB0ZXN0bmVzdGVkZmxhdGJ1ZmZlcjogJHRlc3RuZXN0ZWRmbGF0YnVmZmVyLCB0ZXN0ZW1wdHk6ICR0ZXN0ZW1wdHksIHRlc3Rib29sOiAkdGVzdGJvb2wsIHRlc3RoYXNoczMyRm52MTogJHRlc3RoYXNoczMyRm52MSwgdGVzdGhhc2h1MzJGbnYxOiAkdGVzdGhhc2h1MzJGbnYxLCB0ZXN0aGFzaHM2NEZudjE6ICR0ZXN0aGFzaHM2NEZudjEsIHRlc3RoYXNodTY0Rm52MTogJHRlc3RoYXNodTY0Rm52MSwgdGVzdGhhc2hzMzJGbnYxYTogJHRlc3RoYXNoczMyRm52MWEsIHRlc3RoYXNodTMyRm52MWE6ICR0ZXN0aGFzaHUzMkZudjFhLCB0ZXN0aGFzaHM2NEZudjFhOiAkdGVzdGhhc2hzNjRGbnYxYSwgdGVzdGhhc2h1NjRGbnYxYTogJHRlc3RoYXNodTY0Rm52MWEsIHRlc3RhcnJheW9mYm9vbHM6ICR0ZXN0YXJyYXlvZmJvb2xzLCB0ZXN0ZjogJHRlc3RmLCB0ZXN0ZjI6ICR0ZXN0ZjIsIHRlc3RmMzogJHRlc3RmMywgdGVzdGFycmF5b2ZzdHJpbmcyOiAkdGVzdGFycmF5b2ZzdHJpbmcyLCB0ZXN0YXJyYXlvZnNvcnRlZHN0cnVjdDogJHRlc3RhcnJheW9mc29ydGVkc3RydWN0LCBmbGV4OiAkZmxleCwgdGVzdDU6ICR0ZXN0NSwgdmVjdG9yT2ZMb25nczogJHZlY3Rvck9mTG9uZ3MsIHZlY3Rvck9mRG91YmxlczogJHZlY3Rvck9mRG91YmxlcywgcGFyZW50TmFtZXNwYWNlVGVzdDogJHBhcmVudE5hbWVzcGFjZVRlc3QsIHZlY3Rvck9mUmVmZXJyYWJsZXM6ICR2ZWN0b3JPZlJlZmVycmFibGVzLCBzaW5nbGVXZWFrUmVmZXJlbmNlOiAkc2luZ2xlV2Vha1JlZmVyZW5jZSwgdmVjdG9yT2ZXZWFrUmVmZXJlbmNlczogJHZlY3Rvck9mV2Vha1JlZmVyZW5jZXMsIHZlY3Rvck9mU3Ryb25nUmVmZXJyYWJsZXM6ICR2ZWN0b3JPZlN0cm9uZ1JlZmVycmFibGVzLCBjb093bmluZ1JlZmVyZW5jZTogJGNvT3duaW5nUmVmZXJlbmNlLCB2ZWN0b3JPZkNvT3duaW5nUmVmZXJlbmNlczogJHZlY3Rvck9mQ29Pd25pbmdSZWZlcmVuY2VzLCBub25Pd25pbmdSZWZlcmVuY2U6ICRub25Pd25pbmdSZWZlcmVuY2UsIHZlY3Rvck9mTm9uT3duaW5nUmVmZXJlbmNlczogJHZlY3Rvck9mTm9uT3duaW5nUmVmZXJlbmNlcywgYW55VW5pcXVlVHlwZTogJGFueVVuaXF1ZVR5cGUsIGFueVVuaXF1ZTogJGFueVVuaXF1ZSwgYW55QW1iaWd1b3VzVHlwZTogJGFueUFtYmlndW91c1R5cGUsIGFueUFtYmlndW91czogJGFueUFtYmlndW91cywgdmVjdG9yT2ZFbnVtczogJHZlY3Rvck9mRW51bXMsIHNpZ25lZEVudW06ICRzaWduZWRFbnVtLCB0ZXN0cmVxdWlyZWRuZXN0ZWRmbGF0YnVmZmVyOiAkdGVzdHJlcXVpcmVkbmVzdGVkZmxhdGJ1ZmZlciwgc2NhbGFyS2V5U29ydGVkVGFibGVzOiAkc2NhbGFyS2V5U29ydGVkVGFibGVzLCBuYXRpdmVJbmxpbmU6ICRuYXRpdmVJbmxpbmUsIGxvbmdFbnVtTm9uRW51bURlZmF1bHQ6ICRsb25nRW51bU5vbkVudW1EZWZhdWx0LCBsb25nRW51bU5vcm1hbERlZmF1bHQ6ICRsb25nRW51bU5vcm1hbERlZmF1bHR9JzsKKyAgICByZXR1cm4gJ01vbnN0ZXJUe3BvczogJHtwb3N9LCBtYW5hOiAke21hbmF9LCBocDogJHtocH0sIG5hbWU6ICR7bmFtZX0sIGludmVudG9yeTogJHtpbnZlbnRvcnl9LCBjb2xvcjogJHtjb2xvcn0sIHRlc3RUeXBlOiAke3Rlc3RUeXBlfSwgdGVzdDogJHt0ZXN0fSwgdGVzdDQ6ICR7dGVzdDR9LCB0ZXN0YXJyYXlvZnN0cmluZzogJHt0ZXN0YXJyYXlvZnN0cmluZ30sIHRlc3RhcnJheW9mdGFibGVzOiAke3Rlc3RhcnJheW9mdGFibGVzfSwgZW5lbXk6ICR7ZW5lbXl9LCB0ZXN0bmVzdGVkZmxhdGJ1ZmZlcjogJHt0ZXN0bmVzdGVkZmxhdGJ1ZmZlcn0sIHRlc3RlbXB0eTogJHt0ZXN0ZW1wdHl9LCB0ZXN0Ym9vbDogJHt0ZXN0Ym9vbH0sIHRlc3RoYXNoczMyRm52MTogJHt0ZXN0aGFzaHMzMkZudjF9LCB0ZXN0aGFzaHUzMkZudjE6ICR7dGVzdGhhc2h1MzJGbnYxfSwgdGVzdGhhc2hzNjRGbnYxOiAke3Rlc3RoYXNoczY0Rm52MX0sIHRlc3RoYXNodTY0Rm52MTogJHt0ZXN0aGFzaHU2NEZudjF9LCB0ZXN0aGFzaHMzMkZudjFhOiAke3Rlc3RoYXNoczMyRm52MWF9LCB0ZXN0aGFzaHUzMkZudjFhOiAke3Rlc3RoYXNodTMyRm52MWF9LCB0ZXN0aGFzaHM2NEZudjFhOiAke3Rlc3RoYXNoczY0Rm52MWF9LCB0ZXN0aGFzaHU2NEZudjFhOiAke3Rlc3RoYXNodTY0Rm52MWF9LCB0ZXN0YXJyYXlvZmJvb2xzOiAke3Rlc3RhcnJheW9mYm9vbHN9LCB0ZXN0ZjogJHt0ZXN0Zn0sIHRlc3RmMjogJHt0ZXN0ZjJ9LCB0ZXN0ZjM6ICR7dGVzdGYzfSwgdGVzdGFycmF5b2ZzdHJpbmcyOiAke3Rlc3RhcnJheW9mc3RyaW5nMn0sIHRlc3RhcnJheW9mc29ydGVkc3RydWN0OiAke3Rlc3RhcnJheW9mc29ydGVkc3RydWN0fSwgZmxleDogJHtmbGV4fSwgdGVzdDU6ICR7dGVzdDV9LCB2ZWN0b3JPZkxvbmdzOiAke3ZlY3Rvck9mTG9uZ3N9LCB2ZWN0b3JPZkRvdWJsZXM6ICR7dmVjdG9yT2ZEb3VibGVzfSwgcGFyZW50TmFtZXNwYWNlVGVzdDogJHtwYXJlbnROYW1lc3BhY2VUZXN0fSwgdmVjdG9yT2ZSZWZlcnJhYmxlczogJHt2ZWN0b3JPZlJlZmVycmFibGVzfSwgc2luZ2xlV2Vha1JlZmVyZW5jZTogJHtzaW5nbGVXZWFrUmVmZXJlbmNlfSwgdmVjdG9yT2ZXZWFrUmVmZXJlbmNlczogJHt2ZWN0b3JPZldlYWtSZWZlcmVuY2VzfSwgdmVjdG9yT2ZTdHJvbmdSZWZlcnJhYmxlczogJHt2ZWN0b3JPZlN0cm9uZ1JlZmVycmFibGVzfSwgY29Pd25pbmdSZWZlcmVuY2U6ICR7Y29Pd25pbmdSZWZlcmVuY2V9LCB2ZWN0b3JPZkNvT3duaW5nUmVmZXJlbmNlczogJHt2ZWN0b3JPZkNvT3duaW5nUmVmZXJlbmNlc30sIG5vbk93bmluZ1JlZmVyZW5jZTogJHtub25Pd25pbmdSZWZlcmVuY2V9LCB2ZWN0b3JPZk5vbk93bmluZ1JlZmVyZW5jZXM6ICR7dmVjdG9yT2ZOb25Pd25pbmdSZWZlcmVuY2VzfSwgYW55VW5pcXVlVHlwZTogJHthbnlVbmlxdWVUeXBlfSwgYW55VW5pcXVlOiAke2FueVVuaXF1ZX0sIGFueUFtYmlndW91c1R5cGU6ICR7YW55QW1iaWd1b3VzVHlwZX0sIGFueUFtYmlndW91czogJHthbnlBbWJpZ3VvdXN9LCB2ZWN0b3JPZkVudW1zOiAke3ZlY3Rvck9mRW51bXN9LCBzaWduZWRFbnVtOiAke3NpZ25lZEVudW19LCB0ZXN0cmVxdWlyZWRuZXN0ZWRmbGF0YnVmZmVyOiAke3Rlc3RyZXF1aXJlZG5lc3RlZGZsYXRidWZmZXJ9LCBzY2FsYXJLZXlTb3J0ZWRUYWJsZXM6ICR7c2NhbGFyS2V5U29ydGVkVGFibGVzfSwgbmF0aXZlSW5saW5lOiAke25hdGl2ZUlubGluZX0sIGxvbmdFbnVtTm9uRW51bURlZmF1bHQ6ICR7bG9uZ0VudW1Ob25FbnVtRGVmYXVsdH0sIGxvbmdFbnVtTm9ybWFsRGVmYXVsdDogJHtsb25nRW51bU5vcm1hbERlZmF1bHR9fSc7CiAgIH0KIH0KIApAQCAtMjAyMiw3ICsyMTEwLDcgQEAKIAogICBAb3ZlcnJpZGUKICAgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgIHJldHVybiAnVHlwZUFsaWFzZXN7aTg6ICRpOCwgdTg6ICR1OCwgaTE2OiAkaTE2LCB1MTY6ICR1MTYsIGkzMjogJGkzMiwgdTMyOiAkdTMyLCBpNjQ6ICRpNjQsIHU2NDogJHU2NCwgZjMyOiAkZjMyLCBmNjQ6ICRmNjQsIHY4OiAkdjgsIHZmNjQ6ICR2ZjY0fSc7CisgICAgcmV0dXJuICdUeXBlQWxpYXNlc3tpODogJHtpOH0sIHU4OiAke3U4fSwgaTE2OiAke2kxNn0sIHUxNjogJHt1MTZ9LCBpMzI6ICR7aTMyfSwgdTMyOiAke3UzMn0sIGk2NDogJHtpNjR9LCB1NjQ6ICR7dTY0fSwgZjMyOiAke2YzMn0sIGY2NDogJHtmNjR9LCB2ODogJHt2OH0sIHZmNjQ6ICR7dmY2NH19JzsKICAgfQogCiAgIFR5cGVBbGlhc2VzVCB1bnBhY2soKSA9PiBUeXBlQWxpYXNlc1QoCkBAIC0yMDk3LDcgKzIxODUsNyBAQAogCiAgIEBvdmVycmlkZQogICBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgcmV0dXJuICdUeXBlQWxpYXNlc1R7aTg6ICRpOCwgdTg6ICR1OCwgaTE2OiAkaTE2LCB1MTY6ICR1MTYsIGkzMjogJGkzMiwgdTMyOiAkdTMyLCBpNjQ6ICRpNjQsIHU2NDogJHU2NCwgZjMyOiAkZjMyLCBmNjQ6ICRmNjQsIHY4OiAkdjgsIHZmNjQ6ICR2ZjY0fSc7CisgICAgcmV0dXJuICdUeXBlQWxpYXNlc1R7aTg6ICR7aTh9LCB1ODogJHt1OH0sIGkxNjogJHtpMTZ9LCB1MTY6ICR7dTE2fSwgaTMyOiAke2kzMn0sIHUzMjogJHt1MzJ9LCBpNjQ6ICR7aTY0fSwgdTY0OiAke3U2NH0sIGYzMjogJHtmMzJ9LCBmNjQ6ICR7ZjY0fSwgdjg6ICR7djh9LCB2ZjY0OiAke3ZmNjR9fSc7CiAgIH0KIH0KIApkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvbW9uc3Rlcl90ZXN0X3NlcmlhbGl6ZS9tb2QucnMgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9tb25zdGVyX3Rlc3Rfc2VyaWFsaXplL21vZC5ycwppbmRleCBmZGJjMjZiLi43ZjFmYWIxIDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9tb25zdGVyX3Rlc3Rfc2VyaWFsaXplL21vZC5ycworKysgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9tb25zdGVyX3Rlc3Rfc2VyaWFsaXplL21vZC5ycwpAQCAtMSw0ICsxLDUgQEAKIC8vIEF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGJ5IHRoZSBGbGF0YnVmZmVycyBjb21waWxlci4gRG8gbm90IG1vZGlmeS4KKy8vIEBnZW5lcmF0ZWQKIHB1YiBtb2QgbXlfZ2FtZSB7CiAgIHVzZSBzdXBlcjo6KjsKICAgcHViIG1vZCBleGFtcGxlIHsKQEAgLTI1LDYgKzI2LDggQEAKICAgICBwdWIgdXNlIHNlbGY6OmFiaWxpdHlfZ2VuZXJhdGVkOjoqOwogICAgIG1vZCBzdHJ1Y3Rfb2Zfc3RydWN0c19nZW5lcmF0ZWQ7CiAgICAgcHViIHVzZSBzZWxmOjpzdHJ1Y3Rfb2Zfc3RydWN0c19nZW5lcmF0ZWQ6Oio7CisgICAgbW9kIHN0cnVjdF9vZl9zdHJ1Y3RzX29mX3N0cnVjdHNfZ2VuZXJhdGVkOworICAgIHB1YiB1c2Ugc2VsZjo6c3RydWN0X29mX3N0cnVjdHNfb2Zfc3RydWN0c19nZW5lcmF0ZWQ6Oio7CiAgICAgbW9kIHN0YXRfZ2VuZXJhdGVkOwogICAgIHB1YiB1c2Ugc2VsZjo6c3RhdF9nZW5lcmF0ZWQ6Oio7CiAgICAgbW9kIHJlZmVycmFibGVfZ2VuZXJhdGVkOwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvbW9uc3Rlcl90ZXN0X3NlcmlhbGl6ZS9teV9nYW1lL2V4YW1wbGUvYWJpbGl0eV9nZW5lcmF0ZWQucnMgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9tb25zdGVyX3Rlc3Rfc2VyaWFsaXplL215X2dhbWUvZXhhbXBsZS9hYmlsaXR5X2dlbmVyYXRlZC5ycwppbmRleCBjZGM3ODgyLi41YzhiY2Y4IDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9tb25zdGVyX3Rlc3Rfc2VyaWFsaXplL215X2dhbWUvZXhhbXBsZS9hYmlsaXR5X2dlbmVyYXRlZC5ycworKysgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9tb25zdGVyX3Rlc3Rfc2VyaWFsaXplL215X2dhbWUvZXhhbXBsZS9hYmlsaXR5X2dlbmVyYXRlZC5ycwpAQCAtMSw3ICsxLDEyIEBACiAvLyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBieSB0aGUgRmxhdEJ1ZmZlcnMgY29tcGlsZXIsIGRvIG5vdCBtb2RpZnkKKy8vIEBnZW5lcmF0ZWQKK2V4dGVybiBjcmF0ZSBhbGxvYzsKIGV4dGVybiBjcmF0ZSBmbGF0YnVmZmVyczsKLXVzZSBzdGQ6Om1lbTsKLXVzZSBzdGQ6OmNtcDo6T3JkZXJpbmc7Cit1c2UgYWxsb2M6OmJveGVkOjpCb3g7Cit1c2UgYWxsb2M6OnN0cmluZzo6e1N0cmluZywgVG9TdHJpbmd9OwordXNlIGFsbG9jOjp2ZWM6OlZlYzsKK3VzZSBjb3JlOjptZW07Cit1c2UgY29yZTo6Y21wOjpPcmRlcmluZzsKIGV4dGVybiBjcmF0ZSBzZXJkZTsKIHVzZSBzZWxmOjpzZXJkZTo6c2VyOjp7U2VyaWFsaXplLCBTZXJpYWxpemVyLCBTZXJpYWxpemVTdHJ1Y3R9OwogdXNlIHNlbGY6OmZsYXRidWZmZXJzOjp7RW5kaWFuU2NhbGFyLCBGb2xsb3d9OwpAQCAtMTUsOCArMjAsOCBAQAogICAgIFNlbGYoWzA7IDhdKQogICB9CiB9Ci1pbXBsIHN0ZDo6Zm10OjpEZWJ1ZyBmb3IgQWJpbGl0eSB7Ci0gIGZuIGZtdCgmc2VsZiwgZjogJm11dCBzdGQ6OmZtdDo6Rm9ybWF0dGVyKSAtPiBzdGQ6OmZtdDo6UmVzdWx0IHsKK2ltcGwgY29yZTo6Zm10OjpEZWJ1ZyBmb3IgQWJpbGl0eSB7CisgIGZuIGZtdCgmc2VsZiwgZjogJm11dCBjb3JlOjpmbXQ6OkZvcm1hdHRlcikgLT4gY29yZTo6Zm10OjpSZXN1bHQgewogICAgIGYuZGVidWdfc3RydWN0KCJBYmlsaXR5IikKICAgICAgIC5maWVsZCgiaWQiLCAmc2VsZi5pZCgpKQogICAgICAgLmZpZWxkKCJkaXN0YW5jZSIsICZzZWxmLmRpc3RhbmNlKCkpCkBAIC00NSw3ICs1MCw3IEBACiAgICAgI1tpbmxpbmVdCiAgICAgZm4gcHVzaCgmc2VsZiwgZHN0OiAmbXV0IFt1OF0sIF9yZXN0OiAmW3U4XSkgewogICAgICAgICBsZXQgc3JjID0gdW5zYWZlIHsKLSAgICAgICAgICAgIDo6c3RkOjpzbGljZTo6ZnJvbV9yYXdfcGFydHMoc2VsZiBhcyAqY29uc3QgQWJpbGl0eSBhcyAqY29uc3QgdTgsIFNlbGY6OnNpemUoKSkKKyAgICAgICAgICAgIDo6Y29yZTo6c2xpY2U6OmZyb21fcmF3X3BhcnRzKHNlbGYgYXMgKmNvbnN0IEFiaWxpdHkgYXMgKmNvbnN0IHU4LCBTZWxmOjpzaXplKCkpCiAgICAgICAgIH07CiAgICAgICAgIGRzdC5jb3B5X2Zyb21fc2xpY2Uoc3JjKTsKICAgICB9CkBAIC01Niw3ICs2MSw3IEBACiAgICAgI1tpbmxpbmVdCiAgICAgZm4gcHVzaCgmc2VsZiwgZHN0OiAmbXV0IFt1OF0sIF9yZXN0OiAmW3U4XSkgewogICAgICAgICBsZXQgc3JjID0gdW5zYWZlIHsKLSAgICAgICAgICAgIDo6c3RkOjpzbGljZTo6ZnJvbV9yYXdfcGFydHMoKnNlbGYgYXMgKmNvbnN0IEFiaWxpdHkgYXMgKmNvbnN0IHU4LCBTZWxmOjpzaXplKCkpCisgICAgICAgICAgICA6OmNvcmU6OnNsaWNlOjpmcm9tX3Jhd19wYXJ0cygqc2VsZiBhcyAqY29uc3QgQWJpbGl0eSBhcyAqY29uc3QgdTgsIFNlbGY6OnNpemUoKSkKICAgICAgICAgfTsKICAgICAgICAgZHN0LmNvcHlfZnJvbV9zbGljZShzcmMpOwogICAgIH0KQEAgLTEyOSw3ICsxMzQsNyBAQAogICB9CiAKICAgI1tpbmxpbmVdCi0gIHB1YiBmbiBrZXlfY29tcGFyZV93aXRoX3ZhbHVlKCZzZWxmLCB2YWw6IHUzMikgLT4gOjpzdGQ6OmNtcDo6T3JkZXJpbmcgeworICBwdWIgZm4ga2V5X2NvbXBhcmVfd2l0aF92YWx1ZSgmc2VsZiwgdmFsOiB1MzIpIC0+IDo6Y29yZTo6Y21wOjpPcmRlcmluZyB7CiAgICAgbGV0IGtleSA9IHNlbGYuaWQoKTsKICAgICBrZXkuY21wKCZ2YWwpCiAgIH0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL21vbnN0ZXJfdGVzdF9zZXJpYWxpemUvbXlfZ2FtZS9leGFtcGxlL2FueV9hbWJpZ3VvdXNfYWxpYXNlc19nZW5lcmF0ZWQucnMgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9tb25zdGVyX3Rlc3Rfc2VyaWFsaXplL215X2dhbWUvZXhhbXBsZS9hbnlfYW1iaWd1b3VzX2FsaWFzZXNfZ2VuZXJhdGVkLnJzCmluZGV4IDJlNzU3YTguLmIyNzhjYTEgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL21vbnN0ZXJfdGVzdF9zZXJpYWxpemUvbXlfZ2FtZS9leGFtcGxlL2FueV9hbWJpZ3VvdXNfYWxpYXNlc19nZW5lcmF0ZWQucnMKKysrIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvbW9uc3Rlcl90ZXN0X3NlcmlhbGl6ZS9teV9nYW1lL2V4YW1wbGUvYW55X2FtYmlndW91c19hbGlhc2VzX2dlbmVyYXRlZC5ycwpAQCAtMSw3ICsxLDEyIEBACiAvLyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBieSB0aGUgRmxhdEJ1ZmZlcnMgY29tcGlsZXIsIGRvIG5vdCBtb2RpZnkKKy8vIEBnZW5lcmF0ZWQKK2V4dGVybiBjcmF0ZSBhbGxvYzsKIGV4dGVybiBjcmF0ZSBmbGF0YnVmZmVyczsKLXVzZSBzdGQ6Om1lbTsKLXVzZSBzdGQ6OmNtcDo6T3JkZXJpbmc7Cit1c2UgYWxsb2M6OmJveGVkOjpCb3g7Cit1c2UgYWxsb2M6OnN0cmluZzo6e1N0cmluZywgVG9TdHJpbmd9OwordXNlIGFsbG9jOjp2ZWM6OlZlYzsKK3VzZSBjb3JlOjptZW07Cit1c2UgY29yZTo6Y21wOjpPcmRlcmluZzsKIGV4dGVybiBjcmF0ZSBzZXJkZTsKIHVzZSBzZWxmOjpzZXJkZTo6c2VyOjp7U2VyaWFsaXplLCBTZXJpYWxpemVyLCBTZXJpYWxpemVTdHJ1Y3R9OwogdXNlIHNlbGY6OmZsYXRidWZmZXJzOjp7RW5kaWFuU2NhbGFyLCBGb2xsb3d9OwpAQCAtNDgsOCArNTMsOCBAQAogICAgIH0KICAgfQogfQotaW1wbCBzdGQ6OmZtdDo6RGVidWcgZm9yIEFueUFtYmlndW91c0FsaWFzZXMgewotICBmbiBmbXQoJnNlbGYsIGY6ICZtdXQgc3RkOjpmbXQ6OkZvcm1hdHRlcikgLT4gc3RkOjpmbXQ6OlJlc3VsdCB7CitpbXBsIGNvcmU6OmZtdDo6RGVidWcgZm9yIEFueUFtYmlndW91c0FsaWFzZXMgeworICBmbiBmbXQoJnNlbGYsIGY6ICZtdXQgY29yZTo6Zm10OjpGb3JtYXR0ZXIpIC0+IGNvcmU6OmZtdDo6UmVzdWx0IHsKICAgICBpZiBsZXQgU29tZShuYW1lKSA9IHNlbGYudmFyaWFudF9uYW1lKCkgewogICAgICAgZi53cml0ZV9zdHIobmFtZSkKICAgICB9IGVsc2UgewpAQCAtMTQ2LDcgKzE1MSw3IEBACiAgIC8vLyBJZiB0aGUgdW5pb24gdmFyaWFudCBtYXRjaGVzLCByZXR1cm4gdGhlIG93bmVkIE1vbnN0ZXJULCBzZXR0aW5nIHRoZSB1bmlvbiB0byBOT05FLgogICBwdWIgZm4gdGFrZV9tMSgmbXV0IHNlbGYpIC0+IE9wdGlvbjxCb3g8TW9uc3RlclQ+PiB7CiAgICAgaWYgbGV0IFNlbGY6Ok0xKF8pID0gc2VsZiB7Ci0gICAgICBsZXQgdiA9IHN0ZDo6bWVtOjpyZXBsYWNlKHNlbGYsIFNlbGY6Ok5PTkUpOworICAgICAgbGV0IHYgPSBjb3JlOjptZW06OnJlcGxhY2Uoc2VsZiwgU2VsZjo6Tk9ORSk7CiAgICAgICBpZiBsZXQgU2VsZjo6TTEodykgPSB2IHsKICAgICAgICAgU29tZSh3KQogICAgICAgfSBlbHNlIHsKQEAgLTE2Nyw3ICsxNzIsNyBAQAogICAvLy8gSWYgdGhlIHVuaW9uIHZhcmlhbnQgbWF0Y2hlcywgcmV0dXJuIHRoZSBvd25lZCBNb25zdGVyVCwgc2V0dGluZyB0aGUgdW5pb24gdG8gTk9ORS4KICAgcHViIGZuIHRha2VfbTIoJm11dCBzZWxmKSAtPiBPcHRpb248Qm94PE1vbnN0ZXJUPj4gewogICAgIGlmIGxldCBTZWxmOjpNMihfKSA9IHNlbGYgewotICAgICAgbGV0IHYgPSBzdGQ6Om1lbTo6cmVwbGFjZShzZWxmLCBTZWxmOjpOT05FKTsKKyAgICAgIGxldCB2ID0gY29yZTo6bWVtOjpyZXBsYWNlKHNlbGYsIFNlbGY6Ok5PTkUpOwogICAgICAgaWYgbGV0IFNlbGY6Ok0yKHcpID0gdiB7CiAgICAgICAgIFNvbWUodykKICAgICAgIH0gZWxzZSB7CkBAIC0xODgsNyArMTkzLDcgQEAKICAgLy8vIElmIHRoZSB1bmlvbiB2YXJpYW50IG1hdGNoZXMsIHJldHVybiB0aGUgb3duZWQgTW9uc3RlclQsIHNldHRpbmcgdGhlIHVuaW9uIHRvIE5PTkUuCiAgIHB1YiBmbiB0YWtlX20zKCZtdXQgc2VsZikgLT4gT3B0aW9uPEJveDxNb25zdGVyVD4+IHsKICAgICBpZiBsZXQgU2VsZjo6TTMoXykgPSBzZWxmIHsKLSAgICAgIGxldCB2ID0gc3RkOjptZW06OnJlcGxhY2Uoc2VsZiwgU2VsZjo6Tk9ORSk7CisgICAgICBsZXQgdiA9IGNvcmU6Om1lbTo6cmVwbGFjZShzZWxmLCBTZWxmOjpOT05FKTsKICAgICAgIGlmIGxldCBTZWxmOjpNMyh3KSA9IHYgewogICAgICAgICBTb21lKHcpCiAgICAgICB9IGVsc2UgewpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvbW9uc3Rlcl90ZXN0X3NlcmlhbGl6ZS9teV9nYW1lL2V4YW1wbGUvYW55X2dlbmVyYXRlZC5ycyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL21vbnN0ZXJfdGVzdF9zZXJpYWxpemUvbXlfZ2FtZS9leGFtcGxlL2FueV9nZW5lcmF0ZWQucnMKaW5kZXggZDU3MjY0Mi4uZjY3MzkyZCAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvbW9uc3Rlcl90ZXN0X3NlcmlhbGl6ZS9teV9nYW1lL2V4YW1wbGUvYW55X2dlbmVyYXRlZC5ycworKysgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9tb25zdGVyX3Rlc3Rfc2VyaWFsaXplL215X2dhbWUvZXhhbXBsZS9hbnlfZ2VuZXJhdGVkLnJzCkBAIC0xLDcgKzEsMTIgQEAKIC8vIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGJ5IHRoZSBGbGF0QnVmZmVycyBjb21waWxlciwgZG8gbm90IG1vZGlmeQorLy8gQGdlbmVyYXRlZAorZXh0ZXJuIGNyYXRlIGFsbG9jOwogZXh0ZXJuIGNyYXRlIGZsYXRidWZmZXJzOwotdXNlIHN0ZDo6bWVtOwotdXNlIHN0ZDo6Y21wOjpPcmRlcmluZzsKK3VzZSBhbGxvYzo6Ym94ZWQ6OkJveDsKK3VzZSBhbGxvYzo6c3RyaW5nOjp7U3RyaW5nLCBUb1N0cmluZ307Cit1c2UgYWxsb2M6OnZlYzo6VmVjOwordXNlIGNvcmU6Om1lbTsKK3VzZSBjb3JlOjpjbXA6Ok9yZGVyaW5nOwogZXh0ZXJuIGNyYXRlIHNlcmRlOwogdXNlIHNlbGY6OnNlcmRlOjpzZXI6OntTZXJpYWxpemUsIFNlcmlhbGl6ZXIsIFNlcmlhbGl6ZVN0cnVjdH07CiB1c2Ugc2VsZjo6ZmxhdGJ1ZmZlcnM6OntFbmRpYW5TY2FsYXIsIEZvbGxvd307CkBAIC00OCw4ICs1Myw4IEBACiAgICAgfQogICB9CiB9Ci1pbXBsIHN0ZDo6Zm10OjpEZWJ1ZyBmb3IgQW55IHsKLSAgZm4gZm10KCZzZWxmLCBmOiAmbXV0IHN0ZDo6Zm10OjpGb3JtYXR0ZXIpIC0+IHN0ZDo6Zm10OjpSZXN1bHQgeworaW1wbCBjb3JlOjpmbXQ6OkRlYnVnIGZvciBBbnkgeworICBmbiBmbXQoJnNlbGYsIGY6ICZtdXQgY29yZTo6Zm10OjpGb3JtYXR0ZXIpIC0+IGNvcmU6OmZtdDo6UmVzdWx0IHsKICAgICBpZiBsZXQgU29tZShuYW1lKSA9IHNlbGYudmFyaWFudF9uYW1lKCkgewogICAgICAgZi53cml0ZV9zdHIobmFtZSkKICAgICB9IGVsc2UgewpAQCAtMTQ2LDcgKzE1MSw3IEBACiAgIC8vLyBJZiB0aGUgdW5pb24gdmFyaWFudCBtYXRjaGVzLCByZXR1cm4gdGhlIG93bmVkIE1vbnN0ZXJULCBzZXR0aW5nIHRoZSB1bmlvbiB0byBOT05FLgogICBwdWIgZm4gdGFrZV9tb25zdGVyKCZtdXQgc2VsZikgLT4gT3B0aW9uPEJveDxNb25zdGVyVD4+IHsKICAgICBpZiBsZXQgU2VsZjo6TW9uc3RlcihfKSA9IHNlbGYgewotICAgICAgbGV0IHYgPSBzdGQ6Om1lbTo6cmVwbGFjZShzZWxmLCBTZWxmOjpOT05FKTsKKyAgICAgIGxldCB2ID0gY29yZTo6bWVtOjpyZXBsYWNlKHNlbGYsIFNlbGY6Ok5PTkUpOwogICAgICAgaWYgbGV0IFNlbGY6Ok1vbnN0ZXIodykgPSB2IHsKICAgICAgICAgU29tZSh3KQogICAgICAgfSBlbHNlIHsKQEAgLTE2Nyw3ICsxNzIsNyBAQAogICAvLy8gSWYgdGhlIHVuaW9uIHZhcmlhbnQgbWF0Y2hlcywgcmV0dXJuIHRoZSBvd25lZCBUZXN0U2ltcGxlVGFibGVXaXRoRW51bVQsIHNldHRpbmcgdGhlIHVuaW9uIHRvIE5PTkUuCiAgIHB1YiBmbiB0YWtlX3Rlc3Rfc2ltcGxlX3RhYmxlX3dpdGhfZW51bSgmbXV0IHNlbGYpIC0+IE9wdGlvbjxCb3g8VGVzdFNpbXBsZVRhYmxlV2l0aEVudW1UPj4gewogICAgIGlmIGxldCBTZWxmOjpUZXN0U2ltcGxlVGFibGVXaXRoRW51bShfKSA9IHNlbGYgewotICAgICAgbGV0IHYgPSBzdGQ6Om1lbTo6cmVwbGFjZShzZWxmLCBTZWxmOjpOT05FKTsKKyAgICAgIGxldCB2ID0gY29yZTo6bWVtOjpyZXBsYWNlKHNlbGYsIFNlbGY6Ok5PTkUpOwogICAgICAgaWYgbGV0IFNlbGY6OlRlc3RTaW1wbGVUYWJsZVdpdGhFbnVtKHcpID0gdiB7CiAgICAgICAgIFNvbWUodykKICAgICAgIH0gZWxzZSB7CkBAIC0xODgsNyArMTkzLDcgQEAKICAgLy8vIElmIHRoZSB1bmlvbiB2YXJpYW50IG1hdGNoZXMsIHJldHVybiB0aGUgb3duZWQgc3VwZXI6OmV4YW1wbGVfMjo6TW9uc3RlclQsIHNldHRpbmcgdGhlIHVuaW9uIHRvIE5PTkUuCiAgIHB1YiBmbiB0YWtlX215X2dhbWVfZXhhbXBsZV8yX21vbnN0ZXIoJm11dCBzZWxmKSAtPiBPcHRpb248Qm94PHN1cGVyOjpleGFtcGxlXzI6Ok1vbnN0ZXJUPj4gewogICAgIGlmIGxldCBTZWxmOjpNeUdhbWVFeGFtcGxlMk1vbnN0ZXIoXykgPSBzZWxmIHsKLSAgICAgIGxldCB2ID0gc3RkOjptZW06OnJlcGxhY2Uoc2VsZiwgU2VsZjo6Tk9ORSk7CisgICAgICBsZXQgdiA9IGNvcmU6Om1lbTo6cmVwbGFjZShzZWxmLCBTZWxmOjpOT05FKTsKICAgICAgIGlmIGxldCBTZWxmOjpNeUdhbWVFeGFtcGxlMk1vbnN0ZXIodykgPSB2IHsKICAgICAgICAgU29tZSh3KQogICAgICAgfSBlbHNlIHsKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL21vbnN0ZXJfdGVzdF9zZXJpYWxpemUvbXlfZ2FtZS9leGFtcGxlL2FueV91bmlxdWVfYWxpYXNlc19nZW5lcmF0ZWQucnMgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9tb25zdGVyX3Rlc3Rfc2VyaWFsaXplL215X2dhbWUvZXhhbXBsZS9hbnlfdW5pcXVlX2FsaWFzZXNfZ2VuZXJhdGVkLnJzCmluZGV4IDhhM2ZhNjYuLjFiM2QwOTEgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL21vbnN0ZXJfdGVzdF9zZXJpYWxpemUvbXlfZ2FtZS9leGFtcGxlL2FueV91bmlxdWVfYWxpYXNlc19nZW5lcmF0ZWQucnMKKysrIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvbW9uc3Rlcl90ZXN0X3NlcmlhbGl6ZS9teV9nYW1lL2V4YW1wbGUvYW55X3VuaXF1ZV9hbGlhc2VzX2dlbmVyYXRlZC5ycwpAQCAtMSw3ICsxLDEyIEBACiAvLyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBieSB0aGUgRmxhdEJ1ZmZlcnMgY29tcGlsZXIsIGRvIG5vdCBtb2RpZnkKKy8vIEBnZW5lcmF0ZWQKK2V4dGVybiBjcmF0ZSBhbGxvYzsKIGV4dGVybiBjcmF0ZSBmbGF0YnVmZmVyczsKLXVzZSBzdGQ6Om1lbTsKLXVzZSBzdGQ6OmNtcDo6T3JkZXJpbmc7Cit1c2UgYWxsb2M6OmJveGVkOjpCb3g7Cit1c2UgYWxsb2M6OnN0cmluZzo6e1N0cmluZywgVG9TdHJpbmd9OwordXNlIGFsbG9jOjp2ZWM6OlZlYzsKK3VzZSBjb3JlOjptZW07Cit1c2UgY29yZTo6Y21wOjpPcmRlcmluZzsKIGV4dGVybiBjcmF0ZSBzZXJkZTsKIHVzZSBzZWxmOjpzZXJkZTo6c2VyOjp7U2VyaWFsaXplLCBTZXJpYWxpemVyLCBTZXJpYWxpemVTdHJ1Y3R9OwogdXNlIHNlbGY6OmZsYXRidWZmZXJzOjp7RW5kaWFuU2NhbGFyLCBGb2xsb3d9OwpAQCAtNDgsOCArNTMsOCBAQAogICAgIH0KICAgfQogfQotaW1wbCBzdGQ6OmZtdDo6RGVidWcgZm9yIEFueVVuaXF1ZUFsaWFzZXMgewotICBmbiBmbXQoJnNlbGYsIGY6ICZtdXQgc3RkOjpmbXQ6OkZvcm1hdHRlcikgLT4gc3RkOjpmbXQ6OlJlc3VsdCB7CitpbXBsIGNvcmU6OmZtdDo6RGVidWcgZm9yIEFueVVuaXF1ZUFsaWFzZXMgeworICBmbiBmbXQoJnNlbGYsIGY6ICZtdXQgY29yZTo6Zm10OjpGb3JtYXR0ZXIpIC0+IGNvcmU6OmZtdDo6UmVzdWx0IHsKICAgICBpZiBsZXQgU29tZShuYW1lKSA9IHNlbGYudmFyaWFudF9uYW1lKCkgewogICAgICAgZi53cml0ZV9zdHIobmFtZSkKICAgICB9IGVsc2UgewpAQCAtMTQ2LDcgKzE1MSw3IEBACiAgIC8vLyBJZiB0aGUgdW5pb24gdmFyaWFudCBtYXRjaGVzLCByZXR1cm4gdGhlIG93bmVkIE1vbnN0ZXJULCBzZXR0aW5nIHRoZSB1bmlvbiB0byBOT05FLgogICBwdWIgZm4gdGFrZV9tKCZtdXQgc2VsZikgLT4gT3B0aW9uPEJveDxNb25zdGVyVD4+IHsKICAgICBpZiBsZXQgU2VsZjo6TShfKSA9IHNlbGYgewotICAgICAgbGV0IHYgPSBzdGQ6Om1lbTo6cmVwbGFjZShzZWxmLCBTZWxmOjpOT05FKTsKKyAgICAgIGxldCB2ID0gY29yZTo6bWVtOjpyZXBsYWNlKHNlbGYsIFNlbGY6Ok5PTkUpOwogICAgICAgaWYgbGV0IFNlbGY6Ok0odykgPSB2IHsKICAgICAgICAgU29tZSh3KQogICAgICAgfSBlbHNlIHsKQEAgLTE2Nyw3ICsxNzIsNyBAQAogICAvLy8gSWYgdGhlIHVuaW9uIHZhcmlhbnQgbWF0Y2hlcywgcmV0dXJuIHRoZSBvd25lZCBUZXN0U2ltcGxlVGFibGVXaXRoRW51bVQsIHNldHRpbmcgdGhlIHVuaW9uIHRvIE5PTkUuCiAgIHB1YiBmbiB0YWtlX3RzKCZtdXQgc2VsZikgLT4gT3B0aW9uPEJveDxUZXN0U2ltcGxlVGFibGVXaXRoRW51bVQ+PiB7CiAgICAgaWYgbGV0IFNlbGY6OlRTKF8pID0gc2VsZiB7Ci0gICAgICBsZXQgdiA9IHN0ZDo6bWVtOjpyZXBsYWNlKHNlbGYsIFNlbGY6Ok5PTkUpOworICAgICAgbGV0IHYgPSBjb3JlOjptZW06OnJlcGxhY2Uoc2VsZiwgU2VsZjo6Tk9ORSk7CiAgICAgICBpZiBsZXQgU2VsZjo6VFModykgPSB2IHsKICAgICAgICAgU29tZSh3KQogICAgICAgfSBlbHNlIHsKQEAgLTE4OCw3ICsxOTMsNyBAQAogICAvLy8gSWYgdGhlIHVuaW9uIHZhcmlhbnQgbWF0Y2hlcywgcmV0dXJuIHRoZSBvd25lZCBzdXBlcjo6ZXhhbXBsZV8yOjpNb25zdGVyVCwgc2V0dGluZyB0aGUgdW5pb24gdG8gTk9ORS4KICAgcHViIGZuIHRha2VfbTIoJm11dCBzZWxmKSAtPiBPcHRpb248Qm94PHN1cGVyOjpleGFtcGxlXzI6Ok1vbnN0ZXJUPj4gewogICAgIGlmIGxldCBTZWxmOjpNMihfKSA9IHNlbGYgewotICAgICAgbGV0IHYgPSBzdGQ6Om1lbTo6cmVwbGFjZShzZWxmLCBTZWxmOjpOT05FKTsKKyAgICAgIGxldCB2ID0gY29yZTo6bWVtOjpyZXBsYWNlKHNlbGYsIFNlbGY6Ok5PTkUpOwogICAgICAgaWYgbGV0IFNlbGY6Ok0yKHcpID0gdiB7CiAgICAgICAgIFNvbWUodykKICAgICAgIH0gZWxzZSB7CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9tb25zdGVyX3Rlc3Rfc2VyaWFsaXplL215X2dhbWUvZXhhbXBsZS9jb2xvcl9nZW5lcmF0ZWQucnMgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9tb25zdGVyX3Rlc3Rfc2VyaWFsaXplL215X2dhbWUvZXhhbXBsZS9jb2xvcl9nZW5lcmF0ZWQucnMKaW5kZXggZTI3Zjc5Yy4uZTAwMWQ0MyAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvbW9uc3Rlcl90ZXN0X3NlcmlhbGl6ZS9teV9nYW1lL2V4YW1wbGUvY29sb3JfZ2VuZXJhdGVkLnJzCisrKyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL21vbnN0ZXJfdGVzdF9zZXJpYWxpemUvbXlfZ2FtZS9leGFtcGxlL2NvbG9yX2dlbmVyYXRlZC5ycwpAQCAtMSw3ICsxLDEyIEBACiAvLyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBieSB0aGUgRmxhdEJ1ZmZlcnMgY29tcGlsZXIsIGRvIG5vdCBtb2RpZnkKKy8vIEBnZW5lcmF0ZWQKK2V4dGVybiBjcmF0ZSBhbGxvYzsKIGV4dGVybiBjcmF0ZSBmbGF0YnVmZmVyczsKLXVzZSBzdGQ6Om1lbTsKLXVzZSBzdGQ6OmNtcDo6T3JkZXJpbmc7Cit1c2UgYWxsb2M6OmJveGVkOjpCb3g7Cit1c2UgYWxsb2M6OnN0cmluZzo6e1N0cmluZywgVG9TdHJpbmd9OwordXNlIGFsbG9jOjp2ZWM6OlZlYzsKK3VzZSBjb3JlOjptZW07Cit1c2UgY29yZTo6Y21wOjpPcmRlcmluZzsKIGV4dGVybiBjcmF0ZSBzZXJkZTsKIHVzZSBzZWxmOjpzZXJkZTo6c2VyOjp7U2VyaWFsaXplLCBTZXJpYWxpemVyLCBTZXJpYWxpemVTdHJ1Y3R9OwogdXNlIHNlbGY6OmZsYXRidWZmZXJzOjp7RW5kaWFuU2NhbGFyLCBGb2xsb3d9OwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvbW9uc3Rlcl90ZXN0X3NlcmlhbGl6ZS9teV9nYW1lL2V4YW1wbGUvbG9uZ19lbnVtX2dlbmVyYXRlZC5ycyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL21vbnN0ZXJfdGVzdF9zZXJpYWxpemUvbXlfZ2FtZS9leGFtcGxlL2xvbmdfZW51bV9nZW5lcmF0ZWQucnMKaW5kZXggZjUxM2QyOS4uYjI5Yjk3ZiAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvbW9uc3Rlcl90ZXN0X3NlcmlhbGl6ZS9teV9nYW1lL2V4YW1wbGUvbG9uZ19lbnVtX2dlbmVyYXRlZC5ycworKysgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9tb25zdGVyX3Rlc3Rfc2VyaWFsaXplL215X2dhbWUvZXhhbXBsZS9sb25nX2VudW1fZ2VuZXJhdGVkLnJzCkBAIC0xLDcgKzEsMTIgQEAKIC8vIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGJ5IHRoZSBGbGF0QnVmZmVycyBjb21waWxlciwgZG8gbm90IG1vZGlmeQorLy8gQGdlbmVyYXRlZAorZXh0ZXJuIGNyYXRlIGFsbG9jOwogZXh0ZXJuIGNyYXRlIGZsYXRidWZmZXJzOwotdXNlIHN0ZDo6bWVtOwotdXNlIHN0ZDo6Y21wOjpPcmRlcmluZzsKK3VzZSBhbGxvYzo6Ym94ZWQ6OkJveDsKK3VzZSBhbGxvYzo6c3RyaW5nOjp7U3RyaW5nLCBUb1N0cmluZ307Cit1c2UgYWxsb2M6OnZlYzo6VmVjOwordXNlIGNvcmU6Om1lbTsKK3VzZSBjb3JlOjpjbXA6Ok9yZGVyaW5nOwogZXh0ZXJuIGNyYXRlIHNlcmRlOwogdXNlIHNlbGY6OnNlcmRlOjpzZXI6OntTZXJpYWxpemUsIFNlcmlhbGl6ZXIsIFNlcmlhbGl6ZVN0cnVjdH07CiB1c2Ugc2VsZjo6ZmxhdGJ1ZmZlcnM6OntFbmRpYW5TY2FsYXIsIEZvbGxvd307CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9tb25zdGVyX3Rlc3Rfc2VyaWFsaXplL215X2dhbWUvZXhhbXBsZS9tb25zdGVyX2dlbmVyYXRlZC5ycyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL21vbnN0ZXJfdGVzdF9zZXJpYWxpemUvbXlfZ2FtZS9leGFtcGxlL21vbnN0ZXJfZ2VuZXJhdGVkLnJzCmluZGV4IGNkNTczMGYuLjdhYTNlYzcgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL21vbnN0ZXJfdGVzdF9zZXJpYWxpemUvbXlfZ2FtZS9leGFtcGxlL21vbnN0ZXJfZ2VuZXJhdGVkLnJzCisrKyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL21vbnN0ZXJfdGVzdF9zZXJpYWxpemUvbXlfZ2FtZS9leGFtcGxlL21vbnN0ZXJfZ2VuZXJhdGVkLnJzCkBAIC0xLDcgKzEsMTIgQEAKIC8vIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGJ5IHRoZSBGbGF0QnVmZmVycyBjb21waWxlciwgZG8gbm90IG1vZGlmeQorLy8gQGdlbmVyYXRlZAorZXh0ZXJuIGNyYXRlIGFsbG9jOwogZXh0ZXJuIGNyYXRlIGZsYXRidWZmZXJzOwotdXNlIHN0ZDo6bWVtOwotdXNlIHN0ZDo6Y21wOjpPcmRlcmluZzsKK3VzZSBhbGxvYzo6Ym94ZWQ6OkJveDsKK3VzZSBhbGxvYzo6c3RyaW5nOjp7U3RyaW5nLCBUb1N0cmluZ307Cit1c2UgYWxsb2M6OnZlYzo6VmVjOwordXNlIGNvcmU6Om1lbTsKK3VzZSBjb3JlOjpjbXA6Ok9yZGVyaW5nOwogZXh0ZXJuIGNyYXRlIHNlcmRlOwogdXNlIHNlbGY6OnNlcmRlOjpzZXI6OntTZXJpYWxpemUsIFNlcmlhbGl6ZXIsIFNlcmlhbGl6ZVN0cnVjdH07CiB1c2Ugc2VsZjo6ZmxhdGJ1ZmZlcnM6OntFbmRpYW5TY2FsYXIsIEZvbGxvd307CkBAIC0zODEsNyArMzg2LDcgQEAKICAgfQogCiAgICNbaW5saW5lXQotICBwdWIgZm4ga2V5X2NvbXBhcmVfd2l0aF92YWx1ZSgmc2VsZiwgdmFsOiAmIHN0cikgLT4gOjpzdGQ6OmNtcDo6T3JkZXJpbmcgeworICBwdWIgZm4ga2V5X2NvbXBhcmVfd2l0aF92YWx1ZSgmc2VsZiwgdmFsOiAmIHN0cikgLT4gOjpjb3JlOjpjbXA6Ok9yZGVyaW5nIHsKICAgICBsZXQga2V5ID0gc2VsZi5uYW1lKCk7CiAgICAga2V5LmNtcCh2YWwpCiAgIH0KQEAgLTEzMzUsOCArMTM0MCw4IEBACiAgIH0KIH0KIAotaW1wbCBzdGQ6OmZtdDo6RGVidWcgZm9yIE1vbnN0ZXI8J18+IHsKLSAgZm4gZm10KCZzZWxmLCBmOiAmbXV0IHN0ZDo6Zm10OjpGb3JtYXR0ZXI8J18+KSAtPiBzdGQ6OmZtdDo6UmVzdWx0IHsKK2ltcGwgY29yZTo6Zm10OjpEZWJ1ZyBmb3IgTW9uc3RlcjwnXz4geworICBmbiBmbXQoJnNlbGYsIGY6ICZtdXQgY29yZTo6Zm10OjpGb3JtYXR0ZXI8J18+KSAtPiBjb3JlOjpmbXQ6OlJlc3VsdCB7CiAgICAgbGV0IG11dCBkcyA9IGYuZGVidWdfc3RydWN0KCJNb25zdGVyIik7CiAgICAgICBkcy5maWVsZCgicG9zIiwgJnNlbGYucG9zKCkpOwogICAgICAgZHMuZmllbGQoIm1hbmEiLCAmc2VsZi5tYW5hKCkpOwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvbW9uc3Rlcl90ZXN0X3NlcmlhbGl6ZS9teV9nYW1lL2V4YW1wbGUvcmFjZV9nZW5lcmF0ZWQucnMgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9tb25zdGVyX3Rlc3Rfc2VyaWFsaXplL215X2dhbWUvZXhhbXBsZS9yYWNlX2dlbmVyYXRlZC5ycwppbmRleCA2Mzc1NGZmLi5hMWE2NzQ5IDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9tb25zdGVyX3Rlc3Rfc2VyaWFsaXplL215X2dhbWUvZXhhbXBsZS9yYWNlX2dlbmVyYXRlZC5ycworKysgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9tb25zdGVyX3Rlc3Rfc2VyaWFsaXplL215X2dhbWUvZXhhbXBsZS9yYWNlX2dlbmVyYXRlZC5ycwpAQCAtMSw3ICsxLDEyIEBACiAvLyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBieSB0aGUgRmxhdEJ1ZmZlcnMgY29tcGlsZXIsIGRvIG5vdCBtb2RpZnkKKy8vIEBnZW5lcmF0ZWQKK2V4dGVybiBjcmF0ZSBhbGxvYzsKIGV4dGVybiBjcmF0ZSBmbGF0YnVmZmVyczsKLXVzZSBzdGQ6Om1lbTsKLXVzZSBzdGQ6OmNtcDo6T3JkZXJpbmc7Cit1c2UgYWxsb2M6OmJveGVkOjpCb3g7Cit1c2UgYWxsb2M6OnN0cmluZzo6e1N0cmluZywgVG9TdHJpbmd9OwordXNlIGFsbG9jOjp2ZWM6OlZlYzsKK3VzZSBjb3JlOjptZW07Cit1c2UgY29yZTo6Y21wOjpPcmRlcmluZzsKIGV4dGVybiBjcmF0ZSBzZXJkZTsKIHVzZSBzZWxmOjpzZXJkZTo6c2VyOjp7U2VyaWFsaXplLCBTZXJpYWxpemVyLCBTZXJpYWxpemVTdHJ1Y3R9OwogdXNlIHNlbGY6OmZsYXRidWZmZXJzOjp7RW5kaWFuU2NhbGFyLCBGb2xsb3d9OwpAQCAtNDgsOCArNTMsOCBAQAogICAgIH0KICAgfQogfQotaW1wbCBzdGQ6OmZtdDo6RGVidWcgZm9yIFJhY2UgewotICBmbiBmbXQoJnNlbGYsIGY6ICZtdXQgc3RkOjpmbXQ6OkZvcm1hdHRlcikgLT4gc3RkOjpmbXQ6OlJlc3VsdCB7CitpbXBsIGNvcmU6OmZtdDo6RGVidWcgZm9yIFJhY2UgeworICBmbiBmbXQoJnNlbGYsIGY6ICZtdXQgY29yZTo6Zm10OjpGb3JtYXR0ZXIpIC0+IGNvcmU6OmZtdDo6UmVzdWx0IHsKICAgICBpZiBsZXQgU29tZShuYW1lKSA9IHNlbGYudmFyaWFudF9uYW1lKCkgewogICAgICAgZi53cml0ZV9zdHIobmFtZSkKICAgICB9IGVsc2UgewpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvbW9uc3Rlcl90ZXN0X3NlcmlhbGl6ZS9teV9nYW1lL2V4YW1wbGUvcmVmZXJyYWJsZV9nZW5lcmF0ZWQucnMgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9tb25zdGVyX3Rlc3Rfc2VyaWFsaXplL215X2dhbWUvZXhhbXBsZS9yZWZlcnJhYmxlX2dlbmVyYXRlZC5ycwppbmRleCA0OTA5ODBkLi45OTkyMjkzIDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9tb25zdGVyX3Rlc3Rfc2VyaWFsaXplL215X2dhbWUvZXhhbXBsZS9yZWZlcnJhYmxlX2dlbmVyYXRlZC5ycworKysgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9tb25zdGVyX3Rlc3Rfc2VyaWFsaXplL215X2dhbWUvZXhhbXBsZS9yZWZlcnJhYmxlX2dlbmVyYXRlZC5ycwpAQCAtMSw3ICsxLDEyIEBACiAvLyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBieSB0aGUgRmxhdEJ1ZmZlcnMgY29tcGlsZXIsIGRvIG5vdCBtb2RpZnkKKy8vIEBnZW5lcmF0ZWQKK2V4dGVybiBjcmF0ZSBhbGxvYzsKIGV4dGVybiBjcmF0ZSBmbGF0YnVmZmVyczsKLXVzZSBzdGQ6Om1lbTsKLXVzZSBzdGQ6OmNtcDo6T3JkZXJpbmc7Cit1c2UgYWxsb2M6OmJveGVkOjpCb3g7Cit1c2UgYWxsb2M6OnN0cmluZzo6e1N0cmluZywgVG9TdHJpbmd9OwordXNlIGFsbG9jOjp2ZWM6OlZlYzsKK3VzZSBjb3JlOjptZW07Cit1c2UgY29yZTo6Y21wOjpPcmRlcmluZzsKIGV4dGVybiBjcmF0ZSBzZXJkZTsKIHVzZSBzZWxmOjpzZXJkZTo6c2VyOjp7U2VyaWFsaXplLCBTZXJpYWxpemVyLCBTZXJpYWxpemVTdHJ1Y3R9OwogdXNlIHNlbGY6OmZsYXRidWZmZXJzOjp7RW5kaWFuU2NhbGFyLCBGb2xsb3d9OwpAQCAtNTksNyArNjQsNyBAQAogICB9CiAKICAgI1tpbmxpbmVdCi0gIHB1YiBmbiBrZXlfY29tcGFyZV93aXRoX3ZhbHVlKCZzZWxmLCB2YWw6IHU2NCkgLT4gOjpzdGQ6OmNtcDo6T3JkZXJpbmcgeworICBwdWIgZm4ga2V5X2NvbXBhcmVfd2l0aF92YWx1ZSgmc2VsZiwgdmFsOiB1NjQpIC0+IDo6Y29yZTo6Y21wOjpPcmRlcmluZyB7CiAgICAgbGV0IGtleSA9IHNlbGYuaWQoKTsKICAgICBrZXkuY21wKCZ2YWwpCiAgIH0KQEAgLTEyNCw4ICsxMjksOCBAQAogICB9CiB9CiAKLWltcGwgc3RkOjpmbXQ6OkRlYnVnIGZvciBSZWZlcnJhYmxlPCdfPiB7Ci0gIGZuIGZtdCgmc2VsZiwgZjogJm11dCBzdGQ6OmZtdDo6Rm9ybWF0dGVyPCdfPikgLT4gc3RkOjpmbXQ6OlJlc3VsdCB7CitpbXBsIGNvcmU6OmZtdDo6RGVidWcgZm9yIFJlZmVycmFibGU8J18+IHsKKyAgZm4gZm10KCZzZWxmLCBmOiAmbXV0IGNvcmU6OmZtdDo6Rm9ybWF0dGVyPCdfPikgLT4gY29yZTo6Zm10OjpSZXN1bHQgewogICAgIGxldCBtdXQgZHMgPSBmLmRlYnVnX3N0cnVjdCgiUmVmZXJyYWJsZSIpOwogICAgICAgZHMuZmllbGQoImlkIiwgJnNlbGYuaWQoKSk7CiAgICAgICBkcy5maW5pc2goKQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvbW9uc3Rlcl90ZXN0X3NlcmlhbGl6ZS9teV9nYW1lL2V4YW1wbGUvc3RhdF9nZW5lcmF0ZWQucnMgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9tb25zdGVyX3Rlc3Rfc2VyaWFsaXplL215X2dhbWUvZXhhbXBsZS9zdGF0X2dlbmVyYXRlZC5ycwppbmRleCBhYmZhMDVkLi5mYmQ3Y2U4IDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9tb25zdGVyX3Rlc3Rfc2VyaWFsaXplL215X2dhbWUvZXhhbXBsZS9zdGF0X2dlbmVyYXRlZC5ycworKysgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9tb25zdGVyX3Rlc3Rfc2VyaWFsaXplL215X2dhbWUvZXhhbXBsZS9zdGF0X2dlbmVyYXRlZC5ycwpAQCAtMSw3ICsxLDEyIEBACiAvLyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBieSB0aGUgRmxhdEJ1ZmZlcnMgY29tcGlsZXIsIGRvIG5vdCBtb2RpZnkKKy8vIEBnZW5lcmF0ZWQKK2V4dGVybiBjcmF0ZSBhbGxvYzsKIGV4dGVybiBjcmF0ZSBmbGF0YnVmZmVyczsKLXVzZSBzdGQ6Om1lbTsKLXVzZSBzdGQ6OmNtcDo6T3JkZXJpbmc7Cit1c2UgYWxsb2M6OmJveGVkOjpCb3g7Cit1c2UgYWxsb2M6OnN0cmluZzo6e1N0cmluZywgVG9TdHJpbmd9OwordXNlIGFsbG9jOjp2ZWM6OlZlYzsKK3VzZSBjb3JlOjptZW07Cit1c2UgY29yZTo6Y21wOjpPcmRlcmluZzsKIGV4dGVybiBjcmF0ZSBzZXJkZTsKIHVzZSBzZWxmOjpzZXJkZTo6c2VyOjp7U2VyaWFsaXplLCBTZXJpYWxpemVyLCBTZXJpYWxpemVTdHJ1Y3R9OwogdXNlIHNlbGY6OmZsYXRidWZmZXJzOjp7RW5kaWFuU2NhbGFyLCBGb2xsb3d9OwpAQCAtNzcsNyArODIsNyBAQAogICB9CiAKICAgI1tpbmxpbmVdCi0gIHB1YiBmbiBrZXlfY29tcGFyZV93aXRoX3ZhbHVlKCZzZWxmLCB2YWw6IHUxNikgLT4gOjpzdGQ6OmNtcDo6T3JkZXJpbmcgeworICBwdWIgZm4ga2V5X2NvbXBhcmVfd2l0aF92YWx1ZSgmc2VsZiwgdmFsOiB1MTYpIC0+IDo6Y29yZTo6Y21wOjpPcmRlcmluZyB7CiAgICAgbGV0IGtleSA9IHNlbGYuY291bnQoKTsKICAgICBrZXkuY21wKCZ2YWwpCiAgIH0KQEAgLTE2Miw4ICsxNjcsOCBAQAogICB9CiB9CiAKLWltcGwgc3RkOjpmbXQ6OkRlYnVnIGZvciBTdGF0PCdfPiB7Ci0gIGZuIGZtdCgmc2VsZiwgZjogJm11dCBzdGQ6OmZtdDo6Rm9ybWF0dGVyPCdfPikgLT4gc3RkOjpmbXQ6OlJlc3VsdCB7CitpbXBsIGNvcmU6OmZtdDo6RGVidWcgZm9yIFN0YXQ8J18+IHsKKyAgZm4gZm10KCZzZWxmLCBmOiAmbXV0IGNvcmU6OmZtdDo6Rm9ybWF0dGVyPCdfPikgLT4gY29yZTo6Zm10OjpSZXN1bHQgewogICAgIGxldCBtdXQgZHMgPSBmLmRlYnVnX3N0cnVjdCgiU3RhdCIpOwogICAgICAgZHMuZmllbGQoImlkIiwgJnNlbGYuaWQoKSk7CiAgICAgICBkcy5maWVsZCgidmFsIiwgJnNlbGYudmFsKCkpOwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvbW9uc3Rlcl90ZXN0X3NlcmlhbGl6ZS9teV9nYW1lL2V4YW1wbGUvc3RydWN0X29mX3N0cnVjdHNfZ2VuZXJhdGVkLnJzIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvbW9uc3Rlcl90ZXN0X3NlcmlhbGl6ZS9teV9nYW1lL2V4YW1wbGUvc3RydWN0X29mX3N0cnVjdHNfZ2VuZXJhdGVkLnJzCmluZGV4IDc1Yjg4NjUuLjAwNDY0NDcgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL21vbnN0ZXJfdGVzdF9zZXJpYWxpemUvbXlfZ2FtZS9leGFtcGxlL3N0cnVjdF9vZl9zdHJ1Y3RzX2dlbmVyYXRlZC5ycworKysgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9tb25zdGVyX3Rlc3Rfc2VyaWFsaXplL215X2dhbWUvZXhhbXBsZS9zdHJ1Y3Rfb2Zfc3RydWN0c19nZW5lcmF0ZWQucnMKQEAgLTEsNyArMSwxMiBAQAogLy8gYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgYnkgdGhlIEZsYXRCdWZmZXJzIGNvbXBpbGVyLCBkbyBub3QgbW9kaWZ5CisvLyBAZ2VuZXJhdGVkCitleHRlcm4gY3JhdGUgYWxsb2M7CiBleHRlcm4gY3JhdGUgZmxhdGJ1ZmZlcnM7Ci11c2Ugc3RkOjptZW07Ci11c2Ugc3RkOjpjbXA6Ok9yZGVyaW5nOwordXNlIGFsbG9jOjpib3hlZDo6Qm94OwordXNlIGFsbG9jOjpzdHJpbmc6OntTdHJpbmcsIFRvU3RyaW5nfTsKK3VzZSBhbGxvYzo6dmVjOjpWZWM7Cit1c2UgY29yZTo6bWVtOwordXNlIGNvcmU6OmNtcDo6T3JkZXJpbmc7CiBleHRlcm4gY3JhdGUgc2VyZGU7CiB1c2Ugc2VsZjo6c2VyZGU6OnNlcjo6e1NlcmlhbGl6ZSwgU2VyaWFsaXplciwgU2VyaWFsaXplU3RydWN0fTsKIHVzZSBzZWxmOjpmbGF0YnVmZmVyczo6e0VuZGlhblNjYWxhciwgRm9sbG93fTsKQEAgLTE1LDggKzIwLDggQEAKICAgICBTZWxmKFswOyAyMF0pCiAgIH0KIH0KLWltcGwgc3RkOjpmbXQ6OkRlYnVnIGZvciBTdHJ1Y3RPZlN0cnVjdHMgewotICBmbiBmbXQoJnNlbGYsIGY6ICZtdXQgc3RkOjpmbXQ6OkZvcm1hdHRlcikgLT4gc3RkOjpmbXQ6OlJlc3VsdCB7CitpbXBsIGNvcmU6OmZtdDo6RGVidWcgZm9yIFN0cnVjdE9mU3RydWN0cyB7CisgIGZuIGZtdCgmc2VsZiwgZjogJm11dCBjb3JlOjpmbXQ6OkZvcm1hdHRlcikgLT4gY29yZTo6Zm10OjpSZXN1bHQgewogICAgIGYuZGVidWdfc3RydWN0KCJTdHJ1Y3RPZlN0cnVjdHMiKQogICAgICAgLmZpZWxkKCJhIiwgJnNlbGYuYSgpKQogICAgICAgLmZpZWxkKCJiIiwgJnNlbGYuYigpKQpAQCAtNDYsNyArNTEsNyBAQAogICAgICNbaW5saW5lXQogICAgIGZuIHB1c2goJnNlbGYsIGRzdDogJm11dCBbdThdLCBfcmVzdDogJlt1OF0pIHsKICAgICAgICAgbGV0IHNyYyA9IHVuc2FmZSB7Ci0gICAgICAgICAgICA6OnN0ZDo6c2xpY2U6OmZyb21fcmF3X3BhcnRzKHNlbGYgYXMgKmNvbnN0IFN0cnVjdE9mU3RydWN0cyBhcyAqY29uc3QgdTgsIFNlbGY6OnNpemUoKSkKKyAgICAgICAgICAgIDo6Y29yZTo6c2xpY2U6OmZyb21fcmF3X3BhcnRzKHNlbGYgYXMgKmNvbnN0IFN0cnVjdE9mU3RydWN0cyBhcyAqY29uc3QgdTgsIFNlbGY6OnNpemUoKSkKICAgICAgICAgfTsKICAgICAgICAgZHN0LmNvcHlfZnJvbV9zbGljZShzcmMpOwogICAgIH0KQEAgLTU3LDcgKzYyLDcgQEAKICAgICAjW2lubGluZV0KICAgICBmbiBwdXNoKCZzZWxmLCBkc3Q6ICZtdXQgW3U4XSwgX3Jlc3Q6ICZbdThdKSB7CiAgICAgICAgIGxldCBzcmMgPSB1bnNhZmUgewotICAgICAgICAgICAgOjpzdGQ6OnNsaWNlOjpmcm9tX3Jhd19wYXJ0cygqc2VsZiBhcyAqY29uc3QgU3RydWN0T2ZTdHJ1Y3RzIGFzICpjb25zdCB1OCwgU2VsZjo6c2l6ZSgpKQorICAgICAgICAgICAgOjpjb3JlOjpzbGljZTo6ZnJvbV9yYXdfcGFydHMoKnNlbGYgYXMgKmNvbnN0IFN0cnVjdE9mU3RydWN0cyBhcyAqY29uc3QgdTgsIFNlbGY6OnNpemUoKSkKICAgICAgICAgfTsKICAgICAgICAgZHN0LmNvcHlfZnJvbV9zbGljZShzcmMpOwogICAgIH0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL21vbnN0ZXJfdGVzdF9zZXJpYWxpemUvbXlfZ2FtZS9leGFtcGxlL3N0cnVjdF9vZl9zdHJ1Y3RzX29mX3N0cnVjdHNfZ2VuZXJhdGVkLnJzIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvbW9uc3Rlcl90ZXN0X3NlcmlhbGl6ZS9teV9nYW1lL2V4YW1wbGUvc3RydWN0X29mX3N0cnVjdHNfb2Zfc3RydWN0c19nZW5lcmF0ZWQucnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjM0ZWI5MQotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL21vbnN0ZXJfdGVzdF9zZXJpYWxpemUvbXlfZ2FtZS9leGFtcGxlL3N0cnVjdF9vZl9zdHJ1Y3RzX29mX3N0cnVjdHNfZ2VuZXJhdGVkLnJzCkBAIC0wLDAgKzEsMTMxIEBACisvLyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBieSB0aGUgRmxhdEJ1ZmZlcnMgY29tcGlsZXIsIGRvIG5vdCBtb2RpZnkKKy8vIEBnZW5lcmF0ZWQKK2V4dGVybiBjcmF0ZSBhbGxvYzsKK2V4dGVybiBjcmF0ZSBmbGF0YnVmZmVyczsKK3VzZSBhbGxvYzo6Ym94ZWQ6OkJveDsKK3VzZSBhbGxvYzo6c3RyaW5nOjp7U3RyaW5nLCBUb1N0cmluZ307Cit1c2UgYWxsb2M6OnZlYzo6VmVjOwordXNlIGNvcmU6Om1lbTsKK3VzZSBjb3JlOjpjbXA6Ok9yZGVyaW5nOworZXh0ZXJuIGNyYXRlIHNlcmRlOwordXNlIHNlbGY6OnNlcmRlOjpzZXI6OntTZXJpYWxpemUsIFNlcmlhbGl6ZXIsIFNlcmlhbGl6ZVN0cnVjdH07Cit1c2Ugc2VsZjo6ZmxhdGJ1ZmZlcnM6OntFbmRpYW5TY2FsYXIsIEZvbGxvd307Cit1c2Ugc3VwZXI6Oio7CisvLyBzdHJ1Y3QgU3RydWN0T2ZTdHJ1Y3RzT2ZTdHJ1Y3RzLCBhbGlnbmVkIHRvIDQKKyNbcmVwcih0cmFuc3BhcmVudCldCisjW2Rlcml2ZShDbG9uZSwgQ29weSwgUGFydGlhbEVxKV0KK3B1YiBzdHJ1Y3QgU3RydWN0T2ZTdHJ1Y3RzT2ZTdHJ1Y3RzKHB1YiBbdTg7IDIwXSk7CitpbXBsIERlZmF1bHQgZm9yIFN0cnVjdE9mU3RydWN0c09mU3RydWN0cyB7IAorICBmbiBkZWZhdWx0KCkgLT4gU2VsZiB7IAorICAgIFNlbGYoWzA7IDIwXSkKKyAgfQorfQoraW1wbCBjb3JlOjpmbXQ6OkRlYnVnIGZvciBTdHJ1Y3RPZlN0cnVjdHNPZlN0cnVjdHMgeworICBmbiBmbXQoJnNlbGYsIGY6ICZtdXQgY29yZTo6Zm10OjpGb3JtYXR0ZXIpIC0+IGNvcmU6OmZtdDo6UmVzdWx0IHsKKyAgICBmLmRlYnVnX3N0cnVjdCgiU3RydWN0T2ZTdHJ1Y3RzT2ZTdHJ1Y3RzIikKKyAgICAgIC5maWVsZCgiYSIsICZzZWxmLmEoKSkKKyAgICAgIC5maW5pc2goKQorICB9Cit9CisKK2ltcGwgZmxhdGJ1ZmZlcnM6OlNpbXBsZVRvVmVyaWZ5SW5TbGljZSBmb3IgU3RydWN0T2ZTdHJ1Y3RzT2ZTdHJ1Y3RzIHt9CitpbXBsIGZsYXRidWZmZXJzOjpTYWZlU2xpY2VBY2Nlc3MgZm9yIFN0cnVjdE9mU3RydWN0c09mU3RydWN0cyB7fQoraW1wbDwnYT4gZmxhdGJ1ZmZlcnM6OkZvbGxvdzwnYT4gZm9yIFN0cnVjdE9mU3RydWN0c09mU3RydWN0cyB7CisgIHR5cGUgSW5uZXIgPSAmJ2EgU3RydWN0T2ZTdHJ1Y3RzT2ZTdHJ1Y3RzOworICAjW2lubGluZV0KKyAgZm4gZm9sbG93KGJ1ZjogJidhIFt1OF0sIGxvYzogdXNpemUpIC0+IFNlbGY6OklubmVyIHsKKyAgICA8JidhIFN0cnVjdE9mU3RydWN0c09mU3RydWN0cz46OmZvbGxvdyhidWYsIGxvYykKKyAgfQorfQoraW1wbDwnYT4gZmxhdGJ1ZmZlcnM6OkZvbGxvdzwnYT4gZm9yICYnYSBTdHJ1Y3RPZlN0cnVjdHNPZlN0cnVjdHMgeworICB0eXBlIElubmVyID0gJidhIFN0cnVjdE9mU3RydWN0c09mU3RydWN0czsKKyAgI1tpbmxpbmVdCisgIGZuIGZvbGxvdyhidWY6ICYnYSBbdThdLCBsb2M6IHVzaXplKSAtPiBTZWxmOjpJbm5lciB7CisgICAgZmxhdGJ1ZmZlcnM6OmZvbGxvd19jYXN0X3JlZjo6PFN0cnVjdE9mU3RydWN0c09mU3RydWN0cz4oYnVmLCBsb2MpCisgIH0KK30KK2ltcGw8J2I+IGZsYXRidWZmZXJzOjpQdXNoIGZvciBTdHJ1Y3RPZlN0cnVjdHNPZlN0cnVjdHMgeworICAgIHR5cGUgT3V0cHV0ID0gU3RydWN0T2ZTdHJ1Y3RzT2ZTdHJ1Y3RzOworICAgICNbaW5saW5lXQorICAgIGZuIHB1c2goJnNlbGYsIGRzdDogJm11dCBbdThdLCBfcmVzdDogJlt1OF0pIHsKKyAgICAgICAgbGV0IHNyYyA9IHVuc2FmZSB7CisgICAgICAgICAgICA6OmNvcmU6OnNsaWNlOjpmcm9tX3Jhd19wYXJ0cyhzZWxmIGFzICpjb25zdCBTdHJ1Y3RPZlN0cnVjdHNPZlN0cnVjdHMgYXMgKmNvbnN0IHU4LCBTZWxmOjpzaXplKCkpCisgICAgICAgIH07CisgICAgICAgIGRzdC5jb3B5X2Zyb21fc2xpY2Uoc3JjKTsKKyAgICB9Cit9CitpbXBsPCdiPiBmbGF0YnVmZmVyczo6UHVzaCBmb3IgJidiIFN0cnVjdE9mU3RydWN0c09mU3RydWN0cyB7CisgICAgdHlwZSBPdXRwdXQgPSBTdHJ1Y3RPZlN0cnVjdHNPZlN0cnVjdHM7CisKKyAgICAjW2lubGluZV0KKyAgICBmbiBwdXNoKCZzZWxmLCBkc3Q6ICZtdXQgW3U4XSwgX3Jlc3Q6ICZbdThdKSB7CisgICAgICAgIGxldCBzcmMgPSB1bnNhZmUgeworICAgICAgICAgICAgOjpjb3JlOjpzbGljZTo6ZnJvbV9yYXdfcGFydHMoKnNlbGYgYXMgKmNvbnN0IFN0cnVjdE9mU3RydWN0c09mU3RydWN0cyBhcyAqY29uc3QgdTgsIFNlbGY6OnNpemUoKSkKKyAgICAgICAgfTsKKyAgICAgICAgZHN0LmNvcHlfZnJvbV9zbGljZShzcmMpOworICAgIH0KK30KKworaW1wbDwnYT4gZmxhdGJ1ZmZlcnM6OlZlcmlmaWFibGUgZm9yIFN0cnVjdE9mU3RydWN0c09mU3RydWN0cyB7CisgICNbaW5saW5lXQorICBmbiBydW5fdmVyaWZpZXIoCisgICAgdjogJm11dCBmbGF0YnVmZmVyczo6VmVyaWZpZXIsIHBvczogdXNpemUKKyAgKSAtPiBSZXN1bHQ8KCksIGZsYXRidWZmZXJzOjpJbnZhbGlkRmxhdGJ1ZmZlcj4geworICAgIHVzZSBzZWxmOjpmbGF0YnVmZmVyczo6VmVyaWZpYWJsZTsKKyAgICB2LmluX2J1ZmZlcjo6PFNlbGY+KHBvcykKKyAgfQorfQorCitpbXBsIFNlcmlhbGl6ZSBmb3IgU3RydWN0T2ZTdHJ1Y3RzT2ZTdHJ1Y3RzIHsKKyAgZm4gc2VyaWFsaXplPFM+KCZzZWxmLCBzZXJpYWxpemVyOiBTKSAtPiBSZXN1bHQ8Uzo6T2ssIFM6OkVycm9yPgorICB3aGVyZQorICAgIFM6IFNlcmlhbGl6ZXIsCisgIHsKKyAgICBsZXQgbXV0IHMgPSBzZXJpYWxpemVyLnNlcmlhbGl6ZV9zdHJ1Y3QoIlN0cnVjdE9mU3RydWN0c09mU3RydWN0cyIsIDEpPzsKKyAgICAgIHMuc2VyaWFsaXplX2ZpZWxkKCJhIiwgJnNlbGYuYSgpKT87CisgICAgcy5lbmQoKQorICB9Cit9CisKK2ltcGw8J2E+IFN0cnVjdE9mU3RydWN0c09mU3RydWN0cyB7CisgICNbYWxsb3coY2xpcHB5Ojp0b29fbWFueV9hcmd1bWVudHMpXQorICBwdWIgZm4gbmV3KAorICAgIGE6ICZTdHJ1Y3RPZlN0cnVjdHMsCisgICkgLT4gU2VsZiB7CisgICAgbGV0IG11dCBzID0gU2VsZihbMDsgMjBdKTsKKyAgICBzLnNldF9hKGEpOworICAgIHMKKyAgfQorCisgIHB1YiBjb25zdCBmbiBnZXRfZnVsbHlfcXVhbGlmaWVkX25hbWUoKSAtPiAmJ3N0YXRpYyBzdHIgeworICAgICJNeUdhbWUuRXhhbXBsZS5TdHJ1Y3RPZlN0cnVjdHNPZlN0cnVjdHMiCisgIH0KKworICBwdWIgZm4gYSgmc2VsZikgLT4gJlN0cnVjdE9mU3RydWN0cyB7CisgICAgdW5zYWZlIHsgJiooc2VsZi4wWzAuLl0uYXNfcHRyKCkgYXMgKmNvbnN0IFN0cnVjdE9mU3RydWN0cykgfQorICB9CisKKyAgI1thbGxvdyhjbGlwcHk6OmlkZW50aXR5X29wKV0KKyAgcHViIGZuIHNldF9hKCZtdXQgc2VsZiwgeDogJlN0cnVjdE9mU3RydWN0cykgeworICAgIHNlbGYuMFswLi4wICsgMjBdLmNvcHlfZnJvbV9zbGljZSgmeC4wKQorICB9CisKKyAgcHViIGZuIHVucGFjaygmc2VsZikgLT4gU3RydWN0T2ZTdHJ1Y3RzT2ZTdHJ1Y3RzVCB7CisgICAgU3RydWN0T2ZTdHJ1Y3RzT2ZTdHJ1Y3RzVCB7CisgICAgICBhOiBzZWxmLmEoKS51bnBhY2soKSwKKyAgICB9CisgIH0KK30KKworI1tkZXJpdmUoRGVidWcsIENsb25lLCBQYXJ0aWFsRXEsIERlZmF1bHQpXQorcHViIHN0cnVjdCBTdHJ1Y3RPZlN0cnVjdHNPZlN0cnVjdHNUIHsKKyAgcHViIGE6IFN0cnVjdE9mU3RydWN0c1QsCit9CitpbXBsIFN0cnVjdE9mU3RydWN0c09mU3RydWN0c1QgeworICBwdWIgZm4gcGFjaygmc2VsZikgLT4gU3RydWN0T2ZTdHJ1Y3RzT2ZTdHJ1Y3RzIHsKKyAgICBTdHJ1Y3RPZlN0cnVjdHNPZlN0cnVjdHM6Om5ldygKKyAgICAgICZzZWxmLmEucGFjaygpLAorICAgICkKKyAgfQorfQorCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9tb25zdGVyX3Rlc3Rfc2VyaWFsaXplL215X2dhbWUvZXhhbXBsZS90ZXN0X2dlbmVyYXRlZC5ycyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL21vbnN0ZXJfdGVzdF9zZXJpYWxpemUvbXlfZ2FtZS9leGFtcGxlL3Rlc3RfZ2VuZXJhdGVkLnJzCmluZGV4IDU2NDkzYmEuLjQ3MmJmZjkgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL21vbnN0ZXJfdGVzdF9zZXJpYWxpemUvbXlfZ2FtZS9leGFtcGxlL3Rlc3RfZ2VuZXJhdGVkLnJzCisrKyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL21vbnN0ZXJfdGVzdF9zZXJpYWxpemUvbXlfZ2FtZS9leGFtcGxlL3Rlc3RfZ2VuZXJhdGVkLnJzCkBAIC0xLDcgKzEsMTIgQEAKIC8vIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGJ5IHRoZSBGbGF0QnVmZmVycyBjb21waWxlciwgZG8gbm90IG1vZGlmeQorLy8gQGdlbmVyYXRlZAorZXh0ZXJuIGNyYXRlIGFsbG9jOwogZXh0ZXJuIGNyYXRlIGZsYXRidWZmZXJzOwotdXNlIHN0ZDo6bWVtOwotdXNlIHN0ZDo6Y21wOjpPcmRlcmluZzsKK3VzZSBhbGxvYzo6Ym94ZWQ6OkJveDsKK3VzZSBhbGxvYzo6c3RyaW5nOjp7U3RyaW5nLCBUb1N0cmluZ307Cit1c2UgYWxsb2M6OnZlYzo6VmVjOwordXNlIGNvcmU6Om1lbTsKK3VzZSBjb3JlOjpjbXA6Ok9yZGVyaW5nOwogZXh0ZXJuIGNyYXRlIHNlcmRlOwogdXNlIHNlbGY6OnNlcmRlOjpzZXI6OntTZXJpYWxpemUsIFNlcmlhbGl6ZXIsIFNlcmlhbGl6ZVN0cnVjdH07CiB1c2Ugc2VsZjo6ZmxhdGJ1ZmZlcnM6OntFbmRpYW5TY2FsYXIsIEZvbGxvd307CkBAIC0xNSw4ICsyMCw4IEBACiAgICAgU2VsZihbMDsgNF0pCiAgIH0KIH0KLWltcGwgc3RkOjpmbXQ6OkRlYnVnIGZvciBUZXN0IHsKLSAgZm4gZm10KCZzZWxmLCBmOiAmbXV0IHN0ZDo6Zm10OjpGb3JtYXR0ZXIpIC0+IHN0ZDo6Zm10OjpSZXN1bHQgeworaW1wbCBjb3JlOjpmbXQ6OkRlYnVnIGZvciBUZXN0IHsKKyAgZm4gZm10KCZzZWxmLCBmOiAmbXV0IGNvcmU6OmZtdDo6Rm9ybWF0dGVyKSAtPiBjb3JlOjpmbXQ6OlJlc3VsdCB7CiAgICAgZi5kZWJ1Z19zdHJ1Y3QoIlRlc3QiKQogICAgICAgLmZpZWxkKCJhIiwgJnNlbGYuYSgpKQogICAgICAgLmZpZWxkKCJiIiwgJnNlbGYuYigpKQpAQCAtNDUsNyArNTAsNyBAQAogICAgICNbaW5saW5lXQogICAgIGZuIHB1c2goJnNlbGYsIGRzdDogJm11dCBbdThdLCBfcmVzdDogJlt1OF0pIHsKICAgICAgICAgbGV0IHNyYyA9IHVuc2FmZSB7Ci0gICAgICAgICAgICA6OnN0ZDo6c2xpY2U6OmZyb21fcmF3X3BhcnRzKHNlbGYgYXMgKmNvbnN0IFRlc3QgYXMgKmNvbnN0IHU4LCBTZWxmOjpzaXplKCkpCisgICAgICAgICAgICA6OmNvcmU6OnNsaWNlOjpmcm9tX3Jhd19wYXJ0cyhzZWxmIGFzICpjb25zdCBUZXN0IGFzICpjb25zdCB1OCwgU2VsZjo6c2l6ZSgpKQogICAgICAgICB9OwogICAgICAgICBkc3QuY29weV9mcm9tX3NsaWNlKHNyYyk7CiAgICAgfQpAQCAtNTYsNyArNjEsNyBAQAogICAgICNbaW5saW5lXQogICAgIGZuIHB1c2goJnNlbGYsIGRzdDogJm11dCBbdThdLCBfcmVzdDogJlt1OF0pIHsKICAgICAgICAgbGV0IHNyYyA9IHVuc2FmZSB7Ci0gICAgICAgICAgICA6OnN0ZDo6c2xpY2U6OmZyb21fcmF3X3BhcnRzKCpzZWxmIGFzICpjb25zdCBUZXN0IGFzICpjb25zdCB1OCwgU2VsZjo6c2l6ZSgpKQorICAgICAgICAgICAgOjpjb3JlOjpzbGljZTo6ZnJvbV9yYXdfcGFydHMoKnNlbGYgYXMgKmNvbnN0IFRlc3QgYXMgKmNvbnN0IHU4LCBTZWxmOjpzaXplKCkpCiAgICAgICAgIH07CiAgICAgICAgIGRzdC5jb3B5X2Zyb21fc2xpY2Uoc3JjKTsKICAgICB9CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9tb25zdGVyX3Rlc3Rfc2VyaWFsaXplL215X2dhbWUvZXhhbXBsZS90ZXN0X3NpbXBsZV90YWJsZV93aXRoX2VudW1fZ2VuZXJhdGVkLnJzIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvbW9uc3Rlcl90ZXN0X3NlcmlhbGl6ZS9teV9nYW1lL2V4YW1wbGUvdGVzdF9zaW1wbGVfdGFibGVfd2l0aF9lbnVtX2dlbmVyYXRlZC5ycwppbmRleCBjZDY0MzExLi44YTdiNjI3IDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9tb25zdGVyX3Rlc3Rfc2VyaWFsaXplL215X2dhbWUvZXhhbXBsZS90ZXN0X3NpbXBsZV90YWJsZV93aXRoX2VudW1fZ2VuZXJhdGVkLnJzCisrKyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL21vbnN0ZXJfdGVzdF9zZXJpYWxpemUvbXlfZ2FtZS9leGFtcGxlL3Rlc3Rfc2ltcGxlX3RhYmxlX3dpdGhfZW51bV9nZW5lcmF0ZWQucnMKQEAgLTEsNyArMSwxMiBAQAogLy8gYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgYnkgdGhlIEZsYXRCdWZmZXJzIGNvbXBpbGVyLCBkbyBub3QgbW9kaWZ5CisvLyBAZ2VuZXJhdGVkCitleHRlcm4gY3JhdGUgYWxsb2M7CiBleHRlcm4gY3JhdGUgZmxhdGJ1ZmZlcnM7Ci11c2Ugc3RkOjptZW07Ci11c2Ugc3RkOjpjbXA6Ok9yZGVyaW5nOwordXNlIGFsbG9jOjpib3hlZDo6Qm94OwordXNlIGFsbG9jOjpzdHJpbmc6OntTdHJpbmcsIFRvU3RyaW5nfTsKK3VzZSBhbGxvYzo6dmVjOjpWZWM7Cit1c2UgY29yZTo6bWVtOwordXNlIGNvcmU6OmNtcDo6T3JkZXJpbmc7CiBleHRlcm4gY3JhdGUgc2VyZGU7CiB1c2Ugc2VsZjo6c2VyZGU6OnNlcjo6e1NlcmlhbGl6ZSwgU2VyaWFsaXplciwgU2VyaWFsaXplU3RydWN0fTsKIHVzZSBzZWxmOjpmbGF0YnVmZmVyczo6e0VuZGlhblNjYWxhciwgRm9sbG93fTsKQEAgLTExNCw4ICsxMTksOCBAQAogICB9CiB9CiAKLWltcGwgc3RkOjpmbXQ6OkRlYnVnIGZvciBUZXN0U2ltcGxlVGFibGVXaXRoRW51bTwnXz4gewotICBmbiBmbXQoJnNlbGYsIGY6ICZtdXQgc3RkOjpmbXQ6OkZvcm1hdHRlcjwnXz4pIC0+IHN0ZDo6Zm10OjpSZXN1bHQgeworaW1wbCBjb3JlOjpmbXQ6OkRlYnVnIGZvciBUZXN0U2ltcGxlVGFibGVXaXRoRW51bTwnXz4geworICBmbiBmbXQoJnNlbGYsIGY6ICZtdXQgY29yZTo6Zm10OjpGb3JtYXR0ZXI8J18+KSAtPiBjb3JlOjpmbXQ6OlJlc3VsdCB7CiAgICAgbGV0IG11dCBkcyA9IGYuZGVidWdfc3RydWN0KCJUZXN0U2ltcGxlVGFibGVXaXRoRW51bSIpOwogICAgICAgZHMuZmllbGQoImNvbG9yIiwgJnNlbGYuY29sb3IoKSk7CiAgICAgICBkcy5maW5pc2goKQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvbW9uc3Rlcl90ZXN0X3NlcmlhbGl6ZS9teV9nYW1lL2V4YW1wbGUvdHlwZV9hbGlhc2VzX2dlbmVyYXRlZC5ycyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL21vbnN0ZXJfdGVzdF9zZXJpYWxpemUvbXlfZ2FtZS9leGFtcGxlL3R5cGVfYWxpYXNlc19nZW5lcmF0ZWQucnMKaW5kZXggNDRkMTE5OC4uZjZmN2JiNyAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvbW9uc3Rlcl90ZXN0X3NlcmlhbGl6ZS9teV9nYW1lL2V4YW1wbGUvdHlwZV9hbGlhc2VzX2dlbmVyYXRlZC5ycworKysgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9tb25zdGVyX3Rlc3Rfc2VyaWFsaXplL215X2dhbWUvZXhhbXBsZS90eXBlX2FsaWFzZXNfZ2VuZXJhdGVkLnJzCkBAIC0xLDcgKzEsMTIgQEAKIC8vIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGJ5IHRoZSBGbGF0QnVmZmVycyBjb21waWxlciwgZG8gbm90IG1vZGlmeQorLy8gQGdlbmVyYXRlZAorZXh0ZXJuIGNyYXRlIGFsbG9jOwogZXh0ZXJuIGNyYXRlIGZsYXRidWZmZXJzOwotdXNlIHN0ZDo6bWVtOwotdXNlIHN0ZDo6Y21wOjpPcmRlcmluZzsKK3VzZSBhbGxvYzo6Ym94ZWQ6OkJveDsKK3VzZSBhbGxvYzo6c3RyaW5nOjp7U3RyaW5nLCBUb1N0cmluZ307Cit1c2UgYWxsb2M6OnZlYzo6VmVjOwordXNlIGNvcmU6Om1lbTsKK3VzZSBjb3JlOjpjbXA6Ok9yZGVyaW5nOwogZXh0ZXJuIGNyYXRlIHNlcmRlOwogdXNlIHNlbGY6OnNlcmRlOjpzZXI6OntTZXJpYWxpemUsIFNlcmlhbGl6ZXIsIFNlcmlhbGl6ZVN0cnVjdH07CiB1c2Ugc2VsZjo6ZmxhdGJ1ZmZlcnM6OntFbmRpYW5TY2FsYXIsIEZvbGxvd307CkBAIC0zMDIsOCArMzA3LDggQEAKICAgfQogfQogCi1pbXBsIHN0ZDo6Zm10OjpEZWJ1ZyBmb3IgVHlwZUFsaWFzZXM8J18+IHsKLSAgZm4gZm10KCZzZWxmLCBmOiAmbXV0IHN0ZDo6Zm10OjpGb3JtYXR0ZXI8J18+KSAtPiBzdGQ6OmZtdDo6UmVzdWx0IHsKK2ltcGwgY29yZTo6Zm10OjpEZWJ1ZyBmb3IgVHlwZUFsaWFzZXM8J18+IHsKKyAgZm4gZm10KCZzZWxmLCBmOiAmbXV0IGNvcmU6OmZtdDo6Rm9ybWF0dGVyPCdfPikgLT4gY29yZTo6Zm10OjpSZXN1bHQgewogICAgIGxldCBtdXQgZHMgPSBmLmRlYnVnX3N0cnVjdCgiVHlwZUFsaWFzZXMiKTsKICAgICAgIGRzLmZpZWxkKCJpOF8iLCAmc2VsZi5pOF8oKSk7CiAgICAgICBkcy5maWVsZCgidThfIiwgJnNlbGYudThfKCkpOwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvbW9uc3Rlcl90ZXN0X3NlcmlhbGl6ZS9teV9nYW1lL2V4YW1wbGUvdmVjXzNfZ2VuZXJhdGVkLnJzIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvbW9uc3Rlcl90ZXN0X3NlcmlhbGl6ZS9teV9nYW1lL2V4YW1wbGUvdmVjXzNfZ2VuZXJhdGVkLnJzCmluZGV4IGYwNGQwZTguLmViYmU5NGMgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL21vbnN0ZXJfdGVzdF9zZXJpYWxpemUvbXlfZ2FtZS9leGFtcGxlL3ZlY18zX2dlbmVyYXRlZC5ycworKysgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9tb25zdGVyX3Rlc3Rfc2VyaWFsaXplL215X2dhbWUvZXhhbXBsZS92ZWNfM19nZW5lcmF0ZWQucnMKQEAgLTEsNyArMSwxMiBAQAogLy8gYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgYnkgdGhlIEZsYXRCdWZmZXJzIGNvbXBpbGVyLCBkbyBub3QgbW9kaWZ5CisvLyBAZ2VuZXJhdGVkCitleHRlcm4gY3JhdGUgYWxsb2M7CiBleHRlcm4gY3JhdGUgZmxhdGJ1ZmZlcnM7Ci11c2Ugc3RkOjptZW07Ci11c2Ugc3RkOjpjbXA6Ok9yZGVyaW5nOwordXNlIGFsbG9jOjpib3hlZDo6Qm94OwordXNlIGFsbG9jOjpzdHJpbmc6OntTdHJpbmcsIFRvU3RyaW5nfTsKK3VzZSBhbGxvYzo6dmVjOjpWZWM7Cit1c2UgY29yZTo6bWVtOwordXNlIGNvcmU6OmNtcDo6T3JkZXJpbmc7CiBleHRlcm4gY3JhdGUgc2VyZGU7CiB1c2Ugc2VsZjo6c2VyZGU6OnNlcjo6e1NlcmlhbGl6ZSwgU2VyaWFsaXplciwgU2VyaWFsaXplU3RydWN0fTsKIHVzZSBzZWxmOjpmbGF0YnVmZmVyczo6e0VuZGlhblNjYWxhciwgRm9sbG93fTsKQEAgLTE1LDggKzIwLDggQEAKICAgICBTZWxmKFswOyAzMl0pCiAgIH0KIH0KLWltcGwgc3RkOjpmbXQ6OkRlYnVnIGZvciBWZWMzIHsKLSAgZm4gZm10KCZzZWxmLCBmOiAmbXV0IHN0ZDo6Zm10OjpGb3JtYXR0ZXIpIC0+IHN0ZDo6Zm10OjpSZXN1bHQgeworaW1wbCBjb3JlOjpmbXQ6OkRlYnVnIGZvciBWZWMzIHsKKyAgZm4gZm10KCZzZWxmLCBmOiAmbXV0IGNvcmU6OmZtdDo6Rm9ybWF0dGVyKSAtPiBjb3JlOjpmbXQ6OlJlc3VsdCB7CiAgICAgZi5kZWJ1Z19zdHJ1Y3QoIlZlYzMiKQogICAgICAgLmZpZWxkKCJ4IiwgJnNlbGYueCgpKQogICAgICAgLmZpZWxkKCJ5IiwgJnNlbGYueSgpKQpAQCAtNDksNyArNTQsNyBAQAogICAgICNbaW5saW5lXQogICAgIGZuIHB1c2goJnNlbGYsIGRzdDogJm11dCBbdThdLCBfcmVzdDogJlt1OF0pIHsKICAgICAgICAgbGV0IHNyYyA9IHVuc2FmZSB7Ci0gICAgICAgICAgICA6OnN0ZDo6c2xpY2U6OmZyb21fcmF3X3BhcnRzKHNlbGYgYXMgKmNvbnN0IFZlYzMgYXMgKmNvbnN0IHU4LCBTZWxmOjpzaXplKCkpCisgICAgICAgICAgICA6OmNvcmU6OnNsaWNlOjpmcm9tX3Jhd19wYXJ0cyhzZWxmIGFzICpjb25zdCBWZWMzIGFzICpjb25zdCB1OCwgU2VsZjo6c2l6ZSgpKQogICAgICAgICB9OwogICAgICAgICBkc3QuY29weV9mcm9tX3NsaWNlKHNyYyk7CiAgICAgfQpAQCAtNjAsNyArNjUsNyBAQAogICAgICNbaW5saW5lXQogICAgIGZuIHB1c2goJnNlbGYsIGRzdDogJm11dCBbdThdLCBfcmVzdDogJlt1OF0pIHsKICAgICAgICAgbGV0IHNyYyA9IHVuc2FmZSB7Ci0gICAgICAgICAgICA6OnN0ZDo6c2xpY2U6OmZyb21fcmF3X3BhcnRzKCpzZWxmIGFzICpjb25zdCBWZWMzIGFzICpjb25zdCB1OCwgU2VsZjo6c2l6ZSgpKQorICAgICAgICAgICAgOjpjb3JlOjpzbGljZTo6ZnJvbV9yYXdfcGFydHMoKnNlbGYgYXMgKmNvbnN0IFZlYzMgYXMgKmNvbnN0IHU4LCBTZWxmOjpzaXplKCkpCiAgICAgICAgIH07CiAgICAgICAgIGRzdC5jb3B5X2Zyb21fc2xpY2Uoc3JjKTsKICAgICB9CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9tb25zdGVyX3Rlc3Rfc2VyaWFsaXplL215X2dhbWUvZXhhbXBsZV8yL21vbnN0ZXJfZ2VuZXJhdGVkLnJzIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvbW9uc3Rlcl90ZXN0X3NlcmlhbGl6ZS9teV9nYW1lL2V4YW1wbGVfMi9tb25zdGVyX2dlbmVyYXRlZC5ycwppbmRleCA3Njg3YzVlLi45NDIyYjU3IDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9tb25zdGVyX3Rlc3Rfc2VyaWFsaXplL215X2dhbWUvZXhhbXBsZV8yL21vbnN0ZXJfZ2VuZXJhdGVkLnJzCisrKyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL21vbnN0ZXJfdGVzdF9zZXJpYWxpemUvbXlfZ2FtZS9leGFtcGxlXzIvbW9uc3Rlcl9nZW5lcmF0ZWQucnMKQEAgLTEsNyArMSwxMiBAQAogLy8gYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgYnkgdGhlIEZsYXRCdWZmZXJzIGNvbXBpbGVyLCBkbyBub3QgbW9kaWZ5CisvLyBAZ2VuZXJhdGVkCitleHRlcm4gY3JhdGUgYWxsb2M7CiBleHRlcm4gY3JhdGUgZmxhdGJ1ZmZlcnM7Ci11c2Ugc3RkOjptZW07Ci11c2Ugc3RkOjpjbXA6Ok9yZGVyaW5nOwordXNlIGFsbG9jOjpib3hlZDo6Qm94OwordXNlIGFsbG9jOjpzdHJpbmc6OntTdHJpbmcsIFRvU3RyaW5nfTsKK3VzZSBhbGxvYzo6dmVjOjpWZWM7Cit1c2UgY29yZTo6bWVtOwordXNlIGNvcmU6OmNtcDo6T3JkZXJpbmc7CiBleHRlcm4gY3JhdGUgc2VyZGU7CiB1c2Ugc2VsZjo6c2VyZGU6OnNlcjo6e1NlcmlhbGl6ZSwgU2VyaWFsaXplciwgU2VyaWFsaXplU3RydWN0fTsKIHVzZSBzZWxmOjpmbGF0YnVmZmVyczo6e0VuZGlhblNjYWxhciwgRm9sbG93fTsKQEAgLTk3LDggKzEwMiw4IEBACiAgIH0KIH0KIAotaW1wbCBzdGQ6OmZtdDo6RGVidWcgZm9yIE1vbnN0ZXI8J18+IHsKLSAgZm4gZm10KCZzZWxmLCBmOiAmbXV0IHN0ZDo6Zm10OjpGb3JtYXR0ZXI8J18+KSAtPiBzdGQ6OmZtdDo6UmVzdWx0IHsKK2ltcGwgY29yZTo6Zm10OjpEZWJ1ZyBmb3IgTW9uc3RlcjwnXz4geworICBmbiBmbXQoJnNlbGYsIGY6ICZtdXQgY29yZTo6Zm10OjpGb3JtYXR0ZXI8J18+KSAtPiBjb3JlOjpmbXQ6OlJlc3VsdCB7CiAgICAgbGV0IG11dCBkcyA9IGYuZGVidWdfc3RydWN0KCJNb25zdGVyIik7CiAgICAgICBkcy5maW5pc2goKQogICB9CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9tb25zdGVyX3Rlc3Rfc2VyaWFsaXplL215X2dhbWUvaW5fcGFyZW50X25hbWVzcGFjZV9nZW5lcmF0ZWQucnMgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9tb25zdGVyX3Rlc3Rfc2VyaWFsaXplL215X2dhbWUvaW5fcGFyZW50X25hbWVzcGFjZV9nZW5lcmF0ZWQucnMKaW5kZXggYjJiMGEwOS4uNzFjZWFhMCAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvbW9uc3Rlcl90ZXN0X3NlcmlhbGl6ZS9teV9nYW1lL2luX3BhcmVudF9uYW1lc3BhY2VfZ2VuZXJhdGVkLnJzCisrKyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL21vbnN0ZXJfdGVzdF9zZXJpYWxpemUvbXlfZ2FtZS9pbl9wYXJlbnRfbmFtZXNwYWNlX2dlbmVyYXRlZC5ycwpAQCAtMSw3ICsxLDEyIEBACiAvLyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBieSB0aGUgRmxhdEJ1ZmZlcnMgY29tcGlsZXIsIGRvIG5vdCBtb2RpZnkKKy8vIEBnZW5lcmF0ZWQKK2V4dGVybiBjcmF0ZSBhbGxvYzsKIGV4dGVybiBjcmF0ZSBmbGF0YnVmZmVyczsKLXVzZSBzdGQ6Om1lbTsKLXVzZSBzdGQ6OmNtcDo6T3JkZXJpbmc7Cit1c2UgYWxsb2M6OmJveGVkOjpCb3g7Cit1c2UgYWxsb2M6OnN0cmluZzo6e1N0cmluZywgVG9TdHJpbmd9OwordXNlIGFsbG9jOjp2ZWM6OlZlYzsKK3VzZSBjb3JlOjptZW07Cit1c2UgY29yZTo6Y21wOjpPcmRlcmluZzsKIGV4dGVybiBjcmF0ZSBzZXJkZTsKIHVzZSBzZWxmOjpzZXJkZTo6c2VyOjp7U2VyaWFsaXplLCBTZXJpYWxpemVyLCBTZXJpYWxpemVTdHJ1Y3R9OwogdXNlIHNlbGY6OmZsYXRidWZmZXJzOjp7RW5kaWFuU2NhbGFyLCBGb2xsb3d9OwpAQCAtOTcsOCArMTAyLDggQEAKICAgfQogfQogCi1pbXBsIHN0ZDo6Zm10OjpEZWJ1ZyBmb3IgSW5QYXJlbnROYW1lc3BhY2U8J18+IHsKLSAgZm4gZm10KCZzZWxmLCBmOiAmbXV0IHN0ZDo6Zm10OjpGb3JtYXR0ZXI8J18+KSAtPiBzdGQ6OmZtdDo6UmVzdWx0IHsKK2ltcGwgY29yZTo6Zm10OjpEZWJ1ZyBmb3IgSW5QYXJlbnROYW1lc3BhY2U8J18+IHsKKyAgZm4gZm10KCZzZWxmLCBmOiAmbXV0IGNvcmU6OmZtdDo6Rm9ybWF0dGVyPCdfPikgLT4gY29yZTo6Zm10OjpSZXN1bHQgewogICAgIGxldCBtdXQgZHMgPSBmLmRlYnVnX3N0cnVjdCgiSW5QYXJlbnROYW1lc3BhY2UiKTsKICAgICAgIGRzLmZpbmlzaCgpCiAgIH0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL21vbnN0ZXJfdGVzdF9zZXJpYWxpemUvbXlfZ2FtZS9vdGhlcl9uYW1lX3NwYWNlL2Zyb21faW5jbHVkZV9nZW5lcmF0ZWQucnMgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9tb25zdGVyX3Rlc3Rfc2VyaWFsaXplL215X2dhbWUvb3RoZXJfbmFtZV9zcGFjZS9mcm9tX2luY2x1ZGVfZ2VuZXJhdGVkLnJzCmluZGV4IDA2YTBmYTguLmRlNWU1ZTIgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL21vbnN0ZXJfdGVzdF9zZXJpYWxpemUvbXlfZ2FtZS9vdGhlcl9uYW1lX3NwYWNlL2Zyb21faW5jbHVkZV9nZW5lcmF0ZWQucnMKKysrIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvbW9uc3Rlcl90ZXN0X3NlcmlhbGl6ZS9teV9nYW1lL290aGVyX25hbWVfc3BhY2UvZnJvbV9pbmNsdWRlX2dlbmVyYXRlZC5ycwpAQCAtMSw3ICsxLDEyIEBACiAvLyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBieSB0aGUgRmxhdEJ1ZmZlcnMgY29tcGlsZXIsIGRvIG5vdCBtb2RpZnkKKy8vIEBnZW5lcmF0ZWQKK2V4dGVybiBjcmF0ZSBhbGxvYzsKIGV4dGVybiBjcmF0ZSBmbGF0YnVmZmVyczsKLXVzZSBzdGQ6Om1lbTsKLXVzZSBzdGQ6OmNtcDo6T3JkZXJpbmc7Cit1c2UgYWxsb2M6OmJveGVkOjpCb3g7Cit1c2UgYWxsb2M6OnN0cmluZzo6e1N0cmluZywgVG9TdHJpbmd9OwordXNlIGFsbG9jOjp2ZWM6OlZlYzsKK3VzZSBjb3JlOjptZW07Cit1c2UgY29yZTo6Y21wOjpPcmRlcmluZzsKIGV4dGVybiBjcmF0ZSBzZXJkZTsKIHVzZSBzZWxmOjpzZXJkZTo6c2VyOjp7U2VyaWFsaXplLCBTZXJpYWxpemVyLCBTZXJpYWxpemVTdHJ1Y3R9OwogdXNlIHNlbGY6OmZsYXRidWZmZXJzOjp7RW5kaWFuU2NhbGFyLCBGb2xsb3d9OwpAQCAtMzYsOCArNDEsOCBAQAogICAgIH0KICAgfQogfQotaW1wbCBzdGQ6OmZtdDo6RGVidWcgZm9yIEZyb21JbmNsdWRlIHsKLSAgZm4gZm10KCZzZWxmLCBmOiAmbXV0IHN0ZDo6Zm10OjpGb3JtYXR0ZXIpIC0+IHN0ZDo6Zm10OjpSZXN1bHQgeworaW1wbCBjb3JlOjpmbXQ6OkRlYnVnIGZvciBGcm9tSW5jbHVkZSB7CisgIGZuIGZtdCgmc2VsZiwgZjogJm11dCBjb3JlOjpmbXQ6OkZvcm1hdHRlcikgLT4gY29yZTo6Zm10OjpSZXN1bHQgewogICAgIGlmIGxldCBTb21lKG5hbWUpID0gc2VsZi52YXJpYW50X25hbWUoKSB7CiAgICAgICBmLndyaXRlX3N0cihuYW1lKQogICAgIH0gZWxzZSB7CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9tb25zdGVyX3Rlc3Rfc2VyaWFsaXplL215X2dhbWUvb3RoZXJfbmFtZV9zcGFjZS90YWJsZV9iX2dlbmVyYXRlZC5ycyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL21vbnN0ZXJfdGVzdF9zZXJpYWxpemUvbXlfZ2FtZS9vdGhlcl9uYW1lX3NwYWNlL3RhYmxlX2JfZ2VuZXJhdGVkLnJzCmluZGV4IGYwOWUxNzUuLmU1OTMyOTkgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL21vbnN0ZXJfdGVzdF9zZXJpYWxpemUvbXlfZ2FtZS9vdGhlcl9uYW1lX3NwYWNlL3RhYmxlX2JfZ2VuZXJhdGVkLnJzCisrKyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL21vbnN0ZXJfdGVzdF9zZXJpYWxpemUvbXlfZ2FtZS9vdGhlcl9uYW1lX3NwYWNlL3RhYmxlX2JfZ2VuZXJhdGVkLnJzCkBAIC0xLDcgKzEsMTIgQEAKIC8vIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGJ5IHRoZSBGbGF0QnVmZmVycyBjb21waWxlciwgZG8gbm90IG1vZGlmeQorLy8gQGdlbmVyYXRlZAorZXh0ZXJuIGNyYXRlIGFsbG9jOwogZXh0ZXJuIGNyYXRlIGZsYXRidWZmZXJzOwotdXNlIHN0ZDo6bWVtOwotdXNlIHN0ZDo6Y21wOjpPcmRlcmluZzsKK3VzZSBhbGxvYzo6Ym94ZWQ6OkJveDsKK3VzZSBhbGxvYzo6c3RyaW5nOjp7U3RyaW5nLCBUb1N0cmluZ307Cit1c2UgYWxsb2M6OnZlYzo6VmVjOwordXNlIGNvcmU6Om1lbTsKK3VzZSBjb3JlOjpjbXA6Ok9yZGVyaW5nOwogZXh0ZXJuIGNyYXRlIHNlcmRlOwogdXNlIHNlbGY6OnNlcmRlOjpzZXI6OntTZXJpYWxpemUsIFNlcmlhbGl6ZXIsIFNlcmlhbGl6ZVN0cnVjdH07CiB1c2Ugc2VsZjo6ZmxhdGJ1ZmZlcnM6OntFbmRpYW5TY2FsYXIsIEZvbGxvd307CkBAIC0xMjAsOCArMTI1LDggQEAKICAgfQogfQogCi1pbXBsIHN0ZDo6Zm10OjpEZWJ1ZyBmb3IgVGFibGVCPCdfPiB7Ci0gIGZuIGZtdCgmc2VsZiwgZjogJm11dCBzdGQ6OmZtdDo6Rm9ybWF0dGVyPCdfPikgLT4gc3RkOjpmbXQ6OlJlc3VsdCB7CitpbXBsIGNvcmU6OmZtdDo6RGVidWcgZm9yIFRhYmxlQjwnXz4geworICBmbiBmbXQoJnNlbGYsIGY6ICZtdXQgY29yZTo6Zm10OjpGb3JtYXR0ZXI8J18+KSAtPiBjb3JlOjpmbXQ6OlJlc3VsdCB7CiAgICAgbGV0IG11dCBkcyA9IGYuZGVidWdfc3RydWN0KCJUYWJsZUIiKTsKICAgICAgIGRzLmZpZWxkKCJhIiwgJnNlbGYuYSgpKTsKICAgICAgIGRzLmZpbmlzaCgpCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9tb25zdGVyX3Rlc3Rfc2VyaWFsaXplL215X2dhbWUvb3RoZXJfbmFtZV9zcGFjZS91bnVzZWRfZ2VuZXJhdGVkLnJzIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvbW9uc3Rlcl90ZXN0X3NlcmlhbGl6ZS9teV9nYW1lL290aGVyX25hbWVfc3BhY2UvdW51c2VkX2dlbmVyYXRlZC5ycwppbmRleCA3YjkxNDQ3Li4yOTkxNzgxIDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9tb25zdGVyX3Rlc3Rfc2VyaWFsaXplL215X2dhbWUvb3RoZXJfbmFtZV9zcGFjZS91bnVzZWRfZ2VuZXJhdGVkLnJzCisrKyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL21vbnN0ZXJfdGVzdF9zZXJpYWxpemUvbXlfZ2FtZS9vdGhlcl9uYW1lX3NwYWNlL3VudXNlZF9nZW5lcmF0ZWQucnMKQEAgLTEsNyArMSwxMiBAQAogLy8gYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgYnkgdGhlIEZsYXRCdWZmZXJzIGNvbXBpbGVyLCBkbyBub3QgbW9kaWZ5CisvLyBAZ2VuZXJhdGVkCitleHRlcm4gY3JhdGUgYWxsb2M7CiBleHRlcm4gY3JhdGUgZmxhdGJ1ZmZlcnM7Ci11c2Ugc3RkOjptZW07Ci11c2Ugc3RkOjpjbXA6Ok9yZGVyaW5nOwordXNlIGFsbG9jOjpib3hlZDo6Qm94OwordXNlIGFsbG9jOjpzdHJpbmc6OntTdHJpbmcsIFRvU3RyaW5nfTsKK3VzZSBhbGxvYzo6dmVjOjpWZWM7Cit1c2UgY29yZTo6bWVtOwordXNlIGNvcmU6OmNtcDo6T3JkZXJpbmc7CiBleHRlcm4gY3JhdGUgc2VyZGU7CiB1c2Ugc2VsZjo6c2VyZGU6OnNlcjo6e1NlcmlhbGl6ZSwgU2VyaWFsaXplciwgU2VyaWFsaXplU3RydWN0fTsKIHVzZSBzZWxmOjpmbGF0YnVmZmVyczo6e0VuZGlhblNjYWxhciwgRm9sbG93fTsKQEAgLTE1LDggKzIwLDggQEAKICAgICBTZWxmKFswOyA0XSkKICAgfQogfQotaW1wbCBzdGQ6OmZtdDo6RGVidWcgZm9yIFVudXNlZCB7Ci0gIGZuIGZtdCgmc2VsZiwgZjogJm11dCBzdGQ6OmZtdDo6Rm9ybWF0dGVyKSAtPiBzdGQ6OmZtdDo6UmVzdWx0IHsKK2ltcGwgY29yZTo6Zm10OjpEZWJ1ZyBmb3IgVW51c2VkIHsKKyAgZm4gZm10KCZzZWxmLCBmOiAmbXV0IGNvcmU6OmZtdDo6Rm9ybWF0dGVyKSAtPiBjb3JlOjpmbXQ6OlJlc3VsdCB7CiAgICAgZi5kZWJ1Z19zdHJ1Y3QoIlVudXNlZCIpCiAgICAgICAuZmllbGQoImEiLCAmc2VsZi5hKCkpCiAgICAgICAuZmluaXNoKCkKQEAgLTQ0LDcgKzQ5LDcgQEAKICAgICAjW2lubGluZV0KICAgICBmbiBwdXNoKCZzZWxmLCBkc3Q6ICZtdXQgW3U4XSwgX3Jlc3Q6ICZbdThdKSB7CiAgICAgICAgIGxldCBzcmMgPSB1bnNhZmUgewotICAgICAgICAgICAgOjpzdGQ6OnNsaWNlOjpmcm9tX3Jhd19wYXJ0cyhzZWxmIGFzICpjb25zdCBVbnVzZWQgYXMgKmNvbnN0IHU4LCBTZWxmOjpzaXplKCkpCisgICAgICAgICAgICA6OmNvcmU6OnNsaWNlOjpmcm9tX3Jhd19wYXJ0cyhzZWxmIGFzICpjb25zdCBVbnVzZWQgYXMgKmNvbnN0IHU4LCBTZWxmOjpzaXplKCkpCiAgICAgICAgIH07CiAgICAgICAgIGRzdC5jb3B5X2Zyb21fc2xpY2Uoc3JjKTsKICAgICB9CkBAIC01NSw3ICs2MCw3IEBACiAgICAgI1tpbmxpbmVdCiAgICAgZm4gcHVzaCgmc2VsZiwgZHN0OiAmbXV0IFt1OF0sIF9yZXN0OiAmW3U4XSkgewogICAgICAgICBsZXQgc3JjID0gdW5zYWZlIHsKLSAgICAgICAgICAgIDo6c3RkOjpzbGljZTo6ZnJvbV9yYXdfcGFydHMoKnNlbGYgYXMgKmNvbnN0IFVudXNlZCBhcyAqY29uc3QgdTgsIFNlbGY6OnNpemUoKSkKKyAgICAgICAgICAgIDo6Y29yZTo6c2xpY2U6OmZyb21fcmF3X3BhcnRzKCpzZWxmIGFzICpjb25zdCBVbnVzZWQgYXMgKmNvbnN0IHU4LCBTZWxmOjpzaXplKCkpCiAgICAgICAgIH07CiAgICAgICAgIGRzdC5jb3B5X2Zyb21fc2xpY2Uoc3JjKTsKICAgICB9CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9tb25zdGVyX3Rlc3Rfc2VyaWFsaXplL3RhYmxlX2FfZ2VuZXJhdGVkLnJzIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvbW9uc3Rlcl90ZXN0X3NlcmlhbGl6ZS90YWJsZV9hX2dlbmVyYXRlZC5ycwppbmRleCBlYjAzZjQ5Li5jNGJiZDY5IDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9tb25zdGVyX3Rlc3Rfc2VyaWFsaXplL3RhYmxlX2FfZ2VuZXJhdGVkLnJzCisrKyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL21vbnN0ZXJfdGVzdF9zZXJpYWxpemUvdGFibGVfYV9nZW5lcmF0ZWQucnMKQEAgLTEsNyArMSwxMiBAQAogLy8gYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgYnkgdGhlIEZsYXRCdWZmZXJzIGNvbXBpbGVyLCBkbyBub3QgbW9kaWZ5CisvLyBAZ2VuZXJhdGVkCitleHRlcm4gY3JhdGUgYWxsb2M7CiBleHRlcm4gY3JhdGUgZmxhdGJ1ZmZlcnM7Ci11c2Ugc3RkOjptZW07Ci11c2Ugc3RkOjpjbXA6Ok9yZGVyaW5nOwordXNlIGFsbG9jOjpib3hlZDo6Qm94OwordXNlIGFsbG9jOjpzdHJpbmc6OntTdHJpbmcsIFRvU3RyaW5nfTsKK3VzZSBhbGxvYzo6dmVjOjpWZWM7Cit1c2UgY29yZTo6bWVtOwordXNlIGNvcmU6OmNtcDo6T3JkZXJpbmc7CiBleHRlcm4gY3JhdGUgc2VyZGU7CiB1c2Ugc2VsZjo6c2VyZGU6OnNlcjo6e1NlcmlhbGl6ZSwgU2VyaWFsaXplciwgU2VyaWFsaXplU3RydWN0fTsKIHVzZSBzZWxmOjpmbGF0YnVmZmVyczo6e0VuZGlhblNjYWxhciwgRm9sbG93fTsKQEAgLTEyMCw4ICsxMjUsOCBAQAogICB9CiB9CiAKLWltcGwgc3RkOjpmbXQ6OkRlYnVnIGZvciBUYWJsZUE8J18+IHsKLSAgZm4gZm10KCZzZWxmLCBmOiAmbXV0IHN0ZDo6Zm10OjpGb3JtYXR0ZXI8J18+KSAtPiBzdGQ6OmZtdDo6UmVzdWx0IHsKK2ltcGwgY29yZTo6Zm10OjpEZWJ1ZyBmb3IgVGFibGVBPCdfPiB7CisgIGZuIGZtdCgmc2VsZiwgZjogJm11dCBjb3JlOjpmbXQ6OkZvcm1hdHRlcjwnXz4pIC0+IGNvcmU6OmZtdDo6UmVzdWx0IHsKICAgICBsZXQgbXV0IGRzID0gZi5kZWJ1Z19zdHJ1Y3QoIlRhYmxlQSIpOwogICAgICAgZHMuZmllbGQoImIiLCAmc2VsZi5iKCkpOwogICAgICAgZHMuZmluaXNoKCkKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL21vbnN0ZXJfdGVzdF9zdWZmaXgvZXh0X29ubHkvbW9uc3Rlcl90ZXN0LmdycGMuZmIuY2MgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9tb25zdGVyX3Rlc3Rfc3VmZml4L2V4dF9vbmx5L21vbnN0ZXJfdGVzdC5ncnBjLmZiLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNjYzcyZWQKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9tb25zdGVyX3Rlc3Rfc3VmZml4L2V4dF9vbmx5L21vbnN0ZXJfdGVzdC5ncnBjLmZiLmNjCkBAIC0wLDAgKzEsMTMxIEBACisvLyBHZW5lcmF0ZWQgYnkgdGhlIGdSUEMgQysrIHBsdWdpbi4KKy8vIElmIHlvdSBtYWtlIGFueSBsb2NhbCBjaGFuZ2UsIHRoZXkgd2lsbCBiZSBsb3N0LgorLy8gc291cmNlOiBtb25zdGVyX3Rlc3QKKworI2luY2x1ZGUgIm1vbnN0ZXJfdGVzdF9nZW5lcmF0ZWQuaHBwIgorI2luY2x1ZGUgIm1vbnN0ZXJfdGVzdC5ncnBjLmZiLmgiCisKKyNpbmNsdWRlIDxncnBjcHAvaW1wbC9jb2RlZ2VuL2FzeW5jX3N0cmVhbS5oPgorI2luY2x1ZGUgPGdycGNwcC9pbXBsL2NvZGVnZW4vYXN5bmNfdW5hcnlfY2FsbC5oPgorI2luY2x1ZGUgPGdycGNwcC9pbXBsL2NvZGVnZW4vY2hhbm5lbF9pbnRlcmZhY2UuaD4KKyNpbmNsdWRlIDxncnBjcHAvaW1wbC9jb2RlZ2VuL2NsaWVudF91bmFyeV9jYWxsLmg+CisjaW5jbHVkZSA8Z3JwY3BwL2ltcGwvY29kZWdlbi9tZXRob2RfaGFuZGxlci5oPgorI2luY2x1ZGUgPGdycGNwcC9pbXBsL2NvZGVnZW4vcnBjX3NlcnZpY2VfbWV0aG9kLmg+CisjaW5jbHVkZSA8Z3JwY3BwL2ltcGwvY29kZWdlbi9zZXJ2aWNlX3R5cGUuaD4KKyNpbmNsdWRlIDxncnBjcHAvaW1wbC9jb2RlZ2VuL3N5bmNfc3RyZWFtLmg+CituYW1lc3BhY2UgTXlHYW1lIHsKK25hbWVzcGFjZSBFeGFtcGxlIHsKKworc3RhdGljIGNvbnN0IGNoYXIqIE1vbnN0ZXJTdG9yYWdlX21ldGhvZF9uYW1lc1tdID0geworICAiL015R2FtZS5FeGFtcGxlLk1vbnN0ZXJTdG9yYWdlL1N0b3JlIiwKKyAgIi9NeUdhbWUuRXhhbXBsZS5Nb25zdGVyU3RvcmFnZS9SZXRyaWV2ZSIsCisgICIvTXlHYW1lLkV4YW1wbGUuTW9uc3RlclN0b3JhZ2UvR2V0TWF4SGl0UG9pbnQiLAorICAiL015R2FtZS5FeGFtcGxlLk1vbnN0ZXJTdG9yYWdlL0dldE1pbk1heEhpdFBvaW50cyIsCit9OworCitzdGQ6OnVuaXF1ZV9wdHI8IE1vbnN0ZXJTdG9yYWdlOjpTdHViPiBNb25zdGVyU3RvcmFnZTo6TmV3U3R1Yihjb25zdCBzdGQ6OnNoYXJlZF9wdHI8IDo6Z3JwYzo6Q2hhbm5lbEludGVyZmFjZT4mIGNoYW5uZWwsIGNvbnN0IDo6Z3JwYzo6U3R1Yk9wdGlvbnMmIC8qb3B0aW9ucyovKSB7CisgIHN0ZDo6dW5pcXVlX3B0cjwgTW9uc3RlclN0b3JhZ2U6OlN0dWI+IHN0dWIobmV3IE1vbnN0ZXJTdG9yYWdlOjpTdHViKGNoYW5uZWwpKTsKKyAgcmV0dXJuIHN0dWI7Cit9CisKK01vbnN0ZXJTdG9yYWdlOjpTdHViOjpTdHViKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjwgOjpncnBjOjpDaGFubmVsSW50ZXJmYWNlPiYgY2hhbm5lbCkKKyAgOiBjaGFubmVsXyhjaGFubmVsKSAgLCBycGNtZXRob2RfU3RvcmVfKE1vbnN0ZXJTdG9yYWdlX21ldGhvZF9uYW1lc1swXSwgOjpncnBjOjppbnRlcm5hbDo6UnBjTWV0aG9kOjpOT1JNQUxfUlBDLCBjaGFubmVsKQorICAsIHJwY21ldGhvZF9SZXRyaWV2ZV8oTW9uc3RlclN0b3JhZ2VfbWV0aG9kX25hbWVzWzFdLCA6OmdycGM6OmludGVybmFsOjpScGNNZXRob2Q6OlNFUlZFUl9TVFJFQU1JTkcsIGNoYW5uZWwpCisgICwgcnBjbWV0aG9kX0dldE1heEhpdFBvaW50XyhNb25zdGVyU3RvcmFnZV9tZXRob2RfbmFtZXNbMl0sIDo6Z3JwYzo6aW50ZXJuYWw6OlJwY01ldGhvZDo6Q0xJRU5UX1NUUkVBTUlORywgY2hhbm5lbCkKKyAgLCBycGNtZXRob2RfR2V0TWluTWF4SGl0UG9pbnRzXyhNb25zdGVyU3RvcmFnZV9tZXRob2RfbmFtZXNbM10sIDo6Z3JwYzo6aW50ZXJuYWw6OlJwY01ldGhvZDo6QklESV9TVFJFQU1JTkcsIGNoYW5uZWwpCisgIHt9CisgIAorOjpncnBjOjpTdGF0dXMgTW9uc3RlclN0b3JhZ2U6OlN0dWI6OlN0b3JlKDo6Z3JwYzo6Q2xpZW50Q29udGV4dCogY29udGV4dCwgY29uc3QgZmxhdGJ1ZmZlcnM6OmdycGM6Ok1lc3NhZ2U8TW9uc3Rlcj4mIHJlcXVlc3QsIGZsYXRidWZmZXJzOjpncnBjOjpNZXNzYWdlPFN0YXQ+KiByZXNwb25zZSkgeworICByZXR1cm4gOjpncnBjOjppbnRlcm5hbDo6QmxvY2tpbmdVbmFyeUNhbGwoY2hhbm5lbF8uZ2V0KCksIHJwY21ldGhvZF9TdG9yZV8sIGNvbnRleHQsIHJlcXVlc3QsIHJlc3BvbnNlKTsKK30KKworOjpncnBjOjpDbGllbnRBc3luY1Jlc3BvbnNlUmVhZGVyPCBmbGF0YnVmZmVyczo6Z3JwYzo6TWVzc2FnZTxTdGF0Pj4qIE1vbnN0ZXJTdG9yYWdlOjpTdHViOjpBc3luY1N0b3JlUmF3KDo6Z3JwYzo6Q2xpZW50Q29udGV4dCogY29udGV4dCwgY29uc3QgZmxhdGJ1ZmZlcnM6OmdycGM6Ok1lc3NhZ2U8TW9uc3Rlcj4mIHJlcXVlc3QsIDo6Z3JwYzo6Q29tcGxldGlvblF1ZXVlKiBjcSkgeworICByZXR1cm4gOjpncnBjOjppbnRlcm5hbDo6Q2xpZW50QXN5bmNSZXNwb25zZVJlYWRlckZhY3Rvcnk8IGZsYXRidWZmZXJzOjpncnBjOjpNZXNzYWdlPFN0YXQ+Pjo6Q3JlYXRlKGNoYW5uZWxfLmdldCgpLCBjcSwgcnBjbWV0aG9kX1N0b3JlXywgY29udGV4dCwgcmVxdWVzdCwgdHJ1ZSk7Cit9CisKKzo6Z3JwYzo6Q2xpZW50QXN5bmNSZXNwb25zZVJlYWRlcjwgZmxhdGJ1ZmZlcnM6OmdycGM6Ok1lc3NhZ2U8U3RhdD4+KiBNb25zdGVyU3RvcmFnZTo6U3R1Yjo6UHJlcGFyZUFzeW5jU3RvcmVSYXcoOjpncnBjOjpDbGllbnRDb250ZXh0KiBjb250ZXh0LCBjb25zdCBmbGF0YnVmZmVyczo6Z3JwYzo6TWVzc2FnZTxNb25zdGVyPiYgcmVxdWVzdCwgOjpncnBjOjpDb21wbGV0aW9uUXVldWUqIGNxKSB7CisgIHJldHVybiA6OmdycGM6OmludGVybmFsOjpDbGllbnRBc3luY1Jlc3BvbnNlUmVhZGVyRmFjdG9yeTwgZmxhdGJ1ZmZlcnM6OmdycGM6Ok1lc3NhZ2U8U3RhdD4+OjpDcmVhdGUoY2hhbm5lbF8uZ2V0KCksIGNxLCBycGNtZXRob2RfU3RvcmVfLCBjb250ZXh0LCByZXF1ZXN0LCBmYWxzZSk7Cit9CisKKzo6Z3JwYzo6Q2xpZW50UmVhZGVyPCBmbGF0YnVmZmVyczo6Z3JwYzo6TWVzc2FnZTxNb25zdGVyPj4qIE1vbnN0ZXJTdG9yYWdlOjpTdHViOjpSZXRyaWV2ZVJhdyg6OmdycGM6OkNsaWVudENvbnRleHQqIGNvbnRleHQsIGNvbnN0IGZsYXRidWZmZXJzOjpncnBjOjpNZXNzYWdlPFN0YXQ+JiByZXF1ZXN0KSB7CisgIHJldHVybiA6OmdycGM6OmludGVybmFsOjpDbGllbnRSZWFkZXJGYWN0b3J5PCBmbGF0YnVmZmVyczo6Z3JwYzo6TWVzc2FnZTxNb25zdGVyPj46OkNyZWF0ZShjaGFubmVsXy5nZXQoKSwgcnBjbWV0aG9kX1JldHJpZXZlXywgY29udGV4dCwgcmVxdWVzdCk7Cit9CisKKzo6Z3JwYzo6Q2xpZW50QXN5bmNSZWFkZXI8IGZsYXRidWZmZXJzOjpncnBjOjpNZXNzYWdlPE1vbnN0ZXI+PiogTW9uc3RlclN0b3JhZ2U6OlN0dWI6OkFzeW5jUmV0cmlldmVSYXcoOjpncnBjOjpDbGllbnRDb250ZXh0KiBjb250ZXh0LCBjb25zdCBmbGF0YnVmZmVyczo6Z3JwYzo6TWVzc2FnZTxTdGF0PiYgcmVxdWVzdCwgOjpncnBjOjpDb21wbGV0aW9uUXVldWUqIGNxLCB2b2lkKiB0YWcpIHsKKyAgcmV0dXJuIDo6Z3JwYzo6aW50ZXJuYWw6OkNsaWVudEFzeW5jUmVhZGVyRmFjdG9yeTwgZmxhdGJ1ZmZlcnM6OmdycGM6Ok1lc3NhZ2U8TW9uc3Rlcj4+OjpDcmVhdGUoY2hhbm5lbF8uZ2V0KCksIGNxLCBycGNtZXRob2RfUmV0cmlldmVfLCBjb250ZXh0LCByZXF1ZXN0LCB0cnVlLCB0YWcpOworfQorCis6OmdycGM6OkNsaWVudEFzeW5jUmVhZGVyPCBmbGF0YnVmZmVyczo6Z3JwYzo6TWVzc2FnZTxNb25zdGVyPj4qIE1vbnN0ZXJTdG9yYWdlOjpTdHViOjpQcmVwYXJlQXN5bmNSZXRyaWV2ZVJhdyg6OmdycGM6OkNsaWVudENvbnRleHQqIGNvbnRleHQsIGNvbnN0IGZsYXRidWZmZXJzOjpncnBjOjpNZXNzYWdlPFN0YXQ+JiByZXF1ZXN0LCA6OmdycGM6OkNvbXBsZXRpb25RdWV1ZSogY3EpIHsKKyAgcmV0dXJuIDo6Z3JwYzo6aW50ZXJuYWw6OkNsaWVudEFzeW5jUmVhZGVyRmFjdG9yeTwgZmxhdGJ1ZmZlcnM6OmdycGM6Ok1lc3NhZ2U8TW9uc3Rlcj4+OjpDcmVhdGUoY2hhbm5lbF8uZ2V0KCksIGNxLCBycGNtZXRob2RfUmV0cmlldmVfLCBjb250ZXh0LCByZXF1ZXN0LCBmYWxzZSwgbnVsbHB0cik7Cit9CisKKzo6Z3JwYzo6Q2xpZW50V3JpdGVyPCBmbGF0YnVmZmVyczo6Z3JwYzo6TWVzc2FnZTxNb25zdGVyPj4qIE1vbnN0ZXJTdG9yYWdlOjpTdHViOjpHZXRNYXhIaXRQb2ludFJhdyg6OmdycGM6OkNsaWVudENvbnRleHQqIGNvbnRleHQsIGZsYXRidWZmZXJzOjpncnBjOjpNZXNzYWdlPFN0YXQ+KiByZXNwb25zZSkgeworICByZXR1cm4gOjpncnBjOjppbnRlcm5hbDo6Q2xpZW50V3JpdGVyRmFjdG9yeTwgZmxhdGJ1ZmZlcnM6OmdycGM6Ok1lc3NhZ2U8TW9uc3Rlcj4+OjpDcmVhdGUoY2hhbm5lbF8uZ2V0KCksIHJwY21ldGhvZF9HZXRNYXhIaXRQb2ludF8sIGNvbnRleHQsIHJlc3BvbnNlKTsKK30KKworOjpncnBjOjpDbGllbnRBc3luY1dyaXRlcjwgZmxhdGJ1ZmZlcnM6OmdycGM6Ok1lc3NhZ2U8TW9uc3Rlcj4+KiBNb25zdGVyU3RvcmFnZTo6U3R1Yjo6QXN5bmNHZXRNYXhIaXRQb2ludFJhdyg6OmdycGM6OkNsaWVudENvbnRleHQqIGNvbnRleHQsIGZsYXRidWZmZXJzOjpncnBjOjpNZXNzYWdlPFN0YXQ+KiByZXNwb25zZSwgOjpncnBjOjpDb21wbGV0aW9uUXVldWUqIGNxLCB2b2lkKiB0YWcpIHsKKyAgcmV0dXJuIDo6Z3JwYzo6aW50ZXJuYWw6OkNsaWVudEFzeW5jV3JpdGVyRmFjdG9yeTwgZmxhdGJ1ZmZlcnM6OmdycGM6Ok1lc3NhZ2U8TW9uc3Rlcj4+OjpDcmVhdGUoY2hhbm5lbF8uZ2V0KCksIGNxLCBycGNtZXRob2RfR2V0TWF4SGl0UG9pbnRfLCBjb250ZXh0LCByZXNwb25zZSwgdHJ1ZSwgdGFnKTsKK30KKworOjpncnBjOjpDbGllbnRBc3luY1dyaXRlcjwgZmxhdGJ1ZmZlcnM6OmdycGM6Ok1lc3NhZ2U8TW9uc3Rlcj4+KiBNb25zdGVyU3RvcmFnZTo6U3R1Yjo6UHJlcGFyZUFzeW5jR2V0TWF4SGl0UG9pbnRSYXcoOjpncnBjOjpDbGllbnRDb250ZXh0KiBjb250ZXh0LCBmbGF0YnVmZmVyczo6Z3JwYzo6TWVzc2FnZTxTdGF0PiogcmVzcG9uc2UsIDo6Z3JwYzo6Q29tcGxldGlvblF1ZXVlKiBjcSkgeworICByZXR1cm4gOjpncnBjOjppbnRlcm5hbDo6Q2xpZW50QXN5bmNXcml0ZXJGYWN0b3J5PCBmbGF0YnVmZmVyczo6Z3JwYzo6TWVzc2FnZTxNb25zdGVyPj46OkNyZWF0ZShjaGFubmVsXy5nZXQoKSwgY3EsIHJwY21ldGhvZF9HZXRNYXhIaXRQb2ludF8sIGNvbnRleHQsIHJlc3BvbnNlLCBmYWxzZSwgbnVsbHB0cik7Cit9CisKKzo6Z3JwYzo6Q2xpZW50UmVhZGVyV3JpdGVyPCBmbGF0YnVmZmVyczo6Z3JwYzo6TWVzc2FnZTxNb25zdGVyPiwgZmxhdGJ1ZmZlcnM6OmdycGM6Ok1lc3NhZ2U8U3RhdD4+KiBNb25zdGVyU3RvcmFnZTo6U3R1Yjo6R2V0TWluTWF4SGl0UG9pbnRzUmF3KDo6Z3JwYzo6Q2xpZW50Q29udGV4dCogY29udGV4dCkgeworICByZXR1cm4gOjpncnBjOjppbnRlcm5hbDo6Q2xpZW50UmVhZGVyV3JpdGVyRmFjdG9yeTwgZmxhdGJ1ZmZlcnM6OmdycGM6Ok1lc3NhZ2U8TW9uc3Rlcj4sIGZsYXRidWZmZXJzOjpncnBjOjpNZXNzYWdlPFN0YXQ+Pjo6Q3JlYXRlKGNoYW5uZWxfLmdldCgpLCBycGNtZXRob2RfR2V0TWluTWF4SGl0UG9pbnRzXywgY29udGV4dCk7Cit9CisKKzo6Z3JwYzo6Q2xpZW50QXN5bmNSZWFkZXJXcml0ZXI8IGZsYXRidWZmZXJzOjpncnBjOjpNZXNzYWdlPE1vbnN0ZXI+LCBmbGF0YnVmZmVyczo6Z3JwYzo6TWVzc2FnZTxTdGF0Pj4qIE1vbnN0ZXJTdG9yYWdlOjpTdHViOjpBc3luY0dldE1pbk1heEhpdFBvaW50c1Jhdyg6OmdycGM6OkNsaWVudENvbnRleHQqIGNvbnRleHQsIDo6Z3JwYzo6Q29tcGxldGlvblF1ZXVlKiBjcSwgdm9pZCogdGFnKSB7CisgIHJldHVybiA6OmdycGM6OmludGVybmFsOjpDbGllbnRBc3luY1JlYWRlcldyaXRlckZhY3Rvcnk8IGZsYXRidWZmZXJzOjpncnBjOjpNZXNzYWdlPE1vbnN0ZXI+LCBmbGF0YnVmZmVyczo6Z3JwYzo6TWVzc2FnZTxTdGF0Pj46OkNyZWF0ZShjaGFubmVsXy5nZXQoKSwgY3EsIHJwY21ldGhvZF9HZXRNaW5NYXhIaXRQb2ludHNfLCBjb250ZXh0LCB0cnVlLCB0YWcpOworfQorCis6OmdycGM6OkNsaWVudEFzeW5jUmVhZGVyV3JpdGVyPCBmbGF0YnVmZmVyczo6Z3JwYzo6TWVzc2FnZTxNb25zdGVyPiwgZmxhdGJ1ZmZlcnM6OmdycGM6Ok1lc3NhZ2U8U3RhdD4+KiBNb25zdGVyU3RvcmFnZTo6U3R1Yjo6UHJlcGFyZUFzeW5jR2V0TWluTWF4SGl0UG9pbnRzUmF3KDo6Z3JwYzo6Q2xpZW50Q29udGV4dCogY29udGV4dCwgOjpncnBjOjpDb21wbGV0aW9uUXVldWUqIGNxKSB7CisgIHJldHVybiA6OmdycGM6OmludGVybmFsOjpDbGllbnRBc3luY1JlYWRlcldyaXRlckZhY3Rvcnk8IGZsYXRidWZmZXJzOjpncnBjOjpNZXNzYWdlPE1vbnN0ZXI+LCBmbGF0YnVmZmVyczo6Z3JwYzo6TWVzc2FnZTxTdGF0Pj46OkNyZWF0ZShjaGFubmVsXy5nZXQoKSwgY3EsIHJwY21ldGhvZF9HZXRNaW5NYXhIaXRQb2ludHNfLCBjb250ZXh0LCBmYWxzZSwgbnVsbHB0cik7Cit9CisKK01vbnN0ZXJTdG9yYWdlOjpTZXJ2aWNlOjpTZXJ2aWNlKCkgeworICBBZGRNZXRob2QobmV3IDo6Z3JwYzo6aW50ZXJuYWw6OlJwY1NlcnZpY2VNZXRob2QoCisgICAgICBNb25zdGVyU3RvcmFnZV9tZXRob2RfbmFtZXNbMF0sCisgICAgICA6OmdycGM6OmludGVybmFsOjpScGNNZXRob2Q6Ok5PUk1BTF9SUEMsCisgICAgICBuZXcgOjpncnBjOjppbnRlcm5hbDo6UnBjTWV0aG9kSGFuZGxlcjwgTW9uc3RlclN0b3JhZ2U6OlNlcnZpY2UsIGZsYXRidWZmZXJzOjpncnBjOjpNZXNzYWdlPE1vbnN0ZXI+LCBmbGF0YnVmZmVyczo6Z3JwYzo6TWVzc2FnZTxTdGF0Pj4oCisgICAgICAgICAgc3RkOjptZW1fZm4oJk1vbnN0ZXJTdG9yYWdlOjpTZXJ2aWNlOjpTdG9yZSksIHRoaXMpKSk7CisgIEFkZE1ldGhvZChuZXcgOjpncnBjOjppbnRlcm5hbDo6UnBjU2VydmljZU1ldGhvZCgKKyAgICAgIE1vbnN0ZXJTdG9yYWdlX21ldGhvZF9uYW1lc1sxXSwKKyAgICAgIDo6Z3JwYzo6aW50ZXJuYWw6OlJwY01ldGhvZDo6U0VSVkVSX1NUUkVBTUlORywKKyAgICAgIG5ldyA6OmdycGM6OmludGVybmFsOjpTZXJ2ZXJTdHJlYW1pbmdIYW5kbGVyPCBNb25zdGVyU3RvcmFnZTo6U2VydmljZSwgZmxhdGJ1ZmZlcnM6OmdycGM6Ok1lc3NhZ2U8U3RhdD4sIGZsYXRidWZmZXJzOjpncnBjOjpNZXNzYWdlPE1vbnN0ZXI+PigKKyAgICAgICAgICBzdGQ6Om1lbV9mbigmTW9uc3RlclN0b3JhZ2U6OlNlcnZpY2U6OlJldHJpZXZlKSwgdGhpcykpKTsKKyAgQWRkTWV0aG9kKG5ldyA6OmdycGM6OmludGVybmFsOjpScGNTZXJ2aWNlTWV0aG9kKAorICAgICAgTW9uc3RlclN0b3JhZ2VfbWV0aG9kX25hbWVzWzJdLAorICAgICAgOjpncnBjOjppbnRlcm5hbDo6UnBjTWV0aG9kOjpDTElFTlRfU1RSRUFNSU5HLAorICAgICAgbmV3IDo6Z3JwYzo6aW50ZXJuYWw6OkNsaWVudFN0cmVhbWluZ0hhbmRsZXI8IE1vbnN0ZXJTdG9yYWdlOjpTZXJ2aWNlLCBmbGF0YnVmZmVyczo6Z3JwYzo6TWVzc2FnZTxNb25zdGVyPiwgZmxhdGJ1ZmZlcnM6OmdycGM6Ok1lc3NhZ2U8U3RhdD4+KAorICAgICAgICAgIHN0ZDo6bWVtX2ZuKCZNb25zdGVyU3RvcmFnZTo6U2VydmljZTo6R2V0TWF4SGl0UG9pbnQpLCB0aGlzKSkpOworICBBZGRNZXRob2QobmV3IDo6Z3JwYzo6aW50ZXJuYWw6OlJwY1NlcnZpY2VNZXRob2QoCisgICAgICBNb25zdGVyU3RvcmFnZV9tZXRob2RfbmFtZXNbM10sCisgICAgICA6OmdycGM6OmludGVybmFsOjpScGNNZXRob2Q6OkJJRElfU1RSRUFNSU5HLAorICAgICAgbmV3IDo6Z3JwYzo6aW50ZXJuYWw6OkJpZGlTdHJlYW1pbmdIYW5kbGVyPCBNb25zdGVyU3RvcmFnZTo6U2VydmljZSwgZmxhdGJ1ZmZlcnM6OmdycGM6Ok1lc3NhZ2U8TW9uc3Rlcj4sIGZsYXRidWZmZXJzOjpncnBjOjpNZXNzYWdlPFN0YXQ+PigKKyAgICAgICAgICBzdGQ6Om1lbV9mbigmTW9uc3RlclN0b3JhZ2U6OlNlcnZpY2U6OkdldE1pbk1heEhpdFBvaW50cyksIHRoaXMpKSk7Cit9CisKK01vbnN0ZXJTdG9yYWdlOjpTZXJ2aWNlOjp+U2VydmljZSgpIHsKK30KKworOjpncnBjOjpTdGF0dXMgTW9uc3RlclN0b3JhZ2U6OlNlcnZpY2U6OlN0b3JlKDo6Z3JwYzo6U2VydmVyQ29udGV4dCogLypjb250ZXh0Ki8sIGNvbnN0IGZsYXRidWZmZXJzOjpncnBjOjpNZXNzYWdlPE1vbnN0ZXI+KiAvKnJlcXVlc3QqLywgZmxhdGJ1ZmZlcnM6OmdycGM6Ok1lc3NhZ2U8U3RhdD4qIC8qcmVzcG9uc2UqLykgeworICByZXR1cm4gOjpncnBjOjpTdGF0dXMoOjpncnBjOjpTdGF0dXNDb2RlOjpVTklNUExFTUVOVEVELCAiIik7Cit9CisKKzo6Z3JwYzo6U3RhdHVzIE1vbnN0ZXJTdG9yYWdlOjpTZXJ2aWNlOjpSZXRyaWV2ZSg6OmdycGM6OlNlcnZlckNvbnRleHQqIC8qY29udGV4dCovLCBjb25zdCBmbGF0YnVmZmVyczo6Z3JwYzo6TWVzc2FnZTxTdGF0PiogLypyZXF1ZXN0Ki8sIDo6Z3JwYzo6U2VydmVyV3JpdGVyPCBmbGF0YnVmZmVyczo6Z3JwYzo6TWVzc2FnZTxNb25zdGVyPj4qIC8qd3JpdGVyKi8pIHsKKyAgcmV0dXJuIDo6Z3JwYzo6U3RhdHVzKDo6Z3JwYzo6U3RhdHVzQ29kZTo6VU5JTVBMRU1FTlRFRCwgIiIpOworfQorCis6OmdycGM6OlN0YXR1cyBNb25zdGVyU3RvcmFnZTo6U2VydmljZTo6R2V0TWF4SGl0UG9pbnQoOjpncnBjOjpTZXJ2ZXJDb250ZXh0KiAvKmNvbnRleHQqLywgOjpncnBjOjpTZXJ2ZXJSZWFkZXI8IGZsYXRidWZmZXJzOjpncnBjOjpNZXNzYWdlPE1vbnN0ZXI+PiogLypyZWFkZXIqLywgZmxhdGJ1ZmZlcnM6OmdycGM6Ok1lc3NhZ2U8U3RhdD4qIC8qcmVzcG9uc2UqLykgeworICByZXR1cm4gOjpncnBjOjpTdGF0dXMoOjpncnBjOjpTdGF0dXNDb2RlOjpVTklNUExFTUVOVEVELCAiIik7Cit9CisKKzo6Z3JwYzo6U3RhdHVzIE1vbnN0ZXJTdG9yYWdlOjpTZXJ2aWNlOjpHZXRNaW5NYXhIaXRQb2ludHMoOjpncnBjOjpTZXJ2ZXJDb250ZXh0KiAvKmNvbnRleHQqLywgOjpncnBjOjpTZXJ2ZXJSZWFkZXJXcml0ZXI8IGZsYXRidWZmZXJzOjpncnBjOjpNZXNzYWdlPFN0YXQ+LCBmbGF0YnVmZmVyczo6Z3JwYzo6TWVzc2FnZTxNb25zdGVyPj4qIC8qc3RyZWFtKi8pIHsKKyAgcmV0dXJuIDo6Z3JwYzo6U3RhdHVzKDo6Z3JwYzo6U3RhdHVzQ29kZTo6VU5JTVBMRU1FTlRFRCwgIiIpOworfQorCisKK30gIC8vIG5hbWVzcGFjZSBNeUdhbWUKK30gIC8vIG5hbWVzcGFjZSBFeGFtcGxlCisKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL21vbnN0ZXJfdGVzdF9zdWZmaXgvZXh0X29ubHkvbW9uc3Rlcl90ZXN0LmdycGMuZmIuaCBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL21vbnN0ZXJfdGVzdF9zdWZmaXgvZXh0X29ubHkvbW9uc3Rlcl90ZXN0LmdycGMuZmIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MzA1MDRlCi0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvbW9uc3Rlcl90ZXN0X3N1ZmZpeC9leHRfb25seS9tb25zdGVyX3Rlc3QuZ3JwYy5mYi5oCkBAIC0wLDAgKzEsMzUwIEBACisvLyBHZW5lcmF0ZWQgYnkgdGhlIGdSUEMgQysrIHBsdWdpbi4KKy8vIElmIHlvdSBtYWtlIGFueSBsb2NhbCBjaGFuZ2UsIHRoZXkgd2lsbCBiZSBsb3N0LgorLy8gc291cmNlOiBtb25zdGVyX3Rlc3QKKyNpZm5kZWYgR1JQQ19tb25zdGVyXzVmdGVzdF9fSU5DTFVERUQKKyNkZWZpbmUgR1JQQ19tb25zdGVyXzVmdGVzdF9fSU5DTFVERUQKKworI2luY2x1ZGUgIm1vbnN0ZXJfdGVzdF9nZW5lcmF0ZWQuaHBwIgorI2luY2x1ZGUgImZsYXRidWZmZXJzL2dycGMuaCIKKworI2luY2x1ZGUgPGdycGNwcC9pbXBsL2NvZGVnZW4vYXN5bmNfc3RyZWFtLmg+CisjaW5jbHVkZSA8Z3JwY3BwL2ltcGwvY29kZWdlbi9hc3luY191bmFyeV9jYWxsLmg+CisjaW5jbHVkZSA8Z3JwY3BwL2ltcGwvY29kZWdlbi9tZXRob2RfaGFuZGxlci5oPgorI2luY2x1ZGUgPGdycGNwcC9pbXBsL2NvZGVnZW4vcHJvdG9fdXRpbHMuaD4KKyNpbmNsdWRlIDxncnBjcHAvaW1wbC9jb2RlZ2VuL3JwY19tZXRob2QuaD4KKyNpbmNsdWRlIDxncnBjcHAvaW1wbC9jb2RlZ2VuL3NlcnZpY2VfdHlwZS5oPgorI2luY2x1ZGUgPGdycGNwcC9pbXBsL2NvZGVnZW4vc3RhdHVzLmg+CisjaW5jbHVkZSA8Z3JwY3BwL2ltcGwvY29kZWdlbi9zdHViX29wdGlvbnMuaD4KKyNpbmNsdWRlIDxncnBjcHAvaW1wbC9jb2RlZ2VuL3N5bmNfc3RyZWFtLmg+CisKK25hbWVzcGFjZSBncnBjIHsKK2NsYXNzIENvbXBsZXRpb25RdWV1ZTsKK2NsYXNzIENoYW5uZWw7CitjbGFzcyBTZXJ2ZXJDb21wbGV0aW9uUXVldWU7CitjbGFzcyBTZXJ2ZXJDb250ZXh0OworfSAgLy8gbmFtZXNwYWNlIGdycGMKKworbmFtZXNwYWNlIE15R2FtZSB7CituYW1lc3BhY2UgRXhhbXBsZSB7CisKK2NsYXNzIE1vbnN0ZXJTdG9yYWdlIGZpbmFsIHsKKyBwdWJsaWM6CisgIHN0YXRpYyBjb25zdGV4cHIgY2hhciBjb25zdCogc2VydmljZV9mdWxsX25hbWUoKSB7CisgICAgcmV0dXJuICJNeUdhbWUuRXhhbXBsZS5Nb25zdGVyU3RvcmFnZSI7CisgIH0KKyAgY2xhc3MgU3R1YkludGVyZmFjZSB7CisgICBwdWJsaWM6CisgICAgdmlydHVhbCB+U3R1YkludGVyZmFjZSgpIHt9CisgICAgdmlydHVhbCA6OmdycGM6OlN0YXR1cyBTdG9yZSg6OmdycGM6OkNsaWVudENvbnRleHQqIGNvbnRleHQsIGNvbnN0IGZsYXRidWZmZXJzOjpncnBjOjpNZXNzYWdlPE1vbnN0ZXI+JiByZXF1ZXN0LCBmbGF0YnVmZmVyczo6Z3JwYzo6TWVzc2FnZTxTdGF0PiogcmVzcG9uc2UpID0gMDsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8IDo6Z3JwYzo6Q2xpZW50QXN5bmNSZXNwb25zZVJlYWRlckludGVyZmFjZTwgZmxhdGJ1ZmZlcnM6OmdycGM6Ok1lc3NhZ2U8U3RhdD4+PiBBc3luY1N0b3JlKDo6Z3JwYzo6Q2xpZW50Q29udGV4dCogY29udGV4dCwgY29uc3QgZmxhdGJ1ZmZlcnM6OmdycGM6Ok1lc3NhZ2U8TW9uc3Rlcj4mIHJlcXVlc3QsIDo6Z3JwYzo6Q29tcGxldGlvblF1ZXVlKiBjcSkgeworICAgICAgcmV0dXJuIHN0ZDo6dW5pcXVlX3B0cjwgOjpncnBjOjpDbGllbnRBc3luY1Jlc3BvbnNlUmVhZGVySW50ZXJmYWNlPCBmbGF0YnVmZmVyczo6Z3JwYzo6TWVzc2FnZTxTdGF0Pj4+KEFzeW5jU3RvcmVSYXcoY29udGV4dCwgcmVxdWVzdCwgY3EpKTsKKyAgICB9CisgICAgc3RkOjp1bmlxdWVfcHRyPCA6OmdycGM6OkNsaWVudEFzeW5jUmVzcG9uc2VSZWFkZXJJbnRlcmZhY2U8IGZsYXRidWZmZXJzOjpncnBjOjpNZXNzYWdlPFN0YXQ+Pj4gUHJlcGFyZUFzeW5jU3RvcmUoOjpncnBjOjpDbGllbnRDb250ZXh0KiBjb250ZXh0LCBjb25zdCBmbGF0YnVmZmVyczo6Z3JwYzo6TWVzc2FnZTxNb25zdGVyPiYgcmVxdWVzdCwgOjpncnBjOjpDb21wbGV0aW9uUXVldWUqIGNxKSB7CisgICAgICByZXR1cm4gc3RkOjp1bmlxdWVfcHRyPCA6OmdycGM6OkNsaWVudEFzeW5jUmVzcG9uc2VSZWFkZXJJbnRlcmZhY2U8IGZsYXRidWZmZXJzOjpncnBjOjpNZXNzYWdlPFN0YXQ+Pj4oUHJlcGFyZUFzeW5jU3RvcmVSYXcoY29udGV4dCwgcmVxdWVzdCwgY3EpKTsKKyAgICB9CisgICAgc3RkOjp1bmlxdWVfcHRyPCA6OmdycGM6OkNsaWVudFJlYWRlckludGVyZmFjZTwgZmxhdGJ1ZmZlcnM6OmdycGM6Ok1lc3NhZ2U8TW9uc3Rlcj4+PiBSZXRyaWV2ZSg6OmdycGM6OkNsaWVudENvbnRleHQqIGNvbnRleHQsIGNvbnN0IGZsYXRidWZmZXJzOjpncnBjOjpNZXNzYWdlPFN0YXQ+JiByZXF1ZXN0KSB7CisgICAgICByZXR1cm4gc3RkOjp1bmlxdWVfcHRyPCA6OmdycGM6OkNsaWVudFJlYWRlckludGVyZmFjZTwgZmxhdGJ1ZmZlcnM6OmdycGM6Ok1lc3NhZ2U8TW9uc3Rlcj4+PihSZXRyaWV2ZVJhdyhjb250ZXh0LCByZXF1ZXN0KSk7CisgICAgfQorICAgIHN0ZDo6dW5pcXVlX3B0cjwgOjpncnBjOjpDbGllbnRBc3luY1JlYWRlckludGVyZmFjZTwgZmxhdGJ1ZmZlcnM6OmdycGM6Ok1lc3NhZ2U8TW9uc3Rlcj4+PiBBc3luY1JldHJpZXZlKDo6Z3JwYzo6Q2xpZW50Q29udGV4dCogY29udGV4dCwgY29uc3QgZmxhdGJ1ZmZlcnM6OmdycGM6Ok1lc3NhZ2U8U3RhdD4mIHJlcXVlc3QsIDo6Z3JwYzo6Q29tcGxldGlvblF1ZXVlKiBjcSwgdm9pZCogdGFnKSB7CisgICAgICByZXR1cm4gc3RkOjp1bmlxdWVfcHRyPCA6OmdycGM6OkNsaWVudEFzeW5jUmVhZGVySW50ZXJmYWNlPCBmbGF0YnVmZmVyczo6Z3JwYzo6TWVzc2FnZTxNb25zdGVyPj4+KEFzeW5jUmV0cmlldmVSYXcoY29udGV4dCwgcmVxdWVzdCwgY3EsIHRhZykpOworICAgIH0KKyAgICBzdGQ6OnVuaXF1ZV9wdHI8IDo6Z3JwYzo6Q2xpZW50QXN5bmNSZWFkZXJJbnRlcmZhY2U8IGZsYXRidWZmZXJzOjpncnBjOjpNZXNzYWdlPE1vbnN0ZXI+Pj4gUHJlcGFyZUFzeW5jUmV0cmlldmUoOjpncnBjOjpDbGllbnRDb250ZXh0KiBjb250ZXh0LCBjb25zdCBmbGF0YnVmZmVyczo6Z3JwYzo6TWVzc2FnZTxTdGF0PiYgcmVxdWVzdCwgOjpncnBjOjpDb21wbGV0aW9uUXVldWUqIGNxKSB7CisgICAgICByZXR1cm4gc3RkOjp1bmlxdWVfcHRyPCA6OmdycGM6OkNsaWVudEFzeW5jUmVhZGVySW50ZXJmYWNlPCBmbGF0YnVmZmVyczo6Z3JwYzo6TWVzc2FnZTxNb25zdGVyPj4+KFByZXBhcmVBc3luY1JldHJpZXZlUmF3KGNvbnRleHQsIHJlcXVlc3QsIGNxKSk7CisgICAgfQorICAgIHN0ZDo6dW5pcXVlX3B0cjwgOjpncnBjOjpDbGllbnRXcml0ZXJJbnRlcmZhY2U8IGZsYXRidWZmZXJzOjpncnBjOjpNZXNzYWdlPE1vbnN0ZXI+Pj4gR2V0TWF4SGl0UG9pbnQoOjpncnBjOjpDbGllbnRDb250ZXh0KiBjb250ZXh0LCBmbGF0YnVmZmVyczo6Z3JwYzo6TWVzc2FnZTxTdGF0PiogcmVzcG9uc2UpIHsKKyAgICAgIHJldHVybiBzdGQ6OnVuaXF1ZV9wdHI8IDo6Z3JwYzo6Q2xpZW50V3JpdGVySW50ZXJmYWNlPCBmbGF0YnVmZmVyczo6Z3JwYzo6TWVzc2FnZTxNb25zdGVyPj4+KEdldE1heEhpdFBvaW50UmF3KGNvbnRleHQsIHJlc3BvbnNlKSk7CisgICAgfQorICAgIHN0ZDo6dW5pcXVlX3B0cjwgOjpncnBjOjpDbGllbnRBc3luY1dyaXRlckludGVyZmFjZTwgZmxhdGJ1ZmZlcnM6OmdycGM6Ok1lc3NhZ2U8TW9uc3Rlcj4+PiBBc3luY0dldE1heEhpdFBvaW50KDo6Z3JwYzo6Q2xpZW50Q29udGV4dCogY29udGV4dCwgZmxhdGJ1ZmZlcnM6OmdycGM6Ok1lc3NhZ2U8U3RhdD4qIHJlc3BvbnNlLCA6OmdycGM6OkNvbXBsZXRpb25RdWV1ZSogY3EsIHZvaWQqIHRhZykgeworICAgICAgcmV0dXJuIHN0ZDo6dW5pcXVlX3B0cjwgOjpncnBjOjpDbGllbnRBc3luY1dyaXRlckludGVyZmFjZTwgZmxhdGJ1ZmZlcnM6OmdycGM6Ok1lc3NhZ2U8TW9uc3Rlcj4+PihBc3luY0dldE1heEhpdFBvaW50UmF3KGNvbnRleHQsIHJlc3BvbnNlLCBjcSwgdGFnKSk7CisgICAgfQorICAgIHN0ZDo6dW5pcXVlX3B0cjwgOjpncnBjOjpDbGllbnRBc3luY1dyaXRlckludGVyZmFjZTwgZmxhdGJ1ZmZlcnM6OmdycGM6Ok1lc3NhZ2U8TW9uc3Rlcj4+PiBQcmVwYXJlQXN5bmNHZXRNYXhIaXRQb2ludCg6OmdycGM6OkNsaWVudENvbnRleHQqIGNvbnRleHQsIGZsYXRidWZmZXJzOjpncnBjOjpNZXNzYWdlPFN0YXQ+KiByZXNwb25zZSwgOjpncnBjOjpDb21wbGV0aW9uUXVldWUqIGNxKSB7CisgICAgICByZXR1cm4gc3RkOjp1bmlxdWVfcHRyPCA6OmdycGM6OkNsaWVudEFzeW5jV3JpdGVySW50ZXJmYWNlPCBmbGF0YnVmZmVyczo6Z3JwYzo6TWVzc2FnZTxNb25zdGVyPj4+KFByZXBhcmVBc3luY0dldE1heEhpdFBvaW50UmF3KGNvbnRleHQsIHJlc3BvbnNlLCBjcSkpOworICAgIH0KKyAgICBzdGQ6OnVuaXF1ZV9wdHI8IDo6Z3JwYzo6Q2xpZW50UmVhZGVyV3JpdGVySW50ZXJmYWNlPCBmbGF0YnVmZmVyczo6Z3JwYzo6TWVzc2FnZTxNb25zdGVyPiwgZmxhdGJ1ZmZlcnM6OmdycGM6Ok1lc3NhZ2U8U3RhdD4+PiBHZXRNaW5NYXhIaXRQb2ludHMoOjpncnBjOjpDbGllbnRDb250ZXh0KiBjb250ZXh0KSB7CisgICAgICByZXR1cm4gc3RkOjp1bmlxdWVfcHRyPCA6OmdycGM6OkNsaWVudFJlYWRlcldyaXRlckludGVyZmFjZTwgZmxhdGJ1ZmZlcnM6OmdycGM6Ok1lc3NhZ2U8TW9uc3Rlcj4sIGZsYXRidWZmZXJzOjpncnBjOjpNZXNzYWdlPFN0YXQ+Pj4oR2V0TWluTWF4SGl0UG9pbnRzUmF3KGNvbnRleHQpKTsKKyAgICB9CisgICAgc3RkOjp1bmlxdWVfcHRyPCA6OmdycGM6OkNsaWVudEFzeW5jUmVhZGVyV3JpdGVySW50ZXJmYWNlPCBmbGF0YnVmZmVyczo6Z3JwYzo6TWVzc2FnZTxNb25zdGVyPiwgZmxhdGJ1ZmZlcnM6OmdycGM6Ok1lc3NhZ2U8U3RhdD4+PiBBc3luY0dldE1pbk1heEhpdFBvaW50cyg6OmdycGM6OkNsaWVudENvbnRleHQqIGNvbnRleHQsIDo6Z3JwYzo6Q29tcGxldGlvblF1ZXVlKiBjcSwgdm9pZCogdGFnKSB7CisgICAgICByZXR1cm4gc3RkOjp1bmlxdWVfcHRyPCA6OmdycGM6OkNsaWVudEFzeW5jUmVhZGVyV3JpdGVySW50ZXJmYWNlPCBmbGF0YnVmZmVyczo6Z3JwYzo6TWVzc2FnZTxNb25zdGVyPiwgZmxhdGJ1ZmZlcnM6OmdycGM6Ok1lc3NhZ2U8U3RhdD4+PihBc3luY0dldE1pbk1heEhpdFBvaW50c1Jhdyhjb250ZXh0LCBjcSwgdGFnKSk7CisgICAgfQorICAgIHN0ZDo6dW5pcXVlX3B0cjwgOjpncnBjOjpDbGllbnRBc3luY1JlYWRlcldyaXRlckludGVyZmFjZTwgZmxhdGJ1ZmZlcnM6OmdycGM6Ok1lc3NhZ2U8TW9uc3Rlcj4sIGZsYXRidWZmZXJzOjpncnBjOjpNZXNzYWdlPFN0YXQ+Pj4gUHJlcGFyZUFzeW5jR2V0TWluTWF4SGl0UG9pbnRzKDo6Z3JwYzo6Q2xpZW50Q29udGV4dCogY29udGV4dCwgOjpncnBjOjpDb21wbGV0aW9uUXVldWUqIGNxKSB7CisgICAgICByZXR1cm4gc3RkOjp1bmlxdWVfcHRyPCA6OmdycGM6OkNsaWVudEFzeW5jUmVhZGVyV3JpdGVySW50ZXJmYWNlPCBmbGF0YnVmZmVyczo6Z3JwYzo6TWVzc2FnZTxNb25zdGVyPiwgZmxhdGJ1ZmZlcnM6OmdycGM6Ok1lc3NhZ2U8U3RhdD4+PihQcmVwYXJlQXN5bmNHZXRNaW5NYXhIaXRQb2ludHNSYXcoY29udGV4dCwgY3EpKTsKKyAgICB9CisgIHByaXZhdGU6CisgICAgdmlydHVhbCA6OmdycGM6OkNsaWVudEFzeW5jUmVzcG9uc2VSZWFkZXJJbnRlcmZhY2U8IGZsYXRidWZmZXJzOjpncnBjOjpNZXNzYWdlPFN0YXQ+PiogQXN5bmNTdG9yZVJhdyg6OmdycGM6OkNsaWVudENvbnRleHQqIGNvbnRleHQsIGNvbnN0IGZsYXRidWZmZXJzOjpncnBjOjpNZXNzYWdlPE1vbnN0ZXI+JiByZXF1ZXN0LCA6OmdycGM6OkNvbXBsZXRpb25RdWV1ZSogY3EpID0gMDsKKyAgICB2aXJ0dWFsIDo6Z3JwYzo6Q2xpZW50QXN5bmNSZXNwb25zZVJlYWRlckludGVyZmFjZTwgZmxhdGJ1ZmZlcnM6OmdycGM6Ok1lc3NhZ2U8U3RhdD4+KiBQcmVwYXJlQXN5bmNTdG9yZVJhdyg6OmdycGM6OkNsaWVudENvbnRleHQqIGNvbnRleHQsIGNvbnN0IGZsYXRidWZmZXJzOjpncnBjOjpNZXNzYWdlPE1vbnN0ZXI+JiByZXF1ZXN0LCA6OmdycGM6OkNvbXBsZXRpb25RdWV1ZSogY3EpID0gMDsKKyAgICB2aXJ0dWFsIDo6Z3JwYzo6Q2xpZW50UmVhZGVySW50ZXJmYWNlPCBmbGF0YnVmZmVyczo6Z3JwYzo6TWVzc2FnZTxNb25zdGVyPj4qIFJldHJpZXZlUmF3KDo6Z3JwYzo6Q2xpZW50Q29udGV4dCogY29udGV4dCwgY29uc3QgZmxhdGJ1ZmZlcnM6OmdycGM6Ok1lc3NhZ2U8U3RhdD4mIHJlcXVlc3QpID0gMDsKKyAgICB2aXJ0dWFsIDo6Z3JwYzo6Q2xpZW50QXN5bmNSZWFkZXJJbnRlcmZhY2U8IGZsYXRidWZmZXJzOjpncnBjOjpNZXNzYWdlPE1vbnN0ZXI+PiogQXN5bmNSZXRyaWV2ZVJhdyg6OmdycGM6OkNsaWVudENvbnRleHQqIGNvbnRleHQsIGNvbnN0IGZsYXRidWZmZXJzOjpncnBjOjpNZXNzYWdlPFN0YXQ+JiByZXF1ZXN0LCA6OmdycGM6OkNvbXBsZXRpb25RdWV1ZSogY3EsIHZvaWQqIHRhZykgPSAwOworICAgIHZpcnR1YWwgOjpncnBjOjpDbGllbnRBc3luY1JlYWRlckludGVyZmFjZTwgZmxhdGJ1ZmZlcnM6OmdycGM6Ok1lc3NhZ2U8TW9uc3Rlcj4+KiBQcmVwYXJlQXN5bmNSZXRyaWV2ZVJhdyg6OmdycGM6OkNsaWVudENvbnRleHQqIGNvbnRleHQsIGNvbnN0IGZsYXRidWZmZXJzOjpncnBjOjpNZXNzYWdlPFN0YXQ+JiByZXF1ZXN0LCA6OmdycGM6OkNvbXBsZXRpb25RdWV1ZSogY3EpID0gMDsKKyAgICB2aXJ0dWFsIDo6Z3JwYzo6Q2xpZW50V3JpdGVySW50ZXJmYWNlPCBmbGF0YnVmZmVyczo6Z3JwYzo6TWVzc2FnZTxNb25zdGVyPj4qIEdldE1heEhpdFBvaW50UmF3KDo6Z3JwYzo6Q2xpZW50Q29udGV4dCogY29udGV4dCwgZmxhdGJ1ZmZlcnM6OmdycGM6Ok1lc3NhZ2U8U3RhdD4qIHJlc3BvbnNlKSA9IDA7CisgICAgdmlydHVhbCA6OmdycGM6OkNsaWVudEFzeW5jV3JpdGVySW50ZXJmYWNlPCBmbGF0YnVmZmVyczo6Z3JwYzo6TWVzc2FnZTxNb25zdGVyPj4qIEFzeW5jR2V0TWF4SGl0UG9pbnRSYXcoOjpncnBjOjpDbGllbnRDb250ZXh0KiBjb250ZXh0LCBmbGF0YnVmZmVyczo6Z3JwYzo6TWVzc2FnZTxTdGF0PiogcmVzcG9uc2UsIDo6Z3JwYzo6Q29tcGxldGlvblF1ZXVlKiBjcSwgdm9pZCogdGFnKSA9IDA7CisgICAgdmlydHVhbCA6OmdycGM6OkNsaWVudEFzeW5jV3JpdGVySW50ZXJmYWNlPCBmbGF0YnVmZmVyczo6Z3JwYzo6TWVzc2FnZTxNb25zdGVyPj4qIFByZXBhcmVBc3luY0dldE1heEhpdFBvaW50UmF3KDo6Z3JwYzo6Q2xpZW50Q29udGV4dCogY29udGV4dCwgZmxhdGJ1ZmZlcnM6OmdycGM6Ok1lc3NhZ2U8U3RhdD4qIHJlc3BvbnNlLCA6OmdycGM6OkNvbXBsZXRpb25RdWV1ZSogY3EpID0gMDsKKyAgICB2aXJ0dWFsIDo6Z3JwYzo6Q2xpZW50UmVhZGVyV3JpdGVySW50ZXJmYWNlPCBmbGF0YnVmZmVyczo6Z3JwYzo6TWVzc2FnZTxNb25zdGVyPiwgZmxhdGJ1ZmZlcnM6OmdycGM6Ok1lc3NhZ2U8U3RhdD4+KiBHZXRNaW5NYXhIaXRQb2ludHNSYXcoOjpncnBjOjpDbGllbnRDb250ZXh0KiBjb250ZXh0KSA9IDA7CisgICAgdmlydHVhbCA6OmdycGM6OkNsaWVudEFzeW5jUmVhZGVyV3JpdGVySW50ZXJmYWNlPCBmbGF0YnVmZmVyczo6Z3JwYzo6TWVzc2FnZTxNb25zdGVyPiwgZmxhdGJ1ZmZlcnM6OmdycGM6Ok1lc3NhZ2U8U3RhdD4+KiBBc3luY0dldE1pbk1heEhpdFBvaW50c1Jhdyg6OmdycGM6OkNsaWVudENvbnRleHQqIGNvbnRleHQsIDo6Z3JwYzo6Q29tcGxldGlvblF1ZXVlKiBjcSwgdm9pZCogdGFnKSA9IDA7CisgICAgdmlydHVhbCA6OmdycGM6OkNsaWVudEFzeW5jUmVhZGVyV3JpdGVySW50ZXJmYWNlPCBmbGF0YnVmZmVyczo6Z3JwYzo6TWVzc2FnZTxNb25zdGVyPiwgZmxhdGJ1ZmZlcnM6OmdycGM6Ok1lc3NhZ2U8U3RhdD4+KiBQcmVwYXJlQXN5bmNHZXRNaW5NYXhIaXRQb2ludHNSYXcoOjpncnBjOjpDbGllbnRDb250ZXh0KiBjb250ZXh0LCA6OmdycGM6OkNvbXBsZXRpb25RdWV1ZSogY3EpID0gMDsKKyAgfTsKKyAgY2xhc3MgU3R1YiBmaW5hbCA6IHB1YmxpYyBTdHViSW50ZXJmYWNlIHsKKyAgIHB1YmxpYzoKKyAgICBTdHViKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjwgOjpncnBjOjpDaGFubmVsSW50ZXJmYWNlPiYgY2hhbm5lbCk7CisgICAgOjpncnBjOjpTdGF0dXMgU3RvcmUoOjpncnBjOjpDbGllbnRDb250ZXh0KiBjb250ZXh0LCBjb25zdCBmbGF0YnVmZmVyczo6Z3JwYzo6TWVzc2FnZTxNb25zdGVyPiYgcmVxdWVzdCwgZmxhdGJ1ZmZlcnM6OmdycGM6Ok1lc3NhZ2U8U3RhdD4qIHJlc3BvbnNlKSBvdmVycmlkZTsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8IDo6Z3JwYzo6Q2xpZW50QXN5bmNSZXNwb25zZVJlYWRlcjwgZmxhdGJ1ZmZlcnM6OmdycGM6Ok1lc3NhZ2U8U3RhdD4+PiBBc3luY1N0b3JlKDo6Z3JwYzo6Q2xpZW50Q29udGV4dCogY29udGV4dCwgY29uc3QgZmxhdGJ1ZmZlcnM6OmdycGM6Ok1lc3NhZ2U8TW9uc3Rlcj4mIHJlcXVlc3QsIDo6Z3JwYzo6Q29tcGxldGlvblF1ZXVlKiBjcSkgeworICAgICAgcmV0dXJuIHN0ZDo6dW5pcXVlX3B0cjwgOjpncnBjOjpDbGllbnRBc3luY1Jlc3BvbnNlUmVhZGVyPCBmbGF0YnVmZmVyczo6Z3JwYzo6TWVzc2FnZTxTdGF0Pj4+KEFzeW5jU3RvcmVSYXcoY29udGV4dCwgcmVxdWVzdCwgY3EpKTsKKyAgICB9CisgICAgc3RkOjp1bmlxdWVfcHRyPCA6OmdycGM6OkNsaWVudEFzeW5jUmVzcG9uc2VSZWFkZXI8IGZsYXRidWZmZXJzOjpncnBjOjpNZXNzYWdlPFN0YXQ+Pj4gUHJlcGFyZUFzeW5jU3RvcmUoOjpncnBjOjpDbGllbnRDb250ZXh0KiBjb250ZXh0LCBjb25zdCBmbGF0YnVmZmVyczo6Z3JwYzo6TWVzc2FnZTxNb25zdGVyPiYgcmVxdWVzdCwgOjpncnBjOjpDb21wbGV0aW9uUXVldWUqIGNxKSB7CisgICAgICByZXR1cm4gc3RkOjp1bmlxdWVfcHRyPCA6OmdycGM6OkNsaWVudEFzeW5jUmVzcG9uc2VSZWFkZXI8IGZsYXRidWZmZXJzOjpncnBjOjpNZXNzYWdlPFN0YXQ+Pj4oUHJlcGFyZUFzeW5jU3RvcmVSYXcoY29udGV4dCwgcmVxdWVzdCwgY3EpKTsKKyAgICB9CisgICAgc3RkOjp1bmlxdWVfcHRyPCA6OmdycGM6OkNsaWVudFJlYWRlcjwgZmxhdGJ1ZmZlcnM6OmdycGM6Ok1lc3NhZ2U8TW9uc3Rlcj4+PiBSZXRyaWV2ZSg6OmdycGM6OkNsaWVudENvbnRleHQqIGNvbnRleHQsIGNvbnN0IGZsYXRidWZmZXJzOjpncnBjOjpNZXNzYWdlPFN0YXQ+JiByZXF1ZXN0KSB7CisgICAgICByZXR1cm4gc3RkOjp1bmlxdWVfcHRyPCA6OmdycGM6OkNsaWVudFJlYWRlcjwgZmxhdGJ1ZmZlcnM6OmdycGM6Ok1lc3NhZ2U8TW9uc3Rlcj4+PihSZXRyaWV2ZVJhdyhjb250ZXh0LCByZXF1ZXN0KSk7CisgICAgfQorICAgIHN0ZDo6dW5pcXVlX3B0cjwgOjpncnBjOjpDbGllbnRBc3luY1JlYWRlcjwgZmxhdGJ1ZmZlcnM6OmdycGM6Ok1lc3NhZ2U8TW9uc3Rlcj4+PiBBc3luY1JldHJpZXZlKDo6Z3JwYzo6Q2xpZW50Q29udGV4dCogY29udGV4dCwgY29uc3QgZmxhdGJ1ZmZlcnM6OmdycGM6Ok1lc3NhZ2U8U3RhdD4mIHJlcXVlc3QsIDo6Z3JwYzo6Q29tcGxldGlvblF1ZXVlKiBjcSwgdm9pZCogdGFnKSB7CisgICAgICByZXR1cm4gc3RkOjp1bmlxdWVfcHRyPCA6OmdycGM6OkNsaWVudEFzeW5jUmVhZGVyPCBmbGF0YnVmZmVyczo6Z3JwYzo6TWVzc2FnZTxNb25zdGVyPj4+KEFzeW5jUmV0cmlldmVSYXcoY29udGV4dCwgcmVxdWVzdCwgY3EsIHRhZykpOworICAgIH0KKyAgICBzdGQ6OnVuaXF1ZV9wdHI8IDo6Z3JwYzo6Q2xpZW50QXN5bmNSZWFkZXI8IGZsYXRidWZmZXJzOjpncnBjOjpNZXNzYWdlPE1vbnN0ZXI+Pj4gUHJlcGFyZUFzeW5jUmV0cmlldmUoOjpncnBjOjpDbGllbnRDb250ZXh0KiBjb250ZXh0LCBjb25zdCBmbGF0YnVmZmVyczo6Z3JwYzo6TWVzc2FnZTxTdGF0PiYgcmVxdWVzdCwgOjpncnBjOjpDb21wbGV0aW9uUXVldWUqIGNxKSB7CisgICAgICByZXR1cm4gc3RkOjp1bmlxdWVfcHRyPCA6OmdycGM6OkNsaWVudEFzeW5jUmVhZGVyPCBmbGF0YnVmZmVyczo6Z3JwYzo6TWVzc2FnZTxNb25zdGVyPj4+KFByZXBhcmVBc3luY1JldHJpZXZlUmF3KGNvbnRleHQsIHJlcXVlc3QsIGNxKSk7CisgICAgfQorICAgIHN0ZDo6dW5pcXVlX3B0cjwgOjpncnBjOjpDbGllbnRXcml0ZXI8IGZsYXRidWZmZXJzOjpncnBjOjpNZXNzYWdlPE1vbnN0ZXI+Pj4gR2V0TWF4SGl0UG9pbnQoOjpncnBjOjpDbGllbnRDb250ZXh0KiBjb250ZXh0LCBmbGF0YnVmZmVyczo6Z3JwYzo6TWVzc2FnZTxTdGF0PiogcmVzcG9uc2UpIHsKKyAgICAgIHJldHVybiBzdGQ6OnVuaXF1ZV9wdHI8IDo6Z3JwYzo6Q2xpZW50V3JpdGVyPCBmbGF0YnVmZmVyczo6Z3JwYzo6TWVzc2FnZTxNb25zdGVyPj4+KEdldE1heEhpdFBvaW50UmF3KGNvbnRleHQsIHJlc3BvbnNlKSk7CisgICAgfQorICAgIHN0ZDo6dW5pcXVlX3B0cjwgOjpncnBjOjpDbGllbnRBc3luY1dyaXRlcjwgZmxhdGJ1ZmZlcnM6OmdycGM6Ok1lc3NhZ2U8TW9uc3Rlcj4+PiBBc3luY0dldE1heEhpdFBvaW50KDo6Z3JwYzo6Q2xpZW50Q29udGV4dCogY29udGV4dCwgZmxhdGJ1ZmZlcnM6OmdycGM6Ok1lc3NhZ2U8U3RhdD4qIHJlc3BvbnNlLCA6OmdycGM6OkNvbXBsZXRpb25RdWV1ZSogY3EsIHZvaWQqIHRhZykgeworICAgICAgcmV0dXJuIHN0ZDo6dW5pcXVlX3B0cjwgOjpncnBjOjpDbGllbnRBc3luY1dyaXRlcjwgZmxhdGJ1ZmZlcnM6OmdycGM6Ok1lc3NhZ2U8TW9uc3Rlcj4+PihBc3luY0dldE1heEhpdFBvaW50UmF3KGNvbnRleHQsIHJlc3BvbnNlLCBjcSwgdGFnKSk7CisgICAgfQorICAgIHN0ZDo6dW5pcXVlX3B0cjwgOjpncnBjOjpDbGllbnRBc3luY1dyaXRlcjwgZmxhdGJ1ZmZlcnM6OmdycGM6Ok1lc3NhZ2U8TW9uc3Rlcj4+PiBQcmVwYXJlQXN5bmNHZXRNYXhIaXRQb2ludCg6OmdycGM6OkNsaWVudENvbnRleHQqIGNvbnRleHQsIGZsYXRidWZmZXJzOjpncnBjOjpNZXNzYWdlPFN0YXQ+KiByZXNwb25zZSwgOjpncnBjOjpDb21wbGV0aW9uUXVldWUqIGNxKSB7CisgICAgICByZXR1cm4gc3RkOjp1bmlxdWVfcHRyPCA6OmdycGM6OkNsaWVudEFzeW5jV3JpdGVyPCBmbGF0YnVmZmVyczo6Z3JwYzo6TWVzc2FnZTxNb25zdGVyPj4+KFByZXBhcmVBc3luY0dldE1heEhpdFBvaW50UmF3KGNvbnRleHQsIHJlc3BvbnNlLCBjcSkpOworICAgIH0KKyAgICBzdGQ6OnVuaXF1ZV9wdHI8IDo6Z3JwYzo6Q2xpZW50UmVhZGVyV3JpdGVyPCBmbGF0YnVmZmVyczo6Z3JwYzo6TWVzc2FnZTxNb25zdGVyPiwgZmxhdGJ1ZmZlcnM6OmdycGM6Ok1lc3NhZ2U8U3RhdD4+PiBHZXRNaW5NYXhIaXRQb2ludHMoOjpncnBjOjpDbGllbnRDb250ZXh0KiBjb250ZXh0KSB7CisgICAgICByZXR1cm4gc3RkOjp1bmlxdWVfcHRyPCA6OmdycGM6OkNsaWVudFJlYWRlcldyaXRlcjwgZmxhdGJ1ZmZlcnM6OmdycGM6Ok1lc3NhZ2U8TW9uc3Rlcj4sIGZsYXRidWZmZXJzOjpncnBjOjpNZXNzYWdlPFN0YXQ+Pj4oR2V0TWluTWF4SGl0UG9pbnRzUmF3KGNvbnRleHQpKTsKKyAgICB9CisgICAgc3RkOjp1bmlxdWVfcHRyPCAgOjpncnBjOjpDbGllbnRBc3luY1JlYWRlcldyaXRlcjwgZmxhdGJ1ZmZlcnM6OmdycGM6Ok1lc3NhZ2U8TW9uc3Rlcj4sIGZsYXRidWZmZXJzOjpncnBjOjpNZXNzYWdlPFN0YXQ+Pj4gQXN5bmNHZXRNaW5NYXhIaXRQb2ludHMoOjpncnBjOjpDbGllbnRDb250ZXh0KiBjb250ZXh0LCA6OmdycGM6OkNvbXBsZXRpb25RdWV1ZSogY3EsIHZvaWQqIHRhZykgeworICAgICAgcmV0dXJuIHN0ZDo6dW5pcXVlX3B0cjwgOjpncnBjOjpDbGllbnRBc3luY1JlYWRlcldyaXRlcjwgZmxhdGJ1ZmZlcnM6OmdycGM6Ok1lc3NhZ2U8TW9uc3Rlcj4sIGZsYXRidWZmZXJzOjpncnBjOjpNZXNzYWdlPFN0YXQ+Pj4oQXN5bmNHZXRNaW5NYXhIaXRQb2ludHNSYXcoY29udGV4dCwgY3EsIHRhZykpOworICAgIH0KKyAgICBzdGQ6OnVuaXF1ZV9wdHI8ICA6OmdycGM6OkNsaWVudEFzeW5jUmVhZGVyV3JpdGVyPCBmbGF0YnVmZmVyczo6Z3JwYzo6TWVzc2FnZTxNb25zdGVyPiwgZmxhdGJ1ZmZlcnM6OmdycGM6Ok1lc3NhZ2U8U3RhdD4+PiBQcmVwYXJlQXN5bmNHZXRNaW5NYXhIaXRQb2ludHMoOjpncnBjOjpDbGllbnRDb250ZXh0KiBjb250ZXh0LCA6OmdycGM6OkNvbXBsZXRpb25RdWV1ZSogY3EpIHsKKyAgICAgIHJldHVybiBzdGQ6OnVuaXF1ZV9wdHI8IDo6Z3JwYzo6Q2xpZW50QXN5bmNSZWFkZXJXcml0ZXI8IGZsYXRidWZmZXJzOjpncnBjOjpNZXNzYWdlPE1vbnN0ZXI+LCBmbGF0YnVmZmVyczo6Z3JwYzo6TWVzc2FnZTxTdGF0Pj4+KFByZXBhcmVBc3luY0dldE1pbk1heEhpdFBvaW50c1Jhdyhjb250ZXh0LCBjcSkpOworICAgIH0KKyAgCisgICBwcml2YXRlOgorICAgIHN0ZDo6c2hhcmVkX3B0cjwgOjpncnBjOjpDaGFubmVsSW50ZXJmYWNlPiBjaGFubmVsXzsKKyAgICA6OmdycGM6OkNsaWVudEFzeW5jUmVzcG9uc2VSZWFkZXI8IGZsYXRidWZmZXJzOjpncnBjOjpNZXNzYWdlPFN0YXQ+PiogQXN5bmNTdG9yZVJhdyg6OmdycGM6OkNsaWVudENvbnRleHQqIGNvbnRleHQsIGNvbnN0IGZsYXRidWZmZXJzOjpncnBjOjpNZXNzYWdlPE1vbnN0ZXI+JiByZXF1ZXN0LCA6OmdycGM6OkNvbXBsZXRpb25RdWV1ZSogY3EpIG92ZXJyaWRlOworICAgIDo6Z3JwYzo6Q2xpZW50QXN5bmNSZXNwb25zZVJlYWRlcjwgZmxhdGJ1ZmZlcnM6OmdycGM6Ok1lc3NhZ2U8U3RhdD4+KiBQcmVwYXJlQXN5bmNTdG9yZVJhdyg6OmdycGM6OkNsaWVudENvbnRleHQqIGNvbnRleHQsIGNvbnN0IGZsYXRidWZmZXJzOjpncnBjOjpNZXNzYWdlPE1vbnN0ZXI+JiByZXF1ZXN0LCA6OmdycGM6OkNvbXBsZXRpb25RdWV1ZSogY3EpIG92ZXJyaWRlOworICAgIDo6Z3JwYzo6Q2xpZW50UmVhZGVyPCBmbGF0YnVmZmVyczo6Z3JwYzo6TWVzc2FnZTxNb25zdGVyPj4qIFJldHJpZXZlUmF3KDo6Z3JwYzo6Q2xpZW50Q29udGV4dCogY29udGV4dCwgY29uc3QgZmxhdGJ1ZmZlcnM6OmdycGM6Ok1lc3NhZ2U8U3RhdD4mIHJlcXVlc3QpIG92ZXJyaWRlOworICAgIDo6Z3JwYzo6Q2xpZW50QXN5bmNSZWFkZXI8IGZsYXRidWZmZXJzOjpncnBjOjpNZXNzYWdlPE1vbnN0ZXI+PiogQXN5bmNSZXRyaWV2ZVJhdyg6OmdycGM6OkNsaWVudENvbnRleHQqIGNvbnRleHQsIGNvbnN0IGZsYXRidWZmZXJzOjpncnBjOjpNZXNzYWdlPFN0YXQ+JiByZXF1ZXN0LCA6OmdycGM6OkNvbXBsZXRpb25RdWV1ZSogY3EsIHZvaWQqIHRhZykgb3ZlcnJpZGU7CisgICAgOjpncnBjOjpDbGllbnRBc3luY1JlYWRlcjwgZmxhdGJ1ZmZlcnM6OmdycGM6Ok1lc3NhZ2U8TW9uc3Rlcj4+KiBQcmVwYXJlQXN5bmNSZXRyaWV2ZVJhdyg6OmdycGM6OkNsaWVudENvbnRleHQqIGNvbnRleHQsIGNvbnN0IGZsYXRidWZmZXJzOjpncnBjOjpNZXNzYWdlPFN0YXQ+JiByZXF1ZXN0LCA6OmdycGM6OkNvbXBsZXRpb25RdWV1ZSogY3EpIG92ZXJyaWRlOworICAgIDo6Z3JwYzo6Q2xpZW50V3JpdGVyPCBmbGF0YnVmZmVyczo6Z3JwYzo6TWVzc2FnZTxNb25zdGVyPj4qIEdldE1heEhpdFBvaW50UmF3KDo6Z3JwYzo6Q2xpZW50Q29udGV4dCogY29udGV4dCwgZmxhdGJ1ZmZlcnM6OmdycGM6Ok1lc3NhZ2U8U3RhdD4qIHJlc3BvbnNlKSBvdmVycmlkZTsKKyAgICA6OmdycGM6OkNsaWVudEFzeW5jV3JpdGVyPCBmbGF0YnVmZmVyczo6Z3JwYzo6TWVzc2FnZTxNb25zdGVyPj4qIEFzeW5jR2V0TWF4SGl0UG9pbnRSYXcoOjpncnBjOjpDbGllbnRDb250ZXh0KiBjb250ZXh0LCBmbGF0YnVmZmVyczo6Z3JwYzo6TWVzc2FnZTxTdGF0PiogcmVzcG9uc2UsIDo6Z3JwYzo6Q29tcGxldGlvblF1ZXVlKiBjcSwgdm9pZCogdGFnKSBvdmVycmlkZTsKKyAgICA6OmdycGM6OkNsaWVudEFzeW5jV3JpdGVyPCBmbGF0YnVmZmVyczo6Z3JwYzo6TWVzc2FnZTxNb25zdGVyPj4qIFByZXBhcmVBc3luY0dldE1heEhpdFBvaW50UmF3KDo6Z3JwYzo6Q2xpZW50Q29udGV4dCogY29udGV4dCwgZmxhdGJ1ZmZlcnM6OmdycGM6Ok1lc3NhZ2U8U3RhdD4qIHJlc3BvbnNlLCA6OmdycGM6OkNvbXBsZXRpb25RdWV1ZSogY3EpIG92ZXJyaWRlOworICAgIDo6Z3JwYzo6Q2xpZW50UmVhZGVyV3JpdGVyPCBmbGF0YnVmZmVyczo6Z3JwYzo6TWVzc2FnZTxNb25zdGVyPiwgZmxhdGJ1ZmZlcnM6OmdycGM6Ok1lc3NhZ2U8U3RhdD4+KiBHZXRNaW5NYXhIaXRQb2ludHNSYXcoOjpncnBjOjpDbGllbnRDb250ZXh0KiBjb250ZXh0KSBvdmVycmlkZTsKKyAgICA6OmdycGM6OkNsaWVudEFzeW5jUmVhZGVyV3JpdGVyPCBmbGF0YnVmZmVyczo6Z3JwYzo6TWVzc2FnZTxNb25zdGVyPiwgZmxhdGJ1ZmZlcnM6OmdycGM6Ok1lc3NhZ2U8U3RhdD4+KiBBc3luY0dldE1pbk1heEhpdFBvaW50c1Jhdyg6OmdycGM6OkNsaWVudENvbnRleHQqIGNvbnRleHQsIDo6Z3JwYzo6Q29tcGxldGlvblF1ZXVlKiBjcSwgdm9pZCogdGFnKSBvdmVycmlkZTsKKyAgICA6OmdycGM6OkNsaWVudEFzeW5jUmVhZGVyV3JpdGVyPCBmbGF0YnVmZmVyczo6Z3JwYzo6TWVzc2FnZTxNb25zdGVyPiwgZmxhdGJ1ZmZlcnM6OmdycGM6Ok1lc3NhZ2U8U3RhdD4+KiBQcmVwYXJlQXN5bmNHZXRNaW5NYXhIaXRQb2ludHNSYXcoOjpncnBjOjpDbGllbnRDb250ZXh0KiBjb250ZXh0LCA6OmdycGM6OkNvbXBsZXRpb25RdWV1ZSogY3EpIG92ZXJyaWRlOworICAgIGNvbnN0IDo6Z3JwYzo6aW50ZXJuYWw6OlJwY01ldGhvZCBycGNtZXRob2RfU3RvcmVfOworICAgIGNvbnN0IDo6Z3JwYzo6aW50ZXJuYWw6OlJwY01ldGhvZCBycGNtZXRob2RfUmV0cmlldmVfOworICAgIGNvbnN0IDo6Z3JwYzo6aW50ZXJuYWw6OlJwY01ldGhvZCBycGNtZXRob2RfR2V0TWF4SGl0UG9pbnRfOworICAgIGNvbnN0IDo6Z3JwYzo6aW50ZXJuYWw6OlJwY01ldGhvZCBycGNtZXRob2RfR2V0TWluTWF4SGl0UG9pbnRzXzsKKyAgfTsKKyAgc3RhdGljIHN0ZDo6dW5pcXVlX3B0cjxTdHViPiBOZXdTdHViKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjwgOjpncnBjOjpDaGFubmVsSW50ZXJmYWNlPiYgY2hhbm5lbCwgY29uc3QgOjpncnBjOjpTdHViT3B0aW9ucyYgb3B0aW9ucyA9IDo6Z3JwYzo6U3R1Yk9wdGlvbnMoKSk7CisgIAorICBjbGFzcyBTZXJ2aWNlIDogcHVibGljIDo6Z3JwYzo6U2VydmljZSB7CisgICBwdWJsaWM6CisgICAgU2VydmljZSgpOworICAgIHZpcnR1YWwgflNlcnZpY2UoKTsKKyAgICB2aXJ0dWFsIDo6Z3JwYzo6U3RhdHVzIFN0b3JlKDo6Z3JwYzo6U2VydmVyQ29udGV4dCogY29udGV4dCwgY29uc3QgZmxhdGJ1ZmZlcnM6OmdycGM6Ok1lc3NhZ2U8TW9uc3Rlcj4qIHJlcXVlc3QsIGZsYXRidWZmZXJzOjpncnBjOjpNZXNzYWdlPFN0YXQ+KiByZXNwb25zZSk7CisgICAgdmlydHVhbCA6OmdycGM6OlN0YXR1cyBSZXRyaWV2ZSg6OmdycGM6OlNlcnZlckNvbnRleHQqIGNvbnRleHQsIGNvbnN0IGZsYXRidWZmZXJzOjpncnBjOjpNZXNzYWdlPFN0YXQ+KiByZXF1ZXN0LCA6OmdycGM6OlNlcnZlcldyaXRlcjwgZmxhdGJ1ZmZlcnM6OmdycGM6Ok1lc3NhZ2U8TW9uc3Rlcj4+KiB3cml0ZXIpOworICAgIHZpcnR1YWwgOjpncnBjOjpTdGF0dXMgR2V0TWF4SGl0UG9pbnQoOjpncnBjOjpTZXJ2ZXJDb250ZXh0KiBjb250ZXh0LCA6OmdycGM6OlNlcnZlclJlYWRlcjwgZmxhdGJ1ZmZlcnM6OmdycGM6Ok1lc3NhZ2U8TW9uc3Rlcj4+KiByZWFkZXIsIGZsYXRidWZmZXJzOjpncnBjOjpNZXNzYWdlPFN0YXQ+KiByZXNwb25zZSk7CisgICAgdmlydHVhbCA6OmdycGM6OlN0YXR1cyBHZXRNaW5NYXhIaXRQb2ludHMoOjpncnBjOjpTZXJ2ZXJDb250ZXh0KiBjb250ZXh0LCA6OmdycGM6OlNlcnZlclJlYWRlcldyaXRlcjwgZmxhdGJ1ZmZlcnM6OmdycGM6Ok1lc3NhZ2U8U3RhdD4sIGZsYXRidWZmZXJzOjpncnBjOjpNZXNzYWdlPE1vbnN0ZXI+Piogc3RyZWFtKTsKKyAgfTsKKyAgdGVtcGxhdGUgPGNsYXNzIEJhc2VDbGFzcz4KKyAgY2xhc3MgV2l0aEFzeW5jTWV0aG9kX1N0b3JlIDogcHVibGljIEJhc2VDbGFzcyB7CisgICBwcml2YXRlOgorICAgIHZvaWQgQmFzZUNsYXNzTXVzdEJlRGVyaXZlZEZyb21TZXJ2aWNlKGNvbnN0IFNlcnZpY2UgKi8qc2VydmljZSovKSB7fQorICAgcHVibGljOgorICAgIFdpdGhBc3luY01ldGhvZF9TdG9yZSgpIHsKKyAgICAgIDo6Z3JwYzo6U2VydmljZTo6TWFya01ldGhvZEFzeW5jKDApOworICAgIH0KKyAgICB+V2l0aEFzeW5jTWV0aG9kX1N0b3JlKCkgb3ZlcnJpZGUgeworICAgICAgQmFzZUNsYXNzTXVzdEJlRGVyaXZlZEZyb21TZXJ2aWNlKHRoaXMpOworICAgIH0KKyAgICAvLyBkaXNhYmxlIHN5bmNocm9ub3VzIHZlcnNpb24gb2YgdGhpcyBtZXRob2QKKyAgICA6OmdycGM6OlN0YXR1cyBTdG9yZSg6OmdycGM6OlNlcnZlckNvbnRleHQqIC8qY29udGV4dCovLCBjb25zdCBmbGF0YnVmZmVyczo6Z3JwYzo6TWVzc2FnZTxNb25zdGVyPiogLypyZXF1ZXN0Ki8sIGZsYXRidWZmZXJzOjpncnBjOjpNZXNzYWdlPFN0YXQ+KiAvKnJlc3BvbnNlKi8pIGZpbmFsIG92ZXJyaWRlIHsKKyAgICAgIGFib3J0KCk7CisgICAgICByZXR1cm4gOjpncnBjOjpTdGF0dXMoOjpncnBjOjpTdGF0dXNDb2RlOjpVTklNUExFTUVOVEVELCAiIik7CisgICAgfQorICAgIHZvaWQgUmVxdWVzdFN0b3JlKDo6Z3JwYzo6U2VydmVyQ29udGV4dCogY29udGV4dCwgZmxhdGJ1ZmZlcnM6OmdycGM6Ok1lc3NhZ2U8TW9uc3Rlcj4qIHJlcXVlc3QsIDo6Z3JwYzo6U2VydmVyQXN5bmNSZXNwb25zZVdyaXRlcjwgZmxhdGJ1ZmZlcnM6OmdycGM6Ok1lc3NhZ2U8U3RhdD4+KiByZXNwb25zZSwgOjpncnBjOjpDb21wbGV0aW9uUXVldWUqIG5ld19jYWxsX2NxLCA6OmdycGM6OlNlcnZlckNvbXBsZXRpb25RdWV1ZSogbm90aWZpY2F0aW9uX2NxLCB2b2lkICp0YWcpIHsKKyAgICAgIDo6Z3JwYzo6U2VydmljZTo6UmVxdWVzdEFzeW5jVW5hcnkoMCwgY29udGV4dCwgcmVxdWVzdCwgcmVzcG9uc2UsIG5ld19jYWxsX2NxLCBub3RpZmljYXRpb25fY3EsIHRhZyk7CisgICAgfQorICB9OworICB0ZW1wbGF0ZSA8Y2xhc3MgQmFzZUNsYXNzPgorICBjbGFzcyBXaXRoQXN5bmNNZXRob2RfUmV0cmlldmUgOiBwdWJsaWMgQmFzZUNsYXNzIHsKKyAgIHByaXZhdGU6CisgICAgdm9pZCBCYXNlQ2xhc3NNdXN0QmVEZXJpdmVkRnJvbVNlcnZpY2UoY29uc3QgU2VydmljZSAqLypzZXJ2aWNlKi8pIHt9CisgICBwdWJsaWM6CisgICAgV2l0aEFzeW5jTWV0aG9kX1JldHJpZXZlKCkgeworICAgICAgOjpncnBjOjpTZXJ2aWNlOjpNYXJrTWV0aG9kQXN5bmMoMSk7CisgICAgfQorICAgIH5XaXRoQXN5bmNNZXRob2RfUmV0cmlldmUoKSBvdmVycmlkZSB7CisgICAgICBCYXNlQ2xhc3NNdXN0QmVEZXJpdmVkRnJvbVNlcnZpY2UodGhpcyk7CisgICAgfQorICAgIC8vIGRpc2FibGUgc3luY2hyb25vdXMgdmVyc2lvbiBvZiB0aGlzIG1ldGhvZAorICAgIDo6Z3JwYzo6U3RhdHVzIFJldHJpZXZlKDo6Z3JwYzo6U2VydmVyQ29udGV4dCogLypjb250ZXh0Ki8sIGNvbnN0IGZsYXRidWZmZXJzOjpncnBjOjpNZXNzYWdlPFN0YXQ+KiAvKnJlcXVlc3QqLywgOjpncnBjOjpTZXJ2ZXJXcml0ZXI8IGZsYXRidWZmZXJzOjpncnBjOjpNZXNzYWdlPE1vbnN0ZXI+PiogLyp3cml0ZXIqLykgZmluYWwgb3ZlcnJpZGUgeworICAgICAgYWJvcnQoKTsKKyAgICAgIHJldHVybiA6OmdycGM6OlN0YXR1cyg6OmdycGM6OlN0YXR1c0NvZGU6OlVOSU1QTEVNRU5URUQsICIiKTsKKyAgICB9CisgICAgdm9pZCBSZXF1ZXN0UmV0cmlldmUoOjpncnBjOjpTZXJ2ZXJDb250ZXh0KiBjb250ZXh0LCBmbGF0YnVmZmVyczo6Z3JwYzo6TWVzc2FnZTxTdGF0PiogcmVxdWVzdCwgOjpncnBjOjpTZXJ2ZXJBc3luY1dyaXRlcjwgZmxhdGJ1ZmZlcnM6OmdycGM6Ok1lc3NhZ2U8TW9uc3Rlcj4+KiB3cml0ZXIsIDo6Z3JwYzo6Q29tcGxldGlvblF1ZXVlKiBuZXdfY2FsbF9jcSwgOjpncnBjOjpTZXJ2ZXJDb21wbGV0aW9uUXVldWUqIG5vdGlmaWNhdGlvbl9jcSwgdm9pZCAqdGFnKSB7CisgICAgICA6OmdycGM6OlNlcnZpY2U6OlJlcXVlc3RBc3luY1NlcnZlclN0cmVhbWluZygxLCBjb250ZXh0LCByZXF1ZXN0LCB3cml0ZXIsIG5ld19jYWxsX2NxLCBub3RpZmljYXRpb25fY3EsIHRhZyk7CisgICAgfQorICB9OworICB0ZW1wbGF0ZSA8Y2xhc3MgQmFzZUNsYXNzPgorICBjbGFzcyBXaXRoQXN5bmNNZXRob2RfR2V0TWF4SGl0UG9pbnQgOiBwdWJsaWMgQmFzZUNsYXNzIHsKKyAgIHByaXZhdGU6CisgICAgdm9pZCBCYXNlQ2xhc3NNdXN0QmVEZXJpdmVkRnJvbVNlcnZpY2UoY29uc3QgU2VydmljZSAqLypzZXJ2aWNlKi8pIHt9CisgICBwdWJsaWM6CisgICAgV2l0aEFzeW5jTWV0aG9kX0dldE1heEhpdFBvaW50KCkgeworICAgICAgOjpncnBjOjpTZXJ2aWNlOjpNYXJrTWV0aG9kQXN5bmMoMik7CisgICAgfQorICAgIH5XaXRoQXN5bmNNZXRob2RfR2V0TWF4SGl0UG9pbnQoKSBvdmVycmlkZSB7CisgICAgICBCYXNlQ2xhc3NNdXN0QmVEZXJpdmVkRnJvbVNlcnZpY2UodGhpcyk7CisgICAgfQorICAgIC8vIGRpc2FibGUgc3luY2hyb25vdXMgdmVyc2lvbiBvZiB0aGlzIG1ldGhvZAorICAgIDo6Z3JwYzo6U3RhdHVzIEdldE1heEhpdFBvaW50KDo6Z3JwYzo6U2VydmVyQ29udGV4dCogLypjb250ZXh0Ki8sIDo6Z3JwYzo6U2VydmVyUmVhZGVyPCBmbGF0YnVmZmVyczo6Z3JwYzo6TWVzc2FnZTxNb25zdGVyPj4qIC8qcmVhZGVyKi8sIGZsYXRidWZmZXJzOjpncnBjOjpNZXNzYWdlPFN0YXQ+KiAvKnJlc3BvbnNlKi8pIGZpbmFsIG92ZXJyaWRlIHsKKyAgICAgIGFib3J0KCk7CisgICAgICByZXR1cm4gOjpncnBjOjpTdGF0dXMoOjpncnBjOjpTdGF0dXNDb2RlOjpVTklNUExFTUVOVEVELCAiIik7CisgICAgfQorICAgIHZvaWQgUmVxdWVzdEdldE1heEhpdFBvaW50KDo6Z3JwYzo6U2VydmVyQ29udGV4dCogY29udGV4dCwgOjpncnBjOjpTZXJ2ZXJBc3luY1JlYWRlcjwgZmxhdGJ1ZmZlcnM6OmdycGM6Ok1lc3NhZ2U8U3RhdD4sIGZsYXRidWZmZXJzOjpncnBjOjpNZXNzYWdlPE1vbnN0ZXI+PiogcmVhZGVyLCA6OmdycGM6OkNvbXBsZXRpb25RdWV1ZSogbmV3X2NhbGxfY3EsIDo6Z3JwYzo6U2VydmVyQ29tcGxldGlvblF1ZXVlKiBub3RpZmljYXRpb25fY3EsIHZvaWQgKnRhZykgeworICAgICAgOjpncnBjOjpTZXJ2aWNlOjpSZXF1ZXN0QXN5bmNDbGllbnRTdHJlYW1pbmcoMiwgY29udGV4dCwgcmVhZGVyLCBuZXdfY2FsbF9jcSwgbm90aWZpY2F0aW9uX2NxLCB0YWcpOworICAgIH0KKyAgfTsKKyAgdGVtcGxhdGUgPGNsYXNzIEJhc2VDbGFzcz4KKyAgY2xhc3MgV2l0aEFzeW5jTWV0aG9kX0dldE1pbk1heEhpdFBvaW50cyA6IHB1YmxpYyBCYXNlQ2xhc3MgeworICAgcHJpdmF0ZToKKyAgICB2b2lkIEJhc2VDbGFzc011c3RCZURlcml2ZWRGcm9tU2VydmljZShjb25zdCBTZXJ2aWNlICovKnNlcnZpY2UqLykge30KKyAgIHB1YmxpYzoKKyAgICBXaXRoQXN5bmNNZXRob2RfR2V0TWluTWF4SGl0UG9pbnRzKCkgeworICAgICAgOjpncnBjOjpTZXJ2aWNlOjpNYXJrTWV0aG9kQXN5bmMoMyk7CisgICAgfQorICAgIH5XaXRoQXN5bmNNZXRob2RfR2V0TWluTWF4SGl0UG9pbnRzKCkgb3ZlcnJpZGUgeworICAgICAgQmFzZUNsYXNzTXVzdEJlRGVyaXZlZEZyb21TZXJ2aWNlKHRoaXMpOworICAgIH0KKyAgICAvLyBkaXNhYmxlIHN5bmNocm9ub3VzIHZlcnNpb24gb2YgdGhpcyBtZXRob2QKKyAgICA6OmdycGM6OlN0YXR1cyBHZXRNaW5NYXhIaXRQb2ludHMoOjpncnBjOjpTZXJ2ZXJDb250ZXh0KiAvKmNvbnRleHQqLywgOjpncnBjOjpTZXJ2ZXJSZWFkZXJXcml0ZXI8IGZsYXRidWZmZXJzOjpncnBjOjpNZXNzYWdlPFN0YXQ+LCBmbGF0YnVmZmVyczo6Z3JwYzo6TWVzc2FnZTxNb25zdGVyPj4qIC8qc3RyZWFtKi8pIGZpbmFsIG92ZXJyaWRlIHsKKyAgICAgIGFib3J0KCk7CisgICAgICByZXR1cm4gOjpncnBjOjpTdGF0dXMoOjpncnBjOjpTdGF0dXNDb2RlOjpVTklNUExFTUVOVEVELCAiIik7CisgICAgfQorICAgIHZvaWQgUmVxdWVzdEdldE1pbk1heEhpdFBvaW50cyg6OmdycGM6OlNlcnZlckNvbnRleHQqIGNvbnRleHQsIDo6Z3JwYzo6U2VydmVyQXN5bmNSZWFkZXJXcml0ZXI8IGZsYXRidWZmZXJzOjpncnBjOjpNZXNzYWdlPFN0YXQ+LCBmbGF0YnVmZmVyczo6Z3JwYzo6TWVzc2FnZTxNb25zdGVyPj4qIHN0cmVhbSwgOjpncnBjOjpDb21wbGV0aW9uUXVldWUqIG5ld19jYWxsX2NxLCA6OmdycGM6OlNlcnZlckNvbXBsZXRpb25RdWV1ZSogbm90aWZpY2F0aW9uX2NxLCB2b2lkICp0YWcpIHsKKyAgICAgIDo6Z3JwYzo6U2VydmljZTo6UmVxdWVzdEFzeW5jQmlkaVN0cmVhbWluZygzLCBjb250ZXh0LCBzdHJlYW0sIG5ld19jYWxsX2NxLCBub3RpZmljYXRpb25fY3EsIHRhZyk7CisgICAgfQorICB9OworICB0eXBlZGVmICAgV2l0aEFzeW5jTWV0aG9kX1N0b3JlPCAgV2l0aEFzeW5jTWV0aG9kX1JldHJpZXZlPCAgV2l0aEFzeW5jTWV0aG9kX0dldE1heEhpdFBvaW50PCAgV2l0aEFzeW5jTWV0aG9kX0dldE1pbk1heEhpdFBvaW50czwgIFNlcnZpY2UgICA+ICAgPiAgID4gICA+ICAgQXN5bmNTZXJ2aWNlOworICB0ZW1wbGF0ZSA8Y2xhc3MgQmFzZUNsYXNzPgorICBjbGFzcyBXaXRoR2VuZXJpY01ldGhvZF9TdG9yZSA6IHB1YmxpYyBCYXNlQ2xhc3MgeworICAgcHJpdmF0ZToKKyAgICB2b2lkIEJhc2VDbGFzc011c3RCZURlcml2ZWRGcm9tU2VydmljZShjb25zdCBTZXJ2aWNlICovKnNlcnZpY2UqLykge30KKyAgIHB1YmxpYzoKKyAgICBXaXRoR2VuZXJpY01ldGhvZF9TdG9yZSgpIHsKKyAgICAgIDo6Z3JwYzo6U2VydmljZTo6TWFya01ldGhvZEdlbmVyaWMoMCk7CisgICAgfQorICAgIH5XaXRoR2VuZXJpY01ldGhvZF9TdG9yZSgpIG92ZXJyaWRlIHsKKyAgICAgIEJhc2VDbGFzc011c3RCZURlcml2ZWRGcm9tU2VydmljZSh0aGlzKTsKKyAgICB9CisgICAgLy8gZGlzYWJsZSBzeW5jaHJvbm91cyB2ZXJzaW9uIG9mIHRoaXMgbWV0aG9kCisgICAgOjpncnBjOjpTdGF0dXMgU3RvcmUoOjpncnBjOjpTZXJ2ZXJDb250ZXh0KiAvKmNvbnRleHQqLywgY29uc3QgZmxhdGJ1ZmZlcnM6OmdycGM6Ok1lc3NhZ2U8TW9uc3Rlcj4qIC8qcmVxdWVzdCovLCBmbGF0YnVmZmVyczo6Z3JwYzo6TWVzc2FnZTxTdGF0PiogLypyZXNwb25zZSovKSBmaW5hbCBvdmVycmlkZSB7CisgICAgICBhYm9ydCgpOworICAgICAgcmV0dXJuIDo6Z3JwYzo6U3RhdHVzKDo6Z3JwYzo6U3RhdHVzQ29kZTo6VU5JTVBMRU1FTlRFRCwgIiIpOworICAgIH0KKyAgfTsKKyAgdGVtcGxhdGUgPGNsYXNzIEJhc2VDbGFzcz4KKyAgY2xhc3MgV2l0aEdlbmVyaWNNZXRob2RfUmV0cmlldmUgOiBwdWJsaWMgQmFzZUNsYXNzIHsKKyAgIHByaXZhdGU6CisgICAgdm9pZCBCYXNlQ2xhc3NNdXN0QmVEZXJpdmVkRnJvbVNlcnZpY2UoY29uc3QgU2VydmljZSAqLypzZXJ2aWNlKi8pIHt9CisgICBwdWJsaWM6CisgICAgV2l0aEdlbmVyaWNNZXRob2RfUmV0cmlldmUoKSB7CisgICAgICA6OmdycGM6OlNlcnZpY2U6Ok1hcmtNZXRob2RHZW5lcmljKDEpOworICAgIH0KKyAgICB+V2l0aEdlbmVyaWNNZXRob2RfUmV0cmlldmUoKSBvdmVycmlkZSB7CisgICAgICBCYXNlQ2xhc3NNdXN0QmVEZXJpdmVkRnJvbVNlcnZpY2UodGhpcyk7CisgICAgfQorICAgIC8vIGRpc2FibGUgc3luY2hyb25vdXMgdmVyc2lvbiBvZiB0aGlzIG1ldGhvZAorICAgIDo6Z3JwYzo6U3RhdHVzIFJldHJpZXZlKDo6Z3JwYzo6U2VydmVyQ29udGV4dCogLypjb250ZXh0Ki8sIGNvbnN0IGZsYXRidWZmZXJzOjpncnBjOjpNZXNzYWdlPFN0YXQ+KiAvKnJlcXVlc3QqLywgOjpncnBjOjpTZXJ2ZXJXcml0ZXI8IGZsYXRidWZmZXJzOjpncnBjOjpNZXNzYWdlPE1vbnN0ZXI+PiogLyp3cml0ZXIqLykgZmluYWwgb3ZlcnJpZGUgeworICAgICAgYWJvcnQoKTsKKyAgICAgIHJldHVybiA6OmdycGM6OlN0YXR1cyg6OmdycGM6OlN0YXR1c0NvZGU6OlVOSU1QTEVNRU5URUQsICIiKTsKKyAgICB9CisgIH07CisgIHRlbXBsYXRlIDxjbGFzcyBCYXNlQ2xhc3M+CisgIGNsYXNzIFdpdGhHZW5lcmljTWV0aG9kX0dldE1heEhpdFBvaW50IDogcHVibGljIEJhc2VDbGFzcyB7CisgICBwcml2YXRlOgorICAgIHZvaWQgQmFzZUNsYXNzTXVzdEJlRGVyaXZlZEZyb21TZXJ2aWNlKGNvbnN0IFNlcnZpY2UgKi8qc2VydmljZSovKSB7fQorICAgcHVibGljOgorICAgIFdpdGhHZW5lcmljTWV0aG9kX0dldE1heEhpdFBvaW50KCkgeworICAgICAgOjpncnBjOjpTZXJ2aWNlOjpNYXJrTWV0aG9kR2VuZXJpYygyKTsKKyAgICB9CisgICAgfldpdGhHZW5lcmljTWV0aG9kX0dldE1heEhpdFBvaW50KCkgb3ZlcnJpZGUgeworICAgICAgQmFzZUNsYXNzTXVzdEJlRGVyaXZlZEZyb21TZXJ2aWNlKHRoaXMpOworICAgIH0KKyAgICAvLyBkaXNhYmxlIHN5bmNocm9ub3VzIHZlcnNpb24gb2YgdGhpcyBtZXRob2QKKyAgICA6OmdycGM6OlN0YXR1cyBHZXRNYXhIaXRQb2ludCg6OmdycGM6OlNlcnZlckNvbnRleHQqIC8qY29udGV4dCovLCA6OmdycGM6OlNlcnZlclJlYWRlcjwgZmxhdGJ1ZmZlcnM6OmdycGM6Ok1lc3NhZ2U8TW9uc3Rlcj4+KiAvKnJlYWRlciovLCBmbGF0YnVmZmVyczo6Z3JwYzo6TWVzc2FnZTxTdGF0PiogLypyZXNwb25zZSovKSBmaW5hbCBvdmVycmlkZSB7CisgICAgICBhYm9ydCgpOworICAgICAgcmV0dXJuIDo6Z3JwYzo6U3RhdHVzKDo6Z3JwYzo6U3RhdHVzQ29kZTo6VU5JTVBMRU1FTlRFRCwgIiIpOworICAgIH0KKyAgfTsKKyAgdGVtcGxhdGUgPGNsYXNzIEJhc2VDbGFzcz4KKyAgY2xhc3MgV2l0aEdlbmVyaWNNZXRob2RfR2V0TWluTWF4SGl0UG9pbnRzIDogcHVibGljIEJhc2VDbGFzcyB7CisgICBwcml2YXRlOgorICAgIHZvaWQgQmFzZUNsYXNzTXVzdEJlRGVyaXZlZEZyb21TZXJ2aWNlKGNvbnN0IFNlcnZpY2UgKi8qc2VydmljZSovKSB7fQorICAgcHVibGljOgorICAgIFdpdGhHZW5lcmljTWV0aG9kX0dldE1pbk1heEhpdFBvaW50cygpIHsKKyAgICAgIDo6Z3JwYzo6U2VydmljZTo6TWFya01ldGhvZEdlbmVyaWMoMyk7CisgICAgfQorICAgIH5XaXRoR2VuZXJpY01ldGhvZF9HZXRNaW5NYXhIaXRQb2ludHMoKSBvdmVycmlkZSB7CisgICAgICBCYXNlQ2xhc3NNdXN0QmVEZXJpdmVkRnJvbVNlcnZpY2UodGhpcyk7CisgICAgfQorICAgIC8vIGRpc2FibGUgc3luY2hyb25vdXMgdmVyc2lvbiBvZiB0aGlzIG1ldGhvZAorICAgIDo6Z3JwYzo6U3RhdHVzIEdldE1pbk1heEhpdFBvaW50cyg6OmdycGM6OlNlcnZlckNvbnRleHQqIC8qY29udGV4dCovLCA6OmdycGM6OlNlcnZlclJlYWRlcldyaXRlcjwgZmxhdGJ1ZmZlcnM6OmdycGM6Ok1lc3NhZ2U8U3RhdD4sIGZsYXRidWZmZXJzOjpncnBjOjpNZXNzYWdlPE1vbnN0ZXI+PiogLypzdHJlYW0qLykgZmluYWwgb3ZlcnJpZGUgeworICAgICAgYWJvcnQoKTsKKyAgICAgIHJldHVybiA6OmdycGM6OlN0YXR1cyg6OmdycGM6OlN0YXR1c0NvZGU6OlVOSU1QTEVNRU5URUQsICIiKTsKKyAgICB9CisgIH07CisgIHRlbXBsYXRlIDxjbGFzcyBCYXNlQ2xhc3M+CisgIGNsYXNzIFdpdGhTdHJlYW1lZFVuYXJ5TWV0aG9kX1N0b3JlIDogcHVibGljIEJhc2VDbGFzcyB7CisgICBwcml2YXRlOgorICAgIHZvaWQgQmFzZUNsYXNzTXVzdEJlRGVyaXZlZEZyb21TZXJ2aWNlKGNvbnN0IFNlcnZpY2UgKi8qc2VydmljZSovKSB7fQorICAgcHVibGljOgorICAgIFdpdGhTdHJlYW1lZFVuYXJ5TWV0aG9kX1N0b3JlKCkgeworICAgICAgOjpncnBjOjpTZXJ2aWNlOjpNYXJrTWV0aG9kU3RyZWFtZWQoMCwKKyAgICAgICAgbmV3IDo6Z3JwYzo6aW50ZXJuYWw6OlN0cmVhbWVkVW5hcnlIYW5kbGVyPCBmbGF0YnVmZmVyczo6Z3JwYzo6TWVzc2FnZTxNb25zdGVyPiwgZmxhdGJ1ZmZlcnM6OmdycGM6Ok1lc3NhZ2U8U3RhdD4+KHN0ZDo6YmluZCgmV2l0aFN0cmVhbWVkVW5hcnlNZXRob2RfU3RvcmU8QmFzZUNsYXNzPjo6U3RyZWFtZWRTdG9yZSwgdGhpcywgc3RkOjpwbGFjZWhvbGRlcnM6Ol8xLCBzdGQ6OnBsYWNlaG9sZGVyczo6XzIpKSk7CisgICAgfQorICAgIH5XaXRoU3RyZWFtZWRVbmFyeU1ldGhvZF9TdG9yZSgpIG92ZXJyaWRlIHsKKyAgICAgIEJhc2VDbGFzc011c3RCZURlcml2ZWRGcm9tU2VydmljZSh0aGlzKTsKKyAgICB9CisgICAgLy8gZGlzYWJsZSByZWd1bGFyIHZlcnNpb24gb2YgdGhpcyBtZXRob2QKKyAgICA6OmdycGM6OlN0YXR1cyBTdG9yZSg6OmdycGM6OlNlcnZlckNvbnRleHQqIC8qY29udGV4dCovLCBjb25zdCBmbGF0YnVmZmVyczo6Z3JwYzo6TWVzc2FnZTxNb25zdGVyPiogLypyZXF1ZXN0Ki8sIGZsYXRidWZmZXJzOjpncnBjOjpNZXNzYWdlPFN0YXQ+KiAvKnJlc3BvbnNlKi8pIGZpbmFsIG92ZXJyaWRlIHsKKyAgICAgIGFib3J0KCk7CisgICAgICByZXR1cm4gOjpncnBjOjpTdGF0dXMoOjpncnBjOjpTdGF0dXNDb2RlOjpVTklNUExFTUVOVEVELCAiIik7CisgICAgfQorICAgIC8vIHJlcGxhY2UgZGVmYXVsdCB2ZXJzaW9uIG9mIG1ldGhvZCB3aXRoIHN0cmVhbWVkIHVuYXJ5CisgICAgdmlydHVhbCA6OmdycGM6OlN0YXR1cyBTdHJlYW1lZFN0b3JlKDo6Z3JwYzo6U2VydmVyQ29udGV4dCogY29udGV4dCwgOjpncnBjOjpTZXJ2ZXJVbmFyeVN0cmVhbWVyPCBmbGF0YnVmZmVyczo6Z3JwYzo6TWVzc2FnZTxNb25zdGVyPixmbGF0YnVmZmVyczo6Z3JwYzo6TWVzc2FnZTxTdGF0Pj4qIHNlcnZlcl91bmFyeV9zdHJlYW1lcikgPSAwOworICB9OworICB0eXBlZGVmICAgV2l0aFN0cmVhbWVkVW5hcnlNZXRob2RfU3RvcmU8ICBTZXJ2aWNlICAgPiAgIFN0cmVhbWVkVW5hcnlTZXJ2aWNlOworICB0ZW1wbGF0ZSA8Y2xhc3MgQmFzZUNsYXNzPgorICBjbGFzcyBXaXRoU3BsaXRTdHJlYW1pbmdNZXRob2RfUmV0cmlldmUgOiBwdWJsaWMgQmFzZUNsYXNzIHsKKyAgIHByaXZhdGU6CisgICAgdm9pZCBCYXNlQ2xhc3NNdXN0QmVEZXJpdmVkRnJvbVNlcnZpY2UoY29uc3QgU2VydmljZSAqLypzZXJ2aWNlKi8pIHsgfQorICAgcHVibGljOgorICAgIFdpdGhTcGxpdFN0cmVhbWluZ01ldGhvZF9SZXRyaWV2ZSgpIHsKKyAgICAgIDo6Z3JwYzo6U2VydmljZTo6TWFya01ldGhvZFN0cmVhbWVkKDEsCisgICAgICAgIG5ldyA6OmdycGM6OmludGVybmFsOjpTcGxpdFNlcnZlclN0cmVhbWluZ0hhbmRsZXI8IGZsYXRidWZmZXJzOjpncnBjOjpNZXNzYWdlPFN0YXQ+LCBmbGF0YnVmZmVyczo6Z3JwYzo6TWVzc2FnZTxNb25zdGVyPj4oc3RkOjpiaW5kKCZXaXRoU3BsaXRTdHJlYW1pbmdNZXRob2RfUmV0cmlldmU8QmFzZUNsYXNzPjo6U3RyZWFtZWRSZXRyaWV2ZSwgdGhpcywgc3RkOjpwbGFjZWhvbGRlcnM6Ol8xLCBzdGQ6OnBsYWNlaG9sZGVyczo6XzIpKSk7CisgICAgfQorICAgIH5XaXRoU3BsaXRTdHJlYW1pbmdNZXRob2RfUmV0cmlldmUoKSBvdmVycmlkZSB7CisgICAgICBCYXNlQ2xhc3NNdXN0QmVEZXJpdmVkRnJvbVNlcnZpY2UodGhpcyk7CisgICAgfQorICAgIC8vIGRpc2FibGUgcmVndWxhciB2ZXJzaW9uIG9mIHRoaXMgbWV0aG9kCisgICAgOjpncnBjOjpTdGF0dXMgUmV0cmlldmUoOjpncnBjOjpTZXJ2ZXJDb250ZXh0KiAvKmNvbnRleHQqLywgY29uc3QgZmxhdGJ1ZmZlcnM6OmdycGM6Ok1lc3NhZ2U8U3RhdD4qIC8qcmVxdWVzdCovLCA6OmdycGM6OlNlcnZlcldyaXRlcjwgZmxhdGJ1ZmZlcnM6OmdycGM6Ok1lc3NhZ2U8TW9uc3Rlcj4+KiAvKndyaXRlciovKSBmaW5hbCBvdmVycmlkZSB7CisgICAgICBhYm9ydCgpOworICAgICAgcmV0dXJuIDo6Z3JwYzo6U3RhdHVzKDo6Z3JwYzo6U3RhdHVzQ29kZTo6VU5JTVBMRU1FTlRFRCwgIiIpOworICAgIH0KKyAgICAvLyByZXBsYWNlIGRlZmF1bHQgdmVyc2lvbiBvZiBtZXRob2Qgd2l0aCBzcGxpdCBzdHJlYW1lZAorICAgIHZpcnR1YWwgOjpncnBjOjpTdGF0dXMgU3RyZWFtZWRSZXRyaWV2ZSg6OmdycGM6OlNlcnZlckNvbnRleHQqIGNvbnRleHQsIDo6Z3JwYzo6U2VydmVyU3BsaXRTdHJlYW1lcjwgZmxhdGJ1ZmZlcnM6OmdycGM6Ok1lc3NhZ2U8U3RhdD4sZmxhdGJ1ZmZlcnM6OmdycGM6Ok1lc3NhZ2U8TW9uc3Rlcj4+KiBzZXJ2ZXJfc3BsaXRfc3RyZWFtZXIpID0gMDsKKyAgfTsKKyAgdHlwZWRlZiAgIFdpdGhTcGxpdFN0cmVhbWluZ01ldGhvZF9SZXRyaWV2ZTwgIFNlcnZpY2UgICA+ICAgU3BsaXRTdHJlYW1lZFNlcnZpY2U7CisgIHR5cGVkZWYgICBXaXRoU3RyZWFtZWRVbmFyeU1ldGhvZF9TdG9yZTwgIFdpdGhTcGxpdFN0cmVhbWluZ01ldGhvZF9SZXRyaWV2ZTwgIFNlcnZpY2UgICA+ICAgPiAgIFN0cmVhbWVkU2VydmljZTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBFeGFtcGxlCit9ICAvLyBuYW1lc3BhY2UgTXlHYW1lCisKKworI2VuZGlmICAvLyBHUlBDX21vbnN0ZXJfNWZ0ZXN0X19JTkNMVURFRApkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvbW9uc3Rlcl90ZXN0X3N1ZmZpeC9leHRfb25seS9tb25zdGVyX3Rlc3RfZ2VuZXJhdGVkLmhwcCBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL21vbnN0ZXJfdGVzdF9zdWZmaXgvZXh0X29ubHkvbW9uc3Rlcl90ZXN0X2dlbmVyYXRlZC5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGVhYjc3YgotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL21vbnN0ZXJfdGVzdF9zdWZmaXgvZXh0X29ubHkvbW9uc3Rlcl90ZXN0X2dlbmVyYXRlZC5ocHAKQEAgLTAsMCArMSw0MDM0IEBACisvLyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBieSB0aGUgRmxhdEJ1ZmZlcnMgY29tcGlsZXIsIGRvIG5vdCBtb2RpZnkKKworCisjaWZuZGVmIEZMQVRCVUZGRVJTX0dFTkVSQVRFRF9NT05TVEVSVEVTVF9NWUdBTUVfRVhBTVBMRV9IXworI2RlZmluZSBGTEFUQlVGRkVSU19HRU5FUkFURURfTU9OU1RFUlRFU1RfTVlHQU1FX0VYQU1QTEVfSF8KKworI2luY2x1ZGUgImZsYXRidWZmZXJzL2ZsYXRidWZmZXJzLmgiCisjaW5jbHVkZSAiZmxhdGJ1ZmZlcnMvZmxleGJ1ZmZlcnMuaCIKKyNpbmNsdWRlICJmbGF0YnVmZmVycy9mbGV4X2ZsYXRfdXRpbC5oIgorCisvLyBFbnN1cmUgdGhlIGluY2x1ZGVkIGZsYXRidWZmZXJzLmggaXMgdGhlIHNhbWUgdmVyc2lvbiBhcyB3aGVuIHRoaXMgZmlsZSB3YXMKKy8vIGdlbmVyYXRlZCwgb3RoZXJ3aXNlIGl0IG1heSBub3QgYmUgY29tcGF0aWJsZS4KK3N0YXRpY19hc3NlcnQoRkxBVEJVRkZFUlNfVkVSU0lPTl9NQUpPUiA9PSAyICYmCisgICAgICAgICAgICAgIEZMQVRCVUZGRVJTX1ZFUlNJT05fTUlOT1IgPT0gMCAmJgorICAgICAgICAgICAgICBGTEFUQlVGRkVSU19WRVJTSU9OX1JFVklTSU9OID09IDgsCisgICAgICAgICAgICAgIk5vbi1jb21wYXRpYmxlIGZsYXRidWZmZXJzIHZlcnNpb24gaW5jbHVkZWQiKTsKKworbmFtZXNwYWNlIE15R2FtZSB7CisKK3N0cnVjdCBJblBhcmVudE5hbWVzcGFjZTsKK3N0cnVjdCBJblBhcmVudE5hbWVzcGFjZUJ1aWxkZXI7CitzdHJ1Y3QgSW5QYXJlbnROYW1lc3BhY2VUOworCituYW1lc3BhY2UgRXhhbXBsZTIgeworCitzdHJ1Y3QgTW9uc3RlcjsKK3N0cnVjdCBNb25zdGVyQnVpbGRlcjsKK3N0cnVjdCBNb25zdGVyVDsKKworfSAgLy8gbmFtZXNwYWNlIEV4YW1wbGUyCisKK25hbWVzcGFjZSBFeGFtcGxlIHsKKworc3RydWN0IFRlc3Q7CisKK3N0cnVjdCBUZXN0U2ltcGxlVGFibGVXaXRoRW51bTsKK3N0cnVjdCBUZXN0U2ltcGxlVGFibGVXaXRoRW51bUJ1aWxkZXI7CitzdHJ1Y3QgVGVzdFNpbXBsZVRhYmxlV2l0aEVudW1UOworCitzdHJ1Y3QgVmVjMzsKKworc3RydWN0IEFiaWxpdHk7CisKK3N0cnVjdCBTdHJ1Y3RPZlN0cnVjdHM7CisKK3N0cnVjdCBTdHJ1Y3RPZlN0cnVjdHNPZlN0cnVjdHM7CisKK3N0cnVjdCBTdGF0Oworc3RydWN0IFN0YXRCdWlsZGVyOworc3RydWN0IFN0YXRUOworCitzdHJ1Y3QgUmVmZXJyYWJsZTsKK3N0cnVjdCBSZWZlcnJhYmxlQnVpbGRlcjsKK3N0cnVjdCBSZWZlcnJhYmxlVDsKKworc3RydWN0IE1vbnN0ZXI7CitzdHJ1Y3QgTW9uc3RlckJ1aWxkZXI7CitzdHJ1Y3QgTW9uc3RlclQ7CisKK3N0cnVjdCBUeXBlQWxpYXNlczsKK3N0cnVjdCBUeXBlQWxpYXNlc0J1aWxkZXI7CitzdHJ1Y3QgVHlwZUFsaWFzZXNUOworCit9ICAvLyBuYW1lc3BhY2UgRXhhbXBsZQorCitib29sIG9wZXJhdG9yPT0oY29uc3QgSW5QYXJlbnROYW1lc3BhY2VUICZsaHMsIGNvbnN0IEluUGFyZW50TmFtZXNwYWNlVCAmcmhzKTsKK2Jvb2wgb3BlcmF0b3IhPShjb25zdCBJblBhcmVudE5hbWVzcGFjZVQgJmxocywgY29uc3QgSW5QYXJlbnROYW1lc3BhY2VUICZyaHMpOworbmFtZXNwYWNlIEV4YW1wbGUyIHsKKworYm9vbCBvcGVyYXRvcj09KGNvbnN0IE1vbnN0ZXJUICZsaHMsIGNvbnN0IE1vbnN0ZXJUICZyaHMpOworYm9vbCBvcGVyYXRvciE9KGNvbnN0IE1vbnN0ZXJUICZsaHMsIGNvbnN0IE1vbnN0ZXJUICZyaHMpOworfSAgLy8gbmFtZXNwYWNlIEV4YW1wbGUyCisKK25hbWVzcGFjZSBFeGFtcGxlIHsKKworYm9vbCBvcGVyYXRvcj09KGNvbnN0IFRlc3QgJmxocywgY29uc3QgVGVzdCAmcmhzKTsKK2Jvb2wgb3BlcmF0b3IhPShjb25zdCBUZXN0ICZsaHMsIGNvbnN0IFRlc3QgJnJocyk7Citib29sIG9wZXJhdG9yPT0oY29uc3QgVGVzdFNpbXBsZVRhYmxlV2l0aEVudW1UICZsaHMsIGNvbnN0IFRlc3RTaW1wbGVUYWJsZVdpdGhFbnVtVCAmcmhzKTsKK2Jvb2wgb3BlcmF0b3IhPShjb25zdCBUZXN0U2ltcGxlVGFibGVXaXRoRW51bVQgJmxocywgY29uc3QgVGVzdFNpbXBsZVRhYmxlV2l0aEVudW1UICZyaHMpOworYm9vbCBvcGVyYXRvcj09KGNvbnN0IFZlYzMgJmxocywgY29uc3QgVmVjMyAmcmhzKTsKK2Jvb2wgb3BlcmF0b3IhPShjb25zdCBWZWMzICZsaHMsIGNvbnN0IFZlYzMgJnJocyk7Citib29sIG9wZXJhdG9yPT0oY29uc3QgQWJpbGl0eSAmbGhzLCBjb25zdCBBYmlsaXR5ICZyaHMpOworYm9vbCBvcGVyYXRvciE9KGNvbnN0IEFiaWxpdHkgJmxocywgY29uc3QgQWJpbGl0eSAmcmhzKTsKK2Jvb2wgb3BlcmF0b3I9PShjb25zdCBTdHJ1Y3RPZlN0cnVjdHMgJmxocywgY29uc3QgU3RydWN0T2ZTdHJ1Y3RzICZyaHMpOworYm9vbCBvcGVyYXRvciE9KGNvbnN0IFN0cnVjdE9mU3RydWN0cyAmbGhzLCBjb25zdCBTdHJ1Y3RPZlN0cnVjdHMgJnJocyk7Citib29sIG9wZXJhdG9yPT0oY29uc3QgU3RydWN0T2ZTdHJ1Y3RzT2ZTdHJ1Y3RzICZsaHMsIGNvbnN0IFN0cnVjdE9mU3RydWN0c09mU3RydWN0cyAmcmhzKTsKK2Jvb2wgb3BlcmF0b3IhPShjb25zdCBTdHJ1Y3RPZlN0cnVjdHNPZlN0cnVjdHMgJmxocywgY29uc3QgU3RydWN0T2ZTdHJ1Y3RzT2ZTdHJ1Y3RzICZyaHMpOworYm9vbCBvcGVyYXRvcj09KGNvbnN0IFN0YXRUICZsaHMsIGNvbnN0IFN0YXRUICZyaHMpOworYm9vbCBvcGVyYXRvciE9KGNvbnN0IFN0YXRUICZsaHMsIGNvbnN0IFN0YXRUICZyaHMpOworYm9vbCBvcGVyYXRvcj09KGNvbnN0IFJlZmVycmFibGVUICZsaHMsIGNvbnN0IFJlZmVycmFibGVUICZyaHMpOworYm9vbCBvcGVyYXRvciE9KGNvbnN0IFJlZmVycmFibGVUICZsaHMsIGNvbnN0IFJlZmVycmFibGVUICZyaHMpOworYm9vbCBvcGVyYXRvcj09KGNvbnN0IE1vbnN0ZXJUICZsaHMsIGNvbnN0IE1vbnN0ZXJUICZyaHMpOworYm9vbCBvcGVyYXRvciE9KGNvbnN0IE1vbnN0ZXJUICZsaHMsIGNvbnN0IE1vbnN0ZXJUICZyaHMpOworYm9vbCBvcGVyYXRvcj09KGNvbnN0IFR5cGVBbGlhc2VzVCAmbGhzLCBjb25zdCBUeXBlQWxpYXNlc1QgJnJocyk7Citib29sIG9wZXJhdG9yIT0oY29uc3QgVHlwZUFsaWFzZXNUICZsaHMsIGNvbnN0IFR5cGVBbGlhc2VzVCAmcmhzKTsKKworfSAgLy8gbmFtZXNwYWNlIEV4YW1wbGUKKworaW5saW5lIGNvbnN0IGZsYXRidWZmZXJzOjpUeXBlVGFibGUgKkluUGFyZW50TmFtZXNwYWNlVHlwZVRhYmxlKCk7CisKK25hbWVzcGFjZSBFeGFtcGxlMiB7CisKK2lubGluZSBjb25zdCBmbGF0YnVmZmVyczo6VHlwZVRhYmxlICpNb25zdGVyVHlwZVRhYmxlKCk7CisKK30gIC8vIG5hbWVzcGFjZSBFeGFtcGxlMgorCituYW1lc3BhY2UgRXhhbXBsZSB7CisKK2lubGluZSBjb25zdCBmbGF0YnVmZmVyczo6VHlwZVRhYmxlICpUZXN0VHlwZVRhYmxlKCk7CisKK2lubGluZSBjb25zdCBmbGF0YnVmZmVyczo6VHlwZVRhYmxlICpUZXN0U2ltcGxlVGFibGVXaXRoRW51bVR5cGVUYWJsZSgpOworCitpbmxpbmUgY29uc3QgZmxhdGJ1ZmZlcnM6OlR5cGVUYWJsZSAqVmVjM1R5cGVUYWJsZSgpOworCitpbmxpbmUgY29uc3QgZmxhdGJ1ZmZlcnM6OlR5cGVUYWJsZSAqQWJpbGl0eVR5cGVUYWJsZSgpOworCitpbmxpbmUgY29uc3QgZmxhdGJ1ZmZlcnM6OlR5cGVUYWJsZSAqU3RydWN0T2ZTdHJ1Y3RzVHlwZVRhYmxlKCk7CisKK2lubGluZSBjb25zdCBmbGF0YnVmZmVyczo6VHlwZVRhYmxlICpTdHJ1Y3RPZlN0cnVjdHNPZlN0cnVjdHNUeXBlVGFibGUoKTsKKworaW5saW5lIGNvbnN0IGZsYXRidWZmZXJzOjpUeXBlVGFibGUgKlN0YXRUeXBlVGFibGUoKTsKKworaW5saW5lIGNvbnN0IGZsYXRidWZmZXJzOjpUeXBlVGFibGUgKlJlZmVycmFibGVUeXBlVGFibGUoKTsKKworaW5saW5lIGNvbnN0IGZsYXRidWZmZXJzOjpUeXBlVGFibGUgKk1vbnN0ZXJUeXBlVGFibGUoKTsKKworaW5saW5lIGNvbnN0IGZsYXRidWZmZXJzOjpUeXBlVGFibGUgKlR5cGVBbGlhc2VzVHlwZVRhYmxlKCk7CisKKy8vLyBDb21wb3NpdGUgY29tcG9uZW50cyBvZiBNb25zdGVyIGNvbG9yLgorZW51bSBDb2xvciA6IHVpbnQ4X3QgeworICBDb2xvcl9SZWQgPSAxLAorICAvLy8gXGJyaWVmIGNvbG9yIEdyZWVuCisgIC8vLyBHcmVlbiBpcyBiaXRfZmxhZyB3aXRoIHZhbHVlICgxdSA8PCAxKQorICBDb2xvcl9HcmVlbiA9IDIsCisgIC8vLyBcYnJpZWYgY29sb3IgQmx1ZSAoMXUgPDwgMykKKyAgQ29sb3JfQmx1ZSA9IDgsCisgIENvbG9yX05PTkUgPSAwLAorICBDb2xvcl9BTlkgPSAxMQorfTsKKworaW5saW5lIGNvbnN0IENvbG9yICgmRW51bVZhbHVlc0NvbG9yKCkpWzNdIHsKKyAgc3RhdGljIGNvbnN0IENvbG9yIHZhbHVlc1tdID0geworICAgIENvbG9yX1JlZCwKKyAgICBDb2xvcl9HcmVlbiwKKyAgICBDb2xvcl9CbHVlCisgIH07CisgIHJldHVybiB2YWx1ZXM7Cit9CisKK2lubGluZSBjb25zdCBjaGFyICogY29uc3QgKkVudW1OYW1lc0NvbG9yKCkgeworICBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IG5hbWVzWzldID0geworICAgICJSZWQiLAorICAgICJHcmVlbiIsCisgICAgIiIsCisgICAgIiIsCisgICAgIiIsCisgICAgIiIsCisgICAgIiIsCisgICAgIkJsdWUiLAorICAgIG51bGxwdHIKKyAgfTsKKyAgcmV0dXJuIG5hbWVzOworfQorCitpbmxpbmUgY29uc3QgY2hhciAqRW51bU5hbWVDb2xvcihDb2xvciBlKSB7CisgIGlmIChmbGF0YnVmZmVyczo6SXNPdXRSYW5nZShlLCBDb2xvcl9SZWQsIENvbG9yX0JsdWUpKSByZXR1cm4gIiI7CisgIGNvbnN0IHNpemVfdCBpbmRleCA9IHN0YXRpY19jYXN0PHNpemVfdD4oZSkgLSBzdGF0aWNfY2FzdDxzaXplX3Q+KENvbG9yX1JlZCk7CisgIHJldHVybiBFbnVtTmFtZXNDb2xvcigpW2luZGV4XTsKK30KKworZW51bSBSYWNlIDogaW50OF90IHsKKyAgUmFjZV9Ob25lID0gLTEsCisgIFJhY2VfSHVtYW4gPSAwLAorICBSYWNlX0R3YXJmID0gMSwKKyAgUmFjZV9FbGYgPSAyLAorICBSYWNlX01JTiA9IFJhY2VfTm9uZSwKKyAgUmFjZV9NQVggPSBSYWNlX0VsZgorfTsKKworaW5saW5lIGNvbnN0IFJhY2UgKCZFbnVtVmFsdWVzUmFjZSgpKVs0XSB7CisgIHN0YXRpYyBjb25zdCBSYWNlIHZhbHVlc1tdID0geworICAgIFJhY2VfTm9uZSwKKyAgICBSYWNlX0h1bWFuLAorICAgIFJhY2VfRHdhcmYsCisgICAgUmFjZV9FbGYKKyAgfTsKKyAgcmV0dXJuIHZhbHVlczsKK30KKworaW5saW5lIGNvbnN0IGNoYXIgKiBjb25zdCAqRW51bU5hbWVzUmFjZSgpIHsKKyAgc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBuYW1lc1s1XSA9IHsKKyAgICAiTm9uZSIsCisgICAgIkh1bWFuIiwKKyAgICAiRHdhcmYiLAorICAgICJFbGYiLAorICAgIG51bGxwdHIKKyAgfTsKKyAgcmV0dXJuIG5hbWVzOworfQorCitpbmxpbmUgY29uc3QgY2hhciAqRW51bU5hbWVSYWNlKFJhY2UgZSkgeworICBpZiAoZmxhdGJ1ZmZlcnM6OklzT3V0UmFuZ2UoZSwgUmFjZV9Ob25lLCBSYWNlX0VsZikpIHJldHVybiAiIjsKKyAgY29uc3Qgc2l6ZV90IGluZGV4ID0gc3RhdGljX2Nhc3Q8c2l6ZV90PihlKSAtIHN0YXRpY19jYXN0PHNpemVfdD4oUmFjZV9Ob25lKTsKKyAgcmV0dXJuIEVudW1OYW1lc1JhY2UoKVtpbmRleF07Cit9CisKK2VudW0gTG9uZ0VudW0gOiB1aW50NjRfdCB7CisgIExvbmdFbnVtX0xvbmdPbmUgPSAyVUxMLAorICBMb25nRW51bV9Mb25nVHdvID0gNFVMTCwKKyAgTG9uZ0VudW1fTG9uZ0JpZyA9IDEwOTk1MTE2Mjc3NzZVTEwsCisgIExvbmdFbnVtX05PTkUgPSAwLAorICBMb25nRW51bV9BTlkgPSAxMDk5NTExNjI3NzgyVUxMCit9OworCitpbmxpbmUgY29uc3QgTG9uZ0VudW0gKCZFbnVtVmFsdWVzTG9uZ0VudW0oKSlbM10geworICBzdGF0aWMgY29uc3QgTG9uZ0VudW0gdmFsdWVzW10gPSB7CisgICAgTG9uZ0VudW1fTG9uZ09uZSwKKyAgICBMb25nRW51bV9Mb25nVHdvLAorICAgIExvbmdFbnVtX0xvbmdCaWcKKyAgfTsKKyAgcmV0dXJuIHZhbHVlczsKK30KKworaW5saW5lIGNvbnN0IGNoYXIgKkVudW1OYW1lTG9uZ0VudW0oTG9uZ0VudW0gZSkgeworICBzd2l0Y2ggKGUpIHsKKyAgICBjYXNlIExvbmdFbnVtX0xvbmdPbmU6IHJldHVybiAiTG9uZ09uZSI7CisgICAgY2FzZSBMb25nRW51bV9Mb25nVHdvOiByZXR1cm4gIkxvbmdUd28iOworICAgIGNhc2UgTG9uZ0VudW1fTG9uZ0JpZzogcmV0dXJuICJMb25nQmlnIjsKKyAgICBkZWZhdWx0OiByZXR1cm4gIiI7CisgIH0KK30KKworZW51bSBBbnkgOiB1aW50OF90IHsKKyAgQW55X05PTkUgPSAwLAorICBBbnlfTW9uc3RlciA9IDEsCisgIEFueV9UZXN0U2ltcGxlVGFibGVXaXRoRW51bSA9IDIsCisgIEFueV9NeUdhbWVfRXhhbXBsZTJfTW9uc3RlciA9IDMsCisgIEFueV9NSU4gPSBBbnlfTk9ORSwKKyAgQW55X01BWCA9IEFueV9NeUdhbWVfRXhhbXBsZTJfTW9uc3RlcgorfTsKKworaW5saW5lIGNvbnN0IEFueSAoJkVudW1WYWx1ZXNBbnkoKSlbNF0geworICBzdGF0aWMgY29uc3QgQW55IHZhbHVlc1tdID0geworICAgIEFueV9OT05FLAorICAgIEFueV9Nb25zdGVyLAorICAgIEFueV9UZXN0U2ltcGxlVGFibGVXaXRoRW51bSwKKyAgICBBbnlfTXlHYW1lX0V4YW1wbGUyX01vbnN0ZXIKKyAgfTsKKyAgcmV0dXJuIHZhbHVlczsKK30KKworaW5saW5lIGNvbnN0IGNoYXIgKiBjb25zdCAqRW51bU5hbWVzQW55KCkgeworICBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IG5hbWVzWzVdID0geworICAgICJOT05FIiwKKyAgICAiTW9uc3RlciIsCisgICAgIlRlc3RTaW1wbGVUYWJsZVdpdGhFbnVtIiwKKyAgICAiTXlHYW1lX0V4YW1wbGUyX01vbnN0ZXIiLAorICAgIG51bGxwdHIKKyAgfTsKKyAgcmV0dXJuIG5hbWVzOworfQorCitpbmxpbmUgY29uc3QgY2hhciAqRW51bU5hbWVBbnkoQW55IGUpIHsKKyAgaWYgKGZsYXRidWZmZXJzOjpJc091dFJhbmdlKGUsIEFueV9OT05FLCBBbnlfTXlHYW1lX0V4YW1wbGUyX01vbnN0ZXIpKSByZXR1cm4gIiI7CisgIGNvbnN0IHNpemVfdCBpbmRleCA9IHN0YXRpY19jYXN0PHNpemVfdD4oZSk7CisgIHJldHVybiBFbnVtTmFtZXNBbnkoKVtpbmRleF07Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+IHN0cnVjdCBBbnlUcmFpdHMgeworICBzdGF0aWMgY29uc3QgQW55IGVudW1fdmFsdWUgPSBBbnlfTk9ORTsKK307CisKK3RlbXBsYXRlPD4gc3RydWN0IEFueVRyYWl0czxNeUdhbWU6OkV4YW1wbGU6Ok1vbnN0ZXI+IHsKKyAgc3RhdGljIGNvbnN0IEFueSBlbnVtX3ZhbHVlID0gQW55X01vbnN0ZXI7Cit9OworCit0ZW1wbGF0ZTw+IHN0cnVjdCBBbnlUcmFpdHM8TXlHYW1lOjpFeGFtcGxlOjpUZXN0U2ltcGxlVGFibGVXaXRoRW51bT4geworICBzdGF0aWMgY29uc3QgQW55IGVudW1fdmFsdWUgPSBBbnlfVGVzdFNpbXBsZVRhYmxlV2l0aEVudW07Cit9OworCit0ZW1wbGF0ZTw+IHN0cnVjdCBBbnlUcmFpdHM8TXlHYW1lOjpFeGFtcGxlMjo6TW9uc3Rlcj4geworICBzdGF0aWMgY29uc3QgQW55IGVudW1fdmFsdWUgPSBBbnlfTXlHYW1lX0V4YW1wbGUyX01vbnN0ZXI7Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBzdHJ1Y3QgQW55VW5pb25UcmFpdHMgeworICBzdGF0aWMgY29uc3QgQW55IGVudW1fdmFsdWUgPSBBbnlfTk9ORTsKK307CisKK3RlbXBsYXRlPD4gc3RydWN0IEFueVVuaW9uVHJhaXRzPE15R2FtZTo6RXhhbXBsZTo6TW9uc3RlclQ+IHsKKyAgc3RhdGljIGNvbnN0IEFueSBlbnVtX3ZhbHVlID0gQW55X01vbnN0ZXI7Cit9OworCit0ZW1wbGF0ZTw+IHN0cnVjdCBBbnlVbmlvblRyYWl0czxNeUdhbWU6OkV4YW1wbGU6OlRlc3RTaW1wbGVUYWJsZVdpdGhFbnVtVD4geworICBzdGF0aWMgY29uc3QgQW55IGVudW1fdmFsdWUgPSBBbnlfVGVzdFNpbXBsZVRhYmxlV2l0aEVudW07Cit9OworCit0ZW1wbGF0ZTw+IHN0cnVjdCBBbnlVbmlvblRyYWl0czxNeUdhbWU6OkV4YW1wbGUyOjpNb25zdGVyVD4geworICBzdGF0aWMgY29uc3QgQW55IGVudW1fdmFsdWUgPSBBbnlfTXlHYW1lX0V4YW1wbGUyX01vbnN0ZXI7Cit9OworCitzdHJ1Y3QgQW55VW5pb24geworICBBbnkgdHlwZTsKKyAgdm9pZCAqdmFsdWU7CisKKyAgQW55VW5pb24oKSA6IHR5cGUoQW55X05PTkUpLCB2YWx1ZShudWxscHRyKSB7fQorICBBbnlVbmlvbihBbnlVbmlvbiYmIHUpIEZMQVRCVUZGRVJTX05PRVhDRVBUIDoKKyAgICB0eXBlKEFueV9OT05FKSwgdmFsdWUobnVsbHB0cikKKyAgICB7IHN0ZDo6c3dhcCh0eXBlLCB1LnR5cGUpOyBzdGQ6OnN3YXAodmFsdWUsIHUudmFsdWUpOyB9CisgIEFueVVuaW9uKGNvbnN0IEFueVVuaW9uICYpOworICBBbnlVbmlvbiAmb3BlcmF0b3I9KGNvbnN0IEFueVVuaW9uICZ1KQorICAgIHsgQW55VW5pb24gdCh1KTsgc3RkOjpzd2FwKHR5cGUsIHQudHlwZSk7IHN0ZDo6c3dhcCh2YWx1ZSwgdC52YWx1ZSk7IHJldHVybiAqdGhpczsgfQorICBBbnlVbmlvbiAmb3BlcmF0b3I9KEFueVVuaW9uICYmdSkgRkxBVEJVRkZFUlNfTk9FWENFUFQKKyAgICB7IHN0ZDo6c3dhcCh0eXBlLCB1LnR5cGUpOyBzdGQ6OnN3YXAodmFsdWUsIHUudmFsdWUpOyByZXR1cm4gKnRoaXM7IH0KKyAgfkFueVVuaW9uKCkgeyBSZXNldCgpOyB9CisKKyAgdm9pZCBSZXNldCgpOworCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICB2b2lkIFNldChUJiYgdmFsKSB7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBzdGQ6OnJlbW92ZV9yZWZlcmVuY2U8VD46OnR5cGUgUlQ7CisgICAgUmVzZXQoKTsKKyAgICB0eXBlID0gQW55VW5pb25UcmFpdHM8UlQ+OjplbnVtX3ZhbHVlOworICAgIGlmICh0eXBlICE9IEFueV9OT05FKSB7CisgICAgICB2YWx1ZSA9IG5ldyBSVChzdGQ6OmZvcndhcmQ8VD4odmFsKSk7CisgICAgfQorICB9CisKKyAgc3RhdGljIHZvaWQgKlVuUGFjayhjb25zdCB2b2lkICpvYmosIEFueSB0eXBlLCBjb25zdCBmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqcmVzb2x2ZXIpOworICBmbGF0YnVmZmVyczo6T2Zmc2V0PHZvaWQ+IFBhY2soZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyID0gbnVsbHB0cikgY29uc3Q7CisKKyAgTXlHYW1lOjpFeGFtcGxlOjpNb25zdGVyVCAqQXNNb25zdGVyKCkgeworICAgIHJldHVybiB0eXBlID09IEFueV9Nb25zdGVyID8KKyAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8TXlHYW1lOjpFeGFtcGxlOjpNb25zdGVyVCAqPih2YWx1ZSkgOiBudWxscHRyOworICB9CisgIGNvbnN0IE15R2FtZTo6RXhhbXBsZTo6TW9uc3RlclQgKkFzTW9uc3RlcigpIGNvbnN0IHsKKyAgICByZXR1cm4gdHlwZSA9PSBBbnlfTW9uc3RlciA/CisgICAgICByZWludGVycHJldF9jYXN0PGNvbnN0IE15R2FtZTo6RXhhbXBsZTo6TW9uc3RlclQgKj4odmFsdWUpIDogbnVsbHB0cjsKKyAgfQorICBNeUdhbWU6OkV4YW1wbGU6OlRlc3RTaW1wbGVUYWJsZVdpdGhFbnVtVCAqQXNUZXN0U2ltcGxlVGFibGVXaXRoRW51bSgpIHsKKyAgICByZXR1cm4gdHlwZSA9PSBBbnlfVGVzdFNpbXBsZVRhYmxlV2l0aEVudW0gPworICAgICAgcmVpbnRlcnByZXRfY2FzdDxNeUdhbWU6OkV4YW1wbGU6OlRlc3RTaW1wbGVUYWJsZVdpdGhFbnVtVCAqPih2YWx1ZSkgOiBudWxscHRyOworICB9CisgIGNvbnN0IE15R2FtZTo6RXhhbXBsZTo6VGVzdFNpbXBsZVRhYmxlV2l0aEVudW1UICpBc1Rlc3RTaW1wbGVUYWJsZVdpdGhFbnVtKCkgY29uc3QgeworICAgIHJldHVybiB0eXBlID09IEFueV9UZXN0U2ltcGxlVGFibGVXaXRoRW51bSA/CisgICAgICByZWludGVycHJldF9jYXN0PGNvbnN0IE15R2FtZTo6RXhhbXBsZTo6VGVzdFNpbXBsZVRhYmxlV2l0aEVudW1UICo+KHZhbHVlKSA6IG51bGxwdHI7CisgIH0KKyAgTXlHYW1lOjpFeGFtcGxlMjo6TW9uc3RlclQgKkFzTXlHYW1lX0V4YW1wbGUyX01vbnN0ZXIoKSB7CisgICAgcmV0dXJuIHR5cGUgPT0gQW55X015R2FtZV9FeGFtcGxlMl9Nb25zdGVyID8KKyAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8TXlHYW1lOjpFeGFtcGxlMjo6TW9uc3RlclQgKj4odmFsdWUpIDogbnVsbHB0cjsKKyAgfQorICBjb25zdCBNeUdhbWU6OkV4YW1wbGUyOjpNb25zdGVyVCAqQXNNeUdhbWVfRXhhbXBsZTJfTW9uc3RlcigpIGNvbnN0IHsKKyAgICByZXR1cm4gdHlwZSA9PSBBbnlfTXlHYW1lX0V4YW1wbGUyX01vbnN0ZXIgPworICAgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBNeUdhbWU6OkV4YW1wbGUyOjpNb25zdGVyVCAqPih2YWx1ZSkgOiBudWxscHRyOworICB9Cit9OworCisKK2lubGluZSBib29sIG9wZXJhdG9yPT0oY29uc3QgQW55VW5pb24gJmxocywgY29uc3QgQW55VW5pb24gJnJocykgeworICBpZiAobGhzLnR5cGUgIT0gcmhzLnR5cGUpIHJldHVybiBmYWxzZTsKKyAgc3dpdGNoIChsaHMudHlwZSkgeworICAgIGNhc2UgQW55X05PTkU6IHsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICBjYXNlIEFueV9Nb25zdGVyOiB7CisgICAgICByZXR1cm4gKihyZWludGVycHJldF9jYXN0PGNvbnN0IE15R2FtZTo6RXhhbXBsZTo6TW9uc3RlclQgKj4obGhzLnZhbHVlKSkgPT0KKyAgICAgICAgICAgICAqKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgTXlHYW1lOjpFeGFtcGxlOjpNb25zdGVyVCAqPihyaHMudmFsdWUpKTsKKyAgICB9CisgICAgY2FzZSBBbnlfVGVzdFNpbXBsZVRhYmxlV2l0aEVudW06IHsKKyAgICAgIHJldHVybiAqKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgTXlHYW1lOjpFeGFtcGxlOjpUZXN0U2ltcGxlVGFibGVXaXRoRW51bVQgKj4obGhzLnZhbHVlKSkgPT0KKyAgICAgICAgICAgICAqKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgTXlHYW1lOjpFeGFtcGxlOjpUZXN0U2ltcGxlVGFibGVXaXRoRW51bVQgKj4ocmhzLnZhbHVlKSk7CisgICAgfQorICAgIGNhc2UgQW55X015R2FtZV9FeGFtcGxlMl9Nb25zdGVyOiB7CisgICAgICByZXR1cm4gKihyZWludGVycHJldF9jYXN0PGNvbnN0IE15R2FtZTo6RXhhbXBsZTI6Ok1vbnN0ZXJUICo+KGxocy52YWx1ZSkpID09CisgICAgICAgICAgICAgKihyZWludGVycHJldF9jYXN0PGNvbnN0IE15R2FtZTo6RXhhbXBsZTI6Ok1vbnN0ZXJUICo+KHJocy52YWx1ZSkpOworICAgIH0KKyAgICBkZWZhdWx0OiB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICB9Cit9CisKK2lubGluZSBib29sIG9wZXJhdG9yIT0oY29uc3QgQW55VW5pb24gJmxocywgY29uc3QgQW55VW5pb24gJnJocykgeworICAgIHJldHVybiAhKGxocyA9PSByaHMpOworfQorCitib29sIFZlcmlmeUFueShmbGF0YnVmZmVyczo6VmVyaWZpZXIgJnZlcmlmaWVyLCBjb25zdCB2b2lkICpvYmosIEFueSB0eXBlKTsKK2Jvb2wgVmVyaWZ5QW55VmVjdG9yKGZsYXRidWZmZXJzOjpWZXJpZmllciAmdmVyaWZpZXIsIGNvbnN0IGZsYXRidWZmZXJzOjpWZWN0b3I8ZmxhdGJ1ZmZlcnM6Ok9mZnNldDx2b2lkPj4gKnZhbHVlcywgY29uc3QgZmxhdGJ1ZmZlcnM6OlZlY3Rvcjx1aW50OF90PiAqdHlwZXMpOworCitlbnVtIEFueVVuaXF1ZUFsaWFzZXMgOiB1aW50OF90IHsKKyAgQW55VW5pcXVlQWxpYXNlc19OT05FID0gMCwKKyAgQW55VW5pcXVlQWxpYXNlc19NID0gMSwKKyAgQW55VW5pcXVlQWxpYXNlc19UUyA9IDIsCisgIEFueVVuaXF1ZUFsaWFzZXNfTTIgPSAzLAorICBBbnlVbmlxdWVBbGlhc2VzX01JTiA9IEFueVVuaXF1ZUFsaWFzZXNfTk9ORSwKKyAgQW55VW5pcXVlQWxpYXNlc19NQVggPSBBbnlVbmlxdWVBbGlhc2VzX00yCit9OworCitpbmxpbmUgY29uc3QgQW55VW5pcXVlQWxpYXNlcyAoJkVudW1WYWx1ZXNBbnlVbmlxdWVBbGlhc2VzKCkpWzRdIHsKKyAgc3RhdGljIGNvbnN0IEFueVVuaXF1ZUFsaWFzZXMgdmFsdWVzW10gPSB7CisgICAgQW55VW5pcXVlQWxpYXNlc19OT05FLAorICAgIEFueVVuaXF1ZUFsaWFzZXNfTSwKKyAgICBBbnlVbmlxdWVBbGlhc2VzX1RTLAorICAgIEFueVVuaXF1ZUFsaWFzZXNfTTIKKyAgfTsKKyAgcmV0dXJuIHZhbHVlczsKK30KKworaW5saW5lIGNvbnN0IGNoYXIgKiBjb25zdCAqRW51bU5hbWVzQW55VW5pcXVlQWxpYXNlcygpIHsKKyAgc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBuYW1lc1s1XSA9IHsKKyAgICAiTk9ORSIsCisgICAgIk0iLAorICAgICJUUyIsCisgICAgIk0yIiwKKyAgICBudWxscHRyCisgIH07CisgIHJldHVybiBuYW1lczsKK30KKworaW5saW5lIGNvbnN0IGNoYXIgKkVudW1OYW1lQW55VW5pcXVlQWxpYXNlcyhBbnlVbmlxdWVBbGlhc2VzIGUpIHsKKyAgaWYgKGZsYXRidWZmZXJzOjpJc091dFJhbmdlKGUsIEFueVVuaXF1ZUFsaWFzZXNfTk9ORSwgQW55VW5pcXVlQWxpYXNlc19NMikpIHJldHVybiAiIjsKKyAgY29uc3Qgc2l6ZV90IGluZGV4ID0gc3RhdGljX2Nhc3Q8c2l6ZV90PihlKTsKKyAgcmV0dXJuIEVudW1OYW1lc0FueVVuaXF1ZUFsaWFzZXMoKVtpbmRleF07Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+IHN0cnVjdCBBbnlVbmlxdWVBbGlhc2VzVHJhaXRzIHsKKyAgc3RhdGljIGNvbnN0IEFueVVuaXF1ZUFsaWFzZXMgZW51bV92YWx1ZSA9IEFueVVuaXF1ZUFsaWFzZXNfTk9ORTsKK307CisKK3RlbXBsYXRlPD4gc3RydWN0IEFueVVuaXF1ZUFsaWFzZXNUcmFpdHM8TXlHYW1lOjpFeGFtcGxlOjpNb25zdGVyPiB7CisgIHN0YXRpYyBjb25zdCBBbnlVbmlxdWVBbGlhc2VzIGVudW1fdmFsdWUgPSBBbnlVbmlxdWVBbGlhc2VzX007Cit9OworCit0ZW1wbGF0ZTw+IHN0cnVjdCBBbnlVbmlxdWVBbGlhc2VzVHJhaXRzPE15R2FtZTo6RXhhbXBsZTo6VGVzdFNpbXBsZVRhYmxlV2l0aEVudW0+IHsKKyAgc3RhdGljIGNvbnN0IEFueVVuaXF1ZUFsaWFzZXMgZW51bV92YWx1ZSA9IEFueVVuaXF1ZUFsaWFzZXNfVFM7Cit9OworCit0ZW1wbGF0ZTw+IHN0cnVjdCBBbnlVbmlxdWVBbGlhc2VzVHJhaXRzPE15R2FtZTo6RXhhbXBsZTI6Ok1vbnN0ZXI+IHsKKyAgc3RhdGljIGNvbnN0IEFueVVuaXF1ZUFsaWFzZXMgZW51bV92YWx1ZSA9IEFueVVuaXF1ZUFsaWFzZXNfTTI7Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBzdHJ1Y3QgQW55VW5pcXVlQWxpYXNlc1VuaW9uVHJhaXRzIHsKKyAgc3RhdGljIGNvbnN0IEFueVVuaXF1ZUFsaWFzZXMgZW51bV92YWx1ZSA9IEFueVVuaXF1ZUFsaWFzZXNfTk9ORTsKK307CisKK3RlbXBsYXRlPD4gc3RydWN0IEFueVVuaXF1ZUFsaWFzZXNVbmlvblRyYWl0czxNeUdhbWU6OkV4YW1wbGU6Ok1vbnN0ZXJUPiB7CisgIHN0YXRpYyBjb25zdCBBbnlVbmlxdWVBbGlhc2VzIGVudW1fdmFsdWUgPSBBbnlVbmlxdWVBbGlhc2VzX007Cit9OworCit0ZW1wbGF0ZTw+IHN0cnVjdCBBbnlVbmlxdWVBbGlhc2VzVW5pb25UcmFpdHM8TXlHYW1lOjpFeGFtcGxlOjpUZXN0U2ltcGxlVGFibGVXaXRoRW51bVQ+IHsKKyAgc3RhdGljIGNvbnN0IEFueVVuaXF1ZUFsaWFzZXMgZW51bV92YWx1ZSA9IEFueVVuaXF1ZUFsaWFzZXNfVFM7Cit9OworCit0ZW1wbGF0ZTw+IHN0cnVjdCBBbnlVbmlxdWVBbGlhc2VzVW5pb25UcmFpdHM8TXlHYW1lOjpFeGFtcGxlMjo6TW9uc3RlclQ+IHsKKyAgc3RhdGljIGNvbnN0IEFueVVuaXF1ZUFsaWFzZXMgZW51bV92YWx1ZSA9IEFueVVuaXF1ZUFsaWFzZXNfTTI7Cit9OworCitzdHJ1Y3QgQW55VW5pcXVlQWxpYXNlc1VuaW9uIHsKKyAgQW55VW5pcXVlQWxpYXNlcyB0eXBlOworICB2b2lkICp2YWx1ZTsKKworICBBbnlVbmlxdWVBbGlhc2VzVW5pb24oKSA6IHR5cGUoQW55VW5pcXVlQWxpYXNlc19OT05FKSwgdmFsdWUobnVsbHB0cikge30KKyAgQW55VW5pcXVlQWxpYXNlc1VuaW9uKEFueVVuaXF1ZUFsaWFzZXNVbmlvbiYmIHUpIEZMQVRCVUZGRVJTX05PRVhDRVBUIDoKKyAgICB0eXBlKEFueVVuaXF1ZUFsaWFzZXNfTk9ORSksIHZhbHVlKG51bGxwdHIpCisgICAgeyBzdGQ6OnN3YXAodHlwZSwgdS50eXBlKTsgc3RkOjpzd2FwKHZhbHVlLCB1LnZhbHVlKTsgfQorICBBbnlVbmlxdWVBbGlhc2VzVW5pb24oY29uc3QgQW55VW5pcXVlQWxpYXNlc1VuaW9uICYpOworICBBbnlVbmlxdWVBbGlhc2VzVW5pb24gJm9wZXJhdG9yPShjb25zdCBBbnlVbmlxdWVBbGlhc2VzVW5pb24gJnUpCisgICAgeyBBbnlVbmlxdWVBbGlhc2VzVW5pb24gdCh1KTsgc3RkOjpzd2FwKHR5cGUsIHQudHlwZSk7IHN0ZDo6c3dhcCh2YWx1ZSwgdC52YWx1ZSk7IHJldHVybiAqdGhpczsgfQorICBBbnlVbmlxdWVBbGlhc2VzVW5pb24gJm9wZXJhdG9yPShBbnlVbmlxdWVBbGlhc2VzVW5pb24gJiZ1KSBGTEFUQlVGRkVSU19OT0VYQ0VQVAorICAgIHsgc3RkOjpzd2FwKHR5cGUsIHUudHlwZSk7IHN0ZDo6c3dhcCh2YWx1ZSwgdS52YWx1ZSk7IHJldHVybiAqdGhpczsgfQorICB+QW55VW5pcXVlQWxpYXNlc1VuaW9uKCkgeyBSZXNldCgpOyB9CisKKyAgdm9pZCBSZXNldCgpOworCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICB2b2lkIFNldChUJiYgdmFsKSB7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBzdGQ6OnJlbW92ZV9yZWZlcmVuY2U8VD46OnR5cGUgUlQ7CisgICAgUmVzZXQoKTsKKyAgICB0eXBlID0gQW55VW5pcXVlQWxpYXNlc1VuaW9uVHJhaXRzPFJUPjo6ZW51bV92YWx1ZTsKKyAgICBpZiAodHlwZSAhPSBBbnlVbmlxdWVBbGlhc2VzX05PTkUpIHsKKyAgICAgIHZhbHVlID0gbmV3IFJUKHN0ZDo6Zm9yd2FyZDxUPih2YWwpKTsKKyAgICB9CisgIH0KKworICBzdGF0aWMgdm9pZCAqVW5QYWNrKGNvbnN0IHZvaWQgKm9iaiwgQW55VW5pcXVlQWxpYXNlcyB0eXBlLCBjb25zdCBmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqcmVzb2x2ZXIpOworICBmbGF0YnVmZmVyczo6T2Zmc2V0PHZvaWQ+IFBhY2soZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyID0gbnVsbHB0cikgY29uc3Q7CisKKyAgTXlHYW1lOjpFeGFtcGxlOjpNb25zdGVyVCAqQXNNKCkgeworICAgIHJldHVybiB0eXBlID09IEFueVVuaXF1ZUFsaWFzZXNfTSA/CisgICAgICByZWludGVycHJldF9jYXN0PE15R2FtZTo6RXhhbXBsZTo6TW9uc3RlclQgKj4odmFsdWUpIDogbnVsbHB0cjsKKyAgfQorICBjb25zdCBNeUdhbWU6OkV4YW1wbGU6Ok1vbnN0ZXJUICpBc00oKSBjb25zdCB7CisgICAgcmV0dXJuIHR5cGUgPT0gQW55VW5pcXVlQWxpYXNlc19NID8KKyAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgTXlHYW1lOjpFeGFtcGxlOjpNb25zdGVyVCAqPih2YWx1ZSkgOiBudWxscHRyOworICB9CisgIE15R2FtZTo6RXhhbXBsZTo6VGVzdFNpbXBsZVRhYmxlV2l0aEVudW1UICpBc1RTKCkgeworICAgIHJldHVybiB0eXBlID09IEFueVVuaXF1ZUFsaWFzZXNfVFMgPworICAgICAgcmVpbnRlcnByZXRfY2FzdDxNeUdhbWU6OkV4YW1wbGU6OlRlc3RTaW1wbGVUYWJsZVdpdGhFbnVtVCAqPih2YWx1ZSkgOiBudWxscHRyOworICB9CisgIGNvbnN0IE15R2FtZTo6RXhhbXBsZTo6VGVzdFNpbXBsZVRhYmxlV2l0aEVudW1UICpBc1RTKCkgY29uc3QgeworICAgIHJldHVybiB0eXBlID09IEFueVVuaXF1ZUFsaWFzZXNfVFMgPworICAgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBNeUdhbWU6OkV4YW1wbGU6OlRlc3RTaW1wbGVUYWJsZVdpdGhFbnVtVCAqPih2YWx1ZSkgOiBudWxscHRyOworICB9CisgIE15R2FtZTo6RXhhbXBsZTI6Ok1vbnN0ZXJUICpBc00yKCkgeworICAgIHJldHVybiB0eXBlID09IEFueVVuaXF1ZUFsaWFzZXNfTTIgPworICAgICAgcmVpbnRlcnByZXRfY2FzdDxNeUdhbWU6OkV4YW1wbGUyOjpNb25zdGVyVCAqPih2YWx1ZSkgOiBudWxscHRyOworICB9CisgIGNvbnN0IE15R2FtZTo6RXhhbXBsZTI6Ok1vbnN0ZXJUICpBc00yKCkgY29uc3QgeworICAgIHJldHVybiB0eXBlID09IEFueVVuaXF1ZUFsaWFzZXNfTTIgPworICAgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBNeUdhbWU6OkV4YW1wbGUyOjpNb25zdGVyVCAqPih2YWx1ZSkgOiBudWxscHRyOworICB9Cit9OworCisKK2lubGluZSBib29sIG9wZXJhdG9yPT0oY29uc3QgQW55VW5pcXVlQWxpYXNlc1VuaW9uICZsaHMsIGNvbnN0IEFueVVuaXF1ZUFsaWFzZXNVbmlvbiAmcmhzKSB7CisgIGlmIChsaHMudHlwZSAhPSByaHMudHlwZSkgcmV0dXJuIGZhbHNlOworICBzd2l0Y2ggKGxocy50eXBlKSB7CisgICAgY2FzZSBBbnlVbmlxdWVBbGlhc2VzX05PTkU6IHsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICBjYXNlIEFueVVuaXF1ZUFsaWFzZXNfTTogeworICAgICAgcmV0dXJuICoocmVpbnRlcnByZXRfY2FzdDxjb25zdCBNeUdhbWU6OkV4YW1wbGU6Ok1vbnN0ZXJUICo+KGxocy52YWx1ZSkpID09CisgICAgICAgICAgICAgKihyZWludGVycHJldF9jYXN0PGNvbnN0IE15R2FtZTo6RXhhbXBsZTo6TW9uc3RlclQgKj4ocmhzLnZhbHVlKSk7CisgICAgfQorICAgIGNhc2UgQW55VW5pcXVlQWxpYXNlc19UUzogeworICAgICAgcmV0dXJuICoocmVpbnRlcnByZXRfY2FzdDxjb25zdCBNeUdhbWU6OkV4YW1wbGU6OlRlc3RTaW1wbGVUYWJsZVdpdGhFbnVtVCAqPihsaHMudmFsdWUpKSA9PQorICAgICAgICAgICAgICoocmVpbnRlcnByZXRfY2FzdDxjb25zdCBNeUdhbWU6OkV4YW1wbGU6OlRlc3RTaW1wbGVUYWJsZVdpdGhFbnVtVCAqPihyaHMudmFsdWUpKTsKKyAgICB9CisgICAgY2FzZSBBbnlVbmlxdWVBbGlhc2VzX00yOiB7CisgICAgICByZXR1cm4gKihyZWludGVycHJldF9jYXN0PGNvbnN0IE15R2FtZTo6RXhhbXBsZTI6Ok1vbnN0ZXJUICo+KGxocy52YWx1ZSkpID09CisgICAgICAgICAgICAgKihyZWludGVycHJldF9jYXN0PGNvbnN0IE15R2FtZTo6RXhhbXBsZTI6Ok1vbnN0ZXJUICo+KHJocy52YWx1ZSkpOworICAgIH0KKyAgICBkZWZhdWx0OiB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICB9Cit9CisKK2lubGluZSBib29sIG9wZXJhdG9yIT0oY29uc3QgQW55VW5pcXVlQWxpYXNlc1VuaW9uICZsaHMsIGNvbnN0IEFueVVuaXF1ZUFsaWFzZXNVbmlvbiAmcmhzKSB7CisgICAgcmV0dXJuICEobGhzID09IHJocyk7Cit9CisKK2Jvb2wgVmVyaWZ5QW55VW5pcXVlQWxpYXNlcyhmbGF0YnVmZmVyczo6VmVyaWZpZXIgJnZlcmlmaWVyLCBjb25zdCB2b2lkICpvYmosIEFueVVuaXF1ZUFsaWFzZXMgdHlwZSk7Citib29sIFZlcmlmeUFueVVuaXF1ZUFsaWFzZXNWZWN0b3IoZmxhdGJ1ZmZlcnM6OlZlcmlmaWVyICZ2ZXJpZmllciwgY29uc3QgZmxhdGJ1ZmZlcnM6OlZlY3RvcjxmbGF0YnVmZmVyczo6T2Zmc2V0PHZvaWQ+PiAqdmFsdWVzLCBjb25zdCBmbGF0YnVmZmVyczo6VmVjdG9yPHVpbnQ4X3Q+ICp0eXBlcyk7CisKK2VudW0gQW55QW1iaWd1b3VzQWxpYXNlcyA6IHVpbnQ4X3QgeworICBBbnlBbWJpZ3VvdXNBbGlhc2VzX05PTkUgPSAwLAorICBBbnlBbWJpZ3VvdXNBbGlhc2VzX00xID0gMSwKKyAgQW55QW1iaWd1b3VzQWxpYXNlc19NMiA9IDIsCisgIEFueUFtYmlndW91c0FsaWFzZXNfTTMgPSAzLAorICBBbnlBbWJpZ3VvdXNBbGlhc2VzX01JTiA9IEFueUFtYmlndW91c0FsaWFzZXNfTk9ORSwKKyAgQW55QW1iaWd1b3VzQWxpYXNlc19NQVggPSBBbnlBbWJpZ3VvdXNBbGlhc2VzX00zCit9OworCitpbmxpbmUgY29uc3QgQW55QW1iaWd1b3VzQWxpYXNlcyAoJkVudW1WYWx1ZXNBbnlBbWJpZ3VvdXNBbGlhc2VzKCkpWzRdIHsKKyAgc3RhdGljIGNvbnN0IEFueUFtYmlndW91c0FsaWFzZXMgdmFsdWVzW10gPSB7CisgICAgQW55QW1iaWd1b3VzQWxpYXNlc19OT05FLAorICAgIEFueUFtYmlndW91c0FsaWFzZXNfTTEsCisgICAgQW55QW1iaWd1b3VzQWxpYXNlc19NMiwKKyAgICBBbnlBbWJpZ3VvdXNBbGlhc2VzX00zCisgIH07CisgIHJldHVybiB2YWx1ZXM7Cit9CisKK2lubGluZSBjb25zdCBjaGFyICogY29uc3QgKkVudW1OYW1lc0FueUFtYmlndW91c0FsaWFzZXMoKSB7CisgIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgbmFtZXNbNV0gPSB7CisgICAgIk5PTkUiLAorICAgICJNMSIsCisgICAgIk0yIiwKKyAgICAiTTMiLAorICAgIG51bGxwdHIKKyAgfTsKKyAgcmV0dXJuIG5hbWVzOworfQorCitpbmxpbmUgY29uc3QgY2hhciAqRW51bU5hbWVBbnlBbWJpZ3VvdXNBbGlhc2VzKEFueUFtYmlndW91c0FsaWFzZXMgZSkgeworICBpZiAoZmxhdGJ1ZmZlcnM6OklzT3V0UmFuZ2UoZSwgQW55QW1iaWd1b3VzQWxpYXNlc19OT05FLCBBbnlBbWJpZ3VvdXNBbGlhc2VzX00zKSkgcmV0dXJuICIiOworICBjb25zdCBzaXplX3QgaW5kZXggPSBzdGF0aWNfY2FzdDxzaXplX3Q+KGUpOworICByZXR1cm4gRW51bU5hbWVzQW55QW1iaWd1b3VzQWxpYXNlcygpW2luZGV4XTsKK30KKworc3RydWN0IEFueUFtYmlndW91c0FsaWFzZXNVbmlvbiB7CisgIEFueUFtYmlndW91c0FsaWFzZXMgdHlwZTsKKyAgdm9pZCAqdmFsdWU7CisKKyAgQW55QW1iaWd1b3VzQWxpYXNlc1VuaW9uKCkgOiB0eXBlKEFueUFtYmlndW91c0FsaWFzZXNfTk9ORSksIHZhbHVlKG51bGxwdHIpIHt9CisgIEFueUFtYmlndW91c0FsaWFzZXNVbmlvbihBbnlBbWJpZ3VvdXNBbGlhc2VzVW5pb24mJiB1KSBGTEFUQlVGRkVSU19OT0VYQ0VQVCA6CisgICAgdHlwZShBbnlBbWJpZ3VvdXNBbGlhc2VzX05PTkUpLCB2YWx1ZShudWxscHRyKQorICAgIHsgc3RkOjpzd2FwKHR5cGUsIHUudHlwZSk7IHN0ZDo6c3dhcCh2YWx1ZSwgdS52YWx1ZSk7IH0KKyAgQW55QW1iaWd1b3VzQWxpYXNlc1VuaW9uKGNvbnN0IEFueUFtYmlndW91c0FsaWFzZXNVbmlvbiAmKTsKKyAgQW55QW1iaWd1b3VzQWxpYXNlc1VuaW9uICZvcGVyYXRvcj0oY29uc3QgQW55QW1iaWd1b3VzQWxpYXNlc1VuaW9uICZ1KQorICAgIHsgQW55QW1iaWd1b3VzQWxpYXNlc1VuaW9uIHQodSk7IHN0ZDo6c3dhcCh0eXBlLCB0LnR5cGUpOyBzdGQ6OnN3YXAodmFsdWUsIHQudmFsdWUpOyByZXR1cm4gKnRoaXM7IH0KKyAgQW55QW1iaWd1b3VzQWxpYXNlc1VuaW9uICZvcGVyYXRvcj0oQW55QW1iaWd1b3VzQWxpYXNlc1VuaW9uICYmdSkgRkxBVEJVRkZFUlNfTk9FWENFUFQKKyAgICB7IHN0ZDo6c3dhcCh0eXBlLCB1LnR5cGUpOyBzdGQ6OnN3YXAodmFsdWUsIHUudmFsdWUpOyByZXR1cm4gKnRoaXM7IH0KKyAgfkFueUFtYmlndW91c0FsaWFzZXNVbmlvbigpIHsgUmVzZXQoKTsgfQorCisgIHZvaWQgUmVzZXQoKTsKKworICBzdGF0aWMgdm9pZCAqVW5QYWNrKGNvbnN0IHZvaWQgKm9iaiwgQW55QW1iaWd1b3VzQWxpYXNlcyB0eXBlLCBjb25zdCBmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqcmVzb2x2ZXIpOworICBmbGF0YnVmZmVyczo6T2Zmc2V0PHZvaWQ+IFBhY2soZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyID0gbnVsbHB0cikgY29uc3Q7CisKKyAgTXlHYW1lOjpFeGFtcGxlOjpNb25zdGVyVCAqQXNNMSgpIHsKKyAgICByZXR1cm4gdHlwZSA9PSBBbnlBbWJpZ3VvdXNBbGlhc2VzX00xID8KKyAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8TXlHYW1lOjpFeGFtcGxlOjpNb25zdGVyVCAqPih2YWx1ZSkgOiBudWxscHRyOworICB9CisgIGNvbnN0IE15R2FtZTo6RXhhbXBsZTo6TW9uc3RlclQgKkFzTTEoKSBjb25zdCB7CisgICAgcmV0dXJuIHR5cGUgPT0gQW55QW1iaWd1b3VzQWxpYXNlc19NMSA/CisgICAgICByZWludGVycHJldF9jYXN0PGNvbnN0IE15R2FtZTo6RXhhbXBsZTo6TW9uc3RlclQgKj4odmFsdWUpIDogbnVsbHB0cjsKKyAgfQorICBNeUdhbWU6OkV4YW1wbGU6Ok1vbnN0ZXJUICpBc00yKCkgeworICAgIHJldHVybiB0eXBlID09IEFueUFtYmlndW91c0FsaWFzZXNfTTIgPworICAgICAgcmVpbnRlcnByZXRfY2FzdDxNeUdhbWU6OkV4YW1wbGU6Ok1vbnN0ZXJUICo+KHZhbHVlKSA6IG51bGxwdHI7CisgIH0KKyAgY29uc3QgTXlHYW1lOjpFeGFtcGxlOjpNb25zdGVyVCAqQXNNMigpIGNvbnN0IHsKKyAgICByZXR1cm4gdHlwZSA9PSBBbnlBbWJpZ3VvdXNBbGlhc2VzX00yID8KKyAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgTXlHYW1lOjpFeGFtcGxlOjpNb25zdGVyVCAqPih2YWx1ZSkgOiBudWxscHRyOworICB9CisgIE15R2FtZTo6RXhhbXBsZTo6TW9uc3RlclQgKkFzTTMoKSB7CisgICAgcmV0dXJuIHR5cGUgPT0gQW55QW1iaWd1b3VzQWxpYXNlc19NMyA/CisgICAgICByZWludGVycHJldF9jYXN0PE15R2FtZTo6RXhhbXBsZTo6TW9uc3RlclQgKj4odmFsdWUpIDogbnVsbHB0cjsKKyAgfQorICBjb25zdCBNeUdhbWU6OkV4YW1wbGU6Ok1vbnN0ZXJUICpBc00zKCkgY29uc3QgeworICAgIHJldHVybiB0eXBlID09IEFueUFtYmlndW91c0FsaWFzZXNfTTMgPworICAgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBNeUdhbWU6OkV4YW1wbGU6Ok1vbnN0ZXJUICo+KHZhbHVlKSA6IG51bGxwdHI7CisgIH0KK307CisKKworaW5saW5lIGJvb2wgb3BlcmF0b3I9PShjb25zdCBBbnlBbWJpZ3VvdXNBbGlhc2VzVW5pb24gJmxocywgY29uc3QgQW55QW1iaWd1b3VzQWxpYXNlc1VuaW9uICZyaHMpIHsKKyAgaWYgKGxocy50eXBlICE9IHJocy50eXBlKSByZXR1cm4gZmFsc2U7CisgIHN3aXRjaCAobGhzLnR5cGUpIHsKKyAgICBjYXNlIEFueUFtYmlndW91c0FsaWFzZXNfTk9ORTogeworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIGNhc2UgQW55QW1iaWd1b3VzQWxpYXNlc19NMTogeworICAgICAgcmV0dXJuICoocmVpbnRlcnByZXRfY2FzdDxjb25zdCBNeUdhbWU6OkV4YW1wbGU6Ok1vbnN0ZXJUICo+KGxocy52YWx1ZSkpID09CisgICAgICAgICAgICAgKihyZWludGVycHJldF9jYXN0PGNvbnN0IE15R2FtZTo6RXhhbXBsZTo6TW9uc3RlclQgKj4ocmhzLnZhbHVlKSk7CisgICAgfQorICAgIGNhc2UgQW55QW1iaWd1b3VzQWxpYXNlc19NMjogeworICAgICAgcmV0dXJuICoocmVpbnRlcnByZXRfY2FzdDxjb25zdCBNeUdhbWU6OkV4YW1wbGU6Ok1vbnN0ZXJUICo+KGxocy52YWx1ZSkpID09CisgICAgICAgICAgICAgKihyZWludGVycHJldF9jYXN0PGNvbnN0IE15R2FtZTo6RXhhbXBsZTo6TW9uc3RlclQgKj4ocmhzLnZhbHVlKSk7CisgICAgfQorICAgIGNhc2UgQW55QW1iaWd1b3VzQWxpYXNlc19NMzogeworICAgICAgcmV0dXJuICoocmVpbnRlcnByZXRfY2FzdDxjb25zdCBNeUdhbWU6OkV4YW1wbGU6Ok1vbnN0ZXJUICo+KGxocy52YWx1ZSkpID09CisgICAgICAgICAgICAgKihyZWludGVycHJldF9jYXN0PGNvbnN0IE15R2FtZTo6RXhhbXBsZTo6TW9uc3RlclQgKj4ocmhzLnZhbHVlKSk7CisgICAgfQorICAgIGRlZmF1bHQ6IHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgIH0KK30KKworaW5saW5lIGJvb2wgb3BlcmF0b3IhPShjb25zdCBBbnlBbWJpZ3VvdXNBbGlhc2VzVW5pb24gJmxocywgY29uc3QgQW55QW1iaWd1b3VzQWxpYXNlc1VuaW9uICZyaHMpIHsKKyAgICByZXR1cm4gIShsaHMgPT0gcmhzKTsKK30KKworYm9vbCBWZXJpZnlBbnlBbWJpZ3VvdXNBbGlhc2VzKGZsYXRidWZmZXJzOjpWZXJpZmllciAmdmVyaWZpZXIsIGNvbnN0IHZvaWQgKm9iaiwgQW55QW1iaWd1b3VzQWxpYXNlcyB0eXBlKTsKK2Jvb2wgVmVyaWZ5QW55QW1iaWd1b3VzQWxpYXNlc1ZlY3RvcihmbGF0YnVmZmVyczo6VmVyaWZpZXIgJnZlcmlmaWVyLCBjb25zdCBmbGF0YnVmZmVyczo6VmVjdG9yPGZsYXRidWZmZXJzOjpPZmZzZXQ8dm9pZD4+ICp2YWx1ZXMsIGNvbnN0IGZsYXRidWZmZXJzOjpWZWN0b3I8dWludDhfdD4gKnR5cGVzKTsKKworRkxBVEJVRkZFUlNfTUFOVUFMTFlfQUxJR05FRF9TVFJVQ1QoMikgVGVzdCBGTEFUQlVGRkVSU19GSU5BTF9DTEFTUyB7CisgcHJpdmF0ZToKKyAgaW50MTZfdCBhXzsKKyAgaW50OF90IGJfOworICBpbnQ4X3QgcGFkZGluZzBfXzsKKworIHB1YmxpYzoKKyAgc3RhdGljIGNvbnN0IGZsYXRidWZmZXJzOjpUeXBlVGFibGUgKk1pbmlSZWZsZWN0VHlwZVRhYmxlKCkgeworICAgIHJldHVybiBUZXN0VHlwZVRhYmxlKCk7CisgIH0KKyAgVGVzdCgpCisgICAgICA6IGFfKDApLAorICAgICAgICBiXygwKSwKKyAgICAgICAgcGFkZGluZzBfXygwKSB7CisgICAgKHZvaWQpcGFkZGluZzBfXzsKKyAgfQorICBUZXN0KGludDE2X3QgX2EsIGludDhfdCBfYikKKyAgICAgIDogYV8oZmxhdGJ1ZmZlcnM6OkVuZGlhblNjYWxhcihfYSkpLAorICAgICAgICBiXyhmbGF0YnVmZmVyczo6RW5kaWFuU2NhbGFyKF9iKSksCisgICAgICAgIHBhZGRpbmcwX18oMCkgeworICAgICh2b2lkKXBhZGRpbmcwX187CisgIH0KKyAgaW50MTZfdCBhKCkgY29uc3QgeworICAgIHJldHVybiBmbGF0YnVmZmVyczo6RW5kaWFuU2NhbGFyKGFfKTsKKyAgfQorICB2b2lkIG11dGF0ZV9hKGludDE2X3QgX2EpIHsKKyAgICBmbGF0YnVmZmVyczo6V3JpdGVTY2FsYXIoJmFfLCBfYSk7CisgIH0KKyAgaW50OF90IGIoKSBjb25zdCB7CisgICAgcmV0dXJuIGZsYXRidWZmZXJzOjpFbmRpYW5TY2FsYXIoYl8pOworICB9CisgIHZvaWQgbXV0YXRlX2IoaW50OF90IF9iKSB7CisgICAgZmxhdGJ1ZmZlcnM6OldyaXRlU2NhbGFyKCZiXywgX2IpOworICB9Cit9OworRkxBVEJVRkZFUlNfU1RSVUNUX0VORChUZXN0LCA0KTsKKworaW5saW5lIGJvb2wgb3BlcmF0b3I9PShjb25zdCBUZXN0ICZsaHMsIGNvbnN0IFRlc3QgJnJocykgeworICByZXR1cm4KKyAgICAgIChsaHMuYSgpID09IHJocy5hKCkpICYmCisgICAgICAobGhzLmIoKSA9PSByaHMuYigpKTsKK30KKworaW5saW5lIGJvb2wgb3BlcmF0b3IhPShjb25zdCBUZXN0ICZsaHMsIGNvbnN0IFRlc3QgJnJocykgeworICAgIHJldHVybiAhKGxocyA9PSByaHMpOworfQorCisKK0ZMQVRCVUZGRVJTX01BTlVBTExZX0FMSUdORURfU1RSVUNUKDgpIFZlYzMgRkxBVEJVRkZFUlNfRklOQUxfQ0xBU1MgeworIHByaXZhdGU6CisgIGZsb2F0IHhfOworICBmbG9hdCB5XzsKKyAgZmxvYXQgel87CisgIGludDMyX3QgcGFkZGluZzBfXzsKKyAgZG91YmxlIHRlc3QxXzsKKyAgdWludDhfdCB0ZXN0Ml87CisgIGludDhfdCBwYWRkaW5nMV9fOworICBNeUdhbWU6OkV4YW1wbGU6OlRlc3QgdGVzdDNfOworICBpbnQxNl90IHBhZGRpbmcyX187CisKKyBwdWJsaWM6CisgIHN0YXRpYyBjb25zdCBmbGF0YnVmZmVyczo6VHlwZVRhYmxlICpNaW5pUmVmbGVjdFR5cGVUYWJsZSgpIHsKKyAgICByZXR1cm4gVmVjM1R5cGVUYWJsZSgpOworICB9CisgIFZlYzMoKQorICAgICAgOiB4XygwKSwKKyAgICAgICAgeV8oMCksCisgICAgICAgIHpfKDApLAorICAgICAgICBwYWRkaW5nMF9fKDApLAorICAgICAgICB0ZXN0MV8oMCksCisgICAgICAgIHRlc3QyXygwKSwKKyAgICAgICAgcGFkZGluZzFfXygwKSwKKyAgICAgICAgdGVzdDNfKCksCisgICAgICAgIHBhZGRpbmcyX18oMCkgeworICAgICh2b2lkKXBhZGRpbmcwX187CisgICAgKHZvaWQpcGFkZGluZzFfXzsKKyAgICAodm9pZClwYWRkaW5nMl9fOworICB9CisgIFZlYzMoZmxvYXQgX3gsIGZsb2F0IF95LCBmbG9hdCBfeiwgZG91YmxlIF90ZXN0MSwgTXlHYW1lOjpFeGFtcGxlOjpDb2xvciBfdGVzdDIsIGNvbnN0IE15R2FtZTo6RXhhbXBsZTo6VGVzdCAmX3Rlc3QzKQorICAgICAgOiB4XyhmbGF0YnVmZmVyczo6RW5kaWFuU2NhbGFyKF94KSksCisgICAgICAgIHlfKGZsYXRidWZmZXJzOjpFbmRpYW5TY2FsYXIoX3kpKSwKKyAgICAgICAgel8oZmxhdGJ1ZmZlcnM6OkVuZGlhblNjYWxhcihfeikpLAorICAgICAgICBwYWRkaW5nMF9fKDApLAorICAgICAgICB0ZXN0MV8oZmxhdGJ1ZmZlcnM6OkVuZGlhblNjYWxhcihfdGVzdDEpKSwKKyAgICAgICAgdGVzdDJfKGZsYXRidWZmZXJzOjpFbmRpYW5TY2FsYXIoc3RhdGljX2Nhc3Q8dWludDhfdD4oX3Rlc3QyKSkpLAorICAgICAgICBwYWRkaW5nMV9fKDApLAorICAgICAgICB0ZXN0M18oX3Rlc3QzKSwKKyAgICAgICAgcGFkZGluZzJfXygwKSB7CisgICAgKHZvaWQpcGFkZGluZzBfXzsKKyAgICAodm9pZClwYWRkaW5nMV9fOworICAgICh2b2lkKXBhZGRpbmcyX187CisgIH0KKyAgZmxvYXQgeCgpIGNvbnN0IHsKKyAgICByZXR1cm4gZmxhdGJ1ZmZlcnM6OkVuZGlhblNjYWxhcih4Xyk7CisgIH0KKyAgdm9pZCBtdXRhdGVfeChmbG9hdCBfeCkgeworICAgIGZsYXRidWZmZXJzOjpXcml0ZVNjYWxhcigmeF8sIF94KTsKKyAgfQorICBmbG9hdCB5KCkgY29uc3QgeworICAgIHJldHVybiBmbGF0YnVmZmVyczo6RW5kaWFuU2NhbGFyKHlfKTsKKyAgfQorICB2b2lkIG11dGF0ZV95KGZsb2F0IF95KSB7CisgICAgZmxhdGJ1ZmZlcnM6OldyaXRlU2NhbGFyKCZ5XywgX3kpOworICB9CisgIGZsb2F0IHooKSBjb25zdCB7CisgICAgcmV0dXJuIGZsYXRidWZmZXJzOjpFbmRpYW5TY2FsYXIoel8pOworICB9CisgIHZvaWQgbXV0YXRlX3ooZmxvYXQgX3opIHsKKyAgICBmbGF0YnVmZmVyczo6V3JpdGVTY2FsYXIoJnpfLCBfeik7CisgIH0KKyAgZG91YmxlIHRlc3QxKCkgY29uc3QgeworICAgIHJldHVybiBmbGF0YnVmZmVyczo6RW5kaWFuU2NhbGFyKHRlc3QxXyk7CisgIH0KKyAgdm9pZCBtdXRhdGVfdGVzdDEoZG91YmxlIF90ZXN0MSkgeworICAgIGZsYXRidWZmZXJzOjpXcml0ZVNjYWxhcigmdGVzdDFfLCBfdGVzdDEpOworICB9CisgIE15R2FtZTo6RXhhbXBsZTo6Q29sb3IgdGVzdDIoKSBjb25zdCB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PE15R2FtZTo6RXhhbXBsZTo6Q29sb3I+KGZsYXRidWZmZXJzOjpFbmRpYW5TY2FsYXIodGVzdDJfKSk7CisgIH0KKyAgdm9pZCBtdXRhdGVfdGVzdDIoTXlHYW1lOjpFeGFtcGxlOjpDb2xvciBfdGVzdDIpIHsKKyAgICBmbGF0YnVmZmVyczo6V3JpdGVTY2FsYXIoJnRlc3QyXywgc3RhdGljX2Nhc3Q8dWludDhfdD4oX3Rlc3QyKSk7CisgIH0KKyAgY29uc3QgTXlHYW1lOjpFeGFtcGxlOjpUZXN0ICZ0ZXN0MygpIGNvbnN0IHsKKyAgICByZXR1cm4gdGVzdDNfOworICB9CisgIE15R2FtZTo6RXhhbXBsZTo6VGVzdCAmbXV0YWJsZV90ZXN0MygpIHsKKyAgICByZXR1cm4gdGVzdDNfOworICB9Cit9OworRkxBVEJVRkZFUlNfU1RSVUNUX0VORChWZWMzLCAzMik7CisKK2lubGluZSBib29sIG9wZXJhdG9yPT0oY29uc3QgVmVjMyAmbGhzLCBjb25zdCBWZWMzICZyaHMpIHsKKyAgcmV0dXJuCisgICAgICAobGhzLngoKSA9PSByaHMueCgpKSAmJgorICAgICAgKGxocy55KCkgPT0gcmhzLnkoKSkgJiYKKyAgICAgIChsaHMueigpID09IHJocy56KCkpICYmCisgICAgICAobGhzLnRlc3QxKCkgPT0gcmhzLnRlc3QxKCkpICYmCisgICAgICAobGhzLnRlc3QyKCkgPT0gcmhzLnRlc3QyKCkpICYmCisgICAgICAobGhzLnRlc3QzKCkgPT0gcmhzLnRlc3QzKCkpOworfQorCitpbmxpbmUgYm9vbCBvcGVyYXRvciE9KGNvbnN0IFZlYzMgJmxocywgY29uc3QgVmVjMyAmcmhzKSB7CisgICAgcmV0dXJuICEobGhzID09IHJocyk7Cit9CisKKworRkxBVEJVRkZFUlNfTUFOVUFMTFlfQUxJR05FRF9TVFJVQ1QoNCkgQWJpbGl0eSBGTEFUQlVGRkVSU19GSU5BTF9DTEFTUyB7CisgcHJpdmF0ZToKKyAgdWludDMyX3QgaWRfOworICB1aW50MzJfdCBkaXN0YW5jZV87CisKKyBwdWJsaWM6CisgIHN0YXRpYyBjb25zdCBmbGF0YnVmZmVyczo6VHlwZVRhYmxlICpNaW5pUmVmbGVjdFR5cGVUYWJsZSgpIHsKKyAgICByZXR1cm4gQWJpbGl0eVR5cGVUYWJsZSgpOworICB9CisgIEFiaWxpdHkoKQorICAgICAgOiBpZF8oMCksCisgICAgICAgIGRpc3RhbmNlXygwKSB7CisgIH0KKyAgQWJpbGl0eSh1aW50MzJfdCBfaWQsIHVpbnQzMl90IF9kaXN0YW5jZSkKKyAgICAgIDogaWRfKGZsYXRidWZmZXJzOjpFbmRpYW5TY2FsYXIoX2lkKSksCisgICAgICAgIGRpc3RhbmNlXyhmbGF0YnVmZmVyczo6RW5kaWFuU2NhbGFyKF9kaXN0YW5jZSkpIHsKKyAgfQorICB1aW50MzJfdCBpZCgpIGNvbnN0IHsKKyAgICByZXR1cm4gZmxhdGJ1ZmZlcnM6OkVuZGlhblNjYWxhcihpZF8pOworICB9CisgIHZvaWQgbXV0YXRlX2lkKHVpbnQzMl90IF9pZCkgeworICAgIGZsYXRidWZmZXJzOjpXcml0ZVNjYWxhcigmaWRfLCBfaWQpOworICB9CisgIGJvb2wgS2V5Q29tcGFyZUxlc3NUaGFuKGNvbnN0IEFiaWxpdHkgKm8pIGNvbnN0IHsKKyAgICByZXR1cm4gaWQoKSA8IG8tPmlkKCk7CisgIH0KKyAgaW50IEtleUNvbXBhcmVXaXRoVmFsdWUodWludDMyX3QgX2lkKSBjb25zdCB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PGludD4oaWQoKSA+IF9pZCkgLSBzdGF0aWNfY2FzdDxpbnQ+KGlkKCkgPCBfaWQpOworICB9CisgIHVpbnQzMl90IGRpc3RhbmNlKCkgY29uc3QgeworICAgIHJldHVybiBmbGF0YnVmZmVyczo6RW5kaWFuU2NhbGFyKGRpc3RhbmNlXyk7CisgIH0KKyAgdm9pZCBtdXRhdGVfZGlzdGFuY2UodWludDMyX3QgX2Rpc3RhbmNlKSB7CisgICAgZmxhdGJ1ZmZlcnM6OldyaXRlU2NhbGFyKCZkaXN0YW5jZV8sIF9kaXN0YW5jZSk7CisgIH0KK307CitGTEFUQlVGRkVSU19TVFJVQ1RfRU5EKEFiaWxpdHksIDgpOworCitpbmxpbmUgYm9vbCBvcGVyYXRvcj09KGNvbnN0IEFiaWxpdHkgJmxocywgY29uc3QgQWJpbGl0eSAmcmhzKSB7CisgIHJldHVybgorICAgICAgKGxocy5pZCgpID09IHJocy5pZCgpKSAmJgorICAgICAgKGxocy5kaXN0YW5jZSgpID09IHJocy5kaXN0YW5jZSgpKTsKK30KKworaW5saW5lIGJvb2wgb3BlcmF0b3IhPShjb25zdCBBYmlsaXR5ICZsaHMsIGNvbnN0IEFiaWxpdHkgJnJocykgeworICAgIHJldHVybiAhKGxocyA9PSByaHMpOworfQorCisKK0ZMQVRCVUZGRVJTX01BTlVBTExZX0FMSUdORURfU1RSVUNUKDQpIFN0cnVjdE9mU3RydWN0cyBGTEFUQlVGRkVSU19GSU5BTF9DTEFTUyB7CisgcHJpdmF0ZToKKyAgTXlHYW1lOjpFeGFtcGxlOjpBYmlsaXR5IGFfOworICBNeUdhbWU6OkV4YW1wbGU6OlRlc3QgYl87CisgIE15R2FtZTo6RXhhbXBsZTo6QWJpbGl0eSBjXzsKKworIHB1YmxpYzoKKyAgc3RhdGljIGNvbnN0IGZsYXRidWZmZXJzOjpUeXBlVGFibGUgKk1pbmlSZWZsZWN0VHlwZVRhYmxlKCkgeworICAgIHJldHVybiBTdHJ1Y3RPZlN0cnVjdHNUeXBlVGFibGUoKTsKKyAgfQorICBTdHJ1Y3RPZlN0cnVjdHMoKQorICAgICAgOiBhXygpLAorICAgICAgICBiXygpLAorICAgICAgICBjXygpIHsKKyAgfQorICBTdHJ1Y3RPZlN0cnVjdHMoY29uc3QgTXlHYW1lOjpFeGFtcGxlOjpBYmlsaXR5ICZfYSwgY29uc3QgTXlHYW1lOjpFeGFtcGxlOjpUZXN0ICZfYiwgY29uc3QgTXlHYW1lOjpFeGFtcGxlOjpBYmlsaXR5ICZfYykKKyAgICAgIDogYV8oX2EpLAorICAgICAgICBiXyhfYiksCisgICAgICAgIGNfKF9jKSB7CisgIH0KKyAgY29uc3QgTXlHYW1lOjpFeGFtcGxlOjpBYmlsaXR5ICZhKCkgY29uc3QgeworICAgIHJldHVybiBhXzsKKyAgfQorICBNeUdhbWU6OkV4YW1wbGU6OkFiaWxpdHkgJm11dGFibGVfYSgpIHsKKyAgICByZXR1cm4gYV87CisgIH0KKyAgY29uc3QgTXlHYW1lOjpFeGFtcGxlOjpUZXN0ICZiKCkgY29uc3QgeworICAgIHJldHVybiBiXzsKKyAgfQorICBNeUdhbWU6OkV4YW1wbGU6OlRlc3QgJm11dGFibGVfYigpIHsKKyAgICByZXR1cm4gYl87CisgIH0KKyAgY29uc3QgTXlHYW1lOjpFeGFtcGxlOjpBYmlsaXR5ICZjKCkgY29uc3QgeworICAgIHJldHVybiBjXzsKKyAgfQorICBNeUdhbWU6OkV4YW1wbGU6OkFiaWxpdHkgJm11dGFibGVfYygpIHsKKyAgICByZXR1cm4gY187CisgIH0KK307CitGTEFUQlVGRkVSU19TVFJVQ1RfRU5EKFN0cnVjdE9mU3RydWN0cywgMjApOworCitpbmxpbmUgYm9vbCBvcGVyYXRvcj09KGNvbnN0IFN0cnVjdE9mU3RydWN0cyAmbGhzLCBjb25zdCBTdHJ1Y3RPZlN0cnVjdHMgJnJocykgeworICByZXR1cm4KKyAgICAgIChsaHMuYSgpID09IHJocy5hKCkpICYmCisgICAgICAobGhzLmIoKSA9PSByaHMuYigpKSAmJgorICAgICAgKGxocy5jKCkgPT0gcmhzLmMoKSk7Cit9CisKK2lubGluZSBib29sIG9wZXJhdG9yIT0oY29uc3QgU3RydWN0T2ZTdHJ1Y3RzICZsaHMsIGNvbnN0IFN0cnVjdE9mU3RydWN0cyAmcmhzKSB7CisgICAgcmV0dXJuICEobGhzID09IHJocyk7Cit9CisKKworRkxBVEJVRkZFUlNfTUFOVUFMTFlfQUxJR05FRF9TVFJVQ1QoNCkgU3RydWN0T2ZTdHJ1Y3RzT2ZTdHJ1Y3RzIEZMQVRCVUZGRVJTX0ZJTkFMX0NMQVNTIHsKKyBwcml2YXRlOgorICBNeUdhbWU6OkV4YW1wbGU6OlN0cnVjdE9mU3RydWN0cyBhXzsKKworIHB1YmxpYzoKKyAgc3RhdGljIGNvbnN0IGZsYXRidWZmZXJzOjpUeXBlVGFibGUgKk1pbmlSZWZsZWN0VHlwZVRhYmxlKCkgeworICAgIHJldHVybiBTdHJ1Y3RPZlN0cnVjdHNPZlN0cnVjdHNUeXBlVGFibGUoKTsKKyAgfQorICBTdHJ1Y3RPZlN0cnVjdHNPZlN0cnVjdHMoKQorICAgICAgOiBhXygpIHsKKyAgfQorICBTdHJ1Y3RPZlN0cnVjdHNPZlN0cnVjdHMoY29uc3QgTXlHYW1lOjpFeGFtcGxlOjpTdHJ1Y3RPZlN0cnVjdHMgJl9hKQorICAgICAgOiBhXyhfYSkgeworICB9CisgIGNvbnN0IE15R2FtZTo6RXhhbXBsZTo6U3RydWN0T2ZTdHJ1Y3RzICZhKCkgY29uc3QgeworICAgIHJldHVybiBhXzsKKyAgfQorICBNeUdhbWU6OkV4YW1wbGU6OlN0cnVjdE9mU3RydWN0cyAmbXV0YWJsZV9hKCkgeworICAgIHJldHVybiBhXzsKKyAgfQorfTsKK0ZMQVRCVUZGRVJTX1NUUlVDVF9FTkQoU3RydWN0T2ZTdHJ1Y3RzT2ZTdHJ1Y3RzLCAyMCk7CisKK2lubGluZSBib29sIG9wZXJhdG9yPT0oY29uc3QgU3RydWN0T2ZTdHJ1Y3RzT2ZTdHJ1Y3RzICZsaHMsIGNvbnN0IFN0cnVjdE9mU3RydWN0c09mU3RydWN0cyAmcmhzKSB7CisgIHJldHVybgorICAgICAgKGxocy5hKCkgPT0gcmhzLmEoKSk7Cit9CisKK2lubGluZSBib29sIG9wZXJhdG9yIT0oY29uc3QgU3RydWN0T2ZTdHJ1Y3RzT2ZTdHJ1Y3RzICZsaHMsIGNvbnN0IFN0cnVjdE9mU3RydWN0c09mU3RydWN0cyAmcmhzKSB7CisgICAgcmV0dXJuICEobGhzID09IHJocyk7Cit9CisKKworfSAgLy8gbmFtZXNwYWNlIEV4YW1wbGUKKworc3RydWN0IEluUGFyZW50TmFtZXNwYWNlVCA6IHB1YmxpYyBmbGF0YnVmZmVyczo6TmF0aXZlVGFibGUgeworICB0eXBlZGVmIEluUGFyZW50TmFtZXNwYWNlIFRhYmxlVHlwZTsKK307CisKK3N0cnVjdCBJblBhcmVudE5hbWVzcGFjZSBGTEFUQlVGRkVSU19GSU5BTF9DTEFTUyA6IHByaXZhdGUgZmxhdGJ1ZmZlcnM6OlRhYmxlIHsKKyAgdHlwZWRlZiBJblBhcmVudE5hbWVzcGFjZVQgTmF0aXZlVGFibGVUeXBlOworICB0eXBlZGVmIEluUGFyZW50TmFtZXNwYWNlQnVpbGRlciBCdWlsZGVyOworICBzdGF0aWMgY29uc3QgZmxhdGJ1ZmZlcnM6OlR5cGVUYWJsZSAqTWluaVJlZmxlY3RUeXBlVGFibGUoKSB7CisgICAgcmV0dXJuIEluUGFyZW50TmFtZXNwYWNlVHlwZVRhYmxlKCk7CisgIH0KKyAgYm9vbCBWZXJpZnkoZmxhdGJ1ZmZlcnM6OlZlcmlmaWVyICZ2ZXJpZmllcikgY29uc3QgeworICAgIHJldHVybiBWZXJpZnlUYWJsZVN0YXJ0KHZlcmlmaWVyKSAmJgorICAgICAgICAgICB2ZXJpZmllci5FbmRUYWJsZSgpOworICB9CisgIEluUGFyZW50TmFtZXNwYWNlVCAqVW5QYWNrKGNvbnN0IGZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIgPSBudWxscHRyKSBjb25zdDsKKyAgdm9pZCBVblBhY2tUbyhJblBhcmVudE5hbWVzcGFjZVQgKl9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyID0gbnVsbHB0cikgY29uc3Q7CisgIHN0YXRpYyBmbGF0YnVmZmVyczo6T2Zmc2V0PEluUGFyZW50TmFtZXNwYWNlPiBQYWNrKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgSW5QYXJlbnROYW1lc3BhY2VUKiBfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlciA9IG51bGxwdHIpOworfTsKKworc3RydWN0IEluUGFyZW50TmFtZXNwYWNlQnVpbGRlciB7CisgIHR5cGVkZWYgSW5QYXJlbnROYW1lc3BhY2UgVGFibGU7CisgIGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmZmJiXzsKKyAgZmxhdGJ1ZmZlcnM6OnVvZmZzZXRfdCBzdGFydF87CisgIGV4cGxpY2l0IEluUGFyZW50TmFtZXNwYWNlQnVpbGRlcihmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIpCisgICAgICAgIDogZmJiXyhfZmJiKSB7CisgICAgc3RhcnRfID0gZmJiXy5TdGFydFRhYmxlKCk7CisgIH0KKyAgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxJblBhcmVudE5hbWVzcGFjZT4gRmluaXNoKCkgeworICAgIGNvbnN0IGF1dG8gZW5kID0gZmJiXy5FbmRUYWJsZShzdGFydF8pOworICAgIGF1dG8gbyA9IGZsYXRidWZmZXJzOjpPZmZzZXQ8SW5QYXJlbnROYW1lc3BhY2U+KGVuZCk7CisgICAgcmV0dXJuIG87CisgIH0KK307CisKK2lubGluZSBmbGF0YnVmZmVyczo6T2Zmc2V0PEluUGFyZW50TmFtZXNwYWNlPiBDcmVhdGVJblBhcmVudE5hbWVzcGFjZSgKKyAgICBmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIpIHsKKyAgSW5QYXJlbnROYW1lc3BhY2VCdWlsZGVyIGJ1aWxkZXJfKF9mYmIpOworICByZXR1cm4gYnVpbGRlcl8uRmluaXNoKCk7Cit9CisKK2ZsYXRidWZmZXJzOjpPZmZzZXQ8SW5QYXJlbnROYW1lc3BhY2U+IENyZWF0ZUluUGFyZW50TmFtZXNwYWNlKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgSW5QYXJlbnROYW1lc3BhY2VUICpfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlciA9IG51bGxwdHIpOworCituYW1lc3BhY2UgRXhhbXBsZTIgeworCitzdHJ1Y3QgTW9uc3RlclQgOiBwdWJsaWMgZmxhdGJ1ZmZlcnM6Ok5hdGl2ZVRhYmxlIHsKKyAgdHlwZWRlZiBNb25zdGVyIFRhYmxlVHlwZTsKK307CisKK3N0cnVjdCBNb25zdGVyIEZMQVRCVUZGRVJTX0ZJTkFMX0NMQVNTIDogcHJpdmF0ZSBmbGF0YnVmZmVyczo6VGFibGUgeworICB0eXBlZGVmIE1vbnN0ZXJUIE5hdGl2ZVRhYmxlVHlwZTsKKyAgdHlwZWRlZiBNb25zdGVyQnVpbGRlciBCdWlsZGVyOworICBzdGF0aWMgY29uc3QgZmxhdGJ1ZmZlcnM6OlR5cGVUYWJsZSAqTWluaVJlZmxlY3RUeXBlVGFibGUoKSB7CisgICAgcmV0dXJuIE1vbnN0ZXJUeXBlVGFibGUoKTsKKyAgfQorICBib29sIFZlcmlmeShmbGF0YnVmZmVyczo6VmVyaWZpZXIgJnZlcmlmaWVyKSBjb25zdCB7CisgICAgcmV0dXJuIFZlcmlmeVRhYmxlU3RhcnQodmVyaWZpZXIpICYmCisgICAgICAgICAgIHZlcmlmaWVyLkVuZFRhYmxlKCk7CisgIH0KKyAgTW9uc3RlclQgKlVuUGFjayhjb25zdCBmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyID0gbnVsbHB0cikgY29uc3Q7CisgIHZvaWQgVW5QYWNrVG8oTW9uc3RlclQgKl9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyID0gbnVsbHB0cikgY29uc3Q7CisgIHN0YXRpYyBmbGF0YnVmZmVyczo6T2Zmc2V0PE1vbnN0ZXI+IFBhY2soZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBNb25zdGVyVCogX28sIGNvbnN0IGZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIgPSBudWxscHRyKTsKK307CisKK3N0cnVjdCBNb25zdGVyQnVpbGRlciB7CisgIHR5cGVkZWYgTW9uc3RlciBUYWJsZTsKKyAgZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZmYmJfOworICBmbGF0YnVmZmVyczo6dW9mZnNldF90IHN0YXJ0XzsKKyAgZXhwbGljaXQgTW9uc3RlckJ1aWxkZXIoZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiKQorICAgICAgICA6IGZiYl8oX2ZiYikgeworICAgIHN0YXJ0XyA9IGZiYl8uU3RhcnRUYWJsZSgpOworICB9CisgIGZsYXRidWZmZXJzOjpPZmZzZXQ8TW9uc3Rlcj4gRmluaXNoKCkgeworICAgIGNvbnN0IGF1dG8gZW5kID0gZmJiXy5FbmRUYWJsZShzdGFydF8pOworICAgIGF1dG8gbyA9IGZsYXRidWZmZXJzOjpPZmZzZXQ8TW9uc3Rlcj4oZW5kKTsKKyAgICByZXR1cm4gbzsKKyAgfQorfTsKKworaW5saW5lIGZsYXRidWZmZXJzOjpPZmZzZXQ8TW9uc3Rlcj4gQ3JlYXRlTW9uc3RlcigKKyAgICBmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIpIHsKKyAgTW9uc3RlckJ1aWxkZXIgYnVpbGRlcl8oX2ZiYik7CisgIHJldHVybiBidWlsZGVyXy5GaW5pc2goKTsKK30KKworZmxhdGJ1ZmZlcnM6Ok9mZnNldDxNb25zdGVyPiBDcmVhdGVNb25zdGVyKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgTW9uc3RlclQgKl9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyID0gbnVsbHB0cik7CisKK30gIC8vIG5hbWVzcGFjZSBFeGFtcGxlMgorCituYW1lc3BhY2UgRXhhbXBsZSB7CisKK3N0cnVjdCBUZXN0U2ltcGxlVGFibGVXaXRoRW51bVQgOiBwdWJsaWMgZmxhdGJ1ZmZlcnM6Ok5hdGl2ZVRhYmxlIHsKKyAgdHlwZWRlZiBUZXN0U2ltcGxlVGFibGVXaXRoRW51bSBUYWJsZVR5cGU7CisgIE15R2FtZTo6RXhhbXBsZTo6Q29sb3IgY29sb3IgPSBNeUdhbWU6OkV4YW1wbGU6OkNvbG9yX0dyZWVuOworfTsKKworc3RydWN0IFRlc3RTaW1wbGVUYWJsZVdpdGhFbnVtIEZMQVRCVUZGRVJTX0ZJTkFMX0NMQVNTIDogcHJpdmF0ZSBmbGF0YnVmZmVyczo6VGFibGUgeworICB0eXBlZGVmIFRlc3RTaW1wbGVUYWJsZVdpdGhFbnVtVCBOYXRpdmVUYWJsZVR5cGU7CisgIHR5cGVkZWYgVGVzdFNpbXBsZVRhYmxlV2l0aEVudW1CdWlsZGVyIEJ1aWxkZXI7CisgIHN0YXRpYyBjb25zdCBmbGF0YnVmZmVyczo6VHlwZVRhYmxlICpNaW5pUmVmbGVjdFR5cGVUYWJsZSgpIHsKKyAgICByZXR1cm4gVGVzdFNpbXBsZVRhYmxlV2l0aEVudW1UeXBlVGFibGUoKTsKKyAgfQorICBlbnVtIEZsYXRCdWZmZXJzVlRhYmxlT2Zmc2V0IEZMQVRCVUZGRVJTX1ZUQUJMRV9VTkRFUkxZSU5HX1RZUEUgeworICAgIFZUX0NPTE9SID0gNAorICB9OworICBNeUdhbWU6OkV4YW1wbGU6OkNvbG9yIGNvbG9yKCkgY29uc3QgeworICAgIHJldHVybiBzdGF0aWNfY2FzdDxNeUdhbWU6OkV4YW1wbGU6OkNvbG9yPihHZXRGaWVsZDx1aW50OF90PihWVF9DT0xPUiwgMikpOworICB9CisgIGJvb2wgbXV0YXRlX2NvbG9yKE15R2FtZTo6RXhhbXBsZTo6Q29sb3IgX2NvbG9yID0gc3RhdGljX2Nhc3Q8TXlHYW1lOjpFeGFtcGxlOjpDb2xvcj4oMikpIHsKKyAgICByZXR1cm4gU2V0RmllbGQ8dWludDhfdD4oVlRfQ09MT1IsIHN0YXRpY19jYXN0PHVpbnQ4X3Q+KF9jb2xvciksIDIpOworICB9CisgIGJvb2wgVmVyaWZ5KGZsYXRidWZmZXJzOjpWZXJpZmllciAmdmVyaWZpZXIpIGNvbnN0IHsKKyAgICByZXR1cm4gVmVyaWZ5VGFibGVTdGFydCh2ZXJpZmllcikgJiYKKyAgICAgICAgICAgVmVyaWZ5RmllbGQ8dWludDhfdD4odmVyaWZpZXIsIFZUX0NPTE9SLCAxKSAmJgorICAgICAgICAgICB2ZXJpZmllci5FbmRUYWJsZSgpOworICB9CisgIFRlc3RTaW1wbGVUYWJsZVdpdGhFbnVtVCAqVW5QYWNrKGNvbnN0IGZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIgPSBudWxscHRyKSBjb25zdDsKKyAgdm9pZCBVblBhY2tUbyhUZXN0U2ltcGxlVGFibGVXaXRoRW51bVQgKl9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyID0gbnVsbHB0cikgY29uc3Q7CisgIHN0YXRpYyBmbGF0YnVmZmVyczo6T2Zmc2V0PFRlc3RTaW1wbGVUYWJsZVdpdGhFbnVtPiBQYWNrKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgVGVzdFNpbXBsZVRhYmxlV2l0aEVudW1UKiBfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlciA9IG51bGxwdHIpOworfTsKKworc3RydWN0IFRlc3RTaW1wbGVUYWJsZVdpdGhFbnVtQnVpbGRlciB7CisgIHR5cGVkZWYgVGVzdFNpbXBsZVRhYmxlV2l0aEVudW0gVGFibGU7CisgIGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmZmJiXzsKKyAgZmxhdGJ1ZmZlcnM6OnVvZmZzZXRfdCBzdGFydF87CisgIHZvaWQgYWRkX2NvbG9yKE15R2FtZTo6RXhhbXBsZTo6Q29sb3IgY29sb3IpIHsKKyAgICBmYmJfLkFkZEVsZW1lbnQ8dWludDhfdD4oVGVzdFNpbXBsZVRhYmxlV2l0aEVudW06OlZUX0NPTE9SLCBzdGF0aWNfY2FzdDx1aW50OF90Pihjb2xvciksIDIpOworICB9CisgIGV4cGxpY2l0IFRlc3RTaW1wbGVUYWJsZVdpdGhFbnVtQnVpbGRlcihmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIpCisgICAgICAgIDogZmJiXyhfZmJiKSB7CisgICAgc3RhcnRfID0gZmJiXy5TdGFydFRhYmxlKCk7CisgIH0KKyAgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxUZXN0U2ltcGxlVGFibGVXaXRoRW51bT4gRmluaXNoKCkgeworICAgIGNvbnN0IGF1dG8gZW5kID0gZmJiXy5FbmRUYWJsZShzdGFydF8pOworICAgIGF1dG8gbyA9IGZsYXRidWZmZXJzOjpPZmZzZXQ8VGVzdFNpbXBsZVRhYmxlV2l0aEVudW0+KGVuZCk7CisgICAgcmV0dXJuIG87CisgIH0KK307CisKK2lubGluZSBmbGF0YnVmZmVyczo6T2Zmc2V0PFRlc3RTaW1wbGVUYWJsZVdpdGhFbnVtPiBDcmVhdGVUZXN0U2ltcGxlVGFibGVXaXRoRW51bSgKKyAgICBmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsCisgICAgTXlHYW1lOjpFeGFtcGxlOjpDb2xvciBjb2xvciA9IE15R2FtZTo6RXhhbXBsZTo6Q29sb3JfR3JlZW4pIHsKKyAgVGVzdFNpbXBsZVRhYmxlV2l0aEVudW1CdWlsZGVyIGJ1aWxkZXJfKF9mYmIpOworICBidWlsZGVyXy5hZGRfY29sb3IoY29sb3IpOworICByZXR1cm4gYnVpbGRlcl8uRmluaXNoKCk7Cit9CisKK2ZsYXRidWZmZXJzOjpPZmZzZXQ8VGVzdFNpbXBsZVRhYmxlV2l0aEVudW0+IENyZWF0ZVRlc3RTaW1wbGVUYWJsZVdpdGhFbnVtKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgVGVzdFNpbXBsZVRhYmxlV2l0aEVudW1UICpfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlciA9IG51bGxwdHIpOworCitzdHJ1Y3QgU3RhdFQgOiBwdWJsaWMgZmxhdGJ1ZmZlcnM6Ok5hdGl2ZVRhYmxlIHsKKyAgdHlwZWRlZiBTdGF0IFRhYmxlVHlwZTsKKyAgc3RkOjpzdHJpbmcgaWR7fTsKKyAgaW50NjRfdCB2YWwgPSAwOworICB1aW50MTZfdCBjb3VudCA9IDA7Cit9OworCitzdHJ1Y3QgU3RhdCBGTEFUQlVGRkVSU19GSU5BTF9DTEFTUyA6IHByaXZhdGUgZmxhdGJ1ZmZlcnM6OlRhYmxlIHsKKyAgdHlwZWRlZiBTdGF0VCBOYXRpdmVUYWJsZVR5cGU7CisgIHR5cGVkZWYgU3RhdEJ1aWxkZXIgQnVpbGRlcjsKKyAgc3RhdGljIGNvbnN0IGZsYXRidWZmZXJzOjpUeXBlVGFibGUgKk1pbmlSZWZsZWN0VHlwZVRhYmxlKCkgeworICAgIHJldHVybiBTdGF0VHlwZVRhYmxlKCk7CisgIH0KKyAgZW51bSBGbGF0QnVmZmVyc1ZUYWJsZU9mZnNldCBGTEFUQlVGRkVSU19WVEFCTEVfVU5ERVJMWUlOR19UWVBFIHsKKyAgICBWVF9JRCA9IDQsCisgICAgVlRfVkFMID0gNiwKKyAgICBWVF9DT1VOVCA9IDgKKyAgfTsKKyAgY29uc3QgZmxhdGJ1ZmZlcnM6OlN0cmluZyAqaWQoKSBjb25zdCB7CisgICAgcmV0dXJuIEdldFBvaW50ZXI8Y29uc3QgZmxhdGJ1ZmZlcnM6OlN0cmluZyAqPihWVF9JRCk7CisgIH0KKyAgZmxhdGJ1ZmZlcnM6OlN0cmluZyAqbXV0YWJsZV9pZCgpIHsKKyAgICByZXR1cm4gR2V0UG9pbnRlcjxmbGF0YnVmZmVyczo6U3RyaW5nICo+KFZUX0lEKTsKKyAgfQorICBpbnQ2NF90IHZhbCgpIGNvbnN0IHsKKyAgICByZXR1cm4gR2V0RmllbGQ8aW50NjRfdD4oVlRfVkFMLCAwKTsKKyAgfQorICBib29sIG11dGF0ZV92YWwoaW50NjRfdCBfdmFsID0gMCkgeworICAgIHJldHVybiBTZXRGaWVsZDxpbnQ2NF90PihWVF9WQUwsIF92YWwsIDApOworICB9CisgIHVpbnQxNl90IGNvdW50KCkgY29uc3QgeworICAgIHJldHVybiBHZXRGaWVsZDx1aW50MTZfdD4oVlRfQ09VTlQsIDApOworICB9CisgIGJvb2wgbXV0YXRlX2NvdW50KHVpbnQxNl90IF9jb3VudCA9IDApIHsKKyAgICByZXR1cm4gU2V0RmllbGQ8dWludDE2X3Q+KFZUX0NPVU5ULCBfY291bnQsIDApOworICB9CisgIGJvb2wgS2V5Q29tcGFyZUxlc3NUaGFuKGNvbnN0IFN0YXQgKm8pIGNvbnN0IHsKKyAgICByZXR1cm4gY291bnQoKSA8IG8tPmNvdW50KCk7CisgIH0KKyAgaW50IEtleUNvbXBhcmVXaXRoVmFsdWUodWludDE2X3QgX2NvdW50KSBjb25zdCB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PGludD4oY291bnQoKSA+IF9jb3VudCkgLSBzdGF0aWNfY2FzdDxpbnQ+KGNvdW50KCkgPCBfY291bnQpOworICB9CisgIGJvb2wgVmVyaWZ5KGZsYXRidWZmZXJzOjpWZXJpZmllciAmdmVyaWZpZXIpIGNvbnN0IHsKKyAgICByZXR1cm4gVmVyaWZ5VGFibGVTdGFydCh2ZXJpZmllcikgJiYKKyAgICAgICAgICAgVmVyaWZ5T2Zmc2V0KHZlcmlmaWVyLCBWVF9JRCkgJiYKKyAgICAgICAgICAgdmVyaWZpZXIuVmVyaWZ5U3RyaW5nKGlkKCkpICYmCisgICAgICAgICAgIFZlcmlmeUZpZWxkPGludDY0X3Q+KHZlcmlmaWVyLCBWVF9WQUwsIDgpICYmCisgICAgICAgICAgIFZlcmlmeUZpZWxkPHVpbnQxNl90Pih2ZXJpZmllciwgVlRfQ09VTlQsIDIpICYmCisgICAgICAgICAgIHZlcmlmaWVyLkVuZFRhYmxlKCk7CisgIH0KKyAgU3RhdFQgKlVuUGFjayhjb25zdCBmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyID0gbnVsbHB0cikgY29uc3Q7CisgIHZvaWQgVW5QYWNrVG8oU3RhdFQgKl9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyID0gbnVsbHB0cikgY29uc3Q7CisgIHN0YXRpYyBmbGF0YnVmZmVyczo6T2Zmc2V0PFN0YXQ+IFBhY2soZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBTdGF0VCogX28sIGNvbnN0IGZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIgPSBudWxscHRyKTsKK307CisKK3N0cnVjdCBTdGF0QnVpbGRlciB7CisgIHR5cGVkZWYgU3RhdCBUYWJsZTsKKyAgZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZmYmJfOworICBmbGF0YnVmZmVyczo6dW9mZnNldF90IHN0YXJ0XzsKKyAgdm9pZCBhZGRfaWQoZmxhdGJ1ZmZlcnM6Ok9mZnNldDxmbGF0YnVmZmVyczo6U3RyaW5nPiBpZCkgeworICAgIGZiYl8uQWRkT2Zmc2V0KFN0YXQ6OlZUX0lELCBpZCk7CisgIH0KKyAgdm9pZCBhZGRfdmFsKGludDY0X3QgdmFsKSB7CisgICAgZmJiXy5BZGRFbGVtZW50PGludDY0X3Q+KFN0YXQ6OlZUX1ZBTCwgdmFsLCAwKTsKKyAgfQorICB2b2lkIGFkZF9jb3VudCh1aW50MTZfdCBjb3VudCkgeworICAgIGZiYl8uQWRkRWxlbWVudDx1aW50MTZfdD4oU3RhdDo6VlRfQ09VTlQsIGNvdW50LCAwKTsKKyAgfQorICBleHBsaWNpdCBTdGF0QnVpbGRlcihmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIpCisgICAgICAgIDogZmJiXyhfZmJiKSB7CisgICAgc3RhcnRfID0gZmJiXy5TdGFydFRhYmxlKCk7CisgIH0KKyAgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxTdGF0PiBGaW5pc2goKSB7CisgICAgY29uc3QgYXV0byBlbmQgPSBmYmJfLkVuZFRhYmxlKHN0YXJ0Xyk7CisgICAgYXV0byBvID0gZmxhdGJ1ZmZlcnM6Ok9mZnNldDxTdGF0PihlbmQpOworICAgIHJldHVybiBvOworICB9Cit9OworCitpbmxpbmUgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxTdGF0PiBDcmVhdGVTdGF0KAorICAgIGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwKKyAgICBmbGF0YnVmZmVyczo6T2Zmc2V0PGZsYXRidWZmZXJzOjpTdHJpbmc+IGlkID0gMCwKKyAgICBpbnQ2NF90IHZhbCA9IDAsCisgICAgdWludDE2X3QgY291bnQgPSAwKSB7CisgIFN0YXRCdWlsZGVyIGJ1aWxkZXJfKF9mYmIpOworICBidWlsZGVyXy5hZGRfdmFsKHZhbCk7CisgIGJ1aWxkZXJfLmFkZF9pZChpZCk7CisgIGJ1aWxkZXJfLmFkZF9jb3VudChjb3VudCk7CisgIHJldHVybiBidWlsZGVyXy5GaW5pc2goKTsKK30KKworaW5saW5lIGZsYXRidWZmZXJzOjpPZmZzZXQ8U3RhdD4gQ3JlYXRlU3RhdERpcmVjdCgKKyAgICBmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsCisgICAgY29uc3QgY2hhciAqaWQgPSBudWxscHRyLAorICAgIGludDY0X3QgdmFsID0gMCwKKyAgICB1aW50MTZfdCBjb3VudCA9IDApIHsKKyAgYXV0byBpZF9fID0gaWQgPyBfZmJiLkNyZWF0ZVN0cmluZyhpZCkgOiAwOworICByZXR1cm4gTXlHYW1lOjpFeGFtcGxlOjpDcmVhdGVTdGF0KAorICAgICAgX2ZiYiwKKyAgICAgIGlkX18sCisgICAgICB2YWwsCisgICAgICBjb3VudCk7Cit9CisKK2ZsYXRidWZmZXJzOjpPZmZzZXQ8U3RhdD4gQ3JlYXRlU3RhdChmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IFN0YXRUICpfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlciA9IG51bGxwdHIpOworCitzdHJ1Y3QgUmVmZXJyYWJsZVQgOiBwdWJsaWMgZmxhdGJ1ZmZlcnM6Ok5hdGl2ZVRhYmxlIHsKKyAgdHlwZWRlZiBSZWZlcnJhYmxlIFRhYmxlVHlwZTsKKyAgdWludDY0X3QgaWQgPSAwOworfTsKKworc3RydWN0IFJlZmVycmFibGUgRkxBVEJVRkZFUlNfRklOQUxfQ0xBU1MgOiBwcml2YXRlIGZsYXRidWZmZXJzOjpUYWJsZSB7CisgIHR5cGVkZWYgUmVmZXJyYWJsZVQgTmF0aXZlVGFibGVUeXBlOworICB0eXBlZGVmIFJlZmVycmFibGVCdWlsZGVyIEJ1aWxkZXI7CisgIHN0YXRpYyBjb25zdCBmbGF0YnVmZmVyczo6VHlwZVRhYmxlICpNaW5pUmVmbGVjdFR5cGVUYWJsZSgpIHsKKyAgICByZXR1cm4gUmVmZXJyYWJsZVR5cGVUYWJsZSgpOworICB9CisgIGVudW0gRmxhdEJ1ZmZlcnNWVGFibGVPZmZzZXQgRkxBVEJVRkZFUlNfVlRBQkxFX1VOREVSTFlJTkdfVFlQRSB7CisgICAgVlRfSUQgPSA0CisgIH07CisgIHVpbnQ2NF90IGlkKCkgY29uc3QgeworICAgIHJldHVybiBHZXRGaWVsZDx1aW50NjRfdD4oVlRfSUQsIDApOworICB9CisgIGJvb2wgbXV0YXRlX2lkKHVpbnQ2NF90IF9pZCA9IDApIHsKKyAgICByZXR1cm4gU2V0RmllbGQ8dWludDY0X3Q+KFZUX0lELCBfaWQsIDApOworICB9CisgIGJvb2wgS2V5Q29tcGFyZUxlc3NUaGFuKGNvbnN0IFJlZmVycmFibGUgKm8pIGNvbnN0IHsKKyAgICByZXR1cm4gaWQoKSA8IG8tPmlkKCk7CisgIH0KKyAgaW50IEtleUNvbXBhcmVXaXRoVmFsdWUodWludDY0X3QgX2lkKSBjb25zdCB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PGludD4oaWQoKSA+IF9pZCkgLSBzdGF0aWNfY2FzdDxpbnQ+KGlkKCkgPCBfaWQpOworICB9CisgIGJvb2wgVmVyaWZ5KGZsYXRidWZmZXJzOjpWZXJpZmllciAmdmVyaWZpZXIpIGNvbnN0IHsKKyAgICByZXR1cm4gVmVyaWZ5VGFibGVTdGFydCh2ZXJpZmllcikgJiYKKyAgICAgICAgICAgVmVyaWZ5RmllbGQ8dWludDY0X3Q+KHZlcmlmaWVyLCBWVF9JRCwgOCkgJiYKKyAgICAgICAgICAgdmVyaWZpZXIuRW5kVGFibGUoKTsKKyAgfQorICBSZWZlcnJhYmxlVCAqVW5QYWNrKGNvbnN0IGZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIgPSBudWxscHRyKSBjb25zdDsKKyAgdm9pZCBVblBhY2tUbyhSZWZlcnJhYmxlVCAqX28sIGNvbnN0IGZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIgPSBudWxscHRyKSBjb25zdDsKKyAgc3RhdGljIGZsYXRidWZmZXJzOjpPZmZzZXQ8UmVmZXJyYWJsZT4gUGFjayhmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IFJlZmVycmFibGVUKiBfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlciA9IG51bGxwdHIpOworfTsKKworc3RydWN0IFJlZmVycmFibGVCdWlsZGVyIHsKKyAgdHlwZWRlZiBSZWZlcnJhYmxlIFRhYmxlOworICBmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJmZiYl87CisgIGZsYXRidWZmZXJzOjp1b2Zmc2V0X3Qgc3RhcnRfOworICB2b2lkIGFkZF9pZCh1aW50NjRfdCBpZCkgeworICAgIGZiYl8uQWRkRWxlbWVudDx1aW50NjRfdD4oUmVmZXJyYWJsZTo6VlRfSUQsIGlkLCAwKTsKKyAgfQorICBleHBsaWNpdCBSZWZlcnJhYmxlQnVpbGRlcihmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIpCisgICAgICAgIDogZmJiXyhfZmJiKSB7CisgICAgc3RhcnRfID0gZmJiXy5TdGFydFRhYmxlKCk7CisgIH0KKyAgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxSZWZlcnJhYmxlPiBGaW5pc2goKSB7CisgICAgY29uc3QgYXV0byBlbmQgPSBmYmJfLkVuZFRhYmxlKHN0YXJ0Xyk7CisgICAgYXV0byBvID0gZmxhdGJ1ZmZlcnM6Ok9mZnNldDxSZWZlcnJhYmxlPihlbmQpOworICAgIHJldHVybiBvOworICB9Cit9OworCitpbmxpbmUgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxSZWZlcnJhYmxlPiBDcmVhdGVSZWZlcnJhYmxlKAorICAgIGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwKKyAgICB1aW50NjRfdCBpZCA9IDApIHsKKyAgUmVmZXJyYWJsZUJ1aWxkZXIgYnVpbGRlcl8oX2ZiYik7CisgIGJ1aWxkZXJfLmFkZF9pZChpZCk7CisgIHJldHVybiBidWlsZGVyXy5GaW5pc2goKTsKK30KKworZmxhdGJ1ZmZlcnM6Ok9mZnNldDxSZWZlcnJhYmxlPiBDcmVhdGVSZWZlcnJhYmxlKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgUmVmZXJyYWJsZVQgKl9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyID0gbnVsbHB0cik7CisKK3N0cnVjdCBNb25zdGVyVCA6IHB1YmxpYyBmbGF0YnVmZmVyczo6TmF0aXZlVGFibGUgeworICB0eXBlZGVmIE1vbnN0ZXIgVGFibGVUeXBlOworICBmbGF0YnVmZmVyczo6dW5pcXVlX3B0cjxNeUdhbWU6OkV4YW1wbGU6OlZlYzM+IHBvc3t9OworICBpbnQxNl90IG1hbmEgPSAxNTA7CisgIGludDE2X3QgaHAgPSAxMDA7CisgIHN0ZDo6c3RyaW5nIG5hbWV7fTsKKyAgc3RkOjp2ZWN0b3I8dWludDhfdD4gaW52ZW50b3J5e307CisgIE15R2FtZTo6RXhhbXBsZTo6Q29sb3IgY29sb3IgPSBNeUdhbWU6OkV4YW1wbGU6OkNvbG9yX0JsdWU7CisgIE15R2FtZTo6RXhhbXBsZTo6QW55VW5pb24gdGVzdHt9OworICBzdGQ6OnZlY3RvcjxNeUdhbWU6OkV4YW1wbGU6OlRlc3Q+IHRlc3Q0e307CisgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiB0ZXN0YXJyYXlvZnN0cmluZ3t9OworICBzdGQ6OnZlY3RvcjxmbGF0YnVmZmVyczo6dW5pcXVlX3B0cjxNeUdhbWU6OkV4YW1wbGU6Ok1vbnN0ZXJUPj4gdGVzdGFycmF5b2Z0YWJsZXN7fTsKKyAgZmxhdGJ1ZmZlcnM6OnVuaXF1ZV9wdHI8TXlHYW1lOjpFeGFtcGxlOjpNb25zdGVyVD4gZW5lbXl7fTsKKyAgc3RkOjp2ZWN0b3I8dWludDhfdD4gdGVzdG5lc3RlZGZsYXRidWZmZXJ7fTsKKyAgZmxhdGJ1ZmZlcnM6OnVuaXF1ZV9wdHI8TXlHYW1lOjpFeGFtcGxlOjpTdGF0VD4gdGVzdGVtcHR5e307CisgIGJvb2wgdGVzdGJvb2wgPSBmYWxzZTsKKyAgaW50MzJfdCB0ZXN0aGFzaHMzMl9mbnYxID0gMDsKKyAgdWludDMyX3QgdGVzdGhhc2h1MzJfZm52MSA9IDA7CisgIGludDY0X3QgdGVzdGhhc2hzNjRfZm52MSA9IDA7CisgIHVpbnQ2NF90IHRlc3RoYXNodTY0X2ZudjEgPSAwOworICBpbnQzMl90IHRlc3RoYXNoczMyX2ZudjFhID0gMDsKKyAgU3RhdCAqdGVzdGhhc2h1MzJfZm52MWEgPSBudWxscHRyOworICBpbnQ2NF90IHRlc3RoYXNoczY0X2ZudjFhID0gMDsKKyAgdWludDY0X3QgdGVzdGhhc2h1NjRfZm52MWEgPSAwOworICBzdGQ6OnZlY3Rvcjxib29sPiB0ZXN0YXJyYXlvZmJvb2xze307CisgIGZsb2F0IHRlc3RmID0gMy4xNDE1OWY7CisgIGZsb2F0IHRlc3RmMiA9IDMuMGY7CisgIGZsb2F0IHRlc3RmMyA9IDAuMGY7CisgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiB0ZXN0YXJyYXlvZnN0cmluZzJ7fTsKKyAgc3RkOjp2ZWN0b3I8TXlHYW1lOjpFeGFtcGxlOjpBYmlsaXR5PiB0ZXN0YXJyYXlvZnNvcnRlZHN0cnVjdHt9OworICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBmbGV4e307CisgIHN0ZDo6dmVjdG9yPE15R2FtZTo6RXhhbXBsZTo6VGVzdD4gdGVzdDV7fTsKKyAgc3RkOjp2ZWN0b3I8aW50NjRfdD4gdmVjdG9yX29mX2xvbmdze307CisgIHN0ZDo6dmVjdG9yPGRvdWJsZT4gdmVjdG9yX29mX2RvdWJsZXN7fTsKKyAgZmxhdGJ1ZmZlcnM6OnVuaXF1ZV9wdHI8TXlHYW1lOjpJblBhcmVudE5hbWVzcGFjZVQ+IHBhcmVudF9uYW1lc3BhY2VfdGVzdHt9OworICBzdGQ6OnZlY3RvcjxmbGF0YnVmZmVyczo6dW5pcXVlX3B0cjxNeUdhbWU6OkV4YW1wbGU6OlJlZmVycmFibGVUPj4gdmVjdG9yX29mX3JlZmVycmFibGVze307CisgIFJlZmVycmFibGVUICpzaW5nbGVfd2Vha19yZWZlcmVuY2UgPSBudWxscHRyOworICBzdGQ6OnZlY3RvcjxSZWZlcnJhYmxlVCAqPiB2ZWN0b3Jfb2Zfd2Vha19yZWZlcmVuY2Vze307CisgIHN0ZDo6dmVjdG9yPGZsYXRidWZmZXJzOjp1bmlxdWVfcHRyPE15R2FtZTo6RXhhbXBsZTo6UmVmZXJyYWJsZVQ+PiB2ZWN0b3Jfb2Zfc3Ryb25nX3JlZmVycmFibGVze307CisgIFJlZmVycmFibGVUICpjb19vd25pbmdfcmVmZXJlbmNlID0gbnVsbHB0cjsKKyAgc3RkOjp2ZWN0b3I8ZmxhdGJ1ZmZlcnM6OnVuaXF1ZV9wdHI8UmVmZXJyYWJsZVQ+PiB2ZWN0b3Jfb2ZfY29fb3duaW5nX3JlZmVyZW5jZXN7fTsKKyAgUmVmZXJyYWJsZVQgKm5vbl9vd25pbmdfcmVmZXJlbmNlID0gbnVsbHB0cjsKKyAgc3RkOjp2ZWN0b3I8UmVmZXJyYWJsZVQgKj4gdmVjdG9yX29mX25vbl9vd25pbmdfcmVmZXJlbmNlc3t9OworICBNeUdhbWU6OkV4YW1wbGU6OkFueVVuaXF1ZUFsaWFzZXNVbmlvbiBhbnlfdW5pcXVle307CisgIE15R2FtZTo6RXhhbXBsZTo6QW55QW1iaWd1b3VzQWxpYXNlc1VuaW9uIGFueV9hbWJpZ3VvdXN7fTsKKyAgc3RkOjp2ZWN0b3I8TXlHYW1lOjpFeGFtcGxlOjpDb2xvcj4gdmVjdG9yX29mX2VudW1ze307CisgIE15R2FtZTo6RXhhbXBsZTo6UmFjZSBzaWduZWRfZW51bSA9IE15R2FtZTo6RXhhbXBsZTo6UmFjZV9Ob25lOworICBzdGQ6OnZlY3Rvcjx1aW50OF90PiB0ZXN0cmVxdWlyZWRuZXN0ZWRmbGF0YnVmZmVye307CisgIHN0ZDo6dmVjdG9yPGZsYXRidWZmZXJzOjp1bmlxdWVfcHRyPE15R2FtZTo6RXhhbXBsZTo6U3RhdFQ+PiBzY2FsYXJfa2V5X3NvcnRlZF90YWJsZXN7fTsKKyAgTXlHYW1lOjpFeGFtcGxlOjpUZXN0IG5hdGl2ZV9pbmxpbmV7fTsKKyAgTXlHYW1lOjpFeGFtcGxlOjpMb25nRW51bSBsb25nX2VudW1fbm9uX2VudW1fZGVmYXVsdCA9IHN0YXRpY19jYXN0PE15R2FtZTo6RXhhbXBsZTo6TG9uZ0VudW0+KDApOworICBNeUdhbWU6OkV4YW1wbGU6OkxvbmdFbnVtIGxvbmdfZW51bV9ub3JtYWxfZGVmYXVsdCA9IE15R2FtZTo6RXhhbXBsZTo6TG9uZ0VudW1fTG9uZ09uZTsKKyAgTW9uc3RlclQoKSA9IGRlZmF1bHQ7CisgIE1vbnN0ZXJUKGNvbnN0IE1vbnN0ZXJUICZvKTsKKyAgTW9uc3RlclQoTW9uc3RlclQmJikgRkxBVEJVRkZFUlNfTk9FWENFUFQgPSBkZWZhdWx0OworICBNb25zdGVyVCAmb3BlcmF0b3I9KE1vbnN0ZXJUIG8pIEZMQVRCVUZGRVJTX05PRVhDRVBUOworfTsKKworLy8vIGFuIGV4YW1wbGUgZG9jdW1lbnRhdGlvbiBjb21tZW50OiAibW9uc3RlciBvYmplY3QiCitzdHJ1Y3QgTW9uc3RlciBGTEFUQlVGRkVSU19GSU5BTF9DTEFTUyA6IHByaXZhdGUgZmxhdGJ1ZmZlcnM6OlRhYmxlIHsKKyAgdHlwZWRlZiBNb25zdGVyVCBOYXRpdmVUYWJsZVR5cGU7CisgIHR5cGVkZWYgTW9uc3RlckJ1aWxkZXIgQnVpbGRlcjsKKyAgc3RhdGljIGNvbnN0IGZsYXRidWZmZXJzOjpUeXBlVGFibGUgKk1pbmlSZWZsZWN0VHlwZVRhYmxlKCkgeworICAgIHJldHVybiBNb25zdGVyVHlwZVRhYmxlKCk7CisgIH0KKyAgZW51bSBGbGF0QnVmZmVyc1ZUYWJsZU9mZnNldCBGTEFUQlVGRkVSU19WVEFCTEVfVU5ERVJMWUlOR19UWVBFIHsKKyAgICBWVF9QT1MgPSA0LAorICAgIFZUX01BTkEgPSA2LAorICAgIFZUX0hQID0gOCwKKyAgICBWVF9OQU1FID0gMTAsCisgICAgVlRfSU5WRU5UT1JZID0gMTQsCisgICAgVlRfQ09MT1IgPSAxNiwKKyAgICBWVF9URVNUX1RZUEUgPSAxOCwKKyAgICBWVF9URVNUID0gMjAsCisgICAgVlRfVEVTVDQgPSAyMiwKKyAgICBWVF9URVNUQVJSQVlPRlNUUklORyA9IDI0LAorICAgIFZUX1RFU1RBUlJBWU9GVEFCTEVTID0gMjYsCisgICAgVlRfRU5FTVkgPSAyOCwKKyAgICBWVF9URVNUTkVTVEVERkxBVEJVRkZFUiA9IDMwLAorICAgIFZUX1RFU1RFTVBUWSA9IDMyLAorICAgIFZUX1RFU1RCT09MID0gMzQsCisgICAgVlRfVEVTVEhBU0hTMzJfRk5WMSA9IDM2LAorICAgIFZUX1RFU1RIQVNIVTMyX0ZOVjEgPSAzOCwKKyAgICBWVF9URVNUSEFTSFM2NF9GTlYxID0gNDAsCisgICAgVlRfVEVTVEhBU0hVNjRfRk5WMSA9IDQyLAorICAgIFZUX1RFU1RIQVNIUzMyX0ZOVjFBID0gNDQsCisgICAgVlRfVEVTVEhBU0hVMzJfRk5WMUEgPSA0NiwKKyAgICBWVF9URVNUSEFTSFM2NF9GTlYxQSA9IDQ4LAorICAgIFZUX1RFU1RIQVNIVTY0X0ZOVjFBID0gNTAsCisgICAgVlRfVEVTVEFSUkFZT0ZCT09MUyA9IDUyLAorICAgIFZUX1RFU1RGID0gNTQsCisgICAgVlRfVEVTVEYyID0gNTYsCisgICAgVlRfVEVTVEYzID0gNTgsCisgICAgVlRfVEVTVEFSUkFZT0ZTVFJJTkcyID0gNjAsCisgICAgVlRfVEVTVEFSUkFZT0ZTT1JURURTVFJVQ1QgPSA2MiwKKyAgICBWVF9GTEVYID0gNjQsCisgICAgVlRfVEVTVDUgPSA2NiwKKyAgICBWVF9WRUNUT1JfT0ZfTE9OR1MgPSA2OCwKKyAgICBWVF9WRUNUT1JfT0ZfRE9VQkxFUyA9IDcwLAorICAgIFZUX1BBUkVOVF9OQU1FU1BBQ0VfVEVTVCA9IDcyLAorICAgIFZUX1ZFQ1RPUl9PRl9SRUZFUlJBQkxFUyA9IDc0LAorICAgIFZUX1NJTkdMRV9XRUFLX1JFRkVSRU5DRSA9IDc2LAorICAgIFZUX1ZFQ1RPUl9PRl9XRUFLX1JFRkVSRU5DRVMgPSA3OCwKKyAgICBWVF9WRUNUT1JfT0ZfU1RST05HX1JFRkVSUkFCTEVTID0gODAsCisgICAgVlRfQ09fT1dOSU5HX1JFRkVSRU5DRSA9IDgyLAorICAgIFZUX1ZFQ1RPUl9PRl9DT19PV05JTkdfUkVGRVJFTkNFUyA9IDg0LAorICAgIFZUX05PTl9PV05JTkdfUkVGRVJFTkNFID0gODYsCisgICAgVlRfVkVDVE9SX09GX05PTl9PV05JTkdfUkVGRVJFTkNFUyA9IDg4LAorICAgIFZUX0FOWV9VTklRVUVfVFlQRSA9IDkwLAorICAgIFZUX0FOWV9VTklRVUUgPSA5MiwKKyAgICBWVF9BTllfQU1CSUdVT1VTX1RZUEUgPSA5NCwKKyAgICBWVF9BTllfQU1CSUdVT1VTID0gOTYsCisgICAgVlRfVkVDVE9SX09GX0VOVU1TID0gOTgsCisgICAgVlRfU0lHTkVEX0VOVU0gPSAxMDAsCisgICAgVlRfVEVTVFJFUVVJUkVETkVTVEVERkxBVEJVRkZFUiA9IDEwMiwKKyAgICBWVF9TQ0FMQVJfS0VZX1NPUlRFRF9UQUJMRVMgPSAxMDQsCisgICAgVlRfTkFUSVZFX0lOTElORSA9IDEwNiwKKyAgICBWVF9MT05HX0VOVU1fTk9OX0VOVU1fREVGQVVMVCA9IDEwOCwKKyAgICBWVF9MT05HX0VOVU1fTk9STUFMX0RFRkFVTFQgPSAxMTAKKyAgfTsKKyAgY29uc3QgTXlHYW1lOjpFeGFtcGxlOjpWZWMzICpwb3MoKSBjb25zdCB7CisgICAgcmV0dXJuIEdldFN0cnVjdDxjb25zdCBNeUdhbWU6OkV4YW1wbGU6OlZlYzMgKj4oVlRfUE9TKTsKKyAgfQorICBNeUdhbWU6OkV4YW1wbGU6OlZlYzMgKm11dGFibGVfcG9zKCkgeworICAgIHJldHVybiBHZXRTdHJ1Y3Q8TXlHYW1lOjpFeGFtcGxlOjpWZWMzICo+KFZUX1BPUyk7CisgIH0KKyAgaW50MTZfdCBtYW5hKCkgY29uc3QgeworICAgIHJldHVybiBHZXRGaWVsZDxpbnQxNl90PihWVF9NQU5BLCAxNTApOworICB9CisgIGJvb2wgbXV0YXRlX21hbmEoaW50MTZfdCBfbWFuYSA9IDE1MCkgeworICAgIHJldHVybiBTZXRGaWVsZDxpbnQxNl90PihWVF9NQU5BLCBfbWFuYSwgMTUwKTsKKyAgfQorICBpbnQxNl90IGhwKCkgY29uc3QgeworICAgIHJldHVybiBHZXRGaWVsZDxpbnQxNl90PihWVF9IUCwgMTAwKTsKKyAgfQorICBib29sIG11dGF0ZV9ocChpbnQxNl90IF9ocCA9IDEwMCkgeworICAgIHJldHVybiBTZXRGaWVsZDxpbnQxNl90PihWVF9IUCwgX2hwLCAxMDApOworICB9CisgIGNvbnN0IGZsYXRidWZmZXJzOjpTdHJpbmcgKm5hbWUoKSBjb25zdCB7CisgICAgcmV0dXJuIEdldFBvaW50ZXI8Y29uc3QgZmxhdGJ1ZmZlcnM6OlN0cmluZyAqPihWVF9OQU1FKTsKKyAgfQorICBmbGF0YnVmZmVyczo6U3RyaW5nICptdXRhYmxlX25hbWUoKSB7CisgICAgcmV0dXJuIEdldFBvaW50ZXI8ZmxhdGJ1ZmZlcnM6OlN0cmluZyAqPihWVF9OQU1FKTsKKyAgfQorICBib29sIEtleUNvbXBhcmVMZXNzVGhhbihjb25zdCBNb25zdGVyICpvKSBjb25zdCB7CisgICAgcmV0dXJuICpuYW1lKCkgPCAqby0+bmFtZSgpOworICB9CisgIGludCBLZXlDb21wYXJlV2l0aFZhbHVlKGNvbnN0IGNoYXIgKl9uYW1lKSBjb25zdCB7CisgICAgcmV0dXJuIHN0cmNtcChuYW1lKCktPmNfc3RyKCksIF9uYW1lKTsKKyAgfQorICBjb25zdCBmbGF0YnVmZmVyczo6VmVjdG9yPHVpbnQ4X3Q+ICppbnZlbnRvcnkoKSBjb25zdCB7CisgICAgcmV0dXJuIEdldFBvaW50ZXI8Y29uc3QgZmxhdGJ1ZmZlcnM6OlZlY3Rvcjx1aW50OF90PiAqPihWVF9JTlZFTlRPUlkpOworICB9CisgIGZsYXRidWZmZXJzOjpWZWN0b3I8dWludDhfdD4gKm11dGFibGVfaW52ZW50b3J5KCkgeworICAgIHJldHVybiBHZXRQb2ludGVyPGZsYXRidWZmZXJzOjpWZWN0b3I8dWludDhfdD4gKj4oVlRfSU5WRU5UT1JZKTsKKyAgfQorICBNeUdhbWU6OkV4YW1wbGU6OkNvbG9yIGNvbG9yKCkgY29uc3QgeworICAgIHJldHVybiBzdGF0aWNfY2FzdDxNeUdhbWU6OkV4YW1wbGU6OkNvbG9yPihHZXRGaWVsZDx1aW50OF90PihWVF9DT0xPUiwgOCkpOworICB9CisgIGJvb2wgbXV0YXRlX2NvbG9yKE15R2FtZTo6RXhhbXBsZTo6Q29sb3IgX2NvbG9yID0gc3RhdGljX2Nhc3Q8TXlHYW1lOjpFeGFtcGxlOjpDb2xvcj4oOCkpIHsKKyAgICByZXR1cm4gU2V0RmllbGQ8dWludDhfdD4oVlRfQ09MT1IsIHN0YXRpY19jYXN0PHVpbnQ4X3Q+KF9jb2xvciksIDgpOworICB9CisgIE15R2FtZTo6RXhhbXBsZTo6QW55IHRlc3RfdHlwZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8TXlHYW1lOjpFeGFtcGxlOjpBbnk+KEdldEZpZWxkPHVpbnQ4X3Q+KFZUX1RFU1RfVFlQRSwgMCkpOworICB9CisgIGNvbnN0IHZvaWQgKnRlc3QoKSBjb25zdCB7CisgICAgcmV0dXJuIEdldFBvaW50ZXI8Y29uc3Qgdm9pZCAqPihWVF9URVNUKTsKKyAgfQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBjb25zdCBUICp0ZXN0X2FzKCkgY29uc3Q7CisgIGNvbnN0IE15R2FtZTo6RXhhbXBsZTo6TW9uc3RlciAqdGVzdF9hc19Nb25zdGVyKCkgY29uc3QgeworICAgIHJldHVybiB0ZXN0X3R5cGUoKSA9PSBNeUdhbWU6OkV4YW1wbGU6OkFueV9Nb25zdGVyID8gc3RhdGljX2Nhc3Q8Y29uc3QgTXlHYW1lOjpFeGFtcGxlOjpNb25zdGVyICo+KHRlc3QoKSkgOiBudWxscHRyOworICB9CisgIGNvbnN0IE15R2FtZTo6RXhhbXBsZTo6VGVzdFNpbXBsZVRhYmxlV2l0aEVudW0gKnRlc3RfYXNfVGVzdFNpbXBsZVRhYmxlV2l0aEVudW0oKSBjb25zdCB7CisgICAgcmV0dXJuIHRlc3RfdHlwZSgpID09IE15R2FtZTo6RXhhbXBsZTo6QW55X1Rlc3RTaW1wbGVUYWJsZVdpdGhFbnVtID8gc3RhdGljX2Nhc3Q8Y29uc3QgTXlHYW1lOjpFeGFtcGxlOjpUZXN0U2ltcGxlVGFibGVXaXRoRW51bSAqPih0ZXN0KCkpIDogbnVsbHB0cjsKKyAgfQorICBjb25zdCBNeUdhbWU6OkV4YW1wbGUyOjpNb25zdGVyICp0ZXN0X2FzX015R2FtZV9FeGFtcGxlMl9Nb25zdGVyKCkgY29uc3QgeworICAgIHJldHVybiB0ZXN0X3R5cGUoKSA9PSBNeUdhbWU6OkV4YW1wbGU6OkFueV9NeUdhbWVfRXhhbXBsZTJfTW9uc3RlciA/IHN0YXRpY19jYXN0PGNvbnN0IE15R2FtZTo6RXhhbXBsZTI6Ok1vbnN0ZXIgKj4odGVzdCgpKSA6IG51bGxwdHI7CisgIH0KKyAgdm9pZCAqbXV0YWJsZV90ZXN0KCkgeworICAgIHJldHVybiBHZXRQb2ludGVyPHZvaWQgKj4oVlRfVEVTVCk7CisgIH0KKyAgY29uc3QgZmxhdGJ1ZmZlcnM6OlZlY3Rvcjxjb25zdCBNeUdhbWU6OkV4YW1wbGU6OlRlc3QgKj4gKnRlc3Q0KCkgY29uc3QgeworICAgIHJldHVybiBHZXRQb2ludGVyPGNvbnN0IGZsYXRidWZmZXJzOjpWZWN0b3I8Y29uc3QgTXlHYW1lOjpFeGFtcGxlOjpUZXN0ICo+ICo+KFZUX1RFU1Q0KTsKKyAgfQorICBmbGF0YnVmZmVyczo6VmVjdG9yPGNvbnN0IE15R2FtZTo6RXhhbXBsZTo6VGVzdCAqPiAqbXV0YWJsZV90ZXN0NCgpIHsKKyAgICByZXR1cm4gR2V0UG9pbnRlcjxmbGF0YnVmZmVyczo6VmVjdG9yPGNvbnN0IE15R2FtZTo6RXhhbXBsZTo6VGVzdCAqPiAqPihWVF9URVNUNCk7CisgIH0KKyAgY29uc3QgZmxhdGJ1ZmZlcnM6OlZlY3RvcjxmbGF0YnVmZmVyczo6T2Zmc2V0PGZsYXRidWZmZXJzOjpTdHJpbmc+PiAqdGVzdGFycmF5b2ZzdHJpbmcoKSBjb25zdCB7CisgICAgcmV0dXJuIEdldFBvaW50ZXI8Y29uc3QgZmxhdGJ1ZmZlcnM6OlZlY3RvcjxmbGF0YnVmZmVyczo6T2Zmc2V0PGZsYXRidWZmZXJzOjpTdHJpbmc+PiAqPihWVF9URVNUQVJSQVlPRlNUUklORyk7CisgIH0KKyAgZmxhdGJ1ZmZlcnM6OlZlY3RvcjxmbGF0YnVmZmVyczo6T2Zmc2V0PGZsYXRidWZmZXJzOjpTdHJpbmc+PiAqbXV0YWJsZV90ZXN0YXJyYXlvZnN0cmluZygpIHsKKyAgICByZXR1cm4gR2V0UG9pbnRlcjxmbGF0YnVmZmVyczo6VmVjdG9yPGZsYXRidWZmZXJzOjpPZmZzZXQ8ZmxhdGJ1ZmZlcnM6OlN0cmluZz4+ICo+KFZUX1RFU1RBUlJBWU9GU1RSSU5HKTsKKyAgfQorICAvLy8gYW4gZXhhbXBsZSBkb2N1bWVudGF0aW9uIGNvbW1lbnQ6IHRoaXMgd2lsbCBlbmQgdXAgaW4gdGhlIGdlbmVyYXRlZCBjb2RlCisgIC8vLyBtdWx0aWxpbmUgdG9vCisgIGNvbnN0IGZsYXRidWZmZXJzOjpWZWN0b3I8ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxNeUdhbWU6OkV4YW1wbGU6Ok1vbnN0ZXI+PiAqdGVzdGFycmF5b2Z0YWJsZXMoKSBjb25zdCB7CisgICAgcmV0dXJuIEdldFBvaW50ZXI8Y29uc3QgZmxhdGJ1ZmZlcnM6OlZlY3RvcjxmbGF0YnVmZmVyczo6T2Zmc2V0PE15R2FtZTo6RXhhbXBsZTo6TW9uc3Rlcj4+ICo+KFZUX1RFU1RBUlJBWU9GVEFCTEVTKTsKKyAgfQorICBmbGF0YnVmZmVyczo6VmVjdG9yPGZsYXRidWZmZXJzOjpPZmZzZXQ8TXlHYW1lOjpFeGFtcGxlOjpNb25zdGVyPj4gKm11dGFibGVfdGVzdGFycmF5b2Z0YWJsZXMoKSB7CisgICAgcmV0dXJuIEdldFBvaW50ZXI8ZmxhdGJ1ZmZlcnM6OlZlY3RvcjxmbGF0YnVmZmVyczo6T2Zmc2V0PE15R2FtZTo6RXhhbXBsZTo6TW9uc3Rlcj4+ICo+KFZUX1RFU1RBUlJBWU9GVEFCTEVTKTsKKyAgfQorICBjb25zdCBNeUdhbWU6OkV4YW1wbGU6Ok1vbnN0ZXIgKmVuZW15KCkgY29uc3QgeworICAgIHJldHVybiBHZXRQb2ludGVyPGNvbnN0IE15R2FtZTo6RXhhbXBsZTo6TW9uc3RlciAqPihWVF9FTkVNWSk7CisgIH0KKyAgTXlHYW1lOjpFeGFtcGxlOjpNb25zdGVyICptdXRhYmxlX2VuZW15KCkgeworICAgIHJldHVybiBHZXRQb2ludGVyPE15R2FtZTo6RXhhbXBsZTo6TW9uc3RlciAqPihWVF9FTkVNWSk7CisgIH0KKyAgY29uc3QgZmxhdGJ1ZmZlcnM6OlZlY3Rvcjx1aW50OF90PiAqdGVzdG5lc3RlZGZsYXRidWZmZXIoKSBjb25zdCB7CisgICAgcmV0dXJuIEdldFBvaW50ZXI8Y29uc3QgZmxhdGJ1ZmZlcnM6OlZlY3Rvcjx1aW50OF90PiAqPihWVF9URVNUTkVTVEVERkxBVEJVRkZFUik7CisgIH0KKyAgZmxhdGJ1ZmZlcnM6OlZlY3Rvcjx1aW50OF90PiAqbXV0YWJsZV90ZXN0bmVzdGVkZmxhdGJ1ZmZlcigpIHsKKyAgICByZXR1cm4gR2V0UG9pbnRlcjxmbGF0YnVmZmVyczo6VmVjdG9yPHVpbnQ4X3Q+ICo+KFZUX1RFU1RORVNURURGTEFUQlVGRkVSKTsKKyAgfQorICBjb25zdCBNeUdhbWU6OkV4YW1wbGU6Ok1vbnN0ZXIgKnRlc3RuZXN0ZWRmbGF0YnVmZmVyX25lc3RlZF9yb290KCkgY29uc3QgeworICAgIHJldHVybiBmbGF0YnVmZmVyczo6R2V0Um9vdDxNeUdhbWU6OkV4YW1wbGU6Ok1vbnN0ZXI+KHRlc3RuZXN0ZWRmbGF0YnVmZmVyKCktPkRhdGEoKSk7CisgIH0KKyAgY29uc3QgTXlHYW1lOjpFeGFtcGxlOjpTdGF0ICp0ZXN0ZW1wdHkoKSBjb25zdCB7CisgICAgcmV0dXJuIEdldFBvaW50ZXI8Y29uc3QgTXlHYW1lOjpFeGFtcGxlOjpTdGF0ICo+KFZUX1RFU1RFTVBUWSk7CisgIH0KKyAgTXlHYW1lOjpFeGFtcGxlOjpTdGF0ICptdXRhYmxlX3Rlc3RlbXB0eSgpIHsKKyAgICByZXR1cm4gR2V0UG9pbnRlcjxNeUdhbWU6OkV4YW1wbGU6OlN0YXQgKj4oVlRfVEVTVEVNUFRZKTsKKyAgfQorICBib29sIHRlc3Rib29sKCkgY29uc3QgeworICAgIHJldHVybiBHZXRGaWVsZDx1aW50OF90PihWVF9URVNUQk9PTCwgMCkgIT0gMDsKKyAgfQorICBib29sIG11dGF0ZV90ZXN0Ym9vbChib29sIF90ZXN0Ym9vbCA9IDApIHsKKyAgICByZXR1cm4gU2V0RmllbGQ8dWludDhfdD4oVlRfVEVTVEJPT0wsIHN0YXRpY19jYXN0PHVpbnQ4X3Q+KF90ZXN0Ym9vbCksIDApOworICB9CisgIGludDMyX3QgdGVzdGhhc2hzMzJfZm52MSgpIGNvbnN0IHsKKyAgICByZXR1cm4gR2V0RmllbGQ8aW50MzJfdD4oVlRfVEVTVEhBU0hTMzJfRk5WMSwgMCk7CisgIH0KKyAgYm9vbCBtdXRhdGVfdGVzdGhhc2hzMzJfZm52MShpbnQzMl90IF90ZXN0aGFzaHMzMl9mbnYxID0gMCkgeworICAgIHJldHVybiBTZXRGaWVsZDxpbnQzMl90PihWVF9URVNUSEFTSFMzMl9GTlYxLCBfdGVzdGhhc2hzMzJfZm52MSwgMCk7CisgIH0KKyAgdWludDMyX3QgdGVzdGhhc2h1MzJfZm52MSgpIGNvbnN0IHsKKyAgICByZXR1cm4gR2V0RmllbGQ8dWludDMyX3Q+KFZUX1RFU1RIQVNIVTMyX0ZOVjEsIDApOworICB9CisgIGJvb2wgbXV0YXRlX3Rlc3RoYXNodTMyX2ZudjEodWludDMyX3QgX3Rlc3RoYXNodTMyX2ZudjEgPSAwKSB7CisgICAgcmV0dXJuIFNldEZpZWxkPHVpbnQzMl90PihWVF9URVNUSEFTSFUzMl9GTlYxLCBfdGVzdGhhc2h1MzJfZm52MSwgMCk7CisgIH0KKyAgaW50NjRfdCB0ZXN0aGFzaHM2NF9mbnYxKCkgY29uc3QgeworICAgIHJldHVybiBHZXRGaWVsZDxpbnQ2NF90PihWVF9URVNUSEFTSFM2NF9GTlYxLCAwKTsKKyAgfQorICBib29sIG11dGF0ZV90ZXN0aGFzaHM2NF9mbnYxKGludDY0X3QgX3Rlc3RoYXNoczY0X2ZudjEgPSAwKSB7CisgICAgcmV0dXJuIFNldEZpZWxkPGludDY0X3Q+KFZUX1RFU1RIQVNIUzY0X0ZOVjEsIF90ZXN0aGFzaHM2NF9mbnYxLCAwKTsKKyAgfQorICB1aW50NjRfdCB0ZXN0aGFzaHU2NF9mbnYxKCkgY29uc3QgeworICAgIHJldHVybiBHZXRGaWVsZDx1aW50NjRfdD4oVlRfVEVTVEhBU0hVNjRfRk5WMSwgMCk7CisgIH0KKyAgYm9vbCBtdXRhdGVfdGVzdGhhc2h1NjRfZm52MSh1aW50NjRfdCBfdGVzdGhhc2h1NjRfZm52MSA9IDApIHsKKyAgICByZXR1cm4gU2V0RmllbGQ8dWludDY0X3Q+KFZUX1RFU1RIQVNIVTY0X0ZOVjEsIF90ZXN0aGFzaHU2NF9mbnYxLCAwKTsKKyAgfQorICBpbnQzMl90IHRlc3RoYXNoczMyX2ZudjFhKCkgY29uc3QgeworICAgIHJldHVybiBHZXRGaWVsZDxpbnQzMl90PihWVF9URVNUSEFTSFMzMl9GTlYxQSwgMCk7CisgIH0KKyAgYm9vbCBtdXRhdGVfdGVzdGhhc2hzMzJfZm52MWEoaW50MzJfdCBfdGVzdGhhc2hzMzJfZm52MWEgPSAwKSB7CisgICAgcmV0dXJuIFNldEZpZWxkPGludDMyX3Q+KFZUX1RFU1RIQVNIUzMyX0ZOVjFBLCBfdGVzdGhhc2hzMzJfZm52MWEsIDApOworICB9CisgIHVpbnQzMl90IHRlc3RoYXNodTMyX2ZudjFhKCkgY29uc3QgeworICAgIHJldHVybiBHZXRGaWVsZDx1aW50MzJfdD4oVlRfVEVTVEhBU0hVMzJfRk5WMUEsIDApOworICB9CisgIGJvb2wgbXV0YXRlX3Rlc3RoYXNodTMyX2ZudjFhKHVpbnQzMl90IF90ZXN0aGFzaHUzMl9mbnYxYSA9IDApIHsKKyAgICByZXR1cm4gU2V0RmllbGQ8dWludDMyX3Q+KFZUX1RFU1RIQVNIVTMyX0ZOVjFBLCBfdGVzdGhhc2h1MzJfZm52MWEsIDApOworICB9CisgIGludDY0X3QgdGVzdGhhc2hzNjRfZm52MWEoKSBjb25zdCB7CisgICAgcmV0dXJuIEdldEZpZWxkPGludDY0X3Q+KFZUX1RFU1RIQVNIUzY0X0ZOVjFBLCAwKTsKKyAgfQorICBib29sIG11dGF0ZV90ZXN0aGFzaHM2NF9mbnYxYShpbnQ2NF90IF90ZXN0aGFzaHM2NF9mbnYxYSA9IDApIHsKKyAgICByZXR1cm4gU2V0RmllbGQ8aW50NjRfdD4oVlRfVEVTVEhBU0hTNjRfRk5WMUEsIF90ZXN0aGFzaHM2NF9mbnYxYSwgMCk7CisgIH0KKyAgdWludDY0X3QgdGVzdGhhc2h1NjRfZm52MWEoKSBjb25zdCB7CisgICAgcmV0dXJuIEdldEZpZWxkPHVpbnQ2NF90PihWVF9URVNUSEFTSFU2NF9GTlYxQSwgMCk7CisgIH0KKyAgYm9vbCBtdXRhdGVfdGVzdGhhc2h1NjRfZm52MWEodWludDY0X3QgX3Rlc3RoYXNodTY0X2ZudjFhID0gMCkgeworICAgIHJldHVybiBTZXRGaWVsZDx1aW50NjRfdD4oVlRfVEVTVEhBU0hVNjRfRk5WMUEsIF90ZXN0aGFzaHU2NF9mbnYxYSwgMCk7CisgIH0KKyAgY29uc3QgZmxhdGJ1ZmZlcnM6OlZlY3Rvcjx1aW50OF90PiAqdGVzdGFycmF5b2Zib29scygpIGNvbnN0IHsKKyAgICByZXR1cm4gR2V0UG9pbnRlcjxjb25zdCBmbGF0YnVmZmVyczo6VmVjdG9yPHVpbnQ4X3Q+ICo+KFZUX1RFU1RBUlJBWU9GQk9PTFMpOworICB9CisgIGZsYXRidWZmZXJzOjpWZWN0b3I8dWludDhfdD4gKm11dGFibGVfdGVzdGFycmF5b2Zib29scygpIHsKKyAgICByZXR1cm4gR2V0UG9pbnRlcjxmbGF0YnVmZmVyczo6VmVjdG9yPHVpbnQ4X3Q+ICo+KFZUX1RFU1RBUlJBWU9GQk9PTFMpOworICB9CisgIGZsb2F0IHRlc3RmKCkgY29uc3QgeworICAgIHJldHVybiBHZXRGaWVsZDxmbG9hdD4oVlRfVEVTVEYsIDMuMTQxNTlmKTsKKyAgfQorICBib29sIG11dGF0ZV90ZXN0ZihmbG9hdCBfdGVzdGYgPSAzLjE0MTU5ZikgeworICAgIHJldHVybiBTZXRGaWVsZDxmbG9hdD4oVlRfVEVTVEYsIF90ZXN0ZiwgMy4xNDE1OWYpOworICB9CisgIGZsb2F0IHRlc3RmMigpIGNvbnN0IHsKKyAgICByZXR1cm4gR2V0RmllbGQ8ZmxvYXQ+KFZUX1RFU1RGMiwgMy4wZik7CisgIH0KKyAgYm9vbCBtdXRhdGVfdGVzdGYyKGZsb2F0IF90ZXN0ZjIgPSAzLjBmKSB7CisgICAgcmV0dXJuIFNldEZpZWxkPGZsb2F0PihWVF9URVNURjIsIF90ZXN0ZjIsIDMuMGYpOworICB9CisgIGZsb2F0IHRlc3RmMygpIGNvbnN0IHsKKyAgICByZXR1cm4gR2V0RmllbGQ8ZmxvYXQ+KFZUX1RFU1RGMywgMC4wZik7CisgIH0KKyAgYm9vbCBtdXRhdGVfdGVzdGYzKGZsb2F0IF90ZXN0ZjMgPSAwLjBmKSB7CisgICAgcmV0dXJuIFNldEZpZWxkPGZsb2F0PihWVF9URVNURjMsIF90ZXN0ZjMsIDAuMGYpOworICB9CisgIGNvbnN0IGZsYXRidWZmZXJzOjpWZWN0b3I8ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxmbGF0YnVmZmVyczo6U3RyaW5nPj4gKnRlc3RhcnJheW9mc3RyaW5nMigpIGNvbnN0IHsKKyAgICByZXR1cm4gR2V0UG9pbnRlcjxjb25zdCBmbGF0YnVmZmVyczo6VmVjdG9yPGZsYXRidWZmZXJzOjpPZmZzZXQ8ZmxhdGJ1ZmZlcnM6OlN0cmluZz4+ICo+KFZUX1RFU1RBUlJBWU9GU1RSSU5HMik7CisgIH0KKyAgZmxhdGJ1ZmZlcnM6OlZlY3RvcjxmbGF0YnVmZmVyczo6T2Zmc2V0PGZsYXRidWZmZXJzOjpTdHJpbmc+PiAqbXV0YWJsZV90ZXN0YXJyYXlvZnN0cmluZzIoKSB7CisgICAgcmV0dXJuIEdldFBvaW50ZXI8ZmxhdGJ1ZmZlcnM6OlZlY3RvcjxmbGF0YnVmZmVyczo6T2Zmc2V0PGZsYXRidWZmZXJzOjpTdHJpbmc+PiAqPihWVF9URVNUQVJSQVlPRlNUUklORzIpOworICB9CisgIGNvbnN0IGZsYXRidWZmZXJzOjpWZWN0b3I8Y29uc3QgTXlHYW1lOjpFeGFtcGxlOjpBYmlsaXR5ICo+ICp0ZXN0YXJyYXlvZnNvcnRlZHN0cnVjdCgpIGNvbnN0IHsKKyAgICByZXR1cm4gR2V0UG9pbnRlcjxjb25zdCBmbGF0YnVmZmVyczo6VmVjdG9yPGNvbnN0IE15R2FtZTo6RXhhbXBsZTo6QWJpbGl0eSAqPiAqPihWVF9URVNUQVJSQVlPRlNPUlRFRFNUUlVDVCk7CisgIH0KKyAgZmxhdGJ1ZmZlcnM6OlZlY3Rvcjxjb25zdCBNeUdhbWU6OkV4YW1wbGU6OkFiaWxpdHkgKj4gKm11dGFibGVfdGVzdGFycmF5b2Zzb3J0ZWRzdHJ1Y3QoKSB7CisgICAgcmV0dXJuIEdldFBvaW50ZXI8ZmxhdGJ1ZmZlcnM6OlZlY3Rvcjxjb25zdCBNeUdhbWU6OkV4YW1wbGU6OkFiaWxpdHkgKj4gKj4oVlRfVEVTVEFSUkFZT0ZTT1JURURTVFJVQ1QpOworICB9CisgIGNvbnN0IGZsYXRidWZmZXJzOjpWZWN0b3I8dWludDhfdD4gKmZsZXgoKSBjb25zdCB7CisgICAgcmV0dXJuIEdldFBvaW50ZXI8Y29uc3QgZmxhdGJ1ZmZlcnM6OlZlY3Rvcjx1aW50OF90PiAqPihWVF9GTEVYKTsKKyAgfQorICBmbGF0YnVmZmVyczo6VmVjdG9yPHVpbnQ4X3Q+ICptdXRhYmxlX2ZsZXgoKSB7CisgICAgcmV0dXJuIEdldFBvaW50ZXI8ZmxhdGJ1ZmZlcnM6OlZlY3Rvcjx1aW50OF90PiAqPihWVF9GTEVYKTsKKyAgfQorICBmbGV4YnVmZmVyczo6UmVmZXJlbmNlIGZsZXhfZmxleGJ1ZmZlcl9yb290KCkgY29uc3QgeworICAgIHJldHVybiBmbGV4YnVmZmVyczo6R2V0Um9vdChmbGV4KCktPkRhdGEoKSwgZmxleCgpLT5zaXplKCkpOworICB9CisgIGNvbnN0IGZsYXRidWZmZXJzOjpWZWN0b3I8Y29uc3QgTXlHYW1lOjpFeGFtcGxlOjpUZXN0ICo+ICp0ZXN0NSgpIGNvbnN0IHsKKyAgICByZXR1cm4gR2V0UG9pbnRlcjxjb25zdCBmbGF0YnVmZmVyczo6VmVjdG9yPGNvbnN0IE15R2FtZTo6RXhhbXBsZTo6VGVzdCAqPiAqPihWVF9URVNUNSk7CisgIH0KKyAgZmxhdGJ1ZmZlcnM6OlZlY3Rvcjxjb25zdCBNeUdhbWU6OkV4YW1wbGU6OlRlc3QgKj4gKm11dGFibGVfdGVzdDUoKSB7CisgICAgcmV0dXJuIEdldFBvaW50ZXI8ZmxhdGJ1ZmZlcnM6OlZlY3Rvcjxjb25zdCBNeUdhbWU6OkV4YW1wbGU6OlRlc3QgKj4gKj4oVlRfVEVTVDUpOworICB9CisgIGNvbnN0IGZsYXRidWZmZXJzOjpWZWN0b3I8aW50NjRfdD4gKnZlY3Rvcl9vZl9sb25ncygpIGNvbnN0IHsKKyAgICByZXR1cm4gR2V0UG9pbnRlcjxjb25zdCBmbGF0YnVmZmVyczo6VmVjdG9yPGludDY0X3Q+ICo+KFZUX1ZFQ1RPUl9PRl9MT05HUyk7CisgIH0KKyAgZmxhdGJ1ZmZlcnM6OlZlY3RvcjxpbnQ2NF90PiAqbXV0YWJsZV92ZWN0b3Jfb2ZfbG9uZ3MoKSB7CisgICAgcmV0dXJuIEdldFBvaW50ZXI8ZmxhdGJ1ZmZlcnM6OlZlY3RvcjxpbnQ2NF90PiAqPihWVF9WRUNUT1JfT0ZfTE9OR1MpOworICB9CisgIGNvbnN0IGZsYXRidWZmZXJzOjpWZWN0b3I8ZG91YmxlPiAqdmVjdG9yX29mX2RvdWJsZXMoKSBjb25zdCB7CisgICAgcmV0dXJuIEdldFBvaW50ZXI8Y29uc3QgZmxhdGJ1ZmZlcnM6OlZlY3Rvcjxkb3VibGU+ICo+KFZUX1ZFQ1RPUl9PRl9ET1VCTEVTKTsKKyAgfQorICBmbGF0YnVmZmVyczo6VmVjdG9yPGRvdWJsZT4gKm11dGFibGVfdmVjdG9yX29mX2RvdWJsZXMoKSB7CisgICAgcmV0dXJuIEdldFBvaW50ZXI8ZmxhdGJ1ZmZlcnM6OlZlY3Rvcjxkb3VibGU+ICo+KFZUX1ZFQ1RPUl9PRl9ET1VCTEVTKTsKKyAgfQorICBjb25zdCBNeUdhbWU6OkluUGFyZW50TmFtZXNwYWNlICpwYXJlbnRfbmFtZXNwYWNlX3Rlc3QoKSBjb25zdCB7CisgICAgcmV0dXJuIEdldFBvaW50ZXI8Y29uc3QgTXlHYW1lOjpJblBhcmVudE5hbWVzcGFjZSAqPihWVF9QQVJFTlRfTkFNRVNQQUNFX1RFU1QpOworICB9CisgIE15R2FtZTo6SW5QYXJlbnROYW1lc3BhY2UgKm11dGFibGVfcGFyZW50X25hbWVzcGFjZV90ZXN0KCkgeworICAgIHJldHVybiBHZXRQb2ludGVyPE15R2FtZTo6SW5QYXJlbnROYW1lc3BhY2UgKj4oVlRfUEFSRU5UX05BTUVTUEFDRV9URVNUKTsKKyAgfQorICBjb25zdCBmbGF0YnVmZmVyczo6VmVjdG9yPGZsYXRidWZmZXJzOjpPZmZzZXQ8TXlHYW1lOjpFeGFtcGxlOjpSZWZlcnJhYmxlPj4gKnZlY3Rvcl9vZl9yZWZlcnJhYmxlcygpIGNvbnN0IHsKKyAgICByZXR1cm4gR2V0UG9pbnRlcjxjb25zdCBmbGF0YnVmZmVyczo6VmVjdG9yPGZsYXRidWZmZXJzOjpPZmZzZXQ8TXlHYW1lOjpFeGFtcGxlOjpSZWZlcnJhYmxlPj4gKj4oVlRfVkVDVE9SX09GX1JFRkVSUkFCTEVTKTsKKyAgfQorICBmbGF0YnVmZmVyczo6VmVjdG9yPGZsYXRidWZmZXJzOjpPZmZzZXQ8TXlHYW1lOjpFeGFtcGxlOjpSZWZlcnJhYmxlPj4gKm11dGFibGVfdmVjdG9yX29mX3JlZmVycmFibGVzKCkgeworICAgIHJldHVybiBHZXRQb2ludGVyPGZsYXRidWZmZXJzOjpWZWN0b3I8ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxNeUdhbWU6OkV4YW1wbGU6OlJlZmVycmFibGU+PiAqPihWVF9WRUNUT1JfT0ZfUkVGRVJSQUJMRVMpOworICB9CisgIHVpbnQ2NF90IHNpbmdsZV93ZWFrX3JlZmVyZW5jZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gR2V0RmllbGQ8dWludDY0X3Q+KFZUX1NJTkdMRV9XRUFLX1JFRkVSRU5DRSwgMCk7CisgIH0KKyAgYm9vbCBtdXRhdGVfc2luZ2xlX3dlYWtfcmVmZXJlbmNlKHVpbnQ2NF90IF9zaW5nbGVfd2Vha19yZWZlcmVuY2UgPSAwKSB7CisgICAgcmV0dXJuIFNldEZpZWxkPHVpbnQ2NF90PihWVF9TSU5HTEVfV0VBS19SRUZFUkVOQ0UsIF9zaW5nbGVfd2Vha19yZWZlcmVuY2UsIDApOworICB9CisgIGNvbnN0IGZsYXRidWZmZXJzOjpWZWN0b3I8dWludDY0X3Q+ICp2ZWN0b3Jfb2Zfd2Vha19yZWZlcmVuY2VzKCkgY29uc3QgeworICAgIHJldHVybiBHZXRQb2ludGVyPGNvbnN0IGZsYXRidWZmZXJzOjpWZWN0b3I8dWludDY0X3Q+ICo+KFZUX1ZFQ1RPUl9PRl9XRUFLX1JFRkVSRU5DRVMpOworICB9CisgIGZsYXRidWZmZXJzOjpWZWN0b3I8dWludDY0X3Q+ICptdXRhYmxlX3ZlY3Rvcl9vZl93ZWFrX3JlZmVyZW5jZXMoKSB7CisgICAgcmV0dXJuIEdldFBvaW50ZXI8ZmxhdGJ1ZmZlcnM6OlZlY3Rvcjx1aW50NjRfdD4gKj4oVlRfVkVDVE9SX09GX1dFQUtfUkVGRVJFTkNFUyk7CisgIH0KKyAgY29uc3QgZmxhdGJ1ZmZlcnM6OlZlY3RvcjxmbGF0YnVmZmVyczo6T2Zmc2V0PE15R2FtZTo6RXhhbXBsZTo6UmVmZXJyYWJsZT4+ICp2ZWN0b3Jfb2Zfc3Ryb25nX3JlZmVycmFibGVzKCkgY29uc3QgeworICAgIHJldHVybiBHZXRQb2ludGVyPGNvbnN0IGZsYXRidWZmZXJzOjpWZWN0b3I8ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxNeUdhbWU6OkV4YW1wbGU6OlJlZmVycmFibGU+PiAqPihWVF9WRUNUT1JfT0ZfU1RST05HX1JFRkVSUkFCTEVTKTsKKyAgfQorICBmbGF0YnVmZmVyczo6VmVjdG9yPGZsYXRidWZmZXJzOjpPZmZzZXQ8TXlHYW1lOjpFeGFtcGxlOjpSZWZlcnJhYmxlPj4gKm11dGFibGVfdmVjdG9yX29mX3N0cm9uZ19yZWZlcnJhYmxlcygpIHsKKyAgICByZXR1cm4gR2V0UG9pbnRlcjxmbGF0YnVmZmVyczo6VmVjdG9yPGZsYXRidWZmZXJzOjpPZmZzZXQ8TXlHYW1lOjpFeGFtcGxlOjpSZWZlcnJhYmxlPj4gKj4oVlRfVkVDVE9SX09GX1NUUk9OR19SRUZFUlJBQkxFUyk7CisgIH0KKyAgdWludDY0X3QgY29fb3duaW5nX3JlZmVyZW5jZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gR2V0RmllbGQ8dWludDY0X3Q+KFZUX0NPX09XTklOR19SRUZFUkVOQ0UsIDApOworICB9CisgIGJvb2wgbXV0YXRlX2NvX293bmluZ19yZWZlcmVuY2UodWludDY0X3QgX2NvX293bmluZ19yZWZlcmVuY2UgPSAwKSB7CisgICAgcmV0dXJuIFNldEZpZWxkPHVpbnQ2NF90PihWVF9DT19PV05JTkdfUkVGRVJFTkNFLCBfY29fb3duaW5nX3JlZmVyZW5jZSwgMCk7CisgIH0KKyAgY29uc3QgZmxhdGJ1ZmZlcnM6OlZlY3Rvcjx1aW50NjRfdD4gKnZlY3Rvcl9vZl9jb19vd25pbmdfcmVmZXJlbmNlcygpIGNvbnN0IHsKKyAgICByZXR1cm4gR2V0UG9pbnRlcjxjb25zdCBmbGF0YnVmZmVyczo6VmVjdG9yPHVpbnQ2NF90PiAqPihWVF9WRUNUT1JfT0ZfQ09fT1dOSU5HX1JFRkVSRU5DRVMpOworICB9CisgIGZsYXRidWZmZXJzOjpWZWN0b3I8dWludDY0X3Q+ICptdXRhYmxlX3ZlY3Rvcl9vZl9jb19vd25pbmdfcmVmZXJlbmNlcygpIHsKKyAgICByZXR1cm4gR2V0UG9pbnRlcjxmbGF0YnVmZmVyczo6VmVjdG9yPHVpbnQ2NF90PiAqPihWVF9WRUNUT1JfT0ZfQ09fT1dOSU5HX1JFRkVSRU5DRVMpOworICB9CisgIHVpbnQ2NF90IG5vbl9vd25pbmdfcmVmZXJlbmNlKCkgY29uc3QgeworICAgIHJldHVybiBHZXRGaWVsZDx1aW50NjRfdD4oVlRfTk9OX09XTklOR19SRUZFUkVOQ0UsIDApOworICB9CisgIGJvb2wgbXV0YXRlX25vbl9vd25pbmdfcmVmZXJlbmNlKHVpbnQ2NF90IF9ub25fb3duaW5nX3JlZmVyZW5jZSA9IDApIHsKKyAgICByZXR1cm4gU2V0RmllbGQ8dWludDY0X3Q+KFZUX05PTl9PV05JTkdfUkVGRVJFTkNFLCBfbm9uX293bmluZ19yZWZlcmVuY2UsIDApOworICB9CisgIGNvbnN0IGZsYXRidWZmZXJzOjpWZWN0b3I8dWludDY0X3Q+ICp2ZWN0b3Jfb2Zfbm9uX293bmluZ19yZWZlcmVuY2VzKCkgY29uc3QgeworICAgIHJldHVybiBHZXRQb2ludGVyPGNvbnN0IGZsYXRidWZmZXJzOjpWZWN0b3I8dWludDY0X3Q+ICo+KFZUX1ZFQ1RPUl9PRl9OT05fT1dOSU5HX1JFRkVSRU5DRVMpOworICB9CisgIGZsYXRidWZmZXJzOjpWZWN0b3I8dWludDY0X3Q+ICptdXRhYmxlX3ZlY3Rvcl9vZl9ub25fb3duaW5nX3JlZmVyZW5jZXMoKSB7CisgICAgcmV0dXJuIEdldFBvaW50ZXI8ZmxhdGJ1ZmZlcnM6OlZlY3Rvcjx1aW50NjRfdD4gKj4oVlRfVkVDVE9SX09GX05PTl9PV05JTkdfUkVGRVJFTkNFUyk7CisgIH0KKyAgTXlHYW1lOjpFeGFtcGxlOjpBbnlVbmlxdWVBbGlhc2VzIGFueV91bmlxdWVfdHlwZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8TXlHYW1lOjpFeGFtcGxlOjpBbnlVbmlxdWVBbGlhc2VzPihHZXRGaWVsZDx1aW50OF90PihWVF9BTllfVU5JUVVFX1RZUEUsIDApKTsKKyAgfQorICBjb25zdCB2b2lkICphbnlfdW5pcXVlKCkgY29uc3QgeworICAgIHJldHVybiBHZXRQb2ludGVyPGNvbnN0IHZvaWQgKj4oVlRfQU5ZX1VOSVFVRSk7CisgIH0KKyAgdGVtcGxhdGU8dHlwZW5hbWUgVD4gY29uc3QgVCAqYW55X3VuaXF1ZV9hcygpIGNvbnN0OworICBjb25zdCBNeUdhbWU6OkV4YW1wbGU6Ok1vbnN0ZXIgKmFueV91bmlxdWVfYXNfTSgpIGNvbnN0IHsKKyAgICByZXR1cm4gYW55X3VuaXF1ZV90eXBlKCkgPT0gTXlHYW1lOjpFeGFtcGxlOjpBbnlVbmlxdWVBbGlhc2VzX00gPyBzdGF0aWNfY2FzdDxjb25zdCBNeUdhbWU6OkV4YW1wbGU6Ok1vbnN0ZXIgKj4oYW55X3VuaXF1ZSgpKSA6IG51bGxwdHI7CisgIH0KKyAgY29uc3QgTXlHYW1lOjpFeGFtcGxlOjpUZXN0U2ltcGxlVGFibGVXaXRoRW51bSAqYW55X3VuaXF1ZV9hc19UUygpIGNvbnN0IHsKKyAgICByZXR1cm4gYW55X3VuaXF1ZV90eXBlKCkgPT0gTXlHYW1lOjpFeGFtcGxlOjpBbnlVbmlxdWVBbGlhc2VzX1RTID8gc3RhdGljX2Nhc3Q8Y29uc3QgTXlHYW1lOjpFeGFtcGxlOjpUZXN0U2ltcGxlVGFibGVXaXRoRW51bSAqPihhbnlfdW5pcXVlKCkpIDogbnVsbHB0cjsKKyAgfQorICBjb25zdCBNeUdhbWU6OkV4YW1wbGUyOjpNb25zdGVyICphbnlfdW5pcXVlX2FzX00yKCkgY29uc3QgeworICAgIHJldHVybiBhbnlfdW5pcXVlX3R5cGUoKSA9PSBNeUdhbWU6OkV4YW1wbGU6OkFueVVuaXF1ZUFsaWFzZXNfTTIgPyBzdGF0aWNfY2FzdDxjb25zdCBNeUdhbWU6OkV4YW1wbGUyOjpNb25zdGVyICo+KGFueV91bmlxdWUoKSkgOiBudWxscHRyOworICB9CisgIHZvaWQgKm11dGFibGVfYW55X3VuaXF1ZSgpIHsKKyAgICByZXR1cm4gR2V0UG9pbnRlcjx2b2lkICo+KFZUX0FOWV9VTklRVUUpOworICB9CisgIE15R2FtZTo6RXhhbXBsZTo6QW55QW1iaWd1b3VzQWxpYXNlcyBhbnlfYW1iaWd1b3VzX3R5cGUoKSBjb25zdCB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PE15R2FtZTo6RXhhbXBsZTo6QW55QW1iaWd1b3VzQWxpYXNlcz4oR2V0RmllbGQ8dWludDhfdD4oVlRfQU5ZX0FNQklHVU9VU19UWVBFLCAwKSk7CisgIH0KKyAgY29uc3Qgdm9pZCAqYW55X2FtYmlndW91cygpIGNvbnN0IHsKKyAgICByZXR1cm4gR2V0UG9pbnRlcjxjb25zdCB2b2lkICo+KFZUX0FOWV9BTUJJR1VPVVMpOworICB9CisgIGNvbnN0IE15R2FtZTo6RXhhbXBsZTo6TW9uc3RlciAqYW55X2FtYmlndW91c19hc19NMSgpIGNvbnN0IHsKKyAgICByZXR1cm4gYW55X2FtYmlndW91c190eXBlKCkgPT0gTXlHYW1lOjpFeGFtcGxlOjpBbnlBbWJpZ3VvdXNBbGlhc2VzX00xID8gc3RhdGljX2Nhc3Q8Y29uc3QgTXlHYW1lOjpFeGFtcGxlOjpNb25zdGVyICo+KGFueV9hbWJpZ3VvdXMoKSkgOiBudWxscHRyOworICB9CisgIGNvbnN0IE15R2FtZTo6RXhhbXBsZTo6TW9uc3RlciAqYW55X2FtYmlndW91c19hc19NMigpIGNvbnN0IHsKKyAgICByZXR1cm4gYW55X2FtYmlndW91c190eXBlKCkgPT0gTXlHYW1lOjpFeGFtcGxlOjpBbnlBbWJpZ3VvdXNBbGlhc2VzX00yID8gc3RhdGljX2Nhc3Q8Y29uc3QgTXlHYW1lOjpFeGFtcGxlOjpNb25zdGVyICo+KGFueV9hbWJpZ3VvdXMoKSkgOiBudWxscHRyOworICB9CisgIGNvbnN0IE15R2FtZTo6RXhhbXBsZTo6TW9uc3RlciAqYW55X2FtYmlndW91c19hc19NMygpIGNvbnN0IHsKKyAgICByZXR1cm4gYW55X2FtYmlndW91c190eXBlKCkgPT0gTXlHYW1lOjpFeGFtcGxlOjpBbnlBbWJpZ3VvdXNBbGlhc2VzX00zID8gc3RhdGljX2Nhc3Q8Y29uc3QgTXlHYW1lOjpFeGFtcGxlOjpNb25zdGVyICo+KGFueV9hbWJpZ3VvdXMoKSkgOiBudWxscHRyOworICB9CisgIHZvaWQgKm11dGFibGVfYW55X2FtYmlndW91cygpIHsKKyAgICByZXR1cm4gR2V0UG9pbnRlcjx2b2lkICo+KFZUX0FOWV9BTUJJR1VPVVMpOworICB9CisgIGNvbnN0IGZsYXRidWZmZXJzOjpWZWN0b3I8dWludDhfdD4gKnZlY3Rvcl9vZl9lbnVtcygpIGNvbnN0IHsKKyAgICByZXR1cm4gR2V0UG9pbnRlcjxjb25zdCBmbGF0YnVmZmVyczo6VmVjdG9yPHVpbnQ4X3Q+ICo+KFZUX1ZFQ1RPUl9PRl9FTlVNUyk7CisgIH0KKyAgZmxhdGJ1ZmZlcnM6OlZlY3Rvcjx1aW50OF90PiAqbXV0YWJsZV92ZWN0b3Jfb2ZfZW51bXMoKSB7CisgICAgcmV0dXJuIEdldFBvaW50ZXI8ZmxhdGJ1ZmZlcnM6OlZlY3Rvcjx1aW50OF90PiAqPihWVF9WRUNUT1JfT0ZfRU5VTVMpOworICB9CisgIE15R2FtZTo6RXhhbXBsZTo6UmFjZSBzaWduZWRfZW51bSgpIGNvbnN0IHsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8TXlHYW1lOjpFeGFtcGxlOjpSYWNlPihHZXRGaWVsZDxpbnQ4X3Q+KFZUX1NJR05FRF9FTlVNLCAtMSkpOworICB9CisgIGJvb2wgbXV0YXRlX3NpZ25lZF9lbnVtKE15R2FtZTo6RXhhbXBsZTo6UmFjZSBfc2lnbmVkX2VudW0gPSBzdGF0aWNfY2FzdDxNeUdhbWU6OkV4YW1wbGU6OlJhY2U+KC0xKSkgeworICAgIHJldHVybiBTZXRGaWVsZDxpbnQ4X3Q+KFZUX1NJR05FRF9FTlVNLCBzdGF0aWNfY2FzdDxpbnQ4X3Q+KF9zaWduZWRfZW51bSksIC0xKTsKKyAgfQorICBjb25zdCBmbGF0YnVmZmVyczo6VmVjdG9yPHVpbnQ4X3Q+ICp0ZXN0cmVxdWlyZWRuZXN0ZWRmbGF0YnVmZmVyKCkgY29uc3QgeworICAgIHJldHVybiBHZXRQb2ludGVyPGNvbnN0IGZsYXRidWZmZXJzOjpWZWN0b3I8dWludDhfdD4gKj4oVlRfVEVTVFJFUVVJUkVETkVTVEVERkxBVEJVRkZFUik7CisgIH0KKyAgZmxhdGJ1ZmZlcnM6OlZlY3Rvcjx1aW50OF90PiAqbXV0YWJsZV90ZXN0cmVxdWlyZWRuZXN0ZWRmbGF0YnVmZmVyKCkgeworICAgIHJldHVybiBHZXRQb2ludGVyPGZsYXRidWZmZXJzOjpWZWN0b3I8dWludDhfdD4gKj4oVlRfVEVTVFJFUVVJUkVETkVTVEVERkxBVEJVRkZFUik7CisgIH0KKyAgY29uc3QgTXlHYW1lOjpFeGFtcGxlOjpNb25zdGVyICp0ZXN0cmVxdWlyZWRuZXN0ZWRmbGF0YnVmZmVyX25lc3RlZF9yb290KCkgY29uc3QgeworICAgIHJldHVybiBmbGF0YnVmZmVyczo6R2V0Um9vdDxNeUdhbWU6OkV4YW1wbGU6Ok1vbnN0ZXI+KHRlc3RyZXF1aXJlZG5lc3RlZGZsYXRidWZmZXIoKS0+RGF0YSgpKTsKKyAgfQorICBjb25zdCBmbGF0YnVmZmVyczo6VmVjdG9yPGZsYXRidWZmZXJzOjpPZmZzZXQ8TXlHYW1lOjpFeGFtcGxlOjpTdGF0Pj4gKnNjYWxhcl9rZXlfc29ydGVkX3RhYmxlcygpIGNvbnN0IHsKKyAgICByZXR1cm4gR2V0UG9pbnRlcjxjb25zdCBmbGF0YnVmZmVyczo6VmVjdG9yPGZsYXRidWZmZXJzOjpPZmZzZXQ8TXlHYW1lOjpFeGFtcGxlOjpTdGF0Pj4gKj4oVlRfU0NBTEFSX0tFWV9TT1JURURfVEFCTEVTKTsKKyAgfQorICBmbGF0YnVmZmVyczo6VmVjdG9yPGZsYXRidWZmZXJzOjpPZmZzZXQ8TXlHYW1lOjpFeGFtcGxlOjpTdGF0Pj4gKm11dGFibGVfc2NhbGFyX2tleV9zb3J0ZWRfdGFibGVzKCkgeworICAgIHJldHVybiBHZXRQb2ludGVyPGZsYXRidWZmZXJzOjpWZWN0b3I8ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxNeUdhbWU6OkV4YW1wbGU6OlN0YXQ+PiAqPihWVF9TQ0FMQVJfS0VZX1NPUlRFRF9UQUJMRVMpOworICB9CisgIGNvbnN0IE15R2FtZTo6RXhhbXBsZTo6VGVzdCAqbmF0aXZlX2lubGluZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gR2V0U3RydWN0PGNvbnN0IE15R2FtZTo6RXhhbXBsZTo6VGVzdCAqPihWVF9OQVRJVkVfSU5MSU5FKTsKKyAgfQorICBNeUdhbWU6OkV4YW1wbGU6OlRlc3QgKm11dGFibGVfbmF0aXZlX2lubGluZSgpIHsKKyAgICByZXR1cm4gR2V0U3RydWN0PE15R2FtZTo6RXhhbXBsZTo6VGVzdCAqPihWVF9OQVRJVkVfSU5MSU5FKTsKKyAgfQorICBNeUdhbWU6OkV4YW1wbGU6OkxvbmdFbnVtIGxvbmdfZW51bV9ub25fZW51bV9kZWZhdWx0KCkgY29uc3QgeworICAgIHJldHVybiBzdGF0aWNfY2FzdDxNeUdhbWU6OkV4YW1wbGU6OkxvbmdFbnVtPihHZXRGaWVsZDx1aW50NjRfdD4oVlRfTE9OR19FTlVNX05PTl9FTlVNX0RFRkFVTFQsIDApKTsKKyAgfQorICBib29sIG11dGF0ZV9sb25nX2VudW1fbm9uX2VudW1fZGVmYXVsdChNeUdhbWU6OkV4YW1wbGU6OkxvbmdFbnVtIF9sb25nX2VudW1fbm9uX2VudW1fZGVmYXVsdCA9IHN0YXRpY19jYXN0PE15R2FtZTo6RXhhbXBsZTo6TG9uZ0VudW0+KDApKSB7CisgICAgcmV0dXJuIFNldEZpZWxkPHVpbnQ2NF90PihWVF9MT05HX0VOVU1fTk9OX0VOVU1fREVGQVVMVCwgc3RhdGljX2Nhc3Q8dWludDY0X3Q+KF9sb25nX2VudW1fbm9uX2VudW1fZGVmYXVsdCksIDApOworICB9CisgIE15R2FtZTo6RXhhbXBsZTo6TG9uZ0VudW0gbG9uZ19lbnVtX25vcm1hbF9kZWZhdWx0KCkgY29uc3QgeworICAgIHJldHVybiBzdGF0aWNfY2FzdDxNeUdhbWU6OkV4YW1wbGU6OkxvbmdFbnVtPihHZXRGaWVsZDx1aW50NjRfdD4oVlRfTE9OR19FTlVNX05PUk1BTF9ERUZBVUxULCAyVUxMKSk7CisgIH0KKyAgYm9vbCBtdXRhdGVfbG9uZ19lbnVtX25vcm1hbF9kZWZhdWx0KE15R2FtZTo6RXhhbXBsZTo6TG9uZ0VudW0gX2xvbmdfZW51bV9ub3JtYWxfZGVmYXVsdCA9IHN0YXRpY19jYXN0PE15R2FtZTo6RXhhbXBsZTo6TG9uZ0VudW0+KDJVTEwpKSB7CisgICAgcmV0dXJuIFNldEZpZWxkPHVpbnQ2NF90PihWVF9MT05HX0VOVU1fTk9STUFMX0RFRkFVTFQsIHN0YXRpY19jYXN0PHVpbnQ2NF90PihfbG9uZ19lbnVtX25vcm1hbF9kZWZhdWx0KSwgMlVMTCk7CisgIH0KKyAgYm9vbCBWZXJpZnkoZmxhdGJ1ZmZlcnM6OlZlcmlmaWVyICZ2ZXJpZmllcikgY29uc3QgeworICAgIHJldHVybiBWZXJpZnlUYWJsZVN0YXJ0KHZlcmlmaWVyKSAmJgorICAgICAgICAgICBWZXJpZnlGaWVsZDxNeUdhbWU6OkV4YW1wbGU6OlZlYzM+KHZlcmlmaWVyLCBWVF9QT1MsIDgpICYmCisgICAgICAgICAgIFZlcmlmeUZpZWxkPGludDE2X3Q+KHZlcmlmaWVyLCBWVF9NQU5BLCAyKSAmJgorICAgICAgICAgICBWZXJpZnlGaWVsZDxpbnQxNl90Pih2ZXJpZmllciwgVlRfSFAsIDIpICYmCisgICAgICAgICAgIFZlcmlmeU9mZnNldFJlcXVpcmVkKHZlcmlmaWVyLCBWVF9OQU1FKSAmJgorICAgICAgICAgICB2ZXJpZmllci5WZXJpZnlTdHJpbmcobmFtZSgpKSAmJgorICAgICAgICAgICBWZXJpZnlPZmZzZXQodmVyaWZpZXIsIFZUX0lOVkVOVE9SWSkgJiYKKyAgICAgICAgICAgdmVyaWZpZXIuVmVyaWZ5VmVjdG9yKGludmVudG9yeSgpKSAmJgorICAgICAgICAgICBWZXJpZnlGaWVsZDx1aW50OF90Pih2ZXJpZmllciwgVlRfQ09MT1IsIDEpICYmCisgICAgICAgICAgIFZlcmlmeUZpZWxkPHVpbnQ4X3Q+KHZlcmlmaWVyLCBWVF9URVNUX1RZUEUsIDEpICYmCisgICAgICAgICAgIFZlcmlmeU9mZnNldCh2ZXJpZmllciwgVlRfVEVTVCkgJiYKKyAgICAgICAgICAgVmVyaWZ5QW55KHZlcmlmaWVyLCB0ZXN0KCksIHRlc3RfdHlwZSgpKSAmJgorICAgICAgICAgICBWZXJpZnlPZmZzZXQodmVyaWZpZXIsIFZUX1RFU1Q0KSAmJgorICAgICAgICAgICB2ZXJpZmllci5WZXJpZnlWZWN0b3IodGVzdDQoKSkgJiYKKyAgICAgICAgICAgVmVyaWZ5T2Zmc2V0KHZlcmlmaWVyLCBWVF9URVNUQVJSQVlPRlNUUklORykgJiYKKyAgICAgICAgICAgdmVyaWZpZXIuVmVyaWZ5VmVjdG9yKHRlc3RhcnJheW9mc3RyaW5nKCkpICYmCisgICAgICAgICAgIHZlcmlmaWVyLlZlcmlmeVZlY3Rvck9mU3RyaW5ncyh0ZXN0YXJyYXlvZnN0cmluZygpKSAmJgorICAgICAgICAgICBWZXJpZnlPZmZzZXQodmVyaWZpZXIsIFZUX1RFU1RBUlJBWU9GVEFCTEVTKSAmJgorICAgICAgICAgICB2ZXJpZmllci5WZXJpZnlWZWN0b3IodGVzdGFycmF5b2Z0YWJsZXMoKSkgJiYKKyAgICAgICAgICAgdmVyaWZpZXIuVmVyaWZ5VmVjdG9yT2ZUYWJsZXModGVzdGFycmF5b2Z0YWJsZXMoKSkgJiYKKyAgICAgICAgICAgVmVyaWZ5T2Zmc2V0KHZlcmlmaWVyLCBWVF9FTkVNWSkgJiYKKyAgICAgICAgICAgdmVyaWZpZXIuVmVyaWZ5VGFibGUoZW5lbXkoKSkgJiYKKyAgICAgICAgICAgVmVyaWZ5T2Zmc2V0KHZlcmlmaWVyLCBWVF9URVNUTkVTVEVERkxBVEJVRkZFUikgJiYKKyAgICAgICAgICAgdmVyaWZpZXIuVmVyaWZ5VmVjdG9yKHRlc3RuZXN0ZWRmbGF0YnVmZmVyKCkpICYmCisgICAgICAgICAgIHZlcmlmaWVyLlZlcmlmeU5lc3RlZEZsYXRCdWZmZXI8TXlHYW1lOjpFeGFtcGxlOjpNb25zdGVyPih0ZXN0bmVzdGVkZmxhdGJ1ZmZlcigpLCBudWxscHRyKSAmJgorICAgICAgICAgICBWZXJpZnlPZmZzZXQodmVyaWZpZXIsIFZUX1RFU1RFTVBUWSkgJiYKKyAgICAgICAgICAgdmVyaWZpZXIuVmVyaWZ5VGFibGUodGVzdGVtcHR5KCkpICYmCisgICAgICAgICAgIFZlcmlmeUZpZWxkPHVpbnQ4X3Q+KHZlcmlmaWVyLCBWVF9URVNUQk9PTCwgMSkgJiYKKyAgICAgICAgICAgVmVyaWZ5RmllbGQ8aW50MzJfdD4odmVyaWZpZXIsIFZUX1RFU1RIQVNIUzMyX0ZOVjEsIDQpICYmCisgICAgICAgICAgIFZlcmlmeUZpZWxkPHVpbnQzMl90Pih2ZXJpZmllciwgVlRfVEVTVEhBU0hVMzJfRk5WMSwgNCkgJiYKKyAgICAgICAgICAgVmVyaWZ5RmllbGQ8aW50NjRfdD4odmVyaWZpZXIsIFZUX1RFU1RIQVNIUzY0X0ZOVjEsIDgpICYmCisgICAgICAgICAgIFZlcmlmeUZpZWxkPHVpbnQ2NF90Pih2ZXJpZmllciwgVlRfVEVTVEhBU0hVNjRfRk5WMSwgOCkgJiYKKyAgICAgICAgICAgVmVyaWZ5RmllbGQ8aW50MzJfdD4odmVyaWZpZXIsIFZUX1RFU1RIQVNIUzMyX0ZOVjFBLCA0KSAmJgorICAgICAgICAgICBWZXJpZnlGaWVsZDx1aW50MzJfdD4odmVyaWZpZXIsIFZUX1RFU1RIQVNIVTMyX0ZOVjFBLCA0KSAmJgorICAgICAgICAgICBWZXJpZnlGaWVsZDxpbnQ2NF90Pih2ZXJpZmllciwgVlRfVEVTVEhBU0hTNjRfRk5WMUEsIDgpICYmCisgICAgICAgICAgIFZlcmlmeUZpZWxkPHVpbnQ2NF90Pih2ZXJpZmllciwgVlRfVEVTVEhBU0hVNjRfRk5WMUEsIDgpICYmCisgICAgICAgICAgIFZlcmlmeU9mZnNldCh2ZXJpZmllciwgVlRfVEVTVEFSUkFZT0ZCT09MUykgJiYKKyAgICAgICAgICAgdmVyaWZpZXIuVmVyaWZ5VmVjdG9yKHRlc3RhcnJheW9mYm9vbHMoKSkgJiYKKyAgICAgICAgICAgVmVyaWZ5RmllbGQ8ZmxvYXQ+KHZlcmlmaWVyLCBWVF9URVNURiwgNCkgJiYKKyAgICAgICAgICAgVmVyaWZ5RmllbGQ8ZmxvYXQ+KHZlcmlmaWVyLCBWVF9URVNURjIsIDQpICYmCisgICAgICAgICAgIFZlcmlmeUZpZWxkPGZsb2F0Pih2ZXJpZmllciwgVlRfVEVTVEYzLCA0KSAmJgorICAgICAgICAgICBWZXJpZnlPZmZzZXQodmVyaWZpZXIsIFZUX1RFU1RBUlJBWU9GU1RSSU5HMikgJiYKKyAgICAgICAgICAgdmVyaWZpZXIuVmVyaWZ5VmVjdG9yKHRlc3RhcnJheW9mc3RyaW5nMigpKSAmJgorICAgICAgICAgICB2ZXJpZmllci5WZXJpZnlWZWN0b3JPZlN0cmluZ3ModGVzdGFycmF5b2ZzdHJpbmcyKCkpICYmCisgICAgICAgICAgIFZlcmlmeU9mZnNldCh2ZXJpZmllciwgVlRfVEVTVEFSUkFZT0ZTT1JURURTVFJVQ1QpICYmCisgICAgICAgICAgIHZlcmlmaWVyLlZlcmlmeVZlY3Rvcih0ZXN0YXJyYXlvZnNvcnRlZHN0cnVjdCgpKSAmJgorICAgICAgICAgICBWZXJpZnlPZmZzZXQodmVyaWZpZXIsIFZUX0ZMRVgpICYmCisgICAgICAgICAgIHZlcmlmaWVyLlZlcmlmeVZlY3RvcihmbGV4KCkpICYmCisgICAgICAgICAgIGZsZXhidWZmZXJzOjpWZXJpZnlOZXN0ZWRGbGV4QnVmZmVyKGZsZXgoKSwgdmVyaWZpZXIpICYmCisgICAgICAgICAgIFZlcmlmeU9mZnNldCh2ZXJpZmllciwgVlRfVEVTVDUpICYmCisgICAgICAgICAgIHZlcmlmaWVyLlZlcmlmeVZlY3Rvcih0ZXN0NSgpKSAmJgorICAgICAgICAgICBWZXJpZnlPZmZzZXQodmVyaWZpZXIsIFZUX1ZFQ1RPUl9PRl9MT05HUykgJiYKKyAgICAgICAgICAgdmVyaWZpZXIuVmVyaWZ5VmVjdG9yKHZlY3Rvcl9vZl9sb25ncygpKSAmJgorICAgICAgICAgICBWZXJpZnlPZmZzZXQodmVyaWZpZXIsIFZUX1ZFQ1RPUl9PRl9ET1VCTEVTKSAmJgorICAgICAgICAgICB2ZXJpZmllci5WZXJpZnlWZWN0b3IodmVjdG9yX29mX2RvdWJsZXMoKSkgJiYKKyAgICAgICAgICAgVmVyaWZ5T2Zmc2V0KHZlcmlmaWVyLCBWVF9QQVJFTlRfTkFNRVNQQUNFX1RFU1QpICYmCisgICAgICAgICAgIHZlcmlmaWVyLlZlcmlmeVRhYmxlKHBhcmVudF9uYW1lc3BhY2VfdGVzdCgpKSAmJgorICAgICAgICAgICBWZXJpZnlPZmZzZXQodmVyaWZpZXIsIFZUX1ZFQ1RPUl9PRl9SRUZFUlJBQkxFUykgJiYKKyAgICAgICAgICAgdmVyaWZpZXIuVmVyaWZ5VmVjdG9yKHZlY3Rvcl9vZl9yZWZlcnJhYmxlcygpKSAmJgorICAgICAgICAgICB2ZXJpZmllci5WZXJpZnlWZWN0b3JPZlRhYmxlcyh2ZWN0b3Jfb2ZfcmVmZXJyYWJsZXMoKSkgJiYKKyAgICAgICAgICAgVmVyaWZ5RmllbGQ8dWludDY0X3Q+KHZlcmlmaWVyLCBWVF9TSU5HTEVfV0VBS19SRUZFUkVOQ0UsIDgpICYmCisgICAgICAgICAgIFZlcmlmeU9mZnNldCh2ZXJpZmllciwgVlRfVkVDVE9SX09GX1dFQUtfUkVGRVJFTkNFUykgJiYKKyAgICAgICAgICAgdmVyaWZpZXIuVmVyaWZ5VmVjdG9yKHZlY3Rvcl9vZl93ZWFrX3JlZmVyZW5jZXMoKSkgJiYKKyAgICAgICAgICAgVmVyaWZ5T2Zmc2V0KHZlcmlmaWVyLCBWVF9WRUNUT1JfT0ZfU1RST05HX1JFRkVSUkFCTEVTKSAmJgorICAgICAgICAgICB2ZXJpZmllci5WZXJpZnlWZWN0b3IodmVjdG9yX29mX3N0cm9uZ19yZWZlcnJhYmxlcygpKSAmJgorICAgICAgICAgICB2ZXJpZmllci5WZXJpZnlWZWN0b3JPZlRhYmxlcyh2ZWN0b3Jfb2Zfc3Ryb25nX3JlZmVycmFibGVzKCkpICYmCisgICAgICAgICAgIFZlcmlmeUZpZWxkPHVpbnQ2NF90Pih2ZXJpZmllciwgVlRfQ09fT1dOSU5HX1JFRkVSRU5DRSwgOCkgJiYKKyAgICAgICAgICAgVmVyaWZ5T2Zmc2V0KHZlcmlmaWVyLCBWVF9WRUNUT1JfT0ZfQ09fT1dOSU5HX1JFRkVSRU5DRVMpICYmCisgICAgICAgICAgIHZlcmlmaWVyLlZlcmlmeVZlY3Rvcih2ZWN0b3Jfb2ZfY29fb3duaW5nX3JlZmVyZW5jZXMoKSkgJiYKKyAgICAgICAgICAgVmVyaWZ5RmllbGQ8dWludDY0X3Q+KHZlcmlmaWVyLCBWVF9OT05fT1dOSU5HX1JFRkVSRU5DRSwgOCkgJiYKKyAgICAgICAgICAgVmVyaWZ5T2Zmc2V0KHZlcmlmaWVyLCBWVF9WRUNUT1JfT0ZfTk9OX09XTklOR19SRUZFUkVOQ0VTKSAmJgorICAgICAgICAgICB2ZXJpZmllci5WZXJpZnlWZWN0b3IodmVjdG9yX29mX25vbl9vd25pbmdfcmVmZXJlbmNlcygpKSAmJgorICAgICAgICAgICBWZXJpZnlGaWVsZDx1aW50OF90Pih2ZXJpZmllciwgVlRfQU5ZX1VOSVFVRV9UWVBFLCAxKSAmJgorICAgICAgICAgICBWZXJpZnlPZmZzZXQodmVyaWZpZXIsIFZUX0FOWV9VTklRVUUpICYmCisgICAgICAgICAgIFZlcmlmeUFueVVuaXF1ZUFsaWFzZXModmVyaWZpZXIsIGFueV91bmlxdWUoKSwgYW55X3VuaXF1ZV90eXBlKCkpICYmCisgICAgICAgICAgIFZlcmlmeUZpZWxkPHVpbnQ4X3Q+KHZlcmlmaWVyLCBWVF9BTllfQU1CSUdVT1VTX1RZUEUsIDEpICYmCisgICAgICAgICAgIFZlcmlmeU9mZnNldCh2ZXJpZmllciwgVlRfQU5ZX0FNQklHVU9VUykgJiYKKyAgICAgICAgICAgVmVyaWZ5QW55QW1iaWd1b3VzQWxpYXNlcyh2ZXJpZmllciwgYW55X2FtYmlndW91cygpLCBhbnlfYW1iaWd1b3VzX3R5cGUoKSkgJiYKKyAgICAgICAgICAgVmVyaWZ5T2Zmc2V0KHZlcmlmaWVyLCBWVF9WRUNUT1JfT0ZfRU5VTVMpICYmCisgICAgICAgICAgIHZlcmlmaWVyLlZlcmlmeVZlY3Rvcih2ZWN0b3Jfb2ZfZW51bXMoKSkgJiYKKyAgICAgICAgICAgVmVyaWZ5RmllbGQ8aW50OF90Pih2ZXJpZmllciwgVlRfU0lHTkVEX0VOVU0sIDEpICYmCisgICAgICAgICAgIFZlcmlmeU9mZnNldCh2ZXJpZmllciwgVlRfVEVTVFJFUVVJUkVETkVTVEVERkxBVEJVRkZFUikgJiYKKyAgICAgICAgICAgdmVyaWZpZXIuVmVyaWZ5VmVjdG9yKHRlc3RyZXF1aXJlZG5lc3RlZGZsYXRidWZmZXIoKSkgJiYKKyAgICAgICAgICAgdmVyaWZpZXIuVmVyaWZ5TmVzdGVkRmxhdEJ1ZmZlcjxNeUdhbWU6OkV4YW1wbGU6Ok1vbnN0ZXI+KHRlc3RyZXF1aXJlZG5lc3RlZGZsYXRidWZmZXIoKSwgbnVsbHB0cikgJiYKKyAgICAgICAgICAgVmVyaWZ5T2Zmc2V0KHZlcmlmaWVyLCBWVF9TQ0FMQVJfS0VZX1NPUlRFRF9UQUJMRVMpICYmCisgICAgICAgICAgIHZlcmlmaWVyLlZlcmlmeVZlY3RvcihzY2FsYXJfa2V5X3NvcnRlZF90YWJsZXMoKSkgJiYKKyAgICAgICAgICAgdmVyaWZpZXIuVmVyaWZ5VmVjdG9yT2ZUYWJsZXMoc2NhbGFyX2tleV9zb3J0ZWRfdGFibGVzKCkpICYmCisgICAgICAgICAgIFZlcmlmeUZpZWxkPE15R2FtZTo6RXhhbXBsZTo6VGVzdD4odmVyaWZpZXIsIFZUX05BVElWRV9JTkxJTkUsIDIpICYmCisgICAgICAgICAgIFZlcmlmeUZpZWxkPHVpbnQ2NF90Pih2ZXJpZmllciwgVlRfTE9OR19FTlVNX05PTl9FTlVNX0RFRkFVTFQsIDgpICYmCisgICAgICAgICAgIFZlcmlmeUZpZWxkPHVpbnQ2NF90Pih2ZXJpZmllciwgVlRfTE9OR19FTlVNX05PUk1BTF9ERUZBVUxULCA4KSAmJgorICAgICAgICAgICB2ZXJpZmllci5FbmRUYWJsZSgpOworICB9CisgIE1vbnN0ZXJUICpVblBhY2soY29uc3QgZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlciA9IG51bGxwdHIpIGNvbnN0OworICB2b2lkIFVuUGFja1RvKE1vbnN0ZXJUICpfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlciA9IG51bGxwdHIpIGNvbnN0OworICBzdGF0aWMgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxNb25zdGVyPiBQYWNrKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgTW9uc3RlclQqIF9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyID0gbnVsbHB0cik7Cit9OworCit0ZW1wbGF0ZTw+IGlubGluZSBjb25zdCBNeUdhbWU6OkV4YW1wbGU6Ok1vbnN0ZXIgKk1vbnN0ZXI6OnRlc3RfYXM8TXlHYW1lOjpFeGFtcGxlOjpNb25zdGVyPigpIGNvbnN0IHsKKyAgcmV0dXJuIHRlc3RfYXNfTW9uc3RlcigpOworfQorCit0ZW1wbGF0ZTw+IGlubGluZSBjb25zdCBNeUdhbWU6OkV4YW1wbGU6OlRlc3RTaW1wbGVUYWJsZVdpdGhFbnVtICpNb25zdGVyOjp0ZXN0X2FzPE15R2FtZTo6RXhhbXBsZTo6VGVzdFNpbXBsZVRhYmxlV2l0aEVudW0+KCkgY29uc3QgeworICByZXR1cm4gdGVzdF9hc19UZXN0U2ltcGxlVGFibGVXaXRoRW51bSgpOworfQorCit0ZW1wbGF0ZTw+IGlubGluZSBjb25zdCBNeUdhbWU6OkV4YW1wbGUyOjpNb25zdGVyICpNb25zdGVyOjp0ZXN0X2FzPE15R2FtZTo6RXhhbXBsZTI6Ok1vbnN0ZXI+KCkgY29uc3QgeworICByZXR1cm4gdGVzdF9hc19NeUdhbWVfRXhhbXBsZTJfTW9uc3RlcigpOworfQorCit0ZW1wbGF0ZTw+IGlubGluZSBjb25zdCBNeUdhbWU6OkV4YW1wbGU6Ok1vbnN0ZXIgKk1vbnN0ZXI6OmFueV91bmlxdWVfYXM8TXlHYW1lOjpFeGFtcGxlOjpNb25zdGVyPigpIGNvbnN0IHsKKyAgcmV0dXJuIGFueV91bmlxdWVfYXNfTSgpOworfQorCit0ZW1wbGF0ZTw+IGlubGluZSBjb25zdCBNeUdhbWU6OkV4YW1wbGU6OlRlc3RTaW1wbGVUYWJsZVdpdGhFbnVtICpNb25zdGVyOjphbnlfdW5pcXVlX2FzPE15R2FtZTo6RXhhbXBsZTo6VGVzdFNpbXBsZVRhYmxlV2l0aEVudW0+KCkgY29uc3QgeworICByZXR1cm4gYW55X3VuaXF1ZV9hc19UUygpOworfQorCit0ZW1wbGF0ZTw+IGlubGluZSBjb25zdCBNeUdhbWU6OkV4YW1wbGUyOjpNb25zdGVyICpNb25zdGVyOjphbnlfdW5pcXVlX2FzPE15R2FtZTo6RXhhbXBsZTI6Ok1vbnN0ZXI+KCkgY29uc3QgeworICByZXR1cm4gYW55X3VuaXF1ZV9hc19NMigpOworfQorCitzdHJ1Y3QgTW9uc3RlckJ1aWxkZXIgeworICB0eXBlZGVmIE1vbnN0ZXIgVGFibGU7CisgIGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmZmJiXzsKKyAgZmxhdGJ1ZmZlcnM6OnVvZmZzZXRfdCBzdGFydF87CisgIHZvaWQgYWRkX3Bvcyhjb25zdCBNeUdhbWU6OkV4YW1wbGU6OlZlYzMgKnBvcykgeworICAgIGZiYl8uQWRkU3RydWN0KE1vbnN0ZXI6OlZUX1BPUywgcG9zKTsKKyAgfQorICB2b2lkIGFkZF9tYW5hKGludDE2X3QgbWFuYSkgeworICAgIGZiYl8uQWRkRWxlbWVudDxpbnQxNl90PihNb25zdGVyOjpWVF9NQU5BLCBtYW5hLCAxNTApOworICB9CisgIHZvaWQgYWRkX2hwKGludDE2X3QgaHApIHsKKyAgICBmYmJfLkFkZEVsZW1lbnQ8aW50MTZfdD4oTW9uc3Rlcjo6VlRfSFAsIGhwLCAxMDApOworICB9CisgIHZvaWQgYWRkX25hbWUoZmxhdGJ1ZmZlcnM6Ok9mZnNldDxmbGF0YnVmZmVyczo6U3RyaW5nPiBuYW1lKSB7CisgICAgZmJiXy5BZGRPZmZzZXQoTW9uc3Rlcjo6VlRfTkFNRSwgbmFtZSk7CisgIH0KKyAgdm9pZCBhZGRfaW52ZW50b3J5KGZsYXRidWZmZXJzOjpPZmZzZXQ8ZmxhdGJ1ZmZlcnM6OlZlY3Rvcjx1aW50OF90Pj4gaW52ZW50b3J5KSB7CisgICAgZmJiXy5BZGRPZmZzZXQoTW9uc3Rlcjo6VlRfSU5WRU5UT1JZLCBpbnZlbnRvcnkpOworICB9CisgIHZvaWQgYWRkX2NvbG9yKE15R2FtZTo6RXhhbXBsZTo6Q29sb3IgY29sb3IpIHsKKyAgICBmYmJfLkFkZEVsZW1lbnQ8dWludDhfdD4oTW9uc3Rlcjo6VlRfQ09MT1IsIHN0YXRpY19jYXN0PHVpbnQ4X3Q+KGNvbG9yKSwgOCk7CisgIH0KKyAgdm9pZCBhZGRfdGVzdF90eXBlKE15R2FtZTo6RXhhbXBsZTo6QW55IHRlc3RfdHlwZSkgeworICAgIGZiYl8uQWRkRWxlbWVudDx1aW50OF90PihNb25zdGVyOjpWVF9URVNUX1RZUEUsIHN0YXRpY19jYXN0PHVpbnQ4X3Q+KHRlc3RfdHlwZSksIDApOworICB9CisgIHZvaWQgYWRkX3Rlc3QoZmxhdGJ1ZmZlcnM6Ok9mZnNldDx2b2lkPiB0ZXN0KSB7CisgICAgZmJiXy5BZGRPZmZzZXQoTW9uc3Rlcjo6VlRfVEVTVCwgdGVzdCk7CisgIH0KKyAgdm9pZCBhZGRfdGVzdDQoZmxhdGJ1ZmZlcnM6Ok9mZnNldDxmbGF0YnVmZmVyczo6VmVjdG9yPGNvbnN0IE15R2FtZTo6RXhhbXBsZTo6VGVzdCAqPj4gdGVzdDQpIHsKKyAgICBmYmJfLkFkZE9mZnNldChNb25zdGVyOjpWVF9URVNUNCwgdGVzdDQpOworICB9CisgIHZvaWQgYWRkX3Rlc3RhcnJheW9mc3RyaW5nKGZsYXRidWZmZXJzOjpPZmZzZXQ8ZmxhdGJ1ZmZlcnM6OlZlY3RvcjxmbGF0YnVmZmVyczo6T2Zmc2V0PGZsYXRidWZmZXJzOjpTdHJpbmc+Pj4gdGVzdGFycmF5b2ZzdHJpbmcpIHsKKyAgICBmYmJfLkFkZE9mZnNldChNb25zdGVyOjpWVF9URVNUQVJSQVlPRlNUUklORywgdGVzdGFycmF5b2ZzdHJpbmcpOworICB9CisgIHZvaWQgYWRkX3Rlc3RhcnJheW9mdGFibGVzKGZsYXRidWZmZXJzOjpPZmZzZXQ8ZmxhdGJ1ZmZlcnM6OlZlY3RvcjxmbGF0YnVmZmVyczo6T2Zmc2V0PE15R2FtZTo6RXhhbXBsZTo6TW9uc3Rlcj4+PiB0ZXN0YXJyYXlvZnRhYmxlcykgeworICAgIGZiYl8uQWRkT2Zmc2V0KE1vbnN0ZXI6OlZUX1RFU1RBUlJBWU9GVEFCTEVTLCB0ZXN0YXJyYXlvZnRhYmxlcyk7CisgIH0KKyAgdm9pZCBhZGRfZW5lbXkoZmxhdGJ1ZmZlcnM6Ok9mZnNldDxNeUdhbWU6OkV4YW1wbGU6Ok1vbnN0ZXI+IGVuZW15KSB7CisgICAgZmJiXy5BZGRPZmZzZXQoTW9uc3Rlcjo6VlRfRU5FTVksIGVuZW15KTsKKyAgfQorICB2b2lkIGFkZF90ZXN0bmVzdGVkZmxhdGJ1ZmZlcihmbGF0YnVmZmVyczo6T2Zmc2V0PGZsYXRidWZmZXJzOjpWZWN0b3I8dWludDhfdD4+IHRlc3RuZXN0ZWRmbGF0YnVmZmVyKSB7CisgICAgZmJiXy5BZGRPZmZzZXQoTW9uc3Rlcjo6VlRfVEVTVE5FU1RFREZMQVRCVUZGRVIsIHRlc3RuZXN0ZWRmbGF0YnVmZmVyKTsKKyAgfQorICB2b2lkIGFkZF90ZXN0ZW1wdHkoZmxhdGJ1ZmZlcnM6Ok9mZnNldDxNeUdhbWU6OkV4YW1wbGU6OlN0YXQ+IHRlc3RlbXB0eSkgeworICAgIGZiYl8uQWRkT2Zmc2V0KE1vbnN0ZXI6OlZUX1RFU1RFTVBUWSwgdGVzdGVtcHR5KTsKKyAgfQorICB2b2lkIGFkZF90ZXN0Ym9vbChib29sIHRlc3Rib29sKSB7CisgICAgZmJiXy5BZGRFbGVtZW50PHVpbnQ4X3Q+KE1vbnN0ZXI6OlZUX1RFU1RCT09MLCBzdGF0aWNfY2FzdDx1aW50OF90Pih0ZXN0Ym9vbCksIDApOworICB9CisgIHZvaWQgYWRkX3Rlc3RoYXNoczMyX2ZudjEoaW50MzJfdCB0ZXN0aGFzaHMzMl9mbnYxKSB7CisgICAgZmJiXy5BZGRFbGVtZW50PGludDMyX3Q+KE1vbnN0ZXI6OlZUX1RFU1RIQVNIUzMyX0ZOVjEsIHRlc3RoYXNoczMyX2ZudjEsIDApOworICB9CisgIHZvaWQgYWRkX3Rlc3RoYXNodTMyX2ZudjEodWludDMyX3QgdGVzdGhhc2h1MzJfZm52MSkgeworICAgIGZiYl8uQWRkRWxlbWVudDx1aW50MzJfdD4oTW9uc3Rlcjo6VlRfVEVTVEhBU0hVMzJfRk5WMSwgdGVzdGhhc2h1MzJfZm52MSwgMCk7CisgIH0KKyAgdm9pZCBhZGRfdGVzdGhhc2hzNjRfZm52MShpbnQ2NF90IHRlc3RoYXNoczY0X2ZudjEpIHsKKyAgICBmYmJfLkFkZEVsZW1lbnQ8aW50NjRfdD4oTW9uc3Rlcjo6VlRfVEVTVEhBU0hTNjRfRk5WMSwgdGVzdGhhc2hzNjRfZm52MSwgMCk7CisgIH0KKyAgdm9pZCBhZGRfdGVzdGhhc2h1NjRfZm52MSh1aW50NjRfdCB0ZXN0aGFzaHU2NF9mbnYxKSB7CisgICAgZmJiXy5BZGRFbGVtZW50PHVpbnQ2NF90PihNb25zdGVyOjpWVF9URVNUSEFTSFU2NF9GTlYxLCB0ZXN0aGFzaHU2NF9mbnYxLCAwKTsKKyAgfQorICB2b2lkIGFkZF90ZXN0aGFzaHMzMl9mbnYxYShpbnQzMl90IHRlc3RoYXNoczMyX2ZudjFhKSB7CisgICAgZmJiXy5BZGRFbGVtZW50PGludDMyX3Q+KE1vbnN0ZXI6OlZUX1RFU1RIQVNIUzMyX0ZOVjFBLCB0ZXN0aGFzaHMzMl9mbnYxYSwgMCk7CisgIH0KKyAgdm9pZCBhZGRfdGVzdGhhc2h1MzJfZm52MWEodWludDMyX3QgdGVzdGhhc2h1MzJfZm52MWEpIHsKKyAgICBmYmJfLkFkZEVsZW1lbnQ8dWludDMyX3Q+KE1vbnN0ZXI6OlZUX1RFU1RIQVNIVTMyX0ZOVjFBLCB0ZXN0aGFzaHUzMl9mbnYxYSwgMCk7CisgIH0KKyAgdm9pZCBhZGRfdGVzdGhhc2hzNjRfZm52MWEoaW50NjRfdCB0ZXN0aGFzaHM2NF9mbnYxYSkgeworICAgIGZiYl8uQWRkRWxlbWVudDxpbnQ2NF90PihNb25zdGVyOjpWVF9URVNUSEFTSFM2NF9GTlYxQSwgdGVzdGhhc2hzNjRfZm52MWEsIDApOworICB9CisgIHZvaWQgYWRkX3Rlc3RoYXNodTY0X2ZudjFhKHVpbnQ2NF90IHRlc3RoYXNodTY0X2ZudjFhKSB7CisgICAgZmJiXy5BZGRFbGVtZW50PHVpbnQ2NF90PihNb25zdGVyOjpWVF9URVNUSEFTSFU2NF9GTlYxQSwgdGVzdGhhc2h1NjRfZm52MWEsIDApOworICB9CisgIHZvaWQgYWRkX3Rlc3RhcnJheW9mYm9vbHMoZmxhdGJ1ZmZlcnM6Ok9mZnNldDxmbGF0YnVmZmVyczo6VmVjdG9yPHVpbnQ4X3Q+PiB0ZXN0YXJyYXlvZmJvb2xzKSB7CisgICAgZmJiXy5BZGRPZmZzZXQoTW9uc3Rlcjo6VlRfVEVTVEFSUkFZT0ZCT09MUywgdGVzdGFycmF5b2Zib29scyk7CisgIH0KKyAgdm9pZCBhZGRfdGVzdGYoZmxvYXQgdGVzdGYpIHsKKyAgICBmYmJfLkFkZEVsZW1lbnQ8ZmxvYXQ+KE1vbnN0ZXI6OlZUX1RFU1RGLCB0ZXN0ZiwgMy4xNDE1OWYpOworICB9CisgIHZvaWQgYWRkX3Rlc3RmMihmbG9hdCB0ZXN0ZjIpIHsKKyAgICBmYmJfLkFkZEVsZW1lbnQ8ZmxvYXQ+KE1vbnN0ZXI6OlZUX1RFU1RGMiwgdGVzdGYyLCAzLjBmKTsKKyAgfQorICB2b2lkIGFkZF90ZXN0ZjMoZmxvYXQgdGVzdGYzKSB7CisgICAgZmJiXy5BZGRFbGVtZW50PGZsb2F0PihNb25zdGVyOjpWVF9URVNURjMsIHRlc3RmMywgMC4wZik7CisgIH0KKyAgdm9pZCBhZGRfdGVzdGFycmF5b2ZzdHJpbmcyKGZsYXRidWZmZXJzOjpPZmZzZXQ8ZmxhdGJ1ZmZlcnM6OlZlY3RvcjxmbGF0YnVmZmVyczo6T2Zmc2V0PGZsYXRidWZmZXJzOjpTdHJpbmc+Pj4gdGVzdGFycmF5b2ZzdHJpbmcyKSB7CisgICAgZmJiXy5BZGRPZmZzZXQoTW9uc3Rlcjo6VlRfVEVTVEFSUkFZT0ZTVFJJTkcyLCB0ZXN0YXJyYXlvZnN0cmluZzIpOworICB9CisgIHZvaWQgYWRkX3Rlc3RhcnJheW9mc29ydGVkc3RydWN0KGZsYXRidWZmZXJzOjpPZmZzZXQ8ZmxhdGJ1ZmZlcnM6OlZlY3Rvcjxjb25zdCBNeUdhbWU6OkV4YW1wbGU6OkFiaWxpdHkgKj4+IHRlc3RhcnJheW9mc29ydGVkc3RydWN0KSB7CisgICAgZmJiXy5BZGRPZmZzZXQoTW9uc3Rlcjo6VlRfVEVTVEFSUkFZT0ZTT1JURURTVFJVQ1QsIHRlc3RhcnJheW9mc29ydGVkc3RydWN0KTsKKyAgfQorICB2b2lkIGFkZF9mbGV4KGZsYXRidWZmZXJzOjpPZmZzZXQ8ZmxhdGJ1ZmZlcnM6OlZlY3Rvcjx1aW50OF90Pj4gZmxleCkgeworICAgIGZiYl8uQWRkT2Zmc2V0KE1vbnN0ZXI6OlZUX0ZMRVgsIGZsZXgpOworICB9CisgIHZvaWQgYWRkX3Rlc3Q1KGZsYXRidWZmZXJzOjpPZmZzZXQ8ZmxhdGJ1ZmZlcnM6OlZlY3Rvcjxjb25zdCBNeUdhbWU6OkV4YW1wbGU6OlRlc3QgKj4+IHRlc3Q1KSB7CisgICAgZmJiXy5BZGRPZmZzZXQoTW9uc3Rlcjo6VlRfVEVTVDUsIHRlc3Q1KTsKKyAgfQorICB2b2lkIGFkZF92ZWN0b3Jfb2ZfbG9uZ3MoZmxhdGJ1ZmZlcnM6Ok9mZnNldDxmbGF0YnVmZmVyczo6VmVjdG9yPGludDY0X3Q+PiB2ZWN0b3Jfb2ZfbG9uZ3MpIHsKKyAgICBmYmJfLkFkZE9mZnNldChNb25zdGVyOjpWVF9WRUNUT1JfT0ZfTE9OR1MsIHZlY3Rvcl9vZl9sb25ncyk7CisgIH0KKyAgdm9pZCBhZGRfdmVjdG9yX29mX2RvdWJsZXMoZmxhdGJ1ZmZlcnM6Ok9mZnNldDxmbGF0YnVmZmVyczo6VmVjdG9yPGRvdWJsZT4+IHZlY3Rvcl9vZl9kb3VibGVzKSB7CisgICAgZmJiXy5BZGRPZmZzZXQoTW9uc3Rlcjo6VlRfVkVDVE9SX09GX0RPVUJMRVMsIHZlY3Rvcl9vZl9kb3VibGVzKTsKKyAgfQorICB2b2lkIGFkZF9wYXJlbnRfbmFtZXNwYWNlX3Rlc3QoZmxhdGJ1ZmZlcnM6Ok9mZnNldDxNeUdhbWU6OkluUGFyZW50TmFtZXNwYWNlPiBwYXJlbnRfbmFtZXNwYWNlX3Rlc3QpIHsKKyAgICBmYmJfLkFkZE9mZnNldChNb25zdGVyOjpWVF9QQVJFTlRfTkFNRVNQQUNFX1RFU1QsIHBhcmVudF9uYW1lc3BhY2VfdGVzdCk7CisgIH0KKyAgdm9pZCBhZGRfdmVjdG9yX29mX3JlZmVycmFibGVzKGZsYXRidWZmZXJzOjpPZmZzZXQ8ZmxhdGJ1ZmZlcnM6OlZlY3RvcjxmbGF0YnVmZmVyczo6T2Zmc2V0PE15R2FtZTo6RXhhbXBsZTo6UmVmZXJyYWJsZT4+PiB2ZWN0b3Jfb2ZfcmVmZXJyYWJsZXMpIHsKKyAgICBmYmJfLkFkZE9mZnNldChNb25zdGVyOjpWVF9WRUNUT1JfT0ZfUkVGRVJSQUJMRVMsIHZlY3Rvcl9vZl9yZWZlcnJhYmxlcyk7CisgIH0KKyAgdm9pZCBhZGRfc2luZ2xlX3dlYWtfcmVmZXJlbmNlKHVpbnQ2NF90IHNpbmdsZV93ZWFrX3JlZmVyZW5jZSkgeworICAgIGZiYl8uQWRkRWxlbWVudDx1aW50NjRfdD4oTW9uc3Rlcjo6VlRfU0lOR0xFX1dFQUtfUkVGRVJFTkNFLCBzaW5nbGVfd2Vha19yZWZlcmVuY2UsIDApOworICB9CisgIHZvaWQgYWRkX3ZlY3Rvcl9vZl93ZWFrX3JlZmVyZW5jZXMoZmxhdGJ1ZmZlcnM6Ok9mZnNldDxmbGF0YnVmZmVyczo6VmVjdG9yPHVpbnQ2NF90Pj4gdmVjdG9yX29mX3dlYWtfcmVmZXJlbmNlcykgeworICAgIGZiYl8uQWRkT2Zmc2V0KE1vbnN0ZXI6OlZUX1ZFQ1RPUl9PRl9XRUFLX1JFRkVSRU5DRVMsIHZlY3Rvcl9vZl93ZWFrX3JlZmVyZW5jZXMpOworICB9CisgIHZvaWQgYWRkX3ZlY3Rvcl9vZl9zdHJvbmdfcmVmZXJyYWJsZXMoZmxhdGJ1ZmZlcnM6Ok9mZnNldDxmbGF0YnVmZmVyczo6VmVjdG9yPGZsYXRidWZmZXJzOjpPZmZzZXQ8TXlHYW1lOjpFeGFtcGxlOjpSZWZlcnJhYmxlPj4+IHZlY3Rvcl9vZl9zdHJvbmdfcmVmZXJyYWJsZXMpIHsKKyAgICBmYmJfLkFkZE9mZnNldChNb25zdGVyOjpWVF9WRUNUT1JfT0ZfU1RST05HX1JFRkVSUkFCTEVTLCB2ZWN0b3Jfb2Zfc3Ryb25nX3JlZmVycmFibGVzKTsKKyAgfQorICB2b2lkIGFkZF9jb19vd25pbmdfcmVmZXJlbmNlKHVpbnQ2NF90IGNvX293bmluZ19yZWZlcmVuY2UpIHsKKyAgICBmYmJfLkFkZEVsZW1lbnQ8dWludDY0X3Q+KE1vbnN0ZXI6OlZUX0NPX09XTklOR19SRUZFUkVOQ0UsIGNvX293bmluZ19yZWZlcmVuY2UsIDApOworICB9CisgIHZvaWQgYWRkX3ZlY3Rvcl9vZl9jb19vd25pbmdfcmVmZXJlbmNlcyhmbGF0YnVmZmVyczo6T2Zmc2V0PGZsYXRidWZmZXJzOjpWZWN0b3I8dWludDY0X3Q+PiB2ZWN0b3Jfb2ZfY29fb3duaW5nX3JlZmVyZW5jZXMpIHsKKyAgICBmYmJfLkFkZE9mZnNldChNb25zdGVyOjpWVF9WRUNUT1JfT0ZfQ09fT1dOSU5HX1JFRkVSRU5DRVMsIHZlY3Rvcl9vZl9jb19vd25pbmdfcmVmZXJlbmNlcyk7CisgIH0KKyAgdm9pZCBhZGRfbm9uX293bmluZ19yZWZlcmVuY2UodWludDY0X3Qgbm9uX293bmluZ19yZWZlcmVuY2UpIHsKKyAgICBmYmJfLkFkZEVsZW1lbnQ8dWludDY0X3Q+KE1vbnN0ZXI6OlZUX05PTl9PV05JTkdfUkVGRVJFTkNFLCBub25fb3duaW5nX3JlZmVyZW5jZSwgMCk7CisgIH0KKyAgdm9pZCBhZGRfdmVjdG9yX29mX25vbl9vd25pbmdfcmVmZXJlbmNlcyhmbGF0YnVmZmVyczo6T2Zmc2V0PGZsYXRidWZmZXJzOjpWZWN0b3I8dWludDY0X3Q+PiB2ZWN0b3Jfb2Zfbm9uX293bmluZ19yZWZlcmVuY2VzKSB7CisgICAgZmJiXy5BZGRPZmZzZXQoTW9uc3Rlcjo6VlRfVkVDVE9SX09GX05PTl9PV05JTkdfUkVGRVJFTkNFUywgdmVjdG9yX29mX25vbl9vd25pbmdfcmVmZXJlbmNlcyk7CisgIH0KKyAgdm9pZCBhZGRfYW55X3VuaXF1ZV90eXBlKE15R2FtZTo6RXhhbXBsZTo6QW55VW5pcXVlQWxpYXNlcyBhbnlfdW5pcXVlX3R5cGUpIHsKKyAgICBmYmJfLkFkZEVsZW1lbnQ8dWludDhfdD4oTW9uc3Rlcjo6VlRfQU5ZX1VOSVFVRV9UWVBFLCBzdGF0aWNfY2FzdDx1aW50OF90PihhbnlfdW5pcXVlX3R5cGUpLCAwKTsKKyAgfQorICB2b2lkIGFkZF9hbnlfdW5pcXVlKGZsYXRidWZmZXJzOjpPZmZzZXQ8dm9pZD4gYW55X3VuaXF1ZSkgeworICAgIGZiYl8uQWRkT2Zmc2V0KE1vbnN0ZXI6OlZUX0FOWV9VTklRVUUsIGFueV91bmlxdWUpOworICB9CisgIHZvaWQgYWRkX2FueV9hbWJpZ3VvdXNfdHlwZShNeUdhbWU6OkV4YW1wbGU6OkFueUFtYmlndW91c0FsaWFzZXMgYW55X2FtYmlndW91c190eXBlKSB7CisgICAgZmJiXy5BZGRFbGVtZW50PHVpbnQ4X3Q+KE1vbnN0ZXI6OlZUX0FOWV9BTUJJR1VPVVNfVFlQRSwgc3RhdGljX2Nhc3Q8dWludDhfdD4oYW55X2FtYmlndW91c190eXBlKSwgMCk7CisgIH0KKyAgdm9pZCBhZGRfYW55X2FtYmlndW91cyhmbGF0YnVmZmVyczo6T2Zmc2V0PHZvaWQ+IGFueV9hbWJpZ3VvdXMpIHsKKyAgICBmYmJfLkFkZE9mZnNldChNb25zdGVyOjpWVF9BTllfQU1CSUdVT1VTLCBhbnlfYW1iaWd1b3VzKTsKKyAgfQorICB2b2lkIGFkZF92ZWN0b3Jfb2ZfZW51bXMoZmxhdGJ1ZmZlcnM6Ok9mZnNldDxmbGF0YnVmZmVyczo6VmVjdG9yPHVpbnQ4X3Q+PiB2ZWN0b3Jfb2ZfZW51bXMpIHsKKyAgICBmYmJfLkFkZE9mZnNldChNb25zdGVyOjpWVF9WRUNUT1JfT0ZfRU5VTVMsIHZlY3Rvcl9vZl9lbnVtcyk7CisgIH0KKyAgdm9pZCBhZGRfc2lnbmVkX2VudW0oTXlHYW1lOjpFeGFtcGxlOjpSYWNlIHNpZ25lZF9lbnVtKSB7CisgICAgZmJiXy5BZGRFbGVtZW50PGludDhfdD4oTW9uc3Rlcjo6VlRfU0lHTkVEX0VOVU0sIHN0YXRpY19jYXN0PGludDhfdD4oc2lnbmVkX2VudW0pLCAtMSk7CisgIH0KKyAgdm9pZCBhZGRfdGVzdHJlcXVpcmVkbmVzdGVkZmxhdGJ1ZmZlcihmbGF0YnVmZmVyczo6T2Zmc2V0PGZsYXRidWZmZXJzOjpWZWN0b3I8dWludDhfdD4+IHRlc3RyZXF1aXJlZG5lc3RlZGZsYXRidWZmZXIpIHsKKyAgICBmYmJfLkFkZE9mZnNldChNb25zdGVyOjpWVF9URVNUUkVRVUlSRURORVNURURGTEFUQlVGRkVSLCB0ZXN0cmVxdWlyZWRuZXN0ZWRmbGF0YnVmZmVyKTsKKyAgfQorICB2b2lkIGFkZF9zY2FsYXJfa2V5X3NvcnRlZF90YWJsZXMoZmxhdGJ1ZmZlcnM6Ok9mZnNldDxmbGF0YnVmZmVyczo6VmVjdG9yPGZsYXRidWZmZXJzOjpPZmZzZXQ8TXlHYW1lOjpFeGFtcGxlOjpTdGF0Pj4+IHNjYWxhcl9rZXlfc29ydGVkX3RhYmxlcykgeworICAgIGZiYl8uQWRkT2Zmc2V0KE1vbnN0ZXI6OlZUX1NDQUxBUl9LRVlfU09SVEVEX1RBQkxFUywgc2NhbGFyX2tleV9zb3J0ZWRfdGFibGVzKTsKKyAgfQorICB2b2lkIGFkZF9uYXRpdmVfaW5saW5lKGNvbnN0IE15R2FtZTo6RXhhbXBsZTo6VGVzdCAqbmF0aXZlX2lubGluZSkgeworICAgIGZiYl8uQWRkU3RydWN0KE1vbnN0ZXI6OlZUX05BVElWRV9JTkxJTkUsIG5hdGl2ZV9pbmxpbmUpOworICB9CisgIHZvaWQgYWRkX2xvbmdfZW51bV9ub25fZW51bV9kZWZhdWx0KE15R2FtZTo6RXhhbXBsZTo6TG9uZ0VudW0gbG9uZ19lbnVtX25vbl9lbnVtX2RlZmF1bHQpIHsKKyAgICBmYmJfLkFkZEVsZW1lbnQ8dWludDY0X3Q+KE1vbnN0ZXI6OlZUX0xPTkdfRU5VTV9OT05fRU5VTV9ERUZBVUxULCBzdGF0aWNfY2FzdDx1aW50NjRfdD4obG9uZ19lbnVtX25vbl9lbnVtX2RlZmF1bHQpLCAwKTsKKyAgfQorICB2b2lkIGFkZF9sb25nX2VudW1fbm9ybWFsX2RlZmF1bHQoTXlHYW1lOjpFeGFtcGxlOjpMb25nRW51bSBsb25nX2VudW1fbm9ybWFsX2RlZmF1bHQpIHsKKyAgICBmYmJfLkFkZEVsZW1lbnQ8dWludDY0X3Q+KE1vbnN0ZXI6OlZUX0xPTkdfRU5VTV9OT1JNQUxfREVGQVVMVCwgc3RhdGljX2Nhc3Q8dWludDY0X3Q+KGxvbmdfZW51bV9ub3JtYWxfZGVmYXVsdCksIDJVTEwpOworICB9CisgIGV4cGxpY2l0IE1vbnN0ZXJCdWlsZGVyKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYikKKyAgICAgICAgOiBmYmJfKF9mYmIpIHsKKyAgICBzdGFydF8gPSBmYmJfLlN0YXJ0VGFibGUoKTsKKyAgfQorICBmbGF0YnVmZmVyczo6T2Zmc2V0PE1vbnN0ZXI+IEZpbmlzaCgpIHsKKyAgICBjb25zdCBhdXRvIGVuZCA9IGZiYl8uRW5kVGFibGUoc3RhcnRfKTsKKyAgICBhdXRvIG8gPSBmbGF0YnVmZmVyczo6T2Zmc2V0PE1vbnN0ZXI+KGVuZCk7CisgICAgZmJiXy5SZXF1aXJlZChvLCBNb25zdGVyOjpWVF9OQU1FKTsKKyAgICByZXR1cm4gbzsKKyAgfQorfTsKKworaW5saW5lIGZsYXRidWZmZXJzOjpPZmZzZXQ8TW9uc3Rlcj4gQ3JlYXRlTW9uc3RlcigKKyAgICBmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsCisgICAgY29uc3QgTXlHYW1lOjpFeGFtcGxlOjpWZWMzICpwb3MgPSBudWxscHRyLAorICAgIGludDE2X3QgbWFuYSA9IDE1MCwKKyAgICBpbnQxNl90IGhwID0gMTAwLAorICAgIGZsYXRidWZmZXJzOjpPZmZzZXQ8ZmxhdGJ1ZmZlcnM6OlN0cmluZz4gbmFtZSA9IDAsCisgICAgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxmbGF0YnVmZmVyczo6VmVjdG9yPHVpbnQ4X3Q+PiBpbnZlbnRvcnkgPSAwLAorICAgIE15R2FtZTo6RXhhbXBsZTo6Q29sb3IgY29sb3IgPSBNeUdhbWU6OkV4YW1wbGU6OkNvbG9yX0JsdWUsCisgICAgTXlHYW1lOjpFeGFtcGxlOjpBbnkgdGVzdF90eXBlID0gTXlHYW1lOjpFeGFtcGxlOjpBbnlfTk9ORSwKKyAgICBmbGF0YnVmZmVyczo6T2Zmc2V0PHZvaWQ+IHRlc3QgPSAwLAorICAgIGZsYXRidWZmZXJzOjpPZmZzZXQ8ZmxhdGJ1ZmZlcnM6OlZlY3Rvcjxjb25zdCBNeUdhbWU6OkV4YW1wbGU6OlRlc3QgKj4+IHRlc3Q0ID0gMCwKKyAgICBmbGF0YnVmZmVyczo6T2Zmc2V0PGZsYXRidWZmZXJzOjpWZWN0b3I8ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxmbGF0YnVmZmVyczo6U3RyaW5nPj4+IHRlc3RhcnJheW9mc3RyaW5nID0gMCwKKyAgICBmbGF0YnVmZmVyczo6T2Zmc2V0PGZsYXRidWZmZXJzOjpWZWN0b3I8ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxNeUdhbWU6OkV4YW1wbGU6Ok1vbnN0ZXI+Pj4gdGVzdGFycmF5b2Z0YWJsZXMgPSAwLAorICAgIGZsYXRidWZmZXJzOjpPZmZzZXQ8TXlHYW1lOjpFeGFtcGxlOjpNb25zdGVyPiBlbmVteSA9IDAsCisgICAgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxmbGF0YnVmZmVyczo6VmVjdG9yPHVpbnQ4X3Q+PiB0ZXN0bmVzdGVkZmxhdGJ1ZmZlciA9IDAsCisgICAgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxNeUdhbWU6OkV4YW1wbGU6OlN0YXQ+IHRlc3RlbXB0eSA9IDAsCisgICAgYm9vbCB0ZXN0Ym9vbCA9IGZhbHNlLAorICAgIGludDMyX3QgdGVzdGhhc2hzMzJfZm52MSA9IDAsCisgICAgdWludDMyX3QgdGVzdGhhc2h1MzJfZm52MSA9IDAsCisgICAgaW50NjRfdCB0ZXN0aGFzaHM2NF9mbnYxID0gMCwKKyAgICB1aW50NjRfdCB0ZXN0aGFzaHU2NF9mbnYxID0gMCwKKyAgICBpbnQzMl90IHRlc3RoYXNoczMyX2ZudjFhID0gMCwKKyAgICB1aW50MzJfdCB0ZXN0aGFzaHUzMl9mbnYxYSA9IDAsCisgICAgaW50NjRfdCB0ZXN0aGFzaHM2NF9mbnYxYSA9IDAsCisgICAgdWludDY0X3QgdGVzdGhhc2h1NjRfZm52MWEgPSAwLAorICAgIGZsYXRidWZmZXJzOjpPZmZzZXQ8ZmxhdGJ1ZmZlcnM6OlZlY3Rvcjx1aW50OF90Pj4gdGVzdGFycmF5b2Zib29scyA9IDAsCisgICAgZmxvYXQgdGVzdGYgPSAzLjE0MTU5ZiwKKyAgICBmbG9hdCB0ZXN0ZjIgPSAzLjBmLAorICAgIGZsb2F0IHRlc3RmMyA9IDAuMGYsCisgICAgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxmbGF0YnVmZmVyczo6VmVjdG9yPGZsYXRidWZmZXJzOjpPZmZzZXQ8ZmxhdGJ1ZmZlcnM6OlN0cmluZz4+PiB0ZXN0YXJyYXlvZnN0cmluZzIgPSAwLAorICAgIGZsYXRidWZmZXJzOjpPZmZzZXQ8ZmxhdGJ1ZmZlcnM6OlZlY3Rvcjxjb25zdCBNeUdhbWU6OkV4YW1wbGU6OkFiaWxpdHkgKj4+IHRlc3RhcnJheW9mc29ydGVkc3RydWN0ID0gMCwKKyAgICBmbGF0YnVmZmVyczo6T2Zmc2V0PGZsYXRidWZmZXJzOjpWZWN0b3I8dWludDhfdD4+IGZsZXggPSAwLAorICAgIGZsYXRidWZmZXJzOjpPZmZzZXQ8ZmxhdGJ1ZmZlcnM6OlZlY3Rvcjxjb25zdCBNeUdhbWU6OkV4YW1wbGU6OlRlc3QgKj4+IHRlc3Q1ID0gMCwKKyAgICBmbGF0YnVmZmVyczo6T2Zmc2V0PGZsYXRidWZmZXJzOjpWZWN0b3I8aW50NjRfdD4+IHZlY3Rvcl9vZl9sb25ncyA9IDAsCisgICAgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxmbGF0YnVmZmVyczo6VmVjdG9yPGRvdWJsZT4+IHZlY3Rvcl9vZl9kb3VibGVzID0gMCwKKyAgICBmbGF0YnVmZmVyczo6T2Zmc2V0PE15R2FtZTo6SW5QYXJlbnROYW1lc3BhY2U+IHBhcmVudF9uYW1lc3BhY2VfdGVzdCA9IDAsCisgICAgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxmbGF0YnVmZmVyczo6VmVjdG9yPGZsYXRidWZmZXJzOjpPZmZzZXQ8TXlHYW1lOjpFeGFtcGxlOjpSZWZlcnJhYmxlPj4+IHZlY3Rvcl9vZl9yZWZlcnJhYmxlcyA9IDAsCisgICAgdWludDY0X3Qgc2luZ2xlX3dlYWtfcmVmZXJlbmNlID0gMCwKKyAgICBmbGF0YnVmZmVyczo6T2Zmc2V0PGZsYXRidWZmZXJzOjpWZWN0b3I8dWludDY0X3Q+PiB2ZWN0b3Jfb2Zfd2Vha19yZWZlcmVuY2VzID0gMCwKKyAgICBmbGF0YnVmZmVyczo6T2Zmc2V0PGZsYXRidWZmZXJzOjpWZWN0b3I8ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxNeUdhbWU6OkV4YW1wbGU6OlJlZmVycmFibGU+Pj4gdmVjdG9yX29mX3N0cm9uZ19yZWZlcnJhYmxlcyA9IDAsCisgICAgdWludDY0X3QgY29fb3duaW5nX3JlZmVyZW5jZSA9IDAsCisgICAgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxmbGF0YnVmZmVyczo6VmVjdG9yPHVpbnQ2NF90Pj4gdmVjdG9yX29mX2NvX293bmluZ19yZWZlcmVuY2VzID0gMCwKKyAgICB1aW50NjRfdCBub25fb3duaW5nX3JlZmVyZW5jZSA9IDAsCisgICAgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxmbGF0YnVmZmVyczo6VmVjdG9yPHVpbnQ2NF90Pj4gdmVjdG9yX29mX25vbl9vd25pbmdfcmVmZXJlbmNlcyA9IDAsCisgICAgTXlHYW1lOjpFeGFtcGxlOjpBbnlVbmlxdWVBbGlhc2VzIGFueV91bmlxdWVfdHlwZSA9IE15R2FtZTo6RXhhbXBsZTo6QW55VW5pcXVlQWxpYXNlc19OT05FLAorICAgIGZsYXRidWZmZXJzOjpPZmZzZXQ8dm9pZD4gYW55X3VuaXF1ZSA9IDAsCisgICAgTXlHYW1lOjpFeGFtcGxlOjpBbnlBbWJpZ3VvdXNBbGlhc2VzIGFueV9hbWJpZ3VvdXNfdHlwZSA9IE15R2FtZTo6RXhhbXBsZTo6QW55QW1iaWd1b3VzQWxpYXNlc19OT05FLAorICAgIGZsYXRidWZmZXJzOjpPZmZzZXQ8dm9pZD4gYW55X2FtYmlndW91cyA9IDAsCisgICAgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxmbGF0YnVmZmVyczo6VmVjdG9yPHVpbnQ4X3Q+PiB2ZWN0b3Jfb2ZfZW51bXMgPSAwLAorICAgIE15R2FtZTo6RXhhbXBsZTo6UmFjZSBzaWduZWRfZW51bSA9IE15R2FtZTo6RXhhbXBsZTo6UmFjZV9Ob25lLAorICAgIGZsYXRidWZmZXJzOjpPZmZzZXQ8ZmxhdGJ1ZmZlcnM6OlZlY3Rvcjx1aW50OF90Pj4gdGVzdHJlcXVpcmVkbmVzdGVkZmxhdGJ1ZmZlciA9IDAsCisgICAgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxmbGF0YnVmZmVyczo6VmVjdG9yPGZsYXRidWZmZXJzOjpPZmZzZXQ8TXlHYW1lOjpFeGFtcGxlOjpTdGF0Pj4+IHNjYWxhcl9rZXlfc29ydGVkX3RhYmxlcyA9IDAsCisgICAgY29uc3QgTXlHYW1lOjpFeGFtcGxlOjpUZXN0ICpuYXRpdmVfaW5saW5lID0gbnVsbHB0ciwKKyAgICBNeUdhbWU6OkV4YW1wbGU6OkxvbmdFbnVtIGxvbmdfZW51bV9ub25fZW51bV9kZWZhdWx0ID0gc3RhdGljX2Nhc3Q8TXlHYW1lOjpFeGFtcGxlOjpMb25nRW51bT4oMCksCisgICAgTXlHYW1lOjpFeGFtcGxlOjpMb25nRW51bSBsb25nX2VudW1fbm9ybWFsX2RlZmF1bHQgPSBNeUdhbWU6OkV4YW1wbGU6OkxvbmdFbnVtX0xvbmdPbmUpIHsKKyAgTW9uc3RlckJ1aWxkZXIgYnVpbGRlcl8oX2ZiYik7CisgIGJ1aWxkZXJfLmFkZF9sb25nX2VudW1fbm9ybWFsX2RlZmF1bHQobG9uZ19lbnVtX25vcm1hbF9kZWZhdWx0KTsKKyAgYnVpbGRlcl8uYWRkX2xvbmdfZW51bV9ub25fZW51bV9kZWZhdWx0KGxvbmdfZW51bV9ub25fZW51bV9kZWZhdWx0KTsKKyAgYnVpbGRlcl8uYWRkX25vbl9vd25pbmdfcmVmZXJlbmNlKG5vbl9vd25pbmdfcmVmZXJlbmNlKTsKKyAgYnVpbGRlcl8uYWRkX2NvX293bmluZ19yZWZlcmVuY2UoY29fb3duaW5nX3JlZmVyZW5jZSk7CisgIGJ1aWxkZXJfLmFkZF9zaW5nbGVfd2Vha19yZWZlcmVuY2Uoc2luZ2xlX3dlYWtfcmVmZXJlbmNlKTsKKyAgYnVpbGRlcl8uYWRkX3Rlc3RoYXNodTY0X2ZudjFhKHRlc3RoYXNodTY0X2ZudjFhKTsKKyAgYnVpbGRlcl8uYWRkX3Rlc3RoYXNoczY0X2ZudjFhKHRlc3RoYXNoczY0X2ZudjFhKTsKKyAgYnVpbGRlcl8uYWRkX3Rlc3RoYXNodTY0X2ZudjEodGVzdGhhc2h1NjRfZm52MSk7CisgIGJ1aWxkZXJfLmFkZF90ZXN0aGFzaHM2NF9mbnYxKHRlc3RoYXNoczY0X2ZudjEpOworICBidWlsZGVyXy5hZGRfbmF0aXZlX2lubGluZShuYXRpdmVfaW5saW5lKTsKKyAgYnVpbGRlcl8uYWRkX3NjYWxhcl9rZXlfc29ydGVkX3RhYmxlcyhzY2FsYXJfa2V5X3NvcnRlZF90YWJsZXMpOworICBidWlsZGVyXy5hZGRfdGVzdHJlcXVpcmVkbmVzdGVkZmxhdGJ1ZmZlcih0ZXN0cmVxdWlyZWRuZXN0ZWRmbGF0YnVmZmVyKTsKKyAgYnVpbGRlcl8uYWRkX3ZlY3Rvcl9vZl9lbnVtcyh2ZWN0b3Jfb2ZfZW51bXMpOworICBidWlsZGVyXy5hZGRfYW55X2FtYmlndW91cyhhbnlfYW1iaWd1b3VzKTsKKyAgYnVpbGRlcl8uYWRkX2FueV91bmlxdWUoYW55X3VuaXF1ZSk7CisgIGJ1aWxkZXJfLmFkZF92ZWN0b3Jfb2Zfbm9uX293bmluZ19yZWZlcmVuY2VzKHZlY3Rvcl9vZl9ub25fb3duaW5nX3JlZmVyZW5jZXMpOworICBidWlsZGVyXy5hZGRfdmVjdG9yX29mX2NvX293bmluZ19yZWZlcmVuY2VzKHZlY3Rvcl9vZl9jb19vd25pbmdfcmVmZXJlbmNlcyk7CisgIGJ1aWxkZXJfLmFkZF92ZWN0b3Jfb2Zfc3Ryb25nX3JlZmVycmFibGVzKHZlY3Rvcl9vZl9zdHJvbmdfcmVmZXJyYWJsZXMpOworICBidWlsZGVyXy5hZGRfdmVjdG9yX29mX3dlYWtfcmVmZXJlbmNlcyh2ZWN0b3Jfb2Zfd2Vha19yZWZlcmVuY2VzKTsKKyAgYnVpbGRlcl8uYWRkX3ZlY3Rvcl9vZl9yZWZlcnJhYmxlcyh2ZWN0b3Jfb2ZfcmVmZXJyYWJsZXMpOworICBidWlsZGVyXy5hZGRfcGFyZW50X25hbWVzcGFjZV90ZXN0KHBhcmVudF9uYW1lc3BhY2VfdGVzdCk7CisgIGJ1aWxkZXJfLmFkZF92ZWN0b3Jfb2ZfZG91Ymxlcyh2ZWN0b3Jfb2ZfZG91Ymxlcyk7CisgIGJ1aWxkZXJfLmFkZF92ZWN0b3Jfb2ZfbG9uZ3ModmVjdG9yX29mX2xvbmdzKTsKKyAgYnVpbGRlcl8uYWRkX3Rlc3Q1KHRlc3Q1KTsKKyAgYnVpbGRlcl8uYWRkX2ZsZXgoZmxleCk7CisgIGJ1aWxkZXJfLmFkZF90ZXN0YXJyYXlvZnNvcnRlZHN0cnVjdCh0ZXN0YXJyYXlvZnNvcnRlZHN0cnVjdCk7CisgIGJ1aWxkZXJfLmFkZF90ZXN0YXJyYXlvZnN0cmluZzIodGVzdGFycmF5b2ZzdHJpbmcyKTsKKyAgYnVpbGRlcl8uYWRkX3Rlc3RmMyh0ZXN0ZjMpOworICBidWlsZGVyXy5hZGRfdGVzdGYyKHRlc3RmMik7CisgIGJ1aWxkZXJfLmFkZF90ZXN0Zih0ZXN0Zik7CisgIGJ1aWxkZXJfLmFkZF90ZXN0YXJyYXlvZmJvb2xzKHRlc3RhcnJheW9mYm9vbHMpOworICBidWlsZGVyXy5hZGRfdGVzdGhhc2h1MzJfZm52MWEodGVzdGhhc2h1MzJfZm52MWEpOworICBidWlsZGVyXy5hZGRfdGVzdGhhc2hzMzJfZm52MWEodGVzdGhhc2hzMzJfZm52MWEpOworICBidWlsZGVyXy5hZGRfdGVzdGhhc2h1MzJfZm52MSh0ZXN0aGFzaHUzMl9mbnYxKTsKKyAgYnVpbGRlcl8uYWRkX3Rlc3RoYXNoczMyX2ZudjEodGVzdGhhc2hzMzJfZm52MSk7CisgIGJ1aWxkZXJfLmFkZF90ZXN0ZW1wdHkodGVzdGVtcHR5KTsKKyAgYnVpbGRlcl8uYWRkX3Rlc3RuZXN0ZWRmbGF0YnVmZmVyKHRlc3RuZXN0ZWRmbGF0YnVmZmVyKTsKKyAgYnVpbGRlcl8uYWRkX2VuZW15KGVuZW15KTsKKyAgYnVpbGRlcl8uYWRkX3Rlc3RhcnJheW9mdGFibGVzKHRlc3RhcnJheW9mdGFibGVzKTsKKyAgYnVpbGRlcl8uYWRkX3Rlc3RhcnJheW9mc3RyaW5nKHRlc3RhcnJheW9mc3RyaW5nKTsKKyAgYnVpbGRlcl8uYWRkX3Rlc3Q0KHRlc3Q0KTsKKyAgYnVpbGRlcl8uYWRkX3Rlc3QodGVzdCk7CisgIGJ1aWxkZXJfLmFkZF9pbnZlbnRvcnkoaW52ZW50b3J5KTsKKyAgYnVpbGRlcl8uYWRkX25hbWUobmFtZSk7CisgIGJ1aWxkZXJfLmFkZF9wb3MocG9zKTsKKyAgYnVpbGRlcl8uYWRkX2hwKGhwKTsKKyAgYnVpbGRlcl8uYWRkX21hbmEobWFuYSk7CisgIGJ1aWxkZXJfLmFkZF9zaWduZWRfZW51bShzaWduZWRfZW51bSk7CisgIGJ1aWxkZXJfLmFkZF9hbnlfYW1iaWd1b3VzX3R5cGUoYW55X2FtYmlndW91c190eXBlKTsKKyAgYnVpbGRlcl8uYWRkX2FueV91bmlxdWVfdHlwZShhbnlfdW5pcXVlX3R5cGUpOworICBidWlsZGVyXy5hZGRfdGVzdGJvb2wodGVzdGJvb2wpOworICBidWlsZGVyXy5hZGRfdGVzdF90eXBlKHRlc3RfdHlwZSk7CisgIGJ1aWxkZXJfLmFkZF9jb2xvcihjb2xvcik7CisgIHJldHVybiBidWlsZGVyXy5GaW5pc2goKTsKK30KKworaW5saW5lIGZsYXRidWZmZXJzOjpPZmZzZXQ8TW9uc3Rlcj4gQ3JlYXRlTW9uc3RlckRpcmVjdCgKKyAgICBmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsCisgICAgY29uc3QgTXlHYW1lOjpFeGFtcGxlOjpWZWMzICpwb3MgPSBudWxscHRyLAorICAgIGludDE2X3QgbWFuYSA9IDE1MCwKKyAgICBpbnQxNl90IGhwID0gMTAwLAorICAgIGNvbnN0IGNoYXIgKm5hbWUgPSBudWxscHRyLAorICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+ICppbnZlbnRvcnkgPSBudWxscHRyLAorICAgIE15R2FtZTo6RXhhbXBsZTo6Q29sb3IgY29sb3IgPSBNeUdhbWU6OkV4YW1wbGU6OkNvbG9yX0JsdWUsCisgICAgTXlHYW1lOjpFeGFtcGxlOjpBbnkgdGVzdF90eXBlID0gTXlHYW1lOjpFeGFtcGxlOjpBbnlfTk9ORSwKKyAgICBmbGF0YnVmZmVyczo6T2Zmc2V0PHZvaWQ+IHRlc3QgPSAwLAorICAgIGNvbnN0IHN0ZDo6dmVjdG9yPE15R2FtZTo6RXhhbXBsZTo6VGVzdD4gKnRlc3Q0ID0gbnVsbHB0ciwKKyAgICBjb25zdCBzdGQ6OnZlY3RvcjxmbGF0YnVmZmVyczo6T2Zmc2V0PGZsYXRidWZmZXJzOjpTdHJpbmc+PiAqdGVzdGFycmF5b2ZzdHJpbmcgPSBudWxscHRyLAorICAgIHN0ZDo6dmVjdG9yPGZsYXRidWZmZXJzOjpPZmZzZXQ8TXlHYW1lOjpFeGFtcGxlOjpNb25zdGVyPj4gKnRlc3RhcnJheW9mdGFibGVzID0gbnVsbHB0ciwKKyAgICBmbGF0YnVmZmVyczo6T2Zmc2V0PE15R2FtZTo6RXhhbXBsZTo6TW9uc3Rlcj4gZW5lbXkgPSAwLAorICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+ICp0ZXN0bmVzdGVkZmxhdGJ1ZmZlciA9IG51bGxwdHIsCisgICAgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxNeUdhbWU6OkV4YW1wbGU6OlN0YXQ+IHRlc3RlbXB0eSA9IDAsCisgICAgYm9vbCB0ZXN0Ym9vbCA9IGZhbHNlLAorICAgIGludDMyX3QgdGVzdGhhc2hzMzJfZm52MSA9IDAsCisgICAgdWludDMyX3QgdGVzdGhhc2h1MzJfZm52MSA9IDAsCisgICAgaW50NjRfdCB0ZXN0aGFzaHM2NF9mbnYxID0gMCwKKyAgICB1aW50NjRfdCB0ZXN0aGFzaHU2NF9mbnYxID0gMCwKKyAgICBpbnQzMl90IHRlc3RoYXNoczMyX2ZudjFhID0gMCwKKyAgICB1aW50MzJfdCB0ZXN0aGFzaHUzMl9mbnYxYSA9IDAsCisgICAgaW50NjRfdCB0ZXN0aGFzaHM2NF9mbnYxYSA9IDAsCisgICAgdWludDY0X3QgdGVzdGhhc2h1NjRfZm52MWEgPSAwLAorICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+ICp0ZXN0YXJyYXlvZmJvb2xzID0gbnVsbHB0ciwKKyAgICBmbG9hdCB0ZXN0ZiA9IDMuMTQxNTlmLAorICAgIGZsb2F0IHRlc3RmMiA9IDMuMGYsCisgICAgZmxvYXQgdGVzdGYzID0gMC4wZiwKKyAgICBjb25zdCBzdGQ6OnZlY3RvcjxmbGF0YnVmZmVyczo6T2Zmc2V0PGZsYXRidWZmZXJzOjpTdHJpbmc+PiAqdGVzdGFycmF5b2ZzdHJpbmcyID0gbnVsbHB0ciwKKyAgICBzdGQ6OnZlY3RvcjxNeUdhbWU6OkV4YW1wbGU6OkFiaWxpdHk+ICp0ZXN0YXJyYXlvZnNvcnRlZHN0cnVjdCA9IG51bGxwdHIsCisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4gKmZsZXggPSBudWxscHRyLAorICAgIGNvbnN0IHN0ZDo6dmVjdG9yPE15R2FtZTo6RXhhbXBsZTo6VGVzdD4gKnRlc3Q1ID0gbnVsbHB0ciwKKyAgICBjb25zdCBzdGQ6OnZlY3RvcjxpbnQ2NF90PiAqdmVjdG9yX29mX2xvbmdzID0gbnVsbHB0ciwKKyAgICBjb25zdCBzdGQ6OnZlY3Rvcjxkb3VibGU+ICp2ZWN0b3Jfb2ZfZG91YmxlcyA9IG51bGxwdHIsCisgICAgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxNeUdhbWU6OkluUGFyZW50TmFtZXNwYWNlPiBwYXJlbnRfbmFtZXNwYWNlX3Rlc3QgPSAwLAorICAgIHN0ZDo6dmVjdG9yPGZsYXRidWZmZXJzOjpPZmZzZXQ8TXlHYW1lOjpFeGFtcGxlOjpSZWZlcnJhYmxlPj4gKnZlY3Rvcl9vZl9yZWZlcnJhYmxlcyA9IG51bGxwdHIsCisgICAgdWludDY0X3Qgc2luZ2xlX3dlYWtfcmVmZXJlbmNlID0gMCwKKyAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50NjRfdD4gKnZlY3Rvcl9vZl93ZWFrX3JlZmVyZW5jZXMgPSBudWxscHRyLAorICAgIHN0ZDo6dmVjdG9yPGZsYXRidWZmZXJzOjpPZmZzZXQ8TXlHYW1lOjpFeGFtcGxlOjpSZWZlcnJhYmxlPj4gKnZlY3Rvcl9vZl9zdHJvbmdfcmVmZXJyYWJsZXMgPSBudWxscHRyLAorICAgIHVpbnQ2NF90IGNvX293bmluZ19yZWZlcmVuY2UgPSAwLAorICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ2NF90PiAqdmVjdG9yX29mX2NvX293bmluZ19yZWZlcmVuY2VzID0gbnVsbHB0ciwKKyAgICB1aW50NjRfdCBub25fb3duaW5nX3JlZmVyZW5jZSA9IDAsCisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDY0X3Q+ICp2ZWN0b3Jfb2Zfbm9uX293bmluZ19yZWZlcmVuY2VzID0gbnVsbHB0ciwKKyAgICBNeUdhbWU6OkV4YW1wbGU6OkFueVVuaXF1ZUFsaWFzZXMgYW55X3VuaXF1ZV90eXBlID0gTXlHYW1lOjpFeGFtcGxlOjpBbnlVbmlxdWVBbGlhc2VzX05PTkUsCisgICAgZmxhdGJ1ZmZlcnM6Ok9mZnNldDx2b2lkPiBhbnlfdW5pcXVlID0gMCwKKyAgICBNeUdhbWU6OkV4YW1wbGU6OkFueUFtYmlndW91c0FsaWFzZXMgYW55X2FtYmlndW91c190eXBlID0gTXlHYW1lOjpFeGFtcGxlOjpBbnlBbWJpZ3VvdXNBbGlhc2VzX05PTkUsCisgICAgZmxhdGJ1ZmZlcnM6Ok9mZnNldDx2b2lkPiBhbnlfYW1iaWd1b3VzID0gMCwKKyAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiAqdmVjdG9yX29mX2VudW1zID0gbnVsbHB0ciwKKyAgICBNeUdhbWU6OkV4YW1wbGU6OlJhY2Ugc2lnbmVkX2VudW0gPSBNeUdhbWU6OkV4YW1wbGU6OlJhY2VfTm9uZSwKKyAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiAqdGVzdHJlcXVpcmVkbmVzdGVkZmxhdGJ1ZmZlciA9IG51bGxwdHIsCisgICAgc3RkOjp2ZWN0b3I8ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxNeUdhbWU6OkV4YW1wbGU6OlN0YXQ+PiAqc2NhbGFyX2tleV9zb3J0ZWRfdGFibGVzID0gbnVsbHB0ciwKKyAgICBjb25zdCBNeUdhbWU6OkV4YW1wbGU6OlRlc3QgKm5hdGl2ZV9pbmxpbmUgPSBudWxscHRyLAorICAgIE15R2FtZTo6RXhhbXBsZTo6TG9uZ0VudW0gbG9uZ19lbnVtX25vbl9lbnVtX2RlZmF1bHQgPSBzdGF0aWNfY2FzdDxNeUdhbWU6OkV4YW1wbGU6OkxvbmdFbnVtPigwKSwKKyAgICBNeUdhbWU6OkV4YW1wbGU6OkxvbmdFbnVtIGxvbmdfZW51bV9ub3JtYWxfZGVmYXVsdCA9IE15R2FtZTo6RXhhbXBsZTo6TG9uZ0VudW1fTG9uZ09uZSkgeworICBhdXRvIG5hbWVfXyA9IG5hbWUgPyBfZmJiLkNyZWF0ZVN0cmluZyhuYW1lKSA6IDA7CisgIGF1dG8gaW52ZW50b3J5X18gPSBpbnZlbnRvcnkgPyBfZmJiLkNyZWF0ZVZlY3Rvcjx1aW50OF90PigqaW52ZW50b3J5KSA6IDA7CisgIGF1dG8gdGVzdDRfXyA9IHRlc3Q0ID8gX2ZiYi5DcmVhdGVWZWN0b3JPZlN0cnVjdHM8TXlHYW1lOjpFeGFtcGxlOjpUZXN0PigqdGVzdDQpIDogMDsKKyAgYXV0byB0ZXN0YXJyYXlvZnN0cmluZ19fID0gdGVzdGFycmF5b2ZzdHJpbmcgPyBfZmJiLkNyZWF0ZVZlY3RvcjxmbGF0YnVmZmVyczo6T2Zmc2V0PGZsYXRidWZmZXJzOjpTdHJpbmc+PigqdGVzdGFycmF5b2ZzdHJpbmcpIDogMDsKKyAgYXV0byB0ZXN0YXJyYXlvZnRhYmxlc19fID0gdGVzdGFycmF5b2Z0YWJsZXMgPyBfZmJiLkNyZWF0ZVZlY3Rvck9mU29ydGVkVGFibGVzPE15R2FtZTo6RXhhbXBsZTo6TW9uc3Rlcj4odGVzdGFycmF5b2Z0YWJsZXMpIDogMDsKKyAgYXV0byB0ZXN0bmVzdGVkZmxhdGJ1ZmZlcl9fID0gdGVzdG5lc3RlZGZsYXRidWZmZXIgPyBfZmJiLkNyZWF0ZVZlY3Rvcjx1aW50OF90PigqdGVzdG5lc3RlZGZsYXRidWZmZXIpIDogMDsKKyAgYXV0byB0ZXN0YXJyYXlvZmJvb2xzX18gPSB0ZXN0YXJyYXlvZmJvb2xzID8gX2ZiYi5DcmVhdGVWZWN0b3I8dWludDhfdD4oKnRlc3RhcnJheW9mYm9vbHMpIDogMDsKKyAgYXV0byB0ZXN0YXJyYXlvZnN0cmluZzJfXyA9IHRlc3RhcnJheW9mc3RyaW5nMiA/IF9mYmIuQ3JlYXRlVmVjdG9yPGZsYXRidWZmZXJzOjpPZmZzZXQ8ZmxhdGJ1ZmZlcnM6OlN0cmluZz4+KCp0ZXN0YXJyYXlvZnN0cmluZzIpIDogMDsKKyAgYXV0byB0ZXN0YXJyYXlvZnNvcnRlZHN0cnVjdF9fID0gdGVzdGFycmF5b2Zzb3J0ZWRzdHJ1Y3QgPyBfZmJiLkNyZWF0ZVZlY3Rvck9mU29ydGVkU3RydWN0czxNeUdhbWU6OkV4YW1wbGU6OkFiaWxpdHk+KHRlc3RhcnJheW9mc29ydGVkc3RydWN0KSA6IDA7CisgIGF1dG8gZmxleF9fID0gZmxleCA/IF9mYmIuQ3JlYXRlVmVjdG9yPHVpbnQ4X3Q+KCpmbGV4KSA6IDA7CisgIGF1dG8gdGVzdDVfXyA9IHRlc3Q1ID8gX2ZiYi5DcmVhdGVWZWN0b3JPZlN0cnVjdHM8TXlHYW1lOjpFeGFtcGxlOjpUZXN0PigqdGVzdDUpIDogMDsKKyAgYXV0byB2ZWN0b3Jfb2ZfbG9uZ3NfXyA9IHZlY3Rvcl9vZl9sb25ncyA/IF9mYmIuQ3JlYXRlVmVjdG9yPGludDY0X3Q+KCp2ZWN0b3Jfb2ZfbG9uZ3MpIDogMDsKKyAgYXV0byB2ZWN0b3Jfb2ZfZG91Ymxlc19fID0gdmVjdG9yX29mX2RvdWJsZXMgPyBfZmJiLkNyZWF0ZVZlY3Rvcjxkb3VibGU+KCp2ZWN0b3Jfb2ZfZG91YmxlcykgOiAwOworICBhdXRvIHZlY3Rvcl9vZl9yZWZlcnJhYmxlc19fID0gdmVjdG9yX29mX3JlZmVycmFibGVzID8gX2ZiYi5DcmVhdGVWZWN0b3JPZlNvcnRlZFRhYmxlczxNeUdhbWU6OkV4YW1wbGU6OlJlZmVycmFibGU+KHZlY3Rvcl9vZl9yZWZlcnJhYmxlcykgOiAwOworICBhdXRvIHZlY3Rvcl9vZl93ZWFrX3JlZmVyZW5jZXNfXyA9IHZlY3Rvcl9vZl93ZWFrX3JlZmVyZW5jZXMgPyBfZmJiLkNyZWF0ZVZlY3Rvcjx1aW50NjRfdD4oKnZlY3Rvcl9vZl93ZWFrX3JlZmVyZW5jZXMpIDogMDsKKyAgYXV0byB2ZWN0b3Jfb2Zfc3Ryb25nX3JlZmVycmFibGVzX18gPSB2ZWN0b3Jfb2Zfc3Ryb25nX3JlZmVycmFibGVzID8gX2ZiYi5DcmVhdGVWZWN0b3JPZlNvcnRlZFRhYmxlczxNeUdhbWU6OkV4YW1wbGU6OlJlZmVycmFibGU+KHZlY3Rvcl9vZl9zdHJvbmdfcmVmZXJyYWJsZXMpIDogMDsKKyAgYXV0byB2ZWN0b3Jfb2ZfY29fb3duaW5nX3JlZmVyZW5jZXNfXyA9IHZlY3Rvcl9vZl9jb19vd25pbmdfcmVmZXJlbmNlcyA/IF9mYmIuQ3JlYXRlVmVjdG9yPHVpbnQ2NF90PigqdmVjdG9yX29mX2NvX293bmluZ19yZWZlcmVuY2VzKSA6IDA7CisgIGF1dG8gdmVjdG9yX29mX25vbl9vd25pbmdfcmVmZXJlbmNlc19fID0gdmVjdG9yX29mX25vbl9vd25pbmdfcmVmZXJlbmNlcyA/IF9mYmIuQ3JlYXRlVmVjdG9yPHVpbnQ2NF90PigqdmVjdG9yX29mX25vbl9vd25pbmdfcmVmZXJlbmNlcykgOiAwOworICBhdXRvIHZlY3Rvcl9vZl9lbnVtc19fID0gdmVjdG9yX29mX2VudW1zID8gX2ZiYi5DcmVhdGVWZWN0b3I8dWludDhfdD4oKnZlY3Rvcl9vZl9lbnVtcykgOiAwOworICBhdXRvIHRlc3RyZXF1aXJlZG5lc3RlZGZsYXRidWZmZXJfXyA9IHRlc3RyZXF1aXJlZG5lc3RlZGZsYXRidWZmZXIgPyBfZmJiLkNyZWF0ZVZlY3Rvcjx1aW50OF90PigqdGVzdHJlcXVpcmVkbmVzdGVkZmxhdGJ1ZmZlcikgOiAwOworICBhdXRvIHNjYWxhcl9rZXlfc29ydGVkX3RhYmxlc19fID0gc2NhbGFyX2tleV9zb3J0ZWRfdGFibGVzID8gX2ZiYi5DcmVhdGVWZWN0b3JPZlNvcnRlZFRhYmxlczxNeUdhbWU6OkV4YW1wbGU6OlN0YXQ+KHNjYWxhcl9rZXlfc29ydGVkX3RhYmxlcykgOiAwOworICByZXR1cm4gTXlHYW1lOjpFeGFtcGxlOjpDcmVhdGVNb25zdGVyKAorICAgICAgX2ZiYiwKKyAgICAgIHBvcywKKyAgICAgIG1hbmEsCisgICAgICBocCwKKyAgICAgIG5hbWVfXywKKyAgICAgIGludmVudG9yeV9fLAorICAgICAgY29sb3IsCisgICAgICB0ZXN0X3R5cGUsCisgICAgICB0ZXN0LAorICAgICAgdGVzdDRfXywKKyAgICAgIHRlc3RhcnJheW9mc3RyaW5nX18sCisgICAgICB0ZXN0YXJyYXlvZnRhYmxlc19fLAorICAgICAgZW5lbXksCisgICAgICB0ZXN0bmVzdGVkZmxhdGJ1ZmZlcl9fLAorICAgICAgdGVzdGVtcHR5LAorICAgICAgdGVzdGJvb2wsCisgICAgICB0ZXN0aGFzaHMzMl9mbnYxLAorICAgICAgdGVzdGhhc2h1MzJfZm52MSwKKyAgICAgIHRlc3RoYXNoczY0X2ZudjEsCisgICAgICB0ZXN0aGFzaHU2NF9mbnYxLAorICAgICAgdGVzdGhhc2hzMzJfZm52MWEsCisgICAgICB0ZXN0aGFzaHUzMl9mbnYxYSwKKyAgICAgIHRlc3RoYXNoczY0X2ZudjFhLAorICAgICAgdGVzdGhhc2h1NjRfZm52MWEsCisgICAgICB0ZXN0YXJyYXlvZmJvb2xzX18sCisgICAgICB0ZXN0ZiwKKyAgICAgIHRlc3RmMiwKKyAgICAgIHRlc3RmMywKKyAgICAgIHRlc3RhcnJheW9mc3RyaW5nMl9fLAorICAgICAgdGVzdGFycmF5b2Zzb3J0ZWRzdHJ1Y3RfXywKKyAgICAgIGZsZXhfXywKKyAgICAgIHRlc3Q1X18sCisgICAgICB2ZWN0b3Jfb2ZfbG9uZ3NfXywKKyAgICAgIHZlY3Rvcl9vZl9kb3VibGVzX18sCisgICAgICBwYXJlbnRfbmFtZXNwYWNlX3Rlc3QsCisgICAgICB2ZWN0b3Jfb2ZfcmVmZXJyYWJsZXNfXywKKyAgICAgIHNpbmdsZV93ZWFrX3JlZmVyZW5jZSwKKyAgICAgIHZlY3Rvcl9vZl93ZWFrX3JlZmVyZW5jZXNfXywKKyAgICAgIHZlY3Rvcl9vZl9zdHJvbmdfcmVmZXJyYWJsZXNfXywKKyAgICAgIGNvX293bmluZ19yZWZlcmVuY2UsCisgICAgICB2ZWN0b3Jfb2ZfY29fb3duaW5nX3JlZmVyZW5jZXNfXywKKyAgICAgIG5vbl9vd25pbmdfcmVmZXJlbmNlLAorICAgICAgdmVjdG9yX29mX25vbl9vd25pbmdfcmVmZXJlbmNlc19fLAorICAgICAgYW55X3VuaXF1ZV90eXBlLAorICAgICAgYW55X3VuaXF1ZSwKKyAgICAgIGFueV9hbWJpZ3VvdXNfdHlwZSwKKyAgICAgIGFueV9hbWJpZ3VvdXMsCisgICAgICB2ZWN0b3Jfb2ZfZW51bXNfXywKKyAgICAgIHNpZ25lZF9lbnVtLAorICAgICAgdGVzdHJlcXVpcmVkbmVzdGVkZmxhdGJ1ZmZlcl9fLAorICAgICAgc2NhbGFyX2tleV9zb3J0ZWRfdGFibGVzX18sCisgICAgICBuYXRpdmVfaW5saW5lLAorICAgICAgbG9uZ19lbnVtX25vbl9lbnVtX2RlZmF1bHQsCisgICAgICBsb25nX2VudW1fbm9ybWFsX2RlZmF1bHQpOworfQorCitmbGF0YnVmZmVyczo6T2Zmc2V0PE1vbnN0ZXI+IENyZWF0ZU1vbnN0ZXIoZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBNb25zdGVyVCAqX28sIGNvbnN0IGZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIgPSBudWxscHRyKTsKKworc3RydWN0IFR5cGVBbGlhc2VzVCA6IHB1YmxpYyBmbGF0YnVmZmVyczo6TmF0aXZlVGFibGUgeworICB0eXBlZGVmIFR5cGVBbGlhc2VzIFRhYmxlVHlwZTsKKyAgaW50OF90IGk4ID0gMDsKKyAgdWludDhfdCB1OCA9IDA7CisgIGludDE2X3QgaTE2ID0gMDsKKyAgdWludDE2X3QgdTE2ID0gMDsKKyAgaW50MzJfdCBpMzIgPSAwOworICB1aW50MzJfdCB1MzIgPSAwOworICBpbnQ2NF90IGk2NCA9IDA7CisgIHVpbnQ2NF90IHU2NCA9IDA7CisgIGZsb2F0IGYzMiA9IDAuMGY7CisgIGRvdWJsZSBmNjQgPSAwLjA7CisgIHN0ZDo6dmVjdG9yPGludDhfdD4gdjh7fTsKKyAgc3RkOjp2ZWN0b3I8ZG91YmxlPiB2ZjY0e307Cit9OworCitzdHJ1Y3QgVHlwZUFsaWFzZXMgRkxBVEJVRkZFUlNfRklOQUxfQ0xBU1MgOiBwcml2YXRlIGZsYXRidWZmZXJzOjpUYWJsZSB7CisgIHR5cGVkZWYgVHlwZUFsaWFzZXNUIE5hdGl2ZVRhYmxlVHlwZTsKKyAgdHlwZWRlZiBUeXBlQWxpYXNlc0J1aWxkZXIgQnVpbGRlcjsKKyAgc3RhdGljIGNvbnN0IGZsYXRidWZmZXJzOjpUeXBlVGFibGUgKk1pbmlSZWZsZWN0VHlwZVRhYmxlKCkgeworICAgIHJldHVybiBUeXBlQWxpYXNlc1R5cGVUYWJsZSgpOworICB9CisgIGVudW0gRmxhdEJ1ZmZlcnNWVGFibGVPZmZzZXQgRkxBVEJVRkZFUlNfVlRBQkxFX1VOREVSTFlJTkdfVFlQRSB7CisgICAgVlRfSTggPSA0LAorICAgIFZUX1U4ID0gNiwKKyAgICBWVF9JMTYgPSA4LAorICAgIFZUX1UxNiA9IDEwLAorICAgIFZUX0kzMiA9IDEyLAorICAgIFZUX1UzMiA9IDE0LAorICAgIFZUX0k2NCA9IDE2LAorICAgIFZUX1U2NCA9IDE4LAorICAgIFZUX0YzMiA9IDIwLAorICAgIFZUX0Y2NCA9IDIyLAorICAgIFZUX1Y4ID0gMjQsCisgICAgVlRfVkY2NCA9IDI2CisgIH07CisgIGludDhfdCBpOCgpIGNvbnN0IHsKKyAgICByZXR1cm4gR2V0RmllbGQ8aW50OF90PihWVF9JOCwgMCk7CisgIH0KKyAgYm9vbCBtdXRhdGVfaTgoaW50OF90IF9pOCA9IDApIHsKKyAgICByZXR1cm4gU2V0RmllbGQ8aW50OF90PihWVF9JOCwgX2k4LCAwKTsKKyAgfQorICB1aW50OF90IHU4KCkgY29uc3QgeworICAgIHJldHVybiBHZXRGaWVsZDx1aW50OF90PihWVF9VOCwgMCk7CisgIH0KKyAgYm9vbCBtdXRhdGVfdTgodWludDhfdCBfdTggPSAwKSB7CisgICAgcmV0dXJuIFNldEZpZWxkPHVpbnQ4X3Q+KFZUX1U4LCBfdTgsIDApOworICB9CisgIGludDE2X3QgaTE2KCkgY29uc3QgeworICAgIHJldHVybiBHZXRGaWVsZDxpbnQxNl90PihWVF9JMTYsIDApOworICB9CisgIGJvb2wgbXV0YXRlX2kxNihpbnQxNl90IF9pMTYgPSAwKSB7CisgICAgcmV0dXJuIFNldEZpZWxkPGludDE2X3Q+KFZUX0kxNiwgX2kxNiwgMCk7CisgIH0KKyAgdWludDE2X3QgdTE2KCkgY29uc3QgeworICAgIHJldHVybiBHZXRGaWVsZDx1aW50MTZfdD4oVlRfVTE2LCAwKTsKKyAgfQorICBib29sIG11dGF0ZV91MTYodWludDE2X3QgX3UxNiA9IDApIHsKKyAgICByZXR1cm4gU2V0RmllbGQ8dWludDE2X3Q+KFZUX1UxNiwgX3UxNiwgMCk7CisgIH0KKyAgaW50MzJfdCBpMzIoKSBjb25zdCB7CisgICAgcmV0dXJuIEdldEZpZWxkPGludDMyX3Q+KFZUX0kzMiwgMCk7CisgIH0KKyAgYm9vbCBtdXRhdGVfaTMyKGludDMyX3QgX2kzMiA9IDApIHsKKyAgICByZXR1cm4gU2V0RmllbGQ8aW50MzJfdD4oVlRfSTMyLCBfaTMyLCAwKTsKKyAgfQorICB1aW50MzJfdCB1MzIoKSBjb25zdCB7CisgICAgcmV0dXJuIEdldEZpZWxkPHVpbnQzMl90PihWVF9VMzIsIDApOworICB9CisgIGJvb2wgbXV0YXRlX3UzMih1aW50MzJfdCBfdTMyID0gMCkgeworICAgIHJldHVybiBTZXRGaWVsZDx1aW50MzJfdD4oVlRfVTMyLCBfdTMyLCAwKTsKKyAgfQorICBpbnQ2NF90IGk2NCgpIGNvbnN0IHsKKyAgICByZXR1cm4gR2V0RmllbGQ8aW50NjRfdD4oVlRfSTY0LCAwKTsKKyAgfQorICBib29sIG11dGF0ZV9pNjQoaW50NjRfdCBfaTY0ID0gMCkgeworICAgIHJldHVybiBTZXRGaWVsZDxpbnQ2NF90PihWVF9JNjQsIF9pNjQsIDApOworICB9CisgIHVpbnQ2NF90IHU2NCgpIGNvbnN0IHsKKyAgICByZXR1cm4gR2V0RmllbGQ8dWludDY0X3Q+KFZUX1U2NCwgMCk7CisgIH0KKyAgYm9vbCBtdXRhdGVfdTY0KHVpbnQ2NF90IF91NjQgPSAwKSB7CisgICAgcmV0dXJuIFNldEZpZWxkPHVpbnQ2NF90PihWVF9VNjQsIF91NjQsIDApOworICB9CisgIGZsb2F0IGYzMigpIGNvbnN0IHsKKyAgICByZXR1cm4gR2V0RmllbGQ8ZmxvYXQ+KFZUX0YzMiwgMC4wZik7CisgIH0KKyAgYm9vbCBtdXRhdGVfZjMyKGZsb2F0IF9mMzIgPSAwLjBmKSB7CisgICAgcmV0dXJuIFNldEZpZWxkPGZsb2F0PihWVF9GMzIsIF9mMzIsIDAuMGYpOworICB9CisgIGRvdWJsZSBmNjQoKSBjb25zdCB7CisgICAgcmV0dXJuIEdldEZpZWxkPGRvdWJsZT4oVlRfRjY0LCAwLjApOworICB9CisgIGJvb2wgbXV0YXRlX2Y2NChkb3VibGUgX2Y2NCA9IDAuMCkgeworICAgIHJldHVybiBTZXRGaWVsZDxkb3VibGU+KFZUX0Y2NCwgX2Y2NCwgMC4wKTsKKyAgfQorICBjb25zdCBmbGF0YnVmZmVyczo6VmVjdG9yPGludDhfdD4gKnY4KCkgY29uc3QgeworICAgIHJldHVybiBHZXRQb2ludGVyPGNvbnN0IGZsYXRidWZmZXJzOjpWZWN0b3I8aW50OF90PiAqPihWVF9WOCk7CisgIH0KKyAgZmxhdGJ1ZmZlcnM6OlZlY3RvcjxpbnQ4X3Q+ICptdXRhYmxlX3Y4KCkgeworICAgIHJldHVybiBHZXRQb2ludGVyPGZsYXRidWZmZXJzOjpWZWN0b3I8aW50OF90PiAqPihWVF9WOCk7CisgIH0KKyAgY29uc3QgZmxhdGJ1ZmZlcnM6OlZlY3Rvcjxkb3VibGU+ICp2ZjY0KCkgY29uc3QgeworICAgIHJldHVybiBHZXRQb2ludGVyPGNvbnN0IGZsYXRidWZmZXJzOjpWZWN0b3I8ZG91YmxlPiAqPihWVF9WRjY0KTsKKyAgfQorICBmbGF0YnVmZmVyczo6VmVjdG9yPGRvdWJsZT4gKm11dGFibGVfdmY2NCgpIHsKKyAgICByZXR1cm4gR2V0UG9pbnRlcjxmbGF0YnVmZmVyczo6VmVjdG9yPGRvdWJsZT4gKj4oVlRfVkY2NCk7CisgIH0KKyAgYm9vbCBWZXJpZnkoZmxhdGJ1ZmZlcnM6OlZlcmlmaWVyICZ2ZXJpZmllcikgY29uc3QgeworICAgIHJldHVybiBWZXJpZnlUYWJsZVN0YXJ0KHZlcmlmaWVyKSAmJgorICAgICAgICAgICBWZXJpZnlGaWVsZDxpbnQ4X3Q+KHZlcmlmaWVyLCBWVF9JOCwgMSkgJiYKKyAgICAgICAgICAgVmVyaWZ5RmllbGQ8dWludDhfdD4odmVyaWZpZXIsIFZUX1U4LCAxKSAmJgorICAgICAgICAgICBWZXJpZnlGaWVsZDxpbnQxNl90Pih2ZXJpZmllciwgVlRfSTE2LCAyKSAmJgorICAgICAgICAgICBWZXJpZnlGaWVsZDx1aW50MTZfdD4odmVyaWZpZXIsIFZUX1UxNiwgMikgJiYKKyAgICAgICAgICAgVmVyaWZ5RmllbGQ8aW50MzJfdD4odmVyaWZpZXIsIFZUX0kzMiwgNCkgJiYKKyAgICAgICAgICAgVmVyaWZ5RmllbGQ8dWludDMyX3Q+KHZlcmlmaWVyLCBWVF9VMzIsIDQpICYmCisgICAgICAgICAgIFZlcmlmeUZpZWxkPGludDY0X3Q+KHZlcmlmaWVyLCBWVF9JNjQsIDgpICYmCisgICAgICAgICAgIFZlcmlmeUZpZWxkPHVpbnQ2NF90Pih2ZXJpZmllciwgVlRfVTY0LCA4KSAmJgorICAgICAgICAgICBWZXJpZnlGaWVsZDxmbG9hdD4odmVyaWZpZXIsIFZUX0YzMiwgNCkgJiYKKyAgICAgICAgICAgVmVyaWZ5RmllbGQ8ZG91YmxlPih2ZXJpZmllciwgVlRfRjY0LCA4KSAmJgorICAgICAgICAgICBWZXJpZnlPZmZzZXQodmVyaWZpZXIsIFZUX1Y4KSAmJgorICAgICAgICAgICB2ZXJpZmllci5WZXJpZnlWZWN0b3IodjgoKSkgJiYKKyAgICAgICAgICAgVmVyaWZ5T2Zmc2V0KHZlcmlmaWVyLCBWVF9WRjY0KSAmJgorICAgICAgICAgICB2ZXJpZmllci5WZXJpZnlWZWN0b3IodmY2NCgpKSAmJgorICAgICAgICAgICB2ZXJpZmllci5FbmRUYWJsZSgpOworICB9CisgIFR5cGVBbGlhc2VzVCAqVW5QYWNrKGNvbnN0IGZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIgPSBudWxscHRyKSBjb25zdDsKKyAgdm9pZCBVblBhY2tUbyhUeXBlQWxpYXNlc1QgKl9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyID0gbnVsbHB0cikgY29uc3Q7CisgIHN0YXRpYyBmbGF0YnVmZmVyczo6T2Zmc2V0PFR5cGVBbGlhc2VzPiBQYWNrKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgVHlwZUFsaWFzZXNUKiBfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlciA9IG51bGxwdHIpOworfTsKKworc3RydWN0IFR5cGVBbGlhc2VzQnVpbGRlciB7CisgIHR5cGVkZWYgVHlwZUFsaWFzZXMgVGFibGU7CisgIGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmZmJiXzsKKyAgZmxhdGJ1ZmZlcnM6OnVvZmZzZXRfdCBzdGFydF87CisgIHZvaWQgYWRkX2k4KGludDhfdCBpOCkgeworICAgIGZiYl8uQWRkRWxlbWVudDxpbnQ4X3Q+KFR5cGVBbGlhc2VzOjpWVF9JOCwgaTgsIDApOworICB9CisgIHZvaWQgYWRkX3U4KHVpbnQ4X3QgdTgpIHsKKyAgICBmYmJfLkFkZEVsZW1lbnQ8dWludDhfdD4oVHlwZUFsaWFzZXM6OlZUX1U4LCB1OCwgMCk7CisgIH0KKyAgdm9pZCBhZGRfaTE2KGludDE2X3QgaTE2KSB7CisgICAgZmJiXy5BZGRFbGVtZW50PGludDE2X3Q+KFR5cGVBbGlhc2VzOjpWVF9JMTYsIGkxNiwgMCk7CisgIH0KKyAgdm9pZCBhZGRfdTE2KHVpbnQxNl90IHUxNikgeworICAgIGZiYl8uQWRkRWxlbWVudDx1aW50MTZfdD4oVHlwZUFsaWFzZXM6OlZUX1UxNiwgdTE2LCAwKTsKKyAgfQorICB2b2lkIGFkZF9pMzIoaW50MzJfdCBpMzIpIHsKKyAgICBmYmJfLkFkZEVsZW1lbnQ8aW50MzJfdD4oVHlwZUFsaWFzZXM6OlZUX0kzMiwgaTMyLCAwKTsKKyAgfQorICB2b2lkIGFkZF91MzIodWludDMyX3QgdTMyKSB7CisgICAgZmJiXy5BZGRFbGVtZW50PHVpbnQzMl90PihUeXBlQWxpYXNlczo6VlRfVTMyLCB1MzIsIDApOworICB9CisgIHZvaWQgYWRkX2k2NChpbnQ2NF90IGk2NCkgeworICAgIGZiYl8uQWRkRWxlbWVudDxpbnQ2NF90PihUeXBlQWxpYXNlczo6VlRfSTY0LCBpNjQsIDApOworICB9CisgIHZvaWQgYWRkX3U2NCh1aW50NjRfdCB1NjQpIHsKKyAgICBmYmJfLkFkZEVsZW1lbnQ8dWludDY0X3Q+KFR5cGVBbGlhc2VzOjpWVF9VNjQsIHU2NCwgMCk7CisgIH0KKyAgdm9pZCBhZGRfZjMyKGZsb2F0IGYzMikgeworICAgIGZiYl8uQWRkRWxlbWVudDxmbG9hdD4oVHlwZUFsaWFzZXM6OlZUX0YzMiwgZjMyLCAwLjBmKTsKKyAgfQorICB2b2lkIGFkZF9mNjQoZG91YmxlIGY2NCkgeworICAgIGZiYl8uQWRkRWxlbWVudDxkb3VibGU+KFR5cGVBbGlhc2VzOjpWVF9GNjQsIGY2NCwgMC4wKTsKKyAgfQorICB2b2lkIGFkZF92OChmbGF0YnVmZmVyczo6T2Zmc2V0PGZsYXRidWZmZXJzOjpWZWN0b3I8aW50OF90Pj4gdjgpIHsKKyAgICBmYmJfLkFkZE9mZnNldChUeXBlQWxpYXNlczo6VlRfVjgsIHY4KTsKKyAgfQorICB2b2lkIGFkZF92ZjY0KGZsYXRidWZmZXJzOjpPZmZzZXQ8ZmxhdGJ1ZmZlcnM6OlZlY3Rvcjxkb3VibGU+PiB2ZjY0KSB7CisgICAgZmJiXy5BZGRPZmZzZXQoVHlwZUFsaWFzZXM6OlZUX1ZGNjQsIHZmNjQpOworICB9CisgIGV4cGxpY2l0IFR5cGVBbGlhc2VzQnVpbGRlcihmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIpCisgICAgICAgIDogZmJiXyhfZmJiKSB7CisgICAgc3RhcnRfID0gZmJiXy5TdGFydFRhYmxlKCk7CisgIH0KKyAgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxUeXBlQWxpYXNlcz4gRmluaXNoKCkgeworICAgIGNvbnN0IGF1dG8gZW5kID0gZmJiXy5FbmRUYWJsZShzdGFydF8pOworICAgIGF1dG8gbyA9IGZsYXRidWZmZXJzOjpPZmZzZXQ8VHlwZUFsaWFzZXM+KGVuZCk7CisgICAgcmV0dXJuIG87CisgIH0KK307CisKK2lubGluZSBmbGF0YnVmZmVyczo6T2Zmc2V0PFR5cGVBbGlhc2VzPiBDcmVhdGVUeXBlQWxpYXNlcygKKyAgICBmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsCisgICAgaW50OF90IGk4ID0gMCwKKyAgICB1aW50OF90IHU4ID0gMCwKKyAgICBpbnQxNl90IGkxNiA9IDAsCisgICAgdWludDE2X3QgdTE2ID0gMCwKKyAgICBpbnQzMl90IGkzMiA9IDAsCisgICAgdWludDMyX3QgdTMyID0gMCwKKyAgICBpbnQ2NF90IGk2NCA9IDAsCisgICAgdWludDY0X3QgdTY0ID0gMCwKKyAgICBmbG9hdCBmMzIgPSAwLjBmLAorICAgIGRvdWJsZSBmNjQgPSAwLjAsCisgICAgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxmbGF0YnVmZmVyczo6VmVjdG9yPGludDhfdD4+IHY4ID0gMCwKKyAgICBmbGF0YnVmZmVyczo6T2Zmc2V0PGZsYXRidWZmZXJzOjpWZWN0b3I8ZG91YmxlPj4gdmY2NCA9IDApIHsKKyAgVHlwZUFsaWFzZXNCdWlsZGVyIGJ1aWxkZXJfKF9mYmIpOworICBidWlsZGVyXy5hZGRfZjY0KGY2NCk7CisgIGJ1aWxkZXJfLmFkZF91NjQodTY0KTsKKyAgYnVpbGRlcl8uYWRkX2k2NChpNjQpOworICBidWlsZGVyXy5hZGRfdmY2NCh2ZjY0KTsKKyAgYnVpbGRlcl8uYWRkX3Y4KHY4KTsKKyAgYnVpbGRlcl8uYWRkX2YzMihmMzIpOworICBidWlsZGVyXy5hZGRfdTMyKHUzMik7CisgIGJ1aWxkZXJfLmFkZF9pMzIoaTMyKTsKKyAgYnVpbGRlcl8uYWRkX3UxNih1MTYpOworICBidWlsZGVyXy5hZGRfaTE2KGkxNik7CisgIGJ1aWxkZXJfLmFkZF91OCh1OCk7CisgIGJ1aWxkZXJfLmFkZF9pOChpOCk7CisgIHJldHVybiBidWlsZGVyXy5GaW5pc2goKTsKK30KKworaW5saW5lIGZsYXRidWZmZXJzOjpPZmZzZXQ8VHlwZUFsaWFzZXM+IENyZWF0ZVR5cGVBbGlhc2VzRGlyZWN0KAorICAgIGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwKKyAgICBpbnQ4X3QgaTggPSAwLAorICAgIHVpbnQ4X3QgdTggPSAwLAorICAgIGludDE2X3QgaTE2ID0gMCwKKyAgICB1aW50MTZfdCB1MTYgPSAwLAorICAgIGludDMyX3QgaTMyID0gMCwKKyAgICB1aW50MzJfdCB1MzIgPSAwLAorICAgIGludDY0X3QgaTY0ID0gMCwKKyAgICB1aW50NjRfdCB1NjQgPSAwLAorICAgIGZsb2F0IGYzMiA9IDAuMGYsCisgICAgZG91YmxlIGY2NCA9IDAuMCwKKyAgICBjb25zdCBzdGQ6OnZlY3RvcjxpbnQ4X3Q+ICp2OCA9IG51bGxwdHIsCisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8ZG91YmxlPiAqdmY2NCA9IG51bGxwdHIpIHsKKyAgYXV0byB2OF9fID0gdjggPyBfZmJiLkNyZWF0ZVZlY3RvcjxpbnQ4X3Q+KCp2OCkgOiAwOworICBhdXRvIHZmNjRfXyA9IHZmNjQgPyBfZmJiLkNyZWF0ZVZlY3Rvcjxkb3VibGU+KCp2ZjY0KSA6IDA7CisgIHJldHVybiBNeUdhbWU6OkV4YW1wbGU6OkNyZWF0ZVR5cGVBbGlhc2VzKAorICAgICAgX2ZiYiwKKyAgICAgIGk4LAorICAgICAgdTgsCisgICAgICBpMTYsCisgICAgICB1MTYsCisgICAgICBpMzIsCisgICAgICB1MzIsCisgICAgICBpNjQsCisgICAgICB1NjQsCisgICAgICBmMzIsCisgICAgICBmNjQsCisgICAgICB2OF9fLAorICAgICAgdmY2NF9fKTsKK30KKworZmxhdGJ1ZmZlcnM6Ok9mZnNldDxUeXBlQWxpYXNlcz4gQ3JlYXRlVHlwZUFsaWFzZXMoZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBUeXBlQWxpYXNlc1QgKl9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyID0gbnVsbHB0cik7CisKK30gIC8vIG5hbWVzcGFjZSBFeGFtcGxlCisKKworaW5saW5lIGJvb2wgb3BlcmF0b3I9PShjb25zdCBJblBhcmVudE5hbWVzcGFjZVQgJiwgY29uc3QgSW5QYXJlbnROYW1lc3BhY2VUICYpIHsKKyAgcmV0dXJuIHRydWU7Cit9CisKK2lubGluZSBib29sIG9wZXJhdG9yIT0oY29uc3QgSW5QYXJlbnROYW1lc3BhY2VUICZsaHMsIGNvbnN0IEluUGFyZW50TmFtZXNwYWNlVCAmcmhzKSB7CisgICAgcmV0dXJuICEobGhzID09IHJocyk7Cit9CisKKworaW5saW5lIEluUGFyZW50TmFtZXNwYWNlVCAqSW5QYXJlbnROYW1lc3BhY2U6OlVuUGFjayhjb25zdCBmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyKSBjb25zdCB7CisgIGF1dG8gX28gPSBzdGQ6OnVuaXF1ZV9wdHI8SW5QYXJlbnROYW1lc3BhY2VUPihuZXcgSW5QYXJlbnROYW1lc3BhY2VUKCkpOworICBVblBhY2tUbyhfby5nZXQoKSwgX3Jlc29sdmVyKTsKKyAgcmV0dXJuIF9vLnJlbGVhc2UoKTsKK30KKworaW5saW5lIHZvaWQgSW5QYXJlbnROYW1lc3BhY2U6OlVuUGFja1RvKEluUGFyZW50TmFtZXNwYWNlVCAqX28sIGNvbnN0IGZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIpIGNvbnN0IHsKKyAgKHZvaWQpX287CisgICh2b2lkKV9yZXNvbHZlcjsKK30KKworaW5saW5lIGZsYXRidWZmZXJzOjpPZmZzZXQ8SW5QYXJlbnROYW1lc3BhY2U+IEluUGFyZW50TmFtZXNwYWNlOjpQYWNrKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgSW5QYXJlbnROYW1lc3BhY2VUKiBfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlcikgeworICByZXR1cm4gQ3JlYXRlSW5QYXJlbnROYW1lc3BhY2UoX2ZiYiwgX28sIF9yZWhhc2hlcik7Cit9CisKK2lubGluZSBmbGF0YnVmZmVyczo6T2Zmc2V0PEluUGFyZW50TmFtZXNwYWNlPiBDcmVhdGVJblBhcmVudE5hbWVzcGFjZShmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IEluUGFyZW50TmFtZXNwYWNlVCAqX28sIGNvbnN0IGZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIpIHsKKyAgKHZvaWQpX3JlaGFzaGVyOworICAodm9pZClfbzsKKyAgc3RydWN0IF9WZWN0b3JBcmdzIHsgZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICpfX2ZiYjsgY29uc3QgSW5QYXJlbnROYW1lc3BhY2VUKiBfX287IGNvbnN0IGZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfX3JlaGFzaGVyOyB9IF92YSA9IHsgJl9mYmIsIF9vLCBfcmVoYXNoZXJ9OyAodm9pZClfdmE7CisgIHJldHVybiBNeUdhbWU6OkNyZWF0ZUluUGFyZW50TmFtZXNwYWNlKAorICAgICAgX2ZiYik7Cit9CisKK25hbWVzcGFjZSBFeGFtcGxlMiB7CisKKworaW5saW5lIGJvb2wgb3BlcmF0b3I9PShjb25zdCBNb25zdGVyVCAmLCBjb25zdCBNb25zdGVyVCAmKSB7CisgIHJldHVybiB0cnVlOworfQorCitpbmxpbmUgYm9vbCBvcGVyYXRvciE9KGNvbnN0IE1vbnN0ZXJUICZsaHMsIGNvbnN0IE1vbnN0ZXJUICZyaHMpIHsKKyAgICByZXR1cm4gIShsaHMgPT0gcmhzKTsKK30KKworCitpbmxpbmUgTW9uc3RlclQgKk1vbnN0ZXI6OlVuUGFjayhjb25zdCBmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyKSBjb25zdCB7CisgIGF1dG8gX28gPSBzdGQ6OnVuaXF1ZV9wdHI8TW9uc3RlclQ+KG5ldyBNb25zdGVyVCgpKTsKKyAgVW5QYWNrVG8oX28uZ2V0KCksIF9yZXNvbHZlcik7CisgIHJldHVybiBfby5yZWxlYXNlKCk7Cit9CisKK2lubGluZSB2b2lkIE1vbnN0ZXI6OlVuUGFja1RvKE1vbnN0ZXJUICpfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlcikgY29uc3QgeworICAodm9pZClfbzsKKyAgKHZvaWQpX3Jlc29sdmVyOworfQorCitpbmxpbmUgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxNb25zdGVyPiBNb25zdGVyOjpQYWNrKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgTW9uc3RlclQqIF9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyKSB7CisgIHJldHVybiBDcmVhdGVNb25zdGVyKF9mYmIsIF9vLCBfcmVoYXNoZXIpOworfQorCitpbmxpbmUgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxNb25zdGVyPiBDcmVhdGVNb25zdGVyKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgTW9uc3RlclQgKl9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyKSB7CisgICh2b2lkKV9yZWhhc2hlcjsKKyAgKHZvaWQpX287CisgIHN0cnVjdCBfVmVjdG9yQXJncyB7IGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAqX19mYmI7IGNvbnN0IE1vbnN0ZXJUKiBfX287IGNvbnN0IGZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfX3JlaGFzaGVyOyB9IF92YSA9IHsgJl9mYmIsIF9vLCBfcmVoYXNoZXJ9OyAodm9pZClfdmE7CisgIHJldHVybiBNeUdhbWU6OkV4YW1wbGUyOjpDcmVhdGVNb25zdGVyKAorICAgICAgX2ZiYik7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBFeGFtcGxlMgorCituYW1lc3BhY2UgRXhhbXBsZSB7CisKKworaW5saW5lIGJvb2wgb3BlcmF0b3I9PShjb25zdCBUZXN0U2ltcGxlVGFibGVXaXRoRW51bVQgJmxocywgY29uc3QgVGVzdFNpbXBsZVRhYmxlV2l0aEVudW1UICZyaHMpIHsKKyAgcmV0dXJuCisgICAgICAobGhzLmNvbG9yID09IHJocy5jb2xvcik7Cit9CisKK2lubGluZSBib29sIG9wZXJhdG9yIT0oY29uc3QgVGVzdFNpbXBsZVRhYmxlV2l0aEVudW1UICZsaHMsIGNvbnN0IFRlc3RTaW1wbGVUYWJsZVdpdGhFbnVtVCAmcmhzKSB7CisgICAgcmV0dXJuICEobGhzID09IHJocyk7Cit9CisKKworaW5saW5lIFRlc3RTaW1wbGVUYWJsZVdpdGhFbnVtVCAqVGVzdFNpbXBsZVRhYmxlV2l0aEVudW06OlVuUGFjayhjb25zdCBmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyKSBjb25zdCB7CisgIGF1dG8gX28gPSBzdGQ6OnVuaXF1ZV9wdHI8VGVzdFNpbXBsZVRhYmxlV2l0aEVudW1UPihuZXcgVGVzdFNpbXBsZVRhYmxlV2l0aEVudW1UKCkpOworICBVblBhY2tUbyhfby5nZXQoKSwgX3Jlc29sdmVyKTsKKyAgcmV0dXJuIF9vLnJlbGVhc2UoKTsKK30KKworaW5saW5lIHZvaWQgVGVzdFNpbXBsZVRhYmxlV2l0aEVudW06OlVuUGFja1RvKFRlc3RTaW1wbGVUYWJsZVdpdGhFbnVtVCAqX28sIGNvbnN0IGZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIpIGNvbnN0IHsKKyAgKHZvaWQpX287CisgICh2b2lkKV9yZXNvbHZlcjsKKyAgeyBhdXRvIF9lID0gY29sb3IoKTsgX28tPmNvbG9yID0gX2U7IH0KK30KKworaW5saW5lIGZsYXRidWZmZXJzOjpPZmZzZXQ8VGVzdFNpbXBsZVRhYmxlV2l0aEVudW0+IFRlc3RTaW1wbGVUYWJsZVdpdGhFbnVtOjpQYWNrKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgVGVzdFNpbXBsZVRhYmxlV2l0aEVudW1UKiBfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlcikgeworICByZXR1cm4gQ3JlYXRlVGVzdFNpbXBsZVRhYmxlV2l0aEVudW0oX2ZiYiwgX28sIF9yZWhhc2hlcik7Cit9CisKK2lubGluZSBmbGF0YnVmZmVyczo6T2Zmc2V0PFRlc3RTaW1wbGVUYWJsZVdpdGhFbnVtPiBDcmVhdGVUZXN0U2ltcGxlVGFibGVXaXRoRW51bShmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IFRlc3RTaW1wbGVUYWJsZVdpdGhFbnVtVCAqX28sIGNvbnN0IGZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIpIHsKKyAgKHZvaWQpX3JlaGFzaGVyOworICAodm9pZClfbzsKKyAgc3RydWN0IF9WZWN0b3JBcmdzIHsgZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICpfX2ZiYjsgY29uc3QgVGVzdFNpbXBsZVRhYmxlV2l0aEVudW1UKiBfX287IGNvbnN0IGZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfX3JlaGFzaGVyOyB9IF92YSA9IHsgJl9mYmIsIF9vLCBfcmVoYXNoZXJ9OyAodm9pZClfdmE7CisgIGF1dG8gX2NvbG9yID0gX28tPmNvbG9yOworICByZXR1cm4gTXlHYW1lOjpFeGFtcGxlOjpDcmVhdGVUZXN0U2ltcGxlVGFibGVXaXRoRW51bSgKKyAgICAgIF9mYmIsCisgICAgICBfY29sb3IpOworfQorCisKK2lubGluZSBib29sIG9wZXJhdG9yPT0oY29uc3QgU3RhdFQgJmxocywgY29uc3QgU3RhdFQgJnJocykgeworICByZXR1cm4KKyAgICAgIChsaHMuaWQgPT0gcmhzLmlkKSAmJgorICAgICAgKGxocy52YWwgPT0gcmhzLnZhbCkgJiYKKyAgICAgIChsaHMuY291bnQgPT0gcmhzLmNvdW50KTsKK30KKworaW5saW5lIGJvb2wgb3BlcmF0b3IhPShjb25zdCBTdGF0VCAmbGhzLCBjb25zdCBTdGF0VCAmcmhzKSB7CisgICAgcmV0dXJuICEobGhzID09IHJocyk7Cit9CisKKworaW5saW5lIFN0YXRUICpTdGF0OjpVblBhY2soY29uc3QgZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlcikgY29uc3QgeworICBhdXRvIF9vID0gc3RkOjp1bmlxdWVfcHRyPFN0YXRUPihuZXcgU3RhdFQoKSk7CisgIFVuUGFja1RvKF9vLmdldCgpLCBfcmVzb2x2ZXIpOworICByZXR1cm4gX28ucmVsZWFzZSgpOworfQorCitpbmxpbmUgdm9pZCBTdGF0OjpVblBhY2tUbyhTdGF0VCAqX28sIGNvbnN0IGZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIpIGNvbnN0IHsKKyAgKHZvaWQpX287CisgICh2b2lkKV9yZXNvbHZlcjsKKyAgeyBhdXRvIF9lID0gaWQoKTsgaWYgKF9lKSBfby0+aWQgPSBfZS0+c3RyKCk7IH0KKyAgeyBhdXRvIF9lID0gdmFsKCk7IF9vLT52YWwgPSBfZTsgfQorICB7IGF1dG8gX2UgPSBjb3VudCgpOyBfby0+Y291bnQgPSBfZTsgfQorfQorCitpbmxpbmUgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxTdGF0PiBTdGF0OjpQYWNrKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgU3RhdFQqIF9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyKSB7CisgIHJldHVybiBDcmVhdGVTdGF0KF9mYmIsIF9vLCBfcmVoYXNoZXIpOworfQorCitpbmxpbmUgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxTdGF0PiBDcmVhdGVTdGF0KGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgU3RhdFQgKl9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyKSB7CisgICh2b2lkKV9yZWhhc2hlcjsKKyAgKHZvaWQpX287CisgIHN0cnVjdCBfVmVjdG9yQXJncyB7IGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAqX19mYmI7IGNvbnN0IFN0YXRUKiBfX287IGNvbnN0IGZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfX3JlaGFzaGVyOyB9IF92YSA9IHsgJl9mYmIsIF9vLCBfcmVoYXNoZXJ9OyAodm9pZClfdmE7CisgIGF1dG8gX2lkID0gX28tPmlkLmVtcHR5KCkgPyAwIDogX2ZiYi5DcmVhdGVTdHJpbmcoX28tPmlkKTsKKyAgYXV0byBfdmFsID0gX28tPnZhbDsKKyAgYXV0byBfY291bnQgPSBfby0+Y291bnQ7CisgIHJldHVybiBNeUdhbWU6OkV4YW1wbGU6OkNyZWF0ZVN0YXQoCisgICAgICBfZmJiLAorICAgICAgX2lkLAorICAgICAgX3ZhbCwKKyAgICAgIF9jb3VudCk7Cit9CisKKworaW5saW5lIGJvb2wgb3BlcmF0b3I9PShjb25zdCBSZWZlcnJhYmxlVCAmbGhzLCBjb25zdCBSZWZlcnJhYmxlVCAmcmhzKSB7CisgIHJldHVybgorICAgICAgKGxocy5pZCA9PSByaHMuaWQpOworfQorCitpbmxpbmUgYm9vbCBvcGVyYXRvciE9KGNvbnN0IFJlZmVycmFibGVUICZsaHMsIGNvbnN0IFJlZmVycmFibGVUICZyaHMpIHsKKyAgICByZXR1cm4gIShsaHMgPT0gcmhzKTsKK30KKworCitpbmxpbmUgUmVmZXJyYWJsZVQgKlJlZmVycmFibGU6OlVuUGFjayhjb25zdCBmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyKSBjb25zdCB7CisgIGF1dG8gX28gPSBzdGQ6OnVuaXF1ZV9wdHI8UmVmZXJyYWJsZVQ+KG5ldyBSZWZlcnJhYmxlVCgpKTsKKyAgVW5QYWNrVG8oX28uZ2V0KCksIF9yZXNvbHZlcik7CisgIHJldHVybiBfby5yZWxlYXNlKCk7Cit9CisKK2lubGluZSB2b2lkIFJlZmVycmFibGU6OlVuUGFja1RvKFJlZmVycmFibGVUICpfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlcikgY29uc3QgeworICAodm9pZClfbzsKKyAgKHZvaWQpX3Jlc29sdmVyOworICB7IGF1dG8gX2UgPSBpZCgpOyBfby0+aWQgPSBfZTsgfQorfQorCitpbmxpbmUgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxSZWZlcnJhYmxlPiBSZWZlcnJhYmxlOjpQYWNrKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgUmVmZXJyYWJsZVQqIF9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyKSB7CisgIHJldHVybiBDcmVhdGVSZWZlcnJhYmxlKF9mYmIsIF9vLCBfcmVoYXNoZXIpOworfQorCitpbmxpbmUgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxSZWZlcnJhYmxlPiBDcmVhdGVSZWZlcnJhYmxlKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgUmVmZXJyYWJsZVQgKl9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyKSB7CisgICh2b2lkKV9yZWhhc2hlcjsKKyAgKHZvaWQpX287CisgIHN0cnVjdCBfVmVjdG9yQXJncyB7IGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAqX19mYmI7IGNvbnN0IFJlZmVycmFibGVUKiBfX287IGNvbnN0IGZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfX3JlaGFzaGVyOyB9IF92YSA9IHsgJl9mYmIsIF9vLCBfcmVoYXNoZXJ9OyAodm9pZClfdmE7CisgIGF1dG8gX2lkID0gX28tPmlkOworICByZXR1cm4gTXlHYW1lOjpFeGFtcGxlOjpDcmVhdGVSZWZlcnJhYmxlKAorICAgICAgX2ZiYiwKKyAgICAgIF9pZCk7Cit9CisKKworaW5saW5lIGJvb2wgb3BlcmF0b3I9PShjb25zdCBNb25zdGVyVCAmbGhzLCBjb25zdCBNb25zdGVyVCAmcmhzKSB7CisgIHJldHVybgorICAgICAgKChsaHMucG9zID09IHJocy5wb3MpIHx8IChsaHMucG9zICYmIHJocy5wb3MgJiYgKmxocy5wb3MgPT0gKnJocy5wb3MpKSAmJgorICAgICAgKGxocy5tYW5hID09IHJocy5tYW5hKSAmJgorICAgICAgKGxocy5ocCA9PSByaHMuaHApICYmCisgICAgICAobGhzLm5hbWUgPT0gcmhzLm5hbWUpICYmCisgICAgICAobGhzLmludmVudG9yeSA9PSByaHMuaW52ZW50b3J5KSAmJgorICAgICAgKGxocy5jb2xvciA9PSByaHMuY29sb3IpICYmCisgICAgICAobGhzLnRlc3QgPT0gcmhzLnRlc3QpICYmCisgICAgICAobGhzLnRlc3Q0ID09IHJocy50ZXN0NCkgJiYKKyAgICAgIChsaHMudGVzdGFycmF5b2ZzdHJpbmcgPT0gcmhzLnRlc3RhcnJheW9mc3RyaW5nKSAmJgorICAgICAgKGxocy50ZXN0YXJyYXlvZnRhYmxlcy5zaXplKCkgPT0gcmhzLnRlc3RhcnJheW9mdGFibGVzLnNpemUoKSAmJiBzdGQ6OmVxdWFsKGxocy50ZXN0YXJyYXlvZnRhYmxlcy5jYmVnaW4oKSwgbGhzLnRlc3RhcnJheW9mdGFibGVzLmNlbmQoKSwgcmhzLnRlc3RhcnJheW9mdGFibGVzLmNiZWdpbigpLCBbXShmbGF0YnVmZmVyczo6dW5pcXVlX3B0cjxNeUdhbWU6OkV4YW1wbGU6Ok1vbnN0ZXJUPiBjb25zdCAmYSwgZmxhdGJ1ZmZlcnM6OnVuaXF1ZV9wdHI8TXlHYW1lOjpFeGFtcGxlOjpNb25zdGVyVD4gY29uc3QgJmIpIHsgcmV0dXJuIChhID09IGIpIHx8IChhICYmIGIgJiYgKmEgPT0gKmIpOyB9KSkgJiYKKyAgICAgICgobGhzLmVuZW15ID09IHJocy5lbmVteSkgfHwgKGxocy5lbmVteSAmJiByaHMuZW5lbXkgJiYgKmxocy5lbmVteSA9PSAqcmhzLmVuZW15KSkgJiYKKyAgICAgIChsaHMudGVzdG5lc3RlZGZsYXRidWZmZXIgPT0gcmhzLnRlc3RuZXN0ZWRmbGF0YnVmZmVyKSAmJgorICAgICAgKChsaHMudGVzdGVtcHR5ID09IHJocy50ZXN0ZW1wdHkpIHx8IChsaHMudGVzdGVtcHR5ICYmIHJocy50ZXN0ZW1wdHkgJiYgKmxocy50ZXN0ZW1wdHkgPT0gKnJocy50ZXN0ZW1wdHkpKSAmJgorICAgICAgKGxocy50ZXN0Ym9vbCA9PSByaHMudGVzdGJvb2wpICYmCisgICAgICAobGhzLnRlc3RoYXNoczMyX2ZudjEgPT0gcmhzLnRlc3RoYXNoczMyX2ZudjEpICYmCisgICAgICAobGhzLnRlc3RoYXNodTMyX2ZudjEgPT0gcmhzLnRlc3RoYXNodTMyX2ZudjEpICYmCisgICAgICAobGhzLnRlc3RoYXNoczY0X2ZudjEgPT0gcmhzLnRlc3RoYXNoczY0X2ZudjEpICYmCisgICAgICAobGhzLnRlc3RoYXNodTY0X2ZudjEgPT0gcmhzLnRlc3RoYXNodTY0X2ZudjEpICYmCisgICAgICAobGhzLnRlc3RoYXNoczMyX2ZudjFhID09IHJocy50ZXN0aGFzaHMzMl9mbnYxYSkgJiYKKyAgICAgIChsaHMudGVzdGhhc2h1MzJfZm52MWEgPT0gcmhzLnRlc3RoYXNodTMyX2ZudjFhKSAmJgorICAgICAgKGxocy50ZXN0aGFzaHM2NF9mbnYxYSA9PSByaHMudGVzdGhhc2hzNjRfZm52MWEpICYmCisgICAgICAobGhzLnRlc3RoYXNodTY0X2ZudjFhID09IHJocy50ZXN0aGFzaHU2NF9mbnYxYSkgJiYKKyAgICAgIChsaHMudGVzdGFycmF5b2Zib29scyA9PSByaHMudGVzdGFycmF5b2Zib29scykgJiYKKyAgICAgIChsaHMudGVzdGYgPT0gcmhzLnRlc3RmKSAmJgorICAgICAgKGxocy50ZXN0ZjIgPT0gcmhzLnRlc3RmMikgJiYKKyAgICAgIChsaHMudGVzdGYzID09IHJocy50ZXN0ZjMpICYmCisgICAgICAobGhzLnRlc3RhcnJheW9mc3RyaW5nMiA9PSByaHMudGVzdGFycmF5b2ZzdHJpbmcyKSAmJgorICAgICAgKGxocy50ZXN0YXJyYXlvZnNvcnRlZHN0cnVjdCA9PSByaHMudGVzdGFycmF5b2Zzb3J0ZWRzdHJ1Y3QpICYmCisgICAgICAobGhzLmZsZXggPT0gcmhzLmZsZXgpICYmCisgICAgICAobGhzLnRlc3Q1ID09IHJocy50ZXN0NSkgJiYKKyAgICAgIChsaHMudmVjdG9yX29mX2xvbmdzID09IHJocy52ZWN0b3Jfb2ZfbG9uZ3MpICYmCisgICAgICAobGhzLnZlY3Rvcl9vZl9kb3VibGVzID09IHJocy52ZWN0b3Jfb2ZfZG91YmxlcykgJiYKKyAgICAgICgobGhzLnBhcmVudF9uYW1lc3BhY2VfdGVzdCA9PSByaHMucGFyZW50X25hbWVzcGFjZV90ZXN0KSB8fCAobGhzLnBhcmVudF9uYW1lc3BhY2VfdGVzdCAmJiByaHMucGFyZW50X25hbWVzcGFjZV90ZXN0ICYmICpsaHMucGFyZW50X25hbWVzcGFjZV90ZXN0ID09ICpyaHMucGFyZW50X25hbWVzcGFjZV90ZXN0KSkgJiYKKyAgICAgIChsaHMudmVjdG9yX29mX3JlZmVycmFibGVzLnNpemUoKSA9PSByaHMudmVjdG9yX29mX3JlZmVycmFibGVzLnNpemUoKSAmJiBzdGQ6OmVxdWFsKGxocy52ZWN0b3Jfb2ZfcmVmZXJyYWJsZXMuY2JlZ2luKCksIGxocy52ZWN0b3Jfb2ZfcmVmZXJyYWJsZXMuY2VuZCgpLCByaHMudmVjdG9yX29mX3JlZmVycmFibGVzLmNiZWdpbigpLCBbXShmbGF0YnVmZmVyczo6dW5pcXVlX3B0cjxNeUdhbWU6OkV4YW1wbGU6OlJlZmVycmFibGVUPiBjb25zdCAmYSwgZmxhdGJ1ZmZlcnM6OnVuaXF1ZV9wdHI8TXlHYW1lOjpFeGFtcGxlOjpSZWZlcnJhYmxlVD4gY29uc3QgJmIpIHsgcmV0dXJuIChhID09IGIpIHx8IChhICYmIGIgJiYgKmEgPT0gKmIpOyB9KSkgJiYKKyAgICAgIChsaHMuc2luZ2xlX3dlYWtfcmVmZXJlbmNlID09IHJocy5zaW5nbGVfd2Vha19yZWZlcmVuY2UpICYmCisgICAgICAobGhzLnZlY3Rvcl9vZl93ZWFrX3JlZmVyZW5jZXMgPT0gcmhzLnZlY3Rvcl9vZl93ZWFrX3JlZmVyZW5jZXMpICYmCisgICAgICAobGhzLnZlY3Rvcl9vZl9zdHJvbmdfcmVmZXJyYWJsZXMuc2l6ZSgpID09IHJocy52ZWN0b3Jfb2Zfc3Ryb25nX3JlZmVycmFibGVzLnNpemUoKSAmJiBzdGQ6OmVxdWFsKGxocy52ZWN0b3Jfb2Zfc3Ryb25nX3JlZmVycmFibGVzLmNiZWdpbigpLCBsaHMudmVjdG9yX29mX3N0cm9uZ19yZWZlcnJhYmxlcy5jZW5kKCksIHJocy52ZWN0b3Jfb2Zfc3Ryb25nX3JlZmVycmFibGVzLmNiZWdpbigpLCBbXShmbGF0YnVmZmVyczo6dW5pcXVlX3B0cjxNeUdhbWU6OkV4YW1wbGU6OlJlZmVycmFibGVUPiBjb25zdCAmYSwgZmxhdGJ1ZmZlcnM6OnVuaXF1ZV9wdHI8TXlHYW1lOjpFeGFtcGxlOjpSZWZlcnJhYmxlVD4gY29uc3QgJmIpIHsgcmV0dXJuIChhID09IGIpIHx8IChhICYmIGIgJiYgKmEgPT0gKmIpOyB9KSkgJiYKKyAgICAgIChsaHMuY29fb3duaW5nX3JlZmVyZW5jZSA9PSByaHMuY29fb3duaW5nX3JlZmVyZW5jZSkgJiYKKyAgICAgIChsaHMudmVjdG9yX29mX2NvX293bmluZ19yZWZlcmVuY2VzID09IHJocy52ZWN0b3Jfb2ZfY29fb3duaW5nX3JlZmVyZW5jZXMpICYmCisgICAgICAobGhzLm5vbl9vd25pbmdfcmVmZXJlbmNlID09IHJocy5ub25fb3duaW5nX3JlZmVyZW5jZSkgJiYKKyAgICAgIChsaHMudmVjdG9yX29mX25vbl9vd25pbmdfcmVmZXJlbmNlcyA9PSByaHMudmVjdG9yX29mX25vbl9vd25pbmdfcmVmZXJlbmNlcykgJiYKKyAgICAgIChsaHMuYW55X3VuaXF1ZSA9PSByaHMuYW55X3VuaXF1ZSkgJiYKKyAgICAgIChsaHMuYW55X2FtYmlndW91cyA9PSByaHMuYW55X2FtYmlndW91cykgJiYKKyAgICAgIChsaHMudmVjdG9yX29mX2VudW1zID09IHJocy52ZWN0b3Jfb2ZfZW51bXMpICYmCisgICAgICAobGhzLnNpZ25lZF9lbnVtID09IHJocy5zaWduZWRfZW51bSkgJiYKKyAgICAgIChsaHMudGVzdHJlcXVpcmVkbmVzdGVkZmxhdGJ1ZmZlciA9PSByaHMudGVzdHJlcXVpcmVkbmVzdGVkZmxhdGJ1ZmZlcikgJiYKKyAgICAgIChsaHMuc2NhbGFyX2tleV9zb3J0ZWRfdGFibGVzLnNpemUoKSA9PSByaHMuc2NhbGFyX2tleV9zb3J0ZWRfdGFibGVzLnNpemUoKSAmJiBzdGQ6OmVxdWFsKGxocy5zY2FsYXJfa2V5X3NvcnRlZF90YWJsZXMuY2JlZ2luKCksIGxocy5zY2FsYXJfa2V5X3NvcnRlZF90YWJsZXMuY2VuZCgpLCByaHMuc2NhbGFyX2tleV9zb3J0ZWRfdGFibGVzLmNiZWdpbigpLCBbXShmbGF0YnVmZmVyczo6dW5pcXVlX3B0cjxNeUdhbWU6OkV4YW1wbGU6OlN0YXRUPiBjb25zdCAmYSwgZmxhdGJ1ZmZlcnM6OnVuaXF1ZV9wdHI8TXlHYW1lOjpFeGFtcGxlOjpTdGF0VD4gY29uc3QgJmIpIHsgcmV0dXJuIChhID09IGIpIHx8IChhICYmIGIgJiYgKmEgPT0gKmIpOyB9KSkgJiYKKyAgICAgIChsaHMubmF0aXZlX2lubGluZSA9PSByaHMubmF0aXZlX2lubGluZSkgJiYKKyAgICAgIChsaHMubG9uZ19lbnVtX25vbl9lbnVtX2RlZmF1bHQgPT0gcmhzLmxvbmdfZW51bV9ub25fZW51bV9kZWZhdWx0KSAmJgorICAgICAgKGxocy5sb25nX2VudW1fbm9ybWFsX2RlZmF1bHQgPT0gcmhzLmxvbmdfZW51bV9ub3JtYWxfZGVmYXVsdCk7Cit9CisKK2lubGluZSBib29sIG9wZXJhdG9yIT0oY29uc3QgTW9uc3RlclQgJmxocywgY29uc3QgTW9uc3RlclQgJnJocykgeworICAgIHJldHVybiAhKGxocyA9PSByaHMpOworfQorCisKK2lubGluZSBNb25zdGVyVDo6TW9uc3RlclQoY29uc3QgTW9uc3RlclQgJm8pCisgICAgICA6IHBvcygoby5wb3MpID8gbmV3IE15R2FtZTo6RXhhbXBsZTo6VmVjMygqby5wb3MpIDogbnVsbHB0ciksCisgICAgICAgIG1hbmEoby5tYW5hKSwKKyAgICAgICAgaHAoby5ocCksCisgICAgICAgIG5hbWUoby5uYW1lKSwKKyAgICAgICAgaW52ZW50b3J5KG8uaW52ZW50b3J5KSwKKyAgICAgICAgY29sb3Ioby5jb2xvciksCisgICAgICAgIHRlc3Qoby50ZXN0KSwKKyAgICAgICAgdGVzdDQoby50ZXN0NCksCisgICAgICAgIHRlc3RhcnJheW9mc3RyaW5nKG8udGVzdGFycmF5b2ZzdHJpbmcpLAorICAgICAgICBlbmVteSgoby5lbmVteSkgPyBuZXcgTXlHYW1lOjpFeGFtcGxlOjpNb25zdGVyVCgqby5lbmVteSkgOiBudWxscHRyKSwKKyAgICAgICAgdGVzdG5lc3RlZGZsYXRidWZmZXIoby50ZXN0bmVzdGVkZmxhdGJ1ZmZlciksCisgICAgICAgIHRlc3RlbXB0eSgoby50ZXN0ZW1wdHkpID8gbmV3IE15R2FtZTo6RXhhbXBsZTo6U3RhdFQoKm8udGVzdGVtcHR5KSA6IG51bGxwdHIpLAorICAgICAgICB0ZXN0Ym9vbChvLnRlc3Rib29sKSwKKyAgICAgICAgdGVzdGhhc2hzMzJfZm52MShvLnRlc3RoYXNoczMyX2ZudjEpLAorICAgICAgICB0ZXN0aGFzaHUzMl9mbnYxKG8udGVzdGhhc2h1MzJfZm52MSksCisgICAgICAgIHRlc3RoYXNoczY0X2ZudjEoby50ZXN0aGFzaHM2NF9mbnYxKSwKKyAgICAgICAgdGVzdGhhc2h1NjRfZm52MShvLnRlc3RoYXNodTY0X2ZudjEpLAorICAgICAgICB0ZXN0aGFzaHMzMl9mbnYxYShvLnRlc3RoYXNoczMyX2ZudjFhKSwKKyAgICAgICAgdGVzdGhhc2h1MzJfZm52MWEoby50ZXN0aGFzaHUzMl9mbnYxYSksCisgICAgICAgIHRlc3RoYXNoczY0X2ZudjFhKG8udGVzdGhhc2hzNjRfZm52MWEpLAorICAgICAgICB0ZXN0aGFzaHU2NF9mbnYxYShvLnRlc3RoYXNodTY0X2ZudjFhKSwKKyAgICAgICAgdGVzdGFycmF5b2Zib29scyhvLnRlc3RhcnJheW9mYm9vbHMpLAorICAgICAgICB0ZXN0ZihvLnRlc3RmKSwKKyAgICAgICAgdGVzdGYyKG8udGVzdGYyKSwKKyAgICAgICAgdGVzdGYzKG8udGVzdGYzKSwKKyAgICAgICAgdGVzdGFycmF5b2ZzdHJpbmcyKG8udGVzdGFycmF5b2ZzdHJpbmcyKSwKKyAgICAgICAgdGVzdGFycmF5b2Zzb3J0ZWRzdHJ1Y3Qoby50ZXN0YXJyYXlvZnNvcnRlZHN0cnVjdCksCisgICAgICAgIGZsZXgoby5mbGV4KSwKKyAgICAgICAgdGVzdDUoby50ZXN0NSksCisgICAgICAgIHZlY3Rvcl9vZl9sb25ncyhvLnZlY3Rvcl9vZl9sb25ncyksCisgICAgICAgIHZlY3Rvcl9vZl9kb3VibGVzKG8udmVjdG9yX29mX2RvdWJsZXMpLAorICAgICAgICBwYXJlbnRfbmFtZXNwYWNlX3Rlc3QoKG8ucGFyZW50X25hbWVzcGFjZV90ZXN0KSA/IG5ldyBNeUdhbWU6OkluUGFyZW50TmFtZXNwYWNlVCgqby5wYXJlbnRfbmFtZXNwYWNlX3Rlc3QpIDogbnVsbHB0ciksCisgICAgICAgIHNpbmdsZV93ZWFrX3JlZmVyZW5jZShvLnNpbmdsZV93ZWFrX3JlZmVyZW5jZSksCisgICAgICAgIHZlY3Rvcl9vZl93ZWFrX3JlZmVyZW5jZXMoby52ZWN0b3Jfb2Zfd2Vha19yZWZlcmVuY2VzKSwKKyAgICAgICAgY29fb3duaW5nX3JlZmVyZW5jZShvLmNvX293bmluZ19yZWZlcmVuY2UpLAorICAgICAgICBub25fb3duaW5nX3JlZmVyZW5jZShvLm5vbl9vd25pbmdfcmVmZXJlbmNlKSwKKyAgICAgICAgdmVjdG9yX29mX25vbl9vd25pbmdfcmVmZXJlbmNlcyhvLnZlY3Rvcl9vZl9ub25fb3duaW5nX3JlZmVyZW5jZXMpLAorICAgICAgICBhbnlfdW5pcXVlKG8uYW55X3VuaXF1ZSksCisgICAgICAgIGFueV9hbWJpZ3VvdXMoby5hbnlfYW1iaWd1b3VzKSwKKyAgICAgICAgdmVjdG9yX29mX2VudW1zKG8udmVjdG9yX29mX2VudW1zKSwKKyAgICAgICAgc2lnbmVkX2VudW0oby5zaWduZWRfZW51bSksCisgICAgICAgIHRlc3RyZXF1aXJlZG5lc3RlZGZsYXRidWZmZXIoby50ZXN0cmVxdWlyZWRuZXN0ZWRmbGF0YnVmZmVyKSwKKyAgICAgICAgbmF0aXZlX2lubGluZShvLm5hdGl2ZV9pbmxpbmUpLAorICAgICAgICBsb25nX2VudW1fbm9uX2VudW1fZGVmYXVsdChvLmxvbmdfZW51bV9ub25fZW51bV9kZWZhdWx0KSwKKyAgICAgICAgbG9uZ19lbnVtX25vcm1hbF9kZWZhdWx0KG8ubG9uZ19lbnVtX25vcm1hbF9kZWZhdWx0KSB7CisgIHRlc3RhcnJheW9mdGFibGVzLnJlc2VydmUoby50ZXN0YXJyYXlvZnRhYmxlcy5zaXplKCkpOworICBmb3IgKGNvbnN0IGF1dG8gJnRlc3RhcnJheW9mdGFibGVzXyA6IG8udGVzdGFycmF5b2Z0YWJsZXMpIHsgdGVzdGFycmF5b2Z0YWJsZXMuZW1wbGFjZV9iYWNrKCh0ZXN0YXJyYXlvZnRhYmxlc18pID8gbmV3IE15R2FtZTo6RXhhbXBsZTo6TW9uc3RlclQoKnRlc3RhcnJheW9mdGFibGVzXykgOiBudWxscHRyKTsgfQorICB2ZWN0b3Jfb2ZfcmVmZXJyYWJsZXMucmVzZXJ2ZShvLnZlY3Rvcl9vZl9yZWZlcnJhYmxlcy5zaXplKCkpOworICBmb3IgKGNvbnN0IGF1dG8gJnZlY3Rvcl9vZl9yZWZlcnJhYmxlc18gOiBvLnZlY3Rvcl9vZl9yZWZlcnJhYmxlcykgeyB2ZWN0b3Jfb2ZfcmVmZXJyYWJsZXMuZW1wbGFjZV9iYWNrKCh2ZWN0b3Jfb2ZfcmVmZXJyYWJsZXNfKSA/IG5ldyBNeUdhbWU6OkV4YW1wbGU6OlJlZmVycmFibGVUKCp2ZWN0b3Jfb2ZfcmVmZXJyYWJsZXNfKSA6IG51bGxwdHIpOyB9CisgIHZlY3Rvcl9vZl9zdHJvbmdfcmVmZXJyYWJsZXMucmVzZXJ2ZShvLnZlY3Rvcl9vZl9zdHJvbmdfcmVmZXJyYWJsZXMuc2l6ZSgpKTsKKyAgZm9yIChjb25zdCBhdXRvICZ2ZWN0b3Jfb2Zfc3Ryb25nX3JlZmVycmFibGVzXyA6IG8udmVjdG9yX29mX3N0cm9uZ19yZWZlcnJhYmxlcykgeyB2ZWN0b3Jfb2Zfc3Ryb25nX3JlZmVycmFibGVzLmVtcGxhY2VfYmFjaygodmVjdG9yX29mX3N0cm9uZ19yZWZlcnJhYmxlc18pID8gbmV3IE15R2FtZTo6RXhhbXBsZTo6UmVmZXJyYWJsZVQoKnZlY3Rvcl9vZl9zdHJvbmdfcmVmZXJyYWJsZXNfKSA6IG51bGxwdHIpOyB9CisgIHZlY3Rvcl9vZl9jb19vd25pbmdfcmVmZXJlbmNlcy5yZXNlcnZlKG8udmVjdG9yX29mX2NvX293bmluZ19yZWZlcmVuY2VzLnNpemUoKSk7CisgIGZvciAoY29uc3QgYXV0byAmdmVjdG9yX29mX2NvX293bmluZ19yZWZlcmVuY2VzXyA6IG8udmVjdG9yX29mX2NvX293bmluZ19yZWZlcmVuY2VzKSB7IHZlY3Rvcl9vZl9jb19vd25pbmdfcmVmZXJlbmNlcy5lbXBsYWNlX2JhY2soKHZlY3Rvcl9vZl9jb19vd25pbmdfcmVmZXJlbmNlc18pID8gbmV3IFJlZmVycmFibGVUKCp2ZWN0b3Jfb2ZfY29fb3duaW5nX3JlZmVyZW5jZXNfKSA6IG51bGxwdHIpOyB9CisgIHNjYWxhcl9rZXlfc29ydGVkX3RhYmxlcy5yZXNlcnZlKG8uc2NhbGFyX2tleV9zb3J0ZWRfdGFibGVzLnNpemUoKSk7CisgIGZvciAoY29uc3QgYXV0byAmc2NhbGFyX2tleV9zb3J0ZWRfdGFibGVzXyA6IG8uc2NhbGFyX2tleV9zb3J0ZWRfdGFibGVzKSB7IHNjYWxhcl9rZXlfc29ydGVkX3RhYmxlcy5lbXBsYWNlX2JhY2soKHNjYWxhcl9rZXlfc29ydGVkX3RhYmxlc18pID8gbmV3IE15R2FtZTo6RXhhbXBsZTo6U3RhdFQoKnNjYWxhcl9rZXlfc29ydGVkX3RhYmxlc18pIDogbnVsbHB0cik7IH0KK30KKworaW5saW5lIE1vbnN0ZXJUICZNb25zdGVyVDo6b3BlcmF0b3I9KE1vbnN0ZXJUIG8pIEZMQVRCVUZGRVJTX05PRVhDRVBUIHsKKyAgc3RkOjpzd2FwKHBvcywgby5wb3MpOworICBzdGQ6OnN3YXAobWFuYSwgby5tYW5hKTsKKyAgc3RkOjpzd2FwKGhwLCBvLmhwKTsKKyAgc3RkOjpzd2FwKG5hbWUsIG8ubmFtZSk7CisgIHN0ZDo6c3dhcChpbnZlbnRvcnksIG8uaW52ZW50b3J5KTsKKyAgc3RkOjpzd2FwKGNvbG9yLCBvLmNvbG9yKTsKKyAgc3RkOjpzd2FwKHRlc3QsIG8udGVzdCk7CisgIHN0ZDo6c3dhcCh0ZXN0NCwgby50ZXN0NCk7CisgIHN0ZDo6c3dhcCh0ZXN0YXJyYXlvZnN0cmluZywgby50ZXN0YXJyYXlvZnN0cmluZyk7CisgIHN0ZDo6c3dhcCh0ZXN0YXJyYXlvZnRhYmxlcywgby50ZXN0YXJyYXlvZnRhYmxlcyk7CisgIHN0ZDo6c3dhcChlbmVteSwgby5lbmVteSk7CisgIHN0ZDo6c3dhcCh0ZXN0bmVzdGVkZmxhdGJ1ZmZlciwgby50ZXN0bmVzdGVkZmxhdGJ1ZmZlcik7CisgIHN0ZDo6c3dhcCh0ZXN0ZW1wdHksIG8udGVzdGVtcHR5KTsKKyAgc3RkOjpzd2FwKHRlc3Rib29sLCBvLnRlc3Rib29sKTsKKyAgc3RkOjpzd2FwKHRlc3RoYXNoczMyX2ZudjEsIG8udGVzdGhhc2hzMzJfZm52MSk7CisgIHN0ZDo6c3dhcCh0ZXN0aGFzaHUzMl9mbnYxLCBvLnRlc3RoYXNodTMyX2ZudjEpOworICBzdGQ6OnN3YXAodGVzdGhhc2hzNjRfZm52MSwgby50ZXN0aGFzaHM2NF9mbnYxKTsKKyAgc3RkOjpzd2FwKHRlc3RoYXNodTY0X2ZudjEsIG8udGVzdGhhc2h1NjRfZm52MSk7CisgIHN0ZDo6c3dhcCh0ZXN0aGFzaHMzMl9mbnYxYSwgby50ZXN0aGFzaHMzMl9mbnYxYSk7CisgIHN0ZDo6c3dhcCh0ZXN0aGFzaHUzMl9mbnYxYSwgby50ZXN0aGFzaHUzMl9mbnYxYSk7CisgIHN0ZDo6c3dhcCh0ZXN0aGFzaHM2NF9mbnYxYSwgby50ZXN0aGFzaHM2NF9mbnYxYSk7CisgIHN0ZDo6c3dhcCh0ZXN0aGFzaHU2NF9mbnYxYSwgby50ZXN0aGFzaHU2NF9mbnYxYSk7CisgIHN0ZDo6c3dhcCh0ZXN0YXJyYXlvZmJvb2xzLCBvLnRlc3RhcnJheW9mYm9vbHMpOworICBzdGQ6OnN3YXAodGVzdGYsIG8udGVzdGYpOworICBzdGQ6OnN3YXAodGVzdGYyLCBvLnRlc3RmMik7CisgIHN0ZDo6c3dhcCh0ZXN0ZjMsIG8udGVzdGYzKTsKKyAgc3RkOjpzd2FwKHRlc3RhcnJheW9mc3RyaW5nMiwgby50ZXN0YXJyYXlvZnN0cmluZzIpOworICBzdGQ6OnN3YXAodGVzdGFycmF5b2Zzb3J0ZWRzdHJ1Y3QsIG8udGVzdGFycmF5b2Zzb3J0ZWRzdHJ1Y3QpOworICBzdGQ6OnN3YXAoZmxleCwgby5mbGV4KTsKKyAgc3RkOjpzd2FwKHRlc3Q1LCBvLnRlc3Q1KTsKKyAgc3RkOjpzd2FwKHZlY3Rvcl9vZl9sb25ncywgby52ZWN0b3Jfb2ZfbG9uZ3MpOworICBzdGQ6OnN3YXAodmVjdG9yX29mX2RvdWJsZXMsIG8udmVjdG9yX29mX2RvdWJsZXMpOworICBzdGQ6OnN3YXAocGFyZW50X25hbWVzcGFjZV90ZXN0LCBvLnBhcmVudF9uYW1lc3BhY2VfdGVzdCk7CisgIHN0ZDo6c3dhcCh2ZWN0b3Jfb2ZfcmVmZXJyYWJsZXMsIG8udmVjdG9yX29mX3JlZmVycmFibGVzKTsKKyAgc3RkOjpzd2FwKHNpbmdsZV93ZWFrX3JlZmVyZW5jZSwgby5zaW5nbGVfd2Vha19yZWZlcmVuY2UpOworICBzdGQ6OnN3YXAodmVjdG9yX29mX3dlYWtfcmVmZXJlbmNlcywgby52ZWN0b3Jfb2Zfd2Vha19yZWZlcmVuY2VzKTsKKyAgc3RkOjpzd2FwKHZlY3Rvcl9vZl9zdHJvbmdfcmVmZXJyYWJsZXMsIG8udmVjdG9yX29mX3N0cm9uZ19yZWZlcnJhYmxlcyk7CisgIHN0ZDo6c3dhcChjb19vd25pbmdfcmVmZXJlbmNlLCBvLmNvX293bmluZ19yZWZlcmVuY2UpOworICBzdGQ6OnN3YXAodmVjdG9yX29mX2NvX293bmluZ19yZWZlcmVuY2VzLCBvLnZlY3Rvcl9vZl9jb19vd25pbmdfcmVmZXJlbmNlcyk7CisgIHN0ZDo6c3dhcChub25fb3duaW5nX3JlZmVyZW5jZSwgby5ub25fb3duaW5nX3JlZmVyZW5jZSk7CisgIHN0ZDo6c3dhcCh2ZWN0b3Jfb2Zfbm9uX293bmluZ19yZWZlcmVuY2VzLCBvLnZlY3Rvcl9vZl9ub25fb3duaW5nX3JlZmVyZW5jZXMpOworICBzdGQ6OnN3YXAoYW55X3VuaXF1ZSwgby5hbnlfdW5pcXVlKTsKKyAgc3RkOjpzd2FwKGFueV9hbWJpZ3VvdXMsIG8uYW55X2FtYmlndW91cyk7CisgIHN0ZDo6c3dhcCh2ZWN0b3Jfb2ZfZW51bXMsIG8udmVjdG9yX29mX2VudW1zKTsKKyAgc3RkOjpzd2FwKHNpZ25lZF9lbnVtLCBvLnNpZ25lZF9lbnVtKTsKKyAgc3RkOjpzd2FwKHRlc3RyZXF1aXJlZG5lc3RlZGZsYXRidWZmZXIsIG8udGVzdHJlcXVpcmVkbmVzdGVkZmxhdGJ1ZmZlcik7CisgIHN0ZDo6c3dhcChzY2FsYXJfa2V5X3NvcnRlZF90YWJsZXMsIG8uc2NhbGFyX2tleV9zb3J0ZWRfdGFibGVzKTsKKyAgc3RkOjpzd2FwKG5hdGl2ZV9pbmxpbmUsIG8ubmF0aXZlX2lubGluZSk7CisgIHN0ZDo6c3dhcChsb25nX2VudW1fbm9uX2VudW1fZGVmYXVsdCwgby5sb25nX2VudW1fbm9uX2VudW1fZGVmYXVsdCk7CisgIHN0ZDo6c3dhcChsb25nX2VudW1fbm9ybWFsX2RlZmF1bHQsIG8ubG9uZ19lbnVtX25vcm1hbF9kZWZhdWx0KTsKKyAgcmV0dXJuICp0aGlzOworfQorCitpbmxpbmUgTW9uc3RlclQgKk1vbnN0ZXI6OlVuUGFjayhjb25zdCBmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyKSBjb25zdCB7CisgIGF1dG8gX28gPSBzdGQ6OnVuaXF1ZV9wdHI8TW9uc3RlclQ+KG5ldyBNb25zdGVyVCgpKTsKKyAgVW5QYWNrVG8oX28uZ2V0KCksIF9yZXNvbHZlcik7CisgIHJldHVybiBfby5yZWxlYXNlKCk7Cit9CisKK2lubGluZSB2b2lkIE1vbnN0ZXI6OlVuUGFja1RvKE1vbnN0ZXJUICpfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlcikgY29uc3QgeworICAodm9pZClfbzsKKyAgKHZvaWQpX3Jlc29sdmVyOworICB7IGF1dG8gX2UgPSBwb3MoKTsgaWYgKF9lKSBfby0+cG9zID0gZmxhdGJ1ZmZlcnM6OnVuaXF1ZV9wdHI8TXlHYW1lOjpFeGFtcGxlOjpWZWMzPihuZXcgTXlHYW1lOjpFeGFtcGxlOjpWZWMzKCpfZSkpOyB9CisgIHsgYXV0byBfZSA9IG1hbmEoKTsgX28tPm1hbmEgPSBfZTsgfQorICB7IGF1dG8gX2UgPSBocCgpOyBfby0+aHAgPSBfZTsgfQorICB7IGF1dG8gX2UgPSBuYW1lKCk7IGlmIChfZSkgX28tPm5hbWUgPSBfZS0+c3RyKCk7IH0KKyAgeyBhdXRvIF9lID0gaW52ZW50b3J5KCk7IGlmIChfZSkgeyBfby0+aW52ZW50b3J5LnJlc2l6ZShfZS0+c2l6ZSgpKTsgc3RkOjpjb3B5KF9lLT5iZWdpbigpLCBfZS0+ZW5kKCksIF9vLT5pbnZlbnRvcnkuYmVnaW4oKSk7IH0gfQorICB7IGF1dG8gX2UgPSBjb2xvcigpOyBfby0+Y29sb3IgPSBfZTsgfQorICB7IGF1dG8gX2UgPSB0ZXN0X3R5cGUoKTsgX28tPnRlc3QudHlwZSA9IF9lOyB9CisgIHsgYXV0byBfZSA9IHRlc3QoKTsgaWYgKF9lKSBfby0+dGVzdC52YWx1ZSA9IE15R2FtZTo6RXhhbXBsZTo6QW55VW5pb246OlVuUGFjayhfZSwgdGVzdF90eXBlKCksIF9yZXNvbHZlcik7IH0KKyAgeyBhdXRvIF9lID0gdGVzdDQoKTsgaWYgKF9lKSB7IF9vLT50ZXN0NC5yZXNpemUoX2UtPnNpemUoKSk7IGZvciAoZmxhdGJ1ZmZlcnM6OnVvZmZzZXRfdCBfaSA9IDA7IF9pIDwgX2UtPnNpemUoKTsgX2krKykgeyBfby0+dGVzdDRbX2ldID0gKl9lLT5HZXQoX2kpOyB9IH0gZWxzZSB7IF9vLT50ZXN0NC5yZXNpemUoMCk7IH0gfQorICB7IGF1dG8gX2UgPSB0ZXN0YXJyYXlvZnN0cmluZygpOyBpZiAoX2UpIHsgX28tPnRlc3RhcnJheW9mc3RyaW5nLnJlc2l6ZShfZS0+c2l6ZSgpKTsgZm9yIChmbGF0YnVmZmVyczo6dW9mZnNldF90IF9pID0gMDsgX2kgPCBfZS0+c2l6ZSgpOyBfaSsrKSB7IF9vLT50ZXN0YXJyYXlvZnN0cmluZ1tfaV0gPSBfZS0+R2V0KF9pKS0+c3RyKCk7IH0gfSBlbHNlIHsgX28tPnRlc3RhcnJheW9mc3RyaW5nLnJlc2l6ZSgwKTsgfSB9CisgIHsgYXV0byBfZSA9IHRlc3RhcnJheW9mdGFibGVzKCk7IGlmIChfZSkgeyBfby0+dGVzdGFycmF5b2Z0YWJsZXMucmVzaXplKF9lLT5zaXplKCkpOyBmb3IgKGZsYXRidWZmZXJzOjp1b2Zmc2V0X3QgX2kgPSAwOyBfaSA8IF9lLT5zaXplKCk7IF9pKyspIHsgaWYoX28tPnRlc3RhcnJheW9mdGFibGVzW19pXSkgeyBfZS0+R2V0KF9pKS0+VW5QYWNrVG8oX28tPnRlc3RhcnJheW9mdGFibGVzW19pXS5nZXQoKSwgX3Jlc29sdmVyKTsgfSBlbHNlIHsgX28tPnRlc3RhcnJheW9mdGFibGVzW19pXSA9IGZsYXRidWZmZXJzOjp1bmlxdWVfcHRyPE15R2FtZTo6RXhhbXBsZTo6TW9uc3RlclQ+KF9lLT5HZXQoX2kpLT5VblBhY2soX3Jlc29sdmVyKSk7IH07IH0gfSBlbHNlIHsgX28tPnRlc3RhcnJheW9mdGFibGVzLnJlc2l6ZSgwKTsgfSB9CisgIHsgYXV0byBfZSA9IGVuZW15KCk7IGlmIChfZSkgeyBpZihfby0+ZW5lbXkpIHsgX2UtPlVuUGFja1RvKF9vLT5lbmVteS5nZXQoKSwgX3Jlc29sdmVyKTsgfSBlbHNlIHsgX28tPmVuZW15ID0gZmxhdGJ1ZmZlcnM6OnVuaXF1ZV9wdHI8TXlHYW1lOjpFeGFtcGxlOjpNb25zdGVyVD4oX2UtPlVuUGFjayhfcmVzb2x2ZXIpKTsgfSB9IGVsc2UgaWYgKF9vLT5lbmVteSkgeyBfby0+ZW5lbXkucmVzZXQoKTsgfSB9CisgIHsgYXV0byBfZSA9IHRlc3RuZXN0ZWRmbGF0YnVmZmVyKCk7IGlmIChfZSkgeyBfby0+dGVzdG5lc3RlZGZsYXRidWZmZXIucmVzaXplKF9lLT5zaXplKCkpOyBzdGQ6OmNvcHkoX2UtPmJlZ2luKCksIF9lLT5lbmQoKSwgX28tPnRlc3RuZXN0ZWRmbGF0YnVmZmVyLmJlZ2luKCkpOyB9IH0KKyAgeyBhdXRvIF9lID0gdGVzdGVtcHR5KCk7IGlmIChfZSkgeyBpZihfby0+dGVzdGVtcHR5KSB7IF9lLT5VblBhY2tUbyhfby0+dGVzdGVtcHR5LmdldCgpLCBfcmVzb2x2ZXIpOyB9IGVsc2UgeyBfby0+dGVzdGVtcHR5ID0gZmxhdGJ1ZmZlcnM6OnVuaXF1ZV9wdHI8TXlHYW1lOjpFeGFtcGxlOjpTdGF0VD4oX2UtPlVuUGFjayhfcmVzb2x2ZXIpKTsgfSB9IGVsc2UgaWYgKF9vLT50ZXN0ZW1wdHkpIHsgX28tPnRlc3RlbXB0eS5yZXNldCgpOyB9IH0KKyAgeyBhdXRvIF9lID0gdGVzdGJvb2woKTsgX28tPnRlc3Rib29sID0gX2U7IH0KKyAgeyBhdXRvIF9lID0gdGVzdGhhc2hzMzJfZm52MSgpOyBfby0+dGVzdGhhc2hzMzJfZm52MSA9IF9lOyB9CisgIHsgYXV0byBfZSA9IHRlc3RoYXNodTMyX2ZudjEoKTsgX28tPnRlc3RoYXNodTMyX2ZudjEgPSBfZTsgfQorICB7IGF1dG8gX2UgPSB0ZXN0aGFzaHM2NF9mbnYxKCk7IF9vLT50ZXN0aGFzaHM2NF9mbnYxID0gX2U7IH0KKyAgeyBhdXRvIF9lID0gdGVzdGhhc2h1NjRfZm52MSgpOyBfby0+dGVzdGhhc2h1NjRfZm52MSA9IF9lOyB9CisgIHsgYXV0byBfZSA9IHRlc3RoYXNoczMyX2ZudjFhKCk7IF9vLT50ZXN0aGFzaHMzMl9mbnYxYSA9IF9lOyB9CisgIHsgYXV0byBfZSA9IHRlc3RoYXNodTMyX2ZudjFhKCk7IC8qc2NhbGFyIHJlc29sdmVyLCBuYWtlZCovIGlmIChfcmVzb2x2ZXIpICgqX3Jlc29sdmVyKShyZWludGVycHJldF9jYXN0PHZvaWQgKio+KCZfby0+dGVzdGhhc2h1MzJfZm52MWEpLCBzdGF0aWNfY2FzdDxmbGF0YnVmZmVyczo6aGFzaF92YWx1ZV90PihfZSkpOyBlbHNlIF9vLT50ZXN0aGFzaHUzMl9mbnYxYSA9IG51bGxwdHI7IH0KKyAgeyBhdXRvIF9lID0gdGVzdGhhc2hzNjRfZm52MWEoKTsgX28tPnRlc3RoYXNoczY0X2ZudjFhID0gX2U7IH0KKyAgeyBhdXRvIF9lID0gdGVzdGhhc2h1NjRfZm52MWEoKTsgX28tPnRlc3RoYXNodTY0X2ZudjFhID0gX2U7IH0KKyAgeyBhdXRvIF9lID0gdGVzdGFycmF5b2Zib29scygpOyBpZiAoX2UpIHsgX28tPnRlc3RhcnJheW9mYm9vbHMucmVzaXplKF9lLT5zaXplKCkpOyBmb3IgKGZsYXRidWZmZXJzOjp1b2Zmc2V0X3QgX2kgPSAwOyBfaSA8IF9lLT5zaXplKCk7IF9pKyspIHsgX28tPnRlc3RhcnJheW9mYm9vbHNbX2ldID0gX2UtPkdldChfaSkgIT0gMDsgfSB9IGVsc2UgeyBfby0+dGVzdGFycmF5b2Zib29scy5yZXNpemUoMCk7IH0gfQorICB7IGF1dG8gX2UgPSB0ZXN0ZigpOyBfby0+dGVzdGYgPSBfZTsgfQorICB7IGF1dG8gX2UgPSB0ZXN0ZjIoKTsgX28tPnRlc3RmMiA9IF9lOyB9CisgIHsgYXV0byBfZSA9IHRlc3RmMygpOyBfby0+dGVzdGYzID0gX2U7IH0KKyAgeyBhdXRvIF9lID0gdGVzdGFycmF5b2ZzdHJpbmcyKCk7IGlmIChfZSkgeyBfby0+dGVzdGFycmF5b2ZzdHJpbmcyLnJlc2l6ZShfZS0+c2l6ZSgpKTsgZm9yIChmbGF0YnVmZmVyczo6dW9mZnNldF90IF9pID0gMDsgX2kgPCBfZS0+c2l6ZSgpOyBfaSsrKSB7IF9vLT50ZXN0YXJyYXlvZnN0cmluZzJbX2ldID0gX2UtPkdldChfaSktPnN0cigpOyB9IH0gZWxzZSB7IF9vLT50ZXN0YXJyYXlvZnN0cmluZzIucmVzaXplKDApOyB9IH0KKyAgeyBhdXRvIF9lID0gdGVzdGFycmF5b2Zzb3J0ZWRzdHJ1Y3QoKTsgaWYgKF9lKSB7IF9vLT50ZXN0YXJyYXlvZnNvcnRlZHN0cnVjdC5yZXNpemUoX2UtPnNpemUoKSk7IGZvciAoZmxhdGJ1ZmZlcnM6OnVvZmZzZXRfdCBfaSA9IDA7IF9pIDwgX2UtPnNpemUoKTsgX2krKykgeyBfby0+dGVzdGFycmF5b2Zzb3J0ZWRzdHJ1Y3RbX2ldID0gKl9lLT5HZXQoX2kpOyB9IH0gZWxzZSB7IF9vLT50ZXN0YXJyYXlvZnNvcnRlZHN0cnVjdC5yZXNpemUoMCk7IH0gfQorICB7IGF1dG8gX2UgPSBmbGV4KCk7IGlmIChfZSkgeyBfby0+ZmxleC5yZXNpemUoX2UtPnNpemUoKSk7IHN0ZDo6Y29weShfZS0+YmVnaW4oKSwgX2UtPmVuZCgpLCBfby0+ZmxleC5iZWdpbigpKTsgfSB9CisgIHsgYXV0byBfZSA9IHRlc3Q1KCk7IGlmIChfZSkgeyBfby0+dGVzdDUucmVzaXplKF9lLT5zaXplKCkpOyBmb3IgKGZsYXRidWZmZXJzOjp1b2Zmc2V0X3QgX2kgPSAwOyBfaSA8IF9lLT5zaXplKCk7IF9pKyspIHsgX28tPnRlc3Q1W19pXSA9ICpfZS0+R2V0KF9pKTsgfSB9IGVsc2UgeyBfby0+dGVzdDUucmVzaXplKDApOyB9IH0KKyAgeyBhdXRvIF9lID0gdmVjdG9yX29mX2xvbmdzKCk7IGlmIChfZSkgeyBfby0+dmVjdG9yX29mX2xvbmdzLnJlc2l6ZShfZS0+c2l6ZSgpKTsgZm9yIChmbGF0YnVmZmVyczo6dW9mZnNldF90IF9pID0gMDsgX2kgPCBfZS0+c2l6ZSgpOyBfaSsrKSB7IF9vLT52ZWN0b3Jfb2ZfbG9uZ3NbX2ldID0gX2UtPkdldChfaSk7IH0gfSBlbHNlIHsgX28tPnZlY3Rvcl9vZl9sb25ncy5yZXNpemUoMCk7IH0gfQorICB7IGF1dG8gX2UgPSB2ZWN0b3Jfb2ZfZG91YmxlcygpOyBpZiAoX2UpIHsgX28tPnZlY3Rvcl9vZl9kb3VibGVzLnJlc2l6ZShfZS0+c2l6ZSgpKTsgZm9yIChmbGF0YnVmZmVyczo6dW9mZnNldF90IF9pID0gMDsgX2kgPCBfZS0+c2l6ZSgpOyBfaSsrKSB7IF9vLT52ZWN0b3Jfb2ZfZG91Ymxlc1tfaV0gPSBfZS0+R2V0KF9pKTsgfSB9IGVsc2UgeyBfby0+dmVjdG9yX29mX2RvdWJsZXMucmVzaXplKDApOyB9IH0KKyAgeyBhdXRvIF9lID0gcGFyZW50X25hbWVzcGFjZV90ZXN0KCk7IGlmIChfZSkgeyBpZihfby0+cGFyZW50X25hbWVzcGFjZV90ZXN0KSB7IF9lLT5VblBhY2tUbyhfby0+cGFyZW50X25hbWVzcGFjZV90ZXN0LmdldCgpLCBfcmVzb2x2ZXIpOyB9IGVsc2UgeyBfby0+cGFyZW50X25hbWVzcGFjZV90ZXN0ID0gZmxhdGJ1ZmZlcnM6OnVuaXF1ZV9wdHI8TXlHYW1lOjpJblBhcmVudE5hbWVzcGFjZVQ+KF9lLT5VblBhY2soX3Jlc29sdmVyKSk7IH0gfSBlbHNlIGlmIChfby0+cGFyZW50X25hbWVzcGFjZV90ZXN0KSB7IF9vLT5wYXJlbnRfbmFtZXNwYWNlX3Rlc3QucmVzZXQoKTsgfSB9CisgIHsgYXV0byBfZSA9IHZlY3Rvcl9vZl9yZWZlcnJhYmxlcygpOyBpZiAoX2UpIHsgX28tPnZlY3Rvcl9vZl9yZWZlcnJhYmxlcy5yZXNpemUoX2UtPnNpemUoKSk7IGZvciAoZmxhdGJ1ZmZlcnM6OnVvZmZzZXRfdCBfaSA9IDA7IF9pIDwgX2UtPnNpemUoKTsgX2krKykgeyBpZihfby0+dmVjdG9yX29mX3JlZmVycmFibGVzW19pXSkgeyBfZS0+R2V0KF9pKS0+VW5QYWNrVG8oX28tPnZlY3Rvcl9vZl9yZWZlcnJhYmxlc1tfaV0uZ2V0KCksIF9yZXNvbHZlcik7IH0gZWxzZSB7IF9vLT52ZWN0b3Jfb2ZfcmVmZXJyYWJsZXNbX2ldID0gZmxhdGJ1ZmZlcnM6OnVuaXF1ZV9wdHI8TXlHYW1lOjpFeGFtcGxlOjpSZWZlcnJhYmxlVD4oX2UtPkdldChfaSktPlVuUGFjayhfcmVzb2x2ZXIpKTsgfTsgfSB9IGVsc2UgeyBfby0+dmVjdG9yX29mX3JlZmVycmFibGVzLnJlc2l6ZSgwKTsgfSB9CisgIHsgYXV0byBfZSA9IHNpbmdsZV93ZWFrX3JlZmVyZW5jZSgpOyAvKnNjYWxhciByZXNvbHZlciwgbmFrZWQqLyBpZiAoX3Jlc29sdmVyKSAoKl9yZXNvbHZlcikocmVpbnRlcnByZXRfY2FzdDx2b2lkICoqPigmX28tPnNpbmdsZV93ZWFrX3JlZmVyZW5jZSksIHN0YXRpY19jYXN0PGZsYXRidWZmZXJzOjpoYXNoX3ZhbHVlX3Q+KF9lKSk7IGVsc2UgX28tPnNpbmdsZV93ZWFrX3JlZmVyZW5jZSA9IG51bGxwdHI7IH0KKyAgeyBhdXRvIF9lID0gdmVjdG9yX29mX3dlYWtfcmVmZXJlbmNlcygpOyBpZiAoX2UpIHsgX28tPnZlY3Rvcl9vZl93ZWFrX3JlZmVyZW5jZXMucmVzaXplKF9lLT5zaXplKCkpOyBmb3IgKGZsYXRidWZmZXJzOjp1b2Zmc2V0X3QgX2kgPSAwOyBfaSA8IF9lLT5zaXplKCk7IF9pKyspIHsgLyp2ZWN0b3IgcmVzb2x2ZXIsIG5ha2VkKi8gaWYgKF9yZXNvbHZlcikgKCpfcmVzb2x2ZXIpKHJlaW50ZXJwcmV0X2Nhc3Q8dm9pZCAqKj4oJl9vLT52ZWN0b3Jfb2Zfd2Vha19yZWZlcmVuY2VzW19pXSksIHN0YXRpY19jYXN0PGZsYXRidWZmZXJzOjpoYXNoX3ZhbHVlX3Q+KF9lLT5HZXQoX2kpKSk7IGVsc2UgX28tPnZlY3Rvcl9vZl93ZWFrX3JlZmVyZW5jZXNbX2ldID0gbnVsbHB0cjsgfSB9IGVsc2UgeyBfby0+dmVjdG9yX29mX3dlYWtfcmVmZXJlbmNlcy5yZXNpemUoMCk7IH0gfQorICB7IGF1dG8gX2UgPSB2ZWN0b3Jfb2Zfc3Ryb25nX3JlZmVycmFibGVzKCk7IGlmIChfZSkgeyBfby0+dmVjdG9yX29mX3N0cm9uZ19yZWZlcnJhYmxlcy5yZXNpemUoX2UtPnNpemUoKSk7IGZvciAoZmxhdGJ1ZmZlcnM6OnVvZmZzZXRfdCBfaSA9IDA7IF9pIDwgX2UtPnNpemUoKTsgX2krKykgeyBpZihfby0+dmVjdG9yX29mX3N0cm9uZ19yZWZlcnJhYmxlc1tfaV0pIHsgX2UtPkdldChfaSktPlVuUGFja1RvKF9vLT52ZWN0b3Jfb2Zfc3Ryb25nX3JlZmVycmFibGVzW19pXS5nZXQoKSwgX3Jlc29sdmVyKTsgfSBlbHNlIHsgX28tPnZlY3Rvcl9vZl9zdHJvbmdfcmVmZXJyYWJsZXNbX2ldID0gZmxhdGJ1ZmZlcnM6OnVuaXF1ZV9wdHI8TXlHYW1lOjpFeGFtcGxlOjpSZWZlcnJhYmxlVD4oX2UtPkdldChfaSktPlVuUGFjayhfcmVzb2x2ZXIpKTsgfTsgfSB9IGVsc2UgeyBfby0+dmVjdG9yX29mX3N0cm9uZ19yZWZlcnJhYmxlcy5yZXNpemUoMCk7IH0gfQorICB7IGF1dG8gX2UgPSBjb19vd25pbmdfcmVmZXJlbmNlKCk7IC8qc2NhbGFyIHJlc29sdmVyLCBuYWtlZCovIGlmIChfcmVzb2x2ZXIpICgqX3Jlc29sdmVyKShyZWludGVycHJldF9jYXN0PHZvaWQgKio+KCZfby0+Y29fb3duaW5nX3JlZmVyZW5jZSksIHN0YXRpY19jYXN0PGZsYXRidWZmZXJzOjpoYXNoX3ZhbHVlX3Q+KF9lKSk7IGVsc2UgX28tPmNvX293bmluZ19yZWZlcmVuY2UgPSBudWxscHRyOyB9CisgIHsgYXV0byBfZSA9IHZlY3Rvcl9vZl9jb19vd25pbmdfcmVmZXJlbmNlcygpOyBpZiAoX2UpIHsgX28tPnZlY3Rvcl9vZl9jb19vd25pbmdfcmVmZXJlbmNlcy5yZXNpemUoX2UtPnNpemUoKSk7IGZvciAoZmxhdGJ1ZmZlcnM6OnVvZmZzZXRfdCBfaSA9IDA7IF9pIDwgX2UtPnNpemUoKTsgX2krKykgeyAvKnZlY3RvciByZXNvbHZlciwgZGVmYXVsdF9wdHJfdHlwZSovIGlmIChfcmVzb2x2ZXIpICgqX3Jlc29sdmVyKShyZWludGVycHJldF9jYXN0PHZvaWQgKio+KCZfby0+dmVjdG9yX29mX2NvX293bmluZ19yZWZlcmVuY2VzW19pXSksIHN0YXRpY19jYXN0PGZsYXRidWZmZXJzOjpoYXNoX3ZhbHVlX3Q+KF9lLT5HZXQoX2kpKSk7LyogZWxzZSBkbyBub3RoaW5nICovOyB9IH0gZWxzZSB7IF9vLT52ZWN0b3Jfb2ZfY29fb3duaW5nX3JlZmVyZW5jZXMucmVzaXplKDApOyB9IH0KKyAgeyBhdXRvIF9lID0gbm9uX293bmluZ19yZWZlcmVuY2UoKTsgLypzY2FsYXIgcmVzb2x2ZXIsIG5ha2VkKi8gaWYgKF9yZXNvbHZlcikgKCpfcmVzb2x2ZXIpKHJlaW50ZXJwcmV0X2Nhc3Q8dm9pZCAqKj4oJl9vLT5ub25fb3duaW5nX3JlZmVyZW5jZSksIHN0YXRpY19jYXN0PGZsYXRidWZmZXJzOjpoYXNoX3ZhbHVlX3Q+KF9lKSk7IGVsc2UgX28tPm5vbl9vd25pbmdfcmVmZXJlbmNlID0gbnVsbHB0cjsgfQorICB7IGF1dG8gX2UgPSB2ZWN0b3Jfb2Zfbm9uX293bmluZ19yZWZlcmVuY2VzKCk7IGlmIChfZSkgeyBfby0+dmVjdG9yX29mX25vbl9vd25pbmdfcmVmZXJlbmNlcy5yZXNpemUoX2UtPnNpemUoKSk7IGZvciAoZmxhdGJ1ZmZlcnM6OnVvZmZzZXRfdCBfaSA9IDA7IF9pIDwgX2UtPnNpemUoKTsgX2krKykgeyAvKnZlY3RvciByZXNvbHZlciwgbmFrZWQqLyBpZiAoX3Jlc29sdmVyKSAoKl9yZXNvbHZlcikocmVpbnRlcnByZXRfY2FzdDx2b2lkICoqPigmX28tPnZlY3Rvcl9vZl9ub25fb3duaW5nX3JlZmVyZW5jZXNbX2ldKSwgc3RhdGljX2Nhc3Q8ZmxhdGJ1ZmZlcnM6Omhhc2hfdmFsdWVfdD4oX2UtPkdldChfaSkpKTsgZWxzZSBfby0+dmVjdG9yX29mX25vbl9vd25pbmdfcmVmZXJlbmNlc1tfaV0gPSBudWxscHRyOyB9IH0gZWxzZSB7IF9vLT52ZWN0b3Jfb2Zfbm9uX293bmluZ19yZWZlcmVuY2VzLnJlc2l6ZSgwKTsgfSB9CisgIHsgYXV0byBfZSA9IGFueV91bmlxdWVfdHlwZSgpOyBfby0+YW55X3VuaXF1ZS50eXBlID0gX2U7IH0KKyAgeyBhdXRvIF9lID0gYW55X3VuaXF1ZSgpOyBpZiAoX2UpIF9vLT5hbnlfdW5pcXVlLnZhbHVlID0gTXlHYW1lOjpFeGFtcGxlOjpBbnlVbmlxdWVBbGlhc2VzVW5pb246OlVuUGFjayhfZSwgYW55X3VuaXF1ZV90eXBlKCksIF9yZXNvbHZlcik7IH0KKyAgeyBhdXRvIF9lID0gYW55X2FtYmlndW91c190eXBlKCk7IF9vLT5hbnlfYW1iaWd1b3VzLnR5cGUgPSBfZTsgfQorICB7IGF1dG8gX2UgPSBhbnlfYW1iaWd1b3VzKCk7IGlmIChfZSkgX28tPmFueV9hbWJpZ3VvdXMudmFsdWUgPSBNeUdhbWU6OkV4YW1wbGU6OkFueUFtYmlndW91c0FsaWFzZXNVbmlvbjo6VW5QYWNrKF9lLCBhbnlfYW1iaWd1b3VzX3R5cGUoKSwgX3Jlc29sdmVyKTsgfQorICB7IGF1dG8gX2UgPSB2ZWN0b3Jfb2ZfZW51bXMoKTsgaWYgKF9lKSB7IF9vLT52ZWN0b3Jfb2ZfZW51bXMucmVzaXplKF9lLT5zaXplKCkpOyBmb3IgKGZsYXRidWZmZXJzOjp1b2Zmc2V0X3QgX2kgPSAwOyBfaSA8IF9lLT5zaXplKCk7IF9pKyspIHsgX28tPnZlY3Rvcl9vZl9lbnVtc1tfaV0gPSBzdGF0aWNfY2FzdDxNeUdhbWU6OkV4YW1wbGU6OkNvbG9yPihfZS0+R2V0KF9pKSk7IH0gfSBlbHNlIHsgX28tPnZlY3Rvcl9vZl9lbnVtcy5yZXNpemUoMCk7IH0gfQorICB7IGF1dG8gX2UgPSBzaWduZWRfZW51bSgpOyBfby0+c2lnbmVkX2VudW0gPSBfZTsgfQorICB7IGF1dG8gX2UgPSB0ZXN0cmVxdWlyZWRuZXN0ZWRmbGF0YnVmZmVyKCk7IGlmIChfZSkgeyBfby0+dGVzdHJlcXVpcmVkbmVzdGVkZmxhdGJ1ZmZlci5yZXNpemUoX2UtPnNpemUoKSk7IHN0ZDo6Y29weShfZS0+YmVnaW4oKSwgX2UtPmVuZCgpLCBfby0+dGVzdHJlcXVpcmVkbmVzdGVkZmxhdGJ1ZmZlci5iZWdpbigpKTsgfSB9CisgIHsgYXV0byBfZSA9IHNjYWxhcl9rZXlfc29ydGVkX3RhYmxlcygpOyBpZiAoX2UpIHsgX28tPnNjYWxhcl9rZXlfc29ydGVkX3RhYmxlcy5yZXNpemUoX2UtPnNpemUoKSk7IGZvciAoZmxhdGJ1ZmZlcnM6OnVvZmZzZXRfdCBfaSA9IDA7IF9pIDwgX2UtPnNpemUoKTsgX2krKykgeyBpZihfby0+c2NhbGFyX2tleV9zb3J0ZWRfdGFibGVzW19pXSkgeyBfZS0+R2V0KF9pKS0+VW5QYWNrVG8oX28tPnNjYWxhcl9rZXlfc29ydGVkX3RhYmxlc1tfaV0uZ2V0KCksIF9yZXNvbHZlcik7IH0gZWxzZSB7IF9vLT5zY2FsYXJfa2V5X3NvcnRlZF90YWJsZXNbX2ldID0gZmxhdGJ1ZmZlcnM6OnVuaXF1ZV9wdHI8TXlHYW1lOjpFeGFtcGxlOjpTdGF0VD4oX2UtPkdldChfaSktPlVuUGFjayhfcmVzb2x2ZXIpKTsgfTsgfSB9IGVsc2UgeyBfby0+c2NhbGFyX2tleV9zb3J0ZWRfdGFibGVzLnJlc2l6ZSgwKTsgfSB9CisgIHsgYXV0byBfZSA9IG5hdGl2ZV9pbmxpbmUoKTsgaWYgKF9lKSBfby0+bmF0aXZlX2lubGluZSA9ICpfZTsgfQorICB7IGF1dG8gX2UgPSBsb25nX2VudW1fbm9uX2VudW1fZGVmYXVsdCgpOyBfby0+bG9uZ19lbnVtX25vbl9lbnVtX2RlZmF1bHQgPSBfZTsgfQorICB7IGF1dG8gX2UgPSBsb25nX2VudW1fbm9ybWFsX2RlZmF1bHQoKTsgX28tPmxvbmdfZW51bV9ub3JtYWxfZGVmYXVsdCA9IF9lOyB9Cit9CisKK2lubGluZSBmbGF0YnVmZmVyczo6T2Zmc2V0PE1vbnN0ZXI+IE1vbnN0ZXI6OlBhY2soZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBNb25zdGVyVCogX28sIGNvbnN0IGZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIpIHsKKyAgcmV0dXJuIENyZWF0ZU1vbnN0ZXIoX2ZiYiwgX28sIF9yZWhhc2hlcik7Cit9CisKK2lubGluZSBmbGF0YnVmZmVyczo6T2Zmc2V0PE1vbnN0ZXI+IENyZWF0ZU1vbnN0ZXIoZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBNb25zdGVyVCAqX28sIGNvbnN0IGZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIpIHsKKyAgKHZvaWQpX3JlaGFzaGVyOworICAodm9pZClfbzsKKyAgc3RydWN0IF9WZWN0b3JBcmdzIHsgZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICpfX2ZiYjsgY29uc3QgTW9uc3RlclQqIF9fbzsgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9fcmVoYXNoZXI7IH0gX3ZhID0geyAmX2ZiYiwgX28sIF9yZWhhc2hlcn07ICh2b2lkKV92YTsKKyAgYXV0byBfcG9zID0gX28tPnBvcyA/IF9vLT5wb3MuZ2V0KCkgOiBudWxscHRyOworICBhdXRvIF9tYW5hID0gX28tPm1hbmE7CisgIGF1dG8gX2hwID0gX28tPmhwOworICBhdXRvIF9uYW1lID0gX2ZiYi5DcmVhdGVTdHJpbmcoX28tPm5hbWUpOworICBhdXRvIF9pbnZlbnRvcnkgPSBfby0+aW52ZW50b3J5LnNpemUoKSA/IF9mYmIuQ3JlYXRlVmVjdG9yKF9vLT5pbnZlbnRvcnkpIDogMDsKKyAgYXV0byBfY29sb3IgPSBfby0+Y29sb3I7CisgIGF1dG8gX3Rlc3RfdHlwZSA9IF9vLT50ZXN0LnR5cGU7CisgIGF1dG8gX3Rlc3QgPSBfby0+dGVzdC5QYWNrKF9mYmIpOworICBhdXRvIF90ZXN0NCA9IF9vLT50ZXN0NC5zaXplKCkgPyBfZmJiLkNyZWF0ZVZlY3Rvck9mU3RydWN0cyhfby0+dGVzdDQpIDogMDsKKyAgYXV0byBfdGVzdGFycmF5b2ZzdHJpbmcgPSBfby0+dGVzdGFycmF5b2ZzdHJpbmcuc2l6ZSgpID8gX2ZiYi5DcmVhdGVWZWN0b3JPZlN0cmluZ3MoX28tPnRlc3RhcnJheW9mc3RyaW5nKSA6IDA7CisgIGF1dG8gX3Rlc3RhcnJheW9mdGFibGVzID0gX28tPnRlc3RhcnJheW9mdGFibGVzLnNpemUoKSA/IF9mYmIuQ3JlYXRlVmVjdG9yPGZsYXRidWZmZXJzOjpPZmZzZXQ8TXlHYW1lOjpFeGFtcGxlOjpNb25zdGVyPj4gKF9vLT50ZXN0YXJyYXlvZnRhYmxlcy5zaXplKCksIFtdKHNpemVfdCBpLCBfVmVjdG9yQXJncyAqX192YSkgeyByZXR1cm4gQ3JlYXRlTW9uc3RlcigqX192YS0+X19mYmIsIF9fdmEtPl9fby0+dGVzdGFycmF5b2Z0YWJsZXNbaV0uZ2V0KCksIF9fdmEtPl9fcmVoYXNoZXIpOyB9LCAmX3ZhICkgOiAwOworICBhdXRvIF9lbmVteSA9IF9vLT5lbmVteSA/IENyZWF0ZU1vbnN0ZXIoX2ZiYiwgX28tPmVuZW15LmdldCgpLCBfcmVoYXNoZXIpIDogMDsKKyAgYXV0byBfdGVzdG5lc3RlZGZsYXRidWZmZXIgPSBfby0+dGVzdG5lc3RlZGZsYXRidWZmZXIuc2l6ZSgpID8gX2ZiYi5DcmVhdGVWZWN0b3IoX28tPnRlc3RuZXN0ZWRmbGF0YnVmZmVyKSA6IDA7CisgIGF1dG8gX3Rlc3RlbXB0eSA9IF9vLT50ZXN0ZW1wdHkgPyBDcmVhdGVTdGF0KF9mYmIsIF9vLT50ZXN0ZW1wdHkuZ2V0KCksIF9yZWhhc2hlcikgOiAwOworICBhdXRvIF90ZXN0Ym9vbCA9IF9vLT50ZXN0Ym9vbDsKKyAgYXV0byBfdGVzdGhhc2hzMzJfZm52MSA9IF9vLT50ZXN0aGFzaHMzMl9mbnYxOworICBhdXRvIF90ZXN0aGFzaHUzMl9mbnYxID0gX28tPnRlc3RoYXNodTMyX2ZudjE7CisgIGF1dG8gX3Rlc3RoYXNoczY0X2ZudjEgPSBfby0+dGVzdGhhc2hzNjRfZm52MTsKKyAgYXV0byBfdGVzdGhhc2h1NjRfZm52MSA9IF9vLT50ZXN0aGFzaHU2NF9mbnYxOworICBhdXRvIF90ZXN0aGFzaHMzMl9mbnYxYSA9IF9vLT50ZXN0aGFzaHMzMl9mbnYxYTsKKyAgYXV0byBfdGVzdGhhc2h1MzJfZm52MWEgPSBfcmVoYXNoZXIgPyBzdGF0aWNfY2FzdDx1aW50MzJfdD4oKCpfcmVoYXNoZXIpKF9vLT50ZXN0aGFzaHUzMl9mbnYxYSkpIDogMDsKKyAgYXV0byBfdGVzdGhhc2hzNjRfZm52MWEgPSBfby0+dGVzdGhhc2hzNjRfZm52MWE7CisgIGF1dG8gX3Rlc3RoYXNodTY0X2ZudjFhID0gX28tPnRlc3RoYXNodTY0X2ZudjFhOworICBhdXRvIF90ZXN0YXJyYXlvZmJvb2xzID0gX28tPnRlc3RhcnJheW9mYm9vbHMuc2l6ZSgpID8gX2ZiYi5DcmVhdGVWZWN0b3IoX28tPnRlc3RhcnJheW9mYm9vbHMpIDogMDsKKyAgYXV0byBfdGVzdGYgPSBfby0+dGVzdGY7CisgIGF1dG8gX3Rlc3RmMiA9IF9vLT50ZXN0ZjI7CisgIGF1dG8gX3Rlc3RmMyA9IF9vLT50ZXN0ZjM7CisgIGF1dG8gX3Rlc3RhcnJheW9mc3RyaW5nMiA9IF9vLT50ZXN0YXJyYXlvZnN0cmluZzIuc2l6ZSgpID8gX2ZiYi5DcmVhdGVWZWN0b3JPZlN0cmluZ3MoX28tPnRlc3RhcnJheW9mc3RyaW5nMikgOiAwOworICBhdXRvIF90ZXN0YXJyYXlvZnNvcnRlZHN0cnVjdCA9IF9vLT50ZXN0YXJyYXlvZnNvcnRlZHN0cnVjdC5zaXplKCkgPyBfZmJiLkNyZWF0ZVZlY3Rvck9mU3RydWN0cyhfby0+dGVzdGFycmF5b2Zzb3J0ZWRzdHJ1Y3QpIDogMDsKKyAgYXV0byBfZmxleCA9IF9vLT5mbGV4LnNpemUoKSA/IF9mYmIuQ3JlYXRlVmVjdG9yKF9vLT5mbGV4KSA6IDA7CisgIGF1dG8gX3Rlc3Q1ID0gX28tPnRlc3Q1LnNpemUoKSA/IF9mYmIuQ3JlYXRlVmVjdG9yT2ZTdHJ1Y3RzKF9vLT50ZXN0NSkgOiAwOworICBhdXRvIF92ZWN0b3Jfb2ZfbG9uZ3MgPSBfby0+dmVjdG9yX29mX2xvbmdzLnNpemUoKSA/IF9mYmIuQ3JlYXRlVmVjdG9yKF9vLT52ZWN0b3Jfb2ZfbG9uZ3MpIDogMDsKKyAgYXV0byBfdmVjdG9yX29mX2RvdWJsZXMgPSBfby0+dmVjdG9yX29mX2RvdWJsZXMuc2l6ZSgpID8gX2ZiYi5DcmVhdGVWZWN0b3IoX28tPnZlY3Rvcl9vZl9kb3VibGVzKSA6IDA7CisgIGF1dG8gX3BhcmVudF9uYW1lc3BhY2VfdGVzdCA9IF9vLT5wYXJlbnRfbmFtZXNwYWNlX3Rlc3QgPyBDcmVhdGVJblBhcmVudE5hbWVzcGFjZShfZmJiLCBfby0+cGFyZW50X25hbWVzcGFjZV90ZXN0LmdldCgpLCBfcmVoYXNoZXIpIDogMDsKKyAgYXV0byBfdmVjdG9yX29mX3JlZmVycmFibGVzID0gX28tPnZlY3Rvcl9vZl9yZWZlcnJhYmxlcy5zaXplKCkgPyBfZmJiLkNyZWF0ZVZlY3RvcjxmbGF0YnVmZmVyczo6T2Zmc2V0PE15R2FtZTo6RXhhbXBsZTo6UmVmZXJyYWJsZT4+IChfby0+dmVjdG9yX29mX3JlZmVycmFibGVzLnNpemUoKSwgW10oc2l6ZV90IGksIF9WZWN0b3JBcmdzICpfX3ZhKSB7IHJldHVybiBDcmVhdGVSZWZlcnJhYmxlKCpfX3ZhLT5fX2ZiYiwgX192YS0+X19vLT52ZWN0b3Jfb2ZfcmVmZXJyYWJsZXNbaV0uZ2V0KCksIF9fdmEtPl9fcmVoYXNoZXIpOyB9LCAmX3ZhICkgOiAwOworICBhdXRvIF9zaW5nbGVfd2Vha19yZWZlcmVuY2UgPSBfcmVoYXNoZXIgPyBzdGF0aWNfY2FzdDx1aW50NjRfdD4oKCpfcmVoYXNoZXIpKF9vLT5zaW5nbGVfd2Vha19yZWZlcmVuY2UpKSA6IDA7CisgIGF1dG8gX3ZlY3Rvcl9vZl93ZWFrX3JlZmVyZW5jZXMgPSBfby0+dmVjdG9yX29mX3dlYWtfcmVmZXJlbmNlcy5zaXplKCkgPyBfZmJiLkNyZWF0ZVZlY3Rvcjx1aW50NjRfdD4oX28tPnZlY3Rvcl9vZl93ZWFrX3JlZmVyZW5jZXMuc2l6ZSgpLCBbXShzaXplX3QgaSwgX1ZlY3RvckFyZ3MgKl9fdmEpIHsgcmV0dXJuIF9fdmEtPl9fcmVoYXNoZXIgPyBzdGF0aWNfY2FzdDx1aW50NjRfdD4oKCpfX3ZhLT5fX3JlaGFzaGVyKShfX3ZhLT5fX28tPnZlY3Rvcl9vZl93ZWFrX3JlZmVyZW5jZXNbaV0pKSA6IDA7IH0sICZfdmEgKSA6IDA7CisgIGF1dG8gX3ZlY3Rvcl9vZl9zdHJvbmdfcmVmZXJyYWJsZXMgPSBfby0+dmVjdG9yX29mX3N0cm9uZ19yZWZlcnJhYmxlcy5zaXplKCkgPyBfZmJiLkNyZWF0ZVZlY3RvcjxmbGF0YnVmZmVyczo6T2Zmc2V0PE15R2FtZTo6RXhhbXBsZTo6UmVmZXJyYWJsZT4+IChfby0+dmVjdG9yX29mX3N0cm9uZ19yZWZlcnJhYmxlcy5zaXplKCksIFtdKHNpemVfdCBpLCBfVmVjdG9yQXJncyAqX192YSkgeyByZXR1cm4gQ3JlYXRlUmVmZXJyYWJsZSgqX192YS0+X19mYmIsIF9fdmEtPl9fby0+dmVjdG9yX29mX3N0cm9uZ19yZWZlcnJhYmxlc1tpXS5nZXQoKSwgX192YS0+X19yZWhhc2hlcik7IH0sICZfdmEgKSA6IDA7CisgIGF1dG8gX2NvX293bmluZ19yZWZlcmVuY2UgPSBfcmVoYXNoZXIgPyBzdGF0aWNfY2FzdDx1aW50NjRfdD4oKCpfcmVoYXNoZXIpKF9vLT5jb19vd25pbmdfcmVmZXJlbmNlKSkgOiAwOworICBhdXRvIF92ZWN0b3Jfb2ZfY29fb3duaW5nX3JlZmVyZW5jZXMgPSBfby0+dmVjdG9yX29mX2NvX293bmluZ19yZWZlcmVuY2VzLnNpemUoKSA/IF9mYmIuQ3JlYXRlVmVjdG9yPHVpbnQ2NF90Pihfby0+dmVjdG9yX29mX2NvX293bmluZ19yZWZlcmVuY2VzLnNpemUoKSwgW10oc2l6ZV90IGksIF9WZWN0b3JBcmdzICpfX3ZhKSB7IHJldHVybiBfX3ZhLT5fX3JlaGFzaGVyID8gc3RhdGljX2Nhc3Q8dWludDY0X3Q+KCgqX192YS0+X19yZWhhc2hlcikoX192YS0+X19vLT52ZWN0b3Jfb2ZfY29fb3duaW5nX3JlZmVyZW5jZXNbaV0uZ2V0KCkpKSA6IDA7IH0sICZfdmEgKSA6IDA7CisgIGF1dG8gX25vbl9vd25pbmdfcmVmZXJlbmNlID0gX3JlaGFzaGVyID8gc3RhdGljX2Nhc3Q8dWludDY0X3Q+KCgqX3JlaGFzaGVyKShfby0+bm9uX293bmluZ19yZWZlcmVuY2UpKSA6IDA7CisgIGF1dG8gX3ZlY3Rvcl9vZl9ub25fb3duaW5nX3JlZmVyZW5jZXMgPSBfby0+dmVjdG9yX29mX25vbl9vd25pbmdfcmVmZXJlbmNlcy5zaXplKCkgPyBfZmJiLkNyZWF0ZVZlY3Rvcjx1aW50NjRfdD4oX28tPnZlY3Rvcl9vZl9ub25fb3duaW5nX3JlZmVyZW5jZXMuc2l6ZSgpLCBbXShzaXplX3QgaSwgX1ZlY3RvckFyZ3MgKl9fdmEpIHsgcmV0dXJuIF9fdmEtPl9fcmVoYXNoZXIgPyBzdGF0aWNfY2FzdDx1aW50NjRfdD4oKCpfX3ZhLT5fX3JlaGFzaGVyKShfX3ZhLT5fX28tPnZlY3Rvcl9vZl9ub25fb3duaW5nX3JlZmVyZW5jZXNbaV0pKSA6IDA7IH0sICZfdmEgKSA6IDA7CisgIGF1dG8gX2FueV91bmlxdWVfdHlwZSA9IF9vLT5hbnlfdW5pcXVlLnR5cGU7CisgIGF1dG8gX2FueV91bmlxdWUgPSBfby0+YW55X3VuaXF1ZS5QYWNrKF9mYmIpOworICBhdXRvIF9hbnlfYW1iaWd1b3VzX3R5cGUgPSBfby0+YW55X2FtYmlndW91cy50eXBlOworICBhdXRvIF9hbnlfYW1iaWd1b3VzID0gX28tPmFueV9hbWJpZ3VvdXMuUGFjayhfZmJiKTsKKyAgYXV0byBfdmVjdG9yX29mX2VudW1zID0gX28tPnZlY3Rvcl9vZl9lbnVtcy5zaXplKCkgPyBfZmJiLkNyZWF0ZVZlY3RvclNjYWxhckNhc3Q8dWludDhfdD4oZmxhdGJ1ZmZlcnM6OmRhdGEoX28tPnZlY3Rvcl9vZl9lbnVtcyksIF9vLT52ZWN0b3Jfb2ZfZW51bXMuc2l6ZSgpKSA6IDA7CisgIGF1dG8gX3NpZ25lZF9lbnVtID0gX28tPnNpZ25lZF9lbnVtOworICBhdXRvIF90ZXN0cmVxdWlyZWRuZXN0ZWRmbGF0YnVmZmVyID0gX28tPnRlc3RyZXF1aXJlZG5lc3RlZGZsYXRidWZmZXIuc2l6ZSgpID8gX2ZiYi5DcmVhdGVWZWN0b3IoX28tPnRlc3RyZXF1aXJlZG5lc3RlZGZsYXRidWZmZXIpIDogMDsKKyAgYXV0byBfc2NhbGFyX2tleV9zb3J0ZWRfdGFibGVzID0gX28tPnNjYWxhcl9rZXlfc29ydGVkX3RhYmxlcy5zaXplKCkgPyBfZmJiLkNyZWF0ZVZlY3RvcjxmbGF0YnVmZmVyczo6T2Zmc2V0PE15R2FtZTo6RXhhbXBsZTo6U3RhdD4+IChfby0+c2NhbGFyX2tleV9zb3J0ZWRfdGFibGVzLnNpemUoKSwgW10oc2l6ZV90IGksIF9WZWN0b3JBcmdzICpfX3ZhKSB7IHJldHVybiBDcmVhdGVTdGF0KCpfX3ZhLT5fX2ZiYiwgX192YS0+X19vLT5zY2FsYXJfa2V5X3NvcnRlZF90YWJsZXNbaV0uZ2V0KCksIF9fdmEtPl9fcmVoYXNoZXIpOyB9LCAmX3ZhICkgOiAwOworICBhdXRvIF9uYXRpdmVfaW5saW5lID0gJl9vLT5uYXRpdmVfaW5saW5lOworICBhdXRvIF9sb25nX2VudW1fbm9uX2VudW1fZGVmYXVsdCA9IF9vLT5sb25nX2VudW1fbm9uX2VudW1fZGVmYXVsdDsKKyAgYXV0byBfbG9uZ19lbnVtX25vcm1hbF9kZWZhdWx0ID0gX28tPmxvbmdfZW51bV9ub3JtYWxfZGVmYXVsdDsKKyAgcmV0dXJuIE15R2FtZTo6RXhhbXBsZTo6Q3JlYXRlTW9uc3RlcigKKyAgICAgIF9mYmIsCisgICAgICBfcG9zLAorICAgICAgX21hbmEsCisgICAgICBfaHAsCisgICAgICBfbmFtZSwKKyAgICAgIF9pbnZlbnRvcnksCisgICAgICBfY29sb3IsCisgICAgICBfdGVzdF90eXBlLAorICAgICAgX3Rlc3QsCisgICAgICBfdGVzdDQsCisgICAgICBfdGVzdGFycmF5b2ZzdHJpbmcsCisgICAgICBfdGVzdGFycmF5b2Z0YWJsZXMsCisgICAgICBfZW5lbXksCisgICAgICBfdGVzdG5lc3RlZGZsYXRidWZmZXIsCisgICAgICBfdGVzdGVtcHR5LAorICAgICAgX3Rlc3Rib29sLAorICAgICAgX3Rlc3RoYXNoczMyX2ZudjEsCisgICAgICBfdGVzdGhhc2h1MzJfZm52MSwKKyAgICAgIF90ZXN0aGFzaHM2NF9mbnYxLAorICAgICAgX3Rlc3RoYXNodTY0X2ZudjEsCisgICAgICBfdGVzdGhhc2hzMzJfZm52MWEsCisgICAgICBfdGVzdGhhc2h1MzJfZm52MWEsCisgICAgICBfdGVzdGhhc2hzNjRfZm52MWEsCisgICAgICBfdGVzdGhhc2h1NjRfZm52MWEsCisgICAgICBfdGVzdGFycmF5b2Zib29scywKKyAgICAgIF90ZXN0ZiwKKyAgICAgIF90ZXN0ZjIsCisgICAgICBfdGVzdGYzLAorICAgICAgX3Rlc3RhcnJheW9mc3RyaW5nMiwKKyAgICAgIF90ZXN0YXJyYXlvZnNvcnRlZHN0cnVjdCwKKyAgICAgIF9mbGV4LAorICAgICAgX3Rlc3Q1LAorICAgICAgX3ZlY3Rvcl9vZl9sb25ncywKKyAgICAgIF92ZWN0b3Jfb2ZfZG91YmxlcywKKyAgICAgIF9wYXJlbnRfbmFtZXNwYWNlX3Rlc3QsCisgICAgICBfdmVjdG9yX29mX3JlZmVycmFibGVzLAorICAgICAgX3NpbmdsZV93ZWFrX3JlZmVyZW5jZSwKKyAgICAgIF92ZWN0b3Jfb2Zfd2Vha19yZWZlcmVuY2VzLAorICAgICAgX3ZlY3Rvcl9vZl9zdHJvbmdfcmVmZXJyYWJsZXMsCisgICAgICBfY29fb3duaW5nX3JlZmVyZW5jZSwKKyAgICAgIF92ZWN0b3Jfb2ZfY29fb3duaW5nX3JlZmVyZW5jZXMsCisgICAgICBfbm9uX293bmluZ19yZWZlcmVuY2UsCisgICAgICBfdmVjdG9yX29mX25vbl9vd25pbmdfcmVmZXJlbmNlcywKKyAgICAgIF9hbnlfdW5pcXVlX3R5cGUsCisgICAgICBfYW55X3VuaXF1ZSwKKyAgICAgIF9hbnlfYW1iaWd1b3VzX3R5cGUsCisgICAgICBfYW55X2FtYmlndW91cywKKyAgICAgIF92ZWN0b3Jfb2ZfZW51bXMsCisgICAgICBfc2lnbmVkX2VudW0sCisgICAgICBfdGVzdHJlcXVpcmVkbmVzdGVkZmxhdGJ1ZmZlciwKKyAgICAgIF9zY2FsYXJfa2V5X3NvcnRlZF90YWJsZXMsCisgICAgICBfbmF0aXZlX2lubGluZSwKKyAgICAgIF9sb25nX2VudW1fbm9uX2VudW1fZGVmYXVsdCwKKyAgICAgIF9sb25nX2VudW1fbm9ybWFsX2RlZmF1bHQpOworfQorCisKK2lubGluZSBib29sIG9wZXJhdG9yPT0oY29uc3QgVHlwZUFsaWFzZXNUICZsaHMsIGNvbnN0IFR5cGVBbGlhc2VzVCAmcmhzKSB7CisgIHJldHVybgorICAgICAgKGxocy5pOCA9PSByaHMuaTgpICYmCisgICAgICAobGhzLnU4ID09IHJocy51OCkgJiYKKyAgICAgIChsaHMuaTE2ID09IHJocy5pMTYpICYmCisgICAgICAobGhzLnUxNiA9PSByaHMudTE2KSAmJgorICAgICAgKGxocy5pMzIgPT0gcmhzLmkzMikgJiYKKyAgICAgIChsaHMudTMyID09IHJocy51MzIpICYmCisgICAgICAobGhzLmk2NCA9PSByaHMuaTY0KSAmJgorICAgICAgKGxocy51NjQgPT0gcmhzLnU2NCkgJiYKKyAgICAgIChsaHMuZjMyID09IHJocy5mMzIpICYmCisgICAgICAobGhzLmY2NCA9PSByaHMuZjY0KSAmJgorICAgICAgKGxocy52OCA9PSByaHMudjgpICYmCisgICAgICAobGhzLnZmNjQgPT0gcmhzLnZmNjQpOworfQorCitpbmxpbmUgYm9vbCBvcGVyYXRvciE9KGNvbnN0IFR5cGVBbGlhc2VzVCAmbGhzLCBjb25zdCBUeXBlQWxpYXNlc1QgJnJocykgeworICAgIHJldHVybiAhKGxocyA9PSByaHMpOworfQorCisKK2lubGluZSBUeXBlQWxpYXNlc1QgKlR5cGVBbGlhc2VzOjpVblBhY2soY29uc3QgZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlcikgY29uc3QgeworICBhdXRvIF9vID0gc3RkOjp1bmlxdWVfcHRyPFR5cGVBbGlhc2VzVD4obmV3IFR5cGVBbGlhc2VzVCgpKTsKKyAgVW5QYWNrVG8oX28uZ2V0KCksIF9yZXNvbHZlcik7CisgIHJldHVybiBfby5yZWxlYXNlKCk7Cit9CisKK2lubGluZSB2b2lkIFR5cGVBbGlhc2VzOjpVblBhY2tUbyhUeXBlQWxpYXNlc1QgKl9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyKSBjb25zdCB7CisgICh2b2lkKV9vOworICAodm9pZClfcmVzb2x2ZXI7CisgIHsgYXV0byBfZSA9IGk4KCk7IF9vLT5pOCA9IF9lOyB9CisgIHsgYXV0byBfZSA9IHU4KCk7IF9vLT51OCA9IF9lOyB9CisgIHsgYXV0byBfZSA9IGkxNigpOyBfby0+aTE2ID0gX2U7IH0KKyAgeyBhdXRvIF9lID0gdTE2KCk7IF9vLT51MTYgPSBfZTsgfQorICB7IGF1dG8gX2UgPSBpMzIoKTsgX28tPmkzMiA9IF9lOyB9CisgIHsgYXV0byBfZSA9IHUzMigpOyBfby0+dTMyID0gX2U7IH0KKyAgeyBhdXRvIF9lID0gaTY0KCk7IF9vLT5pNjQgPSBfZTsgfQorICB7IGF1dG8gX2UgPSB1NjQoKTsgX28tPnU2NCA9IF9lOyB9CisgIHsgYXV0byBfZSA9IGYzMigpOyBfby0+ZjMyID0gX2U7IH0KKyAgeyBhdXRvIF9lID0gZjY0KCk7IF9vLT5mNjQgPSBfZTsgfQorICB7IGF1dG8gX2UgPSB2OCgpOyBpZiAoX2UpIHsgX28tPnY4LnJlc2l6ZShfZS0+c2l6ZSgpKTsgc3RkOjpjb3B5KF9lLT5iZWdpbigpLCBfZS0+ZW5kKCksIF9vLT52OC5iZWdpbigpKTsgfSB9CisgIHsgYXV0byBfZSA9IHZmNjQoKTsgaWYgKF9lKSB7IF9vLT52ZjY0LnJlc2l6ZShfZS0+c2l6ZSgpKTsgZm9yIChmbGF0YnVmZmVyczo6dW9mZnNldF90IF9pID0gMDsgX2kgPCBfZS0+c2l6ZSgpOyBfaSsrKSB7IF9vLT52ZjY0W19pXSA9IF9lLT5HZXQoX2kpOyB9IH0gZWxzZSB7IF9vLT52ZjY0LnJlc2l6ZSgwKTsgfSB9Cit9CisKK2lubGluZSBmbGF0YnVmZmVyczo6T2Zmc2V0PFR5cGVBbGlhc2VzPiBUeXBlQWxpYXNlczo6UGFjayhmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IFR5cGVBbGlhc2VzVCogX28sIGNvbnN0IGZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIpIHsKKyAgcmV0dXJuIENyZWF0ZVR5cGVBbGlhc2VzKF9mYmIsIF9vLCBfcmVoYXNoZXIpOworfQorCitpbmxpbmUgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxUeXBlQWxpYXNlcz4gQ3JlYXRlVHlwZUFsaWFzZXMoZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBUeXBlQWxpYXNlc1QgKl9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyKSB7CisgICh2b2lkKV9yZWhhc2hlcjsKKyAgKHZvaWQpX287CisgIHN0cnVjdCBfVmVjdG9yQXJncyB7IGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAqX19mYmI7IGNvbnN0IFR5cGVBbGlhc2VzVCogX19vOyBjb25zdCBmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX19yZWhhc2hlcjsgfSBfdmEgPSB7ICZfZmJiLCBfbywgX3JlaGFzaGVyfTsgKHZvaWQpX3ZhOworICBhdXRvIF9pOCA9IF9vLT5pODsKKyAgYXV0byBfdTggPSBfby0+dTg7CisgIGF1dG8gX2kxNiA9IF9vLT5pMTY7CisgIGF1dG8gX3UxNiA9IF9vLT51MTY7CisgIGF1dG8gX2kzMiA9IF9vLT5pMzI7CisgIGF1dG8gX3UzMiA9IF9vLT51MzI7CisgIGF1dG8gX2k2NCA9IF9vLT5pNjQ7CisgIGF1dG8gX3U2NCA9IF9vLT51NjQ7CisgIGF1dG8gX2YzMiA9IF9vLT5mMzI7CisgIGF1dG8gX2Y2NCA9IF9vLT5mNjQ7CisgIGF1dG8gX3Y4ID0gX28tPnY4LnNpemUoKSA/IF9mYmIuQ3JlYXRlVmVjdG9yKF9vLT52OCkgOiAwOworICBhdXRvIF92ZjY0ID0gX28tPnZmNjQuc2l6ZSgpID8gX2ZiYi5DcmVhdGVWZWN0b3IoX28tPnZmNjQpIDogMDsKKyAgcmV0dXJuIE15R2FtZTo6RXhhbXBsZTo6Q3JlYXRlVHlwZUFsaWFzZXMoCisgICAgICBfZmJiLAorICAgICAgX2k4LAorICAgICAgX3U4LAorICAgICAgX2kxNiwKKyAgICAgIF91MTYsCisgICAgICBfaTMyLAorICAgICAgX3UzMiwKKyAgICAgIF9pNjQsCisgICAgICBfdTY0LAorICAgICAgX2YzMiwKKyAgICAgIF9mNjQsCisgICAgICBfdjgsCisgICAgICBfdmY2NCk7Cit9CisKK2lubGluZSBib29sIFZlcmlmeUFueShmbGF0YnVmZmVyczo6VmVyaWZpZXIgJnZlcmlmaWVyLCBjb25zdCB2b2lkICpvYmosIEFueSB0eXBlKSB7CisgIHN3aXRjaCAodHlwZSkgeworICAgIGNhc2UgQW55X05PTkU6IHsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICBjYXNlIEFueV9Nb25zdGVyOiB7CisgICAgICBhdXRvIHB0ciA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgTXlHYW1lOjpFeGFtcGxlOjpNb25zdGVyICo+KG9iaik7CisgICAgICByZXR1cm4gdmVyaWZpZXIuVmVyaWZ5VGFibGUocHRyKTsKKyAgICB9CisgICAgY2FzZSBBbnlfVGVzdFNpbXBsZVRhYmxlV2l0aEVudW06IHsKKyAgICAgIGF1dG8gcHRyID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBNeUdhbWU6OkV4YW1wbGU6OlRlc3RTaW1wbGVUYWJsZVdpdGhFbnVtICo+KG9iaik7CisgICAgICByZXR1cm4gdmVyaWZpZXIuVmVyaWZ5VGFibGUocHRyKTsKKyAgICB9CisgICAgY2FzZSBBbnlfTXlHYW1lX0V4YW1wbGUyX01vbnN0ZXI6IHsKKyAgICAgIGF1dG8gcHRyID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBNeUdhbWU6OkV4YW1wbGUyOjpNb25zdGVyICo+KG9iaik7CisgICAgICByZXR1cm4gdmVyaWZpZXIuVmVyaWZ5VGFibGUocHRyKTsKKyAgICB9CisgICAgZGVmYXVsdDogcmV0dXJuIHRydWU7CisgIH0KK30KKworaW5saW5lIGJvb2wgVmVyaWZ5QW55VmVjdG9yKGZsYXRidWZmZXJzOjpWZXJpZmllciAmdmVyaWZpZXIsIGNvbnN0IGZsYXRidWZmZXJzOjpWZWN0b3I8ZmxhdGJ1ZmZlcnM6Ok9mZnNldDx2b2lkPj4gKnZhbHVlcywgY29uc3QgZmxhdGJ1ZmZlcnM6OlZlY3Rvcjx1aW50OF90PiAqdHlwZXMpIHsKKyAgaWYgKCF2YWx1ZXMgfHwgIXR5cGVzKSByZXR1cm4gIXZhbHVlcyAmJiAhdHlwZXM7CisgIGlmICh2YWx1ZXMtPnNpemUoKSAhPSB0eXBlcy0+c2l6ZSgpKSByZXR1cm4gZmFsc2U7CisgIGZvciAoZmxhdGJ1ZmZlcnM6OnVvZmZzZXRfdCBpID0gMDsgaSA8IHZhbHVlcy0+c2l6ZSgpOyArK2kpIHsKKyAgICBpZiAoIVZlcmlmeUFueSgKKyAgICAgICAgdmVyaWZpZXIsICB2YWx1ZXMtPkdldChpKSwgdHlwZXMtPkdldEVudW08QW55PihpKSkpIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIHRydWU7Cit9CisKK2lubGluZSB2b2lkICpBbnlVbmlvbjo6VW5QYWNrKGNvbnN0IHZvaWQgKm9iaiwgQW55IHR5cGUsIGNvbnN0IGZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpyZXNvbHZlcikgeworICAodm9pZClyZXNvbHZlcjsKKyAgc3dpdGNoICh0eXBlKSB7CisgICAgY2FzZSBBbnlfTW9uc3RlcjogeworICAgICAgYXV0byBwdHIgPSByZWludGVycHJldF9jYXN0PGNvbnN0IE15R2FtZTo6RXhhbXBsZTo6TW9uc3RlciAqPihvYmopOworICAgICAgcmV0dXJuIHB0ci0+VW5QYWNrKHJlc29sdmVyKTsKKyAgICB9CisgICAgY2FzZSBBbnlfVGVzdFNpbXBsZVRhYmxlV2l0aEVudW06IHsKKyAgICAgIGF1dG8gcHRyID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBNeUdhbWU6OkV4YW1wbGU6OlRlc3RTaW1wbGVUYWJsZVdpdGhFbnVtICo+KG9iaik7CisgICAgICByZXR1cm4gcHRyLT5VblBhY2socmVzb2x2ZXIpOworICAgIH0KKyAgICBjYXNlIEFueV9NeUdhbWVfRXhhbXBsZTJfTW9uc3RlcjogeworICAgICAgYXV0byBwdHIgPSByZWludGVycHJldF9jYXN0PGNvbnN0IE15R2FtZTo6RXhhbXBsZTI6Ok1vbnN0ZXIgKj4ob2JqKTsKKyAgICAgIHJldHVybiBwdHItPlVuUGFjayhyZXNvbHZlcik7CisgICAgfQorICAgIGRlZmF1bHQ6IHJldHVybiBudWxscHRyOworICB9Cit9CisKK2lubGluZSBmbGF0YnVmZmVyczo6T2Zmc2V0PHZvaWQ+IEFueVVuaW9uOjpQYWNrKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlcikgY29uc3QgeworICAodm9pZClfcmVoYXNoZXI7CisgIHN3aXRjaCAodHlwZSkgeworICAgIGNhc2UgQW55X01vbnN0ZXI6IHsKKyAgICAgIGF1dG8gcHRyID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBNeUdhbWU6OkV4YW1wbGU6Ok1vbnN0ZXJUICo+KHZhbHVlKTsKKyAgICAgIHJldHVybiBDcmVhdGVNb25zdGVyKF9mYmIsIHB0ciwgX3JlaGFzaGVyKS5VbmlvbigpOworICAgIH0KKyAgICBjYXNlIEFueV9UZXN0U2ltcGxlVGFibGVXaXRoRW51bTogeworICAgICAgYXV0byBwdHIgPSByZWludGVycHJldF9jYXN0PGNvbnN0IE15R2FtZTo6RXhhbXBsZTo6VGVzdFNpbXBsZVRhYmxlV2l0aEVudW1UICo+KHZhbHVlKTsKKyAgICAgIHJldHVybiBDcmVhdGVUZXN0U2ltcGxlVGFibGVXaXRoRW51bShfZmJiLCBwdHIsIF9yZWhhc2hlcikuVW5pb24oKTsKKyAgICB9CisgICAgY2FzZSBBbnlfTXlHYW1lX0V4YW1wbGUyX01vbnN0ZXI6IHsKKyAgICAgIGF1dG8gcHRyID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBNeUdhbWU6OkV4YW1wbGUyOjpNb25zdGVyVCAqPih2YWx1ZSk7CisgICAgICByZXR1cm4gQ3JlYXRlTW9uc3RlcihfZmJiLCBwdHIsIF9yZWhhc2hlcikuVW5pb24oKTsKKyAgICB9CisgICAgZGVmYXVsdDogcmV0dXJuIDA7CisgIH0KK30KKworaW5saW5lIEFueVVuaW9uOjpBbnlVbmlvbihjb25zdCBBbnlVbmlvbiAmdSkgOiB0eXBlKHUudHlwZSksIHZhbHVlKG51bGxwdHIpIHsKKyAgc3dpdGNoICh0eXBlKSB7CisgICAgY2FzZSBBbnlfTW9uc3RlcjogeworICAgICAgdmFsdWUgPSBuZXcgTXlHYW1lOjpFeGFtcGxlOjpNb25zdGVyVCgqcmVpbnRlcnByZXRfY2FzdDxNeUdhbWU6OkV4YW1wbGU6Ok1vbnN0ZXJUICo+KHUudmFsdWUpKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIEFueV9UZXN0U2ltcGxlVGFibGVXaXRoRW51bTogeworICAgICAgdmFsdWUgPSBuZXcgTXlHYW1lOjpFeGFtcGxlOjpUZXN0U2ltcGxlVGFibGVXaXRoRW51bVQoKnJlaW50ZXJwcmV0X2Nhc3Q8TXlHYW1lOjpFeGFtcGxlOjpUZXN0U2ltcGxlVGFibGVXaXRoRW51bVQgKj4odS52YWx1ZSkpOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgQW55X015R2FtZV9FeGFtcGxlMl9Nb25zdGVyOiB7CisgICAgICB2YWx1ZSA9IG5ldyBNeUdhbWU6OkV4YW1wbGUyOjpNb25zdGVyVCgqcmVpbnRlcnByZXRfY2FzdDxNeUdhbWU6OkV4YW1wbGUyOjpNb25zdGVyVCAqPih1LnZhbHVlKSk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9Cit9CisKK2lubGluZSB2b2lkIEFueVVuaW9uOjpSZXNldCgpIHsKKyAgc3dpdGNoICh0eXBlKSB7CisgICAgY2FzZSBBbnlfTW9uc3RlcjogeworICAgICAgYXV0byBwdHIgPSByZWludGVycHJldF9jYXN0PE15R2FtZTo6RXhhbXBsZTo6TW9uc3RlclQgKj4odmFsdWUpOworICAgICAgZGVsZXRlIHB0cjsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIEFueV9UZXN0U2ltcGxlVGFibGVXaXRoRW51bTogeworICAgICAgYXV0byBwdHIgPSByZWludGVycHJldF9jYXN0PE15R2FtZTo6RXhhbXBsZTo6VGVzdFNpbXBsZVRhYmxlV2l0aEVudW1UICo+KHZhbHVlKTsKKyAgICAgIGRlbGV0ZSBwdHI7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBBbnlfTXlHYW1lX0V4YW1wbGUyX01vbnN0ZXI6IHsKKyAgICAgIGF1dG8gcHRyID0gcmVpbnRlcnByZXRfY2FzdDxNeUdhbWU6OkV4YW1wbGUyOjpNb25zdGVyVCAqPih2YWx1ZSk7CisgICAgICBkZWxldGUgcHRyOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGRlZmF1bHQ6IGJyZWFrOworICB9CisgIHZhbHVlID0gbnVsbHB0cjsKKyAgdHlwZSA9IEFueV9OT05FOworfQorCitpbmxpbmUgYm9vbCBWZXJpZnlBbnlVbmlxdWVBbGlhc2VzKGZsYXRidWZmZXJzOjpWZXJpZmllciAmdmVyaWZpZXIsIGNvbnN0IHZvaWQgKm9iaiwgQW55VW5pcXVlQWxpYXNlcyB0eXBlKSB7CisgIHN3aXRjaCAodHlwZSkgeworICAgIGNhc2UgQW55VW5pcXVlQWxpYXNlc19OT05FOiB7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgY2FzZSBBbnlVbmlxdWVBbGlhc2VzX006IHsKKyAgICAgIGF1dG8gcHRyID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBNeUdhbWU6OkV4YW1wbGU6Ok1vbnN0ZXIgKj4ob2JqKTsKKyAgICAgIHJldHVybiB2ZXJpZmllci5WZXJpZnlUYWJsZShwdHIpOworICAgIH0KKyAgICBjYXNlIEFueVVuaXF1ZUFsaWFzZXNfVFM6IHsKKyAgICAgIGF1dG8gcHRyID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBNeUdhbWU6OkV4YW1wbGU6OlRlc3RTaW1wbGVUYWJsZVdpdGhFbnVtICo+KG9iaik7CisgICAgICByZXR1cm4gdmVyaWZpZXIuVmVyaWZ5VGFibGUocHRyKTsKKyAgICB9CisgICAgY2FzZSBBbnlVbmlxdWVBbGlhc2VzX00yOiB7CisgICAgICBhdXRvIHB0ciA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgTXlHYW1lOjpFeGFtcGxlMjo6TW9uc3RlciAqPihvYmopOworICAgICAgcmV0dXJuIHZlcmlmaWVyLlZlcmlmeVRhYmxlKHB0cik7CisgICAgfQorICAgIGRlZmF1bHQ6IHJldHVybiB0cnVlOworICB9Cit9CisKK2lubGluZSBib29sIFZlcmlmeUFueVVuaXF1ZUFsaWFzZXNWZWN0b3IoZmxhdGJ1ZmZlcnM6OlZlcmlmaWVyICZ2ZXJpZmllciwgY29uc3QgZmxhdGJ1ZmZlcnM6OlZlY3RvcjxmbGF0YnVmZmVyczo6T2Zmc2V0PHZvaWQ+PiAqdmFsdWVzLCBjb25zdCBmbGF0YnVmZmVyczo6VmVjdG9yPHVpbnQ4X3Q+ICp0eXBlcykgeworICBpZiAoIXZhbHVlcyB8fCAhdHlwZXMpIHJldHVybiAhdmFsdWVzICYmICF0eXBlczsKKyAgaWYgKHZhbHVlcy0+c2l6ZSgpICE9IHR5cGVzLT5zaXplKCkpIHJldHVybiBmYWxzZTsKKyAgZm9yIChmbGF0YnVmZmVyczo6dW9mZnNldF90IGkgPSAwOyBpIDwgdmFsdWVzLT5zaXplKCk7ICsraSkgeworICAgIGlmICghVmVyaWZ5QW55VW5pcXVlQWxpYXNlcygKKyAgICAgICAgdmVyaWZpZXIsICB2YWx1ZXMtPkdldChpKSwgdHlwZXMtPkdldEVudW08QW55VW5pcXVlQWxpYXNlcz4oaSkpKSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICB9CisgIHJldHVybiB0cnVlOworfQorCitpbmxpbmUgdm9pZCAqQW55VW5pcXVlQWxpYXNlc1VuaW9uOjpVblBhY2soY29uc3Qgdm9pZCAqb2JqLCBBbnlVbmlxdWVBbGlhc2VzIHR5cGUsIGNvbnN0IGZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpyZXNvbHZlcikgeworICAodm9pZClyZXNvbHZlcjsKKyAgc3dpdGNoICh0eXBlKSB7CisgICAgY2FzZSBBbnlVbmlxdWVBbGlhc2VzX006IHsKKyAgICAgIGF1dG8gcHRyID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBNeUdhbWU6OkV4YW1wbGU6Ok1vbnN0ZXIgKj4ob2JqKTsKKyAgICAgIHJldHVybiBwdHItPlVuUGFjayhyZXNvbHZlcik7CisgICAgfQorICAgIGNhc2UgQW55VW5pcXVlQWxpYXNlc19UUzogeworICAgICAgYXV0byBwdHIgPSByZWludGVycHJldF9jYXN0PGNvbnN0IE15R2FtZTo6RXhhbXBsZTo6VGVzdFNpbXBsZVRhYmxlV2l0aEVudW0gKj4ob2JqKTsKKyAgICAgIHJldHVybiBwdHItPlVuUGFjayhyZXNvbHZlcik7CisgICAgfQorICAgIGNhc2UgQW55VW5pcXVlQWxpYXNlc19NMjogeworICAgICAgYXV0byBwdHIgPSByZWludGVycHJldF9jYXN0PGNvbnN0IE15R2FtZTo6RXhhbXBsZTI6Ok1vbnN0ZXIgKj4ob2JqKTsKKyAgICAgIHJldHVybiBwdHItPlVuUGFjayhyZXNvbHZlcik7CisgICAgfQorICAgIGRlZmF1bHQ6IHJldHVybiBudWxscHRyOworICB9Cit9CisKK2lubGluZSBmbGF0YnVmZmVyczo6T2Zmc2V0PHZvaWQ+IEFueVVuaXF1ZUFsaWFzZXNVbmlvbjo6UGFjayhmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IGZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIpIGNvbnN0IHsKKyAgKHZvaWQpX3JlaGFzaGVyOworICBzd2l0Y2ggKHR5cGUpIHsKKyAgICBjYXNlIEFueVVuaXF1ZUFsaWFzZXNfTTogeworICAgICAgYXV0byBwdHIgPSByZWludGVycHJldF9jYXN0PGNvbnN0IE15R2FtZTo6RXhhbXBsZTo6TW9uc3RlclQgKj4odmFsdWUpOworICAgICAgcmV0dXJuIENyZWF0ZU1vbnN0ZXIoX2ZiYiwgcHRyLCBfcmVoYXNoZXIpLlVuaW9uKCk7CisgICAgfQorICAgIGNhc2UgQW55VW5pcXVlQWxpYXNlc19UUzogeworICAgICAgYXV0byBwdHIgPSByZWludGVycHJldF9jYXN0PGNvbnN0IE15R2FtZTo6RXhhbXBsZTo6VGVzdFNpbXBsZVRhYmxlV2l0aEVudW1UICo+KHZhbHVlKTsKKyAgICAgIHJldHVybiBDcmVhdGVUZXN0U2ltcGxlVGFibGVXaXRoRW51bShfZmJiLCBwdHIsIF9yZWhhc2hlcikuVW5pb24oKTsKKyAgICB9CisgICAgY2FzZSBBbnlVbmlxdWVBbGlhc2VzX00yOiB7CisgICAgICBhdXRvIHB0ciA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgTXlHYW1lOjpFeGFtcGxlMjo6TW9uc3RlclQgKj4odmFsdWUpOworICAgICAgcmV0dXJuIENyZWF0ZU1vbnN0ZXIoX2ZiYiwgcHRyLCBfcmVoYXNoZXIpLlVuaW9uKCk7CisgICAgfQorICAgIGRlZmF1bHQ6IHJldHVybiAwOworICB9Cit9CisKK2lubGluZSBBbnlVbmlxdWVBbGlhc2VzVW5pb246OkFueVVuaXF1ZUFsaWFzZXNVbmlvbihjb25zdCBBbnlVbmlxdWVBbGlhc2VzVW5pb24gJnUpIDogdHlwZSh1LnR5cGUpLCB2YWx1ZShudWxscHRyKSB7CisgIHN3aXRjaCAodHlwZSkgeworICAgIGNhc2UgQW55VW5pcXVlQWxpYXNlc19NOiB7CisgICAgICB2YWx1ZSA9IG5ldyBNeUdhbWU6OkV4YW1wbGU6Ok1vbnN0ZXJUKCpyZWludGVycHJldF9jYXN0PE15R2FtZTo6RXhhbXBsZTo6TW9uc3RlclQgKj4odS52YWx1ZSkpOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgQW55VW5pcXVlQWxpYXNlc19UUzogeworICAgICAgdmFsdWUgPSBuZXcgTXlHYW1lOjpFeGFtcGxlOjpUZXN0U2ltcGxlVGFibGVXaXRoRW51bVQoKnJlaW50ZXJwcmV0X2Nhc3Q8TXlHYW1lOjpFeGFtcGxlOjpUZXN0U2ltcGxlVGFibGVXaXRoRW51bVQgKj4odS52YWx1ZSkpOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgQW55VW5pcXVlQWxpYXNlc19NMjogeworICAgICAgdmFsdWUgPSBuZXcgTXlHYW1lOjpFeGFtcGxlMjo6TW9uc3RlclQoKnJlaW50ZXJwcmV0X2Nhc3Q8TXlHYW1lOjpFeGFtcGxlMjo6TW9uc3RlclQgKj4odS52YWx1ZSkpOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQorfQorCitpbmxpbmUgdm9pZCBBbnlVbmlxdWVBbGlhc2VzVW5pb246OlJlc2V0KCkgeworICBzd2l0Y2ggKHR5cGUpIHsKKyAgICBjYXNlIEFueVVuaXF1ZUFsaWFzZXNfTTogeworICAgICAgYXV0byBwdHIgPSByZWludGVycHJldF9jYXN0PE15R2FtZTo6RXhhbXBsZTo6TW9uc3RlclQgKj4odmFsdWUpOworICAgICAgZGVsZXRlIHB0cjsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIEFueVVuaXF1ZUFsaWFzZXNfVFM6IHsKKyAgICAgIGF1dG8gcHRyID0gcmVpbnRlcnByZXRfY2FzdDxNeUdhbWU6OkV4YW1wbGU6OlRlc3RTaW1wbGVUYWJsZVdpdGhFbnVtVCAqPih2YWx1ZSk7CisgICAgICBkZWxldGUgcHRyOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgQW55VW5pcXVlQWxpYXNlc19NMjogeworICAgICAgYXV0byBwdHIgPSByZWludGVycHJldF9jYXN0PE15R2FtZTo6RXhhbXBsZTI6Ok1vbnN0ZXJUICo+KHZhbHVlKTsKKyAgICAgIGRlbGV0ZSBwdHI7CisgICAgICBicmVhazsKKyAgICB9CisgICAgZGVmYXVsdDogYnJlYWs7CisgIH0KKyAgdmFsdWUgPSBudWxscHRyOworICB0eXBlID0gQW55VW5pcXVlQWxpYXNlc19OT05FOworfQorCitpbmxpbmUgYm9vbCBWZXJpZnlBbnlBbWJpZ3VvdXNBbGlhc2VzKGZsYXRidWZmZXJzOjpWZXJpZmllciAmdmVyaWZpZXIsIGNvbnN0IHZvaWQgKm9iaiwgQW55QW1iaWd1b3VzQWxpYXNlcyB0eXBlKSB7CisgIHN3aXRjaCAodHlwZSkgeworICAgIGNhc2UgQW55QW1iaWd1b3VzQWxpYXNlc19OT05FOiB7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgY2FzZSBBbnlBbWJpZ3VvdXNBbGlhc2VzX00xOiB7CisgICAgICBhdXRvIHB0ciA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgTXlHYW1lOjpFeGFtcGxlOjpNb25zdGVyICo+KG9iaik7CisgICAgICByZXR1cm4gdmVyaWZpZXIuVmVyaWZ5VGFibGUocHRyKTsKKyAgICB9CisgICAgY2FzZSBBbnlBbWJpZ3VvdXNBbGlhc2VzX00yOiB7CisgICAgICBhdXRvIHB0ciA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgTXlHYW1lOjpFeGFtcGxlOjpNb25zdGVyICo+KG9iaik7CisgICAgICByZXR1cm4gdmVyaWZpZXIuVmVyaWZ5VGFibGUocHRyKTsKKyAgICB9CisgICAgY2FzZSBBbnlBbWJpZ3VvdXNBbGlhc2VzX00zOiB7CisgICAgICBhdXRvIHB0ciA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgTXlHYW1lOjpFeGFtcGxlOjpNb25zdGVyICo+KG9iaik7CisgICAgICByZXR1cm4gdmVyaWZpZXIuVmVyaWZ5VGFibGUocHRyKTsKKyAgICB9CisgICAgZGVmYXVsdDogcmV0dXJuIHRydWU7CisgIH0KK30KKworaW5saW5lIGJvb2wgVmVyaWZ5QW55QW1iaWd1b3VzQWxpYXNlc1ZlY3RvcihmbGF0YnVmZmVyczo6VmVyaWZpZXIgJnZlcmlmaWVyLCBjb25zdCBmbGF0YnVmZmVyczo6VmVjdG9yPGZsYXRidWZmZXJzOjpPZmZzZXQ8dm9pZD4+ICp2YWx1ZXMsIGNvbnN0IGZsYXRidWZmZXJzOjpWZWN0b3I8dWludDhfdD4gKnR5cGVzKSB7CisgIGlmICghdmFsdWVzIHx8ICF0eXBlcykgcmV0dXJuICF2YWx1ZXMgJiYgIXR5cGVzOworICBpZiAodmFsdWVzLT5zaXplKCkgIT0gdHlwZXMtPnNpemUoKSkgcmV0dXJuIGZhbHNlOworICBmb3IgKGZsYXRidWZmZXJzOjp1b2Zmc2V0X3QgaSA9IDA7IGkgPCB2YWx1ZXMtPnNpemUoKTsgKytpKSB7CisgICAgaWYgKCFWZXJpZnlBbnlBbWJpZ3VvdXNBbGlhc2VzKAorICAgICAgICB2ZXJpZmllciwgIHZhbHVlcy0+R2V0KGkpLCB0eXBlcy0+R2V0RW51bTxBbnlBbWJpZ3VvdXNBbGlhc2VzPihpKSkpIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIHRydWU7Cit9CisKK2lubGluZSB2b2lkICpBbnlBbWJpZ3VvdXNBbGlhc2VzVW5pb246OlVuUGFjayhjb25zdCB2b2lkICpvYmosIEFueUFtYmlndW91c0FsaWFzZXMgdHlwZSwgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKnJlc29sdmVyKSB7CisgICh2b2lkKXJlc29sdmVyOworICBzd2l0Y2ggKHR5cGUpIHsKKyAgICBjYXNlIEFueUFtYmlndW91c0FsaWFzZXNfTTE6IHsKKyAgICAgIGF1dG8gcHRyID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBNeUdhbWU6OkV4YW1wbGU6Ok1vbnN0ZXIgKj4ob2JqKTsKKyAgICAgIHJldHVybiBwdHItPlVuUGFjayhyZXNvbHZlcik7CisgICAgfQorICAgIGNhc2UgQW55QW1iaWd1b3VzQWxpYXNlc19NMjogeworICAgICAgYXV0byBwdHIgPSByZWludGVycHJldF9jYXN0PGNvbnN0IE15R2FtZTo6RXhhbXBsZTo6TW9uc3RlciAqPihvYmopOworICAgICAgcmV0dXJuIHB0ci0+VW5QYWNrKHJlc29sdmVyKTsKKyAgICB9CisgICAgY2FzZSBBbnlBbWJpZ3VvdXNBbGlhc2VzX00zOiB7CisgICAgICBhdXRvIHB0ciA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgTXlHYW1lOjpFeGFtcGxlOjpNb25zdGVyICo+KG9iaik7CisgICAgICByZXR1cm4gcHRyLT5VblBhY2socmVzb2x2ZXIpOworICAgIH0KKyAgICBkZWZhdWx0OiByZXR1cm4gbnVsbHB0cjsKKyAgfQorfQorCitpbmxpbmUgZmxhdGJ1ZmZlcnM6Ok9mZnNldDx2b2lkPiBBbnlBbWJpZ3VvdXNBbGlhc2VzVW5pb246OlBhY2soZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyKSBjb25zdCB7CisgICh2b2lkKV9yZWhhc2hlcjsKKyAgc3dpdGNoICh0eXBlKSB7CisgICAgY2FzZSBBbnlBbWJpZ3VvdXNBbGlhc2VzX00xOiB7CisgICAgICBhdXRvIHB0ciA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgTXlHYW1lOjpFeGFtcGxlOjpNb25zdGVyVCAqPih2YWx1ZSk7CisgICAgICByZXR1cm4gQ3JlYXRlTW9uc3RlcihfZmJiLCBwdHIsIF9yZWhhc2hlcikuVW5pb24oKTsKKyAgICB9CisgICAgY2FzZSBBbnlBbWJpZ3VvdXNBbGlhc2VzX00yOiB7CisgICAgICBhdXRvIHB0ciA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgTXlHYW1lOjpFeGFtcGxlOjpNb25zdGVyVCAqPih2YWx1ZSk7CisgICAgICByZXR1cm4gQ3JlYXRlTW9uc3RlcihfZmJiLCBwdHIsIF9yZWhhc2hlcikuVW5pb24oKTsKKyAgICB9CisgICAgY2FzZSBBbnlBbWJpZ3VvdXNBbGlhc2VzX00zOiB7CisgICAgICBhdXRvIHB0ciA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgTXlHYW1lOjpFeGFtcGxlOjpNb25zdGVyVCAqPih2YWx1ZSk7CisgICAgICByZXR1cm4gQ3JlYXRlTW9uc3RlcihfZmJiLCBwdHIsIF9yZWhhc2hlcikuVW5pb24oKTsKKyAgICB9CisgICAgZGVmYXVsdDogcmV0dXJuIDA7CisgIH0KK30KKworaW5saW5lIEFueUFtYmlndW91c0FsaWFzZXNVbmlvbjo6QW55QW1iaWd1b3VzQWxpYXNlc1VuaW9uKGNvbnN0IEFueUFtYmlndW91c0FsaWFzZXNVbmlvbiAmdSkgOiB0eXBlKHUudHlwZSksIHZhbHVlKG51bGxwdHIpIHsKKyAgc3dpdGNoICh0eXBlKSB7CisgICAgY2FzZSBBbnlBbWJpZ3VvdXNBbGlhc2VzX00xOiB7CisgICAgICB2YWx1ZSA9IG5ldyBNeUdhbWU6OkV4YW1wbGU6Ok1vbnN0ZXJUKCpyZWludGVycHJldF9jYXN0PE15R2FtZTo6RXhhbXBsZTo6TW9uc3RlclQgKj4odS52YWx1ZSkpOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgQW55QW1iaWd1b3VzQWxpYXNlc19NMjogeworICAgICAgdmFsdWUgPSBuZXcgTXlHYW1lOjpFeGFtcGxlOjpNb25zdGVyVCgqcmVpbnRlcnByZXRfY2FzdDxNeUdhbWU6OkV4YW1wbGU6Ok1vbnN0ZXJUICo+KHUudmFsdWUpKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIEFueUFtYmlndW91c0FsaWFzZXNfTTM6IHsKKyAgICAgIHZhbHVlID0gbmV3IE15R2FtZTo6RXhhbXBsZTo6TW9uc3RlclQoKnJlaW50ZXJwcmV0X2Nhc3Q8TXlHYW1lOjpFeGFtcGxlOjpNb25zdGVyVCAqPih1LnZhbHVlKSk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9Cit9CisKK2lubGluZSB2b2lkIEFueUFtYmlndW91c0FsaWFzZXNVbmlvbjo6UmVzZXQoKSB7CisgIHN3aXRjaCAodHlwZSkgeworICAgIGNhc2UgQW55QW1iaWd1b3VzQWxpYXNlc19NMTogeworICAgICAgYXV0byBwdHIgPSByZWludGVycHJldF9jYXN0PE15R2FtZTo6RXhhbXBsZTo6TW9uc3RlclQgKj4odmFsdWUpOworICAgICAgZGVsZXRlIHB0cjsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIEFueUFtYmlndW91c0FsaWFzZXNfTTI6IHsKKyAgICAgIGF1dG8gcHRyID0gcmVpbnRlcnByZXRfY2FzdDxNeUdhbWU6OkV4YW1wbGU6Ok1vbnN0ZXJUICo+KHZhbHVlKTsKKyAgICAgIGRlbGV0ZSBwdHI7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBBbnlBbWJpZ3VvdXNBbGlhc2VzX00zOiB7CisgICAgICBhdXRvIHB0ciA9IHJlaW50ZXJwcmV0X2Nhc3Q8TXlHYW1lOjpFeGFtcGxlOjpNb25zdGVyVCAqPih2YWx1ZSk7CisgICAgICBkZWxldGUgcHRyOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGRlZmF1bHQ6IGJyZWFrOworICB9CisgIHZhbHVlID0gbnVsbHB0cjsKKyAgdHlwZSA9IEFueUFtYmlndW91c0FsaWFzZXNfTk9ORTsKK30KKworaW5saW5lIGNvbnN0IGZsYXRidWZmZXJzOjpUeXBlVGFibGUgKkNvbG9yVHlwZVRhYmxlKCkgeworICBzdGF0aWMgY29uc3QgZmxhdGJ1ZmZlcnM6OlR5cGVDb2RlIHR5cGVfY29kZXNbXSA9IHsKKyAgICB7IGZsYXRidWZmZXJzOjpFVF9VQ0hBUiwgMCwgMCB9LAorICAgIHsgZmxhdGJ1ZmZlcnM6OkVUX1VDSEFSLCAwLCAwIH0sCisgICAgeyBmbGF0YnVmZmVyczo6RVRfVUNIQVIsIDAsIDAgfQorICB9OworICBzdGF0aWMgY29uc3QgZmxhdGJ1ZmZlcnM6OlR5cGVGdW5jdGlvbiB0eXBlX3JlZnNbXSA9IHsKKyAgICBNeUdhbWU6OkV4YW1wbGU6OkNvbG9yVHlwZVRhYmxlCisgIH07CisgIHN0YXRpYyBjb25zdCBpbnQ2NF90IHZhbHVlc1tdID0geyAxLCAyLCA4IH07CisgIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgbmFtZXNbXSA9IHsKKyAgICAiUmVkIiwKKyAgICAiR3JlZW4iLAorICAgICJCbHVlIgorICB9OworICBzdGF0aWMgY29uc3QgZmxhdGJ1ZmZlcnM6OlR5cGVUYWJsZSB0dCA9IHsKKyAgICBmbGF0YnVmZmVyczo6U1RfRU5VTSwgMywgdHlwZV9jb2RlcywgdHlwZV9yZWZzLCBudWxscHRyLCB2YWx1ZXMsIG5hbWVzCisgIH07CisgIHJldHVybiAmdHQ7Cit9CisKK2lubGluZSBjb25zdCBmbGF0YnVmZmVyczo6VHlwZVRhYmxlICpSYWNlVHlwZVRhYmxlKCkgeworICBzdGF0aWMgY29uc3QgZmxhdGJ1ZmZlcnM6OlR5cGVDb2RlIHR5cGVfY29kZXNbXSA9IHsKKyAgICB7IGZsYXRidWZmZXJzOjpFVF9DSEFSLCAwLCAwIH0sCisgICAgeyBmbGF0YnVmZmVyczo6RVRfQ0hBUiwgMCwgMCB9LAorICAgIHsgZmxhdGJ1ZmZlcnM6OkVUX0NIQVIsIDAsIDAgfSwKKyAgICB7IGZsYXRidWZmZXJzOjpFVF9DSEFSLCAwLCAwIH0KKyAgfTsKKyAgc3RhdGljIGNvbnN0IGZsYXRidWZmZXJzOjpUeXBlRnVuY3Rpb24gdHlwZV9yZWZzW10gPSB7CisgICAgTXlHYW1lOjpFeGFtcGxlOjpSYWNlVHlwZVRhYmxlCisgIH07CisgIHN0YXRpYyBjb25zdCBpbnQ2NF90IHZhbHVlc1tdID0geyAtMSwgMCwgMSwgMiB9OworICBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IG5hbWVzW10gPSB7CisgICAgIk5vbmUiLAorICAgICJIdW1hbiIsCisgICAgIkR3YXJmIiwKKyAgICAiRWxmIgorICB9OworICBzdGF0aWMgY29uc3QgZmxhdGJ1ZmZlcnM6OlR5cGVUYWJsZSB0dCA9IHsKKyAgICBmbGF0YnVmZmVyczo6U1RfRU5VTSwgNCwgdHlwZV9jb2RlcywgdHlwZV9yZWZzLCBudWxscHRyLCB2YWx1ZXMsIG5hbWVzCisgIH07CisgIHJldHVybiAmdHQ7Cit9CisKK2lubGluZSBjb25zdCBmbGF0YnVmZmVyczo6VHlwZVRhYmxlICpMb25nRW51bVR5cGVUYWJsZSgpIHsKKyAgc3RhdGljIGNvbnN0IGZsYXRidWZmZXJzOjpUeXBlQ29kZSB0eXBlX2NvZGVzW10gPSB7CisgICAgeyBmbGF0YnVmZmVyczo6RVRfVUxPTkcsIDAsIDAgfSwKKyAgICB7IGZsYXRidWZmZXJzOjpFVF9VTE9ORywgMCwgMCB9LAorICAgIHsgZmxhdGJ1ZmZlcnM6OkVUX1VMT05HLCAwLCAwIH0KKyAgfTsKKyAgc3RhdGljIGNvbnN0IGZsYXRidWZmZXJzOjpUeXBlRnVuY3Rpb24gdHlwZV9yZWZzW10gPSB7CisgICAgTXlHYW1lOjpFeGFtcGxlOjpMb25nRW51bVR5cGVUYWJsZQorICB9OworICBzdGF0aWMgY29uc3QgaW50NjRfdCB2YWx1ZXNbXSA9IHsgMlVMTCwgNFVMTCwgMTA5OTUxMTYyNzc3NlVMTCB9OworICBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IG5hbWVzW10gPSB7CisgICAgIkxvbmdPbmUiLAorICAgICJMb25nVHdvIiwKKyAgICAiTG9uZ0JpZyIKKyAgfTsKKyAgc3RhdGljIGNvbnN0IGZsYXRidWZmZXJzOjpUeXBlVGFibGUgdHQgPSB7CisgICAgZmxhdGJ1ZmZlcnM6OlNUX0VOVU0sIDMsIHR5cGVfY29kZXMsIHR5cGVfcmVmcywgbnVsbHB0ciwgdmFsdWVzLCBuYW1lcworICB9OworICByZXR1cm4gJnR0OworfQorCitpbmxpbmUgY29uc3QgZmxhdGJ1ZmZlcnM6OlR5cGVUYWJsZSAqQW55VHlwZVRhYmxlKCkgeworICBzdGF0aWMgY29uc3QgZmxhdGJ1ZmZlcnM6OlR5cGVDb2RlIHR5cGVfY29kZXNbXSA9IHsKKyAgICB7IGZsYXRidWZmZXJzOjpFVF9TRVFVRU5DRSwgMCwgLTEgfSwKKyAgICB7IGZsYXRidWZmZXJzOjpFVF9TRVFVRU5DRSwgMCwgMCB9LAorICAgIHsgZmxhdGJ1ZmZlcnM6OkVUX1NFUVVFTkNFLCAwLCAxIH0sCisgICAgeyBmbGF0YnVmZmVyczo6RVRfU0VRVUVOQ0UsIDAsIDIgfQorICB9OworICBzdGF0aWMgY29uc3QgZmxhdGJ1ZmZlcnM6OlR5cGVGdW5jdGlvbiB0eXBlX3JlZnNbXSA9IHsKKyAgICBNeUdhbWU6OkV4YW1wbGU6Ok1vbnN0ZXJUeXBlVGFibGUsCisgICAgTXlHYW1lOjpFeGFtcGxlOjpUZXN0U2ltcGxlVGFibGVXaXRoRW51bVR5cGVUYWJsZSwKKyAgICBNeUdhbWU6OkV4YW1wbGUyOjpNb25zdGVyVHlwZVRhYmxlCisgIH07CisgIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgbmFtZXNbXSA9IHsKKyAgICAiTk9ORSIsCisgICAgIk1vbnN0ZXIiLAorICAgICJUZXN0U2ltcGxlVGFibGVXaXRoRW51bSIsCisgICAgIk15R2FtZV9FeGFtcGxlMl9Nb25zdGVyIgorICB9OworICBzdGF0aWMgY29uc3QgZmxhdGJ1ZmZlcnM6OlR5cGVUYWJsZSB0dCA9IHsKKyAgICBmbGF0YnVmZmVyczo6U1RfVU5JT04sIDQsIHR5cGVfY29kZXMsIHR5cGVfcmVmcywgbnVsbHB0ciwgbnVsbHB0ciwgbmFtZXMKKyAgfTsKKyAgcmV0dXJuICZ0dDsKK30KKworaW5saW5lIGNvbnN0IGZsYXRidWZmZXJzOjpUeXBlVGFibGUgKkFueVVuaXF1ZUFsaWFzZXNUeXBlVGFibGUoKSB7CisgIHN0YXRpYyBjb25zdCBmbGF0YnVmZmVyczo6VHlwZUNvZGUgdHlwZV9jb2Rlc1tdID0geworICAgIHsgZmxhdGJ1ZmZlcnM6OkVUX1NFUVVFTkNFLCAwLCAtMSB9LAorICAgIHsgZmxhdGJ1ZmZlcnM6OkVUX1NFUVVFTkNFLCAwLCAwIH0sCisgICAgeyBmbGF0YnVmZmVyczo6RVRfU0VRVUVOQ0UsIDAsIDEgfSwKKyAgICB7IGZsYXRidWZmZXJzOjpFVF9TRVFVRU5DRSwgMCwgMiB9CisgIH07CisgIHN0YXRpYyBjb25zdCBmbGF0YnVmZmVyczo6VHlwZUZ1bmN0aW9uIHR5cGVfcmVmc1tdID0geworICAgIE15R2FtZTo6RXhhbXBsZTo6TW9uc3RlclR5cGVUYWJsZSwKKyAgICBNeUdhbWU6OkV4YW1wbGU6OlRlc3RTaW1wbGVUYWJsZVdpdGhFbnVtVHlwZVRhYmxlLAorICAgIE15R2FtZTo6RXhhbXBsZTI6Ok1vbnN0ZXJUeXBlVGFibGUKKyAgfTsKKyAgc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBuYW1lc1tdID0geworICAgICJOT05FIiwKKyAgICAiTSIsCisgICAgIlRTIiwKKyAgICAiTTIiCisgIH07CisgIHN0YXRpYyBjb25zdCBmbGF0YnVmZmVyczo6VHlwZVRhYmxlIHR0ID0geworICAgIGZsYXRidWZmZXJzOjpTVF9VTklPTiwgNCwgdHlwZV9jb2RlcywgdHlwZV9yZWZzLCBudWxscHRyLCBudWxscHRyLCBuYW1lcworICB9OworICByZXR1cm4gJnR0OworfQorCitpbmxpbmUgY29uc3QgZmxhdGJ1ZmZlcnM6OlR5cGVUYWJsZSAqQW55QW1iaWd1b3VzQWxpYXNlc1R5cGVUYWJsZSgpIHsKKyAgc3RhdGljIGNvbnN0IGZsYXRidWZmZXJzOjpUeXBlQ29kZSB0eXBlX2NvZGVzW10gPSB7CisgICAgeyBmbGF0YnVmZmVyczo6RVRfU0VRVUVOQ0UsIDAsIC0xIH0sCisgICAgeyBmbGF0YnVmZmVyczo6RVRfU0VRVUVOQ0UsIDAsIDAgfSwKKyAgICB7IGZsYXRidWZmZXJzOjpFVF9TRVFVRU5DRSwgMCwgMCB9LAorICAgIHsgZmxhdGJ1ZmZlcnM6OkVUX1NFUVVFTkNFLCAwLCAwIH0KKyAgfTsKKyAgc3RhdGljIGNvbnN0IGZsYXRidWZmZXJzOjpUeXBlRnVuY3Rpb24gdHlwZV9yZWZzW10gPSB7CisgICAgTXlHYW1lOjpFeGFtcGxlOjpNb25zdGVyVHlwZVRhYmxlCisgIH07CisgIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgbmFtZXNbXSA9IHsKKyAgICAiTk9ORSIsCisgICAgIk0xIiwKKyAgICAiTTIiLAorICAgICJNMyIKKyAgfTsKKyAgc3RhdGljIGNvbnN0IGZsYXRidWZmZXJzOjpUeXBlVGFibGUgdHQgPSB7CisgICAgZmxhdGJ1ZmZlcnM6OlNUX1VOSU9OLCA0LCB0eXBlX2NvZGVzLCB0eXBlX3JlZnMsIG51bGxwdHIsIG51bGxwdHIsIG5hbWVzCisgIH07CisgIHJldHVybiAmdHQ7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBFeGFtcGxlCisKK2lubGluZSBjb25zdCBmbGF0YnVmZmVyczo6VHlwZVRhYmxlICpJblBhcmVudE5hbWVzcGFjZVR5cGVUYWJsZSgpIHsKKyAgc3RhdGljIGNvbnN0IGZsYXRidWZmZXJzOjpUeXBlVGFibGUgdHQgPSB7CisgICAgZmxhdGJ1ZmZlcnM6OlNUX1RBQkxFLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyCisgIH07CisgIHJldHVybiAmdHQ7Cit9CisKK25hbWVzcGFjZSBFeGFtcGxlMiB7CisKK2lubGluZSBjb25zdCBmbGF0YnVmZmVyczo6VHlwZVRhYmxlICpNb25zdGVyVHlwZVRhYmxlKCkgeworICBzdGF0aWMgY29uc3QgZmxhdGJ1ZmZlcnM6OlR5cGVUYWJsZSB0dCA9IHsKKyAgICBmbGF0YnVmZmVyczo6U1RfVEFCTEUsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIKKyAgfTsKKyAgcmV0dXJuICZ0dDsKK30KKworfSAgLy8gbmFtZXNwYWNlIEV4YW1wbGUyCisKK25hbWVzcGFjZSBFeGFtcGxlIHsKKworaW5saW5lIGNvbnN0IGZsYXRidWZmZXJzOjpUeXBlVGFibGUgKlRlc3RUeXBlVGFibGUoKSB7CisgIHN0YXRpYyBjb25zdCBmbGF0YnVmZmVyczo6VHlwZUNvZGUgdHlwZV9jb2Rlc1tdID0geworICAgIHsgZmxhdGJ1ZmZlcnM6OkVUX1NIT1JULCAwLCAtMSB9LAorICAgIHsgZmxhdGJ1ZmZlcnM6OkVUX0NIQVIsIDAsIC0xIH0KKyAgfTsKKyAgc3RhdGljIGNvbnN0IGludDY0X3QgdmFsdWVzW10gPSB7IDAsIDIsIDQgfTsKKyAgc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBuYW1lc1tdID0geworICAgICJhIiwKKyAgICAiYiIKKyAgfTsKKyAgc3RhdGljIGNvbnN0IGZsYXRidWZmZXJzOjpUeXBlVGFibGUgdHQgPSB7CisgICAgZmxhdGJ1ZmZlcnM6OlNUX1NUUlVDVCwgMiwgdHlwZV9jb2RlcywgbnVsbHB0ciwgbnVsbHB0ciwgdmFsdWVzLCBuYW1lcworICB9OworICByZXR1cm4gJnR0OworfQorCitpbmxpbmUgY29uc3QgZmxhdGJ1ZmZlcnM6OlR5cGVUYWJsZSAqVGVzdFNpbXBsZVRhYmxlV2l0aEVudW1UeXBlVGFibGUoKSB7CisgIHN0YXRpYyBjb25zdCBmbGF0YnVmZmVyczo6VHlwZUNvZGUgdHlwZV9jb2Rlc1tdID0geworICAgIHsgZmxhdGJ1ZmZlcnM6OkVUX1VDSEFSLCAwLCAwIH0KKyAgfTsKKyAgc3RhdGljIGNvbnN0IGZsYXRidWZmZXJzOjpUeXBlRnVuY3Rpb24gdHlwZV9yZWZzW10gPSB7CisgICAgTXlHYW1lOjpFeGFtcGxlOjpDb2xvclR5cGVUYWJsZQorICB9OworICBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IG5hbWVzW10gPSB7CisgICAgImNvbG9yIgorICB9OworICBzdGF0aWMgY29uc3QgZmxhdGJ1ZmZlcnM6OlR5cGVUYWJsZSB0dCA9IHsKKyAgICBmbGF0YnVmZmVyczo6U1RfVEFCTEUsIDEsIHR5cGVfY29kZXMsIHR5cGVfcmVmcywgbnVsbHB0ciwgbnVsbHB0ciwgbmFtZXMKKyAgfTsKKyAgcmV0dXJuICZ0dDsKK30KKworaW5saW5lIGNvbnN0IGZsYXRidWZmZXJzOjpUeXBlVGFibGUgKlZlYzNUeXBlVGFibGUoKSB7CisgIHN0YXRpYyBjb25zdCBmbGF0YnVmZmVyczo6VHlwZUNvZGUgdHlwZV9jb2Rlc1tdID0geworICAgIHsgZmxhdGJ1ZmZlcnM6OkVUX0ZMT0FULCAwLCAtMSB9LAorICAgIHsgZmxhdGJ1ZmZlcnM6OkVUX0ZMT0FULCAwLCAtMSB9LAorICAgIHsgZmxhdGJ1ZmZlcnM6OkVUX0ZMT0FULCAwLCAtMSB9LAorICAgIHsgZmxhdGJ1ZmZlcnM6OkVUX0RPVUJMRSwgMCwgLTEgfSwKKyAgICB7IGZsYXRidWZmZXJzOjpFVF9VQ0hBUiwgMCwgMCB9LAorICAgIHsgZmxhdGJ1ZmZlcnM6OkVUX1NFUVVFTkNFLCAwLCAxIH0KKyAgfTsKKyAgc3RhdGljIGNvbnN0IGZsYXRidWZmZXJzOjpUeXBlRnVuY3Rpb24gdHlwZV9yZWZzW10gPSB7CisgICAgTXlHYW1lOjpFeGFtcGxlOjpDb2xvclR5cGVUYWJsZSwKKyAgICBNeUdhbWU6OkV4YW1wbGU6OlRlc3RUeXBlVGFibGUKKyAgfTsKKyAgc3RhdGljIGNvbnN0IGludDY0X3QgdmFsdWVzW10gPSB7IDAsIDQsIDgsIDE2LCAyNCwgMjYsIDMyIH07CisgIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgbmFtZXNbXSA9IHsKKyAgICAieCIsCisgICAgInkiLAorICAgICJ6IiwKKyAgICAidGVzdDEiLAorICAgICJ0ZXN0MiIsCisgICAgInRlc3QzIgorICB9OworICBzdGF0aWMgY29uc3QgZmxhdGJ1ZmZlcnM6OlR5cGVUYWJsZSB0dCA9IHsKKyAgICBmbGF0YnVmZmVyczo6U1RfU1RSVUNULCA2LCB0eXBlX2NvZGVzLCB0eXBlX3JlZnMsIG51bGxwdHIsIHZhbHVlcywgbmFtZXMKKyAgfTsKKyAgcmV0dXJuICZ0dDsKK30KKworaW5saW5lIGNvbnN0IGZsYXRidWZmZXJzOjpUeXBlVGFibGUgKkFiaWxpdHlUeXBlVGFibGUoKSB7CisgIHN0YXRpYyBjb25zdCBmbGF0YnVmZmVyczo6VHlwZUNvZGUgdHlwZV9jb2Rlc1tdID0geworICAgIHsgZmxhdGJ1ZmZlcnM6OkVUX1VJTlQsIDAsIC0xIH0sCisgICAgeyBmbGF0YnVmZmVyczo6RVRfVUlOVCwgMCwgLTEgfQorICB9OworICBzdGF0aWMgY29uc3QgaW50NjRfdCB2YWx1ZXNbXSA9IHsgMCwgNCwgOCB9OworICBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IG5hbWVzW10gPSB7CisgICAgImlkIiwKKyAgICAiZGlzdGFuY2UiCisgIH07CisgIHN0YXRpYyBjb25zdCBmbGF0YnVmZmVyczo6VHlwZVRhYmxlIHR0ID0geworICAgIGZsYXRidWZmZXJzOjpTVF9TVFJVQ1QsIDIsIHR5cGVfY29kZXMsIG51bGxwdHIsIG51bGxwdHIsIHZhbHVlcywgbmFtZXMKKyAgfTsKKyAgcmV0dXJuICZ0dDsKK30KKworaW5saW5lIGNvbnN0IGZsYXRidWZmZXJzOjpUeXBlVGFibGUgKlN0cnVjdE9mU3RydWN0c1R5cGVUYWJsZSgpIHsKKyAgc3RhdGljIGNvbnN0IGZsYXRidWZmZXJzOjpUeXBlQ29kZSB0eXBlX2NvZGVzW10gPSB7CisgICAgeyBmbGF0YnVmZmVyczo6RVRfU0VRVUVOQ0UsIDAsIDAgfSwKKyAgICB7IGZsYXRidWZmZXJzOjpFVF9TRVFVRU5DRSwgMCwgMSB9LAorICAgIHsgZmxhdGJ1ZmZlcnM6OkVUX1NFUVVFTkNFLCAwLCAwIH0KKyAgfTsKKyAgc3RhdGljIGNvbnN0IGZsYXRidWZmZXJzOjpUeXBlRnVuY3Rpb24gdHlwZV9yZWZzW10gPSB7CisgICAgTXlHYW1lOjpFeGFtcGxlOjpBYmlsaXR5VHlwZVRhYmxlLAorICAgIE15R2FtZTo6RXhhbXBsZTo6VGVzdFR5cGVUYWJsZQorICB9OworICBzdGF0aWMgY29uc3QgaW50NjRfdCB2YWx1ZXNbXSA9IHsgMCwgOCwgMTIsIDIwIH07CisgIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgbmFtZXNbXSA9IHsKKyAgICAiYSIsCisgICAgImIiLAorICAgICJjIgorICB9OworICBzdGF0aWMgY29uc3QgZmxhdGJ1ZmZlcnM6OlR5cGVUYWJsZSB0dCA9IHsKKyAgICBmbGF0YnVmZmVyczo6U1RfU1RSVUNULCAzLCB0eXBlX2NvZGVzLCB0eXBlX3JlZnMsIG51bGxwdHIsIHZhbHVlcywgbmFtZXMKKyAgfTsKKyAgcmV0dXJuICZ0dDsKK30KKworaW5saW5lIGNvbnN0IGZsYXRidWZmZXJzOjpUeXBlVGFibGUgKlN0cnVjdE9mU3RydWN0c09mU3RydWN0c1R5cGVUYWJsZSgpIHsKKyAgc3RhdGljIGNvbnN0IGZsYXRidWZmZXJzOjpUeXBlQ29kZSB0eXBlX2NvZGVzW10gPSB7CisgICAgeyBmbGF0YnVmZmVyczo6RVRfU0VRVUVOQ0UsIDAsIDAgfQorICB9OworICBzdGF0aWMgY29uc3QgZmxhdGJ1ZmZlcnM6OlR5cGVGdW5jdGlvbiB0eXBlX3JlZnNbXSA9IHsKKyAgICBNeUdhbWU6OkV4YW1wbGU6OlN0cnVjdE9mU3RydWN0c1R5cGVUYWJsZQorICB9OworICBzdGF0aWMgY29uc3QgaW50NjRfdCB2YWx1ZXNbXSA9IHsgMCwgMjAgfTsKKyAgc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBuYW1lc1tdID0geworICAgICJhIgorICB9OworICBzdGF0aWMgY29uc3QgZmxhdGJ1ZmZlcnM6OlR5cGVUYWJsZSB0dCA9IHsKKyAgICBmbGF0YnVmZmVyczo6U1RfU1RSVUNULCAxLCB0eXBlX2NvZGVzLCB0eXBlX3JlZnMsIG51bGxwdHIsIHZhbHVlcywgbmFtZXMKKyAgfTsKKyAgcmV0dXJuICZ0dDsKK30KKworaW5saW5lIGNvbnN0IGZsYXRidWZmZXJzOjpUeXBlVGFibGUgKlN0YXRUeXBlVGFibGUoKSB7CisgIHN0YXRpYyBjb25zdCBmbGF0YnVmZmVyczo6VHlwZUNvZGUgdHlwZV9jb2Rlc1tdID0geworICAgIHsgZmxhdGJ1ZmZlcnM6OkVUX1NUUklORywgMCwgLTEgfSwKKyAgICB7IGZsYXRidWZmZXJzOjpFVF9MT05HLCAwLCAtMSB9LAorICAgIHsgZmxhdGJ1ZmZlcnM6OkVUX1VTSE9SVCwgMCwgLTEgfQorICB9OworICBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IG5hbWVzW10gPSB7CisgICAgImlkIiwKKyAgICAidmFsIiwKKyAgICAiY291bnQiCisgIH07CisgIHN0YXRpYyBjb25zdCBmbGF0YnVmZmVyczo6VHlwZVRhYmxlIHR0ID0geworICAgIGZsYXRidWZmZXJzOjpTVF9UQUJMRSwgMywgdHlwZV9jb2RlcywgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0ciwgbmFtZXMKKyAgfTsKKyAgcmV0dXJuICZ0dDsKK30KKworaW5saW5lIGNvbnN0IGZsYXRidWZmZXJzOjpUeXBlVGFibGUgKlJlZmVycmFibGVUeXBlVGFibGUoKSB7CisgIHN0YXRpYyBjb25zdCBmbGF0YnVmZmVyczo6VHlwZUNvZGUgdHlwZV9jb2Rlc1tdID0geworICAgIHsgZmxhdGJ1ZmZlcnM6OkVUX1VMT05HLCAwLCAtMSB9CisgIH07CisgIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgbmFtZXNbXSA9IHsKKyAgICAiaWQiCisgIH07CisgIHN0YXRpYyBjb25zdCBmbGF0YnVmZmVyczo6VHlwZVRhYmxlIHR0ID0geworICAgIGZsYXRidWZmZXJzOjpTVF9UQUJMRSwgMSwgdHlwZV9jb2RlcywgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0ciwgbmFtZXMKKyAgfTsKKyAgcmV0dXJuICZ0dDsKK30KKworaW5saW5lIGNvbnN0IGZsYXRidWZmZXJzOjpUeXBlVGFibGUgKk1vbnN0ZXJUeXBlVGFibGUoKSB7CisgIHN0YXRpYyBjb25zdCBmbGF0YnVmZmVyczo6VHlwZUNvZGUgdHlwZV9jb2Rlc1tdID0geworICAgIHsgZmxhdGJ1ZmZlcnM6OkVUX1NFUVVFTkNFLCAwLCAwIH0sCisgICAgeyBmbGF0YnVmZmVyczo6RVRfU0hPUlQsIDAsIC0xIH0sCisgICAgeyBmbGF0YnVmZmVyczo6RVRfU0hPUlQsIDAsIC0xIH0sCisgICAgeyBmbGF0YnVmZmVyczo6RVRfU1RSSU5HLCAwLCAtMSB9LAorICAgIHsgZmxhdGJ1ZmZlcnM6OkVUX0JPT0wsIDAsIC0xIH0sCisgICAgeyBmbGF0YnVmZmVyczo6RVRfVUNIQVIsIDEsIC0xIH0sCisgICAgeyBmbGF0YnVmZmVyczo6RVRfVUNIQVIsIDAsIDEgfSwKKyAgICB7IGZsYXRidWZmZXJzOjpFVF9VVFlQRSwgMCwgMiB9LAorICAgIHsgZmxhdGJ1ZmZlcnM6OkVUX1NFUVVFTkNFLCAwLCAyIH0sCisgICAgeyBmbGF0YnVmZmVyczo6RVRfU0VRVUVOQ0UsIDEsIDMgfSwKKyAgICB7IGZsYXRidWZmZXJzOjpFVF9TVFJJTkcsIDEsIC0xIH0sCisgICAgeyBmbGF0YnVmZmVyczo6RVRfU0VRVUVOQ0UsIDEsIDQgfSwKKyAgICB7IGZsYXRidWZmZXJzOjpFVF9TRVFVRU5DRSwgMCwgNCB9LAorICAgIHsgZmxhdGJ1ZmZlcnM6OkVUX1VDSEFSLCAxLCAtMSB9LAorICAgIHsgZmxhdGJ1ZmZlcnM6OkVUX1NFUVVFTkNFLCAwLCA1IH0sCisgICAgeyBmbGF0YnVmZmVyczo6RVRfQk9PTCwgMCwgLTEgfSwKKyAgICB7IGZsYXRidWZmZXJzOjpFVF9JTlQsIDAsIC0xIH0sCisgICAgeyBmbGF0YnVmZmVyczo6RVRfVUlOVCwgMCwgLTEgfSwKKyAgICB7IGZsYXRidWZmZXJzOjpFVF9MT05HLCAwLCAtMSB9LAorICAgIHsgZmxhdGJ1ZmZlcnM6OkVUX1VMT05HLCAwLCAtMSB9LAorICAgIHsgZmxhdGJ1ZmZlcnM6OkVUX0lOVCwgMCwgLTEgfSwKKyAgICB7IGZsYXRidWZmZXJzOjpFVF9VSU5ULCAwLCAtMSB9LAorICAgIHsgZmxhdGJ1ZmZlcnM6OkVUX0xPTkcsIDAsIC0xIH0sCisgICAgeyBmbGF0YnVmZmVyczo6RVRfVUxPTkcsIDAsIC0xIH0sCisgICAgeyBmbGF0YnVmZmVyczo6RVRfQk9PTCwgMSwgLTEgfSwKKyAgICB7IGZsYXRidWZmZXJzOjpFVF9GTE9BVCwgMCwgLTEgfSwKKyAgICB7IGZsYXRidWZmZXJzOjpFVF9GTE9BVCwgMCwgLTEgfSwKKyAgICB7IGZsYXRidWZmZXJzOjpFVF9GTE9BVCwgMCwgLTEgfSwKKyAgICB7IGZsYXRidWZmZXJzOjpFVF9TVFJJTkcsIDEsIC0xIH0sCisgICAgeyBmbGF0YnVmZmVyczo6RVRfU0VRVUVOQ0UsIDEsIDYgfSwKKyAgICB7IGZsYXRidWZmZXJzOjpFVF9VQ0hBUiwgMSwgLTEgfSwKKyAgICB7IGZsYXRidWZmZXJzOjpFVF9TRVFVRU5DRSwgMSwgMyB9LAorICAgIHsgZmxhdGJ1ZmZlcnM6OkVUX0xPTkcsIDEsIC0xIH0sCisgICAgeyBmbGF0YnVmZmVyczo6RVRfRE9VQkxFLCAxLCAtMSB9LAorICAgIHsgZmxhdGJ1ZmZlcnM6OkVUX1NFUVVFTkNFLCAwLCA3IH0sCisgICAgeyBmbGF0YnVmZmVyczo6RVRfU0VRVUVOQ0UsIDEsIDggfSwKKyAgICB7IGZsYXRidWZmZXJzOjpFVF9VTE9ORywgMCwgLTEgfSwKKyAgICB7IGZsYXRidWZmZXJzOjpFVF9VTE9ORywgMSwgLTEgfSwKKyAgICB7IGZsYXRidWZmZXJzOjpFVF9TRVFVRU5DRSwgMSwgOCB9LAorICAgIHsgZmxhdGJ1ZmZlcnM6OkVUX1VMT05HLCAwLCAtMSB9LAorICAgIHsgZmxhdGJ1ZmZlcnM6OkVUX1VMT05HLCAxLCAtMSB9LAorICAgIHsgZmxhdGJ1ZmZlcnM6OkVUX1VMT05HLCAwLCAtMSB9LAorICAgIHsgZmxhdGJ1ZmZlcnM6OkVUX1VMT05HLCAxLCAtMSB9LAorICAgIHsgZmxhdGJ1ZmZlcnM6OkVUX1VUWVBFLCAwLCA5IH0sCisgICAgeyBmbGF0YnVmZmVyczo6RVRfU0VRVUVOQ0UsIDAsIDkgfSwKKyAgICB7IGZsYXRidWZmZXJzOjpFVF9VVFlQRSwgMCwgMTAgfSwKKyAgICB7IGZsYXRidWZmZXJzOjpFVF9TRVFVRU5DRSwgMCwgMTAgfSwKKyAgICB7IGZsYXRidWZmZXJzOjpFVF9VQ0hBUiwgMSwgMSB9LAorICAgIHsgZmxhdGJ1ZmZlcnM6OkVUX0NIQVIsIDAsIDExIH0sCisgICAgeyBmbGF0YnVmZmVyczo6RVRfVUNIQVIsIDEsIC0xIH0sCisgICAgeyBmbGF0YnVmZmVyczo6RVRfU0VRVUVOQ0UsIDEsIDUgfSwKKyAgICB7IGZsYXRidWZmZXJzOjpFVF9TRVFVRU5DRSwgMCwgMyB9LAorICAgIHsgZmxhdGJ1ZmZlcnM6OkVUX1VMT05HLCAwLCAxMiB9LAorICAgIHsgZmxhdGJ1ZmZlcnM6OkVUX1VMT05HLCAwLCAxMiB9CisgIH07CisgIHN0YXRpYyBjb25zdCBmbGF0YnVmZmVyczo6VHlwZUZ1bmN0aW9uIHR5cGVfcmVmc1tdID0geworICAgIE15R2FtZTo6RXhhbXBsZTo6VmVjM1R5cGVUYWJsZSwKKyAgICBNeUdhbWU6OkV4YW1wbGU6OkNvbG9yVHlwZVRhYmxlLAorICAgIE15R2FtZTo6RXhhbXBsZTo6QW55VHlwZVRhYmxlLAorICAgIE15R2FtZTo6RXhhbXBsZTo6VGVzdFR5cGVUYWJsZSwKKyAgICBNeUdhbWU6OkV4YW1wbGU6Ok1vbnN0ZXJUeXBlVGFibGUsCisgICAgTXlHYW1lOjpFeGFtcGxlOjpTdGF0VHlwZVRhYmxlLAorICAgIE15R2FtZTo6RXhhbXBsZTo6QWJpbGl0eVR5cGVUYWJsZSwKKyAgICBNeUdhbWU6OkluUGFyZW50TmFtZXNwYWNlVHlwZVRhYmxlLAorICAgIE15R2FtZTo6RXhhbXBsZTo6UmVmZXJyYWJsZVR5cGVUYWJsZSwKKyAgICBNeUdhbWU6OkV4YW1wbGU6OkFueVVuaXF1ZUFsaWFzZXNUeXBlVGFibGUsCisgICAgTXlHYW1lOjpFeGFtcGxlOjpBbnlBbWJpZ3VvdXNBbGlhc2VzVHlwZVRhYmxlLAorICAgIE15R2FtZTo6RXhhbXBsZTo6UmFjZVR5cGVUYWJsZSwKKyAgICBNeUdhbWU6OkV4YW1wbGU6OkxvbmdFbnVtVHlwZVRhYmxlCisgIH07CisgIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgbmFtZXNbXSA9IHsKKyAgICAicG9zIiwKKyAgICAibWFuYSIsCisgICAgImhwIiwKKyAgICAibmFtZSIsCisgICAgImZyaWVuZGx5IiwKKyAgICAiaW52ZW50b3J5IiwKKyAgICAiY29sb3IiLAorICAgICJ0ZXN0X3R5cGUiLAorICAgICJ0ZXN0IiwKKyAgICAidGVzdDQiLAorICAgICJ0ZXN0YXJyYXlvZnN0cmluZyIsCisgICAgInRlc3RhcnJheW9mdGFibGVzIiwKKyAgICAiZW5lbXkiLAorICAgICJ0ZXN0bmVzdGVkZmxhdGJ1ZmZlciIsCisgICAgInRlc3RlbXB0eSIsCisgICAgInRlc3Rib29sIiwKKyAgICAidGVzdGhhc2hzMzJfZm52MSIsCisgICAgInRlc3RoYXNodTMyX2ZudjEiLAorICAgICJ0ZXN0aGFzaHM2NF9mbnYxIiwKKyAgICAidGVzdGhhc2h1NjRfZm52MSIsCisgICAgInRlc3RoYXNoczMyX2ZudjFhIiwKKyAgICAidGVzdGhhc2h1MzJfZm52MWEiLAorICAgICJ0ZXN0aGFzaHM2NF9mbnYxYSIsCisgICAgInRlc3RoYXNodTY0X2ZudjFhIiwKKyAgICAidGVzdGFycmF5b2Zib29scyIsCisgICAgInRlc3RmIiwKKyAgICAidGVzdGYyIiwKKyAgICAidGVzdGYzIiwKKyAgICAidGVzdGFycmF5b2ZzdHJpbmcyIiwKKyAgICAidGVzdGFycmF5b2Zzb3J0ZWRzdHJ1Y3QiLAorICAgICJmbGV4IiwKKyAgICAidGVzdDUiLAorICAgICJ2ZWN0b3Jfb2ZfbG9uZ3MiLAorICAgICJ2ZWN0b3Jfb2ZfZG91YmxlcyIsCisgICAgInBhcmVudF9uYW1lc3BhY2VfdGVzdCIsCisgICAgInZlY3Rvcl9vZl9yZWZlcnJhYmxlcyIsCisgICAgInNpbmdsZV93ZWFrX3JlZmVyZW5jZSIsCisgICAgInZlY3Rvcl9vZl93ZWFrX3JlZmVyZW5jZXMiLAorICAgICJ2ZWN0b3Jfb2Zfc3Ryb25nX3JlZmVycmFibGVzIiwKKyAgICAiY29fb3duaW5nX3JlZmVyZW5jZSIsCisgICAgInZlY3Rvcl9vZl9jb19vd25pbmdfcmVmZXJlbmNlcyIsCisgICAgIm5vbl9vd25pbmdfcmVmZXJlbmNlIiwKKyAgICAidmVjdG9yX29mX25vbl9vd25pbmdfcmVmZXJlbmNlcyIsCisgICAgImFueV91bmlxdWVfdHlwZSIsCisgICAgImFueV91bmlxdWUiLAorICAgICJhbnlfYW1iaWd1b3VzX3R5cGUiLAorICAgICJhbnlfYW1iaWd1b3VzIiwKKyAgICAidmVjdG9yX29mX2VudW1zIiwKKyAgICAic2lnbmVkX2VudW0iLAorICAgICJ0ZXN0cmVxdWlyZWRuZXN0ZWRmbGF0YnVmZmVyIiwKKyAgICAic2NhbGFyX2tleV9zb3J0ZWRfdGFibGVzIiwKKyAgICAibmF0aXZlX2lubGluZSIsCisgICAgImxvbmdfZW51bV9ub25fZW51bV9kZWZhdWx0IiwKKyAgICAibG9uZ19lbnVtX25vcm1hbF9kZWZhdWx0IgorICB9OworICBzdGF0aWMgY29uc3QgZmxhdGJ1ZmZlcnM6OlR5cGVUYWJsZSB0dCA9IHsKKyAgICBmbGF0YnVmZmVyczo6U1RfVEFCTEUsIDU0LCB0eXBlX2NvZGVzLCB0eXBlX3JlZnMsIG51bGxwdHIsIG51bGxwdHIsIG5hbWVzCisgIH07CisgIHJldHVybiAmdHQ7Cit9CisKK2lubGluZSBjb25zdCBmbGF0YnVmZmVyczo6VHlwZVRhYmxlICpUeXBlQWxpYXNlc1R5cGVUYWJsZSgpIHsKKyAgc3RhdGljIGNvbnN0IGZsYXRidWZmZXJzOjpUeXBlQ29kZSB0eXBlX2NvZGVzW10gPSB7CisgICAgeyBmbGF0YnVmZmVyczo6RVRfQ0hBUiwgMCwgLTEgfSwKKyAgICB7IGZsYXRidWZmZXJzOjpFVF9VQ0hBUiwgMCwgLTEgfSwKKyAgICB7IGZsYXRidWZmZXJzOjpFVF9TSE9SVCwgMCwgLTEgfSwKKyAgICB7IGZsYXRidWZmZXJzOjpFVF9VU0hPUlQsIDAsIC0xIH0sCisgICAgeyBmbGF0YnVmZmVyczo6RVRfSU5ULCAwLCAtMSB9LAorICAgIHsgZmxhdGJ1ZmZlcnM6OkVUX1VJTlQsIDAsIC0xIH0sCisgICAgeyBmbGF0YnVmZmVyczo6RVRfTE9ORywgMCwgLTEgfSwKKyAgICB7IGZsYXRidWZmZXJzOjpFVF9VTE9ORywgMCwgLTEgfSwKKyAgICB7IGZsYXRidWZmZXJzOjpFVF9GTE9BVCwgMCwgLTEgfSwKKyAgICB7IGZsYXRidWZmZXJzOjpFVF9ET1VCTEUsIDAsIC0xIH0sCisgICAgeyBmbGF0YnVmZmVyczo6RVRfQ0hBUiwgMSwgLTEgfSwKKyAgICB7IGZsYXRidWZmZXJzOjpFVF9ET1VCTEUsIDEsIC0xIH0KKyAgfTsKKyAgc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBuYW1lc1tdID0geworICAgICJpOCIsCisgICAgInU4IiwKKyAgICAiaTE2IiwKKyAgICAidTE2IiwKKyAgICAiaTMyIiwKKyAgICAidTMyIiwKKyAgICAiaTY0IiwKKyAgICAidTY0IiwKKyAgICAiZjMyIiwKKyAgICAiZjY0IiwKKyAgICAidjgiLAorICAgICJ2ZjY0IgorICB9OworICBzdGF0aWMgY29uc3QgZmxhdGJ1ZmZlcnM6OlR5cGVUYWJsZSB0dCA9IHsKKyAgICBmbGF0YnVmZmVyczo6U1RfVEFCTEUsIDEyLCB0eXBlX2NvZGVzLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyLCBuYW1lcworICB9OworICByZXR1cm4gJnR0OworfQorCitpbmxpbmUgY29uc3QgTXlHYW1lOjpFeGFtcGxlOjpNb25zdGVyICpHZXRNb25zdGVyKGNvbnN0IHZvaWQgKmJ1ZikgeworICByZXR1cm4gZmxhdGJ1ZmZlcnM6OkdldFJvb3Q8TXlHYW1lOjpFeGFtcGxlOjpNb25zdGVyPihidWYpOworfQorCitpbmxpbmUgY29uc3QgTXlHYW1lOjpFeGFtcGxlOjpNb25zdGVyICpHZXRTaXplUHJlZml4ZWRNb25zdGVyKGNvbnN0IHZvaWQgKmJ1ZikgeworICByZXR1cm4gZmxhdGJ1ZmZlcnM6OkdldFNpemVQcmVmaXhlZFJvb3Q8TXlHYW1lOjpFeGFtcGxlOjpNb25zdGVyPihidWYpOworfQorCitpbmxpbmUgTW9uc3RlciAqR2V0TXV0YWJsZU1vbnN0ZXIodm9pZCAqYnVmKSB7CisgIHJldHVybiBmbGF0YnVmZmVyczo6R2V0TXV0YWJsZVJvb3Q8TW9uc3Rlcj4oYnVmKTsKK30KKworaW5saW5lIE15R2FtZTo6RXhhbXBsZTo6TW9uc3RlciAqR2V0TXV0YWJsZVNpemVQcmVmaXhlZE1vbnN0ZXIodm9pZCAqYnVmKSB7CisgIHJldHVybiBmbGF0YnVmZmVyczo6R2V0TXV0YWJsZVNpemVQcmVmaXhlZFJvb3Q8TXlHYW1lOjpFeGFtcGxlOjpNb25zdGVyPihidWYpOworfQorCitpbmxpbmUgY29uc3QgY2hhciAqTW9uc3RlcklkZW50aWZpZXIoKSB7CisgIHJldHVybiAiTU9OUyI7Cit9CisKK2lubGluZSBib29sIE1vbnN0ZXJCdWZmZXJIYXNJZGVudGlmaWVyKGNvbnN0IHZvaWQgKmJ1ZikgeworICByZXR1cm4gZmxhdGJ1ZmZlcnM6OkJ1ZmZlckhhc0lkZW50aWZpZXIoCisgICAgICBidWYsIE1vbnN0ZXJJZGVudGlmaWVyKCkpOworfQorCitpbmxpbmUgYm9vbCBTaXplUHJlZml4ZWRNb25zdGVyQnVmZmVySGFzSWRlbnRpZmllcihjb25zdCB2b2lkICpidWYpIHsKKyAgcmV0dXJuIGZsYXRidWZmZXJzOjpCdWZmZXJIYXNJZGVudGlmaWVyKAorICAgICAgYnVmLCBNb25zdGVySWRlbnRpZmllcigpLCB0cnVlKTsKK30KKworaW5saW5lIGJvb2wgVmVyaWZ5TW9uc3RlckJ1ZmZlcigKKyAgICBmbGF0YnVmZmVyczo6VmVyaWZpZXIgJnZlcmlmaWVyKSB7CisgIHJldHVybiB2ZXJpZmllci5WZXJpZnlCdWZmZXI8TXlHYW1lOjpFeGFtcGxlOjpNb25zdGVyPihNb25zdGVySWRlbnRpZmllcigpKTsKK30KKworaW5saW5lIGJvb2wgVmVyaWZ5U2l6ZVByZWZpeGVkTW9uc3RlckJ1ZmZlcigKKyAgICBmbGF0YnVmZmVyczo6VmVyaWZpZXIgJnZlcmlmaWVyKSB7CisgIHJldHVybiB2ZXJpZmllci5WZXJpZnlTaXplUHJlZml4ZWRCdWZmZXI8TXlHYW1lOjpFeGFtcGxlOjpNb25zdGVyPihNb25zdGVySWRlbnRpZmllcigpKTsKK30KKworaW5saW5lIGNvbnN0IGNoYXIgKk1vbnN0ZXJFeHRlbnNpb24oKSB7CisgIHJldHVybiAibW9uIjsKK30KKworaW5saW5lIHZvaWQgRmluaXNoTW9uc3RlckJ1ZmZlcigKKyAgICBmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJmZiYiwKKyAgICBmbGF0YnVmZmVyczo6T2Zmc2V0PE15R2FtZTo6RXhhbXBsZTo6TW9uc3Rlcj4gcm9vdCkgeworICBmYmIuRmluaXNoKHJvb3QsIE1vbnN0ZXJJZGVudGlmaWVyKCkpOworfQorCitpbmxpbmUgdm9pZCBGaW5pc2hTaXplUHJlZml4ZWRNb25zdGVyQnVmZmVyKAorICAgIGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmZmJiLAorICAgIGZsYXRidWZmZXJzOjpPZmZzZXQ8TXlHYW1lOjpFeGFtcGxlOjpNb25zdGVyPiByb290KSB7CisgIGZiYi5GaW5pc2hTaXplUHJlZml4ZWQocm9vdCwgTW9uc3RlcklkZW50aWZpZXIoKSk7Cit9CisKK2lubGluZSBmbGF0YnVmZmVyczo6dW5pcXVlX3B0cjxNeUdhbWU6OkV4YW1wbGU6Ok1vbnN0ZXJUPiBVblBhY2tNb25zdGVyKAorICAgIGNvbnN0IHZvaWQgKmJ1ZiwKKyAgICBjb25zdCBmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqcmVzID0gbnVsbHB0cikgeworICByZXR1cm4gZmxhdGJ1ZmZlcnM6OnVuaXF1ZV9wdHI8TXlHYW1lOjpFeGFtcGxlOjpNb25zdGVyVD4oR2V0TW9uc3RlcihidWYpLT5VblBhY2socmVzKSk7Cit9CisKK2lubGluZSBmbGF0YnVmZmVyczo6dW5pcXVlX3B0cjxNeUdhbWU6OkV4YW1wbGU6Ok1vbnN0ZXJUPiBVblBhY2tTaXplUHJlZml4ZWRNb25zdGVyKAorICAgIGNvbnN0IHZvaWQgKmJ1ZiwKKyAgICBjb25zdCBmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqcmVzID0gbnVsbHB0cikgeworICByZXR1cm4gZmxhdGJ1ZmZlcnM6OnVuaXF1ZV9wdHI8TXlHYW1lOjpFeGFtcGxlOjpNb25zdGVyVD4oR2V0U2l6ZVByZWZpeGVkTW9uc3RlcihidWYpLT5VblBhY2socmVzKSk7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBFeGFtcGxlCit9ICAvLyBuYW1lc3BhY2UgTXlHYW1lCisKKyNlbmRpZiAgLy8gRkxBVEJVRkZFUlNfR0VORVJBVEVEX01PTlNURVJURVNUX01ZR0FNRV9FWEFNUExFX0hfCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9tb25zdGVyX3Rlc3Rfc3VmZml4L2ZpbGVzdWZmaXhfb25seS9tb25zdGVyX3Rlc3QuZ3JwYy5mYi5jYyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL21vbnN0ZXJfdGVzdF9zdWZmaXgvZmlsZXN1ZmZpeF9vbmx5L21vbnN0ZXJfdGVzdC5ncnBjLmZiLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNlZjg5Y2UKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9tb25zdGVyX3Rlc3Rfc3VmZml4L2ZpbGVzdWZmaXhfb25seS9tb25zdGVyX3Rlc3QuZ3JwYy5mYi5jYwpAQCAtMCwwICsxLDEzMSBAQAorLy8gR2VuZXJhdGVkIGJ5IHRoZSBnUlBDIEMrKyBwbHVnaW4uCisvLyBJZiB5b3UgbWFrZSBhbnkgbG9jYWwgY2hhbmdlLCB0aGV5IHdpbGwgYmUgbG9zdC4KKy8vIHNvdXJjZTogbW9uc3Rlcl90ZXN0CisKKyNpbmNsdWRlICJtb25zdGVyX3Rlc3Rfc3VmZml4LmgiCisjaW5jbHVkZSAibW9uc3Rlcl90ZXN0LmdycGMuZmIuaCIKKworI2luY2x1ZGUgPGdycGNwcC9pbXBsL2NvZGVnZW4vYXN5bmNfc3RyZWFtLmg+CisjaW5jbHVkZSA8Z3JwY3BwL2ltcGwvY29kZWdlbi9hc3luY191bmFyeV9jYWxsLmg+CisjaW5jbHVkZSA8Z3JwY3BwL2ltcGwvY29kZWdlbi9jaGFubmVsX2ludGVyZmFjZS5oPgorI2luY2x1ZGUgPGdycGNwcC9pbXBsL2NvZGVnZW4vY2xpZW50X3VuYXJ5X2NhbGwuaD4KKyNpbmNsdWRlIDxncnBjcHAvaW1wbC9jb2RlZ2VuL21ldGhvZF9oYW5kbGVyLmg+CisjaW5jbHVkZSA8Z3JwY3BwL2ltcGwvY29kZWdlbi9ycGNfc2VydmljZV9tZXRob2QuaD4KKyNpbmNsdWRlIDxncnBjcHAvaW1wbC9jb2RlZ2VuL3NlcnZpY2VfdHlwZS5oPgorI2luY2x1ZGUgPGdycGNwcC9pbXBsL2NvZGVnZW4vc3luY19zdHJlYW0uaD4KK25hbWVzcGFjZSBNeUdhbWUgeworbmFtZXNwYWNlIEV4YW1wbGUgeworCitzdGF0aWMgY29uc3QgY2hhciogTW9uc3RlclN0b3JhZ2VfbWV0aG9kX25hbWVzW10gPSB7CisgICIvTXlHYW1lLkV4YW1wbGUuTW9uc3RlclN0b3JhZ2UvU3RvcmUiLAorICAiL015R2FtZS5FeGFtcGxlLk1vbnN0ZXJTdG9yYWdlL1JldHJpZXZlIiwKKyAgIi9NeUdhbWUuRXhhbXBsZS5Nb25zdGVyU3RvcmFnZS9HZXRNYXhIaXRQb2ludCIsCisgICIvTXlHYW1lLkV4YW1wbGUuTW9uc3RlclN0b3JhZ2UvR2V0TWluTWF4SGl0UG9pbnRzIiwKK307CisKK3N0ZDo6dW5pcXVlX3B0cjwgTW9uc3RlclN0b3JhZ2U6OlN0dWI+IE1vbnN0ZXJTdG9yYWdlOjpOZXdTdHViKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjwgOjpncnBjOjpDaGFubmVsSW50ZXJmYWNlPiYgY2hhbm5lbCwgY29uc3QgOjpncnBjOjpTdHViT3B0aW9ucyYgLypvcHRpb25zKi8pIHsKKyAgc3RkOjp1bmlxdWVfcHRyPCBNb25zdGVyU3RvcmFnZTo6U3R1Yj4gc3R1YihuZXcgTW9uc3RlclN0b3JhZ2U6OlN0dWIoY2hhbm5lbCkpOworICByZXR1cm4gc3R1YjsKK30KKworTW9uc3RlclN0b3JhZ2U6OlN0dWI6OlN0dWIoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPCA6OmdycGM6OkNoYW5uZWxJbnRlcmZhY2U+JiBjaGFubmVsKQorICA6IGNoYW5uZWxfKGNoYW5uZWwpICAsIHJwY21ldGhvZF9TdG9yZV8oTW9uc3RlclN0b3JhZ2VfbWV0aG9kX25hbWVzWzBdLCA6OmdycGM6OmludGVybmFsOjpScGNNZXRob2Q6Ok5PUk1BTF9SUEMsIGNoYW5uZWwpCisgICwgcnBjbWV0aG9kX1JldHJpZXZlXyhNb25zdGVyU3RvcmFnZV9tZXRob2RfbmFtZXNbMV0sIDo6Z3JwYzo6aW50ZXJuYWw6OlJwY01ldGhvZDo6U0VSVkVSX1NUUkVBTUlORywgY2hhbm5lbCkKKyAgLCBycGNtZXRob2RfR2V0TWF4SGl0UG9pbnRfKE1vbnN0ZXJTdG9yYWdlX21ldGhvZF9uYW1lc1syXSwgOjpncnBjOjppbnRlcm5hbDo6UnBjTWV0aG9kOjpDTElFTlRfU1RSRUFNSU5HLCBjaGFubmVsKQorICAsIHJwY21ldGhvZF9HZXRNaW5NYXhIaXRQb2ludHNfKE1vbnN0ZXJTdG9yYWdlX21ldGhvZF9uYW1lc1szXSwgOjpncnBjOjppbnRlcm5hbDo6UnBjTWV0aG9kOjpCSURJX1NUUkVBTUlORywgY2hhbm5lbCkKKyAge30KKyAgCis6OmdycGM6OlN0YXR1cyBNb25zdGVyU3RvcmFnZTo6U3R1Yjo6U3RvcmUoOjpncnBjOjpDbGllbnRDb250ZXh0KiBjb250ZXh0LCBjb25zdCBmbGF0YnVmZmVyczo6Z3JwYzo6TWVzc2FnZTxNb25zdGVyPiYgcmVxdWVzdCwgZmxhdGJ1ZmZlcnM6OmdycGM6Ok1lc3NhZ2U8U3RhdD4qIHJlc3BvbnNlKSB7CisgIHJldHVybiA6OmdycGM6OmludGVybmFsOjpCbG9ja2luZ1VuYXJ5Q2FsbChjaGFubmVsXy5nZXQoKSwgcnBjbWV0aG9kX1N0b3JlXywgY29udGV4dCwgcmVxdWVzdCwgcmVzcG9uc2UpOworfQorCis6OmdycGM6OkNsaWVudEFzeW5jUmVzcG9uc2VSZWFkZXI8IGZsYXRidWZmZXJzOjpncnBjOjpNZXNzYWdlPFN0YXQ+PiogTW9uc3RlclN0b3JhZ2U6OlN0dWI6OkFzeW5jU3RvcmVSYXcoOjpncnBjOjpDbGllbnRDb250ZXh0KiBjb250ZXh0LCBjb25zdCBmbGF0YnVmZmVyczo6Z3JwYzo6TWVzc2FnZTxNb25zdGVyPiYgcmVxdWVzdCwgOjpncnBjOjpDb21wbGV0aW9uUXVldWUqIGNxKSB7CisgIHJldHVybiA6OmdycGM6OmludGVybmFsOjpDbGllbnRBc3luY1Jlc3BvbnNlUmVhZGVyRmFjdG9yeTwgZmxhdGJ1ZmZlcnM6OmdycGM6Ok1lc3NhZ2U8U3RhdD4+OjpDcmVhdGUoY2hhbm5lbF8uZ2V0KCksIGNxLCBycGNtZXRob2RfU3RvcmVfLCBjb250ZXh0LCByZXF1ZXN0LCB0cnVlKTsKK30KKworOjpncnBjOjpDbGllbnRBc3luY1Jlc3BvbnNlUmVhZGVyPCBmbGF0YnVmZmVyczo6Z3JwYzo6TWVzc2FnZTxTdGF0Pj4qIE1vbnN0ZXJTdG9yYWdlOjpTdHViOjpQcmVwYXJlQXN5bmNTdG9yZVJhdyg6OmdycGM6OkNsaWVudENvbnRleHQqIGNvbnRleHQsIGNvbnN0IGZsYXRidWZmZXJzOjpncnBjOjpNZXNzYWdlPE1vbnN0ZXI+JiByZXF1ZXN0LCA6OmdycGM6OkNvbXBsZXRpb25RdWV1ZSogY3EpIHsKKyAgcmV0dXJuIDo6Z3JwYzo6aW50ZXJuYWw6OkNsaWVudEFzeW5jUmVzcG9uc2VSZWFkZXJGYWN0b3J5PCBmbGF0YnVmZmVyczo6Z3JwYzo6TWVzc2FnZTxTdGF0Pj46OkNyZWF0ZShjaGFubmVsXy5nZXQoKSwgY3EsIHJwY21ldGhvZF9TdG9yZV8sIGNvbnRleHQsIHJlcXVlc3QsIGZhbHNlKTsKK30KKworOjpncnBjOjpDbGllbnRSZWFkZXI8IGZsYXRidWZmZXJzOjpncnBjOjpNZXNzYWdlPE1vbnN0ZXI+PiogTW9uc3RlclN0b3JhZ2U6OlN0dWI6OlJldHJpZXZlUmF3KDo6Z3JwYzo6Q2xpZW50Q29udGV4dCogY29udGV4dCwgY29uc3QgZmxhdGJ1ZmZlcnM6OmdycGM6Ok1lc3NhZ2U8U3RhdD4mIHJlcXVlc3QpIHsKKyAgcmV0dXJuIDo6Z3JwYzo6aW50ZXJuYWw6OkNsaWVudFJlYWRlckZhY3Rvcnk8IGZsYXRidWZmZXJzOjpncnBjOjpNZXNzYWdlPE1vbnN0ZXI+Pjo6Q3JlYXRlKGNoYW5uZWxfLmdldCgpLCBycGNtZXRob2RfUmV0cmlldmVfLCBjb250ZXh0LCByZXF1ZXN0KTsKK30KKworOjpncnBjOjpDbGllbnRBc3luY1JlYWRlcjwgZmxhdGJ1ZmZlcnM6OmdycGM6Ok1lc3NhZ2U8TW9uc3Rlcj4+KiBNb25zdGVyU3RvcmFnZTo6U3R1Yjo6QXN5bmNSZXRyaWV2ZVJhdyg6OmdycGM6OkNsaWVudENvbnRleHQqIGNvbnRleHQsIGNvbnN0IGZsYXRidWZmZXJzOjpncnBjOjpNZXNzYWdlPFN0YXQ+JiByZXF1ZXN0LCA6OmdycGM6OkNvbXBsZXRpb25RdWV1ZSogY3EsIHZvaWQqIHRhZykgeworICByZXR1cm4gOjpncnBjOjppbnRlcm5hbDo6Q2xpZW50QXN5bmNSZWFkZXJGYWN0b3J5PCBmbGF0YnVmZmVyczo6Z3JwYzo6TWVzc2FnZTxNb25zdGVyPj46OkNyZWF0ZShjaGFubmVsXy5nZXQoKSwgY3EsIHJwY21ldGhvZF9SZXRyaWV2ZV8sIGNvbnRleHQsIHJlcXVlc3QsIHRydWUsIHRhZyk7Cit9CisKKzo6Z3JwYzo6Q2xpZW50QXN5bmNSZWFkZXI8IGZsYXRidWZmZXJzOjpncnBjOjpNZXNzYWdlPE1vbnN0ZXI+PiogTW9uc3RlclN0b3JhZ2U6OlN0dWI6OlByZXBhcmVBc3luY1JldHJpZXZlUmF3KDo6Z3JwYzo6Q2xpZW50Q29udGV4dCogY29udGV4dCwgY29uc3QgZmxhdGJ1ZmZlcnM6OmdycGM6Ok1lc3NhZ2U8U3RhdD4mIHJlcXVlc3QsIDo6Z3JwYzo6Q29tcGxldGlvblF1ZXVlKiBjcSkgeworICByZXR1cm4gOjpncnBjOjppbnRlcm5hbDo6Q2xpZW50QXN5bmNSZWFkZXJGYWN0b3J5PCBmbGF0YnVmZmVyczo6Z3JwYzo6TWVzc2FnZTxNb25zdGVyPj46OkNyZWF0ZShjaGFubmVsXy5nZXQoKSwgY3EsIHJwY21ldGhvZF9SZXRyaWV2ZV8sIGNvbnRleHQsIHJlcXVlc3QsIGZhbHNlLCBudWxscHRyKTsKK30KKworOjpncnBjOjpDbGllbnRXcml0ZXI8IGZsYXRidWZmZXJzOjpncnBjOjpNZXNzYWdlPE1vbnN0ZXI+PiogTW9uc3RlclN0b3JhZ2U6OlN0dWI6OkdldE1heEhpdFBvaW50UmF3KDo6Z3JwYzo6Q2xpZW50Q29udGV4dCogY29udGV4dCwgZmxhdGJ1ZmZlcnM6OmdycGM6Ok1lc3NhZ2U8U3RhdD4qIHJlc3BvbnNlKSB7CisgIHJldHVybiA6OmdycGM6OmludGVybmFsOjpDbGllbnRXcml0ZXJGYWN0b3J5PCBmbGF0YnVmZmVyczo6Z3JwYzo6TWVzc2FnZTxNb25zdGVyPj46OkNyZWF0ZShjaGFubmVsXy5nZXQoKSwgcnBjbWV0aG9kX0dldE1heEhpdFBvaW50XywgY29udGV4dCwgcmVzcG9uc2UpOworfQorCis6OmdycGM6OkNsaWVudEFzeW5jV3JpdGVyPCBmbGF0YnVmZmVyczo6Z3JwYzo6TWVzc2FnZTxNb25zdGVyPj4qIE1vbnN0ZXJTdG9yYWdlOjpTdHViOjpBc3luY0dldE1heEhpdFBvaW50UmF3KDo6Z3JwYzo6Q2xpZW50Q29udGV4dCogY29udGV4dCwgZmxhdGJ1ZmZlcnM6OmdycGM6Ok1lc3NhZ2U8U3RhdD4qIHJlc3BvbnNlLCA6OmdycGM6OkNvbXBsZXRpb25RdWV1ZSogY3EsIHZvaWQqIHRhZykgeworICByZXR1cm4gOjpncnBjOjppbnRlcm5hbDo6Q2xpZW50QXN5bmNXcml0ZXJGYWN0b3J5PCBmbGF0YnVmZmVyczo6Z3JwYzo6TWVzc2FnZTxNb25zdGVyPj46OkNyZWF0ZShjaGFubmVsXy5nZXQoKSwgY3EsIHJwY21ldGhvZF9HZXRNYXhIaXRQb2ludF8sIGNvbnRleHQsIHJlc3BvbnNlLCB0cnVlLCB0YWcpOworfQorCis6OmdycGM6OkNsaWVudEFzeW5jV3JpdGVyPCBmbGF0YnVmZmVyczo6Z3JwYzo6TWVzc2FnZTxNb25zdGVyPj4qIE1vbnN0ZXJTdG9yYWdlOjpTdHViOjpQcmVwYXJlQXN5bmNHZXRNYXhIaXRQb2ludFJhdyg6OmdycGM6OkNsaWVudENvbnRleHQqIGNvbnRleHQsIGZsYXRidWZmZXJzOjpncnBjOjpNZXNzYWdlPFN0YXQ+KiByZXNwb25zZSwgOjpncnBjOjpDb21wbGV0aW9uUXVldWUqIGNxKSB7CisgIHJldHVybiA6OmdycGM6OmludGVybmFsOjpDbGllbnRBc3luY1dyaXRlckZhY3Rvcnk8IGZsYXRidWZmZXJzOjpncnBjOjpNZXNzYWdlPE1vbnN0ZXI+Pjo6Q3JlYXRlKGNoYW5uZWxfLmdldCgpLCBjcSwgcnBjbWV0aG9kX0dldE1heEhpdFBvaW50XywgY29udGV4dCwgcmVzcG9uc2UsIGZhbHNlLCBudWxscHRyKTsKK30KKworOjpncnBjOjpDbGllbnRSZWFkZXJXcml0ZXI8IGZsYXRidWZmZXJzOjpncnBjOjpNZXNzYWdlPE1vbnN0ZXI+LCBmbGF0YnVmZmVyczo6Z3JwYzo6TWVzc2FnZTxTdGF0Pj4qIE1vbnN0ZXJTdG9yYWdlOjpTdHViOjpHZXRNaW5NYXhIaXRQb2ludHNSYXcoOjpncnBjOjpDbGllbnRDb250ZXh0KiBjb250ZXh0KSB7CisgIHJldHVybiA6OmdycGM6OmludGVybmFsOjpDbGllbnRSZWFkZXJXcml0ZXJGYWN0b3J5PCBmbGF0YnVmZmVyczo6Z3JwYzo6TWVzc2FnZTxNb25zdGVyPiwgZmxhdGJ1ZmZlcnM6OmdycGM6Ok1lc3NhZ2U8U3RhdD4+OjpDcmVhdGUoY2hhbm5lbF8uZ2V0KCksIHJwY21ldGhvZF9HZXRNaW5NYXhIaXRQb2ludHNfLCBjb250ZXh0KTsKK30KKworOjpncnBjOjpDbGllbnRBc3luY1JlYWRlcldyaXRlcjwgZmxhdGJ1ZmZlcnM6OmdycGM6Ok1lc3NhZ2U8TW9uc3Rlcj4sIGZsYXRidWZmZXJzOjpncnBjOjpNZXNzYWdlPFN0YXQ+PiogTW9uc3RlclN0b3JhZ2U6OlN0dWI6OkFzeW5jR2V0TWluTWF4SGl0UG9pbnRzUmF3KDo6Z3JwYzo6Q2xpZW50Q29udGV4dCogY29udGV4dCwgOjpncnBjOjpDb21wbGV0aW9uUXVldWUqIGNxLCB2b2lkKiB0YWcpIHsKKyAgcmV0dXJuIDo6Z3JwYzo6aW50ZXJuYWw6OkNsaWVudEFzeW5jUmVhZGVyV3JpdGVyRmFjdG9yeTwgZmxhdGJ1ZmZlcnM6OmdycGM6Ok1lc3NhZ2U8TW9uc3Rlcj4sIGZsYXRidWZmZXJzOjpncnBjOjpNZXNzYWdlPFN0YXQ+Pjo6Q3JlYXRlKGNoYW5uZWxfLmdldCgpLCBjcSwgcnBjbWV0aG9kX0dldE1pbk1heEhpdFBvaW50c18sIGNvbnRleHQsIHRydWUsIHRhZyk7Cit9CisKKzo6Z3JwYzo6Q2xpZW50QXN5bmNSZWFkZXJXcml0ZXI8IGZsYXRidWZmZXJzOjpncnBjOjpNZXNzYWdlPE1vbnN0ZXI+LCBmbGF0YnVmZmVyczo6Z3JwYzo6TWVzc2FnZTxTdGF0Pj4qIE1vbnN0ZXJTdG9yYWdlOjpTdHViOjpQcmVwYXJlQXN5bmNHZXRNaW5NYXhIaXRQb2ludHNSYXcoOjpncnBjOjpDbGllbnRDb250ZXh0KiBjb250ZXh0LCA6OmdycGM6OkNvbXBsZXRpb25RdWV1ZSogY3EpIHsKKyAgcmV0dXJuIDo6Z3JwYzo6aW50ZXJuYWw6OkNsaWVudEFzeW5jUmVhZGVyV3JpdGVyRmFjdG9yeTwgZmxhdGJ1ZmZlcnM6OmdycGM6Ok1lc3NhZ2U8TW9uc3Rlcj4sIGZsYXRidWZmZXJzOjpncnBjOjpNZXNzYWdlPFN0YXQ+Pjo6Q3JlYXRlKGNoYW5uZWxfLmdldCgpLCBjcSwgcnBjbWV0aG9kX0dldE1pbk1heEhpdFBvaW50c18sIGNvbnRleHQsIGZhbHNlLCBudWxscHRyKTsKK30KKworTW9uc3RlclN0b3JhZ2U6OlNlcnZpY2U6OlNlcnZpY2UoKSB7CisgIEFkZE1ldGhvZChuZXcgOjpncnBjOjppbnRlcm5hbDo6UnBjU2VydmljZU1ldGhvZCgKKyAgICAgIE1vbnN0ZXJTdG9yYWdlX21ldGhvZF9uYW1lc1swXSwKKyAgICAgIDo6Z3JwYzo6aW50ZXJuYWw6OlJwY01ldGhvZDo6Tk9STUFMX1JQQywKKyAgICAgIG5ldyA6OmdycGM6OmludGVybmFsOjpScGNNZXRob2RIYW5kbGVyPCBNb25zdGVyU3RvcmFnZTo6U2VydmljZSwgZmxhdGJ1ZmZlcnM6OmdycGM6Ok1lc3NhZ2U8TW9uc3Rlcj4sIGZsYXRidWZmZXJzOjpncnBjOjpNZXNzYWdlPFN0YXQ+PigKKyAgICAgICAgICBzdGQ6Om1lbV9mbigmTW9uc3RlclN0b3JhZ2U6OlNlcnZpY2U6OlN0b3JlKSwgdGhpcykpKTsKKyAgQWRkTWV0aG9kKG5ldyA6OmdycGM6OmludGVybmFsOjpScGNTZXJ2aWNlTWV0aG9kKAorICAgICAgTW9uc3RlclN0b3JhZ2VfbWV0aG9kX25hbWVzWzFdLAorICAgICAgOjpncnBjOjppbnRlcm5hbDo6UnBjTWV0aG9kOjpTRVJWRVJfU1RSRUFNSU5HLAorICAgICAgbmV3IDo6Z3JwYzo6aW50ZXJuYWw6OlNlcnZlclN0cmVhbWluZ0hhbmRsZXI8IE1vbnN0ZXJTdG9yYWdlOjpTZXJ2aWNlLCBmbGF0YnVmZmVyczo6Z3JwYzo6TWVzc2FnZTxTdGF0PiwgZmxhdGJ1ZmZlcnM6OmdycGM6Ok1lc3NhZ2U8TW9uc3Rlcj4+KAorICAgICAgICAgIHN0ZDo6bWVtX2ZuKCZNb25zdGVyU3RvcmFnZTo6U2VydmljZTo6UmV0cmlldmUpLCB0aGlzKSkpOworICBBZGRNZXRob2QobmV3IDo6Z3JwYzo6aW50ZXJuYWw6OlJwY1NlcnZpY2VNZXRob2QoCisgICAgICBNb25zdGVyU3RvcmFnZV9tZXRob2RfbmFtZXNbMl0sCisgICAgICA6OmdycGM6OmludGVybmFsOjpScGNNZXRob2Q6OkNMSUVOVF9TVFJFQU1JTkcsCisgICAgICBuZXcgOjpncnBjOjppbnRlcm5hbDo6Q2xpZW50U3RyZWFtaW5nSGFuZGxlcjwgTW9uc3RlclN0b3JhZ2U6OlNlcnZpY2UsIGZsYXRidWZmZXJzOjpncnBjOjpNZXNzYWdlPE1vbnN0ZXI+LCBmbGF0YnVmZmVyczo6Z3JwYzo6TWVzc2FnZTxTdGF0Pj4oCisgICAgICAgICAgc3RkOjptZW1fZm4oJk1vbnN0ZXJTdG9yYWdlOjpTZXJ2aWNlOjpHZXRNYXhIaXRQb2ludCksIHRoaXMpKSk7CisgIEFkZE1ldGhvZChuZXcgOjpncnBjOjppbnRlcm5hbDo6UnBjU2VydmljZU1ldGhvZCgKKyAgICAgIE1vbnN0ZXJTdG9yYWdlX21ldGhvZF9uYW1lc1szXSwKKyAgICAgIDo6Z3JwYzo6aW50ZXJuYWw6OlJwY01ldGhvZDo6QklESV9TVFJFQU1JTkcsCisgICAgICBuZXcgOjpncnBjOjppbnRlcm5hbDo6QmlkaVN0cmVhbWluZ0hhbmRsZXI8IE1vbnN0ZXJTdG9yYWdlOjpTZXJ2aWNlLCBmbGF0YnVmZmVyczo6Z3JwYzo6TWVzc2FnZTxNb25zdGVyPiwgZmxhdGJ1ZmZlcnM6OmdycGM6Ok1lc3NhZ2U8U3RhdD4+KAorICAgICAgICAgIHN0ZDo6bWVtX2ZuKCZNb25zdGVyU3RvcmFnZTo6U2VydmljZTo6R2V0TWluTWF4SGl0UG9pbnRzKSwgdGhpcykpKTsKK30KKworTW9uc3RlclN0b3JhZ2U6OlNlcnZpY2U6On5TZXJ2aWNlKCkgeworfQorCis6OmdycGM6OlN0YXR1cyBNb25zdGVyU3RvcmFnZTo6U2VydmljZTo6U3RvcmUoOjpncnBjOjpTZXJ2ZXJDb250ZXh0KiAvKmNvbnRleHQqLywgY29uc3QgZmxhdGJ1ZmZlcnM6OmdycGM6Ok1lc3NhZ2U8TW9uc3Rlcj4qIC8qcmVxdWVzdCovLCBmbGF0YnVmZmVyczo6Z3JwYzo6TWVzc2FnZTxTdGF0PiogLypyZXNwb25zZSovKSB7CisgIHJldHVybiA6OmdycGM6OlN0YXR1cyg6OmdycGM6OlN0YXR1c0NvZGU6OlVOSU1QTEVNRU5URUQsICIiKTsKK30KKworOjpncnBjOjpTdGF0dXMgTW9uc3RlclN0b3JhZ2U6OlNlcnZpY2U6OlJldHJpZXZlKDo6Z3JwYzo6U2VydmVyQ29udGV4dCogLypjb250ZXh0Ki8sIGNvbnN0IGZsYXRidWZmZXJzOjpncnBjOjpNZXNzYWdlPFN0YXQ+KiAvKnJlcXVlc3QqLywgOjpncnBjOjpTZXJ2ZXJXcml0ZXI8IGZsYXRidWZmZXJzOjpncnBjOjpNZXNzYWdlPE1vbnN0ZXI+PiogLyp3cml0ZXIqLykgeworICByZXR1cm4gOjpncnBjOjpTdGF0dXMoOjpncnBjOjpTdGF0dXNDb2RlOjpVTklNUExFTUVOVEVELCAiIik7Cit9CisKKzo6Z3JwYzo6U3RhdHVzIE1vbnN0ZXJTdG9yYWdlOjpTZXJ2aWNlOjpHZXRNYXhIaXRQb2ludCg6OmdycGM6OlNlcnZlckNvbnRleHQqIC8qY29udGV4dCovLCA6OmdycGM6OlNlcnZlclJlYWRlcjwgZmxhdGJ1ZmZlcnM6OmdycGM6Ok1lc3NhZ2U8TW9uc3Rlcj4+KiAvKnJlYWRlciovLCBmbGF0YnVmZmVyczo6Z3JwYzo6TWVzc2FnZTxTdGF0PiogLypyZXNwb25zZSovKSB7CisgIHJldHVybiA6OmdycGM6OlN0YXR1cyg6OmdycGM6OlN0YXR1c0NvZGU6OlVOSU1QTEVNRU5URUQsICIiKTsKK30KKworOjpncnBjOjpTdGF0dXMgTW9uc3RlclN0b3JhZ2U6OlNlcnZpY2U6OkdldE1pbk1heEhpdFBvaW50cyg6OmdycGM6OlNlcnZlckNvbnRleHQqIC8qY29udGV4dCovLCA6OmdycGM6OlNlcnZlclJlYWRlcldyaXRlcjwgZmxhdGJ1ZmZlcnM6OmdycGM6Ok1lc3NhZ2U8U3RhdD4sIGZsYXRidWZmZXJzOjpncnBjOjpNZXNzYWdlPE1vbnN0ZXI+PiogLypzdHJlYW0qLykgeworICByZXR1cm4gOjpncnBjOjpTdGF0dXMoOjpncnBjOjpTdGF0dXNDb2RlOjpVTklNUExFTUVOVEVELCAiIik7Cit9CisKKworfSAgLy8gbmFtZXNwYWNlIE15R2FtZQorfSAgLy8gbmFtZXNwYWNlIEV4YW1wbGUKKwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvbW9uc3Rlcl90ZXN0X3N1ZmZpeC9maWxlc3VmZml4X29ubHkvbW9uc3Rlcl90ZXN0LmdycGMuZmIuaCBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL21vbnN0ZXJfdGVzdF9zdWZmaXgvZmlsZXN1ZmZpeF9vbmx5L21vbnN0ZXJfdGVzdC5ncnBjLmZiLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYThmNGI5NQotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL21vbnN0ZXJfdGVzdF9zdWZmaXgvZmlsZXN1ZmZpeF9vbmx5L21vbnN0ZXJfdGVzdC5ncnBjLmZiLmgKQEAgLTAsMCArMSwzNTAgQEAKKy8vIEdlbmVyYXRlZCBieSB0aGUgZ1JQQyBDKysgcGx1Z2luLgorLy8gSWYgeW91IG1ha2UgYW55IGxvY2FsIGNoYW5nZSwgdGhleSB3aWxsIGJlIGxvc3QuCisvLyBzb3VyY2U6IG1vbnN0ZXJfdGVzdAorI2lmbmRlZiBHUlBDX21vbnN0ZXJfNWZ0ZXN0X19JTkNMVURFRAorI2RlZmluZSBHUlBDX21vbnN0ZXJfNWZ0ZXN0X19JTkNMVURFRAorCisjaW5jbHVkZSAibW9uc3Rlcl90ZXN0X3N1ZmZpeC5oIgorI2luY2x1ZGUgImZsYXRidWZmZXJzL2dycGMuaCIKKworI2luY2x1ZGUgPGdycGNwcC9pbXBsL2NvZGVnZW4vYXN5bmNfc3RyZWFtLmg+CisjaW5jbHVkZSA8Z3JwY3BwL2ltcGwvY29kZWdlbi9hc3luY191bmFyeV9jYWxsLmg+CisjaW5jbHVkZSA8Z3JwY3BwL2ltcGwvY29kZWdlbi9tZXRob2RfaGFuZGxlci5oPgorI2luY2x1ZGUgPGdycGNwcC9pbXBsL2NvZGVnZW4vcHJvdG9fdXRpbHMuaD4KKyNpbmNsdWRlIDxncnBjcHAvaW1wbC9jb2RlZ2VuL3JwY19tZXRob2QuaD4KKyNpbmNsdWRlIDxncnBjcHAvaW1wbC9jb2RlZ2VuL3NlcnZpY2VfdHlwZS5oPgorI2luY2x1ZGUgPGdycGNwcC9pbXBsL2NvZGVnZW4vc3RhdHVzLmg+CisjaW5jbHVkZSA8Z3JwY3BwL2ltcGwvY29kZWdlbi9zdHViX29wdGlvbnMuaD4KKyNpbmNsdWRlIDxncnBjcHAvaW1wbC9jb2RlZ2VuL3N5bmNfc3RyZWFtLmg+CisKK25hbWVzcGFjZSBncnBjIHsKK2NsYXNzIENvbXBsZXRpb25RdWV1ZTsKK2NsYXNzIENoYW5uZWw7CitjbGFzcyBTZXJ2ZXJDb21wbGV0aW9uUXVldWU7CitjbGFzcyBTZXJ2ZXJDb250ZXh0OworfSAgLy8gbmFtZXNwYWNlIGdycGMKKworbmFtZXNwYWNlIE15R2FtZSB7CituYW1lc3BhY2UgRXhhbXBsZSB7CisKK2NsYXNzIE1vbnN0ZXJTdG9yYWdlIGZpbmFsIHsKKyBwdWJsaWM6CisgIHN0YXRpYyBjb25zdGV4cHIgY2hhciBjb25zdCogc2VydmljZV9mdWxsX25hbWUoKSB7CisgICAgcmV0dXJuICJNeUdhbWUuRXhhbXBsZS5Nb25zdGVyU3RvcmFnZSI7CisgIH0KKyAgY2xhc3MgU3R1YkludGVyZmFjZSB7CisgICBwdWJsaWM6CisgICAgdmlydHVhbCB+U3R1YkludGVyZmFjZSgpIHt9CisgICAgdmlydHVhbCA6OmdycGM6OlN0YXR1cyBTdG9yZSg6OmdycGM6OkNsaWVudENvbnRleHQqIGNvbnRleHQsIGNvbnN0IGZsYXRidWZmZXJzOjpncnBjOjpNZXNzYWdlPE1vbnN0ZXI+JiByZXF1ZXN0LCBmbGF0YnVmZmVyczo6Z3JwYzo6TWVzc2FnZTxTdGF0PiogcmVzcG9uc2UpID0gMDsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8IDo6Z3JwYzo6Q2xpZW50QXN5bmNSZXNwb25zZVJlYWRlckludGVyZmFjZTwgZmxhdGJ1ZmZlcnM6OmdycGM6Ok1lc3NhZ2U8U3RhdD4+PiBBc3luY1N0b3JlKDo6Z3JwYzo6Q2xpZW50Q29udGV4dCogY29udGV4dCwgY29uc3QgZmxhdGJ1ZmZlcnM6OmdycGM6Ok1lc3NhZ2U8TW9uc3Rlcj4mIHJlcXVlc3QsIDo6Z3JwYzo6Q29tcGxldGlvblF1ZXVlKiBjcSkgeworICAgICAgcmV0dXJuIHN0ZDo6dW5pcXVlX3B0cjwgOjpncnBjOjpDbGllbnRBc3luY1Jlc3BvbnNlUmVhZGVySW50ZXJmYWNlPCBmbGF0YnVmZmVyczo6Z3JwYzo6TWVzc2FnZTxTdGF0Pj4+KEFzeW5jU3RvcmVSYXcoY29udGV4dCwgcmVxdWVzdCwgY3EpKTsKKyAgICB9CisgICAgc3RkOjp1bmlxdWVfcHRyPCA6OmdycGM6OkNsaWVudEFzeW5jUmVzcG9uc2VSZWFkZXJJbnRlcmZhY2U8IGZsYXRidWZmZXJzOjpncnBjOjpNZXNzYWdlPFN0YXQ+Pj4gUHJlcGFyZUFzeW5jU3RvcmUoOjpncnBjOjpDbGllbnRDb250ZXh0KiBjb250ZXh0LCBjb25zdCBmbGF0YnVmZmVyczo6Z3JwYzo6TWVzc2FnZTxNb25zdGVyPiYgcmVxdWVzdCwgOjpncnBjOjpDb21wbGV0aW9uUXVldWUqIGNxKSB7CisgICAgICByZXR1cm4gc3RkOjp1bmlxdWVfcHRyPCA6OmdycGM6OkNsaWVudEFzeW5jUmVzcG9uc2VSZWFkZXJJbnRlcmZhY2U8IGZsYXRidWZmZXJzOjpncnBjOjpNZXNzYWdlPFN0YXQ+Pj4oUHJlcGFyZUFzeW5jU3RvcmVSYXcoY29udGV4dCwgcmVxdWVzdCwgY3EpKTsKKyAgICB9CisgICAgc3RkOjp1bmlxdWVfcHRyPCA6OmdycGM6OkNsaWVudFJlYWRlckludGVyZmFjZTwgZmxhdGJ1ZmZlcnM6OmdycGM6Ok1lc3NhZ2U8TW9uc3Rlcj4+PiBSZXRyaWV2ZSg6OmdycGM6OkNsaWVudENvbnRleHQqIGNvbnRleHQsIGNvbnN0IGZsYXRidWZmZXJzOjpncnBjOjpNZXNzYWdlPFN0YXQ+JiByZXF1ZXN0KSB7CisgICAgICByZXR1cm4gc3RkOjp1bmlxdWVfcHRyPCA6OmdycGM6OkNsaWVudFJlYWRlckludGVyZmFjZTwgZmxhdGJ1ZmZlcnM6OmdycGM6Ok1lc3NhZ2U8TW9uc3Rlcj4+PihSZXRyaWV2ZVJhdyhjb250ZXh0LCByZXF1ZXN0KSk7CisgICAgfQorICAgIHN0ZDo6dW5pcXVlX3B0cjwgOjpncnBjOjpDbGllbnRBc3luY1JlYWRlckludGVyZmFjZTwgZmxhdGJ1ZmZlcnM6OmdycGM6Ok1lc3NhZ2U8TW9uc3Rlcj4+PiBBc3luY1JldHJpZXZlKDo6Z3JwYzo6Q2xpZW50Q29udGV4dCogY29udGV4dCwgY29uc3QgZmxhdGJ1ZmZlcnM6OmdycGM6Ok1lc3NhZ2U8U3RhdD4mIHJlcXVlc3QsIDo6Z3JwYzo6Q29tcGxldGlvblF1ZXVlKiBjcSwgdm9pZCogdGFnKSB7CisgICAgICByZXR1cm4gc3RkOjp1bmlxdWVfcHRyPCA6OmdycGM6OkNsaWVudEFzeW5jUmVhZGVySW50ZXJmYWNlPCBmbGF0YnVmZmVyczo6Z3JwYzo6TWVzc2FnZTxNb25zdGVyPj4+KEFzeW5jUmV0cmlldmVSYXcoY29udGV4dCwgcmVxdWVzdCwgY3EsIHRhZykpOworICAgIH0KKyAgICBzdGQ6OnVuaXF1ZV9wdHI8IDo6Z3JwYzo6Q2xpZW50QXN5bmNSZWFkZXJJbnRlcmZhY2U8IGZsYXRidWZmZXJzOjpncnBjOjpNZXNzYWdlPE1vbnN0ZXI+Pj4gUHJlcGFyZUFzeW5jUmV0cmlldmUoOjpncnBjOjpDbGllbnRDb250ZXh0KiBjb250ZXh0LCBjb25zdCBmbGF0YnVmZmVyczo6Z3JwYzo6TWVzc2FnZTxTdGF0PiYgcmVxdWVzdCwgOjpncnBjOjpDb21wbGV0aW9uUXVldWUqIGNxKSB7CisgICAgICByZXR1cm4gc3RkOjp1bmlxdWVfcHRyPCA6OmdycGM6OkNsaWVudEFzeW5jUmVhZGVySW50ZXJmYWNlPCBmbGF0YnVmZmVyczo6Z3JwYzo6TWVzc2FnZTxNb25zdGVyPj4+KFByZXBhcmVBc3luY1JldHJpZXZlUmF3KGNvbnRleHQsIHJlcXVlc3QsIGNxKSk7CisgICAgfQorICAgIHN0ZDo6dW5pcXVlX3B0cjwgOjpncnBjOjpDbGllbnRXcml0ZXJJbnRlcmZhY2U8IGZsYXRidWZmZXJzOjpncnBjOjpNZXNzYWdlPE1vbnN0ZXI+Pj4gR2V0TWF4SGl0UG9pbnQoOjpncnBjOjpDbGllbnRDb250ZXh0KiBjb250ZXh0LCBmbGF0YnVmZmVyczo6Z3JwYzo6TWVzc2FnZTxTdGF0PiogcmVzcG9uc2UpIHsKKyAgICAgIHJldHVybiBzdGQ6OnVuaXF1ZV9wdHI8IDo6Z3JwYzo6Q2xpZW50V3JpdGVySW50ZXJmYWNlPCBmbGF0YnVmZmVyczo6Z3JwYzo6TWVzc2FnZTxNb25zdGVyPj4+KEdldE1heEhpdFBvaW50UmF3KGNvbnRleHQsIHJlc3BvbnNlKSk7CisgICAgfQorICAgIHN0ZDo6dW5pcXVlX3B0cjwgOjpncnBjOjpDbGllbnRBc3luY1dyaXRlckludGVyZmFjZTwgZmxhdGJ1ZmZlcnM6OmdycGM6Ok1lc3NhZ2U8TW9uc3Rlcj4+PiBBc3luY0dldE1heEhpdFBvaW50KDo6Z3JwYzo6Q2xpZW50Q29udGV4dCogY29udGV4dCwgZmxhdGJ1ZmZlcnM6OmdycGM6Ok1lc3NhZ2U8U3RhdD4qIHJlc3BvbnNlLCA6OmdycGM6OkNvbXBsZXRpb25RdWV1ZSogY3EsIHZvaWQqIHRhZykgeworICAgICAgcmV0dXJuIHN0ZDo6dW5pcXVlX3B0cjwgOjpncnBjOjpDbGllbnRBc3luY1dyaXRlckludGVyZmFjZTwgZmxhdGJ1ZmZlcnM6OmdycGM6Ok1lc3NhZ2U8TW9uc3Rlcj4+PihBc3luY0dldE1heEhpdFBvaW50UmF3KGNvbnRleHQsIHJlc3BvbnNlLCBjcSwgdGFnKSk7CisgICAgfQorICAgIHN0ZDo6dW5pcXVlX3B0cjwgOjpncnBjOjpDbGllbnRBc3luY1dyaXRlckludGVyZmFjZTwgZmxhdGJ1ZmZlcnM6OmdycGM6Ok1lc3NhZ2U8TW9uc3Rlcj4+PiBQcmVwYXJlQXN5bmNHZXRNYXhIaXRQb2ludCg6OmdycGM6OkNsaWVudENvbnRleHQqIGNvbnRleHQsIGZsYXRidWZmZXJzOjpncnBjOjpNZXNzYWdlPFN0YXQ+KiByZXNwb25zZSwgOjpncnBjOjpDb21wbGV0aW9uUXVldWUqIGNxKSB7CisgICAgICByZXR1cm4gc3RkOjp1bmlxdWVfcHRyPCA6OmdycGM6OkNsaWVudEFzeW5jV3JpdGVySW50ZXJmYWNlPCBmbGF0YnVmZmVyczo6Z3JwYzo6TWVzc2FnZTxNb25zdGVyPj4+KFByZXBhcmVBc3luY0dldE1heEhpdFBvaW50UmF3KGNvbnRleHQsIHJlc3BvbnNlLCBjcSkpOworICAgIH0KKyAgICBzdGQ6OnVuaXF1ZV9wdHI8IDo6Z3JwYzo6Q2xpZW50UmVhZGVyV3JpdGVySW50ZXJmYWNlPCBmbGF0YnVmZmVyczo6Z3JwYzo6TWVzc2FnZTxNb25zdGVyPiwgZmxhdGJ1ZmZlcnM6OmdycGM6Ok1lc3NhZ2U8U3RhdD4+PiBHZXRNaW5NYXhIaXRQb2ludHMoOjpncnBjOjpDbGllbnRDb250ZXh0KiBjb250ZXh0KSB7CisgICAgICByZXR1cm4gc3RkOjp1bmlxdWVfcHRyPCA6OmdycGM6OkNsaWVudFJlYWRlcldyaXRlckludGVyZmFjZTwgZmxhdGJ1ZmZlcnM6OmdycGM6Ok1lc3NhZ2U8TW9uc3Rlcj4sIGZsYXRidWZmZXJzOjpncnBjOjpNZXNzYWdlPFN0YXQ+Pj4oR2V0TWluTWF4SGl0UG9pbnRzUmF3KGNvbnRleHQpKTsKKyAgICB9CisgICAgc3RkOjp1bmlxdWVfcHRyPCA6OmdycGM6OkNsaWVudEFzeW5jUmVhZGVyV3JpdGVySW50ZXJmYWNlPCBmbGF0YnVmZmVyczo6Z3JwYzo6TWVzc2FnZTxNb25zdGVyPiwgZmxhdGJ1ZmZlcnM6OmdycGM6Ok1lc3NhZ2U8U3RhdD4+PiBBc3luY0dldE1pbk1heEhpdFBvaW50cyg6OmdycGM6OkNsaWVudENvbnRleHQqIGNvbnRleHQsIDo6Z3JwYzo6Q29tcGxldGlvblF1ZXVlKiBjcSwgdm9pZCogdGFnKSB7CisgICAgICByZXR1cm4gc3RkOjp1bmlxdWVfcHRyPCA6OmdycGM6OkNsaWVudEFzeW5jUmVhZGVyV3JpdGVySW50ZXJmYWNlPCBmbGF0YnVmZmVyczo6Z3JwYzo6TWVzc2FnZTxNb25zdGVyPiwgZmxhdGJ1ZmZlcnM6OmdycGM6Ok1lc3NhZ2U8U3RhdD4+PihBc3luY0dldE1pbk1heEhpdFBvaW50c1Jhdyhjb250ZXh0LCBjcSwgdGFnKSk7CisgICAgfQorICAgIHN0ZDo6dW5pcXVlX3B0cjwgOjpncnBjOjpDbGllbnRBc3luY1JlYWRlcldyaXRlckludGVyZmFjZTwgZmxhdGJ1ZmZlcnM6OmdycGM6Ok1lc3NhZ2U8TW9uc3Rlcj4sIGZsYXRidWZmZXJzOjpncnBjOjpNZXNzYWdlPFN0YXQ+Pj4gUHJlcGFyZUFzeW5jR2V0TWluTWF4SGl0UG9pbnRzKDo6Z3JwYzo6Q2xpZW50Q29udGV4dCogY29udGV4dCwgOjpncnBjOjpDb21wbGV0aW9uUXVldWUqIGNxKSB7CisgICAgICByZXR1cm4gc3RkOjp1bmlxdWVfcHRyPCA6OmdycGM6OkNsaWVudEFzeW5jUmVhZGVyV3JpdGVySW50ZXJmYWNlPCBmbGF0YnVmZmVyczo6Z3JwYzo6TWVzc2FnZTxNb25zdGVyPiwgZmxhdGJ1ZmZlcnM6OmdycGM6Ok1lc3NhZ2U8U3RhdD4+PihQcmVwYXJlQXN5bmNHZXRNaW5NYXhIaXRQb2ludHNSYXcoY29udGV4dCwgY3EpKTsKKyAgICB9CisgIHByaXZhdGU6CisgICAgdmlydHVhbCA6OmdycGM6OkNsaWVudEFzeW5jUmVzcG9uc2VSZWFkZXJJbnRlcmZhY2U8IGZsYXRidWZmZXJzOjpncnBjOjpNZXNzYWdlPFN0YXQ+PiogQXN5bmNTdG9yZVJhdyg6OmdycGM6OkNsaWVudENvbnRleHQqIGNvbnRleHQsIGNvbnN0IGZsYXRidWZmZXJzOjpncnBjOjpNZXNzYWdlPE1vbnN0ZXI+JiByZXF1ZXN0LCA6OmdycGM6OkNvbXBsZXRpb25RdWV1ZSogY3EpID0gMDsKKyAgICB2aXJ0dWFsIDo6Z3JwYzo6Q2xpZW50QXN5bmNSZXNwb25zZVJlYWRlckludGVyZmFjZTwgZmxhdGJ1ZmZlcnM6OmdycGM6Ok1lc3NhZ2U8U3RhdD4+KiBQcmVwYXJlQXN5bmNTdG9yZVJhdyg6OmdycGM6OkNsaWVudENvbnRleHQqIGNvbnRleHQsIGNvbnN0IGZsYXRidWZmZXJzOjpncnBjOjpNZXNzYWdlPE1vbnN0ZXI+JiByZXF1ZXN0LCA6OmdycGM6OkNvbXBsZXRpb25RdWV1ZSogY3EpID0gMDsKKyAgICB2aXJ0dWFsIDo6Z3JwYzo6Q2xpZW50UmVhZGVySW50ZXJmYWNlPCBmbGF0YnVmZmVyczo6Z3JwYzo6TWVzc2FnZTxNb25zdGVyPj4qIFJldHJpZXZlUmF3KDo6Z3JwYzo6Q2xpZW50Q29udGV4dCogY29udGV4dCwgY29uc3QgZmxhdGJ1ZmZlcnM6OmdycGM6Ok1lc3NhZ2U8U3RhdD4mIHJlcXVlc3QpID0gMDsKKyAgICB2aXJ0dWFsIDo6Z3JwYzo6Q2xpZW50QXN5bmNSZWFkZXJJbnRlcmZhY2U8IGZsYXRidWZmZXJzOjpncnBjOjpNZXNzYWdlPE1vbnN0ZXI+PiogQXN5bmNSZXRyaWV2ZVJhdyg6OmdycGM6OkNsaWVudENvbnRleHQqIGNvbnRleHQsIGNvbnN0IGZsYXRidWZmZXJzOjpncnBjOjpNZXNzYWdlPFN0YXQ+JiByZXF1ZXN0LCA6OmdycGM6OkNvbXBsZXRpb25RdWV1ZSogY3EsIHZvaWQqIHRhZykgPSAwOworICAgIHZpcnR1YWwgOjpncnBjOjpDbGllbnRBc3luY1JlYWRlckludGVyZmFjZTwgZmxhdGJ1ZmZlcnM6OmdycGM6Ok1lc3NhZ2U8TW9uc3Rlcj4+KiBQcmVwYXJlQXN5bmNSZXRyaWV2ZVJhdyg6OmdycGM6OkNsaWVudENvbnRleHQqIGNvbnRleHQsIGNvbnN0IGZsYXRidWZmZXJzOjpncnBjOjpNZXNzYWdlPFN0YXQ+JiByZXF1ZXN0LCA6OmdycGM6OkNvbXBsZXRpb25RdWV1ZSogY3EpID0gMDsKKyAgICB2aXJ0dWFsIDo6Z3JwYzo6Q2xpZW50V3JpdGVySW50ZXJmYWNlPCBmbGF0YnVmZmVyczo6Z3JwYzo6TWVzc2FnZTxNb25zdGVyPj4qIEdldE1heEhpdFBvaW50UmF3KDo6Z3JwYzo6Q2xpZW50Q29udGV4dCogY29udGV4dCwgZmxhdGJ1ZmZlcnM6OmdycGM6Ok1lc3NhZ2U8U3RhdD4qIHJlc3BvbnNlKSA9IDA7CisgICAgdmlydHVhbCA6OmdycGM6OkNsaWVudEFzeW5jV3JpdGVySW50ZXJmYWNlPCBmbGF0YnVmZmVyczo6Z3JwYzo6TWVzc2FnZTxNb25zdGVyPj4qIEFzeW5jR2V0TWF4SGl0UG9pbnRSYXcoOjpncnBjOjpDbGllbnRDb250ZXh0KiBjb250ZXh0LCBmbGF0YnVmZmVyczo6Z3JwYzo6TWVzc2FnZTxTdGF0PiogcmVzcG9uc2UsIDo6Z3JwYzo6Q29tcGxldGlvblF1ZXVlKiBjcSwgdm9pZCogdGFnKSA9IDA7CisgICAgdmlydHVhbCA6OmdycGM6OkNsaWVudEFzeW5jV3JpdGVySW50ZXJmYWNlPCBmbGF0YnVmZmVyczo6Z3JwYzo6TWVzc2FnZTxNb25zdGVyPj4qIFByZXBhcmVBc3luY0dldE1heEhpdFBvaW50UmF3KDo6Z3JwYzo6Q2xpZW50Q29udGV4dCogY29udGV4dCwgZmxhdGJ1ZmZlcnM6OmdycGM6Ok1lc3NhZ2U8U3RhdD4qIHJlc3BvbnNlLCA6OmdycGM6OkNvbXBsZXRpb25RdWV1ZSogY3EpID0gMDsKKyAgICB2aXJ0dWFsIDo6Z3JwYzo6Q2xpZW50UmVhZGVyV3JpdGVySW50ZXJmYWNlPCBmbGF0YnVmZmVyczo6Z3JwYzo6TWVzc2FnZTxNb25zdGVyPiwgZmxhdGJ1ZmZlcnM6OmdycGM6Ok1lc3NhZ2U8U3RhdD4+KiBHZXRNaW5NYXhIaXRQb2ludHNSYXcoOjpncnBjOjpDbGllbnRDb250ZXh0KiBjb250ZXh0KSA9IDA7CisgICAgdmlydHVhbCA6OmdycGM6OkNsaWVudEFzeW5jUmVhZGVyV3JpdGVySW50ZXJmYWNlPCBmbGF0YnVmZmVyczo6Z3JwYzo6TWVzc2FnZTxNb25zdGVyPiwgZmxhdGJ1ZmZlcnM6OmdycGM6Ok1lc3NhZ2U8U3RhdD4+KiBBc3luY0dldE1pbk1heEhpdFBvaW50c1Jhdyg6OmdycGM6OkNsaWVudENvbnRleHQqIGNvbnRleHQsIDo6Z3JwYzo6Q29tcGxldGlvblF1ZXVlKiBjcSwgdm9pZCogdGFnKSA9IDA7CisgICAgdmlydHVhbCA6OmdycGM6OkNsaWVudEFzeW5jUmVhZGVyV3JpdGVySW50ZXJmYWNlPCBmbGF0YnVmZmVyczo6Z3JwYzo6TWVzc2FnZTxNb25zdGVyPiwgZmxhdGJ1ZmZlcnM6OmdycGM6Ok1lc3NhZ2U8U3RhdD4+KiBQcmVwYXJlQXN5bmNHZXRNaW5NYXhIaXRQb2ludHNSYXcoOjpncnBjOjpDbGllbnRDb250ZXh0KiBjb250ZXh0LCA6OmdycGM6OkNvbXBsZXRpb25RdWV1ZSogY3EpID0gMDsKKyAgfTsKKyAgY2xhc3MgU3R1YiBmaW5hbCA6IHB1YmxpYyBTdHViSW50ZXJmYWNlIHsKKyAgIHB1YmxpYzoKKyAgICBTdHViKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjwgOjpncnBjOjpDaGFubmVsSW50ZXJmYWNlPiYgY2hhbm5lbCk7CisgICAgOjpncnBjOjpTdGF0dXMgU3RvcmUoOjpncnBjOjpDbGllbnRDb250ZXh0KiBjb250ZXh0LCBjb25zdCBmbGF0YnVmZmVyczo6Z3JwYzo6TWVzc2FnZTxNb25zdGVyPiYgcmVxdWVzdCwgZmxhdGJ1ZmZlcnM6OmdycGM6Ok1lc3NhZ2U8U3RhdD4qIHJlc3BvbnNlKSBvdmVycmlkZTsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8IDo6Z3JwYzo6Q2xpZW50QXN5bmNSZXNwb25zZVJlYWRlcjwgZmxhdGJ1ZmZlcnM6OmdycGM6Ok1lc3NhZ2U8U3RhdD4+PiBBc3luY1N0b3JlKDo6Z3JwYzo6Q2xpZW50Q29udGV4dCogY29udGV4dCwgY29uc3QgZmxhdGJ1ZmZlcnM6OmdycGM6Ok1lc3NhZ2U8TW9uc3Rlcj4mIHJlcXVlc3QsIDo6Z3JwYzo6Q29tcGxldGlvblF1ZXVlKiBjcSkgeworICAgICAgcmV0dXJuIHN0ZDo6dW5pcXVlX3B0cjwgOjpncnBjOjpDbGllbnRBc3luY1Jlc3BvbnNlUmVhZGVyPCBmbGF0YnVmZmVyczo6Z3JwYzo6TWVzc2FnZTxTdGF0Pj4+KEFzeW5jU3RvcmVSYXcoY29udGV4dCwgcmVxdWVzdCwgY3EpKTsKKyAgICB9CisgICAgc3RkOjp1bmlxdWVfcHRyPCA6OmdycGM6OkNsaWVudEFzeW5jUmVzcG9uc2VSZWFkZXI8IGZsYXRidWZmZXJzOjpncnBjOjpNZXNzYWdlPFN0YXQ+Pj4gUHJlcGFyZUFzeW5jU3RvcmUoOjpncnBjOjpDbGllbnRDb250ZXh0KiBjb250ZXh0LCBjb25zdCBmbGF0YnVmZmVyczo6Z3JwYzo6TWVzc2FnZTxNb25zdGVyPiYgcmVxdWVzdCwgOjpncnBjOjpDb21wbGV0aW9uUXVldWUqIGNxKSB7CisgICAgICByZXR1cm4gc3RkOjp1bmlxdWVfcHRyPCA6OmdycGM6OkNsaWVudEFzeW5jUmVzcG9uc2VSZWFkZXI8IGZsYXRidWZmZXJzOjpncnBjOjpNZXNzYWdlPFN0YXQ+Pj4oUHJlcGFyZUFzeW5jU3RvcmVSYXcoY29udGV4dCwgcmVxdWVzdCwgY3EpKTsKKyAgICB9CisgICAgc3RkOjp1bmlxdWVfcHRyPCA6OmdycGM6OkNsaWVudFJlYWRlcjwgZmxhdGJ1ZmZlcnM6OmdycGM6Ok1lc3NhZ2U8TW9uc3Rlcj4+PiBSZXRyaWV2ZSg6OmdycGM6OkNsaWVudENvbnRleHQqIGNvbnRleHQsIGNvbnN0IGZsYXRidWZmZXJzOjpncnBjOjpNZXNzYWdlPFN0YXQ+JiByZXF1ZXN0KSB7CisgICAgICByZXR1cm4gc3RkOjp1bmlxdWVfcHRyPCA6OmdycGM6OkNsaWVudFJlYWRlcjwgZmxhdGJ1ZmZlcnM6OmdycGM6Ok1lc3NhZ2U8TW9uc3Rlcj4+PihSZXRyaWV2ZVJhdyhjb250ZXh0LCByZXF1ZXN0KSk7CisgICAgfQorICAgIHN0ZDo6dW5pcXVlX3B0cjwgOjpncnBjOjpDbGllbnRBc3luY1JlYWRlcjwgZmxhdGJ1ZmZlcnM6OmdycGM6Ok1lc3NhZ2U8TW9uc3Rlcj4+PiBBc3luY1JldHJpZXZlKDo6Z3JwYzo6Q2xpZW50Q29udGV4dCogY29udGV4dCwgY29uc3QgZmxhdGJ1ZmZlcnM6OmdycGM6Ok1lc3NhZ2U8U3RhdD4mIHJlcXVlc3QsIDo6Z3JwYzo6Q29tcGxldGlvblF1ZXVlKiBjcSwgdm9pZCogdGFnKSB7CisgICAgICByZXR1cm4gc3RkOjp1bmlxdWVfcHRyPCA6OmdycGM6OkNsaWVudEFzeW5jUmVhZGVyPCBmbGF0YnVmZmVyczo6Z3JwYzo6TWVzc2FnZTxNb25zdGVyPj4+KEFzeW5jUmV0cmlldmVSYXcoY29udGV4dCwgcmVxdWVzdCwgY3EsIHRhZykpOworICAgIH0KKyAgICBzdGQ6OnVuaXF1ZV9wdHI8IDo6Z3JwYzo6Q2xpZW50QXN5bmNSZWFkZXI8IGZsYXRidWZmZXJzOjpncnBjOjpNZXNzYWdlPE1vbnN0ZXI+Pj4gUHJlcGFyZUFzeW5jUmV0cmlldmUoOjpncnBjOjpDbGllbnRDb250ZXh0KiBjb250ZXh0LCBjb25zdCBmbGF0YnVmZmVyczo6Z3JwYzo6TWVzc2FnZTxTdGF0PiYgcmVxdWVzdCwgOjpncnBjOjpDb21wbGV0aW9uUXVldWUqIGNxKSB7CisgICAgICByZXR1cm4gc3RkOjp1bmlxdWVfcHRyPCA6OmdycGM6OkNsaWVudEFzeW5jUmVhZGVyPCBmbGF0YnVmZmVyczo6Z3JwYzo6TWVzc2FnZTxNb25zdGVyPj4+KFByZXBhcmVBc3luY1JldHJpZXZlUmF3KGNvbnRleHQsIHJlcXVlc3QsIGNxKSk7CisgICAgfQorICAgIHN0ZDo6dW5pcXVlX3B0cjwgOjpncnBjOjpDbGllbnRXcml0ZXI8IGZsYXRidWZmZXJzOjpncnBjOjpNZXNzYWdlPE1vbnN0ZXI+Pj4gR2V0TWF4SGl0UG9pbnQoOjpncnBjOjpDbGllbnRDb250ZXh0KiBjb250ZXh0LCBmbGF0YnVmZmVyczo6Z3JwYzo6TWVzc2FnZTxTdGF0PiogcmVzcG9uc2UpIHsKKyAgICAgIHJldHVybiBzdGQ6OnVuaXF1ZV9wdHI8IDo6Z3JwYzo6Q2xpZW50V3JpdGVyPCBmbGF0YnVmZmVyczo6Z3JwYzo6TWVzc2FnZTxNb25zdGVyPj4+KEdldE1heEhpdFBvaW50UmF3KGNvbnRleHQsIHJlc3BvbnNlKSk7CisgICAgfQorICAgIHN0ZDo6dW5pcXVlX3B0cjwgOjpncnBjOjpDbGllbnRBc3luY1dyaXRlcjwgZmxhdGJ1ZmZlcnM6OmdycGM6Ok1lc3NhZ2U8TW9uc3Rlcj4+PiBBc3luY0dldE1heEhpdFBvaW50KDo6Z3JwYzo6Q2xpZW50Q29udGV4dCogY29udGV4dCwgZmxhdGJ1ZmZlcnM6OmdycGM6Ok1lc3NhZ2U8U3RhdD4qIHJlc3BvbnNlLCA6OmdycGM6OkNvbXBsZXRpb25RdWV1ZSogY3EsIHZvaWQqIHRhZykgeworICAgICAgcmV0dXJuIHN0ZDo6dW5pcXVlX3B0cjwgOjpncnBjOjpDbGllbnRBc3luY1dyaXRlcjwgZmxhdGJ1ZmZlcnM6OmdycGM6Ok1lc3NhZ2U8TW9uc3Rlcj4+PihBc3luY0dldE1heEhpdFBvaW50UmF3KGNvbnRleHQsIHJlc3BvbnNlLCBjcSwgdGFnKSk7CisgICAgfQorICAgIHN0ZDo6dW5pcXVlX3B0cjwgOjpncnBjOjpDbGllbnRBc3luY1dyaXRlcjwgZmxhdGJ1ZmZlcnM6OmdycGM6Ok1lc3NhZ2U8TW9uc3Rlcj4+PiBQcmVwYXJlQXN5bmNHZXRNYXhIaXRQb2ludCg6OmdycGM6OkNsaWVudENvbnRleHQqIGNvbnRleHQsIGZsYXRidWZmZXJzOjpncnBjOjpNZXNzYWdlPFN0YXQ+KiByZXNwb25zZSwgOjpncnBjOjpDb21wbGV0aW9uUXVldWUqIGNxKSB7CisgICAgICByZXR1cm4gc3RkOjp1bmlxdWVfcHRyPCA6OmdycGM6OkNsaWVudEFzeW5jV3JpdGVyPCBmbGF0YnVmZmVyczo6Z3JwYzo6TWVzc2FnZTxNb25zdGVyPj4+KFByZXBhcmVBc3luY0dldE1heEhpdFBvaW50UmF3KGNvbnRleHQsIHJlc3BvbnNlLCBjcSkpOworICAgIH0KKyAgICBzdGQ6OnVuaXF1ZV9wdHI8IDo6Z3JwYzo6Q2xpZW50UmVhZGVyV3JpdGVyPCBmbGF0YnVmZmVyczo6Z3JwYzo6TWVzc2FnZTxNb25zdGVyPiwgZmxhdGJ1ZmZlcnM6OmdycGM6Ok1lc3NhZ2U8U3RhdD4+PiBHZXRNaW5NYXhIaXRQb2ludHMoOjpncnBjOjpDbGllbnRDb250ZXh0KiBjb250ZXh0KSB7CisgICAgICByZXR1cm4gc3RkOjp1bmlxdWVfcHRyPCA6OmdycGM6OkNsaWVudFJlYWRlcldyaXRlcjwgZmxhdGJ1ZmZlcnM6OmdycGM6Ok1lc3NhZ2U8TW9uc3Rlcj4sIGZsYXRidWZmZXJzOjpncnBjOjpNZXNzYWdlPFN0YXQ+Pj4oR2V0TWluTWF4SGl0UG9pbnRzUmF3KGNvbnRleHQpKTsKKyAgICB9CisgICAgc3RkOjp1bmlxdWVfcHRyPCAgOjpncnBjOjpDbGllbnRBc3luY1JlYWRlcldyaXRlcjwgZmxhdGJ1ZmZlcnM6OmdycGM6Ok1lc3NhZ2U8TW9uc3Rlcj4sIGZsYXRidWZmZXJzOjpncnBjOjpNZXNzYWdlPFN0YXQ+Pj4gQXN5bmNHZXRNaW5NYXhIaXRQb2ludHMoOjpncnBjOjpDbGllbnRDb250ZXh0KiBjb250ZXh0LCA6OmdycGM6OkNvbXBsZXRpb25RdWV1ZSogY3EsIHZvaWQqIHRhZykgeworICAgICAgcmV0dXJuIHN0ZDo6dW5pcXVlX3B0cjwgOjpncnBjOjpDbGllbnRBc3luY1JlYWRlcldyaXRlcjwgZmxhdGJ1ZmZlcnM6OmdycGM6Ok1lc3NhZ2U8TW9uc3Rlcj4sIGZsYXRidWZmZXJzOjpncnBjOjpNZXNzYWdlPFN0YXQ+Pj4oQXN5bmNHZXRNaW5NYXhIaXRQb2ludHNSYXcoY29udGV4dCwgY3EsIHRhZykpOworICAgIH0KKyAgICBzdGQ6OnVuaXF1ZV9wdHI8ICA6OmdycGM6OkNsaWVudEFzeW5jUmVhZGVyV3JpdGVyPCBmbGF0YnVmZmVyczo6Z3JwYzo6TWVzc2FnZTxNb25zdGVyPiwgZmxhdGJ1ZmZlcnM6OmdycGM6Ok1lc3NhZ2U8U3RhdD4+PiBQcmVwYXJlQXN5bmNHZXRNaW5NYXhIaXRQb2ludHMoOjpncnBjOjpDbGllbnRDb250ZXh0KiBjb250ZXh0LCA6OmdycGM6OkNvbXBsZXRpb25RdWV1ZSogY3EpIHsKKyAgICAgIHJldHVybiBzdGQ6OnVuaXF1ZV9wdHI8IDo6Z3JwYzo6Q2xpZW50QXN5bmNSZWFkZXJXcml0ZXI8IGZsYXRidWZmZXJzOjpncnBjOjpNZXNzYWdlPE1vbnN0ZXI+LCBmbGF0YnVmZmVyczo6Z3JwYzo6TWVzc2FnZTxTdGF0Pj4+KFByZXBhcmVBc3luY0dldE1pbk1heEhpdFBvaW50c1Jhdyhjb250ZXh0LCBjcSkpOworICAgIH0KKyAgCisgICBwcml2YXRlOgorICAgIHN0ZDo6c2hhcmVkX3B0cjwgOjpncnBjOjpDaGFubmVsSW50ZXJmYWNlPiBjaGFubmVsXzsKKyAgICA6OmdycGM6OkNsaWVudEFzeW5jUmVzcG9uc2VSZWFkZXI8IGZsYXRidWZmZXJzOjpncnBjOjpNZXNzYWdlPFN0YXQ+PiogQXN5bmNTdG9yZVJhdyg6OmdycGM6OkNsaWVudENvbnRleHQqIGNvbnRleHQsIGNvbnN0IGZsYXRidWZmZXJzOjpncnBjOjpNZXNzYWdlPE1vbnN0ZXI+JiByZXF1ZXN0LCA6OmdycGM6OkNvbXBsZXRpb25RdWV1ZSogY3EpIG92ZXJyaWRlOworICAgIDo6Z3JwYzo6Q2xpZW50QXN5bmNSZXNwb25zZVJlYWRlcjwgZmxhdGJ1ZmZlcnM6OmdycGM6Ok1lc3NhZ2U8U3RhdD4+KiBQcmVwYXJlQXN5bmNTdG9yZVJhdyg6OmdycGM6OkNsaWVudENvbnRleHQqIGNvbnRleHQsIGNvbnN0IGZsYXRidWZmZXJzOjpncnBjOjpNZXNzYWdlPE1vbnN0ZXI+JiByZXF1ZXN0LCA6OmdycGM6OkNvbXBsZXRpb25RdWV1ZSogY3EpIG92ZXJyaWRlOworICAgIDo6Z3JwYzo6Q2xpZW50UmVhZGVyPCBmbGF0YnVmZmVyczo6Z3JwYzo6TWVzc2FnZTxNb25zdGVyPj4qIFJldHJpZXZlUmF3KDo6Z3JwYzo6Q2xpZW50Q29udGV4dCogY29udGV4dCwgY29uc3QgZmxhdGJ1ZmZlcnM6OmdycGM6Ok1lc3NhZ2U8U3RhdD4mIHJlcXVlc3QpIG92ZXJyaWRlOworICAgIDo6Z3JwYzo6Q2xpZW50QXN5bmNSZWFkZXI8IGZsYXRidWZmZXJzOjpncnBjOjpNZXNzYWdlPE1vbnN0ZXI+PiogQXN5bmNSZXRyaWV2ZVJhdyg6OmdycGM6OkNsaWVudENvbnRleHQqIGNvbnRleHQsIGNvbnN0IGZsYXRidWZmZXJzOjpncnBjOjpNZXNzYWdlPFN0YXQ+JiByZXF1ZXN0LCA6OmdycGM6OkNvbXBsZXRpb25RdWV1ZSogY3EsIHZvaWQqIHRhZykgb3ZlcnJpZGU7CisgICAgOjpncnBjOjpDbGllbnRBc3luY1JlYWRlcjwgZmxhdGJ1ZmZlcnM6OmdycGM6Ok1lc3NhZ2U8TW9uc3Rlcj4+KiBQcmVwYXJlQXN5bmNSZXRyaWV2ZVJhdyg6OmdycGM6OkNsaWVudENvbnRleHQqIGNvbnRleHQsIGNvbnN0IGZsYXRidWZmZXJzOjpncnBjOjpNZXNzYWdlPFN0YXQ+JiByZXF1ZXN0LCA6OmdycGM6OkNvbXBsZXRpb25RdWV1ZSogY3EpIG92ZXJyaWRlOworICAgIDo6Z3JwYzo6Q2xpZW50V3JpdGVyPCBmbGF0YnVmZmVyczo6Z3JwYzo6TWVzc2FnZTxNb25zdGVyPj4qIEdldE1heEhpdFBvaW50UmF3KDo6Z3JwYzo6Q2xpZW50Q29udGV4dCogY29udGV4dCwgZmxhdGJ1ZmZlcnM6OmdycGM6Ok1lc3NhZ2U8U3RhdD4qIHJlc3BvbnNlKSBvdmVycmlkZTsKKyAgICA6OmdycGM6OkNsaWVudEFzeW5jV3JpdGVyPCBmbGF0YnVmZmVyczo6Z3JwYzo6TWVzc2FnZTxNb25zdGVyPj4qIEFzeW5jR2V0TWF4SGl0UG9pbnRSYXcoOjpncnBjOjpDbGllbnRDb250ZXh0KiBjb250ZXh0LCBmbGF0YnVmZmVyczo6Z3JwYzo6TWVzc2FnZTxTdGF0PiogcmVzcG9uc2UsIDo6Z3JwYzo6Q29tcGxldGlvblF1ZXVlKiBjcSwgdm9pZCogdGFnKSBvdmVycmlkZTsKKyAgICA6OmdycGM6OkNsaWVudEFzeW5jV3JpdGVyPCBmbGF0YnVmZmVyczo6Z3JwYzo6TWVzc2FnZTxNb25zdGVyPj4qIFByZXBhcmVBc3luY0dldE1heEhpdFBvaW50UmF3KDo6Z3JwYzo6Q2xpZW50Q29udGV4dCogY29udGV4dCwgZmxhdGJ1ZmZlcnM6OmdycGM6Ok1lc3NhZ2U8U3RhdD4qIHJlc3BvbnNlLCA6OmdycGM6OkNvbXBsZXRpb25RdWV1ZSogY3EpIG92ZXJyaWRlOworICAgIDo6Z3JwYzo6Q2xpZW50UmVhZGVyV3JpdGVyPCBmbGF0YnVmZmVyczo6Z3JwYzo6TWVzc2FnZTxNb25zdGVyPiwgZmxhdGJ1ZmZlcnM6OmdycGM6Ok1lc3NhZ2U8U3RhdD4+KiBHZXRNaW5NYXhIaXRQb2ludHNSYXcoOjpncnBjOjpDbGllbnRDb250ZXh0KiBjb250ZXh0KSBvdmVycmlkZTsKKyAgICA6OmdycGM6OkNsaWVudEFzeW5jUmVhZGVyV3JpdGVyPCBmbGF0YnVmZmVyczo6Z3JwYzo6TWVzc2FnZTxNb25zdGVyPiwgZmxhdGJ1ZmZlcnM6OmdycGM6Ok1lc3NhZ2U8U3RhdD4+KiBBc3luY0dldE1pbk1heEhpdFBvaW50c1Jhdyg6OmdycGM6OkNsaWVudENvbnRleHQqIGNvbnRleHQsIDo6Z3JwYzo6Q29tcGxldGlvblF1ZXVlKiBjcSwgdm9pZCogdGFnKSBvdmVycmlkZTsKKyAgICA6OmdycGM6OkNsaWVudEFzeW5jUmVhZGVyV3JpdGVyPCBmbGF0YnVmZmVyczo6Z3JwYzo6TWVzc2FnZTxNb25zdGVyPiwgZmxhdGJ1ZmZlcnM6OmdycGM6Ok1lc3NhZ2U8U3RhdD4+KiBQcmVwYXJlQXN5bmNHZXRNaW5NYXhIaXRQb2ludHNSYXcoOjpncnBjOjpDbGllbnRDb250ZXh0KiBjb250ZXh0LCA6OmdycGM6OkNvbXBsZXRpb25RdWV1ZSogY3EpIG92ZXJyaWRlOworICAgIGNvbnN0IDo6Z3JwYzo6aW50ZXJuYWw6OlJwY01ldGhvZCBycGNtZXRob2RfU3RvcmVfOworICAgIGNvbnN0IDo6Z3JwYzo6aW50ZXJuYWw6OlJwY01ldGhvZCBycGNtZXRob2RfUmV0cmlldmVfOworICAgIGNvbnN0IDo6Z3JwYzo6aW50ZXJuYWw6OlJwY01ldGhvZCBycGNtZXRob2RfR2V0TWF4SGl0UG9pbnRfOworICAgIGNvbnN0IDo6Z3JwYzo6aW50ZXJuYWw6OlJwY01ldGhvZCBycGNtZXRob2RfR2V0TWluTWF4SGl0UG9pbnRzXzsKKyAgfTsKKyAgc3RhdGljIHN0ZDo6dW5pcXVlX3B0cjxTdHViPiBOZXdTdHViKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjwgOjpncnBjOjpDaGFubmVsSW50ZXJmYWNlPiYgY2hhbm5lbCwgY29uc3QgOjpncnBjOjpTdHViT3B0aW9ucyYgb3B0aW9ucyA9IDo6Z3JwYzo6U3R1Yk9wdGlvbnMoKSk7CisgIAorICBjbGFzcyBTZXJ2aWNlIDogcHVibGljIDo6Z3JwYzo6U2VydmljZSB7CisgICBwdWJsaWM6CisgICAgU2VydmljZSgpOworICAgIHZpcnR1YWwgflNlcnZpY2UoKTsKKyAgICB2aXJ0dWFsIDo6Z3JwYzo6U3RhdHVzIFN0b3JlKDo6Z3JwYzo6U2VydmVyQ29udGV4dCogY29udGV4dCwgY29uc3QgZmxhdGJ1ZmZlcnM6OmdycGM6Ok1lc3NhZ2U8TW9uc3Rlcj4qIHJlcXVlc3QsIGZsYXRidWZmZXJzOjpncnBjOjpNZXNzYWdlPFN0YXQ+KiByZXNwb25zZSk7CisgICAgdmlydHVhbCA6OmdycGM6OlN0YXR1cyBSZXRyaWV2ZSg6OmdycGM6OlNlcnZlckNvbnRleHQqIGNvbnRleHQsIGNvbnN0IGZsYXRidWZmZXJzOjpncnBjOjpNZXNzYWdlPFN0YXQ+KiByZXF1ZXN0LCA6OmdycGM6OlNlcnZlcldyaXRlcjwgZmxhdGJ1ZmZlcnM6OmdycGM6Ok1lc3NhZ2U8TW9uc3Rlcj4+KiB3cml0ZXIpOworICAgIHZpcnR1YWwgOjpncnBjOjpTdGF0dXMgR2V0TWF4SGl0UG9pbnQoOjpncnBjOjpTZXJ2ZXJDb250ZXh0KiBjb250ZXh0LCA6OmdycGM6OlNlcnZlclJlYWRlcjwgZmxhdGJ1ZmZlcnM6OmdycGM6Ok1lc3NhZ2U8TW9uc3Rlcj4+KiByZWFkZXIsIGZsYXRidWZmZXJzOjpncnBjOjpNZXNzYWdlPFN0YXQ+KiByZXNwb25zZSk7CisgICAgdmlydHVhbCA6OmdycGM6OlN0YXR1cyBHZXRNaW5NYXhIaXRQb2ludHMoOjpncnBjOjpTZXJ2ZXJDb250ZXh0KiBjb250ZXh0LCA6OmdycGM6OlNlcnZlclJlYWRlcldyaXRlcjwgZmxhdGJ1ZmZlcnM6OmdycGM6Ok1lc3NhZ2U8U3RhdD4sIGZsYXRidWZmZXJzOjpncnBjOjpNZXNzYWdlPE1vbnN0ZXI+Piogc3RyZWFtKTsKKyAgfTsKKyAgdGVtcGxhdGUgPGNsYXNzIEJhc2VDbGFzcz4KKyAgY2xhc3MgV2l0aEFzeW5jTWV0aG9kX1N0b3JlIDogcHVibGljIEJhc2VDbGFzcyB7CisgICBwcml2YXRlOgorICAgIHZvaWQgQmFzZUNsYXNzTXVzdEJlRGVyaXZlZEZyb21TZXJ2aWNlKGNvbnN0IFNlcnZpY2UgKi8qc2VydmljZSovKSB7fQorICAgcHVibGljOgorICAgIFdpdGhBc3luY01ldGhvZF9TdG9yZSgpIHsKKyAgICAgIDo6Z3JwYzo6U2VydmljZTo6TWFya01ldGhvZEFzeW5jKDApOworICAgIH0KKyAgICB+V2l0aEFzeW5jTWV0aG9kX1N0b3JlKCkgb3ZlcnJpZGUgeworICAgICAgQmFzZUNsYXNzTXVzdEJlRGVyaXZlZEZyb21TZXJ2aWNlKHRoaXMpOworICAgIH0KKyAgICAvLyBkaXNhYmxlIHN5bmNocm9ub3VzIHZlcnNpb24gb2YgdGhpcyBtZXRob2QKKyAgICA6OmdycGM6OlN0YXR1cyBTdG9yZSg6OmdycGM6OlNlcnZlckNvbnRleHQqIC8qY29udGV4dCovLCBjb25zdCBmbGF0YnVmZmVyczo6Z3JwYzo6TWVzc2FnZTxNb25zdGVyPiogLypyZXF1ZXN0Ki8sIGZsYXRidWZmZXJzOjpncnBjOjpNZXNzYWdlPFN0YXQ+KiAvKnJlc3BvbnNlKi8pIGZpbmFsIG92ZXJyaWRlIHsKKyAgICAgIGFib3J0KCk7CisgICAgICByZXR1cm4gOjpncnBjOjpTdGF0dXMoOjpncnBjOjpTdGF0dXNDb2RlOjpVTklNUExFTUVOVEVELCAiIik7CisgICAgfQorICAgIHZvaWQgUmVxdWVzdFN0b3JlKDo6Z3JwYzo6U2VydmVyQ29udGV4dCogY29udGV4dCwgZmxhdGJ1ZmZlcnM6OmdycGM6Ok1lc3NhZ2U8TW9uc3Rlcj4qIHJlcXVlc3QsIDo6Z3JwYzo6U2VydmVyQXN5bmNSZXNwb25zZVdyaXRlcjwgZmxhdGJ1ZmZlcnM6OmdycGM6Ok1lc3NhZ2U8U3RhdD4+KiByZXNwb25zZSwgOjpncnBjOjpDb21wbGV0aW9uUXVldWUqIG5ld19jYWxsX2NxLCA6OmdycGM6OlNlcnZlckNvbXBsZXRpb25RdWV1ZSogbm90aWZpY2F0aW9uX2NxLCB2b2lkICp0YWcpIHsKKyAgICAgIDo6Z3JwYzo6U2VydmljZTo6UmVxdWVzdEFzeW5jVW5hcnkoMCwgY29udGV4dCwgcmVxdWVzdCwgcmVzcG9uc2UsIG5ld19jYWxsX2NxLCBub3RpZmljYXRpb25fY3EsIHRhZyk7CisgICAgfQorICB9OworICB0ZW1wbGF0ZSA8Y2xhc3MgQmFzZUNsYXNzPgorICBjbGFzcyBXaXRoQXN5bmNNZXRob2RfUmV0cmlldmUgOiBwdWJsaWMgQmFzZUNsYXNzIHsKKyAgIHByaXZhdGU6CisgICAgdm9pZCBCYXNlQ2xhc3NNdXN0QmVEZXJpdmVkRnJvbVNlcnZpY2UoY29uc3QgU2VydmljZSAqLypzZXJ2aWNlKi8pIHt9CisgICBwdWJsaWM6CisgICAgV2l0aEFzeW5jTWV0aG9kX1JldHJpZXZlKCkgeworICAgICAgOjpncnBjOjpTZXJ2aWNlOjpNYXJrTWV0aG9kQXN5bmMoMSk7CisgICAgfQorICAgIH5XaXRoQXN5bmNNZXRob2RfUmV0cmlldmUoKSBvdmVycmlkZSB7CisgICAgICBCYXNlQ2xhc3NNdXN0QmVEZXJpdmVkRnJvbVNlcnZpY2UodGhpcyk7CisgICAgfQorICAgIC8vIGRpc2FibGUgc3luY2hyb25vdXMgdmVyc2lvbiBvZiB0aGlzIG1ldGhvZAorICAgIDo6Z3JwYzo6U3RhdHVzIFJldHJpZXZlKDo6Z3JwYzo6U2VydmVyQ29udGV4dCogLypjb250ZXh0Ki8sIGNvbnN0IGZsYXRidWZmZXJzOjpncnBjOjpNZXNzYWdlPFN0YXQ+KiAvKnJlcXVlc3QqLywgOjpncnBjOjpTZXJ2ZXJXcml0ZXI8IGZsYXRidWZmZXJzOjpncnBjOjpNZXNzYWdlPE1vbnN0ZXI+PiogLyp3cml0ZXIqLykgZmluYWwgb3ZlcnJpZGUgeworICAgICAgYWJvcnQoKTsKKyAgICAgIHJldHVybiA6OmdycGM6OlN0YXR1cyg6OmdycGM6OlN0YXR1c0NvZGU6OlVOSU1QTEVNRU5URUQsICIiKTsKKyAgICB9CisgICAgdm9pZCBSZXF1ZXN0UmV0cmlldmUoOjpncnBjOjpTZXJ2ZXJDb250ZXh0KiBjb250ZXh0LCBmbGF0YnVmZmVyczo6Z3JwYzo6TWVzc2FnZTxTdGF0PiogcmVxdWVzdCwgOjpncnBjOjpTZXJ2ZXJBc3luY1dyaXRlcjwgZmxhdGJ1ZmZlcnM6OmdycGM6Ok1lc3NhZ2U8TW9uc3Rlcj4+KiB3cml0ZXIsIDo6Z3JwYzo6Q29tcGxldGlvblF1ZXVlKiBuZXdfY2FsbF9jcSwgOjpncnBjOjpTZXJ2ZXJDb21wbGV0aW9uUXVldWUqIG5vdGlmaWNhdGlvbl9jcSwgdm9pZCAqdGFnKSB7CisgICAgICA6OmdycGM6OlNlcnZpY2U6OlJlcXVlc3RBc3luY1NlcnZlclN0cmVhbWluZygxLCBjb250ZXh0LCByZXF1ZXN0LCB3cml0ZXIsIG5ld19jYWxsX2NxLCBub3RpZmljYXRpb25fY3EsIHRhZyk7CisgICAgfQorICB9OworICB0ZW1wbGF0ZSA8Y2xhc3MgQmFzZUNsYXNzPgorICBjbGFzcyBXaXRoQXN5bmNNZXRob2RfR2V0TWF4SGl0UG9pbnQgOiBwdWJsaWMgQmFzZUNsYXNzIHsKKyAgIHByaXZhdGU6CisgICAgdm9pZCBCYXNlQ2xhc3NNdXN0QmVEZXJpdmVkRnJvbVNlcnZpY2UoY29uc3QgU2VydmljZSAqLypzZXJ2aWNlKi8pIHt9CisgICBwdWJsaWM6CisgICAgV2l0aEFzeW5jTWV0aG9kX0dldE1heEhpdFBvaW50KCkgeworICAgICAgOjpncnBjOjpTZXJ2aWNlOjpNYXJrTWV0aG9kQXN5bmMoMik7CisgICAgfQorICAgIH5XaXRoQXN5bmNNZXRob2RfR2V0TWF4SGl0UG9pbnQoKSBvdmVycmlkZSB7CisgICAgICBCYXNlQ2xhc3NNdXN0QmVEZXJpdmVkRnJvbVNlcnZpY2UodGhpcyk7CisgICAgfQorICAgIC8vIGRpc2FibGUgc3luY2hyb25vdXMgdmVyc2lvbiBvZiB0aGlzIG1ldGhvZAorICAgIDo6Z3JwYzo6U3RhdHVzIEdldE1heEhpdFBvaW50KDo6Z3JwYzo6U2VydmVyQ29udGV4dCogLypjb250ZXh0Ki8sIDo6Z3JwYzo6U2VydmVyUmVhZGVyPCBmbGF0YnVmZmVyczo6Z3JwYzo6TWVzc2FnZTxNb25zdGVyPj4qIC8qcmVhZGVyKi8sIGZsYXRidWZmZXJzOjpncnBjOjpNZXNzYWdlPFN0YXQ+KiAvKnJlc3BvbnNlKi8pIGZpbmFsIG92ZXJyaWRlIHsKKyAgICAgIGFib3J0KCk7CisgICAgICByZXR1cm4gOjpncnBjOjpTdGF0dXMoOjpncnBjOjpTdGF0dXNDb2RlOjpVTklNUExFTUVOVEVELCAiIik7CisgICAgfQorICAgIHZvaWQgUmVxdWVzdEdldE1heEhpdFBvaW50KDo6Z3JwYzo6U2VydmVyQ29udGV4dCogY29udGV4dCwgOjpncnBjOjpTZXJ2ZXJBc3luY1JlYWRlcjwgZmxhdGJ1ZmZlcnM6OmdycGM6Ok1lc3NhZ2U8U3RhdD4sIGZsYXRidWZmZXJzOjpncnBjOjpNZXNzYWdlPE1vbnN0ZXI+PiogcmVhZGVyLCA6OmdycGM6OkNvbXBsZXRpb25RdWV1ZSogbmV3X2NhbGxfY3EsIDo6Z3JwYzo6U2VydmVyQ29tcGxldGlvblF1ZXVlKiBub3RpZmljYXRpb25fY3EsIHZvaWQgKnRhZykgeworICAgICAgOjpncnBjOjpTZXJ2aWNlOjpSZXF1ZXN0QXN5bmNDbGllbnRTdHJlYW1pbmcoMiwgY29udGV4dCwgcmVhZGVyLCBuZXdfY2FsbF9jcSwgbm90aWZpY2F0aW9uX2NxLCB0YWcpOworICAgIH0KKyAgfTsKKyAgdGVtcGxhdGUgPGNsYXNzIEJhc2VDbGFzcz4KKyAgY2xhc3MgV2l0aEFzeW5jTWV0aG9kX0dldE1pbk1heEhpdFBvaW50cyA6IHB1YmxpYyBCYXNlQ2xhc3MgeworICAgcHJpdmF0ZToKKyAgICB2b2lkIEJhc2VDbGFzc011c3RCZURlcml2ZWRGcm9tU2VydmljZShjb25zdCBTZXJ2aWNlICovKnNlcnZpY2UqLykge30KKyAgIHB1YmxpYzoKKyAgICBXaXRoQXN5bmNNZXRob2RfR2V0TWluTWF4SGl0UG9pbnRzKCkgeworICAgICAgOjpncnBjOjpTZXJ2aWNlOjpNYXJrTWV0aG9kQXN5bmMoMyk7CisgICAgfQorICAgIH5XaXRoQXN5bmNNZXRob2RfR2V0TWluTWF4SGl0UG9pbnRzKCkgb3ZlcnJpZGUgeworICAgICAgQmFzZUNsYXNzTXVzdEJlRGVyaXZlZEZyb21TZXJ2aWNlKHRoaXMpOworICAgIH0KKyAgICAvLyBkaXNhYmxlIHN5bmNocm9ub3VzIHZlcnNpb24gb2YgdGhpcyBtZXRob2QKKyAgICA6OmdycGM6OlN0YXR1cyBHZXRNaW5NYXhIaXRQb2ludHMoOjpncnBjOjpTZXJ2ZXJDb250ZXh0KiAvKmNvbnRleHQqLywgOjpncnBjOjpTZXJ2ZXJSZWFkZXJXcml0ZXI8IGZsYXRidWZmZXJzOjpncnBjOjpNZXNzYWdlPFN0YXQ+LCBmbGF0YnVmZmVyczo6Z3JwYzo6TWVzc2FnZTxNb25zdGVyPj4qIC8qc3RyZWFtKi8pIGZpbmFsIG92ZXJyaWRlIHsKKyAgICAgIGFib3J0KCk7CisgICAgICByZXR1cm4gOjpncnBjOjpTdGF0dXMoOjpncnBjOjpTdGF0dXNDb2RlOjpVTklNUExFTUVOVEVELCAiIik7CisgICAgfQorICAgIHZvaWQgUmVxdWVzdEdldE1pbk1heEhpdFBvaW50cyg6OmdycGM6OlNlcnZlckNvbnRleHQqIGNvbnRleHQsIDo6Z3JwYzo6U2VydmVyQXN5bmNSZWFkZXJXcml0ZXI8IGZsYXRidWZmZXJzOjpncnBjOjpNZXNzYWdlPFN0YXQ+LCBmbGF0YnVmZmVyczo6Z3JwYzo6TWVzc2FnZTxNb25zdGVyPj4qIHN0cmVhbSwgOjpncnBjOjpDb21wbGV0aW9uUXVldWUqIG5ld19jYWxsX2NxLCA6OmdycGM6OlNlcnZlckNvbXBsZXRpb25RdWV1ZSogbm90aWZpY2F0aW9uX2NxLCB2b2lkICp0YWcpIHsKKyAgICAgIDo6Z3JwYzo6U2VydmljZTo6UmVxdWVzdEFzeW5jQmlkaVN0cmVhbWluZygzLCBjb250ZXh0LCBzdHJlYW0sIG5ld19jYWxsX2NxLCBub3RpZmljYXRpb25fY3EsIHRhZyk7CisgICAgfQorICB9OworICB0eXBlZGVmICAgV2l0aEFzeW5jTWV0aG9kX1N0b3JlPCAgV2l0aEFzeW5jTWV0aG9kX1JldHJpZXZlPCAgV2l0aEFzeW5jTWV0aG9kX0dldE1heEhpdFBvaW50PCAgV2l0aEFzeW5jTWV0aG9kX0dldE1pbk1heEhpdFBvaW50czwgIFNlcnZpY2UgICA+ICAgPiAgID4gICA+ICAgQXN5bmNTZXJ2aWNlOworICB0ZW1wbGF0ZSA8Y2xhc3MgQmFzZUNsYXNzPgorICBjbGFzcyBXaXRoR2VuZXJpY01ldGhvZF9TdG9yZSA6IHB1YmxpYyBCYXNlQ2xhc3MgeworICAgcHJpdmF0ZToKKyAgICB2b2lkIEJhc2VDbGFzc011c3RCZURlcml2ZWRGcm9tU2VydmljZShjb25zdCBTZXJ2aWNlICovKnNlcnZpY2UqLykge30KKyAgIHB1YmxpYzoKKyAgICBXaXRoR2VuZXJpY01ldGhvZF9TdG9yZSgpIHsKKyAgICAgIDo6Z3JwYzo6U2VydmljZTo6TWFya01ldGhvZEdlbmVyaWMoMCk7CisgICAgfQorICAgIH5XaXRoR2VuZXJpY01ldGhvZF9TdG9yZSgpIG92ZXJyaWRlIHsKKyAgICAgIEJhc2VDbGFzc011c3RCZURlcml2ZWRGcm9tU2VydmljZSh0aGlzKTsKKyAgICB9CisgICAgLy8gZGlzYWJsZSBzeW5jaHJvbm91cyB2ZXJzaW9uIG9mIHRoaXMgbWV0aG9kCisgICAgOjpncnBjOjpTdGF0dXMgU3RvcmUoOjpncnBjOjpTZXJ2ZXJDb250ZXh0KiAvKmNvbnRleHQqLywgY29uc3QgZmxhdGJ1ZmZlcnM6OmdycGM6Ok1lc3NhZ2U8TW9uc3Rlcj4qIC8qcmVxdWVzdCovLCBmbGF0YnVmZmVyczo6Z3JwYzo6TWVzc2FnZTxTdGF0PiogLypyZXNwb25zZSovKSBmaW5hbCBvdmVycmlkZSB7CisgICAgICBhYm9ydCgpOworICAgICAgcmV0dXJuIDo6Z3JwYzo6U3RhdHVzKDo6Z3JwYzo6U3RhdHVzQ29kZTo6VU5JTVBMRU1FTlRFRCwgIiIpOworICAgIH0KKyAgfTsKKyAgdGVtcGxhdGUgPGNsYXNzIEJhc2VDbGFzcz4KKyAgY2xhc3MgV2l0aEdlbmVyaWNNZXRob2RfUmV0cmlldmUgOiBwdWJsaWMgQmFzZUNsYXNzIHsKKyAgIHByaXZhdGU6CisgICAgdm9pZCBCYXNlQ2xhc3NNdXN0QmVEZXJpdmVkRnJvbVNlcnZpY2UoY29uc3QgU2VydmljZSAqLypzZXJ2aWNlKi8pIHt9CisgICBwdWJsaWM6CisgICAgV2l0aEdlbmVyaWNNZXRob2RfUmV0cmlldmUoKSB7CisgICAgICA6OmdycGM6OlNlcnZpY2U6Ok1hcmtNZXRob2RHZW5lcmljKDEpOworICAgIH0KKyAgICB+V2l0aEdlbmVyaWNNZXRob2RfUmV0cmlldmUoKSBvdmVycmlkZSB7CisgICAgICBCYXNlQ2xhc3NNdXN0QmVEZXJpdmVkRnJvbVNlcnZpY2UodGhpcyk7CisgICAgfQorICAgIC8vIGRpc2FibGUgc3luY2hyb25vdXMgdmVyc2lvbiBvZiB0aGlzIG1ldGhvZAorICAgIDo6Z3JwYzo6U3RhdHVzIFJldHJpZXZlKDo6Z3JwYzo6U2VydmVyQ29udGV4dCogLypjb250ZXh0Ki8sIGNvbnN0IGZsYXRidWZmZXJzOjpncnBjOjpNZXNzYWdlPFN0YXQ+KiAvKnJlcXVlc3QqLywgOjpncnBjOjpTZXJ2ZXJXcml0ZXI8IGZsYXRidWZmZXJzOjpncnBjOjpNZXNzYWdlPE1vbnN0ZXI+PiogLyp3cml0ZXIqLykgZmluYWwgb3ZlcnJpZGUgeworICAgICAgYWJvcnQoKTsKKyAgICAgIHJldHVybiA6OmdycGM6OlN0YXR1cyg6OmdycGM6OlN0YXR1c0NvZGU6OlVOSU1QTEVNRU5URUQsICIiKTsKKyAgICB9CisgIH07CisgIHRlbXBsYXRlIDxjbGFzcyBCYXNlQ2xhc3M+CisgIGNsYXNzIFdpdGhHZW5lcmljTWV0aG9kX0dldE1heEhpdFBvaW50IDogcHVibGljIEJhc2VDbGFzcyB7CisgICBwcml2YXRlOgorICAgIHZvaWQgQmFzZUNsYXNzTXVzdEJlRGVyaXZlZEZyb21TZXJ2aWNlKGNvbnN0IFNlcnZpY2UgKi8qc2VydmljZSovKSB7fQorICAgcHVibGljOgorICAgIFdpdGhHZW5lcmljTWV0aG9kX0dldE1heEhpdFBvaW50KCkgeworICAgICAgOjpncnBjOjpTZXJ2aWNlOjpNYXJrTWV0aG9kR2VuZXJpYygyKTsKKyAgICB9CisgICAgfldpdGhHZW5lcmljTWV0aG9kX0dldE1heEhpdFBvaW50KCkgb3ZlcnJpZGUgeworICAgICAgQmFzZUNsYXNzTXVzdEJlRGVyaXZlZEZyb21TZXJ2aWNlKHRoaXMpOworICAgIH0KKyAgICAvLyBkaXNhYmxlIHN5bmNocm9ub3VzIHZlcnNpb24gb2YgdGhpcyBtZXRob2QKKyAgICA6OmdycGM6OlN0YXR1cyBHZXRNYXhIaXRQb2ludCg6OmdycGM6OlNlcnZlckNvbnRleHQqIC8qY29udGV4dCovLCA6OmdycGM6OlNlcnZlclJlYWRlcjwgZmxhdGJ1ZmZlcnM6OmdycGM6Ok1lc3NhZ2U8TW9uc3Rlcj4+KiAvKnJlYWRlciovLCBmbGF0YnVmZmVyczo6Z3JwYzo6TWVzc2FnZTxTdGF0PiogLypyZXNwb25zZSovKSBmaW5hbCBvdmVycmlkZSB7CisgICAgICBhYm9ydCgpOworICAgICAgcmV0dXJuIDo6Z3JwYzo6U3RhdHVzKDo6Z3JwYzo6U3RhdHVzQ29kZTo6VU5JTVBMRU1FTlRFRCwgIiIpOworICAgIH0KKyAgfTsKKyAgdGVtcGxhdGUgPGNsYXNzIEJhc2VDbGFzcz4KKyAgY2xhc3MgV2l0aEdlbmVyaWNNZXRob2RfR2V0TWluTWF4SGl0UG9pbnRzIDogcHVibGljIEJhc2VDbGFzcyB7CisgICBwcml2YXRlOgorICAgIHZvaWQgQmFzZUNsYXNzTXVzdEJlRGVyaXZlZEZyb21TZXJ2aWNlKGNvbnN0IFNlcnZpY2UgKi8qc2VydmljZSovKSB7fQorICAgcHVibGljOgorICAgIFdpdGhHZW5lcmljTWV0aG9kX0dldE1pbk1heEhpdFBvaW50cygpIHsKKyAgICAgIDo6Z3JwYzo6U2VydmljZTo6TWFya01ldGhvZEdlbmVyaWMoMyk7CisgICAgfQorICAgIH5XaXRoR2VuZXJpY01ldGhvZF9HZXRNaW5NYXhIaXRQb2ludHMoKSBvdmVycmlkZSB7CisgICAgICBCYXNlQ2xhc3NNdXN0QmVEZXJpdmVkRnJvbVNlcnZpY2UodGhpcyk7CisgICAgfQorICAgIC8vIGRpc2FibGUgc3luY2hyb25vdXMgdmVyc2lvbiBvZiB0aGlzIG1ldGhvZAorICAgIDo6Z3JwYzo6U3RhdHVzIEdldE1pbk1heEhpdFBvaW50cyg6OmdycGM6OlNlcnZlckNvbnRleHQqIC8qY29udGV4dCovLCA6OmdycGM6OlNlcnZlclJlYWRlcldyaXRlcjwgZmxhdGJ1ZmZlcnM6OmdycGM6Ok1lc3NhZ2U8U3RhdD4sIGZsYXRidWZmZXJzOjpncnBjOjpNZXNzYWdlPE1vbnN0ZXI+PiogLypzdHJlYW0qLykgZmluYWwgb3ZlcnJpZGUgeworICAgICAgYWJvcnQoKTsKKyAgICAgIHJldHVybiA6OmdycGM6OlN0YXR1cyg6OmdycGM6OlN0YXR1c0NvZGU6OlVOSU1QTEVNRU5URUQsICIiKTsKKyAgICB9CisgIH07CisgIHRlbXBsYXRlIDxjbGFzcyBCYXNlQ2xhc3M+CisgIGNsYXNzIFdpdGhTdHJlYW1lZFVuYXJ5TWV0aG9kX1N0b3JlIDogcHVibGljIEJhc2VDbGFzcyB7CisgICBwcml2YXRlOgorICAgIHZvaWQgQmFzZUNsYXNzTXVzdEJlRGVyaXZlZEZyb21TZXJ2aWNlKGNvbnN0IFNlcnZpY2UgKi8qc2VydmljZSovKSB7fQorICAgcHVibGljOgorICAgIFdpdGhTdHJlYW1lZFVuYXJ5TWV0aG9kX1N0b3JlKCkgeworICAgICAgOjpncnBjOjpTZXJ2aWNlOjpNYXJrTWV0aG9kU3RyZWFtZWQoMCwKKyAgICAgICAgbmV3IDo6Z3JwYzo6aW50ZXJuYWw6OlN0cmVhbWVkVW5hcnlIYW5kbGVyPCBmbGF0YnVmZmVyczo6Z3JwYzo6TWVzc2FnZTxNb25zdGVyPiwgZmxhdGJ1ZmZlcnM6OmdycGM6Ok1lc3NhZ2U8U3RhdD4+KHN0ZDo6YmluZCgmV2l0aFN0cmVhbWVkVW5hcnlNZXRob2RfU3RvcmU8QmFzZUNsYXNzPjo6U3RyZWFtZWRTdG9yZSwgdGhpcywgc3RkOjpwbGFjZWhvbGRlcnM6Ol8xLCBzdGQ6OnBsYWNlaG9sZGVyczo6XzIpKSk7CisgICAgfQorICAgIH5XaXRoU3RyZWFtZWRVbmFyeU1ldGhvZF9TdG9yZSgpIG92ZXJyaWRlIHsKKyAgICAgIEJhc2VDbGFzc011c3RCZURlcml2ZWRGcm9tU2VydmljZSh0aGlzKTsKKyAgICB9CisgICAgLy8gZGlzYWJsZSByZWd1bGFyIHZlcnNpb24gb2YgdGhpcyBtZXRob2QKKyAgICA6OmdycGM6OlN0YXR1cyBTdG9yZSg6OmdycGM6OlNlcnZlckNvbnRleHQqIC8qY29udGV4dCovLCBjb25zdCBmbGF0YnVmZmVyczo6Z3JwYzo6TWVzc2FnZTxNb25zdGVyPiogLypyZXF1ZXN0Ki8sIGZsYXRidWZmZXJzOjpncnBjOjpNZXNzYWdlPFN0YXQ+KiAvKnJlc3BvbnNlKi8pIGZpbmFsIG92ZXJyaWRlIHsKKyAgICAgIGFib3J0KCk7CisgICAgICByZXR1cm4gOjpncnBjOjpTdGF0dXMoOjpncnBjOjpTdGF0dXNDb2RlOjpVTklNUExFTUVOVEVELCAiIik7CisgICAgfQorICAgIC8vIHJlcGxhY2UgZGVmYXVsdCB2ZXJzaW9uIG9mIG1ldGhvZCB3aXRoIHN0cmVhbWVkIHVuYXJ5CisgICAgdmlydHVhbCA6OmdycGM6OlN0YXR1cyBTdHJlYW1lZFN0b3JlKDo6Z3JwYzo6U2VydmVyQ29udGV4dCogY29udGV4dCwgOjpncnBjOjpTZXJ2ZXJVbmFyeVN0cmVhbWVyPCBmbGF0YnVmZmVyczo6Z3JwYzo6TWVzc2FnZTxNb25zdGVyPixmbGF0YnVmZmVyczo6Z3JwYzo6TWVzc2FnZTxTdGF0Pj4qIHNlcnZlcl91bmFyeV9zdHJlYW1lcikgPSAwOworICB9OworICB0eXBlZGVmICAgV2l0aFN0cmVhbWVkVW5hcnlNZXRob2RfU3RvcmU8ICBTZXJ2aWNlICAgPiAgIFN0cmVhbWVkVW5hcnlTZXJ2aWNlOworICB0ZW1wbGF0ZSA8Y2xhc3MgQmFzZUNsYXNzPgorICBjbGFzcyBXaXRoU3BsaXRTdHJlYW1pbmdNZXRob2RfUmV0cmlldmUgOiBwdWJsaWMgQmFzZUNsYXNzIHsKKyAgIHByaXZhdGU6CisgICAgdm9pZCBCYXNlQ2xhc3NNdXN0QmVEZXJpdmVkRnJvbVNlcnZpY2UoY29uc3QgU2VydmljZSAqLypzZXJ2aWNlKi8pIHsgfQorICAgcHVibGljOgorICAgIFdpdGhTcGxpdFN0cmVhbWluZ01ldGhvZF9SZXRyaWV2ZSgpIHsKKyAgICAgIDo6Z3JwYzo6U2VydmljZTo6TWFya01ldGhvZFN0cmVhbWVkKDEsCisgICAgICAgIG5ldyA6OmdycGM6OmludGVybmFsOjpTcGxpdFNlcnZlclN0cmVhbWluZ0hhbmRsZXI8IGZsYXRidWZmZXJzOjpncnBjOjpNZXNzYWdlPFN0YXQ+LCBmbGF0YnVmZmVyczo6Z3JwYzo6TWVzc2FnZTxNb25zdGVyPj4oc3RkOjpiaW5kKCZXaXRoU3BsaXRTdHJlYW1pbmdNZXRob2RfUmV0cmlldmU8QmFzZUNsYXNzPjo6U3RyZWFtZWRSZXRyaWV2ZSwgdGhpcywgc3RkOjpwbGFjZWhvbGRlcnM6Ol8xLCBzdGQ6OnBsYWNlaG9sZGVyczo6XzIpKSk7CisgICAgfQorICAgIH5XaXRoU3BsaXRTdHJlYW1pbmdNZXRob2RfUmV0cmlldmUoKSBvdmVycmlkZSB7CisgICAgICBCYXNlQ2xhc3NNdXN0QmVEZXJpdmVkRnJvbVNlcnZpY2UodGhpcyk7CisgICAgfQorICAgIC8vIGRpc2FibGUgcmVndWxhciB2ZXJzaW9uIG9mIHRoaXMgbWV0aG9kCisgICAgOjpncnBjOjpTdGF0dXMgUmV0cmlldmUoOjpncnBjOjpTZXJ2ZXJDb250ZXh0KiAvKmNvbnRleHQqLywgY29uc3QgZmxhdGJ1ZmZlcnM6OmdycGM6Ok1lc3NhZ2U8U3RhdD4qIC8qcmVxdWVzdCovLCA6OmdycGM6OlNlcnZlcldyaXRlcjwgZmxhdGJ1ZmZlcnM6OmdycGM6Ok1lc3NhZ2U8TW9uc3Rlcj4+KiAvKndyaXRlciovKSBmaW5hbCBvdmVycmlkZSB7CisgICAgICBhYm9ydCgpOworICAgICAgcmV0dXJuIDo6Z3JwYzo6U3RhdHVzKDo6Z3JwYzo6U3RhdHVzQ29kZTo6VU5JTVBMRU1FTlRFRCwgIiIpOworICAgIH0KKyAgICAvLyByZXBsYWNlIGRlZmF1bHQgdmVyc2lvbiBvZiBtZXRob2Qgd2l0aCBzcGxpdCBzdHJlYW1lZAorICAgIHZpcnR1YWwgOjpncnBjOjpTdGF0dXMgU3RyZWFtZWRSZXRyaWV2ZSg6OmdycGM6OlNlcnZlckNvbnRleHQqIGNvbnRleHQsIDo6Z3JwYzo6U2VydmVyU3BsaXRTdHJlYW1lcjwgZmxhdGJ1ZmZlcnM6OmdycGM6Ok1lc3NhZ2U8U3RhdD4sZmxhdGJ1ZmZlcnM6OmdycGM6Ok1lc3NhZ2U8TW9uc3Rlcj4+KiBzZXJ2ZXJfc3BsaXRfc3RyZWFtZXIpID0gMDsKKyAgfTsKKyAgdHlwZWRlZiAgIFdpdGhTcGxpdFN0cmVhbWluZ01ldGhvZF9SZXRyaWV2ZTwgIFNlcnZpY2UgICA+ICAgU3BsaXRTdHJlYW1lZFNlcnZpY2U7CisgIHR5cGVkZWYgICBXaXRoU3RyZWFtZWRVbmFyeU1ldGhvZF9TdG9yZTwgIFdpdGhTcGxpdFN0cmVhbWluZ01ldGhvZF9SZXRyaWV2ZTwgIFNlcnZpY2UgICA+ICAgPiAgIFN0cmVhbWVkU2VydmljZTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBFeGFtcGxlCit9ICAvLyBuYW1lc3BhY2UgTXlHYW1lCisKKworI2VuZGlmICAvLyBHUlBDX21vbnN0ZXJfNWZ0ZXN0X19JTkNMVURFRApkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvbW9uc3Rlcl90ZXN0X3N1ZmZpeC9maWxlc3VmZml4X29ubHkvbW9uc3Rlcl90ZXN0X3N1ZmZpeC5oIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvbW9uc3Rlcl90ZXN0X3N1ZmZpeC9maWxlc3VmZml4X29ubHkvbW9uc3Rlcl90ZXN0X3N1ZmZpeC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRlYWI3N2IKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9tb25zdGVyX3Rlc3Rfc3VmZml4L2ZpbGVzdWZmaXhfb25seS9tb25zdGVyX3Rlc3Rfc3VmZml4LmgKQEAgLTAsMCArMSw0MDM0IEBACisvLyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBieSB0aGUgRmxhdEJ1ZmZlcnMgY29tcGlsZXIsIGRvIG5vdCBtb2RpZnkKKworCisjaWZuZGVmIEZMQVRCVUZGRVJTX0dFTkVSQVRFRF9NT05TVEVSVEVTVF9NWUdBTUVfRVhBTVBMRV9IXworI2RlZmluZSBGTEFUQlVGRkVSU19HRU5FUkFURURfTU9OU1RFUlRFU1RfTVlHQU1FX0VYQU1QTEVfSF8KKworI2luY2x1ZGUgImZsYXRidWZmZXJzL2ZsYXRidWZmZXJzLmgiCisjaW5jbHVkZSAiZmxhdGJ1ZmZlcnMvZmxleGJ1ZmZlcnMuaCIKKyNpbmNsdWRlICJmbGF0YnVmZmVycy9mbGV4X2ZsYXRfdXRpbC5oIgorCisvLyBFbnN1cmUgdGhlIGluY2x1ZGVkIGZsYXRidWZmZXJzLmggaXMgdGhlIHNhbWUgdmVyc2lvbiBhcyB3aGVuIHRoaXMgZmlsZSB3YXMKKy8vIGdlbmVyYXRlZCwgb3RoZXJ3aXNlIGl0IG1heSBub3QgYmUgY29tcGF0aWJsZS4KK3N0YXRpY19hc3NlcnQoRkxBVEJVRkZFUlNfVkVSU0lPTl9NQUpPUiA9PSAyICYmCisgICAgICAgICAgICAgIEZMQVRCVUZGRVJTX1ZFUlNJT05fTUlOT1IgPT0gMCAmJgorICAgICAgICAgICAgICBGTEFUQlVGRkVSU19WRVJTSU9OX1JFVklTSU9OID09IDgsCisgICAgICAgICAgICAgIk5vbi1jb21wYXRpYmxlIGZsYXRidWZmZXJzIHZlcnNpb24gaW5jbHVkZWQiKTsKKworbmFtZXNwYWNlIE15R2FtZSB7CisKK3N0cnVjdCBJblBhcmVudE5hbWVzcGFjZTsKK3N0cnVjdCBJblBhcmVudE5hbWVzcGFjZUJ1aWxkZXI7CitzdHJ1Y3QgSW5QYXJlbnROYW1lc3BhY2VUOworCituYW1lc3BhY2UgRXhhbXBsZTIgeworCitzdHJ1Y3QgTW9uc3RlcjsKK3N0cnVjdCBNb25zdGVyQnVpbGRlcjsKK3N0cnVjdCBNb25zdGVyVDsKKworfSAgLy8gbmFtZXNwYWNlIEV4YW1wbGUyCisKK25hbWVzcGFjZSBFeGFtcGxlIHsKKworc3RydWN0IFRlc3Q7CisKK3N0cnVjdCBUZXN0U2ltcGxlVGFibGVXaXRoRW51bTsKK3N0cnVjdCBUZXN0U2ltcGxlVGFibGVXaXRoRW51bUJ1aWxkZXI7CitzdHJ1Y3QgVGVzdFNpbXBsZVRhYmxlV2l0aEVudW1UOworCitzdHJ1Y3QgVmVjMzsKKworc3RydWN0IEFiaWxpdHk7CisKK3N0cnVjdCBTdHJ1Y3RPZlN0cnVjdHM7CisKK3N0cnVjdCBTdHJ1Y3RPZlN0cnVjdHNPZlN0cnVjdHM7CisKK3N0cnVjdCBTdGF0Oworc3RydWN0IFN0YXRCdWlsZGVyOworc3RydWN0IFN0YXRUOworCitzdHJ1Y3QgUmVmZXJyYWJsZTsKK3N0cnVjdCBSZWZlcnJhYmxlQnVpbGRlcjsKK3N0cnVjdCBSZWZlcnJhYmxlVDsKKworc3RydWN0IE1vbnN0ZXI7CitzdHJ1Y3QgTW9uc3RlckJ1aWxkZXI7CitzdHJ1Y3QgTW9uc3RlclQ7CisKK3N0cnVjdCBUeXBlQWxpYXNlczsKK3N0cnVjdCBUeXBlQWxpYXNlc0J1aWxkZXI7CitzdHJ1Y3QgVHlwZUFsaWFzZXNUOworCit9ICAvLyBuYW1lc3BhY2UgRXhhbXBsZQorCitib29sIG9wZXJhdG9yPT0oY29uc3QgSW5QYXJlbnROYW1lc3BhY2VUICZsaHMsIGNvbnN0IEluUGFyZW50TmFtZXNwYWNlVCAmcmhzKTsKK2Jvb2wgb3BlcmF0b3IhPShjb25zdCBJblBhcmVudE5hbWVzcGFjZVQgJmxocywgY29uc3QgSW5QYXJlbnROYW1lc3BhY2VUICZyaHMpOworbmFtZXNwYWNlIEV4YW1wbGUyIHsKKworYm9vbCBvcGVyYXRvcj09KGNvbnN0IE1vbnN0ZXJUICZsaHMsIGNvbnN0IE1vbnN0ZXJUICZyaHMpOworYm9vbCBvcGVyYXRvciE9KGNvbnN0IE1vbnN0ZXJUICZsaHMsIGNvbnN0IE1vbnN0ZXJUICZyaHMpOworfSAgLy8gbmFtZXNwYWNlIEV4YW1wbGUyCisKK25hbWVzcGFjZSBFeGFtcGxlIHsKKworYm9vbCBvcGVyYXRvcj09KGNvbnN0IFRlc3QgJmxocywgY29uc3QgVGVzdCAmcmhzKTsKK2Jvb2wgb3BlcmF0b3IhPShjb25zdCBUZXN0ICZsaHMsIGNvbnN0IFRlc3QgJnJocyk7Citib29sIG9wZXJhdG9yPT0oY29uc3QgVGVzdFNpbXBsZVRhYmxlV2l0aEVudW1UICZsaHMsIGNvbnN0IFRlc3RTaW1wbGVUYWJsZVdpdGhFbnVtVCAmcmhzKTsKK2Jvb2wgb3BlcmF0b3IhPShjb25zdCBUZXN0U2ltcGxlVGFibGVXaXRoRW51bVQgJmxocywgY29uc3QgVGVzdFNpbXBsZVRhYmxlV2l0aEVudW1UICZyaHMpOworYm9vbCBvcGVyYXRvcj09KGNvbnN0IFZlYzMgJmxocywgY29uc3QgVmVjMyAmcmhzKTsKK2Jvb2wgb3BlcmF0b3IhPShjb25zdCBWZWMzICZsaHMsIGNvbnN0IFZlYzMgJnJocyk7Citib29sIG9wZXJhdG9yPT0oY29uc3QgQWJpbGl0eSAmbGhzLCBjb25zdCBBYmlsaXR5ICZyaHMpOworYm9vbCBvcGVyYXRvciE9KGNvbnN0IEFiaWxpdHkgJmxocywgY29uc3QgQWJpbGl0eSAmcmhzKTsKK2Jvb2wgb3BlcmF0b3I9PShjb25zdCBTdHJ1Y3RPZlN0cnVjdHMgJmxocywgY29uc3QgU3RydWN0T2ZTdHJ1Y3RzICZyaHMpOworYm9vbCBvcGVyYXRvciE9KGNvbnN0IFN0cnVjdE9mU3RydWN0cyAmbGhzLCBjb25zdCBTdHJ1Y3RPZlN0cnVjdHMgJnJocyk7Citib29sIG9wZXJhdG9yPT0oY29uc3QgU3RydWN0T2ZTdHJ1Y3RzT2ZTdHJ1Y3RzICZsaHMsIGNvbnN0IFN0cnVjdE9mU3RydWN0c09mU3RydWN0cyAmcmhzKTsKK2Jvb2wgb3BlcmF0b3IhPShjb25zdCBTdHJ1Y3RPZlN0cnVjdHNPZlN0cnVjdHMgJmxocywgY29uc3QgU3RydWN0T2ZTdHJ1Y3RzT2ZTdHJ1Y3RzICZyaHMpOworYm9vbCBvcGVyYXRvcj09KGNvbnN0IFN0YXRUICZsaHMsIGNvbnN0IFN0YXRUICZyaHMpOworYm9vbCBvcGVyYXRvciE9KGNvbnN0IFN0YXRUICZsaHMsIGNvbnN0IFN0YXRUICZyaHMpOworYm9vbCBvcGVyYXRvcj09KGNvbnN0IFJlZmVycmFibGVUICZsaHMsIGNvbnN0IFJlZmVycmFibGVUICZyaHMpOworYm9vbCBvcGVyYXRvciE9KGNvbnN0IFJlZmVycmFibGVUICZsaHMsIGNvbnN0IFJlZmVycmFibGVUICZyaHMpOworYm9vbCBvcGVyYXRvcj09KGNvbnN0IE1vbnN0ZXJUICZsaHMsIGNvbnN0IE1vbnN0ZXJUICZyaHMpOworYm9vbCBvcGVyYXRvciE9KGNvbnN0IE1vbnN0ZXJUICZsaHMsIGNvbnN0IE1vbnN0ZXJUICZyaHMpOworYm9vbCBvcGVyYXRvcj09KGNvbnN0IFR5cGVBbGlhc2VzVCAmbGhzLCBjb25zdCBUeXBlQWxpYXNlc1QgJnJocyk7Citib29sIG9wZXJhdG9yIT0oY29uc3QgVHlwZUFsaWFzZXNUICZsaHMsIGNvbnN0IFR5cGVBbGlhc2VzVCAmcmhzKTsKKworfSAgLy8gbmFtZXNwYWNlIEV4YW1wbGUKKworaW5saW5lIGNvbnN0IGZsYXRidWZmZXJzOjpUeXBlVGFibGUgKkluUGFyZW50TmFtZXNwYWNlVHlwZVRhYmxlKCk7CisKK25hbWVzcGFjZSBFeGFtcGxlMiB7CisKK2lubGluZSBjb25zdCBmbGF0YnVmZmVyczo6VHlwZVRhYmxlICpNb25zdGVyVHlwZVRhYmxlKCk7CisKK30gIC8vIG5hbWVzcGFjZSBFeGFtcGxlMgorCituYW1lc3BhY2UgRXhhbXBsZSB7CisKK2lubGluZSBjb25zdCBmbGF0YnVmZmVyczo6VHlwZVRhYmxlICpUZXN0VHlwZVRhYmxlKCk7CisKK2lubGluZSBjb25zdCBmbGF0YnVmZmVyczo6VHlwZVRhYmxlICpUZXN0U2ltcGxlVGFibGVXaXRoRW51bVR5cGVUYWJsZSgpOworCitpbmxpbmUgY29uc3QgZmxhdGJ1ZmZlcnM6OlR5cGVUYWJsZSAqVmVjM1R5cGVUYWJsZSgpOworCitpbmxpbmUgY29uc3QgZmxhdGJ1ZmZlcnM6OlR5cGVUYWJsZSAqQWJpbGl0eVR5cGVUYWJsZSgpOworCitpbmxpbmUgY29uc3QgZmxhdGJ1ZmZlcnM6OlR5cGVUYWJsZSAqU3RydWN0T2ZTdHJ1Y3RzVHlwZVRhYmxlKCk7CisKK2lubGluZSBjb25zdCBmbGF0YnVmZmVyczo6VHlwZVRhYmxlICpTdHJ1Y3RPZlN0cnVjdHNPZlN0cnVjdHNUeXBlVGFibGUoKTsKKworaW5saW5lIGNvbnN0IGZsYXRidWZmZXJzOjpUeXBlVGFibGUgKlN0YXRUeXBlVGFibGUoKTsKKworaW5saW5lIGNvbnN0IGZsYXRidWZmZXJzOjpUeXBlVGFibGUgKlJlZmVycmFibGVUeXBlVGFibGUoKTsKKworaW5saW5lIGNvbnN0IGZsYXRidWZmZXJzOjpUeXBlVGFibGUgKk1vbnN0ZXJUeXBlVGFibGUoKTsKKworaW5saW5lIGNvbnN0IGZsYXRidWZmZXJzOjpUeXBlVGFibGUgKlR5cGVBbGlhc2VzVHlwZVRhYmxlKCk7CisKKy8vLyBDb21wb3NpdGUgY29tcG9uZW50cyBvZiBNb25zdGVyIGNvbG9yLgorZW51bSBDb2xvciA6IHVpbnQ4X3QgeworICBDb2xvcl9SZWQgPSAxLAorICAvLy8gXGJyaWVmIGNvbG9yIEdyZWVuCisgIC8vLyBHcmVlbiBpcyBiaXRfZmxhZyB3aXRoIHZhbHVlICgxdSA8PCAxKQorICBDb2xvcl9HcmVlbiA9IDIsCisgIC8vLyBcYnJpZWYgY29sb3IgQmx1ZSAoMXUgPDwgMykKKyAgQ29sb3JfQmx1ZSA9IDgsCisgIENvbG9yX05PTkUgPSAwLAorICBDb2xvcl9BTlkgPSAxMQorfTsKKworaW5saW5lIGNvbnN0IENvbG9yICgmRW51bVZhbHVlc0NvbG9yKCkpWzNdIHsKKyAgc3RhdGljIGNvbnN0IENvbG9yIHZhbHVlc1tdID0geworICAgIENvbG9yX1JlZCwKKyAgICBDb2xvcl9HcmVlbiwKKyAgICBDb2xvcl9CbHVlCisgIH07CisgIHJldHVybiB2YWx1ZXM7Cit9CisKK2lubGluZSBjb25zdCBjaGFyICogY29uc3QgKkVudW1OYW1lc0NvbG9yKCkgeworICBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IG5hbWVzWzldID0geworICAgICJSZWQiLAorICAgICJHcmVlbiIsCisgICAgIiIsCisgICAgIiIsCisgICAgIiIsCisgICAgIiIsCisgICAgIiIsCisgICAgIkJsdWUiLAorICAgIG51bGxwdHIKKyAgfTsKKyAgcmV0dXJuIG5hbWVzOworfQorCitpbmxpbmUgY29uc3QgY2hhciAqRW51bU5hbWVDb2xvcihDb2xvciBlKSB7CisgIGlmIChmbGF0YnVmZmVyczo6SXNPdXRSYW5nZShlLCBDb2xvcl9SZWQsIENvbG9yX0JsdWUpKSByZXR1cm4gIiI7CisgIGNvbnN0IHNpemVfdCBpbmRleCA9IHN0YXRpY19jYXN0PHNpemVfdD4oZSkgLSBzdGF0aWNfY2FzdDxzaXplX3Q+KENvbG9yX1JlZCk7CisgIHJldHVybiBFbnVtTmFtZXNDb2xvcigpW2luZGV4XTsKK30KKworZW51bSBSYWNlIDogaW50OF90IHsKKyAgUmFjZV9Ob25lID0gLTEsCisgIFJhY2VfSHVtYW4gPSAwLAorICBSYWNlX0R3YXJmID0gMSwKKyAgUmFjZV9FbGYgPSAyLAorICBSYWNlX01JTiA9IFJhY2VfTm9uZSwKKyAgUmFjZV9NQVggPSBSYWNlX0VsZgorfTsKKworaW5saW5lIGNvbnN0IFJhY2UgKCZFbnVtVmFsdWVzUmFjZSgpKVs0XSB7CisgIHN0YXRpYyBjb25zdCBSYWNlIHZhbHVlc1tdID0geworICAgIFJhY2VfTm9uZSwKKyAgICBSYWNlX0h1bWFuLAorICAgIFJhY2VfRHdhcmYsCisgICAgUmFjZV9FbGYKKyAgfTsKKyAgcmV0dXJuIHZhbHVlczsKK30KKworaW5saW5lIGNvbnN0IGNoYXIgKiBjb25zdCAqRW51bU5hbWVzUmFjZSgpIHsKKyAgc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBuYW1lc1s1XSA9IHsKKyAgICAiTm9uZSIsCisgICAgIkh1bWFuIiwKKyAgICAiRHdhcmYiLAorICAgICJFbGYiLAorICAgIG51bGxwdHIKKyAgfTsKKyAgcmV0dXJuIG5hbWVzOworfQorCitpbmxpbmUgY29uc3QgY2hhciAqRW51bU5hbWVSYWNlKFJhY2UgZSkgeworICBpZiAoZmxhdGJ1ZmZlcnM6OklzT3V0UmFuZ2UoZSwgUmFjZV9Ob25lLCBSYWNlX0VsZikpIHJldHVybiAiIjsKKyAgY29uc3Qgc2l6ZV90IGluZGV4ID0gc3RhdGljX2Nhc3Q8c2l6ZV90PihlKSAtIHN0YXRpY19jYXN0PHNpemVfdD4oUmFjZV9Ob25lKTsKKyAgcmV0dXJuIEVudW1OYW1lc1JhY2UoKVtpbmRleF07Cit9CisKK2VudW0gTG9uZ0VudW0gOiB1aW50NjRfdCB7CisgIExvbmdFbnVtX0xvbmdPbmUgPSAyVUxMLAorICBMb25nRW51bV9Mb25nVHdvID0gNFVMTCwKKyAgTG9uZ0VudW1fTG9uZ0JpZyA9IDEwOTk1MTE2Mjc3NzZVTEwsCisgIExvbmdFbnVtX05PTkUgPSAwLAorICBMb25nRW51bV9BTlkgPSAxMDk5NTExNjI3NzgyVUxMCit9OworCitpbmxpbmUgY29uc3QgTG9uZ0VudW0gKCZFbnVtVmFsdWVzTG9uZ0VudW0oKSlbM10geworICBzdGF0aWMgY29uc3QgTG9uZ0VudW0gdmFsdWVzW10gPSB7CisgICAgTG9uZ0VudW1fTG9uZ09uZSwKKyAgICBMb25nRW51bV9Mb25nVHdvLAorICAgIExvbmdFbnVtX0xvbmdCaWcKKyAgfTsKKyAgcmV0dXJuIHZhbHVlczsKK30KKworaW5saW5lIGNvbnN0IGNoYXIgKkVudW1OYW1lTG9uZ0VudW0oTG9uZ0VudW0gZSkgeworICBzd2l0Y2ggKGUpIHsKKyAgICBjYXNlIExvbmdFbnVtX0xvbmdPbmU6IHJldHVybiAiTG9uZ09uZSI7CisgICAgY2FzZSBMb25nRW51bV9Mb25nVHdvOiByZXR1cm4gIkxvbmdUd28iOworICAgIGNhc2UgTG9uZ0VudW1fTG9uZ0JpZzogcmV0dXJuICJMb25nQmlnIjsKKyAgICBkZWZhdWx0OiByZXR1cm4gIiI7CisgIH0KK30KKworZW51bSBBbnkgOiB1aW50OF90IHsKKyAgQW55X05PTkUgPSAwLAorICBBbnlfTW9uc3RlciA9IDEsCisgIEFueV9UZXN0U2ltcGxlVGFibGVXaXRoRW51bSA9IDIsCisgIEFueV9NeUdhbWVfRXhhbXBsZTJfTW9uc3RlciA9IDMsCisgIEFueV9NSU4gPSBBbnlfTk9ORSwKKyAgQW55X01BWCA9IEFueV9NeUdhbWVfRXhhbXBsZTJfTW9uc3RlcgorfTsKKworaW5saW5lIGNvbnN0IEFueSAoJkVudW1WYWx1ZXNBbnkoKSlbNF0geworICBzdGF0aWMgY29uc3QgQW55IHZhbHVlc1tdID0geworICAgIEFueV9OT05FLAorICAgIEFueV9Nb25zdGVyLAorICAgIEFueV9UZXN0U2ltcGxlVGFibGVXaXRoRW51bSwKKyAgICBBbnlfTXlHYW1lX0V4YW1wbGUyX01vbnN0ZXIKKyAgfTsKKyAgcmV0dXJuIHZhbHVlczsKK30KKworaW5saW5lIGNvbnN0IGNoYXIgKiBjb25zdCAqRW51bU5hbWVzQW55KCkgeworICBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IG5hbWVzWzVdID0geworICAgICJOT05FIiwKKyAgICAiTW9uc3RlciIsCisgICAgIlRlc3RTaW1wbGVUYWJsZVdpdGhFbnVtIiwKKyAgICAiTXlHYW1lX0V4YW1wbGUyX01vbnN0ZXIiLAorICAgIG51bGxwdHIKKyAgfTsKKyAgcmV0dXJuIG5hbWVzOworfQorCitpbmxpbmUgY29uc3QgY2hhciAqRW51bU5hbWVBbnkoQW55IGUpIHsKKyAgaWYgKGZsYXRidWZmZXJzOjpJc091dFJhbmdlKGUsIEFueV9OT05FLCBBbnlfTXlHYW1lX0V4YW1wbGUyX01vbnN0ZXIpKSByZXR1cm4gIiI7CisgIGNvbnN0IHNpemVfdCBpbmRleCA9IHN0YXRpY19jYXN0PHNpemVfdD4oZSk7CisgIHJldHVybiBFbnVtTmFtZXNBbnkoKVtpbmRleF07Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+IHN0cnVjdCBBbnlUcmFpdHMgeworICBzdGF0aWMgY29uc3QgQW55IGVudW1fdmFsdWUgPSBBbnlfTk9ORTsKK307CisKK3RlbXBsYXRlPD4gc3RydWN0IEFueVRyYWl0czxNeUdhbWU6OkV4YW1wbGU6Ok1vbnN0ZXI+IHsKKyAgc3RhdGljIGNvbnN0IEFueSBlbnVtX3ZhbHVlID0gQW55X01vbnN0ZXI7Cit9OworCit0ZW1wbGF0ZTw+IHN0cnVjdCBBbnlUcmFpdHM8TXlHYW1lOjpFeGFtcGxlOjpUZXN0U2ltcGxlVGFibGVXaXRoRW51bT4geworICBzdGF0aWMgY29uc3QgQW55IGVudW1fdmFsdWUgPSBBbnlfVGVzdFNpbXBsZVRhYmxlV2l0aEVudW07Cit9OworCit0ZW1wbGF0ZTw+IHN0cnVjdCBBbnlUcmFpdHM8TXlHYW1lOjpFeGFtcGxlMjo6TW9uc3Rlcj4geworICBzdGF0aWMgY29uc3QgQW55IGVudW1fdmFsdWUgPSBBbnlfTXlHYW1lX0V4YW1wbGUyX01vbnN0ZXI7Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBzdHJ1Y3QgQW55VW5pb25UcmFpdHMgeworICBzdGF0aWMgY29uc3QgQW55IGVudW1fdmFsdWUgPSBBbnlfTk9ORTsKK307CisKK3RlbXBsYXRlPD4gc3RydWN0IEFueVVuaW9uVHJhaXRzPE15R2FtZTo6RXhhbXBsZTo6TW9uc3RlclQ+IHsKKyAgc3RhdGljIGNvbnN0IEFueSBlbnVtX3ZhbHVlID0gQW55X01vbnN0ZXI7Cit9OworCit0ZW1wbGF0ZTw+IHN0cnVjdCBBbnlVbmlvblRyYWl0czxNeUdhbWU6OkV4YW1wbGU6OlRlc3RTaW1wbGVUYWJsZVdpdGhFbnVtVD4geworICBzdGF0aWMgY29uc3QgQW55IGVudW1fdmFsdWUgPSBBbnlfVGVzdFNpbXBsZVRhYmxlV2l0aEVudW07Cit9OworCit0ZW1wbGF0ZTw+IHN0cnVjdCBBbnlVbmlvblRyYWl0czxNeUdhbWU6OkV4YW1wbGUyOjpNb25zdGVyVD4geworICBzdGF0aWMgY29uc3QgQW55IGVudW1fdmFsdWUgPSBBbnlfTXlHYW1lX0V4YW1wbGUyX01vbnN0ZXI7Cit9OworCitzdHJ1Y3QgQW55VW5pb24geworICBBbnkgdHlwZTsKKyAgdm9pZCAqdmFsdWU7CisKKyAgQW55VW5pb24oKSA6IHR5cGUoQW55X05PTkUpLCB2YWx1ZShudWxscHRyKSB7fQorICBBbnlVbmlvbihBbnlVbmlvbiYmIHUpIEZMQVRCVUZGRVJTX05PRVhDRVBUIDoKKyAgICB0eXBlKEFueV9OT05FKSwgdmFsdWUobnVsbHB0cikKKyAgICB7IHN0ZDo6c3dhcCh0eXBlLCB1LnR5cGUpOyBzdGQ6OnN3YXAodmFsdWUsIHUudmFsdWUpOyB9CisgIEFueVVuaW9uKGNvbnN0IEFueVVuaW9uICYpOworICBBbnlVbmlvbiAmb3BlcmF0b3I9KGNvbnN0IEFueVVuaW9uICZ1KQorICAgIHsgQW55VW5pb24gdCh1KTsgc3RkOjpzd2FwKHR5cGUsIHQudHlwZSk7IHN0ZDo6c3dhcCh2YWx1ZSwgdC52YWx1ZSk7IHJldHVybiAqdGhpczsgfQorICBBbnlVbmlvbiAmb3BlcmF0b3I9KEFueVVuaW9uICYmdSkgRkxBVEJVRkZFUlNfTk9FWENFUFQKKyAgICB7IHN0ZDo6c3dhcCh0eXBlLCB1LnR5cGUpOyBzdGQ6OnN3YXAodmFsdWUsIHUudmFsdWUpOyByZXR1cm4gKnRoaXM7IH0KKyAgfkFueVVuaW9uKCkgeyBSZXNldCgpOyB9CisKKyAgdm9pZCBSZXNldCgpOworCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICB2b2lkIFNldChUJiYgdmFsKSB7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBzdGQ6OnJlbW92ZV9yZWZlcmVuY2U8VD46OnR5cGUgUlQ7CisgICAgUmVzZXQoKTsKKyAgICB0eXBlID0gQW55VW5pb25UcmFpdHM8UlQ+OjplbnVtX3ZhbHVlOworICAgIGlmICh0eXBlICE9IEFueV9OT05FKSB7CisgICAgICB2YWx1ZSA9IG5ldyBSVChzdGQ6OmZvcndhcmQ8VD4odmFsKSk7CisgICAgfQorICB9CisKKyAgc3RhdGljIHZvaWQgKlVuUGFjayhjb25zdCB2b2lkICpvYmosIEFueSB0eXBlLCBjb25zdCBmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqcmVzb2x2ZXIpOworICBmbGF0YnVmZmVyczo6T2Zmc2V0PHZvaWQ+IFBhY2soZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyID0gbnVsbHB0cikgY29uc3Q7CisKKyAgTXlHYW1lOjpFeGFtcGxlOjpNb25zdGVyVCAqQXNNb25zdGVyKCkgeworICAgIHJldHVybiB0eXBlID09IEFueV9Nb25zdGVyID8KKyAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8TXlHYW1lOjpFeGFtcGxlOjpNb25zdGVyVCAqPih2YWx1ZSkgOiBudWxscHRyOworICB9CisgIGNvbnN0IE15R2FtZTo6RXhhbXBsZTo6TW9uc3RlclQgKkFzTW9uc3RlcigpIGNvbnN0IHsKKyAgICByZXR1cm4gdHlwZSA9PSBBbnlfTW9uc3RlciA/CisgICAgICByZWludGVycHJldF9jYXN0PGNvbnN0IE15R2FtZTo6RXhhbXBsZTo6TW9uc3RlclQgKj4odmFsdWUpIDogbnVsbHB0cjsKKyAgfQorICBNeUdhbWU6OkV4YW1wbGU6OlRlc3RTaW1wbGVUYWJsZVdpdGhFbnVtVCAqQXNUZXN0U2ltcGxlVGFibGVXaXRoRW51bSgpIHsKKyAgICByZXR1cm4gdHlwZSA9PSBBbnlfVGVzdFNpbXBsZVRhYmxlV2l0aEVudW0gPworICAgICAgcmVpbnRlcnByZXRfY2FzdDxNeUdhbWU6OkV4YW1wbGU6OlRlc3RTaW1wbGVUYWJsZVdpdGhFbnVtVCAqPih2YWx1ZSkgOiBudWxscHRyOworICB9CisgIGNvbnN0IE15R2FtZTo6RXhhbXBsZTo6VGVzdFNpbXBsZVRhYmxlV2l0aEVudW1UICpBc1Rlc3RTaW1wbGVUYWJsZVdpdGhFbnVtKCkgY29uc3QgeworICAgIHJldHVybiB0eXBlID09IEFueV9UZXN0U2ltcGxlVGFibGVXaXRoRW51bSA/CisgICAgICByZWludGVycHJldF9jYXN0PGNvbnN0IE15R2FtZTo6RXhhbXBsZTo6VGVzdFNpbXBsZVRhYmxlV2l0aEVudW1UICo+KHZhbHVlKSA6IG51bGxwdHI7CisgIH0KKyAgTXlHYW1lOjpFeGFtcGxlMjo6TW9uc3RlclQgKkFzTXlHYW1lX0V4YW1wbGUyX01vbnN0ZXIoKSB7CisgICAgcmV0dXJuIHR5cGUgPT0gQW55X015R2FtZV9FeGFtcGxlMl9Nb25zdGVyID8KKyAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8TXlHYW1lOjpFeGFtcGxlMjo6TW9uc3RlclQgKj4odmFsdWUpIDogbnVsbHB0cjsKKyAgfQorICBjb25zdCBNeUdhbWU6OkV4YW1wbGUyOjpNb25zdGVyVCAqQXNNeUdhbWVfRXhhbXBsZTJfTW9uc3RlcigpIGNvbnN0IHsKKyAgICByZXR1cm4gdHlwZSA9PSBBbnlfTXlHYW1lX0V4YW1wbGUyX01vbnN0ZXIgPworICAgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBNeUdhbWU6OkV4YW1wbGUyOjpNb25zdGVyVCAqPih2YWx1ZSkgOiBudWxscHRyOworICB9Cit9OworCisKK2lubGluZSBib29sIG9wZXJhdG9yPT0oY29uc3QgQW55VW5pb24gJmxocywgY29uc3QgQW55VW5pb24gJnJocykgeworICBpZiAobGhzLnR5cGUgIT0gcmhzLnR5cGUpIHJldHVybiBmYWxzZTsKKyAgc3dpdGNoIChsaHMudHlwZSkgeworICAgIGNhc2UgQW55X05PTkU6IHsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICBjYXNlIEFueV9Nb25zdGVyOiB7CisgICAgICByZXR1cm4gKihyZWludGVycHJldF9jYXN0PGNvbnN0IE15R2FtZTo6RXhhbXBsZTo6TW9uc3RlclQgKj4obGhzLnZhbHVlKSkgPT0KKyAgICAgICAgICAgICAqKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgTXlHYW1lOjpFeGFtcGxlOjpNb25zdGVyVCAqPihyaHMudmFsdWUpKTsKKyAgICB9CisgICAgY2FzZSBBbnlfVGVzdFNpbXBsZVRhYmxlV2l0aEVudW06IHsKKyAgICAgIHJldHVybiAqKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgTXlHYW1lOjpFeGFtcGxlOjpUZXN0U2ltcGxlVGFibGVXaXRoRW51bVQgKj4obGhzLnZhbHVlKSkgPT0KKyAgICAgICAgICAgICAqKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgTXlHYW1lOjpFeGFtcGxlOjpUZXN0U2ltcGxlVGFibGVXaXRoRW51bVQgKj4ocmhzLnZhbHVlKSk7CisgICAgfQorICAgIGNhc2UgQW55X015R2FtZV9FeGFtcGxlMl9Nb25zdGVyOiB7CisgICAgICByZXR1cm4gKihyZWludGVycHJldF9jYXN0PGNvbnN0IE15R2FtZTo6RXhhbXBsZTI6Ok1vbnN0ZXJUICo+KGxocy52YWx1ZSkpID09CisgICAgICAgICAgICAgKihyZWludGVycHJldF9jYXN0PGNvbnN0IE15R2FtZTo6RXhhbXBsZTI6Ok1vbnN0ZXJUICo+KHJocy52YWx1ZSkpOworICAgIH0KKyAgICBkZWZhdWx0OiB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICB9Cit9CisKK2lubGluZSBib29sIG9wZXJhdG9yIT0oY29uc3QgQW55VW5pb24gJmxocywgY29uc3QgQW55VW5pb24gJnJocykgeworICAgIHJldHVybiAhKGxocyA9PSByaHMpOworfQorCitib29sIFZlcmlmeUFueShmbGF0YnVmZmVyczo6VmVyaWZpZXIgJnZlcmlmaWVyLCBjb25zdCB2b2lkICpvYmosIEFueSB0eXBlKTsKK2Jvb2wgVmVyaWZ5QW55VmVjdG9yKGZsYXRidWZmZXJzOjpWZXJpZmllciAmdmVyaWZpZXIsIGNvbnN0IGZsYXRidWZmZXJzOjpWZWN0b3I8ZmxhdGJ1ZmZlcnM6Ok9mZnNldDx2b2lkPj4gKnZhbHVlcywgY29uc3QgZmxhdGJ1ZmZlcnM6OlZlY3Rvcjx1aW50OF90PiAqdHlwZXMpOworCitlbnVtIEFueVVuaXF1ZUFsaWFzZXMgOiB1aW50OF90IHsKKyAgQW55VW5pcXVlQWxpYXNlc19OT05FID0gMCwKKyAgQW55VW5pcXVlQWxpYXNlc19NID0gMSwKKyAgQW55VW5pcXVlQWxpYXNlc19UUyA9IDIsCisgIEFueVVuaXF1ZUFsaWFzZXNfTTIgPSAzLAorICBBbnlVbmlxdWVBbGlhc2VzX01JTiA9IEFueVVuaXF1ZUFsaWFzZXNfTk9ORSwKKyAgQW55VW5pcXVlQWxpYXNlc19NQVggPSBBbnlVbmlxdWVBbGlhc2VzX00yCit9OworCitpbmxpbmUgY29uc3QgQW55VW5pcXVlQWxpYXNlcyAoJkVudW1WYWx1ZXNBbnlVbmlxdWVBbGlhc2VzKCkpWzRdIHsKKyAgc3RhdGljIGNvbnN0IEFueVVuaXF1ZUFsaWFzZXMgdmFsdWVzW10gPSB7CisgICAgQW55VW5pcXVlQWxpYXNlc19OT05FLAorICAgIEFueVVuaXF1ZUFsaWFzZXNfTSwKKyAgICBBbnlVbmlxdWVBbGlhc2VzX1RTLAorICAgIEFueVVuaXF1ZUFsaWFzZXNfTTIKKyAgfTsKKyAgcmV0dXJuIHZhbHVlczsKK30KKworaW5saW5lIGNvbnN0IGNoYXIgKiBjb25zdCAqRW51bU5hbWVzQW55VW5pcXVlQWxpYXNlcygpIHsKKyAgc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBuYW1lc1s1XSA9IHsKKyAgICAiTk9ORSIsCisgICAgIk0iLAorICAgICJUUyIsCisgICAgIk0yIiwKKyAgICBudWxscHRyCisgIH07CisgIHJldHVybiBuYW1lczsKK30KKworaW5saW5lIGNvbnN0IGNoYXIgKkVudW1OYW1lQW55VW5pcXVlQWxpYXNlcyhBbnlVbmlxdWVBbGlhc2VzIGUpIHsKKyAgaWYgKGZsYXRidWZmZXJzOjpJc091dFJhbmdlKGUsIEFueVVuaXF1ZUFsaWFzZXNfTk9ORSwgQW55VW5pcXVlQWxpYXNlc19NMikpIHJldHVybiAiIjsKKyAgY29uc3Qgc2l6ZV90IGluZGV4ID0gc3RhdGljX2Nhc3Q8c2l6ZV90PihlKTsKKyAgcmV0dXJuIEVudW1OYW1lc0FueVVuaXF1ZUFsaWFzZXMoKVtpbmRleF07Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+IHN0cnVjdCBBbnlVbmlxdWVBbGlhc2VzVHJhaXRzIHsKKyAgc3RhdGljIGNvbnN0IEFueVVuaXF1ZUFsaWFzZXMgZW51bV92YWx1ZSA9IEFueVVuaXF1ZUFsaWFzZXNfTk9ORTsKK307CisKK3RlbXBsYXRlPD4gc3RydWN0IEFueVVuaXF1ZUFsaWFzZXNUcmFpdHM8TXlHYW1lOjpFeGFtcGxlOjpNb25zdGVyPiB7CisgIHN0YXRpYyBjb25zdCBBbnlVbmlxdWVBbGlhc2VzIGVudW1fdmFsdWUgPSBBbnlVbmlxdWVBbGlhc2VzX007Cit9OworCit0ZW1wbGF0ZTw+IHN0cnVjdCBBbnlVbmlxdWVBbGlhc2VzVHJhaXRzPE15R2FtZTo6RXhhbXBsZTo6VGVzdFNpbXBsZVRhYmxlV2l0aEVudW0+IHsKKyAgc3RhdGljIGNvbnN0IEFueVVuaXF1ZUFsaWFzZXMgZW51bV92YWx1ZSA9IEFueVVuaXF1ZUFsaWFzZXNfVFM7Cit9OworCit0ZW1wbGF0ZTw+IHN0cnVjdCBBbnlVbmlxdWVBbGlhc2VzVHJhaXRzPE15R2FtZTo6RXhhbXBsZTI6Ok1vbnN0ZXI+IHsKKyAgc3RhdGljIGNvbnN0IEFueVVuaXF1ZUFsaWFzZXMgZW51bV92YWx1ZSA9IEFueVVuaXF1ZUFsaWFzZXNfTTI7Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBzdHJ1Y3QgQW55VW5pcXVlQWxpYXNlc1VuaW9uVHJhaXRzIHsKKyAgc3RhdGljIGNvbnN0IEFueVVuaXF1ZUFsaWFzZXMgZW51bV92YWx1ZSA9IEFueVVuaXF1ZUFsaWFzZXNfTk9ORTsKK307CisKK3RlbXBsYXRlPD4gc3RydWN0IEFueVVuaXF1ZUFsaWFzZXNVbmlvblRyYWl0czxNeUdhbWU6OkV4YW1wbGU6Ok1vbnN0ZXJUPiB7CisgIHN0YXRpYyBjb25zdCBBbnlVbmlxdWVBbGlhc2VzIGVudW1fdmFsdWUgPSBBbnlVbmlxdWVBbGlhc2VzX007Cit9OworCit0ZW1wbGF0ZTw+IHN0cnVjdCBBbnlVbmlxdWVBbGlhc2VzVW5pb25UcmFpdHM8TXlHYW1lOjpFeGFtcGxlOjpUZXN0U2ltcGxlVGFibGVXaXRoRW51bVQ+IHsKKyAgc3RhdGljIGNvbnN0IEFueVVuaXF1ZUFsaWFzZXMgZW51bV92YWx1ZSA9IEFueVVuaXF1ZUFsaWFzZXNfVFM7Cit9OworCit0ZW1wbGF0ZTw+IHN0cnVjdCBBbnlVbmlxdWVBbGlhc2VzVW5pb25UcmFpdHM8TXlHYW1lOjpFeGFtcGxlMjo6TW9uc3RlclQ+IHsKKyAgc3RhdGljIGNvbnN0IEFueVVuaXF1ZUFsaWFzZXMgZW51bV92YWx1ZSA9IEFueVVuaXF1ZUFsaWFzZXNfTTI7Cit9OworCitzdHJ1Y3QgQW55VW5pcXVlQWxpYXNlc1VuaW9uIHsKKyAgQW55VW5pcXVlQWxpYXNlcyB0eXBlOworICB2b2lkICp2YWx1ZTsKKworICBBbnlVbmlxdWVBbGlhc2VzVW5pb24oKSA6IHR5cGUoQW55VW5pcXVlQWxpYXNlc19OT05FKSwgdmFsdWUobnVsbHB0cikge30KKyAgQW55VW5pcXVlQWxpYXNlc1VuaW9uKEFueVVuaXF1ZUFsaWFzZXNVbmlvbiYmIHUpIEZMQVRCVUZGRVJTX05PRVhDRVBUIDoKKyAgICB0eXBlKEFueVVuaXF1ZUFsaWFzZXNfTk9ORSksIHZhbHVlKG51bGxwdHIpCisgICAgeyBzdGQ6OnN3YXAodHlwZSwgdS50eXBlKTsgc3RkOjpzd2FwKHZhbHVlLCB1LnZhbHVlKTsgfQorICBBbnlVbmlxdWVBbGlhc2VzVW5pb24oY29uc3QgQW55VW5pcXVlQWxpYXNlc1VuaW9uICYpOworICBBbnlVbmlxdWVBbGlhc2VzVW5pb24gJm9wZXJhdG9yPShjb25zdCBBbnlVbmlxdWVBbGlhc2VzVW5pb24gJnUpCisgICAgeyBBbnlVbmlxdWVBbGlhc2VzVW5pb24gdCh1KTsgc3RkOjpzd2FwKHR5cGUsIHQudHlwZSk7IHN0ZDo6c3dhcCh2YWx1ZSwgdC52YWx1ZSk7IHJldHVybiAqdGhpczsgfQorICBBbnlVbmlxdWVBbGlhc2VzVW5pb24gJm9wZXJhdG9yPShBbnlVbmlxdWVBbGlhc2VzVW5pb24gJiZ1KSBGTEFUQlVGRkVSU19OT0VYQ0VQVAorICAgIHsgc3RkOjpzd2FwKHR5cGUsIHUudHlwZSk7IHN0ZDo6c3dhcCh2YWx1ZSwgdS52YWx1ZSk7IHJldHVybiAqdGhpczsgfQorICB+QW55VW5pcXVlQWxpYXNlc1VuaW9uKCkgeyBSZXNldCgpOyB9CisKKyAgdm9pZCBSZXNldCgpOworCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICB2b2lkIFNldChUJiYgdmFsKSB7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBzdGQ6OnJlbW92ZV9yZWZlcmVuY2U8VD46OnR5cGUgUlQ7CisgICAgUmVzZXQoKTsKKyAgICB0eXBlID0gQW55VW5pcXVlQWxpYXNlc1VuaW9uVHJhaXRzPFJUPjo6ZW51bV92YWx1ZTsKKyAgICBpZiAodHlwZSAhPSBBbnlVbmlxdWVBbGlhc2VzX05PTkUpIHsKKyAgICAgIHZhbHVlID0gbmV3IFJUKHN0ZDo6Zm9yd2FyZDxUPih2YWwpKTsKKyAgICB9CisgIH0KKworICBzdGF0aWMgdm9pZCAqVW5QYWNrKGNvbnN0IHZvaWQgKm9iaiwgQW55VW5pcXVlQWxpYXNlcyB0eXBlLCBjb25zdCBmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqcmVzb2x2ZXIpOworICBmbGF0YnVmZmVyczo6T2Zmc2V0PHZvaWQ+IFBhY2soZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyID0gbnVsbHB0cikgY29uc3Q7CisKKyAgTXlHYW1lOjpFeGFtcGxlOjpNb25zdGVyVCAqQXNNKCkgeworICAgIHJldHVybiB0eXBlID09IEFueVVuaXF1ZUFsaWFzZXNfTSA/CisgICAgICByZWludGVycHJldF9jYXN0PE15R2FtZTo6RXhhbXBsZTo6TW9uc3RlclQgKj4odmFsdWUpIDogbnVsbHB0cjsKKyAgfQorICBjb25zdCBNeUdhbWU6OkV4YW1wbGU6Ok1vbnN0ZXJUICpBc00oKSBjb25zdCB7CisgICAgcmV0dXJuIHR5cGUgPT0gQW55VW5pcXVlQWxpYXNlc19NID8KKyAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgTXlHYW1lOjpFeGFtcGxlOjpNb25zdGVyVCAqPih2YWx1ZSkgOiBudWxscHRyOworICB9CisgIE15R2FtZTo6RXhhbXBsZTo6VGVzdFNpbXBsZVRhYmxlV2l0aEVudW1UICpBc1RTKCkgeworICAgIHJldHVybiB0eXBlID09IEFueVVuaXF1ZUFsaWFzZXNfVFMgPworICAgICAgcmVpbnRlcnByZXRfY2FzdDxNeUdhbWU6OkV4YW1wbGU6OlRlc3RTaW1wbGVUYWJsZVdpdGhFbnVtVCAqPih2YWx1ZSkgOiBudWxscHRyOworICB9CisgIGNvbnN0IE15R2FtZTo6RXhhbXBsZTo6VGVzdFNpbXBsZVRhYmxlV2l0aEVudW1UICpBc1RTKCkgY29uc3QgeworICAgIHJldHVybiB0eXBlID09IEFueVVuaXF1ZUFsaWFzZXNfVFMgPworICAgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBNeUdhbWU6OkV4YW1wbGU6OlRlc3RTaW1wbGVUYWJsZVdpdGhFbnVtVCAqPih2YWx1ZSkgOiBudWxscHRyOworICB9CisgIE15R2FtZTo6RXhhbXBsZTI6Ok1vbnN0ZXJUICpBc00yKCkgeworICAgIHJldHVybiB0eXBlID09IEFueVVuaXF1ZUFsaWFzZXNfTTIgPworICAgICAgcmVpbnRlcnByZXRfY2FzdDxNeUdhbWU6OkV4YW1wbGUyOjpNb25zdGVyVCAqPih2YWx1ZSkgOiBudWxscHRyOworICB9CisgIGNvbnN0IE15R2FtZTo6RXhhbXBsZTI6Ok1vbnN0ZXJUICpBc00yKCkgY29uc3QgeworICAgIHJldHVybiB0eXBlID09IEFueVVuaXF1ZUFsaWFzZXNfTTIgPworICAgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBNeUdhbWU6OkV4YW1wbGUyOjpNb25zdGVyVCAqPih2YWx1ZSkgOiBudWxscHRyOworICB9Cit9OworCisKK2lubGluZSBib29sIG9wZXJhdG9yPT0oY29uc3QgQW55VW5pcXVlQWxpYXNlc1VuaW9uICZsaHMsIGNvbnN0IEFueVVuaXF1ZUFsaWFzZXNVbmlvbiAmcmhzKSB7CisgIGlmIChsaHMudHlwZSAhPSByaHMudHlwZSkgcmV0dXJuIGZhbHNlOworICBzd2l0Y2ggKGxocy50eXBlKSB7CisgICAgY2FzZSBBbnlVbmlxdWVBbGlhc2VzX05PTkU6IHsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICBjYXNlIEFueVVuaXF1ZUFsaWFzZXNfTTogeworICAgICAgcmV0dXJuICoocmVpbnRlcnByZXRfY2FzdDxjb25zdCBNeUdhbWU6OkV4YW1wbGU6Ok1vbnN0ZXJUICo+KGxocy52YWx1ZSkpID09CisgICAgICAgICAgICAgKihyZWludGVycHJldF9jYXN0PGNvbnN0IE15R2FtZTo6RXhhbXBsZTo6TW9uc3RlclQgKj4ocmhzLnZhbHVlKSk7CisgICAgfQorICAgIGNhc2UgQW55VW5pcXVlQWxpYXNlc19UUzogeworICAgICAgcmV0dXJuICoocmVpbnRlcnByZXRfY2FzdDxjb25zdCBNeUdhbWU6OkV4YW1wbGU6OlRlc3RTaW1wbGVUYWJsZVdpdGhFbnVtVCAqPihsaHMudmFsdWUpKSA9PQorICAgICAgICAgICAgICoocmVpbnRlcnByZXRfY2FzdDxjb25zdCBNeUdhbWU6OkV4YW1wbGU6OlRlc3RTaW1wbGVUYWJsZVdpdGhFbnVtVCAqPihyaHMudmFsdWUpKTsKKyAgICB9CisgICAgY2FzZSBBbnlVbmlxdWVBbGlhc2VzX00yOiB7CisgICAgICByZXR1cm4gKihyZWludGVycHJldF9jYXN0PGNvbnN0IE15R2FtZTo6RXhhbXBsZTI6Ok1vbnN0ZXJUICo+KGxocy52YWx1ZSkpID09CisgICAgICAgICAgICAgKihyZWludGVycHJldF9jYXN0PGNvbnN0IE15R2FtZTo6RXhhbXBsZTI6Ok1vbnN0ZXJUICo+KHJocy52YWx1ZSkpOworICAgIH0KKyAgICBkZWZhdWx0OiB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICB9Cit9CisKK2lubGluZSBib29sIG9wZXJhdG9yIT0oY29uc3QgQW55VW5pcXVlQWxpYXNlc1VuaW9uICZsaHMsIGNvbnN0IEFueVVuaXF1ZUFsaWFzZXNVbmlvbiAmcmhzKSB7CisgICAgcmV0dXJuICEobGhzID09IHJocyk7Cit9CisKK2Jvb2wgVmVyaWZ5QW55VW5pcXVlQWxpYXNlcyhmbGF0YnVmZmVyczo6VmVyaWZpZXIgJnZlcmlmaWVyLCBjb25zdCB2b2lkICpvYmosIEFueVVuaXF1ZUFsaWFzZXMgdHlwZSk7Citib29sIFZlcmlmeUFueVVuaXF1ZUFsaWFzZXNWZWN0b3IoZmxhdGJ1ZmZlcnM6OlZlcmlmaWVyICZ2ZXJpZmllciwgY29uc3QgZmxhdGJ1ZmZlcnM6OlZlY3RvcjxmbGF0YnVmZmVyczo6T2Zmc2V0PHZvaWQ+PiAqdmFsdWVzLCBjb25zdCBmbGF0YnVmZmVyczo6VmVjdG9yPHVpbnQ4X3Q+ICp0eXBlcyk7CisKK2VudW0gQW55QW1iaWd1b3VzQWxpYXNlcyA6IHVpbnQ4X3QgeworICBBbnlBbWJpZ3VvdXNBbGlhc2VzX05PTkUgPSAwLAorICBBbnlBbWJpZ3VvdXNBbGlhc2VzX00xID0gMSwKKyAgQW55QW1iaWd1b3VzQWxpYXNlc19NMiA9IDIsCisgIEFueUFtYmlndW91c0FsaWFzZXNfTTMgPSAzLAorICBBbnlBbWJpZ3VvdXNBbGlhc2VzX01JTiA9IEFueUFtYmlndW91c0FsaWFzZXNfTk9ORSwKKyAgQW55QW1iaWd1b3VzQWxpYXNlc19NQVggPSBBbnlBbWJpZ3VvdXNBbGlhc2VzX00zCit9OworCitpbmxpbmUgY29uc3QgQW55QW1iaWd1b3VzQWxpYXNlcyAoJkVudW1WYWx1ZXNBbnlBbWJpZ3VvdXNBbGlhc2VzKCkpWzRdIHsKKyAgc3RhdGljIGNvbnN0IEFueUFtYmlndW91c0FsaWFzZXMgdmFsdWVzW10gPSB7CisgICAgQW55QW1iaWd1b3VzQWxpYXNlc19OT05FLAorICAgIEFueUFtYmlndW91c0FsaWFzZXNfTTEsCisgICAgQW55QW1iaWd1b3VzQWxpYXNlc19NMiwKKyAgICBBbnlBbWJpZ3VvdXNBbGlhc2VzX00zCisgIH07CisgIHJldHVybiB2YWx1ZXM7Cit9CisKK2lubGluZSBjb25zdCBjaGFyICogY29uc3QgKkVudW1OYW1lc0FueUFtYmlndW91c0FsaWFzZXMoKSB7CisgIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgbmFtZXNbNV0gPSB7CisgICAgIk5PTkUiLAorICAgICJNMSIsCisgICAgIk0yIiwKKyAgICAiTTMiLAorICAgIG51bGxwdHIKKyAgfTsKKyAgcmV0dXJuIG5hbWVzOworfQorCitpbmxpbmUgY29uc3QgY2hhciAqRW51bU5hbWVBbnlBbWJpZ3VvdXNBbGlhc2VzKEFueUFtYmlndW91c0FsaWFzZXMgZSkgeworICBpZiAoZmxhdGJ1ZmZlcnM6OklzT3V0UmFuZ2UoZSwgQW55QW1iaWd1b3VzQWxpYXNlc19OT05FLCBBbnlBbWJpZ3VvdXNBbGlhc2VzX00zKSkgcmV0dXJuICIiOworICBjb25zdCBzaXplX3QgaW5kZXggPSBzdGF0aWNfY2FzdDxzaXplX3Q+KGUpOworICByZXR1cm4gRW51bU5hbWVzQW55QW1iaWd1b3VzQWxpYXNlcygpW2luZGV4XTsKK30KKworc3RydWN0IEFueUFtYmlndW91c0FsaWFzZXNVbmlvbiB7CisgIEFueUFtYmlndW91c0FsaWFzZXMgdHlwZTsKKyAgdm9pZCAqdmFsdWU7CisKKyAgQW55QW1iaWd1b3VzQWxpYXNlc1VuaW9uKCkgOiB0eXBlKEFueUFtYmlndW91c0FsaWFzZXNfTk9ORSksIHZhbHVlKG51bGxwdHIpIHt9CisgIEFueUFtYmlndW91c0FsaWFzZXNVbmlvbihBbnlBbWJpZ3VvdXNBbGlhc2VzVW5pb24mJiB1KSBGTEFUQlVGRkVSU19OT0VYQ0VQVCA6CisgICAgdHlwZShBbnlBbWJpZ3VvdXNBbGlhc2VzX05PTkUpLCB2YWx1ZShudWxscHRyKQorICAgIHsgc3RkOjpzd2FwKHR5cGUsIHUudHlwZSk7IHN0ZDo6c3dhcCh2YWx1ZSwgdS52YWx1ZSk7IH0KKyAgQW55QW1iaWd1b3VzQWxpYXNlc1VuaW9uKGNvbnN0IEFueUFtYmlndW91c0FsaWFzZXNVbmlvbiAmKTsKKyAgQW55QW1iaWd1b3VzQWxpYXNlc1VuaW9uICZvcGVyYXRvcj0oY29uc3QgQW55QW1iaWd1b3VzQWxpYXNlc1VuaW9uICZ1KQorICAgIHsgQW55QW1iaWd1b3VzQWxpYXNlc1VuaW9uIHQodSk7IHN0ZDo6c3dhcCh0eXBlLCB0LnR5cGUpOyBzdGQ6OnN3YXAodmFsdWUsIHQudmFsdWUpOyByZXR1cm4gKnRoaXM7IH0KKyAgQW55QW1iaWd1b3VzQWxpYXNlc1VuaW9uICZvcGVyYXRvcj0oQW55QW1iaWd1b3VzQWxpYXNlc1VuaW9uICYmdSkgRkxBVEJVRkZFUlNfTk9FWENFUFQKKyAgICB7IHN0ZDo6c3dhcCh0eXBlLCB1LnR5cGUpOyBzdGQ6OnN3YXAodmFsdWUsIHUudmFsdWUpOyByZXR1cm4gKnRoaXM7IH0KKyAgfkFueUFtYmlndW91c0FsaWFzZXNVbmlvbigpIHsgUmVzZXQoKTsgfQorCisgIHZvaWQgUmVzZXQoKTsKKworICBzdGF0aWMgdm9pZCAqVW5QYWNrKGNvbnN0IHZvaWQgKm9iaiwgQW55QW1iaWd1b3VzQWxpYXNlcyB0eXBlLCBjb25zdCBmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqcmVzb2x2ZXIpOworICBmbGF0YnVmZmVyczo6T2Zmc2V0PHZvaWQ+IFBhY2soZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyID0gbnVsbHB0cikgY29uc3Q7CisKKyAgTXlHYW1lOjpFeGFtcGxlOjpNb25zdGVyVCAqQXNNMSgpIHsKKyAgICByZXR1cm4gdHlwZSA9PSBBbnlBbWJpZ3VvdXNBbGlhc2VzX00xID8KKyAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8TXlHYW1lOjpFeGFtcGxlOjpNb25zdGVyVCAqPih2YWx1ZSkgOiBudWxscHRyOworICB9CisgIGNvbnN0IE15R2FtZTo6RXhhbXBsZTo6TW9uc3RlclQgKkFzTTEoKSBjb25zdCB7CisgICAgcmV0dXJuIHR5cGUgPT0gQW55QW1iaWd1b3VzQWxpYXNlc19NMSA/CisgICAgICByZWludGVycHJldF9jYXN0PGNvbnN0IE15R2FtZTo6RXhhbXBsZTo6TW9uc3RlclQgKj4odmFsdWUpIDogbnVsbHB0cjsKKyAgfQorICBNeUdhbWU6OkV4YW1wbGU6Ok1vbnN0ZXJUICpBc00yKCkgeworICAgIHJldHVybiB0eXBlID09IEFueUFtYmlndW91c0FsaWFzZXNfTTIgPworICAgICAgcmVpbnRlcnByZXRfY2FzdDxNeUdhbWU6OkV4YW1wbGU6Ok1vbnN0ZXJUICo+KHZhbHVlKSA6IG51bGxwdHI7CisgIH0KKyAgY29uc3QgTXlHYW1lOjpFeGFtcGxlOjpNb25zdGVyVCAqQXNNMigpIGNvbnN0IHsKKyAgICByZXR1cm4gdHlwZSA9PSBBbnlBbWJpZ3VvdXNBbGlhc2VzX00yID8KKyAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgTXlHYW1lOjpFeGFtcGxlOjpNb25zdGVyVCAqPih2YWx1ZSkgOiBudWxscHRyOworICB9CisgIE15R2FtZTo6RXhhbXBsZTo6TW9uc3RlclQgKkFzTTMoKSB7CisgICAgcmV0dXJuIHR5cGUgPT0gQW55QW1iaWd1b3VzQWxpYXNlc19NMyA/CisgICAgICByZWludGVycHJldF9jYXN0PE15R2FtZTo6RXhhbXBsZTo6TW9uc3RlclQgKj4odmFsdWUpIDogbnVsbHB0cjsKKyAgfQorICBjb25zdCBNeUdhbWU6OkV4YW1wbGU6Ok1vbnN0ZXJUICpBc00zKCkgY29uc3QgeworICAgIHJldHVybiB0eXBlID09IEFueUFtYmlndW91c0FsaWFzZXNfTTMgPworICAgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBNeUdhbWU6OkV4YW1wbGU6Ok1vbnN0ZXJUICo+KHZhbHVlKSA6IG51bGxwdHI7CisgIH0KK307CisKKworaW5saW5lIGJvb2wgb3BlcmF0b3I9PShjb25zdCBBbnlBbWJpZ3VvdXNBbGlhc2VzVW5pb24gJmxocywgY29uc3QgQW55QW1iaWd1b3VzQWxpYXNlc1VuaW9uICZyaHMpIHsKKyAgaWYgKGxocy50eXBlICE9IHJocy50eXBlKSByZXR1cm4gZmFsc2U7CisgIHN3aXRjaCAobGhzLnR5cGUpIHsKKyAgICBjYXNlIEFueUFtYmlndW91c0FsaWFzZXNfTk9ORTogeworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIGNhc2UgQW55QW1iaWd1b3VzQWxpYXNlc19NMTogeworICAgICAgcmV0dXJuICoocmVpbnRlcnByZXRfY2FzdDxjb25zdCBNeUdhbWU6OkV4YW1wbGU6Ok1vbnN0ZXJUICo+KGxocy52YWx1ZSkpID09CisgICAgICAgICAgICAgKihyZWludGVycHJldF9jYXN0PGNvbnN0IE15R2FtZTo6RXhhbXBsZTo6TW9uc3RlclQgKj4ocmhzLnZhbHVlKSk7CisgICAgfQorICAgIGNhc2UgQW55QW1iaWd1b3VzQWxpYXNlc19NMjogeworICAgICAgcmV0dXJuICoocmVpbnRlcnByZXRfY2FzdDxjb25zdCBNeUdhbWU6OkV4YW1wbGU6Ok1vbnN0ZXJUICo+KGxocy52YWx1ZSkpID09CisgICAgICAgICAgICAgKihyZWludGVycHJldF9jYXN0PGNvbnN0IE15R2FtZTo6RXhhbXBsZTo6TW9uc3RlclQgKj4ocmhzLnZhbHVlKSk7CisgICAgfQorICAgIGNhc2UgQW55QW1iaWd1b3VzQWxpYXNlc19NMzogeworICAgICAgcmV0dXJuICoocmVpbnRlcnByZXRfY2FzdDxjb25zdCBNeUdhbWU6OkV4YW1wbGU6Ok1vbnN0ZXJUICo+KGxocy52YWx1ZSkpID09CisgICAgICAgICAgICAgKihyZWludGVycHJldF9jYXN0PGNvbnN0IE15R2FtZTo6RXhhbXBsZTo6TW9uc3RlclQgKj4ocmhzLnZhbHVlKSk7CisgICAgfQorICAgIGRlZmF1bHQ6IHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgIH0KK30KKworaW5saW5lIGJvb2wgb3BlcmF0b3IhPShjb25zdCBBbnlBbWJpZ3VvdXNBbGlhc2VzVW5pb24gJmxocywgY29uc3QgQW55QW1iaWd1b3VzQWxpYXNlc1VuaW9uICZyaHMpIHsKKyAgICByZXR1cm4gIShsaHMgPT0gcmhzKTsKK30KKworYm9vbCBWZXJpZnlBbnlBbWJpZ3VvdXNBbGlhc2VzKGZsYXRidWZmZXJzOjpWZXJpZmllciAmdmVyaWZpZXIsIGNvbnN0IHZvaWQgKm9iaiwgQW55QW1iaWd1b3VzQWxpYXNlcyB0eXBlKTsKK2Jvb2wgVmVyaWZ5QW55QW1iaWd1b3VzQWxpYXNlc1ZlY3RvcihmbGF0YnVmZmVyczo6VmVyaWZpZXIgJnZlcmlmaWVyLCBjb25zdCBmbGF0YnVmZmVyczo6VmVjdG9yPGZsYXRidWZmZXJzOjpPZmZzZXQ8dm9pZD4+ICp2YWx1ZXMsIGNvbnN0IGZsYXRidWZmZXJzOjpWZWN0b3I8dWludDhfdD4gKnR5cGVzKTsKKworRkxBVEJVRkZFUlNfTUFOVUFMTFlfQUxJR05FRF9TVFJVQ1QoMikgVGVzdCBGTEFUQlVGRkVSU19GSU5BTF9DTEFTUyB7CisgcHJpdmF0ZToKKyAgaW50MTZfdCBhXzsKKyAgaW50OF90IGJfOworICBpbnQ4X3QgcGFkZGluZzBfXzsKKworIHB1YmxpYzoKKyAgc3RhdGljIGNvbnN0IGZsYXRidWZmZXJzOjpUeXBlVGFibGUgKk1pbmlSZWZsZWN0VHlwZVRhYmxlKCkgeworICAgIHJldHVybiBUZXN0VHlwZVRhYmxlKCk7CisgIH0KKyAgVGVzdCgpCisgICAgICA6IGFfKDApLAorICAgICAgICBiXygwKSwKKyAgICAgICAgcGFkZGluZzBfXygwKSB7CisgICAgKHZvaWQpcGFkZGluZzBfXzsKKyAgfQorICBUZXN0KGludDE2X3QgX2EsIGludDhfdCBfYikKKyAgICAgIDogYV8oZmxhdGJ1ZmZlcnM6OkVuZGlhblNjYWxhcihfYSkpLAorICAgICAgICBiXyhmbGF0YnVmZmVyczo6RW5kaWFuU2NhbGFyKF9iKSksCisgICAgICAgIHBhZGRpbmcwX18oMCkgeworICAgICh2b2lkKXBhZGRpbmcwX187CisgIH0KKyAgaW50MTZfdCBhKCkgY29uc3QgeworICAgIHJldHVybiBmbGF0YnVmZmVyczo6RW5kaWFuU2NhbGFyKGFfKTsKKyAgfQorICB2b2lkIG11dGF0ZV9hKGludDE2X3QgX2EpIHsKKyAgICBmbGF0YnVmZmVyczo6V3JpdGVTY2FsYXIoJmFfLCBfYSk7CisgIH0KKyAgaW50OF90IGIoKSBjb25zdCB7CisgICAgcmV0dXJuIGZsYXRidWZmZXJzOjpFbmRpYW5TY2FsYXIoYl8pOworICB9CisgIHZvaWQgbXV0YXRlX2IoaW50OF90IF9iKSB7CisgICAgZmxhdGJ1ZmZlcnM6OldyaXRlU2NhbGFyKCZiXywgX2IpOworICB9Cit9OworRkxBVEJVRkZFUlNfU1RSVUNUX0VORChUZXN0LCA0KTsKKworaW5saW5lIGJvb2wgb3BlcmF0b3I9PShjb25zdCBUZXN0ICZsaHMsIGNvbnN0IFRlc3QgJnJocykgeworICByZXR1cm4KKyAgICAgIChsaHMuYSgpID09IHJocy5hKCkpICYmCisgICAgICAobGhzLmIoKSA9PSByaHMuYigpKTsKK30KKworaW5saW5lIGJvb2wgb3BlcmF0b3IhPShjb25zdCBUZXN0ICZsaHMsIGNvbnN0IFRlc3QgJnJocykgeworICAgIHJldHVybiAhKGxocyA9PSByaHMpOworfQorCisKK0ZMQVRCVUZGRVJTX01BTlVBTExZX0FMSUdORURfU1RSVUNUKDgpIFZlYzMgRkxBVEJVRkZFUlNfRklOQUxfQ0xBU1MgeworIHByaXZhdGU6CisgIGZsb2F0IHhfOworICBmbG9hdCB5XzsKKyAgZmxvYXQgel87CisgIGludDMyX3QgcGFkZGluZzBfXzsKKyAgZG91YmxlIHRlc3QxXzsKKyAgdWludDhfdCB0ZXN0Ml87CisgIGludDhfdCBwYWRkaW5nMV9fOworICBNeUdhbWU6OkV4YW1wbGU6OlRlc3QgdGVzdDNfOworICBpbnQxNl90IHBhZGRpbmcyX187CisKKyBwdWJsaWM6CisgIHN0YXRpYyBjb25zdCBmbGF0YnVmZmVyczo6VHlwZVRhYmxlICpNaW5pUmVmbGVjdFR5cGVUYWJsZSgpIHsKKyAgICByZXR1cm4gVmVjM1R5cGVUYWJsZSgpOworICB9CisgIFZlYzMoKQorICAgICAgOiB4XygwKSwKKyAgICAgICAgeV8oMCksCisgICAgICAgIHpfKDApLAorICAgICAgICBwYWRkaW5nMF9fKDApLAorICAgICAgICB0ZXN0MV8oMCksCisgICAgICAgIHRlc3QyXygwKSwKKyAgICAgICAgcGFkZGluZzFfXygwKSwKKyAgICAgICAgdGVzdDNfKCksCisgICAgICAgIHBhZGRpbmcyX18oMCkgeworICAgICh2b2lkKXBhZGRpbmcwX187CisgICAgKHZvaWQpcGFkZGluZzFfXzsKKyAgICAodm9pZClwYWRkaW5nMl9fOworICB9CisgIFZlYzMoZmxvYXQgX3gsIGZsb2F0IF95LCBmbG9hdCBfeiwgZG91YmxlIF90ZXN0MSwgTXlHYW1lOjpFeGFtcGxlOjpDb2xvciBfdGVzdDIsIGNvbnN0IE15R2FtZTo6RXhhbXBsZTo6VGVzdCAmX3Rlc3QzKQorICAgICAgOiB4XyhmbGF0YnVmZmVyczo6RW5kaWFuU2NhbGFyKF94KSksCisgICAgICAgIHlfKGZsYXRidWZmZXJzOjpFbmRpYW5TY2FsYXIoX3kpKSwKKyAgICAgICAgel8oZmxhdGJ1ZmZlcnM6OkVuZGlhblNjYWxhcihfeikpLAorICAgICAgICBwYWRkaW5nMF9fKDApLAorICAgICAgICB0ZXN0MV8oZmxhdGJ1ZmZlcnM6OkVuZGlhblNjYWxhcihfdGVzdDEpKSwKKyAgICAgICAgdGVzdDJfKGZsYXRidWZmZXJzOjpFbmRpYW5TY2FsYXIoc3RhdGljX2Nhc3Q8dWludDhfdD4oX3Rlc3QyKSkpLAorICAgICAgICBwYWRkaW5nMV9fKDApLAorICAgICAgICB0ZXN0M18oX3Rlc3QzKSwKKyAgICAgICAgcGFkZGluZzJfXygwKSB7CisgICAgKHZvaWQpcGFkZGluZzBfXzsKKyAgICAodm9pZClwYWRkaW5nMV9fOworICAgICh2b2lkKXBhZGRpbmcyX187CisgIH0KKyAgZmxvYXQgeCgpIGNvbnN0IHsKKyAgICByZXR1cm4gZmxhdGJ1ZmZlcnM6OkVuZGlhblNjYWxhcih4Xyk7CisgIH0KKyAgdm9pZCBtdXRhdGVfeChmbG9hdCBfeCkgeworICAgIGZsYXRidWZmZXJzOjpXcml0ZVNjYWxhcigmeF8sIF94KTsKKyAgfQorICBmbG9hdCB5KCkgY29uc3QgeworICAgIHJldHVybiBmbGF0YnVmZmVyczo6RW5kaWFuU2NhbGFyKHlfKTsKKyAgfQorICB2b2lkIG11dGF0ZV95KGZsb2F0IF95KSB7CisgICAgZmxhdGJ1ZmZlcnM6OldyaXRlU2NhbGFyKCZ5XywgX3kpOworICB9CisgIGZsb2F0IHooKSBjb25zdCB7CisgICAgcmV0dXJuIGZsYXRidWZmZXJzOjpFbmRpYW5TY2FsYXIoel8pOworICB9CisgIHZvaWQgbXV0YXRlX3ooZmxvYXQgX3opIHsKKyAgICBmbGF0YnVmZmVyczo6V3JpdGVTY2FsYXIoJnpfLCBfeik7CisgIH0KKyAgZG91YmxlIHRlc3QxKCkgY29uc3QgeworICAgIHJldHVybiBmbGF0YnVmZmVyczo6RW5kaWFuU2NhbGFyKHRlc3QxXyk7CisgIH0KKyAgdm9pZCBtdXRhdGVfdGVzdDEoZG91YmxlIF90ZXN0MSkgeworICAgIGZsYXRidWZmZXJzOjpXcml0ZVNjYWxhcigmdGVzdDFfLCBfdGVzdDEpOworICB9CisgIE15R2FtZTo6RXhhbXBsZTo6Q29sb3IgdGVzdDIoKSBjb25zdCB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PE15R2FtZTo6RXhhbXBsZTo6Q29sb3I+KGZsYXRidWZmZXJzOjpFbmRpYW5TY2FsYXIodGVzdDJfKSk7CisgIH0KKyAgdm9pZCBtdXRhdGVfdGVzdDIoTXlHYW1lOjpFeGFtcGxlOjpDb2xvciBfdGVzdDIpIHsKKyAgICBmbGF0YnVmZmVyczo6V3JpdGVTY2FsYXIoJnRlc3QyXywgc3RhdGljX2Nhc3Q8dWludDhfdD4oX3Rlc3QyKSk7CisgIH0KKyAgY29uc3QgTXlHYW1lOjpFeGFtcGxlOjpUZXN0ICZ0ZXN0MygpIGNvbnN0IHsKKyAgICByZXR1cm4gdGVzdDNfOworICB9CisgIE15R2FtZTo6RXhhbXBsZTo6VGVzdCAmbXV0YWJsZV90ZXN0MygpIHsKKyAgICByZXR1cm4gdGVzdDNfOworICB9Cit9OworRkxBVEJVRkZFUlNfU1RSVUNUX0VORChWZWMzLCAzMik7CisKK2lubGluZSBib29sIG9wZXJhdG9yPT0oY29uc3QgVmVjMyAmbGhzLCBjb25zdCBWZWMzICZyaHMpIHsKKyAgcmV0dXJuCisgICAgICAobGhzLngoKSA9PSByaHMueCgpKSAmJgorICAgICAgKGxocy55KCkgPT0gcmhzLnkoKSkgJiYKKyAgICAgIChsaHMueigpID09IHJocy56KCkpICYmCisgICAgICAobGhzLnRlc3QxKCkgPT0gcmhzLnRlc3QxKCkpICYmCisgICAgICAobGhzLnRlc3QyKCkgPT0gcmhzLnRlc3QyKCkpICYmCisgICAgICAobGhzLnRlc3QzKCkgPT0gcmhzLnRlc3QzKCkpOworfQorCitpbmxpbmUgYm9vbCBvcGVyYXRvciE9KGNvbnN0IFZlYzMgJmxocywgY29uc3QgVmVjMyAmcmhzKSB7CisgICAgcmV0dXJuICEobGhzID09IHJocyk7Cit9CisKKworRkxBVEJVRkZFUlNfTUFOVUFMTFlfQUxJR05FRF9TVFJVQ1QoNCkgQWJpbGl0eSBGTEFUQlVGRkVSU19GSU5BTF9DTEFTUyB7CisgcHJpdmF0ZToKKyAgdWludDMyX3QgaWRfOworICB1aW50MzJfdCBkaXN0YW5jZV87CisKKyBwdWJsaWM6CisgIHN0YXRpYyBjb25zdCBmbGF0YnVmZmVyczo6VHlwZVRhYmxlICpNaW5pUmVmbGVjdFR5cGVUYWJsZSgpIHsKKyAgICByZXR1cm4gQWJpbGl0eVR5cGVUYWJsZSgpOworICB9CisgIEFiaWxpdHkoKQorICAgICAgOiBpZF8oMCksCisgICAgICAgIGRpc3RhbmNlXygwKSB7CisgIH0KKyAgQWJpbGl0eSh1aW50MzJfdCBfaWQsIHVpbnQzMl90IF9kaXN0YW5jZSkKKyAgICAgIDogaWRfKGZsYXRidWZmZXJzOjpFbmRpYW5TY2FsYXIoX2lkKSksCisgICAgICAgIGRpc3RhbmNlXyhmbGF0YnVmZmVyczo6RW5kaWFuU2NhbGFyKF9kaXN0YW5jZSkpIHsKKyAgfQorICB1aW50MzJfdCBpZCgpIGNvbnN0IHsKKyAgICByZXR1cm4gZmxhdGJ1ZmZlcnM6OkVuZGlhblNjYWxhcihpZF8pOworICB9CisgIHZvaWQgbXV0YXRlX2lkKHVpbnQzMl90IF9pZCkgeworICAgIGZsYXRidWZmZXJzOjpXcml0ZVNjYWxhcigmaWRfLCBfaWQpOworICB9CisgIGJvb2wgS2V5Q29tcGFyZUxlc3NUaGFuKGNvbnN0IEFiaWxpdHkgKm8pIGNvbnN0IHsKKyAgICByZXR1cm4gaWQoKSA8IG8tPmlkKCk7CisgIH0KKyAgaW50IEtleUNvbXBhcmVXaXRoVmFsdWUodWludDMyX3QgX2lkKSBjb25zdCB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PGludD4oaWQoKSA+IF9pZCkgLSBzdGF0aWNfY2FzdDxpbnQ+KGlkKCkgPCBfaWQpOworICB9CisgIHVpbnQzMl90IGRpc3RhbmNlKCkgY29uc3QgeworICAgIHJldHVybiBmbGF0YnVmZmVyczo6RW5kaWFuU2NhbGFyKGRpc3RhbmNlXyk7CisgIH0KKyAgdm9pZCBtdXRhdGVfZGlzdGFuY2UodWludDMyX3QgX2Rpc3RhbmNlKSB7CisgICAgZmxhdGJ1ZmZlcnM6OldyaXRlU2NhbGFyKCZkaXN0YW5jZV8sIF9kaXN0YW5jZSk7CisgIH0KK307CitGTEFUQlVGRkVSU19TVFJVQ1RfRU5EKEFiaWxpdHksIDgpOworCitpbmxpbmUgYm9vbCBvcGVyYXRvcj09KGNvbnN0IEFiaWxpdHkgJmxocywgY29uc3QgQWJpbGl0eSAmcmhzKSB7CisgIHJldHVybgorICAgICAgKGxocy5pZCgpID09IHJocy5pZCgpKSAmJgorICAgICAgKGxocy5kaXN0YW5jZSgpID09IHJocy5kaXN0YW5jZSgpKTsKK30KKworaW5saW5lIGJvb2wgb3BlcmF0b3IhPShjb25zdCBBYmlsaXR5ICZsaHMsIGNvbnN0IEFiaWxpdHkgJnJocykgeworICAgIHJldHVybiAhKGxocyA9PSByaHMpOworfQorCisKK0ZMQVRCVUZGRVJTX01BTlVBTExZX0FMSUdORURfU1RSVUNUKDQpIFN0cnVjdE9mU3RydWN0cyBGTEFUQlVGRkVSU19GSU5BTF9DTEFTUyB7CisgcHJpdmF0ZToKKyAgTXlHYW1lOjpFeGFtcGxlOjpBYmlsaXR5IGFfOworICBNeUdhbWU6OkV4YW1wbGU6OlRlc3QgYl87CisgIE15R2FtZTo6RXhhbXBsZTo6QWJpbGl0eSBjXzsKKworIHB1YmxpYzoKKyAgc3RhdGljIGNvbnN0IGZsYXRidWZmZXJzOjpUeXBlVGFibGUgKk1pbmlSZWZsZWN0VHlwZVRhYmxlKCkgeworICAgIHJldHVybiBTdHJ1Y3RPZlN0cnVjdHNUeXBlVGFibGUoKTsKKyAgfQorICBTdHJ1Y3RPZlN0cnVjdHMoKQorICAgICAgOiBhXygpLAorICAgICAgICBiXygpLAorICAgICAgICBjXygpIHsKKyAgfQorICBTdHJ1Y3RPZlN0cnVjdHMoY29uc3QgTXlHYW1lOjpFeGFtcGxlOjpBYmlsaXR5ICZfYSwgY29uc3QgTXlHYW1lOjpFeGFtcGxlOjpUZXN0ICZfYiwgY29uc3QgTXlHYW1lOjpFeGFtcGxlOjpBYmlsaXR5ICZfYykKKyAgICAgIDogYV8oX2EpLAorICAgICAgICBiXyhfYiksCisgICAgICAgIGNfKF9jKSB7CisgIH0KKyAgY29uc3QgTXlHYW1lOjpFeGFtcGxlOjpBYmlsaXR5ICZhKCkgY29uc3QgeworICAgIHJldHVybiBhXzsKKyAgfQorICBNeUdhbWU6OkV4YW1wbGU6OkFiaWxpdHkgJm11dGFibGVfYSgpIHsKKyAgICByZXR1cm4gYV87CisgIH0KKyAgY29uc3QgTXlHYW1lOjpFeGFtcGxlOjpUZXN0ICZiKCkgY29uc3QgeworICAgIHJldHVybiBiXzsKKyAgfQorICBNeUdhbWU6OkV4YW1wbGU6OlRlc3QgJm11dGFibGVfYigpIHsKKyAgICByZXR1cm4gYl87CisgIH0KKyAgY29uc3QgTXlHYW1lOjpFeGFtcGxlOjpBYmlsaXR5ICZjKCkgY29uc3QgeworICAgIHJldHVybiBjXzsKKyAgfQorICBNeUdhbWU6OkV4YW1wbGU6OkFiaWxpdHkgJm11dGFibGVfYygpIHsKKyAgICByZXR1cm4gY187CisgIH0KK307CitGTEFUQlVGRkVSU19TVFJVQ1RfRU5EKFN0cnVjdE9mU3RydWN0cywgMjApOworCitpbmxpbmUgYm9vbCBvcGVyYXRvcj09KGNvbnN0IFN0cnVjdE9mU3RydWN0cyAmbGhzLCBjb25zdCBTdHJ1Y3RPZlN0cnVjdHMgJnJocykgeworICByZXR1cm4KKyAgICAgIChsaHMuYSgpID09IHJocy5hKCkpICYmCisgICAgICAobGhzLmIoKSA9PSByaHMuYigpKSAmJgorICAgICAgKGxocy5jKCkgPT0gcmhzLmMoKSk7Cit9CisKK2lubGluZSBib29sIG9wZXJhdG9yIT0oY29uc3QgU3RydWN0T2ZTdHJ1Y3RzICZsaHMsIGNvbnN0IFN0cnVjdE9mU3RydWN0cyAmcmhzKSB7CisgICAgcmV0dXJuICEobGhzID09IHJocyk7Cit9CisKKworRkxBVEJVRkZFUlNfTUFOVUFMTFlfQUxJR05FRF9TVFJVQ1QoNCkgU3RydWN0T2ZTdHJ1Y3RzT2ZTdHJ1Y3RzIEZMQVRCVUZGRVJTX0ZJTkFMX0NMQVNTIHsKKyBwcml2YXRlOgorICBNeUdhbWU6OkV4YW1wbGU6OlN0cnVjdE9mU3RydWN0cyBhXzsKKworIHB1YmxpYzoKKyAgc3RhdGljIGNvbnN0IGZsYXRidWZmZXJzOjpUeXBlVGFibGUgKk1pbmlSZWZsZWN0VHlwZVRhYmxlKCkgeworICAgIHJldHVybiBTdHJ1Y3RPZlN0cnVjdHNPZlN0cnVjdHNUeXBlVGFibGUoKTsKKyAgfQorICBTdHJ1Y3RPZlN0cnVjdHNPZlN0cnVjdHMoKQorICAgICAgOiBhXygpIHsKKyAgfQorICBTdHJ1Y3RPZlN0cnVjdHNPZlN0cnVjdHMoY29uc3QgTXlHYW1lOjpFeGFtcGxlOjpTdHJ1Y3RPZlN0cnVjdHMgJl9hKQorICAgICAgOiBhXyhfYSkgeworICB9CisgIGNvbnN0IE15R2FtZTo6RXhhbXBsZTo6U3RydWN0T2ZTdHJ1Y3RzICZhKCkgY29uc3QgeworICAgIHJldHVybiBhXzsKKyAgfQorICBNeUdhbWU6OkV4YW1wbGU6OlN0cnVjdE9mU3RydWN0cyAmbXV0YWJsZV9hKCkgeworICAgIHJldHVybiBhXzsKKyAgfQorfTsKK0ZMQVRCVUZGRVJTX1NUUlVDVF9FTkQoU3RydWN0T2ZTdHJ1Y3RzT2ZTdHJ1Y3RzLCAyMCk7CisKK2lubGluZSBib29sIG9wZXJhdG9yPT0oY29uc3QgU3RydWN0T2ZTdHJ1Y3RzT2ZTdHJ1Y3RzICZsaHMsIGNvbnN0IFN0cnVjdE9mU3RydWN0c09mU3RydWN0cyAmcmhzKSB7CisgIHJldHVybgorICAgICAgKGxocy5hKCkgPT0gcmhzLmEoKSk7Cit9CisKK2lubGluZSBib29sIG9wZXJhdG9yIT0oY29uc3QgU3RydWN0T2ZTdHJ1Y3RzT2ZTdHJ1Y3RzICZsaHMsIGNvbnN0IFN0cnVjdE9mU3RydWN0c09mU3RydWN0cyAmcmhzKSB7CisgICAgcmV0dXJuICEobGhzID09IHJocyk7Cit9CisKKworfSAgLy8gbmFtZXNwYWNlIEV4YW1wbGUKKworc3RydWN0IEluUGFyZW50TmFtZXNwYWNlVCA6IHB1YmxpYyBmbGF0YnVmZmVyczo6TmF0aXZlVGFibGUgeworICB0eXBlZGVmIEluUGFyZW50TmFtZXNwYWNlIFRhYmxlVHlwZTsKK307CisKK3N0cnVjdCBJblBhcmVudE5hbWVzcGFjZSBGTEFUQlVGRkVSU19GSU5BTF9DTEFTUyA6IHByaXZhdGUgZmxhdGJ1ZmZlcnM6OlRhYmxlIHsKKyAgdHlwZWRlZiBJblBhcmVudE5hbWVzcGFjZVQgTmF0aXZlVGFibGVUeXBlOworICB0eXBlZGVmIEluUGFyZW50TmFtZXNwYWNlQnVpbGRlciBCdWlsZGVyOworICBzdGF0aWMgY29uc3QgZmxhdGJ1ZmZlcnM6OlR5cGVUYWJsZSAqTWluaVJlZmxlY3RUeXBlVGFibGUoKSB7CisgICAgcmV0dXJuIEluUGFyZW50TmFtZXNwYWNlVHlwZVRhYmxlKCk7CisgIH0KKyAgYm9vbCBWZXJpZnkoZmxhdGJ1ZmZlcnM6OlZlcmlmaWVyICZ2ZXJpZmllcikgY29uc3QgeworICAgIHJldHVybiBWZXJpZnlUYWJsZVN0YXJ0KHZlcmlmaWVyKSAmJgorICAgICAgICAgICB2ZXJpZmllci5FbmRUYWJsZSgpOworICB9CisgIEluUGFyZW50TmFtZXNwYWNlVCAqVW5QYWNrKGNvbnN0IGZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIgPSBudWxscHRyKSBjb25zdDsKKyAgdm9pZCBVblBhY2tUbyhJblBhcmVudE5hbWVzcGFjZVQgKl9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyID0gbnVsbHB0cikgY29uc3Q7CisgIHN0YXRpYyBmbGF0YnVmZmVyczo6T2Zmc2V0PEluUGFyZW50TmFtZXNwYWNlPiBQYWNrKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgSW5QYXJlbnROYW1lc3BhY2VUKiBfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlciA9IG51bGxwdHIpOworfTsKKworc3RydWN0IEluUGFyZW50TmFtZXNwYWNlQnVpbGRlciB7CisgIHR5cGVkZWYgSW5QYXJlbnROYW1lc3BhY2UgVGFibGU7CisgIGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmZmJiXzsKKyAgZmxhdGJ1ZmZlcnM6OnVvZmZzZXRfdCBzdGFydF87CisgIGV4cGxpY2l0IEluUGFyZW50TmFtZXNwYWNlQnVpbGRlcihmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIpCisgICAgICAgIDogZmJiXyhfZmJiKSB7CisgICAgc3RhcnRfID0gZmJiXy5TdGFydFRhYmxlKCk7CisgIH0KKyAgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxJblBhcmVudE5hbWVzcGFjZT4gRmluaXNoKCkgeworICAgIGNvbnN0IGF1dG8gZW5kID0gZmJiXy5FbmRUYWJsZShzdGFydF8pOworICAgIGF1dG8gbyA9IGZsYXRidWZmZXJzOjpPZmZzZXQ8SW5QYXJlbnROYW1lc3BhY2U+KGVuZCk7CisgICAgcmV0dXJuIG87CisgIH0KK307CisKK2lubGluZSBmbGF0YnVmZmVyczo6T2Zmc2V0PEluUGFyZW50TmFtZXNwYWNlPiBDcmVhdGVJblBhcmVudE5hbWVzcGFjZSgKKyAgICBmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIpIHsKKyAgSW5QYXJlbnROYW1lc3BhY2VCdWlsZGVyIGJ1aWxkZXJfKF9mYmIpOworICByZXR1cm4gYnVpbGRlcl8uRmluaXNoKCk7Cit9CisKK2ZsYXRidWZmZXJzOjpPZmZzZXQ8SW5QYXJlbnROYW1lc3BhY2U+IENyZWF0ZUluUGFyZW50TmFtZXNwYWNlKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgSW5QYXJlbnROYW1lc3BhY2VUICpfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlciA9IG51bGxwdHIpOworCituYW1lc3BhY2UgRXhhbXBsZTIgeworCitzdHJ1Y3QgTW9uc3RlclQgOiBwdWJsaWMgZmxhdGJ1ZmZlcnM6Ok5hdGl2ZVRhYmxlIHsKKyAgdHlwZWRlZiBNb25zdGVyIFRhYmxlVHlwZTsKK307CisKK3N0cnVjdCBNb25zdGVyIEZMQVRCVUZGRVJTX0ZJTkFMX0NMQVNTIDogcHJpdmF0ZSBmbGF0YnVmZmVyczo6VGFibGUgeworICB0eXBlZGVmIE1vbnN0ZXJUIE5hdGl2ZVRhYmxlVHlwZTsKKyAgdHlwZWRlZiBNb25zdGVyQnVpbGRlciBCdWlsZGVyOworICBzdGF0aWMgY29uc3QgZmxhdGJ1ZmZlcnM6OlR5cGVUYWJsZSAqTWluaVJlZmxlY3RUeXBlVGFibGUoKSB7CisgICAgcmV0dXJuIE1vbnN0ZXJUeXBlVGFibGUoKTsKKyAgfQorICBib29sIFZlcmlmeShmbGF0YnVmZmVyczo6VmVyaWZpZXIgJnZlcmlmaWVyKSBjb25zdCB7CisgICAgcmV0dXJuIFZlcmlmeVRhYmxlU3RhcnQodmVyaWZpZXIpICYmCisgICAgICAgICAgIHZlcmlmaWVyLkVuZFRhYmxlKCk7CisgIH0KKyAgTW9uc3RlclQgKlVuUGFjayhjb25zdCBmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyID0gbnVsbHB0cikgY29uc3Q7CisgIHZvaWQgVW5QYWNrVG8oTW9uc3RlclQgKl9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyID0gbnVsbHB0cikgY29uc3Q7CisgIHN0YXRpYyBmbGF0YnVmZmVyczo6T2Zmc2V0PE1vbnN0ZXI+IFBhY2soZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBNb25zdGVyVCogX28sIGNvbnN0IGZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIgPSBudWxscHRyKTsKK307CisKK3N0cnVjdCBNb25zdGVyQnVpbGRlciB7CisgIHR5cGVkZWYgTW9uc3RlciBUYWJsZTsKKyAgZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZmYmJfOworICBmbGF0YnVmZmVyczo6dW9mZnNldF90IHN0YXJ0XzsKKyAgZXhwbGljaXQgTW9uc3RlckJ1aWxkZXIoZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiKQorICAgICAgICA6IGZiYl8oX2ZiYikgeworICAgIHN0YXJ0XyA9IGZiYl8uU3RhcnRUYWJsZSgpOworICB9CisgIGZsYXRidWZmZXJzOjpPZmZzZXQ8TW9uc3Rlcj4gRmluaXNoKCkgeworICAgIGNvbnN0IGF1dG8gZW5kID0gZmJiXy5FbmRUYWJsZShzdGFydF8pOworICAgIGF1dG8gbyA9IGZsYXRidWZmZXJzOjpPZmZzZXQ8TW9uc3Rlcj4oZW5kKTsKKyAgICByZXR1cm4gbzsKKyAgfQorfTsKKworaW5saW5lIGZsYXRidWZmZXJzOjpPZmZzZXQ8TW9uc3Rlcj4gQ3JlYXRlTW9uc3RlcigKKyAgICBmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIpIHsKKyAgTW9uc3RlckJ1aWxkZXIgYnVpbGRlcl8oX2ZiYik7CisgIHJldHVybiBidWlsZGVyXy5GaW5pc2goKTsKK30KKworZmxhdGJ1ZmZlcnM6Ok9mZnNldDxNb25zdGVyPiBDcmVhdGVNb25zdGVyKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgTW9uc3RlclQgKl9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyID0gbnVsbHB0cik7CisKK30gIC8vIG5hbWVzcGFjZSBFeGFtcGxlMgorCituYW1lc3BhY2UgRXhhbXBsZSB7CisKK3N0cnVjdCBUZXN0U2ltcGxlVGFibGVXaXRoRW51bVQgOiBwdWJsaWMgZmxhdGJ1ZmZlcnM6Ok5hdGl2ZVRhYmxlIHsKKyAgdHlwZWRlZiBUZXN0U2ltcGxlVGFibGVXaXRoRW51bSBUYWJsZVR5cGU7CisgIE15R2FtZTo6RXhhbXBsZTo6Q29sb3IgY29sb3IgPSBNeUdhbWU6OkV4YW1wbGU6OkNvbG9yX0dyZWVuOworfTsKKworc3RydWN0IFRlc3RTaW1wbGVUYWJsZVdpdGhFbnVtIEZMQVRCVUZGRVJTX0ZJTkFMX0NMQVNTIDogcHJpdmF0ZSBmbGF0YnVmZmVyczo6VGFibGUgeworICB0eXBlZGVmIFRlc3RTaW1wbGVUYWJsZVdpdGhFbnVtVCBOYXRpdmVUYWJsZVR5cGU7CisgIHR5cGVkZWYgVGVzdFNpbXBsZVRhYmxlV2l0aEVudW1CdWlsZGVyIEJ1aWxkZXI7CisgIHN0YXRpYyBjb25zdCBmbGF0YnVmZmVyczo6VHlwZVRhYmxlICpNaW5pUmVmbGVjdFR5cGVUYWJsZSgpIHsKKyAgICByZXR1cm4gVGVzdFNpbXBsZVRhYmxlV2l0aEVudW1UeXBlVGFibGUoKTsKKyAgfQorICBlbnVtIEZsYXRCdWZmZXJzVlRhYmxlT2Zmc2V0IEZMQVRCVUZGRVJTX1ZUQUJMRV9VTkRFUkxZSU5HX1RZUEUgeworICAgIFZUX0NPTE9SID0gNAorICB9OworICBNeUdhbWU6OkV4YW1wbGU6OkNvbG9yIGNvbG9yKCkgY29uc3QgeworICAgIHJldHVybiBzdGF0aWNfY2FzdDxNeUdhbWU6OkV4YW1wbGU6OkNvbG9yPihHZXRGaWVsZDx1aW50OF90PihWVF9DT0xPUiwgMikpOworICB9CisgIGJvb2wgbXV0YXRlX2NvbG9yKE15R2FtZTo6RXhhbXBsZTo6Q29sb3IgX2NvbG9yID0gc3RhdGljX2Nhc3Q8TXlHYW1lOjpFeGFtcGxlOjpDb2xvcj4oMikpIHsKKyAgICByZXR1cm4gU2V0RmllbGQ8dWludDhfdD4oVlRfQ09MT1IsIHN0YXRpY19jYXN0PHVpbnQ4X3Q+KF9jb2xvciksIDIpOworICB9CisgIGJvb2wgVmVyaWZ5KGZsYXRidWZmZXJzOjpWZXJpZmllciAmdmVyaWZpZXIpIGNvbnN0IHsKKyAgICByZXR1cm4gVmVyaWZ5VGFibGVTdGFydCh2ZXJpZmllcikgJiYKKyAgICAgICAgICAgVmVyaWZ5RmllbGQ8dWludDhfdD4odmVyaWZpZXIsIFZUX0NPTE9SLCAxKSAmJgorICAgICAgICAgICB2ZXJpZmllci5FbmRUYWJsZSgpOworICB9CisgIFRlc3RTaW1wbGVUYWJsZVdpdGhFbnVtVCAqVW5QYWNrKGNvbnN0IGZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIgPSBudWxscHRyKSBjb25zdDsKKyAgdm9pZCBVblBhY2tUbyhUZXN0U2ltcGxlVGFibGVXaXRoRW51bVQgKl9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyID0gbnVsbHB0cikgY29uc3Q7CisgIHN0YXRpYyBmbGF0YnVmZmVyczo6T2Zmc2V0PFRlc3RTaW1wbGVUYWJsZVdpdGhFbnVtPiBQYWNrKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgVGVzdFNpbXBsZVRhYmxlV2l0aEVudW1UKiBfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlciA9IG51bGxwdHIpOworfTsKKworc3RydWN0IFRlc3RTaW1wbGVUYWJsZVdpdGhFbnVtQnVpbGRlciB7CisgIHR5cGVkZWYgVGVzdFNpbXBsZVRhYmxlV2l0aEVudW0gVGFibGU7CisgIGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmZmJiXzsKKyAgZmxhdGJ1ZmZlcnM6OnVvZmZzZXRfdCBzdGFydF87CisgIHZvaWQgYWRkX2NvbG9yKE15R2FtZTo6RXhhbXBsZTo6Q29sb3IgY29sb3IpIHsKKyAgICBmYmJfLkFkZEVsZW1lbnQ8dWludDhfdD4oVGVzdFNpbXBsZVRhYmxlV2l0aEVudW06OlZUX0NPTE9SLCBzdGF0aWNfY2FzdDx1aW50OF90Pihjb2xvciksIDIpOworICB9CisgIGV4cGxpY2l0IFRlc3RTaW1wbGVUYWJsZVdpdGhFbnVtQnVpbGRlcihmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIpCisgICAgICAgIDogZmJiXyhfZmJiKSB7CisgICAgc3RhcnRfID0gZmJiXy5TdGFydFRhYmxlKCk7CisgIH0KKyAgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxUZXN0U2ltcGxlVGFibGVXaXRoRW51bT4gRmluaXNoKCkgeworICAgIGNvbnN0IGF1dG8gZW5kID0gZmJiXy5FbmRUYWJsZShzdGFydF8pOworICAgIGF1dG8gbyA9IGZsYXRidWZmZXJzOjpPZmZzZXQ8VGVzdFNpbXBsZVRhYmxlV2l0aEVudW0+KGVuZCk7CisgICAgcmV0dXJuIG87CisgIH0KK307CisKK2lubGluZSBmbGF0YnVmZmVyczo6T2Zmc2V0PFRlc3RTaW1wbGVUYWJsZVdpdGhFbnVtPiBDcmVhdGVUZXN0U2ltcGxlVGFibGVXaXRoRW51bSgKKyAgICBmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsCisgICAgTXlHYW1lOjpFeGFtcGxlOjpDb2xvciBjb2xvciA9IE15R2FtZTo6RXhhbXBsZTo6Q29sb3JfR3JlZW4pIHsKKyAgVGVzdFNpbXBsZVRhYmxlV2l0aEVudW1CdWlsZGVyIGJ1aWxkZXJfKF9mYmIpOworICBidWlsZGVyXy5hZGRfY29sb3IoY29sb3IpOworICByZXR1cm4gYnVpbGRlcl8uRmluaXNoKCk7Cit9CisKK2ZsYXRidWZmZXJzOjpPZmZzZXQ8VGVzdFNpbXBsZVRhYmxlV2l0aEVudW0+IENyZWF0ZVRlc3RTaW1wbGVUYWJsZVdpdGhFbnVtKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgVGVzdFNpbXBsZVRhYmxlV2l0aEVudW1UICpfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlciA9IG51bGxwdHIpOworCitzdHJ1Y3QgU3RhdFQgOiBwdWJsaWMgZmxhdGJ1ZmZlcnM6Ok5hdGl2ZVRhYmxlIHsKKyAgdHlwZWRlZiBTdGF0IFRhYmxlVHlwZTsKKyAgc3RkOjpzdHJpbmcgaWR7fTsKKyAgaW50NjRfdCB2YWwgPSAwOworICB1aW50MTZfdCBjb3VudCA9IDA7Cit9OworCitzdHJ1Y3QgU3RhdCBGTEFUQlVGRkVSU19GSU5BTF9DTEFTUyA6IHByaXZhdGUgZmxhdGJ1ZmZlcnM6OlRhYmxlIHsKKyAgdHlwZWRlZiBTdGF0VCBOYXRpdmVUYWJsZVR5cGU7CisgIHR5cGVkZWYgU3RhdEJ1aWxkZXIgQnVpbGRlcjsKKyAgc3RhdGljIGNvbnN0IGZsYXRidWZmZXJzOjpUeXBlVGFibGUgKk1pbmlSZWZsZWN0VHlwZVRhYmxlKCkgeworICAgIHJldHVybiBTdGF0VHlwZVRhYmxlKCk7CisgIH0KKyAgZW51bSBGbGF0QnVmZmVyc1ZUYWJsZU9mZnNldCBGTEFUQlVGRkVSU19WVEFCTEVfVU5ERVJMWUlOR19UWVBFIHsKKyAgICBWVF9JRCA9IDQsCisgICAgVlRfVkFMID0gNiwKKyAgICBWVF9DT1VOVCA9IDgKKyAgfTsKKyAgY29uc3QgZmxhdGJ1ZmZlcnM6OlN0cmluZyAqaWQoKSBjb25zdCB7CisgICAgcmV0dXJuIEdldFBvaW50ZXI8Y29uc3QgZmxhdGJ1ZmZlcnM6OlN0cmluZyAqPihWVF9JRCk7CisgIH0KKyAgZmxhdGJ1ZmZlcnM6OlN0cmluZyAqbXV0YWJsZV9pZCgpIHsKKyAgICByZXR1cm4gR2V0UG9pbnRlcjxmbGF0YnVmZmVyczo6U3RyaW5nICo+KFZUX0lEKTsKKyAgfQorICBpbnQ2NF90IHZhbCgpIGNvbnN0IHsKKyAgICByZXR1cm4gR2V0RmllbGQ8aW50NjRfdD4oVlRfVkFMLCAwKTsKKyAgfQorICBib29sIG11dGF0ZV92YWwoaW50NjRfdCBfdmFsID0gMCkgeworICAgIHJldHVybiBTZXRGaWVsZDxpbnQ2NF90PihWVF9WQUwsIF92YWwsIDApOworICB9CisgIHVpbnQxNl90IGNvdW50KCkgY29uc3QgeworICAgIHJldHVybiBHZXRGaWVsZDx1aW50MTZfdD4oVlRfQ09VTlQsIDApOworICB9CisgIGJvb2wgbXV0YXRlX2NvdW50KHVpbnQxNl90IF9jb3VudCA9IDApIHsKKyAgICByZXR1cm4gU2V0RmllbGQ8dWludDE2X3Q+KFZUX0NPVU5ULCBfY291bnQsIDApOworICB9CisgIGJvb2wgS2V5Q29tcGFyZUxlc3NUaGFuKGNvbnN0IFN0YXQgKm8pIGNvbnN0IHsKKyAgICByZXR1cm4gY291bnQoKSA8IG8tPmNvdW50KCk7CisgIH0KKyAgaW50IEtleUNvbXBhcmVXaXRoVmFsdWUodWludDE2X3QgX2NvdW50KSBjb25zdCB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PGludD4oY291bnQoKSA+IF9jb3VudCkgLSBzdGF0aWNfY2FzdDxpbnQ+KGNvdW50KCkgPCBfY291bnQpOworICB9CisgIGJvb2wgVmVyaWZ5KGZsYXRidWZmZXJzOjpWZXJpZmllciAmdmVyaWZpZXIpIGNvbnN0IHsKKyAgICByZXR1cm4gVmVyaWZ5VGFibGVTdGFydCh2ZXJpZmllcikgJiYKKyAgICAgICAgICAgVmVyaWZ5T2Zmc2V0KHZlcmlmaWVyLCBWVF9JRCkgJiYKKyAgICAgICAgICAgdmVyaWZpZXIuVmVyaWZ5U3RyaW5nKGlkKCkpICYmCisgICAgICAgICAgIFZlcmlmeUZpZWxkPGludDY0X3Q+KHZlcmlmaWVyLCBWVF9WQUwsIDgpICYmCisgICAgICAgICAgIFZlcmlmeUZpZWxkPHVpbnQxNl90Pih2ZXJpZmllciwgVlRfQ09VTlQsIDIpICYmCisgICAgICAgICAgIHZlcmlmaWVyLkVuZFRhYmxlKCk7CisgIH0KKyAgU3RhdFQgKlVuUGFjayhjb25zdCBmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyID0gbnVsbHB0cikgY29uc3Q7CisgIHZvaWQgVW5QYWNrVG8oU3RhdFQgKl9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyID0gbnVsbHB0cikgY29uc3Q7CisgIHN0YXRpYyBmbGF0YnVmZmVyczo6T2Zmc2V0PFN0YXQ+IFBhY2soZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBTdGF0VCogX28sIGNvbnN0IGZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIgPSBudWxscHRyKTsKK307CisKK3N0cnVjdCBTdGF0QnVpbGRlciB7CisgIHR5cGVkZWYgU3RhdCBUYWJsZTsKKyAgZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZmYmJfOworICBmbGF0YnVmZmVyczo6dW9mZnNldF90IHN0YXJ0XzsKKyAgdm9pZCBhZGRfaWQoZmxhdGJ1ZmZlcnM6Ok9mZnNldDxmbGF0YnVmZmVyczo6U3RyaW5nPiBpZCkgeworICAgIGZiYl8uQWRkT2Zmc2V0KFN0YXQ6OlZUX0lELCBpZCk7CisgIH0KKyAgdm9pZCBhZGRfdmFsKGludDY0X3QgdmFsKSB7CisgICAgZmJiXy5BZGRFbGVtZW50PGludDY0X3Q+KFN0YXQ6OlZUX1ZBTCwgdmFsLCAwKTsKKyAgfQorICB2b2lkIGFkZF9jb3VudCh1aW50MTZfdCBjb3VudCkgeworICAgIGZiYl8uQWRkRWxlbWVudDx1aW50MTZfdD4oU3RhdDo6VlRfQ09VTlQsIGNvdW50LCAwKTsKKyAgfQorICBleHBsaWNpdCBTdGF0QnVpbGRlcihmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIpCisgICAgICAgIDogZmJiXyhfZmJiKSB7CisgICAgc3RhcnRfID0gZmJiXy5TdGFydFRhYmxlKCk7CisgIH0KKyAgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxTdGF0PiBGaW5pc2goKSB7CisgICAgY29uc3QgYXV0byBlbmQgPSBmYmJfLkVuZFRhYmxlKHN0YXJ0Xyk7CisgICAgYXV0byBvID0gZmxhdGJ1ZmZlcnM6Ok9mZnNldDxTdGF0PihlbmQpOworICAgIHJldHVybiBvOworICB9Cit9OworCitpbmxpbmUgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxTdGF0PiBDcmVhdGVTdGF0KAorICAgIGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwKKyAgICBmbGF0YnVmZmVyczo6T2Zmc2V0PGZsYXRidWZmZXJzOjpTdHJpbmc+IGlkID0gMCwKKyAgICBpbnQ2NF90IHZhbCA9IDAsCisgICAgdWludDE2X3QgY291bnQgPSAwKSB7CisgIFN0YXRCdWlsZGVyIGJ1aWxkZXJfKF9mYmIpOworICBidWlsZGVyXy5hZGRfdmFsKHZhbCk7CisgIGJ1aWxkZXJfLmFkZF9pZChpZCk7CisgIGJ1aWxkZXJfLmFkZF9jb3VudChjb3VudCk7CisgIHJldHVybiBidWlsZGVyXy5GaW5pc2goKTsKK30KKworaW5saW5lIGZsYXRidWZmZXJzOjpPZmZzZXQ8U3RhdD4gQ3JlYXRlU3RhdERpcmVjdCgKKyAgICBmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsCisgICAgY29uc3QgY2hhciAqaWQgPSBudWxscHRyLAorICAgIGludDY0X3QgdmFsID0gMCwKKyAgICB1aW50MTZfdCBjb3VudCA9IDApIHsKKyAgYXV0byBpZF9fID0gaWQgPyBfZmJiLkNyZWF0ZVN0cmluZyhpZCkgOiAwOworICByZXR1cm4gTXlHYW1lOjpFeGFtcGxlOjpDcmVhdGVTdGF0KAorICAgICAgX2ZiYiwKKyAgICAgIGlkX18sCisgICAgICB2YWwsCisgICAgICBjb3VudCk7Cit9CisKK2ZsYXRidWZmZXJzOjpPZmZzZXQ8U3RhdD4gQ3JlYXRlU3RhdChmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IFN0YXRUICpfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlciA9IG51bGxwdHIpOworCitzdHJ1Y3QgUmVmZXJyYWJsZVQgOiBwdWJsaWMgZmxhdGJ1ZmZlcnM6Ok5hdGl2ZVRhYmxlIHsKKyAgdHlwZWRlZiBSZWZlcnJhYmxlIFRhYmxlVHlwZTsKKyAgdWludDY0X3QgaWQgPSAwOworfTsKKworc3RydWN0IFJlZmVycmFibGUgRkxBVEJVRkZFUlNfRklOQUxfQ0xBU1MgOiBwcml2YXRlIGZsYXRidWZmZXJzOjpUYWJsZSB7CisgIHR5cGVkZWYgUmVmZXJyYWJsZVQgTmF0aXZlVGFibGVUeXBlOworICB0eXBlZGVmIFJlZmVycmFibGVCdWlsZGVyIEJ1aWxkZXI7CisgIHN0YXRpYyBjb25zdCBmbGF0YnVmZmVyczo6VHlwZVRhYmxlICpNaW5pUmVmbGVjdFR5cGVUYWJsZSgpIHsKKyAgICByZXR1cm4gUmVmZXJyYWJsZVR5cGVUYWJsZSgpOworICB9CisgIGVudW0gRmxhdEJ1ZmZlcnNWVGFibGVPZmZzZXQgRkxBVEJVRkZFUlNfVlRBQkxFX1VOREVSTFlJTkdfVFlQRSB7CisgICAgVlRfSUQgPSA0CisgIH07CisgIHVpbnQ2NF90IGlkKCkgY29uc3QgeworICAgIHJldHVybiBHZXRGaWVsZDx1aW50NjRfdD4oVlRfSUQsIDApOworICB9CisgIGJvb2wgbXV0YXRlX2lkKHVpbnQ2NF90IF9pZCA9IDApIHsKKyAgICByZXR1cm4gU2V0RmllbGQ8dWludDY0X3Q+KFZUX0lELCBfaWQsIDApOworICB9CisgIGJvb2wgS2V5Q29tcGFyZUxlc3NUaGFuKGNvbnN0IFJlZmVycmFibGUgKm8pIGNvbnN0IHsKKyAgICByZXR1cm4gaWQoKSA8IG8tPmlkKCk7CisgIH0KKyAgaW50IEtleUNvbXBhcmVXaXRoVmFsdWUodWludDY0X3QgX2lkKSBjb25zdCB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PGludD4oaWQoKSA+IF9pZCkgLSBzdGF0aWNfY2FzdDxpbnQ+KGlkKCkgPCBfaWQpOworICB9CisgIGJvb2wgVmVyaWZ5KGZsYXRidWZmZXJzOjpWZXJpZmllciAmdmVyaWZpZXIpIGNvbnN0IHsKKyAgICByZXR1cm4gVmVyaWZ5VGFibGVTdGFydCh2ZXJpZmllcikgJiYKKyAgICAgICAgICAgVmVyaWZ5RmllbGQ8dWludDY0X3Q+KHZlcmlmaWVyLCBWVF9JRCwgOCkgJiYKKyAgICAgICAgICAgdmVyaWZpZXIuRW5kVGFibGUoKTsKKyAgfQorICBSZWZlcnJhYmxlVCAqVW5QYWNrKGNvbnN0IGZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIgPSBudWxscHRyKSBjb25zdDsKKyAgdm9pZCBVblBhY2tUbyhSZWZlcnJhYmxlVCAqX28sIGNvbnN0IGZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIgPSBudWxscHRyKSBjb25zdDsKKyAgc3RhdGljIGZsYXRidWZmZXJzOjpPZmZzZXQ8UmVmZXJyYWJsZT4gUGFjayhmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IFJlZmVycmFibGVUKiBfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlciA9IG51bGxwdHIpOworfTsKKworc3RydWN0IFJlZmVycmFibGVCdWlsZGVyIHsKKyAgdHlwZWRlZiBSZWZlcnJhYmxlIFRhYmxlOworICBmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJmZiYl87CisgIGZsYXRidWZmZXJzOjp1b2Zmc2V0X3Qgc3RhcnRfOworICB2b2lkIGFkZF9pZCh1aW50NjRfdCBpZCkgeworICAgIGZiYl8uQWRkRWxlbWVudDx1aW50NjRfdD4oUmVmZXJyYWJsZTo6VlRfSUQsIGlkLCAwKTsKKyAgfQorICBleHBsaWNpdCBSZWZlcnJhYmxlQnVpbGRlcihmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIpCisgICAgICAgIDogZmJiXyhfZmJiKSB7CisgICAgc3RhcnRfID0gZmJiXy5TdGFydFRhYmxlKCk7CisgIH0KKyAgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxSZWZlcnJhYmxlPiBGaW5pc2goKSB7CisgICAgY29uc3QgYXV0byBlbmQgPSBmYmJfLkVuZFRhYmxlKHN0YXJ0Xyk7CisgICAgYXV0byBvID0gZmxhdGJ1ZmZlcnM6Ok9mZnNldDxSZWZlcnJhYmxlPihlbmQpOworICAgIHJldHVybiBvOworICB9Cit9OworCitpbmxpbmUgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxSZWZlcnJhYmxlPiBDcmVhdGVSZWZlcnJhYmxlKAorICAgIGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwKKyAgICB1aW50NjRfdCBpZCA9IDApIHsKKyAgUmVmZXJyYWJsZUJ1aWxkZXIgYnVpbGRlcl8oX2ZiYik7CisgIGJ1aWxkZXJfLmFkZF9pZChpZCk7CisgIHJldHVybiBidWlsZGVyXy5GaW5pc2goKTsKK30KKworZmxhdGJ1ZmZlcnM6Ok9mZnNldDxSZWZlcnJhYmxlPiBDcmVhdGVSZWZlcnJhYmxlKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgUmVmZXJyYWJsZVQgKl9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyID0gbnVsbHB0cik7CisKK3N0cnVjdCBNb25zdGVyVCA6IHB1YmxpYyBmbGF0YnVmZmVyczo6TmF0aXZlVGFibGUgeworICB0eXBlZGVmIE1vbnN0ZXIgVGFibGVUeXBlOworICBmbGF0YnVmZmVyczo6dW5pcXVlX3B0cjxNeUdhbWU6OkV4YW1wbGU6OlZlYzM+IHBvc3t9OworICBpbnQxNl90IG1hbmEgPSAxNTA7CisgIGludDE2X3QgaHAgPSAxMDA7CisgIHN0ZDo6c3RyaW5nIG5hbWV7fTsKKyAgc3RkOjp2ZWN0b3I8dWludDhfdD4gaW52ZW50b3J5e307CisgIE15R2FtZTo6RXhhbXBsZTo6Q29sb3IgY29sb3IgPSBNeUdhbWU6OkV4YW1wbGU6OkNvbG9yX0JsdWU7CisgIE15R2FtZTo6RXhhbXBsZTo6QW55VW5pb24gdGVzdHt9OworICBzdGQ6OnZlY3RvcjxNeUdhbWU6OkV4YW1wbGU6OlRlc3Q+IHRlc3Q0e307CisgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiB0ZXN0YXJyYXlvZnN0cmluZ3t9OworICBzdGQ6OnZlY3RvcjxmbGF0YnVmZmVyczo6dW5pcXVlX3B0cjxNeUdhbWU6OkV4YW1wbGU6Ok1vbnN0ZXJUPj4gdGVzdGFycmF5b2Z0YWJsZXN7fTsKKyAgZmxhdGJ1ZmZlcnM6OnVuaXF1ZV9wdHI8TXlHYW1lOjpFeGFtcGxlOjpNb25zdGVyVD4gZW5lbXl7fTsKKyAgc3RkOjp2ZWN0b3I8dWludDhfdD4gdGVzdG5lc3RlZGZsYXRidWZmZXJ7fTsKKyAgZmxhdGJ1ZmZlcnM6OnVuaXF1ZV9wdHI8TXlHYW1lOjpFeGFtcGxlOjpTdGF0VD4gdGVzdGVtcHR5e307CisgIGJvb2wgdGVzdGJvb2wgPSBmYWxzZTsKKyAgaW50MzJfdCB0ZXN0aGFzaHMzMl9mbnYxID0gMDsKKyAgdWludDMyX3QgdGVzdGhhc2h1MzJfZm52MSA9IDA7CisgIGludDY0X3QgdGVzdGhhc2hzNjRfZm52MSA9IDA7CisgIHVpbnQ2NF90IHRlc3RoYXNodTY0X2ZudjEgPSAwOworICBpbnQzMl90IHRlc3RoYXNoczMyX2ZudjFhID0gMDsKKyAgU3RhdCAqdGVzdGhhc2h1MzJfZm52MWEgPSBudWxscHRyOworICBpbnQ2NF90IHRlc3RoYXNoczY0X2ZudjFhID0gMDsKKyAgdWludDY0X3QgdGVzdGhhc2h1NjRfZm52MWEgPSAwOworICBzdGQ6OnZlY3Rvcjxib29sPiB0ZXN0YXJyYXlvZmJvb2xze307CisgIGZsb2F0IHRlc3RmID0gMy4xNDE1OWY7CisgIGZsb2F0IHRlc3RmMiA9IDMuMGY7CisgIGZsb2F0IHRlc3RmMyA9IDAuMGY7CisgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiB0ZXN0YXJyYXlvZnN0cmluZzJ7fTsKKyAgc3RkOjp2ZWN0b3I8TXlHYW1lOjpFeGFtcGxlOjpBYmlsaXR5PiB0ZXN0YXJyYXlvZnNvcnRlZHN0cnVjdHt9OworICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBmbGV4e307CisgIHN0ZDo6dmVjdG9yPE15R2FtZTo6RXhhbXBsZTo6VGVzdD4gdGVzdDV7fTsKKyAgc3RkOjp2ZWN0b3I8aW50NjRfdD4gdmVjdG9yX29mX2xvbmdze307CisgIHN0ZDo6dmVjdG9yPGRvdWJsZT4gdmVjdG9yX29mX2RvdWJsZXN7fTsKKyAgZmxhdGJ1ZmZlcnM6OnVuaXF1ZV9wdHI8TXlHYW1lOjpJblBhcmVudE5hbWVzcGFjZVQ+IHBhcmVudF9uYW1lc3BhY2VfdGVzdHt9OworICBzdGQ6OnZlY3RvcjxmbGF0YnVmZmVyczo6dW5pcXVlX3B0cjxNeUdhbWU6OkV4YW1wbGU6OlJlZmVycmFibGVUPj4gdmVjdG9yX29mX3JlZmVycmFibGVze307CisgIFJlZmVycmFibGVUICpzaW5nbGVfd2Vha19yZWZlcmVuY2UgPSBudWxscHRyOworICBzdGQ6OnZlY3RvcjxSZWZlcnJhYmxlVCAqPiB2ZWN0b3Jfb2Zfd2Vha19yZWZlcmVuY2Vze307CisgIHN0ZDo6dmVjdG9yPGZsYXRidWZmZXJzOjp1bmlxdWVfcHRyPE15R2FtZTo6RXhhbXBsZTo6UmVmZXJyYWJsZVQ+PiB2ZWN0b3Jfb2Zfc3Ryb25nX3JlZmVycmFibGVze307CisgIFJlZmVycmFibGVUICpjb19vd25pbmdfcmVmZXJlbmNlID0gbnVsbHB0cjsKKyAgc3RkOjp2ZWN0b3I8ZmxhdGJ1ZmZlcnM6OnVuaXF1ZV9wdHI8UmVmZXJyYWJsZVQ+PiB2ZWN0b3Jfb2ZfY29fb3duaW5nX3JlZmVyZW5jZXN7fTsKKyAgUmVmZXJyYWJsZVQgKm5vbl9vd25pbmdfcmVmZXJlbmNlID0gbnVsbHB0cjsKKyAgc3RkOjp2ZWN0b3I8UmVmZXJyYWJsZVQgKj4gdmVjdG9yX29mX25vbl9vd25pbmdfcmVmZXJlbmNlc3t9OworICBNeUdhbWU6OkV4YW1wbGU6OkFueVVuaXF1ZUFsaWFzZXNVbmlvbiBhbnlfdW5pcXVle307CisgIE15R2FtZTo6RXhhbXBsZTo6QW55QW1iaWd1b3VzQWxpYXNlc1VuaW9uIGFueV9hbWJpZ3VvdXN7fTsKKyAgc3RkOjp2ZWN0b3I8TXlHYW1lOjpFeGFtcGxlOjpDb2xvcj4gdmVjdG9yX29mX2VudW1ze307CisgIE15R2FtZTo6RXhhbXBsZTo6UmFjZSBzaWduZWRfZW51bSA9IE15R2FtZTo6RXhhbXBsZTo6UmFjZV9Ob25lOworICBzdGQ6OnZlY3Rvcjx1aW50OF90PiB0ZXN0cmVxdWlyZWRuZXN0ZWRmbGF0YnVmZmVye307CisgIHN0ZDo6dmVjdG9yPGZsYXRidWZmZXJzOjp1bmlxdWVfcHRyPE15R2FtZTo6RXhhbXBsZTo6U3RhdFQ+PiBzY2FsYXJfa2V5X3NvcnRlZF90YWJsZXN7fTsKKyAgTXlHYW1lOjpFeGFtcGxlOjpUZXN0IG5hdGl2ZV9pbmxpbmV7fTsKKyAgTXlHYW1lOjpFeGFtcGxlOjpMb25nRW51bSBsb25nX2VudW1fbm9uX2VudW1fZGVmYXVsdCA9IHN0YXRpY19jYXN0PE15R2FtZTo6RXhhbXBsZTo6TG9uZ0VudW0+KDApOworICBNeUdhbWU6OkV4YW1wbGU6OkxvbmdFbnVtIGxvbmdfZW51bV9ub3JtYWxfZGVmYXVsdCA9IE15R2FtZTo6RXhhbXBsZTo6TG9uZ0VudW1fTG9uZ09uZTsKKyAgTW9uc3RlclQoKSA9IGRlZmF1bHQ7CisgIE1vbnN0ZXJUKGNvbnN0IE1vbnN0ZXJUICZvKTsKKyAgTW9uc3RlclQoTW9uc3RlclQmJikgRkxBVEJVRkZFUlNfTk9FWENFUFQgPSBkZWZhdWx0OworICBNb25zdGVyVCAmb3BlcmF0b3I9KE1vbnN0ZXJUIG8pIEZMQVRCVUZGRVJTX05PRVhDRVBUOworfTsKKworLy8vIGFuIGV4YW1wbGUgZG9jdW1lbnRhdGlvbiBjb21tZW50OiAibW9uc3RlciBvYmplY3QiCitzdHJ1Y3QgTW9uc3RlciBGTEFUQlVGRkVSU19GSU5BTF9DTEFTUyA6IHByaXZhdGUgZmxhdGJ1ZmZlcnM6OlRhYmxlIHsKKyAgdHlwZWRlZiBNb25zdGVyVCBOYXRpdmVUYWJsZVR5cGU7CisgIHR5cGVkZWYgTW9uc3RlckJ1aWxkZXIgQnVpbGRlcjsKKyAgc3RhdGljIGNvbnN0IGZsYXRidWZmZXJzOjpUeXBlVGFibGUgKk1pbmlSZWZsZWN0VHlwZVRhYmxlKCkgeworICAgIHJldHVybiBNb25zdGVyVHlwZVRhYmxlKCk7CisgIH0KKyAgZW51bSBGbGF0QnVmZmVyc1ZUYWJsZU9mZnNldCBGTEFUQlVGRkVSU19WVEFCTEVfVU5ERVJMWUlOR19UWVBFIHsKKyAgICBWVF9QT1MgPSA0LAorICAgIFZUX01BTkEgPSA2LAorICAgIFZUX0hQID0gOCwKKyAgICBWVF9OQU1FID0gMTAsCisgICAgVlRfSU5WRU5UT1JZID0gMTQsCisgICAgVlRfQ09MT1IgPSAxNiwKKyAgICBWVF9URVNUX1RZUEUgPSAxOCwKKyAgICBWVF9URVNUID0gMjAsCisgICAgVlRfVEVTVDQgPSAyMiwKKyAgICBWVF9URVNUQVJSQVlPRlNUUklORyA9IDI0LAorICAgIFZUX1RFU1RBUlJBWU9GVEFCTEVTID0gMjYsCisgICAgVlRfRU5FTVkgPSAyOCwKKyAgICBWVF9URVNUTkVTVEVERkxBVEJVRkZFUiA9IDMwLAorICAgIFZUX1RFU1RFTVBUWSA9IDMyLAorICAgIFZUX1RFU1RCT09MID0gMzQsCisgICAgVlRfVEVTVEhBU0hTMzJfRk5WMSA9IDM2LAorICAgIFZUX1RFU1RIQVNIVTMyX0ZOVjEgPSAzOCwKKyAgICBWVF9URVNUSEFTSFM2NF9GTlYxID0gNDAsCisgICAgVlRfVEVTVEhBU0hVNjRfRk5WMSA9IDQyLAorICAgIFZUX1RFU1RIQVNIUzMyX0ZOVjFBID0gNDQsCisgICAgVlRfVEVTVEhBU0hVMzJfRk5WMUEgPSA0NiwKKyAgICBWVF9URVNUSEFTSFM2NF9GTlYxQSA9IDQ4LAorICAgIFZUX1RFU1RIQVNIVTY0X0ZOVjFBID0gNTAsCisgICAgVlRfVEVTVEFSUkFZT0ZCT09MUyA9IDUyLAorICAgIFZUX1RFU1RGID0gNTQsCisgICAgVlRfVEVTVEYyID0gNTYsCisgICAgVlRfVEVTVEYzID0gNTgsCisgICAgVlRfVEVTVEFSUkFZT0ZTVFJJTkcyID0gNjAsCisgICAgVlRfVEVTVEFSUkFZT0ZTT1JURURTVFJVQ1QgPSA2MiwKKyAgICBWVF9GTEVYID0gNjQsCisgICAgVlRfVEVTVDUgPSA2NiwKKyAgICBWVF9WRUNUT1JfT0ZfTE9OR1MgPSA2OCwKKyAgICBWVF9WRUNUT1JfT0ZfRE9VQkxFUyA9IDcwLAorICAgIFZUX1BBUkVOVF9OQU1FU1BBQ0VfVEVTVCA9IDcyLAorICAgIFZUX1ZFQ1RPUl9PRl9SRUZFUlJBQkxFUyA9IDc0LAorICAgIFZUX1NJTkdMRV9XRUFLX1JFRkVSRU5DRSA9IDc2LAorICAgIFZUX1ZFQ1RPUl9PRl9XRUFLX1JFRkVSRU5DRVMgPSA3OCwKKyAgICBWVF9WRUNUT1JfT0ZfU1RST05HX1JFRkVSUkFCTEVTID0gODAsCisgICAgVlRfQ09fT1dOSU5HX1JFRkVSRU5DRSA9IDgyLAorICAgIFZUX1ZFQ1RPUl9PRl9DT19PV05JTkdfUkVGRVJFTkNFUyA9IDg0LAorICAgIFZUX05PTl9PV05JTkdfUkVGRVJFTkNFID0gODYsCisgICAgVlRfVkVDVE9SX09GX05PTl9PV05JTkdfUkVGRVJFTkNFUyA9IDg4LAorICAgIFZUX0FOWV9VTklRVUVfVFlQRSA9IDkwLAorICAgIFZUX0FOWV9VTklRVUUgPSA5MiwKKyAgICBWVF9BTllfQU1CSUdVT1VTX1RZUEUgPSA5NCwKKyAgICBWVF9BTllfQU1CSUdVT1VTID0gOTYsCisgICAgVlRfVkVDVE9SX09GX0VOVU1TID0gOTgsCisgICAgVlRfU0lHTkVEX0VOVU0gPSAxMDAsCisgICAgVlRfVEVTVFJFUVVJUkVETkVTVEVERkxBVEJVRkZFUiA9IDEwMiwKKyAgICBWVF9TQ0FMQVJfS0VZX1NPUlRFRF9UQUJMRVMgPSAxMDQsCisgICAgVlRfTkFUSVZFX0lOTElORSA9IDEwNiwKKyAgICBWVF9MT05HX0VOVU1fTk9OX0VOVU1fREVGQVVMVCA9IDEwOCwKKyAgICBWVF9MT05HX0VOVU1fTk9STUFMX0RFRkFVTFQgPSAxMTAKKyAgfTsKKyAgY29uc3QgTXlHYW1lOjpFeGFtcGxlOjpWZWMzICpwb3MoKSBjb25zdCB7CisgICAgcmV0dXJuIEdldFN0cnVjdDxjb25zdCBNeUdhbWU6OkV4YW1wbGU6OlZlYzMgKj4oVlRfUE9TKTsKKyAgfQorICBNeUdhbWU6OkV4YW1wbGU6OlZlYzMgKm11dGFibGVfcG9zKCkgeworICAgIHJldHVybiBHZXRTdHJ1Y3Q8TXlHYW1lOjpFeGFtcGxlOjpWZWMzICo+KFZUX1BPUyk7CisgIH0KKyAgaW50MTZfdCBtYW5hKCkgY29uc3QgeworICAgIHJldHVybiBHZXRGaWVsZDxpbnQxNl90PihWVF9NQU5BLCAxNTApOworICB9CisgIGJvb2wgbXV0YXRlX21hbmEoaW50MTZfdCBfbWFuYSA9IDE1MCkgeworICAgIHJldHVybiBTZXRGaWVsZDxpbnQxNl90PihWVF9NQU5BLCBfbWFuYSwgMTUwKTsKKyAgfQorICBpbnQxNl90IGhwKCkgY29uc3QgeworICAgIHJldHVybiBHZXRGaWVsZDxpbnQxNl90PihWVF9IUCwgMTAwKTsKKyAgfQorICBib29sIG11dGF0ZV9ocChpbnQxNl90IF9ocCA9IDEwMCkgeworICAgIHJldHVybiBTZXRGaWVsZDxpbnQxNl90PihWVF9IUCwgX2hwLCAxMDApOworICB9CisgIGNvbnN0IGZsYXRidWZmZXJzOjpTdHJpbmcgKm5hbWUoKSBjb25zdCB7CisgICAgcmV0dXJuIEdldFBvaW50ZXI8Y29uc3QgZmxhdGJ1ZmZlcnM6OlN0cmluZyAqPihWVF9OQU1FKTsKKyAgfQorICBmbGF0YnVmZmVyczo6U3RyaW5nICptdXRhYmxlX25hbWUoKSB7CisgICAgcmV0dXJuIEdldFBvaW50ZXI8ZmxhdGJ1ZmZlcnM6OlN0cmluZyAqPihWVF9OQU1FKTsKKyAgfQorICBib29sIEtleUNvbXBhcmVMZXNzVGhhbihjb25zdCBNb25zdGVyICpvKSBjb25zdCB7CisgICAgcmV0dXJuICpuYW1lKCkgPCAqby0+bmFtZSgpOworICB9CisgIGludCBLZXlDb21wYXJlV2l0aFZhbHVlKGNvbnN0IGNoYXIgKl9uYW1lKSBjb25zdCB7CisgICAgcmV0dXJuIHN0cmNtcChuYW1lKCktPmNfc3RyKCksIF9uYW1lKTsKKyAgfQorICBjb25zdCBmbGF0YnVmZmVyczo6VmVjdG9yPHVpbnQ4X3Q+ICppbnZlbnRvcnkoKSBjb25zdCB7CisgICAgcmV0dXJuIEdldFBvaW50ZXI8Y29uc3QgZmxhdGJ1ZmZlcnM6OlZlY3Rvcjx1aW50OF90PiAqPihWVF9JTlZFTlRPUlkpOworICB9CisgIGZsYXRidWZmZXJzOjpWZWN0b3I8dWludDhfdD4gKm11dGFibGVfaW52ZW50b3J5KCkgeworICAgIHJldHVybiBHZXRQb2ludGVyPGZsYXRidWZmZXJzOjpWZWN0b3I8dWludDhfdD4gKj4oVlRfSU5WRU5UT1JZKTsKKyAgfQorICBNeUdhbWU6OkV4YW1wbGU6OkNvbG9yIGNvbG9yKCkgY29uc3QgeworICAgIHJldHVybiBzdGF0aWNfY2FzdDxNeUdhbWU6OkV4YW1wbGU6OkNvbG9yPihHZXRGaWVsZDx1aW50OF90PihWVF9DT0xPUiwgOCkpOworICB9CisgIGJvb2wgbXV0YXRlX2NvbG9yKE15R2FtZTo6RXhhbXBsZTo6Q29sb3IgX2NvbG9yID0gc3RhdGljX2Nhc3Q8TXlHYW1lOjpFeGFtcGxlOjpDb2xvcj4oOCkpIHsKKyAgICByZXR1cm4gU2V0RmllbGQ8dWludDhfdD4oVlRfQ09MT1IsIHN0YXRpY19jYXN0PHVpbnQ4X3Q+KF9jb2xvciksIDgpOworICB9CisgIE15R2FtZTo6RXhhbXBsZTo6QW55IHRlc3RfdHlwZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8TXlHYW1lOjpFeGFtcGxlOjpBbnk+KEdldEZpZWxkPHVpbnQ4X3Q+KFZUX1RFU1RfVFlQRSwgMCkpOworICB9CisgIGNvbnN0IHZvaWQgKnRlc3QoKSBjb25zdCB7CisgICAgcmV0dXJuIEdldFBvaW50ZXI8Y29uc3Qgdm9pZCAqPihWVF9URVNUKTsKKyAgfQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBjb25zdCBUICp0ZXN0X2FzKCkgY29uc3Q7CisgIGNvbnN0IE15R2FtZTo6RXhhbXBsZTo6TW9uc3RlciAqdGVzdF9hc19Nb25zdGVyKCkgY29uc3QgeworICAgIHJldHVybiB0ZXN0X3R5cGUoKSA9PSBNeUdhbWU6OkV4YW1wbGU6OkFueV9Nb25zdGVyID8gc3RhdGljX2Nhc3Q8Y29uc3QgTXlHYW1lOjpFeGFtcGxlOjpNb25zdGVyICo+KHRlc3QoKSkgOiBudWxscHRyOworICB9CisgIGNvbnN0IE15R2FtZTo6RXhhbXBsZTo6VGVzdFNpbXBsZVRhYmxlV2l0aEVudW0gKnRlc3RfYXNfVGVzdFNpbXBsZVRhYmxlV2l0aEVudW0oKSBjb25zdCB7CisgICAgcmV0dXJuIHRlc3RfdHlwZSgpID09IE15R2FtZTo6RXhhbXBsZTo6QW55X1Rlc3RTaW1wbGVUYWJsZVdpdGhFbnVtID8gc3RhdGljX2Nhc3Q8Y29uc3QgTXlHYW1lOjpFeGFtcGxlOjpUZXN0U2ltcGxlVGFibGVXaXRoRW51bSAqPih0ZXN0KCkpIDogbnVsbHB0cjsKKyAgfQorICBjb25zdCBNeUdhbWU6OkV4YW1wbGUyOjpNb25zdGVyICp0ZXN0X2FzX015R2FtZV9FeGFtcGxlMl9Nb25zdGVyKCkgY29uc3QgeworICAgIHJldHVybiB0ZXN0X3R5cGUoKSA9PSBNeUdhbWU6OkV4YW1wbGU6OkFueV9NeUdhbWVfRXhhbXBsZTJfTW9uc3RlciA/IHN0YXRpY19jYXN0PGNvbnN0IE15R2FtZTo6RXhhbXBsZTI6Ok1vbnN0ZXIgKj4odGVzdCgpKSA6IG51bGxwdHI7CisgIH0KKyAgdm9pZCAqbXV0YWJsZV90ZXN0KCkgeworICAgIHJldHVybiBHZXRQb2ludGVyPHZvaWQgKj4oVlRfVEVTVCk7CisgIH0KKyAgY29uc3QgZmxhdGJ1ZmZlcnM6OlZlY3Rvcjxjb25zdCBNeUdhbWU6OkV4YW1wbGU6OlRlc3QgKj4gKnRlc3Q0KCkgY29uc3QgeworICAgIHJldHVybiBHZXRQb2ludGVyPGNvbnN0IGZsYXRidWZmZXJzOjpWZWN0b3I8Y29uc3QgTXlHYW1lOjpFeGFtcGxlOjpUZXN0ICo+ICo+KFZUX1RFU1Q0KTsKKyAgfQorICBmbGF0YnVmZmVyczo6VmVjdG9yPGNvbnN0IE15R2FtZTo6RXhhbXBsZTo6VGVzdCAqPiAqbXV0YWJsZV90ZXN0NCgpIHsKKyAgICByZXR1cm4gR2V0UG9pbnRlcjxmbGF0YnVmZmVyczo6VmVjdG9yPGNvbnN0IE15R2FtZTo6RXhhbXBsZTo6VGVzdCAqPiAqPihWVF9URVNUNCk7CisgIH0KKyAgY29uc3QgZmxhdGJ1ZmZlcnM6OlZlY3RvcjxmbGF0YnVmZmVyczo6T2Zmc2V0PGZsYXRidWZmZXJzOjpTdHJpbmc+PiAqdGVzdGFycmF5b2ZzdHJpbmcoKSBjb25zdCB7CisgICAgcmV0dXJuIEdldFBvaW50ZXI8Y29uc3QgZmxhdGJ1ZmZlcnM6OlZlY3RvcjxmbGF0YnVmZmVyczo6T2Zmc2V0PGZsYXRidWZmZXJzOjpTdHJpbmc+PiAqPihWVF9URVNUQVJSQVlPRlNUUklORyk7CisgIH0KKyAgZmxhdGJ1ZmZlcnM6OlZlY3RvcjxmbGF0YnVmZmVyczo6T2Zmc2V0PGZsYXRidWZmZXJzOjpTdHJpbmc+PiAqbXV0YWJsZV90ZXN0YXJyYXlvZnN0cmluZygpIHsKKyAgICByZXR1cm4gR2V0UG9pbnRlcjxmbGF0YnVmZmVyczo6VmVjdG9yPGZsYXRidWZmZXJzOjpPZmZzZXQ8ZmxhdGJ1ZmZlcnM6OlN0cmluZz4+ICo+KFZUX1RFU1RBUlJBWU9GU1RSSU5HKTsKKyAgfQorICAvLy8gYW4gZXhhbXBsZSBkb2N1bWVudGF0aW9uIGNvbW1lbnQ6IHRoaXMgd2lsbCBlbmQgdXAgaW4gdGhlIGdlbmVyYXRlZCBjb2RlCisgIC8vLyBtdWx0aWxpbmUgdG9vCisgIGNvbnN0IGZsYXRidWZmZXJzOjpWZWN0b3I8ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxNeUdhbWU6OkV4YW1wbGU6Ok1vbnN0ZXI+PiAqdGVzdGFycmF5b2Z0YWJsZXMoKSBjb25zdCB7CisgICAgcmV0dXJuIEdldFBvaW50ZXI8Y29uc3QgZmxhdGJ1ZmZlcnM6OlZlY3RvcjxmbGF0YnVmZmVyczo6T2Zmc2V0PE15R2FtZTo6RXhhbXBsZTo6TW9uc3Rlcj4+ICo+KFZUX1RFU1RBUlJBWU9GVEFCTEVTKTsKKyAgfQorICBmbGF0YnVmZmVyczo6VmVjdG9yPGZsYXRidWZmZXJzOjpPZmZzZXQ8TXlHYW1lOjpFeGFtcGxlOjpNb25zdGVyPj4gKm11dGFibGVfdGVzdGFycmF5b2Z0YWJsZXMoKSB7CisgICAgcmV0dXJuIEdldFBvaW50ZXI8ZmxhdGJ1ZmZlcnM6OlZlY3RvcjxmbGF0YnVmZmVyczo6T2Zmc2V0PE15R2FtZTo6RXhhbXBsZTo6TW9uc3Rlcj4+ICo+KFZUX1RFU1RBUlJBWU9GVEFCTEVTKTsKKyAgfQorICBjb25zdCBNeUdhbWU6OkV4YW1wbGU6Ok1vbnN0ZXIgKmVuZW15KCkgY29uc3QgeworICAgIHJldHVybiBHZXRQb2ludGVyPGNvbnN0IE15R2FtZTo6RXhhbXBsZTo6TW9uc3RlciAqPihWVF9FTkVNWSk7CisgIH0KKyAgTXlHYW1lOjpFeGFtcGxlOjpNb25zdGVyICptdXRhYmxlX2VuZW15KCkgeworICAgIHJldHVybiBHZXRQb2ludGVyPE15R2FtZTo6RXhhbXBsZTo6TW9uc3RlciAqPihWVF9FTkVNWSk7CisgIH0KKyAgY29uc3QgZmxhdGJ1ZmZlcnM6OlZlY3Rvcjx1aW50OF90PiAqdGVzdG5lc3RlZGZsYXRidWZmZXIoKSBjb25zdCB7CisgICAgcmV0dXJuIEdldFBvaW50ZXI8Y29uc3QgZmxhdGJ1ZmZlcnM6OlZlY3Rvcjx1aW50OF90PiAqPihWVF9URVNUTkVTVEVERkxBVEJVRkZFUik7CisgIH0KKyAgZmxhdGJ1ZmZlcnM6OlZlY3Rvcjx1aW50OF90PiAqbXV0YWJsZV90ZXN0bmVzdGVkZmxhdGJ1ZmZlcigpIHsKKyAgICByZXR1cm4gR2V0UG9pbnRlcjxmbGF0YnVmZmVyczo6VmVjdG9yPHVpbnQ4X3Q+ICo+KFZUX1RFU1RORVNURURGTEFUQlVGRkVSKTsKKyAgfQorICBjb25zdCBNeUdhbWU6OkV4YW1wbGU6Ok1vbnN0ZXIgKnRlc3RuZXN0ZWRmbGF0YnVmZmVyX25lc3RlZF9yb290KCkgY29uc3QgeworICAgIHJldHVybiBmbGF0YnVmZmVyczo6R2V0Um9vdDxNeUdhbWU6OkV4YW1wbGU6Ok1vbnN0ZXI+KHRlc3RuZXN0ZWRmbGF0YnVmZmVyKCktPkRhdGEoKSk7CisgIH0KKyAgY29uc3QgTXlHYW1lOjpFeGFtcGxlOjpTdGF0ICp0ZXN0ZW1wdHkoKSBjb25zdCB7CisgICAgcmV0dXJuIEdldFBvaW50ZXI8Y29uc3QgTXlHYW1lOjpFeGFtcGxlOjpTdGF0ICo+KFZUX1RFU1RFTVBUWSk7CisgIH0KKyAgTXlHYW1lOjpFeGFtcGxlOjpTdGF0ICptdXRhYmxlX3Rlc3RlbXB0eSgpIHsKKyAgICByZXR1cm4gR2V0UG9pbnRlcjxNeUdhbWU6OkV4YW1wbGU6OlN0YXQgKj4oVlRfVEVTVEVNUFRZKTsKKyAgfQorICBib29sIHRlc3Rib29sKCkgY29uc3QgeworICAgIHJldHVybiBHZXRGaWVsZDx1aW50OF90PihWVF9URVNUQk9PTCwgMCkgIT0gMDsKKyAgfQorICBib29sIG11dGF0ZV90ZXN0Ym9vbChib29sIF90ZXN0Ym9vbCA9IDApIHsKKyAgICByZXR1cm4gU2V0RmllbGQ8dWludDhfdD4oVlRfVEVTVEJPT0wsIHN0YXRpY19jYXN0PHVpbnQ4X3Q+KF90ZXN0Ym9vbCksIDApOworICB9CisgIGludDMyX3QgdGVzdGhhc2hzMzJfZm52MSgpIGNvbnN0IHsKKyAgICByZXR1cm4gR2V0RmllbGQ8aW50MzJfdD4oVlRfVEVTVEhBU0hTMzJfRk5WMSwgMCk7CisgIH0KKyAgYm9vbCBtdXRhdGVfdGVzdGhhc2hzMzJfZm52MShpbnQzMl90IF90ZXN0aGFzaHMzMl9mbnYxID0gMCkgeworICAgIHJldHVybiBTZXRGaWVsZDxpbnQzMl90PihWVF9URVNUSEFTSFMzMl9GTlYxLCBfdGVzdGhhc2hzMzJfZm52MSwgMCk7CisgIH0KKyAgdWludDMyX3QgdGVzdGhhc2h1MzJfZm52MSgpIGNvbnN0IHsKKyAgICByZXR1cm4gR2V0RmllbGQ8dWludDMyX3Q+KFZUX1RFU1RIQVNIVTMyX0ZOVjEsIDApOworICB9CisgIGJvb2wgbXV0YXRlX3Rlc3RoYXNodTMyX2ZudjEodWludDMyX3QgX3Rlc3RoYXNodTMyX2ZudjEgPSAwKSB7CisgICAgcmV0dXJuIFNldEZpZWxkPHVpbnQzMl90PihWVF9URVNUSEFTSFUzMl9GTlYxLCBfdGVzdGhhc2h1MzJfZm52MSwgMCk7CisgIH0KKyAgaW50NjRfdCB0ZXN0aGFzaHM2NF9mbnYxKCkgY29uc3QgeworICAgIHJldHVybiBHZXRGaWVsZDxpbnQ2NF90PihWVF9URVNUSEFTSFM2NF9GTlYxLCAwKTsKKyAgfQorICBib29sIG11dGF0ZV90ZXN0aGFzaHM2NF9mbnYxKGludDY0X3QgX3Rlc3RoYXNoczY0X2ZudjEgPSAwKSB7CisgICAgcmV0dXJuIFNldEZpZWxkPGludDY0X3Q+KFZUX1RFU1RIQVNIUzY0X0ZOVjEsIF90ZXN0aGFzaHM2NF9mbnYxLCAwKTsKKyAgfQorICB1aW50NjRfdCB0ZXN0aGFzaHU2NF9mbnYxKCkgY29uc3QgeworICAgIHJldHVybiBHZXRGaWVsZDx1aW50NjRfdD4oVlRfVEVTVEhBU0hVNjRfRk5WMSwgMCk7CisgIH0KKyAgYm9vbCBtdXRhdGVfdGVzdGhhc2h1NjRfZm52MSh1aW50NjRfdCBfdGVzdGhhc2h1NjRfZm52MSA9IDApIHsKKyAgICByZXR1cm4gU2V0RmllbGQ8dWludDY0X3Q+KFZUX1RFU1RIQVNIVTY0X0ZOVjEsIF90ZXN0aGFzaHU2NF9mbnYxLCAwKTsKKyAgfQorICBpbnQzMl90IHRlc3RoYXNoczMyX2ZudjFhKCkgY29uc3QgeworICAgIHJldHVybiBHZXRGaWVsZDxpbnQzMl90PihWVF9URVNUSEFTSFMzMl9GTlYxQSwgMCk7CisgIH0KKyAgYm9vbCBtdXRhdGVfdGVzdGhhc2hzMzJfZm52MWEoaW50MzJfdCBfdGVzdGhhc2hzMzJfZm52MWEgPSAwKSB7CisgICAgcmV0dXJuIFNldEZpZWxkPGludDMyX3Q+KFZUX1RFU1RIQVNIUzMyX0ZOVjFBLCBfdGVzdGhhc2hzMzJfZm52MWEsIDApOworICB9CisgIHVpbnQzMl90IHRlc3RoYXNodTMyX2ZudjFhKCkgY29uc3QgeworICAgIHJldHVybiBHZXRGaWVsZDx1aW50MzJfdD4oVlRfVEVTVEhBU0hVMzJfRk5WMUEsIDApOworICB9CisgIGJvb2wgbXV0YXRlX3Rlc3RoYXNodTMyX2ZudjFhKHVpbnQzMl90IF90ZXN0aGFzaHUzMl9mbnYxYSA9IDApIHsKKyAgICByZXR1cm4gU2V0RmllbGQ8dWludDMyX3Q+KFZUX1RFU1RIQVNIVTMyX0ZOVjFBLCBfdGVzdGhhc2h1MzJfZm52MWEsIDApOworICB9CisgIGludDY0X3QgdGVzdGhhc2hzNjRfZm52MWEoKSBjb25zdCB7CisgICAgcmV0dXJuIEdldEZpZWxkPGludDY0X3Q+KFZUX1RFU1RIQVNIUzY0X0ZOVjFBLCAwKTsKKyAgfQorICBib29sIG11dGF0ZV90ZXN0aGFzaHM2NF9mbnYxYShpbnQ2NF90IF90ZXN0aGFzaHM2NF9mbnYxYSA9IDApIHsKKyAgICByZXR1cm4gU2V0RmllbGQ8aW50NjRfdD4oVlRfVEVTVEhBU0hTNjRfRk5WMUEsIF90ZXN0aGFzaHM2NF9mbnYxYSwgMCk7CisgIH0KKyAgdWludDY0X3QgdGVzdGhhc2h1NjRfZm52MWEoKSBjb25zdCB7CisgICAgcmV0dXJuIEdldEZpZWxkPHVpbnQ2NF90PihWVF9URVNUSEFTSFU2NF9GTlYxQSwgMCk7CisgIH0KKyAgYm9vbCBtdXRhdGVfdGVzdGhhc2h1NjRfZm52MWEodWludDY0X3QgX3Rlc3RoYXNodTY0X2ZudjFhID0gMCkgeworICAgIHJldHVybiBTZXRGaWVsZDx1aW50NjRfdD4oVlRfVEVTVEhBU0hVNjRfRk5WMUEsIF90ZXN0aGFzaHU2NF9mbnYxYSwgMCk7CisgIH0KKyAgY29uc3QgZmxhdGJ1ZmZlcnM6OlZlY3Rvcjx1aW50OF90PiAqdGVzdGFycmF5b2Zib29scygpIGNvbnN0IHsKKyAgICByZXR1cm4gR2V0UG9pbnRlcjxjb25zdCBmbGF0YnVmZmVyczo6VmVjdG9yPHVpbnQ4X3Q+ICo+KFZUX1RFU1RBUlJBWU9GQk9PTFMpOworICB9CisgIGZsYXRidWZmZXJzOjpWZWN0b3I8dWludDhfdD4gKm11dGFibGVfdGVzdGFycmF5b2Zib29scygpIHsKKyAgICByZXR1cm4gR2V0UG9pbnRlcjxmbGF0YnVmZmVyczo6VmVjdG9yPHVpbnQ4X3Q+ICo+KFZUX1RFU1RBUlJBWU9GQk9PTFMpOworICB9CisgIGZsb2F0IHRlc3RmKCkgY29uc3QgeworICAgIHJldHVybiBHZXRGaWVsZDxmbG9hdD4oVlRfVEVTVEYsIDMuMTQxNTlmKTsKKyAgfQorICBib29sIG11dGF0ZV90ZXN0ZihmbG9hdCBfdGVzdGYgPSAzLjE0MTU5ZikgeworICAgIHJldHVybiBTZXRGaWVsZDxmbG9hdD4oVlRfVEVTVEYsIF90ZXN0ZiwgMy4xNDE1OWYpOworICB9CisgIGZsb2F0IHRlc3RmMigpIGNvbnN0IHsKKyAgICByZXR1cm4gR2V0RmllbGQ8ZmxvYXQ+KFZUX1RFU1RGMiwgMy4wZik7CisgIH0KKyAgYm9vbCBtdXRhdGVfdGVzdGYyKGZsb2F0IF90ZXN0ZjIgPSAzLjBmKSB7CisgICAgcmV0dXJuIFNldEZpZWxkPGZsb2F0PihWVF9URVNURjIsIF90ZXN0ZjIsIDMuMGYpOworICB9CisgIGZsb2F0IHRlc3RmMygpIGNvbnN0IHsKKyAgICByZXR1cm4gR2V0RmllbGQ8ZmxvYXQ+KFZUX1RFU1RGMywgMC4wZik7CisgIH0KKyAgYm9vbCBtdXRhdGVfdGVzdGYzKGZsb2F0IF90ZXN0ZjMgPSAwLjBmKSB7CisgICAgcmV0dXJuIFNldEZpZWxkPGZsb2F0PihWVF9URVNURjMsIF90ZXN0ZjMsIDAuMGYpOworICB9CisgIGNvbnN0IGZsYXRidWZmZXJzOjpWZWN0b3I8ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxmbGF0YnVmZmVyczo6U3RyaW5nPj4gKnRlc3RhcnJheW9mc3RyaW5nMigpIGNvbnN0IHsKKyAgICByZXR1cm4gR2V0UG9pbnRlcjxjb25zdCBmbGF0YnVmZmVyczo6VmVjdG9yPGZsYXRidWZmZXJzOjpPZmZzZXQ8ZmxhdGJ1ZmZlcnM6OlN0cmluZz4+ICo+KFZUX1RFU1RBUlJBWU9GU1RSSU5HMik7CisgIH0KKyAgZmxhdGJ1ZmZlcnM6OlZlY3RvcjxmbGF0YnVmZmVyczo6T2Zmc2V0PGZsYXRidWZmZXJzOjpTdHJpbmc+PiAqbXV0YWJsZV90ZXN0YXJyYXlvZnN0cmluZzIoKSB7CisgICAgcmV0dXJuIEdldFBvaW50ZXI8ZmxhdGJ1ZmZlcnM6OlZlY3RvcjxmbGF0YnVmZmVyczo6T2Zmc2V0PGZsYXRidWZmZXJzOjpTdHJpbmc+PiAqPihWVF9URVNUQVJSQVlPRlNUUklORzIpOworICB9CisgIGNvbnN0IGZsYXRidWZmZXJzOjpWZWN0b3I8Y29uc3QgTXlHYW1lOjpFeGFtcGxlOjpBYmlsaXR5ICo+ICp0ZXN0YXJyYXlvZnNvcnRlZHN0cnVjdCgpIGNvbnN0IHsKKyAgICByZXR1cm4gR2V0UG9pbnRlcjxjb25zdCBmbGF0YnVmZmVyczo6VmVjdG9yPGNvbnN0IE15R2FtZTo6RXhhbXBsZTo6QWJpbGl0eSAqPiAqPihWVF9URVNUQVJSQVlPRlNPUlRFRFNUUlVDVCk7CisgIH0KKyAgZmxhdGJ1ZmZlcnM6OlZlY3Rvcjxjb25zdCBNeUdhbWU6OkV4YW1wbGU6OkFiaWxpdHkgKj4gKm11dGFibGVfdGVzdGFycmF5b2Zzb3J0ZWRzdHJ1Y3QoKSB7CisgICAgcmV0dXJuIEdldFBvaW50ZXI8ZmxhdGJ1ZmZlcnM6OlZlY3Rvcjxjb25zdCBNeUdhbWU6OkV4YW1wbGU6OkFiaWxpdHkgKj4gKj4oVlRfVEVTVEFSUkFZT0ZTT1JURURTVFJVQ1QpOworICB9CisgIGNvbnN0IGZsYXRidWZmZXJzOjpWZWN0b3I8dWludDhfdD4gKmZsZXgoKSBjb25zdCB7CisgICAgcmV0dXJuIEdldFBvaW50ZXI8Y29uc3QgZmxhdGJ1ZmZlcnM6OlZlY3Rvcjx1aW50OF90PiAqPihWVF9GTEVYKTsKKyAgfQorICBmbGF0YnVmZmVyczo6VmVjdG9yPHVpbnQ4X3Q+ICptdXRhYmxlX2ZsZXgoKSB7CisgICAgcmV0dXJuIEdldFBvaW50ZXI8ZmxhdGJ1ZmZlcnM6OlZlY3Rvcjx1aW50OF90PiAqPihWVF9GTEVYKTsKKyAgfQorICBmbGV4YnVmZmVyczo6UmVmZXJlbmNlIGZsZXhfZmxleGJ1ZmZlcl9yb290KCkgY29uc3QgeworICAgIHJldHVybiBmbGV4YnVmZmVyczo6R2V0Um9vdChmbGV4KCktPkRhdGEoKSwgZmxleCgpLT5zaXplKCkpOworICB9CisgIGNvbnN0IGZsYXRidWZmZXJzOjpWZWN0b3I8Y29uc3QgTXlHYW1lOjpFeGFtcGxlOjpUZXN0ICo+ICp0ZXN0NSgpIGNvbnN0IHsKKyAgICByZXR1cm4gR2V0UG9pbnRlcjxjb25zdCBmbGF0YnVmZmVyczo6VmVjdG9yPGNvbnN0IE15R2FtZTo6RXhhbXBsZTo6VGVzdCAqPiAqPihWVF9URVNUNSk7CisgIH0KKyAgZmxhdGJ1ZmZlcnM6OlZlY3Rvcjxjb25zdCBNeUdhbWU6OkV4YW1wbGU6OlRlc3QgKj4gKm11dGFibGVfdGVzdDUoKSB7CisgICAgcmV0dXJuIEdldFBvaW50ZXI8ZmxhdGJ1ZmZlcnM6OlZlY3Rvcjxjb25zdCBNeUdhbWU6OkV4YW1wbGU6OlRlc3QgKj4gKj4oVlRfVEVTVDUpOworICB9CisgIGNvbnN0IGZsYXRidWZmZXJzOjpWZWN0b3I8aW50NjRfdD4gKnZlY3Rvcl9vZl9sb25ncygpIGNvbnN0IHsKKyAgICByZXR1cm4gR2V0UG9pbnRlcjxjb25zdCBmbGF0YnVmZmVyczo6VmVjdG9yPGludDY0X3Q+ICo+KFZUX1ZFQ1RPUl9PRl9MT05HUyk7CisgIH0KKyAgZmxhdGJ1ZmZlcnM6OlZlY3RvcjxpbnQ2NF90PiAqbXV0YWJsZV92ZWN0b3Jfb2ZfbG9uZ3MoKSB7CisgICAgcmV0dXJuIEdldFBvaW50ZXI8ZmxhdGJ1ZmZlcnM6OlZlY3RvcjxpbnQ2NF90PiAqPihWVF9WRUNUT1JfT0ZfTE9OR1MpOworICB9CisgIGNvbnN0IGZsYXRidWZmZXJzOjpWZWN0b3I8ZG91YmxlPiAqdmVjdG9yX29mX2RvdWJsZXMoKSBjb25zdCB7CisgICAgcmV0dXJuIEdldFBvaW50ZXI8Y29uc3QgZmxhdGJ1ZmZlcnM6OlZlY3Rvcjxkb3VibGU+ICo+KFZUX1ZFQ1RPUl9PRl9ET1VCTEVTKTsKKyAgfQorICBmbGF0YnVmZmVyczo6VmVjdG9yPGRvdWJsZT4gKm11dGFibGVfdmVjdG9yX29mX2RvdWJsZXMoKSB7CisgICAgcmV0dXJuIEdldFBvaW50ZXI8ZmxhdGJ1ZmZlcnM6OlZlY3Rvcjxkb3VibGU+ICo+KFZUX1ZFQ1RPUl9PRl9ET1VCTEVTKTsKKyAgfQorICBjb25zdCBNeUdhbWU6OkluUGFyZW50TmFtZXNwYWNlICpwYXJlbnRfbmFtZXNwYWNlX3Rlc3QoKSBjb25zdCB7CisgICAgcmV0dXJuIEdldFBvaW50ZXI8Y29uc3QgTXlHYW1lOjpJblBhcmVudE5hbWVzcGFjZSAqPihWVF9QQVJFTlRfTkFNRVNQQUNFX1RFU1QpOworICB9CisgIE15R2FtZTo6SW5QYXJlbnROYW1lc3BhY2UgKm11dGFibGVfcGFyZW50X25hbWVzcGFjZV90ZXN0KCkgeworICAgIHJldHVybiBHZXRQb2ludGVyPE15R2FtZTo6SW5QYXJlbnROYW1lc3BhY2UgKj4oVlRfUEFSRU5UX05BTUVTUEFDRV9URVNUKTsKKyAgfQorICBjb25zdCBmbGF0YnVmZmVyczo6VmVjdG9yPGZsYXRidWZmZXJzOjpPZmZzZXQ8TXlHYW1lOjpFeGFtcGxlOjpSZWZlcnJhYmxlPj4gKnZlY3Rvcl9vZl9yZWZlcnJhYmxlcygpIGNvbnN0IHsKKyAgICByZXR1cm4gR2V0UG9pbnRlcjxjb25zdCBmbGF0YnVmZmVyczo6VmVjdG9yPGZsYXRidWZmZXJzOjpPZmZzZXQ8TXlHYW1lOjpFeGFtcGxlOjpSZWZlcnJhYmxlPj4gKj4oVlRfVkVDVE9SX09GX1JFRkVSUkFCTEVTKTsKKyAgfQorICBmbGF0YnVmZmVyczo6VmVjdG9yPGZsYXRidWZmZXJzOjpPZmZzZXQ8TXlHYW1lOjpFeGFtcGxlOjpSZWZlcnJhYmxlPj4gKm11dGFibGVfdmVjdG9yX29mX3JlZmVycmFibGVzKCkgeworICAgIHJldHVybiBHZXRQb2ludGVyPGZsYXRidWZmZXJzOjpWZWN0b3I8ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxNeUdhbWU6OkV4YW1wbGU6OlJlZmVycmFibGU+PiAqPihWVF9WRUNUT1JfT0ZfUkVGRVJSQUJMRVMpOworICB9CisgIHVpbnQ2NF90IHNpbmdsZV93ZWFrX3JlZmVyZW5jZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gR2V0RmllbGQ8dWludDY0X3Q+KFZUX1NJTkdMRV9XRUFLX1JFRkVSRU5DRSwgMCk7CisgIH0KKyAgYm9vbCBtdXRhdGVfc2luZ2xlX3dlYWtfcmVmZXJlbmNlKHVpbnQ2NF90IF9zaW5nbGVfd2Vha19yZWZlcmVuY2UgPSAwKSB7CisgICAgcmV0dXJuIFNldEZpZWxkPHVpbnQ2NF90PihWVF9TSU5HTEVfV0VBS19SRUZFUkVOQ0UsIF9zaW5nbGVfd2Vha19yZWZlcmVuY2UsIDApOworICB9CisgIGNvbnN0IGZsYXRidWZmZXJzOjpWZWN0b3I8dWludDY0X3Q+ICp2ZWN0b3Jfb2Zfd2Vha19yZWZlcmVuY2VzKCkgY29uc3QgeworICAgIHJldHVybiBHZXRQb2ludGVyPGNvbnN0IGZsYXRidWZmZXJzOjpWZWN0b3I8dWludDY0X3Q+ICo+KFZUX1ZFQ1RPUl9PRl9XRUFLX1JFRkVSRU5DRVMpOworICB9CisgIGZsYXRidWZmZXJzOjpWZWN0b3I8dWludDY0X3Q+ICptdXRhYmxlX3ZlY3Rvcl9vZl93ZWFrX3JlZmVyZW5jZXMoKSB7CisgICAgcmV0dXJuIEdldFBvaW50ZXI8ZmxhdGJ1ZmZlcnM6OlZlY3Rvcjx1aW50NjRfdD4gKj4oVlRfVkVDVE9SX09GX1dFQUtfUkVGRVJFTkNFUyk7CisgIH0KKyAgY29uc3QgZmxhdGJ1ZmZlcnM6OlZlY3RvcjxmbGF0YnVmZmVyczo6T2Zmc2V0PE15R2FtZTo6RXhhbXBsZTo6UmVmZXJyYWJsZT4+ICp2ZWN0b3Jfb2Zfc3Ryb25nX3JlZmVycmFibGVzKCkgY29uc3QgeworICAgIHJldHVybiBHZXRQb2ludGVyPGNvbnN0IGZsYXRidWZmZXJzOjpWZWN0b3I8ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxNeUdhbWU6OkV4YW1wbGU6OlJlZmVycmFibGU+PiAqPihWVF9WRUNUT1JfT0ZfU1RST05HX1JFRkVSUkFCTEVTKTsKKyAgfQorICBmbGF0YnVmZmVyczo6VmVjdG9yPGZsYXRidWZmZXJzOjpPZmZzZXQ8TXlHYW1lOjpFeGFtcGxlOjpSZWZlcnJhYmxlPj4gKm11dGFibGVfdmVjdG9yX29mX3N0cm9uZ19yZWZlcnJhYmxlcygpIHsKKyAgICByZXR1cm4gR2V0UG9pbnRlcjxmbGF0YnVmZmVyczo6VmVjdG9yPGZsYXRidWZmZXJzOjpPZmZzZXQ8TXlHYW1lOjpFeGFtcGxlOjpSZWZlcnJhYmxlPj4gKj4oVlRfVkVDVE9SX09GX1NUUk9OR19SRUZFUlJBQkxFUyk7CisgIH0KKyAgdWludDY0X3QgY29fb3duaW5nX3JlZmVyZW5jZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gR2V0RmllbGQ8dWludDY0X3Q+KFZUX0NPX09XTklOR19SRUZFUkVOQ0UsIDApOworICB9CisgIGJvb2wgbXV0YXRlX2NvX293bmluZ19yZWZlcmVuY2UodWludDY0X3QgX2NvX293bmluZ19yZWZlcmVuY2UgPSAwKSB7CisgICAgcmV0dXJuIFNldEZpZWxkPHVpbnQ2NF90PihWVF9DT19PV05JTkdfUkVGRVJFTkNFLCBfY29fb3duaW5nX3JlZmVyZW5jZSwgMCk7CisgIH0KKyAgY29uc3QgZmxhdGJ1ZmZlcnM6OlZlY3Rvcjx1aW50NjRfdD4gKnZlY3Rvcl9vZl9jb19vd25pbmdfcmVmZXJlbmNlcygpIGNvbnN0IHsKKyAgICByZXR1cm4gR2V0UG9pbnRlcjxjb25zdCBmbGF0YnVmZmVyczo6VmVjdG9yPHVpbnQ2NF90PiAqPihWVF9WRUNUT1JfT0ZfQ09fT1dOSU5HX1JFRkVSRU5DRVMpOworICB9CisgIGZsYXRidWZmZXJzOjpWZWN0b3I8dWludDY0X3Q+ICptdXRhYmxlX3ZlY3Rvcl9vZl9jb19vd25pbmdfcmVmZXJlbmNlcygpIHsKKyAgICByZXR1cm4gR2V0UG9pbnRlcjxmbGF0YnVmZmVyczo6VmVjdG9yPHVpbnQ2NF90PiAqPihWVF9WRUNUT1JfT0ZfQ09fT1dOSU5HX1JFRkVSRU5DRVMpOworICB9CisgIHVpbnQ2NF90IG5vbl9vd25pbmdfcmVmZXJlbmNlKCkgY29uc3QgeworICAgIHJldHVybiBHZXRGaWVsZDx1aW50NjRfdD4oVlRfTk9OX09XTklOR19SRUZFUkVOQ0UsIDApOworICB9CisgIGJvb2wgbXV0YXRlX25vbl9vd25pbmdfcmVmZXJlbmNlKHVpbnQ2NF90IF9ub25fb3duaW5nX3JlZmVyZW5jZSA9IDApIHsKKyAgICByZXR1cm4gU2V0RmllbGQ8dWludDY0X3Q+KFZUX05PTl9PV05JTkdfUkVGRVJFTkNFLCBfbm9uX293bmluZ19yZWZlcmVuY2UsIDApOworICB9CisgIGNvbnN0IGZsYXRidWZmZXJzOjpWZWN0b3I8dWludDY0X3Q+ICp2ZWN0b3Jfb2Zfbm9uX293bmluZ19yZWZlcmVuY2VzKCkgY29uc3QgeworICAgIHJldHVybiBHZXRQb2ludGVyPGNvbnN0IGZsYXRidWZmZXJzOjpWZWN0b3I8dWludDY0X3Q+ICo+KFZUX1ZFQ1RPUl9PRl9OT05fT1dOSU5HX1JFRkVSRU5DRVMpOworICB9CisgIGZsYXRidWZmZXJzOjpWZWN0b3I8dWludDY0X3Q+ICptdXRhYmxlX3ZlY3Rvcl9vZl9ub25fb3duaW5nX3JlZmVyZW5jZXMoKSB7CisgICAgcmV0dXJuIEdldFBvaW50ZXI8ZmxhdGJ1ZmZlcnM6OlZlY3Rvcjx1aW50NjRfdD4gKj4oVlRfVkVDVE9SX09GX05PTl9PV05JTkdfUkVGRVJFTkNFUyk7CisgIH0KKyAgTXlHYW1lOjpFeGFtcGxlOjpBbnlVbmlxdWVBbGlhc2VzIGFueV91bmlxdWVfdHlwZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8TXlHYW1lOjpFeGFtcGxlOjpBbnlVbmlxdWVBbGlhc2VzPihHZXRGaWVsZDx1aW50OF90PihWVF9BTllfVU5JUVVFX1RZUEUsIDApKTsKKyAgfQorICBjb25zdCB2b2lkICphbnlfdW5pcXVlKCkgY29uc3QgeworICAgIHJldHVybiBHZXRQb2ludGVyPGNvbnN0IHZvaWQgKj4oVlRfQU5ZX1VOSVFVRSk7CisgIH0KKyAgdGVtcGxhdGU8dHlwZW5hbWUgVD4gY29uc3QgVCAqYW55X3VuaXF1ZV9hcygpIGNvbnN0OworICBjb25zdCBNeUdhbWU6OkV4YW1wbGU6Ok1vbnN0ZXIgKmFueV91bmlxdWVfYXNfTSgpIGNvbnN0IHsKKyAgICByZXR1cm4gYW55X3VuaXF1ZV90eXBlKCkgPT0gTXlHYW1lOjpFeGFtcGxlOjpBbnlVbmlxdWVBbGlhc2VzX00gPyBzdGF0aWNfY2FzdDxjb25zdCBNeUdhbWU6OkV4YW1wbGU6Ok1vbnN0ZXIgKj4oYW55X3VuaXF1ZSgpKSA6IG51bGxwdHI7CisgIH0KKyAgY29uc3QgTXlHYW1lOjpFeGFtcGxlOjpUZXN0U2ltcGxlVGFibGVXaXRoRW51bSAqYW55X3VuaXF1ZV9hc19UUygpIGNvbnN0IHsKKyAgICByZXR1cm4gYW55X3VuaXF1ZV90eXBlKCkgPT0gTXlHYW1lOjpFeGFtcGxlOjpBbnlVbmlxdWVBbGlhc2VzX1RTID8gc3RhdGljX2Nhc3Q8Y29uc3QgTXlHYW1lOjpFeGFtcGxlOjpUZXN0U2ltcGxlVGFibGVXaXRoRW51bSAqPihhbnlfdW5pcXVlKCkpIDogbnVsbHB0cjsKKyAgfQorICBjb25zdCBNeUdhbWU6OkV4YW1wbGUyOjpNb25zdGVyICphbnlfdW5pcXVlX2FzX00yKCkgY29uc3QgeworICAgIHJldHVybiBhbnlfdW5pcXVlX3R5cGUoKSA9PSBNeUdhbWU6OkV4YW1wbGU6OkFueVVuaXF1ZUFsaWFzZXNfTTIgPyBzdGF0aWNfY2FzdDxjb25zdCBNeUdhbWU6OkV4YW1wbGUyOjpNb25zdGVyICo+KGFueV91bmlxdWUoKSkgOiBudWxscHRyOworICB9CisgIHZvaWQgKm11dGFibGVfYW55X3VuaXF1ZSgpIHsKKyAgICByZXR1cm4gR2V0UG9pbnRlcjx2b2lkICo+KFZUX0FOWV9VTklRVUUpOworICB9CisgIE15R2FtZTo6RXhhbXBsZTo6QW55QW1iaWd1b3VzQWxpYXNlcyBhbnlfYW1iaWd1b3VzX3R5cGUoKSBjb25zdCB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PE15R2FtZTo6RXhhbXBsZTo6QW55QW1iaWd1b3VzQWxpYXNlcz4oR2V0RmllbGQ8dWludDhfdD4oVlRfQU5ZX0FNQklHVU9VU19UWVBFLCAwKSk7CisgIH0KKyAgY29uc3Qgdm9pZCAqYW55X2FtYmlndW91cygpIGNvbnN0IHsKKyAgICByZXR1cm4gR2V0UG9pbnRlcjxjb25zdCB2b2lkICo+KFZUX0FOWV9BTUJJR1VPVVMpOworICB9CisgIGNvbnN0IE15R2FtZTo6RXhhbXBsZTo6TW9uc3RlciAqYW55X2FtYmlndW91c19hc19NMSgpIGNvbnN0IHsKKyAgICByZXR1cm4gYW55X2FtYmlndW91c190eXBlKCkgPT0gTXlHYW1lOjpFeGFtcGxlOjpBbnlBbWJpZ3VvdXNBbGlhc2VzX00xID8gc3RhdGljX2Nhc3Q8Y29uc3QgTXlHYW1lOjpFeGFtcGxlOjpNb25zdGVyICo+KGFueV9hbWJpZ3VvdXMoKSkgOiBudWxscHRyOworICB9CisgIGNvbnN0IE15R2FtZTo6RXhhbXBsZTo6TW9uc3RlciAqYW55X2FtYmlndW91c19hc19NMigpIGNvbnN0IHsKKyAgICByZXR1cm4gYW55X2FtYmlndW91c190eXBlKCkgPT0gTXlHYW1lOjpFeGFtcGxlOjpBbnlBbWJpZ3VvdXNBbGlhc2VzX00yID8gc3RhdGljX2Nhc3Q8Y29uc3QgTXlHYW1lOjpFeGFtcGxlOjpNb25zdGVyICo+KGFueV9hbWJpZ3VvdXMoKSkgOiBudWxscHRyOworICB9CisgIGNvbnN0IE15R2FtZTo6RXhhbXBsZTo6TW9uc3RlciAqYW55X2FtYmlndW91c19hc19NMygpIGNvbnN0IHsKKyAgICByZXR1cm4gYW55X2FtYmlndW91c190eXBlKCkgPT0gTXlHYW1lOjpFeGFtcGxlOjpBbnlBbWJpZ3VvdXNBbGlhc2VzX00zID8gc3RhdGljX2Nhc3Q8Y29uc3QgTXlHYW1lOjpFeGFtcGxlOjpNb25zdGVyICo+KGFueV9hbWJpZ3VvdXMoKSkgOiBudWxscHRyOworICB9CisgIHZvaWQgKm11dGFibGVfYW55X2FtYmlndW91cygpIHsKKyAgICByZXR1cm4gR2V0UG9pbnRlcjx2b2lkICo+KFZUX0FOWV9BTUJJR1VPVVMpOworICB9CisgIGNvbnN0IGZsYXRidWZmZXJzOjpWZWN0b3I8dWludDhfdD4gKnZlY3Rvcl9vZl9lbnVtcygpIGNvbnN0IHsKKyAgICByZXR1cm4gR2V0UG9pbnRlcjxjb25zdCBmbGF0YnVmZmVyczo6VmVjdG9yPHVpbnQ4X3Q+ICo+KFZUX1ZFQ1RPUl9PRl9FTlVNUyk7CisgIH0KKyAgZmxhdGJ1ZmZlcnM6OlZlY3Rvcjx1aW50OF90PiAqbXV0YWJsZV92ZWN0b3Jfb2ZfZW51bXMoKSB7CisgICAgcmV0dXJuIEdldFBvaW50ZXI8ZmxhdGJ1ZmZlcnM6OlZlY3Rvcjx1aW50OF90PiAqPihWVF9WRUNUT1JfT0ZfRU5VTVMpOworICB9CisgIE15R2FtZTo6RXhhbXBsZTo6UmFjZSBzaWduZWRfZW51bSgpIGNvbnN0IHsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8TXlHYW1lOjpFeGFtcGxlOjpSYWNlPihHZXRGaWVsZDxpbnQ4X3Q+KFZUX1NJR05FRF9FTlVNLCAtMSkpOworICB9CisgIGJvb2wgbXV0YXRlX3NpZ25lZF9lbnVtKE15R2FtZTo6RXhhbXBsZTo6UmFjZSBfc2lnbmVkX2VudW0gPSBzdGF0aWNfY2FzdDxNeUdhbWU6OkV4YW1wbGU6OlJhY2U+KC0xKSkgeworICAgIHJldHVybiBTZXRGaWVsZDxpbnQ4X3Q+KFZUX1NJR05FRF9FTlVNLCBzdGF0aWNfY2FzdDxpbnQ4X3Q+KF9zaWduZWRfZW51bSksIC0xKTsKKyAgfQorICBjb25zdCBmbGF0YnVmZmVyczo6VmVjdG9yPHVpbnQ4X3Q+ICp0ZXN0cmVxdWlyZWRuZXN0ZWRmbGF0YnVmZmVyKCkgY29uc3QgeworICAgIHJldHVybiBHZXRQb2ludGVyPGNvbnN0IGZsYXRidWZmZXJzOjpWZWN0b3I8dWludDhfdD4gKj4oVlRfVEVTVFJFUVVJUkVETkVTVEVERkxBVEJVRkZFUik7CisgIH0KKyAgZmxhdGJ1ZmZlcnM6OlZlY3Rvcjx1aW50OF90PiAqbXV0YWJsZV90ZXN0cmVxdWlyZWRuZXN0ZWRmbGF0YnVmZmVyKCkgeworICAgIHJldHVybiBHZXRQb2ludGVyPGZsYXRidWZmZXJzOjpWZWN0b3I8dWludDhfdD4gKj4oVlRfVEVTVFJFUVVJUkVETkVTVEVERkxBVEJVRkZFUik7CisgIH0KKyAgY29uc3QgTXlHYW1lOjpFeGFtcGxlOjpNb25zdGVyICp0ZXN0cmVxdWlyZWRuZXN0ZWRmbGF0YnVmZmVyX25lc3RlZF9yb290KCkgY29uc3QgeworICAgIHJldHVybiBmbGF0YnVmZmVyczo6R2V0Um9vdDxNeUdhbWU6OkV4YW1wbGU6Ok1vbnN0ZXI+KHRlc3RyZXF1aXJlZG5lc3RlZGZsYXRidWZmZXIoKS0+RGF0YSgpKTsKKyAgfQorICBjb25zdCBmbGF0YnVmZmVyczo6VmVjdG9yPGZsYXRidWZmZXJzOjpPZmZzZXQ8TXlHYW1lOjpFeGFtcGxlOjpTdGF0Pj4gKnNjYWxhcl9rZXlfc29ydGVkX3RhYmxlcygpIGNvbnN0IHsKKyAgICByZXR1cm4gR2V0UG9pbnRlcjxjb25zdCBmbGF0YnVmZmVyczo6VmVjdG9yPGZsYXRidWZmZXJzOjpPZmZzZXQ8TXlHYW1lOjpFeGFtcGxlOjpTdGF0Pj4gKj4oVlRfU0NBTEFSX0tFWV9TT1JURURfVEFCTEVTKTsKKyAgfQorICBmbGF0YnVmZmVyczo6VmVjdG9yPGZsYXRidWZmZXJzOjpPZmZzZXQ8TXlHYW1lOjpFeGFtcGxlOjpTdGF0Pj4gKm11dGFibGVfc2NhbGFyX2tleV9zb3J0ZWRfdGFibGVzKCkgeworICAgIHJldHVybiBHZXRQb2ludGVyPGZsYXRidWZmZXJzOjpWZWN0b3I8ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxNeUdhbWU6OkV4YW1wbGU6OlN0YXQ+PiAqPihWVF9TQ0FMQVJfS0VZX1NPUlRFRF9UQUJMRVMpOworICB9CisgIGNvbnN0IE15R2FtZTo6RXhhbXBsZTo6VGVzdCAqbmF0aXZlX2lubGluZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gR2V0U3RydWN0PGNvbnN0IE15R2FtZTo6RXhhbXBsZTo6VGVzdCAqPihWVF9OQVRJVkVfSU5MSU5FKTsKKyAgfQorICBNeUdhbWU6OkV4YW1wbGU6OlRlc3QgKm11dGFibGVfbmF0aXZlX2lubGluZSgpIHsKKyAgICByZXR1cm4gR2V0U3RydWN0PE15R2FtZTo6RXhhbXBsZTo6VGVzdCAqPihWVF9OQVRJVkVfSU5MSU5FKTsKKyAgfQorICBNeUdhbWU6OkV4YW1wbGU6OkxvbmdFbnVtIGxvbmdfZW51bV9ub25fZW51bV9kZWZhdWx0KCkgY29uc3QgeworICAgIHJldHVybiBzdGF0aWNfY2FzdDxNeUdhbWU6OkV4YW1wbGU6OkxvbmdFbnVtPihHZXRGaWVsZDx1aW50NjRfdD4oVlRfTE9OR19FTlVNX05PTl9FTlVNX0RFRkFVTFQsIDApKTsKKyAgfQorICBib29sIG11dGF0ZV9sb25nX2VudW1fbm9uX2VudW1fZGVmYXVsdChNeUdhbWU6OkV4YW1wbGU6OkxvbmdFbnVtIF9sb25nX2VudW1fbm9uX2VudW1fZGVmYXVsdCA9IHN0YXRpY19jYXN0PE15R2FtZTo6RXhhbXBsZTo6TG9uZ0VudW0+KDApKSB7CisgICAgcmV0dXJuIFNldEZpZWxkPHVpbnQ2NF90PihWVF9MT05HX0VOVU1fTk9OX0VOVU1fREVGQVVMVCwgc3RhdGljX2Nhc3Q8dWludDY0X3Q+KF9sb25nX2VudW1fbm9uX2VudW1fZGVmYXVsdCksIDApOworICB9CisgIE15R2FtZTo6RXhhbXBsZTo6TG9uZ0VudW0gbG9uZ19lbnVtX25vcm1hbF9kZWZhdWx0KCkgY29uc3QgeworICAgIHJldHVybiBzdGF0aWNfY2FzdDxNeUdhbWU6OkV4YW1wbGU6OkxvbmdFbnVtPihHZXRGaWVsZDx1aW50NjRfdD4oVlRfTE9OR19FTlVNX05PUk1BTF9ERUZBVUxULCAyVUxMKSk7CisgIH0KKyAgYm9vbCBtdXRhdGVfbG9uZ19lbnVtX25vcm1hbF9kZWZhdWx0KE15R2FtZTo6RXhhbXBsZTo6TG9uZ0VudW0gX2xvbmdfZW51bV9ub3JtYWxfZGVmYXVsdCA9IHN0YXRpY19jYXN0PE15R2FtZTo6RXhhbXBsZTo6TG9uZ0VudW0+KDJVTEwpKSB7CisgICAgcmV0dXJuIFNldEZpZWxkPHVpbnQ2NF90PihWVF9MT05HX0VOVU1fTk9STUFMX0RFRkFVTFQsIHN0YXRpY19jYXN0PHVpbnQ2NF90PihfbG9uZ19lbnVtX25vcm1hbF9kZWZhdWx0KSwgMlVMTCk7CisgIH0KKyAgYm9vbCBWZXJpZnkoZmxhdGJ1ZmZlcnM6OlZlcmlmaWVyICZ2ZXJpZmllcikgY29uc3QgeworICAgIHJldHVybiBWZXJpZnlUYWJsZVN0YXJ0KHZlcmlmaWVyKSAmJgorICAgICAgICAgICBWZXJpZnlGaWVsZDxNeUdhbWU6OkV4YW1wbGU6OlZlYzM+KHZlcmlmaWVyLCBWVF9QT1MsIDgpICYmCisgICAgICAgICAgIFZlcmlmeUZpZWxkPGludDE2X3Q+KHZlcmlmaWVyLCBWVF9NQU5BLCAyKSAmJgorICAgICAgICAgICBWZXJpZnlGaWVsZDxpbnQxNl90Pih2ZXJpZmllciwgVlRfSFAsIDIpICYmCisgICAgICAgICAgIFZlcmlmeU9mZnNldFJlcXVpcmVkKHZlcmlmaWVyLCBWVF9OQU1FKSAmJgorICAgICAgICAgICB2ZXJpZmllci5WZXJpZnlTdHJpbmcobmFtZSgpKSAmJgorICAgICAgICAgICBWZXJpZnlPZmZzZXQodmVyaWZpZXIsIFZUX0lOVkVOVE9SWSkgJiYKKyAgICAgICAgICAgdmVyaWZpZXIuVmVyaWZ5VmVjdG9yKGludmVudG9yeSgpKSAmJgorICAgICAgICAgICBWZXJpZnlGaWVsZDx1aW50OF90Pih2ZXJpZmllciwgVlRfQ09MT1IsIDEpICYmCisgICAgICAgICAgIFZlcmlmeUZpZWxkPHVpbnQ4X3Q+KHZlcmlmaWVyLCBWVF9URVNUX1RZUEUsIDEpICYmCisgICAgICAgICAgIFZlcmlmeU9mZnNldCh2ZXJpZmllciwgVlRfVEVTVCkgJiYKKyAgICAgICAgICAgVmVyaWZ5QW55KHZlcmlmaWVyLCB0ZXN0KCksIHRlc3RfdHlwZSgpKSAmJgorICAgICAgICAgICBWZXJpZnlPZmZzZXQodmVyaWZpZXIsIFZUX1RFU1Q0KSAmJgorICAgICAgICAgICB2ZXJpZmllci5WZXJpZnlWZWN0b3IodGVzdDQoKSkgJiYKKyAgICAgICAgICAgVmVyaWZ5T2Zmc2V0KHZlcmlmaWVyLCBWVF9URVNUQVJSQVlPRlNUUklORykgJiYKKyAgICAgICAgICAgdmVyaWZpZXIuVmVyaWZ5VmVjdG9yKHRlc3RhcnJheW9mc3RyaW5nKCkpICYmCisgICAgICAgICAgIHZlcmlmaWVyLlZlcmlmeVZlY3Rvck9mU3RyaW5ncyh0ZXN0YXJyYXlvZnN0cmluZygpKSAmJgorICAgICAgICAgICBWZXJpZnlPZmZzZXQodmVyaWZpZXIsIFZUX1RFU1RBUlJBWU9GVEFCTEVTKSAmJgorICAgICAgICAgICB2ZXJpZmllci5WZXJpZnlWZWN0b3IodGVzdGFycmF5b2Z0YWJsZXMoKSkgJiYKKyAgICAgICAgICAgdmVyaWZpZXIuVmVyaWZ5VmVjdG9yT2ZUYWJsZXModGVzdGFycmF5b2Z0YWJsZXMoKSkgJiYKKyAgICAgICAgICAgVmVyaWZ5T2Zmc2V0KHZlcmlmaWVyLCBWVF9FTkVNWSkgJiYKKyAgICAgICAgICAgdmVyaWZpZXIuVmVyaWZ5VGFibGUoZW5lbXkoKSkgJiYKKyAgICAgICAgICAgVmVyaWZ5T2Zmc2V0KHZlcmlmaWVyLCBWVF9URVNUTkVTVEVERkxBVEJVRkZFUikgJiYKKyAgICAgICAgICAgdmVyaWZpZXIuVmVyaWZ5VmVjdG9yKHRlc3RuZXN0ZWRmbGF0YnVmZmVyKCkpICYmCisgICAgICAgICAgIHZlcmlmaWVyLlZlcmlmeU5lc3RlZEZsYXRCdWZmZXI8TXlHYW1lOjpFeGFtcGxlOjpNb25zdGVyPih0ZXN0bmVzdGVkZmxhdGJ1ZmZlcigpLCBudWxscHRyKSAmJgorICAgICAgICAgICBWZXJpZnlPZmZzZXQodmVyaWZpZXIsIFZUX1RFU1RFTVBUWSkgJiYKKyAgICAgICAgICAgdmVyaWZpZXIuVmVyaWZ5VGFibGUodGVzdGVtcHR5KCkpICYmCisgICAgICAgICAgIFZlcmlmeUZpZWxkPHVpbnQ4X3Q+KHZlcmlmaWVyLCBWVF9URVNUQk9PTCwgMSkgJiYKKyAgICAgICAgICAgVmVyaWZ5RmllbGQ8aW50MzJfdD4odmVyaWZpZXIsIFZUX1RFU1RIQVNIUzMyX0ZOVjEsIDQpICYmCisgICAgICAgICAgIFZlcmlmeUZpZWxkPHVpbnQzMl90Pih2ZXJpZmllciwgVlRfVEVTVEhBU0hVMzJfRk5WMSwgNCkgJiYKKyAgICAgICAgICAgVmVyaWZ5RmllbGQ8aW50NjRfdD4odmVyaWZpZXIsIFZUX1RFU1RIQVNIUzY0X0ZOVjEsIDgpICYmCisgICAgICAgICAgIFZlcmlmeUZpZWxkPHVpbnQ2NF90Pih2ZXJpZmllciwgVlRfVEVTVEhBU0hVNjRfRk5WMSwgOCkgJiYKKyAgICAgICAgICAgVmVyaWZ5RmllbGQ8aW50MzJfdD4odmVyaWZpZXIsIFZUX1RFU1RIQVNIUzMyX0ZOVjFBLCA0KSAmJgorICAgICAgICAgICBWZXJpZnlGaWVsZDx1aW50MzJfdD4odmVyaWZpZXIsIFZUX1RFU1RIQVNIVTMyX0ZOVjFBLCA0KSAmJgorICAgICAgICAgICBWZXJpZnlGaWVsZDxpbnQ2NF90Pih2ZXJpZmllciwgVlRfVEVTVEhBU0hTNjRfRk5WMUEsIDgpICYmCisgICAgICAgICAgIFZlcmlmeUZpZWxkPHVpbnQ2NF90Pih2ZXJpZmllciwgVlRfVEVTVEhBU0hVNjRfRk5WMUEsIDgpICYmCisgICAgICAgICAgIFZlcmlmeU9mZnNldCh2ZXJpZmllciwgVlRfVEVTVEFSUkFZT0ZCT09MUykgJiYKKyAgICAgICAgICAgdmVyaWZpZXIuVmVyaWZ5VmVjdG9yKHRlc3RhcnJheW9mYm9vbHMoKSkgJiYKKyAgICAgICAgICAgVmVyaWZ5RmllbGQ8ZmxvYXQ+KHZlcmlmaWVyLCBWVF9URVNURiwgNCkgJiYKKyAgICAgICAgICAgVmVyaWZ5RmllbGQ8ZmxvYXQ+KHZlcmlmaWVyLCBWVF9URVNURjIsIDQpICYmCisgICAgICAgICAgIFZlcmlmeUZpZWxkPGZsb2F0Pih2ZXJpZmllciwgVlRfVEVTVEYzLCA0KSAmJgorICAgICAgICAgICBWZXJpZnlPZmZzZXQodmVyaWZpZXIsIFZUX1RFU1RBUlJBWU9GU1RSSU5HMikgJiYKKyAgICAgICAgICAgdmVyaWZpZXIuVmVyaWZ5VmVjdG9yKHRlc3RhcnJheW9mc3RyaW5nMigpKSAmJgorICAgICAgICAgICB2ZXJpZmllci5WZXJpZnlWZWN0b3JPZlN0cmluZ3ModGVzdGFycmF5b2ZzdHJpbmcyKCkpICYmCisgICAgICAgICAgIFZlcmlmeU9mZnNldCh2ZXJpZmllciwgVlRfVEVTVEFSUkFZT0ZTT1JURURTVFJVQ1QpICYmCisgICAgICAgICAgIHZlcmlmaWVyLlZlcmlmeVZlY3Rvcih0ZXN0YXJyYXlvZnNvcnRlZHN0cnVjdCgpKSAmJgorICAgICAgICAgICBWZXJpZnlPZmZzZXQodmVyaWZpZXIsIFZUX0ZMRVgpICYmCisgICAgICAgICAgIHZlcmlmaWVyLlZlcmlmeVZlY3RvcihmbGV4KCkpICYmCisgICAgICAgICAgIGZsZXhidWZmZXJzOjpWZXJpZnlOZXN0ZWRGbGV4QnVmZmVyKGZsZXgoKSwgdmVyaWZpZXIpICYmCisgICAgICAgICAgIFZlcmlmeU9mZnNldCh2ZXJpZmllciwgVlRfVEVTVDUpICYmCisgICAgICAgICAgIHZlcmlmaWVyLlZlcmlmeVZlY3Rvcih0ZXN0NSgpKSAmJgorICAgICAgICAgICBWZXJpZnlPZmZzZXQodmVyaWZpZXIsIFZUX1ZFQ1RPUl9PRl9MT05HUykgJiYKKyAgICAgICAgICAgdmVyaWZpZXIuVmVyaWZ5VmVjdG9yKHZlY3Rvcl9vZl9sb25ncygpKSAmJgorICAgICAgICAgICBWZXJpZnlPZmZzZXQodmVyaWZpZXIsIFZUX1ZFQ1RPUl9PRl9ET1VCTEVTKSAmJgorICAgICAgICAgICB2ZXJpZmllci5WZXJpZnlWZWN0b3IodmVjdG9yX29mX2RvdWJsZXMoKSkgJiYKKyAgICAgICAgICAgVmVyaWZ5T2Zmc2V0KHZlcmlmaWVyLCBWVF9QQVJFTlRfTkFNRVNQQUNFX1RFU1QpICYmCisgICAgICAgICAgIHZlcmlmaWVyLlZlcmlmeVRhYmxlKHBhcmVudF9uYW1lc3BhY2VfdGVzdCgpKSAmJgorICAgICAgICAgICBWZXJpZnlPZmZzZXQodmVyaWZpZXIsIFZUX1ZFQ1RPUl9PRl9SRUZFUlJBQkxFUykgJiYKKyAgICAgICAgICAgdmVyaWZpZXIuVmVyaWZ5VmVjdG9yKHZlY3Rvcl9vZl9yZWZlcnJhYmxlcygpKSAmJgorICAgICAgICAgICB2ZXJpZmllci5WZXJpZnlWZWN0b3JPZlRhYmxlcyh2ZWN0b3Jfb2ZfcmVmZXJyYWJsZXMoKSkgJiYKKyAgICAgICAgICAgVmVyaWZ5RmllbGQ8dWludDY0X3Q+KHZlcmlmaWVyLCBWVF9TSU5HTEVfV0VBS19SRUZFUkVOQ0UsIDgpICYmCisgICAgICAgICAgIFZlcmlmeU9mZnNldCh2ZXJpZmllciwgVlRfVkVDVE9SX09GX1dFQUtfUkVGRVJFTkNFUykgJiYKKyAgICAgICAgICAgdmVyaWZpZXIuVmVyaWZ5VmVjdG9yKHZlY3Rvcl9vZl93ZWFrX3JlZmVyZW5jZXMoKSkgJiYKKyAgICAgICAgICAgVmVyaWZ5T2Zmc2V0KHZlcmlmaWVyLCBWVF9WRUNUT1JfT0ZfU1RST05HX1JFRkVSUkFCTEVTKSAmJgorICAgICAgICAgICB2ZXJpZmllci5WZXJpZnlWZWN0b3IodmVjdG9yX29mX3N0cm9uZ19yZWZlcnJhYmxlcygpKSAmJgorICAgICAgICAgICB2ZXJpZmllci5WZXJpZnlWZWN0b3JPZlRhYmxlcyh2ZWN0b3Jfb2Zfc3Ryb25nX3JlZmVycmFibGVzKCkpICYmCisgICAgICAgICAgIFZlcmlmeUZpZWxkPHVpbnQ2NF90Pih2ZXJpZmllciwgVlRfQ09fT1dOSU5HX1JFRkVSRU5DRSwgOCkgJiYKKyAgICAgICAgICAgVmVyaWZ5T2Zmc2V0KHZlcmlmaWVyLCBWVF9WRUNUT1JfT0ZfQ09fT1dOSU5HX1JFRkVSRU5DRVMpICYmCisgICAgICAgICAgIHZlcmlmaWVyLlZlcmlmeVZlY3Rvcih2ZWN0b3Jfb2ZfY29fb3duaW5nX3JlZmVyZW5jZXMoKSkgJiYKKyAgICAgICAgICAgVmVyaWZ5RmllbGQ8dWludDY0X3Q+KHZlcmlmaWVyLCBWVF9OT05fT1dOSU5HX1JFRkVSRU5DRSwgOCkgJiYKKyAgICAgICAgICAgVmVyaWZ5T2Zmc2V0KHZlcmlmaWVyLCBWVF9WRUNUT1JfT0ZfTk9OX09XTklOR19SRUZFUkVOQ0VTKSAmJgorICAgICAgICAgICB2ZXJpZmllci5WZXJpZnlWZWN0b3IodmVjdG9yX29mX25vbl9vd25pbmdfcmVmZXJlbmNlcygpKSAmJgorICAgICAgICAgICBWZXJpZnlGaWVsZDx1aW50OF90Pih2ZXJpZmllciwgVlRfQU5ZX1VOSVFVRV9UWVBFLCAxKSAmJgorICAgICAgICAgICBWZXJpZnlPZmZzZXQodmVyaWZpZXIsIFZUX0FOWV9VTklRVUUpICYmCisgICAgICAgICAgIFZlcmlmeUFueVVuaXF1ZUFsaWFzZXModmVyaWZpZXIsIGFueV91bmlxdWUoKSwgYW55X3VuaXF1ZV90eXBlKCkpICYmCisgICAgICAgICAgIFZlcmlmeUZpZWxkPHVpbnQ4X3Q+KHZlcmlmaWVyLCBWVF9BTllfQU1CSUdVT1VTX1RZUEUsIDEpICYmCisgICAgICAgICAgIFZlcmlmeU9mZnNldCh2ZXJpZmllciwgVlRfQU5ZX0FNQklHVU9VUykgJiYKKyAgICAgICAgICAgVmVyaWZ5QW55QW1iaWd1b3VzQWxpYXNlcyh2ZXJpZmllciwgYW55X2FtYmlndW91cygpLCBhbnlfYW1iaWd1b3VzX3R5cGUoKSkgJiYKKyAgICAgICAgICAgVmVyaWZ5T2Zmc2V0KHZlcmlmaWVyLCBWVF9WRUNUT1JfT0ZfRU5VTVMpICYmCisgICAgICAgICAgIHZlcmlmaWVyLlZlcmlmeVZlY3Rvcih2ZWN0b3Jfb2ZfZW51bXMoKSkgJiYKKyAgICAgICAgICAgVmVyaWZ5RmllbGQ8aW50OF90Pih2ZXJpZmllciwgVlRfU0lHTkVEX0VOVU0sIDEpICYmCisgICAgICAgICAgIFZlcmlmeU9mZnNldCh2ZXJpZmllciwgVlRfVEVTVFJFUVVJUkVETkVTVEVERkxBVEJVRkZFUikgJiYKKyAgICAgICAgICAgdmVyaWZpZXIuVmVyaWZ5VmVjdG9yKHRlc3RyZXF1aXJlZG5lc3RlZGZsYXRidWZmZXIoKSkgJiYKKyAgICAgICAgICAgdmVyaWZpZXIuVmVyaWZ5TmVzdGVkRmxhdEJ1ZmZlcjxNeUdhbWU6OkV4YW1wbGU6Ok1vbnN0ZXI+KHRlc3RyZXF1aXJlZG5lc3RlZGZsYXRidWZmZXIoKSwgbnVsbHB0cikgJiYKKyAgICAgICAgICAgVmVyaWZ5T2Zmc2V0KHZlcmlmaWVyLCBWVF9TQ0FMQVJfS0VZX1NPUlRFRF9UQUJMRVMpICYmCisgICAgICAgICAgIHZlcmlmaWVyLlZlcmlmeVZlY3RvcihzY2FsYXJfa2V5X3NvcnRlZF90YWJsZXMoKSkgJiYKKyAgICAgICAgICAgdmVyaWZpZXIuVmVyaWZ5VmVjdG9yT2ZUYWJsZXMoc2NhbGFyX2tleV9zb3J0ZWRfdGFibGVzKCkpICYmCisgICAgICAgICAgIFZlcmlmeUZpZWxkPE15R2FtZTo6RXhhbXBsZTo6VGVzdD4odmVyaWZpZXIsIFZUX05BVElWRV9JTkxJTkUsIDIpICYmCisgICAgICAgICAgIFZlcmlmeUZpZWxkPHVpbnQ2NF90Pih2ZXJpZmllciwgVlRfTE9OR19FTlVNX05PTl9FTlVNX0RFRkFVTFQsIDgpICYmCisgICAgICAgICAgIFZlcmlmeUZpZWxkPHVpbnQ2NF90Pih2ZXJpZmllciwgVlRfTE9OR19FTlVNX05PUk1BTF9ERUZBVUxULCA4KSAmJgorICAgICAgICAgICB2ZXJpZmllci5FbmRUYWJsZSgpOworICB9CisgIE1vbnN0ZXJUICpVblBhY2soY29uc3QgZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlciA9IG51bGxwdHIpIGNvbnN0OworICB2b2lkIFVuUGFja1RvKE1vbnN0ZXJUICpfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlciA9IG51bGxwdHIpIGNvbnN0OworICBzdGF0aWMgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxNb25zdGVyPiBQYWNrKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgTW9uc3RlclQqIF9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyID0gbnVsbHB0cik7Cit9OworCit0ZW1wbGF0ZTw+IGlubGluZSBjb25zdCBNeUdhbWU6OkV4YW1wbGU6Ok1vbnN0ZXIgKk1vbnN0ZXI6OnRlc3RfYXM8TXlHYW1lOjpFeGFtcGxlOjpNb25zdGVyPigpIGNvbnN0IHsKKyAgcmV0dXJuIHRlc3RfYXNfTW9uc3RlcigpOworfQorCit0ZW1wbGF0ZTw+IGlubGluZSBjb25zdCBNeUdhbWU6OkV4YW1wbGU6OlRlc3RTaW1wbGVUYWJsZVdpdGhFbnVtICpNb25zdGVyOjp0ZXN0X2FzPE15R2FtZTo6RXhhbXBsZTo6VGVzdFNpbXBsZVRhYmxlV2l0aEVudW0+KCkgY29uc3QgeworICByZXR1cm4gdGVzdF9hc19UZXN0U2ltcGxlVGFibGVXaXRoRW51bSgpOworfQorCit0ZW1wbGF0ZTw+IGlubGluZSBjb25zdCBNeUdhbWU6OkV4YW1wbGUyOjpNb25zdGVyICpNb25zdGVyOjp0ZXN0X2FzPE15R2FtZTo6RXhhbXBsZTI6Ok1vbnN0ZXI+KCkgY29uc3QgeworICByZXR1cm4gdGVzdF9hc19NeUdhbWVfRXhhbXBsZTJfTW9uc3RlcigpOworfQorCit0ZW1wbGF0ZTw+IGlubGluZSBjb25zdCBNeUdhbWU6OkV4YW1wbGU6Ok1vbnN0ZXIgKk1vbnN0ZXI6OmFueV91bmlxdWVfYXM8TXlHYW1lOjpFeGFtcGxlOjpNb25zdGVyPigpIGNvbnN0IHsKKyAgcmV0dXJuIGFueV91bmlxdWVfYXNfTSgpOworfQorCit0ZW1wbGF0ZTw+IGlubGluZSBjb25zdCBNeUdhbWU6OkV4YW1wbGU6OlRlc3RTaW1wbGVUYWJsZVdpdGhFbnVtICpNb25zdGVyOjphbnlfdW5pcXVlX2FzPE15R2FtZTo6RXhhbXBsZTo6VGVzdFNpbXBsZVRhYmxlV2l0aEVudW0+KCkgY29uc3QgeworICByZXR1cm4gYW55X3VuaXF1ZV9hc19UUygpOworfQorCit0ZW1wbGF0ZTw+IGlubGluZSBjb25zdCBNeUdhbWU6OkV4YW1wbGUyOjpNb25zdGVyICpNb25zdGVyOjphbnlfdW5pcXVlX2FzPE15R2FtZTo6RXhhbXBsZTI6Ok1vbnN0ZXI+KCkgY29uc3QgeworICByZXR1cm4gYW55X3VuaXF1ZV9hc19NMigpOworfQorCitzdHJ1Y3QgTW9uc3RlckJ1aWxkZXIgeworICB0eXBlZGVmIE1vbnN0ZXIgVGFibGU7CisgIGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmZmJiXzsKKyAgZmxhdGJ1ZmZlcnM6OnVvZmZzZXRfdCBzdGFydF87CisgIHZvaWQgYWRkX3Bvcyhjb25zdCBNeUdhbWU6OkV4YW1wbGU6OlZlYzMgKnBvcykgeworICAgIGZiYl8uQWRkU3RydWN0KE1vbnN0ZXI6OlZUX1BPUywgcG9zKTsKKyAgfQorICB2b2lkIGFkZF9tYW5hKGludDE2X3QgbWFuYSkgeworICAgIGZiYl8uQWRkRWxlbWVudDxpbnQxNl90PihNb25zdGVyOjpWVF9NQU5BLCBtYW5hLCAxNTApOworICB9CisgIHZvaWQgYWRkX2hwKGludDE2X3QgaHApIHsKKyAgICBmYmJfLkFkZEVsZW1lbnQ8aW50MTZfdD4oTW9uc3Rlcjo6VlRfSFAsIGhwLCAxMDApOworICB9CisgIHZvaWQgYWRkX25hbWUoZmxhdGJ1ZmZlcnM6Ok9mZnNldDxmbGF0YnVmZmVyczo6U3RyaW5nPiBuYW1lKSB7CisgICAgZmJiXy5BZGRPZmZzZXQoTW9uc3Rlcjo6VlRfTkFNRSwgbmFtZSk7CisgIH0KKyAgdm9pZCBhZGRfaW52ZW50b3J5KGZsYXRidWZmZXJzOjpPZmZzZXQ8ZmxhdGJ1ZmZlcnM6OlZlY3Rvcjx1aW50OF90Pj4gaW52ZW50b3J5KSB7CisgICAgZmJiXy5BZGRPZmZzZXQoTW9uc3Rlcjo6VlRfSU5WRU5UT1JZLCBpbnZlbnRvcnkpOworICB9CisgIHZvaWQgYWRkX2NvbG9yKE15R2FtZTo6RXhhbXBsZTo6Q29sb3IgY29sb3IpIHsKKyAgICBmYmJfLkFkZEVsZW1lbnQ8dWludDhfdD4oTW9uc3Rlcjo6VlRfQ09MT1IsIHN0YXRpY19jYXN0PHVpbnQ4X3Q+KGNvbG9yKSwgOCk7CisgIH0KKyAgdm9pZCBhZGRfdGVzdF90eXBlKE15R2FtZTo6RXhhbXBsZTo6QW55IHRlc3RfdHlwZSkgeworICAgIGZiYl8uQWRkRWxlbWVudDx1aW50OF90PihNb25zdGVyOjpWVF9URVNUX1RZUEUsIHN0YXRpY19jYXN0PHVpbnQ4X3Q+KHRlc3RfdHlwZSksIDApOworICB9CisgIHZvaWQgYWRkX3Rlc3QoZmxhdGJ1ZmZlcnM6Ok9mZnNldDx2b2lkPiB0ZXN0KSB7CisgICAgZmJiXy5BZGRPZmZzZXQoTW9uc3Rlcjo6VlRfVEVTVCwgdGVzdCk7CisgIH0KKyAgdm9pZCBhZGRfdGVzdDQoZmxhdGJ1ZmZlcnM6Ok9mZnNldDxmbGF0YnVmZmVyczo6VmVjdG9yPGNvbnN0IE15R2FtZTo6RXhhbXBsZTo6VGVzdCAqPj4gdGVzdDQpIHsKKyAgICBmYmJfLkFkZE9mZnNldChNb25zdGVyOjpWVF9URVNUNCwgdGVzdDQpOworICB9CisgIHZvaWQgYWRkX3Rlc3RhcnJheW9mc3RyaW5nKGZsYXRidWZmZXJzOjpPZmZzZXQ8ZmxhdGJ1ZmZlcnM6OlZlY3RvcjxmbGF0YnVmZmVyczo6T2Zmc2V0PGZsYXRidWZmZXJzOjpTdHJpbmc+Pj4gdGVzdGFycmF5b2ZzdHJpbmcpIHsKKyAgICBmYmJfLkFkZE9mZnNldChNb25zdGVyOjpWVF9URVNUQVJSQVlPRlNUUklORywgdGVzdGFycmF5b2ZzdHJpbmcpOworICB9CisgIHZvaWQgYWRkX3Rlc3RhcnJheW9mdGFibGVzKGZsYXRidWZmZXJzOjpPZmZzZXQ8ZmxhdGJ1ZmZlcnM6OlZlY3RvcjxmbGF0YnVmZmVyczo6T2Zmc2V0PE15R2FtZTo6RXhhbXBsZTo6TW9uc3Rlcj4+PiB0ZXN0YXJyYXlvZnRhYmxlcykgeworICAgIGZiYl8uQWRkT2Zmc2V0KE1vbnN0ZXI6OlZUX1RFU1RBUlJBWU9GVEFCTEVTLCB0ZXN0YXJyYXlvZnRhYmxlcyk7CisgIH0KKyAgdm9pZCBhZGRfZW5lbXkoZmxhdGJ1ZmZlcnM6Ok9mZnNldDxNeUdhbWU6OkV4YW1wbGU6Ok1vbnN0ZXI+IGVuZW15KSB7CisgICAgZmJiXy5BZGRPZmZzZXQoTW9uc3Rlcjo6VlRfRU5FTVksIGVuZW15KTsKKyAgfQorICB2b2lkIGFkZF90ZXN0bmVzdGVkZmxhdGJ1ZmZlcihmbGF0YnVmZmVyczo6T2Zmc2V0PGZsYXRidWZmZXJzOjpWZWN0b3I8dWludDhfdD4+IHRlc3RuZXN0ZWRmbGF0YnVmZmVyKSB7CisgICAgZmJiXy5BZGRPZmZzZXQoTW9uc3Rlcjo6VlRfVEVTVE5FU1RFREZMQVRCVUZGRVIsIHRlc3RuZXN0ZWRmbGF0YnVmZmVyKTsKKyAgfQorICB2b2lkIGFkZF90ZXN0ZW1wdHkoZmxhdGJ1ZmZlcnM6Ok9mZnNldDxNeUdhbWU6OkV4YW1wbGU6OlN0YXQ+IHRlc3RlbXB0eSkgeworICAgIGZiYl8uQWRkT2Zmc2V0KE1vbnN0ZXI6OlZUX1RFU1RFTVBUWSwgdGVzdGVtcHR5KTsKKyAgfQorICB2b2lkIGFkZF90ZXN0Ym9vbChib29sIHRlc3Rib29sKSB7CisgICAgZmJiXy5BZGRFbGVtZW50PHVpbnQ4X3Q+KE1vbnN0ZXI6OlZUX1RFU1RCT09MLCBzdGF0aWNfY2FzdDx1aW50OF90Pih0ZXN0Ym9vbCksIDApOworICB9CisgIHZvaWQgYWRkX3Rlc3RoYXNoczMyX2ZudjEoaW50MzJfdCB0ZXN0aGFzaHMzMl9mbnYxKSB7CisgICAgZmJiXy5BZGRFbGVtZW50PGludDMyX3Q+KE1vbnN0ZXI6OlZUX1RFU1RIQVNIUzMyX0ZOVjEsIHRlc3RoYXNoczMyX2ZudjEsIDApOworICB9CisgIHZvaWQgYWRkX3Rlc3RoYXNodTMyX2ZudjEodWludDMyX3QgdGVzdGhhc2h1MzJfZm52MSkgeworICAgIGZiYl8uQWRkRWxlbWVudDx1aW50MzJfdD4oTW9uc3Rlcjo6VlRfVEVTVEhBU0hVMzJfRk5WMSwgdGVzdGhhc2h1MzJfZm52MSwgMCk7CisgIH0KKyAgdm9pZCBhZGRfdGVzdGhhc2hzNjRfZm52MShpbnQ2NF90IHRlc3RoYXNoczY0X2ZudjEpIHsKKyAgICBmYmJfLkFkZEVsZW1lbnQ8aW50NjRfdD4oTW9uc3Rlcjo6VlRfVEVTVEhBU0hTNjRfRk5WMSwgdGVzdGhhc2hzNjRfZm52MSwgMCk7CisgIH0KKyAgdm9pZCBhZGRfdGVzdGhhc2h1NjRfZm52MSh1aW50NjRfdCB0ZXN0aGFzaHU2NF9mbnYxKSB7CisgICAgZmJiXy5BZGRFbGVtZW50PHVpbnQ2NF90PihNb25zdGVyOjpWVF9URVNUSEFTSFU2NF9GTlYxLCB0ZXN0aGFzaHU2NF9mbnYxLCAwKTsKKyAgfQorICB2b2lkIGFkZF90ZXN0aGFzaHMzMl9mbnYxYShpbnQzMl90IHRlc3RoYXNoczMyX2ZudjFhKSB7CisgICAgZmJiXy5BZGRFbGVtZW50PGludDMyX3Q+KE1vbnN0ZXI6OlZUX1RFU1RIQVNIUzMyX0ZOVjFBLCB0ZXN0aGFzaHMzMl9mbnYxYSwgMCk7CisgIH0KKyAgdm9pZCBhZGRfdGVzdGhhc2h1MzJfZm52MWEodWludDMyX3QgdGVzdGhhc2h1MzJfZm52MWEpIHsKKyAgICBmYmJfLkFkZEVsZW1lbnQ8dWludDMyX3Q+KE1vbnN0ZXI6OlZUX1RFU1RIQVNIVTMyX0ZOVjFBLCB0ZXN0aGFzaHUzMl9mbnYxYSwgMCk7CisgIH0KKyAgdm9pZCBhZGRfdGVzdGhhc2hzNjRfZm52MWEoaW50NjRfdCB0ZXN0aGFzaHM2NF9mbnYxYSkgeworICAgIGZiYl8uQWRkRWxlbWVudDxpbnQ2NF90PihNb25zdGVyOjpWVF9URVNUSEFTSFM2NF9GTlYxQSwgdGVzdGhhc2hzNjRfZm52MWEsIDApOworICB9CisgIHZvaWQgYWRkX3Rlc3RoYXNodTY0X2ZudjFhKHVpbnQ2NF90IHRlc3RoYXNodTY0X2ZudjFhKSB7CisgICAgZmJiXy5BZGRFbGVtZW50PHVpbnQ2NF90PihNb25zdGVyOjpWVF9URVNUSEFTSFU2NF9GTlYxQSwgdGVzdGhhc2h1NjRfZm52MWEsIDApOworICB9CisgIHZvaWQgYWRkX3Rlc3RhcnJheW9mYm9vbHMoZmxhdGJ1ZmZlcnM6Ok9mZnNldDxmbGF0YnVmZmVyczo6VmVjdG9yPHVpbnQ4X3Q+PiB0ZXN0YXJyYXlvZmJvb2xzKSB7CisgICAgZmJiXy5BZGRPZmZzZXQoTW9uc3Rlcjo6VlRfVEVTVEFSUkFZT0ZCT09MUywgdGVzdGFycmF5b2Zib29scyk7CisgIH0KKyAgdm9pZCBhZGRfdGVzdGYoZmxvYXQgdGVzdGYpIHsKKyAgICBmYmJfLkFkZEVsZW1lbnQ8ZmxvYXQ+KE1vbnN0ZXI6OlZUX1RFU1RGLCB0ZXN0ZiwgMy4xNDE1OWYpOworICB9CisgIHZvaWQgYWRkX3Rlc3RmMihmbG9hdCB0ZXN0ZjIpIHsKKyAgICBmYmJfLkFkZEVsZW1lbnQ8ZmxvYXQ+KE1vbnN0ZXI6OlZUX1RFU1RGMiwgdGVzdGYyLCAzLjBmKTsKKyAgfQorICB2b2lkIGFkZF90ZXN0ZjMoZmxvYXQgdGVzdGYzKSB7CisgICAgZmJiXy5BZGRFbGVtZW50PGZsb2F0PihNb25zdGVyOjpWVF9URVNURjMsIHRlc3RmMywgMC4wZik7CisgIH0KKyAgdm9pZCBhZGRfdGVzdGFycmF5b2ZzdHJpbmcyKGZsYXRidWZmZXJzOjpPZmZzZXQ8ZmxhdGJ1ZmZlcnM6OlZlY3RvcjxmbGF0YnVmZmVyczo6T2Zmc2V0PGZsYXRidWZmZXJzOjpTdHJpbmc+Pj4gdGVzdGFycmF5b2ZzdHJpbmcyKSB7CisgICAgZmJiXy5BZGRPZmZzZXQoTW9uc3Rlcjo6VlRfVEVTVEFSUkFZT0ZTVFJJTkcyLCB0ZXN0YXJyYXlvZnN0cmluZzIpOworICB9CisgIHZvaWQgYWRkX3Rlc3RhcnJheW9mc29ydGVkc3RydWN0KGZsYXRidWZmZXJzOjpPZmZzZXQ8ZmxhdGJ1ZmZlcnM6OlZlY3Rvcjxjb25zdCBNeUdhbWU6OkV4YW1wbGU6OkFiaWxpdHkgKj4+IHRlc3RhcnJheW9mc29ydGVkc3RydWN0KSB7CisgICAgZmJiXy5BZGRPZmZzZXQoTW9uc3Rlcjo6VlRfVEVTVEFSUkFZT0ZTT1JURURTVFJVQ1QsIHRlc3RhcnJheW9mc29ydGVkc3RydWN0KTsKKyAgfQorICB2b2lkIGFkZF9mbGV4KGZsYXRidWZmZXJzOjpPZmZzZXQ8ZmxhdGJ1ZmZlcnM6OlZlY3Rvcjx1aW50OF90Pj4gZmxleCkgeworICAgIGZiYl8uQWRkT2Zmc2V0KE1vbnN0ZXI6OlZUX0ZMRVgsIGZsZXgpOworICB9CisgIHZvaWQgYWRkX3Rlc3Q1KGZsYXRidWZmZXJzOjpPZmZzZXQ8ZmxhdGJ1ZmZlcnM6OlZlY3Rvcjxjb25zdCBNeUdhbWU6OkV4YW1wbGU6OlRlc3QgKj4+IHRlc3Q1KSB7CisgICAgZmJiXy5BZGRPZmZzZXQoTW9uc3Rlcjo6VlRfVEVTVDUsIHRlc3Q1KTsKKyAgfQorICB2b2lkIGFkZF92ZWN0b3Jfb2ZfbG9uZ3MoZmxhdGJ1ZmZlcnM6Ok9mZnNldDxmbGF0YnVmZmVyczo6VmVjdG9yPGludDY0X3Q+PiB2ZWN0b3Jfb2ZfbG9uZ3MpIHsKKyAgICBmYmJfLkFkZE9mZnNldChNb25zdGVyOjpWVF9WRUNUT1JfT0ZfTE9OR1MsIHZlY3Rvcl9vZl9sb25ncyk7CisgIH0KKyAgdm9pZCBhZGRfdmVjdG9yX29mX2RvdWJsZXMoZmxhdGJ1ZmZlcnM6Ok9mZnNldDxmbGF0YnVmZmVyczo6VmVjdG9yPGRvdWJsZT4+IHZlY3Rvcl9vZl9kb3VibGVzKSB7CisgICAgZmJiXy5BZGRPZmZzZXQoTW9uc3Rlcjo6VlRfVkVDVE9SX09GX0RPVUJMRVMsIHZlY3Rvcl9vZl9kb3VibGVzKTsKKyAgfQorICB2b2lkIGFkZF9wYXJlbnRfbmFtZXNwYWNlX3Rlc3QoZmxhdGJ1ZmZlcnM6Ok9mZnNldDxNeUdhbWU6OkluUGFyZW50TmFtZXNwYWNlPiBwYXJlbnRfbmFtZXNwYWNlX3Rlc3QpIHsKKyAgICBmYmJfLkFkZE9mZnNldChNb25zdGVyOjpWVF9QQVJFTlRfTkFNRVNQQUNFX1RFU1QsIHBhcmVudF9uYW1lc3BhY2VfdGVzdCk7CisgIH0KKyAgdm9pZCBhZGRfdmVjdG9yX29mX3JlZmVycmFibGVzKGZsYXRidWZmZXJzOjpPZmZzZXQ8ZmxhdGJ1ZmZlcnM6OlZlY3RvcjxmbGF0YnVmZmVyczo6T2Zmc2V0PE15R2FtZTo6RXhhbXBsZTo6UmVmZXJyYWJsZT4+PiB2ZWN0b3Jfb2ZfcmVmZXJyYWJsZXMpIHsKKyAgICBmYmJfLkFkZE9mZnNldChNb25zdGVyOjpWVF9WRUNUT1JfT0ZfUkVGRVJSQUJMRVMsIHZlY3Rvcl9vZl9yZWZlcnJhYmxlcyk7CisgIH0KKyAgdm9pZCBhZGRfc2luZ2xlX3dlYWtfcmVmZXJlbmNlKHVpbnQ2NF90IHNpbmdsZV93ZWFrX3JlZmVyZW5jZSkgeworICAgIGZiYl8uQWRkRWxlbWVudDx1aW50NjRfdD4oTW9uc3Rlcjo6VlRfU0lOR0xFX1dFQUtfUkVGRVJFTkNFLCBzaW5nbGVfd2Vha19yZWZlcmVuY2UsIDApOworICB9CisgIHZvaWQgYWRkX3ZlY3Rvcl9vZl93ZWFrX3JlZmVyZW5jZXMoZmxhdGJ1ZmZlcnM6Ok9mZnNldDxmbGF0YnVmZmVyczo6VmVjdG9yPHVpbnQ2NF90Pj4gdmVjdG9yX29mX3dlYWtfcmVmZXJlbmNlcykgeworICAgIGZiYl8uQWRkT2Zmc2V0KE1vbnN0ZXI6OlZUX1ZFQ1RPUl9PRl9XRUFLX1JFRkVSRU5DRVMsIHZlY3Rvcl9vZl93ZWFrX3JlZmVyZW5jZXMpOworICB9CisgIHZvaWQgYWRkX3ZlY3Rvcl9vZl9zdHJvbmdfcmVmZXJyYWJsZXMoZmxhdGJ1ZmZlcnM6Ok9mZnNldDxmbGF0YnVmZmVyczo6VmVjdG9yPGZsYXRidWZmZXJzOjpPZmZzZXQ8TXlHYW1lOjpFeGFtcGxlOjpSZWZlcnJhYmxlPj4+IHZlY3Rvcl9vZl9zdHJvbmdfcmVmZXJyYWJsZXMpIHsKKyAgICBmYmJfLkFkZE9mZnNldChNb25zdGVyOjpWVF9WRUNUT1JfT0ZfU1RST05HX1JFRkVSUkFCTEVTLCB2ZWN0b3Jfb2Zfc3Ryb25nX3JlZmVycmFibGVzKTsKKyAgfQorICB2b2lkIGFkZF9jb19vd25pbmdfcmVmZXJlbmNlKHVpbnQ2NF90IGNvX293bmluZ19yZWZlcmVuY2UpIHsKKyAgICBmYmJfLkFkZEVsZW1lbnQ8dWludDY0X3Q+KE1vbnN0ZXI6OlZUX0NPX09XTklOR19SRUZFUkVOQ0UsIGNvX293bmluZ19yZWZlcmVuY2UsIDApOworICB9CisgIHZvaWQgYWRkX3ZlY3Rvcl9vZl9jb19vd25pbmdfcmVmZXJlbmNlcyhmbGF0YnVmZmVyczo6T2Zmc2V0PGZsYXRidWZmZXJzOjpWZWN0b3I8dWludDY0X3Q+PiB2ZWN0b3Jfb2ZfY29fb3duaW5nX3JlZmVyZW5jZXMpIHsKKyAgICBmYmJfLkFkZE9mZnNldChNb25zdGVyOjpWVF9WRUNUT1JfT0ZfQ09fT1dOSU5HX1JFRkVSRU5DRVMsIHZlY3Rvcl9vZl9jb19vd25pbmdfcmVmZXJlbmNlcyk7CisgIH0KKyAgdm9pZCBhZGRfbm9uX293bmluZ19yZWZlcmVuY2UodWludDY0X3Qgbm9uX293bmluZ19yZWZlcmVuY2UpIHsKKyAgICBmYmJfLkFkZEVsZW1lbnQ8dWludDY0X3Q+KE1vbnN0ZXI6OlZUX05PTl9PV05JTkdfUkVGRVJFTkNFLCBub25fb3duaW5nX3JlZmVyZW5jZSwgMCk7CisgIH0KKyAgdm9pZCBhZGRfdmVjdG9yX29mX25vbl9vd25pbmdfcmVmZXJlbmNlcyhmbGF0YnVmZmVyczo6T2Zmc2V0PGZsYXRidWZmZXJzOjpWZWN0b3I8dWludDY0X3Q+PiB2ZWN0b3Jfb2Zfbm9uX293bmluZ19yZWZlcmVuY2VzKSB7CisgICAgZmJiXy5BZGRPZmZzZXQoTW9uc3Rlcjo6VlRfVkVDVE9SX09GX05PTl9PV05JTkdfUkVGRVJFTkNFUywgdmVjdG9yX29mX25vbl9vd25pbmdfcmVmZXJlbmNlcyk7CisgIH0KKyAgdm9pZCBhZGRfYW55X3VuaXF1ZV90eXBlKE15R2FtZTo6RXhhbXBsZTo6QW55VW5pcXVlQWxpYXNlcyBhbnlfdW5pcXVlX3R5cGUpIHsKKyAgICBmYmJfLkFkZEVsZW1lbnQ8dWludDhfdD4oTW9uc3Rlcjo6VlRfQU5ZX1VOSVFVRV9UWVBFLCBzdGF0aWNfY2FzdDx1aW50OF90PihhbnlfdW5pcXVlX3R5cGUpLCAwKTsKKyAgfQorICB2b2lkIGFkZF9hbnlfdW5pcXVlKGZsYXRidWZmZXJzOjpPZmZzZXQ8dm9pZD4gYW55X3VuaXF1ZSkgeworICAgIGZiYl8uQWRkT2Zmc2V0KE1vbnN0ZXI6OlZUX0FOWV9VTklRVUUsIGFueV91bmlxdWUpOworICB9CisgIHZvaWQgYWRkX2FueV9hbWJpZ3VvdXNfdHlwZShNeUdhbWU6OkV4YW1wbGU6OkFueUFtYmlndW91c0FsaWFzZXMgYW55X2FtYmlndW91c190eXBlKSB7CisgICAgZmJiXy5BZGRFbGVtZW50PHVpbnQ4X3Q+KE1vbnN0ZXI6OlZUX0FOWV9BTUJJR1VPVVNfVFlQRSwgc3RhdGljX2Nhc3Q8dWludDhfdD4oYW55X2FtYmlndW91c190eXBlKSwgMCk7CisgIH0KKyAgdm9pZCBhZGRfYW55X2FtYmlndW91cyhmbGF0YnVmZmVyczo6T2Zmc2V0PHZvaWQ+IGFueV9hbWJpZ3VvdXMpIHsKKyAgICBmYmJfLkFkZE9mZnNldChNb25zdGVyOjpWVF9BTllfQU1CSUdVT1VTLCBhbnlfYW1iaWd1b3VzKTsKKyAgfQorICB2b2lkIGFkZF92ZWN0b3Jfb2ZfZW51bXMoZmxhdGJ1ZmZlcnM6Ok9mZnNldDxmbGF0YnVmZmVyczo6VmVjdG9yPHVpbnQ4X3Q+PiB2ZWN0b3Jfb2ZfZW51bXMpIHsKKyAgICBmYmJfLkFkZE9mZnNldChNb25zdGVyOjpWVF9WRUNUT1JfT0ZfRU5VTVMsIHZlY3Rvcl9vZl9lbnVtcyk7CisgIH0KKyAgdm9pZCBhZGRfc2lnbmVkX2VudW0oTXlHYW1lOjpFeGFtcGxlOjpSYWNlIHNpZ25lZF9lbnVtKSB7CisgICAgZmJiXy5BZGRFbGVtZW50PGludDhfdD4oTW9uc3Rlcjo6VlRfU0lHTkVEX0VOVU0sIHN0YXRpY19jYXN0PGludDhfdD4oc2lnbmVkX2VudW0pLCAtMSk7CisgIH0KKyAgdm9pZCBhZGRfdGVzdHJlcXVpcmVkbmVzdGVkZmxhdGJ1ZmZlcihmbGF0YnVmZmVyczo6T2Zmc2V0PGZsYXRidWZmZXJzOjpWZWN0b3I8dWludDhfdD4+IHRlc3RyZXF1aXJlZG5lc3RlZGZsYXRidWZmZXIpIHsKKyAgICBmYmJfLkFkZE9mZnNldChNb25zdGVyOjpWVF9URVNUUkVRVUlSRURORVNURURGTEFUQlVGRkVSLCB0ZXN0cmVxdWlyZWRuZXN0ZWRmbGF0YnVmZmVyKTsKKyAgfQorICB2b2lkIGFkZF9zY2FsYXJfa2V5X3NvcnRlZF90YWJsZXMoZmxhdGJ1ZmZlcnM6Ok9mZnNldDxmbGF0YnVmZmVyczo6VmVjdG9yPGZsYXRidWZmZXJzOjpPZmZzZXQ8TXlHYW1lOjpFeGFtcGxlOjpTdGF0Pj4+IHNjYWxhcl9rZXlfc29ydGVkX3RhYmxlcykgeworICAgIGZiYl8uQWRkT2Zmc2V0KE1vbnN0ZXI6OlZUX1NDQUxBUl9LRVlfU09SVEVEX1RBQkxFUywgc2NhbGFyX2tleV9zb3J0ZWRfdGFibGVzKTsKKyAgfQorICB2b2lkIGFkZF9uYXRpdmVfaW5saW5lKGNvbnN0IE15R2FtZTo6RXhhbXBsZTo6VGVzdCAqbmF0aXZlX2lubGluZSkgeworICAgIGZiYl8uQWRkU3RydWN0KE1vbnN0ZXI6OlZUX05BVElWRV9JTkxJTkUsIG5hdGl2ZV9pbmxpbmUpOworICB9CisgIHZvaWQgYWRkX2xvbmdfZW51bV9ub25fZW51bV9kZWZhdWx0KE15R2FtZTo6RXhhbXBsZTo6TG9uZ0VudW0gbG9uZ19lbnVtX25vbl9lbnVtX2RlZmF1bHQpIHsKKyAgICBmYmJfLkFkZEVsZW1lbnQ8dWludDY0X3Q+KE1vbnN0ZXI6OlZUX0xPTkdfRU5VTV9OT05fRU5VTV9ERUZBVUxULCBzdGF0aWNfY2FzdDx1aW50NjRfdD4obG9uZ19lbnVtX25vbl9lbnVtX2RlZmF1bHQpLCAwKTsKKyAgfQorICB2b2lkIGFkZF9sb25nX2VudW1fbm9ybWFsX2RlZmF1bHQoTXlHYW1lOjpFeGFtcGxlOjpMb25nRW51bSBsb25nX2VudW1fbm9ybWFsX2RlZmF1bHQpIHsKKyAgICBmYmJfLkFkZEVsZW1lbnQ8dWludDY0X3Q+KE1vbnN0ZXI6OlZUX0xPTkdfRU5VTV9OT1JNQUxfREVGQVVMVCwgc3RhdGljX2Nhc3Q8dWludDY0X3Q+KGxvbmdfZW51bV9ub3JtYWxfZGVmYXVsdCksIDJVTEwpOworICB9CisgIGV4cGxpY2l0IE1vbnN0ZXJCdWlsZGVyKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYikKKyAgICAgICAgOiBmYmJfKF9mYmIpIHsKKyAgICBzdGFydF8gPSBmYmJfLlN0YXJ0VGFibGUoKTsKKyAgfQorICBmbGF0YnVmZmVyczo6T2Zmc2V0PE1vbnN0ZXI+IEZpbmlzaCgpIHsKKyAgICBjb25zdCBhdXRvIGVuZCA9IGZiYl8uRW5kVGFibGUoc3RhcnRfKTsKKyAgICBhdXRvIG8gPSBmbGF0YnVmZmVyczo6T2Zmc2V0PE1vbnN0ZXI+KGVuZCk7CisgICAgZmJiXy5SZXF1aXJlZChvLCBNb25zdGVyOjpWVF9OQU1FKTsKKyAgICByZXR1cm4gbzsKKyAgfQorfTsKKworaW5saW5lIGZsYXRidWZmZXJzOjpPZmZzZXQ8TW9uc3Rlcj4gQ3JlYXRlTW9uc3RlcigKKyAgICBmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsCisgICAgY29uc3QgTXlHYW1lOjpFeGFtcGxlOjpWZWMzICpwb3MgPSBudWxscHRyLAorICAgIGludDE2X3QgbWFuYSA9IDE1MCwKKyAgICBpbnQxNl90IGhwID0gMTAwLAorICAgIGZsYXRidWZmZXJzOjpPZmZzZXQ8ZmxhdGJ1ZmZlcnM6OlN0cmluZz4gbmFtZSA9IDAsCisgICAgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxmbGF0YnVmZmVyczo6VmVjdG9yPHVpbnQ4X3Q+PiBpbnZlbnRvcnkgPSAwLAorICAgIE15R2FtZTo6RXhhbXBsZTo6Q29sb3IgY29sb3IgPSBNeUdhbWU6OkV4YW1wbGU6OkNvbG9yX0JsdWUsCisgICAgTXlHYW1lOjpFeGFtcGxlOjpBbnkgdGVzdF90eXBlID0gTXlHYW1lOjpFeGFtcGxlOjpBbnlfTk9ORSwKKyAgICBmbGF0YnVmZmVyczo6T2Zmc2V0PHZvaWQ+IHRlc3QgPSAwLAorICAgIGZsYXRidWZmZXJzOjpPZmZzZXQ8ZmxhdGJ1ZmZlcnM6OlZlY3Rvcjxjb25zdCBNeUdhbWU6OkV4YW1wbGU6OlRlc3QgKj4+IHRlc3Q0ID0gMCwKKyAgICBmbGF0YnVmZmVyczo6T2Zmc2V0PGZsYXRidWZmZXJzOjpWZWN0b3I8ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxmbGF0YnVmZmVyczo6U3RyaW5nPj4+IHRlc3RhcnJheW9mc3RyaW5nID0gMCwKKyAgICBmbGF0YnVmZmVyczo6T2Zmc2V0PGZsYXRidWZmZXJzOjpWZWN0b3I8ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxNeUdhbWU6OkV4YW1wbGU6Ok1vbnN0ZXI+Pj4gdGVzdGFycmF5b2Z0YWJsZXMgPSAwLAorICAgIGZsYXRidWZmZXJzOjpPZmZzZXQ8TXlHYW1lOjpFeGFtcGxlOjpNb25zdGVyPiBlbmVteSA9IDAsCisgICAgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxmbGF0YnVmZmVyczo6VmVjdG9yPHVpbnQ4X3Q+PiB0ZXN0bmVzdGVkZmxhdGJ1ZmZlciA9IDAsCisgICAgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxNeUdhbWU6OkV4YW1wbGU6OlN0YXQ+IHRlc3RlbXB0eSA9IDAsCisgICAgYm9vbCB0ZXN0Ym9vbCA9IGZhbHNlLAorICAgIGludDMyX3QgdGVzdGhhc2hzMzJfZm52MSA9IDAsCisgICAgdWludDMyX3QgdGVzdGhhc2h1MzJfZm52MSA9IDAsCisgICAgaW50NjRfdCB0ZXN0aGFzaHM2NF9mbnYxID0gMCwKKyAgICB1aW50NjRfdCB0ZXN0aGFzaHU2NF9mbnYxID0gMCwKKyAgICBpbnQzMl90IHRlc3RoYXNoczMyX2ZudjFhID0gMCwKKyAgICB1aW50MzJfdCB0ZXN0aGFzaHUzMl9mbnYxYSA9IDAsCisgICAgaW50NjRfdCB0ZXN0aGFzaHM2NF9mbnYxYSA9IDAsCisgICAgdWludDY0X3QgdGVzdGhhc2h1NjRfZm52MWEgPSAwLAorICAgIGZsYXRidWZmZXJzOjpPZmZzZXQ8ZmxhdGJ1ZmZlcnM6OlZlY3Rvcjx1aW50OF90Pj4gdGVzdGFycmF5b2Zib29scyA9IDAsCisgICAgZmxvYXQgdGVzdGYgPSAzLjE0MTU5ZiwKKyAgICBmbG9hdCB0ZXN0ZjIgPSAzLjBmLAorICAgIGZsb2F0IHRlc3RmMyA9IDAuMGYsCisgICAgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxmbGF0YnVmZmVyczo6VmVjdG9yPGZsYXRidWZmZXJzOjpPZmZzZXQ8ZmxhdGJ1ZmZlcnM6OlN0cmluZz4+PiB0ZXN0YXJyYXlvZnN0cmluZzIgPSAwLAorICAgIGZsYXRidWZmZXJzOjpPZmZzZXQ8ZmxhdGJ1ZmZlcnM6OlZlY3Rvcjxjb25zdCBNeUdhbWU6OkV4YW1wbGU6OkFiaWxpdHkgKj4+IHRlc3RhcnJheW9mc29ydGVkc3RydWN0ID0gMCwKKyAgICBmbGF0YnVmZmVyczo6T2Zmc2V0PGZsYXRidWZmZXJzOjpWZWN0b3I8dWludDhfdD4+IGZsZXggPSAwLAorICAgIGZsYXRidWZmZXJzOjpPZmZzZXQ8ZmxhdGJ1ZmZlcnM6OlZlY3Rvcjxjb25zdCBNeUdhbWU6OkV4YW1wbGU6OlRlc3QgKj4+IHRlc3Q1ID0gMCwKKyAgICBmbGF0YnVmZmVyczo6T2Zmc2V0PGZsYXRidWZmZXJzOjpWZWN0b3I8aW50NjRfdD4+IHZlY3Rvcl9vZl9sb25ncyA9IDAsCisgICAgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxmbGF0YnVmZmVyczo6VmVjdG9yPGRvdWJsZT4+IHZlY3Rvcl9vZl9kb3VibGVzID0gMCwKKyAgICBmbGF0YnVmZmVyczo6T2Zmc2V0PE15R2FtZTo6SW5QYXJlbnROYW1lc3BhY2U+IHBhcmVudF9uYW1lc3BhY2VfdGVzdCA9IDAsCisgICAgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxmbGF0YnVmZmVyczo6VmVjdG9yPGZsYXRidWZmZXJzOjpPZmZzZXQ8TXlHYW1lOjpFeGFtcGxlOjpSZWZlcnJhYmxlPj4+IHZlY3Rvcl9vZl9yZWZlcnJhYmxlcyA9IDAsCisgICAgdWludDY0X3Qgc2luZ2xlX3dlYWtfcmVmZXJlbmNlID0gMCwKKyAgICBmbGF0YnVmZmVyczo6T2Zmc2V0PGZsYXRidWZmZXJzOjpWZWN0b3I8dWludDY0X3Q+PiB2ZWN0b3Jfb2Zfd2Vha19yZWZlcmVuY2VzID0gMCwKKyAgICBmbGF0YnVmZmVyczo6T2Zmc2V0PGZsYXRidWZmZXJzOjpWZWN0b3I8ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxNeUdhbWU6OkV4YW1wbGU6OlJlZmVycmFibGU+Pj4gdmVjdG9yX29mX3N0cm9uZ19yZWZlcnJhYmxlcyA9IDAsCisgICAgdWludDY0X3QgY29fb3duaW5nX3JlZmVyZW5jZSA9IDAsCisgICAgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxmbGF0YnVmZmVyczo6VmVjdG9yPHVpbnQ2NF90Pj4gdmVjdG9yX29mX2NvX293bmluZ19yZWZlcmVuY2VzID0gMCwKKyAgICB1aW50NjRfdCBub25fb3duaW5nX3JlZmVyZW5jZSA9IDAsCisgICAgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxmbGF0YnVmZmVyczo6VmVjdG9yPHVpbnQ2NF90Pj4gdmVjdG9yX29mX25vbl9vd25pbmdfcmVmZXJlbmNlcyA9IDAsCisgICAgTXlHYW1lOjpFeGFtcGxlOjpBbnlVbmlxdWVBbGlhc2VzIGFueV91bmlxdWVfdHlwZSA9IE15R2FtZTo6RXhhbXBsZTo6QW55VW5pcXVlQWxpYXNlc19OT05FLAorICAgIGZsYXRidWZmZXJzOjpPZmZzZXQ8dm9pZD4gYW55X3VuaXF1ZSA9IDAsCisgICAgTXlHYW1lOjpFeGFtcGxlOjpBbnlBbWJpZ3VvdXNBbGlhc2VzIGFueV9hbWJpZ3VvdXNfdHlwZSA9IE15R2FtZTo6RXhhbXBsZTo6QW55QW1iaWd1b3VzQWxpYXNlc19OT05FLAorICAgIGZsYXRidWZmZXJzOjpPZmZzZXQ8dm9pZD4gYW55X2FtYmlndW91cyA9IDAsCisgICAgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxmbGF0YnVmZmVyczo6VmVjdG9yPHVpbnQ4X3Q+PiB2ZWN0b3Jfb2ZfZW51bXMgPSAwLAorICAgIE15R2FtZTo6RXhhbXBsZTo6UmFjZSBzaWduZWRfZW51bSA9IE15R2FtZTo6RXhhbXBsZTo6UmFjZV9Ob25lLAorICAgIGZsYXRidWZmZXJzOjpPZmZzZXQ8ZmxhdGJ1ZmZlcnM6OlZlY3Rvcjx1aW50OF90Pj4gdGVzdHJlcXVpcmVkbmVzdGVkZmxhdGJ1ZmZlciA9IDAsCisgICAgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxmbGF0YnVmZmVyczo6VmVjdG9yPGZsYXRidWZmZXJzOjpPZmZzZXQ8TXlHYW1lOjpFeGFtcGxlOjpTdGF0Pj4+IHNjYWxhcl9rZXlfc29ydGVkX3RhYmxlcyA9IDAsCisgICAgY29uc3QgTXlHYW1lOjpFeGFtcGxlOjpUZXN0ICpuYXRpdmVfaW5saW5lID0gbnVsbHB0ciwKKyAgICBNeUdhbWU6OkV4YW1wbGU6OkxvbmdFbnVtIGxvbmdfZW51bV9ub25fZW51bV9kZWZhdWx0ID0gc3RhdGljX2Nhc3Q8TXlHYW1lOjpFeGFtcGxlOjpMb25nRW51bT4oMCksCisgICAgTXlHYW1lOjpFeGFtcGxlOjpMb25nRW51bSBsb25nX2VudW1fbm9ybWFsX2RlZmF1bHQgPSBNeUdhbWU6OkV4YW1wbGU6OkxvbmdFbnVtX0xvbmdPbmUpIHsKKyAgTW9uc3RlckJ1aWxkZXIgYnVpbGRlcl8oX2ZiYik7CisgIGJ1aWxkZXJfLmFkZF9sb25nX2VudW1fbm9ybWFsX2RlZmF1bHQobG9uZ19lbnVtX25vcm1hbF9kZWZhdWx0KTsKKyAgYnVpbGRlcl8uYWRkX2xvbmdfZW51bV9ub25fZW51bV9kZWZhdWx0KGxvbmdfZW51bV9ub25fZW51bV9kZWZhdWx0KTsKKyAgYnVpbGRlcl8uYWRkX25vbl9vd25pbmdfcmVmZXJlbmNlKG5vbl9vd25pbmdfcmVmZXJlbmNlKTsKKyAgYnVpbGRlcl8uYWRkX2NvX293bmluZ19yZWZlcmVuY2UoY29fb3duaW5nX3JlZmVyZW5jZSk7CisgIGJ1aWxkZXJfLmFkZF9zaW5nbGVfd2Vha19yZWZlcmVuY2Uoc2luZ2xlX3dlYWtfcmVmZXJlbmNlKTsKKyAgYnVpbGRlcl8uYWRkX3Rlc3RoYXNodTY0X2ZudjFhKHRlc3RoYXNodTY0X2ZudjFhKTsKKyAgYnVpbGRlcl8uYWRkX3Rlc3RoYXNoczY0X2ZudjFhKHRlc3RoYXNoczY0X2ZudjFhKTsKKyAgYnVpbGRlcl8uYWRkX3Rlc3RoYXNodTY0X2ZudjEodGVzdGhhc2h1NjRfZm52MSk7CisgIGJ1aWxkZXJfLmFkZF90ZXN0aGFzaHM2NF9mbnYxKHRlc3RoYXNoczY0X2ZudjEpOworICBidWlsZGVyXy5hZGRfbmF0aXZlX2lubGluZShuYXRpdmVfaW5saW5lKTsKKyAgYnVpbGRlcl8uYWRkX3NjYWxhcl9rZXlfc29ydGVkX3RhYmxlcyhzY2FsYXJfa2V5X3NvcnRlZF90YWJsZXMpOworICBidWlsZGVyXy5hZGRfdGVzdHJlcXVpcmVkbmVzdGVkZmxhdGJ1ZmZlcih0ZXN0cmVxdWlyZWRuZXN0ZWRmbGF0YnVmZmVyKTsKKyAgYnVpbGRlcl8uYWRkX3ZlY3Rvcl9vZl9lbnVtcyh2ZWN0b3Jfb2ZfZW51bXMpOworICBidWlsZGVyXy5hZGRfYW55X2FtYmlndW91cyhhbnlfYW1iaWd1b3VzKTsKKyAgYnVpbGRlcl8uYWRkX2FueV91bmlxdWUoYW55X3VuaXF1ZSk7CisgIGJ1aWxkZXJfLmFkZF92ZWN0b3Jfb2Zfbm9uX293bmluZ19yZWZlcmVuY2VzKHZlY3Rvcl9vZl9ub25fb3duaW5nX3JlZmVyZW5jZXMpOworICBidWlsZGVyXy5hZGRfdmVjdG9yX29mX2NvX293bmluZ19yZWZlcmVuY2VzKHZlY3Rvcl9vZl9jb19vd25pbmdfcmVmZXJlbmNlcyk7CisgIGJ1aWxkZXJfLmFkZF92ZWN0b3Jfb2Zfc3Ryb25nX3JlZmVycmFibGVzKHZlY3Rvcl9vZl9zdHJvbmdfcmVmZXJyYWJsZXMpOworICBidWlsZGVyXy5hZGRfdmVjdG9yX29mX3dlYWtfcmVmZXJlbmNlcyh2ZWN0b3Jfb2Zfd2Vha19yZWZlcmVuY2VzKTsKKyAgYnVpbGRlcl8uYWRkX3ZlY3Rvcl9vZl9yZWZlcnJhYmxlcyh2ZWN0b3Jfb2ZfcmVmZXJyYWJsZXMpOworICBidWlsZGVyXy5hZGRfcGFyZW50X25hbWVzcGFjZV90ZXN0KHBhcmVudF9uYW1lc3BhY2VfdGVzdCk7CisgIGJ1aWxkZXJfLmFkZF92ZWN0b3Jfb2ZfZG91Ymxlcyh2ZWN0b3Jfb2ZfZG91Ymxlcyk7CisgIGJ1aWxkZXJfLmFkZF92ZWN0b3Jfb2ZfbG9uZ3ModmVjdG9yX29mX2xvbmdzKTsKKyAgYnVpbGRlcl8uYWRkX3Rlc3Q1KHRlc3Q1KTsKKyAgYnVpbGRlcl8uYWRkX2ZsZXgoZmxleCk7CisgIGJ1aWxkZXJfLmFkZF90ZXN0YXJyYXlvZnNvcnRlZHN0cnVjdCh0ZXN0YXJyYXlvZnNvcnRlZHN0cnVjdCk7CisgIGJ1aWxkZXJfLmFkZF90ZXN0YXJyYXlvZnN0cmluZzIodGVzdGFycmF5b2ZzdHJpbmcyKTsKKyAgYnVpbGRlcl8uYWRkX3Rlc3RmMyh0ZXN0ZjMpOworICBidWlsZGVyXy5hZGRfdGVzdGYyKHRlc3RmMik7CisgIGJ1aWxkZXJfLmFkZF90ZXN0Zih0ZXN0Zik7CisgIGJ1aWxkZXJfLmFkZF90ZXN0YXJyYXlvZmJvb2xzKHRlc3RhcnJheW9mYm9vbHMpOworICBidWlsZGVyXy5hZGRfdGVzdGhhc2h1MzJfZm52MWEodGVzdGhhc2h1MzJfZm52MWEpOworICBidWlsZGVyXy5hZGRfdGVzdGhhc2hzMzJfZm52MWEodGVzdGhhc2hzMzJfZm52MWEpOworICBidWlsZGVyXy5hZGRfdGVzdGhhc2h1MzJfZm52MSh0ZXN0aGFzaHUzMl9mbnYxKTsKKyAgYnVpbGRlcl8uYWRkX3Rlc3RoYXNoczMyX2ZudjEodGVzdGhhc2hzMzJfZm52MSk7CisgIGJ1aWxkZXJfLmFkZF90ZXN0ZW1wdHkodGVzdGVtcHR5KTsKKyAgYnVpbGRlcl8uYWRkX3Rlc3RuZXN0ZWRmbGF0YnVmZmVyKHRlc3RuZXN0ZWRmbGF0YnVmZmVyKTsKKyAgYnVpbGRlcl8uYWRkX2VuZW15KGVuZW15KTsKKyAgYnVpbGRlcl8uYWRkX3Rlc3RhcnJheW9mdGFibGVzKHRlc3RhcnJheW9mdGFibGVzKTsKKyAgYnVpbGRlcl8uYWRkX3Rlc3RhcnJheW9mc3RyaW5nKHRlc3RhcnJheW9mc3RyaW5nKTsKKyAgYnVpbGRlcl8uYWRkX3Rlc3Q0KHRlc3Q0KTsKKyAgYnVpbGRlcl8uYWRkX3Rlc3QodGVzdCk7CisgIGJ1aWxkZXJfLmFkZF9pbnZlbnRvcnkoaW52ZW50b3J5KTsKKyAgYnVpbGRlcl8uYWRkX25hbWUobmFtZSk7CisgIGJ1aWxkZXJfLmFkZF9wb3MocG9zKTsKKyAgYnVpbGRlcl8uYWRkX2hwKGhwKTsKKyAgYnVpbGRlcl8uYWRkX21hbmEobWFuYSk7CisgIGJ1aWxkZXJfLmFkZF9zaWduZWRfZW51bShzaWduZWRfZW51bSk7CisgIGJ1aWxkZXJfLmFkZF9hbnlfYW1iaWd1b3VzX3R5cGUoYW55X2FtYmlndW91c190eXBlKTsKKyAgYnVpbGRlcl8uYWRkX2FueV91bmlxdWVfdHlwZShhbnlfdW5pcXVlX3R5cGUpOworICBidWlsZGVyXy5hZGRfdGVzdGJvb2wodGVzdGJvb2wpOworICBidWlsZGVyXy5hZGRfdGVzdF90eXBlKHRlc3RfdHlwZSk7CisgIGJ1aWxkZXJfLmFkZF9jb2xvcihjb2xvcik7CisgIHJldHVybiBidWlsZGVyXy5GaW5pc2goKTsKK30KKworaW5saW5lIGZsYXRidWZmZXJzOjpPZmZzZXQ8TW9uc3Rlcj4gQ3JlYXRlTW9uc3RlckRpcmVjdCgKKyAgICBmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsCisgICAgY29uc3QgTXlHYW1lOjpFeGFtcGxlOjpWZWMzICpwb3MgPSBudWxscHRyLAorICAgIGludDE2X3QgbWFuYSA9IDE1MCwKKyAgICBpbnQxNl90IGhwID0gMTAwLAorICAgIGNvbnN0IGNoYXIgKm5hbWUgPSBudWxscHRyLAorICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+ICppbnZlbnRvcnkgPSBudWxscHRyLAorICAgIE15R2FtZTo6RXhhbXBsZTo6Q29sb3IgY29sb3IgPSBNeUdhbWU6OkV4YW1wbGU6OkNvbG9yX0JsdWUsCisgICAgTXlHYW1lOjpFeGFtcGxlOjpBbnkgdGVzdF90eXBlID0gTXlHYW1lOjpFeGFtcGxlOjpBbnlfTk9ORSwKKyAgICBmbGF0YnVmZmVyczo6T2Zmc2V0PHZvaWQ+IHRlc3QgPSAwLAorICAgIGNvbnN0IHN0ZDo6dmVjdG9yPE15R2FtZTo6RXhhbXBsZTo6VGVzdD4gKnRlc3Q0ID0gbnVsbHB0ciwKKyAgICBjb25zdCBzdGQ6OnZlY3RvcjxmbGF0YnVmZmVyczo6T2Zmc2V0PGZsYXRidWZmZXJzOjpTdHJpbmc+PiAqdGVzdGFycmF5b2ZzdHJpbmcgPSBudWxscHRyLAorICAgIHN0ZDo6dmVjdG9yPGZsYXRidWZmZXJzOjpPZmZzZXQ8TXlHYW1lOjpFeGFtcGxlOjpNb25zdGVyPj4gKnRlc3RhcnJheW9mdGFibGVzID0gbnVsbHB0ciwKKyAgICBmbGF0YnVmZmVyczo6T2Zmc2V0PE15R2FtZTo6RXhhbXBsZTo6TW9uc3Rlcj4gZW5lbXkgPSAwLAorICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+ICp0ZXN0bmVzdGVkZmxhdGJ1ZmZlciA9IG51bGxwdHIsCisgICAgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxNeUdhbWU6OkV4YW1wbGU6OlN0YXQ+IHRlc3RlbXB0eSA9IDAsCisgICAgYm9vbCB0ZXN0Ym9vbCA9IGZhbHNlLAorICAgIGludDMyX3QgdGVzdGhhc2hzMzJfZm52MSA9IDAsCisgICAgdWludDMyX3QgdGVzdGhhc2h1MzJfZm52MSA9IDAsCisgICAgaW50NjRfdCB0ZXN0aGFzaHM2NF9mbnYxID0gMCwKKyAgICB1aW50NjRfdCB0ZXN0aGFzaHU2NF9mbnYxID0gMCwKKyAgICBpbnQzMl90IHRlc3RoYXNoczMyX2ZudjFhID0gMCwKKyAgICB1aW50MzJfdCB0ZXN0aGFzaHUzMl9mbnYxYSA9IDAsCisgICAgaW50NjRfdCB0ZXN0aGFzaHM2NF9mbnYxYSA9IDAsCisgICAgdWludDY0X3QgdGVzdGhhc2h1NjRfZm52MWEgPSAwLAorICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+ICp0ZXN0YXJyYXlvZmJvb2xzID0gbnVsbHB0ciwKKyAgICBmbG9hdCB0ZXN0ZiA9IDMuMTQxNTlmLAorICAgIGZsb2F0IHRlc3RmMiA9IDMuMGYsCisgICAgZmxvYXQgdGVzdGYzID0gMC4wZiwKKyAgICBjb25zdCBzdGQ6OnZlY3RvcjxmbGF0YnVmZmVyczo6T2Zmc2V0PGZsYXRidWZmZXJzOjpTdHJpbmc+PiAqdGVzdGFycmF5b2ZzdHJpbmcyID0gbnVsbHB0ciwKKyAgICBzdGQ6OnZlY3RvcjxNeUdhbWU6OkV4YW1wbGU6OkFiaWxpdHk+ICp0ZXN0YXJyYXlvZnNvcnRlZHN0cnVjdCA9IG51bGxwdHIsCisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4gKmZsZXggPSBudWxscHRyLAorICAgIGNvbnN0IHN0ZDo6dmVjdG9yPE15R2FtZTo6RXhhbXBsZTo6VGVzdD4gKnRlc3Q1ID0gbnVsbHB0ciwKKyAgICBjb25zdCBzdGQ6OnZlY3RvcjxpbnQ2NF90PiAqdmVjdG9yX29mX2xvbmdzID0gbnVsbHB0ciwKKyAgICBjb25zdCBzdGQ6OnZlY3Rvcjxkb3VibGU+ICp2ZWN0b3Jfb2ZfZG91YmxlcyA9IG51bGxwdHIsCisgICAgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxNeUdhbWU6OkluUGFyZW50TmFtZXNwYWNlPiBwYXJlbnRfbmFtZXNwYWNlX3Rlc3QgPSAwLAorICAgIHN0ZDo6dmVjdG9yPGZsYXRidWZmZXJzOjpPZmZzZXQ8TXlHYW1lOjpFeGFtcGxlOjpSZWZlcnJhYmxlPj4gKnZlY3Rvcl9vZl9yZWZlcnJhYmxlcyA9IG51bGxwdHIsCisgICAgdWludDY0X3Qgc2luZ2xlX3dlYWtfcmVmZXJlbmNlID0gMCwKKyAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50NjRfdD4gKnZlY3Rvcl9vZl93ZWFrX3JlZmVyZW5jZXMgPSBudWxscHRyLAorICAgIHN0ZDo6dmVjdG9yPGZsYXRidWZmZXJzOjpPZmZzZXQ8TXlHYW1lOjpFeGFtcGxlOjpSZWZlcnJhYmxlPj4gKnZlY3Rvcl9vZl9zdHJvbmdfcmVmZXJyYWJsZXMgPSBudWxscHRyLAorICAgIHVpbnQ2NF90IGNvX293bmluZ19yZWZlcmVuY2UgPSAwLAorICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ2NF90PiAqdmVjdG9yX29mX2NvX293bmluZ19yZWZlcmVuY2VzID0gbnVsbHB0ciwKKyAgICB1aW50NjRfdCBub25fb3duaW5nX3JlZmVyZW5jZSA9IDAsCisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDY0X3Q+ICp2ZWN0b3Jfb2Zfbm9uX293bmluZ19yZWZlcmVuY2VzID0gbnVsbHB0ciwKKyAgICBNeUdhbWU6OkV4YW1wbGU6OkFueVVuaXF1ZUFsaWFzZXMgYW55X3VuaXF1ZV90eXBlID0gTXlHYW1lOjpFeGFtcGxlOjpBbnlVbmlxdWVBbGlhc2VzX05PTkUsCisgICAgZmxhdGJ1ZmZlcnM6Ok9mZnNldDx2b2lkPiBhbnlfdW5pcXVlID0gMCwKKyAgICBNeUdhbWU6OkV4YW1wbGU6OkFueUFtYmlndW91c0FsaWFzZXMgYW55X2FtYmlndW91c190eXBlID0gTXlHYW1lOjpFeGFtcGxlOjpBbnlBbWJpZ3VvdXNBbGlhc2VzX05PTkUsCisgICAgZmxhdGJ1ZmZlcnM6Ok9mZnNldDx2b2lkPiBhbnlfYW1iaWd1b3VzID0gMCwKKyAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiAqdmVjdG9yX29mX2VudW1zID0gbnVsbHB0ciwKKyAgICBNeUdhbWU6OkV4YW1wbGU6OlJhY2Ugc2lnbmVkX2VudW0gPSBNeUdhbWU6OkV4YW1wbGU6OlJhY2VfTm9uZSwKKyAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiAqdGVzdHJlcXVpcmVkbmVzdGVkZmxhdGJ1ZmZlciA9IG51bGxwdHIsCisgICAgc3RkOjp2ZWN0b3I8ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxNeUdhbWU6OkV4YW1wbGU6OlN0YXQ+PiAqc2NhbGFyX2tleV9zb3J0ZWRfdGFibGVzID0gbnVsbHB0ciwKKyAgICBjb25zdCBNeUdhbWU6OkV4YW1wbGU6OlRlc3QgKm5hdGl2ZV9pbmxpbmUgPSBudWxscHRyLAorICAgIE15R2FtZTo6RXhhbXBsZTo6TG9uZ0VudW0gbG9uZ19lbnVtX25vbl9lbnVtX2RlZmF1bHQgPSBzdGF0aWNfY2FzdDxNeUdhbWU6OkV4YW1wbGU6OkxvbmdFbnVtPigwKSwKKyAgICBNeUdhbWU6OkV4YW1wbGU6OkxvbmdFbnVtIGxvbmdfZW51bV9ub3JtYWxfZGVmYXVsdCA9IE15R2FtZTo6RXhhbXBsZTo6TG9uZ0VudW1fTG9uZ09uZSkgeworICBhdXRvIG5hbWVfXyA9IG5hbWUgPyBfZmJiLkNyZWF0ZVN0cmluZyhuYW1lKSA6IDA7CisgIGF1dG8gaW52ZW50b3J5X18gPSBpbnZlbnRvcnkgPyBfZmJiLkNyZWF0ZVZlY3Rvcjx1aW50OF90PigqaW52ZW50b3J5KSA6IDA7CisgIGF1dG8gdGVzdDRfXyA9IHRlc3Q0ID8gX2ZiYi5DcmVhdGVWZWN0b3JPZlN0cnVjdHM8TXlHYW1lOjpFeGFtcGxlOjpUZXN0PigqdGVzdDQpIDogMDsKKyAgYXV0byB0ZXN0YXJyYXlvZnN0cmluZ19fID0gdGVzdGFycmF5b2ZzdHJpbmcgPyBfZmJiLkNyZWF0ZVZlY3RvcjxmbGF0YnVmZmVyczo6T2Zmc2V0PGZsYXRidWZmZXJzOjpTdHJpbmc+PigqdGVzdGFycmF5b2ZzdHJpbmcpIDogMDsKKyAgYXV0byB0ZXN0YXJyYXlvZnRhYmxlc19fID0gdGVzdGFycmF5b2Z0YWJsZXMgPyBfZmJiLkNyZWF0ZVZlY3Rvck9mU29ydGVkVGFibGVzPE15R2FtZTo6RXhhbXBsZTo6TW9uc3Rlcj4odGVzdGFycmF5b2Z0YWJsZXMpIDogMDsKKyAgYXV0byB0ZXN0bmVzdGVkZmxhdGJ1ZmZlcl9fID0gdGVzdG5lc3RlZGZsYXRidWZmZXIgPyBfZmJiLkNyZWF0ZVZlY3Rvcjx1aW50OF90PigqdGVzdG5lc3RlZGZsYXRidWZmZXIpIDogMDsKKyAgYXV0byB0ZXN0YXJyYXlvZmJvb2xzX18gPSB0ZXN0YXJyYXlvZmJvb2xzID8gX2ZiYi5DcmVhdGVWZWN0b3I8dWludDhfdD4oKnRlc3RhcnJheW9mYm9vbHMpIDogMDsKKyAgYXV0byB0ZXN0YXJyYXlvZnN0cmluZzJfXyA9IHRlc3RhcnJheW9mc3RyaW5nMiA/IF9mYmIuQ3JlYXRlVmVjdG9yPGZsYXRidWZmZXJzOjpPZmZzZXQ8ZmxhdGJ1ZmZlcnM6OlN0cmluZz4+KCp0ZXN0YXJyYXlvZnN0cmluZzIpIDogMDsKKyAgYXV0byB0ZXN0YXJyYXlvZnNvcnRlZHN0cnVjdF9fID0gdGVzdGFycmF5b2Zzb3J0ZWRzdHJ1Y3QgPyBfZmJiLkNyZWF0ZVZlY3Rvck9mU29ydGVkU3RydWN0czxNeUdhbWU6OkV4YW1wbGU6OkFiaWxpdHk+KHRlc3RhcnJheW9mc29ydGVkc3RydWN0KSA6IDA7CisgIGF1dG8gZmxleF9fID0gZmxleCA/IF9mYmIuQ3JlYXRlVmVjdG9yPHVpbnQ4X3Q+KCpmbGV4KSA6IDA7CisgIGF1dG8gdGVzdDVfXyA9IHRlc3Q1ID8gX2ZiYi5DcmVhdGVWZWN0b3JPZlN0cnVjdHM8TXlHYW1lOjpFeGFtcGxlOjpUZXN0PigqdGVzdDUpIDogMDsKKyAgYXV0byB2ZWN0b3Jfb2ZfbG9uZ3NfXyA9IHZlY3Rvcl9vZl9sb25ncyA/IF9mYmIuQ3JlYXRlVmVjdG9yPGludDY0X3Q+KCp2ZWN0b3Jfb2ZfbG9uZ3MpIDogMDsKKyAgYXV0byB2ZWN0b3Jfb2ZfZG91Ymxlc19fID0gdmVjdG9yX29mX2RvdWJsZXMgPyBfZmJiLkNyZWF0ZVZlY3Rvcjxkb3VibGU+KCp2ZWN0b3Jfb2ZfZG91YmxlcykgOiAwOworICBhdXRvIHZlY3Rvcl9vZl9yZWZlcnJhYmxlc19fID0gdmVjdG9yX29mX3JlZmVycmFibGVzID8gX2ZiYi5DcmVhdGVWZWN0b3JPZlNvcnRlZFRhYmxlczxNeUdhbWU6OkV4YW1wbGU6OlJlZmVycmFibGU+KHZlY3Rvcl9vZl9yZWZlcnJhYmxlcykgOiAwOworICBhdXRvIHZlY3Rvcl9vZl93ZWFrX3JlZmVyZW5jZXNfXyA9IHZlY3Rvcl9vZl93ZWFrX3JlZmVyZW5jZXMgPyBfZmJiLkNyZWF0ZVZlY3Rvcjx1aW50NjRfdD4oKnZlY3Rvcl9vZl93ZWFrX3JlZmVyZW5jZXMpIDogMDsKKyAgYXV0byB2ZWN0b3Jfb2Zfc3Ryb25nX3JlZmVycmFibGVzX18gPSB2ZWN0b3Jfb2Zfc3Ryb25nX3JlZmVycmFibGVzID8gX2ZiYi5DcmVhdGVWZWN0b3JPZlNvcnRlZFRhYmxlczxNeUdhbWU6OkV4YW1wbGU6OlJlZmVycmFibGU+KHZlY3Rvcl9vZl9zdHJvbmdfcmVmZXJyYWJsZXMpIDogMDsKKyAgYXV0byB2ZWN0b3Jfb2ZfY29fb3duaW5nX3JlZmVyZW5jZXNfXyA9IHZlY3Rvcl9vZl9jb19vd25pbmdfcmVmZXJlbmNlcyA/IF9mYmIuQ3JlYXRlVmVjdG9yPHVpbnQ2NF90PigqdmVjdG9yX29mX2NvX293bmluZ19yZWZlcmVuY2VzKSA6IDA7CisgIGF1dG8gdmVjdG9yX29mX25vbl9vd25pbmdfcmVmZXJlbmNlc19fID0gdmVjdG9yX29mX25vbl9vd25pbmdfcmVmZXJlbmNlcyA/IF9mYmIuQ3JlYXRlVmVjdG9yPHVpbnQ2NF90PigqdmVjdG9yX29mX25vbl9vd25pbmdfcmVmZXJlbmNlcykgOiAwOworICBhdXRvIHZlY3Rvcl9vZl9lbnVtc19fID0gdmVjdG9yX29mX2VudW1zID8gX2ZiYi5DcmVhdGVWZWN0b3I8dWludDhfdD4oKnZlY3Rvcl9vZl9lbnVtcykgOiAwOworICBhdXRvIHRlc3RyZXF1aXJlZG5lc3RlZGZsYXRidWZmZXJfXyA9IHRlc3RyZXF1aXJlZG5lc3RlZGZsYXRidWZmZXIgPyBfZmJiLkNyZWF0ZVZlY3Rvcjx1aW50OF90PigqdGVzdHJlcXVpcmVkbmVzdGVkZmxhdGJ1ZmZlcikgOiAwOworICBhdXRvIHNjYWxhcl9rZXlfc29ydGVkX3RhYmxlc19fID0gc2NhbGFyX2tleV9zb3J0ZWRfdGFibGVzID8gX2ZiYi5DcmVhdGVWZWN0b3JPZlNvcnRlZFRhYmxlczxNeUdhbWU6OkV4YW1wbGU6OlN0YXQ+KHNjYWxhcl9rZXlfc29ydGVkX3RhYmxlcykgOiAwOworICByZXR1cm4gTXlHYW1lOjpFeGFtcGxlOjpDcmVhdGVNb25zdGVyKAorICAgICAgX2ZiYiwKKyAgICAgIHBvcywKKyAgICAgIG1hbmEsCisgICAgICBocCwKKyAgICAgIG5hbWVfXywKKyAgICAgIGludmVudG9yeV9fLAorICAgICAgY29sb3IsCisgICAgICB0ZXN0X3R5cGUsCisgICAgICB0ZXN0LAorICAgICAgdGVzdDRfXywKKyAgICAgIHRlc3RhcnJheW9mc3RyaW5nX18sCisgICAgICB0ZXN0YXJyYXlvZnRhYmxlc19fLAorICAgICAgZW5lbXksCisgICAgICB0ZXN0bmVzdGVkZmxhdGJ1ZmZlcl9fLAorICAgICAgdGVzdGVtcHR5LAorICAgICAgdGVzdGJvb2wsCisgICAgICB0ZXN0aGFzaHMzMl9mbnYxLAorICAgICAgdGVzdGhhc2h1MzJfZm52MSwKKyAgICAgIHRlc3RoYXNoczY0X2ZudjEsCisgICAgICB0ZXN0aGFzaHU2NF9mbnYxLAorICAgICAgdGVzdGhhc2hzMzJfZm52MWEsCisgICAgICB0ZXN0aGFzaHUzMl9mbnYxYSwKKyAgICAgIHRlc3RoYXNoczY0X2ZudjFhLAorICAgICAgdGVzdGhhc2h1NjRfZm52MWEsCisgICAgICB0ZXN0YXJyYXlvZmJvb2xzX18sCisgICAgICB0ZXN0ZiwKKyAgICAgIHRlc3RmMiwKKyAgICAgIHRlc3RmMywKKyAgICAgIHRlc3RhcnJheW9mc3RyaW5nMl9fLAorICAgICAgdGVzdGFycmF5b2Zzb3J0ZWRzdHJ1Y3RfXywKKyAgICAgIGZsZXhfXywKKyAgICAgIHRlc3Q1X18sCisgICAgICB2ZWN0b3Jfb2ZfbG9uZ3NfXywKKyAgICAgIHZlY3Rvcl9vZl9kb3VibGVzX18sCisgICAgICBwYXJlbnRfbmFtZXNwYWNlX3Rlc3QsCisgICAgICB2ZWN0b3Jfb2ZfcmVmZXJyYWJsZXNfXywKKyAgICAgIHNpbmdsZV93ZWFrX3JlZmVyZW5jZSwKKyAgICAgIHZlY3Rvcl9vZl93ZWFrX3JlZmVyZW5jZXNfXywKKyAgICAgIHZlY3Rvcl9vZl9zdHJvbmdfcmVmZXJyYWJsZXNfXywKKyAgICAgIGNvX293bmluZ19yZWZlcmVuY2UsCisgICAgICB2ZWN0b3Jfb2ZfY29fb3duaW5nX3JlZmVyZW5jZXNfXywKKyAgICAgIG5vbl9vd25pbmdfcmVmZXJlbmNlLAorICAgICAgdmVjdG9yX29mX25vbl9vd25pbmdfcmVmZXJlbmNlc19fLAorICAgICAgYW55X3VuaXF1ZV90eXBlLAorICAgICAgYW55X3VuaXF1ZSwKKyAgICAgIGFueV9hbWJpZ3VvdXNfdHlwZSwKKyAgICAgIGFueV9hbWJpZ3VvdXMsCisgICAgICB2ZWN0b3Jfb2ZfZW51bXNfXywKKyAgICAgIHNpZ25lZF9lbnVtLAorICAgICAgdGVzdHJlcXVpcmVkbmVzdGVkZmxhdGJ1ZmZlcl9fLAorICAgICAgc2NhbGFyX2tleV9zb3J0ZWRfdGFibGVzX18sCisgICAgICBuYXRpdmVfaW5saW5lLAorICAgICAgbG9uZ19lbnVtX25vbl9lbnVtX2RlZmF1bHQsCisgICAgICBsb25nX2VudW1fbm9ybWFsX2RlZmF1bHQpOworfQorCitmbGF0YnVmZmVyczo6T2Zmc2V0PE1vbnN0ZXI+IENyZWF0ZU1vbnN0ZXIoZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBNb25zdGVyVCAqX28sIGNvbnN0IGZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIgPSBudWxscHRyKTsKKworc3RydWN0IFR5cGVBbGlhc2VzVCA6IHB1YmxpYyBmbGF0YnVmZmVyczo6TmF0aXZlVGFibGUgeworICB0eXBlZGVmIFR5cGVBbGlhc2VzIFRhYmxlVHlwZTsKKyAgaW50OF90IGk4ID0gMDsKKyAgdWludDhfdCB1OCA9IDA7CisgIGludDE2X3QgaTE2ID0gMDsKKyAgdWludDE2X3QgdTE2ID0gMDsKKyAgaW50MzJfdCBpMzIgPSAwOworICB1aW50MzJfdCB1MzIgPSAwOworICBpbnQ2NF90IGk2NCA9IDA7CisgIHVpbnQ2NF90IHU2NCA9IDA7CisgIGZsb2F0IGYzMiA9IDAuMGY7CisgIGRvdWJsZSBmNjQgPSAwLjA7CisgIHN0ZDo6dmVjdG9yPGludDhfdD4gdjh7fTsKKyAgc3RkOjp2ZWN0b3I8ZG91YmxlPiB2ZjY0e307Cit9OworCitzdHJ1Y3QgVHlwZUFsaWFzZXMgRkxBVEJVRkZFUlNfRklOQUxfQ0xBU1MgOiBwcml2YXRlIGZsYXRidWZmZXJzOjpUYWJsZSB7CisgIHR5cGVkZWYgVHlwZUFsaWFzZXNUIE5hdGl2ZVRhYmxlVHlwZTsKKyAgdHlwZWRlZiBUeXBlQWxpYXNlc0J1aWxkZXIgQnVpbGRlcjsKKyAgc3RhdGljIGNvbnN0IGZsYXRidWZmZXJzOjpUeXBlVGFibGUgKk1pbmlSZWZsZWN0VHlwZVRhYmxlKCkgeworICAgIHJldHVybiBUeXBlQWxpYXNlc1R5cGVUYWJsZSgpOworICB9CisgIGVudW0gRmxhdEJ1ZmZlcnNWVGFibGVPZmZzZXQgRkxBVEJVRkZFUlNfVlRBQkxFX1VOREVSTFlJTkdfVFlQRSB7CisgICAgVlRfSTggPSA0LAorICAgIFZUX1U4ID0gNiwKKyAgICBWVF9JMTYgPSA4LAorICAgIFZUX1UxNiA9IDEwLAorICAgIFZUX0kzMiA9IDEyLAorICAgIFZUX1UzMiA9IDE0LAorICAgIFZUX0k2NCA9IDE2LAorICAgIFZUX1U2NCA9IDE4LAorICAgIFZUX0YzMiA9IDIwLAorICAgIFZUX0Y2NCA9IDIyLAorICAgIFZUX1Y4ID0gMjQsCisgICAgVlRfVkY2NCA9IDI2CisgIH07CisgIGludDhfdCBpOCgpIGNvbnN0IHsKKyAgICByZXR1cm4gR2V0RmllbGQ8aW50OF90PihWVF9JOCwgMCk7CisgIH0KKyAgYm9vbCBtdXRhdGVfaTgoaW50OF90IF9pOCA9IDApIHsKKyAgICByZXR1cm4gU2V0RmllbGQ8aW50OF90PihWVF9JOCwgX2k4LCAwKTsKKyAgfQorICB1aW50OF90IHU4KCkgY29uc3QgeworICAgIHJldHVybiBHZXRGaWVsZDx1aW50OF90PihWVF9VOCwgMCk7CisgIH0KKyAgYm9vbCBtdXRhdGVfdTgodWludDhfdCBfdTggPSAwKSB7CisgICAgcmV0dXJuIFNldEZpZWxkPHVpbnQ4X3Q+KFZUX1U4LCBfdTgsIDApOworICB9CisgIGludDE2X3QgaTE2KCkgY29uc3QgeworICAgIHJldHVybiBHZXRGaWVsZDxpbnQxNl90PihWVF9JMTYsIDApOworICB9CisgIGJvb2wgbXV0YXRlX2kxNihpbnQxNl90IF9pMTYgPSAwKSB7CisgICAgcmV0dXJuIFNldEZpZWxkPGludDE2X3Q+KFZUX0kxNiwgX2kxNiwgMCk7CisgIH0KKyAgdWludDE2X3QgdTE2KCkgY29uc3QgeworICAgIHJldHVybiBHZXRGaWVsZDx1aW50MTZfdD4oVlRfVTE2LCAwKTsKKyAgfQorICBib29sIG11dGF0ZV91MTYodWludDE2X3QgX3UxNiA9IDApIHsKKyAgICByZXR1cm4gU2V0RmllbGQ8dWludDE2X3Q+KFZUX1UxNiwgX3UxNiwgMCk7CisgIH0KKyAgaW50MzJfdCBpMzIoKSBjb25zdCB7CisgICAgcmV0dXJuIEdldEZpZWxkPGludDMyX3Q+KFZUX0kzMiwgMCk7CisgIH0KKyAgYm9vbCBtdXRhdGVfaTMyKGludDMyX3QgX2kzMiA9IDApIHsKKyAgICByZXR1cm4gU2V0RmllbGQ8aW50MzJfdD4oVlRfSTMyLCBfaTMyLCAwKTsKKyAgfQorICB1aW50MzJfdCB1MzIoKSBjb25zdCB7CisgICAgcmV0dXJuIEdldEZpZWxkPHVpbnQzMl90PihWVF9VMzIsIDApOworICB9CisgIGJvb2wgbXV0YXRlX3UzMih1aW50MzJfdCBfdTMyID0gMCkgeworICAgIHJldHVybiBTZXRGaWVsZDx1aW50MzJfdD4oVlRfVTMyLCBfdTMyLCAwKTsKKyAgfQorICBpbnQ2NF90IGk2NCgpIGNvbnN0IHsKKyAgICByZXR1cm4gR2V0RmllbGQ8aW50NjRfdD4oVlRfSTY0LCAwKTsKKyAgfQorICBib29sIG11dGF0ZV9pNjQoaW50NjRfdCBfaTY0ID0gMCkgeworICAgIHJldHVybiBTZXRGaWVsZDxpbnQ2NF90PihWVF9JNjQsIF9pNjQsIDApOworICB9CisgIHVpbnQ2NF90IHU2NCgpIGNvbnN0IHsKKyAgICByZXR1cm4gR2V0RmllbGQ8dWludDY0X3Q+KFZUX1U2NCwgMCk7CisgIH0KKyAgYm9vbCBtdXRhdGVfdTY0KHVpbnQ2NF90IF91NjQgPSAwKSB7CisgICAgcmV0dXJuIFNldEZpZWxkPHVpbnQ2NF90PihWVF9VNjQsIF91NjQsIDApOworICB9CisgIGZsb2F0IGYzMigpIGNvbnN0IHsKKyAgICByZXR1cm4gR2V0RmllbGQ8ZmxvYXQ+KFZUX0YzMiwgMC4wZik7CisgIH0KKyAgYm9vbCBtdXRhdGVfZjMyKGZsb2F0IF9mMzIgPSAwLjBmKSB7CisgICAgcmV0dXJuIFNldEZpZWxkPGZsb2F0PihWVF9GMzIsIF9mMzIsIDAuMGYpOworICB9CisgIGRvdWJsZSBmNjQoKSBjb25zdCB7CisgICAgcmV0dXJuIEdldEZpZWxkPGRvdWJsZT4oVlRfRjY0LCAwLjApOworICB9CisgIGJvb2wgbXV0YXRlX2Y2NChkb3VibGUgX2Y2NCA9IDAuMCkgeworICAgIHJldHVybiBTZXRGaWVsZDxkb3VibGU+KFZUX0Y2NCwgX2Y2NCwgMC4wKTsKKyAgfQorICBjb25zdCBmbGF0YnVmZmVyczo6VmVjdG9yPGludDhfdD4gKnY4KCkgY29uc3QgeworICAgIHJldHVybiBHZXRQb2ludGVyPGNvbnN0IGZsYXRidWZmZXJzOjpWZWN0b3I8aW50OF90PiAqPihWVF9WOCk7CisgIH0KKyAgZmxhdGJ1ZmZlcnM6OlZlY3RvcjxpbnQ4X3Q+ICptdXRhYmxlX3Y4KCkgeworICAgIHJldHVybiBHZXRQb2ludGVyPGZsYXRidWZmZXJzOjpWZWN0b3I8aW50OF90PiAqPihWVF9WOCk7CisgIH0KKyAgY29uc3QgZmxhdGJ1ZmZlcnM6OlZlY3Rvcjxkb3VibGU+ICp2ZjY0KCkgY29uc3QgeworICAgIHJldHVybiBHZXRQb2ludGVyPGNvbnN0IGZsYXRidWZmZXJzOjpWZWN0b3I8ZG91YmxlPiAqPihWVF9WRjY0KTsKKyAgfQorICBmbGF0YnVmZmVyczo6VmVjdG9yPGRvdWJsZT4gKm11dGFibGVfdmY2NCgpIHsKKyAgICByZXR1cm4gR2V0UG9pbnRlcjxmbGF0YnVmZmVyczo6VmVjdG9yPGRvdWJsZT4gKj4oVlRfVkY2NCk7CisgIH0KKyAgYm9vbCBWZXJpZnkoZmxhdGJ1ZmZlcnM6OlZlcmlmaWVyICZ2ZXJpZmllcikgY29uc3QgeworICAgIHJldHVybiBWZXJpZnlUYWJsZVN0YXJ0KHZlcmlmaWVyKSAmJgorICAgICAgICAgICBWZXJpZnlGaWVsZDxpbnQ4X3Q+KHZlcmlmaWVyLCBWVF9JOCwgMSkgJiYKKyAgICAgICAgICAgVmVyaWZ5RmllbGQ8dWludDhfdD4odmVyaWZpZXIsIFZUX1U4LCAxKSAmJgorICAgICAgICAgICBWZXJpZnlGaWVsZDxpbnQxNl90Pih2ZXJpZmllciwgVlRfSTE2LCAyKSAmJgorICAgICAgICAgICBWZXJpZnlGaWVsZDx1aW50MTZfdD4odmVyaWZpZXIsIFZUX1UxNiwgMikgJiYKKyAgICAgICAgICAgVmVyaWZ5RmllbGQ8aW50MzJfdD4odmVyaWZpZXIsIFZUX0kzMiwgNCkgJiYKKyAgICAgICAgICAgVmVyaWZ5RmllbGQ8dWludDMyX3Q+KHZlcmlmaWVyLCBWVF9VMzIsIDQpICYmCisgICAgICAgICAgIFZlcmlmeUZpZWxkPGludDY0X3Q+KHZlcmlmaWVyLCBWVF9JNjQsIDgpICYmCisgICAgICAgICAgIFZlcmlmeUZpZWxkPHVpbnQ2NF90Pih2ZXJpZmllciwgVlRfVTY0LCA4KSAmJgorICAgICAgICAgICBWZXJpZnlGaWVsZDxmbG9hdD4odmVyaWZpZXIsIFZUX0YzMiwgNCkgJiYKKyAgICAgICAgICAgVmVyaWZ5RmllbGQ8ZG91YmxlPih2ZXJpZmllciwgVlRfRjY0LCA4KSAmJgorICAgICAgICAgICBWZXJpZnlPZmZzZXQodmVyaWZpZXIsIFZUX1Y4KSAmJgorICAgICAgICAgICB2ZXJpZmllci5WZXJpZnlWZWN0b3IodjgoKSkgJiYKKyAgICAgICAgICAgVmVyaWZ5T2Zmc2V0KHZlcmlmaWVyLCBWVF9WRjY0KSAmJgorICAgICAgICAgICB2ZXJpZmllci5WZXJpZnlWZWN0b3IodmY2NCgpKSAmJgorICAgICAgICAgICB2ZXJpZmllci5FbmRUYWJsZSgpOworICB9CisgIFR5cGVBbGlhc2VzVCAqVW5QYWNrKGNvbnN0IGZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIgPSBudWxscHRyKSBjb25zdDsKKyAgdm9pZCBVblBhY2tUbyhUeXBlQWxpYXNlc1QgKl9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyID0gbnVsbHB0cikgY29uc3Q7CisgIHN0YXRpYyBmbGF0YnVmZmVyczo6T2Zmc2V0PFR5cGVBbGlhc2VzPiBQYWNrKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgVHlwZUFsaWFzZXNUKiBfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlciA9IG51bGxwdHIpOworfTsKKworc3RydWN0IFR5cGVBbGlhc2VzQnVpbGRlciB7CisgIHR5cGVkZWYgVHlwZUFsaWFzZXMgVGFibGU7CisgIGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmZmJiXzsKKyAgZmxhdGJ1ZmZlcnM6OnVvZmZzZXRfdCBzdGFydF87CisgIHZvaWQgYWRkX2k4KGludDhfdCBpOCkgeworICAgIGZiYl8uQWRkRWxlbWVudDxpbnQ4X3Q+KFR5cGVBbGlhc2VzOjpWVF9JOCwgaTgsIDApOworICB9CisgIHZvaWQgYWRkX3U4KHVpbnQ4X3QgdTgpIHsKKyAgICBmYmJfLkFkZEVsZW1lbnQ8dWludDhfdD4oVHlwZUFsaWFzZXM6OlZUX1U4LCB1OCwgMCk7CisgIH0KKyAgdm9pZCBhZGRfaTE2KGludDE2X3QgaTE2KSB7CisgICAgZmJiXy5BZGRFbGVtZW50PGludDE2X3Q+KFR5cGVBbGlhc2VzOjpWVF9JMTYsIGkxNiwgMCk7CisgIH0KKyAgdm9pZCBhZGRfdTE2KHVpbnQxNl90IHUxNikgeworICAgIGZiYl8uQWRkRWxlbWVudDx1aW50MTZfdD4oVHlwZUFsaWFzZXM6OlZUX1UxNiwgdTE2LCAwKTsKKyAgfQorICB2b2lkIGFkZF9pMzIoaW50MzJfdCBpMzIpIHsKKyAgICBmYmJfLkFkZEVsZW1lbnQ8aW50MzJfdD4oVHlwZUFsaWFzZXM6OlZUX0kzMiwgaTMyLCAwKTsKKyAgfQorICB2b2lkIGFkZF91MzIodWludDMyX3QgdTMyKSB7CisgICAgZmJiXy5BZGRFbGVtZW50PHVpbnQzMl90PihUeXBlQWxpYXNlczo6VlRfVTMyLCB1MzIsIDApOworICB9CisgIHZvaWQgYWRkX2k2NChpbnQ2NF90IGk2NCkgeworICAgIGZiYl8uQWRkRWxlbWVudDxpbnQ2NF90PihUeXBlQWxpYXNlczo6VlRfSTY0LCBpNjQsIDApOworICB9CisgIHZvaWQgYWRkX3U2NCh1aW50NjRfdCB1NjQpIHsKKyAgICBmYmJfLkFkZEVsZW1lbnQ8dWludDY0X3Q+KFR5cGVBbGlhc2VzOjpWVF9VNjQsIHU2NCwgMCk7CisgIH0KKyAgdm9pZCBhZGRfZjMyKGZsb2F0IGYzMikgeworICAgIGZiYl8uQWRkRWxlbWVudDxmbG9hdD4oVHlwZUFsaWFzZXM6OlZUX0YzMiwgZjMyLCAwLjBmKTsKKyAgfQorICB2b2lkIGFkZF9mNjQoZG91YmxlIGY2NCkgeworICAgIGZiYl8uQWRkRWxlbWVudDxkb3VibGU+KFR5cGVBbGlhc2VzOjpWVF9GNjQsIGY2NCwgMC4wKTsKKyAgfQorICB2b2lkIGFkZF92OChmbGF0YnVmZmVyczo6T2Zmc2V0PGZsYXRidWZmZXJzOjpWZWN0b3I8aW50OF90Pj4gdjgpIHsKKyAgICBmYmJfLkFkZE9mZnNldChUeXBlQWxpYXNlczo6VlRfVjgsIHY4KTsKKyAgfQorICB2b2lkIGFkZF92ZjY0KGZsYXRidWZmZXJzOjpPZmZzZXQ8ZmxhdGJ1ZmZlcnM6OlZlY3Rvcjxkb3VibGU+PiB2ZjY0KSB7CisgICAgZmJiXy5BZGRPZmZzZXQoVHlwZUFsaWFzZXM6OlZUX1ZGNjQsIHZmNjQpOworICB9CisgIGV4cGxpY2l0IFR5cGVBbGlhc2VzQnVpbGRlcihmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIpCisgICAgICAgIDogZmJiXyhfZmJiKSB7CisgICAgc3RhcnRfID0gZmJiXy5TdGFydFRhYmxlKCk7CisgIH0KKyAgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxUeXBlQWxpYXNlcz4gRmluaXNoKCkgeworICAgIGNvbnN0IGF1dG8gZW5kID0gZmJiXy5FbmRUYWJsZShzdGFydF8pOworICAgIGF1dG8gbyA9IGZsYXRidWZmZXJzOjpPZmZzZXQ8VHlwZUFsaWFzZXM+KGVuZCk7CisgICAgcmV0dXJuIG87CisgIH0KK307CisKK2lubGluZSBmbGF0YnVmZmVyczo6T2Zmc2V0PFR5cGVBbGlhc2VzPiBDcmVhdGVUeXBlQWxpYXNlcygKKyAgICBmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsCisgICAgaW50OF90IGk4ID0gMCwKKyAgICB1aW50OF90IHU4ID0gMCwKKyAgICBpbnQxNl90IGkxNiA9IDAsCisgICAgdWludDE2X3QgdTE2ID0gMCwKKyAgICBpbnQzMl90IGkzMiA9IDAsCisgICAgdWludDMyX3QgdTMyID0gMCwKKyAgICBpbnQ2NF90IGk2NCA9IDAsCisgICAgdWludDY0X3QgdTY0ID0gMCwKKyAgICBmbG9hdCBmMzIgPSAwLjBmLAorICAgIGRvdWJsZSBmNjQgPSAwLjAsCisgICAgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxmbGF0YnVmZmVyczo6VmVjdG9yPGludDhfdD4+IHY4ID0gMCwKKyAgICBmbGF0YnVmZmVyczo6T2Zmc2V0PGZsYXRidWZmZXJzOjpWZWN0b3I8ZG91YmxlPj4gdmY2NCA9IDApIHsKKyAgVHlwZUFsaWFzZXNCdWlsZGVyIGJ1aWxkZXJfKF9mYmIpOworICBidWlsZGVyXy5hZGRfZjY0KGY2NCk7CisgIGJ1aWxkZXJfLmFkZF91NjQodTY0KTsKKyAgYnVpbGRlcl8uYWRkX2k2NChpNjQpOworICBidWlsZGVyXy5hZGRfdmY2NCh2ZjY0KTsKKyAgYnVpbGRlcl8uYWRkX3Y4KHY4KTsKKyAgYnVpbGRlcl8uYWRkX2YzMihmMzIpOworICBidWlsZGVyXy5hZGRfdTMyKHUzMik7CisgIGJ1aWxkZXJfLmFkZF9pMzIoaTMyKTsKKyAgYnVpbGRlcl8uYWRkX3UxNih1MTYpOworICBidWlsZGVyXy5hZGRfaTE2KGkxNik7CisgIGJ1aWxkZXJfLmFkZF91OCh1OCk7CisgIGJ1aWxkZXJfLmFkZF9pOChpOCk7CisgIHJldHVybiBidWlsZGVyXy5GaW5pc2goKTsKK30KKworaW5saW5lIGZsYXRidWZmZXJzOjpPZmZzZXQ8VHlwZUFsaWFzZXM+IENyZWF0ZVR5cGVBbGlhc2VzRGlyZWN0KAorICAgIGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwKKyAgICBpbnQ4X3QgaTggPSAwLAorICAgIHVpbnQ4X3QgdTggPSAwLAorICAgIGludDE2X3QgaTE2ID0gMCwKKyAgICB1aW50MTZfdCB1MTYgPSAwLAorICAgIGludDMyX3QgaTMyID0gMCwKKyAgICB1aW50MzJfdCB1MzIgPSAwLAorICAgIGludDY0X3QgaTY0ID0gMCwKKyAgICB1aW50NjRfdCB1NjQgPSAwLAorICAgIGZsb2F0IGYzMiA9IDAuMGYsCisgICAgZG91YmxlIGY2NCA9IDAuMCwKKyAgICBjb25zdCBzdGQ6OnZlY3RvcjxpbnQ4X3Q+ICp2OCA9IG51bGxwdHIsCisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8ZG91YmxlPiAqdmY2NCA9IG51bGxwdHIpIHsKKyAgYXV0byB2OF9fID0gdjggPyBfZmJiLkNyZWF0ZVZlY3RvcjxpbnQ4X3Q+KCp2OCkgOiAwOworICBhdXRvIHZmNjRfXyA9IHZmNjQgPyBfZmJiLkNyZWF0ZVZlY3Rvcjxkb3VibGU+KCp2ZjY0KSA6IDA7CisgIHJldHVybiBNeUdhbWU6OkV4YW1wbGU6OkNyZWF0ZVR5cGVBbGlhc2VzKAorICAgICAgX2ZiYiwKKyAgICAgIGk4LAorICAgICAgdTgsCisgICAgICBpMTYsCisgICAgICB1MTYsCisgICAgICBpMzIsCisgICAgICB1MzIsCisgICAgICBpNjQsCisgICAgICB1NjQsCisgICAgICBmMzIsCisgICAgICBmNjQsCisgICAgICB2OF9fLAorICAgICAgdmY2NF9fKTsKK30KKworZmxhdGJ1ZmZlcnM6Ok9mZnNldDxUeXBlQWxpYXNlcz4gQ3JlYXRlVHlwZUFsaWFzZXMoZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBUeXBlQWxpYXNlc1QgKl9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyID0gbnVsbHB0cik7CisKK30gIC8vIG5hbWVzcGFjZSBFeGFtcGxlCisKKworaW5saW5lIGJvb2wgb3BlcmF0b3I9PShjb25zdCBJblBhcmVudE5hbWVzcGFjZVQgJiwgY29uc3QgSW5QYXJlbnROYW1lc3BhY2VUICYpIHsKKyAgcmV0dXJuIHRydWU7Cit9CisKK2lubGluZSBib29sIG9wZXJhdG9yIT0oY29uc3QgSW5QYXJlbnROYW1lc3BhY2VUICZsaHMsIGNvbnN0IEluUGFyZW50TmFtZXNwYWNlVCAmcmhzKSB7CisgICAgcmV0dXJuICEobGhzID09IHJocyk7Cit9CisKKworaW5saW5lIEluUGFyZW50TmFtZXNwYWNlVCAqSW5QYXJlbnROYW1lc3BhY2U6OlVuUGFjayhjb25zdCBmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyKSBjb25zdCB7CisgIGF1dG8gX28gPSBzdGQ6OnVuaXF1ZV9wdHI8SW5QYXJlbnROYW1lc3BhY2VUPihuZXcgSW5QYXJlbnROYW1lc3BhY2VUKCkpOworICBVblBhY2tUbyhfby5nZXQoKSwgX3Jlc29sdmVyKTsKKyAgcmV0dXJuIF9vLnJlbGVhc2UoKTsKK30KKworaW5saW5lIHZvaWQgSW5QYXJlbnROYW1lc3BhY2U6OlVuUGFja1RvKEluUGFyZW50TmFtZXNwYWNlVCAqX28sIGNvbnN0IGZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIpIGNvbnN0IHsKKyAgKHZvaWQpX287CisgICh2b2lkKV9yZXNvbHZlcjsKK30KKworaW5saW5lIGZsYXRidWZmZXJzOjpPZmZzZXQ8SW5QYXJlbnROYW1lc3BhY2U+IEluUGFyZW50TmFtZXNwYWNlOjpQYWNrKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgSW5QYXJlbnROYW1lc3BhY2VUKiBfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlcikgeworICByZXR1cm4gQ3JlYXRlSW5QYXJlbnROYW1lc3BhY2UoX2ZiYiwgX28sIF9yZWhhc2hlcik7Cit9CisKK2lubGluZSBmbGF0YnVmZmVyczo6T2Zmc2V0PEluUGFyZW50TmFtZXNwYWNlPiBDcmVhdGVJblBhcmVudE5hbWVzcGFjZShmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IEluUGFyZW50TmFtZXNwYWNlVCAqX28sIGNvbnN0IGZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIpIHsKKyAgKHZvaWQpX3JlaGFzaGVyOworICAodm9pZClfbzsKKyAgc3RydWN0IF9WZWN0b3JBcmdzIHsgZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICpfX2ZiYjsgY29uc3QgSW5QYXJlbnROYW1lc3BhY2VUKiBfX287IGNvbnN0IGZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfX3JlaGFzaGVyOyB9IF92YSA9IHsgJl9mYmIsIF9vLCBfcmVoYXNoZXJ9OyAodm9pZClfdmE7CisgIHJldHVybiBNeUdhbWU6OkNyZWF0ZUluUGFyZW50TmFtZXNwYWNlKAorICAgICAgX2ZiYik7Cit9CisKK25hbWVzcGFjZSBFeGFtcGxlMiB7CisKKworaW5saW5lIGJvb2wgb3BlcmF0b3I9PShjb25zdCBNb25zdGVyVCAmLCBjb25zdCBNb25zdGVyVCAmKSB7CisgIHJldHVybiB0cnVlOworfQorCitpbmxpbmUgYm9vbCBvcGVyYXRvciE9KGNvbnN0IE1vbnN0ZXJUICZsaHMsIGNvbnN0IE1vbnN0ZXJUICZyaHMpIHsKKyAgICByZXR1cm4gIShsaHMgPT0gcmhzKTsKK30KKworCitpbmxpbmUgTW9uc3RlclQgKk1vbnN0ZXI6OlVuUGFjayhjb25zdCBmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyKSBjb25zdCB7CisgIGF1dG8gX28gPSBzdGQ6OnVuaXF1ZV9wdHI8TW9uc3RlclQ+KG5ldyBNb25zdGVyVCgpKTsKKyAgVW5QYWNrVG8oX28uZ2V0KCksIF9yZXNvbHZlcik7CisgIHJldHVybiBfby5yZWxlYXNlKCk7Cit9CisKK2lubGluZSB2b2lkIE1vbnN0ZXI6OlVuUGFja1RvKE1vbnN0ZXJUICpfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlcikgY29uc3QgeworICAodm9pZClfbzsKKyAgKHZvaWQpX3Jlc29sdmVyOworfQorCitpbmxpbmUgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxNb25zdGVyPiBNb25zdGVyOjpQYWNrKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgTW9uc3RlclQqIF9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyKSB7CisgIHJldHVybiBDcmVhdGVNb25zdGVyKF9mYmIsIF9vLCBfcmVoYXNoZXIpOworfQorCitpbmxpbmUgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxNb25zdGVyPiBDcmVhdGVNb25zdGVyKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgTW9uc3RlclQgKl9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyKSB7CisgICh2b2lkKV9yZWhhc2hlcjsKKyAgKHZvaWQpX287CisgIHN0cnVjdCBfVmVjdG9yQXJncyB7IGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAqX19mYmI7IGNvbnN0IE1vbnN0ZXJUKiBfX287IGNvbnN0IGZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfX3JlaGFzaGVyOyB9IF92YSA9IHsgJl9mYmIsIF9vLCBfcmVoYXNoZXJ9OyAodm9pZClfdmE7CisgIHJldHVybiBNeUdhbWU6OkV4YW1wbGUyOjpDcmVhdGVNb25zdGVyKAorICAgICAgX2ZiYik7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBFeGFtcGxlMgorCituYW1lc3BhY2UgRXhhbXBsZSB7CisKKworaW5saW5lIGJvb2wgb3BlcmF0b3I9PShjb25zdCBUZXN0U2ltcGxlVGFibGVXaXRoRW51bVQgJmxocywgY29uc3QgVGVzdFNpbXBsZVRhYmxlV2l0aEVudW1UICZyaHMpIHsKKyAgcmV0dXJuCisgICAgICAobGhzLmNvbG9yID09IHJocy5jb2xvcik7Cit9CisKK2lubGluZSBib29sIG9wZXJhdG9yIT0oY29uc3QgVGVzdFNpbXBsZVRhYmxlV2l0aEVudW1UICZsaHMsIGNvbnN0IFRlc3RTaW1wbGVUYWJsZVdpdGhFbnVtVCAmcmhzKSB7CisgICAgcmV0dXJuICEobGhzID09IHJocyk7Cit9CisKKworaW5saW5lIFRlc3RTaW1wbGVUYWJsZVdpdGhFbnVtVCAqVGVzdFNpbXBsZVRhYmxlV2l0aEVudW06OlVuUGFjayhjb25zdCBmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyKSBjb25zdCB7CisgIGF1dG8gX28gPSBzdGQ6OnVuaXF1ZV9wdHI8VGVzdFNpbXBsZVRhYmxlV2l0aEVudW1UPihuZXcgVGVzdFNpbXBsZVRhYmxlV2l0aEVudW1UKCkpOworICBVblBhY2tUbyhfby5nZXQoKSwgX3Jlc29sdmVyKTsKKyAgcmV0dXJuIF9vLnJlbGVhc2UoKTsKK30KKworaW5saW5lIHZvaWQgVGVzdFNpbXBsZVRhYmxlV2l0aEVudW06OlVuUGFja1RvKFRlc3RTaW1wbGVUYWJsZVdpdGhFbnVtVCAqX28sIGNvbnN0IGZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIpIGNvbnN0IHsKKyAgKHZvaWQpX287CisgICh2b2lkKV9yZXNvbHZlcjsKKyAgeyBhdXRvIF9lID0gY29sb3IoKTsgX28tPmNvbG9yID0gX2U7IH0KK30KKworaW5saW5lIGZsYXRidWZmZXJzOjpPZmZzZXQ8VGVzdFNpbXBsZVRhYmxlV2l0aEVudW0+IFRlc3RTaW1wbGVUYWJsZVdpdGhFbnVtOjpQYWNrKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgVGVzdFNpbXBsZVRhYmxlV2l0aEVudW1UKiBfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlcikgeworICByZXR1cm4gQ3JlYXRlVGVzdFNpbXBsZVRhYmxlV2l0aEVudW0oX2ZiYiwgX28sIF9yZWhhc2hlcik7Cit9CisKK2lubGluZSBmbGF0YnVmZmVyczo6T2Zmc2V0PFRlc3RTaW1wbGVUYWJsZVdpdGhFbnVtPiBDcmVhdGVUZXN0U2ltcGxlVGFibGVXaXRoRW51bShmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IFRlc3RTaW1wbGVUYWJsZVdpdGhFbnVtVCAqX28sIGNvbnN0IGZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIpIHsKKyAgKHZvaWQpX3JlaGFzaGVyOworICAodm9pZClfbzsKKyAgc3RydWN0IF9WZWN0b3JBcmdzIHsgZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICpfX2ZiYjsgY29uc3QgVGVzdFNpbXBsZVRhYmxlV2l0aEVudW1UKiBfX287IGNvbnN0IGZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfX3JlaGFzaGVyOyB9IF92YSA9IHsgJl9mYmIsIF9vLCBfcmVoYXNoZXJ9OyAodm9pZClfdmE7CisgIGF1dG8gX2NvbG9yID0gX28tPmNvbG9yOworICByZXR1cm4gTXlHYW1lOjpFeGFtcGxlOjpDcmVhdGVUZXN0U2ltcGxlVGFibGVXaXRoRW51bSgKKyAgICAgIF9mYmIsCisgICAgICBfY29sb3IpOworfQorCisKK2lubGluZSBib29sIG9wZXJhdG9yPT0oY29uc3QgU3RhdFQgJmxocywgY29uc3QgU3RhdFQgJnJocykgeworICByZXR1cm4KKyAgICAgIChsaHMuaWQgPT0gcmhzLmlkKSAmJgorICAgICAgKGxocy52YWwgPT0gcmhzLnZhbCkgJiYKKyAgICAgIChsaHMuY291bnQgPT0gcmhzLmNvdW50KTsKK30KKworaW5saW5lIGJvb2wgb3BlcmF0b3IhPShjb25zdCBTdGF0VCAmbGhzLCBjb25zdCBTdGF0VCAmcmhzKSB7CisgICAgcmV0dXJuICEobGhzID09IHJocyk7Cit9CisKKworaW5saW5lIFN0YXRUICpTdGF0OjpVblBhY2soY29uc3QgZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlcikgY29uc3QgeworICBhdXRvIF9vID0gc3RkOjp1bmlxdWVfcHRyPFN0YXRUPihuZXcgU3RhdFQoKSk7CisgIFVuUGFja1RvKF9vLmdldCgpLCBfcmVzb2x2ZXIpOworICByZXR1cm4gX28ucmVsZWFzZSgpOworfQorCitpbmxpbmUgdm9pZCBTdGF0OjpVblBhY2tUbyhTdGF0VCAqX28sIGNvbnN0IGZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIpIGNvbnN0IHsKKyAgKHZvaWQpX287CisgICh2b2lkKV9yZXNvbHZlcjsKKyAgeyBhdXRvIF9lID0gaWQoKTsgaWYgKF9lKSBfby0+aWQgPSBfZS0+c3RyKCk7IH0KKyAgeyBhdXRvIF9lID0gdmFsKCk7IF9vLT52YWwgPSBfZTsgfQorICB7IGF1dG8gX2UgPSBjb3VudCgpOyBfby0+Y291bnQgPSBfZTsgfQorfQorCitpbmxpbmUgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxTdGF0PiBTdGF0OjpQYWNrKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgU3RhdFQqIF9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyKSB7CisgIHJldHVybiBDcmVhdGVTdGF0KF9mYmIsIF9vLCBfcmVoYXNoZXIpOworfQorCitpbmxpbmUgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxTdGF0PiBDcmVhdGVTdGF0KGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgU3RhdFQgKl9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyKSB7CisgICh2b2lkKV9yZWhhc2hlcjsKKyAgKHZvaWQpX287CisgIHN0cnVjdCBfVmVjdG9yQXJncyB7IGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAqX19mYmI7IGNvbnN0IFN0YXRUKiBfX287IGNvbnN0IGZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfX3JlaGFzaGVyOyB9IF92YSA9IHsgJl9mYmIsIF9vLCBfcmVoYXNoZXJ9OyAodm9pZClfdmE7CisgIGF1dG8gX2lkID0gX28tPmlkLmVtcHR5KCkgPyAwIDogX2ZiYi5DcmVhdGVTdHJpbmcoX28tPmlkKTsKKyAgYXV0byBfdmFsID0gX28tPnZhbDsKKyAgYXV0byBfY291bnQgPSBfby0+Y291bnQ7CisgIHJldHVybiBNeUdhbWU6OkV4YW1wbGU6OkNyZWF0ZVN0YXQoCisgICAgICBfZmJiLAorICAgICAgX2lkLAorICAgICAgX3ZhbCwKKyAgICAgIF9jb3VudCk7Cit9CisKKworaW5saW5lIGJvb2wgb3BlcmF0b3I9PShjb25zdCBSZWZlcnJhYmxlVCAmbGhzLCBjb25zdCBSZWZlcnJhYmxlVCAmcmhzKSB7CisgIHJldHVybgorICAgICAgKGxocy5pZCA9PSByaHMuaWQpOworfQorCitpbmxpbmUgYm9vbCBvcGVyYXRvciE9KGNvbnN0IFJlZmVycmFibGVUICZsaHMsIGNvbnN0IFJlZmVycmFibGVUICZyaHMpIHsKKyAgICByZXR1cm4gIShsaHMgPT0gcmhzKTsKK30KKworCitpbmxpbmUgUmVmZXJyYWJsZVQgKlJlZmVycmFibGU6OlVuUGFjayhjb25zdCBmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyKSBjb25zdCB7CisgIGF1dG8gX28gPSBzdGQ6OnVuaXF1ZV9wdHI8UmVmZXJyYWJsZVQ+KG5ldyBSZWZlcnJhYmxlVCgpKTsKKyAgVW5QYWNrVG8oX28uZ2V0KCksIF9yZXNvbHZlcik7CisgIHJldHVybiBfby5yZWxlYXNlKCk7Cit9CisKK2lubGluZSB2b2lkIFJlZmVycmFibGU6OlVuUGFja1RvKFJlZmVycmFibGVUICpfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlcikgY29uc3QgeworICAodm9pZClfbzsKKyAgKHZvaWQpX3Jlc29sdmVyOworICB7IGF1dG8gX2UgPSBpZCgpOyBfby0+aWQgPSBfZTsgfQorfQorCitpbmxpbmUgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxSZWZlcnJhYmxlPiBSZWZlcnJhYmxlOjpQYWNrKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgUmVmZXJyYWJsZVQqIF9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyKSB7CisgIHJldHVybiBDcmVhdGVSZWZlcnJhYmxlKF9mYmIsIF9vLCBfcmVoYXNoZXIpOworfQorCitpbmxpbmUgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxSZWZlcnJhYmxlPiBDcmVhdGVSZWZlcnJhYmxlKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgUmVmZXJyYWJsZVQgKl9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyKSB7CisgICh2b2lkKV9yZWhhc2hlcjsKKyAgKHZvaWQpX287CisgIHN0cnVjdCBfVmVjdG9yQXJncyB7IGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAqX19mYmI7IGNvbnN0IFJlZmVycmFibGVUKiBfX287IGNvbnN0IGZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfX3JlaGFzaGVyOyB9IF92YSA9IHsgJl9mYmIsIF9vLCBfcmVoYXNoZXJ9OyAodm9pZClfdmE7CisgIGF1dG8gX2lkID0gX28tPmlkOworICByZXR1cm4gTXlHYW1lOjpFeGFtcGxlOjpDcmVhdGVSZWZlcnJhYmxlKAorICAgICAgX2ZiYiwKKyAgICAgIF9pZCk7Cit9CisKKworaW5saW5lIGJvb2wgb3BlcmF0b3I9PShjb25zdCBNb25zdGVyVCAmbGhzLCBjb25zdCBNb25zdGVyVCAmcmhzKSB7CisgIHJldHVybgorICAgICAgKChsaHMucG9zID09IHJocy5wb3MpIHx8IChsaHMucG9zICYmIHJocy5wb3MgJiYgKmxocy5wb3MgPT0gKnJocy5wb3MpKSAmJgorICAgICAgKGxocy5tYW5hID09IHJocy5tYW5hKSAmJgorICAgICAgKGxocy5ocCA9PSByaHMuaHApICYmCisgICAgICAobGhzLm5hbWUgPT0gcmhzLm5hbWUpICYmCisgICAgICAobGhzLmludmVudG9yeSA9PSByaHMuaW52ZW50b3J5KSAmJgorICAgICAgKGxocy5jb2xvciA9PSByaHMuY29sb3IpICYmCisgICAgICAobGhzLnRlc3QgPT0gcmhzLnRlc3QpICYmCisgICAgICAobGhzLnRlc3Q0ID09IHJocy50ZXN0NCkgJiYKKyAgICAgIChsaHMudGVzdGFycmF5b2ZzdHJpbmcgPT0gcmhzLnRlc3RhcnJheW9mc3RyaW5nKSAmJgorICAgICAgKGxocy50ZXN0YXJyYXlvZnRhYmxlcy5zaXplKCkgPT0gcmhzLnRlc3RhcnJheW9mdGFibGVzLnNpemUoKSAmJiBzdGQ6OmVxdWFsKGxocy50ZXN0YXJyYXlvZnRhYmxlcy5jYmVnaW4oKSwgbGhzLnRlc3RhcnJheW9mdGFibGVzLmNlbmQoKSwgcmhzLnRlc3RhcnJheW9mdGFibGVzLmNiZWdpbigpLCBbXShmbGF0YnVmZmVyczo6dW5pcXVlX3B0cjxNeUdhbWU6OkV4YW1wbGU6Ok1vbnN0ZXJUPiBjb25zdCAmYSwgZmxhdGJ1ZmZlcnM6OnVuaXF1ZV9wdHI8TXlHYW1lOjpFeGFtcGxlOjpNb25zdGVyVD4gY29uc3QgJmIpIHsgcmV0dXJuIChhID09IGIpIHx8IChhICYmIGIgJiYgKmEgPT0gKmIpOyB9KSkgJiYKKyAgICAgICgobGhzLmVuZW15ID09IHJocy5lbmVteSkgfHwgKGxocy5lbmVteSAmJiByaHMuZW5lbXkgJiYgKmxocy5lbmVteSA9PSAqcmhzLmVuZW15KSkgJiYKKyAgICAgIChsaHMudGVzdG5lc3RlZGZsYXRidWZmZXIgPT0gcmhzLnRlc3RuZXN0ZWRmbGF0YnVmZmVyKSAmJgorICAgICAgKChsaHMudGVzdGVtcHR5ID09IHJocy50ZXN0ZW1wdHkpIHx8IChsaHMudGVzdGVtcHR5ICYmIHJocy50ZXN0ZW1wdHkgJiYgKmxocy50ZXN0ZW1wdHkgPT0gKnJocy50ZXN0ZW1wdHkpKSAmJgorICAgICAgKGxocy50ZXN0Ym9vbCA9PSByaHMudGVzdGJvb2wpICYmCisgICAgICAobGhzLnRlc3RoYXNoczMyX2ZudjEgPT0gcmhzLnRlc3RoYXNoczMyX2ZudjEpICYmCisgICAgICAobGhzLnRlc3RoYXNodTMyX2ZudjEgPT0gcmhzLnRlc3RoYXNodTMyX2ZudjEpICYmCisgICAgICAobGhzLnRlc3RoYXNoczY0X2ZudjEgPT0gcmhzLnRlc3RoYXNoczY0X2ZudjEpICYmCisgICAgICAobGhzLnRlc3RoYXNodTY0X2ZudjEgPT0gcmhzLnRlc3RoYXNodTY0X2ZudjEpICYmCisgICAgICAobGhzLnRlc3RoYXNoczMyX2ZudjFhID09IHJocy50ZXN0aGFzaHMzMl9mbnYxYSkgJiYKKyAgICAgIChsaHMudGVzdGhhc2h1MzJfZm52MWEgPT0gcmhzLnRlc3RoYXNodTMyX2ZudjFhKSAmJgorICAgICAgKGxocy50ZXN0aGFzaHM2NF9mbnYxYSA9PSByaHMudGVzdGhhc2hzNjRfZm52MWEpICYmCisgICAgICAobGhzLnRlc3RoYXNodTY0X2ZudjFhID09IHJocy50ZXN0aGFzaHU2NF9mbnYxYSkgJiYKKyAgICAgIChsaHMudGVzdGFycmF5b2Zib29scyA9PSByaHMudGVzdGFycmF5b2Zib29scykgJiYKKyAgICAgIChsaHMudGVzdGYgPT0gcmhzLnRlc3RmKSAmJgorICAgICAgKGxocy50ZXN0ZjIgPT0gcmhzLnRlc3RmMikgJiYKKyAgICAgIChsaHMudGVzdGYzID09IHJocy50ZXN0ZjMpICYmCisgICAgICAobGhzLnRlc3RhcnJheW9mc3RyaW5nMiA9PSByaHMudGVzdGFycmF5b2ZzdHJpbmcyKSAmJgorICAgICAgKGxocy50ZXN0YXJyYXlvZnNvcnRlZHN0cnVjdCA9PSByaHMudGVzdGFycmF5b2Zzb3J0ZWRzdHJ1Y3QpICYmCisgICAgICAobGhzLmZsZXggPT0gcmhzLmZsZXgpICYmCisgICAgICAobGhzLnRlc3Q1ID09IHJocy50ZXN0NSkgJiYKKyAgICAgIChsaHMudmVjdG9yX29mX2xvbmdzID09IHJocy52ZWN0b3Jfb2ZfbG9uZ3MpICYmCisgICAgICAobGhzLnZlY3Rvcl9vZl9kb3VibGVzID09IHJocy52ZWN0b3Jfb2ZfZG91YmxlcykgJiYKKyAgICAgICgobGhzLnBhcmVudF9uYW1lc3BhY2VfdGVzdCA9PSByaHMucGFyZW50X25hbWVzcGFjZV90ZXN0KSB8fCAobGhzLnBhcmVudF9uYW1lc3BhY2VfdGVzdCAmJiByaHMucGFyZW50X25hbWVzcGFjZV90ZXN0ICYmICpsaHMucGFyZW50X25hbWVzcGFjZV90ZXN0ID09ICpyaHMucGFyZW50X25hbWVzcGFjZV90ZXN0KSkgJiYKKyAgICAgIChsaHMudmVjdG9yX29mX3JlZmVycmFibGVzLnNpemUoKSA9PSByaHMudmVjdG9yX29mX3JlZmVycmFibGVzLnNpemUoKSAmJiBzdGQ6OmVxdWFsKGxocy52ZWN0b3Jfb2ZfcmVmZXJyYWJsZXMuY2JlZ2luKCksIGxocy52ZWN0b3Jfb2ZfcmVmZXJyYWJsZXMuY2VuZCgpLCByaHMudmVjdG9yX29mX3JlZmVycmFibGVzLmNiZWdpbigpLCBbXShmbGF0YnVmZmVyczo6dW5pcXVlX3B0cjxNeUdhbWU6OkV4YW1wbGU6OlJlZmVycmFibGVUPiBjb25zdCAmYSwgZmxhdGJ1ZmZlcnM6OnVuaXF1ZV9wdHI8TXlHYW1lOjpFeGFtcGxlOjpSZWZlcnJhYmxlVD4gY29uc3QgJmIpIHsgcmV0dXJuIChhID09IGIpIHx8IChhICYmIGIgJiYgKmEgPT0gKmIpOyB9KSkgJiYKKyAgICAgIChsaHMuc2luZ2xlX3dlYWtfcmVmZXJlbmNlID09IHJocy5zaW5nbGVfd2Vha19yZWZlcmVuY2UpICYmCisgICAgICAobGhzLnZlY3Rvcl9vZl93ZWFrX3JlZmVyZW5jZXMgPT0gcmhzLnZlY3Rvcl9vZl93ZWFrX3JlZmVyZW5jZXMpICYmCisgICAgICAobGhzLnZlY3Rvcl9vZl9zdHJvbmdfcmVmZXJyYWJsZXMuc2l6ZSgpID09IHJocy52ZWN0b3Jfb2Zfc3Ryb25nX3JlZmVycmFibGVzLnNpemUoKSAmJiBzdGQ6OmVxdWFsKGxocy52ZWN0b3Jfb2Zfc3Ryb25nX3JlZmVycmFibGVzLmNiZWdpbigpLCBsaHMudmVjdG9yX29mX3N0cm9uZ19yZWZlcnJhYmxlcy5jZW5kKCksIHJocy52ZWN0b3Jfb2Zfc3Ryb25nX3JlZmVycmFibGVzLmNiZWdpbigpLCBbXShmbGF0YnVmZmVyczo6dW5pcXVlX3B0cjxNeUdhbWU6OkV4YW1wbGU6OlJlZmVycmFibGVUPiBjb25zdCAmYSwgZmxhdGJ1ZmZlcnM6OnVuaXF1ZV9wdHI8TXlHYW1lOjpFeGFtcGxlOjpSZWZlcnJhYmxlVD4gY29uc3QgJmIpIHsgcmV0dXJuIChhID09IGIpIHx8IChhICYmIGIgJiYgKmEgPT0gKmIpOyB9KSkgJiYKKyAgICAgIChsaHMuY29fb3duaW5nX3JlZmVyZW5jZSA9PSByaHMuY29fb3duaW5nX3JlZmVyZW5jZSkgJiYKKyAgICAgIChsaHMudmVjdG9yX29mX2NvX293bmluZ19yZWZlcmVuY2VzID09IHJocy52ZWN0b3Jfb2ZfY29fb3duaW5nX3JlZmVyZW5jZXMpICYmCisgICAgICAobGhzLm5vbl9vd25pbmdfcmVmZXJlbmNlID09IHJocy5ub25fb3duaW5nX3JlZmVyZW5jZSkgJiYKKyAgICAgIChsaHMudmVjdG9yX29mX25vbl9vd25pbmdfcmVmZXJlbmNlcyA9PSByaHMudmVjdG9yX29mX25vbl9vd25pbmdfcmVmZXJlbmNlcykgJiYKKyAgICAgIChsaHMuYW55X3VuaXF1ZSA9PSByaHMuYW55X3VuaXF1ZSkgJiYKKyAgICAgIChsaHMuYW55X2FtYmlndW91cyA9PSByaHMuYW55X2FtYmlndW91cykgJiYKKyAgICAgIChsaHMudmVjdG9yX29mX2VudW1zID09IHJocy52ZWN0b3Jfb2ZfZW51bXMpICYmCisgICAgICAobGhzLnNpZ25lZF9lbnVtID09IHJocy5zaWduZWRfZW51bSkgJiYKKyAgICAgIChsaHMudGVzdHJlcXVpcmVkbmVzdGVkZmxhdGJ1ZmZlciA9PSByaHMudGVzdHJlcXVpcmVkbmVzdGVkZmxhdGJ1ZmZlcikgJiYKKyAgICAgIChsaHMuc2NhbGFyX2tleV9zb3J0ZWRfdGFibGVzLnNpemUoKSA9PSByaHMuc2NhbGFyX2tleV9zb3J0ZWRfdGFibGVzLnNpemUoKSAmJiBzdGQ6OmVxdWFsKGxocy5zY2FsYXJfa2V5X3NvcnRlZF90YWJsZXMuY2JlZ2luKCksIGxocy5zY2FsYXJfa2V5X3NvcnRlZF90YWJsZXMuY2VuZCgpLCByaHMuc2NhbGFyX2tleV9zb3J0ZWRfdGFibGVzLmNiZWdpbigpLCBbXShmbGF0YnVmZmVyczo6dW5pcXVlX3B0cjxNeUdhbWU6OkV4YW1wbGU6OlN0YXRUPiBjb25zdCAmYSwgZmxhdGJ1ZmZlcnM6OnVuaXF1ZV9wdHI8TXlHYW1lOjpFeGFtcGxlOjpTdGF0VD4gY29uc3QgJmIpIHsgcmV0dXJuIChhID09IGIpIHx8IChhICYmIGIgJiYgKmEgPT0gKmIpOyB9KSkgJiYKKyAgICAgIChsaHMubmF0aXZlX2lubGluZSA9PSByaHMubmF0aXZlX2lubGluZSkgJiYKKyAgICAgIChsaHMubG9uZ19lbnVtX25vbl9lbnVtX2RlZmF1bHQgPT0gcmhzLmxvbmdfZW51bV9ub25fZW51bV9kZWZhdWx0KSAmJgorICAgICAgKGxocy5sb25nX2VudW1fbm9ybWFsX2RlZmF1bHQgPT0gcmhzLmxvbmdfZW51bV9ub3JtYWxfZGVmYXVsdCk7Cit9CisKK2lubGluZSBib29sIG9wZXJhdG9yIT0oY29uc3QgTW9uc3RlclQgJmxocywgY29uc3QgTW9uc3RlclQgJnJocykgeworICAgIHJldHVybiAhKGxocyA9PSByaHMpOworfQorCisKK2lubGluZSBNb25zdGVyVDo6TW9uc3RlclQoY29uc3QgTW9uc3RlclQgJm8pCisgICAgICA6IHBvcygoby5wb3MpID8gbmV3IE15R2FtZTo6RXhhbXBsZTo6VmVjMygqby5wb3MpIDogbnVsbHB0ciksCisgICAgICAgIG1hbmEoby5tYW5hKSwKKyAgICAgICAgaHAoby5ocCksCisgICAgICAgIG5hbWUoby5uYW1lKSwKKyAgICAgICAgaW52ZW50b3J5KG8uaW52ZW50b3J5KSwKKyAgICAgICAgY29sb3Ioby5jb2xvciksCisgICAgICAgIHRlc3Qoby50ZXN0KSwKKyAgICAgICAgdGVzdDQoby50ZXN0NCksCisgICAgICAgIHRlc3RhcnJheW9mc3RyaW5nKG8udGVzdGFycmF5b2ZzdHJpbmcpLAorICAgICAgICBlbmVteSgoby5lbmVteSkgPyBuZXcgTXlHYW1lOjpFeGFtcGxlOjpNb25zdGVyVCgqby5lbmVteSkgOiBudWxscHRyKSwKKyAgICAgICAgdGVzdG5lc3RlZGZsYXRidWZmZXIoby50ZXN0bmVzdGVkZmxhdGJ1ZmZlciksCisgICAgICAgIHRlc3RlbXB0eSgoby50ZXN0ZW1wdHkpID8gbmV3IE15R2FtZTo6RXhhbXBsZTo6U3RhdFQoKm8udGVzdGVtcHR5KSA6IG51bGxwdHIpLAorICAgICAgICB0ZXN0Ym9vbChvLnRlc3Rib29sKSwKKyAgICAgICAgdGVzdGhhc2hzMzJfZm52MShvLnRlc3RoYXNoczMyX2ZudjEpLAorICAgICAgICB0ZXN0aGFzaHUzMl9mbnYxKG8udGVzdGhhc2h1MzJfZm52MSksCisgICAgICAgIHRlc3RoYXNoczY0X2ZudjEoby50ZXN0aGFzaHM2NF9mbnYxKSwKKyAgICAgICAgdGVzdGhhc2h1NjRfZm52MShvLnRlc3RoYXNodTY0X2ZudjEpLAorICAgICAgICB0ZXN0aGFzaHMzMl9mbnYxYShvLnRlc3RoYXNoczMyX2ZudjFhKSwKKyAgICAgICAgdGVzdGhhc2h1MzJfZm52MWEoby50ZXN0aGFzaHUzMl9mbnYxYSksCisgICAgICAgIHRlc3RoYXNoczY0X2ZudjFhKG8udGVzdGhhc2hzNjRfZm52MWEpLAorICAgICAgICB0ZXN0aGFzaHU2NF9mbnYxYShvLnRlc3RoYXNodTY0X2ZudjFhKSwKKyAgICAgICAgdGVzdGFycmF5b2Zib29scyhvLnRlc3RhcnJheW9mYm9vbHMpLAorICAgICAgICB0ZXN0ZihvLnRlc3RmKSwKKyAgICAgICAgdGVzdGYyKG8udGVzdGYyKSwKKyAgICAgICAgdGVzdGYzKG8udGVzdGYzKSwKKyAgICAgICAgdGVzdGFycmF5b2ZzdHJpbmcyKG8udGVzdGFycmF5b2ZzdHJpbmcyKSwKKyAgICAgICAgdGVzdGFycmF5b2Zzb3J0ZWRzdHJ1Y3Qoby50ZXN0YXJyYXlvZnNvcnRlZHN0cnVjdCksCisgICAgICAgIGZsZXgoby5mbGV4KSwKKyAgICAgICAgdGVzdDUoby50ZXN0NSksCisgICAgICAgIHZlY3Rvcl9vZl9sb25ncyhvLnZlY3Rvcl9vZl9sb25ncyksCisgICAgICAgIHZlY3Rvcl9vZl9kb3VibGVzKG8udmVjdG9yX29mX2RvdWJsZXMpLAorICAgICAgICBwYXJlbnRfbmFtZXNwYWNlX3Rlc3QoKG8ucGFyZW50X25hbWVzcGFjZV90ZXN0KSA/IG5ldyBNeUdhbWU6OkluUGFyZW50TmFtZXNwYWNlVCgqby5wYXJlbnRfbmFtZXNwYWNlX3Rlc3QpIDogbnVsbHB0ciksCisgICAgICAgIHNpbmdsZV93ZWFrX3JlZmVyZW5jZShvLnNpbmdsZV93ZWFrX3JlZmVyZW5jZSksCisgICAgICAgIHZlY3Rvcl9vZl93ZWFrX3JlZmVyZW5jZXMoby52ZWN0b3Jfb2Zfd2Vha19yZWZlcmVuY2VzKSwKKyAgICAgICAgY29fb3duaW5nX3JlZmVyZW5jZShvLmNvX293bmluZ19yZWZlcmVuY2UpLAorICAgICAgICBub25fb3duaW5nX3JlZmVyZW5jZShvLm5vbl9vd25pbmdfcmVmZXJlbmNlKSwKKyAgICAgICAgdmVjdG9yX29mX25vbl9vd25pbmdfcmVmZXJlbmNlcyhvLnZlY3Rvcl9vZl9ub25fb3duaW5nX3JlZmVyZW5jZXMpLAorICAgICAgICBhbnlfdW5pcXVlKG8uYW55X3VuaXF1ZSksCisgICAgICAgIGFueV9hbWJpZ3VvdXMoby5hbnlfYW1iaWd1b3VzKSwKKyAgICAgICAgdmVjdG9yX29mX2VudW1zKG8udmVjdG9yX29mX2VudW1zKSwKKyAgICAgICAgc2lnbmVkX2VudW0oby5zaWduZWRfZW51bSksCisgICAgICAgIHRlc3RyZXF1aXJlZG5lc3RlZGZsYXRidWZmZXIoby50ZXN0cmVxdWlyZWRuZXN0ZWRmbGF0YnVmZmVyKSwKKyAgICAgICAgbmF0aXZlX2lubGluZShvLm5hdGl2ZV9pbmxpbmUpLAorICAgICAgICBsb25nX2VudW1fbm9uX2VudW1fZGVmYXVsdChvLmxvbmdfZW51bV9ub25fZW51bV9kZWZhdWx0KSwKKyAgICAgICAgbG9uZ19lbnVtX25vcm1hbF9kZWZhdWx0KG8ubG9uZ19lbnVtX25vcm1hbF9kZWZhdWx0KSB7CisgIHRlc3RhcnJheW9mdGFibGVzLnJlc2VydmUoby50ZXN0YXJyYXlvZnRhYmxlcy5zaXplKCkpOworICBmb3IgKGNvbnN0IGF1dG8gJnRlc3RhcnJheW9mdGFibGVzXyA6IG8udGVzdGFycmF5b2Z0YWJsZXMpIHsgdGVzdGFycmF5b2Z0YWJsZXMuZW1wbGFjZV9iYWNrKCh0ZXN0YXJyYXlvZnRhYmxlc18pID8gbmV3IE15R2FtZTo6RXhhbXBsZTo6TW9uc3RlclQoKnRlc3RhcnJheW9mdGFibGVzXykgOiBudWxscHRyKTsgfQorICB2ZWN0b3Jfb2ZfcmVmZXJyYWJsZXMucmVzZXJ2ZShvLnZlY3Rvcl9vZl9yZWZlcnJhYmxlcy5zaXplKCkpOworICBmb3IgKGNvbnN0IGF1dG8gJnZlY3Rvcl9vZl9yZWZlcnJhYmxlc18gOiBvLnZlY3Rvcl9vZl9yZWZlcnJhYmxlcykgeyB2ZWN0b3Jfb2ZfcmVmZXJyYWJsZXMuZW1wbGFjZV9iYWNrKCh2ZWN0b3Jfb2ZfcmVmZXJyYWJsZXNfKSA/IG5ldyBNeUdhbWU6OkV4YW1wbGU6OlJlZmVycmFibGVUKCp2ZWN0b3Jfb2ZfcmVmZXJyYWJsZXNfKSA6IG51bGxwdHIpOyB9CisgIHZlY3Rvcl9vZl9zdHJvbmdfcmVmZXJyYWJsZXMucmVzZXJ2ZShvLnZlY3Rvcl9vZl9zdHJvbmdfcmVmZXJyYWJsZXMuc2l6ZSgpKTsKKyAgZm9yIChjb25zdCBhdXRvICZ2ZWN0b3Jfb2Zfc3Ryb25nX3JlZmVycmFibGVzXyA6IG8udmVjdG9yX29mX3N0cm9uZ19yZWZlcnJhYmxlcykgeyB2ZWN0b3Jfb2Zfc3Ryb25nX3JlZmVycmFibGVzLmVtcGxhY2VfYmFjaygodmVjdG9yX29mX3N0cm9uZ19yZWZlcnJhYmxlc18pID8gbmV3IE15R2FtZTo6RXhhbXBsZTo6UmVmZXJyYWJsZVQoKnZlY3Rvcl9vZl9zdHJvbmdfcmVmZXJyYWJsZXNfKSA6IG51bGxwdHIpOyB9CisgIHZlY3Rvcl9vZl9jb19vd25pbmdfcmVmZXJlbmNlcy5yZXNlcnZlKG8udmVjdG9yX29mX2NvX293bmluZ19yZWZlcmVuY2VzLnNpemUoKSk7CisgIGZvciAoY29uc3QgYXV0byAmdmVjdG9yX29mX2NvX293bmluZ19yZWZlcmVuY2VzXyA6IG8udmVjdG9yX29mX2NvX293bmluZ19yZWZlcmVuY2VzKSB7IHZlY3Rvcl9vZl9jb19vd25pbmdfcmVmZXJlbmNlcy5lbXBsYWNlX2JhY2soKHZlY3Rvcl9vZl9jb19vd25pbmdfcmVmZXJlbmNlc18pID8gbmV3IFJlZmVycmFibGVUKCp2ZWN0b3Jfb2ZfY29fb3duaW5nX3JlZmVyZW5jZXNfKSA6IG51bGxwdHIpOyB9CisgIHNjYWxhcl9rZXlfc29ydGVkX3RhYmxlcy5yZXNlcnZlKG8uc2NhbGFyX2tleV9zb3J0ZWRfdGFibGVzLnNpemUoKSk7CisgIGZvciAoY29uc3QgYXV0byAmc2NhbGFyX2tleV9zb3J0ZWRfdGFibGVzXyA6IG8uc2NhbGFyX2tleV9zb3J0ZWRfdGFibGVzKSB7IHNjYWxhcl9rZXlfc29ydGVkX3RhYmxlcy5lbXBsYWNlX2JhY2soKHNjYWxhcl9rZXlfc29ydGVkX3RhYmxlc18pID8gbmV3IE15R2FtZTo6RXhhbXBsZTo6U3RhdFQoKnNjYWxhcl9rZXlfc29ydGVkX3RhYmxlc18pIDogbnVsbHB0cik7IH0KK30KKworaW5saW5lIE1vbnN0ZXJUICZNb25zdGVyVDo6b3BlcmF0b3I9KE1vbnN0ZXJUIG8pIEZMQVRCVUZGRVJTX05PRVhDRVBUIHsKKyAgc3RkOjpzd2FwKHBvcywgby5wb3MpOworICBzdGQ6OnN3YXAobWFuYSwgby5tYW5hKTsKKyAgc3RkOjpzd2FwKGhwLCBvLmhwKTsKKyAgc3RkOjpzd2FwKG5hbWUsIG8ubmFtZSk7CisgIHN0ZDo6c3dhcChpbnZlbnRvcnksIG8uaW52ZW50b3J5KTsKKyAgc3RkOjpzd2FwKGNvbG9yLCBvLmNvbG9yKTsKKyAgc3RkOjpzd2FwKHRlc3QsIG8udGVzdCk7CisgIHN0ZDo6c3dhcCh0ZXN0NCwgby50ZXN0NCk7CisgIHN0ZDo6c3dhcCh0ZXN0YXJyYXlvZnN0cmluZywgby50ZXN0YXJyYXlvZnN0cmluZyk7CisgIHN0ZDo6c3dhcCh0ZXN0YXJyYXlvZnRhYmxlcywgby50ZXN0YXJyYXlvZnRhYmxlcyk7CisgIHN0ZDo6c3dhcChlbmVteSwgby5lbmVteSk7CisgIHN0ZDo6c3dhcCh0ZXN0bmVzdGVkZmxhdGJ1ZmZlciwgby50ZXN0bmVzdGVkZmxhdGJ1ZmZlcik7CisgIHN0ZDo6c3dhcCh0ZXN0ZW1wdHksIG8udGVzdGVtcHR5KTsKKyAgc3RkOjpzd2FwKHRlc3Rib29sLCBvLnRlc3Rib29sKTsKKyAgc3RkOjpzd2FwKHRlc3RoYXNoczMyX2ZudjEsIG8udGVzdGhhc2hzMzJfZm52MSk7CisgIHN0ZDo6c3dhcCh0ZXN0aGFzaHUzMl9mbnYxLCBvLnRlc3RoYXNodTMyX2ZudjEpOworICBzdGQ6OnN3YXAodGVzdGhhc2hzNjRfZm52MSwgby50ZXN0aGFzaHM2NF9mbnYxKTsKKyAgc3RkOjpzd2FwKHRlc3RoYXNodTY0X2ZudjEsIG8udGVzdGhhc2h1NjRfZm52MSk7CisgIHN0ZDo6c3dhcCh0ZXN0aGFzaHMzMl9mbnYxYSwgby50ZXN0aGFzaHMzMl9mbnYxYSk7CisgIHN0ZDo6c3dhcCh0ZXN0aGFzaHUzMl9mbnYxYSwgby50ZXN0aGFzaHUzMl9mbnYxYSk7CisgIHN0ZDo6c3dhcCh0ZXN0aGFzaHM2NF9mbnYxYSwgby50ZXN0aGFzaHM2NF9mbnYxYSk7CisgIHN0ZDo6c3dhcCh0ZXN0aGFzaHU2NF9mbnYxYSwgby50ZXN0aGFzaHU2NF9mbnYxYSk7CisgIHN0ZDo6c3dhcCh0ZXN0YXJyYXlvZmJvb2xzLCBvLnRlc3RhcnJheW9mYm9vbHMpOworICBzdGQ6OnN3YXAodGVzdGYsIG8udGVzdGYpOworICBzdGQ6OnN3YXAodGVzdGYyLCBvLnRlc3RmMik7CisgIHN0ZDo6c3dhcCh0ZXN0ZjMsIG8udGVzdGYzKTsKKyAgc3RkOjpzd2FwKHRlc3RhcnJheW9mc3RyaW5nMiwgby50ZXN0YXJyYXlvZnN0cmluZzIpOworICBzdGQ6OnN3YXAodGVzdGFycmF5b2Zzb3J0ZWRzdHJ1Y3QsIG8udGVzdGFycmF5b2Zzb3J0ZWRzdHJ1Y3QpOworICBzdGQ6OnN3YXAoZmxleCwgby5mbGV4KTsKKyAgc3RkOjpzd2FwKHRlc3Q1LCBvLnRlc3Q1KTsKKyAgc3RkOjpzd2FwKHZlY3Rvcl9vZl9sb25ncywgby52ZWN0b3Jfb2ZfbG9uZ3MpOworICBzdGQ6OnN3YXAodmVjdG9yX29mX2RvdWJsZXMsIG8udmVjdG9yX29mX2RvdWJsZXMpOworICBzdGQ6OnN3YXAocGFyZW50X25hbWVzcGFjZV90ZXN0LCBvLnBhcmVudF9uYW1lc3BhY2VfdGVzdCk7CisgIHN0ZDo6c3dhcCh2ZWN0b3Jfb2ZfcmVmZXJyYWJsZXMsIG8udmVjdG9yX29mX3JlZmVycmFibGVzKTsKKyAgc3RkOjpzd2FwKHNpbmdsZV93ZWFrX3JlZmVyZW5jZSwgby5zaW5nbGVfd2Vha19yZWZlcmVuY2UpOworICBzdGQ6OnN3YXAodmVjdG9yX29mX3dlYWtfcmVmZXJlbmNlcywgby52ZWN0b3Jfb2Zfd2Vha19yZWZlcmVuY2VzKTsKKyAgc3RkOjpzd2FwKHZlY3Rvcl9vZl9zdHJvbmdfcmVmZXJyYWJsZXMsIG8udmVjdG9yX29mX3N0cm9uZ19yZWZlcnJhYmxlcyk7CisgIHN0ZDo6c3dhcChjb19vd25pbmdfcmVmZXJlbmNlLCBvLmNvX293bmluZ19yZWZlcmVuY2UpOworICBzdGQ6OnN3YXAodmVjdG9yX29mX2NvX293bmluZ19yZWZlcmVuY2VzLCBvLnZlY3Rvcl9vZl9jb19vd25pbmdfcmVmZXJlbmNlcyk7CisgIHN0ZDo6c3dhcChub25fb3duaW5nX3JlZmVyZW5jZSwgby5ub25fb3duaW5nX3JlZmVyZW5jZSk7CisgIHN0ZDo6c3dhcCh2ZWN0b3Jfb2Zfbm9uX293bmluZ19yZWZlcmVuY2VzLCBvLnZlY3Rvcl9vZl9ub25fb3duaW5nX3JlZmVyZW5jZXMpOworICBzdGQ6OnN3YXAoYW55X3VuaXF1ZSwgby5hbnlfdW5pcXVlKTsKKyAgc3RkOjpzd2FwKGFueV9hbWJpZ3VvdXMsIG8uYW55X2FtYmlndW91cyk7CisgIHN0ZDo6c3dhcCh2ZWN0b3Jfb2ZfZW51bXMsIG8udmVjdG9yX29mX2VudW1zKTsKKyAgc3RkOjpzd2FwKHNpZ25lZF9lbnVtLCBvLnNpZ25lZF9lbnVtKTsKKyAgc3RkOjpzd2FwKHRlc3RyZXF1aXJlZG5lc3RlZGZsYXRidWZmZXIsIG8udGVzdHJlcXVpcmVkbmVzdGVkZmxhdGJ1ZmZlcik7CisgIHN0ZDo6c3dhcChzY2FsYXJfa2V5X3NvcnRlZF90YWJsZXMsIG8uc2NhbGFyX2tleV9zb3J0ZWRfdGFibGVzKTsKKyAgc3RkOjpzd2FwKG5hdGl2ZV9pbmxpbmUsIG8ubmF0aXZlX2lubGluZSk7CisgIHN0ZDo6c3dhcChsb25nX2VudW1fbm9uX2VudW1fZGVmYXVsdCwgby5sb25nX2VudW1fbm9uX2VudW1fZGVmYXVsdCk7CisgIHN0ZDo6c3dhcChsb25nX2VudW1fbm9ybWFsX2RlZmF1bHQsIG8ubG9uZ19lbnVtX25vcm1hbF9kZWZhdWx0KTsKKyAgcmV0dXJuICp0aGlzOworfQorCitpbmxpbmUgTW9uc3RlclQgKk1vbnN0ZXI6OlVuUGFjayhjb25zdCBmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyKSBjb25zdCB7CisgIGF1dG8gX28gPSBzdGQ6OnVuaXF1ZV9wdHI8TW9uc3RlclQ+KG5ldyBNb25zdGVyVCgpKTsKKyAgVW5QYWNrVG8oX28uZ2V0KCksIF9yZXNvbHZlcik7CisgIHJldHVybiBfby5yZWxlYXNlKCk7Cit9CisKK2lubGluZSB2b2lkIE1vbnN0ZXI6OlVuUGFja1RvKE1vbnN0ZXJUICpfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlcikgY29uc3QgeworICAodm9pZClfbzsKKyAgKHZvaWQpX3Jlc29sdmVyOworICB7IGF1dG8gX2UgPSBwb3MoKTsgaWYgKF9lKSBfby0+cG9zID0gZmxhdGJ1ZmZlcnM6OnVuaXF1ZV9wdHI8TXlHYW1lOjpFeGFtcGxlOjpWZWMzPihuZXcgTXlHYW1lOjpFeGFtcGxlOjpWZWMzKCpfZSkpOyB9CisgIHsgYXV0byBfZSA9IG1hbmEoKTsgX28tPm1hbmEgPSBfZTsgfQorICB7IGF1dG8gX2UgPSBocCgpOyBfby0+aHAgPSBfZTsgfQorICB7IGF1dG8gX2UgPSBuYW1lKCk7IGlmIChfZSkgX28tPm5hbWUgPSBfZS0+c3RyKCk7IH0KKyAgeyBhdXRvIF9lID0gaW52ZW50b3J5KCk7IGlmIChfZSkgeyBfby0+aW52ZW50b3J5LnJlc2l6ZShfZS0+c2l6ZSgpKTsgc3RkOjpjb3B5KF9lLT5iZWdpbigpLCBfZS0+ZW5kKCksIF9vLT5pbnZlbnRvcnkuYmVnaW4oKSk7IH0gfQorICB7IGF1dG8gX2UgPSBjb2xvcigpOyBfby0+Y29sb3IgPSBfZTsgfQorICB7IGF1dG8gX2UgPSB0ZXN0X3R5cGUoKTsgX28tPnRlc3QudHlwZSA9IF9lOyB9CisgIHsgYXV0byBfZSA9IHRlc3QoKTsgaWYgKF9lKSBfby0+dGVzdC52YWx1ZSA9IE15R2FtZTo6RXhhbXBsZTo6QW55VW5pb246OlVuUGFjayhfZSwgdGVzdF90eXBlKCksIF9yZXNvbHZlcik7IH0KKyAgeyBhdXRvIF9lID0gdGVzdDQoKTsgaWYgKF9lKSB7IF9vLT50ZXN0NC5yZXNpemUoX2UtPnNpemUoKSk7IGZvciAoZmxhdGJ1ZmZlcnM6OnVvZmZzZXRfdCBfaSA9IDA7IF9pIDwgX2UtPnNpemUoKTsgX2krKykgeyBfby0+dGVzdDRbX2ldID0gKl9lLT5HZXQoX2kpOyB9IH0gZWxzZSB7IF9vLT50ZXN0NC5yZXNpemUoMCk7IH0gfQorICB7IGF1dG8gX2UgPSB0ZXN0YXJyYXlvZnN0cmluZygpOyBpZiAoX2UpIHsgX28tPnRlc3RhcnJheW9mc3RyaW5nLnJlc2l6ZShfZS0+c2l6ZSgpKTsgZm9yIChmbGF0YnVmZmVyczo6dW9mZnNldF90IF9pID0gMDsgX2kgPCBfZS0+c2l6ZSgpOyBfaSsrKSB7IF9vLT50ZXN0YXJyYXlvZnN0cmluZ1tfaV0gPSBfZS0+R2V0KF9pKS0+c3RyKCk7IH0gfSBlbHNlIHsgX28tPnRlc3RhcnJheW9mc3RyaW5nLnJlc2l6ZSgwKTsgfSB9CisgIHsgYXV0byBfZSA9IHRlc3RhcnJheW9mdGFibGVzKCk7IGlmIChfZSkgeyBfby0+dGVzdGFycmF5b2Z0YWJsZXMucmVzaXplKF9lLT5zaXplKCkpOyBmb3IgKGZsYXRidWZmZXJzOjp1b2Zmc2V0X3QgX2kgPSAwOyBfaSA8IF9lLT5zaXplKCk7IF9pKyspIHsgaWYoX28tPnRlc3RhcnJheW9mdGFibGVzW19pXSkgeyBfZS0+R2V0KF9pKS0+VW5QYWNrVG8oX28tPnRlc3RhcnJheW9mdGFibGVzW19pXS5nZXQoKSwgX3Jlc29sdmVyKTsgfSBlbHNlIHsgX28tPnRlc3RhcnJheW9mdGFibGVzW19pXSA9IGZsYXRidWZmZXJzOjp1bmlxdWVfcHRyPE15R2FtZTo6RXhhbXBsZTo6TW9uc3RlclQ+KF9lLT5HZXQoX2kpLT5VblBhY2soX3Jlc29sdmVyKSk7IH07IH0gfSBlbHNlIHsgX28tPnRlc3RhcnJheW9mdGFibGVzLnJlc2l6ZSgwKTsgfSB9CisgIHsgYXV0byBfZSA9IGVuZW15KCk7IGlmIChfZSkgeyBpZihfby0+ZW5lbXkpIHsgX2UtPlVuUGFja1RvKF9vLT5lbmVteS5nZXQoKSwgX3Jlc29sdmVyKTsgfSBlbHNlIHsgX28tPmVuZW15ID0gZmxhdGJ1ZmZlcnM6OnVuaXF1ZV9wdHI8TXlHYW1lOjpFeGFtcGxlOjpNb25zdGVyVD4oX2UtPlVuUGFjayhfcmVzb2x2ZXIpKTsgfSB9IGVsc2UgaWYgKF9vLT5lbmVteSkgeyBfby0+ZW5lbXkucmVzZXQoKTsgfSB9CisgIHsgYXV0byBfZSA9IHRlc3RuZXN0ZWRmbGF0YnVmZmVyKCk7IGlmIChfZSkgeyBfby0+dGVzdG5lc3RlZGZsYXRidWZmZXIucmVzaXplKF9lLT5zaXplKCkpOyBzdGQ6OmNvcHkoX2UtPmJlZ2luKCksIF9lLT5lbmQoKSwgX28tPnRlc3RuZXN0ZWRmbGF0YnVmZmVyLmJlZ2luKCkpOyB9IH0KKyAgeyBhdXRvIF9lID0gdGVzdGVtcHR5KCk7IGlmIChfZSkgeyBpZihfby0+dGVzdGVtcHR5KSB7IF9lLT5VblBhY2tUbyhfby0+dGVzdGVtcHR5LmdldCgpLCBfcmVzb2x2ZXIpOyB9IGVsc2UgeyBfby0+dGVzdGVtcHR5ID0gZmxhdGJ1ZmZlcnM6OnVuaXF1ZV9wdHI8TXlHYW1lOjpFeGFtcGxlOjpTdGF0VD4oX2UtPlVuUGFjayhfcmVzb2x2ZXIpKTsgfSB9IGVsc2UgaWYgKF9vLT50ZXN0ZW1wdHkpIHsgX28tPnRlc3RlbXB0eS5yZXNldCgpOyB9IH0KKyAgeyBhdXRvIF9lID0gdGVzdGJvb2woKTsgX28tPnRlc3Rib29sID0gX2U7IH0KKyAgeyBhdXRvIF9lID0gdGVzdGhhc2hzMzJfZm52MSgpOyBfby0+dGVzdGhhc2hzMzJfZm52MSA9IF9lOyB9CisgIHsgYXV0byBfZSA9IHRlc3RoYXNodTMyX2ZudjEoKTsgX28tPnRlc3RoYXNodTMyX2ZudjEgPSBfZTsgfQorICB7IGF1dG8gX2UgPSB0ZXN0aGFzaHM2NF9mbnYxKCk7IF9vLT50ZXN0aGFzaHM2NF9mbnYxID0gX2U7IH0KKyAgeyBhdXRvIF9lID0gdGVzdGhhc2h1NjRfZm52MSgpOyBfby0+dGVzdGhhc2h1NjRfZm52MSA9IF9lOyB9CisgIHsgYXV0byBfZSA9IHRlc3RoYXNoczMyX2ZudjFhKCk7IF9vLT50ZXN0aGFzaHMzMl9mbnYxYSA9IF9lOyB9CisgIHsgYXV0byBfZSA9IHRlc3RoYXNodTMyX2ZudjFhKCk7IC8qc2NhbGFyIHJlc29sdmVyLCBuYWtlZCovIGlmIChfcmVzb2x2ZXIpICgqX3Jlc29sdmVyKShyZWludGVycHJldF9jYXN0PHZvaWQgKio+KCZfby0+dGVzdGhhc2h1MzJfZm52MWEpLCBzdGF0aWNfY2FzdDxmbGF0YnVmZmVyczo6aGFzaF92YWx1ZV90PihfZSkpOyBlbHNlIF9vLT50ZXN0aGFzaHUzMl9mbnYxYSA9IG51bGxwdHI7IH0KKyAgeyBhdXRvIF9lID0gdGVzdGhhc2hzNjRfZm52MWEoKTsgX28tPnRlc3RoYXNoczY0X2ZudjFhID0gX2U7IH0KKyAgeyBhdXRvIF9lID0gdGVzdGhhc2h1NjRfZm52MWEoKTsgX28tPnRlc3RoYXNodTY0X2ZudjFhID0gX2U7IH0KKyAgeyBhdXRvIF9lID0gdGVzdGFycmF5b2Zib29scygpOyBpZiAoX2UpIHsgX28tPnRlc3RhcnJheW9mYm9vbHMucmVzaXplKF9lLT5zaXplKCkpOyBmb3IgKGZsYXRidWZmZXJzOjp1b2Zmc2V0X3QgX2kgPSAwOyBfaSA8IF9lLT5zaXplKCk7IF9pKyspIHsgX28tPnRlc3RhcnJheW9mYm9vbHNbX2ldID0gX2UtPkdldChfaSkgIT0gMDsgfSB9IGVsc2UgeyBfby0+dGVzdGFycmF5b2Zib29scy5yZXNpemUoMCk7IH0gfQorICB7IGF1dG8gX2UgPSB0ZXN0ZigpOyBfby0+dGVzdGYgPSBfZTsgfQorICB7IGF1dG8gX2UgPSB0ZXN0ZjIoKTsgX28tPnRlc3RmMiA9IF9lOyB9CisgIHsgYXV0byBfZSA9IHRlc3RmMygpOyBfby0+dGVzdGYzID0gX2U7IH0KKyAgeyBhdXRvIF9lID0gdGVzdGFycmF5b2ZzdHJpbmcyKCk7IGlmIChfZSkgeyBfby0+dGVzdGFycmF5b2ZzdHJpbmcyLnJlc2l6ZShfZS0+c2l6ZSgpKTsgZm9yIChmbGF0YnVmZmVyczo6dW9mZnNldF90IF9pID0gMDsgX2kgPCBfZS0+c2l6ZSgpOyBfaSsrKSB7IF9vLT50ZXN0YXJyYXlvZnN0cmluZzJbX2ldID0gX2UtPkdldChfaSktPnN0cigpOyB9IH0gZWxzZSB7IF9vLT50ZXN0YXJyYXlvZnN0cmluZzIucmVzaXplKDApOyB9IH0KKyAgeyBhdXRvIF9lID0gdGVzdGFycmF5b2Zzb3J0ZWRzdHJ1Y3QoKTsgaWYgKF9lKSB7IF9vLT50ZXN0YXJyYXlvZnNvcnRlZHN0cnVjdC5yZXNpemUoX2UtPnNpemUoKSk7IGZvciAoZmxhdGJ1ZmZlcnM6OnVvZmZzZXRfdCBfaSA9IDA7IF9pIDwgX2UtPnNpemUoKTsgX2krKykgeyBfby0+dGVzdGFycmF5b2Zzb3J0ZWRzdHJ1Y3RbX2ldID0gKl9lLT5HZXQoX2kpOyB9IH0gZWxzZSB7IF9vLT50ZXN0YXJyYXlvZnNvcnRlZHN0cnVjdC5yZXNpemUoMCk7IH0gfQorICB7IGF1dG8gX2UgPSBmbGV4KCk7IGlmIChfZSkgeyBfby0+ZmxleC5yZXNpemUoX2UtPnNpemUoKSk7IHN0ZDo6Y29weShfZS0+YmVnaW4oKSwgX2UtPmVuZCgpLCBfby0+ZmxleC5iZWdpbigpKTsgfSB9CisgIHsgYXV0byBfZSA9IHRlc3Q1KCk7IGlmIChfZSkgeyBfby0+dGVzdDUucmVzaXplKF9lLT5zaXplKCkpOyBmb3IgKGZsYXRidWZmZXJzOjp1b2Zmc2V0X3QgX2kgPSAwOyBfaSA8IF9lLT5zaXplKCk7IF9pKyspIHsgX28tPnRlc3Q1W19pXSA9ICpfZS0+R2V0KF9pKTsgfSB9IGVsc2UgeyBfby0+dGVzdDUucmVzaXplKDApOyB9IH0KKyAgeyBhdXRvIF9lID0gdmVjdG9yX29mX2xvbmdzKCk7IGlmIChfZSkgeyBfby0+dmVjdG9yX29mX2xvbmdzLnJlc2l6ZShfZS0+c2l6ZSgpKTsgZm9yIChmbGF0YnVmZmVyczo6dW9mZnNldF90IF9pID0gMDsgX2kgPCBfZS0+c2l6ZSgpOyBfaSsrKSB7IF9vLT52ZWN0b3Jfb2ZfbG9uZ3NbX2ldID0gX2UtPkdldChfaSk7IH0gfSBlbHNlIHsgX28tPnZlY3Rvcl9vZl9sb25ncy5yZXNpemUoMCk7IH0gfQorICB7IGF1dG8gX2UgPSB2ZWN0b3Jfb2ZfZG91YmxlcygpOyBpZiAoX2UpIHsgX28tPnZlY3Rvcl9vZl9kb3VibGVzLnJlc2l6ZShfZS0+c2l6ZSgpKTsgZm9yIChmbGF0YnVmZmVyczo6dW9mZnNldF90IF9pID0gMDsgX2kgPCBfZS0+c2l6ZSgpOyBfaSsrKSB7IF9vLT52ZWN0b3Jfb2ZfZG91Ymxlc1tfaV0gPSBfZS0+R2V0KF9pKTsgfSB9IGVsc2UgeyBfby0+dmVjdG9yX29mX2RvdWJsZXMucmVzaXplKDApOyB9IH0KKyAgeyBhdXRvIF9lID0gcGFyZW50X25hbWVzcGFjZV90ZXN0KCk7IGlmIChfZSkgeyBpZihfby0+cGFyZW50X25hbWVzcGFjZV90ZXN0KSB7IF9lLT5VblBhY2tUbyhfby0+cGFyZW50X25hbWVzcGFjZV90ZXN0LmdldCgpLCBfcmVzb2x2ZXIpOyB9IGVsc2UgeyBfby0+cGFyZW50X25hbWVzcGFjZV90ZXN0ID0gZmxhdGJ1ZmZlcnM6OnVuaXF1ZV9wdHI8TXlHYW1lOjpJblBhcmVudE5hbWVzcGFjZVQ+KF9lLT5VblBhY2soX3Jlc29sdmVyKSk7IH0gfSBlbHNlIGlmIChfby0+cGFyZW50X25hbWVzcGFjZV90ZXN0KSB7IF9vLT5wYXJlbnRfbmFtZXNwYWNlX3Rlc3QucmVzZXQoKTsgfSB9CisgIHsgYXV0byBfZSA9IHZlY3Rvcl9vZl9yZWZlcnJhYmxlcygpOyBpZiAoX2UpIHsgX28tPnZlY3Rvcl9vZl9yZWZlcnJhYmxlcy5yZXNpemUoX2UtPnNpemUoKSk7IGZvciAoZmxhdGJ1ZmZlcnM6OnVvZmZzZXRfdCBfaSA9IDA7IF9pIDwgX2UtPnNpemUoKTsgX2krKykgeyBpZihfby0+dmVjdG9yX29mX3JlZmVycmFibGVzW19pXSkgeyBfZS0+R2V0KF9pKS0+VW5QYWNrVG8oX28tPnZlY3Rvcl9vZl9yZWZlcnJhYmxlc1tfaV0uZ2V0KCksIF9yZXNvbHZlcik7IH0gZWxzZSB7IF9vLT52ZWN0b3Jfb2ZfcmVmZXJyYWJsZXNbX2ldID0gZmxhdGJ1ZmZlcnM6OnVuaXF1ZV9wdHI8TXlHYW1lOjpFeGFtcGxlOjpSZWZlcnJhYmxlVD4oX2UtPkdldChfaSktPlVuUGFjayhfcmVzb2x2ZXIpKTsgfTsgfSB9IGVsc2UgeyBfby0+dmVjdG9yX29mX3JlZmVycmFibGVzLnJlc2l6ZSgwKTsgfSB9CisgIHsgYXV0byBfZSA9IHNpbmdsZV93ZWFrX3JlZmVyZW5jZSgpOyAvKnNjYWxhciByZXNvbHZlciwgbmFrZWQqLyBpZiAoX3Jlc29sdmVyKSAoKl9yZXNvbHZlcikocmVpbnRlcnByZXRfY2FzdDx2b2lkICoqPigmX28tPnNpbmdsZV93ZWFrX3JlZmVyZW5jZSksIHN0YXRpY19jYXN0PGZsYXRidWZmZXJzOjpoYXNoX3ZhbHVlX3Q+KF9lKSk7IGVsc2UgX28tPnNpbmdsZV93ZWFrX3JlZmVyZW5jZSA9IG51bGxwdHI7IH0KKyAgeyBhdXRvIF9lID0gdmVjdG9yX29mX3dlYWtfcmVmZXJlbmNlcygpOyBpZiAoX2UpIHsgX28tPnZlY3Rvcl9vZl93ZWFrX3JlZmVyZW5jZXMucmVzaXplKF9lLT5zaXplKCkpOyBmb3IgKGZsYXRidWZmZXJzOjp1b2Zmc2V0X3QgX2kgPSAwOyBfaSA8IF9lLT5zaXplKCk7IF9pKyspIHsgLyp2ZWN0b3IgcmVzb2x2ZXIsIG5ha2VkKi8gaWYgKF9yZXNvbHZlcikgKCpfcmVzb2x2ZXIpKHJlaW50ZXJwcmV0X2Nhc3Q8dm9pZCAqKj4oJl9vLT52ZWN0b3Jfb2Zfd2Vha19yZWZlcmVuY2VzW19pXSksIHN0YXRpY19jYXN0PGZsYXRidWZmZXJzOjpoYXNoX3ZhbHVlX3Q+KF9lLT5HZXQoX2kpKSk7IGVsc2UgX28tPnZlY3Rvcl9vZl93ZWFrX3JlZmVyZW5jZXNbX2ldID0gbnVsbHB0cjsgfSB9IGVsc2UgeyBfby0+dmVjdG9yX29mX3dlYWtfcmVmZXJlbmNlcy5yZXNpemUoMCk7IH0gfQorICB7IGF1dG8gX2UgPSB2ZWN0b3Jfb2Zfc3Ryb25nX3JlZmVycmFibGVzKCk7IGlmIChfZSkgeyBfby0+dmVjdG9yX29mX3N0cm9uZ19yZWZlcnJhYmxlcy5yZXNpemUoX2UtPnNpemUoKSk7IGZvciAoZmxhdGJ1ZmZlcnM6OnVvZmZzZXRfdCBfaSA9IDA7IF9pIDwgX2UtPnNpemUoKTsgX2krKykgeyBpZihfby0+dmVjdG9yX29mX3N0cm9uZ19yZWZlcnJhYmxlc1tfaV0pIHsgX2UtPkdldChfaSktPlVuUGFja1RvKF9vLT52ZWN0b3Jfb2Zfc3Ryb25nX3JlZmVycmFibGVzW19pXS5nZXQoKSwgX3Jlc29sdmVyKTsgfSBlbHNlIHsgX28tPnZlY3Rvcl9vZl9zdHJvbmdfcmVmZXJyYWJsZXNbX2ldID0gZmxhdGJ1ZmZlcnM6OnVuaXF1ZV9wdHI8TXlHYW1lOjpFeGFtcGxlOjpSZWZlcnJhYmxlVD4oX2UtPkdldChfaSktPlVuUGFjayhfcmVzb2x2ZXIpKTsgfTsgfSB9IGVsc2UgeyBfby0+dmVjdG9yX29mX3N0cm9uZ19yZWZlcnJhYmxlcy5yZXNpemUoMCk7IH0gfQorICB7IGF1dG8gX2UgPSBjb19vd25pbmdfcmVmZXJlbmNlKCk7IC8qc2NhbGFyIHJlc29sdmVyLCBuYWtlZCovIGlmIChfcmVzb2x2ZXIpICgqX3Jlc29sdmVyKShyZWludGVycHJldF9jYXN0PHZvaWQgKio+KCZfby0+Y29fb3duaW5nX3JlZmVyZW5jZSksIHN0YXRpY19jYXN0PGZsYXRidWZmZXJzOjpoYXNoX3ZhbHVlX3Q+KF9lKSk7IGVsc2UgX28tPmNvX293bmluZ19yZWZlcmVuY2UgPSBudWxscHRyOyB9CisgIHsgYXV0byBfZSA9IHZlY3Rvcl9vZl9jb19vd25pbmdfcmVmZXJlbmNlcygpOyBpZiAoX2UpIHsgX28tPnZlY3Rvcl9vZl9jb19vd25pbmdfcmVmZXJlbmNlcy5yZXNpemUoX2UtPnNpemUoKSk7IGZvciAoZmxhdGJ1ZmZlcnM6OnVvZmZzZXRfdCBfaSA9IDA7IF9pIDwgX2UtPnNpemUoKTsgX2krKykgeyAvKnZlY3RvciByZXNvbHZlciwgZGVmYXVsdF9wdHJfdHlwZSovIGlmIChfcmVzb2x2ZXIpICgqX3Jlc29sdmVyKShyZWludGVycHJldF9jYXN0PHZvaWQgKio+KCZfby0+dmVjdG9yX29mX2NvX293bmluZ19yZWZlcmVuY2VzW19pXSksIHN0YXRpY19jYXN0PGZsYXRidWZmZXJzOjpoYXNoX3ZhbHVlX3Q+KF9lLT5HZXQoX2kpKSk7LyogZWxzZSBkbyBub3RoaW5nICovOyB9IH0gZWxzZSB7IF9vLT52ZWN0b3Jfb2ZfY29fb3duaW5nX3JlZmVyZW5jZXMucmVzaXplKDApOyB9IH0KKyAgeyBhdXRvIF9lID0gbm9uX293bmluZ19yZWZlcmVuY2UoKTsgLypzY2FsYXIgcmVzb2x2ZXIsIG5ha2VkKi8gaWYgKF9yZXNvbHZlcikgKCpfcmVzb2x2ZXIpKHJlaW50ZXJwcmV0X2Nhc3Q8dm9pZCAqKj4oJl9vLT5ub25fb3duaW5nX3JlZmVyZW5jZSksIHN0YXRpY19jYXN0PGZsYXRidWZmZXJzOjpoYXNoX3ZhbHVlX3Q+KF9lKSk7IGVsc2UgX28tPm5vbl9vd25pbmdfcmVmZXJlbmNlID0gbnVsbHB0cjsgfQorICB7IGF1dG8gX2UgPSB2ZWN0b3Jfb2Zfbm9uX293bmluZ19yZWZlcmVuY2VzKCk7IGlmIChfZSkgeyBfby0+dmVjdG9yX29mX25vbl9vd25pbmdfcmVmZXJlbmNlcy5yZXNpemUoX2UtPnNpemUoKSk7IGZvciAoZmxhdGJ1ZmZlcnM6OnVvZmZzZXRfdCBfaSA9IDA7IF9pIDwgX2UtPnNpemUoKTsgX2krKykgeyAvKnZlY3RvciByZXNvbHZlciwgbmFrZWQqLyBpZiAoX3Jlc29sdmVyKSAoKl9yZXNvbHZlcikocmVpbnRlcnByZXRfY2FzdDx2b2lkICoqPigmX28tPnZlY3Rvcl9vZl9ub25fb3duaW5nX3JlZmVyZW5jZXNbX2ldKSwgc3RhdGljX2Nhc3Q8ZmxhdGJ1ZmZlcnM6Omhhc2hfdmFsdWVfdD4oX2UtPkdldChfaSkpKTsgZWxzZSBfby0+dmVjdG9yX29mX25vbl9vd25pbmdfcmVmZXJlbmNlc1tfaV0gPSBudWxscHRyOyB9IH0gZWxzZSB7IF9vLT52ZWN0b3Jfb2Zfbm9uX293bmluZ19yZWZlcmVuY2VzLnJlc2l6ZSgwKTsgfSB9CisgIHsgYXV0byBfZSA9IGFueV91bmlxdWVfdHlwZSgpOyBfby0+YW55X3VuaXF1ZS50eXBlID0gX2U7IH0KKyAgeyBhdXRvIF9lID0gYW55X3VuaXF1ZSgpOyBpZiAoX2UpIF9vLT5hbnlfdW5pcXVlLnZhbHVlID0gTXlHYW1lOjpFeGFtcGxlOjpBbnlVbmlxdWVBbGlhc2VzVW5pb246OlVuUGFjayhfZSwgYW55X3VuaXF1ZV90eXBlKCksIF9yZXNvbHZlcik7IH0KKyAgeyBhdXRvIF9lID0gYW55X2FtYmlndW91c190eXBlKCk7IF9vLT5hbnlfYW1iaWd1b3VzLnR5cGUgPSBfZTsgfQorICB7IGF1dG8gX2UgPSBhbnlfYW1iaWd1b3VzKCk7IGlmIChfZSkgX28tPmFueV9hbWJpZ3VvdXMudmFsdWUgPSBNeUdhbWU6OkV4YW1wbGU6OkFueUFtYmlndW91c0FsaWFzZXNVbmlvbjo6VW5QYWNrKF9lLCBhbnlfYW1iaWd1b3VzX3R5cGUoKSwgX3Jlc29sdmVyKTsgfQorICB7IGF1dG8gX2UgPSB2ZWN0b3Jfb2ZfZW51bXMoKTsgaWYgKF9lKSB7IF9vLT52ZWN0b3Jfb2ZfZW51bXMucmVzaXplKF9lLT5zaXplKCkpOyBmb3IgKGZsYXRidWZmZXJzOjp1b2Zmc2V0X3QgX2kgPSAwOyBfaSA8IF9lLT5zaXplKCk7IF9pKyspIHsgX28tPnZlY3Rvcl9vZl9lbnVtc1tfaV0gPSBzdGF0aWNfY2FzdDxNeUdhbWU6OkV4YW1wbGU6OkNvbG9yPihfZS0+R2V0KF9pKSk7IH0gfSBlbHNlIHsgX28tPnZlY3Rvcl9vZl9lbnVtcy5yZXNpemUoMCk7IH0gfQorICB7IGF1dG8gX2UgPSBzaWduZWRfZW51bSgpOyBfby0+c2lnbmVkX2VudW0gPSBfZTsgfQorICB7IGF1dG8gX2UgPSB0ZXN0cmVxdWlyZWRuZXN0ZWRmbGF0YnVmZmVyKCk7IGlmIChfZSkgeyBfby0+dGVzdHJlcXVpcmVkbmVzdGVkZmxhdGJ1ZmZlci5yZXNpemUoX2UtPnNpemUoKSk7IHN0ZDo6Y29weShfZS0+YmVnaW4oKSwgX2UtPmVuZCgpLCBfby0+dGVzdHJlcXVpcmVkbmVzdGVkZmxhdGJ1ZmZlci5iZWdpbigpKTsgfSB9CisgIHsgYXV0byBfZSA9IHNjYWxhcl9rZXlfc29ydGVkX3RhYmxlcygpOyBpZiAoX2UpIHsgX28tPnNjYWxhcl9rZXlfc29ydGVkX3RhYmxlcy5yZXNpemUoX2UtPnNpemUoKSk7IGZvciAoZmxhdGJ1ZmZlcnM6OnVvZmZzZXRfdCBfaSA9IDA7IF9pIDwgX2UtPnNpemUoKTsgX2krKykgeyBpZihfby0+c2NhbGFyX2tleV9zb3J0ZWRfdGFibGVzW19pXSkgeyBfZS0+R2V0KF9pKS0+VW5QYWNrVG8oX28tPnNjYWxhcl9rZXlfc29ydGVkX3RhYmxlc1tfaV0uZ2V0KCksIF9yZXNvbHZlcik7IH0gZWxzZSB7IF9vLT5zY2FsYXJfa2V5X3NvcnRlZF90YWJsZXNbX2ldID0gZmxhdGJ1ZmZlcnM6OnVuaXF1ZV9wdHI8TXlHYW1lOjpFeGFtcGxlOjpTdGF0VD4oX2UtPkdldChfaSktPlVuUGFjayhfcmVzb2x2ZXIpKTsgfTsgfSB9IGVsc2UgeyBfby0+c2NhbGFyX2tleV9zb3J0ZWRfdGFibGVzLnJlc2l6ZSgwKTsgfSB9CisgIHsgYXV0byBfZSA9IG5hdGl2ZV9pbmxpbmUoKTsgaWYgKF9lKSBfby0+bmF0aXZlX2lubGluZSA9ICpfZTsgfQorICB7IGF1dG8gX2UgPSBsb25nX2VudW1fbm9uX2VudW1fZGVmYXVsdCgpOyBfby0+bG9uZ19lbnVtX25vbl9lbnVtX2RlZmF1bHQgPSBfZTsgfQorICB7IGF1dG8gX2UgPSBsb25nX2VudW1fbm9ybWFsX2RlZmF1bHQoKTsgX28tPmxvbmdfZW51bV9ub3JtYWxfZGVmYXVsdCA9IF9lOyB9Cit9CisKK2lubGluZSBmbGF0YnVmZmVyczo6T2Zmc2V0PE1vbnN0ZXI+IE1vbnN0ZXI6OlBhY2soZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBNb25zdGVyVCogX28sIGNvbnN0IGZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIpIHsKKyAgcmV0dXJuIENyZWF0ZU1vbnN0ZXIoX2ZiYiwgX28sIF9yZWhhc2hlcik7Cit9CisKK2lubGluZSBmbGF0YnVmZmVyczo6T2Zmc2V0PE1vbnN0ZXI+IENyZWF0ZU1vbnN0ZXIoZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBNb25zdGVyVCAqX28sIGNvbnN0IGZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIpIHsKKyAgKHZvaWQpX3JlaGFzaGVyOworICAodm9pZClfbzsKKyAgc3RydWN0IF9WZWN0b3JBcmdzIHsgZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICpfX2ZiYjsgY29uc3QgTW9uc3RlclQqIF9fbzsgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9fcmVoYXNoZXI7IH0gX3ZhID0geyAmX2ZiYiwgX28sIF9yZWhhc2hlcn07ICh2b2lkKV92YTsKKyAgYXV0byBfcG9zID0gX28tPnBvcyA/IF9vLT5wb3MuZ2V0KCkgOiBudWxscHRyOworICBhdXRvIF9tYW5hID0gX28tPm1hbmE7CisgIGF1dG8gX2hwID0gX28tPmhwOworICBhdXRvIF9uYW1lID0gX2ZiYi5DcmVhdGVTdHJpbmcoX28tPm5hbWUpOworICBhdXRvIF9pbnZlbnRvcnkgPSBfby0+aW52ZW50b3J5LnNpemUoKSA/IF9mYmIuQ3JlYXRlVmVjdG9yKF9vLT5pbnZlbnRvcnkpIDogMDsKKyAgYXV0byBfY29sb3IgPSBfby0+Y29sb3I7CisgIGF1dG8gX3Rlc3RfdHlwZSA9IF9vLT50ZXN0LnR5cGU7CisgIGF1dG8gX3Rlc3QgPSBfby0+dGVzdC5QYWNrKF9mYmIpOworICBhdXRvIF90ZXN0NCA9IF9vLT50ZXN0NC5zaXplKCkgPyBfZmJiLkNyZWF0ZVZlY3Rvck9mU3RydWN0cyhfby0+dGVzdDQpIDogMDsKKyAgYXV0byBfdGVzdGFycmF5b2ZzdHJpbmcgPSBfby0+dGVzdGFycmF5b2ZzdHJpbmcuc2l6ZSgpID8gX2ZiYi5DcmVhdGVWZWN0b3JPZlN0cmluZ3MoX28tPnRlc3RhcnJheW9mc3RyaW5nKSA6IDA7CisgIGF1dG8gX3Rlc3RhcnJheW9mdGFibGVzID0gX28tPnRlc3RhcnJheW9mdGFibGVzLnNpemUoKSA/IF9mYmIuQ3JlYXRlVmVjdG9yPGZsYXRidWZmZXJzOjpPZmZzZXQ8TXlHYW1lOjpFeGFtcGxlOjpNb25zdGVyPj4gKF9vLT50ZXN0YXJyYXlvZnRhYmxlcy5zaXplKCksIFtdKHNpemVfdCBpLCBfVmVjdG9yQXJncyAqX192YSkgeyByZXR1cm4gQ3JlYXRlTW9uc3RlcigqX192YS0+X19mYmIsIF9fdmEtPl9fby0+dGVzdGFycmF5b2Z0YWJsZXNbaV0uZ2V0KCksIF9fdmEtPl9fcmVoYXNoZXIpOyB9LCAmX3ZhICkgOiAwOworICBhdXRvIF9lbmVteSA9IF9vLT5lbmVteSA/IENyZWF0ZU1vbnN0ZXIoX2ZiYiwgX28tPmVuZW15LmdldCgpLCBfcmVoYXNoZXIpIDogMDsKKyAgYXV0byBfdGVzdG5lc3RlZGZsYXRidWZmZXIgPSBfby0+dGVzdG5lc3RlZGZsYXRidWZmZXIuc2l6ZSgpID8gX2ZiYi5DcmVhdGVWZWN0b3IoX28tPnRlc3RuZXN0ZWRmbGF0YnVmZmVyKSA6IDA7CisgIGF1dG8gX3Rlc3RlbXB0eSA9IF9vLT50ZXN0ZW1wdHkgPyBDcmVhdGVTdGF0KF9mYmIsIF9vLT50ZXN0ZW1wdHkuZ2V0KCksIF9yZWhhc2hlcikgOiAwOworICBhdXRvIF90ZXN0Ym9vbCA9IF9vLT50ZXN0Ym9vbDsKKyAgYXV0byBfdGVzdGhhc2hzMzJfZm52MSA9IF9vLT50ZXN0aGFzaHMzMl9mbnYxOworICBhdXRvIF90ZXN0aGFzaHUzMl9mbnYxID0gX28tPnRlc3RoYXNodTMyX2ZudjE7CisgIGF1dG8gX3Rlc3RoYXNoczY0X2ZudjEgPSBfby0+dGVzdGhhc2hzNjRfZm52MTsKKyAgYXV0byBfdGVzdGhhc2h1NjRfZm52MSA9IF9vLT50ZXN0aGFzaHU2NF9mbnYxOworICBhdXRvIF90ZXN0aGFzaHMzMl9mbnYxYSA9IF9vLT50ZXN0aGFzaHMzMl9mbnYxYTsKKyAgYXV0byBfdGVzdGhhc2h1MzJfZm52MWEgPSBfcmVoYXNoZXIgPyBzdGF0aWNfY2FzdDx1aW50MzJfdD4oKCpfcmVoYXNoZXIpKF9vLT50ZXN0aGFzaHUzMl9mbnYxYSkpIDogMDsKKyAgYXV0byBfdGVzdGhhc2hzNjRfZm52MWEgPSBfby0+dGVzdGhhc2hzNjRfZm52MWE7CisgIGF1dG8gX3Rlc3RoYXNodTY0X2ZudjFhID0gX28tPnRlc3RoYXNodTY0X2ZudjFhOworICBhdXRvIF90ZXN0YXJyYXlvZmJvb2xzID0gX28tPnRlc3RhcnJheW9mYm9vbHMuc2l6ZSgpID8gX2ZiYi5DcmVhdGVWZWN0b3IoX28tPnRlc3RhcnJheW9mYm9vbHMpIDogMDsKKyAgYXV0byBfdGVzdGYgPSBfby0+dGVzdGY7CisgIGF1dG8gX3Rlc3RmMiA9IF9vLT50ZXN0ZjI7CisgIGF1dG8gX3Rlc3RmMyA9IF9vLT50ZXN0ZjM7CisgIGF1dG8gX3Rlc3RhcnJheW9mc3RyaW5nMiA9IF9vLT50ZXN0YXJyYXlvZnN0cmluZzIuc2l6ZSgpID8gX2ZiYi5DcmVhdGVWZWN0b3JPZlN0cmluZ3MoX28tPnRlc3RhcnJheW9mc3RyaW5nMikgOiAwOworICBhdXRvIF90ZXN0YXJyYXlvZnNvcnRlZHN0cnVjdCA9IF9vLT50ZXN0YXJyYXlvZnNvcnRlZHN0cnVjdC5zaXplKCkgPyBfZmJiLkNyZWF0ZVZlY3Rvck9mU3RydWN0cyhfby0+dGVzdGFycmF5b2Zzb3J0ZWRzdHJ1Y3QpIDogMDsKKyAgYXV0byBfZmxleCA9IF9vLT5mbGV4LnNpemUoKSA/IF9mYmIuQ3JlYXRlVmVjdG9yKF9vLT5mbGV4KSA6IDA7CisgIGF1dG8gX3Rlc3Q1ID0gX28tPnRlc3Q1LnNpemUoKSA/IF9mYmIuQ3JlYXRlVmVjdG9yT2ZTdHJ1Y3RzKF9vLT50ZXN0NSkgOiAwOworICBhdXRvIF92ZWN0b3Jfb2ZfbG9uZ3MgPSBfby0+dmVjdG9yX29mX2xvbmdzLnNpemUoKSA/IF9mYmIuQ3JlYXRlVmVjdG9yKF9vLT52ZWN0b3Jfb2ZfbG9uZ3MpIDogMDsKKyAgYXV0byBfdmVjdG9yX29mX2RvdWJsZXMgPSBfby0+dmVjdG9yX29mX2RvdWJsZXMuc2l6ZSgpID8gX2ZiYi5DcmVhdGVWZWN0b3IoX28tPnZlY3Rvcl9vZl9kb3VibGVzKSA6IDA7CisgIGF1dG8gX3BhcmVudF9uYW1lc3BhY2VfdGVzdCA9IF9vLT5wYXJlbnRfbmFtZXNwYWNlX3Rlc3QgPyBDcmVhdGVJblBhcmVudE5hbWVzcGFjZShfZmJiLCBfby0+cGFyZW50X25hbWVzcGFjZV90ZXN0LmdldCgpLCBfcmVoYXNoZXIpIDogMDsKKyAgYXV0byBfdmVjdG9yX29mX3JlZmVycmFibGVzID0gX28tPnZlY3Rvcl9vZl9yZWZlcnJhYmxlcy5zaXplKCkgPyBfZmJiLkNyZWF0ZVZlY3RvcjxmbGF0YnVmZmVyczo6T2Zmc2V0PE15R2FtZTo6RXhhbXBsZTo6UmVmZXJyYWJsZT4+IChfby0+dmVjdG9yX29mX3JlZmVycmFibGVzLnNpemUoKSwgW10oc2l6ZV90IGksIF9WZWN0b3JBcmdzICpfX3ZhKSB7IHJldHVybiBDcmVhdGVSZWZlcnJhYmxlKCpfX3ZhLT5fX2ZiYiwgX192YS0+X19vLT52ZWN0b3Jfb2ZfcmVmZXJyYWJsZXNbaV0uZ2V0KCksIF9fdmEtPl9fcmVoYXNoZXIpOyB9LCAmX3ZhICkgOiAwOworICBhdXRvIF9zaW5nbGVfd2Vha19yZWZlcmVuY2UgPSBfcmVoYXNoZXIgPyBzdGF0aWNfY2FzdDx1aW50NjRfdD4oKCpfcmVoYXNoZXIpKF9vLT5zaW5nbGVfd2Vha19yZWZlcmVuY2UpKSA6IDA7CisgIGF1dG8gX3ZlY3Rvcl9vZl93ZWFrX3JlZmVyZW5jZXMgPSBfby0+dmVjdG9yX29mX3dlYWtfcmVmZXJlbmNlcy5zaXplKCkgPyBfZmJiLkNyZWF0ZVZlY3Rvcjx1aW50NjRfdD4oX28tPnZlY3Rvcl9vZl93ZWFrX3JlZmVyZW5jZXMuc2l6ZSgpLCBbXShzaXplX3QgaSwgX1ZlY3RvckFyZ3MgKl9fdmEpIHsgcmV0dXJuIF9fdmEtPl9fcmVoYXNoZXIgPyBzdGF0aWNfY2FzdDx1aW50NjRfdD4oKCpfX3ZhLT5fX3JlaGFzaGVyKShfX3ZhLT5fX28tPnZlY3Rvcl9vZl93ZWFrX3JlZmVyZW5jZXNbaV0pKSA6IDA7IH0sICZfdmEgKSA6IDA7CisgIGF1dG8gX3ZlY3Rvcl9vZl9zdHJvbmdfcmVmZXJyYWJsZXMgPSBfby0+dmVjdG9yX29mX3N0cm9uZ19yZWZlcnJhYmxlcy5zaXplKCkgPyBfZmJiLkNyZWF0ZVZlY3RvcjxmbGF0YnVmZmVyczo6T2Zmc2V0PE15R2FtZTo6RXhhbXBsZTo6UmVmZXJyYWJsZT4+IChfby0+dmVjdG9yX29mX3N0cm9uZ19yZWZlcnJhYmxlcy5zaXplKCksIFtdKHNpemVfdCBpLCBfVmVjdG9yQXJncyAqX192YSkgeyByZXR1cm4gQ3JlYXRlUmVmZXJyYWJsZSgqX192YS0+X19mYmIsIF9fdmEtPl9fby0+dmVjdG9yX29mX3N0cm9uZ19yZWZlcnJhYmxlc1tpXS5nZXQoKSwgX192YS0+X19yZWhhc2hlcik7IH0sICZfdmEgKSA6IDA7CisgIGF1dG8gX2NvX293bmluZ19yZWZlcmVuY2UgPSBfcmVoYXNoZXIgPyBzdGF0aWNfY2FzdDx1aW50NjRfdD4oKCpfcmVoYXNoZXIpKF9vLT5jb19vd25pbmdfcmVmZXJlbmNlKSkgOiAwOworICBhdXRvIF92ZWN0b3Jfb2ZfY29fb3duaW5nX3JlZmVyZW5jZXMgPSBfby0+dmVjdG9yX29mX2NvX293bmluZ19yZWZlcmVuY2VzLnNpemUoKSA/IF9mYmIuQ3JlYXRlVmVjdG9yPHVpbnQ2NF90Pihfby0+dmVjdG9yX29mX2NvX293bmluZ19yZWZlcmVuY2VzLnNpemUoKSwgW10oc2l6ZV90IGksIF9WZWN0b3JBcmdzICpfX3ZhKSB7IHJldHVybiBfX3ZhLT5fX3JlaGFzaGVyID8gc3RhdGljX2Nhc3Q8dWludDY0X3Q+KCgqX192YS0+X19yZWhhc2hlcikoX192YS0+X19vLT52ZWN0b3Jfb2ZfY29fb3duaW5nX3JlZmVyZW5jZXNbaV0uZ2V0KCkpKSA6IDA7IH0sICZfdmEgKSA6IDA7CisgIGF1dG8gX25vbl9vd25pbmdfcmVmZXJlbmNlID0gX3JlaGFzaGVyID8gc3RhdGljX2Nhc3Q8dWludDY0X3Q+KCgqX3JlaGFzaGVyKShfby0+bm9uX293bmluZ19yZWZlcmVuY2UpKSA6IDA7CisgIGF1dG8gX3ZlY3Rvcl9vZl9ub25fb3duaW5nX3JlZmVyZW5jZXMgPSBfby0+dmVjdG9yX29mX25vbl9vd25pbmdfcmVmZXJlbmNlcy5zaXplKCkgPyBfZmJiLkNyZWF0ZVZlY3Rvcjx1aW50NjRfdD4oX28tPnZlY3Rvcl9vZl9ub25fb3duaW5nX3JlZmVyZW5jZXMuc2l6ZSgpLCBbXShzaXplX3QgaSwgX1ZlY3RvckFyZ3MgKl9fdmEpIHsgcmV0dXJuIF9fdmEtPl9fcmVoYXNoZXIgPyBzdGF0aWNfY2FzdDx1aW50NjRfdD4oKCpfX3ZhLT5fX3JlaGFzaGVyKShfX3ZhLT5fX28tPnZlY3Rvcl9vZl9ub25fb3duaW5nX3JlZmVyZW5jZXNbaV0pKSA6IDA7IH0sICZfdmEgKSA6IDA7CisgIGF1dG8gX2FueV91bmlxdWVfdHlwZSA9IF9vLT5hbnlfdW5pcXVlLnR5cGU7CisgIGF1dG8gX2FueV91bmlxdWUgPSBfby0+YW55X3VuaXF1ZS5QYWNrKF9mYmIpOworICBhdXRvIF9hbnlfYW1iaWd1b3VzX3R5cGUgPSBfby0+YW55X2FtYmlndW91cy50eXBlOworICBhdXRvIF9hbnlfYW1iaWd1b3VzID0gX28tPmFueV9hbWJpZ3VvdXMuUGFjayhfZmJiKTsKKyAgYXV0byBfdmVjdG9yX29mX2VudW1zID0gX28tPnZlY3Rvcl9vZl9lbnVtcy5zaXplKCkgPyBfZmJiLkNyZWF0ZVZlY3RvclNjYWxhckNhc3Q8dWludDhfdD4oZmxhdGJ1ZmZlcnM6OmRhdGEoX28tPnZlY3Rvcl9vZl9lbnVtcyksIF9vLT52ZWN0b3Jfb2ZfZW51bXMuc2l6ZSgpKSA6IDA7CisgIGF1dG8gX3NpZ25lZF9lbnVtID0gX28tPnNpZ25lZF9lbnVtOworICBhdXRvIF90ZXN0cmVxdWlyZWRuZXN0ZWRmbGF0YnVmZmVyID0gX28tPnRlc3RyZXF1aXJlZG5lc3RlZGZsYXRidWZmZXIuc2l6ZSgpID8gX2ZiYi5DcmVhdGVWZWN0b3IoX28tPnRlc3RyZXF1aXJlZG5lc3RlZGZsYXRidWZmZXIpIDogMDsKKyAgYXV0byBfc2NhbGFyX2tleV9zb3J0ZWRfdGFibGVzID0gX28tPnNjYWxhcl9rZXlfc29ydGVkX3RhYmxlcy5zaXplKCkgPyBfZmJiLkNyZWF0ZVZlY3RvcjxmbGF0YnVmZmVyczo6T2Zmc2V0PE15R2FtZTo6RXhhbXBsZTo6U3RhdD4+IChfby0+c2NhbGFyX2tleV9zb3J0ZWRfdGFibGVzLnNpemUoKSwgW10oc2l6ZV90IGksIF9WZWN0b3JBcmdzICpfX3ZhKSB7IHJldHVybiBDcmVhdGVTdGF0KCpfX3ZhLT5fX2ZiYiwgX192YS0+X19vLT5zY2FsYXJfa2V5X3NvcnRlZF90YWJsZXNbaV0uZ2V0KCksIF9fdmEtPl9fcmVoYXNoZXIpOyB9LCAmX3ZhICkgOiAwOworICBhdXRvIF9uYXRpdmVfaW5saW5lID0gJl9vLT5uYXRpdmVfaW5saW5lOworICBhdXRvIF9sb25nX2VudW1fbm9uX2VudW1fZGVmYXVsdCA9IF9vLT5sb25nX2VudW1fbm9uX2VudW1fZGVmYXVsdDsKKyAgYXV0byBfbG9uZ19lbnVtX25vcm1hbF9kZWZhdWx0ID0gX28tPmxvbmdfZW51bV9ub3JtYWxfZGVmYXVsdDsKKyAgcmV0dXJuIE15R2FtZTo6RXhhbXBsZTo6Q3JlYXRlTW9uc3RlcigKKyAgICAgIF9mYmIsCisgICAgICBfcG9zLAorICAgICAgX21hbmEsCisgICAgICBfaHAsCisgICAgICBfbmFtZSwKKyAgICAgIF9pbnZlbnRvcnksCisgICAgICBfY29sb3IsCisgICAgICBfdGVzdF90eXBlLAorICAgICAgX3Rlc3QsCisgICAgICBfdGVzdDQsCisgICAgICBfdGVzdGFycmF5b2ZzdHJpbmcsCisgICAgICBfdGVzdGFycmF5b2Z0YWJsZXMsCisgICAgICBfZW5lbXksCisgICAgICBfdGVzdG5lc3RlZGZsYXRidWZmZXIsCisgICAgICBfdGVzdGVtcHR5LAorICAgICAgX3Rlc3Rib29sLAorICAgICAgX3Rlc3RoYXNoczMyX2ZudjEsCisgICAgICBfdGVzdGhhc2h1MzJfZm52MSwKKyAgICAgIF90ZXN0aGFzaHM2NF9mbnYxLAorICAgICAgX3Rlc3RoYXNodTY0X2ZudjEsCisgICAgICBfdGVzdGhhc2hzMzJfZm52MWEsCisgICAgICBfdGVzdGhhc2h1MzJfZm52MWEsCisgICAgICBfdGVzdGhhc2hzNjRfZm52MWEsCisgICAgICBfdGVzdGhhc2h1NjRfZm52MWEsCisgICAgICBfdGVzdGFycmF5b2Zib29scywKKyAgICAgIF90ZXN0ZiwKKyAgICAgIF90ZXN0ZjIsCisgICAgICBfdGVzdGYzLAorICAgICAgX3Rlc3RhcnJheW9mc3RyaW5nMiwKKyAgICAgIF90ZXN0YXJyYXlvZnNvcnRlZHN0cnVjdCwKKyAgICAgIF9mbGV4LAorICAgICAgX3Rlc3Q1LAorICAgICAgX3ZlY3Rvcl9vZl9sb25ncywKKyAgICAgIF92ZWN0b3Jfb2ZfZG91YmxlcywKKyAgICAgIF9wYXJlbnRfbmFtZXNwYWNlX3Rlc3QsCisgICAgICBfdmVjdG9yX29mX3JlZmVycmFibGVzLAorICAgICAgX3NpbmdsZV93ZWFrX3JlZmVyZW5jZSwKKyAgICAgIF92ZWN0b3Jfb2Zfd2Vha19yZWZlcmVuY2VzLAorICAgICAgX3ZlY3Rvcl9vZl9zdHJvbmdfcmVmZXJyYWJsZXMsCisgICAgICBfY29fb3duaW5nX3JlZmVyZW5jZSwKKyAgICAgIF92ZWN0b3Jfb2ZfY29fb3duaW5nX3JlZmVyZW5jZXMsCisgICAgICBfbm9uX293bmluZ19yZWZlcmVuY2UsCisgICAgICBfdmVjdG9yX29mX25vbl9vd25pbmdfcmVmZXJlbmNlcywKKyAgICAgIF9hbnlfdW5pcXVlX3R5cGUsCisgICAgICBfYW55X3VuaXF1ZSwKKyAgICAgIF9hbnlfYW1iaWd1b3VzX3R5cGUsCisgICAgICBfYW55X2FtYmlndW91cywKKyAgICAgIF92ZWN0b3Jfb2ZfZW51bXMsCisgICAgICBfc2lnbmVkX2VudW0sCisgICAgICBfdGVzdHJlcXVpcmVkbmVzdGVkZmxhdGJ1ZmZlciwKKyAgICAgIF9zY2FsYXJfa2V5X3NvcnRlZF90YWJsZXMsCisgICAgICBfbmF0aXZlX2lubGluZSwKKyAgICAgIF9sb25nX2VudW1fbm9uX2VudW1fZGVmYXVsdCwKKyAgICAgIF9sb25nX2VudW1fbm9ybWFsX2RlZmF1bHQpOworfQorCisKK2lubGluZSBib29sIG9wZXJhdG9yPT0oY29uc3QgVHlwZUFsaWFzZXNUICZsaHMsIGNvbnN0IFR5cGVBbGlhc2VzVCAmcmhzKSB7CisgIHJldHVybgorICAgICAgKGxocy5pOCA9PSByaHMuaTgpICYmCisgICAgICAobGhzLnU4ID09IHJocy51OCkgJiYKKyAgICAgIChsaHMuaTE2ID09IHJocy5pMTYpICYmCisgICAgICAobGhzLnUxNiA9PSByaHMudTE2KSAmJgorICAgICAgKGxocy5pMzIgPT0gcmhzLmkzMikgJiYKKyAgICAgIChsaHMudTMyID09IHJocy51MzIpICYmCisgICAgICAobGhzLmk2NCA9PSByaHMuaTY0KSAmJgorICAgICAgKGxocy51NjQgPT0gcmhzLnU2NCkgJiYKKyAgICAgIChsaHMuZjMyID09IHJocy5mMzIpICYmCisgICAgICAobGhzLmY2NCA9PSByaHMuZjY0KSAmJgorICAgICAgKGxocy52OCA9PSByaHMudjgpICYmCisgICAgICAobGhzLnZmNjQgPT0gcmhzLnZmNjQpOworfQorCitpbmxpbmUgYm9vbCBvcGVyYXRvciE9KGNvbnN0IFR5cGVBbGlhc2VzVCAmbGhzLCBjb25zdCBUeXBlQWxpYXNlc1QgJnJocykgeworICAgIHJldHVybiAhKGxocyA9PSByaHMpOworfQorCisKK2lubGluZSBUeXBlQWxpYXNlc1QgKlR5cGVBbGlhc2VzOjpVblBhY2soY29uc3QgZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlcikgY29uc3QgeworICBhdXRvIF9vID0gc3RkOjp1bmlxdWVfcHRyPFR5cGVBbGlhc2VzVD4obmV3IFR5cGVBbGlhc2VzVCgpKTsKKyAgVW5QYWNrVG8oX28uZ2V0KCksIF9yZXNvbHZlcik7CisgIHJldHVybiBfby5yZWxlYXNlKCk7Cit9CisKK2lubGluZSB2b2lkIFR5cGVBbGlhc2VzOjpVblBhY2tUbyhUeXBlQWxpYXNlc1QgKl9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyKSBjb25zdCB7CisgICh2b2lkKV9vOworICAodm9pZClfcmVzb2x2ZXI7CisgIHsgYXV0byBfZSA9IGk4KCk7IF9vLT5pOCA9IF9lOyB9CisgIHsgYXV0byBfZSA9IHU4KCk7IF9vLT51OCA9IF9lOyB9CisgIHsgYXV0byBfZSA9IGkxNigpOyBfby0+aTE2ID0gX2U7IH0KKyAgeyBhdXRvIF9lID0gdTE2KCk7IF9vLT51MTYgPSBfZTsgfQorICB7IGF1dG8gX2UgPSBpMzIoKTsgX28tPmkzMiA9IF9lOyB9CisgIHsgYXV0byBfZSA9IHUzMigpOyBfby0+dTMyID0gX2U7IH0KKyAgeyBhdXRvIF9lID0gaTY0KCk7IF9vLT5pNjQgPSBfZTsgfQorICB7IGF1dG8gX2UgPSB1NjQoKTsgX28tPnU2NCA9IF9lOyB9CisgIHsgYXV0byBfZSA9IGYzMigpOyBfby0+ZjMyID0gX2U7IH0KKyAgeyBhdXRvIF9lID0gZjY0KCk7IF9vLT5mNjQgPSBfZTsgfQorICB7IGF1dG8gX2UgPSB2OCgpOyBpZiAoX2UpIHsgX28tPnY4LnJlc2l6ZShfZS0+c2l6ZSgpKTsgc3RkOjpjb3B5KF9lLT5iZWdpbigpLCBfZS0+ZW5kKCksIF9vLT52OC5iZWdpbigpKTsgfSB9CisgIHsgYXV0byBfZSA9IHZmNjQoKTsgaWYgKF9lKSB7IF9vLT52ZjY0LnJlc2l6ZShfZS0+c2l6ZSgpKTsgZm9yIChmbGF0YnVmZmVyczo6dW9mZnNldF90IF9pID0gMDsgX2kgPCBfZS0+c2l6ZSgpOyBfaSsrKSB7IF9vLT52ZjY0W19pXSA9IF9lLT5HZXQoX2kpOyB9IH0gZWxzZSB7IF9vLT52ZjY0LnJlc2l6ZSgwKTsgfSB9Cit9CisKK2lubGluZSBmbGF0YnVmZmVyczo6T2Zmc2V0PFR5cGVBbGlhc2VzPiBUeXBlQWxpYXNlczo6UGFjayhmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IFR5cGVBbGlhc2VzVCogX28sIGNvbnN0IGZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIpIHsKKyAgcmV0dXJuIENyZWF0ZVR5cGVBbGlhc2VzKF9mYmIsIF9vLCBfcmVoYXNoZXIpOworfQorCitpbmxpbmUgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxUeXBlQWxpYXNlcz4gQ3JlYXRlVHlwZUFsaWFzZXMoZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBUeXBlQWxpYXNlc1QgKl9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyKSB7CisgICh2b2lkKV9yZWhhc2hlcjsKKyAgKHZvaWQpX287CisgIHN0cnVjdCBfVmVjdG9yQXJncyB7IGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAqX19mYmI7IGNvbnN0IFR5cGVBbGlhc2VzVCogX19vOyBjb25zdCBmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX19yZWhhc2hlcjsgfSBfdmEgPSB7ICZfZmJiLCBfbywgX3JlaGFzaGVyfTsgKHZvaWQpX3ZhOworICBhdXRvIF9pOCA9IF9vLT5pODsKKyAgYXV0byBfdTggPSBfby0+dTg7CisgIGF1dG8gX2kxNiA9IF9vLT5pMTY7CisgIGF1dG8gX3UxNiA9IF9vLT51MTY7CisgIGF1dG8gX2kzMiA9IF9vLT5pMzI7CisgIGF1dG8gX3UzMiA9IF9vLT51MzI7CisgIGF1dG8gX2k2NCA9IF9vLT5pNjQ7CisgIGF1dG8gX3U2NCA9IF9vLT51NjQ7CisgIGF1dG8gX2YzMiA9IF9vLT5mMzI7CisgIGF1dG8gX2Y2NCA9IF9vLT5mNjQ7CisgIGF1dG8gX3Y4ID0gX28tPnY4LnNpemUoKSA/IF9mYmIuQ3JlYXRlVmVjdG9yKF9vLT52OCkgOiAwOworICBhdXRvIF92ZjY0ID0gX28tPnZmNjQuc2l6ZSgpID8gX2ZiYi5DcmVhdGVWZWN0b3IoX28tPnZmNjQpIDogMDsKKyAgcmV0dXJuIE15R2FtZTo6RXhhbXBsZTo6Q3JlYXRlVHlwZUFsaWFzZXMoCisgICAgICBfZmJiLAorICAgICAgX2k4LAorICAgICAgX3U4LAorICAgICAgX2kxNiwKKyAgICAgIF91MTYsCisgICAgICBfaTMyLAorICAgICAgX3UzMiwKKyAgICAgIF9pNjQsCisgICAgICBfdTY0LAorICAgICAgX2YzMiwKKyAgICAgIF9mNjQsCisgICAgICBfdjgsCisgICAgICBfdmY2NCk7Cit9CisKK2lubGluZSBib29sIFZlcmlmeUFueShmbGF0YnVmZmVyczo6VmVyaWZpZXIgJnZlcmlmaWVyLCBjb25zdCB2b2lkICpvYmosIEFueSB0eXBlKSB7CisgIHN3aXRjaCAodHlwZSkgeworICAgIGNhc2UgQW55X05PTkU6IHsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICBjYXNlIEFueV9Nb25zdGVyOiB7CisgICAgICBhdXRvIHB0ciA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgTXlHYW1lOjpFeGFtcGxlOjpNb25zdGVyICo+KG9iaik7CisgICAgICByZXR1cm4gdmVyaWZpZXIuVmVyaWZ5VGFibGUocHRyKTsKKyAgICB9CisgICAgY2FzZSBBbnlfVGVzdFNpbXBsZVRhYmxlV2l0aEVudW06IHsKKyAgICAgIGF1dG8gcHRyID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBNeUdhbWU6OkV4YW1wbGU6OlRlc3RTaW1wbGVUYWJsZVdpdGhFbnVtICo+KG9iaik7CisgICAgICByZXR1cm4gdmVyaWZpZXIuVmVyaWZ5VGFibGUocHRyKTsKKyAgICB9CisgICAgY2FzZSBBbnlfTXlHYW1lX0V4YW1wbGUyX01vbnN0ZXI6IHsKKyAgICAgIGF1dG8gcHRyID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBNeUdhbWU6OkV4YW1wbGUyOjpNb25zdGVyICo+KG9iaik7CisgICAgICByZXR1cm4gdmVyaWZpZXIuVmVyaWZ5VGFibGUocHRyKTsKKyAgICB9CisgICAgZGVmYXVsdDogcmV0dXJuIHRydWU7CisgIH0KK30KKworaW5saW5lIGJvb2wgVmVyaWZ5QW55VmVjdG9yKGZsYXRidWZmZXJzOjpWZXJpZmllciAmdmVyaWZpZXIsIGNvbnN0IGZsYXRidWZmZXJzOjpWZWN0b3I8ZmxhdGJ1ZmZlcnM6Ok9mZnNldDx2b2lkPj4gKnZhbHVlcywgY29uc3QgZmxhdGJ1ZmZlcnM6OlZlY3Rvcjx1aW50OF90PiAqdHlwZXMpIHsKKyAgaWYgKCF2YWx1ZXMgfHwgIXR5cGVzKSByZXR1cm4gIXZhbHVlcyAmJiAhdHlwZXM7CisgIGlmICh2YWx1ZXMtPnNpemUoKSAhPSB0eXBlcy0+c2l6ZSgpKSByZXR1cm4gZmFsc2U7CisgIGZvciAoZmxhdGJ1ZmZlcnM6OnVvZmZzZXRfdCBpID0gMDsgaSA8IHZhbHVlcy0+c2l6ZSgpOyArK2kpIHsKKyAgICBpZiAoIVZlcmlmeUFueSgKKyAgICAgICAgdmVyaWZpZXIsICB2YWx1ZXMtPkdldChpKSwgdHlwZXMtPkdldEVudW08QW55PihpKSkpIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIHRydWU7Cit9CisKK2lubGluZSB2b2lkICpBbnlVbmlvbjo6VW5QYWNrKGNvbnN0IHZvaWQgKm9iaiwgQW55IHR5cGUsIGNvbnN0IGZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpyZXNvbHZlcikgeworICAodm9pZClyZXNvbHZlcjsKKyAgc3dpdGNoICh0eXBlKSB7CisgICAgY2FzZSBBbnlfTW9uc3RlcjogeworICAgICAgYXV0byBwdHIgPSByZWludGVycHJldF9jYXN0PGNvbnN0IE15R2FtZTo6RXhhbXBsZTo6TW9uc3RlciAqPihvYmopOworICAgICAgcmV0dXJuIHB0ci0+VW5QYWNrKHJlc29sdmVyKTsKKyAgICB9CisgICAgY2FzZSBBbnlfVGVzdFNpbXBsZVRhYmxlV2l0aEVudW06IHsKKyAgICAgIGF1dG8gcHRyID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBNeUdhbWU6OkV4YW1wbGU6OlRlc3RTaW1wbGVUYWJsZVdpdGhFbnVtICo+KG9iaik7CisgICAgICByZXR1cm4gcHRyLT5VblBhY2socmVzb2x2ZXIpOworICAgIH0KKyAgICBjYXNlIEFueV9NeUdhbWVfRXhhbXBsZTJfTW9uc3RlcjogeworICAgICAgYXV0byBwdHIgPSByZWludGVycHJldF9jYXN0PGNvbnN0IE15R2FtZTo6RXhhbXBsZTI6Ok1vbnN0ZXIgKj4ob2JqKTsKKyAgICAgIHJldHVybiBwdHItPlVuUGFjayhyZXNvbHZlcik7CisgICAgfQorICAgIGRlZmF1bHQ6IHJldHVybiBudWxscHRyOworICB9Cit9CisKK2lubGluZSBmbGF0YnVmZmVyczo6T2Zmc2V0PHZvaWQ+IEFueVVuaW9uOjpQYWNrKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlcikgY29uc3QgeworICAodm9pZClfcmVoYXNoZXI7CisgIHN3aXRjaCAodHlwZSkgeworICAgIGNhc2UgQW55X01vbnN0ZXI6IHsKKyAgICAgIGF1dG8gcHRyID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBNeUdhbWU6OkV4YW1wbGU6Ok1vbnN0ZXJUICo+KHZhbHVlKTsKKyAgICAgIHJldHVybiBDcmVhdGVNb25zdGVyKF9mYmIsIHB0ciwgX3JlaGFzaGVyKS5VbmlvbigpOworICAgIH0KKyAgICBjYXNlIEFueV9UZXN0U2ltcGxlVGFibGVXaXRoRW51bTogeworICAgICAgYXV0byBwdHIgPSByZWludGVycHJldF9jYXN0PGNvbnN0IE15R2FtZTo6RXhhbXBsZTo6VGVzdFNpbXBsZVRhYmxlV2l0aEVudW1UICo+KHZhbHVlKTsKKyAgICAgIHJldHVybiBDcmVhdGVUZXN0U2ltcGxlVGFibGVXaXRoRW51bShfZmJiLCBwdHIsIF9yZWhhc2hlcikuVW5pb24oKTsKKyAgICB9CisgICAgY2FzZSBBbnlfTXlHYW1lX0V4YW1wbGUyX01vbnN0ZXI6IHsKKyAgICAgIGF1dG8gcHRyID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBNeUdhbWU6OkV4YW1wbGUyOjpNb25zdGVyVCAqPih2YWx1ZSk7CisgICAgICByZXR1cm4gQ3JlYXRlTW9uc3RlcihfZmJiLCBwdHIsIF9yZWhhc2hlcikuVW5pb24oKTsKKyAgICB9CisgICAgZGVmYXVsdDogcmV0dXJuIDA7CisgIH0KK30KKworaW5saW5lIEFueVVuaW9uOjpBbnlVbmlvbihjb25zdCBBbnlVbmlvbiAmdSkgOiB0eXBlKHUudHlwZSksIHZhbHVlKG51bGxwdHIpIHsKKyAgc3dpdGNoICh0eXBlKSB7CisgICAgY2FzZSBBbnlfTW9uc3RlcjogeworICAgICAgdmFsdWUgPSBuZXcgTXlHYW1lOjpFeGFtcGxlOjpNb25zdGVyVCgqcmVpbnRlcnByZXRfY2FzdDxNeUdhbWU6OkV4YW1wbGU6Ok1vbnN0ZXJUICo+KHUudmFsdWUpKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIEFueV9UZXN0U2ltcGxlVGFibGVXaXRoRW51bTogeworICAgICAgdmFsdWUgPSBuZXcgTXlHYW1lOjpFeGFtcGxlOjpUZXN0U2ltcGxlVGFibGVXaXRoRW51bVQoKnJlaW50ZXJwcmV0X2Nhc3Q8TXlHYW1lOjpFeGFtcGxlOjpUZXN0U2ltcGxlVGFibGVXaXRoRW51bVQgKj4odS52YWx1ZSkpOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgQW55X015R2FtZV9FeGFtcGxlMl9Nb25zdGVyOiB7CisgICAgICB2YWx1ZSA9IG5ldyBNeUdhbWU6OkV4YW1wbGUyOjpNb25zdGVyVCgqcmVpbnRlcnByZXRfY2FzdDxNeUdhbWU6OkV4YW1wbGUyOjpNb25zdGVyVCAqPih1LnZhbHVlKSk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9Cit9CisKK2lubGluZSB2b2lkIEFueVVuaW9uOjpSZXNldCgpIHsKKyAgc3dpdGNoICh0eXBlKSB7CisgICAgY2FzZSBBbnlfTW9uc3RlcjogeworICAgICAgYXV0byBwdHIgPSByZWludGVycHJldF9jYXN0PE15R2FtZTo6RXhhbXBsZTo6TW9uc3RlclQgKj4odmFsdWUpOworICAgICAgZGVsZXRlIHB0cjsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIEFueV9UZXN0U2ltcGxlVGFibGVXaXRoRW51bTogeworICAgICAgYXV0byBwdHIgPSByZWludGVycHJldF9jYXN0PE15R2FtZTo6RXhhbXBsZTo6VGVzdFNpbXBsZVRhYmxlV2l0aEVudW1UICo+KHZhbHVlKTsKKyAgICAgIGRlbGV0ZSBwdHI7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBBbnlfTXlHYW1lX0V4YW1wbGUyX01vbnN0ZXI6IHsKKyAgICAgIGF1dG8gcHRyID0gcmVpbnRlcnByZXRfY2FzdDxNeUdhbWU6OkV4YW1wbGUyOjpNb25zdGVyVCAqPih2YWx1ZSk7CisgICAgICBkZWxldGUgcHRyOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGRlZmF1bHQ6IGJyZWFrOworICB9CisgIHZhbHVlID0gbnVsbHB0cjsKKyAgdHlwZSA9IEFueV9OT05FOworfQorCitpbmxpbmUgYm9vbCBWZXJpZnlBbnlVbmlxdWVBbGlhc2VzKGZsYXRidWZmZXJzOjpWZXJpZmllciAmdmVyaWZpZXIsIGNvbnN0IHZvaWQgKm9iaiwgQW55VW5pcXVlQWxpYXNlcyB0eXBlKSB7CisgIHN3aXRjaCAodHlwZSkgeworICAgIGNhc2UgQW55VW5pcXVlQWxpYXNlc19OT05FOiB7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgY2FzZSBBbnlVbmlxdWVBbGlhc2VzX006IHsKKyAgICAgIGF1dG8gcHRyID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBNeUdhbWU6OkV4YW1wbGU6Ok1vbnN0ZXIgKj4ob2JqKTsKKyAgICAgIHJldHVybiB2ZXJpZmllci5WZXJpZnlUYWJsZShwdHIpOworICAgIH0KKyAgICBjYXNlIEFueVVuaXF1ZUFsaWFzZXNfVFM6IHsKKyAgICAgIGF1dG8gcHRyID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBNeUdhbWU6OkV4YW1wbGU6OlRlc3RTaW1wbGVUYWJsZVdpdGhFbnVtICo+KG9iaik7CisgICAgICByZXR1cm4gdmVyaWZpZXIuVmVyaWZ5VGFibGUocHRyKTsKKyAgICB9CisgICAgY2FzZSBBbnlVbmlxdWVBbGlhc2VzX00yOiB7CisgICAgICBhdXRvIHB0ciA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgTXlHYW1lOjpFeGFtcGxlMjo6TW9uc3RlciAqPihvYmopOworICAgICAgcmV0dXJuIHZlcmlmaWVyLlZlcmlmeVRhYmxlKHB0cik7CisgICAgfQorICAgIGRlZmF1bHQ6IHJldHVybiB0cnVlOworICB9Cit9CisKK2lubGluZSBib29sIFZlcmlmeUFueVVuaXF1ZUFsaWFzZXNWZWN0b3IoZmxhdGJ1ZmZlcnM6OlZlcmlmaWVyICZ2ZXJpZmllciwgY29uc3QgZmxhdGJ1ZmZlcnM6OlZlY3RvcjxmbGF0YnVmZmVyczo6T2Zmc2V0PHZvaWQ+PiAqdmFsdWVzLCBjb25zdCBmbGF0YnVmZmVyczo6VmVjdG9yPHVpbnQ4X3Q+ICp0eXBlcykgeworICBpZiAoIXZhbHVlcyB8fCAhdHlwZXMpIHJldHVybiAhdmFsdWVzICYmICF0eXBlczsKKyAgaWYgKHZhbHVlcy0+c2l6ZSgpICE9IHR5cGVzLT5zaXplKCkpIHJldHVybiBmYWxzZTsKKyAgZm9yIChmbGF0YnVmZmVyczo6dW9mZnNldF90IGkgPSAwOyBpIDwgdmFsdWVzLT5zaXplKCk7ICsraSkgeworICAgIGlmICghVmVyaWZ5QW55VW5pcXVlQWxpYXNlcygKKyAgICAgICAgdmVyaWZpZXIsICB2YWx1ZXMtPkdldChpKSwgdHlwZXMtPkdldEVudW08QW55VW5pcXVlQWxpYXNlcz4oaSkpKSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICB9CisgIHJldHVybiB0cnVlOworfQorCitpbmxpbmUgdm9pZCAqQW55VW5pcXVlQWxpYXNlc1VuaW9uOjpVblBhY2soY29uc3Qgdm9pZCAqb2JqLCBBbnlVbmlxdWVBbGlhc2VzIHR5cGUsIGNvbnN0IGZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpyZXNvbHZlcikgeworICAodm9pZClyZXNvbHZlcjsKKyAgc3dpdGNoICh0eXBlKSB7CisgICAgY2FzZSBBbnlVbmlxdWVBbGlhc2VzX006IHsKKyAgICAgIGF1dG8gcHRyID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBNeUdhbWU6OkV4YW1wbGU6Ok1vbnN0ZXIgKj4ob2JqKTsKKyAgICAgIHJldHVybiBwdHItPlVuUGFjayhyZXNvbHZlcik7CisgICAgfQorICAgIGNhc2UgQW55VW5pcXVlQWxpYXNlc19UUzogeworICAgICAgYXV0byBwdHIgPSByZWludGVycHJldF9jYXN0PGNvbnN0IE15R2FtZTo6RXhhbXBsZTo6VGVzdFNpbXBsZVRhYmxlV2l0aEVudW0gKj4ob2JqKTsKKyAgICAgIHJldHVybiBwdHItPlVuUGFjayhyZXNvbHZlcik7CisgICAgfQorICAgIGNhc2UgQW55VW5pcXVlQWxpYXNlc19NMjogeworICAgICAgYXV0byBwdHIgPSByZWludGVycHJldF9jYXN0PGNvbnN0IE15R2FtZTo6RXhhbXBsZTI6Ok1vbnN0ZXIgKj4ob2JqKTsKKyAgICAgIHJldHVybiBwdHItPlVuUGFjayhyZXNvbHZlcik7CisgICAgfQorICAgIGRlZmF1bHQ6IHJldHVybiBudWxscHRyOworICB9Cit9CisKK2lubGluZSBmbGF0YnVmZmVyczo6T2Zmc2V0PHZvaWQ+IEFueVVuaXF1ZUFsaWFzZXNVbmlvbjo6UGFjayhmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IGZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIpIGNvbnN0IHsKKyAgKHZvaWQpX3JlaGFzaGVyOworICBzd2l0Y2ggKHR5cGUpIHsKKyAgICBjYXNlIEFueVVuaXF1ZUFsaWFzZXNfTTogeworICAgICAgYXV0byBwdHIgPSByZWludGVycHJldF9jYXN0PGNvbnN0IE15R2FtZTo6RXhhbXBsZTo6TW9uc3RlclQgKj4odmFsdWUpOworICAgICAgcmV0dXJuIENyZWF0ZU1vbnN0ZXIoX2ZiYiwgcHRyLCBfcmVoYXNoZXIpLlVuaW9uKCk7CisgICAgfQorICAgIGNhc2UgQW55VW5pcXVlQWxpYXNlc19UUzogeworICAgICAgYXV0byBwdHIgPSByZWludGVycHJldF9jYXN0PGNvbnN0IE15R2FtZTo6RXhhbXBsZTo6VGVzdFNpbXBsZVRhYmxlV2l0aEVudW1UICo+KHZhbHVlKTsKKyAgICAgIHJldHVybiBDcmVhdGVUZXN0U2ltcGxlVGFibGVXaXRoRW51bShfZmJiLCBwdHIsIF9yZWhhc2hlcikuVW5pb24oKTsKKyAgICB9CisgICAgY2FzZSBBbnlVbmlxdWVBbGlhc2VzX00yOiB7CisgICAgICBhdXRvIHB0ciA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgTXlHYW1lOjpFeGFtcGxlMjo6TW9uc3RlclQgKj4odmFsdWUpOworICAgICAgcmV0dXJuIENyZWF0ZU1vbnN0ZXIoX2ZiYiwgcHRyLCBfcmVoYXNoZXIpLlVuaW9uKCk7CisgICAgfQorICAgIGRlZmF1bHQ6IHJldHVybiAwOworICB9Cit9CisKK2lubGluZSBBbnlVbmlxdWVBbGlhc2VzVW5pb246OkFueVVuaXF1ZUFsaWFzZXNVbmlvbihjb25zdCBBbnlVbmlxdWVBbGlhc2VzVW5pb24gJnUpIDogdHlwZSh1LnR5cGUpLCB2YWx1ZShudWxscHRyKSB7CisgIHN3aXRjaCAodHlwZSkgeworICAgIGNhc2UgQW55VW5pcXVlQWxpYXNlc19NOiB7CisgICAgICB2YWx1ZSA9IG5ldyBNeUdhbWU6OkV4YW1wbGU6Ok1vbnN0ZXJUKCpyZWludGVycHJldF9jYXN0PE15R2FtZTo6RXhhbXBsZTo6TW9uc3RlclQgKj4odS52YWx1ZSkpOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgQW55VW5pcXVlQWxpYXNlc19UUzogeworICAgICAgdmFsdWUgPSBuZXcgTXlHYW1lOjpFeGFtcGxlOjpUZXN0U2ltcGxlVGFibGVXaXRoRW51bVQoKnJlaW50ZXJwcmV0X2Nhc3Q8TXlHYW1lOjpFeGFtcGxlOjpUZXN0U2ltcGxlVGFibGVXaXRoRW51bVQgKj4odS52YWx1ZSkpOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgQW55VW5pcXVlQWxpYXNlc19NMjogeworICAgICAgdmFsdWUgPSBuZXcgTXlHYW1lOjpFeGFtcGxlMjo6TW9uc3RlclQoKnJlaW50ZXJwcmV0X2Nhc3Q8TXlHYW1lOjpFeGFtcGxlMjo6TW9uc3RlclQgKj4odS52YWx1ZSkpOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQorfQorCitpbmxpbmUgdm9pZCBBbnlVbmlxdWVBbGlhc2VzVW5pb246OlJlc2V0KCkgeworICBzd2l0Y2ggKHR5cGUpIHsKKyAgICBjYXNlIEFueVVuaXF1ZUFsaWFzZXNfTTogeworICAgICAgYXV0byBwdHIgPSByZWludGVycHJldF9jYXN0PE15R2FtZTo6RXhhbXBsZTo6TW9uc3RlclQgKj4odmFsdWUpOworICAgICAgZGVsZXRlIHB0cjsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIEFueVVuaXF1ZUFsaWFzZXNfVFM6IHsKKyAgICAgIGF1dG8gcHRyID0gcmVpbnRlcnByZXRfY2FzdDxNeUdhbWU6OkV4YW1wbGU6OlRlc3RTaW1wbGVUYWJsZVdpdGhFbnVtVCAqPih2YWx1ZSk7CisgICAgICBkZWxldGUgcHRyOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgQW55VW5pcXVlQWxpYXNlc19NMjogeworICAgICAgYXV0byBwdHIgPSByZWludGVycHJldF9jYXN0PE15R2FtZTo6RXhhbXBsZTI6Ok1vbnN0ZXJUICo+KHZhbHVlKTsKKyAgICAgIGRlbGV0ZSBwdHI7CisgICAgICBicmVhazsKKyAgICB9CisgICAgZGVmYXVsdDogYnJlYWs7CisgIH0KKyAgdmFsdWUgPSBudWxscHRyOworICB0eXBlID0gQW55VW5pcXVlQWxpYXNlc19OT05FOworfQorCitpbmxpbmUgYm9vbCBWZXJpZnlBbnlBbWJpZ3VvdXNBbGlhc2VzKGZsYXRidWZmZXJzOjpWZXJpZmllciAmdmVyaWZpZXIsIGNvbnN0IHZvaWQgKm9iaiwgQW55QW1iaWd1b3VzQWxpYXNlcyB0eXBlKSB7CisgIHN3aXRjaCAodHlwZSkgeworICAgIGNhc2UgQW55QW1iaWd1b3VzQWxpYXNlc19OT05FOiB7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgY2FzZSBBbnlBbWJpZ3VvdXNBbGlhc2VzX00xOiB7CisgICAgICBhdXRvIHB0ciA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgTXlHYW1lOjpFeGFtcGxlOjpNb25zdGVyICo+KG9iaik7CisgICAgICByZXR1cm4gdmVyaWZpZXIuVmVyaWZ5VGFibGUocHRyKTsKKyAgICB9CisgICAgY2FzZSBBbnlBbWJpZ3VvdXNBbGlhc2VzX00yOiB7CisgICAgICBhdXRvIHB0ciA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgTXlHYW1lOjpFeGFtcGxlOjpNb25zdGVyICo+KG9iaik7CisgICAgICByZXR1cm4gdmVyaWZpZXIuVmVyaWZ5VGFibGUocHRyKTsKKyAgICB9CisgICAgY2FzZSBBbnlBbWJpZ3VvdXNBbGlhc2VzX00zOiB7CisgICAgICBhdXRvIHB0ciA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgTXlHYW1lOjpFeGFtcGxlOjpNb25zdGVyICo+KG9iaik7CisgICAgICByZXR1cm4gdmVyaWZpZXIuVmVyaWZ5VGFibGUocHRyKTsKKyAgICB9CisgICAgZGVmYXVsdDogcmV0dXJuIHRydWU7CisgIH0KK30KKworaW5saW5lIGJvb2wgVmVyaWZ5QW55QW1iaWd1b3VzQWxpYXNlc1ZlY3RvcihmbGF0YnVmZmVyczo6VmVyaWZpZXIgJnZlcmlmaWVyLCBjb25zdCBmbGF0YnVmZmVyczo6VmVjdG9yPGZsYXRidWZmZXJzOjpPZmZzZXQ8dm9pZD4+ICp2YWx1ZXMsIGNvbnN0IGZsYXRidWZmZXJzOjpWZWN0b3I8dWludDhfdD4gKnR5cGVzKSB7CisgIGlmICghdmFsdWVzIHx8ICF0eXBlcykgcmV0dXJuICF2YWx1ZXMgJiYgIXR5cGVzOworICBpZiAodmFsdWVzLT5zaXplKCkgIT0gdHlwZXMtPnNpemUoKSkgcmV0dXJuIGZhbHNlOworICBmb3IgKGZsYXRidWZmZXJzOjp1b2Zmc2V0X3QgaSA9IDA7IGkgPCB2YWx1ZXMtPnNpemUoKTsgKytpKSB7CisgICAgaWYgKCFWZXJpZnlBbnlBbWJpZ3VvdXNBbGlhc2VzKAorICAgICAgICB2ZXJpZmllciwgIHZhbHVlcy0+R2V0KGkpLCB0eXBlcy0+R2V0RW51bTxBbnlBbWJpZ3VvdXNBbGlhc2VzPihpKSkpIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIHRydWU7Cit9CisKK2lubGluZSB2b2lkICpBbnlBbWJpZ3VvdXNBbGlhc2VzVW5pb246OlVuUGFjayhjb25zdCB2b2lkICpvYmosIEFueUFtYmlndW91c0FsaWFzZXMgdHlwZSwgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKnJlc29sdmVyKSB7CisgICh2b2lkKXJlc29sdmVyOworICBzd2l0Y2ggKHR5cGUpIHsKKyAgICBjYXNlIEFueUFtYmlndW91c0FsaWFzZXNfTTE6IHsKKyAgICAgIGF1dG8gcHRyID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBNeUdhbWU6OkV4YW1wbGU6Ok1vbnN0ZXIgKj4ob2JqKTsKKyAgICAgIHJldHVybiBwdHItPlVuUGFjayhyZXNvbHZlcik7CisgICAgfQorICAgIGNhc2UgQW55QW1iaWd1b3VzQWxpYXNlc19NMjogeworICAgICAgYXV0byBwdHIgPSByZWludGVycHJldF9jYXN0PGNvbnN0IE15R2FtZTo6RXhhbXBsZTo6TW9uc3RlciAqPihvYmopOworICAgICAgcmV0dXJuIHB0ci0+VW5QYWNrKHJlc29sdmVyKTsKKyAgICB9CisgICAgY2FzZSBBbnlBbWJpZ3VvdXNBbGlhc2VzX00zOiB7CisgICAgICBhdXRvIHB0ciA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgTXlHYW1lOjpFeGFtcGxlOjpNb25zdGVyICo+KG9iaik7CisgICAgICByZXR1cm4gcHRyLT5VblBhY2socmVzb2x2ZXIpOworICAgIH0KKyAgICBkZWZhdWx0OiByZXR1cm4gbnVsbHB0cjsKKyAgfQorfQorCitpbmxpbmUgZmxhdGJ1ZmZlcnM6Ok9mZnNldDx2b2lkPiBBbnlBbWJpZ3VvdXNBbGlhc2VzVW5pb246OlBhY2soZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyKSBjb25zdCB7CisgICh2b2lkKV9yZWhhc2hlcjsKKyAgc3dpdGNoICh0eXBlKSB7CisgICAgY2FzZSBBbnlBbWJpZ3VvdXNBbGlhc2VzX00xOiB7CisgICAgICBhdXRvIHB0ciA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgTXlHYW1lOjpFeGFtcGxlOjpNb25zdGVyVCAqPih2YWx1ZSk7CisgICAgICByZXR1cm4gQ3JlYXRlTW9uc3RlcihfZmJiLCBwdHIsIF9yZWhhc2hlcikuVW5pb24oKTsKKyAgICB9CisgICAgY2FzZSBBbnlBbWJpZ3VvdXNBbGlhc2VzX00yOiB7CisgICAgICBhdXRvIHB0ciA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgTXlHYW1lOjpFeGFtcGxlOjpNb25zdGVyVCAqPih2YWx1ZSk7CisgICAgICByZXR1cm4gQ3JlYXRlTW9uc3RlcihfZmJiLCBwdHIsIF9yZWhhc2hlcikuVW5pb24oKTsKKyAgICB9CisgICAgY2FzZSBBbnlBbWJpZ3VvdXNBbGlhc2VzX00zOiB7CisgICAgICBhdXRvIHB0ciA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgTXlHYW1lOjpFeGFtcGxlOjpNb25zdGVyVCAqPih2YWx1ZSk7CisgICAgICByZXR1cm4gQ3JlYXRlTW9uc3RlcihfZmJiLCBwdHIsIF9yZWhhc2hlcikuVW5pb24oKTsKKyAgICB9CisgICAgZGVmYXVsdDogcmV0dXJuIDA7CisgIH0KK30KKworaW5saW5lIEFueUFtYmlndW91c0FsaWFzZXNVbmlvbjo6QW55QW1iaWd1b3VzQWxpYXNlc1VuaW9uKGNvbnN0IEFueUFtYmlndW91c0FsaWFzZXNVbmlvbiAmdSkgOiB0eXBlKHUudHlwZSksIHZhbHVlKG51bGxwdHIpIHsKKyAgc3dpdGNoICh0eXBlKSB7CisgICAgY2FzZSBBbnlBbWJpZ3VvdXNBbGlhc2VzX00xOiB7CisgICAgICB2YWx1ZSA9IG5ldyBNeUdhbWU6OkV4YW1wbGU6Ok1vbnN0ZXJUKCpyZWludGVycHJldF9jYXN0PE15R2FtZTo6RXhhbXBsZTo6TW9uc3RlclQgKj4odS52YWx1ZSkpOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgQW55QW1iaWd1b3VzQWxpYXNlc19NMjogeworICAgICAgdmFsdWUgPSBuZXcgTXlHYW1lOjpFeGFtcGxlOjpNb25zdGVyVCgqcmVpbnRlcnByZXRfY2FzdDxNeUdhbWU6OkV4YW1wbGU6Ok1vbnN0ZXJUICo+KHUudmFsdWUpKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIEFueUFtYmlndW91c0FsaWFzZXNfTTM6IHsKKyAgICAgIHZhbHVlID0gbmV3IE15R2FtZTo6RXhhbXBsZTo6TW9uc3RlclQoKnJlaW50ZXJwcmV0X2Nhc3Q8TXlHYW1lOjpFeGFtcGxlOjpNb25zdGVyVCAqPih1LnZhbHVlKSk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9Cit9CisKK2lubGluZSB2b2lkIEFueUFtYmlndW91c0FsaWFzZXNVbmlvbjo6UmVzZXQoKSB7CisgIHN3aXRjaCAodHlwZSkgeworICAgIGNhc2UgQW55QW1iaWd1b3VzQWxpYXNlc19NMTogeworICAgICAgYXV0byBwdHIgPSByZWludGVycHJldF9jYXN0PE15R2FtZTo6RXhhbXBsZTo6TW9uc3RlclQgKj4odmFsdWUpOworICAgICAgZGVsZXRlIHB0cjsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIEFueUFtYmlndW91c0FsaWFzZXNfTTI6IHsKKyAgICAgIGF1dG8gcHRyID0gcmVpbnRlcnByZXRfY2FzdDxNeUdhbWU6OkV4YW1wbGU6Ok1vbnN0ZXJUICo+KHZhbHVlKTsKKyAgICAgIGRlbGV0ZSBwdHI7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBBbnlBbWJpZ3VvdXNBbGlhc2VzX00zOiB7CisgICAgICBhdXRvIHB0ciA9IHJlaW50ZXJwcmV0X2Nhc3Q8TXlHYW1lOjpFeGFtcGxlOjpNb25zdGVyVCAqPih2YWx1ZSk7CisgICAgICBkZWxldGUgcHRyOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGRlZmF1bHQ6IGJyZWFrOworICB9CisgIHZhbHVlID0gbnVsbHB0cjsKKyAgdHlwZSA9IEFueUFtYmlndW91c0FsaWFzZXNfTk9ORTsKK30KKworaW5saW5lIGNvbnN0IGZsYXRidWZmZXJzOjpUeXBlVGFibGUgKkNvbG9yVHlwZVRhYmxlKCkgeworICBzdGF0aWMgY29uc3QgZmxhdGJ1ZmZlcnM6OlR5cGVDb2RlIHR5cGVfY29kZXNbXSA9IHsKKyAgICB7IGZsYXRidWZmZXJzOjpFVF9VQ0hBUiwgMCwgMCB9LAorICAgIHsgZmxhdGJ1ZmZlcnM6OkVUX1VDSEFSLCAwLCAwIH0sCisgICAgeyBmbGF0YnVmZmVyczo6RVRfVUNIQVIsIDAsIDAgfQorICB9OworICBzdGF0aWMgY29uc3QgZmxhdGJ1ZmZlcnM6OlR5cGVGdW5jdGlvbiB0eXBlX3JlZnNbXSA9IHsKKyAgICBNeUdhbWU6OkV4YW1wbGU6OkNvbG9yVHlwZVRhYmxlCisgIH07CisgIHN0YXRpYyBjb25zdCBpbnQ2NF90IHZhbHVlc1tdID0geyAxLCAyLCA4IH07CisgIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgbmFtZXNbXSA9IHsKKyAgICAiUmVkIiwKKyAgICAiR3JlZW4iLAorICAgICJCbHVlIgorICB9OworICBzdGF0aWMgY29uc3QgZmxhdGJ1ZmZlcnM6OlR5cGVUYWJsZSB0dCA9IHsKKyAgICBmbGF0YnVmZmVyczo6U1RfRU5VTSwgMywgdHlwZV9jb2RlcywgdHlwZV9yZWZzLCBudWxscHRyLCB2YWx1ZXMsIG5hbWVzCisgIH07CisgIHJldHVybiAmdHQ7Cit9CisKK2lubGluZSBjb25zdCBmbGF0YnVmZmVyczo6VHlwZVRhYmxlICpSYWNlVHlwZVRhYmxlKCkgeworICBzdGF0aWMgY29uc3QgZmxhdGJ1ZmZlcnM6OlR5cGVDb2RlIHR5cGVfY29kZXNbXSA9IHsKKyAgICB7IGZsYXRidWZmZXJzOjpFVF9DSEFSLCAwLCAwIH0sCisgICAgeyBmbGF0YnVmZmVyczo6RVRfQ0hBUiwgMCwgMCB9LAorICAgIHsgZmxhdGJ1ZmZlcnM6OkVUX0NIQVIsIDAsIDAgfSwKKyAgICB7IGZsYXRidWZmZXJzOjpFVF9DSEFSLCAwLCAwIH0KKyAgfTsKKyAgc3RhdGljIGNvbnN0IGZsYXRidWZmZXJzOjpUeXBlRnVuY3Rpb24gdHlwZV9yZWZzW10gPSB7CisgICAgTXlHYW1lOjpFeGFtcGxlOjpSYWNlVHlwZVRhYmxlCisgIH07CisgIHN0YXRpYyBjb25zdCBpbnQ2NF90IHZhbHVlc1tdID0geyAtMSwgMCwgMSwgMiB9OworICBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IG5hbWVzW10gPSB7CisgICAgIk5vbmUiLAorICAgICJIdW1hbiIsCisgICAgIkR3YXJmIiwKKyAgICAiRWxmIgorICB9OworICBzdGF0aWMgY29uc3QgZmxhdGJ1ZmZlcnM6OlR5cGVUYWJsZSB0dCA9IHsKKyAgICBmbGF0YnVmZmVyczo6U1RfRU5VTSwgNCwgdHlwZV9jb2RlcywgdHlwZV9yZWZzLCBudWxscHRyLCB2YWx1ZXMsIG5hbWVzCisgIH07CisgIHJldHVybiAmdHQ7Cit9CisKK2lubGluZSBjb25zdCBmbGF0YnVmZmVyczo6VHlwZVRhYmxlICpMb25nRW51bVR5cGVUYWJsZSgpIHsKKyAgc3RhdGljIGNvbnN0IGZsYXRidWZmZXJzOjpUeXBlQ29kZSB0eXBlX2NvZGVzW10gPSB7CisgICAgeyBmbGF0YnVmZmVyczo6RVRfVUxPTkcsIDAsIDAgfSwKKyAgICB7IGZsYXRidWZmZXJzOjpFVF9VTE9ORywgMCwgMCB9LAorICAgIHsgZmxhdGJ1ZmZlcnM6OkVUX1VMT05HLCAwLCAwIH0KKyAgfTsKKyAgc3RhdGljIGNvbnN0IGZsYXRidWZmZXJzOjpUeXBlRnVuY3Rpb24gdHlwZV9yZWZzW10gPSB7CisgICAgTXlHYW1lOjpFeGFtcGxlOjpMb25nRW51bVR5cGVUYWJsZQorICB9OworICBzdGF0aWMgY29uc3QgaW50NjRfdCB2YWx1ZXNbXSA9IHsgMlVMTCwgNFVMTCwgMTA5OTUxMTYyNzc3NlVMTCB9OworICBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IG5hbWVzW10gPSB7CisgICAgIkxvbmdPbmUiLAorICAgICJMb25nVHdvIiwKKyAgICAiTG9uZ0JpZyIKKyAgfTsKKyAgc3RhdGljIGNvbnN0IGZsYXRidWZmZXJzOjpUeXBlVGFibGUgdHQgPSB7CisgICAgZmxhdGJ1ZmZlcnM6OlNUX0VOVU0sIDMsIHR5cGVfY29kZXMsIHR5cGVfcmVmcywgbnVsbHB0ciwgdmFsdWVzLCBuYW1lcworICB9OworICByZXR1cm4gJnR0OworfQorCitpbmxpbmUgY29uc3QgZmxhdGJ1ZmZlcnM6OlR5cGVUYWJsZSAqQW55VHlwZVRhYmxlKCkgeworICBzdGF0aWMgY29uc3QgZmxhdGJ1ZmZlcnM6OlR5cGVDb2RlIHR5cGVfY29kZXNbXSA9IHsKKyAgICB7IGZsYXRidWZmZXJzOjpFVF9TRVFVRU5DRSwgMCwgLTEgfSwKKyAgICB7IGZsYXRidWZmZXJzOjpFVF9TRVFVRU5DRSwgMCwgMCB9LAorICAgIHsgZmxhdGJ1ZmZlcnM6OkVUX1NFUVVFTkNFLCAwLCAxIH0sCisgICAgeyBmbGF0YnVmZmVyczo6RVRfU0VRVUVOQ0UsIDAsIDIgfQorICB9OworICBzdGF0aWMgY29uc3QgZmxhdGJ1ZmZlcnM6OlR5cGVGdW5jdGlvbiB0eXBlX3JlZnNbXSA9IHsKKyAgICBNeUdhbWU6OkV4YW1wbGU6Ok1vbnN0ZXJUeXBlVGFibGUsCisgICAgTXlHYW1lOjpFeGFtcGxlOjpUZXN0U2ltcGxlVGFibGVXaXRoRW51bVR5cGVUYWJsZSwKKyAgICBNeUdhbWU6OkV4YW1wbGUyOjpNb25zdGVyVHlwZVRhYmxlCisgIH07CisgIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgbmFtZXNbXSA9IHsKKyAgICAiTk9ORSIsCisgICAgIk1vbnN0ZXIiLAorICAgICJUZXN0U2ltcGxlVGFibGVXaXRoRW51bSIsCisgICAgIk15R2FtZV9FeGFtcGxlMl9Nb25zdGVyIgorICB9OworICBzdGF0aWMgY29uc3QgZmxhdGJ1ZmZlcnM6OlR5cGVUYWJsZSB0dCA9IHsKKyAgICBmbGF0YnVmZmVyczo6U1RfVU5JT04sIDQsIHR5cGVfY29kZXMsIHR5cGVfcmVmcywgbnVsbHB0ciwgbnVsbHB0ciwgbmFtZXMKKyAgfTsKKyAgcmV0dXJuICZ0dDsKK30KKworaW5saW5lIGNvbnN0IGZsYXRidWZmZXJzOjpUeXBlVGFibGUgKkFueVVuaXF1ZUFsaWFzZXNUeXBlVGFibGUoKSB7CisgIHN0YXRpYyBjb25zdCBmbGF0YnVmZmVyczo6VHlwZUNvZGUgdHlwZV9jb2Rlc1tdID0geworICAgIHsgZmxhdGJ1ZmZlcnM6OkVUX1NFUVVFTkNFLCAwLCAtMSB9LAorICAgIHsgZmxhdGJ1ZmZlcnM6OkVUX1NFUVVFTkNFLCAwLCAwIH0sCisgICAgeyBmbGF0YnVmZmVyczo6RVRfU0VRVUVOQ0UsIDAsIDEgfSwKKyAgICB7IGZsYXRidWZmZXJzOjpFVF9TRVFVRU5DRSwgMCwgMiB9CisgIH07CisgIHN0YXRpYyBjb25zdCBmbGF0YnVmZmVyczo6VHlwZUZ1bmN0aW9uIHR5cGVfcmVmc1tdID0geworICAgIE15R2FtZTo6RXhhbXBsZTo6TW9uc3RlclR5cGVUYWJsZSwKKyAgICBNeUdhbWU6OkV4YW1wbGU6OlRlc3RTaW1wbGVUYWJsZVdpdGhFbnVtVHlwZVRhYmxlLAorICAgIE15R2FtZTo6RXhhbXBsZTI6Ok1vbnN0ZXJUeXBlVGFibGUKKyAgfTsKKyAgc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBuYW1lc1tdID0geworICAgICJOT05FIiwKKyAgICAiTSIsCisgICAgIlRTIiwKKyAgICAiTTIiCisgIH07CisgIHN0YXRpYyBjb25zdCBmbGF0YnVmZmVyczo6VHlwZVRhYmxlIHR0ID0geworICAgIGZsYXRidWZmZXJzOjpTVF9VTklPTiwgNCwgdHlwZV9jb2RlcywgdHlwZV9yZWZzLCBudWxscHRyLCBudWxscHRyLCBuYW1lcworICB9OworICByZXR1cm4gJnR0OworfQorCitpbmxpbmUgY29uc3QgZmxhdGJ1ZmZlcnM6OlR5cGVUYWJsZSAqQW55QW1iaWd1b3VzQWxpYXNlc1R5cGVUYWJsZSgpIHsKKyAgc3RhdGljIGNvbnN0IGZsYXRidWZmZXJzOjpUeXBlQ29kZSB0eXBlX2NvZGVzW10gPSB7CisgICAgeyBmbGF0YnVmZmVyczo6RVRfU0VRVUVOQ0UsIDAsIC0xIH0sCisgICAgeyBmbGF0YnVmZmVyczo6RVRfU0VRVUVOQ0UsIDAsIDAgfSwKKyAgICB7IGZsYXRidWZmZXJzOjpFVF9TRVFVRU5DRSwgMCwgMCB9LAorICAgIHsgZmxhdGJ1ZmZlcnM6OkVUX1NFUVVFTkNFLCAwLCAwIH0KKyAgfTsKKyAgc3RhdGljIGNvbnN0IGZsYXRidWZmZXJzOjpUeXBlRnVuY3Rpb24gdHlwZV9yZWZzW10gPSB7CisgICAgTXlHYW1lOjpFeGFtcGxlOjpNb25zdGVyVHlwZVRhYmxlCisgIH07CisgIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgbmFtZXNbXSA9IHsKKyAgICAiTk9ORSIsCisgICAgIk0xIiwKKyAgICAiTTIiLAorICAgICJNMyIKKyAgfTsKKyAgc3RhdGljIGNvbnN0IGZsYXRidWZmZXJzOjpUeXBlVGFibGUgdHQgPSB7CisgICAgZmxhdGJ1ZmZlcnM6OlNUX1VOSU9OLCA0LCB0eXBlX2NvZGVzLCB0eXBlX3JlZnMsIG51bGxwdHIsIG51bGxwdHIsIG5hbWVzCisgIH07CisgIHJldHVybiAmdHQ7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBFeGFtcGxlCisKK2lubGluZSBjb25zdCBmbGF0YnVmZmVyczo6VHlwZVRhYmxlICpJblBhcmVudE5hbWVzcGFjZVR5cGVUYWJsZSgpIHsKKyAgc3RhdGljIGNvbnN0IGZsYXRidWZmZXJzOjpUeXBlVGFibGUgdHQgPSB7CisgICAgZmxhdGJ1ZmZlcnM6OlNUX1RBQkxFLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyCisgIH07CisgIHJldHVybiAmdHQ7Cit9CisKK25hbWVzcGFjZSBFeGFtcGxlMiB7CisKK2lubGluZSBjb25zdCBmbGF0YnVmZmVyczo6VHlwZVRhYmxlICpNb25zdGVyVHlwZVRhYmxlKCkgeworICBzdGF0aWMgY29uc3QgZmxhdGJ1ZmZlcnM6OlR5cGVUYWJsZSB0dCA9IHsKKyAgICBmbGF0YnVmZmVyczo6U1RfVEFCTEUsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIKKyAgfTsKKyAgcmV0dXJuICZ0dDsKK30KKworfSAgLy8gbmFtZXNwYWNlIEV4YW1wbGUyCisKK25hbWVzcGFjZSBFeGFtcGxlIHsKKworaW5saW5lIGNvbnN0IGZsYXRidWZmZXJzOjpUeXBlVGFibGUgKlRlc3RUeXBlVGFibGUoKSB7CisgIHN0YXRpYyBjb25zdCBmbGF0YnVmZmVyczo6VHlwZUNvZGUgdHlwZV9jb2Rlc1tdID0geworICAgIHsgZmxhdGJ1ZmZlcnM6OkVUX1NIT1JULCAwLCAtMSB9LAorICAgIHsgZmxhdGJ1ZmZlcnM6OkVUX0NIQVIsIDAsIC0xIH0KKyAgfTsKKyAgc3RhdGljIGNvbnN0IGludDY0X3QgdmFsdWVzW10gPSB7IDAsIDIsIDQgfTsKKyAgc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBuYW1lc1tdID0geworICAgICJhIiwKKyAgICAiYiIKKyAgfTsKKyAgc3RhdGljIGNvbnN0IGZsYXRidWZmZXJzOjpUeXBlVGFibGUgdHQgPSB7CisgICAgZmxhdGJ1ZmZlcnM6OlNUX1NUUlVDVCwgMiwgdHlwZV9jb2RlcywgbnVsbHB0ciwgbnVsbHB0ciwgdmFsdWVzLCBuYW1lcworICB9OworICByZXR1cm4gJnR0OworfQorCitpbmxpbmUgY29uc3QgZmxhdGJ1ZmZlcnM6OlR5cGVUYWJsZSAqVGVzdFNpbXBsZVRhYmxlV2l0aEVudW1UeXBlVGFibGUoKSB7CisgIHN0YXRpYyBjb25zdCBmbGF0YnVmZmVyczo6VHlwZUNvZGUgdHlwZV9jb2Rlc1tdID0geworICAgIHsgZmxhdGJ1ZmZlcnM6OkVUX1VDSEFSLCAwLCAwIH0KKyAgfTsKKyAgc3RhdGljIGNvbnN0IGZsYXRidWZmZXJzOjpUeXBlRnVuY3Rpb24gdHlwZV9yZWZzW10gPSB7CisgICAgTXlHYW1lOjpFeGFtcGxlOjpDb2xvclR5cGVUYWJsZQorICB9OworICBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IG5hbWVzW10gPSB7CisgICAgImNvbG9yIgorICB9OworICBzdGF0aWMgY29uc3QgZmxhdGJ1ZmZlcnM6OlR5cGVUYWJsZSB0dCA9IHsKKyAgICBmbGF0YnVmZmVyczo6U1RfVEFCTEUsIDEsIHR5cGVfY29kZXMsIHR5cGVfcmVmcywgbnVsbHB0ciwgbnVsbHB0ciwgbmFtZXMKKyAgfTsKKyAgcmV0dXJuICZ0dDsKK30KKworaW5saW5lIGNvbnN0IGZsYXRidWZmZXJzOjpUeXBlVGFibGUgKlZlYzNUeXBlVGFibGUoKSB7CisgIHN0YXRpYyBjb25zdCBmbGF0YnVmZmVyczo6VHlwZUNvZGUgdHlwZV9jb2Rlc1tdID0geworICAgIHsgZmxhdGJ1ZmZlcnM6OkVUX0ZMT0FULCAwLCAtMSB9LAorICAgIHsgZmxhdGJ1ZmZlcnM6OkVUX0ZMT0FULCAwLCAtMSB9LAorICAgIHsgZmxhdGJ1ZmZlcnM6OkVUX0ZMT0FULCAwLCAtMSB9LAorICAgIHsgZmxhdGJ1ZmZlcnM6OkVUX0RPVUJMRSwgMCwgLTEgfSwKKyAgICB7IGZsYXRidWZmZXJzOjpFVF9VQ0hBUiwgMCwgMCB9LAorICAgIHsgZmxhdGJ1ZmZlcnM6OkVUX1NFUVVFTkNFLCAwLCAxIH0KKyAgfTsKKyAgc3RhdGljIGNvbnN0IGZsYXRidWZmZXJzOjpUeXBlRnVuY3Rpb24gdHlwZV9yZWZzW10gPSB7CisgICAgTXlHYW1lOjpFeGFtcGxlOjpDb2xvclR5cGVUYWJsZSwKKyAgICBNeUdhbWU6OkV4YW1wbGU6OlRlc3RUeXBlVGFibGUKKyAgfTsKKyAgc3RhdGljIGNvbnN0IGludDY0X3QgdmFsdWVzW10gPSB7IDAsIDQsIDgsIDE2LCAyNCwgMjYsIDMyIH07CisgIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgbmFtZXNbXSA9IHsKKyAgICAieCIsCisgICAgInkiLAorICAgICJ6IiwKKyAgICAidGVzdDEiLAorICAgICJ0ZXN0MiIsCisgICAgInRlc3QzIgorICB9OworICBzdGF0aWMgY29uc3QgZmxhdGJ1ZmZlcnM6OlR5cGVUYWJsZSB0dCA9IHsKKyAgICBmbGF0YnVmZmVyczo6U1RfU1RSVUNULCA2LCB0eXBlX2NvZGVzLCB0eXBlX3JlZnMsIG51bGxwdHIsIHZhbHVlcywgbmFtZXMKKyAgfTsKKyAgcmV0dXJuICZ0dDsKK30KKworaW5saW5lIGNvbnN0IGZsYXRidWZmZXJzOjpUeXBlVGFibGUgKkFiaWxpdHlUeXBlVGFibGUoKSB7CisgIHN0YXRpYyBjb25zdCBmbGF0YnVmZmVyczo6VHlwZUNvZGUgdHlwZV9jb2Rlc1tdID0geworICAgIHsgZmxhdGJ1ZmZlcnM6OkVUX1VJTlQsIDAsIC0xIH0sCisgICAgeyBmbGF0YnVmZmVyczo6RVRfVUlOVCwgMCwgLTEgfQorICB9OworICBzdGF0aWMgY29uc3QgaW50NjRfdCB2YWx1ZXNbXSA9IHsgMCwgNCwgOCB9OworICBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IG5hbWVzW10gPSB7CisgICAgImlkIiwKKyAgICAiZGlzdGFuY2UiCisgIH07CisgIHN0YXRpYyBjb25zdCBmbGF0YnVmZmVyczo6VHlwZVRhYmxlIHR0ID0geworICAgIGZsYXRidWZmZXJzOjpTVF9TVFJVQ1QsIDIsIHR5cGVfY29kZXMsIG51bGxwdHIsIG51bGxwdHIsIHZhbHVlcywgbmFtZXMKKyAgfTsKKyAgcmV0dXJuICZ0dDsKK30KKworaW5saW5lIGNvbnN0IGZsYXRidWZmZXJzOjpUeXBlVGFibGUgKlN0cnVjdE9mU3RydWN0c1R5cGVUYWJsZSgpIHsKKyAgc3RhdGljIGNvbnN0IGZsYXRidWZmZXJzOjpUeXBlQ29kZSB0eXBlX2NvZGVzW10gPSB7CisgICAgeyBmbGF0YnVmZmVyczo6RVRfU0VRVUVOQ0UsIDAsIDAgfSwKKyAgICB7IGZsYXRidWZmZXJzOjpFVF9TRVFVRU5DRSwgMCwgMSB9LAorICAgIHsgZmxhdGJ1ZmZlcnM6OkVUX1NFUVVFTkNFLCAwLCAwIH0KKyAgfTsKKyAgc3RhdGljIGNvbnN0IGZsYXRidWZmZXJzOjpUeXBlRnVuY3Rpb24gdHlwZV9yZWZzW10gPSB7CisgICAgTXlHYW1lOjpFeGFtcGxlOjpBYmlsaXR5VHlwZVRhYmxlLAorICAgIE15R2FtZTo6RXhhbXBsZTo6VGVzdFR5cGVUYWJsZQorICB9OworICBzdGF0aWMgY29uc3QgaW50NjRfdCB2YWx1ZXNbXSA9IHsgMCwgOCwgMTIsIDIwIH07CisgIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgbmFtZXNbXSA9IHsKKyAgICAiYSIsCisgICAgImIiLAorICAgICJjIgorICB9OworICBzdGF0aWMgY29uc3QgZmxhdGJ1ZmZlcnM6OlR5cGVUYWJsZSB0dCA9IHsKKyAgICBmbGF0YnVmZmVyczo6U1RfU1RSVUNULCAzLCB0eXBlX2NvZGVzLCB0eXBlX3JlZnMsIG51bGxwdHIsIHZhbHVlcywgbmFtZXMKKyAgfTsKKyAgcmV0dXJuICZ0dDsKK30KKworaW5saW5lIGNvbnN0IGZsYXRidWZmZXJzOjpUeXBlVGFibGUgKlN0cnVjdE9mU3RydWN0c09mU3RydWN0c1R5cGVUYWJsZSgpIHsKKyAgc3RhdGljIGNvbnN0IGZsYXRidWZmZXJzOjpUeXBlQ29kZSB0eXBlX2NvZGVzW10gPSB7CisgICAgeyBmbGF0YnVmZmVyczo6RVRfU0VRVUVOQ0UsIDAsIDAgfQorICB9OworICBzdGF0aWMgY29uc3QgZmxhdGJ1ZmZlcnM6OlR5cGVGdW5jdGlvbiB0eXBlX3JlZnNbXSA9IHsKKyAgICBNeUdhbWU6OkV4YW1wbGU6OlN0cnVjdE9mU3RydWN0c1R5cGVUYWJsZQorICB9OworICBzdGF0aWMgY29uc3QgaW50NjRfdCB2YWx1ZXNbXSA9IHsgMCwgMjAgfTsKKyAgc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBuYW1lc1tdID0geworICAgICJhIgorICB9OworICBzdGF0aWMgY29uc3QgZmxhdGJ1ZmZlcnM6OlR5cGVUYWJsZSB0dCA9IHsKKyAgICBmbGF0YnVmZmVyczo6U1RfU1RSVUNULCAxLCB0eXBlX2NvZGVzLCB0eXBlX3JlZnMsIG51bGxwdHIsIHZhbHVlcywgbmFtZXMKKyAgfTsKKyAgcmV0dXJuICZ0dDsKK30KKworaW5saW5lIGNvbnN0IGZsYXRidWZmZXJzOjpUeXBlVGFibGUgKlN0YXRUeXBlVGFibGUoKSB7CisgIHN0YXRpYyBjb25zdCBmbGF0YnVmZmVyczo6VHlwZUNvZGUgdHlwZV9jb2Rlc1tdID0geworICAgIHsgZmxhdGJ1ZmZlcnM6OkVUX1NUUklORywgMCwgLTEgfSwKKyAgICB7IGZsYXRidWZmZXJzOjpFVF9MT05HLCAwLCAtMSB9LAorICAgIHsgZmxhdGJ1ZmZlcnM6OkVUX1VTSE9SVCwgMCwgLTEgfQorICB9OworICBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IG5hbWVzW10gPSB7CisgICAgImlkIiwKKyAgICAidmFsIiwKKyAgICAiY291bnQiCisgIH07CisgIHN0YXRpYyBjb25zdCBmbGF0YnVmZmVyczo6VHlwZVRhYmxlIHR0ID0geworICAgIGZsYXRidWZmZXJzOjpTVF9UQUJMRSwgMywgdHlwZV9jb2RlcywgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0ciwgbmFtZXMKKyAgfTsKKyAgcmV0dXJuICZ0dDsKK30KKworaW5saW5lIGNvbnN0IGZsYXRidWZmZXJzOjpUeXBlVGFibGUgKlJlZmVycmFibGVUeXBlVGFibGUoKSB7CisgIHN0YXRpYyBjb25zdCBmbGF0YnVmZmVyczo6VHlwZUNvZGUgdHlwZV9jb2Rlc1tdID0geworICAgIHsgZmxhdGJ1ZmZlcnM6OkVUX1VMT05HLCAwLCAtMSB9CisgIH07CisgIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgbmFtZXNbXSA9IHsKKyAgICAiaWQiCisgIH07CisgIHN0YXRpYyBjb25zdCBmbGF0YnVmZmVyczo6VHlwZVRhYmxlIHR0ID0geworICAgIGZsYXRidWZmZXJzOjpTVF9UQUJMRSwgMSwgdHlwZV9jb2RlcywgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0ciwgbmFtZXMKKyAgfTsKKyAgcmV0dXJuICZ0dDsKK30KKworaW5saW5lIGNvbnN0IGZsYXRidWZmZXJzOjpUeXBlVGFibGUgKk1vbnN0ZXJUeXBlVGFibGUoKSB7CisgIHN0YXRpYyBjb25zdCBmbGF0YnVmZmVyczo6VHlwZUNvZGUgdHlwZV9jb2Rlc1tdID0geworICAgIHsgZmxhdGJ1ZmZlcnM6OkVUX1NFUVVFTkNFLCAwLCAwIH0sCisgICAgeyBmbGF0YnVmZmVyczo6RVRfU0hPUlQsIDAsIC0xIH0sCisgICAgeyBmbGF0YnVmZmVyczo6RVRfU0hPUlQsIDAsIC0xIH0sCisgICAgeyBmbGF0YnVmZmVyczo6RVRfU1RSSU5HLCAwLCAtMSB9LAorICAgIHsgZmxhdGJ1ZmZlcnM6OkVUX0JPT0wsIDAsIC0xIH0sCisgICAgeyBmbGF0YnVmZmVyczo6RVRfVUNIQVIsIDEsIC0xIH0sCisgICAgeyBmbGF0YnVmZmVyczo6RVRfVUNIQVIsIDAsIDEgfSwKKyAgICB7IGZsYXRidWZmZXJzOjpFVF9VVFlQRSwgMCwgMiB9LAorICAgIHsgZmxhdGJ1ZmZlcnM6OkVUX1NFUVVFTkNFLCAwLCAyIH0sCisgICAgeyBmbGF0YnVmZmVyczo6RVRfU0VRVUVOQ0UsIDEsIDMgfSwKKyAgICB7IGZsYXRidWZmZXJzOjpFVF9TVFJJTkcsIDEsIC0xIH0sCisgICAgeyBmbGF0YnVmZmVyczo6RVRfU0VRVUVOQ0UsIDEsIDQgfSwKKyAgICB7IGZsYXRidWZmZXJzOjpFVF9TRVFVRU5DRSwgMCwgNCB9LAorICAgIHsgZmxhdGJ1ZmZlcnM6OkVUX1VDSEFSLCAxLCAtMSB9LAorICAgIHsgZmxhdGJ1ZmZlcnM6OkVUX1NFUVVFTkNFLCAwLCA1IH0sCisgICAgeyBmbGF0YnVmZmVyczo6RVRfQk9PTCwgMCwgLTEgfSwKKyAgICB7IGZsYXRidWZmZXJzOjpFVF9JTlQsIDAsIC0xIH0sCisgICAgeyBmbGF0YnVmZmVyczo6RVRfVUlOVCwgMCwgLTEgfSwKKyAgICB7IGZsYXRidWZmZXJzOjpFVF9MT05HLCAwLCAtMSB9LAorICAgIHsgZmxhdGJ1ZmZlcnM6OkVUX1VMT05HLCAwLCAtMSB9LAorICAgIHsgZmxhdGJ1ZmZlcnM6OkVUX0lOVCwgMCwgLTEgfSwKKyAgICB7IGZsYXRidWZmZXJzOjpFVF9VSU5ULCAwLCAtMSB9LAorICAgIHsgZmxhdGJ1ZmZlcnM6OkVUX0xPTkcsIDAsIC0xIH0sCisgICAgeyBmbGF0YnVmZmVyczo6RVRfVUxPTkcsIDAsIC0xIH0sCisgICAgeyBmbGF0YnVmZmVyczo6RVRfQk9PTCwgMSwgLTEgfSwKKyAgICB7IGZsYXRidWZmZXJzOjpFVF9GTE9BVCwgMCwgLTEgfSwKKyAgICB7IGZsYXRidWZmZXJzOjpFVF9GTE9BVCwgMCwgLTEgfSwKKyAgICB7IGZsYXRidWZmZXJzOjpFVF9GTE9BVCwgMCwgLTEgfSwKKyAgICB7IGZsYXRidWZmZXJzOjpFVF9TVFJJTkcsIDEsIC0xIH0sCisgICAgeyBmbGF0YnVmZmVyczo6RVRfU0VRVUVOQ0UsIDEsIDYgfSwKKyAgICB7IGZsYXRidWZmZXJzOjpFVF9VQ0hBUiwgMSwgLTEgfSwKKyAgICB7IGZsYXRidWZmZXJzOjpFVF9TRVFVRU5DRSwgMSwgMyB9LAorICAgIHsgZmxhdGJ1ZmZlcnM6OkVUX0xPTkcsIDEsIC0xIH0sCisgICAgeyBmbGF0YnVmZmVyczo6RVRfRE9VQkxFLCAxLCAtMSB9LAorICAgIHsgZmxhdGJ1ZmZlcnM6OkVUX1NFUVVFTkNFLCAwLCA3IH0sCisgICAgeyBmbGF0YnVmZmVyczo6RVRfU0VRVUVOQ0UsIDEsIDggfSwKKyAgICB7IGZsYXRidWZmZXJzOjpFVF9VTE9ORywgMCwgLTEgfSwKKyAgICB7IGZsYXRidWZmZXJzOjpFVF9VTE9ORywgMSwgLTEgfSwKKyAgICB7IGZsYXRidWZmZXJzOjpFVF9TRVFVRU5DRSwgMSwgOCB9LAorICAgIHsgZmxhdGJ1ZmZlcnM6OkVUX1VMT05HLCAwLCAtMSB9LAorICAgIHsgZmxhdGJ1ZmZlcnM6OkVUX1VMT05HLCAxLCAtMSB9LAorICAgIHsgZmxhdGJ1ZmZlcnM6OkVUX1VMT05HLCAwLCAtMSB9LAorICAgIHsgZmxhdGJ1ZmZlcnM6OkVUX1VMT05HLCAxLCAtMSB9LAorICAgIHsgZmxhdGJ1ZmZlcnM6OkVUX1VUWVBFLCAwLCA5IH0sCisgICAgeyBmbGF0YnVmZmVyczo6RVRfU0VRVUVOQ0UsIDAsIDkgfSwKKyAgICB7IGZsYXRidWZmZXJzOjpFVF9VVFlQRSwgMCwgMTAgfSwKKyAgICB7IGZsYXRidWZmZXJzOjpFVF9TRVFVRU5DRSwgMCwgMTAgfSwKKyAgICB7IGZsYXRidWZmZXJzOjpFVF9VQ0hBUiwgMSwgMSB9LAorICAgIHsgZmxhdGJ1ZmZlcnM6OkVUX0NIQVIsIDAsIDExIH0sCisgICAgeyBmbGF0YnVmZmVyczo6RVRfVUNIQVIsIDEsIC0xIH0sCisgICAgeyBmbGF0YnVmZmVyczo6RVRfU0VRVUVOQ0UsIDEsIDUgfSwKKyAgICB7IGZsYXRidWZmZXJzOjpFVF9TRVFVRU5DRSwgMCwgMyB9LAorICAgIHsgZmxhdGJ1ZmZlcnM6OkVUX1VMT05HLCAwLCAxMiB9LAorICAgIHsgZmxhdGJ1ZmZlcnM6OkVUX1VMT05HLCAwLCAxMiB9CisgIH07CisgIHN0YXRpYyBjb25zdCBmbGF0YnVmZmVyczo6VHlwZUZ1bmN0aW9uIHR5cGVfcmVmc1tdID0geworICAgIE15R2FtZTo6RXhhbXBsZTo6VmVjM1R5cGVUYWJsZSwKKyAgICBNeUdhbWU6OkV4YW1wbGU6OkNvbG9yVHlwZVRhYmxlLAorICAgIE15R2FtZTo6RXhhbXBsZTo6QW55VHlwZVRhYmxlLAorICAgIE15R2FtZTo6RXhhbXBsZTo6VGVzdFR5cGVUYWJsZSwKKyAgICBNeUdhbWU6OkV4YW1wbGU6Ok1vbnN0ZXJUeXBlVGFibGUsCisgICAgTXlHYW1lOjpFeGFtcGxlOjpTdGF0VHlwZVRhYmxlLAorICAgIE15R2FtZTo6RXhhbXBsZTo6QWJpbGl0eVR5cGVUYWJsZSwKKyAgICBNeUdhbWU6OkluUGFyZW50TmFtZXNwYWNlVHlwZVRhYmxlLAorICAgIE15R2FtZTo6RXhhbXBsZTo6UmVmZXJyYWJsZVR5cGVUYWJsZSwKKyAgICBNeUdhbWU6OkV4YW1wbGU6OkFueVVuaXF1ZUFsaWFzZXNUeXBlVGFibGUsCisgICAgTXlHYW1lOjpFeGFtcGxlOjpBbnlBbWJpZ3VvdXNBbGlhc2VzVHlwZVRhYmxlLAorICAgIE15R2FtZTo6RXhhbXBsZTo6UmFjZVR5cGVUYWJsZSwKKyAgICBNeUdhbWU6OkV4YW1wbGU6OkxvbmdFbnVtVHlwZVRhYmxlCisgIH07CisgIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgbmFtZXNbXSA9IHsKKyAgICAicG9zIiwKKyAgICAibWFuYSIsCisgICAgImhwIiwKKyAgICAibmFtZSIsCisgICAgImZyaWVuZGx5IiwKKyAgICAiaW52ZW50b3J5IiwKKyAgICAiY29sb3IiLAorICAgICJ0ZXN0X3R5cGUiLAorICAgICJ0ZXN0IiwKKyAgICAidGVzdDQiLAorICAgICJ0ZXN0YXJyYXlvZnN0cmluZyIsCisgICAgInRlc3RhcnJheW9mdGFibGVzIiwKKyAgICAiZW5lbXkiLAorICAgICJ0ZXN0bmVzdGVkZmxhdGJ1ZmZlciIsCisgICAgInRlc3RlbXB0eSIsCisgICAgInRlc3Rib29sIiwKKyAgICAidGVzdGhhc2hzMzJfZm52MSIsCisgICAgInRlc3RoYXNodTMyX2ZudjEiLAorICAgICJ0ZXN0aGFzaHM2NF9mbnYxIiwKKyAgICAidGVzdGhhc2h1NjRfZm52MSIsCisgICAgInRlc3RoYXNoczMyX2ZudjFhIiwKKyAgICAidGVzdGhhc2h1MzJfZm52MWEiLAorICAgICJ0ZXN0aGFzaHM2NF9mbnYxYSIsCisgICAgInRlc3RoYXNodTY0X2ZudjFhIiwKKyAgICAidGVzdGFycmF5b2Zib29scyIsCisgICAgInRlc3RmIiwKKyAgICAidGVzdGYyIiwKKyAgICAidGVzdGYzIiwKKyAgICAidGVzdGFycmF5b2ZzdHJpbmcyIiwKKyAgICAidGVzdGFycmF5b2Zzb3J0ZWRzdHJ1Y3QiLAorICAgICJmbGV4IiwKKyAgICAidGVzdDUiLAorICAgICJ2ZWN0b3Jfb2ZfbG9uZ3MiLAorICAgICJ2ZWN0b3Jfb2ZfZG91YmxlcyIsCisgICAgInBhcmVudF9uYW1lc3BhY2VfdGVzdCIsCisgICAgInZlY3Rvcl9vZl9yZWZlcnJhYmxlcyIsCisgICAgInNpbmdsZV93ZWFrX3JlZmVyZW5jZSIsCisgICAgInZlY3Rvcl9vZl93ZWFrX3JlZmVyZW5jZXMiLAorICAgICJ2ZWN0b3Jfb2Zfc3Ryb25nX3JlZmVycmFibGVzIiwKKyAgICAiY29fb3duaW5nX3JlZmVyZW5jZSIsCisgICAgInZlY3Rvcl9vZl9jb19vd25pbmdfcmVmZXJlbmNlcyIsCisgICAgIm5vbl9vd25pbmdfcmVmZXJlbmNlIiwKKyAgICAidmVjdG9yX29mX25vbl9vd25pbmdfcmVmZXJlbmNlcyIsCisgICAgImFueV91bmlxdWVfdHlwZSIsCisgICAgImFueV91bmlxdWUiLAorICAgICJhbnlfYW1iaWd1b3VzX3R5cGUiLAorICAgICJhbnlfYW1iaWd1b3VzIiwKKyAgICAidmVjdG9yX29mX2VudW1zIiwKKyAgICAic2lnbmVkX2VudW0iLAorICAgICJ0ZXN0cmVxdWlyZWRuZXN0ZWRmbGF0YnVmZmVyIiwKKyAgICAic2NhbGFyX2tleV9zb3J0ZWRfdGFibGVzIiwKKyAgICAibmF0aXZlX2lubGluZSIsCisgICAgImxvbmdfZW51bV9ub25fZW51bV9kZWZhdWx0IiwKKyAgICAibG9uZ19lbnVtX25vcm1hbF9kZWZhdWx0IgorICB9OworICBzdGF0aWMgY29uc3QgZmxhdGJ1ZmZlcnM6OlR5cGVUYWJsZSB0dCA9IHsKKyAgICBmbGF0YnVmZmVyczo6U1RfVEFCTEUsIDU0LCB0eXBlX2NvZGVzLCB0eXBlX3JlZnMsIG51bGxwdHIsIG51bGxwdHIsIG5hbWVzCisgIH07CisgIHJldHVybiAmdHQ7Cit9CisKK2lubGluZSBjb25zdCBmbGF0YnVmZmVyczo6VHlwZVRhYmxlICpUeXBlQWxpYXNlc1R5cGVUYWJsZSgpIHsKKyAgc3RhdGljIGNvbnN0IGZsYXRidWZmZXJzOjpUeXBlQ29kZSB0eXBlX2NvZGVzW10gPSB7CisgICAgeyBmbGF0YnVmZmVyczo6RVRfQ0hBUiwgMCwgLTEgfSwKKyAgICB7IGZsYXRidWZmZXJzOjpFVF9VQ0hBUiwgMCwgLTEgfSwKKyAgICB7IGZsYXRidWZmZXJzOjpFVF9TSE9SVCwgMCwgLTEgfSwKKyAgICB7IGZsYXRidWZmZXJzOjpFVF9VU0hPUlQsIDAsIC0xIH0sCisgICAgeyBmbGF0YnVmZmVyczo6RVRfSU5ULCAwLCAtMSB9LAorICAgIHsgZmxhdGJ1ZmZlcnM6OkVUX1VJTlQsIDAsIC0xIH0sCisgICAgeyBmbGF0YnVmZmVyczo6RVRfTE9ORywgMCwgLTEgfSwKKyAgICB7IGZsYXRidWZmZXJzOjpFVF9VTE9ORywgMCwgLTEgfSwKKyAgICB7IGZsYXRidWZmZXJzOjpFVF9GTE9BVCwgMCwgLTEgfSwKKyAgICB7IGZsYXRidWZmZXJzOjpFVF9ET1VCTEUsIDAsIC0xIH0sCisgICAgeyBmbGF0YnVmZmVyczo6RVRfQ0hBUiwgMSwgLTEgfSwKKyAgICB7IGZsYXRidWZmZXJzOjpFVF9ET1VCTEUsIDEsIC0xIH0KKyAgfTsKKyAgc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBuYW1lc1tdID0geworICAgICJpOCIsCisgICAgInU4IiwKKyAgICAiaTE2IiwKKyAgICAidTE2IiwKKyAgICAiaTMyIiwKKyAgICAidTMyIiwKKyAgICAiaTY0IiwKKyAgICAidTY0IiwKKyAgICAiZjMyIiwKKyAgICAiZjY0IiwKKyAgICAidjgiLAorICAgICJ2ZjY0IgorICB9OworICBzdGF0aWMgY29uc3QgZmxhdGJ1ZmZlcnM6OlR5cGVUYWJsZSB0dCA9IHsKKyAgICBmbGF0YnVmZmVyczo6U1RfVEFCTEUsIDEyLCB0eXBlX2NvZGVzLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyLCBuYW1lcworICB9OworICByZXR1cm4gJnR0OworfQorCitpbmxpbmUgY29uc3QgTXlHYW1lOjpFeGFtcGxlOjpNb25zdGVyICpHZXRNb25zdGVyKGNvbnN0IHZvaWQgKmJ1ZikgeworICByZXR1cm4gZmxhdGJ1ZmZlcnM6OkdldFJvb3Q8TXlHYW1lOjpFeGFtcGxlOjpNb25zdGVyPihidWYpOworfQorCitpbmxpbmUgY29uc3QgTXlHYW1lOjpFeGFtcGxlOjpNb25zdGVyICpHZXRTaXplUHJlZml4ZWRNb25zdGVyKGNvbnN0IHZvaWQgKmJ1ZikgeworICByZXR1cm4gZmxhdGJ1ZmZlcnM6OkdldFNpemVQcmVmaXhlZFJvb3Q8TXlHYW1lOjpFeGFtcGxlOjpNb25zdGVyPihidWYpOworfQorCitpbmxpbmUgTW9uc3RlciAqR2V0TXV0YWJsZU1vbnN0ZXIodm9pZCAqYnVmKSB7CisgIHJldHVybiBmbGF0YnVmZmVyczo6R2V0TXV0YWJsZVJvb3Q8TW9uc3Rlcj4oYnVmKTsKK30KKworaW5saW5lIE15R2FtZTo6RXhhbXBsZTo6TW9uc3RlciAqR2V0TXV0YWJsZVNpemVQcmVmaXhlZE1vbnN0ZXIodm9pZCAqYnVmKSB7CisgIHJldHVybiBmbGF0YnVmZmVyczo6R2V0TXV0YWJsZVNpemVQcmVmaXhlZFJvb3Q8TXlHYW1lOjpFeGFtcGxlOjpNb25zdGVyPihidWYpOworfQorCitpbmxpbmUgY29uc3QgY2hhciAqTW9uc3RlcklkZW50aWZpZXIoKSB7CisgIHJldHVybiAiTU9OUyI7Cit9CisKK2lubGluZSBib29sIE1vbnN0ZXJCdWZmZXJIYXNJZGVudGlmaWVyKGNvbnN0IHZvaWQgKmJ1ZikgeworICByZXR1cm4gZmxhdGJ1ZmZlcnM6OkJ1ZmZlckhhc0lkZW50aWZpZXIoCisgICAgICBidWYsIE1vbnN0ZXJJZGVudGlmaWVyKCkpOworfQorCitpbmxpbmUgYm9vbCBTaXplUHJlZml4ZWRNb25zdGVyQnVmZmVySGFzSWRlbnRpZmllcihjb25zdCB2b2lkICpidWYpIHsKKyAgcmV0dXJuIGZsYXRidWZmZXJzOjpCdWZmZXJIYXNJZGVudGlmaWVyKAorICAgICAgYnVmLCBNb25zdGVySWRlbnRpZmllcigpLCB0cnVlKTsKK30KKworaW5saW5lIGJvb2wgVmVyaWZ5TW9uc3RlckJ1ZmZlcigKKyAgICBmbGF0YnVmZmVyczo6VmVyaWZpZXIgJnZlcmlmaWVyKSB7CisgIHJldHVybiB2ZXJpZmllci5WZXJpZnlCdWZmZXI8TXlHYW1lOjpFeGFtcGxlOjpNb25zdGVyPihNb25zdGVySWRlbnRpZmllcigpKTsKK30KKworaW5saW5lIGJvb2wgVmVyaWZ5U2l6ZVByZWZpeGVkTW9uc3RlckJ1ZmZlcigKKyAgICBmbGF0YnVmZmVyczo6VmVyaWZpZXIgJnZlcmlmaWVyKSB7CisgIHJldHVybiB2ZXJpZmllci5WZXJpZnlTaXplUHJlZml4ZWRCdWZmZXI8TXlHYW1lOjpFeGFtcGxlOjpNb25zdGVyPihNb25zdGVySWRlbnRpZmllcigpKTsKK30KKworaW5saW5lIGNvbnN0IGNoYXIgKk1vbnN0ZXJFeHRlbnNpb24oKSB7CisgIHJldHVybiAibW9uIjsKK30KKworaW5saW5lIHZvaWQgRmluaXNoTW9uc3RlckJ1ZmZlcigKKyAgICBmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJmZiYiwKKyAgICBmbGF0YnVmZmVyczo6T2Zmc2V0PE15R2FtZTo6RXhhbXBsZTo6TW9uc3Rlcj4gcm9vdCkgeworICBmYmIuRmluaXNoKHJvb3QsIE1vbnN0ZXJJZGVudGlmaWVyKCkpOworfQorCitpbmxpbmUgdm9pZCBGaW5pc2hTaXplUHJlZml4ZWRNb25zdGVyQnVmZmVyKAorICAgIGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmZmJiLAorICAgIGZsYXRidWZmZXJzOjpPZmZzZXQ8TXlHYW1lOjpFeGFtcGxlOjpNb25zdGVyPiByb290KSB7CisgIGZiYi5GaW5pc2hTaXplUHJlZml4ZWQocm9vdCwgTW9uc3RlcklkZW50aWZpZXIoKSk7Cit9CisKK2lubGluZSBmbGF0YnVmZmVyczo6dW5pcXVlX3B0cjxNeUdhbWU6OkV4YW1wbGU6Ok1vbnN0ZXJUPiBVblBhY2tNb25zdGVyKAorICAgIGNvbnN0IHZvaWQgKmJ1ZiwKKyAgICBjb25zdCBmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqcmVzID0gbnVsbHB0cikgeworICByZXR1cm4gZmxhdGJ1ZmZlcnM6OnVuaXF1ZV9wdHI8TXlHYW1lOjpFeGFtcGxlOjpNb25zdGVyVD4oR2V0TW9uc3RlcihidWYpLT5VblBhY2socmVzKSk7Cit9CisKK2lubGluZSBmbGF0YnVmZmVyczo6dW5pcXVlX3B0cjxNeUdhbWU6OkV4YW1wbGU6Ok1vbnN0ZXJUPiBVblBhY2tTaXplUHJlZml4ZWRNb25zdGVyKAorICAgIGNvbnN0IHZvaWQgKmJ1ZiwKKyAgICBjb25zdCBmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqcmVzID0gbnVsbHB0cikgeworICByZXR1cm4gZmxhdGJ1ZmZlcnM6OnVuaXF1ZV9wdHI8TXlHYW1lOjpFeGFtcGxlOjpNb25zdGVyVD4oR2V0U2l6ZVByZWZpeGVkTW9uc3RlcihidWYpLT5VblBhY2socmVzKSk7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBFeGFtcGxlCit9ICAvLyBuYW1lc3BhY2UgTXlHYW1lCisKKyNlbmRpZiAgLy8gRkxBVEJVRkZFUlNfR0VORVJBVEVEX01PTlNURVJURVNUX01ZR0FNRV9FWEFNUExFX0hfCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9tb25zdGVyX3Rlc3Rfc3VmZml4L21vbnN0ZXJfdGVzdC5ncnBjLmZiLmNjIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvbW9uc3Rlcl90ZXN0X3N1ZmZpeC9tb25zdGVyX3Rlc3QuZ3JwYy5mYi5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NjgwZjRmCi0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvbW9uc3Rlcl90ZXN0X3N1ZmZpeC9tb25zdGVyX3Rlc3QuZ3JwYy5mYi5jYwpAQCAtMCwwICsxLDEzMSBAQAorLy8gR2VuZXJhdGVkIGJ5IHRoZSBnUlBDIEMrKyBwbHVnaW4uCisvLyBJZiB5b3UgbWFrZSBhbnkgbG9jYWwgY2hhbmdlLCB0aGV5IHdpbGwgYmUgbG9zdC4KKy8vIHNvdXJjZTogbW9uc3Rlcl90ZXN0CisKKyNpbmNsdWRlICJtb25zdGVyX3Rlc3Rfc3VmZml4LmhwcCIKKyNpbmNsdWRlICJtb25zdGVyX3Rlc3QuZ3JwYy5mYi5oIgorCisjaW5jbHVkZSA8Z3JwY3BwL2ltcGwvY29kZWdlbi9hc3luY19zdHJlYW0uaD4KKyNpbmNsdWRlIDxncnBjcHAvaW1wbC9jb2RlZ2VuL2FzeW5jX3VuYXJ5X2NhbGwuaD4KKyNpbmNsdWRlIDxncnBjcHAvaW1wbC9jb2RlZ2VuL2NoYW5uZWxfaW50ZXJmYWNlLmg+CisjaW5jbHVkZSA8Z3JwY3BwL2ltcGwvY29kZWdlbi9jbGllbnRfdW5hcnlfY2FsbC5oPgorI2luY2x1ZGUgPGdycGNwcC9pbXBsL2NvZGVnZW4vbWV0aG9kX2hhbmRsZXIuaD4KKyNpbmNsdWRlIDxncnBjcHAvaW1wbC9jb2RlZ2VuL3JwY19zZXJ2aWNlX21ldGhvZC5oPgorI2luY2x1ZGUgPGdycGNwcC9pbXBsL2NvZGVnZW4vc2VydmljZV90eXBlLmg+CisjaW5jbHVkZSA8Z3JwY3BwL2ltcGwvY29kZWdlbi9zeW5jX3N0cmVhbS5oPgorbmFtZXNwYWNlIE15R2FtZSB7CituYW1lc3BhY2UgRXhhbXBsZSB7CisKK3N0YXRpYyBjb25zdCBjaGFyKiBNb25zdGVyU3RvcmFnZV9tZXRob2RfbmFtZXNbXSA9IHsKKyAgIi9NeUdhbWUuRXhhbXBsZS5Nb25zdGVyU3RvcmFnZS9TdG9yZSIsCisgICIvTXlHYW1lLkV4YW1wbGUuTW9uc3RlclN0b3JhZ2UvUmV0cmlldmUiLAorICAiL015R2FtZS5FeGFtcGxlLk1vbnN0ZXJTdG9yYWdlL0dldE1heEhpdFBvaW50IiwKKyAgIi9NeUdhbWUuRXhhbXBsZS5Nb25zdGVyU3RvcmFnZS9HZXRNaW5NYXhIaXRQb2ludHMiLAorfTsKKworc3RkOjp1bmlxdWVfcHRyPCBNb25zdGVyU3RvcmFnZTo6U3R1Yj4gTW9uc3RlclN0b3JhZ2U6Ok5ld1N0dWIoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPCA6OmdycGM6OkNoYW5uZWxJbnRlcmZhY2U+JiBjaGFubmVsLCBjb25zdCA6OmdycGM6OlN0dWJPcHRpb25zJiAvKm9wdGlvbnMqLykgeworICBzdGQ6OnVuaXF1ZV9wdHI8IE1vbnN0ZXJTdG9yYWdlOjpTdHViPiBzdHViKG5ldyBNb25zdGVyU3RvcmFnZTo6U3R1YihjaGFubmVsKSk7CisgIHJldHVybiBzdHViOworfQorCitNb25zdGVyU3RvcmFnZTo6U3R1Yjo6U3R1Yihjb25zdCBzdGQ6OnNoYXJlZF9wdHI8IDo6Z3JwYzo6Q2hhbm5lbEludGVyZmFjZT4mIGNoYW5uZWwpCisgIDogY2hhbm5lbF8oY2hhbm5lbCkgICwgcnBjbWV0aG9kX1N0b3JlXyhNb25zdGVyU3RvcmFnZV9tZXRob2RfbmFtZXNbMF0sIDo6Z3JwYzo6aW50ZXJuYWw6OlJwY01ldGhvZDo6Tk9STUFMX1JQQywgY2hhbm5lbCkKKyAgLCBycGNtZXRob2RfUmV0cmlldmVfKE1vbnN0ZXJTdG9yYWdlX21ldGhvZF9uYW1lc1sxXSwgOjpncnBjOjppbnRlcm5hbDo6UnBjTWV0aG9kOjpTRVJWRVJfU1RSRUFNSU5HLCBjaGFubmVsKQorICAsIHJwY21ldGhvZF9HZXRNYXhIaXRQb2ludF8oTW9uc3RlclN0b3JhZ2VfbWV0aG9kX25hbWVzWzJdLCA6OmdycGM6OmludGVybmFsOjpScGNNZXRob2Q6OkNMSUVOVF9TVFJFQU1JTkcsIGNoYW5uZWwpCisgICwgcnBjbWV0aG9kX0dldE1pbk1heEhpdFBvaW50c18oTW9uc3RlclN0b3JhZ2VfbWV0aG9kX25hbWVzWzNdLCA6OmdycGM6OmludGVybmFsOjpScGNNZXRob2Q6OkJJRElfU1RSRUFNSU5HLCBjaGFubmVsKQorICB7fQorICAKKzo6Z3JwYzo6U3RhdHVzIE1vbnN0ZXJTdG9yYWdlOjpTdHViOjpTdG9yZSg6OmdycGM6OkNsaWVudENvbnRleHQqIGNvbnRleHQsIGNvbnN0IGZsYXRidWZmZXJzOjpncnBjOjpNZXNzYWdlPE1vbnN0ZXI+JiByZXF1ZXN0LCBmbGF0YnVmZmVyczo6Z3JwYzo6TWVzc2FnZTxTdGF0PiogcmVzcG9uc2UpIHsKKyAgcmV0dXJuIDo6Z3JwYzo6aW50ZXJuYWw6OkJsb2NraW5nVW5hcnlDYWxsKGNoYW5uZWxfLmdldCgpLCBycGNtZXRob2RfU3RvcmVfLCBjb250ZXh0LCByZXF1ZXN0LCByZXNwb25zZSk7Cit9CisKKzo6Z3JwYzo6Q2xpZW50QXN5bmNSZXNwb25zZVJlYWRlcjwgZmxhdGJ1ZmZlcnM6OmdycGM6Ok1lc3NhZ2U8U3RhdD4+KiBNb25zdGVyU3RvcmFnZTo6U3R1Yjo6QXN5bmNTdG9yZVJhdyg6OmdycGM6OkNsaWVudENvbnRleHQqIGNvbnRleHQsIGNvbnN0IGZsYXRidWZmZXJzOjpncnBjOjpNZXNzYWdlPE1vbnN0ZXI+JiByZXF1ZXN0LCA6OmdycGM6OkNvbXBsZXRpb25RdWV1ZSogY3EpIHsKKyAgcmV0dXJuIDo6Z3JwYzo6aW50ZXJuYWw6OkNsaWVudEFzeW5jUmVzcG9uc2VSZWFkZXJGYWN0b3J5PCBmbGF0YnVmZmVyczo6Z3JwYzo6TWVzc2FnZTxTdGF0Pj46OkNyZWF0ZShjaGFubmVsXy5nZXQoKSwgY3EsIHJwY21ldGhvZF9TdG9yZV8sIGNvbnRleHQsIHJlcXVlc3QsIHRydWUpOworfQorCis6OmdycGM6OkNsaWVudEFzeW5jUmVzcG9uc2VSZWFkZXI8IGZsYXRidWZmZXJzOjpncnBjOjpNZXNzYWdlPFN0YXQ+PiogTW9uc3RlclN0b3JhZ2U6OlN0dWI6OlByZXBhcmVBc3luY1N0b3JlUmF3KDo6Z3JwYzo6Q2xpZW50Q29udGV4dCogY29udGV4dCwgY29uc3QgZmxhdGJ1ZmZlcnM6OmdycGM6Ok1lc3NhZ2U8TW9uc3Rlcj4mIHJlcXVlc3QsIDo6Z3JwYzo6Q29tcGxldGlvblF1ZXVlKiBjcSkgeworICByZXR1cm4gOjpncnBjOjppbnRlcm5hbDo6Q2xpZW50QXN5bmNSZXNwb25zZVJlYWRlckZhY3Rvcnk8IGZsYXRidWZmZXJzOjpncnBjOjpNZXNzYWdlPFN0YXQ+Pjo6Q3JlYXRlKGNoYW5uZWxfLmdldCgpLCBjcSwgcnBjbWV0aG9kX1N0b3JlXywgY29udGV4dCwgcmVxdWVzdCwgZmFsc2UpOworfQorCis6OmdycGM6OkNsaWVudFJlYWRlcjwgZmxhdGJ1ZmZlcnM6OmdycGM6Ok1lc3NhZ2U8TW9uc3Rlcj4+KiBNb25zdGVyU3RvcmFnZTo6U3R1Yjo6UmV0cmlldmVSYXcoOjpncnBjOjpDbGllbnRDb250ZXh0KiBjb250ZXh0LCBjb25zdCBmbGF0YnVmZmVyczo6Z3JwYzo6TWVzc2FnZTxTdGF0PiYgcmVxdWVzdCkgeworICByZXR1cm4gOjpncnBjOjppbnRlcm5hbDo6Q2xpZW50UmVhZGVyRmFjdG9yeTwgZmxhdGJ1ZmZlcnM6OmdycGM6Ok1lc3NhZ2U8TW9uc3Rlcj4+OjpDcmVhdGUoY2hhbm5lbF8uZ2V0KCksIHJwY21ldGhvZF9SZXRyaWV2ZV8sIGNvbnRleHQsIHJlcXVlc3QpOworfQorCis6OmdycGM6OkNsaWVudEFzeW5jUmVhZGVyPCBmbGF0YnVmZmVyczo6Z3JwYzo6TWVzc2FnZTxNb25zdGVyPj4qIE1vbnN0ZXJTdG9yYWdlOjpTdHViOjpBc3luY1JldHJpZXZlUmF3KDo6Z3JwYzo6Q2xpZW50Q29udGV4dCogY29udGV4dCwgY29uc3QgZmxhdGJ1ZmZlcnM6OmdycGM6Ok1lc3NhZ2U8U3RhdD4mIHJlcXVlc3QsIDo6Z3JwYzo6Q29tcGxldGlvblF1ZXVlKiBjcSwgdm9pZCogdGFnKSB7CisgIHJldHVybiA6OmdycGM6OmludGVybmFsOjpDbGllbnRBc3luY1JlYWRlckZhY3Rvcnk8IGZsYXRidWZmZXJzOjpncnBjOjpNZXNzYWdlPE1vbnN0ZXI+Pjo6Q3JlYXRlKGNoYW5uZWxfLmdldCgpLCBjcSwgcnBjbWV0aG9kX1JldHJpZXZlXywgY29udGV4dCwgcmVxdWVzdCwgdHJ1ZSwgdGFnKTsKK30KKworOjpncnBjOjpDbGllbnRBc3luY1JlYWRlcjwgZmxhdGJ1ZmZlcnM6OmdycGM6Ok1lc3NhZ2U8TW9uc3Rlcj4+KiBNb25zdGVyU3RvcmFnZTo6U3R1Yjo6UHJlcGFyZUFzeW5jUmV0cmlldmVSYXcoOjpncnBjOjpDbGllbnRDb250ZXh0KiBjb250ZXh0LCBjb25zdCBmbGF0YnVmZmVyczo6Z3JwYzo6TWVzc2FnZTxTdGF0PiYgcmVxdWVzdCwgOjpncnBjOjpDb21wbGV0aW9uUXVldWUqIGNxKSB7CisgIHJldHVybiA6OmdycGM6OmludGVybmFsOjpDbGllbnRBc3luY1JlYWRlckZhY3Rvcnk8IGZsYXRidWZmZXJzOjpncnBjOjpNZXNzYWdlPE1vbnN0ZXI+Pjo6Q3JlYXRlKGNoYW5uZWxfLmdldCgpLCBjcSwgcnBjbWV0aG9kX1JldHJpZXZlXywgY29udGV4dCwgcmVxdWVzdCwgZmFsc2UsIG51bGxwdHIpOworfQorCis6OmdycGM6OkNsaWVudFdyaXRlcjwgZmxhdGJ1ZmZlcnM6OmdycGM6Ok1lc3NhZ2U8TW9uc3Rlcj4+KiBNb25zdGVyU3RvcmFnZTo6U3R1Yjo6R2V0TWF4SGl0UG9pbnRSYXcoOjpncnBjOjpDbGllbnRDb250ZXh0KiBjb250ZXh0LCBmbGF0YnVmZmVyczo6Z3JwYzo6TWVzc2FnZTxTdGF0PiogcmVzcG9uc2UpIHsKKyAgcmV0dXJuIDo6Z3JwYzo6aW50ZXJuYWw6OkNsaWVudFdyaXRlckZhY3Rvcnk8IGZsYXRidWZmZXJzOjpncnBjOjpNZXNzYWdlPE1vbnN0ZXI+Pjo6Q3JlYXRlKGNoYW5uZWxfLmdldCgpLCBycGNtZXRob2RfR2V0TWF4SGl0UG9pbnRfLCBjb250ZXh0LCByZXNwb25zZSk7Cit9CisKKzo6Z3JwYzo6Q2xpZW50QXN5bmNXcml0ZXI8IGZsYXRidWZmZXJzOjpncnBjOjpNZXNzYWdlPE1vbnN0ZXI+PiogTW9uc3RlclN0b3JhZ2U6OlN0dWI6OkFzeW5jR2V0TWF4SGl0UG9pbnRSYXcoOjpncnBjOjpDbGllbnRDb250ZXh0KiBjb250ZXh0LCBmbGF0YnVmZmVyczo6Z3JwYzo6TWVzc2FnZTxTdGF0PiogcmVzcG9uc2UsIDo6Z3JwYzo6Q29tcGxldGlvblF1ZXVlKiBjcSwgdm9pZCogdGFnKSB7CisgIHJldHVybiA6OmdycGM6OmludGVybmFsOjpDbGllbnRBc3luY1dyaXRlckZhY3Rvcnk8IGZsYXRidWZmZXJzOjpncnBjOjpNZXNzYWdlPE1vbnN0ZXI+Pjo6Q3JlYXRlKGNoYW5uZWxfLmdldCgpLCBjcSwgcnBjbWV0aG9kX0dldE1heEhpdFBvaW50XywgY29udGV4dCwgcmVzcG9uc2UsIHRydWUsIHRhZyk7Cit9CisKKzo6Z3JwYzo6Q2xpZW50QXN5bmNXcml0ZXI8IGZsYXRidWZmZXJzOjpncnBjOjpNZXNzYWdlPE1vbnN0ZXI+PiogTW9uc3RlclN0b3JhZ2U6OlN0dWI6OlByZXBhcmVBc3luY0dldE1heEhpdFBvaW50UmF3KDo6Z3JwYzo6Q2xpZW50Q29udGV4dCogY29udGV4dCwgZmxhdGJ1ZmZlcnM6OmdycGM6Ok1lc3NhZ2U8U3RhdD4qIHJlc3BvbnNlLCA6OmdycGM6OkNvbXBsZXRpb25RdWV1ZSogY3EpIHsKKyAgcmV0dXJuIDo6Z3JwYzo6aW50ZXJuYWw6OkNsaWVudEFzeW5jV3JpdGVyRmFjdG9yeTwgZmxhdGJ1ZmZlcnM6OmdycGM6Ok1lc3NhZ2U8TW9uc3Rlcj4+OjpDcmVhdGUoY2hhbm5lbF8uZ2V0KCksIGNxLCBycGNtZXRob2RfR2V0TWF4SGl0UG9pbnRfLCBjb250ZXh0LCByZXNwb25zZSwgZmFsc2UsIG51bGxwdHIpOworfQorCis6OmdycGM6OkNsaWVudFJlYWRlcldyaXRlcjwgZmxhdGJ1ZmZlcnM6OmdycGM6Ok1lc3NhZ2U8TW9uc3Rlcj4sIGZsYXRidWZmZXJzOjpncnBjOjpNZXNzYWdlPFN0YXQ+PiogTW9uc3RlclN0b3JhZ2U6OlN0dWI6OkdldE1pbk1heEhpdFBvaW50c1Jhdyg6OmdycGM6OkNsaWVudENvbnRleHQqIGNvbnRleHQpIHsKKyAgcmV0dXJuIDo6Z3JwYzo6aW50ZXJuYWw6OkNsaWVudFJlYWRlcldyaXRlckZhY3Rvcnk8IGZsYXRidWZmZXJzOjpncnBjOjpNZXNzYWdlPE1vbnN0ZXI+LCBmbGF0YnVmZmVyczo6Z3JwYzo6TWVzc2FnZTxTdGF0Pj46OkNyZWF0ZShjaGFubmVsXy5nZXQoKSwgcnBjbWV0aG9kX0dldE1pbk1heEhpdFBvaW50c18sIGNvbnRleHQpOworfQorCis6OmdycGM6OkNsaWVudEFzeW5jUmVhZGVyV3JpdGVyPCBmbGF0YnVmZmVyczo6Z3JwYzo6TWVzc2FnZTxNb25zdGVyPiwgZmxhdGJ1ZmZlcnM6OmdycGM6Ok1lc3NhZ2U8U3RhdD4+KiBNb25zdGVyU3RvcmFnZTo6U3R1Yjo6QXN5bmNHZXRNaW5NYXhIaXRQb2ludHNSYXcoOjpncnBjOjpDbGllbnRDb250ZXh0KiBjb250ZXh0LCA6OmdycGM6OkNvbXBsZXRpb25RdWV1ZSogY3EsIHZvaWQqIHRhZykgeworICByZXR1cm4gOjpncnBjOjppbnRlcm5hbDo6Q2xpZW50QXN5bmNSZWFkZXJXcml0ZXJGYWN0b3J5PCBmbGF0YnVmZmVyczo6Z3JwYzo6TWVzc2FnZTxNb25zdGVyPiwgZmxhdGJ1ZmZlcnM6OmdycGM6Ok1lc3NhZ2U8U3RhdD4+OjpDcmVhdGUoY2hhbm5lbF8uZ2V0KCksIGNxLCBycGNtZXRob2RfR2V0TWluTWF4SGl0UG9pbnRzXywgY29udGV4dCwgdHJ1ZSwgdGFnKTsKK30KKworOjpncnBjOjpDbGllbnRBc3luY1JlYWRlcldyaXRlcjwgZmxhdGJ1ZmZlcnM6OmdycGM6Ok1lc3NhZ2U8TW9uc3Rlcj4sIGZsYXRidWZmZXJzOjpncnBjOjpNZXNzYWdlPFN0YXQ+PiogTW9uc3RlclN0b3JhZ2U6OlN0dWI6OlByZXBhcmVBc3luY0dldE1pbk1heEhpdFBvaW50c1Jhdyg6OmdycGM6OkNsaWVudENvbnRleHQqIGNvbnRleHQsIDo6Z3JwYzo6Q29tcGxldGlvblF1ZXVlKiBjcSkgeworICByZXR1cm4gOjpncnBjOjppbnRlcm5hbDo6Q2xpZW50QXN5bmNSZWFkZXJXcml0ZXJGYWN0b3J5PCBmbGF0YnVmZmVyczo6Z3JwYzo6TWVzc2FnZTxNb25zdGVyPiwgZmxhdGJ1ZmZlcnM6OmdycGM6Ok1lc3NhZ2U8U3RhdD4+OjpDcmVhdGUoY2hhbm5lbF8uZ2V0KCksIGNxLCBycGNtZXRob2RfR2V0TWluTWF4SGl0UG9pbnRzXywgY29udGV4dCwgZmFsc2UsIG51bGxwdHIpOworfQorCitNb25zdGVyU3RvcmFnZTo6U2VydmljZTo6U2VydmljZSgpIHsKKyAgQWRkTWV0aG9kKG5ldyA6OmdycGM6OmludGVybmFsOjpScGNTZXJ2aWNlTWV0aG9kKAorICAgICAgTW9uc3RlclN0b3JhZ2VfbWV0aG9kX25hbWVzWzBdLAorICAgICAgOjpncnBjOjppbnRlcm5hbDo6UnBjTWV0aG9kOjpOT1JNQUxfUlBDLAorICAgICAgbmV3IDo6Z3JwYzo6aW50ZXJuYWw6OlJwY01ldGhvZEhhbmRsZXI8IE1vbnN0ZXJTdG9yYWdlOjpTZXJ2aWNlLCBmbGF0YnVmZmVyczo6Z3JwYzo6TWVzc2FnZTxNb25zdGVyPiwgZmxhdGJ1ZmZlcnM6OmdycGM6Ok1lc3NhZ2U8U3RhdD4+KAorICAgICAgICAgIHN0ZDo6bWVtX2ZuKCZNb25zdGVyU3RvcmFnZTo6U2VydmljZTo6U3RvcmUpLCB0aGlzKSkpOworICBBZGRNZXRob2QobmV3IDo6Z3JwYzo6aW50ZXJuYWw6OlJwY1NlcnZpY2VNZXRob2QoCisgICAgICBNb25zdGVyU3RvcmFnZV9tZXRob2RfbmFtZXNbMV0sCisgICAgICA6OmdycGM6OmludGVybmFsOjpScGNNZXRob2Q6OlNFUlZFUl9TVFJFQU1JTkcsCisgICAgICBuZXcgOjpncnBjOjppbnRlcm5hbDo6U2VydmVyU3RyZWFtaW5nSGFuZGxlcjwgTW9uc3RlclN0b3JhZ2U6OlNlcnZpY2UsIGZsYXRidWZmZXJzOjpncnBjOjpNZXNzYWdlPFN0YXQ+LCBmbGF0YnVmZmVyczo6Z3JwYzo6TWVzc2FnZTxNb25zdGVyPj4oCisgICAgICAgICAgc3RkOjptZW1fZm4oJk1vbnN0ZXJTdG9yYWdlOjpTZXJ2aWNlOjpSZXRyaWV2ZSksIHRoaXMpKSk7CisgIEFkZE1ldGhvZChuZXcgOjpncnBjOjppbnRlcm5hbDo6UnBjU2VydmljZU1ldGhvZCgKKyAgICAgIE1vbnN0ZXJTdG9yYWdlX21ldGhvZF9uYW1lc1syXSwKKyAgICAgIDo6Z3JwYzo6aW50ZXJuYWw6OlJwY01ldGhvZDo6Q0xJRU5UX1NUUkVBTUlORywKKyAgICAgIG5ldyA6OmdycGM6OmludGVybmFsOjpDbGllbnRTdHJlYW1pbmdIYW5kbGVyPCBNb25zdGVyU3RvcmFnZTo6U2VydmljZSwgZmxhdGJ1ZmZlcnM6OmdycGM6Ok1lc3NhZ2U8TW9uc3Rlcj4sIGZsYXRidWZmZXJzOjpncnBjOjpNZXNzYWdlPFN0YXQ+PigKKyAgICAgICAgICBzdGQ6Om1lbV9mbigmTW9uc3RlclN0b3JhZ2U6OlNlcnZpY2U6OkdldE1heEhpdFBvaW50KSwgdGhpcykpKTsKKyAgQWRkTWV0aG9kKG5ldyA6OmdycGM6OmludGVybmFsOjpScGNTZXJ2aWNlTWV0aG9kKAorICAgICAgTW9uc3RlclN0b3JhZ2VfbWV0aG9kX25hbWVzWzNdLAorICAgICAgOjpncnBjOjppbnRlcm5hbDo6UnBjTWV0aG9kOjpCSURJX1NUUkVBTUlORywKKyAgICAgIG5ldyA6OmdycGM6OmludGVybmFsOjpCaWRpU3RyZWFtaW5nSGFuZGxlcjwgTW9uc3RlclN0b3JhZ2U6OlNlcnZpY2UsIGZsYXRidWZmZXJzOjpncnBjOjpNZXNzYWdlPE1vbnN0ZXI+LCBmbGF0YnVmZmVyczo6Z3JwYzo6TWVzc2FnZTxTdGF0Pj4oCisgICAgICAgICAgc3RkOjptZW1fZm4oJk1vbnN0ZXJTdG9yYWdlOjpTZXJ2aWNlOjpHZXRNaW5NYXhIaXRQb2ludHMpLCB0aGlzKSkpOworfQorCitNb25zdGVyU3RvcmFnZTo6U2VydmljZTo6flNlcnZpY2UoKSB7Cit9CisKKzo6Z3JwYzo6U3RhdHVzIE1vbnN0ZXJTdG9yYWdlOjpTZXJ2aWNlOjpTdG9yZSg6OmdycGM6OlNlcnZlckNvbnRleHQqIC8qY29udGV4dCovLCBjb25zdCBmbGF0YnVmZmVyczo6Z3JwYzo6TWVzc2FnZTxNb25zdGVyPiogLypyZXF1ZXN0Ki8sIGZsYXRidWZmZXJzOjpncnBjOjpNZXNzYWdlPFN0YXQ+KiAvKnJlc3BvbnNlKi8pIHsKKyAgcmV0dXJuIDo6Z3JwYzo6U3RhdHVzKDo6Z3JwYzo6U3RhdHVzQ29kZTo6VU5JTVBMRU1FTlRFRCwgIiIpOworfQorCis6OmdycGM6OlN0YXR1cyBNb25zdGVyU3RvcmFnZTo6U2VydmljZTo6UmV0cmlldmUoOjpncnBjOjpTZXJ2ZXJDb250ZXh0KiAvKmNvbnRleHQqLywgY29uc3QgZmxhdGJ1ZmZlcnM6OmdycGM6Ok1lc3NhZ2U8U3RhdD4qIC8qcmVxdWVzdCovLCA6OmdycGM6OlNlcnZlcldyaXRlcjwgZmxhdGJ1ZmZlcnM6OmdycGM6Ok1lc3NhZ2U8TW9uc3Rlcj4+KiAvKndyaXRlciovKSB7CisgIHJldHVybiA6OmdycGM6OlN0YXR1cyg6OmdycGM6OlN0YXR1c0NvZGU6OlVOSU1QTEVNRU5URUQsICIiKTsKK30KKworOjpncnBjOjpTdGF0dXMgTW9uc3RlclN0b3JhZ2U6OlNlcnZpY2U6OkdldE1heEhpdFBvaW50KDo6Z3JwYzo6U2VydmVyQ29udGV4dCogLypjb250ZXh0Ki8sIDo6Z3JwYzo6U2VydmVyUmVhZGVyPCBmbGF0YnVmZmVyczo6Z3JwYzo6TWVzc2FnZTxNb25zdGVyPj4qIC8qcmVhZGVyKi8sIGZsYXRidWZmZXJzOjpncnBjOjpNZXNzYWdlPFN0YXQ+KiAvKnJlc3BvbnNlKi8pIHsKKyAgcmV0dXJuIDo6Z3JwYzo6U3RhdHVzKDo6Z3JwYzo6U3RhdHVzQ29kZTo6VU5JTVBMRU1FTlRFRCwgIiIpOworfQorCis6OmdycGM6OlN0YXR1cyBNb25zdGVyU3RvcmFnZTo6U2VydmljZTo6R2V0TWluTWF4SGl0UG9pbnRzKDo6Z3JwYzo6U2VydmVyQ29udGV4dCogLypjb250ZXh0Ki8sIDo6Z3JwYzo6U2VydmVyUmVhZGVyV3JpdGVyPCBmbGF0YnVmZmVyczo6Z3JwYzo6TWVzc2FnZTxTdGF0PiwgZmxhdGJ1ZmZlcnM6OmdycGM6Ok1lc3NhZ2U8TW9uc3Rlcj4+KiAvKnN0cmVhbSovKSB7CisgIHJldHVybiA6OmdycGM6OlN0YXR1cyg6OmdycGM6OlN0YXR1c0NvZGU6OlVOSU1QTEVNRU5URUQsICIiKTsKK30KKworCit9ICAvLyBuYW1lc3BhY2UgTXlHYW1lCit9ICAvLyBuYW1lc3BhY2UgRXhhbXBsZQorCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9tb25zdGVyX3Rlc3Rfc3VmZml4L21vbnN0ZXJfdGVzdC5ncnBjLmZiLmggYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9tb25zdGVyX3Rlc3Rfc3VmZml4L21vbnN0ZXJfdGVzdC5ncnBjLmZiLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWI2YWI2ZgotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL21vbnN0ZXJfdGVzdF9zdWZmaXgvbW9uc3Rlcl90ZXN0LmdycGMuZmIuaApAQCAtMCwwICsxLDM1MCBAQAorLy8gR2VuZXJhdGVkIGJ5IHRoZSBnUlBDIEMrKyBwbHVnaW4uCisvLyBJZiB5b3UgbWFrZSBhbnkgbG9jYWwgY2hhbmdlLCB0aGV5IHdpbGwgYmUgbG9zdC4KKy8vIHNvdXJjZTogbW9uc3Rlcl90ZXN0CisjaWZuZGVmIEdSUENfbW9uc3Rlcl81ZnRlc3RfX0lOQ0xVREVECisjZGVmaW5lIEdSUENfbW9uc3Rlcl81ZnRlc3RfX0lOQ0xVREVECisKKyNpbmNsdWRlICJtb25zdGVyX3Rlc3Rfc3VmZml4LmhwcCIKKyNpbmNsdWRlICJmbGF0YnVmZmVycy9ncnBjLmgiCisKKyNpbmNsdWRlIDxncnBjcHAvaW1wbC9jb2RlZ2VuL2FzeW5jX3N0cmVhbS5oPgorI2luY2x1ZGUgPGdycGNwcC9pbXBsL2NvZGVnZW4vYXN5bmNfdW5hcnlfY2FsbC5oPgorI2luY2x1ZGUgPGdycGNwcC9pbXBsL2NvZGVnZW4vbWV0aG9kX2hhbmRsZXIuaD4KKyNpbmNsdWRlIDxncnBjcHAvaW1wbC9jb2RlZ2VuL3Byb3RvX3V0aWxzLmg+CisjaW5jbHVkZSA8Z3JwY3BwL2ltcGwvY29kZWdlbi9ycGNfbWV0aG9kLmg+CisjaW5jbHVkZSA8Z3JwY3BwL2ltcGwvY29kZWdlbi9zZXJ2aWNlX3R5cGUuaD4KKyNpbmNsdWRlIDxncnBjcHAvaW1wbC9jb2RlZ2VuL3N0YXR1cy5oPgorI2luY2x1ZGUgPGdycGNwcC9pbXBsL2NvZGVnZW4vc3R1Yl9vcHRpb25zLmg+CisjaW5jbHVkZSA8Z3JwY3BwL2ltcGwvY29kZWdlbi9zeW5jX3N0cmVhbS5oPgorCituYW1lc3BhY2UgZ3JwYyB7CitjbGFzcyBDb21wbGV0aW9uUXVldWU7CitjbGFzcyBDaGFubmVsOworY2xhc3MgU2VydmVyQ29tcGxldGlvblF1ZXVlOworY2xhc3MgU2VydmVyQ29udGV4dDsKK30gIC8vIG5hbWVzcGFjZSBncnBjCisKK25hbWVzcGFjZSBNeUdhbWUgeworbmFtZXNwYWNlIEV4YW1wbGUgeworCitjbGFzcyBNb25zdGVyU3RvcmFnZSBmaW5hbCB7CisgcHVibGljOgorICBzdGF0aWMgY29uc3RleHByIGNoYXIgY29uc3QqIHNlcnZpY2VfZnVsbF9uYW1lKCkgeworICAgIHJldHVybiAiTXlHYW1lLkV4YW1wbGUuTW9uc3RlclN0b3JhZ2UiOworICB9CisgIGNsYXNzIFN0dWJJbnRlcmZhY2UgeworICAgcHVibGljOgorICAgIHZpcnR1YWwgflN0dWJJbnRlcmZhY2UoKSB7fQorICAgIHZpcnR1YWwgOjpncnBjOjpTdGF0dXMgU3RvcmUoOjpncnBjOjpDbGllbnRDb250ZXh0KiBjb250ZXh0LCBjb25zdCBmbGF0YnVmZmVyczo6Z3JwYzo6TWVzc2FnZTxNb25zdGVyPiYgcmVxdWVzdCwgZmxhdGJ1ZmZlcnM6OmdycGM6Ok1lc3NhZ2U8U3RhdD4qIHJlc3BvbnNlKSA9IDA7CisgICAgc3RkOjp1bmlxdWVfcHRyPCA6OmdycGM6OkNsaWVudEFzeW5jUmVzcG9uc2VSZWFkZXJJbnRlcmZhY2U8IGZsYXRidWZmZXJzOjpncnBjOjpNZXNzYWdlPFN0YXQ+Pj4gQXN5bmNTdG9yZSg6OmdycGM6OkNsaWVudENvbnRleHQqIGNvbnRleHQsIGNvbnN0IGZsYXRidWZmZXJzOjpncnBjOjpNZXNzYWdlPE1vbnN0ZXI+JiByZXF1ZXN0LCA6OmdycGM6OkNvbXBsZXRpb25RdWV1ZSogY3EpIHsKKyAgICAgIHJldHVybiBzdGQ6OnVuaXF1ZV9wdHI8IDo6Z3JwYzo6Q2xpZW50QXN5bmNSZXNwb25zZVJlYWRlckludGVyZmFjZTwgZmxhdGJ1ZmZlcnM6OmdycGM6Ok1lc3NhZ2U8U3RhdD4+PihBc3luY1N0b3JlUmF3KGNvbnRleHQsIHJlcXVlc3QsIGNxKSk7CisgICAgfQorICAgIHN0ZDo6dW5pcXVlX3B0cjwgOjpncnBjOjpDbGllbnRBc3luY1Jlc3BvbnNlUmVhZGVySW50ZXJmYWNlPCBmbGF0YnVmZmVyczo6Z3JwYzo6TWVzc2FnZTxTdGF0Pj4+IFByZXBhcmVBc3luY1N0b3JlKDo6Z3JwYzo6Q2xpZW50Q29udGV4dCogY29udGV4dCwgY29uc3QgZmxhdGJ1ZmZlcnM6OmdycGM6Ok1lc3NhZ2U8TW9uc3Rlcj4mIHJlcXVlc3QsIDo6Z3JwYzo6Q29tcGxldGlvblF1ZXVlKiBjcSkgeworICAgICAgcmV0dXJuIHN0ZDo6dW5pcXVlX3B0cjwgOjpncnBjOjpDbGllbnRBc3luY1Jlc3BvbnNlUmVhZGVySW50ZXJmYWNlPCBmbGF0YnVmZmVyczo6Z3JwYzo6TWVzc2FnZTxTdGF0Pj4+KFByZXBhcmVBc3luY1N0b3JlUmF3KGNvbnRleHQsIHJlcXVlc3QsIGNxKSk7CisgICAgfQorICAgIHN0ZDo6dW5pcXVlX3B0cjwgOjpncnBjOjpDbGllbnRSZWFkZXJJbnRlcmZhY2U8IGZsYXRidWZmZXJzOjpncnBjOjpNZXNzYWdlPE1vbnN0ZXI+Pj4gUmV0cmlldmUoOjpncnBjOjpDbGllbnRDb250ZXh0KiBjb250ZXh0LCBjb25zdCBmbGF0YnVmZmVyczo6Z3JwYzo6TWVzc2FnZTxTdGF0PiYgcmVxdWVzdCkgeworICAgICAgcmV0dXJuIHN0ZDo6dW5pcXVlX3B0cjwgOjpncnBjOjpDbGllbnRSZWFkZXJJbnRlcmZhY2U8IGZsYXRidWZmZXJzOjpncnBjOjpNZXNzYWdlPE1vbnN0ZXI+Pj4oUmV0cmlldmVSYXcoY29udGV4dCwgcmVxdWVzdCkpOworICAgIH0KKyAgICBzdGQ6OnVuaXF1ZV9wdHI8IDo6Z3JwYzo6Q2xpZW50QXN5bmNSZWFkZXJJbnRlcmZhY2U8IGZsYXRidWZmZXJzOjpncnBjOjpNZXNzYWdlPE1vbnN0ZXI+Pj4gQXN5bmNSZXRyaWV2ZSg6OmdycGM6OkNsaWVudENvbnRleHQqIGNvbnRleHQsIGNvbnN0IGZsYXRidWZmZXJzOjpncnBjOjpNZXNzYWdlPFN0YXQ+JiByZXF1ZXN0LCA6OmdycGM6OkNvbXBsZXRpb25RdWV1ZSogY3EsIHZvaWQqIHRhZykgeworICAgICAgcmV0dXJuIHN0ZDo6dW5pcXVlX3B0cjwgOjpncnBjOjpDbGllbnRBc3luY1JlYWRlckludGVyZmFjZTwgZmxhdGJ1ZmZlcnM6OmdycGM6Ok1lc3NhZ2U8TW9uc3Rlcj4+PihBc3luY1JldHJpZXZlUmF3KGNvbnRleHQsIHJlcXVlc3QsIGNxLCB0YWcpKTsKKyAgICB9CisgICAgc3RkOjp1bmlxdWVfcHRyPCA6OmdycGM6OkNsaWVudEFzeW5jUmVhZGVySW50ZXJmYWNlPCBmbGF0YnVmZmVyczo6Z3JwYzo6TWVzc2FnZTxNb25zdGVyPj4+IFByZXBhcmVBc3luY1JldHJpZXZlKDo6Z3JwYzo6Q2xpZW50Q29udGV4dCogY29udGV4dCwgY29uc3QgZmxhdGJ1ZmZlcnM6OmdycGM6Ok1lc3NhZ2U8U3RhdD4mIHJlcXVlc3QsIDo6Z3JwYzo6Q29tcGxldGlvblF1ZXVlKiBjcSkgeworICAgICAgcmV0dXJuIHN0ZDo6dW5pcXVlX3B0cjwgOjpncnBjOjpDbGllbnRBc3luY1JlYWRlckludGVyZmFjZTwgZmxhdGJ1ZmZlcnM6OmdycGM6Ok1lc3NhZ2U8TW9uc3Rlcj4+PihQcmVwYXJlQXN5bmNSZXRyaWV2ZVJhdyhjb250ZXh0LCByZXF1ZXN0LCBjcSkpOworICAgIH0KKyAgICBzdGQ6OnVuaXF1ZV9wdHI8IDo6Z3JwYzo6Q2xpZW50V3JpdGVySW50ZXJmYWNlPCBmbGF0YnVmZmVyczo6Z3JwYzo6TWVzc2FnZTxNb25zdGVyPj4+IEdldE1heEhpdFBvaW50KDo6Z3JwYzo6Q2xpZW50Q29udGV4dCogY29udGV4dCwgZmxhdGJ1ZmZlcnM6OmdycGM6Ok1lc3NhZ2U8U3RhdD4qIHJlc3BvbnNlKSB7CisgICAgICByZXR1cm4gc3RkOjp1bmlxdWVfcHRyPCA6OmdycGM6OkNsaWVudFdyaXRlckludGVyZmFjZTwgZmxhdGJ1ZmZlcnM6OmdycGM6Ok1lc3NhZ2U8TW9uc3Rlcj4+PihHZXRNYXhIaXRQb2ludFJhdyhjb250ZXh0LCByZXNwb25zZSkpOworICAgIH0KKyAgICBzdGQ6OnVuaXF1ZV9wdHI8IDo6Z3JwYzo6Q2xpZW50QXN5bmNXcml0ZXJJbnRlcmZhY2U8IGZsYXRidWZmZXJzOjpncnBjOjpNZXNzYWdlPE1vbnN0ZXI+Pj4gQXN5bmNHZXRNYXhIaXRQb2ludCg6OmdycGM6OkNsaWVudENvbnRleHQqIGNvbnRleHQsIGZsYXRidWZmZXJzOjpncnBjOjpNZXNzYWdlPFN0YXQ+KiByZXNwb25zZSwgOjpncnBjOjpDb21wbGV0aW9uUXVldWUqIGNxLCB2b2lkKiB0YWcpIHsKKyAgICAgIHJldHVybiBzdGQ6OnVuaXF1ZV9wdHI8IDo6Z3JwYzo6Q2xpZW50QXN5bmNXcml0ZXJJbnRlcmZhY2U8IGZsYXRidWZmZXJzOjpncnBjOjpNZXNzYWdlPE1vbnN0ZXI+Pj4oQXN5bmNHZXRNYXhIaXRQb2ludFJhdyhjb250ZXh0LCByZXNwb25zZSwgY3EsIHRhZykpOworICAgIH0KKyAgICBzdGQ6OnVuaXF1ZV9wdHI8IDo6Z3JwYzo6Q2xpZW50QXN5bmNXcml0ZXJJbnRlcmZhY2U8IGZsYXRidWZmZXJzOjpncnBjOjpNZXNzYWdlPE1vbnN0ZXI+Pj4gUHJlcGFyZUFzeW5jR2V0TWF4SGl0UG9pbnQoOjpncnBjOjpDbGllbnRDb250ZXh0KiBjb250ZXh0LCBmbGF0YnVmZmVyczo6Z3JwYzo6TWVzc2FnZTxTdGF0PiogcmVzcG9uc2UsIDo6Z3JwYzo6Q29tcGxldGlvblF1ZXVlKiBjcSkgeworICAgICAgcmV0dXJuIHN0ZDo6dW5pcXVlX3B0cjwgOjpncnBjOjpDbGllbnRBc3luY1dyaXRlckludGVyZmFjZTwgZmxhdGJ1ZmZlcnM6OmdycGM6Ok1lc3NhZ2U8TW9uc3Rlcj4+PihQcmVwYXJlQXN5bmNHZXRNYXhIaXRQb2ludFJhdyhjb250ZXh0LCByZXNwb25zZSwgY3EpKTsKKyAgICB9CisgICAgc3RkOjp1bmlxdWVfcHRyPCA6OmdycGM6OkNsaWVudFJlYWRlcldyaXRlckludGVyZmFjZTwgZmxhdGJ1ZmZlcnM6OmdycGM6Ok1lc3NhZ2U8TW9uc3Rlcj4sIGZsYXRidWZmZXJzOjpncnBjOjpNZXNzYWdlPFN0YXQ+Pj4gR2V0TWluTWF4SGl0UG9pbnRzKDo6Z3JwYzo6Q2xpZW50Q29udGV4dCogY29udGV4dCkgeworICAgICAgcmV0dXJuIHN0ZDo6dW5pcXVlX3B0cjwgOjpncnBjOjpDbGllbnRSZWFkZXJXcml0ZXJJbnRlcmZhY2U8IGZsYXRidWZmZXJzOjpncnBjOjpNZXNzYWdlPE1vbnN0ZXI+LCBmbGF0YnVmZmVyczo6Z3JwYzo6TWVzc2FnZTxTdGF0Pj4+KEdldE1pbk1heEhpdFBvaW50c1Jhdyhjb250ZXh0KSk7CisgICAgfQorICAgIHN0ZDo6dW5pcXVlX3B0cjwgOjpncnBjOjpDbGllbnRBc3luY1JlYWRlcldyaXRlckludGVyZmFjZTwgZmxhdGJ1ZmZlcnM6OmdycGM6Ok1lc3NhZ2U8TW9uc3Rlcj4sIGZsYXRidWZmZXJzOjpncnBjOjpNZXNzYWdlPFN0YXQ+Pj4gQXN5bmNHZXRNaW5NYXhIaXRQb2ludHMoOjpncnBjOjpDbGllbnRDb250ZXh0KiBjb250ZXh0LCA6OmdycGM6OkNvbXBsZXRpb25RdWV1ZSogY3EsIHZvaWQqIHRhZykgeworICAgICAgcmV0dXJuIHN0ZDo6dW5pcXVlX3B0cjwgOjpncnBjOjpDbGllbnRBc3luY1JlYWRlcldyaXRlckludGVyZmFjZTwgZmxhdGJ1ZmZlcnM6OmdycGM6Ok1lc3NhZ2U8TW9uc3Rlcj4sIGZsYXRidWZmZXJzOjpncnBjOjpNZXNzYWdlPFN0YXQ+Pj4oQXN5bmNHZXRNaW5NYXhIaXRQb2ludHNSYXcoY29udGV4dCwgY3EsIHRhZykpOworICAgIH0KKyAgICBzdGQ6OnVuaXF1ZV9wdHI8IDo6Z3JwYzo6Q2xpZW50QXN5bmNSZWFkZXJXcml0ZXJJbnRlcmZhY2U8IGZsYXRidWZmZXJzOjpncnBjOjpNZXNzYWdlPE1vbnN0ZXI+LCBmbGF0YnVmZmVyczo6Z3JwYzo6TWVzc2FnZTxTdGF0Pj4+IFByZXBhcmVBc3luY0dldE1pbk1heEhpdFBvaW50cyg6OmdycGM6OkNsaWVudENvbnRleHQqIGNvbnRleHQsIDo6Z3JwYzo6Q29tcGxldGlvblF1ZXVlKiBjcSkgeworICAgICAgcmV0dXJuIHN0ZDo6dW5pcXVlX3B0cjwgOjpncnBjOjpDbGllbnRBc3luY1JlYWRlcldyaXRlckludGVyZmFjZTwgZmxhdGJ1ZmZlcnM6OmdycGM6Ok1lc3NhZ2U8TW9uc3Rlcj4sIGZsYXRidWZmZXJzOjpncnBjOjpNZXNzYWdlPFN0YXQ+Pj4oUHJlcGFyZUFzeW5jR2V0TWluTWF4SGl0UG9pbnRzUmF3KGNvbnRleHQsIGNxKSk7CisgICAgfQorICBwcml2YXRlOgorICAgIHZpcnR1YWwgOjpncnBjOjpDbGllbnRBc3luY1Jlc3BvbnNlUmVhZGVySW50ZXJmYWNlPCBmbGF0YnVmZmVyczo6Z3JwYzo6TWVzc2FnZTxTdGF0Pj4qIEFzeW5jU3RvcmVSYXcoOjpncnBjOjpDbGllbnRDb250ZXh0KiBjb250ZXh0LCBjb25zdCBmbGF0YnVmZmVyczo6Z3JwYzo6TWVzc2FnZTxNb25zdGVyPiYgcmVxdWVzdCwgOjpncnBjOjpDb21wbGV0aW9uUXVldWUqIGNxKSA9IDA7CisgICAgdmlydHVhbCA6OmdycGM6OkNsaWVudEFzeW5jUmVzcG9uc2VSZWFkZXJJbnRlcmZhY2U8IGZsYXRidWZmZXJzOjpncnBjOjpNZXNzYWdlPFN0YXQ+PiogUHJlcGFyZUFzeW5jU3RvcmVSYXcoOjpncnBjOjpDbGllbnRDb250ZXh0KiBjb250ZXh0LCBjb25zdCBmbGF0YnVmZmVyczo6Z3JwYzo6TWVzc2FnZTxNb25zdGVyPiYgcmVxdWVzdCwgOjpncnBjOjpDb21wbGV0aW9uUXVldWUqIGNxKSA9IDA7CisgICAgdmlydHVhbCA6OmdycGM6OkNsaWVudFJlYWRlckludGVyZmFjZTwgZmxhdGJ1ZmZlcnM6OmdycGM6Ok1lc3NhZ2U8TW9uc3Rlcj4+KiBSZXRyaWV2ZVJhdyg6OmdycGM6OkNsaWVudENvbnRleHQqIGNvbnRleHQsIGNvbnN0IGZsYXRidWZmZXJzOjpncnBjOjpNZXNzYWdlPFN0YXQ+JiByZXF1ZXN0KSA9IDA7CisgICAgdmlydHVhbCA6OmdycGM6OkNsaWVudEFzeW5jUmVhZGVySW50ZXJmYWNlPCBmbGF0YnVmZmVyczo6Z3JwYzo6TWVzc2FnZTxNb25zdGVyPj4qIEFzeW5jUmV0cmlldmVSYXcoOjpncnBjOjpDbGllbnRDb250ZXh0KiBjb250ZXh0LCBjb25zdCBmbGF0YnVmZmVyczo6Z3JwYzo6TWVzc2FnZTxTdGF0PiYgcmVxdWVzdCwgOjpncnBjOjpDb21wbGV0aW9uUXVldWUqIGNxLCB2b2lkKiB0YWcpID0gMDsKKyAgICB2aXJ0dWFsIDo6Z3JwYzo6Q2xpZW50QXN5bmNSZWFkZXJJbnRlcmZhY2U8IGZsYXRidWZmZXJzOjpncnBjOjpNZXNzYWdlPE1vbnN0ZXI+PiogUHJlcGFyZUFzeW5jUmV0cmlldmVSYXcoOjpncnBjOjpDbGllbnRDb250ZXh0KiBjb250ZXh0LCBjb25zdCBmbGF0YnVmZmVyczo6Z3JwYzo6TWVzc2FnZTxTdGF0PiYgcmVxdWVzdCwgOjpncnBjOjpDb21wbGV0aW9uUXVldWUqIGNxKSA9IDA7CisgICAgdmlydHVhbCA6OmdycGM6OkNsaWVudFdyaXRlckludGVyZmFjZTwgZmxhdGJ1ZmZlcnM6OmdycGM6Ok1lc3NhZ2U8TW9uc3Rlcj4+KiBHZXRNYXhIaXRQb2ludFJhdyg6OmdycGM6OkNsaWVudENvbnRleHQqIGNvbnRleHQsIGZsYXRidWZmZXJzOjpncnBjOjpNZXNzYWdlPFN0YXQ+KiByZXNwb25zZSkgPSAwOworICAgIHZpcnR1YWwgOjpncnBjOjpDbGllbnRBc3luY1dyaXRlckludGVyZmFjZTwgZmxhdGJ1ZmZlcnM6OmdycGM6Ok1lc3NhZ2U8TW9uc3Rlcj4+KiBBc3luY0dldE1heEhpdFBvaW50UmF3KDo6Z3JwYzo6Q2xpZW50Q29udGV4dCogY29udGV4dCwgZmxhdGJ1ZmZlcnM6OmdycGM6Ok1lc3NhZ2U8U3RhdD4qIHJlc3BvbnNlLCA6OmdycGM6OkNvbXBsZXRpb25RdWV1ZSogY3EsIHZvaWQqIHRhZykgPSAwOworICAgIHZpcnR1YWwgOjpncnBjOjpDbGllbnRBc3luY1dyaXRlckludGVyZmFjZTwgZmxhdGJ1ZmZlcnM6OmdycGM6Ok1lc3NhZ2U8TW9uc3Rlcj4+KiBQcmVwYXJlQXN5bmNHZXRNYXhIaXRQb2ludFJhdyg6OmdycGM6OkNsaWVudENvbnRleHQqIGNvbnRleHQsIGZsYXRidWZmZXJzOjpncnBjOjpNZXNzYWdlPFN0YXQ+KiByZXNwb25zZSwgOjpncnBjOjpDb21wbGV0aW9uUXVldWUqIGNxKSA9IDA7CisgICAgdmlydHVhbCA6OmdycGM6OkNsaWVudFJlYWRlcldyaXRlckludGVyZmFjZTwgZmxhdGJ1ZmZlcnM6OmdycGM6Ok1lc3NhZ2U8TW9uc3Rlcj4sIGZsYXRidWZmZXJzOjpncnBjOjpNZXNzYWdlPFN0YXQ+PiogR2V0TWluTWF4SGl0UG9pbnRzUmF3KDo6Z3JwYzo6Q2xpZW50Q29udGV4dCogY29udGV4dCkgPSAwOworICAgIHZpcnR1YWwgOjpncnBjOjpDbGllbnRBc3luY1JlYWRlcldyaXRlckludGVyZmFjZTwgZmxhdGJ1ZmZlcnM6OmdycGM6Ok1lc3NhZ2U8TW9uc3Rlcj4sIGZsYXRidWZmZXJzOjpncnBjOjpNZXNzYWdlPFN0YXQ+PiogQXN5bmNHZXRNaW5NYXhIaXRQb2ludHNSYXcoOjpncnBjOjpDbGllbnRDb250ZXh0KiBjb250ZXh0LCA6OmdycGM6OkNvbXBsZXRpb25RdWV1ZSogY3EsIHZvaWQqIHRhZykgPSAwOworICAgIHZpcnR1YWwgOjpncnBjOjpDbGllbnRBc3luY1JlYWRlcldyaXRlckludGVyZmFjZTwgZmxhdGJ1ZmZlcnM6OmdycGM6Ok1lc3NhZ2U8TW9uc3Rlcj4sIGZsYXRidWZmZXJzOjpncnBjOjpNZXNzYWdlPFN0YXQ+PiogUHJlcGFyZUFzeW5jR2V0TWluTWF4SGl0UG9pbnRzUmF3KDo6Z3JwYzo6Q2xpZW50Q29udGV4dCogY29udGV4dCwgOjpncnBjOjpDb21wbGV0aW9uUXVldWUqIGNxKSA9IDA7CisgIH07CisgIGNsYXNzIFN0dWIgZmluYWwgOiBwdWJsaWMgU3R1YkludGVyZmFjZSB7CisgICBwdWJsaWM6CisgICAgU3R1Yihjb25zdCBzdGQ6OnNoYXJlZF9wdHI8IDo6Z3JwYzo6Q2hhbm5lbEludGVyZmFjZT4mIGNoYW5uZWwpOworICAgIDo6Z3JwYzo6U3RhdHVzIFN0b3JlKDo6Z3JwYzo6Q2xpZW50Q29udGV4dCogY29udGV4dCwgY29uc3QgZmxhdGJ1ZmZlcnM6OmdycGM6Ok1lc3NhZ2U8TW9uc3Rlcj4mIHJlcXVlc3QsIGZsYXRidWZmZXJzOjpncnBjOjpNZXNzYWdlPFN0YXQ+KiByZXNwb25zZSkgb3ZlcnJpZGU7CisgICAgc3RkOjp1bmlxdWVfcHRyPCA6OmdycGM6OkNsaWVudEFzeW5jUmVzcG9uc2VSZWFkZXI8IGZsYXRidWZmZXJzOjpncnBjOjpNZXNzYWdlPFN0YXQ+Pj4gQXN5bmNTdG9yZSg6OmdycGM6OkNsaWVudENvbnRleHQqIGNvbnRleHQsIGNvbnN0IGZsYXRidWZmZXJzOjpncnBjOjpNZXNzYWdlPE1vbnN0ZXI+JiByZXF1ZXN0LCA6OmdycGM6OkNvbXBsZXRpb25RdWV1ZSogY3EpIHsKKyAgICAgIHJldHVybiBzdGQ6OnVuaXF1ZV9wdHI8IDo6Z3JwYzo6Q2xpZW50QXN5bmNSZXNwb25zZVJlYWRlcjwgZmxhdGJ1ZmZlcnM6OmdycGM6Ok1lc3NhZ2U8U3RhdD4+PihBc3luY1N0b3JlUmF3KGNvbnRleHQsIHJlcXVlc3QsIGNxKSk7CisgICAgfQorICAgIHN0ZDo6dW5pcXVlX3B0cjwgOjpncnBjOjpDbGllbnRBc3luY1Jlc3BvbnNlUmVhZGVyPCBmbGF0YnVmZmVyczo6Z3JwYzo6TWVzc2FnZTxTdGF0Pj4+IFByZXBhcmVBc3luY1N0b3JlKDo6Z3JwYzo6Q2xpZW50Q29udGV4dCogY29udGV4dCwgY29uc3QgZmxhdGJ1ZmZlcnM6OmdycGM6Ok1lc3NhZ2U8TW9uc3Rlcj4mIHJlcXVlc3QsIDo6Z3JwYzo6Q29tcGxldGlvblF1ZXVlKiBjcSkgeworICAgICAgcmV0dXJuIHN0ZDo6dW5pcXVlX3B0cjwgOjpncnBjOjpDbGllbnRBc3luY1Jlc3BvbnNlUmVhZGVyPCBmbGF0YnVmZmVyczo6Z3JwYzo6TWVzc2FnZTxTdGF0Pj4+KFByZXBhcmVBc3luY1N0b3JlUmF3KGNvbnRleHQsIHJlcXVlc3QsIGNxKSk7CisgICAgfQorICAgIHN0ZDo6dW5pcXVlX3B0cjwgOjpncnBjOjpDbGllbnRSZWFkZXI8IGZsYXRidWZmZXJzOjpncnBjOjpNZXNzYWdlPE1vbnN0ZXI+Pj4gUmV0cmlldmUoOjpncnBjOjpDbGllbnRDb250ZXh0KiBjb250ZXh0LCBjb25zdCBmbGF0YnVmZmVyczo6Z3JwYzo6TWVzc2FnZTxTdGF0PiYgcmVxdWVzdCkgeworICAgICAgcmV0dXJuIHN0ZDo6dW5pcXVlX3B0cjwgOjpncnBjOjpDbGllbnRSZWFkZXI8IGZsYXRidWZmZXJzOjpncnBjOjpNZXNzYWdlPE1vbnN0ZXI+Pj4oUmV0cmlldmVSYXcoY29udGV4dCwgcmVxdWVzdCkpOworICAgIH0KKyAgICBzdGQ6OnVuaXF1ZV9wdHI8IDo6Z3JwYzo6Q2xpZW50QXN5bmNSZWFkZXI8IGZsYXRidWZmZXJzOjpncnBjOjpNZXNzYWdlPE1vbnN0ZXI+Pj4gQXN5bmNSZXRyaWV2ZSg6OmdycGM6OkNsaWVudENvbnRleHQqIGNvbnRleHQsIGNvbnN0IGZsYXRidWZmZXJzOjpncnBjOjpNZXNzYWdlPFN0YXQ+JiByZXF1ZXN0LCA6OmdycGM6OkNvbXBsZXRpb25RdWV1ZSogY3EsIHZvaWQqIHRhZykgeworICAgICAgcmV0dXJuIHN0ZDo6dW5pcXVlX3B0cjwgOjpncnBjOjpDbGllbnRBc3luY1JlYWRlcjwgZmxhdGJ1ZmZlcnM6OmdycGM6Ok1lc3NhZ2U8TW9uc3Rlcj4+PihBc3luY1JldHJpZXZlUmF3KGNvbnRleHQsIHJlcXVlc3QsIGNxLCB0YWcpKTsKKyAgICB9CisgICAgc3RkOjp1bmlxdWVfcHRyPCA6OmdycGM6OkNsaWVudEFzeW5jUmVhZGVyPCBmbGF0YnVmZmVyczo6Z3JwYzo6TWVzc2FnZTxNb25zdGVyPj4+IFByZXBhcmVBc3luY1JldHJpZXZlKDo6Z3JwYzo6Q2xpZW50Q29udGV4dCogY29udGV4dCwgY29uc3QgZmxhdGJ1ZmZlcnM6OmdycGM6Ok1lc3NhZ2U8U3RhdD4mIHJlcXVlc3QsIDo6Z3JwYzo6Q29tcGxldGlvblF1ZXVlKiBjcSkgeworICAgICAgcmV0dXJuIHN0ZDo6dW5pcXVlX3B0cjwgOjpncnBjOjpDbGllbnRBc3luY1JlYWRlcjwgZmxhdGJ1ZmZlcnM6OmdycGM6Ok1lc3NhZ2U8TW9uc3Rlcj4+PihQcmVwYXJlQXN5bmNSZXRyaWV2ZVJhdyhjb250ZXh0LCByZXF1ZXN0LCBjcSkpOworICAgIH0KKyAgICBzdGQ6OnVuaXF1ZV9wdHI8IDo6Z3JwYzo6Q2xpZW50V3JpdGVyPCBmbGF0YnVmZmVyczo6Z3JwYzo6TWVzc2FnZTxNb25zdGVyPj4+IEdldE1heEhpdFBvaW50KDo6Z3JwYzo6Q2xpZW50Q29udGV4dCogY29udGV4dCwgZmxhdGJ1ZmZlcnM6OmdycGM6Ok1lc3NhZ2U8U3RhdD4qIHJlc3BvbnNlKSB7CisgICAgICByZXR1cm4gc3RkOjp1bmlxdWVfcHRyPCA6OmdycGM6OkNsaWVudFdyaXRlcjwgZmxhdGJ1ZmZlcnM6OmdycGM6Ok1lc3NhZ2U8TW9uc3Rlcj4+PihHZXRNYXhIaXRQb2ludFJhdyhjb250ZXh0LCByZXNwb25zZSkpOworICAgIH0KKyAgICBzdGQ6OnVuaXF1ZV9wdHI8IDo6Z3JwYzo6Q2xpZW50QXN5bmNXcml0ZXI8IGZsYXRidWZmZXJzOjpncnBjOjpNZXNzYWdlPE1vbnN0ZXI+Pj4gQXN5bmNHZXRNYXhIaXRQb2ludCg6OmdycGM6OkNsaWVudENvbnRleHQqIGNvbnRleHQsIGZsYXRidWZmZXJzOjpncnBjOjpNZXNzYWdlPFN0YXQ+KiByZXNwb25zZSwgOjpncnBjOjpDb21wbGV0aW9uUXVldWUqIGNxLCB2b2lkKiB0YWcpIHsKKyAgICAgIHJldHVybiBzdGQ6OnVuaXF1ZV9wdHI8IDo6Z3JwYzo6Q2xpZW50QXN5bmNXcml0ZXI8IGZsYXRidWZmZXJzOjpncnBjOjpNZXNzYWdlPE1vbnN0ZXI+Pj4oQXN5bmNHZXRNYXhIaXRQb2ludFJhdyhjb250ZXh0LCByZXNwb25zZSwgY3EsIHRhZykpOworICAgIH0KKyAgICBzdGQ6OnVuaXF1ZV9wdHI8IDo6Z3JwYzo6Q2xpZW50QXN5bmNXcml0ZXI8IGZsYXRidWZmZXJzOjpncnBjOjpNZXNzYWdlPE1vbnN0ZXI+Pj4gUHJlcGFyZUFzeW5jR2V0TWF4SGl0UG9pbnQoOjpncnBjOjpDbGllbnRDb250ZXh0KiBjb250ZXh0LCBmbGF0YnVmZmVyczo6Z3JwYzo6TWVzc2FnZTxTdGF0PiogcmVzcG9uc2UsIDo6Z3JwYzo6Q29tcGxldGlvblF1ZXVlKiBjcSkgeworICAgICAgcmV0dXJuIHN0ZDo6dW5pcXVlX3B0cjwgOjpncnBjOjpDbGllbnRBc3luY1dyaXRlcjwgZmxhdGJ1ZmZlcnM6OmdycGM6Ok1lc3NhZ2U8TW9uc3Rlcj4+PihQcmVwYXJlQXN5bmNHZXRNYXhIaXRQb2ludFJhdyhjb250ZXh0LCByZXNwb25zZSwgY3EpKTsKKyAgICB9CisgICAgc3RkOjp1bmlxdWVfcHRyPCA6OmdycGM6OkNsaWVudFJlYWRlcldyaXRlcjwgZmxhdGJ1ZmZlcnM6OmdycGM6Ok1lc3NhZ2U8TW9uc3Rlcj4sIGZsYXRidWZmZXJzOjpncnBjOjpNZXNzYWdlPFN0YXQ+Pj4gR2V0TWluTWF4SGl0UG9pbnRzKDo6Z3JwYzo6Q2xpZW50Q29udGV4dCogY29udGV4dCkgeworICAgICAgcmV0dXJuIHN0ZDo6dW5pcXVlX3B0cjwgOjpncnBjOjpDbGllbnRSZWFkZXJXcml0ZXI8IGZsYXRidWZmZXJzOjpncnBjOjpNZXNzYWdlPE1vbnN0ZXI+LCBmbGF0YnVmZmVyczo6Z3JwYzo6TWVzc2FnZTxTdGF0Pj4+KEdldE1pbk1heEhpdFBvaW50c1Jhdyhjb250ZXh0KSk7CisgICAgfQorICAgIHN0ZDo6dW5pcXVlX3B0cjwgIDo6Z3JwYzo6Q2xpZW50QXN5bmNSZWFkZXJXcml0ZXI8IGZsYXRidWZmZXJzOjpncnBjOjpNZXNzYWdlPE1vbnN0ZXI+LCBmbGF0YnVmZmVyczo6Z3JwYzo6TWVzc2FnZTxTdGF0Pj4+IEFzeW5jR2V0TWluTWF4SGl0UG9pbnRzKDo6Z3JwYzo6Q2xpZW50Q29udGV4dCogY29udGV4dCwgOjpncnBjOjpDb21wbGV0aW9uUXVldWUqIGNxLCB2b2lkKiB0YWcpIHsKKyAgICAgIHJldHVybiBzdGQ6OnVuaXF1ZV9wdHI8IDo6Z3JwYzo6Q2xpZW50QXN5bmNSZWFkZXJXcml0ZXI8IGZsYXRidWZmZXJzOjpncnBjOjpNZXNzYWdlPE1vbnN0ZXI+LCBmbGF0YnVmZmVyczo6Z3JwYzo6TWVzc2FnZTxTdGF0Pj4+KEFzeW5jR2V0TWluTWF4SGl0UG9pbnRzUmF3KGNvbnRleHQsIGNxLCB0YWcpKTsKKyAgICB9CisgICAgc3RkOjp1bmlxdWVfcHRyPCAgOjpncnBjOjpDbGllbnRBc3luY1JlYWRlcldyaXRlcjwgZmxhdGJ1ZmZlcnM6OmdycGM6Ok1lc3NhZ2U8TW9uc3Rlcj4sIGZsYXRidWZmZXJzOjpncnBjOjpNZXNzYWdlPFN0YXQ+Pj4gUHJlcGFyZUFzeW5jR2V0TWluTWF4SGl0UG9pbnRzKDo6Z3JwYzo6Q2xpZW50Q29udGV4dCogY29udGV4dCwgOjpncnBjOjpDb21wbGV0aW9uUXVldWUqIGNxKSB7CisgICAgICByZXR1cm4gc3RkOjp1bmlxdWVfcHRyPCA6OmdycGM6OkNsaWVudEFzeW5jUmVhZGVyV3JpdGVyPCBmbGF0YnVmZmVyczo6Z3JwYzo6TWVzc2FnZTxNb25zdGVyPiwgZmxhdGJ1ZmZlcnM6OmdycGM6Ok1lc3NhZ2U8U3RhdD4+PihQcmVwYXJlQXN5bmNHZXRNaW5NYXhIaXRQb2ludHNSYXcoY29udGV4dCwgY3EpKTsKKyAgICB9CisgIAorICAgcHJpdmF0ZToKKyAgICBzdGQ6OnNoYXJlZF9wdHI8IDo6Z3JwYzo6Q2hhbm5lbEludGVyZmFjZT4gY2hhbm5lbF87CisgICAgOjpncnBjOjpDbGllbnRBc3luY1Jlc3BvbnNlUmVhZGVyPCBmbGF0YnVmZmVyczo6Z3JwYzo6TWVzc2FnZTxTdGF0Pj4qIEFzeW5jU3RvcmVSYXcoOjpncnBjOjpDbGllbnRDb250ZXh0KiBjb250ZXh0LCBjb25zdCBmbGF0YnVmZmVyczo6Z3JwYzo6TWVzc2FnZTxNb25zdGVyPiYgcmVxdWVzdCwgOjpncnBjOjpDb21wbGV0aW9uUXVldWUqIGNxKSBvdmVycmlkZTsKKyAgICA6OmdycGM6OkNsaWVudEFzeW5jUmVzcG9uc2VSZWFkZXI8IGZsYXRidWZmZXJzOjpncnBjOjpNZXNzYWdlPFN0YXQ+PiogUHJlcGFyZUFzeW5jU3RvcmVSYXcoOjpncnBjOjpDbGllbnRDb250ZXh0KiBjb250ZXh0LCBjb25zdCBmbGF0YnVmZmVyczo6Z3JwYzo6TWVzc2FnZTxNb25zdGVyPiYgcmVxdWVzdCwgOjpncnBjOjpDb21wbGV0aW9uUXVldWUqIGNxKSBvdmVycmlkZTsKKyAgICA6OmdycGM6OkNsaWVudFJlYWRlcjwgZmxhdGJ1ZmZlcnM6OmdycGM6Ok1lc3NhZ2U8TW9uc3Rlcj4+KiBSZXRyaWV2ZVJhdyg6OmdycGM6OkNsaWVudENvbnRleHQqIGNvbnRleHQsIGNvbnN0IGZsYXRidWZmZXJzOjpncnBjOjpNZXNzYWdlPFN0YXQ+JiByZXF1ZXN0KSBvdmVycmlkZTsKKyAgICA6OmdycGM6OkNsaWVudEFzeW5jUmVhZGVyPCBmbGF0YnVmZmVyczo6Z3JwYzo6TWVzc2FnZTxNb25zdGVyPj4qIEFzeW5jUmV0cmlldmVSYXcoOjpncnBjOjpDbGllbnRDb250ZXh0KiBjb250ZXh0LCBjb25zdCBmbGF0YnVmZmVyczo6Z3JwYzo6TWVzc2FnZTxTdGF0PiYgcmVxdWVzdCwgOjpncnBjOjpDb21wbGV0aW9uUXVldWUqIGNxLCB2b2lkKiB0YWcpIG92ZXJyaWRlOworICAgIDo6Z3JwYzo6Q2xpZW50QXN5bmNSZWFkZXI8IGZsYXRidWZmZXJzOjpncnBjOjpNZXNzYWdlPE1vbnN0ZXI+PiogUHJlcGFyZUFzeW5jUmV0cmlldmVSYXcoOjpncnBjOjpDbGllbnRDb250ZXh0KiBjb250ZXh0LCBjb25zdCBmbGF0YnVmZmVyczo6Z3JwYzo6TWVzc2FnZTxTdGF0PiYgcmVxdWVzdCwgOjpncnBjOjpDb21wbGV0aW9uUXVldWUqIGNxKSBvdmVycmlkZTsKKyAgICA6OmdycGM6OkNsaWVudFdyaXRlcjwgZmxhdGJ1ZmZlcnM6OmdycGM6Ok1lc3NhZ2U8TW9uc3Rlcj4+KiBHZXRNYXhIaXRQb2ludFJhdyg6OmdycGM6OkNsaWVudENvbnRleHQqIGNvbnRleHQsIGZsYXRidWZmZXJzOjpncnBjOjpNZXNzYWdlPFN0YXQ+KiByZXNwb25zZSkgb3ZlcnJpZGU7CisgICAgOjpncnBjOjpDbGllbnRBc3luY1dyaXRlcjwgZmxhdGJ1ZmZlcnM6OmdycGM6Ok1lc3NhZ2U8TW9uc3Rlcj4+KiBBc3luY0dldE1heEhpdFBvaW50UmF3KDo6Z3JwYzo6Q2xpZW50Q29udGV4dCogY29udGV4dCwgZmxhdGJ1ZmZlcnM6OmdycGM6Ok1lc3NhZ2U8U3RhdD4qIHJlc3BvbnNlLCA6OmdycGM6OkNvbXBsZXRpb25RdWV1ZSogY3EsIHZvaWQqIHRhZykgb3ZlcnJpZGU7CisgICAgOjpncnBjOjpDbGllbnRBc3luY1dyaXRlcjwgZmxhdGJ1ZmZlcnM6OmdycGM6Ok1lc3NhZ2U8TW9uc3Rlcj4+KiBQcmVwYXJlQXN5bmNHZXRNYXhIaXRQb2ludFJhdyg6OmdycGM6OkNsaWVudENvbnRleHQqIGNvbnRleHQsIGZsYXRidWZmZXJzOjpncnBjOjpNZXNzYWdlPFN0YXQ+KiByZXNwb25zZSwgOjpncnBjOjpDb21wbGV0aW9uUXVldWUqIGNxKSBvdmVycmlkZTsKKyAgICA6OmdycGM6OkNsaWVudFJlYWRlcldyaXRlcjwgZmxhdGJ1ZmZlcnM6OmdycGM6Ok1lc3NhZ2U8TW9uc3Rlcj4sIGZsYXRidWZmZXJzOjpncnBjOjpNZXNzYWdlPFN0YXQ+PiogR2V0TWluTWF4SGl0UG9pbnRzUmF3KDo6Z3JwYzo6Q2xpZW50Q29udGV4dCogY29udGV4dCkgb3ZlcnJpZGU7CisgICAgOjpncnBjOjpDbGllbnRBc3luY1JlYWRlcldyaXRlcjwgZmxhdGJ1ZmZlcnM6OmdycGM6Ok1lc3NhZ2U8TW9uc3Rlcj4sIGZsYXRidWZmZXJzOjpncnBjOjpNZXNzYWdlPFN0YXQ+PiogQXN5bmNHZXRNaW5NYXhIaXRQb2ludHNSYXcoOjpncnBjOjpDbGllbnRDb250ZXh0KiBjb250ZXh0LCA6OmdycGM6OkNvbXBsZXRpb25RdWV1ZSogY3EsIHZvaWQqIHRhZykgb3ZlcnJpZGU7CisgICAgOjpncnBjOjpDbGllbnRBc3luY1JlYWRlcldyaXRlcjwgZmxhdGJ1ZmZlcnM6OmdycGM6Ok1lc3NhZ2U8TW9uc3Rlcj4sIGZsYXRidWZmZXJzOjpncnBjOjpNZXNzYWdlPFN0YXQ+PiogUHJlcGFyZUFzeW5jR2V0TWluTWF4SGl0UG9pbnRzUmF3KDo6Z3JwYzo6Q2xpZW50Q29udGV4dCogY29udGV4dCwgOjpncnBjOjpDb21wbGV0aW9uUXVldWUqIGNxKSBvdmVycmlkZTsKKyAgICBjb25zdCA6OmdycGM6OmludGVybmFsOjpScGNNZXRob2QgcnBjbWV0aG9kX1N0b3JlXzsKKyAgICBjb25zdCA6OmdycGM6OmludGVybmFsOjpScGNNZXRob2QgcnBjbWV0aG9kX1JldHJpZXZlXzsKKyAgICBjb25zdCA6OmdycGM6OmludGVybmFsOjpScGNNZXRob2QgcnBjbWV0aG9kX0dldE1heEhpdFBvaW50XzsKKyAgICBjb25zdCA6OmdycGM6OmludGVybmFsOjpScGNNZXRob2QgcnBjbWV0aG9kX0dldE1pbk1heEhpdFBvaW50c187CisgIH07CisgIHN0YXRpYyBzdGQ6OnVuaXF1ZV9wdHI8U3R1Yj4gTmV3U3R1Yihjb25zdCBzdGQ6OnNoYXJlZF9wdHI8IDo6Z3JwYzo6Q2hhbm5lbEludGVyZmFjZT4mIGNoYW5uZWwsIGNvbnN0IDo6Z3JwYzo6U3R1Yk9wdGlvbnMmIG9wdGlvbnMgPSA6OmdycGM6OlN0dWJPcHRpb25zKCkpOworICAKKyAgY2xhc3MgU2VydmljZSA6IHB1YmxpYyA6OmdycGM6OlNlcnZpY2UgeworICAgcHVibGljOgorICAgIFNlcnZpY2UoKTsKKyAgICB2aXJ0dWFsIH5TZXJ2aWNlKCk7CisgICAgdmlydHVhbCA6OmdycGM6OlN0YXR1cyBTdG9yZSg6OmdycGM6OlNlcnZlckNvbnRleHQqIGNvbnRleHQsIGNvbnN0IGZsYXRidWZmZXJzOjpncnBjOjpNZXNzYWdlPE1vbnN0ZXI+KiByZXF1ZXN0LCBmbGF0YnVmZmVyczo6Z3JwYzo6TWVzc2FnZTxTdGF0PiogcmVzcG9uc2UpOworICAgIHZpcnR1YWwgOjpncnBjOjpTdGF0dXMgUmV0cmlldmUoOjpncnBjOjpTZXJ2ZXJDb250ZXh0KiBjb250ZXh0LCBjb25zdCBmbGF0YnVmZmVyczo6Z3JwYzo6TWVzc2FnZTxTdGF0PiogcmVxdWVzdCwgOjpncnBjOjpTZXJ2ZXJXcml0ZXI8IGZsYXRidWZmZXJzOjpncnBjOjpNZXNzYWdlPE1vbnN0ZXI+Piogd3JpdGVyKTsKKyAgICB2aXJ0dWFsIDo6Z3JwYzo6U3RhdHVzIEdldE1heEhpdFBvaW50KDo6Z3JwYzo6U2VydmVyQ29udGV4dCogY29udGV4dCwgOjpncnBjOjpTZXJ2ZXJSZWFkZXI8IGZsYXRidWZmZXJzOjpncnBjOjpNZXNzYWdlPE1vbnN0ZXI+PiogcmVhZGVyLCBmbGF0YnVmZmVyczo6Z3JwYzo6TWVzc2FnZTxTdGF0PiogcmVzcG9uc2UpOworICAgIHZpcnR1YWwgOjpncnBjOjpTdGF0dXMgR2V0TWluTWF4SGl0UG9pbnRzKDo6Z3JwYzo6U2VydmVyQ29udGV4dCogY29udGV4dCwgOjpncnBjOjpTZXJ2ZXJSZWFkZXJXcml0ZXI8IGZsYXRidWZmZXJzOjpncnBjOjpNZXNzYWdlPFN0YXQ+LCBmbGF0YnVmZmVyczo6Z3JwYzo6TWVzc2FnZTxNb25zdGVyPj4qIHN0cmVhbSk7CisgIH07CisgIHRlbXBsYXRlIDxjbGFzcyBCYXNlQ2xhc3M+CisgIGNsYXNzIFdpdGhBc3luY01ldGhvZF9TdG9yZSA6IHB1YmxpYyBCYXNlQ2xhc3MgeworICAgcHJpdmF0ZToKKyAgICB2b2lkIEJhc2VDbGFzc011c3RCZURlcml2ZWRGcm9tU2VydmljZShjb25zdCBTZXJ2aWNlICovKnNlcnZpY2UqLykge30KKyAgIHB1YmxpYzoKKyAgICBXaXRoQXN5bmNNZXRob2RfU3RvcmUoKSB7CisgICAgICA6OmdycGM6OlNlcnZpY2U6Ok1hcmtNZXRob2RBc3luYygwKTsKKyAgICB9CisgICAgfldpdGhBc3luY01ldGhvZF9TdG9yZSgpIG92ZXJyaWRlIHsKKyAgICAgIEJhc2VDbGFzc011c3RCZURlcml2ZWRGcm9tU2VydmljZSh0aGlzKTsKKyAgICB9CisgICAgLy8gZGlzYWJsZSBzeW5jaHJvbm91cyB2ZXJzaW9uIG9mIHRoaXMgbWV0aG9kCisgICAgOjpncnBjOjpTdGF0dXMgU3RvcmUoOjpncnBjOjpTZXJ2ZXJDb250ZXh0KiAvKmNvbnRleHQqLywgY29uc3QgZmxhdGJ1ZmZlcnM6OmdycGM6Ok1lc3NhZ2U8TW9uc3Rlcj4qIC8qcmVxdWVzdCovLCBmbGF0YnVmZmVyczo6Z3JwYzo6TWVzc2FnZTxTdGF0PiogLypyZXNwb25zZSovKSBmaW5hbCBvdmVycmlkZSB7CisgICAgICBhYm9ydCgpOworICAgICAgcmV0dXJuIDo6Z3JwYzo6U3RhdHVzKDo6Z3JwYzo6U3RhdHVzQ29kZTo6VU5JTVBMRU1FTlRFRCwgIiIpOworICAgIH0KKyAgICB2b2lkIFJlcXVlc3RTdG9yZSg6OmdycGM6OlNlcnZlckNvbnRleHQqIGNvbnRleHQsIGZsYXRidWZmZXJzOjpncnBjOjpNZXNzYWdlPE1vbnN0ZXI+KiByZXF1ZXN0LCA6OmdycGM6OlNlcnZlckFzeW5jUmVzcG9uc2VXcml0ZXI8IGZsYXRidWZmZXJzOjpncnBjOjpNZXNzYWdlPFN0YXQ+PiogcmVzcG9uc2UsIDo6Z3JwYzo6Q29tcGxldGlvblF1ZXVlKiBuZXdfY2FsbF9jcSwgOjpncnBjOjpTZXJ2ZXJDb21wbGV0aW9uUXVldWUqIG5vdGlmaWNhdGlvbl9jcSwgdm9pZCAqdGFnKSB7CisgICAgICA6OmdycGM6OlNlcnZpY2U6OlJlcXVlc3RBc3luY1VuYXJ5KDAsIGNvbnRleHQsIHJlcXVlc3QsIHJlc3BvbnNlLCBuZXdfY2FsbF9jcSwgbm90aWZpY2F0aW9uX2NxLCB0YWcpOworICAgIH0KKyAgfTsKKyAgdGVtcGxhdGUgPGNsYXNzIEJhc2VDbGFzcz4KKyAgY2xhc3MgV2l0aEFzeW5jTWV0aG9kX1JldHJpZXZlIDogcHVibGljIEJhc2VDbGFzcyB7CisgICBwcml2YXRlOgorICAgIHZvaWQgQmFzZUNsYXNzTXVzdEJlRGVyaXZlZEZyb21TZXJ2aWNlKGNvbnN0IFNlcnZpY2UgKi8qc2VydmljZSovKSB7fQorICAgcHVibGljOgorICAgIFdpdGhBc3luY01ldGhvZF9SZXRyaWV2ZSgpIHsKKyAgICAgIDo6Z3JwYzo6U2VydmljZTo6TWFya01ldGhvZEFzeW5jKDEpOworICAgIH0KKyAgICB+V2l0aEFzeW5jTWV0aG9kX1JldHJpZXZlKCkgb3ZlcnJpZGUgeworICAgICAgQmFzZUNsYXNzTXVzdEJlRGVyaXZlZEZyb21TZXJ2aWNlKHRoaXMpOworICAgIH0KKyAgICAvLyBkaXNhYmxlIHN5bmNocm9ub3VzIHZlcnNpb24gb2YgdGhpcyBtZXRob2QKKyAgICA6OmdycGM6OlN0YXR1cyBSZXRyaWV2ZSg6OmdycGM6OlNlcnZlckNvbnRleHQqIC8qY29udGV4dCovLCBjb25zdCBmbGF0YnVmZmVyczo6Z3JwYzo6TWVzc2FnZTxTdGF0PiogLypyZXF1ZXN0Ki8sIDo6Z3JwYzo6U2VydmVyV3JpdGVyPCBmbGF0YnVmZmVyczo6Z3JwYzo6TWVzc2FnZTxNb25zdGVyPj4qIC8qd3JpdGVyKi8pIGZpbmFsIG92ZXJyaWRlIHsKKyAgICAgIGFib3J0KCk7CisgICAgICByZXR1cm4gOjpncnBjOjpTdGF0dXMoOjpncnBjOjpTdGF0dXNDb2RlOjpVTklNUExFTUVOVEVELCAiIik7CisgICAgfQorICAgIHZvaWQgUmVxdWVzdFJldHJpZXZlKDo6Z3JwYzo6U2VydmVyQ29udGV4dCogY29udGV4dCwgZmxhdGJ1ZmZlcnM6OmdycGM6Ok1lc3NhZ2U8U3RhdD4qIHJlcXVlc3QsIDo6Z3JwYzo6U2VydmVyQXN5bmNXcml0ZXI8IGZsYXRidWZmZXJzOjpncnBjOjpNZXNzYWdlPE1vbnN0ZXI+Piogd3JpdGVyLCA6OmdycGM6OkNvbXBsZXRpb25RdWV1ZSogbmV3X2NhbGxfY3EsIDo6Z3JwYzo6U2VydmVyQ29tcGxldGlvblF1ZXVlKiBub3RpZmljYXRpb25fY3EsIHZvaWQgKnRhZykgeworICAgICAgOjpncnBjOjpTZXJ2aWNlOjpSZXF1ZXN0QXN5bmNTZXJ2ZXJTdHJlYW1pbmcoMSwgY29udGV4dCwgcmVxdWVzdCwgd3JpdGVyLCBuZXdfY2FsbF9jcSwgbm90aWZpY2F0aW9uX2NxLCB0YWcpOworICAgIH0KKyAgfTsKKyAgdGVtcGxhdGUgPGNsYXNzIEJhc2VDbGFzcz4KKyAgY2xhc3MgV2l0aEFzeW5jTWV0aG9kX0dldE1heEhpdFBvaW50IDogcHVibGljIEJhc2VDbGFzcyB7CisgICBwcml2YXRlOgorICAgIHZvaWQgQmFzZUNsYXNzTXVzdEJlRGVyaXZlZEZyb21TZXJ2aWNlKGNvbnN0IFNlcnZpY2UgKi8qc2VydmljZSovKSB7fQorICAgcHVibGljOgorICAgIFdpdGhBc3luY01ldGhvZF9HZXRNYXhIaXRQb2ludCgpIHsKKyAgICAgIDo6Z3JwYzo6U2VydmljZTo6TWFya01ldGhvZEFzeW5jKDIpOworICAgIH0KKyAgICB+V2l0aEFzeW5jTWV0aG9kX0dldE1heEhpdFBvaW50KCkgb3ZlcnJpZGUgeworICAgICAgQmFzZUNsYXNzTXVzdEJlRGVyaXZlZEZyb21TZXJ2aWNlKHRoaXMpOworICAgIH0KKyAgICAvLyBkaXNhYmxlIHN5bmNocm9ub3VzIHZlcnNpb24gb2YgdGhpcyBtZXRob2QKKyAgICA6OmdycGM6OlN0YXR1cyBHZXRNYXhIaXRQb2ludCg6OmdycGM6OlNlcnZlckNvbnRleHQqIC8qY29udGV4dCovLCA6OmdycGM6OlNlcnZlclJlYWRlcjwgZmxhdGJ1ZmZlcnM6OmdycGM6Ok1lc3NhZ2U8TW9uc3Rlcj4+KiAvKnJlYWRlciovLCBmbGF0YnVmZmVyczo6Z3JwYzo6TWVzc2FnZTxTdGF0PiogLypyZXNwb25zZSovKSBmaW5hbCBvdmVycmlkZSB7CisgICAgICBhYm9ydCgpOworICAgICAgcmV0dXJuIDo6Z3JwYzo6U3RhdHVzKDo6Z3JwYzo6U3RhdHVzQ29kZTo6VU5JTVBMRU1FTlRFRCwgIiIpOworICAgIH0KKyAgICB2b2lkIFJlcXVlc3RHZXRNYXhIaXRQb2ludCg6OmdycGM6OlNlcnZlckNvbnRleHQqIGNvbnRleHQsIDo6Z3JwYzo6U2VydmVyQXN5bmNSZWFkZXI8IGZsYXRidWZmZXJzOjpncnBjOjpNZXNzYWdlPFN0YXQ+LCBmbGF0YnVmZmVyczo6Z3JwYzo6TWVzc2FnZTxNb25zdGVyPj4qIHJlYWRlciwgOjpncnBjOjpDb21wbGV0aW9uUXVldWUqIG5ld19jYWxsX2NxLCA6OmdycGM6OlNlcnZlckNvbXBsZXRpb25RdWV1ZSogbm90aWZpY2F0aW9uX2NxLCB2b2lkICp0YWcpIHsKKyAgICAgIDo6Z3JwYzo6U2VydmljZTo6UmVxdWVzdEFzeW5jQ2xpZW50U3RyZWFtaW5nKDIsIGNvbnRleHQsIHJlYWRlciwgbmV3X2NhbGxfY3EsIG5vdGlmaWNhdGlvbl9jcSwgdGFnKTsKKyAgICB9CisgIH07CisgIHRlbXBsYXRlIDxjbGFzcyBCYXNlQ2xhc3M+CisgIGNsYXNzIFdpdGhBc3luY01ldGhvZF9HZXRNaW5NYXhIaXRQb2ludHMgOiBwdWJsaWMgQmFzZUNsYXNzIHsKKyAgIHByaXZhdGU6CisgICAgdm9pZCBCYXNlQ2xhc3NNdXN0QmVEZXJpdmVkRnJvbVNlcnZpY2UoY29uc3QgU2VydmljZSAqLypzZXJ2aWNlKi8pIHt9CisgICBwdWJsaWM6CisgICAgV2l0aEFzeW5jTWV0aG9kX0dldE1pbk1heEhpdFBvaW50cygpIHsKKyAgICAgIDo6Z3JwYzo6U2VydmljZTo6TWFya01ldGhvZEFzeW5jKDMpOworICAgIH0KKyAgICB+V2l0aEFzeW5jTWV0aG9kX0dldE1pbk1heEhpdFBvaW50cygpIG92ZXJyaWRlIHsKKyAgICAgIEJhc2VDbGFzc011c3RCZURlcml2ZWRGcm9tU2VydmljZSh0aGlzKTsKKyAgICB9CisgICAgLy8gZGlzYWJsZSBzeW5jaHJvbm91cyB2ZXJzaW9uIG9mIHRoaXMgbWV0aG9kCisgICAgOjpncnBjOjpTdGF0dXMgR2V0TWluTWF4SGl0UG9pbnRzKDo6Z3JwYzo6U2VydmVyQ29udGV4dCogLypjb250ZXh0Ki8sIDo6Z3JwYzo6U2VydmVyUmVhZGVyV3JpdGVyPCBmbGF0YnVmZmVyczo6Z3JwYzo6TWVzc2FnZTxTdGF0PiwgZmxhdGJ1ZmZlcnM6OmdycGM6Ok1lc3NhZ2U8TW9uc3Rlcj4+KiAvKnN0cmVhbSovKSBmaW5hbCBvdmVycmlkZSB7CisgICAgICBhYm9ydCgpOworICAgICAgcmV0dXJuIDo6Z3JwYzo6U3RhdHVzKDo6Z3JwYzo6U3RhdHVzQ29kZTo6VU5JTVBMRU1FTlRFRCwgIiIpOworICAgIH0KKyAgICB2b2lkIFJlcXVlc3RHZXRNaW5NYXhIaXRQb2ludHMoOjpncnBjOjpTZXJ2ZXJDb250ZXh0KiBjb250ZXh0LCA6OmdycGM6OlNlcnZlckFzeW5jUmVhZGVyV3JpdGVyPCBmbGF0YnVmZmVyczo6Z3JwYzo6TWVzc2FnZTxTdGF0PiwgZmxhdGJ1ZmZlcnM6OmdycGM6Ok1lc3NhZ2U8TW9uc3Rlcj4+KiBzdHJlYW0sIDo6Z3JwYzo6Q29tcGxldGlvblF1ZXVlKiBuZXdfY2FsbF9jcSwgOjpncnBjOjpTZXJ2ZXJDb21wbGV0aW9uUXVldWUqIG5vdGlmaWNhdGlvbl9jcSwgdm9pZCAqdGFnKSB7CisgICAgICA6OmdycGM6OlNlcnZpY2U6OlJlcXVlc3RBc3luY0JpZGlTdHJlYW1pbmcoMywgY29udGV4dCwgc3RyZWFtLCBuZXdfY2FsbF9jcSwgbm90aWZpY2F0aW9uX2NxLCB0YWcpOworICAgIH0KKyAgfTsKKyAgdHlwZWRlZiAgIFdpdGhBc3luY01ldGhvZF9TdG9yZTwgIFdpdGhBc3luY01ldGhvZF9SZXRyaWV2ZTwgIFdpdGhBc3luY01ldGhvZF9HZXRNYXhIaXRQb2ludDwgIFdpdGhBc3luY01ldGhvZF9HZXRNaW5NYXhIaXRQb2ludHM8ICBTZXJ2aWNlICAgPiAgID4gICA+ICAgPiAgIEFzeW5jU2VydmljZTsKKyAgdGVtcGxhdGUgPGNsYXNzIEJhc2VDbGFzcz4KKyAgY2xhc3MgV2l0aEdlbmVyaWNNZXRob2RfU3RvcmUgOiBwdWJsaWMgQmFzZUNsYXNzIHsKKyAgIHByaXZhdGU6CisgICAgdm9pZCBCYXNlQ2xhc3NNdXN0QmVEZXJpdmVkRnJvbVNlcnZpY2UoY29uc3QgU2VydmljZSAqLypzZXJ2aWNlKi8pIHt9CisgICBwdWJsaWM6CisgICAgV2l0aEdlbmVyaWNNZXRob2RfU3RvcmUoKSB7CisgICAgICA6OmdycGM6OlNlcnZpY2U6Ok1hcmtNZXRob2RHZW5lcmljKDApOworICAgIH0KKyAgICB+V2l0aEdlbmVyaWNNZXRob2RfU3RvcmUoKSBvdmVycmlkZSB7CisgICAgICBCYXNlQ2xhc3NNdXN0QmVEZXJpdmVkRnJvbVNlcnZpY2UodGhpcyk7CisgICAgfQorICAgIC8vIGRpc2FibGUgc3luY2hyb25vdXMgdmVyc2lvbiBvZiB0aGlzIG1ldGhvZAorICAgIDo6Z3JwYzo6U3RhdHVzIFN0b3JlKDo6Z3JwYzo6U2VydmVyQ29udGV4dCogLypjb250ZXh0Ki8sIGNvbnN0IGZsYXRidWZmZXJzOjpncnBjOjpNZXNzYWdlPE1vbnN0ZXI+KiAvKnJlcXVlc3QqLywgZmxhdGJ1ZmZlcnM6OmdycGM6Ok1lc3NhZ2U8U3RhdD4qIC8qcmVzcG9uc2UqLykgZmluYWwgb3ZlcnJpZGUgeworICAgICAgYWJvcnQoKTsKKyAgICAgIHJldHVybiA6OmdycGM6OlN0YXR1cyg6OmdycGM6OlN0YXR1c0NvZGU6OlVOSU1QTEVNRU5URUQsICIiKTsKKyAgICB9CisgIH07CisgIHRlbXBsYXRlIDxjbGFzcyBCYXNlQ2xhc3M+CisgIGNsYXNzIFdpdGhHZW5lcmljTWV0aG9kX1JldHJpZXZlIDogcHVibGljIEJhc2VDbGFzcyB7CisgICBwcml2YXRlOgorICAgIHZvaWQgQmFzZUNsYXNzTXVzdEJlRGVyaXZlZEZyb21TZXJ2aWNlKGNvbnN0IFNlcnZpY2UgKi8qc2VydmljZSovKSB7fQorICAgcHVibGljOgorICAgIFdpdGhHZW5lcmljTWV0aG9kX1JldHJpZXZlKCkgeworICAgICAgOjpncnBjOjpTZXJ2aWNlOjpNYXJrTWV0aG9kR2VuZXJpYygxKTsKKyAgICB9CisgICAgfldpdGhHZW5lcmljTWV0aG9kX1JldHJpZXZlKCkgb3ZlcnJpZGUgeworICAgICAgQmFzZUNsYXNzTXVzdEJlRGVyaXZlZEZyb21TZXJ2aWNlKHRoaXMpOworICAgIH0KKyAgICAvLyBkaXNhYmxlIHN5bmNocm9ub3VzIHZlcnNpb24gb2YgdGhpcyBtZXRob2QKKyAgICA6OmdycGM6OlN0YXR1cyBSZXRyaWV2ZSg6OmdycGM6OlNlcnZlckNvbnRleHQqIC8qY29udGV4dCovLCBjb25zdCBmbGF0YnVmZmVyczo6Z3JwYzo6TWVzc2FnZTxTdGF0PiogLypyZXF1ZXN0Ki8sIDo6Z3JwYzo6U2VydmVyV3JpdGVyPCBmbGF0YnVmZmVyczo6Z3JwYzo6TWVzc2FnZTxNb25zdGVyPj4qIC8qd3JpdGVyKi8pIGZpbmFsIG92ZXJyaWRlIHsKKyAgICAgIGFib3J0KCk7CisgICAgICByZXR1cm4gOjpncnBjOjpTdGF0dXMoOjpncnBjOjpTdGF0dXNDb2RlOjpVTklNUExFTUVOVEVELCAiIik7CisgICAgfQorICB9OworICB0ZW1wbGF0ZSA8Y2xhc3MgQmFzZUNsYXNzPgorICBjbGFzcyBXaXRoR2VuZXJpY01ldGhvZF9HZXRNYXhIaXRQb2ludCA6IHB1YmxpYyBCYXNlQ2xhc3MgeworICAgcHJpdmF0ZToKKyAgICB2b2lkIEJhc2VDbGFzc011c3RCZURlcml2ZWRGcm9tU2VydmljZShjb25zdCBTZXJ2aWNlICovKnNlcnZpY2UqLykge30KKyAgIHB1YmxpYzoKKyAgICBXaXRoR2VuZXJpY01ldGhvZF9HZXRNYXhIaXRQb2ludCgpIHsKKyAgICAgIDo6Z3JwYzo6U2VydmljZTo6TWFya01ldGhvZEdlbmVyaWMoMik7CisgICAgfQorICAgIH5XaXRoR2VuZXJpY01ldGhvZF9HZXRNYXhIaXRQb2ludCgpIG92ZXJyaWRlIHsKKyAgICAgIEJhc2VDbGFzc011c3RCZURlcml2ZWRGcm9tU2VydmljZSh0aGlzKTsKKyAgICB9CisgICAgLy8gZGlzYWJsZSBzeW5jaHJvbm91cyB2ZXJzaW9uIG9mIHRoaXMgbWV0aG9kCisgICAgOjpncnBjOjpTdGF0dXMgR2V0TWF4SGl0UG9pbnQoOjpncnBjOjpTZXJ2ZXJDb250ZXh0KiAvKmNvbnRleHQqLywgOjpncnBjOjpTZXJ2ZXJSZWFkZXI8IGZsYXRidWZmZXJzOjpncnBjOjpNZXNzYWdlPE1vbnN0ZXI+PiogLypyZWFkZXIqLywgZmxhdGJ1ZmZlcnM6OmdycGM6Ok1lc3NhZ2U8U3RhdD4qIC8qcmVzcG9uc2UqLykgZmluYWwgb3ZlcnJpZGUgeworICAgICAgYWJvcnQoKTsKKyAgICAgIHJldHVybiA6OmdycGM6OlN0YXR1cyg6OmdycGM6OlN0YXR1c0NvZGU6OlVOSU1QTEVNRU5URUQsICIiKTsKKyAgICB9CisgIH07CisgIHRlbXBsYXRlIDxjbGFzcyBCYXNlQ2xhc3M+CisgIGNsYXNzIFdpdGhHZW5lcmljTWV0aG9kX0dldE1pbk1heEhpdFBvaW50cyA6IHB1YmxpYyBCYXNlQ2xhc3MgeworICAgcHJpdmF0ZToKKyAgICB2b2lkIEJhc2VDbGFzc011c3RCZURlcml2ZWRGcm9tU2VydmljZShjb25zdCBTZXJ2aWNlICovKnNlcnZpY2UqLykge30KKyAgIHB1YmxpYzoKKyAgICBXaXRoR2VuZXJpY01ldGhvZF9HZXRNaW5NYXhIaXRQb2ludHMoKSB7CisgICAgICA6OmdycGM6OlNlcnZpY2U6Ok1hcmtNZXRob2RHZW5lcmljKDMpOworICAgIH0KKyAgICB+V2l0aEdlbmVyaWNNZXRob2RfR2V0TWluTWF4SGl0UG9pbnRzKCkgb3ZlcnJpZGUgeworICAgICAgQmFzZUNsYXNzTXVzdEJlRGVyaXZlZEZyb21TZXJ2aWNlKHRoaXMpOworICAgIH0KKyAgICAvLyBkaXNhYmxlIHN5bmNocm9ub3VzIHZlcnNpb24gb2YgdGhpcyBtZXRob2QKKyAgICA6OmdycGM6OlN0YXR1cyBHZXRNaW5NYXhIaXRQb2ludHMoOjpncnBjOjpTZXJ2ZXJDb250ZXh0KiAvKmNvbnRleHQqLywgOjpncnBjOjpTZXJ2ZXJSZWFkZXJXcml0ZXI8IGZsYXRidWZmZXJzOjpncnBjOjpNZXNzYWdlPFN0YXQ+LCBmbGF0YnVmZmVyczo6Z3JwYzo6TWVzc2FnZTxNb25zdGVyPj4qIC8qc3RyZWFtKi8pIGZpbmFsIG92ZXJyaWRlIHsKKyAgICAgIGFib3J0KCk7CisgICAgICByZXR1cm4gOjpncnBjOjpTdGF0dXMoOjpncnBjOjpTdGF0dXNDb2RlOjpVTklNUExFTUVOVEVELCAiIik7CisgICAgfQorICB9OworICB0ZW1wbGF0ZSA8Y2xhc3MgQmFzZUNsYXNzPgorICBjbGFzcyBXaXRoU3RyZWFtZWRVbmFyeU1ldGhvZF9TdG9yZSA6IHB1YmxpYyBCYXNlQ2xhc3MgeworICAgcHJpdmF0ZToKKyAgICB2b2lkIEJhc2VDbGFzc011c3RCZURlcml2ZWRGcm9tU2VydmljZShjb25zdCBTZXJ2aWNlICovKnNlcnZpY2UqLykge30KKyAgIHB1YmxpYzoKKyAgICBXaXRoU3RyZWFtZWRVbmFyeU1ldGhvZF9TdG9yZSgpIHsKKyAgICAgIDo6Z3JwYzo6U2VydmljZTo6TWFya01ldGhvZFN0cmVhbWVkKDAsCisgICAgICAgIG5ldyA6OmdycGM6OmludGVybmFsOjpTdHJlYW1lZFVuYXJ5SGFuZGxlcjwgZmxhdGJ1ZmZlcnM6OmdycGM6Ok1lc3NhZ2U8TW9uc3Rlcj4sIGZsYXRidWZmZXJzOjpncnBjOjpNZXNzYWdlPFN0YXQ+PihzdGQ6OmJpbmQoJldpdGhTdHJlYW1lZFVuYXJ5TWV0aG9kX1N0b3JlPEJhc2VDbGFzcz46OlN0cmVhbWVkU3RvcmUsIHRoaXMsIHN0ZDo6cGxhY2Vob2xkZXJzOjpfMSwgc3RkOjpwbGFjZWhvbGRlcnM6Ol8yKSkpOworICAgIH0KKyAgICB+V2l0aFN0cmVhbWVkVW5hcnlNZXRob2RfU3RvcmUoKSBvdmVycmlkZSB7CisgICAgICBCYXNlQ2xhc3NNdXN0QmVEZXJpdmVkRnJvbVNlcnZpY2UodGhpcyk7CisgICAgfQorICAgIC8vIGRpc2FibGUgcmVndWxhciB2ZXJzaW9uIG9mIHRoaXMgbWV0aG9kCisgICAgOjpncnBjOjpTdGF0dXMgU3RvcmUoOjpncnBjOjpTZXJ2ZXJDb250ZXh0KiAvKmNvbnRleHQqLywgY29uc3QgZmxhdGJ1ZmZlcnM6OmdycGM6Ok1lc3NhZ2U8TW9uc3Rlcj4qIC8qcmVxdWVzdCovLCBmbGF0YnVmZmVyczo6Z3JwYzo6TWVzc2FnZTxTdGF0PiogLypyZXNwb25zZSovKSBmaW5hbCBvdmVycmlkZSB7CisgICAgICBhYm9ydCgpOworICAgICAgcmV0dXJuIDo6Z3JwYzo6U3RhdHVzKDo6Z3JwYzo6U3RhdHVzQ29kZTo6VU5JTVBMRU1FTlRFRCwgIiIpOworICAgIH0KKyAgICAvLyByZXBsYWNlIGRlZmF1bHQgdmVyc2lvbiBvZiBtZXRob2Qgd2l0aCBzdHJlYW1lZCB1bmFyeQorICAgIHZpcnR1YWwgOjpncnBjOjpTdGF0dXMgU3RyZWFtZWRTdG9yZSg6OmdycGM6OlNlcnZlckNvbnRleHQqIGNvbnRleHQsIDo6Z3JwYzo6U2VydmVyVW5hcnlTdHJlYW1lcjwgZmxhdGJ1ZmZlcnM6OmdycGM6Ok1lc3NhZ2U8TW9uc3Rlcj4sZmxhdGJ1ZmZlcnM6OmdycGM6Ok1lc3NhZ2U8U3RhdD4+KiBzZXJ2ZXJfdW5hcnlfc3RyZWFtZXIpID0gMDsKKyAgfTsKKyAgdHlwZWRlZiAgIFdpdGhTdHJlYW1lZFVuYXJ5TWV0aG9kX1N0b3JlPCAgU2VydmljZSAgID4gICBTdHJlYW1lZFVuYXJ5U2VydmljZTsKKyAgdGVtcGxhdGUgPGNsYXNzIEJhc2VDbGFzcz4KKyAgY2xhc3MgV2l0aFNwbGl0U3RyZWFtaW5nTWV0aG9kX1JldHJpZXZlIDogcHVibGljIEJhc2VDbGFzcyB7CisgICBwcml2YXRlOgorICAgIHZvaWQgQmFzZUNsYXNzTXVzdEJlRGVyaXZlZEZyb21TZXJ2aWNlKGNvbnN0IFNlcnZpY2UgKi8qc2VydmljZSovKSB7IH0KKyAgIHB1YmxpYzoKKyAgICBXaXRoU3BsaXRTdHJlYW1pbmdNZXRob2RfUmV0cmlldmUoKSB7CisgICAgICA6OmdycGM6OlNlcnZpY2U6Ok1hcmtNZXRob2RTdHJlYW1lZCgxLAorICAgICAgICBuZXcgOjpncnBjOjppbnRlcm5hbDo6U3BsaXRTZXJ2ZXJTdHJlYW1pbmdIYW5kbGVyPCBmbGF0YnVmZmVyczo6Z3JwYzo6TWVzc2FnZTxTdGF0PiwgZmxhdGJ1ZmZlcnM6OmdycGM6Ok1lc3NhZ2U8TW9uc3Rlcj4+KHN0ZDo6YmluZCgmV2l0aFNwbGl0U3RyZWFtaW5nTWV0aG9kX1JldHJpZXZlPEJhc2VDbGFzcz46OlN0cmVhbWVkUmV0cmlldmUsIHRoaXMsIHN0ZDo6cGxhY2Vob2xkZXJzOjpfMSwgc3RkOjpwbGFjZWhvbGRlcnM6Ol8yKSkpOworICAgIH0KKyAgICB+V2l0aFNwbGl0U3RyZWFtaW5nTWV0aG9kX1JldHJpZXZlKCkgb3ZlcnJpZGUgeworICAgICAgQmFzZUNsYXNzTXVzdEJlRGVyaXZlZEZyb21TZXJ2aWNlKHRoaXMpOworICAgIH0KKyAgICAvLyBkaXNhYmxlIHJlZ3VsYXIgdmVyc2lvbiBvZiB0aGlzIG1ldGhvZAorICAgIDo6Z3JwYzo6U3RhdHVzIFJldHJpZXZlKDo6Z3JwYzo6U2VydmVyQ29udGV4dCogLypjb250ZXh0Ki8sIGNvbnN0IGZsYXRidWZmZXJzOjpncnBjOjpNZXNzYWdlPFN0YXQ+KiAvKnJlcXVlc3QqLywgOjpncnBjOjpTZXJ2ZXJXcml0ZXI8IGZsYXRidWZmZXJzOjpncnBjOjpNZXNzYWdlPE1vbnN0ZXI+PiogLyp3cml0ZXIqLykgZmluYWwgb3ZlcnJpZGUgeworICAgICAgYWJvcnQoKTsKKyAgICAgIHJldHVybiA6OmdycGM6OlN0YXR1cyg6OmdycGM6OlN0YXR1c0NvZGU6OlVOSU1QTEVNRU5URUQsICIiKTsKKyAgICB9CisgICAgLy8gcmVwbGFjZSBkZWZhdWx0IHZlcnNpb24gb2YgbWV0aG9kIHdpdGggc3BsaXQgc3RyZWFtZWQKKyAgICB2aXJ0dWFsIDo6Z3JwYzo6U3RhdHVzIFN0cmVhbWVkUmV0cmlldmUoOjpncnBjOjpTZXJ2ZXJDb250ZXh0KiBjb250ZXh0LCA6OmdycGM6OlNlcnZlclNwbGl0U3RyZWFtZXI8IGZsYXRidWZmZXJzOjpncnBjOjpNZXNzYWdlPFN0YXQ+LGZsYXRidWZmZXJzOjpncnBjOjpNZXNzYWdlPE1vbnN0ZXI+Piogc2VydmVyX3NwbGl0X3N0cmVhbWVyKSA9IDA7CisgIH07CisgIHR5cGVkZWYgICBXaXRoU3BsaXRTdHJlYW1pbmdNZXRob2RfUmV0cmlldmU8ICBTZXJ2aWNlICAgPiAgIFNwbGl0U3RyZWFtZWRTZXJ2aWNlOworICB0eXBlZGVmICAgV2l0aFN0cmVhbWVkVW5hcnlNZXRob2RfU3RvcmU8ICBXaXRoU3BsaXRTdHJlYW1pbmdNZXRob2RfUmV0cmlldmU8ICBTZXJ2aWNlICAgPiAgID4gICBTdHJlYW1lZFNlcnZpY2U7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgRXhhbXBsZQorfSAgLy8gbmFtZXNwYWNlIE15R2FtZQorCisKKyNlbmRpZiAgLy8gR1JQQ19tb25zdGVyXzVmdGVzdF9fSU5DTFVERUQKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL21vbnN0ZXJfdGVzdF9zdWZmaXgvbW9uc3Rlcl90ZXN0X3N1ZmZpeC5ocHAgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9tb25zdGVyX3Rlc3Rfc3VmZml4L21vbnN0ZXJfdGVzdF9zdWZmaXguaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRlYWI3N2IKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9tb25zdGVyX3Rlc3Rfc3VmZml4L21vbnN0ZXJfdGVzdF9zdWZmaXguaHBwCkBAIC0wLDAgKzEsNDAzNCBAQAorLy8gYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgYnkgdGhlIEZsYXRCdWZmZXJzIGNvbXBpbGVyLCBkbyBub3QgbW9kaWZ5CisKKworI2lmbmRlZiBGTEFUQlVGRkVSU19HRU5FUkFURURfTU9OU1RFUlRFU1RfTVlHQU1FX0VYQU1QTEVfSF8KKyNkZWZpbmUgRkxBVEJVRkZFUlNfR0VORVJBVEVEX01PTlNURVJURVNUX01ZR0FNRV9FWEFNUExFX0hfCisKKyNpbmNsdWRlICJmbGF0YnVmZmVycy9mbGF0YnVmZmVycy5oIgorI2luY2x1ZGUgImZsYXRidWZmZXJzL2ZsZXhidWZmZXJzLmgiCisjaW5jbHVkZSAiZmxhdGJ1ZmZlcnMvZmxleF9mbGF0X3V0aWwuaCIKKworLy8gRW5zdXJlIHRoZSBpbmNsdWRlZCBmbGF0YnVmZmVycy5oIGlzIHRoZSBzYW1lIHZlcnNpb24gYXMgd2hlbiB0aGlzIGZpbGUgd2FzCisvLyBnZW5lcmF0ZWQsIG90aGVyd2lzZSBpdCBtYXkgbm90IGJlIGNvbXBhdGlibGUuCitzdGF0aWNfYXNzZXJ0KEZMQVRCVUZGRVJTX1ZFUlNJT05fTUFKT1IgPT0gMiAmJgorICAgICAgICAgICAgICBGTEFUQlVGRkVSU19WRVJTSU9OX01JTk9SID09IDAgJiYKKyAgICAgICAgICAgICAgRkxBVEJVRkZFUlNfVkVSU0lPTl9SRVZJU0lPTiA9PSA4LAorICAgICAgICAgICAgICJOb24tY29tcGF0aWJsZSBmbGF0YnVmZmVycyB2ZXJzaW9uIGluY2x1ZGVkIik7CisKK25hbWVzcGFjZSBNeUdhbWUgeworCitzdHJ1Y3QgSW5QYXJlbnROYW1lc3BhY2U7CitzdHJ1Y3QgSW5QYXJlbnROYW1lc3BhY2VCdWlsZGVyOworc3RydWN0IEluUGFyZW50TmFtZXNwYWNlVDsKKworbmFtZXNwYWNlIEV4YW1wbGUyIHsKKworc3RydWN0IE1vbnN0ZXI7CitzdHJ1Y3QgTW9uc3RlckJ1aWxkZXI7CitzdHJ1Y3QgTW9uc3RlclQ7CisKK30gIC8vIG5hbWVzcGFjZSBFeGFtcGxlMgorCituYW1lc3BhY2UgRXhhbXBsZSB7CisKK3N0cnVjdCBUZXN0OworCitzdHJ1Y3QgVGVzdFNpbXBsZVRhYmxlV2l0aEVudW07CitzdHJ1Y3QgVGVzdFNpbXBsZVRhYmxlV2l0aEVudW1CdWlsZGVyOworc3RydWN0IFRlc3RTaW1wbGVUYWJsZVdpdGhFbnVtVDsKKworc3RydWN0IFZlYzM7CisKK3N0cnVjdCBBYmlsaXR5OworCitzdHJ1Y3QgU3RydWN0T2ZTdHJ1Y3RzOworCitzdHJ1Y3QgU3RydWN0T2ZTdHJ1Y3RzT2ZTdHJ1Y3RzOworCitzdHJ1Y3QgU3RhdDsKK3N0cnVjdCBTdGF0QnVpbGRlcjsKK3N0cnVjdCBTdGF0VDsKKworc3RydWN0IFJlZmVycmFibGU7CitzdHJ1Y3QgUmVmZXJyYWJsZUJ1aWxkZXI7CitzdHJ1Y3QgUmVmZXJyYWJsZVQ7CisKK3N0cnVjdCBNb25zdGVyOworc3RydWN0IE1vbnN0ZXJCdWlsZGVyOworc3RydWN0IE1vbnN0ZXJUOworCitzdHJ1Y3QgVHlwZUFsaWFzZXM7CitzdHJ1Y3QgVHlwZUFsaWFzZXNCdWlsZGVyOworc3RydWN0IFR5cGVBbGlhc2VzVDsKKworfSAgLy8gbmFtZXNwYWNlIEV4YW1wbGUKKworYm9vbCBvcGVyYXRvcj09KGNvbnN0IEluUGFyZW50TmFtZXNwYWNlVCAmbGhzLCBjb25zdCBJblBhcmVudE5hbWVzcGFjZVQgJnJocyk7Citib29sIG9wZXJhdG9yIT0oY29uc3QgSW5QYXJlbnROYW1lc3BhY2VUICZsaHMsIGNvbnN0IEluUGFyZW50TmFtZXNwYWNlVCAmcmhzKTsKK25hbWVzcGFjZSBFeGFtcGxlMiB7CisKK2Jvb2wgb3BlcmF0b3I9PShjb25zdCBNb25zdGVyVCAmbGhzLCBjb25zdCBNb25zdGVyVCAmcmhzKTsKK2Jvb2wgb3BlcmF0b3IhPShjb25zdCBNb25zdGVyVCAmbGhzLCBjb25zdCBNb25zdGVyVCAmcmhzKTsKK30gIC8vIG5hbWVzcGFjZSBFeGFtcGxlMgorCituYW1lc3BhY2UgRXhhbXBsZSB7CisKK2Jvb2wgb3BlcmF0b3I9PShjb25zdCBUZXN0ICZsaHMsIGNvbnN0IFRlc3QgJnJocyk7Citib29sIG9wZXJhdG9yIT0oY29uc3QgVGVzdCAmbGhzLCBjb25zdCBUZXN0ICZyaHMpOworYm9vbCBvcGVyYXRvcj09KGNvbnN0IFRlc3RTaW1wbGVUYWJsZVdpdGhFbnVtVCAmbGhzLCBjb25zdCBUZXN0U2ltcGxlVGFibGVXaXRoRW51bVQgJnJocyk7Citib29sIG9wZXJhdG9yIT0oY29uc3QgVGVzdFNpbXBsZVRhYmxlV2l0aEVudW1UICZsaHMsIGNvbnN0IFRlc3RTaW1wbGVUYWJsZVdpdGhFbnVtVCAmcmhzKTsKK2Jvb2wgb3BlcmF0b3I9PShjb25zdCBWZWMzICZsaHMsIGNvbnN0IFZlYzMgJnJocyk7Citib29sIG9wZXJhdG9yIT0oY29uc3QgVmVjMyAmbGhzLCBjb25zdCBWZWMzICZyaHMpOworYm9vbCBvcGVyYXRvcj09KGNvbnN0IEFiaWxpdHkgJmxocywgY29uc3QgQWJpbGl0eSAmcmhzKTsKK2Jvb2wgb3BlcmF0b3IhPShjb25zdCBBYmlsaXR5ICZsaHMsIGNvbnN0IEFiaWxpdHkgJnJocyk7Citib29sIG9wZXJhdG9yPT0oY29uc3QgU3RydWN0T2ZTdHJ1Y3RzICZsaHMsIGNvbnN0IFN0cnVjdE9mU3RydWN0cyAmcmhzKTsKK2Jvb2wgb3BlcmF0b3IhPShjb25zdCBTdHJ1Y3RPZlN0cnVjdHMgJmxocywgY29uc3QgU3RydWN0T2ZTdHJ1Y3RzICZyaHMpOworYm9vbCBvcGVyYXRvcj09KGNvbnN0IFN0cnVjdE9mU3RydWN0c09mU3RydWN0cyAmbGhzLCBjb25zdCBTdHJ1Y3RPZlN0cnVjdHNPZlN0cnVjdHMgJnJocyk7Citib29sIG9wZXJhdG9yIT0oY29uc3QgU3RydWN0T2ZTdHJ1Y3RzT2ZTdHJ1Y3RzICZsaHMsIGNvbnN0IFN0cnVjdE9mU3RydWN0c09mU3RydWN0cyAmcmhzKTsKK2Jvb2wgb3BlcmF0b3I9PShjb25zdCBTdGF0VCAmbGhzLCBjb25zdCBTdGF0VCAmcmhzKTsKK2Jvb2wgb3BlcmF0b3IhPShjb25zdCBTdGF0VCAmbGhzLCBjb25zdCBTdGF0VCAmcmhzKTsKK2Jvb2wgb3BlcmF0b3I9PShjb25zdCBSZWZlcnJhYmxlVCAmbGhzLCBjb25zdCBSZWZlcnJhYmxlVCAmcmhzKTsKK2Jvb2wgb3BlcmF0b3IhPShjb25zdCBSZWZlcnJhYmxlVCAmbGhzLCBjb25zdCBSZWZlcnJhYmxlVCAmcmhzKTsKK2Jvb2wgb3BlcmF0b3I9PShjb25zdCBNb25zdGVyVCAmbGhzLCBjb25zdCBNb25zdGVyVCAmcmhzKTsKK2Jvb2wgb3BlcmF0b3IhPShjb25zdCBNb25zdGVyVCAmbGhzLCBjb25zdCBNb25zdGVyVCAmcmhzKTsKK2Jvb2wgb3BlcmF0b3I9PShjb25zdCBUeXBlQWxpYXNlc1QgJmxocywgY29uc3QgVHlwZUFsaWFzZXNUICZyaHMpOworYm9vbCBvcGVyYXRvciE9KGNvbnN0IFR5cGVBbGlhc2VzVCAmbGhzLCBjb25zdCBUeXBlQWxpYXNlc1QgJnJocyk7CisKK30gIC8vIG5hbWVzcGFjZSBFeGFtcGxlCisKK2lubGluZSBjb25zdCBmbGF0YnVmZmVyczo6VHlwZVRhYmxlICpJblBhcmVudE5hbWVzcGFjZVR5cGVUYWJsZSgpOworCituYW1lc3BhY2UgRXhhbXBsZTIgeworCitpbmxpbmUgY29uc3QgZmxhdGJ1ZmZlcnM6OlR5cGVUYWJsZSAqTW9uc3RlclR5cGVUYWJsZSgpOworCit9ICAvLyBuYW1lc3BhY2UgRXhhbXBsZTIKKworbmFtZXNwYWNlIEV4YW1wbGUgeworCitpbmxpbmUgY29uc3QgZmxhdGJ1ZmZlcnM6OlR5cGVUYWJsZSAqVGVzdFR5cGVUYWJsZSgpOworCitpbmxpbmUgY29uc3QgZmxhdGJ1ZmZlcnM6OlR5cGVUYWJsZSAqVGVzdFNpbXBsZVRhYmxlV2l0aEVudW1UeXBlVGFibGUoKTsKKworaW5saW5lIGNvbnN0IGZsYXRidWZmZXJzOjpUeXBlVGFibGUgKlZlYzNUeXBlVGFibGUoKTsKKworaW5saW5lIGNvbnN0IGZsYXRidWZmZXJzOjpUeXBlVGFibGUgKkFiaWxpdHlUeXBlVGFibGUoKTsKKworaW5saW5lIGNvbnN0IGZsYXRidWZmZXJzOjpUeXBlVGFibGUgKlN0cnVjdE9mU3RydWN0c1R5cGVUYWJsZSgpOworCitpbmxpbmUgY29uc3QgZmxhdGJ1ZmZlcnM6OlR5cGVUYWJsZSAqU3RydWN0T2ZTdHJ1Y3RzT2ZTdHJ1Y3RzVHlwZVRhYmxlKCk7CisKK2lubGluZSBjb25zdCBmbGF0YnVmZmVyczo6VHlwZVRhYmxlICpTdGF0VHlwZVRhYmxlKCk7CisKK2lubGluZSBjb25zdCBmbGF0YnVmZmVyczo6VHlwZVRhYmxlICpSZWZlcnJhYmxlVHlwZVRhYmxlKCk7CisKK2lubGluZSBjb25zdCBmbGF0YnVmZmVyczo6VHlwZVRhYmxlICpNb25zdGVyVHlwZVRhYmxlKCk7CisKK2lubGluZSBjb25zdCBmbGF0YnVmZmVyczo6VHlwZVRhYmxlICpUeXBlQWxpYXNlc1R5cGVUYWJsZSgpOworCisvLy8gQ29tcG9zaXRlIGNvbXBvbmVudHMgb2YgTW9uc3RlciBjb2xvci4KK2VudW0gQ29sb3IgOiB1aW50OF90IHsKKyAgQ29sb3JfUmVkID0gMSwKKyAgLy8vIFxicmllZiBjb2xvciBHcmVlbgorICAvLy8gR3JlZW4gaXMgYml0X2ZsYWcgd2l0aCB2YWx1ZSAoMXUgPDwgMSkKKyAgQ29sb3JfR3JlZW4gPSAyLAorICAvLy8gXGJyaWVmIGNvbG9yIEJsdWUgKDF1IDw8IDMpCisgIENvbG9yX0JsdWUgPSA4LAorICBDb2xvcl9OT05FID0gMCwKKyAgQ29sb3JfQU5ZID0gMTEKK307CisKK2lubGluZSBjb25zdCBDb2xvciAoJkVudW1WYWx1ZXNDb2xvcigpKVszXSB7CisgIHN0YXRpYyBjb25zdCBDb2xvciB2YWx1ZXNbXSA9IHsKKyAgICBDb2xvcl9SZWQsCisgICAgQ29sb3JfR3JlZW4sCisgICAgQ29sb3JfQmx1ZQorICB9OworICByZXR1cm4gdmFsdWVzOworfQorCitpbmxpbmUgY29uc3QgY2hhciAqIGNvbnN0ICpFbnVtTmFtZXNDb2xvcigpIHsKKyAgc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBuYW1lc1s5XSA9IHsKKyAgICAiUmVkIiwKKyAgICAiR3JlZW4iLAorICAgICIiLAorICAgICIiLAorICAgICIiLAorICAgICIiLAorICAgICIiLAorICAgICJCbHVlIiwKKyAgICBudWxscHRyCisgIH07CisgIHJldHVybiBuYW1lczsKK30KKworaW5saW5lIGNvbnN0IGNoYXIgKkVudW1OYW1lQ29sb3IoQ29sb3IgZSkgeworICBpZiAoZmxhdGJ1ZmZlcnM6OklzT3V0UmFuZ2UoZSwgQ29sb3JfUmVkLCBDb2xvcl9CbHVlKSkgcmV0dXJuICIiOworICBjb25zdCBzaXplX3QgaW5kZXggPSBzdGF0aWNfY2FzdDxzaXplX3Q+KGUpIC0gc3RhdGljX2Nhc3Q8c2l6ZV90PihDb2xvcl9SZWQpOworICByZXR1cm4gRW51bU5hbWVzQ29sb3IoKVtpbmRleF07Cit9CisKK2VudW0gUmFjZSA6IGludDhfdCB7CisgIFJhY2VfTm9uZSA9IC0xLAorICBSYWNlX0h1bWFuID0gMCwKKyAgUmFjZV9Ed2FyZiA9IDEsCisgIFJhY2VfRWxmID0gMiwKKyAgUmFjZV9NSU4gPSBSYWNlX05vbmUsCisgIFJhY2VfTUFYID0gUmFjZV9FbGYKK307CisKK2lubGluZSBjb25zdCBSYWNlICgmRW51bVZhbHVlc1JhY2UoKSlbNF0geworICBzdGF0aWMgY29uc3QgUmFjZSB2YWx1ZXNbXSA9IHsKKyAgICBSYWNlX05vbmUsCisgICAgUmFjZV9IdW1hbiwKKyAgICBSYWNlX0R3YXJmLAorICAgIFJhY2VfRWxmCisgIH07CisgIHJldHVybiB2YWx1ZXM7Cit9CisKK2lubGluZSBjb25zdCBjaGFyICogY29uc3QgKkVudW1OYW1lc1JhY2UoKSB7CisgIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgbmFtZXNbNV0gPSB7CisgICAgIk5vbmUiLAorICAgICJIdW1hbiIsCisgICAgIkR3YXJmIiwKKyAgICAiRWxmIiwKKyAgICBudWxscHRyCisgIH07CisgIHJldHVybiBuYW1lczsKK30KKworaW5saW5lIGNvbnN0IGNoYXIgKkVudW1OYW1lUmFjZShSYWNlIGUpIHsKKyAgaWYgKGZsYXRidWZmZXJzOjpJc091dFJhbmdlKGUsIFJhY2VfTm9uZSwgUmFjZV9FbGYpKSByZXR1cm4gIiI7CisgIGNvbnN0IHNpemVfdCBpbmRleCA9IHN0YXRpY19jYXN0PHNpemVfdD4oZSkgLSBzdGF0aWNfY2FzdDxzaXplX3Q+KFJhY2VfTm9uZSk7CisgIHJldHVybiBFbnVtTmFtZXNSYWNlKClbaW5kZXhdOworfQorCitlbnVtIExvbmdFbnVtIDogdWludDY0X3QgeworICBMb25nRW51bV9Mb25nT25lID0gMlVMTCwKKyAgTG9uZ0VudW1fTG9uZ1R3byA9IDRVTEwsCisgIExvbmdFbnVtX0xvbmdCaWcgPSAxMDk5NTExNjI3Nzc2VUxMLAorICBMb25nRW51bV9OT05FID0gMCwKKyAgTG9uZ0VudW1fQU5ZID0gMTA5OTUxMTYyNzc4MlVMTAorfTsKKworaW5saW5lIGNvbnN0IExvbmdFbnVtICgmRW51bVZhbHVlc0xvbmdFbnVtKCkpWzNdIHsKKyAgc3RhdGljIGNvbnN0IExvbmdFbnVtIHZhbHVlc1tdID0geworICAgIExvbmdFbnVtX0xvbmdPbmUsCisgICAgTG9uZ0VudW1fTG9uZ1R3bywKKyAgICBMb25nRW51bV9Mb25nQmlnCisgIH07CisgIHJldHVybiB2YWx1ZXM7Cit9CisKK2lubGluZSBjb25zdCBjaGFyICpFbnVtTmFtZUxvbmdFbnVtKExvbmdFbnVtIGUpIHsKKyAgc3dpdGNoIChlKSB7CisgICAgY2FzZSBMb25nRW51bV9Mb25nT25lOiByZXR1cm4gIkxvbmdPbmUiOworICAgIGNhc2UgTG9uZ0VudW1fTG9uZ1R3bzogcmV0dXJuICJMb25nVHdvIjsKKyAgICBjYXNlIExvbmdFbnVtX0xvbmdCaWc6IHJldHVybiAiTG9uZ0JpZyI7CisgICAgZGVmYXVsdDogcmV0dXJuICIiOworICB9Cit9CisKK2VudW0gQW55IDogdWludDhfdCB7CisgIEFueV9OT05FID0gMCwKKyAgQW55X01vbnN0ZXIgPSAxLAorICBBbnlfVGVzdFNpbXBsZVRhYmxlV2l0aEVudW0gPSAyLAorICBBbnlfTXlHYW1lX0V4YW1wbGUyX01vbnN0ZXIgPSAzLAorICBBbnlfTUlOID0gQW55X05PTkUsCisgIEFueV9NQVggPSBBbnlfTXlHYW1lX0V4YW1wbGUyX01vbnN0ZXIKK307CisKK2lubGluZSBjb25zdCBBbnkgKCZFbnVtVmFsdWVzQW55KCkpWzRdIHsKKyAgc3RhdGljIGNvbnN0IEFueSB2YWx1ZXNbXSA9IHsKKyAgICBBbnlfTk9ORSwKKyAgICBBbnlfTW9uc3RlciwKKyAgICBBbnlfVGVzdFNpbXBsZVRhYmxlV2l0aEVudW0sCisgICAgQW55X015R2FtZV9FeGFtcGxlMl9Nb25zdGVyCisgIH07CisgIHJldHVybiB2YWx1ZXM7Cit9CisKK2lubGluZSBjb25zdCBjaGFyICogY29uc3QgKkVudW1OYW1lc0FueSgpIHsKKyAgc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBuYW1lc1s1XSA9IHsKKyAgICAiTk9ORSIsCisgICAgIk1vbnN0ZXIiLAorICAgICJUZXN0U2ltcGxlVGFibGVXaXRoRW51bSIsCisgICAgIk15R2FtZV9FeGFtcGxlMl9Nb25zdGVyIiwKKyAgICBudWxscHRyCisgIH07CisgIHJldHVybiBuYW1lczsKK30KKworaW5saW5lIGNvbnN0IGNoYXIgKkVudW1OYW1lQW55KEFueSBlKSB7CisgIGlmIChmbGF0YnVmZmVyczo6SXNPdXRSYW5nZShlLCBBbnlfTk9ORSwgQW55X015R2FtZV9FeGFtcGxlMl9Nb25zdGVyKSkgcmV0dXJuICIiOworICBjb25zdCBzaXplX3QgaW5kZXggPSBzdGF0aWNfY2FzdDxzaXplX3Q+KGUpOworICByZXR1cm4gRW51bU5hbWVzQW55KClbaW5kZXhdOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBzdHJ1Y3QgQW55VHJhaXRzIHsKKyAgc3RhdGljIGNvbnN0IEFueSBlbnVtX3ZhbHVlID0gQW55X05PTkU7Cit9OworCit0ZW1wbGF0ZTw+IHN0cnVjdCBBbnlUcmFpdHM8TXlHYW1lOjpFeGFtcGxlOjpNb25zdGVyPiB7CisgIHN0YXRpYyBjb25zdCBBbnkgZW51bV92YWx1ZSA9IEFueV9Nb25zdGVyOworfTsKKwordGVtcGxhdGU8PiBzdHJ1Y3QgQW55VHJhaXRzPE15R2FtZTo6RXhhbXBsZTo6VGVzdFNpbXBsZVRhYmxlV2l0aEVudW0+IHsKKyAgc3RhdGljIGNvbnN0IEFueSBlbnVtX3ZhbHVlID0gQW55X1Rlc3RTaW1wbGVUYWJsZVdpdGhFbnVtOworfTsKKwordGVtcGxhdGU8PiBzdHJ1Y3QgQW55VHJhaXRzPE15R2FtZTo6RXhhbXBsZTI6Ok1vbnN0ZXI+IHsKKyAgc3RhdGljIGNvbnN0IEFueSBlbnVtX3ZhbHVlID0gQW55X015R2FtZV9FeGFtcGxlMl9Nb25zdGVyOworfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgVD4gc3RydWN0IEFueVVuaW9uVHJhaXRzIHsKKyAgc3RhdGljIGNvbnN0IEFueSBlbnVtX3ZhbHVlID0gQW55X05PTkU7Cit9OworCit0ZW1wbGF0ZTw+IHN0cnVjdCBBbnlVbmlvblRyYWl0czxNeUdhbWU6OkV4YW1wbGU6Ok1vbnN0ZXJUPiB7CisgIHN0YXRpYyBjb25zdCBBbnkgZW51bV92YWx1ZSA9IEFueV9Nb25zdGVyOworfTsKKwordGVtcGxhdGU8PiBzdHJ1Y3QgQW55VW5pb25UcmFpdHM8TXlHYW1lOjpFeGFtcGxlOjpUZXN0U2ltcGxlVGFibGVXaXRoRW51bVQ+IHsKKyAgc3RhdGljIGNvbnN0IEFueSBlbnVtX3ZhbHVlID0gQW55X1Rlc3RTaW1wbGVUYWJsZVdpdGhFbnVtOworfTsKKwordGVtcGxhdGU8PiBzdHJ1Y3QgQW55VW5pb25UcmFpdHM8TXlHYW1lOjpFeGFtcGxlMjo6TW9uc3RlclQ+IHsKKyAgc3RhdGljIGNvbnN0IEFueSBlbnVtX3ZhbHVlID0gQW55X015R2FtZV9FeGFtcGxlMl9Nb25zdGVyOworfTsKKworc3RydWN0IEFueVVuaW9uIHsKKyAgQW55IHR5cGU7CisgIHZvaWQgKnZhbHVlOworCisgIEFueVVuaW9uKCkgOiB0eXBlKEFueV9OT05FKSwgdmFsdWUobnVsbHB0cikge30KKyAgQW55VW5pb24oQW55VW5pb24mJiB1KSBGTEFUQlVGRkVSU19OT0VYQ0VQVCA6CisgICAgdHlwZShBbnlfTk9ORSksIHZhbHVlKG51bGxwdHIpCisgICAgeyBzdGQ6OnN3YXAodHlwZSwgdS50eXBlKTsgc3RkOjpzd2FwKHZhbHVlLCB1LnZhbHVlKTsgfQorICBBbnlVbmlvbihjb25zdCBBbnlVbmlvbiAmKTsKKyAgQW55VW5pb24gJm9wZXJhdG9yPShjb25zdCBBbnlVbmlvbiAmdSkKKyAgICB7IEFueVVuaW9uIHQodSk7IHN0ZDo6c3dhcCh0eXBlLCB0LnR5cGUpOyBzdGQ6OnN3YXAodmFsdWUsIHQudmFsdWUpOyByZXR1cm4gKnRoaXM7IH0KKyAgQW55VW5pb24gJm9wZXJhdG9yPShBbnlVbmlvbiAmJnUpIEZMQVRCVUZGRVJTX05PRVhDRVBUCisgICAgeyBzdGQ6OnN3YXAodHlwZSwgdS50eXBlKTsgc3RkOjpzd2FwKHZhbHVlLCB1LnZhbHVlKTsgcmV0dXJuICp0aGlzOyB9CisgIH5BbnlVbmlvbigpIHsgUmVzZXQoKTsgfQorCisgIHZvaWQgUmVzZXQoKTsKKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKyAgdm9pZCBTZXQoVCYmIHZhbCkgeworICAgIHR5cGVkZWYgdHlwZW5hbWUgc3RkOjpyZW1vdmVfcmVmZXJlbmNlPFQ+Ojp0eXBlIFJUOworICAgIFJlc2V0KCk7CisgICAgdHlwZSA9IEFueVVuaW9uVHJhaXRzPFJUPjo6ZW51bV92YWx1ZTsKKyAgICBpZiAodHlwZSAhPSBBbnlfTk9ORSkgeworICAgICAgdmFsdWUgPSBuZXcgUlQoc3RkOjpmb3J3YXJkPFQ+KHZhbCkpOworICAgIH0KKyAgfQorCisgIHN0YXRpYyB2b2lkICpVblBhY2soY29uc3Qgdm9pZCAqb2JqLCBBbnkgdHlwZSwgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKnJlc29sdmVyKTsKKyAgZmxhdGJ1ZmZlcnM6Ok9mZnNldDx2b2lkPiBQYWNrKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlciA9IG51bGxwdHIpIGNvbnN0OworCisgIE15R2FtZTo6RXhhbXBsZTo6TW9uc3RlclQgKkFzTW9uc3RlcigpIHsKKyAgICByZXR1cm4gdHlwZSA9PSBBbnlfTW9uc3RlciA/CisgICAgICByZWludGVycHJldF9jYXN0PE15R2FtZTo6RXhhbXBsZTo6TW9uc3RlclQgKj4odmFsdWUpIDogbnVsbHB0cjsKKyAgfQorICBjb25zdCBNeUdhbWU6OkV4YW1wbGU6Ok1vbnN0ZXJUICpBc01vbnN0ZXIoKSBjb25zdCB7CisgICAgcmV0dXJuIHR5cGUgPT0gQW55X01vbnN0ZXIgPworICAgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBNeUdhbWU6OkV4YW1wbGU6Ok1vbnN0ZXJUICo+KHZhbHVlKSA6IG51bGxwdHI7CisgIH0KKyAgTXlHYW1lOjpFeGFtcGxlOjpUZXN0U2ltcGxlVGFibGVXaXRoRW51bVQgKkFzVGVzdFNpbXBsZVRhYmxlV2l0aEVudW0oKSB7CisgICAgcmV0dXJuIHR5cGUgPT0gQW55X1Rlc3RTaW1wbGVUYWJsZVdpdGhFbnVtID8KKyAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8TXlHYW1lOjpFeGFtcGxlOjpUZXN0U2ltcGxlVGFibGVXaXRoRW51bVQgKj4odmFsdWUpIDogbnVsbHB0cjsKKyAgfQorICBjb25zdCBNeUdhbWU6OkV4YW1wbGU6OlRlc3RTaW1wbGVUYWJsZVdpdGhFbnVtVCAqQXNUZXN0U2ltcGxlVGFibGVXaXRoRW51bSgpIGNvbnN0IHsKKyAgICByZXR1cm4gdHlwZSA9PSBBbnlfVGVzdFNpbXBsZVRhYmxlV2l0aEVudW0gPworICAgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBNeUdhbWU6OkV4YW1wbGU6OlRlc3RTaW1wbGVUYWJsZVdpdGhFbnVtVCAqPih2YWx1ZSkgOiBudWxscHRyOworICB9CisgIE15R2FtZTo6RXhhbXBsZTI6Ok1vbnN0ZXJUICpBc015R2FtZV9FeGFtcGxlMl9Nb25zdGVyKCkgeworICAgIHJldHVybiB0eXBlID09IEFueV9NeUdhbWVfRXhhbXBsZTJfTW9uc3RlciA/CisgICAgICByZWludGVycHJldF9jYXN0PE15R2FtZTo6RXhhbXBsZTI6Ok1vbnN0ZXJUICo+KHZhbHVlKSA6IG51bGxwdHI7CisgIH0KKyAgY29uc3QgTXlHYW1lOjpFeGFtcGxlMjo6TW9uc3RlclQgKkFzTXlHYW1lX0V4YW1wbGUyX01vbnN0ZXIoKSBjb25zdCB7CisgICAgcmV0dXJuIHR5cGUgPT0gQW55X015R2FtZV9FeGFtcGxlMl9Nb25zdGVyID8KKyAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgTXlHYW1lOjpFeGFtcGxlMjo6TW9uc3RlclQgKj4odmFsdWUpIDogbnVsbHB0cjsKKyAgfQorfTsKKworCitpbmxpbmUgYm9vbCBvcGVyYXRvcj09KGNvbnN0IEFueVVuaW9uICZsaHMsIGNvbnN0IEFueVVuaW9uICZyaHMpIHsKKyAgaWYgKGxocy50eXBlICE9IHJocy50eXBlKSByZXR1cm4gZmFsc2U7CisgIHN3aXRjaCAobGhzLnR5cGUpIHsKKyAgICBjYXNlIEFueV9OT05FOiB7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgY2FzZSBBbnlfTW9uc3RlcjogeworICAgICAgcmV0dXJuICoocmVpbnRlcnByZXRfY2FzdDxjb25zdCBNeUdhbWU6OkV4YW1wbGU6Ok1vbnN0ZXJUICo+KGxocy52YWx1ZSkpID09CisgICAgICAgICAgICAgKihyZWludGVycHJldF9jYXN0PGNvbnN0IE15R2FtZTo6RXhhbXBsZTo6TW9uc3RlclQgKj4ocmhzLnZhbHVlKSk7CisgICAgfQorICAgIGNhc2UgQW55X1Rlc3RTaW1wbGVUYWJsZVdpdGhFbnVtOiB7CisgICAgICByZXR1cm4gKihyZWludGVycHJldF9jYXN0PGNvbnN0IE15R2FtZTo6RXhhbXBsZTo6VGVzdFNpbXBsZVRhYmxlV2l0aEVudW1UICo+KGxocy52YWx1ZSkpID09CisgICAgICAgICAgICAgKihyZWludGVycHJldF9jYXN0PGNvbnN0IE15R2FtZTo6RXhhbXBsZTo6VGVzdFNpbXBsZVRhYmxlV2l0aEVudW1UICo+KHJocy52YWx1ZSkpOworICAgIH0KKyAgICBjYXNlIEFueV9NeUdhbWVfRXhhbXBsZTJfTW9uc3RlcjogeworICAgICAgcmV0dXJuICoocmVpbnRlcnByZXRfY2FzdDxjb25zdCBNeUdhbWU6OkV4YW1wbGUyOjpNb25zdGVyVCAqPihsaHMudmFsdWUpKSA9PQorICAgICAgICAgICAgICoocmVpbnRlcnByZXRfY2FzdDxjb25zdCBNeUdhbWU6OkV4YW1wbGUyOjpNb25zdGVyVCAqPihyaHMudmFsdWUpKTsKKyAgICB9CisgICAgZGVmYXVsdDogeworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgfQorfQorCitpbmxpbmUgYm9vbCBvcGVyYXRvciE9KGNvbnN0IEFueVVuaW9uICZsaHMsIGNvbnN0IEFueVVuaW9uICZyaHMpIHsKKyAgICByZXR1cm4gIShsaHMgPT0gcmhzKTsKK30KKworYm9vbCBWZXJpZnlBbnkoZmxhdGJ1ZmZlcnM6OlZlcmlmaWVyICZ2ZXJpZmllciwgY29uc3Qgdm9pZCAqb2JqLCBBbnkgdHlwZSk7Citib29sIFZlcmlmeUFueVZlY3RvcihmbGF0YnVmZmVyczo6VmVyaWZpZXIgJnZlcmlmaWVyLCBjb25zdCBmbGF0YnVmZmVyczo6VmVjdG9yPGZsYXRidWZmZXJzOjpPZmZzZXQ8dm9pZD4+ICp2YWx1ZXMsIGNvbnN0IGZsYXRidWZmZXJzOjpWZWN0b3I8dWludDhfdD4gKnR5cGVzKTsKKworZW51bSBBbnlVbmlxdWVBbGlhc2VzIDogdWludDhfdCB7CisgIEFueVVuaXF1ZUFsaWFzZXNfTk9ORSA9IDAsCisgIEFueVVuaXF1ZUFsaWFzZXNfTSA9IDEsCisgIEFueVVuaXF1ZUFsaWFzZXNfVFMgPSAyLAorICBBbnlVbmlxdWVBbGlhc2VzX00yID0gMywKKyAgQW55VW5pcXVlQWxpYXNlc19NSU4gPSBBbnlVbmlxdWVBbGlhc2VzX05PTkUsCisgIEFueVVuaXF1ZUFsaWFzZXNfTUFYID0gQW55VW5pcXVlQWxpYXNlc19NMgorfTsKKworaW5saW5lIGNvbnN0IEFueVVuaXF1ZUFsaWFzZXMgKCZFbnVtVmFsdWVzQW55VW5pcXVlQWxpYXNlcygpKVs0XSB7CisgIHN0YXRpYyBjb25zdCBBbnlVbmlxdWVBbGlhc2VzIHZhbHVlc1tdID0geworICAgIEFueVVuaXF1ZUFsaWFzZXNfTk9ORSwKKyAgICBBbnlVbmlxdWVBbGlhc2VzX00sCisgICAgQW55VW5pcXVlQWxpYXNlc19UUywKKyAgICBBbnlVbmlxdWVBbGlhc2VzX00yCisgIH07CisgIHJldHVybiB2YWx1ZXM7Cit9CisKK2lubGluZSBjb25zdCBjaGFyICogY29uc3QgKkVudW1OYW1lc0FueVVuaXF1ZUFsaWFzZXMoKSB7CisgIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgbmFtZXNbNV0gPSB7CisgICAgIk5PTkUiLAorICAgICJNIiwKKyAgICAiVFMiLAorICAgICJNMiIsCisgICAgbnVsbHB0cgorICB9OworICByZXR1cm4gbmFtZXM7Cit9CisKK2lubGluZSBjb25zdCBjaGFyICpFbnVtTmFtZUFueVVuaXF1ZUFsaWFzZXMoQW55VW5pcXVlQWxpYXNlcyBlKSB7CisgIGlmIChmbGF0YnVmZmVyczo6SXNPdXRSYW5nZShlLCBBbnlVbmlxdWVBbGlhc2VzX05PTkUsIEFueVVuaXF1ZUFsaWFzZXNfTTIpKSByZXR1cm4gIiI7CisgIGNvbnN0IHNpemVfdCBpbmRleCA9IHN0YXRpY19jYXN0PHNpemVfdD4oZSk7CisgIHJldHVybiBFbnVtTmFtZXNBbnlVbmlxdWVBbGlhc2VzKClbaW5kZXhdOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBzdHJ1Y3QgQW55VW5pcXVlQWxpYXNlc1RyYWl0cyB7CisgIHN0YXRpYyBjb25zdCBBbnlVbmlxdWVBbGlhc2VzIGVudW1fdmFsdWUgPSBBbnlVbmlxdWVBbGlhc2VzX05PTkU7Cit9OworCit0ZW1wbGF0ZTw+IHN0cnVjdCBBbnlVbmlxdWVBbGlhc2VzVHJhaXRzPE15R2FtZTo6RXhhbXBsZTo6TW9uc3Rlcj4geworICBzdGF0aWMgY29uc3QgQW55VW5pcXVlQWxpYXNlcyBlbnVtX3ZhbHVlID0gQW55VW5pcXVlQWxpYXNlc19NOworfTsKKwordGVtcGxhdGU8PiBzdHJ1Y3QgQW55VW5pcXVlQWxpYXNlc1RyYWl0czxNeUdhbWU6OkV4YW1wbGU6OlRlc3RTaW1wbGVUYWJsZVdpdGhFbnVtPiB7CisgIHN0YXRpYyBjb25zdCBBbnlVbmlxdWVBbGlhc2VzIGVudW1fdmFsdWUgPSBBbnlVbmlxdWVBbGlhc2VzX1RTOworfTsKKwordGVtcGxhdGU8PiBzdHJ1Y3QgQW55VW5pcXVlQWxpYXNlc1RyYWl0czxNeUdhbWU6OkV4YW1wbGUyOjpNb25zdGVyPiB7CisgIHN0YXRpYyBjb25zdCBBbnlVbmlxdWVBbGlhc2VzIGVudW1fdmFsdWUgPSBBbnlVbmlxdWVBbGlhc2VzX00yOworfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgVD4gc3RydWN0IEFueVVuaXF1ZUFsaWFzZXNVbmlvblRyYWl0cyB7CisgIHN0YXRpYyBjb25zdCBBbnlVbmlxdWVBbGlhc2VzIGVudW1fdmFsdWUgPSBBbnlVbmlxdWVBbGlhc2VzX05PTkU7Cit9OworCit0ZW1wbGF0ZTw+IHN0cnVjdCBBbnlVbmlxdWVBbGlhc2VzVW5pb25UcmFpdHM8TXlHYW1lOjpFeGFtcGxlOjpNb25zdGVyVD4geworICBzdGF0aWMgY29uc3QgQW55VW5pcXVlQWxpYXNlcyBlbnVtX3ZhbHVlID0gQW55VW5pcXVlQWxpYXNlc19NOworfTsKKwordGVtcGxhdGU8PiBzdHJ1Y3QgQW55VW5pcXVlQWxpYXNlc1VuaW9uVHJhaXRzPE15R2FtZTo6RXhhbXBsZTo6VGVzdFNpbXBsZVRhYmxlV2l0aEVudW1UPiB7CisgIHN0YXRpYyBjb25zdCBBbnlVbmlxdWVBbGlhc2VzIGVudW1fdmFsdWUgPSBBbnlVbmlxdWVBbGlhc2VzX1RTOworfTsKKwordGVtcGxhdGU8PiBzdHJ1Y3QgQW55VW5pcXVlQWxpYXNlc1VuaW9uVHJhaXRzPE15R2FtZTo6RXhhbXBsZTI6Ok1vbnN0ZXJUPiB7CisgIHN0YXRpYyBjb25zdCBBbnlVbmlxdWVBbGlhc2VzIGVudW1fdmFsdWUgPSBBbnlVbmlxdWVBbGlhc2VzX00yOworfTsKKworc3RydWN0IEFueVVuaXF1ZUFsaWFzZXNVbmlvbiB7CisgIEFueVVuaXF1ZUFsaWFzZXMgdHlwZTsKKyAgdm9pZCAqdmFsdWU7CisKKyAgQW55VW5pcXVlQWxpYXNlc1VuaW9uKCkgOiB0eXBlKEFueVVuaXF1ZUFsaWFzZXNfTk9ORSksIHZhbHVlKG51bGxwdHIpIHt9CisgIEFueVVuaXF1ZUFsaWFzZXNVbmlvbihBbnlVbmlxdWVBbGlhc2VzVW5pb24mJiB1KSBGTEFUQlVGRkVSU19OT0VYQ0VQVCA6CisgICAgdHlwZShBbnlVbmlxdWVBbGlhc2VzX05PTkUpLCB2YWx1ZShudWxscHRyKQorICAgIHsgc3RkOjpzd2FwKHR5cGUsIHUudHlwZSk7IHN0ZDo6c3dhcCh2YWx1ZSwgdS52YWx1ZSk7IH0KKyAgQW55VW5pcXVlQWxpYXNlc1VuaW9uKGNvbnN0IEFueVVuaXF1ZUFsaWFzZXNVbmlvbiAmKTsKKyAgQW55VW5pcXVlQWxpYXNlc1VuaW9uICZvcGVyYXRvcj0oY29uc3QgQW55VW5pcXVlQWxpYXNlc1VuaW9uICZ1KQorICAgIHsgQW55VW5pcXVlQWxpYXNlc1VuaW9uIHQodSk7IHN0ZDo6c3dhcCh0eXBlLCB0LnR5cGUpOyBzdGQ6OnN3YXAodmFsdWUsIHQudmFsdWUpOyByZXR1cm4gKnRoaXM7IH0KKyAgQW55VW5pcXVlQWxpYXNlc1VuaW9uICZvcGVyYXRvcj0oQW55VW5pcXVlQWxpYXNlc1VuaW9uICYmdSkgRkxBVEJVRkZFUlNfTk9FWENFUFQKKyAgICB7IHN0ZDo6c3dhcCh0eXBlLCB1LnR5cGUpOyBzdGQ6OnN3YXAodmFsdWUsIHUudmFsdWUpOyByZXR1cm4gKnRoaXM7IH0KKyAgfkFueVVuaXF1ZUFsaWFzZXNVbmlvbigpIHsgUmVzZXQoKTsgfQorCisgIHZvaWQgUmVzZXQoKTsKKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKyAgdm9pZCBTZXQoVCYmIHZhbCkgeworICAgIHR5cGVkZWYgdHlwZW5hbWUgc3RkOjpyZW1vdmVfcmVmZXJlbmNlPFQ+Ojp0eXBlIFJUOworICAgIFJlc2V0KCk7CisgICAgdHlwZSA9IEFueVVuaXF1ZUFsaWFzZXNVbmlvblRyYWl0czxSVD46OmVudW1fdmFsdWU7CisgICAgaWYgKHR5cGUgIT0gQW55VW5pcXVlQWxpYXNlc19OT05FKSB7CisgICAgICB2YWx1ZSA9IG5ldyBSVChzdGQ6OmZvcndhcmQ8VD4odmFsKSk7CisgICAgfQorICB9CisKKyAgc3RhdGljIHZvaWQgKlVuUGFjayhjb25zdCB2b2lkICpvYmosIEFueVVuaXF1ZUFsaWFzZXMgdHlwZSwgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKnJlc29sdmVyKTsKKyAgZmxhdGJ1ZmZlcnM6Ok9mZnNldDx2b2lkPiBQYWNrKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlciA9IG51bGxwdHIpIGNvbnN0OworCisgIE15R2FtZTo6RXhhbXBsZTo6TW9uc3RlclQgKkFzTSgpIHsKKyAgICByZXR1cm4gdHlwZSA9PSBBbnlVbmlxdWVBbGlhc2VzX00gPworICAgICAgcmVpbnRlcnByZXRfY2FzdDxNeUdhbWU6OkV4YW1wbGU6Ok1vbnN0ZXJUICo+KHZhbHVlKSA6IG51bGxwdHI7CisgIH0KKyAgY29uc3QgTXlHYW1lOjpFeGFtcGxlOjpNb25zdGVyVCAqQXNNKCkgY29uc3QgeworICAgIHJldHVybiB0eXBlID09IEFueVVuaXF1ZUFsaWFzZXNfTSA/CisgICAgICByZWludGVycHJldF9jYXN0PGNvbnN0IE15R2FtZTo6RXhhbXBsZTo6TW9uc3RlclQgKj4odmFsdWUpIDogbnVsbHB0cjsKKyAgfQorICBNeUdhbWU6OkV4YW1wbGU6OlRlc3RTaW1wbGVUYWJsZVdpdGhFbnVtVCAqQXNUUygpIHsKKyAgICByZXR1cm4gdHlwZSA9PSBBbnlVbmlxdWVBbGlhc2VzX1RTID8KKyAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8TXlHYW1lOjpFeGFtcGxlOjpUZXN0U2ltcGxlVGFibGVXaXRoRW51bVQgKj4odmFsdWUpIDogbnVsbHB0cjsKKyAgfQorICBjb25zdCBNeUdhbWU6OkV4YW1wbGU6OlRlc3RTaW1wbGVUYWJsZVdpdGhFbnVtVCAqQXNUUygpIGNvbnN0IHsKKyAgICByZXR1cm4gdHlwZSA9PSBBbnlVbmlxdWVBbGlhc2VzX1RTID8KKyAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgTXlHYW1lOjpFeGFtcGxlOjpUZXN0U2ltcGxlVGFibGVXaXRoRW51bVQgKj4odmFsdWUpIDogbnVsbHB0cjsKKyAgfQorICBNeUdhbWU6OkV4YW1wbGUyOjpNb25zdGVyVCAqQXNNMigpIHsKKyAgICByZXR1cm4gdHlwZSA9PSBBbnlVbmlxdWVBbGlhc2VzX00yID8KKyAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8TXlHYW1lOjpFeGFtcGxlMjo6TW9uc3RlclQgKj4odmFsdWUpIDogbnVsbHB0cjsKKyAgfQorICBjb25zdCBNeUdhbWU6OkV4YW1wbGUyOjpNb25zdGVyVCAqQXNNMigpIGNvbnN0IHsKKyAgICByZXR1cm4gdHlwZSA9PSBBbnlVbmlxdWVBbGlhc2VzX00yID8KKyAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgTXlHYW1lOjpFeGFtcGxlMjo6TW9uc3RlclQgKj4odmFsdWUpIDogbnVsbHB0cjsKKyAgfQorfTsKKworCitpbmxpbmUgYm9vbCBvcGVyYXRvcj09KGNvbnN0IEFueVVuaXF1ZUFsaWFzZXNVbmlvbiAmbGhzLCBjb25zdCBBbnlVbmlxdWVBbGlhc2VzVW5pb24gJnJocykgeworICBpZiAobGhzLnR5cGUgIT0gcmhzLnR5cGUpIHJldHVybiBmYWxzZTsKKyAgc3dpdGNoIChsaHMudHlwZSkgeworICAgIGNhc2UgQW55VW5pcXVlQWxpYXNlc19OT05FOiB7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgY2FzZSBBbnlVbmlxdWVBbGlhc2VzX006IHsKKyAgICAgIHJldHVybiAqKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgTXlHYW1lOjpFeGFtcGxlOjpNb25zdGVyVCAqPihsaHMudmFsdWUpKSA9PQorICAgICAgICAgICAgICoocmVpbnRlcnByZXRfY2FzdDxjb25zdCBNeUdhbWU6OkV4YW1wbGU6Ok1vbnN0ZXJUICo+KHJocy52YWx1ZSkpOworICAgIH0KKyAgICBjYXNlIEFueVVuaXF1ZUFsaWFzZXNfVFM6IHsKKyAgICAgIHJldHVybiAqKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgTXlHYW1lOjpFeGFtcGxlOjpUZXN0U2ltcGxlVGFibGVXaXRoRW51bVQgKj4obGhzLnZhbHVlKSkgPT0KKyAgICAgICAgICAgICAqKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgTXlHYW1lOjpFeGFtcGxlOjpUZXN0U2ltcGxlVGFibGVXaXRoRW51bVQgKj4ocmhzLnZhbHVlKSk7CisgICAgfQorICAgIGNhc2UgQW55VW5pcXVlQWxpYXNlc19NMjogeworICAgICAgcmV0dXJuICoocmVpbnRlcnByZXRfY2FzdDxjb25zdCBNeUdhbWU6OkV4YW1wbGUyOjpNb25zdGVyVCAqPihsaHMudmFsdWUpKSA9PQorICAgICAgICAgICAgICoocmVpbnRlcnByZXRfY2FzdDxjb25zdCBNeUdhbWU6OkV4YW1wbGUyOjpNb25zdGVyVCAqPihyaHMudmFsdWUpKTsKKyAgICB9CisgICAgZGVmYXVsdDogeworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgfQorfQorCitpbmxpbmUgYm9vbCBvcGVyYXRvciE9KGNvbnN0IEFueVVuaXF1ZUFsaWFzZXNVbmlvbiAmbGhzLCBjb25zdCBBbnlVbmlxdWVBbGlhc2VzVW5pb24gJnJocykgeworICAgIHJldHVybiAhKGxocyA9PSByaHMpOworfQorCitib29sIFZlcmlmeUFueVVuaXF1ZUFsaWFzZXMoZmxhdGJ1ZmZlcnM6OlZlcmlmaWVyICZ2ZXJpZmllciwgY29uc3Qgdm9pZCAqb2JqLCBBbnlVbmlxdWVBbGlhc2VzIHR5cGUpOworYm9vbCBWZXJpZnlBbnlVbmlxdWVBbGlhc2VzVmVjdG9yKGZsYXRidWZmZXJzOjpWZXJpZmllciAmdmVyaWZpZXIsIGNvbnN0IGZsYXRidWZmZXJzOjpWZWN0b3I8ZmxhdGJ1ZmZlcnM6Ok9mZnNldDx2b2lkPj4gKnZhbHVlcywgY29uc3QgZmxhdGJ1ZmZlcnM6OlZlY3Rvcjx1aW50OF90PiAqdHlwZXMpOworCitlbnVtIEFueUFtYmlndW91c0FsaWFzZXMgOiB1aW50OF90IHsKKyAgQW55QW1iaWd1b3VzQWxpYXNlc19OT05FID0gMCwKKyAgQW55QW1iaWd1b3VzQWxpYXNlc19NMSA9IDEsCisgIEFueUFtYmlndW91c0FsaWFzZXNfTTIgPSAyLAorICBBbnlBbWJpZ3VvdXNBbGlhc2VzX00zID0gMywKKyAgQW55QW1iaWd1b3VzQWxpYXNlc19NSU4gPSBBbnlBbWJpZ3VvdXNBbGlhc2VzX05PTkUsCisgIEFueUFtYmlndW91c0FsaWFzZXNfTUFYID0gQW55QW1iaWd1b3VzQWxpYXNlc19NMworfTsKKworaW5saW5lIGNvbnN0IEFueUFtYmlndW91c0FsaWFzZXMgKCZFbnVtVmFsdWVzQW55QW1iaWd1b3VzQWxpYXNlcygpKVs0XSB7CisgIHN0YXRpYyBjb25zdCBBbnlBbWJpZ3VvdXNBbGlhc2VzIHZhbHVlc1tdID0geworICAgIEFueUFtYmlndW91c0FsaWFzZXNfTk9ORSwKKyAgICBBbnlBbWJpZ3VvdXNBbGlhc2VzX00xLAorICAgIEFueUFtYmlndW91c0FsaWFzZXNfTTIsCisgICAgQW55QW1iaWd1b3VzQWxpYXNlc19NMworICB9OworICByZXR1cm4gdmFsdWVzOworfQorCitpbmxpbmUgY29uc3QgY2hhciAqIGNvbnN0ICpFbnVtTmFtZXNBbnlBbWJpZ3VvdXNBbGlhc2VzKCkgeworICBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IG5hbWVzWzVdID0geworICAgICJOT05FIiwKKyAgICAiTTEiLAorICAgICJNMiIsCisgICAgIk0zIiwKKyAgICBudWxscHRyCisgIH07CisgIHJldHVybiBuYW1lczsKK30KKworaW5saW5lIGNvbnN0IGNoYXIgKkVudW1OYW1lQW55QW1iaWd1b3VzQWxpYXNlcyhBbnlBbWJpZ3VvdXNBbGlhc2VzIGUpIHsKKyAgaWYgKGZsYXRidWZmZXJzOjpJc091dFJhbmdlKGUsIEFueUFtYmlndW91c0FsaWFzZXNfTk9ORSwgQW55QW1iaWd1b3VzQWxpYXNlc19NMykpIHJldHVybiAiIjsKKyAgY29uc3Qgc2l6ZV90IGluZGV4ID0gc3RhdGljX2Nhc3Q8c2l6ZV90PihlKTsKKyAgcmV0dXJuIEVudW1OYW1lc0FueUFtYmlndW91c0FsaWFzZXMoKVtpbmRleF07Cit9CisKK3N0cnVjdCBBbnlBbWJpZ3VvdXNBbGlhc2VzVW5pb24geworICBBbnlBbWJpZ3VvdXNBbGlhc2VzIHR5cGU7CisgIHZvaWQgKnZhbHVlOworCisgIEFueUFtYmlndW91c0FsaWFzZXNVbmlvbigpIDogdHlwZShBbnlBbWJpZ3VvdXNBbGlhc2VzX05PTkUpLCB2YWx1ZShudWxscHRyKSB7fQorICBBbnlBbWJpZ3VvdXNBbGlhc2VzVW5pb24oQW55QW1iaWd1b3VzQWxpYXNlc1VuaW9uJiYgdSkgRkxBVEJVRkZFUlNfTk9FWENFUFQgOgorICAgIHR5cGUoQW55QW1iaWd1b3VzQWxpYXNlc19OT05FKSwgdmFsdWUobnVsbHB0cikKKyAgICB7IHN0ZDo6c3dhcCh0eXBlLCB1LnR5cGUpOyBzdGQ6OnN3YXAodmFsdWUsIHUudmFsdWUpOyB9CisgIEFueUFtYmlndW91c0FsaWFzZXNVbmlvbihjb25zdCBBbnlBbWJpZ3VvdXNBbGlhc2VzVW5pb24gJik7CisgIEFueUFtYmlndW91c0FsaWFzZXNVbmlvbiAmb3BlcmF0b3I9KGNvbnN0IEFueUFtYmlndW91c0FsaWFzZXNVbmlvbiAmdSkKKyAgICB7IEFueUFtYmlndW91c0FsaWFzZXNVbmlvbiB0KHUpOyBzdGQ6OnN3YXAodHlwZSwgdC50eXBlKTsgc3RkOjpzd2FwKHZhbHVlLCB0LnZhbHVlKTsgcmV0dXJuICp0aGlzOyB9CisgIEFueUFtYmlndW91c0FsaWFzZXNVbmlvbiAmb3BlcmF0b3I9KEFueUFtYmlndW91c0FsaWFzZXNVbmlvbiAmJnUpIEZMQVRCVUZGRVJTX05PRVhDRVBUCisgICAgeyBzdGQ6OnN3YXAodHlwZSwgdS50eXBlKTsgc3RkOjpzd2FwKHZhbHVlLCB1LnZhbHVlKTsgcmV0dXJuICp0aGlzOyB9CisgIH5BbnlBbWJpZ3VvdXNBbGlhc2VzVW5pb24oKSB7IFJlc2V0KCk7IH0KKworICB2b2lkIFJlc2V0KCk7CisKKyAgc3RhdGljIHZvaWQgKlVuUGFjayhjb25zdCB2b2lkICpvYmosIEFueUFtYmlndW91c0FsaWFzZXMgdHlwZSwgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKnJlc29sdmVyKTsKKyAgZmxhdGJ1ZmZlcnM6Ok9mZnNldDx2b2lkPiBQYWNrKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlciA9IG51bGxwdHIpIGNvbnN0OworCisgIE15R2FtZTo6RXhhbXBsZTo6TW9uc3RlclQgKkFzTTEoKSB7CisgICAgcmV0dXJuIHR5cGUgPT0gQW55QW1iaWd1b3VzQWxpYXNlc19NMSA/CisgICAgICByZWludGVycHJldF9jYXN0PE15R2FtZTo6RXhhbXBsZTo6TW9uc3RlclQgKj4odmFsdWUpIDogbnVsbHB0cjsKKyAgfQorICBjb25zdCBNeUdhbWU6OkV4YW1wbGU6Ok1vbnN0ZXJUICpBc00xKCkgY29uc3QgeworICAgIHJldHVybiB0eXBlID09IEFueUFtYmlndW91c0FsaWFzZXNfTTEgPworICAgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBNeUdhbWU6OkV4YW1wbGU6Ok1vbnN0ZXJUICo+KHZhbHVlKSA6IG51bGxwdHI7CisgIH0KKyAgTXlHYW1lOjpFeGFtcGxlOjpNb25zdGVyVCAqQXNNMigpIHsKKyAgICByZXR1cm4gdHlwZSA9PSBBbnlBbWJpZ3VvdXNBbGlhc2VzX00yID8KKyAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8TXlHYW1lOjpFeGFtcGxlOjpNb25zdGVyVCAqPih2YWx1ZSkgOiBudWxscHRyOworICB9CisgIGNvbnN0IE15R2FtZTo6RXhhbXBsZTo6TW9uc3RlclQgKkFzTTIoKSBjb25zdCB7CisgICAgcmV0dXJuIHR5cGUgPT0gQW55QW1iaWd1b3VzQWxpYXNlc19NMiA/CisgICAgICByZWludGVycHJldF9jYXN0PGNvbnN0IE15R2FtZTo6RXhhbXBsZTo6TW9uc3RlclQgKj4odmFsdWUpIDogbnVsbHB0cjsKKyAgfQorICBNeUdhbWU6OkV4YW1wbGU6Ok1vbnN0ZXJUICpBc00zKCkgeworICAgIHJldHVybiB0eXBlID09IEFueUFtYmlndW91c0FsaWFzZXNfTTMgPworICAgICAgcmVpbnRlcnByZXRfY2FzdDxNeUdhbWU6OkV4YW1wbGU6Ok1vbnN0ZXJUICo+KHZhbHVlKSA6IG51bGxwdHI7CisgIH0KKyAgY29uc3QgTXlHYW1lOjpFeGFtcGxlOjpNb25zdGVyVCAqQXNNMygpIGNvbnN0IHsKKyAgICByZXR1cm4gdHlwZSA9PSBBbnlBbWJpZ3VvdXNBbGlhc2VzX00zID8KKyAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgTXlHYW1lOjpFeGFtcGxlOjpNb25zdGVyVCAqPih2YWx1ZSkgOiBudWxscHRyOworICB9Cit9OworCisKK2lubGluZSBib29sIG9wZXJhdG9yPT0oY29uc3QgQW55QW1iaWd1b3VzQWxpYXNlc1VuaW9uICZsaHMsIGNvbnN0IEFueUFtYmlndW91c0FsaWFzZXNVbmlvbiAmcmhzKSB7CisgIGlmIChsaHMudHlwZSAhPSByaHMudHlwZSkgcmV0dXJuIGZhbHNlOworICBzd2l0Y2ggKGxocy50eXBlKSB7CisgICAgY2FzZSBBbnlBbWJpZ3VvdXNBbGlhc2VzX05PTkU6IHsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICBjYXNlIEFueUFtYmlndW91c0FsaWFzZXNfTTE6IHsKKyAgICAgIHJldHVybiAqKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgTXlHYW1lOjpFeGFtcGxlOjpNb25zdGVyVCAqPihsaHMudmFsdWUpKSA9PQorICAgICAgICAgICAgICoocmVpbnRlcnByZXRfY2FzdDxjb25zdCBNeUdhbWU6OkV4YW1wbGU6Ok1vbnN0ZXJUICo+KHJocy52YWx1ZSkpOworICAgIH0KKyAgICBjYXNlIEFueUFtYmlndW91c0FsaWFzZXNfTTI6IHsKKyAgICAgIHJldHVybiAqKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgTXlHYW1lOjpFeGFtcGxlOjpNb25zdGVyVCAqPihsaHMudmFsdWUpKSA9PQorICAgICAgICAgICAgICoocmVpbnRlcnByZXRfY2FzdDxjb25zdCBNeUdhbWU6OkV4YW1wbGU6Ok1vbnN0ZXJUICo+KHJocy52YWx1ZSkpOworICAgIH0KKyAgICBjYXNlIEFueUFtYmlndW91c0FsaWFzZXNfTTM6IHsKKyAgICAgIHJldHVybiAqKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgTXlHYW1lOjpFeGFtcGxlOjpNb25zdGVyVCAqPihsaHMudmFsdWUpKSA9PQorICAgICAgICAgICAgICoocmVpbnRlcnByZXRfY2FzdDxjb25zdCBNeUdhbWU6OkV4YW1wbGU6Ok1vbnN0ZXJUICo+KHJocy52YWx1ZSkpOworICAgIH0KKyAgICBkZWZhdWx0OiB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICB9Cit9CisKK2lubGluZSBib29sIG9wZXJhdG9yIT0oY29uc3QgQW55QW1iaWd1b3VzQWxpYXNlc1VuaW9uICZsaHMsIGNvbnN0IEFueUFtYmlndW91c0FsaWFzZXNVbmlvbiAmcmhzKSB7CisgICAgcmV0dXJuICEobGhzID09IHJocyk7Cit9CisKK2Jvb2wgVmVyaWZ5QW55QW1iaWd1b3VzQWxpYXNlcyhmbGF0YnVmZmVyczo6VmVyaWZpZXIgJnZlcmlmaWVyLCBjb25zdCB2b2lkICpvYmosIEFueUFtYmlndW91c0FsaWFzZXMgdHlwZSk7Citib29sIFZlcmlmeUFueUFtYmlndW91c0FsaWFzZXNWZWN0b3IoZmxhdGJ1ZmZlcnM6OlZlcmlmaWVyICZ2ZXJpZmllciwgY29uc3QgZmxhdGJ1ZmZlcnM6OlZlY3RvcjxmbGF0YnVmZmVyczo6T2Zmc2V0PHZvaWQ+PiAqdmFsdWVzLCBjb25zdCBmbGF0YnVmZmVyczo6VmVjdG9yPHVpbnQ4X3Q+ICp0eXBlcyk7CisKK0ZMQVRCVUZGRVJTX01BTlVBTExZX0FMSUdORURfU1RSVUNUKDIpIFRlc3QgRkxBVEJVRkZFUlNfRklOQUxfQ0xBU1MgeworIHByaXZhdGU6CisgIGludDE2X3QgYV87CisgIGludDhfdCBiXzsKKyAgaW50OF90IHBhZGRpbmcwX187CisKKyBwdWJsaWM6CisgIHN0YXRpYyBjb25zdCBmbGF0YnVmZmVyczo6VHlwZVRhYmxlICpNaW5pUmVmbGVjdFR5cGVUYWJsZSgpIHsKKyAgICByZXR1cm4gVGVzdFR5cGVUYWJsZSgpOworICB9CisgIFRlc3QoKQorICAgICAgOiBhXygwKSwKKyAgICAgICAgYl8oMCksCisgICAgICAgIHBhZGRpbmcwX18oMCkgeworICAgICh2b2lkKXBhZGRpbmcwX187CisgIH0KKyAgVGVzdChpbnQxNl90IF9hLCBpbnQ4X3QgX2IpCisgICAgICA6IGFfKGZsYXRidWZmZXJzOjpFbmRpYW5TY2FsYXIoX2EpKSwKKyAgICAgICAgYl8oZmxhdGJ1ZmZlcnM6OkVuZGlhblNjYWxhcihfYikpLAorICAgICAgICBwYWRkaW5nMF9fKDApIHsKKyAgICAodm9pZClwYWRkaW5nMF9fOworICB9CisgIGludDE2X3QgYSgpIGNvbnN0IHsKKyAgICByZXR1cm4gZmxhdGJ1ZmZlcnM6OkVuZGlhblNjYWxhcihhXyk7CisgIH0KKyAgdm9pZCBtdXRhdGVfYShpbnQxNl90IF9hKSB7CisgICAgZmxhdGJ1ZmZlcnM6OldyaXRlU2NhbGFyKCZhXywgX2EpOworICB9CisgIGludDhfdCBiKCkgY29uc3QgeworICAgIHJldHVybiBmbGF0YnVmZmVyczo6RW5kaWFuU2NhbGFyKGJfKTsKKyAgfQorICB2b2lkIG11dGF0ZV9iKGludDhfdCBfYikgeworICAgIGZsYXRidWZmZXJzOjpXcml0ZVNjYWxhcigmYl8sIF9iKTsKKyAgfQorfTsKK0ZMQVRCVUZGRVJTX1NUUlVDVF9FTkQoVGVzdCwgNCk7CisKK2lubGluZSBib29sIG9wZXJhdG9yPT0oY29uc3QgVGVzdCAmbGhzLCBjb25zdCBUZXN0ICZyaHMpIHsKKyAgcmV0dXJuCisgICAgICAobGhzLmEoKSA9PSByaHMuYSgpKSAmJgorICAgICAgKGxocy5iKCkgPT0gcmhzLmIoKSk7Cit9CisKK2lubGluZSBib29sIG9wZXJhdG9yIT0oY29uc3QgVGVzdCAmbGhzLCBjb25zdCBUZXN0ICZyaHMpIHsKKyAgICByZXR1cm4gIShsaHMgPT0gcmhzKTsKK30KKworCitGTEFUQlVGRkVSU19NQU5VQUxMWV9BTElHTkVEX1NUUlVDVCg4KSBWZWMzIEZMQVRCVUZGRVJTX0ZJTkFMX0NMQVNTIHsKKyBwcml2YXRlOgorICBmbG9hdCB4XzsKKyAgZmxvYXQgeV87CisgIGZsb2F0IHpfOworICBpbnQzMl90IHBhZGRpbmcwX187CisgIGRvdWJsZSB0ZXN0MV87CisgIHVpbnQ4X3QgdGVzdDJfOworICBpbnQ4X3QgcGFkZGluZzFfXzsKKyAgTXlHYW1lOjpFeGFtcGxlOjpUZXN0IHRlc3QzXzsKKyAgaW50MTZfdCBwYWRkaW5nMl9fOworCisgcHVibGljOgorICBzdGF0aWMgY29uc3QgZmxhdGJ1ZmZlcnM6OlR5cGVUYWJsZSAqTWluaVJlZmxlY3RUeXBlVGFibGUoKSB7CisgICAgcmV0dXJuIFZlYzNUeXBlVGFibGUoKTsKKyAgfQorICBWZWMzKCkKKyAgICAgIDogeF8oMCksCisgICAgICAgIHlfKDApLAorICAgICAgICB6XygwKSwKKyAgICAgICAgcGFkZGluZzBfXygwKSwKKyAgICAgICAgdGVzdDFfKDApLAorICAgICAgICB0ZXN0Ml8oMCksCisgICAgICAgIHBhZGRpbmcxX18oMCksCisgICAgICAgIHRlc3QzXygpLAorICAgICAgICBwYWRkaW5nMl9fKDApIHsKKyAgICAodm9pZClwYWRkaW5nMF9fOworICAgICh2b2lkKXBhZGRpbmcxX187CisgICAgKHZvaWQpcGFkZGluZzJfXzsKKyAgfQorICBWZWMzKGZsb2F0IF94LCBmbG9hdCBfeSwgZmxvYXQgX3osIGRvdWJsZSBfdGVzdDEsIE15R2FtZTo6RXhhbXBsZTo6Q29sb3IgX3Rlc3QyLCBjb25zdCBNeUdhbWU6OkV4YW1wbGU6OlRlc3QgJl90ZXN0MykKKyAgICAgIDogeF8oZmxhdGJ1ZmZlcnM6OkVuZGlhblNjYWxhcihfeCkpLAorICAgICAgICB5XyhmbGF0YnVmZmVyczo6RW5kaWFuU2NhbGFyKF95KSksCisgICAgICAgIHpfKGZsYXRidWZmZXJzOjpFbmRpYW5TY2FsYXIoX3opKSwKKyAgICAgICAgcGFkZGluZzBfXygwKSwKKyAgICAgICAgdGVzdDFfKGZsYXRidWZmZXJzOjpFbmRpYW5TY2FsYXIoX3Rlc3QxKSksCisgICAgICAgIHRlc3QyXyhmbGF0YnVmZmVyczo6RW5kaWFuU2NhbGFyKHN0YXRpY19jYXN0PHVpbnQ4X3Q+KF90ZXN0MikpKSwKKyAgICAgICAgcGFkZGluZzFfXygwKSwKKyAgICAgICAgdGVzdDNfKF90ZXN0MyksCisgICAgICAgIHBhZGRpbmcyX18oMCkgeworICAgICh2b2lkKXBhZGRpbmcwX187CisgICAgKHZvaWQpcGFkZGluZzFfXzsKKyAgICAodm9pZClwYWRkaW5nMl9fOworICB9CisgIGZsb2F0IHgoKSBjb25zdCB7CisgICAgcmV0dXJuIGZsYXRidWZmZXJzOjpFbmRpYW5TY2FsYXIoeF8pOworICB9CisgIHZvaWQgbXV0YXRlX3goZmxvYXQgX3gpIHsKKyAgICBmbGF0YnVmZmVyczo6V3JpdGVTY2FsYXIoJnhfLCBfeCk7CisgIH0KKyAgZmxvYXQgeSgpIGNvbnN0IHsKKyAgICByZXR1cm4gZmxhdGJ1ZmZlcnM6OkVuZGlhblNjYWxhcih5Xyk7CisgIH0KKyAgdm9pZCBtdXRhdGVfeShmbG9hdCBfeSkgeworICAgIGZsYXRidWZmZXJzOjpXcml0ZVNjYWxhcigmeV8sIF95KTsKKyAgfQorICBmbG9hdCB6KCkgY29uc3QgeworICAgIHJldHVybiBmbGF0YnVmZmVyczo6RW5kaWFuU2NhbGFyKHpfKTsKKyAgfQorICB2b2lkIG11dGF0ZV96KGZsb2F0IF96KSB7CisgICAgZmxhdGJ1ZmZlcnM6OldyaXRlU2NhbGFyKCZ6XywgX3opOworICB9CisgIGRvdWJsZSB0ZXN0MSgpIGNvbnN0IHsKKyAgICByZXR1cm4gZmxhdGJ1ZmZlcnM6OkVuZGlhblNjYWxhcih0ZXN0MV8pOworICB9CisgIHZvaWQgbXV0YXRlX3Rlc3QxKGRvdWJsZSBfdGVzdDEpIHsKKyAgICBmbGF0YnVmZmVyczo6V3JpdGVTY2FsYXIoJnRlc3QxXywgX3Rlc3QxKTsKKyAgfQorICBNeUdhbWU6OkV4YW1wbGU6OkNvbG9yIHRlc3QyKCkgY29uc3QgeworICAgIHJldHVybiBzdGF0aWNfY2FzdDxNeUdhbWU6OkV4YW1wbGU6OkNvbG9yPihmbGF0YnVmZmVyczo6RW5kaWFuU2NhbGFyKHRlc3QyXykpOworICB9CisgIHZvaWQgbXV0YXRlX3Rlc3QyKE15R2FtZTo6RXhhbXBsZTo6Q29sb3IgX3Rlc3QyKSB7CisgICAgZmxhdGJ1ZmZlcnM6OldyaXRlU2NhbGFyKCZ0ZXN0Ml8sIHN0YXRpY19jYXN0PHVpbnQ4X3Q+KF90ZXN0MikpOworICB9CisgIGNvbnN0IE15R2FtZTo6RXhhbXBsZTo6VGVzdCAmdGVzdDMoKSBjb25zdCB7CisgICAgcmV0dXJuIHRlc3QzXzsKKyAgfQorICBNeUdhbWU6OkV4YW1wbGU6OlRlc3QgJm11dGFibGVfdGVzdDMoKSB7CisgICAgcmV0dXJuIHRlc3QzXzsKKyAgfQorfTsKK0ZMQVRCVUZGRVJTX1NUUlVDVF9FTkQoVmVjMywgMzIpOworCitpbmxpbmUgYm9vbCBvcGVyYXRvcj09KGNvbnN0IFZlYzMgJmxocywgY29uc3QgVmVjMyAmcmhzKSB7CisgIHJldHVybgorICAgICAgKGxocy54KCkgPT0gcmhzLngoKSkgJiYKKyAgICAgIChsaHMueSgpID09IHJocy55KCkpICYmCisgICAgICAobGhzLnooKSA9PSByaHMueigpKSAmJgorICAgICAgKGxocy50ZXN0MSgpID09IHJocy50ZXN0MSgpKSAmJgorICAgICAgKGxocy50ZXN0MigpID09IHJocy50ZXN0MigpKSAmJgorICAgICAgKGxocy50ZXN0MygpID09IHJocy50ZXN0MygpKTsKK30KKworaW5saW5lIGJvb2wgb3BlcmF0b3IhPShjb25zdCBWZWMzICZsaHMsIGNvbnN0IFZlYzMgJnJocykgeworICAgIHJldHVybiAhKGxocyA9PSByaHMpOworfQorCisKK0ZMQVRCVUZGRVJTX01BTlVBTExZX0FMSUdORURfU1RSVUNUKDQpIEFiaWxpdHkgRkxBVEJVRkZFUlNfRklOQUxfQ0xBU1MgeworIHByaXZhdGU6CisgIHVpbnQzMl90IGlkXzsKKyAgdWludDMyX3QgZGlzdGFuY2VfOworCisgcHVibGljOgorICBzdGF0aWMgY29uc3QgZmxhdGJ1ZmZlcnM6OlR5cGVUYWJsZSAqTWluaVJlZmxlY3RUeXBlVGFibGUoKSB7CisgICAgcmV0dXJuIEFiaWxpdHlUeXBlVGFibGUoKTsKKyAgfQorICBBYmlsaXR5KCkKKyAgICAgIDogaWRfKDApLAorICAgICAgICBkaXN0YW5jZV8oMCkgeworICB9CisgIEFiaWxpdHkodWludDMyX3QgX2lkLCB1aW50MzJfdCBfZGlzdGFuY2UpCisgICAgICA6IGlkXyhmbGF0YnVmZmVyczo6RW5kaWFuU2NhbGFyKF9pZCkpLAorICAgICAgICBkaXN0YW5jZV8oZmxhdGJ1ZmZlcnM6OkVuZGlhblNjYWxhcihfZGlzdGFuY2UpKSB7CisgIH0KKyAgdWludDMyX3QgaWQoKSBjb25zdCB7CisgICAgcmV0dXJuIGZsYXRidWZmZXJzOjpFbmRpYW5TY2FsYXIoaWRfKTsKKyAgfQorICB2b2lkIG11dGF0ZV9pZCh1aW50MzJfdCBfaWQpIHsKKyAgICBmbGF0YnVmZmVyczo6V3JpdGVTY2FsYXIoJmlkXywgX2lkKTsKKyAgfQorICBib29sIEtleUNvbXBhcmVMZXNzVGhhbihjb25zdCBBYmlsaXR5ICpvKSBjb25zdCB7CisgICAgcmV0dXJuIGlkKCkgPCBvLT5pZCgpOworICB9CisgIGludCBLZXlDb21wYXJlV2l0aFZhbHVlKHVpbnQzMl90IF9pZCkgY29uc3QgeworICAgIHJldHVybiBzdGF0aWNfY2FzdDxpbnQ+KGlkKCkgPiBfaWQpIC0gc3RhdGljX2Nhc3Q8aW50PihpZCgpIDwgX2lkKTsKKyAgfQorICB1aW50MzJfdCBkaXN0YW5jZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gZmxhdGJ1ZmZlcnM6OkVuZGlhblNjYWxhcihkaXN0YW5jZV8pOworICB9CisgIHZvaWQgbXV0YXRlX2Rpc3RhbmNlKHVpbnQzMl90IF9kaXN0YW5jZSkgeworICAgIGZsYXRidWZmZXJzOjpXcml0ZVNjYWxhcigmZGlzdGFuY2VfLCBfZGlzdGFuY2UpOworICB9Cit9OworRkxBVEJVRkZFUlNfU1RSVUNUX0VORChBYmlsaXR5LCA4KTsKKworaW5saW5lIGJvb2wgb3BlcmF0b3I9PShjb25zdCBBYmlsaXR5ICZsaHMsIGNvbnN0IEFiaWxpdHkgJnJocykgeworICByZXR1cm4KKyAgICAgIChsaHMuaWQoKSA9PSByaHMuaWQoKSkgJiYKKyAgICAgIChsaHMuZGlzdGFuY2UoKSA9PSByaHMuZGlzdGFuY2UoKSk7Cit9CisKK2lubGluZSBib29sIG9wZXJhdG9yIT0oY29uc3QgQWJpbGl0eSAmbGhzLCBjb25zdCBBYmlsaXR5ICZyaHMpIHsKKyAgICByZXR1cm4gIShsaHMgPT0gcmhzKTsKK30KKworCitGTEFUQlVGRkVSU19NQU5VQUxMWV9BTElHTkVEX1NUUlVDVCg0KSBTdHJ1Y3RPZlN0cnVjdHMgRkxBVEJVRkZFUlNfRklOQUxfQ0xBU1MgeworIHByaXZhdGU6CisgIE15R2FtZTo6RXhhbXBsZTo6QWJpbGl0eSBhXzsKKyAgTXlHYW1lOjpFeGFtcGxlOjpUZXN0IGJfOworICBNeUdhbWU6OkV4YW1wbGU6OkFiaWxpdHkgY187CisKKyBwdWJsaWM6CisgIHN0YXRpYyBjb25zdCBmbGF0YnVmZmVyczo6VHlwZVRhYmxlICpNaW5pUmVmbGVjdFR5cGVUYWJsZSgpIHsKKyAgICByZXR1cm4gU3RydWN0T2ZTdHJ1Y3RzVHlwZVRhYmxlKCk7CisgIH0KKyAgU3RydWN0T2ZTdHJ1Y3RzKCkKKyAgICAgIDogYV8oKSwKKyAgICAgICAgYl8oKSwKKyAgICAgICAgY18oKSB7CisgIH0KKyAgU3RydWN0T2ZTdHJ1Y3RzKGNvbnN0IE15R2FtZTo6RXhhbXBsZTo6QWJpbGl0eSAmX2EsIGNvbnN0IE15R2FtZTo6RXhhbXBsZTo6VGVzdCAmX2IsIGNvbnN0IE15R2FtZTo6RXhhbXBsZTo6QWJpbGl0eSAmX2MpCisgICAgICA6IGFfKF9hKSwKKyAgICAgICAgYl8oX2IpLAorICAgICAgICBjXyhfYykgeworICB9CisgIGNvbnN0IE15R2FtZTo6RXhhbXBsZTo6QWJpbGl0eSAmYSgpIGNvbnN0IHsKKyAgICByZXR1cm4gYV87CisgIH0KKyAgTXlHYW1lOjpFeGFtcGxlOjpBYmlsaXR5ICZtdXRhYmxlX2EoKSB7CisgICAgcmV0dXJuIGFfOworICB9CisgIGNvbnN0IE15R2FtZTo6RXhhbXBsZTo6VGVzdCAmYigpIGNvbnN0IHsKKyAgICByZXR1cm4gYl87CisgIH0KKyAgTXlHYW1lOjpFeGFtcGxlOjpUZXN0ICZtdXRhYmxlX2IoKSB7CisgICAgcmV0dXJuIGJfOworICB9CisgIGNvbnN0IE15R2FtZTo6RXhhbXBsZTo6QWJpbGl0eSAmYygpIGNvbnN0IHsKKyAgICByZXR1cm4gY187CisgIH0KKyAgTXlHYW1lOjpFeGFtcGxlOjpBYmlsaXR5ICZtdXRhYmxlX2MoKSB7CisgICAgcmV0dXJuIGNfOworICB9Cit9OworRkxBVEJVRkZFUlNfU1RSVUNUX0VORChTdHJ1Y3RPZlN0cnVjdHMsIDIwKTsKKworaW5saW5lIGJvb2wgb3BlcmF0b3I9PShjb25zdCBTdHJ1Y3RPZlN0cnVjdHMgJmxocywgY29uc3QgU3RydWN0T2ZTdHJ1Y3RzICZyaHMpIHsKKyAgcmV0dXJuCisgICAgICAobGhzLmEoKSA9PSByaHMuYSgpKSAmJgorICAgICAgKGxocy5iKCkgPT0gcmhzLmIoKSkgJiYKKyAgICAgIChsaHMuYygpID09IHJocy5jKCkpOworfQorCitpbmxpbmUgYm9vbCBvcGVyYXRvciE9KGNvbnN0IFN0cnVjdE9mU3RydWN0cyAmbGhzLCBjb25zdCBTdHJ1Y3RPZlN0cnVjdHMgJnJocykgeworICAgIHJldHVybiAhKGxocyA9PSByaHMpOworfQorCisKK0ZMQVRCVUZGRVJTX01BTlVBTExZX0FMSUdORURfU1RSVUNUKDQpIFN0cnVjdE9mU3RydWN0c09mU3RydWN0cyBGTEFUQlVGRkVSU19GSU5BTF9DTEFTUyB7CisgcHJpdmF0ZToKKyAgTXlHYW1lOjpFeGFtcGxlOjpTdHJ1Y3RPZlN0cnVjdHMgYV87CisKKyBwdWJsaWM6CisgIHN0YXRpYyBjb25zdCBmbGF0YnVmZmVyczo6VHlwZVRhYmxlICpNaW5pUmVmbGVjdFR5cGVUYWJsZSgpIHsKKyAgICByZXR1cm4gU3RydWN0T2ZTdHJ1Y3RzT2ZTdHJ1Y3RzVHlwZVRhYmxlKCk7CisgIH0KKyAgU3RydWN0T2ZTdHJ1Y3RzT2ZTdHJ1Y3RzKCkKKyAgICAgIDogYV8oKSB7CisgIH0KKyAgU3RydWN0T2ZTdHJ1Y3RzT2ZTdHJ1Y3RzKGNvbnN0IE15R2FtZTo6RXhhbXBsZTo6U3RydWN0T2ZTdHJ1Y3RzICZfYSkKKyAgICAgIDogYV8oX2EpIHsKKyAgfQorICBjb25zdCBNeUdhbWU6OkV4YW1wbGU6OlN0cnVjdE9mU3RydWN0cyAmYSgpIGNvbnN0IHsKKyAgICByZXR1cm4gYV87CisgIH0KKyAgTXlHYW1lOjpFeGFtcGxlOjpTdHJ1Y3RPZlN0cnVjdHMgJm11dGFibGVfYSgpIHsKKyAgICByZXR1cm4gYV87CisgIH0KK307CitGTEFUQlVGRkVSU19TVFJVQ1RfRU5EKFN0cnVjdE9mU3RydWN0c09mU3RydWN0cywgMjApOworCitpbmxpbmUgYm9vbCBvcGVyYXRvcj09KGNvbnN0IFN0cnVjdE9mU3RydWN0c09mU3RydWN0cyAmbGhzLCBjb25zdCBTdHJ1Y3RPZlN0cnVjdHNPZlN0cnVjdHMgJnJocykgeworICByZXR1cm4KKyAgICAgIChsaHMuYSgpID09IHJocy5hKCkpOworfQorCitpbmxpbmUgYm9vbCBvcGVyYXRvciE9KGNvbnN0IFN0cnVjdE9mU3RydWN0c09mU3RydWN0cyAmbGhzLCBjb25zdCBTdHJ1Y3RPZlN0cnVjdHNPZlN0cnVjdHMgJnJocykgeworICAgIHJldHVybiAhKGxocyA9PSByaHMpOworfQorCisKK30gIC8vIG5hbWVzcGFjZSBFeGFtcGxlCisKK3N0cnVjdCBJblBhcmVudE5hbWVzcGFjZVQgOiBwdWJsaWMgZmxhdGJ1ZmZlcnM6Ok5hdGl2ZVRhYmxlIHsKKyAgdHlwZWRlZiBJblBhcmVudE5hbWVzcGFjZSBUYWJsZVR5cGU7Cit9OworCitzdHJ1Y3QgSW5QYXJlbnROYW1lc3BhY2UgRkxBVEJVRkZFUlNfRklOQUxfQ0xBU1MgOiBwcml2YXRlIGZsYXRidWZmZXJzOjpUYWJsZSB7CisgIHR5cGVkZWYgSW5QYXJlbnROYW1lc3BhY2VUIE5hdGl2ZVRhYmxlVHlwZTsKKyAgdHlwZWRlZiBJblBhcmVudE5hbWVzcGFjZUJ1aWxkZXIgQnVpbGRlcjsKKyAgc3RhdGljIGNvbnN0IGZsYXRidWZmZXJzOjpUeXBlVGFibGUgKk1pbmlSZWZsZWN0VHlwZVRhYmxlKCkgeworICAgIHJldHVybiBJblBhcmVudE5hbWVzcGFjZVR5cGVUYWJsZSgpOworICB9CisgIGJvb2wgVmVyaWZ5KGZsYXRidWZmZXJzOjpWZXJpZmllciAmdmVyaWZpZXIpIGNvbnN0IHsKKyAgICByZXR1cm4gVmVyaWZ5VGFibGVTdGFydCh2ZXJpZmllcikgJiYKKyAgICAgICAgICAgdmVyaWZpZXIuRW5kVGFibGUoKTsKKyAgfQorICBJblBhcmVudE5hbWVzcGFjZVQgKlVuUGFjayhjb25zdCBmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyID0gbnVsbHB0cikgY29uc3Q7CisgIHZvaWQgVW5QYWNrVG8oSW5QYXJlbnROYW1lc3BhY2VUICpfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlciA9IG51bGxwdHIpIGNvbnN0OworICBzdGF0aWMgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxJblBhcmVudE5hbWVzcGFjZT4gUGFjayhmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IEluUGFyZW50TmFtZXNwYWNlVCogX28sIGNvbnN0IGZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIgPSBudWxscHRyKTsKK307CisKK3N0cnVjdCBJblBhcmVudE5hbWVzcGFjZUJ1aWxkZXIgeworICB0eXBlZGVmIEluUGFyZW50TmFtZXNwYWNlIFRhYmxlOworICBmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJmZiYl87CisgIGZsYXRidWZmZXJzOjp1b2Zmc2V0X3Qgc3RhcnRfOworICBleHBsaWNpdCBJblBhcmVudE5hbWVzcGFjZUJ1aWxkZXIoZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiKQorICAgICAgICA6IGZiYl8oX2ZiYikgeworICAgIHN0YXJ0XyA9IGZiYl8uU3RhcnRUYWJsZSgpOworICB9CisgIGZsYXRidWZmZXJzOjpPZmZzZXQ8SW5QYXJlbnROYW1lc3BhY2U+IEZpbmlzaCgpIHsKKyAgICBjb25zdCBhdXRvIGVuZCA9IGZiYl8uRW5kVGFibGUoc3RhcnRfKTsKKyAgICBhdXRvIG8gPSBmbGF0YnVmZmVyczo6T2Zmc2V0PEluUGFyZW50TmFtZXNwYWNlPihlbmQpOworICAgIHJldHVybiBvOworICB9Cit9OworCitpbmxpbmUgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxJblBhcmVudE5hbWVzcGFjZT4gQ3JlYXRlSW5QYXJlbnROYW1lc3BhY2UoCisgICAgZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiKSB7CisgIEluUGFyZW50TmFtZXNwYWNlQnVpbGRlciBidWlsZGVyXyhfZmJiKTsKKyAgcmV0dXJuIGJ1aWxkZXJfLkZpbmlzaCgpOworfQorCitmbGF0YnVmZmVyczo6T2Zmc2V0PEluUGFyZW50TmFtZXNwYWNlPiBDcmVhdGVJblBhcmVudE5hbWVzcGFjZShmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IEluUGFyZW50TmFtZXNwYWNlVCAqX28sIGNvbnN0IGZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIgPSBudWxscHRyKTsKKworbmFtZXNwYWNlIEV4YW1wbGUyIHsKKworc3RydWN0IE1vbnN0ZXJUIDogcHVibGljIGZsYXRidWZmZXJzOjpOYXRpdmVUYWJsZSB7CisgIHR5cGVkZWYgTW9uc3RlciBUYWJsZVR5cGU7Cit9OworCitzdHJ1Y3QgTW9uc3RlciBGTEFUQlVGRkVSU19GSU5BTF9DTEFTUyA6IHByaXZhdGUgZmxhdGJ1ZmZlcnM6OlRhYmxlIHsKKyAgdHlwZWRlZiBNb25zdGVyVCBOYXRpdmVUYWJsZVR5cGU7CisgIHR5cGVkZWYgTW9uc3RlckJ1aWxkZXIgQnVpbGRlcjsKKyAgc3RhdGljIGNvbnN0IGZsYXRidWZmZXJzOjpUeXBlVGFibGUgKk1pbmlSZWZsZWN0VHlwZVRhYmxlKCkgeworICAgIHJldHVybiBNb25zdGVyVHlwZVRhYmxlKCk7CisgIH0KKyAgYm9vbCBWZXJpZnkoZmxhdGJ1ZmZlcnM6OlZlcmlmaWVyICZ2ZXJpZmllcikgY29uc3QgeworICAgIHJldHVybiBWZXJpZnlUYWJsZVN0YXJ0KHZlcmlmaWVyKSAmJgorICAgICAgICAgICB2ZXJpZmllci5FbmRUYWJsZSgpOworICB9CisgIE1vbnN0ZXJUICpVblBhY2soY29uc3QgZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlciA9IG51bGxwdHIpIGNvbnN0OworICB2b2lkIFVuUGFja1RvKE1vbnN0ZXJUICpfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlciA9IG51bGxwdHIpIGNvbnN0OworICBzdGF0aWMgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxNb25zdGVyPiBQYWNrKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgTW9uc3RlclQqIF9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyID0gbnVsbHB0cik7Cit9OworCitzdHJ1Y3QgTW9uc3RlckJ1aWxkZXIgeworICB0eXBlZGVmIE1vbnN0ZXIgVGFibGU7CisgIGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmZmJiXzsKKyAgZmxhdGJ1ZmZlcnM6OnVvZmZzZXRfdCBzdGFydF87CisgIGV4cGxpY2l0IE1vbnN0ZXJCdWlsZGVyKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYikKKyAgICAgICAgOiBmYmJfKF9mYmIpIHsKKyAgICBzdGFydF8gPSBmYmJfLlN0YXJ0VGFibGUoKTsKKyAgfQorICBmbGF0YnVmZmVyczo6T2Zmc2V0PE1vbnN0ZXI+IEZpbmlzaCgpIHsKKyAgICBjb25zdCBhdXRvIGVuZCA9IGZiYl8uRW5kVGFibGUoc3RhcnRfKTsKKyAgICBhdXRvIG8gPSBmbGF0YnVmZmVyczo6T2Zmc2V0PE1vbnN0ZXI+KGVuZCk7CisgICAgcmV0dXJuIG87CisgIH0KK307CisKK2lubGluZSBmbGF0YnVmZmVyczo6T2Zmc2V0PE1vbnN0ZXI+IENyZWF0ZU1vbnN0ZXIoCisgICAgZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiKSB7CisgIE1vbnN0ZXJCdWlsZGVyIGJ1aWxkZXJfKF9mYmIpOworICByZXR1cm4gYnVpbGRlcl8uRmluaXNoKCk7Cit9CisKK2ZsYXRidWZmZXJzOjpPZmZzZXQ8TW9uc3Rlcj4gQ3JlYXRlTW9uc3RlcihmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IE1vbnN0ZXJUICpfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlciA9IG51bGxwdHIpOworCit9ICAvLyBuYW1lc3BhY2UgRXhhbXBsZTIKKworbmFtZXNwYWNlIEV4YW1wbGUgeworCitzdHJ1Y3QgVGVzdFNpbXBsZVRhYmxlV2l0aEVudW1UIDogcHVibGljIGZsYXRidWZmZXJzOjpOYXRpdmVUYWJsZSB7CisgIHR5cGVkZWYgVGVzdFNpbXBsZVRhYmxlV2l0aEVudW0gVGFibGVUeXBlOworICBNeUdhbWU6OkV4YW1wbGU6OkNvbG9yIGNvbG9yID0gTXlHYW1lOjpFeGFtcGxlOjpDb2xvcl9HcmVlbjsKK307CisKK3N0cnVjdCBUZXN0U2ltcGxlVGFibGVXaXRoRW51bSBGTEFUQlVGRkVSU19GSU5BTF9DTEFTUyA6IHByaXZhdGUgZmxhdGJ1ZmZlcnM6OlRhYmxlIHsKKyAgdHlwZWRlZiBUZXN0U2ltcGxlVGFibGVXaXRoRW51bVQgTmF0aXZlVGFibGVUeXBlOworICB0eXBlZGVmIFRlc3RTaW1wbGVUYWJsZVdpdGhFbnVtQnVpbGRlciBCdWlsZGVyOworICBzdGF0aWMgY29uc3QgZmxhdGJ1ZmZlcnM6OlR5cGVUYWJsZSAqTWluaVJlZmxlY3RUeXBlVGFibGUoKSB7CisgICAgcmV0dXJuIFRlc3RTaW1wbGVUYWJsZVdpdGhFbnVtVHlwZVRhYmxlKCk7CisgIH0KKyAgZW51bSBGbGF0QnVmZmVyc1ZUYWJsZU9mZnNldCBGTEFUQlVGRkVSU19WVEFCTEVfVU5ERVJMWUlOR19UWVBFIHsKKyAgICBWVF9DT0xPUiA9IDQKKyAgfTsKKyAgTXlHYW1lOjpFeGFtcGxlOjpDb2xvciBjb2xvcigpIGNvbnN0IHsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8TXlHYW1lOjpFeGFtcGxlOjpDb2xvcj4oR2V0RmllbGQ8dWludDhfdD4oVlRfQ09MT1IsIDIpKTsKKyAgfQorICBib29sIG11dGF0ZV9jb2xvcihNeUdhbWU6OkV4YW1wbGU6OkNvbG9yIF9jb2xvciA9IHN0YXRpY19jYXN0PE15R2FtZTo6RXhhbXBsZTo6Q29sb3I+KDIpKSB7CisgICAgcmV0dXJuIFNldEZpZWxkPHVpbnQ4X3Q+KFZUX0NPTE9SLCBzdGF0aWNfY2FzdDx1aW50OF90PihfY29sb3IpLCAyKTsKKyAgfQorICBib29sIFZlcmlmeShmbGF0YnVmZmVyczo6VmVyaWZpZXIgJnZlcmlmaWVyKSBjb25zdCB7CisgICAgcmV0dXJuIFZlcmlmeVRhYmxlU3RhcnQodmVyaWZpZXIpICYmCisgICAgICAgICAgIFZlcmlmeUZpZWxkPHVpbnQ4X3Q+KHZlcmlmaWVyLCBWVF9DT0xPUiwgMSkgJiYKKyAgICAgICAgICAgdmVyaWZpZXIuRW5kVGFibGUoKTsKKyAgfQorICBUZXN0U2ltcGxlVGFibGVXaXRoRW51bVQgKlVuUGFjayhjb25zdCBmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyID0gbnVsbHB0cikgY29uc3Q7CisgIHZvaWQgVW5QYWNrVG8oVGVzdFNpbXBsZVRhYmxlV2l0aEVudW1UICpfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlciA9IG51bGxwdHIpIGNvbnN0OworICBzdGF0aWMgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxUZXN0U2ltcGxlVGFibGVXaXRoRW51bT4gUGFjayhmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IFRlc3RTaW1wbGVUYWJsZVdpdGhFbnVtVCogX28sIGNvbnN0IGZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIgPSBudWxscHRyKTsKK307CisKK3N0cnVjdCBUZXN0U2ltcGxlVGFibGVXaXRoRW51bUJ1aWxkZXIgeworICB0eXBlZGVmIFRlc3RTaW1wbGVUYWJsZVdpdGhFbnVtIFRhYmxlOworICBmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJmZiYl87CisgIGZsYXRidWZmZXJzOjp1b2Zmc2V0X3Qgc3RhcnRfOworICB2b2lkIGFkZF9jb2xvcihNeUdhbWU6OkV4YW1wbGU6OkNvbG9yIGNvbG9yKSB7CisgICAgZmJiXy5BZGRFbGVtZW50PHVpbnQ4X3Q+KFRlc3RTaW1wbGVUYWJsZVdpdGhFbnVtOjpWVF9DT0xPUiwgc3RhdGljX2Nhc3Q8dWludDhfdD4oY29sb3IpLCAyKTsKKyAgfQorICBleHBsaWNpdCBUZXN0U2ltcGxlVGFibGVXaXRoRW51bUJ1aWxkZXIoZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiKQorICAgICAgICA6IGZiYl8oX2ZiYikgeworICAgIHN0YXJ0XyA9IGZiYl8uU3RhcnRUYWJsZSgpOworICB9CisgIGZsYXRidWZmZXJzOjpPZmZzZXQ8VGVzdFNpbXBsZVRhYmxlV2l0aEVudW0+IEZpbmlzaCgpIHsKKyAgICBjb25zdCBhdXRvIGVuZCA9IGZiYl8uRW5kVGFibGUoc3RhcnRfKTsKKyAgICBhdXRvIG8gPSBmbGF0YnVmZmVyczo6T2Zmc2V0PFRlc3RTaW1wbGVUYWJsZVdpdGhFbnVtPihlbmQpOworICAgIHJldHVybiBvOworICB9Cit9OworCitpbmxpbmUgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxUZXN0U2ltcGxlVGFibGVXaXRoRW51bT4gQ3JlYXRlVGVzdFNpbXBsZVRhYmxlV2l0aEVudW0oCisgICAgZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLAorICAgIE15R2FtZTo6RXhhbXBsZTo6Q29sb3IgY29sb3IgPSBNeUdhbWU6OkV4YW1wbGU6OkNvbG9yX0dyZWVuKSB7CisgIFRlc3RTaW1wbGVUYWJsZVdpdGhFbnVtQnVpbGRlciBidWlsZGVyXyhfZmJiKTsKKyAgYnVpbGRlcl8uYWRkX2NvbG9yKGNvbG9yKTsKKyAgcmV0dXJuIGJ1aWxkZXJfLkZpbmlzaCgpOworfQorCitmbGF0YnVmZmVyczo6T2Zmc2V0PFRlc3RTaW1wbGVUYWJsZVdpdGhFbnVtPiBDcmVhdGVUZXN0U2ltcGxlVGFibGVXaXRoRW51bShmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IFRlc3RTaW1wbGVUYWJsZVdpdGhFbnVtVCAqX28sIGNvbnN0IGZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIgPSBudWxscHRyKTsKKworc3RydWN0IFN0YXRUIDogcHVibGljIGZsYXRidWZmZXJzOjpOYXRpdmVUYWJsZSB7CisgIHR5cGVkZWYgU3RhdCBUYWJsZVR5cGU7CisgIHN0ZDo6c3RyaW5nIGlke307CisgIGludDY0X3QgdmFsID0gMDsKKyAgdWludDE2X3QgY291bnQgPSAwOworfTsKKworc3RydWN0IFN0YXQgRkxBVEJVRkZFUlNfRklOQUxfQ0xBU1MgOiBwcml2YXRlIGZsYXRidWZmZXJzOjpUYWJsZSB7CisgIHR5cGVkZWYgU3RhdFQgTmF0aXZlVGFibGVUeXBlOworICB0eXBlZGVmIFN0YXRCdWlsZGVyIEJ1aWxkZXI7CisgIHN0YXRpYyBjb25zdCBmbGF0YnVmZmVyczo6VHlwZVRhYmxlICpNaW5pUmVmbGVjdFR5cGVUYWJsZSgpIHsKKyAgICByZXR1cm4gU3RhdFR5cGVUYWJsZSgpOworICB9CisgIGVudW0gRmxhdEJ1ZmZlcnNWVGFibGVPZmZzZXQgRkxBVEJVRkZFUlNfVlRBQkxFX1VOREVSTFlJTkdfVFlQRSB7CisgICAgVlRfSUQgPSA0LAorICAgIFZUX1ZBTCA9IDYsCisgICAgVlRfQ09VTlQgPSA4CisgIH07CisgIGNvbnN0IGZsYXRidWZmZXJzOjpTdHJpbmcgKmlkKCkgY29uc3QgeworICAgIHJldHVybiBHZXRQb2ludGVyPGNvbnN0IGZsYXRidWZmZXJzOjpTdHJpbmcgKj4oVlRfSUQpOworICB9CisgIGZsYXRidWZmZXJzOjpTdHJpbmcgKm11dGFibGVfaWQoKSB7CisgICAgcmV0dXJuIEdldFBvaW50ZXI8ZmxhdGJ1ZmZlcnM6OlN0cmluZyAqPihWVF9JRCk7CisgIH0KKyAgaW50NjRfdCB2YWwoKSBjb25zdCB7CisgICAgcmV0dXJuIEdldEZpZWxkPGludDY0X3Q+KFZUX1ZBTCwgMCk7CisgIH0KKyAgYm9vbCBtdXRhdGVfdmFsKGludDY0X3QgX3ZhbCA9IDApIHsKKyAgICByZXR1cm4gU2V0RmllbGQ8aW50NjRfdD4oVlRfVkFMLCBfdmFsLCAwKTsKKyAgfQorICB1aW50MTZfdCBjb3VudCgpIGNvbnN0IHsKKyAgICByZXR1cm4gR2V0RmllbGQ8dWludDE2X3Q+KFZUX0NPVU5ULCAwKTsKKyAgfQorICBib29sIG11dGF0ZV9jb3VudCh1aW50MTZfdCBfY291bnQgPSAwKSB7CisgICAgcmV0dXJuIFNldEZpZWxkPHVpbnQxNl90PihWVF9DT1VOVCwgX2NvdW50LCAwKTsKKyAgfQorICBib29sIEtleUNvbXBhcmVMZXNzVGhhbihjb25zdCBTdGF0ICpvKSBjb25zdCB7CisgICAgcmV0dXJuIGNvdW50KCkgPCBvLT5jb3VudCgpOworICB9CisgIGludCBLZXlDb21wYXJlV2l0aFZhbHVlKHVpbnQxNl90IF9jb3VudCkgY29uc3QgeworICAgIHJldHVybiBzdGF0aWNfY2FzdDxpbnQ+KGNvdW50KCkgPiBfY291bnQpIC0gc3RhdGljX2Nhc3Q8aW50Pihjb3VudCgpIDwgX2NvdW50KTsKKyAgfQorICBib29sIFZlcmlmeShmbGF0YnVmZmVyczo6VmVyaWZpZXIgJnZlcmlmaWVyKSBjb25zdCB7CisgICAgcmV0dXJuIFZlcmlmeVRhYmxlU3RhcnQodmVyaWZpZXIpICYmCisgICAgICAgICAgIFZlcmlmeU9mZnNldCh2ZXJpZmllciwgVlRfSUQpICYmCisgICAgICAgICAgIHZlcmlmaWVyLlZlcmlmeVN0cmluZyhpZCgpKSAmJgorICAgICAgICAgICBWZXJpZnlGaWVsZDxpbnQ2NF90Pih2ZXJpZmllciwgVlRfVkFMLCA4KSAmJgorICAgICAgICAgICBWZXJpZnlGaWVsZDx1aW50MTZfdD4odmVyaWZpZXIsIFZUX0NPVU5ULCAyKSAmJgorICAgICAgICAgICB2ZXJpZmllci5FbmRUYWJsZSgpOworICB9CisgIFN0YXRUICpVblBhY2soY29uc3QgZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlciA9IG51bGxwdHIpIGNvbnN0OworICB2b2lkIFVuUGFja1RvKFN0YXRUICpfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlciA9IG51bGxwdHIpIGNvbnN0OworICBzdGF0aWMgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxTdGF0PiBQYWNrKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgU3RhdFQqIF9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyID0gbnVsbHB0cik7Cit9OworCitzdHJ1Y3QgU3RhdEJ1aWxkZXIgeworICB0eXBlZGVmIFN0YXQgVGFibGU7CisgIGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmZmJiXzsKKyAgZmxhdGJ1ZmZlcnM6OnVvZmZzZXRfdCBzdGFydF87CisgIHZvaWQgYWRkX2lkKGZsYXRidWZmZXJzOjpPZmZzZXQ8ZmxhdGJ1ZmZlcnM6OlN0cmluZz4gaWQpIHsKKyAgICBmYmJfLkFkZE9mZnNldChTdGF0OjpWVF9JRCwgaWQpOworICB9CisgIHZvaWQgYWRkX3ZhbChpbnQ2NF90IHZhbCkgeworICAgIGZiYl8uQWRkRWxlbWVudDxpbnQ2NF90PihTdGF0OjpWVF9WQUwsIHZhbCwgMCk7CisgIH0KKyAgdm9pZCBhZGRfY291bnQodWludDE2X3QgY291bnQpIHsKKyAgICBmYmJfLkFkZEVsZW1lbnQ8dWludDE2X3Q+KFN0YXQ6OlZUX0NPVU5ULCBjb3VudCwgMCk7CisgIH0KKyAgZXhwbGljaXQgU3RhdEJ1aWxkZXIoZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiKQorICAgICAgICA6IGZiYl8oX2ZiYikgeworICAgIHN0YXJ0XyA9IGZiYl8uU3RhcnRUYWJsZSgpOworICB9CisgIGZsYXRidWZmZXJzOjpPZmZzZXQ8U3RhdD4gRmluaXNoKCkgeworICAgIGNvbnN0IGF1dG8gZW5kID0gZmJiXy5FbmRUYWJsZShzdGFydF8pOworICAgIGF1dG8gbyA9IGZsYXRidWZmZXJzOjpPZmZzZXQ8U3RhdD4oZW5kKTsKKyAgICByZXR1cm4gbzsKKyAgfQorfTsKKworaW5saW5lIGZsYXRidWZmZXJzOjpPZmZzZXQ8U3RhdD4gQ3JlYXRlU3RhdCgKKyAgICBmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsCisgICAgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxmbGF0YnVmZmVyczo6U3RyaW5nPiBpZCA9IDAsCisgICAgaW50NjRfdCB2YWwgPSAwLAorICAgIHVpbnQxNl90IGNvdW50ID0gMCkgeworICBTdGF0QnVpbGRlciBidWlsZGVyXyhfZmJiKTsKKyAgYnVpbGRlcl8uYWRkX3ZhbCh2YWwpOworICBidWlsZGVyXy5hZGRfaWQoaWQpOworICBidWlsZGVyXy5hZGRfY291bnQoY291bnQpOworICByZXR1cm4gYnVpbGRlcl8uRmluaXNoKCk7Cit9CisKK2lubGluZSBmbGF0YnVmZmVyczo6T2Zmc2V0PFN0YXQ+IENyZWF0ZVN0YXREaXJlY3QoCisgICAgZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLAorICAgIGNvbnN0IGNoYXIgKmlkID0gbnVsbHB0ciwKKyAgICBpbnQ2NF90IHZhbCA9IDAsCisgICAgdWludDE2X3QgY291bnQgPSAwKSB7CisgIGF1dG8gaWRfXyA9IGlkID8gX2ZiYi5DcmVhdGVTdHJpbmcoaWQpIDogMDsKKyAgcmV0dXJuIE15R2FtZTo6RXhhbXBsZTo6Q3JlYXRlU3RhdCgKKyAgICAgIF9mYmIsCisgICAgICBpZF9fLAorICAgICAgdmFsLAorICAgICAgY291bnQpOworfQorCitmbGF0YnVmZmVyczo6T2Zmc2V0PFN0YXQ+IENyZWF0ZVN0YXQoZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBTdGF0VCAqX28sIGNvbnN0IGZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIgPSBudWxscHRyKTsKKworc3RydWN0IFJlZmVycmFibGVUIDogcHVibGljIGZsYXRidWZmZXJzOjpOYXRpdmVUYWJsZSB7CisgIHR5cGVkZWYgUmVmZXJyYWJsZSBUYWJsZVR5cGU7CisgIHVpbnQ2NF90IGlkID0gMDsKK307CisKK3N0cnVjdCBSZWZlcnJhYmxlIEZMQVRCVUZGRVJTX0ZJTkFMX0NMQVNTIDogcHJpdmF0ZSBmbGF0YnVmZmVyczo6VGFibGUgeworICB0eXBlZGVmIFJlZmVycmFibGVUIE5hdGl2ZVRhYmxlVHlwZTsKKyAgdHlwZWRlZiBSZWZlcnJhYmxlQnVpbGRlciBCdWlsZGVyOworICBzdGF0aWMgY29uc3QgZmxhdGJ1ZmZlcnM6OlR5cGVUYWJsZSAqTWluaVJlZmxlY3RUeXBlVGFibGUoKSB7CisgICAgcmV0dXJuIFJlZmVycmFibGVUeXBlVGFibGUoKTsKKyAgfQorICBlbnVtIEZsYXRCdWZmZXJzVlRhYmxlT2Zmc2V0IEZMQVRCVUZGRVJTX1ZUQUJMRV9VTkRFUkxZSU5HX1RZUEUgeworICAgIFZUX0lEID0gNAorICB9OworICB1aW50NjRfdCBpZCgpIGNvbnN0IHsKKyAgICByZXR1cm4gR2V0RmllbGQ8dWludDY0X3Q+KFZUX0lELCAwKTsKKyAgfQorICBib29sIG11dGF0ZV9pZCh1aW50NjRfdCBfaWQgPSAwKSB7CisgICAgcmV0dXJuIFNldEZpZWxkPHVpbnQ2NF90PihWVF9JRCwgX2lkLCAwKTsKKyAgfQorICBib29sIEtleUNvbXBhcmVMZXNzVGhhbihjb25zdCBSZWZlcnJhYmxlICpvKSBjb25zdCB7CisgICAgcmV0dXJuIGlkKCkgPCBvLT5pZCgpOworICB9CisgIGludCBLZXlDb21wYXJlV2l0aFZhbHVlKHVpbnQ2NF90IF9pZCkgY29uc3QgeworICAgIHJldHVybiBzdGF0aWNfY2FzdDxpbnQ+KGlkKCkgPiBfaWQpIC0gc3RhdGljX2Nhc3Q8aW50PihpZCgpIDwgX2lkKTsKKyAgfQorICBib29sIFZlcmlmeShmbGF0YnVmZmVyczo6VmVyaWZpZXIgJnZlcmlmaWVyKSBjb25zdCB7CisgICAgcmV0dXJuIFZlcmlmeVRhYmxlU3RhcnQodmVyaWZpZXIpICYmCisgICAgICAgICAgIFZlcmlmeUZpZWxkPHVpbnQ2NF90Pih2ZXJpZmllciwgVlRfSUQsIDgpICYmCisgICAgICAgICAgIHZlcmlmaWVyLkVuZFRhYmxlKCk7CisgIH0KKyAgUmVmZXJyYWJsZVQgKlVuUGFjayhjb25zdCBmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyID0gbnVsbHB0cikgY29uc3Q7CisgIHZvaWQgVW5QYWNrVG8oUmVmZXJyYWJsZVQgKl9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyID0gbnVsbHB0cikgY29uc3Q7CisgIHN0YXRpYyBmbGF0YnVmZmVyczo6T2Zmc2V0PFJlZmVycmFibGU+IFBhY2soZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBSZWZlcnJhYmxlVCogX28sIGNvbnN0IGZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIgPSBudWxscHRyKTsKK307CisKK3N0cnVjdCBSZWZlcnJhYmxlQnVpbGRlciB7CisgIHR5cGVkZWYgUmVmZXJyYWJsZSBUYWJsZTsKKyAgZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZmYmJfOworICBmbGF0YnVmZmVyczo6dW9mZnNldF90IHN0YXJ0XzsKKyAgdm9pZCBhZGRfaWQodWludDY0X3QgaWQpIHsKKyAgICBmYmJfLkFkZEVsZW1lbnQ8dWludDY0X3Q+KFJlZmVycmFibGU6OlZUX0lELCBpZCwgMCk7CisgIH0KKyAgZXhwbGljaXQgUmVmZXJyYWJsZUJ1aWxkZXIoZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiKQorICAgICAgICA6IGZiYl8oX2ZiYikgeworICAgIHN0YXJ0XyA9IGZiYl8uU3RhcnRUYWJsZSgpOworICB9CisgIGZsYXRidWZmZXJzOjpPZmZzZXQ8UmVmZXJyYWJsZT4gRmluaXNoKCkgeworICAgIGNvbnN0IGF1dG8gZW5kID0gZmJiXy5FbmRUYWJsZShzdGFydF8pOworICAgIGF1dG8gbyA9IGZsYXRidWZmZXJzOjpPZmZzZXQ8UmVmZXJyYWJsZT4oZW5kKTsKKyAgICByZXR1cm4gbzsKKyAgfQorfTsKKworaW5saW5lIGZsYXRidWZmZXJzOjpPZmZzZXQ8UmVmZXJyYWJsZT4gQ3JlYXRlUmVmZXJyYWJsZSgKKyAgICBmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsCisgICAgdWludDY0X3QgaWQgPSAwKSB7CisgIFJlZmVycmFibGVCdWlsZGVyIGJ1aWxkZXJfKF9mYmIpOworICBidWlsZGVyXy5hZGRfaWQoaWQpOworICByZXR1cm4gYnVpbGRlcl8uRmluaXNoKCk7Cit9CisKK2ZsYXRidWZmZXJzOjpPZmZzZXQ8UmVmZXJyYWJsZT4gQ3JlYXRlUmVmZXJyYWJsZShmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IFJlZmVycmFibGVUICpfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlciA9IG51bGxwdHIpOworCitzdHJ1Y3QgTW9uc3RlclQgOiBwdWJsaWMgZmxhdGJ1ZmZlcnM6Ok5hdGl2ZVRhYmxlIHsKKyAgdHlwZWRlZiBNb25zdGVyIFRhYmxlVHlwZTsKKyAgZmxhdGJ1ZmZlcnM6OnVuaXF1ZV9wdHI8TXlHYW1lOjpFeGFtcGxlOjpWZWMzPiBwb3N7fTsKKyAgaW50MTZfdCBtYW5hID0gMTUwOworICBpbnQxNl90IGhwID0gMTAwOworICBzdGQ6OnN0cmluZyBuYW1le307CisgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGludmVudG9yeXt9OworICBNeUdhbWU6OkV4YW1wbGU6OkNvbG9yIGNvbG9yID0gTXlHYW1lOjpFeGFtcGxlOjpDb2xvcl9CbHVlOworICBNeUdhbWU6OkV4YW1wbGU6OkFueVVuaW9uIHRlc3R7fTsKKyAgc3RkOjp2ZWN0b3I8TXlHYW1lOjpFeGFtcGxlOjpUZXN0PiB0ZXN0NHt9OworICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gdGVzdGFycmF5b2ZzdHJpbmd7fTsKKyAgc3RkOjp2ZWN0b3I8ZmxhdGJ1ZmZlcnM6OnVuaXF1ZV9wdHI8TXlHYW1lOjpFeGFtcGxlOjpNb25zdGVyVD4+IHRlc3RhcnJheW9mdGFibGVze307CisgIGZsYXRidWZmZXJzOjp1bmlxdWVfcHRyPE15R2FtZTo6RXhhbXBsZTo6TW9uc3RlclQ+IGVuZW15e307CisgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHRlc3RuZXN0ZWRmbGF0YnVmZmVye307CisgIGZsYXRidWZmZXJzOjp1bmlxdWVfcHRyPE15R2FtZTo6RXhhbXBsZTo6U3RhdFQ+IHRlc3RlbXB0eXt9OworICBib29sIHRlc3Rib29sID0gZmFsc2U7CisgIGludDMyX3QgdGVzdGhhc2hzMzJfZm52MSA9IDA7CisgIHVpbnQzMl90IHRlc3RoYXNodTMyX2ZudjEgPSAwOworICBpbnQ2NF90IHRlc3RoYXNoczY0X2ZudjEgPSAwOworICB1aW50NjRfdCB0ZXN0aGFzaHU2NF9mbnYxID0gMDsKKyAgaW50MzJfdCB0ZXN0aGFzaHMzMl9mbnYxYSA9IDA7CisgIFN0YXQgKnRlc3RoYXNodTMyX2ZudjFhID0gbnVsbHB0cjsKKyAgaW50NjRfdCB0ZXN0aGFzaHM2NF9mbnYxYSA9IDA7CisgIHVpbnQ2NF90IHRlc3RoYXNodTY0X2ZudjFhID0gMDsKKyAgc3RkOjp2ZWN0b3I8Ym9vbD4gdGVzdGFycmF5b2Zib29sc3t9OworICBmbG9hdCB0ZXN0ZiA9IDMuMTQxNTlmOworICBmbG9hdCB0ZXN0ZjIgPSAzLjBmOworICBmbG9hdCB0ZXN0ZjMgPSAwLjBmOworICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gdGVzdGFycmF5b2ZzdHJpbmcye307CisgIHN0ZDo6dmVjdG9yPE15R2FtZTo6RXhhbXBsZTo6QWJpbGl0eT4gdGVzdGFycmF5b2Zzb3J0ZWRzdHJ1Y3R7fTsKKyAgc3RkOjp2ZWN0b3I8dWludDhfdD4gZmxleHt9OworICBzdGQ6OnZlY3RvcjxNeUdhbWU6OkV4YW1wbGU6OlRlc3Q+IHRlc3Q1e307CisgIHN0ZDo6dmVjdG9yPGludDY0X3Q+IHZlY3Rvcl9vZl9sb25nc3t9OworICBzdGQ6OnZlY3Rvcjxkb3VibGU+IHZlY3Rvcl9vZl9kb3VibGVze307CisgIGZsYXRidWZmZXJzOjp1bmlxdWVfcHRyPE15R2FtZTo6SW5QYXJlbnROYW1lc3BhY2VUPiBwYXJlbnRfbmFtZXNwYWNlX3Rlc3R7fTsKKyAgc3RkOjp2ZWN0b3I8ZmxhdGJ1ZmZlcnM6OnVuaXF1ZV9wdHI8TXlHYW1lOjpFeGFtcGxlOjpSZWZlcnJhYmxlVD4+IHZlY3Rvcl9vZl9yZWZlcnJhYmxlc3t9OworICBSZWZlcnJhYmxlVCAqc2luZ2xlX3dlYWtfcmVmZXJlbmNlID0gbnVsbHB0cjsKKyAgc3RkOjp2ZWN0b3I8UmVmZXJyYWJsZVQgKj4gdmVjdG9yX29mX3dlYWtfcmVmZXJlbmNlc3t9OworICBzdGQ6OnZlY3RvcjxmbGF0YnVmZmVyczo6dW5pcXVlX3B0cjxNeUdhbWU6OkV4YW1wbGU6OlJlZmVycmFibGVUPj4gdmVjdG9yX29mX3N0cm9uZ19yZWZlcnJhYmxlc3t9OworICBSZWZlcnJhYmxlVCAqY29fb3duaW5nX3JlZmVyZW5jZSA9IG51bGxwdHI7CisgIHN0ZDo6dmVjdG9yPGZsYXRidWZmZXJzOjp1bmlxdWVfcHRyPFJlZmVycmFibGVUPj4gdmVjdG9yX29mX2NvX293bmluZ19yZWZlcmVuY2Vze307CisgIFJlZmVycmFibGVUICpub25fb3duaW5nX3JlZmVyZW5jZSA9IG51bGxwdHI7CisgIHN0ZDo6dmVjdG9yPFJlZmVycmFibGVUICo+IHZlY3Rvcl9vZl9ub25fb3duaW5nX3JlZmVyZW5jZXN7fTsKKyAgTXlHYW1lOjpFeGFtcGxlOjpBbnlVbmlxdWVBbGlhc2VzVW5pb24gYW55X3VuaXF1ZXt9OworICBNeUdhbWU6OkV4YW1wbGU6OkFueUFtYmlndW91c0FsaWFzZXNVbmlvbiBhbnlfYW1iaWd1b3Vze307CisgIHN0ZDo6dmVjdG9yPE15R2FtZTo6RXhhbXBsZTo6Q29sb3I+IHZlY3Rvcl9vZl9lbnVtc3t9OworICBNeUdhbWU6OkV4YW1wbGU6OlJhY2Ugc2lnbmVkX2VudW0gPSBNeUdhbWU6OkV4YW1wbGU6OlJhY2VfTm9uZTsKKyAgc3RkOjp2ZWN0b3I8dWludDhfdD4gdGVzdHJlcXVpcmVkbmVzdGVkZmxhdGJ1ZmZlcnt9OworICBzdGQ6OnZlY3RvcjxmbGF0YnVmZmVyczo6dW5pcXVlX3B0cjxNeUdhbWU6OkV4YW1wbGU6OlN0YXRUPj4gc2NhbGFyX2tleV9zb3J0ZWRfdGFibGVze307CisgIE15R2FtZTo6RXhhbXBsZTo6VGVzdCBuYXRpdmVfaW5saW5le307CisgIE15R2FtZTo6RXhhbXBsZTo6TG9uZ0VudW0gbG9uZ19lbnVtX25vbl9lbnVtX2RlZmF1bHQgPSBzdGF0aWNfY2FzdDxNeUdhbWU6OkV4YW1wbGU6OkxvbmdFbnVtPigwKTsKKyAgTXlHYW1lOjpFeGFtcGxlOjpMb25nRW51bSBsb25nX2VudW1fbm9ybWFsX2RlZmF1bHQgPSBNeUdhbWU6OkV4YW1wbGU6OkxvbmdFbnVtX0xvbmdPbmU7CisgIE1vbnN0ZXJUKCkgPSBkZWZhdWx0OworICBNb25zdGVyVChjb25zdCBNb25zdGVyVCAmbyk7CisgIE1vbnN0ZXJUKE1vbnN0ZXJUJiYpIEZMQVRCVUZGRVJTX05PRVhDRVBUID0gZGVmYXVsdDsKKyAgTW9uc3RlclQgJm9wZXJhdG9yPShNb25zdGVyVCBvKSBGTEFUQlVGRkVSU19OT0VYQ0VQVDsKK307CisKKy8vLyBhbiBleGFtcGxlIGRvY3VtZW50YXRpb24gY29tbWVudDogIm1vbnN0ZXIgb2JqZWN0Igorc3RydWN0IE1vbnN0ZXIgRkxBVEJVRkZFUlNfRklOQUxfQ0xBU1MgOiBwcml2YXRlIGZsYXRidWZmZXJzOjpUYWJsZSB7CisgIHR5cGVkZWYgTW9uc3RlclQgTmF0aXZlVGFibGVUeXBlOworICB0eXBlZGVmIE1vbnN0ZXJCdWlsZGVyIEJ1aWxkZXI7CisgIHN0YXRpYyBjb25zdCBmbGF0YnVmZmVyczo6VHlwZVRhYmxlICpNaW5pUmVmbGVjdFR5cGVUYWJsZSgpIHsKKyAgICByZXR1cm4gTW9uc3RlclR5cGVUYWJsZSgpOworICB9CisgIGVudW0gRmxhdEJ1ZmZlcnNWVGFibGVPZmZzZXQgRkxBVEJVRkZFUlNfVlRBQkxFX1VOREVSTFlJTkdfVFlQRSB7CisgICAgVlRfUE9TID0gNCwKKyAgICBWVF9NQU5BID0gNiwKKyAgICBWVF9IUCA9IDgsCisgICAgVlRfTkFNRSA9IDEwLAorICAgIFZUX0lOVkVOVE9SWSA9IDE0LAorICAgIFZUX0NPTE9SID0gMTYsCisgICAgVlRfVEVTVF9UWVBFID0gMTgsCisgICAgVlRfVEVTVCA9IDIwLAorICAgIFZUX1RFU1Q0ID0gMjIsCisgICAgVlRfVEVTVEFSUkFZT0ZTVFJJTkcgPSAyNCwKKyAgICBWVF9URVNUQVJSQVlPRlRBQkxFUyA9IDI2LAorICAgIFZUX0VORU1ZID0gMjgsCisgICAgVlRfVEVTVE5FU1RFREZMQVRCVUZGRVIgPSAzMCwKKyAgICBWVF9URVNURU1QVFkgPSAzMiwKKyAgICBWVF9URVNUQk9PTCA9IDM0LAorICAgIFZUX1RFU1RIQVNIUzMyX0ZOVjEgPSAzNiwKKyAgICBWVF9URVNUSEFTSFUzMl9GTlYxID0gMzgsCisgICAgVlRfVEVTVEhBU0hTNjRfRk5WMSA9IDQwLAorICAgIFZUX1RFU1RIQVNIVTY0X0ZOVjEgPSA0MiwKKyAgICBWVF9URVNUSEFTSFMzMl9GTlYxQSA9IDQ0LAorICAgIFZUX1RFU1RIQVNIVTMyX0ZOVjFBID0gNDYsCisgICAgVlRfVEVTVEhBU0hTNjRfRk5WMUEgPSA0OCwKKyAgICBWVF9URVNUSEFTSFU2NF9GTlYxQSA9IDUwLAorICAgIFZUX1RFU1RBUlJBWU9GQk9PTFMgPSA1MiwKKyAgICBWVF9URVNURiA9IDU0LAorICAgIFZUX1RFU1RGMiA9IDU2LAorICAgIFZUX1RFU1RGMyA9IDU4LAorICAgIFZUX1RFU1RBUlJBWU9GU1RSSU5HMiA9IDYwLAorICAgIFZUX1RFU1RBUlJBWU9GU09SVEVEU1RSVUNUID0gNjIsCisgICAgVlRfRkxFWCA9IDY0LAorICAgIFZUX1RFU1Q1ID0gNjYsCisgICAgVlRfVkVDVE9SX09GX0xPTkdTID0gNjgsCisgICAgVlRfVkVDVE9SX09GX0RPVUJMRVMgPSA3MCwKKyAgICBWVF9QQVJFTlRfTkFNRVNQQUNFX1RFU1QgPSA3MiwKKyAgICBWVF9WRUNUT1JfT0ZfUkVGRVJSQUJMRVMgPSA3NCwKKyAgICBWVF9TSU5HTEVfV0VBS19SRUZFUkVOQ0UgPSA3NiwKKyAgICBWVF9WRUNUT1JfT0ZfV0VBS19SRUZFUkVOQ0VTID0gNzgsCisgICAgVlRfVkVDVE9SX09GX1NUUk9OR19SRUZFUlJBQkxFUyA9IDgwLAorICAgIFZUX0NPX09XTklOR19SRUZFUkVOQ0UgPSA4MiwKKyAgICBWVF9WRUNUT1JfT0ZfQ09fT1dOSU5HX1JFRkVSRU5DRVMgPSA4NCwKKyAgICBWVF9OT05fT1dOSU5HX1JFRkVSRU5DRSA9IDg2LAorICAgIFZUX1ZFQ1RPUl9PRl9OT05fT1dOSU5HX1JFRkVSRU5DRVMgPSA4OCwKKyAgICBWVF9BTllfVU5JUVVFX1RZUEUgPSA5MCwKKyAgICBWVF9BTllfVU5JUVVFID0gOTIsCisgICAgVlRfQU5ZX0FNQklHVU9VU19UWVBFID0gOTQsCisgICAgVlRfQU5ZX0FNQklHVU9VUyA9IDk2LAorICAgIFZUX1ZFQ1RPUl9PRl9FTlVNUyA9IDk4LAorICAgIFZUX1NJR05FRF9FTlVNID0gMTAwLAorICAgIFZUX1RFU1RSRVFVSVJFRE5FU1RFREZMQVRCVUZGRVIgPSAxMDIsCisgICAgVlRfU0NBTEFSX0tFWV9TT1JURURfVEFCTEVTID0gMTA0LAorICAgIFZUX05BVElWRV9JTkxJTkUgPSAxMDYsCisgICAgVlRfTE9OR19FTlVNX05PTl9FTlVNX0RFRkFVTFQgPSAxMDgsCisgICAgVlRfTE9OR19FTlVNX05PUk1BTF9ERUZBVUxUID0gMTEwCisgIH07CisgIGNvbnN0IE15R2FtZTo6RXhhbXBsZTo6VmVjMyAqcG9zKCkgY29uc3QgeworICAgIHJldHVybiBHZXRTdHJ1Y3Q8Y29uc3QgTXlHYW1lOjpFeGFtcGxlOjpWZWMzICo+KFZUX1BPUyk7CisgIH0KKyAgTXlHYW1lOjpFeGFtcGxlOjpWZWMzICptdXRhYmxlX3BvcygpIHsKKyAgICByZXR1cm4gR2V0U3RydWN0PE15R2FtZTo6RXhhbXBsZTo6VmVjMyAqPihWVF9QT1MpOworICB9CisgIGludDE2X3QgbWFuYSgpIGNvbnN0IHsKKyAgICByZXR1cm4gR2V0RmllbGQ8aW50MTZfdD4oVlRfTUFOQSwgMTUwKTsKKyAgfQorICBib29sIG11dGF0ZV9tYW5hKGludDE2X3QgX21hbmEgPSAxNTApIHsKKyAgICByZXR1cm4gU2V0RmllbGQ8aW50MTZfdD4oVlRfTUFOQSwgX21hbmEsIDE1MCk7CisgIH0KKyAgaW50MTZfdCBocCgpIGNvbnN0IHsKKyAgICByZXR1cm4gR2V0RmllbGQ8aW50MTZfdD4oVlRfSFAsIDEwMCk7CisgIH0KKyAgYm9vbCBtdXRhdGVfaHAoaW50MTZfdCBfaHAgPSAxMDApIHsKKyAgICByZXR1cm4gU2V0RmllbGQ8aW50MTZfdD4oVlRfSFAsIF9ocCwgMTAwKTsKKyAgfQorICBjb25zdCBmbGF0YnVmZmVyczo6U3RyaW5nICpuYW1lKCkgY29uc3QgeworICAgIHJldHVybiBHZXRQb2ludGVyPGNvbnN0IGZsYXRidWZmZXJzOjpTdHJpbmcgKj4oVlRfTkFNRSk7CisgIH0KKyAgZmxhdGJ1ZmZlcnM6OlN0cmluZyAqbXV0YWJsZV9uYW1lKCkgeworICAgIHJldHVybiBHZXRQb2ludGVyPGZsYXRidWZmZXJzOjpTdHJpbmcgKj4oVlRfTkFNRSk7CisgIH0KKyAgYm9vbCBLZXlDb21wYXJlTGVzc1RoYW4oY29uc3QgTW9uc3RlciAqbykgY29uc3QgeworICAgIHJldHVybiAqbmFtZSgpIDwgKm8tPm5hbWUoKTsKKyAgfQorICBpbnQgS2V5Q29tcGFyZVdpdGhWYWx1ZShjb25zdCBjaGFyICpfbmFtZSkgY29uc3QgeworICAgIHJldHVybiBzdHJjbXAobmFtZSgpLT5jX3N0cigpLCBfbmFtZSk7CisgIH0KKyAgY29uc3QgZmxhdGJ1ZmZlcnM6OlZlY3Rvcjx1aW50OF90PiAqaW52ZW50b3J5KCkgY29uc3QgeworICAgIHJldHVybiBHZXRQb2ludGVyPGNvbnN0IGZsYXRidWZmZXJzOjpWZWN0b3I8dWludDhfdD4gKj4oVlRfSU5WRU5UT1JZKTsKKyAgfQorICBmbGF0YnVmZmVyczo6VmVjdG9yPHVpbnQ4X3Q+ICptdXRhYmxlX2ludmVudG9yeSgpIHsKKyAgICByZXR1cm4gR2V0UG9pbnRlcjxmbGF0YnVmZmVyczo6VmVjdG9yPHVpbnQ4X3Q+ICo+KFZUX0lOVkVOVE9SWSk7CisgIH0KKyAgTXlHYW1lOjpFeGFtcGxlOjpDb2xvciBjb2xvcigpIGNvbnN0IHsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8TXlHYW1lOjpFeGFtcGxlOjpDb2xvcj4oR2V0RmllbGQ8dWludDhfdD4oVlRfQ09MT1IsIDgpKTsKKyAgfQorICBib29sIG11dGF0ZV9jb2xvcihNeUdhbWU6OkV4YW1wbGU6OkNvbG9yIF9jb2xvciA9IHN0YXRpY19jYXN0PE15R2FtZTo6RXhhbXBsZTo6Q29sb3I+KDgpKSB7CisgICAgcmV0dXJuIFNldEZpZWxkPHVpbnQ4X3Q+KFZUX0NPTE9SLCBzdGF0aWNfY2FzdDx1aW50OF90PihfY29sb3IpLCA4KTsKKyAgfQorICBNeUdhbWU6OkV4YW1wbGU6OkFueSB0ZXN0X3R5cGUoKSBjb25zdCB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PE15R2FtZTo6RXhhbXBsZTo6QW55PihHZXRGaWVsZDx1aW50OF90PihWVF9URVNUX1RZUEUsIDApKTsKKyAgfQorICBjb25zdCB2b2lkICp0ZXN0KCkgY29uc3QgeworICAgIHJldHVybiBHZXRQb2ludGVyPGNvbnN0IHZvaWQgKj4oVlRfVEVTVCk7CisgIH0KKyAgdGVtcGxhdGU8dHlwZW5hbWUgVD4gY29uc3QgVCAqdGVzdF9hcygpIGNvbnN0OworICBjb25zdCBNeUdhbWU6OkV4YW1wbGU6Ok1vbnN0ZXIgKnRlc3RfYXNfTW9uc3RlcigpIGNvbnN0IHsKKyAgICByZXR1cm4gdGVzdF90eXBlKCkgPT0gTXlHYW1lOjpFeGFtcGxlOjpBbnlfTW9uc3RlciA/IHN0YXRpY19jYXN0PGNvbnN0IE15R2FtZTo6RXhhbXBsZTo6TW9uc3RlciAqPih0ZXN0KCkpIDogbnVsbHB0cjsKKyAgfQorICBjb25zdCBNeUdhbWU6OkV4YW1wbGU6OlRlc3RTaW1wbGVUYWJsZVdpdGhFbnVtICp0ZXN0X2FzX1Rlc3RTaW1wbGVUYWJsZVdpdGhFbnVtKCkgY29uc3QgeworICAgIHJldHVybiB0ZXN0X3R5cGUoKSA9PSBNeUdhbWU6OkV4YW1wbGU6OkFueV9UZXN0U2ltcGxlVGFibGVXaXRoRW51bSA/IHN0YXRpY19jYXN0PGNvbnN0IE15R2FtZTo6RXhhbXBsZTo6VGVzdFNpbXBsZVRhYmxlV2l0aEVudW0gKj4odGVzdCgpKSA6IG51bGxwdHI7CisgIH0KKyAgY29uc3QgTXlHYW1lOjpFeGFtcGxlMjo6TW9uc3RlciAqdGVzdF9hc19NeUdhbWVfRXhhbXBsZTJfTW9uc3RlcigpIGNvbnN0IHsKKyAgICByZXR1cm4gdGVzdF90eXBlKCkgPT0gTXlHYW1lOjpFeGFtcGxlOjpBbnlfTXlHYW1lX0V4YW1wbGUyX01vbnN0ZXIgPyBzdGF0aWNfY2FzdDxjb25zdCBNeUdhbWU6OkV4YW1wbGUyOjpNb25zdGVyICo+KHRlc3QoKSkgOiBudWxscHRyOworICB9CisgIHZvaWQgKm11dGFibGVfdGVzdCgpIHsKKyAgICByZXR1cm4gR2V0UG9pbnRlcjx2b2lkICo+KFZUX1RFU1QpOworICB9CisgIGNvbnN0IGZsYXRidWZmZXJzOjpWZWN0b3I8Y29uc3QgTXlHYW1lOjpFeGFtcGxlOjpUZXN0ICo+ICp0ZXN0NCgpIGNvbnN0IHsKKyAgICByZXR1cm4gR2V0UG9pbnRlcjxjb25zdCBmbGF0YnVmZmVyczo6VmVjdG9yPGNvbnN0IE15R2FtZTo6RXhhbXBsZTo6VGVzdCAqPiAqPihWVF9URVNUNCk7CisgIH0KKyAgZmxhdGJ1ZmZlcnM6OlZlY3Rvcjxjb25zdCBNeUdhbWU6OkV4YW1wbGU6OlRlc3QgKj4gKm11dGFibGVfdGVzdDQoKSB7CisgICAgcmV0dXJuIEdldFBvaW50ZXI8ZmxhdGJ1ZmZlcnM6OlZlY3Rvcjxjb25zdCBNeUdhbWU6OkV4YW1wbGU6OlRlc3QgKj4gKj4oVlRfVEVTVDQpOworICB9CisgIGNvbnN0IGZsYXRidWZmZXJzOjpWZWN0b3I8ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxmbGF0YnVmZmVyczo6U3RyaW5nPj4gKnRlc3RhcnJheW9mc3RyaW5nKCkgY29uc3QgeworICAgIHJldHVybiBHZXRQb2ludGVyPGNvbnN0IGZsYXRidWZmZXJzOjpWZWN0b3I8ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxmbGF0YnVmZmVyczo6U3RyaW5nPj4gKj4oVlRfVEVTVEFSUkFZT0ZTVFJJTkcpOworICB9CisgIGZsYXRidWZmZXJzOjpWZWN0b3I8ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxmbGF0YnVmZmVyczo6U3RyaW5nPj4gKm11dGFibGVfdGVzdGFycmF5b2ZzdHJpbmcoKSB7CisgICAgcmV0dXJuIEdldFBvaW50ZXI8ZmxhdGJ1ZmZlcnM6OlZlY3RvcjxmbGF0YnVmZmVyczo6T2Zmc2V0PGZsYXRidWZmZXJzOjpTdHJpbmc+PiAqPihWVF9URVNUQVJSQVlPRlNUUklORyk7CisgIH0KKyAgLy8vIGFuIGV4YW1wbGUgZG9jdW1lbnRhdGlvbiBjb21tZW50OiB0aGlzIHdpbGwgZW5kIHVwIGluIHRoZSBnZW5lcmF0ZWQgY29kZQorICAvLy8gbXVsdGlsaW5lIHRvbworICBjb25zdCBmbGF0YnVmZmVyczo6VmVjdG9yPGZsYXRidWZmZXJzOjpPZmZzZXQ8TXlHYW1lOjpFeGFtcGxlOjpNb25zdGVyPj4gKnRlc3RhcnJheW9mdGFibGVzKCkgY29uc3QgeworICAgIHJldHVybiBHZXRQb2ludGVyPGNvbnN0IGZsYXRidWZmZXJzOjpWZWN0b3I8ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxNeUdhbWU6OkV4YW1wbGU6Ok1vbnN0ZXI+PiAqPihWVF9URVNUQVJSQVlPRlRBQkxFUyk7CisgIH0KKyAgZmxhdGJ1ZmZlcnM6OlZlY3RvcjxmbGF0YnVmZmVyczo6T2Zmc2V0PE15R2FtZTo6RXhhbXBsZTo6TW9uc3Rlcj4+ICptdXRhYmxlX3Rlc3RhcnJheW9mdGFibGVzKCkgeworICAgIHJldHVybiBHZXRQb2ludGVyPGZsYXRidWZmZXJzOjpWZWN0b3I8ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxNeUdhbWU6OkV4YW1wbGU6Ok1vbnN0ZXI+PiAqPihWVF9URVNUQVJSQVlPRlRBQkxFUyk7CisgIH0KKyAgY29uc3QgTXlHYW1lOjpFeGFtcGxlOjpNb25zdGVyICplbmVteSgpIGNvbnN0IHsKKyAgICByZXR1cm4gR2V0UG9pbnRlcjxjb25zdCBNeUdhbWU6OkV4YW1wbGU6Ok1vbnN0ZXIgKj4oVlRfRU5FTVkpOworICB9CisgIE15R2FtZTo6RXhhbXBsZTo6TW9uc3RlciAqbXV0YWJsZV9lbmVteSgpIHsKKyAgICByZXR1cm4gR2V0UG9pbnRlcjxNeUdhbWU6OkV4YW1wbGU6Ok1vbnN0ZXIgKj4oVlRfRU5FTVkpOworICB9CisgIGNvbnN0IGZsYXRidWZmZXJzOjpWZWN0b3I8dWludDhfdD4gKnRlc3RuZXN0ZWRmbGF0YnVmZmVyKCkgY29uc3QgeworICAgIHJldHVybiBHZXRQb2ludGVyPGNvbnN0IGZsYXRidWZmZXJzOjpWZWN0b3I8dWludDhfdD4gKj4oVlRfVEVTVE5FU1RFREZMQVRCVUZGRVIpOworICB9CisgIGZsYXRidWZmZXJzOjpWZWN0b3I8dWludDhfdD4gKm11dGFibGVfdGVzdG5lc3RlZGZsYXRidWZmZXIoKSB7CisgICAgcmV0dXJuIEdldFBvaW50ZXI8ZmxhdGJ1ZmZlcnM6OlZlY3Rvcjx1aW50OF90PiAqPihWVF9URVNUTkVTVEVERkxBVEJVRkZFUik7CisgIH0KKyAgY29uc3QgTXlHYW1lOjpFeGFtcGxlOjpNb25zdGVyICp0ZXN0bmVzdGVkZmxhdGJ1ZmZlcl9uZXN0ZWRfcm9vdCgpIGNvbnN0IHsKKyAgICByZXR1cm4gZmxhdGJ1ZmZlcnM6OkdldFJvb3Q8TXlHYW1lOjpFeGFtcGxlOjpNb25zdGVyPih0ZXN0bmVzdGVkZmxhdGJ1ZmZlcigpLT5EYXRhKCkpOworICB9CisgIGNvbnN0IE15R2FtZTo6RXhhbXBsZTo6U3RhdCAqdGVzdGVtcHR5KCkgY29uc3QgeworICAgIHJldHVybiBHZXRQb2ludGVyPGNvbnN0IE15R2FtZTo6RXhhbXBsZTo6U3RhdCAqPihWVF9URVNURU1QVFkpOworICB9CisgIE15R2FtZTo6RXhhbXBsZTo6U3RhdCAqbXV0YWJsZV90ZXN0ZW1wdHkoKSB7CisgICAgcmV0dXJuIEdldFBvaW50ZXI8TXlHYW1lOjpFeGFtcGxlOjpTdGF0ICo+KFZUX1RFU1RFTVBUWSk7CisgIH0KKyAgYm9vbCB0ZXN0Ym9vbCgpIGNvbnN0IHsKKyAgICByZXR1cm4gR2V0RmllbGQ8dWludDhfdD4oVlRfVEVTVEJPT0wsIDApICE9IDA7CisgIH0KKyAgYm9vbCBtdXRhdGVfdGVzdGJvb2woYm9vbCBfdGVzdGJvb2wgPSAwKSB7CisgICAgcmV0dXJuIFNldEZpZWxkPHVpbnQ4X3Q+KFZUX1RFU1RCT09MLCBzdGF0aWNfY2FzdDx1aW50OF90PihfdGVzdGJvb2wpLCAwKTsKKyAgfQorICBpbnQzMl90IHRlc3RoYXNoczMyX2ZudjEoKSBjb25zdCB7CisgICAgcmV0dXJuIEdldEZpZWxkPGludDMyX3Q+KFZUX1RFU1RIQVNIUzMyX0ZOVjEsIDApOworICB9CisgIGJvb2wgbXV0YXRlX3Rlc3RoYXNoczMyX2ZudjEoaW50MzJfdCBfdGVzdGhhc2hzMzJfZm52MSA9IDApIHsKKyAgICByZXR1cm4gU2V0RmllbGQ8aW50MzJfdD4oVlRfVEVTVEhBU0hTMzJfRk5WMSwgX3Rlc3RoYXNoczMyX2ZudjEsIDApOworICB9CisgIHVpbnQzMl90IHRlc3RoYXNodTMyX2ZudjEoKSBjb25zdCB7CisgICAgcmV0dXJuIEdldEZpZWxkPHVpbnQzMl90PihWVF9URVNUSEFTSFUzMl9GTlYxLCAwKTsKKyAgfQorICBib29sIG11dGF0ZV90ZXN0aGFzaHUzMl9mbnYxKHVpbnQzMl90IF90ZXN0aGFzaHUzMl9mbnYxID0gMCkgeworICAgIHJldHVybiBTZXRGaWVsZDx1aW50MzJfdD4oVlRfVEVTVEhBU0hVMzJfRk5WMSwgX3Rlc3RoYXNodTMyX2ZudjEsIDApOworICB9CisgIGludDY0X3QgdGVzdGhhc2hzNjRfZm52MSgpIGNvbnN0IHsKKyAgICByZXR1cm4gR2V0RmllbGQ8aW50NjRfdD4oVlRfVEVTVEhBU0hTNjRfRk5WMSwgMCk7CisgIH0KKyAgYm9vbCBtdXRhdGVfdGVzdGhhc2hzNjRfZm52MShpbnQ2NF90IF90ZXN0aGFzaHM2NF9mbnYxID0gMCkgeworICAgIHJldHVybiBTZXRGaWVsZDxpbnQ2NF90PihWVF9URVNUSEFTSFM2NF9GTlYxLCBfdGVzdGhhc2hzNjRfZm52MSwgMCk7CisgIH0KKyAgdWludDY0X3QgdGVzdGhhc2h1NjRfZm52MSgpIGNvbnN0IHsKKyAgICByZXR1cm4gR2V0RmllbGQ8dWludDY0X3Q+KFZUX1RFU1RIQVNIVTY0X0ZOVjEsIDApOworICB9CisgIGJvb2wgbXV0YXRlX3Rlc3RoYXNodTY0X2ZudjEodWludDY0X3QgX3Rlc3RoYXNodTY0X2ZudjEgPSAwKSB7CisgICAgcmV0dXJuIFNldEZpZWxkPHVpbnQ2NF90PihWVF9URVNUSEFTSFU2NF9GTlYxLCBfdGVzdGhhc2h1NjRfZm52MSwgMCk7CisgIH0KKyAgaW50MzJfdCB0ZXN0aGFzaHMzMl9mbnYxYSgpIGNvbnN0IHsKKyAgICByZXR1cm4gR2V0RmllbGQ8aW50MzJfdD4oVlRfVEVTVEhBU0hTMzJfRk5WMUEsIDApOworICB9CisgIGJvb2wgbXV0YXRlX3Rlc3RoYXNoczMyX2ZudjFhKGludDMyX3QgX3Rlc3RoYXNoczMyX2ZudjFhID0gMCkgeworICAgIHJldHVybiBTZXRGaWVsZDxpbnQzMl90PihWVF9URVNUSEFTSFMzMl9GTlYxQSwgX3Rlc3RoYXNoczMyX2ZudjFhLCAwKTsKKyAgfQorICB1aW50MzJfdCB0ZXN0aGFzaHUzMl9mbnYxYSgpIGNvbnN0IHsKKyAgICByZXR1cm4gR2V0RmllbGQ8dWludDMyX3Q+KFZUX1RFU1RIQVNIVTMyX0ZOVjFBLCAwKTsKKyAgfQorICBib29sIG11dGF0ZV90ZXN0aGFzaHUzMl9mbnYxYSh1aW50MzJfdCBfdGVzdGhhc2h1MzJfZm52MWEgPSAwKSB7CisgICAgcmV0dXJuIFNldEZpZWxkPHVpbnQzMl90PihWVF9URVNUSEFTSFUzMl9GTlYxQSwgX3Rlc3RoYXNodTMyX2ZudjFhLCAwKTsKKyAgfQorICBpbnQ2NF90IHRlc3RoYXNoczY0X2ZudjFhKCkgY29uc3QgeworICAgIHJldHVybiBHZXRGaWVsZDxpbnQ2NF90PihWVF9URVNUSEFTSFM2NF9GTlYxQSwgMCk7CisgIH0KKyAgYm9vbCBtdXRhdGVfdGVzdGhhc2hzNjRfZm52MWEoaW50NjRfdCBfdGVzdGhhc2hzNjRfZm52MWEgPSAwKSB7CisgICAgcmV0dXJuIFNldEZpZWxkPGludDY0X3Q+KFZUX1RFU1RIQVNIUzY0X0ZOVjFBLCBfdGVzdGhhc2hzNjRfZm52MWEsIDApOworICB9CisgIHVpbnQ2NF90IHRlc3RoYXNodTY0X2ZudjFhKCkgY29uc3QgeworICAgIHJldHVybiBHZXRGaWVsZDx1aW50NjRfdD4oVlRfVEVTVEhBU0hVNjRfRk5WMUEsIDApOworICB9CisgIGJvb2wgbXV0YXRlX3Rlc3RoYXNodTY0X2ZudjFhKHVpbnQ2NF90IF90ZXN0aGFzaHU2NF9mbnYxYSA9IDApIHsKKyAgICByZXR1cm4gU2V0RmllbGQ8dWludDY0X3Q+KFZUX1RFU1RIQVNIVTY0X0ZOVjFBLCBfdGVzdGhhc2h1NjRfZm52MWEsIDApOworICB9CisgIGNvbnN0IGZsYXRidWZmZXJzOjpWZWN0b3I8dWludDhfdD4gKnRlc3RhcnJheW9mYm9vbHMoKSBjb25zdCB7CisgICAgcmV0dXJuIEdldFBvaW50ZXI8Y29uc3QgZmxhdGJ1ZmZlcnM6OlZlY3Rvcjx1aW50OF90PiAqPihWVF9URVNUQVJSQVlPRkJPT0xTKTsKKyAgfQorICBmbGF0YnVmZmVyczo6VmVjdG9yPHVpbnQ4X3Q+ICptdXRhYmxlX3Rlc3RhcnJheW9mYm9vbHMoKSB7CisgICAgcmV0dXJuIEdldFBvaW50ZXI8ZmxhdGJ1ZmZlcnM6OlZlY3Rvcjx1aW50OF90PiAqPihWVF9URVNUQVJSQVlPRkJPT0xTKTsKKyAgfQorICBmbG9hdCB0ZXN0ZigpIGNvbnN0IHsKKyAgICByZXR1cm4gR2V0RmllbGQ8ZmxvYXQ+KFZUX1RFU1RGLCAzLjE0MTU5Zik7CisgIH0KKyAgYm9vbCBtdXRhdGVfdGVzdGYoZmxvYXQgX3Rlc3RmID0gMy4xNDE1OWYpIHsKKyAgICByZXR1cm4gU2V0RmllbGQ8ZmxvYXQ+KFZUX1RFU1RGLCBfdGVzdGYsIDMuMTQxNTlmKTsKKyAgfQorICBmbG9hdCB0ZXN0ZjIoKSBjb25zdCB7CisgICAgcmV0dXJuIEdldEZpZWxkPGZsb2F0PihWVF9URVNURjIsIDMuMGYpOworICB9CisgIGJvb2wgbXV0YXRlX3Rlc3RmMihmbG9hdCBfdGVzdGYyID0gMy4wZikgeworICAgIHJldHVybiBTZXRGaWVsZDxmbG9hdD4oVlRfVEVTVEYyLCBfdGVzdGYyLCAzLjBmKTsKKyAgfQorICBmbG9hdCB0ZXN0ZjMoKSBjb25zdCB7CisgICAgcmV0dXJuIEdldEZpZWxkPGZsb2F0PihWVF9URVNURjMsIDAuMGYpOworICB9CisgIGJvb2wgbXV0YXRlX3Rlc3RmMyhmbG9hdCBfdGVzdGYzID0gMC4wZikgeworICAgIHJldHVybiBTZXRGaWVsZDxmbG9hdD4oVlRfVEVTVEYzLCBfdGVzdGYzLCAwLjBmKTsKKyAgfQorICBjb25zdCBmbGF0YnVmZmVyczo6VmVjdG9yPGZsYXRidWZmZXJzOjpPZmZzZXQ8ZmxhdGJ1ZmZlcnM6OlN0cmluZz4+ICp0ZXN0YXJyYXlvZnN0cmluZzIoKSBjb25zdCB7CisgICAgcmV0dXJuIEdldFBvaW50ZXI8Y29uc3QgZmxhdGJ1ZmZlcnM6OlZlY3RvcjxmbGF0YnVmZmVyczo6T2Zmc2V0PGZsYXRidWZmZXJzOjpTdHJpbmc+PiAqPihWVF9URVNUQVJSQVlPRlNUUklORzIpOworICB9CisgIGZsYXRidWZmZXJzOjpWZWN0b3I8ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxmbGF0YnVmZmVyczo6U3RyaW5nPj4gKm11dGFibGVfdGVzdGFycmF5b2ZzdHJpbmcyKCkgeworICAgIHJldHVybiBHZXRQb2ludGVyPGZsYXRidWZmZXJzOjpWZWN0b3I8ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxmbGF0YnVmZmVyczo6U3RyaW5nPj4gKj4oVlRfVEVTVEFSUkFZT0ZTVFJJTkcyKTsKKyAgfQorICBjb25zdCBmbGF0YnVmZmVyczo6VmVjdG9yPGNvbnN0IE15R2FtZTo6RXhhbXBsZTo6QWJpbGl0eSAqPiAqdGVzdGFycmF5b2Zzb3J0ZWRzdHJ1Y3QoKSBjb25zdCB7CisgICAgcmV0dXJuIEdldFBvaW50ZXI8Y29uc3QgZmxhdGJ1ZmZlcnM6OlZlY3Rvcjxjb25zdCBNeUdhbWU6OkV4YW1wbGU6OkFiaWxpdHkgKj4gKj4oVlRfVEVTVEFSUkFZT0ZTT1JURURTVFJVQ1QpOworICB9CisgIGZsYXRidWZmZXJzOjpWZWN0b3I8Y29uc3QgTXlHYW1lOjpFeGFtcGxlOjpBYmlsaXR5ICo+ICptdXRhYmxlX3Rlc3RhcnJheW9mc29ydGVkc3RydWN0KCkgeworICAgIHJldHVybiBHZXRQb2ludGVyPGZsYXRidWZmZXJzOjpWZWN0b3I8Y29uc3QgTXlHYW1lOjpFeGFtcGxlOjpBYmlsaXR5ICo+ICo+KFZUX1RFU1RBUlJBWU9GU09SVEVEU1RSVUNUKTsKKyAgfQorICBjb25zdCBmbGF0YnVmZmVyczo6VmVjdG9yPHVpbnQ4X3Q+ICpmbGV4KCkgY29uc3QgeworICAgIHJldHVybiBHZXRQb2ludGVyPGNvbnN0IGZsYXRidWZmZXJzOjpWZWN0b3I8dWludDhfdD4gKj4oVlRfRkxFWCk7CisgIH0KKyAgZmxhdGJ1ZmZlcnM6OlZlY3Rvcjx1aW50OF90PiAqbXV0YWJsZV9mbGV4KCkgeworICAgIHJldHVybiBHZXRQb2ludGVyPGZsYXRidWZmZXJzOjpWZWN0b3I8dWludDhfdD4gKj4oVlRfRkxFWCk7CisgIH0KKyAgZmxleGJ1ZmZlcnM6OlJlZmVyZW5jZSBmbGV4X2ZsZXhidWZmZXJfcm9vdCgpIGNvbnN0IHsKKyAgICByZXR1cm4gZmxleGJ1ZmZlcnM6OkdldFJvb3QoZmxleCgpLT5EYXRhKCksIGZsZXgoKS0+c2l6ZSgpKTsKKyAgfQorICBjb25zdCBmbGF0YnVmZmVyczo6VmVjdG9yPGNvbnN0IE15R2FtZTo6RXhhbXBsZTo6VGVzdCAqPiAqdGVzdDUoKSBjb25zdCB7CisgICAgcmV0dXJuIEdldFBvaW50ZXI8Y29uc3QgZmxhdGJ1ZmZlcnM6OlZlY3Rvcjxjb25zdCBNeUdhbWU6OkV4YW1wbGU6OlRlc3QgKj4gKj4oVlRfVEVTVDUpOworICB9CisgIGZsYXRidWZmZXJzOjpWZWN0b3I8Y29uc3QgTXlHYW1lOjpFeGFtcGxlOjpUZXN0ICo+ICptdXRhYmxlX3Rlc3Q1KCkgeworICAgIHJldHVybiBHZXRQb2ludGVyPGZsYXRidWZmZXJzOjpWZWN0b3I8Y29uc3QgTXlHYW1lOjpFeGFtcGxlOjpUZXN0ICo+ICo+KFZUX1RFU1Q1KTsKKyAgfQorICBjb25zdCBmbGF0YnVmZmVyczo6VmVjdG9yPGludDY0X3Q+ICp2ZWN0b3Jfb2ZfbG9uZ3MoKSBjb25zdCB7CisgICAgcmV0dXJuIEdldFBvaW50ZXI8Y29uc3QgZmxhdGJ1ZmZlcnM6OlZlY3RvcjxpbnQ2NF90PiAqPihWVF9WRUNUT1JfT0ZfTE9OR1MpOworICB9CisgIGZsYXRidWZmZXJzOjpWZWN0b3I8aW50NjRfdD4gKm11dGFibGVfdmVjdG9yX29mX2xvbmdzKCkgeworICAgIHJldHVybiBHZXRQb2ludGVyPGZsYXRidWZmZXJzOjpWZWN0b3I8aW50NjRfdD4gKj4oVlRfVkVDVE9SX09GX0xPTkdTKTsKKyAgfQorICBjb25zdCBmbGF0YnVmZmVyczo6VmVjdG9yPGRvdWJsZT4gKnZlY3Rvcl9vZl9kb3VibGVzKCkgY29uc3QgeworICAgIHJldHVybiBHZXRQb2ludGVyPGNvbnN0IGZsYXRidWZmZXJzOjpWZWN0b3I8ZG91YmxlPiAqPihWVF9WRUNUT1JfT0ZfRE9VQkxFUyk7CisgIH0KKyAgZmxhdGJ1ZmZlcnM6OlZlY3Rvcjxkb3VibGU+ICptdXRhYmxlX3ZlY3Rvcl9vZl9kb3VibGVzKCkgeworICAgIHJldHVybiBHZXRQb2ludGVyPGZsYXRidWZmZXJzOjpWZWN0b3I8ZG91YmxlPiAqPihWVF9WRUNUT1JfT0ZfRE9VQkxFUyk7CisgIH0KKyAgY29uc3QgTXlHYW1lOjpJblBhcmVudE5hbWVzcGFjZSAqcGFyZW50X25hbWVzcGFjZV90ZXN0KCkgY29uc3QgeworICAgIHJldHVybiBHZXRQb2ludGVyPGNvbnN0IE15R2FtZTo6SW5QYXJlbnROYW1lc3BhY2UgKj4oVlRfUEFSRU5UX05BTUVTUEFDRV9URVNUKTsKKyAgfQorICBNeUdhbWU6OkluUGFyZW50TmFtZXNwYWNlICptdXRhYmxlX3BhcmVudF9uYW1lc3BhY2VfdGVzdCgpIHsKKyAgICByZXR1cm4gR2V0UG9pbnRlcjxNeUdhbWU6OkluUGFyZW50TmFtZXNwYWNlICo+KFZUX1BBUkVOVF9OQU1FU1BBQ0VfVEVTVCk7CisgIH0KKyAgY29uc3QgZmxhdGJ1ZmZlcnM6OlZlY3RvcjxmbGF0YnVmZmVyczo6T2Zmc2V0PE15R2FtZTo6RXhhbXBsZTo6UmVmZXJyYWJsZT4+ICp2ZWN0b3Jfb2ZfcmVmZXJyYWJsZXMoKSBjb25zdCB7CisgICAgcmV0dXJuIEdldFBvaW50ZXI8Y29uc3QgZmxhdGJ1ZmZlcnM6OlZlY3RvcjxmbGF0YnVmZmVyczo6T2Zmc2V0PE15R2FtZTo6RXhhbXBsZTo6UmVmZXJyYWJsZT4+ICo+KFZUX1ZFQ1RPUl9PRl9SRUZFUlJBQkxFUyk7CisgIH0KKyAgZmxhdGJ1ZmZlcnM6OlZlY3RvcjxmbGF0YnVmZmVyczo6T2Zmc2V0PE15R2FtZTo6RXhhbXBsZTo6UmVmZXJyYWJsZT4+ICptdXRhYmxlX3ZlY3Rvcl9vZl9yZWZlcnJhYmxlcygpIHsKKyAgICByZXR1cm4gR2V0UG9pbnRlcjxmbGF0YnVmZmVyczo6VmVjdG9yPGZsYXRidWZmZXJzOjpPZmZzZXQ8TXlHYW1lOjpFeGFtcGxlOjpSZWZlcnJhYmxlPj4gKj4oVlRfVkVDVE9SX09GX1JFRkVSUkFCTEVTKTsKKyAgfQorICB1aW50NjRfdCBzaW5nbGVfd2Vha19yZWZlcmVuY2UoKSBjb25zdCB7CisgICAgcmV0dXJuIEdldEZpZWxkPHVpbnQ2NF90PihWVF9TSU5HTEVfV0VBS19SRUZFUkVOQ0UsIDApOworICB9CisgIGJvb2wgbXV0YXRlX3NpbmdsZV93ZWFrX3JlZmVyZW5jZSh1aW50NjRfdCBfc2luZ2xlX3dlYWtfcmVmZXJlbmNlID0gMCkgeworICAgIHJldHVybiBTZXRGaWVsZDx1aW50NjRfdD4oVlRfU0lOR0xFX1dFQUtfUkVGRVJFTkNFLCBfc2luZ2xlX3dlYWtfcmVmZXJlbmNlLCAwKTsKKyAgfQorICBjb25zdCBmbGF0YnVmZmVyczo6VmVjdG9yPHVpbnQ2NF90PiAqdmVjdG9yX29mX3dlYWtfcmVmZXJlbmNlcygpIGNvbnN0IHsKKyAgICByZXR1cm4gR2V0UG9pbnRlcjxjb25zdCBmbGF0YnVmZmVyczo6VmVjdG9yPHVpbnQ2NF90PiAqPihWVF9WRUNUT1JfT0ZfV0VBS19SRUZFUkVOQ0VTKTsKKyAgfQorICBmbGF0YnVmZmVyczo6VmVjdG9yPHVpbnQ2NF90PiAqbXV0YWJsZV92ZWN0b3Jfb2Zfd2Vha19yZWZlcmVuY2VzKCkgeworICAgIHJldHVybiBHZXRQb2ludGVyPGZsYXRidWZmZXJzOjpWZWN0b3I8dWludDY0X3Q+ICo+KFZUX1ZFQ1RPUl9PRl9XRUFLX1JFRkVSRU5DRVMpOworICB9CisgIGNvbnN0IGZsYXRidWZmZXJzOjpWZWN0b3I8ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxNeUdhbWU6OkV4YW1wbGU6OlJlZmVycmFibGU+PiAqdmVjdG9yX29mX3N0cm9uZ19yZWZlcnJhYmxlcygpIGNvbnN0IHsKKyAgICByZXR1cm4gR2V0UG9pbnRlcjxjb25zdCBmbGF0YnVmZmVyczo6VmVjdG9yPGZsYXRidWZmZXJzOjpPZmZzZXQ8TXlHYW1lOjpFeGFtcGxlOjpSZWZlcnJhYmxlPj4gKj4oVlRfVkVDVE9SX09GX1NUUk9OR19SRUZFUlJBQkxFUyk7CisgIH0KKyAgZmxhdGJ1ZmZlcnM6OlZlY3RvcjxmbGF0YnVmZmVyczo6T2Zmc2V0PE15R2FtZTo6RXhhbXBsZTo6UmVmZXJyYWJsZT4+ICptdXRhYmxlX3ZlY3Rvcl9vZl9zdHJvbmdfcmVmZXJyYWJsZXMoKSB7CisgICAgcmV0dXJuIEdldFBvaW50ZXI8ZmxhdGJ1ZmZlcnM6OlZlY3RvcjxmbGF0YnVmZmVyczo6T2Zmc2V0PE15R2FtZTo6RXhhbXBsZTo6UmVmZXJyYWJsZT4+ICo+KFZUX1ZFQ1RPUl9PRl9TVFJPTkdfUkVGRVJSQUJMRVMpOworICB9CisgIHVpbnQ2NF90IGNvX293bmluZ19yZWZlcmVuY2UoKSBjb25zdCB7CisgICAgcmV0dXJuIEdldEZpZWxkPHVpbnQ2NF90PihWVF9DT19PV05JTkdfUkVGRVJFTkNFLCAwKTsKKyAgfQorICBib29sIG11dGF0ZV9jb19vd25pbmdfcmVmZXJlbmNlKHVpbnQ2NF90IF9jb19vd25pbmdfcmVmZXJlbmNlID0gMCkgeworICAgIHJldHVybiBTZXRGaWVsZDx1aW50NjRfdD4oVlRfQ09fT1dOSU5HX1JFRkVSRU5DRSwgX2NvX293bmluZ19yZWZlcmVuY2UsIDApOworICB9CisgIGNvbnN0IGZsYXRidWZmZXJzOjpWZWN0b3I8dWludDY0X3Q+ICp2ZWN0b3Jfb2ZfY29fb3duaW5nX3JlZmVyZW5jZXMoKSBjb25zdCB7CisgICAgcmV0dXJuIEdldFBvaW50ZXI8Y29uc3QgZmxhdGJ1ZmZlcnM6OlZlY3Rvcjx1aW50NjRfdD4gKj4oVlRfVkVDVE9SX09GX0NPX09XTklOR19SRUZFUkVOQ0VTKTsKKyAgfQorICBmbGF0YnVmZmVyczo6VmVjdG9yPHVpbnQ2NF90PiAqbXV0YWJsZV92ZWN0b3Jfb2ZfY29fb3duaW5nX3JlZmVyZW5jZXMoKSB7CisgICAgcmV0dXJuIEdldFBvaW50ZXI8ZmxhdGJ1ZmZlcnM6OlZlY3Rvcjx1aW50NjRfdD4gKj4oVlRfVkVDVE9SX09GX0NPX09XTklOR19SRUZFUkVOQ0VTKTsKKyAgfQorICB1aW50NjRfdCBub25fb3duaW5nX3JlZmVyZW5jZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gR2V0RmllbGQ8dWludDY0X3Q+KFZUX05PTl9PV05JTkdfUkVGRVJFTkNFLCAwKTsKKyAgfQorICBib29sIG11dGF0ZV9ub25fb3duaW5nX3JlZmVyZW5jZSh1aW50NjRfdCBfbm9uX293bmluZ19yZWZlcmVuY2UgPSAwKSB7CisgICAgcmV0dXJuIFNldEZpZWxkPHVpbnQ2NF90PihWVF9OT05fT1dOSU5HX1JFRkVSRU5DRSwgX25vbl9vd25pbmdfcmVmZXJlbmNlLCAwKTsKKyAgfQorICBjb25zdCBmbGF0YnVmZmVyczo6VmVjdG9yPHVpbnQ2NF90PiAqdmVjdG9yX29mX25vbl9vd25pbmdfcmVmZXJlbmNlcygpIGNvbnN0IHsKKyAgICByZXR1cm4gR2V0UG9pbnRlcjxjb25zdCBmbGF0YnVmZmVyczo6VmVjdG9yPHVpbnQ2NF90PiAqPihWVF9WRUNUT1JfT0ZfTk9OX09XTklOR19SRUZFUkVOQ0VTKTsKKyAgfQorICBmbGF0YnVmZmVyczo6VmVjdG9yPHVpbnQ2NF90PiAqbXV0YWJsZV92ZWN0b3Jfb2Zfbm9uX293bmluZ19yZWZlcmVuY2VzKCkgeworICAgIHJldHVybiBHZXRQb2ludGVyPGZsYXRidWZmZXJzOjpWZWN0b3I8dWludDY0X3Q+ICo+KFZUX1ZFQ1RPUl9PRl9OT05fT1dOSU5HX1JFRkVSRU5DRVMpOworICB9CisgIE15R2FtZTo6RXhhbXBsZTo6QW55VW5pcXVlQWxpYXNlcyBhbnlfdW5pcXVlX3R5cGUoKSBjb25zdCB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PE15R2FtZTo6RXhhbXBsZTo6QW55VW5pcXVlQWxpYXNlcz4oR2V0RmllbGQ8dWludDhfdD4oVlRfQU5ZX1VOSVFVRV9UWVBFLCAwKSk7CisgIH0KKyAgY29uc3Qgdm9pZCAqYW55X3VuaXF1ZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gR2V0UG9pbnRlcjxjb25zdCB2b2lkICo+KFZUX0FOWV9VTklRVUUpOworICB9CisgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+IGNvbnN0IFQgKmFueV91bmlxdWVfYXMoKSBjb25zdDsKKyAgY29uc3QgTXlHYW1lOjpFeGFtcGxlOjpNb25zdGVyICphbnlfdW5pcXVlX2FzX00oKSBjb25zdCB7CisgICAgcmV0dXJuIGFueV91bmlxdWVfdHlwZSgpID09IE15R2FtZTo6RXhhbXBsZTo6QW55VW5pcXVlQWxpYXNlc19NID8gc3RhdGljX2Nhc3Q8Y29uc3QgTXlHYW1lOjpFeGFtcGxlOjpNb25zdGVyICo+KGFueV91bmlxdWUoKSkgOiBudWxscHRyOworICB9CisgIGNvbnN0IE15R2FtZTo6RXhhbXBsZTo6VGVzdFNpbXBsZVRhYmxlV2l0aEVudW0gKmFueV91bmlxdWVfYXNfVFMoKSBjb25zdCB7CisgICAgcmV0dXJuIGFueV91bmlxdWVfdHlwZSgpID09IE15R2FtZTo6RXhhbXBsZTo6QW55VW5pcXVlQWxpYXNlc19UUyA/IHN0YXRpY19jYXN0PGNvbnN0IE15R2FtZTo6RXhhbXBsZTo6VGVzdFNpbXBsZVRhYmxlV2l0aEVudW0gKj4oYW55X3VuaXF1ZSgpKSA6IG51bGxwdHI7CisgIH0KKyAgY29uc3QgTXlHYW1lOjpFeGFtcGxlMjo6TW9uc3RlciAqYW55X3VuaXF1ZV9hc19NMigpIGNvbnN0IHsKKyAgICByZXR1cm4gYW55X3VuaXF1ZV90eXBlKCkgPT0gTXlHYW1lOjpFeGFtcGxlOjpBbnlVbmlxdWVBbGlhc2VzX00yID8gc3RhdGljX2Nhc3Q8Y29uc3QgTXlHYW1lOjpFeGFtcGxlMjo6TW9uc3RlciAqPihhbnlfdW5pcXVlKCkpIDogbnVsbHB0cjsKKyAgfQorICB2b2lkICptdXRhYmxlX2FueV91bmlxdWUoKSB7CisgICAgcmV0dXJuIEdldFBvaW50ZXI8dm9pZCAqPihWVF9BTllfVU5JUVVFKTsKKyAgfQorICBNeUdhbWU6OkV4YW1wbGU6OkFueUFtYmlndW91c0FsaWFzZXMgYW55X2FtYmlndW91c190eXBlKCkgY29uc3QgeworICAgIHJldHVybiBzdGF0aWNfY2FzdDxNeUdhbWU6OkV4YW1wbGU6OkFueUFtYmlndW91c0FsaWFzZXM+KEdldEZpZWxkPHVpbnQ4X3Q+KFZUX0FOWV9BTUJJR1VPVVNfVFlQRSwgMCkpOworICB9CisgIGNvbnN0IHZvaWQgKmFueV9hbWJpZ3VvdXMoKSBjb25zdCB7CisgICAgcmV0dXJuIEdldFBvaW50ZXI8Y29uc3Qgdm9pZCAqPihWVF9BTllfQU1CSUdVT1VTKTsKKyAgfQorICBjb25zdCBNeUdhbWU6OkV4YW1wbGU6Ok1vbnN0ZXIgKmFueV9hbWJpZ3VvdXNfYXNfTTEoKSBjb25zdCB7CisgICAgcmV0dXJuIGFueV9hbWJpZ3VvdXNfdHlwZSgpID09IE15R2FtZTo6RXhhbXBsZTo6QW55QW1iaWd1b3VzQWxpYXNlc19NMSA/IHN0YXRpY19jYXN0PGNvbnN0IE15R2FtZTo6RXhhbXBsZTo6TW9uc3RlciAqPihhbnlfYW1iaWd1b3VzKCkpIDogbnVsbHB0cjsKKyAgfQorICBjb25zdCBNeUdhbWU6OkV4YW1wbGU6Ok1vbnN0ZXIgKmFueV9hbWJpZ3VvdXNfYXNfTTIoKSBjb25zdCB7CisgICAgcmV0dXJuIGFueV9hbWJpZ3VvdXNfdHlwZSgpID09IE15R2FtZTo6RXhhbXBsZTo6QW55QW1iaWd1b3VzQWxpYXNlc19NMiA/IHN0YXRpY19jYXN0PGNvbnN0IE15R2FtZTo6RXhhbXBsZTo6TW9uc3RlciAqPihhbnlfYW1iaWd1b3VzKCkpIDogbnVsbHB0cjsKKyAgfQorICBjb25zdCBNeUdhbWU6OkV4YW1wbGU6Ok1vbnN0ZXIgKmFueV9hbWJpZ3VvdXNfYXNfTTMoKSBjb25zdCB7CisgICAgcmV0dXJuIGFueV9hbWJpZ3VvdXNfdHlwZSgpID09IE15R2FtZTo6RXhhbXBsZTo6QW55QW1iaWd1b3VzQWxpYXNlc19NMyA/IHN0YXRpY19jYXN0PGNvbnN0IE15R2FtZTo6RXhhbXBsZTo6TW9uc3RlciAqPihhbnlfYW1iaWd1b3VzKCkpIDogbnVsbHB0cjsKKyAgfQorICB2b2lkICptdXRhYmxlX2FueV9hbWJpZ3VvdXMoKSB7CisgICAgcmV0dXJuIEdldFBvaW50ZXI8dm9pZCAqPihWVF9BTllfQU1CSUdVT1VTKTsKKyAgfQorICBjb25zdCBmbGF0YnVmZmVyczo6VmVjdG9yPHVpbnQ4X3Q+ICp2ZWN0b3Jfb2ZfZW51bXMoKSBjb25zdCB7CisgICAgcmV0dXJuIEdldFBvaW50ZXI8Y29uc3QgZmxhdGJ1ZmZlcnM6OlZlY3Rvcjx1aW50OF90PiAqPihWVF9WRUNUT1JfT0ZfRU5VTVMpOworICB9CisgIGZsYXRidWZmZXJzOjpWZWN0b3I8dWludDhfdD4gKm11dGFibGVfdmVjdG9yX29mX2VudW1zKCkgeworICAgIHJldHVybiBHZXRQb2ludGVyPGZsYXRidWZmZXJzOjpWZWN0b3I8dWludDhfdD4gKj4oVlRfVkVDVE9SX09GX0VOVU1TKTsKKyAgfQorICBNeUdhbWU6OkV4YW1wbGU6OlJhY2Ugc2lnbmVkX2VudW0oKSBjb25zdCB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PE15R2FtZTo6RXhhbXBsZTo6UmFjZT4oR2V0RmllbGQ8aW50OF90PihWVF9TSUdORURfRU5VTSwgLTEpKTsKKyAgfQorICBib29sIG11dGF0ZV9zaWduZWRfZW51bShNeUdhbWU6OkV4YW1wbGU6OlJhY2UgX3NpZ25lZF9lbnVtID0gc3RhdGljX2Nhc3Q8TXlHYW1lOjpFeGFtcGxlOjpSYWNlPigtMSkpIHsKKyAgICByZXR1cm4gU2V0RmllbGQ8aW50OF90PihWVF9TSUdORURfRU5VTSwgc3RhdGljX2Nhc3Q8aW50OF90Pihfc2lnbmVkX2VudW0pLCAtMSk7CisgIH0KKyAgY29uc3QgZmxhdGJ1ZmZlcnM6OlZlY3Rvcjx1aW50OF90PiAqdGVzdHJlcXVpcmVkbmVzdGVkZmxhdGJ1ZmZlcigpIGNvbnN0IHsKKyAgICByZXR1cm4gR2V0UG9pbnRlcjxjb25zdCBmbGF0YnVmZmVyczo6VmVjdG9yPHVpbnQ4X3Q+ICo+KFZUX1RFU1RSRVFVSVJFRE5FU1RFREZMQVRCVUZGRVIpOworICB9CisgIGZsYXRidWZmZXJzOjpWZWN0b3I8dWludDhfdD4gKm11dGFibGVfdGVzdHJlcXVpcmVkbmVzdGVkZmxhdGJ1ZmZlcigpIHsKKyAgICByZXR1cm4gR2V0UG9pbnRlcjxmbGF0YnVmZmVyczo6VmVjdG9yPHVpbnQ4X3Q+ICo+KFZUX1RFU1RSRVFVSVJFRE5FU1RFREZMQVRCVUZGRVIpOworICB9CisgIGNvbnN0IE15R2FtZTo6RXhhbXBsZTo6TW9uc3RlciAqdGVzdHJlcXVpcmVkbmVzdGVkZmxhdGJ1ZmZlcl9uZXN0ZWRfcm9vdCgpIGNvbnN0IHsKKyAgICByZXR1cm4gZmxhdGJ1ZmZlcnM6OkdldFJvb3Q8TXlHYW1lOjpFeGFtcGxlOjpNb25zdGVyPih0ZXN0cmVxdWlyZWRuZXN0ZWRmbGF0YnVmZmVyKCktPkRhdGEoKSk7CisgIH0KKyAgY29uc3QgZmxhdGJ1ZmZlcnM6OlZlY3RvcjxmbGF0YnVmZmVyczo6T2Zmc2V0PE15R2FtZTo6RXhhbXBsZTo6U3RhdD4+ICpzY2FsYXJfa2V5X3NvcnRlZF90YWJsZXMoKSBjb25zdCB7CisgICAgcmV0dXJuIEdldFBvaW50ZXI8Y29uc3QgZmxhdGJ1ZmZlcnM6OlZlY3RvcjxmbGF0YnVmZmVyczo6T2Zmc2V0PE15R2FtZTo6RXhhbXBsZTo6U3RhdD4+ICo+KFZUX1NDQUxBUl9LRVlfU09SVEVEX1RBQkxFUyk7CisgIH0KKyAgZmxhdGJ1ZmZlcnM6OlZlY3RvcjxmbGF0YnVmZmVyczo6T2Zmc2V0PE15R2FtZTo6RXhhbXBsZTo6U3RhdD4+ICptdXRhYmxlX3NjYWxhcl9rZXlfc29ydGVkX3RhYmxlcygpIHsKKyAgICByZXR1cm4gR2V0UG9pbnRlcjxmbGF0YnVmZmVyczo6VmVjdG9yPGZsYXRidWZmZXJzOjpPZmZzZXQ8TXlHYW1lOjpFeGFtcGxlOjpTdGF0Pj4gKj4oVlRfU0NBTEFSX0tFWV9TT1JURURfVEFCTEVTKTsKKyAgfQorICBjb25zdCBNeUdhbWU6OkV4YW1wbGU6OlRlc3QgKm5hdGl2ZV9pbmxpbmUoKSBjb25zdCB7CisgICAgcmV0dXJuIEdldFN0cnVjdDxjb25zdCBNeUdhbWU6OkV4YW1wbGU6OlRlc3QgKj4oVlRfTkFUSVZFX0lOTElORSk7CisgIH0KKyAgTXlHYW1lOjpFeGFtcGxlOjpUZXN0ICptdXRhYmxlX25hdGl2ZV9pbmxpbmUoKSB7CisgICAgcmV0dXJuIEdldFN0cnVjdDxNeUdhbWU6OkV4YW1wbGU6OlRlc3QgKj4oVlRfTkFUSVZFX0lOTElORSk7CisgIH0KKyAgTXlHYW1lOjpFeGFtcGxlOjpMb25nRW51bSBsb25nX2VudW1fbm9uX2VudW1fZGVmYXVsdCgpIGNvbnN0IHsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8TXlHYW1lOjpFeGFtcGxlOjpMb25nRW51bT4oR2V0RmllbGQ8dWludDY0X3Q+KFZUX0xPTkdfRU5VTV9OT05fRU5VTV9ERUZBVUxULCAwKSk7CisgIH0KKyAgYm9vbCBtdXRhdGVfbG9uZ19lbnVtX25vbl9lbnVtX2RlZmF1bHQoTXlHYW1lOjpFeGFtcGxlOjpMb25nRW51bSBfbG9uZ19lbnVtX25vbl9lbnVtX2RlZmF1bHQgPSBzdGF0aWNfY2FzdDxNeUdhbWU6OkV4YW1wbGU6OkxvbmdFbnVtPigwKSkgeworICAgIHJldHVybiBTZXRGaWVsZDx1aW50NjRfdD4oVlRfTE9OR19FTlVNX05PTl9FTlVNX0RFRkFVTFQsIHN0YXRpY19jYXN0PHVpbnQ2NF90PihfbG9uZ19lbnVtX25vbl9lbnVtX2RlZmF1bHQpLCAwKTsKKyAgfQorICBNeUdhbWU6OkV4YW1wbGU6OkxvbmdFbnVtIGxvbmdfZW51bV9ub3JtYWxfZGVmYXVsdCgpIGNvbnN0IHsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8TXlHYW1lOjpFeGFtcGxlOjpMb25nRW51bT4oR2V0RmllbGQ8dWludDY0X3Q+KFZUX0xPTkdfRU5VTV9OT1JNQUxfREVGQVVMVCwgMlVMTCkpOworICB9CisgIGJvb2wgbXV0YXRlX2xvbmdfZW51bV9ub3JtYWxfZGVmYXVsdChNeUdhbWU6OkV4YW1wbGU6OkxvbmdFbnVtIF9sb25nX2VudW1fbm9ybWFsX2RlZmF1bHQgPSBzdGF0aWNfY2FzdDxNeUdhbWU6OkV4YW1wbGU6OkxvbmdFbnVtPigyVUxMKSkgeworICAgIHJldHVybiBTZXRGaWVsZDx1aW50NjRfdD4oVlRfTE9OR19FTlVNX05PUk1BTF9ERUZBVUxULCBzdGF0aWNfY2FzdDx1aW50NjRfdD4oX2xvbmdfZW51bV9ub3JtYWxfZGVmYXVsdCksIDJVTEwpOworICB9CisgIGJvb2wgVmVyaWZ5KGZsYXRidWZmZXJzOjpWZXJpZmllciAmdmVyaWZpZXIpIGNvbnN0IHsKKyAgICByZXR1cm4gVmVyaWZ5VGFibGVTdGFydCh2ZXJpZmllcikgJiYKKyAgICAgICAgICAgVmVyaWZ5RmllbGQ8TXlHYW1lOjpFeGFtcGxlOjpWZWMzPih2ZXJpZmllciwgVlRfUE9TLCA4KSAmJgorICAgICAgICAgICBWZXJpZnlGaWVsZDxpbnQxNl90Pih2ZXJpZmllciwgVlRfTUFOQSwgMikgJiYKKyAgICAgICAgICAgVmVyaWZ5RmllbGQ8aW50MTZfdD4odmVyaWZpZXIsIFZUX0hQLCAyKSAmJgorICAgICAgICAgICBWZXJpZnlPZmZzZXRSZXF1aXJlZCh2ZXJpZmllciwgVlRfTkFNRSkgJiYKKyAgICAgICAgICAgdmVyaWZpZXIuVmVyaWZ5U3RyaW5nKG5hbWUoKSkgJiYKKyAgICAgICAgICAgVmVyaWZ5T2Zmc2V0KHZlcmlmaWVyLCBWVF9JTlZFTlRPUlkpICYmCisgICAgICAgICAgIHZlcmlmaWVyLlZlcmlmeVZlY3RvcihpbnZlbnRvcnkoKSkgJiYKKyAgICAgICAgICAgVmVyaWZ5RmllbGQ8dWludDhfdD4odmVyaWZpZXIsIFZUX0NPTE9SLCAxKSAmJgorICAgICAgICAgICBWZXJpZnlGaWVsZDx1aW50OF90Pih2ZXJpZmllciwgVlRfVEVTVF9UWVBFLCAxKSAmJgorICAgICAgICAgICBWZXJpZnlPZmZzZXQodmVyaWZpZXIsIFZUX1RFU1QpICYmCisgICAgICAgICAgIFZlcmlmeUFueSh2ZXJpZmllciwgdGVzdCgpLCB0ZXN0X3R5cGUoKSkgJiYKKyAgICAgICAgICAgVmVyaWZ5T2Zmc2V0KHZlcmlmaWVyLCBWVF9URVNUNCkgJiYKKyAgICAgICAgICAgdmVyaWZpZXIuVmVyaWZ5VmVjdG9yKHRlc3Q0KCkpICYmCisgICAgICAgICAgIFZlcmlmeU9mZnNldCh2ZXJpZmllciwgVlRfVEVTVEFSUkFZT0ZTVFJJTkcpICYmCisgICAgICAgICAgIHZlcmlmaWVyLlZlcmlmeVZlY3Rvcih0ZXN0YXJyYXlvZnN0cmluZygpKSAmJgorICAgICAgICAgICB2ZXJpZmllci5WZXJpZnlWZWN0b3JPZlN0cmluZ3ModGVzdGFycmF5b2ZzdHJpbmcoKSkgJiYKKyAgICAgICAgICAgVmVyaWZ5T2Zmc2V0KHZlcmlmaWVyLCBWVF9URVNUQVJSQVlPRlRBQkxFUykgJiYKKyAgICAgICAgICAgdmVyaWZpZXIuVmVyaWZ5VmVjdG9yKHRlc3RhcnJheW9mdGFibGVzKCkpICYmCisgICAgICAgICAgIHZlcmlmaWVyLlZlcmlmeVZlY3Rvck9mVGFibGVzKHRlc3RhcnJheW9mdGFibGVzKCkpICYmCisgICAgICAgICAgIFZlcmlmeU9mZnNldCh2ZXJpZmllciwgVlRfRU5FTVkpICYmCisgICAgICAgICAgIHZlcmlmaWVyLlZlcmlmeVRhYmxlKGVuZW15KCkpICYmCisgICAgICAgICAgIFZlcmlmeU9mZnNldCh2ZXJpZmllciwgVlRfVEVTVE5FU1RFREZMQVRCVUZGRVIpICYmCisgICAgICAgICAgIHZlcmlmaWVyLlZlcmlmeVZlY3Rvcih0ZXN0bmVzdGVkZmxhdGJ1ZmZlcigpKSAmJgorICAgICAgICAgICB2ZXJpZmllci5WZXJpZnlOZXN0ZWRGbGF0QnVmZmVyPE15R2FtZTo6RXhhbXBsZTo6TW9uc3Rlcj4odGVzdG5lc3RlZGZsYXRidWZmZXIoKSwgbnVsbHB0cikgJiYKKyAgICAgICAgICAgVmVyaWZ5T2Zmc2V0KHZlcmlmaWVyLCBWVF9URVNURU1QVFkpICYmCisgICAgICAgICAgIHZlcmlmaWVyLlZlcmlmeVRhYmxlKHRlc3RlbXB0eSgpKSAmJgorICAgICAgICAgICBWZXJpZnlGaWVsZDx1aW50OF90Pih2ZXJpZmllciwgVlRfVEVTVEJPT0wsIDEpICYmCisgICAgICAgICAgIFZlcmlmeUZpZWxkPGludDMyX3Q+KHZlcmlmaWVyLCBWVF9URVNUSEFTSFMzMl9GTlYxLCA0KSAmJgorICAgICAgICAgICBWZXJpZnlGaWVsZDx1aW50MzJfdD4odmVyaWZpZXIsIFZUX1RFU1RIQVNIVTMyX0ZOVjEsIDQpICYmCisgICAgICAgICAgIFZlcmlmeUZpZWxkPGludDY0X3Q+KHZlcmlmaWVyLCBWVF9URVNUSEFTSFM2NF9GTlYxLCA4KSAmJgorICAgICAgICAgICBWZXJpZnlGaWVsZDx1aW50NjRfdD4odmVyaWZpZXIsIFZUX1RFU1RIQVNIVTY0X0ZOVjEsIDgpICYmCisgICAgICAgICAgIFZlcmlmeUZpZWxkPGludDMyX3Q+KHZlcmlmaWVyLCBWVF9URVNUSEFTSFMzMl9GTlYxQSwgNCkgJiYKKyAgICAgICAgICAgVmVyaWZ5RmllbGQ8dWludDMyX3Q+KHZlcmlmaWVyLCBWVF9URVNUSEFTSFUzMl9GTlYxQSwgNCkgJiYKKyAgICAgICAgICAgVmVyaWZ5RmllbGQ8aW50NjRfdD4odmVyaWZpZXIsIFZUX1RFU1RIQVNIUzY0X0ZOVjFBLCA4KSAmJgorICAgICAgICAgICBWZXJpZnlGaWVsZDx1aW50NjRfdD4odmVyaWZpZXIsIFZUX1RFU1RIQVNIVTY0X0ZOVjFBLCA4KSAmJgorICAgICAgICAgICBWZXJpZnlPZmZzZXQodmVyaWZpZXIsIFZUX1RFU1RBUlJBWU9GQk9PTFMpICYmCisgICAgICAgICAgIHZlcmlmaWVyLlZlcmlmeVZlY3Rvcih0ZXN0YXJyYXlvZmJvb2xzKCkpICYmCisgICAgICAgICAgIFZlcmlmeUZpZWxkPGZsb2F0Pih2ZXJpZmllciwgVlRfVEVTVEYsIDQpICYmCisgICAgICAgICAgIFZlcmlmeUZpZWxkPGZsb2F0Pih2ZXJpZmllciwgVlRfVEVTVEYyLCA0KSAmJgorICAgICAgICAgICBWZXJpZnlGaWVsZDxmbG9hdD4odmVyaWZpZXIsIFZUX1RFU1RGMywgNCkgJiYKKyAgICAgICAgICAgVmVyaWZ5T2Zmc2V0KHZlcmlmaWVyLCBWVF9URVNUQVJSQVlPRlNUUklORzIpICYmCisgICAgICAgICAgIHZlcmlmaWVyLlZlcmlmeVZlY3Rvcih0ZXN0YXJyYXlvZnN0cmluZzIoKSkgJiYKKyAgICAgICAgICAgdmVyaWZpZXIuVmVyaWZ5VmVjdG9yT2ZTdHJpbmdzKHRlc3RhcnJheW9mc3RyaW5nMigpKSAmJgorICAgICAgICAgICBWZXJpZnlPZmZzZXQodmVyaWZpZXIsIFZUX1RFU1RBUlJBWU9GU09SVEVEU1RSVUNUKSAmJgorICAgICAgICAgICB2ZXJpZmllci5WZXJpZnlWZWN0b3IodGVzdGFycmF5b2Zzb3J0ZWRzdHJ1Y3QoKSkgJiYKKyAgICAgICAgICAgVmVyaWZ5T2Zmc2V0KHZlcmlmaWVyLCBWVF9GTEVYKSAmJgorICAgICAgICAgICB2ZXJpZmllci5WZXJpZnlWZWN0b3IoZmxleCgpKSAmJgorICAgICAgICAgICBmbGV4YnVmZmVyczo6VmVyaWZ5TmVzdGVkRmxleEJ1ZmZlcihmbGV4KCksIHZlcmlmaWVyKSAmJgorICAgICAgICAgICBWZXJpZnlPZmZzZXQodmVyaWZpZXIsIFZUX1RFU1Q1KSAmJgorICAgICAgICAgICB2ZXJpZmllci5WZXJpZnlWZWN0b3IodGVzdDUoKSkgJiYKKyAgICAgICAgICAgVmVyaWZ5T2Zmc2V0KHZlcmlmaWVyLCBWVF9WRUNUT1JfT0ZfTE9OR1MpICYmCisgICAgICAgICAgIHZlcmlmaWVyLlZlcmlmeVZlY3Rvcih2ZWN0b3Jfb2ZfbG9uZ3MoKSkgJiYKKyAgICAgICAgICAgVmVyaWZ5T2Zmc2V0KHZlcmlmaWVyLCBWVF9WRUNUT1JfT0ZfRE9VQkxFUykgJiYKKyAgICAgICAgICAgdmVyaWZpZXIuVmVyaWZ5VmVjdG9yKHZlY3Rvcl9vZl9kb3VibGVzKCkpICYmCisgICAgICAgICAgIFZlcmlmeU9mZnNldCh2ZXJpZmllciwgVlRfUEFSRU5UX05BTUVTUEFDRV9URVNUKSAmJgorICAgICAgICAgICB2ZXJpZmllci5WZXJpZnlUYWJsZShwYXJlbnRfbmFtZXNwYWNlX3Rlc3QoKSkgJiYKKyAgICAgICAgICAgVmVyaWZ5T2Zmc2V0KHZlcmlmaWVyLCBWVF9WRUNUT1JfT0ZfUkVGRVJSQUJMRVMpICYmCisgICAgICAgICAgIHZlcmlmaWVyLlZlcmlmeVZlY3Rvcih2ZWN0b3Jfb2ZfcmVmZXJyYWJsZXMoKSkgJiYKKyAgICAgICAgICAgdmVyaWZpZXIuVmVyaWZ5VmVjdG9yT2ZUYWJsZXModmVjdG9yX29mX3JlZmVycmFibGVzKCkpICYmCisgICAgICAgICAgIFZlcmlmeUZpZWxkPHVpbnQ2NF90Pih2ZXJpZmllciwgVlRfU0lOR0xFX1dFQUtfUkVGRVJFTkNFLCA4KSAmJgorICAgICAgICAgICBWZXJpZnlPZmZzZXQodmVyaWZpZXIsIFZUX1ZFQ1RPUl9PRl9XRUFLX1JFRkVSRU5DRVMpICYmCisgICAgICAgICAgIHZlcmlmaWVyLlZlcmlmeVZlY3Rvcih2ZWN0b3Jfb2Zfd2Vha19yZWZlcmVuY2VzKCkpICYmCisgICAgICAgICAgIFZlcmlmeU9mZnNldCh2ZXJpZmllciwgVlRfVkVDVE9SX09GX1NUUk9OR19SRUZFUlJBQkxFUykgJiYKKyAgICAgICAgICAgdmVyaWZpZXIuVmVyaWZ5VmVjdG9yKHZlY3Rvcl9vZl9zdHJvbmdfcmVmZXJyYWJsZXMoKSkgJiYKKyAgICAgICAgICAgdmVyaWZpZXIuVmVyaWZ5VmVjdG9yT2ZUYWJsZXModmVjdG9yX29mX3N0cm9uZ19yZWZlcnJhYmxlcygpKSAmJgorICAgICAgICAgICBWZXJpZnlGaWVsZDx1aW50NjRfdD4odmVyaWZpZXIsIFZUX0NPX09XTklOR19SRUZFUkVOQ0UsIDgpICYmCisgICAgICAgICAgIFZlcmlmeU9mZnNldCh2ZXJpZmllciwgVlRfVkVDVE9SX09GX0NPX09XTklOR19SRUZFUkVOQ0VTKSAmJgorICAgICAgICAgICB2ZXJpZmllci5WZXJpZnlWZWN0b3IodmVjdG9yX29mX2NvX293bmluZ19yZWZlcmVuY2VzKCkpICYmCisgICAgICAgICAgIFZlcmlmeUZpZWxkPHVpbnQ2NF90Pih2ZXJpZmllciwgVlRfTk9OX09XTklOR19SRUZFUkVOQ0UsIDgpICYmCisgICAgICAgICAgIFZlcmlmeU9mZnNldCh2ZXJpZmllciwgVlRfVkVDVE9SX09GX05PTl9PV05JTkdfUkVGRVJFTkNFUykgJiYKKyAgICAgICAgICAgdmVyaWZpZXIuVmVyaWZ5VmVjdG9yKHZlY3Rvcl9vZl9ub25fb3duaW5nX3JlZmVyZW5jZXMoKSkgJiYKKyAgICAgICAgICAgVmVyaWZ5RmllbGQ8dWludDhfdD4odmVyaWZpZXIsIFZUX0FOWV9VTklRVUVfVFlQRSwgMSkgJiYKKyAgICAgICAgICAgVmVyaWZ5T2Zmc2V0KHZlcmlmaWVyLCBWVF9BTllfVU5JUVVFKSAmJgorICAgICAgICAgICBWZXJpZnlBbnlVbmlxdWVBbGlhc2VzKHZlcmlmaWVyLCBhbnlfdW5pcXVlKCksIGFueV91bmlxdWVfdHlwZSgpKSAmJgorICAgICAgICAgICBWZXJpZnlGaWVsZDx1aW50OF90Pih2ZXJpZmllciwgVlRfQU5ZX0FNQklHVU9VU19UWVBFLCAxKSAmJgorICAgICAgICAgICBWZXJpZnlPZmZzZXQodmVyaWZpZXIsIFZUX0FOWV9BTUJJR1VPVVMpICYmCisgICAgICAgICAgIFZlcmlmeUFueUFtYmlndW91c0FsaWFzZXModmVyaWZpZXIsIGFueV9hbWJpZ3VvdXMoKSwgYW55X2FtYmlndW91c190eXBlKCkpICYmCisgICAgICAgICAgIFZlcmlmeU9mZnNldCh2ZXJpZmllciwgVlRfVkVDVE9SX09GX0VOVU1TKSAmJgorICAgICAgICAgICB2ZXJpZmllci5WZXJpZnlWZWN0b3IodmVjdG9yX29mX2VudW1zKCkpICYmCisgICAgICAgICAgIFZlcmlmeUZpZWxkPGludDhfdD4odmVyaWZpZXIsIFZUX1NJR05FRF9FTlVNLCAxKSAmJgorICAgICAgICAgICBWZXJpZnlPZmZzZXQodmVyaWZpZXIsIFZUX1RFU1RSRVFVSVJFRE5FU1RFREZMQVRCVUZGRVIpICYmCisgICAgICAgICAgIHZlcmlmaWVyLlZlcmlmeVZlY3Rvcih0ZXN0cmVxdWlyZWRuZXN0ZWRmbGF0YnVmZmVyKCkpICYmCisgICAgICAgICAgIHZlcmlmaWVyLlZlcmlmeU5lc3RlZEZsYXRCdWZmZXI8TXlHYW1lOjpFeGFtcGxlOjpNb25zdGVyPih0ZXN0cmVxdWlyZWRuZXN0ZWRmbGF0YnVmZmVyKCksIG51bGxwdHIpICYmCisgICAgICAgICAgIFZlcmlmeU9mZnNldCh2ZXJpZmllciwgVlRfU0NBTEFSX0tFWV9TT1JURURfVEFCTEVTKSAmJgorICAgICAgICAgICB2ZXJpZmllci5WZXJpZnlWZWN0b3Ioc2NhbGFyX2tleV9zb3J0ZWRfdGFibGVzKCkpICYmCisgICAgICAgICAgIHZlcmlmaWVyLlZlcmlmeVZlY3Rvck9mVGFibGVzKHNjYWxhcl9rZXlfc29ydGVkX3RhYmxlcygpKSAmJgorICAgICAgICAgICBWZXJpZnlGaWVsZDxNeUdhbWU6OkV4YW1wbGU6OlRlc3Q+KHZlcmlmaWVyLCBWVF9OQVRJVkVfSU5MSU5FLCAyKSAmJgorICAgICAgICAgICBWZXJpZnlGaWVsZDx1aW50NjRfdD4odmVyaWZpZXIsIFZUX0xPTkdfRU5VTV9OT05fRU5VTV9ERUZBVUxULCA4KSAmJgorICAgICAgICAgICBWZXJpZnlGaWVsZDx1aW50NjRfdD4odmVyaWZpZXIsIFZUX0xPTkdfRU5VTV9OT1JNQUxfREVGQVVMVCwgOCkgJiYKKyAgICAgICAgICAgdmVyaWZpZXIuRW5kVGFibGUoKTsKKyAgfQorICBNb25zdGVyVCAqVW5QYWNrKGNvbnN0IGZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIgPSBudWxscHRyKSBjb25zdDsKKyAgdm9pZCBVblBhY2tUbyhNb25zdGVyVCAqX28sIGNvbnN0IGZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIgPSBudWxscHRyKSBjb25zdDsKKyAgc3RhdGljIGZsYXRidWZmZXJzOjpPZmZzZXQ8TW9uc3Rlcj4gUGFjayhmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IE1vbnN0ZXJUKiBfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlciA9IG51bGxwdHIpOworfTsKKwordGVtcGxhdGU8PiBpbmxpbmUgY29uc3QgTXlHYW1lOjpFeGFtcGxlOjpNb25zdGVyICpNb25zdGVyOjp0ZXN0X2FzPE15R2FtZTo6RXhhbXBsZTo6TW9uc3Rlcj4oKSBjb25zdCB7CisgIHJldHVybiB0ZXN0X2FzX01vbnN0ZXIoKTsKK30KKwordGVtcGxhdGU8PiBpbmxpbmUgY29uc3QgTXlHYW1lOjpFeGFtcGxlOjpUZXN0U2ltcGxlVGFibGVXaXRoRW51bSAqTW9uc3Rlcjo6dGVzdF9hczxNeUdhbWU6OkV4YW1wbGU6OlRlc3RTaW1wbGVUYWJsZVdpdGhFbnVtPigpIGNvbnN0IHsKKyAgcmV0dXJuIHRlc3RfYXNfVGVzdFNpbXBsZVRhYmxlV2l0aEVudW0oKTsKK30KKwordGVtcGxhdGU8PiBpbmxpbmUgY29uc3QgTXlHYW1lOjpFeGFtcGxlMjo6TW9uc3RlciAqTW9uc3Rlcjo6dGVzdF9hczxNeUdhbWU6OkV4YW1wbGUyOjpNb25zdGVyPigpIGNvbnN0IHsKKyAgcmV0dXJuIHRlc3RfYXNfTXlHYW1lX0V4YW1wbGUyX01vbnN0ZXIoKTsKK30KKwordGVtcGxhdGU8PiBpbmxpbmUgY29uc3QgTXlHYW1lOjpFeGFtcGxlOjpNb25zdGVyICpNb25zdGVyOjphbnlfdW5pcXVlX2FzPE15R2FtZTo6RXhhbXBsZTo6TW9uc3Rlcj4oKSBjb25zdCB7CisgIHJldHVybiBhbnlfdW5pcXVlX2FzX00oKTsKK30KKwordGVtcGxhdGU8PiBpbmxpbmUgY29uc3QgTXlHYW1lOjpFeGFtcGxlOjpUZXN0U2ltcGxlVGFibGVXaXRoRW51bSAqTW9uc3Rlcjo6YW55X3VuaXF1ZV9hczxNeUdhbWU6OkV4YW1wbGU6OlRlc3RTaW1wbGVUYWJsZVdpdGhFbnVtPigpIGNvbnN0IHsKKyAgcmV0dXJuIGFueV91bmlxdWVfYXNfVFMoKTsKK30KKwordGVtcGxhdGU8PiBpbmxpbmUgY29uc3QgTXlHYW1lOjpFeGFtcGxlMjo6TW9uc3RlciAqTW9uc3Rlcjo6YW55X3VuaXF1ZV9hczxNeUdhbWU6OkV4YW1wbGUyOjpNb25zdGVyPigpIGNvbnN0IHsKKyAgcmV0dXJuIGFueV91bmlxdWVfYXNfTTIoKTsKK30KKworc3RydWN0IE1vbnN0ZXJCdWlsZGVyIHsKKyAgdHlwZWRlZiBNb25zdGVyIFRhYmxlOworICBmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJmZiYl87CisgIGZsYXRidWZmZXJzOjp1b2Zmc2V0X3Qgc3RhcnRfOworICB2b2lkIGFkZF9wb3MoY29uc3QgTXlHYW1lOjpFeGFtcGxlOjpWZWMzICpwb3MpIHsKKyAgICBmYmJfLkFkZFN0cnVjdChNb25zdGVyOjpWVF9QT1MsIHBvcyk7CisgIH0KKyAgdm9pZCBhZGRfbWFuYShpbnQxNl90IG1hbmEpIHsKKyAgICBmYmJfLkFkZEVsZW1lbnQ8aW50MTZfdD4oTW9uc3Rlcjo6VlRfTUFOQSwgbWFuYSwgMTUwKTsKKyAgfQorICB2b2lkIGFkZF9ocChpbnQxNl90IGhwKSB7CisgICAgZmJiXy5BZGRFbGVtZW50PGludDE2X3Q+KE1vbnN0ZXI6OlZUX0hQLCBocCwgMTAwKTsKKyAgfQorICB2b2lkIGFkZF9uYW1lKGZsYXRidWZmZXJzOjpPZmZzZXQ8ZmxhdGJ1ZmZlcnM6OlN0cmluZz4gbmFtZSkgeworICAgIGZiYl8uQWRkT2Zmc2V0KE1vbnN0ZXI6OlZUX05BTUUsIG5hbWUpOworICB9CisgIHZvaWQgYWRkX2ludmVudG9yeShmbGF0YnVmZmVyczo6T2Zmc2V0PGZsYXRidWZmZXJzOjpWZWN0b3I8dWludDhfdD4+IGludmVudG9yeSkgeworICAgIGZiYl8uQWRkT2Zmc2V0KE1vbnN0ZXI6OlZUX0lOVkVOVE9SWSwgaW52ZW50b3J5KTsKKyAgfQorICB2b2lkIGFkZF9jb2xvcihNeUdhbWU6OkV4YW1wbGU6OkNvbG9yIGNvbG9yKSB7CisgICAgZmJiXy5BZGRFbGVtZW50PHVpbnQ4X3Q+KE1vbnN0ZXI6OlZUX0NPTE9SLCBzdGF0aWNfY2FzdDx1aW50OF90Pihjb2xvciksIDgpOworICB9CisgIHZvaWQgYWRkX3Rlc3RfdHlwZShNeUdhbWU6OkV4YW1wbGU6OkFueSB0ZXN0X3R5cGUpIHsKKyAgICBmYmJfLkFkZEVsZW1lbnQ8dWludDhfdD4oTW9uc3Rlcjo6VlRfVEVTVF9UWVBFLCBzdGF0aWNfY2FzdDx1aW50OF90Pih0ZXN0X3R5cGUpLCAwKTsKKyAgfQorICB2b2lkIGFkZF90ZXN0KGZsYXRidWZmZXJzOjpPZmZzZXQ8dm9pZD4gdGVzdCkgeworICAgIGZiYl8uQWRkT2Zmc2V0KE1vbnN0ZXI6OlZUX1RFU1QsIHRlc3QpOworICB9CisgIHZvaWQgYWRkX3Rlc3Q0KGZsYXRidWZmZXJzOjpPZmZzZXQ8ZmxhdGJ1ZmZlcnM6OlZlY3Rvcjxjb25zdCBNeUdhbWU6OkV4YW1wbGU6OlRlc3QgKj4+IHRlc3Q0KSB7CisgICAgZmJiXy5BZGRPZmZzZXQoTW9uc3Rlcjo6VlRfVEVTVDQsIHRlc3Q0KTsKKyAgfQorICB2b2lkIGFkZF90ZXN0YXJyYXlvZnN0cmluZyhmbGF0YnVmZmVyczo6T2Zmc2V0PGZsYXRidWZmZXJzOjpWZWN0b3I8ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxmbGF0YnVmZmVyczo6U3RyaW5nPj4+IHRlc3RhcnJheW9mc3RyaW5nKSB7CisgICAgZmJiXy5BZGRPZmZzZXQoTW9uc3Rlcjo6VlRfVEVTVEFSUkFZT0ZTVFJJTkcsIHRlc3RhcnJheW9mc3RyaW5nKTsKKyAgfQorICB2b2lkIGFkZF90ZXN0YXJyYXlvZnRhYmxlcyhmbGF0YnVmZmVyczo6T2Zmc2V0PGZsYXRidWZmZXJzOjpWZWN0b3I8ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxNeUdhbWU6OkV4YW1wbGU6Ok1vbnN0ZXI+Pj4gdGVzdGFycmF5b2Z0YWJsZXMpIHsKKyAgICBmYmJfLkFkZE9mZnNldChNb25zdGVyOjpWVF9URVNUQVJSQVlPRlRBQkxFUywgdGVzdGFycmF5b2Z0YWJsZXMpOworICB9CisgIHZvaWQgYWRkX2VuZW15KGZsYXRidWZmZXJzOjpPZmZzZXQ8TXlHYW1lOjpFeGFtcGxlOjpNb25zdGVyPiBlbmVteSkgeworICAgIGZiYl8uQWRkT2Zmc2V0KE1vbnN0ZXI6OlZUX0VORU1ZLCBlbmVteSk7CisgIH0KKyAgdm9pZCBhZGRfdGVzdG5lc3RlZGZsYXRidWZmZXIoZmxhdGJ1ZmZlcnM6Ok9mZnNldDxmbGF0YnVmZmVyczo6VmVjdG9yPHVpbnQ4X3Q+PiB0ZXN0bmVzdGVkZmxhdGJ1ZmZlcikgeworICAgIGZiYl8uQWRkT2Zmc2V0KE1vbnN0ZXI6OlZUX1RFU1RORVNURURGTEFUQlVGRkVSLCB0ZXN0bmVzdGVkZmxhdGJ1ZmZlcik7CisgIH0KKyAgdm9pZCBhZGRfdGVzdGVtcHR5KGZsYXRidWZmZXJzOjpPZmZzZXQ8TXlHYW1lOjpFeGFtcGxlOjpTdGF0PiB0ZXN0ZW1wdHkpIHsKKyAgICBmYmJfLkFkZE9mZnNldChNb25zdGVyOjpWVF9URVNURU1QVFksIHRlc3RlbXB0eSk7CisgIH0KKyAgdm9pZCBhZGRfdGVzdGJvb2woYm9vbCB0ZXN0Ym9vbCkgeworICAgIGZiYl8uQWRkRWxlbWVudDx1aW50OF90PihNb25zdGVyOjpWVF9URVNUQk9PTCwgc3RhdGljX2Nhc3Q8dWludDhfdD4odGVzdGJvb2wpLCAwKTsKKyAgfQorICB2b2lkIGFkZF90ZXN0aGFzaHMzMl9mbnYxKGludDMyX3QgdGVzdGhhc2hzMzJfZm52MSkgeworICAgIGZiYl8uQWRkRWxlbWVudDxpbnQzMl90PihNb25zdGVyOjpWVF9URVNUSEFTSFMzMl9GTlYxLCB0ZXN0aGFzaHMzMl9mbnYxLCAwKTsKKyAgfQorICB2b2lkIGFkZF90ZXN0aGFzaHUzMl9mbnYxKHVpbnQzMl90IHRlc3RoYXNodTMyX2ZudjEpIHsKKyAgICBmYmJfLkFkZEVsZW1lbnQ8dWludDMyX3Q+KE1vbnN0ZXI6OlZUX1RFU1RIQVNIVTMyX0ZOVjEsIHRlc3RoYXNodTMyX2ZudjEsIDApOworICB9CisgIHZvaWQgYWRkX3Rlc3RoYXNoczY0X2ZudjEoaW50NjRfdCB0ZXN0aGFzaHM2NF9mbnYxKSB7CisgICAgZmJiXy5BZGRFbGVtZW50PGludDY0X3Q+KE1vbnN0ZXI6OlZUX1RFU1RIQVNIUzY0X0ZOVjEsIHRlc3RoYXNoczY0X2ZudjEsIDApOworICB9CisgIHZvaWQgYWRkX3Rlc3RoYXNodTY0X2ZudjEodWludDY0X3QgdGVzdGhhc2h1NjRfZm52MSkgeworICAgIGZiYl8uQWRkRWxlbWVudDx1aW50NjRfdD4oTW9uc3Rlcjo6VlRfVEVTVEhBU0hVNjRfRk5WMSwgdGVzdGhhc2h1NjRfZm52MSwgMCk7CisgIH0KKyAgdm9pZCBhZGRfdGVzdGhhc2hzMzJfZm52MWEoaW50MzJfdCB0ZXN0aGFzaHMzMl9mbnYxYSkgeworICAgIGZiYl8uQWRkRWxlbWVudDxpbnQzMl90PihNb25zdGVyOjpWVF9URVNUSEFTSFMzMl9GTlYxQSwgdGVzdGhhc2hzMzJfZm52MWEsIDApOworICB9CisgIHZvaWQgYWRkX3Rlc3RoYXNodTMyX2ZudjFhKHVpbnQzMl90IHRlc3RoYXNodTMyX2ZudjFhKSB7CisgICAgZmJiXy5BZGRFbGVtZW50PHVpbnQzMl90PihNb25zdGVyOjpWVF9URVNUSEFTSFUzMl9GTlYxQSwgdGVzdGhhc2h1MzJfZm52MWEsIDApOworICB9CisgIHZvaWQgYWRkX3Rlc3RoYXNoczY0X2ZudjFhKGludDY0X3QgdGVzdGhhc2hzNjRfZm52MWEpIHsKKyAgICBmYmJfLkFkZEVsZW1lbnQ8aW50NjRfdD4oTW9uc3Rlcjo6VlRfVEVTVEhBU0hTNjRfRk5WMUEsIHRlc3RoYXNoczY0X2ZudjFhLCAwKTsKKyAgfQorICB2b2lkIGFkZF90ZXN0aGFzaHU2NF9mbnYxYSh1aW50NjRfdCB0ZXN0aGFzaHU2NF9mbnYxYSkgeworICAgIGZiYl8uQWRkRWxlbWVudDx1aW50NjRfdD4oTW9uc3Rlcjo6VlRfVEVTVEhBU0hVNjRfRk5WMUEsIHRlc3RoYXNodTY0X2ZudjFhLCAwKTsKKyAgfQorICB2b2lkIGFkZF90ZXN0YXJyYXlvZmJvb2xzKGZsYXRidWZmZXJzOjpPZmZzZXQ8ZmxhdGJ1ZmZlcnM6OlZlY3Rvcjx1aW50OF90Pj4gdGVzdGFycmF5b2Zib29scykgeworICAgIGZiYl8uQWRkT2Zmc2V0KE1vbnN0ZXI6OlZUX1RFU1RBUlJBWU9GQk9PTFMsIHRlc3RhcnJheW9mYm9vbHMpOworICB9CisgIHZvaWQgYWRkX3Rlc3RmKGZsb2F0IHRlc3RmKSB7CisgICAgZmJiXy5BZGRFbGVtZW50PGZsb2F0PihNb25zdGVyOjpWVF9URVNURiwgdGVzdGYsIDMuMTQxNTlmKTsKKyAgfQorICB2b2lkIGFkZF90ZXN0ZjIoZmxvYXQgdGVzdGYyKSB7CisgICAgZmJiXy5BZGRFbGVtZW50PGZsb2F0PihNb25zdGVyOjpWVF9URVNURjIsIHRlc3RmMiwgMy4wZik7CisgIH0KKyAgdm9pZCBhZGRfdGVzdGYzKGZsb2F0IHRlc3RmMykgeworICAgIGZiYl8uQWRkRWxlbWVudDxmbG9hdD4oTW9uc3Rlcjo6VlRfVEVTVEYzLCB0ZXN0ZjMsIDAuMGYpOworICB9CisgIHZvaWQgYWRkX3Rlc3RhcnJheW9mc3RyaW5nMihmbGF0YnVmZmVyczo6T2Zmc2V0PGZsYXRidWZmZXJzOjpWZWN0b3I8ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxmbGF0YnVmZmVyczo6U3RyaW5nPj4+IHRlc3RhcnJheW9mc3RyaW5nMikgeworICAgIGZiYl8uQWRkT2Zmc2V0KE1vbnN0ZXI6OlZUX1RFU1RBUlJBWU9GU1RSSU5HMiwgdGVzdGFycmF5b2ZzdHJpbmcyKTsKKyAgfQorICB2b2lkIGFkZF90ZXN0YXJyYXlvZnNvcnRlZHN0cnVjdChmbGF0YnVmZmVyczo6T2Zmc2V0PGZsYXRidWZmZXJzOjpWZWN0b3I8Y29uc3QgTXlHYW1lOjpFeGFtcGxlOjpBYmlsaXR5ICo+PiB0ZXN0YXJyYXlvZnNvcnRlZHN0cnVjdCkgeworICAgIGZiYl8uQWRkT2Zmc2V0KE1vbnN0ZXI6OlZUX1RFU1RBUlJBWU9GU09SVEVEU1RSVUNULCB0ZXN0YXJyYXlvZnNvcnRlZHN0cnVjdCk7CisgIH0KKyAgdm9pZCBhZGRfZmxleChmbGF0YnVmZmVyczo6T2Zmc2V0PGZsYXRidWZmZXJzOjpWZWN0b3I8dWludDhfdD4+IGZsZXgpIHsKKyAgICBmYmJfLkFkZE9mZnNldChNb25zdGVyOjpWVF9GTEVYLCBmbGV4KTsKKyAgfQorICB2b2lkIGFkZF90ZXN0NShmbGF0YnVmZmVyczo6T2Zmc2V0PGZsYXRidWZmZXJzOjpWZWN0b3I8Y29uc3QgTXlHYW1lOjpFeGFtcGxlOjpUZXN0ICo+PiB0ZXN0NSkgeworICAgIGZiYl8uQWRkT2Zmc2V0KE1vbnN0ZXI6OlZUX1RFU1Q1LCB0ZXN0NSk7CisgIH0KKyAgdm9pZCBhZGRfdmVjdG9yX29mX2xvbmdzKGZsYXRidWZmZXJzOjpPZmZzZXQ8ZmxhdGJ1ZmZlcnM6OlZlY3RvcjxpbnQ2NF90Pj4gdmVjdG9yX29mX2xvbmdzKSB7CisgICAgZmJiXy5BZGRPZmZzZXQoTW9uc3Rlcjo6VlRfVkVDVE9SX09GX0xPTkdTLCB2ZWN0b3Jfb2ZfbG9uZ3MpOworICB9CisgIHZvaWQgYWRkX3ZlY3Rvcl9vZl9kb3VibGVzKGZsYXRidWZmZXJzOjpPZmZzZXQ8ZmxhdGJ1ZmZlcnM6OlZlY3Rvcjxkb3VibGU+PiB2ZWN0b3Jfb2ZfZG91YmxlcykgeworICAgIGZiYl8uQWRkT2Zmc2V0KE1vbnN0ZXI6OlZUX1ZFQ1RPUl9PRl9ET1VCTEVTLCB2ZWN0b3Jfb2ZfZG91Ymxlcyk7CisgIH0KKyAgdm9pZCBhZGRfcGFyZW50X25hbWVzcGFjZV90ZXN0KGZsYXRidWZmZXJzOjpPZmZzZXQ8TXlHYW1lOjpJblBhcmVudE5hbWVzcGFjZT4gcGFyZW50X25hbWVzcGFjZV90ZXN0KSB7CisgICAgZmJiXy5BZGRPZmZzZXQoTW9uc3Rlcjo6VlRfUEFSRU5UX05BTUVTUEFDRV9URVNULCBwYXJlbnRfbmFtZXNwYWNlX3Rlc3QpOworICB9CisgIHZvaWQgYWRkX3ZlY3Rvcl9vZl9yZWZlcnJhYmxlcyhmbGF0YnVmZmVyczo6T2Zmc2V0PGZsYXRidWZmZXJzOjpWZWN0b3I8ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxNeUdhbWU6OkV4YW1wbGU6OlJlZmVycmFibGU+Pj4gdmVjdG9yX29mX3JlZmVycmFibGVzKSB7CisgICAgZmJiXy5BZGRPZmZzZXQoTW9uc3Rlcjo6VlRfVkVDVE9SX09GX1JFRkVSUkFCTEVTLCB2ZWN0b3Jfb2ZfcmVmZXJyYWJsZXMpOworICB9CisgIHZvaWQgYWRkX3NpbmdsZV93ZWFrX3JlZmVyZW5jZSh1aW50NjRfdCBzaW5nbGVfd2Vha19yZWZlcmVuY2UpIHsKKyAgICBmYmJfLkFkZEVsZW1lbnQ8dWludDY0X3Q+KE1vbnN0ZXI6OlZUX1NJTkdMRV9XRUFLX1JFRkVSRU5DRSwgc2luZ2xlX3dlYWtfcmVmZXJlbmNlLCAwKTsKKyAgfQorICB2b2lkIGFkZF92ZWN0b3Jfb2Zfd2Vha19yZWZlcmVuY2VzKGZsYXRidWZmZXJzOjpPZmZzZXQ8ZmxhdGJ1ZmZlcnM6OlZlY3Rvcjx1aW50NjRfdD4+IHZlY3Rvcl9vZl93ZWFrX3JlZmVyZW5jZXMpIHsKKyAgICBmYmJfLkFkZE9mZnNldChNb25zdGVyOjpWVF9WRUNUT1JfT0ZfV0VBS19SRUZFUkVOQ0VTLCB2ZWN0b3Jfb2Zfd2Vha19yZWZlcmVuY2VzKTsKKyAgfQorICB2b2lkIGFkZF92ZWN0b3Jfb2Zfc3Ryb25nX3JlZmVycmFibGVzKGZsYXRidWZmZXJzOjpPZmZzZXQ8ZmxhdGJ1ZmZlcnM6OlZlY3RvcjxmbGF0YnVmZmVyczo6T2Zmc2V0PE15R2FtZTo6RXhhbXBsZTo6UmVmZXJyYWJsZT4+PiB2ZWN0b3Jfb2Zfc3Ryb25nX3JlZmVycmFibGVzKSB7CisgICAgZmJiXy5BZGRPZmZzZXQoTW9uc3Rlcjo6VlRfVkVDVE9SX09GX1NUUk9OR19SRUZFUlJBQkxFUywgdmVjdG9yX29mX3N0cm9uZ19yZWZlcnJhYmxlcyk7CisgIH0KKyAgdm9pZCBhZGRfY29fb3duaW5nX3JlZmVyZW5jZSh1aW50NjRfdCBjb19vd25pbmdfcmVmZXJlbmNlKSB7CisgICAgZmJiXy5BZGRFbGVtZW50PHVpbnQ2NF90PihNb25zdGVyOjpWVF9DT19PV05JTkdfUkVGRVJFTkNFLCBjb19vd25pbmdfcmVmZXJlbmNlLCAwKTsKKyAgfQorICB2b2lkIGFkZF92ZWN0b3Jfb2ZfY29fb3duaW5nX3JlZmVyZW5jZXMoZmxhdGJ1ZmZlcnM6Ok9mZnNldDxmbGF0YnVmZmVyczo6VmVjdG9yPHVpbnQ2NF90Pj4gdmVjdG9yX29mX2NvX293bmluZ19yZWZlcmVuY2VzKSB7CisgICAgZmJiXy5BZGRPZmZzZXQoTW9uc3Rlcjo6VlRfVkVDVE9SX09GX0NPX09XTklOR19SRUZFUkVOQ0VTLCB2ZWN0b3Jfb2ZfY29fb3duaW5nX3JlZmVyZW5jZXMpOworICB9CisgIHZvaWQgYWRkX25vbl9vd25pbmdfcmVmZXJlbmNlKHVpbnQ2NF90IG5vbl9vd25pbmdfcmVmZXJlbmNlKSB7CisgICAgZmJiXy5BZGRFbGVtZW50PHVpbnQ2NF90PihNb25zdGVyOjpWVF9OT05fT1dOSU5HX1JFRkVSRU5DRSwgbm9uX293bmluZ19yZWZlcmVuY2UsIDApOworICB9CisgIHZvaWQgYWRkX3ZlY3Rvcl9vZl9ub25fb3duaW5nX3JlZmVyZW5jZXMoZmxhdGJ1ZmZlcnM6Ok9mZnNldDxmbGF0YnVmZmVyczo6VmVjdG9yPHVpbnQ2NF90Pj4gdmVjdG9yX29mX25vbl9vd25pbmdfcmVmZXJlbmNlcykgeworICAgIGZiYl8uQWRkT2Zmc2V0KE1vbnN0ZXI6OlZUX1ZFQ1RPUl9PRl9OT05fT1dOSU5HX1JFRkVSRU5DRVMsIHZlY3Rvcl9vZl9ub25fb3duaW5nX3JlZmVyZW5jZXMpOworICB9CisgIHZvaWQgYWRkX2FueV91bmlxdWVfdHlwZShNeUdhbWU6OkV4YW1wbGU6OkFueVVuaXF1ZUFsaWFzZXMgYW55X3VuaXF1ZV90eXBlKSB7CisgICAgZmJiXy5BZGRFbGVtZW50PHVpbnQ4X3Q+KE1vbnN0ZXI6OlZUX0FOWV9VTklRVUVfVFlQRSwgc3RhdGljX2Nhc3Q8dWludDhfdD4oYW55X3VuaXF1ZV90eXBlKSwgMCk7CisgIH0KKyAgdm9pZCBhZGRfYW55X3VuaXF1ZShmbGF0YnVmZmVyczo6T2Zmc2V0PHZvaWQ+IGFueV91bmlxdWUpIHsKKyAgICBmYmJfLkFkZE9mZnNldChNb25zdGVyOjpWVF9BTllfVU5JUVVFLCBhbnlfdW5pcXVlKTsKKyAgfQorICB2b2lkIGFkZF9hbnlfYW1iaWd1b3VzX3R5cGUoTXlHYW1lOjpFeGFtcGxlOjpBbnlBbWJpZ3VvdXNBbGlhc2VzIGFueV9hbWJpZ3VvdXNfdHlwZSkgeworICAgIGZiYl8uQWRkRWxlbWVudDx1aW50OF90PihNb25zdGVyOjpWVF9BTllfQU1CSUdVT1VTX1RZUEUsIHN0YXRpY19jYXN0PHVpbnQ4X3Q+KGFueV9hbWJpZ3VvdXNfdHlwZSksIDApOworICB9CisgIHZvaWQgYWRkX2FueV9hbWJpZ3VvdXMoZmxhdGJ1ZmZlcnM6Ok9mZnNldDx2b2lkPiBhbnlfYW1iaWd1b3VzKSB7CisgICAgZmJiXy5BZGRPZmZzZXQoTW9uc3Rlcjo6VlRfQU5ZX0FNQklHVU9VUywgYW55X2FtYmlndW91cyk7CisgIH0KKyAgdm9pZCBhZGRfdmVjdG9yX29mX2VudW1zKGZsYXRidWZmZXJzOjpPZmZzZXQ8ZmxhdGJ1ZmZlcnM6OlZlY3Rvcjx1aW50OF90Pj4gdmVjdG9yX29mX2VudW1zKSB7CisgICAgZmJiXy5BZGRPZmZzZXQoTW9uc3Rlcjo6VlRfVkVDVE9SX09GX0VOVU1TLCB2ZWN0b3Jfb2ZfZW51bXMpOworICB9CisgIHZvaWQgYWRkX3NpZ25lZF9lbnVtKE15R2FtZTo6RXhhbXBsZTo6UmFjZSBzaWduZWRfZW51bSkgeworICAgIGZiYl8uQWRkRWxlbWVudDxpbnQ4X3Q+KE1vbnN0ZXI6OlZUX1NJR05FRF9FTlVNLCBzdGF0aWNfY2FzdDxpbnQ4X3Q+KHNpZ25lZF9lbnVtKSwgLTEpOworICB9CisgIHZvaWQgYWRkX3Rlc3RyZXF1aXJlZG5lc3RlZGZsYXRidWZmZXIoZmxhdGJ1ZmZlcnM6Ok9mZnNldDxmbGF0YnVmZmVyczo6VmVjdG9yPHVpbnQ4X3Q+PiB0ZXN0cmVxdWlyZWRuZXN0ZWRmbGF0YnVmZmVyKSB7CisgICAgZmJiXy5BZGRPZmZzZXQoTW9uc3Rlcjo6VlRfVEVTVFJFUVVJUkVETkVTVEVERkxBVEJVRkZFUiwgdGVzdHJlcXVpcmVkbmVzdGVkZmxhdGJ1ZmZlcik7CisgIH0KKyAgdm9pZCBhZGRfc2NhbGFyX2tleV9zb3J0ZWRfdGFibGVzKGZsYXRidWZmZXJzOjpPZmZzZXQ8ZmxhdGJ1ZmZlcnM6OlZlY3RvcjxmbGF0YnVmZmVyczo6T2Zmc2V0PE15R2FtZTo6RXhhbXBsZTo6U3RhdD4+PiBzY2FsYXJfa2V5X3NvcnRlZF90YWJsZXMpIHsKKyAgICBmYmJfLkFkZE9mZnNldChNb25zdGVyOjpWVF9TQ0FMQVJfS0VZX1NPUlRFRF9UQUJMRVMsIHNjYWxhcl9rZXlfc29ydGVkX3RhYmxlcyk7CisgIH0KKyAgdm9pZCBhZGRfbmF0aXZlX2lubGluZShjb25zdCBNeUdhbWU6OkV4YW1wbGU6OlRlc3QgKm5hdGl2ZV9pbmxpbmUpIHsKKyAgICBmYmJfLkFkZFN0cnVjdChNb25zdGVyOjpWVF9OQVRJVkVfSU5MSU5FLCBuYXRpdmVfaW5saW5lKTsKKyAgfQorICB2b2lkIGFkZF9sb25nX2VudW1fbm9uX2VudW1fZGVmYXVsdChNeUdhbWU6OkV4YW1wbGU6OkxvbmdFbnVtIGxvbmdfZW51bV9ub25fZW51bV9kZWZhdWx0KSB7CisgICAgZmJiXy5BZGRFbGVtZW50PHVpbnQ2NF90PihNb25zdGVyOjpWVF9MT05HX0VOVU1fTk9OX0VOVU1fREVGQVVMVCwgc3RhdGljX2Nhc3Q8dWludDY0X3Q+KGxvbmdfZW51bV9ub25fZW51bV9kZWZhdWx0KSwgMCk7CisgIH0KKyAgdm9pZCBhZGRfbG9uZ19lbnVtX25vcm1hbF9kZWZhdWx0KE15R2FtZTo6RXhhbXBsZTo6TG9uZ0VudW0gbG9uZ19lbnVtX25vcm1hbF9kZWZhdWx0KSB7CisgICAgZmJiXy5BZGRFbGVtZW50PHVpbnQ2NF90PihNb25zdGVyOjpWVF9MT05HX0VOVU1fTk9STUFMX0RFRkFVTFQsIHN0YXRpY19jYXN0PHVpbnQ2NF90Pihsb25nX2VudW1fbm9ybWFsX2RlZmF1bHQpLCAyVUxMKTsKKyAgfQorICBleHBsaWNpdCBNb25zdGVyQnVpbGRlcihmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIpCisgICAgICAgIDogZmJiXyhfZmJiKSB7CisgICAgc3RhcnRfID0gZmJiXy5TdGFydFRhYmxlKCk7CisgIH0KKyAgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxNb25zdGVyPiBGaW5pc2goKSB7CisgICAgY29uc3QgYXV0byBlbmQgPSBmYmJfLkVuZFRhYmxlKHN0YXJ0Xyk7CisgICAgYXV0byBvID0gZmxhdGJ1ZmZlcnM6Ok9mZnNldDxNb25zdGVyPihlbmQpOworICAgIGZiYl8uUmVxdWlyZWQobywgTW9uc3Rlcjo6VlRfTkFNRSk7CisgICAgcmV0dXJuIG87CisgIH0KK307CisKK2lubGluZSBmbGF0YnVmZmVyczo6T2Zmc2V0PE1vbnN0ZXI+IENyZWF0ZU1vbnN0ZXIoCisgICAgZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLAorICAgIGNvbnN0IE15R2FtZTo6RXhhbXBsZTo6VmVjMyAqcG9zID0gbnVsbHB0ciwKKyAgICBpbnQxNl90IG1hbmEgPSAxNTAsCisgICAgaW50MTZfdCBocCA9IDEwMCwKKyAgICBmbGF0YnVmZmVyczo6T2Zmc2V0PGZsYXRidWZmZXJzOjpTdHJpbmc+IG5hbWUgPSAwLAorICAgIGZsYXRidWZmZXJzOjpPZmZzZXQ8ZmxhdGJ1ZmZlcnM6OlZlY3Rvcjx1aW50OF90Pj4gaW52ZW50b3J5ID0gMCwKKyAgICBNeUdhbWU6OkV4YW1wbGU6OkNvbG9yIGNvbG9yID0gTXlHYW1lOjpFeGFtcGxlOjpDb2xvcl9CbHVlLAorICAgIE15R2FtZTo6RXhhbXBsZTo6QW55IHRlc3RfdHlwZSA9IE15R2FtZTo6RXhhbXBsZTo6QW55X05PTkUsCisgICAgZmxhdGJ1ZmZlcnM6Ok9mZnNldDx2b2lkPiB0ZXN0ID0gMCwKKyAgICBmbGF0YnVmZmVyczo6T2Zmc2V0PGZsYXRidWZmZXJzOjpWZWN0b3I8Y29uc3QgTXlHYW1lOjpFeGFtcGxlOjpUZXN0ICo+PiB0ZXN0NCA9IDAsCisgICAgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxmbGF0YnVmZmVyczo6VmVjdG9yPGZsYXRidWZmZXJzOjpPZmZzZXQ8ZmxhdGJ1ZmZlcnM6OlN0cmluZz4+PiB0ZXN0YXJyYXlvZnN0cmluZyA9IDAsCisgICAgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxmbGF0YnVmZmVyczo6VmVjdG9yPGZsYXRidWZmZXJzOjpPZmZzZXQ8TXlHYW1lOjpFeGFtcGxlOjpNb25zdGVyPj4+IHRlc3RhcnJheW9mdGFibGVzID0gMCwKKyAgICBmbGF0YnVmZmVyczo6T2Zmc2V0PE15R2FtZTo6RXhhbXBsZTo6TW9uc3Rlcj4gZW5lbXkgPSAwLAorICAgIGZsYXRidWZmZXJzOjpPZmZzZXQ8ZmxhdGJ1ZmZlcnM6OlZlY3Rvcjx1aW50OF90Pj4gdGVzdG5lc3RlZGZsYXRidWZmZXIgPSAwLAorICAgIGZsYXRidWZmZXJzOjpPZmZzZXQ8TXlHYW1lOjpFeGFtcGxlOjpTdGF0PiB0ZXN0ZW1wdHkgPSAwLAorICAgIGJvb2wgdGVzdGJvb2wgPSBmYWxzZSwKKyAgICBpbnQzMl90IHRlc3RoYXNoczMyX2ZudjEgPSAwLAorICAgIHVpbnQzMl90IHRlc3RoYXNodTMyX2ZudjEgPSAwLAorICAgIGludDY0X3QgdGVzdGhhc2hzNjRfZm52MSA9IDAsCisgICAgdWludDY0X3QgdGVzdGhhc2h1NjRfZm52MSA9IDAsCisgICAgaW50MzJfdCB0ZXN0aGFzaHMzMl9mbnYxYSA9IDAsCisgICAgdWludDMyX3QgdGVzdGhhc2h1MzJfZm52MWEgPSAwLAorICAgIGludDY0X3QgdGVzdGhhc2hzNjRfZm52MWEgPSAwLAorICAgIHVpbnQ2NF90IHRlc3RoYXNodTY0X2ZudjFhID0gMCwKKyAgICBmbGF0YnVmZmVyczo6T2Zmc2V0PGZsYXRidWZmZXJzOjpWZWN0b3I8dWludDhfdD4+IHRlc3RhcnJheW9mYm9vbHMgPSAwLAorICAgIGZsb2F0IHRlc3RmID0gMy4xNDE1OWYsCisgICAgZmxvYXQgdGVzdGYyID0gMy4wZiwKKyAgICBmbG9hdCB0ZXN0ZjMgPSAwLjBmLAorICAgIGZsYXRidWZmZXJzOjpPZmZzZXQ8ZmxhdGJ1ZmZlcnM6OlZlY3RvcjxmbGF0YnVmZmVyczo6T2Zmc2V0PGZsYXRidWZmZXJzOjpTdHJpbmc+Pj4gdGVzdGFycmF5b2ZzdHJpbmcyID0gMCwKKyAgICBmbGF0YnVmZmVyczo6T2Zmc2V0PGZsYXRidWZmZXJzOjpWZWN0b3I8Y29uc3QgTXlHYW1lOjpFeGFtcGxlOjpBYmlsaXR5ICo+PiB0ZXN0YXJyYXlvZnNvcnRlZHN0cnVjdCA9IDAsCisgICAgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxmbGF0YnVmZmVyczo6VmVjdG9yPHVpbnQ4X3Q+PiBmbGV4ID0gMCwKKyAgICBmbGF0YnVmZmVyczo6T2Zmc2V0PGZsYXRidWZmZXJzOjpWZWN0b3I8Y29uc3QgTXlHYW1lOjpFeGFtcGxlOjpUZXN0ICo+PiB0ZXN0NSA9IDAsCisgICAgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxmbGF0YnVmZmVyczo6VmVjdG9yPGludDY0X3Q+PiB2ZWN0b3Jfb2ZfbG9uZ3MgPSAwLAorICAgIGZsYXRidWZmZXJzOjpPZmZzZXQ8ZmxhdGJ1ZmZlcnM6OlZlY3Rvcjxkb3VibGU+PiB2ZWN0b3Jfb2ZfZG91YmxlcyA9IDAsCisgICAgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxNeUdhbWU6OkluUGFyZW50TmFtZXNwYWNlPiBwYXJlbnRfbmFtZXNwYWNlX3Rlc3QgPSAwLAorICAgIGZsYXRidWZmZXJzOjpPZmZzZXQ8ZmxhdGJ1ZmZlcnM6OlZlY3RvcjxmbGF0YnVmZmVyczo6T2Zmc2V0PE15R2FtZTo6RXhhbXBsZTo6UmVmZXJyYWJsZT4+PiB2ZWN0b3Jfb2ZfcmVmZXJyYWJsZXMgPSAwLAorICAgIHVpbnQ2NF90IHNpbmdsZV93ZWFrX3JlZmVyZW5jZSA9IDAsCisgICAgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxmbGF0YnVmZmVyczo6VmVjdG9yPHVpbnQ2NF90Pj4gdmVjdG9yX29mX3dlYWtfcmVmZXJlbmNlcyA9IDAsCisgICAgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxmbGF0YnVmZmVyczo6VmVjdG9yPGZsYXRidWZmZXJzOjpPZmZzZXQ8TXlHYW1lOjpFeGFtcGxlOjpSZWZlcnJhYmxlPj4+IHZlY3Rvcl9vZl9zdHJvbmdfcmVmZXJyYWJsZXMgPSAwLAorICAgIHVpbnQ2NF90IGNvX293bmluZ19yZWZlcmVuY2UgPSAwLAorICAgIGZsYXRidWZmZXJzOjpPZmZzZXQ8ZmxhdGJ1ZmZlcnM6OlZlY3Rvcjx1aW50NjRfdD4+IHZlY3Rvcl9vZl9jb19vd25pbmdfcmVmZXJlbmNlcyA9IDAsCisgICAgdWludDY0X3Qgbm9uX293bmluZ19yZWZlcmVuY2UgPSAwLAorICAgIGZsYXRidWZmZXJzOjpPZmZzZXQ8ZmxhdGJ1ZmZlcnM6OlZlY3Rvcjx1aW50NjRfdD4+IHZlY3Rvcl9vZl9ub25fb3duaW5nX3JlZmVyZW5jZXMgPSAwLAorICAgIE15R2FtZTo6RXhhbXBsZTo6QW55VW5pcXVlQWxpYXNlcyBhbnlfdW5pcXVlX3R5cGUgPSBNeUdhbWU6OkV4YW1wbGU6OkFueVVuaXF1ZUFsaWFzZXNfTk9ORSwKKyAgICBmbGF0YnVmZmVyczo6T2Zmc2V0PHZvaWQ+IGFueV91bmlxdWUgPSAwLAorICAgIE15R2FtZTo6RXhhbXBsZTo6QW55QW1iaWd1b3VzQWxpYXNlcyBhbnlfYW1iaWd1b3VzX3R5cGUgPSBNeUdhbWU6OkV4YW1wbGU6OkFueUFtYmlndW91c0FsaWFzZXNfTk9ORSwKKyAgICBmbGF0YnVmZmVyczo6T2Zmc2V0PHZvaWQ+IGFueV9hbWJpZ3VvdXMgPSAwLAorICAgIGZsYXRidWZmZXJzOjpPZmZzZXQ8ZmxhdGJ1ZmZlcnM6OlZlY3Rvcjx1aW50OF90Pj4gdmVjdG9yX29mX2VudW1zID0gMCwKKyAgICBNeUdhbWU6OkV4YW1wbGU6OlJhY2Ugc2lnbmVkX2VudW0gPSBNeUdhbWU6OkV4YW1wbGU6OlJhY2VfTm9uZSwKKyAgICBmbGF0YnVmZmVyczo6T2Zmc2V0PGZsYXRidWZmZXJzOjpWZWN0b3I8dWludDhfdD4+IHRlc3RyZXF1aXJlZG5lc3RlZGZsYXRidWZmZXIgPSAwLAorICAgIGZsYXRidWZmZXJzOjpPZmZzZXQ8ZmxhdGJ1ZmZlcnM6OlZlY3RvcjxmbGF0YnVmZmVyczo6T2Zmc2V0PE15R2FtZTo6RXhhbXBsZTo6U3RhdD4+PiBzY2FsYXJfa2V5X3NvcnRlZF90YWJsZXMgPSAwLAorICAgIGNvbnN0IE15R2FtZTo6RXhhbXBsZTo6VGVzdCAqbmF0aXZlX2lubGluZSA9IG51bGxwdHIsCisgICAgTXlHYW1lOjpFeGFtcGxlOjpMb25nRW51bSBsb25nX2VudW1fbm9uX2VudW1fZGVmYXVsdCA9IHN0YXRpY19jYXN0PE15R2FtZTo6RXhhbXBsZTo6TG9uZ0VudW0+KDApLAorICAgIE15R2FtZTo6RXhhbXBsZTo6TG9uZ0VudW0gbG9uZ19lbnVtX25vcm1hbF9kZWZhdWx0ID0gTXlHYW1lOjpFeGFtcGxlOjpMb25nRW51bV9Mb25nT25lKSB7CisgIE1vbnN0ZXJCdWlsZGVyIGJ1aWxkZXJfKF9mYmIpOworICBidWlsZGVyXy5hZGRfbG9uZ19lbnVtX25vcm1hbF9kZWZhdWx0KGxvbmdfZW51bV9ub3JtYWxfZGVmYXVsdCk7CisgIGJ1aWxkZXJfLmFkZF9sb25nX2VudW1fbm9uX2VudW1fZGVmYXVsdChsb25nX2VudW1fbm9uX2VudW1fZGVmYXVsdCk7CisgIGJ1aWxkZXJfLmFkZF9ub25fb3duaW5nX3JlZmVyZW5jZShub25fb3duaW5nX3JlZmVyZW5jZSk7CisgIGJ1aWxkZXJfLmFkZF9jb19vd25pbmdfcmVmZXJlbmNlKGNvX293bmluZ19yZWZlcmVuY2UpOworICBidWlsZGVyXy5hZGRfc2luZ2xlX3dlYWtfcmVmZXJlbmNlKHNpbmdsZV93ZWFrX3JlZmVyZW5jZSk7CisgIGJ1aWxkZXJfLmFkZF90ZXN0aGFzaHU2NF9mbnYxYSh0ZXN0aGFzaHU2NF9mbnYxYSk7CisgIGJ1aWxkZXJfLmFkZF90ZXN0aGFzaHM2NF9mbnYxYSh0ZXN0aGFzaHM2NF9mbnYxYSk7CisgIGJ1aWxkZXJfLmFkZF90ZXN0aGFzaHU2NF9mbnYxKHRlc3RoYXNodTY0X2ZudjEpOworICBidWlsZGVyXy5hZGRfdGVzdGhhc2hzNjRfZm52MSh0ZXN0aGFzaHM2NF9mbnYxKTsKKyAgYnVpbGRlcl8uYWRkX25hdGl2ZV9pbmxpbmUobmF0aXZlX2lubGluZSk7CisgIGJ1aWxkZXJfLmFkZF9zY2FsYXJfa2V5X3NvcnRlZF90YWJsZXMoc2NhbGFyX2tleV9zb3J0ZWRfdGFibGVzKTsKKyAgYnVpbGRlcl8uYWRkX3Rlc3RyZXF1aXJlZG5lc3RlZGZsYXRidWZmZXIodGVzdHJlcXVpcmVkbmVzdGVkZmxhdGJ1ZmZlcik7CisgIGJ1aWxkZXJfLmFkZF92ZWN0b3Jfb2ZfZW51bXModmVjdG9yX29mX2VudW1zKTsKKyAgYnVpbGRlcl8uYWRkX2FueV9hbWJpZ3VvdXMoYW55X2FtYmlndW91cyk7CisgIGJ1aWxkZXJfLmFkZF9hbnlfdW5pcXVlKGFueV91bmlxdWUpOworICBidWlsZGVyXy5hZGRfdmVjdG9yX29mX25vbl9vd25pbmdfcmVmZXJlbmNlcyh2ZWN0b3Jfb2Zfbm9uX293bmluZ19yZWZlcmVuY2VzKTsKKyAgYnVpbGRlcl8uYWRkX3ZlY3Rvcl9vZl9jb19vd25pbmdfcmVmZXJlbmNlcyh2ZWN0b3Jfb2ZfY29fb3duaW5nX3JlZmVyZW5jZXMpOworICBidWlsZGVyXy5hZGRfdmVjdG9yX29mX3N0cm9uZ19yZWZlcnJhYmxlcyh2ZWN0b3Jfb2Zfc3Ryb25nX3JlZmVycmFibGVzKTsKKyAgYnVpbGRlcl8uYWRkX3ZlY3Rvcl9vZl93ZWFrX3JlZmVyZW5jZXModmVjdG9yX29mX3dlYWtfcmVmZXJlbmNlcyk7CisgIGJ1aWxkZXJfLmFkZF92ZWN0b3Jfb2ZfcmVmZXJyYWJsZXModmVjdG9yX29mX3JlZmVycmFibGVzKTsKKyAgYnVpbGRlcl8uYWRkX3BhcmVudF9uYW1lc3BhY2VfdGVzdChwYXJlbnRfbmFtZXNwYWNlX3Rlc3QpOworICBidWlsZGVyXy5hZGRfdmVjdG9yX29mX2RvdWJsZXModmVjdG9yX29mX2RvdWJsZXMpOworICBidWlsZGVyXy5hZGRfdmVjdG9yX29mX2xvbmdzKHZlY3Rvcl9vZl9sb25ncyk7CisgIGJ1aWxkZXJfLmFkZF90ZXN0NSh0ZXN0NSk7CisgIGJ1aWxkZXJfLmFkZF9mbGV4KGZsZXgpOworICBidWlsZGVyXy5hZGRfdGVzdGFycmF5b2Zzb3J0ZWRzdHJ1Y3QodGVzdGFycmF5b2Zzb3J0ZWRzdHJ1Y3QpOworICBidWlsZGVyXy5hZGRfdGVzdGFycmF5b2ZzdHJpbmcyKHRlc3RhcnJheW9mc3RyaW5nMik7CisgIGJ1aWxkZXJfLmFkZF90ZXN0ZjModGVzdGYzKTsKKyAgYnVpbGRlcl8uYWRkX3Rlc3RmMih0ZXN0ZjIpOworICBidWlsZGVyXy5hZGRfdGVzdGYodGVzdGYpOworICBidWlsZGVyXy5hZGRfdGVzdGFycmF5b2Zib29scyh0ZXN0YXJyYXlvZmJvb2xzKTsKKyAgYnVpbGRlcl8uYWRkX3Rlc3RoYXNodTMyX2ZudjFhKHRlc3RoYXNodTMyX2ZudjFhKTsKKyAgYnVpbGRlcl8uYWRkX3Rlc3RoYXNoczMyX2ZudjFhKHRlc3RoYXNoczMyX2ZudjFhKTsKKyAgYnVpbGRlcl8uYWRkX3Rlc3RoYXNodTMyX2ZudjEodGVzdGhhc2h1MzJfZm52MSk7CisgIGJ1aWxkZXJfLmFkZF90ZXN0aGFzaHMzMl9mbnYxKHRlc3RoYXNoczMyX2ZudjEpOworICBidWlsZGVyXy5hZGRfdGVzdGVtcHR5KHRlc3RlbXB0eSk7CisgIGJ1aWxkZXJfLmFkZF90ZXN0bmVzdGVkZmxhdGJ1ZmZlcih0ZXN0bmVzdGVkZmxhdGJ1ZmZlcik7CisgIGJ1aWxkZXJfLmFkZF9lbmVteShlbmVteSk7CisgIGJ1aWxkZXJfLmFkZF90ZXN0YXJyYXlvZnRhYmxlcyh0ZXN0YXJyYXlvZnRhYmxlcyk7CisgIGJ1aWxkZXJfLmFkZF90ZXN0YXJyYXlvZnN0cmluZyh0ZXN0YXJyYXlvZnN0cmluZyk7CisgIGJ1aWxkZXJfLmFkZF90ZXN0NCh0ZXN0NCk7CisgIGJ1aWxkZXJfLmFkZF90ZXN0KHRlc3QpOworICBidWlsZGVyXy5hZGRfaW52ZW50b3J5KGludmVudG9yeSk7CisgIGJ1aWxkZXJfLmFkZF9uYW1lKG5hbWUpOworICBidWlsZGVyXy5hZGRfcG9zKHBvcyk7CisgIGJ1aWxkZXJfLmFkZF9ocChocCk7CisgIGJ1aWxkZXJfLmFkZF9tYW5hKG1hbmEpOworICBidWlsZGVyXy5hZGRfc2lnbmVkX2VudW0oc2lnbmVkX2VudW0pOworICBidWlsZGVyXy5hZGRfYW55X2FtYmlndW91c190eXBlKGFueV9hbWJpZ3VvdXNfdHlwZSk7CisgIGJ1aWxkZXJfLmFkZF9hbnlfdW5pcXVlX3R5cGUoYW55X3VuaXF1ZV90eXBlKTsKKyAgYnVpbGRlcl8uYWRkX3Rlc3Rib29sKHRlc3Rib29sKTsKKyAgYnVpbGRlcl8uYWRkX3Rlc3RfdHlwZSh0ZXN0X3R5cGUpOworICBidWlsZGVyXy5hZGRfY29sb3IoY29sb3IpOworICByZXR1cm4gYnVpbGRlcl8uRmluaXNoKCk7Cit9CisKK2lubGluZSBmbGF0YnVmZmVyczo6T2Zmc2V0PE1vbnN0ZXI+IENyZWF0ZU1vbnN0ZXJEaXJlY3QoCisgICAgZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLAorICAgIGNvbnN0IE15R2FtZTo6RXhhbXBsZTo6VmVjMyAqcG9zID0gbnVsbHB0ciwKKyAgICBpbnQxNl90IG1hbmEgPSAxNTAsCisgICAgaW50MTZfdCBocCA9IDEwMCwKKyAgICBjb25zdCBjaGFyICpuYW1lID0gbnVsbHB0ciwKKyAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiAqaW52ZW50b3J5ID0gbnVsbHB0ciwKKyAgICBNeUdhbWU6OkV4YW1wbGU6OkNvbG9yIGNvbG9yID0gTXlHYW1lOjpFeGFtcGxlOjpDb2xvcl9CbHVlLAorICAgIE15R2FtZTo6RXhhbXBsZTo6QW55IHRlc3RfdHlwZSA9IE15R2FtZTo6RXhhbXBsZTo6QW55X05PTkUsCisgICAgZmxhdGJ1ZmZlcnM6Ok9mZnNldDx2b2lkPiB0ZXN0ID0gMCwKKyAgICBjb25zdCBzdGQ6OnZlY3RvcjxNeUdhbWU6OkV4YW1wbGU6OlRlc3Q+ICp0ZXN0NCA9IG51bGxwdHIsCisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxmbGF0YnVmZmVyczo6U3RyaW5nPj4gKnRlc3RhcnJheW9mc3RyaW5nID0gbnVsbHB0ciwKKyAgICBzdGQ6OnZlY3RvcjxmbGF0YnVmZmVyczo6T2Zmc2V0PE15R2FtZTo6RXhhbXBsZTo6TW9uc3Rlcj4+ICp0ZXN0YXJyYXlvZnRhYmxlcyA9IG51bGxwdHIsCisgICAgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxNeUdhbWU6OkV4YW1wbGU6Ok1vbnN0ZXI+IGVuZW15ID0gMCwKKyAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiAqdGVzdG5lc3RlZGZsYXRidWZmZXIgPSBudWxscHRyLAorICAgIGZsYXRidWZmZXJzOjpPZmZzZXQ8TXlHYW1lOjpFeGFtcGxlOjpTdGF0PiB0ZXN0ZW1wdHkgPSAwLAorICAgIGJvb2wgdGVzdGJvb2wgPSBmYWxzZSwKKyAgICBpbnQzMl90IHRlc3RoYXNoczMyX2ZudjEgPSAwLAorICAgIHVpbnQzMl90IHRlc3RoYXNodTMyX2ZudjEgPSAwLAorICAgIGludDY0X3QgdGVzdGhhc2hzNjRfZm52MSA9IDAsCisgICAgdWludDY0X3QgdGVzdGhhc2h1NjRfZm52MSA9IDAsCisgICAgaW50MzJfdCB0ZXN0aGFzaHMzMl9mbnYxYSA9IDAsCisgICAgdWludDMyX3QgdGVzdGhhc2h1MzJfZm52MWEgPSAwLAorICAgIGludDY0X3QgdGVzdGhhc2hzNjRfZm52MWEgPSAwLAorICAgIHVpbnQ2NF90IHRlc3RoYXNodTY0X2ZudjFhID0gMCwKKyAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiAqdGVzdGFycmF5b2Zib29scyA9IG51bGxwdHIsCisgICAgZmxvYXQgdGVzdGYgPSAzLjE0MTU5ZiwKKyAgICBmbG9hdCB0ZXN0ZjIgPSAzLjBmLAorICAgIGZsb2F0IHRlc3RmMyA9IDAuMGYsCisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxmbGF0YnVmZmVyczo6U3RyaW5nPj4gKnRlc3RhcnJheW9mc3RyaW5nMiA9IG51bGxwdHIsCisgICAgc3RkOjp2ZWN0b3I8TXlHYW1lOjpFeGFtcGxlOjpBYmlsaXR5PiAqdGVzdGFycmF5b2Zzb3J0ZWRzdHJ1Y3QgPSBudWxscHRyLAorICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+ICpmbGV4ID0gbnVsbHB0ciwKKyAgICBjb25zdCBzdGQ6OnZlY3RvcjxNeUdhbWU6OkV4YW1wbGU6OlRlc3Q+ICp0ZXN0NSA9IG51bGxwdHIsCisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8aW50NjRfdD4gKnZlY3Rvcl9vZl9sb25ncyA9IG51bGxwdHIsCisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8ZG91YmxlPiAqdmVjdG9yX29mX2RvdWJsZXMgPSBudWxscHRyLAorICAgIGZsYXRidWZmZXJzOjpPZmZzZXQ8TXlHYW1lOjpJblBhcmVudE5hbWVzcGFjZT4gcGFyZW50X25hbWVzcGFjZV90ZXN0ID0gMCwKKyAgICBzdGQ6OnZlY3RvcjxmbGF0YnVmZmVyczo6T2Zmc2V0PE15R2FtZTo6RXhhbXBsZTo6UmVmZXJyYWJsZT4+ICp2ZWN0b3Jfb2ZfcmVmZXJyYWJsZXMgPSBudWxscHRyLAorICAgIHVpbnQ2NF90IHNpbmdsZV93ZWFrX3JlZmVyZW5jZSA9IDAsCisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDY0X3Q+ICp2ZWN0b3Jfb2Zfd2Vha19yZWZlcmVuY2VzID0gbnVsbHB0ciwKKyAgICBzdGQ6OnZlY3RvcjxmbGF0YnVmZmVyczo6T2Zmc2V0PE15R2FtZTo6RXhhbXBsZTo6UmVmZXJyYWJsZT4+ICp2ZWN0b3Jfb2Zfc3Ryb25nX3JlZmVycmFibGVzID0gbnVsbHB0ciwKKyAgICB1aW50NjRfdCBjb19vd25pbmdfcmVmZXJlbmNlID0gMCwKKyAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50NjRfdD4gKnZlY3Rvcl9vZl9jb19vd25pbmdfcmVmZXJlbmNlcyA9IG51bGxwdHIsCisgICAgdWludDY0X3Qgbm9uX293bmluZ19yZWZlcmVuY2UgPSAwLAorICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ2NF90PiAqdmVjdG9yX29mX25vbl9vd25pbmdfcmVmZXJlbmNlcyA9IG51bGxwdHIsCisgICAgTXlHYW1lOjpFeGFtcGxlOjpBbnlVbmlxdWVBbGlhc2VzIGFueV91bmlxdWVfdHlwZSA9IE15R2FtZTo6RXhhbXBsZTo6QW55VW5pcXVlQWxpYXNlc19OT05FLAorICAgIGZsYXRidWZmZXJzOjpPZmZzZXQ8dm9pZD4gYW55X3VuaXF1ZSA9IDAsCisgICAgTXlHYW1lOjpFeGFtcGxlOjpBbnlBbWJpZ3VvdXNBbGlhc2VzIGFueV9hbWJpZ3VvdXNfdHlwZSA9IE15R2FtZTo6RXhhbXBsZTo6QW55QW1iaWd1b3VzQWxpYXNlc19OT05FLAorICAgIGZsYXRidWZmZXJzOjpPZmZzZXQ8dm9pZD4gYW55X2FtYmlndW91cyA9IDAsCisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4gKnZlY3Rvcl9vZl9lbnVtcyA9IG51bGxwdHIsCisgICAgTXlHYW1lOjpFeGFtcGxlOjpSYWNlIHNpZ25lZF9lbnVtID0gTXlHYW1lOjpFeGFtcGxlOjpSYWNlX05vbmUsCisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4gKnRlc3RyZXF1aXJlZG5lc3RlZGZsYXRidWZmZXIgPSBudWxscHRyLAorICAgIHN0ZDo6dmVjdG9yPGZsYXRidWZmZXJzOjpPZmZzZXQ8TXlHYW1lOjpFeGFtcGxlOjpTdGF0Pj4gKnNjYWxhcl9rZXlfc29ydGVkX3RhYmxlcyA9IG51bGxwdHIsCisgICAgY29uc3QgTXlHYW1lOjpFeGFtcGxlOjpUZXN0ICpuYXRpdmVfaW5saW5lID0gbnVsbHB0ciwKKyAgICBNeUdhbWU6OkV4YW1wbGU6OkxvbmdFbnVtIGxvbmdfZW51bV9ub25fZW51bV9kZWZhdWx0ID0gc3RhdGljX2Nhc3Q8TXlHYW1lOjpFeGFtcGxlOjpMb25nRW51bT4oMCksCisgICAgTXlHYW1lOjpFeGFtcGxlOjpMb25nRW51bSBsb25nX2VudW1fbm9ybWFsX2RlZmF1bHQgPSBNeUdhbWU6OkV4YW1wbGU6OkxvbmdFbnVtX0xvbmdPbmUpIHsKKyAgYXV0byBuYW1lX18gPSBuYW1lID8gX2ZiYi5DcmVhdGVTdHJpbmcobmFtZSkgOiAwOworICBhdXRvIGludmVudG9yeV9fID0gaW52ZW50b3J5ID8gX2ZiYi5DcmVhdGVWZWN0b3I8dWludDhfdD4oKmludmVudG9yeSkgOiAwOworICBhdXRvIHRlc3Q0X18gPSB0ZXN0NCA/IF9mYmIuQ3JlYXRlVmVjdG9yT2ZTdHJ1Y3RzPE15R2FtZTo6RXhhbXBsZTo6VGVzdD4oKnRlc3Q0KSA6IDA7CisgIGF1dG8gdGVzdGFycmF5b2ZzdHJpbmdfXyA9IHRlc3RhcnJheW9mc3RyaW5nID8gX2ZiYi5DcmVhdGVWZWN0b3I8ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxmbGF0YnVmZmVyczo6U3RyaW5nPj4oKnRlc3RhcnJheW9mc3RyaW5nKSA6IDA7CisgIGF1dG8gdGVzdGFycmF5b2Z0YWJsZXNfXyA9IHRlc3RhcnJheW9mdGFibGVzID8gX2ZiYi5DcmVhdGVWZWN0b3JPZlNvcnRlZFRhYmxlczxNeUdhbWU6OkV4YW1wbGU6Ok1vbnN0ZXI+KHRlc3RhcnJheW9mdGFibGVzKSA6IDA7CisgIGF1dG8gdGVzdG5lc3RlZGZsYXRidWZmZXJfXyA9IHRlc3RuZXN0ZWRmbGF0YnVmZmVyID8gX2ZiYi5DcmVhdGVWZWN0b3I8dWludDhfdD4oKnRlc3RuZXN0ZWRmbGF0YnVmZmVyKSA6IDA7CisgIGF1dG8gdGVzdGFycmF5b2Zib29sc19fID0gdGVzdGFycmF5b2Zib29scyA/IF9mYmIuQ3JlYXRlVmVjdG9yPHVpbnQ4X3Q+KCp0ZXN0YXJyYXlvZmJvb2xzKSA6IDA7CisgIGF1dG8gdGVzdGFycmF5b2ZzdHJpbmcyX18gPSB0ZXN0YXJyYXlvZnN0cmluZzIgPyBfZmJiLkNyZWF0ZVZlY3RvcjxmbGF0YnVmZmVyczo6T2Zmc2V0PGZsYXRidWZmZXJzOjpTdHJpbmc+PigqdGVzdGFycmF5b2ZzdHJpbmcyKSA6IDA7CisgIGF1dG8gdGVzdGFycmF5b2Zzb3J0ZWRzdHJ1Y3RfXyA9IHRlc3RhcnJheW9mc29ydGVkc3RydWN0ID8gX2ZiYi5DcmVhdGVWZWN0b3JPZlNvcnRlZFN0cnVjdHM8TXlHYW1lOjpFeGFtcGxlOjpBYmlsaXR5Pih0ZXN0YXJyYXlvZnNvcnRlZHN0cnVjdCkgOiAwOworICBhdXRvIGZsZXhfXyA9IGZsZXggPyBfZmJiLkNyZWF0ZVZlY3Rvcjx1aW50OF90PigqZmxleCkgOiAwOworICBhdXRvIHRlc3Q1X18gPSB0ZXN0NSA/IF9mYmIuQ3JlYXRlVmVjdG9yT2ZTdHJ1Y3RzPE15R2FtZTo6RXhhbXBsZTo6VGVzdD4oKnRlc3Q1KSA6IDA7CisgIGF1dG8gdmVjdG9yX29mX2xvbmdzX18gPSB2ZWN0b3Jfb2ZfbG9uZ3MgPyBfZmJiLkNyZWF0ZVZlY3RvcjxpbnQ2NF90PigqdmVjdG9yX29mX2xvbmdzKSA6IDA7CisgIGF1dG8gdmVjdG9yX29mX2RvdWJsZXNfXyA9IHZlY3Rvcl9vZl9kb3VibGVzID8gX2ZiYi5DcmVhdGVWZWN0b3I8ZG91YmxlPigqdmVjdG9yX29mX2RvdWJsZXMpIDogMDsKKyAgYXV0byB2ZWN0b3Jfb2ZfcmVmZXJyYWJsZXNfXyA9IHZlY3Rvcl9vZl9yZWZlcnJhYmxlcyA/IF9mYmIuQ3JlYXRlVmVjdG9yT2ZTb3J0ZWRUYWJsZXM8TXlHYW1lOjpFeGFtcGxlOjpSZWZlcnJhYmxlPih2ZWN0b3Jfb2ZfcmVmZXJyYWJsZXMpIDogMDsKKyAgYXV0byB2ZWN0b3Jfb2Zfd2Vha19yZWZlcmVuY2VzX18gPSB2ZWN0b3Jfb2Zfd2Vha19yZWZlcmVuY2VzID8gX2ZiYi5DcmVhdGVWZWN0b3I8dWludDY0X3Q+KCp2ZWN0b3Jfb2Zfd2Vha19yZWZlcmVuY2VzKSA6IDA7CisgIGF1dG8gdmVjdG9yX29mX3N0cm9uZ19yZWZlcnJhYmxlc19fID0gdmVjdG9yX29mX3N0cm9uZ19yZWZlcnJhYmxlcyA/IF9mYmIuQ3JlYXRlVmVjdG9yT2ZTb3J0ZWRUYWJsZXM8TXlHYW1lOjpFeGFtcGxlOjpSZWZlcnJhYmxlPih2ZWN0b3Jfb2Zfc3Ryb25nX3JlZmVycmFibGVzKSA6IDA7CisgIGF1dG8gdmVjdG9yX29mX2NvX293bmluZ19yZWZlcmVuY2VzX18gPSB2ZWN0b3Jfb2ZfY29fb3duaW5nX3JlZmVyZW5jZXMgPyBfZmJiLkNyZWF0ZVZlY3Rvcjx1aW50NjRfdD4oKnZlY3Rvcl9vZl9jb19vd25pbmdfcmVmZXJlbmNlcykgOiAwOworICBhdXRvIHZlY3Rvcl9vZl9ub25fb3duaW5nX3JlZmVyZW5jZXNfXyA9IHZlY3Rvcl9vZl9ub25fb3duaW5nX3JlZmVyZW5jZXMgPyBfZmJiLkNyZWF0ZVZlY3Rvcjx1aW50NjRfdD4oKnZlY3Rvcl9vZl9ub25fb3duaW5nX3JlZmVyZW5jZXMpIDogMDsKKyAgYXV0byB2ZWN0b3Jfb2ZfZW51bXNfXyA9IHZlY3Rvcl9vZl9lbnVtcyA/IF9mYmIuQ3JlYXRlVmVjdG9yPHVpbnQ4X3Q+KCp2ZWN0b3Jfb2ZfZW51bXMpIDogMDsKKyAgYXV0byB0ZXN0cmVxdWlyZWRuZXN0ZWRmbGF0YnVmZmVyX18gPSB0ZXN0cmVxdWlyZWRuZXN0ZWRmbGF0YnVmZmVyID8gX2ZiYi5DcmVhdGVWZWN0b3I8dWludDhfdD4oKnRlc3RyZXF1aXJlZG5lc3RlZGZsYXRidWZmZXIpIDogMDsKKyAgYXV0byBzY2FsYXJfa2V5X3NvcnRlZF90YWJsZXNfXyA9IHNjYWxhcl9rZXlfc29ydGVkX3RhYmxlcyA/IF9mYmIuQ3JlYXRlVmVjdG9yT2ZTb3J0ZWRUYWJsZXM8TXlHYW1lOjpFeGFtcGxlOjpTdGF0PihzY2FsYXJfa2V5X3NvcnRlZF90YWJsZXMpIDogMDsKKyAgcmV0dXJuIE15R2FtZTo6RXhhbXBsZTo6Q3JlYXRlTW9uc3RlcigKKyAgICAgIF9mYmIsCisgICAgICBwb3MsCisgICAgICBtYW5hLAorICAgICAgaHAsCisgICAgICBuYW1lX18sCisgICAgICBpbnZlbnRvcnlfXywKKyAgICAgIGNvbG9yLAorICAgICAgdGVzdF90eXBlLAorICAgICAgdGVzdCwKKyAgICAgIHRlc3Q0X18sCisgICAgICB0ZXN0YXJyYXlvZnN0cmluZ19fLAorICAgICAgdGVzdGFycmF5b2Z0YWJsZXNfXywKKyAgICAgIGVuZW15LAorICAgICAgdGVzdG5lc3RlZGZsYXRidWZmZXJfXywKKyAgICAgIHRlc3RlbXB0eSwKKyAgICAgIHRlc3Rib29sLAorICAgICAgdGVzdGhhc2hzMzJfZm52MSwKKyAgICAgIHRlc3RoYXNodTMyX2ZudjEsCisgICAgICB0ZXN0aGFzaHM2NF9mbnYxLAorICAgICAgdGVzdGhhc2h1NjRfZm52MSwKKyAgICAgIHRlc3RoYXNoczMyX2ZudjFhLAorICAgICAgdGVzdGhhc2h1MzJfZm52MWEsCisgICAgICB0ZXN0aGFzaHM2NF9mbnYxYSwKKyAgICAgIHRlc3RoYXNodTY0X2ZudjFhLAorICAgICAgdGVzdGFycmF5b2Zib29sc19fLAorICAgICAgdGVzdGYsCisgICAgICB0ZXN0ZjIsCisgICAgICB0ZXN0ZjMsCisgICAgICB0ZXN0YXJyYXlvZnN0cmluZzJfXywKKyAgICAgIHRlc3RhcnJheW9mc29ydGVkc3RydWN0X18sCisgICAgICBmbGV4X18sCisgICAgICB0ZXN0NV9fLAorICAgICAgdmVjdG9yX29mX2xvbmdzX18sCisgICAgICB2ZWN0b3Jfb2ZfZG91Ymxlc19fLAorICAgICAgcGFyZW50X25hbWVzcGFjZV90ZXN0LAorICAgICAgdmVjdG9yX29mX3JlZmVycmFibGVzX18sCisgICAgICBzaW5nbGVfd2Vha19yZWZlcmVuY2UsCisgICAgICB2ZWN0b3Jfb2Zfd2Vha19yZWZlcmVuY2VzX18sCisgICAgICB2ZWN0b3Jfb2Zfc3Ryb25nX3JlZmVycmFibGVzX18sCisgICAgICBjb19vd25pbmdfcmVmZXJlbmNlLAorICAgICAgdmVjdG9yX29mX2NvX293bmluZ19yZWZlcmVuY2VzX18sCisgICAgICBub25fb3duaW5nX3JlZmVyZW5jZSwKKyAgICAgIHZlY3Rvcl9vZl9ub25fb3duaW5nX3JlZmVyZW5jZXNfXywKKyAgICAgIGFueV91bmlxdWVfdHlwZSwKKyAgICAgIGFueV91bmlxdWUsCisgICAgICBhbnlfYW1iaWd1b3VzX3R5cGUsCisgICAgICBhbnlfYW1iaWd1b3VzLAorICAgICAgdmVjdG9yX29mX2VudW1zX18sCisgICAgICBzaWduZWRfZW51bSwKKyAgICAgIHRlc3RyZXF1aXJlZG5lc3RlZGZsYXRidWZmZXJfXywKKyAgICAgIHNjYWxhcl9rZXlfc29ydGVkX3RhYmxlc19fLAorICAgICAgbmF0aXZlX2lubGluZSwKKyAgICAgIGxvbmdfZW51bV9ub25fZW51bV9kZWZhdWx0LAorICAgICAgbG9uZ19lbnVtX25vcm1hbF9kZWZhdWx0KTsKK30KKworZmxhdGJ1ZmZlcnM6Ok9mZnNldDxNb25zdGVyPiBDcmVhdGVNb25zdGVyKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgTW9uc3RlclQgKl9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyID0gbnVsbHB0cik7CisKK3N0cnVjdCBUeXBlQWxpYXNlc1QgOiBwdWJsaWMgZmxhdGJ1ZmZlcnM6Ok5hdGl2ZVRhYmxlIHsKKyAgdHlwZWRlZiBUeXBlQWxpYXNlcyBUYWJsZVR5cGU7CisgIGludDhfdCBpOCA9IDA7CisgIHVpbnQ4X3QgdTggPSAwOworICBpbnQxNl90IGkxNiA9IDA7CisgIHVpbnQxNl90IHUxNiA9IDA7CisgIGludDMyX3QgaTMyID0gMDsKKyAgdWludDMyX3QgdTMyID0gMDsKKyAgaW50NjRfdCBpNjQgPSAwOworICB1aW50NjRfdCB1NjQgPSAwOworICBmbG9hdCBmMzIgPSAwLjBmOworICBkb3VibGUgZjY0ID0gMC4wOworICBzdGQ6OnZlY3RvcjxpbnQ4X3Q+IHY4e307CisgIHN0ZDo6dmVjdG9yPGRvdWJsZT4gdmY2NHt9OworfTsKKworc3RydWN0IFR5cGVBbGlhc2VzIEZMQVRCVUZGRVJTX0ZJTkFMX0NMQVNTIDogcHJpdmF0ZSBmbGF0YnVmZmVyczo6VGFibGUgeworICB0eXBlZGVmIFR5cGVBbGlhc2VzVCBOYXRpdmVUYWJsZVR5cGU7CisgIHR5cGVkZWYgVHlwZUFsaWFzZXNCdWlsZGVyIEJ1aWxkZXI7CisgIHN0YXRpYyBjb25zdCBmbGF0YnVmZmVyczo6VHlwZVRhYmxlICpNaW5pUmVmbGVjdFR5cGVUYWJsZSgpIHsKKyAgICByZXR1cm4gVHlwZUFsaWFzZXNUeXBlVGFibGUoKTsKKyAgfQorICBlbnVtIEZsYXRCdWZmZXJzVlRhYmxlT2Zmc2V0IEZMQVRCVUZGRVJTX1ZUQUJMRV9VTkRFUkxZSU5HX1RZUEUgeworICAgIFZUX0k4ID0gNCwKKyAgICBWVF9VOCA9IDYsCisgICAgVlRfSTE2ID0gOCwKKyAgICBWVF9VMTYgPSAxMCwKKyAgICBWVF9JMzIgPSAxMiwKKyAgICBWVF9VMzIgPSAxNCwKKyAgICBWVF9JNjQgPSAxNiwKKyAgICBWVF9VNjQgPSAxOCwKKyAgICBWVF9GMzIgPSAyMCwKKyAgICBWVF9GNjQgPSAyMiwKKyAgICBWVF9WOCA9IDI0LAorICAgIFZUX1ZGNjQgPSAyNgorICB9OworICBpbnQ4X3QgaTgoKSBjb25zdCB7CisgICAgcmV0dXJuIEdldEZpZWxkPGludDhfdD4oVlRfSTgsIDApOworICB9CisgIGJvb2wgbXV0YXRlX2k4KGludDhfdCBfaTggPSAwKSB7CisgICAgcmV0dXJuIFNldEZpZWxkPGludDhfdD4oVlRfSTgsIF9pOCwgMCk7CisgIH0KKyAgdWludDhfdCB1OCgpIGNvbnN0IHsKKyAgICByZXR1cm4gR2V0RmllbGQ8dWludDhfdD4oVlRfVTgsIDApOworICB9CisgIGJvb2wgbXV0YXRlX3U4KHVpbnQ4X3QgX3U4ID0gMCkgeworICAgIHJldHVybiBTZXRGaWVsZDx1aW50OF90PihWVF9VOCwgX3U4LCAwKTsKKyAgfQorICBpbnQxNl90IGkxNigpIGNvbnN0IHsKKyAgICByZXR1cm4gR2V0RmllbGQ8aW50MTZfdD4oVlRfSTE2LCAwKTsKKyAgfQorICBib29sIG11dGF0ZV9pMTYoaW50MTZfdCBfaTE2ID0gMCkgeworICAgIHJldHVybiBTZXRGaWVsZDxpbnQxNl90PihWVF9JMTYsIF9pMTYsIDApOworICB9CisgIHVpbnQxNl90IHUxNigpIGNvbnN0IHsKKyAgICByZXR1cm4gR2V0RmllbGQ8dWludDE2X3Q+KFZUX1UxNiwgMCk7CisgIH0KKyAgYm9vbCBtdXRhdGVfdTE2KHVpbnQxNl90IF91MTYgPSAwKSB7CisgICAgcmV0dXJuIFNldEZpZWxkPHVpbnQxNl90PihWVF9VMTYsIF91MTYsIDApOworICB9CisgIGludDMyX3QgaTMyKCkgY29uc3QgeworICAgIHJldHVybiBHZXRGaWVsZDxpbnQzMl90PihWVF9JMzIsIDApOworICB9CisgIGJvb2wgbXV0YXRlX2kzMihpbnQzMl90IF9pMzIgPSAwKSB7CisgICAgcmV0dXJuIFNldEZpZWxkPGludDMyX3Q+KFZUX0kzMiwgX2kzMiwgMCk7CisgIH0KKyAgdWludDMyX3QgdTMyKCkgY29uc3QgeworICAgIHJldHVybiBHZXRGaWVsZDx1aW50MzJfdD4oVlRfVTMyLCAwKTsKKyAgfQorICBib29sIG11dGF0ZV91MzIodWludDMyX3QgX3UzMiA9IDApIHsKKyAgICByZXR1cm4gU2V0RmllbGQ8dWludDMyX3Q+KFZUX1UzMiwgX3UzMiwgMCk7CisgIH0KKyAgaW50NjRfdCBpNjQoKSBjb25zdCB7CisgICAgcmV0dXJuIEdldEZpZWxkPGludDY0X3Q+KFZUX0k2NCwgMCk7CisgIH0KKyAgYm9vbCBtdXRhdGVfaTY0KGludDY0X3QgX2k2NCA9IDApIHsKKyAgICByZXR1cm4gU2V0RmllbGQ8aW50NjRfdD4oVlRfSTY0LCBfaTY0LCAwKTsKKyAgfQorICB1aW50NjRfdCB1NjQoKSBjb25zdCB7CisgICAgcmV0dXJuIEdldEZpZWxkPHVpbnQ2NF90PihWVF9VNjQsIDApOworICB9CisgIGJvb2wgbXV0YXRlX3U2NCh1aW50NjRfdCBfdTY0ID0gMCkgeworICAgIHJldHVybiBTZXRGaWVsZDx1aW50NjRfdD4oVlRfVTY0LCBfdTY0LCAwKTsKKyAgfQorICBmbG9hdCBmMzIoKSBjb25zdCB7CisgICAgcmV0dXJuIEdldEZpZWxkPGZsb2F0PihWVF9GMzIsIDAuMGYpOworICB9CisgIGJvb2wgbXV0YXRlX2YzMihmbG9hdCBfZjMyID0gMC4wZikgeworICAgIHJldHVybiBTZXRGaWVsZDxmbG9hdD4oVlRfRjMyLCBfZjMyLCAwLjBmKTsKKyAgfQorICBkb3VibGUgZjY0KCkgY29uc3QgeworICAgIHJldHVybiBHZXRGaWVsZDxkb3VibGU+KFZUX0Y2NCwgMC4wKTsKKyAgfQorICBib29sIG11dGF0ZV9mNjQoZG91YmxlIF9mNjQgPSAwLjApIHsKKyAgICByZXR1cm4gU2V0RmllbGQ8ZG91YmxlPihWVF9GNjQsIF9mNjQsIDAuMCk7CisgIH0KKyAgY29uc3QgZmxhdGJ1ZmZlcnM6OlZlY3RvcjxpbnQ4X3Q+ICp2OCgpIGNvbnN0IHsKKyAgICByZXR1cm4gR2V0UG9pbnRlcjxjb25zdCBmbGF0YnVmZmVyczo6VmVjdG9yPGludDhfdD4gKj4oVlRfVjgpOworICB9CisgIGZsYXRidWZmZXJzOjpWZWN0b3I8aW50OF90PiAqbXV0YWJsZV92OCgpIHsKKyAgICByZXR1cm4gR2V0UG9pbnRlcjxmbGF0YnVmZmVyczo6VmVjdG9yPGludDhfdD4gKj4oVlRfVjgpOworICB9CisgIGNvbnN0IGZsYXRidWZmZXJzOjpWZWN0b3I8ZG91YmxlPiAqdmY2NCgpIGNvbnN0IHsKKyAgICByZXR1cm4gR2V0UG9pbnRlcjxjb25zdCBmbGF0YnVmZmVyczo6VmVjdG9yPGRvdWJsZT4gKj4oVlRfVkY2NCk7CisgIH0KKyAgZmxhdGJ1ZmZlcnM6OlZlY3Rvcjxkb3VibGU+ICptdXRhYmxlX3ZmNjQoKSB7CisgICAgcmV0dXJuIEdldFBvaW50ZXI8ZmxhdGJ1ZmZlcnM6OlZlY3Rvcjxkb3VibGU+ICo+KFZUX1ZGNjQpOworICB9CisgIGJvb2wgVmVyaWZ5KGZsYXRidWZmZXJzOjpWZXJpZmllciAmdmVyaWZpZXIpIGNvbnN0IHsKKyAgICByZXR1cm4gVmVyaWZ5VGFibGVTdGFydCh2ZXJpZmllcikgJiYKKyAgICAgICAgICAgVmVyaWZ5RmllbGQ8aW50OF90Pih2ZXJpZmllciwgVlRfSTgsIDEpICYmCisgICAgICAgICAgIFZlcmlmeUZpZWxkPHVpbnQ4X3Q+KHZlcmlmaWVyLCBWVF9VOCwgMSkgJiYKKyAgICAgICAgICAgVmVyaWZ5RmllbGQ8aW50MTZfdD4odmVyaWZpZXIsIFZUX0kxNiwgMikgJiYKKyAgICAgICAgICAgVmVyaWZ5RmllbGQ8dWludDE2X3Q+KHZlcmlmaWVyLCBWVF9VMTYsIDIpICYmCisgICAgICAgICAgIFZlcmlmeUZpZWxkPGludDMyX3Q+KHZlcmlmaWVyLCBWVF9JMzIsIDQpICYmCisgICAgICAgICAgIFZlcmlmeUZpZWxkPHVpbnQzMl90Pih2ZXJpZmllciwgVlRfVTMyLCA0KSAmJgorICAgICAgICAgICBWZXJpZnlGaWVsZDxpbnQ2NF90Pih2ZXJpZmllciwgVlRfSTY0LCA4KSAmJgorICAgICAgICAgICBWZXJpZnlGaWVsZDx1aW50NjRfdD4odmVyaWZpZXIsIFZUX1U2NCwgOCkgJiYKKyAgICAgICAgICAgVmVyaWZ5RmllbGQ8ZmxvYXQ+KHZlcmlmaWVyLCBWVF9GMzIsIDQpICYmCisgICAgICAgICAgIFZlcmlmeUZpZWxkPGRvdWJsZT4odmVyaWZpZXIsIFZUX0Y2NCwgOCkgJiYKKyAgICAgICAgICAgVmVyaWZ5T2Zmc2V0KHZlcmlmaWVyLCBWVF9WOCkgJiYKKyAgICAgICAgICAgdmVyaWZpZXIuVmVyaWZ5VmVjdG9yKHY4KCkpICYmCisgICAgICAgICAgIFZlcmlmeU9mZnNldCh2ZXJpZmllciwgVlRfVkY2NCkgJiYKKyAgICAgICAgICAgdmVyaWZpZXIuVmVyaWZ5VmVjdG9yKHZmNjQoKSkgJiYKKyAgICAgICAgICAgdmVyaWZpZXIuRW5kVGFibGUoKTsKKyAgfQorICBUeXBlQWxpYXNlc1QgKlVuUGFjayhjb25zdCBmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyID0gbnVsbHB0cikgY29uc3Q7CisgIHZvaWQgVW5QYWNrVG8oVHlwZUFsaWFzZXNUICpfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlciA9IG51bGxwdHIpIGNvbnN0OworICBzdGF0aWMgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxUeXBlQWxpYXNlcz4gUGFjayhmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IFR5cGVBbGlhc2VzVCogX28sIGNvbnN0IGZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIgPSBudWxscHRyKTsKK307CisKK3N0cnVjdCBUeXBlQWxpYXNlc0J1aWxkZXIgeworICB0eXBlZGVmIFR5cGVBbGlhc2VzIFRhYmxlOworICBmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJmZiYl87CisgIGZsYXRidWZmZXJzOjp1b2Zmc2V0X3Qgc3RhcnRfOworICB2b2lkIGFkZF9pOChpbnQ4X3QgaTgpIHsKKyAgICBmYmJfLkFkZEVsZW1lbnQ8aW50OF90PihUeXBlQWxpYXNlczo6VlRfSTgsIGk4LCAwKTsKKyAgfQorICB2b2lkIGFkZF91OCh1aW50OF90IHU4KSB7CisgICAgZmJiXy5BZGRFbGVtZW50PHVpbnQ4X3Q+KFR5cGVBbGlhc2VzOjpWVF9VOCwgdTgsIDApOworICB9CisgIHZvaWQgYWRkX2kxNihpbnQxNl90IGkxNikgeworICAgIGZiYl8uQWRkRWxlbWVudDxpbnQxNl90PihUeXBlQWxpYXNlczo6VlRfSTE2LCBpMTYsIDApOworICB9CisgIHZvaWQgYWRkX3UxNih1aW50MTZfdCB1MTYpIHsKKyAgICBmYmJfLkFkZEVsZW1lbnQ8dWludDE2X3Q+KFR5cGVBbGlhc2VzOjpWVF9VMTYsIHUxNiwgMCk7CisgIH0KKyAgdm9pZCBhZGRfaTMyKGludDMyX3QgaTMyKSB7CisgICAgZmJiXy5BZGRFbGVtZW50PGludDMyX3Q+KFR5cGVBbGlhc2VzOjpWVF9JMzIsIGkzMiwgMCk7CisgIH0KKyAgdm9pZCBhZGRfdTMyKHVpbnQzMl90IHUzMikgeworICAgIGZiYl8uQWRkRWxlbWVudDx1aW50MzJfdD4oVHlwZUFsaWFzZXM6OlZUX1UzMiwgdTMyLCAwKTsKKyAgfQorICB2b2lkIGFkZF9pNjQoaW50NjRfdCBpNjQpIHsKKyAgICBmYmJfLkFkZEVsZW1lbnQ8aW50NjRfdD4oVHlwZUFsaWFzZXM6OlZUX0k2NCwgaTY0LCAwKTsKKyAgfQorICB2b2lkIGFkZF91NjQodWludDY0X3QgdTY0KSB7CisgICAgZmJiXy5BZGRFbGVtZW50PHVpbnQ2NF90PihUeXBlQWxpYXNlczo6VlRfVTY0LCB1NjQsIDApOworICB9CisgIHZvaWQgYWRkX2YzMihmbG9hdCBmMzIpIHsKKyAgICBmYmJfLkFkZEVsZW1lbnQ8ZmxvYXQ+KFR5cGVBbGlhc2VzOjpWVF9GMzIsIGYzMiwgMC4wZik7CisgIH0KKyAgdm9pZCBhZGRfZjY0KGRvdWJsZSBmNjQpIHsKKyAgICBmYmJfLkFkZEVsZW1lbnQ8ZG91YmxlPihUeXBlQWxpYXNlczo6VlRfRjY0LCBmNjQsIDAuMCk7CisgIH0KKyAgdm9pZCBhZGRfdjgoZmxhdGJ1ZmZlcnM6Ok9mZnNldDxmbGF0YnVmZmVyczo6VmVjdG9yPGludDhfdD4+IHY4KSB7CisgICAgZmJiXy5BZGRPZmZzZXQoVHlwZUFsaWFzZXM6OlZUX1Y4LCB2OCk7CisgIH0KKyAgdm9pZCBhZGRfdmY2NChmbGF0YnVmZmVyczo6T2Zmc2V0PGZsYXRidWZmZXJzOjpWZWN0b3I8ZG91YmxlPj4gdmY2NCkgeworICAgIGZiYl8uQWRkT2Zmc2V0KFR5cGVBbGlhc2VzOjpWVF9WRjY0LCB2ZjY0KTsKKyAgfQorICBleHBsaWNpdCBUeXBlQWxpYXNlc0J1aWxkZXIoZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiKQorICAgICAgICA6IGZiYl8oX2ZiYikgeworICAgIHN0YXJ0XyA9IGZiYl8uU3RhcnRUYWJsZSgpOworICB9CisgIGZsYXRidWZmZXJzOjpPZmZzZXQ8VHlwZUFsaWFzZXM+IEZpbmlzaCgpIHsKKyAgICBjb25zdCBhdXRvIGVuZCA9IGZiYl8uRW5kVGFibGUoc3RhcnRfKTsKKyAgICBhdXRvIG8gPSBmbGF0YnVmZmVyczo6T2Zmc2V0PFR5cGVBbGlhc2VzPihlbmQpOworICAgIHJldHVybiBvOworICB9Cit9OworCitpbmxpbmUgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxUeXBlQWxpYXNlcz4gQ3JlYXRlVHlwZUFsaWFzZXMoCisgICAgZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLAorICAgIGludDhfdCBpOCA9IDAsCisgICAgdWludDhfdCB1OCA9IDAsCisgICAgaW50MTZfdCBpMTYgPSAwLAorICAgIHVpbnQxNl90IHUxNiA9IDAsCisgICAgaW50MzJfdCBpMzIgPSAwLAorICAgIHVpbnQzMl90IHUzMiA9IDAsCisgICAgaW50NjRfdCBpNjQgPSAwLAorICAgIHVpbnQ2NF90IHU2NCA9IDAsCisgICAgZmxvYXQgZjMyID0gMC4wZiwKKyAgICBkb3VibGUgZjY0ID0gMC4wLAorICAgIGZsYXRidWZmZXJzOjpPZmZzZXQ8ZmxhdGJ1ZmZlcnM6OlZlY3RvcjxpbnQ4X3Q+PiB2OCA9IDAsCisgICAgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxmbGF0YnVmZmVyczo6VmVjdG9yPGRvdWJsZT4+IHZmNjQgPSAwKSB7CisgIFR5cGVBbGlhc2VzQnVpbGRlciBidWlsZGVyXyhfZmJiKTsKKyAgYnVpbGRlcl8uYWRkX2Y2NChmNjQpOworICBidWlsZGVyXy5hZGRfdTY0KHU2NCk7CisgIGJ1aWxkZXJfLmFkZF9pNjQoaTY0KTsKKyAgYnVpbGRlcl8uYWRkX3ZmNjQodmY2NCk7CisgIGJ1aWxkZXJfLmFkZF92OCh2OCk7CisgIGJ1aWxkZXJfLmFkZF9mMzIoZjMyKTsKKyAgYnVpbGRlcl8uYWRkX3UzMih1MzIpOworICBidWlsZGVyXy5hZGRfaTMyKGkzMik7CisgIGJ1aWxkZXJfLmFkZF91MTYodTE2KTsKKyAgYnVpbGRlcl8uYWRkX2kxNihpMTYpOworICBidWlsZGVyXy5hZGRfdTgodTgpOworICBidWlsZGVyXy5hZGRfaTgoaTgpOworICByZXR1cm4gYnVpbGRlcl8uRmluaXNoKCk7Cit9CisKK2lubGluZSBmbGF0YnVmZmVyczo6T2Zmc2V0PFR5cGVBbGlhc2VzPiBDcmVhdGVUeXBlQWxpYXNlc0RpcmVjdCgKKyAgICBmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsCisgICAgaW50OF90IGk4ID0gMCwKKyAgICB1aW50OF90IHU4ID0gMCwKKyAgICBpbnQxNl90IGkxNiA9IDAsCisgICAgdWludDE2X3QgdTE2ID0gMCwKKyAgICBpbnQzMl90IGkzMiA9IDAsCisgICAgdWludDMyX3QgdTMyID0gMCwKKyAgICBpbnQ2NF90IGk2NCA9IDAsCisgICAgdWludDY0X3QgdTY0ID0gMCwKKyAgICBmbG9hdCBmMzIgPSAwLjBmLAorICAgIGRvdWJsZSBmNjQgPSAwLjAsCisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8aW50OF90PiAqdjggPSBudWxscHRyLAorICAgIGNvbnN0IHN0ZDo6dmVjdG9yPGRvdWJsZT4gKnZmNjQgPSBudWxscHRyKSB7CisgIGF1dG8gdjhfXyA9IHY4ID8gX2ZiYi5DcmVhdGVWZWN0b3I8aW50OF90PigqdjgpIDogMDsKKyAgYXV0byB2ZjY0X18gPSB2ZjY0ID8gX2ZiYi5DcmVhdGVWZWN0b3I8ZG91YmxlPigqdmY2NCkgOiAwOworICByZXR1cm4gTXlHYW1lOjpFeGFtcGxlOjpDcmVhdGVUeXBlQWxpYXNlcygKKyAgICAgIF9mYmIsCisgICAgICBpOCwKKyAgICAgIHU4LAorICAgICAgaTE2LAorICAgICAgdTE2LAorICAgICAgaTMyLAorICAgICAgdTMyLAorICAgICAgaTY0LAorICAgICAgdTY0LAorICAgICAgZjMyLAorICAgICAgZjY0LAorICAgICAgdjhfXywKKyAgICAgIHZmNjRfXyk7Cit9CisKK2ZsYXRidWZmZXJzOjpPZmZzZXQ8VHlwZUFsaWFzZXM+IENyZWF0ZVR5cGVBbGlhc2VzKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgVHlwZUFsaWFzZXNUICpfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlciA9IG51bGxwdHIpOworCit9ICAvLyBuYW1lc3BhY2UgRXhhbXBsZQorCisKK2lubGluZSBib29sIG9wZXJhdG9yPT0oY29uc3QgSW5QYXJlbnROYW1lc3BhY2VUICYsIGNvbnN0IEluUGFyZW50TmFtZXNwYWNlVCAmKSB7CisgIHJldHVybiB0cnVlOworfQorCitpbmxpbmUgYm9vbCBvcGVyYXRvciE9KGNvbnN0IEluUGFyZW50TmFtZXNwYWNlVCAmbGhzLCBjb25zdCBJblBhcmVudE5hbWVzcGFjZVQgJnJocykgeworICAgIHJldHVybiAhKGxocyA9PSByaHMpOworfQorCisKK2lubGluZSBJblBhcmVudE5hbWVzcGFjZVQgKkluUGFyZW50TmFtZXNwYWNlOjpVblBhY2soY29uc3QgZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlcikgY29uc3QgeworICBhdXRvIF9vID0gc3RkOjp1bmlxdWVfcHRyPEluUGFyZW50TmFtZXNwYWNlVD4obmV3IEluUGFyZW50TmFtZXNwYWNlVCgpKTsKKyAgVW5QYWNrVG8oX28uZ2V0KCksIF9yZXNvbHZlcik7CisgIHJldHVybiBfby5yZWxlYXNlKCk7Cit9CisKK2lubGluZSB2b2lkIEluUGFyZW50TmFtZXNwYWNlOjpVblBhY2tUbyhJblBhcmVudE5hbWVzcGFjZVQgKl9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyKSBjb25zdCB7CisgICh2b2lkKV9vOworICAodm9pZClfcmVzb2x2ZXI7Cit9CisKK2lubGluZSBmbGF0YnVmZmVyczo6T2Zmc2V0PEluUGFyZW50TmFtZXNwYWNlPiBJblBhcmVudE5hbWVzcGFjZTo6UGFjayhmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IEluUGFyZW50TmFtZXNwYWNlVCogX28sIGNvbnN0IGZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIpIHsKKyAgcmV0dXJuIENyZWF0ZUluUGFyZW50TmFtZXNwYWNlKF9mYmIsIF9vLCBfcmVoYXNoZXIpOworfQorCitpbmxpbmUgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxJblBhcmVudE5hbWVzcGFjZT4gQ3JlYXRlSW5QYXJlbnROYW1lc3BhY2UoZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBJblBhcmVudE5hbWVzcGFjZVQgKl9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyKSB7CisgICh2b2lkKV9yZWhhc2hlcjsKKyAgKHZvaWQpX287CisgIHN0cnVjdCBfVmVjdG9yQXJncyB7IGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAqX19mYmI7IGNvbnN0IEluUGFyZW50TmFtZXNwYWNlVCogX19vOyBjb25zdCBmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX19yZWhhc2hlcjsgfSBfdmEgPSB7ICZfZmJiLCBfbywgX3JlaGFzaGVyfTsgKHZvaWQpX3ZhOworICByZXR1cm4gTXlHYW1lOjpDcmVhdGVJblBhcmVudE5hbWVzcGFjZSgKKyAgICAgIF9mYmIpOworfQorCituYW1lc3BhY2UgRXhhbXBsZTIgeworCisKK2lubGluZSBib29sIG9wZXJhdG9yPT0oY29uc3QgTW9uc3RlclQgJiwgY29uc3QgTW9uc3RlclQgJikgeworICByZXR1cm4gdHJ1ZTsKK30KKworaW5saW5lIGJvb2wgb3BlcmF0b3IhPShjb25zdCBNb25zdGVyVCAmbGhzLCBjb25zdCBNb25zdGVyVCAmcmhzKSB7CisgICAgcmV0dXJuICEobGhzID09IHJocyk7Cit9CisKKworaW5saW5lIE1vbnN0ZXJUICpNb25zdGVyOjpVblBhY2soY29uc3QgZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlcikgY29uc3QgeworICBhdXRvIF9vID0gc3RkOjp1bmlxdWVfcHRyPE1vbnN0ZXJUPihuZXcgTW9uc3RlclQoKSk7CisgIFVuUGFja1RvKF9vLmdldCgpLCBfcmVzb2x2ZXIpOworICByZXR1cm4gX28ucmVsZWFzZSgpOworfQorCitpbmxpbmUgdm9pZCBNb25zdGVyOjpVblBhY2tUbyhNb25zdGVyVCAqX28sIGNvbnN0IGZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIpIGNvbnN0IHsKKyAgKHZvaWQpX287CisgICh2b2lkKV9yZXNvbHZlcjsKK30KKworaW5saW5lIGZsYXRidWZmZXJzOjpPZmZzZXQ8TW9uc3Rlcj4gTW9uc3Rlcjo6UGFjayhmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IE1vbnN0ZXJUKiBfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlcikgeworICByZXR1cm4gQ3JlYXRlTW9uc3RlcihfZmJiLCBfbywgX3JlaGFzaGVyKTsKK30KKworaW5saW5lIGZsYXRidWZmZXJzOjpPZmZzZXQ8TW9uc3Rlcj4gQ3JlYXRlTW9uc3RlcihmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IE1vbnN0ZXJUICpfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlcikgeworICAodm9pZClfcmVoYXNoZXI7CisgICh2b2lkKV9vOworICBzdHJ1Y3QgX1ZlY3RvckFyZ3MgeyBmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgKl9fZmJiOyBjb25zdCBNb25zdGVyVCogX19vOyBjb25zdCBmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX19yZWhhc2hlcjsgfSBfdmEgPSB7ICZfZmJiLCBfbywgX3JlaGFzaGVyfTsgKHZvaWQpX3ZhOworICByZXR1cm4gTXlHYW1lOjpFeGFtcGxlMjo6Q3JlYXRlTW9uc3RlcigKKyAgICAgIF9mYmIpOworfQorCit9ICAvLyBuYW1lc3BhY2UgRXhhbXBsZTIKKworbmFtZXNwYWNlIEV4YW1wbGUgeworCisKK2lubGluZSBib29sIG9wZXJhdG9yPT0oY29uc3QgVGVzdFNpbXBsZVRhYmxlV2l0aEVudW1UICZsaHMsIGNvbnN0IFRlc3RTaW1wbGVUYWJsZVdpdGhFbnVtVCAmcmhzKSB7CisgIHJldHVybgorICAgICAgKGxocy5jb2xvciA9PSByaHMuY29sb3IpOworfQorCitpbmxpbmUgYm9vbCBvcGVyYXRvciE9KGNvbnN0IFRlc3RTaW1wbGVUYWJsZVdpdGhFbnVtVCAmbGhzLCBjb25zdCBUZXN0U2ltcGxlVGFibGVXaXRoRW51bVQgJnJocykgeworICAgIHJldHVybiAhKGxocyA9PSByaHMpOworfQorCisKK2lubGluZSBUZXN0U2ltcGxlVGFibGVXaXRoRW51bVQgKlRlc3RTaW1wbGVUYWJsZVdpdGhFbnVtOjpVblBhY2soY29uc3QgZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlcikgY29uc3QgeworICBhdXRvIF9vID0gc3RkOjp1bmlxdWVfcHRyPFRlc3RTaW1wbGVUYWJsZVdpdGhFbnVtVD4obmV3IFRlc3RTaW1wbGVUYWJsZVdpdGhFbnVtVCgpKTsKKyAgVW5QYWNrVG8oX28uZ2V0KCksIF9yZXNvbHZlcik7CisgIHJldHVybiBfby5yZWxlYXNlKCk7Cit9CisKK2lubGluZSB2b2lkIFRlc3RTaW1wbGVUYWJsZVdpdGhFbnVtOjpVblBhY2tUbyhUZXN0U2ltcGxlVGFibGVXaXRoRW51bVQgKl9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyKSBjb25zdCB7CisgICh2b2lkKV9vOworICAodm9pZClfcmVzb2x2ZXI7CisgIHsgYXV0byBfZSA9IGNvbG9yKCk7IF9vLT5jb2xvciA9IF9lOyB9Cit9CisKK2lubGluZSBmbGF0YnVmZmVyczo6T2Zmc2V0PFRlc3RTaW1wbGVUYWJsZVdpdGhFbnVtPiBUZXN0U2ltcGxlVGFibGVXaXRoRW51bTo6UGFjayhmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IFRlc3RTaW1wbGVUYWJsZVdpdGhFbnVtVCogX28sIGNvbnN0IGZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIpIHsKKyAgcmV0dXJuIENyZWF0ZVRlc3RTaW1wbGVUYWJsZVdpdGhFbnVtKF9mYmIsIF9vLCBfcmVoYXNoZXIpOworfQorCitpbmxpbmUgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxUZXN0U2ltcGxlVGFibGVXaXRoRW51bT4gQ3JlYXRlVGVzdFNpbXBsZVRhYmxlV2l0aEVudW0oZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBUZXN0U2ltcGxlVGFibGVXaXRoRW51bVQgKl9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyKSB7CisgICh2b2lkKV9yZWhhc2hlcjsKKyAgKHZvaWQpX287CisgIHN0cnVjdCBfVmVjdG9yQXJncyB7IGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAqX19mYmI7IGNvbnN0IFRlc3RTaW1wbGVUYWJsZVdpdGhFbnVtVCogX19vOyBjb25zdCBmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX19yZWhhc2hlcjsgfSBfdmEgPSB7ICZfZmJiLCBfbywgX3JlaGFzaGVyfTsgKHZvaWQpX3ZhOworICBhdXRvIF9jb2xvciA9IF9vLT5jb2xvcjsKKyAgcmV0dXJuIE15R2FtZTo6RXhhbXBsZTo6Q3JlYXRlVGVzdFNpbXBsZVRhYmxlV2l0aEVudW0oCisgICAgICBfZmJiLAorICAgICAgX2NvbG9yKTsKK30KKworCitpbmxpbmUgYm9vbCBvcGVyYXRvcj09KGNvbnN0IFN0YXRUICZsaHMsIGNvbnN0IFN0YXRUICZyaHMpIHsKKyAgcmV0dXJuCisgICAgICAobGhzLmlkID09IHJocy5pZCkgJiYKKyAgICAgIChsaHMudmFsID09IHJocy52YWwpICYmCisgICAgICAobGhzLmNvdW50ID09IHJocy5jb3VudCk7Cit9CisKK2lubGluZSBib29sIG9wZXJhdG9yIT0oY29uc3QgU3RhdFQgJmxocywgY29uc3QgU3RhdFQgJnJocykgeworICAgIHJldHVybiAhKGxocyA9PSByaHMpOworfQorCisKK2lubGluZSBTdGF0VCAqU3RhdDo6VW5QYWNrKGNvbnN0IGZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIpIGNvbnN0IHsKKyAgYXV0byBfbyA9IHN0ZDo6dW5pcXVlX3B0cjxTdGF0VD4obmV3IFN0YXRUKCkpOworICBVblBhY2tUbyhfby5nZXQoKSwgX3Jlc29sdmVyKTsKKyAgcmV0dXJuIF9vLnJlbGVhc2UoKTsKK30KKworaW5saW5lIHZvaWQgU3RhdDo6VW5QYWNrVG8oU3RhdFQgKl9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyKSBjb25zdCB7CisgICh2b2lkKV9vOworICAodm9pZClfcmVzb2x2ZXI7CisgIHsgYXV0byBfZSA9IGlkKCk7IGlmIChfZSkgX28tPmlkID0gX2UtPnN0cigpOyB9CisgIHsgYXV0byBfZSA9IHZhbCgpOyBfby0+dmFsID0gX2U7IH0KKyAgeyBhdXRvIF9lID0gY291bnQoKTsgX28tPmNvdW50ID0gX2U7IH0KK30KKworaW5saW5lIGZsYXRidWZmZXJzOjpPZmZzZXQ8U3RhdD4gU3RhdDo6UGFjayhmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IFN0YXRUKiBfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlcikgeworICByZXR1cm4gQ3JlYXRlU3RhdChfZmJiLCBfbywgX3JlaGFzaGVyKTsKK30KKworaW5saW5lIGZsYXRidWZmZXJzOjpPZmZzZXQ8U3RhdD4gQ3JlYXRlU3RhdChmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IFN0YXRUICpfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlcikgeworICAodm9pZClfcmVoYXNoZXI7CisgICh2b2lkKV9vOworICBzdHJ1Y3QgX1ZlY3RvckFyZ3MgeyBmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgKl9fZmJiOyBjb25zdCBTdGF0VCogX19vOyBjb25zdCBmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX19yZWhhc2hlcjsgfSBfdmEgPSB7ICZfZmJiLCBfbywgX3JlaGFzaGVyfTsgKHZvaWQpX3ZhOworICBhdXRvIF9pZCA9IF9vLT5pZC5lbXB0eSgpID8gMCA6IF9mYmIuQ3JlYXRlU3RyaW5nKF9vLT5pZCk7CisgIGF1dG8gX3ZhbCA9IF9vLT52YWw7CisgIGF1dG8gX2NvdW50ID0gX28tPmNvdW50OworICByZXR1cm4gTXlHYW1lOjpFeGFtcGxlOjpDcmVhdGVTdGF0KAorICAgICAgX2ZiYiwKKyAgICAgIF9pZCwKKyAgICAgIF92YWwsCisgICAgICBfY291bnQpOworfQorCisKK2lubGluZSBib29sIG9wZXJhdG9yPT0oY29uc3QgUmVmZXJyYWJsZVQgJmxocywgY29uc3QgUmVmZXJyYWJsZVQgJnJocykgeworICByZXR1cm4KKyAgICAgIChsaHMuaWQgPT0gcmhzLmlkKTsKK30KKworaW5saW5lIGJvb2wgb3BlcmF0b3IhPShjb25zdCBSZWZlcnJhYmxlVCAmbGhzLCBjb25zdCBSZWZlcnJhYmxlVCAmcmhzKSB7CisgICAgcmV0dXJuICEobGhzID09IHJocyk7Cit9CisKKworaW5saW5lIFJlZmVycmFibGVUICpSZWZlcnJhYmxlOjpVblBhY2soY29uc3QgZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlcikgY29uc3QgeworICBhdXRvIF9vID0gc3RkOjp1bmlxdWVfcHRyPFJlZmVycmFibGVUPihuZXcgUmVmZXJyYWJsZVQoKSk7CisgIFVuUGFja1RvKF9vLmdldCgpLCBfcmVzb2x2ZXIpOworICByZXR1cm4gX28ucmVsZWFzZSgpOworfQorCitpbmxpbmUgdm9pZCBSZWZlcnJhYmxlOjpVblBhY2tUbyhSZWZlcnJhYmxlVCAqX28sIGNvbnN0IGZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIpIGNvbnN0IHsKKyAgKHZvaWQpX287CisgICh2b2lkKV9yZXNvbHZlcjsKKyAgeyBhdXRvIF9lID0gaWQoKTsgX28tPmlkID0gX2U7IH0KK30KKworaW5saW5lIGZsYXRidWZmZXJzOjpPZmZzZXQ8UmVmZXJyYWJsZT4gUmVmZXJyYWJsZTo6UGFjayhmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IFJlZmVycmFibGVUKiBfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlcikgeworICByZXR1cm4gQ3JlYXRlUmVmZXJyYWJsZShfZmJiLCBfbywgX3JlaGFzaGVyKTsKK30KKworaW5saW5lIGZsYXRidWZmZXJzOjpPZmZzZXQ8UmVmZXJyYWJsZT4gQ3JlYXRlUmVmZXJyYWJsZShmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IFJlZmVycmFibGVUICpfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlcikgeworICAodm9pZClfcmVoYXNoZXI7CisgICh2b2lkKV9vOworICBzdHJ1Y3QgX1ZlY3RvckFyZ3MgeyBmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgKl9fZmJiOyBjb25zdCBSZWZlcnJhYmxlVCogX19vOyBjb25zdCBmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX19yZWhhc2hlcjsgfSBfdmEgPSB7ICZfZmJiLCBfbywgX3JlaGFzaGVyfTsgKHZvaWQpX3ZhOworICBhdXRvIF9pZCA9IF9vLT5pZDsKKyAgcmV0dXJuIE15R2FtZTo6RXhhbXBsZTo6Q3JlYXRlUmVmZXJyYWJsZSgKKyAgICAgIF9mYmIsCisgICAgICBfaWQpOworfQorCisKK2lubGluZSBib29sIG9wZXJhdG9yPT0oY29uc3QgTW9uc3RlclQgJmxocywgY29uc3QgTW9uc3RlclQgJnJocykgeworICByZXR1cm4KKyAgICAgICgobGhzLnBvcyA9PSByaHMucG9zKSB8fCAobGhzLnBvcyAmJiByaHMucG9zICYmICpsaHMucG9zID09ICpyaHMucG9zKSkgJiYKKyAgICAgIChsaHMubWFuYSA9PSByaHMubWFuYSkgJiYKKyAgICAgIChsaHMuaHAgPT0gcmhzLmhwKSAmJgorICAgICAgKGxocy5uYW1lID09IHJocy5uYW1lKSAmJgorICAgICAgKGxocy5pbnZlbnRvcnkgPT0gcmhzLmludmVudG9yeSkgJiYKKyAgICAgIChsaHMuY29sb3IgPT0gcmhzLmNvbG9yKSAmJgorICAgICAgKGxocy50ZXN0ID09IHJocy50ZXN0KSAmJgorICAgICAgKGxocy50ZXN0NCA9PSByaHMudGVzdDQpICYmCisgICAgICAobGhzLnRlc3RhcnJheW9mc3RyaW5nID09IHJocy50ZXN0YXJyYXlvZnN0cmluZykgJiYKKyAgICAgIChsaHMudGVzdGFycmF5b2Z0YWJsZXMuc2l6ZSgpID09IHJocy50ZXN0YXJyYXlvZnRhYmxlcy5zaXplKCkgJiYgc3RkOjplcXVhbChsaHMudGVzdGFycmF5b2Z0YWJsZXMuY2JlZ2luKCksIGxocy50ZXN0YXJyYXlvZnRhYmxlcy5jZW5kKCksIHJocy50ZXN0YXJyYXlvZnRhYmxlcy5jYmVnaW4oKSwgW10oZmxhdGJ1ZmZlcnM6OnVuaXF1ZV9wdHI8TXlHYW1lOjpFeGFtcGxlOjpNb25zdGVyVD4gY29uc3QgJmEsIGZsYXRidWZmZXJzOjp1bmlxdWVfcHRyPE15R2FtZTo6RXhhbXBsZTo6TW9uc3RlclQ+IGNvbnN0ICZiKSB7IHJldHVybiAoYSA9PSBiKSB8fCAoYSAmJiBiICYmICphID09ICpiKTsgfSkpICYmCisgICAgICAoKGxocy5lbmVteSA9PSByaHMuZW5lbXkpIHx8IChsaHMuZW5lbXkgJiYgcmhzLmVuZW15ICYmICpsaHMuZW5lbXkgPT0gKnJocy5lbmVteSkpICYmCisgICAgICAobGhzLnRlc3RuZXN0ZWRmbGF0YnVmZmVyID09IHJocy50ZXN0bmVzdGVkZmxhdGJ1ZmZlcikgJiYKKyAgICAgICgobGhzLnRlc3RlbXB0eSA9PSByaHMudGVzdGVtcHR5KSB8fCAobGhzLnRlc3RlbXB0eSAmJiByaHMudGVzdGVtcHR5ICYmICpsaHMudGVzdGVtcHR5ID09ICpyaHMudGVzdGVtcHR5KSkgJiYKKyAgICAgIChsaHMudGVzdGJvb2wgPT0gcmhzLnRlc3Rib29sKSAmJgorICAgICAgKGxocy50ZXN0aGFzaHMzMl9mbnYxID09IHJocy50ZXN0aGFzaHMzMl9mbnYxKSAmJgorICAgICAgKGxocy50ZXN0aGFzaHUzMl9mbnYxID09IHJocy50ZXN0aGFzaHUzMl9mbnYxKSAmJgorICAgICAgKGxocy50ZXN0aGFzaHM2NF9mbnYxID09IHJocy50ZXN0aGFzaHM2NF9mbnYxKSAmJgorICAgICAgKGxocy50ZXN0aGFzaHU2NF9mbnYxID09IHJocy50ZXN0aGFzaHU2NF9mbnYxKSAmJgorICAgICAgKGxocy50ZXN0aGFzaHMzMl9mbnYxYSA9PSByaHMudGVzdGhhc2hzMzJfZm52MWEpICYmCisgICAgICAobGhzLnRlc3RoYXNodTMyX2ZudjFhID09IHJocy50ZXN0aGFzaHUzMl9mbnYxYSkgJiYKKyAgICAgIChsaHMudGVzdGhhc2hzNjRfZm52MWEgPT0gcmhzLnRlc3RoYXNoczY0X2ZudjFhKSAmJgorICAgICAgKGxocy50ZXN0aGFzaHU2NF9mbnYxYSA9PSByaHMudGVzdGhhc2h1NjRfZm52MWEpICYmCisgICAgICAobGhzLnRlc3RhcnJheW9mYm9vbHMgPT0gcmhzLnRlc3RhcnJheW9mYm9vbHMpICYmCisgICAgICAobGhzLnRlc3RmID09IHJocy50ZXN0ZikgJiYKKyAgICAgIChsaHMudGVzdGYyID09IHJocy50ZXN0ZjIpICYmCisgICAgICAobGhzLnRlc3RmMyA9PSByaHMudGVzdGYzKSAmJgorICAgICAgKGxocy50ZXN0YXJyYXlvZnN0cmluZzIgPT0gcmhzLnRlc3RhcnJheW9mc3RyaW5nMikgJiYKKyAgICAgIChsaHMudGVzdGFycmF5b2Zzb3J0ZWRzdHJ1Y3QgPT0gcmhzLnRlc3RhcnJheW9mc29ydGVkc3RydWN0KSAmJgorICAgICAgKGxocy5mbGV4ID09IHJocy5mbGV4KSAmJgorICAgICAgKGxocy50ZXN0NSA9PSByaHMudGVzdDUpICYmCisgICAgICAobGhzLnZlY3Rvcl9vZl9sb25ncyA9PSByaHMudmVjdG9yX29mX2xvbmdzKSAmJgorICAgICAgKGxocy52ZWN0b3Jfb2ZfZG91YmxlcyA9PSByaHMudmVjdG9yX29mX2RvdWJsZXMpICYmCisgICAgICAoKGxocy5wYXJlbnRfbmFtZXNwYWNlX3Rlc3QgPT0gcmhzLnBhcmVudF9uYW1lc3BhY2VfdGVzdCkgfHwgKGxocy5wYXJlbnRfbmFtZXNwYWNlX3Rlc3QgJiYgcmhzLnBhcmVudF9uYW1lc3BhY2VfdGVzdCAmJiAqbGhzLnBhcmVudF9uYW1lc3BhY2VfdGVzdCA9PSAqcmhzLnBhcmVudF9uYW1lc3BhY2VfdGVzdCkpICYmCisgICAgICAobGhzLnZlY3Rvcl9vZl9yZWZlcnJhYmxlcy5zaXplKCkgPT0gcmhzLnZlY3Rvcl9vZl9yZWZlcnJhYmxlcy5zaXplKCkgJiYgc3RkOjplcXVhbChsaHMudmVjdG9yX29mX3JlZmVycmFibGVzLmNiZWdpbigpLCBsaHMudmVjdG9yX29mX3JlZmVycmFibGVzLmNlbmQoKSwgcmhzLnZlY3Rvcl9vZl9yZWZlcnJhYmxlcy5jYmVnaW4oKSwgW10oZmxhdGJ1ZmZlcnM6OnVuaXF1ZV9wdHI8TXlHYW1lOjpFeGFtcGxlOjpSZWZlcnJhYmxlVD4gY29uc3QgJmEsIGZsYXRidWZmZXJzOjp1bmlxdWVfcHRyPE15R2FtZTo6RXhhbXBsZTo6UmVmZXJyYWJsZVQ+IGNvbnN0ICZiKSB7IHJldHVybiAoYSA9PSBiKSB8fCAoYSAmJiBiICYmICphID09ICpiKTsgfSkpICYmCisgICAgICAobGhzLnNpbmdsZV93ZWFrX3JlZmVyZW5jZSA9PSByaHMuc2luZ2xlX3dlYWtfcmVmZXJlbmNlKSAmJgorICAgICAgKGxocy52ZWN0b3Jfb2Zfd2Vha19yZWZlcmVuY2VzID09IHJocy52ZWN0b3Jfb2Zfd2Vha19yZWZlcmVuY2VzKSAmJgorICAgICAgKGxocy52ZWN0b3Jfb2Zfc3Ryb25nX3JlZmVycmFibGVzLnNpemUoKSA9PSByaHMudmVjdG9yX29mX3N0cm9uZ19yZWZlcnJhYmxlcy5zaXplKCkgJiYgc3RkOjplcXVhbChsaHMudmVjdG9yX29mX3N0cm9uZ19yZWZlcnJhYmxlcy5jYmVnaW4oKSwgbGhzLnZlY3Rvcl9vZl9zdHJvbmdfcmVmZXJyYWJsZXMuY2VuZCgpLCByaHMudmVjdG9yX29mX3N0cm9uZ19yZWZlcnJhYmxlcy5jYmVnaW4oKSwgW10oZmxhdGJ1ZmZlcnM6OnVuaXF1ZV9wdHI8TXlHYW1lOjpFeGFtcGxlOjpSZWZlcnJhYmxlVD4gY29uc3QgJmEsIGZsYXRidWZmZXJzOjp1bmlxdWVfcHRyPE15R2FtZTo6RXhhbXBsZTo6UmVmZXJyYWJsZVQ+IGNvbnN0ICZiKSB7IHJldHVybiAoYSA9PSBiKSB8fCAoYSAmJiBiICYmICphID09ICpiKTsgfSkpICYmCisgICAgICAobGhzLmNvX293bmluZ19yZWZlcmVuY2UgPT0gcmhzLmNvX293bmluZ19yZWZlcmVuY2UpICYmCisgICAgICAobGhzLnZlY3Rvcl9vZl9jb19vd25pbmdfcmVmZXJlbmNlcyA9PSByaHMudmVjdG9yX29mX2NvX293bmluZ19yZWZlcmVuY2VzKSAmJgorICAgICAgKGxocy5ub25fb3duaW5nX3JlZmVyZW5jZSA9PSByaHMubm9uX293bmluZ19yZWZlcmVuY2UpICYmCisgICAgICAobGhzLnZlY3Rvcl9vZl9ub25fb3duaW5nX3JlZmVyZW5jZXMgPT0gcmhzLnZlY3Rvcl9vZl9ub25fb3duaW5nX3JlZmVyZW5jZXMpICYmCisgICAgICAobGhzLmFueV91bmlxdWUgPT0gcmhzLmFueV91bmlxdWUpICYmCisgICAgICAobGhzLmFueV9hbWJpZ3VvdXMgPT0gcmhzLmFueV9hbWJpZ3VvdXMpICYmCisgICAgICAobGhzLnZlY3Rvcl9vZl9lbnVtcyA9PSByaHMudmVjdG9yX29mX2VudW1zKSAmJgorICAgICAgKGxocy5zaWduZWRfZW51bSA9PSByaHMuc2lnbmVkX2VudW0pICYmCisgICAgICAobGhzLnRlc3RyZXF1aXJlZG5lc3RlZGZsYXRidWZmZXIgPT0gcmhzLnRlc3RyZXF1aXJlZG5lc3RlZGZsYXRidWZmZXIpICYmCisgICAgICAobGhzLnNjYWxhcl9rZXlfc29ydGVkX3RhYmxlcy5zaXplKCkgPT0gcmhzLnNjYWxhcl9rZXlfc29ydGVkX3RhYmxlcy5zaXplKCkgJiYgc3RkOjplcXVhbChsaHMuc2NhbGFyX2tleV9zb3J0ZWRfdGFibGVzLmNiZWdpbigpLCBsaHMuc2NhbGFyX2tleV9zb3J0ZWRfdGFibGVzLmNlbmQoKSwgcmhzLnNjYWxhcl9rZXlfc29ydGVkX3RhYmxlcy5jYmVnaW4oKSwgW10oZmxhdGJ1ZmZlcnM6OnVuaXF1ZV9wdHI8TXlHYW1lOjpFeGFtcGxlOjpTdGF0VD4gY29uc3QgJmEsIGZsYXRidWZmZXJzOjp1bmlxdWVfcHRyPE15R2FtZTo6RXhhbXBsZTo6U3RhdFQ+IGNvbnN0ICZiKSB7IHJldHVybiAoYSA9PSBiKSB8fCAoYSAmJiBiICYmICphID09ICpiKTsgfSkpICYmCisgICAgICAobGhzLm5hdGl2ZV9pbmxpbmUgPT0gcmhzLm5hdGl2ZV9pbmxpbmUpICYmCisgICAgICAobGhzLmxvbmdfZW51bV9ub25fZW51bV9kZWZhdWx0ID09IHJocy5sb25nX2VudW1fbm9uX2VudW1fZGVmYXVsdCkgJiYKKyAgICAgIChsaHMubG9uZ19lbnVtX25vcm1hbF9kZWZhdWx0ID09IHJocy5sb25nX2VudW1fbm9ybWFsX2RlZmF1bHQpOworfQorCitpbmxpbmUgYm9vbCBvcGVyYXRvciE9KGNvbnN0IE1vbnN0ZXJUICZsaHMsIGNvbnN0IE1vbnN0ZXJUICZyaHMpIHsKKyAgICByZXR1cm4gIShsaHMgPT0gcmhzKTsKK30KKworCitpbmxpbmUgTW9uc3RlclQ6Ok1vbnN0ZXJUKGNvbnN0IE1vbnN0ZXJUICZvKQorICAgICAgOiBwb3MoKG8ucG9zKSA/IG5ldyBNeUdhbWU6OkV4YW1wbGU6OlZlYzMoKm8ucG9zKSA6IG51bGxwdHIpLAorICAgICAgICBtYW5hKG8ubWFuYSksCisgICAgICAgIGhwKG8uaHApLAorICAgICAgICBuYW1lKG8ubmFtZSksCisgICAgICAgIGludmVudG9yeShvLmludmVudG9yeSksCisgICAgICAgIGNvbG9yKG8uY29sb3IpLAorICAgICAgICB0ZXN0KG8udGVzdCksCisgICAgICAgIHRlc3Q0KG8udGVzdDQpLAorICAgICAgICB0ZXN0YXJyYXlvZnN0cmluZyhvLnRlc3RhcnJheW9mc3RyaW5nKSwKKyAgICAgICAgZW5lbXkoKG8uZW5lbXkpID8gbmV3IE15R2FtZTo6RXhhbXBsZTo6TW9uc3RlclQoKm8uZW5lbXkpIDogbnVsbHB0ciksCisgICAgICAgIHRlc3RuZXN0ZWRmbGF0YnVmZmVyKG8udGVzdG5lc3RlZGZsYXRidWZmZXIpLAorICAgICAgICB0ZXN0ZW1wdHkoKG8udGVzdGVtcHR5KSA/IG5ldyBNeUdhbWU6OkV4YW1wbGU6OlN0YXRUKCpvLnRlc3RlbXB0eSkgOiBudWxscHRyKSwKKyAgICAgICAgdGVzdGJvb2woby50ZXN0Ym9vbCksCisgICAgICAgIHRlc3RoYXNoczMyX2ZudjEoby50ZXN0aGFzaHMzMl9mbnYxKSwKKyAgICAgICAgdGVzdGhhc2h1MzJfZm52MShvLnRlc3RoYXNodTMyX2ZudjEpLAorICAgICAgICB0ZXN0aGFzaHM2NF9mbnYxKG8udGVzdGhhc2hzNjRfZm52MSksCisgICAgICAgIHRlc3RoYXNodTY0X2ZudjEoby50ZXN0aGFzaHU2NF9mbnYxKSwKKyAgICAgICAgdGVzdGhhc2hzMzJfZm52MWEoby50ZXN0aGFzaHMzMl9mbnYxYSksCisgICAgICAgIHRlc3RoYXNodTMyX2ZudjFhKG8udGVzdGhhc2h1MzJfZm52MWEpLAorICAgICAgICB0ZXN0aGFzaHM2NF9mbnYxYShvLnRlc3RoYXNoczY0X2ZudjFhKSwKKyAgICAgICAgdGVzdGhhc2h1NjRfZm52MWEoby50ZXN0aGFzaHU2NF9mbnYxYSksCisgICAgICAgIHRlc3RhcnJheW9mYm9vbHMoby50ZXN0YXJyYXlvZmJvb2xzKSwKKyAgICAgICAgdGVzdGYoby50ZXN0ZiksCisgICAgICAgIHRlc3RmMihvLnRlc3RmMiksCisgICAgICAgIHRlc3RmMyhvLnRlc3RmMyksCisgICAgICAgIHRlc3RhcnJheW9mc3RyaW5nMihvLnRlc3RhcnJheW9mc3RyaW5nMiksCisgICAgICAgIHRlc3RhcnJheW9mc29ydGVkc3RydWN0KG8udGVzdGFycmF5b2Zzb3J0ZWRzdHJ1Y3QpLAorICAgICAgICBmbGV4KG8uZmxleCksCisgICAgICAgIHRlc3Q1KG8udGVzdDUpLAorICAgICAgICB2ZWN0b3Jfb2ZfbG9uZ3Moby52ZWN0b3Jfb2ZfbG9uZ3MpLAorICAgICAgICB2ZWN0b3Jfb2ZfZG91YmxlcyhvLnZlY3Rvcl9vZl9kb3VibGVzKSwKKyAgICAgICAgcGFyZW50X25hbWVzcGFjZV90ZXN0KChvLnBhcmVudF9uYW1lc3BhY2VfdGVzdCkgPyBuZXcgTXlHYW1lOjpJblBhcmVudE5hbWVzcGFjZVQoKm8ucGFyZW50X25hbWVzcGFjZV90ZXN0KSA6IG51bGxwdHIpLAorICAgICAgICBzaW5nbGVfd2Vha19yZWZlcmVuY2Uoby5zaW5nbGVfd2Vha19yZWZlcmVuY2UpLAorICAgICAgICB2ZWN0b3Jfb2Zfd2Vha19yZWZlcmVuY2VzKG8udmVjdG9yX29mX3dlYWtfcmVmZXJlbmNlcyksCisgICAgICAgIGNvX293bmluZ19yZWZlcmVuY2Uoby5jb19vd25pbmdfcmVmZXJlbmNlKSwKKyAgICAgICAgbm9uX293bmluZ19yZWZlcmVuY2Uoby5ub25fb3duaW5nX3JlZmVyZW5jZSksCisgICAgICAgIHZlY3Rvcl9vZl9ub25fb3duaW5nX3JlZmVyZW5jZXMoby52ZWN0b3Jfb2Zfbm9uX293bmluZ19yZWZlcmVuY2VzKSwKKyAgICAgICAgYW55X3VuaXF1ZShvLmFueV91bmlxdWUpLAorICAgICAgICBhbnlfYW1iaWd1b3VzKG8uYW55X2FtYmlndW91cyksCisgICAgICAgIHZlY3Rvcl9vZl9lbnVtcyhvLnZlY3Rvcl9vZl9lbnVtcyksCisgICAgICAgIHNpZ25lZF9lbnVtKG8uc2lnbmVkX2VudW0pLAorICAgICAgICB0ZXN0cmVxdWlyZWRuZXN0ZWRmbGF0YnVmZmVyKG8udGVzdHJlcXVpcmVkbmVzdGVkZmxhdGJ1ZmZlciksCisgICAgICAgIG5hdGl2ZV9pbmxpbmUoby5uYXRpdmVfaW5saW5lKSwKKyAgICAgICAgbG9uZ19lbnVtX25vbl9lbnVtX2RlZmF1bHQoby5sb25nX2VudW1fbm9uX2VudW1fZGVmYXVsdCksCisgICAgICAgIGxvbmdfZW51bV9ub3JtYWxfZGVmYXVsdChvLmxvbmdfZW51bV9ub3JtYWxfZGVmYXVsdCkgeworICB0ZXN0YXJyYXlvZnRhYmxlcy5yZXNlcnZlKG8udGVzdGFycmF5b2Z0YWJsZXMuc2l6ZSgpKTsKKyAgZm9yIChjb25zdCBhdXRvICZ0ZXN0YXJyYXlvZnRhYmxlc18gOiBvLnRlc3RhcnJheW9mdGFibGVzKSB7IHRlc3RhcnJheW9mdGFibGVzLmVtcGxhY2VfYmFjaygodGVzdGFycmF5b2Z0YWJsZXNfKSA/IG5ldyBNeUdhbWU6OkV4YW1wbGU6Ok1vbnN0ZXJUKCp0ZXN0YXJyYXlvZnRhYmxlc18pIDogbnVsbHB0cik7IH0KKyAgdmVjdG9yX29mX3JlZmVycmFibGVzLnJlc2VydmUoby52ZWN0b3Jfb2ZfcmVmZXJyYWJsZXMuc2l6ZSgpKTsKKyAgZm9yIChjb25zdCBhdXRvICZ2ZWN0b3Jfb2ZfcmVmZXJyYWJsZXNfIDogby52ZWN0b3Jfb2ZfcmVmZXJyYWJsZXMpIHsgdmVjdG9yX29mX3JlZmVycmFibGVzLmVtcGxhY2VfYmFjaygodmVjdG9yX29mX3JlZmVycmFibGVzXykgPyBuZXcgTXlHYW1lOjpFeGFtcGxlOjpSZWZlcnJhYmxlVCgqdmVjdG9yX29mX3JlZmVycmFibGVzXykgOiBudWxscHRyKTsgfQorICB2ZWN0b3Jfb2Zfc3Ryb25nX3JlZmVycmFibGVzLnJlc2VydmUoby52ZWN0b3Jfb2Zfc3Ryb25nX3JlZmVycmFibGVzLnNpemUoKSk7CisgIGZvciAoY29uc3QgYXV0byAmdmVjdG9yX29mX3N0cm9uZ19yZWZlcnJhYmxlc18gOiBvLnZlY3Rvcl9vZl9zdHJvbmdfcmVmZXJyYWJsZXMpIHsgdmVjdG9yX29mX3N0cm9uZ19yZWZlcnJhYmxlcy5lbXBsYWNlX2JhY2soKHZlY3Rvcl9vZl9zdHJvbmdfcmVmZXJyYWJsZXNfKSA/IG5ldyBNeUdhbWU6OkV4YW1wbGU6OlJlZmVycmFibGVUKCp2ZWN0b3Jfb2Zfc3Ryb25nX3JlZmVycmFibGVzXykgOiBudWxscHRyKTsgfQorICB2ZWN0b3Jfb2ZfY29fb3duaW5nX3JlZmVyZW5jZXMucmVzZXJ2ZShvLnZlY3Rvcl9vZl9jb19vd25pbmdfcmVmZXJlbmNlcy5zaXplKCkpOworICBmb3IgKGNvbnN0IGF1dG8gJnZlY3Rvcl9vZl9jb19vd25pbmdfcmVmZXJlbmNlc18gOiBvLnZlY3Rvcl9vZl9jb19vd25pbmdfcmVmZXJlbmNlcykgeyB2ZWN0b3Jfb2ZfY29fb3duaW5nX3JlZmVyZW5jZXMuZW1wbGFjZV9iYWNrKCh2ZWN0b3Jfb2ZfY29fb3duaW5nX3JlZmVyZW5jZXNfKSA/IG5ldyBSZWZlcnJhYmxlVCgqdmVjdG9yX29mX2NvX293bmluZ19yZWZlcmVuY2VzXykgOiBudWxscHRyKTsgfQorICBzY2FsYXJfa2V5X3NvcnRlZF90YWJsZXMucmVzZXJ2ZShvLnNjYWxhcl9rZXlfc29ydGVkX3RhYmxlcy5zaXplKCkpOworICBmb3IgKGNvbnN0IGF1dG8gJnNjYWxhcl9rZXlfc29ydGVkX3RhYmxlc18gOiBvLnNjYWxhcl9rZXlfc29ydGVkX3RhYmxlcykgeyBzY2FsYXJfa2V5X3NvcnRlZF90YWJsZXMuZW1wbGFjZV9iYWNrKChzY2FsYXJfa2V5X3NvcnRlZF90YWJsZXNfKSA/IG5ldyBNeUdhbWU6OkV4YW1wbGU6OlN0YXRUKCpzY2FsYXJfa2V5X3NvcnRlZF90YWJsZXNfKSA6IG51bGxwdHIpOyB9Cit9CisKK2lubGluZSBNb25zdGVyVCAmTW9uc3RlclQ6Om9wZXJhdG9yPShNb25zdGVyVCBvKSBGTEFUQlVGRkVSU19OT0VYQ0VQVCB7CisgIHN0ZDo6c3dhcChwb3MsIG8ucG9zKTsKKyAgc3RkOjpzd2FwKG1hbmEsIG8ubWFuYSk7CisgIHN0ZDo6c3dhcChocCwgby5ocCk7CisgIHN0ZDo6c3dhcChuYW1lLCBvLm5hbWUpOworICBzdGQ6OnN3YXAoaW52ZW50b3J5LCBvLmludmVudG9yeSk7CisgIHN0ZDo6c3dhcChjb2xvciwgby5jb2xvcik7CisgIHN0ZDo6c3dhcCh0ZXN0LCBvLnRlc3QpOworICBzdGQ6OnN3YXAodGVzdDQsIG8udGVzdDQpOworICBzdGQ6OnN3YXAodGVzdGFycmF5b2ZzdHJpbmcsIG8udGVzdGFycmF5b2ZzdHJpbmcpOworICBzdGQ6OnN3YXAodGVzdGFycmF5b2Z0YWJsZXMsIG8udGVzdGFycmF5b2Z0YWJsZXMpOworICBzdGQ6OnN3YXAoZW5lbXksIG8uZW5lbXkpOworICBzdGQ6OnN3YXAodGVzdG5lc3RlZGZsYXRidWZmZXIsIG8udGVzdG5lc3RlZGZsYXRidWZmZXIpOworICBzdGQ6OnN3YXAodGVzdGVtcHR5LCBvLnRlc3RlbXB0eSk7CisgIHN0ZDo6c3dhcCh0ZXN0Ym9vbCwgby50ZXN0Ym9vbCk7CisgIHN0ZDo6c3dhcCh0ZXN0aGFzaHMzMl9mbnYxLCBvLnRlc3RoYXNoczMyX2ZudjEpOworICBzdGQ6OnN3YXAodGVzdGhhc2h1MzJfZm52MSwgby50ZXN0aGFzaHUzMl9mbnYxKTsKKyAgc3RkOjpzd2FwKHRlc3RoYXNoczY0X2ZudjEsIG8udGVzdGhhc2hzNjRfZm52MSk7CisgIHN0ZDo6c3dhcCh0ZXN0aGFzaHU2NF9mbnYxLCBvLnRlc3RoYXNodTY0X2ZudjEpOworICBzdGQ6OnN3YXAodGVzdGhhc2hzMzJfZm52MWEsIG8udGVzdGhhc2hzMzJfZm52MWEpOworICBzdGQ6OnN3YXAodGVzdGhhc2h1MzJfZm52MWEsIG8udGVzdGhhc2h1MzJfZm52MWEpOworICBzdGQ6OnN3YXAodGVzdGhhc2hzNjRfZm52MWEsIG8udGVzdGhhc2hzNjRfZm52MWEpOworICBzdGQ6OnN3YXAodGVzdGhhc2h1NjRfZm52MWEsIG8udGVzdGhhc2h1NjRfZm52MWEpOworICBzdGQ6OnN3YXAodGVzdGFycmF5b2Zib29scywgby50ZXN0YXJyYXlvZmJvb2xzKTsKKyAgc3RkOjpzd2FwKHRlc3RmLCBvLnRlc3RmKTsKKyAgc3RkOjpzd2FwKHRlc3RmMiwgby50ZXN0ZjIpOworICBzdGQ6OnN3YXAodGVzdGYzLCBvLnRlc3RmMyk7CisgIHN0ZDo6c3dhcCh0ZXN0YXJyYXlvZnN0cmluZzIsIG8udGVzdGFycmF5b2ZzdHJpbmcyKTsKKyAgc3RkOjpzd2FwKHRlc3RhcnJheW9mc29ydGVkc3RydWN0LCBvLnRlc3RhcnJheW9mc29ydGVkc3RydWN0KTsKKyAgc3RkOjpzd2FwKGZsZXgsIG8uZmxleCk7CisgIHN0ZDo6c3dhcCh0ZXN0NSwgby50ZXN0NSk7CisgIHN0ZDo6c3dhcCh2ZWN0b3Jfb2ZfbG9uZ3MsIG8udmVjdG9yX29mX2xvbmdzKTsKKyAgc3RkOjpzd2FwKHZlY3Rvcl9vZl9kb3VibGVzLCBvLnZlY3Rvcl9vZl9kb3VibGVzKTsKKyAgc3RkOjpzd2FwKHBhcmVudF9uYW1lc3BhY2VfdGVzdCwgby5wYXJlbnRfbmFtZXNwYWNlX3Rlc3QpOworICBzdGQ6OnN3YXAodmVjdG9yX29mX3JlZmVycmFibGVzLCBvLnZlY3Rvcl9vZl9yZWZlcnJhYmxlcyk7CisgIHN0ZDo6c3dhcChzaW5nbGVfd2Vha19yZWZlcmVuY2UsIG8uc2luZ2xlX3dlYWtfcmVmZXJlbmNlKTsKKyAgc3RkOjpzd2FwKHZlY3Rvcl9vZl93ZWFrX3JlZmVyZW5jZXMsIG8udmVjdG9yX29mX3dlYWtfcmVmZXJlbmNlcyk7CisgIHN0ZDo6c3dhcCh2ZWN0b3Jfb2Zfc3Ryb25nX3JlZmVycmFibGVzLCBvLnZlY3Rvcl9vZl9zdHJvbmdfcmVmZXJyYWJsZXMpOworICBzdGQ6OnN3YXAoY29fb3duaW5nX3JlZmVyZW5jZSwgby5jb19vd25pbmdfcmVmZXJlbmNlKTsKKyAgc3RkOjpzd2FwKHZlY3Rvcl9vZl9jb19vd25pbmdfcmVmZXJlbmNlcywgby52ZWN0b3Jfb2ZfY29fb3duaW5nX3JlZmVyZW5jZXMpOworICBzdGQ6OnN3YXAobm9uX293bmluZ19yZWZlcmVuY2UsIG8ubm9uX293bmluZ19yZWZlcmVuY2UpOworICBzdGQ6OnN3YXAodmVjdG9yX29mX25vbl9vd25pbmdfcmVmZXJlbmNlcywgby52ZWN0b3Jfb2Zfbm9uX293bmluZ19yZWZlcmVuY2VzKTsKKyAgc3RkOjpzd2FwKGFueV91bmlxdWUsIG8uYW55X3VuaXF1ZSk7CisgIHN0ZDo6c3dhcChhbnlfYW1iaWd1b3VzLCBvLmFueV9hbWJpZ3VvdXMpOworICBzdGQ6OnN3YXAodmVjdG9yX29mX2VudW1zLCBvLnZlY3Rvcl9vZl9lbnVtcyk7CisgIHN0ZDo6c3dhcChzaWduZWRfZW51bSwgby5zaWduZWRfZW51bSk7CisgIHN0ZDo6c3dhcCh0ZXN0cmVxdWlyZWRuZXN0ZWRmbGF0YnVmZmVyLCBvLnRlc3RyZXF1aXJlZG5lc3RlZGZsYXRidWZmZXIpOworICBzdGQ6OnN3YXAoc2NhbGFyX2tleV9zb3J0ZWRfdGFibGVzLCBvLnNjYWxhcl9rZXlfc29ydGVkX3RhYmxlcyk7CisgIHN0ZDo6c3dhcChuYXRpdmVfaW5saW5lLCBvLm5hdGl2ZV9pbmxpbmUpOworICBzdGQ6OnN3YXAobG9uZ19lbnVtX25vbl9lbnVtX2RlZmF1bHQsIG8ubG9uZ19lbnVtX25vbl9lbnVtX2RlZmF1bHQpOworICBzdGQ6OnN3YXAobG9uZ19lbnVtX25vcm1hbF9kZWZhdWx0LCBvLmxvbmdfZW51bV9ub3JtYWxfZGVmYXVsdCk7CisgIHJldHVybiAqdGhpczsKK30KKworaW5saW5lIE1vbnN0ZXJUICpNb25zdGVyOjpVblBhY2soY29uc3QgZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlcikgY29uc3QgeworICBhdXRvIF9vID0gc3RkOjp1bmlxdWVfcHRyPE1vbnN0ZXJUPihuZXcgTW9uc3RlclQoKSk7CisgIFVuUGFja1RvKF9vLmdldCgpLCBfcmVzb2x2ZXIpOworICByZXR1cm4gX28ucmVsZWFzZSgpOworfQorCitpbmxpbmUgdm9pZCBNb25zdGVyOjpVblBhY2tUbyhNb25zdGVyVCAqX28sIGNvbnN0IGZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIpIGNvbnN0IHsKKyAgKHZvaWQpX287CisgICh2b2lkKV9yZXNvbHZlcjsKKyAgeyBhdXRvIF9lID0gcG9zKCk7IGlmIChfZSkgX28tPnBvcyA9IGZsYXRidWZmZXJzOjp1bmlxdWVfcHRyPE15R2FtZTo6RXhhbXBsZTo6VmVjMz4obmV3IE15R2FtZTo6RXhhbXBsZTo6VmVjMygqX2UpKTsgfQorICB7IGF1dG8gX2UgPSBtYW5hKCk7IF9vLT5tYW5hID0gX2U7IH0KKyAgeyBhdXRvIF9lID0gaHAoKTsgX28tPmhwID0gX2U7IH0KKyAgeyBhdXRvIF9lID0gbmFtZSgpOyBpZiAoX2UpIF9vLT5uYW1lID0gX2UtPnN0cigpOyB9CisgIHsgYXV0byBfZSA9IGludmVudG9yeSgpOyBpZiAoX2UpIHsgX28tPmludmVudG9yeS5yZXNpemUoX2UtPnNpemUoKSk7IHN0ZDo6Y29weShfZS0+YmVnaW4oKSwgX2UtPmVuZCgpLCBfby0+aW52ZW50b3J5LmJlZ2luKCkpOyB9IH0KKyAgeyBhdXRvIF9lID0gY29sb3IoKTsgX28tPmNvbG9yID0gX2U7IH0KKyAgeyBhdXRvIF9lID0gdGVzdF90eXBlKCk7IF9vLT50ZXN0LnR5cGUgPSBfZTsgfQorICB7IGF1dG8gX2UgPSB0ZXN0KCk7IGlmIChfZSkgX28tPnRlc3QudmFsdWUgPSBNeUdhbWU6OkV4YW1wbGU6OkFueVVuaW9uOjpVblBhY2soX2UsIHRlc3RfdHlwZSgpLCBfcmVzb2x2ZXIpOyB9CisgIHsgYXV0byBfZSA9IHRlc3Q0KCk7IGlmIChfZSkgeyBfby0+dGVzdDQucmVzaXplKF9lLT5zaXplKCkpOyBmb3IgKGZsYXRidWZmZXJzOjp1b2Zmc2V0X3QgX2kgPSAwOyBfaSA8IF9lLT5zaXplKCk7IF9pKyspIHsgX28tPnRlc3Q0W19pXSA9ICpfZS0+R2V0KF9pKTsgfSB9IGVsc2UgeyBfby0+dGVzdDQucmVzaXplKDApOyB9IH0KKyAgeyBhdXRvIF9lID0gdGVzdGFycmF5b2ZzdHJpbmcoKTsgaWYgKF9lKSB7IF9vLT50ZXN0YXJyYXlvZnN0cmluZy5yZXNpemUoX2UtPnNpemUoKSk7IGZvciAoZmxhdGJ1ZmZlcnM6OnVvZmZzZXRfdCBfaSA9IDA7IF9pIDwgX2UtPnNpemUoKTsgX2krKykgeyBfby0+dGVzdGFycmF5b2ZzdHJpbmdbX2ldID0gX2UtPkdldChfaSktPnN0cigpOyB9IH0gZWxzZSB7IF9vLT50ZXN0YXJyYXlvZnN0cmluZy5yZXNpemUoMCk7IH0gfQorICB7IGF1dG8gX2UgPSB0ZXN0YXJyYXlvZnRhYmxlcygpOyBpZiAoX2UpIHsgX28tPnRlc3RhcnJheW9mdGFibGVzLnJlc2l6ZShfZS0+c2l6ZSgpKTsgZm9yIChmbGF0YnVmZmVyczo6dW9mZnNldF90IF9pID0gMDsgX2kgPCBfZS0+c2l6ZSgpOyBfaSsrKSB7IGlmKF9vLT50ZXN0YXJyYXlvZnRhYmxlc1tfaV0pIHsgX2UtPkdldChfaSktPlVuUGFja1RvKF9vLT50ZXN0YXJyYXlvZnRhYmxlc1tfaV0uZ2V0KCksIF9yZXNvbHZlcik7IH0gZWxzZSB7IF9vLT50ZXN0YXJyYXlvZnRhYmxlc1tfaV0gPSBmbGF0YnVmZmVyczo6dW5pcXVlX3B0cjxNeUdhbWU6OkV4YW1wbGU6Ok1vbnN0ZXJUPihfZS0+R2V0KF9pKS0+VW5QYWNrKF9yZXNvbHZlcikpOyB9OyB9IH0gZWxzZSB7IF9vLT50ZXN0YXJyYXlvZnRhYmxlcy5yZXNpemUoMCk7IH0gfQorICB7IGF1dG8gX2UgPSBlbmVteSgpOyBpZiAoX2UpIHsgaWYoX28tPmVuZW15KSB7IF9lLT5VblBhY2tUbyhfby0+ZW5lbXkuZ2V0KCksIF9yZXNvbHZlcik7IH0gZWxzZSB7IF9vLT5lbmVteSA9IGZsYXRidWZmZXJzOjp1bmlxdWVfcHRyPE15R2FtZTo6RXhhbXBsZTo6TW9uc3RlclQ+KF9lLT5VblBhY2soX3Jlc29sdmVyKSk7IH0gfSBlbHNlIGlmIChfby0+ZW5lbXkpIHsgX28tPmVuZW15LnJlc2V0KCk7IH0gfQorICB7IGF1dG8gX2UgPSB0ZXN0bmVzdGVkZmxhdGJ1ZmZlcigpOyBpZiAoX2UpIHsgX28tPnRlc3RuZXN0ZWRmbGF0YnVmZmVyLnJlc2l6ZShfZS0+c2l6ZSgpKTsgc3RkOjpjb3B5KF9lLT5iZWdpbigpLCBfZS0+ZW5kKCksIF9vLT50ZXN0bmVzdGVkZmxhdGJ1ZmZlci5iZWdpbigpKTsgfSB9CisgIHsgYXV0byBfZSA9IHRlc3RlbXB0eSgpOyBpZiAoX2UpIHsgaWYoX28tPnRlc3RlbXB0eSkgeyBfZS0+VW5QYWNrVG8oX28tPnRlc3RlbXB0eS5nZXQoKSwgX3Jlc29sdmVyKTsgfSBlbHNlIHsgX28tPnRlc3RlbXB0eSA9IGZsYXRidWZmZXJzOjp1bmlxdWVfcHRyPE15R2FtZTo6RXhhbXBsZTo6U3RhdFQ+KF9lLT5VblBhY2soX3Jlc29sdmVyKSk7IH0gfSBlbHNlIGlmIChfby0+dGVzdGVtcHR5KSB7IF9vLT50ZXN0ZW1wdHkucmVzZXQoKTsgfSB9CisgIHsgYXV0byBfZSA9IHRlc3Rib29sKCk7IF9vLT50ZXN0Ym9vbCA9IF9lOyB9CisgIHsgYXV0byBfZSA9IHRlc3RoYXNoczMyX2ZudjEoKTsgX28tPnRlc3RoYXNoczMyX2ZudjEgPSBfZTsgfQorICB7IGF1dG8gX2UgPSB0ZXN0aGFzaHUzMl9mbnYxKCk7IF9vLT50ZXN0aGFzaHUzMl9mbnYxID0gX2U7IH0KKyAgeyBhdXRvIF9lID0gdGVzdGhhc2hzNjRfZm52MSgpOyBfby0+dGVzdGhhc2hzNjRfZm52MSA9IF9lOyB9CisgIHsgYXV0byBfZSA9IHRlc3RoYXNodTY0X2ZudjEoKTsgX28tPnRlc3RoYXNodTY0X2ZudjEgPSBfZTsgfQorICB7IGF1dG8gX2UgPSB0ZXN0aGFzaHMzMl9mbnYxYSgpOyBfby0+dGVzdGhhc2hzMzJfZm52MWEgPSBfZTsgfQorICB7IGF1dG8gX2UgPSB0ZXN0aGFzaHUzMl9mbnYxYSgpOyAvKnNjYWxhciByZXNvbHZlciwgbmFrZWQqLyBpZiAoX3Jlc29sdmVyKSAoKl9yZXNvbHZlcikocmVpbnRlcnByZXRfY2FzdDx2b2lkICoqPigmX28tPnRlc3RoYXNodTMyX2ZudjFhKSwgc3RhdGljX2Nhc3Q8ZmxhdGJ1ZmZlcnM6Omhhc2hfdmFsdWVfdD4oX2UpKTsgZWxzZSBfby0+dGVzdGhhc2h1MzJfZm52MWEgPSBudWxscHRyOyB9CisgIHsgYXV0byBfZSA9IHRlc3RoYXNoczY0X2ZudjFhKCk7IF9vLT50ZXN0aGFzaHM2NF9mbnYxYSA9IF9lOyB9CisgIHsgYXV0byBfZSA9IHRlc3RoYXNodTY0X2ZudjFhKCk7IF9vLT50ZXN0aGFzaHU2NF9mbnYxYSA9IF9lOyB9CisgIHsgYXV0byBfZSA9IHRlc3RhcnJheW9mYm9vbHMoKTsgaWYgKF9lKSB7IF9vLT50ZXN0YXJyYXlvZmJvb2xzLnJlc2l6ZShfZS0+c2l6ZSgpKTsgZm9yIChmbGF0YnVmZmVyczo6dW9mZnNldF90IF9pID0gMDsgX2kgPCBfZS0+c2l6ZSgpOyBfaSsrKSB7IF9vLT50ZXN0YXJyYXlvZmJvb2xzW19pXSA9IF9lLT5HZXQoX2kpICE9IDA7IH0gfSBlbHNlIHsgX28tPnRlc3RhcnJheW9mYm9vbHMucmVzaXplKDApOyB9IH0KKyAgeyBhdXRvIF9lID0gdGVzdGYoKTsgX28tPnRlc3RmID0gX2U7IH0KKyAgeyBhdXRvIF9lID0gdGVzdGYyKCk7IF9vLT50ZXN0ZjIgPSBfZTsgfQorICB7IGF1dG8gX2UgPSB0ZXN0ZjMoKTsgX28tPnRlc3RmMyA9IF9lOyB9CisgIHsgYXV0byBfZSA9IHRlc3RhcnJheW9mc3RyaW5nMigpOyBpZiAoX2UpIHsgX28tPnRlc3RhcnJheW9mc3RyaW5nMi5yZXNpemUoX2UtPnNpemUoKSk7IGZvciAoZmxhdGJ1ZmZlcnM6OnVvZmZzZXRfdCBfaSA9IDA7IF9pIDwgX2UtPnNpemUoKTsgX2krKykgeyBfby0+dGVzdGFycmF5b2ZzdHJpbmcyW19pXSA9IF9lLT5HZXQoX2kpLT5zdHIoKTsgfSB9IGVsc2UgeyBfby0+dGVzdGFycmF5b2ZzdHJpbmcyLnJlc2l6ZSgwKTsgfSB9CisgIHsgYXV0byBfZSA9IHRlc3RhcnJheW9mc29ydGVkc3RydWN0KCk7IGlmIChfZSkgeyBfby0+dGVzdGFycmF5b2Zzb3J0ZWRzdHJ1Y3QucmVzaXplKF9lLT5zaXplKCkpOyBmb3IgKGZsYXRidWZmZXJzOjp1b2Zmc2V0X3QgX2kgPSAwOyBfaSA8IF9lLT5zaXplKCk7IF9pKyspIHsgX28tPnRlc3RhcnJheW9mc29ydGVkc3RydWN0W19pXSA9ICpfZS0+R2V0KF9pKTsgfSB9IGVsc2UgeyBfby0+dGVzdGFycmF5b2Zzb3J0ZWRzdHJ1Y3QucmVzaXplKDApOyB9IH0KKyAgeyBhdXRvIF9lID0gZmxleCgpOyBpZiAoX2UpIHsgX28tPmZsZXgucmVzaXplKF9lLT5zaXplKCkpOyBzdGQ6OmNvcHkoX2UtPmJlZ2luKCksIF9lLT5lbmQoKSwgX28tPmZsZXguYmVnaW4oKSk7IH0gfQorICB7IGF1dG8gX2UgPSB0ZXN0NSgpOyBpZiAoX2UpIHsgX28tPnRlc3Q1LnJlc2l6ZShfZS0+c2l6ZSgpKTsgZm9yIChmbGF0YnVmZmVyczo6dW9mZnNldF90IF9pID0gMDsgX2kgPCBfZS0+c2l6ZSgpOyBfaSsrKSB7IF9vLT50ZXN0NVtfaV0gPSAqX2UtPkdldChfaSk7IH0gfSBlbHNlIHsgX28tPnRlc3Q1LnJlc2l6ZSgwKTsgfSB9CisgIHsgYXV0byBfZSA9IHZlY3Rvcl9vZl9sb25ncygpOyBpZiAoX2UpIHsgX28tPnZlY3Rvcl9vZl9sb25ncy5yZXNpemUoX2UtPnNpemUoKSk7IGZvciAoZmxhdGJ1ZmZlcnM6OnVvZmZzZXRfdCBfaSA9IDA7IF9pIDwgX2UtPnNpemUoKTsgX2krKykgeyBfby0+dmVjdG9yX29mX2xvbmdzW19pXSA9IF9lLT5HZXQoX2kpOyB9IH0gZWxzZSB7IF9vLT52ZWN0b3Jfb2ZfbG9uZ3MucmVzaXplKDApOyB9IH0KKyAgeyBhdXRvIF9lID0gdmVjdG9yX29mX2RvdWJsZXMoKTsgaWYgKF9lKSB7IF9vLT52ZWN0b3Jfb2ZfZG91Ymxlcy5yZXNpemUoX2UtPnNpemUoKSk7IGZvciAoZmxhdGJ1ZmZlcnM6OnVvZmZzZXRfdCBfaSA9IDA7IF9pIDwgX2UtPnNpemUoKTsgX2krKykgeyBfby0+dmVjdG9yX29mX2RvdWJsZXNbX2ldID0gX2UtPkdldChfaSk7IH0gfSBlbHNlIHsgX28tPnZlY3Rvcl9vZl9kb3VibGVzLnJlc2l6ZSgwKTsgfSB9CisgIHsgYXV0byBfZSA9IHBhcmVudF9uYW1lc3BhY2VfdGVzdCgpOyBpZiAoX2UpIHsgaWYoX28tPnBhcmVudF9uYW1lc3BhY2VfdGVzdCkgeyBfZS0+VW5QYWNrVG8oX28tPnBhcmVudF9uYW1lc3BhY2VfdGVzdC5nZXQoKSwgX3Jlc29sdmVyKTsgfSBlbHNlIHsgX28tPnBhcmVudF9uYW1lc3BhY2VfdGVzdCA9IGZsYXRidWZmZXJzOjp1bmlxdWVfcHRyPE15R2FtZTo6SW5QYXJlbnROYW1lc3BhY2VUPihfZS0+VW5QYWNrKF9yZXNvbHZlcikpOyB9IH0gZWxzZSBpZiAoX28tPnBhcmVudF9uYW1lc3BhY2VfdGVzdCkgeyBfby0+cGFyZW50X25hbWVzcGFjZV90ZXN0LnJlc2V0KCk7IH0gfQorICB7IGF1dG8gX2UgPSB2ZWN0b3Jfb2ZfcmVmZXJyYWJsZXMoKTsgaWYgKF9lKSB7IF9vLT52ZWN0b3Jfb2ZfcmVmZXJyYWJsZXMucmVzaXplKF9lLT5zaXplKCkpOyBmb3IgKGZsYXRidWZmZXJzOjp1b2Zmc2V0X3QgX2kgPSAwOyBfaSA8IF9lLT5zaXplKCk7IF9pKyspIHsgaWYoX28tPnZlY3Rvcl9vZl9yZWZlcnJhYmxlc1tfaV0pIHsgX2UtPkdldChfaSktPlVuUGFja1RvKF9vLT52ZWN0b3Jfb2ZfcmVmZXJyYWJsZXNbX2ldLmdldCgpLCBfcmVzb2x2ZXIpOyB9IGVsc2UgeyBfby0+dmVjdG9yX29mX3JlZmVycmFibGVzW19pXSA9IGZsYXRidWZmZXJzOjp1bmlxdWVfcHRyPE15R2FtZTo6RXhhbXBsZTo6UmVmZXJyYWJsZVQ+KF9lLT5HZXQoX2kpLT5VblBhY2soX3Jlc29sdmVyKSk7IH07IH0gfSBlbHNlIHsgX28tPnZlY3Rvcl9vZl9yZWZlcnJhYmxlcy5yZXNpemUoMCk7IH0gfQorICB7IGF1dG8gX2UgPSBzaW5nbGVfd2Vha19yZWZlcmVuY2UoKTsgLypzY2FsYXIgcmVzb2x2ZXIsIG5ha2VkKi8gaWYgKF9yZXNvbHZlcikgKCpfcmVzb2x2ZXIpKHJlaW50ZXJwcmV0X2Nhc3Q8dm9pZCAqKj4oJl9vLT5zaW5nbGVfd2Vha19yZWZlcmVuY2UpLCBzdGF0aWNfY2FzdDxmbGF0YnVmZmVyczo6aGFzaF92YWx1ZV90PihfZSkpOyBlbHNlIF9vLT5zaW5nbGVfd2Vha19yZWZlcmVuY2UgPSBudWxscHRyOyB9CisgIHsgYXV0byBfZSA9IHZlY3Rvcl9vZl93ZWFrX3JlZmVyZW5jZXMoKTsgaWYgKF9lKSB7IF9vLT52ZWN0b3Jfb2Zfd2Vha19yZWZlcmVuY2VzLnJlc2l6ZShfZS0+c2l6ZSgpKTsgZm9yIChmbGF0YnVmZmVyczo6dW9mZnNldF90IF9pID0gMDsgX2kgPCBfZS0+c2l6ZSgpOyBfaSsrKSB7IC8qdmVjdG9yIHJlc29sdmVyLCBuYWtlZCovIGlmIChfcmVzb2x2ZXIpICgqX3Jlc29sdmVyKShyZWludGVycHJldF9jYXN0PHZvaWQgKio+KCZfby0+dmVjdG9yX29mX3dlYWtfcmVmZXJlbmNlc1tfaV0pLCBzdGF0aWNfY2FzdDxmbGF0YnVmZmVyczo6aGFzaF92YWx1ZV90PihfZS0+R2V0KF9pKSkpOyBlbHNlIF9vLT52ZWN0b3Jfb2Zfd2Vha19yZWZlcmVuY2VzW19pXSA9IG51bGxwdHI7IH0gfSBlbHNlIHsgX28tPnZlY3Rvcl9vZl93ZWFrX3JlZmVyZW5jZXMucmVzaXplKDApOyB9IH0KKyAgeyBhdXRvIF9lID0gdmVjdG9yX29mX3N0cm9uZ19yZWZlcnJhYmxlcygpOyBpZiAoX2UpIHsgX28tPnZlY3Rvcl9vZl9zdHJvbmdfcmVmZXJyYWJsZXMucmVzaXplKF9lLT5zaXplKCkpOyBmb3IgKGZsYXRidWZmZXJzOjp1b2Zmc2V0X3QgX2kgPSAwOyBfaSA8IF9lLT5zaXplKCk7IF9pKyspIHsgaWYoX28tPnZlY3Rvcl9vZl9zdHJvbmdfcmVmZXJyYWJsZXNbX2ldKSB7IF9lLT5HZXQoX2kpLT5VblBhY2tUbyhfby0+dmVjdG9yX29mX3N0cm9uZ19yZWZlcnJhYmxlc1tfaV0uZ2V0KCksIF9yZXNvbHZlcik7IH0gZWxzZSB7IF9vLT52ZWN0b3Jfb2Zfc3Ryb25nX3JlZmVycmFibGVzW19pXSA9IGZsYXRidWZmZXJzOjp1bmlxdWVfcHRyPE15R2FtZTo6RXhhbXBsZTo6UmVmZXJyYWJsZVQ+KF9lLT5HZXQoX2kpLT5VblBhY2soX3Jlc29sdmVyKSk7IH07IH0gfSBlbHNlIHsgX28tPnZlY3Rvcl9vZl9zdHJvbmdfcmVmZXJyYWJsZXMucmVzaXplKDApOyB9IH0KKyAgeyBhdXRvIF9lID0gY29fb3duaW5nX3JlZmVyZW5jZSgpOyAvKnNjYWxhciByZXNvbHZlciwgbmFrZWQqLyBpZiAoX3Jlc29sdmVyKSAoKl9yZXNvbHZlcikocmVpbnRlcnByZXRfY2FzdDx2b2lkICoqPigmX28tPmNvX293bmluZ19yZWZlcmVuY2UpLCBzdGF0aWNfY2FzdDxmbGF0YnVmZmVyczo6aGFzaF92YWx1ZV90PihfZSkpOyBlbHNlIF9vLT5jb19vd25pbmdfcmVmZXJlbmNlID0gbnVsbHB0cjsgfQorICB7IGF1dG8gX2UgPSB2ZWN0b3Jfb2ZfY29fb3duaW5nX3JlZmVyZW5jZXMoKTsgaWYgKF9lKSB7IF9vLT52ZWN0b3Jfb2ZfY29fb3duaW5nX3JlZmVyZW5jZXMucmVzaXplKF9lLT5zaXplKCkpOyBmb3IgKGZsYXRidWZmZXJzOjp1b2Zmc2V0X3QgX2kgPSAwOyBfaSA8IF9lLT5zaXplKCk7IF9pKyspIHsgLyp2ZWN0b3IgcmVzb2x2ZXIsIGRlZmF1bHRfcHRyX3R5cGUqLyBpZiAoX3Jlc29sdmVyKSAoKl9yZXNvbHZlcikocmVpbnRlcnByZXRfY2FzdDx2b2lkICoqPigmX28tPnZlY3Rvcl9vZl9jb19vd25pbmdfcmVmZXJlbmNlc1tfaV0pLCBzdGF0aWNfY2FzdDxmbGF0YnVmZmVyczo6aGFzaF92YWx1ZV90PihfZS0+R2V0KF9pKSkpOy8qIGVsc2UgZG8gbm90aGluZyAqLzsgfSB9IGVsc2UgeyBfby0+dmVjdG9yX29mX2NvX293bmluZ19yZWZlcmVuY2VzLnJlc2l6ZSgwKTsgfSB9CisgIHsgYXV0byBfZSA9IG5vbl9vd25pbmdfcmVmZXJlbmNlKCk7IC8qc2NhbGFyIHJlc29sdmVyLCBuYWtlZCovIGlmIChfcmVzb2x2ZXIpICgqX3Jlc29sdmVyKShyZWludGVycHJldF9jYXN0PHZvaWQgKio+KCZfby0+bm9uX293bmluZ19yZWZlcmVuY2UpLCBzdGF0aWNfY2FzdDxmbGF0YnVmZmVyczo6aGFzaF92YWx1ZV90PihfZSkpOyBlbHNlIF9vLT5ub25fb3duaW5nX3JlZmVyZW5jZSA9IG51bGxwdHI7IH0KKyAgeyBhdXRvIF9lID0gdmVjdG9yX29mX25vbl9vd25pbmdfcmVmZXJlbmNlcygpOyBpZiAoX2UpIHsgX28tPnZlY3Rvcl9vZl9ub25fb3duaW5nX3JlZmVyZW5jZXMucmVzaXplKF9lLT5zaXplKCkpOyBmb3IgKGZsYXRidWZmZXJzOjp1b2Zmc2V0X3QgX2kgPSAwOyBfaSA8IF9lLT5zaXplKCk7IF9pKyspIHsgLyp2ZWN0b3IgcmVzb2x2ZXIsIG5ha2VkKi8gaWYgKF9yZXNvbHZlcikgKCpfcmVzb2x2ZXIpKHJlaW50ZXJwcmV0X2Nhc3Q8dm9pZCAqKj4oJl9vLT52ZWN0b3Jfb2Zfbm9uX293bmluZ19yZWZlcmVuY2VzW19pXSksIHN0YXRpY19jYXN0PGZsYXRidWZmZXJzOjpoYXNoX3ZhbHVlX3Q+KF9lLT5HZXQoX2kpKSk7IGVsc2UgX28tPnZlY3Rvcl9vZl9ub25fb3duaW5nX3JlZmVyZW5jZXNbX2ldID0gbnVsbHB0cjsgfSB9IGVsc2UgeyBfby0+dmVjdG9yX29mX25vbl9vd25pbmdfcmVmZXJlbmNlcy5yZXNpemUoMCk7IH0gfQorICB7IGF1dG8gX2UgPSBhbnlfdW5pcXVlX3R5cGUoKTsgX28tPmFueV91bmlxdWUudHlwZSA9IF9lOyB9CisgIHsgYXV0byBfZSA9IGFueV91bmlxdWUoKTsgaWYgKF9lKSBfby0+YW55X3VuaXF1ZS52YWx1ZSA9IE15R2FtZTo6RXhhbXBsZTo6QW55VW5pcXVlQWxpYXNlc1VuaW9uOjpVblBhY2soX2UsIGFueV91bmlxdWVfdHlwZSgpLCBfcmVzb2x2ZXIpOyB9CisgIHsgYXV0byBfZSA9IGFueV9hbWJpZ3VvdXNfdHlwZSgpOyBfby0+YW55X2FtYmlndW91cy50eXBlID0gX2U7IH0KKyAgeyBhdXRvIF9lID0gYW55X2FtYmlndW91cygpOyBpZiAoX2UpIF9vLT5hbnlfYW1iaWd1b3VzLnZhbHVlID0gTXlHYW1lOjpFeGFtcGxlOjpBbnlBbWJpZ3VvdXNBbGlhc2VzVW5pb246OlVuUGFjayhfZSwgYW55X2FtYmlndW91c190eXBlKCksIF9yZXNvbHZlcik7IH0KKyAgeyBhdXRvIF9lID0gdmVjdG9yX29mX2VudW1zKCk7IGlmIChfZSkgeyBfby0+dmVjdG9yX29mX2VudW1zLnJlc2l6ZShfZS0+c2l6ZSgpKTsgZm9yIChmbGF0YnVmZmVyczo6dW9mZnNldF90IF9pID0gMDsgX2kgPCBfZS0+c2l6ZSgpOyBfaSsrKSB7IF9vLT52ZWN0b3Jfb2ZfZW51bXNbX2ldID0gc3RhdGljX2Nhc3Q8TXlHYW1lOjpFeGFtcGxlOjpDb2xvcj4oX2UtPkdldChfaSkpOyB9IH0gZWxzZSB7IF9vLT52ZWN0b3Jfb2ZfZW51bXMucmVzaXplKDApOyB9IH0KKyAgeyBhdXRvIF9lID0gc2lnbmVkX2VudW0oKTsgX28tPnNpZ25lZF9lbnVtID0gX2U7IH0KKyAgeyBhdXRvIF9lID0gdGVzdHJlcXVpcmVkbmVzdGVkZmxhdGJ1ZmZlcigpOyBpZiAoX2UpIHsgX28tPnRlc3RyZXF1aXJlZG5lc3RlZGZsYXRidWZmZXIucmVzaXplKF9lLT5zaXplKCkpOyBzdGQ6OmNvcHkoX2UtPmJlZ2luKCksIF9lLT5lbmQoKSwgX28tPnRlc3RyZXF1aXJlZG5lc3RlZGZsYXRidWZmZXIuYmVnaW4oKSk7IH0gfQorICB7IGF1dG8gX2UgPSBzY2FsYXJfa2V5X3NvcnRlZF90YWJsZXMoKTsgaWYgKF9lKSB7IF9vLT5zY2FsYXJfa2V5X3NvcnRlZF90YWJsZXMucmVzaXplKF9lLT5zaXplKCkpOyBmb3IgKGZsYXRidWZmZXJzOjp1b2Zmc2V0X3QgX2kgPSAwOyBfaSA8IF9lLT5zaXplKCk7IF9pKyspIHsgaWYoX28tPnNjYWxhcl9rZXlfc29ydGVkX3RhYmxlc1tfaV0pIHsgX2UtPkdldChfaSktPlVuUGFja1RvKF9vLT5zY2FsYXJfa2V5X3NvcnRlZF90YWJsZXNbX2ldLmdldCgpLCBfcmVzb2x2ZXIpOyB9IGVsc2UgeyBfby0+c2NhbGFyX2tleV9zb3J0ZWRfdGFibGVzW19pXSA9IGZsYXRidWZmZXJzOjp1bmlxdWVfcHRyPE15R2FtZTo6RXhhbXBsZTo6U3RhdFQ+KF9lLT5HZXQoX2kpLT5VblBhY2soX3Jlc29sdmVyKSk7IH07IH0gfSBlbHNlIHsgX28tPnNjYWxhcl9rZXlfc29ydGVkX3RhYmxlcy5yZXNpemUoMCk7IH0gfQorICB7IGF1dG8gX2UgPSBuYXRpdmVfaW5saW5lKCk7IGlmIChfZSkgX28tPm5hdGl2ZV9pbmxpbmUgPSAqX2U7IH0KKyAgeyBhdXRvIF9lID0gbG9uZ19lbnVtX25vbl9lbnVtX2RlZmF1bHQoKTsgX28tPmxvbmdfZW51bV9ub25fZW51bV9kZWZhdWx0ID0gX2U7IH0KKyAgeyBhdXRvIF9lID0gbG9uZ19lbnVtX25vcm1hbF9kZWZhdWx0KCk7IF9vLT5sb25nX2VudW1fbm9ybWFsX2RlZmF1bHQgPSBfZTsgfQorfQorCitpbmxpbmUgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxNb25zdGVyPiBNb25zdGVyOjpQYWNrKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgTW9uc3RlclQqIF9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyKSB7CisgIHJldHVybiBDcmVhdGVNb25zdGVyKF9mYmIsIF9vLCBfcmVoYXNoZXIpOworfQorCitpbmxpbmUgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxNb25zdGVyPiBDcmVhdGVNb25zdGVyKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgTW9uc3RlclQgKl9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyKSB7CisgICh2b2lkKV9yZWhhc2hlcjsKKyAgKHZvaWQpX287CisgIHN0cnVjdCBfVmVjdG9yQXJncyB7IGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAqX19mYmI7IGNvbnN0IE1vbnN0ZXJUKiBfX287IGNvbnN0IGZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfX3JlaGFzaGVyOyB9IF92YSA9IHsgJl9mYmIsIF9vLCBfcmVoYXNoZXJ9OyAodm9pZClfdmE7CisgIGF1dG8gX3BvcyA9IF9vLT5wb3MgPyBfby0+cG9zLmdldCgpIDogbnVsbHB0cjsKKyAgYXV0byBfbWFuYSA9IF9vLT5tYW5hOworICBhdXRvIF9ocCA9IF9vLT5ocDsKKyAgYXV0byBfbmFtZSA9IF9mYmIuQ3JlYXRlU3RyaW5nKF9vLT5uYW1lKTsKKyAgYXV0byBfaW52ZW50b3J5ID0gX28tPmludmVudG9yeS5zaXplKCkgPyBfZmJiLkNyZWF0ZVZlY3Rvcihfby0+aW52ZW50b3J5KSA6IDA7CisgIGF1dG8gX2NvbG9yID0gX28tPmNvbG9yOworICBhdXRvIF90ZXN0X3R5cGUgPSBfby0+dGVzdC50eXBlOworICBhdXRvIF90ZXN0ID0gX28tPnRlc3QuUGFjayhfZmJiKTsKKyAgYXV0byBfdGVzdDQgPSBfby0+dGVzdDQuc2l6ZSgpID8gX2ZiYi5DcmVhdGVWZWN0b3JPZlN0cnVjdHMoX28tPnRlc3Q0KSA6IDA7CisgIGF1dG8gX3Rlc3RhcnJheW9mc3RyaW5nID0gX28tPnRlc3RhcnJheW9mc3RyaW5nLnNpemUoKSA/IF9mYmIuQ3JlYXRlVmVjdG9yT2ZTdHJpbmdzKF9vLT50ZXN0YXJyYXlvZnN0cmluZykgOiAwOworICBhdXRvIF90ZXN0YXJyYXlvZnRhYmxlcyA9IF9vLT50ZXN0YXJyYXlvZnRhYmxlcy5zaXplKCkgPyBfZmJiLkNyZWF0ZVZlY3RvcjxmbGF0YnVmZmVyczo6T2Zmc2V0PE15R2FtZTo6RXhhbXBsZTo6TW9uc3Rlcj4+IChfby0+dGVzdGFycmF5b2Z0YWJsZXMuc2l6ZSgpLCBbXShzaXplX3QgaSwgX1ZlY3RvckFyZ3MgKl9fdmEpIHsgcmV0dXJuIENyZWF0ZU1vbnN0ZXIoKl9fdmEtPl9fZmJiLCBfX3ZhLT5fX28tPnRlc3RhcnJheW9mdGFibGVzW2ldLmdldCgpLCBfX3ZhLT5fX3JlaGFzaGVyKTsgfSwgJl92YSApIDogMDsKKyAgYXV0byBfZW5lbXkgPSBfby0+ZW5lbXkgPyBDcmVhdGVNb25zdGVyKF9mYmIsIF9vLT5lbmVteS5nZXQoKSwgX3JlaGFzaGVyKSA6IDA7CisgIGF1dG8gX3Rlc3RuZXN0ZWRmbGF0YnVmZmVyID0gX28tPnRlc3RuZXN0ZWRmbGF0YnVmZmVyLnNpemUoKSA/IF9mYmIuQ3JlYXRlVmVjdG9yKF9vLT50ZXN0bmVzdGVkZmxhdGJ1ZmZlcikgOiAwOworICBhdXRvIF90ZXN0ZW1wdHkgPSBfby0+dGVzdGVtcHR5ID8gQ3JlYXRlU3RhdChfZmJiLCBfby0+dGVzdGVtcHR5LmdldCgpLCBfcmVoYXNoZXIpIDogMDsKKyAgYXV0byBfdGVzdGJvb2wgPSBfby0+dGVzdGJvb2w7CisgIGF1dG8gX3Rlc3RoYXNoczMyX2ZudjEgPSBfby0+dGVzdGhhc2hzMzJfZm52MTsKKyAgYXV0byBfdGVzdGhhc2h1MzJfZm52MSA9IF9vLT50ZXN0aGFzaHUzMl9mbnYxOworICBhdXRvIF90ZXN0aGFzaHM2NF9mbnYxID0gX28tPnRlc3RoYXNoczY0X2ZudjE7CisgIGF1dG8gX3Rlc3RoYXNodTY0X2ZudjEgPSBfby0+dGVzdGhhc2h1NjRfZm52MTsKKyAgYXV0byBfdGVzdGhhc2hzMzJfZm52MWEgPSBfby0+dGVzdGhhc2hzMzJfZm52MWE7CisgIGF1dG8gX3Rlc3RoYXNodTMyX2ZudjFhID0gX3JlaGFzaGVyID8gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KCgqX3JlaGFzaGVyKShfby0+dGVzdGhhc2h1MzJfZm52MWEpKSA6IDA7CisgIGF1dG8gX3Rlc3RoYXNoczY0X2ZudjFhID0gX28tPnRlc3RoYXNoczY0X2ZudjFhOworICBhdXRvIF90ZXN0aGFzaHU2NF9mbnYxYSA9IF9vLT50ZXN0aGFzaHU2NF9mbnYxYTsKKyAgYXV0byBfdGVzdGFycmF5b2Zib29scyA9IF9vLT50ZXN0YXJyYXlvZmJvb2xzLnNpemUoKSA/IF9mYmIuQ3JlYXRlVmVjdG9yKF9vLT50ZXN0YXJyYXlvZmJvb2xzKSA6IDA7CisgIGF1dG8gX3Rlc3RmID0gX28tPnRlc3RmOworICBhdXRvIF90ZXN0ZjIgPSBfby0+dGVzdGYyOworICBhdXRvIF90ZXN0ZjMgPSBfby0+dGVzdGYzOworICBhdXRvIF90ZXN0YXJyYXlvZnN0cmluZzIgPSBfby0+dGVzdGFycmF5b2ZzdHJpbmcyLnNpemUoKSA/IF9mYmIuQ3JlYXRlVmVjdG9yT2ZTdHJpbmdzKF9vLT50ZXN0YXJyYXlvZnN0cmluZzIpIDogMDsKKyAgYXV0byBfdGVzdGFycmF5b2Zzb3J0ZWRzdHJ1Y3QgPSBfby0+dGVzdGFycmF5b2Zzb3J0ZWRzdHJ1Y3Quc2l6ZSgpID8gX2ZiYi5DcmVhdGVWZWN0b3JPZlN0cnVjdHMoX28tPnRlc3RhcnJheW9mc29ydGVkc3RydWN0KSA6IDA7CisgIGF1dG8gX2ZsZXggPSBfby0+ZmxleC5zaXplKCkgPyBfZmJiLkNyZWF0ZVZlY3Rvcihfby0+ZmxleCkgOiAwOworICBhdXRvIF90ZXN0NSA9IF9vLT50ZXN0NS5zaXplKCkgPyBfZmJiLkNyZWF0ZVZlY3Rvck9mU3RydWN0cyhfby0+dGVzdDUpIDogMDsKKyAgYXV0byBfdmVjdG9yX29mX2xvbmdzID0gX28tPnZlY3Rvcl9vZl9sb25ncy5zaXplKCkgPyBfZmJiLkNyZWF0ZVZlY3Rvcihfby0+dmVjdG9yX29mX2xvbmdzKSA6IDA7CisgIGF1dG8gX3ZlY3Rvcl9vZl9kb3VibGVzID0gX28tPnZlY3Rvcl9vZl9kb3VibGVzLnNpemUoKSA/IF9mYmIuQ3JlYXRlVmVjdG9yKF9vLT52ZWN0b3Jfb2ZfZG91YmxlcykgOiAwOworICBhdXRvIF9wYXJlbnRfbmFtZXNwYWNlX3Rlc3QgPSBfby0+cGFyZW50X25hbWVzcGFjZV90ZXN0ID8gQ3JlYXRlSW5QYXJlbnROYW1lc3BhY2UoX2ZiYiwgX28tPnBhcmVudF9uYW1lc3BhY2VfdGVzdC5nZXQoKSwgX3JlaGFzaGVyKSA6IDA7CisgIGF1dG8gX3ZlY3Rvcl9vZl9yZWZlcnJhYmxlcyA9IF9vLT52ZWN0b3Jfb2ZfcmVmZXJyYWJsZXMuc2l6ZSgpID8gX2ZiYi5DcmVhdGVWZWN0b3I8ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxNeUdhbWU6OkV4YW1wbGU6OlJlZmVycmFibGU+PiAoX28tPnZlY3Rvcl9vZl9yZWZlcnJhYmxlcy5zaXplKCksIFtdKHNpemVfdCBpLCBfVmVjdG9yQXJncyAqX192YSkgeyByZXR1cm4gQ3JlYXRlUmVmZXJyYWJsZSgqX192YS0+X19mYmIsIF9fdmEtPl9fby0+dmVjdG9yX29mX3JlZmVycmFibGVzW2ldLmdldCgpLCBfX3ZhLT5fX3JlaGFzaGVyKTsgfSwgJl92YSApIDogMDsKKyAgYXV0byBfc2luZ2xlX3dlYWtfcmVmZXJlbmNlID0gX3JlaGFzaGVyID8gc3RhdGljX2Nhc3Q8dWludDY0X3Q+KCgqX3JlaGFzaGVyKShfby0+c2luZ2xlX3dlYWtfcmVmZXJlbmNlKSkgOiAwOworICBhdXRvIF92ZWN0b3Jfb2Zfd2Vha19yZWZlcmVuY2VzID0gX28tPnZlY3Rvcl9vZl93ZWFrX3JlZmVyZW5jZXMuc2l6ZSgpID8gX2ZiYi5DcmVhdGVWZWN0b3I8dWludDY0X3Q+KF9vLT52ZWN0b3Jfb2Zfd2Vha19yZWZlcmVuY2VzLnNpemUoKSwgW10oc2l6ZV90IGksIF9WZWN0b3JBcmdzICpfX3ZhKSB7IHJldHVybiBfX3ZhLT5fX3JlaGFzaGVyID8gc3RhdGljX2Nhc3Q8dWludDY0X3Q+KCgqX192YS0+X19yZWhhc2hlcikoX192YS0+X19vLT52ZWN0b3Jfb2Zfd2Vha19yZWZlcmVuY2VzW2ldKSkgOiAwOyB9LCAmX3ZhICkgOiAwOworICBhdXRvIF92ZWN0b3Jfb2Zfc3Ryb25nX3JlZmVycmFibGVzID0gX28tPnZlY3Rvcl9vZl9zdHJvbmdfcmVmZXJyYWJsZXMuc2l6ZSgpID8gX2ZiYi5DcmVhdGVWZWN0b3I8ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxNeUdhbWU6OkV4YW1wbGU6OlJlZmVycmFibGU+PiAoX28tPnZlY3Rvcl9vZl9zdHJvbmdfcmVmZXJyYWJsZXMuc2l6ZSgpLCBbXShzaXplX3QgaSwgX1ZlY3RvckFyZ3MgKl9fdmEpIHsgcmV0dXJuIENyZWF0ZVJlZmVycmFibGUoKl9fdmEtPl9fZmJiLCBfX3ZhLT5fX28tPnZlY3Rvcl9vZl9zdHJvbmdfcmVmZXJyYWJsZXNbaV0uZ2V0KCksIF9fdmEtPl9fcmVoYXNoZXIpOyB9LCAmX3ZhICkgOiAwOworICBhdXRvIF9jb19vd25pbmdfcmVmZXJlbmNlID0gX3JlaGFzaGVyID8gc3RhdGljX2Nhc3Q8dWludDY0X3Q+KCgqX3JlaGFzaGVyKShfby0+Y29fb3duaW5nX3JlZmVyZW5jZSkpIDogMDsKKyAgYXV0byBfdmVjdG9yX29mX2NvX293bmluZ19yZWZlcmVuY2VzID0gX28tPnZlY3Rvcl9vZl9jb19vd25pbmdfcmVmZXJlbmNlcy5zaXplKCkgPyBfZmJiLkNyZWF0ZVZlY3Rvcjx1aW50NjRfdD4oX28tPnZlY3Rvcl9vZl9jb19vd25pbmdfcmVmZXJlbmNlcy5zaXplKCksIFtdKHNpemVfdCBpLCBfVmVjdG9yQXJncyAqX192YSkgeyByZXR1cm4gX192YS0+X19yZWhhc2hlciA/IHN0YXRpY19jYXN0PHVpbnQ2NF90PigoKl9fdmEtPl9fcmVoYXNoZXIpKF9fdmEtPl9fby0+dmVjdG9yX29mX2NvX293bmluZ19yZWZlcmVuY2VzW2ldLmdldCgpKSkgOiAwOyB9LCAmX3ZhICkgOiAwOworICBhdXRvIF9ub25fb3duaW5nX3JlZmVyZW5jZSA9IF9yZWhhc2hlciA/IHN0YXRpY19jYXN0PHVpbnQ2NF90PigoKl9yZWhhc2hlcikoX28tPm5vbl9vd25pbmdfcmVmZXJlbmNlKSkgOiAwOworICBhdXRvIF92ZWN0b3Jfb2Zfbm9uX293bmluZ19yZWZlcmVuY2VzID0gX28tPnZlY3Rvcl9vZl9ub25fb3duaW5nX3JlZmVyZW5jZXMuc2l6ZSgpID8gX2ZiYi5DcmVhdGVWZWN0b3I8dWludDY0X3Q+KF9vLT52ZWN0b3Jfb2Zfbm9uX293bmluZ19yZWZlcmVuY2VzLnNpemUoKSwgW10oc2l6ZV90IGksIF9WZWN0b3JBcmdzICpfX3ZhKSB7IHJldHVybiBfX3ZhLT5fX3JlaGFzaGVyID8gc3RhdGljX2Nhc3Q8dWludDY0X3Q+KCgqX192YS0+X19yZWhhc2hlcikoX192YS0+X19vLT52ZWN0b3Jfb2Zfbm9uX293bmluZ19yZWZlcmVuY2VzW2ldKSkgOiAwOyB9LCAmX3ZhICkgOiAwOworICBhdXRvIF9hbnlfdW5pcXVlX3R5cGUgPSBfby0+YW55X3VuaXF1ZS50eXBlOworICBhdXRvIF9hbnlfdW5pcXVlID0gX28tPmFueV91bmlxdWUuUGFjayhfZmJiKTsKKyAgYXV0byBfYW55X2FtYmlndW91c190eXBlID0gX28tPmFueV9hbWJpZ3VvdXMudHlwZTsKKyAgYXV0byBfYW55X2FtYmlndW91cyA9IF9vLT5hbnlfYW1iaWd1b3VzLlBhY2soX2ZiYik7CisgIGF1dG8gX3ZlY3Rvcl9vZl9lbnVtcyA9IF9vLT52ZWN0b3Jfb2ZfZW51bXMuc2l6ZSgpID8gX2ZiYi5DcmVhdGVWZWN0b3JTY2FsYXJDYXN0PHVpbnQ4X3Q+KGZsYXRidWZmZXJzOjpkYXRhKF9vLT52ZWN0b3Jfb2ZfZW51bXMpLCBfby0+dmVjdG9yX29mX2VudW1zLnNpemUoKSkgOiAwOworICBhdXRvIF9zaWduZWRfZW51bSA9IF9vLT5zaWduZWRfZW51bTsKKyAgYXV0byBfdGVzdHJlcXVpcmVkbmVzdGVkZmxhdGJ1ZmZlciA9IF9vLT50ZXN0cmVxdWlyZWRuZXN0ZWRmbGF0YnVmZmVyLnNpemUoKSA/IF9mYmIuQ3JlYXRlVmVjdG9yKF9vLT50ZXN0cmVxdWlyZWRuZXN0ZWRmbGF0YnVmZmVyKSA6IDA7CisgIGF1dG8gX3NjYWxhcl9rZXlfc29ydGVkX3RhYmxlcyA9IF9vLT5zY2FsYXJfa2V5X3NvcnRlZF90YWJsZXMuc2l6ZSgpID8gX2ZiYi5DcmVhdGVWZWN0b3I8ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxNeUdhbWU6OkV4YW1wbGU6OlN0YXQ+PiAoX28tPnNjYWxhcl9rZXlfc29ydGVkX3RhYmxlcy5zaXplKCksIFtdKHNpemVfdCBpLCBfVmVjdG9yQXJncyAqX192YSkgeyByZXR1cm4gQ3JlYXRlU3RhdCgqX192YS0+X19mYmIsIF9fdmEtPl9fby0+c2NhbGFyX2tleV9zb3J0ZWRfdGFibGVzW2ldLmdldCgpLCBfX3ZhLT5fX3JlaGFzaGVyKTsgfSwgJl92YSApIDogMDsKKyAgYXV0byBfbmF0aXZlX2lubGluZSA9ICZfby0+bmF0aXZlX2lubGluZTsKKyAgYXV0byBfbG9uZ19lbnVtX25vbl9lbnVtX2RlZmF1bHQgPSBfby0+bG9uZ19lbnVtX25vbl9lbnVtX2RlZmF1bHQ7CisgIGF1dG8gX2xvbmdfZW51bV9ub3JtYWxfZGVmYXVsdCA9IF9vLT5sb25nX2VudW1fbm9ybWFsX2RlZmF1bHQ7CisgIHJldHVybiBNeUdhbWU6OkV4YW1wbGU6OkNyZWF0ZU1vbnN0ZXIoCisgICAgICBfZmJiLAorICAgICAgX3BvcywKKyAgICAgIF9tYW5hLAorICAgICAgX2hwLAorICAgICAgX25hbWUsCisgICAgICBfaW52ZW50b3J5LAorICAgICAgX2NvbG9yLAorICAgICAgX3Rlc3RfdHlwZSwKKyAgICAgIF90ZXN0LAorICAgICAgX3Rlc3Q0LAorICAgICAgX3Rlc3RhcnJheW9mc3RyaW5nLAorICAgICAgX3Rlc3RhcnJheW9mdGFibGVzLAorICAgICAgX2VuZW15LAorICAgICAgX3Rlc3RuZXN0ZWRmbGF0YnVmZmVyLAorICAgICAgX3Rlc3RlbXB0eSwKKyAgICAgIF90ZXN0Ym9vbCwKKyAgICAgIF90ZXN0aGFzaHMzMl9mbnYxLAorICAgICAgX3Rlc3RoYXNodTMyX2ZudjEsCisgICAgICBfdGVzdGhhc2hzNjRfZm52MSwKKyAgICAgIF90ZXN0aGFzaHU2NF9mbnYxLAorICAgICAgX3Rlc3RoYXNoczMyX2ZudjFhLAorICAgICAgX3Rlc3RoYXNodTMyX2ZudjFhLAorICAgICAgX3Rlc3RoYXNoczY0X2ZudjFhLAorICAgICAgX3Rlc3RoYXNodTY0X2ZudjFhLAorICAgICAgX3Rlc3RhcnJheW9mYm9vbHMsCisgICAgICBfdGVzdGYsCisgICAgICBfdGVzdGYyLAorICAgICAgX3Rlc3RmMywKKyAgICAgIF90ZXN0YXJyYXlvZnN0cmluZzIsCisgICAgICBfdGVzdGFycmF5b2Zzb3J0ZWRzdHJ1Y3QsCisgICAgICBfZmxleCwKKyAgICAgIF90ZXN0NSwKKyAgICAgIF92ZWN0b3Jfb2ZfbG9uZ3MsCisgICAgICBfdmVjdG9yX29mX2RvdWJsZXMsCisgICAgICBfcGFyZW50X25hbWVzcGFjZV90ZXN0LAorICAgICAgX3ZlY3Rvcl9vZl9yZWZlcnJhYmxlcywKKyAgICAgIF9zaW5nbGVfd2Vha19yZWZlcmVuY2UsCisgICAgICBfdmVjdG9yX29mX3dlYWtfcmVmZXJlbmNlcywKKyAgICAgIF92ZWN0b3Jfb2Zfc3Ryb25nX3JlZmVycmFibGVzLAorICAgICAgX2NvX293bmluZ19yZWZlcmVuY2UsCisgICAgICBfdmVjdG9yX29mX2NvX293bmluZ19yZWZlcmVuY2VzLAorICAgICAgX25vbl9vd25pbmdfcmVmZXJlbmNlLAorICAgICAgX3ZlY3Rvcl9vZl9ub25fb3duaW5nX3JlZmVyZW5jZXMsCisgICAgICBfYW55X3VuaXF1ZV90eXBlLAorICAgICAgX2FueV91bmlxdWUsCisgICAgICBfYW55X2FtYmlndW91c190eXBlLAorICAgICAgX2FueV9hbWJpZ3VvdXMsCisgICAgICBfdmVjdG9yX29mX2VudW1zLAorICAgICAgX3NpZ25lZF9lbnVtLAorICAgICAgX3Rlc3RyZXF1aXJlZG5lc3RlZGZsYXRidWZmZXIsCisgICAgICBfc2NhbGFyX2tleV9zb3J0ZWRfdGFibGVzLAorICAgICAgX25hdGl2ZV9pbmxpbmUsCisgICAgICBfbG9uZ19lbnVtX25vbl9lbnVtX2RlZmF1bHQsCisgICAgICBfbG9uZ19lbnVtX25vcm1hbF9kZWZhdWx0KTsKK30KKworCitpbmxpbmUgYm9vbCBvcGVyYXRvcj09KGNvbnN0IFR5cGVBbGlhc2VzVCAmbGhzLCBjb25zdCBUeXBlQWxpYXNlc1QgJnJocykgeworICByZXR1cm4KKyAgICAgIChsaHMuaTggPT0gcmhzLmk4KSAmJgorICAgICAgKGxocy51OCA9PSByaHMudTgpICYmCisgICAgICAobGhzLmkxNiA9PSByaHMuaTE2KSAmJgorICAgICAgKGxocy51MTYgPT0gcmhzLnUxNikgJiYKKyAgICAgIChsaHMuaTMyID09IHJocy5pMzIpICYmCisgICAgICAobGhzLnUzMiA9PSByaHMudTMyKSAmJgorICAgICAgKGxocy5pNjQgPT0gcmhzLmk2NCkgJiYKKyAgICAgIChsaHMudTY0ID09IHJocy51NjQpICYmCisgICAgICAobGhzLmYzMiA9PSByaHMuZjMyKSAmJgorICAgICAgKGxocy5mNjQgPT0gcmhzLmY2NCkgJiYKKyAgICAgIChsaHMudjggPT0gcmhzLnY4KSAmJgorICAgICAgKGxocy52ZjY0ID09IHJocy52ZjY0KTsKK30KKworaW5saW5lIGJvb2wgb3BlcmF0b3IhPShjb25zdCBUeXBlQWxpYXNlc1QgJmxocywgY29uc3QgVHlwZUFsaWFzZXNUICZyaHMpIHsKKyAgICByZXR1cm4gIShsaHMgPT0gcmhzKTsKK30KKworCitpbmxpbmUgVHlwZUFsaWFzZXNUICpUeXBlQWxpYXNlczo6VW5QYWNrKGNvbnN0IGZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIpIGNvbnN0IHsKKyAgYXV0byBfbyA9IHN0ZDo6dW5pcXVlX3B0cjxUeXBlQWxpYXNlc1Q+KG5ldyBUeXBlQWxpYXNlc1QoKSk7CisgIFVuUGFja1RvKF9vLmdldCgpLCBfcmVzb2x2ZXIpOworICByZXR1cm4gX28ucmVsZWFzZSgpOworfQorCitpbmxpbmUgdm9pZCBUeXBlQWxpYXNlczo6VW5QYWNrVG8oVHlwZUFsaWFzZXNUICpfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlcikgY29uc3QgeworICAodm9pZClfbzsKKyAgKHZvaWQpX3Jlc29sdmVyOworICB7IGF1dG8gX2UgPSBpOCgpOyBfby0+aTggPSBfZTsgfQorICB7IGF1dG8gX2UgPSB1OCgpOyBfby0+dTggPSBfZTsgfQorICB7IGF1dG8gX2UgPSBpMTYoKTsgX28tPmkxNiA9IF9lOyB9CisgIHsgYXV0byBfZSA9IHUxNigpOyBfby0+dTE2ID0gX2U7IH0KKyAgeyBhdXRvIF9lID0gaTMyKCk7IF9vLT5pMzIgPSBfZTsgfQorICB7IGF1dG8gX2UgPSB1MzIoKTsgX28tPnUzMiA9IF9lOyB9CisgIHsgYXV0byBfZSA9IGk2NCgpOyBfby0+aTY0ID0gX2U7IH0KKyAgeyBhdXRvIF9lID0gdTY0KCk7IF9vLT51NjQgPSBfZTsgfQorICB7IGF1dG8gX2UgPSBmMzIoKTsgX28tPmYzMiA9IF9lOyB9CisgIHsgYXV0byBfZSA9IGY2NCgpOyBfby0+ZjY0ID0gX2U7IH0KKyAgeyBhdXRvIF9lID0gdjgoKTsgaWYgKF9lKSB7IF9vLT52OC5yZXNpemUoX2UtPnNpemUoKSk7IHN0ZDo6Y29weShfZS0+YmVnaW4oKSwgX2UtPmVuZCgpLCBfby0+djguYmVnaW4oKSk7IH0gfQorICB7IGF1dG8gX2UgPSB2ZjY0KCk7IGlmIChfZSkgeyBfby0+dmY2NC5yZXNpemUoX2UtPnNpemUoKSk7IGZvciAoZmxhdGJ1ZmZlcnM6OnVvZmZzZXRfdCBfaSA9IDA7IF9pIDwgX2UtPnNpemUoKTsgX2krKykgeyBfby0+dmY2NFtfaV0gPSBfZS0+R2V0KF9pKTsgfSB9IGVsc2UgeyBfby0+dmY2NC5yZXNpemUoMCk7IH0gfQorfQorCitpbmxpbmUgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxUeXBlQWxpYXNlcz4gVHlwZUFsaWFzZXM6OlBhY2soZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBUeXBlQWxpYXNlc1QqIF9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyKSB7CisgIHJldHVybiBDcmVhdGVUeXBlQWxpYXNlcyhfZmJiLCBfbywgX3JlaGFzaGVyKTsKK30KKworaW5saW5lIGZsYXRidWZmZXJzOjpPZmZzZXQ8VHlwZUFsaWFzZXM+IENyZWF0ZVR5cGVBbGlhc2VzKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgVHlwZUFsaWFzZXNUICpfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlcikgeworICAodm9pZClfcmVoYXNoZXI7CisgICh2b2lkKV9vOworICBzdHJ1Y3QgX1ZlY3RvckFyZ3MgeyBmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgKl9fZmJiOyBjb25zdCBUeXBlQWxpYXNlc1QqIF9fbzsgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9fcmVoYXNoZXI7IH0gX3ZhID0geyAmX2ZiYiwgX28sIF9yZWhhc2hlcn07ICh2b2lkKV92YTsKKyAgYXV0byBfaTggPSBfby0+aTg7CisgIGF1dG8gX3U4ID0gX28tPnU4OworICBhdXRvIF9pMTYgPSBfby0+aTE2OworICBhdXRvIF91MTYgPSBfby0+dTE2OworICBhdXRvIF9pMzIgPSBfby0+aTMyOworICBhdXRvIF91MzIgPSBfby0+dTMyOworICBhdXRvIF9pNjQgPSBfby0+aTY0OworICBhdXRvIF91NjQgPSBfby0+dTY0OworICBhdXRvIF9mMzIgPSBfby0+ZjMyOworICBhdXRvIF9mNjQgPSBfby0+ZjY0OworICBhdXRvIF92OCA9IF9vLT52OC5zaXplKCkgPyBfZmJiLkNyZWF0ZVZlY3Rvcihfby0+djgpIDogMDsKKyAgYXV0byBfdmY2NCA9IF9vLT52ZjY0LnNpemUoKSA/IF9mYmIuQ3JlYXRlVmVjdG9yKF9vLT52ZjY0KSA6IDA7CisgIHJldHVybiBNeUdhbWU6OkV4YW1wbGU6OkNyZWF0ZVR5cGVBbGlhc2VzKAorICAgICAgX2ZiYiwKKyAgICAgIF9pOCwKKyAgICAgIF91OCwKKyAgICAgIF9pMTYsCisgICAgICBfdTE2LAorICAgICAgX2kzMiwKKyAgICAgIF91MzIsCisgICAgICBfaTY0LAorICAgICAgX3U2NCwKKyAgICAgIF9mMzIsCisgICAgICBfZjY0LAorICAgICAgX3Y4LAorICAgICAgX3ZmNjQpOworfQorCitpbmxpbmUgYm9vbCBWZXJpZnlBbnkoZmxhdGJ1ZmZlcnM6OlZlcmlmaWVyICZ2ZXJpZmllciwgY29uc3Qgdm9pZCAqb2JqLCBBbnkgdHlwZSkgeworICBzd2l0Y2ggKHR5cGUpIHsKKyAgICBjYXNlIEFueV9OT05FOiB7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgY2FzZSBBbnlfTW9uc3RlcjogeworICAgICAgYXV0byBwdHIgPSByZWludGVycHJldF9jYXN0PGNvbnN0IE15R2FtZTo6RXhhbXBsZTo6TW9uc3RlciAqPihvYmopOworICAgICAgcmV0dXJuIHZlcmlmaWVyLlZlcmlmeVRhYmxlKHB0cik7CisgICAgfQorICAgIGNhc2UgQW55X1Rlc3RTaW1wbGVUYWJsZVdpdGhFbnVtOiB7CisgICAgICBhdXRvIHB0ciA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgTXlHYW1lOjpFeGFtcGxlOjpUZXN0U2ltcGxlVGFibGVXaXRoRW51bSAqPihvYmopOworICAgICAgcmV0dXJuIHZlcmlmaWVyLlZlcmlmeVRhYmxlKHB0cik7CisgICAgfQorICAgIGNhc2UgQW55X015R2FtZV9FeGFtcGxlMl9Nb25zdGVyOiB7CisgICAgICBhdXRvIHB0ciA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgTXlHYW1lOjpFeGFtcGxlMjo6TW9uc3RlciAqPihvYmopOworICAgICAgcmV0dXJuIHZlcmlmaWVyLlZlcmlmeVRhYmxlKHB0cik7CisgICAgfQorICAgIGRlZmF1bHQ6IHJldHVybiB0cnVlOworICB9Cit9CisKK2lubGluZSBib29sIFZlcmlmeUFueVZlY3RvcihmbGF0YnVmZmVyczo6VmVyaWZpZXIgJnZlcmlmaWVyLCBjb25zdCBmbGF0YnVmZmVyczo6VmVjdG9yPGZsYXRidWZmZXJzOjpPZmZzZXQ8dm9pZD4+ICp2YWx1ZXMsIGNvbnN0IGZsYXRidWZmZXJzOjpWZWN0b3I8dWludDhfdD4gKnR5cGVzKSB7CisgIGlmICghdmFsdWVzIHx8ICF0eXBlcykgcmV0dXJuICF2YWx1ZXMgJiYgIXR5cGVzOworICBpZiAodmFsdWVzLT5zaXplKCkgIT0gdHlwZXMtPnNpemUoKSkgcmV0dXJuIGZhbHNlOworICBmb3IgKGZsYXRidWZmZXJzOjp1b2Zmc2V0X3QgaSA9IDA7IGkgPCB2YWx1ZXMtPnNpemUoKTsgKytpKSB7CisgICAgaWYgKCFWZXJpZnlBbnkoCisgICAgICAgIHZlcmlmaWVyLCAgdmFsdWVzLT5HZXQoaSksIHR5cGVzLT5HZXRFbnVtPEFueT4oaSkpKSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICB9CisgIHJldHVybiB0cnVlOworfQorCitpbmxpbmUgdm9pZCAqQW55VW5pb246OlVuUGFjayhjb25zdCB2b2lkICpvYmosIEFueSB0eXBlLCBjb25zdCBmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqcmVzb2x2ZXIpIHsKKyAgKHZvaWQpcmVzb2x2ZXI7CisgIHN3aXRjaCAodHlwZSkgeworICAgIGNhc2UgQW55X01vbnN0ZXI6IHsKKyAgICAgIGF1dG8gcHRyID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBNeUdhbWU6OkV4YW1wbGU6Ok1vbnN0ZXIgKj4ob2JqKTsKKyAgICAgIHJldHVybiBwdHItPlVuUGFjayhyZXNvbHZlcik7CisgICAgfQorICAgIGNhc2UgQW55X1Rlc3RTaW1wbGVUYWJsZVdpdGhFbnVtOiB7CisgICAgICBhdXRvIHB0ciA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgTXlHYW1lOjpFeGFtcGxlOjpUZXN0U2ltcGxlVGFibGVXaXRoRW51bSAqPihvYmopOworICAgICAgcmV0dXJuIHB0ci0+VW5QYWNrKHJlc29sdmVyKTsKKyAgICB9CisgICAgY2FzZSBBbnlfTXlHYW1lX0V4YW1wbGUyX01vbnN0ZXI6IHsKKyAgICAgIGF1dG8gcHRyID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBNeUdhbWU6OkV4YW1wbGUyOjpNb25zdGVyICo+KG9iaik7CisgICAgICByZXR1cm4gcHRyLT5VblBhY2socmVzb2x2ZXIpOworICAgIH0KKyAgICBkZWZhdWx0OiByZXR1cm4gbnVsbHB0cjsKKyAgfQorfQorCitpbmxpbmUgZmxhdGJ1ZmZlcnM6Ok9mZnNldDx2b2lkPiBBbnlVbmlvbjo6UGFjayhmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IGZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIpIGNvbnN0IHsKKyAgKHZvaWQpX3JlaGFzaGVyOworICBzd2l0Y2ggKHR5cGUpIHsKKyAgICBjYXNlIEFueV9Nb25zdGVyOiB7CisgICAgICBhdXRvIHB0ciA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgTXlHYW1lOjpFeGFtcGxlOjpNb25zdGVyVCAqPih2YWx1ZSk7CisgICAgICByZXR1cm4gQ3JlYXRlTW9uc3RlcihfZmJiLCBwdHIsIF9yZWhhc2hlcikuVW5pb24oKTsKKyAgICB9CisgICAgY2FzZSBBbnlfVGVzdFNpbXBsZVRhYmxlV2l0aEVudW06IHsKKyAgICAgIGF1dG8gcHRyID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBNeUdhbWU6OkV4YW1wbGU6OlRlc3RTaW1wbGVUYWJsZVdpdGhFbnVtVCAqPih2YWx1ZSk7CisgICAgICByZXR1cm4gQ3JlYXRlVGVzdFNpbXBsZVRhYmxlV2l0aEVudW0oX2ZiYiwgcHRyLCBfcmVoYXNoZXIpLlVuaW9uKCk7CisgICAgfQorICAgIGNhc2UgQW55X015R2FtZV9FeGFtcGxlMl9Nb25zdGVyOiB7CisgICAgICBhdXRvIHB0ciA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgTXlHYW1lOjpFeGFtcGxlMjo6TW9uc3RlclQgKj4odmFsdWUpOworICAgICAgcmV0dXJuIENyZWF0ZU1vbnN0ZXIoX2ZiYiwgcHRyLCBfcmVoYXNoZXIpLlVuaW9uKCk7CisgICAgfQorICAgIGRlZmF1bHQ6IHJldHVybiAwOworICB9Cit9CisKK2lubGluZSBBbnlVbmlvbjo6QW55VW5pb24oY29uc3QgQW55VW5pb24gJnUpIDogdHlwZSh1LnR5cGUpLCB2YWx1ZShudWxscHRyKSB7CisgIHN3aXRjaCAodHlwZSkgeworICAgIGNhc2UgQW55X01vbnN0ZXI6IHsKKyAgICAgIHZhbHVlID0gbmV3IE15R2FtZTo6RXhhbXBsZTo6TW9uc3RlclQoKnJlaW50ZXJwcmV0X2Nhc3Q8TXlHYW1lOjpFeGFtcGxlOjpNb25zdGVyVCAqPih1LnZhbHVlKSk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBBbnlfVGVzdFNpbXBsZVRhYmxlV2l0aEVudW06IHsKKyAgICAgIHZhbHVlID0gbmV3IE15R2FtZTo6RXhhbXBsZTo6VGVzdFNpbXBsZVRhYmxlV2l0aEVudW1UKCpyZWludGVycHJldF9jYXN0PE15R2FtZTo6RXhhbXBsZTo6VGVzdFNpbXBsZVRhYmxlV2l0aEVudW1UICo+KHUudmFsdWUpKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIEFueV9NeUdhbWVfRXhhbXBsZTJfTW9uc3RlcjogeworICAgICAgdmFsdWUgPSBuZXcgTXlHYW1lOjpFeGFtcGxlMjo6TW9uc3RlclQoKnJlaW50ZXJwcmV0X2Nhc3Q8TXlHYW1lOjpFeGFtcGxlMjo6TW9uc3RlclQgKj4odS52YWx1ZSkpOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQorfQorCitpbmxpbmUgdm9pZCBBbnlVbmlvbjo6UmVzZXQoKSB7CisgIHN3aXRjaCAodHlwZSkgeworICAgIGNhc2UgQW55X01vbnN0ZXI6IHsKKyAgICAgIGF1dG8gcHRyID0gcmVpbnRlcnByZXRfY2FzdDxNeUdhbWU6OkV4YW1wbGU6Ok1vbnN0ZXJUICo+KHZhbHVlKTsKKyAgICAgIGRlbGV0ZSBwdHI7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBBbnlfVGVzdFNpbXBsZVRhYmxlV2l0aEVudW06IHsKKyAgICAgIGF1dG8gcHRyID0gcmVpbnRlcnByZXRfY2FzdDxNeUdhbWU6OkV4YW1wbGU6OlRlc3RTaW1wbGVUYWJsZVdpdGhFbnVtVCAqPih2YWx1ZSk7CisgICAgICBkZWxldGUgcHRyOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgQW55X015R2FtZV9FeGFtcGxlMl9Nb25zdGVyOiB7CisgICAgICBhdXRvIHB0ciA9IHJlaW50ZXJwcmV0X2Nhc3Q8TXlHYW1lOjpFeGFtcGxlMjo6TW9uc3RlclQgKj4odmFsdWUpOworICAgICAgZGVsZXRlIHB0cjsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBkZWZhdWx0OiBicmVhazsKKyAgfQorICB2YWx1ZSA9IG51bGxwdHI7CisgIHR5cGUgPSBBbnlfTk9ORTsKK30KKworaW5saW5lIGJvb2wgVmVyaWZ5QW55VW5pcXVlQWxpYXNlcyhmbGF0YnVmZmVyczo6VmVyaWZpZXIgJnZlcmlmaWVyLCBjb25zdCB2b2lkICpvYmosIEFueVVuaXF1ZUFsaWFzZXMgdHlwZSkgeworICBzd2l0Y2ggKHR5cGUpIHsKKyAgICBjYXNlIEFueVVuaXF1ZUFsaWFzZXNfTk9ORTogeworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIGNhc2UgQW55VW5pcXVlQWxpYXNlc19NOiB7CisgICAgICBhdXRvIHB0ciA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgTXlHYW1lOjpFeGFtcGxlOjpNb25zdGVyICo+KG9iaik7CisgICAgICByZXR1cm4gdmVyaWZpZXIuVmVyaWZ5VGFibGUocHRyKTsKKyAgICB9CisgICAgY2FzZSBBbnlVbmlxdWVBbGlhc2VzX1RTOiB7CisgICAgICBhdXRvIHB0ciA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgTXlHYW1lOjpFeGFtcGxlOjpUZXN0U2ltcGxlVGFibGVXaXRoRW51bSAqPihvYmopOworICAgICAgcmV0dXJuIHZlcmlmaWVyLlZlcmlmeVRhYmxlKHB0cik7CisgICAgfQorICAgIGNhc2UgQW55VW5pcXVlQWxpYXNlc19NMjogeworICAgICAgYXV0byBwdHIgPSByZWludGVycHJldF9jYXN0PGNvbnN0IE15R2FtZTo6RXhhbXBsZTI6Ok1vbnN0ZXIgKj4ob2JqKTsKKyAgICAgIHJldHVybiB2ZXJpZmllci5WZXJpZnlUYWJsZShwdHIpOworICAgIH0KKyAgICBkZWZhdWx0OiByZXR1cm4gdHJ1ZTsKKyAgfQorfQorCitpbmxpbmUgYm9vbCBWZXJpZnlBbnlVbmlxdWVBbGlhc2VzVmVjdG9yKGZsYXRidWZmZXJzOjpWZXJpZmllciAmdmVyaWZpZXIsIGNvbnN0IGZsYXRidWZmZXJzOjpWZWN0b3I8ZmxhdGJ1ZmZlcnM6Ok9mZnNldDx2b2lkPj4gKnZhbHVlcywgY29uc3QgZmxhdGJ1ZmZlcnM6OlZlY3Rvcjx1aW50OF90PiAqdHlwZXMpIHsKKyAgaWYgKCF2YWx1ZXMgfHwgIXR5cGVzKSByZXR1cm4gIXZhbHVlcyAmJiAhdHlwZXM7CisgIGlmICh2YWx1ZXMtPnNpemUoKSAhPSB0eXBlcy0+c2l6ZSgpKSByZXR1cm4gZmFsc2U7CisgIGZvciAoZmxhdGJ1ZmZlcnM6OnVvZmZzZXRfdCBpID0gMDsgaSA8IHZhbHVlcy0+c2l6ZSgpOyArK2kpIHsKKyAgICBpZiAoIVZlcmlmeUFueVVuaXF1ZUFsaWFzZXMoCisgICAgICAgIHZlcmlmaWVyLCAgdmFsdWVzLT5HZXQoaSksIHR5cGVzLT5HZXRFbnVtPEFueVVuaXF1ZUFsaWFzZXM+KGkpKSkgeworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgfQorICByZXR1cm4gdHJ1ZTsKK30KKworaW5saW5lIHZvaWQgKkFueVVuaXF1ZUFsaWFzZXNVbmlvbjo6VW5QYWNrKGNvbnN0IHZvaWQgKm9iaiwgQW55VW5pcXVlQWxpYXNlcyB0eXBlLCBjb25zdCBmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqcmVzb2x2ZXIpIHsKKyAgKHZvaWQpcmVzb2x2ZXI7CisgIHN3aXRjaCAodHlwZSkgeworICAgIGNhc2UgQW55VW5pcXVlQWxpYXNlc19NOiB7CisgICAgICBhdXRvIHB0ciA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgTXlHYW1lOjpFeGFtcGxlOjpNb25zdGVyICo+KG9iaik7CisgICAgICByZXR1cm4gcHRyLT5VblBhY2socmVzb2x2ZXIpOworICAgIH0KKyAgICBjYXNlIEFueVVuaXF1ZUFsaWFzZXNfVFM6IHsKKyAgICAgIGF1dG8gcHRyID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBNeUdhbWU6OkV4YW1wbGU6OlRlc3RTaW1wbGVUYWJsZVdpdGhFbnVtICo+KG9iaik7CisgICAgICByZXR1cm4gcHRyLT5VblBhY2socmVzb2x2ZXIpOworICAgIH0KKyAgICBjYXNlIEFueVVuaXF1ZUFsaWFzZXNfTTI6IHsKKyAgICAgIGF1dG8gcHRyID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBNeUdhbWU6OkV4YW1wbGUyOjpNb25zdGVyICo+KG9iaik7CisgICAgICByZXR1cm4gcHRyLT5VblBhY2socmVzb2x2ZXIpOworICAgIH0KKyAgICBkZWZhdWx0OiByZXR1cm4gbnVsbHB0cjsKKyAgfQorfQorCitpbmxpbmUgZmxhdGJ1ZmZlcnM6Ok9mZnNldDx2b2lkPiBBbnlVbmlxdWVBbGlhc2VzVW5pb246OlBhY2soZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyKSBjb25zdCB7CisgICh2b2lkKV9yZWhhc2hlcjsKKyAgc3dpdGNoICh0eXBlKSB7CisgICAgY2FzZSBBbnlVbmlxdWVBbGlhc2VzX006IHsKKyAgICAgIGF1dG8gcHRyID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBNeUdhbWU6OkV4YW1wbGU6Ok1vbnN0ZXJUICo+KHZhbHVlKTsKKyAgICAgIHJldHVybiBDcmVhdGVNb25zdGVyKF9mYmIsIHB0ciwgX3JlaGFzaGVyKS5VbmlvbigpOworICAgIH0KKyAgICBjYXNlIEFueVVuaXF1ZUFsaWFzZXNfVFM6IHsKKyAgICAgIGF1dG8gcHRyID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBNeUdhbWU6OkV4YW1wbGU6OlRlc3RTaW1wbGVUYWJsZVdpdGhFbnVtVCAqPih2YWx1ZSk7CisgICAgICByZXR1cm4gQ3JlYXRlVGVzdFNpbXBsZVRhYmxlV2l0aEVudW0oX2ZiYiwgcHRyLCBfcmVoYXNoZXIpLlVuaW9uKCk7CisgICAgfQorICAgIGNhc2UgQW55VW5pcXVlQWxpYXNlc19NMjogeworICAgICAgYXV0byBwdHIgPSByZWludGVycHJldF9jYXN0PGNvbnN0IE15R2FtZTo6RXhhbXBsZTI6Ok1vbnN0ZXJUICo+KHZhbHVlKTsKKyAgICAgIHJldHVybiBDcmVhdGVNb25zdGVyKF9mYmIsIHB0ciwgX3JlaGFzaGVyKS5VbmlvbigpOworICAgIH0KKyAgICBkZWZhdWx0OiByZXR1cm4gMDsKKyAgfQorfQorCitpbmxpbmUgQW55VW5pcXVlQWxpYXNlc1VuaW9uOjpBbnlVbmlxdWVBbGlhc2VzVW5pb24oY29uc3QgQW55VW5pcXVlQWxpYXNlc1VuaW9uICZ1KSA6IHR5cGUodS50eXBlKSwgdmFsdWUobnVsbHB0cikgeworICBzd2l0Y2ggKHR5cGUpIHsKKyAgICBjYXNlIEFueVVuaXF1ZUFsaWFzZXNfTTogeworICAgICAgdmFsdWUgPSBuZXcgTXlHYW1lOjpFeGFtcGxlOjpNb25zdGVyVCgqcmVpbnRlcnByZXRfY2FzdDxNeUdhbWU6OkV4YW1wbGU6Ok1vbnN0ZXJUICo+KHUudmFsdWUpKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIEFueVVuaXF1ZUFsaWFzZXNfVFM6IHsKKyAgICAgIHZhbHVlID0gbmV3IE15R2FtZTo6RXhhbXBsZTo6VGVzdFNpbXBsZVRhYmxlV2l0aEVudW1UKCpyZWludGVycHJldF9jYXN0PE15R2FtZTo6RXhhbXBsZTo6VGVzdFNpbXBsZVRhYmxlV2l0aEVudW1UICo+KHUudmFsdWUpKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIEFueVVuaXF1ZUFsaWFzZXNfTTI6IHsKKyAgICAgIHZhbHVlID0gbmV3IE15R2FtZTo6RXhhbXBsZTI6Ok1vbnN0ZXJUKCpyZWludGVycHJldF9jYXN0PE15R2FtZTo6RXhhbXBsZTI6Ok1vbnN0ZXJUICo+KHUudmFsdWUpKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KK30KKworaW5saW5lIHZvaWQgQW55VW5pcXVlQWxpYXNlc1VuaW9uOjpSZXNldCgpIHsKKyAgc3dpdGNoICh0eXBlKSB7CisgICAgY2FzZSBBbnlVbmlxdWVBbGlhc2VzX006IHsKKyAgICAgIGF1dG8gcHRyID0gcmVpbnRlcnByZXRfY2FzdDxNeUdhbWU6OkV4YW1wbGU6Ok1vbnN0ZXJUICo+KHZhbHVlKTsKKyAgICAgIGRlbGV0ZSBwdHI7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBBbnlVbmlxdWVBbGlhc2VzX1RTOiB7CisgICAgICBhdXRvIHB0ciA9IHJlaW50ZXJwcmV0X2Nhc3Q8TXlHYW1lOjpFeGFtcGxlOjpUZXN0U2ltcGxlVGFibGVXaXRoRW51bVQgKj4odmFsdWUpOworICAgICAgZGVsZXRlIHB0cjsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIEFueVVuaXF1ZUFsaWFzZXNfTTI6IHsKKyAgICAgIGF1dG8gcHRyID0gcmVpbnRlcnByZXRfY2FzdDxNeUdhbWU6OkV4YW1wbGUyOjpNb25zdGVyVCAqPih2YWx1ZSk7CisgICAgICBkZWxldGUgcHRyOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGRlZmF1bHQ6IGJyZWFrOworICB9CisgIHZhbHVlID0gbnVsbHB0cjsKKyAgdHlwZSA9IEFueVVuaXF1ZUFsaWFzZXNfTk9ORTsKK30KKworaW5saW5lIGJvb2wgVmVyaWZ5QW55QW1iaWd1b3VzQWxpYXNlcyhmbGF0YnVmZmVyczo6VmVyaWZpZXIgJnZlcmlmaWVyLCBjb25zdCB2b2lkICpvYmosIEFueUFtYmlndW91c0FsaWFzZXMgdHlwZSkgeworICBzd2l0Y2ggKHR5cGUpIHsKKyAgICBjYXNlIEFueUFtYmlndW91c0FsaWFzZXNfTk9ORTogeworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIGNhc2UgQW55QW1iaWd1b3VzQWxpYXNlc19NMTogeworICAgICAgYXV0byBwdHIgPSByZWludGVycHJldF9jYXN0PGNvbnN0IE15R2FtZTo6RXhhbXBsZTo6TW9uc3RlciAqPihvYmopOworICAgICAgcmV0dXJuIHZlcmlmaWVyLlZlcmlmeVRhYmxlKHB0cik7CisgICAgfQorICAgIGNhc2UgQW55QW1iaWd1b3VzQWxpYXNlc19NMjogeworICAgICAgYXV0byBwdHIgPSByZWludGVycHJldF9jYXN0PGNvbnN0IE15R2FtZTo6RXhhbXBsZTo6TW9uc3RlciAqPihvYmopOworICAgICAgcmV0dXJuIHZlcmlmaWVyLlZlcmlmeVRhYmxlKHB0cik7CisgICAgfQorICAgIGNhc2UgQW55QW1iaWd1b3VzQWxpYXNlc19NMzogeworICAgICAgYXV0byBwdHIgPSByZWludGVycHJldF9jYXN0PGNvbnN0IE15R2FtZTo6RXhhbXBsZTo6TW9uc3RlciAqPihvYmopOworICAgICAgcmV0dXJuIHZlcmlmaWVyLlZlcmlmeVRhYmxlKHB0cik7CisgICAgfQorICAgIGRlZmF1bHQ6IHJldHVybiB0cnVlOworICB9Cit9CisKK2lubGluZSBib29sIFZlcmlmeUFueUFtYmlndW91c0FsaWFzZXNWZWN0b3IoZmxhdGJ1ZmZlcnM6OlZlcmlmaWVyICZ2ZXJpZmllciwgY29uc3QgZmxhdGJ1ZmZlcnM6OlZlY3RvcjxmbGF0YnVmZmVyczo6T2Zmc2V0PHZvaWQ+PiAqdmFsdWVzLCBjb25zdCBmbGF0YnVmZmVyczo6VmVjdG9yPHVpbnQ4X3Q+ICp0eXBlcykgeworICBpZiAoIXZhbHVlcyB8fCAhdHlwZXMpIHJldHVybiAhdmFsdWVzICYmICF0eXBlczsKKyAgaWYgKHZhbHVlcy0+c2l6ZSgpICE9IHR5cGVzLT5zaXplKCkpIHJldHVybiBmYWxzZTsKKyAgZm9yIChmbGF0YnVmZmVyczo6dW9mZnNldF90IGkgPSAwOyBpIDwgdmFsdWVzLT5zaXplKCk7ICsraSkgeworICAgIGlmICghVmVyaWZ5QW55QW1iaWd1b3VzQWxpYXNlcygKKyAgICAgICAgdmVyaWZpZXIsICB2YWx1ZXMtPkdldChpKSwgdHlwZXMtPkdldEVudW08QW55QW1iaWd1b3VzQWxpYXNlcz4oaSkpKSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICB9CisgIHJldHVybiB0cnVlOworfQorCitpbmxpbmUgdm9pZCAqQW55QW1iaWd1b3VzQWxpYXNlc1VuaW9uOjpVblBhY2soY29uc3Qgdm9pZCAqb2JqLCBBbnlBbWJpZ3VvdXNBbGlhc2VzIHR5cGUsIGNvbnN0IGZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpyZXNvbHZlcikgeworICAodm9pZClyZXNvbHZlcjsKKyAgc3dpdGNoICh0eXBlKSB7CisgICAgY2FzZSBBbnlBbWJpZ3VvdXNBbGlhc2VzX00xOiB7CisgICAgICBhdXRvIHB0ciA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgTXlHYW1lOjpFeGFtcGxlOjpNb25zdGVyICo+KG9iaik7CisgICAgICByZXR1cm4gcHRyLT5VblBhY2socmVzb2x2ZXIpOworICAgIH0KKyAgICBjYXNlIEFueUFtYmlndW91c0FsaWFzZXNfTTI6IHsKKyAgICAgIGF1dG8gcHRyID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBNeUdhbWU6OkV4YW1wbGU6Ok1vbnN0ZXIgKj4ob2JqKTsKKyAgICAgIHJldHVybiBwdHItPlVuUGFjayhyZXNvbHZlcik7CisgICAgfQorICAgIGNhc2UgQW55QW1iaWd1b3VzQWxpYXNlc19NMzogeworICAgICAgYXV0byBwdHIgPSByZWludGVycHJldF9jYXN0PGNvbnN0IE15R2FtZTo6RXhhbXBsZTo6TW9uc3RlciAqPihvYmopOworICAgICAgcmV0dXJuIHB0ci0+VW5QYWNrKHJlc29sdmVyKTsKKyAgICB9CisgICAgZGVmYXVsdDogcmV0dXJuIG51bGxwdHI7CisgIH0KK30KKworaW5saW5lIGZsYXRidWZmZXJzOjpPZmZzZXQ8dm9pZD4gQW55QW1iaWd1b3VzQWxpYXNlc1VuaW9uOjpQYWNrKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlcikgY29uc3QgeworICAodm9pZClfcmVoYXNoZXI7CisgIHN3aXRjaCAodHlwZSkgeworICAgIGNhc2UgQW55QW1iaWd1b3VzQWxpYXNlc19NMTogeworICAgICAgYXV0byBwdHIgPSByZWludGVycHJldF9jYXN0PGNvbnN0IE15R2FtZTo6RXhhbXBsZTo6TW9uc3RlclQgKj4odmFsdWUpOworICAgICAgcmV0dXJuIENyZWF0ZU1vbnN0ZXIoX2ZiYiwgcHRyLCBfcmVoYXNoZXIpLlVuaW9uKCk7CisgICAgfQorICAgIGNhc2UgQW55QW1iaWd1b3VzQWxpYXNlc19NMjogeworICAgICAgYXV0byBwdHIgPSByZWludGVycHJldF9jYXN0PGNvbnN0IE15R2FtZTo6RXhhbXBsZTo6TW9uc3RlclQgKj4odmFsdWUpOworICAgICAgcmV0dXJuIENyZWF0ZU1vbnN0ZXIoX2ZiYiwgcHRyLCBfcmVoYXNoZXIpLlVuaW9uKCk7CisgICAgfQorICAgIGNhc2UgQW55QW1iaWd1b3VzQWxpYXNlc19NMzogeworICAgICAgYXV0byBwdHIgPSByZWludGVycHJldF9jYXN0PGNvbnN0IE15R2FtZTo6RXhhbXBsZTo6TW9uc3RlclQgKj4odmFsdWUpOworICAgICAgcmV0dXJuIENyZWF0ZU1vbnN0ZXIoX2ZiYiwgcHRyLCBfcmVoYXNoZXIpLlVuaW9uKCk7CisgICAgfQorICAgIGRlZmF1bHQ6IHJldHVybiAwOworICB9Cit9CisKK2lubGluZSBBbnlBbWJpZ3VvdXNBbGlhc2VzVW5pb246OkFueUFtYmlndW91c0FsaWFzZXNVbmlvbihjb25zdCBBbnlBbWJpZ3VvdXNBbGlhc2VzVW5pb24gJnUpIDogdHlwZSh1LnR5cGUpLCB2YWx1ZShudWxscHRyKSB7CisgIHN3aXRjaCAodHlwZSkgeworICAgIGNhc2UgQW55QW1iaWd1b3VzQWxpYXNlc19NMTogeworICAgICAgdmFsdWUgPSBuZXcgTXlHYW1lOjpFeGFtcGxlOjpNb25zdGVyVCgqcmVpbnRlcnByZXRfY2FzdDxNeUdhbWU6OkV4YW1wbGU6Ok1vbnN0ZXJUICo+KHUudmFsdWUpKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIEFueUFtYmlndW91c0FsaWFzZXNfTTI6IHsKKyAgICAgIHZhbHVlID0gbmV3IE15R2FtZTo6RXhhbXBsZTo6TW9uc3RlclQoKnJlaW50ZXJwcmV0X2Nhc3Q8TXlHYW1lOjpFeGFtcGxlOjpNb25zdGVyVCAqPih1LnZhbHVlKSk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBBbnlBbWJpZ3VvdXNBbGlhc2VzX00zOiB7CisgICAgICB2YWx1ZSA9IG5ldyBNeUdhbWU6OkV4YW1wbGU6Ok1vbnN0ZXJUKCpyZWludGVycHJldF9jYXN0PE15R2FtZTo6RXhhbXBsZTo6TW9uc3RlclQgKj4odS52YWx1ZSkpOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQorfQorCitpbmxpbmUgdm9pZCBBbnlBbWJpZ3VvdXNBbGlhc2VzVW5pb246OlJlc2V0KCkgeworICBzd2l0Y2ggKHR5cGUpIHsKKyAgICBjYXNlIEFueUFtYmlndW91c0FsaWFzZXNfTTE6IHsKKyAgICAgIGF1dG8gcHRyID0gcmVpbnRlcnByZXRfY2FzdDxNeUdhbWU6OkV4YW1wbGU6Ok1vbnN0ZXJUICo+KHZhbHVlKTsKKyAgICAgIGRlbGV0ZSBwdHI7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBBbnlBbWJpZ3VvdXNBbGlhc2VzX00yOiB7CisgICAgICBhdXRvIHB0ciA9IHJlaW50ZXJwcmV0X2Nhc3Q8TXlHYW1lOjpFeGFtcGxlOjpNb25zdGVyVCAqPih2YWx1ZSk7CisgICAgICBkZWxldGUgcHRyOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgQW55QW1iaWd1b3VzQWxpYXNlc19NMzogeworICAgICAgYXV0byBwdHIgPSByZWludGVycHJldF9jYXN0PE15R2FtZTo6RXhhbXBsZTo6TW9uc3RlclQgKj4odmFsdWUpOworICAgICAgZGVsZXRlIHB0cjsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBkZWZhdWx0OiBicmVhazsKKyAgfQorICB2YWx1ZSA9IG51bGxwdHI7CisgIHR5cGUgPSBBbnlBbWJpZ3VvdXNBbGlhc2VzX05PTkU7Cit9CisKK2lubGluZSBjb25zdCBmbGF0YnVmZmVyczo6VHlwZVRhYmxlICpDb2xvclR5cGVUYWJsZSgpIHsKKyAgc3RhdGljIGNvbnN0IGZsYXRidWZmZXJzOjpUeXBlQ29kZSB0eXBlX2NvZGVzW10gPSB7CisgICAgeyBmbGF0YnVmZmVyczo6RVRfVUNIQVIsIDAsIDAgfSwKKyAgICB7IGZsYXRidWZmZXJzOjpFVF9VQ0hBUiwgMCwgMCB9LAorICAgIHsgZmxhdGJ1ZmZlcnM6OkVUX1VDSEFSLCAwLCAwIH0KKyAgfTsKKyAgc3RhdGljIGNvbnN0IGZsYXRidWZmZXJzOjpUeXBlRnVuY3Rpb24gdHlwZV9yZWZzW10gPSB7CisgICAgTXlHYW1lOjpFeGFtcGxlOjpDb2xvclR5cGVUYWJsZQorICB9OworICBzdGF0aWMgY29uc3QgaW50NjRfdCB2YWx1ZXNbXSA9IHsgMSwgMiwgOCB9OworICBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IG5hbWVzW10gPSB7CisgICAgIlJlZCIsCisgICAgIkdyZWVuIiwKKyAgICAiQmx1ZSIKKyAgfTsKKyAgc3RhdGljIGNvbnN0IGZsYXRidWZmZXJzOjpUeXBlVGFibGUgdHQgPSB7CisgICAgZmxhdGJ1ZmZlcnM6OlNUX0VOVU0sIDMsIHR5cGVfY29kZXMsIHR5cGVfcmVmcywgbnVsbHB0ciwgdmFsdWVzLCBuYW1lcworICB9OworICByZXR1cm4gJnR0OworfQorCitpbmxpbmUgY29uc3QgZmxhdGJ1ZmZlcnM6OlR5cGVUYWJsZSAqUmFjZVR5cGVUYWJsZSgpIHsKKyAgc3RhdGljIGNvbnN0IGZsYXRidWZmZXJzOjpUeXBlQ29kZSB0eXBlX2NvZGVzW10gPSB7CisgICAgeyBmbGF0YnVmZmVyczo6RVRfQ0hBUiwgMCwgMCB9LAorICAgIHsgZmxhdGJ1ZmZlcnM6OkVUX0NIQVIsIDAsIDAgfSwKKyAgICB7IGZsYXRidWZmZXJzOjpFVF9DSEFSLCAwLCAwIH0sCisgICAgeyBmbGF0YnVmZmVyczo6RVRfQ0hBUiwgMCwgMCB9CisgIH07CisgIHN0YXRpYyBjb25zdCBmbGF0YnVmZmVyczo6VHlwZUZ1bmN0aW9uIHR5cGVfcmVmc1tdID0geworICAgIE15R2FtZTo6RXhhbXBsZTo6UmFjZVR5cGVUYWJsZQorICB9OworICBzdGF0aWMgY29uc3QgaW50NjRfdCB2YWx1ZXNbXSA9IHsgLTEsIDAsIDEsIDIgfTsKKyAgc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBuYW1lc1tdID0geworICAgICJOb25lIiwKKyAgICAiSHVtYW4iLAorICAgICJEd2FyZiIsCisgICAgIkVsZiIKKyAgfTsKKyAgc3RhdGljIGNvbnN0IGZsYXRidWZmZXJzOjpUeXBlVGFibGUgdHQgPSB7CisgICAgZmxhdGJ1ZmZlcnM6OlNUX0VOVU0sIDQsIHR5cGVfY29kZXMsIHR5cGVfcmVmcywgbnVsbHB0ciwgdmFsdWVzLCBuYW1lcworICB9OworICByZXR1cm4gJnR0OworfQorCitpbmxpbmUgY29uc3QgZmxhdGJ1ZmZlcnM6OlR5cGVUYWJsZSAqTG9uZ0VudW1UeXBlVGFibGUoKSB7CisgIHN0YXRpYyBjb25zdCBmbGF0YnVmZmVyczo6VHlwZUNvZGUgdHlwZV9jb2Rlc1tdID0geworICAgIHsgZmxhdGJ1ZmZlcnM6OkVUX1VMT05HLCAwLCAwIH0sCisgICAgeyBmbGF0YnVmZmVyczo6RVRfVUxPTkcsIDAsIDAgfSwKKyAgICB7IGZsYXRidWZmZXJzOjpFVF9VTE9ORywgMCwgMCB9CisgIH07CisgIHN0YXRpYyBjb25zdCBmbGF0YnVmZmVyczo6VHlwZUZ1bmN0aW9uIHR5cGVfcmVmc1tdID0geworICAgIE15R2FtZTo6RXhhbXBsZTo6TG9uZ0VudW1UeXBlVGFibGUKKyAgfTsKKyAgc3RhdGljIGNvbnN0IGludDY0X3QgdmFsdWVzW10gPSB7IDJVTEwsIDRVTEwsIDEwOTk1MTE2Mjc3NzZVTEwgfTsKKyAgc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBuYW1lc1tdID0geworICAgICJMb25nT25lIiwKKyAgICAiTG9uZ1R3byIsCisgICAgIkxvbmdCaWciCisgIH07CisgIHN0YXRpYyBjb25zdCBmbGF0YnVmZmVyczo6VHlwZVRhYmxlIHR0ID0geworICAgIGZsYXRidWZmZXJzOjpTVF9FTlVNLCAzLCB0eXBlX2NvZGVzLCB0eXBlX3JlZnMsIG51bGxwdHIsIHZhbHVlcywgbmFtZXMKKyAgfTsKKyAgcmV0dXJuICZ0dDsKK30KKworaW5saW5lIGNvbnN0IGZsYXRidWZmZXJzOjpUeXBlVGFibGUgKkFueVR5cGVUYWJsZSgpIHsKKyAgc3RhdGljIGNvbnN0IGZsYXRidWZmZXJzOjpUeXBlQ29kZSB0eXBlX2NvZGVzW10gPSB7CisgICAgeyBmbGF0YnVmZmVyczo6RVRfU0VRVUVOQ0UsIDAsIC0xIH0sCisgICAgeyBmbGF0YnVmZmVyczo6RVRfU0VRVUVOQ0UsIDAsIDAgfSwKKyAgICB7IGZsYXRidWZmZXJzOjpFVF9TRVFVRU5DRSwgMCwgMSB9LAorICAgIHsgZmxhdGJ1ZmZlcnM6OkVUX1NFUVVFTkNFLCAwLCAyIH0KKyAgfTsKKyAgc3RhdGljIGNvbnN0IGZsYXRidWZmZXJzOjpUeXBlRnVuY3Rpb24gdHlwZV9yZWZzW10gPSB7CisgICAgTXlHYW1lOjpFeGFtcGxlOjpNb25zdGVyVHlwZVRhYmxlLAorICAgIE15R2FtZTo6RXhhbXBsZTo6VGVzdFNpbXBsZVRhYmxlV2l0aEVudW1UeXBlVGFibGUsCisgICAgTXlHYW1lOjpFeGFtcGxlMjo6TW9uc3RlclR5cGVUYWJsZQorICB9OworICBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IG5hbWVzW10gPSB7CisgICAgIk5PTkUiLAorICAgICJNb25zdGVyIiwKKyAgICAiVGVzdFNpbXBsZVRhYmxlV2l0aEVudW0iLAorICAgICJNeUdhbWVfRXhhbXBsZTJfTW9uc3RlciIKKyAgfTsKKyAgc3RhdGljIGNvbnN0IGZsYXRidWZmZXJzOjpUeXBlVGFibGUgdHQgPSB7CisgICAgZmxhdGJ1ZmZlcnM6OlNUX1VOSU9OLCA0LCB0eXBlX2NvZGVzLCB0eXBlX3JlZnMsIG51bGxwdHIsIG51bGxwdHIsIG5hbWVzCisgIH07CisgIHJldHVybiAmdHQ7Cit9CisKK2lubGluZSBjb25zdCBmbGF0YnVmZmVyczo6VHlwZVRhYmxlICpBbnlVbmlxdWVBbGlhc2VzVHlwZVRhYmxlKCkgeworICBzdGF0aWMgY29uc3QgZmxhdGJ1ZmZlcnM6OlR5cGVDb2RlIHR5cGVfY29kZXNbXSA9IHsKKyAgICB7IGZsYXRidWZmZXJzOjpFVF9TRVFVRU5DRSwgMCwgLTEgfSwKKyAgICB7IGZsYXRidWZmZXJzOjpFVF9TRVFVRU5DRSwgMCwgMCB9LAorICAgIHsgZmxhdGJ1ZmZlcnM6OkVUX1NFUVVFTkNFLCAwLCAxIH0sCisgICAgeyBmbGF0YnVmZmVyczo6RVRfU0VRVUVOQ0UsIDAsIDIgfQorICB9OworICBzdGF0aWMgY29uc3QgZmxhdGJ1ZmZlcnM6OlR5cGVGdW5jdGlvbiB0eXBlX3JlZnNbXSA9IHsKKyAgICBNeUdhbWU6OkV4YW1wbGU6Ok1vbnN0ZXJUeXBlVGFibGUsCisgICAgTXlHYW1lOjpFeGFtcGxlOjpUZXN0U2ltcGxlVGFibGVXaXRoRW51bVR5cGVUYWJsZSwKKyAgICBNeUdhbWU6OkV4YW1wbGUyOjpNb25zdGVyVHlwZVRhYmxlCisgIH07CisgIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgbmFtZXNbXSA9IHsKKyAgICAiTk9ORSIsCisgICAgIk0iLAorICAgICJUUyIsCisgICAgIk0yIgorICB9OworICBzdGF0aWMgY29uc3QgZmxhdGJ1ZmZlcnM6OlR5cGVUYWJsZSB0dCA9IHsKKyAgICBmbGF0YnVmZmVyczo6U1RfVU5JT04sIDQsIHR5cGVfY29kZXMsIHR5cGVfcmVmcywgbnVsbHB0ciwgbnVsbHB0ciwgbmFtZXMKKyAgfTsKKyAgcmV0dXJuICZ0dDsKK30KKworaW5saW5lIGNvbnN0IGZsYXRidWZmZXJzOjpUeXBlVGFibGUgKkFueUFtYmlndW91c0FsaWFzZXNUeXBlVGFibGUoKSB7CisgIHN0YXRpYyBjb25zdCBmbGF0YnVmZmVyczo6VHlwZUNvZGUgdHlwZV9jb2Rlc1tdID0geworICAgIHsgZmxhdGJ1ZmZlcnM6OkVUX1NFUVVFTkNFLCAwLCAtMSB9LAorICAgIHsgZmxhdGJ1ZmZlcnM6OkVUX1NFUVVFTkNFLCAwLCAwIH0sCisgICAgeyBmbGF0YnVmZmVyczo6RVRfU0VRVUVOQ0UsIDAsIDAgfSwKKyAgICB7IGZsYXRidWZmZXJzOjpFVF9TRVFVRU5DRSwgMCwgMCB9CisgIH07CisgIHN0YXRpYyBjb25zdCBmbGF0YnVmZmVyczo6VHlwZUZ1bmN0aW9uIHR5cGVfcmVmc1tdID0geworICAgIE15R2FtZTo6RXhhbXBsZTo6TW9uc3RlclR5cGVUYWJsZQorICB9OworICBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IG5hbWVzW10gPSB7CisgICAgIk5PTkUiLAorICAgICJNMSIsCisgICAgIk0yIiwKKyAgICAiTTMiCisgIH07CisgIHN0YXRpYyBjb25zdCBmbGF0YnVmZmVyczo6VHlwZVRhYmxlIHR0ID0geworICAgIGZsYXRidWZmZXJzOjpTVF9VTklPTiwgNCwgdHlwZV9jb2RlcywgdHlwZV9yZWZzLCBudWxscHRyLCBudWxscHRyLCBuYW1lcworICB9OworICByZXR1cm4gJnR0OworfQorCit9ICAvLyBuYW1lc3BhY2UgRXhhbXBsZQorCitpbmxpbmUgY29uc3QgZmxhdGJ1ZmZlcnM6OlR5cGVUYWJsZSAqSW5QYXJlbnROYW1lc3BhY2VUeXBlVGFibGUoKSB7CisgIHN0YXRpYyBjb25zdCBmbGF0YnVmZmVyczo6VHlwZVRhYmxlIHR0ID0geworICAgIGZsYXRidWZmZXJzOjpTVF9UQUJMRSwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cgorICB9OworICByZXR1cm4gJnR0OworfQorCituYW1lc3BhY2UgRXhhbXBsZTIgeworCitpbmxpbmUgY29uc3QgZmxhdGJ1ZmZlcnM6OlR5cGVUYWJsZSAqTW9uc3RlclR5cGVUYWJsZSgpIHsKKyAgc3RhdGljIGNvbnN0IGZsYXRidWZmZXJzOjpUeXBlVGFibGUgdHQgPSB7CisgICAgZmxhdGJ1ZmZlcnM6OlNUX1RBQkxFLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyCisgIH07CisgIHJldHVybiAmdHQ7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBFeGFtcGxlMgorCituYW1lc3BhY2UgRXhhbXBsZSB7CisKK2lubGluZSBjb25zdCBmbGF0YnVmZmVyczo6VHlwZVRhYmxlICpUZXN0VHlwZVRhYmxlKCkgeworICBzdGF0aWMgY29uc3QgZmxhdGJ1ZmZlcnM6OlR5cGVDb2RlIHR5cGVfY29kZXNbXSA9IHsKKyAgICB7IGZsYXRidWZmZXJzOjpFVF9TSE9SVCwgMCwgLTEgfSwKKyAgICB7IGZsYXRidWZmZXJzOjpFVF9DSEFSLCAwLCAtMSB9CisgIH07CisgIHN0YXRpYyBjb25zdCBpbnQ2NF90IHZhbHVlc1tdID0geyAwLCAyLCA0IH07CisgIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgbmFtZXNbXSA9IHsKKyAgICAiYSIsCisgICAgImIiCisgIH07CisgIHN0YXRpYyBjb25zdCBmbGF0YnVmZmVyczo6VHlwZVRhYmxlIHR0ID0geworICAgIGZsYXRidWZmZXJzOjpTVF9TVFJVQ1QsIDIsIHR5cGVfY29kZXMsIG51bGxwdHIsIG51bGxwdHIsIHZhbHVlcywgbmFtZXMKKyAgfTsKKyAgcmV0dXJuICZ0dDsKK30KKworaW5saW5lIGNvbnN0IGZsYXRidWZmZXJzOjpUeXBlVGFibGUgKlRlc3RTaW1wbGVUYWJsZVdpdGhFbnVtVHlwZVRhYmxlKCkgeworICBzdGF0aWMgY29uc3QgZmxhdGJ1ZmZlcnM6OlR5cGVDb2RlIHR5cGVfY29kZXNbXSA9IHsKKyAgICB7IGZsYXRidWZmZXJzOjpFVF9VQ0hBUiwgMCwgMCB9CisgIH07CisgIHN0YXRpYyBjb25zdCBmbGF0YnVmZmVyczo6VHlwZUZ1bmN0aW9uIHR5cGVfcmVmc1tdID0geworICAgIE15R2FtZTo6RXhhbXBsZTo6Q29sb3JUeXBlVGFibGUKKyAgfTsKKyAgc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBuYW1lc1tdID0geworICAgICJjb2xvciIKKyAgfTsKKyAgc3RhdGljIGNvbnN0IGZsYXRidWZmZXJzOjpUeXBlVGFibGUgdHQgPSB7CisgICAgZmxhdGJ1ZmZlcnM6OlNUX1RBQkxFLCAxLCB0eXBlX2NvZGVzLCB0eXBlX3JlZnMsIG51bGxwdHIsIG51bGxwdHIsIG5hbWVzCisgIH07CisgIHJldHVybiAmdHQ7Cit9CisKK2lubGluZSBjb25zdCBmbGF0YnVmZmVyczo6VHlwZVRhYmxlICpWZWMzVHlwZVRhYmxlKCkgeworICBzdGF0aWMgY29uc3QgZmxhdGJ1ZmZlcnM6OlR5cGVDb2RlIHR5cGVfY29kZXNbXSA9IHsKKyAgICB7IGZsYXRidWZmZXJzOjpFVF9GTE9BVCwgMCwgLTEgfSwKKyAgICB7IGZsYXRidWZmZXJzOjpFVF9GTE9BVCwgMCwgLTEgfSwKKyAgICB7IGZsYXRidWZmZXJzOjpFVF9GTE9BVCwgMCwgLTEgfSwKKyAgICB7IGZsYXRidWZmZXJzOjpFVF9ET1VCTEUsIDAsIC0xIH0sCisgICAgeyBmbGF0YnVmZmVyczo6RVRfVUNIQVIsIDAsIDAgfSwKKyAgICB7IGZsYXRidWZmZXJzOjpFVF9TRVFVRU5DRSwgMCwgMSB9CisgIH07CisgIHN0YXRpYyBjb25zdCBmbGF0YnVmZmVyczo6VHlwZUZ1bmN0aW9uIHR5cGVfcmVmc1tdID0geworICAgIE15R2FtZTo6RXhhbXBsZTo6Q29sb3JUeXBlVGFibGUsCisgICAgTXlHYW1lOjpFeGFtcGxlOjpUZXN0VHlwZVRhYmxlCisgIH07CisgIHN0YXRpYyBjb25zdCBpbnQ2NF90IHZhbHVlc1tdID0geyAwLCA0LCA4LCAxNiwgMjQsIDI2LCAzMiB9OworICBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IG5hbWVzW10gPSB7CisgICAgIngiLAorICAgICJ5IiwKKyAgICAieiIsCisgICAgInRlc3QxIiwKKyAgICAidGVzdDIiLAorICAgICJ0ZXN0MyIKKyAgfTsKKyAgc3RhdGljIGNvbnN0IGZsYXRidWZmZXJzOjpUeXBlVGFibGUgdHQgPSB7CisgICAgZmxhdGJ1ZmZlcnM6OlNUX1NUUlVDVCwgNiwgdHlwZV9jb2RlcywgdHlwZV9yZWZzLCBudWxscHRyLCB2YWx1ZXMsIG5hbWVzCisgIH07CisgIHJldHVybiAmdHQ7Cit9CisKK2lubGluZSBjb25zdCBmbGF0YnVmZmVyczo6VHlwZVRhYmxlICpBYmlsaXR5VHlwZVRhYmxlKCkgeworICBzdGF0aWMgY29uc3QgZmxhdGJ1ZmZlcnM6OlR5cGVDb2RlIHR5cGVfY29kZXNbXSA9IHsKKyAgICB7IGZsYXRidWZmZXJzOjpFVF9VSU5ULCAwLCAtMSB9LAorICAgIHsgZmxhdGJ1ZmZlcnM6OkVUX1VJTlQsIDAsIC0xIH0KKyAgfTsKKyAgc3RhdGljIGNvbnN0IGludDY0X3QgdmFsdWVzW10gPSB7IDAsIDQsIDggfTsKKyAgc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBuYW1lc1tdID0geworICAgICJpZCIsCisgICAgImRpc3RhbmNlIgorICB9OworICBzdGF0aWMgY29uc3QgZmxhdGJ1ZmZlcnM6OlR5cGVUYWJsZSB0dCA9IHsKKyAgICBmbGF0YnVmZmVyczo6U1RfU1RSVUNULCAyLCB0eXBlX2NvZGVzLCBudWxscHRyLCBudWxscHRyLCB2YWx1ZXMsIG5hbWVzCisgIH07CisgIHJldHVybiAmdHQ7Cit9CisKK2lubGluZSBjb25zdCBmbGF0YnVmZmVyczo6VHlwZVRhYmxlICpTdHJ1Y3RPZlN0cnVjdHNUeXBlVGFibGUoKSB7CisgIHN0YXRpYyBjb25zdCBmbGF0YnVmZmVyczo6VHlwZUNvZGUgdHlwZV9jb2Rlc1tdID0geworICAgIHsgZmxhdGJ1ZmZlcnM6OkVUX1NFUVVFTkNFLCAwLCAwIH0sCisgICAgeyBmbGF0YnVmZmVyczo6RVRfU0VRVUVOQ0UsIDAsIDEgfSwKKyAgICB7IGZsYXRidWZmZXJzOjpFVF9TRVFVRU5DRSwgMCwgMCB9CisgIH07CisgIHN0YXRpYyBjb25zdCBmbGF0YnVmZmVyczo6VHlwZUZ1bmN0aW9uIHR5cGVfcmVmc1tdID0geworICAgIE15R2FtZTo6RXhhbXBsZTo6QWJpbGl0eVR5cGVUYWJsZSwKKyAgICBNeUdhbWU6OkV4YW1wbGU6OlRlc3RUeXBlVGFibGUKKyAgfTsKKyAgc3RhdGljIGNvbnN0IGludDY0X3QgdmFsdWVzW10gPSB7IDAsIDgsIDEyLCAyMCB9OworICBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IG5hbWVzW10gPSB7CisgICAgImEiLAorICAgICJiIiwKKyAgICAiYyIKKyAgfTsKKyAgc3RhdGljIGNvbnN0IGZsYXRidWZmZXJzOjpUeXBlVGFibGUgdHQgPSB7CisgICAgZmxhdGJ1ZmZlcnM6OlNUX1NUUlVDVCwgMywgdHlwZV9jb2RlcywgdHlwZV9yZWZzLCBudWxscHRyLCB2YWx1ZXMsIG5hbWVzCisgIH07CisgIHJldHVybiAmdHQ7Cit9CisKK2lubGluZSBjb25zdCBmbGF0YnVmZmVyczo6VHlwZVRhYmxlICpTdHJ1Y3RPZlN0cnVjdHNPZlN0cnVjdHNUeXBlVGFibGUoKSB7CisgIHN0YXRpYyBjb25zdCBmbGF0YnVmZmVyczo6VHlwZUNvZGUgdHlwZV9jb2Rlc1tdID0geworICAgIHsgZmxhdGJ1ZmZlcnM6OkVUX1NFUVVFTkNFLCAwLCAwIH0KKyAgfTsKKyAgc3RhdGljIGNvbnN0IGZsYXRidWZmZXJzOjpUeXBlRnVuY3Rpb24gdHlwZV9yZWZzW10gPSB7CisgICAgTXlHYW1lOjpFeGFtcGxlOjpTdHJ1Y3RPZlN0cnVjdHNUeXBlVGFibGUKKyAgfTsKKyAgc3RhdGljIGNvbnN0IGludDY0X3QgdmFsdWVzW10gPSB7IDAsIDIwIH07CisgIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgbmFtZXNbXSA9IHsKKyAgICAiYSIKKyAgfTsKKyAgc3RhdGljIGNvbnN0IGZsYXRidWZmZXJzOjpUeXBlVGFibGUgdHQgPSB7CisgICAgZmxhdGJ1ZmZlcnM6OlNUX1NUUlVDVCwgMSwgdHlwZV9jb2RlcywgdHlwZV9yZWZzLCBudWxscHRyLCB2YWx1ZXMsIG5hbWVzCisgIH07CisgIHJldHVybiAmdHQ7Cit9CisKK2lubGluZSBjb25zdCBmbGF0YnVmZmVyczo6VHlwZVRhYmxlICpTdGF0VHlwZVRhYmxlKCkgeworICBzdGF0aWMgY29uc3QgZmxhdGJ1ZmZlcnM6OlR5cGVDb2RlIHR5cGVfY29kZXNbXSA9IHsKKyAgICB7IGZsYXRidWZmZXJzOjpFVF9TVFJJTkcsIDAsIC0xIH0sCisgICAgeyBmbGF0YnVmZmVyczo6RVRfTE9ORywgMCwgLTEgfSwKKyAgICB7IGZsYXRidWZmZXJzOjpFVF9VU0hPUlQsIDAsIC0xIH0KKyAgfTsKKyAgc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBuYW1lc1tdID0geworICAgICJpZCIsCisgICAgInZhbCIsCisgICAgImNvdW50IgorICB9OworICBzdGF0aWMgY29uc3QgZmxhdGJ1ZmZlcnM6OlR5cGVUYWJsZSB0dCA9IHsKKyAgICBmbGF0YnVmZmVyczo6U1RfVEFCTEUsIDMsIHR5cGVfY29kZXMsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIsIG5hbWVzCisgIH07CisgIHJldHVybiAmdHQ7Cit9CisKK2lubGluZSBjb25zdCBmbGF0YnVmZmVyczo6VHlwZVRhYmxlICpSZWZlcnJhYmxlVHlwZVRhYmxlKCkgeworICBzdGF0aWMgY29uc3QgZmxhdGJ1ZmZlcnM6OlR5cGVDb2RlIHR5cGVfY29kZXNbXSA9IHsKKyAgICB7IGZsYXRidWZmZXJzOjpFVF9VTE9ORywgMCwgLTEgfQorICB9OworICBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IG5hbWVzW10gPSB7CisgICAgImlkIgorICB9OworICBzdGF0aWMgY29uc3QgZmxhdGJ1ZmZlcnM6OlR5cGVUYWJsZSB0dCA9IHsKKyAgICBmbGF0YnVmZmVyczo6U1RfVEFCTEUsIDEsIHR5cGVfY29kZXMsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIsIG5hbWVzCisgIH07CisgIHJldHVybiAmdHQ7Cit9CisKK2lubGluZSBjb25zdCBmbGF0YnVmZmVyczo6VHlwZVRhYmxlICpNb25zdGVyVHlwZVRhYmxlKCkgeworICBzdGF0aWMgY29uc3QgZmxhdGJ1ZmZlcnM6OlR5cGVDb2RlIHR5cGVfY29kZXNbXSA9IHsKKyAgICB7IGZsYXRidWZmZXJzOjpFVF9TRVFVRU5DRSwgMCwgMCB9LAorICAgIHsgZmxhdGJ1ZmZlcnM6OkVUX1NIT1JULCAwLCAtMSB9LAorICAgIHsgZmxhdGJ1ZmZlcnM6OkVUX1NIT1JULCAwLCAtMSB9LAorICAgIHsgZmxhdGJ1ZmZlcnM6OkVUX1NUUklORywgMCwgLTEgfSwKKyAgICB7IGZsYXRidWZmZXJzOjpFVF9CT09MLCAwLCAtMSB9LAorICAgIHsgZmxhdGJ1ZmZlcnM6OkVUX1VDSEFSLCAxLCAtMSB9LAorICAgIHsgZmxhdGJ1ZmZlcnM6OkVUX1VDSEFSLCAwLCAxIH0sCisgICAgeyBmbGF0YnVmZmVyczo6RVRfVVRZUEUsIDAsIDIgfSwKKyAgICB7IGZsYXRidWZmZXJzOjpFVF9TRVFVRU5DRSwgMCwgMiB9LAorICAgIHsgZmxhdGJ1ZmZlcnM6OkVUX1NFUVVFTkNFLCAxLCAzIH0sCisgICAgeyBmbGF0YnVmZmVyczo6RVRfU1RSSU5HLCAxLCAtMSB9LAorICAgIHsgZmxhdGJ1ZmZlcnM6OkVUX1NFUVVFTkNFLCAxLCA0IH0sCisgICAgeyBmbGF0YnVmZmVyczo6RVRfU0VRVUVOQ0UsIDAsIDQgfSwKKyAgICB7IGZsYXRidWZmZXJzOjpFVF9VQ0hBUiwgMSwgLTEgfSwKKyAgICB7IGZsYXRidWZmZXJzOjpFVF9TRVFVRU5DRSwgMCwgNSB9LAorICAgIHsgZmxhdGJ1ZmZlcnM6OkVUX0JPT0wsIDAsIC0xIH0sCisgICAgeyBmbGF0YnVmZmVyczo6RVRfSU5ULCAwLCAtMSB9LAorICAgIHsgZmxhdGJ1ZmZlcnM6OkVUX1VJTlQsIDAsIC0xIH0sCisgICAgeyBmbGF0YnVmZmVyczo6RVRfTE9ORywgMCwgLTEgfSwKKyAgICB7IGZsYXRidWZmZXJzOjpFVF9VTE9ORywgMCwgLTEgfSwKKyAgICB7IGZsYXRidWZmZXJzOjpFVF9JTlQsIDAsIC0xIH0sCisgICAgeyBmbGF0YnVmZmVyczo6RVRfVUlOVCwgMCwgLTEgfSwKKyAgICB7IGZsYXRidWZmZXJzOjpFVF9MT05HLCAwLCAtMSB9LAorICAgIHsgZmxhdGJ1ZmZlcnM6OkVUX1VMT05HLCAwLCAtMSB9LAorICAgIHsgZmxhdGJ1ZmZlcnM6OkVUX0JPT0wsIDEsIC0xIH0sCisgICAgeyBmbGF0YnVmZmVyczo6RVRfRkxPQVQsIDAsIC0xIH0sCisgICAgeyBmbGF0YnVmZmVyczo6RVRfRkxPQVQsIDAsIC0xIH0sCisgICAgeyBmbGF0YnVmZmVyczo6RVRfRkxPQVQsIDAsIC0xIH0sCisgICAgeyBmbGF0YnVmZmVyczo6RVRfU1RSSU5HLCAxLCAtMSB9LAorICAgIHsgZmxhdGJ1ZmZlcnM6OkVUX1NFUVVFTkNFLCAxLCA2IH0sCisgICAgeyBmbGF0YnVmZmVyczo6RVRfVUNIQVIsIDEsIC0xIH0sCisgICAgeyBmbGF0YnVmZmVyczo6RVRfU0VRVUVOQ0UsIDEsIDMgfSwKKyAgICB7IGZsYXRidWZmZXJzOjpFVF9MT05HLCAxLCAtMSB9LAorICAgIHsgZmxhdGJ1ZmZlcnM6OkVUX0RPVUJMRSwgMSwgLTEgfSwKKyAgICB7IGZsYXRidWZmZXJzOjpFVF9TRVFVRU5DRSwgMCwgNyB9LAorICAgIHsgZmxhdGJ1ZmZlcnM6OkVUX1NFUVVFTkNFLCAxLCA4IH0sCisgICAgeyBmbGF0YnVmZmVyczo6RVRfVUxPTkcsIDAsIC0xIH0sCisgICAgeyBmbGF0YnVmZmVyczo6RVRfVUxPTkcsIDEsIC0xIH0sCisgICAgeyBmbGF0YnVmZmVyczo6RVRfU0VRVUVOQ0UsIDEsIDggfSwKKyAgICB7IGZsYXRidWZmZXJzOjpFVF9VTE9ORywgMCwgLTEgfSwKKyAgICB7IGZsYXRidWZmZXJzOjpFVF9VTE9ORywgMSwgLTEgfSwKKyAgICB7IGZsYXRidWZmZXJzOjpFVF9VTE9ORywgMCwgLTEgfSwKKyAgICB7IGZsYXRidWZmZXJzOjpFVF9VTE9ORywgMSwgLTEgfSwKKyAgICB7IGZsYXRidWZmZXJzOjpFVF9VVFlQRSwgMCwgOSB9LAorICAgIHsgZmxhdGJ1ZmZlcnM6OkVUX1NFUVVFTkNFLCAwLCA5IH0sCisgICAgeyBmbGF0YnVmZmVyczo6RVRfVVRZUEUsIDAsIDEwIH0sCisgICAgeyBmbGF0YnVmZmVyczo6RVRfU0VRVUVOQ0UsIDAsIDEwIH0sCisgICAgeyBmbGF0YnVmZmVyczo6RVRfVUNIQVIsIDEsIDEgfSwKKyAgICB7IGZsYXRidWZmZXJzOjpFVF9DSEFSLCAwLCAxMSB9LAorICAgIHsgZmxhdGJ1ZmZlcnM6OkVUX1VDSEFSLCAxLCAtMSB9LAorICAgIHsgZmxhdGJ1ZmZlcnM6OkVUX1NFUVVFTkNFLCAxLCA1IH0sCisgICAgeyBmbGF0YnVmZmVyczo6RVRfU0VRVUVOQ0UsIDAsIDMgfSwKKyAgICB7IGZsYXRidWZmZXJzOjpFVF9VTE9ORywgMCwgMTIgfSwKKyAgICB7IGZsYXRidWZmZXJzOjpFVF9VTE9ORywgMCwgMTIgfQorICB9OworICBzdGF0aWMgY29uc3QgZmxhdGJ1ZmZlcnM6OlR5cGVGdW5jdGlvbiB0eXBlX3JlZnNbXSA9IHsKKyAgICBNeUdhbWU6OkV4YW1wbGU6OlZlYzNUeXBlVGFibGUsCisgICAgTXlHYW1lOjpFeGFtcGxlOjpDb2xvclR5cGVUYWJsZSwKKyAgICBNeUdhbWU6OkV4YW1wbGU6OkFueVR5cGVUYWJsZSwKKyAgICBNeUdhbWU6OkV4YW1wbGU6OlRlc3RUeXBlVGFibGUsCisgICAgTXlHYW1lOjpFeGFtcGxlOjpNb25zdGVyVHlwZVRhYmxlLAorICAgIE15R2FtZTo6RXhhbXBsZTo6U3RhdFR5cGVUYWJsZSwKKyAgICBNeUdhbWU6OkV4YW1wbGU6OkFiaWxpdHlUeXBlVGFibGUsCisgICAgTXlHYW1lOjpJblBhcmVudE5hbWVzcGFjZVR5cGVUYWJsZSwKKyAgICBNeUdhbWU6OkV4YW1wbGU6OlJlZmVycmFibGVUeXBlVGFibGUsCisgICAgTXlHYW1lOjpFeGFtcGxlOjpBbnlVbmlxdWVBbGlhc2VzVHlwZVRhYmxlLAorICAgIE15R2FtZTo6RXhhbXBsZTo6QW55QW1iaWd1b3VzQWxpYXNlc1R5cGVUYWJsZSwKKyAgICBNeUdhbWU6OkV4YW1wbGU6OlJhY2VUeXBlVGFibGUsCisgICAgTXlHYW1lOjpFeGFtcGxlOjpMb25nRW51bVR5cGVUYWJsZQorICB9OworICBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IG5hbWVzW10gPSB7CisgICAgInBvcyIsCisgICAgIm1hbmEiLAorICAgICJocCIsCisgICAgIm5hbWUiLAorICAgICJmcmllbmRseSIsCisgICAgImludmVudG9yeSIsCisgICAgImNvbG9yIiwKKyAgICAidGVzdF90eXBlIiwKKyAgICAidGVzdCIsCisgICAgInRlc3Q0IiwKKyAgICAidGVzdGFycmF5b2ZzdHJpbmciLAorICAgICJ0ZXN0YXJyYXlvZnRhYmxlcyIsCisgICAgImVuZW15IiwKKyAgICAidGVzdG5lc3RlZGZsYXRidWZmZXIiLAorICAgICJ0ZXN0ZW1wdHkiLAorICAgICJ0ZXN0Ym9vbCIsCisgICAgInRlc3RoYXNoczMyX2ZudjEiLAorICAgICJ0ZXN0aGFzaHUzMl9mbnYxIiwKKyAgICAidGVzdGhhc2hzNjRfZm52MSIsCisgICAgInRlc3RoYXNodTY0X2ZudjEiLAorICAgICJ0ZXN0aGFzaHMzMl9mbnYxYSIsCisgICAgInRlc3RoYXNodTMyX2ZudjFhIiwKKyAgICAidGVzdGhhc2hzNjRfZm52MWEiLAorICAgICJ0ZXN0aGFzaHU2NF9mbnYxYSIsCisgICAgInRlc3RhcnJheW9mYm9vbHMiLAorICAgICJ0ZXN0ZiIsCisgICAgInRlc3RmMiIsCisgICAgInRlc3RmMyIsCisgICAgInRlc3RhcnJheW9mc3RyaW5nMiIsCisgICAgInRlc3RhcnJheW9mc29ydGVkc3RydWN0IiwKKyAgICAiZmxleCIsCisgICAgInRlc3Q1IiwKKyAgICAidmVjdG9yX29mX2xvbmdzIiwKKyAgICAidmVjdG9yX29mX2RvdWJsZXMiLAorICAgICJwYXJlbnRfbmFtZXNwYWNlX3Rlc3QiLAorICAgICJ2ZWN0b3Jfb2ZfcmVmZXJyYWJsZXMiLAorICAgICJzaW5nbGVfd2Vha19yZWZlcmVuY2UiLAorICAgICJ2ZWN0b3Jfb2Zfd2Vha19yZWZlcmVuY2VzIiwKKyAgICAidmVjdG9yX29mX3N0cm9uZ19yZWZlcnJhYmxlcyIsCisgICAgImNvX293bmluZ19yZWZlcmVuY2UiLAorICAgICJ2ZWN0b3Jfb2ZfY29fb3duaW5nX3JlZmVyZW5jZXMiLAorICAgICJub25fb3duaW5nX3JlZmVyZW5jZSIsCisgICAgInZlY3Rvcl9vZl9ub25fb3duaW5nX3JlZmVyZW5jZXMiLAorICAgICJhbnlfdW5pcXVlX3R5cGUiLAorICAgICJhbnlfdW5pcXVlIiwKKyAgICAiYW55X2FtYmlndW91c190eXBlIiwKKyAgICAiYW55X2FtYmlndW91cyIsCisgICAgInZlY3Rvcl9vZl9lbnVtcyIsCisgICAgInNpZ25lZF9lbnVtIiwKKyAgICAidGVzdHJlcXVpcmVkbmVzdGVkZmxhdGJ1ZmZlciIsCisgICAgInNjYWxhcl9rZXlfc29ydGVkX3RhYmxlcyIsCisgICAgIm5hdGl2ZV9pbmxpbmUiLAorICAgICJsb25nX2VudW1fbm9uX2VudW1fZGVmYXVsdCIsCisgICAgImxvbmdfZW51bV9ub3JtYWxfZGVmYXVsdCIKKyAgfTsKKyAgc3RhdGljIGNvbnN0IGZsYXRidWZmZXJzOjpUeXBlVGFibGUgdHQgPSB7CisgICAgZmxhdGJ1ZmZlcnM6OlNUX1RBQkxFLCA1NCwgdHlwZV9jb2RlcywgdHlwZV9yZWZzLCBudWxscHRyLCBudWxscHRyLCBuYW1lcworICB9OworICByZXR1cm4gJnR0OworfQorCitpbmxpbmUgY29uc3QgZmxhdGJ1ZmZlcnM6OlR5cGVUYWJsZSAqVHlwZUFsaWFzZXNUeXBlVGFibGUoKSB7CisgIHN0YXRpYyBjb25zdCBmbGF0YnVmZmVyczo6VHlwZUNvZGUgdHlwZV9jb2Rlc1tdID0geworICAgIHsgZmxhdGJ1ZmZlcnM6OkVUX0NIQVIsIDAsIC0xIH0sCisgICAgeyBmbGF0YnVmZmVyczo6RVRfVUNIQVIsIDAsIC0xIH0sCisgICAgeyBmbGF0YnVmZmVyczo6RVRfU0hPUlQsIDAsIC0xIH0sCisgICAgeyBmbGF0YnVmZmVyczo6RVRfVVNIT1JULCAwLCAtMSB9LAorICAgIHsgZmxhdGJ1ZmZlcnM6OkVUX0lOVCwgMCwgLTEgfSwKKyAgICB7IGZsYXRidWZmZXJzOjpFVF9VSU5ULCAwLCAtMSB9LAorICAgIHsgZmxhdGJ1ZmZlcnM6OkVUX0xPTkcsIDAsIC0xIH0sCisgICAgeyBmbGF0YnVmZmVyczo6RVRfVUxPTkcsIDAsIC0xIH0sCisgICAgeyBmbGF0YnVmZmVyczo6RVRfRkxPQVQsIDAsIC0xIH0sCisgICAgeyBmbGF0YnVmZmVyczo6RVRfRE9VQkxFLCAwLCAtMSB9LAorICAgIHsgZmxhdGJ1ZmZlcnM6OkVUX0NIQVIsIDEsIC0xIH0sCisgICAgeyBmbGF0YnVmZmVyczo6RVRfRE9VQkxFLCAxLCAtMSB9CisgIH07CisgIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgbmFtZXNbXSA9IHsKKyAgICAiaTgiLAorICAgICJ1OCIsCisgICAgImkxNiIsCisgICAgInUxNiIsCisgICAgImkzMiIsCisgICAgInUzMiIsCisgICAgImk2NCIsCisgICAgInU2NCIsCisgICAgImYzMiIsCisgICAgImY2NCIsCisgICAgInY4IiwKKyAgICAidmY2NCIKKyAgfTsKKyAgc3RhdGljIGNvbnN0IGZsYXRidWZmZXJzOjpUeXBlVGFibGUgdHQgPSB7CisgICAgZmxhdGJ1ZmZlcnM6OlNUX1RBQkxFLCAxMiwgdHlwZV9jb2RlcywgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0ciwgbmFtZXMKKyAgfTsKKyAgcmV0dXJuICZ0dDsKK30KKworaW5saW5lIGNvbnN0IE15R2FtZTo6RXhhbXBsZTo6TW9uc3RlciAqR2V0TW9uc3Rlcihjb25zdCB2b2lkICpidWYpIHsKKyAgcmV0dXJuIGZsYXRidWZmZXJzOjpHZXRSb290PE15R2FtZTo6RXhhbXBsZTo6TW9uc3Rlcj4oYnVmKTsKK30KKworaW5saW5lIGNvbnN0IE15R2FtZTo6RXhhbXBsZTo6TW9uc3RlciAqR2V0U2l6ZVByZWZpeGVkTW9uc3Rlcihjb25zdCB2b2lkICpidWYpIHsKKyAgcmV0dXJuIGZsYXRidWZmZXJzOjpHZXRTaXplUHJlZml4ZWRSb290PE15R2FtZTo6RXhhbXBsZTo6TW9uc3Rlcj4oYnVmKTsKK30KKworaW5saW5lIE1vbnN0ZXIgKkdldE11dGFibGVNb25zdGVyKHZvaWQgKmJ1ZikgeworICByZXR1cm4gZmxhdGJ1ZmZlcnM6OkdldE11dGFibGVSb290PE1vbnN0ZXI+KGJ1Zik7Cit9CisKK2lubGluZSBNeUdhbWU6OkV4YW1wbGU6Ok1vbnN0ZXIgKkdldE11dGFibGVTaXplUHJlZml4ZWRNb25zdGVyKHZvaWQgKmJ1ZikgeworICByZXR1cm4gZmxhdGJ1ZmZlcnM6OkdldE11dGFibGVTaXplUHJlZml4ZWRSb290PE15R2FtZTo6RXhhbXBsZTo6TW9uc3Rlcj4oYnVmKTsKK30KKworaW5saW5lIGNvbnN0IGNoYXIgKk1vbnN0ZXJJZGVudGlmaWVyKCkgeworICByZXR1cm4gIk1PTlMiOworfQorCitpbmxpbmUgYm9vbCBNb25zdGVyQnVmZmVySGFzSWRlbnRpZmllcihjb25zdCB2b2lkICpidWYpIHsKKyAgcmV0dXJuIGZsYXRidWZmZXJzOjpCdWZmZXJIYXNJZGVudGlmaWVyKAorICAgICAgYnVmLCBNb25zdGVySWRlbnRpZmllcigpKTsKK30KKworaW5saW5lIGJvb2wgU2l6ZVByZWZpeGVkTW9uc3RlckJ1ZmZlckhhc0lkZW50aWZpZXIoY29uc3Qgdm9pZCAqYnVmKSB7CisgIHJldHVybiBmbGF0YnVmZmVyczo6QnVmZmVySGFzSWRlbnRpZmllcigKKyAgICAgIGJ1ZiwgTW9uc3RlcklkZW50aWZpZXIoKSwgdHJ1ZSk7Cit9CisKK2lubGluZSBib29sIFZlcmlmeU1vbnN0ZXJCdWZmZXIoCisgICAgZmxhdGJ1ZmZlcnM6OlZlcmlmaWVyICZ2ZXJpZmllcikgeworICByZXR1cm4gdmVyaWZpZXIuVmVyaWZ5QnVmZmVyPE15R2FtZTo6RXhhbXBsZTo6TW9uc3Rlcj4oTW9uc3RlcklkZW50aWZpZXIoKSk7Cit9CisKK2lubGluZSBib29sIFZlcmlmeVNpemVQcmVmaXhlZE1vbnN0ZXJCdWZmZXIoCisgICAgZmxhdGJ1ZmZlcnM6OlZlcmlmaWVyICZ2ZXJpZmllcikgeworICByZXR1cm4gdmVyaWZpZXIuVmVyaWZ5U2l6ZVByZWZpeGVkQnVmZmVyPE15R2FtZTo6RXhhbXBsZTo6TW9uc3Rlcj4oTW9uc3RlcklkZW50aWZpZXIoKSk7Cit9CisKK2lubGluZSBjb25zdCBjaGFyICpNb25zdGVyRXh0ZW5zaW9uKCkgeworICByZXR1cm4gIm1vbiI7Cit9CisKK2lubGluZSB2b2lkIEZpbmlzaE1vbnN0ZXJCdWZmZXIoCisgICAgZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZmYmIsCisgICAgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxNeUdhbWU6OkV4YW1wbGU6Ok1vbnN0ZXI+IHJvb3QpIHsKKyAgZmJiLkZpbmlzaChyb290LCBNb25zdGVySWRlbnRpZmllcigpKTsKK30KKworaW5saW5lIHZvaWQgRmluaXNoU2l6ZVByZWZpeGVkTW9uc3RlckJ1ZmZlcigKKyAgICBmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJmZiYiwKKyAgICBmbGF0YnVmZmVyczo6T2Zmc2V0PE15R2FtZTo6RXhhbXBsZTo6TW9uc3Rlcj4gcm9vdCkgeworICBmYmIuRmluaXNoU2l6ZVByZWZpeGVkKHJvb3QsIE1vbnN0ZXJJZGVudGlmaWVyKCkpOworfQorCitpbmxpbmUgZmxhdGJ1ZmZlcnM6OnVuaXF1ZV9wdHI8TXlHYW1lOjpFeGFtcGxlOjpNb25zdGVyVD4gVW5QYWNrTW9uc3RlcigKKyAgICBjb25zdCB2b2lkICpidWYsCisgICAgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKnJlcyA9IG51bGxwdHIpIHsKKyAgcmV0dXJuIGZsYXRidWZmZXJzOjp1bmlxdWVfcHRyPE15R2FtZTo6RXhhbXBsZTo6TW9uc3RlclQ+KEdldE1vbnN0ZXIoYnVmKS0+VW5QYWNrKHJlcykpOworfQorCitpbmxpbmUgZmxhdGJ1ZmZlcnM6OnVuaXF1ZV9wdHI8TXlHYW1lOjpFeGFtcGxlOjpNb25zdGVyVD4gVW5QYWNrU2l6ZVByZWZpeGVkTW9uc3RlcigKKyAgICBjb25zdCB2b2lkICpidWYsCisgICAgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKnJlcyA9IG51bGxwdHIpIHsKKyAgcmV0dXJuIGZsYXRidWZmZXJzOjp1bmlxdWVfcHRyPE15R2FtZTo6RXhhbXBsZTo6TW9uc3RlclQ+KEdldFNpemVQcmVmaXhlZE1vbnN0ZXIoYnVmKS0+VW5QYWNrKHJlcykpOworfQorCit9ICAvLyBuYW1lc3BhY2UgRXhhbXBsZQorfSAgLy8gbmFtZXNwYWNlIE15R2FtZQorCisjZW5kaWYgIC8vIEZMQVRCVUZGRVJTX0dFTkVSQVRFRF9NT05TVEVSVEVTVF9NWUdBTUVfRVhBTVBMRV9IXwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvbW9uc3RlcmRhdGFfdGVzdC5hZmIgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9tb25zdGVyZGF0YV90ZXN0LmFmYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZTNjMDBmCi0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvbW9uc3RlcmRhdGFfdGVzdC5hZmIKQEAgLTAsMCArMSwyNzYgQEAKKy8vIEFubm90YXRlZCBGbGF0YnVmZmVyIEJpbmFyeQorLy8KKy8vIFNjaGVtYSBmaWxlOiBtb25zdGVyX3Rlc3QuZmJzCisvLyBCaW5hcnkgZmlsZTogbW9uc3RlcmRhdGFfdGVzdC5tb24KKworaGVhZGVyOgorICArMHgwMDAwIHwgNzggMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgIHwgMHgwMDAwMDA3OCAoMTIwKSBMb2M6ICsweDAwNzggICAgICAgICAgICB8IG9mZnNldCB0byByb290IHRhYmxlIGBNeUdhbWUuRXhhbXBsZS5Nb25zdGVyYAorICArMHgwMDA0IHwgNEQgNEYgNEUgNTMgICAgICAgICAgICAgfCBjaGFyWzRdICAgIHwgTU9OUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEZpbGUgSWRlbnRpZmllcgorCitwYWRkaW5nOgorICArMHgwMDA4IHwgMDAgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50OF90WzRdIHwgLi4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHBhZGRpbmcKKwordnRhYmxlIChNeUdhbWUuRXhhbXBsZS5Nb25zdGVyKToKKyAgKzB4MDAwQyB8IDZDIDAwICAgICAgICAgICAgICAgICAgIHwgdWludDE2X3QgICB8IDB4MDA2QyAoMTA4KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBzaXplIG9mIHRoaXMgdnRhYmxlCisgICsweDAwMEUgfCA5NCAwMCAgICAgICAgICAgICAgICAgICB8IHVpbnQxNl90ICAgfCAweDAwOTQgKDE0OCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc2l6ZSBvZiByZWZlcnJpbmcgdGFibGUKKyAgKzB4MDAxMCB8IDA4IDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICB8IDB4MDAwOCAoOCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYHBvc2AgKGlkOiAwKQorICArMHgwMDEyIHwgMDAgMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgIHwgMHgwMDAwICgwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgbWFuYWAgKGlkOiAxKSA8ZGVmYXVsdHMgdG8gMTUwPiAoU2hvcnQpCisgICsweDAwMTQgfCAwNiAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgfCAweDAwMDYgKDYpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBocGAgKGlkOiAyKQorICArMHgwMDE2IHwgMkMgMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgIHwgMHgwMDJDICg0NCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgbmFtZWAgKGlkOiAzKQorICArMHgwMDE4IHwgMDAgMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgIHwgMHgwMDAwICgwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgZnJpZW5kbHlgIChpZDogNCkgPGRlZmF1bHRzIHRvIDA+IChCb29sKQorICArMHgwMDFBIHwgMzAgMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgIHwgMHgwMDMwICg0OCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgaW52ZW50b3J5YCAoaWQ6IDUpCisgICsweDAwMUMgfCAwMCAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgfCAweDAwMDAgKDApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBjb2xvcmAgKGlkOiA2KSA8ZGVmYXVsdHMgdG8gOD4gKFVCeXRlKQorICArMHgwMDFFIHwgMDQgMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgIHwgMHgwMDA0ICg0KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgdGVzdF90eXBlYCAoaWQ6IDcpCisgICsweDAwMjAgfCAzNCAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgfCAweDAwMzQgKDUyKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGB0ZXN0YCAoaWQ6IDgpCisgICsweDAwMjIgfCAzOCAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgfCAweDAwMzggKDU2KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGB0ZXN0NGAgKGlkOiA5KQorICArMHgwMDI0IHwgM0MgMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgIHwgMHgwMDNDICg2MCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgdGVzdGFycmF5b2ZzdHJpbmdgIChpZDogMTApCisgICsweDAwMjYgfCAwMCAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgfCAweDAwMDAgKDApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGB0ZXN0YXJyYXlvZnRhYmxlc2AgKGlkOiAxMSkgPG51bGw+IChWZWN0b3IpCisgICsweDAwMjggfCA0MCAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgfCAweDAwNDAgKDY0KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBlbmVteWAgKGlkOiAxMikKKyAgKzB4MDAyQSB8IDAwIDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICB8IDB4MDAwMCAoMCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYHRlc3RuZXN0ZWRmbGF0YnVmZmVyYCAoaWQ6IDEzKSA8bnVsbD4gKFZlY3RvcikKKyAgKzB4MDAyQyB8IDAwIDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICB8IDB4MDAwMCAoMCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYHRlc3RlbXB0eWAgKGlkOiAxNCkgPG51bGw+IChPYmopCisgICsweDAwMkUgfCAwNSAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgfCAweDAwMDUgKDUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGB0ZXN0Ym9vbGAgKGlkOiAxNSkKKyAgKzB4MDAzMCB8IDQ0IDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICB8IDB4MDA0NCAoNjgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYHRlc3RoYXNoczMyX2ZudjFgIChpZDogMTYpCisgICsweDAwMzIgfCA0OCAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgfCAweDAwNDggKDcyKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGB0ZXN0aGFzaHUzMl9mbnYxYCAoaWQ6IDE3KQorICArMHgwMDM0IHwgNzAgMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgIHwgMHgwMDcwICgxMTIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgdGVzdGhhc2hzNjRfZm52MWAgKGlkOiAxOCkKKyAgKzB4MDAzNiB8IDc4IDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICB8IDB4MDA3OCAoMTIwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYHRlc3RoYXNodTY0X2ZudjFgIChpZDogMTkpCisgICsweDAwMzggfCA0QyAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgfCAweDAwNEMgKDc2KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGB0ZXN0aGFzaHMzMl9mbnYxYWAgKGlkOiAyMCkKKyAgKzB4MDAzQSB8IDUwIDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICB8IDB4MDA1MCAoODApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYHRlc3RoYXNodTMyX2ZudjFhYCAoaWQ6IDIxKQorICArMHgwMDNDIHwgODAgMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgIHwgMHgwMDgwICgxMjgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgdGVzdGhhc2hzNjRfZm52MWFgIChpZDogMjIpCisgICsweDAwM0UgfCA4OCAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgfCAweDAwODggKDEzNikgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGB0ZXN0aGFzaHU2NF9mbnYxYWAgKGlkOiAyMykKKyAgKzB4MDA0MCB8IDU0IDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICB8IDB4MDA1NCAoODQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYHRlc3RhcnJheW9mYm9vbHNgIChpZDogMjQpCisgICsweDAwNDIgfCAwMCAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgfCAweDAwMDAgKDApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGB0ZXN0ZmAgKGlkOiAyNSkgPGRlZmF1bHRzIHRvIDMuMTQxNTkwPiAoRmxvYXQpCisgICsweDAwNDQgfCAwMCAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgfCAweDAwMDAgKDApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGB0ZXN0ZjJgIChpZDogMjYpIDxkZWZhdWx0cyB0byAzLjAwMDAwMD4gKEZsb2F0KQorICArMHgwMDQ2IHwgMDAgMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgIHwgMHgwMDAwICgwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgdGVzdGYzYCAoaWQ6IDI3KSA8ZGVmYXVsdHMgdG8gMC4wMDAwMDA+IChGbG9hdCkKKyAgKzB4MDA0OCB8IDAwIDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICB8IDB4MDAwMCAoMCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYHRlc3RhcnJheW9mc3RyaW5nMmAgKGlkOiAyOCkgPG51bGw+IChWZWN0b3IpCisgICsweDAwNEEgfCA1OCAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgfCAweDAwNTggKDg4KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGB0ZXN0YXJyYXlvZnNvcnRlZHN0cnVjdGAgKGlkOiAyOSkKKyAgKzB4MDA0QyB8IDAwIDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICB8IDB4MDAwMCAoMCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYGZsZXhgIChpZDogMzApIDxudWxsPiAoVmVjdG9yKQorICArMHgwMDRFIHwgNUMgMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgIHwgMHgwMDVDICg5MikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgdGVzdDVgIChpZDogMzEpCisgICsweDAwNTAgfCA2MCAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgfCAweDAwNjAgKDk2KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGB2ZWN0b3Jfb2ZfbG9uZ3NgIChpZDogMzIpCisgICsweDAwNTIgfCA2NCAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgfCAweDAwNjQgKDEwMCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGB2ZWN0b3Jfb2ZfZG91Ymxlc2AgKGlkOiAzMykKKyAgKzB4MDA1NCB8IDAwIDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICB8IDB4MDAwMCAoMCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYHBhcmVudF9uYW1lc3BhY2VfdGVzdGAgKGlkOiAzNCkgPG51bGw+IChPYmopCisgICsweDAwNTYgfCAwMCAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgfCAweDAwMDAgKDApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGB2ZWN0b3Jfb2ZfcmVmZXJyYWJsZXNgIChpZDogMzUpIDxudWxsPiAoVmVjdG9yKQorICArMHgwMDU4IHwgMDAgMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgIHwgMHgwMDAwICgwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgc2luZ2xlX3dlYWtfcmVmZXJlbmNlYCAoaWQ6IDM2KSA8ZGVmYXVsdHMgdG8gMD4gKFVMb25nKQorICArMHgwMDVBIHwgMDAgMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgIHwgMHgwMDAwICgwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgdmVjdG9yX29mX3dlYWtfcmVmZXJlbmNlc2AgKGlkOiAzNykgPG51bGw+IChWZWN0b3IpCisgICsweDAwNUMgfCAwMCAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgfCAweDAwMDAgKDApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGB2ZWN0b3Jfb2Zfc3Ryb25nX3JlZmVycmFibGVzYCAoaWQ6IDM4KSA8bnVsbD4gKFZlY3RvcikKKyAgKzB4MDA1RSB8IDAwIDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICB8IDB4MDAwMCAoMCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYGNvX293bmluZ19yZWZlcmVuY2VgIChpZDogMzkpIDxkZWZhdWx0cyB0byAwPiAoVUxvbmcpCisgICsweDAwNjAgfCAwMCAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgfCAweDAwMDAgKDApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGB2ZWN0b3Jfb2ZfY29fb3duaW5nX3JlZmVyZW5jZXNgIChpZDogNDApIDxudWxsPiAoVmVjdG9yKQorICArMHgwMDYyIHwgMDAgMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgIHwgMHgwMDAwICgwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgbm9uX293bmluZ19yZWZlcmVuY2VgIChpZDogNDEpIDxkZWZhdWx0cyB0byAwPiAoVUxvbmcpCisgICsweDAwNjQgfCAwMCAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgfCAweDAwMDAgKDApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGB2ZWN0b3Jfb2Zfbm9uX293bmluZ19yZWZlcmVuY2VzYCAoaWQ6IDQyKSA8bnVsbD4gKFZlY3RvcikKKyAgKzB4MDA2NiB8IDAwIDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICB8IDB4MDAwMCAoMCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYGFueV91bmlxdWVfdHlwZWAgKGlkOiA0MykgPGRlZmF1bHRzIHRvIDA+IChVVHlwZSkKKyAgKzB4MDA2OCB8IDAwIDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICB8IDB4MDAwMCAoMCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYGFueV91bmlxdWVgIChpZDogNDQpIDxudWxsPiAoVW5pb24pCisgICsweDAwNkEgfCAwMCAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgfCAweDAwMDAgKDApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBhbnlfYW1iaWd1b3VzX3R5cGVgIChpZDogNDUpIDxkZWZhdWx0cyB0byAwPiAoVVR5cGUpCisgICsweDAwNkMgfCAwMCAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgfCAweDAwMDAgKDApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBhbnlfYW1iaWd1b3VzYCAoaWQ6IDQ2KSA8bnVsbD4gKFVuaW9uKQorICArMHgwMDZFIHwgMDAgMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgIHwgMHgwMDAwICgwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgdmVjdG9yX29mX2VudW1zYCAoaWQ6IDQ3KSA8bnVsbD4gKFZlY3RvcikKKyAgKzB4MDA3MCB8IDAwIDAwICAgICAgICAgICAgICAgICAgIHwgVk9mZnNldDE2ICB8IDB4MDAwMCAoMCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYHNpZ25lZF9lbnVtYCAoaWQ6IDQ4KSA8ZGVmYXVsdHMgdG8gLTE+IChCeXRlKQorICArMHgwMDcyIHwgMDAgMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgIHwgMHgwMDAwICgwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgdGVzdHJlcXVpcmVkbmVzdGVkZmxhdGJ1ZmZlcmAgKGlkOiA0OSkgPG51bGw+IChWZWN0b3IpCisgICsweDAwNzQgfCA2OCAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgfCAweDAwNjggKDEwNCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBzY2FsYXJfa2V5X3NvcnRlZF90YWJsZXNgIChpZDogNTApCisgICsweDAwNzYgfCA2QyAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgfCAweDAwNkMgKDEwOCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBuYXRpdmVfaW5saW5lYCAoaWQ6IDUxKQorCityb290X3RhYmxlIChNeUdhbWUuRXhhbXBsZS5Nb25zdGVyKToKKyAgKzB4MDA3OCB8IDZDIDAwIDAwIDAwICAgICAgICAgICAgIHwgU09mZnNldDMyICB8IDB4MDAwMDAwNkMgKDEwOCkgTG9jOiArMHgwMDBDICAgICAgICAgICAgfCBvZmZzZXQgdG8gdnRhYmxlCisgICsweDAwN0MgfCAwMSAgICAgICAgICAgICAgICAgICAgICB8IFVUeXBlOCAgICAgfCAweDAxICgxKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgdGFibGUgZmllbGQgYHRlc3RfdHlwZWAgKFVUeXBlKQorICArMHgwMDdEIHwgMDEgICAgICAgICAgICAgICAgICAgICAgfCB1aW50OF90ICAgIHwgMHgwMSAoMSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHRhYmxlIGZpZWxkIGB0ZXN0Ym9vbGAgKEJvb2wpCisgICsweDAwN0UgfCA1MCAwMCAgICAgICAgICAgICAgICAgICB8IGludDE2X3QgICAgfCAweDAwNTAgKDgwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgdGFibGUgZmllbGQgYGhwYCAoU2hvcnQpCisgICsweDAwODAgfCAwMCAwMCA4MCAzRiAgICAgICAgICAgICB8IGZsb2F0ICAgICAgfCAweDNGODAwMDAwICgxKSAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc3RydWN0IGZpZWxkIGBNeUdhbWUuRXhhbXBsZS5WZWMzLnhgIChGbG9hdCkKKyAgKzB4MDA4NCB8IDAwIDAwIDAwIDQwICAgICAgICAgICAgIHwgZmxvYXQgICAgICB8IDB4NDAwMDAwMDAgKDIpICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJ1Y3QgZmllbGQgYE15R2FtZS5FeGFtcGxlLlZlYzMueWAgKEZsb2F0KQorICArMHgwMDg4IHwgMDAgMDAgNDAgNDAgICAgICAgICAgICAgfCBmbG9hdCAgICAgIHwgMHg0MDQwMDAwMCAoMykgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHN0cnVjdCBmaWVsZCBgTXlHYW1lLkV4YW1wbGUuVmVjMy56YCAoRmxvYXQpCisgICsweDAwOEMgfCAwMCAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQ4X3RbNF0gfCAuLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgcGFkZGluZworICArMHgwMDkwIHwgMDAgMDAgMDAgMDAgMDAgMDAgMDggNDAgfCBkb3VibGUgICAgIHwgMHg0MDA4MDAwMDAwMDAwMDAwICgzKSAgICAgICAgICAgICAgICAgICB8IHN0cnVjdCBmaWVsZCBgTXlHYW1lLkV4YW1wbGUuVmVjMy50ZXN0MWAgKERvdWJsZSkKKyAgKzB4MDA5OCB8IDAyICAgICAgICAgICAgICAgICAgICAgIHwgdWludDhfdCAgICB8IDB4MDIgKDIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJ1Y3QgZmllbGQgYE15R2FtZS5FeGFtcGxlLlZlYzMudGVzdDJgIChVQnl0ZSkKKyAgKzB4MDA5OSB8IDAwICAgICAgICAgICAgICAgICAgICAgIHwgdWludDhfdFsxXSB8IC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBwYWRkaW5nCisgICsweDAwOUEgfCAwNSAwMCAgICAgICAgICAgICAgICAgICB8IGludDE2X3QgICAgfCAweDAwMDUgKDUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc3RydWN0IGZpZWxkIGBNeUdhbWUuRXhhbXBsZS5UZXN0LmFgIChTaG9ydCkKKyAgKzB4MDA5QyB8IDA2ICAgICAgICAgICAgICAgICAgICAgIHwgdWludDhfdCAgICB8IDB4MDYgKDYpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJ1Y3QgZmllbGQgYE15R2FtZS5FeGFtcGxlLlRlc3QuYmAgKEJ5dGUpCisgICsweDAwOUQgfCAwMCAgICAgICAgICAgICAgICAgICAgICB8IHVpbnQ4X3RbMV0gfCAuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgcGFkZGluZworICArMHgwMDlFIHwgMDAgMDAgICAgICAgICAgICAgICAgICAgfCB1aW50OF90WzJdIHwgLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHBhZGRpbmcKKyAgKzB4MDBBMCB8IDAwIDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDhfdFs0XSB8IC4uLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBwYWRkaW5nCisgICsweDAwQTQgfCBBNCAwMSAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgfCAweDAwMDAwMUE0ICg0MjApIExvYzogKzB4MDI0OCAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBuYW1lYCAoc3RyaW5nKQorICArMHgwMEE4IHwgOTQgMDEgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgIHwgMHgwMDAwMDE5NCAoNDA0KSBMb2M6ICsweDAyM0MgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgaW52ZW50b3J5YCAodmVjdG9yKQorICArMHgwMEFDIHwgMkMgMDEgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgIHwgMHgwMDAwMDEyQyAoMzAwKSBMb2M6ICsweDAxRDggICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgdGVzdGAgKHVuaW9uIG9mIHR5cGUgYE1vbnN0ZXJgKQorICArMHgwMEIwIHwgMTAgMDEgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgIHwgMHgwMDAwMDExMCAoMjcyKSBMb2M6ICsweDAxQzAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgdGVzdDRgICh2ZWN0b3IpCisgICsweDAwQjQgfCBEQyAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgfCAweDAwMDAwMERDICgyMjApIExvYzogKzB4MDE5MCAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGB0ZXN0YXJyYXlvZnN0cmluZ2AgKHZlY3RvcikKKyAgKzB4MDBCOCB8IEM0IDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICB8IDB4MDAwMDAwQzQgKDE5NikgTG9jOiArMHgwMTdDICAgICAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYGVuZW15YCAodGFibGUpCisgICsweDAwQkMgfCA0MSBDOSA3OSBERCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgfCAweERENzlDOTQxICgzNzE1NzQ2MTEzKSAgICAgICAgICAgICAgICAgIHwgdGFibGUgZmllbGQgYHRlc3RoYXNoczMyX2ZudjFgIChJbnQpCisgICsweDAwQzAgfCA0MSBDOSA3OSBERCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgfCAweERENzlDOTQxICgzNzE1NzQ2MTEzKSAgICAgICAgICAgICAgICAgIHwgdGFibGUgZmllbGQgYHRlc3RoYXNodTMyX2ZudjFgIChVSW50KQorICArMHgwMEM0IHwgNzEgQTQgODEgOEUgICAgICAgICAgICAgfCB1aW50MzJfdCAgIHwgMHg4RTgxQTQ3MSAoMjM5MDg2MDkxMykgICAgICAgICAgICAgICAgICB8IHRhYmxlIGZpZWxkIGB0ZXN0aGFzaHMzMl9mbnYxYWAgKEludCkKKyAgKzB4MDBDOCB8IDcxIEE0IDgxIDhFICAgICAgICAgICAgIHwgdWludDMyX3QgICB8IDB4OEU4MUE0NzEgKDIzOTA4NjA5MTMpICAgICAgICAgICAgICAgICAgfCB0YWJsZSBmaWVsZCBgdGVzdGhhc2h1MzJfZm52MWFgIChVSW50KQorICArMHgwMENDIHwgQTggMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgIHwgMHgwMDAwMDBBOCAoMTY4KSBMb2M6ICsweDAxNzQgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgdGVzdGFycmF5b2Zib29sc2AgKHZlY3RvcikKKyAgKzB4MDBEMCB8IDg4IDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICB8IDB4MDAwMDAwODggKDEzNikgTG9jOiArMHgwMTU4ICAgICAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYHRlc3RhcnJheW9mc29ydGVkc3RydWN0YCAodmVjdG9yKQorICArMHgwMEQ0IHwgRTAgMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgIHwgMHgwMDAwMDBFMCAoMjI0KSBMb2M6ICsweDAxQjQgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgdGVzdDVgICh2ZWN0b3IpCisgICsweDAwRDggfCAzNCAwMSAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgfCAweDAwMDAwMTM0ICgzMDgpIExvYzogKzB4MDIwQyAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGB2ZWN0b3Jfb2ZfbG9uZ3NgICh2ZWN0b3IpCisgICsweDAwREMgfCAxMCAwMSAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgfCAweDAwMDAwMTEwICgyNzIpIExvYzogKzB4MDFFQyAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGB2ZWN0b3Jfb2ZfZG91Ymxlc2AgKHZlY3RvcikKKyAgKzB4MDBFMCB8IDJDIDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICB8IDB4MDAwMDAwMkMgKDQ0KSBMb2M6ICsweDAxMEMgICAgICAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYHNjYWxhcl9rZXlfc29ydGVkX3RhYmxlc2AgKHZlY3RvcikKKyAgKzB4MDBFNCB8IDAxIDAwICAgICAgICAgICAgICAgICAgIHwgaW50MTZfdCAgICB8IDB4MDAwMSAoMSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJ1Y3QgZmllbGQgYE15R2FtZS5FeGFtcGxlLlRlc3QuYWAgKFNob3J0KQorICArMHgwMEU2IHwgMDIgICAgICAgICAgICAgICAgICAgICAgfCB1aW50OF90ICAgIHwgMHgwMiAoMikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHN0cnVjdCBmaWVsZCBgTXlHYW1lLkV4YW1wbGUuVGVzdC5iYCAoQnl0ZSkKKyAgKzB4MDBFNyB8IDAwICAgICAgICAgICAgICAgICAgICAgIHwgdWludDhfdFsxXSB8IC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBwYWRkaW5nCisgICsweDAwRTggfCA4MSA5MSA3QiBGMiBDRCA4MCAwRiA2RSB8IGludDY0X3QgICAgfCAweDZFMEY4MENERjI3QjkxODEgKDc5MzA2OTkwOTA4NDc1NjgyNTcpIHwgdGFibGUgZmllbGQgYHRlc3RoYXNoczY0X2ZudjFgIChMb25nKQorICArMHgwMEYwIHwgODEgOTEgN0IgRjIgQ0QgODAgMEYgNkUgfCB1aW50NjRfdCAgIHwgMHg2RTBGODBDREYyN0I5MTgxICg3OTMwNjk5MDkwODQ3NTY4MjU3KSB8IHRhYmxlIGZpZWxkIGB0ZXN0aGFzaHU2NF9mbnYxYCAoVUxvbmcpCisgICsweDAwRjggfCBGMSBERCA2NyBDNyBEQyA0OCBGOSA0MyB8IGludDY0X3QgICAgfCAweDQzRjk0OERDQzc2N0RERjEgKDQ4OTgwMjYxODI4MTc2MDMwNTcpIHwgdGFibGUgZmllbGQgYHRlc3RoYXNoczY0X2ZudjFhYCAoTG9uZykKKyAgKzB4MDEwMCB8IEYxIEREIDY3IEM3IERDIDQ4IEY5IDQzIHwgdWludDY0X3QgICB8IDB4NDNGOTQ4RENDNzY3RERGMSAoNDg5ODAyNjE4MjgxNzYwMzA1NykgfCB0YWJsZSBmaWVsZCBgdGVzdGhhc2h1NjRfZm52MWFgIChVTG9uZykKKyAgKzB4MDEwOCB8IDAwIDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDhfdFs0XSB8IC4uLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBwYWRkaW5nCisKK3ZlY3RvciAoTXlHYW1lLkV4YW1wbGUuTW9uc3Rlci5zY2FsYXJfa2V5X3NvcnRlZF90YWJsZXMpOgorICArMHgwMTBDIHwgMDIgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgIHwgMHgwMDAwMDAwMiAoMikgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGxlbmd0aCBvZiB2ZWN0b3IgKCMgaXRlbXMpCisgICsweDAxMTAgfCAxMCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgfCAweDAwMDAwMDEwICgxNikgTG9jOiArMHgwMTIwICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIHRhYmxlWzBdCisgICsweDAxMTQgfCAyOCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgfCAweDAwMDAwMDI4ICg0MCkgTG9jOiArMHgwMTNDICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIHRhYmxlWzFdCisKK3BhZGRpbmc6CisgICsweDAxMTggfCAwMCAwMCAgICAgICAgICAgICAgICAgICB8IHVpbnQ4X3RbMl0gfCAuLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgcGFkZGluZworCit2dGFibGUgKE15R2FtZS5FeGFtcGxlLlN0YXQpOgorICArMHgwMTFBIHwgMDYgMDAgICAgICAgICAgICAgICAgICAgfCB1aW50MTZfdCAgIHwgMHgwMDA2ICg2KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHNpemUgb2YgdGhpcyB2dGFibGUKKyAgKzB4MDExQyB8IDA4IDAwICAgICAgICAgICAgICAgICAgIHwgdWludDE2X3QgICB8IDB4MDAwOCAoOCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBzaXplIG9mIHJlZmVycmluZyB0YWJsZQorICArMHgwMTFFIHwgMDQgMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgIHwgMHgwMDA0ICg0KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgaWRgIChpZDogMCkKKwordGFibGUgKE15R2FtZS5FeGFtcGxlLlN0YXQpOgorICArMHgwMTIwIHwgMDYgMDAgMDAgMDAgICAgICAgICAgICAgfCBTT2Zmc2V0MzIgIHwgMHgwMDAwMDAwNiAoNikgTG9jOiArMHgwMTFBICAgICAgICAgICAgICB8IG9mZnNldCB0byB2dGFibGUKKyAgKzB4MDEyNCB8IDA0IDAwIDAwIDAwICAgICAgICAgICAgIHwgVU9mZnNldDMyICB8IDB4MDAwMDAwMDQgKDQpIExvYzogKzB4MDEyOCAgICAgICAgICAgICAgfCBvZmZzZXQgdG8gZmllbGQgYGlkYCAoc3RyaW5nKQorCitzdHJpbmcgKE15R2FtZS5FeGFtcGxlLlN0YXQuaWQpOgorICArMHgwMTI4IHwgMDQgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgIHwgMHgwMDAwMDAwNCAoNCkgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGxlbmd0aCBvZiBzdHJpbmcKKyAgKzB4MDEyQyB8IDZEIDY5IDczIDczICAgICAgICAgICAgIHwgY2hhcls0XSAgICB8IG1pc3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJpbmcgbGl0ZXJhbAorICArMHgwMTMwIHwgMDAgICAgICAgICAgICAgICAgICAgICAgfCBjaGFyICAgICAgIHwgMHgwMCAoMCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHN0cmluZyB0ZXJtaW5hdG9yCisKK3Z0YWJsZSAoTXlHYW1lLkV4YW1wbGUuU3RhdCk6CisgICsweDAxMzIgfCAwQSAwMCAgICAgICAgICAgICAgICAgICB8IHVpbnQxNl90ICAgfCAweDAwMEEgKDEwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc2l6ZSBvZiB0aGlzIHZ0YWJsZQorICArMHgwMTM0IHwgMTQgMDAgICAgICAgICAgICAgICAgICAgfCB1aW50MTZfdCAgIHwgMHgwMDE0ICgyMCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHNpemUgb2YgcmVmZXJyaW5nIHRhYmxlCisgICsweDAxMzYgfCAwOCAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgfCAweDAwMDggKDgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBpZGAgKGlkOiAwKQorICArMHgwMTM4IHwgMEMgMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgIHwgMHgwMDBDICgxMikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgdmFsYCAoaWQ6IDEpCisgICsweDAxM0EgfCAwNiAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgfCAweDAwMDYgKDYpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBjb3VudGAgKGlkOiAyKQorCit0YWJsZSAoTXlHYW1lLkV4YW1wbGUuU3RhdCk6CisgICsweDAxM0MgfCAwQSAwMCAwMCAwMCAgICAgICAgICAgICB8IFNPZmZzZXQzMiAgfCAweDAwMDAwMDBBICgxMCkgTG9jOiArMHgwMTMyICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIHZ0YWJsZQorICArMHgwMTQwIHwgMDAgMDAgICAgICAgICAgICAgICAgICAgfCB1aW50OF90WzJdIHwgLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHBhZGRpbmcKKyAgKzB4MDE0MiB8IDAxIDAwICAgICAgICAgICAgICAgICAgIHwgdWludDE2X3QgICB8IDB4MDAwMSAoMSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB0YWJsZSBmaWVsZCBgY291bnRgIChVU2hvcnQpCisgICsweDAxNDQgfCAwQyAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgfCAweDAwMDAwMDBDICgxMikgTG9jOiArMHgwMTUwICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBpZGAgKHN0cmluZykKKyAgKzB4MDE0OCB8IDBBIDAwIDAwIDAwIDAwIDAwIDAwIDAwIHwgaW50NjRfdCAgICB8IDB4MDAwMDAwMDAwMDAwMDAwQSAoMTApICAgICAgICAgICAgICAgICAgfCB0YWJsZSBmaWVsZCBgdmFsYCAoTG9uZykKKworc3RyaW5nIChNeUdhbWUuRXhhbXBsZS5TdGF0LmlkKToKKyAgKzB4MDE1MCB8IDAzIDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICB8IDB4MDAwMDAwMDMgKDMpICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBsZW5ndGggb2Ygc3RyaW5nCisgICsweDAxNTQgfCA2OCA2OSA3NCAgICAgICAgICAgICAgICB8IGNoYXJbM10gICAgfCBoaXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nIGxpdGVyYWwKKyAgKzB4MDE1NyB8IDAwICAgICAgICAgICAgICAgICAgICAgIHwgY2hhciAgICAgICB8IDB4MDAgKDApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJpbmcgdGVybWluYXRvcgorCit2ZWN0b3IgKE15R2FtZS5FeGFtcGxlLk1vbnN0ZXIudGVzdGFycmF5b2Zzb3J0ZWRzdHJ1Y3QpOgorICArMHgwMTU4IHwgMDMgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgIHwgMHgwMDAwMDAwMyAoMykgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGxlbmd0aCBvZiB2ZWN0b3IgKCMgaXRlbXMpCisgICsweDAxNUMgfCAwMCAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgfCAweDAwMDAwMDAwICgwKSAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc3RydWN0IGZpZWxkIGBNeUdhbWUuRXhhbXBsZS5BYmlsaXR5LmlkYCAoVUludCkKKyAgKzB4MDE2MCB8IDJEIDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICB8IDB4MDAwMDAwMkQgKDQ1KSAgICAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJ1Y3QgZmllbGQgYE15R2FtZS5FeGFtcGxlLkFiaWxpdHkuZGlzdGFuY2VgIChVSW50KQorICArMHgwMTY0IHwgMDEgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgIHwgMHgwMDAwMDAwMSAoMSkgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHN0cnVjdCBmaWVsZCBgTXlHYW1lLkV4YW1wbGUuQWJpbGl0eS5pZGAgKFVJbnQpCisgICsweDAxNjggfCAxNSAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgfCAweDAwMDAwMDE1ICgyMSkgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc3RydWN0IGZpZWxkIGBNeUdhbWUuRXhhbXBsZS5BYmlsaXR5LmRpc3RhbmNlYCAoVUludCkKKyAgKzB4MDE2QyB8IDA1IDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICB8IDB4MDAwMDAwMDUgKDUpICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJ1Y3QgZmllbGQgYE15R2FtZS5FeGFtcGxlLkFiaWxpdHkuaWRgIChVSW50KQorICArMHgwMTcwIHwgMEMgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgIHwgMHgwMDAwMDAwQyAoMTIpICAgICAgICAgICAgICAgICAgICAgICAgICB8IHN0cnVjdCBmaWVsZCBgTXlHYW1lLkV4YW1wbGUuQWJpbGl0eS5kaXN0YW5jZWAgKFVJbnQpCisKK3ZlY3RvciAoTXlHYW1lLkV4YW1wbGUuTW9uc3Rlci50ZXN0YXJyYXlvZmJvb2xzKToKKyAgKzB4MDE3NCB8IDAzIDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICB8IDB4MDAwMDAwMDMgKDMpICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBsZW5ndGggb2YgdmVjdG9yICgjIGl0ZW1zKQorICArMHgwMTc4IHwgMDEgICAgICAgICAgICAgICAgICAgICAgfCB1aW50OF90ICAgIHwgMHgwMSAoMSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHZhbHVlWzBdCisgICsweDAxNzkgfCAwMCAgICAgICAgICAgICAgICAgICAgICB8IHVpbnQ4X3QgICAgfCAweDAwICgwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgdmFsdWVbMV0KKyAgKzB4MDE3QSB8IDAxICAgICAgICAgICAgICAgICAgICAgIHwgdWludDhfdCAgICB8IDB4MDEgKDEpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB2YWx1ZVsyXQorCit0YWJsZSAoTXlHYW1lLkV4YW1wbGUuTW9uc3Rlcik6CisgICsweDAxN0MgfCBCMCBGRiBGRiBGRiAgICAgICAgICAgICB8IFNPZmZzZXQzMiAgfCAweEZGRkZGRkIwICgtODApIExvYzogKzB4MDFDQyAgICAgICAgICAgIHwgb2Zmc2V0IHRvIHZ0YWJsZQorICArMHgwMTgwIHwgMDQgMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgIHwgMHgwMDAwMDAwNCAoNCkgTG9jOiArMHgwMTg0ICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgbmFtZWAgKHN0cmluZykKKworc3RyaW5nIChNeUdhbWUuRXhhbXBsZS5Nb25zdGVyLm5hbWUpOgorICArMHgwMTg0IHwgMDQgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgIHwgMHgwMDAwMDAwNCAoNCkgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGxlbmd0aCBvZiBzdHJpbmcKKyAgKzB4MDE4OCB8IDQ2IDcyIDY1IDY0ICAgICAgICAgICAgIHwgY2hhcls0XSAgICB8IEZyZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJpbmcgbGl0ZXJhbAorICArMHgwMThDIHwgMDAgICAgICAgICAgICAgICAgICAgICAgfCBjaGFyICAgICAgIHwgMHgwMCAoMCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHN0cmluZyB0ZXJtaW5hdG9yCisKK3BhZGRpbmc6CisgICsweDAxOEQgfCAwMCAwMCAwMCAgICAgICAgICAgICAgICB8IHVpbnQ4X3RbM10gfCAuLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgcGFkZGluZworCit2ZWN0b3IgKE15R2FtZS5FeGFtcGxlLk1vbnN0ZXIudGVzdGFycmF5b2ZzdHJpbmcpOgorICArMHgwMTkwIHwgMDIgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgIHwgMHgwMDAwMDAwMiAoMikgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGxlbmd0aCBvZiB2ZWN0b3IgKCMgaXRlbXMpCisgICsweDAxOTQgfCAxNCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgfCAweDAwMDAwMDE0ICgyMCkgTG9jOiArMHgwMUE4ICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIHN0cmluZ1swXQorICArMHgwMTk4IHwgMDQgMDAgMDAgMDAgICAgICAgICAgICAgfCBVT2Zmc2V0MzIgIHwgMHgwMDAwMDAwNCAoNCkgTG9jOiArMHgwMTlDICAgICAgICAgICAgICB8IG9mZnNldCB0byBzdHJpbmdbMV0KKworc3RyaW5nIChNeUdhbWUuRXhhbXBsZS5Nb25zdGVyLnRlc3RhcnJheW9mc3RyaW5nKToKKyAgKzB4MDE5QyB8IDA1IDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICB8IDB4MDAwMDAwMDUgKDUpICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBsZW5ndGggb2Ygc3RyaW5nCisgICsweDAxQTAgfCA3NCA2NSA3MyA3NCAzMiAgICAgICAgICB8IGNoYXJbNV0gICAgfCB0ZXN0MiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nIGxpdGVyYWwKKyAgKzB4MDFBNSB8IDAwICAgICAgICAgICAgICAgICAgICAgIHwgY2hhciAgICAgICB8IDB4MDAgKDApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJpbmcgdGVybWluYXRvcgorCitwYWRkaW5nOgorICArMHgwMUE2IHwgMDAgMDAgICAgICAgICAgICAgICAgICAgfCB1aW50OF90WzJdIHwgLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHBhZGRpbmcKKworc3RyaW5nIChNeUdhbWUuRXhhbXBsZS5Nb25zdGVyLnRlc3RhcnJheW9mc3RyaW5nKToKKyAgKzB4MDFBOCB8IDA1IDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICB8IDB4MDAwMDAwMDUgKDUpICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBsZW5ndGggb2Ygc3RyaW5nCisgICsweDAxQUMgfCA3NCA2NSA3MyA3NCAzMSAgICAgICAgICB8IGNoYXJbNV0gICAgfCB0ZXN0MSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nIGxpdGVyYWwKKyAgKzB4MDFCMSB8IDAwICAgICAgICAgICAgICAgICAgICAgIHwgY2hhciAgICAgICB8IDB4MDAgKDApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJpbmcgdGVybWluYXRvcgorCitwYWRkaW5nOgorICArMHgwMUIyIHwgMDAgMDAgICAgICAgICAgICAgICAgICAgfCB1aW50OF90WzJdIHwgLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHBhZGRpbmcKKwordmVjdG9yIChNeUdhbWUuRXhhbXBsZS5Nb25zdGVyLnRlc3Q1KToKKyAgKzB4MDFCNCB8IDAyIDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDMyX3QgICB8IDB4MDAwMDAwMDIgKDIpICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBsZW5ndGggb2YgdmVjdG9yICgjIGl0ZW1zKQorICArMHgwMUI4IHwgMEEgMDAgICAgICAgICAgICAgICAgICAgfCBpbnQxNl90ICAgIHwgMHgwMDBBICgxMCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHN0cnVjdCBmaWVsZCBgTXlHYW1lLkV4YW1wbGUuVGVzdC5hYCAoU2hvcnQpCisgICsweDAxQkEgfCAxNCAgICAgICAgICAgICAgICAgICAgICB8IHVpbnQ4X3QgICAgfCAweDE0ICgyMCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc3RydWN0IGZpZWxkIGBNeUdhbWUuRXhhbXBsZS5UZXN0LmJgIChCeXRlKQorICArMHgwMUJCIHwgMDAgICAgICAgICAgICAgICAgICAgICAgfCB1aW50OF90WzFdIHwgLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHBhZGRpbmcKKyAgKzB4MDFCQyB8IDFFIDAwICAgICAgICAgICAgICAgICAgIHwgaW50MTZfdCAgICB8IDB4MDAxRSAoMzApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJ1Y3QgZmllbGQgYE15R2FtZS5FeGFtcGxlLlRlc3QuYWAgKFNob3J0KQorICArMHgwMUJFIHwgMjggICAgICAgICAgICAgICAgICAgICAgfCB1aW50OF90ICAgIHwgMHgyOCAoNDApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHN0cnVjdCBmaWVsZCBgTXlHYW1lLkV4YW1wbGUuVGVzdC5iYCAoQnl0ZSkKKyAgKzB4MDFCRiB8IDAwICAgICAgICAgICAgICAgICAgICAgIHwgdWludDhfdFsxXSB8IC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBwYWRkaW5nCisKK3ZlY3RvciAoTXlHYW1lLkV4YW1wbGUuTW9uc3Rlci50ZXN0NCk6CisgICsweDAxQzAgfCAwMiAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgfCAweDAwMDAwMDAyICgyKSAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgbGVuZ3RoIG9mIHZlY3RvciAoIyBpdGVtcykKKyAgKzB4MDFDNCB8IDBBIDAwICAgICAgICAgICAgICAgICAgIHwgaW50MTZfdCAgICB8IDB4MDAwQSAoMTApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJ1Y3QgZmllbGQgYE15R2FtZS5FeGFtcGxlLlRlc3QuYWAgKFNob3J0KQorICArMHgwMUM2IHwgMTQgICAgICAgICAgICAgICAgICAgICAgfCB1aW50OF90ICAgIHwgMHgxNCAoMjApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHN0cnVjdCBmaWVsZCBgTXlHYW1lLkV4YW1wbGUuVGVzdC5iYCAoQnl0ZSkKKyAgKzB4MDFDNyB8IDAwICAgICAgICAgICAgICAgICAgICAgIHwgdWludDhfdFsxXSB8IC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBwYWRkaW5nCisgICsweDAxQzggfCAxRSAwMCAgICAgICAgICAgICAgICAgICB8IGludDE2X3QgICAgfCAweDAwMUUgKDMwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc3RydWN0IGZpZWxkIGBNeUdhbWUuRXhhbXBsZS5UZXN0LmFgIChTaG9ydCkKKyAgKzB4MDFDQSB8IDI4ICAgICAgICAgICAgICAgICAgICAgIHwgdWludDhfdCAgICB8IDB4MjggKDQwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJ1Y3QgZmllbGQgYE15R2FtZS5FeGFtcGxlLlRlc3QuYmAgKEJ5dGUpCisgICsweDAxQ0IgfCAwMCAgICAgICAgICAgICAgICAgICAgICB8IHVpbnQ4X3RbMV0gfCAuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgcGFkZGluZworCit2dGFibGUgKE15R2FtZS5FeGFtcGxlLk1vbnN0ZXIpOgorICArMHgwMUNDIHwgMEMgMDAgICAgICAgICAgICAgICAgICAgfCB1aW50MTZfdCAgIHwgMHgwMDBDICgxMikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHNpemUgb2YgdGhpcyB2dGFibGUKKyAgKzB4MDFDRSB8IDA4IDAwICAgICAgICAgICAgICAgICAgIHwgdWludDE2X3QgICB8IDB4MDAwOCAoOCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBzaXplIG9mIHJlZmVycmluZyB0YWJsZQorICArMHgwMUQwIHwgMDAgMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgIHwgMHgwMDAwICgwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgcG9zYCAoaWQ6IDApIDxudWxsPiAoT2JqKQorICArMHgwMUQyIHwgMDAgMDAgICAgICAgICAgICAgICAgICAgfCBWT2Zmc2V0MTYgIHwgMHgwMDAwICgwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IG9mZnNldCB0byBmaWVsZCBgbWFuYWAgKGlkOiAxKSA8ZGVmYXVsdHMgdG8gMTUwPiAoU2hvcnQpCisgICsweDAxRDQgfCAwMCAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgfCAweDAwMDAgKDApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBocGAgKGlkOiAyKSA8ZGVmYXVsdHMgdG8gMTAwPiAoU2hvcnQpCisgICsweDAxRDYgfCAwNCAwMCAgICAgICAgICAgICAgICAgICB8IFZPZmZzZXQxNiAgfCAweDAwMDQgKDQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBuYW1lYCAoaWQ6IDMpCisKK3RhYmxlIChNeUdhbWUuRXhhbXBsZS5Nb25zdGVyKToKKyAgKzB4MDFEOCB8IDBDIDAwIDAwIDAwICAgICAgICAgICAgIHwgU09mZnNldDMyICB8IDB4MDAwMDAwMEMgKDEyKSBMb2M6ICsweDAxQ0MgICAgICAgICAgICAgfCBvZmZzZXQgdG8gdnRhYmxlCisgICsweDAxREMgfCAwNCAwMCAwMCAwMCAgICAgICAgICAgICB8IFVPZmZzZXQzMiAgfCAweDAwMDAwMDA0ICg0KSBMb2M6ICsweDAxRTAgICAgICAgICAgICAgIHwgb2Zmc2V0IHRvIGZpZWxkIGBuYW1lYCAoc3RyaW5nKQorCitzdHJpbmcgKE15R2FtZS5FeGFtcGxlLk1vbnN0ZXIubmFtZSk6CisgICsweDAxRTAgfCAwNCAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgfCAweDAwMDAwMDA0ICg0KSAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgbGVuZ3RoIG9mIHN0cmluZworICArMHgwMUU0IHwgNDYgNzIgNjUgNjQgICAgICAgICAgICAgfCBjaGFyWzRdICAgIHwgRnJlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHN0cmluZyBsaXRlcmFsCisgICsweDAxRTggfCAwMCAgICAgICAgICAgICAgICAgICAgICB8IGNoYXIgICAgICAgfCAweDAwICgwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nIHRlcm1pbmF0b3IKKworcGFkZGluZzoKKyAgKzB4MDFFOSB8IDAwIDAwIDAwICAgICAgICAgICAgICAgIHwgdWludDhfdFszXSB8IC4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBwYWRkaW5nCisKK3ZlY3RvciAoTXlHYW1lLkV4YW1wbGUuTW9uc3Rlci52ZWN0b3Jfb2ZfZG91Ymxlcyk6CisgICsweDAxRUMgfCAwMyAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgfCAweDAwMDAwMDAzICgzKSAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgbGVuZ3RoIG9mIHZlY3RvciAoIyBpdGVtcykKKyAgKzB4MDFGMCB8IEZGIEZGIEZGIEZGIEZGIEZGIEVGIEZGIHwgZG91YmxlICAgICB8IDB4RkZFRkZGRkZGRkZGRkZGRiAoLTEuNzk3NjllKzMwOCkgICAgICAgfCB2YWx1ZVswXQorICArMHgwMUY4IHwgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgfCBkb3VibGUgICAgIHwgMHgwMDAwMDAwMDAwMDAwMDAwICgwKSAgICAgICAgICAgICAgICAgICB8IHZhbHVlWzFdCisgICsweDAyMDAgfCBGRiBGRiBGRiBGRiBGRiBGRiBFRiA3RiB8IGRvdWJsZSAgICAgfCAweDdGRUZGRkZGRkZGRkZGRkYgKDEuNzk3NjllKzMwOCkgICAgICAgIHwgdmFsdWVbMl0KKworcGFkZGluZzoKKyAgKzB4MDIwOCB8IDAwIDAwIDAwIDAwICAgICAgICAgICAgIHwgdWludDhfdFs0XSB8IC4uLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBwYWRkaW5nCisKK3ZlY3RvciAoTXlHYW1lLkV4YW1wbGUuTW9uc3Rlci52ZWN0b3Jfb2ZfbG9uZ3MpOgorICArMHgwMjBDIHwgMDUgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50MzJfdCAgIHwgMHgwMDAwMDAwNSAoNSkgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGxlbmd0aCBvZiB2ZWN0b3IgKCMgaXRlbXMpCisgICsweDAyMTAgfCAwMSAwMCAwMCAwMCAwMCAwMCAwMCAwMCB8IGludDY0X3QgICAgfCAweDAwMDAwMDAwMDAwMDAwMDEgKDEpICAgICAgICAgICAgICAgICAgIHwgdmFsdWVbMF0KKyAgKzB4MDIxOCB8IDY0IDAwIDAwIDAwIDAwIDAwIDAwIDAwIHwgaW50NjRfdCAgICB8IDB4MDAwMDAwMDAwMDAwMDA2NCAoMTAwKSAgICAgICAgICAgICAgICAgfCB2YWx1ZVsxXQorICArMHgwMjIwIHwgMTAgMjcgMDAgMDAgMDAgMDAgMDAgMDAgfCBpbnQ2NF90ICAgIHwgMHgwMDAwMDAwMDAwMDAyNzEwICgxMDAwMCkgICAgICAgICAgICAgICB8IHZhbHVlWzJdCisgICsweDAyMjggfCA0MCA0MiAwRiAwMCAwMCAwMCAwMCAwMCB8IGludDY0X3QgICAgfCAweDAwMDAwMDAwMDAwRjQyNDAgKDEwMDAwMDApICAgICAgICAgICAgIHwgdmFsdWVbM10KKyAgKzB4MDIzMCB8IDAwIEUxIEY1IDA1IDAwIDAwIDAwIDAwIHwgaW50NjRfdCAgICB8IDB4MDAwMDAwMDAwNUY1RTEwMCAoMTAwMDAwMDAwKSAgICAgICAgICAgfCB2YWx1ZVs0XQorCitwYWRkaW5nOgorICArMHgwMjM4IHwgMDAgMDAgMDAgMDAgICAgICAgICAgICAgfCB1aW50OF90WzRdIHwgLi4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHBhZGRpbmcKKwordmVjdG9yIChNeUdhbWUuRXhhbXBsZS5Nb25zdGVyLmludmVudG9yeSk6CisgICsweDAyM0MgfCAwNSAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgfCAweDAwMDAwMDA1ICg1KSAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgbGVuZ3RoIG9mIHZlY3RvciAoIyBpdGVtcykKKyAgKzB4MDI0MCB8IDAwICAgICAgICAgICAgICAgICAgICAgIHwgdWludDhfdCAgICB8IDB4MDAgKDApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB2YWx1ZVswXQorICArMHgwMjQxIHwgMDEgICAgICAgICAgICAgICAgICAgICAgfCB1aW50OF90ICAgIHwgMHgwMSAoMSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHZhbHVlWzFdCisgICsweDAyNDIgfCAwMiAgICAgICAgICAgICAgICAgICAgICB8IHVpbnQ4X3QgICAgfCAweDAyICgyKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgdmFsdWVbMl0KKyAgKzB4MDI0MyB8IDAzICAgICAgICAgICAgICAgICAgICAgIHwgdWludDhfdCAgICB8IDB4MDMgKDMpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB2YWx1ZVszXQorICArMHgwMjQ0IHwgMDQgICAgICAgICAgICAgICAgICAgICAgfCB1aW50OF90ICAgIHwgMHgwNCAoNCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHZhbHVlWzRdCisKK3BhZGRpbmc6CisgICsweDAyNDUgfCAwMCAwMCAwMCAgICAgICAgICAgICAgICB8IHVpbnQ4X3RbM10gfCAuLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgcGFkZGluZworCitzdHJpbmcgKE15R2FtZS5FeGFtcGxlLk1vbnN0ZXIubmFtZSk6CisgICsweDAyNDggfCAwOSAwMCAwMCAwMCAgICAgICAgICAgICB8IHVpbnQzMl90ICAgfCAweDAwMDAwMDA5ICg5KSAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgbGVuZ3RoIG9mIHN0cmluZworICArMHgwMjRDIHwgNEQgNzkgNEQgNkYgNkUgNzMgNzQgNjUgfCBjaGFyWzldICAgIHwgTXlNb25zdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHN0cmluZyBsaXRlcmFsCisgICsweDAyNTQgfCA3MiAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgfCByCisgICsweDAyNTUgfCAwMCAgICAgICAgICAgICAgICAgICAgICB8IGNoYXIgICAgICAgfCAweDAwICgwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nIHRlcm1pbmF0b3IKKworcGFkZGluZzoKKyAgKzB4MDI1NiB8IDAwIDAwICAgICAgICAgICAgICAgICAgIHwgdWludDhfdFsyXSB8IC4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBwYWRkaW5nCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9tb3JlX2RlZmF1bHRzL2FiY19nZW5lcmF0ZWQucnMgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9tb3JlX2RlZmF1bHRzL2FiY19nZW5lcmF0ZWQucnMKaW5kZXggODYyMmQ5Yi4uZjJiZGJhZCAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvbW9yZV9kZWZhdWx0cy9hYmNfZ2VuZXJhdGVkLnJzCisrKyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL21vcmVfZGVmYXVsdHMvYWJjX2dlbmVyYXRlZC5ycwpAQCAtMSw3ICsxLDEyIEBACiAvLyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBieSB0aGUgRmxhdEJ1ZmZlcnMgY29tcGlsZXIsIGRvIG5vdCBtb2RpZnkKKy8vIEBnZW5lcmF0ZWQKK2V4dGVybiBjcmF0ZSBhbGxvYzsKIGV4dGVybiBjcmF0ZSBmbGF0YnVmZmVyczsKLXVzZSBzdGQ6Om1lbTsKLXVzZSBzdGQ6OmNtcDo6T3JkZXJpbmc7Cit1c2UgYWxsb2M6OmJveGVkOjpCb3g7Cit1c2UgYWxsb2M6OnN0cmluZzo6e1N0cmluZywgVG9TdHJpbmd9OwordXNlIGFsbG9jOjp2ZWM6OlZlYzsKK3VzZSBjb3JlOjptZW07Cit1c2UgY29yZTo6Y21wOjpPcmRlcmluZzsKIHVzZSBzZWxmOjpmbGF0YnVmZmVyczo6e0VuZGlhblNjYWxhciwgRm9sbG93fTsKIHVzZSBzdXBlcjo6KjsKICNbZGVwcmVjYXRlZChzaW5jZSA9ICIyLjAuMCIsIG5vdGUgPSAiVXNlIGFzc29jaWF0ZWQgY29uc3RhbnRzIGluc3RlYWQuIFRoaXMgd2lsbCBubyBsb25nZXIgYmUgZ2VuZXJhdGVkIGluIDIwMjEuIildCkBAIC00Miw4ICs0Nyw4IEBACiAgICAgfQogICB9CiB9Ci1pbXBsIHN0ZDo6Zm10OjpEZWJ1ZyBmb3IgQUJDIHsKLSAgZm4gZm10KCZzZWxmLCBmOiAmbXV0IHN0ZDo6Zm10OjpGb3JtYXR0ZXIpIC0+IHN0ZDo6Zm10OjpSZXN1bHQgeworaW1wbCBjb3JlOjpmbXQ6OkRlYnVnIGZvciBBQkMgeworICBmbiBmbXQoJnNlbGYsIGY6ICZtdXQgY29yZTo6Zm10OjpGb3JtYXR0ZXIpIC0+IGNvcmU6OmZtdDo6UmVzdWx0IHsKICAgICBpZiBsZXQgU29tZShuYW1lKSA9IHNlbGYudmFyaWFudF9uYW1lKCkgewogICAgICAgZi53cml0ZV9zdHIobmFtZSkKICAgICB9IGVsc2UgewpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvbW9yZV9kZWZhdWx0cy9tb2QucnMgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9tb3JlX2RlZmF1bHRzL21vZC5ycwppbmRleCA2MzlmOGFjLi45NDAyMDRkIDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9tb3JlX2RlZmF1bHRzL21vZC5ycworKysgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9tb3JlX2RlZmF1bHRzL21vZC5ycwpAQCAtMSw0ICsxLDUgQEAKIC8vIEF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGJ5IHRoZSBGbGF0YnVmZmVycyBjb21waWxlci4gRG8gbm90IG1vZGlmeS4KKy8vIEBnZW5lcmF0ZWQKIG1vZCBhYmNfZ2VuZXJhdGVkOwogcHViIHVzZSBzZWxmOjphYmNfZ2VuZXJhdGVkOjoqOwogbW9kIG1vcmVfZGVmYXVsdHNfZ2VuZXJhdGVkOwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvbW9yZV9kZWZhdWx0cy9tb3JlX2RlZmF1bHRzX2dlbmVyYXRlZC5ycyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL21vcmVfZGVmYXVsdHMvbW9yZV9kZWZhdWx0c19nZW5lcmF0ZWQucnMKaW5kZXggMGE4ODEwNS4uMjdmYTY1YyAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvbW9yZV9kZWZhdWx0cy9tb3JlX2RlZmF1bHRzX2dlbmVyYXRlZC5ycworKysgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9tb3JlX2RlZmF1bHRzL21vcmVfZGVmYXVsdHNfZ2VuZXJhdGVkLnJzCkBAIC0xLDcgKzEsMTIgQEAKIC8vIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGJ5IHRoZSBGbGF0QnVmZmVycyBjb21waWxlciwgZG8gbm90IG1vZGlmeQorLy8gQGdlbmVyYXRlZAorZXh0ZXJuIGNyYXRlIGFsbG9jOwogZXh0ZXJuIGNyYXRlIGZsYXRidWZmZXJzOwotdXNlIHN0ZDo6bWVtOwotdXNlIHN0ZDo6Y21wOjpPcmRlcmluZzsKK3VzZSBhbGxvYzo6Ym94ZWQ6OkJveDsKK3VzZSBhbGxvYzo6c3RyaW5nOjp7U3RyaW5nLCBUb1N0cmluZ307Cit1c2UgYWxsb2M6OnZlYzo6VmVjOwordXNlIGNvcmU6Om1lbTsKK3VzZSBjb3JlOjpjbXA6Ok9yZGVyaW5nOwogdXNlIHNlbGY6OmZsYXRidWZmZXJzOjp7RW5kaWFuU2NhbGFyLCBGb2xsb3d9OwogdXNlIHN1cGVyOjoqOwogcHViIGVudW0gTW9yZURlZmF1bHRzT2Zmc2V0IHt9CkBAIC0xOTQsOCArMTk5LDggQEAKICAgfQogfQogCi1pbXBsIHN0ZDo6Zm10OjpEZWJ1ZyBmb3IgTW9yZURlZmF1bHRzPCdfPiB7Ci0gIGZuIGZtdCgmc2VsZiwgZjogJm11dCBzdGQ6OmZtdDo6Rm9ybWF0dGVyPCdfPikgLT4gc3RkOjpmbXQ6OlJlc3VsdCB7CitpbXBsIGNvcmU6OmZtdDo6RGVidWcgZm9yIE1vcmVEZWZhdWx0czwnXz4geworICBmbiBmbXQoJnNlbGYsIGY6ICZtdXQgY29yZTo6Zm10OjpGb3JtYXR0ZXI8J18+KSAtPiBjb3JlOjpmbXQ6OlJlc3VsdCB7CiAgICAgbGV0IG11dCBkcyA9IGYuZGVidWdfc3RydWN0KCJNb3JlRGVmYXVsdHMiKTsKICAgICAgIGRzLmZpZWxkKCJpbnRzIiwgJnNlbGYuaW50cygpKTsKICAgICAgIGRzLmZpZWxkKCJmbG9hdHMiLCAmc2VsZi5mbG9hdHMoKSk7CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9teS1nYW1lL2V4YW1wbGUvYWJpbGl0eS5qcyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL215LWdhbWUvZXhhbXBsZS9hYmlsaXR5LmpzCmluZGV4IDlmZWEzZDYuLjRkN2QzZGIgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL215LWdhbWUvZXhhbXBsZS9hYmlsaXR5LmpzCisrKyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL215LWdhbWUvZXhhbXBsZS9hYmlsaXR5LmpzCkBAIC0yNCw3ICsyNCw3IEBACiAgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KICAgICBzdGF0aWMgZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCkgewotICAgICAgICByZXR1cm4gJ015R2FtZS5FeGFtcGxlLkFiaWxpdHknOworICAgICAgICByZXR1cm4gJ015R2FtZV9FeGFtcGxlX0FiaWxpdHknOwogICAgIH0KICAgICBzdGF0aWMgc2l6ZU9mKCkgewogICAgICAgICByZXR1cm4gODsKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL215LWdhbWUvZXhhbXBsZS9hYmlsaXR5LnRzIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvbXktZ2FtZS9leGFtcGxlL2FiaWxpdHkudHMKaW5kZXggMjYzOTVmYi4uMzZiMGViOCAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvbXktZ2FtZS9leGFtcGxlL2FiaWxpdHkudHMKKysrIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvbXktZ2FtZS9leGFtcGxlL2FiaWxpdHkudHMKQEAgLTcsNyArNyw3IEBACiBleHBvcnQgY2xhc3MgQWJpbGl0eSB7CiAgIGJiOiBmbGF0YnVmZmVycy5CeXRlQnVmZmVyfG51bGwgPSBudWxsOwogICBiYl9wb3MgPSAwOwotX19pbml0KGk6bnVtYmVyLCBiYjpmbGF0YnVmZmVycy5CeXRlQnVmZmVyKTpBYmlsaXR5IHsKKyAgX19pbml0KGk6bnVtYmVyLCBiYjpmbGF0YnVmZmVycy5CeXRlQnVmZmVyKTpBYmlsaXR5IHsKICAgdGhpcy5iYl9wb3MgPSBpOwogICB0aGlzLmJiID0gYmI7CiAgIHJldHVybiB0aGlzOwpAQCAtMzIsNyArMzIsNyBAQAogfQogCiBzdGF0aWMgZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCk6c3RyaW5nIHsKLSAgcmV0dXJuICdNeUdhbWUuRXhhbXBsZS5BYmlsaXR5JzsKKyAgcmV0dXJuICdNeUdhbWVfRXhhbXBsZV9BYmlsaXR5JzsKIH0KIAogc3RhdGljIHNpemVPZigpOm51bWJlciB7CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9teS1nYW1lL2V4YW1wbGUvYW55LWFtYmlndW91cy1hbGlhc2VzLnRzIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvbXktZ2FtZS9leGFtcGxlL2FueS1hbWJpZ3VvdXMtYWxpYXNlcy50cwppbmRleCA2Njg3YTQxLi5mYjMwOGZjIDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9teS1nYW1lL2V4YW1wbGUvYW55LWFtYmlndW91cy1hbGlhc2VzLnRzCisrKyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL215LWdhbWUvZXhhbXBsZS9hbnktYW1iaWd1b3VzLWFsaWFzZXMudHMKQEAgLTMsNyArMyw3IEBACiBpbXBvcnQgeyBNb25zdGVyLCBNb25zdGVyVCB9IGZyb20gJy4uLy4uL215LWdhbWUvZXhhbXBsZS9tb25zdGVyJzsKIAogCi1leHBvcnQgZW51bSBBbnlBbWJpZ3VvdXNBbGlhc2VzeworZXhwb3J0IGVudW0gQW55QW1iaWd1b3VzQWxpYXNlcyB7CiAgIE5PTkUgPSAwLAogICBNMSA9IDEsCiAgIE0yID0gMiwKQEAgLTM2LDQgKzM2LDMgQEAKICAgICBkZWZhdWx0OiByZXR1cm4gbnVsbDsKICAgfQogfQotCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9teS1nYW1lL2V4YW1wbGUvYW55LXVuaXF1ZS1hbGlhc2VzLmpzIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvbXktZ2FtZS9leGFtcGxlL2FueS11bmlxdWUtYWxpYXNlcy5qcwppbmRleCBiNWNjODgyLi45OGU1NTk3IDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9teS1nYW1lL2V4YW1wbGUvYW55LXVuaXF1ZS1hbGlhc2VzLmpzCisrKyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL215LWdhbWUvZXhhbXBsZS9hbnktdW5pcXVlLWFsaWFzZXMuanMKQEAgLTEsNSArMSw1IEBACiAvLyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBieSB0aGUgRmxhdEJ1ZmZlcnMgY29tcGlsZXIsIGRvIG5vdCBtb2RpZnkKLWltcG9ydCB7IE1vbnN0ZXIgYXMgTXlHYW1lRXhhbXBsZTJNb25zdGVyIH0gZnJvbSAnLi4vLi4vbXktZ2FtZS9leGFtcGxlMi9tb25zdGVyJzsKK2ltcG9ydCB7IE1vbnN0ZXIgYXMgTXlHYW1lX0V4YW1wbGUyX01vbnN0ZXIgfSBmcm9tICcuLi8uLi9teS1nYW1lL2V4YW1wbGUyL21vbnN0ZXInOwogaW1wb3J0IHsgTW9uc3RlciB9IGZyb20gJy4uLy4uL215LWdhbWUvZXhhbXBsZS9tb25zdGVyJzsKIGltcG9ydCB7IFRlc3RTaW1wbGVUYWJsZVdpdGhFbnVtIH0gZnJvbSAnLi4vLi4vbXktZ2FtZS9leGFtcGxlL3Rlc3Qtc2ltcGxlLXRhYmxlLXdpdGgtZW51bSc7CiBleHBvcnQgdmFyIEFueVVuaXF1ZUFsaWFzZXM7CkBAIC0xNCw3ICsxNCw3IEBACiAgICAgICAgIGNhc2UgJ05PTkUnOiByZXR1cm4gbnVsbDsKICAgICAgICAgY2FzZSAnTSc6IHJldHVybiBhY2Nlc3NvcihuZXcgTW9uc3RlcigpKTsKICAgICAgICAgY2FzZSAnVFMnOiByZXR1cm4gYWNjZXNzb3IobmV3IFRlc3RTaW1wbGVUYWJsZVdpdGhFbnVtKCkpOwotICAgICAgICBjYXNlICdNMic6IHJldHVybiBhY2Nlc3NvcihuZXcgTXlHYW1lRXhhbXBsZTJNb25zdGVyKCkpOworICAgICAgICBjYXNlICdNMic6IHJldHVybiBhY2Nlc3NvcihuZXcgTXlHYW1lX0V4YW1wbGUyX01vbnN0ZXIoKSk7CiAgICAgICAgIGRlZmF1bHQ6IHJldHVybiBudWxsOwogICAgIH0KIH0KQEAgLTIzLDcgKzIzLDcgQEAKICAgICAgICAgY2FzZSAnTk9ORSc6IHJldHVybiBudWxsOwogICAgICAgICBjYXNlICdNJzogcmV0dXJuIGFjY2Vzc29yKGluZGV4LCBuZXcgTW9uc3RlcigpKTsKICAgICAgICAgY2FzZSAnVFMnOiByZXR1cm4gYWNjZXNzb3IoaW5kZXgsIG5ldyBUZXN0U2ltcGxlVGFibGVXaXRoRW51bSgpKTsKLSAgICAgICAgY2FzZSAnTTInOiByZXR1cm4gYWNjZXNzb3IoaW5kZXgsIG5ldyBNeUdhbWVFeGFtcGxlMk1vbnN0ZXIoKSk7CisgICAgICAgIGNhc2UgJ00yJzogcmV0dXJuIGFjY2Vzc29yKGluZGV4LCBuZXcgTXlHYW1lX0V4YW1wbGUyX01vbnN0ZXIoKSk7CiAgICAgICAgIGRlZmF1bHQ6IHJldHVybiBudWxsOwogICAgIH0KIH0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL215LWdhbWUvZXhhbXBsZS9hbnktdW5pcXVlLWFsaWFzZXMudHMgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9teS1nYW1lL2V4YW1wbGUvYW55LXVuaXF1ZS1hbGlhc2VzLnRzCmluZGV4IDUxMDYxNDguLjdjYTc2OWYgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL215LWdhbWUvZXhhbXBsZS9hbnktdW5pcXVlLWFsaWFzZXMudHMKKysrIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvbXktZ2FtZS9leGFtcGxlL2FueS11bmlxdWUtYWxpYXNlcy50cwpAQCAtMSwxMSArMSwxMSBAQAogLy8gYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgYnkgdGhlIEZsYXRCdWZmZXJzIGNvbXBpbGVyLCBkbyBub3QgbW9kaWZ5CiAKLWltcG9ydCB7IE1vbnN0ZXIgYXMgTXlHYW1lRXhhbXBsZTJNb25zdGVyLCBNb25zdGVyVCBhcyBNeUdhbWVFeGFtcGxlMk1vbnN0ZXJUIH0gZnJvbSAnLi4vLi4vbXktZ2FtZS9leGFtcGxlMi9tb25zdGVyJzsKK2ltcG9ydCB7IE1vbnN0ZXIgYXMgTXlHYW1lX0V4YW1wbGUyX01vbnN0ZXIsIE1vbnN0ZXJUIGFzIE15R2FtZV9FeGFtcGxlMl9Nb25zdGVyVCB9IGZyb20gJy4uLy4uL215LWdhbWUvZXhhbXBsZTIvbW9uc3Rlcic7CiBpbXBvcnQgeyBNb25zdGVyLCBNb25zdGVyVCB9IGZyb20gJy4uLy4uL215LWdhbWUvZXhhbXBsZS9tb25zdGVyJzsKIGltcG9ydCB7IFRlc3RTaW1wbGVUYWJsZVdpdGhFbnVtLCBUZXN0U2ltcGxlVGFibGVXaXRoRW51bVQgfSBmcm9tICcuLi8uLi9teS1nYW1lL2V4YW1wbGUvdGVzdC1zaW1wbGUtdGFibGUtd2l0aC1lbnVtJzsKIAogCi1leHBvcnQgZW51bSBBbnlVbmlxdWVBbGlhc2VzeworZXhwb3J0IGVudW0gQW55VW5pcXVlQWxpYXNlcyB7CiAgIE5PTkUgPSAwLAogICBNID0gMSwKICAgVFMgPSAyLApAQCAtMTQsMjggKzE0LDI3IEBACiAKIGV4cG9ydCBmdW5jdGlvbiB1bmlvblRvQW55VW5pcXVlQWxpYXNlcygKICAgdHlwZTogQW55VW5pcXVlQWxpYXNlcywKLSAgYWNjZXNzb3I6IChvYmo6TW9uc3RlcnxNeUdhbWVFeGFtcGxlMk1vbnN0ZXJ8VGVzdFNpbXBsZVRhYmxlV2l0aEVudW0pID0+IE1vbnN0ZXJ8TXlHYW1lRXhhbXBsZTJNb25zdGVyfFRlc3RTaW1wbGVUYWJsZVdpdGhFbnVtfG51bGwKLSk6IE1vbnN0ZXJ8TXlHYW1lRXhhbXBsZTJNb25zdGVyfFRlc3RTaW1wbGVUYWJsZVdpdGhFbnVtfG51bGwgeworICBhY2Nlc3NvcjogKG9iajpNb25zdGVyfE15R2FtZV9FeGFtcGxlMl9Nb25zdGVyfFRlc3RTaW1wbGVUYWJsZVdpdGhFbnVtKSA9PiBNb25zdGVyfE15R2FtZV9FeGFtcGxlMl9Nb25zdGVyfFRlc3RTaW1wbGVUYWJsZVdpdGhFbnVtfG51bGwKKyk6IE1vbnN0ZXJ8TXlHYW1lX0V4YW1wbGUyX01vbnN0ZXJ8VGVzdFNpbXBsZVRhYmxlV2l0aEVudW18bnVsbCB7CiAgIHN3aXRjaChBbnlVbmlxdWVBbGlhc2VzW3R5cGVdKSB7CiAgICAgY2FzZSAnTk9ORSc6IHJldHVybiBudWxsOyAKICAgICBjYXNlICdNJzogcmV0dXJuIGFjY2Vzc29yKG5ldyBNb25zdGVyKCkpISBhcyBNb25zdGVyOwogICAgIGNhc2UgJ1RTJzogcmV0dXJuIGFjY2Vzc29yKG5ldyBUZXN0U2ltcGxlVGFibGVXaXRoRW51bSgpKSEgYXMgVGVzdFNpbXBsZVRhYmxlV2l0aEVudW07Ci0gICAgY2FzZSAnTTInOiByZXR1cm4gYWNjZXNzb3IobmV3IE15R2FtZUV4YW1wbGUyTW9uc3RlcigpKSEgYXMgTXlHYW1lRXhhbXBsZTJNb25zdGVyOworICAgIGNhc2UgJ00yJzogcmV0dXJuIGFjY2Vzc29yKG5ldyBNeUdhbWVfRXhhbXBsZTJfTW9uc3RlcigpKSEgYXMgTXlHYW1lX0V4YW1wbGUyX01vbnN0ZXI7CiAgICAgZGVmYXVsdDogcmV0dXJuIG51bGw7CiAgIH0KIH0KIAogZXhwb3J0IGZ1bmN0aW9uIHVuaW9uTGlzdFRvQW55VW5pcXVlQWxpYXNlcygKICAgdHlwZTogQW55VW5pcXVlQWxpYXNlcywgCi0gIGFjY2Vzc29yOiAoaW5kZXg6IG51bWJlciwgb2JqOk1vbnN0ZXJ8TXlHYW1lRXhhbXBsZTJNb25zdGVyfFRlc3RTaW1wbGVUYWJsZVdpdGhFbnVtKSA9PiBNb25zdGVyfE15R2FtZUV4YW1wbGUyTW9uc3RlcnxUZXN0U2ltcGxlVGFibGVXaXRoRW51bXxudWxsLCAKKyAgYWNjZXNzb3I6IChpbmRleDogbnVtYmVyLCBvYmo6TW9uc3RlcnxNeUdhbWVfRXhhbXBsZTJfTW9uc3RlcnxUZXN0U2ltcGxlVGFibGVXaXRoRW51bSkgPT4gTW9uc3RlcnxNeUdhbWVfRXhhbXBsZTJfTW9uc3RlcnxUZXN0U2ltcGxlVGFibGVXaXRoRW51bXxudWxsLCAKICAgaW5kZXg6IG51bWJlcgotKTogTW9uc3RlcnxNeUdhbWVFeGFtcGxlMk1vbnN0ZXJ8VGVzdFNpbXBsZVRhYmxlV2l0aEVudW18bnVsbCB7CispOiBNb25zdGVyfE15R2FtZV9FeGFtcGxlMl9Nb25zdGVyfFRlc3RTaW1wbGVUYWJsZVdpdGhFbnVtfG51bGwgewogICBzd2l0Y2goQW55VW5pcXVlQWxpYXNlc1t0eXBlXSkgewogICAgIGNhc2UgJ05PTkUnOiByZXR1cm4gbnVsbDsgCiAgICAgY2FzZSAnTSc6IHJldHVybiBhY2Nlc3NvcihpbmRleCwgbmV3IE1vbnN0ZXIoKSkhIGFzIE1vbnN0ZXI7CiAgICAgY2FzZSAnVFMnOiByZXR1cm4gYWNjZXNzb3IoaW5kZXgsIG5ldyBUZXN0U2ltcGxlVGFibGVXaXRoRW51bSgpKSEgYXMgVGVzdFNpbXBsZVRhYmxlV2l0aEVudW07Ci0gICAgY2FzZSAnTTInOiByZXR1cm4gYWNjZXNzb3IoaW5kZXgsIG5ldyBNeUdhbWVFeGFtcGxlMk1vbnN0ZXIoKSkhIGFzIE15R2FtZUV4YW1wbGUyTW9uc3RlcjsKKyAgICBjYXNlICdNMic6IHJldHVybiBhY2Nlc3NvcihpbmRleCwgbmV3IE15R2FtZV9FeGFtcGxlMl9Nb25zdGVyKCkpISBhcyBNeUdhbWVfRXhhbXBsZTJfTW9uc3RlcjsKICAgICBkZWZhdWx0OiByZXR1cm4gbnVsbDsKICAgfQogfQotCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9teS1nYW1lL2V4YW1wbGUvYW55LmpzIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvbXktZ2FtZS9leGFtcGxlL2FueS5qcwppbmRleCA3MzQ5YzA3Li40N2JmYjI1IDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9teS1nYW1lL2V4YW1wbGUvYW55LmpzCisrKyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL215LWdhbWUvZXhhbXBsZS9hbnkuanMKQEAgLTEsNSArMSw1IEBACiAvLyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBieSB0aGUgRmxhdEJ1ZmZlcnMgY29tcGlsZXIsIGRvIG5vdCBtb2RpZnkKLWltcG9ydCB7IE1vbnN0ZXIgYXMgTXlHYW1lRXhhbXBsZTJNb25zdGVyIH0gZnJvbSAnLi4vLi4vbXktZ2FtZS9leGFtcGxlMi9tb25zdGVyJzsKK2ltcG9ydCB7IE1vbnN0ZXIgYXMgTXlHYW1lX0V4YW1wbGUyX01vbnN0ZXIgfSBmcm9tICcuLi8uLi9teS1nYW1lL2V4YW1wbGUyL21vbnN0ZXInOwogaW1wb3J0IHsgTW9uc3RlciB9IGZyb20gJy4uLy4uL215LWdhbWUvZXhhbXBsZS9tb25zdGVyJzsKIGltcG9ydCB7IFRlc3RTaW1wbGVUYWJsZVdpdGhFbnVtIH0gZnJvbSAnLi4vLi4vbXktZ2FtZS9leGFtcGxlL3Rlc3Qtc2ltcGxlLXRhYmxlLXdpdGgtZW51bSc7CiBleHBvcnQgdmFyIEFueTsKQEAgLTE0LDcgKzE0LDcgQEAKICAgICAgICAgY2FzZSAnTk9ORSc6IHJldHVybiBudWxsOwogICAgICAgICBjYXNlICdNb25zdGVyJzogcmV0dXJuIGFjY2Vzc29yKG5ldyBNb25zdGVyKCkpOwogICAgICAgICBjYXNlICdUZXN0U2ltcGxlVGFibGVXaXRoRW51bSc6IHJldHVybiBhY2Nlc3NvcihuZXcgVGVzdFNpbXBsZVRhYmxlV2l0aEVudW0oKSk7Ci0gICAgICAgIGNhc2UgJ015R2FtZV9FeGFtcGxlMl9Nb25zdGVyJzogcmV0dXJuIGFjY2Vzc29yKG5ldyBNeUdhbWVFeGFtcGxlMk1vbnN0ZXIoKSk7CisgICAgICAgIGNhc2UgJ015R2FtZV9FeGFtcGxlMl9Nb25zdGVyJzogcmV0dXJuIGFjY2Vzc29yKG5ldyBNeUdhbWVfRXhhbXBsZTJfTW9uc3RlcigpKTsKICAgICAgICAgZGVmYXVsdDogcmV0dXJuIG51bGw7CiAgICAgfQogfQpAQCAtMjMsNyArMjMsNyBAQAogICAgICAgICBjYXNlICdOT05FJzogcmV0dXJuIG51bGw7CiAgICAgICAgIGNhc2UgJ01vbnN0ZXInOiByZXR1cm4gYWNjZXNzb3IoaW5kZXgsIG5ldyBNb25zdGVyKCkpOwogICAgICAgICBjYXNlICdUZXN0U2ltcGxlVGFibGVXaXRoRW51bSc6IHJldHVybiBhY2Nlc3NvcihpbmRleCwgbmV3IFRlc3RTaW1wbGVUYWJsZVdpdGhFbnVtKCkpOwotICAgICAgICBjYXNlICdNeUdhbWVfRXhhbXBsZTJfTW9uc3Rlcic6IHJldHVybiBhY2Nlc3NvcihpbmRleCwgbmV3IE15R2FtZUV4YW1wbGUyTW9uc3RlcigpKTsKKyAgICAgICAgY2FzZSAnTXlHYW1lX0V4YW1wbGUyX01vbnN0ZXInOiByZXR1cm4gYWNjZXNzb3IoaW5kZXgsIG5ldyBNeUdhbWVfRXhhbXBsZTJfTW9uc3RlcigpKTsKICAgICAgICAgZGVmYXVsdDogcmV0dXJuIG51bGw7CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvbXktZ2FtZS9leGFtcGxlL2FueS50cyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL215LWdhbWUvZXhhbXBsZS9hbnkudHMKaW5kZXggOWQ4YjJhNi4uZjdiYjk0ZiAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvbXktZ2FtZS9leGFtcGxlL2FueS50cworKysgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9teS1nYW1lL2V4YW1wbGUvYW55LnRzCkBAIC0xLDExICsxLDExIEBACiAvLyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBieSB0aGUgRmxhdEJ1ZmZlcnMgY29tcGlsZXIsIGRvIG5vdCBtb2RpZnkKIAotaW1wb3J0IHsgTW9uc3RlciBhcyBNeUdhbWVFeGFtcGxlMk1vbnN0ZXIsIE1vbnN0ZXJUIGFzIE15R2FtZUV4YW1wbGUyTW9uc3RlclQgfSBmcm9tICcuLi8uLi9teS1nYW1lL2V4YW1wbGUyL21vbnN0ZXInOworaW1wb3J0IHsgTW9uc3RlciBhcyBNeUdhbWVfRXhhbXBsZTJfTW9uc3RlciwgTW9uc3RlclQgYXMgTXlHYW1lX0V4YW1wbGUyX01vbnN0ZXJUIH0gZnJvbSAnLi4vLi4vbXktZ2FtZS9leGFtcGxlMi9tb25zdGVyJzsKIGltcG9ydCB7IE1vbnN0ZXIsIE1vbnN0ZXJUIH0gZnJvbSAnLi4vLi4vbXktZ2FtZS9leGFtcGxlL21vbnN0ZXInOwogaW1wb3J0IHsgVGVzdFNpbXBsZVRhYmxlV2l0aEVudW0sIFRlc3RTaW1wbGVUYWJsZVdpdGhFbnVtVCB9IGZyb20gJy4uLy4uL215LWdhbWUvZXhhbXBsZS90ZXN0LXNpbXBsZS10YWJsZS13aXRoLWVudW0nOwogCiAKLWV4cG9ydCBlbnVtIEFueXsKK2V4cG9ydCBlbnVtIEFueSB7CiAgIE5PTkUgPSAwLAogICBNb25zdGVyID0gMSwKICAgVGVzdFNpbXBsZVRhYmxlV2l0aEVudW0gPSAyLApAQCAtMTQsMjggKzE0LDI3IEBACiAKIGV4cG9ydCBmdW5jdGlvbiB1bmlvblRvQW55KAogICB0eXBlOiBBbnksCi0gIGFjY2Vzc29yOiAob2JqOk1vbnN0ZXJ8TXlHYW1lRXhhbXBsZTJNb25zdGVyfFRlc3RTaW1wbGVUYWJsZVdpdGhFbnVtKSA9PiBNb25zdGVyfE15R2FtZUV4YW1wbGUyTW9uc3RlcnxUZXN0U2ltcGxlVGFibGVXaXRoRW51bXxudWxsCi0pOiBNb25zdGVyfE15R2FtZUV4YW1wbGUyTW9uc3RlcnxUZXN0U2ltcGxlVGFibGVXaXRoRW51bXxudWxsIHsKKyAgYWNjZXNzb3I6IChvYmo6TW9uc3RlcnxNeUdhbWVfRXhhbXBsZTJfTW9uc3RlcnxUZXN0U2ltcGxlVGFibGVXaXRoRW51bSkgPT4gTW9uc3RlcnxNeUdhbWVfRXhhbXBsZTJfTW9uc3RlcnxUZXN0U2ltcGxlVGFibGVXaXRoRW51bXxudWxsCispOiBNb25zdGVyfE15R2FtZV9FeGFtcGxlMl9Nb25zdGVyfFRlc3RTaW1wbGVUYWJsZVdpdGhFbnVtfG51bGwgewogICBzd2l0Y2goQW55W3R5cGVdKSB7CiAgICAgY2FzZSAnTk9ORSc6IHJldHVybiBudWxsOyAKICAgICBjYXNlICdNb25zdGVyJzogcmV0dXJuIGFjY2Vzc29yKG5ldyBNb25zdGVyKCkpISBhcyBNb25zdGVyOwogICAgIGNhc2UgJ1Rlc3RTaW1wbGVUYWJsZVdpdGhFbnVtJzogcmV0dXJuIGFjY2Vzc29yKG5ldyBUZXN0U2ltcGxlVGFibGVXaXRoRW51bSgpKSEgYXMgVGVzdFNpbXBsZVRhYmxlV2l0aEVudW07Ci0gICAgY2FzZSAnTXlHYW1lX0V4YW1wbGUyX01vbnN0ZXInOiByZXR1cm4gYWNjZXNzb3IobmV3IE15R2FtZUV4YW1wbGUyTW9uc3RlcigpKSEgYXMgTXlHYW1lRXhhbXBsZTJNb25zdGVyOworICAgIGNhc2UgJ015R2FtZV9FeGFtcGxlMl9Nb25zdGVyJzogcmV0dXJuIGFjY2Vzc29yKG5ldyBNeUdhbWVfRXhhbXBsZTJfTW9uc3RlcigpKSEgYXMgTXlHYW1lX0V4YW1wbGUyX01vbnN0ZXI7CiAgICAgZGVmYXVsdDogcmV0dXJuIG51bGw7CiAgIH0KIH0KIAogZXhwb3J0IGZ1bmN0aW9uIHVuaW9uTGlzdFRvQW55KAogICB0eXBlOiBBbnksIAotICBhY2Nlc3NvcjogKGluZGV4OiBudW1iZXIsIG9iajpNb25zdGVyfE15R2FtZUV4YW1wbGUyTW9uc3RlcnxUZXN0U2ltcGxlVGFibGVXaXRoRW51bSkgPT4gTW9uc3RlcnxNeUdhbWVFeGFtcGxlMk1vbnN0ZXJ8VGVzdFNpbXBsZVRhYmxlV2l0aEVudW18bnVsbCwgCisgIGFjY2Vzc29yOiAoaW5kZXg6IG51bWJlciwgb2JqOk1vbnN0ZXJ8TXlHYW1lX0V4YW1wbGUyX01vbnN0ZXJ8VGVzdFNpbXBsZVRhYmxlV2l0aEVudW0pID0+IE1vbnN0ZXJ8TXlHYW1lX0V4YW1wbGUyX01vbnN0ZXJ8VGVzdFNpbXBsZVRhYmxlV2l0aEVudW18bnVsbCwgCiAgIGluZGV4OiBudW1iZXIKLSk6IE1vbnN0ZXJ8TXlHYW1lRXhhbXBsZTJNb25zdGVyfFRlc3RTaW1wbGVUYWJsZVdpdGhFbnVtfG51bGwgeworKTogTW9uc3RlcnxNeUdhbWVfRXhhbXBsZTJfTW9uc3RlcnxUZXN0U2ltcGxlVGFibGVXaXRoRW51bXxudWxsIHsKICAgc3dpdGNoKEFueVt0eXBlXSkgewogICAgIGNhc2UgJ05PTkUnOiByZXR1cm4gbnVsbDsgCiAgICAgY2FzZSAnTW9uc3Rlcic6IHJldHVybiBhY2Nlc3NvcihpbmRleCwgbmV3IE1vbnN0ZXIoKSkhIGFzIE1vbnN0ZXI7CiAgICAgY2FzZSAnVGVzdFNpbXBsZVRhYmxlV2l0aEVudW0nOiByZXR1cm4gYWNjZXNzb3IoaW5kZXgsIG5ldyBUZXN0U2ltcGxlVGFibGVXaXRoRW51bSgpKSEgYXMgVGVzdFNpbXBsZVRhYmxlV2l0aEVudW07Ci0gICAgY2FzZSAnTXlHYW1lX0V4YW1wbGUyX01vbnN0ZXInOiByZXR1cm4gYWNjZXNzb3IoaW5kZXgsIG5ldyBNeUdhbWVFeGFtcGxlMk1vbnN0ZXIoKSkhIGFzIE15R2FtZUV4YW1wbGUyTW9uc3RlcjsKKyAgICBjYXNlICdNeUdhbWVfRXhhbXBsZTJfTW9uc3Rlcic6IHJldHVybiBhY2Nlc3NvcihpbmRleCwgbmV3IE15R2FtZV9FeGFtcGxlMl9Nb25zdGVyKCkpISBhcyBNeUdhbWVfRXhhbXBsZTJfTW9uc3RlcjsKICAgICBkZWZhdWx0OiByZXR1cm4gbnVsbDsKICAgfQogfQotCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9teS1nYW1lL2V4YW1wbGUvY29sb3IudHMgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9teS1nYW1lL2V4YW1wbGUvY29sb3IudHMKaW5kZXggY2ViMzFmOC4uOGNlNThkYSAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvbXktZ2FtZS9leGFtcGxlL2NvbG9yLnRzCisrKyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL215LWdhbWUvZXhhbXBsZS9jb2xvci50cwpAQCAtMyw3ICszLDcgQEAKIC8qKgogICogQ29tcG9zaXRlIGNvbXBvbmVudHMgb2YgTW9uc3RlciBjb2xvci4KICAqLwotZXhwb3J0IGVudW0gQ29sb3J7CitleHBvcnQgZW51bSBDb2xvciB7CiAgIFJlZCA9IDEsCiAKICAgLyoqCkBAIC0xNyw0ICsxNywzIEBACiAgICAqLwogICBCbHVlID0gOAogfQotCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9teS1nYW1lL2V4YW1wbGUvbG9uZy1lbnVtLnRzIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvbXktZ2FtZS9leGFtcGxlL2xvbmctZW51bS50cwppbmRleCBiZTQxODE5Li4zMWVhMTg4IDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9teS1nYW1lL2V4YW1wbGUvbG9uZy1lbnVtLnRzCisrKyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL215LWdhbWUvZXhhbXBsZS9sb25nLWVudW0udHMKQEAgLTEsOCArMSw3IEBACiAvLyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBieSB0aGUgRmxhdEJ1ZmZlcnMgY29tcGlsZXIsIGRvIG5vdCBtb2RpZnkKIAotZXhwb3J0IGVudW0gTG9uZ0VudW17CitleHBvcnQgZW51bSBMb25nRW51bSB7CiAgIExvbmdPbmUgPSAnMicsCiAgIExvbmdUd28gPSAnNCcsCiAgIExvbmdCaWcgPSAnMTA5OTUxMTYyNzc3NicKIH0KLQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvbXktZ2FtZS9leGFtcGxlL21vbnN0ZXIuanMgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9teS1nYW1lL2V4YW1wbGUvbW9uc3Rlci5qcwppbmRleCAzYzNjMjNiLi5mOWM4Y2NhIDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9teS1nYW1lL2V4YW1wbGUvbW9uc3Rlci5qcworKysgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9teS1nYW1lL2V4YW1wbGUvbW9uc3Rlci5qcwpAQCAtNTI3LDcgKzUyNyw3IEBACiAgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KICAgICBzdGF0aWMgZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCkgewotICAgICAgICByZXR1cm4gJ015R2FtZS5FeGFtcGxlLk1vbnN0ZXInOworICAgICAgICByZXR1cm4gJ015R2FtZV9FeGFtcGxlX01vbnN0ZXInOwogICAgIH0KICAgICBzdGF0aWMgc3RhcnRNb25zdGVyKGJ1aWxkZXIpIHsKICAgICAgICAgYnVpbGRlci5zdGFydE9iamVjdCg1NCk7CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9teS1nYW1lL2V4YW1wbGUvbW9uc3Rlci50cyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL215LWdhbWUvZXhhbXBsZS9tb25zdGVyLnRzCmluZGV4IGM2Y2IzM2UuLmQ2NWI3YzMgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL215LWdhbWUvZXhhbXBsZS9tb25zdGVyLnRzCisrKyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL215LWdhbWUvZXhhbXBsZS9tb25zdGVyLnRzCkBAIC0yLDcgKzIsNyBAQAogCiBpbXBvcnQgKiBhcyBmbGF0YnVmZmVycyBmcm9tICdmbGF0YnVmZmVycyc7CiAKLWltcG9ydCB7IE1vbnN0ZXIgYXMgTXlHYW1lRXhhbXBsZTJNb25zdGVyLCBNb25zdGVyVCBhcyBNeUdhbWVFeGFtcGxlMk1vbnN0ZXJUIH0gZnJvbSAnLi4vLi4vbXktZ2FtZS9leGFtcGxlMi9tb25zdGVyJzsKK2ltcG9ydCB7IE1vbnN0ZXIgYXMgTXlHYW1lX0V4YW1wbGUyX01vbnN0ZXIsIE1vbnN0ZXJUIGFzIE15R2FtZV9FeGFtcGxlMl9Nb25zdGVyVCB9IGZyb20gJy4uLy4uL215LWdhbWUvZXhhbXBsZTIvbW9uc3Rlcic7CiBpbXBvcnQgeyBBYmlsaXR5LCBBYmlsaXR5VCB9IGZyb20gJy4uLy4uL215LWdhbWUvZXhhbXBsZS9hYmlsaXR5JzsKIGltcG9ydCB7IEFueSwgdW5pb25Ub0FueSwgdW5pb25MaXN0VG9BbnkgfSBmcm9tICcuLi8uLi9teS1nYW1lL2V4YW1wbGUvYW55JzsKIGltcG9ydCB7IEFueUFtYmlndW91c0FsaWFzZXMsIHVuaW9uVG9BbnlBbWJpZ3VvdXNBbGlhc2VzLCB1bmlvbkxpc3RUb0FueUFtYmlndW91c0FsaWFzZXMgfSBmcm9tICcuLi8uLi9teS1nYW1lL2V4YW1wbGUvYW55LWFtYmlndW91cy1hbGlhc2VzJzsKQEAgLTIzLDcgKzIzLDcgQEAKIGV4cG9ydCBjbGFzcyBNb25zdGVyIHsKICAgYmI6IGZsYXRidWZmZXJzLkJ5dGVCdWZmZXJ8bnVsbCA9IG51bGw7CiAgIGJiX3BvcyA9IDA7Ci1fX2luaXQoaTpudW1iZXIsIGJiOmZsYXRidWZmZXJzLkJ5dGVCdWZmZXIpOk1vbnN0ZXIgeworICBfX2luaXQoaTpudW1iZXIsIGJiOmZsYXRidWZmZXJzLkJ5dGVCdWZmZXIpOk1vbnN0ZXIgewogICB0aGlzLmJiX3BvcyA9IGk7CiAgIHRoaXMuYmIgPSBiYjsKICAgcmV0dXJuIHRoaXM7CkBAIC02ODQsNyArNjg0LDcgQEAKIH0KIAogc3RhdGljIGdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpOnN0cmluZyB7Ci0gIHJldHVybiAnTXlHYW1lLkV4YW1wbGUuTW9uc3Rlcic7CisgIHJldHVybiAnTXlHYW1lX0V4YW1wbGVfTW9uc3Rlcic7CiB9CiAKIHN0YXRpYyBzdGFydE1vbnN0ZXIoYnVpbGRlcjpmbGF0YnVmZmVycy5CdWlsZGVyKSB7CkBAIC0xMjk2LDcgKzEyOTYsNyBAQAogICBwdWJsaWMgaW52ZW50b3J5OiAobnVtYmVyKVtdID0gW10sCiAgIHB1YmxpYyBjb2xvcjogQ29sb3IgPSBDb2xvci5CbHVlLAogICBwdWJsaWMgdGVzdFR5cGU6IEFueSA9IEFueS5OT05FLAotICBwdWJsaWMgdGVzdDogTW9uc3RlclR8TXlHYW1lRXhhbXBsZTJNb25zdGVyVHxUZXN0U2ltcGxlVGFibGVXaXRoRW51bVR8bnVsbCA9IG51bGwsCisgIHB1YmxpYyB0ZXN0OiBNb25zdGVyVHxNeUdhbWVfRXhhbXBsZTJfTW9uc3RlclR8VGVzdFNpbXBsZVRhYmxlV2l0aEVudW1UfG51bGwgPSBudWxsLAogICBwdWJsaWMgdGVzdDQ6IChUZXN0VClbXSA9IFtdLAogICBwdWJsaWMgdGVzdGFycmF5b2ZzdHJpbmc6IChzdHJpbmcpW10gPSBbXSwKICAgcHVibGljIHRlc3RhcnJheW9mdGFibGVzOiAoTW9uc3RlclQpW10gPSBbXSwKQEAgLTEzMzIsNyArMTMzMiw3IEBACiAgIHB1YmxpYyBub25Pd25pbmdSZWZlcmVuY2U6IGJpZ2ludCA9IEJpZ0ludCgnMCcpLAogICBwdWJsaWMgdmVjdG9yT2ZOb25Pd25pbmdSZWZlcmVuY2VzOiAoYmlnaW50KVtdID0gW10sCiAgIHB1YmxpYyBhbnlVbmlxdWVUeXBlOiBBbnlVbmlxdWVBbGlhc2VzID0gQW55VW5pcXVlQWxpYXNlcy5OT05FLAotICBwdWJsaWMgYW55VW5pcXVlOiBNb25zdGVyVHxNeUdhbWVFeGFtcGxlMk1vbnN0ZXJUfFRlc3RTaW1wbGVUYWJsZVdpdGhFbnVtVHxudWxsID0gbnVsbCwKKyAgcHVibGljIGFueVVuaXF1ZTogTW9uc3RlclR8TXlHYW1lX0V4YW1wbGUyX01vbnN0ZXJUfFRlc3RTaW1wbGVUYWJsZVdpdGhFbnVtVHxudWxsID0gbnVsbCwKICAgcHVibGljIGFueUFtYmlndW91c1R5cGU6IEFueUFtYmlndW91c0FsaWFzZXMgPSBBbnlBbWJpZ3VvdXNBbGlhc2VzLk5PTkUsCiAgIHB1YmxpYyBhbnlBbWJpZ3VvdXM6IE1vbnN0ZXJUfG51bGwgPSBudWxsLAogICBwdWJsaWMgdmVjdG9yT2ZFbnVtczogKENvbG9yKVtdID0gW10sCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9teS1nYW1lL2V4YW1wbGUvcmFjZS50cyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL215LWdhbWUvZXhhbXBsZS9yYWNlLnRzCmluZGV4IDA2Y2ExMjguLjhjYjk2NTQgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL215LWdhbWUvZXhhbXBsZS9yYWNlLnRzCisrKyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL215LWdhbWUvZXhhbXBsZS9yYWNlLnRzCkBAIC0xLDkgKzEsOCBAQAogLy8gYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgYnkgdGhlIEZsYXRCdWZmZXJzIGNvbXBpbGVyLCBkbyBub3QgbW9kaWZ5CiAKLWV4cG9ydCBlbnVtIFJhY2V7CitleHBvcnQgZW51bSBSYWNlIHsKICAgTm9uZSA9IC0xLAogICBIdW1hbiA9IDAsCiAgIER3YXJmID0gMSwKICAgRWxmID0gMgogfQotCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9teS1nYW1lL2V4YW1wbGUvcmVmZXJyYWJsZS5qcyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL215LWdhbWUvZXhhbXBsZS9yZWZlcnJhYmxlLmpzCmluZGV4IDAzNzA3NjguLjM2NzAzNGIgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL215LWdhbWUvZXhhbXBsZS9yZWZlcnJhYmxlLmpzCisrKyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL215LWdhbWUvZXhhbXBsZS9yZWZlcnJhYmxlLmpzCkBAIC0zMCw3ICszMCw3IEBACiAgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KICAgICBzdGF0aWMgZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCkgewotICAgICAgICByZXR1cm4gJ015R2FtZS5FeGFtcGxlLlJlZmVycmFibGUnOworICAgICAgICByZXR1cm4gJ015R2FtZV9FeGFtcGxlX1JlZmVycmFibGUnOwogICAgIH0KICAgICBzdGF0aWMgc3RhcnRSZWZlcnJhYmxlKGJ1aWxkZXIpIHsKICAgICAgICAgYnVpbGRlci5zdGFydE9iamVjdCgxKTsKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL215LWdhbWUvZXhhbXBsZS9yZWZlcnJhYmxlLnRzIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvbXktZ2FtZS9leGFtcGxlL3JlZmVycmFibGUudHMKaW5kZXggZmRhYzZjMy4uZWMwMjk4MCAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvbXktZ2FtZS9leGFtcGxlL3JlZmVycmFibGUudHMKKysrIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvbXktZ2FtZS9leGFtcGxlL3JlZmVycmFibGUudHMKQEAgLTcsNyArNyw3IEBACiBleHBvcnQgY2xhc3MgUmVmZXJyYWJsZSB7CiAgIGJiOiBmbGF0YnVmZmVycy5CeXRlQnVmZmVyfG51bGwgPSBudWxsOwogICBiYl9wb3MgPSAwOwotX19pbml0KGk6bnVtYmVyLCBiYjpmbGF0YnVmZmVycy5CeXRlQnVmZmVyKTpSZWZlcnJhYmxlIHsKKyAgX19pbml0KGk6bnVtYmVyLCBiYjpmbGF0YnVmZmVycy5CeXRlQnVmZmVyKTpSZWZlcnJhYmxlIHsKICAgdGhpcy5iYl9wb3MgPSBpOwogICB0aGlzLmJiID0gYmI7CiAgIHJldHVybiB0aGlzOwpAQCAtMzksNyArMzksNyBAQAogfQogCiBzdGF0aWMgZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCk6c3RyaW5nIHsKLSAgcmV0dXJuICdNeUdhbWUuRXhhbXBsZS5SZWZlcnJhYmxlJzsKKyAgcmV0dXJuICdNeUdhbWVfRXhhbXBsZV9SZWZlcnJhYmxlJzsKIH0KIAogc3RhdGljIHN0YXJ0UmVmZXJyYWJsZShidWlsZGVyOmZsYXRidWZmZXJzLkJ1aWxkZXIpIHsKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL215LWdhbWUvZXhhbXBsZS9zdGF0LmpzIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvbXktZ2FtZS9leGFtcGxlL3N0YXQuanMKaW5kZXggNDZlZWM0My4uNDNiNTY5ZiAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvbXktZ2FtZS9leGFtcGxlL3N0YXQuanMKKysrIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvbXktZ2FtZS9leGFtcGxlL3N0YXQuanMKQEAgLTQ2LDcgKzQ2LDcgQEAKICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogICAgIHN0YXRpYyBnZXRGdWxseVF1YWxpZmllZE5hbWUoKSB7Ci0gICAgICAgIHJldHVybiAnTXlHYW1lLkV4YW1wbGUuU3RhdCc7CisgICAgICAgIHJldHVybiAnTXlHYW1lX0V4YW1wbGVfU3RhdCc7CiAgICAgfQogICAgIHN0YXRpYyBzdGFydFN0YXQoYnVpbGRlcikgewogICAgICAgICBidWlsZGVyLnN0YXJ0T2JqZWN0KDMpOwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvbXktZ2FtZS9leGFtcGxlL3N0YXQudHMgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9teS1nYW1lL2V4YW1wbGUvc3RhdC50cwppbmRleCAwMDgyZWY4Li5lNDUyNTk5IDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9teS1nYW1lL2V4YW1wbGUvc3RhdC50cworKysgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9teS1nYW1lL2V4YW1wbGUvc3RhdC50cwpAQCAtNyw3ICs3LDcgQEAKIGV4cG9ydCBjbGFzcyBTdGF0IHsKICAgYmI6IGZsYXRidWZmZXJzLkJ5dGVCdWZmZXJ8bnVsbCA9IG51bGw7CiAgIGJiX3BvcyA9IDA7Ci1fX2luaXQoaTpudW1iZXIsIGJiOmZsYXRidWZmZXJzLkJ5dGVCdWZmZXIpOlN0YXQgeworICBfX2luaXQoaTpudW1iZXIsIGJiOmZsYXRidWZmZXJzLkJ5dGVCdWZmZXIpOlN0YXQgewogICB0aGlzLmJiX3BvcyA9IGk7CiAgIHRoaXMuYmIgPSBiYjsKICAgcmV0dXJuIHRoaXM7CkBAIC02Miw3ICs2Miw3IEBACiB9CiAKIHN0YXRpYyBnZXRGdWxseVF1YWxpZmllZE5hbWUoKTpzdHJpbmcgewotICByZXR1cm4gJ015R2FtZS5FeGFtcGxlLlN0YXQnOworICByZXR1cm4gJ015R2FtZV9FeGFtcGxlX1N0YXQnOwogfQogCiBzdGF0aWMgc3RhcnRTdGF0KGJ1aWxkZXI6ZmxhdGJ1ZmZlcnMuQnVpbGRlcikgewpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvbXktZ2FtZS9leGFtcGxlL3N0cnVjdC1vZi1zdHJ1Y3RzLW9mLXN0cnVjdHMudHMgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9teS1nYW1lL2V4YW1wbGUvc3RydWN0LW9mLXN0cnVjdHMtb2Ytc3RydWN0cy50cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZmU4NjlmCi0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvbXktZ2FtZS9leGFtcGxlL3N0cnVjdC1vZi1zdHJ1Y3RzLW9mLXN0cnVjdHMudHMKQEAgLTAsMCArMSw3NCBAQAorLy8gYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgYnkgdGhlIEZsYXRCdWZmZXJzIGNvbXBpbGVyLCBkbyBub3QgbW9kaWZ5CisKK2ltcG9ydCAqIGFzIGZsYXRidWZmZXJzIGZyb20gJ2ZsYXRidWZmZXJzJzsKKworaW1wb3J0IHsgU3RydWN0T2ZTdHJ1Y3RzLCBTdHJ1Y3RPZlN0cnVjdHNUIH0gZnJvbSAnLi4vLi4vbXktZ2FtZS9leGFtcGxlL3N0cnVjdC1vZi1zdHJ1Y3RzJzsKKworCitleHBvcnQgY2xhc3MgU3RydWN0T2ZTdHJ1Y3RzT2ZTdHJ1Y3RzIHsKKyAgYmI6IGZsYXRidWZmZXJzLkJ5dGVCdWZmZXJ8bnVsbCA9IG51bGw7CisgIGJiX3BvcyA9IDA7CisgIF9faW5pdChpOm51bWJlciwgYmI6ZmxhdGJ1ZmZlcnMuQnl0ZUJ1ZmZlcik6U3RydWN0T2ZTdHJ1Y3RzT2ZTdHJ1Y3RzIHsKKyAgdGhpcy5iYl9wb3MgPSBpOworICB0aGlzLmJiID0gYmI7CisgIHJldHVybiB0aGlzOworfQorCithKG9iaj86U3RydWN0T2ZTdHJ1Y3RzKTpTdHJ1Y3RPZlN0cnVjdHN8bnVsbCB7CisgIHJldHVybiAob2JqIHx8IG5ldyBTdHJ1Y3RPZlN0cnVjdHMoKSkuX19pbml0KHRoaXMuYmJfcG9zLCB0aGlzLmJiISk7Cit9CisKK3N0YXRpYyBnZXRGdWxseVF1YWxpZmllZE5hbWUoKTpzdHJpbmcgeworICByZXR1cm4gJ015R2FtZV9FeGFtcGxlX1N0cnVjdE9mU3RydWN0c09mU3RydWN0cyc7Cit9CisKK3N0YXRpYyBzaXplT2YoKTpudW1iZXIgeworICByZXR1cm4gMjA7Cit9CisKK3N0YXRpYyBjcmVhdGVTdHJ1Y3RPZlN0cnVjdHNPZlN0cnVjdHMoYnVpbGRlcjpmbGF0YnVmZmVycy5CdWlsZGVyLCBhX2FfaWQ6IG51bWJlciwgYV9hX2Rpc3RhbmNlOiBudW1iZXIsIGFfYl9hOiBudW1iZXIsIGFfYl9iOiBudW1iZXIsIGFfY19pZDogbnVtYmVyLCBhX2NfZGlzdGFuY2U6IG51bWJlcik6ZmxhdGJ1ZmZlcnMuT2Zmc2V0IHsKKyAgYnVpbGRlci5wcmVwKDQsIDIwKTsKKyAgYnVpbGRlci5wcmVwKDQsIDIwKTsKKyAgYnVpbGRlci5wcmVwKDQsIDgpOworICBidWlsZGVyLndyaXRlSW50MzIoYV9jX2Rpc3RhbmNlKTsKKyAgYnVpbGRlci53cml0ZUludDMyKGFfY19pZCk7CisgIGJ1aWxkZXIucHJlcCgyLCA0KTsKKyAgYnVpbGRlci5wYWQoMSk7CisgIGJ1aWxkZXIud3JpdGVJbnQ4KGFfYl9iKTsKKyAgYnVpbGRlci53cml0ZUludDE2KGFfYl9hKTsKKyAgYnVpbGRlci5wcmVwKDQsIDgpOworICBidWlsZGVyLndyaXRlSW50MzIoYV9hX2Rpc3RhbmNlKTsKKyAgYnVpbGRlci53cml0ZUludDMyKGFfYV9pZCk7CisgIHJldHVybiBidWlsZGVyLm9mZnNldCgpOworfQorCisKK3VucGFjaygpOiBTdHJ1Y3RPZlN0cnVjdHNPZlN0cnVjdHNUIHsKKyAgcmV0dXJuIG5ldyBTdHJ1Y3RPZlN0cnVjdHNPZlN0cnVjdHNUKAorICAgICh0aGlzLmEoKSAhPT0gbnVsbCA/IHRoaXMuYSgpIS51bnBhY2soKSA6IG51bGwpCisgICk7Cit9CisKKwordW5wYWNrVG8oX286IFN0cnVjdE9mU3RydWN0c09mU3RydWN0c1QpOiB2b2lkIHsKKyAgX28uYSA9ICh0aGlzLmEoKSAhPT0gbnVsbCA/IHRoaXMuYSgpIS51bnBhY2soKSA6IG51bGwpOworfQorfQorCitleHBvcnQgY2xhc3MgU3RydWN0T2ZTdHJ1Y3RzT2ZTdHJ1Y3RzVCB7Citjb25zdHJ1Y3RvcigKKyAgcHVibGljIGE6IFN0cnVjdE9mU3RydWN0c1R8bnVsbCA9IG51bGwKKyl7fQorCisKK3BhY2soYnVpbGRlcjpmbGF0YnVmZmVycy5CdWlsZGVyKTogZmxhdGJ1ZmZlcnMuT2Zmc2V0IHsKKyAgcmV0dXJuIFN0cnVjdE9mU3RydWN0c09mU3RydWN0cy5jcmVhdGVTdHJ1Y3RPZlN0cnVjdHNPZlN0cnVjdHMoYnVpbGRlciwKKyAgICAodGhpcy5hPy5hPy5pZCA/PyAwKSwKKyAgICAodGhpcy5hPy5hPy5kaXN0YW5jZSA/PyAwKSwKKyAgICAodGhpcy5hPy5iPy5hID8/IDApLAorICAgICh0aGlzLmE/LmI/LmIgPz8gMCksCisgICAgKHRoaXMuYT8uYz8uaWQgPz8gMCksCisgICAgKHRoaXMuYT8uYz8uZGlzdGFuY2UgPz8gMCkKKyAgKTsKK30KK30KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL215LWdhbWUvZXhhbXBsZS9zdHJ1Y3Qtb2Ytc3RydWN0cy5qcyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL215LWdhbWUvZXhhbXBsZS9zdHJ1Y3Qtb2Ytc3RydWN0cy5qcwppbmRleCAyZGViYzI5Li4wOWM3OTEwIDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9teS1nYW1lL2V4YW1wbGUvc3RydWN0LW9mLXN0cnVjdHMuanMKKysrIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvbXktZ2FtZS9leGFtcGxlL3N0cnVjdC1vZi1zdHJ1Y3RzLmpzCkBAIC0yMSw3ICsyMSw3IEBACiAgICAgICAgIHJldHVybiAob2JqIHx8IG5ldyBBYmlsaXR5KCkpLl9faW5pdCh0aGlzLmJiX3BvcyArIDEyLCB0aGlzLmJiKTsKICAgICB9CiAgICAgc3RhdGljIGdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuICdNeUdhbWUuRXhhbXBsZS5TdHJ1Y3RPZlN0cnVjdHMnOworICAgICAgICByZXR1cm4gJ015R2FtZV9FeGFtcGxlX1N0cnVjdE9mU3RydWN0cyc7CiAgICAgfQogICAgIHN0YXRpYyBzaXplT2YoKSB7CiAgICAgICAgIHJldHVybiAyMDsKQEAgLTU2LDYgKzU2LDcgQEAKICAgICAgICAgdGhpcy5jID0gYzsKICAgICB9CiAgICAgcGFjayhidWlsZGVyKSB7Ci0gICAgICAgIHJldHVybiBTdHJ1Y3RPZlN0cnVjdHMuY3JlYXRlU3RydWN0T2ZTdHJ1Y3RzKGJ1aWxkZXIsICh0aGlzLmEgPT09IG51bGwgPyAwIDogdGhpcy5hLmlkKSwgKHRoaXMuYSA9PT0gbnVsbCA/IDAgOiB0aGlzLmEuZGlzdGFuY2UpLCAodGhpcy5iID09PSBudWxsID8gMCA6IHRoaXMuYi5hKSwgKHRoaXMuYiA9PT0gbnVsbCA/IDAgOiB0aGlzLmIuYiksICh0aGlzLmMgPT09IG51bGwgPyAwIDogdGhpcy5jLmlkKSwgKHRoaXMuYyA9PT0gbnVsbCA/IDAgOiB0aGlzLmMuZGlzdGFuY2UpKTsKKyAgICAgICAgdmFyIF9hLCBfYiwgX2MsIF9kLCBfZSwgX2YsIF9nLCBfaCwgX2osIF9rLCBfbCwgX207CisgICAgICAgIHJldHVybiBTdHJ1Y3RPZlN0cnVjdHMuY3JlYXRlU3RydWN0T2ZTdHJ1Y3RzKGJ1aWxkZXIsICgoX2IgPSAoX2EgPSB0aGlzLmEpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5pZCkgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogMCksICgoX2QgPSAoX2MgPSB0aGlzLmEpID09PSBudWxsIHx8IF9jID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYy5kaXN0YW5jZSkgIT09IG51bGwgJiYgX2QgIT09IHZvaWQgMCA/IF9kIDogMCksICgoX2YgPSAoX2UgPSB0aGlzLmIpID09PSBudWxsIHx8IF9lID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfZS5hKSAhPT0gbnVsbCAmJiBfZiAhPT0gdm9pZCAwID8gX2YgOiAwKSwgKChfaCA9IChfZyA9IHRoaXMuYikgPT09IG51bGwgfHwgX2cgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9nLmIpICE9PSBudWxsICYmIF9oICE9PSB2b2lkIDAgPyBfaCA6IDApLCAoKF9rID0gKF9qID0gdGhpcy5jKSA9PT0gbnVsbCB8fCBfaiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2ouaWQpICE9PSBudWxsICYmIF9rICE9PSB2b2lkIDAgPyBfayA6IDApLCAoKF9tID0gKF9sID0gdGhpcy5jKSA9PT0gbnVsbCB8fCBfbCA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2wuZGlzdGFuY2UpICE9PSBudWxsICYmIF9tICE9PSB2b2lkIDAgPyBfbSA6IDApKTsKICAgICB9CiB9CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9teS1nYW1lL2V4YW1wbGUvc3RydWN0LW9mLXN0cnVjdHMudHMgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9teS1nYW1lL2V4YW1wbGUvc3RydWN0LW9mLXN0cnVjdHMudHMKaW5kZXggMTFlY2E3ZS4uMGNiODdkZSAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvbXktZ2FtZS9leGFtcGxlL3N0cnVjdC1vZi1zdHJ1Y3RzLnRzCisrKyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL215LWdhbWUvZXhhbXBsZS9zdHJ1Y3Qtb2Ytc3RydWN0cy50cwpAQCAtOSw3ICs5LDcgQEAKIGV4cG9ydCBjbGFzcyBTdHJ1Y3RPZlN0cnVjdHMgewogICBiYjogZmxhdGJ1ZmZlcnMuQnl0ZUJ1ZmZlcnxudWxsID0gbnVsbDsKICAgYmJfcG9zID0gMDsKLV9faW5pdChpOm51bWJlciwgYmI6ZmxhdGJ1ZmZlcnMuQnl0ZUJ1ZmZlcik6U3RydWN0T2ZTdHJ1Y3RzIHsKKyAgX19pbml0KGk6bnVtYmVyLCBiYjpmbGF0YnVmZmVycy5CeXRlQnVmZmVyKTpTdHJ1Y3RPZlN0cnVjdHMgewogICB0aGlzLmJiX3BvcyA9IGk7CiAgIHRoaXMuYmIgPSBiYjsKICAgcmV0dXJuIHRoaXM7CkBAIC0yOCw3ICsyOCw3IEBACiB9CiAKIHN0YXRpYyBnZXRGdWxseVF1YWxpZmllZE5hbWUoKTpzdHJpbmcgewotICByZXR1cm4gJ015R2FtZS5FeGFtcGxlLlN0cnVjdE9mU3RydWN0cyc7CisgIHJldHVybiAnTXlHYW1lX0V4YW1wbGVfU3RydWN0T2ZTdHJ1Y3RzJzsKIH0KIAogc3RhdGljIHNpemVPZigpOm51bWJlciB7CkBAIC03NywxMiArNzcsMTIgQEAKIAogcGFjayhidWlsZGVyOmZsYXRidWZmZXJzLkJ1aWxkZXIpOiBmbGF0YnVmZmVycy5PZmZzZXQgewogICByZXR1cm4gU3RydWN0T2ZTdHJ1Y3RzLmNyZWF0ZVN0cnVjdE9mU3RydWN0cyhidWlsZGVyLAotICAgICh0aGlzLmEgPT09IG51bGwgPyAwIDogdGhpcy5hLmlkISksCi0gICAgKHRoaXMuYSA9PT0gbnVsbCA/IDAgOiB0aGlzLmEuZGlzdGFuY2UhKSwKLSAgICAodGhpcy5iID09PSBudWxsID8gMCA6IHRoaXMuYi5hISksCi0gICAgKHRoaXMuYiA9PT0gbnVsbCA/IDAgOiB0aGlzLmIuYiEpLAotICAgICh0aGlzLmMgPT09IG51bGwgPyAwIDogdGhpcy5jLmlkISksCi0gICAgKHRoaXMuYyA9PT0gbnVsbCA/IDAgOiB0aGlzLmMuZGlzdGFuY2UhKQorICAgICh0aGlzLmE/LmlkID8/IDApLAorICAgICh0aGlzLmE/LmRpc3RhbmNlID8/IDApLAorICAgICh0aGlzLmI/LmEgPz8gMCksCisgICAgKHRoaXMuYj8uYiA/PyAwKSwKKyAgICAodGhpcy5jPy5pZCA/PyAwKSwKKyAgICAodGhpcy5jPy5kaXN0YW5jZSA/PyAwKQogICApOwogfQogfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvbXktZ2FtZS9leGFtcGxlL3Rlc3Qtc2ltcGxlLXRhYmxlLXdpdGgtZW51bS5qcyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL215LWdhbWUvZXhhbXBsZS90ZXN0LXNpbXBsZS10YWJsZS13aXRoLWVudW0uanMKaW5kZXggYjU2YmRhNC4uYTMxZDAxMSAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvbXktZ2FtZS9leGFtcGxlL3Rlc3Qtc2ltcGxlLXRhYmxlLXdpdGgtZW51bS5qcworKysgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9teS1nYW1lL2V4YW1wbGUvdGVzdC1zaW1wbGUtdGFibGUtd2l0aC1lbnVtLmpzCkBAIC0zMSw3ICszMSw3IEBACiAgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KICAgICBzdGF0aWMgZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCkgewotICAgICAgICByZXR1cm4gJ015R2FtZS5FeGFtcGxlLlRlc3RTaW1wbGVUYWJsZVdpdGhFbnVtJzsKKyAgICAgICAgcmV0dXJuICdNeUdhbWVfRXhhbXBsZV9UZXN0U2ltcGxlVGFibGVXaXRoRW51bSc7CiAgICAgfQogICAgIHN0YXRpYyBzdGFydFRlc3RTaW1wbGVUYWJsZVdpdGhFbnVtKGJ1aWxkZXIpIHsKICAgICAgICAgYnVpbGRlci5zdGFydE9iamVjdCgxKTsKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL215LWdhbWUvZXhhbXBsZS90ZXN0LXNpbXBsZS10YWJsZS13aXRoLWVudW0udHMgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9teS1nYW1lL2V4YW1wbGUvdGVzdC1zaW1wbGUtdGFibGUtd2l0aC1lbnVtLnRzCmluZGV4IDk5YTU0MWYuLjg2YTE5YWEgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL215LWdhbWUvZXhhbXBsZS90ZXN0LXNpbXBsZS10YWJsZS13aXRoLWVudW0udHMKKysrIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvbXktZ2FtZS9leGFtcGxlL3Rlc3Qtc2ltcGxlLXRhYmxlLXdpdGgtZW51bS50cwpAQCAtOCw3ICs4LDcgQEAKIGV4cG9ydCBjbGFzcyBUZXN0U2ltcGxlVGFibGVXaXRoRW51bSB7CiAgIGJiOiBmbGF0YnVmZmVycy5CeXRlQnVmZmVyfG51bGwgPSBudWxsOwogICBiYl9wb3MgPSAwOwotX19pbml0KGk6bnVtYmVyLCBiYjpmbGF0YnVmZmVycy5CeXRlQnVmZmVyKTpUZXN0U2ltcGxlVGFibGVXaXRoRW51bSB7CisgIF9faW5pdChpOm51bWJlciwgYmI6ZmxhdGJ1ZmZlcnMuQnl0ZUJ1ZmZlcik6VGVzdFNpbXBsZVRhYmxlV2l0aEVudW0gewogICB0aGlzLmJiX3BvcyA9IGk7CiAgIHRoaXMuYmIgPSBiYjsKICAgcmV0dXJuIHRoaXM7CkBAIC00MCw3ICs0MCw3IEBACiB9CiAKIHN0YXRpYyBnZXRGdWxseVF1YWxpZmllZE5hbWUoKTpzdHJpbmcgewotICByZXR1cm4gJ015R2FtZS5FeGFtcGxlLlRlc3RTaW1wbGVUYWJsZVdpdGhFbnVtJzsKKyAgcmV0dXJuICdNeUdhbWVfRXhhbXBsZV9UZXN0U2ltcGxlVGFibGVXaXRoRW51bSc7CiB9CiAKIHN0YXRpYyBzdGFydFRlc3RTaW1wbGVUYWJsZVdpdGhFbnVtKGJ1aWxkZXI6ZmxhdGJ1ZmZlcnMuQnVpbGRlcikgewpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvbXktZ2FtZS9leGFtcGxlL3Rlc3QuanMgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9teS1nYW1lL2V4YW1wbGUvdGVzdC5qcwppbmRleCBiYTZlYmZiLi45YzQzNjE5IDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9teS1nYW1lL2V4YW1wbGUvdGVzdC5qcworKysgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9teS1nYW1lL2V4YW1wbGUvdGVzdC5qcwpAQCAtMjQsNyArMjQsNyBAQAogICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CiAgICAgc3RhdGljIGdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuICdNeUdhbWUuRXhhbXBsZS5UZXN0JzsKKyAgICAgICAgcmV0dXJuICdNeUdhbWVfRXhhbXBsZV9UZXN0JzsKICAgICB9CiAgICAgc3RhdGljIHNpemVPZigpIHsKICAgICAgICAgcmV0dXJuIDQ7CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9teS1nYW1lL2V4YW1wbGUvdGVzdC50cyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL215LWdhbWUvZXhhbXBsZS90ZXN0LnRzCmluZGV4IGFmZWQxMjUuLmIzZDg0ZWUgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL215LWdhbWUvZXhhbXBsZS90ZXN0LnRzCisrKyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL215LWdhbWUvZXhhbXBsZS90ZXN0LnRzCkBAIC03LDcgKzcsNyBAQAogZXhwb3J0IGNsYXNzIFRlc3QgewogICBiYjogZmxhdGJ1ZmZlcnMuQnl0ZUJ1ZmZlcnxudWxsID0gbnVsbDsKICAgYmJfcG9zID0gMDsKLV9faW5pdChpOm51bWJlciwgYmI6ZmxhdGJ1ZmZlcnMuQnl0ZUJ1ZmZlcik6VGVzdCB7CisgIF9faW5pdChpOm51bWJlciwgYmI6ZmxhdGJ1ZmZlcnMuQnl0ZUJ1ZmZlcik6VGVzdCB7CiAgIHRoaXMuYmJfcG9zID0gaTsKICAgdGhpcy5iYiA9IGJiOwogICByZXR1cm4gdGhpczsKQEAgLTMyLDcgKzMyLDcgQEAKIH0KIAogc3RhdGljIGdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpOnN0cmluZyB7Ci0gIHJldHVybiAnTXlHYW1lLkV4YW1wbGUuVGVzdCc7CisgIHJldHVybiAnTXlHYW1lX0V4YW1wbGVfVGVzdCc7CiB9CiAKIHN0YXRpYyBzaXplT2YoKTpudW1iZXIgewpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvbXktZ2FtZS9leGFtcGxlL3R5cGUtYWxpYXNlcy5qcyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL215LWdhbWUvZXhhbXBsZS90eXBlLWFsaWFzZXMuanMKaW5kZXggZjI2ZjIyNi4uYTRiNWY4OSAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvbXktZ2FtZS9leGFtcGxlL3R5cGUtYWxpYXNlcy5qcworKysgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9teS1nYW1lL2V4YW1wbGUvdHlwZS1hbGlhc2VzLmpzCkBAIC0xNjIsNyArMTYyLDcgQEAKICAgICAgICAgcmV0dXJuIG9mZnNldCA/IG5ldyBGbG9hdDY0QXJyYXkodGhpcy5iYi5ieXRlcygpLmJ1ZmZlciwgdGhpcy5iYi5ieXRlcygpLmJ5dGVPZmZzZXQgKyB0aGlzLmJiLl9fdmVjdG9yKHRoaXMuYmJfcG9zICsgb2Zmc2V0KSwgdGhpcy5iYi5fX3ZlY3Rvcl9sZW4odGhpcy5iYl9wb3MgKyBvZmZzZXQpKSA6IG51bGw7CiAgICAgfQogICAgIHN0YXRpYyBnZXRGdWxseVF1YWxpZmllZE5hbWUoKSB7Ci0gICAgICAgIHJldHVybiAnTXlHYW1lLkV4YW1wbGUuVHlwZUFsaWFzZXMnOworICAgICAgICByZXR1cm4gJ015R2FtZV9FeGFtcGxlX1R5cGVBbGlhc2VzJzsKICAgICB9CiAgICAgc3RhdGljIHN0YXJ0VHlwZUFsaWFzZXMoYnVpbGRlcikgewogICAgICAgICBidWlsZGVyLnN0YXJ0T2JqZWN0KDEyKTsKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL215LWdhbWUvZXhhbXBsZS90eXBlLWFsaWFzZXMudHMgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9teS1nYW1lL2V4YW1wbGUvdHlwZS1hbGlhc2VzLnRzCmluZGV4IGVkYjQ1NjcuLjgwNWM4Y2YgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL215LWdhbWUvZXhhbXBsZS90eXBlLWFsaWFzZXMudHMKKysrIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvbXktZ2FtZS9leGFtcGxlL3R5cGUtYWxpYXNlcy50cwpAQCAtNyw3ICs3LDcgQEAKIGV4cG9ydCBjbGFzcyBUeXBlQWxpYXNlcyB7CiAgIGJiOiBmbGF0YnVmZmVycy5CeXRlQnVmZmVyfG51bGwgPSBudWxsOwogICBiYl9wb3MgPSAwOwotX19pbml0KGk6bnVtYmVyLCBiYjpmbGF0YnVmZmVycy5CeXRlQnVmZmVyKTpUeXBlQWxpYXNlcyB7CisgIF9faW5pdChpOm51bWJlciwgYmI6ZmxhdGJ1ZmZlcnMuQnl0ZUJ1ZmZlcik6VHlwZUFsaWFzZXMgewogICB0aGlzLmJiX3BvcyA9IGk7CiAgIHRoaXMuYmIgPSBiYjsKICAgcmV0dXJuIHRoaXM7CkBAIC0yMTMsNyArMjEzLDcgQEAKIH0KIAogc3RhdGljIGdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpOnN0cmluZyB7Ci0gIHJldHVybiAnTXlHYW1lLkV4YW1wbGUuVHlwZUFsaWFzZXMnOworICByZXR1cm4gJ015R2FtZV9FeGFtcGxlX1R5cGVBbGlhc2VzJzsKIH0KIAogc3RhdGljIHN0YXJ0VHlwZUFsaWFzZXMoYnVpbGRlcjpmbGF0YnVmZmVycy5CdWlsZGVyKSB7CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9teS1nYW1lL2V4YW1wbGUvdmVjMy5qcyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL215LWdhbWUvZXhhbXBsZS92ZWMzLmpzCmluZGV4IDVmZDI0NDcuLjgyYjJlYWIgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL215LWdhbWUvZXhhbXBsZS92ZWMzLmpzCisrKyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL215LWdhbWUvZXhhbXBsZS92ZWMzLmpzCkBAIC00OSw3ICs0OSw3IEBACiAgICAgICAgIHJldHVybiAob2JqIHx8IG5ldyBUZXN0KCkpLl9faW5pdCh0aGlzLmJiX3BvcyArIDI2LCB0aGlzLmJiKTsKICAgICB9CiAgICAgc3RhdGljIGdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuICdNeUdhbWUuRXhhbXBsZS5WZWMzJzsKKyAgICAgICAgcmV0dXJuICdNeUdhbWVfRXhhbXBsZV9WZWMzJzsKICAgICB9CiAgICAgc3RhdGljIHNpemVPZigpIHsKICAgICAgICAgcmV0dXJuIDMyOwpAQCAtOTIsNiArOTIsNyBAQAogICAgICAgICB0aGlzLnRlc3QzID0gdGVzdDM7CiAgICAgfQogICAgIHBhY2soYnVpbGRlcikgewotICAgICAgICByZXR1cm4gVmVjMy5jcmVhdGVWZWMzKGJ1aWxkZXIsIHRoaXMueCwgdGhpcy55LCB0aGlzLnosIHRoaXMudGVzdDEsIHRoaXMudGVzdDIsICh0aGlzLnRlc3QzID09PSBudWxsID8gMCA6IHRoaXMudGVzdDMuYSksICh0aGlzLnRlc3QzID09PSBudWxsID8gMCA6IHRoaXMudGVzdDMuYikpOworICAgICAgICB2YXIgX2EsIF9iLCBfYywgX2Q7CisgICAgICAgIHJldHVybiBWZWMzLmNyZWF0ZVZlYzMoYnVpbGRlciwgdGhpcy54LCB0aGlzLnksIHRoaXMueiwgdGhpcy50ZXN0MSwgdGhpcy50ZXN0MiwgKChfYiA9IChfYSA9IHRoaXMudGVzdDMpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5hKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiAwKSwgKChfZCA9IChfYyA9IHRoaXMudGVzdDMpID09PSBudWxsIHx8IF9jID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYy5iKSAhPT0gbnVsbCAmJiBfZCAhPT0gdm9pZCAwID8gX2QgOiAwKSk7CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvbXktZ2FtZS9leGFtcGxlL3ZlYzMudHMgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9teS1nYW1lL2V4YW1wbGUvdmVjMy50cwppbmRleCA5NzU2OTc3Li4zYzY5MmUyIDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9teS1nYW1lL2V4YW1wbGUvdmVjMy50cworKysgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9teS1nYW1lL2V4YW1wbGUvdmVjMy50cwpAQCAtOSw3ICs5LDcgQEAKIGV4cG9ydCBjbGFzcyBWZWMzIHsKICAgYmI6IGZsYXRidWZmZXJzLkJ5dGVCdWZmZXJ8bnVsbCA9IG51bGw7CiAgIGJiX3BvcyA9IDA7Ci1fX2luaXQoaTpudW1iZXIsIGJiOmZsYXRidWZmZXJzLkJ5dGVCdWZmZXIpOlZlYzMgeworICBfX2luaXQoaTpudW1iZXIsIGJiOmZsYXRidWZmZXJzLkJ5dGVCdWZmZXIpOlZlYzMgewogICB0aGlzLmJiX3BvcyA9IGk7CiAgIHRoaXMuYmIgPSBiYjsKICAgcmV0dXJuIHRoaXM7CkBAIC02NSw3ICs2NSw3IEBACiB9CiAKIHN0YXRpYyBnZXRGdWxseVF1YWxpZmllZE5hbWUoKTpzdHJpbmcgewotICByZXR1cm4gJ015R2FtZS5FeGFtcGxlLlZlYzMnOworICByZXR1cm4gJ015R2FtZV9FeGFtcGxlX1ZlYzMnOwogfQogCiBzdGF0aWMgc2l6ZU9mKCk6bnVtYmVyIHsKQEAgLTEzMCw4ICsxMzAsOCBAQAogICAgIHRoaXMueiwKICAgICB0aGlzLnRlc3QxLAogICAgIHRoaXMudGVzdDIsCi0gICAgKHRoaXMudGVzdDMgPT09IG51bGwgPyAwIDogdGhpcy50ZXN0My5hISksCi0gICAgKHRoaXMudGVzdDMgPT09IG51bGwgPyAwIDogdGhpcy50ZXN0My5iISkKKyAgICAodGhpcy50ZXN0Mz8uYSA/PyAwKSwKKyAgICAodGhpcy50ZXN0Mz8uYiA/PyAwKQogICApOwogfQogfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvbXktZ2FtZS9leGFtcGxlMi9tb25zdGVyLmpzIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvbXktZ2FtZS9leGFtcGxlMi9tb25zdGVyLmpzCmluZGV4IDE3ZjAyYjEuLmY1MGEyYzggMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL215LWdhbWUvZXhhbXBsZTIvbW9uc3Rlci5qcworKysgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9teS1nYW1lL2V4YW1wbGUyL21vbnN0ZXIuanMKQEAgLTE4LDcgKzE4LDcgQEAKICAgICAgICAgcmV0dXJuIChvYmogfHwgbmV3IE1vbnN0ZXIoKSkuX19pbml0KGJiLnJlYWRJbnQzMihiYi5wb3NpdGlvbigpKSArIGJiLnBvc2l0aW9uKCksIGJiKTsKICAgICB9CiAgICAgc3RhdGljIGdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuICdNeUdhbWUuRXhhbXBsZTIuTW9uc3Rlcic7CisgICAgICAgIHJldHVybiAnTXlHYW1lX0V4YW1wbGUyX01vbnN0ZXInOwogICAgIH0KICAgICBzdGF0aWMgc3RhcnRNb25zdGVyKGJ1aWxkZXIpIHsKICAgICAgICAgYnVpbGRlci5zdGFydE9iamVjdCgwKTsKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL215LWdhbWUvZXhhbXBsZTIvbW9uc3Rlci50cyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL215LWdhbWUvZXhhbXBsZTIvbW9uc3Rlci50cwppbmRleCAxNGQ3Njg1Li43MjQwNDc2IDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9teS1nYW1lL2V4YW1wbGUyL21vbnN0ZXIudHMKKysrIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvbXktZ2FtZS9leGFtcGxlMi9tb25zdGVyLnRzCkBAIC03LDcgKzcsNyBAQAogZXhwb3J0IGNsYXNzIE1vbnN0ZXIgewogICBiYjogZmxhdGJ1ZmZlcnMuQnl0ZUJ1ZmZlcnxudWxsID0gbnVsbDsKICAgYmJfcG9zID0gMDsKLV9faW5pdChpOm51bWJlciwgYmI6ZmxhdGJ1ZmZlcnMuQnl0ZUJ1ZmZlcik6TW9uc3RlciB7CisgIF9faW5pdChpOm51bWJlciwgYmI6ZmxhdGJ1ZmZlcnMuQnl0ZUJ1ZmZlcik6TW9uc3RlciB7CiAgIHRoaXMuYmJfcG9zID0gaTsKICAgdGhpcy5iYiA9IGJiOwogICByZXR1cm4gdGhpczsKQEAgLTIzLDcgKzIzLDcgQEAKIH0KIAogc3RhdGljIGdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpOnN0cmluZyB7Ci0gIHJldHVybiAnTXlHYW1lLkV4YW1wbGUyLk1vbnN0ZXInOworICByZXR1cm4gJ015R2FtZV9FeGFtcGxlMl9Nb25zdGVyJzsKIH0KIAogc3RhdGljIHN0YXJ0TW9uc3RlcihidWlsZGVyOmZsYXRidWZmZXJzLkJ1aWxkZXIpIHsKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL215LWdhbWUvaW4tcGFyZW50LW5hbWVzcGFjZS5qcyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL215LWdhbWUvaW4tcGFyZW50LW5hbWVzcGFjZS5qcwppbmRleCA0ODgxNzQxLi4yNGIwZWQ3IDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9teS1nYW1lL2luLXBhcmVudC1uYW1lc3BhY2UuanMKKysrIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvbXktZ2FtZS9pbi1wYXJlbnQtbmFtZXNwYWNlLmpzCkBAIC0xOCw3ICsxOCw3IEBACiAgICAgICAgIHJldHVybiAob2JqIHx8IG5ldyBJblBhcmVudE5hbWVzcGFjZSgpKS5fX2luaXQoYmIucmVhZEludDMyKGJiLnBvc2l0aW9uKCkpICsgYmIucG9zaXRpb24oKSwgYmIpOwogICAgIH0KICAgICBzdGF0aWMgZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCkgewotICAgICAgICByZXR1cm4gJ015R2FtZS5JblBhcmVudE5hbWVzcGFjZSc7CisgICAgICAgIHJldHVybiAnTXlHYW1lX0luUGFyZW50TmFtZXNwYWNlJzsKICAgICB9CiAgICAgc3RhdGljIHN0YXJ0SW5QYXJlbnROYW1lc3BhY2UoYnVpbGRlcikgewogICAgICAgICBidWlsZGVyLnN0YXJ0T2JqZWN0KDApOwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvbXktZ2FtZS9pbi1wYXJlbnQtbmFtZXNwYWNlLnRzIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvbXktZ2FtZS9pbi1wYXJlbnQtbmFtZXNwYWNlLnRzCmluZGV4IDhjZmU5YjYuLjBkZTk0ZGYgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL215LWdhbWUvaW4tcGFyZW50LW5hbWVzcGFjZS50cworKysgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9teS1nYW1lL2luLXBhcmVudC1uYW1lc3BhY2UudHMKQEAgLTcsNyArNyw3IEBACiBleHBvcnQgY2xhc3MgSW5QYXJlbnROYW1lc3BhY2UgewogICBiYjogZmxhdGJ1ZmZlcnMuQnl0ZUJ1ZmZlcnxudWxsID0gbnVsbDsKICAgYmJfcG9zID0gMDsKLV9faW5pdChpOm51bWJlciwgYmI6ZmxhdGJ1ZmZlcnMuQnl0ZUJ1ZmZlcik6SW5QYXJlbnROYW1lc3BhY2UgeworICBfX2luaXQoaTpudW1iZXIsIGJiOmZsYXRidWZmZXJzLkJ5dGVCdWZmZXIpOkluUGFyZW50TmFtZXNwYWNlIHsKICAgdGhpcy5iYl9wb3MgPSBpOwogICB0aGlzLmJiID0gYmI7CiAgIHJldHVybiB0aGlzOwpAQCAtMjMsNyArMjMsNyBAQAogfQogCiBzdGF0aWMgZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCk6c3RyaW5nIHsKLSAgcmV0dXJuICdNeUdhbWUuSW5QYXJlbnROYW1lc3BhY2UnOworICByZXR1cm4gJ015R2FtZV9JblBhcmVudE5hbWVzcGFjZSc7CiB9CiAKIHN0YXRpYyBzdGFydEluUGFyZW50TmFtZXNwYWNlKGJ1aWxkZXI6ZmxhdGJ1ZmZlcnMuQnVpbGRlcikgewpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvbmFtZXNwYWNlX3Rlc3QvTmFtZXNwYWNlQS9OYW1lc3BhY2VCL1N0cnVjdEluTmVzdGVkTlMuY3MgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9uYW1lc3BhY2VfdGVzdC9OYW1lc3BhY2VBL05hbWVzcGFjZUIvU3RydWN0SW5OZXN0ZWROUy5jcwppbmRleCAwZWQ2YTYzLi4yODc0YTI3IDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9uYW1lc3BhY2VfdGVzdC9OYW1lc3BhY2VBL05hbWVzcGFjZUIvU3RydWN0SW5OZXN0ZWROUy5jcworKysgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9uYW1lc3BhY2VfdGVzdC9OYW1lc3BhY2VBL05hbWVzcGFjZUIvU3RydWN0SW5OZXN0ZWROUy5jcwpAQCAtNyw3ICs3LDcgQEAKIAogdXNpbmcgZ2xvYmFsOjpTeXN0ZW07CiB1c2luZyBnbG9iYWw6OlN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwotdXNpbmcgZ2xvYmFsOjpGbGF0QnVmZmVyczsKK3VzaW5nIGdsb2JhbDo6R29vZ2xlLkZsYXRCdWZmZXJzOwogCiBwdWJsaWMgc3RydWN0IFN0cnVjdEluTmVzdGVkTlMgOiBJRmxhdGJ1ZmZlck9iamVjdAogewpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvbmFtZXNwYWNlX3Rlc3QvTmFtZXNwYWNlQS9OYW1lc3BhY2VCL1RhYmxlSW5OZXN0ZWROUy5jcyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL25hbWVzcGFjZV90ZXN0L05hbWVzcGFjZUEvTmFtZXNwYWNlQi9UYWJsZUluTmVzdGVkTlMuY3MKaW5kZXggOWU2NzExMi4uZmFiOGUwMiAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvbmFtZXNwYWNlX3Rlc3QvTmFtZXNwYWNlQS9OYW1lc3BhY2VCL1RhYmxlSW5OZXN0ZWROUy5jcworKysgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9uYW1lc3BhY2VfdGVzdC9OYW1lc3BhY2VBL05hbWVzcGFjZUIvVGFibGVJbk5lc3RlZE5TLmNzCkBAIC03LDEzICs3LDEzIEBACiAKIHVzaW5nIGdsb2JhbDo6U3lzdGVtOwogdXNpbmcgZ2xvYmFsOjpTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKLXVzaW5nIGdsb2JhbDo6RmxhdEJ1ZmZlcnM7Cit1c2luZyBnbG9iYWw6Okdvb2dsZS5GbGF0QnVmZmVyczsKIAogcHVibGljIHN0cnVjdCBUYWJsZUluTmVzdGVkTlMgOiBJRmxhdGJ1ZmZlck9iamVjdAogewogICBwcml2YXRlIFRhYmxlIF9fcDsKICAgcHVibGljIEJ5dGVCdWZmZXIgQnl0ZUJ1ZmZlciB7IGdldCB7IHJldHVybiBfX3AuYmI7IH0gfQotICBwdWJsaWMgc3RhdGljIHZvaWQgVmFsaWRhdGVWZXJzaW9uKCkgeyBGbGF0QnVmZmVyQ29uc3RhbnRzLkZMQVRCVUZGRVJTXzJfMF8wKCk7IH0KKyAgcHVibGljIHN0YXRpYyB2b2lkIFZhbGlkYXRlVmVyc2lvbigpIHsgRmxhdEJ1ZmZlckNvbnN0YW50cy5GTEFUQlVGRkVSU18yXzBfOCgpOyB9CiAgIHB1YmxpYyBzdGF0aWMgVGFibGVJbk5lc3RlZE5TIEdldFJvb3RBc1RhYmxlSW5OZXN0ZWROUyhCeXRlQnVmZmVyIF9iYikgeyByZXR1cm4gR2V0Um9vdEFzVGFibGVJbk5lc3RlZE5TKF9iYiwgbmV3IFRhYmxlSW5OZXN0ZWROUygpKTsgfQogICBwdWJsaWMgc3RhdGljIFRhYmxlSW5OZXN0ZWROUyBHZXRSb290QXNUYWJsZUluTmVzdGVkTlMoQnl0ZUJ1ZmZlciBfYmIsIFRhYmxlSW5OZXN0ZWROUyBvYmopIHsgcmV0dXJuIChvYmouX19hc3NpZ24oX2JiLkdldEludChfYmIuUG9zaXRpb24pICsgX2JiLlBvc2l0aW9uLCBfYmIpKTsgfQogICBwdWJsaWMgdm9pZCBfX2luaXQoaW50IF9pLCBCeXRlQnVmZmVyIF9iYikgeyBfX3AgPSBuZXcgVGFibGUoX2ksIF9iYik7IH0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL25hbWVzcGFjZV90ZXN0L05hbWVzcGFjZUEvTmFtZXNwYWNlQi9UYWJsZUluTmVzdGVkTlMuamF2YSBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL25hbWVzcGFjZV90ZXN0L05hbWVzcGFjZUEvTmFtZXNwYWNlQi9UYWJsZUluTmVzdGVkTlMuamF2YQppbmRleCA0NWU0OTc0Li5lMTg1ZTRiIDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9uYW1lc3BhY2VfdGVzdC9OYW1lc3BhY2VBL05hbWVzcGFjZUIvVGFibGVJbk5lc3RlZE5TLmphdmEKKysrIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvbmFtZXNwYWNlX3Rlc3QvTmFtZXNwYWNlQS9OYW1lc3BhY2VCL1RhYmxlSW5OZXN0ZWROUy5qYXZhCkBAIC05LDcgKzksNyBAQAogCiBAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikKIHB1YmxpYyBmaW5hbCBjbGFzcyBUYWJsZUluTmVzdGVkTlMgZXh0ZW5kcyBUYWJsZSB7Ci0gIHB1YmxpYyBzdGF0aWMgdm9pZCBWYWxpZGF0ZVZlcnNpb24oKSB7IENvbnN0YW50cy5GTEFUQlVGRkVSU18yXzBfMCgpOyB9CisgIHB1YmxpYyBzdGF0aWMgdm9pZCBWYWxpZGF0ZVZlcnNpb24oKSB7IENvbnN0YW50cy5GTEFUQlVGRkVSU18yXzBfOCgpOyB9CiAgIHB1YmxpYyBzdGF0aWMgVGFibGVJbk5lc3RlZE5TIGdldFJvb3RBc1RhYmxlSW5OZXN0ZWROUyhCeXRlQnVmZmVyIF9iYikgeyByZXR1cm4gZ2V0Um9vdEFzVGFibGVJbk5lc3RlZE5TKF9iYiwgbmV3IFRhYmxlSW5OZXN0ZWROUygpKTsgfQogICBwdWJsaWMgc3RhdGljIFRhYmxlSW5OZXN0ZWROUyBnZXRSb290QXNUYWJsZUluTmVzdGVkTlMoQnl0ZUJ1ZmZlciBfYmIsIFRhYmxlSW5OZXN0ZWROUyBvYmopIHsgX2JiLm9yZGVyKEJ5dGVPcmRlci5MSVRUTEVfRU5ESUFOKTsgcmV0dXJuIChvYmouX19hc3NpZ24oX2JiLmdldEludChfYmIucG9zaXRpb24oKSkgKyBfYmIucG9zaXRpb24oKSwgX2JiKSk7IH0KICAgcHVibGljIHZvaWQgX19pbml0KGludCBfaSwgQnl0ZUJ1ZmZlciBfYmIpIHsgX19yZXNldChfaSwgX2JiKTsgfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvbmFtZXNwYWNlX3Rlc3QvTmFtZXNwYWNlQS9OYW1lc3BhY2VCL1RhYmxlSW5OZXN0ZWROUy5rdCBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL25hbWVzcGFjZV90ZXN0L05hbWVzcGFjZUEvTmFtZXNwYWNlQi9UYWJsZUluTmVzdGVkTlMua3QKaW5kZXggY2I0Y2MxMC4uMGZiYmJhOCAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvbmFtZXNwYWNlX3Rlc3QvTmFtZXNwYWNlQS9OYW1lc3BhY2VCL1RhYmxlSW5OZXN0ZWROUy5rdAorKysgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9uYW1lc3BhY2VfdGVzdC9OYW1lc3BhY2VBL05hbWVzcGFjZUIvVGFibGVJbk5lc3RlZE5TLmt0CkBAIC0zMiw3ICszMiw3IEBACiAgICAgICAgIH0KICAgICB9CiAgICAgY29tcGFuaW9uIG9iamVjdCB7Ci0gICAgICAgIGZ1biB2YWxpZGF0ZVZlcnNpb24oKSA9IENvbnN0YW50cy5GTEFUQlVGRkVSU18yXzBfMCgpCisgICAgICAgIGZ1biB2YWxpZGF0ZVZlcnNpb24oKSA9IENvbnN0YW50cy5GTEFUQlVGRkVSU18yXzBfOCgpCiAgICAgICAgIGZ1biBnZXRSb290QXNUYWJsZUluTmVzdGVkTlMoX2JiOiBCeXRlQnVmZmVyKTogVGFibGVJbk5lc3RlZE5TID0gZ2V0Um9vdEFzVGFibGVJbk5lc3RlZE5TKF9iYiwgVGFibGVJbk5lc3RlZE5TKCkpCiAgICAgICAgIGZ1biBnZXRSb290QXNUYWJsZUluTmVzdGVkTlMoX2JiOiBCeXRlQnVmZmVyLCBvYmo6IFRhYmxlSW5OZXN0ZWROUyk6IFRhYmxlSW5OZXN0ZWROUyB7CiAgICAgICAgICAgICBfYmIub3JkZXIoQnl0ZU9yZGVyLkxJVFRMRV9FTkRJQU4pCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9uYW1lc3BhY2VfdGVzdC9OYW1lc3BhY2VBL05hbWVzcGFjZUIvVW5pb25Jbk5lc3RlZE5TLmNzIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvbmFtZXNwYWNlX3Rlc3QvTmFtZXNwYWNlQS9OYW1lc3BhY2VCL1VuaW9uSW5OZXN0ZWROUy5jcwppbmRleCA3ZDEyMzRmLi4wOGJjNDMxIDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9uYW1lc3BhY2VfdGVzdC9OYW1lc3BhY2VBL05hbWVzcGFjZUIvVW5pb25Jbk5lc3RlZE5TLmNzCisrKyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL25hbWVzcGFjZV90ZXN0L05hbWVzcGFjZUEvTmFtZXNwYWNlQi9VbmlvbkluTmVzdGVkTlMuY3MKQEAgLTI1LDcgKzI1LDcgQEAKICAgcHVibGljIE5hbWVzcGFjZUEuTmFtZXNwYWNlQi5UYWJsZUluTmVzdGVkTlNUIEFzVGFibGVJbk5lc3RlZE5TKCkgeyByZXR1cm4gdGhpcy5BczxOYW1lc3BhY2VBLk5hbWVzcGFjZUIuVGFibGVJbk5lc3RlZE5TVD4oKTsgfQogICBwdWJsaWMgc3RhdGljIFVuaW9uSW5OZXN0ZWROU1VuaW9uIEZyb21UYWJsZUluTmVzdGVkTlMoTmFtZXNwYWNlQS5OYW1lc3BhY2VCLlRhYmxlSW5OZXN0ZWROU1QgX3RhYmxlaW5uZXN0ZWRucykgeyByZXR1cm4gbmV3IFVuaW9uSW5OZXN0ZWROU1VuaW9ueyBUeXBlID0gVW5pb25Jbk5lc3RlZE5TLlRhYmxlSW5OZXN0ZWROUywgVmFsdWUgPSBfdGFibGVpbm5lc3RlZG5zIH07IH0KIAotICBwdWJsaWMgc3RhdGljIGludCBQYWNrKEZsYXRCdWZmZXJzLkZsYXRCdWZmZXJCdWlsZGVyIGJ1aWxkZXIsIFVuaW9uSW5OZXN0ZWROU1VuaW9uIF9vKSB7CisgIHB1YmxpYyBzdGF0aWMgaW50IFBhY2soR29vZ2xlLkZsYXRCdWZmZXJzLkZsYXRCdWZmZXJCdWlsZGVyIGJ1aWxkZXIsIFVuaW9uSW5OZXN0ZWROU1VuaW9uIF9vKSB7CiAgICAgc3dpdGNoIChfby5UeXBlKSB7CiAgICAgICBkZWZhdWx0OiByZXR1cm4gMDsKICAgICAgIGNhc2UgVW5pb25Jbk5lc3RlZE5TLlRhYmxlSW5OZXN0ZWROUzogcmV0dXJuIE5hbWVzcGFjZUEuTmFtZXNwYWNlQi5UYWJsZUluTmVzdGVkTlMuUGFjayhidWlsZGVyLCBfby5Bc1RhYmxlSW5OZXN0ZWROUygpKS5WYWx1ZTsKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL25hbWVzcGFjZV90ZXN0L05hbWVzcGFjZUEvU2Vjb25kVGFibGVJbkEuY3MgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9uYW1lc3BhY2VfdGVzdC9OYW1lc3BhY2VBL1NlY29uZFRhYmxlSW5BLmNzCmluZGV4IDZlN2VmODguLjlkYjIyMjYgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL25hbWVzcGFjZV90ZXN0L05hbWVzcGFjZUEvU2Vjb25kVGFibGVJbkEuY3MKKysrIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvbmFtZXNwYWNlX3Rlc3QvTmFtZXNwYWNlQS9TZWNvbmRUYWJsZUluQS5jcwpAQCAtNywxMyArNywxMyBAQAogCiB1c2luZyBnbG9iYWw6OlN5c3RlbTsKIHVzaW5nIGdsb2JhbDo6U3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Ci11c2luZyBnbG9iYWw6OkZsYXRCdWZmZXJzOwordXNpbmcgZ2xvYmFsOjpHb29nbGUuRmxhdEJ1ZmZlcnM7CiAKIHB1YmxpYyBzdHJ1Y3QgU2Vjb25kVGFibGVJbkEgOiBJRmxhdGJ1ZmZlck9iamVjdAogewogICBwcml2YXRlIFRhYmxlIF9fcDsKICAgcHVibGljIEJ5dGVCdWZmZXIgQnl0ZUJ1ZmZlciB7IGdldCB7IHJldHVybiBfX3AuYmI7IH0gfQotICBwdWJsaWMgc3RhdGljIHZvaWQgVmFsaWRhdGVWZXJzaW9uKCkgeyBGbGF0QnVmZmVyQ29uc3RhbnRzLkZMQVRCVUZGRVJTXzJfMF8wKCk7IH0KKyAgcHVibGljIHN0YXRpYyB2b2lkIFZhbGlkYXRlVmVyc2lvbigpIHsgRmxhdEJ1ZmZlckNvbnN0YW50cy5GTEFUQlVGRkVSU18yXzBfOCgpOyB9CiAgIHB1YmxpYyBzdGF0aWMgU2Vjb25kVGFibGVJbkEgR2V0Um9vdEFzU2Vjb25kVGFibGVJbkEoQnl0ZUJ1ZmZlciBfYmIpIHsgcmV0dXJuIEdldFJvb3RBc1NlY29uZFRhYmxlSW5BKF9iYiwgbmV3IFNlY29uZFRhYmxlSW5BKCkpOyB9CiAgIHB1YmxpYyBzdGF0aWMgU2Vjb25kVGFibGVJbkEgR2V0Um9vdEFzU2Vjb25kVGFibGVJbkEoQnl0ZUJ1ZmZlciBfYmIsIFNlY29uZFRhYmxlSW5BIG9iaikgeyByZXR1cm4gKG9iai5fX2Fzc2lnbihfYmIuR2V0SW50KF9iYi5Qb3NpdGlvbikgKyBfYmIuUG9zaXRpb24sIF9iYikpOyB9CiAgIHB1YmxpYyB2b2lkIF9faW5pdChpbnQgX2ksIEJ5dGVCdWZmZXIgX2JiKSB7IF9fcCA9IG5ldyBUYWJsZShfaSwgX2JiKTsgfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvbmFtZXNwYWNlX3Rlc3QvTmFtZXNwYWNlQS9TZWNvbmRUYWJsZUluQS5qYXZhIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvbmFtZXNwYWNlX3Rlc3QvTmFtZXNwYWNlQS9TZWNvbmRUYWJsZUluQS5qYXZhCmluZGV4IGZmNTM5YWIuLmYyZTY1ZDQgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL25hbWVzcGFjZV90ZXN0L05hbWVzcGFjZUEvU2Vjb25kVGFibGVJbkEuamF2YQorKysgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9uYW1lc3BhY2VfdGVzdC9OYW1lc3BhY2VBL1NlY29uZFRhYmxlSW5BLmphdmEKQEAgLTksNyArOSw3IEBACiAKIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKQogcHVibGljIGZpbmFsIGNsYXNzIFNlY29uZFRhYmxlSW5BIGV4dGVuZHMgVGFibGUgewotICBwdWJsaWMgc3RhdGljIHZvaWQgVmFsaWRhdGVWZXJzaW9uKCkgeyBDb25zdGFudHMuRkxBVEJVRkZFUlNfMl8wXzAoKTsgfQorICBwdWJsaWMgc3RhdGljIHZvaWQgVmFsaWRhdGVWZXJzaW9uKCkgeyBDb25zdGFudHMuRkxBVEJVRkZFUlNfMl8wXzgoKTsgfQogICBwdWJsaWMgc3RhdGljIFNlY29uZFRhYmxlSW5BIGdldFJvb3RBc1NlY29uZFRhYmxlSW5BKEJ5dGVCdWZmZXIgX2JiKSB7IHJldHVybiBnZXRSb290QXNTZWNvbmRUYWJsZUluQShfYmIsIG5ldyBTZWNvbmRUYWJsZUluQSgpKTsgfQogICBwdWJsaWMgc3RhdGljIFNlY29uZFRhYmxlSW5BIGdldFJvb3RBc1NlY29uZFRhYmxlSW5BKEJ5dGVCdWZmZXIgX2JiLCBTZWNvbmRUYWJsZUluQSBvYmopIHsgX2JiLm9yZGVyKEJ5dGVPcmRlci5MSVRUTEVfRU5ESUFOKTsgcmV0dXJuIChvYmouX19hc3NpZ24oX2JiLmdldEludChfYmIucG9zaXRpb24oKSkgKyBfYmIucG9zaXRpb24oKSwgX2JiKSk7IH0KICAgcHVibGljIHZvaWQgX19pbml0KGludCBfaSwgQnl0ZUJ1ZmZlciBfYmIpIHsgX19yZXNldChfaSwgX2JiKTsgfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvbmFtZXNwYWNlX3Rlc3QvTmFtZXNwYWNlQS9TZWNvbmRUYWJsZUluQS5rdCBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL25hbWVzcGFjZV90ZXN0L05hbWVzcGFjZUEvU2Vjb25kVGFibGVJbkEua3QKaW5kZXggYTUxNjA3MC4uNTBkMDJkZiAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvbmFtZXNwYWNlX3Rlc3QvTmFtZXNwYWNlQS9TZWNvbmRUYWJsZUluQS5rdAorKysgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9uYW1lc3BhY2VfdGVzdC9OYW1lc3BhY2VBL1NlY29uZFRhYmxlSW5BLmt0CkBAIC0yNyw3ICsyNyw3IEBACiAgICAgICAgIH0KICAgICB9CiAgICAgY29tcGFuaW9uIG9iamVjdCB7Ci0gICAgICAgIGZ1biB2YWxpZGF0ZVZlcnNpb24oKSA9IENvbnN0YW50cy5GTEFUQlVGRkVSU18yXzBfMCgpCisgICAgICAgIGZ1biB2YWxpZGF0ZVZlcnNpb24oKSA9IENvbnN0YW50cy5GTEFUQlVGRkVSU18yXzBfOCgpCiAgICAgICAgIGZ1biBnZXRSb290QXNTZWNvbmRUYWJsZUluQShfYmI6IEJ5dGVCdWZmZXIpOiBTZWNvbmRUYWJsZUluQSA9IGdldFJvb3RBc1NlY29uZFRhYmxlSW5BKF9iYiwgU2Vjb25kVGFibGVJbkEoKSkKICAgICAgICAgZnVuIGdldFJvb3RBc1NlY29uZFRhYmxlSW5BKF9iYjogQnl0ZUJ1ZmZlciwgb2JqOiBTZWNvbmRUYWJsZUluQSk6IFNlY29uZFRhYmxlSW5BIHsKICAgICAgICAgICAgIF9iYi5vcmRlcihCeXRlT3JkZXIuTElUVExFX0VORElBTikKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL25hbWVzcGFjZV90ZXN0L05hbWVzcGFjZUEvVGFibGVJbkZpcnN0TlMuY3MgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9uYW1lc3BhY2VfdGVzdC9OYW1lc3BhY2VBL1RhYmxlSW5GaXJzdE5TLmNzCmluZGV4IDY1MjJmNDkuLmFkNzJlZWUgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL25hbWVzcGFjZV90ZXN0L05hbWVzcGFjZUEvVGFibGVJbkZpcnN0TlMuY3MKKysrIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvbmFtZXNwYWNlX3Rlc3QvTmFtZXNwYWNlQS9UYWJsZUluRmlyc3ROUy5jcwpAQCAtNywxMyArNywxMyBAQAogCiB1c2luZyBnbG9iYWw6OlN5c3RlbTsKIHVzaW5nIGdsb2JhbDo6U3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Ci11c2luZyBnbG9iYWw6OkZsYXRCdWZmZXJzOwordXNpbmcgZ2xvYmFsOjpHb29nbGUuRmxhdEJ1ZmZlcnM7CiAKIHB1YmxpYyBzdHJ1Y3QgVGFibGVJbkZpcnN0TlMgOiBJRmxhdGJ1ZmZlck9iamVjdAogewogICBwcml2YXRlIFRhYmxlIF9fcDsKICAgcHVibGljIEJ5dGVCdWZmZXIgQnl0ZUJ1ZmZlciB7IGdldCB7IHJldHVybiBfX3AuYmI7IH0gfQotICBwdWJsaWMgc3RhdGljIHZvaWQgVmFsaWRhdGVWZXJzaW9uKCkgeyBGbGF0QnVmZmVyQ29uc3RhbnRzLkZMQVRCVUZGRVJTXzJfMF8wKCk7IH0KKyAgcHVibGljIHN0YXRpYyB2b2lkIFZhbGlkYXRlVmVyc2lvbigpIHsgRmxhdEJ1ZmZlckNvbnN0YW50cy5GTEFUQlVGRkVSU18yXzBfOCgpOyB9CiAgIHB1YmxpYyBzdGF0aWMgVGFibGVJbkZpcnN0TlMgR2V0Um9vdEFzVGFibGVJbkZpcnN0TlMoQnl0ZUJ1ZmZlciBfYmIpIHsgcmV0dXJuIEdldFJvb3RBc1RhYmxlSW5GaXJzdE5TKF9iYiwgbmV3IFRhYmxlSW5GaXJzdE5TKCkpOyB9CiAgIHB1YmxpYyBzdGF0aWMgVGFibGVJbkZpcnN0TlMgR2V0Um9vdEFzVGFibGVJbkZpcnN0TlMoQnl0ZUJ1ZmZlciBfYmIsIFRhYmxlSW5GaXJzdE5TIG9iaikgeyByZXR1cm4gKG9iai5fX2Fzc2lnbihfYmIuR2V0SW50KF9iYi5Qb3NpdGlvbikgKyBfYmIuUG9zaXRpb24sIF9iYikpOyB9CiAgIHB1YmxpYyB2b2lkIF9faW5pdChpbnQgX2ksIEJ5dGVCdWZmZXIgX2JiKSB7IF9fcCA9IG5ldyBUYWJsZShfaSwgX2JiKTsgfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvbmFtZXNwYWNlX3Rlc3QvTmFtZXNwYWNlQS9UYWJsZUluRmlyc3ROUy5qYXZhIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvbmFtZXNwYWNlX3Rlc3QvTmFtZXNwYWNlQS9UYWJsZUluRmlyc3ROUy5qYXZhCmluZGV4IDJmZGZlYzguLjgwOWVjZTIgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL25hbWVzcGFjZV90ZXN0L05hbWVzcGFjZUEvVGFibGVJbkZpcnN0TlMuamF2YQorKysgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9uYW1lc3BhY2VfdGVzdC9OYW1lc3BhY2VBL1RhYmxlSW5GaXJzdE5TLmphdmEKQEAgLTksNyArOSw3IEBACiAKIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKQogcHVibGljIGZpbmFsIGNsYXNzIFRhYmxlSW5GaXJzdE5TIGV4dGVuZHMgVGFibGUgewotICBwdWJsaWMgc3RhdGljIHZvaWQgVmFsaWRhdGVWZXJzaW9uKCkgeyBDb25zdGFudHMuRkxBVEJVRkZFUlNfMl8wXzAoKTsgfQorICBwdWJsaWMgc3RhdGljIHZvaWQgVmFsaWRhdGVWZXJzaW9uKCkgeyBDb25zdGFudHMuRkxBVEJVRkZFUlNfMl8wXzgoKTsgfQogICBwdWJsaWMgc3RhdGljIFRhYmxlSW5GaXJzdE5TIGdldFJvb3RBc1RhYmxlSW5GaXJzdE5TKEJ5dGVCdWZmZXIgX2JiKSB7IHJldHVybiBnZXRSb290QXNUYWJsZUluRmlyc3ROUyhfYmIsIG5ldyBUYWJsZUluRmlyc3ROUygpKTsgfQogICBwdWJsaWMgc3RhdGljIFRhYmxlSW5GaXJzdE5TIGdldFJvb3RBc1RhYmxlSW5GaXJzdE5TKEJ5dGVCdWZmZXIgX2JiLCBUYWJsZUluRmlyc3ROUyBvYmopIHsgX2JiLm9yZGVyKEJ5dGVPcmRlci5MSVRUTEVfRU5ESUFOKTsgcmV0dXJuIChvYmouX19hc3NpZ24oX2JiLmdldEludChfYmIucG9zaXRpb24oKSkgKyBfYmIucG9zaXRpb24oKSwgX2JiKSk7IH0KICAgcHVibGljIHZvaWQgX19pbml0KGludCBfaSwgQnl0ZUJ1ZmZlciBfYmIpIHsgX19yZXNldChfaSwgX2JiKTsgfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvbmFtZXNwYWNlX3Rlc3QvTmFtZXNwYWNlQS9UYWJsZUluRmlyc3ROUy5rdCBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL25hbWVzcGFjZV90ZXN0L05hbWVzcGFjZUEvVGFibGVJbkZpcnN0TlMua3QKaW5kZXggYmVjMzMxOS4uNGFlOTM2OCAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvbmFtZXNwYWNlX3Rlc3QvTmFtZXNwYWNlQS9UYWJsZUluRmlyc3ROUy5rdAorKysgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9uYW1lc3BhY2VfdGVzdC9OYW1lc3BhY2VBL1RhYmxlSW5GaXJzdE5TLmt0CkBAIC02Nyw3ICs2Nyw3IEBACiAgICAgICAgIH0KICAgICB9CiAgICAgY29tcGFuaW9uIG9iamVjdCB7Ci0gICAgICAgIGZ1biB2YWxpZGF0ZVZlcnNpb24oKSA9IENvbnN0YW50cy5GTEFUQlVGRkVSU18yXzBfMCgpCisgICAgICAgIGZ1biB2YWxpZGF0ZVZlcnNpb24oKSA9IENvbnN0YW50cy5GTEFUQlVGRkVSU18yXzBfOCgpCiAgICAgICAgIGZ1biBnZXRSb290QXNUYWJsZUluRmlyc3ROUyhfYmI6IEJ5dGVCdWZmZXIpOiBUYWJsZUluRmlyc3ROUyA9IGdldFJvb3RBc1RhYmxlSW5GaXJzdE5TKF9iYiwgVGFibGVJbkZpcnN0TlMoKSkKICAgICAgICAgZnVuIGdldFJvb3RBc1RhYmxlSW5GaXJzdE5TKF9iYjogQnl0ZUJ1ZmZlciwgb2JqOiBUYWJsZUluRmlyc3ROUyk6IFRhYmxlSW5GaXJzdE5TIHsKICAgICAgICAgICAgIF9iYi5vcmRlcihCeXRlT3JkZXIuTElUVExFX0VORElBTikKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL25hbWVzcGFjZV90ZXN0L05hbWVzcGFjZUMvVGFibGVJbkMuY3MgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9uYW1lc3BhY2VfdGVzdC9OYW1lc3BhY2VDL1RhYmxlSW5DLmNzCmluZGV4IDIwNzdlMzIuLjUwY2EzZTQgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL25hbWVzcGFjZV90ZXN0L05hbWVzcGFjZUMvVGFibGVJbkMuY3MKKysrIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvbmFtZXNwYWNlX3Rlc3QvTmFtZXNwYWNlQy9UYWJsZUluQy5jcwpAQCAtNywxMyArNywxMyBAQAogCiB1c2luZyBnbG9iYWw6OlN5c3RlbTsKIHVzaW5nIGdsb2JhbDo6U3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Ci11c2luZyBnbG9iYWw6OkZsYXRCdWZmZXJzOwordXNpbmcgZ2xvYmFsOjpHb29nbGUuRmxhdEJ1ZmZlcnM7CiAKIHB1YmxpYyBzdHJ1Y3QgVGFibGVJbkMgOiBJRmxhdGJ1ZmZlck9iamVjdAogewogICBwcml2YXRlIFRhYmxlIF9fcDsKICAgcHVibGljIEJ5dGVCdWZmZXIgQnl0ZUJ1ZmZlciB7IGdldCB7IHJldHVybiBfX3AuYmI7IH0gfQotICBwdWJsaWMgc3RhdGljIHZvaWQgVmFsaWRhdGVWZXJzaW9uKCkgeyBGbGF0QnVmZmVyQ29uc3RhbnRzLkZMQVRCVUZGRVJTXzJfMF8wKCk7IH0KKyAgcHVibGljIHN0YXRpYyB2b2lkIFZhbGlkYXRlVmVyc2lvbigpIHsgRmxhdEJ1ZmZlckNvbnN0YW50cy5GTEFUQlVGRkVSU18yXzBfOCgpOyB9CiAgIHB1YmxpYyBzdGF0aWMgVGFibGVJbkMgR2V0Um9vdEFzVGFibGVJbkMoQnl0ZUJ1ZmZlciBfYmIpIHsgcmV0dXJuIEdldFJvb3RBc1RhYmxlSW5DKF9iYiwgbmV3IFRhYmxlSW5DKCkpOyB9CiAgIHB1YmxpYyBzdGF0aWMgVGFibGVJbkMgR2V0Um9vdEFzVGFibGVJbkMoQnl0ZUJ1ZmZlciBfYmIsIFRhYmxlSW5DIG9iaikgeyByZXR1cm4gKG9iai5fX2Fzc2lnbihfYmIuR2V0SW50KF9iYi5Qb3NpdGlvbikgKyBfYmIuUG9zaXRpb24sIF9iYikpOyB9CiAgIHB1YmxpYyB2b2lkIF9faW5pdChpbnQgX2ksIEJ5dGVCdWZmZXIgX2JiKSB7IF9fcCA9IG5ldyBUYWJsZShfaSwgX2JiKTsgfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvbmFtZXNwYWNlX3Rlc3QvTmFtZXNwYWNlQy9UYWJsZUluQy5qYXZhIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvbmFtZXNwYWNlX3Rlc3QvTmFtZXNwYWNlQy9UYWJsZUluQy5qYXZhCmluZGV4IDA0Y2VhYzcuLjdhZjc2MjAgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL25hbWVzcGFjZV90ZXN0L05hbWVzcGFjZUMvVGFibGVJbkMuamF2YQorKysgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9uYW1lc3BhY2VfdGVzdC9OYW1lc3BhY2VDL1RhYmxlSW5DLmphdmEKQEAgLTksNyArOSw3IEBACiAKIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKQogcHVibGljIGZpbmFsIGNsYXNzIFRhYmxlSW5DIGV4dGVuZHMgVGFibGUgewotICBwdWJsaWMgc3RhdGljIHZvaWQgVmFsaWRhdGVWZXJzaW9uKCkgeyBDb25zdGFudHMuRkxBVEJVRkZFUlNfMl8wXzAoKTsgfQorICBwdWJsaWMgc3RhdGljIHZvaWQgVmFsaWRhdGVWZXJzaW9uKCkgeyBDb25zdGFudHMuRkxBVEJVRkZFUlNfMl8wXzgoKTsgfQogICBwdWJsaWMgc3RhdGljIFRhYmxlSW5DIGdldFJvb3RBc1RhYmxlSW5DKEJ5dGVCdWZmZXIgX2JiKSB7IHJldHVybiBnZXRSb290QXNUYWJsZUluQyhfYmIsIG5ldyBUYWJsZUluQygpKTsgfQogICBwdWJsaWMgc3RhdGljIFRhYmxlSW5DIGdldFJvb3RBc1RhYmxlSW5DKEJ5dGVCdWZmZXIgX2JiLCBUYWJsZUluQyBvYmopIHsgX2JiLm9yZGVyKEJ5dGVPcmRlci5MSVRUTEVfRU5ESUFOKTsgcmV0dXJuIChvYmouX19hc3NpZ24oX2JiLmdldEludChfYmIucG9zaXRpb24oKSkgKyBfYmIucG9zaXRpb24oKSwgX2JiKSk7IH0KICAgcHVibGljIHZvaWQgX19pbml0KGludCBfaSwgQnl0ZUJ1ZmZlciBfYmIpIHsgX19yZXNldChfaSwgX2JiKTsgfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvbmFtZXNwYWNlX3Rlc3QvTmFtZXNwYWNlQy9UYWJsZUluQy5rdCBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL25hbWVzcGFjZV90ZXN0L05hbWVzcGFjZUMvVGFibGVJbkMua3QKaW5kZXggNzU4NmUyNS4uYjE5NWM2YyAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvbmFtZXNwYWNlX3Rlc3QvTmFtZXNwYWNlQy9UYWJsZUluQy5rdAorKysgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9uYW1lc3BhY2VfdGVzdC9OYW1lc3BhY2VDL1RhYmxlSW5DLmt0CkBAIC0zNiw3ICszNiw3IEBACiAgICAgICAgIH0KICAgICB9CiAgICAgY29tcGFuaW9uIG9iamVjdCB7Ci0gICAgICAgIGZ1biB2YWxpZGF0ZVZlcnNpb24oKSA9IENvbnN0YW50cy5GTEFUQlVGRkVSU18yXzBfMCgpCisgICAgICAgIGZ1biB2YWxpZGF0ZVZlcnNpb24oKSA9IENvbnN0YW50cy5GTEFUQlVGRkVSU18yXzBfOCgpCiAgICAgICAgIGZ1biBnZXRSb290QXNUYWJsZUluQyhfYmI6IEJ5dGVCdWZmZXIpOiBUYWJsZUluQyA9IGdldFJvb3RBc1RhYmxlSW5DKF9iYiwgVGFibGVJbkMoKSkKICAgICAgICAgZnVuIGdldFJvb3RBc1RhYmxlSW5DKF9iYjogQnl0ZUJ1ZmZlciwgb2JqOiBUYWJsZUluQyk6IFRhYmxlSW5DIHsKICAgICAgICAgICAgIF9iYi5vcmRlcihCeXRlT3JkZXIuTElUVExFX0VORElBTikKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL25hbWVzcGFjZV90ZXN0L21vZC5ycyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL25hbWVzcGFjZV90ZXN0L21vZC5ycwppbmRleCA4NTcyYzhkLi4yMmM2NjdlIDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9uYW1lc3BhY2VfdGVzdC9tb2QucnMKKysrIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvbmFtZXNwYWNlX3Rlc3QvbW9kLnJzCkBAIC0xLDQgKzEsNSBAQAogLy8gQXV0b21hdGljYWxseSBnZW5lcmF0ZWQgYnkgdGhlIEZsYXRidWZmZXJzIGNvbXBpbGVyLiBEbyBub3QgbW9kaWZ5LgorLy8gQGdlbmVyYXRlZAogcHViIG1vZCBuYW1lc3BhY2VfYSB7CiAgIHVzZSBzdXBlcjo6KjsKICAgcHViIG1vZCBuYW1lc3BhY2VfYiB7CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9uYW1lc3BhY2VfdGVzdC9uYW1lc3BhY2VfYS9uYW1lc3BhY2VfYi9lbnVtX2luX25lc3RlZF9uc19nZW5lcmF0ZWQucnMgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9uYW1lc3BhY2VfdGVzdC9uYW1lc3BhY2VfYS9uYW1lc3BhY2VfYi9lbnVtX2luX25lc3RlZF9uc19nZW5lcmF0ZWQucnMKaW5kZXggYjYzNjYzOC4uMjQ2ZDI4ZiAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvbmFtZXNwYWNlX3Rlc3QvbmFtZXNwYWNlX2EvbmFtZXNwYWNlX2IvZW51bV9pbl9uZXN0ZWRfbnNfZ2VuZXJhdGVkLnJzCisrKyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL25hbWVzcGFjZV90ZXN0L25hbWVzcGFjZV9hL25hbWVzcGFjZV9iL2VudW1faW5fbmVzdGVkX25zX2dlbmVyYXRlZC5ycwpAQCAtMSw3ICsxLDEyIEBACiAvLyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBieSB0aGUgRmxhdEJ1ZmZlcnMgY29tcGlsZXIsIGRvIG5vdCBtb2RpZnkKKy8vIEBnZW5lcmF0ZWQKK2V4dGVybiBjcmF0ZSBhbGxvYzsKIGV4dGVybiBjcmF0ZSBmbGF0YnVmZmVyczsKLXVzZSBzdGQ6Om1lbTsKLXVzZSBzdGQ6OmNtcDo6T3JkZXJpbmc7Cit1c2UgYWxsb2M6OmJveGVkOjpCb3g7Cit1c2UgYWxsb2M6OnN0cmluZzo6e1N0cmluZywgVG9TdHJpbmd9OwordXNlIGFsbG9jOjp2ZWM6OlZlYzsKK3VzZSBjb3JlOjptZW07Cit1c2UgY29yZTo6Y21wOjpPcmRlcmluZzsKIHVzZSBzZWxmOjpmbGF0YnVmZmVyczo6e0VuZGlhblNjYWxhciwgRm9sbG93fTsKIHVzZSBzdXBlcjo6KjsKICNbZGVwcmVjYXRlZChzaW5jZSA9ICIyLjAuMCIsIG5vdGUgPSAiVXNlIGFzc29jaWF0ZWQgY29uc3RhbnRzIGluc3RlYWQuIFRoaXMgd2lsbCBubyBsb25nZXIgYmUgZ2VuZXJhdGVkIGluIDIwMjEuIildCkBAIC00Miw4ICs0Nyw4IEBACiAgICAgfQogICB9CiB9Ci1pbXBsIHN0ZDo6Zm10OjpEZWJ1ZyBmb3IgRW51bUluTmVzdGVkTlMgewotICBmbiBmbXQoJnNlbGYsIGY6ICZtdXQgc3RkOjpmbXQ6OkZvcm1hdHRlcikgLT4gc3RkOjpmbXQ6OlJlc3VsdCB7CitpbXBsIGNvcmU6OmZtdDo6RGVidWcgZm9yIEVudW1Jbk5lc3RlZE5TIHsKKyAgZm4gZm10KCZzZWxmLCBmOiAmbXV0IGNvcmU6OmZtdDo6Rm9ybWF0dGVyKSAtPiBjb3JlOjpmbXQ6OlJlc3VsdCB7CiAgICAgaWYgbGV0IFNvbWUobmFtZSkgPSBzZWxmLnZhcmlhbnRfbmFtZSgpIHsKICAgICAgIGYud3JpdGVfc3RyKG5hbWUpCiAgICAgfSBlbHNlIHsKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL25hbWVzcGFjZV90ZXN0L25hbWVzcGFjZV9hL25hbWVzcGFjZV9iL3N0cnVjdF9pbl9uZXN0ZWRfbnNfZ2VuZXJhdGVkLnJzIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvbmFtZXNwYWNlX3Rlc3QvbmFtZXNwYWNlX2EvbmFtZXNwYWNlX2Ivc3RydWN0X2luX25lc3RlZF9uc19nZW5lcmF0ZWQucnMKaW5kZXggNTVmZmY0MC4uZGMxM2IwYyAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvbmFtZXNwYWNlX3Rlc3QvbmFtZXNwYWNlX2EvbmFtZXNwYWNlX2Ivc3RydWN0X2luX25lc3RlZF9uc19nZW5lcmF0ZWQucnMKKysrIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvbmFtZXNwYWNlX3Rlc3QvbmFtZXNwYWNlX2EvbmFtZXNwYWNlX2Ivc3RydWN0X2luX25lc3RlZF9uc19nZW5lcmF0ZWQucnMKQEAgLTEsNyArMSwxMiBAQAogLy8gYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgYnkgdGhlIEZsYXRCdWZmZXJzIGNvbXBpbGVyLCBkbyBub3QgbW9kaWZ5CisvLyBAZ2VuZXJhdGVkCitleHRlcm4gY3JhdGUgYWxsb2M7CiBleHRlcm4gY3JhdGUgZmxhdGJ1ZmZlcnM7Ci11c2Ugc3RkOjptZW07Ci11c2Ugc3RkOjpjbXA6Ok9yZGVyaW5nOwordXNlIGFsbG9jOjpib3hlZDo6Qm94OwordXNlIGFsbG9jOjpzdHJpbmc6OntTdHJpbmcsIFRvU3RyaW5nfTsKK3VzZSBhbGxvYzo6dmVjOjpWZWM7Cit1c2UgY29yZTo6bWVtOwordXNlIGNvcmU6OmNtcDo6T3JkZXJpbmc7CiB1c2Ugc2VsZjo6ZmxhdGJ1ZmZlcnM6OntFbmRpYW5TY2FsYXIsIEZvbGxvd307CiB1c2Ugc3VwZXI6Oio7CiAvLyBzdHJ1Y3QgU3RydWN0SW5OZXN0ZWROUywgYWxpZ25lZCB0byA0CkBAIC0xMyw4ICsxOCw4IEBACiAgICAgU2VsZihbMDsgOF0pCiAgIH0KIH0KLWltcGwgc3RkOjpmbXQ6OkRlYnVnIGZvciBTdHJ1Y3RJbk5lc3RlZE5TIHsKLSAgZm4gZm10KCZzZWxmLCBmOiAmbXV0IHN0ZDo6Zm10OjpGb3JtYXR0ZXIpIC0+IHN0ZDo6Zm10OjpSZXN1bHQgeworaW1wbCBjb3JlOjpmbXQ6OkRlYnVnIGZvciBTdHJ1Y3RJbk5lc3RlZE5TIHsKKyAgZm4gZm10KCZzZWxmLCBmOiAmbXV0IGNvcmU6OmZtdDo6Rm9ybWF0dGVyKSAtPiBjb3JlOjpmbXQ6OlJlc3VsdCB7CiAgICAgZi5kZWJ1Z19zdHJ1Y3QoIlN0cnVjdEluTmVzdGVkTlMiKQogICAgICAgLmZpZWxkKCJhIiwgJnNlbGYuYSgpKQogICAgICAgLmZpZWxkKCJiIiwgJnNlbGYuYigpKQpAQCAtNDMsNyArNDgsNyBAQAogICAgICNbaW5saW5lXQogICAgIGZuIHB1c2goJnNlbGYsIGRzdDogJm11dCBbdThdLCBfcmVzdDogJlt1OF0pIHsKICAgICAgICAgbGV0IHNyYyA9IHVuc2FmZSB7Ci0gICAgICAgICAgICA6OnN0ZDo6c2xpY2U6OmZyb21fcmF3X3BhcnRzKHNlbGYgYXMgKmNvbnN0IFN0cnVjdEluTmVzdGVkTlMgYXMgKmNvbnN0IHU4LCBTZWxmOjpzaXplKCkpCisgICAgICAgICAgICA6OmNvcmU6OnNsaWNlOjpmcm9tX3Jhd19wYXJ0cyhzZWxmIGFzICpjb25zdCBTdHJ1Y3RJbk5lc3RlZE5TIGFzICpjb25zdCB1OCwgU2VsZjo6c2l6ZSgpKQogICAgICAgICB9OwogICAgICAgICBkc3QuY29weV9mcm9tX3NsaWNlKHNyYyk7CiAgICAgfQpAQCAtNTQsNyArNTksNyBAQAogICAgICNbaW5saW5lXQogICAgIGZuIHB1c2goJnNlbGYsIGRzdDogJm11dCBbdThdLCBfcmVzdDogJlt1OF0pIHsKICAgICAgICAgbGV0IHNyYyA9IHVuc2FmZSB7Ci0gICAgICAgICAgICA6OnN0ZDo6c2xpY2U6OmZyb21fcmF3X3BhcnRzKCpzZWxmIGFzICpjb25zdCBTdHJ1Y3RJbk5lc3RlZE5TIGFzICpjb25zdCB1OCwgU2VsZjo6c2l6ZSgpKQorICAgICAgICAgICAgOjpjb3JlOjpzbGljZTo6ZnJvbV9yYXdfcGFydHMoKnNlbGYgYXMgKmNvbnN0IFN0cnVjdEluTmVzdGVkTlMgYXMgKmNvbnN0IHU4LCBTZWxmOjpzaXplKCkpCiAgICAgICAgIH07CiAgICAgICAgIGRzdC5jb3B5X2Zyb21fc2xpY2Uoc3JjKTsKICAgICB9CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9uYW1lc3BhY2VfdGVzdC9uYW1lc3BhY2VfYS9uYW1lc3BhY2VfYi90YWJsZV9pbl9uZXN0ZWRfbnNfZ2VuZXJhdGVkLnJzIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvbmFtZXNwYWNlX3Rlc3QvbmFtZXNwYWNlX2EvbmFtZXNwYWNlX2IvdGFibGVfaW5fbmVzdGVkX25zX2dlbmVyYXRlZC5ycwppbmRleCAxMGQ1YjdjLi43Njc0NGY5IDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9uYW1lc3BhY2VfdGVzdC9uYW1lc3BhY2VfYS9uYW1lc3BhY2VfYi90YWJsZV9pbl9uZXN0ZWRfbnNfZ2VuZXJhdGVkLnJzCisrKyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL25hbWVzcGFjZV90ZXN0L25hbWVzcGFjZV9hL25hbWVzcGFjZV9iL3RhYmxlX2luX25lc3RlZF9uc19nZW5lcmF0ZWQucnMKQEAgLTEsNyArMSwxMiBAQAogLy8gYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgYnkgdGhlIEZsYXRCdWZmZXJzIGNvbXBpbGVyLCBkbyBub3QgbW9kaWZ5CisvLyBAZ2VuZXJhdGVkCitleHRlcm4gY3JhdGUgYWxsb2M7CiBleHRlcm4gY3JhdGUgZmxhdGJ1ZmZlcnM7Ci11c2Ugc3RkOjptZW07Ci11c2Ugc3RkOjpjbXA6Ok9yZGVyaW5nOwordXNlIGFsbG9jOjpib3hlZDo6Qm94OwordXNlIGFsbG9jOjpzdHJpbmc6OntTdHJpbmcsIFRvU3RyaW5nfTsKK3VzZSBhbGxvYzo6dmVjOjpWZWM7Cit1c2UgY29yZTo6bWVtOwordXNlIGNvcmU6OmNtcDo6T3JkZXJpbmc7CiB1c2Ugc2VsZjo6ZmxhdGJ1ZmZlcnM6OntFbmRpYW5TY2FsYXIsIEZvbGxvd307CiB1c2Ugc3VwZXI6Oio7CiBwdWIgZW51bSBUYWJsZUluTmVzdGVkTlNPZmZzZXQge30KQEAgLTEwMSw4ICsxMDYsOCBAQAogICB9CiB9CiAKLWltcGwgc3RkOjpmbXQ6OkRlYnVnIGZvciBUYWJsZUluTmVzdGVkTlM8J18+IHsKLSAgZm4gZm10KCZzZWxmLCBmOiAmbXV0IHN0ZDo6Zm10OjpGb3JtYXR0ZXI8J18+KSAtPiBzdGQ6OmZtdDo6UmVzdWx0IHsKK2ltcGwgY29yZTo6Zm10OjpEZWJ1ZyBmb3IgVGFibGVJbk5lc3RlZE5TPCdfPiB7CisgIGZuIGZtdCgmc2VsZiwgZjogJm11dCBjb3JlOjpmbXQ6OkZvcm1hdHRlcjwnXz4pIC0+IGNvcmU6OmZtdDo6UmVzdWx0IHsKICAgICBsZXQgbXV0IGRzID0gZi5kZWJ1Z19zdHJ1Y3QoIlRhYmxlSW5OZXN0ZWROUyIpOwogICAgICAgZHMuZmllbGQoImZvbyIsICZzZWxmLmZvbygpKTsKICAgICAgIGRzLmZpbmlzaCgpCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9uYW1lc3BhY2VfdGVzdC9uYW1lc3BhY2VfYS9uYW1lc3BhY2VfYi91bmlvbl9pbl9uZXN0ZWRfbnNfZ2VuZXJhdGVkLnJzIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvbmFtZXNwYWNlX3Rlc3QvbmFtZXNwYWNlX2EvbmFtZXNwYWNlX2IvdW5pb25faW5fbmVzdGVkX25zX2dlbmVyYXRlZC5ycwppbmRleCA4ZDY1MGE1Li5hNzcxMDhmIDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9uYW1lc3BhY2VfdGVzdC9uYW1lc3BhY2VfYS9uYW1lc3BhY2VfYi91bmlvbl9pbl9uZXN0ZWRfbnNfZ2VuZXJhdGVkLnJzCisrKyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL25hbWVzcGFjZV90ZXN0L25hbWVzcGFjZV9hL25hbWVzcGFjZV9iL3VuaW9uX2luX25lc3RlZF9uc19nZW5lcmF0ZWQucnMKQEAgLTEsNyArMSwxMiBAQAogLy8gYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgYnkgdGhlIEZsYXRCdWZmZXJzIGNvbXBpbGVyLCBkbyBub3QgbW9kaWZ5CisvLyBAZ2VuZXJhdGVkCitleHRlcm4gY3JhdGUgYWxsb2M7CiBleHRlcm4gY3JhdGUgZmxhdGJ1ZmZlcnM7Ci11c2Ugc3RkOjptZW07Ci11c2Ugc3RkOjpjbXA6Ok9yZGVyaW5nOwordXNlIGFsbG9jOjpib3hlZDo6Qm94OwordXNlIGFsbG9jOjpzdHJpbmc6OntTdHJpbmcsIFRvU3RyaW5nfTsKK3VzZSBhbGxvYzo6dmVjOjpWZWM7Cit1c2UgY29yZTo6bWVtOwordXNlIGNvcmU6OmNtcDo6T3JkZXJpbmc7CiB1c2Ugc2VsZjo6ZmxhdGJ1ZmZlcnM6OntFbmRpYW5TY2FsYXIsIEZvbGxvd307CiB1c2Ugc3VwZXI6Oio7CiAjW2RlcHJlY2F0ZWQoc2luY2UgPSAiMi4wLjAiLCBub3RlID0gIlVzZSBhc3NvY2lhdGVkIGNvbnN0YW50cyBpbnN0ZWFkLiBUaGlzIHdpbGwgbm8gbG9uZ2VyIGJlIGdlbmVyYXRlZCBpbiAyMDIxLiIpXQpAQCAtMzgsOCArNDMsOCBAQAogICAgIH0KICAgfQogfQotaW1wbCBzdGQ6OmZtdDo6RGVidWcgZm9yIFVuaW9uSW5OZXN0ZWROUyB7Ci0gIGZuIGZtdCgmc2VsZiwgZjogJm11dCBzdGQ6OmZtdDo6Rm9ybWF0dGVyKSAtPiBzdGQ6OmZtdDo6UmVzdWx0IHsKK2ltcGwgY29yZTo6Zm10OjpEZWJ1ZyBmb3IgVW5pb25Jbk5lc3RlZE5TIHsKKyAgZm4gZm10KCZzZWxmLCBmOiAmbXV0IGNvcmU6OmZtdDo6Rm9ybWF0dGVyKSAtPiBjb3JlOjpmbXQ6OlJlc3VsdCB7CiAgICAgaWYgbGV0IFNvbWUobmFtZSkgPSBzZWxmLnZhcmlhbnRfbmFtZSgpIHsKICAgICAgIGYud3JpdGVfc3RyKG5hbWUpCiAgICAgfSBlbHNlIHsKQEAgLTEyMSw3ICsxMjYsNyBAQAogICAvLy8gSWYgdGhlIHVuaW9uIHZhcmlhbnQgbWF0Y2hlcywgcmV0dXJuIHRoZSBvd25lZCBUYWJsZUluTmVzdGVkTlNULCBzZXR0aW5nIHRoZSB1bmlvbiB0byBOT05FLgogICBwdWIgZm4gdGFrZV90YWJsZV9pbl9uZXN0ZWRfbnMoJm11dCBzZWxmKSAtPiBPcHRpb248Qm94PFRhYmxlSW5OZXN0ZWROU1Q+PiB7CiAgICAgaWYgbGV0IFNlbGY6OlRhYmxlSW5OZXN0ZWROUyhfKSA9IHNlbGYgewotICAgICAgbGV0IHYgPSBzdGQ6Om1lbTo6cmVwbGFjZShzZWxmLCBTZWxmOjpOT05FKTsKKyAgICAgIGxldCB2ID0gY29yZTo6bWVtOjpyZXBsYWNlKHNlbGYsIFNlbGY6Ok5PTkUpOwogICAgICAgaWYgbGV0IFNlbGY6OlRhYmxlSW5OZXN0ZWROUyh3KSA9IHYgewogICAgICAgICBTb21lKHcpCiAgICAgICB9IGVsc2UgewpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvbmFtZXNwYWNlX3Rlc3QvbmFtZXNwYWNlX2Evc2Vjb25kX3RhYmxlX2luX2FfZ2VuZXJhdGVkLnJzIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvbmFtZXNwYWNlX3Rlc3QvbmFtZXNwYWNlX2Evc2Vjb25kX3RhYmxlX2luX2FfZ2VuZXJhdGVkLnJzCmluZGV4IGQ2MzQzOGIuLmMzMmZkYzAgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL25hbWVzcGFjZV90ZXN0L25hbWVzcGFjZV9hL3NlY29uZF90YWJsZV9pbl9hX2dlbmVyYXRlZC5ycworKysgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9uYW1lc3BhY2VfdGVzdC9uYW1lc3BhY2VfYS9zZWNvbmRfdGFibGVfaW5fYV9nZW5lcmF0ZWQucnMKQEAgLTEsNyArMSwxMiBAQAogLy8gYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgYnkgdGhlIEZsYXRCdWZmZXJzIGNvbXBpbGVyLCBkbyBub3QgbW9kaWZ5CisvLyBAZ2VuZXJhdGVkCitleHRlcm4gY3JhdGUgYWxsb2M7CiBleHRlcm4gY3JhdGUgZmxhdGJ1ZmZlcnM7Ci11c2Ugc3RkOjptZW07Ci11c2Ugc3RkOjpjbXA6Ok9yZGVyaW5nOwordXNlIGFsbG9jOjpib3hlZDo6Qm94OwordXNlIGFsbG9jOjpzdHJpbmc6OntTdHJpbmcsIFRvU3RyaW5nfTsKK3VzZSBhbGxvYzo6dmVjOjpWZWM7Cit1c2UgY29yZTo6bWVtOwordXNlIGNvcmU6OmNtcDo6T3JkZXJpbmc7CiB1c2Ugc2VsZjo6ZmxhdGJ1ZmZlcnM6OntFbmRpYW5TY2FsYXIsIEZvbGxvd307CiB1c2Ugc3VwZXI6Oio7CiBwdWIgZW51bSBTZWNvbmRUYWJsZUluQU9mZnNldCB7fQpAQCAtMTAzLDggKzEwOCw4IEBACiAgIH0KIH0KIAotaW1wbCBzdGQ6OmZtdDo6RGVidWcgZm9yIFNlY29uZFRhYmxlSW5BPCdfPiB7Ci0gIGZuIGZtdCgmc2VsZiwgZjogJm11dCBzdGQ6OmZtdDo6Rm9ybWF0dGVyPCdfPikgLT4gc3RkOjpmbXQ6OlJlc3VsdCB7CitpbXBsIGNvcmU6OmZtdDo6RGVidWcgZm9yIFNlY29uZFRhYmxlSW5BPCdfPiB7CisgIGZuIGZtdCgmc2VsZiwgZjogJm11dCBjb3JlOjpmbXQ6OkZvcm1hdHRlcjwnXz4pIC0+IGNvcmU6OmZtdDo6UmVzdWx0IHsKICAgICBsZXQgbXV0IGRzID0gZi5kZWJ1Z19zdHJ1Y3QoIlNlY29uZFRhYmxlSW5BIik7CiAgICAgICBkcy5maWVsZCgicmVmZXJfdG9fYyIsICZzZWxmLnJlZmVyX3RvX2MoKSk7CiAgICAgICBkcy5maW5pc2goKQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvbmFtZXNwYWNlX3Rlc3QvbmFtZXNwYWNlX2EvdGFibGVfaW5fZmlyc3RfbnNfZ2VuZXJhdGVkLnJzIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvbmFtZXNwYWNlX3Rlc3QvbmFtZXNwYWNlX2EvdGFibGVfaW5fZmlyc3RfbnNfZ2VuZXJhdGVkLnJzCmluZGV4IDBhMTYwNzQuLmFiNDZkN2UgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL25hbWVzcGFjZV90ZXN0L25hbWVzcGFjZV9hL3RhYmxlX2luX2ZpcnN0X25zX2dlbmVyYXRlZC5ycworKysgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9uYW1lc3BhY2VfdGVzdC9uYW1lc3BhY2VfYS90YWJsZV9pbl9maXJzdF9uc19nZW5lcmF0ZWQucnMKQEAgLTEsNyArMSwxMiBAQAogLy8gYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgYnkgdGhlIEZsYXRCdWZmZXJzIGNvbXBpbGVyLCBkbyBub3QgbW9kaWZ5CisvLyBAZ2VuZXJhdGVkCitleHRlcm4gY3JhdGUgYWxsb2M7CiBleHRlcm4gY3JhdGUgZmxhdGJ1ZmZlcnM7Ci11c2Ugc3RkOjptZW07Ci11c2Ugc3RkOjpjbXA6Ok9yZGVyaW5nOwordXNlIGFsbG9jOjpib3hlZDo6Qm94OwordXNlIGFsbG9jOjpzdHJpbmc6OntTdHJpbmcsIFRvU3RyaW5nfTsKK3VzZSBhbGxvYzo6dmVjOjpWZWM7Cit1c2UgY29yZTo6bWVtOwordXNlIGNvcmU6OmNtcDo6T3JkZXJpbmc7CiB1c2Ugc2VsZjo6ZmxhdGJ1ZmZlcnM6OntFbmRpYW5TY2FsYXIsIEZvbGxvd307CiB1c2Ugc3VwZXI6Oio7CiBwdWIgZW51bSBUYWJsZUluRmlyc3ROU09mZnNldCB7fQpAQCAtMTg1LDggKzE5MCw4IEBACiAgIH0KIH0KIAotaW1wbCBzdGQ6OmZtdDo6RGVidWcgZm9yIFRhYmxlSW5GaXJzdE5TPCdfPiB7Ci0gIGZuIGZtdCgmc2VsZiwgZjogJm11dCBzdGQ6OmZtdDo6Rm9ybWF0dGVyPCdfPikgLT4gc3RkOjpmbXQ6OlJlc3VsdCB7CitpbXBsIGNvcmU6OmZtdDo6RGVidWcgZm9yIFRhYmxlSW5GaXJzdE5TPCdfPiB7CisgIGZuIGZtdCgmc2VsZiwgZjogJm11dCBjb3JlOjpmbXQ6OkZvcm1hdHRlcjwnXz4pIC0+IGNvcmU6OmZtdDo6UmVzdWx0IHsKICAgICBsZXQgbXV0IGRzID0gZi5kZWJ1Z19zdHJ1Y3QoIlRhYmxlSW5GaXJzdE5TIik7CiAgICAgICBkcy5maWVsZCgiZm9vX3RhYmxlIiwgJnNlbGYuZm9vX3RhYmxlKCkpOwogICAgICAgZHMuZmllbGQoImZvb19lbnVtIiwgJnNlbGYuZm9vX2VudW0oKSk7CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9uYW1lc3BhY2VfdGVzdC9uYW1lc3BhY2VfYy90YWJsZV9pbl9jX2dlbmVyYXRlZC5ycyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL25hbWVzcGFjZV90ZXN0L25hbWVzcGFjZV9jL3RhYmxlX2luX2NfZ2VuZXJhdGVkLnJzCmluZGV4IGQ0YWM3ODMuLmE2YmE3YmYgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL25hbWVzcGFjZV90ZXN0L25hbWVzcGFjZV9jL3RhYmxlX2luX2NfZ2VuZXJhdGVkLnJzCisrKyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL25hbWVzcGFjZV90ZXN0L25hbWVzcGFjZV9jL3RhYmxlX2luX2NfZ2VuZXJhdGVkLnJzCkBAIC0xLDcgKzEsMTIgQEAKIC8vIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGJ5IHRoZSBGbGF0QnVmZmVycyBjb21waWxlciwgZG8gbm90IG1vZGlmeQorLy8gQGdlbmVyYXRlZAorZXh0ZXJuIGNyYXRlIGFsbG9jOwogZXh0ZXJuIGNyYXRlIGZsYXRidWZmZXJzOwotdXNlIHN0ZDo6bWVtOwotdXNlIHN0ZDo6Y21wOjpPcmRlcmluZzsKK3VzZSBhbGxvYzo6Ym94ZWQ6OkJveDsKK3VzZSBhbGxvYzo6c3RyaW5nOjp7U3RyaW5nLCBUb1N0cmluZ307Cit1c2UgYWxsb2M6OnZlYzo6VmVjOwordXNlIGNvcmU6Om1lbTsKK3VzZSBjb3JlOjpjbXA6Ok9yZGVyaW5nOwogdXNlIHNlbGY6OmZsYXRidWZmZXJzOjp7RW5kaWFuU2NhbGFyLCBGb2xsb3d9OwogdXNlIHN1cGVyOjoqOwogcHViIGVudW0gVGFibGVJbkNPZmZzZXQge30KQEAgLTEyMCw4ICsxMjUsOCBAQAogICB9CiB9CiAKLWltcGwgc3RkOjpmbXQ6OkRlYnVnIGZvciBUYWJsZUluQzwnXz4gewotICBmbiBmbXQoJnNlbGYsIGY6ICZtdXQgc3RkOjpmbXQ6OkZvcm1hdHRlcjwnXz4pIC0+IHN0ZDo6Zm10OjpSZXN1bHQgeworaW1wbCBjb3JlOjpmbXQ6OkRlYnVnIGZvciBUYWJsZUluQzwnXz4geworICBmbiBmbXQoJnNlbGYsIGY6ICZtdXQgY29yZTo6Zm10OjpGb3JtYXR0ZXI8J18+KSAtPiBjb3JlOjpmbXQ6OlJlc3VsdCB7CiAgICAgbGV0IG11dCBkcyA9IGYuZGVidWdfc3RydWN0KCJUYWJsZUluQyIpOwogICAgICAgZHMuZmllbGQoInJlZmVyX3RvX2ExIiwgJnNlbGYucmVmZXJfdG9fYTEoKSk7CiAgICAgICBkcy5maWVsZCgicmVmZXJfdG9fYTIiLCAmc2VsZi5yZWZlcl90b19hMigpKTsKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL25hbWVzcGFjZV90ZXN0L25hbWVzcGFjZV90ZXN0MV9nZW5lcmF0ZWQuaCBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL25hbWVzcGFjZV90ZXN0L25hbWVzcGFjZV90ZXN0MV9nZW5lcmF0ZWQuaAppbmRleCBiYjgyMjM2Li5jMmFmMjhlIDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9uYW1lc3BhY2VfdGVzdC9uYW1lc3BhY2VfdGVzdDFfZ2VuZXJhdGVkLmgKKysrIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvbmFtZXNwYWNlX3Rlc3QvbmFtZXNwYWNlX3Rlc3QxX2dlbmVyYXRlZC5oCkBAIC02LDYgKzYsMTMgQEAKIAogI2luY2x1ZGUgImZsYXRidWZmZXJzL2ZsYXRidWZmZXJzLmgiCiAKKy8vIEVuc3VyZSB0aGUgaW5jbHVkZWQgZmxhdGJ1ZmZlcnMuaCBpcyB0aGUgc2FtZSB2ZXJzaW9uIGFzIHdoZW4gdGhpcyBmaWxlIHdhcworLy8gZ2VuZXJhdGVkLCBvdGhlcndpc2UgaXQgbWF5IG5vdCBiZSBjb21wYXRpYmxlLgorc3RhdGljX2Fzc2VydChGTEFUQlVGRkVSU19WRVJTSU9OX01BSk9SID09IDIgJiYKKyAgICAgICAgICAgICAgRkxBVEJVRkZFUlNfVkVSU0lPTl9NSU5PUiA9PSAwICYmCisgICAgICAgICAgICAgIEZMQVRCVUZGRVJTX1ZFUlNJT05fUkVWSVNJT04gPT0gOCwKKyAgICAgICAgICAgICAiTm9uLWNvbXBhdGlibGUgZmxhdGJ1ZmZlcnMgdmVyc2lvbiBpbmNsdWRlZCIpOworCiBuYW1lc3BhY2UgTmFtZXNwYWNlQSB7CiBuYW1lc3BhY2UgTmFtZXNwYWNlQiB7CiAKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL25hbWVzcGFjZV90ZXN0L25hbWVzcGFjZV90ZXN0Ml9nZW5lcmF0ZWQuaCBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL25hbWVzcGFjZV90ZXN0L25hbWVzcGFjZV90ZXN0Ml9nZW5lcmF0ZWQuaAppbmRleCBmZjE2NGNjLi44NWRjMTJmIDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9uYW1lc3BhY2VfdGVzdC9uYW1lc3BhY2VfdGVzdDJfZ2VuZXJhdGVkLmgKKysrIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvbmFtZXNwYWNlX3Rlc3QvbmFtZXNwYWNlX3Rlc3QyX2dlbmVyYXRlZC5oCkBAIC02LDYgKzYsMTMgQEAKIAogI2luY2x1ZGUgImZsYXRidWZmZXJzL2ZsYXRidWZmZXJzLmgiCiAKKy8vIEVuc3VyZSB0aGUgaW5jbHVkZWQgZmxhdGJ1ZmZlcnMuaCBpcyB0aGUgc2FtZSB2ZXJzaW9uIGFzIHdoZW4gdGhpcyBmaWxlIHdhcworLy8gZ2VuZXJhdGVkLCBvdGhlcndpc2UgaXQgbWF5IG5vdCBiZSBjb21wYXRpYmxlLgorc3RhdGljX2Fzc2VydChGTEFUQlVGRkVSU19WRVJTSU9OX01BSk9SID09IDIgJiYKKyAgICAgICAgICAgICAgRkxBVEJVRkZFUlNfVkVSU0lPTl9NSU5PUiA9PSAwICYmCisgICAgICAgICAgICAgIEZMQVRCVUZGRVJTX1ZFUlNJT05fUkVWSVNJT04gPT0gOCwKKyAgICAgICAgICAgICAiTm9uLWNvbXBhdGlibGUgZmxhdGJ1ZmZlcnMgdmVyc2lvbiBpbmNsdWRlZCIpOworCiBuYW1lc3BhY2UgTmFtZXNwYWNlQSB7CiAKIHN0cnVjdCBUYWJsZUluRmlyc3ROUzsKQEAgLTM4Niw3ICszOTMsNyBAQAogaW5saW5lIHZvaWQgVGFibGVJbkZpcnN0TlM6OlVuUGFja1RvKFRhYmxlSW5GaXJzdE5TVCAqX28sIGNvbnN0IGZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIpIGNvbnN0IHsKICAgKHZvaWQpX287CiAgICh2b2lkKV9yZXNvbHZlcjsKLSAgeyBhdXRvIF9lID0gZm9vX3RhYmxlKCk7IGlmIChfZSkgeyBpZihfby0+Zm9vX3RhYmxlKSB7IF9lLT5VblBhY2tUbyhfby0+Zm9vX3RhYmxlLmdldCgpLCBfcmVzb2x2ZXIpOyB9IGVsc2UgeyBfby0+Zm9vX3RhYmxlID0gZmxhdGJ1ZmZlcnM6OnVuaXF1ZV9wdHI8TmFtZXNwYWNlQTo6TmFtZXNwYWNlQjo6VGFibGVJbk5lc3RlZE5TVD4oX2UtPlVuUGFjayhfcmVzb2x2ZXIpKTsgfSB9IH0KKyAgeyBhdXRvIF9lID0gZm9vX3RhYmxlKCk7IGlmIChfZSkgeyBpZihfby0+Zm9vX3RhYmxlKSB7IF9lLT5VblBhY2tUbyhfby0+Zm9vX3RhYmxlLmdldCgpLCBfcmVzb2x2ZXIpOyB9IGVsc2UgeyBfby0+Zm9vX3RhYmxlID0gZmxhdGJ1ZmZlcnM6OnVuaXF1ZV9wdHI8TmFtZXNwYWNlQTo6TmFtZXNwYWNlQjo6VGFibGVJbk5lc3RlZE5TVD4oX2UtPlVuUGFjayhfcmVzb2x2ZXIpKTsgfSB9IGVsc2UgaWYgKF9vLT5mb29fdGFibGUpIHsgX28tPmZvb190YWJsZS5yZXNldCgpOyB9IH0KICAgeyBhdXRvIF9lID0gZm9vX2VudW0oKTsgX28tPmZvb19lbnVtID0gX2U7IH0KICAgeyBhdXRvIF9lID0gZm9vX3VuaW9uX3R5cGUoKTsgX28tPmZvb191bmlvbi50eXBlID0gX2U7IH0KICAgeyBhdXRvIF9lID0gZm9vX3VuaW9uKCk7IGlmIChfZSkgX28tPmZvb191bmlvbi52YWx1ZSA9IE5hbWVzcGFjZUE6Ok5hbWVzcGFjZUI6OlVuaW9uSW5OZXN0ZWROU1VuaW9uOjpVblBhY2soX2UsIGZvb191bmlvbl90eXBlKCksIF9yZXNvbHZlcik7IH0KQEAgLTQwNSw3ICs0MTIsNyBAQAogICBhdXRvIF9mb29fZW51bSA9IF9vLT5mb29fZW51bTsKICAgYXV0byBfZm9vX3VuaW9uX3R5cGUgPSBfby0+Zm9vX3VuaW9uLnR5cGU7CiAgIGF1dG8gX2Zvb191bmlvbiA9IF9vLT5mb29fdW5pb24uUGFjayhfZmJiKTsKLSAgYXV0byBfZm9vX3N0cnVjdCA9IF9vLT5mb29fc3RydWN0ID8gX28tPmZvb19zdHJ1Y3QuZ2V0KCkgOiAwOworICBhdXRvIF9mb29fc3RydWN0ID0gX28tPmZvb19zdHJ1Y3QgPyBfby0+Zm9vX3N0cnVjdC5nZXQoKSA6IG51bGxwdHI7CiAgIHJldHVybiBOYW1lc3BhY2VBOjpDcmVhdGVUYWJsZUluRmlyc3ROUygKICAgICAgIF9mYmIsCiAgICAgICBfZm9vX3RhYmxlLApAQCAtNDUxLDggKzQ1OCw4IEBACiBpbmxpbmUgdm9pZCBUYWJsZUluQzo6VW5QYWNrVG8oVGFibGVJbkNUICpfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlcikgY29uc3QgewogICAodm9pZClfbzsKICAgKHZvaWQpX3Jlc29sdmVyOwotICB7IGF1dG8gX2UgPSByZWZlcl90b19hMSgpOyBpZiAoX2UpIHsgaWYoX28tPnJlZmVyX3RvX2ExKSB7IF9lLT5VblBhY2tUbyhfby0+cmVmZXJfdG9fYTEuZ2V0KCksIF9yZXNvbHZlcik7IH0gZWxzZSB7IF9vLT5yZWZlcl90b19hMSA9IGZsYXRidWZmZXJzOjp1bmlxdWVfcHRyPE5hbWVzcGFjZUE6OlRhYmxlSW5GaXJzdE5TVD4oX2UtPlVuUGFjayhfcmVzb2x2ZXIpKTsgfSB9IH0KLSAgeyBhdXRvIF9lID0gcmVmZXJfdG9fYTIoKTsgaWYgKF9lKSB7IGlmKF9vLT5yZWZlcl90b19hMikgeyBfZS0+VW5QYWNrVG8oX28tPnJlZmVyX3RvX2EyLmdldCgpLCBfcmVzb2x2ZXIpOyB9IGVsc2UgeyBfby0+cmVmZXJfdG9fYTIgPSBmbGF0YnVmZmVyczo6dW5pcXVlX3B0cjxOYW1lc3BhY2VBOjpTZWNvbmRUYWJsZUluQVQ+KF9lLT5VblBhY2soX3Jlc29sdmVyKSk7IH0gfSB9CisgIHsgYXV0byBfZSA9IHJlZmVyX3RvX2ExKCk7IGlmIChfZSkgeyBpZihfby0+cmVmZXJfdG9fYTEpIHsgX2UtPlVuUGFja1RvKF9vLT5yZWZlcl90b19hMS5nZXQoKSwgX3Jlc29sdmVyKTsgfSBlbHNlIHsgX28tPnJlZmVyX3RvX2ExID0gZmxhdGJ1ZmZlcnM6OnVuaXF1ZV9wdHI8TmFtZXNwYWNlQTo6VGFibGVJbkZpcnN0TlNUPihfZS0+VW5QYWNrKF9yZXNvbHZlcikpOyB9IH0gZWxzZSBpZiAoX28tPnJlZmVyX3RvX2ExKSB7IF9vLT5yZWZlcl90b19hMS5yZXNldCgpOyB9IH0KKyAgeyBhdXRvIF9lID0gcmVmZXJfdG9fYTIoKTsgaWYgKF9lKSB7IGlmKF9vLT5yZWZlcl90b19hMikgeyBfZS0+VW5QYWNrVG8oX28tPnJlZmVyX3RvX2EyLmdldCgpLCBfcmVzb2x2ZXIpOyB9IGVsc2UgeyBfby0+cmVmZXJfdG9fYTIgPSBmbGF0YnVmZmVyczo6dW5pcXVlX3B0cjxOYW1lc3BhY2VBOjpTZWNvbmRUYWJsZUluQVQ+KF9lLT5VblBhY2soX3Jlc29sdmVyKSk7IH0gfSBlbHNlIGlmIChfby0+cmVmZXJfdG9fYTIpIHsgX28tPnJlZmVyX3RvX2EyLnJlc2V0KCk7IH0gfQogfQogCiBpbmxpbmUgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxUYWJsZUluQz4gVGFibGVJbkM6OlBhY2soZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBUYWJsZUluQ1QqIF9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyKSB7CkBAIC01MDQsNyArNTExLDcgQEAKIGlubGluZSB2b2lkIFNlY29uZFRhYmxlSW5BOjpVblBhY2tUbyhTZWNvbmRUYWJsZUluQVQgKl9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyKSBjb25zdCB7CiAgICh2b2lkKV9vOwogICAodm9pZClfcmVzb2x2ZXI7Ci0gIHsgYXV0byBfZSA9IHJlZmVyX3RvX2MoKTsgaWYgKF9lKSB7IGlmKF9vLT5yZWZlcl90b19jKSB7IF9lLT5VblBhY2tUbyhfby0+cmVmZXJfdG9fYy5nZXQoKSwgX3Jlc29sdmVyKTsgfSBlbHNlIHsgX28tPnJlZmVyX3RvX2MgPSBmbGF0YnVmZmVyczo6dW5pcXVlX3B0cjxOYW1lc3BhY2VDOjpUYWJsZUluQ1Q+KF9lLT5VblBhY2soX3Jlc29sdmVyKSk7IH0gfSB9CisgIHsgYXV0byBfZSA9IHJlZmVyX3RvX2MoKTsgaWYgKF9lKSB7IGlmKF9vLT5yZWZlcl90b19jKSB7IF9lLT5VblBhY2tUbyhfby0+cmVmZXJfdG9fYy5nZXQoKSwgX3Jlc29sdmVyKTsgfSBlbHNlIHsgX28tPnJlZmVyX3RvX2MgPSBmbGF0YnVmZmVyczo6dW5pcXVlX3B0cjxOYW1lc3BhY2VDOjpUYWJsZUluQ1Q+KF9lLT5VblBhY2soX3Jlc29sdmVyKSk7IH0gfSBlbHNlIGlmIChfby0+cmVmZXJfdG9fYykgeyBfby0+cmVmZXJfdG9fYy5yZXNldCgpOyB9IH0KIH0KIAogaW5saW5lIGZsYXRidWZmZXJzOjpPZmZzZXQ8U2Vjb25kVGFibGVJbkE+IFNlY29uZFRhYmxlSW5BOjpQYWNrKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgU2Vjb25kVGFibGVJbkFUKiBfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlcikgewpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvbmF0aXZlX2lubGluZV90YWJsZV90ZXN0LmZicyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL25hdGl2ZV9pbmxpbmVfdGFibGVfdGVzdC5mYnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2JlODk0MAotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL25hdGl2ZV9pbmxpbmVfdGFibGVfdGVzdC5mYnMKQEAgLTAsMCArMSw3IEBACit0YWJsZSBOYXRpdmVJbmxpbmVUYWJsZSB7CisgIGE6IGludDsKK30KKwordGFibGUgVGVzdE5hdGl2ZUlubGluZVRhYmxlIHsKKyAgdDogW05hdGl2ZUlubGluZVRhYmxlXSAobmF0aXZlX2lubGluZSk7Cit9CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9uYXRpdmVfaW5saW5lX3RhYmxlX3Rlc3RfZ2VuZXJhdGVkLmggYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9uYXRpdmVfaW5saW5lX3RhYmxlX3Rlc3RfZ2VuZXJhdGVkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTUwMjY2MwotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL25hdGl2ZV9pbmxpbmVfdGFibGVfdGVzdF9nZW5lcmF0ZWQuaApAQCAtMCwwICsxLDI2MyBAQAorLy8gYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgYnkgdGhlIEZsYXRCdWZmZXJzIGNvbXBpbGVyLCBkbyBub3QgbW9kaWZ5CisKKworI2lmbmRlZiBGTEFUQlVGRkVSU19HRU5FUkFURURfTkFUSVZFSU5MSU5FVEFCTEVURVNUX0hfCisjZGVmaW5lIEZMQVRCVUZGRVJTX0dFTkVSQVRFRF9OQVRJVkVJTkxJTkVUQUJMRVRFU1RfSF8KKworI2luY2x1ZGUgImZsYXRidWZmZXJzL2ZsYXRidWZmZXJzLmgiCisKKy8vIEVuc3VyZSB0aGUgaW5jbHVkZWQgZmxhdGJ1ZmZlcnMuaCBpcyB0aGUgc2FtZSB2ZXJzaW9uIGFzIHdoZW4gdGhpcyBmaWxlIHdhcworLy8gZ2VuZXJhdGVkLCBvdGhlcndpc2UgaXQgbWF5IG5vdCBiZSBjb21wYXRpYmxlLgorc3RhdGljX2Fzc2VydChGTEFUQlVGRkVSU19WRVJTSU9OX01BSk9SID09IDIgJiYKKyAgICAgICAgICAgICAgRkxBVEJVRkZFUlNfVkVSU0lPTl9NSU5PUiA9PSAwICYmCisgICAgICAgICAgICAgIEZMQVRCVUZGRVJTX1ZFUlNJT05fUkVWSVNJT04gPT0gOCwKKyAgICAgICAgICAgICAiTm9uLWNvbXBhdGlibGUgZmxhdGJ1ZmZlcnMgdmVyc2lvbiBpbmNsdWRlZCIpOworCitzdHJ1Y3QgTmF0aXZlSW5saW5lVGFibGU7CitzdHJ1Y3QgTmF0aXZlSW5saW5lVGFibGVCdWlsZGVyOworc3RydWN0IE5hdGl2ZUlubGluZVRhYmxlVDsKKworc3RydWN0IFRlc3ROYXRpdmVJbmxpbmVUYWJsZTsKK3N0cnVjdCBUZXN0TmF0aXZlSW5saW5lVGFibGVCdWlsZGVyOworc3RydWN0IFRlc3ROYXRpdmVJbmxpbmVUYWJsZVQ7CisKK2Jvb2wgb3BlcmF0b3I9PShjb25zdCBOYXRpdmVJbmxpbmVUYWJsZVQgJmxocywgY29uc3QgTmF0aXZlSW5saW5lVGFibGVUICZyaHMpOworYm9vbCBvcGVyYXRvciE9KGNvbnN0IE5hdGl2ZUlubGluZVRhYmxlVCAmbGhzLCBjb25zdCBOYXRpdmVJbmxpbmVUYWJsZVQgJnJocyk7Citib29sIG9wZXJhdG9yPT0oY29uc3QgVGVzdE5hdGl2ZUlubGluZVRhYmxlVCAmbGhzLCBjb25zdCBUZXN0TmF0aXZlSW5saW5lVGFibGVUICZyaHMpOworYm9vbCBvcGVyYXRvciE9KGNvbnN0IFRlc3ROYXRpdmVJbmxpbmVUYWJsZVQgJmxocywgY29uc3QgVGVzdE5hdGl2ZUlubGluZVRhYmxlVCAmcmhzKTsKKworaW5saW5lIGNvbnN0IGZsYXRidWZmZXJzOjpUeXBlVGFibGUgKk5hdGl2ZUlubGluZVRhYmxlVHlwZVRhYmxlKCk7CisKK2lubGluZSBjb25zdCBmbGF0YnVmZmVyczo6VHlwZVRhYmxlICpUZXN0TmF0aXZlSW5saW5lVGFibGVUeXBlVGFibGUoKTsKKworc3RydWN0IE5hdGl2ZUlubGluZVRhYmxlVCA6IHB1YmxpYyBmbGF0YnVmZmVyczo6TmF0aXZlVGFibGUgeworICB0eXBlZGVmIE5hdGl2ZUlubGluZVRhYmxlIFRhYmxlVHlwZTsKKyAgaW50MzJfdCBhID0gMDsKK307CisKK3N0cnVjdCBOYXRpdmVJbmxpbmVUYWJsZSBGTEFUQlVGRkVSU19GSU5BTF9DTEFTUyA6IHByaXZhdGUgZmxhdGJ1ZmZlcnM6OlRhYmxlIHsKKyAgdHlwZWRlZiBOYXRpdmVJbmxpbmVUYWJsZVQgTmF0aXZlVGFibGVUeXBlOworICB0eXBlZGVmIE5hdGl2ZUlubGluZVRhYmxlQnVpbGRlciBCdWlsZGVyOworICBzdGF0aWMgY29uc3QgZmxhdGJ1ZmZlcnM6OlR5cGVUYWJsZSAqTWluaVJlZmxlY3RUeXBlVGFibGUoKSB7CisgICAgcmV0dXJuIE5hdGl2ZUlubGluZVRhYmxlVHlwZVRhYmxlKCk7CisgIH0KKyAgZW51bSBGbGF0QnVmZmVyc1ZUYWJsZU9mZnNldCBGTEFUQlVGRkVSU19WVEFCTEVfVU5ERVJMWUlOR19UWVBFIHsKKyAgICBWVF9BID0gNAorICB9OworICBpbnQzMl90IGEoKSBjb25zdCB7CisgICAgcmV0dXJuIEdldEZpZWxkPGludDMyX3Q+KFZUX0EsIDApOworICB9CisgIGJvb2wgbXV0YXRlX2EoaW50MzJfdCBfYSA9IDApIHsKKyAgICByZXR1cm4gU2V0RmllbGQ8aW50MzJfdD4oVlRfQSwgX2EsIDApOworICB9CisgIGJvb2wgVmVyaWZ5KGZsYXRidWZmZXJzOjpWZXJpZmllciAmdmVyaWZpZXIpIGNvbnN0IHsKKyAgICByZXR1cm4gVmVyaWZ5VGFibGVTdGFydCh2ZXJpZmllcikgJiYKKyAgICAgICAgICAgVmVyaWZ5RmllbGQ8aW50MzJfdD4odmVyaWZpZXIsIFZUX0EsIDQpICYmCisgICAgICAgICAgIHZlcmlmaWVyLkVuZFRhYmxlKCk7CisgIH0KKyAgTmF0aXZlSW5saW5lVGFibGVUICpVblBhY2soY29uc3QgZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlciA9IG51bGxwdHIpIGNvbnN0OworICB2b2lkIFVuUGFja1RvKE5hdGl2ZUlubGluZVRhYmxlVCAqX28sIGNvbnN0IGZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIgPSBudWxscHRyKSBjb25zdDsKKyAgc3RhdGljIGZsYXRidWZmZXJzOjpPZmZzZXQ8TmF0aXZlSW5saW5lVGFibGU+IFBhY2soZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBOYXRpdmVJbmxpbmVUYWJsZVQqIF9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyID0gbnVsbHB0cik7Cit9OworCitzdHJ1Y3QgTmF0aXZlSW5saW5lVGFibGVCdWlsZGVyIHsKKyAgdHlwZWRlZiBOYXRpdmVJbmxpbmVUYWJsZSBUYWJsZTsKKyAgZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZmYmJfOworICBmbGF0YnVmZmVyczo6dW9mZnNldF90IHN0YXJ0XzsKKyAgdm9pZCBhZGRfYShpbnQzMl90IGEpIHsKKyAgICBmYmJfLkFkZEVsZW1lbnQ8aW50MzJfdD4oTmF0aXZlSW5saW5lVGFibGU6OlZUX0EsIGEsIDApOworICB9CisgIGV4cGxpY2l0IE5hdGl2ZUlubGluZVRhYmxlQnVpbGRlcihmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIpCisgICAgICAgIDogZmJiXyhfZmJiKSB7CisgICAgc3RhcnRfID0gZmJiXy5TdGFydFRhYmxlKCk7CisgIH0KKyAgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxOYXRpdmVJbmxpbmVUYWJsZT4gRmluaXNoKCkgeworICAgIGNvbnN0IGF1dG8gZW5kID0gZmJiXy5FbmRUYWJsZShzdGFydF8pOworICAgIGF1dG8gbyA9IGZsYXRidWZmZXJzOjpPZmZzZXQ8TmF0aXZlSW5saW5lVGFibGU+KGVuZCk7CisgICAgcmV0dXJuIG87CisgIH0KK307CisKK2lubGluZSBmbGF0YnVmZmVyczo6T2Zmc2V0PE5hdGl2ZUlubGluZVRhYmxlPiBDcmVhdGVOYXRpdmVJbmxpbmVUYWJsZSgKKyAgICBmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsCisgICAgaW50MzJfdCBhID0gMCkgeworICBOYXRpdmVJbmxpbmVUYWJsZUJ1aWxkZXIgYnVpbGRlcl8oX2ZiYik7CisgIGJ1aWxkZXJfLmFkZF9hKGEpOworICByZXR1cm4gYnVpbGRlcl8uRmluaXNoKCk7Cit9CisKK2ZsYXRidWZmZXJzOjpPZmZzZXQ8TmF0aXZlSW5saW5lVGFibGU+IENyZWF0ZU5hdGl2ZUlubGluZVRhYmxlKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgTmF0aXZlSW5saW5lVGFibGVUICpfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlciA9IG51bGxwdHIpOworCitzdHJ1Y3QgVGVzdE5hdGl2ZUlubGluZVRhYmxlVCA6IHB1YmxpYyBmbGF0YnVmZmVyczo6TmF0aXZlVGFibGUgeworICB0eXBlZGVmIFRlc3ROYXRpdmVJbmxpbmVUYWJsZSBUYWJsZVR5cGU7CisgIHN0ZDo6dmVjdG9yPE5hdGl2ZUlubGluZVRhYmxlVD4gdHt9OworfTsKKworc3RydWN0IFRlc3ROYXRpdmVJbmxpbmVUYWJsZSBGTEFUQlVGRkVSU19GSU5BTF9DTEFTUyA6IHByaXZhdGUgZmxhdGJ1ZmZlcnM6OlRhYmxlIHsKKyAgdHlwZWRlZiBUZXN0TmF0aXZlSW5saW5lVGFibGVUIE5hdGl2ZVRhYmxlVHlwZTsKKyAgdHlwZWRlZiBUZXN0TmF0aXZlSW5saW5lVGFibGVCdWlsZGVyIEJ1aWxkZXI7CisgIHN0YXRpYyBjb25zdCBmbGF0YnVmZmVyczo6VHlwZVRhYmxlICpNaW5pUmVmbGVjdFR5cGVUYWJsZSgpIHsKKyAgICByZXR1cm4gVGVzdE5hdGl2ZUlubGluZVRhYmxlVHlwZVRhYmxlKCk7CisgIH0KKyAgZW51bSBGbGF0QnVmZmVyc1ZUYWJsZU9mZnNldCBGTEFUQlVGRkVSU19WVEFCTEVfVU5ERVJMWUlOR19UWVBFIHsKKyAgICBWVF9UID0gNAorICB9OworICBjb25zdCBmbGF0YnVmZmVyczo6VmVjdG9yPGZsYXRidWZmZXJzOjpPZmZzZXQ8TmF0aXZlSW5saW5lVGFibGU+PiAqdCgpIGNvbnN0IHsKKyAgICByZXR1cm4gR2V0UG9pbnRlcjxjb25zdCBmbGF0YnVmZmVyczo6VmVjdG9yPGZsYXRidWZmZXJzOjpPZmZzZXQ8TmF0aXZlSW5saW5lVGFibGU+PiAqPihWVF9UKTsKKyAgfQorICBmbGF0YnVmZmVyczo6VmVjdG9yPGZsYXRidWZmZXJzOjpPZmZzZXQ8TmF0aXZlSW5saW5lVGFibGU+PiAqbXV0YWJsZV90KCkgeworICAgIHJldHVybiBHZXRQb2ludGVyPGZsYXRidWZmZXJzOjpWZWN0b3I8ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxOYXRpdmVJbmxpbmVUYWJsZT4+ICo+KFZUX1QpOworICB9CisgIGJvb2wgVmVyaWZ5KGZsYXRidWZmZXJzOjpWZXJpZmllciAmdmVyaWZpZXIpIGNvbnN0IHsKKyAgICByZXR1cm4gVmVyaWZ5VGFibGVTdGFydCh2ZXJpZmllcikgJiYKKyAgICAgICAgICAgVmVyaWZ5T2Zmc2V0KHZlcmlmaWVyLCBWVF9UKSAmJgorICAgICAgICAgICB2ZXJpZmllci5WZXJpZnlWZWN0b3IodCgpKSAmJgorICAgICAgICAgICB2ZXJpZmllci5WZXJpZnlWZWN0b3JPZlRhYmxlcyh0KCkpICYmCisgICAgICAgICAgIHZlcmlmaWVyLkVuZFRhYmxlKCk7CisgIH0KKyAgVGVzdE5hdGl2ZUlubGluZVRhYmxlVCAqVW5QYWNrKGNvbnN0IGZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIgPSBudWxscHRyKSBjb25zdDsKKyAgdm9pZCBVblBhY2tUbyhUZXN0TmF0aXZlSW5saW5lVGFibGVUICpfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlciA9IG51bGxwdHIpIGNvbnN0OworICBzdGF0aWMgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxUZXN0TmF0aXZlSW5saW5lVGFibGU+IFBhY2soZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBUZXN0TmF0aXZlSW5saW5lVGFibGVUKiBfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlciA9IG51bGxwdHIpOworfTsKKworc3RydWN0IFRlc3ROYXRpdmVJbmxpbmVUYWJsZUJ1aWxkZXIgeworICB0eXBlZGVmIFRlc3ROYXRpdmVJbmxpbmVUYWJsZSBUYWJsZTsKKyAgZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZmYmJfOworICBmbGF0YnVmZmVyczo6dW9mZnNldF90IHN0YXJ0XzsKKyAgdm9pZCBhZGRfdChmbGF0YnVmZmVyczo6T2Zmc2V0PGZsYXRidWZmZXJzOjpWZWN0b3I8ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxOYXRpdmVJbmxpbmVUYWJsZT4+PiB0KSB7CisgICAgZmJiXy5BZGRPZmZzZXQoVGVzdE5hdGl2ZUlubGluZVRhYmxlOjpWVF9ULCB0KTsKKyAgfQorICBleHBsaWNpdCBUZXN0TmF0aXZlSW5saW5lVGFibGVCdWlsZGVyKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYikKKyAgICAgICAgOiBmYmJfKF9mYmIpIHsKKyAgICBzdGFydF8gPSBmYmJfLlN0YXJ0VGFibGUoKTsKKyAgfQorICBmbGF0YnVmZmVyczo6T2Zmc2V0PFRlc3ROYXRpdmVJbmxpbmVUYWJsZT4gRmluaXNoKCkgeworICAgIGNvbnN0IGF1dG8gZW5kID0gZmJiXy5FbmRUYWJsZShzdGFydF8pOworICAgIGF1dG8gbyA9IGZsYXRidWZmZXJzOjpPZmZzZXQ8VGVzdE5hdGl2ZUlubGluZVRhYmxlPihlbmQpOworICAgIHJldHVybiBvOworICB9Cit9OworCitpbmxpbmUgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxUZXN0TmF0aXZlSW5saW5lVGFibGU+IENyZWF0ZVRlc3ROYXRpdmVJbmxpbmVUYWJsZSgKKyAgICBmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsCisgICAgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxmbGF0YnVmZmVyczo6VmVjdG9yPGZsYXRidWZmZXJzOjpPZmZzZXQ8TmF0aXZlSW5saW5lVGFibGU+Pj4gdCA9IDApIHsKKyAgVGVzdE5hdGl2ZUlubGluZVRhYmxlQnVpbGRlciBidWlsZGVyXyhfZmJiKTsKKyAgYnVpbGRlcl8uYWRkX3QodCk7CisgIHJldHVybiBidWlsZGVyXy5GaW5pc2goKTsKK30KKworaW5saW5lIGZsYXRidWZmZXJzOjpPZmZzZXQ8VGVzdE5hdGl2ZUlubGluZVRhYmxlPiBDcmVhdGVUZXN0TmF0aXZlSW5saW5lVGFibGVEaXJlY3QoCisgICAgZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLAorICAgIGNvbnN0IHN0ZDo6dmVjdG9yPGZsYXRidWZmZXJzOjpPZmZzZXQ8TmF0aXZlSW5saW5lVGFibGU+PiAqdCA9IG51bGxwdHIpIHsKKyAgYXV0byB0X18gPSB0ID8gX2ZiYi5DcmVhdGVWZWN0b3I8ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxOYXRpdmVJbmxpbmVUYWJsZT4+KCp0KSA6IDA7CisgIHJldHVybiBDcmVhdGVUZXN0TmF0aXZlSW5saW5lVGFibGUoCisgICAgICBfZmJiLAorICAgICAgdF9fKTsKK30KKworZmxhdGJ1ZmZlcnM6Ok9mZnNldDxUZXN0TmF0aXZlSW5saW5lVGFibGU+IENyZWF0ZVRlc3ROYXRpdmVJbmxpbmVUYWJsZShmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IFRlc3ROYXRpdmVJbmxpbmVUYWJsZVQgKl9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyID0gbnVsbHB0cik7CisKKworaW5saW5lIGJvb2wgb3BlcmF0b3I9PShjb25zdCBOYXRpdmVJbmxpbmVUYWJsZVQgJmxocywgY29uc3QgTmF0aXZlSW5saW5lVGFibGVUICZyaHMpIHsKKyAgcmV0dXJuCisgICAgICAobGhzLmEgPT0gcmhzLmEpOworfQorCitpbmxpbmUgYm9vbCBvcGVyYXRvciE9KGNvbnN0IE5hdGl2ZUlubGluZVRhYmxlVCAmbGhzLCBjb25zdCBOYXRpdmVJbmxpbmVUYWJsZVQgJnJocykgeworICAgIHJldHVybiAhKGxocyA9PSByaHMpOworfQorCisKK2lubGluZSBOYXRpdmVJbmxpbmVUYWJsZVQgKk5hdGl2ZUlubGluZVRhYmxlOjpVblBhY2soY29uc3QgZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlcikgY29uc3QgeworICBhdXRvIF9vID0gc3RkOjp1bmlxdWVfcHRyPE5hdGl2ZUlubGluZVRhYmxlVD4obmV3IE5hdGl2ZUlubGluZVRhYmxlVCgpKTsKKyAgVW5QYWNrVG8oX28uZ2V0KCksIF9yZXNvbHZlcik7CisgIHJldHVybiBfby5yZWxlYXNlKCk7Cit9CisKK2lubGluZSB2b2lkIE5hdGl2ZUlubGluZVRhYmxlOjpVblBhY2tUbyhOYXRpdmVJbmxpbmVUYWJsZVQgKl9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyKSBjb25zdCB7CisgICh2b2lkKV9vOworICAodm9pZClfcmVzb2x2ZXI7CisgIHsgYXV0byBfZSA9IGEoKTsgX28tPmEgPSBfZTsgfQorfQorCitpbmxpbmUgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxOYXRpdmVJbmxpbmVUYWJsZT4gTmF0aXZlSW5saW5lVGFibGU6OlBhY2soZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBOYXRpdmVJbmxpbmVUYWJsZVQqIF9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyKSB7CisgIHJldHVybiBDcmVhdGVOYXRpdmVJbmxpbmVUYWJsZShfZmJiLCBfbywgX3JlaGFzaGVyKTsKK30KKworaW5saW5lIGZsYXRidWZmZXJzOjpPZmZzZXQ8TmF0aXZlSW5saW5lVGFibGU+IENyZWF0ZU5hdGl2ZUlubGluZVRhYmxlKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgTmF0aXZlSW5saW5lVGFibGVUICpfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlcikgeworICAodm9pZClfcmVoYXNoZXI7CisgICh2b2lkKV9vOworICBzdHJ1Y3QgX1ZlY3RvckFyZ3MgeyBmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgKl9fZmJiOyBjb25zdCBOYXRpdmVJbmxpbmVUYWJsZVQqIF9fbzsgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9fcmVoYXNoZXI7IH0gX3ZhID0geyAmX2ZiYiwgX28sIF9yZWhhc2hlcn07ICh2b2lkKV92YTsKKyAgYXV0byBfYSA9IF9vLT5hOworICByZXR1cm4gQ3JlYXRlTmF0aXZlSW5saW5lVGFibGUoCisgICAgICBfZmJiLAorICAgICAgX2EpOworfQorCisKK2lubGluZSBib29sIG9wZXJhdG9yPT0oY29uc3QgVGVzdE5hdGl2ZUlubGluZVRhYmxlVCAmbGhzLCBjb25zdCBUZXN0TmF0aXZlSW5saW5lVGFibGVUICZyaHMpIHsKKyAgcmV0dXJuCisgICAgICAobGhzLnQgPT0gcmhzLnQpOworfQorCitpbmxpbmUgYm9vbCBvcGVyYXRvciE9KGNvbnN0IFRlc3ROYXRpdmVJbmxpbmVUYWJsZVQgJmxocywgY29uc3QgVGVzdE5hdGl2ZUlubGluZVRhYmxlVCAmcmhzKSB7CisgICAgcmV0dXJuICEobGhzID09IHJocyk7Cit9CisKKworaW5saW5lIFRlc3ROYXRpdmVJbmxpbmVUYWJsZVQgKlRlc3ROYXRpdmVJbmxpbmVUYWJsZTo6VW5QYWNrKGNvbnN0IGZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIpIGNvbnN0IHsKKyAgYXV0byBfbyA9IHN0ZDo6dW5pcXVlX3B0cjxUZXN0TmF0aXZlSW5saW5lVGFibGVUPihuZXcgVGVzdE5hdGl2ZUlubGluZVRhYmxlVCgpKTsKKyAgVW5QYWNrVG8oX28uZ2V0KCksIF9yZXNvbHZlcik7CisgIHJldHVybiBfby5yZWxlYXNlKCk7Cit9CisKK2lubGluZSB2b2lkIFRlc3ROYXRpdmVJbmxpbmVUYWJsZTo6VW5QYWNrVG8oVGVzdE5hdGl2ZUlubGluZVRhYmxlVCAqX28sIGNvbnN0IGZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIpIGNvbnN0IHsKKyAgKHZvaWQpX287CisgICh2b2lkKV9yZXNvbHZlcjsKKyAgeyBhdXRvIF9lID0gdCgpOyBpZiAoX2UpIHsgX28tPnQucmVzaXplKF9lLT5zaXplKCkpOyBmb3IgKGZsYXRidWZmZXJzOjp1b2Zmc2V0X3QgX2kgPSAwOyBfaSA8IF9lLT5zaXplKCk7IF9pKyspIHsgX28tPnRbX2ldID0gKmZsYXRidWZmZXJzOjp1bmlxdWVfcHRyPE5hdGl2ZUlubGluZVRhYmxlVD4oX2UtPkdldChfaSktPlVuUGFjayhfcmVzb2x2ZXIpKTsgfSB9IGVsc2UgeyBfby0+dC5yZXNpemUoMCk7IH0gfQorfQorCitpbmxpbmUgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxUZXN0TmF0aXZlSW5saW5lVGFibGU+IFRlc3ROYXRpdmVJbmxpbmVUYWJsZTo6UGFjayhmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IFRlc3ROYXRpdmVJbmxpbmVUYWJsZVQqIF9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyKSB7CisgIHJldHVybiBDcmVhdGVUZXN0TmF0aXZlSW5saW5lVGFibGUoX2ZiYiwgX28sIF9yZWhhc2hlcik7Cit9CisKK2lubGluZSBmbGF0YnVmZmVyczo6T2Zmc2V0PFRlc3ROYXRpdmVJbmxpbmVUYWJsZT4gQ3JlYXRlVGVzdE5hdGl2ZUlubGluZVRhYmxlKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgVGVzdE5hdGl2ZUlubGluZVRhYmxlVCAqX28sIGNvbnN0IGZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIpIHsKKyAgKHZvaWQpX3JlaGFzaGVyOworICAodm9pZClfbzsKKyAgc3RydWN0IF9WZWN0b3JBcmdzIHsgZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICpfX2ZiYjsgY29uc3QgVGVzdE5hdGl2ZUlubGluZVRhYmxlVCogX19vOyBjb25zdCBmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX19yZWhhc2hlcjsgfSBfdmEgPSB7ICZfZmJiLCBfbywgX3JlaGFzaGVyfTsgKHZvaWQpX3ZhOworICBhdXRvIF90ID0gX28tPnQuc2l6ZSgpID8gX2ZiYi5DcmVhdGVWZWN0b3I8ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxOYXRpdmVJbmxpbmVUYWJsZT4+IChfby0+dC5zaXplKCksIFtdKHNpemVfdCBpLCBfVmVjdG9yQXJncyAqX192YSkgeyByZXR1cm4gQ3JlYXRlTmF0aXZlSW5saW5lVGFibGUoKl9fdmEtPl9fZmJiLCAmKF9fdmEtPl9fby0+dFtpXSksIF9fdmEtPl9fcmVoYXNoZXIpOyB9LCAmX3ZhICkgOiAwOworICByZXR1cm4gQ3JlYXRlVGVzdE5hdGl2ZUlubGluZVRhYmxlKAorICAgICAgX2ZiYiwKKyAgICAgIF90KTsKK30KKworaW5saW5lIGNvbnN0IGZsYXRidWZmZXJzOjpUeXBlVGFibGUgKk5hdGl2ZUlubGluZVRhYmxlVHlwZVRhYmxlKCkgeworICBzdGF0aWMgY29uc3QgZmxhdGJ1ZmZlcnM6OlR5cGVDb2RlIHR5cGVfY29kZXNbXSA9IHsKKyAgICB7IGZsYXRidWZmZXJzOjpFVF9JTlQsIDAsIC0xIH0KKyAgfTsKKyAgc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBuYW1lc1tdID0geworICAgICJhIgorICB9OworICBzdGF0aWMgY29uc3QgZmxhdGJ1ZmZlcnM6OlR5cGVUYWJsZSB0dCA9IHsKKyAgICBmbGF0YnVmZmVyczo6U1RfVEFCTEUsIDEsIHR5cGVfY29kZXMsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIsIG5hbWVzCisgIH07CisgIHJldHVybiAmdHQ7Cit9CisKK2lubGluZSBjb25zdCBmbGF0YnVmZmVyczo6VHlwZVRhYmxlICpUZXN0TmF0aXZlSW5saW5lVGFibGVUeXBlVGFibGUoKSB7CisgIHN0YXRpYyBjb25zdCBmbGF0YnVmZmVyczo6VHlwZUNvZGUgdHlwZV9jb2Rlc1tdID0geworICAgIHsgZmxhdGJ1ZmZlcnM6OkVUX1NFUVVFTkNFLCAxLCAwIH0KKyAgfTsKKyAgc3RhdGljIGNvbnN0IGZsYXRidWZmZXJzOjpUeXBlRnVuY3Rpb24gdHlwZV9yZWZzW10gPSB7CisgICAgTmF0aXZlSW5saW5lVGFibGVUeXBlVGFibGUKKyAgfTsKKyAgc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBuYW1lc1tdID0geworICAgICJ0IgorICB9OworICBzdGF0aWMgY29uc3QgZmxhdGJ1ZmZlcnM6OlR5cGVUYWJsZSB0dCA9IHsKKyAgICBmbGF0YnVmZmVyczo6U1RfVEFCTEUsIDEsIHR5cGVfY29kZXMsIHR5cGVfcmVmcywgbnVsbHB0ciwgbnVsbHB0ciwgbmFtZXMKKyAgfTsKKyAgcmV0dXJuICZ0dDsKK30KKworI2VuZGlmICAvLyBGTEFUQlVGRkVSU19HRU5FUkFURURfTkFUSVZFSU5MSU5FVEFCTEVURVNUX0hfCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9uYXRpdmVfdHlwZV90ZXN0X2dlbmVyYXRlZC5oIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvbmF0aXZlX3R5cGVfdGVzdF9nZW5lcmF0ZWQuaAppbmRleCA4Njc4NzE4Li42MzMwNGYxIDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9uYXRpdmVfdHlwZV90ZXN0X2dlbmVyYXRlZC5oCisrKyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL25hdGl2ZV90eXBlX3Rlc3RfZ2VuZXJhdGVkLmgKQEAgLTYsNiArNiwxMyBAQAogCiAjaW5jbHVkZSAiZmxhdGJ1ZmZlcnMvZmxhdGJ1ZmZlcnMuaCIKIAorLy8gRW5zdXJlIHRoZSBpbmNsdWRlZCBmbGF0YnVmZmVycy5oIGlzIHRoZSBzYW1lIHZlcnNpb24gYXMgd2hlbiB0aGlzIGZpbGUgd2FzCisvLyBnZW5lcmF0ZWQsIG90aGVyd2lzZSBpdCBtYXkgbm90IGJlIGNvbXBhdGlibGUuCitzdGF0aWNfYXNzZXJ0KEZMQVRCVUZGRVJTX1ZFUlNJT05fTUFKT1IgPT0gMiAmJgorICAgICAgICAgICAgICBGTEFUQlVGRkVSU19WRVJTSU9OX01JTk9SID09IDAgJiYKKyAgICAgICAgICAgICAgRkxBVEJVRkZFUlNfVkVSU0lPTl9SRVZJU0lPTiA9PSA4LAorICAgICAgICAgICAgICJOb24tY29tcGF0aWJsZSBmbGF0YnVmZmVycyB2ZXJzaW9uIGluY2x1ZGVkIik7CisKICNpbmNsdWRlICJuYXRpdmVfdHlwZV90ZXN0X2ltcGwuaCIKIAogbmFtZXNwYWNlIEdlb21ldHJ5IHsKQEAgLTIwMSw4ICsyMDgsOCBAQAogaW5saW5lIHZvaWQgQXBwbGljYXRpb25EYXRhOjpVblBhY2tUbyhBcHBsaWNhdGlvbkRhdGFUICpfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlcikgY29uc3QgewogICAodm9pZClfbzsKICAgKHZvaWQpX3Jlc29sdmVyOwotICB7IGF1dG8gX2UgPSB2ZWN0b3JzKCk7IGlmIChfZSkgeyBfby0+dmVjdG9ycy5yZXNpemUoX2UtPnNpemUoKSk7IGZvciAoZmxhdGJ1ZmZlcnM6OnVvZmZzZXRfdCBfaSA9IDA7IF9pIDwgX2UtPnNpemUoKTsgX2krKykgeyBfby0+dmVjdG9yc1tfaV0gPSBmbGF0YnVmZmVyczo6VW5QYWNrKCpfZS0+R2V0KF9pKSk7IH0gfSB9Ci0gIHsgYXV0byBfZSA9IHZlY3RvcnNfYWx0KCk7IGlmIChfZSkgeyBfby0+dmVjdG9yc19hbHQucmVzaXplKF9lLT5zaXplKCkpOyBmb3IgKGZsYXRidWZmZXJzOjp1b2Zmc2V0X3QgX2kgPSAwOyBfaSA8IF9lLT5zaXplKCk7IF9pKyspIHsgX28tPnZlY3RvcnNfYWx0W19pXSA9IGZsYXRidWZmZXJzOjpVblBhY2tWZWN0b3IzREFsdCgqX2UtPkdldChfaSkpOyB9IH0gfQorICB7IGF1dG8gX2UgPSB2ZWN0b3JzKCk7IGlmIChfZSkgeyBfby0+dmVjdG9ycy5yZXNpemUoX2UtPnNpemUoKSk7IGZvciAoZmxhdGJ1ZmZlcnM6OnVvZmZzZXRfdCBfaSA9IDA7IF9pIDwgX2UtPnNpemUoKTsgX2krKykgeyBfby0+dmVjdG9yc1tfaV0gPSBmbGF0YnVmZmVyczo6VW5QYWNrKCpfZS0+R2V0KF9pKSk7IH0gfSBlbHNlIHsgX28tPnZlY3RvcnMucmVzaXplKDApOyB9IH0KKyAgeyBhdXRvIF9lID0gdmVjdG9yc19hbHQoKTsgaWYgKF9lKSB7IF9vLT52ZWN0b3JzX2FsdC5yZXNpemUoX2UtPnNpemUoKSk7IGZvciAoZmxhdGJ1ZmZlcnM6OnVvZmZzZXRfdCBfaSA9IDA7IF9pIDwgX2UtPnNpemUoKTsgX2krKykgeyBfby0+dmVjdG9yc19hbHRbX2ldID0gZmxhdGJ1ZmZlcnM6OlVuUGFja1ZlY3RvcjNEQWx0KCpfZS0+R2V0KF9pKSk7IH0gfSBlbHNlIHsgX28tPnZlY3RvcnNfYWx0LnJlc2l6ZSgwKTsgfSB9CiB9CiAKIGlubGluZSBmbGF0YnVmZmVyczo6T2Zmc2V0PEFwcGxpY2F0aW9uRGF0YT4gQXBwbGljYXRpb25EYXRhOjpQYWNrKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgQXBwbGljYXRpb25EYXRhVCogX28sIGNvbnN0IGZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIpIHsKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL25lc3RlZF9uYW1lc3BhY2VfdGVzdC9uZXN0ZWRfbmFtZXNwYWNlX3Rlc3QxX2dlbmVyYXRlZC5jcyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL25lc3RlZF9uYW1lc3BhY2VfdGVzdC9uZXN0ZWRfbmFtZXNwYWNlX3Rlc3QxX2dlbmVyYXRlZC5jcwppbmRleCBlNDJlOTZhLi5mMWU2NDZjIDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9uZXN0ZWRfbmFtZXNwYWNlX3Rlc3QvbmVzdGVkX25hbWVzcGFjZV90ZXN0MV9nZW5lcmF0ZWQuY3MKKysrIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvbmVzdGVkX25hbWVzcGFjZV90ZXN0L25lc3RlZF9uYW1lc3BhY2VfdGVzdDFfZ2VuZXJhdGVkLmNzCkBAIC03LDcgKzcsNyBAQAogCiB1c2luZyBnbG9iYWw6OlN5c3RlbTsKIHVzaW5nIGdsb2JhbDo6U3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Ci11c2luZyBnbG9iYWw6OkZsYXRCdWZmZXJzOwordXNpbmcgZ2xvYmFsOjpHb29nbGUuRmxhdEJ1ZmZlcnM7CiAKIFtOZXd0b25zb2Z0Lkpzb24uSnNvbkNvbnZlcnRlcih0eXBlb2YoTmV3dG9uc29mdC5Kc29uLkNvbnZlcnRlcnMuU3RyaW5nRW51bUNvbnZlcnRlcikpXQogcHVibGljIGVudW0gQ29sb3IgOiBzYnl0ZQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvbmVzdGVkX25hbWVzcGFjZV90ZXN0L25lc3RlZF9uYW1lc3BhY2VfdGVzdDJfZ2VuZXJhdGVkLmNzIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvbmVzdGVkX25hbWVzcGFjZV90ZXN0L25lc3RlZF9uYW1lc3BhY2VfdGVzdDJfZ2VuZXJhdGVkLmNzCmluZGV4IGNkYzFiMDkuLmVmZDI1ODQgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL25lc3RlZF9uYW1lc3BhY2VfdGVzdC9uZXN0ZWRfbmFtZXNwYWNlX3Rlc3QyX2dlbmVyYXRlZC5jcworKysgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9uZXN0ZWRfbmFtZXNwYWNlX3Rlc3QvbmVzdGVkX25hbWVzcGFjZV90ZXN0Ml9nZW5lcmF0ZWQuY3MKQEAgLTcsNyArNyw3IEBACiAKIHVzaW5nIGdsb2JhbDo6U3lzdGVtOwogdXNpbmcgZ2xvYmFsOjpTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKLXVzaW5nIGdsb2JhbDo6RmxhdEJ1ZmZlcnM7Cit1c2luZyBnbG9iYWw6Okdvb2dsZS5GbGF0QnVmZmVyczsKIAogW05ld3RvbnNvZnQuSnNvbi5Kc29uQ29udmVydGVyKHR5cGVvZihOZXd0b25zb2Z0Lkpzb24uQ29udmVydGVycy5TdHJpbmdFbnVtQ29udmVydGVyKSldCiBwdWJsaWMgZW51bSBDb2xvciA6IHNieXRlCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9uZXN0ZWRfbmFtZXNwYWNlX3Rlc3QvbmVzdGVkX25hbWVzcGFjZV90ZXN0M19nZW5lcmF0ZWQuY3MgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9uZXN0ZWRfbmFtZXNwYWNlX3Rlc3QvbmVzdGVkX25hbWVzcGFjZV90ZXN0M19nZW5lcmF0ZWQuY3MKaW5kZXggZjJmMzc3OC4uODUwNDBjNSAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvbmVzdGVkX25hbWVzcGFjZV90ZXN0L25lc3RlZF9uYW1lc3BhY2VfdGVzdDNfZ2VuZXJhdGVkLmNzCisrKyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL25lc3RlZF9uYW1lc3BhY2VfdGVzdC9uZXN0ZWRfbmFtZXNwYWNlX3Rlc3QzX2dlbmVyYXRlZC5jcwpAQCAtNywxMyArNywxMyBAQAogCiB1c2luZyBnbG9iYWw6OlN5c3RlbTsKIHVzaW5nIGdsb2JhbDo6U3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Ci11c2luZyBnbG9iYWw6OkZsYXRCdWZmZXJzOwordXNpbmcgZ2xvYmFsOjpHb29nbGUuRmxhdEJ1ZmZlcnM7CiAKIHB1YmxpYyBzdHJ1Y3QgQ29sb3JUZXN0VGFibGUgOiBJRmxhdGJ1ZmZlck9iamVjdAogewogICBwcml2YXRlIFRhYmxlIF9fcDsKICAgcHVibGljIEJ5dGVCdWZmZXIgQnl0ZUJ1ZmZlciB7IGdldCB7IHJldHVybiBfX3AuYmI7IH0gfQotICBwdWJsaWMgc3RhdGljIHZvaWQgVmFsaWRhdGVWZXJzaW9uKCkgeyBGbGF0QnVmZmVyQ29uc3RhbnRzLkZMQVRCVUZGRVJTXzJfMF8wKCk7IH0KKyAgcHVibGljIHN0YXRpYyB2b2lkIFZhbGlkYXRlVmVyc2lvbigpIHsgRmxhdEJ1ZmZlckNvbnN0YW50cy5GTEFUQlVGRkVSU18yXzBfOCgpOyB9CiAgIHB1YmxpYyBzdGF0aWMgQ29sb3JUZXN0VGFibGUgR2V0Um9vdEFzQ29sb3JUZXN0VGFibGUoQnl0ZUJ1ZmZlciBfYmIpIHsgcmV0dXJuIEdldFJvb3RBc0NvbG9yVGVzdFRhYmxlKF9iYiwgbmV3IENvbG9yVGVzdFRhYmxlKCkpOyB9CiAgIHB1YmxpYyBzdGF0aWMgQ29sb3JUZXN0VGFibGUgR2V0Um9vdEFzQ29sb3JUZXN0VGFibGUoQnl0ZUJ1ZmZlciBfYmIsIENvbG9yVGVzdFRhYmxlIG9iaikgeyByZXR1cm4gKG9iai5fX2Fzc2lnbihfYmIuR2V0SW50KF9iYi5Qb3NpdGlvbikgKyBfYmIuUG9zaXRpb24sIF9iYikpOyB9CiAgIHB1YmxpYyB2b2lkIF9faW5pdChpbnQgX2ksIEJ5dGVCdWZmZXIgX2JiKSB7IF9fcCA9IG5ldyBUYWJsZShfaSwgX2JiKTsgfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvb3B0aW9uYWwtc2NhbGFycy9vcHRpb25hbC1ieXRlLnRzIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvb3B0aW9uYWwtc2NhbGFycy9vcHRpb25hbC1ieXRlLnRzCmluZGV4IDFkYjQ3OWYuLmY0ZGIyNjUgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL29wdGlvbmFsLXNjYWxhcnMvb3B0aW9uYWwtYnl0ZS50cworKysgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9vcHRpb25hbC1zY2FsYXJzL29wdGlvbmFsLWJ5dGUudHMKQEAgLTEsOCArMSw3IEBACiAvLyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBieSB0aGUgRmxhdEJ1ZmZlcnMgY29tcGlsZXIsIGRvIG5vdCBtb2RpZnkKIAotZXhwb3J0IGVudW0gT3B0aW9uYWxCeXRleworZXhwb3J0IGVudW0gT3B0aW9uYWxCeXRlIHsKICAgTm9uZSA9IDAsCiAgIE9uZSA9IDEsCiAgIFR3byA9IDIKIH0KLQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvb3B0aW9uYWwtc2NhbGFycy9zY2FsYXItc3R1ZmYudHMgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9vcHRpb25hbC1zY2FsYXJzL3NjYWxhci1zdHVmZi50cwppbmRleCBhNzQ4YzIyLi43YzhmZDUxIDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9vcHRpb25hbC1zY2FsYXJzL3NjYWxhci1zdHVmZi50cworKysgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9vcHRpb25hbC1zY2FsYXJzL3NjYWxhci1zdHVmZi50cwpAQCAtOCw3ICs4LDcgQEAKIGV4cG9ydCBjbGFzcyBTY2FsYXJTdHVmZiB7CiAgIGJiOiBmbGF0YnVmZmVycy5CeXRlQnVmZmVyfG51bGwgPSBudWxsOwogICBiYl9wb3MgPSAwOwotX19pbml0KGk6bnVtYmVyLCBiYjpmbGF0YnVmZmVycy5CeXRlQnVmZmVyKTpTY2FsYXJTdHVmZiB7CisgIF9faW5pdChpOm51bWJlciwgYmI6ZmxhdGJ1ZmZlcnMuQnl0ZUJ1ZmZlcik6U2NhbGFyU3R1ZmYgewogICB0aGlzLmJiX3BvcyA9IGk7CiAgIHRoaXMuYmIgPSBiYjsKICAgcmV0dXJuIHRoaXM7CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9vcHRpb25hbF9zY2FsYXJzLmpzb24gYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9vcHRpb25hbF9zY2FsYXJzLmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODdiZDIyZQotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL29wdGlvbmFsX3NjYWxhcnMuanNvbgpAQCAtMCwwICsxLDIxIEBACit7CisgIGp1c3RfaTg6IDQsCisgIG1heWJlX3U4OiAwLAorICBkZWZhdWx0X3U4OiAwLAorICBqdXN0X2kxNjogNCwKKyAgbWF5YmVfdTE2OiAwLAorICBkZWZhdWx0X3UxNjogMCwKKyAganVzdF9pMzI6IDQsCisgIG1heWJlX3UzMjogMCwKKyAgZGVmYXVsdF91MzI6IDAsCisgIGp1c3RfaTY0OiA0LAorICBtYXliZV91NjQ6IDAsCisgIGRlZmF1bHRfdTY0OiAwLAorICBqdXN0X2YzMjogNC4wLAorICBtYXliZV9mNjQ6IDAuMCwKKyAgZGVmYXVsdF9mNjQ6IDAuMCwKKyAganVzdF9ib29sOiB0cnVlLAorICBkZWZhdWx0X2Jvb2w6IGZhbHNlLAorICBtYXliZV9lbnVtOiAiT25lIiwKKyAgZGVmYXVsdF9lbnVtOiAiVHdvIgorfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvb3B0aW9uYWxfc2NhbGFycy9PcHRpb25hbEJ5dGUucHkgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9vcHRpb25hbF9zY2FsYXJzL09wdGlvbmFsQnl0ZS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZTdkZjhiCi0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvb3B0aW9uYWxfc2NhbGFycy9PcHRpb25hbEJ5dGUucHkKQEAgLTAsMCArMSw4IEBACisjIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGJ5IHRoZSBGbGF0QnVmZmVycyBjb21waWxlciwgZG8gbm90IG1vZGlmeQorCisjIG5hbWVzcGFjZTogb3B0aW9uYWxfc2NhbGFycworCitjbGFzcyBPcHRpb25hbEJ5dGUob2JqZWN0KToKKyAgICBOb25lXyA9IDAKKyAgICBPbmUgPSAxCisgICAgVHdvID0gMgpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvb3B0aW9uYWxfc2NhbGFycy9TY2FsYXJTdHVmZi5jcyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL29wdGlvbmFsX3NjYWxhcnMvU2NhbGFyU3R1ZmYuY3MKaW5kZXggZTU0OTgzOC4uODVjMTY3MiAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvb3B0aW9uYWxfc2NhbGFycy9TY2FsYXJTdHVmZi5jcworKysgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9vcHRpb25hbF9zY2FsYXJzL1NjYWxhclN0dWZmLmNzCkBAIC03LDEzICs3LDEzIEBACiAKIHVzaW5nIGdsb2JhbDo6U3lzdGVtOwogdXNpbmcgZ2xvYmFsOjpTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKLXVzaW5nIGdsb2JhbDo6RmxhdEJ1ZmZlcnM7Cit1c2luZyBnbG9iYWw6Okdvb2dsZS5GbGF0QnVmZmVyczsKIAogcHVibGljIHN0cnVjdCBTY2FsYXJTdHVmZiA6IElGbGF0YnVmZmVyT2JqZWN0CiB7CiAgIHByaXZhdGUgVGFibGUgX19wOwogICBwdWJsaWMgQnl0ZUJ1ZmZlciBCeXRlQnVmZmVyIHsgZ2V0IHsgcmV0dXJuIF9fcC5iYjsgfSB9Ci0gIHB1YmxpYyBzdGF0aWMgdm9pZCBWYWxpZGF0ZVZlcnNpb24oKSB7IEZsYXRCdWZmZXJDb25zdGFudHMuRkxBVEJVRkZFUlNfMl8wXzAoKTsgfQorICBwdWJsaWMgc3RhdGljIHZvaWQgVmFsaWRhdGVWZXJzaW9uKCkgeyBGbGF0QnVmZmVyQ29uc3RhbnRzLkZMQVRCVUZGRVJTXzJfMF84KCk7IH0KICAgcHVibGljIHN0YXRpYyBTY2FsYXJTdHVmZiBHZXRSb290QXNTY2FsYXJTdHVmZihCeXRlQnVmZmVyIF9iYikgeyByZXR1cm4gR2V0Um9vdEFzU2NhbGFyU3R1ZmYoX2JiLCBuZXcgU2NhbGFyU3R1ZmYoKSk7IH0KICAgcHVibGljIHN0YXRpYyBTY2FsYXJTdHVmZiBHZXRSb290QXNTY2FsYXJTdHVmZihCeXRlQnVmZmVyIF9iYiwgU2NhbGFyU3R1ZmYgb2JqKSB7IHJldHVybiAob2JqLl9fYXNzaWduKF9iYi5HZXRJbnQoX2JiLlBvc2l0aW9uKSArIF9iYi5Qb3NpdGlvbiwgX2JiKSk7IH0KICAgcHVibGljIHN0YXRpYyBib29sIFNjYWxhclN0dWZmQnVmZmVySGFzSWRlbnRpZmllcihCeXRlQnVmZmVyIF9iYikgeyByZXR1cm4gVGFibGUuX19oYXNfaWRlbnRpZmllcihfYmIsICJOVUxMIik7IH0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL29wdGlvbmFsX3NjYWxhcnMvU2NhbGFyU3R1ZmYuZ28gYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9vcHRpb25hbF9zY2FsYXJzL1NjYWxhclN0dWZmLmdvCmluZGV4IDI5OTJmMzAuLjhiNTY1NjcgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL29wdGlvbmFsX3NjYWxhcnMvU2NhbGFyU3R1ZmYuZ28KKysrIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvb3B0aW9uYWxfc2NhbGFycy9TY2FsYXJTdHVmZi5nbwpAQCAtNyw0MiArNyw0MiBAQAogKQogCiB0eXBlIFNjYWxhclN0dWZmVCBzdHJ1Y3QgewotCUp1c3RJOCBpbnQ4Ci0JTWF5YmVJOCAqaW50OAotCURlZmF1bHRJOCBpbnQ4Ci0JSnVzdFU4IGJ5dGUKLQlNYXliZVU4ICpieXRlCi0JRGVmYXVsdFU4IGJ5dGUKLQlKdXN0STE2IGludDE2Ci0JTWF5YmVJMTYgKmludDE2Ci0JRGVmYXVsdEkxNiBpbnQxNgotCUp1c3RVMTYgdWludDE2Ci0JTWF5YmVVMTYgKnVpbnQxNgotCURlZmF1bHRVMTYgdWludDE2Ci0JSnVzdEkzMiBpbnQzMgotCU1heWJlSTMyICppbnQzMgotCURlZmF1bHRJMzIgaW50MzIKLQlKdXN0VTMyIHVpbnQzMgotCU1heWJlVTMyICp1aW50MzIKLQlEZWZhdWx0VTMyIHVpbnQzMgotCUp1c3RJNjQgaW50NjQKLQlNYXliZUk2NCAqaW50NjQKLQlEZWZhdWx0STY0IGludDY0Ci0JSnVzdFU2NCB1aW50NjQKLQlNYXliZVU2NCAqdWludDY0Ci0JRGVmYXVsdFU2NCB1aW50NjQKLQlKdXN0RjMyIGZsb2F0MzIKLQlNYXliZUYzMiAqZmxvYXQzMgotCURlZmF1bHRGMzIgZmxvYXQzMgotCUp1c3RGNjQgZmxvYXQ2NAotCU1heWJlRjY0ICpmbG9hdDY0Ci0JRGVmYXVsdEY2NCBmbG9hdDY0Ci0JSnVzdEJvb2wgYm9vbAotCU1heWJlQm9vbCAqYm9vbAotCURlZmF1bHRCb29sIGJvb2wKLQlKdXN0RW51bSBPcHRpb25hbEJ5dGUKLQlNYXliZUVudW0gKk9wdGlvbmFsQnl0ZQotCURlZmF1bHRFbnVtIE9wdGlvbmFsQnl0ZQorCUp1c3RJOCBpbnQ4IGBqc29uOiJqdXN0X2k4ImAKKwlNYXliZUk4ICppbnQ4IGBqc29uOiJtYXliZV9pOCJgCisJRGVmYXVsdEk4IGludDggYGpzb246ImRlZmF1bHRfaTgiYAorCUp1c3RVOCBieXRlIGBqc29uOiJqdXN0X3U4ImAKKwlNYXliZVU4ICpieXRlIGBqc29uOiJtYXliZV91OCJgCisJRGVmYXVsdFU4IGJ5dGUgYGpzb246ImRlZmF1bHRfdTgiYAorCUp1c3RJMTYgaW50MTYgYGpzb246Imp1c3RfaTE2ImAKKwlNYXliZUkxNiAqaW50MTYgYGpzb246Im1heWJlX2kxNiJgCisJRGVmYXVsdEkxNiBpbnQxNiBganNvbjoiZGVmYXVsdF9pMTYiYAorCUp1c3RVMTYgdWludDE2IGBqc29uOiJqdXN0X3UxNiJgCisJTWF5YmVVMTYgKnVpbnQxNiBganNvbjoibWF5YmVfdTE2ImAKKwlEZWZhdWx0VTE2IHVpbnQxNiBganNvbjoiZGVmYXVsdF91MTYiYAorCUp1c3RJMzIgaW50MzIgYGpzb246Imp1c3RfaTMyImAKKwlNYXliZUkzMiAqaW50MzIgYGpzb246Im1heWJlX2kzMiJgCisJRGVmYXVsdEkzMiBpbnQzMiBganNvbjoiZGVmYXVsdF9pMzIiYAorCUp1c3RVMzIgdWludDMyIGBqc29uOiJqdXN0X3UzMiJgCisJTWF5YmVVMzIgKnVpbnQzMiBganNvbjoibWF5YmVfdTMyImAKKwlEZWZhdWx0VTMyIHVpbnQzMiBganNvbjoiZGVmYXVsdF91MzIiYAorCUp1c3RJNjQgaW50NjQgYGpzb246Imp1c3RfaTY0ImAKKwlNYXliZUk2NCAqaW50NjQgYGpzb246Im1heWJlX2k2NCJgCisJRGVmYXVsdEk2NCBpbnQ2NCBganNvbjoiZGVmYXVsdF9pNjQiYAorCUp1c3RVNjQgdWludDY0IGBqc29uOiJqdXN0X3U2NCJgCisJTWF5YmVVNjQgKnVpbnQ2NCBganNvbjoibWF5YmVfdTY0ImAKKwlEZWZhdWx0VTY0IHVpbnQ2NCBganNvbjoiZGVmYXVsdF91NjQiYAorCUp1c3RGMzIgZmxvYXQzMiBganNvbjoianVzdF9mMzIiYAorCU1heWJlRjMyICpmbG9hdDMyIGBqc29uOiJtYXliZV9mMzIiYAorCURlZmF1bHRGMzIgZmxvYXQzMiBganNvbjoiZGVmYXVsdF9mMzIiYAorCUp1c3RGNjQgZmxvYXQ2NCBganNvbjoianVzdF9mNjQiYAorCU1heWJlRjY0ICpmbG9hdDY0IGBqc29uOiJtYXliZV9mNjQiYAorCURlZmF1bHRGNjQgZmxvYXQ2NCBganNvbjoiZGVmYXVsdF9mNjQiYAorCUp1c3RCb29sIGJvb2wgYGpzb246Imp1c3RfYm9vbCJgCisJTWF5YmVCb29sICpib29sIGBqc29uOiJtYXliZV9ib29sImAKKwlEZWZhdWx0Qm9vbCBib29sIGBqc29uOiJkZWZhdWx0X2Jvb2wiYAorCUp1c3RFbnVtIE9wdGlvbmFsQnl0ZSBganNvbjoianVzdF9lbnVtImAKKwlNYXliZUVudW0gKk9wdGlvbmFsQnl0ZSBganNvbjoibWF5YmVfZW51bSJgCisJRGVmYXVsdEVudW0gT3B0aW9uYWxCeXRlIGBqc29uOiJkZWZhdWx0X2VudW0iYAogfQogCiBmdW5jICh0ICpTY2FsYXJTdHVmZlQpIFBhY2soYnVpbGRlciAqZmxhdGJ1ZmZlcnMuQnVpbGRlcikgZmxhdGJ1ZmZlcnMuVU9mZnNldFQgewpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvb3B0aW9uYWxfc2NhbGFycy9TY2FsYXJTdHVmZi5qYXZhIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvb3B0aW9uYWxfc2NhbGFycy9TY2FsYXJTdHVmZi5qYXZhCmluZGV4IGU0MTUyMTAuLmY0ODkwYjEgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL29wdGlvbmFsX3NjYWxhcnMvU2NhbGFyU3R1ZmYuamF2YQorKysgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9vcHRpb25hbF9zY2FsYXJzL1NjYWxhclN0dWZmLmphdmEKQEAgLTksNyArOSw3IEBACiAKIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKQogcHVibGljIGZpbmFsIGNsYXNzIFNjYWxhclN0dWZmIGV4dGVuZHMgVGFibGUgewotICBwdWJsaWMgc3RhdGljIHZvaWQgVmFsaWRhdGVWZXJzaW9uKCkgeyBDb25zdGFudHMuRkxBVEJVRkZFUlNfMl8wXzAoKTsgfQorICBwdWJsaWMgc3RhdGljIHZvaWQgVmFsaWRhdGVWZXJzaW9uKCkgeyBDb25zdGFudHMuRkxBVEJVRkZFUlNfMl8wXzgoKTsgfQogICBwdWJsaWMgc3RhdGljIFNjYWxhclN0dWZmIGdldFJvb3RBc1NjYWxhclN0dWZmKEJ5dGVCdWZmZXIgX2JiKSB7IHJldHVybiBnZXRSb290QXNTY2FsYXJTdHVmZihfYmIsIG5ldyBTY2FsYXJTdHVmZigpKTsgfQogICBwdWJsaWMgc3RhdGljIFNjYWxhclN0dWZmIGdldFJvb3RBc1NjYWxhclN0dWZmKEJ5dGVCdWZmZXIgX2JiLCBTY2FsYXJTdHVmZiBvYmopIHsgX2JiLm9yZGVyKEJ5dGVPcmRlci5MSVRUTEVfRU5ESUFOKTsgcmV0dXJuIChvYmouX19hc3NpZ24oX2JiLmdldEludChfYmIucG9zaXRpb24oKSkgKyBfYmIucG9zaXRpb24oKSwgX2JiKSk7IH0KICAgcHVibGljIHN0YXRpYyBib29sZWFuIFNjYWxhclN0dWZmQnVmZmVySGFzSWRlbnRpZmllcihCeXRlQnVmZmVyIF9iYikgeyByZXR1cm4gX19oYXNfaWRlbnRpZmllcihfYmIsICJOVUxMIik7IH0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL29wdGlvbmFsX3NjYWxhcnMvU2NhbGFyU3R1ZmYua3QgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9vcHRpb25hbF9zY2FsYXJzL1NjYWxhclN0dWZmLmt0CmluZGV4IDVhYjhiZjQuLmU5MDY3YmIgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL29wdGlvbmFsX3NjYWxhcnMvU2NhbGFyU3R1ZmYua3QKKysrIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvb3B0aW9uYWxfc2NhbGFycy9TY2FsYXJTdHVmZi5rdApAQCAtMTk3LDcgKzE5Nyw3IEBACiAgICAgICAgICAgICByZXR1cm4gaWYobyAhPSAwKSBiYi5nZXQobyArIGJiX3BvcykgZWxzZSAxCiAgICAgICAgIH0KICAgICBjb21wYW5pb24gb2JqZWN0IHsKLSAgICAgICAgZnVuIHZhbGlkYXRlVmVyc2lvbigpID0gQ29uc3RhbnRzLkZMQVRCVUZGRVJTXzJfMF8wKCkKKyAgICAgICAgZnVuIHZhbGlkYXRlVmVyc2lvbigpID0gQ29uc3RhbnRzLkZMQVRCVUZGRVJTXzJfMF84KCkKICAgICAgICAgZnVuIGdldFJvb3RBc1NjYWxhclN0dWZmKF9iYjogQnl0ZUJ1ZmZlcik6IFNjYWxhclN0dWZmID0gZ2V0Um9vdEFzU2NhbGFyU3R1ZmYoX2JiLCBTY2FsYXJTdHVmZigpKQogICAgICAgICBmdW4gZ2V0Um9vdEFzU2NhbGFyU3R1ZmYoX2JiOiBCeXRlQnVmZmVyLCBvYmo6IFNjYWxhclN0dWZmKTogU2NhbGFyU3R1ZmYgewogICAgICAgICAgICAgX2JiLm9yZGVyKEJ5dGVPcmRlci5MSVRUTEVfRU5ESUFOKQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvb3B0aW9uYWxfc2NhbGFycy9TY2FsYXJTdHVmZi5weSBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL29wdGlvbmFsX3NjYWxhcnMvU2NhbGFyU3R1ZmYucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGRlYTEyMwotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL29wdGlvbmFsX3NjYWxhcnMvU2NhbGFyU3R1ZmYucHkKQEAgLTAsMCArMSw1MzIgQEAKKyMgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgYnkgdGhlIEZsYXRCdWZmZXJzIGNvbXBpbGVyLCBkbyBub3QgbW9kaWZ5CisKKyMgbmFtZXNwYWNlOiBvcHRpb25hbF9zY2FsYXJzCisKK2ltcG9ydCBmbGF0YnVmZmVycworZnJvbSBmbGF0YnVmZmVycy5jb21wYXQgaW1wb3J0IGltcG9ydF9udW1weQorbnAgPSBpbXBvcnRfbnVtcHkoKQorCitjbGFzcyBTY2FsYXJTdHVmZihvYmplY3QpOgorICAgIF9fc2xvdHNfXyA9IFsnX3RhYiddCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgR2V0Um9vdEFzKGNscywgYnVmLCBvZmZzZXQ9MCk6CisgICAgICAgIG4gPSBmbGF0YnVmZmVycy5lbmNvZGUuR2V0KGZsYXRidWZmZXJzLnBhY2tlci51b2Zmc2V0LCBidWYsIG9mZnNldCkKKyAgICAgICAgeCA9IFNjYWxhclN0dWZmKCkKKyAgICAgICAgeC5Jbml0KGJ1ZiwgbiArIG9mZnNldCkKKyAgICAgICAgcmV0dXJuIHgKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBHZXRSb290QXNTY2FsYXJTdHVmZihjbHMsIGJ1Ziwgb2Zmc2V0PTApOgorICAgICAgICAiIiJUaGlzIG1ldGhvZCBpcyBkZXByZWNhdGVkLiBQbGVhc2Ugc3dpdGNoIHRvIEdldFJvb3RBcy4iIiIKKyAgICAgICAgcmV0dXJuIGNscy5HZXRSb290QXMoYnVmLCBvZmZzZXQpCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIFNjYWxhclN0dWZmQnVmZmVySGFzSWRlbnRpZmllcihjbHMsIGJ1Ziwgb2Zmc2V0LCBzaXplX3ByZWZpeGVkPUZhbHNlKToKKyAgICAgICAgcmV0dXJuIGZsYXRidWZmZXJzLnV0aWwuQnVmZmVySGFzSWRlbnRpZmllcihidWYsIG9mZnNldCwgYiJceDRFXHg1NVx4NENceDRDIiwgc2l6ZV9wcmVmaXhlZD1zaXplX3ByZWZpeGVkKQorCisgICAgIyBTY2FsYXJTdHVmZgorICAgIGRlZiBJbml0KHNlbGYsIGJ1ZiwgcG9zKToKKyAgICAgICAgc2VsZi5fdGFiID0gZmxhdGJ1ZmZlcnMudGFibGUuVGFibGUoYnVmLCBwb3MpCisKKyAgICAjIFNjYWxhclN0dWZmCisgICAgZGVmIEp1c3RJOChzZWxmKToKKyAgICAgICAgbyA9IGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5VT2Zmc2V0VEZsYWdzLnB5X3R5cGUoc2VsZi5fdGFiLk9mZnNldCg0KSkKKyAgICAgICAgaWYgbyAhPSAwOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3RhYi5HZXQoZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLkludDhGbGFncywgbyArIHNlbGYuX3RhYi5Qb3MpCisgICAgICAgIHJldHVybiAwCisKKyAgICAjIFNjYWxhclN0dWZmCisgICAgZGVmIE1heWJlSTgoc2VsZik6CisgICAgICAgIG8gPSBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKHNlbGYuX3RhYi5PZmZzZXQoNikpCisgICAgICAgIGlmIG8gIT0gMDoKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl90YWIuR2V0KGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5JbnQ4RmxhZ3MsIG8gKyBzZWxmLl90YWIuUG9zKQorICAgICAgICByZXR1cm4gTm9uZQorCisgICAgIyBTY2FsYXJTdHVmZgorICAgIGRlZiBEZWZhdWx0STgoc2VsZik6CisgICAgICAgIG8gPSBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKHNlbGYuX3RhYi5PZmZzZXQoOCkpCisgICAgICAgIGlmIG8gIT0gMDoKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl90YWIuR2V0KGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5JbnQ4RmxhZ3MsIG8gKyBzZWxmLl90YWIuUG9zKQorICAgICAgICByZXR1cm4gNDIKKworICAgICMgU2NhbGFyU3R1ZmYKKyAgICBkZWYgSnVzdFU4KHNlbGYpOgorICAgICAgICBvID0gZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVPZmZzZXRURmxhZ3MucHlfdHlwZShzZWxmLl90YWIuT2Zmc2V0KDEwKSkKKyAgICAgICAgaWYgbyAhPSAwOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3RhYi5HZXQoZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVpbnQ4RmxhZ3MsIG8gKyBzZWxmLl90YWIuUG9zKQorICAgICAgICByZXR1cm4gMAorCisgICAgIyBTY2FsYXJTdHVmZgorICAgIGRlZiBNYXliZVU4KHNlbGYpOgorICAgICAgICBvID0gZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVPZmZzZXRURmxhZ3MucHlfdHlwZShzZWxmLl90YWIuT2Zmc2V0KDEyKSkKKyAgICAgICAgaWYgbyAhPSAwOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3RhYi5HZXQoZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVpbnQ4RmxhZ3MsIG8gKyBzZWxmLl90YWIuUG9zKQorICAgICAgICByZXR1cm4gTm9uZQorCisgICAgIyBTY2FsYXJTdHVmZgorICAgIGRlZiBEZWZhdWx0VTgoc2VsZik6CisgICAgICAgIG8gPSBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKHNlbGYuX3RhYi5PZmZzZXQoMTQpKQorICAgICAgICBpZiBvICE9IDA6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5fdGFiLkdldChmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVWludDhGbGFncywgbyArIHNlbGYuX3RhYi5Qb3MpCisgICAgICAgIHJldHVybiA0MgorCisgICAgIyBTY2FsYXJTdHVmZgorICAgIGRlZiBKdXN0STE2KHNlbGYpOgorICAgICAgICBvID0gZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVPZmZzZXRURmxhZ3MucHlfdHlwZShzZWxmLl90YWIuT2Zmc2V0KDE2KSkKKyAgICAgICAgaWYgbyAhPSAwOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3RhYi5HZXQoZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLkludDE2RmxhZ3MsIG8gKyBzZWxmLl90YWIuUG9zKQorICAgICAgICByZXR1cm4gMAorCisgICAgIyBTY2FsYXJTdHVmZgorICAgIGRlZiBNYXliZUkxNihzZWxmKToKKyAgICAgICAgbyA9IGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5VT2Zmc2V0VEZsYWdzLnB5X3R5cGUoc2VsZi5fdGFiLk9mZnNldCgxOCkpCisgICAgICAgIGlmIG8gIT0gMDoKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl90YWIuR2V0KGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5JbnQxNkZsYWdzLCBvICsgc2VsZi5fdGFiLlBvcykKKyAgICAgICAgcmV0dXJuIE5vbmUKKworICAgICMgU2NhbGFyU3R1ZmYKKyAgICBkZWYgRGVmYXVsdEkxNihzZWxmKToKKyAgICAgICAgbyA9IGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5VT2Zmc2V0VEZsYWdzLnB5X3R5cGUoc2VsZi5fdGFiLk9mZnNldCgyMCkpCisgICAgICAgIGlmIG8gIT0gMDoKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl90YWIuR2V0KGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5JbnQxNkZsYWdzLCBvICsgc2VsZi5fdGFiLlBvcykKKyAgICAgICAgcmV0dXJuIDQyCisKKyAgICAjIFNjYWxhclN0dWZmCisgICAgZGVmIEp1c3RVMTYoc2VsZik6CisgICAgICAgIG8gPSBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKHNlbGYuX3RhYi5PZmZzZXQoMjIpKQorICAgICAgICBpZiBvICE9IDA6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5fdGFiLkdldChmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVWludDE2RmxhZ3MsIG8gKyBzZWxmLl90YWIuUG9zKQorICAgICAgICByZXR1cm4gMAorCisgICAgIyBTY2FsYXJTdHVmZgorICAgIGRlZiBNYXliZVUxNihzZWxmKToKKyAgICAgICAgbyA9IGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5VT2Zmc2V0VEZsYWdzLnB5X3R5cGUoc2VsZi5fdGFiLk9mZnNldCgyNCkpCisgICAgICAgIGlmIG8gIT0gMDoKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl90YWIuR2V0KGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5VaW50MTZGbGFncywgbyArIHNlbGYuX3RhYi5Qb3MpCisgICAgICAgIHJldHVybiBOb25lCisKKyAgICAjIFNjYWxhclN0dWZmCisgICAgZGVmIERlZmF1bHRVMTYoc2VsZik6CisgICAgICAgIG8gPSBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKHNlbGYuX3RhYi5PZmZzZXQoMjYpKQorICAgICAgICBpZiBvICE9IDA6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5fdGFiLkdldChmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVWludDE2RmxhZ3MsIG8gKyBzZWxmLl90YWIuUG9zKQorICAgICAgICByZXR1cm4gNDIKKworICAgICMgU2NhbGFyU3R1ZmYKKyAgICBkZWYgSnVzdEkzMihzZWxmKToKKyAgICAgICAgbyA9IGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5VT2Zmc2V0VEZsYWdzLnB5X3R5cGUoc2VsZi5fdGFiLk9mZnNldCgyOCkpCisgICAgICAgIGlmIG8gIT0gMDoKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl90YWIuR2V0KGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5JbnQzMkZsYWdzLCBvICsgc2VsZi5fdGFiLlBvcykKKyAgICAgICAgcmV0dXJuIDAKKworICAgICMgU2NhbGFyU3R1ZmYKKyAgICBkZWYgTWF5YmVJMzIoc2VsZik6CisgICAgICAgIG8gPSBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKHNlbGYuX3RhYi5PZmZzZXQoMzApKQorICAgICAgICBpZiBvICE9IDA6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5fdGFiLkdldChmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuSW50MzJGbGFncywgbyArIHNlbGYuX3RhYi5Qb3MpCisgICAgICAgIHJldHVybiBOb25lCisKKyAgICAjIFNjYWxhclN0dWZmCisgICAgZGVmIERlZmF1bHRJMzIoc2VsZik6CisgICAgICAgIG8gPSBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKHNlbGYuX3RhYi5PZmZzZXQoMzIpKQorICAgICAgICBpZiBvICE9IDA6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5fdGFiLkdldChmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuSW50MzJGbGFncywgbyArIHNlbGYuX3RhYi5Qb3MpCisgICAgICAgIHJldHVybiA0MgorCisgICAgIyBTY2FsYXJTdHVmZgorICAgIGRlZiBKdXN0VTMyKHNlbGYpOgorICAgICAgICBvID0gZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVPZmZzZXRURmxhZ3MucHlfdHlwZShzZWxmLl90YWIuT2Zmc2V0KDM0KSkKKyAgICAgICAgaWYgbyAhPSAwOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3RhYi5HZXQoZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVpbnQzMkZsYWdzLCBvICsgc2VsZi5fdGFiLlBvcykKKyAgICAgICAgcmV0dXJuIDAKKworICAgICMgU2NhbGFyU3R1ZmYKKyAgICBkZWYgTWF5YmVVMzIoc2VsZik6CisgICAgICAgIG8gPSBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKHNlbGYuX3RhYi5PZmZzZXQoMzYpKQorICAgICAgICBpZiBvICE9IDA6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5fdGFiLkdldChmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVWludDMyRmxhZ3MsIG8gKyBzZWxmLl90YWIuUG9zKQorICAgICAgICByZXR1cm4gTm9uZQorCisgICAgIyBTY2FsYXJTdHVmZgorICAgIGRlZiBEZWZhdWx0VTMyKHNlbGYpOgorICAgICAgICBvID0gZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVPZmZzZXRURmxhZ3MucHlfdHlwZShzZWxmLl90YWIuT2Zmc2V0KDM4KSkKKyAgICAgICAgaWYgbyAhPSAwOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3RhYi5HZXQoZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVpbnQzMkZsYWdzLCBvICsgc2VsZi5fdGFiLlBvcykKKyAgICAgICAgcmV0dXJuIDQyCisKKyAgICAjIFNjYWxhclN0dWZmCisgICAgZGVmIEp1c3RJNjQoc2VsZik6CisgICAgICAgIG8gPSBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKHNlbGYuX3RhYi5PZmZzZXQoNDApKQorICAgICAgICBpZiBvICE9IDA6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5fdGFiLkdldChmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuSW50NjRGbGFncywgbyArIHNlbGYuX3RhYi5Qb3MpCisgICAgICAgIHJldHVybiAwCisKKyAgICAjIFNjYWxhclN0dWZmCisgICAgZGVmIE1heWJlSTY0KHNlbGYpOgorICAgICAgICBvID0gZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVPZmZzZXRURmxhZ3MucHlfdHlwZShzZWxmLl90YWIuT2Zmc2V0KDQyKSkKKyAgICAgICAgaWYgbyAhPSAwOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3RhYi5HZXQoZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLkludDY0RmxhZ3MsIG8gKyBzZWxmLl90YWIuUG9zKQorICAgICAgICByZXR1cm4gTm9uZQorCisgICAgIyBTY2FsYXJTdHVmZgorICAgIGRlZiBEZWZhdWx0STY0KHNlbGYpOgorICAgICAgICBvID0gZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVPZmZzZXRURmxhZ3MucHlfdHlwZShzZWxmLl90YWIuT2Zmc2V0KDQ0KSkKKyAgICAgICAgaWYgbyAhPSAwOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3RhYi5HZXQoZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLkludDY0RmxhZ3MsIG8gKyBzZWxmLl90YWIuUG9zKQorICAgICAgICByZXR1cm4gNDIKKworICAgICMgU2NhbGFyU3R1ZmYKKyAgICBkZWYgSnVzdFU2NChzZWxmKToKKyAgICAgICAgbyA9IGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5VT2Zmc2V0VEZsYWdzLnB5X3R5cGUoc2VsZi5fdGFiLk9mZnNldCg0NikpCisgICAgICAgIGlmIG8gIT0gMDoKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl90YWIuR2V0KGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5VaW50NjRGbGFncywgbyArIHNlbGYuX3RhYi5Qb3MpCisgICAgICAgIHJldHVybiAwCisKKyAgICAjIFNjYWxhclN0dWZmCisgICAgZGVmIE1heWJlVTY0KHNlbGYpOgorICAgICAgICBvID0gZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVPZmZzZXRURmxhZ3MucHlfdHlwZShzZWxmLl90YWIuT2Zmc2V0KDQ4KSkKKyAgICAgICAgaWYgbyAhPSAwOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3RhYi5HZXQoZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVpbnQ2NEZsYWdzLCBvICsgc2VsZi5fdGFiLlBvcykKKyAgICAgICAgcmV0dXJuIE5vbmUKKworICAgICMgU2NhbGFyU3R1ZmYKKyAgICBkZWYgRGVmYXVsdFU2NChzZWxmKToKKyAgICAgICAgbyA9IGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5VT2Zmc2V0VEZsYWdzLnB5X3R5cGUoc2VsZi5fdGFiLk9mZnNldCg1MCkpCisgICAgICAgIGlmIG8gIT0gMDoKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl90YWIuR2V0KGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5VaW50NjRGbGFncywgbyArIHNlbGYuX3RhYi5Qb3MpCisgICAgICAgIHJldHVybiA0MgorCisgICAgIyBTY2FsYXJTdHVmZgorICAgIGRlZiBKdXN0RjMyKHNlbGYpOgorICAgICAgICBvID0gZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVPZmZzZXRURmxhZ3MucHlfdHlwZShzZWxmLl90YWIuT2Zmc2V0KDUyKSkKKyAgICAgICAgaWYgbyAhPSAwOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3RhYi5HZXQoZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLkZsb2F0MzJGbGFncywgbyArIHNlbGYuX3RhYi5Qb3MpCisgICAgICAgIHJldHVybiAwLjAKKworICAgICMgU2NhbGFyU3R1ZmYKKyAgICBkZWYgTWF5YmVGMzIoc2VsZik6CisgICAgICAgIG8gPSBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKHNlbGYuX3RhYi5PZmZzZXQoNTQpKQorICAgICAgICBpZiBvICE9IDA6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5fdGFiLkdldChmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuRmxvYXQzMkZsYWdzLCBvICsgc2VsZi5fdGFiLlBvcykKKyAgICAgICAgcmV0dXJuIE5vbmUKKworICAgICMgU2NhbGFyU3R1ZmYKKyAgICBkZWYgRGVmYXVsdEYzMihzZWxmKToKKyAgICAgICAgbyA9IGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5VT2Zmc2V0VEZsYWdzLnB5X3R5cGUoc2VsZi5fdGFiLk9mZnNldCg1NikpCisgICAgICAgIGlmIG8gIT0gMDoKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl90YWIuR2V0KGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5GbG9hdDMyRmxhZ3MsIG8gKyBzZWxmLl90YWIuUG9zKQorICAgICAgICByZXR1cm4gNDIuMAorCisgICAgIyBTY2FsYXJTdHVmZgorICAgIGRlZiBKdXN0RjY0KHNlbGYpOgorICAgICAgICBvID0gZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVPZmZzZXRURmxhZ3MucHlfdHlwZShzZWxmLl90YWIuT2Zmc2V0KDU4KSkKKyAgICAgICAgaWYgbyAhPSAwOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3RhYi5HZXQoZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLkZsb2F0NjRGbGFncywgbyArIHNlbGYuX3RhYi5Qb3MpCisgICAgICAgIHJldHVybiAwLjAKKworICAgICMgU2NhbGFyU3R1ZmYKKyAgICBkZWYgTWF5YmVGNjQoc2VsZik6CisgICAgICAgIG8gPSBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKHNlbGYuX3RhYi5PZmZzZXQoNjApKQorICAgICAgICBpZiBvICE9IDA6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5fdGFiLkdldChmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuRmxvYXQ2NEZsYWdzLCBvICsgc2VsZi5fdGFiLlBvcykKKyAgICAgICAgcmV0dXJuIE5vbmUKKworICAgICMgU2NhbGFyU3R1ZmYKKyAgICBkZWYgRGVmYXVsdEY2NChzZWxmKToKKyAgICAgICAgbyA9IGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5VT2Zmc2V0VEZsYWdzLnB5X3R5cGUoc2VsZi5fdGFiLk9mZnNldCg2MikpCisgICAgICAgIGlmIG8gIT0gMDoKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl90YWIuR2V0KGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5GbG9hdDY0RmxhZ3MsIG8gKyBzZWxmLl90YWIuUG9zKQorICAgICAgICByZXR1cm4gNDIuMAorCisgICAgIyBTY2FsYXJTdHVmZgorICAgIGRlZiBKdXN0Qm9vbChzZWxmKToKKyAgICAgICAgbyA9IGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5VT2Zmc2V0VEZsYWdzLnB5X3R5cGUoc2VsZi5fdGFiLk9mZnNldCg2NCkpCisgICAgICAgIGlmIG8gIT0gMDoKKyAgICAgICAgICAgIHJldHVybiBib29sKHNlbGYuX3RhYi5HZXQoZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLkJvb2xGbGFncywgbyArIHNlbGYuX3RhYi5Qb3MpKQorICAgICAgICByZXR1cm4gRmFsc2UKKworICAgICMgU2NhbGFyU3R1ZmYKKyAgICBkZWYgTWF5YmVCb29sKHNlbGYpOgorICAgICAgICBvID0gZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVPZmZzZXRURmxhZ3MucHlfdHlwZShzZWxmLl90YWIuT2Zmc2V0KDY2KSkKKyAgICAgICAgaWYgbyAhPSAwOgorICAgICAgICAgICAgcmV0dXJuIGJvb2woc2VsZi5fdGFiLkdldChmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuQm9vbEZsYWdzLCBvICsgc2VsZi5fdGFiLlBvcykpCisgICAgICAgIHJldHVybiBOb25lCisKKyAgICAjIFNjYWxhclN0dWZmCisgICAgZGVmIERlZmF1bHRCb29sKHNlbGYpOgorICAgICAgICBvID0gZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVPZmZzZXRURmxhZ3MucHlfdHlwZShzZWxmLl90YWIuT2Zmc2V0KDY4KSkKKyAgICAgICAgaWYgbyAhPSAwOgorICAgICAgICAgICAgcmV0dXJuIGJvb2woc2VsZi5fdGFiLkdldChmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuQm9vbEZsYWdzLCBvICsgc2VsZi5fdGFiLlBvcykpCisgICAgICAgIHJldHVybiBUcnVlCisKKyAgICAjIFNjYWxhclN0dWZmCisgICAgZGVmIEp1c3RFbnVtKHNlbGYpOgorICAgICAgICBvID0gZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVPZmZzZXRURmxhZ3MucHlfdHlwZShzZWxmLl90YWIuT2Zmc2V0KDcwKSkKKyAgICAgICAgaWYgbyAhPSAwOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3RhYi5HZXQoZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLkludDhGbGFncywgbyArIHNlbGYuX3RhYi5Qb3MpCisgICAgICAgIHJldHVybiAwCisKKyAgICAjIFNjYWxhclN0dWZmCisgICAgZGVmIE1heWJlRW51bShzZWxmKToKKyAgICAgICAgbyA9IGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5VT2Zmc2V0VEZsYWdzLnB5X3R5cGUoc2VsZi5fdGFiLk9mZnNldCg3MikpCisgICAgICAgIGlmIG8gIT0gMDoKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl90YWIuR2V0KGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5JbnQ4RmxhZ3MsIG8gKyBzZWxmLl90YWIuUG9zKQorICAgICAgICByZXR1cm4gTm9uZQorCisgICAgIyBTY2FsYXJTdHVmZgorICAgIGRlZiBEZWZhdWx0RW51bShzZWxmKToKKyAgICAgICAgbyA9IGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5VT2Zmc2V0VEZsYWdzLnB5X3R5cGUoc2VsZi5fdGFiLk9mZnNldCg3NCkpCisgICAgICAgIGlmIG8gIT0gMDoKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl90YWIuR2V0KGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5JbnQ4RmxhZ3MsIG8gKyBzZWxmLl90YWIuUG9zKQorICAgICAgICByZXR1cm4gMQorCitkZWYgU2NhbGFyU3R1ZmZTdGFydChidWlsZGVyKTogYnVpbGRlci5TdGFydE9iamVjdCgzNikKK2RlZiBTdGFydChidWlsZGVyKToKKyAgICByZXR1cm4gU2NhbGFyU3R1ZmZTdGFydChidWlsZGVyKQorZGVmIFNjYWxhclN0dWZmQWRkSnVzdEk4KGJ1aWxkZXIsIGp1c3RJOCk6IGJ1aWxkZXIuUHJlcGVuZEludDhTbG90KDAsIGp1c3RJOCwgMCkKK2RlZiBBZGRKdXN0STgoYnVpbGRlciwganVzdEk4KToKKyAgICByZXR1cm4gU2NhbGFyU3R1ZmZBZGRKdXN0STgoYnVpbGRlciwganVzdEk4KQorZGVmIFNjYWxhclN0dWZmQWRkTWF5YmVJOChidWlsZGVyLCBtYXliZUk4KTogYnVpbGRlci5QcmVwZW5kSW50OFNsb3QoMSwgbWF5YmVJOCwgTm9uZSkKK2RlZiBBZGRNYXliZUk4KGJ1aWxkZXIsIG1heWJlSTgpOgorICAgIHJldHVybiBTY2FsYXJTdHVmZkFkZE1heWJlSTgoYnVpbGRlciwgbWF5YmVJOCkKK2RlZiBTY2FsYXJTdHVmZkFkZERlZmF1bHRJOChidWlsZGVyLCBkZWZhdWx0STgpOiBidWlsZGVyLlByZXBlbmRJbnQ4U2xvdCgyLCBkZWZhdWx0STgsIDQyKQorZGVmIEFkZERlZmF1bHRJOChidWlsZGVyLCBkZWZhdWx0STgpOgorICAgIHJldHVybiBTY2FsYXJTdHVmZkFkZERlZmF1bHRJOChidWlsZGVyLCBkZWZhdWx0STgpCitkZWYgU2NhbGFyU3R1ZmZBZGRKdXN0VTgoYnVpbGRlciwganVzdFU4KTogYnVpbGRlci5QcmVwZW5kVWludDhTbG90KDMsIGp1c3RVOCwgMCkKK2RlZiBBZGRKdXN0VTgoYnVpbGRlciwganVzdFU4KToKKyAgICByZXR1cm4gU2NhbGFyU3R1ZmZBZGRKdXN0VTgoYnVpbGRlciwganVzdFU4KQorZGVmIFNjYWxhclN0dWZmQWRkTWF5YmVVOChidWlsZGVyLCBtYXliZVU4KTogYnVpbGRlci5QcmVwZW5kVWludDhTbG90KDQsIG1heWJlVTgsIE5vbmUpCitkZWYgQWRkTWF5YmVVOChidWlsZGVyLCBtYXliZVU4KToKKyAgICByZXR1cm4gU2NhbGFyU3R1ZmZBZGRNYXliZVU4KGJ1aWxkZXIsIG1heWJlVTgpCitkZWYgU2NhbGFyU3R1ZmZBZGREZWZhdWx0VTgoYnVpbGRlciwgZGVmYXVsdFU4KTogYnVpbGRlci5QcmVwZW5kVWludDhTbG90KDUsIGRlZmF1bHRVOCwgNDIpCitkZWYgQWRkRGVmYXVsdFU4KGJ1aWxkZXIsIGRlZmF1bHRVOCk6CisgICAgcmV0dXJuIFNjYWxhclN0dWZmQWRkRGVmYXVsdFU4KGJ1aWxkZXIsIGRlZmF1bHRVOCkKK2RlZiBTY2FsYXJTdHVmZkFkZEp1c3RJMTYoYnVpbGRlciwganVzdEkxNik6IGJ1aWxkZXIuUHJlcGVuZEludDE2U2xvdCg2LCBqdXN0STE2LCAwKQorZGVmIEFkZEp1c3RJMTYoYnVpbGRlciwganVzdEkxNik6CisgICAgcmV0dXJuIFNjYWxhclN0dWZmQWRkSnVzdEkxNihidWlsZGVyLCBqdXN0STE2KQorZGVmIFNjYWxhclN0dWZmQWRkTWF5YmVJMTYoYnVpbGRlciwgbWF5YmVJMTYpOiBidWlsZGVyLlByZXBlbmRJbnQxNlNsb3QoNywgbWF5YmVJMTYsIE5vbmUpCitkZWYgQWRkTWF5YmVJMTYoYnVpbGRlciwgbWF5YmVJMTYpOgorICAgIHJldHVybiBTY2FsYXJTdHVmZkFkZE1heWJlSTE2KGJ1aWxkZXIsIG1heWJlSTE2KQorZGVmIFNjYWxhclN0dWZmQWRkRGVmYXVsdEkxNihidWlsZGVyLCBkZWZhdWx0STE2KTogYnVpbGRlci5QcmVwZW5kSW50MTZTbG90KDgsIGRlZmF1bHRJMTYsIDQyKQorZGVmIEFkZERlZmF1bHRJMTYoYnVpbGRlciwgZGVmYXVsdEkxNik6CisgICAgcmV0dXJuIFNjYWxhclN0dWZmQWRkRGVmYXVsdEkxNihidWlsZGVyLCBkZWZhdWx0STE2KQorZGVmIFNjYWxhclN0dWZmQWRkSnVzdFUxNihidWlsZGVyLCBqdXN0VTE2KTogYnVpbGRlci5QcmVwZW5kVWludDE2U2xvdCg5LCBqdXN0VTE2LCAwKQorZGVmIEFkZEp1c3RVMTYoYnVpbGRlciwganVzdFUxNik6CisgICAgcmV0dXJuIFNjYWxhclN0dWZmQWRkSnVzdFUxNihidWlsZGVyLCBqdXN0VTE2KQorZGVmIFNjYWxhclN0dWZmQWRkTWF5YmVVMTYoYnVpbGRlciwgbWF5YmVVMTYpOiBidWlsZGVyLlByZXBlbmRVaW50MTZTbG90KDEwLCBtYXliZVUxNiwgTm9uZSkKK2RlZiBBZGRNYXliZVUxNihidWlsZGVyLCBtYXliZVUxNik6CisgICAgcmV0dXJuIFNjYWxhclN0dWZmQWRkTWF5YmVVMTYoYnVpbGRlciwgbWF5YmVVMTYpCitkZWYgU2NhbGFyU3R1ZmZBZGREZWZhdWx0VTE2KGJ1aWxkZXIsIGRlZmF1bHRVMTYpOiBidWlsZGVyLlByZXBlbmRVaW50MTZTbG90KDExLCBkZWZhdWx0VTE2LCA0MikKK2RlZiBBZGREZWZhdWx0VTE2KGJ1aWxkZXIsIGRlZmF1bHRVMTYpOgorICAgIHJldHVybiBTY2FsYXJTdHVmZkFkZERlZmF1bHRVMTYoYnVpbGRlciwgZGVmYXVsdFUxNikKK2RlZiBTY2FsYXJTdHVmZkFkZEp1c3RJMzIoYnVpbGRlciwganVzdEkzMik6IGJ1aWxkZXIuUHJlcGVuZEludDMyU2xvdCgxMiwganVzdEkzMiwgMCkKK2RlZiBBZGRKdXN0STMyKGJ1aWxkZXIsIGp1c3RJMzIpOgorICAgIHJldHVybiBTY2FsYXJTdHVmZkFkZEp1c3RJMzIoYnVpbGRlciwganVzdEkzMikKK2RlZiBTY2FsYXJTdHVmZkFkZE1heWJlSTMyKGJ1aWxkZXIsIG1heWJlSTMyKTogYnVpbGRlci5QcmVwZW5kSW50MzJTbG90KDEzLCBtYXliZUkzMiwgTm9uZSkKK2RlZiBBZGRNYXliZUkzMihidWlsZGVyLCBtYXliZUkzMik6CisgICAgcmV0dXJuIFNjYWxhclN0dWZmQWRkTWF5YmVJMzIoYnVpbGRlciwgbWF5YmVJMzIpCitkZWYgU2NhbGFyU3R1ZmZBZGREZWZhdWx0STMyKGJ1aWxkZXIsIGRlZmF1bHRJMzIpOiBidWlsZGVyLlByZXBlbmRJbnQzMlNsb3QoMTQsIGRlZmF1bHRJMzIsIDQyKQorZGVmIEFkZERlZmF1bHRJMzIoYnVpbGRlciwgZGVmYXVsdEkzMik6CisgICAgcmV0dXJuIFNjYWxhclN0dWZmQWRkRGVmYXVsdEkzMihidWlsZGVyLCBkZWZhdWx0STMyKQorZGVmIFNjYWxhclN0dWZmQWRkSnVzdFUzMihidWlsZGVyLCBqdXN0VTMyKTogYnVpbGRlci5QcmVwZW5kVWludDMyU2xvdCgxNSwganVzdFUzMiwgMCkKK2RlZiBBZGRKdXN0VTMyKGJ1aWxkZXIsIGp1c3RVMzIpOgorICAgIHJldHVybiBTY2FsYXJTdHVmZkFkZEp1c3RVMzIoYnVpbGRlciwganVzdFUzMikKK2RlZiBTY2FsYXJTdHVmZkFkZE1heWJlVTMyKGJ1aWxkZXIsIG1heWJlVTMyKTogYnVpbGRlci5QcmVwZW5kVWludDMyU2xvdCgxNiwgbWF5YmVVMzIsIE5vbmUpCitkZWYgQWRkTWF5YmVVMzIoYnVpbGRlciwgbWF5YmVVMzIpOgorICAgIHJldHVybiBTY2FsYXJTdHVmZkFkZE1heWJlVTMyKGJ1aWxkZXIsIG1heWJlVTMyKQorZGVmIFNjYWxhclN0dWZmQWRkRGVmYXVsdFUzMihidWlsZGVyLCBkZWZhdWx0VTMyKTogYnVpbGRlci5QcmVwZW5kVWludDMyU2xvdCgxNywgZGVmYXVsdFUzMiwgNDIpCitkZWYgQWRkRGVmYXVsdFUzMihidWlsZGVyLCBkZWZhdWx0VTMyKToKKyAgICByZXR1cm4gU2NhbGFyU3R1ZmZBZGREZWZhdWx0VTMyKGJ1aWxkZXIsIGRlZmF1bHRVMzIpCitkZWYgU2NhbGFyU3R1ZmZBZGRKdXN0STY0KGJ1aWxkZXIsIGp1c3RJNjQpOiBidWlsZGVyLlByZXBlbmRJbnQ2NFNsb3QoMTgsIGp1c3RJNjQsIDApCitkZWYgQWRkSnVzdEk2NChidWlsZGVyLCBqdXN0STY0KToKKyAgICByZXR1cm4gU2NhbGFyU3R1ZmZBZGRKdXN0STY0KGJ1aWxkZXIsIGp1c3RJNjQpCitkZWYgU2NhbGFyU3R1ZmZBZGRNYXliZUk2NChidWlsZGVyLCBtYXliZUk2NCk6IGJ1aWxkZXIuUHJlcGVuZEludDY0U2xvdCgxOSwgbWF5YmVJNjQsIE5vbmUpCitkZWYgQWRkTWF5YmVJNjQoYnVpbGRlciwgbWF5YmVJNjQpOgorICAgIHJldHVybiBTY2FsYXJTdHVmZkFkZE1heWJlSTY0KGJ1aWxkZXIsIG1heWJlSTY0KQorZGVmIFNjYWxhclN0dWZmQWRkRGVmYXVsdEk2NChidWlsZGVyLCBkZWZhdWx0STY0KTogYnVpbGRlci5QcmVwZW5kSW50NjRTbG90KDIwLCBkZWZhdWx0STY0LCA0MikKK2RlZiBBZGREZWZhdWx0STY0KGJ1aWxkZXIsIGRlZmF1bHRJNjQpOgorICAgIHJldHVybiBTY2FsYXJTdHVmZkFkZERlZmF1bHRJNjQoYnVpbGRlciwgZGVmYXVsdEk2NCkKK2RlZiBTY2FsYXJTdHVmZkFkZEp1c3RVNjQoYnVpbGRlciwganVzdFU2NCk6IGJ1aWxkZXIuUHJlcGVuZFVpbnQ2NFNsb3QoMjEsIGp1c3RVNjQsIDApCitkZWYgQWRkSnVzdFU2NChidWlsZGVyLCBqdXN0VTY0KToKKyAgICByZXR1cm4gU2NhbGFyU3R1ZmZBZGRKdXN0VTY0KGJ1aWxkZXIsIGp1c3RVNjQpCitkZWYgU2NhbGFyU3R1ZmZBZGRNYXliZVU2NChidWlsZGVyLCBtYXliZVU2NCk6IGJ1aWxkZXIuUHJlcGVuZFVpbnQ2NFNsb3QoMjIsIG1heWJlVTY0LCBOb25lKQorZGVmIEFkZE1heWJlVTY0KGJ1aWxkZXIsIG1heWJlVTY0KToKKyAgICByZXR1cm4gU2NhbGFyU3R1ZmZBZGRNYXliZVU2NChidWlsZGVyLCBtYXliZVU2NCkKK2RlZiBTY2FsYXJTdHVmZkFkZERlZmF1bHRVNjQoYnVpbGRlciwgZGVmYXVsdFU2NCk6IGJ1aWxkZXIuUHJlcGVuZFVpbnQ2NFNsb3QoMjMsIGRlZmF1bHRVNjQsIDQyKQorZGVmIEFkZERlZmF1bHRVNjQoYnVpbGRlciwgZGVmYXVsdFU2NCk6CisgICAgcmV0dXJuIFNjYWxhclN0dWZmQWRkRGVmYXVsdFU2NChidWlsZGVyLCBkZWZhdWx0VTY0KQorZGVmIFNjYWxhclN0dWZmQWRkSnVzdEYzMihidWlsZGVyLCBqdXN0RjMyKTogYnVpbGRlci5QcmVwZW5kRmxvYXQzMlNsb3QoMjQsIGp1c3RGMzIsIDAuMCkKK2RlZiBBZGRKdXN0RjMyKGJ1aWxkZXIsIGp1c3RGMzIpOgorICAgIHJldHVybiBTY2FsYXJTdHVmZkFkZEp1c3RGMzIoYnVpbGRlciwganVzdEYzMikKK2RlZiBTY2FsYXJTdHVmZkFkZE1heWJlRjMyKGJ1aWxkZXIsIG1heWJlRjMyKTogYnVpbGRlci5QcmVwZW5kRmxvYXQzMlNsb3QoMjUsIG1heWJlRjMyLCBOb25lKQorZGVmIEFkZE1heWJlRjMyKGJ1aWxkZXIsIG1heWJlRjMyKToKKyAgICByZXR1cm4gU2NhbGFyU3R1ZmZBZGRNYXliZUYzMihidWlsZGVyLCBtYXliZUYzMikKK2RlZiBTY2FsYXJTdHVmZkFkZERlZmF1bHRGMzIoYnVpbGRlciwgZGVmYXVsdEYzMik6IGJ1aWxkZXIuUHJlcGVuZEZsb2F0MzJTbG90KDI2LCBkZWZhdWx0RjMyLCA0Mi4wKQorZGVmIEFkZERlZmF1bHRGMzIoYnVpbGRlciwgZGVmYXVsdEYzMik6CisgICAgcmV0dXJuIFNjYWxhclN0dWZmQWRkRGVmYXVsdEYzMihidWlsZGVyLCBkZWZhdWx0RjMyKQorZGVmIFNjYWxhclN0dWZmQWRkSnVzdEY2NChidWlsZGVyLCBqdXN0RjY0KTogYnVpbGRlci5QcmVwZW5kRmxvYXQ2NFNsb3QoMjcsIGp1c3RGNjQsIDAuMCkKK2RlZiBBZGRKdXN0RjY0KGJ1aWxkZXIsIGp1c3RGNjQpOgorICAgIHJldHVybiBTY2FsYXJTdHVmZkFkZEp1c3RGNjQoYnVpbGRlciwganVzdEY2NCkKK2RlZiBTY2FsYXJTdHVmZkFkZE1heWJlRjY0KGJ1aWxkZXIsIG1heWJlRjY0KTogYnVpbGRlci5QcmVwZW5kRmxvYXQ2NFNsb3QoMjgsIG1heWJlRjY0LCBOb25lKQorZGVmIEFkZE1heWJlRjY0KGJ1aWxkZXIsIG1heWJlRjY0KToKKyAgICByZXR1cm4gU2NhbGFyU3R1ZmZBZGRNYXliZUY2NChidWlsZGVyLCBtYXliZUY2NCkKK2RlZiBTY2FsYXJTdHVmZkFkZERlZmF1bHRGNjQoYnVpbGRlciwgZGVmYXVsdEY2NCk6IGJ1aWxkZXIuUHJlcGVuZEZsb2F0NjRTbG90KDI5LCBkZWZhdWx0RjY0LCA0Mi4wKQorZGVmIEFkZERlZmF1bHRGNjQoYnVpbGRlciwgZGVmYXVsdEY2NCk6CisgICAgcmV0dXJuIFNjYWxhclN0dWZmQWRkRGVmYXVsdEY2NChidWlsZGVyLCBkZWZhdWx0RjY0KQorZGVmIFNjYWxhclN0dWZmQWRkSnVzdEJvb2woYnVpbGRlciwganVzdEJvb2wpOiBidWlsZGVyLlByZXBlbmRCb29sU2xvdCgzMCwganVzdEJvb2wsIDApCitkZWYgQWRkSnVzdEJvb2woYnVpbGRlciwganVzdEJvb2wpOgorICAgIHJldHVybiBTY2FsYXJTdHVmZkFkZEp1c3RCb29sKGJ1aWxkZXIsIGp1c3RCb29sKQorZGVmIFNjYWxhclN0dWZmQWRkTWF5YmVCb29sKGJ1aWxkZXIsIG1heWJlQm9vbCk6IGJ1aWxkZXIuUHJlcGVuZEJvb2xTbG90KDMxLCBtYXliZUJvb2wsIE5vbmUpCitkZWYgQWRkTWF5YmVCb29sKGJ1aWxkZXIsIG1heWJlQm9vbCk6CisgICAgcmV0dXJuIFNjYWxhclN0dWZmQWRkTWF5YmVCb29sKGJ1aWxkZXIsIG1heWJlQm9vbCkKK2RlZiBTY2FsYXJTdHVmZkFkZERlZmF1bHRCb29sKGJ1aWxkZXIsIGRlZmF1bHRCb29sKTogYnVpbGRlci5QcmVwZW5kQm9vbFNsb3QoMzIsIGRlZmF1bHRCb29sLCAxKQorZGVmIEFkZERlZmF1bHRCb29sKGJ1aWxkZXIsIGRlZmF1bHRCb29sKToKKyAgICByZXR1cm4gU2NhbGFyU3R1ZmZBZGREZWZhdWx0Qm9vbChidWlsZGVyLCBkZWZhdWx0Qm9vbCkKK2RlZiBTY2FsYXJTdHVmZkFkZEp1c3RFbnVtKGJ1aWxkZXIsIGp1c3RFbnVtKTogYnVpbGRlci5QcmVwZW5kSW50OFNsb3QoMzMsIGp1c3RFbnVtLCAwKQorZGVmIEFkZEp1c3RFbnVtKGJ1aWxkZXIsIGp1c3RFbnVtKToKKyAgICByZXR1cm4gU2NhbGFyU3R1ZmZBZGRKdXN0RW51bShidWlsZGVyLCBqdXN0RW51bSkKK2RlZiBTY2FsYXJTdHVmZkFkZE1heWJlRW51bShidWlsZGVyLCBtYXliZUVudW0pOiBidWlsZGVyLlByZXBlbmRJbnQ4U2xvdCgzNCwgbWF5YmVFbnVtLCBOb25lKQorZGVmIEFkZE1heWJlRW51bShidWlsZGVyLCBtYXliZUVudW0pOgorICAgIHJldHVybiBTY2FsYXJTdHVmZkFkZE1heWJlRW51bShidWlsZGVyLCBtYXliZUVudW0pCitkZWYgU2NhbGFyU3R1ZmZBZGREZWZhdWx0RW51bShidWlsZGVyLCBkZWZhdWx0RW51bSk6IGJ1aWxkZXIuUHJlcGVuZEludDhTbG90KDM1LCBkZWZhdWx0RW51bSwgMSkKK2RlZiBBZGREZWZhdWx0RW51bShidWlsZGVyLCBkZWZhdWx0RW51bSk6CisgICAgcmV0dXJuIFNjYWxhclN0dWZmQWRkRGVmYXVsdEVudW0oYnVpbGRlciwgZGVmYXVsdEVudW0pCitkZWYgU2NhbGFyU3R1ZmZFbmQoYnVpbGRlcik6IHJldHVybiBidWlsZGVyLkVuZE9iamVjdCgpCitkZWYgRW5kKGJ1aWxkZXIpOgorICAgIHJldHVybiBTY2FsYXJTdHVmZkVuZChidWlsZGVyKQorCitjbGFzcyBTY2FsYXJTdHVmZlQob2JqZWN0KToKKworICAgICMgU2NhbGFyU3R1ZmZUCisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICBzZWxmLmp1c3RJOCA9IDAgICMgdHlwZTogaW50CisgICAgICAgIHNlbGYubWF5YmVJOCA9IE5vbmUgICMgdHlwZTogT3B0aW9uYWxbaW50XQorICAgICAgICBzZWxmLmRlZmF1bHRJOCA9IDQyICAjIHR5cGU6IGludAorICAgICAgICBzZWxmLmp1c3RVOCA9IDAgICMgdHlwZTogaW50CisgICAgICAgIHNlbGYubWF5YmVVOCA9IE5vbmUgICMgdHlwZTogT3B0aW9uYWxbaW50XQorICAgICAgICBzZWxmLmRlZmF1bHRVOCA9IDQyICAjIHR5cGU6IGludAorICAgICAgICBzZWxmLmp1c3RJMTYgPSAwICAjIHR5cGU6IGludAorICAgICAgICBzZWxmLm1heWJlSTE2ID0gTm9uZSAgIyB0eXBlOiBPcHRpb25hbFtpbnRdCisgICAgICAgIHNlbGYuZGVmYXVsdEkxNiA9IDQyICAjIHR5cGU6IGludAorICAgICAgICBzZWxmLmp1c3RVMTYgPSAwICAjIHR5cGU6IGludAorICAgICAgICBzZWxmLm1heWJlVTE2ID0gTm9uZSAgIyB0eXBlOiBPcHRpb25hbFtpbnRdCisgICAgICAgIHNlbGYuZGVmYXVsdFUxNiA9IDQyICAjIHR5cGU6IGludAorICAgICAgICBzZWxmLmp1c3RJMzIgPSAwICAjIHR5cGU6IGludAorICAgICAgICBzZWxmLm1heWJlSTMyID0gTm9uZSAgIyB0eXBlOiBPcHRpb25hbFtpbnRdCisgICAgICAgIHNlbGYuZGVmYXVsdEkzMiA9IDQyICAjIHR5cGU6IGludAorICAgICAgICBzZWxmLmp1c3RVMzIgPSAwICAjIHR5cGU6IGludAorICAgICAgICBzZWxmLm1heWJlVTMyID0gTm9uZSAgIyB0eXBlOiBPcHRpb25hbFtpbnRdCisgICAgICAgIHNlbGYuZGVmYXVsdFUzMiA9IDQyICAjIHR5cGU6IGludAorICAgICAgICBzZWxmLmp1c3RJNjQgPSAwICAjIHR5cGU6IGludAorICAgICAgICBzZWxmLm1heWJlSTY0ID0gTm9uZSAgIyB0eXBlOiBPcHRpb25hbFtpbnRdCisgICAgICAgIHNlbGYuZGVmYXVsdEk2NCA9IDQyICAjIHR5cGU6IGludAorICAgICAgICBzZWxmLmp1c3RVNjQgPSAwICAjIHR5cGU6IGludAorICAgICAgICBzZWxmLm1heWJlVTY0ID0gTm9uZSAgIyB0eXBlOiBPcHRpb25hbFtpbnRdCisgICAgICAgIHNlbGYuZGVmYXVsdFU2NCA9IDQyICAjIHR5cGU6IGludAorICAgICAgICBzZWxmLmp1c3RGMzIgPSAwLjAgICMgdHlwZTogZmxvYXQKKyAgICAgICAgc2VsZi5tYXliZUYzMiA9IE5vbmUgICMgdHlwZTogT3B0aW9uYWxbZmxvYXRdCisgICAgICAgIHNlbGYuZGVmYXVsdEYzMiA9IDQyLjAgICMgdHlwZTogZmxvYXQKKyAgICAgICAgc2VsZi5qdXN0RjY0ID0gMC4wICAjIHR5cGU6IGZsb2F0CisgICAgICAgIHNlbGYubWF5YmVGNjQgPSBOb25lICAjIHR5cGU6IE9wdGlvbmFsW2Zsb2F0XQorICAgICAgICBzZWxmLmRlZmF1bHRGNjQgPSA0Mi4wICAjIHR5cGU6IGZsb2F0CisgICAgICAgIHNlbGYuanVzdEJvb2wgPSBGYWxzZSAgIyB0eXBlOiBib29sCisgICAgICAgIHNlbGYubWF5YmVCb29sID0gTm9uZSAgIyB0eXBlOiBPcHRpb25hbFtib29sXQorICAgICAgICBzZWxmLmRlZmF1bHRCb29sID0gVHJ1ZSAgIyB0eXBlOiBib29sCisgICAgICAgIHNlbGYuanVzdEVudW0gPSAwICAjIHR5cGU6IGludAorICAgICAgICBzZWxmLm1heWJlRW51bSA9IE5vbmUgICMgdHlwZTogT3B0aW9uYWxbaW50XQorICAgICAgICBzZWxmLmRlZmF1bHRFbnVtID0gMSAgIyB0eXBlOiBpbnQKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBJbml0RnJvbUJ1ZihjbHMsIGJ1ZiwgcG9zKToKKyAgICAgICAgc2NhbGFyU3R1ZmYgPSBTY2FsYXJTdHVmZigpCisgICAgICAgIHNjYWxhclN0dWZmLkluaXQoYnVmLCBwb3MpCisgICAgICAgIHJldHVybiBjbHMuSW5pdEZyb21PYmooc2NhbGFyU3R1ZmYpCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgSW5pdEZyb21PYmooY2xzLCBzY2FsYXJTdHVmZik6CisgICAgICAgIHggPSBTY2FsYXJTdHVmZlQoKQorICAgICAgICB4Ll9VblBhY2soc2NhbGFyU3R1ZmYpCisgICAgICAgIHJldHVybiB4CisKKyAgICAjIFNjYWxhclN0dWZmVAorICAgIGRlZiBfVW5QYWNrKHNlbGYsIHNjYWxhclN0dWZmKToKKyAgICAgICAgaWYgc2NhbGFyU3R1ZmYgaXMgTm9uZToKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBzZWxmLmp1c3RJOCA9IHNjYWxhclN0dWZmLkp1c3RJOCgpCisgICAgICAgIHNlbGYubWF5YmVJOCA9IHNjYWxhclN0dWZmLk1heWJlSTgoKQorICAgICAgICBzZWxmLmRlZmF1bHRJOCA9IHNjYWxhclN0dWZmLkRlZmF1bHRJOCgpCisgICAgICAgIHNlbGYuanVzdFU4ID0gc2NhbGFyU3R1ZmYuSnVzdFU4KCkKKyAgICAgICAgc2VsZi5tYXliZVU4ID0gc2NhbGFyU3R1ZmYuTWF5YmVVOCgpCisgICAgICAgIHNlbGYuZGVmYXVsdFU4ID0gc2NhbGFyU3R1ZmYuRGVmYXVsdFU4KCkKKyAgICAgICAgc2VsZi5qdXN0STE2ID0gc2NhbGFyU3R1ZmYuSnVzdEkxNigpCisgICAgICAgIHNlbGYubWF5YmVJMTYgPSBzY2FsYXJTdHVmZi5NYXliZUkxNigpCisgICAgICAgIHNlbGYuZGVmYXVsdEkxNiA9IHNjYWxhclN0dWZmLkRlZmF1bHRJMTYoKQorICAgICAgICBzZWxmLmp1c3RVMTYgPSBzY2FsYXJTdHVmZi5KdXN0VTE2KCkKKyAgICAgICAgc2VsZi5tYXliZVUxNiA9IHNjYWxhclN0dWZmLk1heWJlVTE2KCkKKyAgICAgICAgc2VsZi5kZWZhdWx0VTE2ID0gc2NhbGFyU3R1ZmYuRGVmYXVsdFUxNigpCisgICAgICAgIHNlbGYuanVzdEkzMiA9IHNjYWxhclN0dWZmLkp1c3RJMzIoKQorICAgICAgICBzZWxmLm1heWJlSTMyID0gc2NhbGFyU3R1ZmYuTWF5YmVJMzIoKQorICAgICAgICBzZWxmLmRlZmF1bHRJMzIgPSBzY2FsYXJTdHVmZi5EZWZhdWx0STMyKCkKKyAgICAgICAgc2VsZi5qdXN0VTMyID0gc2NhbGFyU3R1ZmYuSnVzdFUzMigpCisgICAgICAgIHNlbGYubWF5YmVVMzIgPSBzY2FsYXJTdHVmZi5NYXliZVUzMigpCisgICAgICAgIHNlbGYuZGVmYXVsdFUzMiA9IHNjYWxhclN0dWZmLkRlZmF1bHRVMzIoKQorICAgICAgICBzZWxmLmp1c3RJNjQgPSBzY2FsYXJTdHVmZi5KdXN0STY0KCkKKyAgICAgICAgc2VsZi5tYXliZUk2NCA9IHNjYWxhclN0dWZmLk1heWJlSTY0KCkKKyAgICAgICAgc2VsZi5kZWZhdWx0STY0ID0gc2NhbGFyU3R1ZmYuRGVmYXVsdEk2NCgpCisgICAgICAgIHNlbGYuanVzdFU2NCA9IHNjYWxhclN0dWZmLkp1c3RVNjQoKQorICAgICAgICBzZWxmLm1heWJlVTY0ID0gc2NhbGFyU3R1ZmYuTWF5YmVVNjQoKQorICAgICAgICBzZWxmLmRlZmF1bHRVNjQgPSBzY2FsYXJTdHVmZi5EZWZhdWx0VTY0KCkKKyAgICAgICAgc2VsZi5qdXN0RjMyID0gc2NhbGFyU3R1ZmYuSnVzdEYzMigpCisgICAgICAgIHNlbGYubWF5YmVGMzIgPSBzY2FsYXJTdHVmZi5NYXliZUYzMigpCisgICAgICAgIHNlbGYuZGVmYXVsdEYzMiA9IHNjYWxhclN0dWZmLkRlZmF1bHRGMzIoKQorICAgICAgICBzZWxmLmp1c3RGNjQgPSBzY2FsYXJTdHVmZi5KdXN0RjY0KCkKKyAgICAgICAgc2VsZi5tYXliZUY2NCA9IHNjYWxhclN0dWZmLk1heWJlRjY0KCkKKyAgICAgICAgc2VsZi5kZWZhdWx0RjY0ID0gc2NhbGFyU3R1ZmYuRGVmYXVsdEY2NCgpCisgICAgICAgIHNlbGYuanVzdEJvb2wgPSBzY2FsYXJTdHVmZi5KdXN0Qm9vbCgpCisgICAgICAgIHNlbGYubWF5YmVCb29sID0gc2NhbGFyU3R1ZmYuTWF5YmVCb29sKCkKKyAgICAgICAgc2VsZi5kZWZhdWx0Qm9vbCA9IHNjYWxhclN0dWZmLkRlZmF1bHRCb29sKCkKKyAgICAgICAgc2VsZi5qdXN0RW51bSA9IHNjYWxhclN0dWZmLkp1c3RFbnVtKCkKKyAgICAgICAgc2VsZi5tYXliZUVudW0gPSBzY2FsYXJTdHVmZi5NYXliZUVudW0oKQorICAgICAgICBzZWxmLmRlZmF1bHRFbnVtID0gc2NhbGFyU3R1ZmYuRGVmYXVsdEVudW0oKQorCisgICAgIyBTY2FsYXJTdHVmZlQKKyAgICBkZWYgUGFjayhzZWxmLCBidWlsZGVyKToKKyAgICAgICAgU2NhbGFyU3R1ZmZTdGFydChidWlsZGVyKQorICAgICAgICBTY2FsYXJTdHVmZkFkZEp1c3RJOChidWlsZGVyLCBzZWxmLmp1c3RJOCkKKyAgICAgICAgU2NhbGFyU3R1ZmZBZGRNYXliZUk4KGJ1aWxkZXIsIHNlbGYubWF5YmVJOCkKKyAgICAgICAgU2NhbGFyU3R1ZmZBZGREZWZhdWx0STgoYnVpbGRlciwgc2VsZi5kZWZhdWx0STgpCisgICAgICAgIFNjYWxhclN0dWZmQWRkSnVzdFU4KGJ1aWxkZXIsIHNlbGYuanVzdFU4KQorICAgICAgICBTY2FsYXJTdHVmZkFkZE1heWJlVTgoYnVpbGRlciwgc2VsZi5tYXliZVU4KQorICAgICAgICBTY2FsYXJTdHVmZkFkZERlZmF1bHRVOChidWlsZGVyLCBzZWxmLmRlZmF1bHRVOCkKKyAgICAgICAgU2NhbGFyU3R1ZmZBZGRKdXN0STE2KGJ1aWxkZXIsIHNlbGYuanVzdEkxNikKKyAgICAgICAgU2NhbGFyU3R1ZmZBZGRNYXliZUkxNihidWlsZGVyLCBzZWxmLm1heWJlSTE2KQorICAgICAgICBTY2FsYXJTdHVmZkFkZERlZmF1bHRJMTYoYnVpbGRlciwgc2VsZi5kZWZhdWx0STE2KQorICAgICAgICBTY2FsYXJTdHVmZkFkZEp1c3RVMTYoYnVpbGRlciwgc2VsZi5qdXN0VTE2KQorICAgICAgICBTY2FsYXJTdHVmZkFkZE1heWJlVTE2KGJ1aWxkZXIsIHNlbGYubWF5YmVVMTYpCisgICAgICAgIFNjYWxhclN0dWZmQWRkRGVmYXVsdFUxNihidWlsZGVyLCBzZWxmLmRlZmF1bHRVMTYpCisgICAgICAgIFNjYWxhclN0dWZmQWRkSnVzdEkzMihidWlsZGVyLCBzZWxmLmp1c3RJMzIpCisgICAgICAgIFNjYWxhclN0dWZmQWRkTWF5YmVJMzIoYnVpbGRlciwgc2VsZi5tYXliZUkzMikKKyAgICAgICAgU2NhbGFyU3R1ZmZBZGREZWZhdWx0STMyKGJ1aWxkZXIsIHNlbGYuZGVmYXVsdEkzMikKKyAgICAgICAgU2NhbGFyU3R1ZmZBZGRKdXN0VTMyKGJ1aWxkZXIsIHNlbGYuanVzdFUzMikKKyAgICAgICAgU2NhbGFyU3R1ZmZBZGRNYXliZVUzMihidWlsZGVyLCBzZWxmLm1heWJlVTMyKQorICAgICAgICBTY2FsYXJTdHVmZkFkZERlZmF1bHRVMzIoYnVpbGRlciwgc2VsZi5kZWZhdWx0VTMyKQorICAgICAgICBTY2FsYXJTdHVmZkFkZEp1c3RJNjQoYnVpbGRlciwgc2VsZi5qdXN0STY0KQorICAgICAgICBTY2FsYXJTdHVmZkFkZE1heWJlSTY0KGJ1aWxkZXIsIHNlbGYubWF5YmVJNjQpCisgICAgICAgIFNjYWxhclN0dWZmQWRkRGVmYXVsdEk2NChidWlsZGVyLCBzZWxmLmRlZmF1bHRJNjQpCisgICAgICAgIFNjYWxhclN0dWZmQWRkSnVzdFU2NChidWlsZGVyLCBzZWxmLmp1c3RVNjQpCisgICAgICAgIFNjYWxhclN0dWZmQWRkTWF5YmVVNjQoYnVpbGRlciwgc2VsZi5tYXliZVU2NCkKKyAgICAgICAgU2NhbGFyU3R1ZmZBZGREZWZhdWx0VTY0KGJ1aWxkZXIsIHNlbGYuZGVmYXVsdFU2NCkKKyAgICAgICAgU2NhbGFyU3R1ZmZBZGRKdXN0RjMyKGJ1aWxkZXIsIHNlbGYuanVzdEYzMikKKyAgICAgICAgU2NhbGFyU3R1ZmZBZGRNYXliZUYzMihidWlsZGVyLCBzZWxmLm1heWJlRjMyKQorICAgICAgICBTY2FsYXJTdHVmZkFkZERlZmF1bHRGMzIoYnVpbGRlciwgc2VsZi5kZWZhdWx0RjMyKQorICAgICAgICBTY2FsYXJTdHVmZkFkZEp1c3RGNjQoYnVpbGRlciwgc2VsZi5qdXN0RjY0KQorICAgICAgICBTY2FsYXJTdHVmZkFkZE1heWJlRjY0KGJ1aWxkZXIsIHNlbGYubWF5YmVGNjQpCisgICAgICAgIFNjYWxhclN0dWZmQWRkRGVmYXVsdEY2NChidWlsZGVyLCBzZWxmLmRlZmF1bHRGNjQpCisgICAgICAgIFNjYWxhclN0dWZmQWRkSnVzdEJvb2woYnVpbGRlciwgc2VsZi5qdXN0Qm9vbCkKKyAgICAgICAgU2NhbGFyU3R1ZmZBZGRNYXliZUJvb2woYnVpbGRlciwgc2VsZi5tYXliZUJvb2wpCisgICAgICAgIFNjYWxhclN0dWZmQWRkRGVmYXVsdEJvb2woYnVpbGRlciwgc2VsZi5kZWZhdWx0Qm9vbCkKKyAgICAgICAgU2NhbGFyU3R1ZmZBZGRKdXN0RW51bShidWlsZGVyLCBzZWxmLmp1c3RFbnVtKQorICAgICAgICBTY2FsYXJTdHVmZkFkZE1heWJlRW51bShidWlsZGVyLCBzZWxmLm1heWJlRW51bSkKKyAgICAgICAgU2NhbGFyU3R1ZmZBZGREZWZhdWx0RW51bShidWlsZGVyLCBzZWxmLmRlZmF1bHRFbnVtKQorICAgICAgICBzY2FsYXJTdHVmZiA9IFNjYWxhclN0dWZmRW5kKGJ1aWxkZXIpCisgICAgICAgIHJldHVybiBzY2FsYXJTdHVmZgpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvb3B0aW9uYWxfc2NhbGFycy9fX2luaXRfXy5weSBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL29wdGlvbmFsX3NjYWxhcnMvX19pbml0X18ucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY5ZGUyOQotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL29wdGlvbmFsX3NjYWxhcnMvX19pbml0X18ucHkKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL29wdGlvbmFsX3NjYWxhcnMvbW9kLnJzIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvb3B0aW9uYWxfc2NhbGFycy9tb2QucnMKaW5kZXggYjdhZjNjNS4uODQyOTFlMyAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvb3B0aW9uYWxfc2NhbGFycy9tb2QucnMKKysrIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvb3B0aW9uYWxfc2NhbGFycy9tb2QucnMKQEAgLTEsNCArMSw1IEBACiAvLyBBdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBieSB0aGUgRmxhdGJ1ZmZlcnMgY29tcGlsZXIuIERvIG5vdCBtb2RpZnkuCisvLyBAZ2VuZXJhdGVkCiBwdWIgbW9kIG9wdGlvbmFsX3NjYWxhcnMgewogICB1c2Ugc3VwZXI6Oio7CiAgIG1vZCBvcHRpb25hbF9ieXRlX2dlbmVyYXRlZDsKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL29wdGlvbmFsX3NjYWxhcnMvb3B0aW9uYWxfc2NhbGFycy9vcHRpb25hbF9ieXRlX2dlbmVyYXRlZC5ycyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL29wdGlvbmFsX3NjYWxhcnMvb3B0aW9uYWxfc2NhbGFycy9vcHRpb25hbF9ieXRlX2dlbmVyYXRlZC5ycwppbmRleCAyMjZlOWVjLi5kYWUxMzY2IDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9vcHRpb25hbF9zY2FsYXJzL29wdGlvbmFsX3NjYWxhcnMvb3B0aW9uYWxfYnl0ZV9nZW5lcmF0ZWQucnMKKysrIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvb3B0aW9uYWxfc2NhbGFycy9vcHRpb25hbF9zY2FsYXJzL29wdGlvbmFsX2J5dGVfZ2VuZXJhdGVkLnJzCkBAIC0xLDcgKzEsMTIgQEAKIC8vIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGJ5IHRoZSBGbGF0QnVmZmVycyBjb21waWxlciwgZG8gbm90IG1vZGlmeQorLy8gQGdlbmVyYXRlZAorZXh0ZXJuIGNyYXRlIGFsbG9jOwogZXh0ZXJuIGNyYXRlIGZsYXRidWZmZXJzOwotdXNlIHN0ZDo6bWVtOwotdXNlIHN0ZDo6Y21wOjpPcmRlcmluZzsKK3VzZSBhbGxvYzo6Ym94ZWQ6OkJveDsKK3VzZSBhbGxvYzo6c3RyaW5nOjp7U3RyaW5nLCBUb1N0cmluZ307Cit1c2UgYWxsb2M6OnZlYzo6VmVjOwordXNlIGNvcmU6Om1lbTsKK3VzZSBjb3JlOjpjbXA6Ok9yZGVyaW5nOwogdXNlIHNlbGY6OmZsYXRidWZmZXJzOjp7RW5kaWFuU2NhbGFyLCBGb2xsb3d9OwogdXNlIHN1cGVyOjoqOwogI1tkZXByZWNhdGVkKHNpbmNlID0gIjIuMC4wIiwgbm90ZSA9ICJVc2UgYXNzb2NpYXRlZCBjb25zdGFudHMgaW5zdGVhZC4gVGhpcyB3aWxsIG5vIGxvbmdlciBiZSBnZW5lcmF0ZWQgaW4gMjAyMS4iKV0KQEAgLTQyLDggKzQ3LDggQEAKICAgICB9CiAgIH0KIH0KLWltcGwgc3RkOjpmbXQ6OkRlYnVnIGZvciBPcHRpb25hbEJ5dGUgewotICBmbiBmbXQoJnNlbGYsIGY6ICZtdXQgc3RkOjpmbXQ6OkZvcm1hdHRlcikgLT4gc3RkOjpmbXQ6OlJlc3VsdCB7CitpbXBsIGNvcmU6OmZtdDo6RGVidWcgZm9yIE9wdGlvbmFsQnl0ZSB7CisgIGZuIGZtdCgmc2VsZiwgZjogJm11dCBjb3JlOjpmbXQ6OkZvcm1hdHRlcikgLT4gY29yZTo6Zm10OjpSZXN1bHQgewogICAgIGlmIGxldCBTb21lKG5hbWUpID0gc2VsZi52YXJpYW50X25hbWUoKSB7CiAgICAgICBmLndyaXRlX3N0cihuYW1lKQogICAgIH0gZWxzZSB7CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9vcHRpb25hbF9zY2FsYXJzL29wdGlvbmFsX3NjYWxhcnMvc2NhbGFyX3N0dWZmX2dlbmVyYXRlZC5ycyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL29wdGlvbmFsX3NjYWxhcnMvb3B0aW9uYWxfc2NhbGFycy9zY2FsYXJfc3R1ZmZfZ2VuZXJhdGVkLnJzCmluZGV4IDQwN2UyNzguLmUyMDFjYzAgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL29wdGlvbmFsX3NjYWxhcnMvb3B0aW9uYWxfc2NhbGFycy9zY2FsYXJfc3R1ZmZfZ2VuZXJhdGVkLnJzCisrKyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL29wdGlvbmFsX3NjYWxhcnMvb3B0aW9uYWxfc2NhbGFycy9zY2FsYXJfc3R1ZmZfZ2VuZXJhdGVkLnJzCkBAIC0xLDcgKzEsMTIgQEAKIC8vIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGJ5IHRoZSBGbGF0QnVmZmVycyBjb21waWxlciwgZG8gbm90IG1vZGlmeQorLy8gQGdlbmVyYXRlZAorZXh0ZXJuIGNyYXRlIGFsbG9jOwogZXh0ZXJuIGNyYXRlIGZsYXRidWZmZXJzOwotdXNlIHN0ZDo6bWVtOwotdXNlIHN0ZDo6Y21wOjpPcmRlcmluZzsKK3VzZSBhbGxvYzo6Ym94ZWQ6OkJveDsKK3VzZSBhbGxvYzo6c3RyaW5nOjp7U3RyaW5nLCBUb1N0cmluZ307Cit1c2UgYWxsb2M6OnZlYzo6VmVjOwordXNlIGNvcmU6Om1lbTsKK3VzZSBjb3JlOjpjbXA6Ok9yZGVyaW5nOwogdXNlIHNlbGY6OmZsYXRidWZmZXJzOjp7RW5kaWFuU2NhbGFyLCBGb2xsb3d9OwogdXNlIHN1cGVyOjoqOwogcHViIGVudW0gU2NhbGFyU3R1ZmZPZmZzZXQge30KQEAgLTYyNiw4ICs2MzEsOCBAQAogICB9CiB9CiAKLWltcGwgc3RkOjpmbXQ6OkRlYnVnIGZvciBTY2FsYXJTdHVmZjwnXz4gewotICBmbiBmbXQoJnNlbGYsIGY6ICZtdXQgc3RkOjpmbXQ6OkZvcm1hdHRlcjwnXz4pIC0+IHN0ZDo6Zm10OjpSZXN1bHQgeworaW1wbCBjb3JlOjpmbXQ6OkRlYnVnIGZvciBTY2FsYXJTdHVmZjwnXz4geworICBmbiBmbXQoJnNlbGYsIGY6ICZtdXQgY29yZTo6Zm10OjpGb3JtYXR0ZXI8J18+KSAtPiBjb3JlOjpmbXQ6OlJlc3VsdCB7CiAgICAgbGV0IG11dCBkcyA9IGYuZGVidWdfc3RydWN0KCJTY2FsYXJTdHVmZiIpOwogICAgICAgZHMuZmllbGQoImp1c3RfaTgiLCAmc2VsZi5qdXN0X2k4KCkpOwogICAgICAgZHMuZmllbGQoIm1heWJlX2k4IiwgJnNlbGYubWF5YmVfaTgoKSk7CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9vcHRpb25hbF9zY2FsYXJzX2RlZmF1bHRzLmpzb24gYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9vcHRpb25hbF9zY2FsYXJzX2RlZmF1bHRzLmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWY0NDk5MwotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL29wdGlvbmFsX3NjYWxhcnNfZGVmYXVsdHMuanNvbgpAQCAtMCwwICsxLDM4IEBACit7CisgIGp1c3RfaTg6IDQsCisgIG1heWJlX2k4OiBudWxsLAorICBkZWZhdWx0X2k4OiA0MiwKKyAganVzdF91ODogMCwKKyAgbWF5YmVfdTg6IDAsCisgIGRlZmF1bHRfdTg6IDAsCisgIGp1c3RfaTE2OiA0LAorICBtYXliZV9pMTY6IG51bGwsCisgIGRlZmF1bHRfaTE2OiA0MiwKKyAganVzdF91MTY6IDAsCisgIG1heWJlX3UxNjogMCwKKyAgZGVmYXVsdF91MTY6IDAsCisgIGp1c3RfaTMyOiA0LAorICBtYXliZV9pMzI6IG51bGwsCisgIGRlZmF1bHRfaTMyOiA0MiwKKyAganVzdF91MzI6IDAsCisgIG1heWJlX3UzMjogMCwKKyAgZGVmYXVsdF91MzI6IDAsCisgIGp1c3RfaTY0OiA0LAorICBtYXliZV9pNjQ6IG51bGwsCisgIGRlZmF1bHRfaTY0OiA0MiwKKyAganVzdF91NjQ6IDAsCisgIG1heWJlX3U2NDogMCwKKyAgZGVmYXVsdF91NjQ6IDAsCisgIGp1c3RfZjMyOiA0LjAsCisgIG1heWJlX2YzMjogbnVsbCwKKyAgZGVmYXVsdF9mMzI6IDQyLjAsCisgIGp1c3RfZjY0OiAwLjAsCisgIG1heWJlX2Y2NDogMC4wLAorICBkZWZhdWx0X2Y2NDogMC4wLAorICBqdXN0X2Jvb2w6IHRydWUsCisgIG1heWJlX2Jvb2w6IG51bGwsCisgIGRlZmF1bHRfYm9vbDogZmFsc2UsCisgIGp1c3RfZW51bTogIk5vbmUiLAorICBtYXliZV9lbnVtOiAiT25lIiwKKyAgZGVmYXVsdF9lbnVtOiAiVHdvIgorfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvb3B0aW9uYWxfc2NhbGFyc19nZW5lcmF0ZWQuaCBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL29wdGlvbmFsX3NjYWxhcnNfZ2VuZXJhdGVkLmgKaW5kZXggYzI5NWViYS4uZjcxZjk4ZCAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvb3B0aW9uYWxfc2NhbGFyc19nZW5lcmF0ZWQuaAorKysgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9vcHRpb25hbF9zY2FsYXJzX2dlbmVyYXRlZC5oCkBAIC02LDYgKzYsMTMgQEAKIAogI2luY2x1ZGUgImZsYXRidWZmZXJzL2ZsYXRidWZmZXJzLmgiCiAKKy8vIEVuc3VyZSB0aGUgaW5jbHVkZWQgZmxhdGJ1ZmZlcnMuaCBpcyB0aGUgc2FtZSB2ZXJzaW9uIGFzIHdoZW4gdGhpcyBmaWxlIHdhcworLy8gZ2VuZXJhdGVkLCBvdGhlcndpc2UgaXQgbWF5IG5vdCBiZSBjb21wYXRpYmxlLgorc3RhdGljX2Fzc2VydChGTEFUQlVGRkVSU19WRVJTSU9OX01BSk9SID09IDIgJiYKKyAgICAgICAgICAgICAgRkxBVEJVRkZFUlNfVkVSU0lPTl9NSU5PUiA9PSAwICYmCisgICAgICAgICAgICAgIEZMQVRCVUZGRVJTX1ZFUlNJT05fUkVWSVNJT04gPT0gOCwKKyAgICAgICAgICAgICAiTm9uLWNvbXBhdGlibGUgZmxhdGJ1ZmZlcnMgdmVyc2lvbiBpbmNsdWRlZCIpOworCiBuYW1lc3BhY2Ugb3B0aW9uYWxfc2NhbGFycyB7CiAKIHN0cnVjdCBTY2FsYXJTdHVmZjsKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL29wdGlvbmFsX3NjYWxhcnNfZ2VuZXJhdGVkLmxvYnN0ZXIgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9vcHRpb25hbF9zY2FsYXJzX2dlbmVyYXRlZC5sb2JzdGVyCmluZGV4IDk1Y2JhOTUuLjE2ZDljNTYgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL29wdGlvbmFsX3NjYWxhcnNfZ2VuZXJhdGVkLmxvYnN0ZXIKKysrIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvb3B0aW9uYWxfc2NhbGFyc19nZW5lcmF0ZWQubG9ic3RlcgpAQCAtMTEsNzcgKzExLDc3IEBACiBjbGFzcyBTY2FsYXJTdHVmZgogCiBjbGFzcyBTY2FsYXJTdHVmZiA6IGZsYXRidWZmZXJzX2hhbmRsZQotICAgIGRlZiBqdXN0X2k4KCk6CisgICAgZGVmIGp1c3RfaTgoKSAtPiBpbnQ6CiAgICAgICAgIHJldHVybiBidWZfLmZsYXRidWZmZXJzX2ZpZWxkX2ludDgocG9zXywgNCwgMCkKLSAgICBkZWYgbWF5YmVfaTgoKToKKyAgICBkZWYgbWF5YmVfaTgoKSAtPiBpbnQsIGJvb2w6CiAgICAgICAgIHJldHVybiBidWZfLmZsYXRidWZmZXJzX2ZpZWxkX2ludDgocG9zXywgNiwgMCksIGJ1Zl8uZmxhdGJ1ZmZlcnNfZmllbGRfcHJlc2VudChwb3NfLCA2KQotICAgIGRlZiBkZWZhdWx0X2k4KCk6CisgICAgZGVmIGRlZmF1bHRfaTgoKSAtPiBpbnQ6CiAgICAgICAgIHJldHVybiBidWZfLmZsYXRidWZmZXJzX2ZpZWxkX2ludDgocG9zXywgOCwgNDIpCi0gICAgZGVmIGp1c3RfdTgoKToKKyAgICBkZWYganVzdF91OCgpIC0+IGludDoKICAgICAgICAgcmV0dXJuIGJ1Zl8uZmxhdGJ1ZmZlcnNfZmllbGRfdWludDgocG9zXywgMTAsIDApCi0gICAgZGVmIG1heWJlX3U4KCk6CisgICAgZGVmIG1heWJlX3U4KCkgLT4gaW50LCBib29sOgogICAgICAgICByZXR1cm4gYnVmXy5mbGF0YnVmZmVyc19maWVsZF91aW50OChwb3NfLCAxMiwgMCksIGJ1Zl8uZmxhdGJ1ZmZlcnNfZmllbGRfcHJlc2VudChwb3NfLCAxMikKLSAgICBkZWYgZGVmYXVsdF91OCgpOgorICAgIGRlZiBkZWZhdWx0X3U4KCkgLT4gaW50OgogICAgICAgICByZXR1cm4gYnVmXy5mbGF0YnVmZmVyc19maWVsZF91aW50OChwb3NfLCAxNCwgNDIpCi0gICAgZGVmIGp1c3RfaTE2KCk6CisgICAgZGVmIGp1c3RfaTE2KCkgLT4gaW50OgogICAgICAgICByZXR1cm4gYnVmXy5mbGF0YnVmZmVyc19maWVsZF9pbnQxNihwb3NfLCAxNiwgMCkKLSAgICBkZWYgbWF5YmVfaTE2KCk6CisgICAgZGVmIG1heWJlX2kxNigpIC0+IGludCwgYm9vbDoKICAgICAgICAgcmV0dXJuIGJ1Zl8uZmxhdGJ1ZmZlcnNfZmllbGRfaW50MTYocG9zXywgMTgsIDApLCBidWZfLmZsYXRidWZmZXJzX2ZpZWxkX3ByZXNlbnQocG9zXywgMTgpCi0gICAgZGVmIGRlZmF1bHRfaTE2KCk6CisgICAgZGVmIGRlZmF1bHRfaTE2KCkgLT4gaW50OgogICAgICAgICByZXR1cm4gYnVmXy5mbGF0YnVmZmVyc19maWVsZF9pbnQxNihwb3NfLCAyMCwgNDIpCi0gICAgZGVmIGp1c3RfdTE2KCk6CisgICAgZGVmIGp1c3RfdTE2KCkgLT4gaW50OgogICAgICAgICByZXR1cm4gYnVmXy5mbGF0YnVmZmVyc19maWVsZF91aW50MTYocG9zXywgMjIsIDApCi0gICAgZGVmIG1heWJlX3UxNigpOgorICAgIGRlZiBtYXliZV91MTYoKSAtPiBpbnQsIGJvb2w6CiAgICAgICAgIHJldHVybiBidWZfLmZsYXRidWZmZXJzX2ZpZWxkX3VpbnQxNihwb3NfLCAyNCwgMCksIGJ1Zl8uZmxhdGJ1ZmZlcnNfZmllbGRfcHJlc2VudChwb3NfLCAyNCkKLSAgICBkZWYgZGVmYXVsdF91MTYoKToKKyAgICBkZWYgZGVmYXVsdF91MTYoKSAtPiBpbnQ6CiAgICAgICAgIHJldHVybiBidWZfLmZsYXRidWZmZXJzX2ZpZWxkX3VpbnQxNihwb3NfLCAyNiwgNDIpCi0gICAgZGVmIGp1c3RfaTMyKCk6CisgICAgZGVmIGp1c3RfaTMyKCkgLT4gaW50OgogICAgICAgICByZXR1cm4gYnVmXy5mbGF0YnVmZmVyc19maWVsZF9pbnQzMihwb3NfLCAyOCwgMCkKLSAgICBkZWYgbWF5YmVfaTMyKCk6CisgICAgZGVmIG1heWJlX2kzMigpIC0+IGludCwgYm9vbDoKICAgICAgICAgcmV0dXJuIGJ1Zl8uZmxhdGJ1ZmZlcnNfZmllbGRfaW50MzIocG9zXywgMzAsIDApLCBidWZfLmZsYXRidWZmZXJzX2ZpZWxkX3ByZXNlbnQocG9zXywgMzApCi0gICAgZGVmIGRlZmF1bHRfaTMyKCk6CisgICAgZGVmIGRlZmF1bHRfaTMyKCkgLT4gaW50OgogICAgICAgICByZXR1cm4gYnVmXy5mbGF0YnVmZmVyc19maWVsZF9pbnQzMihwb3NfLCAzMiwgNDIpCi0gICAgZGVmIGp1c3RfdTMyKCk6CisgICAgZGVmIGp1c3RfdTMyKCkgLT4gaW50OgogICAgICAgICByZXR1cm4gYnVmXy5mbGF0YnVmZmVyc19maWVsZF91aW50MzIocG9zXywgMzQsIDApCi0gICAgZGVmIG1heWJlX3UzMigpOgorICAgIGRlZiBtYXliZV91MzIoKSAtPiBpbnQsIGJvb2w6CiAgICAgICAgIHJldHVybiBidWZfLmZsYXRidWZmZXJzX2ZpZWxkX3VpbnQzMihwb3NfLCAzNiwgMCksIGJ1Zl8uZmxhdGJ1ZmZlcnNfZmllbGRfcHJlc2VudChwb3NfLCAzNikKLSAgICBkZWYgZGVmYXVsdF91MzIoKToKKyAgICBkZWYgZGVmYXVsdF91MzIoKSAtPiBpbnQ6CiAgICAgICAgIHJldHVybiBidWZfLmZsYXRidWZmZXJzX2ZpZWxkX3VpbnQzMihwb3NfLCAzOCwgNDIpCi0gICAgZGVmIGp1c3RfaTY0KCk6CisgICAgZGVmIGp1c3RfaTY0KCkgLT4gaW50OgogICAgICAgICByZXR1cm4gYnVmXy5mbGF0YnVmZmVyc19maWVsZF9pbnQ2NChwb3NfLCA0MCwgMCkKLSAgICBkZWYgbWF5YmVfaTY0KCk6CisgICAgZGVmIG1heWJlX2k2NCgpIC0+IGludCwgYm9vbDoKICAgICAgICAgcmV0dXJuIGJ1Zl8uZmxhdGJ1ZmZlcnNfZmllbGRfaW50NjQocG9zXywgNDIsIDApLCBidWZfLmZsYXRidWZmZXJzX2ZpZWxkX3ByZXNlbnQocG9zXywgNDIpCi0gICAgZGVmIGRlZmF1bHRfaTY0KCk6CisgICAgZGVmIGRlZmF1bHRfaTY0KCkgLT4gaW50OgogICAgICAgICByZXR1cm4gYnVmXy5mbGF0YnVmZmVyc19maWVsZF9pbnQ2NChwb3NfLCA0NCwgNDIpCi0gICAgZGVmIGp1c3RfdTY0KCk6CisgICAgZGVmIGp1c3RfdTY0KCkgLT4gaW50OgogICAgICAgICByZXR1cm4gYnVmXy5mbGF0YnVmZmVyc19maWVsZF91aW50NjQocG9zXywgNDYsIDApCi0gICAgZGVmIG1heWJlX3U2NCgpOgorICAgIGRlZiBtYXliZV91NjQoKSAtPiBpbnQsIGJvb2w6CiAgICAgICAgIHJldHVybiBidWZfLmZsYXRidWZmZXJzX2ZpZWxkX3VpbnQ2NChwb3NfLCA0OCwgMCksIGJ1Zl8uZmxhdGJ1ZmZlcnNfZmllbGRfcHJlc2VudChwb3NfLCA0OCkKLSAgICBkZWYgZGVmYXVsdF91NjQoKToKKyAgICBkZWYgZGVmYXVsdF91NjQoKSAtPiBpbnQ6CiAgICAgICAgIHJldHVybiBidWZfLmZsYXRidWZmZXJzX2ZpZWxkX3VpbnQ2NChwb3NfLCA1MCwgNDIpCi0gICAgZGVmIGp1c3RfZjMyKCk6CisgICAgZGVmIGp1c3RfZjMyKCkgLT4gZmxvYXQ6CiAgICAgICAgIHJldHVybiBidWZfLmZsYXRidWZmZXJzX2ZpZWxkX2Zsb2F0MzIocG9zXywgNTIsIDAuMCkKLSAgICBkZWYgbWF5YmVfZjMyKCk6CisgICAgZGVmIG1heWJlX2YzMigpIC0+IGZsb2F0LCBib29sOgogICAgICAgICByZXR1cm4gYnVmXy5mbGF0YnVmZmVyc19maWVsZF9mbG9hdDMyKHBvc18sIDU0LCAwKSwgYnVmXy5mbGF0YnVmZmVyc19maWVsZF9wcmVzZW50KHBvc18sIDU0KQotICAgIGRlZiBkZWZhdWx0X2YzMigpOgorICAgIGRlZiBkZWZhdWx0X2YzMigpIC0+IGZsb2F0OgogICAgICAgICByZXR1cm4gYnVmXy5mbGF0YnVmZmVyc19maWVsZF9mbG9hdDMyKHBvc18sIDU2LCA0Mi4wKQotICAgIGRlZiBqdXN0X2Y2NCgpOgorICAgIGRlZiBqdXN0X2Y2NCgpIC0+IGZsb2F0OgogICAgICAgICByZXR1cm4gYnVmXy5mbGF0YnVmZmVyc19maWVsZF9mbG9hdDY0KHBvc18sIDU4LCAwLjApCi0gICAgZGVmIG1heWJlX2Y2NCgpOgorICAgIGRlZiBtYXliZV9mNjQoKSAtPiBmbG9hdCwgYm9vbDoKICAgICAgICAgcmV0dXJuIGJ1Zl8uZmxhdGJ1ZmZlcnNfZmllbGRfZmxvYXQ2NChwb3NfLCA2MCwgMCksIGJ1Zl8uZmxhdGJ1ZmZlcnNfZmllbGRfcHJlc2VudChwb3NfLCA2MCkKLSAgICBkZWYgZGVmYXVsdF9mNjQoKToKKyAgICBkZWYgZGVmYXVsdF9mNjQoKSAtPiBmbG9hdDoKICAgICAgICAgcmV0dXJuIGJ1Zl8uZmxhdGJ1ZmZlcnNfZmllbGRfZmxvYXQ2NChwb3NfLCA2MiwgNDIuMCkKLSAgICBkZWYganVzdF9ib29sKCk6Ci0gICAgICAgIHJldHVybiBidWZfLmZsYXRidWZmZXJzX2ZpZWxkX2ludDgocG9zXywgNjQsIDApCi0gICAgZGVmIG1heWJlX2Jvb2woKToKLSAgICAgICAgcmV0dXJuIGJ1Zl8uZmxhdGJ1ZmZlcnNfZmllbGRfaW50OChwb3NfLCA2NiwgMCksIGJ1Zl8uZmxhdGJ1ZmZlcnNfZmllbGRfcHJlc2VudChwb3NfLCA2NikKLSAgICBkZWYgZGVmYXVsdF9ib29sKCk6Ci0gICAgICAgIHJldHVybiBidWZfLmZsYXRidWZmZXJzX2ZpZWxkX2ludDgocG9zXywgNjgsIDEpCi0gICAgZGVmIGp1c3RfZW51bSgpOgorICAgIGRlZiBqdXN0X2Jvb2woKSAtPiBib29sOgorICAgICAgICByZXR1cm4gYm9vbChidWZfLmZsYXRidWZmZXJzX2ZpZWxkX2ludDgocG9zXywgNjQsIDApKQorICAgIGRlZiBtYXliZV9ib29sKCkgLT4gYm9vbCwgYm9vbDoKKyAgICAgICAgcmV0dXJuIGJvb2woYnVmXy5mbGF0YnVmZmVyc19maWVsZF9pbnQ4KHBvc18sIDY2LCAwKSksIGJ1Zl8uZmxhdGJ1ZmZlcnNfZmllbGRfcHJlc2VudChwb3NfLCA2NikKKyAgICBkZWYgZGVmYXVsdF9ib29sKCkgLT4gYm9vbDoKKyAgICAgICAgcmV0dXJuIGJvb2woYnVmXy5mbGF0YnVmZmVyc19maWVsZF9pbnQ4KHBvc18sIDY4LCAxKSkKKyAgICBkZWYganVzdF9lbnVtKCkgLT4gT3B0aW9uYWxCeXRlOgogICAgICAgICByZXR1cm4gT3B0aW9uYWxCeXRlKGJ1Zl8uZmxhdGJ1ZmZlcnNfZmllbGRfaW50OChwb3NfLCA3MCwgMCkpCi0gICAgZGVmIG1heWJlX2VudW0oKToKKyAgICBkZWYgbWF5YmVfZW51bSgpIC0+IE9wdGlvbmFsQnl0ZSwgYm9vbDoKICAgICAgICAgcmV0dXJuIE9wdGlvbmFsQnl0ZShidWZfLmZsYXRidWZmZXJzX2ZpZWxkX2ludDgocG9zXywgNzIsIDApKSwgYnVmXy5mbGF0YnVmZmVyc19maWVsZF9wcmVzZW50KHBvc18sIDcyKQotICAgIGRlZiBkZWZhdWx0X2VudW0oKToKKyAgICBkZWYgZGVmYXVsdF9lbnVtKCkgLT4gT3B0aW9uYWxCeXRlOgogICAgICAgICByZXR1cm4gT3B0aW9uYWxCeXRlKGJ1Zl8uZmxhdGJ1ZmZlcnNfZmllbGRfaW50OChwb3NfLCA3NCwgMSkpCiAKIGRlZiBHZXRSb290QXNTY2FsYXJTdHVmZihidWY6c3RyaW5nKTogcmV0dXJuIFNjYWxhclN0dWZmIHsgYnVmLCBidWYuZmxhdGJ1ZmZlcnNfaW5kaXJlY3QoMCkgfQpAQCAtMTgxLDEzICsxODEsMTMgQEAKICAgICBkZWYgYWRkX2RlZmF1bHRfZjY0KGRlZmF1bHRfZjY0OmZsb2F0KToKICAgICAgICAgYl8uUHJlcGVuZEZsb2F0NjRTbG90KDI5LCBkZWZhdWx0X2Y2NCwgNDIuMCkKICAgICAgICAgcmV0dXJuIHRoaXMKLSAgICBkZWYgYWRkX2p1c3RfYm9vbChqdXN0X2Jvb2w6aW50KToKKyAgICBkZWYgYWRkX2p1c3RfYm9vbChqdXN0X2Jvb2w6Ym9vbCk6CiAgICAgICAgIGJfLlByZXBlbmRCb29sU2xvdCgzMCwganVzdF9ib29sLCAwKQogICAgICAgICByZXR1cm4gdGhpcwotICAgIGRlZiBhZGRfbWF5YmVfYm9vbChtYXliZV9ib29sOmludCk6CisgICAgZGVmIGFkZF9tYXliZV9ib29sKG1heWJlX2Jvb2w6Ym9vbCk6CiAgICAgICAgIGJfLlByZXBlbmRCb29sU2xvdCgzMSwgbWF5YmVfYm9vbCkKICAgICAgICAgcmV0dXJuIHRoaXMKLSAgICBkZWYgYWRkX2RlZmF1bHRfYm9vbChkZWZhdWx0X2Jvb2w6aW50KToKKyAgICBkZWYgYWRkX2RlZmF1bHRfYm9vbChkZWZhdWx0X2Jvb2w6Ym9vbCk6CiAgICAgICAgIGJfLlByZXBlbmRCb29sU2xvdCgzMiwgZGVmYXVsdF9ib29sLCAxKQogICAgICAgICByZXR1cm4gdGhpcwogICAgIGRlZiBhZGRfanVzdF9lbnVtKGp1c3RfZW51bTpPcHRpb25hbEJ5dGUpOgpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvb3B0aW9uYWxfc2NhbGFyc19nZW5lcmF0ZWQudHMgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9vcHRpb25hbF9zY2FsYXJzX2dlbmVyYXRlZC50cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YTgzYzQzCi0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvb3B0aW9uYWxfc2NhbGFyc19nZW5lcmF0ZWQudHMKQEAgLTAsMCArMSw0IEBACisvLyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBieSB0aGUgRmxhdEJ1ZmZlcnMgY29tcGlsZXIsIGRvIG5vdCBtb2RpZnkKKworZXhwb3J0IHsgT3B0aW9uYWxCeXRlIH0gZnJvbSAnLi9vcHRpb25hbC1zY2FsYXJzL29wdGlvbmFsLWJ5dGUnOworZXhwb3J0IHsgU2NhbGFyU3R1ZmYgfSBmcm9tICcuL29wdGlvbmFsLXNjYWxhcnMvc2NhbGFyLXN0dWZmJzsKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL29wdGlvbmFsX3NjYWxhcnNfdGVzdC5jcHAgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9vcHRpb25hbF9zY2FsYXJzX3Rlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkNGE4N2QKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9vcHRpb25hbF9zY2FsYXJzX3Rlc3QuY3BwCkBAIC0wLDAgKzEsMTAxIEBACisjaW5jbHVkZSAib3B0aW9uYWxfc2NhbGFyc190ZXN0LmgiCisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlICJmbGF0YnVmZmVycy9pZGwuaCIKKyNpbmNsdWRlICJvcHRpb25hbF9zY2FsYXJzX2dlbmVyYXRlZC5oIgorI2luY2x1ZGUgInRlc3RfYXNzZXJ0LmgiCisKK25hbWVzcGFjZSBmbGF0YnVmZmVyc3sKKyAgbmFtZXNwYWNlIHRlc3RzeworCisKK3ZvaWQgT3B0aW9uYWxTY2FsYXJzVGVzdCgpIHsKKyAgLy8gU2ltcGxlIHNjaGVtYXMgYW5kIGEgImhhcyBvcHRpb25hbCBzY2FsYXIiIHNlbnRpbmFsLgorICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gc2NoZW1hczsKKyAgc2NoZW1hcy5wdXNoX2JhY2soInRhYmxlIE1vbnN0ZXIgeyBtYW5hIDogaW50OyB9Iik7CisgIHNjaGVtYXMucHVzaF9iYWNrKCJ0YWJsZSBNb25zdGVyIHsgbWFuYSA6IGludCA9IDQyOyB9Iik7CisgIHNjaGVtYXMucHVzaF9iYWNrKCJ0YWJsZSBNb25zdGVyIHsgbWFuYSA6IGludCA9ICBudWxsOyB9Iik7CisgIHNjaGVtYXMucHVzaF9iYWNrKCJ0YWJsZSBNb25zdGVyIHsgbWFuYSA6IGxvbmc7IH0iKTsKKyAgc2NoZW1hcy5wdXNoX2JhY2soInRhYmxlIE1vbnN0ZXIgeyBtYW5hIDogbG9uZyA9IDQyOyB9Iik7CisgIHNjaGVtYXMucHVzaF9iYWNrKCJ0YWJsZSBNb25zdGVyIHsgbWFuYSA6IGxvbmcgPSBudWxsOyB9Iik7CisgIHNjaGVtYXMucHVzaF9iYWNrKCJ0YWJsZSBNb25zdGVyIHsgbWFuYSA6IGZsb2F0OyB9Iik7CisgIHNjaGVtYXMucHVzaF9iYWNrKCJ0YWJsZSBNb25zdGVyIHsgbWFuYSA6IGZsb2F0ID0gNDI7IH0iKTsKKyAgc2NoZW1hcy5wdXNoX2JhY2soInRhYmxlIE1vbnN0ZXIgeyBtYW5hIDogZmxvYXQgPSBudWxsOyB9Iik7CisgIHNjaGVtYXMucHVzaF9iYWNrKCJ0YWJsZSBNb25zdGVyIHsgbWFuYSA6IGRvdWJsZTsgfSIpOworICBzY2hlbWFzLnB1c2hfYmFjaygidGFibGUgTW9uc3RlciB7IG1hbmEgOiBkb3VibGUgPSA0MjsgfSIpOworICBzY2hlbWFzLnB1c2hfYmFjaygidGFibGUgTW9uc3RlciB7IG1hbmEgOiBkb3VibGUgPSBudWxsOyB9Iik7CisgIHNjaGVtYXMucHVzaF9iYWNrKCJ0YWJsZSBNb25zdGVyIHsgbWFuYSA6IGJvb2w7IH0iKTsKKyAgc2NoZW1hcy5wdXNoX2JhY2soInRhYmxlIE1vbnN0ZXIgeyBtYW5hIDogYm9vbCA9IDQyOyB9Iik7CisgIHNjaGVtYXMucHVzaF9iYWNrKCJ0YWJsZSBNb25zdGVyIHsgbWFuYSA6IGJvb2wgPSBudWxsOyB9Iik7CisgIHNjaGVtYXMucHVzaF9iYWNrKAorICAgICAgImVudW0gRW51bTogaW50IHtBPTAsIEI9MX0gIgorICAgICAgInRhYmxlIE1vbnN0ZXIgeyBtYW5hIDogRW51bTsgfSIpOworICBzY2hlbWFzLnB1c2hfYmFjaygKKyAgICAgICJlbnVtIEVudW06IGludCB7QT0wLCBCPTF9ICIKKyAgICAgICJ0YWJsZSBNb25zdGVyIHsgbWFuYSA6IEVudW0gPSBCOyB9Iik7CisgIHNjaGVtYXMucHVzaF9iYWNrKAorICAgICAgImVudW0gRW51bTogaW50IHtBPTAsIEI9MX0gIgorICAgICAgInRhYmxlIE1vbnN0ZXIgeyBtYW5hIDogRW51bSA9IG51bGw7IH0iKTsKKworICAvLyBDaGVjayB0aGUgRmllbGREZWYgaXMgY29ycmVjdGx5IHNldC4KKyAgZm9yIChhdXRvIHNjaGVtYSA9IHNjaGVtYXMuYmVnaW4oKTsgc2NoZW1hIDwgc2NoZW1hcy5lbmQoKTsgc2NoZW1hKyspIHsKKyAgICBjb25zdCBib29sIGhhc19udWxsID0gc2NoZW1hLT5maW5kKCJudWxsIikgIT0gc3RkOjpzdHJpbmc6Om5wb3M7CisgICAgZmxhdGJ1ZmZlcnM6OlBhcnNlciBwYXJzZXI7CisgICAgVEVTVF9BU1NFUlQocGFyc2VyLlBhcnNlKHNjaGVtYS0+Y19zdHIoKSkpOworICAgIGNvbnN0IGF1dG8gKm1hbmEgPSBwYXJzZXIuc3RydWN0c18uTG9va3VwKCJNb25zdGVyIiktPmZpZWxkcy5Mb29rdXAoIm1hbmEiKTsKKyAgICBURVNUX0VRKG1hbmEtPklzT3B0aW9uYWwoKSwgaGFzX251bGwpOworICB9CisKKyAgLy8gVGVzdCBpZiBudWxsYWJsZSBzY2FsYXJzIGFyZSBhbGxvd2VkIGZvciBlYWNoIGxhbmd1YWdlLgorICBmb3IgKHVuc2lnbmVkIGxhbmcgPSAxOyBsYW5nIDwgZmxhdGJ1ZmZlcnM6OklETE9wdGlvbnM6OmtNQVg7IGxhbmcgPDw9IDEpIHsKKyAgICBmbGF0YnVmZmVyczo6SURMT3B0aW9ucyBvcHRzOworICAgIG9wdHMubGFuZ190b19nZW5lcmF0ZSA9IGxhbmc7CisgICAgaWYgKGZhbHNlID09IGZsYXRidWZmZXJzOjpQYXJzZXI6OlN1cHBvcnRzT3B0aW9uYWxTY2FsYXJzKG9wdHMpKSB7CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgZm9yIChhdXRvIHNjaGVtYSA9IHNjaGVtYXMuYmVnaW4oKTsgc2NoZW1hIDwgc2NoZW1hcy5lbmQoKTsgc2NoZW1hKyspIHsKKyAgICAgIGZsYXRidWZmZXJzOjpQYXJzZXIgcGFyc2VyKG9wdHMpOworICAgICAgYXV0byBkb25lID0gcGFyc2VyLlBhcnNlKHNjaGVtYS0+Y19zdHIoKSk7CisgICAgICBURVNUX0VRX1NUUihwYXJzZXIuZXJyb3JfLmNfc3RyKCksICIiKTsKKyAgICAgIFRFU1RfQVNTRVJUKGRvbmUpOworICAgIH0KKyAgfQorCisgIC8vIHRlc3QgQysrIG51bGxhYmxlCisgIGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciBmYmI7CisgIEZpbmlzaFNjYWxhclN0dWZmQnVmZmVyKAorICAgICAgZmJiLCBvcHRpb25hbF9zY2FsYXJzOjpDcmVhdGVTY2FsYXJTdHVmZihmYmIsIDEsIHN0YXRpY19jYXN0PGludDhfdD4oMikpKTsKKyAgYXV0byBvcHRzID0gb3B0aW9uYWxfc2NhbGFyczo6R2V0TXV0YWJsZVNjYWxhclN0dWZmKGZiYi5HZXRCdWZmZXJQb2ludGVyKCkpOworICBURVNUX0FTU0VSVCghb3B0cy0+bWF5YmVfYm9vbCgpKTsKKyAgVEVTVF9BU1NFUlQoIW9wdHMtPm1heWJlX2YzMigpLmhhc192YWx1ZSgpKTsKKyAgVEVTVF9BU1NFUlQob3B0cy0+bWF5YmVfaTgoKS5oYXNfdmFsdWUoKSk7CisgIFRFU1RfRVEob3B0cy0+bWF5YmVfaTgoKS52YWx1ZSgpLCAyKTsKKyAgVEVTVF9BU1NFUlQob3B0cy0+bXV0YXRlX21heWJlX2k4KDMpKTsKKyAgVEVTVF9BU1NFUlQob3B0cy0+bWF5YmVfaTgoKS5oYXNfdmFsdWUoKSk7CisgIFRFU1RfRVEob3B0cy0+bWF5YmVfaTgoKS52YWx1ZSgpLCAzKTsKKyAgVEVTVF9BU1NFUlQoIW9wdHMtPm11dGF0ZV9tYXliZV9pMTYoLTEwKSk7CisKKyAgb3B0aW9uYWxfc2NhbGFyczo6U2NhbGFyU3R1ZmZUIG9iajsKKyAgVEVTVF9BU1NFUlQoIW9iai5tYXliZV9ib29sKTsKKyAgVEVTVF9BU1NFUlQoIW9iai5tYXliZV9mMzIuaGFzX3ZhbHVlKCkpOworICBvcHRzLT5VblBhY2tUbygmb2JqKTsKKyAgVEVTVF9BU1NFUlQoIW9iai5tYXliZV9ib29sKTsKKyAgVEVTVF9BU1NFUlQoIW9iai5tYXliZV9mMzIuaGFzX3ZhbHVlKCkpOworICBURVNUX0FTU0VSVChvYmoubWF5YmVfaTguaGFzX3ZhbHVlKCkgJiYgb2JqLm1heWJlX2k4LnZhbHVlKCkgPT0gMyk7CisgIFRFU1RfQVNTRVJUKG9iai5tYXliZV9pOCAmJiAqb2JqLm1heWJlX2k4ID09IDMpOworICBvYmoubWF5YmVfaTMyID0gLTE7CisgIG9iai5tYXliZV9lbnVtID0gb3B0aW9uYWxfc2NhbGFyczo6T3B0aW9uYWxCeXRlX1R3bzsKKworICBmYmIuQ2xlYXIoKTsKKyAgRmluaXNoU2NhbGFyU3R1ZmZCdWZmZXIoZmJiLCBvcHRpb25hbF9zY2FsYXJzOjpTY2FsYXJTdHVmZjo6UGFjayhmYmIsICZvYmopKTsKKyAgb3B0cyA9IG9wdGlvbmFsX3NjYWxhcnM6OkdldE11dGFibGVTY2FsYXJTdHVmZihmYmIuR2V0QnVmZmVyUG9pbnRlcigpKTsKKyAgVEVTVF9BU1NFUlQob3B0cy0+bWF5YmVfaTgoKS5oYXNfdmFsdWUoKSk7CisgIFRFU1RfRVEob3B0cy0+bWF5YmVfaTgoKS52YWx1ZSgpLCAzKTsKKyAgVEVTVF9BU1NFUlQob3B0cy0+bWF5YmVfaTMyKCkuaGFzX3ZhbHVlKCkpOworICBURVNUX0VRKG9wdHMtPm1heWJlX2kzMigpLnZhbHVlKCksIC0xKTsKKyAgVEVTVF9FUShvcHRzLT5tYXliZV9lbnVtKCkudmFsdWUoKSwgb3B0aW9uYWxfc2NhbGFyczo6T3B0aW9uYWxCeXRlX1R3byk7CisgIFRFU1RfQVNTRVJUKG9wdHMtPm1heWJlX2kzMigpID09IGZsYXRidWZmZXJzOjpPcHRpb25hbDxpbnQ2NF90PigtMSkpOworfQorCisgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9vcHRpb25hbF9zY2FsYXJzX3Rlc3QuaCBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL29wdGlvbmFsX3NjYWxhcnNfdGVzdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyMmU1MmMKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9vcHRpb25hbF9zY2FsYXJzX3Rlc3QuaApAQCAtMCwwICsxLDEzIEBACisjaWZuZGVmIFRFU1RTX09QVElPTkFMX1NDQUxBUlNfVEVTVF9ICisjZGVmaW5lIFRFU1RTX09QVElPTkFMX1NDQUxBUlNfVEVTVF9ICisKKworbmFtZXNwYWNlIGZsYXRidWZmZXJzIHsKK25hbWVzcGFjZSB0ZXN0cyB7CisKK3ZvaWQgT3B0aW9uYWxTY2FsYXJzVGVzdCgpOworCit9ICAvLyBuYW1lc3BhY2UgdGVzdHMKK30gIC8vIG5hbWVzcGFjZSBmbGF0YnVmZmVycworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL3BhY2thZ2UuanNvbiBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL3BhY2thZ2UuanNvbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjU0ZTU3Zi4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9wYWNrYWdlLmpzb24KKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLXsKLSAgICAiZGVwZW5kZW5jaWVzIjogewotICAgICAgICAiZXNtIjogIl4zLjIuMjUiLAotICAgICAgICAiZmxhdGJ1ZmZlcnMiOiAiLi4vIiwKLSAgICAgICAgImdycGMiOiAiXjEuMjQuNiIKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9wYXJzZXJfdGVzdC5jcHAgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9wYXJzZXJfdGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWE0MzUwNAotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL3BhcnNlcl90ZXN0LmNwcApAQCAtMCwwICsxLDkwMCBAQAorI2luY2x1ZGUgInBhcnNlcl90ZXN0LmgiCisKKyNpbmNsdWRlIDxjbWF0aD4KKyNpbmNsdWRlIDxzdHJpbmc+CisKKyNpbmNsdWRlICJmbGF0YnVmZmVycy9pZGwuaCIKKyNpbmNsdWRlICJ0ZXN0X2Fzc2VydC5oIgorCituYW1lc3BhY2UgZmxhdGJ1ZmZlcnMgeworbmFtZXNwYWNlIHRlc3RzIHsKK25hbWVzcGFjZSB7CisKKy8vIFNob3J0Y3V0cyBmb3IgdGhlIGluZmluaXR5Lgorc3RhdGljIGNvbnN0IGF1dG8gaW5maW5pdHlfZiA9IHN0ZDo6bnVtZXJpY19saW1pdHM8ZmxvYXQ+OjppbmZpbml0eSgpOworc3RhdGljIGNvbnN0IGF1dG8gaW5maW5pdHlfZCA9IHN0ZDo6bnVtZXJpY19saW1pdHM8ZG91YmxlPjo6aW5maW5pdHkoKTsKKworLy8gVGVzdCB0aGF0IHBhcnNlciBlcnJvcnMgYXJlIGFjdHVhbGx5IGdlbmVyYXRlZC4KK3N0YXRpYyB2b2lkIFRlc3RFcnJvcl8oY29uc3QgY2hhciAqc3JjLCBjb25zdCBjaGFyICplcnJvcl9zdWJzdHIsIGJvb2wgc3RyaWN0X2pzb24sCisgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZmlsZSwgaW50IGxpbmUsIGNvbnN0IGNoYXIgKmZ1bmMpIHsKKyAgZmxhdGJ1ZmZlcnM6OklETE9wdGlvbnMgb3B0czsKKyAgb3B0cy5zdHJpY3RfanNvbiA9IHN0cmljdF9qc29uOworICBmbGF0YnVmZmVyczo6UGFyc2VyIHBhcnNlcihvcHRzKTsKKyAgaWYgKHBhcnNlci5QYXJzZShzcmMpKSB7CisgICAgVGVzdEZhaWwoInRydWUiLCAiZmFsc2UiLAorICAgICAgICAgICAgICgicGFyc2VyLlBhcnNlKFwiIiArIHN0ZDo6c3RyaW5nKHNyYykgKyAiXCIpIikuY19zdHIoKSwgZmlsZSwgbGluZSwKKyAgICAgICAgICAgICBmdW5jKTsKKyAgfSBlbHNlIGlmICghc3Ryc3RyKHBhcnNlci5lcnJvcl8uY19zdHIoKSwgZXJyb3Jfc3Vic3RyKSkgeworICAgIFRlc3RGYWlsKGVycm9yX3N1YnN0ciwgcGFyc2VyLmVycm9yXy5jX3N0cigpLAorICAgICAgICAgICAgICgicGFyc2VyLlBhcnNlKFwiIiArIHN0ZDo6c3RyaW5nKHNyYykgKyAiXCIpIikuY19zdHIoKSwgZmlsZSwgbGluZSwKKyAgICAgICAgICAgICBmdW5jKTsKKyAgfQorfQorCitzdGF0aWMgdm9pZCBUZXN0RXJyb3JfKGNvbnN0IGNoYXIgKnNyYywgY29uc3QgY2hhciAqZXJyb3Jfc3Vic3RyLCBjb25zdCBjaGFyICpmaWxlLAorICAgICAgICAgICAgICAgIGludCBsaW5lLCBjb25zdCBjaGFyICpmdW5jKSB7CisgIFRlc3RFcnJvcl8oc3JjLCBlcnJvcl9zdWJzdHIsIGZhbHNlLCBmaWxlLCBsaW5lLCBmdW5jKTsKK30KKworI2lmZGVmIF9XSU4zMgorIyAgZGVmaW5lIFRlc3RFcnJvcihzcmMsIC4uLikgXAorICAgIFRlc3RFcnJvcl8oc3JjLCBfX1ZBX0FSR1NfXywgX19GSUxFX18sIF9fTElORV9fLCBfX0ZVTkNUSU9OX18pCisjZWxzZQorIyAgZGVmaW5lIFRlc3RFcnJvcihzcmMsIC4uLikgXAorICAgIFRlc3RFcnJvcl8oc3JjLCBfX1ZBX0FSR1NfXywgX19GSUxFX18sIF9fTElORV9fLCBfX1BSRVRUWV9GVU5DVElPTl9fKQorI2VuZGlmCisKK3N0YXRpYyBib29sIEZsb2F0Q29tcGFyZShmbG9hdCBhLCBmbG9hdCBiKSB7IHJldHVybiBmYWJzKGEgLSBiKSA8IDAuMDAxOyB9CisKK30gLy8gbmFtZXNwYWNlCisKKy8vIFRlc3QgdGhhdCBwYXJzaW5nIGVycm9ycyBvY2N1ciBhcyB3ZSdkIGV4cGVjdC4KKy8vIEFsc28gdXNlZnVsIGZvciBjb3ZlcmFnZSwgbWFraW5nIHN1cmUgdGhlc2UgcGF0aHMgYXJlIHJ1bi4KK3ZvaWQgRXJyb3JUZXN0KCkgeworICAvLyBJbiBvcmRlciB0aGV5IGFwcGVhciBpbiBpZGxfcGFyc2VyLmNwcAorICBUZXN0RXJyb3IoInRhYmxlIFggeyBZOmJ5dGU7IH0gcm9vdF90eXBlIFg7IHsgWTogOTk5IH0iLCAiZG9lcyBub3QgZml0Iik7CisgIFRlc3RFcnJvcigiXCJcMCIsICJpbGxlZ2FsIik7CisgIFRlc3RFcnJvcigiXCJcXHEiLCAiZXNjYXBlIGNvZGUiKTsKKyAgVGVzdEVycm9yKCJ0YWJsZSAvLy8iLCAiZG9jdW1lbnRhdGlvbiIpOworICBUZXN0RXJyb3IoIkAiLCAiaWxsZWdhbCIpOworICBUZXN0RXJyb3IoInRhYmxlIDEiLCAiZXhwZWN0aW5nIik7CisgIFRlc3RFcnJvcigidGFibGUgWCB7IFk6W1tpbnRdXTsgfSIsICJuZXN0ZWQgdmVjdG9yIik7CisgIFRlc3RFcnJvcigidGFibGUgWCB7IFk6MTsgfSIsICJpbGxlZ2FsIHR5cGUiKTsKKyAgVGVzdEVycm9yKCJ0YWJsZSBYIHsgWTppbnQ7IFk6aW50OyB9IiwgImZpZWxkIGFscmVhZHkiKTsKKyAgVGVzdEVycm9yKCJ0YWJsZSBZIHt9IHRhYmxlIFggeyBZOmludDsgfSIsICJzYW1lIGFzIHRhYmxlIik7CisgIFRlc3RFcnJvcigic3RydWN0IFggeyBZOnN0cmluZzsgfSIsICJvbmx5IHNjYWxhciIpOworICBUZXN0RXJyb3IoInN0cnVjdCBYIHsgYTp1aW50ID0gNDI7IH0iLCAiZGVmYXVsdCB2YWx1ZXMiKTsKKyAgVGVzdEVycm9yKCJlbnVtIFk6Ynl0ZSB7IFogPSAxIH0gdGFibGUgWCB7IHk6WTsgfSIsICJub3QgcGFydCBvZiBlbnVtIik7CisgIFRlc3RFcnJvcigic3RydWN0IFggeyBZOmludCAoZGVwcmVjYXRlZCk7IH0iLCAiZGVwcmVjYXRlIik7CisgIFRlc3RFcnJvcigidW5pb24gWiB7IFggfSB0YWJsZSBYIHsgWTpaOyB9IHJvb3RfdHlwZSBYOyB7IFk6IHt9LCBBOjEgfSIsCisgICAgICAgICAgICAibWlzc2luZyB0eXBlIGZpZWxkIik7CisgIFRlc3RFcnJvcigidW5pb24gWiB7IFggfSB0YWJsZSBYIHsgWTpaOyB9IHJvb3RfdHlwZSBYOyB7IFlfdHlwZTogOTksIFk6IHsiLAorICAgICAgICAgICAgInR5cGUgaWQiKTsKKyAgVGVzdEVycm9yKCJ0YWJsZSBYIHsgWTppbnQ7IH0gcm9vdF90eXBlIFg7IHsgWjoiLCAidW5rbm93biBmaWVsZCIpOworICBUZXN0RXJyb3IoInRhYmxlIFggeyBZOmludDsgfSByb290X3R5cGUgWDsgeyBZOiIsICJzdHJpbmcgY29uc3RhbnQiLCB0cnVlKTsKKyAgVGVzdEVycm9yKCJ0YWJsZSBYIHsgWTppbnQ7IH0gcm9vdF90eXBlIFg7IHsgXCJZXCI6MSwgfSIsICJzdHJpbmcgY29uc3RhbnQiLAorICAgICAgICAgICAgdHJ1ZSk7CisgIFRlc3RFcnJvcigKKyAgICAgICJzdHJ1Y3QgWCB7IFk6aW50OyBaOmludDsgfSB0YWJsZSBXIHsgVjpYOyB9IHJvb3RfdHlwZSBXOyAiCisgICAgICAieyBWOnsgWToxIH0gfSIsCisgICAgICAid3JvbmcgbnVtYmVyIik7CisgIFRlc3RFcnJvcigiZW51bSBFOmJ5dGUgeyBBIH0gdGFibGUgWCB7IFk6RTsgfSByb290X3R5cGUgWDsgeyBZOlUgfSIsCisgICAgICAgICAgICAidW5rbm93biBlbnVtIHZhbHVlIik7CisgIFRlc3RFcnJvcigidGFibGUgWCB7IFk6Ynl0ZTsgfSByb290X3R5cGUgWDsgeyBZOjsgfSIsICJzdGFydGluZyIpOworICBUZXN0RXJyb3IoImVudW0gWDpieXRlIHsgWSB9IGVudW0gWCB7IiwgImVudW0gYWxyZWFkeSIpOworICBUZXN0RXJyb3IoImVudW0gWDpmbG9hdCB7fSIsICJ1bmRlcmx5aW5nIik7CisgIFRlc3RFcnJvcigiZW51bSBYOmJ5dGUgeyBZLCBZIH0iLCAidmFsdWUgYWxyZWFkeSIpOworICBUZXN0RXJyb3IoImVudW0gWDpieXRlIHsgWT0yLCBaPTIgfSIsICJ1bmlxdWUiKTsKKyAgVGVzdEVycm9yKCJlbnVtIFg6Ynl0ZSAoZm9yY2VfYWxpZ246IDQpIHsgWSB9IiwgImZvcmNlX2FsaWduIik7CisgIFRlc3RFcnJvcigidGFibGUgWCB7IFk6aW50OyB9IHRhYmxlIFggeyIsICJkYXRhdHlwZSBhbHJlYWR5Iik7CisgIFRlc3RFcnJvcigidGFibGUgWCB7IH0gdW5pb24gWCB7IH0iLCAiZGF0YXR5cGUgYWxyZWFkeSIpOworICBUZXN0RXJyb3IoInVuaW9uIFggeyB9IHRhYmxlIFggeyB9IiwgImRhdGF0eXBlIGFscmVhZHkiKTsKKyAgVGVzdEVycm9yKCJuYW1lc3BhY2UgQTsgdGFibGUgWCB7IH0gbmFtZXNwYWNlIEE7IHVuaW9uIFggeyB9IiwKKyAgICAgICAgICAgICJkYXRhdHlwZSBhbHJlYWR5Iik7CisgIFRlc3RFcnJvcigibmFtZXNwYWNlIEE7IHVuaW9uIFggeyB9IG5hbWVzcGFjZSBBOyB0YWJsZSBYIHsgfSIsCisgICAgICAgICAgICAiZGF0YXR5cGUgYWxyZWFkeSIpOworICBUZXN0RXJyb3IoInN0cnVjdCBYIChmb3JjZV9hbGlnbjogNykgeyBZOmludDsgfSIsICJmb3JjZV9hbGlnbiIpOworICBUZXN0RXJyb3IoInN0cnVjdCBYIHt9IiwgInNpemUgMCIpOworICBUZXN0RXJyb3IoInt9IiwgIm5vIHJvb3QiKTsKKyAgVGVzdEVycm9yKCJ0YWJsZSBYIHsgWTpieXRlOyB9IHJvb3RfdHlwZSBYOyB7IFk6MSB9IHsgWToxIH0iLCAiZW5kIG9mIGZpbGUiKTsKKyAgVGVzdEVycm9yKCJ0YWJsZSBYIHsgWTpieXRlOyB9IHJvb3RfdHlwZSBYOyB7IFk6MSB9IHRhYmxlIFl7IFo6aW50IH0iLAorICAgICAgICAgICAgImVuZCBvZiBmaWxlIik7CisgIFRlc3RFcnJvcigicm9vdF90eXBlIFg7IiwgInVua25vd24gcm9vdCIpOworICBUZXN0RXJyb3IoInN0cnVjdCBYIHsgWTppbnQ7IH0gcm9vdF90eXBlIFg7IiwgImEgdGFibGUiKTsKKyAgVGVzdEVycm9yKCJ1bmlvbiBYIHsgWSB9IiwgInJlZmVyZW5jZWQiKTsKKyAgVGVzdEVycm9yKCJ1bmlvbiBaIHsgWCB9IHN0cnVjdCBYIHsgWTppbnQ7IH0iLCAib25seSB0YWJsZXMiKTsKKyAgVGVzdEVycm9yKCJ0YWJsZSBYIHsgWTpbaW50XTsgWUxlbmd0aDppbnQ7IH0iLCAiY2xhc2giKTsKKyAgVGVzdEVycm9yKCJ0YWJsZSBYIHsgWTpieXRlOyB9IHJvb3RfdHlwZSBYOyB7IFk6MSwgWToyIH0iLCAibW9yZSB0aGFuIG9uY2UiKTsKKyAgLy8gZmxvYXQgdG8gaW50ZWdlciBjb252ZXJzaW9uIGlzIGZvcmJpZGRlbgorICBUZXN0RXJyb3IoInRhYmxlIFggeyBZOmludDsgfSByb290X3R5cGUgWDsgeyBZOjEuMCB9IiwgImZsb2F0Iik7CisgIFRlc3RFcnJvcigidGFibGUgWCB7IFk6Ym9vbDsgfSByb290X3R5cGUgWDsgeyBZOjEuMCB9IiwgImZsb2F0Iik7CisgIFRlc3RFcnJvcigiZW51bSBYOmJvb2wgeyBZID0gdHJ1ZSB9IiwgIm11c3QgYmUgaW50ZWdyYWwiKTsKKyAgLy8gQXJyYXkgb2Ygbm9uLXNjYWxhcgorICBUZXN0RXJyb3IoInRhYmxlIFggeyB4OmludDsgfSBzdHJ1Y3QgWSB7IHk6W1g6Ml07IH0iLAorICAgICAgICAgICAgIm1heSBjb250YWluIG9ubHkgc2NhbGFyIG9yIHN0cnVjdCBmaWVsZHMiKTsKKyAgLy8gTm9uLXNuYWtlIGNhc2UgZmllbGQgbmFtZXMKKyAgVGVzdEVycm9yKCJ0YWJsZSBYIHsgWTogaW50OyB9IHJvb3RfdHlwZSBZOiB7WToxLjB9IiwgInNuYWtlX2Nhc2UiKTsKKyAgLy8gQ29tcGxleCBkZWZhdWx0cworICBUZXN0RXJyb3IoInRhYmxlIFggeyB5OiBzdHJpbmcgPSAxOyB9IiwgImV4cGVjdGluZzogc3RyaW5nIik7CisgIFRlc3RFcnJvcigidGFibGUgWCB7IHk6IHN0cmluZyA9IFtdOyB9IiwgIiBDYW5ub3QgYXNzaWduIHRva2VuIik7CisgIFRlc3RFcnJvcigidGFibGUgWCB7IHk6IFtpbnRdID0gWzFdOyB9IiwgIkV4cGVjdGVkIGBdYCIpOworICBUZXN0RXJyb3IoInRhYmxlIFggeyB5OiBbaW50XSA9IFs7IH0iLCAiRXhwZWN0ZWQgYF1gIik7CisgIFRlc3RFcnJvcigidGFibGUgWCB7IHk6IFtpbnRdID0gXCJcIjsgfSIsICJ0eXBlIG1pc21hdGNoIik7CisgIC8vIEFuIGlkZW50aWZpZXIgY2FuJ3Qgc3RhcnQgZnJvbSBzaWduICgrfC0pCisgIFRlc3RFcnJvcigidGFibGUgWCB7IC1ZOiBpbnQ7IH0gcm9vdF90eXBlIFk6IHtZOjEuMH0iLCAiaWRlbnRpZmllciIpOworICBUZXN0RXJyb3IoInRhYmxlIFggeyArWTogaW50OyB9IHJvb3RfdHlwZSBZOiB7WToxLjB9IiwgImlkZW50aWZpZXIiKTsKK30KKwordm9pZCBFbnVtT3V0T2ZSYW5nZVRlc3QoKSB7CisgIFRlc3RFcnJvcigiZW51bSBYOmJ5dGUgeyBZID0gMTI4IH0iLCAiZW51bSB2YWx1ZSBkb2VzIG5vdCBmaXQiKTsKKyAgVGVzdEVycm9yKCJlbnVtIFg6Ynl0ZSB7IFkgPSAtMTI5IH0iLCAiZW51bSB2YWx1ZSBkb2VzIG5vdCBmaXQiKTsKKyAgVGVzdEVycm9yKCJlbnVtIFg6Ynl0ZSB7IFkgPSAxMjYsIFowLCBaMSB9IiwgImVudW0gdmFsdWUgZG9lcyBub3QgZml0Iik7CisgIFRlc3RFcnJvcigiZW51bSBYOnVieXRlIHsgWSA9IC0xIH0iLCAiZW51bSB2YWx1ZSBkb2VzIG5vdCBmaXQiKTsKKyAgVGVzdEVycm9yKCJlbnVtIFg6dWJ5dGUgeyBZID0gMjU2IH0iLCAiZW51bSB2YWx1ZSBkb2VzIG5vdCBmaXQiKTsKKyAgVGVzdEVycm9yKCJlbnVtIFg6dWJ5dGUgeyBZID0gMjU1LCBaIH0iLCAiZW51bSB2YWx1ZSBkb2VzIG5vdCBmaXQiKTsKKyAgVGVzdEVycm9yKCJ0YWJsZSBZe30gdW5pb24gWCB7IFkgPSAtMSB9IiwgImVudW0gdmFsdWUgZG9lcyBub3QgZml0Iik7CisgIFRlc3RFcnJvcigidGFibGUgWXt9IHVuaW9uIFggeyBZID0gMjU2IH0iLCAiZW51bSB2YWx1ZSBkb2VzIG5vdCBmaXQiKTsKKyAgVGVzdEVycm9yKCJ0YWJsZSBZe30gdW5pb24gWCB7IFkgPSAyNTUsIFo6WSB9IiwgImVudW0gdmFsdWUgZG9lcyBub3QgZml0Iik7CisgIFRlc3RFcnJvcigiZW51bSBYOmludCB7IFkgPSAtMjE0NzQ4MzY0OSB9IiwgImVudW0gdmFsdWUgZG9lcyBub3QgZml0Iik7CisgIFRlc3RFcnJvcigiZW51bSBYOmludCB7IFkgPSAyMTQ3NDgzNjQ4IH0iLCAiZW51bSB2YWx1ZSBkb2VzIG5vdCBmaXQiKTsKKyAgVGVzdEVycm9yKCJlbnVtIFg6dWludCB7IFkgPSAtMSB9IiwgImVudW0gdmFsdWUgZG9lcyBub3QgZml0Iik7CisgIFRlc3RFcnJvcigiZW51bSBYOnVpbnQgeyBZID0gNDI5NDk2NzI5NyB9IiwgImVudW0gdmFsdWUgZG9lcyBub3QgZml0Iik7CisgIFRlc3RFcnJvcigiZW51bSBYOmxvbmcgeyBZID0gOTIyMzM3MjAzNjg1NDc3NTgwOCB9IiwgImRvZXMgbm90IGZpdCIpOworICBUZXN0RXJyb3IoImVudW0gWDpsb25nIHsgWSA9IDkyMjMzNzIwMzY4NTQ3NzU4MDcsIFogfSIsCisgICAgICAgICAgICAiZW51bSB2YWx1ZSBkb2VzIG5vdCBmaXQiKTsKKyAgVGVzdEVycm9yKCJlbnVtIFg6dWxvbmcgeyBZID0gLTEgfSIsICJkb2VzIG5vdCBmaXQiKTsKKyAgVGVzdEVycm9yKCJlbnVtIFg6dWJ5dGUgKGJpdF9mbGFncykgeyBZPTggfSIsICJiaXQgZmxhZyBvdXQiKTsKKyAgVGVzdEVycm9yKCJlbnVtIFg6Ynl0ZSAoYml0X2ZsYWdzKSB7IFk9NyB9IiwgIm11c3QgYmUgdW5zaWduZWQiKTsgIC8vIC0xMjgKKyAgLy8gYml0X2ZsZ3Mgb3V0IG9mIHJhbmdlCisgIFRlc3RFcnJvcigiZW51bSBYOnVieXRlIChiaXRfZmxhZ3MpIHsgWTAsWTEsWTIsWTMsWTQsWTUsWTYsWTcsWTggfSIsCisgICAgICAgICAgICAib3V0IG9mIHJhbmdlIik7Cit9CisKK3ZvaWQgSW50ZWdlck91dE9mUmFuZ2VUZXN0KCkgeworICBUZXN0RXJyb3IoInRhYmxlIFQgeyBGOmJ5dGU7IH0gcm9vdF90eXBlIFQ7IHsgRjoxMjggfSIsCisgICAgICAgICAgICAiY29uc3RhbnQgZG9lcyBub3QgZml0Iik7CisgIFRlc3RFcnJvcigidGFibGUgVCB7IEY6Ynl0ZTsgfSByb290X3R5cGUgVDsgeyBGOi0xMjkgfSIsCisgICAgICAgICAgICAiY29uc3RhbnQgZG9lcyBub3QgZml0Iik7CisgIFRlc3RFcnJvcigidGFibGUgVCB7IEY6dWJ5dGU7IH0gcm9vdF90eXBlIFQ7IHsgRjoyNTYgfSIsCisgICAgICAgICAgICAiY29uc3RhbnQgZG9lcyBub3QgZml0Iik7CisgIFRlc3RFcnJvcigidGFibGUgVCB7IEY6dWJ5dGU7IH0gcm9vdF90eXBlIFQ7IHsgRjotMSB9IiwKKyAgICAgICAgICAgICJjb25zdGFudCBkb2VzIG5vdCBmaXQiKTsKKyAgVGVzdEVycm9yKCJ0YWJsZSBUIHsgRjpzaG9ydDsgfSByb290X3R5cGUgVDsgeyBGOjMyNzY4IH0iLAorICAgICAgICAgICAgImNvbnN0YW50IGRvZXMgbm90IGZpdCIpOworICBUZXN0RXJyb3IoInRhYmxlIFQgeyBGOnNob3J0OyB9IHJvb3RfdHlwZSBUOyB7IEY6LTMyNzY5IH0iLAorICAgICAgICAgICAgImNvbnN0YW50IGRvZXMgbm90IGZpdCIpOworICBUZXN0RXJyb3IoInRhYmxlIFQgeyBGOnVzaG9ydDsgfSByb290X3R5cGUgVDsgeyBGOjY1NTM2IH0iLAorICAgICAgICAgICAgImNvbnN0YW50IGRvZXMgbm90IGZpdCIpOworICBUZXN0RXJyb3IoInRhYmxlIFQgeyBGOnVzaG9ydDsgfSByb290X3R5cGUgVDsgeyBGOi0xIH0iLAorICAgICAgICAgICAgImNvbnN0YW50IGRvZXMgbm90IGZpdCIpOworICBUZXN0RXJyb3IoInRhYmxlIFQgeyBGOmludDsgfSByb290X3R5cGUgVDsgeyBGOjIxNDc0ODM2NDggfSIsCisgICAgICAgICAgICAiY29uc3RhbnQgZG9lcyBub3QgZml0Iik7CisgIFRlc3RFcnJvcigidGFibGUgVCB7IEY6aW50OyB9IHJvb3RfdHlwZSBUOyB7IEY6LTIxNDc0ODM2NDkgfSIsCisgICAgICAgICAgICAiY29uc3RhbnQgZG9lcyBub3QgZml0Iik7CisgIFRlc3RFcnJvcigidGFibGUgVCB7IEY6dWludDsgfSByb290X3R5cGUgVDsgeyBGOjQyOTQ5NjcyOTYgfSIsCisgICAgICAgICAgICAiY29uc3RhbnQgZG9lcyBub3QgZml0Iik7CisgIFRlc3RFcnJvcigidGFibGUgVCB7IEY6dWludDsgfSByb290X3R5cGUgVDsgeyBGOi0xIH0iLAorICAgICAgICAgICAgImNvbnN0YW50IGRvZXMgbm90IGZpdCIpOworICAvLyBDaGVjayBmaXhlZCB3aWR0aCBhbGlhc2VzCisgIFRlc3RFcnJvcigidGFibGUgWCB7IFk6dWludDg7IH0gcm9vdF90eXBlIFg7IHsgWTogLTEgfSIsICJkb2VzIG5vdCBmaXQiKTsKKyAgVGVzdEVycm9yKCJ0YWJsZSBYIHsgWTp1aW50ODsgfSByb290X3R5cGUgWDsgeyBZOiAyNTYgfSIsICJkb2VzIG5vdCBmaXQiKTsKKyAgVGVzdEVycm9yKCJ0YWJsZSBYIHsgWTp1aW50MTY7IH0gcm9vdF90eXBlIFg7IHsgWTogLTEgfSIsICJkb2VzIG5vdCBmaXQiKTsKKyAgVGVzdEVycm9yKCJ0YWJsZSBYIHsgWTp1aW50MTY7IH0gcm9vdF90eXBlIFg7IHsgWTogNjU1MzYgfSIsICJkb2VzIG5vdCBmaXQiKTsKKyAgVGVzdEVycm9yKCJ0YWJsZSBYIHsgWTp1aW50MzI7IH0gcm9vdF90eXBlIFg7IHsgWTogLTEgfSIsICIiKTsKKyAgVGVzdEVycm9yKCJ0YWJsZSBYIHsgWTp1aW50MzI7IH0gcm9vdF90eXBlIFg7IHsgWTogNDI5NDk2NzI5NiB9IiwKKyAgICAgICAgICAgICJkb2VzIG5vdCBmaXQiKTsKKyAgVGVzdEVycm9yKCJ0YWJsZSBYIHsgWTp1aW50NjQ7IH0gcm9vdF90eXBlIFg7IHsgWTogLTEgfSIsICIiKTsKKyAgVGVzdEVycm9yKCJ0YWJsZSBYIHsgWTp1aW50NjQ7IH0gcm9vdF90eXBlIFg7IHsgWTogLTkyMjMzNzIwMzY4NTQ3NzU4MDkgfSIsCisgICAgICAgICAgICAiZG9lcyBub3QgZml0Iik7CisgIFRlc3RFcnJvcigidGFibGUgWCB7IFk6dWludDY0OyB9IHJvb3RfdHlwZSBYOyB7IFk6IDE4NDQ2NzQ0MDczNzA5NTUxNjE2IH0iLAorICAgICAgICAgICAgImRvZXMgbm90IGZpdCIpOworCisgIFRlc3RFcnJvcigidGFibGUgWCB7IFk6aW50ODsgfSByb290X3R5cGUgWDsgeyBZOiAtMTI5IH0iLCAiZG9lcyBub3QgZml0Iik7CisgIFRlc3RFcnJvcigidGFibGUgWCB7IFk6aW50ODsgfSByb290X3R5cGUgWDsgeyBZOiAxMjggfSIsICJkb2VzIG5vdCBmaXQiKTsKKyAgVGVzdEVycm9yKCJ0YWJsZSBYIHsgWTppbnQxNjsgfSByb290X3R5cGUgWDsgeyBZOiAtMzI3NjkgfSIsICJkb2VzIG5vdCBmaXQiKTsKKyAgVGVzdEVycm9yKCJ0YWJsZSBYIHsgWTppbnQxNjsgfSByb290X3R5cGUgWDsgeyBZOiAzMjc2OCB9IiwgImRvZXMgbm90IGZpdCIpOworICBUZXN0RXJyb3IoInRhYmxlIFggeyBZOmludDMyOyB9IHJvb3RfdHlwZSBYOyB7IFk6IC0yMTQ3NDgzNjQ5IH0iLCAiIik7CisgIFRlc3RFcnJvcigidGFibGUgWCB7IFk6aW50MzI7IH0gcm9vdF90eXBlIFg7IHsgWTogMjE0NzQ4MzY0OCB9IiwKKyAgICAgICAgICAgICJkb2VzIG5vdCBmaXQiKTsKKyAgVGVzdEVycm9yKCJ0YWJsZSBYIHsgWTppbnQ2NDsgfSByb290X3R5cGUgWDsgeyBZOiAtOTIyMzM3MjAzNjg1NDc3NTgwOSB9IiwKKyAgICAgICAgICAgICJkb2VzIG5vdCBmaXQiKTsKKyAgVGVzdEVycm9yKCJ0YWJsZSBYIHsgWTppbnQ2NDsgfSByb290X3R5cGUgWDsgeyBZOiA5MjIzMzcyMDM2ODU0Nzc1ODA4IH0iLAorICAgICAgICAgICAgImRvZXMgbm90IGZpdCIpOworICAvLyBjaGVjayBvdXQtb2YtaW50NjQgYXMgaW50OAorICBUZXN0RXJyb3IoInRhYmxlIFggeyBZOmludDg7IH0gcm9vdF90eXBlIFg7IHsgWTogLTkyMjMzNzIwMzY4NTQ3NzU4MDkgfSIsCisgICAgICAgICAgICAiZG9lcyBub3QgZml0Iik7CisgIFRlc3RFcnJvcigidGFibGUgWCB7IFk6aW50ODsgfSByb290X3R5cGUgWDsgeyBZOiA5MjIzMzcyMDM2ODU0Nzc1ODA4IH0iLAorICAgICAgICAgICAgImRvZXMgbm90IGZpdCIpOworCisgIC8vIENoZWNrIGRlZmF1bHQgdmFsdWVzCisgIFRlc3RFcnJvcigidGFibGUgWCB7IFk6aW50NjQ9LTkyMjMzNzIwMzY4NTQ3NzU4MDk7IH0gcm9vdF90eXBlIFg7IHt9IiwKKyAgICAgICAgICAgICJkb2VzIG5vdCBmaXQiKTsKKyAgVGVzdEVycm9yKCJ0YWJsZSBYIHsgWTppbnQ2ND0gOTIyMzM3MjAzNjg1NDc3NTgwODsgfSByb290X3R5cGUgWDsge30iLAorICAgICAgICAgICAgImRvZXMgbm90IGZpdCIpOworICBUZXN0RXJyb3IoInRhYmxlIFggeyBZOnVpbnQ2NDsgfSByb290X3R5cGUgWDsgeyBZOiAtMSB9IiwgIiIpOworICBUZXN0RXJyb3IoInRhYmxlIFggeyBZOnVpbnQ2ND0tOTIyMzM3MjAzNjg1NDc3NTgwOTsgfSByb290X3R5cGUgWDsge30iLAorICAgICAgICAgICAgImRvZXMgbm90IGZpdCIpOworICBUZXN0RXJyb3IoInRhYmxlIFggeyBZOnVpbnQ2ND0gMTg0NDY3NDQwNzM3MDk1NTE2MTY7IH0gcm9vdF90eXBlIFg7IHt9IiwKKyAgICAgICAgICAgICJkb2VzIG5vdCBmaXQiKTsKK30KKwordm9pZCBJbnZhbGlkRmxvYXRUZXN0KCkgeworICBhdXRvIGludmFsaWRfbXNnID0gImludmFsaWQgbnVtYmVyIjsKKyAgYXV0byBjb21tYV9tc2cgPSAiZXhwZWN0aW5nOiAsIjsKKyAgVGVzdEVycm9yKCJ0YWJsZSBUIHsgRjpmbG9hdDsgfSByb290X3R5cGUgVDsgeyBGOjEsMCB9IiwgIiIpOworICBUZXN0RXJyb3IoInRhYmxlIFQgeyBGOmZsb2F0OyB9IHJvb3RfdHlwZSBUOyB7IEY6LiB9IiwgIiIpOworICBUZXN0RXJyb3IoInRhYmxlIFQgeyBGOmZsb2F0OyB9IHJvb3RfdHlwZSBUOyB7IEY6LSB9IiwgaW52YWxpZF9tc2cpOworICBUZXN0RXJyb3IoInRhYmxlIFQgeyBGOmZsb2F0OyB9IHJvb3RfdHlwZSBUOyB7IEY6KyB9IiwgaW52YWxpZF9tc2cpOworICBUZXN0RXJyb3IoInRhYmxlIFQgeyBGOmZsb2F0OyB9IHJvb3RfdHlwZSBUOyB7IEY6LS4gfSIsIGludmFsaWRfbXNnKTsKKyAgVGVzdEVycm9yKCJ0YWJsZSBUIHsgRjpmbG9hdDsgfSByb290X3R5cGUgVDsgeyBGOisuIH0iLCBpbnZhbGlkX21zZyk7CisgIFRlc3RFcnJvcigidGFibGUgVCB7IEY6ZmxvYXQ7IH0gcm9vdF90eXBlIFQ7IHsgRjouZSB9IiwgIiIpOworICBUZXN0RXJyb3IoInRhYmxlIFQgeyBGOmZsb2F0OyB9IHJvb3RfdHlwZSBUOyB7IEY6LWUgfSIsIGludmFsaWRfbXNnKTsKKyAgVGVzdEVycm9yKCJ0YWJsZSBUIHsgRjpmbG9hdDsgfSByb290X3R5cGUgVDsgeyBGOitlIH0iLCBpbnZhbGlkX21zZyk7CisgIFRlc3RFcnJvcigidGFibGUgVCB7IEY6ZmxvYXQ7IH0gcm9vdF90eXBlIFQ7IHsgRjotLmUgfSIsIGludmFsaWRfbXNnKTsKKyAgVGVzdEVycm9yKCJ0YWJsZSBUIHsgRjpmbG9hdDsgfSByb290X3R5cGUgVDsgeyBGOisuZSB9IiwgaW52YWxpZF9tc2cpOworICBUZXN0RXJyb3IoInRhYmxlIFQgeyBGOmZsb2F0OyB9IHJvb3RfdHlwZSBUOyB7IEY6LWUxIH0iLCBpbnZhbGlkX21zZyk7CisgIFRlc3RFcnJvcigidGFibGUgVCB7IEY6ZmxvYXQ7IH0gcm9vdF90eXBlIFQ7IHsgRjorZTEgfSIsIGludmFsaWRfbXNnKTsKKyAgVGVzdEVycm9yKCJ0YWJsZSBUIHsgRjpmbG9hdDsgfSByb290X3R5cGUgVDsgeyBGOjEuMGUrIH0iLCBpbnZhbGlkX21zZyk7CisgIFRlc3RFcnJvcigidGFibGUgVCB7IEY6ZmxvYXQ7IH0gcm9vdF90eXBlIFQ7IHsgRjoxLjBlLSB9IiwgaW52YWxpZF9tc2cpOworICAvLyBleHBvbmVudCBwUCBpcyBtYW5kYXRvcnkgZm9yIGhleC1mbG9hdAorICBUZXN0RXJyb3IoInRhYmxlIFQgeyBGOmZsb2F0OyB9IHJvb3RfdHlwZSBUOyB7IEY6MHgwIH0iLCBpbnZhbGlkX21zZyk7CisgIFRlc3RFcnJvcigidGFibGUgVCB7IEY6ZmxvYXQ7IH0gcm9vdF90eXBlIFQ7IHsgRjotMHguIH0iLCBpbnZhbGlkX21zZyk7CisgIFRlc3RFcnJvcigidGFibGUgVCB7IEY6ZmxvYXQ7IH0gcm9vdF90eXBlIFQ7IHsgRjoweC4gfSIsIGludmFsaWRfbXNnKTsKKyAgVGVzdEVycm9yKCJ0YWJsZSBUIHsgRjpmbG9hdDsgfSByb290X3R5cGUgVDsgeyBGOjBYZSB9IiwgaW52YWxpZF9tc2cpOworICBUZXN0RXJyb3IoInRhYmxlIFQgeyBGOmZsb2F0OyB9IHJvb3RfdHlwZSBUOyB7IEY6XCIwWGVcIiB9IiwgaW52YWxpZF9tc2cpOworICBUZXN0RXJyb3IoInRhYmxlIFQgeyBGOmZsb2F0OyB9IHJvb3RfdHlwZSBUOyB7IEY6XCJuYW4oMSlcIiB9IiwgaW52YWxpZF9tc2cpOworICAvLyBlRSBub3QgZXhwb25lbnQgaW4gaGV4LWZsb2F0IQorICBUZXN0RXJyb3IoInRhYmxlIFQgeyBGOmZsb2F0OyB9IHJvb3RfdHlwZSBUOyB7IEY6MHgwLjBlKyB9IiwgaW52YWxpZF9tc2cpOworICBUZXN0RXJyb3IoInRhYmxlIFQgeyBGOmZsb2F0OyB9IHJvb3RfdHlwZSBUOyB7IEY6MHgwLjBlLSB9IiwgaW52YWxpZF9tc2cpOworICBUZXN0RXJyb3IoInRhYmxlIFQgeyBGOmZsb2F0OyB9IHJvb3RfdHlwZSBUOyB7IEY6MHgwLjBwIH0iLCBpbnZhbGlkX21zZyk7CisgIFRlc3RFcnJvcigidGFibGUgVCB7IEY6ZmxvYXQ7IH0gcm9vdF90eXBlIFQ7IHsgRjoweDAuMHArIH0iLCBpbnZhbGlkX21zZyk7CisgIFRlc3RFcnJvcigidGFibGUgVCB7IEY6ZmxvYXQ7IH0gcm9vdF90eXBlIFQ7IHsgRjoweDAuMHAtIH0iLCBpbnZhbGlkX21zZyk7CisgIFRlc3RFcnJvcigidGFibGUgVCB7IEY6ZmxvYXQ7IH0gcm9vdF90eXBlIFQ7IHsgRjoweDAuMHBhMSB9IiwgaW52YWxpZF9tc2cpOworICBUZXN0RXJyb3IoInRhYmxlIFQgeyBGOmZsb2F0OyB9IHJvb3RfdHlwZSBUOyB7IEY6MHgwLjBlKyB9IiwgaW52YWxpZF9tc2cpOworICBUZXN0RXJyb3IoInRhYmxlIFQgeyBGOmZsb2F0OyB9IHJvb3RfdHlwZSBUOyB7IEY6MHgwLjBlLSB9IiwgaW52YWxpZF9tc2cpOworICBUZXN0RXJyb3IoInRhYmxlIFQgeyBGOmZsb2F0OyB9IHJvb3RfdHlwZSBUOyB7IEY6MHgwLjBlKzAgfSIsIGludmFsaWRfbXNnKTsKKyAgVGVzdEVycm9yKCJ0YWJsZSBUIHsgRjpmbG9hdDsgfSByb290X3R5cGUgVDsgeyBGOjB4MC4wZS0wIH0iLCBpbnZhbGlkX21zZyk7CisgIFRlc3RFcnJvcigidGFibGUgVCB7IEY6ZmxvYXQ7IH0gcm9vdF90eXBlIFQ7IHsgRjoweDAuMGVwKyB9IiwgaW52YWxpZF9tc2cpOworICBUZXN0RXJyb3IoInRhYmxlIFQgeyBGOmZsb2F0OyB9IHJvb3RfdHlwZSBUOyB7IEY6MHgwLjBlcC0gfSIsIGludmFsaWRfbXNnKTsKKyAgVGVzdEVycm9yKCJ0YWJsZSBUIHsgRjpmbG9hdDsgfSByb290X3R5cGUgVDsgeyBGOjEuMi4zIH0iLCBpbnZhbGlkX21zZyk7CisgIFRlc3RFcnJvcigidGFibGUgVCB7IEY6ZmxvYXQ7IH0gcm9vdF90eXBlIFQ7IHsgRjoxLjIuZTMgfSIsIGludmFsaWRfbXNnKTsKKyAgVGVzdEVycm9yKCJ0YWJsZSBUIHsgRjpmbG9hdDsgfSByb290X3R5cGUgVDsgeyBGOjEuMmUuMyB9IiwgaW52YWxpZF9tc2cpOworICBUZXN0RXJyb3IoInRhYmxlIFQgeyBGOmZsb2F0OyB9IHJvb3RfdHlwZSBUOyB7IEY6MS4yZTAuMyB9IiwgaW52YWxpZF9tc2cpOworICBUZXN0RXJyb3IoInRhYmxlIFQgeyBGOmZsb2F0OyB9IHJvb3RfdHlwZSBUOyB7IEY6MS4yZTMuIH0iLCBpbnZhbGlkX21zZyk7CisgIFRlc3RFcnJvcigidGFibGUgVCB7IEY6ZmxvYXQ7IH0gcm9vdF90eXBlIFQ7IHsgRjoxLjJlMy4wIH0iLCBpbnZhbGlkX21zZyk7CisgIFRlc3RFcnJvcigidGFibGUgVCB7IEY6ZmxvYXQ7IH0gcm9vdF90eXBlIFQ7IHsgRjorLTEuMCB9IiwgaW52YWxpZF9tc2cpOworICBUZXN0RXJyb3IoInRhYmxlIFQgeyBGOmZsb2F0OyB9IHJvb3RfdHlwZSBUOyB7IEY6MS4wZSstMSB9IiwgaW52YWxpZF9tc2cpOworICBUZXN0RXJyb3IoInRhYmxlIFQgeyBGOmZsb2F0OyB9IHJvb3RfdHlwZSBUOyB7IEY6XCIxLjBlKy0xXCIgfSIsIGludmFsaWRfbXNnKTsKKyAgVGVzdEVycm9yKCJ0YWJsZSBUIHsgRjpmbG9hdDsgfSByb290X3R5cGUgVDsgeyBGOjEuZTBlIH0iLCBjb21tYV9tc2cpOworICBUZXN0RXJyb3IoInRhYmxlIFQgeyBGOmZsb2F0OyB9IHJvb3RfdHlwZSBUOyB7IEY6MHgxLnAwZSB9IiwgY29tbWFfbXNnKTsKKyAgVGVzdEVycm9yKCJ0YWJsZSBUIHsgRjpmbG9hdDsgfSByb290X3R5cGUgVDsgeyBGOlwiIDB4MTAgXCIgfSIsIGludmFsaWRfbXNnKTsKKyAgLy8gZmxvYXRzIGluIHN0cmluZworICBUZXN0RXJyb3IoInRhYmxlIFQgeyBGOmZsb2F0OyB9IHJvb3RfdHlwZSBUOyB7IEY6XCIxLDIuXCIgfSIsIGludmFsaWRfbXNnKTsKKyAgVGVzdEVycm9yKCJ0YWJsZSBUIHsgRjpmbG9hdDsgfSByb290X3R5cGUgVDsgeyBGOlwiMS4yZTMuXCIgfSIsIGludmFsaWRfbXNnKTsKKyAgVGVzdEVycm9yKCJ0YWJsZSBUIHsgRjpmbG9hdDsgfSByb290X3R5cGUgVDsgeyBGOlwiMHgxLnAwZVwiIH0iLCBpbnZhbGlkX21zZyk7CisgIFRlc3RFcnJvcigidGFibGUgVCB7IEY6ZmxvYXQ7IH0gcm9vdF90eXBlIFQ7IHsgRjpcIjB4MS4wXCIgfSIsIGludmFsaWRfbXNnKTsKKyAgVGVzdEVycm9yKCJ0YWJsZSBUIHsgRjpmbG9hdDsgfSByb290X3R5cGUgVDsgeyBGOlwiIDB4MS4wXCIgfSIsIGludmFsaWRfbXNnKTsKKyAgVGVzdEVycm9yKCJ0YWJsZSBUIHsgRjpmbG9hdDsgfSByb290X3R5cGUgVDsgeyBGOlwiKyAwXCIgfSIsIGludmFsaWRfbXNnKTsKKyAgLy8gZGlzYWJsZSBlc2NhcGVzIGZvciAibnVtYmVyLWluLXN0cmluZyIKKyAgVGVzdEVycm9yKCJ0YWJsZSBUIHsgRjpmbG9hdDsgfSByb290X3R5cGUgVDsgeyBGOlwiXFxmMS4yZTMuXCIgfSIsICJpbnZhbGlkIik7CisgIFRlc3RFcnJvcigidGFibGUgVCB7IEY6ZmxvYXQ7IH0gcm9vdF90eXBlIFQ7IHsgRjpcIlxcdDEuMmUzLlwiIH0iLCAiaW52YWxpZCIpOworICBUZXN0RXJyb3IoInRhYmxlIFQgeyBGOmZsb2F0OyB9IHJvb3RfdHlwZSBUOyB7IEY6XCJcXG4xLjJlMy5cIiB9IiwgImludmFsaWQiKTsKKyAgVGVzdEVycm9yKCJ0YWJsZSBUIHsgRjpmbG9hdDsgfSByb290X3R5cGUgVDsgeyBGOlwiXFxyMS4yZTMuXCIgfSIsICJpbnZhbGlkIik7CisgIFRlc3RFcnJvcigidGFibGUgVCB7IEY6ZmxvYXQ7IH0gcm9vdF90eXBlIFQ7IHsgRjpcIjRcXHgwMDVcIiB9IiwgImludmFsaWQiKTsKKyAgVGVzdEVycm9yKCJ0YWJsZSBUIHsgRjpmbG9hdDsgfSByb290X3R5cGUgVDsgeyBGOlwiXCcxMlwnXCIgfSIsIGludmFsaWRfbXNnKTsKKyAgLy8gbnVsbCBpcyBub3QgYSBudW1iZXIgY29uc3RhbnQhCisgIFRlc3RFcnJvcigidGFibGUgVCB7IEY6ZmxvYXQ7IH0gcm9vdF90eXBlIFQ7IHsgRjpcIm51bGxcIiB9IiwgaW52YWxpZF9tc2cpOworICBUZXN0RXJyb3IoInRhYmxlIFQgeyBGOmZsb2F0OyB9IHJvb3RfdHlwZSBUOyB7IEY6bnVsbCB9IiwgaW52YWxpZF9tc2cpOworfQorCit2b2lkIFVuaWNvZGVJbnZhbGlkU3Vycm9nYXRlc1Rlc3QoKSB7CisgIFRlc3RFcnJvcigKKyAgICAgICJ0YWJsZSBUIHsgRjpzdHJpbmc7IH0iCisgICAgICAicm9vdF90eXBlIFQ7IgorICAgICAgInsgRjpcIlxcdUQ4MDBcIn0iLAorICAgICAgInVucGFpcmVkIGhpZ2ggc3Vycm9nYXRlIik7CisgIFRlc3RFcnJvcigKKyAgICAgICJ0YWJsZSBUIHsgRjpzdHJpbmc7IH0iCisgICAgICAicm9vdF90eXBlIFQ7IgorICAgICAgInsgRjpcIlxcdUQ4MDBhYmNkXCJ9IiwKKyAgICAgICJ1bnBhaXJlZCBoaWdoIHN1cnJvZ2F0ZSIpOworICBUZXN0RXJyb3IoCisgICAgICAidGFibGUgVCB7IEY6c3RyaW5nOyB9IgorICAgICAgInJvb3RfdHlwZSBUOyIKKyAgICAgICJ7IEY6XCJcXHVEODAwXFxuXCJ9IiwKKyAgICAgICJ1bnBhaXJlZCBoaWdoIHN1cnJvZ2F0ZSIpOworICBUZXN0RXJyb3IoCisgICAgICAidGFibGUgVCB7IEY6c3RyaW5nOyB9IgorICAgICAgInJvb3RfdHlwZSBUOyIKKyAgICAgICJ7IEY6XCJcXHVEODAwXFx1RDgwMFwifSIsCisgICAgICAibXVsdGlwbGUgaGlnaCBzdXJyb2dhdGVzIik7CisgIFRlc3RFcnJvcigKKyAgICAgICJ0YWJsZSBUIHsgRjpzdHJpbmc7IH0iCisgICAgICAicm9vdF90eXBlIFQ7IgorICAgICAgInsgRjpcIlxcdURDMDBcIn0iLAorICAgICAgInVucGFpcmVkIGxvdyBzdXJyb2dhdGUiKTsKK30KKwordm9pZCBJbnZhbGlkVVRGOFRlc3QoKSB7CisgIC8vICIxIGJ5dGUiIHBhdHRlcm4sIHVuZGVyIG1pbiBsZW5ndGggb2YgMiBieXRlcworICBUZXN0RXJyb3IoCisgICAgICAidGFibGUgVCB7IEY6c3RyaW5nOyB9IgorICAgICAgInJvb3RfdHlwZSBUOyIKKyAgICAgICJ7IEY6XCJceDgwXCJ9IiwKKyAgICAgICJpbGxlZ2FsIFVURi04IHNlcXVlbmNlIik7CisgIC8vIDIgYnl0ZSBwYXR0ZXJuLCBzdHJpbmcgdG9vIHNob3J0CisgIFRlc3RFcnJvcigKKyAgICAgICJ0YWJsZSBUIHsgRjpzdHJpbmc7IH0iCisgICAgICAicm9vdF90eXBlIFQ7IgorICAgICAgInsgRjpcIlx4REZcIn0iLAorICAgICAgImlsbGVnYWwgVVRGLTggc2VxdWVuY2UiKTsKKyAgLy8gMyBieXRlIHBhdHRlcm4sIHN0cmluZyB0b28gc2hvcnQKKyAgVGVzdEVycm9yKAorICAgICAgInRhYmxlIFQgeyBGOnN0cmluZzsgfSIKKyAgICAgICJyb290X3R5cGUgVDsiCisgICAgICAieyBGOlwiXHhFRlx4QkZcIn0iLAorICAgICAgImlsbGVnYWwgVVRGLTggc2VxdWVuY2UiKTsKKyAgLy8gNCBieXRlIHBhdHRlcm4sIHN0cmluZyB0b28gc2hvcnQKKyAgVGVzdEVycm9yKAorICAgICAgInRhYmxlIFQgeyBGOnN0cmluZzsgfSIKKyAgICAgICJyb290X3R5cGUgVDsiCisgICAgICAieyBGOlwiXHhGN1x4QkZceEJGXCJ9IiwKKyAgICAgICJpbGxlZ2FsIFVURi04IHNlcXVlbmNlIik7CisgIC8vICI1IGJ5dGUiIHBhdHRlcm4sIHN0cmluZyB0b28gc2hvcnQKKyAgVGVzdEVycm9yKAorICAgICAgInRhYmxlIFQgeyBGOnN0cmluZzsgfSIKKyAgICAgICJyb290X3R5cGUgVDsiCisgICAgICAieyBGOlwiXHhGQlx4QkZceEJGXHhCRlwifSIsCisgICAgICAiaWxsZWdhbCBVVEYtOCBzZXF1ZW5jZSIpOworICAvLyAiNiBieXRlIiBwYXR0ZXJuLCBzdHJpbmcgdG9vIHNob3J0CisgIFRlc3RFcnJvcigKKyAgICAgICJ0YWJsZSBUIHsgRjpzdHJpbmc7IH0iCisgICAgICAicm9vdF90eXBlIFQ7IgorICAgICAgInsgRjpcIlx4RkRceEJGXHhCRlx4QkZceEJGXCJ9IiwKKyAgICAgICJpbGxlZ2FsIFVURi04IHNlcXVlbmNlIik7CisgIC8vICI3IGJ5dGUiIHBhdHRlcm4sIHN0cmluZyB0b28gc2hvcnQKKyAgVGVzdEVycm9yKAorICAgICAgInRhYmxlIFQgeyBGOnN0cmluZzsgfSIKKyAgICAgICJyb290X3R5cGUgVDsiCisgICAgICAieyBGOlwiXHhGRVx4QkZceEJGXHhCRlx4QkZceEJGXCJ9IiwKKyAgICAgICJpbGxlZ2FsIFVURi04IHNlcXVlbmNlIik7CisgIC8vICI1IGJ5dGUiIHBhdHRlcm4sIG92ZXIgbWF4IGxlbmd0aCBvZiA0IGJ5dGVzCisgIFRlc3RFcnJvcigKKyAgICAgICJ0YWJsZSBUIHsgRjpzdHJpbmc7IH0iCisgICAgICAicm9vdF90eXBlIFQ7IgorICAgICAgInsgRjpcIlx4RkJceEJGXHhCRlx4QkZceEJGXCJ9IiwKKyAgICAgICJpbGxlZ2FsIFVURi04IHNlcXVlbmNlIik7CisgIC8vICI2IGJ5dGUiIHBhdHRlcm4sIG92ZXIgbWF4IGxlbmd0aCBvZiA0IGJ5dGVzCisgIFRlc3RFcnJvcigKKyAgICAgICJ0YWJsZSBUIHsgRjpzdHJpbmc7IH0iCisgICAgICAicm9vdF90eXBlIFQ7IgorICAgICAgInsgRjpcIlx4RkRceEJGXHhCRlx4QkZceEJGXHhCRlwifSIsCisgICAgICAiaWxsZWdhbCBVVEYtOCBzZXF1ZW5jZSIpOworICAvLyAiNyBieXRlIiBwYXR0ZXJuLCBvdmVyIG1heCBsZW5ndGggb2YgNCBieXRlcworICBUZXN0RXJyb3IoCisgICAgICAidGFibGUgVCB7IEY6c3RyaW5nOyB9IgorICAgICAgInJvb3RfdHlwZSBUOyIKKyAgICAgICJ7IEY6XCJceEZFXHhCRlx4QkZceEJGXHhCRlx4QkZceEJGXCJ9IiwKKyAgICAgICJpbGxlZ2FsIFVURi04IHNlcXVlbmNlIik7CisKKyAgLy8gVGhyZWUgaW52YWxpZCBlbmNvZGluZ3MgZm9yIFUrMDAwQSAoXG4sIGFrYSBORVdMSU5FKQorICBUZXN0RXJyb3IoCisgICAgICAidGFibGUgVCB7IEY6c3RyaW5nOyB9IgorICAgICAgInJvb3RfdHlwZSBUOyIKKyAgICAgICJ7IEY6XCJceEMwXHg4QVwifSIsCisgICAgICAiaWxsZWdhbCBVVEYtOCBzZXF1ZW5jZSIpOworICBUZXN0RXJyb3IoCisgICAgICAidGFibGUgVCB7IEY6c3RyaW5nOyB9IgorICAgICAgInJvb3RfdHlwZSBUOyIKKyAgICAgICJ7IEY6XCJceEUwXHg4MFx4OEFcIn0iLAorICAgICAgImlsbGVnYWwgVVRGLTggc2VxdWVuY2UiKTsKKyAgVGVzdEVycm9yKAorICAgICAgInRhYmxlIFQgeyBGOnN0cmluZzsgfSIKKyAgICAgICJyb290X3R5cGUgVDsiCisgICAgICAieyBGOlwiXHhGMFx4ODBceDgwXHg4QVwifSIsCisgICAgICAiaWxsZWdhbCBVVEYtOCBzZXF1ZW5jZSIpOworCisgIC8vIFR3byBpbnZhbGlkIGVuY29kaW5ncyBmb3IgVSswMEE5IChDT1BZUklHSFQgU1lNQk9MKQorICBUZXN0RXJyb3IoCisgICAgICAidGFibGUgVCB7IEY6c3RyaW5nOyB9IgorICAgICAgInJvb3RfdHlwZSBUOyIKKyAgICAgICJ7IEY6XCJceEUwXHg4MVx4QTlcIn0iLAorICAgICAgImlsbGVnYWwgVVRGLTggc2VxdWVuY2UiKTsKKyAgVGVzdEVycm9yKAorICAgICAgInRhYmxlIFQgeyBGOnN0cmluZzsgfSIKKyAgICAgICJyb290X3R5cGUgVDsiCisgICAgICAieyBGOlwiXHhGMFx4ODBceDgxXHhBOVwifSIsCisgICAgICAiaWxsZWdhbCBVVEYtOCBzZXF1ZW5jZSIpOworCisgIC8vIEludmFsaWQgZW5jb2RpbmcgZm9yIFUrMjBBQyAoRVVSTyBTWU1CT0wpCisgIFRlc3RFcnJvcigKKyAgICAgICJ0YWJsZSBUIHsgRjpzdHJpbmc7IH0iCisgICAgICAicm9vdF90eXBlIFQ7IgorICAgICAgInsgRjpcIlx4RjBceDgyXHg4Mlx4QUNcIn0iLAorICAgICAgImlsbGVnYWwgVVRGLTggc2VxdWVuY2UiKTsKKworICAvLyBVVEYtMTYgc3Vycm9nYXRlIHZhbHVlcyBiZXR3ZWVuIFUrRDgwMCBhbmQgVStERkZGIGNhbm5vdCBiZSBlbmNvZGVkIGluCisgIC8vIFVURi04CisgIFRlc3RFcnJvcigKKyAgICAgICJ0YWJsZSBUIHsgRjpzdHJpbmc7IH0iCisgICAgICAicm9vdF90eXBlIFQ7IgorICAgICAgLy8gVSsxMDQwMCAiZW5jb2RlZCIgYXMgVStEODAxIFUrREMwMAorICAgICAgInsgRjpcIlx4RURceEEwXHg4MVx4RURceEIwXHg4MFwifSIsCisgICAgICAiaWxsZWdhbCBVVEYtOCBzZXF1ZW5jZSIpOworCisgIC8vIENoZWNrIGluZGVwZW5kZW5jZSBvZiBpZGVudGlmaWVyIGZyb20gbG9jYWxlLgorICBzdGQ6OnN0cmluZyBsb2NhbGVfaWRlbnQ7CisgIGxvY2FsZV9pZGVudCArPSAidGFibGUgVCB7IEYiOworICBsb2NhbGVfaWRlbnQgKz0gc3RhdGljX2Nhc3Q8Y2hhcj4oLTMyKTsgIC8vIHVuc2lnbmVkIDB4RTAKKyAgbG9jYWxlX2lkZW50ICs9ICIgOnN0cmluZzsgfSI7CisgIGxvY2FsZV9pZGVudCArPSAicm9vdF90eXBlIFQ7IjsKKyAgbG9jYWxlX2lkZW50ICs9ICJ7fSI7CisgIFRlc3RFcnJvcihsb2NhbGVfaWRlbnQuY19zdHIoKSwgIiIpOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorVCBUZXN0VmFsdWUoY29uc3QgY2hhciAqanNvbiwgY29uc3QgY2hhciAqdHlwZV9uYW1lLAorICAgICAgICAgICAgY29uc3QgY2hhciAqZGVjbHMgPSBudWxscHRyKSB7CisgIGZsYXRidWZmZXJzOjpQYXJzZXIgcGFyc2VyOworICBwYXJzZXIuYnVpbGRlcl8uRm9yY2VEZWZhdWx0cyh0cnVlKTsgIC8vIHJldHVybiBkZWZhdWx0cworICBhdXRvIGNoZWNrX2RlZmF1bHQgPSBqc29uID8gZmFsc2UgOiB0cnVlOworICBpZiAoY2hlY2tfZGVmYXVsdCkgeyBwYXJzZXIub3B0cy5vdXRwdXRfZGVmYXVsdF9zY2FsYXJzX2luX2pzb24gPSB0cnVlOyB9CisgIC8vIFNpbXBsZSBzY2hlbWEuCisgIHN0ZDo6c3RyaW5nIHNjaGVtYSA9IHN0ZDo6c3RyaW5nKGRlY2xzID8gZGVjbHMgOiAiIikgKyAiXG4iICsKKyAgICAgICAgICAgICAgICAgICAgICAgInRhYmxlIFggeyB5OiIgKyBzdGQ6OnN0cmluZyh0eXBlX25hbWUpICsKKyAgICAgICAgICAgICAgICAgICAgICAgIjsgfSByb290X3R5cGUgWDsiOworICBhdXRvIHNjaGVtYV9kb25lID0gcGFyc2VyLlBhcnNlKHNjaGVtYS5jX3N0cigpKTsKKyAgVEVTVF9FUV9TVFIocGFyc2VyLmVycm9yXy5jX3N0cigpLCAiIik7CisgIFRFU1RfRVEoc2NoZW1hX2RvbmUsIHRydWUpOworCisgIGF1dG8gZG9uZSA9IHBhcnNlci5QYXJzZShjaGVja19kZWZhdWx0ID8gInt9IiA6IGpzb24pOworICBURVNUX0VRX1NUUihwYXJzZXIuZXJyb3JfLmNfc3RyKCksICIiKTsKKyAgVEVTVF9FUShkb25lLCB0cnVlKTsKKworICAvLyBDaGVjayB3aXRoIHByaW50LgorICBzdGQ6OnN0cmluZyBwcmludF9iYWNrOworICBwYXJzZXIub3B0cy5pbmRlbnRfc3RlcCA9IC0xOworICBURVNUX0VRKEdlbmVyYXRlVGV4dChwYXJzZXIsIHBhcnNlci5idWlsZGVyXy5HZXRCdWZmZXJQb2ludGVyKCksICZwcmludF9iYWNrKSwKKyAgICAgICAgICB0cnVlKTsKKyAgLy8gcmVzdG9yZSB2YWx1ZSBmcm9tIGl0cyBkZWZhdWx0CisgIGlmIChjaGVja19kZWZhdWx0KSB7IFRFU1RfRVEocGFyc2VyLlBhcnNlKHByaW50X2JhY2suY19zdHIoKSksIHRydWUpOyB9CisKKyAgYXV0byByb290ID0gZmxhdGJ1ZmZlcnM6OkdldFJvb3Q8ZmxhdGJ1ZmZlcnM6OlRhYmxlPigKKyAgICAgIHBhcnNlci5idWlsZGVyXy5HZXRCdWZmZXJQb2ludGVyKCkpOworICByZXR1cm4gcm9vdC0+R2V0RmllbGQ8VD4oZmxhdGJ1ZmZlcnM6OkZpZWxkSW5kZXhUb09mZnNldCgwKSwgMCk7Cit9CisKKy8vIEFkZGl0aW9uYWwgcGFyc2VyIHRlc3Rpbmcgbm90IGNvdmVyZWQgZWxzZXdoZXJlLgordm9pZCBWYWx1ZVRlc3QoKSB7CisgIC8vIFRlc3Qgc2NpZW50aWZpYyBub3RhdGlvbiBudW1iZXJzLgorICBURVNUX0VRKAorICAgICAgRmxvYXRDb21wYXJlKFRlc3RWYWx1ZTxmbG9hdD4oInsgeTowLjAzMTQxNTllKzIgfSIsICJmbG9hdCIpLCAzLjE0MTU5ZiksCisgICAgICB0cnVlKTsKKyAgLy8gbnVtYmVyIGluIHN0cmluZworICBURVNUX0VRKEZsb2F0Q29tcGFyZShUZXN0VmFsdWU8ZmxvYXQ+KCJ7IHk6XCIwLjAzMTQxNTllKzJcIiB9IiwgImZsb2F0IiksCisgICAgICAgICAgICAgICAgICAgICAgIDMuMTQxNTlmKSwKKyAgICAgICAgICB0cnVlKTsKKworICAvLyBUZXN0IGNvbnZlcnNpb24gZnVuY3Rpb25zLgorICBURVNUX0VRKEZsb2F0Q29tcGFyZShUZXN0VmFsdWU8ZmxvYXQ+KCJ7IHk6Y29zKHJhZCgxODApKSB9IiwgImZsb2F0IiksIC0xKSwKKyAgICAgICAgICB0cnVlKTsKKworICAvLyBpbnQgZW1iZWRkZWQgdG8gc3RyaW5nCisgIFRFU1RfRVEoVGVzdFZhbHVlPGludD4oInsgeTpcIi04NzZcIiB9IiwgImludD0tMTIzIiksIC04NzYpOworICBURVNUX0VRKFRlc3RWYWx1ZTxpbnQ+KCJ7IHk6XCI4NzZcIiB9IiwgImludD0tMTIzIiksIDg3Nik7CisKKyAgLy8gVGVzdCBuZWdhdGl2ZSBoZXggY29uc3RhbnQuCisgIFRFU1RfRVEoVGVzdFZhbHVlPGludD4oInsgeTotMHg4ZWEwIH0iLCAiaW50PS0weDhlYTAiKSwgLTM2NTEyKTsKKyAgVEVTVF9FUShUZXN0VmFsdWU8aW50PihudWxscHRyLCAiaW50PS0weDhlYTAiKSwgLTM2NTEyKTsKKworICAvLyBwb3NpdGl2ZSBoZXggY29uc3RhbnQKKyAgVEVTVF9FUShUZXN0VmFsdWU8aW50PigieyB5OjB4MWFiY2RlZiB9IiwgImludD0weDEiKSwgMHgxYWJjZGVmKTsKKyAgLy8gd2l0aCBvcHRpb25hbCAnKycgc2lnbgorICBURVNUX0VRKFRlc3RWYWx1ZTxpbnQ+KCJ7IHk6KzB4MWFiY2RlZiB9IiwgImludD0rMHgxIiksIDB4MWFiY2RlZik7CisgIC8vIGhleCBpbiBzdHJpbmcKKyAgVEVTVF9FUShUZXN0VmFsdWU8aW50PigieyB5OlwiMHgxYWJjZGVmXCIgfSIsICJpbnQ9KzB4MSIpLCAweDFhYmNkZWYpOworCisgIC8vIE1ha2Ugc3VyZSB3ZSBkbyB1bnNpZ25lZCA2NGJpdCBjb3JyZWN0bHkuCisgIFRFU1RfRVEoVGVzdFZhbHVlPHVpbnQ2NF90PigieyB5OjEyMzM1MDg5NjQ0Njg4MzQwMTMzIH0iLCAidWxvbmciKSwKKyAgICAgICAgICAxMjMzNTA4OTY0NDY4ODM0MDEzM1VMTCk7CisKKyAgLy8gYm9vbCBpbiBzdHJpbmcKKyAgVEVTVF9FUShUZXN0VmFsdWU8Ym9vbD4oInsgeTpcImZhbHNlXCIgfSIsICJib29sPXRydWUiKSwgZmFsc2UpOworICBURVNUX0VRKFRlc3RWYWx1ZTxib29sPigieyB5OlwidHJ1ZVwiIH0iLCAiYm9vbD1cInRydWVcIiIpLCB0cnVlKTsKKyAgVEVTVF9FUShUZXN0VmFsdWU8Ym9vbD4oInsgeTonZmFsc2UnIH0iLCAiYm9vbD10cnVlIiksIGZhbHNlKTsKKyAgVEVTVF9FUShUZXN0VmFsdWU8Ym9vbD4oInsgeTondHJ1ZScgfSIsICJib29sPVwidHJ1ZVwiIiksIHRydWUpOworCisgIC8vIGNoZWNrIGNvbW1lbnRzIGJlZm9yZSBhbmQgYWZ0ZXIganNvbiBvYmplY3QKKyAgVEVTVF9FUShUZXN0VmFsdWU8aW50PigiLypiZWZvcmUqLyB7IHk6MSB9IC8qYWZ0ZXIqLyIsICJpbnQiKSwgMSk7CisgIFRFU1RfRVEoVGVzdFZhbHVlPGludD4oIi8vYmVmb3JlIFxuIHsgeToxIH0gLy9hZnRlciIsICJpbnQiKSwgMSk7Cit9CisKK3ZvaWQgTmVzdGVkTGlzdFRlc3QoKSB7CisgIGZsYXRidWZmZXJzOjpQYXJzZXIgcGFyc2VyMTsKKyAgVEVTVF9FUShwYXJzZXIxLlBhcnNlKCJzdHJ1Y3QgVGVzdCB7IGE6c2hvcnQ7IGI6Ynl0ZTsgfSB0YWJsZSBUIHsgRjpbVGVzdF07IH0iCisgICAgICAgICAgICAgICAgICAgICAgICAicm9vdF90eXBlIFQ7IgorICAgICAgICAgICAgICAgICAgICAgICAgInsgRjpbIFsxMCwyMF0sIFszMCw0MF1dIH0iKSwKKyAgICAgICAgICB0cnVlKTsKK30KKwordm9pZCBFbnVtU3RyaW5nc1Rlc3QoKSB7CisgIGZsYXRidWZmZXJzOjpQYXJzZXIgcGFyc2VyMTsKKyAgVEVTVF9FUShwYXJzZXIxLlBhcnNlKCJlbnVtIEU6Ynl0ZSB7IEEsIEIsIEMgfSB0YWJsZSBUIHsgRjpbRV07IH0iCisgICAgICAgICAgICAgICAgICAgICAgICAicm9vdF90eXBlIFQ7IgorICAgICAgICAgICAgICAgICAgICAgICAgInsgRjpbIEEsIEIsIFwiQ1wiLCBcIkEgQiBDXCIgXSB9IiksCisgICAgICAgICAgdHJ1ZSk7CisgIGZsYXRidWZmZXJzOjpQYXJzZXIgcGFyc2VyMjsKKyAgVEVTVF9FUShwYXJzZXIyLlBhcnNlKCJlbnVtIEU6Ynl0ZSB7IEEsIEIsIEMgfSB0YWJsZSBUIHsgRjpbaW50XTsgfSIKKyAgICAgICAgICAgICAgICAgICAgICAgICJyb290X3R5cGUgVDsiCisgICAgICAgICAgICAgICAgICAgICAgICAieyBGOlsgXCJFLkNcIiwgXCJFLkEgRS5CIEUuQ1wiIF0gfSIpLAorICAgICAgICAgIHRydWUpOworICAvLyB1bnNpZ25lZCBiaXRfZmxhZ3MKKyAgZmxhdGJ1ZmZlcnM6OlBhcnNlciBwYXJzZXIzOworICBURVNUX0VRKAorICAgICAgcGFyc2VyMy5QYXJzZSgiZW51bSBFOnVpbnQxNiAoYml0X2ZsYWdzKSB7IEYwLCBGMDc9NywgRjA4LCBGMTQ9MTQsIEYxNSB9IgorICAgICAgICAgICAgICAgICAgICAiIHRhYmxlIFQgeyBGOiBFID0gXCJGMTUgRjA4XCI7IH0iCisgICAgICAgICAgICAgICAgICAgICJyb290X3R5cGUgVDsiKSwKKyAgICAgIHRydWUpOworfQorCit2b2lkIEVudW1WYWx1ZVRlc3QoKSB7CisgIC8vIGpzb246ICJ7IFk6MCB9Iiwgc2NoZW1hOiB0YWJsZSBYIHsgeTogIkUifQorICAvLyAwIGluIGVudW0gKFY9MCkgRSB0aGVuIFk9MCBpcyB2YWxpZC4KKyAgVEVTVF9FUShUZXN0VmFsdWU8aW50PigieyB5OjAgfSIsICJFIiwgImVudW0gRTppbnQgeyBWIH0iKSwgMCk7CisgIFRFU1RfRVEoVGVzdFZhbHVlPGludD4oInsgeTpWIH0iLCAiRSIsICJlbnVtIEU6aW50IHsgViB9IiksIDApOworICAvLyBBIGRlZmF1bHQgdmFsdWUgb2YgWSBpcyAwLgorICBURVNUX0VRKFRlc3RWYWx1ZTxpbnQ+KCJ7IH0iLCAiRSIsICJlbnVtIEU6aW50IHsgViB9IiksIDApOworICBURVNUX0VRKFRlc3RWYWx1ZTxpbnQ+KCJ7IHk6NSB9IiwgIkU9ViIsICJlbnVtIEU6aW50IHsgVj01IH0iKSwgNSk7CisgIC8vIEdlbmVyYXRlIGpzb24gd2l0aCBkZWZhdWx0cyBhbmQgY2hlY2suCisgIFRFU1RfRVEoVGVzdFZhbHVlPGludD4obnVsbHB0ciwgIkU9ViIsICJlbnVtIEU6aW50IHsgVj01IH0iKSwgNSk7CisgIC8vIDUgaW4gZW51bQorICBURVNUX0VRKFRlc3RWYWx1ZTxpbnQ+KCJ7IHk6NSB9IiwgIkUiLCAiZW51bSBFOmludCB7IFosIFY9NSB9IiksIDUpOworICBURVNUX0VRKFRlc3RWYWx1ZTxpbnQ+KCJ7IHk6NSB9IiwgIkU9ViIsICJlbnVtIEU6aW50IHsgWiwgVj01IH0iKSwgNSk7CisgIC8vIEdlbmVyYXRlIGpzb24gd2l0aCBkZWZhdWx0cyBhbmQgY2hlY2suCisgIFRFU1RfRVEoVGVzdFZhbHVlPGludD4obnVsbHB0ciwgIkUiLCAiZW51bSBFOmludCB7IFosIFY9NSB9IiksIDApOworICBURVNUX0VRKFRlc3RWYWx1ZTxpbnQ+KG51bGxwdHIsICJFPVYiLCAiZW51bSBFOmludCB7IFosIFY9NSB9IiksIDUpOworICAvLyB1ODQgdGVzdAorICBURVNUX0VRKFRlc3RWYWx1ZTx1aW50NjRfdD4obnVsbHB0ciwgIkU9ViIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZW51bSBFOnVsb25nIHsgViA9IDEzODM1MDU4MDU1MjgyMTYzNzEyIH0iKSwKKyAgICAgICAgICAxMzgzNTA1ODA1NTI4MjE2MzcxMlVMTCk7CisgIFRFU1RfRVEoVGVzdFZhbHVlPHVpbnQ2NF90PihudWxscHRyLCAiRT1WIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJlbnVtIEU6dWxvbmcgeyBWID0gMTg0NDY3NDQwNzM3MDk1NTE2MTUgfSIpLAorICAgICAgICAgIDE4NDQ2NzQ0MDczNzA5NTUxNjE1VUxMKTsKKyAgLy8gQXNzaWduIG5vbi1lbnVtIHZhbHVlIHRvIGVudW0gZmllbGQuIElzIGl0IHJpZ2h0PworICBURVNUX0VRKFRlc3RWYWx1ZTxpbnQ+KCJ7IHk6NyB9IiwgIkUiLCAiZW51bSBFOmludCB7IFYgPSAwIH0iKSwgNyk7CisgIC8vIENoZWNrIHRoYXQgbm9uLWFzY2VuZGluZyB2YWx1ZXMgYXJlIHZhbGlkLgorICBURVNUX0VRKFRlc3RWYWx1ZTxpbnQ+KCJ7IHk6NSB9IiwgIkU9ViIsICJlbnVtIEU6aW50IHsgWj0xMCwgVj01IH0iKSwgNSk7Cit9CisKK3ZvaWQgSW50ZWdlckJvdW5kYXJ5VGVzdCgpIHsKKyAgLy8gQ2hlY2sgbnVtZXJpY2FsIGNvbXBhdGliaWxpdHkgd2l0aCBub24tQysrIGxhbmd1YWdlcy4KKyAgLy8gQnkgdGhlIEMrKyBzdGFuZGFyZCwgc3RkOjpudW1lcmljYWxfbGltaXRzPGludDY0X3Q+OjptaW4oKSA9PQorICAvLyAtOTIyMzM3MjAzNjg1NDc3NTgwNyAoLTJeNjMrMSkgb3IgbGVzcyogVGhlIEZsYXRidWZmZXJzIGdyYW1tYXIgYW5kIG1vc3Qgb2YKKyAgLy8gdGhlIGxhbmd1YWdlcyAoQyMsIEphdmEsIFJ1c3QpIGV4cGVjdCB0aGF0IG1pbmltdW0gdmFsdWVzIGFyZTogLTEyOCwKKyAgLy8gLTMyNzY4LC4uLCAtOTIyMzM3MjAzNjg1NDc3NTgwOC4gU2luY2UgQysrMjAsCisgIC8vIHN0YXRpY19jYXN0PGludDY0PigweDgwMDAwMDAwMDAwMDAwMDBVTEwpIGlzIHdlbGwtZGVmaW5lZCB0d28ncyBjb21wbGVtZW50CisgIC8vIGNhc3QuIFRoZXJlZm9yZSAtOTIyMzM3MjAzNjg1NDc3NTgwOCBzaG91bGQgYmUgdmFsaWQgbmVnYXRpdmUgdmFsdWUuCisgIFRFU1RfRVEoZmxhdGJ1ZmZlcnM6Om51bWVyaWNfbGltaXRzPGludDhfdD46Om1pbigpLCAtMTI4KTsKKyAgVEVTVF9FUShmbGF0YnVmZmVyczo6bnVtZXJpY19saW1pdHM8aW50OF90Pjo6bWF4KCksIDEyNyk7CisgIFRFU1RfRVEoZmxhdGJ1ZmZlcnM6Om51bWVyaWNfbGltaXRzPGludDE2X3Q+OjptaW4oKSwgLTMyNzY4KTsKKyAgVEVTVF9FUShmbGF0YnVmZmVyczo6bnVtZXJpY19saW1pdHM8aW50MTZfdD46Om1heCgpLCAzMjc2Nyk7CisgIFRFU1RfRVEoZmxhdGJ1ZmZlcnM6Om51bWVyaWNfbGltaXRzPGludDMyX3Q+OjptaW4oKSArIDEsIC0yMTQ3NDgzNjQ3KTsKKyAgVEVTVF9FUShmbGF0YnVmZmVyczo6bnVtZXJpY19saW1pdHM8aW50MzJfdD46Om1heCgpLCAyMTQ3NDgzNjQ3VUxMKTsKKyAgVEVTVF9FUShmbGF0YnVmZmVyczo6bnVtZXJpY19saW1pdHM8aW50NjRfdD46Om1pbigpICsgMUxMLAorICAgICAgICAgIC05MjIzMzcyMDM2ODU0Nzc1ODA3TEwpOworICBURVNUX0VRKGZsYXRidWZmZXJzOjpudW1lcmljX2xpbWl0czxpbnQ2NF90Pjo6bWF4KCksIDkyMjMzNzIwMzY4NTQ3NzU4MDdVTEwpOworICBURVNUX0VRKGZsYXRidWZmZXJzOjpudW1lcmljX2xpbWl0czx1aW50OF90Pjo6bWF4KCksIDI1NSk7CisgIFRFU1RfRVEoZmxhdGJ1ZmZlcnM6Om51bWVyaWNfbGltaXRzPHVpbnQxNl90Pjo6bWF4KCksIDY1NTM1KTsKKyAgVEVTVF9FUShmbGF0YnVmZmVyczo6bnVtZXJpY19saW1pdHM8dWludDMyX3Q+OjptYXgoKSwgNDI5NDk2NzI5NVVMTCk7CisgIFRFU1RfRVEoZmxhdGJ1ZmZlcnM6Om51bWVyaWNfbGltaXRzPHVpbnQ2NF90Pjo6bWF4KCksCisgICAgICAgICAgMTg0NDY3NDQwNzM3MDk1NTE2MTVVTEwpOworCisgIFRFU1RfRVEoVGVzdFZhbHVlPGludDhfdD4oInsgeToxMjcgfSIsICJieXRlIiksIDEyNyk7CisgIFRFU1RfRVEoVGVzdFZhbHVlPGludDhfdD4oInsgeTotMTI4IH0iLCAiYnl0ZSIpLCAtMTI4KTsKKyAgVEVTVF9FUShUZXN0VmFsdWU8dWludDhfdD4oInsgeToyNTUgfSIsICJ1Ynl0ZSIpLCAyNTUpOworICBURVNUX0VRKFRlc3RWYWx1ZTx1aW50OF90PigieyB5OjAgfSIsICJ1Ynl0ZSIpLCAwKTsKKyAgVEVTVF9FUShUZXN0VmFsdWU8aW50MTZfdD4oInsgeTozMjc2NyB9IiwgInNob3J0IiksIDMyNzY3KTsKKyAgVEVTVF9FUShUZXN0VmFsdWU8aW50MTZfdD4oInsgeTotMzI3NjggfSIsICJzaG9ydCIpLCAtMzI3NjgpOworICBURVNUX0VRKFRlc3RWYWx1ZTx1aW50MTZfdD4oInsgeTo2NTUzNSB9IiwgInVzaG9ydCIpLCA2NTUzNSk7CisgIFRFU1RfRVEoVGVzdFZhbHVlPHVpbnQxNl90PigieyB5OjAgfSIsICJ1c2hvcnQiKSwgMCk7CisgIFRFU1RfRVEoVGVzdFZhbHVlPGludDMyX3Q+KCJ7IHk6MjE0NzQ4MzY0NyB9IiwgImludCIpLCAyMTQ3NDgzNjQ3KTsKKyAgVEVTVF9FUShUZXN0VmFsdWU8aW50MzJfdD4oInsgeTotMjE0NzQ4MzY0OCB9IiwgImludCIpICsgMSwgLTIxNDc0ODM2NDcpOworICBURVNUX0VRKFRlc3RWYWx1ZTx1aW50MzJfdD4oInsgeTo0Mjk0OTY3Mjk1IH0iLCAidWludCIpLCA0Mjk0OTY3Mjk1KTsKKyAgVEVTVF9FUShUZXN0VmFsdWU8dWludDMyX3Q+KCJ7IHk6MCB9IiwgInVpbnQiKSwgMCk7CisgIFRFU1RfRVEoVGVzdFZhbHVlPGludDY0X3Q+KCJ7IHk6OTIyMzM3MjAzNjg1NDc3NTgwNyB9IiwgImxvbmciKSwKKyAgICAgICAgICA5MjIzMzcyMDM2ODU0Nzc1ODA3TEwpOworICBURVNUX0VRKFRlc3RWYWx1ZTxpbnQ2NF90PigieyB5Oi05MjIzMzcyMDM2ODU0Nzc1ODA4IH0iLCAibG9uZyIpICsgMUxMLAorICAgICAgICAgIC05MjIzMzcyMDM2ODU0Nzc1ODA3TEwpOworICBURVNUX0VRKFRlc3RWYWx1ZTx1aW50NjRfdD4oInsgeToxODQ0Njc0NDA3MzcwOTU1MTYxNSB9IiwgInVsb25nIiksCisgICAgICAgICAgMTg0NDY3NDQwNzM3MDk1NTE2MTVVTEwpOworICBURVNUX0VRKFRlc3RWYWx1ZTx1aW50NjRfdD4oInsgeTowIH0iLCAidWxvbmciKSwgMCk7CisgIFRFU1RfRVEoVGVzdFZhbHVlPHVpbnQ2NF90PigieyB5OiAxODQ0Njc0NDA3MzcwOTU1MTYxNSB9IiwgInVpbnQ2NCIpLAorICAgICAgICAgIDE4NDQ2NzQ0MDczNzA5NTUxNjE1VUxMKTsKKyAgLy8gY2hlY2sgdGhhdCB0aGUgZGVmYXVsdCB3b3JrcworICBURVNUX0VRKFRlc3RWYWx1ZTx1aW50NjRfdD4obnVsbHB0ciwgInVpbnQ2NCA9IDE4NDQ2NzQ0MDczNzA5NTUxNjE1IiksCisgICAgICAgICAgMTg0NDY3NDQwNzM3MDk1NTE2MTVVTEwpOworfQorCit2b2lkIFZhbGlkRmxvYXRUZXN0KCkgeworICAvLyBjaGVjayByb3VuZGluZyB0byBpbmZpbml0eQorICBURVNUX0VRKFRlc3RWYWx1ZTxmbG9hdD4oInsgeTorMy40MDI5ZSszOCB9IiwgImZsb2F0IiksICtpbmZpbml0eV9mKTsKKyAgVEVTVF9FUShUZXN0VmFsdWU8ZmxvYXQ+KCJ7IHk6LTMuNDAyOWUrMzggfSIsICJmbG9hdCIpLCAtaW5maW5pdHlfZik7CisgIFRFU1RfRVEoVGVzdFZhbHVlPGRvdWJsZT4oInsgeTorMS43OTc3ZSszMDggfSIsICJkb3VibGUiKSwgK2luZmluaXR5X2QpOworICBURVNUX0VRKFRlc3RWYWx1ZTxkb3VibGU+KCJ7IHk6LTEuNzk3N2UrMzA4IH0iLCAiZG91YmxlIiksIC1pbmZpbml0eV9kKTsKKworICBURVNUX0VRKAorICAgICAgRmxvYXRDb21wYXJlKFRlc3RWYWx1ZTxmbG9hdD4oInsgeTowLjAzMTQxNTllKzIgfSIsICJmbG9hdCIpLCAzLjE0MTU5ZiksCisgICAgICB0cnVlKTsKKyAgLy8gZmxvYXQgaW4gc3RyaW5nCisgIFRFU1RfRVEoRmxvYXRDb21wYXJlKFRlc3RWYWx1ZTxmbG9hdD4oInsgeTpcIiAwLjAzMTQxNTllKzIgIFwiIH0iLCAiZmxvYXQiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgMy4xNDE1OWYpLAorICAgICAgICAgIHRydWUpOworCisgIFRFU1RfRVEoVGVzdFZhbHVlPGZsb2F0PigieyB5OjEgfSIsICJmbG9hdCIpLCAxLjBmKTsKKyAgVEVTVF9FUShUZXN0VmFsdWU8ZmxvYXQ+KCJ7IHk6MS4wIH0iLCAiZmxvYXQiKSwgMS4wZik7CisgIFRFU1RfRVEoVGVzdFZhbHVlPGZsb2F0PigieyB5OjEuIH0iLCAiZmxvYXQiKSwgMS4wZik7CisgIFRFU1RfRVEoVGVzdFZhbHVlPGZsb2F0PigieyB5OisxLiB9IiwgImZsb2F0IiksIDEuMGYpOworICBURVNUX0VRKFRlc3RWYWx1ZTxmbG9hdD4oInsgeTotMS4gfSIsICJmbG9hdCIpLCAtMS4wZik7CisgIFRFU1RfRVEoVGVzdFZhbHVlPGZsb2F0PigieyB5OjEuZTAgfSIsICJmbG9hdCIpLCAxLjBmKTsKKyAgVEVTVF9FUShUZXN0VmFsdWU8ZmxvYXQ+KCJ7IHk6MS5lKzAgfSIsICJmbG9hdCIpLCAxLjBmKTsKKyAgVEVTVF9FUShUZXN0VmFsdWU8ZmxvYXQ+KCJ7IHk6MS5lLTAgfSIsICJmbG9hdCIpLCAxLjBmKTsKKyAgVEVTVF9FUShUZXN0VmFsdWU8ZmxvYXQ+KCJ7IHk6MC4xMjUgfSIsICJmbG9hdCIpLCAwLjEyNWYpOworICBURVNUX0VRKFRlc3RWYWx1ZTxmbG9hdD4oInsgeTouMTI1IH0iLCAiZmxvYXQiKSwgMC4xMjVmKTsKKyAgVEVTVF9FUShUZXN0VmFsdWU8ZmxvYXQ+KCJ7IHk6LS4xMjUgfSIsICJmbG9hdCIpLCAtMC4xMjVmKTsKKyAgVEVTVF9FUShUZXN0VmFsdWU8ZmxvYXQ+KCJ7IHk6Ky4xMjUgfSIsICJmbG9hdCIpLCArMC4xMjVmKTsKKyAgVEVTVF9FUShUZXN0VmFsdWU8ZmxvYXQ+KCJ7IHk6NSB9IiwgImZsb2F0IiksIDUuMGYpOworICBURVNUX0VRKFRlc3RWYWx1ZTxmbG9hdD4oInsgeTpcIjVcIiB9IiwgImZsb2F0IiksIDUuMGYpOworCisjaWYgZGVmaW5lZChGTEFUQlVGRkVSU19IQVNfTkVXX1NUUlRPRCkgJiYgKEZMQVRCVUZGRVJTX0hBU19ORVdfU1RSVE9EID4gMCkKKyAgLy8gT2xkIE1TVkMgdmVyc2lvbnMgbWF5IGhhdmUgcHJvYmxlbSB3aXRoIHRoaXMgY2hlY2suCisgIC8vIGh0dHBzOi8vd3d3LmV4cGxvcmluZ2JpbmFyeS5jb20vdmlzdWFsLWMtcGx1cy1wbHVzLXN0cnRvZC1zdGlsbC1icm9rZW4vCisgIFRFU1RfRVEoVGVzdFZhbHVlPGRvdWJsZT4oInsgeTo2LjkyOTQ5NTY0NDYwMDkxOTVlMTUgfSIsICJkb3VibGUiKSwKKyAgICAgICAgICA2OTI5NDk1NjQ0NjAwOTIwLjApOworICAvLyBjaGVjayBuYW4ncworICBURVNUX0VRKHN0ZDo6aXNuYW4oVGVzdFZhbHVlPGRvdWJsZT4oInsgeTpuYW4gfSIsICJkb3VibGUiKSksIHRydWUpOworICBURVNUX0VRKHN0ZDo6aXNuYW4oVGVzdFZhbHVlPGZsb2F0PigieyB5Om5hbiB9IiwgImZsb2F0IikpLCB0cnVlKTsKKyAgVEVTVF9FUShzdGQ6OmlzbmFuKFRlc3RWYWx1ZTxmbG9hdD4oInsgeTpcIm5hblwiIH0iLCAiZmxvYXQiKSksIHRydWUpOworICBURVNUX0VRKHN0ZDo6aXNuYW4oVGVzdFZhbHVlPGZsb2F0PigieyB5OlwiK25hblwiIH0iLCAiZmxvYXQiKSksIHRydWUpOworICBURVNUX0VRKHN0ZDo6aXNuYW4oVGVzdFZhbHVlPGZsb2F0PigieyB5OlwiLW5hblwiIH0iLCAiZmxvYXQiKSksIHRydWUpOworICBURVNUX0VRKHN0ZDo6aXNuYW4oVGVzdFZhbHVlPGZsb2F0PigieyB5OituYW4gfSIsICJmbG9hdCIpKSwgdHJ1ZSk7CisgIFRFU1RfRVEoc3RkOjppc25hbihUZXN0VmFsdWU8ZmxvYXQ+KCJ7IHk6LW5hbiB9IiwgImZsb2F0IikpLCB0cnVlKTsKKyAgVEVTVF9FUShzdGQ6OmlzbmFuKFRlc3RWYWx1ZTxmbG9hdD4obnVsbHB0ciwgImZsb2F0PW5hbiIpKSwgdHJ1ZSk7CisgIFRFU1RfRVEoc3RkOjppc25hbihUZXN0VmFsdWU8ZmxvYXQ+KG51bGxwdHIsICJmbG9hdD0tbmFuIikpLCB0cnVlKTsKKyAgLy8gY2hlY2sgaW5mCisgIFRFU1RfRVEoVGVzdFZhbHVlPGZsb2F0PigieyB5OmluZiB9IiwgImZsb2F0IiksIGluZmluaXR5X2YpOworICBURVNUX0VRKFRlc3RWYWx1ZTxmbG9hdD4oInsgeTpcImluZlwiIH0iLCAiZmxvYXQiKSwgaW5maW5pdHlfZik7CisgIFRFU1RfRVEoVGVzdFZhbHVlPGZsb2F0PigieyB5OlwiLWluZlwiIH0iLCAiZmxvYXQiKSwgLWluZmluaXR5X2YpOworICBURVNUX0VRKFRlc3RWYWx1ZTxmbG9hdD4oInsgeTpcIitpbmZcIiB9IiwgImZsb2F0IiksIGluZmluaXR5X2YpOworICBURVNUX0VRKFRlc3RWYWx1ZTxmbG9hdD4oInsgeToraW5mIH0iLCAiZmxvYXQiKSwgaW5maW5pdHlfZik7CisgIFRFU1RfRVEoVGVzdFZhbHVlPGZsb2F0PigieyB5Oi1pbmYgfSIsICJmbG9hdCIpLCAtaW5maW5pdHlfZik7CisgIFRFU1RfRVEoVGVzdFZhbHVlPGZsb2F0PihudWxscHRyLCAiZmxvYXQ9aW5mIiksIGluZmluaXR5X2YpOworICBURVNUX0VRKFRlc3RWYWx1ZTxmbG9hdD4obnVsbHB0ciwgImZsb2F0PS1pbmYiKSwgLWluZmluaXR5X2YpOworICBUZXN0VmFsdWU8ZG91YmxlPigKKyAgICAgICJ7IHk6IFswLjIsIC4yLCAxLjAsIC0xLjAsIC0yLiwgMi4sIDFlMCwgLTFlMCwgMS4wZTAsIC0xLjBlMCwgLTMuZTIsICIKKyAgICAgICIzLjBlMl0gfSIsCisgICAgICAiW2RvdWJsZV0iKTsKKyAgVGVzdFZhbHVlPGZsb2F0PigKKyAgICAgICJ7IHk6IFswLjIsIC4yLCAxLjAsIC0xLjAsIC0yLiwgMi4sIDFlMCwgLTFlMCwgMS4wZTAsIC0xLjBlMCwgLTMuZTIsICIKKyAgICAgICIzLjBlMl0gfSIsCisgICAgICAiW2Zsb2F0XSIpOworCisgIC8vIFRlc3QgYmluYXJ5IGZvcm1hdCBvZiBmbG9hdCBwb2ludC4KKyAgLy8gaHR0cHM6Ly9lbi5jcHByZWZlcmVuY2UuY29tL3cvY3BwL2xhbmd1YWdlL2Zsb2F0aW5nX2xpdGVyYWwKKyAgLy8gMHgxMS4xMnAtMSA9ICgxKjE2XjEgKyAyKjE2XjAgKyAzKjE2Xi0xICsgNCoxNl4tMikgKiAyXi0xID0KKyAgVEVTVF9FUShUZXN0VmFsdWU8ZG91YmxlPigieyB5OjB4MTIuMzRwLTEgfSIsICJkb3VibGUiKSwgOS4xMDE1NjI1KTsKKyAgLy8gaGV4IGZyYWN0aW9uIDEuMiAoZGVjaW1hbCAxLjEyNSkgc2NhbGVkIGJ5IDJeMywgdGhhdCBpcyA5LjAKKyAgVEVTVF9FUShUZXN0VmFsdWU8ZmxvYXQ+KCJ7IHk6LTB4MC4ycDAgfSIsICJmbG9hdCIpLCAtMC4xMjVmKTsKKyAgVEVTVF9FUShUZXN0VmFsdWU8ZmxvYXQ+KCJ7IHk6LTB4LjJwMSB9IiwgImZsb2F0IiksIC0wLjI1Zik7CisgIFRFU1RfRVEoVGVzdFZhbHVlPGZsb2F0PigieyB5OjB4MS4ycDMgfSIsICJmbG9hdCIpLCA5LjBmKTsKKyAgVEVTVF9FUShUZXN0VmFsdWU8ZmxvYXQ+KCJ7IHk6MHgxMC4xcDAgfSIsICJmbG9hdCIpLCAxNi4wNjI1Zik7CisgIFRFU1RfRVEoVGVzdFZhbHVlPGRvdWJsZT4oInsgeToweDEuMnAzIH0iLCAiZG91YmxlIiksIDkuMCk7CisgIFRFU1RfRVEoVGVzdFZhbHVlPGRvdWJsZT4oInsgeToweDEwLjFwMCB9IiwgImRvdWJsZSIpLCAxNi4wNjI1KTsKKyAgVEVTVF9FUShUZXN0VmFsdWU8ZG91YmxlPigieyB5OjB4Qy42OHArMiB9IiwgImRvdWJsZSIpLCA0OS42MjUpOworICBUZXN0VmFsdWU8ZG91YmxlPigieyB5OiBbMHgyMC40ZXAxLCArMHgyMC40ZXAxLCAtMHgyMC40ZXAxXSB9IiwgIltkb3VibGVdIik7CisgIFRlc3RWYWx1ZTxmbG9hdD4oInsgeTogWzB4MjAuNGVwMSwgKzB4MjAuNGVwMSwgLTB4MjAuNGVwMV0gfSIsICJbZmxvYXRdIik7CisKKyNlbHNlICAgLy8gRkxBVEJVRkZFUlNfSEFTX05FV19TVFJUT0QKKyAgVEVTVF9PVVRQVVRfTElORSgiRkxBVEJVRkZFUlNfSEFTX05FV19TVFJUT0QgdGVzdHMgc2tpcHBlZCIpOworI2VuZGlmICAvLyAhRkxBVEJVRkZFUlNfSEFTX05FV19TVFJUT0QKK30KKwordm9pZCBVbmljb2RlVGVzdCgpIHsKKyAgZmxhdGJ1ZmZlcnM6OlBhcnNlciBwYXJzZXI7CisgIC8vIFdpdGhvdXQgc2V0dGluZyBhbGxvd19ub25fdXRmOCA9IHRydWUsIHdlIHRyZWF0IFx4IHNlcXVlbmNlcyBhcyBieXRlCisgIC8vIHNlcXVlbmNlcyB3aGljaCBhcmUgdGhlbiB2YWxpZGF0ZWQgYXMgVVRGLTguCisgIFRFU1RfRVEocGFyc2VyLlBhcnNlKCJ0YWJsZSBUIHsgRjpzdHJpbmc7IH0iCisgICAgICAgICAgICAgICAgICAgICAgICJyb290X3R5cGUgVDsiCisgICAgICAgICAgICAgICAgICAgICAgICJ7IEY6XCJcXHUyMEFDXFx1MDBBMlxcdTMwRTZcXHUzMEZDXFx1MzBCNlxcdTMwRkMiCisgICAgICAgICAgICAgICAgICAgICAgICJcXHU1MjI1XFx1MzBCNVxcdTMwQTRcXHUzMEM4XFx4RTJcXHg4MlxceEFDXFx1MDA4MFxcdUQ4IgorICAgICAgICAgICAgICAgICAgICAgICAiM0RcXHVERTBFXCIgfSIpLAorICAgICAgICAgIHRydWUpOworICBzdGQ6OnN0cmluZyBqc29uZ2VuOworICBwYXJzZXIub3B0cy5pbmRlbnRfc3RlcCA9IC0xOworICBhdXRvIHJlc3VsdCA9CisgICAgICBHZW5lcmF0ZVRleHQocGFyc2VyLCBwYXJzZXIuYnVpbGRlcl8uR2V0QnVmZmVyUG9pbnRlcigpLCAmanNvbmdlbik7CisgIFRFU1RfRVEocmVzdWx0LCB0cnVlKTsKKyAgVEVTVF9FUV9TVFIoanNvbmdlbi5jX3N0cigpLAorICAgICAgICAgICAgICAie0Y6IFwiXFx1MjBBQ1xcdTAwQTJcXHUzMEU2XFx1MzBGQ1xcdTMwQjZcXHUzMEZDIgorICAgICAgICAgICAgICAiXFx1NTIyNVxcdTMwQjVcXHUzMEE0XFx1MzBDOFxcdTIwQUNcXHUwMDgwXFx1RDgzRFxcdURFMEVcIn0iKTsKK30KKwordm9pZCBVbmljb2RlVGVzdEFsbG93Tm9uVVRGOCgpIHsKKyAgZmxhdGJ1ZmZlcnM6OlBhcnNlciBwYXJzZXI7CisgIHBhcnNlci5vcHRzLmFsbG93X25vbl91dGY4ID0gdHJ1ZTsKKyAgVEVTVF9FUSgKKyAgICAgIHBhcnNlci5QYXJzZSgKKyAgICAgICAgICAidGFibGUgVCB7IEY6c3RyaW5nOyB9IgorICAgICAgICAgICJyb290X3R5cGUgVDsiCisgICAgICAgICAgInsgRjpcIlxcdTIwQUNcXHUwMEEyXFx1MzBFNlxcdTMwRkNcXHUzMEI2XFx1MzBGQyIKKyAgICAgICAgICAiXFx1NTIyNVxcdTMwQjVcXHUzMEE0XFx1MzBDOFxceDAxXFx4ODBcXHUwMDgwXFx1RDgzRFxcdURFMEVcIiB9IiksCisgICAgICB0cnVlKTsKKyAgc3RkOjpzdHJpbmcganNvbmdlbjsKKyAgcGFyc2VyLm9wdHMuaW5kZW50X3N0ZXAgPSAtMTsKKyAgYXV0byByZXN1bHQgPQorICAgICAgR2VuZXJhdGVUZXh0KHBhcnNlciwgcGFyc2VyLmJ1aWxkZXJfLkdldEJ1ZmZlclBvaW50ZXIoKSwgJmpzb25nZW4pOworICBURVNUX0VRKHJlc3VsdCwgdHJ1ZSk7CisgIFRFU1RfRVFfU1RSKAorICAgICAganNvbmdlbi5jX3N0cigpLAorICAgICAgIntGOiBcIlxcdTIwQUNcXHUwMEEyXFx1MzBFNlxcdTMwRkNcXHUzMEI2XFx1MzBGQyIKKyAgICAgICJcXHU1MjI1XFx1MzBCNVxcdTMwQTRcXHUzMEM4XFx1MDAwMVxceDgwXFx1MDA4MFxcdUQ4M0RcXHVERTBFXCJ9Iik7Cit9CisKK3ZvaWQgVW5pY29kZVRlc3RHZW5lcmF0ZVRleHRGYWlsc09uTm9uVVRGOCgpIHsKKyAgZmxhdGJ1ZmZlcnM6OlBhcnNlciBwYXJzZXI7CisgIC8vIEFsbG93IG5vbi1VVEYtOCBpbml0aWFsbHkgdG8gbW9kZWwgd2hhdCBoYXBwZW5zIHdoZW4gd2UgbG9hZCBhIGJpbmFyeQorICAvLyBmbGF0YnVmZmVyIGZyb20gZGlzayB3aGljaCBjb250YWlucyBub24tVVRGLTggc3RyaW5ncy4KKyAgcGFyc2VyLm9wdHMuYWxsb3dfbm9uX3V0ZjggPSB0cnVlOworICBURVNUX0VRKAorICAgICAgcGFyc2VyLlBhcnNlKAorICAgICAgICAgICJ0YWJsZSBUIHsgRjpzdHJpbmc7IH0iCisgICAgICAgICAgInJvb3RfdHlwZSBUOyIKKyAgICAgICAgICAieyBGOlwiXFx1MjBBQ1xcdTAwQTJcXHUzMEU2XFx1MzBGQ1xcdTMwQjZcXHUzMEZDIgorICAgICAgICAgICJcXHU1MjI1XFx1MzBCNVxcdTMwQTRcXHUzMEM4XFx4MDFcXHg4MFxcdTAwODBcXHVEODNEXFx1REUwRVwiIH0iKSwKKyAgICAgIHRydWUpOworICBzdGQ6OnN0cmluZyBqc29uZ2VuOworICBwYXJzZXIub3B0cy5pbmRlbnRfc3RlcCA9IC0xOworICAvLyBOb3csIGRpc2FsbG93IG5vbi1VVEYtOCAodGhlIGRlZmF1bHQgYmVoYXZpb3IpIHNvIEdlbmVyYXRlVGV4dCBpbmRpY2F0ZXMKKyAgLy8gZmFpbHVyZS4KKyAgcGFyc2VyLm9wdHMuYWxsb3dfbm9uX3V0ZjggPSBmYWxzZTsKKyAgYXV0byByZXN1bHQgPQorICAgICAgR2VuZXJhdGVUZXh0KHBhcnNlciwgcGFyc2VyLmJ1aWxkZXJfLkdldEJ1ZmZlclBvaW50ZXIoKSwgJmpzb25nZW4pOworICBURVNUX0VRKHJlc3VsdCwgZmFsc2UpOworfQorCit2b2lkIFVuaWNvZGVTdXJyb2dhdGVzVGVzdCgpIHsKKyAgZmxhdGJ1ZmZlcnM6OlBhcnNlciBwYXJzZXI7CisKKyAgVEVTVF9FUShwYXJzZXIuUGFyc2UoInRhYmxlIFQgeyBGOnN0cmluZyAoaWQ6IDApOyB9IgorICAgICAgICAgICAgICAgICAgICAgICAicm9vdF90eXBlIFQ7IgorICAgICAgICAgICAgICAgICAgICAgICAieyBGOlwiXFx1RDgzRFxcdURDQTlcIn0iKSwKKyAgICAgICAgICB0cnVlKTsKKyAgYXV0byByb290ID0gZmxhdGJ1ZmZlcnM6OkdldFJvb3Q8ZmxhdGJ1ZmZlcnM6OlRhYmxlPigKKyAgICAgIHBhcnNlci5idWlsZGVyXy5HZXRCdWZmZXJQb2ludGVyKCkpOworICBhdXRvIHN0cmluZyA9IHJvb3QtPkdldFBvaW50ZXI8ZmxhdGJ1ZmZlcnM6OlN0cmluZyAqPigKKyAgICAgIGZsYXRidWZmZXJzOjpGaWVsZEluZGV4VG9PZmZzZXQoMCkpOworICBURVNUX0VRX1NUUihzdHJpbmctPmNfc3RyKCksICJceEYwXHg5Rlx4OTJceEE5Iik7Cit9CisKKworCit2b2lkIFVua25vd25GaWVsZHNUZXN0KCkgeworICBmbGF0YnVmZmVyczo6SURMT3B0aW9ucyBvcHRzOworICBvcHRzLnNraXBfdW5leHBlY3RlZF9maWVsZHNfaW5fanNvbiA9IHRydWU7CisgIGZsYXRidWZmZXJzOjpQYXJzZXIgcGFyc2VyKG9wdHMpOworCisgIFRFU1RfRVEocGFyc2VyLlBhcnNlKCJ0YWJsZSBUIHsgc3RyOnN0cmluZzsgaTppbnQ7fSIKKyAgICAgICAgICAgICAgICAgICAgICAgInJvb3RfdHlwZSBUOyIKKyAgICAgICAgICAgICAgICAgICAgICAgInsgc3RyOlwidGVzdFwiLCIKKyAgICAgICAgICAgICAgICAgICAgICAgInVua25vd25fc3RyaW5nOlwidGVzdFwiLCIKKyAgICAgICAgICAgICAgICAgICAgICAgIlwidW5rbm93bl9zdHJpbmdcIjpcInRlc3RcIiwiCisgICAgICAgICAgICAgICAgICAgICAgICJ1bmtub3duX2ludDoxMCwiCisgICAgICAgICAgICAgICAgICAgICAgICJ1bmtub3duX2Zsb2F0OjEuMCwiCisgICAgICAgICAgICAgICAgICAgICAgICJ1bmtub3duX2FycmF5OiBbIDEsIDIsIDMsIDRdLCIKKyAgICAgICAgICAgICAgICAgICAgICAgInVua25vd25fb2JqZWN0OiB7IGk6IDEwIH0sIgorICAgICAgICAgICAgICAgICAgICAgICAiXCJ1bmtub3duX29iamVjdFwiOiB7IFwiaVwiOiAxMCB9LCIKKyAgICAgICAgICAgICAgICAgICAgICAgImk6MTB9IiksCisgICAgICAgICAgdHJ1ZSk7CisKKyAgc3RkOjpzdHJpbmcganNvbmdlbjsKKyAgcGFyc2VyLm9wdHMuaW5kZW50X3N0ZXAgPSAtMTsKKyAgYXV0byByZXN1bHQgPQorICAgICAgR2VuZXJhdGVUZXh0KHBhcnNlciwgcGFyc2VyLmJ1aWxkZXJfLkdldEJ1ZmZlclBvaW50ZXIoKSwgJmpzb25nZW4pOworICBURVNUX0VRKHJlc3VsdCwgdHJ1ZSk7CisgIFRFU1RfRVFfU1RSKGpzb25nZW4uY19zdHIoKSwgIntzdHI6IFwidGVzdFwiLGk6IDEwfSIpOworfQorCit2b2lkIFBhcnNlVW5pb25UZXN0KCkgeworICAvLyBVbmlvbnMgbXVzdCBiZSBwYXJzZWFibGUgd2l0aCB0aGUgdHlwZSBmaWVsZCBmb2xsb3dpbmcgdGhlIG9iamVjdC4KKyAgZmxhdGJ1ZmZlcnM6OlBhcnNlciBwYXJzZXI7CisgIFRFU1RfRVEocGFyc2VyLlBhcnNlKCJ0YWJsZSBUIHsgQTppbnQ7IH0iCisgICAgICAgICAgICAgICAgICAgICAgICJ1bmlvbiBVIHsgVCB9IgorICAgICAgICAgICAgICAgICAgICAgICAidGFibGUgViB7IFg6VTsgfSIKKyAgICAgICAgICAgICAgICAgICAgICAgInJvb3RfdHlwZSBWOyIKKyAgICAgICAgICAgICAgICAgICAgICAgInsgWDp7IEE6MSB9LCBYX3R5cGU6IFQgfSIpLAorICAgICAgICAgIHRydWUpOworICAvLyBVbmlvbnMgbXVzdCBiZSBwYXJzYWJsZSB3aXRoIHByZWZpeGVkIG5hbWVzcGFjZS4KKyAgZmxhdGJ1ZmZlcnM6OlBhcnNlciBwYXJzZXIyOworICBURVNUX0VRKHBhcnNlcjIuUGFyc2UoIm5hbWVzcGFjZSBOOyB0YWJsZSBBIHt9IG5hbWVzcGFjZTsgdW5pb24gVSB7IE4uQSB9IgorICAgICAgICAgICAgICAgICAgICAgICAgInRhYmxlIEIgeyBlOlU7IH0gcm9vdF90eXBlIEI7IgorICAgICAgICAgICAgICAgICAgICAgICAgInsgZV90eXBlOiBOX0EsIGU6IHt9IH0iKSwKKyAgICAgICAgICB0cnVlKTsKK30KKwordm9pZCBWYWxpZFNhbWVOYW1lRGlmZmVyZW50TmFtZXNwYWNlVGVzdCgpIHsKKyAgLy8gRHVwbGljYXRlIHRhYmxlIG5hbWVzIGluIGRpZmZlcmVudCBuYW1lc3BhY2VzIG11c3QgYmUgcGFyc2FibGUKKyAgVEVTVF9BU1NFUlQoZmxhdGJ1ZmZlcnM6OlBhcnNlcigpLlBhcnNlKAorICAgICAgIm5hbWVzcGFjZSBBOyB0YWJsZSBYIHt9IG5hbWVzcGFjZSBCOyB0YWJsZSBYIHt9IikpOworICAvLyBEdXBsaWNhdGUgdW5pb24gbmFtZXMgaW4gZGlmZmVyZW50IG5hbWVzcGFjZXMgbXVzdCBiZSBwYXJzYWJsZQorICBURVNUX0FTU0VSVChmbGF0YnVmZmVyczo6UGFyc2VyKCkuUGFyc2UoCisgICAgICAibmFtZXNwYWNlIEE7IHVuaW9uIFgge30gbmFtZXNwYWNlIEI7IHVuaW9uIFgge30iKSk7CisgIC8vIENsYXNoaW5nIHRhYmxlIGFuZCB1bmlvbiBuYW1lcyBpbiBkaWZmZXJlbnQgbmFtZXNwYWNlcyBtdXN0IGJlIHBhcnNhYmxlCisgIFRFU1RfQVNTRVJUKGZsYXRidWZmZXJzOjpQYXJzZXIoKS5QYXJzZSgKKyAgICAgICJuYW1lc3BhY2UgQTsgdGFibGUgWCB7fSBuYW1lc3BhY2UgQjsgdW5pb24gWCB7fSIpKTsKKyAgVEVTVF9BU1NFUlQoZmxhdGJ1ZmZlcnM6OlBhcnNlcigpLlBhcnNlKAorICAgICAgIm5hbWVzcGFjZSBBOyB1bmlvbiBYIHt9IG5hbWVzcGFjZSBCOyB0YWJsZSBYIHt9IikpOworfQorCit2b2lkIFdhcm5pbmdzQXNFcnJvcnNUZXN0KCkgeworICB7CisgICAgZmxhdGJ1ZmZlcnM6OklETE9wdGlvbnMgb3B0czsKKyAgICAvLyBvcHRzLndhcm5pbmdzX2FzX2Vycm9ycyBzaG91bGQgZGVmYXVsdCB0byBmYWxzZQorICAgIGZsYXRidWZmZXJzOjpQYXJzZXIgcGFyc2VyKG9wdHMpOworICAgIFRFU1RfRVEocGFyc2VyLlBhcnNlKCJ0YWJsZSBUIHsgVEhJU19OQU1FX0NBVVNFU19BX1dBUk5JTkc6c3RyaW5nO31cbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAicm9vdF90eXBlIFQ7IiksCisgICAgICAgICAgICB0cnVlKTsKKyAgfQorICB7CisgICAgZmxhdGJ1ZmZlcnM6OklETE9wdGlvbnMgb3B0czsKKyAgICBvcHRzLndhcm5pbmdzX2FzX2Vycm9ycyA9IHRydWU7CisgICAgZmxhdGJ1ZmZlcnM6OlBhcnNlciBwYXJzZXIob3B0cyk7CisgICAgVEVTVF9FUShwYXJzZXIuUGFyc2UoInRhYmxlIFQgeyBUSElTX05BTUVfQ0FVU0VTX0FfV0FSTklORzpzdHJpbmc7fVxuIgorICAgICAgICAgICAgICAgICAgICAgICAgICJyb290X3R5cGUgVDsiKSwKKyAgICAgICAgICAgIGZhbHNlKTsKKyAgfQorfQorCit2b2lkIFN0cmluZ1ZlY3RvckRlZmF1bHRzVGVzdCgpIHsKKyAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IHNjaGVtYXM7CisgIHNjaGVtYXMucHVzaF9iYWNrKCJ0YWJsZSBNb25zdGVyIHsgbWFuYTogc3RyaW5nID0gXCJcIjsgfSIpOworICBzY2hlbWFzLnB1c2hfYmFjaygidGFibGUgTW9uc3RlciB7IG1hbmE6IHN0cmluZyA9IFwibXlzdHJcIjsgfSIpOworICBzY2hlbWFzLnB1c2hfYmFjaygidGFibGUgTW9uc3RlciB7IG1hbmE6IHN0cmluZyA9IFwiICBcIjsgfSIpOworICBzY2hlbWFzLnB1c2hfYmFjaygidGFibGUgTW9uc3RlciB7IG1hbmE6IHN0cmluZyA9IFwibnVsbFwiOyB9Iik7CisgIHNjaGVtYXMucHVzaF9iYWNrKCJ0YWJsZSBNb25zdGVyIHsgbWFuYTogW2ludF0gPSBbXTsgfSIpOworICBzY2hlbWFzLnB1c2hfYmFjaygidGFibGUgTW9uc3RlciB7IG1hbmE6IFt1aW50XSA9IFsgIF07IH0iKTsKKyAgc2NoZW1hcy5wdXNoX2JhY2soInRhYmxlIE1vbnN0ZXIgeyBtYW5hOiBbYnl0ZV0gPSBbXHRcdFxuXTsgfSIpOworICBzY2hlbWFzLnB1c2hfYmFjaygiZW51bSBFOmludHt9dGFibGUgTW9uc3RlcnttYW5hOltFXT1bXTt9Iik7CisgIGZvciAoYXV0byBzID0gc2NoZW1hcy5iZWdpbigpOyBzIDwgc2NoZW1hcy5lbmQoKTsgcysrKSB7CisgICAgZmxhdGJ1ZmZlcnM6OlBhcnNlciBwYXJzZXI7CisgICAgVEVTVF9BU1NFUlQocGFyc2VyLlBhcnNlKHMtPmNfc3RyKCkpKTsKKyAgICBjb25zdCBhdXRvICptYW5hID0gcGFyc2VyLnN0cnVjdHNfLkxvb2t1cCgiTW9uc3RlciIpLT5maWVsZHMuTG9va3VwKCJtYW5hIik7CisgICAgVEVTVF9FUShtYW5hLT5Jc0RlZmF1bHQoKSwgdHJ1ZSk7CisgIH0KK30KKwordm9pZCBGaWVsZElkZW50aWZpZXJUZXN0KCkgeworICB1c2luZyBmbGF0YnVmZmVyczo6UGFyc2VyOworICBURVNUX0VRKHRydWUsIFBhcnNlcigpLlBhcnNlKCJ0YWJsZSBUeyBmOiBpbnQgKGlkOjApOyB9IikpOworICAvLyBub24taW50ZWdlciBgaWRgIHNob3VsZCBiZSByZWplY3RlZAorICBURVNUX0VRKGZhbHNlLCBQYXJzZXIoKS5QYXJzZSgidGFibGUgVHsgZjogaW50IChpZDp0ZXh0KTsgfSIpKTsKKyAgVEVTVF9FUShmYWxzZSwgUGFyc2VyKCkuUGFyc2UoInRhYmxlIFR7IGY6IGludCAoaWQ6XCJ0ZXh0XCIpOyB9IikpOworICBURVNUX0VRKGZhbHNlLCBQYXJzZXIoKS5QYXJzZSgidGFibGUgVHsgZjogaW50IChpZDowdGV4dCk7IH0iKSk7CisgIFRFU1RfRVEoZmFsc2UsIFBhcnNlcigpLlBhcnNlKCJ0YWJsZSBUeyBmOiBpbnQgKGlkOjEuMCk7IH0iKSk7CisgIFRFU1RfRVEoZmFsc2UsIFBhcnNlcigpLlBhcnNlKCJ0YWJsZSBUeyBmOiBpbnQgKGlkOi0xKTsgZzogaW50IChpZDowKTsgfSIpKTsKKyAgVEVTVF9FUShmYWxzZSwgUGFyc2VyKCkuUGFyc2UoInRhYmxlIFR7IGY6IGludCAoaWQ6MTI5NDk2NzI2KTsgfSIpKTsKKyAgLy8gQSB1bnVpb24gZmlsZWQgb2NjdXB5cyB0d28gaWRzOiBlbnVtZXJhdG9yICsgcG9pbnRlciAob2Zmc2V0KS4KKyAgVEVTVF9FUShmYWxzZSwKKyAgICAgICAgICBQYXJzZXIoKS5QYXJzZSgidW5pb24gWHt9IHRhYmxlIFR7IHU6IFgoaWQ6MCk7IHRhYmxlIEZ7eDppbnQ7XG59IikpOworICAvLyBQb3NpdGl2ZSB0ZXN0cyBmb3IgdW5pb25zCisgIFRFU1RfRVEodHJ1ZSwgUGFyc2VyKCkuUGFyc2UoInVuaW9uIFh7fSB0YWJsZSBUeyB1OiBYIChpZDoxKTsgfSIpKTsKKyAgVEVTVF9FUSh0cnVlLCBQYXJzZXIoKS5QYXJzZSgidW5pb24gWHt9IHRhYmxlIFR7IHU6IFg7IH0iKSk7CisgIC8vIFRlc3QgdXNpbmcgJ2luZicgYW5kICduYW4nIHdvcmRzIGJvdGggYXMgaWRlbnRpZmllcnMgYW5kIGFzIGRlZmF1bHQgdmFsdWVzLgorICBURVNUX0VRKHRydWUsIFBhcnNlcigpLlBhcnNlKCJ0YWJsZSBUeyBuYW46IHN0cmluZzsgfSIpKTsKKyAgVEVTVF9FUSh0cnVlLCBQYXJzZXIoKS5QYXJzZSgidGFibGUgVHsgaW5mOiBzdHJpbmc7IH0iKSk7CisjaWYgZGVmaW5lZChGTEFUQlVGRkVSU19IQVNfTkVXX1NUUlRPRCkgJiYgKEZMQVRCVUZGRVJTX0hBU19ORVdfU1RSVE9EID4gMCkKKyAgVEVTVF9FUSh0cnVlLCBQYXJzZXIoKS5QYXJzZSgidGFibGUgVHsgaW5mOiBmbG9hdCA9IGluZjsgfSIpKTsKKyAgVEVTVF9FUSh0cnVlLCBQYXJzZXIoKS5QYXJzZSgidGFibGUgVHsgbmFuOiBmbG9hdCA9IGluZjsgfSIpKTsKKyNlbmRpZgorfQorCit9ICAvLyBuYW1lc3BhY2UgdGVzdHMKK30gIC8vIG5hbWVzcGFjZSBmbGF0YnVmZmVycwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvcGFyc2VyX3Rlc3QuaCBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL3BhcnNlcl90ZXN0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2U2YjVlMgotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL3BhcnNlcl90ZXN0LmgKQEAgLTAsMCArMSwzMyBAQAorI2lmbmRlZiBURVNUU19QQVJTRVJfVEVTVF9ICisjZGVmaW5lIFRFU1RTX1BBUlNFUl9URVNUX0gKKworbmFtZXNwYWNlIGZsYXRidWZmZXJzIHsKK25hbWVzcGFjZSB0ZXN0cyB7CisKK3ZvaWQgRXJyb3JUZXN0KCk7Cit2b2lkIEVudW1PdXRPZlJhbmdlVGVzdCgpOwordm9pZCBJbnRlZ2VyT3V0T2ZSYW5nZVRlc3QoKTsKK3ZvaWQgSW52YWxpZEZsb2F0VGVzdCgpOwordm9pZCBVbmljb2RlSW52YWxpZFN1cnJvZ2F0ZXNUZXN0KCk7Cit2b2lkIEludmFsaWRVVEY4VGVzdCgpOwordm9pZCBWYWx1ZVRlc3QoKTsKK3ZvaWQgTmVzdGVkTGlzdFRlc3QoKTsKK3ZvaWQgRW51bVN0cmluZ3NUZXN0KCk7Cit2b2lkIEVudW1WYWx1ZVRlc3QoKTsKK3ZvaWQgSW50ZWdlckJvdW5kYXJ5VGVzdCgpOwordm9pZCBWYWxpZEZsb2F0VGVzdCgpOwordm9pZCBVbmljb2RlVGVzdCgpOwordm9pZCBVbmljb2RlVGVzdEFsbG93Tm9uVVRGOCgpOwordm9pZCBVbmljb2RlVGVzdEdlbmVyYXRlVGV4dEZhaWxzT25Ob25VVEY4KCk7Cit2b2lkIFVuaWNvZGVTdXJyb2dhdGVzVGVzdCgpOwordm9pZCBVbmtub3duRmllbGRzVGVzdCgpOwordm9pZCBQYXJzZVVuaW9uVGVzdCgpOwordm9pZCBWYWxpZFNhbWVOYW1lRGlmZmVyZW50TmFtZXNwYWNlVGVzdCgpOwordm9pZCBXYXJuaW5nc0FzRXJyb3JzVGVzdCgpOwordm9pZCBTdHJpbmdWZWN0b3JEZWZhdWx0c1Rlc3QoKTsKK3ZvaWQgRmllbGRJZGVudGlmaWVyVGVzdCgpOworCit9ICAvLyBuYW1lc3BhY2UgdGVzdHMKK30gIC8vIG5hbWVzcGFjZSBmbGF0YnVmZmVycworCisjZW5kaWYgIC8vIFRFU1RTX1BBUlNFUl9URVNUX0gKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9wcml2YXRlX2Fubm90YXRpb25fdGVzdC5mYnMgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9wcml2YXRlX2Fubm90YXRpb25fdGVzdC5mYnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDM0OTI3YgotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL3ByaXZhdGVfYW5ub3RhdGlvbl90ZXN0LmZicwpAQCAtMCwwICsxLDE4IEBACitlbnVtIEFCOmJ5dGUgKHByaXZhdGUpIHsKKyAgQSwKKyAgQiwKK30KKworc3RydWN0IE9iamVjdCAocHJpdmF0ZSkgeworICAgIHZhbHVlOiBpbnQ7Cit9CisKK3VuaW9uIEFueSAocHJpdmF0ZSkgeyBHYW1lLCBBbm5vdGF0aW9ucyB9CisKK3RhYmxlIEdhbWUgKHByaXZhdGUpIHsKKyAgICB2YWx1ZTogaW50OworfQorCit0YWJsZSBBbm5vdGF0aW9ucyAocHJpdmF0ZSkgeworICAgIHZhbHVlOiBpbnQ7Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvcHJpdmF0ZV9hbm5vdGF0aW9uX3Rlc3QvYWJfZ2VuZXJhdGVkLnJzIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvcHJpdmF0ZV9hbm5vdGF0aW9uX3Rlc3QvYWJfZ2VuZXJhdGVkLnJzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlZDg4NTAKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9wcml2YXRlX2Fubm90YXRpb25fdGVzdC9hYl9nZW5lcmF0ZWQucnMKQEAgLTAsMCArMSw5OCBAQAorLy8gYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgYnkgdGhlIEZsYXRCdWZmZXJzIGNvbXBpbGVyLCBkbyBub3QgbW9kaWZ5CisvLyBAZ2VuZXJhdGVkCitleHRlcm4gY3JhdGUgYWxsb2M7CitleHRlcm4gY3JhdGUgZmxhdGJ1ZmZlcnM7Cit1c2UgYWxsb2M6OmJveGVkOjpCb3g7Cit1c2UgYWxsb2M6OnN0cmluZzo6e1N0cmluZywgVG9TdHJpbmd9OwordXNlIGFsbG9jOjp2ZWM6OlZlYzsKK3VzZSBjb3JlOjptZW07Cit1c2UgY29yZTo6Y21wOjpPcmRlcmluZzsKK3VzZSBzZWxmOjpmbGF0YnVmZmVyczo6e0VuZGlhblNjYWxhciwgRm9sbG93fTsKK3VzZSBzdXBlcjo6KjsKKyNbZGVwcmVjYXRlZChzaW5jZSA9ICIyLjAuMCIsIG5vdGUgPSAiVXNlIGFzc29jaWF0ZWQgY29uc3RhbnRzIGluc3RlYWQuIFRoaXMgd2lsbCBubyBsb25nZXIgYmUgZ2VuZXJhdGVkIGluIDIwMjEuIildCitwdWIgY29uc3QgRU5VTV9NSU5fQUI6IGk4ID0gMDsKKyNbZGVwcmVjYXRlZChzaW5jZSA9ICIyLjAuMCIsIG5vdGUgPSAiVXNlIGFzc29jaWF0ZWQgY29uc3RhbnRzIGluc3RlYWQuIFRoaXMgd2lsbCBubyBsb25nZXIgYmUgZ2VuZXJhdGVkIGluIDIwMjEuIildCitwdWIgY29uc3QgRU5VTV9NQVhfQUI6IGk4ID0gMTsKKyNbZGVwcmVjYXRlZChzaW5jZSA9ICIyLjAuMCIsIG5vdGUgPSAiVXNlIGFzc29jaWF0ZWQgY29uc3RhbnRzIGluc3RlYWQuIFRoaXMgd2lsbCBubyBsb25nZXIgYmUgZ2VuZXJhdGVkIGluIDIwMjEuIildCisjW2FsbG93KG5vbl9jYW1lbF9jYXNlX3R5cGVzKV0KK3B1YiBjb25zdCBFTlVNX1ZBTFVFU19BQjogW0FCOyAyXSA9IFsKKyAgQUI6OkEsCisgIEFCOjpCLAorXTsKKworI1tkZXJpdmUoQ2xvbmUsIENvcHksIFBhcnRpYWxFcSwgRXEsIFBhcnRpYWxPcmQsIE9yZCwgSGFzaCwgRGVmYXVsdCldCisjW3JlcHIodHJhbnNwYXJlbnQpXQorcHViKGNyYXRlKSBzdHJ1Y3QgQUIocHViIGk4KTsKKyNbYWxsb3cobm9uX3VwcGVyX2Nhc2VfZ2xvYmFscyldCitpbXBsIEFCIHsKKyAgcHViIGNvbnN0IEE6IFNlbGYgPSBTZWxmKDApOworICBwdWIgY29uc3QgQjogU2VsZiA9IFNlbGYoMSk7CisKKyAgcHViIGNvbnN0IEVOVU1fTUlOOiBpOCA9IDA7CisgIHB1YiBjb25zdCBFTlVNX01BWDogaTggPSAxOworICBwdWIgY29uc3QgRU5VTV9WQUxVRVM6ICYnc3RhdGljIFtTZWxmXSA9ICZbCisgICAgU2VsZjo6QSwKKyAgICBTZWxmOjpCLAorICBdOworICAvLy8gUmV0dXJucyB0aGUgdmFyaWFudCdzIG5hbWUgb3IgIiIgaWYgdW5rbm93bi4KKyAgcHViIGZuIHZhcmlhbnRfbmFtZShzZWxmKSAtPiBPcHRpb248JidzdGF0aWMgc3RyPiB7CisgICAgbWF0Y2ggc2VsZiB7CisgICAgICBTZWxmOjpBID0+IFNvbWUoIkEiKSwKKyAgICAgIFNlbGY6OkIgPT4gU29tZSgiQiIpLAorICAgICAgXyA9PiBOb25lLAorICAgIH0KKyAgfQorfQoraW1wbCBjb3JlOjpmbXQ6OkRlYnVnIGZvciBBQiB7CisgIGZuIGZtdCgmc2VsZiwgZjogJm11dCBjb3JlOjpmbXQ6OkZvcm1hdHRlcikgLT4gY29yZTo6Zm10OjpSZXN1bHQgeworICAgIGlmIGxldCBTb21lKG5hbWUpID0gc2VsZi52YXJpYW50X25hbWUoKSB7CisgICAgICBmLndyaXRlX3N0cihuYW1lKQorICAgIH0gZWxzZSB7CisgICAgICBmLndyaXRlX2ZtdChmb3JtYXRfYXJncyEoIjxVTktOT1dOIHs6P30+Iiwgc2VsZi4wKSkKKyAgICB9CisgIH0KK30KK2ltcGw8J2E+IGZsYXRidWZmZXJzOjpGb2xsb3c8J2E+IGZvciBBQiB7CisgIHR5cGUgSW5uZXIgPSBTZWxmOworICAjW2lubGluZV0KKyAgZm4gZm9sbG93KGJ1ZjogJidhIFt1OF0sIGxvYzogdXNpemUpIC0+IFNlbGY6OklubmVyIHsKKyAgICBsZXQgYiA9IHVuc2FmZSB7CisgICAgICBmbGF0YnVmZmVyczo6cmVhZF9zY2FsYXJfYXQ6OjxpOD4oYnVmLCBsb2MpCisgICAgfTsKKyAgICBTZWxmKGIpCisgIH0KK30KKworaW1wbCBmbGF0YnVmZmVyczo6UHVzaCBmb3IgQUIgeworICAgIHR5cGUgT3V0cHV0ID0gQUI7CisgICAgI1tpbmxpbmVdCisgICAgZm4gcHVzaCgmc2VsZiwgZHN0OiAmbXV0IFt1OF0sIF9yZXN0OiAmW3U4XSkgeworICAgICAgICB1bnNhZmUgeyBmbGF0YnVmZmVyczo6ZW1wbGFjZV9zY2FsYXI6OjxpOD4oZHN0LCBzZWxmLjApOyB9CisgICAgfQorfQorCitpbXBsIGZsYXRidWZmZXJzOjpFbmRpYW5TY2FsYXIgZm9yIEFCIHsKKyAgI1tpbmxpbmVdCisgIGZuIHRvX2xpdHRsZV9lbmRpYW4oc2VsZikgLT4gU2VsZiB7CisgICAgbGV0IGIgPSBpODo6dG9fbGUoc2VsZi4wKTsKKyAgICBTZWxmKGIpCisgIH0KKyAgI1tpbmxpbmVdCisgICNbYWxsb3coY2xpcHB5Ojp3cm9uZ19zZWxmX2NvbnZlbnRpb24pXQorICBmbiBmcm9tX2xpdHRsZV9lbmRpYW4oc2VsZikgLT4gU2VsZiB7CisgICAgbGV0IGIgPSBpODo6ZnJvbV9sZShzZWxmLjApOworICAgIFNlbGYoYikKKyAgfQorfQorCitpbXBsPCdhPiBmbGF0YnVmZmVyczo6VmVyaWZpYWJsZSBmb3IgQUIgeworICAjW2lubGluZV0KKyAgZm4gcnVuX3ZlcmlmaWVyKAorICAgIHY6ICZtdXQgZmxhdGJ1ZmZlcnM6OlZlcmlmaWVyLCBwb3M6IHVzaXplCisgICkgLT4gUmVzdWx0PCgpLCBmbGF0YnVmZmVyczo6SW52YWxpZEZsYXRidWZmZXI+IHsKKyAgICB1c2Ugc2VsZjo6ZmxhdGJ1ZmZlcnM6OlZlcmlmaWFibGU7CisgICAgaTg6OnJ1bl92ZXJpZmllcih2LCBwb3MpCisgIH0KK30KKworaW1wbCBmbGF0YnVmZmVyczo6U2ltcGxlVG9WZXJpZnlJblNsaWNlIGZvciBBQiB7fQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvcHJpdmF0ZV9hbm5vdGF0aW9uX3Rlc3QvYW5ub3RhdGlvbnNfZ2VuZXJhdGVkLnJzIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvcHJpdmF0ZV9hbm5vdGF0aW9uX3Rlc3QvYW5ub3RhdGlvbnNfZ2VuZXJhdGVkLnJzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdjNTE2NmIKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9wcml2YXRlX2Fubm90YXRpb25fdGVzdC9hbm5vdGF0aW9uc19nZW5lcmF0ZWQucnMKQEAgLTAsMCArMSwxMzggQEAKKy8vIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGJ5IHRoZSBGbGF0QnVmZmVycyBjb21waWxlciwgZG8gbm90IG1vZGlmeQorLy8gQGdlbmVyYXRlZAorZXh0ZXJuIGNyYXRlIGFsbG9jOworZXh0ZXJuIGNyYXRlIGZsYXRidWZmZXJzOwordXNlIGFsbG9jOjpib3hlZDo6Qm94OwordXNlIGFsbG9jOjpzdHJpbmc6OntTdHJpbmcsIFRvU3RyaW5nfTsKK3VzZSBhbGxvYzo6dmVjOjpWZWM7Cit1c2UgY29yZTo6bWVtOwordXNlIGNvcmU6OmNtcDo6T3JkZXJpbmc7Cit1c2Ugc2VsZjo6ZmxhdGJ1ZmZlcnM6OntFbmRpYW5TY2FsYXIsIEZvbGxvd307Cit1c2Ugc3VwZXI6Oio7CitwdWIoY3JhdGUpIGVudW0gQW5ub3RhdGlvbnNPZmZzZXQge30KKyNbZGVyaXZlKENvcHksIENsb25lLCBQYXJ0aWFsRXEpXQorCitwdWIoY3JhdGUpIHN0cnVjdCBBbm5vdGF0aW9uczwnYT4geworICBwdWIgX3RhYjogZmxhdGJ1ZmZlcnM6OlRhYmxlPCdhPiwKK30KKworaW1wbDwnYT4gZmxhdGJ1ZmZlcnM6OkZvbGxvdzwnYT4gZm9yIEFubm90YXRpb25zPCdhPiB7CisgIHR5cGUgSW5uZXIgPSBBbm5vdGF0aW9uczwnYT47CisgICNbaW5saW5lXQorICBmbiBmb2xsb3coYnVmOiAmJ2EgW3U4XSwgbG9jOiB1c2l6ZSkgLT4gU2VsZjo6SW5uZXIgeworICAgIFNlbGYgeyBfdGFiOiBmbGF0YnVmZmVyczo6VGFibGUgeyBidWYsIGxvYyB9IH0KKyAgfQorfQorCitpbXBsPCdhPiBBbm5vdGF0aW9uczwnYT4geworICBwdWIgY29uc3QgVlRfVkFMVUU6IGZsYXRidWZmZXJzOjpWT2Zmc2V0VCA9IDQ7CisKKyAgcHViIGNvbnN0IGZuIGdldF9mdWxseV9xdWFsaWZpZWRfbmFtZSgpIC0+ICYnc3RhdGljIHN0ciB7CisgICAgIkFubm90YXRpb25zIgorICB9CisKKyAgI1tpbmxpbmVdCisgIHB1YiBmbiBpbml0X2Zyb21fdGFibGUodGFibGU6IGZsYXRidWZmZXJzOjpUYWJsZTwnYT4pIC0+IFNlbGYgeworICAgIEFubm90YXRpb25zIHsgX3RhYjogdGFibGUgfQorICB9CisgICNbYWxsb3codW51c2VkX211dCldCisgIHB1YiBmbiBjcmVhdGU8J2JsZHI6ICdhcmdzLCAnYXJnczogJ211dF9ibGRyLCAnbXV0X2JsZHI+KAorICAgIF9mYmI6ICYnbXV0X2JsZHIgbXV0IGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlcjwnYmxkcj4sCisgICAgYXJnczogJidhcmdzIEFubm90YXRpb25zQXJncworICApIC0+IGZsYXRidWZmZXJzOjpXSVBPZmZzZXQ8QW5ub3RhdGlvbnM8J2JsZHI+PiB7CisgICAgbGV0IG11dCBidWlsZGVyID0gQW5ub3RhdGlvbnNCdWlsZGVyOjpuZXcoX2ZiYik7CisgICAgYnVpbGRlci5hZGRfdmFsdWUoYXJncy52YWx1ZSk7CisgICAgYnVpbGRlci5maW5pc2goKQorICB9CisKKyAgcHViIGZuIHVucGFjaygmc2VsZikgLT4gQW5ub3RhdGlvbnNUIHsKKyAgICBsZXQgdmFsdWUgPSBzZWxmLnZhbHVlKCk7CisgICAgQW5ub3RhdGlvbnNUIHsKKyAgICAgIHZhbHVlLAorICAgIH0KKyAgfQorCisgICNbaW5saW5lXQorICBwdWIgZm4gdmFsdWUoJnNlbGYpIC0+IGkzMiB7CisgICAgc2VsZi5fdGFiLmdldDo6PGkzMj4oQW5ub3RhdGlvbnM6OlZUX1ZBTFVFLCBTb21lKDApKS51bndyYXAoKQorICB9Cit9CisKK2ltcGwgZmxhdGJ1ZmZlcnM6OlZlcmlmaWFibGUgZm9yIEFubm90YXRpb25zPCdfPiB7CisgICNbaW5saW5lXQorICBmbiBydW5fdmVyaWZpZXIoCisgICAgdjogJm11dCBmbGF0YnVmZmVyczo6VmVyaWZpZXIsIHBvczogdXNpemUKKyAgKSAtPiBSZXN1bHQ8KCksIGZsYXRidWZmZXJzOjpJbnZhbGlkRmxhdGJ1ZmZlcj4geworICAgIHVzZSBzZWxmOjpmbGF0YnVmZmVyczo6VmVyaWZpYWJsZTsKKyAgICB2LnZpc2l0X3RhYmxlKHBvcyk/CisgICAgIC52aXNpdF9maWVsZDo6PGkzMj4oInZhbHVlIiwgU2VsZjo6VlRfVkFMVUUsIGZhbHNlKT8KKyAgICAgLmZpbmlzaCgpOworICAgIE9rKCgpKQorICB9Cit9CitwdWIoY3JhdGUpIHN0cnVjdCBBbm5vdGF0aW9uc0FyZ3MgeworICAgIHB1YiB2YWx1ZTogaTMyLAorfQoraW1wbDwnYT4gRGVmYXVsdCBmb3IgQW5ub3RhdGlvbnNBcmdzIHsKKyAgI1tpbmxpbmVdCisgIGZuIGRlZmF1bHQoKSAtPiBTZWxmIHsKKyAgICBBbm5vdGF0aW9uc0FyZ3MgeworICAgICAgdmFsdWU6IDAsCisgICAgfQorICB9Cit9CisKK3B1YihjcmF0ZSkgc3RydWN0IEFubm90YXRpb25zQnVpbGRlcjwnYTogJ2IsICdiPiB7CisgIGZiYl86ICYnYiBtdXQgZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyPCdhPiwKKyAgc3RhcnRfOiBmbGF0YnVmZmVyczo6V0lQT2Zmc2V0PGZsYXRidWZmZXJzOjpUYWJsZVVuZmluaXNoZWRXSVBPZmZzZXQ+LAorfQoraW1wbDwnYTogJ2IsICdiPiBBbm5vdGF0aW9uc0J1aWxkZXI8J2EsICdiPiB7CisgICNbaW5saW5lXQorICBwdWIgZm4gYWRkX3ZhbHVlKCZtdXQgc2VsZiwgdmFsdWU6IGkzMikgeworICAgIHNlbGYuZmJiXy5wdXNoX3Nsb3Q6OjxpMzI+KEFubm90YXRpb25zOjpWVF9WQUxVRSwgdmFsdWUsIDApOworICB9CisgICNbaW5saW5lXQorICBwdWIgZm4gbmV3KF9mYmI6ICYnYiBtdXQgZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyPCdhPikgLT4gQW5ub3RhdGlvbnNCdWlsZGVyPCdhLCAnYj4geworICAgIGxldCBzdGFydCA9IF9mYmIuc3RhcnRfdGFibGUoKTsKKyAgICBBbm5vdGF0aW9uc0J1aWxkZXIgeworICAgICAgZmJiXzogX2ZiYiwKKyAgICAgIHN0YXJ0Xzogc3RhcnQsCisgICAgfQorICB9CisgICNbaW5saW5lXQorICBwdWIgZm4gZmluaXNoKHNlbGYpIC0+IGZsYXRidWZmZXJzOjpXSVBPZmZzZXQ8QW5ub3RhdGlvbnM8J2E+PiB7CisgICAgbGV0IG8gPSBzZWxmLmZiYl8uZW5kX3RhYmxlKHNlbGYuc3RhcnRfKTsKKyAgICBmbGF0YnVmZmVyczo6V0lQT2Zmc2V0OjpuZXcoby52YWx1ZSgpKQorICB9Cit9CisKK2ltcGwgY29yZTo6Zm10OjpEZWJ1ZyBmb3IgQW5ub3RhdGlvbnM8J18+IHsKKyAgZm4gZm10KCZzZWxmLCBmOiAmbXV0IGNvcmU6OmZtdDo6Rm9ybWF0dGVyPCdfPikgLT4gY29yZTo6Zm10OjpSZXN1bHQgeworICAgIGxldCBtdXQgZHMgPSBmLmRlYnVnX3N0cnVjdCgiQW5ub3RhdGlvbnMiKTsKKyAgICAgIGRzLmZpZWxkKCJ2YWx1ZSIsICZzZWxmLnZhbHVlKCkpOworICAgICAgZHMuZmluaXNoKCkKKyAgfQorfQorI1tub25fZXhoYXVzdGl2ZV0KKyNbZGVyaXZlKERlYnVnLCBDbG9uZSwgUGFydGlhbEVxKV0KK3B1YihjcmF0ZSkgc3RydWN0IEFubm90YXRpb25zVCB7CisgIHB1YiB2YWx1ZTogaTMyLAorfQoraW1wbCBEZWZhdWx0IGZvciBBbm5vdGF0aW9uc1QgeworICBmbiBkZWZhdWx0KCkgLT4gU2VsZiB7CisgICAgU2VsZiB7CisgICAgICB2YWx1ZTogMCwKKyAgICB9CisgIH0KK30KK2ltcGwgQW5ub3RhdGlvbnNUIHsKKyAgcHViIGZuIHBhY2s8J2I+KAorICAgICZzZWxmLAorICAgIF9mYmI6ICZtdXQgZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyPCdiPgorICApIC0+IGZsYXRidWZmZXJzOjpXSVBPZmZzZXQ8QW5ub3RhdGlvbnM8J2I+PiB7CisgICAgbGV0IHZhbHVlID0gc2VsZi52YWx1ZTsKKyAgICBBbm5vdGF0aW9uczo6Y3JlYXRlKF9mYmIsICZBbm5vdGF0aW9uc0FyZ3N7CisgICAgICB2YWx1ZSwKKyAgICB9KQorICB9Cit9CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9wcml2YXRlX2Fubm90YXRpb25fdGVzdC9hbnlfZ2VuZXJhdGVkLnJzIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvcHJpdmF0ZV9hbm5vdGF0aW9uX3Rlc3QvYW55X2dlbmVyYXRlZC5ycwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMzA0OWEwCi0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvcHJpdmF0ZV9hbm5vdGF0aW9uX3Rlc3QvYW55X2dlbmVyYXRlZC5ycwpAQCAtMCwwICsxLDE3NSBAQAorLy8gYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgYnkgdGhlIEZsYXRCdWZmZXJzIGNvbXBpbGVyLCBkbyBub3QgbW9kaWZ5CisvLyBAZ2VuZXJhdGVkCitleHRlcm4gY3JhdGUgYWxsb2M7CitleHRlcm4gY3JhdGUgZmxhdGJ1ZmZlcnM7Cit1c2UgYWxsb2M6OmJveGVkOjpCb3g7Cit1c2UgYWxsb2M6OnN0cmluZzo6e1N0cmluZywgVG9TdHJpbmd9OwordXNlIGFsbG9jOjp2ZWM6OlZlYzsKK3VzZSBjb3JlOjptZW07Cit1c2UgY29yZTo6Y21wOjpPcmRlcmluZzsKK3VzZSBzZWxmOjpmbGF0YnVmZmVyczo6e0VuZGlhblNjYWxhciwgRm9sbG93fTsKK3VzZSBzdXBlcjo6KjsKKyNbZGVwcmVjYXRlZChzaW5jZSA9ICIyLjAuMCIsIG5vdGUgPSAiVXNlIGFzc29jaWF0ZWQgY29uc3RhbnRzIGluc3RlYWQuIFRoaXMgd2lsbCBubyBsb25nZXIgYmUgZ2VuZXJhdGVkIGluIDIwMjEuIildCitwdWIgY29uc3QgRU5VTV9NSU5fQU5ZOiB1OCA9IDA7CisjW2RlcHJlY2F0ZWQoc2luY2UgPSAiMi4wLjAiLCBub3RlID0gIlVzZSBhc3NvY2lhdGVkIGNvbnN0YW50cyBpbnN0ZWFkLiBUaGlzIHdpbGwgbm8gbG9uZ2VyIGJlIGdlbmVyYXRlZCBpbiAyMDIxLiIpXQorcHViIGNvbnN0IEVOVU1fTUFYX0FOWTogdTggPSAyOworI1tkZXByZWNhdGVkKHNpbmNlID0gIjIuMC4wIiwgbm90ZSA9ICJVc2UgYXNzb2NpYXRlZCBjb25zdGFudHMgaW5zdGVhZC4gVGhpcyB3aWxsIG5vIGxvbmdlciBiZSBnZW5lcmF0ZWQgaW4gMjAyMS4iKV0KKyNbYWxsb3cobm9uX2NhbWVsX2Nhc2VfdHlwZXMpXQorcHViIGNvbnN0IEVOVU1fVkFMVUVTX0FOWTogW0FueTsgM10gPSBbCisgIEFueTo6Tk9ORSwKKyAgQW55OjpHYW1lLAorICBBbnk6OkFubm90YXRpb25zLAorXTsKKworI1tkZXJpdmUoQ2xvbmUsIENvcHksIFBhcnRpYWxFcSwgRXEsIFBhcnRpYWxPcmQsIE9yZCwgSGFzaCwgRGVmYXVsdCldCisjW3JlcHIodHJhbnNwYXJlbnQpXQorcHViKGNyYXRlKSBzdHJ1Y3QgQW55KHB1YiB1OCk7CisjW2FsbG93KG5vbl91cHBlcl9jYXNlX2dsb2JhbHMpXQoraW1wbCBBbnkgeworICBwdWIgY29uc3QgTk9ORTogU2VsZiA9IFNlbGYoMCk7CisgIHB1YiBjb25zdCBHYW1lOiBTZWxmID0gU2VsZigxKTsKKyAgcHViIGNvbnN0IEFubm90YXRpb25zOiBTZWxmID0gU2VsZigyKTsKKworICBwdWIgY29uc3QgRU5VTV9NSU46IHU4ID0gMDsKKyAgcHViIGNvbnN0IEVOVU1fTUFYOiB1OCA9IDI7CisgIHB1YiBjb25zdCBFTlVNX1ZBTFVFUzogJidzdGF0aWMgW1NlbGZdID0gJlsKKyAgICBTZWxmOjpOT05FLAorICAgIFNlbGY6OkdhbWUsCisgICAgU2VsZjo6QW5ub3RhdGlvbnMsCisgIF07CisgIC8vLyBSZXR1cm5zIHRoZSB2YXJpYW50J3MgbmFtZSBvciAiIiBpZiB1bmtub3duLgorICBwdWIgZm4gdmFyaWFudF9uYW1lKHNlbGYpIC0+IE9wdGlvbjwmJ3N0YXRpYyBzdHI+IHsKKyAgICBtYXRjaCBzZWxmIHsKKyAgICAgIFNlbGY6Ok5PTkUgPT4gU29tZSgiTk9ORSIpLAorICAgICAgU2VsZjo6R2FtZSA9PiBTb21lKCJHYW1lIiksCisgICAgICBTZWxmOjpBbm5vdGF0aW9ucyA9PiBTb21lKCJBbm5vdGF0aW9ucyIpLAorICAgICAgXyA9PiBOb25lLAorICAgIH0KKyAgfQorfQoraW1wbCBjb3JlOjpmbXQ6OkRlYnVnIGZvciBBbnkgeworICBmbiBmbXQoJnNlbGYsIGY6ICZtdXQgY29yZTo6Zm10OjpGb3JtYXR0ZXIpIC0+IGNvcmU6OmZtdDo6UmVzdWx0IHsKKyAgICBpZiBsZXQgU29tZShuYW1lKSA9IHNlbGYudmFyaWFudF9uYW1lKCkgeworICAgICAgZi53cml0ZV9zdHIobmFtZSkKKyAgICB9IGVsc2UgeworICAgICAgZi53cml0ZV9mbXQoZm9ybWF0X2FyZ3MhKCI8VU5LTk9XTiB7Oj99PiIsIHNlbGYuMCkpCisgICAgfQorICB9Cit9CitpbXBsPCdhPiBmbGF0YnVmZmVyczo6Rm9sbG93PCdhPiBmb3IgQW55IHsKKyAgdHlwZSBJbm5lciA9IFNlbGY7CisgICNbaW5saW5lXQorICBmbiBmb2xsb3coYnVmOiAmJ2EgW3U4XSwgbG9jOiB1c2l6ZSkgLT4gU2VsZjo6SW5uZXIgeworICAgIGxldCBiID0gdW5zYWZlIHsKKyAgICAgIGZsYXRidWZmZXJzOjpyZWFkX3NjYWxhcl9hdDo6PHU4PihidWYsIGxvYykKKyAgICB9OworICAgIFNlbGYoYikKKyAgfQorfQorCitpbXBsIGZsYXRidWZmZXJzOjpQdXNoIGZvciBBbnkgeworICAgIHR5cGUgT3V0cHV0ID0gQW55OworICAgICNbaW5saW5lXQorICAgIGZuIHB1c2goJnNlbGYsIGRzdDogJm11dCBbdThdLCBfcmVzdDogJlt1OF0pIHsKKyAgICAgICAgdW5zYWZlIHsgZmxhdGJ1ZmZlcnM6OmVtcGxhY2Vfc2NhbGFyOjo8dTg+KGRzdCwgc2VsZi4wKTsgfQorICAgIH0KK30KKworaW1wbCBmbGF0YnVmZmVyczo6RW5kaWFuU2NhbGFyIGZvciBBbnkgeworICAjW2lubGluZV0KKyAgZm4gdG9fbGl0dGxlX2VuZGlhbihzZWxmKSAtPiBTZWxmIHsKKyAgICBsZXQgYiA9IHU4Ojp0b19sZShzZWxmLjApOworICAgIFNlbGYoYikKKyAgfQorICAjW2lubGluZV0KKyAgI1thbGxvdyhjbGlwcHk6Ondyb25nX3NlbGZfY29udmVudGlvbildCisgIGZuIGZyb21fbGl0dGxlX2VuZGlhbihzZWxmKSAtPiBTZWxmIHsKKyAgICBsZXQgYiA9IHU4Ojpmcm9tX2xlKHNlbGYuMCk7CisgICAgU2VsZihiKQorICB9Cit9CisKK2ltcGw8J2E+IGZsYXRidWZmZXJzOjpWZXJpZmlhYmxlIGZvciBBbnkgeworICAjW2lubGluZV0KKyAgZm4gcnVuX3ZlcmlmaWVyKAorICAgIHY6ICZtdXQgZmxhdGJ1ZmZlcnM6OlZlcmlmaWVyLCBwb3M6IHVzaXplCisgICkgLT4gUmVzdWx0PCgpLCBmbGF0YnVmZmVyczo6SW52YWxpZEZsYXRidWZmZXI+IHsKKyAgICB1c2Ugc2VsZjo6ZmxhdGJ1ZmZlcnM6OlZlcmlmaWFibGU7CisgICAgdTg6OnJ1bl92ZXJpZmllcih2LCBwb3MpCisgIH0KK30KKworaW1wbCBmbGF0YnVmZmVyczo6U2ltcGxlVG9WZXJpZnlJblNsaWNlIGZvciBBbnkge30KK3B1YihjcmF0ZSkgc3RydWN0IEFueVVuaW9uVGFibGVPZmZzZXQge30KKworI1thbGxvdyhjbGlwcHk6OnVwcGVyX2Nhc2VfYWNyb255bXMpXQorI1tub25fZXhoYXVzdGl2ZV0KKyNbZGVyaXZlKERlYnVnLCBDbG9uZSwgUGFydGlhbEVxKV0KK3B1YihjcmF0ZSkgZW51bSBBbnlUIHsKKyAgTk9ORSwKKyAgR2FtZShCb3g8R2FtZVQ+KSwKKyAgQW5ub3RhdGlvbnMoQm94PEFubm90YXRpb25zVD4pLAorfQoraW1wbCBEZWZhdWx0IGZvciBBbnlUIHsKKyAgZm4gZGVmYXVsdCgpIC0+IFNlbGYgeworICAgIFNlbGY6Ok5PTkUKKyAgfQorfQoraW1wbCBBbnlUIHsKKyAgcHViIGZuIGFueV90eXBlKCZzZWxmKSAtPiBBbnkgeworICAgIG1hdGNoIHNlbGYgeworICAgICAgU2VsZjo6Tk9ORSA9PiBBbnk6Ok5PTkUsCisgICAgICBTZWxmOjpHYW1lKF8pID0+IEFueTo6R2FtZSwKKyAgICAgIFNlbGY6OkFubm90YXRpb25zKF8pID0+IEFueTo6QW5ub3RhdGlvbnMsCisgICAgfQorICB9CisgIHB1YiBmbiBwYWNrKCZzZWxmLCBmYmI6ICZtdXQgZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyKSAtPiBPcHRpb248ZmxhdGJ1ZmZlcnM6OldJUE9mZnNldDxmbGF0YnVmZmVyczo6VW5pb25XSVBPZmZzZXQ+PiB7CisgICAgbWF0Y2ggc2VsZiB7CisgICAgICBTZWxmOjpOT05FID0+IE5vbmUsCisgICAgICBTZWxmOjpHYW1lKHYpID0+IFNvbWUodi5wYWNrKGZiYikuYXNfdW5pb25fdmFsdWUoKSksCisgICAgICBTZWxmOjpBbm5vdGF0aW9ucyh2KSA9PiBTb21lKHYucGFjayhmYmIpLmFzX3VuaW9uX3ZhbHVlKCkpLAorICAgIH0KKyAgfQorICAvLy8gSWYgdGhlIHVuaW9uIHZhcmlhbnQgbWF0Y2hlcywgcmV0dXJuIHRoZSBvd25lZCBHYW1lVCwgc2V0dGluZyB0aGUgdW5pb24gdG8gTk9ORS4KKyAgcHViIGZuIHRha2VfZ2FtZSgmbXV0IHNlbGYpIC0+IE9wdGlvbjxCb3g8R2FtZVQ+PiB7CisgICAgaWYgbGV0IFNlbGY6OkdhbWUoXykgPSBzZWxmIHsKKyAgICAgIGxldCB2ID0gY29yZTo6bWVtOjpyZXBsYWNlKHNlbGYsIFNlbGY6Ok5PTkUpOworICAgICAgaWYgbGV0IFNlbGY6OkdhbWUodykgPSB2IHsKKyAgICAgICAgU29tZSh3KQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgdW5yZWFjaGFibGUhKCkKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgTm9uZQorICAgIH0KKyAgfQorICAvLy8gSWYgdGhlIHVuaW9uIHZhcmlhbnQgbWF0Y2hlcywgcmV0dXJuIGEgcmVmZXJlbmNlIHRvIHRoZSBHYW1lVC4KKyAgcHViIGZuIGFzX2dhbWUoJnNlbGYpIC0+IE9wdGlvbjwmR2FtZVQ+IHsKKyAgICBpZiBsZXQgU2VsZjo6R2FtZSh2KSA9IHNlbGYgeyBTb21lKHYuYXNfcmVmKCkpIH0gZWxzZSB7IE5vbmUgfQorICB9CisgIC8vLyBJZiB0aGUgdW5pb24gdmFyaWFudCBtYXRjaGVzLCByZXR1cm4gYSBtdXRhYmxlIHJlZmVyZW5jZSB0byB0aGUgR2FtZVQuCisgIHB1YiBmbiBhc19nYW1lX211dCgmbXV0IHNlbGYpIC0+IE9wdGlvbjwmbXV0IEdhbWVUPiB7CisgICAgaWYgbGV0IFNlbGY6OkdhbWUodikgPSBzZWxmIHsgU29tZSh2LmFzX211dCgpKSB9IGVsc2UgeyBOb25lIH0KKyAgfQorICAvLy8gSWYgdGhlIHVuaW9uIHZhcmlhbnQgbWF0Y2hlcywgcmV0dXJuIHRoZSBvd25lZCBBbm5vdGF0aW9uc1QsIHNldHRpbmcgdGhlIHVuaW9uIHRvIE5PTkUuCisgIHB1YiBmbiB0YWtlX2Fubm90YXRpb25zKCZtdXQgc2VsZikgLT4gT3B0aW9uPEJveDxBbm5vdGF0aW9uc1Q+PiB7CisgICAgaWYgbGV0IFNlbGY6OkFubm90YXRpb25zKF8pID0gc2VsZiB7CisgICAgICBsZXQgdiA9IGNvcmU6Om1lbTo6cmVwbGFjZShzZWxmLCBTZWxmOjpOT05FKTsKKyAgICAgIGlmIGxldCBTZWxmOjpBbm5vdGF0aW9ucyh3KSA9IHYgeworICAgICAgICBTb21lKHcpCisgICAgICB9IGVsc2UgeworICAgICAgICB1bnJlYWNoYWJsZSEoKQorICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBOb25lCisgICAgfQorICB9CisgIC8vLyBJZiB0aGUgdW5pb24gdmFyaWFudCBtYXRjaGVzLCByZXR1cm4gYSByZWZlcmVuY2UgdG8gdGhlIEFubm90YXRpb25zVC4KKyAgcHViIGZuIGFzX2Fubm90YXRpb25zKCZzZWxmKSAtPiBPcHRpb248JkFubm90YXRpb25zVD4geworICAgIGlmIGxldCBTZWxmOjpBbm5vdGF0aW9ucyh2KSA9IHNlbGYgeyBTb21lKHYuYXNfcmVmKCkpIH0gZWxzZSB7IE5vbmUgfQorICB9CisgIC8vLyBJZiB0aGUgdW5pb24gdmFyaWFudCBtYXRjaGVzLCByZXR1cm4gYSBtdXRhYmxlIHJlZmVyZW5jZSB0byB0aGUgQW5ub3RhdGlvbnNULgorICBwdWIgZm4gYXNfYW5ub3RhdGlvbnNfbXV0KCZtdXQgc2VsZikgLT4gT3B0aW9uPCZtdXQgQW5ub3RhdGlvbnNUPiB7CisgICAgaWYgbGV0IFNlbGY6OkFubm90YXRpb25zKHYpID0gc2VsZiB7IFNvbWUodi5hc19tdXQoKSkgfSBlbHNlIHsgTm9uZSB9CisgIH0KK30KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL3ByaXZhdGVfYW5ub3RhdGlvbl90ZXN0L2dhbWVfZ2VuZXJhdGVkLnJzIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvcHJpdmF0ZV9hbm5vdGF0aW9uX3Rlc3QvZ2FtZV9nZW5lcmF0ZWQucnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY5NjYxMQotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL3ByaXZhdGVfYW5ub3RhdGlvbl90ZXN0L2dhbWVfZ2VuZXJhdGVkLnJzCkBAIC0wLDAgKzEsMTM4IEBACisvLyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBieSB0aGUgRmxhdEJ1ZmZlcnMgY29tcGlsZXIsIGRvIG5vdCBtb2RpZnkKKy8vIEBnZW5lcmF0ZWQKK2V4dGVybiBjcmF0ZSBhbGxvYzsKK2V4dGVybiBjcmF0ZSBmbGF0YnVmZmVyczsKK3VzZSBhbGxvYzo6Ym94ZWQ6OkJveDsKK3VzZSBhbGxvYzo6c3RyaW5nOjp7U3RyaW5nLCBUb1N0cmluZ307Cit1c2UgYWxsb2M6OnZlYzo6VmVjOwordXNlIGNvcmU6Om1lbTsKK3VzZSBjb3JlOjpjbXA6Ok9yZGVyaW5nOwordXNlIHNlbGY6OmZsYXRidWZmZXJzOjp7RW5kaWFuU2NhbGFyLCBGb2xsb3d9OwordXNlIHN1cGVyOjoqOworcHViKGNyYXRlKSBlbnVtIEdhbWVPZmZzZXQge30KKyNbZGVyaXZlKENvcHksIENsb25lLCBQYXJ0aWFsRXEpXQorCitwdWIoY3JhdGUpIHN0cnVjdCBHYW1lPCdhPiB7CisgIHB1YiBfdGFiOiBmbGF0YnVmZmVyczo6VGFibGU8J2E+LAorfQorCitpbXBsPCdhPiBmbGF0YnVmZmVyczo6Rm9sbG93PCdhPiBmb3IgR2FtZTwnYT4geworICB0eXBlIElubmVyID0gR2FtZTwnYT47CisgICNbaW5saW5lXQorICBmbiBmb2xsb3coYnVmOiAmJ2EgW3U4XSwgbG9jOiB1c2l6ZSkgLT4gU2VsZjo6SW5uZXIgeworICAgIFNlbGYgeyBfdGFiOiBmbGF0YnVmZmVyczo6VGFibGUgeyBidWYsIGxvYyB9IH0KKyAgfQorfQorCitpbXBsPCdhPiBHYW1lPCdhPiB7CisgIHB1YiBjb25zdCBWVF9WQUxVRTogZmxhdGJ1ZmZlcnM6OlZPZmZzZXRUID0gNDsKKworICBwdWIgY29uc3QgZm4gZ2V0X2Z1bGx5X3F1YWxpZmllZF9uYW1lKCkgLT4gJidzdGF0aWMgc3RyIHsKKyAgICAiR2FtZSIKKyAgfQorCisgICNbaW5saW5lXQorICBwdWIgZm4gaW5pdF9mcm9tX3RhYmxlKHRhYmxlOiBmbGF0YnVmZmVyczo6VGFibGU8J2E+KSAtPiBTZWxmIHsKKyAgICBHYW1lIHsgX3RhYjogdGFibGUgfQorICB9CisgICNbYWxsb3codW51c2VkX211dCldCisgIHB1YiBmbiBjcmVhdGU8J2JsZHI6ICdhcmdzLCAnYXJnczogJ211dF9ibGRyLCAnbXV0X2JsZHI+KAorICAgIF9mYmI6ICYnbXV0X2JsZHIgbXV0IGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlcjwnYmxkcj4sCisgICAgYXJnczogJidhcmdzIEdhbWVBcmdzCisgICkgLT4gZmxhdGJ1ZmZlcnM6OldJUE9mZnNldDxHYW1lPCdibGRyPj4geworICAgIGxldCBtdXQgYnVpbGRlciA9IEdhbWVCdWlsZGVyOjpuZXcoX2ZiYik7CisgICAgYnVpbGRlci5hZGRfdmFsdWUoYXJncy52YWx1ZSk7CisgICAgYnVpbGRlci5maW5pc2goKQorICB9CisKKyAgcHViIGZuIHVucGFjaygmc2VsZikgLT4gR2FtZVQgeworICAgIGxldCB2YWx1ZSA9IHNlbGYudmFsdWUoKTsKKyAgICBHYW1lVCB7CisgICAgICB2YWx1ZSwKKyAgICB9CisgIH0KKworICAjW2lubGluZV0KKyAgcHViIGZuIHZhbHVlKCZzZWxmKSAtPiBpMzIgeworICAgIHNlbGYuX3RhYi5nZXQ6OjxpMzI+KEdhbWU6OlZUX1ZBTFVFLCBTb21lKDApKS51bndyYXAoKQorICB9Cit9CisKK2ltcGwgZmxhdGJ1ZmZlcnM6OlZlcmlmaWFibGUgZm9yIEdhbWU8J18+IHsKKyAgI1tpbmxpbmVdCisgIGZuIHJ1bl92ZXJpZmllcigKKyAgICB2OiAmbXV0IGZsYXRidWZmZXJzOjpWZXJpZmllciwgcG9zOiB1c2l6ZQorICApIC0+IFJlc3VsdDwoKSwgZmxhdGJ1ZmZlcnM6OkludmFsaWRGbGF0YnVmZmVyPiB7CisgICAgdXNlIHNlbGY6OmZsYXRidWZmZXJzOjpWZXJpZmlhYmxlOworICAgIHYudmlzaXRfdGFibGUocG9zKT8KKyAgICAgLnZpc2l0X2ZpZWxkOjo8aTMyPigidmFsdWUiLCBTZWxmOjpWVF9WQUxVRSwgZmFsc2UpPworICAgICAuZmluaXNoKCk7CisgICAgT2soKCkpCisgIH0KK30KK3B1YihjcmF0ZSkgc3RydWN0IEdhbWVBcmdzIHsKKyAgICBwdWIgdmFsdWU6IGkzMiwKK30KK2ltcGw8J2E+IERlZmF1bHQgZm9yIEdhbWVBcmdzIHsKKyAgI1tpbmxpbmVdCisgIGZuIGRlZmF1bHQoKSAtPiBTZWxmIHsKKyAgICBHYW1lQXJncyB7CisgICAgICB2YWx1ZTogMCwKKyAgICB9CisgIH0KK30KKworcHViKGNyYXRlKSBzdHJ1Y3QgR2FtZUJ1aWxkZXI8J2E6ICdiLCAnYj4geworICBmYmJfOiAmJ2IgbXV0IGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlcjwnYT4sCisgIHN0YXJ0XzogZmxhdGJ1ZmZlcnM6OldJUE9mZnNldDxmbGF0YnVmZmVyczo6VGFibGVVbmZpbmlzaGVkV0lQT2Zmc2V0PiwKK30KK2ltcGw8J2E6ICdiLCAnYj4gR2FtZUJ1aWxkZXI8J2EsICdiPiB7CisgICNbaW5saW5lXQorICBwdWIgZm4gYWRkX3ZhbHVlKCZtdXQgc2VsZiwgdmFsdWU6IGkzMikgeworICAgIHNlbGYuZmJiXy5wdXNoX3Nsb3Q6OjxpMzI+KEdhbWU6OlZUX1ZBTFVFLCB2YWx1ZSwgMCk7CisgIH0KKyAgI1tpbmxpbmVdCisgIHB1YiBmbiBuZXcoX2ZiYjogJidiIG11dCBmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXI8J2E+KSAtPiBHYW1lQnVpbGRlcjwnYSwgJ2I+IHsKKyAgICBsZXQgc3RhcnQgPSBfZmJiLnN0YXJ0X3RhYmxlKCk7CisgICAgR2FtZUJ1aWxkZXIgeworICAgICAgZmJiXzogX2ZiYiwKKyAgICAgIHN0YXJ0Xzogc3RhcnQsCisgICAgfQorICB9CisgICNbaW5saW5lXQorICBwdWIgZm4gZmluaXNoKHNlbGYpIC0+IGZsYXRidWZmZXJzOjpXSVBPZmZzZXQ8R2FtZTwnYT4+IHsKKyAgICBsZXQgbyA9IHNlbGYuZmJiXy5lbmRfdGFibGUoc2VsZi5zdGFydF8pOworICAgIGZsYXRidWZmZXJzOjpXSVBPZmZzZXQ6Om5ldyhvLnZhbHVlKCkpCisgIH0KK30KKworaW1wbCBjb3JlOjpmbXQ6OkRlYnVnIGZvciBHYW1lPCdfPiB7CisgIGZuIGZtdCgmc2VsZiwgZjogJm11dCBjb3JlOjpmbXQ6OkZvcm1hdHRlcjwnXz4pIC0+IGNvcmU6OmZtdDo6UmVzdWx0IHsKKyAgICBsZXQgbXV0IGRzID0gZi5kZWJ1Z19zdHJ1Y3QoIkdhbWUiKTsKKyAgICAgIGRzLmZpZWxkKCJ2YWx1ZSIsICZzZWxmLnZhbHVlKCkpOworICAgICAgZHMuZmluaXNoKCkKKyAgfQorfQorI1tub25fZXhoYXVzdGl2ZV0KKyNbZGVyaXZlKERlYnVnLCBDbG9uZSwgUGFydGlhbEVxKV0KK3B1YihjcmF0ZSkgc3RydWN0IEdhbWVUIHsKKyAgcHViIHZhbHVlOiBpMzIsCit9CitpbXBsIERlZmF1bHQgZm9yIEdhbWVUIHsKKyAgZm4gZGVmYXVsdCgpIC0+IFNlbGYgeworICAgIFNlbGYgeworICAgICAgdmFsdWU6IDAsCisgICAgfQorICB9Cit9CitpbXBsIEdhbWVUIHsKKyAgcHViIGZuIHBhY2s8J2I+KAorICAgICZzZWxmLAorICAgIF9mYmI6ICZtdXQgZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyPCdiPgorICApIC0+IGZsYXRidWZmZXJzOjpXSVBPZmZzZXQ8R2FtZTwnYj4+IHsKKyAgICBsZXQgdmFsdWUgPSBzZWxmLnZhbHVlOworICAgIEdhbWU6OmNyZWF0ZShfZmJiLCAmR2FtZUFyZ3N7CisgICAgICB2YWx1ZSwKKyAgICB9KQorICB9Cit9CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9wcml2YXRlX2Fubm90YXRpb25fdGVzdC9tb2QucnMgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9wcml2YXRlX2Fubm90YXRpb25fdGVzdC9tb2QucnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGVmNTE4NAotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL3ByaXZhdGVfYW5ub3RhdGlvbl90ZXN0L21vZC5ycwpAQCAtMCwwICsxLDEyIEBACisvLyBBdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBieSB0aGUgRmxhdGJ1ZmZlcnMgY29tcGlsZXIuIERvIG5vdCBtb2RpZnkuCisvLyBAZ2VuZXJhdGVkCittb2QgYWJfZ2VuZXJhdGVkOworcHViIHVzZSBzZWxmOjphYl9nZW5lcmF0ZWQ6Oio7Cittb2QgYW55X2dlbmVyYXRlZDsKK3B1YiB1c2Ugc2VsZjo6YW55X2dlbmVyYXRlZDo6KjsKK21vZCBvYmplY3RfZ2VuZXJhdGVkOworcHViIHVzZSBzZWxmOjpvYmplY3RfZ2VuZXJhdGVkOjoqOworbW9kIGdhbWVfZ2VuZXJhdGVkOworcHViIHVzZSBzZWxmOjpnYW1lX2dlbmVyYXRlZDo6KjsKK21vZCBhbm5vdGF0aW9uc19nZW5lcmF0ZWQ7CitwdWIgdXNlIHNlbGY6OmFubm90YXRpb25zX2dlbmVyYXRlZDo6KjsKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL3ByaXZhdGVfYW5ub3RhdGlvbl90ZXN0L29iamVjdF9nZW5lcmF0ZWQucnMgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9wcml2YXRlX2Fubm90YXRpb25fdGVzdC9vYmplY3RfZ2VuZXJhdGVkLnJzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY0NDE5YTkKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9wcml2YXRlX2Fubm90YXRpb25fdGVzdC9vYmplY3RfZ2VuZXJhdGVkLnJzCkBAIC0wLDAgKzEsMTMyIEBACisvLyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBieSB0aGUgRmxhdEJ1ZmZlcnMgY29tcGlsZXIsIGRvIG5vdCBtb2RpZnkKKy8vIEBnZW5lcmF0ZWQKK2V4dGVybiBjcmF0ZSBhbGxvYzsKK2V4dGVybiBjcmF0ZSBmbGF0YnVmZmVyczsKK3VzZSBhbGxvYzo6Ym94ZWQ6OkJveDsKK3VzZSBhbGxvYzo6c3RyaW5nOjp7U3RyaW5nLCBUb1N0cmluZ307Cit1c2UgYWxsb2M6OnZlYzo6VmVjOwordXNlIGNvcmU6Om1lbTsKK3VzZSBjb3JlOjpjbXA6Ok9yZGVyaW5nOwordXNlIHNlbGY6OmZsYXRidWZmZXJzOjp7RW5kaWFuU2NhbGFyLCBGb2xsb3d9OwordXNlIHN1cGVyOjoqOworLy8gc3RydWN0IE9iamVjdCwgYWxpZ25lZCB0byA0CisjW3JlcHIodHJhbnNwYXJlbnQpXQorI1tkZXJpdmUoQ2xvbmUsIENvcHksIFBhcnRpYWxFcSldCitwdWIoY3JhdGUpIHN0cnVjdCBPYmplY3QocHViIFt1ODsgNF0pOworaW1wbCBEZWZhdWx0IGZvciBPYmplY3QgeyAKKyAgZm4gZGVmYXVsdCgpIC0+IFNlbGYgeyAKKyAgICBTZWxmKFswOyA0XSkKKyAgfQorfQoraW1wbCBjb3JlOjpmbXQ6OkRlYnVnIGZvciBPYmplY3QgeworICBmbiBmbXQoJnNlbGYsIGY6ICZtdXQgY29yZTo6Zm10OjpGb3JtYXR0ZXIpIC0+IGNvcmU6OmZtdDo6UmVzdWx0IHsKKyAgICBmLmRlYnVnX3N0cnVjdCgiT2JqZWN0IikKKyAgICAgIC5maWVsZCgidmFsdWUiLCAmc2VsZi52YWx1ZSgpKQorICAgICAgLmZpbmlzaCgpCisgIH0KK30KKworaW1wbCBmbGF0YnVmZmVyczo6U2ltcGxlVG9WZXJpZnlJblNsaWNlIGZvciBPYmplY3Qge30KK2ltcGwgZmxhdGJ1ZmZlcnM6OlNhZmVTbGljZUFjY2VzcyBmb3IgT2JqZWN0IHt9CitpbXBsPCdhPiBmbGF0YnVmZmVyczo6Rm9sbG93PCdhPiBmb3IgT2JqZWN0IHsKKyAgdHlwZSBJbm5lciA9ICYnYSBPYmplY3Q7CisgICNbaW5saW5lXQorICBmbiBmb2xsb3coYnVmOiAmJ2EgW3U4XSwgbG9jOiB1c2l6ZSkgLT4gU2VsZjo6SW5uZXIgeworICAgIDwmJ2EgT2JqZWN0Pjo6Zm9sbG93KGJ1ZiwgbG9jKQorICB9Cit9CitpbXBsPCdhPiBmbGF0YnVmZmVyczo6Rm9sbG93PCdhPiBmb3IgJidhIE9iamVjdCB7CisgIHR5cGUgSW5uZXIgPSAmJ2EgT2JqZWN0OworICAjW2lubGluZV0KKyAgZm4gZm9sbG93KGJ1ZjogJidhIFt1OF0sIGxvYzogdXNpemUpIC0+IFNlbGY6OklubmVyIHsKKyAgICBmbGF0YnVmZmVyczo6Zm9sbG93X2Nhc3RfcmVmOjo8T2JqZWN0PihidWYsIGxvYykKKyAgfQorfQoraW1wbDwnYj4gZmxhdGJ1ZmZlcnM6OlB1c2ggZm9yIE9iamVjdCB7CisgICAgdHlwZSBPdXRwdXQgPSBPYmplY3Q7CisgICAgI1tpbmxpbmVdCisgICAgZm4gcHVzaCgmc2VsZiwgZHN0OiAmbXV0IFt1OF0sIF9yZXN0OiAmW3U4XSkgeworICAgICAgICBsZXQgc3JjID0gdW5zYWZlIHsKKyAgICAgICAgICAgIDo6Y29yZTo6c2xpY2U6OmZyb21fcmF3X3BhcnRzKHNlbGYgYXMgKmNvbnN0IE9iamVjdCBhcyAqY29uc3QgdTgsIFNlbGY6OnNpemUoKSkKKyAgICAgICAgfTsKKyAgICAgICAgZHN0LmNvcHlfZnJvbV9zbGljZShzcmMpOworICAgIH0KK30KK2ltcGw8J2I+IGZsYXRidWZmZXJzOjpQdXNoIGZvciAmJ2IgT2JqZWN0IHsKKyAgICB0eXBlIE91dHB1dCA9IE9iamVjdDsKKworICAgICNbaW5saW5lXQorICAgIGZuIHB1c2goJnNlbGYsIGRzdDogJm11dCBbdThdLCBfcmVzdDogJlt1OF0pIHsKKyAgICAgICAgbGV0IHNyYyA9IHVuc2FmZSB7CisgICAgICAgICAgICA6OmNvcmU6OnNsaWNlOjpmcm9tX3Jhd19wYXJ0cygqc2VsZiBhcyAqY29uc3QgT2JqZWN0IGFzICpjb25zdCB1OCwgU2VsZjo6c2l6ZSgpKQorICAgICAgICB9OworICAgICAgICBkc3QuY29weV9mcm9tX3NsaWNlKHNyYyk7CisgICAgfQorfQorCitpbXBsPCdhPiBmbGF0YnVmZmVyczo6VmVyaWZpYWJsZSBmb3IgT2JqZWN0IHsKKyAgI1tpbmxpbmVdCisgIGZuIHJ1bl92ZXJpZmllcigKKyAgICB2OiAmbXV0IGZsYXRidWZmZXJzOjpWZXJpZmllciwgcG9zOiB1c2l6ZQorICApIC0+IFJlc3VsdDwoKSwgZmxhdGJ1ZmZlcnM6OkludmFsaWRGbGF0YnVmZmVyPiB7CisgICAgdXNlIHNlbGY6OmZsYXRidWZmZXJzOjpWZXJpZmlhYmxlOworICAgIHYuaW5fYnVmZmVyOjo8U2VsZj4ocG9zKQorICB9Cit9CisKK2ltcGw8J2E+IE9iamVjdCB7CisgICNbYWxsb3coY2xpcHB5Ojp0b29fbWFueV9hcmd1bWVudHMpXQorICBwdWIgZm4gbmV3KAorICAgIHZhbHVlOiBpMzIsCisgICkgLT4gU2VsZiB7CisgICAgbGV0IG11dCBzID0gU2VsZihbMDsgNF0pOworICAgIHMuc2V0X3ZhbHVlKHZhbHVlKTsKKyAgICBzCisgIH0KKworICBwdWIgY29uc3QgZm4gZ2V0X2Z1bGx5X3F1YWxpZmllZF9uYW1lKCkgLT4gJidzdGF0aWMgc3RyIHsKKyAgICAiT2JqZWN0IgorICB9CisKKyAgcHViIGZuIHZhbHVlKCZzZWxmKSAtPiBpMzIgeworICAgIGxldCBtdXQgbWVtID0gY29yZTo6bWVtOjpNYXliZVVuaW5pdDo6PGkzMj46OnVuaW5pdCgpOworICAgIHVuc2FmZSB7CisgICAgICBjb3JlOjpwdHI6OmNvcHlfbm9ub3ZlcmxhcHBpbmcoCisgICAgICAgIHNlbGYuMFswLi5dLmFzX3B0cigpLAorICAgICAgICBtZW0uYXNfbXV0X3B0cigpIGFzICptdXQgdTgsCisgICAgICAgIGNvcmU6Om1lbTo6c2l6ZV9vZjo6PGkzMj4oKSwKKyAgICAgICk7CisgICAgICBtZW0uYXNzdW1lX2luaXQoKQorICAgIH0uZnJvbV9saXR0bGVfZW5kaWFuKCkKKyAgfQorCisgIHB1YiBmbiBzZXRfdmFsdWUoJm11dCBzZWxmLCB4OiBpMzIpIHsKKyAgICBsZXQgeF9sZSA9IHgudG9fbGl0dGxlX2VuZGlhbigpOworICAgIHVuc2FmZSB7CisgICAgICBjb3JlOjpwdHI6OmNvcHlfbm9ub3ZlcmxhcHBpbmcoCisgICAgICAgICZ4X2xlIGFzICpjb25zdCBpMzIgYXMgKmNvbnN0IHU4LAorICAgICAgICBzZWxmLjBbMC4uXS5hc19tdXRfcHRyKCksCisgICAgICAgIGNvcmU6Om1lbTo6c2l6ZV9vZjo6PGkzMj4oKSwKKyAgICAgICk7CisgICAgfQorICB9CisKKyAgcHViIGZuIHVucGFjaygmc2VsZikgLT4gT2JqZWN0VCB7CisgICAgT2JqZWN0VCB7CisgICAgICB2YWx1ZTogc2VsZi52YWx1ZSgpLAorICAgIH0KKyAgfQorfQorCisjW2Rlcml2ZShEZWJ1ZywgQ2xvbmUsIFBhcnRpYWxFcSwgRGVmYXVsdCldCitwdWIoY3JhdGUpIHN0cnVjdCBPYmplY3RUIHsKKyAgcHViIHZhbHVlOiBpMzIsCit9CitpbXBsIE9iamVjdFQgeworICBwdWIgZm4gcGFjaygmc2VsZikgLT4gT2JqZWN0IHsKKyAgICBPYmplY3Q6Om5ldygKKyAgICAgIHNlbGYudmFsdWUsCisgICAgKQorICB9Cit9CisKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL3Byb3RvX3Rlc3QuY3BwIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvcHJvdG9fdGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzI4MWMyYwotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL3Byb3RvX3Rlc3QuY3BwCkBAIC0wLDAgKzEsMjA0IEBACisjaW5jbHVkZSAicHJvdG9fdGVzdC5oIgorCisjaW5jbHVkZSAiZmxhdGJ1ZmZlcnMvaWRsLmgiCisjaW5jbHVkZSAidGVzdF9hc3NlcnQuaCIKKworbmFtZXNwYWNlIGZsYXRidWZmZXJzIHsKK25hbWVzcGFjZSB0ZXN0cyB7CisKKy8vIFBhcnNlIGEgLnByb3RvIHNjaGVtYSwgb3V0cHV0IGFzIC5mYnMKK3ZvaWQgUGFyc2VQcm90b1Rlc3QoY29uc3Qgc3RkOjpzdHJpbmcgJnRlc3RzX2RhdGFfcGF0aCkgeworICAvLyBsb2FkIHRoZSAucHJvdG8gYW5kIHRoZSBnb2xkZW4gZmlsZSBmcm9tIGRpc2sKKyAgc3RkOjpzdHJpbmcgcHJvdG9maWxlOworICBzdGQ6OnN0cmluZyBnb2xkZW5maWxlOworICBzdGQ6OnN0cmluZyBnb2xkZW51bmlvbmZpbGU7CisgIFRFU1RfRVEoCisgICAgICBmbGF0YnVmZmVyczo6TG9hZEZpbGUoKHRlc3RzX2RhdGFfcGF0aCArICJwcm90b3Rlc3QvdGVzdC5wcm90byIpLmNfc3RyKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UsICZwcm90b2ZpbGUpLAorICAgICAgdHJ1ZSk7CisgIFRFU1RfRVEoCisgICAgICBmbGF0YnVmZmVyczo6TG9hZEZpbGUoKHRlc3RzX2RhdGFfcGF0aCArICJwcm90b3Rlc3QvdGVzdC5nb2xkZW4iKS5jX3N0cigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlLCAmZ29sZGVuZmlsZSksCisgICAgICB0cnVlKTsKKyAgVEVTVF9FUShmbGF0YnVmZmVyczo6TG9hZEZpbGUoCisgICAgICAgICAgICAgICh0ZXN0c19kYXRhX3BhdGggKyAicHJvdG90ZXN0L3Rlc3RfdW5pb24uZ29sZGVuIikuY19zdHIoKSwgZmFsc2UsCisgICAgICAgICAgICAgICZnb2xkZW51bmlvbmZpbGUpLAorICAgICAgICAgIHRydWUpOworCisgIGZsYXRidWZmZXJzOjpJRExPcHRpb25zIG9wdHM7CisgIG9wdHMuaW5jbHVkZV9kZXBlbmRlbmNlX2hlYWRlcnMgPSBmYWxzZTsKKyAgb3B0cy5wcm90b19tb2RlID0gdHJ1ZTsKKworICAvLyBQYXJzZSBwcm90by4KKyAgZmxhdGJ1ZmZlcnM6OlBhcnNlciBwYXJzZXIob3B0cyk7CisgIGF1dG8gcHJvdG9wYXRoID0gdGVzdHNfZGF0YV9wYXRoICsgInByb3RvdGVzdC8iOworICBjb25zdCBjaGFyICppbmNsdWRlX2RpcmVjdG9yaWVzW10gPSB7IHByb3RvcGF0aC5jX3N0cigpLCBudWxscHRyIH07CisgIFRFU1RfRVEocGFyc2VyLlBhcnNlKHByb3RvZmlsZS5jX3N0cigpLCBpbmNsdWRlX2RpcmVjdG9yaWVzKSwgdHJ1ZSk7CisKKyAgLy8gR2VuZXJhdGUgZmJzLgorICBhdXRvIGZicyA9IGZsYXRidWZmZXJzOjpHZW5lcmF0ZUZCUyhwYXJzZXIsICJ0ZXN0Iik7CisKKyAgLy8gRW5zdXJlIGdlbmVyYXRlZCBmaWxlIGlzIHBhcnNhYmxlLgorICBmbGF0YnVmZmVyczo6UGFyc2VyIHBhcnNlcjI7CisgIFRFU1RfRVEocGFyc2VyMi5QYXJzZShmYnMuY19zdHIoKSwgbnVsbHB0ciksIHRydWUpOworICBURVNUX0VRX1NUUihmYnMuY19zdHIoKSwgZ29sZGVuZmlsZS5jX3N0cigpKTsKKworICAvLyBQYXJzZSBwcm90byB3aXRoIC0tb25lb2YtdW5pb24gb3B0aW9uLgorICBvcHRzLnByb3RvX29uZW9mX3VuaW9uID0gdHJ1ZTsKKyAgZmxhdGJ1ZmZlcnM6OlBhcnNlciBwYXJzZXIzKG9wdHMpOworICBURVNUX0VRKHBhcnNlcjMuUGFyc2UocHJvdG9maWxlLmNfc3RyKCksIGluY2x1ZGVfZGlyZWN0b3JpZXMpLCB0cnVlKTsKKworICAvLyBHZW5lcmF0ZSBmYnMuCisgIGF1dG8gZmJzX3VuaW9uID0gZmxhdGJ1ZmZlcnM6OkdlbmVyYXRlRkJTKHBhcnNlcjMsICJ0ZXN0Iik7CisKKyAgLy8gRW5zdXJlIGdlbmVyYXRlZCBmaWxlIGlzIHBhcnNhYmxlLgorICBmbGF0YnVmZmVyczo6UGFyc2VyIHBhcnNlcjQ7CisgIFRFU1RfRVEocGFyc2VyNC5QYXJzZShmYnNfdW5pb24uY19zdHIoKSwgbnVsbHB0ciksIHRydWUpOworICBURVNUX0VRX1NUUihmYnNfdW5pb24uY19zdHIoKSwgZ29sZGVudW5pb25maWxlLmNfc3RyKCkpOworfQorCisvLyBQYXJzZSBhIC5wcm90byBzY2hlbWEsIG91dHB1dCBhcyAuZmJzCit2b2lkIFBhcnNlUHJvdG9UZXN0V2l0aFN1ZmZpeChjb25zdCBzdGQ6OnN0cmluZyAmdGVzdHNfZGF0YV9wYXRoKSB7CisgIC8vIGxvYWQgdGhlIC5wcm90byBhbmQgdGhlIGdvbGRlbiBmaWxlIGZyb20gZGlzaworICBzdGQ6OnN0cmluZyBwcm90b2ZpbGU7CisgIHN0ZDo6c3RyaW5nIGdvbGRlbmZpbGU7CisgIHN0ZDo6c3RyaW5nIGdvbGRlbnVuaW9uZmlsZTsKKyAgVEVTVF9FUSgKKyAgICAgIGZsYXRidWZmZXJzOjpMb2FkRmlsZSgodGVzdHNfZGF0YV9wYXRoICsgInByb3RvdGVzdC90ZXN0LnByb3RvIikuY19zdHIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSwgJnByb3RvZmlsZSksCisgICAgICB0cnVlKTsKKyAgVEVTVF9FUShmbGF0YnVmZmVyczo6TG9hZEZpbGUoCisgICAgICAgICAgICAgICh0ZXN0c19kYXRhX3BhdGggKyAicHJvdG90ZXN0L3Rlc3Rfc3VmZml4LmdvbGRlbiIpLmNfc3RyKCksIGZhbHNlLAorICAgICAgICAgICAgICAmZ29sZGVuZmlsZSksCisgICAgICAgICAgdHJ1ZSk7CisgIFRFU1RfRVEoZmxhdGJ1ZmZlcnM6OkxvYWRGaWxlKAorICAgICAgICAgICAgICAodGVzdHNfZGF0YV9wYXRoICsgInByb3RvdGVzdC90ZXN0X3VuaW9uX3N1ZmZpeC5nb2xkZW4iKS5jX3N0cigpLAorICAgICAgICAgICAgICBmYWxzZSwgJmdvbGRlbnVuaW9uZmlsZSksCisgICAgICAgICAgdHJ1ZSk7CisKKyAgZmxhdGJ1ZmZlcnM6OklETE9wdGlvbnMgb3B0czsKKyAgb3B0cy5pbmNsdWRlX2RlcGVuZGVuY2VfaGVhZGVycyA9IGZhbHNlOworICBvcHRzLnByb3RvX21vZGUgPSB0cnVlOworICBvcHRzLnByb3RvX25hbWVzcGFjZV9zdWZmaXggPSAidGVzdF9uYW1lc3BhY2Vfc3VmZml4IjsKKworICAvLyBQYXJzZSBwcm90by4KKyAgZmxhdGJ1ZmZlcnM6OlBhcnNlciBwYXJzZXIob3B0cyk7CisgIGF1dG8gcHJvdG9wYXRoID0gdGVzdHNfZGF0YV9wYXRoICsgInByb3RvdGVzdC8iOworICBjb25zdCBjaGFyICppbmNsdWRlX2RpcmVjdG9yaWVzW10gPSB7IHByb3RvcGF0aC5jX3N0cigpLCBudWxscHRyIH07CisgIFRFU1RfRVEocGFyc2VyLlBhcnNlKHByb3RvZmlsZS5jX3N0cigpLCBpbmNsdWRlX2RpcmVjdG9yaWVzKSwgdHJ1ZSk7CisKKyAgLy8gR2VuZXJhdGUgZmJzLgorICBhdXRvIGZicyA9IGZsYXRidWZmZXJzOjpHZW5lcmF0ZUZCUyhwYXJzZXIsICJ0ZXN0Iik7CisKKyAgLy8gRW5zdXJlIGdlbmVyYXRlZCBmaWxlIGlzIHBhcnNhYmxlLgorICBmbGF0YnVmZmVyczo6UGFyc2VyIHBhcnNlcjI7CisgIFRFU1RfRVEocGFyc2VyMi5QYXJzZShmYnMuY19zdHIoKSwgbnVsbHB0ciksIHRydWUpOworICBURVNUX0VRX1NUUihmYnMuY19zdHIoKSwgZ29sZGVuZmlsZS5jX3N0cigpKTsKKworICAvLyBQYXJzZSBwcm90byB3aXRoIC0tb25lb2YtdW5pb24gb3B0aW9uLgorICBvcHRzLnByb3RvX29uZW9mX3VuaW9uID0gdHJ1ZTsKKyAgZmxhdGJ1ZmZlcnM6OlBhcnNlciBwYXJzZXIzKG9wdHMpOworICBURVNUX0VRKHBhcnNlcjMuUGFyc2UocHJvdG9maWxlLmNfc3RyKCksIGluY2x1ZGVfZGlyZWN0b3JpZXMpLCB0cnVlKTsKKworICAvLyBHZW5lcmF0ZSBmYnMuCisgIGF1dG8gZmJzX3VuaW9uID0gZmxhdGJ1ZmZlcnM6OkdlbmVyYXRlRkJTKHBhcnNlcjMsICJ0ZXN0Iik7CisKKyAgLy8gRW5zdXJlIGdlbmVyYXRlZCBmaWxlIGlzIHBhcnNhYmxlLgorICBmbGF0YnVmZmVyczo6UGFyc2VyIHBhcnNlcjQ7CisgIFRFU1RfRVEocGFyc2VyNC5QYXJzZShmYnNfdW5pb24uY19zdHIoKSwgbnVsbHB0ciksIHRydWUpOworICBURVNUX0VRX1NUUihmYnNfdW5pb24uY19zdHIoKSwgZ29sZGVudW5pb25maWxlLmNfc3RyKCkpOworfQorCisvLyBQYXJzZSBhIC5wcm90byBzY2hlbWEsIG91dHB1dCBhcyAuZmJzCit2b2lkIFBhcnNlUHJvdG9UZXN0V2l0aEluY2x1ZGVzKGNvbnN0IHN0ZDo6c3RyaW5nICZ0ZXN0c19kYXRhX3BhdGgpIHsKKyAgLy8gbG9hZCB0aGUgLnByb3RvIGFuZCB0aGUgZ29sZGVuIGZpbGUgZnJvbSBkaXNrCisgIHN0ZDo6c3RyaW5nIHByb3RvZmlsZTsKKyAgc3RkOjpzdHJpbmcgZ29sZGVuZmlsZTsKKyAgc3RkOjpzdHJpbmcgZ29sZGVudW5pb25maWxlOworICBzdGQ6OnN0cmluZyBpbXBvcnRwcm90b2ZpbGU7CisgIFRFU1RfRVEoCisgICAgICBmbGF0YnVmZmVyczo6TG9hZEZpbGUoKHRlc3RzX2RhdGFfcGF0aCArICJwcm90b3Rlc3QvdGVzdC5wcm90byIpLmNfc3RyKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UsICZwcm90b2ZpbGUpLAorICAgICAgdHJ1ZSk7CisgIFRFU1RfRVEoZmxhdGJ1ZmZlcnM6OkxvYWRGaWxlKAorICAgICAgICAgICAgICAodGVzdHNfZGF0YV9wYXRoICsgInByb3RvdGVzdC9pbXBvcnRlZC5wcm90byIpLmNfc3RyKCksIGZhbHNlLAorICAgICAgICAgICAgICAmaW1wb3J0cHJvdG9maWxlKSwKKyAgICAgICAgICB0cnVlKTsKKyAgVEVTVF9FUShmbGF0YnVmZmVyczo6TG9hZEZpbGUoCisgICAgICAgICAgICAgICh0ZXN0c19kYXRhX3BhdGggKyAicHJvdG90ZXN0L3Rlc3RfaW5jbHVkZS5nb2xkZW4iKS5jX3N0cigpLAorICAgICAgICAgICAgICBmYWxzZSwgJmdvbGRlbmZpbGUpLAorICAgICAgICAgIHRydWUpOworICBURVNUX0VRKGZsYXRidWZmZXJzOjpMb2FkRmlsZSgKKyAgICAgICAgICAgICAgKHRlc3RzX2RhdGFfcGF0aCArICJwcm90b3Rlc3QvdGVzdF91bmlvbl9pbmNsdWRlLmdvbGRlbiIpLmNfc3RyKCksCisgICAgICAgICAgICAgIGZhbHNlLCAmZ29sZGVudW5pb25maWxlKSwKKyAgICAgICAgICB0cnVlKTsKKworICBmbGF0YnVmZmVyczo6SURMT3B0aW9ucyBvcHRzOworICBvcHRzLmluY2x1ZGVfZGVwZW5kZW5jZV9oZWFkZXJzID0gdHJ1ZTsKKyAgb3B0cy5wcm90b19tb2RlID0gdHJ1ZTsKKworICAvLyBQYXJzZSBwcm90by4KKyAgZmxhdGJ1ZmZlcnM6OlBhcnNlciBwYXJzZXIob3B0cyk7CisgIGF1dG8gcHJvdG9wYXRoID0gdGVzdHNfZGF0YV9wYXRoICsgInByb3RvdGVzdC8iOworICBjb25zdCBjaGFyICppbmNsdWRlX2RpcmVjdG9yaWVzW10gPSB7IHByb3RvcGF0aC5jX3N0cigpLCBudWxscHRyIH07CisgIFRFU1RfRVEocGFyc2VyLlBhcnNlKHByb3RvZmlsZS5jX3N0cigpLCBpbmNsdWRlX2RpcmVjdG9yaWVzKSwgdHJ1ZSk7CisKKyAgLy8gR2VuZXJhdGUgZmJzLgorICBhdXRvIGZicyA9IGZsYXRidWZmZXJzOjpHZW5lcmF0ZUZCUyhwYXJzZXIsICJ0ZXN0Iik7CisKKyAgLy8gR2VuZXJhdGUgZmJzIGZyb20gaW1wb3J0LnByb3RvCisgIGZsYXRidWZmZXJzOjpQYXJzZXIgaW1wb3J0X3BhcnNlcihvcHRzKTsKKyAgVEVTVF9FUShpbXBvcnRfcGFyc2VyLlBhcnNlKGltcG9ydHByb3RvZmlsZS5jX3N0cigpLCBpbmNsdWRlX2RpcmVjdG9yaWVzKSwKKyAgICAgICAgICB0cnVlKTsKKyAgYXV0byBpbXBvcnRfZmJzID0gZmxhdGJ1ZmZlcnM6OkdlbmVyYXRlRkJTKGltcG9ydF9wYXJzZXIsICJ0ZXN0Iik7CisKKyAgLy8gRW5zdXJlIGdlbmVyYXRlZCBmaWxlIGlzIHBhcnNhYmxlLgorICBmbGF0YnVmZmVyczo6UGFyc2VyIHBhcnNlcjI7CisgIC8vIFNpbmNlIGBpbXBvcnRlZC5mYnNgIGlzbid0IGluIHRoZSBmaWxlc3lzdGVtIEFic29sdXRlUGF0aCBjYW4ndCBmaWd1cmUgaXQKKyAgLy8gb3V0IGJ5IGl0c2VsZi4gV2UgbWFudWFsbHkgY29uc3RydWN0IGl0IHNvIFBhcnNlciB3b3Jrcy4KKyAgc3RkOjpzdHJpbmcgaW1wb3J0ZWRfZmJzID0gZmxhdGJ1ZmZlcnM6OlBvc2l4UGF0aCgKKyAgICAgIGZsYXRidWZmZXJzOjpBYnNvbHV0ZVBhdGgocHJvdG9wYXRoKSArICIvaW1wb3J0ZWQuZmJzIik7CisgIFRFU1RfRVEocGFyc2VyMi5QYXJzZShpbXBvcnRfZmJzLmNfc3RyKCksIGluY2x1ZGVfZGlyZWN0b3JpZXMsCisgICAgICAgICAgICAgICAgICAgICAgICBpbXBvcnRlZF9mYnMuY19zdHIoKSksCisgICAgICAgICAgdHJ1ZSk7CisgIFRFU1RfRVEocGFyc2VyMi5QYXJzZShmYnMuY19zdHIoKSwgbnVsbHB0ciksIHRydWUpOworICBURVNUX0VRX1NUUihmYnMuY19zdHIoKSwgZ29sZGVuZmlsZS5jX3N0cigpKTsKKworICAvLyBQYXJzZSBwcm90byB3aXRoIC0tb25lb2YtdW5pb24gb3B0aW9uLgorICBvcHRzLnByb3RvX29uZW9mX3VuaW9uID0gdHJ1ZTsKKyAgZmxhdGJ1ZmZlcnM6OlBhcnNlciBwYXJzZXIzKG9wdHMpOworICBURVNUX0VRKHBhcnNlcjMuUGFyc2UocHJvdG9maWxlLmNfc3RyKCksIGluY2x1ZGVfZGlyZWN0b3JpZXMpLCB0cnVlKTsKKworICAvLyBHZW5lcmF0ZSBmYnMuCisgIGF1dG8gZmJzX3VuaW9uID0gZmxhdGJ1ZmZlcnM6OkdlbmVyYXRlRkJTKHBhcnNlcjMsICJ0ZXN0Iik7CisKKyAgLy8gRW5zdXJlIGdlbmVyYXRlZCBmaWxlIGlzIHBhcnNhYmxlLgorICBmbGF0YnVmZmVyczo6UGFyc2VyIHBhcnNlcjQ7CisgIFRFU1RfRVEocGFyc2VyNC5QYXJzZShpbXBvcnRfZmJzLmNfc3RyKCksIG51bGxwdHIsIGltcG9ydGVkX2Zicy5jX3N0cigpKSwKKyAgICAgICAgICB0cnVlKTsKKyAgVEVTVF9FUShwYXJzZXI0LlBhcnNlKGZic191bmlvbi5jX3N0cigpLCBudWxscHRyKSwgdHJ1ZSk7CisgIFRFU1RfRVFfU1RSKGZic191bmlvbi5jX3N0cigpLCBnb2xkZW51bmlvbmZpbGUuY19zdHIoKSk7Cit9CisKK3ZvaWQgUGFyc2VQcm90b0J1ZkFzY2lpVGVzdCgpIHsKKyAgLy8gV2UgY2FuIHB1dCB0aGUgcGFyc2VyIGluIGEgbW9kZSB3aGVyZSBpdCB3aWxsIGFjY2VwdCBKU09OIHRoYXQgbG9va3MgbW9yZQorICAvLyBsaWtlIFByb3RvYnVmIEFTQ0lJLCBmb3IgdXNlcnMgdGhhdCBoYXZlIGRhdGEgaW4gdGhhdCBmb3JtYXQuCisgIC8vIFRoaXMgdXNlcyBubyAiIiBmb3IgZmllbGQgbmFtZXMgKHdoaWNoIHdlIGFscmVhZHkgc3VwcG9ydCBieSBkZWZhdWx0LAorICAvLyBvbWl0cyBgLGAsIGA6YCBiZWZvcmUgYHtgIGFuZCBhIGNvdXBsZSBvZiBvdGhlciBmZWF0dXJlcy4KKyAgZmxhdGJ1ZmZlcnM6OlBhcnNlciBwYXJzZXI7CisgIHBhcnNlci5vcHRzLnByb3RvYnVmX2FzY2lpX2FsaWtlID0gdHJ1ZTsKKyAgVEVTVF9FUSgKKyAgICAgIHBhcnNlci5QYXJzZSgidGFibGUgUyB7IEI6aW50OyB9IHRhYmxlIFQgeyBBOltpbnRdOyBDOlM7IH0gcm9vdF90eXBlIFQ7IiksCisgICAgICB0cnVlKTsKKyAgVEVTVF9FUShwYXJzZXIuUGFyc2UoInsgQSBbMSAyXSBDIHsgQjoyIH19IiksIHRydWUpOworICAvLyBTaW1pbGFybHksIGluIHRleHQgb3V0cHV0LCBpdCBzaG91bGQgb21pdCB0aGVzZS4KKyAgc3RkOjpzdHJpbmcgdGV4dDsKKyAgYXV0byBvayA9IGZsYXRidWZmZXJzOjpHZW5lcmF0ZVRleHQoCisgICAgICBwYXJzZXIsIHBhcnNlci5idWlsZGVyXy5HZXRCdWZmZXJQb2ludGVyKCksICZ0ZXh0KTsKKyAgVEVTVF9FUShvaywgdHJ1ZSk7CisgIFRFU1RfRVFfU1RSKHRleHQuY19zdHIoKSwKKyAgICAgICAgICAgICAgIntcbiAgQSBbXG4gICAgMVxuICAgIDJcbiAgXVxuICBDIHtcbiAgICBCOiAyXG4gIH1cbn1cbiIpOworfQorCit9ICAvLyBuYW1lc3BhY2UgdGVzdHMKK30gIC8vIG5hbWVzcGFjZSBmbGF0YnVmZmVycwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL3Byb3RvX3Rlc3QuaCBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL3Byb3RvX3Rlc3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZjYxMzdkCi0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvcHJvdG9fdGVzdC5oCkBAIC0wLDAgKzEsMTggQEAKKyNpZm5kZWYgVEVTVFNfUFJPVE9fVEVTVF9ICisjZGVmaW5lIFRFU1RTX1BST1RPX1RFU1RfSAorCisjaW5jbHVkZSA8c3RyaW5nPgorCituYW1lc3BhY2UgZmxhdGJ1ZmZlcnMgeworbmFtZXNwYWNlIHRlc3RzIHsKKwordm9pZCBQYXJzZVByb3RvVGVzdChjb25zdCBzdGQ6OnN0cmluZyYgdGVzdHNfZGF0YV9wYXRoKTsKK3ZvaWQgUGFyc2VQcm90b1Rlc3RXaXRoU3VmZml4KGNvbnN0IHN0ZDo6c3RyaW5nJiB0ZXN0c19kYXRhX3BhdGgpOwordm9pZCBQYXJzZVByb3RvVGVzdFdpdGhJbmNsdWRlcyhjb25zdCBzdGQ6OnN0cmluZyYgdGVzdHNfZGF0YV9wYXRoKTsKK3ZvaWQgUGFyc2VQcm90b0J1ZkFzY2lpVGVzdCgpOworCisKK30gIC8vIG5hbWVzcGFjZSB0ZXN0cworfSAgLy8gbmFtZXNwYWNlIGZsYXRidWZmZXJzCisKKyNlbmRpZgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL3Byb3RvdGVzdC90ZXN0LmdvbGRlbiBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL3Byb3RvdGVzdC90ZXN0LmdvbGRlbgppbmRleCBlYjEwNjcxLi45NDlhMDAzIDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9wcm90b3Rlc3QvdGVzdC5nb2xkZW4KKysrIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvcHJvdG90ZXN0L3Rlc3QuZ29sZGVuCkBAIC01MSw2ICs1MSw5IEBACiAgIC8vLyBkb2MgY29tbWVudCBmb3Igci4KICAgcjpwcm90by50ZXN0LlByb3RvTWVzc2FnZV8uQW5vbnltb3VzMDsKICAgb3V0ZXJfZW51bTpwcm90by50ZXN0LlByb3RvRW51bTsKKyAgdTpmbG9hdCA9ICtpbmY7CisgIHY6ZmxvYXQgPSAraW5mOworICB3OmZsb2F0ID0gLWluZjsKIH0KIAogbmFtZXNwYWNlIHByb3RvLnRlc3QuUHJvdG9NZXNzYWdlXzsKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL3Byb3RvdGVzdC90ZXN0LnByb3RvIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvcHJvdG90ZXN0L3Rlc3QucHJvdG8KaW5kZXggMTBlNDVhZi4uNzFlYzhkNSAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvcHJvdG90ZXN0L3Rlc3QucHJvdG8KKysrIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvcHJvdG90ZXN0L3Rlc3QucHJvdG8KQEAgLTY3LDQgKzY3LDggQEAKICAgICBPdGhlck1lc3NhZ2UgdCA9IDE4OwogICB9CiAgIG9wdGlvbmFsIFByb3RvRW51bSBvdXRlcl9lbnVtID0gMzM7CisgIC8vIFRlc3RzIHRoYXQgYGluZmAgYW5kIGArLy1pbmZgIGNhbiBiZSBwYXJzZWQgaW4gcHJvdG8gb3B0aW9ucy4KKyAgb3B0aW9uYWwgZmxvYXQgdSA9IDM0IFtkZWZhdWx0ID0gaW5mXTsKKyAgb3B0aW9uYWwgZmxvYXQgdiA9IDM1IFtkZWZhdWx0ID0gK2luZl07CisgIG9wdGlvbmFsIGZsb2F0IHcgPSAzNiBbZGVmYXVsdCA9IC1pbmZdOwogfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvcHJvdG90ZXN0L3Rlc3RfaW5jbHVkZS5nb2xkZW4gYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9wcm90b3Rlc3QvdGVzdF9pbmNsdWRlLmdvbGRlbgppbmRleCAzNThjM2Y2Li5iOThkZTQ0IDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9wcm90b3Rlc3QvdGVzdF9pbmNsdWRlLmdvbGRlbgorKysgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9wcm90b3Rlc3QvdGVzdF9pbmNsdWRlLmdvbGRlbgpAQCAtNDksNiArNDksOSBAQAogICAvLy8gZG9jIGNvbW1lbnQgZm9yIHIuCiAgIHI6cHJvdG8udGVzdC5Qcm90b01lc3NhZ2VfLkFub255bW91czA7CiAgIG91dGVyX2VudW06cHJvdG8udGVzdC5Qcm90b0VudW07CisgIHU6ZmxvYXQgPSAraW5mOworICB2OmZsb2F0ID0gK2luZjsKKyAgdzpmbG9hdCA9IC1pbmY7CiB9CiAKIG5hbWVzcGFjZSBwcm90by50ZXN0LlByb3RvTWVzc2FnZV87CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9wcm90b3Rlc3QvdGVzdF9zdWZmaXguZ29sZGVuIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvcHJvdG90ZXN0L3Rlc3Rfc3VmZml4LmdvbGRlbgppbmRleCBhOTlmODA3Li40YWIyMTQ2IDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9wcm90b3Rlc3QvdGVzdF9zdWZmaXguZ29sZGVuCisrKyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL3Byb3RvdGVzdC90ZXN0X3N1ZmZpeC5nb2xkZW4KQEAgLTUxLDYgKzUxLDkgQEAKICAgLy8vIGRvYyBjb21tZW50IGZvciByLgogICByOnByb3RvLnRlc3QudGVzdF9uYW1lc3BhY2Vfc3VmZml4LlByb3RvTWVzc2FnZV8uQW5vbnltb3VzMDsKICAgb3V0ZXJfZW51bTpwcm90by50ZXN0LnRlc3RfbmFtZXNwYWNlX3N1ZmZpeC5Qcm90b0VudW07CisgIHU6ZmxvYXQgPSAraW5mOworICB2OmZsb2F0ID0gK2luZjsKKyAgdzpmbG9hdCA9IC1pbmY7CiB9CiAKIG5hbWVzcGFjZSBwcm90by50ZXN0LnRlc3RfbmFtZXNwYWNlX3N1ZmZpeC5Qcm90b01lc3NhZ2VfOwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvcHJvdG90ZXN0L3Rlc3RfdW5pb24uZ29sZGVuIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvcHJvdG90ZXN0L3Rlc3RfdW5pb24uZ29sZGVuCmluZGV4IDNlNmJlY2QuLjI0MWYzNDkgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL3Byb3RvdGVzdC90ZXN0X3VuaW9uLmdvbGRlbgorKysgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9wcm90b3Rlc3QvdGVzdF91bmlvbi5nb2xkZW4KQEAgLTYxLDYgKzYxLDkgQEAKICAgLy8vIGRvYyBjb21tZW50IGZvciByLgogICByOnByb3RvLnRlc3QuUHJvdG9NZXNzYWdlXy5SVW5pb247CiAgIG91dGVyX2VudW06cHJvdG8udGVzdC5Qcm90b0VudW07CisgIHU6ZmxvYXQgPSAraW5mOworICB2OmZsb2F0ID0gK2luZjsKKyAgdzpmbG9hdCA9IC1pbmY7CiB9CiAKIG5hbWVzcGFjZSBwcm90by50ZXN0LlByb3RvTWVzc2FnZV87CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9wcm90b3Rlc3QvdGVzdF91bmlvbl9pbmNsdWRlLmdvbGRlbiBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL3Byb3RvdGVzdC90ZXN0X3VuaW9uX2luY2x1ZGUuZ29sZGVuCmluZGV4IGFiZGI2ZTIuLjFmZGIyYWMgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL3Byb3RvdGVzdC90ZXN0X3VuaW9uX2luY2x1ZGUuZ29sZGVuCisrKyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL3Byb3RvdGVzdC90ZXN0X3VuaW9uX2luY2x1ZGUuZ29sZGVuCkBAIC01OSw2ICs1OSw5IEBACiAgIC8vLyBkb2MgY29tbWVudCBmb3Igci4KICAgcjpwcm90by50ZXN0LlByb3RvTWVzc2FnZV8uUlVuaW9uOwogICBvdXRlcl9lbnVtOnByb3RvLnRlc3QuUHJvdG9FbnVtOworICB1OmZsb2F0ID0gK2luZjsKKyAgdjpmbG9hdCA9ICtpbmY7CisgIHc6ZmxvYXQgPSAtaW5mOwogfQogCiBuYW1lc3BhY2UgcHJvdG8udGVzdC5Qcm90b01lc3NhZ2VfOwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvcHJvdG90ZXN0L3Rlc3RfdW5pb25fc3VmZml4LmdvbGRlbiBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL3Byb3RvdGVzdC90ZXN0X3VuaW9uX3N1ZmZpeC5nb2xkZW4KaW5kZXggNmEyNDBjMC4uMjI3OGVkZCAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvcHJvdG90ZXN0L3Rlc3RfdW5pb25fc3VmZml4LmdvbGRlbgorKysgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9wcm90b3Rlc3QvdGVzdF91bmlvbl9zdWZmaXguZ29sZGVuCkBAIC02MSw2ICs2MSw5IEBACiAgIC8vLyBkb2MgY29tbWVudCBmb3Igci4KICAgcjpwcm90by50ZXN0LnRlc3RfbmFtZXNwYWNlX3N1ZmZpeC5Qcm90b01lc3NhZ2VfLlJVbmlvbjsKICAgb3V0ZXJfZW51bTpwcm90by50ZXN0LnRlc3RfbmFtZXNwYWNlX3N1ZmZpeC5Qcm90b0VudW07CisgIHU6ZmxvYXQgPSAraW5mOworICB2OmZsb2F0ID0gK2luZjsKKyAgdzpmbG9hdCA9IC1pbmY7CiB9CiAKIG5hbWVzcGFjZSBwcm90by50ZXN0LnRlc3RfbmFtZXNwYWNlX3N1ZmZpeC5Qcm90b01lc3NhZ2VfOwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvcHlfdGVzdC5weSBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL3B5X3Rlc3QucHkKaW5kZXggZWQ5NjZkNS4uNWUzYzU0NyAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvcHlfdGVzdC5weQorKysgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9weV90ZXN0LnB5CkBAIC00OCw2ICs0OCw4IEBACiBpbXBvcnQgTXlHYW1lLkV4YW1wbGUuTmVzdGVkU3RydWN0ICAjIHJlZmVycyB0byBnZW5lcmF0ZWQgY29kZQogaW1wb3J0IE15R2FtZS5FeGFtcGxlLlRlc3RFbnVtICAjIHJlZmVycyB0byBnZW5lcmF0ZWQgY29kZQogaW1wb3J0IG1vbnN0ZXJfdGVzdF9nZW5lcmF0ZWQgICMgdGhlIG9uZS1maWxlIHZlcnNpb24KK2ltcG9ydCBvcHRpb25hbF9zY2FsYXJzCitpbXBvcnQgb3B0aW9uYWxfc2NhbGFycy5TY2FsYXJTdHVmZgogCiAKIGRlZiBjcmVhdGVfbmFtZXNwYWNlX3Nob3J0Y3V0KGlzX29uZWZpbGUpOgpAQCAtMjc0LDYgKzI3NiwzNSBAQAogICAgIHNlbGYuYXNzZXJ0RXF1YWwobW9uc3RlcjIuVmVjdG9yT2ZFbnVtc0xlbmd0aCgpLCAwKQogICAgIHNlbGYuYXNzZXJ0VHJ1ZShtb25zdGVyMi5WZWN0b3JPZkVudW1zSXNOb25lKCkpCiAKKyAgZGVmIHRlc3Rfb3B0aW9uYWxfc2NhbGFyc193aXRoX3BhY2tfYW5kX3VucGFjayhzZWxmKToKKyAgICAiIiIgU2VyaWFsaXplcyBhbmQgZGVzZXJpYWxpemVzIGJldHdlZW4gYSBidWZmZXIgd2l0aCBvcHRpb25hbCB2YWx1ZXMgKG5vCisgICAgICAgIHNwZWNpZmljIHZhbHVlcyBhcmUgZmlsbGVkIHdoZW4gdGhlIGJ1ZmZlciBpcyBjcmVhdGVkKSBhbmQgaXRzIHB5dGhvbgorICAgICAgICBvYmplY3QuCisgICAgIiIiCisgICAgIyBDcmVhdGVzIGEgZmxhdGJ1ZmZlciB3aXRoIG9wdGlvbmFsIHZhbHVlcy4KKyAgICBiMSA9IGZsYXRidWZmZXJzLkJ1aWxkZXIoMCkKKyAgICBvcHRpb25hbF9zY2FsYXJzLlNjYWxhclN0dWZmLlNjYWxhclN0dWZmU3RhcnQoYjEpCisgICAgZ2VuX29wdCA9IG9wdGlvbmFsX3NjYWxhcnMuU2NhbGFyU3R1ZmYuU2NhbGFyU3R1ZmZFbmQoYjEpCisgICAgYjEuRmluaXNoKGdlbl9vcHQpCisKKyAgICAjIENvbnZlcnRzIHRoZSBmbGF0YnVmZmVyIGludG8gdGhlIG9iamVjdCBjbGFzcy4KKyAgICBvcHRzMSA9IG9wdGlvbmFsX3NjYWxhcnMuU2NhbGFyU3R1ZmYuU2NhbGFyU3R1ZmYuR2V0Um9vdEFzKGIxLkJ5dGVzLCBiMS5IZWFkKCkpCisgICAgb3B0c1QxID0gb3B0aW9uYWxfc2NhbGFycy5TY2FsYXJTdHVmZi5TY2FsYXJTdHVmZlQuSW5pdEZyb21PYmoob3B0czEpCisKKyAgICAjIFBhY2tzIHRoZSBvYmplY3QgY2xhc3MgaW50byBhbm90aGVyIGZsYXRidWZmZXIuCisgICAgYjIgPSBmbGF0YnVmZmVycy5CdWlsZGVyKDApCisgICAgYjIuRmluaXNoKG9wdHNUMS5QYWNrKGIyKSkKKyAgICBvcHRzMiA9IG9wdGlvbmFsX3NjYWxhcnMuU2NhbGFyU3R1ZmYuU2NhbGFyU3R1ZmYuR2V0Um9vdEFzKGIyLkJ5dGVzLCBiMi5IZWFkKCkpCisgICAgb3B0c1QyID0gb3B0aW9uYWxfc2NhbGFycy5TY2FsYXJTdHVmZi5TY2FsYXJTdHVmZlQuSW5pdEZyb21PYmoob3B0czIpCisgICAgIyBDaGVja3MgdGhlIGRlZmF1bHQgdmFsdWVzLgorICAgIHNlbGYuYXNzZXJ0VHJ1ZShvcHRzMi5KdXN0STgoKSA9PSAwKQorICAgIHNlbGYuYXNzZXJ0VHJ1ZShvcHRzMi5NYXliZUYzMigpIGlzIE5vbmUpCisgICAgc2VsZi5hc3NlcnRUcnVlKG9wdHMyLkRlZmF1bHRCb29sKCkgaXMgVHJ1ZSkKKyAgICBzZWxmLmFzc2VydFRydWUob3B0c1QyLmp1c3RVMTYgPT0gMCkKKyAgICBzZWxmLmFzc2VydFRydWUob3B0c1QyLm1heWJlRW51bSBpcyBOb25lKQorICAgIHNlbGYuYXNzZXJ0VHJ1ZShvcHRzVDIuZGVmYXVsdFU2NCA9PSA0MikKKworCiAKIGNsYXNzIFRlc3RBbGxNdXRhYmxlQ29kZVBhdGhzT2ZFeGFtcGxlU2NoZW1hKHVuaXR0ZXN0LlRlc3RDYXNlKToKICAgIiIiIFRlc3RzIHRoZSBvYmplY3QgQVBJIGdlbmVyYXRlZCBmb3IgbW9uc3Rlcl90ZXN0LmZicyBmb3IgbXV0YXRpb24KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL3JlZmxlY3Rpb25fdGVzdC5jcHAgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9yZWZsZWN0aW9uX3Rlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0OGJkODEKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9yZWZsZWN0aW9uX3Rlc3QuY3BwCkBAIC0wLDAgKzEsMzIwIEBACisjaW5jbHVkZSAicmVmbGVjdGlvbl90ZXN0LmgiCisjaW5jbHVkZSAiYXJyYXlzX3Rlc3RfZ2VuZXJhdGVkLmgiCisjaW5jbHVkZSAiZmxhdGJ1ZmZlcnMvbWluaXJlZmxlY3QuaCIKKyNpbmNsdWRlICJmbGF0YnVmZmVycy9yZWZsZWN0aW9uLmgiCisjaW5jbHVkZSAiZmxhdGJ1ZmZlcnMvcmVmbGVjdGlvbl9nZW5lcmF0ZWQuaCIKKyNpbmNsdWRlICJmbGF0YnVmZmVycy92ZXJpZmllci5oIgorI2luY2x1ZGUgInRlc3RfYXNzZXJ0LmgiCisjaW5jbHVkZSAibW9uc3Rlcl90ZXN0LmgiCisjaW5jbHVkZSAibW9uc3Rlcl90ZXN0X2dlbmVyYXRlZC5oIgorCituYW1lc3BhY2UgZmxhdGJ1ZmZlcnMgeworbmFtZXNwYWNlIHRlc3RzIHsKKwordXNpbmcgbmFtZXNwYWNlIE15R2FtZTo6RXhhbXBsZTsKKwordm9pZCBSZWZsZWN0aW9uVGVzdChjb25zdCBzdGQ6OnN0cmluZyYgdGVzdHNfZGF0YV9wYXRoLCB1aW50OF90ICpmbGF0YnVmLCBzaXplX3QgbGVuZ3RoKSB7CisgIC8vIExvYWQgYSBiaW5hcnkgc2NoZW1hLgorICBzdGQ6OnN0cmluZyBiZmJzZmlsZTsKKyAgVEVTVF9FUShmbGF0YnVmZmVyczo6TG9hZEZpbGUoKHRlc3RzX2RhdGFfcGF0aCArICJtb25zdGVyX3Rlc3QuYmZicyIpLmNfc3RyKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUsICZiZmJzZmlsZSksCisgICAgICAgICAgdHJ1ZSk7CisKKyAgLy8gVmVyaWZ5IGl0LCBqdXN0IGluIGNhc2U6CisgIGZsYXRidWZmZXJzOjpWZXJpZmllciB2ZXJpZmllcigKKyAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCAqPihiZmJzZmlsZS5jX3N0cigpKSwgYmZic2ZpbGUubGVuZ3RoKCkpOworICBURVNUX0VRKHJlZmxlY3Rpb246OlZlcmlmeVNjaGVtYUJ1ZmZlcih2ZXJpZmllciksIHRydWUpOworCisgIC8vIE1ha2Ugc3VyZSB0aGUgc2NoZW1hIGlzIHdoYXQgd2UgZXhwZWN0IGl0IHRvIGJlLgorICBhdXRvICZzY2hlbWEgPSAqcmVmbGVjdGlvbjo6R2V0U2NoZW1hKGJmYnNmaWxlLmNfc3RyKCkpOworICBhdXRvIHJvb3RfdGFibGUgPSBzY2hlbWEucm9vdF90YWJsZSgpOworCisgIC8vIENoZWNrIHRoZSBkZWNsYXJhdGlvbiBmaWxlcy4KKyAgVEVTVF9FUV9TVFIocm9vdF90YWJsZS0+bmFtZSgpLT5jX3N0cigpLCAiTXlHYW1lLkV4YW1wbGUuTW9uc3RlciIpOworICBURVNUX0VRX1NUUihyb290X3RhYmxlLT5kZWNsYXJhdGlvbl9maWxlKCktPmNfc3RyKCksICIvL21vbnN0ZXJfdGVzdC5mYnMiKTsKKyAgVEVTVF9FUV9TVFIoCisgICAgICBzY2hlbWEub2JqZWN0cygpLT5Mb29rdXBCeUtleSgiVGFibGVBIiktPmRlY2xhcmF0aW9uX2ZpbGUoKS0+Y19zdHIoKSwKKyAgICAgICIvL2luY2x1ZGVfdGVzdC9pbmNsdWRlX3Rlc3QxLmZicyIpOworICBURVNUX0VRX1NUUihzY2hlbWEub2JqZWN0cygpCisgICAgICAgICAgICAgICAgICAtPkxvb2t1cEJ5S2V5KCJNeUdhbWUuT3RoZXJOYW1lU3BhY2UuVW51c2VkIikKKyAgICAgICAgICAgICAgICAgIC0+ZGVjbGFyYXRpb25fZmlsZSgpCisgICAgICAgICAgICAgICAgICAtPmNfc3RyKCksCisgICAgICAgICAgICAgICIvL2luY2x1ZGVfdGVzdC9zdWIvaW5jbHVkZV90ZXN0Mi5mYnMiKTsKKyAgVEVTVF9FUV9TVFIoc2NoZW1hLmVudW1zKCkKKyAgICAgICAgICAgICAgICAgIC0+TG9va3VwQnlLZXkoIk15R2FtZS5PdGhlck5hbWVTcGFjZS5Gcm9tSW5jbHVkZSIpCisgICAgICAgICAgICAgICAgICAtPmRlY2xhcmF0aW9uX2ZpbGUoKQorICAgICAgICAgICAgICAgICAgLT5jX3N0cigpLAorICAgICAgICAgICAgICAiLy9pbmNsdWRlX3Rlc3Qvc3ViL2luY2x1ZGVfdGVzdDIuZmJzIik7CisKKyAgLy8gQ2hlY2sgc2NoZWFtIGZpbGVuYW1lcyBhbmQgdGhlaXIgaW5jbHVkZXMuCisgIFRFU1RfRVEoc2NoZW1hLmZic19maWxlcygpLT5zaXplKCksIDMpOworCisgIGNvbnN0IGF1dG8gZmJzMCA9IHNjaGVtYS5mYnNfZmlsZXMoKS0+R2V0KDApOworICBURVNUX0VRX1NUUihmYnMwLT5maWxlbmFtZSgpLT5jX3N0cigpLCAiLy9pbmNsdWRlX3Rlc3QvaW5jbHVkZV90ZXN0MS5mYnMiKTsKKyAgY29uc3QgYXV0byBmYnMwX2luY2x1ZGVzID0gZmJzMC0+aW5jbHVkZWRfZmlsZW5hbWVzKCk7CisgIFRFU1RfRVEoZmJzMF9pbmNsdWRlcy0+c2l6ZSgpLCAyKTsKKworICAvLyBUT0RPKGNhc3Blcm4pOiBTaG91bGQgd2UgZm9yY2Ugb3IgZGlzYWxsb3cgaW5jbHVzaW9uIG9mIHNlbGY/CisgIFRFU1RfRVFfU1RSKGZiczBfaW5jbHVkZXMtPkdldCgwKS0+Y19zdHIoKSwKKyAgICAgICAgICAgICAgIi8vaW5jbHVkZV90ZXN0L2luY2x1ZGVfdGVzdDEuZmJzIik7CisgIFRFU1RfRVFfU1RSKGZiczBfaW5jbHVkZXMtPkdldCgxKS0+Y19zdHIoKSwKKyAgICAgICAgICAgICAgIi8vaW5jbHVkZV90ZXN0L3N1Yi9pbmNsdWRlX3Rlc3QyLmZicyIpOworCisgIGNvbnN0IGF1dG8gZmJzMSA9IHNjaGVtYS5mYnNfZmlsZXMoKS0+R2V0KDEpOworICBURVNUX0VRX1NUUihmYnMxLT5maWxlbmFtZSgpLT5jX3N0cigpLAorICAgICAgICAgICAgICAiLy9pbmNsdWRlX3Rlc3Qvc3ViL2luY2x1ZGVfdGVzdDIuZmJzIik7CisgIGNvbnN0IGF1dG8gZmJzMV9pbmNsdWRlcyA9IGZiczEtPmluY2x1ZGVkX2ZpbGVuYW1lcygpOworICBURVNUX0VRKGZiczFfaW5jbHVkZXMtPnNpemUoKSwgMik7CisgIFRFU1RfRVFfU1RSKGZiczFfaW5jbHVkZXMtPkdldCgwKS0+Y19zdHIoKSwKKyAgICAgICAgICAgICAgIi8vaW5jbHVkZV90ZXN0L2luY2x1ZGVfdGVzdDEuZmJzIik7CisgIFRFU1RfRVFfU1RSKGZiczFfaW5jbHVkZXMtPkdldCgxKS0+Y19zdHIoKSwKKyAgICAgICAgICAgICAgIi8vaW5jbHVkZV90ZXN0L3N1Yi9pbmNsdWRlX3Rlc3QyLmZicyIpOworCisgIGNvbnN0IGF1dG8gZmJzMiA9IHNjaGVtYS5mYnNfZmlsZXMoKS0+R2V0KDIpOworICBURVNUX0VRX1NUUihmYnMyLT5maWxlbmFtZSgpLT5jX3N0cigpLCAiLy9tb25zdGVyX3Rlc3QuZmJzIik7CisgIGNvbnN0IGF1dG8gZmJzMl9pbmNsdWRlcyA9IGZiczItPmluY2x1ZGVkX2ZpbGVuYW1lcygpOworICBURVNUX0VRKGZiczJfaW5jbHVkZXMtPnNpemUoKSwgMSk7CisgIFRFU1RfRVFfU1RSKGZiczJfaW5jbHVkZXMtPkdldCgwKS0+Y19zdHIoKSwKKyAgICAgICAgICAgICAgIi8vaW5jbHVkZV90ZXN0L2luY2x1ZGVfdGVzdDEuZmJzIik7CisKKyAgLy8gQ2hlY2sgUm9vdCB0YWJsZSBmaWVsZHMKKyAgYXV0byBmaWVsZHMgPSByb290X3RhYmxlLT5maWVsZHMoKTsKKyAgYXV0byBocF9maWVsZF9wdHIgPSBmaWVsZHMtPkxvb2t1cEJ5S2V5KCJocCIpOworICBURVNUX05PVE5VTEwoaHBfZmllbGRfcHRyKTsKKyAgYXV0byAmaHBfZmllbGQgPSAqaHBfZmllbGRfcHRyOworICBURVNUX0VRX1NUUihocF9maWVsZC5uYW1lKCktPmNfc3RyKCksICJocCIpOworICBURVNUX0VRKGhwX2ZpZWxkLmlkKCksIDIpOworICBURVNUX0VRKGhwX2ZpZWxkLnR5cGUoKS0+YmFzZV90eXBlKCksIHJlZmxlY3Rpb246OlNob3J0KTsKKworICBhdXRvIGZyaWVuZGx5X2ZpZWxkX3B0ciA9IGZpZWxkcy0+TG9va3VwQnlLZXkoImZyaWVuZGx5Iik7CisgIFRFU1RfTk9UTlVMTChmcmllbmRseV9maWVsZF9wdHIpOworICBURVNUX05PVE5VTEwoZnJpZW5kbHlfZmllbGRfcHRyLT5hdHRyaWJ1dGVzKCkpOworICBURVNUX05PVE5VTEwoZnJpZW5kbHlfZmllbGRfcHRyLT5hdHRyaWJ1dGVzKCktPkxvb2t1cEJ5S2V5KCJwcmlvcml0eSIpKTsKKworICAvLyBNYWtlIHN1cmUgdGhlIHRhYmxlIGluZGV4IGlzIHdoYXQgd2UgZXhwZWN0IGl0IHRvIGJlLgorICBhdXRvIHBvc19maWVsZF9wdHIgPSBmaWVsZHMtPkxvb2t1cEJ5S2V5KCJwb3MiKTsKKyAgVEVTVF9OT1ROVUxMKHBvc19maWVsZF9wdHIpOworICBURVNUX0VRKHBvc19maWVsZF9wdHItPnR5cGUoKS0+YmFzZV90eXBlKCksIHJlZmxlY3Rpb246Ok9iaik7CisgIGF1dG8gcG9zX3RhYmxlX3B0ciA9IHNjaGVtYS5vYmplY3RzKCktPkdldChwb3NfZmllbGRfcHRyLT50eXBlKCktPmluZGV4KCkpOworICBURVNUX05PVE5VTEwocG9zX3RhYmxlX3B0cik7CisgIFRFU1RfRVFfU1RSKHBvc190YWJsZV9wdHItPm5hbWUoKS0+Y19zdHIoKSwgIk15R2FtZS5FeGFtcGxlLlZlYzMiKTsKKworICAvLyBUZXN0IG51bGxhYmlsaXR5IG9mIGZpZWxkczogaHAgaXMgYSAwLWRlZmF1bHQgc2NhbGFyLCBwb3MgaXMgYSBzdHJ1Y3QgPT4KKyAgLy8gb3B0aW9uYWwsIGFuZCBuYW1lIGlzIGEgcmVxdWlyZWQgc3RyaW5nID0+IG5vdCBvcHRpb25hbC4KKyAgVEVTVF9FUShocF9maWVsZC5vcHRpb25hbCgpLCBmYWxzZSk7CisgIFRFU1RfRVEocG9zX2ZpZWxkX3B0ci0+b3B0aW9uYWwoKSwgdHJ1ZSk7CisgIFRFU1RfRVEoZmllbGRzLT5Mb29rdXBCeUtleSgibmFtZSIpLT5vcHRpb25hbCgpLCBmYWxzZSk7CisKKyAgLy8gTm93IHVzZSBpdCB0byBkeW5hbWljYWxseSBhY2Nlc3MgYSBidWZmZXIuCisgIGF1dG8gJnJvb3QgPSAqZmxhdGJ1ZmZlcnM6OkdldEFueVJvb3QoZmxhdGJ1Zik7CisKKyAgLy8gVmVyaWZ5IHRoZSBidWZmZXIgZmlyc3QgdXNpbmcgcmVmbGVjdGlvbiBiYXNlZCB2ZXJpZmljYXRpb24KKyAgVEVTVF9FUShmbGF0YnVmZmVyczo6VmVyaWZ5KHNjaGVtYSwgKnNjaGVtYS5yb290X3RhYmxlKCksIGZsYXRidWYsIGxlbmd0aCksCisgICAgICAgICAgdHJ1ZSk7CisKKyAgYXV0byBocCA9IGZsYXRidWZmZXJzOjpHZXRGaWVsZEk8dWludDE2X3Q+KHJvb3QsIGhwX2ZpZWxkKTsKKyAgVEVTVF9FUShocCwgODApOworCisgIC8vIFJhdGhlciB0aGFuIG5lZWRpbmcgdG8ga25vdyB0aGUgdHlwZSwgd2UgY2FuIGFsc28gZ2V0IHRoZSB2YWx1ZSBvZgorICAvLyBhbnkgZmllbGQgYXMgYW4gaW50NjRfdC9kb3VibGUvc3RyaW5nLCByZWdhcmRsZXNzIG9mIHdoYXQgaXQgYWN0dWFsbHkgaXMuCisgIGF1dG8gaHBfaW50NjQgPSBmbGF0YnVmZmVyczo6R2V0QW55RmllbGRJKHJvb3QsIGhwX2ZpZWxkKTsKKyAgVEVTVF9FUShocF9pbnQ2NCwgODApOworICBhdXRvIGhwX2RvdWJsZSA9IGZsYXRidWZmZXJzOjpHZXRBbnlGaWVsZEYocm9vdCwgaHBfZmllbGQpOworICBURVNUX0VRKGhwX2RvdWJsZSwgODAuMCk7CisgIGF1dG8gaHBfc3RyaW5nID0gZmxhdGJ1ZmZlcnM6OkdldEFueUZpZWxkUyhyb290LCBocF9maWVsZCwgJnNjaGVtYSk7CisgIFRFU1RfRVFfU1RSKGhwX3N0cmluZy5jX3N0cigpLCAiODAiKTsKKworICAvLyBHZXQgc3RydWN0IGZpZWxkIHRocm91Z2ggcmVmbGVjdGlvbgorICBhdXRvIHBvc19zdHJ1Y3QgPSBmbGF0YnVmZmVyczo6R2V0RmllbGRTdHJ1Y3Qocm9vdCwgKnBvc19maWVsZF9wdHIpOworICBURVNUX05PVE5VTEwocG9zX3N0cnVjdCk7CisgIFRFU1RfRVEoZmxhdGJ1ZmZlcnM6OkdldEFueUZpZWxkRigqcG9zX3N0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwb3NfdGFibGVfcHRyLT5maWVsZHMoKS0+TG9va3VwQnlLZXkoInoiKSksCisgICAgICAgICAgMy4wZik7CisKKyAgYXV0byB0ZXN0M19maWVsZCA9IHBvc190YWJsZV9wdHItPmZpZWxkcygpLT5Mb29rdXBCeUtleSgidGVzdDMiKTsKKyAgYXV0byB0ZXN0M19zdHJ1Y3QgPSBmbGF0YnVmZmVyczo6R2V0RmllbGRTdHJ1Y3QoKnBvc19zdHJ1Y3QsICp0ZXN0M19maWVsZCk7CisgIFRFU1RfTk9UTlVMTCh0ZXN0M19zdHJ1Y3QpOworICBhdXRvIHRlc3QzX29iamVjdCA9IHNjaGVtYS5vYmplY3RzKCktPkdldCh0ZXN0M19maWVsZC0+dHlwZSgpLT5pbmRleCgpKTsKKworICBURVNUX0VRKGZsYXRidWZmZXJzOjpHZXRBbnlGaWVsZEYoKnRlc3QzX3N0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICp0ZXN0M19vYmplY3QtPmZpZWxkcygpLT5Mb29rdXBCeUtleSgiYSIpKSwKKyAgICAgICAgICAxMCk7CisKKyAgLy8gV2UgY2FuIGFsc28gbW9kaWZ5IGl0LgorICBmbGF0YnVmZmVyczo6U2V0RmllbGQ8dWludDE2X3Q+KCZyb290LCBocF9maWVsZCwgMjAwKTsKKyAgaHAgPSBmbGF0YnVmZmVyczo6R2V0RmllbGRJPHVpbnQxNl90Pihyb290LCBocF9maWVsZCk7CisgIFRFU1RfRVEoaHAsIDIwMCk7CisKKyAgLy8gV2UgY2FuIGFsc28gc2V0IGZpZWxkcyBnZW5lcmljYWxseToKKyAgZmxhdGJ1ZmZlcnM6OlNldEFueUZpZWxkSSgmcm9vdCwgaHBfZmllbGQsIDMwMCk7CisgIGhwX2ludDY0ID0gZmxhdGJ1ZmZlcnM6OkdldEFueUZpZWxkSShyb290LCBocF9maWVsZCk7CisgIFRFU1RfRVEoaHBfaW50NjQsIDMwMCk7CisgIGZsYXRidWZmZXJzOjpTZXRBbnlGaWVsZEYoJnJvb3QsIGhwX2ZpZWxkLCAzMDAuNSk7CisgIGhwX2ludDY0ID0gZmxhdGJ1ZmZlcnM6OkdldEFueUZpZWxkSShyb290LCBocF9maWVsZCk7CisgIFRFU1RfRVEoaHBfaW50NjQsIDMwMCk7CisgIGZsYXRidWZmZXJzOjpTZXRBbnlGaWVsZFMoJnJvb3QsIGhwX2ZpZWxkLCAiMzAwIik7CisgIGhwX2ludDY0ID0gZmxhdGJ1ZmZlcnM6OkdldEFueUZpZWxkSShyb290LCBocF9maWVsZCk7CisgIFRFU1RfRVEoaHBfaW50NjQsIDMwMCk7CisKKyAgLy8gVGVzdCBidWZmZXIgaXMgdmFsaWQgYWZ0ZXIgdGhlIG1vZGlmaWNhdGlvbnMKKyAgVEVTVF9FUShmbGF0YnVmZmVyczo6VmVyaWZ5KHNjaGVtYSwgKnNjaGVtYS5yb290X3RhYmxlKCksIGZsYXRidWYsIGxlbmd0aCksCisgICAgICAgICAgdHJ1ZSk7CisKKyAgLy8gUmVzZXQgaXQsIGZvciBmdXJ0aGVyIHRlc3RzLgorICBmbGF0YnVmZmVyczo6U2V0RmllbGQ8dWludDE2X3Q+KCZyb290LCBocF9maWVsZCwgODApOworCisgIC8vIE1vcmUgYWR2YW5jZWQgZnVuY3Rpb25hbGl0eTogY2hhbmdpbmcgdGhlIHNpemUgb2YgaXRlbXMgaW4tbGluZSEKKyAgLy8gRmlyc3Qgd2UgcHV0IHRoZSBGbGF0QnVmZmVyIGluc2lkZSBhbiBzdGQ6OnZlY3Rvci4KKyAgc3RkOjp2ZWN0b3I8dWludDhfdD4gcmVzaXppbmdidWYoZmxhdGJ1ZiwgZmxhdGJ1ZiArIGxlbmd0aCk7CisgIC8vIEZpbmQgdGhlIGZpZWxkIHdlIHdhbnQgdG8gbW9kaWZ5LgorICBhdXRvICZuYW1lX2ZpZWxkID0gKmZpZWxkcy0+TG9va3VwQnlLZXkoIm5hbWUiKTsKKyAgLy8gR2V0IHRoZSByb290LgorICAvLyBUaGlzIHRpbWUgd2Ugd3JhcCB0aGUgcmVzdWx0IGZyb20gR2V0QW55Um9vdCBpbiBhIHNtYXJ0cG9pbnRlciB0aGF0CisgIC8vIHdpbGwga2VlcCBycm9vdCB2YWxpZCBhcyByZXNpemluZ2J1ZiByZXNpemVzLgorICBhdXRvIHJyb290ID0gZmxhdGJ1ZmZlcnM6OnBpdihmbGF0YnVmZmVyczo6R2V0QW55Um9vdChyZXNpemluZ2J1Zi5kYXRhKCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNpemluZ2J1Zik7CisgIFNldFN0cmluZyhzY2hlbWEsICJ0b3RhbGx5IG5ldyBzdHJpbmciLCBHZXRGaWVsZFMoKipycm9vdCwgbmFtZV9maWVsZCksCisgICAgICAgICAgICAmcmVzaXppbmdidWYpOworICAvLyBIZXJlIHJlc2l6aW5nYnVmIGhhcyBjaGFuZ2VkLCBidXQgcnJvb3QgaXMgc3RpbGwgdmFsaWQuCisgIFRFU1RfRVFfU1RSKEdldEZpZWxkUygqKnJyb290LCBuYW1lX2ZpZWxkKS0+Y19zdHIoKSwgInRvdGFsbHkgbmV3IHN0cmluZyIpOworICAvLyBOb3cgbGV0cyBleHRlbmQgYSB2ZWN0b3IgYnkgMTAwIGVsZW1lbnRzICgxMCAtPiAxMTApLgorICBhdXRvICZpbnZlbnRvcnlfZmllbGQgPSAqZmllbGRzLT5Mb29rdXBCeUtleSgiaW52ZW50b3J5Iik7CisgIGF1dG8gcmludmVudG9yeSA9IGZsYXRidWZmZXJzOjpwaXYoCisgICAgICBmbGF0YnVmZmVyczo6R2V0RmllbGRWPHVpbnQ4X3Q+KCoqcnJvb3QsIGludmVudG9yeV9maWVsZCksIHJlc2l6aW5nYnVmKTsKKyAgZmxhdGJ1ZmZlcnM6OlJlc2l6ZVZlY3Rvcjx1aW50OF90PihzY2hlbWEsIDExMCwgNTAsICpyaW52ZW50b3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyZXNpemluZ2J1Zik7CisgIC8vIHJpbnZlbnRvcnkgc3RpbGwgdmFsaWQsIHNvIGxldHMgcmVhZCBmcm9tIGl0LgorICBURVNUX0VRKHJpbnZlbnRvcnktPkdldCgxMCksIDUwKTsKKworICAvLyBGb3IgcmVmbGVjdGlvbiB1c2VzIG5vdCBjb3ZlcmVkIGFscmVhZHksIHRoZXJlIGlzIGEgbW9yZSBwb3dlcmZ1bCB3YXk6CisgIC8vIHdlIGNhbiBzaW1wbHkgZ2VuZXJhdGUgd2hhdGV2ZXIgb2JqZWN0IHdlIHdhbnQgdG8gYWRkL21vZGlmeSBpbiBhCisgIC8vIEZsYXRCdWZmZXIgb2YgaXRzIG93biwgdGhlbiBhZGQgdGhhdCB0byBhbiBleGlzdGluZyBGbGF0QnVmZmVyOgorICAvLyBBcyBhbiBleGFtcGxlLCBsZXQncyBhZGQgYSBzdHJpbmcgdG8gYW4gYXJyYXkgb2Ygc3RyaW5ncy4KKyAgLy8gRmlyc3QsIGZpbmQgb3VyIGZpZWxkOgorICBhdXRvICZ0ZXN0YXJyYXlvZnN0cmluZ19maWVsZCA9ICpmaWVsZHMtPkxvb2t1cEJ5S2V5KCJ0ZXN0YXJyYXlvZnN0cmluZyIpOworICAvLyBGaW5kIHRoZSB2ZWN0b3IgdmFsdWU6CisgIGF1dG8gcnRlc3RhcnJheW9mc3RyaW5nID0gZmxhdGJ1ZmZlcnM6OnBpdigKKyAgICAgIGZsYXRidWZmZXJzOjpHZXRGaWVsZFY8ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxmbGF0YnVmZmVyczo6U3RyaW5nPj4oCisgICAgICAgICAgKipycm9vdCwgdGVzdGFycmF5b2ZzdHJpbmdfZmllbGQpLAorICAgICAgcmVzaXppbmdidWYpOworICAvLyBJdCdzIGEgdmVjdG9yIG9mIDIgc3RyaW5ncywgdG8gd2hpY2ggd2UgYWRkIG9uZSBtb3JlLCBpbml0aWFsaXplZCB0bworICAvLyBvZmZzZXQgMC4KKyAgZmxhdGJ1ZmZlcnM6OlJlc2l6ZVZlY3RvcjxmbGF0YnVmZmVyczo6T2Zmc2V0PGZsYXRidWZmZXJzOjpTdHJpbmc+PigKKyAgICAgIHNjaGVtYSwgMywgMCwgKnJ0ZXN0YXJyYXlvZnN0cmluZywgJnJlc2l6aW5nYnVmKTsKKyAgLy8gSGVyZSB3ZSBqdXN0IGNyZWF0ZSBhIGJ1ZmZlciB0aGF0IGNvbnRhbnMgYSBzaW5nbGUgc3RyaW5nLCBidXQgdGhpcworICAvLyBjb3VsZCBhbHNvIGJlIGFueSBjb21wbGV4IHNldCBvZiB0YWJsZXMgYW5kIG90aGVyIHZhbHVlcy4KKyAgZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyIHN0cmluZ2ZiYjsKKyAgc3RyaW5nZmJiLkZpbmlzaChzdHJpbmdmYmIuQ3JlYXRlU3RyaW5nKCJoYW5rIikpOworICAvLyBBZGQgdGhlIGNvbnRlbnRzIG9mIGl0IHRvIG91ciBleGlzdGluZyBGbGF0QnVmZmVyLgorICAvLyBXZSBkbyB0aGlzIGxhc3QsIHNvIHRoZSBwb2ludGVyIGRvZXNuJ3QgZ2V0IGludmFsaWRhdGVkIChzaW5jZSBpdCBpcworICAvLyBhdCB0aGUgZW5kIG9mIHRoZSBidWZmZXIpOgorICBhdXRvIHN0cmluZ19wdHIgPSBmbGF0YnVmZmVyczo6QWRkRmxhdEJ1ZmZlcigKKyAgICAgIHJlc2l6aW5nYnVmLCBzdHJpbmdmYmIuR2V0QnVmZmVyUG9pbnRlcigpLCBzdHJpbmdmYmIuR2V0U2l6ZSgpKTsKKyAgLy8gRmluYWxseSwgc2V0IHRoZSBuZXcgdmFsdWUgaW4gdGhlIHZlY3Rvci4KKyAgcnRlc3RhcnJheW9mc3RyaW5nLT5NdXRhdGVPZmZzZXQoMiwgc3RyaW5nX3B0cik7CisgIFRFU1RfRVFfU1RSKHJ0ZXN0YXJyYXlvZnN0cmluZy0+R2V0KDApLT5jX3N0cigpLCAiYm9iIik7CisgIFRFU1RfRVFfU1RSKHJ0ZXN0YXJyYXlvZnN0cmluZy0+R2V0KDIpLT5jX3N0cigpLCAiaGFuayIpOworICAvLyBUZXN0IGludGVncml0eSBvZiBhbGwgcmVzaXplIG9wZXJhdGlvbnMgYWJvdmUuCisgIGZsYXRidWZmZXJzOjpWZXJpZmllciByZXNpemVfdmVyaWZpZXIoCisgICAgICByZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QgKj4ocmVzaXppbmdidWYuZGF0YSgpKSwKKyAgICAgIHJlc2l6aW5nYnVmLnNpemUoKSk7CisgIFRFU1RfRVEoVmVyaWZ5TW9uc3RlckJ1ZmZlcihyZXNpemVfdmVyaWZpZXIpLCB0cnVlKTsKKworICAvLyBUZXN0IGJ1ZmZlciBpcyB2YWxpZCB1c2luZyByZWZsZWN0aW9uIGFzIHdlbGwKKyAgVEVTVF9FUShmbGF0YnVmZmVyczo6VmVyaWZ5KHNjaGVtYSwgKnNjaGVtYS5yb290X3RhYmxlKCksIHJlc2l6aW5nYnVmLmRhdGEoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc2l6aW5nYnVmLnNpemUoKSksCisgICAgICAgICAgdHJ1ZSk7CisKKyAgLy8gQXMgYW4gYWRkaXRpb25hbCB0ZXN0LCBhbHNvIHNldCBpdCBvbiB0aGUgbmFtZSBmaWVsZC4KKyAgLy8gTm90ZTogdW5saWtlIHRoZSBuYW1lIGNoYW5nZSBhYm92ZSwgdGhpcyBqdXN0IG92ZXJ3cml0ZXMgdGhlIG9mZnNldCwKKyAgLy8gcmF0aGVyIHRoYW4gY2hhbmdpbmcgdGhlIHN0cmluZyBpbi1wbGFjZS4KKyAgU2V0RmllbGRUKCpycm9vdCwgbmFtZV9maWVsZCwgc3RyaW5nX3B0cik7CisgIFRFU1RfRVFfU1RSKEdldEZpZWxkUygqKnJyb290LCBuYW1lX2ZpZWxkKS0+Y19zdHIoKSwgImhhbmsiKTsKKworICAvLyBVc2luZyByZWZsZWN0aW9uLCByYXRoZXIgdGhhbiBtdXRhdGluZyBiaW5hcnkgRmxhdEJ1ZmZlcnMsIHdlIGNhbiBhbHNvIGNvcHkKKyAgLy8gdGFibGVzIGFuZCBvdGhlciB0aGluZ3Mgb3V0IG9mIG90aGVyIEZsYXRCdWZmZXJzIGludG8gYSBGbGF0QnVmZmVyQnVpbGRlciwKKyAgLy8gZWl0aGVyIHBhcnQgb3Igd2hvbGUuCisgIGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciBmYmI7CisgIGF1dG8gcm9vdF9vZmZzZXQgPSBmbGF0YnVmZmVyczo6Q29weVRhYmxlKAorICAgICAgZmJiLCBzY2hlbWEsICpyb290X3RhYmxlLCAqZmxhdGJ1ZmZlcnM6OkdldEFueVJvb3QoZmxhdGJ1ZiksIHRydWUpOworICBmYmIuRmluaXNoKHJvb3Rfb2Zmc2V0LCBNb25zdGVySWRlbnRpZmllcigpKTsKKyAgLy8gVGVzdCB0aGF0IGl0IHdhcyBjb3BpZWQgY29ycmVjdGx5OgorICBBY2Nlc3NGbGF0QnVmZmVyVGVzdChmYmIuR2V0QnVmZmVyUG9pbnRlcigpLCBmYmIuR2V0U2l6ZSgpKTsKKworICAvLyBUZXN0IGJ1ZmZlciBpcyB2YWxpZCB1c2luZyByZWZsZWN0aW9uIGFzIHdlbGwKKyAgVEVTVF9FUShmbGF0YnVmZmVyczo6VmVyaWZ5KHNjaGVtYSwgKnNjaGVtYS5yb290X3RhYmxlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYmIuR2V0QnVmZmVyUG9pbnRlcigpLCBmYmIuR2V0U2l6ZSgpKSwKKyAgICAgICAgICB0cnVlKTsKK30KKwordm9pZCBNaW5pUmVmbGVjdEZsYXRCdWZmZXJzVGVzdCh1aW50OF90ICpmbGF0YnVmKSB7CisgIGF1dG8gcyA9CisgICAgICBmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlclRvU3RyaW5nKGZsYXRidWYsIE1vbnN0ZXI6Ok1pbmlSZWZsZWN0VHlwZVRhYmxlKCkpOworICBURVNUX0VRX1NUUigKKyAgICAgIHMuY19zdHIoKSwKKyAgICAgICJ7ICIKKyAgICAgICJwb3M6IHsgeDogMS4wLCB5OiAyLjAsIHo6IDMuMCwgdGVzdDE6IDAuMCwgdGVzdDI6IFJlZCwgdGVzdDM6ICIKKyAgICAgICJ7IGE6IDEwLCBiOiAyMCB9IH0sICIKKyAgICAgICJocDogODAsICIKKyAgICAgICJuYW1lOiBcIk15TW9uc3RlclwiLCAiCisgICAgICAiaW52ZW50b3J5OiBbIDAsIDEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDkgXSwgIgorICAgICAgInRlc3RfdHlwZTogTW9uc3RlciwgIgorICAgICAgInRlc3Q6IHsgbmFtZTogXCJGcmVkXCIgfSwgIgorICAgICAgInRlc3Q0OiBbIHsgYTogMTAsIGI6IDIwIH0sIHsgYTogMzAsIGI6IDQwIH0gXSwgIgorICAgICAgInRlc3RhcnJheW9mc3RyaW5nOiBbIFwiYm9iXCIsIFwiZnJlZFwiLCBcImJvYlwiLCBcImZyZWRcIiBdLCAiCisgICAgICAidGVzdGFycmF5b2Z0YWJsZXM6IFsgeyBocDogMTAwMCwgbmFtZTogXCJCYXJuZXlcIiB9LCB7IG5hbWU6IFwiRnJlZFwiICIKKyAgICAgICJ9LCAiCisgICAgICAieyBuYW1lOiBcIldpbG1hXCIgfSBdLCAiCisgICAgICAvLyBUT0RPKHd2byk6IHNob3VsZCByZWFsbHkgcHJpbnQgdGhpcyBuZXN0ZWQgYnVmZmVyIGNvcnJlY3RseS4KKyAgICAgICJ0ZXN0bmVzdGVkZmxhdGJ1ZmZlcjogWyAyMCwgMCwgMCwgMCwgNzcsIDc5LCA3OCwgODMsIDEyLCAwLCAxMiwgMCwgMCwgIgorICAgICAgIjAsICIKKyAgICAgICI0LCAwLCA2LCAwLCA4LCAwLCAxMiwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgNCwgMCwgMCwgMCwgMTMsIDAsIDAsIDAsIDc4LCAiCisgICAgICAiMTAxLCAxMTUsIDExNiwgMTAxLCAxMDAsIDc3LCAxMTEsIDExMCwgMTE1LCAxMTYsIDEwMSwgMTE0LCAwLCAwLCAwIF0sICIKKyAgICAgICJ0ZXN0YXJyYXlvZnN0cmluZzI6IFsgXCJqYW5lXCIsIFwibWFyeVwiIF0sICIKKyAgICAgICJ0ZXN0YXJyYXlvZnNvcnRlZHN0cnVjdDogWyB7IGlkOiAwLCBkaXN0YW5jZTogMCB9LCAiCisgICAgICAieyBpZDogMiwgZGlzdGFuY2U6IDIwIH0sIHsgaWQ6IDMsIGRpc3RhbmNlOiAzMCB9LCAiCisgICAgICAieyBpZDogNCwgZGlzdGFuY2U6IDQwIH0gXSwgIgorICAgICAgImZsZXg6IFsgMjEwLCA0LCA1LCAyIF0sICIKKyAgICAgICJ0ZXN0NTogWyB7IGE6IDEwLCBiOiAyMCB9LCB7IGE6IDMwLCBiOiA0MCB9IF0sICIKKyAgICAgICJ2ZWN0b3Jfb2ZfZW51bXM6IFsgQmx1ZSwgR3JlZW4gXSwgIgorICAgICAgInNjYWxhcl9rZXlfc29ydGVkX3RhYmxlczogWyB7IGlkOiBcIm1pc3NcIiB9IF0gIgorICAgICAgIn0iKTsKKworICBUZXN0IHRlc3QoMTYsIDMyKTsKKyAgVmVjMyB2ZWMoMSwgMiwgMywgMS41LCBDb2xvcl9SZWQsIHRlc3QpOworICBmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgdmVjX2J1aWxkZXI7CisgIHZlY19idWlsZGVyLkZpbmlzaCh2ZWNfYnVpbGRlci5DcmVhdGVTdHJ1Y3QodmVjKSk7CisgIGF1dG8gdmVjX2J1ZmZlciA9IHZlY19idWlsZGVyLlJlbGVhc2UoKTsKKyAgYXV0byB2ZWNfc3RyID0gZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJUb1N0cmluZyh2ZWNfYnVmZmVyLmRhdGEoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWZWMzOjpNaW5pUmVmbGVjdFR5cGVUYWJsZSgpKTsKKyAgVEVTVF9FUV9TVFIodmVjX3N0ci5jX3N0cigpLAorICAgICAgICAgICAgICAieyB4OiAxLjAsIHk6IDIuMCwgejogMy4wLCB0ZXN0MTogMS41LCB0ZXN0MjogUmVkLCB0ZXN0MzogeyBhOiAiCisgICAgICAgICAgICAgICIxNiwgYjogMzIgfSB9Iik7Cit9CisKK3ZvaWQgTWluaVJlZmxlY3RGaXhlZExlbmd0aEFycmF5VGVzdCgpIHsKKyAgLy8gVlMxMCBkb2VzIG5vdCBzdXBwb3J0IHR5cGVkIGVudW1zLCBleGNsdWRlIGZyb20gdGVzdHMKKyNpZiAhZGVmaW5lZChfTVNDX1ZFUikgfHwgX01TQ19WRVIgPj0gMTcwMAorICBmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgZmJiOworICBNeUdhbWU6OkV4YW1wbGU6OkFycmF5U3RydWN0IGFTdHJ1Y3QoMiwgMTIsIDEpOworICBhdXRvIGFUYWJsZSA9IE15R2FtZTo6RXhhbXBsZTo6Q3JlYXRlQXJyYXlUYWJsZShmYmIsICZhU3RydWN0KTsKKyAgZmJiLkZpbmlzaChhVGFibGUpOworCisgIGF1dG8gZmxhdGJ1ZiA9IGZiYi5SZWxlYXNlKCk7CisgIGF1dG8gcyA9IGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyVG9TdHJpbmcoCisgICAgICBmbGF0YnVmLmRhdGEoKSwgTXlHYW1lOjpFeGFtcGxlOjpBcnJheVRhYmxlVHlwZVRhYmxlKCkpOworICBURVNUX0VRX1NUUigKKyAgICAgICJ7ICIKKyAgICAgICJhOiB7IGE6IDIuMCwgIgorICAgICAgImI6IFsgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCBdLCAiCisgICAgICAiYzogMTIsICIKKyAgICAgICJkOiBbIHsgYTogWyAwLCAwIF0sIGI6IEEsIGM6IFsgQSwgQSBdLCBkOiBbIDAsIDAgXSB9LCAiCisgICAgICAieyBhOiBbIDAsIDAgXSwgYjogQSwgYzogWyBBLCBBIF0sIGQ6IFsgMCwgMCBdIH0gXSwgIgorICAgICAgImU6IDEsIGY6IFsgMCwgMCBdIH0gIgorICAgICAgIn0iLAorICAgICAgcy5jX3N0cigpKTsKKyNlbmRpZgorfQorCit9ICAvLyBuYW1lc3BhY2UgdGVzdHMKK30gIC8vIG5hbWVzcGFjZSBmbGF0YnVmZmVycwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL3JlZmxlY3Rpb25fdGVzdC5oIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvcmVmbGVjdGlvbl90ZXN0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDUxNDg2NwotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL3JlZmxlY3Rpb25fdGVzdC5oCkBAIC0wLDAgKzEsMTYgQEAKKyNpZm5kZWYgVEVTVFNfUkVGTEVDVElPTl9URVNUX0gKKyNkZWZpbmUgVEVTVFNfUkVGTEVDVElPTl9URVNUX0gKKworI2luY2x1ZGUgPHN0cmluZz4KKworbmFtZXNwYWNlIGZsYXRidWZmZXJzIHsKK25hbWVzcGFjZSB0ZXN0cyB7CisKK3ZvaWQgUmVmbGVjdGlvblRlc3QoY29uc3Qgc3RkOjpzdHJpbmcmIHRlc3RzX2RhdGFfcGF0aCwgdWludDhfdCAqZmxhdGJ1Ziwgc2l6ZV90IGxlbmd0aCk7Cit2b2lkIE1pbmlSZWZsZWN0Rml4ZWRMZW5ndGhBcnJheVRlc3QoKTsKK3ZvaWQgTWluaVJlZmxlY3RGbGF0QnVmZmVyc1Rlc3QodWludDhfdCAqZmxhdGJ1Zik7CisKK30gIC8vIG5hbWVzcGFjZSB0ZXN0cworfSAgLy8gbmFtZXNwYWNlIGZsYXRidWZmZXJzCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvcnVzdF91c2FnZV90ZXN0L0NhcmdvLnRvbWwgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9ydXN0X3VzYWdlX3Rlc3QvQ2FyZ28udG9tbAppbmRleCBlNjc2OTcwLi5kNTczMWU3IDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9ydXN0X3VzYWdlX3Rlc3QvQ2FyZ28udG9tbAorKysgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9ydXN0X3VzYWdlX3Rlc3QvQ2FyZ28udG9tbApAQCAtNCw2ICs0LDcgQEAKIGF1dGhvcnMgPSBbIlJvYmVydCBXaW5zbG93IDxoZWxsb0Byd2luc2xvdy5jb20+IiwKICAgICAgICAgICAgIkNhc3BlciBOZW8gPGNuZW9AZ29vZ2xlLmNvbT4iLAogICAgICAgICAgICAiRmxhdEJ1ZmZlcnMgTWFpbnRhaW5lcnMiXQorZWRpdGlvbiA9ICIyMDE4IgogCiBbZGVwZW5kZW5jaWVzXQogZmxhdGJ1ZmZlcnMgPSB7IHBhdGggPSAiLi4vLi4vcnVzdC9mbGF0YnVmZmVycyIsIGRlZmF1bHQtZmVhdHVyZXMgPSBmYWxzZSB9CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9ydXN0X3VzYWdlX3Rlc3QvYmVuY2hlcy9mbGF0YnVmZmVyc19iZW5jaG1hcmtzLnJzIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvcnVzdF91c2FnZV90ZXN0L2JlbmNoZXMvZmxhdGJ1ZmZlcnNfYmVuY2htYXJrcy5ycwppbmRleCA1ODBkNDMzLi43ZDcyNTAxIDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9ydXN0X3VzYWdlX3Rlc3QvYmVuY2hlcy9mbGF0YnVmZmVyc19iZW5jaG1hcmtzLnJzCisrKyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL3J1c3RfdXNhZ2VfdGVzdC9iZW5jaGVzL2ZsYXRidWZmZXJzX2JlbmNobWFya3MucnMKQEAgLTE0LDkgKzE0LDggQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKK3VzZSBiZW5jaGVyOjp7YmVuY2htYXJrX2dyb3VwLCBCZW5jaGVyfTsKIHVzZSBmbGF0YnVmZmVyczsKLXVzZSBiZW5jaGVyOjpCZW5jaGVyOwotCiAKICNbYWxsb3coZGVhZF9jb2RlLCB1bnVzZWRfaW1wb3J0cyldCiAjW3BhdGggPSAiLi4vLi4vbW9uc3Rlcl90ZXN0L21vZC5ycyJdCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9ydXN0X3VzYWdlX3Rlc3QvYmVuY2hlcy9mbGV4YnVmZmVyc19iZW5jaG1hcmtzLnJzIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvcnVzdF91c2FnZV90ZXN0L2JlbmNoZXMvZmxleGJ1ZmZlcnNfYmVuY2htYXJrcy5ycwppbmRleCAxYjlhOGZiLi4yNjg0MjkxIDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9ydXN0X3VzYWdlX3Rlc3QvYmVuY2hlcy9mbGV4YnVmZmVyc19iZW5jaG1hcmtzLnJzCisrKyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL3J1c3RfdXNhZ2VfdGVzdC9iZW5jaGVzL2ZsZXhidWZmZXJzX2JlbmNobWFya3MucnMKQEAgLTEyLDcgKzEyLDcgQEAKIC8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKIC8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCi11c2UgYmVuY2hlcjo6QmVuY2hlcjsKK3VzZSBiZW5jaGVyOjp7YmVuY2htYXJrX2dyb3VwLCBiZW5jaG1hcmtfbWFpbiwgQmVuY2hlcn07CiB1c2UgZmxleGJ1ZmZlcnM6Oio7CiAKIGZuIHB1c2hfdmVjX3U2NF90b19tYXAoYjogJm11dCBCZW5jaGVyKSB7CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9ydXN0X3VzYWdlX3Rlc3QvdGVzdHMvYXJyYXlzX3Rlc3QucnMgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9ydXN0X3VzYWdlX3Rlc3QvdGVzdHMvYXJyYXlzX3Rlc3QucnMKaW5kZXggZmFhMGFjOC4uZTkyZTg2MiAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvcnVzdF91c2FnZV90ZXN0L3Rlc3RzL2FycmF5c190ZXN0LnJzCisrKyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL3J1c3RfdXNhZ2VfdGVzdC90ZXN0cy9hcnJheXNfdGVzdC5ycwpAQCAtMSwxNiArMSwyMyBAQAorIyFbbm9fc3RkXQorCisjW2NmZyhub3QoZmVhdHVyZSA9ICJub19zdGQiKSldCitleHRlcm4gY3JhdGUgc3RkOworCitleHRlcm4gY3JhdGUgYWxsb2M7CisKIGV4dGVybiBjcmF0ZSBhcnJheV9pbml0OwogI1thbGxvdyhkZWFkX2NvZGUsIHVudXNlZF9pbXBvcnRzKV0KICNbcGF0aCA9ICIuLi8uLi9hcnJheXNfdGVzdC9tb2QucnMiXQogbW9kIGFycmF5c190ZXN0X2dlbmVyYXRlZDsKLXVzZSBzdGQ6OmZtdDo6RGVidWc7Cit1c2UgYWxsb2M6OmZvcm1hdDsKK3VzZSBjb3JlOjpmbXQ6OkRlYnVnOwogCiB1c2UgY3JhdGU6OmFycmF5c190ZXN0X2dlbmVyYXRlZDo6bXlfZ2FtZTo6ZXhhbXBsZTo6KjsKIGV4dGVybiBjcmF0ZSBxdWlja2NoZWNrOwogdXNlIGFycmF5X2luaXQ6OmFycmF5X2luaXQ7Ci11c2Ugc3RkOjptZW06OnNpemVfb2Y7Cit1c2UgY29yZTo6bWVtOjpzaXplX29mOwogdXNlIHF1aWNrY2hlY2s6OntBcmJpdHJhcnksIEdlbn07CiAKLQogZm4gY3JlYXRlX3NlcmlhbGl6ZWRfZXhhbXBsZV93aXRoX2dlbmVyYXRlZF9jb2RlKGJ1aWxkZXI6ICZtdXQgZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyKSB7CiAgICAgbGV0IG5lc3RlZF9zdHJ1Y3QxID0gTmVzdGVkU3RydWN0OjpuZXcoCiAgICAgICAgICZbLTEsIDJdLApAQCAtMTExLDEyICsxMTgsMTIgQEAKIAogI1t0ZXN0XQogZm4gc3RydWN0X25ldHN0ZWRfc3RydWN0X2lzXzMyX2J5dGVzKCkgewotICAgIGFzc2VydF9lcSEoMzIsIDo6c3RkOjptZW06OnNpemVfb2Y6OjxOZXN0ZWRTdHJ1Y3Q+KCkpOworICAgIGFzc2VydF9lcSEoMzIsIDo6Y29yZTo6bWVtOjpzaXplX29mOjo8TmVzdGVkU3RydWN0PigpKTsKIH0KIAogI1t0ZXN0XQogZm4gc3RydWN0X2FycmF5X3N0cnVjdF9pc18xNjBfYnl0ZXMoKSB7Ci0gICAgYXNzZXJ0X2VxISgxNjAsIDo6c3RkOjptZW06OnNpemVfb2Y6OjxBcnJheVN0cnVjdD4oKSk7CisgICAgYXNzZXJ0X2VxISgxNjAsIDo6Y29yZTo6bWVtOjpzaXplX29mOjo8QXJyYXlTdHJ1Y3Q+KCkpOwogfQogCiAjW3Rlc3RdCkBAIC0yMjgsNyArMjM1LDcgQEAKICAgICBsZXQgYl9zdGFydF9wdHIgPSBhcnJheV9zdHJ1Y3QuYigpLmFzX3B0cigpIGFzIHVzaXplOwogICAgIGxldCBkX3N0YXJ0X3B0ciA9IGFycmF5X3N0cnVjdC5kKCkuYXNfcHRyKCkgYXMgdXNpemU7CiAgICAgLy8gVGhlIFQgdHlwZSBvZiBiCi0gICAgbGV0IGJfYWxuID0gOjpzdGQ6Om1lbTo6YWxpZ25fb2Y6OjxpMzI+KCk7CisgICAgbGV0IGJfYWxuID0gOjpjb3JlOjptZW06OmFsaWduX29mOjo8aTMyPigpOwogICAgIGFzc2VydF9lcSEoKGJfc3RhcnRfcHRyIC0gc3RydWN0X3N0YXJ0X3B0cikgJSBiX2FsbiwgMCk7CiAgICAgYXNzZXJ0X2VxISgoZF9zdGFydF9wdHIgLSBiX3N0YXJ0X3B0cikgJSBiX2FsbiwgMCk7CiAgICAgYXNzZXJ0X2VxISgoZF9zdGFydF9wdHIgLSBzdHJ1Y3Rfc3RhcnRfcHRyKSAlIDgsIDApOwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvcnVzdF91c2FnZV90ZXN0L3Rlc3RzL2ZsZXhidWZmZXJzX3Rlc3RzL2JpbmFyeV9mb3JtYXQucnMgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9ydXN0X3VzYWdlX3Rlc3QvdGVzdHMvZmxleGJ1ZmZlcnNfdGVzdHMvYmluYXJ5X2Zvcm1hdC5ycwppbmRleCA5MTBmYzc4Li44NGZkMjFiIDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9ydXN0X3VzYWdlX3Rlc3QvdGVzdHMvZmxleGJ1ZmZlcnNfdGVzdHMvYmluYXJ5X2Zvcm1hdC5ycworKysgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9ydXN0X3VzYWdlX3Rlc3QvdGVzdHMvZmxleGJ1ZmZlcnNfdGVzdHMvYmluYXJ5X2Zvcm1hdC5ycwpAQCAtMTE1LDcgKzExNSw2IEBACiAgICAgICAgIGxldCBtdXQgZXhwZWN0ZWQgPSB4LnRvX2xlX2J5dGVzKCkudG9fdmVjKCk7CiAgICAgICAgIGV4cGVjdGVkLnB1c2goMyA8PCAyIHwgMik7ICAvLyBGbG9hdCBXMzIuCiAgICAgICAgIGV4cGVjdGVkLnB1c2goNCk7IC8vIFJvb3Qgd2lkdGggVzMyLgotICAgICAgICBwcmludGxuISgiezo/fTogezo/fSB2cyB7Oj99IGNtcCB7Oj99IiwgeCwgJmZ4YiwgJmV4cGVjdGVkLCBmeGI9PWV4cGVjdGVkKTsKICAgICAgICAgZnhiID09IGV4cGVjdGVkCiAgICAgfQogfQpAQCAtMzIxLDcgKzMyMCw3IEBACiAgICAgdi5wdXNoKEluZGlyZWN0VUludCh1NjQ6Om1heF92YWx1ZSgpKSk7CiAgICAgdi5wdXNoKEluZGlyZWN0SW50KGk2NDo6bWluX3ZhbHVlKCkpKTsKICAgICAvLyBUT0RPKGNuZW8pOiBTb21ldGhpbmcgYWJvdXQgRmxvYXQgRVBTSUxPTiBhbmQgY2FzdGluZyBsZWFkcyB0byBhIGRpZmZlcmVudCBiaW5hcnkgZm9ybWF0LgotICAgIHYucHVzaChJbmRpcmVjdEZsb2F0KHN0ZDo6ZjY0Ojpjb25zdHM6OlBJKSk7CisgICAgdi5wdXNoKEluZGlyZWN0RmxvYXQoY29yZTo6ZjY0Ojpjb25zdHM6OlBJKSk7CiAgICAgdi5wdXNoKDB1MzIpOyAvLyBUaGlzIGlzIHN0b3JlZCBpbiA4IGJpdHMgaW5zdGVhZCBvZiA2NCBiZWNhdXNlIG9mIGluZGlyZWN0aW9uLgogICAgIHYuZW5kX3ZlY3RvcigpOwogICAgIGFzc2VydF9lcSEoCkBAIC0zODUsNyArMzg0LDYgQEAKICAgICB2LnB1c2goSW5kaXJlY3RJbnQoaTY0OjptYXhfdmFsdWUoKSkpOwogICAgIHYuZW5kX3ZlY3RvcigpOwogICAgIGxldCBsZW5fd2l0aF9pbmRpcmVjdCA9IGJ1aWxkZXIudmlldygpLmxlbigpIGFzIGYzMjsKLSAgICBkYmchKGxlbl93aXRoX2luZGlyZWN0LCBsZW5fd2l0aG91dF9pbmRpcmVjdCk7CiAgICAgYXNzZXJ0IShsZW5fd2l0aF9pbmRpcmVjdCAqIDIuNSA8IGxlbl93aXRob3V0X2luZGlyZWN0KTsKIH0KICNbdGVzdF0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL3J1c3RfdXNhZ2VfdGVzdC90ZXN0cy9mbGV4YnVmZmVyc190ZXN0cy9tb2QucnMgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9ydXN0X3VzYWdlX3Rlc3QvdGVzdHMvZmxleGJ1ZmZlcnNfdGVzdHMvbW9kLnJzCmluZGV4IDYyMWY4MWIuLmVlNTJhY2EgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL3J1c3RfdXNhZ2VfdGVzdC90ZXN0cy9mbGV4YnVmZmVyc190ZXN0cy9tb2QucnMKKysrIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvcnVzdF91c2FnZV90ZXN0L3Rlc3RzL2ZsZXhidWZmZXJzX3Rlc3RzL21vZC5ycwpAQCAtMTMsNiArMTMsNyBAQAogLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKIG1vZCBiaW5hcnlfZm9ybWF0OworI1tjZmcobm90KGZlYXR1cmUgPSAibm9fc3RkIikpXSAvLyB1c2VzIGZpbGUgSS9PCiBtb2QgaW50ZXJvcDsKIG1vZCBvdGhlcl9hcGk7CiAjW2NmZyhub3QobWlyaSkpXSAgLy8gc2xvdy4KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL3J1c3RfdXNhZ2VfdGVzdC90ZXN0cy9mbGV4YnVmZmVyc190ZXN0cy9vdGhlcl9hcGkucnMgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9ydXN0X3VzYWdlX3Rlc3QvdGVzdHMvZmxleGJ1ZmZlcnNfdGVzdHMvb3RoZXJfYXBpLnJzCmluZGV4IGQxYzA4NzMuLjk4NzVjMjIgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL3J1c3RfdXNhZ2VfdGVzdC90ZXN0cy9mbGV4YnVmZmVyc190ZXN0cy9vdGhlcl9hcGkucnMKKysrIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvcnVzdF91c2FnZV90ZXN0L3Rlc3RzL2ZsZXhidWZmZXJzX3Rlc3RzL290aGVyX2FwaS5ycwpAQCAtMTIsNiArMTIsOCBAQAogLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKK3VzZSBhbGxvYzo6dmVjOjpWZWM7CisKIHVzZSBmbGV4YnVmZmVyczo6KjsKICNbY2ZnKG5vdChtaXJpKSldICAvLyBzbG93LgogdXNlIHF1aWNrY2hlY2s6OlF1aWNrQ2hlY2s7CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9ydXN0X3VzYWdlX3Rlc3QvdGVzdHMvZmxleGJ1ZmZlcnNfdGVzdHMvcWNfc2VyaW91cy5ycyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL3J1c3RfdXNhZ2VfdGVzdC90ZXN0cy9mbGV4YnVmZmVyc190ZXN0cy9xY19zZXJpb3VzLnJzCmluZGV4IDFiZWQzYzIuLmIyZTA0ZWMgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL3J1c3RfdXNhZ2VfdGVzdC90ZXN0cy9mbGV4YnVmZmVyc190ZXN0cy9xY19zZXJpb3VzLnJzCisrKyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL3J1c3RfdXNhZ2VfdGVzdC90ZXN0cy9mbGV4YnVmZmVyc190ZXN0cy9xY19zZXJpb3VzLnJzCkBAIC0xLDcgKzEsMTAgQEAKK3VzZSBhbGxvYzo6Y29sbGVjdGlvbnM6OkJUcmVlTWFwOwordXNlIGFsbG9jOjpzdHJpbmc6OlN0cmluZzsKK3VzZSBhbGxvYzo6dmVjOjpWZWM7CisKIHVzZSBzdXBlcjo6cnd5dzo6Tm9uTnVsbFN0cmluZzsKIHVzZSBmbGV4YnVmZmVyczo6KjsKIHVzZSBxdWlja2NoZWNrOjp7QXJiaXRyYXJ5LCBHZW59OwotdXNlIHN0ZDo6Y29sbGVjdGlvbnM6OkJUcmVlTWFwOwogCiAjW2Rlcml2ZShEZWJ1ZywgQ2xvbmUsIFBhcnRpYWxFcSwgU2VyaWFsaXplLCBEZXNlcmlhbGl6ZSldCiBlbnVtIEVudW0gewpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvcnVzdF91c2FnZV90ZXN0L3Rlc3RzL2ZsZXhidWZmZXJzX3Rlc3RzL3J3eXcucnMgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9ydXN0X3VzYWdlX3Rlc3QvdGVzdHMvZmxleGJ1ZmZlcnNfdGVzdHMvcnd5dy5ycwppbmRleCA4YzI3ZTZiLi40NzhkMzNhIDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9ydXN0X3VzYWdlX3Rlc3QvdGVzdHMvZmxleGJ1ZmZlcnNfdGVzdHMvcnd5dy5ycworKysgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9ydXN0X3VzYWdlX3Rlc3QvdGVzdHMvZmxleGJ1ZmZlcnNfdGVzdHMvcnd5dy5ycwpAQCAtMTIsNiArMTIsOSBAQAogLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKK3VzZSBhbGxvYzo6c3RyaW5nOjp7U3RyaW5nLCBUb1N0cmluZ307Cit1c2UgYWxsb2M6OnZlYzo6VmVjOworCiAvLyBSZWFkIHdoYXQgeW91IHdyb3RlLgogdXNlIGZsZXhidWZmZXJzOjoqOwogI1tjZmcobm90KG1pcmkpKV0gIC8vIHNsb3cuCkBAIC0yMyw3ICsyNiw3IEBACiBwdWIgc3RydWN0IE5vbk51bGxTdHJpbmcoU3RyaW5nKTsKIGltcGwgcXVpY2tjaGVjazo6QXJiaXRyYXJ5IGZvciBOb25OdWxsU3RyaW5nIHsKICAgICBmbiBhcmJpdHJhcnk8RzogcXVpY2tjaGVjazo6R2VuPihnOiAmbXV0IEcpIC0+IFNlbGYgewotICAgICAgICBsZXQgc2l6ZSA9IHN0ZDo6Y21wOjptaW4oMSwgdXNpemU6OmFyYml0cmFyeShnKSk7CisgICAgICAgIGxldCBzaXplID0gY29yZTo6Y21wOjptaW4oMSwgdXNpemU6OmFyYml0cmFyeShnKSk7CiAgICAgICAgIE5vbk51bGxTdHJpbmcoCiAgICAgICAgICAgICAoMC4uKQogICAgICAgICAgICAgICAgIC5tYXAofF98IDxjaGFyPjo6YXJiaXRyYXJ5KGcpKQpAQCAtNzQsNyArNzcsNyBAQAogICAgICAgICB9CiAgICAgICAgIHYuZW5kX3ZlY3RvcigpOwogICAgICAgICBsZXQgciA9IFJlYWRlcjo6Z2V0X3Jvb3QoYnVpbGRlci52aWV3KCkpLnVud3JhcCgpLmFzX3ZlY3RvcigpOwotICAgICAgICB4cy5pdGVyKCkuZW51bWVyYXRlKCkuYWxsKHwoaSwgJngpfCAoci5pZHgoaSkuYXNfZjY0KCkgLSB4KS5hYnMoKSA8IHN0ZDo6ZjY0OjpFUFNJTE9OKQorICAgICAgICB4cy5pdGVyKCkuZW51bWVyYXRlKCkuYWxsKHwoaSwgJngpfCAoci5pZHgoaSkuYXNfZjY0KCkgLSB4KS5hYnMoKSA8IGNvcmU6OmY2NDo6RVBTSUxPTikKICAgICB9CiAgICAgZm4gcWNfdmVjX3N0cmluZyh4czogVmVjPFN0cmluZz4pIC0+IGJvb2wgewogICAgICAgICBsZXQgbXV0IGJ1aWxkZXIgPSBCdWlsZGVyOjpkZWZhdWx0KCk7CkBAIC04Niw2ICs4OSw3IEBACiAgICAgICAgIGxldCByID0gUmVhZGVyOjpnZXRfcm9vdChidWlsZGVyLnZpZXcoKSkudW53cmFwKCkuYXNfdmVjdG9yKCk7CiAgICAgICAgIHhzLml0ZXIoKS5lbnVtZXJhdGUoKS5hbGwofChpLCB4KXwgKHIuaWR4KGkpLmFzX3N0cigpID09IHgpKQogICAgIH0KKyAgICAjW2NmZyhub3QoZmVhdHVyZSA9ICJub19zdGQiKSldCiAgICAgZm4gcWNfbWFwX2ludCh4czogc3RkOjpjb2xsZWN0aW9uczo6QlRyZWVNYXA8Tm9uTnVsbFN0cmluZywgaTY0PikgLT4gYm9vbCB7CiAgICAgICAgIGxldCBtdXQgYnVpbGRlciA9IEJ1aWxkZXI6OmRlZmF1bHQoKTsKICAgICAgICAgbGV0IG11dCBtID0gYnVpbGRlci5zdGFydF9tYXAoKTsKQEAgLTk4LDYgKzEwMiw3IEBACiAgICAgICAgICAgICByLmlkeChpKS5hc19pNjQoKSA9PSB2ICYmIHIuaWR4KGsuMC5hc19zdHIoKSkuYXNfaTY0KCkgPT0gdgogICAgICAgICB9KQogICAgIH0KKyAgICAjW2NmZyhub3QoZmVhdHVyZSA9ICJub19zdGQiKSldCiAgICAgZm4gcWNfbWFwX3N0cmluZyh4czogc3RkOjpjb2xsZWN0aW9uczo6QlRyZWVNYXA8Tm9uTnVsbFN0cmluZywgU3RyaW5nPikgLT4gYm9vbCB7CiAgICAgICAgIGxldCBtdXQgYnVpbGRlciA9IEJ1aWxkZXI6OmRlZmF1bHQoKTsKICAgICAgICAgbGV0IG11dCBtID0gYnVpbGRlci5zdGFydF9tYXAoKTsKQEAgLTE5NSw3ICsyMDAsNiBAQAogICAgIGxldCBmb28xID0gRm9vOjpkZWZhdWx0KCk7CiAgICAgbGV0IG11dCBzID0gRmxleGJ1ZmZlclNlcmlhbGl6ZXI6Om5ldygpOwogICAgIGZvbzEuc2VyaWFsaXplKCZtdXQgcykudW53cmFwKCk7Ci0gICAgZGJnIShzLnZpZXcoKSk7CiAgICAgbGV0IHIgPSBSZWFkZXI6OmdldF9yb290KHMudmlldygpKS51bndyYXAoKTsKICAgICBsZXQgZm9vMiA9IEZvbzo6ZGVzZXJpYWxpemUocikudW53cmFwKCk7CiAgICAgYXNzZXJ0X2VxIShmb28xLCBmb28yKTsKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL3J1c3RfdXNhZ2VfdGVzdC90ZXN0cy9pbnRlZ3JhdGlvbl90ZXN0LnJzIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvcnVzdF91c2FnZV90ZXN0L3Rlc3RzL2ludGVncmF0aW9uX3Rlc3QucnMKaW5kZXggOWE0YzhiMy4uNzNkNGExZiAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvcnVzdF91c2FnZV90ZXN0L3Rlc3RzL2ludGVncmF0aW9uX3Rlc3QucnMKKysrIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvcnVzdF91c2FnZV90ZXN0L3Rlc3RzL2ludGVncmF0aW9uX3Rlc3QucnMKQEAgLTE1LDYgKzE1LDE4IEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCisjIVtub19zdGRdCisKKyNbY2ZnKG5vdChmZWF0dXJlID0gIm5vX3N0ZCIpKV0KK2V4dGVybiBjcmF0ZSBzdGQ7CisjW2NmZyhub3QoZmVhdHVyZSA9ICJub19zdGQiKSldCit1c2UgYWxsb2M6OnZlYzo6VmVjOworCisjW21hY3JvX3VzZV0KK2V4dGVybiBjcmF0ZSBhbGxvYzsKKwordXNlIGFsbG9jOjpzdHJpbmc6OlN0cmluZzsKKwogI1tjZmcoZmVhdHVyZSA9ICJub19zdGQiKV0KICNbZ2xvYmFsX2FsbG9jYXRvcl0KIHN0YXRpYyBBTExPQ0FUT1I6IGxpYmNfYWxsb2M6OkxpYmNBbGxvYyA9IGxpYmNfYWxsb2M6OkxpYmNBbGxvYzsKQEAgLTM5Miw5ICs0MDQsOSBAQAogICAgIC8vIElmIHRoZSB2ZXJpZmllciBzYXlzIGEgYnVmZmVyIGlzIG9rYXkgdGhlbiB1c2luZyBpdCB3b24ndCBjYXVzZSBhIGNyYXNoLgogICAgIC8vIFdlIHVzZSB3cml0ZV9mbXQgc2luY2UgRGVidWcgdmlzaXRzIGFsbCB0aGUgZmllbGRzIC0gYnV0IHRoZXJlJ3Mgbm8gbmVlZCB0byBzdG9yZSBhbnl0aGluZy4KICAgICBzdHJ1Y3QgRm9yZ2V0ZnVsV3JpdGVyOwotICAgIHVzZSBzdGQ6OmZtdDo6V3JpdGU7CisgICAgdXNlIGNvcmU6OmZtdDo6V3JpdGU7CiAgICAgaW1wbCBXcml0ZSBmb3IgRm9yZ2V0ZnVsV3JpdGVyIHsKLSAgICAgICAgZm4gd3JpdGVfc3RyKCZtdXQgc2VsZiwgXzogJnN0cikgLT4gUmVzdWx0PCgpLCBzdGQ6OmZtdDo6RXJyb3I+IHsKKyAgICAgICAgZm4gd3JpdGVfc3RyKCZtdXQgc2VsZiwgXzogJnN0cikgLT4gUmVzdWx0PCgpLCBjb3JlOjpmbXQ6OkVycm9yPiB7CiAgICAgICAgICAgICBPaygoKSkKICAgICAgICAgfQogICAgIH0KQEAgLTQ0Miw3ICs0NTQsNyBAQAogICAgIGxldCBiID0gJm11dCBmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXI6Om5ldygpOwogICAgIGxldCBuYW1lID0gU29tZShiLmNyZWF0ZV9zdHJpbmcoImZvbyIpKTsKICAgICAvLyBTdHJpbmcgYW1wbGlmaWNhdGlvbiBhdHRhY2suCi0gICAgbGV0IHMgPSBiLmNyZWF0ZV9zdHJpbmcoJihzdGQ6Oml0ZXI6OnJlcGVhdCgiWCIpLnRha2UoMTAwMCkuY29sbGVjdDo6PFN0cmluZz4oKSkpOworICAgIGxldCBzID0gYi5jcmVhdGVfc3RyaW5nKCYoY29yZTo6aXRlcjo6cmVwZWF0KCJYIikudGFrZSgxMDAwKS5jb2xsZWN0Ojo8U3RyaW5nPigpKSk7CiAgICAgbGV0IHRlc3RhcnJheW9mc3RyaW5nID0gU29tZShiLmNyZWF0ZV92ZWN0b3IoJnZlYyFbczsgMTAwMF0pKTsKICAgICBsZXQgbSA9IE1vbnN0ZXI6OmNyZWF0ZShiLCAmTW9uc3RlckFyZ3MgewogICAgICAgICB0ZXN0YXJyYXlvZnN0cmluZywKQEAgLTU0MSwxMSArNTUzLDEyIEBACiAgICAgfQogfQogCisjW2NmZyhub3QoZmVhdHVyZSA9ICJub19zdGQiKSldCiAjW2NmZyh0ZXN0KV0KIG1vZCBsaWZldGltZV9jb3JyZWN0bmVzcyB7CiAgICAgZXh0ZXJuIGNyYXRlIGZsYXRidWZmZXJzOwogCi0gICAgdXNlIHN0ZDo6bWVtOworICAgIHVzZSBjb3JlOjptZW07CiAKICAgICB1c2Ugc3VwZXI6Om15X2dhbWU7CiAgICAgdXNlIHN1cGVyOjpsb2FkX2ZpbGU7CkBAIC01OTMsNiArNjA2LDggQEAKIG1vZCByb3VuZHRyaXBfZ2VuZXJhdGVkX2NvZGUgewogICAgIGV4dGVybiBjcmF0ZSBmbGF0YnVmZmVyczsKIAorICAgIHVzZSBhbGxvYzo6dmVjOjpWZWM7CisKICAgICB1c2Ugc3VwZXI6Om15X2dhbWU7CiAKICAgICBmbiBidWlsZF9tb248J2EsICdiPihidWlsZGVyOiAmJ2EgbXV0IGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciwgYXJnczogJidiIG15X2dhbWU6OmV4YW1wbGU6Ok1vbnN0ZXJBcmdzKSAtPiBteV9nYW1lOjpleGFtcGxlOjpNb25zdGVyPCdhPiB7CkBAIC05ODgsMjUgKzEwMDMsMjUgQEAKIAogICAgICNbdGVzdF0KICAgICBmbiBlbnVtX2NvbG9yX2lzXzFfYnl0ZSgpIHsKLSAgICAgICAgYXNzZXJ0X2VxISgxLCA6OnN0ZDo6bWVtOjpzaXplX29mOjo8bXlfZ2FtZTo6ZXhhbXBsZTo6Q29sb3I+KCkpOworICAgICAgICBhc3NlcnRfZXEhKDEsIDo6Y29yZTo6bWVtOjpzaXplX29mOjo8bXlfZ2FtZTo6ZXhhbXBsZTo6Q29sb3I+KCkpOwogICAgIH0KIAogICAgICNbdGVzdF0KICAgICBmbiB1bmlvbl9hbnlfaXNfMV9ieXRlKCkgewotICAgICAgICBhc3NlcnRfZXEhKDEsIDo6c3RkOjptZW06OnNpemVfb2Y6OjxteV9nYW1lOjpleGFtcGxlOjpBbnk+KCkpOworICAgICAgICBhc3NlcnRfZXEhKDEsIDo6Y29yZTo6bWVtOjpzaXplX29mOjo8bXlfZ2FtZTo6ZXhhbXBsZTo6QW55PigpKTsKICAgICB9CiAKICAgICAjW3Rlc3RdCiAgICAgZm4gdW5pb25fYW55X2lzX2FsaWduZWRfdG9fMSgpIHsKLSAgICAgICAgYXNzZXJ0X2VxISgxLCA6OnN0ZDo6bWVtOjphbGlnbl9vZjo6PG15X2dhbWU6OmV4YW1wbGU6OkFueT4oKSk7CisgICAgICAgIGFzc2VydF9lcSEoMSwgOjpjb3JlOjptZW06OmFsaWduX29mOjo8bXlfZ2FtZTo6ZXhhbXBsZTo6QW55PigpKTsKICAgICB9CiAgICAgI1t0ZXN0XQogICAgIGZuIHN0cnVjdF90ZXN0X2lzXzRfYnl0ZXMoKSB7Ci0gICAgICAgIGFzc2VydF9lcSEoNCwgOjpzdGQ6Om1lbTo6c2l6ZV9vZjo6PG15X2dhbWU6OmV4YW1wbGU6OlRlc3Q+KCkpOworICAgICAgICBhc3NlcnRfZXEhKDQsIDo6Y29yZTo6bWVtOjpzaXplX29mOjo8bXlfZ2FtZTo6ZXhhbXBsZTo6VGVzdD4oKSk7CiAgICAgfQogICAgICNbdGVzdF0KICAgICBmbiBzdHJ1Y3RfdmVjM19pc18zMl9ieXRlcygpIHsKLSAgICAgICAgYXNzZXJ0X2VxISgzMiwgOjpzdGQ6Om1lbTo6c2l6ZV9vZjo6PG15X2dhbWU6OmV4YW1wbGU6OlZlYzM+KCkpOworICAgICAgICBhc3NlcnRfZXEhKDMyLCA6OmNvcmU6Om1lbTo6c2l6ZV9vZjo6PG15X2dhbWU6OmV4YW1wbGU6OlZlYzM+KCkpOwogICAgIH0KIAogICAgICNbdGVzdF0KQEAgLTEwMzYsNyArMTA1MSw3IEBACiAKICAgICAjW3Rlc3RdCiAgICAgZm4gc3RydWN0X2FiaWxpdHlfaXNfOF9ieXRlcygpIHsKLSAgICAgICAgYXNzZXJ0X2VxISg4LCA6OnN0ZDo6bWVtOjpzaXplX29mOjo8bXlfZ2FtZTo6ZXhhbXBsZTo6QWJpbGl0eT4oKSk7CisgICAgICAgIGFzc2VydF9lcSEoOCwgOjpjb3JlOjptZW06OnNpemVfb2Y6OjxteV9nYW1lOjpleGFtcGxlOjpBYmlsaXR5PigpKTsKICAgICB9CiAKICAgICAjW3Rlc3RdCkBAIC0xMDYxLDcgKzEwNzYsNyBAQAogICAgICAgICBmb3IgYSBpbiBhYmlsaXRpZXMuaXRlcigpIHsKICAgICAgICAgICAgIGxldCBhX3B0ciA9IGEgYXMgKmNvbnN0IG15X2dhbWU6OmV4YW1wbGU6OkFiaWxpdHkgYXMgdXNpemU7CiAgICAgICAgICAgICBhc3NlcnQhKGFfcHRyID4gc3RhcnRfcHRyKTsKLSAgICAgICAgICAgIGxldCBhbG4gPSA6OnN0ZDo6bWVtOjphbGlnbl9vZjo6PG15X2dhbWU6OmV4YW1wbGU6OkFiaWxpdHk+KCk7CisgICAgICAgICAgICBsZXQgYWxuID0gOjpjb3JlOjptZW06OmFsaWduX29mOjo8bXlfZ2FtZTo6ZXhhbXBsZTo6QWJpbGl0eT4oKTsKICAgICAgICAgICAgIGFzc2VydF9lcSEoKGFfcHRyIC0gc3RhcnRfcHRyKSAlIGFsbiwgMCk7CiAgICAgICAgIH0KICAgICAgICAgZm9yIGEgaW4gYWJpbGl0aWVzLml0ZXIoKS5yZXYoKSB7CkBAIC0xMTY2LDYgKzExODEsOCBAQAogICAgICAgICBleHRlcm4gY3JhdGUgcXVpY2tjaGVjazsKICAgICAgICAgZXh0ZXJuIGNyYXRlIGZsYXRidWZmZXJzOwogCisgICAgICAgIHVzZSBhbGxvYzo6dmVjOjpWZWM7CisKICAgICAgICAgY29uc3QgTjogdTY0ID0gMjA7CiAKICAgICAgICAgZm4gcHJvcDxUPih4czogVmVjPFQ+KQpAQCAtMTE3Myw3ICsxMTkwLDcgQEAKICAgICAgICAgICAgIFQ6IGZvcjwnYT4gZmxhdGJ1ZmZlcnM6OkZvbGxvdzwnYSwgSW5uZXIgPSBUPgogICAgICAgICAgICAgICAgICsgZmxhdGJ1ZmZlcnM6OkVuZGlhblNjYWxhcgogICAgICAgICAgICAgICAgICsgZmxhdGJ1ZmZlcnM6OlB1c2gKLSAgICAgICAgICAgICAgICArIDo6c3RkOjpmbXQ6OkRlYnVnLAorICAgICAgICAgICAgICAgICsgOjpjb3JlOjpmbXQ6OkRlYnVnLAogICAgICAgICB7CiAgICAgICAgICAgICB1c2UgZmxhdGJ1ZmZlcnM6OkZvbGxvdzsKIApAQCAtMTI0Nyw3ICsxMjY0LDcgQEAKICAgICAgICAgLy8gY29tcGxpY2F0ZWQuCiAgICAgICAgIG1hY3JvX3J1bGVzISBpbXBsX3Byb3AgewogICAgICAgICAgICAgKCR0ZXN0X25hbWU6aWRlbnQsICRmbl9uYW1lOmlkZW50LCAkdHk6aWRlbnQpID0+ICgKLSAgICAgICAgICAgICAgICBmbiAkZm5fbmFtZSh4czogVmVjPCR0eT4pIHsKKyAgICAgICAgICAgICAgICBmbiAkZm5fbmFtZSh4czogYWxsb2M6OnZlYzo6VmVjPCR0eT4pIHsKICAgICAgICAgICAgICAgICAgICAgdXNlIGZsYXRidWZmZXJzOjpGb2xsb3c7CiAKICAgICAgICAgICAgICAgICAgICAgbGV0IG11dCBiID0gZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyOjpuZXcoKTsKQEAgLTEyNTgsNyArMTI3NSw3IEBACiAgICAgICAgICAgICAgICAgICAgIGFzc2VydF9lcSEoZ290LCAmeHNbLi5dKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgI1t0ZXN0XQotICAgICAgICAgICAgICAgIGZuICR0ZXN0X25hbWUoKSB7IHF1aWNrY2hlY2s6OlF1aWNrQ2hlY2s6Om5ldygpLm1heF90ZXN0cyhOKS5xdWlja2NoZWNrKCRmbl9uYW1lIGFzIGZuKFZlYzxfPikpOyB9CisgICAgICAgICAgICAgICAgZm4gJHRlc3RfbmFtZSgpIHsgcXVpY2tjaGVjazo6UXVpY2tDaGVjazo6bmV3KCkubWF4X3Rlc3RzKE4pLnF1aWNrY2hlY2soJGZuX25hbWUgYXMgZm4oYWxsb2M6OnZlYzo6VmVjPF8+KSk7IH0KICAgICAgICAgICAgICkKICAgICAgICAgfQogCkBAIC0xMjg5LDYgKzEzMDYsOSBAQAogICAgICAgICBleHRlcm4gY3JhdGUgcXVpY2tjaGVjazsKICAgICAgICAgZXh0ZXJuIGNyYXRlIGZsYXRidWZmZXJzOwogCisgICAgICAgIHVzZSBhbGxvYzo6c3RyaW5nOjpTdHJpbmc7CisgICAgICAgIHVzZSBhbGxvYzo6dmVjOjpWZWM7CisKICAgICAgICAgZm4gcHJvcCh4czogVmVjPFN0cmluZz4pIHsKICAgICAgICAgICAgIHVzZSBmbGF0YnVmZmVyczo6Rm9sbG93OwogCkBAIC0xMzI3LDYgKzEzNDcsOSBAQAogICAgICAgICBleHRlcm4gY3JhdGUgcXVpY2tjaGVjazsKICAgICAgICAgZXh0ZXJuIGNyYXRlIGZsYXRidWZmZXJzOwogCisgICAgICAgIHVzZSBhbGxvYzo6c3RyaW5nOjpTdHJpbmc7CisgICAgICAgIHVzZSBhbGxvYzo6dmVjOjpWZWM7CisKICAgICAgICAgZm4gcHJvcChpbnB1dDogVmVjPFN0cmluZz4pIHsKICAgICAgICAgICAgIGxldCB4czogVmVjPCZzdHI+ID0gaW5wdXQuaXRlcigpLm1hcCh8czogJlN0cmluZ3wgJnNbLi5dKS5jb2xsZWN0KCk7CiAKQEAgLTEzNTgsNiArMTM4MSw4IEBACiAgICAgICAgIGV4dGVybiBjcmF0ZSBxdWlja2NoZWNrOwogICAgICAgICBleHRlcm4gY3JhdGUgZmxhdGJ1ZmZlcnM7CiAKKyAgICAgICAgdXNlIGFsbG9jOjp2ZWM6OlZlYzsKKwogICAgICAgICAjW2NmZyhub3QobWlyaSkpXSAgLy8gc2xvdy4KICAgICAgICAgI1t0ZXN0XQogICAgICAgICBmbiBmdXp6X21hbnVhbF9idWlsZCgpIHsKQEAgLTE0MDksOCArMTQzNCwxMSBAQAogICAgIH0KIH0KIAorI1tjZmcobm90KGZlYXR1cmUgPSAibm9fc3RkIikpXQogI1tjZmcodGVzdCldCiBtb2Qgcm91bmR0cmlwX3RhYmxlIHsKKyAgICB1c2UgYWxsb2M6OnN0cmluZzo6U3RyaW5nOworICAgIHVzZSBhbGxvYzo6dmVjOjpWZWM7CiAgICAgdXNlIHN0ZDo6Y29sbGVjdGlvbnM6Okhhc2hNYXA7CiAKICAgICBleHRlcm4gY3JhdGUgZmxhdGJ1ZmZlcnM7CkBAIC0xNDI5LDkgKzE0NTcsOSBAQAogICAgICAgICBsZXQgdWNoYXJfdmFsOiB1OCA9IDB4RkY7CiAgICAgICAgIGxldCBzaG9ydF92YWw6IGkxNiA9IC0zMjIyMjsgIC8vIDB4ODIyMjsKICAgICAgICAgbGV0IHVzaG9ydF92YWw6IHUxNiA9IDB4RkVFRTsKLSAgICAgICAgbGV0IGludF92YWw6IGkzMiA9IHVuc2FmZSB7IDo6c3RkOjptZW06OnRyYW5zbXV0ZSgweDgzMzMzMzMzdTMyKSB9OworICAgICAgICBsZXQgaW50X3ZhbDogaTMyID0gdW5zYWZlIHsgOjpjb3JlOjptZW06OnRyYW5zbXV0ZSgweDgzMzMzMzMzdTMyKSB9OwogICAgICAgICBsZXQgdWludF92YWw6IHUzMiA9IDB4RkREREREREQ7Ci0gICAgICAgIGxldCBsb25nX3ZhbDogaTY0ID0gdW5zYWZlIHsgOjpzdGQ6Om1lbTo6dHJhbnNtdXRlKDB4ODQ0NDQ0NDQ0NDQ0NDQ0NHU2NCkgfTsgLy8gVE9ETzogYnl0ZSBsaXRlcmFsPworICAgICAgICBsZXQgbG9uZ192YWw6IGk2NCA9IHVuc2FmZSB7IDo6Y29yZTo6bWVtOjp0cmFuc211dGUoMHg4NDQ0NDQ0NDQ0NDQ0NDQ0dTY0KSB9OyAvLyBUT0RPOiBieXRlIGxpdGVyYWw/CiAgICAgICAgIGxldCB1bG9uZ192YWw6IHU2NCA9IDB4RkNDQ0NDQ0NDQ0NDQ0NDQ3U2NDsKICAgICAgICAgbGV0IGZsb2F0X3ZhbDogZjMyID0gMy4xNDE1OTsKICAgICAgICAgbGV0IGRvdWJsZV92YWw6IGY2NCA9IDMuMTQxNTkyNjUzNTk7CkBAIC0xNTk4LDYgKzE2MjYsOSBAQAogCiAgICAgI1tjZmcobm90KG1pcmkpKV0gIC8vIHNsb3cuCiAgICAgbW9kIHRhYmxlX29mX3ZlY3RvcnNfb2Zfc2NhbGFycyB7CisKKyAgICAgICAgdXNlIGFsbG9jOjp2ZWM6OlZlYzsKKwogICAgICAgICBleHRlcm4gY3JhdGUgZmxhdGJ1ZmZlcnM7CiAgICAgICAgICNbY2ZnKG5vdChtaXJpKSldICAvLyBzbG93LgogICAgICAgICBleHRlcm4gY3JhdGUgcXVpY2tjaGVjazsKQEAgLTE2MDksNyArMTY0MCw3IEBACiAgICAgICAgICAgICBUOiBmb3I8J2E+IGZsYXRidWZmZXJzOjpGb2xsb3c8J2EsIElubmVyID0gVD4KICAgICAgICAgICAgICAgICArIGZsYXRidWZmZXJzOjpFbmRpYW5TY2FsYXIKICAgICAgICAgICAgICAgICArIGZsYXRidWZmZXJzOjpQdXNoCi0gICAgICAgICAgICAgICAgKyA6OnN0ZDo6Zm10OjpEZWJ1ZywKKyAgICAgICAgICAgICAgICArIDo6Y29yZTo6Zm10OjpEZWJ1ZywKICAgICAgICAgewogICAgICAgICAgICAgdXNlIGZsYXRidWZmZXJzOjpmaWVsZF9pbmRleF90b19maWVsZF9vZmZzZXQgYXMgZmkyZm87CiAgICAgICAgICAgICB1c2UgZmxhdGJ1ZmZlcnM6OkZvbGxvdzsKQEAgLTE2ODksOCArMTcyMCw4IEBACiAKICAgICBjb25zdCBOOiB1NjQgPSAxMDAwOwogCi0gICAgZm4gcHJvcDxUOiBQYXJ0aWFsRXEgKyA6OnN0ZDo6Zm10OjpEZWJ1ZyArIENvcHkgKyBmbGF0YnVmZmVyczo6RW5kaWFuU2NhbGFyPih4OiBUKSB7Ci0gICAgICAgIGxldCBtdXQgYnVmID0gdmVjIVswdTg7IDo6c3RkOjptZW06OnNpemVfb2Y6OjxUPigpXTsKKyAgICBmbiBwcm9wPFQ6IFBhcnRpYWxFcSArIDo6Y29yZTo6Zm10OjpEZWJ1ZyArIENvcHkgKyBmbGF0YnVmZmVyczo6RW5kaWFuU2NhbGFyPih4OiBUKSB7CisgICAgICAgIGxldCBtdXQgYnVmID0gdmVjIVswdTg7IDo6Y29yZTo6bWVtOjpzaXplX29mOjo8VD4oKV07CiAgICAgICAgIGxldCB5ID0gdW5zYWZlIHsKICAgICAgICAgICAgIGZsYXRidWZmZXJzOjplbXBsYWNlX3NjYWxhcigmbXV0IGJ1ZlsuLl0sIHgpOwogICAgICAgICAgICAgZmxhdGJ1ZmZlcnM6OnJlYWRfc2NhbGFyKCZidWZbLi5dKQpAQCAtMTc0Miw3ICsxNzczLDcgQEAKICAgICBtYWNyb19ydWxlcyEgaW1wbF9wcm9wIHsKICAgICAgICAgKCRmbl9uYW1lOmlkZW50LCAkdHk6aWRlbnQpID0+ICgKICAgICAgICAgICAgIGZuICRmbl9uYW1lKHg6ICR0eSkgewotICAgICAgICAgICAgICAgIGxldCBtdXQgYnVmID0gdmVjIVswdTg7IDo6c3RkOjptZW06OnNpemVfb2Y6OjwkdHk+KCldOworICAgICAgICAgICAgICAgIGxldCBtdXQgYnVmID0gdmVjIVswdTg7IDo6Y29yZTo6bWVtOjpzaXplX29mOjo8JHR5PigpXTsKICAgICAgICAgICAgICAgICB4LnB1c2goJm11dCBidWZbLi5dLCAmW11bLi5dKTsKICAgICAgICAgICAgICAgICBsZXQgZnM6IGZsYXRidWZmZXJzOjpGb2xsb3dTdGFydDwkdHk+ID0gZmxhdGJ1ZmZlcnM6OkZvbGxvd1N0YXJ0OjpuZXcoKTsKICAgICAgICAgICAgICAgICBhc3NlcnRfZXEhKGZzLnNlbGZfZm9sbG93KCZidWZbLi5dLCAwKSwgeCk7CkBAIC0xODk2LDEwICsxOTI3LDEzIEBACiAgICAgfQogfQogCisjW2NmZyhub3QoZmVhdHVyZSA9ICJub19zdGQiKSldCiAjW2NmZyh0ZXN0KV0KIG1vZCByZWFkX2V4YW1wbGVzX2Zyb21fb3RoZXJfbGFuZ3VhZ2VfcG9ydHMgewogICAgIGV4dGVybiBjcmF0ZSBmbGF0YnVmZmVyczsKIAorICAgIHVzZSBzdGQ6OnByaW50bG47CisKICAgICB1c2Ugc3VwZXI6OmxvYWRfZmlsZTsKICAgICB1c2Ugc3VwZXI6OnNlcmlhbGl6ZWRfZXhhbXBsZV9pc19hY2Nlc3NpYmxlX2FuZF9jb3JyZWN0OwogCkBAIC0xOTc0LDkgKzIwMDgsOSBAQAogICAgIGZuIHN0cnVjdF9rZXlfY29tcGFyZV93aXRoX3ZhbHVlKCkgewogICAgICAgICBsZXQgYSA9IG15X2dhbWU6OmV4YW1wbGU6OkFiaWxpdHk6Om5ldygxLCAyKTsKIAotICAgICAgICBhc3NlcnRfZXEhKGEua2V5X2NvbXBhcmVfd2l0aF92YWx1ZSgwKSwgOjpzdGQ6OmNtcDo6T3JkZXJpbmc6OkdyZWF0ZXIpOwotICAgICAgICBhc3NlcnRfZXEhKGEua2V5X2NvbXBhcmVfd2l0aF92YWx1ZSgxKSwgOjpzdGQ6OmNtcDo6T3JkZXJpbmc6OkVxdWFsKTsKLSAgICAgICAgYXNzZXJ0X2VxIShhLmtleV9jb21wYXJlX3dpdGhfdmFsdWUoMiksIDo6c3RkOjpjbXA6Ok9yZGVyaW5nOjpMZXNzKTsKKyAgICAgICAgYXNzZXJ0X2VxIShhLmtleV9jb21wYXJlX3dpdGhfdmFsdWUoMCksIDo6Y29yZTo6Y21wOjpPcmRlcmluZzo6R3JlYXRlcik7CisgICAgICAgIGFzc2VydF9lcSEoYS5rZXlfY29tcGFyZV93aXRoX3ZhbHVlKDEpLCA6OmNvcmU6OmNtcDo6T3JkZXJpbmc6OkVxdWFsKTsKKyAgICAgICAgYXNzZXJ0X2VxIShhLmtleV9jb21wYXJlX3dpdGhfdmFsdWUoMiksIDo6Y29yZTo6Y21wOjpPcmRlcmluZzo6TGVzcyk7CiAgICAgfQogCiAgICAgI1t0ZXN0XQpAQCAtMjAxMCw5ICsyMDQ0LDkgQEAKICAgICAgICAgLy8gcHJlY29uZGl0aW9ucwogICAgICAgICBhc3NlcnRfZXEhKGEubmFtZSgpLCAiTXlNb25zdGVyIik7CiAKLSAgICAgICAgYXNzZXJ0X2VxIShhLmtleV9jb21wYXJlX3dpdGhfdmFsdWUoIkFBQSIpLCA6OnN0ZDo6Y21wOjpPcmRlcmluZzo6R3JlYXRlcik7Ci0gICAgICAgIGFzc2VydF9lcSEoYS5rZXlfY29tcGFyZV93aXRoX3ZhbHVlKCJNeU1vbnN0ZXIiKSwgOjpzdGQ6OmNtcDo6T3JkZXJpbmc6OkVxdWFsKTsKLSAgICAgICAgYXNzZXJ0X2VxIShhLmtleV9jb21wYXJlX3dpdGhfdmFsdWUoIlpaWiIpLCA6OnN0ZDo6Y21wOjpPcmRlcmluZzo6TGVzcyk7CisgICAgICAgIGFzc2VydF9lcSEoYS5rZXlfY29tcGFyZV93aXRoX3ZhbHVlKCJBQUEiKSwgOjpjb3JlOjpjbXA6Ok9yZGVyaW5nOjpHcmVhdGVyKTsKKyAgICAgICAgYXNzZXJ0X2VxIShhLmtleV9jb21wYXJlX3dpdGhfdmFsdWUoIk15TW9uc3RlciIpLCA6OmNvcmU6OmNtcDo6T3JkZXJpbmc6OkVxdWFsKTsKKyAgICAgICAgYXNzZXJ0X2VxIShhLmtleV9jb21wYXJlX3dpdGhfdmFsdWUoIlpaWiIpLCA6OmNvcmU6OmNtcDo6T3JkZXJpbmc6Okxlc3MpOwogICAgIH0KIAogICAgICNbdGVzdF0KQEAgLTIxMTYsNiArMjE1MCw4IEBACiAgICAgdXNlIGZsYXRidWZmZXJzOjpGb2xsb3c7CiAgICAgdXNlIGZsYXRidWZmZXJzOjpmaWVsZF9pbmRleF90b19maWVsZF9vZmZzZXQgYXMgZmkyZm87CiAKKyAgICB1c2UgYWxsb2M6OnZlYzo6VmVjOworCiAgICAgLy8gRGVmaW5lIGEgdGVzdCBzdHJ1Y3QgdG8gdXNlIGluIGEgZmV3IHRlc3RzLiBUaGlzIHJlcGxpY2F0ZXMgdGhlIHdvcmsgdGhhdCB0aGUgY29kZSBnZW5lcmF0b3IKICAgICAvLyB3b3VsZCBub3JtYWxseSBkbyB3aGVuIGRlZmluaW5nIGEgRmxhdEJ1ZmZlciBzdHJ1Y3QuIEZvciByZWZlcmVuY2UsIGNvbXBhcmUgdGhlIGZvbGxvd2luZwogICAgIC8vIGBGb29TdHJ1Y3RgIGNvZGUgd2l0aCB0aGUgY29kZSBnZW5lcmF0ZWQgZm9yIHRoZSBgVmVjM2Agc3RydWN0IGluCkBAIC0yODg0LDEyICsyOTIwLDEyIEBACiAgICAgICAgICAgICBjOiBpOCwKICAgICAgICAgICAgIF9wYWQyOiBbdTg7IDRdLAogICAgICAgICB9Ci0gICAgICAgIGFzc2VydF9lcSEoOjpzdGQ6Om1lbTo6c2l6ZV9vZjo6PGZvbz4oKSwgMTYpOworICAgICAgICBhc3NlcnRfZXEhKDo6Y29yZTo6bWVtOjpzaXplX29mOjo8Zm9vPigpLCAxNik7CiAgICAgICAgIGltcGw8J2I+IGZsYXRidWZmZXJzOjpQdXNoIGZvciAmJ2IgZm9vIHsKICAgICAgICAgICAgIHR5cGUgT3V0cHV0ID0gZm9vOwogICAgICAgICAgICAgZm4gcHVzaDwnYT4oJidhIHNlbGYsIGRzdDogJidhIG11dCBbdThdLCBfcmVzdDogJidhIFt1OF0pIHsKICAgICAgICAgICAgICAgICBsZXQgc3JjID0gdW5zYWZlIHsKLSAgICAgICAgICAgICAgICAgICAgOjpzdGQ6OnNsaWNlOjpmcm9tX3Jhd19wYXJ0cygqc2VsZiBhcyAqY29uc3QgZm9vIGFzICpjb25zdCB1OCwgOjpzdGQ6Om1lbTo6c2l6ZV9vZjo6PGZvbz4oKSkKKyAgICAgICAgICAgICAgICAgICAgOjpjb3JlOjpzbGljZTo6ZnJvbV9yYXdfcGFydHMoKnNlbGYgYXMgKmNvbnN0IGZvbyBhcyAqY29uc3QgdTgsIDo6Y29yZTo6bWVtOjpzaXplX29mOjo8Zm9vPigpKQogICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgZHN0LmNvcHlfZnJvbV9zbGljZShzcmMpOwogICAgICAgICAgICAgfQpAQCAtMzE3MCw2ICszMjA2LDkgQEAKIAogI1tjZmcodGVzdCldCiBtb2QgY29weV9jbG9uZV90cmFpdHMgeworCisgICAgdXNlIGFsbG9jOjp2ZWM6OlZlYzsKKwogICAgICNbdGVzdF0KICAgICBmbiBmb2xsb3dfdHlwZXNfaW1wbGVtZW50X2NvcHlfYW5kX2Nsb25lKCkgewogICAgICAgICBzdGF0aWNfYXNzZXJ0aW9uczo6YXNzZXJ0X2ltcGxfYWxsIShmbGF0YnVmZmVyczo6V0lQT2Zmc2V0PHUzMj46IENvcHksIENsb25lKTsKQEAgLTMxODcsMTcgKzMyMjYsMTggQEAKIG1vZCBmdWxseV9xdWFsaWZpZWRfbmFtZSB7CiAgICAgI1t0ZXN0XQogICAgIGZuIGZ1bGx5X3F1YWxpZmllZF9uYW1lX2dlbmVyYXRlZCgpIHsKLSAgICAgICAgYXNzZXJ0IShjaGVja19lcSEoOjpteV9nYW1lOjpleGFtcGxlOjpNb25zdGVyOjpnZXRfZnVsbHlfcXVhbGlmaWVkX25hbWUoKSwgIk15R2FtZS5FeGFtcGxlLk1vbnN0ZXIiKS5pc19vaygpKTsKLSAgICAgICAgYXNzZXJ0IShjaGVja19lcSEoOjpteV9nYW1lOjpleGFtcGxlXzI6Ok1vbnN0ZXI6OmdldF9mdWxseV9xdWFsaWZpZWRfbmFtZSgpLCAiTXlHYW1lLkV4YW1wbGUyLk1vbnN0ZXIiKS5pc19vaygpKTsKKyAgICAgICAgYXNzZXJ0IShjaGVja19lcSEoc3VwZXI6Om15X2dhbWU6OmV4YW1wbGU6Ok1vbnN0ZXI6OmdldF9mdWxseV9xdWFsaWZpZWRfbmFtZSgpLCAiTXlHYW1lLkV4YW1wbGUuTW9uc3RlciIpLmlzX29rKCkpOworICAgICAgICBhc3NlcnQhKGNoZWNrX2VxIShzdXBlcjo6bXlfZ2FtZTo6ZXhhbXBsZV8yOjpNb25zdGVyOjpnZXRfZnVsbHlfcXVhbGlmaWVkX25hbWUoKSwgIk15R2FtZS5FeGFtcGxlMi5Nb25zdGVyIikuaXNfb2soKSk7CiAKLSAgICAgICAgYXNzZXJ0IShjaGVja19lcSEoOjpteV9nYW1lOjpleGFtcGxlOjpWZWMzOjpnZXRfZnVsbHlfcXVhbGlmaWVkX25hbWUoKSwgIk15R2FtZS5FeGFtcGxlLlZlYzMiKS5pc19vaygpKTsKLSAgICAgICAgYXNzZXJ0IShjaGVja19lcSEoOjpteV9nYW1lOjpleGFtcGxlOjpBYmlsaXR5OjpnZXRfZnVsbHlfcXVhbGlmaWVkX25hbWUoKSwgIk15R2FtZS5FeGFtcGxlLkFiaWxpdHkiKS5pc19vaygpKTsKKyAgICAgICAgYXNzZXJ0IShjaGVja19lcSEoc3VwZXI6Om15X2dhbWU6OmV4YW1wbGU6OlZlYzM6OmdldF9mdWxseV9xdWFsaWZpZWRfbmFtZSgpLCAiTXlHYW1lLkV4YW1wbGUuVmVjMyIpLmlzX29rKCkpOworICAgICAgICBhc3NlcnQhKGNoZWNrX2VxIShzdXBlcjo6bXlfZ2FtZTo6ZXhhbXBsZTo6QWJpbGl0eTo6Z2V0X2Z1bGx5X3F1YWxpZmllZF9uYW1lKCksICJNeUdhbWUuRXhhbXBsZS5BYmlsaXR5IikuaXNfb2soKSk7CiAgICAgfQogfQogCiAvLyB0aGlzIGlzIG5vdCB0ZWNobmljYWxseSBhIHRlc3QsIGJ1dCB3ZSB3YW50IHRvIGFsd2F5cyBrZWVwIHRoaXMgZ2VuZXJhdGVkCiAvLyBmaWxlIHVwLXRvLWRhdGUsIGFuZCB0aGUgc2ltcGxlc3Qgd2F5IHRvIGRvIHRoYXQgaXMgdG8gbWFrZSBzdXJlIHRoYXQgd2hlbgogLy8gdGVzdHMgYXJlIHJ1biwgdGhlIGZpbGUgaXMgZ2VuZXJhdGVkLgorI1tjZmcobm90KGZlYXR1cmUgPSAibm9fc3RkIikpXQogI1t0ZXN0XQogZm4gd3JpdGVfZXhhbXBsZV93aXJlX2RhdGFfdG9fZmlsZSgpIHsKICAgICBsZXQgYiA9ICZtdXQgZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyOjpuZXcoKTsKQEAgLTMyMDgsNiArMzI0OCw3IEBACiAgICAgZi53cml0ZV9hbGwoYi5maW5pc2hlZF9kYXRhKCkpLnVud3JhcCgpOwogfQogCisjW2NmZyhub3QoZmVhdHVyZSA9ICJub19zdGQiKSldCiBmbiBsb2FkX2ZpbGUoZmlsZW5hbWU6ICZzdHIpIC0+IFJlc3VsdDxWZWM8dTg+LCBzdGQ6OmlvOjpFcnJvcj4gewogICAgIHVzZSBzdGQ6OmlvOjpSZWFkOwogICAgIGxldCBtdXQgZiA9IHN0ZDo6ZnM6OkZpbGU6Om9wZW4oZmlsZW5hbWUpPzsKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL3J1c3RfdXNhZ2VfdGVzdC90ZXN0cy9tb3JlX2RlZmF1bHRzX3Rlc3QucnMgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9ydXN0X3VzYWdlX3Rlc3QvdGVzdHMvbW9yZV9kZWZhdWx0c190ZXN0LnJzCmluZGV4IGFmNjY0ZjIuLjRkNjJhNGEgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL3J1c3RfdXNhZ2VfdGVzdC90ZXN0cy9tb3JlX2RlZmF1bHRzX3Rlc3QucnMKKysrIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvcnVzdF91c2FnZV90ZXN0L3Rlc3RzL21vcmVfZGVmYXVsdHNfdGVzdC5ycwpAQCAtMSwzICsxLDggQEAKK2V4dGVybiBjcmF0ZSBhbGxvYzsKKwordXNlIGFsbG9jOjpzdHJpbmc6OlRvU3RyaW5nOwordXNlIGFsbG9jOjp2ZWM6OlZlYzsKKwogI1thbGxvdyhkZWFkX2NvZGUsIHVudXNlZF9pbXBvcnRzKV0KICNbcGF0aCA9ICIuLi8uLi9tb3JlX2RlZmF1bHRzL21vZC5ycyJdCiBtb2QgbW9yZV9kZWZhdWx0c19nZW5lcmF0ZWQ7CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9GbGF0QnVmZmVycy5CZW5jaG1hcmtzLnN3aWZ0L1BhY2thZ2Uuc3dpZnQgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9zd2lmdC9XYXNtLnRlc3RzL1BhY2thZ2Uuc3dpZnQKc2ltaWxhcml0eSBpbmRleCA3OSUKcmVuYW1lIGZyb20gdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvRmxhdEJ1ZmZlcnMuQmVuY2htYXJrcy5zd2lmdC9QYWNrYWdlLnN3aWZ0CnJlbmFtZSB0byB0aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9zd2lmdC9XYXNtLnRlc3RzL1BhY2thZ2Uuc3dpZnQKaW5kZXggMjAyNjI0Ny4uNmQzYjE2NCAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvRmxhdEJ1ZmZlcnMuQmVuY2htYXJrcy5zd2lmdC9QYWNrYWdlLnN3aWZ0CisrKyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL3N3aWZ0L1dhc20udGVzdHMvUGFja2FnZS5zd2lmdApAQCAtMTgsMTUgKzE4LDE3IEBACiBpbXBvcnQgUGFja2FnZURlc2NyaXB0aW9uCiAKIGxldCBwYWNrYWdlID0gUGFja2FnZSgKLSAgbmFtZTogIkZsYXRCdWZmZXJzLkJlbmNobWFya3Muc3dpZnQiLAorICBuYW1lOiAiRmxhdEJ1ZmZlcnMuVGVzdC5Td2lmdC5XYXNtIiwKICAgcGxhdGZvcm1zOiBbCiAgICAgLm1hY09TKC52MTBfMTQpLAogICBdLAogICBkZXBlbmRlbmNpZXM6IFsKLSAgICAucGFja2FnZShwYXRoOiAiLi4vLi4vc3dpZnQiKSwKKyAgICAucGFja2FnZShwYXRoOiAiLi4vLi4vLi4vc3dpZnQiKSwKICAgXSwKICAgdGFyZ2V0czogWwogICAgIC50YXJnZXQoCi0gICAgICBuYW1lOiAiRmxhdEJ1ZmZlcnMuQmVuY2htYXJrcy5zd2lmdCIsCi0gICAgICBkZXBlbmRlbmNpZXM6IFsiRmxhdEJ1ZmZlcnMiXSksCisgICAgICBuYW1lOiAiV2FzbSIpLAorICAgIC50ZXN0VGFyZ2V0KAorICAgICAgbmFtZTogIkZsYXRCdWZmZXJzLlRlc3QuU3dpZnQuV2FzbVRlc3RzIiwKKyAgICAgIGRlcGVuZGVuY2llczogWyJGbGF0QnVmZmVycyJdKQogICBdKQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvc3dpZnQvV2FzbS50ZXN0cy9Tb3VyY2VzL1dhc20vV2FzbS5zd2lmdCBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL3N3aWZ0L1dhc20udGVzdHMvU291cmNlcy9XYXNtL1dhc20uc3dpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzE0YWJlYgotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL3N3aWZ0L1dhc20udGVzdHMvU291cmNlcy9XYXNtL1dhc20uc3dpZnQKQEAgLTAsMCArMSBAQAorcHVibGljIHN0cnVjdCBXYXNtIHt9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvc3dpZnQvV2FzbS50ZXN0cy9UZXN0cy9GbGF0QnVmZmVycy5UZXN0LlN3aWZ0Lldhc21UZXN0cy9GbGF0QnVmZmVyc01vbnN0ZXJXcml0ZXJUZXN0cy5zd2lmdCBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL3N3aWZ0L1dhc20udGVzdHMvVGVzdHMvRmxhdEJ1ZmZlcnMuVGVzdC5Td2lmdC5XYXNtVGVzdHMvRmxhdEJ1ZmZlcnNNb25zdGVyV3JpdGVyVGVzdHMuc3dpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjE0NzkxZQotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL3N3aWZ0L1dhc20udGVzdHMvVGVzdHMvRmxhdEJ1ZmZlcnMuVGVzdC5Td2lmdC5XYXNtVGVzdHMvRmxhdEJ1ZmZlcnNNb25zdGVyV3JpdGVyVGVzdHMuc3dpZnQKQEAgLTAsMCArMSwzNTUgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAyMSBHb29nbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK2ltcG9ydCBGb3VuZGF0aW9uCitpbXBvcnQgWENUZXN0CitAdGVzdGFibGUgaW1wb3J0IEZsYXRCdWZmZXJzCisKK3R5cGVhbGlhcyBUZXN0ID0gTXlHYW1lX0V4YW1wbGVfVGVzdAordHlwZWFsaWFzIE1vbnN0ZXIgPSBNeUdhbWVfRXhhbXBsZV9Nb25zdGVyCit0eXBlYWxpYXMgVmVjMyA9IE15R2FtZV9FeGFtcGxlX1ZlYzMKK3R5cGVhbGlhcyBTdGF0ID0gTXlHYW1lX0V4YW1wbGVfU3RhdAorCitjbGFzcyBGbGF0QnVmZmVyc01vbnN0ZXJXcml0ZXJUZXN0czogWENUZXN0Q2FzZSB7CisKKyAgZnVuYyB0ZXN0RGF0YSgpIHsKKyAgICAvLyBzd2lmdGZvcm1hdDpkaXNhYmxlIGFsbAorICAgIGxldCBkYXRhOiBbVUludDhdID0gWzQ4LCAwLCAwLCAwLCA3NywgNzksIDc4LCA4MywgMCwgMCwgMCwgMCwgMzYsIDAsIDcyLCAwLCA0MCwgMCwgMCwgMCwgMzgsIDAsIDMyLCAwLCAwLCAwLCAyOCwgMCwgMCwgMCwgMjcsIDAsIDIwLCAwLCAxNiwgMCwgMTIsIDAsIDQsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDExLCAwLCAzNiwgMCwgMCwgMCwgMTY0LCAwLCAwLCAwLCAwLCAwLCAwLCAxLCA2MCwgMCwgMCwgMCwgNjgsIDAsIDAsIDAsIDc2LCAwLCAwLCAwLCAwLCAwLCAwLCAxLCA4OCwgMCwgMCwgMCwgMTIwLCAwLCAwLCAwLCAwLCAwLCA4MCwgMCwgMCwgMCwgMTI4LCA2MywgMCwgMCwgMCwgNjQsIDAsIDAsIDY0LCA2NCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgOCwgNjQsIDIsIDAsIDUsIDAsIDYsIDAsIDAsIDAsIDIsIDAsIDAsIDAsIDY0LCAwLCAwLCAwLCA0OCwgMCwgMCwgMCwgMiwgMCwgMCwgMCwgMzAsIDAsIDQwLCAwLCAxMCwgMCwgMjAsIDAsIDE1MiwgMjU1LCAyNTUsIDI1NSwgNCwgMCwgMCwgMCwgNCwgMCwgMCwgMCwgNzAsIDExNCwgMTAxLCAxMDAsIDAsIDAsIDAsIDAsIDUsIDAsIDAsIDAsIDAsIDEsIDIsIDMsIDQsIDAsIDAsIDAsIDUsIDAsIDAsIDAsIDExNiwgMTAxLCAxMTUsIDExNiwgNTAsIDAsIDAsIDAsIDUsIDAsIDAsIDAsIDExNiwgMTAxLCAxMTUsIDExNiwgNDksIDAsIDAsIDAsIDksIDAsIDAsIDAsIDc3LCAxMjEsIDc3LCAxMTEsIDExMCwgMTE1LCAxMTYsIDEwMSwgMTE0LCAwLCAwLCAwLCAzLCAwLCAwLCAwLCAyMCwgMCwgMCwgMCwgMzYsIDAsIDAsIDAsIDQsIDAsIDAsIDAsIDI0MCwgMjU1LCAyNTUsIDI1NSwgMzIsIDAsIDAsIDAsIDI0OCwgMjU1LCAyNTUsIDI1NSwgMzYsIDAsIDAsIDAsIDEyLCAwLCA4LCAwLCAwLCAwLCAwLCAwLCAwLCAwLCA0LCAwLCAxMiwgMCwgMCwgMCwgMjgsIDAsIDAsIDAsIDUsIDAsIDAsIDAsIDg3LCAxMDUsIDEwOCwgMTA5LCA5NywgMCwgMCwgMCwgNiwgMCwgMCwgMCwgNjYsIDk3LCAxMTQsIDExMCwgMTAxLCAxMjEsIDAsIDAsIDUsIDAsIDAsIDAsIDcwLCAxMTQsIDExMSwgMTAwLCAxMTEsIDAsIDAsIDBdCisgICAgLy8gc3dpZnRmb3JtYXQ6ZW5hYmxlIGFsbAorICAgIGxldCBfZGF0YSA9IEJ5dGVCdWZmZXIoYnl0ZXM6IGRhdGEpCisgICAgcmVhZFZlcmlmaWVkTW9uc3RlcihmYjogX2RhdGEpCisgIH0KKworICBmdW5jIHRlc3RDcmVhdGVNb25zdGVyKCkgeworICAgIGxldCBieXRlcyA9IGNyZWF0ZU1vbnN0ZXIod2l0aFByZWZpeDogZmFsc2UpCisgICAgLy8gc3dpZnRmb3JtYXQ6ZGlzYWJsZSBhbGwKKyAgICBYQ1RBc3NlcnRFcXVhbChieXRlcy5zaXplZEJ5dGVBcnJheSwgWzQ4LCAwLCAwLCAwLCA3NywgNzksIDc4LCA4MywgMCwgMCwgMCwgMCwgMzYsIDAsIDcyLCAwLCA0MCwgMCwgMCwgMCwgMzgsIDAsIDMyLCAwLCAwLCAwLCAyOCwgMCwgMCwgMCwgMjcsIDAsIDIwLCAwLCAxNiwgMCwgMTIsIDAsIDQsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDExLCAwLCAzNiwgMCwgMCwgMCwgMTY0LCAwLCAwLCAwLCAwLCAwLCAwLCAxLCA2MCwgMCwgMCwgMCwgNjgsIDAsIDAsIDAsIDc2LCAwLCAwLCAwLCAwLCAwLCAwLCAxLCA4OCwgMCwgMCwgMCwgMTIwLCAwLCAwLCAwLCAwLCAwLCA4MCwgMCwgMCwgMCwgMTI4LCA2MywgMCwgMCwgMCwgNjQsIDAsIDAsIDY0LCA2NCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgOCwgNjQsIDIsIDAsIDUsIDAsIDYsIDAsIDAsIDAsIDIsIDAsIDAsIDAsIDY0LCAwLCAwLCAwLCA0OCwgMCwgMCwgMCwgMiwgMCwgMCwgMCwgMzAsIDAsIDQwLCAwLCAxMCwgMCwgMjAsIDAsIDE1MiwgMjU1LCAyNTUsIDI1NSwgNCwgMCwgMCwgMCwgNCwgMCwgMCwgMCwgNzAsIDExNCwgMTAxLCAxMDAsIDAsIDAsIDAsIDAsIDUsIDAsIDAsIDAsIDAsIDEsIDIsIDMsIDQsIDAsIDAsIDAsIDUsIDAsIDAsIDAsIDExNiwgMTAxLCAxMTUsIDExNiwgNTAsIDAsIDAsIDAsIDUsIDAsIDAsIDAsIDExNiwgMTAxLCAxMTUsIDExNiwgNDksIDAsIDAsIDAsIDksIDAsIDAsIDAsIDc3LCAxMjEsIDc3LCAxMTEsIDExMCwgMTE1LCAxMTYsIDEwMSwgMTE0LCAwLCAwLCAwLCAzLCAwLCAwLCAwLCAyMCwgMCwgMCwgMCwgMzYsIDAsIDAsIDAsIDQsIDAsIDAsIDAsIDI0MCwgMjU1LCAyNTUsIDI1NSwgMzIsIDAsIDAsIDAsIDI0OCwgMjU1LCAyNTUsIDI1NSwgMzYsIDAsIDAsIDAsIDEyLCAwLCA4LCAwLCAwLCAwLCAwLCAwLCAwLCAwLCA0LCAwLCAxMiwgMCwgMCwgMCwgMjgsIDAsIDAsIDAsIDUsIDAsIDAsIDAsIDg3LCAxMDUsIDEwOCwgMTA5LCA5NywgMCwgMCwgMCwgNiwgMCwgMCwgMCwgNjYsIDk3LCAxMTQsIDExMCwgMTAxLCAxMjEsIDAsIDAsIDUsIDAsIDAsIDAsIDcwLCAxMTQsIDExMSwgMTAwLCAxMTEsIDAsIDAsIDBdKQorICAgIC8vIHN3aWZ0Zm9ybWF0OmVuYWJsZSBhbGwKKyAgICBsZXQgbW9uc3RlciA9IE15R2FtZV9FeGFtcGxlX01vbnN0ZXIuZ2V0Um9vdEFzTW9uc3RlcihiYjogYnl0ZXMuYnVmZmVyKQorICAgIHJlYWRNb25zdGVyKG1vbnN0ZXI6IG1vbnN0ZXIpCisgICAgbXV0YXRlTW9uc3RlcihmYjogYnl0ZXMuYnVmZmVyKQorICAgIHJlYWRNb25zdGVyKG1vbnN0ZXI6IG1vbnN0ZXIpCisgIH0KKworICBmdW5jIHRlc3RDcmVhdGVNb25zdGVyUmVzaXplZEJ1ZmZlcigpIHsKKyAgICBsZXQgYnl0ZXMgPSBjcmVhdGVNb25zdGVyKHdpdGhQcmVmaXg6IGZhbHNlKQorICAgIC8vIHN3aWZ0Zm9ybWF0OmRpc2FibGUgYWxsCisgICAgWENUQXNzZXJ0RXF1YWwoYnl0ZXMuc2l6ZWRCeXRlQXJyYXksIFs0OCwgMCwgMCwgMCwgNzcsIDc5LCA3OCwgODMsIDAsIDAsIDAsIDAsIDM2LCAwLCA3MiwgMCwgNDAsIDAsIDAsIDAsIDM4LCAwLCAzMiwgMCwgMCwgMCwgMjgsIDAsIDAsIDAsIDI3LCAwLCAyMCwgMCwgMTYsIDAsIDEyLCAwLCA0LCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAxMSwgMCwgMzYsIDAsIDAsIDAsIDE2NCwgMCwgMCwgMCwgMCwgMCwgMCwgMSwgNjAsIDAsIDAsIDAsIDY4LCAwLCAwLCAwLCA3NiwgMCwgMCwgMCwgMCwgMCwgMCwgMSwgODgsIDAsIDAsIDAsIDEyMCwgMCwgMCwgMCwgMCwgMCwgODAsIDAsIDAsIDAsIDEyOCwgNjMsIDAsIDAsIDAsIDY0LCAwLCAwLCA2NCwgNjQsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDgsIDY0LCAyLCAwLCA1LCAwLCA2LCAwLCAwLCAwLCAyLCAwLCAwLCAwLCA2NCwgMCwgMCwgMCwgNDgsIDAsIDAsIDAsIDIsIDAsIDAsIDAsIDMwLCAwLCA0MCwgMCwgMTAsIDAsIDIwLCAwLCAxNTIsIDI1NSwgMjU1LCAyNTUsIDQsIDAsIDAsIDAsIDQsIDAsIDAsIDAsIDcwLCAxMTQsIDEwMSwgMTAwLCAwLCAwLCAwLCAwLCA1LCAwLCAwLCAwLCAwLCAxLCAyLCAzLCA0LCAwLCAwLCAwLCA1LCAwLCAwLCAwLCAxMTYsIDEwMSwgMTE1LCAxMTYsIDUwLCAwLCAwLCAwLCA1LCAwLCAwLCAwLCAxMTYsIDEwMSwgMTE1LCAxMTYsIDQ5LCAwLCAwLCAwLCA5LCAwLCAwLCAwLCA3NywgMTIxLCA3NywgMTExLCAxMTAsIDExNSwgMTE2LCAxMDEsIDExNCwgMCwgMCwgMCwgMywgMCwgMCwgMCwgMjAsIDAsIDAsIDAsIDM2LCAwLCAwLCAwLCA0LCAwLCAwLCAwLCAyNDAsIDI1NSwgMjU1LCAyNTUsIDMyLCAwLCAwLCAwLCAyNDgsIDI1NSwgMjU1LCAyNTUsIDM2LCAwLCAwLCAwLCAxMiwgMCwgOCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgNCwgMCwgMTIsIDAsIDAsIDAsIDI4LCAwLCAwLCAwLCA1LCAwLCAwLCAwLCA4NywgMTA1LCAxMDgsIDEwOSwgOTcsIDAsIDAsIDAsIDYsIDAsIDAsIDAsIDY2LCA5NywgMTE0LCAxMTAsIDEwMSwgMTIxLCAwLCAwLCA1LCAwLCAwLCAwLCA3MCwgMTE0LCAxMTEsIDEwMCwgMTExLCAwLCAwLCAwXSkKKyAgICAvLyBzd2lmdGZvcm1hdDplbmFibGUgYWxsCisgICAgcmVhZFZlcmlmaWVkTW9uc3RlcihmYjogYnl0ZXMuc2l6ZWRCdWZmZXIpCisgIH0KKworICBmdW5jIHRlc3RDcmVhdGVNb25zdGVyUHJlZml4ZWQoKSB7CisgICAgbGV0IGJ5dGVzID0gY3JlYXRlTW9uc3Rlcih3aXRoUHJlZml4OiB0cnVlKQorICAgIC8vIHN3aWZ0Zm9ybWF0OmRpc2FibGUgYWxsCisgICAgWENUQXNzZXJ0RXF1YWwoYnl0ZXMuc2l6ZWRCeXRlQXJyYXksIFs0NCwgMSwgMCwgMCwgNDQsIDAsIDAsIDAsIDc3LCA3OSwgNzgsIDgzLCAzNiwgMCwgNzIsIDAsIDQwLCAwLCAwLCAwLCAzOCwgMCwgMzIsIDAsIDAsIDAsIDI4LCAwLCAwLCAwLCAyNywgMCwgMjAsIDAsIDE2LCAwLCAxMiwgMCwgNCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMTEsIDAsIDM2LCAwLCAwLCAwLCAxNjQsIDAsIDAsIDAsIDAsIDAsIDAsIDEsIDYwLCAwLCAwLCAwLCA2OCwgMCwgMCwgMCwgNzYsIDAsIDAsIDAsIDAsIDAsIDAsIDEsIDg4LCAwLCAwLCAwLCAxMjAsIDAsIDAsIDAsIDAsIDAsIDgwLCAwLCAwLCAwLCAxMjgsIDYzLCAwLCAwLCAwLCA2NCwgMCwgMCwgNjQsIDY0LCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCA4LCA2NCwgMiwgMCwgNSwgMCwgNiwgMCwgMCwgMCwgMiwgMCwgMCwgMCwgNjQsIDAsIDAsIDAsIDQ4LCAwLCAwLCAwLCAyLCAwLCAwLCAwLCAzMCwgMCwgNDAsIDAsIDEwLCAwLCAyMCwgMCwgMTUyLCAyNTUsIDI1NSwgMjU1LCA0LCAwLCAwLCAwLCA0LCAwLCAwLCAwLCA3MCwgMTE0LCAxMDEsIDEwMCwgMCwgMCwgMCwgMCwgNSwgMCwgMCwgMCwgMCwgMSwgMiwgMywgNCwgMCwgMCwgMCwgNSwgMCwgMCwgMCwgMTE2LCAxMDEsIDExNSwgMTE2LCA1MCwgMCwgMCwgMCwgNSwgMCwgMCwgMCwgMTE2LCAxMDEsIDExNSwgMTE2LCA0OSwgMCwgMCwgMCwgOSwgMCwgMCwgMCwgNzcsIDEyMSwgNzcsIDExMSwgMTEwLCAxMTUsIDExNiwgMTAxLCAxMTQsIDAsIDAsIDAsIDMsIDAsIDAsIDAsIDIwLCAwLCAwLCAwLCAzNiwgMCwgMCwgMCwgNCwgMCwgMCwgMCwgMjQwLCAyNTUsIDI1NSwgMjU1LCAzMiwgMCwgMCwgMCwgMjQ4LCAyNTUsIDI1NSwgMjU1LCAzNiwgMCwgMCwgMCwgMTIsIDAsIDgsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDQsIDAsIDEyLCAwLCAwLCAwLCAyOCwgMCwgMCwgMCwgNSwgMCwgMCwgMCwgODcsIDEwNSwgMTA4LCAxMDksIDk3LCAwLCAwLCAwLCA2LCAwLCAwLCAwLCA2NiwgOTcsIDExNCwgMTEwLCAxMDEsIDEyMSwgMCwgMCwgNSwgMCwgMCwgMCwgNzAsIDExNCwgMTExLCAxMDAsIDExMSwgMCwgMCwgMF0pCisgICAgLy8gc3dpZnRmb3JtYXQ6ZW5hYmxlIGFsbAorCisgICAgdmFyIGJ1ZmZlciA9IGJ5dGVzLmJ1ZmZlcgorICAgIHJlYWRNb25zdGVyKG1vbnN0ZXI6IGdldFByZWZpeGVkU2l6ZVJvb3QoYnl0ZUJ1ZmZlcjogJmJ1ZmZlcikpCisgIH0KKworICBmdW5jIHRlc3RDcmVhdGVNb25zdGVyVXNpbmdDcmVhdGVNb25zdGVyTWV0aG9kV2l0aE5pbFBvcygpIHsKKyAgICB2YXIgZmJiID0gRmxhdEJ1ZmZlckJ1aWxkZXIoaW5pdGlhbFNpemU6IDEpCisgICAgbGV0IG5hbWUgPSBmYmIuY3JlYXRlKHN0cmluZzogIkZyb2RvIikKKyAgICBsZXQgbVN0YXJ0ID0gTW9uc3Rlci5zdGFydE1vbnN0ZXIoJmZiYikKKyAgICBNb25zdGVyLmFkZChuYW1lOiBuYW1lLCAmZmJiKQorICAgIGxldCByb290ID0gTW9uc3Rlci5lbmRNb25zdGVyKCZmYmIsIHN0YXJ0OiBtU3RhcnQpCisgICAgZmJiLmZpbmlzaChvZmZzZXQ6IHJvb3QpCisgICAgbGV0IG5ld01vbnN0ZXIgPSBNb25zdGVyLmdldFJvb3RBc01vbnN0ZXIoYmI6IGZiYi5zaXplZEJ1ZmZlcikKKyAgICBYQ1RBc3NlcnROaWwobmV3TW9uc3Rlci5wb3MpCisgICAgWENUQXNzZXJ0RXF1YWwobmV3TW9uc3Rlci5uYW1lLCAiRnJvZG8iKQorICB9CisKKyAgZnVuYyB0ZXN0Q3JlYXRlTW9uc3RlclVzaW5nQ3JlYXRlTW9uc3Rlck1ldGhvZFdpdGhQb3NYKCkgeworICAgIHZhciBmYmIgPSBGbGF0QnVmZmVyQnVpbGRlcihpbml0aWFsU2l6ZTogMSkKKyAgICBsZXQgbmFtZSA9IGZiYi5jcmVhdGUoc3RyaW5nOiAiQmFybmV5IikKKyAgICBsZXQgbVN0YXJ0ID0gTW9uc3Rlci5zdGFydE1vbnN0ZXIoJmZiYikKKyAgICBNb25zdGVyLmFkZCgKKyAgICAgIHBvczogTXlHYW1lX0V4YW1wbGVfVmVjMygKKyAgICAgICAgeDogMTAsCisgICAgICAgIHk6IDAsCisgICAgICAgIHo6IDAsCisgICAgICAgIHRlc3QxOiAwLAorICAgICAgICB0ZXN0MjogLmJsdWUsCisgICAgICAgIHRlc3QzOiAuaW5pdCgpKSwKKyAgICAgICZmYmIpCisgICAgTW9uc3Rlci5hZGQobmFtZTogbmFtZSwgJmZiYikKKyAgICBsZXQgcm9vdCA9IE1vbnN0ZXIuZW5kTW9uc3RlcigmZmJiLCBzdGFydDogbVN0YXJ0KQorICAgIGZiYi5maW5pc2gob2Zmc2V0OiByb290KQorCisgICAgbGV0IG5ld01vbnN0ZXIgPSBNb25zdGVyLmdldFJvb3RBc01vbnN0ZXIoYmI6IGZiYi5zaXplZEJ1ZmZlcikKKyAgICBYQ1RBc3NlcnRFcXVhbChuZXdNb25zdGVyLnBvcyEueCwgMTApCisgICAgWENUQXNzZXJ0RXF1YWwobmV3TW9uc3Rlci5uYW1lLCAiQmFybmV5IikKKyAgfQorCisgIGZ1bmMgdGVzdEFycmF5T2ZCb29scygpIHsKKyAgICBsZXQgYm9vbEFycmF5ID0gW2ZhbHNlLCB0cnVlLCBmYWxzZSwgdHJ1ZSwgZmFsc2UsIHRydWUsIGZhbHNlXQorICAgIHZhciBmYmIgPSBGbGF0QnVmZmVyQnVpbGRlcihpbml0aWFsU2l6ZTogMSkKKyAgICBsZXQgbmFtZSA9IGZiYi5jcmVhdGUoc3RyaW5nOiAiRnJvZG8iKQorICAgIGxldCBib29scyA9IGZiYi5jcmVhdGVWZWN0b3IoYm9vbEFycmF5KQorICAgIGxldCByb290ID0gTW9uc3Rlci5jcmVhdGVNb25zdGVyKAorICAgICAgJmZiYiwKKyAgICAgIG5hbWVPZmZzZXQ6IG5hbWUsCisgICAgICB0ZXN0YXJyYXlvZmJvb2xzVmVjdG9yT2Zmc2V0OiBib29scykKKyAgICBmYmIuZmluaXNoKG9mZnNldDogcm9vdCkKKyAgICBsZXQgbW9uc3RlciA9IE1vbnN0ZXIuZ2V0Um9vdEFzTW9uc3RlcihiYjogZmJiLnNpemVkQnVmZmVyKQorCisgICAgbGV0IHZhbHVlcyA9IG1vbnN0ZXIudGVzdGFycmF5b2Zib29scworCisgICAgWENUQXNzZXJ0RXF1YWwoYm9vbEFycmF5LCB2YWx1ZXMpCisKKyAgICBmb3IgaSBpbiAwLi48bW9uc3Rlci50ZXN0YXJyYXlvZmJvb2xzQ291bnQgeworICAgICAgWENUQXNzZXJ0RXF1YWwoYm9vbEFycmF5W0ludChpKV0sIG1vbnN0ZXIudGVzdGFycmF5b2Zib29scyhhdDogaSkpCisgICAgfQorICB9CisKKyAgZnVuYyByZWFkVmVyaWZpZWRNb25zdGVyKGZiOiBCeXRlQnVmZmVyKSB7CisgICAgdmFyIGJ5dGVCdWZmZXIgPSBmYgorICAgIFhDVEFzc2VydE5vVGhyb3coCisgICAgICB0cnkgcmVhZE1vbnN0ZXIoCisgICAgICAgIG1vbnN0ZXI6IGdldENoZWNrZWRSb290KAorICAgICAgICAgIGJ5dGVCdWZmZXI6ICZieXRlQnVmZmVyKSBhcyBNeUdhbWVfRXhhbXBsZV9Nb25zdGVyKSkKKyAgfQorCisgIGZ1bmMgcmVhZE1vbnN0ZXIobW9uc3RlcjogTW9uc3RlcikgeworICAgIHZhciBtb25zdGVyID0gbW9uc3RlcgorICAgIHJlYWRGbGF0YnVmZmVyTW9uc3Rlcihtb25zdGVyOiAmbW9uc3RlcikKKyAgICBsZXQgdW5wYWNrZWQ6IE15R2FtZV9FeGFtcGxlX01vbnN0ZXJUPyA9IG1vbnN0ZXIudW5wYWNrKCkKKyAgICByZWFkT2JqZWN0QXBpKG1vbnN0ZXI6IHVucGFja2VkISkKKyAgICBndWFyZCBsZXQgYnVmZmVyID0gdW5wYWNrZWQ/LnNlcmlhbGl6ZSgpCisgICAgZWxzZSB7IGZhdGFsRXJyb3IoIkNvdWxkbnQgZ2VuZXJhdGUgYnl0ZWJ1ZmZlciIpIH0KKyAgICB2YXIgbmV3TW9uc3RlciA9IE1vbnN0ZXIuZ2V0Um9vdEFzTW9uc3RlcihiYjogYnVmZmVyKQorICAgIHJlYWRGbGF0YnVmZmVyTW9uc3Rlcihtb25zdGVyOiAmbmV3TW9uc3RlcikKKyAgfQorCisgIGZ1bmMgY3JlYXRlTW9uc3Rlcih3aXRoUHJlZml4IHByZWZpeDogQm9vbCkgLT4gRmxhdEJ1ZmZlckJ1aWxkZXIgeworICAgIHZhciBmYmIgPSBGbGF0QnVmZmVyQnVpbGRlcihpbml0aWFsU2l6ZTogMSkKKyAgICBsZXQgbmFtZXMgPSBbCisgICAgICBmYmIuY3JlYXRlKHN0cmluZzogIkZyb2RvIiksCisgICAgICBmYmIuY3JlYXRlKHN0cmluZzogIkJhcm5leSIpLAorICAgICAgZmJiLmNyZWF0ZShzdHJpbmc6ICJXaWxtYSIpLAorICAgIF0KKyAgICB2YXIgb2Zmc2V0czogW09mZnNldF0gPSBbXQorICAgIGxldCBzdGFydDEgPSBNb25zdGVyLnN0YXJ0TW9uc3RlcigmZmJiKQorICAgIE1vbnN0ZXIuYWRkKG5hbWU6IG5hbWVzWzBdLCAmZmJiKQorICAgIG9mZnNldHMuYXBwZW5kKE1vbnN0ZXIuZW5kTW9uc3RlcigmZmJiLCBzdGFydDogc3RhcnQxKSkKKyAgICBsZXQgc3RhcnQyID0gTW9uc3Rlci5zdGFydE1vbnN0ZXIoJmZiYikKKyAgICBNb25zdGVyLmFkZChuYW1lOiBuYW1lc1sxXSwgJmZiYikKKyAgICBvZmZzZXRzLmFwcGVuZChNb25zdGVyLmVuZE1vbnN0ZXIoJmZiYiwgc3RhcnQ6IHN0YXJ0MikpCisgICAgbGV0IHN0YXJ0MyA9IE1vbnN0ZXIuc3RhcnRNb25zdGVyKCZmYmIpCisgICAgTW9uc3Rlci5hZGQobmFtZTogbmFtZXNbMl0sICZmYmIpCisgICAgb2Zmc2V0cy5hcHBlbmQoTW9uc3Rlci5lbmRNb25zdGVyKCZmYmIsIHN0YXJ0OiBzdGFydDMpKQorCisgICAgbGV0IHNvcnRlZEFycmF5ID0gTW9uc3Rlci5zb3J0VmVjdG9yT2ZNb25zdGVyKG9mZnNldHM6IG9mZnNldHMsICZmYmIpCisKKyAgICBsZXQgc3RyID0gZmJiLmNyZWF0ZShzdHJpbmc6ICJNeU1vbnN0ZXIiKQorICAgIGxldCB0ZXN0MSA9IGZiYi5jcmVhdGUoc3RyaW5nOiAidGVzdDEiKQorICAgIGxldCB0ZXN0MiA9IGZiYi5jcmVhdGUoc3RyaW5nOiAidGVzdDIiKQorICAgIGxldCBfaW52OiBbQnl0ZV0gPSBbMCwgMSwgMiwgMywgNF0KKyAgICBsZXQgaW52ID0gZmJiLmNyZWF0ZVZlY3RvcihfaW52KQorCisgICAgbGV0IGZyZWQgPSBmYmIuY3JlYXRlKHN0cmluZzogIkZyZWQiKQorICAgIGxldCBtb24xU3RhcnQgPSBNb25zdGVyLnN0YXJ0TW9uc3RlcigmZmJiKQorICAgIE1vbnN0ZXIuYWRkKG5hbWU6IGZyZWQsICZmYmIpCisgICAgbGV0IG1vbjIgPSBNb25zdGVyLmVuZE1vbnN0ZXIoJmZiYiwgc3RhcnQ6IG1vbjFTdGFydCkKKworICAgIGxldCB0ZXN0NCA9IGZiYi5jcmVhdGVWZWN0b3Iob2ZTdHJ1Y3RzOiBbCisgICAgICBNeUdhbWVfRXhhbXBsZV9UZXN0KGE6IDMwLCBiOiA0MCksCisgICAgICBNeUdhbWVfRXhhbXBsZV9UZXN0KGE6IDEwLCBiOiAyMCksCisgICAgXSkKKworICAgIGxldCBzdHJpbmdUZXN0VmVjdG9yID0gZmJiLmNyZWF0ZVZlY3RvcihvZk9mZnNldHM6IFt0ZXN0MSwgdGVzdDJdKQorICAgIGxldCBtU3RhcnQgPSBNb25zdGVyLnN0YXJ0TW9uc3RlcigmZmJiKQorICAgIE1vbnN0ZXIuYWRkKAorICAgICAgcG9zOiBNeUdhbWVfRXhhbXBsZV9WZWMzKAorICAgICAgICB4OiAxLAorICAgICAgICB5OiAyLAorICAgICAgICB6OiAzLAorICAgICAgICB0ZXN0MTogMywKKyAgICAgICAgdGVzdDI6IC5ncmVlbiwKKyAgICAgICAgdGVzdDM6IC5pbml0KGE6IDUsIGI6IDYpKSwKKyAgICAgICZmYmIpCisgICAgTW9uc3Rlci5hZGQoaHA6IDgwLCAmZmJiKQorICAgIE1vbnN0ZXIuYWRkKG5hbWU6IHN0ciwgJmZiYikKKyAgICBNb25zdGVyLmFkZFZlY3Rvck9mKGludmVudG9yeTogaW52LCAmZmJiKQorICAgIE1vbnN0ZXIuYWRkKHRlc3RUeXBlOiAubW9uc3RlciwgJmZiYikKKyAgICBNb25zdGVyLmFkZCh0ZXN0OiBtb24yLCAmZmJiKQorICAgIE1vbnN0ZXIuYWRkVmVjdG9yT2YodGVzdDQ6IHRlc3Q0LCAmZmJiKQorICAgIE1vbnN0ZXIuYWRkVmVjdG9yT2YodGVzdGFycmF5b2ZzdHJpbmc6IHN0cmluZ1Rlc3RWZWN0b3IsICZmYmIpCisgICAgTW9uc3Rlci5hZGQodGVzdGJvb2w6IHRydWUsICZmYmIpCisgICAgTW9uc3Rlci5hZGRWZWN0b3JPZih0ZXN0YXJyYXlvZnRhYmxlczogc29ydGVkQXJyYXksICZmYmIpCisgICAgbGV0IGVuZCA9IE1vbnN0ZXIuZW5kTW9uc3RlcigmZmJiLCBzdGFydDogbVN0YXJ0KQorICAgIE1vbnN0ZXIuZmluaXNoKCZmYmIsIGVuZDogZW5kLCBwcmVmaXg6IHByZWZpeCkKKyAgICByZXR1cm4gZmJiCisgIH0KKworICBmdW5jIG11dGF0ZU1vbnN0ZXIoZmI6IEJ5dGVCdWZmZXIpIHsKKyAgICBsZXQgbW9uc3RlciA9IE1vbnN0ZXIuZ2V0Um9vdEFzTW9uc3RlcihiYjogZmIpCisgICAgWENUQXNzZXJ0RmFsc2UobW9uc3Rlci5tdXRhdGUobWFuYTogMTApKQorICAgIFhDVEFzc2VydEVxdWFsKG1vbnN0ZXIudGVzdGFycmF5b2Z0YWJsZXMoYXQ6IDApPy5uYW1lLCAiQmFybmV5IikKKyAgICBYQ1RBc3NlcnRFcXVhbChtb25zdGVyLnRlc3RhcnJheW9mdGFibGVzKGF0OiAxKT8ubmFtZSwgIkZyb2RvIikKKyAgICBYQ1RBc3NlcnRFcXVhbChtb25zdGVyLnRlc3RhcnJheW9mdGFibGVzKGF0OiAyKT8ubmFtZSwgIldpbG1hIikKKworICAgIC8vIEV4YW1wbGUgb2Ygc2VhcmNoaW5nIGZvciBhIHRhYmxlIGJ5IHRoZSBrZXkKKyAgICBYQ1RBc3NlcnROb3ROaWwobW9uc3Rlci50ZXN0YXJyYXlvZnRhYmxlc0J5KGtleTogIkZyb2RvIikpCisgICAgWENUQXNzZXJ0Tm90TmlsKG1vbnN0ZXIudGVzdGFycmF5b2Z0YWJsZXNCeShrZXk6ICJCYXJuZXkiKSkKKyAgICBYQ1RBc3NlcnROb3ROaWwobW9uc3Rlci50ZXN0YXJyYXlvZnRhYmxlc0J5KGtleTogIldpbG1hIikpCisKKyAgICBYQ1RBc3NlcnRFcXVhbChtb25zdGVyLnRlc3RUeXBlLCAubW9uc3RlcikKKworICAgIFhDVEFzc2VydEVxdWFsKG1vbnN0ZXIubXV0YXRlKGludmVudG9yeTogMSwgYXQ6IDApLCB0cnVlKQorICAgIFhDVEFzc2VydEVxdWFsKG1vbnN0ZXIubXV0YXRlKGludmVudG9yeTogMiwgYXQ6IDEpLCB0cnVlKQorICAgIFhDVEFzc2VydEVxdWFsKG1vbnN0ZXIubXV0YXRlKGludmVudG9yeTogMywgYXQ6IDIpLCB0cnVlKQorICAgIFhDVEFzc2VydEVxdWFsKG1vbnN0ZXIubXV0YXRlKGludmVudG9yeTogNCwgYXQ6IDMpLCB0cnVlKQorICAgIFhDVEFzc2VydEVxdWFsKG1vbnN0ZXIubXV0YXRlKGludmVudG9yeTogNSwgYXQ6IDQpLCB0cnVlKQorCisgICAgZm9yIGkgaW4gMC4uPG1vbnN0ZXIuaW52ZW50b3J5Q291bnQgeworICAgICAgWENUQXNzZXJ0RXF1YWwobW9uc3Rlci5pbnZlbnRvcnkoYXQ6IGkpLCBCeXRlKGkgKyAxKSkKKyAgICB9CisKKyAgICBYQ1RBc3NlcnRFcXVhbChtb25zdGVyLm11dGF0ZShpbnZlbnRvcnk6IDAsIGF0OiAwKSwgdHJ1ZSkKKyAgICBYQ1RBc3NlcnRFcXVhbChtb25zdGVyLm11dGF0ZShpbnZlbnRvcnk6IDEsIGF0OiAxKSwgdHJ1ZSkKKyAgICBYQ1RBc3NlcnRFcXVhbChtb25zdGVyLm11dGF0ZShpbnZlbnRvcnk6IDIsIGF0OiAyKSwgdHJ1ZSkKKyAgICBYQ1RBc3NlcnRFcXVhbChtb25zdGVyLm11dGF0ZShpbnZlbnRvcnk6IDMsIGF0OiAzKSwgdHJ1ZSkKKyAgICBYQ1RBc3NlcnRFcXVhbChtb25zdGVyLm11dGF0ZShpbnZlbnRvcnk6IDQsIGF0OiA0KSwgdHJ1ZSkKKworICAgIGxldCB2ZWMgPSBtb25zdGVyLm11dGFibGVQb3MKKyAgICBYQ1RBc3NlcnRFcXVhbCh2ZWM/LngsIDEpCisgICAgWENUQXNzZXJ0VHJ1ZSh2ZWM/Lm11dGF0ZSh4OiA1NS4wKSA/PyBmYWxzZSkKKyAgICBYQ1RBc3NlcnRUcnVlKHZlYz8ubXV0YXRlKHRlc3QxOiA1NSkgPz8gZmFsc2UpCisgICAgWENUQXNzZXJ0RXF1YWwodmVjPy54LCA1NS4wKQorICAgIFhDVEFzc2VydEVxdWFsKHZlYz8udGVzdDEsIDU1LjApCisgICAgWENUQXNzZXJ0VHJ1ZSh2ZWM/Lm11dGF0ZSh4OiAxKSA/PyBmYWxzZSkKKyAgICBYQ1RBc3NlcnRFcXVhbCh2ZWM/LngsIDEpCisgICAgWENUQXNzZXJ0VHJ1ZSh2ZWM/Lm11dGF0ZSh0ZXN0MTogMykgPz8gZmFsc2UpCisgIH0KKworICBmdW5jIHJlYWRGbGF0YnVmZmVyTW9uc3Rlcihtb25zdGVyOiBpbm91dCBNeUdhbWVfRXhhbXBsZV9Nb25zdGVyKSB7CisgICAgWENUQXNzZXJ0RXF1YWwobW9uc3Rlci5ocCwgODApCisgICAgWENUQXNzZXJ0RXF1YWwobW9uc3Rlci5tYW5hLCAxNTApCisgICAgWENUQXNzZXJ0RXF1YWwobW9uc3Rlci5uYW1lLCAiTXlNb25zdGVyIikKKyAgICBsZXQgcG9zID0gbW9uc3Rlci5wb3MKKyAgICBYQ1RBc3NlcnRFcXVhbChwb3M/LngsIDEpCisgICAgWENUQXNzZXJ0RXF1YWwocG9zPy55LCAyKQorICAgIFhDVEFzc2VydEVxdWFsKHBvcz8ueiwgMykKKyAgICBYQ1RBc3NlcnRFcXVhbChwb3M/LnRlc3QxLCAzKQorICAgIFhDVEFzc2VydEVxdWFsKHBvcz8udGVzdDIsIC5ncmVlbikKKyAgICBsZXQgdGVzdCA9IHBvcz8udGVzdDMKKyAgICBYQ1RBc3NlcnRFcXVhbCh0ZXN0Py5hLCA1KQorICAgIFhDVEFzc2VydEVxdWFsKHRlc3Q/LmIsIDYpCisgICAgWENUQXNzZXJ0RXF1YWwobW9uc3Rlci50ZXN0VHlwZSwgLm1vbnN0ZXIpCisgICAgbGV0IG1vbnN0ZXIyID0gbW9uc3Rlci50ZXN0KHR5cGU6IE1vbnN0ZXIuc2VsZikKKyAgICBYQ1RBc3NlcnRFcXVhbChtb25zdGVyMj8ubmFtZSwgIkZyZWQiKQorCisgICAgWENUQXNzZXJ0RXF1YWwobW9uc3Rlci5tdXRhdGUobWFuYTogMTApLCBmYWxzZSkKKworICAgIFhDVEFzc2VydEVxdWFsKG1vbnN0ZXIubWFuYSwgMTUwKQorICAgIFhDVEFzc2VydEVxdWFsKG1vbnN0ZXIuaW52ZW50b3J5Q291bnQsIDUpCisgICAgdmFyIHN1bTogQnl0ZSA9IDAKKyAgICBmb3IgaSBpbiAwLi4ubW9uc3Rlci5pbnZlbnRvcnlDb3VudCB7CisgICAgICBzdW0gKz0gbW9uc3Rlci5pbnZlbnRvcnkoYXQ6IGkpCisgICAgfQorICAgIFhDVEFzc2VydEVxdWFsKHN1bSwgMTApCisgICAgWENUQXNzZXJ0RXF1YWwobW9uc3Rlci50ZXN0NENvdW50LCAyKQorCisgICAgbGV0IHRlc3QwID0gbW9uc3Rlci50ZXN0NChhdDogMCkKKyAgICBsZXQgdGVzdDEgPSBtb25zdGVyLnRlc3Q0KGF0OiAxKQorICAgIHZhciBzdW0wID0gMAorICAgIHZhciBzdW0xID0gMAorICAgIGlmIGxldCBhID0gdGVzdDA/LmEsIGxldCBiID0gdGVzdDA/LmIgeworICAgICAgc3VtMCA9IEludChhKSArIEludChiKQorICAgIH0KKyAgICBpZiBsZXQgYSA9IHRlc3QxPy5hLCBsZXQgYiA9IHRlc3QxPy5iIHsKKyAgICAgIHN1bTEgPSBJbnQoYSkgKyBJbnQoYikKKyAgICB9CisgICAgWENUQXNzZXJ0RXF1YWwoc3VtMCArIHN1bTEsIDEwMCkKKworICAgIGxldCBtdXRhYmxlVGVzdDAgPSBtb25zdGVyLm11dGFibGVUZXN0NChhdDogMCkKKyAgICBsZXQgbXV0YWJsZVRlc3QxID0gbW9uc3Rlci5tdXRhYmxlVGVzdDQoYXQ6IDEpCisgICAgdmFyIHN1bTIgPSAwCisgICAgdmFyIHN1bTMgPSAwCisgICAgaWYgbGV0IGEgPSBtdXRhYmxlVGVzdDA/LmEsIGxldCBiID0gbXV0YWJsZVRlc3QwPy5iIHsKKyAgICAgIHN1bTIgPSBJbnQoYSkgKyBJbnQoYikKKyAgICB9CisgICAgaWYgbGV0IGEgPSBtdXRhYmxlVGVzdDE/LmEsIGxldCBiID0gbXV0YWJsZVRlc3QxPy5iIHsKKyAgICAgIHN1bTMgPSBJbnQoYSkgKyBJbnQoYikKKyAgICB9CisgICAgWENUQXNzZXJ0RXF1YWwoc3VtMiArIHN1bTMsIDEwMCkKKworICAgIFhDVEFzc2VydEVxdWFsKG1vbnN0ZXIudGVzdGFycmF5b2ZzdHJpbmdDb3VudCwgMikKKyAgICBYQ1RBc3NlcnRFcXVhbChtb25zdGVyLnRlc3RhcnJheW9mc3RyaW5nKGF0OiAwKSwgInRlc3QxIikKKyAgICBYQ1RBc3NlcnRFcXVhbChtb25zdGVyLnRlc3RhcnJheW9mc3RyaW5nKGF0OiAxKSwgInRlc3QyIikKKyAgICBYQ1RBc3NlcnRFcXVhbChtb25zdGVyLnRlc3Rib29sLCB0cnVlKQorCisgICAgbGV0IGFycmF5ID0gbW9uc3Rlci5uYW1lU2VnbWVudEFycmF5CisgICAgWENUQXNzZXJ0RXF1YWwoU3RyaW5nKGJ5dGVzOiBhcnJheSA/PyBbXSwgZW5jb2Rpbmc6IC51dGY4KSwgIk15TW9uc3RlciIpCisKKyAgICBpZiAwID09IG1vbnN0ZXIudGVzdGFycmF5b2Zib29sc0NvdW50ICB7CisgICAgICBYQ1RBc3NlcnRFcXVhbChtb25zdGVyLnRlc3RhcnJheW9mYm9vbHMuaXNFbXB0eSwgdHJ1ZSkKKyAgICB9IGVsc2UgeworICAgICAgWENUQXNzZXJ0RXF1YWwobW9uc3Rlci50ZXN0YXJyYXlvZmJvb2xzLmlzRW1wdHksIGZhbHNlKQorICAgIH0KKyAgfQorCisgIGZ1bmMgcmVhZE9iamVjdEFwaShtb25zdGVyOiBNeUdhbWVfRXhhbXBsZV9Nb25zdGVyVCkgeworICAgIFhDVEFzc2VydEVxdWFsKG1vbnN0ZXIuaHAsIDgwKQorICAgIFhDVEFzc2VydEVxdWFsKG1vbnN0ZXIubWFuYSwgMTUwKQorICAgIFhDVEFzc2VydEVxdWFsKG1vbnN0ZXIubmFtZSwgIk15TW9uc3RlciIpCisgICAgbGV0IHBvcyA9IG1vbnN0ZXIucG9zCisgICAgWENUQXNzZXJ0RXF1YWwocG9zPy54LCAxKQorICAgIFhDVEFzc2VydEVxdWFsKHBvcz8ueSwgMikKKyAgICBYQ1RBc3NlcnRFcXVhbChwb3M/LnosIDMpCisgICAgWENUQXNzZXJ0RXF1YWwocG9zPy50ZXN0MSwgMykKKyAgICBYQ1RBc3NlcnRFcXVhbChwb3M/LnRlc3QyLCAuZ3JlZW4pCisgICAgbGV0IHRlc3QgPSBwb3M/LnRlc3QzCisgICAgWENUQXNzZXJ0RXF1YWwodGVzdD8uYSwgNSkKKyAgICBYQ1RBc3NlcnRFcXVhbCh0ZXN0Py5iLCA2KQorICAgIGxldCBtb25zdGVyMiA9IG1vbnN0ZXIudGVzdD8udmFsdWUgYXM/IE15R2FtZV9FeGFtcGxlX01vbnN0ZXJUCisgICAgWENUQXNzZXJ0RXF1YWwobW9uc3RlcjI/Lm5hbWUsICJGcmVkIikKKyAgICBYQ1RBc3NlcnRFcXVhbChtb25zdGVyLm1hbmEsIDE1MCkKKyAgICBtb25zdGVyLm1hbmEgPSAxMAorICAgIFhDVEFzc2VydEVxdWFsKG1vbnN0ZXIubWFuYSwgMTApCisgICAgbW9uc3Rlci5tYW5hID0gMTUwCisgICAgWENUQXNzZXJ0RXF1YWwobW9uc3Rlci5tYW5hLCAxNTApCisKKyAgICBYQ1RBc3NlcnRFcXVhbChtb25zdGVyLmludmVudG9yeS5jb3VudCwgNSkKKyAgICB2YXIgc3VtOiBCeXRlID0gMAorICAgIGZvciBpIGluIG1vbnN0ZXIuaW52ZW50b3J5IHsKKyAgICAgIHN1bSArPSBpCisgICAgfQorICAgIFhDVEFzc2VydEVxdWFsKHN1bSwgMTApCisgICAgWENUQXNzZXJ0RXF1YWwobW9uc3Rlci50ZXN0NC5jb3VudCwgMikKKyAgICBsZXQgdGVzdDAgPSBtb25zdGVyLnRlc3Q0WzBdCisgICAgbGV0IHRlc3QxID0gbW9uc3Rlci50ZXN0NFsxXQorICAgIHZhciBzdW0wID0gMAorICAgIHZhciBzdW0xID0gMAorICAgIGlmIGxldCBhID0gdGVzdDA/LmEsIGxldCBiID0gdGVzdDA/LmIgeworICAgICAgc3VtMCA9IEludChhKSArIEludChiKQorICAgIH0KKyAgICBpZiBsZXQgYSA9IHRlc3QxPy5hLCBsZXQgYiA9IHRlc3QxPy5iIHsKKyAgICAgIHN1bTEgPSBJbnQoYSkgKyBJbnQoYikKKyAgICB9CisgICAgWENUQXNzZXJ0RXF1YWwoc3VtMCArIHN1bTEsIDEwMCkKKyAgICBYQ1RBc3NlcnRFcXVhbChtb25zdGVyLnRlc3Rib29sLCB0cnVlKQorICB9CisKKyAgdmFyIGpzb25EYXRhOiBTdHJpbmcgeworICAgICIiIgorICAgIHtcImhwXCI6ODAsXCJpbnZlbnRvcnlcIjpbMCwxLDIsMyw0XSxcInRlc3RcIjp7XCJuYW1lXCI6XCJGcmVkXCJ9LFwidGVzdGFycmF5b2ZzdHJpbmdcIjpbXCJ0ZXN0MVwiLFwidGVzdDJcIl0sXCJ0ZXN0YXJyYXlvZnRhYmxlc1wiOlt7XCJuYW1lXCI6XCJCYXJuZXlcIn0se1wibmFtZVwiOlwiRnJvZG9cIn0se1wibmFtZVwiOlwiV2lsbWFcIn1dLFwidGVzdDRcIjpbe1wiYVwiOjMwLFwiYlwiOjQwfSx7XCJhXCI6MTAsXCJiXCI6MjB9XSxcInRlc3Rib29sXCI6dHJ1ZSxcInRlc3RfdHlwZVwiOlwiTW9uc3RlclwiLFwicG9zXCI6e1wieVwiOjIsXCJ0ZXN0M1wiOntcImFcIjo1LFwiYlwiOjZ9LFwielwiOjMsXCJ4XCI6MSxcInRlc3QxXCI6MyxcInRlc3QyXCI6XCJHcmVlblwifSxcIm5hbWVcIjpcIk15TW9uc3RlclwifQorICAgICIiIgorICB9Cit9CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9GbGF0QnVmZmVycy5UZXN0LlN3aWZ0L1Rlc3RzL0ZsYXRCdWZmZXJzLlRlc3QuU3dpZnRUZXN0cy9tb25zdGVyX3Rlc3RfZ2VuZXJhdGVkLnN3aWZ0IGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvc3dpZnQvV2FzbS50ZXN0cy9UZXN0cy9GbGF0QnVmZmVycy5UZXN0LlN3aWZ0Lldhc21UZXN0cy9tb25zdGVyX3Rlc3RfZ2VuZXJhdGVkLnN3aWZ0CnNpbWlsYXJpdHkgaW5kZXggOTQlCnJlbmFtZSBmcm9tIHRoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL0ZsYXRCdWZmZXJzLlRlc3QuU3dpZnQvVGVzdHMvRmxhdEJ1ZmZlcnMuVGVzdC5Td2lmdFRlc3RzL21vbnN0ZXJfdGVzdF9nZW5lcmF0ZWQuc3dpZnQKcmVuYW1lIHRvIHRoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL3N3aWZ0L1dhc20udGVzdHMvVGVzdHMvRmxhdEJ1ZmZlcnMuVGVzdC5Td2lmdC5XYXNtVGVzdHMvbW9uc3Rlcl90ZXN0X2dlbmVyYXRlZC5zd2lmdAppbmRleCBjOGEwNTAyLi5kMzdhNWJiIDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9GbGF0QnVmZmVycy5UZXN0LlN3aWZ0L1Rlc3RzL0ZsYXRCdWZmZXJzLlRlc3QuU3dpZnRUZXN0cy9tb25zdGVyX3Rlc3RfZ2VuZXJhdGVkLnN3aWZ0CisrKyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL3N3aWZ0L1dhc20udGVzdHMvVGVzdHMvRmxhdEJ1ZmZlcnMuVGVzdC5Td2lmdC5XYXNtVGVzdHMvbW9uc3Rlcl90ZXN0X2dlbmVyYXRlZC5zd2lmdApAQCAtMjM3LDcgKzIzNyw3IEBACiB9CiBwdWJsaWMgc3RydWN0IE15R2FtZV9FeGFtcGxlX1Rlc3Q6IE5hdGl2ZVN0cnVjdCwgVmVyaWZpYWJsZSwgRmxhdGJ1ZmZlcnNJbml0aWFsaXphYmxlLCBOYXRpdmVPYmplY3QgewogCi0gIHN0YXRpYyBmdW5jIHZhbGlkYXRlVmVyc2lvbigpIHsgRmxhdEJ1ZmZlcnNWZXJzaW9uXzJfMF8wKCkgfQorICBzdGF0aWMgZnVuYyB2YWxpZGF0ZVZlcnNpb24oKSB7IEZsYXRCdWZmZXJzVmVyc2lvbl8yXzBfOCgpIH0KIAogICBwcml2YXRlIHZhciBfYTogSW50MTYKICAgcHJpdmF0ZSB2YXIgX2I6IEludDgKQEAgLTI5MSw3ICsyOTEsNyBAQAogCiBwdWJsaWMgc3RydWN0IE15R2FtZV9FeGFtcGxlX1Rlc3RfTXV0YWJsZTogRmxhdEJ1ZmZlck9iamVjdCB7CiAKLSAgc3RhdGljIGZ1bmMgdmFsaWRhdGVWZXJzaW9uKCkgeyBGbGF0QnVmZmVyc1ZlcnNpb25fMl8wXzAoKSB9CisgIHN0YXRpYyBmdW5jIHZhbGlkYXRlVmVyc2lvbigpIHsgRmxhdEJ1ZmZlcnNWZXJzaW9uXzJfMF84KCkgfQogICBwdWJsaWMgdmFyIF9fYnVmZmVyOiBCeXRlQnVmZmVyISB7IHJldHVybiBfYWNjZXNzb3IuYmIgfQogICBwcml2YXRlIHZhciBfYWNjZXNzb3I6IFN0cnVjdAogCkBAIC0zMTgsNyArMzE4LDcgQEAKIAogcHVibGljIHN0cnVjdCBNeUdhbWVfRXhhbXBsZV9WZWMzOiBOYXRpdmVTdHJ1Y3QsIFZlcmlmaWFibGUsIEZsYXRidWZmZXJzSW5pdGlhbGl6YWJsZSwgTmF0aXZlT2JqZWN0IHsKIAotICBzdGF0aWMgZnVuYyB2YWxpZGF0ZVZlcnNpb24oKSB7IEZsYXRCdWZmZXJzVmVyc2lvbl8yXzBfMCgpIH0KKyAgc3RhdGljIGZ1bmMgdmFsaWRhdGVWZXJzaW9uKCkgeyBGbGF0QnVmZmVyc1ZlcnNpb25fMl8wXzgoKSB9CiAKICAgcHJpdmF0ZSB2YXIgX3g6IEZsb2F0MzIKICAgcHJpdmF0ZSB2YXIgX3k6IEZsb2F0MzIKQEAgLTQxMyw3ICs0MTMsNyBAQAogCiBwdWJsaWMgc3RydWN0IE15R2FtZV9FeGFtcGxlX1ZlYzNfTXV0YWJsZTogRmxhdEJ1ZmZlck9iamVjdCB7CiAKLSAgc3RhdGljIGZ1bmMgdmFsaWRhdGVWZXJzaW9uKCkgeyBGbGF0QnVmZmVyc1ZlcnNpb25fMl8wXzAoKSB9CisgIHN0YXRpYyBmdW5jIHZhbGlkYXRlVmVyc2lvbigpIHsgRmxhdEJ1ZmZlcnNWZXJzaW9uXzJfMF84KCkgfQogICBwdWJsaWMgdmFyIF9fYnVmZmVyOiBCeXRlQnVmZmVyISB7IHJldHVybiBfYWNjZXNzb3IuYmIgfQogICBwcml2YXRlIHZhciBfYWNjZXNzb3I6IFN0cnVjdAogCkBAIC00NDcsNyArNDQ3LDcgQEAKIAogcHVibGljIHN0cnVjdCBNeUdhbWVfRXhhbXBsZV9BYmlsaXR5OiBOYXRpdmVTdHJ1Y3QsIFZlcmlmaWFibGUsIEZsYXRidWZmZXJzSW5pdGlhbGl6YWJsZSwgTmF0aXZlT2JqZWN0IHsKIAotICBzdGF0aWMgZnVuYyB2YWxpZGF0ZVZlcnNpb24oKSB7IEZsYXRCdWZmZXJzVmVyc2lvbl8yXzBfMCgpIH0KKyAgc3RhdGljIGZ1bmMgdmFsaWRhdGVWZXJzaW9uKCkgeyBGbGF0QnVmZmVyc1ZlcnNpb25fMl8wXzgoKSB9CiAKICAgcHJpdmF0ZSB2YXIgX2lkOiBVSW50MzIKICAgcHJpdmF0ZSB2YXIgX2Rpc3RhbmNlOiBVSW50MzIKQEAgLTUwMCw3ICs1MDAsNyBAQAogCiBwdWJsaWMgc3RydWN0IE15R2FtZV9FeGFtcGxlX0FiaWxpdHlfTXV0YWJsZTogRmxhdEJ1ZmZlck9iamVjdCB7CiAKLSAgc3RhdGljIGZ1bmMgdmFsaWRhdGVWZXJzaW9uKCkgeyBGbGF0QnVmZmVyc1ZlcnNpb25fMl8wXzAoKSB9CisgIHN0YXRpYyBmdW5jIHZhbGlkYXRlVmVyc2lvbigpIHsgRmxhdEJ1ZmZlcnNWZXJzaW9uXzJfMF84KCkgfQogICBwdWJsaWMgdmFyIF9fYnVmZmVyOiBCeXRlQnVmZmVyISB7IHJldHVybiBfYWNjZXNzb3IuYmIgfQogICBwcml2YXRlIHZhciBfYWNjZXNzb3I6IFN0cnVjdAogCkBAIC01MjcsNyArNTI3LDcgQEAKIAogcHVibGljIHN0cnVjdCBNeUdhbWVfRXhhbXBsZV9TdHJ1Y3RPZlN0cnVjdHM6IE5hdGl2ZVN0cnVjdCwgVmVyaWZpYWJsZSwgRmxhdGJ1ZmZlcnNJbml0aWFsaXphYmxlLCBOYXRpdmVPYmplY3QgewogCi0gIHN0YXRpYyBmdW5jIHZhbGlkYXRlVmVyc2lvbigpIHsgRmxhdEJ1ZmZlcnNWZXJzaW9uXzJfMF8wKCkgfQorICBzdGF0aWMgZnVuYyB2YWxpZGF0ZVZlcnNpb24oKSB7IEZsYXRCdWZmZXJzVmVyc2lvbl8yXzBfOCgpIH0KIAogICBwcml2YXRlIHZhciBfYTogTXlHYW1lX0V4YW1wbGVfQWJpbGl0eQogICBwcml2YXRlIHZhciBfYjogTXlHYW1lX0V4YW1wbGVfVGVzdApAQCAtNTg3LDcgKzU4Nyw3IEBACiAKIHB1YmxpYyBzdHJ1Y3QgTXlHYW1lX0V4YW1wbGVfU3RydWN0T2ZTdHJ1Y3RzX011dGFibGU6IEZsYXRCdWZmZXJPYmplY3QgewogCi0gIHN0YXRpYyBmdW5jIHZhbGlkYXRlVmVyc2lvbigpIHsgRmxhdEJ1ZmZlcnNWZXJzaW9uXzJfMF8wKCkgfQorICBzdGF0aWMgZnVuYyB2YWxpZGF0ZVZlcnNpb24oKSB7IEZsYXRCdWZmZXJzVmVyc2lvbl8yXzBfOCgpIH0KICAgcHVibGljIHZhciBfX2J1ZmZlcjogQnl0ZUJ1ZmZlciEgeyByZXR1cm4gX2FjY2Vzc29yLmJiIH0KICAgcHJpdmF0ZSB2YXIgX2FjY2Vzc29yOiBTdHJ1Y3QKIApAQCAtNjExLDEzICs2MTEsODAgQEAKICAgfQogfQogCitwdWJsaWMgc3RydWN0IE15R2FtZV9FeGFtcGxlX1N0cnVjdE9mU3RydWN0c09mU3RydWN0czogTmF0aXZlU3RydWN0LCBWZXJpZmlhYmxlLCBGbGF0YnVmZmVyc0luaXRpYWxpemFibGUsIE5hdGl2ZU9iamVjdCB7CisKKyAgc3RhdGljIGZ1bmMgdmFsaWRhdGVWZXJzaW9uKCkgeyBGbGF0QnVmZmVyc1ZlcnNpb25fMl8wXzgoKSB9CisKKyAgcHJpdmF0ZSB2YXIgX2E6IE15R2FtZV9FeGFtcGxlX1N0cnVjdE9mU3RydWN0cworCisgIHB1YmxpYyBpbml0KF8gYmI6IEJ5dGVCdWZmZXIsIG86IEludDMyKSB7CisgICAgbGV0IF9hY2Nlc3NvciA9IFN0cnVjdChiYjogYmIsIHBvc2l0aW9uOiBvKQorICAgIF9hID0gTXlHYW1lX0V4YW1wbGVfU3RydWN0T2ZTdHJ1Y3RzKF9hY2Nlc3Nvci5iYiwgbzogX2FjY2Vzc29yLnBvc3Rpb24gKyAwKQorICB9CisKKyAgcHVibGljIGluaXQoYTogTXlHYW1lX0V4YW1wbGVfU3RydWN0T2ZTdHJ1Y3RzKSB7CisgICAgX2EgPSBhCisgIH0KKworICBwdWJsaWMgaW5pdCgpIHsKKyAgICBfYSA9IE15R2FtZV9FeGFtcGxlX1N0cnVjdE9mU3RydWN0cygpCisgIH0KKworICBwdWJsaWMgaW5pdChfIF90OiBpbm91dCBNeUdhbWVfRXhhbXBsZV9TdHJ1Y3RPZlN0cnVjdHNPZlN0cnVjdHNfTXV0YWJsZSkgeworICAgIHZhciBfdmEgPSBfdC5hCisgICAgX2EgPSBfdmEudW5wYWNrKCkKKyAgfQorCisgIHB1YmxpYyB2YXIgYTogTXlHYW1lX0V4YW1wbGVfU3RydWN0T2ZTdHJ1Y3RzIHsgX2EgfQorCisgIHB1YmxpYyBzdGF0aWMgZnVuYyB2ZXJpZnk8VD4oXyB2ZXJpZmllcjogaW5vdXQgVmVyaWZpZXIsIGF0IHBvc2l0aW9uOiBJbnQsIG9mIHR5cGU6IFQuVHlwZSkgdGhyb3dzIHdoZXJlIFQ6IFZlcmlmaWFibGUgeworICAgIHRyeSB2ZXJpZmllci5pbkJ1ZmZlcihwb3NpdGlvbjogcG9zaXRpb24sIG9mOiBNeUdhbWVfRXhhbXBsZV9TdHJ1Y3RPZlN0cnVjdHNPZlN0cnVjdHMuc2VsZikKKyAgfQorfQorCitleHRlbnNpb24gTXlHYW1lX0V4YW1wbGVfU3RydWN0T2ZTdHJ1Y3RzT2ZTdHJ1Y3RzOiBFbmNvZGFibGUgeworCisgIGVudW0gQ29kaW5nS2V5czogU3RyaW5nLCBDb2RpbmdLZXkgeworICAgIGNhc2UgYSA9ICJhIgorICB9CisgIHB1YmxpYyBmdW5jIGVuY29kZSh0byBlbmNvZGVyOiBFbmNvZGVyKSB0aHJvd3MgeworICAgIHZhciBjb250YWluZXIgPSBlbmNvZGVyLmNvbnRhaW5lcihrZXllZEJ5OiBDb2RpbmdLZXlzLnNlbGYpCisgICAgdHJ5IGNvbnRhaW5lci5lbmNvZGVJZlByZXNlbnQoYSwgZm9yS2V5OiAuYSkKKyAgfQorfQorCitwdWJsaWMgc3RydWN0IE15R2FtZV9FeGFtcGxlX1N0cnVjdE9mU3RydWN0c09mU3RydWN0c19NdXRhYmxlOiBGbGF0QnVmZmVyT2JqZWN0IHsKKworICBzdGF0aWMgZnVuYyB2YWxpZGF0ZVZlcnNpb24oKSB7IEZsYXRCdWZmZXJzVmVyc2lvbl8yXzBfOCgpIH0KKyAgcHVibGljIHZhciBfX2J1ZmZlcjogQnl0ZUJ1ZmZlciEgeyByZXR1cm4gX2FjY2Vzc29yLmJiIH0KKyAgcHJpdmF0ZSB2YXIgX2FjY2Vzc29yOiBTdHJ1Y3QKKworICBwdWJsaWMgaW5pdChfIGJiOiBCeXRlQnVmZmVyLCBvOiBJbnQzMikgeyBfYWNjZXNzb3IgPSBTdHJ1Y3QoYmI6IGJiLCBwb3NpdGlvbjogbykgfQorCisgIHB1YmxpYyB2YXIgYTogTXlHYW1lX0V4YW1wbGVfU3RydWN0T2ZTdHJ1Y3RzX011dGFibGUgeyByZXR1cm4gTXlHYW1lX0V4YW1wbGVfU3RydWN0T2ZTdHJ1Y3RzX011dGFibGUoX2FjY2Vzc29yLmJiLCBvOiBfYWNjZXNzb3IucG9zdGlvbiArIDApIH0KKyAgCisKKyAgcHVibGljIG11dGF0aW5nIGZ1bmMgdW5wYWNrKCkgLT4gTXlHYW1lX0V4YW1wbGVfU3RydWN0T2ZTdHJ1Y3RzT2ZTdHJ1Y3RzIHsKKyAgICByZXR1cm4gTXlHYW1lX0V4YW1wbGVfU3RydWN0T2ZTdHJ1Y3RzT2ZTdHJ1Y3RzKCZzZWxmKQorICB9CisgIHB1YmxpYyBzdGF0aWMgZnVuYyBwYWNrKF8gYnVpbGRlcjogaW5vdXQgRmxhdEJ1ZmZlckJ1aWxkZXIsIG9iajogaW5vdXQgTXlHYW1lX0V4YW1wbGVfU3RydWN0T2ZTdHJ1Y3RzT2ZTdHJ1Y3RzPykgLT4gT2Zmc2V0IHsKKyAgICBndWFyZCB2YXIgb2JqID0gb2JqIGVsc2UgeyByZXR1cm4gT2Zmc2V0KCkgfQorICAgIHJldHVybiBwYWNrKCZidWlsZGVyLCBvYmo6ICZvYmopCisgIH0KKworICBwdWJsaWMgc3RhdGljIGZ1bmMgcGFjayhfIGJ1aWxkZXI6IGlub3V0IEZsYXRCdWZmZXJCdWlsZGVyLCBvYmo6IGlub3V0IE15R2FtZV9FeGFtcGxlX1N0cnVjdE9mU3RydWN0c09mU3RydWN0cykgLT4gT2Zmc2V0IHsKKyAgICByZXR1cm4gYnVpbGRlci5jcmVhdGUoc3RydWN0OiBvYmopCisgIH0KK30KKwogcHVibGljIHN0cnVjdCBNeUdhbWVfSW5QYXJlbnROYW1lc3BhY2U6IEZsYXRCdWZmZXJPYmplY3QsIFZlcmlmaWFibGUsIE9iamVjdEFQSVBhY2tlciB7CiAKLSAgc3RhdGljIGZ1bmMgdmFsaWRhdGVWZXJzaW9uKCkgeyBGbGF0QnVmZmVyc1ZlcnNpb25fMl8wXzAoKSB9CisgIHN0YXRpYyBmdW5jIHZhbGlkYXRlVmVyc2lvbigpIHsgRmxhdEJ1ZmZlcnNWZXJzaW9uXzJfMF84KCkgfQogICBwdWJsaWMgdmFyIF9fYnVmZmVyOiBCeXRlQnVmZmVyISB7IHJldHVybiBfYWNjZXNzb3IuYmIgfQogICBwcml2YXRlIHZhciBfYWNjZXNzb3I6IFRhYmxlCiAKLSAgcHVibGljIHN0YXRpYyBmdW5jIGZpbmlzaChfIGZiYjogaW5vdXQgRmxhdEJ1ZmZlckJ1aWxkZXIsIGVuZDogT2Zmc2V0LCBwcmVmaXg6IEJvb2wgPSBmYWxzZSkgeyBmYmIuZmluaXNoKG9mZnNldDogZW5kLCBmaWxlSWQ6ICJNT05TIiwgYWRkUHJlZml4OiBwcmVmaXgpIH0KKyAgcHVibGljIHN0YXRpYyB2YXIgaWQ6IFN0cmluZyB7ICJNT05TIiB9IAorICBwdWJsaWMgc3RhdGljIGZ1bmMgZmluaXNoKF8gZmJiOiBpbm91dCBGbGF0QnVmZmVyQnVpbGRlciwgZW5kOiBPZmZzZXQsIHByZWZpeDogQm9vbCA9IGZhbHNlKSB7IGZiYi5maW5pc2gob2Zmc2V0OiBlbmQsIGZpbGVJZDogTXlHYW1lX0luUGFyZW50TmFtZXNwYWNlLmlkLCBhZGRQcmVmaXg6IHByZWZpeCkgfQogICBwdWJsaWMgc3RhdGljIGZ1bmMgZ2V0Um9vdEFzSW5QYXJlbnROYW1lc3BhY2UoYmI6IEJ5dGVCdWZmZXIpIC0+IE15R2FtZV9JblBhcmVudE5hbWVzcGFjZSB7IHJldHVybiBNeUdhbWVfSW5QYXJlbnROYW1lc3BhY2UoVGFibGUoYmI6IGJiLCBwb3NpdGlvbjogSW50MzIoYmIucmVhZChkZWY6IFVPZmZzZXQuc2VsZiwgcG9zaXRpb246IGJiLnJlYWRlcikpICsgSW50MzIoYmIucmVhZGVyKSkpIH0KIAogICBwcml2YXRlIGluaXQoXyB0OiBUYWJsZSkgeyBfYWNjZXNzb3IgPSB0IH0KQEAgLTY2NiwxMSArNzMzLDEyIEBACiB9CiBwdWJsaWMgc3RydWN0IE15R2FtZV9FeGFtcGxlMl9Nb25zdGVyOiBGbGF0QnVmZmVyT2JqZWN0LCBWZXJpZmlhYmxlLCBPYmplY3RBUElQYWNrZXIgewogCi0gIHN0YXRpYyBmdW5jIHZhbGlkYXRlVmVyc2lvbigpIHsgRmxhdEJ1ZmZlcnNWZXJzaW9uXzJfMF8wKCkgfQorICBzdGF0aWMgZnVuYyB2YWxpZGF0ZVZlcnNpb24oKSB7IEZsYXRCdWZmZXJzVmVyc2lvbl8yXzBfOCgpIH0KICAgcHVibGljIHZhciBfX2J1ZmZlcjogQnl0ZUJ1ZmZlciEgeyByZXR1cm4gX2FjY2Vzc29yLmJiIH0KICAgcHJpdmF0ZSB2YXIgX2FjY2Vzc29yOiBUYWJsZQogCi0gIHB1YmxpYyBzdGF0aWMgZnVuYyBmaW5pc2goXyBmYmI6IGlub3V0IEZsYXRCdWZmZXJCdWlsZGVyLCBlbmQ6IE9mZnNldCwgcHJlZml4OiBCb29sID0gZmFsc2UpIHsgZmJiLmZpbmlzaChvZmZzZXQ6IGVuZCwgZmlsZUlkOiAiTU9OUyIsIGFkZFByZWZpeDogcHJlZml4KSB9CisgIHB1YmxpYyBzdGF0aWMgdmFyIGlkOiBTdHJpbmcgeyAiTU9OUyIgfSAKKyAgcHVibGljIHN0YXRpYyBmdW5jIGZpbmlzaChfIGZiYjogaW5vdXQgRmxhdEJ1ZmZlckJ1aWxkZXIsIGVuZDogT2Zmc2V0LCBwcmVmaXg6IEJvb2wgPSBmYWxzZSkgeyBmYmIuZmluaXNoKG9mZnNldDogZW5kLCBmaWxlSWQ6IE15R2FtZV9FeGFtcGxlMl9Nb25zdGVyLmlkLCBhZGRQcmVmaXg6IHByZWZpeCkgfQogICBwdWJsaWMgc3RhdGljIGZ1bmMgZ2V0Um9vdEFzTW9uc3RlcihiYjogQnl0ZUJ1ZmZlcikgLT4gTXlHYW1lX0V4YW1wbGUyX01vbnN0ZXIgeyByZXR1cm4gTXlHYW1lX0V4YW1wbGUyX01vbnN0ZXIoVGFibGUoYmI6IGJiLCBwb3NpdGlvbjogSW50MzIoYmIucmVhZChkZWY6IFVPZmZzZXQuc2VsZiwgcG9zaXRpb246IGJiLnJlYWRlcikpICsgSW50MzIoYmIucmVhZGVyKSkpIH0KIAogICBwcml2YXRlIGluaXQoXyB0OiBUYWJsZSkgeyBfYWNjZXNzb3IgPSB0IH0KQEAgLTcxOSwxMSArNzg3LDEyIEBACiB9CiBpbnRlcm5hbCBzdHJ1Y3QgTXlHYW1lX0V4YW1wbGVfVGVzdFNpbXBsZVRhYmxlV2l0aEVudW06IEZsYXRCdWZmZXJPYmplY3QsIFZlcmlmaWFibGUsIE9iamVjdEFQSVBhY2tlciB7CiAKLSAgc3RhdGljIGZ1bmMgdmFsaWRhdGVWZXJzaW9uKCkgeyBGbGF0QnVmZmVyc1ZlcnNpb25fMl8wXzAoKSB9CisgIHN0YXRpYyBmdW5jIHZhbGlkYXRlVmVyc2lvbigpIHsgRmxhdEJ1ZmZlcnNWZXJzaW9uXzJfMF84KCkgfQogICBpbnRlcm5hbCB2YXIgX19idWZmZXI6IEJ5dGVCdWZmZXIhIHsgcmV0dXJuIF9hY2Nlc3Nvci5iYiB9CiAgIHByaXZhdGUgdmFyIF9hY2Nlc3NvcjogVGFibGUKIAotICBpbnRlcm5hbCBzdGF0aWMgZnVuYyBmaW5pc2goXyBmYmI6IGlub3V0IEZsYXRCdWZmZXJCdWlsZGVyLCBlbmQ6IE9mZnNldCwgcHJlZml4OiBCb29sID0gZmFsc2UpIHsgZmJiLmZpbmlzaChvZmZzZXQ6IGVuZCwgZmlsZUlkOiAiTU9OUyIsIGFkZFByZWZpeDogcHJlZml4KSB9CisgIGludGVybmFsIHN0YXRpYyB2YXIgaWQ6IFN0cmluZyB7ICJNT05TIiB9IAorICBpbnRlcm5hbCBzdGF0aWMgZnVuYyBmaW5pc2goXyBmYmI6IGlub3V0IEZsYXRCdWZmZXJCdWlsZGVyLCBlbmQ6IE9mZnNldCwgcHJlZml4OiBCb29sID0gZmFsc2UpIHsgZmJiLmZpbmlzaChvZmZzZXQ6IGVuZCwgZmlsZUlkOiBNeUdhbWVfRXhhbXBsZV9UZXN0U2ltcGxlVGFibGVXaXRoRW51bS5pZCwgYWRkUHJlZml4OiBwcmVmaXgpIH0KICAgaW50ZXJuYWwgc3RhdGljIGZ1bmMgZ2V0Um9vdEFzVGVzdFNpbXBsZVRhYmxlV2l0aEVudW0oYmI6IEJ5dGVCdWZmZXIpIC0+IE15R2FtZV9FeGFtcGxlX1Rlc3RTaW1wbGVUYWJsZVdpdGhFbnVtIHsgcmV0dXJuIE15R2FtZV9FeGFtcGxlX1Rlc3RTaW1wbGVUYWJsZVdpdGhFbnVtKFRhYmxlKGJiOiBiYiwgcG9zaXRpb246IEludDMyKGJiLnJlYWQoZGVmOiBVT2Zmc2V0LnNlbGYsIHBvc2l0aW9uOiBiYi5yZWFkZXIpKSArIEludDMyKGJiLnJlYWRlcikpKSB9CiAKICAgcHJpdmF0ZSBpbml0KF8gdDogVGFibGUpIHsgX2FjY2Vzc29yID0gdCB9CkBAIC03NjQsNyArODMzLDcgQEAKICAgICByZXR1cm4gTXlHYW1lX0V4YW1wbGVfVGVzdFNpbXBsZVRhYmxlV2l0aEVudW0uZW5kVGVzdFNpbXBsZVRhYmxlV2l0aEVudW0oJmJ1aWxkZXIsIHN0YXJ0OiBfX3Jvb3QpCiAgIH0KIAotICBwdWJsaWMgc3RhdGljIGZ1bmMgdmVyaWZ5PFQ+KF8gdmVyaWZpZXI6IGlub3V0IFZlcmlmaWVyLCBhdCBwb3NpdGlvbjogSW50LCBvZiB0eXBlOiBULlR5cGUpIHRocm93cyB3aGVyZSBUOiBWZXJpZmlhYmxlIHsKKyAgaW50ZXJuYWwgc3RhdGljIGZ1bmMgdmVyaWZ5PFQ+KF8gdmVyaWZpZXI6IGlub3V0IFZlcmlmaWVyLCBhdCBwb3NpdGlvbjogSW50LCBvZiB0eXBlOiBULlR5cGUpIHRocm93cyB3aGVyZSBUOiBWZXJpZmlhYmxlIHsKICAgICB2YXIgX3YgPSB0cnkgdmVyaWZpZXIudmlzaXRUYWJsZShhdDogcG9zaXRpb24pCiAgICAgdHJ5IF92LnZpc2l0KGZpZWxkOiBWVE9GRlNFVC5jb2xvci5wLCBmaWVsZE5hbWU6ICJjb2xvciIsIHJlcXVpcmVkOiBmYWxzZSwgdHlwZTogTXlHYW1lX0V4YW1wbGVfQ29sb3Iuc2VsZikKICAgICBfdi5maW5pc2goKQpAQCAtNzc2LDcgKzg0NSw3IEBACiAgIGVudW0gQ29kaW5nS2V5czogU3RyaW5nLCBDb2RpbmdLZXkgewogICAgIGNhc2UgY29sb3IgPSAiY29sb3IiCiAgIH0KLSAgcHVibGljIGZ1bmMgZW5jb2RlKHRvIGVuY29kZXI6IEVuY29kZXIpIHRocm93cyB7CisgIGludGVybmFsIGZ1bmMgZW5jb2RlKHRvIGVuY29kZXI6IEVuY29kZXIpIHRocm93cyB7CiAgICAgdmFyIGNvbnRhaW5lciA9IGVuY29kZXIuY29udGFpbmVyKGtleWVkQnk6IENvZGluZ0tleXMuc2VsZikKICAgICBpZiBjb2xvciAhPSAuZ3JlZW4gewogICAgICAgdHJ5IGNvbnRhaW5lci5lbmNvZGVJZlByZXNlbnQoY29sb3IsIGZvcktleTogLmNvbG9yKQpAQCAtODAxLDExICs4NzAsMTIgQEAKIH0KIHB1YmxpYyBzdHJ1Y3QgTXlHYW1lX0V4YW1wbGVfU3RhdDogRmxhdEJ1ZmZlck9iamVjdCwgVmVyaWZpYWJsZSwgT2JqZWN0QVBJUGFja2VyIHsKIAotICBzdGF0aWMgZnVuYyB2YWxpZGF0ZVZlcnNpb24oKSB7IEZsYXRCdWZmZXJzVmVyc2lvbl8yXzBfMCgpIH0KKyAgc3RhdGljIGZ1bmMgdmFsaWRhdGVWZXJzaW9uKCkgeyBGbGF0QnVmZmVyc1ZlcnNpb25fMl8wXzgoKSB9CiAgIHB1YmxpYyB2YXIgX19idWZmZXI6IEJ5dGVCdWZmZXIhIHsgcmV0dXJuIF9hY2Nlc3Nvci5iYiB9CiAgIHByaXZhdGUgdmFyIF9hY2Nlc3NvcjogVGFibGUKIAotICBwdWJsaWMgc3RhdGljIGZ1bmMgZmluaXNoKF8gZmJiOiBpbm91dCBGbGF0QnVmZmVyQnVpbGRlciwgZW5kOiBPZmZzZXQsIHByZWZpeDogQm9vbCA9IGZhbHNlKSB7IGZiYi5maW5pc2gob2Zmc2V0OiBlbmQsIGZpbGVJZDogIk1PTlMiLCBhZGRQcmVmaXg6IHByZWZpeCkgfQorICBwdWJsaWMgc3RhdGljIHZhciBpZDogU3RyaW5nIHsgIk1PTlMiIH0gCisgIHB1YmxpYyBzdGF0aWMgZnVuYyBmaW5pc2goXyBmYmI6IGlub3V0IEZsYXRCdWZmZXJCdWlsZGVyLCBlbmQ6IE9mZnNldCwgcHJlZml4OiBCb29sID0gZmFsc2UpIHsgZmJiLmZpbmlzaChvZmZzZXQ6IGVuZCwgZmlsZUlkOiBNeUdhbWVfRXhhbXBsZV9TdGF0LmlkLCBhZGRQcmVmaXg6IHByZWZpeCkgfQogICBwdWJsaWMgc3RhdGljIGZ1bmMgZ2V0Um9vdEFzU3RhdChiYjogQnl0ZUJ1ZmZlcikgLT4gTXlHYW1lX0V4YW1wbGVfU3RhdCB7IHJldHVybiBNeUdhbWVfRXhhbXBsZV9TdGF0KFRhYmxlKGJiOiBiYiwgcG9zaXRpb246IEludDMyKGJiLnJlYWQoZGVmOiBVT2Zmc2V0LnNlbGYsIHBvc2l0aW9uOiBiYi5yZWFkZXIpKSArIEludDMyKGJiLnJlYWRlcikpKSB9CiAKICAgcHJpdmF0ZSBpbml0KF8gdDogVGFibGUpIHsgX2FjY2Vzc29yID0gdCB9CkBAIC05NDEsMTEgKzEwMTEsMTIgQEAKIH0KIHB1YmxpYyBzdHJ1Y3QgTXlHYW1lX0V4YW1wbGVfUmVmZXJyYWJsZTogRmxhdEJ1ZmZlck9iamVjdCwgVmVyaWZpYWJsZSwgT2JqZWN0QVBJUGFja2VyIHsKIAotICBzdGF0aWMgZnVuYyB2YWxpZGF0ZVZlcnNpb24oKSB7IEZsYXRCdWZmZXJzVmVyc2lvbl8yXzBfMCgpIH0KKyAgc3RhdGljIGZ1bmMgdmFsaWRhdGVWZXJzaW9uKCkgeyBGbGF0QnVmZmVyc1ZlcnNpb25fMl8wXzgoKSB9CiAgIHB1YmxpYyB2YXIgX19idWZmZXI6IEJ5dGVCdWZmZXIhIHsgcmV0dXJuIF9hY2Nlc3Nvci5iYiB9CiAgIHByaXZhdGUgdmFyIF9hY2Nlc3NvcjogVGFibGUKIAotICBwdWJsaWMgc3RhdGljIGZ1bmMgZmluaXNoKF8gZmJiOiBpbm91dCBGbGF0QnVmZmVyQnVpbGRlciwgZW5kOiBPZmZzZXQsIHByZWZpeDogQm9vbCA9IGZhbHNlKSB7IGZiYi5maW5pc2gob2Zmc2V0OiBlbmQsIGZpbGVJZDogIk1PTlMiLCBhZGRQcmVmaXg6IHByZWZpeCkgfQorICBwdWJsaWMgc3RhdGljIHZhciBpZDogU3RyaW5nIHsgIk1PTlMiIH0gCisgIHB1YmxpYyBzdGF0aWMgZnVuYyBmaW5pc2goXyBmYmI6IGlub3V0IEZsYXRCdWZmZXJCdWlsZGVyLCBlbmQ6IE9mZnNldCwgcHJlZml4OiBCb29sID0gZmFsc2UpIHsgZmJiLmZpbmlzaChvZmZzZXQ6IGVuZCwgZmlsZUlkOiBNeUdhbWVfRXhhbXBsZV9SZWZlcnJhYmxlLmlkLCBhZGRQcmVmaXg6IHByZWZpeCkgfQogICBwdWJsaWMgc3RhdGljIGZ1bmMgZ2V0Um9vdEFzUmVmZXJyYWJsZShiYjogQnl0ZUJ1ZmZlcikgLT4gTXlHYW1lX0V4YW1wbGVfUmVmZXJyYWJsZSB7IHJldHVybiBNeUdhbWVfRXhhbXBsZV9SZWZlcnJhYmxlKFRhYmxlKGJiOiBiYiwgcG9zaXRpb246IEludDMyKGJiLnJlYWQoZGVmOiBVT2Zmc2V0LnNlbGYsIHBvc2l0aW9uOiBiYi5yZWFkZXIpKSArIEludDMyKGJiLnJlYWRlcikpKSB9CiAKICAgcHJpdmF0ZSBpbml0KF8gdDogVGFibGUpIHsgX2FjY2Vzc29yID0gdCB9CkBAIC0xMDQ4LDExICsxMTE5LDEyIEBACiAvLy8gIGFuIGV4YW1wbGUgZG9jdW1lbnRhdGlvbiBjb21tZW50OiAibW9uc3RlciBvYmplY3QiCiBwdWJsaWMgc3RydWN0IE15R2FtZV9FeGFtcGxlX01vbnN0ZXI6IEZsYXRCdWZmZXJPYmplY3QsIFZlcmlmaWFibGUsIE9iamVjdEFQSVBhY2tlciB7CiAKLSAgc3RhdGljIGZ1bmMgdmFsaWRhdGVWZXJzaW9uKCkgeyBGbGF0QnVmZmVyc1ZlcnNpb25fMl8wXzAoKSB9CisgIHN0YXRpYyBmdW5jIHZhbGlkYXRlVmVyc2lvbigpIHsgRmxhdEJ1ZmZlcnNWZXJzaW9uXzJfMF84KCkgfQogICBwdWJsaWMgdmFyIF9fYnVmZmVyOiBCeXRlQnVmZmVyISB7IHJldHVybiBfYWNjZXNzb3IuYmIgfQogICBwcml2YXRlIHZhciBfYWNjZXNzb3I6IFRhYmxlCiAKLSAgcHVibGljIHN0YXRpYyBmdW5jIGZpbmlzaChfIGZiYjogaW5vdXQgRmxhdEJ1ZmZlckJ1aWxkZXIsIGVuZDogT2Zmc2V0LCBwcmVmaXg6IEJvb2wgPSBmYWxzZSkgeyBmYmIuZmluaXNoKG9mZnNldDogZW5kLCBmaWxlSWQ6ICJNT05TIiwgYWRkUHJlZml4OiBwcmVmaXgpIH0KKyAgcHVibGljIHN0YXRpYyB2YXIgaWQ6IFN0cmluZyB7ICJNT05TIiB9IAorICBwdWJsaWMgc3RhdGljIGZ1bmMgZmluaXNoKF8gZmJiOiBpbm91dCBGbGF0QnVmZmVyQnVpbGRlciwgZW5kOiBPZmZzZXQsIHByZWZpeDogQm9vbCA9IGZhbHNlKSB7IGZiYi5maW5pc2gob2Zmc2V0OiBlbmQsIGZpbGVJZDogTXlHYW1lX0V4YW1wbGVfTW9uc3Rlci5pZCwgYWRkUHJlZml4OiBwcmVmaXgpIH0KICAgcHVibGljIHN0YXRpYyBmdW5jIGdldFJvb3RBc01vbnN0ZXIoYmI6IEJ5dGVCdWZmZXIpIC0+IE15R2FtZV9FeGFtcGxlX01vbnN0ZXIgeyByZXR1cm4gTXlHYW1lX0V4YW1wbGVfTW9uc3RlcihUYWJsZShiYjogYmIsIHBvc2l0aW9uOiBJbnQzMihiYi5yZWFkKGRlZjogVU9mZnNldC5zZWxmLCBwb3NpdGlvbjogYmIucmVhZGVyKSkgKyBJbnQzMihiYi5yZWFkZXIpKSkgfQogCiAgIHByaXZhdGUgaW5pdChfIHQ6IFRhYmxlKSB7IF9hY2Nlc3NvciA9IHQgfQpAQCAtMTEyNCw2ICsxMTk2LDcgQEAKICAgQGRpc2NhcmRhYmxlUmVzdWx0IHB1YmxpYyBmdW5jIG11dGF0ZShocDogSW50MTYpIC0+IEJvb2wge2xldCBvID0gX2FjY2Vzc29yLm9mZnNldChWVE9GRlNFVC5ocC52KTsgIHJldHVybiBfYWNjZXNzb3IubXV0YXRlKGhwLCBpbmRleDogbykgfQogICBwdWJsaWMgdmFyIG5hbWU6IFN0cmluZyEgeyBsZXQgbyA9IF9hY2Nlc3Nvci5vZmZzZXQoVlRPRkZTRVQubmFtZS52KTsgcmV0dXJuIF9hY2Nlc3Nvci5zdHJpbmcoYXQ6IG8pIH0KICAgcHVibGljIHZhciBuYW1lU2VnbWVudEFycmF5OiBbVUludDhdISB7IHJldHVybiBfYWNjZXNzb3IuZ2V0VmVjdG9yKGF0OiBWVE9GRlNFVC5uYW1lLnYpIH0KKyAgcHVibGljIHZhciBoYXNJbnZlbnRvcnk6IEJvb2wgeyBsZXQgbyA9IF9hY2Nlc3Nvci5vZmZzZXQoVlRPRkZTRVQuaW52ZW50b3J5LnYpOyByZXR1cm4gbyA9PSAwID8gZmFsc2UgOiB0cnVlIH0KICAgcHVibGljIHZhciBpbnZlbnRvcnlDb3VudDogSW50MzIgeyBsZXQgbyA9IF9hY2Nlc3Nvci5vZmZzZXQoVlRPRkZTRVQuaW52ZW50b3J5LnYpOyByZXR1cm4gbyA9PSAwID8gMCA6IF9hY2Nlc3Nvci52ZWN0b3IoY291bnQ6IG8pIH0KICAgcHVibGljIGZ1bmMgaW52ZW50b3J5KGF0IGluZGV4OiBJbnQzMikgLT4gVUludDggeyBsZXQgbyA9IF9hY2Nlc3Nvci5vZmZzZXQoVlRPRkZTRVQuaW52ZW50b3J5LnYpOyByZXR1cm4gbyA9PSAwID8gMCA6IF9hY2Nlc3Nvci5kaXJlY3RSZWFkKG9mOiBVSW50OC5zZWxmLCBvZmZzZXQ6IF9hY2Nlc3Nvci52ZWN0b3IoYXQ6IG8pICsgaW5kZXggKiAxKSB9CiAgIHB1YmxpYyB2YXIgaW52ZW50b3J5OiBbVUludDhdIHsgcmV0dXJuIF9hY2Nlc3Nvci5nZXRWZWN0b3IoYXQ6IFZUT0ZGU0VULmludmVudG9yeS52KSA/PyBbXSB9CkBAIC0xMTMyLDE3ICsxMjA1LDIxIEBACiAgIEBkaXNjYXJkYWJsZVJlc3VsdCBwdWJsaWMgZnVuYyBtdXRhdGUoY29sb3I6IE15R2FtZV9FeGFtcGxlX0NvbG9yKSAtPiBCb29sIHtsZXQgbyA9IF9hY2Nlc3Nvci5vZmZzZXQoVlRPRkZTRVQuY29sb3Iudik7ICByZXR1cm4gX2FjY2Vzc29yLm11dGF0ZShjb2xvci5yYXdWYWx1ZSwgaW5kZXg6IG8pIH0KICAgcHVibGljIHZhciB0ZXN0VHlwZTogTXlHYW1lX0V4YW1wbGVfQW55XyB7IGxldCBvID0gX2FjY2Vzc29yLm9mZnNldChWVE9GRlNFVC50ZXN0VHlwZS52KTsgcmV0dXJuIG8gPT0gMCA/IC5ub25lXyA6IE15R2FtZV9FeGFtcGxlX0FueV8ocmF3VmFsdWU6IF9hY2Nlc3Nvci5yZWFkQnVmZmVyKG9mOiBVSW50OC5zZWxmLCBhdDogbykpID8/IC5ub25lXyB9CiAgIHB1YmxpYyBmdW5jIHRlc3Q8VDogRmxhdGJ1ZmZlcnNJbml0aWFsaXphYmxlPih0eXBlOiBULlR5cGUpIC0+IFQ/IHsgbGV0IG8gPSBfYWNjZXNzb3Iub2Zmc2V0KFZUT0ZGU0VULnRlc3Qudik7IHJldHVybiBvID09IDAgPyBuaWwgOiBfYWNjZXNzb3IudW5pb24obykgfQorICBwdWJsaWMgdmFyIGhhc1Rlc3Q0OiBCb29sIHsgbGV0IG8gPSBfYWNjZXNzb3Iub2Zmc2V0KFZUT0ZGU0VULnRlc3Q0LnYpOyByZXR1cm4gbyA9PSAwID8gZmFsc2UgOiB0cnVlIH0KICAgcHVibGljIHZhciB0ZXN0NENvdW50OiBJbnQzMiB7IGxldCBvID0gX2FjY2Vzc29yLm9mZnNldChWVE9GRlNFVC50ZXN0NC52KTsgcmV0dXJuIG8gPT0gMCA/IDAgOiBfYWNjZXNzb3IudmVjdG9yKGNvdW50OiBvKSB9CiAgIHB1YmxpYyBmdW5jIHRlc3Q0KGF0IGluZGV4OiBJbnQzMikgLT4gTXlHYW1lX0V4YW1wbGVfVGVzdD8geyBsZXQgbyA9IF9hY2Nlc3Nvci5vZmZzZXQoVlRPRkZTRVQudGVzdDQudik7IHJldHVybiBvID09IDAgPyBuaWwgOiBfYWNjZXNzb3IuZGlyZWN0UmVhZChvZjogTXlHYW1lX0V4YW1wbGVfVGVzdC5zZWxmLCBvZmZzZXQ6IF9hY2Nlc3Nvci52ZWN0b3IoYXQ6IG8pICsgaW5kZXggKiA0KSB9CiAgIHB1YmxpYyBmdW5jIG11dGFibGVUZXN0NChhdCBpbmRleDogSW50MzIpIC0+IE15R2FtZV9FeGFtcGxlX1Rlc3RfTXV0YWJsZT8geyBsZXQgbyA9IF9hY2Nlc3Nvci5vZmZzZXQoVlRPRkZTRVQudGVzdDQudik7IHJldHVybiBvID09IDAgPyBuaWwgOiBNeUdhbWVfRXhhbXBsZV9UZXN0X011dGFibGUoX2FjY2Vzc29yLmJiLCBvOiBfYWNjZXNzb3IudmVjdG9yKGF0OiBvKSArIGluZGV4ICogNCkgfQorICBwdWJsaWMgdmFyIGhhc1Rlc3RhcnJheW9mc3RyaW5nOiBCb29sIHsgbGV0IG8gPSBfYWNjZXNzb3Iub2Zmc2V0KFZUT0ZGU0VULnRlc3RhcnJheW9mc3RyaW5nLnYpOyByZXR1cm4gbyA9PSAwID8gZmFsc2UgOiB0cnVlIH0KICAgcHVibGljIHZhciB0ZXN0YXJyYXlvZnN0cmluZ0NvdW50OiBJbnQzMiB7IGxldCBvID0gX2FjY2Vzc29yLm9mZnNldChWVE9GRlNFVC50ZXN0YXJyYXlvZnN0cmluZy52KTsgcmV0dXJuIG8gPT0gMCA/IDAgOiBfYWNjZXNzb3IudmVjdG9yKGNvdW50OiBvKSB9CiAgIHB1YmxpYyBmdW5jIHRlc3RhcnJheW9mc3RyaW5nKGF0IGluZGV4OiBJbnQzMikgLT4gU3RyaW5nPyB7IGxldCBvID0gX2FjY2Vzc29yLm9mZnNldChWVE9GRlNFVC50ZXN0YXJyYXlvZnN0cmluZy52KTsgcmV0dXJuIG8gPT0gMCA/IG5pbCA6IF9hY2Nlc3Nvci5kaXJlY3RTdHJpbmcoYXQ6IF9hY2Nlc3Nvci52ZWN0b3IoYXQ6IG8pICsgaW5kZXggKiA0KSB9CiAgIC8vLyAgYW4gZXhhbXBsZSBkb2N1bWVudGF0aW9uIGNvbW1lbnQ6IHRoaXMgd2lsbCBlbmQgdXAgaW4gdGhlIGdlbmVyYXRlZCBjb2RlCiAgIC8vLyAgbXVsdGlsaW5lIHRvbworICBwdWJsaWMgdmFyIGhhc1Rlc3RhcnJheW9mdGFibGVzOiBCb29sIHsgbGV0IG8gPSBfYWNjZXNzb3Iub2Zmc2V0KFZUT0ZGU0VULnRlc3RhcnJheW9mdGFibGVzLnYpOyByZXR1cm4gbyA9PSAwID8gZmFsc2UgOiB0cnVlIH0KICAgcHVibGljIHZhciB0ZXN0YXJyYXlvZnRhYmxlc0NvdW50OiBJbnQzMiB7IGxldCBvID0gX2FjY2Vzc29yLm9mZnNldChWVE9GRlNFVC50ZXN0YXJyYXlvZnRhYmxlcy52KTsgcmV0dXJuIG8gPT0gMCA/IDAgOiBfYWNjZXNzb3IudmVjdG9yKGNvdW50OiBvKSB9CiAgIHB1YmxpYyBmdW5jIHRlc3RhcnJheW9mdGFibGVzKGF0IGluZGV4OiBJbnQzMikgLT4gTXlHYW1lX0V4YW1wbGVfTW9uc3Rlcj8geyBsZXQgbyA9IF9hY2Nlc3Nvci5vZmZzZXQoVlRPRkZTRVQudGVzdGFycmF5b2Z0YWJsZXMudik7IHJldHVybiBvID09IDAgPyBuaWwgOiBNeUdhbWVfRXhhbXBsZV9Nb25zdGVyKF9hY2Nlc3Nvci5iYiwgbzogX2FjY2Vzc29yLmluZGlyZWN0KF9hY2Nlc3Nvci52ZWN0b3IoYXQ6IG8pICsgaW5kZXggKiA0KSkgfQogICBwdWJsaWMgZnVuYyB0ZXN0YXJyYXlvZnRhYmxlc0J5KGtleTogU3RyaW5nKSAtPiBNeUdhbWVfRXhhbXBsZV9Nb25zdGVyPyB7IGxldCBvID0gX2FjY2Vzc29yLm9mZnNldChWVE9GRlNFVC50ZXN0YXJyYXlvZnRhYmxlcy52KTsgcmV0dXJuIG8gPT0gMCA/IG5pbCA6IE15R2FtZV9FeGFtcGxlX01vbnN0ZXIubG9va3VwQnlLZXkodmVjdG9yOiBfYWNjZXNzb3IudmVjdG9yKGF0OiBvKSwga2V5OiBrZXksIGZiYjogX2FjY2Vzc29yLmJiKSB9CiAgIHB1YmxpYyB2YXIgZW5lbXk6IE15R2FtZV9FeGFtcGxlX01vbnN0ZXI/IHsgbGV0IG8gPSBfYWNjZXNzb3Iub2Zmc2V0KFZUT0ZGU0VULmVuZW15LnYpOyByZXR1cm4gbyA9PSAwID8gbmlsIDogTXlHYW1lX0V4YW1wbGVfTW9uc3RlcihfYWNjZXNzb3IuYmIsIG86IF9hY2Nlc3Nvci5pbmRpcmVjdChvICsgX2FjY2Vzc29yLnBvc3Rpb24pKSB9CisgIHB1YmxpYyB2YXIgaGFzVGVzdG5lc3RlZGZsYXRidWZmZXI6IEJvb2wgeyBsZXQgbyA9IF9hY2Nlc3Nvci5vZmZzZXQoVlRPRkZTRVQudGVzdG5lc3RlZGZsYXRidWZmZXIudik7IHJldHVybiBvID09IDAgPyBmYWxzZSA6IHRydWUgfQogICBwdWJsaWMgdmFyIHRlc3RuZXN0ZWRmbGF0YnVmZmVyQ291bnQ6IEludDMyIHsgbGV0IG8gPSBfYWNjZXNzb3Iub2Zmc2V0KFZUT0ZGU0VULnRlc3RuZXN0ZWRmbGF0YnVmZmVyLnYpOyByZXR1cm4gbyA9PSAwID8gMCA6IF9hY2Nlc3Nvci52ZWN0b3IoY291bnQ6IG8pIH0KICAgcHVibGljIGZ1bmMgdGVzdG5lc3RlZGZsYXRidWZmZXIoYXQgaW5kZXg6IEludDMyKSAtPiBVSW50OCB7IGxldCBvID0gX2FjY2Vzc29yLm9mZnNldChWVE9GRlNFVC50ZXN0bmVzdGVkZmxhdGJ1ZmZlci52KTsgcmV0dXJuIG8gPT0gMCA/IDAgOiBfYWNjZXNzb3IuZGlyZWN0UmVhZChvZjogVUludDguc2VsZiwgb2Zmc2V0OiBfYWNjZXNzb3IudmVjdG9yKGF0OiBvKSArIGluZGV4ICogMSkgfQogICBwdWJsaWMgdmFyIHRlc3RuZXN0ZWRmbGF0YnVmZmVyOiBbVUludDhdIHsgcmV0dXJuIF9hY2Nlc3Nvci5nZXRWZWN0b3IoYXQ6IFZUT0ZGU0VULnRlc3RuZXN0ZWRmbGF0YnVmZmVyLnYpID8/IFtdIH0KQEAgLTExNjYsNiArMTI0Myw3IEBACiAgIEBkaXNjYXJkYWJsZVJlc3VsdCBwdWJsaWMgZnVuYyBtdXRhdGUodGVzdGhhc2hzNjRGbnYxYTogSW50NjQpIC0+IEJvb2wge2xldCBvID0gX2FjY2Vzc29yLm9mZnNldChWVE9GRlNFVC50ZXN0aGFzaHM2NEZudjFhLnYpOyAgcmV0dXJuIF9hY2Nlc3Nvci5tdXRhdGUodGVzdGhhc2hzNjRGbnYxYSwgaW5kZXg6IG8pIH0KICAgcHVibGljIHZhciB0ZXN0aGFzaHU2NEZudjFhOiBVSW50NjQgeyBsZXQgbyA9IF9hY2Nlc3Nvci5vZmZzZXQoVlRPRkZTRVQudGVzdGhhc2h1NjRGbnYxYS52KTsgcmV0dXJuIG8gPT0gMCA/IDAgOiBfYWNjZXNzb3IucmVhZEJ1ZmZlcihvZjogVUludDY0LnNlbGYsIGF0OiBvKSB9CiAgIEBkaXNjYXJkYWJsZVJlc3VsdCBwdWJsaWMgZnVuYyBtdXRhdGUodGVzdGhhc2h1NjRGbnYxYTogVUludDY0KSAtPiBCb29sIHtsZXQgbyA9IF9hY2Nlc3Nvci5vZmZzZXQoVlRPRkZTRVQudGVzdGhhc2h1NjRGbnYxYS52KTsgIHJldHVybiBfYWNjZXNzb3IubXV0YXRlKHRlc3RoYXNodTY0Rm52MWEsIGluZGV4OiBvKSB9CisgIHB1YmxpYyB2YXIgaGFzVGVzdGFycmF5b2Zib29sczogQm9vbCB7IGxldCBvID0gX2FjY2Vzc29yLm9mZnNldChWVE9GRlNFVC50ZXN0YXJyYXlvZmJvb2xzLnYpOyByZXR1cm4gbyA9PSAwID8gZmFsc2UgOiB0cnVlIH0KICAgcHVibGljIHZhciB0ZXN0YXJyYXlvZmJvb2xzQ291bnQ6IEludDMyIHsgbGV0IG8gPSBfYWNjZXNzb3Iub2Zmc2V0KFZUT0ZGU0VULnRlc3RhcnJheW9mYm9vbHMudik7IHJldHVybiBvID09IDAgPyAwIDogX2FjY2Vzc29yLnZlY3Rvcihjb3VudDogbykgfQogICBwdWJsaWMgZnVuYyB0ZXN0YXJyYXlvZmJvb2xzKGF0IGluZGV4OiBJbnQzMikgLT4gQm9vbCB7IGxldCBvID0gX2FjY2Vzc29yLm9mZnNldChWVE9GRlNFVC50ZXN0YXJyYXlvZmJvb2xzLnYpOyByZXR1cm4gbyA9PSAwID8gdHJ1ZSA6IF9hY2Nlc3Nvci5kaXJlY3RSZWFkKG9mOiBCb29sLnNlbGYsIG9mZnNldDogX2FjY2Vzc29yLnZlY3RvcihhdDogbykgKyBpbmRleCAqIDEpIH0KICAgcHVibGljIHZhciB0ZXN0YXJyYXlvZmJvb2xzOiBbQm9vbF0geyByZXR1cm4gX2FjY2Vzc29yLmdldFZlY3RvcihhdDogVlRPRkZTRVQudGVzdGFycmF5b2Zib29scy52KSA/PyBbXSB9CkBAIC0xMTc2LDQ3ICsxMjU0LDU4IEBACiAgIEBkaXNjYXJkYWJsZVJlc3VsdCBwdWJsaWMgZnVuYyBtdXRhdGUodGVzdGYyOiBGbG9hdDMyKSAtPiBCb29sIHtsZXQgbyA9IF9hY2Nlc3Nvci5vZmZzZXQoVlRPRkZTRVQudGVzdGYyLnYpOyAgcmV0dXJuIF9hY2Nlc3Nvci5tdXRhdGUodGVzdGYyLCBpbmRleDogbykgfQogICBwdWJsaWMgdmFyIHRlc3RmMzogRmxvYXQzMiB7IGxldCBvID0gX2FjY2Vzc29yLm9mZnNldChWVE9GRlNFVC50ZXN0ZjMudik7IHJldHVybiBvID09IDAgPyAwLjAgOiBfYWNjZXNzb3IucmVhZEJ1ZmZlcihvZjogRmxvYXQzMi5zZWxmLCBhdDogbykgfQogICBAZGlzY2FyZGFibGVSZXN1bHQgcHVibGljIGZ1bmMgbXV0YXRlKHRlc3RmMzogRmxvYXQzMikgLT4gQm9vbCB7bGV0IG8gPSBfYWNjZXNzb3Iub2Zmc2V0KFZUT0ZGU0VULnRlc3RmMy52KTsgIHJldHVybiBfYWNjZXNzb3IubXV0YXRlKHRlc3RmMywgaW5kZXg6IG8pIH0KKyAgcHVibGljIHZhciBoYXNUZXN0YXJyYXlvZnN0cmluZzI6IEJvb2wgeyBsZXQgbyA9IF9hY2Nlc3Nvci5vZmZzZXQoVlRPRkZTRVQudGVzdGFycmF5b2ZzdHJpbmcyLnYpOyByZXR1cm4gbyA9PSAwID8gZmFsc2UgOiB0cnVlIH0KICAgcHVibGljIHZhciB0ZXN0YXJyYXlvZnN0cmluZzJDb3VudDogSW50MzIgeyBsZXQgbyA9IF9hY2Nlc3Nvci5vZmZzZXQoVlRPRkZTRVQudGVzdGFycmF5b2ZzdHJpbmcyLnYpOyByZXR1cm4gbyA9PSAwID8gMCA6IF9hY2Nlc3Nvci52ZWN0b3IoY291bnQ6IG8pIH0KICAgcHVibGljIGZ1bmMgdGVzdGFycmF5b2ZzdHJpbmcyKGF0IGluZGV4OiBJbnQzMikgLT4gU3RyaW5nPyB7IGxldCBvID0gX2FjY2Vzc29yLm9mZnNldChWVE9GRlNFVC50ZXN0YXJyYXlvZnN0cmluZzIudik7IHJldHVybiBvID09IDAgPyBuaWwgOiBfYWNjZXNzb3IuZGlyZWN0U3RyaW5nKGF0OiBfYWNjZXNzb3IudmVjdG9yKGF0OiBvKSArIGluZGV4ICogNCkgfQorICBwdWJsaWMgdmFyIGhhc1Rlc3RhcnJheW9mc29ydGVkc3RydWN0OiBCb29sIHsgbGV0IG8gPSBfYWNjZXNzb3Iub2Zmc2V0KFZUT0ZGU0VULnRlc3RhcnJheW9mc29ydGVkc3RydWN0LnYpOyByZXR1cm4gbyA9PSAwID8gZmFsc2UgOiB0cnVlIH0KICAgcHVibGljIHZhciB0ZXN0YXJyYXlvZnNvcnRlZHN0cnVjdENvdW50OiBJbnQzMiB7IGxldCBvID0gX2FjY2Vzc29yLm9mZnNldChWVE9GRlNFVC50ZXN0YXJyYXlvZnNvcnRlZHN0cnVjdC52KTsgcmV0dXJuIG8gPT0gMCA/IDAgOiBfYWNjZXNzb3IudmVjdG9yKGNvdW50OiBvKSB9CiAgIHB1YmxpYyBmdW5jIHRlc3RhcnJheW9mc29ydGVkc3RydWN0KGF0IGluZGV4OiBJbnQzMikgLT4gTXlHYW1lX0V4YW1wbGVfQWJpbGl0eT8geyBsZXQgbyA9IF9hY2Nlc3Nvci5vZmZzZXQoVlRPRkZTRVQudGVzdGFycmF5b2Zzb3J0ZWRzdHJ1Y3Qudik7IHJldHVybiBvID09IDAgPyBuaWwgOiBfYWNjZXNzb3IuZGlyZWN0UmVhZChvZjogTXlHYW1lX0V4YW1wbGVfQWJpbGl0eS5zZWxmLCBvZmZzZXQ6IF9hY2Nlc3Nvci52ZWN0b3IoYXQ6IG8pICsgaW5kZXggKiA4KSB9CiAgIHB1YmxpYyBmdW5jIG11dGFibGVUZXN0YXJyYXlvZnNvcnRlZHN0cnVjdChhdCBpbmRleDogSW50MzIpIC0+IE15R2FtZV9FeGFtcGxlX0FiaWxpdHlfTXV0YWJsZT8geyBsZXQgbyA9IF9hY2Nlc3Nvci5vZmZzZXQoVlRPRkZTRVQudGVzdGFycmF5b2Zzb3J0ZWRzdHJ1Y3Qudik7IHJldHVybiBvID09IDAgPyBuaWwgOiBNeUdhbWVfRXhhbXBsZV9BYmlsaXR5X011dGFibGUoX2FjY2Vzc29yLmJiLCBvOiBfYWNjZXNzb3IudmVjdG9yKGF0OiBvKSArIGluZGV4ICogOCkgfQorICBwdWJsaWMgdmFyIGhhc0ZsZXg6IEJvb2wgeyBsZXQgbyA9IF9hY2Nlc3Nvci5vZmZzZXQoVlRPRkZTRVQuZmxleC52KTsgcmV0dXJuIG8gPT0gMCA/IGZhbHNlIDogdHJ1ZSB9CiAgIHB1YmxpYyB2YXIgZmxleENvdW50OiBJbnQzMiB7IGxldCBvID0gX2FjY2Vzc29yLm9mZnNldChWVE9GRlNFVC5mbGV4LnYpOyByZXR1cm4gbyA9PSAwID8gMCA6IF9hY2Nlc3Nvci52ZWN0b3IoY291bnQ6IG8pIH0KICAgcHVibGljIGZ1bmMgZmxleChhdCBpbmRleDogSW50MzIpIC0+IFVJbnQ4IHsgbGV0IG8gPSBfYWNjZXNzb3Iub2Zmc2V0KFZUT0ZGU0VULmZsZXgudik7IHJldHVybiBvID09IDAgPyAwIDogX2FjY2Vzc29yLmRpcmVjdFJlYWQob2Y6IFVJbnQ4LnNlbGYsIG9mZnNldDogX2FjY2Vzc29yLnZlY3RvcihhdDogbykgKyBpbmRleCAqIDEpIH0KICAgcHVibGljIHZhciBmbGV4OiBbVUludDhdIHsgcmV0dXJuIF9hY2Nlc3Nvci5nZXRWZWN0b3IoYXQ6IFZUT0ZGU0VULmZsZXgudikgPz8gW10gfQogICBwdWJsaWMgZnVuYyBtdXRhdGUoZmxleDogVUludDgsIGF0IGluZGV4OiBJbnQzMikgLT4gQm9vbCB7IGxldCBvID0gX2FjY2Vzc29yLm9mZnNldChWVE9GRlNFVC5mbGV4LnYpOyByZXR1cm4gX2FjY2Vzc29yLmRpcmVjdE11dGF0ZShmbGV4LCBpbmRleDogX2FjY2Vzc29yLnZlY3RvcihhdDogbykgKyBpbmRleCAqIDEpIH0KKyAgcHVibGljIHZhciBoYXNUZXN0NTogQm9vbCB7IGxldCBvID0gX2FjY2Vzc29yLm9mZnNldChWVE9GRlNFVC50ZXN0NS52KTsgcmV0dXJuIG8gPT0gMCA/IGZhbHNlIDogdHJ1ZSB9CiAgIHB1YmxpYyB2YXIgdGVzdDVDb3VudDogSW50MzIgeyBsZXQgbyA9IF9hY2Nlc3Nvci5vZmZzZXQoVlRPRkZTRVQudGVzdDUudik7IHJldHVybiBvID09IDAgPyAwIDogX2FjY2Vzc29yLnZlY3Rvcihjb3VudDogbykgfQogICBwdWJsaWMgZnVuYyB0ZXN0NShhdCBpbmRleDogSW50MzIpIC0+IE15R2FtZV9FeGFtcGxlX1Rlc3Q/IHsgbGV0IG8gPSBfYWNjZXNzb3Iub2Zmc2V0KFZUT0ZGU0VULnRlc3Q1LnYpOyByZXR1cm4gbyA9PSAwID8gbmlsIDogX2FjY2Vzc29yLmRpcmVjdFJlYWQob2Y6IE15R2FtZV9FeGFtcGxlX1Rlc3Quc2VsZiwgb2Zmc2V0OiBfYWNjZXNzb3IudmVjdG9yKGF0OiBvKSArIGluZGV4ICogNCkgfQogICBwdWJsaWMgZnVuYyBtdXRhYmxlVGVzdDUoYXQgaW5kZXg6IEludDMyKSAtPiBNeUdhbWVfRXhhbXBsZV9UZXN0X011dGFibGU/IHsgbGV0IG8gPSBfYWNjZXNzb3Iub2Zmc2V0KFZUT0ZGU0VULnRlc3Q1LnYpOyByZXR1cm4gbyA9PSAwID8gbmlsIDogTXlHYW1lX0V4YW1wbGVfVGVzdF9NdXRhYmxlKF9hY2Nlc3Nvci5iYiwgbzogX2FjY2Vzc29yLnZlY3RvcihhdDogbykgKyBpbmRleCAqIDQpIH0KKyAgcHVibGljIHZhciBoYXNWZWN0b3JPZkxvbmdzOiBCb29sIHsgbGV0IG8gPSBfYWNjZXNzb3Iub2Zmc2V0KFZUT0ZGU0VULnZlY3Rvck9mTG9uZ3Mudik7IHJldHVybiBvID09IDAgPyBmYWxzZSA6IHRydWUgfQogICBwdWJsaWMgdmFyIHZlY3Rvck9mTG9uZ3NDb3VudDogSW50MzIgeyBsZXQgbyA9IF9hY2Nlc3Nvci5vZmZzZXQoVlRPRkZTRVQudmVjdG9yT2ZMb25ncy52KTsgcmV0dXJuIG8gPT0gMCA/IDAgOiBfYWNjZXNzb3IudmVjdG9yKGNvdW50OiBvKSB9CiAgIHB1YmxpYyBmdW5jIHZlY3Rvck9mTG9uZ3MoYXQgaW5kZXg6IEludDMyKSAtPiBJbnQ2NCB7IGxldCBvID0gX2FjY2Vzc29yLm9mZnNldChWVE9GRlNFVC52ZWN0b3JPZkxvbmdzLnYpOyByZXR1cm4gbyA9PSAwID8gMCA6IF9hY2Nlc3Nvci5kaXJlY3RSZWFkKG9mOiBJbnQ2NC5zZWxmLCBvZmZzZXQ6IF9hY2Nlc3Nvci52ZWN0b3IoYXQ6IG8pICsgaW5kZXggKiA4KSB9CiAgIHB1YmxpYyB2YXIgdmVjdG9yT2ZMb25nczogW0ludDY0XSB7IHJldHVybiBfYWNjZXNzb3IuZ2V0VmVjdG9yKGF0OiBWVE9GRlNFVC52ZWN0b3JPZkxvbmdzLnYpID8/IFtdIH0KICAgcHVibGljIGZ1bmMgbXV0YXRlKHZlY3Rvck9mTG9uZ3M6IEludDY0LCBhdCBpbmRleDogSW50MzIpIC0+IEJvb2wgeyBsZXQgbyA9IF9hY2Nlc3Nvci5vZmZzZXQoVlRPRkZTRVQudmVjdG9yT2ZMb25ncy52KTsgcmV0dXJuIF9hY2Nlc3Nvci5kaXJlY3RNdXRhdGUodmVjdG9yT2ZMb25ncywgaW5kZXg6IF9hY2Nlc3Nvci52ZWN0b3IoYXQ6IG8pICsgaW5kZXggKiA4KSB9CisgIHB1YmxpYyB2YXIgaGFzVmVjdG9yT2ZEb3VibGVzOiBCb29sIHsgbGV0IG8gPSBfYWNjZXNzb3Iub2Zmc2V0KFZUT0ZGU0VULnZlY3Rvck9mRG91Ymxlcy52KTsgcmV0dXJuIG8gPT0gMCA/IGZhbHNlIDogdHJ1ZSB9CiAgIHB1YmxpYyB2YXIgdmVjdG9yT2ZEb3VibGVzQ291bnQ6IEludDMyIHsgbGV0IG8gPSBfYWNjZXNzb3Iub2Zmc2V0KFZUT0ZGU0VULnZlY3Rvck9mRG91Ymxlcy52KTsgcmV0dXJuIG8gPT0gMCA/IDAgOiBfYWNjZXNzb3IudmVjdG9yKGNvdW50OiBvKSB9CiAgIHB1YmxpYyBmdW5jIHZlY3Rvck9mRG91YmxlcyhhdCBpbmRleDogSW50MzIpIC0+IERvdWJsZSB7IGxldCBvID0gX2FjY2Vzc29yLm9mZnNldChWVE9GRlNFVC52ZWN0b3JPZkRvdWJsZXMudik7IHJldHVybiBvID09IDAgPyAwIDogX2FjY2Vzc29yLmRpcmVjdFJlYWQob2Y6IERvdWJsZS5zZWxmLCBvZmZzZXQ6IF9hY2Nlc3Nvci52ZWN0b3IoYXQ6IG8pICsgaW5kZXggKiA4KSB9CiAgIHB1YmxpYyB2YXIgdmVjdG9yT2ZEb3VibGVzOiBbRG91YmxlXSB7IHJldHVybiBfYWNjZXNzb3IuZ2V0VmVjdG9yKGF0OiBWVE9GRlNFVC52ZWN0b3JPZkRvdWJsZXMudikgPz8gW10gfQogICBwdWJsaWMgZnVuYyBtdXRhdGUodmVjdG9yT2ZEb3VibGVzOiBEb3VibGUsIGF0IGluZGV4OiBJbnQzMikgLT4gQm9vbCB7IGxldCBvID0gX2FjY2Vzc29yLm9mZnNldChWVE9GRlNFVC52ZWN0b3JPZkRvdWJsZXMudik7IHJldHVybiBfYWNjZXNzb3IuZGlyZWN0TXV0YXRlKHZlY3Rvck9mRG91YmxlcywgaW5kZXg6IF9hY2Nlc3Nvci52ZWN0b3IoYXQ6IG8pICsgaW5kZXggKiA4KSB9CiAgIHB1YmxpYyB2YXIgcGFyZW50TmFtZXNwYWNlVGVzdDogTXlHYW1lX0luUGFyZW50TmFtZXNwYWNlPyB7IGxldCBvID0gX2FjY2Vzc29yLm9mZnNldChWVE9GRlNFVC5wYXJlbnROYW1lc3BhY2VUZXN0LnYpOyByZXR1cm4gbyA9PSAwID8gbmlsIDogTXlHYW1lX0luUGFyZW50TmFtZXNwYWNlKF9hY2Nlc3Nvci5iYiwgbzogX2FjY2Vzc29yLmluZGlyZWN0KG8gKyBfYWNjZXNzb3IucG9zdGlvbikpIH0KKyAgcHVibGljIHZhciBoYXNWZWN0b3JPZlJlZmVycmFibGVzOiBCb29sIHsgbGV0IG8gPSBfYWNjZXNzb3Iub2Zmc2V0KFZUT0ZGU0VULnZlY3Rvck9mUmVmZXJyYWJsZXMudik7IHJldHVybiBvID09IDAgPyBmYWxzZSA6IHRydWUgfQogICBwdWJsaWMgdmFyIHZlY3Rvck9mUmVmZXJyYWJsZXNDb3VudDogSW50MzIgeyBsZXQgbyA9IF9hY2Nlc3Nvci5vZmZzZXQoVlRPRkZTRVQudmVjdG9yT2ZSZWZlcnJhYmxlcy52KTsgcmV0dXJuIG8gPT0gMCA/IDAgOiBfYWNjZXNzb3IudmVjdG9yKGNvdW50OiBvKSB9CiAgIHB1YmxpYyBmdW5jIHZlY3Rvck9mUmVmZXJyYWJsZXMoYXQgaW5kZXg6IEludDMyKSAtPiBNeUdhbWVfRXhhbXBsZV9SZWZlcnJhYmxlPyB7IGxldCBvID0gX2FjY2Vzc29yLm9mZnNldChWVE9GRlNFVC52ZWN0b3JPZlJlZmVycmFibGVzLnYpOyByZXR1cm4gbyA9PSAwID8gbmlsIDogTXlHYW1lX0V4YW1wbGVfUmVmZXJyYWJsZShfYWNjZXNzb3IuYmIsIG86IF9hY2Nlc3Nvci5pbmRpcmVjdChfYWNjZXNzb3IudmVjdG9yKGF0OiBvKSArIGluZGV4ICogNCkpIH0KICAgcHVibGljIGZ1bmMgdmVjdG9yT2ZSZWZlcnJhYmxlc0J5KGtleTogVUludDY0KSAtPiBNeUdhbWVfRXhhbXBsZV9SZWZlcnJhYmxlPyB7IGxldCBvID0gX2FjY2Vzc29yLm9mZnNldChWVE9GRlNFVC52ZWN0b3JPZlJlZmVycmFibGVzLnYpOyByZXR1cm4gbyA9PSAwID8gbmlsIDogTXlHYW1lX0V4YW1wbGVfUmVmZXJyYWJsZS5sb29rdXBCeUtleSh2ZWN0b3I6IF9hY2Nlc3Nvci52ZWN0b3IoYXQ6IG8pLCBrZXk6IGtleSwgZmJiOiBfYWNjZXNzb3IuYmIpIH0KICAgcHVibGljIHZhciBzaW5nbGVXZWFrUmVmZXJlbmNlOiBVSW50NjQgeyBsZXQgbyA9IF9hY2Nlc3Nvci5vZmZzZXQoVlRPRkZTRVQuc2luZ2xlV2Vha1JlZmVyZW5jZS52KTsgcmV0dXJuIG8gPT0gMCA/IDAgOiBfYWNjZXNzb3IucmVhZEJ1ZmZlcihvZjogVUludDY0LnNlbGYsIGF0OiBvKSB9CiAgIEBkaXNjYXJkYWJsZVJlc3VsdCBwdWJsaWMgZnVuYyBtdXRhdGUoc2luZ2xlV2Vha1JlZmVyZW5jZTogVUludDY0KSAtPiBCb29sIHtsZXQgbyA9IF9hY2Nlc3Nvci5vZmZzZXQoVlRPRkZTRVQuc2luZ2xlV2Vha1JlZmVyZW5jZS52KTsgIHJldHVybiBfYWNjZXNzb3IubXV0YXRlKHNpbmdsZVdlYWtSZWZlcmVuY2UsIGluZGV4OiBvKSB9CisgIHB1YmxpYyB2YXIgaGFzVmVjdG9yT2ZXZWFrUmVmZXJlbmNlczogQm9vbCB7IGxldCBvID0gX2FjY2Vzc29yLm9mZnNldChWVE9GRlNFVC52ZWN0b3JPZldlYWtSZWZlcmVuY2VzLnYpOyByZXR1cm4gbyA9PSAwID8gZmFsc2UgOiB0cnVlIH0KICAgcHVibGljIHZhciB2ZWN0b3JPZldlYWtSZWZlcmVuY2VzQ291bnQ6IEludDMyIHsgbGV0IG8gPSBfYWNjZXNzb3Iub2Zmc2V0KFZUT0ZGU0VULnZlY3Rvck9mV2Vha1JlZmVyZW5jZXMudik7IHJldHVybiBvID09IDAgPyAwIDogX2FjY2Vzc29yLnZlY3Rvcihjb3VudDogbykgfQogICBwdWJsaWMgZnVuYyB2ZWN0b3JPZldlYWtSZWZlcmVuY2VzKGF0IGluZGV4OiBJbnQzMikgLT4gVUludDY0IHsgbGV0IG8gPSBfYWNjZXNzb3Iub2Zmc2V0KFZUT0ZGU0VULnZlY3Rvck9mV2Vha1JlZmVyZW5jZXMudik7IHJldHVybiBvID09IDAgPyAwIDogX2FjY2Vzc29yLmRpcmVjdFJlYWQob2Y6IFVJbnQ2NC5zZWxmLCBvZmZzZXQ6IF9hY2Nlc3Nvci52ZWN0b3IoYXQ6IG8pICsgaW5kZXggKiA4KSB9CiAgIHB1YmxpYyB2YXIgdmVjdG9yT2ZXZWFrUmVmZXJlbmNlczogW1VJbnQ2NF0geyByZXR1cm4gX2FjY2Vzc29yLmdldFZlY3RvcihhdDogVlRPRkZTRVQudmVjdG9yT2ZXZWFrUmVmZXJlbmNlcy52KSA/PyBbXSB9CiAgIHB1YmxpYyBmdW5jIG11dGF0ZSh2ZWN0b3JPZldlYWtSZWZlcmVuY2VzOiBVSW50NjQsIGF0IGluZGV4OiBJbnQzMikgLT4gQm9vbCB7IGxldCBvID0gX2FjY2Vzc29yLm9mZnNldChWVE9GRlNFVC52ZWN0b3JPZldlYWtSZWZlcmVuY2VzLnYpOyByZXR1cm4gX2FjY2Vzc29yLmRpcmVjdE11dGF0ZSh2ZWN0b3JPZldlYWtSZWZlcmVuY2VzLCBpbmRleDogX2FjY2Vzc29yLnZlY3RvcihhdDogbykgKyBpbmRleCAqIDgpIH0KKyAgcHVibGljIHZhciBoYXNWZWN0b3JPZlN0cm9uZ1JlZmVycmFibGVzOiBCb29sIHsgbGV0IG8gPSBfYWNjZXNzb3Iub2Zmc2V0KFZUT0ZGU0VULnZlY3Rvck9mU3Ryb25nUmVmZXJyYWJsZXMudik7IHJldHVybiBvID09IDAgPyBmYWxzZSA6IHRydWUgfQogICBwdWJsaWMgdmFyIHZlY3Rvck9mU3Ryb25nUmVmZXJyYWJsZXNDb3VudDogSW50MzIgeyBsZXQgbyA9IF9hY2Nlc3Nvci5vZmZzZXQoVlRPRkZTRVQudmVjdG9yT2ZTdHJvbmdSZWZlcnJhYmxlcy52KTsgcmV0dXJuIG8gPT0gMCA/IDAgOiBfYWNjZXNzb3IudmVjdG9yKGNvdW50OiBvKSB9CiAgIHB1YmxpYyBmdW5jIHZlY3Rvck9mU3Ryb25nUmVmZXJyYWJsZXMoYXQgaW5kZXg6IEludDMyKSAtPiBNeUdhbWVfRXhhbXBsZV9SZWZlcnJhYmxlPyB7IGxldCBvID0gX2FjY2Vzc29yLm9mZnNldChWVE9GRlNFVC52ZWN0b3JPZlN0cm9uZ1JlZmVycmFibGVzLnYpOyByZXR1cm4gbyA9PSAwID8gbmlsIDogTXlHYW1lX0V4YW1wbGVfUmVmZXJyYWJsZShfYWNjZXNzb3IuYmIsIG86IF9hY2Nlc3Nvci5pbmRpcmVjdChfYWNjZXNzb3IudmVjdG9yKGF0OiBvKSArIGluZGV4ICogNCkpIH0KICAgcHVibGljIGZ1bmMgdmVjdG9yT2ZTdHJvbmdSZWZlcnJhYmxlc0J5KGtleTogVUludDY0KSAtPiBNeUdhbWVfRXhhbXBsZV9SZWZlcnJhYmxlPyB7IGxldCBvID0gX2FjY2Vzc29yLm9mZnNldChWVE9GRlNFVC52ZWN0b3JPZlN0cm9uZ1JlZmVycmFibGVzLnYpOyByZXR1cm4gbyA9PSAwID8gbmlsIDogTXlHYW1lX0V4YW1wbGVfUmVmZXJyYWJsZS5sb29rdXBCeUtleSh2ZWN0b3I6IF9hY2Nlc3Nvci52ZWN0b3IoYXQ6IG8pLCBrZXk6IGtleSwgZmJiOiBfYWNjZXNzb3IuYmIpIH0KICAgcHVibGljIHZhciBjb093bmluZ1JlZmVyZW5jZTogVUludDY0IHsgbGV0IG8gPSBfYWNjZXNzb3Iub2Zmc2V0KFZUT0ZGU0VULmNvT3duaW5nUmVmZXJlbmNlLnYpOyByZXR1cm4gbyA9PSAwID8gMCA6IF9hY2Nlc3Nvci5yZWFkQnVmZmVyKG9mOiBVSW50NjQuc2VsZiwgYXQ6IG8pIH0KICAgQGRpc2NhcmRhYmxlUmVzdWx0IHB1YmxpYyBmdW5jIG11dGF0ZShjb093bmluZ1JlZmVyZW5jZTogVUludDY0KSAtPiBCb29sIHtsZXQgbyA9IF9hY2Nlc3Nvci5vZmZzZXQoVlRPRkZTRVQuY29Pd25pbmdSZWZlcmVuY2Uudik7ICByZXR1cm4gX2FjY2Vzc29yLm11dGF0ZShjb093bmluZ1JlZmVyZW5jZSwgaW5kZXg6IG8pIH0KKyAgcHVibGljIHZhciBoYXNWZWN0b3JPZkNvT3duaW5nUmVmZXJlbmNlczogQm9vbCB7IGxldCBvID0gX2FjY2Vzc29yLm9mZnNldChWVE9GRlNFVC52ZWN0b3JPZkNvT3duaW5nUmVmZXJlbmNlcy52KTsgcmV0dXJuIG8gPT0gMCA/IGZhbHNlIDogdHJ1ZSB9CiAgIHB1YmxpYyB2YXIgdmVjdG9yT2ZDb093bmluZ1JlZmVyZW5jZXNDb3VudDogSW50MzIgeyBsZXQgbyA9IF9hY2Nlc3Nvci5vZmZzZXQoVlRPRkZTRVQudmVjdG9yT2ZDb093bmluZ1JlZmVyZW5jZXMudik7IHJldHVybiBvID09IDAgPyAwIDogX2FjY2Vzc29yLnZlY3Rvcihjb3VudDogbykgfQogICBwdWJsaWMgZnVuYyB2ZWN0b3JPZkNvT3duaW5nUmVmZXJlbmNlcyhhdCBpbmRleDogSW50MzIpIC0+IFVJbnQ2NCB7IGxldCBvID0gX2FjY2Vzc29yLm9mZnNldChWVE9GRlNFVC52ZWN0b3JPZkNvT3duaW5nUmVmZXJlbmNlcy52KTsgcmV0dXJuIG8gPT0gMCA/IDAgOiBfYWNjZXNzb3IuZGlyZWN0UmVhZChvZjogVUludDY0LnNlbGYsIG9mZnNldDogX2FjY2Vzc29yLnZlY3RvcihhdDogbykgKyBpbmRleCAqIDgpIH0KICAgcHVibGljIHZhciB2ZWN0b3JPZkNvT3duaW5nUmVmZXJlbmNlczogW1VJbnQ2NF0geyByZXR1cm4gX2FjY2Vzc29yLmdldFZlY3RvcihhdDogVlRPRkZTRVQudmVjdG9yT2ZDb093bmluZ1JlZmVyZW5jZXMudikgPz8gW10gfQogICBwdWJsaWMgZnVuYyBtdXRhdGUodmVjdG9yT2ZDb093bmluZ1JlZmVyZW5jZXM6IFVJbnQ2NCwgYXQgaW5kZXg6IEludDMyKSAtPiBCb29sIHsgbGV0IG8gPSBfYWNjZXNzb3Iub2Zmc2V0KFZUT0ZGU0VULnZlY3Rvck9mQ29Pd25pbmdSZWZlcmVuY2VzLnYpOyByZXR1cm4gX2FjY2Vzc29yLmRpcmVjdE11dGF0ZSh2ZWN0b3JPZkNvT3duaW5nUmVmZXJlbmNlcywgaW5kZXg6IF9hY2Nlc3Nvci52ZWN0b3IoYXQ6IG8pICsgaW5kZXggKiA4KSB9CiAgIHB1YmxpYyB2YXIgbm9uT3duaW5nUmVmZXJlbmNlOiBVSW50NjQgeyBsZXQgbyA9IF9hY2Nlc3Nvci5vZmZzZXQoVlRPRkZTRVQubm9uT3duaW5nUmVmZXJlbmNlLnYpOyByZXR1cm4gbyA9PSAwID8gMCA6IF9hY2Nlc3Nvci5yZWFkQnVmZmVyKG9mOiBVSW50NjQuc2VsZiwgYXQ6IG8pIH0KICAgQGRpc2NhcmRhYmxlUmVzdWx0IHB1YmxpYyBmdW5jIG11dGF0ZShub25Pd25pbmdSZWZlcmVuY2U6IFVJbnQ2NCkgLT4gQm9vbCB7bGV0IG8gPSBfYWNjZXNzb3Iub2Zmc2V0KFZUT0ZGU0VULm5vbk93bmluZ1JlZmVyZW5jZS52KTsgIHJldHVybiBfYWNjZXNzb3IubXV0YXRlKG5vbk93bmluZ1JlZmVyZW5jZSwgaW5kZXg6IG8pIH0KKyAgcHVibGljIHZhciBoYXNWZWN0b3JPZk5vbk93bmluZ1JlZmVyZW5jZXM6IEJvb2wgeyBsZXQgbyA9IF9hY2Nlc3Nvci5vZmZzZXQoVlRPRkZTRVQudmVjdG9yT2ZOb25Pd25pbmdSZWZlcmVuY2VzLnYpOyByZXR1cm4gbyA9PSAwID8gZmFsc2UgOiB0cnVlIH0KICAgcHVibGljIHZhciB2ZWN0b3JPZk5vbk93bmluZ1JlZmVyZW5jZXNDb3VudDogSW50MzIgeyBsZXQgbyA9IF9hY2Nlc3Nvci5vZmZzZXQoVlRPRkZTRVQudmVjdG9yT2ZOb25Pd25pbmdSZWZlcmVuY2VzLnYpOyByZXR1cm4gbyA9PSAwID8gMCA6IF9hY2Nlc3Nvci52ZWN0b3IoY291bnQ6IG8pIH0KICAgcHVibGljIGZ1bmMgdmVjdG9yT2ZOb25Pd25pbmdSZWZlcmVuY2VzKGF0IGluZGV4OiBJbnQzMikgLT4gVUludDY0IHsgbGV0IG8gPSBfYWNjZXNzb3Iub2Zmc2V0KFZUT0ZGU0VULnZlY3Rvck9mTm9uT3duaW5nUmVmZXJlbmNlcy52KTsgcmV0dXJuIG8gPT0gMCA/IDAgOiBfYWNjZXNzb3IuZGlyZWN0UmVhZChvZjogVUludDY0LnNlbGYsIG9mZnNldDogX2FjY2Vzc29yLnZlY3RvcihhdDogbykgKyBpbmRleCAqIDgpIH0KICAgcHVibGljIHZhciB2ZWN0b3JPZk5vbk93bmluZ1JlZmVyZW5jZXM6IFtVSW50NjRdIHsgcmV0dXJuIF9hY2Nlc3Nvci5nZXRWZWN0b3IoYXQ6IFZUT0ZGU0VULnZlY3Rvck9mTm9uT3duaW5nUmVmZXJlbmNlcy52KSA/PyBbXSB9CkBAIC0xMjI1LDE0ICsxMzE0LDE3IEBACiAgIHB1YmxpYyBmdW5jIGFueVVuaXF1ZTxUOiBGbGF0YnVmZmVyc0luaXRpYWxpemFibGU+KHR5cGU6IFQuVHlwZSkgLT4gVD8geyBsZXQgbyA9IF9hY2Nlc3Nvci5vZmZzZXQoVlRPRkZTRVQuYW55VW5pcXVlLnYpOyByZXR1cm4gbyA9PSAwID8gbmlsIDogX2FjY2Vzc29yLnVuaW9uKG8pIH0KICAgcHVibGljIHZhciBhbnlBbWJpZ3VvdXNUeXBlOiBNeUdhbWVfRXhhbXBsZV9BbnlBbWJpZ3VvdXNBbGlhc2VzIHsgbGV0IG8gPSBfYWNjZXNzb3Iub2Zmc2V0KFZUT0ZGU0VULmFueUFtYmlndW91c1R5cGUudik7IHJldHVybiBvID09IDAgPyAubm9uZV8gOiBNeUdhbWVfRXhhbXBsZV9BbnlBbWJpZ3VvdXNBbGlhc2VzKHJhd1ZhbHVlOiBfYWNjZXNzb3IucmVhZEJ1ZmZlcihvZjogVUludDguc2VsZiwgYXQ6IG8pKSA/PyAubm9uZV8gfQogICBwdWJsaWMgZnVuYyBhbnlBbWJpZ3VvdXM8VDogRmxhdGJ1ZmZlcnNJbml0aWFsaXphYmxlPih0eXBlOiBULlR5cGUpIC0+IFQ/IHsgbGV0IG8gPSBfYWNjZXNzb3Iub2Zmc2V0KFZUT0ZGU0VULmFueUFtYmlndW91cy52KTsgcmV0dXJuIG8gPT0gMCA/IG5pbCA6IF9hY2Nlc3Nvci51bmlvbihvKSB9CisgIHB1YmxpYyB2YXIgaGFzVmVjdG9yT2ZFbnVtczogQm9vbCB7IGxldCBvID0gX2FjY2Vzc29yLm9mZnNldChWVE9GRlNFVC52ZWN0b3JPZkVudW1zLnYpOyByZXR1cm4gbyA9PSAwID8gZmFsc2UgOiB0cnVlIH0KICAgcHVibGljIHZhciB2ZWN0b3JPZkVudW1zQ291bnQ6IEludDMyIHsgbGV0IG8gPSBfYWNjZXNzb3Iub2Zmc2V0KFZUT0ZGU0VULnZlY3Rvck9mRW51bXMudik7IHJldHVybiBvID09IDAgPyAwIDogX2FjY2Vzc29yLnZlY3Rvcihjb3VudDogbykgfQogICBwdWJsaWMgZnVuYyB2ZWN0b3JPZkVudW1zKGF0IGluZGV4OiBJbnQzMikgLT4gTXlHYW1lX0V4YW1wbGVfQ29sb3I/IHsgbGV0IG8gPSBfYWNjZXNzb3Iub2Zmc2V0KFZUT0ZGU0VULnZlY3Rvck9mRW51bXMudik7IHJldHVybiBvID09IDAgPyBNeUdhbWVfRXhhbXBsZV9Db2xvci5yZWQgOiBNeUdhbWVfRXhhbXBsZV9Db2xvcihyYXdWYWx1ZTogX2FjY2Vzc29yLmRpcmVjdFJlYWQob2Y6IFVJbnQ4LnNlbGYsIG9mZnNldDogX2FjY2Vzc29yLnZlY3RvcihhdDogbykgKyBpbmRleCAqIDEpKSB9CiAgIHB1YmxpYyB2YXIgc2lnbmVkRW51bTogTXlHYW1lX0V4YW1wbGVfUmFjZSB7IGxldCBvID0gX2FjY2Vzc29yLm9mZnNldChWVE9GRlNFVC5zaWduZWRFbnVtLnYpOyByZXR1cm4gbyA9PSAwID8gLm5vbmVfIDogTXlHYW1lX0V4YW1wbGVfUmFjZShyYXdWYWx1ZTogX2FjY2Vzc29yLnJlYWRCdWZmZXIob2Y6IEludDguc2VsZiwgYXQ6IG8pKSA/PyAubm9uZV8gfQogICBAZGlzY2FyZGFibGVSZXN1bHQgcHVibGljIGZ1bmMgbXV0YXRlKHNpZ25lZEVudW06IE15R2FtZV9FeGFtcGxlX1JhY2UpIC0+IEJvb2wge2xldCBvID0gX2FjY2Vzc29yLm9mZnNldChWVE9GRlNFVC5zaWduZWRFbnVtLnYpOyAgcmV0dXJuIF9hY2Nlc3Nvci5tdXRhdGUoc2lnbmVkRW51bS5yYXdWYWx1ZSwgaW5kZXg6IG8pIH0KKyAgcHVibGljIHZhciBoYXNUZXN0cmVxdWlyZWRuZXN0ZWRmbGF0YnVmZmVyOiBCb29sIHsgbGV0IG8gPSBfYWNjZXNzb3Iub2Zmc2V0KFZUT0ZGU0VULnRlc3RyZXF1aXJlZG5lc3RlZGZsYXRidWZmZXIudik7IHJldHVybiBvID09IDAgPyBmYWxzZSA6IHRydWUgfQogICBwdWJsaWMgdmFyIHRlc3RyZXF1aXJlZG5lc3RlZGZsYXRidWZmZXJDb3VudDogSW50MzIgeyBsZXQgbyA9IF9hY2Nlc3Nvci5vZmZzZXQoVlRPRkZTRVQudGVzdHJlcXVpcmVkbmVzdGVkZmxhdGJ1ZmZlci52KTsgcmV0dXJuIG8gPT0gMCA/IDAgOiBfYWNjZXNzb3IudmVjdG9yKGNvdW50OiBvKSB9CiAgIHB1YmxpYyBmdW5jIHRlc3RyZXF1aXJlZG5lc3RlZGZsYXRidWZmZXIoYXQgaW5kZXg6IEludDMyKSAtPiBVSW50OCB7IGxldCBvID0gX2FjY2Vzc29yLm9mZnNldChWVE9GRlNFVC50ZXN0cmVxdWlyZWRuZXN0ZWRmbGF0YnVmZmVyLnYpOyByZXR1cm4gbyA9PSAwID8gMCA6IF9hY2Nlc3Nvci5kaXJlY3RSZWFkKG9mOiBVSW50OC5zZWxmLCBvZmZzZXQ6IF9hY2Nlc3Nvci52ZWN0b3IoYXQ6IG8pICsgaW5kZXggKiAxKSB9CiAgIHB1YmxpYyB2YXIgdGVzdHJlcXVpcmVkbmVzdGVkZmxhdGJ1ZmZlcjogW1VJbnQ4XSB7IHJldHVybiBfYWNjZXNzb3IuZ2V0VmVjdG9yKGF0OiBWVE9GRlNFVC50ZXN0cmVxdWlyZWRuZXN0ZWRmbGF0YnVmZmVyLnYpID8/IFtdIH0KICAgcHVibGljIGZ1bmMgbXV0YXRlKHRlc3RyZXF1aXJlZG5lc3RlZGZsYXRidWZmZXI6IFVJbnQ4LCBhdCBpbmRleDogSW50MzIpIC0+IEJvb2wgeyBsZXQgbyA9IF9hY2Nlc3Nvci5vZmZzZXQoVlRPRkZTRVQudGVzdHJlcXVpcmVkbmVzdGVkZmxhdGJ1ZmZlci52KTsgcmV0dXJuIF9hY2Nlc3Nvci5kaXJlY3RNdXRhdGUodGVzdHJlcXVpcmVkbmVzdGVkZmxhdGJ1ZmZlciwgaW5kZXg6IF9hY2Nlc3Nvci52ZWN0b3IoYXQ6IG8pICsgaW5kZXggKiAxKSB9CisgIHB1YmxpYyB2YXIgaGFzU2NhbGFyS2V5U29ydGVkVGFibGVzOiBCb29sIHsgbGV0IG8gPSBfYWNjZXNzb3Iub2Zmc2V0KFZUT0ZGU0VULnNjYWxhcktleVNvcnRlZFRhYmxlcy52KTsgcmV0dXJuIG8gPT0gMCA/IGZhbHNlIDogdHJ1ZSB9CiAgIHB1YmxpYyB2YXIgc2NhbGFyS2V5U29ydGVkVGFibGVzQ291bnQ6IEludDMyIHsgbGV0IG8gPSBfYWNjZXNzb3Iub2Zmc2V0KFZUT0ZGU0VULnNjYWxhcktleVNvcnRlZFRhYmxlcy52KTsgcmV0dXJuIG8gPT0gMCA/IDAgOiBfYWNjZXNzb3IudmVjdG9yKGNvdW50OiBvKSB9CiAgIHB1YmxpYyBmdW5jIHNjYWxhcktleVNvcnRlZFRhYmxlcyhhdCBpbmRleDogSW50MzIpIC0+IE15R2FtZV9FeGFtcGxlX1N0YXQ/IHsgbGV0IG8gPSBfYWNjZXNzb3Iub2Zmc2V0KFZUT0ZGU0VULnNjYWxhcktleVNvcnRlZFRhYmxlcy52KTsgcmV0dXJuIG8gPT0gMCA/IG5pbCA6IE15R2FtZV9FeGFtcGxlX1N0YXQoX2FjY2Vzc29yLmJiLCBvOiBfYWNjZXNzb3IuaW5kaXJlY3QoX2FjY2Vzc29yLnZlY3RvcihhdDogbykgKyBpbmRleCAqIDQpKSB9CiAgIHB1YmxpYyBmdW5jIHNjYWxhcktleVNvcnRlZFRhYmxlc0J5KGtleTogVUludDE2KSAtPiBNeUdhbWVfRXhhbXBsZV9TdGF0PyB7IGxldCBvID0gX2FjY2Vzc29yLm9mZnNldChWVE9GRlNFVC5zY2FsYXJLZXlTb3J0ZWRUYWJsZXMudik7IHJldHVybiBvID09IDAgPyBuaWwgOiBNeUdhbWVfRXhhbXBsZV9TdGF0Lmxvb2t1cEJ5S2V5KHZlY3RvcjogX2FjY2Vzc29yLnZlY3RvcihhdDogbyksIGtleToga2V5LCBmYmI6IF9hY2Nlc3Nvci5iYikgfQpAQCAtMTMxMiw3ICsxNDA0LDcgQEAKICAgICBwb3M6IE15R2FtZV9FeGFtcGxlX1ZlYzM/ID0gbmlsLAogICAgIG1hbmE6IEludDE2ID0gMTUwLAogICAgIGhwOiBJbnQxNiA9IDEwMCwKLSAgICBuYW1lT2Zmc2V0IG5hbWU6IE9mZnNldCA9IE9mZnNldCgpLAorICAgIG5hbWVPZmZzZXQgbmFtZTogT2Zmc2V0LAogICAgIGludmVudG9yeVZlY3Rvck9mZnNldCBpbnZlbnRvcnk6IE9mZnNldCA9IE9mZnNldCgpLAogICAgIGNvbG9yOiBNeUdhbWVfRXhhbXBsZV9Db2xvciA9IC5ibHVlLAogICAgIHRlc3RUeXBlOiBNeUdhbWVfRXhhbXBsZV9BbnlfID0gLm5vbmVfLApAQCAtMjIwNSwxMSArMjI5NywxMiBAQAogfQogcHVibGljIHN0cnVjdCBNeUdhbWVfRXhhbXBsZV9UeXBlQWxpYXNlczogRmxhdEJ1ZmZlck9iamVjdCwgVmVyaWZpYWJsZSwgT2JqZWN0QVBJUGFja2VyIHsKIAotICBzdGF0aWMgZnVuYyB2YWxpZGF0ZVZlcnNpb24oKSB7IEZsYXRCdWZmZXJzVmVyc2lvbl8yXzBfMCgpIH0KKyAgc3RhdGljIGZ1bmMgdmFsaWRhdGVWZXJzaW9uKCkgeyBGbGF0QnVmZmVyc1ZlcnNpb25fMl8wXzgoKSB9CiAgIHB1YmxpYyB2YXIgX19idWZmZXI6IEJ5dGVCdWZmZXIhIHsgcmV0dXJuIF9hY2Nlc3Nvci5iYiB9CiAgIHByaXZhdGUgdmFyIF9hY2Nlc3NvcjogVGFibGUKIAotICBwdWJsaWMgc3RhdGljIGZ1bmMgZmluaXNoKF8gZmJiOiBpbm91dCBGbGF0QnVmZmVyQnVpbGRlciwgZW5kOiBPZmZzZXQsIHByZWZpeDogQm9vbCA9IGZhbHNlKSB7IGZiYi5maW5pc2gob2Zmc2V0OiBlbmQsIGZpbGVJZDogIk1PTlMiLCBhZGRQcmVmaXg6IHByZWZpeCkgfQorICBwdWJsaWMgc3RhdGljIHZhciBpZDogU3RyaW5nIHsgIk1PTlMiIH0gCisgIHB1YmxpYyBzdGF0aWMgZnVuYyBmaW5pc2goXyBmYmI6IGlub3V0IEZsYXRCdWZmZXJCdWlsZGVyLCBlbmQ6IE9mZnNldCwgcHJlZml4OiBCb29sID0gZmFsc2UpIHsgZmJiLmZpbmlzaChvZmZzZXQ6IGVuZCwgZmlsZUlkOiBNeUdhbWVfRXhhbXBsZV9UeXBlQWxpYXNlcy5pZCwgYWRkUHJlZml4OiBwcmVmaXgpIH0KICAgcHVibGljIHN0YXRpYyBmdW5jIGdldFJvb3RBc1R5cGVBbGlhc2VzKGJiOiBCeXRlQnVmZmVyKSAtPiBNeUdhbWVfRXhhbXBsZV9UeXBlQWxpYXNlcyB7IHJldHVybiBNeUdhbWVfRXhhbXBsZV9UeXBlQWxpYXNlcyhUYWJsZShiYjogYmIsIHBvc2l0aW9uOiBJbnQzMihiYi5yZWFkKGRlZjogVU9mZnNldC5zZWxmLCBwb3NpdGlvbjogYmIucmVhZGVyKSkgKyBJbnQzMihiYi5yZWFkZXIpKSkgfQogCiAgIHByaXZhdGUgaW5pdChfIHQ6IFRhYmxlKSB7IF9hY2Nlc3NvciA9IHQgfQpAQCAtMjI1MiwxMCArMjM0NSwxMiBAQAogICBAZGlzY2FyZGFibGVSZXN1bHQgcHVibGljIGZ1bmMgbXV0YXRlKGYzMjogRmxvYXQzMikgLT4gQm9vbCB7bGV0IG8gPSBfYWNjZXNzb3Iub2Zmc2V0KFZUT0ZGU0VULmYzMi52KTsgIHJldHVybiBfYWNjZXNzb3IubXV0YXRlKGYzMiwgaW5kZXg6IG8pIH0KICAgcHVibGljIHZhciBmNjQ6IERvdWJsZSB7IGxldCBvID0gX2FjY2Vzc29yLm9mZnNldChWVE9GRlNFVC5mNjQudik7IHJldHVybiBvID09IDAgPyAwLjAgOiBfYWNjZXNzb3IucmVhZEJ1ZmZlcihvZjogRG91YmxlLnNlbGYsIGF0OiBvKSB9CiAgIEBkaXNjYXJkYWJsZVJlc3VsdCBwdWJsaWMgZnVuYyBtdXRhdGUoZjY0OiBEb3VibGUpIC0+IEJvb2wge2xldCBvID0gX2FjY2Vzc29yLm9mZnNldChWVE9GRlNFVC5mNjQudik7ICByZXR1cm4gX2FjY2Vzc29yLm11dGF0ZShmNjQsIGluZGV4OiBvKSB9CisgIHB1YmxpYyB2YXIgaGFzVjg6IEJvb2wgeyBsZXQgbyA9IF9hY2Nlc3Nvci5vZmZzZXQoVlRPRkZTRVQudjgudik7IHJldHVybiBvID09IDAgPyBmYWxzZSA6IHRydWUgfQogICBwdWJsaWMgdmFyIHY4Q291bnQ6IEludDMyIHsgbGV0IG8gPSBfYWNjZXNzb3Iub2Zmc2V0KFZUT0ZGU0VULnY4LnYpOyByZXR1cm4gbyA9PSAwID8gMCA6IF9hY2Nlc3Nvci52ZWN0b3IoY291bnQ6IG8pIH0KICAgcHVibGljIGZ1bmMgdjgoYXQgaW5kZXg6IEludDMyKSAtPiBJbnQ4IHsgbGV0IG8gPSBfYWNjZXNzb3Iub2Zmc2V0KFZUT0ZGU0VULnY4LnYpOyByZXR1cm4gbyA9PSAwID8gMCA6IF9hY2Nlc3Nvci5kaXJlY3RSZWFkKG9mOiBJbnQ4LnNlbGYsIG9mZnNldDogX2FjY2Vzc29yLnZlY3RvcihhdDogbykgKyBpbmRleCAqIDEpIH0KICAgcHVibGljIHZhciB2ODogW0ludDhdIHsgcmV0dXJuIF9hY2Nlc3Nvci5nZXRWZWN0b3IoYXQ6IFZUT0ZGU0VULnY4LnYpID8/IFtdIH0KICAgcHVibGljIGZ1bmMgbXV0YXRlKHY4OiBJbnQ4LCBhdCBpbmRleDogSW50MzIpIC0+IEJvb2wgeyBsZXQgbyA9IF9hY2Nlc3Nvci5vZmZzZXQoVlRPRkZTRVQudjgudik7IHJldHVybiBfYWNjZXNzb3IuZGlyZWN0TXV0YXRlKHY4LCBpbmRleDogX2FjY2Vzc29yLnZlY3RvcihhdDogbykgKyBpbmRleCAqIDEpIH0KKyAgcHVibGljIHZhciBoYXNWZjY0OiBCb29sIHsgbGV0IG8gPSBfYWNjZXNzb3Iub2Zmc2V0KFZUT0ZGU0VULnZmNjQudik7IHJldHVybiBvID09IDAgPyBmYWxzZSA6IHRydWUgfQogICBwdWJsaWMgdmFyIHZmNjRDb3VudDogSW50MzIgeyBsZXQgbyA9IF9hY2Nlc3Nvci5vZmZzZXQoVlRPRkZTRVQudmY2NC52KTsgcmV0dXJuIG8gPT0gMCA/IDAgOiBfYWNjZXNzb3IudmVjdG9yKGNvdW50OiBvKSB9CiAgIHB1YmxpYyBmdW5jIHZmNjQoYXQgaW5kZXg6IEludDMyKSAtPiBEb3VibGUgeyBsZXQgbyA9IF9hY2Nlc3Nvci5vZmZzZXQoVlRPRkZTRVQudmY2NC52KTsgcmV0dXJuIG8gPT0gMCA/IDAgOiBfYWNjZXNzb3IuZGlyZWN0UmVhZChvZjogRG91YmxlLnNlbGYsIG9mZnNldDogX2FjY2Vzc29yLnZlY3RvcihhdDogbykgKyBpbmRleCAqIDgpIH0KICAgcHVibGljIHZhciB2ZjY0OiBbRG91YmxlXSB7IHJldHVybiBfYWNjZXNzb3IuZ2V0VmVjdG9yKGF0OiBWVE9GRlNFVC52ZjY0LnYpID8/IFtdIH0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL0ZsYXRCdWZmZXJzLkJlbmNobWFya3Muc3dpZnQvUGFja2FnZS5zd2lmdCBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL3N3aWZ0L2JlbmNobWFya3MvUGFja2FnZS5zd2lmdApzaW1pbGFyaXR5IGluZGV4IDczJQpjb3B5IGZyb20gdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvRmxhdEJ1ZmZlcnMuQmVuY2htYXJrcy5zd2lmdC9QYWNrYWdlLnN3aWZ0CmNvcHkgdG8gdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvc3dpZnQvYmVuY2htYXJrcy9QYWNrYWdlLnN3aWZ0CmluZGV4IDIwMjYyNDcuLmQ3MTE0OTMgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL0ZsYXRCdWZmZXJzLkJlbmNobWFya3Muc3dpZnQvUGFja2FnZS5zd2lmdAorKysgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9zd2lmdC9iZW5jaG1hcmtzL1BhY2thZ2Uuc3dpZnQKQEAgLTE4LDE1ICsxOCwxNyBAQAogaW1wb3J0IFBhY2thZ2VEZXNjcmlwdGlvbgogCiBsZXQgcGFja2FnZSA9IFBhY2thZ2UoCi0gIG5hbWU6ICJGbGF0QnVmZmVycy5CZW5jaG1hcmtzLnN3aWZ0IiwKKyAgbmFtZTogImJlbmNobWFya3MiLAogICBwbGF0Zm9ybXM6IFsKICAgICAubWFjT1MoLnYxMF8xNCksCiAgIF0sCiAgIGRlcGVuZGVuY2llczogWwotICAgIC5wYWNrYWdlKHBhdGg6ICIuLi8uLi9zd2lmdCIpLAorICAgIC5wYWNrYWdlKHBhdGg6ICIuLi8uLi8uLi9zd2lmdCIpLAorICAgIC5wYWNrYWdlKHVybDogImh0dHBzOi8vZ2l0aHViLmNvbS9nb29nbGUvc3dpZnQtYmVuY2htYXJrIiwgZnJvbTogIjAuMS4wIiksCiAgIF0sCiAgIHRhcmdldHM6IFsKICAgICAudGFyZ2V0KAotICAgICAgbmFtZTogIkZsYXRCdWZmZXJzLkJlbmNobWFya3Muc3dpZnQiLAotICAgICAgZGVwZW5kZW5jaWVzOiBbIkZsYXRCdWZmZXJzIl0pLAorICAgICAgbmFtZTogImJlbmNobWFya3MiLAorICAgICAgZGVwZW5kZW5jaWVzOiBbIkZsYXRCdWZmZXJzIiwKKyAgICAgICAgICAgICAgICAgICAgIC5wcm9kdWN0KG5hbWU6ICJCZW5jaG1hcmsiLCBwYWNrYWdlOiAic3dpZnQtYmVuY2htYXJrIildKSwKICAgXSkKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL3N3aWZ0L2JlbmNobWFya3MvU291cmNlcy9iZW5jaG1hcmtzL21haW4uc3dpZnQgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9zd2lmdC9iZW5jaG1hcmtzL1NvdXJjZXMvYmVuY2htYXJrcy9tYWluLnN3aWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEyNWE2NDYKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9zd2lmdC9iZW5jaG1hcmtzL1NvdXJjZXMvYmVuY2htYXJrcy9tYWluLnN3aWZ0CkBAIC0wLDAgKzEsODcgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAyMSBHb29nbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK2ltcG9ydCBCZW5jaG1hcmsKK2ltcG9ydCBDb3JlRm91bmRhdGlvbgoraW1wb3J0IEZsYXRCdWZmZXJzCisKK2JlbmNobWFyaygiMTBTdHJpbmdzIikgeworICB2YXIgZmIgPSBGbGF0QnVmZmVyQnVpbGRlcihpbml0aWFsU2l6ZTogMTw8MjApCisgIGZvciBfIGluIDAuLjwxXzAwMF8wMDAgeworICAgIF8gPSBmYi5jcmVhdGUoc3RyaW5nOiAiZm9vYmFyYmF6IikKKyAgfQorfQorCitiZW5jaG1hcmsoIjEwMFN0cmluZ3MiKSB7CisgIHZhciBmYiA9IEZsYXRCdWZmZXJCdWlsZGVyKGluaXRpYWxTaXplOiAxPDwyMCkKKyAgZm9yIF8gaW4gMC4uPDFfMDAwXzAwMCB7CisgICAgXyA9IGZiLmNyZWF0ZShzdHJpbmc6IHN0cikKKyAgfQorfQorCitiZW5jaG1hcmsoIkZsYXRCdWZmZXJCdWlsZGVyLmFkZCIpIHsKKyAgdmFyIGZiID0gRmxhdEJ1ZmZlckJ1aWxkZXIoaW5pdGlhbFNpemU6IDEwMjQgKiAxMDI0ICogMzIpCisgIGZvciBfIGluIDAuLjwxXzAwMF8wMDAgeworICAgIGxldCBvZmYgPSBmYi5jcmVhdGUoc3RyaW5nOiAiVCIpCisgICAgbGV0IHMgPSBmYi5zdGFydFRhYmxlKHdpdGg6IDQpCisgICAgZmIuYWRkKGVsZW1lbnQ6IDMuMiwgZGVmOiAwLCBhdDogMikKKyAgICBmYi5hZGQoZWxlbWVudDogNC4yLCBkZWY6IDAsIGF0OiA0KQorICAgIGZiLmFkZChlbGVtZW50OiA1LjIsIGRlZjogMCwgYXQ6IDYpCisgICAgZmIuYWRkKG9mZnNldDogb2ZmLCBhdDogOCkKKyAgICBfID0gZmIuZW5kVGFibGUoYXQ6IHMpCisgIH0KK30KKworYmVuY2htYXJrKCJzdHJ1Y3RzIikgeworICBsZXQgc3RydWN0Q291bnQgPSAxXzAwMF8wMDAKKworICBsZXQgcmF3U2l6ZSA9ICgoMTYgKiA1KSAqIHN0cnVjdENvdW50KSAvIDEwMjQKKworICB2YXIgZmIgPSBGbGF0QnVmZmVyQnVpbGRlcihpbml0aWFsU2l6ZTogSW50MzIocmF3U2l6ZSAqIDE2MDApKQorCisgIHZhciBvZmZzZXRzOiBbT2Zmc2V0XSA9IFtdCisgIGZvciBfIGluIDAuLjxzdHJ1Y3RDb3VudCB7CisgICAgZmIuc3RhcnRWZWN0b3IoCisgICAgICA1ICogTWVtb3J5TGF5b3V0PEFBPi5zaXplLAorICAgICAgZWxlbWVudFNpemU6IE1lbW9yeUxheW91dDxBQT4uYWxpZ25tZW50KQorICAgIGZvciBfIGluIDAuLjw1IHsKKyAgICAgIF8gPSBmYi5jcmVhdGUoc3RydWN0OiBBQShhOiAyLjQsIGI6IDIuNCkpCisgICAgfQorICAgIGxldCB2ZWN0b3IgPSBmYi5lbmRWZWN0b3IobGVuOiA1KQorICAgIGxldCBzdGFydCA9IGZiLnN0YXJ0VGFibGUod2l0aDogMSkKKyAgICBmYi5hZGQob2Zmc2V0OiB2ZWN0b3IsIGF0OiA0KQorICAgIG9mZnNldHMuYXBwZW5kKE9mZnNldChvZmZzZXQ6IGZiLmVuZFRhYmxlKGF0OiBzdGFydCkpKQorICB9CisgIGxldCB2ZWN0b3IgPSBmYi5jcmVhdGVWZWN0b3Iob2ZPZmZzZXRzOiBvZmZzZXRzKQorICBsZXQgc3RhcnQgPSBmYi5zdGFydFRhYmxlKHdpdGg6IDEpCisgIGZiLmFkZChvZmZzZXQ6IHZlY3RvciwgYXQ6IDQpCisgIGxldCByb290ID0gT2Zmc2V0KG9mZnNldDogZmIuZW5kVGFibGUoYXQ6IHN0YXJ0KSkKKyAgZmIuZmluaXNoKG9mZnNldDogcm9vdCkKK30KKworbGV0IHN0ciA9ICgwLi4uOTkpLm1hcCB7IF8gLT4gU3RyaW5nIGluICJ4IiB9LmpvaW5lZCgpCisKK0B1c2FibGVGcm9tSW5saW5lCitzdHJ1Y3QgQUE6IE5hdGl2ZVN0cnVjdCB7CisgIHB1YmxpYyBpbml0KGE6IERvdWJsZSwgYjogRG91YmxlKSB7CisgICAgc2VsZi5hID0gYQorICAgIHNlbGYuYiA9IGIKKyAgfQorICB2YXIgYTogRG91YmxlCisgIHZhciBiOiBEb3VibGUKK30KKworQmVuY2htYXJrLm1haW4oKQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvc3dpZnQvdGVzdHMvQ29kZUdlbmVyYXRpb25UZXN0cy90ZXN0X2ltcG9ydC5mYnMgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9zd2lmdC90ZXN0cy9Db2RlR2VuZXJhdGlvblRlc3RzL3Rlc3RfaW1wb3J0LmZicwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYTQzOTU2Ci0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvc3dpZnQvdGVzdHMvQ29kZUdlbmVyYXRpb25UZXN0cy90ZXN0X2ltcG9ydC5mYnMKQEAgLTAsMCArMSwzIEBACit0YWJsZSBNZXNzYWdlIHsKKyAgaW50ZXJuYWxfbWVzc2FnZTogc3RyaW5nOworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL3N3aWZ0L3Rlc3RzL0NvZGVHZW5lcmF0aW9uVGVzdHMvdGVzdF9pbXBvcnRfZ2VuZXJhdGVkLnN3aWZ0IGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvc3dpZnQvdGVzdHMvQ29kZUdlbmVyYXRpb25UZXN0cy90ZXN0X2ltcG9ydF9nZW5lcmF0ZWQuc3dpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGUxNjBjYQotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL3N3aWZ0L3Rlc3RzL0NvZGVHZW5lcmF0aW9uVGVzdHMvdGVzdF9pbXBvcnRfZ2VuZXJhdGVkLnN3aWZ0CkBAIC0wLDAgKzEsOTEgQEAKKy8vIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGJ5IHRoZSBGbGF0QnVmZmVycyBjb21waWxlciwgZG8gbm90IG1vZGlmeQorLy8gc3dpZnRsaW50OmRpc2FibGUgYWxsCisvLyBzd2lmdGZvcm1hdDpkaXNhYmxlIGFsbAorCitAX2ltcGxlbWVudGF0aW9uT25seSBpbXBvcnQgRmxhdEJ1ZmZlcnMKKworaW50ZXJuYWwgc3RydWN0IE1lc3NhZ2U6IEZsYXRCdWZmZXJPYmplY3QsIFZlcmlmaWFibGUsIE9iamVjdEFQSVBhY2tlciB7CisKKyAgc3RhdGljIGZ1bmMgdmFsaWRhdGVWZXJzaW9uKCkgeyBGbGF0QnVmZmVyc1ZlcnNpb25fMl8wXzgoKSB9CisgIGludGVybmFsIHZhciBfX2J1ZmZlcjogQnl0ZUJ1ZmZlciEgeyByZXR1cm4gX2FjY2Vzc29yLmJiIH0KKyAgcHJpdmF0ZSB2YXIgX2FjY2Vzc29yOiBUYWJsZQorCisgIGludGVybmFsIHN0YXRpYyBmdW5jIGdldFJvb3RBc01lc3NhZ2UoYmI6IEJ5dGVCdWZmZXIpIC0+IE1lc3NhZ2UgeyByZXR1cm4gTWVzc2FnZShUYWJsZShiYjogYmIsIHBvc2l0aW9uOiBJbnQzMihiYi5yZWFkKGRlZjogVU9mZnNldC5zZWxmLCBwb3NpdGlvbjogYmIucmVhZGVyKSkgKyBJbnQzMihiYi5yZWFkZXIpKSkgfQorCisgIHByaXZhdGUgaW5pdChfIHQ6IFRhYmxlKSB7IF9hY2Nlc3NvciA9IHQgfQorICBpbnRlcm5hbCBpbml0KF8gYmI6IEJ5dGVCdWZmZXIsIG86IEludDMyKSB7IF9hY2Nlc3NvciA9IFRhYmxlKGJiOiBiYiwgcG9zaXRpb246IG8pIH0KKworICBwcml2YXRlIGVudW0gVlRPRkZTRVQ6IFZPZmZzZXQgeworICAgIGNhc2UgaW50ZXJuYWxNZXNzYWdlID0gNAorICAgIHZhciB2OiBJbnQzMiB7IEludDMyKHNlbGYucmF3VmFsdWUpIH0KKyAgICB2YXIgcDogVk9mZnNldCB7IHNlbGYucmF3VmFsdWUgfQorICB9CisKKyAgaW50ZXJuYWwgdmFyIGludGVybmFsTWVzc2FnZTogU3RyaW5nPyB7IGxldCBvID0gX2FjY2Vzc29yLm9mZnNldChWVE9GRlNFVC5pbnRlcm5hbE1lc3NhZ2Uudik7IHJldHVybiBvID09IDAgPyBuaWwgOiBfYWNjZXNzb3Iuc3RyaW5nKGF0OiBvKSB9CisgIGludGVybmFsIHZhciBpbnRlcm5hbE1lc3NhZ2VTZWdtZW50QXJyYXk6IFtVSW50OF0/IHsgcmV0dXJuIF9hY2Nlc3Nvci5nZXRWZWN0b3IoYXQ6IFZUT0ZGU0VULmludGVybmFsTWVzc2FnZS52KSB9CisgIGludGVybmFsIHN0YXRpYyBmdW5jIHN0YXJ0TWVzc2FnZShfIGZiYjogaW5vdXQgRmxhdEJ1ZmZlckJ1aWxkZXIpIC0+IFVPZmZzZXQgeyBmYmIuc3RhcnRUYWJsZSh3aXRoOiAxKSB9CisgIGludGVybmFsIHN0YXRpYyBmdW5jIGFkZChpbnRlcm5hbE1lc3NhZ2U6IE9mZnNldCwgXyBmYmI6IGlub3V0IEZsYXRCdWZmZXJCdWlsZGVyKSB7IGZiYi5hZGQob2Zmc2V0OiBpbnRlcm5hbE1lc3NhZ2UsIGF0OiBWVE9GRlNFVC5pbnRlcm5hbE1lc3NhZ2UucCkgfQorICBpbnRlcm5hbCBzdGF0aWMgZnVuYyBlbmRNZXNzYWdlKF8gZmJiOiBpbm91dCBGbGF0QnVmZmVyQnVpbGRlciwgc3RhcnQ6IFVPZmZzZXQpIC0+IE9mZnNldCB7IGxldCBlbmQgPSBPZmZzZXQob2Zmc2V0OiBmYmIuZW5kVGFibGUoYXQ6IHN0YXJ0KSk7IHJldHVybiBlbmQgfQorICBpbnRlcm5hbCBzdGF0aWMgZnVuYyBjcmVhdGVNZXNzYWdlKAorICAgIF8gZmJiOiBpbm91dCBGbGF0QnVmZmVyQnVpbGRlciwKKyAgICBpbnRlcm5hbE1lc3NhZ2VPZmZzZXQgaW50ZXJuYWxNZXNzYWdlOiBPZmZzZXQgPSBPZmZzZXQoKQorICApIC0+IE9mZnNldCB7CisgICAgbGV0IF9fc3RhcnQgPSBNZXNzYWdlLnN0YXJ0TWVzc2FnZSgmZmJiKQorICAgIE1lc3NhZ2UuYWRkKGludGVybmFsTWVzc2FnZTogaW50ZXJuYWxNZXNzYWdlLCAmZmJiKQorICAgIHJldHVybiBNZXNzYWdlLmVuZE1lc3NhZ2UoJmZiYiwgc3RhcnQ6IF9fc3RhcnQpCisgIH0KKyAgCisKKyAgaW50ZXJuYWwgbXV0YXRpbmcgZnVuYyB1bnBhY2soKSAtPiBNZXNzYWdlVCB7CisgICAgcmV0dXJuIE1lc3NhZ2VUKCZzZWxmKQorICB9CisgIGludGVybmFsIHN0YXRpYyBmdW5jIHBhY2soXyBidWlsZGVyOiBpbm91dCBGbGF0QnVmZmVyQnVpbGRlciwgb2JqOiBpbm91dCBNZXNzYWdlVD8pIC0+IE9mZnNldCB7CisgICAgZ3VhcmQgdmFyIG9iaiA9IG9iaiBlbHNlIHsgcmV0dXJuIE9mZnNldCgpIH0KKyAgICByZXR1cm4gcGFjaygmYnVpbGRlciwgb2JqOiAmb2JqKQorICB9CisKKyAgaW50ZXJuYWwgc3RhdGljIGZ1bmMgcGFjayhfIGJ1aWxkZXI6IGlub3V0IEZsYXRCdWZmZXJCdWlsZGVyLCBvYmo6IGlub3V0IE1lc3NhZ2VUKSAtPiBPZmZzZXQgeworICAgIGxldCBfX2ludGVybmFsTWVzc2FnZTogT2Zmc2V0CisgICAgaWYgbGV0IHMgPSBvYmouaW50ZXJuYWxNZXNzYWdlIHsKKyAgICAgIF9faW50ZXJuYWxNZXNzYWdlID0gYnVpbGRlci5jcmVhdGUoc3RyaW5nOiBzKQorICAgIH0gZWxzZSB7CisgICAgICBfX2ludGVybmFsTWVzc2FnZSA9IE9mZnNldCgpCisgICAgfQorCisgICAgbGV0IF9fcm9vdCA9IE1lc3NhZ2Uuc3RhcnRNZXNzYWdlKCZidWlsZGVyKQorICAgIE1lc3NhZ2UuYWRkKGludGVybmFsTWVzc2FnZTogX19pbnRlcm5hbE1lc3NhZ2UsICZidWlsZGVyKQorICAgIHJldHVybiBNZXNzYWdlLmVuZE1lc3NhZ2UoJmJ1aWxkZXIsIHN0YXJ0OiBfX3Jvb3QpCisgIH0KKworICBpbnRlcm5hbCBzdGF0aWMgZnVuYyB2ZXJpZnk8VD4oXyB2ZXJpZmllcjogaW5vdXQgVmVyaWZpZXIsIGF0IHBvc2l0aW9uOiBJbnQsIG9mIHR5cGU6IFQuVHlwZSkgdGhyb3dzIHdoZXJlIFQ6IFZlcmlmaWFibGUgeworICAgIHZhciBfdiA9IHRyeSB2ZXJpZmllci52aXNpdFRhYmxlKGF0OiBwb3NpdGlvbikKKyAgICB0cnkgX3YudmlzaXQoZmllbGQ6IFZUT0ZGU0VULmludGVybmFsTWVzc2FnZS5wLCBmaWVsZE5hbWU6ICJpbnRlcm5hbE1lc3NhZ2UiLCByZXF1aXJlZDogZmFsc2UsIHR5cGU6IEZvcndhcmRPZmZzZXQ8U3RyaW5nPi5zZWxmKQorICAgIF92LmZpbmlzaCgpCisgIH0KK30KKworZXh0ZW5zaW9uIE1lc3NhZ2U6IEVuY29kYWJsZSB7CisKKyAgZW51bSBDb2RpbmdLZXlzOiBTdHJpbmcsIENvZGluZ0tleSB7CisgICAgY2FzZSBpbnRlcm5hbE1lc3NhZ2UgPSAiaW50ZXJuYWxfbWVzc2FnZSIKKyAgfQorICBpbnRlcm5hbCBmdW5jIGVuY29kZSh0byBlbmNvZGVyOiBFbmNvZGVyKSB0aHJvd3MgeworICAgIHZhciBjb250YWluZXIgPSBlbmNvZGVyLmNvbnRhaW5lcihrZXllZEJ5OiBDb2RpbmdLZXlzLnNlbGYpCisgICAgdHJ5IGNvbnRhaW5lci5lbmNvZGVJZlByZXNlbnQoaW50ZXJuYWxNZXNzYWdlLCBmb3JLZXk6IC5pbnRlcm5hbE1lc3NhZ2UpCisgIH0KK30KKworaW50ZXJuYWwgY2xhc3MgTWVzc2FnZVQ6IE5hdGl2ZU9iamVjdCB7CisKKyAgaW50ZXJuYWwgdmFyIGludGVybmFsTWVzc2FnZTogU3RyaW5nPworCisgIGludGVybmFsIGluaXQoXyBfdDogaW5vdXQgTWVzc2FnZSkgeworICAgIGludGVybmFsTWVzc2FnZSA9IF90LmludGVybmFsTWVzc2FnZQorICB9CisKKyAgaW50ZXJuYWwgaW5pdCgpIHsKKyAgfQorCisgIGludGVybmFsIGZ1bmMgc2VyaWFsaXplKCkgLT4gQnl0ZUJ1ZmZlciB7IHJldHVybiBzZXJpYWxpemUodHlwZTogTWVzc2FnZS5zZWxmKSB9CisKK30KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL3N3aWZ0L3Rlc3RzL0NvZGVHZW5lcmF0aW9uVGVzdHMvdGVzdF9ub19pbmNsdWRlLmZicyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL3N3aWZ0L3Rlc3RzL0NvZGVHZW5lcmF0aW9uVGVzdHMvdGVzdF9ub19pbmNsdWRlLmZicwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZjk1NDY4Ci0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvc3dpZnQvdGVzdHMvQ29kZUdlbmVyYXRpb25UZXN0cy90ZXN0X25vX2luY2x1ZGUuZmJzCkBAIC0wLDAgKzEsMTMgQEAKK3N0cnVjdCBCeXRlc0NvdW50IHsgCisgIHg6IGludDY0OworfQorCit0YWJsZSBJbnRlcm5hbE1lc3NhZ2UgeyAKKyAgc3RyOiBzdHJpbmc7Cit9CisKK3RhYmxlIE1lc3NhZ2UgeyAKKyAgaWQ6IGludDY0OworICBwb3NpdGlvbjogQnl0ZXNDb3VudCAocmVxdWlyZWQpOworICBwb2ludGVyOiBJbnRlcm5hbE1lc3NhZ2UgKHJlcXVpcmVkKTsKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9zd2lmdC90ZXN0cy9Db2RlR2VuZXJhdGlvblRlc3RzL3Rlc3Rfbm9faW5jbHVkZV9nZW5lcmF0ZWQuc3dpZnQgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9zd2lmdC90ZXN0cy9Db2RlR2VuZXJhdGlvblRlc3RzL3Rlc3Rfbm9faW5jbHVkZV9nZW5lcmF0ZWQuc3dpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzM0OGIwNQotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL3N3aWZ0L3Rlc3RzL0NvZGVHZW5lcmF0aW9uVGVzdHMvdGVzdF9ub19pbmNsdWRlX2dlbmVyYXRlZC5zd2lmdApAQCAtMCwwICsxLDI2NSBAQAorLy8gYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgYnkgdGhlIEZsYXRCdWZmZXJzIGNvbXBpbGVyLCBkbyBub3QgbW9kaWZ5CisvLyBzd2lmdGxpbnQ6ZGlzYWJsZSBhbGwKKy8vIHN3aWZ0Zm9ybWF0OmRpc2FibGUgYWxsCisKK3B1YmxpYyBzdHJ1Y3QgQnl0ZXNDb3VudDogTmF0aXZlU3RydWN0LCBWZXJpZmlhYmxlLCBGbGF0YnVmZmVyc0luaXRpYWxpemFibGUsIE5hdGl2ZU9iamVjdCB7CisKKyAgc3RhdGljIGZ1bmMgdmFsaWRhdGVWZXJzaW9uKCkgeyBGbGF0QnVmZmVyc1ZlcnNpb25fMl8wXzgoKSB9CisKKyAgcHJpdmF0ZSB2YXIgX3g6IEludDY0CisKKyAgcHVibGljIGluaXQoXyBiYjogQnl0ZUJ1ZmZlciwgbzogSW50MzIpIHsKKyAgICBsZXQgX2FjY2Vzc29yID0gU3RydWN0KGJiOiBiYiwgcG9zaXRpb246IG8pCisgICAgX3ggPSBfYWNjZXNzb3IucmVhZEJ1ZmZlcihvZjogSW50NjQuc2VsZiwgYXQ6IDApCisgIH0KKworICBwdWJsaWMgaW5pdCh4OiBJbnQ2NCkgeworICAgIF94ID0geAorICB9CisKKyAgcHVibGljIGluaXQoKSB7CisgICAgX3ggPSAwCisgIH0KKworICBwdWJsaWMgaW5pdChfIF90OiBpbm91dCBCeXRlc0NvdW50X011dGFibGUpIHsKKyAgICBfeCA9IF90LngKKyAgfQorCisgIHB1YmxpYyB2YXIgeDogSW50NjQgeyBfeCB9CisKKyAgcHVibGljIHN0YXRpYyBmdW5jIHZlcmlmeTxUPihfIHZlcmlmaWVyOiBpbm91dCBWZXJpZmllciwgYXQgcG9zaXRpb246IEludCwgb2YgdHlwZTogVC5UeXBlKSB0aHJvd3Mgd2hlcmUgVDogVmVyaWZpYWJsZSB7CisgICAgdHJ5IHZlcmlmaWVyLmluQnVmZmVyKHBvc2l0aW9uOiBwb3NpdGlvbiwgb2Y6IEJ5dGVzQ291bnQuc2VsZikKKyAgfQorfQorCitleHRlbnNpb24gQnl0ZXNDb3VudDogRW5jb2RhYmxlIHsKKworICBlbnVtIENvZGluZ0tleXM6IFN0cmluZywgQ29kaW5nS2V5IHsKKyAgICBjYXNlIHggPSAieCIKKyAgfQorICBwdWJsaWMgZnVuYyBlbmNvZGUodG8gZW5jb2RlcjogRW5jb2RlcikgdGhyb3dzIHsKKyAgICB2YXIgY29udGFpbmVyID0gZW5jb2Rlci5jb250YWluZXIoa2V5ZWRCeTogQ29kaW5nS2V5cy5zZWxmKQorICAgIGlmIHggIT0gMCB7CisgICAgICB0cnkgY29udGFpbmVyLmVuY29kZUlmUHJlc2VudCh4LCBmb3JLZXk6IC54KQorICAgIH0KKyAgfQorfQorCitwdWJsaWMgc3RydWN0IEJ5dGVzQ291bnRfTXV0YWJsZTogRmxhdEJ1ZmZlck9iamVjdCB7CisKKyAgc3RhdGljIGZ1bmMgdmFsaWRhdGVWZXJzaW9uKCkgeyBGbGF0QnVmZmVyc1ZlcnNpb25fMl8wXzgoKSB9CisgIHB1YmxpYyB2YXIgX19idWZmZXI6IEJ5dGVCdWZmZXIhIHsgcmV0dXJuIF9hY2Nlc3Nvci5iYiB9CisgIHByaXZhdGUgdmFyIF9hY2Nlc3NvcjogU3RydWN0CisKKyAgcHVibGljIGluaXQoXyBiYjogQnl0ZUJ1ZmZlciwgbzogSW50MzIpIHsgX2FjY2Vzc29yID0gU3RydWN0KGJiOiBiYiwgcG9zaXRpb246IG8pIH0KKworICBwdWJsaWMgdmFyIHg6IEludDY0IHsgcmV0dXJuIF9hY2Nlc3Nvci5yZWFkQnVmZmVyKG9mOiBJbnQ2NC5zZWxmLCBhdDogMCkgfQorICBAZGlzY2FyZGFibGVSZXN1bHQgcHVibGljIGZ1bmMgbXV0YXRlKHg6IEludDY0KSAtPiBCb29sIHsgcmV0dXJuIF9hY2Nlc3Nvci5tdXRhdGUoeCwgaW5kZXg6IDApIH0KKyAgCisKKyAgcHVibGljIG11dGF0aW5nIGZ1bmMgdW5wYWNrKCkgLT4gQnl0ZXNDb3VudCB7CisgICAgcmV0dXJuIEJ5dGVzQ291bnQoJnNlbGYpCisgIH0KKyAgcHVibGljIHN0YXRpYyBmdW5jIHBhY2soXyBidWlsZGVyOiBpbm91dCBGbGF0QnVmZmVyQnVpbGRlciwgb2JqOiBpbm91dCBCeXRlc0NvdW50PykgLT4gT2Zmc2V0IHsKKyAgICBndWFyZCB2YXIgb2JqID0gb2JqIGVsc2UgeyByZXR1cm4gT2Zmc2V0KCkgfQorICAgIHJldHVybiBwYWNrKCZidWlsZGVyLCBvYmo6ICZvYmopCisgIH0KKworICBwdWJsaWMgc3RhdGljIGZ1bmMgcGFjayhfIGJ1aWxkZXI6IGlub3V0IEZsYXRCdWZmZXJCdWlsZGVyLCBvYmo6IGlub3V0IEJ5dGVzQ291bnQpIC0+IE9mZnNldCB7CisgICAgcmV0dXJuIGJ1aWxkZXIuY3JlYXRlKHN0cnVjdDogb2JqKQorICB9Cit9CisKK3B1YmxpYyBzdHJ1Y3QgSW50ZXJuYWxNZXNzYWdlOiBGbGF0QnVmZmVyT2JqZWN0LCBWZXJpZmlhYmxlLCBPYmplY3RBUElQYWNrZXIgeworCisgIHN0YXRpYyBmdW5jIHZhbGlkYXRlVmVyc2lvbigpIHsgRmxhdEJ1ZmZlcnNWZXJzaW9uXzJfMF84KCkgfQorICBwdWJsaWMgdmFyIF9fYnVmZmVyOiBCeXRlQnVmZmVyISB7IHJldHVybiBfYWNjZXNzb3IuYmIgfQorICBwcml2YXRlIHZhciBfYWNjZXNzb3I6IFRhYmxlCisKKyAgcHVibGljIHN0YXRpYyBmdW5jIGdldFJvb3RBc0ludGVybmFsTWVzc2FnZShiYjogQnl0ZUJ1ZmZlcikgLT4gSW50ZXJuYWxNZXNzYWdlIHsgcmV0dXJuIEludGVybmFsTWVzc2FnZShUYWJsZShiYjogYmIsIHBvc2l0aW9uOiBJbnQzMihiYi5yZWFkKGRlZjogVU9mZnNldC5zZWxmLCBwb3NpdGlvbjogYmIucmVhZGVyKSkgKyBJbnQzMihiYi5yZWFkZXIpKSkgfQorCisgIHByaXZhdGUgaW5pdChfIHQ6IFRhYmxlKSB7IF9hY2Nlc3NvciA9IHQgfQorICBwdWJsaWMgaW5pdChfIGJiOiBCeXRlQnVmZmVyLCBvOiBJbnQzMikgeyBfYWNjZXNzb3IgPSBUYWJsZShiYjogYmIsIHBvc2l0aW9uOiBvKSB9CisKKyAgcHJpdmF0ZSBlbnVtIFZUT0ZGU0VUOiBWT2Zmc2V0IHsKKyAgICBjYXNlIHN0ciA9IDQKKyAgICB2YXIgdjogSW50MzIgeyBJbnQzMihzZWxmLnJhd1ZhbHVlKSB9CisgICAgdmFyIHA6IFZPZmZzZXQgeyBzZWxmLnJhd1ZhbHVlIH0KKyAgfQorCisgIHB1YmxpYyB2YXIgc3RyOiBTdHJpbmc/IHsgbGV0IG8gPSBfYWNjZXNzb3Iub2Zmc2V0KFZUT0ZGU0VULnN0ci52KTsgcmV0dXJuIG8gPT0gMCA/IG5pbCA6IF9hY2Nlc3Nvci5zdHJpbmcoYXQ6IG8pIH0KKyAgcHVibGljIHZhciBzdHJTZWdtZW50QXJyYXk6IFtVSW50OF0/IHsgcmV0dXJuIF9hY2Nlc3Nvci5nZXRWZWN0b3IoYXQ6IFZUT0ZGU0VULnN0ci52KSB9CisgIHB1YmxpYyBzdGF0aWMgZnVuYyBzdGFydEludGVybmFsTWVzc2FnZShfIGZiYjogaW5vdXQgRmxhdEJ1ZmZlckJ1aWxkZXIpIC0+IFVPZmZzZXQgeyBmYmIuc3RhcnRUYWJsZSh3aXRoOiAxKSB9CisgIHB1YmxpYyBzdGF0aWMgZnVuYyBhZGQoc3RyOiBPZmZzZXQsIF8gZmJiOiBpbm91dCBGbGF0QnVmZmVyQnVpbGRlcikgeyBmYmIuYWRkKG9mZnNldDogc3RyLCBhdDogVlRPRkZTRVQuc3RyLnApIH0KKyAgcHVibGljIHN0YXRpYyBmdW5jIGVuZEludGVybmFsTWVzc2FnZShfIGZiYjogaW5vdXQgRmxhdEJ1ZmZlckJ1aWxkZXIsIHN0YXJ0OiBVT2Zmc2V0KSAtPiBPZmZzZXQgeyBsZXQgZW5kID0gT2Zmc2V0KG9mZnNldDogZmJiLmVuZFRhYmxlKGF0OiBzdGFydCkpOyByZXR1cm4gZW5kIH0KKyAgcHVibGljIHN0YXRpYyBmdW5jIGNyZWF0ZUludGVybmFsTWVzc2FnZSgKKyAgICBfIGZiYjogaW5vdXQgRmxhdEJ1ZmZlckJ1aWxkZXIsCisgICAgc3RyT2Zmc2V0IHN0cjogT2Zmc2V0ID0gT2Zmc2V0KCkKKyAgKSAtPiBPZmZzZXQgeworICAgIGxldCBfX3N0YXJ0ID0gSW50ZXJuYWxNZXNzYWdlLnN0YXJ0SW50ZXJuYWxNZXNzYWdlKCZmYmIpCisgICAgSW50ZXJuYWxNZXNzYWdlLmFkZChzdHI6IHN0ciwgJmZiYikKKyAgICByZXR1cm4gSW50ZXJuYWxNZXNzYWdlLmVuZEludGVybmFsTWVzc2FnZSgmZmJiLCBzdGFydDogX19zdGFydCkKKyAgfQorICAKKworICBwdWJsaWMgbXV0YXRpbmcgZnVuYyB1bnBhY2soKSAtPiBJbnRlcm5hbE1lc3NhZ2VUIHsKKyAgICByZXR1cm4gSW50ZXJuYWxNZXNzYWdlVCgmc2VsZikKKyAgfQorICBwdWJsaWMgc3RhdGljIGZ1bmMgcGFjayhfIGJ1aWxkZXI6IGlub3V0IEZsYXRCdWZmZXJCdWlsZGVyLCBvYmo6IGlub3V0IEludGVybmFsTWVzc2FnZVQ/KSAtPiBPZmZzZXQgeworICAgIGd1YXJkIHZhciBvYmogPSBvYmogZWxzZSB7IHJldHVybiBPZmZzZXQoKSB9CisgICAgcmV0dXJuIHBhY2soJmJ1aWxkZXIsIG9iajogJm9iaikKKyAgfQorCisgIHB1YmxpYyBzdGF0aWMgZnVuYyBwYWNrKF8gYnVpbGRlcjogaW5vdXQgRmxhdEJ1ZmZlckJ1aWxkZXIsIG9iajogaW5vdXQgSW50ZXJuYWxNZXNzYWdlVCkgLT4gT2Zmc2V0IHsKKyAgICBsZXQgX19zdHI6IE9mZnNldAorICAgIGlmIGxldCBzID0gb2JqLnN0ciB7CisgICAgICBfX3N0ciA9IGJ1aWxkZXIuY3JlYXRlKHN0cmluZzogcykKKyAgICB9IGVsc2UgeworICAgICAgX19zdHIgPSBPZmZzZXQoKQorICAgIH0KKworICAgIGxldCBfX3Jvb3QgPSBJbnRlcm5hbE1lc3NhZ2Uuc3RhcnRJbnRlcm5hbE1lc3NhZ2UoJmJ1aWxkZXIpCisgICAgSW50ZXJuYWxNZXNzYWdlLmFkZChzdHI6IF9fc3RyLCAmYnVpbGRlcikKKyAgICByZXR1cm4gSW50ZXJuYWxNZXNzYWdlLmVuZEludGVybmFsTWVzc2FnZSgmYnVpbGRlciwgc3RhcnQ6IF9fcm9vdCkKKyAgfQorCisgIHB1YmxpYyBzdGF0aWMgZnVuYyB2ZXJpZnk8VD4oXyB2ZXJpZmllcjogaW5vdXQgVmVyaWZpZXIsIGF0IHBvc2l0aW9uOiBJbnQsIG9mIHR5cGU6IFQuVHlwZSkgdGhyb3dzIHdoZXJlIFQ6IFZlcmlmaWFibGUgeworICAgIHZhciBfdiA9IHRyeSB2ZXJpZmllci52aXNpdFRhYmxlKGF0OiBwb3NpdGlvbikKKyAgICB0cnkgX3YudmlzaXQoZmllbGQ6IFZUT0ZGU0VULnN0ci5wLCBmaWVsZE5hbWU6ICJzdHIiLCByZXF1aXJlZDogZmFsc2UsIHR5cGU6IEZvcndhcmRPZmZzZXQ8U3RyaW5nPi5zZWxmKQorICAgIF92LmZpbmlzaCgpCisgIH0KK30KKworZXh0ZW5zaW9uIEludGVybmFsTWVzc2FnZTogRW5jb2RhYmxlIHsKKworICBlbnVtIENvZGluZ0tleXM6IFN0cmluZywgQ29kaW5nS2V5IHsKKyAgICBjYXNlIHN0ciA9ICJzdHIiCisgIH0KKyAgcHVibGljIGZ1bmMgZW5jb2RlKHRvIGVuY29kZXI6IEVuY29kZXIpIHRocm93cyB7CisgICAgdmFyIGNvbnRhaW5lciA9IGVuY29kZXIuY29udGFpbmVyKGtleWVkQnk6IENvZGluZ0tleXMuc2VsZikKKyAgICB0cnkgY29udGFpbmVyLmVuY29kZUlmUHJlc2VudChzdHIsIGZvcktleTogLnN0cikKKyAgfQorfQorCitwdWJsaWMgY2xhc3MgSW50ZXJuYWxNZXNzYWdlVDogTmF0aXZlT2JqZWN0IHsKKworICBwdWJsaWMgdmFyIHN0cjogU3RyaW5nPworCisgIHB1YmxpYyBpbml0KF8gX3Q6IGlub3V0IEludGVybmFsTWVzc2FnZSkgeworICAgIHN0ciA9IF90LnN0cgorICB9CisKKyAgcHVibGljIGluaXQoKSB7CisgIH0KKworICBwdWJsaWMgZnVuYyBzZXJpYWxpemUoKSAtPiBCeXRlQnVmZmVyIHsgcmV0dXJuIHNlcmlhbGl6ZSh0eXBlOiBJbnRlcm5hbE1lc3NhZ2Uuc2VsZikgfQorCit9CitwdWJsaWMgc3RydWN0IE1lc3NhZ2U6IEZsYXRCdWZmZXJPYmplY3QsIFZlcmlmaWFibGUsIE9iamVjdEFQSVBhY2tlciB7CisKKyAgc3RhdGljIGZ1bmMgdmFsaWRhdGVWZXJzaW9uKCkgeyBGbGF0QnVmZmVyc1ZlcnNpb25fMl8wXzgoKSB9CisgIHB1YmxpYyB2YXIgX19idWZmZXI6IEJ5dGVCdWZmZXIhIHsgcmV0dXJuIF9hY2Nlc3Nvci5iYiB9CisgIHByaXZhdGUgdmFyIF9hY2Nlc3NvcjogVGFibGUKKworICBwdWJsaWMgc3RhdGljIGZ1bmMgZ2V0Um9vdEFzTWVzc2FnZShiYjogQnl0ZUJ1ZmZlcikgLT4gTWVzc2FnZSB7IHJldHVybiBNZXNzYWdlKFRhYmxlKGJiOiBiYiwgcG9zaXRpb246IEludDMyKGJiLnJlYWQoZGVmOiBVT2Zmc2V0LnNlbGYsIHBvc2l0aW9uOiBiYi5yZWFkZXIpKSArIEludDMyKGJiLnJlYWRlcikpKSB9CisKKyAgcHJpdmF0ZSBpbml0KF8gdDogVGFibGUpIHsgX2FjY2Vzc29yID0gdCB9CisgIHB1YmxpYyBpbml0KF8gYmI6IEJ5dGVCdWZmZXIsIG86IEludDMyKSB7IF9hY2Nlc3NvciA9IFRhYmxlKGJiOiBiYiwgcG9zaXRpb246IG8pIH0KKworICBwcml2YXRlIGVudW0gVlRPRkZTRVQ6IFZPZmZzZXQgeworICAgIGNhc2UgaWQgPSA0CisgICAgY2FzZSBwb3NpdGlvbiA9IDYKKyAgICBjYXNlIHBvaW50ZXIgPSA4CisgICAgdmFyIHY6IEludDMyIHsgSW50MzIoc2VsZi5yYXdWYWx1ZSkgfQorICAgIHZhciBwOiBWT2Zmc2V0IHsgc2VsZi5yYXdWYWx1ZSB9CisgIH0KKworICBwdWJsaWMgdmFyIGlkOiBJbnQ2NCB7IGxldCBvID0gX2FjY2Vzc29yLm9mZnNldChWVE9GRlNFVC5pZC52KTsgcmV0dXJuIG8gPT0gMCA/IDAgOiBfYWNjZXNzb3IucmVhZEJ1ZmZlcihvZjogSW50NjQuc2VsZiwgYXQ6IG8pIH0KKyAgQGRpc2NhcmRhYmxlUmVzdWx0IHB1YmxpYyBmdW5jIG11dGF0ZShpZDogSW50NjQpIC0+IEJvb2wge2xldCBvID0gX2FjY2Vzc29yLm9mZnNldChWVE9GRlNFVC5pZC52KTsgIHJldHVybiBfYWNjZXNzb3IubXV0YXRlKGlkLCBpbmRleDogbykgfQorICBwdWJsaWMgdmFyIHBvc2l0aW9uOiBCeXRlc0NvdW50ISB7IGxldCBvID0gX2FjY2Vzc29yLm9mZnNldChWVE9GRlNFVC5wb3NpdGlvbi52KTsgcmV0dXJuIF9hY2Nlc3Nvci5yZWFkQnVmZmVyKG9mOiBCeXRlc0NvdW50LnNlbGYsIGF0OiBvKSB9CisgIHB1YmxpYyB2YXIgbXV0YWJsZVBvc2l0aW9uOiBCeXRlc0NvdW50X011dGFibGUhIHsgbGV0IG8gPSBfYWNjZXNzb3Iub2Zmc2V0KFZUT0ZGU0VULnBvc2l0aW9uLnYpOyByZXR1cm4gQnl0ZXNDb3VudF9NdXRhYmxlKF9hY2Nlc3Nvci5iYiwgbzogbyArIF9hY2Nlc3Nvci5wb3N0aW9uKSB9CisgIHB1YmxpYyB2YXIgcG9pbnRlcjogSW50ZXJuYWxNZXNzYWdlISB7IGxldCBvID0gX2FjY2Vzc29yLm9mZnNldChWVE9GRlNFVC5wb2ludGVyLnYpOyByZXR1cm4gSW50ZXJuYWxNZXNzYWdlKF9hY2Nlc3Nvci5iYiwgbzogX2FjY2Vzc29yLmluZGlyZWN0KG8gKyBfYWNjZXNzb3IucG9zdGlvbikpIH0KKyAgcHVibGljIHN0YXRpYyBmdW5jIHN0YXJ0TWVzc2FnZShfIGZiYjogaW5vdXQgRmxhdEJ1ZmZlckJ1aWxkZXIpIC0+IFVPZmZzZXQgeyBmYmIuc3RhcnRUYWJsZSh3aXRoOiAzKSB9CisgIHB1YmxpYyBzdGF0aWMgZnVuYyBhZGQoaWQ6IEludDY0LCBfIGZiYjogaW5vdXQgRmxhdEJ1ZmZlckJ1aWxkZXIpIHsgZmJiLmFkZChlbGVtZW50OiBpZCwgZGVmOiAwLCBhdDogVlRPRkZTRVQuaWQucCkgfQorICBwdWJsaWMgc3RhdGljIGZ1bmMgYWRkKHBvc2l0aW9uOiBCeXRlc0NvdW50PywgXyBmYmI6IGlub3V0IEZsYXRCdWZmZXJCdWlsZGVyKSB7IGd1YXJkIGxldCBwb3NpdGlvbiA9IHBvc2l0aW9uIGVsc2UgeyByZXR1cm4gfTsgZmJiLmNyZWF0ZShzdHJ1Y3Q6IHBvc2l0aW9uLCBwb3NpdGlvbjogVlRPRkZTRVQucG9zaXRpb24ucCkgfQorICBwdWJsaWMgc3RhdGljIGZ1bmMgYWRkKHBvaW50ZXI6IE9mZnNldCwgXyBmYmI6IGlub3V0IEZsYXRCdWZmZXJCdWlsZGVyKSB7IGZiYi5hZGQob2Zmc2V0OiBwb2ludGVyLCBhdDogVlRPRkZTRVQucG9pbnRlci5wKSB9CisgIHB1YmxpYyBzdGF0aWMgZnVuYyBlbmRNZXNzYWdlKF8gZmJiOiBpbm91dCBGbGF0QnVmZmVyQnVpbGRlciwgc3RhcnQ6IFVPZmZzZXQpIC0+IE9mZnNldCB7IGxldCBlbmQgPSBPZmZzZXQob2Zmc2V0OiBmYmIuZW5kVGFibGUoYXQ6IHN0YXJ0KSk7IGZiYi5yZXF1aXJlKHRhYmxlOiBlbmQsIGZpZWxkczogWzYsIDhdKTsgcmV0dXJuIGVuZCB9CisgIHB1YmxpYyBzdGF0aWMgZnVuYyBjcmVhdGVNZXNzYWdlKAorICAgIF8gZmJiOiBpbm91dCBGbGF0QnVmZmVyQnVpbGRlciwKKyAgICBpZDogSW50NjQgPSAwLAorICAgIHBvc2l0aW9uOiBCeXRlc0NvdW50LAorICAgIHBvaW50ZXJPZmZzZXQgcG9pbnRlcjogT2Zmc2V0CisgICkgLT4gT2Zmc2V0IHsKKyAgICBsZXQgX19zdGFydCA9IE1lc3NhZ2Uuc3RhcnRNZXNzYWdlKCZmYmIpCisgICAgTWVzc2FnZS5hZGQoaWQ6IGlkLCAmZmJiKQorICAgIE1lc3NhZ2UuYWRkKHBvc2l0aW9uOiBwb3NpdGlvbiwgJmZiYikKKyAgICBNZXNzYWdlLmFkZChwb2ludGVyOiBwb2ludGVyLCAmZmJiKQorICAgIHJldHVybiBNZXNzYWdlLmVuZE1lc3NhZ2UoJmZiYiwgc3RhcnQ6IF9fc3RhcnQpCisgIH0KKyAgCisKKyAgcHVibGljIG11dGF0aW5nIGZ1bmMgdW5wYWNrKCkgLT4gTWVzc2FnZVQgeworICAgIHJldHVybiBNZXNzYWdlVCgmc2VsZikKKyAgfQorICBwdWJsaWMgc3RhdGljIGZ1bmMgcGFjayhfIGJ1aWxkZXI6IGlub3V0IEZsYXRCdWZmZXJCdWlsZGVyLCBvYmo6IGlub3V0IE1lc3NhZ2VUPykgLT4gT2Zmc2V0IHsKKyAgICBndWFyZCB2YXIgb2JqID0gb2JqIGVsc2UgeyByZXR1cm4gT2Zmc2V0KCkgfQorICAgIHJldHVybiBwYWNrKCZidWlsZGVyLCBvYmo6ICZvYmopCisgIH0KKworICBwdWJsaWMgc3RhdGljIGZ1bmMgcGFjayhfIGJ1aWxkZXI6IGlub3V0IEZsYXRCdWZmZXJCdWlsZGVyLCBvYmo6IGlub3V0IE1lc3NhZ2VUKSAtPiBPZmZzZXQgeworICAgIGxldCBfX3BvaW50ZXIgPSBJbnRlcm5hbE1lc3NhZ2UucGFjaygmYnVpbGRlciwgb2JqOiAmb2JqLnBvaW50ZXIpCisgICAgbGV0IF9fcm9vdCA9IE1lc3NhZ2Uuc3RhcnRNZXNzYWdlKCZidWlsZGVyKQorICAgIE1lc3NhZ2UuYWRkKGlkOiBvYmouaWQsICZidWlsZGVyKQorICAgIE1lc3NhZ2UuYWRkKHBvc2l0aW9uOiBvYmoucG9zaXRpb24sICZidWlsZGVyKQorICAgIE1lc3NhZ2UuYWRkKHBvaW50ZXI6IF9fcG9pbnRlciwgJmJ1aWxkZXIpCisgICAgcmV0dXJuIE1lc3NhZ2UuZW5kTWVzc2FnZSgmYnVpbGRlciwgc3RhcnQ6IF9fcm9vdCkKKyAgfQorCisgIHB1YmxpYyBzdGF0aWMgZnVuYyB2ZXJpZnk8VD4oXyB2ZXJpZmllcjogaW5vdXQgVmVyaWZpZXIsIGF0IHBvc2l0aW9uOiBJbnQsIG9mIHR5cGU6IFQuVHlwZSkgdGhyb3dzIHdoZXJlIFQ6IFZlcmlmaWFibGUgeworICAgIHZhciBfdiA9IHRyeSB2ZXJpZmllci52aXNpdFRhYmxlKGF0OiBwb3NpdGlvbikKKyAgICB0cnkgX3YudmlzaXQoZmllbGQ6IFZUT0ZGU0VULmlkLnAsIGZpZWxkTmFtZTogImlkIiwgcmVxdWlyZWQ6IGZhbHNlLCB0eXBlOiBJbnQ2NC5zZWxmKQorICAgIHRyeSBfdi52aXNpdChmaWVsZDogVlRPRkZTRVQucG9zaXRpb24ucCwgZmllbGROYW1lOiAicG9zaXRpb24iLCByZXF1aXJlZDogdHJ1ZSwgdHlwZTogQnl0ZXNDb3VudC5zZWxmKQorICAgIHRyeSBfdi52aXNpdChmaWVsZDogVlRPRkZTRVQucG9pbnRlci5wLCBmaWVsZE5hbWU6ICJwb2ludGVyIiwgcmVxdWlyZWQ6IHRydWUsIHR5cGU6IEZvcndhcmRPZmZzZXQ8SW50ZXJuYWxNZXNzYWdlPi5zZWxmKQorICAgIF92LmZpbmlzaCgpCisgIH0KK30KKworZXh0ZW5zaW9uIE1lc3NhZ2U6IEVuY29kYWJsZSB7CisKKyAgZW51bSBDb2RpbmdLZXlzOiBTdHJpbmcsIENvZGluZ0tleSB7CisgICAgY2FzZSBpZCA9ICJpZCIKKyAgICBjYXNlIHBvc2l0aW9uID0gInBvc2l0aW9uIgorICAgIGNhc2UgcG9pbnRlciA9ICJwb2ludGVyIgorICB9CisgIHB1YmxpYyBmdW5jIGVuY29kZSh0byBlbmNvZGVyOiBFbmNvZGVyKSB0aHJvd3MgeworICAgIHZhciBjb250YWluZXIgPSBlbmNvZGVyLmNvbnRhaW5lcihrZXllZEJ5OiBDb2RpbmdLZXlzLnNlbGYpCisgICAgaWYgaWQgIT0gMCB7CisgICAgICB0cnkgY29udGFpbmVyLmVuY29kZUlmUHJlc2VudChpZCwgZm9yS2V5OiAuaWQpCisgICAgfQorICAgIHRyeSBjb250YWluZXIuZW5jb2RlSWZQcmVzZW50KHBvc2l0aW9uLCBmb3JLZXk6IC5wb3NpdGlvbikKKyAgICB0cnkgY29udGFpbmVyLmVuY29kZUlmUHJlc2VudChwb2ludGVyLCBmb3JLZXk6IC5wb2ludGVyKQorICB9Cit9CisKK3B1YmxpYyBjbGFzcyBNZXNzYWdlVDogTmF0aXZlT2JqZWN0IHsKKworICBwdWJsaWMgdmFyIGlkOiBJbnQ2NAorICBwdWJsaWMgdmFyIHBvc2l0aW9uOiBCeXRlc0NvdW50CisgIHB1YmxpYyB2YXIgcG9pbnRlcjogSW50ZXJuYWxNZXNzYWdlVAorCisgIHB1YmxpYyBpbml0KF8gX3Q6IGlub3V0IE1lc3NhZ2UpIHsKKyAgICBpZCA9IF90LmlkCisgICAgcG9zaXRpb24gPSBfdC5wb3NpdGlvbgorICAgIHZhciBfX3BvaW50ZXIgPSBfdC5wb2ludGVyCisgICAgcG9pbnRlciA9IF9fcG9pbnRlciEudW5wYWNrKCkKKyAgfQorCisgIHB1YmxpYyBpbml0KCkgeworICAgIGlkID0gMAorICAgIHBvc2l0aW9uID0gQnl0ZXNDb3VudCgpCisgICAgcG9pbnRlciA9IEludGVybmFsTWVzc2FnZVQoKQorICB9CisKKyAgcHVibGljIGZ1bmMgc2VyaWFsaXplKCkgLT4gQnl0ZUJ1ZmZlciB7IHJldHVybiBzZXJpYWxpemUodHlwZTogTWVzc2FnZS5zZWxmKSB9CisKK30KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL0ZsYXRCdWZmZXJzLlRlc3QuU3dpZnQvUGFja2FnZS5zd2lmdCBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL3N3aWZ0L3Rlc3RzL1BhY2thZ2Uuc3dpZnQKc2ltaWxhcml0eSBpbmRleCA5NiUKcmVuYW1lIGZyb20gdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvRmxhdEJ1ZmZlcnMuVGVzdC5Td2lmdC9QYWNrYWdlLnN3aWZ0CnJlbmFtZSB0byB0aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9zd2lmdC90ZXN0cy9QYWNrYWdlLnN3aWZ0CmluZGV4IGUyYTUzZGYuLjY0ZmNkNTQgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL0ZsYXRCdWZmZXJzLlRlc3QuU3dpZnQvUGFja2FnZS5zd2lmdAorKysgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9zd2lmdC90ZXN0cy9QYWNrYWdlLnN3aWZ0CkBAIC0yNCw3ICsyNCw3IEBACiAgICAgLm1hY09TKC52MTBfMTQpLAogICBdLAogICBkZXBlbmRlbmNpZXM6IFsKLSAgICAucGFja2FnZShwYXRoOiAiLi4vLi4vc3dpZnQvIiksCisgICAgLnBhY2thZ2UocGF0aDogIi4uLy4uLy4uL3N3aWZ0IiksCiAgICAgLnBhY2thZ2UodXJsOiAiaHR0cHM6Ly9naXRodWIuY29tL2dycGMvZ3JwYy1zd2lmdC5naXQiLCBmcm9tOiAiMS40LjEiKSwKICAgXSwKICAgdGFyZ2V0czogWwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvRmxhdEJ1ZmZlcnMuVGVzdC5Td2lmdC9Tb3VyY2VzL1N3aWZ0RmxhdEJ1ZmZlcnMvZnV6emVyLmZicyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL3N3aWZ0L3Rlc3RzL1NvdXJjZXMvU3dpZnRGbGF0QnVmZmVycy9mdXp6ZXIuZmJzCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSB0aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9GbGF0QnVmZmVycy5UZXN0LlN3aWZ0L1NvdXJjZXMvU3dpZnRGbGF0QnVmZmVycy9mdXp6ZXIuZmJzCnJlbmFtZSB0byB0aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9zd2lmdC90ZXN0cy9Tb3VyY2VzL1N3aWZ0RmxhdEJ1ZmZlcnMvZnV6emVyLmZicwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvRmxhdEJ1ZmZlcnMuVGVzdC5Td2lmdC9Tb3VyY2VzL1N3aWZ0RmxhdEJ1ZmZlcnMvZnV6emVyX2dlbmVyYXRlZC5zd2lmdCBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL3N3aWZ0L3Rlc3RzL1NvdXJjZXMvU3dpZnRGbGF0QnVmZmVycy9mdXp6ZXJfZ2VuZXJhdGVkLnN3aWZ0CnNpbWlsYXJpdHkgaW5kZXggOTUlCnJlbmFtZSBmcm9tIHRoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL0ZsYXRCdWZmZXJzLlRlc3QuU3dpZnQvU291cmNlcy9Td2lmdEZsYXRCdWZmZXJzL2Z1enplcl9nZW5lcmF0ZWQuc3dpZnQKcmVuYW1lIHRvIHRoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL3N3aWZ0L3Rlc3RzL1NvdXJjZXMvU3dpZnRGbGF0QnVmZmVycy9mdXp6ZXJfZ2VuZXJhdGVkLnN3aWZ0CmluZGV4IDcwNTEzODAuLmZlN2NhMGIgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL0ZsYXRCdWZmZXJzLlRlc3QuU3dpZnQvU291cmNlcy9Td2lmdEZsYXRCdWZmZXJzL2Z1enplcl9nZW5lcmF0ZWQuc3dpZnQKKysrIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvc3dpZnQvdGVzdHMvU291cmNlcy9Td2lmdEZsYXRCdWZmZXJzL2Z1enplcl9nZW5lcmF0ZWQuc3dpZnQKQEAgLTMyLDcgKzMyLDcgQEAKIAogcHVibGljIHN0cnVjdCBUZXN0OiBOYXRpdmVTdHJ1Y3QsIFZlcmlmaWFibGUsIEZsYXRidWZmZXJzSW5pdGlhbGl6YWJsZSB7CiAKLSAgc3RhdGljIGZ1bmMgdmFsaWRhdGVWZXJzaW9uKCkgeyBGbGF0QnVmZmVyc1ZlcnNpb25fMl8wXzAoKSB9CisgIHN0YXRpYyBmdW5jIHZhbGlkYXRlVmVyc2lvbigpIHsgRmxhdEJ1ZmZlcnNWZXJzaW9uXzJfMF84KCkgfQogCiAgIHByaXZhdGUgdmFyIF9hOiBJbnQxNgogICBwcml2YXRlIHZhciBfYjogSW50OApAQCAtODEsNyArODEsNyBAQAogCiBwdWJsaWMgc3RydWN0IFRlc3RfTXV0YWJsZTogRmxhdEJ1ZmZlck9iamVjdCB7CiAKLSAgc3RhdGljIGZ1bmMgdmFsaWRhdGVWZXJzaW9uKCkgeyBGbGF0QnVmZmVyc1ZlcnNpb25fMl8wXzAoKSB9CisgIHN0YXRpYyBmdW5jIHZhbGlkYXRlVmVyc2lvbigpIHsgRmxhdEJ1ZmZlcnNWZXJzaW9uXzJfMF84KCkgfQogICBwdWJsaWMgdmFyIF9fYnVmZmVyOiBCeXRlQnVmZmVyISB7IHJldHVybiBfYWNjZXNzb3IuYmIgfQogICBwcml2YXRlIHZhciBfYWNjZXNzb3I6IFN0cnVjdAogCkBAIC05Myw3ICs5Myw3IEBACiAKIHB1YmxpYyBzdHJ1Y3QgVmVjMzogTmF0aXZlU3RydWN0LCBWZXJpZmlhYmxlLCBGbGF0YnVmZmVyc0luaXRpYWxpemFibGUgewogCi0gIHN0YXRpYyBmdW5jIHZhbGlkYXRlVmVyc2lvbigpIHsgRmxhdEJ1ZmZlcnNWZXJzaW9uXzJfMF8wKCkgfQorICBzdGF0aWMgZnVuYyB2YWxpZGF0ZVZlcnNpb24oKSB7IEZsYXRCdWZmZXJzVmVyc2lvbl8yXzBfOCgpIH0KIAogICBwcml2YXRlIHZhciBfeDogRmxvYXQzMgogICBwcml2YXRlIHZhciBfeTogRmxvYXQzMgpAQCAtMTc4LDcgKzE3OCw3IEBACiAKIHB1YmxpYyBzdHJ1Y3QgVmVjM19NdXRhYmxlOiBGbGF0QnVmZmVyT2JqZWN0IHsKIAotICBzdGF0aWMgZnVuYyB2YWxpZGF0ZVZlcnNpb24oKSB7IEZsYXRCdWZmZXJzVmVyc2lvbl8yXzBfMCgpIH0KKyAgc3RhdGljIGZ1bmMgdmFsaWRhdGVWZXJzaW9uKCkgeyBGbGF0QnVmZmVyc1ZlcnNpb25fMl8wXzgoKSB9CiAgIHB1YmxpYyB2YXIgX19idWZmZXI6IEJ5dGVCdWZmZXIhIHsgcmV0dXJuIF9hY2Nlc3Nvci5iYiB9CiAgIHByaXZhdGUgdmFyIF9hY2Nlc3NvcjogU3RydWN0CiAKQEAgLTE5NSw3ICsxOTUsNyBAQAogLy8vICBhbiBleGFtcGxlIGRvY3VtZW50YXRpb24gY29tbWVudDogIm1vbnN0ZXIgb2JqZWN0IgogcHVibGljIHN0cnVjdCBNb25zdGVyOiBGbGF0QnVmZmVyT2JqZWN0LCBWZXJpZmlhYmxlIHsKIAotICBzdGF0aWMgZnVuYyB2YWxpZGF0ZVZlcnNpb24oKSB7IEZsYXRCdWZmZXJzVmVyc2lvbl8yXzBfMCgpIH0KKyAgc3RhdGljIGZ1bmMgdmFsaWRhdGVWZXJzaW9uKCkgeyBGbGF0QnVmZmVyc1ZlcnNpb25fMl8wXzgoKSB9CiAgIHB1YmxpYyB2YXIgX19idWZmZXI6IEJ5dGVCdWZmZXIhIHsgcmV0dXJuIF9hY2Nlc3Nvci5iYiB9CiAgIHByaXZhdGUgdmFyIF9hY2Nlc3NvcjogVGFibGUKIApAQCAtMjIyLDkgKzIyMiwxMSBAQAogICBwdWJsaWMgdmFyIGhwOiBJbnQxNiB7IGxldCBvID0gX2FjY2Vzc29yLm9mZnNldChWVE9GRlNFVC5ocC52KTsgcmV0dXJuIG8gPT0gMCA/IDEwMCA6IF9hY2Nlc3Nvci5yZWFkQnVmZmVyKG9mOiBJbnQxNi5zZWxmLCBhdDogbykgfQogICBwdWJsaWMgdmFyIG5hbWU6IFN0cmluZyEgeyBsZXQgbyA9IF9hY2Nlc3Nvci5vZmZzZXQoVlRPRkZTRVQubmFtZS52KTsgcmV0dXJuIF9hY2Nlc3Nvci5zdHJpbmcoYXQ6IG8pIH0KICAgcHVibGljIHZhciBuYW1lU2VnbWVudEFycmF5OiBbVUludDhdISB7IHJldHVybiBfYWNjZXNzb3IuZ2V0VmVjdG9yKGF0OiBWVE9GRlNFVC5uYW1lLnYpIH0KKyAgcHVibGljIHZhciBoYXNUZXN0YXJyYXlvZnRhYmxlczogQm9vbCB7IGxldCBvID0gX2FjY2Vzc29yLm9mZnNldChWVE9GRlNFVC50ZXN0YXJyYXlvZnRhYmxlcy52KTsgcmV0dXJuIG8gPT0gMCA/IGZhbHNlIDogdHJ1ZSB9CiAgIHB1YmxpYyB2YXIgdGVzdGFycmF5b2Z0YWJsZXNDb3VudDogSW50MzIgeyBsZXQgbyA9IF9hY2Nlc3Nvci5vZmZzZXQoVlRPRkZTRVQudGVzdGFycmF5b2Z0YWJsZXMudik7IHJldHVybiBvID09IDAgPyAwIDogX2FjY2Vzc29yLnZlY3Rvcihjb3VudDogbykgfQogICBwdWJsaWMgZnVuYyB0ZXN0YXJyYXlvZnRhYmxlcyhhdCBpbmRleDogSW50MzIpIC0+IE1vbnN0ZXI/IHsgbGV0IG8gPSBfYWNjZXNzb3Iub2Zmc2V0KFZUT0ZGU0VULnRlc3RhcnJheW9mdGFibGVzLnYpOyByZXR1cm4gbyA9PSAwID8gbmlsIDogTW9uc3RlcihfYWNjZXNzb3IuYmIsIG86IF9hY2Nlc3Nvci5pbmRpcmVjdChfYWNjZXNzb3IudmVjdG9yKGF0OiBvKSArIGluZGV4ICogNCkpIH0KICAgcHVibGljIGZ1bmMgdGVzdGFycmF5b2Z0YWJsZXNCeShrZXk6IFN0cmluZykgLT4gTW9uc3Rlcj8geyBsZXQgbyA9IF9hY2Nlc3Nvci5vZmZzZXQoVlRPRkZTRVQudGVzdGFycmF5b2Z0YWJsZXMudik7IHJldHVybiBvID09IDAgPyBuaWwgOiBNb25zdGVyLmxvb2t1cEJ5S2V5KHZlY3RvcjogX2FjY2Vzc29yLnZlY3RvcihhdDogbyksIGtleToga2V5LCBmYmI6IF9hY2Nlc3Nvci5iYikgfQorICBwdWJsaWMgdmFyIGhhc0ludmVudG9yeTogQm9vbCB7IGxldCBvID0gX2FjY2Vzc29yLm9mZnNldChWVE9GRlNFVC5pbnZlbnRvcnkudik7IHJldHVybiBvID09IDAgPyBmYWxzZSA6IHRydWUgfQogICBwdWJsaWMgdmFyIGludmVudG9yeUNvdW50OiBJbnQzMiB7IGxldCBvID0gX2FjY2Vzc29yLm9mZnNldChWVE9GRlNFVC5pbnZlbnRvcnkudik7IHJldHVybiBvID09IDAgPyAwIDogX2FjY2Vzc29yLnZlY3Rvcihjb3VudDogbykgfQogICBwdWJsaWMgZnVuYyBpbnZlbnRvcnkoYXQgaW5kZXg6IEludDMyKSAtPiBVSW50OCB7IGxldCBvID0gX2FjY2Vzc29yLm9mZnNldChWVE9GRlNFVC5pbnZlbnRvcnkudik7IHJldHVybiBvID09IDAgPyAwIDogX2FjY2Vzc29yLmRpcmVjdFJlYWQob2Y6IFVJbnQ4LnNlbGYsIG9mZnNldDogX2FjY2Vzc29yLnZlY3RvcihhdDogbykgKyBpbmRleCAqIDEpIH0KICAgcHVibGljIHZhciBpbnZlbnRvcnk6IFtVSW50OF0geyByZXR1cm4gX2FjY2Vzc29yLmdldFZlY3RvcihhdDogVlRPRkZTRVQuaW52ZW50b3J5LnYpID8/IFtdIH0KQEAgLTI0Myw3ICsyNDUsNyBAQAogICAgIHBvczogVmVjMz8gPSBuaWwsCiAgICAgbWFuYTogSW50MTYgPSAxNTAsCiAgICAgaHA6IEludDE2ID0gMTAwLAotICAgIG5hbWVPZmZzZXQgbmFtZTogT2Zmc2V0ID0gT2Zmc2V0KCksCisgICAgbmFtZU9mZnNldCBuYW1lOiBPZmZzZXQsCiAgICAgdGVzdGFycmF5b2Z0YWJsZXNWZWN0b3JPZmZzZXQgdGVzdGFycmF5b2Z0YWJsZXM6IE9mZnNldCA9IE9mZnNldCgpLAogICAgIGludmVudG9yeVZlY3Rvck9mZnNldCBpbnZlbnRvcnk6IE9mZnNldCA9IE9mZnNldCgpLAogICAgIGNvbG9yOiBDb2xvciA9IC5ibHVlCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9GbGF0QnVmZmVycy5UZXN0LlN3aWZ0L1NvdXJjZXMvU3dpZnRGbGF0QnVmZmVycy9tYWluLnN3aWZ0IGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvc3dpZnQvdGVzdHMvU291cmNlcy9Td2lmdEZsYXRCdWZmZXJzL21haW4uc3dpZnQKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHRoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL0ZsYXRCdWZmZXJzLlRlc3QuU3dpZnQvU291cmNlcy9Td2lmdEZsYXRCdWZmZXJzL21haW4uc3dpZnQKcmVuYW1lIHRvIHRoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL3N3aWZ0L3Rlc3RzL1NvdXJjZXMvU3dpZnRGbGF0QnVmZmVycy9tYWluLnN3aWZ0CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9zd2lmdC90ZXN0cy9Td2lmdFRlc3Quc2ggYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9zd2lmdC90ZXN0cy9Td2lmdFRlc3Quc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMzc1NjNkNAotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL3N3aWZ0L3Rlc3RzL1N3aWZ0VGVzdC5zaApAQCAtMCwwICsxLDM5IEBACitjdXJyZW50X2Rpcj1gcHdkYAorY2QgLi4KK3N3aWZ0X2Rpcj1gcHdkYAorY2QgLi4KK3Rlc3RfZGlyPWBwd2RgCithbGlhcyBmYmM9JyR7dGVzdF9kaXJ9Ly4uL2ZsYXRjJworc2hvcHQgLXMgZXhwYW5kX2FsaWFzZXMKKworY2QgJHtjdXJyZW50X2Rpcn0vVGVzdHMvRmxhdEJ1ZmZlcnMuVGVzdC5Td2lmdFRlc3RzCitmYmMgLS1zd2lmdCAtLWdlbi1tdXRhYmxlIC0tZ3JwYyAtLWdlbi1qc29uLWVtaXQgLS1nZW4tb2JqZWN0LWFwaSAtSSAke3Rlc3RfZGlyfS9pbmNsdWRlX3Rlc3QgJHt0ZXN0X2Rpcn0vbW9uc3Rlcl90ZXN0LmZicyAke3Rlc3RfZGlyfS91bmlvbl92ZWN0b3IvdW5pb25fdmVjdG9yLmZicworZmJjIC0tc3dpZnQgLS1nZW4tanNvbi1lbWl0ICR7dGVzdF9kaXJ9L29wdGlvbmFsX3NjYWxhcnMuZmJzCitmYmMgLS1zd2lmdCAtLWdlbi1qc29uLWVtaXQgLS1nZW4tb2JqZWN0LWFwaSAke3Rlc3RfZGlyfS9tb3JlX2RlZmF1bHRzLmZicworZmJjIC0tc3dpZnQgLS1nZW4tanNvbi1lbWl0IC0tZ2VuLW11dGFibGUgLS1nZW4tb2JqZWN0LWFwaSAke3Rlc3RfZGlyfS9NdXRhdGluZ0Jvb2wuZmJzCitmYmMgLS1zd2lmdCAtLWdlbi1qc29uLWVtaXQgJHt0ZXN0X2Rpcn0vdmVjdG9yX2hhc190ZXN0LmZicworY2QgJHtjdXJyZW50X2Rpcn0KKworIyBHb2VzIGludG8gdGhlIGNvZGUgZ2VuZXJhdGlvbiB0ZXN0cworY2QgQ29kZUdlbmVyYXRpb25UZXN0cworZmJjIC0tc3dpZnQgLS1nZW4tbXV0YWJsZSAtLWdycGMgLS1nZW4tanNvbi1lbWl0IC0tZ2VuLW9iamVjdC1hcGkgLS1zd2lmdC1pbXBsZW1lbnRhdGlvbi1vbmx5IHRlc3RfaW1wb3J0LmZicworZmJjIC0tc3dpZnQgLS1nZW4tbXV0YWJsZSAtLWdycGMgLS1nZW4tanNvbi1lbWl0IC0tZ2VuLW9iamVjdC1hcGkgLS1uby1pbmNsdWRlcyB0ZXN0X25vX2luY2x1ZGUuZmJzCitjZCAuLgorCitjZCAke2N1cnJlbnRfZGlyfS9Tb3VyY2VzL1N3aWZ0RmxhdEJ1ZmZlcnMKKyMgY3JlYXRlIGJldHRlciBmdXp6aW5nIHRlc3QgZmlsZQorZmJjIC0tc3dpZnQgLS1nZW4tanNvbi1lbWl0IGZ1enplci5mYnMKK2NkICR7Y3VycmVudF9kaXJ9CisKK2NkICR7c3dpZnRfZGlyfS9XYXNtLnRlc3RzL1Rlc3RzL0ZsYXRCdWZmZXJzLlRlc3QuU3dpZnQuV2FzbVRlc3RzCitmYmMgLS1zd2lmdCAtLWdlbi1tdXRhYmxlIC0tZ2VuLWpzb24tZW1pdCAtLWdlbi1vYmplY3QtYXBpIC1JICR7dGVzdF9kaXJ9L2luY2x1ZGVfdGVzdCAke3Rlc3RfZGlyfS9tb25zdGVyX3Rlc3QuZmJzCitjZCAke2N1cnJlbnRfZGlyfQorCitzd2lmdCBidWlsZCAtLWJ1aWxkLXRlc3RzCitzd2lmdCB0ZXN0CisKK2lmIFsgJCh1bmFtZSAtcykgIT0gRGFyd2luIF07IHRoZW4KKyAgZWNobyBmdXp6aW5nCisgIHN3aWZ0IGJ1aWxkIC1jIGRlYnVnIC1Yc3dpZnRjIC1zYW5pdGl6ZT1mdXp6ZXIsYWRkcmVzcyAtWHN3aWZ0YyAtcGFyc2UtYXMtbGlicmFyeQorICBzd2lmdCBidWlsZCAtYyByZWxlYXNlIC1Yc3dpZnRjIC1zYW5pdGl6ZT1mdXp6ZXIsYWRkcmVzcyAtWHN3aWZ0YyAtcGFyc2UtYXMtbGlicmFyeQorZmkKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL0ZsYXRCdWZmZXJzLlRlc3QuU3dpZnQvVGVzdHMvRmxhdEJ1ZmZlcnMuVGVzdC5Td2lmdFRlc3RzL0ZsYXRCdWZmZXJzTW9uc3RlcldyaXRlclRlc3RzLnN3aWZ0IGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvc3dpZnQvdGVzdHMvVGVzdHMvRmxhdEJ1ZmZlcnMuVGVzdC5Td2lmdFRlc3RzL0ZsYXRCdWZmZXJzTW9uc3RlcldyaXRlclRlc3RzLnN3aWZ0CnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSB0aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9GbGF0QnVmZmVycy5UZXN0LlN3aWZ0L1Rlc3RzL0ZsYXRCdWZmZXJzLlRlc3QuU3dpZnRUZXN0cy9GbGF0QnVmZmVyc01vbnN0ZXJXcml0ZXJUZXN0cy5zd2lmdApyZW5hbWUgdG8gdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvc3dpZnQvdGVzdHMvVGVzdHMvRmxhdEJ1ZmZlcnMuVGVzdC5Td2lmdFRlc3RzL0ZsYXRCdWZmZXJzTW9uc3RlcldyaXRlclRlc3RzLnN3aWZ0CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9GbGF0QnVmZmVycy5UZXN0LlN3aWZ0L1Rlc3RzL0ZsYXRCdWZmZXJzLlRlc3QuU3dpZnRUZXN0cy9GbGF0QnVmZmVyc1N0cnVjdHNUZXN0cy5zd2lmdCBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL3N3aWZ0L3Rlc3RzL1Rlc3RzL0ZsYXRCdWZmZXJzLlRlc3QuU3dpZnRUZXN0cy9GbGF0QnVmZmVyc1N0cnVjdHNUZXN0cy5zd2lmdApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvRmxhdEJ1ZmZlcnMuVGVzdC5Td2lmdC9UZXN0cy9GbGF0QnVmZmVycy5UZXN0LlN3aWZ0VGVzdHMvRmxhdEJ1ZmZlcnNTdHJ1Y3RzVGVzdHMuc3dpZnQKcmVuYW1lIHRvIHRoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL3N3aWZ0L3Rlc3RzL1Rlc3RzL0ZsYXRCdWZmZXJzLlRlc3QuU3dpZnRUZXN0cy9GbGF0QnVmZmVyc1N0cnVjdHNUZXN0cy5zd2lmdApkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvRmxhdEJ1ZmZlcnMuVGVzdC5Td2lmdC9UZXN0cy9GbGF0QnVmZmVycy5UZXN0LlN3aWZ0VGVzdHMvRmxhdEJ1ZmZlcnNUZXN0cy5zd2lmdCBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL3N3aWZ0L3Rlc3RzL1Rlc3RzL0ZsYXRCdWZmZXJzLlRlc3QuU3dpZnRUZXN0cy9GbGF0QnVmZmVyc1Rlc3RzLnN3aWZ0CnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSB0aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9GbGF0QnVmZmVycy5UZXN0LlN3aWZ0L1Rlc3RzL0ZsYXRCdWZmZXJzLlRlc3QuU3dpZnRUZXN0cy9GbGF0QnVmZmVyc1Rlc3RzLnN3aWZ0CnJlbmFtZSB0byB0aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9zd2lmdC90ZXN0cy9UZXN0cy9GbGF0QnVmZmVycy5UZXN0LlN3aWZ0VGVzdHMvRmxhdEJ1ZmZlcnNUZXN0cy5zd2lmdApkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvRmxhdEJ1ZmZlcnMuVGVzdC5Td2lmdC9UZXN0cy9GbGF0QnVmZmVycy5UZXN0LlN3aWZ0VGVzdHMvRmxhdEJ1ZmZlcnNVbmlvblRlc3RzLnN3aWZ0IGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvc3dpZnQvdGVzdHMvVGVzdHMvRmxhdEJ1ZmZlcnMuVGVzdC5Td2lmdFRlc3RzL0ZsYXRCdWZmZXJzVW5pb25UZXN0cy5zd2lmdApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvRmxhdEJ1ZmZlcnMuVGVzdC5Td2lmdC9UZXN0cy9GbGF0QnVmZmVycy5UZXN0LlN3aWZ0VGVzdHMvRmxhdEJ1ZmZlcnNVbmlvblRlc3RzLnN3aWZ0CnJlbmFtZSB0byB0aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9zd2lmdC90ZXN0cy9UZXN0cy9GbGF0QnVmZmVycy5UZXN0LlN3aWZ0VGVzdHMvRmxhdEJ1ZmZlcnNVbmlvblRlc3RzLnN3aWZ0CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9GbGF0QnVmZmVycy5UZXN0LlN3aWZ0L1Rlc3RzL0ZsYXRCdWZmZXJzLlRlc3QuU3dpZnRUZXN0cy9GbGF0QnVmZmVyc1ZlY3RvcnNUZXN0cy5zd2lmdCBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL3N3aWZ0L3Rlc3RzL1Rlc3RzL0ZsYXRCdWZmZXJzLlRlc3QuU3dpZnRUZXN0cy9GbGF0QnVmZmVyc1ZlY3RvcnNUZXN0cy5zd2lmdApzaW1pbGFyaXR5IGluZGV4IDg1JQpyZW5hbWUgZnJvbSB0aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9GbGF0QnVmZmVycy5UZXN0LlN3aWZ0L1Rlc3RzL0ZsYXRCdWZmZXJzLlRlc3QuU3dpZnRUZXN0cy9GbGF0QnVmZmVyc1ZlY3RvcnNUZXN0cy5zd2lmdApyZW5hbWUgdG8gdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvc3dpZnQvdGVzdHMvVGVzdHMvRmxhdEJ1ZmZlcnMuVGVzdC5Td2lmdFRlc3RzL0ZsYXRCdWZmZXJzVmVjdG9yc1Rlc3RzLnN3aWZ0CmluZGV4IDRjYjI0NWYuLjEyMmZhY2IgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL0ZsYXRCdWZmZXJzLlRlc3QuU3dpZnQvVGVzdHMvRmxhdEJ1ZmZlcnMuVGVzdC5Td2lmdFRlc3RzL0ZsYXRCdWZmZXJzVmVjdG9yc1Rlc3RzLnN3aWZ0CisrKyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL3N3aWZ0L3Rlc3RzL1Rlc3RzL0ZsYXRCdWZmZXJzLlRlc3QuU3dpZnRUZXN0cy9GbGF0QnVmZmVyc1ZlY3RvcnNUZXN0cy5zd2lmdApAQCAtMTA1LDYgKzEwNSwyNyBAQAogICAgIGxldCBudW1iZXIgPSBOdW1iZXJzLmdldFJvb3RBc051bWJlcnMoQnl0ZUJ1ZmZlcihieXRlczogYi5zaXplZEJ5dGVBcnJheSkpCiAgICAgWENUQXNzZXJ0RXF1YWwobnVtYmVyLnZBcnJheURvdWJsZSwgWzEsIDIsIDMsIDQsIDVdKQogICB9CisKKyAgZnVuYyB0ZXN0SGFzRm9yQXJyYXkoKSB7CisgICAgdmFyIGJ1aWxkZXIgPSBGbGF0QnVmZmVyQnVpbGRlcihpbml0aWFsU2l6ZTogMjApCisgICAgbGV0IGVtcHR5VmVjdG9yID0gW1VJbnQ4XSgpCisgICAgbGV0IGVtcHR5T2Zmc2V0ID0gYnVpbGRlci5jcmVhdGVWZWN0b3IoZW1wdHlWZWN0b3IpCisgICAgbGV0IG5vbkVtcHR5VmVjdG9yID0gWzEsIDIsIDNdCisgICAgbGV0IG5vbkVtcHR5VmVjdG9yT2ZmZXN0ID0gYnVpbGRlci5jcmVhdGVWZWN0b3Iobm9uRW1wdHlWZWN0b3IpCisgICAgbGV0IHN0YXJ0ID0gU3dpZnRfVGVzdHNfVmVjdG9ycy5zdGFydFZlY3RvcnMoJmJ1aWxkZXIpCisgICAgU3dpZnRfVGVzdHNfVmVjdG9ycy5hZGRWZWN0b3JPZihlbXB0eTogZW1wdHlPZmZzZXQsICZidWlsZGVyKQorICAgIFN3aWZ0X1Rlc3RzX1ZlY3RvcnMuYWRkVmVjdG9yT2YoYXJyYXk6IG5vbkVtcHR5VmVjdG9yT2ZmZXN0LCAmYnVpbGRlcikKKyAgICBsZXQgZmluaXNoID0gU3dpZnRfVGVzdHNfVmVjdG9ycy5lbmRWZWN0b3JzKCZidWlsZGVyLCBzdGFydDogc3RhcnQpCisgICAgYnVpbGRlci5maW5pc2gob2Zmc2V0OiBmaW5pc2gpCisKKyAgICBsZXQgbXNnID0gU3dpZnRfVGVzdHNfVmVjdG9ycy5nZXRSb290QXNWZWN0b3JzKGJiOiBCeXRlQnVmZmVyKGJ5dGVzOiBidWlsZGVyLnNpemVkQnl0ZUFycmF5KSkKKyAgICBYQ1RBc3NlcnRFcXVhbChtc2cuaGFzTm9uZSwgZmFsc2UpCisgICAgWENUQXNzZXJ0RXF1YWwobXNnLmhhc0VtcHR5LCB0cnVlKQorICAgIFhDVEFzc2VydEVxdWFsKG1zZy5lbXB0eUNvdW50LCAwKQorICAgIFhDVEFzc2VydEVxdWFsKG1zZy5oYXNBcnJheSwgdHJ1ZSkKKyAgICBYQ1RBc3NlcnRFcXVhbChtc2cuYXJyYXlDb3VudCwgMykKKyAgICBYQ1RBc3NlcnRFcXVhbChtc2cuYXJyYXksIFsxLCAyLCAzXSkKKyAgfQogfQogCiBzdHJ1Y3QgTnVtYmVycyB7CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9GbGF0QnVmZmVycy5UZXN0LlN3aWZ0L1Rlc3RzL0ZsYXRCdWZmZXJzLlRlc3QuU3dpZnRUZXN0cy9GbGF0YnVmZmVyc0RvdWJsZVRlc3RzLnN3aWZ0IGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvc3dpZnQvdGVzdHMvVGVzdHMvRmxhdEJ1ZmZlcnMuVGVzdC5Td2lmdFRlc3RzL0ZsYXRidWZmZXJzRG91YmxlVGVzdHMuc3dpZnQKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHRoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL0ZsYXRCdWZmZXJzLlRlc3QuU3dpZnQvVGVzdHMvRmxhdEJ1ZmZlcnMuVGVzdC5Td2lmdFRlc3RzL0ZsYXRidWZmZXJzRG91YmxlVGVzdHMuc3dpZnQKcmVuYW1lIHRvIHRoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL3N3aWZ0L3Rlc3RzL1Rlc3RzL0ZsYXRCdWZmZXJzLlRlc3QuU3dpZnRUZXN0cy9GbGF0YnVmZmVyc0RvdWJsZVRlc3RzLnN3aWZ0CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9GbGF0QnVmZmVycy5UZXN0LlN3aWZ0L1Rlc3RzL0ZsYXRCdWZmZXJzLlRlc3QuU3dpZnRUZXN0cy9GbGF0YnVmZmVyc01vcmVEZWZhdWx0cy5zd2lmdCBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL3N3aWZ0L3Rlc3RzL1Rlc3RzL0ZsYXRCdWZmZXJzLlRlc3QuU3dpZnRUZXN0cy9GbGF0YnVmZmVyc01vcmVEZWZhdWx0cy5zd2lmdApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvRmxhdEJ1ZmZlcnMuVGVzdC5Td2lmdC9UZXN0cy9GbGF0QnVmZmVycy5UZXN0LlN3aWZ0VGVzdHMvRmxhdGJ1ZmZlcnNNb3JlRGVmYXVsdHMuc3dpZnQKcmVuYW1lIHRvIHRoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL3N3aWZ0L3Rlc3RzL1Rlc3RzL0ZsYXRCdWZmZXJzLlRlc3QuU3dpZnRUZXN0cy9GbGF0YnVmZmVyc01vcmVEZWZhdWx0cy5zd2lmdApkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvRmxhdEJ1ZmZlcnMuVGVzdC5Td2lmdC9UZXN0cy9GbGF0QnVmZmVycy5UZXN0LlN3aWZ0VGVzdHMvRmxhdGJ1ZmZlcnNWZXJpZmllclRlc3RzLnN3aWZ0IGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvc3dpZnQvdGVzdHMvVGVzdHMvRmxhdEJ1ZmZlcnMuVGVzdC5Td2lmdFRlc3RzL0ZsYXRidWZmZXJzVmVyaWZpZXJUZXN0cy5zd2lmdApzaW1pbGFyaXR5IGluZGV4IDg5JQpyZW5hbWUgZnJvbSB0aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9GbGF0QnVmZmVycy5UZXN0LlN3aWZ0L1Rlc3RzL0ZsYXRCdWZmZXJzLlRlc3QuU3dpZnRUZXN0cy9GbGF0YnVmZmVyc1ZlcmlmaWVyVGVzdHMuc3dpZnQKcmVuYW1lIHRvIHRoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL3N3aWZ0L3Rlc3RzL1Rlc3RzL0ZsYXRCdWZmZXJzLlRlc3QuU3dpZnRUZXN0cy9GbGF0YnVmZmVyc1ZlcmlmaWVyVGVzdHMuc3dpZnQKaW5kZXggNzUwZjk3Yi4uY2IyNmMyNyAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvRmxhdEJ1ZmZlcnMuVGVzdC5Td2lmdC9UZXN0cy9GbGF0QnVmZmVycy5UZXN0LlN3aWZ0VGVzdHMvRmxhdGJ1ZmZlcnNWZXJpZmllclRlc3RzLnN3aWZ0CisrKyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL3N3aWZ0L3Rlc3RzL1Rlc3RzL0ZsYXRCdWZmZXJzLlRlc3QuU3dpZnRUZXN0cy9GbGF0YnVmZmVyc1ZlcmlmaWVyVGVzdHMuc3dpZnQKQEAgLTIwMSwxMiArMjAxLDM0IEBACiAgICAgWENUQXNzZXJ0Tm9UaHJvdyh0cnkgZ2V0Q2hlY2tlZFJvb3QoYnl0ZUJ1ZmZlcjogJmJ5dGVCdWZmZXIpIGFzIE1vdmllKQogICB9CiAKKyAgZnVuYyB0ZXN0RXJyb3JXcm9uZ0ZpbGVJZCgpIHsKKyAgICAvLyBzd2lmdGZvcm1hdDpkaXNhYmxlIGFsbAorICAgIHZhciBieXRlQnVmZmVyID0gQnl0ZUJ1ZmZlcihieXRlczogWzIwLCAwLCAwLCAwLCA3NywgNzksIDg2LCA3MywgMTIsIDAsIDEyLCAwLCAwLCAwLCAwLCAwLCA4LCAwLCA0LCAwLCAxMiwgMCwgMCwgMCwgOCwgMCwgMCwgMCwgMjAsIDAsIDAsIDAsIDMsIDAsIDAsIDAsIDI0LCAwLCAwLCAwLCAzMiwgMCwgMCwgMCwgMTIsIDAsIDAsIDAsIDMsIDAsIDAsIDAsIDMsIDEsIDQsIDAsIDIsIDAsIDAsIDAsIDcsIDAsIDAsIDAsIDAsIDAsIDYsIDAsIDgsIDAsIDQsIDAsIDYsIDAsIDAsIDAsIDgsIDAsIDAsIDBdKQorICAgIC8vIHN3aWZ0Zm9ybWF0OmVuYWJsZSBhbGwKKyAgICBYQ1RBc3NlcnRUaHJvd3NFcnJvcih0cnkgZ2V0Q2hlY2tlZFJvb3QoYnl0ZUJ1ZmZlcjogJmJ5dGVCdWZmZXIsIGZpbGVJZDogIkZMRVgiKSBhcyBNb3ZpZSkKKyAgfQorCisgIGZ1bmMgdGVzdFZlcmlmeVByZWZpeGVkQnVmZmVyKCkgeworICAgIC8vIHN3aWZ0Zm9ybWF0OmRpc2FibGUgYWxsCisgICAgdmFyIGJ5dGVCdWZmZXIgPSBCeXRlQnVmZmVyKGJ5dGVzOiBbMCwgMCwgMCwgMSwgMjAsIDAsIDAsIDAsIDc3LCA3OSwgODYsIDczLCAxMiwgMCwgMTIsIDAsIDAsIDAsIDAsIDAsIDgsIDAsIDQsIDAsIDEyLCAwLCAwLCAwLCA4LCAwLCAwLCAwLCAyMCwgMCwgMCwgMCwgMywgMCwgMCwgMCwgMjQsIDAsIDAsIDAsIDMyLCAwLCAwLCAwLCAxMiwgMCwgMCwgMCwgMywgMCwgMCwgMCwgMywgMSwgNCwgMCwgMiwgMCwgMCwgMCwgNywgMCwgMCwgMCwgMCwgMCwgNiwgMCwgOCwgMCwgNCwgMCwgNiwgMCwgMCwgMCwgOCwgMCwgMCwgMF0pCisgICAgLy8gc3dpZnRmb3JtYXQ6ZW5hYmxlIGFsbAorICAgIFhDVEFzc2VydFRocm93c0Vycm9yKAorICAgICAgdHJ5IGdldENoZWNrZWRQcmVmaXhlZFNpemVSb290KGJ5dGVCdWZmZXI6ICZieXRlQnVmZmVyKSBhcyBNb3ZpZSkKKyAgfQorCiAgIGZ1bmMgdGVzdEZ1bGxWZXJpZmllcigpIHsKICAgICBYQ1RBc3NlcnROb1Rocm93KAogICAgICAgdHJ5IGdldENoZWNrZWRSb290KAogICAgICAgICBieXRlQnVmZmVyOiAmdmFsaWRGbGF0YnVmZmVyc09iamVjdCkgYXMgTXlHYW1lX0V4YW1wbGVfTW9uc3RlcikKICAgfQogCisgIGZ1bmMgdGVzdEZ1bGxWZXJpZmllcldpdGhGaWxlSWQoKSB7CisgICAgWENUQXNzZXJ0Tm9UaHJvdygKKyAgICAgIHRyeSBnZXRDaGVja2VkUm9vdCgKKyAgICAgICAgYnl0ZUJ1ZmZlcjogJnZhbGlkRmxhdGJ1ZmZlcnNPYmplY3QsCisgICAgICAgIGZpbGVJZDogTXlHYW1lX0V4YW1wbGVfTW9uc3Rlci5pZCkgYXMgTXlHYW1lX0V4YW1wbGVfTW9uc3RlcikKKyAgfQorCiAgIGZ1bmMgdGVzdEludmFsaWRCdWZmZXIoKSB7CiAgICAgWENUQXNzZXJ0VGhyb3dzRXJyb3IoCiAgICAgICB0cnkgZ2V0Q2hlY2tlZFJvb3QoCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9GbGF0QnVmZmVycy5UZXN0LlN3aWZ0L1Rlc3RzL0ZsYXRCdWZmZXJzLlRlc3QuU3dpZnRUZXN0cy9NdXRhdGluZ0Jvb2xfZ2VuZXJhdGVkLnN3aWZ0IGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvc3dpZnQvdGVzdHMvVGVzdHMvRmxhdEJ1ZmZlcnMuVGVzdC5Td2lmdFRlc3RzL011dGF0aW5nQm9vbF9nZW5lcmF0ZWQuc3dpZnQKc2ltaWxhcml0eSBpbmRleCA5NiUKcmVuYW1lIGZyb20gdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvRmxhdEJ1ZmZlcnMuVGVzdC5Td2lmdC9UZXN0cy9GbGF0QnVmZmVycy5UZXN0LlN3aWZ0VGVzdHMvTXV0YXRpbmdCb29sX2dlbmVyYXRlZC5zd2lmdApyZW5hbWUgdG8gdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvc3dpZnQvdGVzdHMvVGVzdHMvRmxhdEJ1ZmZlcnMuVGVzdC5Td2lmdFRlc3RzL011dGF0aW5nQm9vbF9nZW5lcmF0ZWQuc3dpZnQKaW5kZXggMTU1MDgwYS4uNGMyNDNkOSAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvRmxhdEJ1ZmZlcnMuVGVzdC5Td2lmdC9UZXN0cy9GbGF0QnVmZmVycy5UZXN0LlN3aWZ0VGVzdHMvTXV0YXRpbmdCb29sX2dlbmVyYXRlZC5zd2lmdAorKysgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9zd2lmdC90ZXN0cy9UZXN0cy9GbGF0QnVmZmVycy5UZXN0LlN3aWZ0VGVzdHMvTXV0YXRpbmdCb29sX2dlbmVyYXRlZC5zd2lmdApAQCAtNiw3ICs2LDcgQEAKIAogcHVibGljIHN0cnVjdCBQcm9wZXJ0eTogTmF0aXZlU3RydWN0LCBWZXJpZmlhYmxlLCBGbGF0YnVmZmVyc0luaXRpYWxpemFibGUsIE5hdGl2ZU9iamVjdCB7CiAKLSAgc3RhdGljIGZ1bmMgdmFsaWRhdGVWZXJzaW9uKCkgeyBGbGF0QnVmZmVyc1ZlcnNpb25fMl8wXzAoKSB9CisgIHN0YXRpYyBmdW5jIHZhbGlkYXRlVmVyc2lvbigpIHsgRmxhdEJ1ZmZlcnNWZXJzaW9uXzJfMF84KCkgfQogCiAgIHByaXZhdGUgdmFyIF9wcm9wZXJ0eTogQm9vbAogCkBAIC00OSw3ICs0OSw3IEBACiAKIHB1YmxpYyBzdHJ1Y3QgUHJvcGVydHlfTXV0YWJsZTogRmxhdEJ1ZmZlck9iamVjdCB7CiAKLSAgc3RhdGljIGZ1bmMgdmFsaWRhdGVWZXJzaW9uKCkgeyBGbGF0QnVmZmVyc1ZlcnNpb25fMl8wXzAoKSB9CisgIHN0YXRpYyBmdW5jIHZhbGlkYXRlVmVyc2lvbigpIHsgRmxhdEJ1ZmZlcnNWZXJzaW9uXzJfMF84KCkgfQogICBwdWJsaWMgdmFyIF9fYnVmZmVyOiBCeXRlQnVmZmVyISB7IHJldHVybiBfYWNjZXNzb3IuYmIgfQogICBwcml2YXRlIHZhciBfYWNjZXNzb3I6IFN0cnVjdAogCkBAIC03NCw3ICs3NCw3IEBACiAKIHB1YmxpYyBzdHJ1Y3QgVGVzdE11dGF0aW5nQm9vbDogRmxhdEJ1ZmZlck9iamVjdCwgVmVyaWZpYWJsZSwgT2JqZWN0QVBJUGFja2VyIHsKIAotICBzdGF0aWMgZnVuYyB2YWxpZGF0ZVZlcnNpb24oKSB7IEZsYXRCdWZmZXJzVmVyc2lvbl8yXzBfMCgpIH0KKyAgc3RhdGljIGZ1bmMgdmFsaWRhdGVWZXJzaW9uKCkgeyBGbGF0QnVmZmVyc1ZlcnNpb25fMl8wXzgoKSB9CiAgIHB1YmxpYyB2YXIgX19idWZmZXI6IEJ5dGVCdWZmZXIhIHsgcmV0dXJuIF9hY2Nlc3Nvci5iYiB9CiAgIHByaXZhdGUgdmFyIF9hY2Nlc3NvcjogVGFibGUKIApkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvRmxhdEJ1ZmZlcnMuVGVzdC5Td2lmdC9UZXN0cy9GbGF0QnVmZmVycy5UZXN0LlN3aWZ0VGVzdHMvWENUZXN0TWFuaWZlc3RzLnN3aWZ0IGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvc3dpZnQvdGVzdHMvVGVzdHMvRmxhdEJ1ZmZlcnMuVGVzdC5Td2lmdFRlc3RzL1hDVGVzdE1hbmlmZXN0cy5zd2lmdApzaW1pbGFyaXR5IGluZGV4IDk4JQpyZW5hbWUgZnJvbSB0aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9GbGF0QnVmZmVycy5UZXN0LlN3aWZ0L1Rlc3RzL0ZsYXRCdWZmZXJzLlRlc3QuU3dpZnRUZXN0cy9YQ1Rlc3RNYW5pZmVzdHMuc3dpZnQKcmVuYW1lIHRvIHRoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL3N3aWZ0L3Rlc3RzL1Rlc3RzL0ZsYXRCdWZmZXJzLlRlc3QuU3dpZnRUZXN0cy9YQ1Rlc3RNYW5pZmVzdHMuc3dpZnQKaW5kZXggNDEzNDc2Mi4uZTE1ZWE4MyAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvRmxhdEJ1ZmZlcnMuVGVzdC5Td2lmdC9UZXN0cy9GbGF0QnVmZmVycy5UZXN0LlN3aWZ0VGVzdHMvWENUZXN0TWFuaWZlc3RzLnN3aWZ0CisrKyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL3N3aWZ0L3Rlc3RzL1Rlc3RzL0ZsYXRCdWZmZXJzLlRlc3QuU3dpZnRUZXN0cy9YQ1Rlc3RNYW5pZmVzdHMuc3dpZnQKQEAgLTEwOSw2ICsxMDksNyBAQAogICAgICgidGVzdENyZWF0ZVNoYXJlZFN0cmluZ1ZlY3RvciIsIHRlc3RDcmVhdGVTaGFyZWRTdHJpbmdWZWN0b3IpLAogICAgICgidGVzdENyZWF0ZVZlY3Rvck9mU3RyaW5ncyIsIHRlc3RDcmVhdGVWZWN0b3JPZlN0cmluZ3MpLAogICAgICgidGVzdENyZWF0aW5nVHdvQ291bnRyaWVzIiwgdGVzdENyZWF0aW5nVHdvQ291bnRyaWVzKSwKKyAgICAoInRlc3RIYXNGb3JBcnJheSIsIHRlc3RIYXNGb3JBcnJheSksCiAgICAgKCJ0ZXN0UmVhZERvdWJsZUFycmF5IiwgdGVzdFJlYWREb3VibGVBcnJheSksCiAgICAgKCJ0ZXN0UmVhZEludDMyQXJyYXkiLCB0ZXN0UmVhZEludDMyQXJyYXkpLAogICBdCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9GbGF0QnVmZmVycy5UZXN0LlN3aWZ0L1Rlc3RzL0ZsYXRCdWZmZXJzLlRlc3QuU3dpZnRUZXN0cy9tb25zdGVyX3Rlc3QuZ3JwYy5zd2lmdCBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL3N3aWZ0L3Rlc3RzL1Rlc3RzL0ZsYXRCdWZmZXJzLlRlc3QuU3dpZnRUZXN0cy9tb25zdGVyX3Rlc3QuZ3JwYy5zd2lmdApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvRmxhdEJ1ZmZlcnMuVGVzdC5Td2lmdC9UZXN0cy9GbGF0QnVmZmVycy5UZXN0LlN3aWZ0VGVzdHMvbW9uc3Rlcl90ZXN0LmdycGMuc3dpZnQKcmVuYW1lIHRvIHRoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL3N3aWZ0L3Rlc3RzL1Rlc3RzL0ZsYXRCdWZmZXJzLlRlc3QuU3dpZnRUZXN0cy9tb25zdGVyX3Rlc3QuZ3JwYy5zd2lmdApkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvRmxhdEJ1ZmZlcnMuVGVzdC5Td2lmdC9UZXN0cy9GbGF0QnVmZmVycy5UZXN0LlN3aWZ0VGVzdHMvbW9uc3Rlcl90ZXN0X2dlbmVyYXRlZC5zd2lmdCBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL3N3aWZ0L3Rlc3RzL1Rlc3RzL0ZsYXRCdWZmZXJzLlRlc3QuU3dpZnRUZXN0cy9tb25zdGVyX3Rlc3RfZ2VuZXJhdGVkLnN3aWZ0CnNpbWlsYXJpdHkgaW5kZXggOTQlCmNvcHkgZnJvbSB0aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9GbGF0QnVmZmVycy5UZXN0LlN3aWZ0L1Rlc3RzL0ZsYXRCdWZmZXJzLlRlc3QuU3dpZnRUZXN0cy9tb25zdGVyX3Rlc3RfZ2VuZXJhdGVkLnN3aWZ0CmNvcHkgdG8gdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvc3dpZnQvdGVzdHMvVGVzdHMvRmxhdEJ1ZmZlcnMuVGVzdC5Td2lmdFRlc3RzL21vbnN0ZXJfdGVzdF9nZW5lcmF0ZWQuc3dpZnQKaW5kZXggYzhhMDUwMi4uZDM3YTViYiAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvRmxhdEJ1ZmZlcnMuVGVzdC5Td2lmdC9UZXN0cy9GbGF0QnVmZmVycy5UZXN0LlN3aWZ0VGVzdHMvbW9uc3Rlcl90ZXN0X2dlbmVyYXRlZC5zd2lmdAorKysgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9zd2lmdC90ZXN0cy9UZXN0cy9GbGF0QnVmZmVycy5UZXN0LlN3aWZ0VGVzdHMvbW9uc3Rlcl90ZXN0X2dlbmVyYXRlZC5zd2lmdApAQCAtMjM3LDcgKzIzNyw3IEBACiB9CiBwdWJsaWMgc3RydWN0IE15R2FtZV9FeGFtcGxlX1Rlc3Q6IE5hdGl2ZVN0cnVjdCwgVmVyaWZpYWJsZSwgRmxhdGJ1ZmZlcnNJbml0aWFsaXphYmxlLCBOYXRpdmVPYmplY3QgewogCi0gIHN0YXRpYyBmdW5jIHZhbGlkYXRlVmVyc2lvbigpIHsgRmxhdEJ1ZmZlcnNWZXJzaW9uXzJfMF8wKCkgfQorICBzdGF0aWMgZnVuYyB2YWxpZGF0ZVZlcnNpb24oKSB7IEZsYXRCdWZmZXJzVmVyc2lvbl8yXzBfOCgpIH0KIAogICBwcml2YXRlIHZhciBfYTogSW50MTYKICAgcHJpdmF0ZSB2YXIgX2I6IEludDgKQEAgLTI5MSw3ICsyOTEsNyBAQAogCiBwdWJsaWMgc3RydWN0IE15R2FtZV9FeGFtcGxlX1Rlc3RfTXV0YWJsZTogRmxhdEJ1ZmZlck9iamVjdCB7CiAKLSAgc3RhdGljIGZ1bmMgdmFsaWRhdGVWZXJzaW9uKCkgeyBGbGF0QnVmZmVyc1ZlcnNpb25fMl8wXzAoKSB9CisgIHN0YXRpYyBmdW5jIHZhbGlkYXRlVmVyc2lvbigpIHsgRmxhdEJ1ZmZlcnNWZXJzaW9uXzJfMF84KCkgfQogICBwdWJsaWMgdmFyIF9fYnVmZmVyOiBCeXRlQnVmZmVyISB7IHJldHVybiBfYWNjZXNzb3IuYmIgfQogICBwcml2YXRlIHZhciBfYWNjZXNzb3I6IFN0cnVjdAogCkBAIC0zMTgsNyArMzE4LDcgQEAKIAogcHVibGljIHN0cnVjdCBNeUdhbWVfRXhhbXBsZV9WZWMzOiBOYXRpdmVTdHJ1Y3QsIFZlcmlmaWFibGUsIEZsYXRidWZmZXJzSW5pdGlhbGl6YWJsZSwgTmF0aXZlT2JqZWN0IHsKIAotICBzdGF0aWMgZnVuYyB2YWxpZGF0ZVZlcnNpb24oKSB7IEZsYXRCdWZmZXJzVmVyc2lvbl8yXzBfMCgpIH0KKyAgc3RhdGljIGZ1bmMgdmFsaWRhdGVWZXJzaW9uKCkgeyBGbGF0QnVmZmVyc1ZlcnNpb25fMl8wXzgoKSB9CiAKICAgcHJpdmF0ZSB2YXIgX3g6IEZsb2F0MzIKICAgcHJpdmF0ZSB2YXIgX3k6IEZsb2F0MzIKQEAgLTQxMyw3ICs0MTMsNyBAQAogCiBwdWJsaWMgc3RydWN0IE15R2FtZV9FeGFtcGxlX1ZlYzNfTXV0YWJsZTogRmxhdEJ1ZmZlck9iamVjdCB7CiAKLSAgc3RhdGljIGZ1bmMgdmFsaWRhdGVWZXJzaW9uKCkgeyBGbGF0QnVmZmVyc1ZlcnNpb25fMl8wXzAoKSB9CisgIHN0YXRpYyBmdW5jIHZhbGlkYXRlVmVyc2lvbigpIHsgRmxhdEJ1ZmZlcnNWZXJzaW9uXzJfMF84KCkgfQogICBwdWJsaWMgdmFyIF9fYnVmZmVyOiBCeXRlQnVmZmVyISB7IHJldHVybiBfYWNjZXNzb3IuYmIgfQogICBwcml2YXRlIHZhciBfYWNjZXNzb3I6IFN0cnVjdAogCkBAIC00NDcsNyArNDQ3LDcgQEAKIAogcHVibGljIHN0cnVjdCBNeUdhbWVfRXhhbXBsZV9BYmlsaXR5OiBOYXRpdmVTdHJ1Y3QsIFZlcmlmaWFibGUsIEZsYXRidWZmZXJzSW5pdGlhbGl6YWJsZSwgTmF0aXZlT2JqZWN0IHsKIAotICBzdGF0aWMgZnVuYyB2YWxpZGF0ZVZlcnNpb24oKSB7IEZsYXRCdWZmZXJzVmVyc2lvbl8yXzBfMCgpIH0KKyAgc3RhdGljIGZ1bmMgdmFsaWRhdGVWZXJzaW9uKCkgeyBGbGF0QnVmZmVyc1ZlcnNpb25fMl8wXzgoKSB9CiAKICAgcHJpdmF0ZSB2YXIgX2lkOiBVSW50MzIKICAgcHJpdmF0ZSB2YXIgX2Rpc3RhbmNlOiBVSW50MzIKQEAgLTUwMCw3ICs1MDAsNyBAQAogCiBwdWJsaWMgc3RydWN0IE15R2FtZV9FeGFtcGxlX0FiaWxpdHlfTXV0YWJsZTogRmxhdEJ1ZmZlck9iamVjdCB7CiAKLSAgc3RhdGljIGZ1bmMgdmFsaWRhdGVWZXJzaW9uKCkgeyBGbGF0QnVmZmVyc1ZlcnNpb25fMl8wXzAoKSB9CisgIHN0YXRpYyBmdW5jIHZhbGlkYXRlVmVyc2lvbigpIHsgRmxhdEJ1ZmZlcnNWZXJzaW9uXzJfMF84KCkgfQogICBwdWJsaWMgdmFyIF9fYnVmZmVyOiBCeXRlQnVmZmVyISB7IHJldHVybiBfYWNjZXNzb3IuYmIgfQogICBwcml2YXRlIHZhciBfYWNjZXNzb3I6IFN0cnVjdAogCkBAIC01MjcsNyArNTI3LDcgQEAKIAogcHVibGljIHN0cnVjdCBNeUdhbWVfRXhhbXBsZV9TdHJ1Y3RPZlN0cnVjdHM6IE5hdGl2ZVN0cnVjdCwgVmVyaWZpYWJsZSwgRmxhdGJ1ZmZlcnNJbml0aWFsaXphYmxlLCBOYXRpdmVPYmplY3QgewogCi0gIHN0YXRpYyBmdW5jIHZhbGlkYXRlVmVyc2lvbigpIHsgRmxhdEJ1ZmZlcnNWZXJzaW9uXzJfMF8wKCkgfQorICBzdGF0aWMgZnVuYyB2YWxpZGF0ZVZlcnNpb24oKSB7IEZsYXRCdWZmZXJzVmVyc2lvbl8yXzBfOCgpIH0KIAogICBwcml2YXRlIHZhciBfYTogTXlHYW1lX0V4YW1wbGVfQWJpbGl0eQogICBwcml2YXRlIHZhciBfYjogTXlHYW1lX0V4YW1wbGVfVGVzdApAQCAtNTg3LDcgKzU4Nyw3IEBACiAKIHB1YmxpYyBzdHJ1Y3QgTXlHYW1lX0V4YW1wbGVfU3RydWN0T2ZTdHJ1Y3RzX011dGFibGU6IEZsYXRCdWZmZXJPYmplY3QgewogCi0gIHN0YXRpYyBmdW5jIHZhbGlkYXRlVmVyc2lvbigpIHsgRmxhdEJ1ZmZlcnNWZXJzaW9uXzJfMF8wKCkgfQorICBzdGF0aWMgZnVuYyB2YWxpZGF0ZVZlcnNpb24oKSB7IEZsYXRCdWZmZXJzVmVyc2lvbl8yXzBfOCgpIH0KICAgcHVibGljIHZhciBfX2J1ZmZlcjogQnl0ZUJ1ZmZlciEgeyByZXR1cm4gX2FjY2Vzc29yLmJiIH0KICAgcHJpdmF0ZSB2YXIgX2FjY2Vzc29yOiBTdHJ1Y3QKIApAQCAtNjExLDEzICs2MTEsODAgQEAKICAgfQogfQogCitwdWJsaWMgc3RydWN0IE15R2FtZV9FeGFtcGxlX1N0cnVjdE9mU3RydWN0c09mU3RydWN0czogTmF0aXZlU3RydWN0LCBWZXJpZmlhYmxlLCBGbGF0YnVmZmVyc0luaXRpYWxpemFibGUsIE5hdGl2ZU9iamVjdCB7CisKKyAgc3RhdGljIGZ1bmMgdmFsaWRhdGVWZXJzaW9uKCkgeyBGbGF0QnVmZmVyc1ZlcnNpb25fMl8wXzgoKSB9CisKKyAgcHJpdmF0ZSB2YXIgX2E6IE15R2FtZV9FeGFtcGxlX1N0cnVjdE9mU3RydWN0cworCisgIHB1YmxpYyBpbml0KF8gYmI6IEJ5dGVCdWZmZXIsIG86IEludDMyKSB7CisgICAgbGV0IF9hY2Nlc3NvciA9IFN0cnVjdChiYjogYmIsIHBvc2l0aW9uOiBvKQorICAgIF9hID0gTXlHYW1lX0V4YW1wbGVfU3RydWN0T2ZTdHJ1Y3RzKF9hY2Nlc3Nvci5iYiwgbzogX2FjY2Vzc29yLnBvc3Rpb24gKyAwKQorICB9CisKKyAgcHVibGljIGluaXQoYTogTXlHYW1lX0V4YW1wbGVfU3RydWN0T2ZTdHJ1Y3RzKSB7CisgICAgX2EgPSBhCisgIH0KKworICBwdWJsaWMgaW5pdCgpIHsKKyAgICBfYSA9IE15R2FtZV9FeGFtcGxlX1N0cnVjdE9mU3RydWN0cygpCisgIH0KKworICBwdWJsaWMgaW5pdChfIF90OiBpbm91dCBNeUdhbWVfRXhhbXBsZV9TdHJ1Y3RPZlN0cnVjdHNPZlN0cnVjdHNfTXV0YWJsZSkgeworICAgIHZhciBfdmEgPSBfdC5hCisgICAgX2EgPSBfdmEudW5wYWNrKCkKKyAgfQorCisgIHB1YmxpYyB2YXIgYTogTXlHYW1lX0V4YW1wbGVfU3RydWN0T2ZTdHJ1Y3RzIHsgX2EgfQorCisgIHB1YmxpYyBzdGF0aWMgZnVuYyB2ZXJpZnk8VD4oXyB2ZXJpZmllcjogaW5vdXQgVmVyaWZpZXIsIGF0IHBvc2l0aW9uOiBJbnQsIG9mIHR5cGU6IFQuVHlwZSkgdGhyb3dzIHdoZXJlIFQ6IFZlcmlmaWFibGUgeworICAgIHRyeSB2ZXJpZmllci5pbkJ1ZmZlcihwb3NpdGlvbjogcG9zaXRpb24sIG9mOiBNeUdhbWVfRXhhbXBsZV9TdHJ1Y3RPZlN0cnVjdHNPZlN0cnVjdHMuc2VsZikKKyAgfQorfQorCitleHRlbnNpb24gTXlHYW1lX0V4YW1wbGVfU3RydWN0T2ZTdHJ1Y3RzT2ZTdHJ1Y3RzOiBFbmNvZGFibGUgeworCisgIGVudW0gQ29kaW5nS2V5czogU3RyaW5nLCBDb2RpbmdLZXkgeworICAgIGNhc2UgYSA9ICJhIgorICB9CisgIHB1YmxpYyBmdW5jIGVuY29kZSh0byBlbmNvZGVyOiBFbmNvZGVyKSB0aHJvd3MgeworICAgIHZhciBjb250YWluZXIgPSBlbmNvZGVyLmNvbnRhaW5lcihrZXllZEJ5OiBDb2RpbmdLZXlzLnNlbGYpCisgICAgdHJ5IGNvbnRhaW5lci5lbmNvZGVJZlByZXNlbnQoYSwgZm9yS2V5OiAuYSkKKyAgfQorfQorCitwdWJsaWMgc3RydWN0IE15R2FtZV9FeGFtcGxlX1N0cnVjdE9mU3RydWN0c09mU3RydWN0c19NdXRhYmxlOiBGbGF0QnVmZmVyT2JqZWN0IHsKKworICBzdGF0aWMgZnVuYyB2YWxpZGF0ZVZlcnNpb24oKSB7IEZsYXRCdWZmZXJzVmVyc2lvbl8yXzBfOCgpIH0KKyAgcHVibGljIHZhciBfX2J1ZmZlcjogQnl0ZUJ1ZmZlciEgeyByZXR1cm4gX2FjY2Vzc29yLmJiIH0KKyAgcHJpdmF0ZSB2YXIgX2FjY2Vzc29yOiBTdHJ1Y3QKKworICBwdWJsaWMgaW5pdChfIGJiOiBCeXRlQnVmZmVyLCBvOiBJbnQzMikgeyBfYWNjZXNzb3IgPSBTdHJ1Y3QoYmI6IGJiLCBwb3NpdGlvbjogbykgfQorCisgIHB1YmxpYyB2YXIgYTogTXlHYW1lX0V4YW1wbGVfU3RydWN0T2ZTdHJ1Y3RzX011dGFibGUgeyByZXR1cm4gTXlHYW1lX0V4YW1wbGVfU3RydWN0T2ZTdHJ1Y3RzX011dGFibGUoX2FjY2Vzc29yLmJiLCBvOiBfYWNjZXNzb3IucG9zdGlvbiArIDApIH0KKyAgCisKKyAgcHVibGljIG11dGF0aW5nIGZ1bmMgdW5wYWNrKCkgLT4gTXlHYW1lX0V4YW1wbGVfU3RydWN0T2ZTdHJ1Y3RzT2ZTdHJ1Y3RzIHsKKyAgICByZXR1cm4gTXlHYW1lX0V4YW1wbGVfU3RydWN0T2ZTdHJ1Y3RzT2ZTdHJ1Y3RzKCZzZWxmKQorICB9CisgIHB1YmxpYyBzdGF0aWMgZnVuYyBwYWNrKF8gYnVpbGRlcjogaW5vdXQgRmxhdEJ1ZmZlckJ1aWxkZXIsIG9iajogaW5vdXQgTXlHYW1lX0V4YW1wbGVfU3RydWN0T2ZTdHJ1Y3RzT2ZTdHJ1Y3RzPykgLT4gT2Zmc2V0IHsKKyAgICBndWFyZCB2YXIgb2JqID0gb2JqIGVsc2UgeyByZXR1cm4gT2Zmc2V0KCkgfQorICAgIHJldHVybiBwYWNrKCZidWlsZGVyLCBvYmo6ICZvYmopCisgIH0KKworICBwdWJsaWMgc3RhdGljIGZ1bmMgcGFjayhfIGJ1aWxkZXI6IGlub3V0IEZsYXRCdWZmZXJCdWlsZGVyLCBvYmo6IGlub3V0IE15R2FtZV9FeGFtcGxlX1N0cnVjdE9mU3RydWN0c09mU3RydWN0cykgLT4gT2Zmc2V0IHsKKyAgICByZXR1cm4gYnVpbGRlci5jcmVhdGUoc3RydWN0OiBvYmopCisgIH0KK30KKwogcHVibGljIHN0cnVjdCBNeUdhbWVfSW5QYXJlbnROYW1lc3BhY2U6IEZsYXRCdWZmZXJPYmplY3QsIFZlcmlmaWFibGUsIE9iamVjdEFQSVBhY2tlciB7CiAKLSAgc3RhdGljIGZ1bmMgdmFsaWRhdGVWZXJzaW9uKCkgeyBGbGF0QnVmZmVyc1ZlcnNpb25fMl8wXzAoKSB9CisgIHN0YXRpYyBmdW5jIHZhbGlkYXRlVmVyc2lvbigpIHsgRmxhdEJ1ZmZlcnNWZXJzaW9uXzJfMF84KCkgfQogICBwdWJsaWMgdmFyIF9fYnVmZmVyOiBCeXRlQnVmZmVyISB7IHJldHVybiBfYWNjZXNzb3IuYmIgfQogICBwcml2YXRlIHZhciBfYWNjZXNzb3I6IFRhYmxlCiAKLSAgcHVibGljIHN0YXRpYyBmdW5jIGZpbmlzaChfIGZiYjogaW5vdXQgRmxhdEJ1ZmZlckJ1aWxkZXIsIGVuZDogT2Zmc2V0LCBwcmVmaXg6IEJvb2wgPSBmYWxzZSkgeyBmYmIuZmluaXNoKG9mZnNldDogZW5kLCBmaWxlSWQ6ICJNT05TIiwgYWRkUHJlZml4OiBwcmVmaXgpIH0KKyAgcHVibGljIHN0YXRpYyB2YXIgaWQ6IFN0cmluZyB7ICJNT05TIiB9IAorICBwdWJsaWMgc3RhdGljIGZ1bmMgZmluaXNoKF8gZmJiOiBpbm91dCBGbGF0QnVmZmVyQnVpbGRlciwgZW5kOiBPZmZzZXQsIHByZWZpeDogQm9vbCA9IGZhbHNlKSB7IGZiYi5maW5pc2gob2Zmc2V0OiBlbmQsIGZpbGVJZDogTXlHYW1lX0luUGFyZW50TmFtZXNwYWNlLmlkLCBhZGRQcmVmaXg6IHByZWZpeCkgfQogICBwdWJsaWMgc3RhdGljIGZ1bmMgZ2V0Um9vdEFzSW5QYXJlbnROYW1lc3BhY2UoYmI6IEJ5dGVCdWZmZXIpIC0+IE15R2FtZV9JblBhcmVudE5hbWVzcGFjZSB7IHJldHVybiBNeUdhbWVfSW5QYXJlbnROYW1lc3BhY2UoVGFibGUoYmI6IGJiLCBwb3NpdGlvbjogSW50MzIoYmIucmVhZChkZWY6IFVPZmZzZXQuc2VsZiwgcG9zaXRpb246IGJiLnJlYWRlcikpICsgSW50MzIoYmIucmVhZGVyKSkpIH0KIAogICBwcml2YXRlIGluaXQoXyB0OiBUYWJsZSkgeyBfYWNjZXNzb3IgPSB0IH0KQEAgLTY2NiwxMSArNzMzLDEyIEBACiB9CiBwdWJsaWMgc3RydWN0IE15R2FtZV9FeGFtcGxlMl9Nb25zdGVyOiBGbGF0QnVmZmVyT2JqZWN0LCBWZXJpZmlhYmxlLCBPYmplY3RBUElQYWNrZXIgewogCi0gIHN0YXRpYyBmdW5jIHZhbGlkYXRlVmVyc2lvbigpIHsgRmxhdEJ1ZmZlcnNWZXJzaW9uXzJfMF8wKCkgfQorICBzdGF0aWMgZnVuYyB2YWxpZGF0ZVZlcnNpb24oKSB7IEZsYXRCdWZmZXJzVmVyc2lvbl8yXzBfOCgpIH0KICAgcHVibGljIHZhciBfX2J1ZmZlcjogQnl0ZUJ1ZmZlciEgeyByZXR1cm4gX2FjY2Vzc29yLmJiIH0KICAgcHJpdmF0ZSB2YXIgX2FjY2Vzc29yOiBUYWJsZQogCi0gIHB1YmxpYyBzdGF0aWMgZnVuYyBmaW5pc2goXyBmYmI6IGlub3V0IEZsYXRCdWZmZXJCdWlsZGVyLCBlbmQ6IE9mZnNldCwgcHJlZml4OiBCb29sID0gZmFsc2UpIHsgZmJiLmZpbmlzaChvZmZzZXQ6IGVuZCwgZmlsZUlkOiAiTU9OUyIsIGFkZFByZWZpeDogcHJlZml4KSB9CisgIHB1YmxpYyBzdGF0aWMgdmFyIGlkOiBTdHJpbmcgeyAiTU9OUyIgfSAKKyAgcHVibGljIHN0YXRpYyBmdW5jIGZpbmlzaChfIGZiYjogaW5vdXQgRmxhdEJ1ZmZlckJ1aWxkZXIsIGVuZDogT2Zmc2V0LCBwcmVmaXg6IEJvb2wgPSBmYWxzZSkgeyBmYmIuZmluaXNoKG9mZnNldDogZW5kLCBmaWxlSWQ6IE15R2FtZV9FeGFtcGxlMl9Nb25zdGVyLmlkLCBhZGRQcmVmaXg6IHByZWZpeCkgfQogICBwdWJsaWMgc3RhdGljIGZ1bmMgZ2V0Um9vdEFzTW9uc3RlcihiYjogQnl0ZUJ1ZmZlcikgLT4gTXlHYW1lX0V4YW1wbGUyX01vbnN0ZXIgeyByZXR1cm4gTXlHYW1lX0V4YW1wbGUyX01vbnN0ZXIoVGFibGUoYmI6IGJiLCBwb3NpdGlvbjogSW50MzIoYmIucmVhZChkZWY6IFVPZmZzZXQuc2VsZiwgcG9zaXRpb246IGJiLnJlYWRlcikpICsgSW50MzIoYmIucmVhZGVyKSkpIH0KIAogICBwcml2YXRlIGluaXQoXyB0OiBUYWJsZSkgeyBfYWNjZXNzb3IgPSB0IH0KQEAgLTcxOSwxMSArNzg3LDEyIEBACiB9CiBpbnRlcm5hbCBzdHJ1Y3QgTXlHYW1lX0V4YW1wbGVfVGVzdFNpbXBsZVRhYmxlV2l0aEVudW06IEZsYXRCdWZmZXJPYmplY3QsIFZlcmlmaWFibGUsIE9iamVjdEFQSVBhY2tlciB7CiAKLSAgc3RhdGljIGZ1bmMgdmFsaWRhdGVWZXJzaW9uKCkgeyBGbGF0QnVmZmVyc1ZlcnNpb25fMl8wXzAoKSB9CisgIHN0YXRpYyBmdW5jIHZhbGlkYXRlVmVyc2lvbigpIHsgRmxhdEJ1ZmZlcnNWZXJzaW9uXzJfMF84KCkgfQogICBpbnRlcm5hbCB2YXIgX19idWZmZXI6IEJ5dGVCdWZmZXIhIHsgcmV0dXJuIF9hY2Nlc3Nvci5iYiB9CiAgIHByaXZhdGUgdmFyIF9hY2Nlc3NvcjogVGFibGUKIAotICBpbnRlcm5hbCBzdGF0aWMgZnVuYyBmaW5pc2goXyBmYmI6IGlub3V0IEZsYXRCdWZmZXJCdWlsZGVyLCBlbmQ6IE9mZnNldCwgcHJlZml4OiBCb29sID0gZmFsc2UpIHsgZmJiLmZpbmlzaChvZmZzZXQ6IGVuZCwgZmlsZUlkOiAiTU9OUyIsIGFkZFByZWZpeDogcHJlZml4KSB9CisgIGludGVybmFsIHN0YXRpYyB2YXIgaWQ6IFN0cmluZyB7ICJNT05TIiB9IAorICBpbnRlcm5hbCBzdGF0aWMgZnVuYyBmaW5pc2goXyBmYmI6IGlub3V0IEZsYXRCdWZmZXJCdWlsZGVyLCBlbmQ6IE9mZnNldCwgcHJlZml4OiBCb29sID0gZmFsc2UpIHsgZmJiLmZpbmlzaChvZmZzZXQ6IGVuZCwgZmlsZUlkOiBNeUdhbWVfRXhhbXBsZV9UZXN0U2ltcGxlVGFibGVXaXRoRW51bS5pZCwgYWRkUHJlZml4OiBwcmVmaXgpIH0KICAgaW50ZXJuYWwgc3RhdGljIGZ1bmMgZ2V0Um9vdEFzVGVzdFNpbXBsZVRhYmxlV2l0aEVudW0oYmI6IEJ5dGVCdWZmZXIpIC0+IE15R2FtZV9FeGFtcGxlX1Rlc3RTaW1wbGVUYWJsZVdpdGhFbnVtIHsgcmV0dXJuIE15R2FtZV9FeGFtcGxlX1Rlc3RTaW1wbGVUYWJsZVdpdGhFbnVtKFRhYmxlKGJiOiBiYiwgcG9zaXRpb246IEludDMyKGJiLnJlYWQoZGVmOiBVT2Zmc2V0LnNlbGYsIHBvc2l0aW9uOiBiYi5yZWFkZXIpKSArIEludDMyKGJiLnJlYWRlcikpKSB9CiAKICAgcHJpdmF0ZSBpbml0KF8gdDogVGFibGUpIHsgX2FjY2Vzc29yID0gdCB9CkBAIC03NjQsNyArODMzLDcgQEAKICAgICByZXR1cm4gTXlHYW1lX0V4YW1wbGVfVGVzdFNpbXBsZVRhYmxlV2l0aEVudW0uZW5kVGVzdFNpbXBsZVRhYmxlV2l0aEVudW0oJmJ1aWxkZXIsIHN0YXJ0OiBfX3Jvb3QpCiAgIH0KIAotICBwdWJsaWMgc3RhdGljIGZ1bmMgdmVyaWZ5PFQ+KF8gdmVyaWZpZXI6IGlub3V0IFZlcmlmaWVyLCBhdCBwb3NpdGlvbjogSW50LCBvZiB0eXBlOiBULlR5cGUpIHRocm93cyB3aGVyZSBUOiBWZXJpZmlhYmxlIHsKKyAgaW50ZXJuYWwgc3RhdGljIGZ1bmMgdmVyaWZ5PFQ+KF8gdmVyaWZpZXI6IGlub3V0IFZlcmlmaWVyLCBhdCBwb3NpdGlvbjogSW50LCBvZiB0eXBlOiBULlR5cGUpIHRocm93cyB3aGVyZSBUOiBWZXJpZmlhYmxlIHsKICAgICB2YXIgX3YgPSB0cnkgdmVyaWZpZXIudmlzaXRUYWJsZShhdDogcG9zaXRpb24pCiAgICAgdHJ5IF92LnZpc2l0KGZpZWxkOiBWVE9GRlNFVC5jb2xvci5wLCBmaWVsZE5hbWU6ICJjb2xvciIsIHJlcXVpcmVkOiBmYWxzZSwgdHlwZTogTXlHYW1lX0V4YW1wbGVfQ29sb3Iuc2VsZikKICAgICBfdi5maW5pc2goKQpAQCAtNzc2LDcgKzg0NSw3IEBACiAgIGVudW0gQ29kaW5nS2V5czogU3RyaW5nLCBDb2RpbmdLZXkgewogICAgIGNhc2UgY29sb3IgPSAiY29sb3IiCiAgIH0KLSAgcHVibGljIGZ1bmMgZW5jb2RlKHRvIGVuY29kZXI6IEVuY29kZXIpIHRocm93cyB7CisgIGludGVybmFsIGZ1bmMgZW5jb2RlKHRvIGVuY29kZXI6IEVuY29kZXIpIHRocm93cyB7CiAgICAgdmFyIGNvbnRhaW5lciA9IGVuY29kZXIuY29udGFpbmVyKGtleWVkQnk6IENvZGluZ0tleXMuc2VsZikKICAgICBpZiBjb2xvciAhPSAuZ3JlZW4gewogICAgICAgdHJ5IGNvbnRhaW5lci5lbmNvZGVJZlByZXNlbnQoY29sb3IsIGZvcktleTogLmNvbG9yKQpAQCAtODAxLDExICs4NzAsMTIgQEAKIH0KIHB1YmxpYyBzdHJ1Y3QgTXlHYW1lX0V4YW1wbGVfU3RhdDogRmxhdEJ1ZmZlck9iamVjdCwgVmVyaWZpYWJsZSwgT2JqZWN0QVBJUGFja2VyIHsKIAotICBzdGF0aWMgZnVuYyB2YWxpZGF0ZVZlcnNpb24oKSB7IEZsYXRCdWZmZXJzVmVyc2lvbl8yXzBfMCgpIH0KKyAgc3RhdGljIGZ1bmMgdmFsaWRhdGVWZXJzaW9uKCkgeyBGbGF0QnVmZmVyc1ZlcnNpb25fMl8wXzgoKSB9CiAgIHB1YmxpYyB2YXIgX19idWZmZXI6IEJ5dGVCdWZmZXIhIHsgcmV0dXJuIF9hY2Nlc3Nvci5iYiB9CiAgIHByaXZhdGUgdmFyIF9hY2Nlc3NvcjogVGFibGUKIAotICBwdWJsaWMgc3RhdGljIGZ1bmMgZmluaXNoKF8gZmJiOiBpbm91dCBGbGF0QnVmZmVyQnVpbGRlciwgZW5kOiBPZmZzZXQsIHByZWZpeDogQm9vbCA9IGZhbHNlKSB7IGZiYi5maW5pc2gob2Zmc2V0OiBlbmQsIGZpbGVJZDogIk1PTlMiLCBhZGRQcmVmaXg6IHByZWZpeCkgfQorICBwdWJsaWMgc3RhdGljIHZhciBpZDogU3RyaW5nIHsgIk1PTlMiIH0gCisgIHB1YmxpYyBzdGF0aWMgZnVuYyBmaW5pc2goXyBmYmI6IGlub3V0IEZsYXRCdWZmZXJCdWlsZGVyLCBlbmQ6IE9mZnNldCwgcHJlZml4OiBCb29sID0gZmFsc2UpIHsgZmJiLmZpbmlzaChvZmZzZXQ6IGVuZCwgZmlsZUlkOiBNeUdhbWVfRXhhbXBsZV9TdGF0LmlkLCBhZGRQcmVmaXg6IHByZWZpeCkgfQogICBwdWJsaWMgc3RhdGljIGZ1bmMgZ2V0Um9vdEFzU3RhdChiYjogQnl0ZUJ1ZmZlcikgLT4gTXlHYW1lX0V4YW1wbGVfU3RhdCB7IHJldHVybiBNeUdhbWVfRXhhbXBsZV9TdGF0KFRhYmxlKGJiOiBiYiwgcG9zaXRpb246IEludDMyKGJiLnJlYWQoZGVmOiBVT2Zmc2V0LnNlbGYsIHBvc2l0aW9uOiBiYi5yZWFkZXIpKSArIEludDMyKGJiLnJlYWRlcikpKSB9CiAKICAgcHJpdmF0ZSBpbml0KF8gdDogVGFibGUpIHsgX2FjY2Vzc29yID0gdCB9CkBAIC05NDEsMTEgKzEwMTEsMTIgQEAKIH0KIHB1YmxpYyBzdHJ1Y3QgTXlHYW1lX0V4YW1wbGVfUmVmZXJyYWJsZTogRmxhdEJ1ZmZlck9iamVjdCwgVmVyaWZpYWJsZSwgT2JqZWN0QVBJUGFja2VyIHsKIAotICBzdGF0aWMgZnVuYyB2YWxpZGF0ZVZlcnNpb24oKSB7IEZsYXRCdWZmZXJzVmVyc2lvbl8yXzBfMCgpIH0KKyAgc3RhdGljIGZ1bmMgdmFsaWRhdGVWZXJzaW9uKCkgeyBGbGF0QnVmZmVyc1ZlcnNpb25fMl8wXzgoKSB9CiAgIHB1YmxpYyB2YXIgX19idWZmZXI6IEJ5dGVCdWZmZXIhIHsgcmV0dXJuIF9hY2Nlc3Nvci5iYiB9CiAgIHByaXZhdGUgdmFyIF9hY2Nlc3NvcjogVGFibGUKIAotICBwdWJsaWMgc3RhdGljIGZ1bmMgZmluaXNoKF8gZmJiOiBpbm91dCBGbGF0QnVmZmVyQnVpbGRlciwgZW5kOiBPZmZzZXQsIHByZWZpeDogQm9vbCA9IGZhbHNlKSB7IGZiYi5maW5pc2gob2Zmc2V0OiBlbmQsIGZpbGVJZDogIk1PTlMiLCBhZGRQcmVmaXg6IHByZWZpeCkgfQorICBwdWJsaWMgc3RhdGljIHZhciBpZDogU3RyaW5nIHsgIk1PTlMiIH0gCisgIHB1YmxpYyBzdGF0aWMgZnVuYyBmaW5pc2goXyBmYmI6IGlub3V0IEZsYXRCdWZmZXJCdWlsZGVyLCBlbmQ6IE9mZnNldCwgcHJlZml4OiBCb29sID0gZmFsc2UpIHsgZmJiLmZpbmlzaChvZmZzZXQ6IGVuZCwgZmlsZUlkOiBNeUdhbWVfRXhhbXBsZV9SZWZlcnJhYmxlLmlkLCBhZGRQcmVmaXg6IHByZWZpeCkgfQogICBwdWJsaWMgc3RhdGljIGZ1bmMgZ2V0Um9vdEFzUmVmZXJyYWJsZShiYjogQnl0ZUJ1ZmZlcikgLT4gTXlHYW1lX0V4YW1wbGVfUmVmZXJyYWJsZSB7IHJldHVybiBNeUdhbWVfRXhhbXBsZV9SZWZlcnJhYmxlKFRhYmxlKGJiOiBiYiwgcG9zaXRpb246IEludDMyKGJiLnJlYWQoZGVmOiBVT2Zmc2V0LnNlbGYsIHBvc2l0aW9uOiBiYi5yZWFkZXIpKSArIEludDMyKGJiLnJlYWRlcikpKSB9CiAKICAgcHJpdmF0ZSBpbml0KF8gdDogVGFibGUpIHsgX2FjY2Vzc29yID0gdCB9CkBAIC0xMDQ4LDExICsxMTE5LDEyIEBACiAvLy8gIGFuIGV4YW1wbGUgZG9jdW1lbnRhdGlvbiBjb21tZW50OiAibW9uc3RlciBvYmplY3QiCiBwdWJsaWMgc3RydWN0IE15R2FtZV9FeGFtcGxlX01vbnN0ZXI6IEZsYXRCdWZmZXJPYmplY3QsIFZlcmlmaWFibGUsIE9iamVjdEFQSVBhY2tlciB7CiAKLSAgc3RhdGljIGZ1bmMgdmFsaWRhdGVWZXJzaW9uKCkgeyBGbGF0QnVmZmVyc1ZlcnNpb25fMl8wXzAoKSB9CisgIHN0YXRpYyBmdW5jIHZhbGlkYXRlVmVyc2lvbigpIHsgRmxhdEJ1ZmZlcnNWZXJzaW9uXzJfMF84KCkgfQogICBwdWJsaWMgdmFyIF9fYnVmZmVyOiBCeXRlQnVmZmVyISB7IHJldHVybiBfYWNjZXNzb3IuYmIgfQogICBwcml2YXRlIHZhciBfYWNjZXNzb3I6IFRhYmxlCiAKLSAgcHVibGljIHN0YXRpYyBmdW5jIGZpbmlzaChfIGZiYjogaW5vdXQgRmxhdEJ1ZmZlckJ1aWxkZXIsIGVuZDogT2Zmc2V0LCBwcmVmaXg6IEJvb2wgPSBmYWxzZSkgeyBmYmIuZmluaXNoKG9mZnNldDogZW5kLCBmaWxlSWQ6ICJNT05TIiwgYWRkUHJlZml4OiBwcmVmaXgpIH0KKyAgcHVibGljIHN0YXRpYyB2YXIgaWQ6IFN0cmluZyB7ICJNT05TIiB9IAorICBwdWJsaWMgc3RhdGljIGZ1bmMgZmluaXNoKF8gZmJiOiBpbm91dCBGbGF0QnVmZmVyQnVpbGRlciwgZW5kOiBPZmZzZXQsIHByZWZpeDogQm9vbCA9IGZhbHNlKSB7IGZiYi5maW5pc2gob2Zmc2V0OiBlbmQsIGZpbGVJZDogTXlHYW1lX0V4YW1wbGVfTW9uc3Rlci5pZCwgYWRkUHJlZml4OiBwcmVmaXgpIH0KICAgcHVibGljIHN0YXRpYyBmdW5jIGdldFJvb3RBc01vbnN0ZXIoYmI6IEJ5dGVCdWZmZXIpIC0+IE15R2FtZV9FeGFtcGxlX01vbnN0ZXIgeyByZXR1cm4gTXlHYW1lX0V4YW1wbGVfTW9uc3RlcihUYWJsZShiYjogYmIsIHBvc2l0aW9uOiBJbnQzMihiYi5yZWFkKGRlZjogVU9mZnNldC5zZWxmLCBwb3NpdGlvbjogYmIucmVhZGVyKSkgKyBJbnQzMihiYi5yZWFkZXIpKSkgfQogCiAgIHByaXZhdGUgaW5pdChfIHQ6IFRhYmxlKSB7IF9hY2Nlc3NvciA9IHQgfQpAQCAtMTEyNCw2ICsxMTk2LDcgQEAKICAgQGRpc2NhcmRhYmxlUmVzdWx0IHB1YmxpYyBmdW5jIG11dGF0ZShocDogSW50MTYpIC0+IEJvb2wge2xldCBvID0gX2FjY2Vzc29yLm9mZnNldChWVE9GRlNFVC5ocC52KTsgIHJldHVybiBfYWNjZXNzb3IubXV0YXRlKGhwLCBpbmRleDogbykgfQogICBwdWJsaWMgdmFyIG5hbWU6IFN0cmluZyEgeyBsZXQgbyA9IF9hY2Nlc3Nvci5vZmZzZXQoVlRPRkZTRVQubmFtZS52KTsgcmV0dXJuIF9hY2Nlc3Nvci5zdHJpbmcoYXQ6IG8pIH0KICAgcHVibGljIHZhciBuYW1lU2VnbWVudEFycmF5OiBbVUludDhdISB7IHJldHVybiBfYWNjZXNzb3IuZ2V0VmVjdG9yKGF0OiBWVE9GRlNFVC5uYW1lLnYpIH0KKyAgcHVibGljIHZhciBoYXNJbnZlbnRvcnk6IEJvb2wgeyBsZXQgbyA9IF9hY2Nlc3Nvci5vZmZzZXQoVlRPRkZTRVQuaW52ZW50b3J5LnYpOyByZXR1cm4gbyA9PSAwID8gZmFsc2UgOiB0cnVlIH0KICAgcHVibGljIHZhciBpbnZlbnRvcnlDb3VudDogSW50MzIgeyBsZXQgbyA9IF9hY2Nlc3Nvci5vZmZzZXQoVlRPRkZTRVQuaW52ZW50b3J5LnYpOyByZXR1cm4gbyA9PSAwID8gMCA6IF9hY2Nlc3Nvci52ZWN0b3IoY291bnQ6IG8pIH0KICAgcHVibGljIGZ1bmMgaW52ZW50b3J5KGF0IGluZGV4OiBJbnQzMikgLT4gVUludDggeyBsZXQgbyA9IF9hY2Nlc3Nvci5vZmZzZXQoVlRPRkZTRVQuaW52ZW50b3J5LnYpOyByZXR1cm4gbyA9PSAwID8gMCA6IF9hY2Nlc3Nvci5kaXJlY3RSZWFkKG9mOiBVSW50OC5zZWxmLCBvZmZzZXQ6IF9hY2Nlc3Nvci52ZWN0b3IoYXQ6IG8pICsgaW5kZXggKiAxKSB9CiAgIHB1YmxpYyB2YXIgaW52ZW50b3J5OiBbVUludDhdIHsgcmV0dXJuIF9hY2Nlc3Nvci5nZXRWZWN0b3IoYXQ6IFZUT0ZGU0VULmludmVudG9yeS52KSA/PyBbXSB9CkBAIC0xMTMyLDE3ICsxMjA1LDIxIEBACiAgIEBkaXNjYXJkYWJsZVJlc3VsdCBwdWJsaWMgZnVuYyBtdXRhdGUoY29sb3I6IE15R2FtZV9FeGFtcGxlX0NvbG9yKSAtPiBCb29sIHtsZXQgbyA9IF9hY2Nlc3Nvci5vZmZzZXQoVlRPRkZTRVQuY29sb3Iudik7ICByZXR1cm4gX2FjY2Vzc29yLm11dGF0ZShjb2xvci5yYXdWYWx1ZSwgaW5kZXg6IG8pIH0KICAgcHVibGljIHZhciB0ZXN0VHlwZTogTXlHYW1lX0V4YW1wbGVfQW55XyB7IGxldCBvID0gX2FjY2Vzc29yLm9mZnNldChWVE9GRlNFVC50ZXN0VHlwZS52KTsgcmV0dXJuIG8gPT0gMCA/IC5ub25lXyA6IE15R2FtZV9FeGFtcGxlX0FueV8ocmF3VmFsdWU6IF9hY2Nlc3Nvci5yZWFkQnVmZmVyKG9mOiBVSW50OC5zZWxmLCBhdDogbykpID8/IC5ub25lXyB9CiAgIHB1YmxpYyBmdW5jIHRlc3Q8VDogRmxhdGJ1ZmZlcnNJbml0aWFsaXphYmxlPih0eXBlOiBULlR5cGUpIC0+IFQ/IHsgbGV0IG8gPSBfYWNjZXNzb3Iub2Zmc2V0KFZUT0ZGU0VULnRlc3Qudik7IHJldHVybiBvID09IDAgPyBuaWwgOiBfYWNjZXNzb3IudW5pb24obykgfQorICBwdWJsaWMgdmFyIGhhc1Rlc3Q0OiBCb29sIHsgbGV0IG8gPSBfYWNjZXNzb3Iub2Zmc2V0KFZUT0ZGU0VULnRlc3Q0LnYpOyByZXR1cm4gbyA9PSAwID8gZmFsc2UgOiB0cnVlIH0KICAgcHVibGljIHZhciB0ZXN0NENvdW50OiBJbnQzMiB7IGxldCBvID0gX2FjY2Vzc29yLm9mZnNldChWVE9GRlNFVC50ZXN0NC52KTsgcmV0dXJuIG8gPT0gMCA/IDAgOiBfYWNjZXNzb3IudmVjdG9yKGNvdW50OiBvKSB9CiAgIHB1YmxpYyBmdW5jIHRlc3Q0KGF0IGluZGV4OiBJbnQzMikgLT4gTXlHYW1lX0V4YW1wbGVfVGVzdD8geyBsZXQgbyA9IF9hY2Nlc3Nvci5vZmZzZXQoVlRPRkZTRVQudGVzdDQudik7IHJldHVybiBvID09IDAgPyBuaWwgOiBfYWNjZXNzb3IuZGlyZWN0UmVhZChvZjogTXlHYW1lX0V4YW1wbGVfVGVzdC5zZWxmLCBvZmZzZXQ6IF9hY2Nlc3Nvci52ZWN0b3IoYXQ6IG8pICsgaW5kZXggKiA0KSB9CiAgIHB1YmxpYyBmdW5jIG11dGFibGVUZXN0NChhdCBpbmRleDogSW50MzIpIC0+IE15R2FtZV9FeGFtcGxlX1Rlc3RfTXV0YWJsZT8geyBsZXQgbyA9IF9hY2Nlc3Nvci5vZmZzZXQoVlRPRkZTRVQudGVzdDQudik7IHJldHVybiBvID09IDAgPyBuaWwgOiBNeUdhbWVfRXhhbXBsZV9UZXN0X011dGFibGUoX2FjY2Vzc29yLmJiLCBvOiBfYWNjZXNzb3IudmVjdG9yKGF0OiBvKSArIGluZGV4ICogNCkgfQorICBwdWJsaWMgdmFyIGhhc1Rlc3RhcnJheW9mc3RyaW5nOiBCb29sIHsgbGV0IG8gPSBfYWNjZXNzb3Iub2Zmc2V0KFZUT0ZGU0VULnRlc3RhcnJheW9mc3RyaW5nLnYpOyByZXR1cm4gbyA9PSAwID8gZmFsc2UgOiB0cnVlIH0KICAgcHVibGljIHZhciB0ZXN0YXJyYXlvZnN0cmluZ0NvdW50OiBJbnQzMiB7IGxldCBvID0gX2FjY2Vzc29yLm9mZnNldChWVE9GRlNFVC50ZXN0YXJyYXlvZnN0cmluZy52KTsgcmV0dXJuIG8gPT0gMCA/IDAgOiBfYWNjZXNzb3IudmVjdG9yKGNvdW50OiBvKSB9CiAgIHB1YmxpYyBmdW5jIHRlc3RhcnJheW9mc3RyaW5nKGF0IGluZGV4OiBJbnQzMikgLT4gU3RyaW5nPyB7IGxldCBvID0gX2FjY2Vzc29yLm9mZnNldChWVE9GRlNFVC50ZXN0YXJyYXlvZnN0cmluZy52KTsgcmV0dXJuIG8gPT0gMCA/IG5pbCA6IF9hY2Nlc3Nvci5kaXJlY3RTdHJpbmcoYXQ6IF9hY2Nlc3Nvci52ZWN0b3IoYXQ6IG8pICsgaW5kZXggKiA0KSB9CiAgIC8vLyAgYW4gZXhhbXBsZSBkb2N1bWVudGF0aW9uIGNvbW1lbnQ6IHRoaXMgd2lsbCBlbmQgdXAgaW4gdGhlIGdlbmVyYXRlZCBjb2RlCiAgIC8vLyAgbXVsdGlsaW5lIHRvbworICBwdWJsaWMgdmFyIGhhc1Rlc3RhcnJheW9mdGFibGVzOiBCb29sIHsgbGV0IG8gPSBfYWNjZXNzb3Iub2Zmc2V0KFZUT0ZGU0VULnRlc3RhcnJheW9mdGFibGVzLnYpOyByZXR1cm4gbyA9PSAwID8gZmFsc2UgOiB0cnVlIH0KICAgcHVibGljIHZhciB0ZXN0YXJyYXlvZnRhYmxlc0NvdW50OiBJbnQzMiB7IGxldCBvID0gX2FjY2Vzc29yLm9mZnNldChWVE9GRlNFVC50ZXN0YXJyYXlvZnRhYmxlcy52KTsgcmV0dXJuIG8gPT0gMCA/IDAgOiBfYWNjZXNzb3IudmVjdG9yKGNvdW50OiBvKSB9CiAgIHB1YmxpYyBmdW5jIHRlc3RhcnJheW9mdGFibGVzKGF0IGluZGV4OiBJbnQzMikgLT4gTXlHYW1lX0V4YW1wbGVfTW9uc3Rlcj8geyBsZXQgbyA9IF9hY2Nlc3Nvci5vZmZzZXQoVlRPRkZTRVQudGVzdGFycmF5b2Z0YWJsZXMudik7IHJldHVybiBvID09IDAgPyBuaWwgOiBNeUdhbWVfRXhhbXBsZV9Nb25zdGVyKF9hY2Nlc3Nvci5iYiwgbzogX2FjY2Vzc29yLmluZGlyZWN0KF9hY2Nlc3Nvci52ZWN0b3IoYXQ6IG8pICsgaW5kZXggKiA0KSkgfQogICBwdWJsaWMgZnVuYyB0ZXN0YXJyYXlvZnRhYmxlc0J5KGtleTogU3RyaW5nKSAtPiBNeUdhbWVfRXhhbXBsZV9Nb25zdGVyPyB7IGxldCBvID0gX2FjY2Vzc29yLm9mZnNldChWVE9GRlNFVC50ZXN0YXJyYXlvZnRhYmxlcy52KTsgcmV0dXJuIG8gPT0gMCA/IG5pbCA6IE15R2FtZV9FeGFtcGxlX01vbnN0ZXIubG9va3VwQnlLZXkodmVjdG9yOiBfYWNjZXNzb3IudmVjdG9yKGF0OiBvKSwga2V5OiBrZXksIGZiYjogX2FjY2Vzc29yLmJiKSB9CiAgIHB1YmxpYyB2YXIgZW5lbXk6IE15R2FtZV9FeGFtcGxlX01vbnN0ZXI/IHsgbGV0IG8gPSBfYWNjZXNzb3Iub2Zmc2V0KFZUT0ZGU0VULmVuZW15LnYpOyByZXR1cm4gbyA9PSAwID8gbmlsIDogTXlHYW1lX0V4YW1wbGVfTW9uc3RlcihfYWNjZXNzb3IuYmIsIG86IF9hY2Nlc3Nvci5pbmRpcmVjdChvICsgX2FjY2Vzc29yLnBvc3Rpb24pKSB9CisgIHB1YmxpYyB2YXIgaGFzVGVzdG5lc3RlZGZsYXRidWZmZXI6IEJvb2wgeyBsZXQgbyA9IF9hY2Nlc3Nvci5vZmZzZXQoVlRPRkZTRVQudGVzdG5lc3RlZGZsYXRidWZmZXIudik7IHJldHVybiBvID09IDAgPyBmYWxzZSA6IHRydWUgfQogICBwdWJsaWMgdmFyIHRlc3RuZXN0ZWRmbGF0YnVmZmVyQ291bnQ6IEludDMyIHsgbGV0IG8gPSBfYWNjZXNzb3Iub2Zmc2V0KFZUT0ZGU0VULnRlc3RuZXN0ZWRmbGF0YnVmZmVyLnYpOyByZXR1cm4gbyA9PSAwID8gMCA6IF9hY2Nlc3Nvci52ZWN0b3IoY291bnQ6IG8pIH0KICAgcHVibGljIGZ1bmMgdGVzdG5lc3RlZGZsYXRidWZmZXIoYXQgaW5kZXg6IEludDMyKSAtPiBVSW50OCB7IGxldCBvID0gX2FjY2Vzc29yLm9mZnNldChWVE9GRlNFVC50ZXN0bmVzdGVkZmxhdGJ1ZmZlci52KTsgcmV0dXJuIG8gPT0gMCA/IDAgOiBfYWNjZXNzb3IuZGlyZWN0UmVhZChvZjogVUludDguc2VsZiwgb2Zmc2V0OiBfYWNjZXNzb3IudmVjdG9yKGF0OiBvKSArIGluZGV4ICogMSkgfQogICBwdWJsaWMgdmFyIHRlc3RuZXN0ZWRmbGF0YnVmZmVyOiBbVUludDhdIHsgcmV0dXJuIF9hY2Nlc3Nvci5nZXRWZWN0b3IoYXQ6IFZUT0ZGU0VULnRlc3RuZXN0ZWRmbGF0YnVmZmVyLnYpID8/IFtdIH0KQEAgLTExNjYsNiArMTI0Myw3IEBACiAgIEBkaXNjYXJkYWJsZVJlc3VsdCBwdWJsaWMgZnVuYyBtdXRhdGUodGVzdGhhc2hzNjRGbnYxYTogSW50NjQpIC0+IEJvb2wge2xldCBvID0gX2FjY2Vzc29yLm9mZnNldChWVE9GRlNFVC50ZXN0aGFzaHM2NEZudjFhLnYpOyAgcmV0dXJuIF9hY2Nlc3Nvci5tdXRhdGUodGVzdGhhc2hzNjRGbnYxYSwgaW5kZXg6IG8pIH0KICAgcHVibGljIHZhciB0ZXN0aGFzaHU2NEZudjFhOiBVSW50NjQgeyBsZXQgbyA9IF9hY2Nlc3Nvci5vZmZzZXQoVlRPRkZTRVQudGVzdGhhc2h1NjRGbnYxYS52KTsgcmV0dXJuIG8gPT0gMCA/IDAgOiBfYWNjZXNzb3IucmVhZEJ1ZmZlcihvZjogVUludDY0LnNlbGYsIGF0OiBvKSB9CiAgIEBkaXNjYXJkYWJsZVJlc3VsdCBwdWJsaWMgZnVuYyBtdXRhdGUodGVzdGhhc2h1NjRGbnYxYTogVUludDY0KSAtPiBCb29sIHtsZXQgbyA9IF9hY2Nlc3Nvci5vZmZzZXQoVlRPRkZTRVQudGVzdGhhc2h1NjRGbnYxYS52KTsgIHJldHVybiBfYWNjZXNzb3IubXV0YXRlKHRlc3RoYXNodTY0Rm52MWEsIGluZGV4OiBvKSB9CisgIHB1YmxpYyB2YXIgaGFzVGVzdGFycmF5b2Zib29sczogQm9vbCB7IGxldCBvID0gX2FjY2Vzc29yLm9mZnNldChWVE9GRlNFVC50ZXN0YXJyYXlvZmJvb2xzLnYpOyByZXR1cm4gbyA9PSAwID8gZmFsc2UgOiB0cnVlIH0KICAgcHVibGljIHZhciB0ZXN0YXJyYXlvZmJvb2xzQ291bnQ6IEludDMyIHsgbGV0IG8gPSBfYWNjZXNzb3Iub2Zmc2V0KFZUT0ZGU0VULnRlc3RhcnJheW9mYm9vbHMudik7IHJldHVybiBvID09IDAgPyAwIDogX2FjY2Vzc29yLnZlY3Rvcihjb3VudDogbykgfQogICBwdWJsaWMgZnVuYyB0ZXN0YXJyYXlvZmJvb2xzKGF0IGluZGV4OiBJbnQzMikgLT4gQm9vbCB7IGxldCBvID0gX2FjY2Vzc29yLm9mZnNldChWVE9GRlNFVC50ZXN0YXJyYXlvZmJvb2xzLnYpOyByZXR1cm4gbyA9PSAwID8gdHJ1ZSA6IF9hY2Nlc3Nvci5kaXJlY3RSZWFkKG9mOiBCb29sLnNlbGYsIG9mZnNldDogX2FjY2Vzc29yLnZlY3RvcihhdDogbykgKyBpbmRleCAqIDEpIH0KICAgcHVibGljIHZhciB0ZXN0YXJyYXlvZmJvb2xzOiBbQm9vbF0geyByZXR1cm4gX2FjY2Vzc29yLmdldFZlY3RvcihhdDogVlRPRkZTRVQudGVzdGFycmF5b2Zib29scy52KSA/PyBbXSB9CkBAIC0xMTc2LDQ3ICsxMjU0LDU4IEBACiAgIEBkaXNjYXJkYWJsZVJlc3VsdCBwdWJsaWMgZnVuYyBtdXRhdGUodGVzdGYyOiBGbG9hdDMyKSAtPiBCb29sIHtsZXQgbyA9IF9hY2Nlc3Nvci5vZmZzZXQoVlRPRkZTRVQudGVzdGYyLnYpOyAgcmV0dXJuIF9hY2Nlc3Nvci5tdXRhdGUodGVzdGYyLCBpbmRleDogbykgfQogICBwdWJsaWMgdmFyIHRlc3RmMzogRmxvYXQzMiB7IGxldCBvID0gX2FjY2Vzc29yLm9mZnNldChWVE9GRlNFVC50ZXN0ZjMudik7IHJldHVybiBvID09IDAgPyAwLjAgOiBfYWNjZXNzb3IucmVhZEJ1ZmZlcihvZjogRmxvYXQzMi5zZWxmLCBhdDogbykgfQogICBAZGlzY2FyZGFibGVSZXN1bHQgcHVibGljIGZ1bmMgbXV0YXRlKHRlc3RmMzogRmxvYXQzMikgLT4gQm9vbCB7bGV0IG8gPSBfYWNjZXNzb3Iub2Zmc2V0KFZUT0ZGU0VULnRlc3RmMy52KTsgIHJldHVybiBfYWNjZXNzb3IubXV0YXRlKHRlc3RmMywgaW5kZXg6IG8pIH0KKyAgcHVibGljIHZhciBoYXNUZXN0YXJyYXlvZnN0cmluZzI6IEJvb2wgeyBsZXQgbyA9IF9hY2Nlc3Nvci5vZmZzZXQoVlRPRkZTRVQudGVzdGFycmF5b2ZzdHJpbmcyLnYpOyByZXR1cm4gbyA9PSAwID8gZmFsc2UgOiB0cnVlIH0KICAgcHVibGljIHZhciB0ZXN0YXJyYXlvZnN0cmluZzJDb3VudDogSW50MzIgeyBsZXQgbyA9IF9hY2Nlc3Nvci5vZmZzZXQoVlRPRkZTRVQudGVzdGFycmF5b2ZzdHJpbmcyLnYpOyByZXR1cm4gbyA9PSAwID8gMCA6IF9hY2Nlc3Nvci52ZWN0b3IoY291bnQ6IG8pIH0KICAgcHVibGljIGZ1bmMgdGVzdGFycmF5b2ZzdHJpbmcyKGF0IGluZGV4OiBJbnQzMikgLT4gU3RyaW5nPyB7IGxldCBvID0gX2FjY2Vzc29yLm9mZnNldChWVE9GRlNFVC50ZXN0YXJyYXlvZnN0cmluZzIudik7IHJldHVybiBvID09IDAgPyBuaWwgOiBfYWNjZXNzb3IuZGlyZWN0U3RyaW5nKGF0OiBfYWNjZXNzb3IudmVjdG9yKGF0OiBvKSArIGluZGV4ICogNCkgfQorICBwdWJsaWMgdmFyIGhhc1Rlc3RhcnJheW9mc29ydGVkc3RydWN0OiBCb29sIHsgbGV0IG8gPSBfYWNjZXNzb3Iub2Zmc2V0KFZUT0ZGU0VULnRlc3RhcnJheW9mc29ydGVkc3RydWN0LnYpOyByZXR1cm4gbyA9PSAwID8gZmFsc2UgOiB0cnVlIH0KICAgcHVibGljIHZhciB0ZXN0YXJyYXlvZnNvcnRlZHN0cnVjdENvdW50OiBJbnQzMiB7IGxldCBvID0gX2FjY2Vzc29yLm9mZnNldChWVE9GRlNFVC50ZXN0YXJyYXlvZnNvcnRlZHN0cnVjdC52KTsgcmV0dXJuIG8gPT0gMCA/IDAgOiBfYWNjZXNzb3IudmVjdG9yKGNvdW50OiBvKSB9CiAgIHB1YmxpYyBmdW5jIHRlc3RhcnJheW9mc29ydGVkc3RydWN0KGF0IGluZGV4OiBJbnQzMikgLT4gTXlHYW1lX0V4YW1wbGVfQWJpbGl0eT8geyBsZXQgbyA9IF9hY2Nlc3Nvci5vZmZzZXQoVlRPRkZTRVQudGVzdGFycmF5b2Zzb3J0ZWRzdHJ1Y3Qudik7IHJldHVybiBvID09IDAgPyBuaWwgOiBfYWNjZXNzb3IuZGlyZWN0UmVhZChvZjogTXlHYW1lX0V4YW1wbGVfQWJpbGl0eS5zZWxmLCBvZmZzZXQ6IF9hY2Nlc3Nvci52ZWN0b3IoYXQ6IG8pICsgaW5kZXggKiA4KSB9CiAgIHB1YmxpYyBmdW5jIG11dGFibGVUZXN0YXJyYXlvZnNvcnRlZHN0cnVjdChhdCBpbmRleDogSW50MzIpIC0+IE15R2FtZV9FeGFtcGxlX0FiaWxpdHlfTXV0YWJsZT8geyBsZXQgbyA9IF9hY2Nlc3Nvci5vZmZzZXQoVlRPRkZTRVQudGVzdGFycmF5b2Zzb3J0ZWRzdHJ1Y3Qudik7IHJldHVybiBvID09IDAgPyBuaWwgOiBNeUdhbWVfRXhhbXBsZV9BYmlsaXR5X011dGFibGUoX2FjY2Vzc29yLmJiLCBvOiBfYWNjZXNzb3IudmVjdG9yKGF0OiBvKSArIGluZGV4ICogOCkgfQorICBwdWJsaWMgdmFyIGhhc0ZsZXg6IEJvb2wgeyBsZXQgbyA9IF9hY2Nlc3Nvci5vZmZzZXQoVlRPRkZTRVQuZmxleC52KTsgcmV0dXJuIG8gPT0gMCA/IGZhbHNlIDogdHJ1ZSB9CiAgIHB1YmxpYyB2YXIgZmxleENvdW50OiBJbnQzMiB7IGxldCBvID0gX2FjY2Vzc29yLm9mZnNldChWVE9GRlNFVC5mbGV4LnYpOyByZXR1cm4gbyA9PSAwID8gMCA6IF9hY2Nlc3Nvci52ZWN0b3IoY291bnQ6IG8pIH0KICAgcHVibGljIGZ1bmMgZmxleChhdCBpbmRleDogSW50MzIpIC0+IFVJbnQ4IHsgbGV0IG8gPSBfYWNjZXNzb3Iub2Zmc2V0KFZUT0ZGU0VULmZsZXgudik7IHJldHVybiBvID09IDAgPyAwIDogX2FjY2Vzc29yLmRpcmVjdFJlYWQob2Y6IFVJbnQ4LnNlbGYsIG9mZnNldDogX2FjY2Vzc29yLnZlY3RvcihhdDogbykgKyBpbmRleCAqIDEpIH0KICAgcHVibGljIHZhciBmbGV4OiBbVUludDhdIHsgcmV0dXJuIF9hY2Nlc3Nvci5nZXRWZWN0b3IoYXQ6IFZUT0ZGU0VULmZsZXgudikgPz8gW10gfQogICBwdWJsaWMgZnVuYyBtdXRhdGUoZmxleDogVUludDgsIGF0IGluZGV4OiBJbnQzMikgLT4gQm9vbCB7IGxldCBvID0gX2FjY2Vzc29yLm9mZnNldChWVE9GRlNFVC5mbGV4LnYpOyByZXR1cm4gX2FjY2Vzc29yLmRpcmVjdE11dGF0ZShmbGV4LCBpbmRleDogX2FjY2Vzc29yLnZlY3RvcihhdDogbykgKyBpbmRleCAqIDEpIH0KKyAgcHVibGljIHZhciBoYXNUZXN0NTogQm9vbCB7IGxldCBvID0gX2FjY2Vzc29yLm9mZnNldChWVE9GRlNFVC50ZXN0NS52KTsgcmV0dXJuIG8gPT0gMCA/IGZhbHNlIDogdHJ1ZSB9CiAgIHB1YmxpYyB2YXIgdGVzdDVDb3VudDogSW50MzIgeyBsZXQgbyA9IF9hY2Nlc3Nvci5vZmZzZXQoVlRPRkZTRVQudGVzdDUudik7IHJldHVybiBvID09IDAgPyAwIDogX2FjY2Vzc29yLnZlY3Rvcihjb3VudDogbykgfQogICBwdWJsaWMgZnVuYyB0ZXN0NShhdCBpbmRleDogSW50MzIpIC0+IE15R2FtZV9FeGFtcGxlX1Rlc3Q/IHsgbGV0IG8gPSBfYWNjZXNzb3Iub2Zmc2V0KFZUT0ZGU0VULnRlc3Q1LnYpOyByZXR1cm4gbyA9PSAwID8gbmlsIDogX2FjY2Vzc29yLmRpcmVjdFJlYWQob2Y6IE15R2FtZV9FeGFtcGxlX1Rlc3Quc2VsZiwgb2Zmc2V0OiBfYWNjZXNzb3IudmVjdG9yKGF0OiBvKSArIGluZGV4ICogNCkgfQogICBwdWJsaWMgZnVuYyBtdXRhYmxlVGVzdDUoYXQgaW5kZXg6IEludDMyKSAtPiBNeUdhbWVfRXhhbXBsZV9UZXN0X011dGFibGU/IHsgbGV0IG8gPSBfYWNjZXNzb3Iub2Zmc2V0KFZUT0ZGU0VULnRlc3Q1LnYpOyByZXR1cm4gbyA9PSAwID8gbmlsIDogTXlHYW1lX0V4YW1wbGVfVGVzdF9NdXRhYmxlKF9hY2Nlc3Nvci5iYiwgbzogX2FjY2Vzc29yLnZlY3RvcihhdDogbykgKyBpbmRleCAqIDQpIH0KKyAgcHVibGljIHZhciBoYXNWZWN0b3JPZkxvbmdzOiBCb29sIHsgbGV0IG8gPSBfYWNjZXNzb3Iub2Zmc2V0KFZUT0ZGU0VULnZlY3Rvck9mTG9uZ3Mudik7IHJldHVybiBvID09IDAgPyBmYWxzZSA6IHRydWUgfQogICBwdWJsaWMgdmFyIHZlY3Rvck9mTG9uZ3NDb3VudDogSW50MzIgeyBsZXQgbyA9IF9hY2Nlc3Nvci5vZmZzZXQoVlRPRkZTRVQudmVjdG9yT2ZMb25ncy52KTsgcmV0dXJuIG8gPT0gMCA/IDAgOiBfYWNjZXNzb3IudmVjdG9yKGNvdW50OiBvKSB9CiAgIHB1YmxpYyBmdW5jIHZlY3Rvck9mTG9uZ3MoYXQgaW5kZXg6IEludDMyKSAtPiBJbnQ2NCB7IGxldCBvID0gX2FjY2Vzc29yLm9mZnNldChWVE9GRlNFVC52ZWN0b3JPZkxvbmdzLnYpOyByZXR1cm4gbyA9PSAwID8gMCA6IF9hY2Nlc3Nvci5kaXJlY3RSZWFkKG9mOiBJbnQ2NC5zZWxmLCBvZmZzZXQ6IF9hY2Nlc3Nvci52ZWN0b3IoYXQ6IG8pICsgaW5kZXggKiA4KSB9CiAgIHB1YmxpYyB2YXIgdmVjdG9yT2ZMb25nczogW0ludDY0XSB7IHJldHVybiBfYWNjZXNzb3IuZ2V0VmVjdG9yKGF0OiBWVE9GRlNFVC52ZWN0b3JPZkxvbmdzLnYpID8/IFtdIH0KICAgcHVibGljIGZ1bmMgbXV0YXRlKHZlY3Rvck9mTG9uZ3M6IEludDY0LCBhdCBpbmRleDogSW50MzIpIC0+IEJvb2wgeyBsZXQgbyA9IF9hY2Nlc3Nvci5vZmZzZXQoVlRPRkZTRVQudmVjdG9yT2ZMb25ncy52KTsgcmV0dXJuIF9hY2Nlc3Nvci5kaXJlY3RNdXRhdGUodmVjdG9yT2ZMb25ncywgaW5kZXg6IF9hY2Nlc3Nvci52ZWN0b3IoYXQ6IG8pICsgaW5kZXggKiA4KSB9CisgIHB1YmxpYyB2YXIgaGFzVmVjdG9yT2ZEb3VibGVzOiBCb29sIHsgbGV0IG8gPSBfYWNjZXNzb3Iub2Zmc2V0KFZUT0ZGU0VULnZlY3Rvck9mRG91Ymxlcy52KTsgcmV0dXJuIG8gPT0gMCA/IGZhbHNlIDogdHJ1ZSB9CiAgIHB1YmxpYyB2YXIgdmVjdG9yT2ZEb3VibGVzQ291bnQ6IEludDMyIHsgbGV0IG8gPSBfYWNjZXNzb3Iub2Zmc2V0KFZUT0ZGU0VULnZlY3Rvck9mRG91Ymxlcy52KTsgcmV0dXJuIG8gPT0gMCA/IDAgOiBfYWNjZXNzb3IudmVjdG9yKGNvdW50OiBvKSB9CiAgIHB1YmxpYyBmdW5jIHZlY3Rvck9mRG91YmxlcyhhdCBpbmRleDogSW50MzIpIC0+IERvdWJsZSB7IGxldCBvID0gX2FjY2Vzc29yLm9mZnNldChWVE9GRlNFVC52ZWN0b3JPZkRvdWJsZXMudik7IHJldHVybiBvID09IDAgPyAwIDogX2FjY2Vzc29yLmRpcmVjdFJlYWQob2Y6IERvdWJsZS5zZWxmLCBvZmZzZXQ6IF9hY2Nlc3Nvci52ZWN0b3IoYXQ6IG8pICsgaW5kZXggKiA4KSB9CiAgIHB1YmxpYyB2YXIgdmVjdG9yT2ZEb3VibGVzOiBbRG91YmxlXSB7IHJldHVybiBfYWNjZXNzb3IuZ2V0VmVjdG9yKGF0OiBWVE9GRlNFVC52ZWN0b3JPZkRvdWJsZXMudikgPz8gW10gfQogICBwdWJsaWMgZnVuYyBtdXRhdGUodmVjdG9yT2ZEb3VibGVzOiBEb3VibGUsIGF0IGluZGV4OiBJbnQzMikgLT4gQm9vbCB7IGxldCBvID0gX2FjY2Vzc29yLm9mZnNldChWVE9GRlNFVC52ZWN0b3JPZkRvdWJsZXMudik7IHJldHVybiBfYWNjZXNzb3IuZGlyZWN0TXV0YXRlKHZlY3Rvck9mRG91YmxlcywgaW5kZXg6IF9hY2Nlc3Nvci52ZWN0b3IoYXQ6IG8pICsgaW5kZXggKiA4KSB9CiAgIHB1YmxpYyB2YXIgcGFyZW50TmFtZXNwYWNlVGVzdDogTXlHYW1lX0luUGFyZW50TmFtZXNwYWNlPyB7IGxldCBvID0gX2FjY2Vzc29yLm9mZnNldChWVE9GRlNFVC5wYXJlbnROYW1lc3BhY2VUZXN0LnYpOyByZXR1cm4gbyA9PSAwID8gbmlsIDogTXlHYW1lX0luUGFyZW50TmFtZXNwYWNlKF9hY2Nlc3Nvci5iYiwgbzogX2FjY2Vzc29yLmluZGlyZWN0KG8gKyBfYWNjZXNzb3IucG9zdGlvbikpIH0KKyAgcHVibGljIHZhciBoYXNWZWN0b3JPZlJlZmVycmFibGVzOiBCb29sIHsgbGV0IG8gPSBfYWNjZXNzb3Iub2Zmc2V0KFZUT0ZGU0VULnZlY3Rvck9mUmVmZXJyYWJsZXMudik7IHJldHVybiBvID09IDAgPyBmYWxzZSA6IHRydWUgfQogICBwdWJsaWMgdmFyIHZlY3Rvck9mUmVmZXJyYWJsZXNDb3VudDogSW50MzIgeyBsZXQgbyA9IF9hY2Nlc3Nvci5vZmZzZXQoVlRPRkZTRVQudmVjdG9yT2ZSZWZlcnJhYmxlcy52KTsgcmV0dXJuIG8gPT0gMCA/IDAgOiBfYWNjZXNzb3IudmVjdG9yKGNvdW50OiBvKSB9CiAgIHB1YmxpYyBmdW5jIHZlY3Rvck9mUmVmZXJyYWJsZXMoYXQgaW5kZXg6IEludDMyKSAtPiBNeUdhbWVfRXhhbXBsZV9SZWZlcnJhYmxlPyB7IGxldCBvID0gX2FjY2Vzc29yLm9mZnNldChWVE9GRlNFVC52ZWN0b3JPZlJlZmVycmFibGVzLnYpOyByZXR1cm4gbyA9PSAwID8gbmlsIDogTXlHYW1lX0V4YW1wbGVfUmVmZXJyYWJsZShfYWNjZXNzb3IuYmIsIG86IF9hY2Nlc3Nvci5pbmRpcmVjdChfYWNjZXNzb3IudmVjdG9yKGF0OiBvKSArIGluZGV4ICogNCkpIH0KICAgcHVibGljIGZ1bmMgdmVjdG9yT2ZSZWZlcnJhYmxlc0J5KGtleTogVUludDY0KSAtPiBNeUdhbWVfRXhhbXBsZV9SZWZlcnJhYmxlPyB7IGxldCBvID0gX2FjY2Vzc29yLm9mZnNldChWVE9GRlNFVC52ZWN0b3JPZlJlZmVycmFibGVzLnYpOyByZXR1cm4gbyA9PSAwID8gbmlsIDogTXlHYW1lX0V4YW1wbGVfUmVmZXJyYWJsZS5sb29rdXBCeUtleSh2ZWN0b3I6IF9hY2Nlc3Nvci52ZWN0b3IoYXQ6IG8pLCBrZXk6IGtleSwgZmJiOiBfYWNjZXNzb3IuYmIpIH0KICAgcHVibGljIHZhciBzaW5nbGVXZWFrUmVmZXJlbmNlOiBVSW50NjQgeyBsZXQgbyA9IF9hY2Nlc3Nvci5vZmZzZXQoVlRPRkZTRVQuc2luZ2xlV2Vha1JlZmVyZW5jZS52KTsgcmV0dXJuIG8gPT0gMCA/IDAgOiBfYWNjZXNzb3IucmVhZEJ1ZmZlcihvZjogVUludDY0LnNlbGYsIGF0OiBvKSB9CiAgIEBkaXNjYXJkYWJsZVJlc3VsdCBwdWJsaWMgZnVuYyBtdXRhdGUoc2luZ2xlV2Vha1JlZmVyZW5jZTogVUludDY0KSAtPiBCb29sIHtsZXQgbyA9IF9hY2Nlc3Nvci5vZmZzZXQoVlRPRkZTRVQuc2luZ2xlV2Vha1JlZmVyZW5jZS52KTsgIHJldHVybiBfYWNjZXNzb3IubXV0YXRlKHNpbmdsZVdlYWtSZWZlcmVuY2UsIGluZGV4OiBvKSB9CisgIHB1YmxpYyB2YXIgaGFzVmVjdG9yT2ZXZWFrUmVmZXJlbmNlczogQm9vbCB7IGxldCBvID0gX2FjY2Vzc29yLm9mZnNldChWVE9GRlNFVC52ZWN0b3JPZldlYWtSZWZlcmVuY2VzLnYpOyByZXR1cm4gbyA9PSAwID8gZmFsc2UgOiB0cnVlIH0KICAgcHVibGljIHZhciB2ZWN0b3JPZldlYWtSZWZlcmVuY2VzQ291bnQ6IEludDMyIHsgbGV0IG8gPSBfYWNjZXNzb3Iub2Zmc2V0KFZUT0ZGU0VULnZlY3Rvck9mV2Vha1JlZmVyZW5jZXMudik7IHJldHVybiBvID09IDAgPyAwIDogX2FjY2Vzc29yLnZlY3Rvcihjb3VudDogbykgfQogICBwdWJsaWMgZnVuYyB2ZWN0b3JPZldlYWtSZWZlcmVuY2VzKGF0IGluZGV4OiBJbnQzMikgLT4gVUludDY0IHsgbGV0IG8gPSBfYWNjZXNzb3Iub2Zmc2V0KFZUT0ZGU0VULnZlY3Rvck9mV2Vha1JlZmVyZW5jZXMudik7IHJldHVybiBvID09IDAgPyAwIDogX2FjY2Vzc29yLmRpcmVjdFJlYWQob2Y6IFVJbnQ2NC5zZWxmLCBvZmZzZXQ6IF9hY2Nlc3Nvci52ZWN0b3IoYXQ6IG8pICsgaW5kZXggKiA4KSB9CiAgIHB1YmxpYyB2YXIgdmVjdG9yT2ZXZWFrUmVmZXJlbmNlczogW1VJbnQ2NF0geyByZXR1cm4gX2FjY2Vzc29yLmdldFZlY3RvcihhdDogVlRPRkZTRVQudmVjdG9yT2ZXZWFrUmVmZXJlbmNlcy52KSA/PyBbXSB9CiAgIHB1YmxpYyBmdW5jIG11dGF0ZSh2ZWN0b3JPZldlYWtSZWZlcmVuY2VzOiBVSW50NjQsIGF0IGluZGV4OiBJbnQzMikgLT4gQm9vbCB7IGxldCBvID0gX2FjY2Vzc29yLm9mZnNldChWVE9GRlNFVC52ZWN0b3JPZldlYWtSZWZlcmVuY2VzLnYpOyByZXR1cm4gX2FjY2Vzc29yLmRpcmVjdE11dGF0ZSh2ZWN0b3JPZldlYWtSZWZlcmVuY2VzLCBpbmRleDogX2FjY2Vzc29yLnZlY3RvcihhdDogbykgKyBpbmRleCAqIDgpIH0KKyAgcHVibGljIHZhciBoYXNWZWN0b3JPZlN0cm9uZ1JlZmVycmFibGVzOiBCb29sIHsgbGV0IG8gPSBfYWNjZXNzb3Iub2Zmc2V0KFZUT0ZGU0VULnZlY3Rvck9mU3Ryb25nUmVmZXJyYWJsZXMudik7IHJldHVybiBvID09IDAgPyBmYWxzZSA6IHRydWUgfQogICBwdWJsaWMgdmFyIHZlY3Rvck9mU3Ryb25nUmVmZXJyYWJsZXNDb3VudDogSW50MzIgeyBsZXQgbyA9IF9hY2Nlc3Nvci5vZmZzZXQoVlRPRkZTRVQudmVjdG9yT2ZTdHJvbmdSZWZlcnJhYmxlcy52KTsgcmV0dXJuIG8gPT0gMCA/IDAgOiBfYWNjZXNzb3IudmVjdG9yKGNvdW50OiBvKSB9CiAgIHB1YmxpYyBmdW5jIHZlY3Rvck9mU3Ryb25nUmVmZXJyYWJsZXMoYXQgaW5kZXg6IEludDMyKSAtPiBNeUdhbWVfRXhhbXBsZV9SZWZlcnJhYmxlPyB7IGxldCBvID0gX2FjY2Vzc29yLm9mZnNldChWVE9GRlNFVC52ZWN0b3JPZlN0cm9uZ1JlZmVycmFibGVzLnYpOyByZXR1cm4gbyA9PSAwID8gbmlsIDogTXlHYW1lX0V4YW1wbGVfUmVmZXJyYWJsZShfYWNjZXNzb3IuYmIsIG86IF9hY2Nlc3Nvci5pbmRpcmVjdChfYWNjZXNzb3IudmVjdG9yKGF0OiBvKSArIGluZGV4ICogNCkpIH0KICAgcHVibGljIGZ1bmMgdmVjdG9yT2ZTdHJvbmdSZWZlcnJhYmxlc0J5KGtleTogVUludDY0KSAtPiBNeUdhbWVfRXhhbXBsZV9SZWZlcnJhYmxlPyB7IGxldCBvID0gX2FjY2Vzc29yLm9mZnNldChWVE9GRlNFVC52ZWN0b3JPZlN0cm9uZ1JlZmVycmFibGVzLnYpOyByZXR1cm4gbyA9PSAwID8gbmlsIDogTXlHYW1lX0V4YW1wbGVfUmVmZXJyYWJsZS5sb29rdXBCeUtleSh2ZWN0b3I6IF9hY2Nlc3Nvci52ZWN0b3IoYXQ6IG8pLCBrZXk6IGtleSwgZmJiOiBfYWNjZXNzb3IuYmIpIH0KICAgcHVibGljIHZhciBjb093bmluZ1JlZmVyZW5jZTogVUludDY0IHsgbGV0IG8gPSBfYWNjZXNzb3Iub2Zmc2V0KFZUT0ZGU0VULmNvT3duaW5nUmVmZXJlbmNlLnYpOyByZXR1cm4gbyA9PSAwID8gMCA6IF9hY2Nlc3Nvci5yZWFkQnVmZmVyKG9mOiBVSW50NjQuc2VsZiwgYXQ6IG8pIH0KICAgQGRpc2NhcmRhYmxlUmVzdWx0IHB1YmxpYyBmdW5jIG11dGF0ZShjb093bmluZ1JlZmVyZW5jZTogVUludDY0KSAtPiBCb29sIHtsZXQgbyA9IF9hY2Nlc3Nvci5vZmZzZXQoVlRPRkZTRVQuY29Pd25pbmdSZWZlcmVuY2Uudik7ICByZXR1cm4gX2FjY2Vzc29yLm11dGF0ZShjb093bmluZ1JlZmVyZW5jZSwgaW5kZXg6IG8pIH0KKyAgcHVibGljIHZhciBoYXNWZWN0b3JPZkNvT3duaW5nUmVmZXJlbmNlczogQm9vbCB7IGxldCBvID0gX2FjY2Vzc29yLm9mZnNldChWVE9GRlNFVC52ZWN0b3JPZkNvT3duaW5nUmVmZXJlbmNlcy52KTsgcmV0dXJuIG8gPT0gMCA/IGZhbHNlIDogdHJ1ZSB9CiAgIHB1YmxpYyB2YXIgdmVjdG9yT2ZDb093bmluZ1JlZmVyZW5jZXNDb3VudDogSW50MzIgeyBsZXQgbyA9IF9hY2Nlc3Nvci5vZmZzZXQoVlRPRkZTRVQudmVjdG9yT2ZDb093bmluZ1JlZmVyZW5jZXMudik7IHJldHVybiBvID09IDAgPyAwIDogX2FjY2Vzc29yLnZlY3Rvcihjb3VudDogbykgfQogICBwdWJsaWMgZnVuYyB2ZWN0b3JPZkNvT3duaW5nUmVmZXJlbmNlcyhhdCBpbmRleDogSW50MzIpIC0+IFVJbnQ2NCB7IGxldCBvID0gX2FjY2Vzc29yLm9mZnNldChWVE9GRlNFVC52ZWN0b3JPZkNvT3duaW5nUmVmZXJlbmNlcy52KTsgcmV0dXJuIG8gPT0gMCA/IDAgOiBfYWNjZXNzb3IuZGlyZWN0UmVhZChvZjogVUludDY0LnNlbGYsIG9mZnNldDogX2FjY2Vzc29yLnZlY3RvcihhdDogbykgKyBpbmRleCAqIDgpIH0KICAgcHVibGljIHZhciB2ZWN0b3JPZkNvT3duaW5nUmVmZXJlbmNlczogW1VJbnQ2NF0geyByZXR1cm4gX2FjY2Vzc29yLmdldFZlY3RvcihhdDogVlRPRkZTRVQudmVjdG9yT2ZDb093bmluZ1JlZmVyZW5jZXMudikgPz8gW10gfQogICBwdWJsaWMgZnVuYyBtdXRhdGUodmVjdG9yT2ZDb093bmluZ1JlZmVyZW5jZXM6IFVJbnQ2NCwgYXQgaW5kZXg6IEludDMyKSAtPiBCb29sIHsgbGV0IG8gPSBfYWNjZXNzb3Iub2Zmc2V0KFZUT0ZGU0VULnZlY3Rvck9mQ29Pd25pbmdSZWZlcmVuY2VzLnYpOyByZXR1cm4gX2FjY2Vzc29yLmRpcmVjdE11dGF0ZSh2ZWN0b3JPZkNvT3duaW5nUmVmZXJlbmNlcywgaW5kZXg6IF9hY2Nlc3Nvci52ZWN0b3IoYXQ6IG8pICsgaW5kZXggKiA4KSB9CiAgIHB1YmxpYyB2YXIgbm9uT3duaW5nUmVmZXJlbmNlOiBVSW50NjQgeyBsZXQgbyA9IF9hY2Nlc3Nvci5vZmZzZXQoVlRPRkZTRVQubm9uT3duaW5nUmVmZXJlbmNlLnYpOyByZXR1cm4gbyA9PSAwID8gMCA6IF9hY2Nlc3Nvci5yZWFkQnVmZmVyKG9mOiBVSW50NjQuc2VsZiwgYXQ6IG8pIH0KICAgQGRpc2NhcmRhYmxlUmVzdWx0IHB1YmxpYyBmdW5jIG11dGF0ZShub25Pd25pbmdSZWZlcmVuY2U6IFVJbnQ2NCkgLT4gQm9vbCB7bGV0IG8gPSBfYWNjZXNzb3Iub2Zmc2V0KFZUT0ZGU0VULm5vbk93bmluZ1JlZmVyZW5jZS52KTsgIHJldHVybiBfYWNjZXNzb3IubXV0YXRlKG5vbk93bmluZ1JlZmVyZW5jZSwgaW5kZXg6IG8pIH0KKyAgcHVibGljIHZhciBoYXNWZWN0b3JPZk5vbk93bmluZ1JlZmVyZW5jZXM6IEJvb2wgeyBsZXQgbyA9IF9hY2Nlc3Nvci5vZmZzZXQoVlRPRkZTRVQudmVjdG9yT2ZOb25Pd25pbmdSZWZlcmVuY2VzLnYpOyByZXR1cm4gbyA9PSAwID8gZmFsc2UgOiB0cnVlIH0KICAgcHVibGljIHZhciB2ZWN0b3JPZk5vbk93bmluZ1JlZmVyZW5jZXNDb3VudDogSW50MzIgeyBsZXQgbyA9IF9hY2Nlc3Nvci5vZmZzZXQoVlRPRkZTRVQudmVjdG9yT2ZOb25Pd25pbmdSZWZlcmVuY2VzLnYpOyByZXR1cm4gbyA9PSAwID8gMCA6IF9hY2Nlc3Nvci52ZWN0b3IoY291bnQ6IG8pIH0KICAgcHVibGljIGZ1bmMgdmVjdG9yT2ZOb25Pd25pbmdSZWZlcmVuY2VzKGF0IGluZGV4OiBJbnQzMikgLT4gVUludDY0IHsgbGV0IG8gPSBfYWNjZXNzb3Iub2Zmc2V0KFZUT0ZGU0VULnZlY3Rvck9mTm9uT3duaW5nUmVmZXJlbmNlcy52KTsgcmV0dXJuIG8gPT0gMCA/IDAgOiBfYWNjZXNzb3IuZGlyZWN0UmVhZChvZjogVUludDY0LnNlbGYsIG9mZnNldDogX2FjY2Vzc29yLnZlY3RvcihhdDogbykgKyBpbmRleCAqIDgpIH0KICAgcHVibGljIHZhciB2ZWN0b3JPZk5vbk93bmluZ1JlZmVyZW5jZXM6IFtVSW50NjRdIHsgcmV0dXJuIF9hY2Nlc3Nvci5nZXRWZWN0b3IoYXQ6IFZUT0ZGU0VULnZlY3Rvck9mTm9uT3duaW5nUmVmZXJlbmNlcy52KSA/PyBbXSB9CkBAIC0xMjI1LDE0ICsxMzE0LDE3IEBACiAgIHB1YmxpYyBmdW5jIGFueVVuaXF1ZTxUOiBGbGF0YnVmZmVyc0luaXRpYWxpemFibGU+KHR5cGU6IFQuVHlwZSkgLT4gVD8geyBsZXQgbyA9IF9hY2Nlc3Nvci5vZmZzZXQoVlRPRkZTRVQuYW55VW5pcXVlLnYpOyByZXR1cm4gbyA9PSAwID8gbmlsIDogX2FjY2Vzc29yLnVuaW9uKG8pIH0KICAgcHVibGljIHZhciBhbnlBbWJpZ3VvdXNUeXBlOiBNeUdhbWVfRXhhbXBsZV9BbnlBbWJpZ3VvdXNBbGlhc2VzIHsgbGV0IG8gPSBfYWNjZXNzb3Iub2Zmc2V0KFZUT0ZGU0VULmFueUFtYmlndW91c1R5cGUudik7IHJldHVybiBvID09IDAgPyAubm9uZV8gOiBNeUdhbWVfRXhhbXBsZV9BbnlBbWJpZ3VvdXNBbGlhc2VzKHJhd1ZhbHVlOiBfYWNjZXNzb3IucmVhZEJ1ZmZlcihvZjogVUludDguc2VsZiwgYXQ6IG8pKSA/PyAubm9uZV8gfQogICBwdWJsaWMgZnVuYyBhbnlBbWJpZ3VvdXM8VDogRmxhdGJ1ZmZlcnNJbml0aWFsaXphYmxlPih0eXBlOiBULlR5cGUpIC0+IFQ/IHsgbGV0IG8gPSBfYWNjZXNzb3Iub2Zmc2V0KFZUT0ZGU0VULmFueUFtYmlndW91cy52KTsgcmV0dXJuIG8gPT0gMCA/IG5pbCA6IF9hY2Nlc3Nvci51bmlvbihvKSB9CisgIHB1YmxpYyB2YXIgaGFzVmVjdG9yT2ZFbnVtczogQm9vbCB7IGxldCBvID0gX2FjY2Vzc29yLm9mZnNldChWVE9GRlNFVC52ZWN0b3JPZkVudW1zLnYpOyByZXR1cm4gbyA9PSAwID8gZmFsc2UgOiB0cnVlIH0KICAgcHVibGljIHZhciB2ZWN0b3JPZkVudW1zQ291bnQ6IEludDMyIHsgbGV0IG8gPSBfYWNjZXNzb3Iub2Zmc2V0KFZUT0ZGU0VULnZlY3Rvck9mRW51bXMudik7IHJldHVybiBvID09IDAgPyAwIDogX2FjY2Vzc29yLnZlY3Rvcihjb3VudDogbykgfQogICBwdWJsaWMgZnVuYyB2ZWN0b3JPZkVudW1zKGF0IGluZGV4OiBJbnQzMikgLT4gTXlHYW1lX0V4YW1wbGVfQ29sb3I/IHsgbGV0IG8gPSBfYWNjZXNzb3Iub2Zmc2V0KFZUT0ZGU0VULnZlY3Rvck9mRW51bXMudik7IHJldHVybiBvID09IDAgPyBNeUdhbWVfRXhhbXBsZV9Db2xvci5yZWQgOiBNeUdhbWVfRXhhbXBsZV9Db2xvcihyYXdWYWx1ZTogX2FjY2Vzc29yLmRpcmVjdFJlYWQob2Y6IFVJbnQ4LnNlbGYsIG9mZnNldDogX2FjY2Vzc29yLnZlY3RvcihhdDogbykgKyBpbmRleCAqIDEpKSB9CiAgIHB1YmxpYyB2YXIgc2lnbmVkRW51bTogTXlHYW1lX0V4YW1wbGVfUmFjZSB7IGxldCBvID0gX2FjY2Vzc29yLm9mZnNldChWVE9GRlNFVC5zaWduZWRFbnVtLnYpOyByZXR1cm4gbyA9PSAwID8gLm5vbmVfIDogTXlHYW1lX0V4YW1wbGVfUmFjZShyYXdWYWx1ZTogX2FjY2Vzc29yLnJlYWRCdWZmZXIob2Y6IEludDguc2VsZiwgYXQ6IG8pKSA/PyAubm9uZV8gfQogICBAZGlzY2FyZGFibGVSZXN1bHQgcHVibGljIGZ1bmMgbXV0YXRlKHNpZ25lZEVudW06IE15R2FtZV9FeGFtcGxlX1JhY2UpIC0+IEJvb2wge2xldCBvID0gX2FjY2Vzc29yLm9mZnNldChWVE9GRlNFVC5zaWduZWRFbnVtLnYpOyAgcmV0dXJuIF9hY2Nlc3Nvci5tdXRhdGUoc2lnbmVkRW51bS5yYXdWYWx1ZSwgaW5kZXg6IG8pIH0KKyAgcHVibGljIHZhciBoYXNUZXN0cmVxdWlyZWRuZXN0ZWRmbGF0YnVmZmVyOiBCb29sIHsgbGV0IG8gPSBfYWNjZXNzb3Iub2Zmc2V0KFZUT0ZGU0VULnRlc3RyZXF1aXJlZG5lc3RlZGZsYXRidWZmZXIudik7IHJldHVybiBvID09IDAgPyBmYWxzZSA6IHRydWUgfQogICBwdWJsaWMgdmFyIHRlc3RyZXF1aXJlZG5lc3RlZGZsYXRidWZmZXJDb3VudDogSW50MzIgeyBsZXQgbyA9IF9hY2Nlc3Nvci5vZmZzZXQoVlRPRkZTRVQudGVzdHJlcXVpcmVkbmVzdGVkZmxhdGJ1ZmZlci52KTsgcmV0dXJuIG8gPT0gMCA/IDAgOiBfYWNjZXNzb3IudmVjdG9yKGNvdW50OiBvKSB9CiAgIHB1YmxpYyBmdW5jIHRlc3RyZXF1aXJlZG5lc3RlZGZsYXRidWZmZXIoYXQgaW5kZXg6IEludDMyKSAtPiBVSW50OCB7IGxldCBvID0gX2FjY2Vzc29yLm9mZnNldChWVE9GRlNFVC50ZXN0cmVxdWlyZWRuZXN0ZWRmbGF0YnVmZmVyLnYpOyByZXR1cm4gbyA9PSAwID8gMCA6IF9hY2Nlc3Nvci5kaXJlY3RSZWFkKG9mOiBVSW50OC5zZWxmLCBvZmZzZXQ6IF9hY2Nlc3Nvci52ZWN0b3IoYXQ6IG8pICsgaW5kZXggKiAxKSB9CiAgIHB1YmxpYyB2YXIgdGVzdHJlcXVpcmVkbmVzdGVkZmxhdGJ1ZmZlcjogW1VJbnQ4XSB7IHJldHVybiBfYWNjZXNzb3IuZ2V0VmVjdG9yKGF0OiBWVE9GRlNFVC50ZXN0cmVxdWlyZWRuZXN0ZWRmbGF0YnVmZmVyLnYpID8/IFtdIH0KICAgcHVibGljIGZ1bmMgbXV0YXRlKHRlc3RyZXF1aXJlZG5lc3RlZGZsYXRidWZmZXI6IFVJbnQ4LCBhdCBpbmRleDogSW50MzIpIC0+IEJvb2wgeyBsZXQgbyA9IF9hY2Nlc3Nvci5vZmZzZXQoVlRPRkZTRVQudGVzdHJlcXVpcmVkbmVzdGVkZmxhdGJ1ZmZlci52KTsgcmV0dXJuIF9hY2Nlc3Nvci5kaXJlY3RNdXRhdGUodGVzdHJlcXVpcmVkbmVzdGVkZmxhdGJ1ZmZlciwgaW5kZXg6IF9hY2Nlc3Nvci52ZWN0b3IoYXQ6IG8pICsgaW5kZXggKiAxKSB9CisgIHB1YmxpYyB2YXIgaGFzU2NhbGFyS2V5U29ydGVkVGFibGVzOiBCb29sIHsgbGV0IG8gPSBfYWNjZXNzb3Iub2Zmc2V0KFZUT0ZGU0VULnNjYWxhcktleVNvcnRlZFRhYmxlcy52KTsgcmV0dXJuIG8gPT0gMCA/IGZhbHNlIDogdHJ1ZSB9CiAgIHB1YmxpYyB2YXIgc2NhbGFyS2V5U29ydGVkVGFibGVzQ291bnQ6IEludDMyIHsgbGV0IG8gPSBfYWNjZXNzb3Iub2Zmc2V0KFZUT0ZGU0VULnNjYWxhcktleVNvcnRlZFRhYmxlcy52KTsgcmV0dXJuIG8gPT0gMCA/IDAgOiBfYWNjZXNzb3IudmVjdG9yKGNvdW50OiBvKSB9CiAgIHB1YmxpYyBmdW5jIHNjYWxhcktleVNvcnRlZFRhYmxlcyhhdCBpbmRleDogSW50MzIpIC0+IE15R2FtZV9FeGFtcGxlX1N0YXQ/IHsgbGV0IG8gPSBfYWNjZXNzb3Iub2Zmc2V0KFZUT0ZGU0VULnNjYWxhcktleVNvcnRlZFRhYmxlcy52KTsgcmV0dXJuIG8gPT0gMCA/IG5pbCA6IE15R2FtZV9FeGFtcGxlX1N0YXQoX2FjY2Vzc29yLmJiLCBvOiBfYWNjZXNzb3IuaW5kaXJlY3QoX2FjY2Vzc29yLnZlY3RvcihhdDogbykgKyBpbmRleCAqIDQpKSB9CiAgIHB1YmxpYyBmdW5jIHNjYWxhcktleVNvcnRlZFRhYmxlc0J5KGtleTogVUludDE2KSAtPiBNeUdhbWVfRXhhbXBsZV9TdGF0PyB7IGxldCBvID0gX2FjY2Vzc29yLm9mZnNldChWVE9GRlNFVC5zY2FsYXJLZXlTb3J0ZWRUYWJsZXMudik7IHJldHVybiBvID09IDAgPyBuaWwgOiBNeUdhbWVfRXhhbXBsZV9TdGF0Lmxvb2t1cEJ5S2V5KHZlY3RvcjogX2FjY2Vzc29yLnZlY3RvcihhdDogbyksIGtleToga2V5LCBmYmI6IF9hY2Nlc3Nvci5iYikgfQpAQCAtMTMxMiw3ICsxNDA0LDcgQEAKICAgICBwb3M6IE15R2FtZV9FeGFtcGxlX1ZlYzM/ID0gbmlsLAogICAgIG1hbmE6IEludDE2ID0gMTUwLAogICAgIGhwOiBJbnQxNiA9IDEwMCwKLSAgICBuYW1lT2Zmc2V0IG5hbWU6IE9mZnNldCA9IE9mZnNldCgpLAorICAgIG5hbWVPZmZzZXQgbmFtZTogT2Zmc2V0LAogICAgIGludmVudG9yeVZlY3Rvck9mZnNldCBpbnZlbnRvcnk6IE9mZnNldCA9IE9mZnNldCgpLAogICAgIGNvbG9yOiBNeUdhbWVfRXhhbXBsZV9Db2xvciA9IC5ibHVlLAogICAgIHRlc3RUeXBlOiBNeUdhbWVfRXhhbXBsZV9BbnlfID0gLm5vbmVfLApAQCAtMjIwNSwxMSArMjI5NywxMiBAQAogfQogcHVibGljIHN0cnVjdCBNeUdhbWVfRXhhbXBsZV9UeXBlQWxpYXNlczogRmxhdEJ1ZmZlck9iamVjdCwgVmVyaWZpYWJsZSwgT2JqZWN0QVBJUGFja2VyIHsKIAotICBzdGF0aWMgZnVuYyB2YWxpZGF0ZVZlcnNpb24oKSB7IEZsYXRCdWZmZXJzVmVyc2lvbl8yXzBfMCgpIH0KKyAgc3RhdGljIGZ1bmMgdmFsaWRhdGVWZXJzaW9uKCkgeyBGbGF0QnVmZmVyc1ZlcnNpb25fMl8wXzgoKSB9CiAgIHB1YmxpYyB2YXIgX19idWZmZXI6IEJ5dGVCdWZmZXIhIHsgcmV0dXJuIF9hY2Nlc3Nvci5iYiB9CiAgIHByaXZhdGUgdmFyIF9hY2Nlc3NvcjogVGFibGUKIAotICBwdWJsaWMgc3RhdGljIGZ1bmMgZmluaXNoKF8gZmJiOiBpbm91dCBGbGF0QnVmZmVyQnVpbGRlciwgZW5kOiBPZmZzZXQsIHByZWZpeDogQm9vbCA9IGZhbHNlKSB7IGZiYi5maW5pc2gob2Zmc2V0OiBlbmQsIGZpbGVJZDogIk1PTlMiLCBhZGRQcmVmaXg6IHByZWZpeCkgfQorICBwdWJsaWMgc3RhdGljIHZhciBpZDogU3RyaW5nIHsgIk1PTlMiIH0gCisgIHB1YmxpYyBzdGF0aWMgZnVuYyBmaW5pc2goXyBmYmI6IGlub3V0IEZsYXRCdWZmZXJCdWlsZGVyLCBlbmQ6IE9mZnNldCwgcHJlZml4OiBCb29sID0gZmFsc2UpIHsgZmJiLmZpbmlzaChvZmZzZXQ6IGVuZCwgZmlsZUlkOiBNeUdhbWVfRXhhbXBsZV9UeXBlQWxpYXNlcy5pZCwgYWRkUHJlZml4OiBwcmVmaXgpIH0KICAgcHVibGljIHN0YXRpYyBmdW5jIGdldFJvb3RBc1R5cGVBbGlhc2VzKGJiOiBCeXRlQnVmZmVyKSAtPiBNeUdhbWVfRXhhbXBsZV9UeXBlQWxpYXNlcyB7IHJldHVybiBNeUdhbWVfRXhhbXBsZV9UeXBlQWxpYXNlcyhUYWJsZShiYjogYmIsIHBvc2l0aW9uOiBJbnQzMihiYi5yZWFkKGRlZjogVU9mZnNldC5zZWxmLCBwb3NpdGlvbjogYmIucmVhZGVyKSkgKyBJbnQzMihiYi5yZWFkZXIpKSkgfQogCiAgIHByaXZhdGUgaW5pdChfIHQ6IFRhYmxlKSB7IF9hY2Nlc3NvciA9IHQgfQpAQCAtMjI1MiwxMCArMjM0NSwxMiBAQAogICBAZGlzY2FyZGFibGVSZXN1bHQgcHVibGljIGZ1bmMgbXV0YXRlKGYzMjogRmxvYXQzMikgLT4gQm9vbCB7bGV0IG8gPSBfYWNjZXNzb3Iub2Zmc2V0KFZUT0ZGU0VULmYzMi52KTsgIHJldHVybiBfYWNjZXNzb3IubXV0YXRlKGYzMiwgaW5kZXg6IG8pIH0KICAgcHVibGljIHZhciBmNjQ6IERvdWJsZSB7IGxldCBvID0gX2FjY2Vzc29yLm9mZnNldChWVE9GRlNFVC5mNjQudik7IHJldHVybiBvID09IDAgPyAwLjAgOiBfYWNjZXNzb3IucmVhZEJ1ZmZlcihvZjogRG91YmxlLnNlbGYsIGF0OiBvKSB9CiAgIEBkaXNjYXJkYWJsZVJlc3VsdCBwdWJsaWMgZnVuYyBtdXRhdGUoZjY0OiBEb3VibGUpIC0+IEJvb2wge2xldCBvID0gX2FjY2Vzc29yLm9mZnNldChWVE9GRlNFVC5mNjQudik7ICByZXR1cm4gX2FjY2Vzc29yLm11dGF0ZShmNjQsIGluZGV4OiBvKSB9CisgIHB1YmxpYyB2YXIgaGFzVjg6IEJvb2wgeyBsZXQgbyA9IF9hY2Nlc3Nvci5vZmZzZXQoVlRPRkZTRVQudjgudik7IHJldHVybiBvID09IDAgPyBmYWxzZSA6IHRydWUgfQogICBwdWJsaWMgdmFyIHY4Q291bnQ6IEludDMyIHsgbGV0IG8gPSBfYWNjZXNzb3Iub2Zmc2V0KFZUT0ZGU0VULnY4LnYpOyByZXR1cm4gbyA9PSAwID8gMCA6IF9hY2Nlc3Nvci52ZWN0b3IoY291bnQ6IG8pIH0KICAgcHVibGljIGZ1bmMgdjgoYXQgaW5kZXg6IEludDMyKSAtPiBJbnQ4IHsgbGV0IG8gPSBfYWNjZXNzb3Iub2Zmc2V0KFZUT0ZGU0VULnY4LnYpOyByZXR1cm4gbyA9PSAwID8gMCA6IF9hY2Nlc3Nvci5kaXJlY3RSZWFkKG9mOiBJbnQ4LnNlbGYsIG9mZnNldDogX2FjY2Vzc29yLnZlY3RvcihhdDogbykgKyBpbmRleCAqIDEpIH0KICAgcHVibGljIHZhciB2ODogW0ludDhdIHsgcmV0dXJuIF9hY2Nlc3Nvci5nZXRWZWN0b3IoYXQ6IFZUT0ZGU0VULnY4LnYpID8/IFtdIH0KICAgcHVibGljIGZ1bmMgbXV0YXRlKHY4OiBJbnQ4LCBhdCBpbmRleDogSW50MzIpIC0+IEJvb2wgeyBsZXQgbyA9IF9hY2Nlc3Nvci5vZmZzZXQoVlRPRkZTRVQudjgudik7IHJldHVybiBfYWNjZXNzb3IuZGlyZWN0TXV0YXRlKHY4LCBpbmRleDogX2FjY2Vzc29yLnZlY3RvcihhdDogbykgKyBpbmRleCAqIDEpIH0KKyAgcHVibGljIHZhciBoYXNWZjY0OiBCb29sIHsgbGV0IG8gPSBfYWNjZXNzb3Iub2Zmc2V0KFZUT0ZGU0VULnZmNjQudik7IHJldHVybiBvID09IDAgPyBmYWxzZSA6IHRydWUgfQogICBwdWJsaWMgdmFyIHZmNjRDb3VudDogSW50MzIgeyBsZXQgbyA9IF9hY2Nlc3Nvci5vZmZzZXQoVlRPRkZTRVQudmY2NC52KTsgcmV0dXJuIG8gPT0gMCA/IDAgOiBfYWNjZXNzb3IudmVjdG9yKGNvdW50OiBvKSB9CiAgIHB1YmxpYyBmdW5jIHZmNjQoYXQgaW5kZXg6IEludDMyKSAtPiBEb3VibGUgeyBsZXQgbyA9IF9hY2Nlc3Nvci5vZmZzZXQoVlRPRkZTRVQudmY2NC52KTsgcmV0dXJuIG8gPT0gMCA/IDAgOiBfYWNjZXNzb3IuZGlyZWN0UmVhZChvZjogRG91YmxlLnNlbGYsIG9mZnNldDogX2FjY2Vzc29yLnZlY3RvcihhdDogbykgKyBpbmRleCAqIDgpIH0KICAgcHVibGljIHZhciB2ZjY0OiBbRG91YmxlXSB7IHJldHVybiBfYWNjZXNzb3IuZ2V0VmVjdG9yKGF0OiBWVE9GRlNFVC52ZjY0LnYpID8/IFtdIH0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL0ZsYXRCdWZmZXJzLlRlc3QuU3dpZnQvVGVzdHMvRmxhdEJ1ZmZlcnMuVGVzdC5Td2lmdFRlc3RzL21vcmVfZGVmYXVsdHNfZ2VuZXJhdGVkLnN3aWZ0IGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvc3dpZnQvdGVzdHMvVGVzdHMvRmxhdEJ1ZmZlcnMuVGVzdC5Td2lmdFRlc3RzL21vcmVfZGVmYXVsdHNfZ2VuZXJhdGVkLnN3aWZ0CnNpbWlsYXJpdHkgaW5kZXggOTQlCnJlbmFtZSBmcm9tIHRoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL0ZsYXRCdWZmZXJzLlRlc3QuU3dpZnQvVGVzdHMvRmxhdEJ1ZmZlcnMuVGVzdC5Td2lmdFRlc3RzL21vcmVfZGVmYXVsdHNfZ2VuZXJhdGVkLnN3aWZ0CnJlbmFtZSB0byB0aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9zd2lmdC90ZXN0cy9UZXN0cy9GbGF0QnVmZmVycy5UZXN0LlN3aWZ0VGVzdHMvbW9yZV9kZWZhdWx0c19nZW5lcmF0ZWQuc3dpZnQKaW5kZXggM2ViYWEyYS4uZjY2OTJjOSAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvRmxhdEJ1ZmZlcnMuVGVzdC5Td2lmdC9UZXN0cy9GbGF0QnVmZmVycy5UZXN0LlN3aWZ0VGVzdHMvbW9yZV9kZWZhdWx0c19nZW5lcmF0ZWQuc3dpZnQKKysrIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvc3dpZnQvdGVzdHMvVGVzdHMvRmxhdEJ1ZmZlcnMuVGVzdC5Td2lmdFRlc3RzL21vcmVfZGVmYXVsdHNfZ2VuZXJhdGVkLnN3aWZ0CkBAIC0yOSw3ICsyOSw3IEBACiAKIHB1YmxpYyBzdHJ1Y3QgTW9yZURlZmF1bHRzOiBGbGF0QnVmZmVyT2JqZWN0LCBWZXJpZmlhYmxlLCBPYmplY3RBUElQYWNrZXIgewogCi0gIHN0YXRpYyBmdW5jIHZhbGlkYXRlVmVyc2lvbigpIHsgRmxhdEJ1ZmZlcnNWZXJzaW9uXzJfMF8wKCkgfQorICBzdGF0aWMgZnVuYyB2YWxpZGF0ZVZlcnNpb24oKSB7IEZsYXRCdWZmZXJzVmVyc2lvbl8yXzBfOCgpIH0KICAgcHVibGljIHZhciBfX2J1ZmZlcjogQnl0ZUJ1ZmZlciEgeyByZXR1cm4gX2FjY2Vzc29yLmJiIH0KICAgcHJpdmF0ZSB2YXIgX2FjY2Vzc29yOiBUYWJsZQogCkBAIC00OSw5ICs0OSwxMSBAQAogICAgIHZhciBwOiBWT2Zmc2V0IHsgc2VsZi5yYXdWYWx1ZSB9CiAgIH0KIAorICBwdWJsaWMgdmFyIGhhc0ludHM6IEJvb2wgeyBsZXQgbyA9IF9hY2Nlc3Nvci5vZmZzZXQoVlRPRkZTRVQuaW50cy52KTsgcmV0dXJuIG8gPT0gMCA/IGZhbHNlIDogdHJ1ZSB9CiAgIHB1YmxpYyB2YXIgaW50c0NvdW50OiBJbnQzMiB7IGxldCBvID0gX2FjY2Vzc29yLm9mZnNldChWVE9GRlNFVC5pbnRzLnYpOyByZXR1cm4gbyA9PSAwID8gMCA6IF9hY2Nlc3Nvci52ZWN0b3IoY291bnQ6IG8pIH0KICAgcHVibGljIGZ1bmMgaW50cyhhdCBpbmRleDogSW50MzIpIC0+IEludDMyIHsgbGV0IG8gPSBfYWNjZXNzb3Iub2Zmc2V0KFZUT0ZGU0VULmludHMudik7IHJldHVybiBvID09IDAgPyAwIDogX2FjY2Vzc29yLmRpcmVjdFJlYWQob2Y6IEludDMyLnNlbGYsIG9mZnNldDogX2FjY2Vzc29yLnZlY3RvcihhdDogbykgKyBpbmRleCAqIDQpIH0KICAgcHVibGljIHZhciBpbnRzOiBbSW50MzJdIHsgcmV0dXJuIF9hY2Nlc3Nvci5nZXRWZWN0b3IoYXQ6IFZUT0ZGU0VULmludHMudikgPz8gW10gfQorICBwdWJsaWMgdmFyIGhhc0Zsb2F0czogQm9vbCB7IGxldCBvID0gX2FjY2Vzc29yLm9mZnNldChWVE9GRlNFVC5mbG9hdHMudik7IHJldHVybiBvID09IDAgPyBmYWxzZSA6IHRydWUgfQogICBwdWJsaWMgdmFyIGZsb2F0c0NvdW50OiBJbnQzMiB7IGxldCBvID0gX2FjY2Vzc29yLm9mZnNldChWVE9GRlNFVC5mbG9hdHMudik7IHJldHVybiBvID09IDAgPyAwIDogX2FjY2Vzc29yLnZlY3Rvcihjb3VudDogbykgfQogICBwdWJsaWMgZnVuYyBmbG9hdHMoYXQgaW5kZXg6IEludDMyKSAtPiBGbG9hdDMyIHsgbGV0IG8gPSBfYWNjZXNzb3Iub2Zmc2V0KFZUT0ZGU0VULmZsb2F0cy52KTsgcmV0dXJuIG8gPT0gMCA/IDAgOiBfYWNjZXNzb3IuZGlyZWN0UmVhZChvZjogRmxvYXQzMi5zZWxmLCBvZmZzZXQ6IF9hY2Nlc3Nvci52ZWN0b3IoYXQ6IG8pICsgaW5kZXggKiA0KSB9CiAgIHB1YmxpYyB2YXIgZmxvYXRzOiBbRmxvYXQzMl0geyByZXR1cm4gX2FjY2Vzc29yLmdldFZlY3RvcihhdDogVlRPRkZTRVQuZmxvYXRzLnYpID8/IFtdIH0KQEAgLTU5LDggKzYxLDEwIEBACiAgIHB1YmxpYyB2YXIgZW1wdHlTdHJpbmdTZWdtZW50QXJyYXk6IFtVSW50OF0/IHsgcmV0dXJuIF9hY2Nlc3Nvci5nZXRWZWN0b3IoYXQ6IFZUT0ZGU0VULmVtcHR5U3RyaW5nLnYpIH0KICAgcHVibGljIHZhciBzb21lU3RyaW5nOiBTdHJpbmc/IHsgbGV0IG8gPSBfYWNjZXNzb3Iub2Zmc2V0KFZUT0ZGU0VULnNvbWVTdHJpbmcudik7IHJldHVybiBvID09IDAgPyAic29tZSIgOiBfYWNjZXNzb3Iuc3RyaW5nKGF0OiBvKSB9CiAgIHB1YmxpYyB2YXIgc29tZVN0cmluZ1NlZ21lbnRBcnJheTogW1VJbnQ4XT8geyByZXR1cm4gX2FjY2Vzc29yLmdldFZlY3RvcihhdDogVlRPRkZTRVQuc29tZVN0cmluZy52KSB9CisgIHB1YmxpYyB2YXIgaGFzQWJjczogQm9vbCB7IGxldCBvID0gX2FjY2Vzc29yLm9mZnNldChWVE9GRlNFVC5hYmNzLnYpOyByZXR1cm4gbyA9PSAwID8gZmFsc2UgOiB0cnVlIH0KICAgcHVibGljIHZhciBhYmNzQ291bnQ6IEludDMyIHsgbGV0IG8gPSBfYWNjZXNzb3Iub2Zmc2V0KFZUT0ZGU0VULmFiY3Mudik7IHJldHVybiBvID09IDAgPyAwIDogX2FjY2Vzc29yLnZlY3Rvcihjb3VudDogbykgfQogICBwdWJsaWMgZnVuYyBhYmNzKGF0IGluZGV4OiBJbnQzMikgLT4gQUJDPyB7IGxldCBvID0gX2FjY2Vzc29yLm9mZnNldChWVE9GRlNFVC5hYmNzLnYpOyByZXR1cm4gbyA9PSAwID8gQUJDLmEgOiBBQkMocmF3VmFsdWU6IF9hY2Nlc3Nvci5kaXJlY3RSZWFkKG9mOiBJbnQzMi5zZWxmLCBvZmZzZXQ6IF9hY2Nlc3Nvci52ZWN0b3IoYXQ6IG8pICsgaW5kZXggKiA0KSkgfQorICBwdWJsaWMgdmFyIGhhc0Jvb2xzOiBCb29sIHsgbGV0IG8gPSBfYWNjZXNzb3Iub2Zmc2V0KFZUT0ZGU0VULmJvb2xzLnYpOyByZXR1cm4gbyA9PSAwID8gZmFsc2UgOiB0cnVlIH0KICAgcHVibGljIHZhciBib29sc0NvdW50OiBJbnQzMiB7IGxldCBvID0gX2FjY2Vzc29yLm9mZnNldChWVE9GRlNFVC5ib29scy52KTsgcmV0dXJuIG8gPT0gMCA/IDAgOiBfYWNjZXNzb3IudmVjdG9yKGNvdW50OiBvKSB9CiAgIHB1YmxpYyBmdW5jIGJvb2xzKGF0IGluZGV4OiBJbnQzMikgLT4gQm9vbCB7IGxldCBvID0gX2FjY2Vzc29yLm9mZnNldChWVE9GRlNFVC5ib29scy52KTsgcmV0dXJuIG8gPT0gMCA/IHRydWUgOiBfYWNjZXNzb3IuZGlyZWN0UmVhZChvZjogQm9vbC5zZWxmLCBvZmZzZXQ6IF9hY2Nlc3Nvci52ZWN0b3IoYXQ6IG8pICsgaW5kZXggKiAxKSB9CiAgIHB1YmxpYyB2YXIgYm9vbHM6IFtCb29sXSB7IHJldHVybiBfYWNjZXNzb3IuZ2V0VmVjdG9yKGF0OiBWVE9GRlNFVC5ib29scy52KSA/PyBbXSB9CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9GbGF0QnVmZmVycy5UZXN0LlN3aWZ0L1Rlc3RzL0ZsYXRCdWZmZXJzLlRlc3QuU3dpZnRUZXN0cy9vcHRpb25hbF9zY2FsYXJzX2dlbmVyYXRlZC5zd2lmdCBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL3N3aWZ0L3Rlc3RzL1Rlc3RzL0ZsYXRCdWZmZXJzLlRlc3QuU3dpZnRUZXN0cy9vcHRpb25hbF9zY2FsYXJzX2dlbmVyYXRlZC5zd2lmdApzaW1pbGFyaXR5IGluZGV4IDk5JQpyZW5hbWUgZnJvbSB0aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9GbGF0QnVmZmVycy5UZXN0LlN3aWZ0L1Rlc3RzL0ZsYXRCdWZmZXJzLlRlc3QuU3dpZnRUZXN0cy9vcHRpb25hbF9zY2FsYXJzX2dlbmVyYXRlZC5zd2lmdApyZW5hbWUgdG8gdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvc3dpZnQvdGVzdHMvVGVzdHMvRmxhdEJ1ZmZlcnMuVGVzdC5Td2lmdFRlc3RzL29wdGlvbmFsX3NjYWxhcnNfZ2VuZXJhdGVkLnN3aWZ0CmluZGV4IDBmNDI3YzguLjU2NWJiZDQgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL0ZsYXRCdWZmZXJzLlRlc3QuU3dpZnQvVGVzdHMvRmxhdEJ1ZmZlcnMuVGVzdC5Td2lmdFRlc3RzL29wdGlvbmFsX3NjYWxhcnNfZ2VuZXJhdGVkLnN3aWZ0CisrKyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL3N3aWZ0L3Rlc3RzL1Rlc3RzL0ZsYXRCdWZmZXJzLlRlc3QuU3dpZnRUZXN0cy9vcHRpb25hbF9zY2FsYXJzX2dlbmVyYXRlZC5zd2lmdApAQCAtMjksMTEgKzI5LDEyIEBACiAKIHB1YmxpYyBzdHJ1Y3Qgb3B0aW9uYWxfc2NhbGFyc19TY2FsYXJTdHVmZjogRmxhdEJ1ZmZlck9iamVjdCwgVmVyaWZpYWJsZSB7CiAKLSAgc3RhdGljIGZ1bmMgdmFsaWRhdGVWZXJzaW9uKCkgeyBGbGF0QnVmZmVyc1ZlcnNpb25fMl8wXzAoKSB9CisgIHN0YXRpYyBmdW5jIHZhbGlkYXRlVmVyc2lvbigpIHsgRmxhdEJ1ZmZlcnNWZXJzaW9uXzJfMF84KCkgfQogICBwdWJsaWMgdmFyIF9fYnVmZmVyOiBCeXRlQnVmZmVyISB7IHJldHVybiBfYWNjZXNzb3IuYmIgfQogICBwcml2YXRlIHZhciBfYWNjZXNzb3I6IFRhYmxlCiAKLSAgcHVibGljIHN0YXRpYyBmdW5jIGZpbmlzaChfIGZiYjogaW5vdXQgRmxhdEJ1ZmZlckJ1aWxkZXIsIGVuZDogT2Zmc2V0LCBwcmVmaXg6IEJvb2wgPSBmYWxzZSkgeyBmYmIuZmluaXNoKG9mZnNldDogZW5kLCBmaWxlSWQ6ICJOVUxMIiwgYWRkUHJlZml4OiBwcmVmaXgpIH0KKyAgcHVibGljIHN0YXRpYyB2YXIgaWQ6IFN0cmluZyB7ICJOVUxMIiB9IAorICBwdWJsaWMgc3RhdGljIGZ1bmMgZmluaXNoKF8gZmJiOiBpbm91dCBGbGF0QnVmZmVyQnVpbGRlciwgZW5kOiBPZmZzZXQsIHByZWZpeDogQm9vbCA9IGZhbHNlKSB7IGZiYi5maW5pc2gob2Zmc2V0OiBlbmQsIGZpbGVJZDogb3B0aW9uYWxfc2NhbGFyc19TY2FsYXJTdHVmZi5pZCwgYWRkUHJlZml4OiBwcmVmaXgpIH0KICAgcHVibGljIHN0YXRpYyBmdW5jIGdldFJvb3RBc1NjYWxhclN0dWZmKGJiOiBCeXRlQnVmZmVyKSAtPiBvcHRpb25hbF9zY2FsYXJzX1NjYWxhclN0dWZmIHsgcmV0dXJuIG9wdGlvbmFsX3NjYWxhcnNfU2NhbGFyU3R1ZmYoVGFibGUoYmI6IGJiLCBwb3NpdGlvbjogSW50MzIoYmIucmVhZChkZWY6IFVPZmZzZXQuc2VsZiwgcG9zaXRpb246IGJiLnJlYWRlcikpICsgSW50MzIoYmIucmVhZGVyKSkpIH0KIAogICBwcml2YXRlIGluaXQoXyB0OiBUYWJsZSkgeyBfYWNjZXNzb3IgPSB0IH0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL0ZsYXRCdWZmZXJzLlRlc3QuU3dpZnQvVGVzdHMvRmxhdEJ1ZmZlcnMuVGVzdC5Td2lmdFRlc3RzL3VuaW9uX3ZlY3Rvcl9nZW5lcmF0ZWQuc3dpZnQgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9zd2lmdC90ZXN0cy9UZXN0cy9GbGF0QnVmZmVycy5UZXN0LlN3aWZ0VGVzdHMvdW5pb25fdmVjdG9yX2dlbmVyYXRlZC5zd2lmdApzaW1pbGFyaXR5IGluZGV4IDk2JQpyZW5hbWUgZnJvbSB0aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9GbGF0QnVmZmVycy5UZXN0LlN3aWZ0L1Rlc3RzL0ZsYXRCdWZmZXJzLlRlc3QuU3dpZnRUZXN0cy91bmlvbl92ZWN0b3JfZ2VuZXJhdGVkLnN3aWZ0CnJlbmFtZSB0byB0aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9zd2lmdC90ZXN0cy9UZXN0cy9GbGF0QnVmZmVycy5UZXN0LlN3aWZ0VGVzdHMvdW5pb25fdmVjdG9yX2dlbmVyYXRlZC5zd2lmdAppbmRleCA1OWVkMDA1Li5jZTNkMzdmIDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9GbGF0QnVmZmVycy5UZXN0LlN3aWZ0L1Rlc3RzL0ZsYXRCdWZmZXJzLlRlc3QuU3dpZnRUZXN0cy91bmlvbl92ZWN0b3JfZ2VuZXJhdGVkLnN3aWZ0CisrKyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL3N3aWZ0L3Rlc3RzL1Rlc3RzL0ZsYXRCdWZmZXJzLlRlc3QuU3dpZnRUZXN0cy91bmlvbl92ZWN0b3JfZ2VuZXJhdGVkLnN3aWZ0CkBAIC0xMjAsNyArMTIwLDcgQEAKIH0KIHB1YmxpYyBzdHJ1Y3QgUmFwdW56ZWw6IE5hdGl2ZVN0cnVjdCwgVmVyaWZpYWJsZSwgRmxhdGJ1ZmZlcnNJbml0aWFsaXphYmxlLCBOYXRpdmVPYmplY3QgewogCi0gIHN0YXRpYyBmdW5jIHZhbGlkYXRlVmVyc2lvbigpIHsgRmxhdEJ1ZmZlcnNWZXJzaW9uXzJfMF8wKCkgfQorICBzdGF0aWMgZnVuYyB2YWxpZGF0ZVZlcnNpb24oKSB7IEZsYXRCdWZmZXJzVmVyc2lvbl8yXzBfOCgpIH0KIAogICBwcml2YXRlIHZhciBfaGFpckxlbmd0aDogSW50MzIKIApAQCAtMTYzLDcgKzE2Myw3IEBACiAKIHB1YmxpYyBzdHJ1Y3QgUmFwdW56ZWxfTXV0YWJsZTogRmxhdEJ1ZmZlck9iamVjdCB7CiAKLSAgc3RhdGljIGZ1bmMgdmFsaWRhdGVWZXJzaW9uKCkgeyBGbGF0QnVmZmVyc1ZlcnNpb25fMl8wXzAoKSB9CisgIHN0YXRpYyBmdW5jIHZhbGlkYXRlVmVyc2lvbigpIHsgRmxhdEJ1ZmZlcnNWZXJzaW9uXzJfMF84KCkgfQogICBwdWJsaWMgdmFyIF9fYnVmZmVyOiBCeXRlQnVmZmVyISB7IHJldHVybiBfYWNjZXNzb3IuYmIgfQogICBwcml2YXRlIHZhciBfYWNjZXNzb3I6IFN0cnVjdAogCkBAIC0xODgsNyArMTg4LDcgQEAKIAogcHVibGljIHN0cnVjdCBCb29rUmVhZGVyOiBOYXRpdmVTdHJ1Y3QsIFZlcmlmaWFibGUsIEZsYXRidWZmZXJzSW5pdGlhbGl6YWJsZSwgTmF0aXZlT2JqZWN0IHsKIAotICBzdGF0aWMgZnVuYyB2YWxpZGF0ZVZlcnNpb24oKSB7IEZsYXRCdWZmZXJzVmVyc2lvbl8yXzBfMCgpIH0KKyAgc3RhdGljIGZ1bmMgdmFsaWRhdGVWZXJzaW9uKCkgeyBGbGF0QnVmZmVyc1ZlcnNpb25fMl8wXzgoKSB9CiAKICAgcHJpdmF0ZSB2YXIgX2Jvb2tzUmVhZDogSW50MzIKIApAQCAtMjMxLDcgKzIzMSw3IEBACiAKIHB1YmxpYyBzdHJ1Y3QgQm9va1JlYWRlcl9NdXRhYmxlOiBGbGF0QnVmZmVyT2JqZWN0IHsKIAotICBzdGF0aWMgZnVuYyB2YWxpZGF0ZVZlcnNpb24oKSB7IEZsYXRCdWZmZXJzVmVyc2lvbl8yXzBfMCgpIH0KKyAgc3RhdGljIGZ1bmMgdmFsaWRhdGVWZXJzaW9uKCkgeyBGbGF0QnVmZmVyc1ZlcnNpb25fMl8wXzgoKSB9CiAgIHB1YmxpYyB2YXIgX19idWZmZXI6IEJ5dGVCdWZmZXIhIHsgcmV0dXJuIF9hY2Nlc3Nvci5iYiB9CiAgIHByaXZhdGUgdmFyIF9hY2Nlc3NvcjogU3RydWN0CiAKQEAgLTI1Niw3ICsyNTYsNyBAQAogCiBwdWJsaWMgc3RydWN0IEZhbGxpbmdUdWI6IE5hdGl2ZVN0cnVjdCwgVmVyaWZpYWJsZSwgRmxhdGJ1ZmZlcnNJbml0aWFsaXphYmxlLCBOYXRpdmVPYmplY3QgewogCi0gIHN0YXRpYyBmdW5jIHZhbGlkYXRlVmVyc2lvbigpIHsgRmxhdEJ1ZmZlcnNWZXJzaW9uXzJfMF8wKCkgfQorICBzdGF0aWMgZnVuYyB2YWxpZGF0ZVZlcnNpb24oKSB7IEZsYXRCdWZmZXJzVmVyc2lvbl8yXzBfOCgpIH0KIAogICBwcml2YXRlIHZhciBfd2VpZ2h0OiBJbnQzMgogCkBAIC0yOTksNyArMjk5LDcgQEAKIAogcHVibGljIHN0cnVjdCBGYWxsaW5nVHViX011dGFibGU6IEZsYXRCdWZmZXJPYmplY3QgewogCi0gIHN0YXRpYyBmdW5jIHZhbGlkYXRlVmVyc2lvbigpIHsgRmxhdEJ1ZmZlcnNWZXJzaW9uXzJfMF8wKCkgfQorICBzdGF0aWMgZnVuYyB2YWxpZGF0ZVZlcnNpb24oKSB7IEZsYXRCdWZmZXJzVmVyc2lvbl8yXzBfOCgpIH0KICAgcHVibGljIHZhciBfX2J1ZmZlcjogQnl0ZUJ1ZmZlciEgeyByZXR1cm4gX2FjY2Vzc29yLmJiIH0KICAgcHJpdmF0ZSB2YXIgX2FjY2Vzc29yOiBTdHJ1Y3QKIApAQCAtMzI0LDExICszMjQsMTIgQEAKIAogcHVibGljIHN0cnVjdCBBdHRhY2tlcjogRmxhdEJ1ZmZlck9iamVjdCwgVmVyaWZpYWJsZSwgT2JqZWN0QVBJUGFja2VyIHsKIAotICBzdGF0aWMgZnVuYyB2YWxpZGF0ZVZlcnNpb24oKSB7IEZsYXRCdWZmZXJzVmVyc2lvbl8yXzBfMCgpIH0KKyAgc3RhdGljIGZ1bmMgdmFsaWRhdGVWZXJzaW9uKCkgeyBGbGF0QnVmZmVyc1ZlcnNpb25fMl8wXzgoKSB9CiAgIHB1YmxpYyB2YXIgX19idWZmZXI6IEJ5dGVCdWZmZXIhIHsgcmV0dXJuIF9hY2Nlc3Nvci5iYiB9CiAgIHByaXZhdGUgdmFyIF9hY2Nlc3NvcjogVGFibGUKIAotICBwdWJsaWMgc3RhdGljIGZ1bmMgZmluaXNoKF8gZmJiOiBpbm91dCBGbGF0QnVmZmVyQnVpbGRlciwgZW5kOiBPZmZzZXQsIHByZWZpeDogQm9vbCA9IGZhbHNlKSB7IGZiYi5maW5pc2gob2Zmc2V0OiBlbmQsIGZpbGVJZDogIk1PVkkiLCBhZGRQcmVmaXg6IHByZWZpeCkgfQorICBwdWJsaWMgc3RhdGljIHZhciBpZDogU3RyaW5nIHsgIk1PVkkiIH0gCisgIHB1YmxpYyBzdGF0aWMgZnVuYyBmaW5pc2goXyBmYmI6IGlub3V0IEZsYXRCdWZmZXJCdWlsZGVyLCBlbmQ6IE9mZnNldCwgcHJlZml4OiBCb29sID0gZmFsc2UpIHsgZmJiLmZpbmlzaChvZmZzZXQ6IGVuZCwgZmlsZUlkOiBBdHRhY2tlci5pZCwgYWRkUHJlZml4OiBwcmVmaXgpIH0KICAgcHVibGljIHN0YXRpYyBmdW5jIGdldFJvb3RBc0F0dGFja2VyKGJiOiBCeXRlQnVmZmVyKSAtPiBBdHRhY2tlciB7IHJldHVybiBBdHRhY2tlcihUYWJsZShiYjogYmIsIHBvc2l0aW9uOiBJbnQzMihiYi5yZWFkKGRlZjogVU9mZnNldC5zZWxmLCBwb3NpdGlvbjogYmIucmVhZGVyKSkgKyBJbnQzMihiYi5yZWFkZXIpKSkgfQogCiAgIHByaXZhdGUgaW5pdChfIHQ6IFRhYmxlKSB7IF9hY2Nlc3NvciA9IHQgfQpAQCAtNDA2LDExICs0MDcsMTIgQEAKIH0KIHB1YmxpYyBzdHJ1Y3QgSGFuZEZhbjogRmxhdEJ1ZmZlck9iamVjdCwgVmVyaWZpYWJsZSwgT2JqZWN0QVBJUGFja2VyIHsKIAotICBzdGF0aWMgZnVuYyB2YWxpZGF0ZVZlcnNpb24oKSB7IEZsYXRCdWZmZXJzVmVyc2lvbl8yXzBfMCgpIH0KKyAgc3RhdGljIGZ1bmMgdmFsaWRhdGVWZXJzaW9uKCkgeyBGbGF0QnVmZmVyc1ZlcnNpb25fMl8wXzgoKSB9CiAgIHB1YmxpYyB2YXIgX19idWZmZXI6IEJ5dGVCdWZmZXIhIHsgcmV0dXJuIF9hY2Nlc3Nvci5iYiB9CiAgIHByaXZhdGUgdmFyIF9hY2Nlc3NvcjogVGFibGUKIAotICBwdWJsaWMgc3RhdGljIGZ1bmMgZmluaXNoKF8gZmJiOiBpbm91dCBGbGF0QnVmZmVyQnVpbGRlciwgZW5kOiBPZmZzZXQsIHByZWZpeDogQm9vbCA9IGZhbHNlKSB7IGZiYi5maW5pc2gob2Zmc2V0OiBlbmQsIGZpbGVJZDogIk1PVkkiLCBhZGRQcmVmaXg6IHByZWZpeCkgfQorICBwdWJsaWMgc3RhdGljIHZhciBpZDogU3RyaW5nIHsgIk1PVkkiIH0gCisgIHB1YmxpYyBzdGF0aWMgZnVuYyBmaW5pc2goXyBmYmI6IGlub3V0IEZsYXRCdWZmZXJCdWlsZGVyLCBlbmQ6IE9mZnNldCwgcHJlZml4OiBCb29sID0gZmFsc2UpIHsgZmJiLmZpbmlzaChvZmZzZXQ6IGVuZCwgZmlsZUlkOiBIYW5kRmFuLmlkLCBhZGRQcmVmaXg6IHByZWZpeCkgfQogICBwdWJsaWMgc3RhdGljIGZ1bmMgZ2V0Um9vdEFzSGFuZEZhbihiYjogQnl0ZUJ1ZmZlcikgLT4gSGFuZEZhbiB7IHJldHVybiBIYW5kRmFuKFRhYmxlKGJiOiBiYiwgcG9zaXRpb246IEludDMyKGJiLnJlYWQoZGVmOiBVT2Zmc2V0LnNlbGYsIHBvc2l0aW9uOiBiYi5yZWFkZXIpKSArIEludDMyKGJiLnJlYWRlcikpKSB9CiAKICAgcHJpdmF0ZSBpbml0KF8gdDogVGFibGUpIHsgX2FjY2Vzc29yID0gdCB9CkBAIC00ODgsMTEgKzQ5MCwxMiBAQAogfQogcHVibGljIHN0cnVjdCBNb3ZpZTogRmxhdEJ1ZmZlck9iamVjdCwgVmVyaWZpYWJsZSwgT2JqZWN0QVBJUGFja2VyIHsKIAotICBzdGF0aWMgZnVuYyB2YWxpZGF0ZVZlcnNpb24oKSB7IEZsYXRCdWZmZXJzVmVyc2lvbl8yXzBfMCgpIH0KKyAgc3RhdGljIGZ1bmMgdmFsaWRhdGVWZXJzaW9uKCkgeyBGbGF0QnVmZmVyc1ZlcnNpb25fMl8wXzgoKSB9CiAgIHB1YmxpYyB2YXIgX19idWZmZXI6IEJ5dGVCdWZmZXIhIHsgcmV0dXJuIF9hY2Nlc3Nvci5iYiB9CiAgIHByaXZhdGUgdmFyIF9hY2Nlc3NvcjogVGFibGUKIAotICBwdWJsaWMgc3RhdGljIGZ1bmMgZmluaXNoKF8gZmJiOiBpbm91dCBGbGF0QnVmZmVyQnVpbGRlciwgZW5kOiBPZmZzZXQsIHByZWZpeDogQm9vbCA9IGZhbHNlKSB7IGZiYi5maW5pc2gob2Zmc2V0OiBlbmQsIGZpbGVJZDogIk1PVkkiLCBhZGRQcmVmaXg6IHByZWZpeCkgfQorICBwdWJsaWMgc3RhdGljIHZhciBpZDogU3RyaW5nIHsgIk1PVkkiIH0gCisgIHB1YmxpYyBzdGF0aWMgZnVuYyBmaW5pc2goXyBmYmI6IGlub3V0IEZsYXRCdWZmZXJCdWlsZGVyLCBlbmQ6IE9mZnNldCwgcHJlZml4OiBCb29sID0gZmFsc2UpIHsgZmJiLmZpbmlzaChvZmZzZXQ6IGVuZCwgZmlsZUlkOiBNb3ZpZS5pZCwgYWRkUHJlZml4OiBwcmVmaXgpIH0KICAgcHVibGljIHN0YXRpYyBmdW5jIGdldFJvb3RBc01vdmllKGJiOiBCeXRlQnVmZmVyKSAtPiBNb3ZpZSB7IHJldHVybiBNb3ZpZShUYWJsZShiYjogYmIsIHBvc2l0aW9uOiBJbnQzMihiYi5yZWFkKGRlZjogVU9mZnNldC5zZWxmLCBwb3NpdGlvbjogYmIucmVhZGVyKSkgKyBJbnQzMihiYi5yZWFkZXIpKSkgfQogCiAgIHByaXZhdGUgaW5pdChfIHQ6IFRhYmxlKSB7IF9hY2Nlc3NvciA9IHQgfQpAQCAtNTA5LDggKzUxMiwxMCBAQAogCiAgIHB1YmxpYyB2YXIgbWFpbkNoYXJhY3RlclR5cGU6IENoYXJhY3RlciB7IGxldCBvID0gX2FjY2Vzc29yLm9mZnNldChWVE9GRlNFVC5tYWluQ2hhcmFjdGVyVHlwZS52KTsgcmV0dXJuIG8gPT0gMCA/IC5ub25lXyA6IENoYXJhY3RlcihyYXdWYWx1ZTogX2FjY2Vzc29yLnJlYWRCdWZmZXIob2Y6IFVJbnQ4LnNlbGYsIGF0OiBvKSkgPz8gLm5vbmVfIH0KICAgcHVibGljIGZ1bmMgbWFpbkNoYXJhY3RlcjxUOiBGbGF0YnVmZmVyc0luaXRpYWxpemFibGU+KHR5cGU6IFQuVHlwZSkgLT4gVD8geyBsZXQgbyA9IF9hY2Nlc3Nvci5vZmZzZXQoVlRPRkZTRVQubWFpbkNoYXJhY3Rlci52KTsgcmV0dXJuIG8gPT0gMCA/IG5pbCA6IF9hY2Nlc3Nvci51bmlvbihvKSB9CisgIHB1YmxpYyB2YXIgaGFzQ2hhcmFjdGVyc1R5cGU6IEJvb2wgeyBsZXQgbyA9IF9hY2Nlc3Nvci5vZmZzZXQoVlRPRkZTRVQuY2hhcmFjdGVyc1R5cGUudik7IHJldHVybiBvID09IDAgPyBmYWxzZSA6IHRydWUgfQogICBwdWJsaWMgdmFyIGNoYXJhY3RlcnNUeXBlQ291bnQ6IEludDMyIHsgbGV0IG8gPSBfYWNjZXNzb3Iub2Zmc2V0KFZUT0ZGU0VULmNoYXJhY3RlcnNUeXBlLnYpOyByZXR1cm4gbyA9PSAwID8gMCA6IF9hY2Nlc3Nvci52ZWN0b3IoY291bnQ6IG8pIH0KICAgcHVibGljIGZ1bmMgY2hhcmFjdGVyc1R5cGUoYXQgaW5kZXg6IEludDMyKSAtPiBDaGFyYWN0ZXI/IHsgbGV0IG8gPSBfYWNjZXNzb3Iub2Zmc2V0KFZUT0ZGU0VULmNoYXJhY3RlcnNUeXBlLnYpOyByZXR1cm4gbyA9PSAwID8gQ2hhcmFjdGVyLm5vbmVfIDogQ2hhcmFjdGVyKHJhd1ZhbHVlOiBfYWNjZXNzb3IuZGlyZWN0UmVhZChvZjogVUludDguc2VsZiwgb2Zmc2V0OiBfYWNjZXNzb3IudmVjdG9yKGF0OiBvKSArIGluZGV4ICogMSkpIH0KKyAgcHVibGljIHZhciBoYXNDaGFyYWN0ZXJzOiBCb29sIHsgbGV0IG8gPSBfYWNjZXNzb3Iub2Zmc2V0KFZUT0ZGU0VULmNoYXJhY3RlcnMudik7IHJldHVybiBvID09IDAgPyBmYWxzZSA6IHRydWUgfQogICBwdWJsaWMgdmFyIGNoYXJhY3RlcnNDb3VudDogSW50MzIgeyBsZXQgbyA9IF9hY2Nlc3Nvci5vZmZzZXQoVlRPRkZTRVQuY2hhcmFjdGVycy52KTsgcmV0dXJuIG8gPT0gMCA/IDAgOiBfYWNjZXNzb3IudmVjdG9yKGNvdW50OiBvKSB9CiAgIHB1YmxpYyBmdW5jIGNoYXJhY3RlcnM8VDogRmxhdGJ1ZmZlcnNJbml0aWFsaXphYmxlPihhdCBpbmRleDogSW50MzIsIHR5cGU6IFQuVHlwZSkgLT4gVD8geyBsZXQgbyA9IF9hY2Nlc3Nvci5vZmZzZXQoVlRPRkZTRVQuY2hhcmFjdGVycy52KTsgcmV0dXJuIG8gPT0gMCA/IG5pbCA6IF9hY2Nlc3Nvci5kaXJlY3RVbmlvbihfYWNjZXNzb3IudmVjdG9yKGF0OiBvKSArIGluZGV4ICogNCkgfQogICBwdWJsaWMgc3RhdGljIGZ1bmMgc3RhcnRNb3ZpZShfIGZiYjogaW5vdXQgRmxhdEJ1ZmZlckJ1aWxkZXIpIC0+IFVPZmZzZXQgeyBmYmIuc3RhcnRUYWJsZSh3aXRoOiA0KSB9CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9zd2lmdC90ZXN0cy9UZXN0cy9GbGF0QnVmZmVycy5UZXN0LlN3aWZ0VGVzdHMvdmVjdG9yX2hhc190ZXN0X2dlbmVyYXRlZC5zd2lmdCBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL3N3aWZ0L3Rlc3RzL1Rlc3RzL0ZsYXRCdWZmZXJzLlRlc3QuU3dpZnRUZXN0cy92ZWN0b3JfaGFzX3Rlc3RfZ2VuZXJhdGVkLnN3aWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRjMjkyZjMKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9zd2lmdC90ZXN0cy9UZXN0cy9GbGF0QnVmZmVycy5UZXN0LlN3aWZ0VGVzdHMvdmVjdG9yX2hhc190ZXN0X2dlbmVyYXRlZC5zd2lmdApAQCAtMCwwICsxLDg1IEBACisvLyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBieSB0aGUgRmxhdEJ1ZmZlcnMgY29tcGlsZXIsIGRvIG5vdCBtb2RpZnkKKy8vIHN3aWZ0bGludDpkaXNhYmxlIGFsbAorLy8gc3dpZnRmb3JtYXQ6ZGlzYWJsZSBhbGwKKworaW1wb3J0IEZsYXRCdWZmZXJzCisKK3B1YmxpYyBzdHJ1Y3QgU3dpZnRfVGVzdHNfVmVjdG9yczogRmxhdEJ1ZmZlck9iamVjdCwgVmVyaWZpYWJsZSB7CisKKyAgc3RhdGljIGZ1bmMgdmFsaWRhdGVWZXJzaW9uKCkgeyBGbGF0QnVmZmVyc1ZlcnNpb25fMl8wXzgoKSB9CisgIHB1YmxpYyB2YXIgX19idWZmZXI6IEJ5dGVCdWZmZXIhIHsgcmV0dXJuIF9hY2Nlc3Nvci5iYiB9CisgIHByaXZhdGUgdmFyIF9hY2Nlc3NvcjogVGFibGUKKworICBwdWJsaWMgc3RhdGljIGZ1bmMgZ2V0Um9vdEFzVmVjdG9ycyhiYjogQnl0ZUJ1ZmZlcikgLT4gU3dpZnRfVGVzdHNfVmVjdG9ycyB7IHJldHVybiBTd2lmdF9UZXN0c19WZWN0b3JzKFRhYmxlKGJiOiBiYiwgcG9zaXRpb246IEludDMyKGJiLnJlYWQoZGVmOiBVT2Zmc2V0LnNlbGYsIHBvc2l0aW9uOiBiYi5yZWFkZXIpKSArIEludDMyKGJiLnJlYWRlcikpKSB9CisKKyAgcHJpdmF0ZSBpbml0KF8gdDogVGFibGUpIHsgX2FjY2Vzc29yID0gdCB9CisgIHB1YmxpYyBpbml0KF8gYmI6IEJ5dGVCdWZmZXIsIG86IEludDMyKSB7IF9hY2Nlc3NvciA9IFRhYmxlKGJiOiBiYiwgcG9zaXRpb246IG8pIH0KKworICBwcml2YXRlIGVudW0gVlRPRkZTRVQ6IFZPZmZzZXQgeworICAgIGNhc2Ugbm9uZV8gPSA0CisgICAgY2FzZSBlbXB0eSA9IDYKKyAgICBjYXNlIGFycmF5ID0gOAorICAgIHZhciB2OiBJbnQzMiB7IEludDMyKHNlbGYucmF3VmFsdWUpIH0KKyAgICB2YXIgcDogVk9mZnNldCB7IHNlbGYucmF3VmFsdWUgfQorICB9CisKKyAgcHVibGljIHZhciBoYXNOb25lOiBCb29sIHsgbGV0IG8gPSBfYWNjZXNzb3Iub2Zmc2V0KFZUT0ZGU0VULm5vbmVfLnYpOyByZXR1cm4gbyA9PSAwID8gZmFsc2UgOiB0cnVlIH0KKyAgcHVibGljIHZhciBub25lX0NvdW50OiBJbnQzMiB7IGxldCBvID0gX2FjY2Vzc29yLm9mZnNldChWVE9GRlNFVC5ub25lXy52KTsgcmV0dXJuIG8gPT0gMCA/IDAgOiBfYWNjZXNzb3IudmVjdG9yKGNvdW50OiBvKSB9CisgIHB1YmxpYyBmdW5jIG5vbmVfKGF0IGluZGV4OiBJbnQzMikgLT4gVUludDY0IHsgbGV0IG8gPSBfYWNjZXNzb3Iub2Zmc2V0KFZUT0ZGU0VULm5vbmVfLnYpOyByZXR1cm4gbyA9PSAwID8gMCA6IF9hY2Nlc3Nvci5kaXJlY3RSZWFkKG9mOiBVSW50NjQuc2VsZiwgb2Zmc2V0OiBfYWNjZXNzb3IudmVjdG9yKGF0OiBvKSArIGluZGV4ICogOCkgfQorICBwdWJsaWMgdmFyIG5vbmVfOiBbVUludDY0XSB7IHJldHVybiBfYWNjZXNzb3IuZ2V0VmVjdG9yKGF0OiBWVE9GRlNFVC5ub25lXy52KSA/PyBbXSB9CisgIHB1YmxpYyB2YXIgaGFzRW1wdHk6IEJvb2wgeyBsZXQgbyA9IF9hY2Nlc3Nvci5vZmZzZXQoVlRPRkZTRVQuZW1wdHkudik7IHJldHVybiBvID09IDAgPyBmYWxzZSA6IHRydWUgfQorICBwdWJsaWMgdmFyIGVtcHR5Q291bnQ6IEludDMyIHsgbGV0IG8gPSBfYWNjZXNzb3Iub2Zmc2V0KFZUT0ZGU0VULmVtcHR5LnYpOyByZXR1cm4gbyA9PSAwID8gMCA6IF9hY2Nlc3Nvci52ZWN0b3IoY291bnQ6IG8pIH0KKyAgcHVibGljIGZ1bmMgZW1wdHkoYXQgaW5kZXg6IEludDMyKSAtPiBVSW50NjQgeyBsZXQgbyA9IF9hY2Nlc3Nvci5vZmZzZXQoVlRPRkZTRVQuZW1wdHkudik7IHJldHVybiBvID09IDAgPyAwIDogX2FjY2Vzc29yLmRpcmVjdFJlYWQob2Y6IFVJbnQ2NC5zZWxmLCBvZmZzZXQ6IF9hY2Nlc3Nvci52ZWN0b3IoYXQ6IG8pICsgaW5kZXggKiA4KSB9CisgIHB1YmxpYyB2YXIgZW1wdHk6IFtVSW50NjRdIHsgcmV0dXJuIF9hY2Nlc3Nvci5nZXRWZWN0b3IoYXQ6IFZUT0ZGU0VULmVtcHR5LnYpID8/IFtdIH0KKyAgcHVibGljIHZhciBoYXNBcnJheTogQm9vbCB7IGxldCBvID0gX2FjY2Vzc29yLm9mZnNldChWVE9GRlNFVC5hcnJheS52KTsgcmV0dXJuIG8gPT0gMCA/IGZhbHNlIDogdHJ1ZSB9CisgIHB1YmxpYyB2YXIgYXJyYXlDb3VudDogSW50MzIgeyBsZXQgbyA9IF9hY2Nlc3Nvci5vZmZzZXQoVlRPRkZTRVQuYXJyYXkudik7IHJldHVybiBvID09IDAgPyAwIDogX2FjY2Vzc29yLnZlY3Rvcihjb3VudDogbykgfQorICBwdWJsaWMgZnVuYyBhcnJheShhdCBpbmRleDogSW50MzIpIC0+IFVJbnQ2NCB7IGxldCBvID0gX2FjY2Vzc29yLm9mZnNldChWVE9GRlNFVC5hcnJheS52KTsgcmV0dXJuIG8gPT0gMCA/IDAgOiBfYWNjZXNzb3IuZGlyZWN0UmVhZChvZjogVUludDY0LnNlbGYsIG9mZnNldDogX2FjY2Vzc29yLnZlY3RvcihhdDogbykgKyBpbmRleCAqIDgpIH0KKyAgcHVibGljIHZhciBhcnJheTogW1VJbnQ2NF0geyByZXR1cm4gX2FjY2Vzc29yLmdldFZlY3RvcihhdDogVlRPRkZTRVQuYXJyYXkudikgPz8gW10gfQorICBwdWJsaWMgc3RhdGljIGZ1bmMgc3RhcnRWZWN0b3JzKF8gZmJiOiBpbm91dCBGbGF0QnVmZmVyQnVpbGRlcikgLT4gVU9mZnNldCB7IGZiYi5zdGFydFRhYmxlKHdpdGg6IDMpIH0KKyAgcHVibGljIHN0YXRpYyBmdW5jIGFkZFZlY3Rvck9mKG5vbmVfOiBPZmZzZXQsIF8gZmJiOiBpbm91dCBGbGF0QnVmZmVyQnVpbGRlcikgeyBmYmIuYWRkKG9mZnNldDogbm9uZV8sIGF0OiBWVE9GRlNFVC5ub25lXy5wKSB9CisgIHB1YmxpYyBzdGF0aWMgZnVuYyBhZGRWZWN0b3JPZihlbXB0eTogT2Zmc2V0LCBfIGZiYjogaW5vdXQgRmxhdEJ1ZmZlckJ1aWxkZXIpIHsgZmJiLmFkZChvZmZzZXQ6IGVtcHR5LCBhdDogVlRPRkZTRVQuZW1wdHkucCkgfQorICBwdWJsaWMgc3RhdGljIGZ1bmMgYWRkVmVjdG9yT2YoYXJyYXk6IE9mZnNldCwgXyBmYmI6IGlub3V0IEZsYXRCdWZmZXJCdWlsZGVyKSB7IGZiYi5hZGQob2Zmc2V0OiBhcnJheSwgYXQ6IFZUT0ZGU0VULmFycmF5LnApIH0KKyAgcHVibGljIHN0YXRpYyBmdW5jIGVuZFZlY3RvcnMoXyBmYmI6IGlub3V0IEZsYXRCdWZmZXJCdWlsZGVyLCBzdGFydDogVU9mZnNldCkgLT4gT2Zmc2V0IHsgbGV0IGVuZCA9IE9mZnNldChvZmZzZXQ6IGZiYi5lbmRUYWJsZShhdDogc3RhcnQpKTsgcmV0dXJuIGVuZCB9CisgIHB1YmxpYyBzdGF0aWMgZnVuYyBjcmVhdGVWZWN0b3JzKAorICAgIF8gZmJiOiBpbm91dCBGbGF0QnVmZmVyQnVpbGRlciwKKyAgICBub25lX1ZlY3Rvck9mZnNldCBub25lXzogT2Zmc2V0ID0gT2Zmc2V0KCksCisgICAgZW1wdHlWZWN0b3JPZmZzZXQgZW1wdHk6IE9mZnNldCA9IE9mZnNldCgpLAorICAgIGFycmF5VmVjdG9yT2Zmc2V0IGFycmF5OiBPZmZzZXQgPSBPZmZzZXQoKQorICApIC0+IE9mZnNldCB7CisgICAgbGV0IF9fc3RhcnQgPSBTd2lmdF9UZXN0c19WZWN0b3JzLnN0YXJ0VmVjdG9ycygmZmJiKQorICAgIFN3aWZ0X1Rlc3RzX1ZlY3RvcnMuYWRkVmVjdG9yT2Yobm9uZV86IG5vbmVfLCAmZmJiKQorICAgIFN3aWZ0X1Rlc3RzX1ZlY3RvcnMuYWRkVmVjdG9yT2YoZW1wdHk6IGVtcHR5LCAmZmJiKQorICAgIFN3aWZ0X1Rlc3RzX1ZlY3RvcnMuYWRkVmVjdG9yT2YoYXJyYXk6IGFycmF5LCAmZmJiKQorICAgIHJldHVybiBTd2lmdF9UZXN0c19WZWN0b3JzLmVuZFZlY3RvcnMoJmZiYiwgc3RhcnQ6IF9fc3RhcnQpCisgIH0KKworICBwdWJsaWMgc3RhdGljIGZ1bmMgdmVyaWZ5PFQ+KF8gdmVyaWZpZXI6IGlub3V0IFZlcmlmaWVyLCBhdCBwb3NpdGlvbjogSW50LCBvZiB0eXBlOiBULlR5cGUpIHRocm93cyB3aGVyZSBUOiBWZXJpZmlhYmxlIHsKKyAgICB2YXIgX3YgPSB0cnkgdmVyaWZpZXIudmlzaXRUYWJsZShhdDogcG9zaXRpb24pCisgICAgdHJ5IF92LnZpc2l0KGZpZWxkOiBWVE9GRlNFVC5ub25lXy5wLCBmaWVsZE5hbWU6ICJub25lXyIsIHJlcXVpcmVkOiBmYWxzZSwgdHlwZTogRm9yd2FyZE9mZnNldDxWZWN0b3I8VUludDY0LCBVSW50NjQ+Pi5zZWxmKQorICAgIHRyeSBfdi52aXNpdChmaWVsZDogVlRPRkZTRVQuZW1wdHkucCwgZmllbGROYW1lOiAiZW1wdHkiLCByZXF1aXJlZDogZmFsc2UsIHR5cGU6IEZvcndhcmRPZmZzZXQ8VmVjdG9yPFVJbnQ2NCwgVUludDY0Pj4uc2VsZikKKyAgICB0cnkgX3YudmlzaXQoZmllbGQ6IFZUT0ZGU0VULmFycmF5LnAsIGZpZWxkTmFtZTogImFycmF5IiwgcmVxdWlyZWQ6IGZhbHNlLCB0eXBlOiBGb3J3YXJkT2Zmc2V0PFZlY3RvcjxVSW50NjQsIFVJbnQ2ND4+LnNlbGYpCisgICAgX3YuZmluaXNoKCkKKyAgfQorfQorCitleHRlbnNpb24gU3dpZnRfVGVzdHNfVmVjdG9yczogRW5jb2RhYmxlIHsKKworICBlbnVtIENvZGluZ0tleXM6IFN0cmluZywgQ29kaW5nS2V5IHsKKyAgICBjYXNlIG5vbmVfID0gIm5vbmUiCisgICAgY2FzZSBlbXB0eSA9ICJlbXB0eSIKKyAgICBjYXNlIGFycmF5ID0gImFycmF5IgorICB9CisgIHB1YmxpYyBmdW5jIGVuY29kZSh0byBlbmNvZGVyOiBFbmNvZGVyKSB0aHJvd3MgeworICAgIHZhciBjb250YWluZXIgPSBlbmNvZGVyLmNvbnRhaW5lcihrZXllZEJ5OiBDb2RpbmdLZXlzLnNlbGYpCisgICAgaWYgbm9uZV9Db3VudCA+IDAgeworICAgICAgdHJ5IGNvbnRhaW5lci5lbmNvZGVJZlByZXNlbnQobm9uZV8sIGZvcktleTogLm5vbmVfKQorICAgIH0KKyAgICBpZiBlbXB0eUNvdW50ID4gMCB7CisgICAgICB0cnkgY29udGFpbmVyLmVuY29kZUlmUHJlc2VudChlbXB0eSwgZm9yS2V5OiAuZW1wdHkpCisgICAgfQorICAgIGlmIGFycmF5Q291bnQgPiAwIHsKKyAgICAgIHRyeSBjb250YWluZXIuZW5jb2RlSWZQcmVzZW50KGFycmF5LCBmb3JLZXk6IC5hcnJheSkKKyAgICB9CisgIH0KK30KKwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvRmxhdEJ1ZmZlcnMuVGVzdC5Td2lmdC9UZXN0cy9MaW51eE1haW4uc3dpZnQgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9zd2lmdC90ZXN0cy9UZXN0cy9MaW51eE1haW4uc3dpZnQKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHRoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL0ZsYXRCdWZmZXJzLlRlc3QuU3dpZnQvVGVzdHMvTGludXhNYWluLnN3aWZ0CnJlbmFtZSB0byB0aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9zd2lmdC90ZXN0cy9UZXN0cy9MaW51eE1haW4uc3dpZnQKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL0ZsYXRCdWZmZXJzLlRlc3QuU3dpZnQvbW9uc3RlcmRhdGFfdGVzdC5tb24gYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9zd2lmdC90ZXN0cy9tb25zdGVyZGF0YV90ZXN0Lm1vbgpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvRmxhdEJ1ZmZlcnMuVGVzdC5Td2lmdC9tb25zdGVyZGF0YV90ZXN0Lm1vbgpyZW5hbWUgdG8gdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvc3dpZnQvdGVzdHMvbW9uc3RlcmRhdGFfdGVzdC5tb24KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvdGVzdC5jcHAgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy90ZXN0LmNwcAppbmRleCA3NTZjMGVhLi43ZTA1YzA4IDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy90ZXN0LmNwcAorKysgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy90ZXN0LmNwcApAQCAtMTMsMzAgKzEzLDQ0IEBACiAgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLworI2luY2x1ZGUgPHN0ZGludC5oPgorCiAjaW5jbHVkZSA8Y21hdGg+CisjaW5jbHVkZSA8bWVtb3J5PgogI2luY2x1ZGUgPHN0cmluZz4KIAorI2luY2x1ZGUgImV2b2x1dGlvbl90ZXN0LmgiCiAjaW5jbHVkZSAiZmxhdGJ1ZmZlcnMvZmxhdGJ1ZmZlcnMuaCIKICNpbmNsdWRlICJmbGF0YnVmZmVycy9pZGwuaCIKICNpbmNsdWRlICJmbGF0YnVmZmVycy9taW5pcmVmbGVjdC5oIgogI2luY2x1ZGUgImZsYXRidWZmZXJzL3JlZ2lzdHJ5LmgiCiAjaW5jbHVkZSAiZmxhdGJ1ZmZlcnMvdXRpbC5oIgorI2luY2x1ZGUgImZ1enpfdGVzdC5oIgorI2luY2x1ZGUgImpzb25fdGVzdC5oIgorI2luY2x1ZGUgIm1vbnN0ZXJfdGVzdC5oIgogI2luY2x1ZGUgIm1vbnN0ZXJfdGVzdF9nZW5lcmF0ZWQuaCIKLSNpbmNsdWRlICJuYW1lc3BhY2VfdGVzdC9uYW1lc3BhY2VfdGVzdDFfZ2VuZXJhdGVkLmgiCi0jaW5jbHVkZSAibmFtZXNwYWNlX3Rlc3QvbmFtZXNwYWNlX3Rlc3QyX2dlbmVyYXRlZC5oIgotI2luY2x1ZGUgIm9wdGlvbmFsX3NjYWxhcnNfZ2VuZXJhdGVkLmgiCisjaW5jbHVkZSAib3B0aW9uYWxfc2NhbGFyc190ZXN0LmgiCisjaW5jbHVkZSAibmF0aXZlX2lubGluZV90YWJsZV90ZXN0X2dlbmVyYXRlZC5oIgorI2luY2x1ZGUgInBhcnNlcl90ZXN0LmgiCisjaW5jbHVkZSAicHJvdG9fdGVzdC5oIgorI2luY2x1ZGUgInJlZmxlY3Rpb25fdGVzdC5oIgogI2luY2x1ZGUgInVuaW9uX3ZlY3Rvci91bmlvbl92ZWN0b3JfZ2VuZXJhdGVkLmgiCiAjaWYgIWRlZmluZWQoX01TQ19WRVIpIHx8IF9NU0NfVkVSID49IDE3MDAKICMgIGluY2x1ZGUgImFycmF5c190ZXN0X2dlbmVyYXRlZC5oIgotIyAgaW5jbHVkZSAiZXZvbHV0aW9uX3Rlc3QvZXZvbHV0aW9uX3YxX2dlbmVyYXRlZC5oIgotIyAgaW5jbHVkZSAiZXZvbHV0aW9uX3Rlc3QvZXZvbHV0aW9uX3YyX2dlbmVyYXRlZC5oIgotIyAgaW5jbHVkZSAibW9uc3Rlcl9leHRyYV9nZW5lcmF0ZWQuaCIKICNlbmRpZgogCi0jaW5jbHVkZSAiZmxhdGJ1ZmZlcnMvZmxleGJ1ZmZlcnMuaCIKKyNpbmNsdWRlICJmbGV4YnVmZmVyc190ZXN0LmgiCisjaW5jbHVkZSAiaXNfcXVpZXRfbmFuLmgiCiAjaW5jbHVkZSAibW9uc3Rlcl90ZXN0X2JmYnNfZ2VuZXJhdGVkLmgiICAvLyBHZW5lcmF0ZWQgdXNpbmcgLS1iZmJzLWNvbW1lbnRzIC0tYmZicy1idWlsdGlucyAtLWNwcCAtLWJmYnMtZ2VuLWVtYmVkCiAjaW5jbHVkZSAibmF0aXZlX3R5cGVfdGVzdF9nZW5lcmF0ZWQuaCIKICNpbmNsdWRlICJ0ZXN0X2Fzc2VydC5oIgorI2luY2x1ZGUgInV0aWxfdGVzdC5oIgorCit2b2lkIEZsYXRCdWZmZXJCdWlsZGVyVGVzdCgpOworCituYW1lc3BhY2UgZmxhdGJ1ZmZlcnMgeworbmFtZXNwYWNlIHRlc3RzIHsKK25hbWVzcGFjZSB7CiAKIC8vIGNsYW5nLWZvcm1hdCBvZmYKIC8vIENoZWNrIHRoYXQgY2hhciogYW5kIHVpbnQ4X3QqIGFyZSBpbnRlcm9wZXJhYmxlIHR5cGVzLgpAQCAtNTMsNTczICs2NywxMiBAQAogI2VuZGlmCiAvLyBjbGFuZy1mb3JtYXQgb24KIAotLy8gU2hvcnRjdXRzIGZvciB0aGUgaW5maW5pdHkuCi1zdGF0aWMgY29uc3QgYXV0byBpbmZpbml0eV9mID0gc3RkOjpudW1lcmljX2xpbWl0czxmbG9hdD46OmluZmluaXR5KCk7Ci1zdGF0aWMgY29uc3QgYXV0byBpbmZpbml0eV9kID0gc3RkOjpudW1lcmljX2xpbWl0czxkb3VibGU+OjppbmZpbml0eSgpOwotCiB1c2luZyBuYW1lc3BhY2UgTXlHYW1lOjpFeGFtcGxlOwogCi12b2lkIEZsYXRCdWZmZXJCdWlsZGVyVGVzdCgpOwotCi0vLyBJbmNsdWRlIHNpbXBsZSByYW5kb20gbnVtYmVyIGdlbmVyYXRvciB0byBlbnN1cmUgcmVzdWx0cyB3aWxsIGJlIHRoZQotLy8gc2FtZSBjcm9zcyBwbGF0Zm9ybS4KLS8vIGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvUGFyayVFMiU4MCU5M01pbGxlcl9yYW5kb21fbnVtYmVyX2dlbmVyYXRvcgotdWludDMyX3QgbGNnX3NlZWQgPSA0ODI3MTsKLXVpbnQzMl90IGxjZ19yYW5kKCkgewotICByZXR1cm4gbGNnX3NlZWQgPQotICAgICAgICAgICAgIChzdGF0aWNfY2FzdDx1aW50NjRfdD4obGNnX3NlZWQpICogMjc5NDcwMjczVUwpICUgNDI5NDk2NzI5MVVMOwotfQotdm9pZCBsY2dfcmVzZXQoKSB7IGxjZ19zZWVkID0gNDgyNzE7IH0KLQotc3RkOjpzdHJpbmcgdGVzdF9kYXRhX3BhdGggPQotI2lmZGVmIEJBWkVMX1RFU1RfREFUQV9QQVRICi0gICAgIi4uL2NvbV9naXRodWJfZ29vZ2xlX2ZsYXRidWZmZXJzL3Rlc3RzLyI7Ci0jZWxzZQotICAgICJ0ZXN0cy8iOwotI2VuZGlmCi0KLS8vIGV4YW1wbGUgb2YgaG93IHRvIGJ1aWxkIHVwIGEgc2VyaWFsaXplZCBidWZmZXIgYWxnb3JpdGhtaWNhbGx5OgotZmxhdGJ1ZmZlcnM6OkRldGFjaGVkQnVmZmVyIENyZWF0ZUZsYXRCdWZmZXJUZXN0KHN0ZDo6c3RyaW5nICZidWZmZXIpIHsKLSAgZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyIGJ1aWxkZXI7Ci0KLSAgYXV0byB2ZWMgPSBWZWMzKDEsIDIsIDMsIDAsIENvbG9yX1JlZCwgVGVzdCgxMCwgMjApKTsKLQotICBhdXRvIG5hbWUgPSBidWlsZGVyLkNyZWF0ZVN0cmluZygiTXlNb25zdGVyIik7Ci0KLSAgdW5zaWduZWQgY2hhciBpbnZfZGF0YVtdID0geyAwLCAxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5IH07Ci0gIGF1dG8gaW52ZW50b3J5ID0gYnVpbGRlci5DcmVhdGVWZWN0b3IoaW52X2RhdGEsIDEwKTsKLQotICAvLyBBbHRlcm5hdGl2ZWx5LCBjcmVhdGUgdGhlIHZlY3RvciBmaXJzdCwgYW5kIGZpbGwgaW4gZGF0YSBsYXRlcjoKLSAgLy8gdW5zaWduZWQgY2hhciAqaW52X2J1ZiA9IG51bGxwdHI7Ci0gIC8vIGF1dG8gaW52ZW50b3J5ID0gYnVpbGRlci5DcmVhdGVVbmluaXRpYWxpemVkVmVjdG9yPHVuc2lnbmVkIGNoYXI+KAotICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTAsICZpbnZfYnVmKTsKLSAgLy8gbWVtY3B5KGludl9idWYsIGludl9kYXRhLCAxMCk7Ci0KLSAgVGVzdCB0ZXN0c1tdID0geyBUZXN0KDEwLCAyMCksIFRlc3QoMzAsIDQwKSB9OwotICBhdXRvIHRlc3R2ID0gYnVpbGRlci5DcmVhdGVWZWN0b3JPZlN0cnVjdHModGVzdHMsIDIpOwotCi0gIC8vIENyZWF0ZSBhIHZlY3RvciBvZiBzdHJ1Y3R1cmVzIGZyb20gYSBsYW1iZGEuCi0gIGF1dG8gdGVzdHYyID0gYnVpbGRlci5DcmVhdGVWZWN0b3JPZlN0cnVjdHM8VGVzdD4oCi0gICAgICAyLCBbJl0oc2l6ZV90IGksIFRlc3QgKnMpIC0+IHZvaWQgeyAqcyA9IHRlc3RzW2ldOyB9KTsKLQotICAvLyBjcmVhdGUgbW9uc3RlciB3aXRoIHZlcnkgZmV3IGZpZWxkcyBzZXQ6Ci0gIC8vIChzYW1lIGZ1bmN0aW9uYWxpdHkgYXMgQ3JlYXRlTW9uc3RlciBiZWxvdywgYnV0IHNldHMgZmllbGRzIG1hbnVhbGx5KQotICBmbGF0YnVmZmVyczo6T2Zmc2V0PE1vbnN0ZXI+IG1sb2NzWzNdOwotICBhdXRvIGZyZWQgPSBidWlsZGVyLkNyZWF0ZVN0cmluZygiRnJlZCIpOwotICBhdXRvIGJhcm5leSA9IGJ1aWxkZXIuQ3JlYXRlU3RyaW5nKCJCYXJuZXkiKTsKLSAgYXV0byB3aWxtYSA9IGJ1aWxkZXIuQ3JlYXRlU3RyaW5nKCJXaWxtYSIpOwotICBNb25zdGVyQnVpbGRlciBtYjEoYnVpbGRlcik7Ci0gIG1iMS5hZGRfbmFtZShmcmVkKTsKLSAgbWxvY3NbMF0gPSBtYjEuRmluaXNoKCk7Ci0gIE1vbnN0ZXJCdWlsZGVyIG1iMihidWlsZGVyKTsKLSAgbWIyLmFkZF9uYW1lKGJhcm5leSk7Ci0gIG1iMi5hZGRfaHAoMTAwMCk7Ci0gIG1sb2NzWzFdID0gbWIyLkZpbmlzaCgpOwotICBNb25zdGVyQnVpbGRlciBtYjMoYnVpbGRlcik7Ci0gIG1iMy5hZGRfbmFtZSh3aWxtYSk7Ci0gIG1sb2NzWzJdID0gbWIzLkZpbmlzaCgpOwotCi0gIC8vIENyZWF0ZSBhbiBhcnJheSBvZiBzdHJpbmdzLiBBbHNvIHRlc3Qgc3RyaW5nIHBvb2xpbmcsIGFuZCBsYW1iZGFzLgotICBhdXRvIHZlY29mc3RyaW5ncyA9Ci0gICAgICBidWlsZGVyLkNyZWF0ZVZlY3RvcjxmbGF0YnVmZmVyczo6T2Zmc2V0PGZsYXRidWZmZXJzOjpTdHJpbmc+PigKLSAgICAgICAgICA0LAotICAgICAgICAgIFtdKHNpemVfdCBpLCBmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgKmIpCi0gICAgICAgICAgICAgIC0+IGZsYXRidWZmZXJzOjpPZmZzZXQ8ZmxhdGJ1ZmZlcnM6OlN0cmluZz4gewotICAgICAgICAgICAgc3RhdGljIGNvbnN0IGNoYXIgKm5hbWVzW10gPSB7ICJib2IiLCAiZnJlZCIsICJib2IiLCAiZnJlZCIgfTsKLSAgICAgICAgICAgIHJldHVybiBiLT5DcmVhdGVTaGFyZWRTdHJpbmcobmFtZXNbaV0pOwotICAgICAgICAgIH0sCi0gICAgICAgICAgJmJ1aWxkZXIpOwotCi0gIC8vIENyZWF0aW5nIHZlY3RvcnMgb2Ygc3RyaW5ncyBpbiBvbmUgY29udmVuaWVudCBjYWxsLgotICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gbmFtZXMyOwotICBuYW1lczIucHVzaF9iYWNrKCJqYW5lIik7Ci0gIG5hbWVzMi5wdXNoX2JhY2soIm1hcnkiKTsKLSAgYXV0byB2ZWNvZnN0cmluZ3MyID0gYnVpbGRlci5DcmVhdGVWZWN0b3JPZlN0cmluZ3MobmFtZXMyKTsKLQotICAvLyBDcmVhdGUgbWFueSB2ZWN0b3JzIG9mIHN0cmluZ3MKLSAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IG1hbnlOYW1lczsKLSAgZm9yIChhdXRvIGkgPSAwOyBpIDwgMTAwOyBpKyspIHsgbWFueU5hbWVzLnB1c2hfYmFjaygiam9obl9kb2UiKTsgfQotICBhdXRvIG1hbnlOYW1lc1ZlYyA9IGJ1aWxkZXIuQ3JlYXRlVmVjdG9yT2ZTdHJpbmdzKG1hbnlOYW1lcyk7Ci0gIFRFU1RfRVEoZmFsc2UsIG1hbnlOYW1lc1ZlYy5Jc051bGwoKSk7Ci0gIGF1dG8gbWFueU5hbWVzVmVjMiA9Ci0gICAgICBidWlsZGVyLkNyZWF0ZVZlY3Rvck9mU3RyaW5ncyhtYW55TmFtZXMuY2JlZ2luKCksIG1hbnlOYW1lcy5jZW5kKCkpOwotICBURVNUX0VRKGZhbHNlLCBtYW55TmFtZXNWZWMyLklzTnVsbCgpKTsKLQotICAvLyBDcmVhdGUgYW4gYXJyYXkgb2Ygc29ydGVkIHRhYmxlcywgY2FuIGJlIHVzZWQgd2l0aCBiaW5hcnkgc2VhcmNoIHdoZW4gcmVhZDoKLSAgYXV0byB2ZWNvZnRhYmxlcyA9IGJ1aWxkZXIuQ3JlYXRlVmVjdG9yT2ZTb3J0ZWRUYWJsZXMobWxvY3MsIDMpOwotCi0gIC8vIENyZWF0ZSBhbiBhcnJheSBvZiBzb3J0ZWQgc3RydWN0cywKLSAgLy8gY2FuIGJlIHVzZWQgd2l0aCBiaW5hcnkgc2VhcmNoIHdoZW4gcmVhZDoKLSAgc3RkOjp2ZWN0b3I8QWJpbGl0eT4gYWJpbGl0aWVzOwotICBhYmlsaXRpZXMucHVzaF9iYWNrKEFiaWxpdHkoNCwgNDApKTsKLSAgYWJpbGl0aWVzLnB1c2hfYmFjayhBYmlsaXR5KDMsIDMwKSk7Ci0gIGFiaWxpdGllcy5wdXNoX2JhY2soQWJpbGl0eSgyLCAyMCkpOwotICBhYmlsaXRpZXMucHVzaF9iYWNrKEFiaWxpdHkoMCwgMCkpOwotICBhdXRvIHZlY29mc3RydWN0cyA9IGJ1aWxkZXIuQ3JlYXRlVmVjdG9yT2ZTb3J0ZWRTdHJ1Y3RzKCZhYmlsaXRpZXMpOwotCi0gIGZsYXRidWZmZXJzOjpPZmZzZXQ8U3RhdD4gbWxvY3Nfc3RhdHNbMV07Ci0gIGF1dG8gbWlzcyA9IGJ1aWxkZXIuQ3JlYXRlU3RyaW5nKCJtaXNzIik7Ci0gIFN0YXRCdWlsZGVyIG1iX21pc3MoYnVpbGRlcik7Ci0gIG1iX21pc3MuYWRkX2lkKG1pc3MpOwotICBtYl9taXNzLmFkZF92YWwoMCk7Ci0gIG1iX21pc3MuYWRkX2NvdW50KDApOyAgLy8ga2V5Ci0gIG1sb2NzX3N0YXRzWzBdID0gbWJfbWlzcy5GaW5pc2goKTsKLSAgYXV0byB2ZWNfb2Zfc3RhdHMgPSBidWlsZGVyLkNyZWF0ZVZlY3Rvck9mU29ydGVkVGFibGVzKG1sb2NzX3N0YXRzLCAxKTsKLQotICAvLyBDcmVhdGUgYSBuZXN0ZWQgRmxhdEJ1ZmZlci4KLSAgLy8gTmVzdGVkIEZsYXRCdWZmZXJzIGFyZSBzdG9yZWQgaW4gYSB1Ynl0ZSB2ZWN0b3IsIHdoaWNoIGNhbiBiZSBjb252ZW5pZW50Ci0gIC8vIHNpbmNlIHRoZXkgY2FuIGJlIG1lbWNweSdkIGFyb3VuZCBtdWNoIGVhc2llciB0aGFuIG90aGVyIEZsYXRCdWZmZXIKLSAgLy8gdmFsdWVzLiBUaGV5IGhhdmUgbGl0dGxlIG92ZXJoZWFkIGNvbXBhcmVkIHRvIHN0b3JpbmcgdGhlIHRhYmxlIGRpcmVjdGx5LgotICAvLyBBcyBhIHRlc3QsIGNyZWF0ZSBhIG1vc3RseSBlbXB0eSBNb25zdGVyIGJ1ZmZlcjoKLSAgZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyIG5lc3RlZF9idWlsZGVyOwotICBhdXRvIG5tbG9jID0gQ3JlYXRlTW9uc3RlcihuZXN0ZWRfYnVpbGRlciwgbnVsbHB0ciwgMCwgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmVzdGVkX2J1aWxkZXIuQ3JlYXRlU3RyaW5nKCJOZXN0ZWRNb25zdGVyIikpOwotICBGaW5pc2hNb25zdGVyQnVmZmVyKG5lc3RlZF9idWlsZGVyLCBubWxvYyk7Ci0gIC8vIE5vdyB3ZSBjYW4gc3RvcmUgdGhlIGJ1ZmZlciBpbiB0aGUgcGFyZW50LiBOb3RlIHRoYXQgYnkgZGVmYXVsdCwgdmVjdG9ycwotICAvLyBhcmUgb25seSBhbGlnbmVkIHRvIHRoZWlyIGVsZW1lbnRzIG9yIHNpemUgZmllbGQsIHNvIGluIHRoaXMgY2FzZSBpZiB0aGUKLSAgLy8gYnVmZmVyIGNvbnRhaW5zIDY0LWJpdCBlbGVtZW50cywgdGhleSBtYXkgbm90IGJlIGNvcnJlY3RseSBhbGlnbmVkLiBXZSBmaXgKLSAgLy8gdGhhdCB3aXRoOgotICBidWlsZGVyLkZvcmNlVmVjdG9yQWxpZ25tZW50KG5lc3RlZF9idWlsZGVyLkdldFNpemUoKSwgc2l6ZW9mKHVpbnQ4X3QpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5lc3RlZF9idWlsZGVyLkdldEJ1ZmZlck1pbkFsaWdubWVudCgpKTsKLSAgLy8gSWYgZm9yIHdoYXRldmVyIHJlYXNvbiB5b3UgZG9uJ3QgaGF2ZSB0aGUgbmVzdGVkX2J1aWxkZXIgYXZhaWxhYmxlLCB5b3UKLSAgLy8gY2FuIHN1YnN0aXR1dGUgZmxhdGJ1ZmZlcnM6Omxhcmdlc3Rfc2NhbGFyX3QgKDY0LWJpdCkgZm9yIHRoZSBhbGlnbm1lbnQsIG9yCi0gIC8vIHRoZSBsYXJnZXN0IGZvcmNlX2FsaWduIHZhbHVlIGluIHlvdXIgc2NoZW1hIGlmIHlvdSdyZSB1c2luZyBpdC4KLSAgYXV0byBuZXN0ZWRfZmxhdGJ1ZmZlcl92ZWN0b3IgPSBidWlsZGVyLkNyZWF0ZVZlY3RvcigKLSAgICAgIG5lc3RlZF9idWlsZGVyLkdldEJ1ZmZlclBvaW50ZXIoKSwgbmVzdGVkX2J1aWxkZXIuR2V0U2l6ZSgpKTsKLQotICAvLyBUZXN0IGEgbmVzdGVkIEZsZXhCdWZmZXI6Ci0gIGZsZXhidWZmZXJzOjpCdWlsZGVyIGZsZXhidWlsZDsKLSAgZmxleGJ1aWxkLkludCgxMjM0KTsKLSAgZmxleGJ1aWxkLkZpbmlzaCgpOwotICBhdXRvIGZsZXggPSBidWlsZGVyLkNyZWF0ZVZlY3RvcihmbGV4YnVpbGQuR2V0QnVmZmVyKCkpOwotICAvLyBUZXN0IHZlY3RvciBvZiBlbnVtcy4KLSAgQ29sb3IgY29sb3JzW10gPSB7IENvbG9yX0JsdWUsIENvbG9yX0dyZWVuIH07Ci0gIC8vIFdlIHVzZSB0aGlzIHNwZWNpYWwgY3JlYXRpb24gZnVuY3Rpb24gYmVjYXVzZSB3ZSBoYXZlIGFuIGFycmF5IG9mCi0gIC8vIHByZS1DKysxMSAoZW51bSBjbGFzcykgZW51bXMgd2hvc2Ugc2l6ZSBsaWtlbHkgaXMgaW50LCB5ZXQgaXRzIGRlY2xhcmVkCi0gIC8vIHR5cGUgaW4gdGhlIHNjaGVtYSBpcyBieXRlLgotICBhdXRvIHZlY29mY29sb3JzID0gYnVpbGRlci5DcmVhdGVWZWN0b3JTY2FsYXJDYXN0PHVpbnQ4X3QsIENvbG9yPihjb2xvcnMsIDIpOwotCi0gIC8vIHNob3J0Y3V0IGZvciBjcmVhdGluZyBtb25zdGVyIHdpdGggYWxsIGZpZWxkcyBzZXQ6Ci0gIGF1dG8gbWxvYyA9IENyZWF0ZU1vbnN0ZXIoCi0gICAgICBidWlsZGVyLCAmdmVjLCAxNTAsIDgwLCBuYW1lLCBpbnZlbnRvcnksIENvbG9yX0JsdWUsIEFueV9Nb25zdGVyLAotICAgICAgbWxvY3NbMV0uVW5pb24oKSwgIC8vIFN0b3JlIGEgdW5pb24uCi0gICAgICB0ZXN0diwgdmVjb2ZzdHJpbmdzLCB2ZWNvZnRhYmxlcywgMCwgbmVzdGVkX2ZsYXRidWZmZXJfdmVjdG9yLCAwLCBmYWxzZSwKLSAgICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDMuMTQxNTlmLCAzLjBmLCAwLjBmLCB2ZWNvZnN0cmluZ3MyLAotICAgICAgdmVjb2ZzdHJ1Y3RzLCBmbGV4LCB0ZXN0djIsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCi0gICAgICBBbnlVbmlxdWVBbGlhc2VzX05PTkUsIDAsIEFueUFtYmlndW91c0FsaWFzZXNfTk9ORSwgMCwgdmVjb2Zjb2xvcnMsCi0gICAgICBNeUdhbWU6OkV4YW1wbGU6OlJhY2VfTm9uZSwgMCwgdmVjX29mX3N0YXRzKTsKLQotICBGaW5pc2hNb25zdGVyQnVmZmVyKGJ1aWxkZXIsIG1sb2MpOwotCi0vLyBjbGFuZy1mb3JtYXQgb2ZmCi0gICNpZmRlZiBGTEFUQlVGRkVSU19URVNUX1ZFUkJPU0UKLSAgLy8gcHJpbnQgYnl0ZSBkYXRhIGZvciBkZWJ1Z2dpbmc6Ci0gIGF1dG8gcCA9IGJ1aWxkZXIuR2V0QnVmZmVyUG9pbnRlcigpOwotICBmb3IgKGZsYXRidWZmZXJzOjp1b2Zmc2V0X3QgaSA9IDA7IGkgPCBidWlsZGVyLkdldFNpemUoKTsgaSsrKQotICAgIHByaW50ZigiJWQgIiwgcFtpXSk7Ci0gICNlbmRpZgotICAvLyBjbGFuZy1mb3JtYXQgb24KLQotICAvLyByZXR1cm4gdGhlIGJ1ZmZlciBmb3IgdGhlIGNhbGxlciB0byB1c2UuCi0gIGF1dG8gYnVmZmVycG9pbnRlciA9Ci0gICAgICByZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIgKj4oYnVpbGRlci5HZXRCdWZmZXJQb2ludGVyKCkpOwotICBidWZmZXIuYXNzaWduKGJ1ZmZlcnBvaW50ZXIsIGJ1ZmZlcnBvaW50ZXIgKyBidWlsZGVyLkdldFNpemUoKSk7Ci0KLSAgcmV0dXJuIGJ1aWxkZXIuUmVsZWFzZSgpOwotfQotCi0vLyAgZXhhbXBsZSBvZiBhY2Nlc3NpbmcgYSBidWZmZXIgbG9hZGVkIGluIG1lbW9yeToKLXZvaWQgQWNjZXNzRmxhdEJ1ZmZlclRlc3QoY29uc3QgdWludDhfdCAqZmxhdGJ1Ziwgc2l6ZV90IGxlbmd0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBwb29sZWQgPSB0cnVlKSB7Ci0gIC8vIEZpcnN0LCB2ZXJpZnkgdGhlIGJ1ZmZlcnMgaW50ZWdyaXR5IChvcHRpb25hbCkKLSAgZmxhdGJ1ZmZlcnM6OlZlcmlmaWVyIHZlcmlmaWVyKGZsYXRidWYsIGxlbmd0aCk7Ci0gIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGZsZXhfcmV1c2VfdHJhY2tlcjsKLSAgdmVyaWZpZXIuU2V0RmxleFJldXNlVHJhY2tlcigmZmxleF9yZXVzZV90cmFja2VyKTsKLSAgVEVTVF9FUShWZXJpZnlNb25zdGVyQnVmZmVyKHZlcmlmaWVyKSwgdHJ1ZSk7Ci0KLS8vIGNsYW5nLWZvcm1hdCBvZmYKLSAgI2lmZGVmIEZMQVRCVUZGRVJTX1RSQUNLX1ZFUklGSUVSX0JVRkZFUl9TSVpFCi0gICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gdGVzdF9idWZmOwotICAgIHRlc3RfYnVmZi5yZXNpemUobGVuZ3RoICogMik7Ci0gICAgc3RkOjptZW1jcHkoJnRlc3RfYnVmZlswXSwgZmxhdGJ1ZiwgbGVuZ3RoKTsKLSAgICBzdGQ6Om1lbWNweSgmdGVzdF9idWZmW2xlbmd0aF0sIGZsYXRidWYsIGxlbmd0aCk7Ci0KLSAgICBmbGF0YnVmZmVyczo6VmVyaWZpZXIgdmVyaWZpZXIxKCZ0ZXN0X2J1ZmZbMF0sIGxlbmd0aCk7Ci0gICAgVEVTVF9FUShWZXJpZnlNb25zdGVyQnVmZmVyKHZlcmlmaWVyMSksIHRydWUpOwotICAgIFRFU1RfRVEodmVyaWZpZXIxLkdldENvbXB1dGVkU2l6ZSgpLCBsZW5ndGgpOwotCi0gICAgZmxhdGJ1ZmZlcnM6OlZlcmlmaWVyIHZlcmlmaWVyMigmdGVzdF9idWZmW2xlbmd0aF0sIGxlbmd0aCk7Ci0gICAgVEVTVF9FUShWZXJpZnlNb25zdGVyQnVmZmVyKHZlcmlmaWVyMiksIHRydWUpOwotICAgIFRFU1RfRVEodmVyaWZpZXIyLkdldENvbXB1dGVkU2l6ZSgpLCBsZW5ndGgpOwotICAjZW5kaWYKLSAgLy8gY2xhbmctZm9ybWF0IG9uCi0KLSAgVEVTVF9FUShzdHJjbXAoTW9uc3RlcklkZW50aWZpZXIoKSwgIk1PTlMiKSwgMCk7Ci0gIFRFU1RfRVEoTW9uc3RlckJ1ZmZlckhhc0lkZW50aWZpZXIoZmxhdGJ1ZiksIHRydWUpOwotICBURVNUX0VRKHN0cmNtcChNb25zdGVyRXh0ZW5zaW9uKCksICJtb24iKSwgMCk7Ci0KLSAgLy8gQWNjZXNzIHRoZSBidWZmZXIgZnJvbSB0aGUgcm9vdC4KLSAgYXV0byBtb25zdGVyID0gR2V0TW9uc3RlcihmbGF0YnVmKTsKLQotICBURVNUX0VRKG1vbnN0ZXItPmhwKCksIDgwKTsKLSAgVEVTVF9FUShtb25zdGVyLT5tYW5hKCksIDE1MCk7ICAvLyBkZWZhdWx0Ci0gIFRFU1RfRVFfU1RSKG1vbnN0ZXItPm5hbWUoKS0+Y19zdHIoKSwgIk15TW9uc3RlciIpOwotICAvLyBDYW4ndCBhY2Nlc3MgdGhlIGZvbGxvd2luZyBmaWVsZCwgaXQgaXMgZGVwcmVjYXRlZCBpbiB0aGUgc2NoZW1hLAotICAvLyB3aGljaCBtZWFucyBhY2Nlc3NvcnMgYXJlIG5vdCBnZW5lcmF0ZWQ6Ci0gIC8vIG1vbnN0ZXIuZnJpZW5kbHkoKQotCi0gIGF1dG8gcG9zID0gbW9uc3Rlci0+cG9zKCk7Ci0gIFRFU1RfTk9UTlVMTChwb3MpOwotICBURVNUX0VRKHBvcy0+eigpLCAzKTsKLSAgVEVTVF9FUShwb3MtPnRlc3QzKCkuYSgpLCAxMCk7Ci0gIFRFU1RfRVEocG9zLT50ZXN0MygpLmIoKSwgMjApOwotCi0gIGF1dG8gaW52ZW50b3J5ID0gbW9uc3Rlci0+aW52ZW50b3J5KCk7Ci0gIFRFU1RfRVEoVmVjdG9yTGVuZ3RoKGludmVudG9yeSksIDEwVUwpOyAgLy8gV29ya3MgZXZlbiBpZiBpbnZlbnRvcnkgaXMgbnVsbC4KLSAgVEVTVF9OT1ROVUxMKGludmVudG9yeSk7Ci0gIHVuc2lnbmVkIGNoYXIgaW52X2RhdGFbXSA9IHsgMCwgMSwgMiwgMywgNCwgNSwgNiwgNywgOCwgOSB9OwotICAvLyBDaGVjayBjb21wYXRpYmlsdHkgb2YgaXRlcmF0b3JzIHdpdGggU1RMLgotICBzdGQ6OnZlY3Rvcjx1bnNpZ25lZCBjaGFyPiBpbnZfdmVjKGludmVudG9yeS0+YmVnaW4oKSwgaW52ZW50b3J5LT5lbmQoKSk7Ci0gIHNpemVfdCBuID0gMDsKLSAgZm9yIChhdXRvIGl0ID0gaW52ZW50b3J5LT5iZWdpbigpOyBpdCAhPSBpbnZlbnRvcnktPmVuZCgpOyArK2l0LCArK24pIHsKLSAgICBhdXRvIGluZHggPSBpdCAtIGludmVudG9yeS0+YmVnaW4oKTsKLSAgICBURVNUX0VRKCppdCwgaW52X3ZlYy5hdChpbmR4KSk7ICAvLyBVc2UgYm91bmRzLWNoZWNrLgotICAgIFRFU1RfRVEoKml0LCBpbnZfZGF0YVtpbmR4XSk7Ci0gIH0KLSAgVEVTVF9FUShuLCBpbnZfdmVjLnNpemUoKSk7Ci0KLSAgbiA9IDA7Ci0gIGZvciAoYXV0byBpdCA9IGludmVudG9yeS0+Y2JlZ2luKCk7IGl0ICE9IGludmVudG9yeS0+Y2VuZCgpOyArK2l0LCArK24pIHsKLSAgICBhdXRvIGluZHggPSBpdCAtIGludmVudG9yeS0+Y2JlZ2luKCk7Ci0gICAgVEVTVF9FUSgqaXQsIGludl92ZWMuYXQoaW5keCkpOyAgLy8gVXNlIGJvdW5kcy1jaGVjay4KLSAgICBURVNUX0VRKCppdCwgaW52X2RhdGFbaW5keF0pOwotICB9Ci0gIFRFU1RfRVEobiwgaW52X3ZlYy5zaXplKCkpOwotCi0gIG4gPSAwOwotICBmb3IgKGF1dG8gaXQgPSBpbnZlbnRvcnktPnJiZWdpbigpOyBpdCAhPSBpbnZlbnRvcnktPnJlbmQoKTsgKytpdCwgKytuKSB7Ci0gICAgYXV0byBpbmR4ID0gaW52ZW50b3J5LT5yZW5kKCkgLSBpdCAtIDE7Ci0gICAgVEVTVF9FUSgqaXQsIGludl92ZWMuYXQoaW5keCkpOyAgLy8gVXNlIGJvdW5kcy1jaGVjay4KLSAgICBURVNUX0VRKCppdCwgaW52X2RhdGFbaW5keF0pOwotICB9Ci0gIFRFU1RfRVEobiwgaW52X3ZlYy5zaXplKCkpOwotCi0gIG4gPSAwOwotICBmb3IgKGF1dG8gaXQgPSBpbnZlbnRvcnktPmNyYmVnaW4oKTsgaXQgIT0gaW52ZW50b3J5LT5jcmVuZCgpOyArK2l0LCArK24pIHsKLSAgICBhdXRvIGluZHggPSBpbnZlbnRvcnktPmNyZW5kKCkgLSBpdCAtIDE7Ci0gICAgVEVTVF9FUSgqaXQsIGludl92ZWMuYXQoaW5keCkpOyAgLy8gVXNlIGJvdW5kcy1jaGVjay4KLSAgICBURVNUX0VRKCppdCwgaW52X2RhdGFbaW5keF0pOwotICB9Ci0gIFRFU1RfRVEobiwgaW52X3ZlYy5zaXplKCkpOwotCi0gIFRFU1RfRVEobW9uc3Rlci0+Y29sb3IoKSwgQ29sb3JfQmx1ZSk7Ci0KLSAgLy8gRXhhbXBsZSBvZiBhY2Nlc3NpbmcgYSB1bmlvbjoKLSAgVEVTVF9FUShtb25zdGVyLT50ZXN0X3R5cGUoKSwgQW55X01vbnN0ZXIpOyAgLy8gRmlyc3QgbWFrZSBzdXJlIHdoaWNoIGl0IGlzLgotICBhdXRvIG1vbnN0ZXIyID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBNb25zdGVyICo+KG1vbnN0ZXItPnRlc3QoKSk7Ci0gIFRFU1RfTk9UTlVMTChtb25zdGVyMik7Ci0gIFRFU1RfRVFfU1RSKG1vbnN0ZXIyLT5uYW1lKCktPmNfc3RyKCksICJGcmVkIik7Ci0KLSAgLy8gRXhhbXBsZSBvZiBhY2Nlc3NpbmcgYSB2ZWN0b3Igb2Ygc3RyaW5nczoKLSAgYXV0byB2ZWNvZnN0cmluZ3MgPSBtb25zdGVyLT50ZXN0YXJyYXlvZnN0cmluZygpOwotICBURVNUX0VRKHZlY29mc3RyaW5ncy0+c2l6ZSgpLCA0VSk7Ci0gIFRFU1RfRVFfU1RSKHZlY29mc3RyaW5ncy0+R2V0KDApLT5jX3N0cigpLCAiYm9iIik7Ci0gIFRFU1RfRVFfU1RSKHZlY29mc3RyaW5ncy0+R2V0KDEpLT5jX3N0cigpLCAiZnJlZCIpOwotICBpZiAocG9vbGVkKSB7Ci0gICAgLy8gVGhlc2Ugc2hvdWxkIGhhdmUgcG9pbnRlciBlcXVhbGl0eSBiZWNhdXNlIG9mIHN0cmluZyBwb29saW5nLgotICAgIFRFU1RfRVEodmVjb2ZzdHJpbmdzLT5HZXQoMCktPmNfc3RyKCksIHZlY29mc3RyaW5ncy0+R2V0KDIpLT5jX3N0cigpKTsKLSAgICBURVNUX0VRKHZlY29mc3RyaW5ncy0+R2V0KDEpLT5jX3N0cigpLCB2ZWNvZnN0cmluZ3MtPkdldCgzKS0+Y19zdHIoKSk7Ci0gIH0KLQotICBhdXRvIHZlY29mc3RyaW5nczIgPSBtb25zdGVyLT50ZXN0YXJyYXlvZnN0cmluZzIoKTsKLSAgaWYgKHZlY29mc3RyaW5nczIpIHsKLSAgICBURVNUX0VRKHZlY29mc3RyaW5nczItPnNpemUoKSwgMlUpOwotICAgIFRFU1RfRVFfU1RSKHZlY29mc3RyaW5nczItPkdldCgwKS0+Y19zdHIoKSwgImphbmUiKTsKLSAgICBURVNUX0VRX1NUUih2ZWNvZnN0cmluZ3MyLT5HZXQoMSktPmNfc3RyKCksICJtYXJ5Iik7Ci0gIH0KLQotICAvLyBFeGFtcGxlIG9mIGFjY2Vzc2luZyBhIHZlY3RvciBvZiB0YWJsZXM6Ci0gIGF1dG8gdmVjb2Z0YWJsZXMgPSBtb25zdGVyLT50ZXN0YXJyYXlvZnRhYmxlcygpOwotICBURVNUX0VRKHZlY29mdGFibGVzLT5zaXplKCksIDNVKTsKLSAgZm9yIChhdXRvIGl0ID0gdmVjb2Z0YWJsZXMtPmJlZ2luKCk7IGl0ICE9IHZlY29mdGFibGVzLT5lbmQoKTsgKytpdCkgewotICAgIFRFU1RfRVEoc3RybGVuKGl0LT5uYW1lKCktPmNfc3RyKCkpID49IDQsIHRydWUpOwotICB9Ci0gIFRFU1RfRVFfU1RSKHZlY29mdGFibGVzLT5HZXQoMCktPm5hbWUoKS0+Y19zdHIoKSwgIkJhcm5leSIpOwotICBURVNUX0VRKHZlY29mdGFibGVzLT5HZXQoMCktPmhwKCksIDEwMDApOwotICBURVNUX0VRX1NUUih2ZWNvZnRhYmxlcy0+R2V0KDEpLT5uYW1lKCktPmNfc3RyKCksICJGcmVkIik7Ci0gIFRFU1RfRVFfU1RSKHZlY29mdGFibGVzLT5HZXQoMiktPm5hbWUoKS0+Y19zdHIoKSwgIldpbG1hIik7Ci0gIFRFU1RfTk9UTlVMTCh2ZWNvZnRhYmxlcy0+TG9va3VwQnlLZXkoIkJhcm5leSIpKTsKLSAgVEVTVF9OT1ROVUxMKHZlY29mdGFibGVzLT5Mb29rdXBCeUtleSgiRnJlZCIpKTsKLSAgVEVTVF9OT1ROVUxMKHZlY29mdGFibGVzLT5Mb29rdXBCeUtleSgiV2lsbWEiKSk7Ci0KLSAgLy8gVGVzdCBhY2Nlc3NpbmcgYSB2ZWN0b3Igb2Ygc29ydGVkIHN0cnVjdHMKLSAgYXV0byB2ZWNvZnN0cnVjdHMgPSBtb25zdGVyLT50ZXN0YXJyYXlvZnNvcnRlZHN0cnVjdCgpOwotICBpZiAodmVjb2ZzdHJ1Y3RzKSB7ICAvLyBub3QgZmlsbGVkIGluIG1vbnN0ZXJfdGVzdC5iZmJzCi0gICAgZm9yIChmbGF0YnVmZmVyczo6dW9mZnNldF90IGkgPSAwOyBpIDwgdmVjb2ZzdHJ1Y3RzLT5zaXplKCkgLSAxOyBpKyspIHsKLSAgICAgIGF1dG8gbGVmdCA9IHZlY29mc3RydWN0cy0+R2V0KGkpOwotICAgICAgYXV0byByaWdodCA9IHZlY29mc3RydWN0cy0+R2V0KGkgKyAxKTsKLSAgICAgIFRFU1RfRVEodHJ1ZSwgKGxlZnQtPktleUNvbXBhcmVMZXNzVGhhbihyaWdodCkpKTsKLSAgICB9Ci0gICAgVEVTVF9OT1ROVUxMKHZlY29mc3RydWN0cy0+TG9va3VwQnlLZXkoMCkpOyAgLy8gdGVzdCBkZWZhdWx0IHZhbHVlCi0gICAgVEVTVF9OT1ROVUxMKHZlY29mc3RydWN0cy0+TG9va3VwQnlLZXkoMykpOwotICAgIFRFU1RfRVEoc3RhdGljX2Nhc3Q8Y29uc3QgQWJpbGl0eSAqPihudWxscHRyKSwKLSAgICAgICAgICAgIHZlY29mc3RydWN0cy0+TG9va3VwQnlLZXkoNSkpOwotICB9Ci0KLSAgaWYgKGF1dG8gdmVjX29mX3N0YXQgPSBtb25zdGVyLT5zY2FsYXJfa2V5X3NvcnRlZF90YWJsZXMoKSkgewotICAgIGF1dG8gc3RhdF8wID0gdmVjX29mX3N0YXQtPkxvb2t1cEJ5S2V5KHN0YXRpY19jYXN0PHVpbnQxNl90PigwdSkpOwotICAgIFRFU1RfTk9UTlVMTChzdGF0XzApOwotICAgIFRFU1RfTk9UTlVMTChzdGF0XzAtPmlkKCkpOwotICAgIFRFU1RfRVEoMCwgc3RhdF8wLT5jb3VudCgpKTsKLSAgICBURVNUX0VRX1NUUigibWlzcyIsIHN0YXRfMC0+aWQoKS0+Y19zdHIoKSk7Ci0gIH0KLQotICAvLyBUZXN0IG5lc3RlZCBGbGF0QnVmZmVycyBpZiBhdmFpbGFibGU6Ci0gIGF1dG8gbmVzdGVkX2J1ZmZlciA9IG1vbnN0ZXItPnRlc3RuZXN0ZWRmbGF0YnVmZmVyKCk7Ci0gIGlmIChuZXN0ZWRfYnVmZmVyKSB7Ci0gICAgLy8gbmVzdGVkX2J1ZmZlciBpcyBhIHZlY3RvciBvZiBieXRlcyB5b3UgY2FuIG1lbWNweS4gSG93ZXZlciwgaWYgeW91Ci0gICAgLy8gYWN0dWFsbHkgd2FudCB0byBhY2Nlc3MgdGhlIG5lc3RlZCBkYXRhLCB0aGlzIGlzIGEgY29udmVuaWVudAotICAgIC8vIGFjY2Vzc29yIHRoYXQgZGlyZWN0bHkgZ2l2ZXMgeW91IHRoZSByb290IHRhYmxlOgotICAgIGF1dG8gbmVzdGVkX21vbnN0ZXIgPSBtb25zdGVyLT50ZXN0bmVzdGVkZmxhdGJ1ZmZlcl9uZXN0ZWRfcm9vdCgpOwotICAgIFRFU1RfRVFfU1RSKG5lc3RlZF9tb25zdGVyLT5uYW1lKCktPmNfc3RyKCksICJOZXN0ZWRNb25zdGVyIik7Ci0gIH0KLQotICAvLyBUZXN0IGZsZXhidWZmZXIgaWYgYXZhaWxhYmxlOgotICBhdXRvIGZsZXggPSBtb25zdGVyLT5mbGV4KCk7Ci0gIC8vIGZsZXggaXMgYSB2ZWN0b3Igb2YgYnl0ZXMgeW91IGNhbiBtZW1jcHkgZXRjLgotICBURVNUX0VRKGZsZXgtPnNpemUoKSwgNCk7ICAvLyBFbmNvZGVkIEZsZXhCdWZmZXIgYnl0ZXMuCi0gIC8vIEhvd2V2ZXIsIGlmIHlvdSBhY3R1YWxseSB3YW50IHRvIGFjY2VzcyB0aGUgbmVzdGVkIGRhdGEsIHRoaXMgaXMgYQotICAvLyBjb252ZW5pZW50IGFjY2Vzc29yIHRoYXQgZGlyZWN0bHkgZ2l2ZXMgeW91IHRoZSByb290IHZhbHVlOgotICBURVNUX0VRKG1vbnN0ZXItPmZsZXhfZmxleGJ1ZmZlcl9yb290KCkuQXNJbnQxNigpLCAxMjM0KTsKLQotICAvLyBUZXN0IHZlY3RvciBvZiBlbnVtczoKLSAgYXV0byBjb2xvcnMgPSBtb25zdGVyLT52ZWN0b3Jfb2ZfZW51bXMoKTsKLSAgaWYgKGNvbG9ycykgewotICAgIFRFU1RfRVEoY29sb3JzLT5zaXplKCksIDIpOwotICAgIFRFU1RfRVEoY29sb3JzLT5HZXQoMCksIENvbG9yX0JsdWUpOwotICAgIFRFU1RfRVEoY29sb3JzLT5HZXQoMSksIENvbG9yX0dyZWVuKTsKLSAgfQotCi0gIC8vIFNpbmNlIEZsYXRidWZmZXJzIHVzZXMgZXhwbGljaXQgbWVjaGFuaXNtcyB0byBvdmVycmlkZSB0aGUgZGVmYXVsdAotICAvLyBjb21waWxlciBhbGlnbm1lbnQsIGRvdWJsZSBjaGVjayB0aGF0IHRoZSBjb21waWxlciBpbmRlZWQgb2JleXMgdGhlbToKLSAgLy8gKFRlc3QgY29uc2lzdHMgb2YgYSBzaG9ydCBhbmQgYnl0ZSk6Ci0gIFRFU1RfRVEoZmxhdGJ1ZmZlcnM6OkFsaWduT2Y8VGVzdD4oKSwgMlVMKTsKLSAgVEVTVF9FUShzaXplb2YoVGVzdCksIDRVTCk7Ci0KLSAgY29uc3QgZmxhdGJ1ZmZlcnM6OlZlY3Rvcjxjb25zdCBUZXN0ICo+ICp0ZXN0c19hcnJheVtdID0gewotICAgIG1vbnN0ZXItPnRlc3Q0KCksCi0gICAgbW9uc3Rlci0+dGVzdDUoKSwKLSAgfTsKLSAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplb2YodGVzdHNfYXJyYXkpIC8gc2l6ZW9mKHRlc3RzX2FycmF5WzBdKTsgKytpKSB7Ci0gICAgYXV0byB0ZXN0cyA9IHRlc3RzX2FycmF5W2ldOwotICAgIFRFU1RfTk9UTlVMTCh0ZXN0cyk7Ci0gICAgYXV0byB0ZXN0XzAgPSB0ZXN0cy0+R2V0KDApOwotICAgIGF1dG8gdGVzdF8xID0gdGVzdHMtPkdldCgxKTsKLSAgICBURVNUX0VRKHRlc3RfMC0+YSgpLCAxMCk7Ci0gICAgVEVTVF9FUSh0ZXN0XzAtPmIoKSwgMjApOwotICAgIFRFU1RfRVEodGVzdF8xLT5hKCksIDMwKTsKLSAgICBURVNUX0VRKHRlc3RfMS0+YigpLCA0MCk7Ci0gICAgZm9yIChhdXRvIGl0ID0gdGVzdHMtPmJlZ2luKCk7IGl0ICE9IHRlc3RzLT5lbmQoKTsgKytpdCkgewotICAgICAgVEVTVF9FUShpdC0+YSgpID09IDEwIHx8IGl0LT5hKCkgPT0gMzAsIHRydWUpOyAgLy8gSnVzdCB0ZXN0aW5nIGl0ZXJhdG9ycy4KLSAgICB9Ci0gIH0KLQotICAvLyBDaGVja2luZyBmb3IgcHJlc2VuY2Ugb2YgZmllbGRzOgotICBURVNUX0VRKGZsYXRidWZmZXJzOjpJc0ZpZWxkUHJlc2VudChtb25zdGVyLCBNb25zdGVyOjpWVF9IUCksIHRydWUpOwotICBURVNUX0VRKGZsYXRidWZmZXJzOjpJc0ZpZWxkUHJlc2VudChtb25zdGVyLCBNb25zdGVyOjpWVF9NQU5BKSwgZmFsc2UpOwotCi0gIC8vIE9idGFpbmluZyBhIGJ1ZmZlciBmcm9tIGEgcm9vdDoKLSAgVEVTVF9FUShHZXRCdWZmZXJTdGFydEZyb21Sb290UG9pbnRlcihtb25zdGVyKSwgZmxhdGJ1Zik7Ci19Ci0KLS8vIENoYW5nZSBhIEZsYXRCdWZmZXIgaW4tcGxhY2UsIGFmdGVyIGl0IGhhcyBiZWVuIGNvbnN0cnVjdGVkLgotdm9pZCBNdXRhdGVGbGF0QnVmZmVyc1Rlc3QodWludDhfdCAqZmxhdGJ1Ziwgc3RkOjpzaXplX3QgbGVuZ3RoKSB7Ci0gIC8vIEdldCBub24tY29uc3QgcG9pbnRlciB0byByb290LgotICBhdXRvIG1vbnN0ZXIgPSBHZXRNdXRhYmxlTW9uc3RlcihmbGF0YnVmKTsKLQotICAvLyBFYWNoIG9mIHRoZXNlIHRlc3RzIG11dGF0ZXMsIHRoZW4gdGVzdHMsIHRoZW4gc2V0IGJhY2sgdG8gdGhlIG9yaWdpbmFsLAotICAvLyBzbyB3ZSBjYW4gdGVzdCB0aGF0IHRoZSBidWZmZXIgaW4gdGhlIGVuZCBzdGlsbCBwYXNzZXMgb3VyIG9yaWdpbmFsIHRlc3QuCi0gIGF1dG8gaHBfb2sgPSBtb25zdGVyLT5tdXRhdGVfaHAoMTApOwotICBURVNUX0VRKGhwX29rLCB0cnVlKTsgIC8vIEZpZWxkIHdhcyBwcmVzZW50LgotICBURVNUX0VRKG1vbnN0ZXItPmhwKCksIDEwKTsKLSAgLy8gTXV0YXRlIHRvIGRlZmF1bHQgdmFsdWUKLSAgYXV0byBocF9va19kZWZhdWx0ID0gbW9uc3Rlci0+bXV0YXRlX2hwKDEwMCk7Ci0gIFRFU1RfRVEoaHBfb2tfZGVmYXVsdCwgdHJ1ZSk7ICAvLyBGaWVsZCB3YXMgcHJlc2VudC4KLSAgVEVTVF9FUShtb25zdGVyLT5ocCgpLCAxMDApOwotICAvLyBUZXN0IHRoYXQgbXV0YXRlIHRvIGRlZmF1bHQgYWJvdmUga2VlcHMgZmllbGQgdmFsaWQgZm9yIGZ1cnRoZXIgbXV0YXRpb25zCi0gIGF1dG8gaHBfb2tfMiA9IG1vbnN0ZXItPm11dGF0ZV9ocCgyMCk7Ci0gIFRFU1RfRVEoaHBfb2tfMiwgdHJ1ZSk7Ci0gIFRFU1RfRVEobW9uc3Rlci0+aHAoKSwgMjApOwotICBtb25zdGVyLT5tdXRhdGVfaHAoODApOwotCi0gIC8vIE1vbnN0ZXIgb3JpZ2luYWxseSBhdCAxNTAgbWFuYSAoZGVmYXVsdCB2YWx1ZSkKLSAgYXV0byBtYW5hX2RlZmF1bHRfb2sgPSBtb25zdGVyLT5tdXRhdGVfbWFuYSgxNTApOyAgLy8gTXV0YXRlIHRvIGRlZmF1bHQgdmFsdWUuCi0gIFRFU1RfRVEobWFuYV9kZWZhdWx0X29rLAotICAgICAgICAgIHRydWUpOyAgLy8gTXV0YXRpb24gc2hvdWxkIHN1Y2NlZWQsIGJlY2F1c2UgZGVmYXVsdCB2YWx1ZS4KLSAgVEVTVF9FUShtb25zdGVyLT5tYW5hKCksIDE1MCk7Ci0gIGF1dG8gbWFuYV9vayA9IG1vbnN0ZXItPm11dGF0ZV9tYW5hKDEwKTsKLSAgVEVTVF9FUShtYW5hX29rLCBmYWxzZSk7ICAvLyBGaWVsZCB3YXMgTk9UIHByZXNlbnQsIGJlY2F1c2UgZGVmYXVsdCB2YWx1ZS4KLSAgVEVTVF9FUShtb25zdGVyLT5tYW5hKCksIDE1MCk7Ci0KLSAgLy8gTXV0YXRlIHN0cnVjdHMuCi0gIGF1dG8gcG9zID0gbW9uc3Rlci0+bXV0YWJsZV9wb3MoKTsKLSAgYXV0byB0ZXN0MyA9IHBvcy0+bXV0YWJsZV90ZXN0MygpOyAgLy8gU3RydWN0IGluc2lkZSBhIHN0cnVjdC4KLSAgdGVzdDMubXV0YXRlX2EoNTApOyAgICAgICAgICAgICAgICAgLy8gU3RydWN0IGZpZWxkcyBuZXZlciBmYWlsLgotICBURVNUX0VRKHRlc3QzLmEoKSwgNTApOwotICB0ZXN0My5tdXRhdGVfYSgxMCk7Ci0KLSAgLy8gTXV0YXRlIHZlY3RvcnMuCi0gIGF1dG8gaW52ZW50b3J5ID0gbW9uc3Rlci0+bXV0YWJsZV9pbnZlbnRvcnkoKTsKLSAgaW52ZW50b3J5LT5NdXRhdGUoOSwgMTAwKTsKLSAgVEVTVF9FUShpbnZlbnRvcnktPkdldCg5KSwgMTAwKTsKLSAgaW52ZW50b3J5LT5NdXRhdGUoOSwgOSk7Ci0KLSAgYXV0byB0YWJsZXMgPSBtb25zdGVyLT5tdXRhYmxlX3Rlc3RhcnJheW9mdGFibGVzKCk7Ci0gIGF1dG8gZmlyc3QgPSB0YWJsZXMtPkdldE11dGFibGVPYmplY3QoMCk7Ci0gIFRFU1RfRVEoZmlyc3QtPmhwKCksIDEwMDApOwotICBmaXJzdC0+bXV0YXRlX2hwKDApOwotICBURVNUX0VRKGZpcnN0LT5ocCgpLCAwKTsKLSAgZmlyc3QtPm11dGF0ZV9ocCgxMDAwKTsKLQotICAvLyBNdXRhdGUgdmlhIExvb2t1cEJ5S2V5Ci0gIFRFU1RfTk9UTlVMTCh0YWJsZXMtPk11dGFibGVMb29rdXBCeUtleSgiQmFybmV5IikpOwotICBURVNUX0VRKHN0YXRpY19jYXN0PE1vbnN0ZXIgKj4obnVsbHB0ciksCi0gICAgICAgICAgdGFibGVzLT5NdXRhYmxlTG9va3VwQnlLZXkoIkRvZXNudEV4aXN0IikpOwotICBURVNUX0VRKHRhYmxlcy0+TXV0YWJsZUxvb2t1cEJ5S2V5KCJCYXJuZXkiKS0+aHAoKSwgMTAwMCk7Ci0gIFRFU1RfRVEodGFibGVzLT5NdXRhYmxlTG9va3VwQnlLZXkoIkJhcm5leSIpLT5tdXRhdGVfaHAoMCksIHRydWUpOwotICBURVNUX0VRKHRhYmxlcy0+TG9va3VwQnlLZXkoIkJhcm5leSIpLT5ocCgpLCAwKTsKLSAgVEVTVF9FUSh0YWJsZXMtPk11dGFibGVMb29rdXBCeUtleSgiQmFybmV5IiktPm11dGF0ZV9ocCgxMDAwKSwgdHJ1ZSk7Ci0KLSAgLy8gUnVuIHRoZSB2ZXJpZmllciBhbmQgdGhlIHJlZ3VsYXIgdGVzdCB0byBtYWtlIHN1cmUgd2UgZGlkbid0IHRyYW1wbGUgb24KLSAgLy8gYW55dGhpbmcuCi0gIEFjY2Vzc0ZsYXRCdWZmZXJUZXN0KGZsYXRidWYsIGxlbmd0aCk7Ci19Ci0KLS8vIFV0aWxpdHkgZnVuY3Rpb24gdG8gY2hlY2sgYSBNb25zdGVyIG9iamVjdC4KLXZvaWQgQ2hlY2tNb25zdGVyT2JqZWN0KE1vbnN0ZXJUICptb25zdGVyMikgewotICBURVNUX0VRKG1vbnN0ZXIyLT5ocCwgODApOwotICBURVNUX0VRKG1vbnN0ZXIyLT5tYW5hLCAxNTApOyAgLy8gZGVmYXVsdAotICBURVNUX0VRX1NUUihtb25zdGVyMi0+bmFtZS5jX3N0cigpLCAiTXlNb25zdGVyIik7Ci0KLSAgYXV0byAmcG9zID0gbW9uc3RlcjItPnBvczsKLSAgVEVTVF9OT1ROVUxMKHBvcyk7Ci0gIFRFU1RfRVEocG9zLT56KCksIDMpOwotICBURVNUX0VRKHBvcy0+dGVzdDMoKS5hKCksIDEwKTsKLSAgVEVTVF9FUShwb3MtPnRlc3QzKCkuYigpLCAyMCk7Ci0KLSAgYXV0byAmaW52ZW50b3J5ID0gbW9uc3RlcjItPmludmVudG9yeTsKLSAgVEVTVF9FUShpbnZlbnRvcnkuc2l6ZSgpLCAxMFVMKTsKLSAgdW5zaWduZWQgY2hhciBpbnZfZGF0YVtdID0geyAwLCAxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5IH07Ci0gIGZvciAoYXV0byBpdCA9IGludmVudG9yeS5iZWdpbigpOyBpdCAhPSBpbnZlbnRvcnkuZW5kKCk7ICsraXQpCi0gICAgVEVTVF9FUSgqaXQsIGludl9kYXRhW2l0IC0gaW52ZW50b3J5LmJlZ2luKCldKTsKLQotICBURVNUX0VRKG1vbnN0ZXIyLT5jb2xvciwgQ29sb3JfQmx1ZSk7Ci0KLSAgYXV0byBtb25zdGVyMyA9IG1vbnN0ZXIyLT50ZXN0LkFzTW9uc3RlcigpOwotICBURVNUX05PVE5VTEwobW9uc3RlcjMpOwotICBURVNUX0VRX1NUUihtb25zdGVyMy0+bmFtZS5jX3N0cigpLCAiRnJlZCIpOwotCi0gIGF1dG8gJnZlY29mc3RyaW5ncyA9IG1vbnN0ZXIyLT50ZXN0YXJyYXlvZnN0cmluZzsKLSAgVEVTVF9FUSh2ZWNvZnN0cmluZ3Muc2l6ZSgpLCA0VSk7Ci0gIFRFU1RfRVFfU1RSKHZlY29mc3RyaW5nc1swXS5jX3N0cigpLCAiYm9iIik7Ci0gIFRFU1RfRVFfU1RSKHZlY29mc3RyaW5nc1sxXS5jX3N0cigpLCAiZnJlZCIpOwotCi0gIGF1dG8gJnZlY29mc3RyaW5nczIgPSBtb25zdGVyMi0+dGVzdGFycmF5b2ZzdHJpbmcyOwotICBURVNUX0VRKHZlY29mc3RyaW5nczIuc2l6ZSgpLCAyVSk7Ci0gIFRFU1RfRVFfU1RSKHZlY29mc3RyaW5nczJbMF0uY19zdHIoKSwgImphbmUiKTsKLSAgVEVTVF9FUV9TVFIodmVjb2ZzdHJpbmdzMlsxXS5jX3N0cigpLCAibWFyeSIpOwotCi0gIGF1dG8gJnZlY29mdGFibGVzID0gbW9uc3RlcjItPnRlc3RhcnJheW9mdGFibGVzOwotICBURVNUX0VRKHZlY29mdGFibGVzLnNpemUoKSwgM1UpOwotICBURVNUX0VRX1NUUih2ZWNvZnRhYmxlc1swXS0+bmFtZS5jX3N0cigpLCAiQmFybmV5Iik7Ci0gIFRFU1RfRVEodmVjb2Z0YWJsZXNbMF0tPmhwLCAxMDAwKTsKLSAgVEVTVF9FUV9TVFIodmVjb2Z0YWJsZXNbMV0tPm5hbWUuY19zdHIoKSwgIkZyZWQiKTsKLSAgVEVTVF9FUV9TVFIodmVjb2Z0YWJsZXNbMl0tPm5hbWUuY19zdHIoKSwgIldpbG1hIik7Ci0KLSAgYXV0byAmdGVzdHMgPSBtb25zdGVyMi0+dGVzdDQ7Ci0gIFRFU1RfRVEodGVzdHNbMF0uYSgpLCAxMCk7Ci0gIFRFU1RfRVEodGVzdHNbMF0uYigpLCAyMCk7Ci0gIFRFU1RfRVEodGVzdHNbMV0uYSgpLCAzMCk7Ci0gIFRFU1RfRVEodGVzdHNbMV0uYigpLCA0MCk7Ci19Ci0KLS8vIFVucGFjayBhIEZsYXRCdWZmZXIgaW50byBvYmplY3RzLgotdm9pZCBPYmplY3RGbGF0QnVmZmVyc1Rlc3QodWludDhfdCAqZmxhdGJ1ZikgewotICAvLyBPcHRpb25hbDogd2UgY2FuIHNwZWNpZnkgcmVzb2x2ZXIgYW5kIHJlaGFzaGVyIGZ1bmN0aW9ucyB0byB0dXJuIGhhc2hlZAotICAvLyBzdHJpbmdzIGludG8gb2JqZWN0IHBvaW50ZXJzIGFuZCBiYWNrLCB0byBpbXBsZW1lbnQgcmVtb3RlIHJlZmVyZW5jZXMKLSAgLy8gYW5kIHN1Y2guCi0gIGF1dG8gcmVzb2x2ZXIgPSBmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCgKLSAgICAgIFtdKHZvaWQgKipwb2ludGVyX2FkciwgZmxhdGJ1ZmZlcnM6Omhhc2hfdmFsdWVfdCBoYXNoKSB7Ci0gICAgICAgICh2b2lkKXBvaW50ZXJfYWRyOwotICAgICAgICAodm9pZCloYXNoOwotICAgICAgICAvLyBEb24ndCBhY3R1YWxseSBkbyBhbnl0aGluZywgbGVhdmUgdmFyaWFibGUgbnVsbC4KLSAgICAgIH0pOwotICBhdXRvIHJlaGFzaGVyID0gZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QoCi0gICAgICBbXSh2b2lkICpwb2ludGVyKSAtPiBmbGF0YnVmZmVyczo6aGFzaF92YWx1ZV90IHsKLSAgICAgICAgKHZvaWQpcG9pbnRlcjsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgICB9KTsKLQotICAvLyBUdXJuIGEgYnVmZmVyIGludG8gQysrIG9iamVjdHMuCi0gIGF1dG8gbW9uc3RlcjEgPSBVblBhY2tNb25zdGVyKGZsYXRidWYsICZyZXNvbHZlcik7Ci0KLSAgLy8gUmUtc2VyaWFsaXplIHRoZSBkYXRhLgotICBmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgZmJiMTsKLSAgZmJiMS5GaW5pc2goQ3JlYXRlTW9uc3RlcihmYmIxLCBtb25zdGVyMS5nZXQoKSwgJnJlaGFzaGVyKSwKLSAgICAgICAgICAgICAgTW9uc3RlcklkZW50aWZpZXIoKSk7Ci0KLSAgLy8gVW5wYWNrIGFnYWluLCBhbmQgcmUtc2VyaWFsaXplIGFnYWluLgotICBhdXRvIG1vbnN0ZXIyID0gVW5QYWNrTW9uc3RlcihmYmIxLkdldEJ1ZmZlclBvaW50ZXIoKSwgJnJlc29sdmVyKTsKLSAgZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyIGZiYjI7Ci0gIGZiYjIuRmluaXNoKENyZWF0ZU1vbnN0ZXIoZmJiMiwgbW9uc3RlcjIuZ2V0KCksICZyZWhhc2hlciksCi0gICAgICAgICAgICAgIE1vbnN0ZXJJZGVudGlmaWVyKCkpOwotCi0gIC8vIE5vdyB3ZSd2ZSBnb25lIGZ1bGwgcm91bmQtdHJpcCwgdGhlIHR3byBidWZmZXJzIHNob3VsZCBtYXRjaC4KLSAgY29uc3QgYXV0byBsZW4xID0gZmJiMS5HZXRTaXplKCk7Ci0gIGNvbnN0IGF1dG8gbGVuMiA9IGZiYjIuR2V0U2l6ZSgpOwotICBURVNUX0VRKGxlbjEsIGxlbjIpOwotICBURVNUX0VRKG1lbWNtcChmYmIxLkdldEJ1ZmZlclBvaW50ZXIoKSwgZmJiMi5HZXRCdWZmZXJQb2ludGVyKCksIGxlbjEpLCAwKTsKLQotICAvLyBUZXN0IGl0IHdpdGggdGhlIG9yaWdpbmFsIGJ1ZmZlciB0ZXN0IHRvIG1ha2Ugc3VyZSBhbGwgZGF0YSBzdXJ2aXZlZC4KLSAgQWNjZXNzRmxhdEJ1ZmZlclRlc3QoZmJiMi5HZXRCdWZmZXJQb2ludGVyKCksIGxlbjIsIGZhbHNlKTsKLQotICAvLyBUZXN0IGFjY2Vzc2luZyBmaWVsZHMsIHNpbWlsYXIgdG8gQWNjZXNzRmxhdEJ1ZmZlclRlc3QgYWJvdmUuCi0gIENoZWNrTW9uc3Rlck9iamVjdChtb25zdGVyMi5nZXQoKSk7Ci0KLSAgLy8gVGVzdCBvYmplY3QgY29weS4KLSAgYXV0byBtb25zdGVyMyA9ICptb25zdGVyMjsKLSAgZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyIGZiYjM7Ci0gIGZiYjMuRmluaXNoKENyZWF0ZU1vbnN0ZXIoZmJiMywgJm1vbnN0ZXIzLCAmcmVoYXNoZXIpLCBNb25zdGVySWRlbnRpZmllcigpKTsKLSAgY29uc3QgYXV0byBsZW4zID0gZmJiMy5HZXRTaXplKCk7Ci0gIFRFU1RfRVEobGVuMiwgbGVuMyk7Ci0gIFRFU1RfRVEobWVtY21wKGZiYjIuR2V0QnVmZmVyUG9pbnRlcigpLCBmYmIzLkdldEJ1ZmZlclBvaW50ZXIoKSwgbGVuMiksIDApOwotICAvLyBEZWxldGUgbW9uc3RlcjEgYW5kIG1vbnN0ZXIyLCB0aGVuIHRlc3QgYWNjZXNzaW5nIGZpZWxkcyBpbiBtb25zdGVyMy4KLSAgbW9uc3RlcjEucmVzZXQoKTsKLSAgbW9uc3RlcjIucmVzZXQoKTsKLSAgQ2hlY2tNb25zdGVyT2JqZWN0KCZtb25zdGVyMyk7Ci19Ci0KLS8vIFByZWZpeCBhIEZsYXRCdWZmZXIgd2l0aCBhIHNpemUgZmllbGQuCi12b2lkIFNpemVQcmVmaXhlZFRlc3QoKSB7Ci0gIC8vIENyZWF0ZSBzaXplIHByZWZpeGVkIGJ1ZmZlci4KLSAgZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyIGZiYjsKLSAgRmluaXNoU2l6ZVByZWZpeGVkTW9uc3RlckJ1ZmZlcigKLSAgICAgIGZiYiwgQ3JlYXRlTW9uc3RlcihmYmIsIDAsIDIwMCwgMzAwLCBmYmIuQ3JlYXRlU3RyaW5nKCJib2IiKSkpOwotCi0gIC8vIFZlcmlmeSBpdC4KLSAgZmxhdGJ1ZmZlcnM6OlZlcmlmaWVyIHZlcmlmaWVyKGZiYi5HZXRCdWZmZXJQb2ludGVyKCksIGZiYi5HZXRTaXplKCkpOwotICBURVNUX0VRKFZlcmlmeVNpemVQcmVmaXhlZE1vbnN0ZXJCdWZmZXIodmVyaWZpZXIpLCB0cnVlKTsKLQotICAvLyBBY2Nlc3MgaXQuCi0gIGF1dG8gbSA9IEdldFNpemVQcmVmaXhlZE1vbnN0ZXIoZmJiLkdldEJ1ZmZlclBvaW50ZXIoKSk7Ci0gIFRFU1RfRVEobS0+bWFuYSgpLCAyMDApOwotICBURVNUX0VRKG0tPmhwKCksIDMwMCk7Ci0gIFRFU1RfRVFfU1RSKG0tPm5hbWUoKS0+Y19zdHIoKSwgImJvYiIpOwotfQotCiB2b2lkIFRyaXZpYWxseUNvcHlhYmxlVGVzdCgpIHsKIC8vIGNsYW5nLWZvcm1hdCBvZmYKLSAgI2lmIF9fR05VR19fICYmIF9fR05VQ19fIDwgNQorICAjaWYgX19HTlVHX18gJiYgX19HTlVDX18gPCA1ICYmIFwKKyAgICAgICEoZGVmaW5lZChfX2NsYW5nX18pICYmIF9fY2xhbmdfbWFqb3JfXyA+PSAxNikKICAgICBURVNUX0VRKF9faGFzX3RyaXZpYWxfY29weShWZWMzKSwgdHJ1ZSk7CiAgICNlbHNlCiAgICAgI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKQEAgLTYyOSwxNjkzICs4MiwxOCBAQAogICAvLyBjbGFuZy1mb3JtYXQgb24KIH0KIAotLy8gQ2hlY2sgc3RyaW5naWZ5IG9mIGFuIGRlZmF1bHQgZW51bSB2YWx1ZSB0byBqc29uCi12b2lkIEpzb25EZWZhdWx0VGVzdCgpIHsKLSAgLy8gbG9hZCBGbGF0QnVmZmVyIHNjaGVtYSAoLmZicykgZnJvbSBkaXNrCi0gIHN0ZDo6c3RyaW5nIHNjaGVtYWZpbGU7Ci0gIFRFU1RfRVEoZmxhdGJ1ZmZlcnM6OkxvYWRGaWxlKCh0ZXN0X2RhdGFfcGF0aCArICJtb25zdGVyX3Rlc3QuZmJzIikuY19zdHIoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UsICZzY2hlbWFmaWxlKSwKLSAgICAgICAgICB0cnVlKTsKLSAgLy8gcGFyc2Ugc2NoZW1hIGZpcnN0LCBzbyB3ZSBjYW4gdXNlIGl0IHRvIHBhcnNlIHRoZSBkYXRhIGFmdGVyCi0gIGZsYXRidWZmZXJzOjpQYXJzZXIgcGFyc2VyOwotICBhdXRvIGluY2x1ZGVfdGVzdF9wYXRoID0KLSAgICAgIGZsYXRidWZmZXJzOjpDb25DYXRQYXRoRmlsZU5hbWUodGVzdF9kYXRhX3BhdGgsICJpbmNsdWRlX3Rlc3QiKTsKLSAgY29uc3QgY2hhciAqaW5jbHVkZV9kaXJlY3Rvcmllc1tdID0geyB0ZXN0X2RhdGFfcGF0aC5jX3N0cigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluY2x1ZGVfdGVzdF9wYXRoLmNfc3RyKCksIG51bGxwdHIgfTsKLQotICBURVNUX0VRKHBhcnNlci5QYXJzZShzY2hlbWFmaWxlLmNfc3RyKCksIGluY2x1ZGVfZGlyZWN0b3JpZXMpLCB0cnVlKTsKLSAgLy8gY3JlYXRlIGluY29tcGxldGUgbW9uc3RlciBhbmQgc3RvcmUgdG8ganNvbgotICBwYXJzZXIub3B0cy5vdXRwdXRfZGVmYXVsdF9zY2FsYXJzX2luX2pzb24gPSB0cnVlOwotICBwYXJzZXIub3B0cy5vdXRwdXRfZW51bV9pZGVudGlmaWVycyA9IHRydWU7Ci0gIGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciBidWlsZGVyOwotICBhdXRvIG5hbWUgPSBidWlsZGVyLkNyZWF0ZVN0cmluZygiZGVmYXVsdF9lbnVtIik7Ci0gIE1vbnN0ZXJCdWlsZGVyIGNvbG9yX21vbnN0ZXIoYnVpbGRlcik7Ci0gIGNvbG9yX21vbnN0ZXIuYWRkX25hbWUobmFtZSk7Ci0gIEZpbmlzaE1vbnN0ZXJCdWZmZXIoYnVpbGRlciwgY29sb3JfbW9uc3Rlci5GaW5pc2goKSk7Ci0gIHN0ZDo6c3RyaW5nIGpzb25nZW47Ci0gIGF1dG8gcmVzdWx0ID0gR2VuZXJhdGVUZXh0KHBhcnNlciwgYnVpbGRlci5HZXRCdWZmZXJQb2ludGVyKCksICZqc29uZ2VuKTsKLSAgVEVTVF9FUShyZXN1bHQsIHRydWUpOwotICAvLyBkZWZhdWx0IHZhbHVlIG9mIHRoZSAiY29sb3IiIGZpZWxkIGlzIEJsdWUKLSAgVEVTVF9FUShzdGQ6OnN0cmluZzo6bnBvcyAhPSBqc29uZ2VuLmZpbmQoImNvbG9yOiBcIkJsdWVcIiIpLCB0cnVlKTsKLSAgLy8gZGVmYXVsdCB2YWx1ZSBvZiB0aGUgInRlc3RmIiBmaWVsZCBpcyAzLjE0MTU5Ci0gIFRFU1RfRVEoc3RkOjpzdHJpbmc6Om5wb3MgIT0ganNvbmdlbi5maW5kKCJ0ZXN0ZjogMy4xNDE1OSIpLCB0cnVlKTsKLX0KLQotdm9pZCBKc29uRW51bXNUZXN0KCkgewotICAvLyBsb2FkIEZsYXRCdWZmZXIgc2NoZW1hICguZmJzKSBmcm9tIGRpc2sKLSAgc3RkOjpzdHJpbmcgc2NoZW1hZmlsZTsKLSAgVEVTVF9FUShmbGF0YnVmZmVyczo6TG9hZEZpbGUoKHRlc3RfZGF0YV9wYXRoICsgIm1vbnN0ZXJfdGVzdC5mYnMiKS5jX3N0cigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSwgJnNjaGVtYWZpbGUpLAotICAgICAgICAgIHRydWUpOwotICAvLyBwYXJzZSBzY2hlbWEgZmlyc3QsIHNvIHdlIGNhbiB1c2UgaXQgdG8gcGFyc2UgdGhlIGRhdGEgYWZ0ZXIKLSAgZmxhdGJ1ZmZlcnM6OlBhcnNlciBwYXJzZXI7Ci0gIGF1dG8gaW5jbHVkZV90ZXN0X3BhdGggPQotICAgICAgZmxhdGJ1ZmZlcnM6OkNvbkNhdFBhdGhGaWxlTmFtZSh0ZXN0X2RhdGFfcGF0aCwgImluY2x1ZGVfdGVzdCIpOwotICBjb25zdCBjaGFyICppbmNsdWRlX2RpcmVjdG9yaWVzW10gPSB7IHRlc3RfZGF0YV9wYXRoLmNfc3RyKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5jbHVkZV90ZXN0X3BhdGguY19zdHIoKSwgbnVsbHB0ciB9OwotICBwYXJzZXIub3B0cy5vdXRwdXRfZW51bV9pZGVudGlmaWVycyA9IHRydWU7Ci0gIFRFU1RfRVEocGFyc2VyLlBhcnNlKHNjaGVtYWZpbGUuY19zdHIoKSwgaW5jbHVkZV9kaXJlY3RvcmllcyksIHRydWUpOwotICBmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgYnVpbGRlcjsKLSAgYXV0byBuYW1lID0gYnVpbGRlci5DcmVhdGVTdHJpbmcoImJpdGZsYWdfZW51bSIpOwotICBNb25zdGVyQnVpbGRlciBjb2xvcl9tb25zdGVyKGJ1aWxkZXIpOwotICBjb2xvcl9tb25zdGVyLmFkZF9uYW1lKG5hbWUpOwotICBjb2xvcl9tb25zdGVyLmFkZF9jb2xvcihDb2xvcihDb2xvcl9CbHVlIHwgQ29sb3JfUmVkKSk7Ci0gIEZpbmlzaE1vbnN0ZXJCdWZmZXIoYnVpbGRlciwgY29sb3JfbW9uc3Rlci5GaW5pc2goKSk7Ci0gIHN0ZDo6c3RyaW5nIGpzb25nZW47Ci0gIGF1dG8gcmVzdWx0ID0gR2VuZXJhdGVUZXh0KHBhcnNlciwgYnVpbGRlci5HZXRCdWZmZXJQb2ludGVyKCksICZqc29uZ2VuKTsKLSAgVEVTVF9FUShyZXN1bHQsIHRydWUpOwotICBURVNUX0VRKHN0ZDo6c3RyaW5nOjpucG9zICE9IGpzb25nZW4uZmluZCgiY29sb3I6IFwiUmVkIEJsdWVcIiIpLCB0cnVlKTsKLSAgLy8gVGVzdCBmb3J3YXJkIGNvbXBhdGliaWxpdHkgd2l0aCAnb3V0cHV0X2VudW1faWRlbnRpZmllcnMgPSB0cnVlJy4KLSAgLy8gQ3VycmVudCBDb2xvciBkb2Vzbid0IGhhdmUgJygxdSA8PCAyKScgZmllbGQsIGxldCdzIGFkZCBpdC4KLSAgYnVpbGRlci5DbGVhcigpOwotICBzdGQ6OnN0cmluZyBmdXR1cmVfanNvbjsKLSAgYXV0byBmdXR1cmVfbmFtZSA9IGJ1aWxkZXIuQ3JlYXRlU3RyaW5nKCJmdXR1cmUgYml0ZmxhZ19lbnVtIik7Ci0gIE1vbnN0ZXJCdWlsZGVyIGZ1dHVyZV9jb2xvcihidWlsZGVyKTsKLSAgZnV0dXJlX2NvbG9yLmFkZF9uYW1lKGZ1dHVyZV9uYW1lKTsKLSAgZnV0dXJlX2NvbG9yLmFkZF9jb2xvcigKLSAgICAgIHN0YXRpY19jYXN0PENvbG9yPigoMXUgPDwgMikgfCBDb2xvcl9CbHVlIHwgQ29sb3JfUmVkKSk7Ci0gIEZpbmlzaE1vbnN0ZXJCdWZmZXIoYnVpbGRlciwgZnV0dXJlX2NvbG9yLkZpbmlzaCgpKTsKLSAgcmVzdWx0ID0gR2VuZXJhdGVUZXh0KHBhcnNlciwgYnVpbGRlci5HZXRCdWZmZXJQb2ludGVyKCksICZmdXR1cmVfanNvbik7Ci0gIFRFU1RfRVEocmVzdWx0LCB0cnVlKTsKLSAgVEVTVF9FUShzdGQ6OnN0cmluZzo6bnBvcyAhPSBmdXR1cmVfanNvbi5maW5kKCJjb2xvcjogMTMiKSwgdHJ1ZSk7Ci19Ci0KLSNpZiBkZWZpbmVkKEZMQVRCVUZGRVJTX0hBU19ORVdfU1RSVE9EKSAmJiAoRkxBVEJVRkZFUlNfSEFTX05FV19TVFJUT0QgPiAwKQotLy8gVGhlIElFRUUtNzU0IHF1aWV0X05hTiBpcyBub3Qgc2ltcGxlIGJpbmFyeSBjb25zdGFudC4KLS8vIEFsbCBiaW5hcnkgTmFOIGJpdCBzdHJpbmdzIGhhdmUgYWxsIHRoZSBiaXRzIG9mIHRoZSBiaWFzZWQgZXhwb25lbnQgZmllbGQgRQotLy8gc2V0IHRvIDEuIEEgcXVpZXQgTmFOIGJpdCBzdHJpbmcgc2hvdWxkIGJlIGVuY29kZWQgd2l0aCB0aGUgZmlyc3QgYml0IGRbMV0KLS8vIG9mIHRoZSB0cmFpbGluZyBzaWduaWZpY2FuZCBmaWVsZCBUIGJlaW5nIDEgKGRbMF0gaXMgaW1wbGljaXQgYml0KS4KLS8vIEl0IGlzIGFzc3VtZWQgdGhhdCBlbmRpYW5uZXNzIG9mIGZsb2F0aW5nLXBvaW50IGlzIHNhbWUgYXMgaW50ZWdlci4KLXRlbXBsYXRlPHR5cGVuYW1lIFQsIHR5cGVuYW1lIFUsIFUgcW5hbl9iYXNlPiBib29sIGlzX3F1aWV0X25hbl9pbXBsKFQgdikgewotICBzdGF0aWNfYXNzZXJ0KHNpemVvZihUKSA9PSBzaXplb2YoVSksICJ1bmV4cGVjdGVkIik7Ci0gIFUgYiA9IDA7Ci0gIHN0ZDo6bWVtY3B5KCZiLCAmdiwgc2l6ZW9mKFQpKTsKLSAgcmV0dXJuICgoYiAmIHFuYW5fYmFzZSkgPT0gcW5hbl9iYXNlKTsKLX0KLSMgIGlmIGRlZmluZWQoX19taXBzX18pIHx8IGRlZmluZWQoX19ocHBhX18pCi1zdGF0aWMgYm9vbCBpc19xdWlldF9uYW4oZmxvYXQgdikgewotICByZXR1cm4gaXNfcXVpZXRfbmFuX2ltcGw8ZmxvYXQsIHVpbnQzMl90LCAweDdGQzAwMDAwdT4odikgfHwKLSAgICAgICAgIGlzX3F1aWV0X25hbl9pbXBsPGZsb2F0LCB1aW50MzJfdCwgMHg3RkJGRkZGRnU+KHYpOwotfQotc3RhdGljIGJvb2wgaXNfcXVpZXRfbmFuKGRvdWJsZSB2KSB7Ci0gIHJldHVybiBpc19xdWlldF9uYW5faW1wbDxkb3VibGUsIHVpbnQ2NF90LCAweDdGRjgwMDAwMDAwMDAwMDB1bD4odikgfHwKLSAgICAgICAgIGlzX3F1aWV0X25hbl9pbXBsPGRvdWJsZSwgdWludDY0X3QsIDB4N0ZGN0ZGRkZGRkZGRkZGRnU+KHYpOwotfQotIyAgZWxzZQotc3RhdGljIGJvb2wgaXNfcXVpZXRfbmFuKGZsb2F0IHYpIHsKLSAgcmV0dXJuIGlzX3F1aWV0X25hbl9pbXBsPGZsb2F0LCB1aW50MzJfdCwgMHg3RkMwMDAwMHU+KHYpOwotfQotc3RhdGljIGJvb2wgaXNfcXVpZXRfbmFuKGRvdWJsZSB2KSB7Ci0gIHJldHVybiBpc19xdWlldF9uYW5faW1wbDxkb3VibGUsIHVpbnQ2NF90LCAweDdGRjgwMDAwMDAwMDAwMDB1bD4odik7Ci19Ci0jICBlbmRpZgotCi12b2lkIFRlc3RNb25zdGVyRXh0cmFGbG9hdHMoKSB7Ci0gIFRFU1RfRVEoaXNfcXVpZXRfbmFuKDEuMCksIGZhbHNlKTsKLSAgVEVTVF9FUShpc19xdWlldF9uYW4oaW5maW5pdHlfZCksIGZhbHNlKTsKLSAgVEVTVF9FUShpc19xdWlldF9uYW4oLWluZmluaXR5X2YpLCBmYWxzZSk7Ci0gIFRFU1RfRVEoaXNfcXVpZXRfbmFuKHN0ZDo6bnVtZXJpY19saW1pdHM8ZmxvYXQ+OjpxdWlldF9OYU4oKSksIHRydWUpOwotICBURVNUX0VRKGlzX3F1aWV0X25hbihzdGQ6Om51bWVyaWNfbGltaXRzPGRvdWJsZT46OnF1aWV0X05hTigpKSwgdHJ1ZSk7Ci0KLSAgdXNpbmcgbmFtZXNwYWNlIGZsYXRidWZmZXJzOwotICB1c2luZyBuYW1lc3BhY2UgTXlHYW1lOwotICAvLyBMb2FkIEZsYXRCdWZmZXIgc2NoZW1hICguZmJzKSBmcm9tIGRpc2suCi0gIHN0ZDo6c3RyaW5nIHNjaGVtYWZpbGU7Ci0gIFRFU1RfRVEoTG9hZEZpbGUoKHRlc3RfZGF0YV9wYXRoICsgIm1vbnN0ZXJfZXh0cmEuZmJzIikuY19zdHIoKSwgZmFsc2UsCi0gICAgICAgICAgICAgICAgICAgJnNjaGVtYWZpbGUpLAotICAgICAgICAgIHRydWUpOwotICAvLyBQYXJzZSBzY2hlbWEgZmlyc3QsIHNvIHdlIGNhbiB1c2UgaXQgdG8gcGFyc2UgdGhlIGRhdGEgYWZ0ZXIuCi0gIFBhcnNlciBwYXJzZXI7Ci0gIGF1dG8gaW5jbHVkZV90ZXN0X3BhdGggPSBDb25DYXRQYXRoRmlsZU5hbWUodGVzdF9kYXRhX3BhdGgsICJpbmNsdWRlX3Rlc3QiKTsKLSAgY29uc3QgY2hhciAqaW5jbHVkZV9kaXJlY3Rvcmllc1tdID0geyB0ZXN0X2RhdGFfcGF0aC5jX3N0cigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluY2x1ZGVfdGVzdF9wYXRoLmNfc3RyKCksIG51bGxwdHIgfTsKLSAgVEVTVF9FUShwYXJzZXIuUGFyc2Uoc2NoZW1hZmlsZS5jX3N0cigpLCBpbmNsdWRlX2RpcmVjdG9yaWVzKSwgdHJ1ZSk7Ci0gIC8vIENyZWF0ZSBlbXB0eSBleHRyYSBhbmQgc3RvcmUgdG8ganNvbi4KLSAgcGFyc2VyLm9wdHMub3V0cHV0X2RlZmF1bHRfc2NhbGFyc19pbl9qc29uID0gdHJ1ZTsKLSAgcGFyc2VyLm9wdHMub3V0cHV0X2VudW1faWRlbnRpZmllcnMgPSB0cnVlOwotICBGbGF0QnVmZmVyQnVpbGRlciBidWlsZGVyOwotICBjb25zdCBhdXRvIGRlZl9yb290ID0gTW9uc3RlckV4dHJhQnVpbGRlcihidWlsZGVyKS5GaW5pc2goKTsKLSAgRmluaXNoTW9uc3RlckV4dHJhQnVmZmVyKGJ1aWxkZXIsIGRlZl9yb290KTsKLSAgY29uc3QgYXV0byBkZWZfb2JqID0gYnVpbGRlci5HZXRCdWZmZXJQb2ludGVyKCk7Ci0gIGNvbnN0IGF1dG8gZGVmX2V4dHJhID0gR2V0TW9uc3RlckV4dHJhKGRlZl9vYmopOwotICBURVNUX05PVE5VTEwoZGVmX2V4dHJhKTsKLSAgVEVTVF9FUShpc19xdWlldF9uYW4oZGVmX2V4dHJhLT5mMCgpKSwgdHJ1ZSk7Ci0gIFRFU1RfRVEoaXNfcXVpZXRfbmFuKGRlZl9leHRyYS0+ZjEoKSksIHRydWUpOwotICBURVNUX0VRKGRlZl9leHRyYS0+ZjIoKSwgK2luZmluaXR5X2YpOwotICBURVNUX0VRKGRlZl9leHRyYS0+ZjMoKSwgLWluZmluaXR5X2YpOwotICBURVNUX0VRKGlzX3F1aWV0X25hbihkZWZfZXh0cmEtPmQwKCkpLCB0cnVlKTsKLSAgVEVTVF9FUShpc19xdWlldF9uYW4oZGVmX2V4dHJhLT5kMSgpKSwgdHJ1ZSk7Ci0gIFRFU1RfRVEoZGVmX2V4dHJhLT5kMigpLCAraW5maW5pdHlfZCk7Ci0gIFRFU1RfRVEoZGVmX2V4dHJhLT5kMygpLCAtaW5maW5pdHlfZCk7Ci0gIHN0ZDo6c3RyaW5nIGpzb25nZW47Ci0gIGF1dG8gcmVzdWx0ID0gR2VuZXJhdGVUZXh0KHBhcnNlciwgZGVmX29iaiwgJmpzb25nZW4pOwotICBURVNUX0VRKHJlc3VsdCwgdHJ1ZSk7Ci0gIC8vIENoZWNrIGV4cGVjdGVkIGRlZmF1bHQgdmFsdWVzLgotICBURVNUX0VRKHN0ZDo6c3RyaW5nOjpucG9zICE9IGpzb25nZW4uZmluZCgiZjA6IG5hbiIpLCB0cnVlKTsKLSAgVEVTVF9FUShzdGQ6OnN0cmluZzo6bnBvcyAhPSBqc29uZ2VuLmZpbmQoImYxOiBuYW4iKSwgdHJ1ZSk7Ci0gIFRFU1RfRVEoc3RkOjpzdHJpbmc6Om5wb3MgIT0ganNvbmdlbi5maW5kKCJmMjogaW5mIiksIHRydWUpOwotICBURVNUX0VRKHN0ZDo6c3RyaW5nOjpucG9zICE9IGpzb25nZW4uZmluZCgiZjM6IC1pbmYiKSwgdHJ1ZSk7Ci0gIFRFU1RfRVEoc3RkOjpzdHJpbmc6Om5wb3MgIT0ganNvbmdlbi5maW5kKCJkMDogbmFuIiksIHRydWUpOwotICBURVNUX0VRKHN0ZDo6c3RyaW5nOjpucG9zICE9IGpzb25nZW4uZmluZCgiZDE6IG5hbiIpLCB0cnVlKTsKLSAgVEVTVF9FUShzdGQ6OnN0cmluZzo6bnBvcyAhPSBqc29uZ2VuLmZpbmQoImQyOiBpbmYiKSwgdHJ1ZSk7Ci0gIFRFU1RfRVEoc3RkOjpzdHJpbmc6Om5wb3MgIT0ganNvbmdlbi5maW5kKCJkMzogLWluZiIpLCB0cnVlKTsKLSAgLy8gUGFyc2UgJ21vc3RlcmRhdGFfZXh0cmEuanNvbicuCi0gIGNvbnN0IGF1dG8gZXh0cmFfYmFzZSA9IHRlc3RfZGF0YV9wYXRoICsgIm1vbnN0ZXJkYXRhX2V4dHJhIjsKLSAganNvbmdlbiA9ICIiOwotICBURVNUX0VRKExvYWRGaWxlKChleHRyYV9iYXNlICsgIi5qc29uIikuY19zdHIoKSwgZmFsc2UsICZqc29uZ2VuKSwgdHJ1ZSk7Ci0gIFRFU1RfRVEocGFyc2VyLlBhcnNlKGpzb25nZW4uY19zdHIoKSksIHRydWUpOwotICBjb25zdCBhdXRvIHRlc3RfZmlsZSA9IHBhcnNlci5idWlsZGVyXy5HZXRCdWZmZXJQb2ludGVyKCk7Ci0gIGNvbnN0IGF1dG8gdGVzdF9zaXplID0gcGFyc2VyLmJ1aWxkZXJfLkdldFNpemUoKTsKLSAgVmVyaWZpZXIgdmVyaWZpZXIodGVzdF9maWxlLCB0ZXN0X3NpemUpOwotICBURVNUX0FTU0VSVChWZXJpZnlNb25zdGVyRXh0cmFCdWZmZXIodmVyaWZpZXIpKTsKLSAgY29uc3QgYXV0byBleHRyYSA9IEdldE1vbnN0ZXJFeHRyYSh0ZXN0X2ZpbGUpOwotICBURVNUX05PVE5VTEwoZXh0cmEpOwotICBURVNUX0VRKGlzX3F1aWV0X25hbihleHRyYS0+ZjAoKSksIHRydWUpOwotICBURVNUX0VRKGlzX3F1aWV0X25hbihleHRyYS0+ZjEoKSksIHRydWUpOwotICBURVNUX0VRKGV4dHJhLT5mMigpLCAraW5maW5pdHlfZik7Ci0gIFRFU1RfRVEoZXh0cmEtPmYzKCksIC1pbmZpbml0eV9mKTsKLSAgVEVTVF9FUShpc19xdWlldF9uYW4oZXh0cmEtPmQwKCkpLCB0cnVlKTsKLSAgVEVTVF9FUShleHRyYS0+ZDEoKSwgK2luZmluaXR5X2QpOwotICBURVNUX0VRKGV4dHJhLT5kMigpLCAtaW5maW5pdHlfZCk7Ci0gIFRFU1RfRVEoaXNfcXVpZXRfbmFuKGV4dHJhLT5kMygpKSwgdHJ1ZSk7Ci0gIFRFU1RfTk9UTlVMTChleHRyYS0+ZnZlYygpKTsKLSAgVEVTVF9FUShleHRyYS0+ZnZlYygpLT5zaXplKCksIDQpOwotICBURVNUX0VRKGV4dHJhLT5mdmVjKCktPkdldCgwKSwgMS4wZik7Ci0gIFRFU1RfRVEoZXh0cmEtPmZ2ZWMoKS0+R2V0KDEpLCAtaW5maW5pdHlfZik7Ci0gIFRFU1RfRVEoZXh0cmEtPmZ2ZWMoKS0+R2V0KDIpLCAraW5maW5pdHlfZik7Ci0gIFRFU1RfRVEoaXNfcXVpZXRfbmFuKGV4dHJhLT5mdmVjKCktPkdldCgzKSksIHRydWUpOwotICBURVNUX05PVE5VTEwoZXh0cmEtPmR2ZWMoKSk7Ci0gIFRFU1RfRVEoZXh0cmEtPmR2ZWMoKS0+c2l6ZSgpLCA0KTsKLSAgVEVTVF9FUShleHRyYS0+ZHZlYygpLT5HZXQoMCksIDIuMCk7Ci0gIFRFU1RfRVEoZXh0cmEtPmR2ZWMoKS0+R2V0KDEpLCAraW5maW5pdHlfZCk7Ci0gIFRFU1RfRVEoZXh0cmEtPmR2ZWMoKS0+R2V0KDIpLCAtaW5maW5pdHlfZCk7Ci0gIFRFU1RfRVEoaXNfcXVpZXRfbmFuKGV4dHJhLT5kdmVjKCktPkdldCgzKSksIHRydWUpOwotfQotI2Vsc2UKLXZvaWQgVGVzdE1vbnN0ZXJFeHRyYUZsb2F0cygpIHt9Ci0jZW5kaWYKLQotLy8gZXhhbXBsZSBvZiBwYXJzaW5nIHRleHQgc3RyYWlnaHQgaW50byBhIGJ1ZmZlciwgYW5kIGdlbmVyYXRpbmcKLS8vIHRleHQgYmFjayBmcm9tIGl0Ogotdm9pZCBQYXJzZUFuZEdlbmVyYXRlVGV4dFRlc3QoYm9vbCBiaW5hcnkpIHsKLSAgLy8gbG9hZCBGbGF0QnVmZmVyIHNjaGVtYSAoLmZicykgYW5kIEpTT04gZnJvbSBkaXNrCi0gIHN0ZDo6c3RyaW5nIHNjaGVtYWZpbGU7Ci0gIHN0ZDo6c3RyaW5nIGpzb25maWxlOwotICBURVNUX0VRKGZsYXRidWZmZXJzOjpMb2FkRmlsZSgKLSAgICAgICAgICAgICAgKHRlc3RfZGF0YV9wYXRoICsgIm1vbnN0ZXJfdGVzdC4iICsgKGJpbmFyeSA/ICJiZmJzIiA6ICJmYnMiKSkKLSAgICAgICAgICAgICAgICAgIC5jX3N0cigpLAotICAgICAgICAgICAgICBiaW5hcnksICZzY2hlbWFmaWxlKSwKLSAgICAgICAgICB0cnVlKTsKLSAgVEVTVF9FUShmbGF0YnVmZmVyczo6TG9hZEZpbGUoCi0gICAgICAgICAgICAgICh0ZXN0X2RhdGFfcGF0aCArICJtb25zdGVyZGF0YV90ZXN0LmdvbGRlbiIpLmNfc3RyKCksIGZhbHNlLAotICAgICAgICAgICAgICAmanNvbmZpbGUpLAotICAgICAgICAgIHRydWUpOwotCi0gIGF1dG8gaW5jbHVkZV90ZXN0X3BhdGggPQotICAgICAgZmxhdGJ1ZmZlcnM6OkNvbkNhdFBhdGhGaWxlTmFtZSh0ZXN0X2RhdGFfcGF0aCwgImluY2x1ZGVfdGVzdCIpOwotICBjb25zdCBjaGFyICppbmNsdWRlX2RpcmVjdG9yaWVzW10gPSB7IHRlc3RfZGF0YV9wYXRoLmNfc3RyKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5jbHVkZV90ZXN0X3BhdGguY19zdHIoKSwgbnVsbHB0ciB9OwotCi0gIC8vIHBhcnNlIHNjaGVtYSBmaXJzdCwgc28gd2UgY2FuIHVzZSBpdCB0byBwYXJzZSB0aGUgZGF0YSBhZnRlcgotICBmbGF0YnVmZmVyczo6UGFyc2VyIHBhcnNlcjsKLSAgaWYgKGJpbmFyeSkgewotICAgIGZsYXRidWZmZXJzOjpWZXJpZmllciB2ZXJpZmllcigKLSAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90ICo+KHNjaGVtYWZpbGUuY19zdHIoKSksCi0gICAgICAgIHNjaGVtYWZpbGUuc2l6ZSgpKTsKLSAgICBURVNUX0VRKHJlZmxlY3Rpb246OlZlcmlmeVNjaGVtYUJ1ZmZlcih2ZXJpZmllciksIHRydWUpOwotICAgIC8vIGF1dG8gc2NoZW1hID0gcmVmbGVjdGlvbjo6R2V0U2NoZW1hKHNjaGVtYWZpbGUuY19zdHIoKSk7Ci0gICAgVEVTVF9FUShwYXJzZXIuRGVzZXJpYWxpemUoKGNvbnN0IHVpbnQ4X3QgKilzY2hlbWFmaWxlLmNfc3RyKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NoZW1hZmlsZS5zaXplKCkpLAotICAgICAgICAgICAgdHJ1ZSk7Ci0gIH0gZWxzZSB7Ci0gICAgVEVTVF9FUShwYXJzZXIuUGFyc2Uoc2NoZW1hZmlsZS5jX3N0cigpLCBpbmNsdWRlX2RpcmVjdG9yaWVzKSwgdHJ1ZSk7Ci0gIH0KLSAgVEVTVF9FUShwYXJzZXIuUGFyc2VKc29uKGpzb25maWxlLmNfc3RyKCkpLCB0cnVlKTsKLQotICAvLyBoZXJlLCBwYXJzZXIuYnVpbGRlcl8gY29udGFpbnMgYSBiaW5hcnkgYnVmZmVyIHRoYXQgaXMgdGhlIHBhcnNlZCBkYXRhLgotCi0gIC8vIEZpcnN0LCB2ZXJpZnkgaXQsIGp1c3QgaW4gY2FzZToKLSAgZmxhdGJ1ZmZlcnM6OlZlcmlmaWVyIHZlcmlmaWVyKHBhcnNlci5idWlsZGVyXy5HZXRCdWZmZXJQb2ludGVyKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJzZXIuYnVpbGRlcl8uR2V0U2l6ZSgpKTsKLSAgVEVTVF9FUShWZXJpZnlNb25zdGVyQnVmZmVyKHZlcmlmaWVyKSwgdHJ1ZSk7Ci0KLSAgQWNjZXNzRmxhdEJ1ZmZlclRlc3QocGFyc2VyLmJ1aWxkZXJfLkdldEJ1ZmZlclBvaW50ZXIoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VyLmJ1aWxkZXJfLkdldFNpemUoKSwgZmFsc2UpOwotCi0gIC8vIHRvIGVuc3VyZSBpdCBpcyBjb3JyZWN0LCB3ZSBub3cgZ2VuZXJhdGUgdGV4dCBiYWNrIGZyb20gdGhlIGJpbmFyeSwKLSAgLy8gYW5kIGNvbXBhcmUgdGhlIHR3bzoKLSAgc3RkOjpzdHJpbmcganNvbmdlbjsKLSAgYXV0byByZXN1bHQgPQotICAgICAgR2VuZXJhdGVUZXh0KHBhcnNlciwgcGFyc2VyLmJ1aWxkZXJfLkdldEJ1ZmZlclBvaW50ZXIoKSwgJmpzb25nZW4pOwotICBURVNUX0VRKHJlc3VsdCwgdHJ1ZSk7Ci0gIFRFU1RfRVFfU1RSKGpzb25nZW4uY19zdHIoKSwganNvbmZpbGUuY19zdHIoKSk7Ci0KLSAgLy8gV2UgY2FuIGFsc28gZG8gdGhlIGFib3ZlIHVzaW5nIHRoZSBjb252ZW5pZW50IFJlZ2lzdHJ5IHRoYXQga25vd3MgYWJvdXQKLSAgLy8gYSBzZXQgb2YgZmlsZV9pZGVudGlmaWVycyBtYXBwZWQgdG8gc2NoZW1hcy4KLSAgZmxhdGJ1ZmZlcnM6OlJlZ2lzdHJ5IHJlZ2lzdHJ5OwotICAvLyBNYWtlIHN1cmUgc2NoZW1hcyBjYW4gZmluZCB0aGVpciBpbmNsdWRlcy4KLSAgcmVnaXN0cnkuQWRkSW5jbHVkZURpcmVjdG9yeSh0ZXN0X2RhdGFfcGF0aC5jX3N0cigpKTsKLSAgcmVnaXN0cnkuQWRkSW5jbHVkZURpcmVjdG9yeShpbmNsdWRlX3Rlc3RfcGF0aC5jX3N0cigpKTsKLSAgLy8gQ2FsbCB0aGlzIHdpdGggbWFueSBzY2hlbWFzIGlmIHBvc3NpYmxlLgotICByZWdpc3RyeS5SZWdpc3RlcihNb25zdGVySWRlbnRpZmllcigpLAotICAgICAgICAgICAgICAgICAgICAodGVzdF9kYXRhX3BhdGggKyAibW9uc3Rlcl90ZXN0LmZicyIpLmNfc3RyKCkpOwotICAvLyBOb3cgd2UgZ290IHRoaXMgc2V0IHVwLCB3ZSBjYW4gcGFyc2UgYnkganVzdCBzcGVjaWZ5aW5nIHRoZSBpZGVudGlmaWVyLAotICAvLyB0aGUgY29ycmVjdCBzY2hlbWEgd2lsbCBiZSBsb2FkZWQgb24gdGhlIGZseToKLSAgYXV0byBidWYgPSByZWdpc3RyeS5UZXh0VG9GbGF0QnVmZmVyKGpzb25maWxlLmNfc3RyKCksIE1vbnN0ZXJJZGVudGlmaWVyKCkpOwotICAvLyBJZiB0aGlzIGZhaWxzLCBjaGVjayByZWdpc3RyeS5sYXN0ZXJyb3JfLgotICBURVNUX05PVE5VTEwoYnVmLmRhdGEoKSk7Ci0gIC8vIFRlc3QgdGhlIGJ1ZmZlciwgdG8gYmUgc3VyZToKLSAgQWNjZXNzRmxhdEJ1ZmZlclRlc3QoYnVmLmRhdGEoKSwgYnVmLnNpemUoKSwgZmFsc2UpOwotICAvLyBXZSBjYW4gdXNlIHRoZSByZWdpc3RyeSB0byB0dXJuIHRoaXMgYmFjayBpbnRvIHRleHQsIGluIHRoaXMgY2FzZSBpdAotICAvLyB3aWxsIGdldCB0aGUgZmlsZV9pZGVudGlmaWVyIGZyb20gdGhlIGJpbmFyeToKLSAgc3RkOjpzdHJpbmcgdGV4dDsKLSAgYXV0byBvayA9IHJlZ2lzdHJ5LkZsYXRCdWZmZXJUb1RleHQoYnVmLmRhdGEoKSwgYnVmLnNpemUoKSwgJnRleHQpOwotICAvLyBJZiB0aGlzIGZhaWxzLCBjaGVjayByZWdpc3RyeS5sYXN0ZXJyb3JfLgotICBURVNUX0VRKG9rLCB0cnVlKTsKLSAgVEVTVF9FUV9TVFIodGV4dC5jX3N0cigpLCBqc29uZmlsZS5jX3N0cigpKTsKLQotICAvLyBHZW5lcmF0ZSB0ZXh0IGZvciBVVEYtOCBzdHJpbmdzIHdpdGhvdXQgZXNjYXBlcy4KLSAgc3RkOjpzdHJpbmcganNvbmZpbGVfdXRmODsKLSAgVEVTVF9FUShmbGF0YnVmZmVyczo6TG9hZEZpbGUoKHRlc3RfZGF0YV9wYXRoICsgInVuaWNvZGVfdGVzdC5qc29uIikuY19zdHIoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UsICZqc29uZmlsZV91dGY4KSwKLSAgICAgICAgICB0cnVlKTsKLSAgVEVTVF9FUShwYXJzZXIuUGFyc2UoanNvbmZpbGVfdXRmOC5jX3N0cigpLCBpbmNsdWRlX2RpcmVjdG9yaWVzKSwgdHJ1ZSk7Ci0gIC8vIFRvIGVuc3VyZSBpdCBpcyBjb3JyZWN0LCBnZW5lcmF0ZSB1dGYtOCB0ZXh0IGJhY2sgZnJvbSB0aGUgYmluYXJ5LgotICBzdGQ6OnN0cmluZyBqc29uZ2VuX3V0Zjg7Ci0gIC8vIHJlcXVlc3QgbmF0dXJhbCBwcmludGluZyBmb3IgdXRmLTggc3RyaW5ncwotICBwYXJzZXIub3B0cy5uYXR1cmFsX3V0ZjggPSB0cnVlOwotICBwYXJzZXIub3B0cy5zdHJpY3RfanNvbiA9IHRydWU7Ci0gIFRFU1RfRVEoCi0gICAgICBHZW5lcmF0ZVRleHQocGFyc2VyLCBwYXJzZXIuYnVpbGRlcl8uR2V0QnVmZmVyUG9pbnRlcigpLCAmanNvbmdlbl91dGY4KSwKLSAgICAgIHRydWUpOwotICBURVNUX0VRX1NUUihqc29uZ2VuX3V0ZjguY19zdHIoKSwganNvbmZpbGVfdXRmOC5jX3N0cigpKTsKLX0KLQotdm9pZCBSZWZsZWN0aW9uVGVzdCh1aW50OF90ICpmbGF0YnVmLCBzaXplX3QgbGVuZ3RoKSB7Ci0gIC8vIExvYWQgYSBiaW5hcnkgc2NoZW1hLgotICBzdGQ6OnN0cmluZyBiZmJzZmlsZTsKLSAgVEVTVF9FUShmbGF0YnVmZmVyczo6TG9hZEZpbGUoKHRlc3RfZGF0YV9wYXRoICsgIm1vbnN0ZXJfdGVzdC5iZmJzIikuY19zdHIoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSwgJmJmYnNmaWxlKSwKLSAgICAgICAgICB0cnVlKTsKLQotICAvLyBWZXJpZnkgaXQsIGp1c3QgaW4gY2FzZToKLSAgZmxhdGJ1ZmZlcnM6OlZlcmlmaWVyIHZlcmlmaWVyKAotICAgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90ICo+KGJmYnNmaWxlLmNfc3RyKCkpLCBiZmJzZmlsZS5sZW5ndGgoKSk7Ci0gIFRFU1RfRVEocmVmbGVjdGlvbjo6VmVyaWZ5U2NoZW1hQnVmZmVyKHZlcmlmaWVyKSwgdHJ1ZSk7Ci0KLSAgLy8gTWFrZSBzdXJlIHRoZSBzY2hlbWEgaXMgd2hhdCB3ZSBleHBlY3QgaXQgdG8gYmUuCi0gIGF1dG8gJnNjaGVtYSA9ICpyZWZsZWN0aW9uOjpHZXRTY2hlbWEoYmZic2ZpbGUuY19zdHIoKSk7Ci0gIGF1dG8gcm9vdF90YWJsZSA9IHNjaGVtYS5yb290X3RhYmxlKCk7Ci0KLSAgLy8gQ2hlY2sgdGhlIGRlY2xhcmF0aW9uIGZpbGVzLgotICBURVNUX0VRX1NUUihyb290X3RhYmxlLT5uYW1lKCktPmNfc3RyKCksICJNeUdhbWUuRXhhbXBsZS5Nb25zdGVyIik7Ci0gIFRFU1RfRVFfU1RSKHJvb3RfdGFibGUtPmRlY2xhcmF0aW9uX2ZpbGUoKS0+Y19zdHIoKSwgIi8vbW9uc3Rlcl90ZXN0LmZicyIpOwotICBURVNUX0VRX1NUUigKLSAgICAgIHNjaGVtYS5vYmplY3RzKCktPkxvb2t1cEJ5S2V5KCJUYWJsZUEiKS0+ZGVjbGFyYXRpb25fZmlsZSgpLT5jX3N0cigpLAotICAgICAgIi8vaW5jbHVkZV90ZXN0L2luY2x1ZGVfdGVzdDEuZmJzIik7Ci0gIFRFU1RfRVFfU1RSKHNjaGVtYS5vYmplY3RzKCkKLSAgICAgICAgICAgICAgICAgIC0+TG9va3VwQnlLZXkoIk15R2FtZS5PdGhlck5hbWVTcGFjZS5VbnVzZWQiKQotICAgICAgICAgICAgICAgICAgLT5kZWNsYXJhdGlvbl9maWxlKCkKLSAgICAgICAgICAgICAgICAgIC0+Y19zdHIoKSwKLSAgICAgICAgICAgICAgIi8vaW5jbHVkZV90ZXN0L3N1Yi9pbmNsdWRlX3Rlc3QyLmZicyIpOwotICBURVNUX0VRX1NUUihzY2hlbWEuZW51bXMoKQotICAgICAgICAgICAgICAgICAgLT5Mb29rdXBCeUtleSgiTXlHYW1lLk90aGVyTmFtZVNwYWNlLkZyb21JbmNsdWRlIikKLSAgICAgICAgICAgICAgICAgIC0+ZGVjbGFyYXRpb25fZmlsZSgpCi0gICAgICAgICAgICAgICAgICAtPmNfc3RyKCksCi0gICAgICAgICAgICAgICIvL2luY2x1ZGVfdGVzdC9zdWIvaW5jbHVkZV90ZXN0Mi5mYnMiKTsKLQotICAvLyBDaGVjayBzY2hlYW0gZmlsZW5hbWVzIGFuZCB0aGVpciBpbmNsdWRlcy4KLSAgVEVTVF9FUShzY2hlbWEuZmJzX2ZpbGVzKCktPnNpemUoKSwgMyk7Ci0KLSAgY29uc3QgYXV0byBmYnMwID0gc2NoZW1hLmZic19maWxlcygpLT5HZXQoMCk7Ci0gIFRFU1RfRVFfU1RSKGZiczAtPmZpbGVuYW1lKCktPmNfc3RyKCksICIvL2luY2x1ZGVfdGVzdC9pbmNsdWRlX3Rlc3QxLmZicyIpOwotICBjb25zdCBhdXRvIGZiczBfaW5jbHVkZXMgPSBmYnMwLT5pbmNsdWRlZF9maWxlbmFtZXMoKTsKLSAgVEVTVF9FUShmYnMwX2luY2x1ZGVzLT5zaXplKCksIDIpOwotCi0gIC8vIFRPRE8oY2FzcGVybik6IFNob3VsZCB3ZSBmb3JjZSBvciBkaXNhbGxvdyBpbmNsdXNpb24gb2Ygc2VsZj8KLSAgVEVTVF9FUV9TVFIoZmJzMF9pbmNsdWRlcy0+R2V0KDApLT5jX3N0cigpLAotICAgICAgICAgICAgICAiLy9pbmNsdWRlX3Rlc3QvaW5jbHVkZV90ZXN0MS5mYnMiKTsKLSAgVEVTVF9FUV9TVFIoZmJzMF9pbmNsdWRlcy0+R2V0KDEpLT5jX3N0cigpLAotICAgICAgICAgICAgICAiLy9pbmNsdWRlX3Rlc3Qvc3ViL2luY2x1ZGVfdGVzdDIuZmJzIik7Ci0KLSAgY29uc3QgYXV0byBmYnMxID0gc2NoZW1hLmZic19maWxlcygpLT5HZXQoMSk7Ci0gIFRFU1RfRVFfU1RSKGZiczEtPmZpbGVuYW1lKCktPmNfc3RyKCksCi0gICAgICAgICAgICAgICIvL2luY2x1ZGVfdGVzdC9zdWIvaW5jbHVkZV90ZXN0Mi5mYnMiKTsKLSAgY29uc3QgYXV0byBmYnMxX2luY2x1ZGVzID0gZmJzMS0+aW5jbHVkZWRfZmlsZW5hbWVzKCk7Ci0gIFRFU1RfRVEoZmJzMV9pbmNsdWRlcy0+c2l6ZSgpLCAyKTsKLSAgVEVTVF9FUV9TVFIoZmJzMV9pbmNsdWRlcy0+R2V0KDApLT5jX3N0cigpLAotICAgICAgICAgICAgICAiLy9pbmNsdWRlX3Rlc3QvaW5jbHVkZV90ZXN0MS5mYnMiKTsKLSAgVEVTVF9FUV9TVFIoZmJzMV9pbmNsdWRlcy0+R2V0KDEpLT5jX3N0cigpLAotICAgICAgICAgICAgICAiLy9pbmNsdWRlX3Rlc3Qvc3ViL2luY2x1ZGVfdGVzdDIuZmJzIik7Ci0KLSAgY29uc3QgYXV0byBmYnMyID0gc2NoZW1hLmZic19maWxlcygpLT5HZXQoMik7Ci0gIFRFU1RfRVFfU1RSKGZiczItPmZpbGVuYW1lKCktPmNfc3RyKCksICIvL21vbnN0ZXJfdGVzdC5mYnMiKTsKLSAgY29uc3QgYXV0byBmYnMyX2luY2x1ZGVzID0gZmJzMi0+aW5jbHVkZWRfZmlsZW5hbWVzKCk7Ci0gIFRFU1RfRVEoZmJzMl9pbmNsdWRlcy0+c2l6ZSgpLCAxKTsKLSAgVEVTVF9FUV9TVFIoZmJzMl9pbmNsdWRlcy0+R2V0KDApLT5jX3N0cigpLAotICAgICAgICAgICAgICAiLy9pbmNsdWRlX3Rlc3QvaW5jbHVkZV90ZXN0MS5mYnMiKTsKLQotICAvLyBDaGVjayBSb290IHRhYmxlIGZpZWxkcwotICBhdXRvIGZpZWxkcyA9IHJvb3RfdGFibGUtPmZpZWxkcygpOwotICBhdXRvIGhwX2ZpZWxkX3B0ciA9IGZpZWxkcy0+TG9va3VwQnlLZXkoImhwIik7Ci0gIFRFU1RfTk9UTlVMTChocF9maWVsZF9wdHIpOwotICBhdXRvICZocF9maWVsZCA9ICpocF9maWVsZF9wdHI7Ci0gIFRFU1RfRVFfU1RSKGhwX2ZpZWxkLm5hbWUoKS0+Y19zdHIoKSwgImhwIik7Ci0gIFRFU1RfRVEoaHBfZmllbGQuaWQoKSwgMik7Ci0gIFRFU1RfRVEoaHBfZmllbGQudHlwZSgpLT5iYXNlX3R5cGUoKSwgcmVmbGVjdGlvbjo6U2hvcnQpOwotCi0gIGF1dG8gZnJpZW5kbHlfZmllbGRfcHRyID0gZmllbGRzLT5Mb29rdXBCeUtleSgiZnJpZW5kbHkiKTsKLSAgVEVTVF9OT1ROVUxMKGZyaWVuZGx5X2ZpZWxkX3B0cik7Ci0gIFRFU1RfTk9UTlVMTChmcmllbmRseV9maWVsZF9wdHItPmF0dHJpYnV0ZXMoKSk7Ci0gIFRFU1RfTk9UTlVMTChmcmllbmRseV9maWVsZF9wdHItPmF0dHJpYnV0ZXMoKS0+TG9va3VwQnlLZXkoInByaW9yaXR5IikpOwotCi0gIC8vIE1ha2Ugc3VyZSB0aGUgdGFibGUgaW5kZXggaXMgd2hhdCB3ZSBleHBlY3QgaXQgdG8gYmUuCi0gIGF1dG8gcG9zX2ZpZWxkX3B0ciA9IGZpZWxkcy0+TG9va3VwQnlLZXkoInBvcyIpOwotICBURVNUX05PVE5VTEwocG9zX2ZpZWxkX3B0cik7Ci0gIFRFU1RfRVEocG9zX2ZpZWxkX3B0ci0+dHlwZSgpLT5iYXNlX3R5cGUoKSwgcmVmbGVjdGlvbjo6T2JqKTsKLSAgYXV0byBwb3NfdGFibGVfcHRyID0gc2NoZW1hLm9iamVjdHMoKS0+R2V0KHBvc19maWVsZF9wdHItPnR5cGUoKS0+aW5kZXgoKSk7Ci0gIFRFU1RfTk9UTlVMTChwb3NfdGFibGVfcHRyKTsKLSAgVEVTVF9FUV9TVFIocG9zX3RhYmxlX3B0ci0+bmFtZSgpLT5jX3N0cigpLCAiTXlHYW1lLkV4YW1wbGUuVmVjMyIpOwotCi0gIC8vIFRlc3QgbnVsbGFiaWxpdHkgb2YgZmllbGRzOiBocCBpcyBhIDAtZGVmYXVsdCBzY2FsYXIsIHBvcyBpcyBhIHN0cnVjdCA9PgotICAvLyBvcHRpb25hbCwgYW5kIG5hbWUgaXMgYSByZXF1aXJlZCBzdHJpbmcgPT4gbm90IG9wdGlvbmFsLgotICBURVNUX0VRKGhwX2ZpZWxkLm9wdGlvbmFsKCksIGZhbHNlKTsKLSAgVEVTVF9FUShwb3NfZmllbGRfcHRyLT5vcHRpb25hbCgpLCB0cnVlKTsKLSAgVEVTVF9FUShmaWVsZHMtPkxvb2t1cEJ5S2V5KCJuYW1lIiktPm9wdGlvbmFsKCksIGZhbHNlKTsKLQotICAvLyBOb3cgdXNlIGl0IHRvIGR5bmFtaWNhbGx5IGFjY2VzcyBhIGJ1ZmZlci4KLSAgYXV0byAmcm9vdCA9ICpmbGF0YnVmZmVyczo6R2V0QW55Um9vdChmbGF0YnVmKTsKLQotICAvLyBWZXJpZnkgdGhlIGJ1ZmZlciBmaXJzdCB1c2luZyByZWZsZWN0aW9uIGJhc2VkIHZlcmlmaWNhdGlvbgotICBURVNUX0VRKGZsYXRidWZmZXJzOjpWZXJpZnkoc2NoZW1hLCAqc2NoZW1hLnJvb3RfdGFibGUoKSwgZmxhdGJ1ZiwgbGVuZ3RoKSwKLSAgICAgICAgICB0cnVlKTsKLQotICBhdXRvIGhwID0gZmxhdGJ1ZmZlcnM6OkdldEZpZWxkSTx1aW50MTZfdD4ocm9vdCwgaHBfZmllbGQpOwotICBURVNUX0VRKGhwLCA4MCk7Ci0KLSAgLy8gUmF0aGVyIHRoYW4gbmVlZGluZyB0byBrbm93IHRoZSB0eXBlLCB3ZSBjYW4gYWxzbyBnZXQgdGhlIHZhbHVlIG9mCi0gIC8vIGFueSBmaWVsZCBhcyBhbiBpbnQ2NF90L2RvdWJsZS9zdHJpbmcsIHJlZ2FyZGxlc3Mgb2Ygd2hhdCBpdCBhY3R1YWxseSBpcy4KLSAgYXV0byBocF9pbnQ2NCA9IGZsYXRidWZmZXJzOjpHZXRBbnlGaWVsZEkocm9vdCwgaHBfZmllbGQpOwotICBURVNUX0VRKGhwX2ludDY0LCA4MCk7Ci0gIGF1dG8gaHBfZG91YmxlID0gZmxhdGJ1ZmZlcnM6OkdldEFueUZpZWxkRihyb290LCBocF9maWVsZCk7Ci0gIFRFU1RfRVEoaHBfZG91YmxlLCA4MC4wKTsKLSAgYXV0byBocF9zdHJpbmcgPSBmbGF0YnVmZmVyczo6R2V0QW55RmllbGRTKHJvb3QsIGhwX2ZpZWxkLCAmc2NoZW1hKTsKLSAgVEVTVF9FUV9TVFIoaHBfc3RyaW5nLmNfc3RyKCksICI4MCIpOwotCi0gIC8vIEdldCBzdHJ1Y3QgZmllbGQgdGhyb3VnaCByZWZsZWN0aW9uCi0gIGF1dG8gcG9zX3N0cnVjdCA9IGZsYXRidWZmZXJzOjpHZXRGaWVsZFN0cnVjdChyb290LCAqcG9zX2ZpZWxkX3B0cik7Ci0gIFRFU1RfTk9UTlVMTChwb3Nfc3RydWN0KTsKLSAgVEVTVF9FUShmbGF0YnVmZmVyczo6R2V0QW55RmllbGRGKCpwb3Nfc3RydWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnBvc190YWJsZV9wdHItPmZpZWxkcygpLT5Mb29rdXBCeUtleSgieiIpKSwKLSAgICAgICAgICAzLjBmKTsKLQotICBhdXRvIHRlc3QzX2ZpZWxkID0gcG9zX3RhYmxlX3B0ci0+ZmllbGRzKCktPkxvb2t1cEJ5S2V5KCJ0ZXN0MyIpOwotICBhdXRvIHRlc3QzX3N0cnVjdCA9IGZsYXRidWZmZXJzOjpHZXRGaWVsZFN0cnVjdCgqcG9zX3N0cnVjdCwgKnRlc3QzX2ZpZWxkKTsKLSAgVEVTVF9OT1ROVUxMKHRlc3QzX3N0cnVjdCk7Ci0gIGF1dG8gdGVzdDNfb2JqZWN0ID0gc2NoZW1hLm9iamVjdHMoKS0+R2V0KHRlc3QzX2ZpZWxkLT50eXBlKCktPmluZGV4KCkpOwotCi0gIFRFU1RfRVEoZmxhdGJ1ZmZlcnM6OkdldEFueUZpZWxkRigqdGVzdDNfc3RydWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnRlc3QzX29iamVjdC0+ZmllbGRzKCktPkxvb2t1cEJ5S2V5KCJhIikpLAotICAgICAgICAgIDEwKTsKLQotICAvLyBXZSBjYW4gYWxzbyBtb2RpZnkgaXQuCi0gIGZsYXRidWZmZXJzOjpTZXRGaWVsZDx1aW50MTZfdD4oJnJvb3QsIGhwX2ZpZWxkLCAyMDApOwotICBocCA9IGZsYXRidWZmZXJzOjpHZXRGaWVsZEk8dWludDE2X3Q+KHJvb3QsIGhwX2ZpZWxkKTsKLSAgVEVTVF9FUShocCwgMjAwKTsKLQotICAvLyBXZSBjYW4gYWxzbyBzZXQgZmllbGRzIGdlbmVyaWNhbGx5OgotICBmbGF0YnVmZmVyczo6U2V0QW55RmllbGRJKCZyb290LCBocF9maWVsZCwgMzAwKTsKLSAgaHBfaW50NjQgPSBmbGF0YnVmZmVyczo6R2V0QW55RmllbGRJKHJvb3QsIGhwX2ZpZWxkKTsKLSAgVEVTVF9FUShocF9pbnQ2NCwgMzAwKTsKLSAgZmxhdGJ1ZmZlcnM6OlNldEFueUZpZWxkRigmcm9vdCwgaHBfZmllbGQsIDMwMC41KTsKLSAgaHBfaW50NjQgPSBmbGF0YnVmZmVyczo6R2V0QW55RmllbGRJKHJvb3QsIGhwX2ZpZWxkKTsKLSAgVEVTVF9FUShocF9pbnQ2NCwgMzAwKTsKLSAgZmxhdGJ1ZmZlcnM6OlNldEFueUZpZWxkUygmcm9vdCwgaHBfZmllbGQsICIzMDAiKTsKLSAgaHBfaW50NjQgPSBmbGF0YnVmZmVyczo6R2V0QW55RmllbGRJKHJvb3QsIGhwX2ZpZWxkKTsKLSAgVEVTVF9FUShocF9pbnQ2NCwgMzAwKTsKLQotICAvLyBUZXN0IGJ1ZmZlciBpcyB2YWxpZCBhZnRlciB0aGUgbW9kaWZpY2F0aW9ucwotICBURVNUX0VRKGZsYXRidWZmZXJzOjpWZXJpZnkoc2NoZW1hLCAqc2NoZW1hLnJvb3RfdGFibGUoKSwgZmxhdGJ1ZiwgbGVuZ3RoKSwKLSAgICAgICAgICB0cnVlKTsKLQotICAvLyBSZXNldCBpdCwgZm9yIGZ1cnRoZXIgdGVzdHMuCi0gIGZsYXRidWZmZXJzOjpTZXRGaWVsZDx1aW50MTZfdD4oJnJvb3QsIGhwX2ZpZWxkLCA4MCk7Ci0KLSAgLy8gTW9yZSBhZHZhbmNlZCBmdW5jdGlvbmFsaXR5OiBjaGFuZ2luZyB0aGUgc2l6ZSBvZiBpdGVtcyBpbi1saW5lIQotICAvLyBGaXJzdCB3ZSBwdXQgdGhlIEZsYXRCdWZmZXIgaW5zaWRlIGFuIHN0ZDo6dmVjdG9yLgotICBzdGQ6OnZlY3Rvcjx1aW50OF90PiByZXNpemluZ2J1ZihmbGF0YnVmLCBmbGF0YnVmICsgbGVuZ3RoKTsKLSAgLy8gRmluZCB0aGUgZmllbGQgd2Ugd2FudCB0byBtb2RpZnkuCi0gIGF1dG8gJm5hbWVfZmllbGQgPSAqZmllbGRzLT5Mb29rdXBCeUtleSgibmFtZSIpOwotICAvLyBHZXQgdGhlIHJvb3QuCi0gIC8vIFRoaXMgdGltZSB3ZSB3cmFwIHRoZSByZXN1bHQgZnJvbSBHZXRBbnlSb290IGluIGEgc21hcnRwb2ludGVyIHRoYXQKLSAgLy8gd2lsbCBrZWVwIHJyb290IHZhbGlkIGFzIHJlc2l6aW5nYnVmIHJlc2l6ZXMuCi0gIGF1dG8gcnJvb3QgPSBmbGF0YnVmZmVyczo6cGl2KGZsYXRidWZmZXJzOjpHZXRBbnlSb290KHJlc2l6aW5nYnVmLmRhdGEoKSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc2l6aW5nYnVmKTsKLSAgU2V0U3RyaW5nKHNjaGVtYSwgInRvdGFsbHkgbmV3IHN0cmluZyIsIEdldEZpZWxkUygqKnJyb290LCBuYW1lX2ZpZWxkKSwKLSAgICAgICAgICAgICZyZXNpemluZ2J1Zik7Ci0gIC8vIEhlcmUgcmVzaXppbmdidWYgaGFzIGNoYW5nZWQsIGJ1dCBycm9vdCBpcyBzdGlsbCB2YWxpZC4KLSAgVEVTVF9FUV9TVFIoR2V0RmllbGRTKCoqcnJvb3QsIG5hbWVfZmllbGQpLT5jX3N0cigpLCAidG90YWxseSBuZXcgc3RyaW5nIik7Ci0gIC8vIE5vdyBsZXRzIGV4dGVuZCBhIHZlY3RvciBieSAxMDAgZWxlbWVudHMgKDEwIC0+IDExMCkuCi0gIGF1dG8gJmludmVudG9yeV9maWVsZCA9ICpmaWVsZHMtPkxvb2t1cEJ5S2V5KCJpbnZlbnRvcnkiKTsKLSAgYXV0byByaW52ZW50b3J5ID0gZmxhdGJ1ZmZlcnM6OnBpdigKLSAgICAgIGZsYXRidWZmZXJzOjpHZXRGaWVsZFY8dWludDhfdD4oKipycm9vdCwgaW52ZW50b3J5X2ZpZWxkKSwgcmVzaXppbmdidWYpOwotICBmbGF0YnVmZmVyczo6UmVzaXplVmVjdG9yPHVpbnQ4X3Q+KHNjaGVtYSwgMTEwLCA1MCwgKnJpbnZlbnRvcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlc2l6aW5nYnVmKTsKLSAgLy8gcmludmVudG9yeSBzdGlsbCB2YWxpZCwgc28gbGV0cyByZWFkIGZyb20gaXQuCi0gIFRFU1RfRVEocmludmVudG9yeS0+R2V0KDEwKSwgNTApOwotCi0gIC8vIEZvciByZWZsZWN0aW9uIHVzZXMgbm90IGNvdmVyZWQgYWxyZWFkeSwgdGhlcmUgaXMgYSBtb3JlIHBvd2VyZnVsIHdheToKLSAgLy8gd2UgY2FuIHNpbXBseSBnZW5lcmF0ZSB3aGF0ZXZlciBvYmplY3Qgd2Ugd2FudCB0byBhZGQvbW9kaWZ5IGluIGEKLSAgLy8gRmxhdEJ1ZmZlciBvZiBpdHMgb3duLCB0aGVuIGFkZCB0aGF0IHRvIGFuIGV4aXN0aW5nIEZsYXRCdWZmZXI6Ci0gIC8vIEFzIGFuIGV4YW1wbGUsIGxldCdzIGFkZCBhIHN0cmluZyB0byBhbiBhcnJheSBvZiBzdHJpbmdzLgotICAvLyBGaXJzdCwgZmluZCBvdXIgZmllbGQ6Ci0gIGF1dG8gJnRlc3RhcnJheW9mc3RyaW5nX2ZpZWxkID0gKmZpZWxkcy0+TG9va3VwQnlLZXkoInRlc3RhcnJheW9mc3RyaW5nIik7Ci0gIC8vIEZpbmQgdGhlIHZlY3RvciB2YWx1ZToKLSAgYXV0byBydGVzdGFycmF5b2ZzdHJpbmcgPSBmbGF0YnVmZmVyczo6cGl2KAotICAgICAgZmxhdGJ1ZmZlcnM6OkdldEZpZWxkVjxmbGF0YnVmZmVyczo6T2Zmc2V0PGZsYXRidWZmZXJzOjpTdHJpbmc+PigKLSAgICAgICAgICAqKnJyb290LCB0ZXN0YXJyYXlvZnN0cmluZ19maWVsZCksCi0gICAgICByZXNpemluZ2J1Zik7Ci0gIC8vIEl0J3MgYSB2ZWN0b3Igb2YgMiBzdHJpbmdzLCB0byB3aGljaCB3ZSBhZGQgb25lIG1vcmUsIGluaXRpYWxpemVkIHRvCi0gIC8vIG9mZnNldCAwLgotICBmbGF0YnVmZmVyczo6UmVzaXplVmVjdG9yPGZsYXRidWZmZXJzOjpPZmZzZXQ8ZmxhdGJ1ZmZlcnM6OlN0cmluZz4+KAotICAgICAgc2NoZW1hLCAzLCAwLCAqcnRlc3RhcnJheW9mc3RyaW5nLCAmcmVzaXppbmdidWYpOwotICAvLyBIZXJlIHdlIGp1c3QgY3JlYXRlIGEgYnVmZmVyIHRoYXQgY29udGFucyBhIHNpbmdsZSBzdHJpbmcsIGJ1dCB0aGlzCi0gIC8vIGNvdWxkIGFsc28gYmUgYW55IGNvbXBsZXggc2V0IG9mIHRhYmxlcyBhbmQgb3RoZXIgdmFsdWVzLgotICBmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgc3RyaW5nZmJiOwotICBzdHJpbmdmYmIuRmluaXNoKHN0cmluZ2ZiYi5DcmVhdGVTdHJpbmcoImhhbmsiKSk7Ci0gIC8vIEFkZCB0aGUgY29udGVudHMgb2YgaXQgdG8gb3VyIGV4aXN0aW5nIEZsYXRCdWZmZXIuCi0gIC8vIFdlIGRvIHRoaXMgbGFzdCwgc28gdGhlIHBvaW50ZXIgZG9lc24ndCBnZXQgaW52YWxpZGF0ZWQgKHNpbmNlIGl0IGlzCi0gIC8vIGF0IHRoZSBlbmQgb2YgdGhlIGJ1ZmZlcik6Ci0gIGF1dG8gc3RyaW5nX3B0ciA9IGZsYXRidWZmZXJzOjpBZGRGbGF0QnVmZmVyKAotICAgICAgcmVzaXppbmdidWYsIHN0cmluZ2ZiYi5HZXRCdWZmZXJQb2ludGVyKCksIHN0cmluZ2ZiYi5HZXRTaXplKCkpOwotICAvLyBGaW5hbGx5LCBzZXQgdGhlIG5ldyB2YWx1ZSBpbiB0aGUgdmVjdG9yLgotICBydGVzdGFycmF5b2ZzdHJpbmctPk11dGF0ZU9mZnNldCgyLCBzdHJpbmdfcHRyKTsKLSAgVEVTVF9FUV9TVFIocnRlc3RhcnJheW9mc3RyaW5nLT5HZXQoMCktPmNfc3RyKCksICJib2IiKTsKLSAgVEVTVF9FUV9TVFIocnRlc3RhcnJheW9mc3RyaW5nLT5HZXQoMiktPmNfc3RyKCksICJoYW5rIik7Ci0gIC8vIFRlc3QgaW50ZWdyaXR5IG9mIGFsbCByZXNpemUgb3BlcmF0aW9ucyBhYm92ZS4KLSAgZmxhdGJ1ZmZlcnM6OlZlcmlmaWVyIHJlc2l6ZV92ZXJpZmllcigKLSAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCAqPihyZXNpemluZ2J1Zi5kYXRhKCkpLAotICAgICAgcmVzaXppbmdidWYuc2l6ZSgpKTsKLSAgVEVTVF9FUShWZXJpZnlNb25zdGVyQnVmZmVyKHJlc2l6ZV92ZXJpZmllciksIHRydWUpOwotCi0gIC8vIFRlc3QgYnVmZmVyIGlzIHZhbGlkIHVzaW5nIHJlZmxlY3Rpb24gYXMgd2VsbAotICBURVNUX0VRKGZsYXRidWZmZXJzOjpWZXJpZnkoc2NoZW1hLCAqc2NoZW1hLnJvb3RfdGFibGUoKSwgcmVzaXppbmdidWYuZGF0YSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzaXppbmdidWYuc2l6ZSgpKSwKLSAgICAgICAgICB0cnVlKTsKLQotICAvLyBBcyBhbiBhZGRpdGlvbmFsIHRlc3QsIGFsc28gc2V0IGl0IG9uIHRoZSBuYW1lIGZpZWxkLgotICAvLyBOb3RlOiB1bmxpa2UgdGhlIG5hbWUgY2hhbmdlIGFib3ZlLCB0aGlzIGp1c3Qgb3ZlcndyaXRlcyB0aGUgb2Zmc2V0LAotICAvLyByYXRoZXIgdGhhbiBjaGFuZ2luZyB0aGUgc3RyaW5nIGluLXBsYWNlLgotICBTZXRGaWVsZFQoKnJyb290LCBuYW1lX2ZpZWxkLCBzdHJpbmdfcHRyKTsKLSAgVEVTVF9FUV9TVFIoR2V0RmllbGRTKCoqcnJvb3QsIG5hbWVfZmllbGQpLT5jX3N0cigpLCAiaGFuayIpOwotCi0gIC8vIFVzaW5nIHJlZmxlY3Rpb24sIHJhdGhlciB0aGFuIG11dGF0aW5nIGJpbmFyeSBGbGF0QnVmZmVycywgd2UgY2FuIGFsc28gY29weQotICAvLyB0YWJsZXMgYW5kIG90aGVyIHRoaW5ncyBvdXQgb2Ygb3RoZXIgRmxhdEJ1ZmZlcnMgaW50byBhIEZsYXRCdWZmZXJCdWlsZGVyLAotICAvLyBlaXRoZXIgcGFydCBvciB3aG9sZS4KLSAgZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyIGZiYjsKLSAgYXV0byByb290X29mZnNldCA9IGZsYXRidWZmZXJzOjpDb3B5VGFibGUoCi0gICAgICBmYmIsIHNjaGVtYSwgKnJvb3RfdGFibGUsICpmbGF0YnVmZmVyczo6R2V0QW55Um9vdChmbGF0YnVmKSwgdHJ1ZSk7Ci0gIGZiYi5GaW5pc2gocm9vdF9vZmZzZXQsIE1vbnN0ZXJJZGVudGlmaWVyKCkpOwotICAvLyBUZXN0IHRoYXQgaXQgd2FzIGNvcGllZCBjb3JyZWN0bHk6Ci0gIEFjY2Vzc0ZsYXRCdWZmZXJUZXN0KGZiYi5HZXRCdWZmZXJQb2ludGVyKCksIGZiYi5HZXRTaXplKCkpOwotCi0gIC8vIFRlc3QgYnVmZmVyIGlzIHZhbGlkIHVzaW5nIHJlZmxlY3Rpb24gYXMgd2VsbAotICBURVNUX0VRKGZsYXRidWZmZXJzOjpWZXJpZnkoc2NoZW1hLCAqc2NoZW1hLnJvb3RfdGFibGUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZiYi5HZXRCdWZmZXJQb2ludGVyKCksIGZiYi5HZXRTaXplKCkpLAotICAgICAgICAgIHRydWUpOwotfQotCi12b2lkIE1pbmlSZWZsZWN0RmxhdEJ1ZmZlcnNUZXN0KHVpbnQ4X3QgKmZsYXRidWYpIHsKLSAgYXV0byBzID0KLSAgICAgIGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyVG9TdHJpbmcoZmxhdGJ1ZiwgTW9uc3Rlcjo6TWluaVJlZmxlY3RUeXBlVGFibGUoKSk7Ci0gIFRFU1RfRVFfU1RSKAotICAgICAgcy5jX3N0cigpLAotICAgICAgInsgIgotICAgICAgInBvczogeyB4OiAxLjAsIHk6IDIuMCwgejogMy4wLCB0ZXN0MTogMC4wLCB0ZXN0MjogUmVkLCB0ZXN0MzogIgotICAgICAgInsgYTogMTAsIGI6IDIwIH0gfSwgIgotICAgICAgImhwOiA4MCwgIgotICAgICAgIm5hbWU6IFwiTXlNb25zdGVyXCIsICIKLSAgICAgICJpbnZlbnRvcnk6IFsgMCwgMSwgMiwgMywgNCwgNSwgNiwgNywgOCwgOSBdLCAiCi0gICAgICAidGVzdF90eXBlOiBNb25zdGVyLCAiCi0gICAgICAidGVzdDogeyBuYW1lOiBcIkZyZWRcIiB9LCAiCi0gICAgICAidGVzdDQ6IFsgeyBhOiAxMCwgYjogMjAgfSwgeyBhOiAzMCwgYjogNDAgfSBdLCAiCi0gICAgICAidGVzdGFycmF5b2ZzdHJpbmc6IFsgXCJib2JcIiwgXCJmcmVkXCIsIFwiYm9iXCIsIFwiZnJlZFwiIF0sICIKLSAgICAgICJ0ZXN0YXJyYXlvZnRhYmxlczogWyB7IGhwOiAxMDAwLCBuYW1lOiBcIkJhcm5leVwiIH0sIHsgbmFtZTogXCJGcmVkXCIgIgotICAgICAgIn0sICIKLSAgICAgICJ7IG5hbWU6IFwiV2lsbWFcIiB9IF0sICIKLSAgICAgIC8vIFRPRE8od3ZvKTogc2hvdWxkIHJlYWxseSBwcmludCB0aGlzIG5lc3RlZCBidWZmZXIgY29ycmVjdGx5LgotICAgICAgInRlc3RuZXN0ZWRmbGF0YnVmZmVyOiBbIDIwLCAwLCAwLCAwLCA3NywgNzksIDc4LCA4MywgMTIsIDAsIDEyLCAwLCAwLCAiCi0gICAgICAiMCwgIgotICAgICAgIjQsIDAsIDYsIDAsIDgsIDAsIDEyLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCA0LCAwLCAwLCAwLCAxMywgMCwgMCwgMCwgNzgsICIKLSAgICAgICIxMDEsIDExNSwgMTE2LCAxMDEsIDEwMCwgNzcsIDExMSwgMTEwLCAxMTUsIDExNiwgMTAxLCAxMTQsIDAsIDAsIDAgXSwgIgotICAgICAgInRlc3RhcnJheW9mc3RyaW5nMjogWyBcImphbmVcIiwgXCJtYXJ5XCIgXSwgIgotICAgICAgInRlc3RhcnJheW9mc29ydGVkc3RydWN0OiBbIHsgaWQ6IDAsIGRpc3RhbmNlOiAwIH0sICIKLSAgICAgICJ7IGlkOiAyLCBkaXN0YW5jZTogMjAgfSwgeyBpZDogMywgZGlzdGFuY2U6IDMwIH0sICIKLSAgICAgICJ7IGlkOiA0LCBkaXN0YW5jZTogNDAgfSBdLCAiCi0gICAgICAiZmxleDogWyAyMTAsIDQsIDUsIDIgXSwgIgotICAgICAgInRlc3Q1OiBbIHsgYTogMTAsIGI6IDIwIH0sIHsgYTogMzAsIGI6IDQwIH0gXSwgIgotICAgICAgInZlY3Rvcl9vZl9lbnVtczogWyBCbHVlLCBHcmVlbiBdLCAiCi0gICAgICAic2NhbGFyX2tleV9zb3J0ZWRfdGFibGVzOiBbIHsgaWQ6IFwibWlzc1wiIH0gXSAiCi0gICAgICAifSIpOwotCi0gIFRlc3QgdGVzdCgxNiwgMzIpOwotICBWZWMzIHZlYygxLCAyLCAzLCAxLjUsIENvbG9yX1JlZCwgdGVzdCk7Ci0gIGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciB2ZWNfYnVpbGRlcjsKLSAgdmVjX2J1aWxkZXIuRmluaXNoKHZlY19idWlsZGVyLkNyZWF0ZVN0cnVjdCh2ZWMpKTsKLSAgYXV0byB2ZWNfYnVmZmVyID0gdmVjX2J1aWxkZXIuUmVsZWFzZSgpOwotICBhdXRvIHZlY19zdHIgPSBmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlclRvU3RyaW5nKHZlY19idWZmZXIuZGF0YSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlYzM6Ok1pbmlSZWZsZWN0VHlwZVRhYmxlKCkpOwotICBURVNUX0VRX1NUUih2ZWNfc3RyLmNfc3RyKCksCi0gICAgICAgICAgICAgICJ7IHg6IDEuMCwgeTogMi4wLCB6OiAzLjAsIHRlc3QxOiAxLjUsIHRlc3QyOiBSZWQsIHRlc3QzOiB7IGE6ICIKLSAgICAgICAgICAgICAgIjE2LCBiOiAzMiB9IH0iKTsKLX0KLQotdm9pZCBNaW5pUmVmbGVjdEZpeGVkTGVuZ3RoQXJyYXlUZXN0KCkgewotICAvLyBWUzEwIGRvZXMgbm90IHN1cHBvcnQgdHlwZWQgZW51bXMsIGV4Y2x1ZGUgZnJvbSB0ZXN0cwotI2lmICFkZWZpbmVkKF9NU0NfVkVSKSB8fCBfTVNDX1ZFUiA+PSAxNzAwCi0gIGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciBmYmI7Ci0gIE15R2FtZTo6RXhhbXBsZTo6QXJyYXlTdHJ1Y3QgYVN0cnVjdCgyLCAxMiwgMSk7Ci0gIGF1dG8gYVRhYmxlID0gTXlHYW1lOjpFeGFtcGxlOjpDcmVhdGVBcnJheVRhYmxlKGZiYiwgJmFTdHJ1Y3QpOwotICBmYmIuRmluaXNoKGFUYWJsZSk7Ci0KLSAgYXV0byBmbGF0YnVmID0gZmJiLlJlbGVhc2UoKTsKLSAgYXV0byBzID0gZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJUb1N0cmluZygKLSAgICAgIGZsYXRidWYuZGF0YSgpLCBNeUdhbWU6OkV4YW1wbGU6OkFycmF5VGFibGVUeXBlVGFibGUoKSk7Ci0gIFRFU1RfRVFfU1RSKAotICAgICAgInsgIgotICAgICAgImE6IHsgYTogMi4wLCAiCi0gICAgICAiYjogWyAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwIF0sICIKLSAgICAgICJjOiAxMiwgIgotICAgICAgImQ6IFsgeyBhOiBbIDAsIDAgXSwgYjogQSwgYzogWyBBLCBBIF0sIGQ6IFsgMCwgMCBdIH0sICIKLSAgICAgICJ7IGE6IFsgMCwgMCBdLCBiOiBBLCBjOiBbIEEsIEEgXSwgZDogWyAwLCAwIF0gfSBdLCAiCi0gICAgICAiZTogMSwgZjogWyAwLCAwIF0gfSAiCi0gICAgICAifSIsCi0gICAgICBzLmNfc3RyKCkpOwotI2VuZGlmCi19Ci0KLS8vIFBhcnNlIGEgLnByb3RvIHNjaGVtYSwgb3V0cHV0IGFzIC5mYnMKLXZvaWQgUGFyc2VQcm90b1Rlc3QoKSB7Ci0gIC8vIGxvYWQgdGhlIC5wcm90byBhbmQgdGhlIGdvbGRlbiBmaWxlIGZyb20gZGlzawotICBzdGQ6OnN0cmluZyBwcm90b2ZpbGU7Ci0gIHN0ZDo6c3RyaW5nIGdvbGRlbmZpbGU7Ci0gIHN0ZDo6c3RyaW5nIGdvbGRlbnVuaW9uZmlsZTsKLSAgVEVTVF9FUSgKLSAgICAgIGZsYXRidWZmZXJzOjpMb2FkRmlsZSgodGVzdF9kYXRhX3BhdGggKyAicHJvdG90ZXN0L3Rlc3QucHJvdG8iKS5jX3N0cigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlLCAmcHJvdG9maWxlKSwKLSAgICAgIHRydWUpOwotICBURVNUX0VRKAotICAgICAgZmxhdGJ1ZmZlcnM6OkxvYWRGaWxlKCh0ZXN0X2RhdGFfcGF0aCArICJwcm90b3Rlc3QvdGVzdC5nb2xkZW4iKS5jX3N0cigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlLCAmZ29sZGVuZmlsZSksCi0gICAgICB0cnVlKTsKLSAgVEVTVF9FUShmbGF0YnVmZmVyczo6TG9hZEZpbGUoCi0gICAgICAgICAgICAgICh0ZXN0X2RhdGFfcGF0aCArICJwcm90b3Rlc3QvdGVzdF91bmlvbi5nb2xkZW4iKS5jX3N0cigpLCBmYWxzZSwKLSAgICAgICAgICAgICAgJmdvbGRlbnVuaW9uZmlsZSksCi0gICAgICAgICAgdHJ1ZSk7Ci0KLSAgZmxhdGJ1ZmZlcnM6OklETE9wdGlvbnMgb3B0czsKLSAgb3B0cy5pbmNsdWRlX2RlcGVuZGVuY2VfaGVhZGVycyA9IGZhbHNlOwotICBvcHRzLnByb3RvX21vZGUgPSB0cnVlOwotCi0gIC8vIFBhcnNlIHByb3RvLgotICBmbGF0YnVmZmVyczo6UGFyc2VyIHBhcnNlcihvcHRzKTsKLSAgYXV0byBwcm90b3BhdGggPSB0ZXN0X2RhdGFfcGF0aCArICJwcm90b3Rlc3QvIjsKLSAgY29uc3QgY2hhciAqaW5jbHVkZV9kaXJlY3Rvcmllc1tdID0geyBwcm90b3BhdGguY19zdHIoKSwgbnVsbHB0ciB9OwotICBURVNUX0VRKHBhcnNlci5QYXJzZShwcm90b2ZpbGUuY19zdHIoKSwgaW5jbHVkZV9kaXJlY3RvcmllcyksIHRydWUpOwotCi0gIC8vIEdlbmVyYXRlIGZicy4KLSAgYXV0byBmYnMgPSBmbGF0YnVmZmVyczo6R2VuZXJhdGVGQlMocGFyc2VyLCAidGVzdCIpOwotCi0gIC8vIEVuc3VyZSBnZW5lcmF0ZWQgZmlsZSBpcyBwYXJzYWJsZS4KLSAgZmxhdGJ1ZmZlcnM6OlBhcnNlciBwYXJzZXIyOwotICBURVNUX0VRKHBhcnNlcjIuUGFyc2UoZmJzLmNfc3RyKCksIG51bGxwdHIpLCB0cnVlKTsKLSAgVEVTVF9FUV9TVFIoZmJzLmNfc3RyKCksIGdvbGRlbmZpbGUuY19zdHIoKSk7Ci0KLSAgLy8gUGFyc2UgcHJvdG8gd2l0aCAtLW9uZW9mLXVuaW9uIG9wdGlvbi4KLSAgb3B0cy5wcm90b19vbmVvZl91bmlvbiA9IHRydWU7Ci0gIGZsYXRidWZmZXJzOjpQYXJzZXIgcGFyc2VyMyhvcHRzKTsKLSAgVEVTVF9FUShwYXJzZXIzLlBhcnNlKHByb3RvZmlsZS5jX3N0cigpLCBpbmNsdWRlX2RpcmVjdG9yaWVzKSwgdHJ1ZSk7Ci0KLSAgLy8gR2VuZXJhdGUgZmJzLgotICBhdXRvIGZic191bmlvbiA9IGZsYXRidWZmZXJzOjpHZW5lcmF0ZUZCUyhwYXJzZXIzLCAidGVzdCIpOwotCi0gIC8vIEVuc3VyZSBnZW5lcmF0ZWQgZmlsZSBpcyBwYXJzYWJsZS4KLSAgZmxhdGJ1ZmZlcnM6OlBhcnNlciBwYXJzZXI0OwotICBURVNUX0VRKHBhcnNlcjQuUGFyc2UoZmJzX3VuaW9uLmNfc3RyKCksIG51bGxwdHIpLCB0cnVlKTsKLSAgVEVTVF9FUV9TVFIoZmJzX3VuaW9uLmNfc3RyKCksIGdvbGRlbnVuaW9uZmlsZS5jX3N0cigpKTsKLX0KLQotLy8gUGFyc2UgYSAucHJvdG8gc2NoZW1hLCBvdXRwdXQgYXMgLmZicwotdm9pZCBQYXJzZVByb3RvVGVzdFdpdGhTdWZmaXgoKSB7Ci0gIC8vIGxvYWQgdGhlIC5wcm90byBhbmQgdGhlIGdvbGRlbiBmaWxlIGZyb20gZGlzawotICBzdGQ6OnN0cmluZyBwcm90b2ZpbGU7Ci0gIHN0ZDo6c3RyaW5nIGdvbGRlbmZpbGU7Ci0gIHN0ZDo6c3RyaW5nIGdvbGRlbnVuaW9uZmlsZTsKLSAgVEVTVF9FUSgKLSAgICAgIGZsYXRidWZmZXJzOjpMb2FkRmlsZSgodGVzdF9kYXRhX3BhdGggKyAicHJvdG90ZXN0L3Rlc3QucHJvdG8iKS5jX3N0cigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlLCAmcHJvdG9maWxlKSwKLSAgICAgIHRydWUpOwotICBURVNUX0VRKGZsYXRidWZmZXJzOjpMb2FkRmlsZSgKLSAgICAgICAgICAgICAgKHRlc3RfZGF0YV9wYXRoICsgInByb3RvdGVzdC90ZXN0X3N1ZmZpeC5nb2xkZW4iKS5jX3N0cigpLCBmYWxzZSwKLSAgICAgICAgICAgICAgJmdvbGRlbmZpbGUpLAotICAgICAgICAgIHRydWUpOwotICBURVNUX0VRKGZsYXRidWZmZXJzOjpMb2FkRmlsZSgKLSAgICAgICAgICAgICAgKHRlc3RfZGF0YV9wYXRoICsgInByb3RvdGVzdC90ZXN0X3VuaW9uX3N1ZmZpeC5nb2xkZW4iKS5jX3N0cigpLAotICAgICAgICAgICAgICBmYWxzZSwgJmdvbGRlbnVuaW9uZmlsZSksCi0gICAgICAgICAgdHJ1ZSk7Ci0KLSAgZmxhdGJ1ZmZlcnM6OklETE9wdGlvbnMgb3B0czsKLSAgb3B0cy5pbmNsdWRlX2RlcGVuZGVuY2VfaGVhZGVycyA9IGZhbHNlOwotICBvcHRzLnByb3RvX21vZGUgPSB0cnVlOwotICBvcHRzLnByb3RvX25hbWVzcGFjZV9zdWZmaXggPSAidGVzdF9uYW1lc3BhY2Vfc3VmZml4IjsKLQotICAvLyBQYXJzZSBwcm90by4KLSAgZmxhdGJ1ZmZlcnM6OlBhcnNlciBwYXJzZXIob3B0cyk7Ci0gIGF1dG8gcHJvdG9wYXRoID0gdGVzdF9kYXRhX3BhdGggKyAicHJvdG90ZXN0LyI7Ci0gIGNvbnN0IGNoYXIgKmluY2x1ZGVfZGlyZWN0b3JpZXNbXSA9IHsgcHJvdG9wYXRoLmNfc3RyKCksIG51bGxwdHIgfTsKLSAgVEVTVF9FUShwYXJzZXIuUGFyc2UocHJvdG9maWxlLmNfc3RyKCksIGluY2x1ZGVfZGlyZWN0b3JpZXMpLCB0cnVlKTsKLQotICAvLyBHZW5lcmF0ZSBmYnMuCi0gIGF1dG8gZmJzID0gZmxhdGJ1ZmZlcnM6OkdlbmVyYXRlRkJTKHBhcnNlciwgInRlc3QiKTsKLQotICAvLyBFbnN1cmUgZ2VuZXJhdGVkIGZpbGUgaXMgcGFyc2FibGUuCi0gIGZsYXRidWZmZXJzOjpQYXJzZXIgcGFyc2VyMjsKLSAgVEVTVF9FUShwYXJzZXIyLlBhcnNlKGZicy5jX3N0cigpLCBudWxscHRyKSwgdHJ1ZSk7Ci0gIFRFU1RfRVFfU1RSKGZicy5jX3N0cigpLCBnb2xkZW5maWxlLmNfc3RyKCkpOwotCi0gIC8vIFBhcnNlIHByb3RvIHdpdGggLS1vbmVvZi11bmlvbiBvcHRpb24uCi0gIG9wdHMucHJvdG9fb25lb2ZfdW5pb24gPSB0cnVlOwotICBmbGF0YnVmZmVyczo6UGFyc2VyIHBhcnNlcjMob3B0cyk7Ci0gIFRFU1RfRVEocGFyc2VyMy5QYXJzZShwcm90b2ZpbGUuY19zdHIoKSwgaW5jbHVkZV9kaXJlY3RvcmllcyksIHRydWUpOwotCi0gIC8vIEdlbmVyYXRlIGZicy4KLSAgYXV0byBmYnNfdW5pb24gPSBmbGF0YnVmZmVyczo6R2VuZXJhdGVGQlMocGFyc2VyMywgInRlc3QiKTsKLQotICAvLyBFbnN1cmUgZ2VuZXJhdGVkIGZpbGUgaXMgcGFyc2FibGUuCi0gIGZsYXRidWZmZXJzOjpQYXJzZXIgcGFyc2VyNDsKLSAgVEVTVF9FUShwYXJzZXI0LlBhcnNlKGZic191bmlvbi5jX3N0cigpLCBudWxscHRyKSwgdHJ1ZSk7Ci0gIFRFU1RfRVFfU1RSKGZic191bmlvbi5jX3N0cigpLCBnb2xkZW51bmlvbmZpbGUuY19zdHIoKSk7Ci19Ci0KLS8vIFBhcnNlIGEgLnByb3RvIHNjaGVtYSwgb3V0cHV0IGFzIC5mYnMKLXZvaWQgUGFyc2VQcm90b1Rlc3RXaXRoSW5jbHVkZXMoKSB7Ci0gIC8vIGxvYWQgdGhlIC5wcm90byBhbmQgdGhlIGdvbGRlbiBmaWxlIGZyb20gZGlzawotICBzdGQ6OnN0cmluZyBwcm90b2ZpbGU7Ci0gIHN0ZDo6c3RyaW5nIGdvbGRlbmZpbGU7Ci0gIHN0ZDo6c3RyaW5nIGdvbGRlbnVuaW9uZmlsZTsKLSAgc3RkOjpzdHJpbmcgaW1wb3J0cHJvdG9maWxlOwotICBURVNUX0VRKAotICAgICAgZmxhdGJ1ZmZlcnM6OkxvYWRGaWxlKCh0ZXN0X2RhdGFfcGF0aCArICJwcm90b3Rlc3QvdGVzdC5wcm90byIpLmNfc3RyKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UsICZwcm90b2ZpbGUpLAotICAgICAgdHJ1ZSk7Ci0gIFRFU1RfRVEoZmxhdGJ1ZmZlcnM6OkxvYWRGaWxlKAotICAgICAgICAgICAgICAodGVzdF9kYXRhX3BhdGggKyAicHJvdG90ZXN0L2ltcG9ydGVkLnByb3RvIikuY19zdHIoKSwgZmFsc2UsCi0gICAgICAgICAgICAgICZpbXBvcnRwcm90b2ZpbGUpLAotICAgICAgICAgIHRydWUpOwotICBURVNUX0VRKGZsYXRidWZmZXJzOjpMb2FkRmlsZSgKLSAgICAgICAgICAgICAgKHRlc3RfZGF0YV9wYXRoICsgInByb3RvdGVzdC90ZXN0X2luY2x1ZGUuZ29sZGVuIikuY19zdHIoKSwgZmFsc2UsCi0gICAgICAgICAgICAgICZnb2xkZW5maWxlKSwKLSAgICAgICAgICB0cnVlKTsKLSAgVEVTVF9FUShmbGF0YnVmZmVyczo6TG9hZEZpbGUoCi0gICAgICAgICAgICAgICh0ZXN0X2RhdGFfcGF0aCArICJwcm90b3Rlc3QvdGVzdF91bmlvbl9pbmNsdWRlLmdvbGRlbiIpLmNfc3RyKCksCi0gICAgICAgICAgICAgIGZhbHNlLCAmZ29sZGVudW5pb25maWxlKSwKLSAgICAgICAgICB0cnVlKTsKLQotICBmbGF0YnVmZmVyczo6SURMT3B0aW9ucyBvcHRzOwotICBvcHRzLmluY2x1ZGVfZGVwZW5kZW5jZV9oZWFkZXJzID0gdHJ1ZTsKLSAgb3B0cy5wcm90b19tb2RlID0gdHJ1ZTsKLQotICAvLyBQYXJzZSBwcm90by4KLSAgZmxhdGJ1ZmZlcnM6OlBhcnNlciBwYXJzZXIob3B0cyk7Ci0gIGF1dG8gcHJvdG9wYXRoID0gdGVzdF9kYXRhX3BhdGggKyAicHJvdG90ZXN0LyI7Ci0gIGNvbnN0IGNoYXIgKmluY2x1ZGVfZGlyZWN0b3JpZXNbXSA9IHsgcHJvdG9wYXRoLmNfc3RyKCksIG51bGxwdHIgfTsKLSAgVEVTVF9FUShwYXJzZXIuUGFyc2UocHJvdG9maWxlLmNfc3RyKCksIGluY2x1ZGVfZGlyZWN0b3JpZXMpLCB0cnVlKTsKLQotICAvLyBHZW5lcmF0ZSBmYnMuCi0gIGF1dG8gZmJzID0gZmxhdGJ1ZmZlcnM6OkdlbmVyYXRlRkJTKHBhcnNlciwgInRlc3QiKTsKLQotICAvLyBHZW5lcmF0ZSBmYnMgZnJvbSBpbXBvcnQucHJvdG8KLSAgZmxhdGJ1ZmZlcnM6OlBhcnNlciBpbXBvcnRfcGFyc2VyKG9wdHMpOwotICBURVNUX0VRKGltcG9ydF9wYXJzZXIuUGFyc2UoaW1wb3J0cHJvdG9maWxlLmNfc3RyKCksIGluY2x1ZGVfZGlyZWN0b3JpZXMpLAotICAgICAgICAgIHRydWUpOwotICBhdXRvIGltcG9ydF9mYnMgPSBmbGF0YnVmZmVyczo6R2VuZXJhdGVGQlMoaW1wb3J0X3BhcnNlciwgInRlc3QiKTsKLQotICAvLyBFbnN1cmUgZ2VuZXJhdGVkIGZpbGUgaXMgcGFyc2FibGUuCi0gIGZsYXRidWZmZXJzOjpQYXJzZXIgcGFyc2VyMjsKLSAgLy8gU2luY2UgYGltcG9ydGVkLmZic2AgaXNuJ3QgaW4gdGhlIGZpbGVzeXN0ZW0gQWJzb2x1dGVQYXRoIGNhbid0IGZpZ3VyZSBpdAotICAvLyBvdXQgYnkgaXRzZWxmLiBXZSBtYW51YWxseSBjb25zdHJ1Y3QgaXQgc28gUGFyc2VyIHdvcmtzLgotICBzdGQ6OnN0cmluZyBpbXBvcnRlZF9mYnMgPSBmbGF0YnVmZmVyczo6UG9zaXhQYXRoKAotICAgICAgZmxhdGJ1ZmZlcnM6OkFic29sdXRlUGF0aChwcm90b3BhdGgpICsgIi9pbXBvcnRlZC5mYnMiKTsKLSAgVEVTVF9FUShwYXJzZXIyLlBhcnNlKGltcG9ydF9mYnMuY19zdHIoKSwgaW5jbHVkZV9kaXJlY3RvcmllcywKLSAgICAgICAgICAgICAgICAgICAgICAgIGltcG9ydGVkX2Zicy5jX3N0cigpKSwKLSAgICAgICAgICB0cnVlKTsKLSAgVEVTVF9FUShwYXJzZXIyLlBhcnNlKGZicy5jX3N0cigpLCBudWxscHRyKSwgdHJ1ZSk7Ci0gIFRFU1RfRVFfU1RSKGZicy5jX3N0cigpLCBnb2xkZW5maWxlLmNfc3RyKCkpOwotCi0gIC8vIFBhcnNlIHByb3RvIHdpdGggLS1vbmVvZi11bmlvbiBvcHRpb24uCi0gIG9wdHMucHJvdG9fb25lb2ZfdW5pb24gPSB0cnVlOwotICBmbGF0YnVmZmVyczo6UGFyc2VyIHBhcnNlcjMob3B0cyk7Ci0gIFRFU1RfRVEocGFyc2VyMy5QYXJzZShwcm90b2ZpbGUuY19zdHIoKSwgaW5jbHVkZV9kaXJlY3RvcmllcyksIHRydWUpOwotCi0gIC8vIEdlbmVyYXRlIGZicy4KLSAgYXV0byBmYnNfdW5pb24gPSBmbGF0YnVmZmVyczo6R2VuZXJhdGVGQlMocGFyc2VyMywgInRlc3QiKTsKLQotICAvLyBFbnN1cmUgZ2VuZXJhdGVkIGZpbGUgaXMgcGFyc2FibGUuCi0gIGZsYXRidWZmZXJzOjpQYXJzZXIgcGFyc2VyNDsKLSAgVEVTVF9FUShwYXJzZXI0LlBhcnNlKGltcG9ydF9mYnMuY19zdHIoKSwgbnVsbHB0ciwgaW1wb3J0ZWRfZmJzLmNfc3RyKCkpLAotICAgICAgICAgIHRydWUpOwotICBURVNUX0VRKHBhcnNlcjQuUGFyc2UoZmJzX3VuaW9uLmNfc3RyKCksIG51bGxwdHIpLCB0cnVlKTsKLSAgVEVTVF9FUV9TVFIoZmJzX3VuaW9uLmNfc3RyKCksIGdvbGRlbnVuaW9uZmlsZS5jX3N0cigpKTsKLX0KLQotdGVtcGxhdGU8dHlwZW5hbWUgVD4KLXZvaWQgQ29tcGFyZVRhYmxlRmllbGRWYWx1ZShmbGF0YnVmZmVyczo6VGFibGUgKnRhYmxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYXRidWZmZXJzOjp2b2Zmc2V0X3Qgdm9mZnNldCwgVCB2YWwpIHsKLSAgVCByZWFkID0gdGFibGUtPkdldEZpZWxkKHZvZmZzZXQsIHN0YXRpY19jYXN0PFQ+KDApKTsKLSAgVEVTVF9FUShyZWFkLCB2YWwpOwotfQotCi12b2lkIFV0aWxDb252ZXJ0Q2FzZSgpIHsKLSAgewotICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dHVwbGU8c3RkOjpzdHJpbmcsIGZsYXRidWZmZXJzOjpDYXNlLCBzdGQ6OnN0cmluZz4+Ci0gICAgICAgIGNhc2VzID0gewotICAgICAgICAgIC8vIFRlc3RzIGZvciB0aGUgY29tbW9uIGNhc2VzCi0gICAgICAgICAgeyAidGhlX3F1aWNrX2Jyb3duX2ZveCIsIGZsYXRidWZmZXJzOjpDYXNlOjprVXBwZXJDYW1lbCwKLSAgICAgICAgICAgICJUaGVRdWlja0Jyb3duRm94IiB9LAotICAgICAgICAgIHsgInRoZV9xdWlja19icm93bl9mb3giLCBmbGF0YnVmZmVyczo6Q2FzZTo6a0xvd2VyQ2FtZWwsCi0gICAgICAgICAgICAidGhlUXVpY2tCcm93bkZveCIgfSwKLSAgICAgICAgICB7ICJ0aGVfcXVpY2tfYnJvd25fZm94IiwgZmxhdGJ1ZmZlcnM6OkNhc2U6OmtTbmFrZSwKLSAgICAgICAgICAgICJ0aGVfcXVpY2tfYnJvd25fZm94IiB9LAotICAgICAgICAgIHsgInRoZV9xdWlja19icm93bl9mb3giLCBmbGF0YnVmZmVyczo6Q2FzZTo6a1NjcmVhbWluZ1NuYWtlLAotICAgICAgICAgICAgIlRIRV9RVUlDS19CUk9XTl9GT1giIH0sCi0gICAgICAgICAgeyAidGhlX3F1aWNrX2Jyb3duX2ZveCIsIGZsYXRidWZmZXJzOjpDYXNlOjprQWxsTG93ZXIsCi0gICAgICAgICAgICAidGhlX3F1aWNrX2Jyb3duX2ZveCIgfSwKLSAgICAgICAgICB7ICJ0aGVfcXVpY2tfYnJvd25fZm94IiwgZmxhdGJ1ZmZlcnM6OkNhc2U6OmtBbGxVcHBlciwKLSAgICAgICAgICAgICJUSEVfUVVJQ0tfQlJPV05fRk9YIiB9LAotICAgICAgICAgIHsgInRoZV9xdWlja19icm93bl9mb3giLCBmbGF0YnVmZmVyczo6Q2FzZTo6a1Vua25vd24sCi0gICAgICAgICAgICAidGhlX3F1aWNrX2Jyb3duX2ZveCIgfSwKLSAgICAgICAgICB7ICJ0aGVfcXVpY2tfYnJvd25fZm94IiwgZmxhdGJ1ZmZlcnM6OkNhc2U6OmtLZWVwLAotICAgICAgICAgICAgInRoZV9xdWlja19icm93bl9mb3giIH0sCi0KLSAgICAgICAgICAvLyBUZXN0cyBmb3Igc29tZSBzbmFrZV9jYXNlcyB3aGVyZSB0aGUgXyBpcyBvZGRseSBwbGFjZWQgb3IgbWlzc2luZy4KLSAgICAgICAgICB7ICJzaW5nbGUiLCBmbGF0YnVmZmVyczo6Q2FzZTo6a1VwcGVyQ2FtZWwsICJTaW5nbGUiIH0sCi0gICAgICAgICAgeyAiU2luZ2xlIiwgZmxhdGJ1ZmZlcnM6OkNhc2U6OmtVcHBlckNhbWVsLCAiU2luZ2xlIiB9LAotICAgICAgICAgIHsgIl9sZWFkaW5nIiwgZmxhdGJ1ZmZlcnM6OkNhc2U6OmtVcHBlckNhbWVsLCAiX2xlYWRpbmciIH0sCi0gICAgICAgICAgeyAidHJhaWxpbmdfIiwgZmxhdGJ1ZmZlcnM6OkNhc2U6OmtVcHBlckNhbWVsLCAiVHJhaWxpbmdfIiB9LAotICAgICAgICAgIHsgImRvdWJsZV9fdW5kZXJzY29yZSIsIGZsYXRidWZmZXJzOjpDYXNlOjprVXBwZXJDYW1lbCwKLSAgICAgICAgICAgICJEb3VibGVfdW5kZXJzY29yZSIgfSwKLSAgICAgICAgICB7ICJzaW5nbGUiLCBmbGF0YnVmZmVyczo6Q2FzZTo6a0xvd2VyQ2FtZWwsICJzaW5nbGUiIH0sCi0gICAgICAgICAgeyAiU2luZ2xlIiwgZmxhdGJ1ZmZlcnM6OkNhc2U6OmtMb3dlckNhbWVsLCAiU2luZ2xlIiB9LAotICAgICAgICAgIHsgIl9sZWFkaW5nIiwgZmxhdGJ1ZmZlcnM6OkNhc2U6OmtMb3dlckNhbWVsLCAiTGVhZGluZyIgfSwKLSAgICAgICAgICB7ICJ0cmFpbGluZ18iLCBmbGF0YnVmZmVyczo6Q2FzZTo6a0xvd2VyQ2FtZWwsICJ0cmFpbGluZ18iIH0sCi0gICAgICAgICAgeyAiZG91YmxlX191bmRlcnNjb3JlIiwgZmxhdGJ1ZmZlcnM6OkNhc2U6OmtMb3dlckNhbWVsLAotICAgICAgICAgICAgImRvdWJsZV91bmRlcnNjb3JlIiB9LAotCi0gICAgICAgICAgLy8gVGVzdHMgZm9yIHNvbWUgb3V0cHV0IHNuYWtlX2Nhc2VzCi0gICAgICAgICAgeyAic2luZ2xlIiwgZmxhdGJ1ZmZlcnM6OkNhc2U6OmtTbmFrZSwgInNpbmdsZSIgfSwKLSAgICAgICAgICB7ICJzaW5nbGUiLCBmbGF0YnVmZmVyczo6Q2FzZTo6a1NjcmVhbWluZ1NuYWtlLCAiU0lOR0xFIiB9LAotICAgICAgICAgIHsgIl9sZWFkaW5nIiwgZmxhdGJ1ZmZlcnM6OkNhc2U6OmtTY3JlYW1pbmdTbmFrZSwgIl9MRUFESU5HIiB9LAotICAgICAgICAgIHsgInRyYWlsaW5nXyIsIGZsYXRidWZmZXJzOjpDYXNlOjprU2NyZWFtaW5nU25ha2UsICJUUkFJTElOR18iIH0sCi0gICAgICAgICAgeyAiZG91YmxlX191bmRlcnNjb3JlIiwgZmxhdGJ1ZmZlcnM6OkNhc2U6OmtTY3JlYW1pbmdTbmFrZSwKLSAgICAgICAgICAgICJET1VCTEVfX1VOREVSU0NPUkUiIH0sCi0gICAgICAgIH07Ci0KLSAgICBmb3IgKGF1dG8gJnRlc3RfY2FzZSA6IGNhc2VzKSB7Ci0gICAgICBURVNUX0VRKHN0ZDo6Z2V0PDI+KHRlc3RfY2FzZSksCi0gICAgICAgICAgICAgIGZsYXRidWZmZXJzOjpDb252ZXJ0Q2FzZShzdGQ6OmdldDwwPih0ZXN0X2Nhc2UpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpnZXQ8MT4odGVzdF9jYXNlKSkpOwotICAgIH0KLSAgfQotCi0gIC8vIFRlc3RzIGZvciB0aGUgbm9uIHNuYWtlX2Nhc2UgaW5wdXRzLgotICB7Ci0gICAgc3RkOjp2ZWN0b3I8c3RkOjp0dXBsZTxmbGF0YnVmZmVyczo6Q2FzZSwgc3RkOjpzdHJpbmcsIGZsYXRidWZmZXJzOjpDYXNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmc+PgotICAgICAgICBjYXNlcyA9IHsKLSAgICAgICAgICB7IGZsYXRidWZmZXJzOjpDYXNlOjprVXBwZXJDYW1lbCwgIlRoZVF1aWNrQnJvd25Gb3giLAotICAgICAgICAgICAgZmxhdGJ1ZmZlcnM6OkNhc2U6OmtTbmFrZSwgInRoZV9xdWlja19icm93bl9mb3giIH0sCi0gICAgICAgICAgeyBmbGF0YnVmZmVyczo6Q2FzZTo6a0xvd2VyQ2FtZWwsICJ0aGVRdWlja0Jyb3duRm94IiwKLSAgICAgICAgICAgIGZsYXRidWZmZXJzOjpDYXNlOjprU25ha2UsICJ0aGVfcXVpY2tfYnJvd25fZm94IiB9LAotICAgICAgICAgIHsgZmxhdGJ1ZmZlcnM6OkNhc2U6OmtTbmFrZSwgInRoZV9xdWlja19icm93bl9mb3giLAotICAgICAgICAgICAgZmxhdGJ1ZmZlcnM6OkNhc2U6OmtTbmFrZSwgInRoZV9xdWlja19icm93bl9mb3giIH0sCi0gICAgICAgICAgeyBmbGF0YnVmZmVyczo6Q2FzZTo6a1NjcmVhbWluZ1NuYWtlLCAiVEhFX1FVSUNLX0JST1dOX0ZPWCIsCi0gICAgICAgICAgICBmbGF0YnVmZmVyczo6Q2FzZTo6a1NuYWtlLCAiVEhFX1FVSUNLX0JST1dOX0ZPWCIgfSwKLSAgICAgICAgICB7IGZsYXRidWZmZXJzOjpDYXNlOjprQWxsVXBwZXIsICJTSU5HTEUiLCBmbGF0YnVmZmVyczo6Q2FzZTo6a1NuYWtlLAotICAgICAgICAgICAgIlNJTkdMRSIgfSwKLSAgICAgICAgICB7IGZsYXRidWZmZXJzOjpDYXNlOjprQWxsTG93ZXIsICJzaW5nbGUiLCBmbGF0YnVmZmVyczo6Q2FzZTo6a1NuYWtlLAotICAgICAgICAgICAgInNpbmdsZSIgfSwKLSAgICAgICAgICB7IGZsYXRidWZmZXJzOjpDYXNlOjprVXBwZXJDYW1lbCwgIkFCQ3Rlc3QiLAotICAgICAgICAgICAgZmxhdGJ1ZmZlcnM6OkNhc2U6OmtTbmFrZSwgImFiY3Rlc3QiIH0sCi0gICAgICAgICAgeyBmbGF0YnVmZmVyczo6Q2FzZTo6a1VwcGVyQ2FtZWwsICJ0SGVfcVVpQ2tfQnJPd05fZk94IiwKLSAgICAgICAgICAgIGZsYXRidWZmZXJzOjpDYXNlOjprS2VlcCwgInRIZV9xVWlDa19Cck93Tl9mT3giIH0sCi0gICAgICAgIH07Ci0KLSAgICBmb3IgKGF1dG8gJnRlc3RfY2FzZSA6IGNhc2VzKSB7Ci0gICAgICBURVNUX0VRKHN0ZDo6Z2V0PDM+KHRlc3RfY2FzZSksCi0gICAgICAgICAgICAgIGZsYXRidWZmZXJzOjpDb252ZXJ0Q2FzZShzdGQ6OmdldDwxPih0ZXN0X2Nhc2UpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpnZXQ8Mj4odGVzdF9jYXNlKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6Z2V0PDA+KHRlc3RfY2FzZSkpKTsKLSAgICB9Ci0gIH0KLX0KLQotLy8gTG93IGxldmVsIHN0cmVzcy9mdXp6IHRlc3Q6IHNlcmlhbGl6ZS9kZXNlcmlhbGl6ZSBhIHZhcmlldHkgb2YKLS8vIGRpZmZlcmVudCBraW5kcyBvZiBkYXRhIGluIGRpZmZlcmVudCBjb21iaW5hdGlvbnMKLXZvaWQgRnV6elRlc3QxKCkgewotICAvLyBWYWx1ZXMgd2UncmUgdGVzdGluZyBhZ2FpbnN0OiBjaG9zZW4gdG8gZW5zdXJlIG5vIGJpdHMgZ2V0IGNob3BwZWQKLSAgLy8gb2ZmIGFueXdoZXJlLCBhbmQgYWxzbyBiZSBkaWZmZXJlbnQgZnJvbSBlYWNob3RoZXIuCi0gIGNvbnN0IHVpbnQ4X3QgYm9vbF92YWwgPSB0cnVlOwotICBjb25zdCBpbnQ4X3QgY2hhcl92YWwgPSAtMTI3OyAgLy8gMHg4MQotICBjb25zdCB1aW50OF90IHVjaGFyX3ZhbCA9IDB4RkY7Ci0gIGNvbnN0IGludDE2X3Qgc2hvcnRfdmFsID0gLTMyMjIyOyAgLy8gMHg4MjIyOwotICBjb25zdCB1aW50MTZfdCB1c2hvcnRfdmFsID0gMHhGRUVFOwotICBjb25zdCBpbnQzMl90IGludF92YWwgPSAweDgzMzMzMzMzOwotICBjb25zdCB1aW50MzJfdCB1aW50X3ZhbCA9IDB4RkREREREREQ7Ci0gIGNvbnN0IGludDY0X3QgbG9uZ192YWwgPSAweDg0NDQ0NDQ0NDQ0NDQ0NDRMTDsKLSAgY29uc3QgdWludDY0X3QgdWxvbmdfdmFsID0gMHhGQ0NDQ0NDQ0NDQ0NDQ0NDVUxMOwotICBjb25zdCBmbG9hdCBmbG9hdF92YWwgPSAzLjE0MTU5ZjsKLSAgY29uc3QgZG91YmxlIGRvdWJsZV92YWwgPSAzLjE0MTU5MjY1MzU5OwotCi0gIGNvbnN0IGludCB0ZXN0X3ZhbHVlc19tYXggPSAxMTsKLSAgY29uc3QgZmxhdGJ1ZmZlcnM6OnZvZmZzZXRfdCBmaWVsZHNfcGVyX29iamVjdCA9IDQ7Ci0gIGNvbnN0IGludCBudW1fZnV6el9vYmplY3RzID0gMTAwMDA7ICAvLyBUaGUgaGlnaGVyLCB0aGUgbW9yZSB0aG9yb3VnaCA6KQotCi0gIGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciBidWlsZGVyOwotCi0gIGxjZ19yZXNldCgpOyAgLy8gS2VlcCBpdCBkZXRlcm1pbmlzdGljLgotCi0gIGZsYXRidWZmZXJzOjp1b2Zmc2V0X3Qgb2JqZWN0c1tudW1fZnV6el9vYmplY3RzXTsKLQotICAvLyBHZW5lcmF0ZSBudW1fZnV6el9vYmplY3RzIHJhbmRvbSBvYmplY3RzIGVhY2ggY29uc2lzdGluZyBvZgotICAvLyBmaWVsZHNfcGVyX29iamVjdCBmaWVsZHMsIGVhY2ggb2YgYSByYW5kb20gdHlwZS4KLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1fZnV6el9vYmplY3RzOyBpKyspIHsKLSAgICBhdXRvIHN0YXJ0ID0gYnVpbGRlci5TdGFydFRhYmxlKCk7Ci0gICAgZm9yIChmbGF0YnVmZmVyczo6dm9mZnNldF90IGYgPSAwOyBmIDwgZmllbGRzX3Blcl9vYmplY3Q7IGYrKykgewotICAgICAgaW50IGNob2ljZSA9IGxjZ19yYW5kKCkgJSB0ZXN0X3ZhbHVlc19tYXg7Ci0gICAgICBhdXRvIG9mZiA9IGZsYXRidWZmZXJzOjpGaWVsZEluZGV4VG9PZmZzZXQoZik7Ci0gICAgICBzd2l0Y2ggKGNob2ljZSkgewotICAgICAgICBjYXNlIDA6IGJ1aWxkZXIuQWRkRWxlbWVudDx1aW50OF90PihvZmYsIGJvb2xfdmFsLCAwKTsgYnJlYWs7Ci0gICAgICAgIGNhc2UgMTogYnVpbGRlci5BZGRFbGVtZW50PGludDhfdD4ob2ZmLCBjaGFyX3ZhbCwgMCk7IGJyZWFrOwotICAgICAgICBjYXNlIDI6IGJ1aWxkZXIuQWRkRWxlbWVudDx1aW50OF90PihvZmYsIHVjaGFyX3ZhbCwgMCk7IGJyZWFrOwotICAgICAgICBjYXNlIDM6IGJ1aWxkZXIuQWRkRWxlbWVudDxpbnQxNl90PihvZmYsIHNob3J0X3ZhbCwgMCk7IGJyZWFrOwotICAgICAgICBjYXNlIDQ6IGJ1aWxkZXIuQWRkRWxlbWVudDx1aW50MTZfdD4ob2ZmLCB1c2hvcnRfdmFsLCAwKTsgYnJlYWs7Ci0gICAgICAgIGNhc2UgNTogYnVpbGRlci5BZGRFbGVtZW50PGludDMyX3Q+KG9mZiwgaW50X3ZhbCwgMCk7IGJyZWFrOwotICAgICAgICBjYXNlIDY6IGJ1aWxkZXIuQWRkRWxlbWVudDx1aW50MzJfdD4ob2ZmLCB1aW50X3ZhbCwgMCk7IGJyZWFrOwotICAgICAgICBjYXNlIDc6IGJ1aWxkZXIuQWRkRWxlbWVudDxpbnQ2NF90PihvZmYsIGxvbmdfdmFsLCAwKTsgYnJlYWs7Ci0gICAgICAgIGNhc2UgODogYnVpbGRlci5BZGRFbGVtZW50PHVpbnQ2NF90PihvZmYsIHVsb25nX3ZhbCwgMCk7IGJyZWFrOwotICAgICAgICBjYXNlIDk6IGJ1aWxkZXIuQWRkRWxlbWVudDxmbG9hdD4ob2ZmLCBmbG9hdF92YWwsIDApOyBicmVhazsKLSAgICAgICAgY2FzZSAxMDogYnVpbGRlci5BZGRFbGVtZW50PGRvdWJsZT4ob2ZmLCBkb3VibGVfdmFsLCAwKTsgYnJlYWs7Ci0gICAgICB9Ci0gICAgfQotICAgIG9iamVjdHNbaV0gPSBidWlsZGVyLkVuZFRhYmxlKHN0YXJ0KTsKLSAgfQotICBidWlsZGVyLlByZUFsaWduPGZsYXRidWZmZXJzOjpsYXJnZXN0X3NjYWxhcl90PigwKTsgIC8vIEFsaWduIHdob2xlIGJ1ZmZlci4KLQotICBsY2dfcmVzZXQoKTsgIC8vIFJlc2V0LgotCi0gIHVpbnQ4X3QgKmVvYiA9IGJ1aWxkZXIuR2V0Q3VycmVudEJ1ZmZlclBvaW50ZXIoKSArIGJ1aWxkZXIuR2V0U2l6ZSgpOwotCi0gIC8vIFRlc3QgdGhhdCBhbGwgb2JqZWN0cyB3ZSBnZW5lcmF0ZWQgYXJlIHJlYWRhYmxlIGFuZCByZXR1cm4gdGhlCi0gIC8vIGV4cGVjdGVkIHZhbHVlcy4gV2UgZ2VuZXJhdGUgcmFuZG9tIG9iamVjdHMgaW4gdGhlIHNhbWUgb3JkZXIKLSAgLy8gc28gdGhpcyBpcyBkZXRlcm1pbmlzdGljLgotICBmb3IgKGludCBpID0gMDsgaSA8IG51bV9mdXp6X29iamVjdHM7IGkrKykgewotICAgIGF1dG8gdGFibGUgPSByZWludGVycHJldF9jYXN0PGZsYXRidWZmZXJzOjpUYWJsZSAqPihlb2IgLSBvYmplY3RzW2ldKTsKLSAgICBmb3IgKGZsYXRidWZmZXJzOjp2b2Zmc2V0X3QgZiA9IDA7IGYgPCBmaWVsZHNfcGVyX29iamVjdDsgZisrKSB7Ci0gICAgICBpbnQgY2hvaWNlID0gbGNnX3JhbmQoKSAlIHRlc3RfdmFsdWVzX21heDsKLSAgICAgIGZsYXRidWZmZXJzOjp2b2Zmc2V0X3Qgb2ZmID0gZmxhdGJ1ZmZlcnM6OkZpZWxkSW5kZXhUb09mZnNldChmKTsKLSAgICAgIHN3aXRjaCAoY2hvaWNlKSB7Ci0gICAgICAgIGNhc2UgMDogQ29tcGFyZVRhYmxlRmllbGRWYWx1ZSh0YWJsZSwgb2ZmLCBib29sX3ZhbCk7IGJyZWFrOwotICAgICAgICBjYXNlIDE6IENvbXBhcmVUYWJsZUZpZWxkVmFsdWUodGFibGUsIG9mZiwgY2hhcl92YWwpOyBicmVhazsKLSAgICAgICAgY2FzZSAyOiBDb21wYXJlVGFibGVGaWVsZFZhbHVlKHRhYmxlLCBvZmYsIHVjaGFyX3ZhbCk7IGJyZWFrOwotICAgICAgICBjYXNlIDM6IENvbXBhcmVUYWJsZUZpZWxkVmFsdWUodGFibGUsIG9mZiwgc2hvcnRfdmFsKTsgYnJlYWs7Ci0gICAgICAgIGNhc2UgNDogQ29tcGFyZVRhYmxlRmllbGRWYWx1ZSh0YWJsZSwgb2ZmLCB1c2hvcnRfdmFsKTsgYnJlYWs7Ci0gICAgICAgIGNhc2UgNTogQ29tcGFyZVRhYmxlRmllbGRWYWx1ZSh0YWJsZSwgb2ZmLCBpbnRfdmFsKTsgYnJlYWs7Ci0gICAgICAgIGNhc2UgNjogQ29tcGFyZVRhYmxlRmllbGRWYWx1ZSh0YWJsZSwgb2ZmLCB1aW50X3ZhbCk7IGJyZWFrOwotICAgICAgICBjYXNlIDc6IENvbXBhcmVUYWJsZUZpZWxkVmFsdWUodGFibGUsIG9mZiwgbG9uZ192YWwpOyBicmVhazsKLSAgICAgICAgY2FzZSA4OiBDb21wYXJlVGFibGVGaWVsZFZhbHVlKHRhYmxlLCBvZmYsIHVsb25nX3ZhbCk7IGJyZWFrOwotICAgICAgICBjYXNlIDk6IENvbXBhcmVUYWJsZUZpZWxkVmFsdWUodGFibGUsIG9mZiwgZmxvYXRfdmFsKTsgYnJlYWs7Ci0gICAgICAgIGNhc2UgMTA6IENvbXBhcmVUYWJsZUZpZWxkVmFsdWUodGFibGUsIG9mZiwgZG91YmxlX3ZhbCk7IGJyZWFrOwotICAgICAgfQotICAgIH0KLSAgfQotfQotCi0vLyBIaWdoIGxldmVsIHN0cmVzcy9mdXp6IHRlc3Q6IGdlbmVyYXRlIGEgYmlnIHNjaGVtYSBhbmQKLS8vIG1hdGNoaW5nIGpzb24gZGF0YSBpbiByYW5kb20gY29tYmluYXRpb25zLCB0aGVuIHBhcnNlIGJvdGgsCi0vLyBnZW5lcmF0ZSBqc29uIGJhY2sgZnJvbSB0aGUgYmluYXJ5LCBhbmQgY29tcGFyZSB3aXRoIHRoZSBvcmlnaW5hbC4KLXZvaWQgRnV6elRlc3QyKCkgewotICBsY2dfcmVzZXQoKTsgIC8vIEtlZXAgaXQgZGV0ZXJtaW5pc3RpYy4KLQotICBjb25zdCBpbnQgbnVtX2RlZmluaXRpb25zID0gMzA7Ci0gIGNvbnN0IGludCBudW1fc3RydWN0X2RlZmluaXRpb25zID0gNTsgIC8vIFN1YnNldCBvZiBudW1fZGVmaW5pdGlvbnMuCi0gIGNvbnN0IGludCBmaWVsZHNfcGVyX2RlZmluaXRpb24gPSAxNTsKLSAgY29uc3QgaW50IGluc3RhbmNlc19wZXJfZGVmaW5pdGlvbiA9IDU7Ci0gIGNvbnN0IGludCBkZXByZWNhdGlvbl9yYXRlID0gMTA7ICAvLyAxIGluIGRlcHJlY2F0aW9uX3JhdGUgZmllbGRzIHdpbGwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJlIGRlcHJlY2F0ZWQuCi0KLSAgc3RkOjpzdHJpbmcgc2NoZW1hID0gIm5hbWVzcGFjZSB0ZXN0O1xuXG4iOwotCi0gIHN0cnVjdCBSbmREZWYgewotICAgIHN0ZDo6c3RyaW5nIGluc3RhbmNlc1tpbnN0YW5jZXNfcGVyX2RlZmluaXRpb25dOwotCi0gICAgLy8gU2luY2Ugd2UncmUgZ2VuZXJhdGluZyBzY2hlbWEgYW5kIGNvcnJlc3BvbmRpbmcgZGF0YSBpbiB0YW5kZW0sCi0gICAgLy8gdGhpcyBjb252ZW5pZW5jZSBmdW5jdGlvbiBhZGRzIHN0cmluZ3MgdG8gYm90aCBhdCBvbmNlLgotICAgIHN0YXRpYyB2b2lkIEFkZChSbmREZWYgKCZkZWZpbml0aW9uc19sKVtudW1fZGVmaW5pdGlvbnNdLAotICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyAmc2NoZW1hX2wsIGNvbnN0IGludCBpbnN0YW5jZXNfcGVyX2RlZmluaXRpb25fbCwKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqc2NoZW1hX2FkZCwgY29uc3QgY2hhciAqaW5zdGFuY2VfYWRkLAotICAgICAgICAgICAgICAgICAgICBpbnQgZGVmaW5pdGlvbikgewotICAgICAgc2NoZW1hX2wgKz0gc2NoZW1hX2FkZDsKLSAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaW5zdGFuY2VzX3Blcl9kZWZpbml0aW9uX2w7IGkrKykKLSAgICAgICAgZGVmaW5pdGlvbnNfbFtkZWZpbml0aW9uXS5pbnN0YW5jZXNbaV0gKz0gaW5zdGFuY2VfYWRkOwotICAgIH0KLSAgfTsKLQotLy8gY2xhbmctZm9ybWF0IG9mZgotICAjZGVmaW5lIEFkZFRvU2NoZW1hQW5kSW5zdGFuY2VzKHNjaGVtYV9hZGQsIGluc3RhbmNlX2FkZCkgXAotICAgIFJuZERlZjo6QWRkKGRlZmluaXRpb25zLCBzY2hlbWEsIGluc3RhbmNlc19wZXJfZGVmaW5pdGlvbiwgXAotICAgICAgICAgICAgICAgIHNjaGVtYV9hZGQsIGluc3RhbmNlX2FkZCwgZGVmaW5pdGlvbikKLQotICAjZGVmaW5lIER1bW15KCkgXAotICAgIFJuZERlZjo6QWRkKGRlZmluaXRpb25zLCBzY2hlbWEsIGluc3RhbmNlc19wZXJfZGVmaW5pdGlvbiwgXAotICAgICAgICAgICAgICAgICJieXRlIiwgIjEiLCBkZWZpbml0aW9uKQotICAvLyBjbGFuZy1mb3JtYXQgb24KLQotICBSbmREZWYgZGVmaW5pdGlvbnNbbnVtX2RlZmluaXRpb25zXTsKLQotICAvLyBXZSBhcmUgZ29pbmcgdG8gZ2VuZXJhdGUgbnVtX2RlZmluaXRpb25zLCB0aGUgZmlyc3QKLSAgLy8gbnVtX3N0cnVjdF9kZWZpbml0aW9ucyB3aWxsIGJlIHN0cnVjdHMsIHRoZSByZXN0IHRhYmxlcy4gRm9yIGVhY2gKLSAgLy8gZ2VuZXJhdGUgcmFuZG9tIGZpZWxkcywgc29tZSBvZiB3aGljaCBtYXkgYmUgc3RydWN0L3RhYmxlIHR5cGVzCi0gIC8vIHJlZmVycmluZyB0byBwcmV2aW91c2x5IGdlbmVyYXRlZCBzdHJ1Y3RzL3RhYmxlcy4KLSAgLy8gU2ltdWx0YW5lbm91c2x5LCB3ZSBnZW5lcmF0ZSBpbnN0YW5jZXNfcGVyX2RlZmluaXRpb24gSlNPTiBkYXRhCi0gIC8vIGRlZmluaXRpb25zLCB3aGljaCB3aWxsIGhhdmUgaWRlbnRpY2FsIHN0cnVjdHVyZSB0byB0aGUgc2NoZW1hCi0gIC8vIGJlaW5nIGdlbmVyYXRlZC4gV2UgZ2VuZXJhdGUgbXVsdGlwbGUgaW5zdGFuY2VzIHN1Y2ggdGhhdCB3aGVuIGNyZWF0aW5nCi0gIC8vIGhpZXJhcmNoeSwgd2UgZ2V0IHNvbWUgdmFyaWV0eSBieSBwaWNraW5nIG9uZSByYW5kb21seS4KLSAgZm9yIChpbnQgZGVmaW5pdGlvbiA9IDA7IGRlZmluaXRpb24gPCBudW1fZGVmaW5pdGlvbnM7IGRlZmluaXRpb24rKykgewotICAgIHN0ZDo6c3RyaW5nIGRlZmluaXRpb25fbmFtZSA9ICJEIiArIGZsYXRidWZmZXJzOjpOdW1Ub1N0cmluZyhkZWZpbml0aW9uKTsKLQotICAgIGJvb2wgaXNfc3RydWN0ID0gZGVmaW5pdGlvbiA8IG51bV9zdHJ1Y3RfZGVmaW5pdGlvbnM7Ci0KLSAgICBBZGRUb1NjaGVtYUFuZEluc3RhbmNlcygKLSAgICAgICAgKChpc19zdHJ1Y3QgPyAic3RydWN0ICIgOiAidGFibGUgIikgKyBkZWZpbml0aW9uX25hbWUgKyAiIHtcbiIpLmNfc3RyKCksCi0gICAgICAgICJ7XG4iKTsKLQotICAgIGZvciAoaW50IGZpZWxkID0gMDsgZmllbGQgPCBmaWVsZHNfcGVyX2RlZmluaXRpb247IGZpZWxkKyspIHsKLSAgICAgIGNvbnN0IGJvb2wgaXNfbGFzdF9maWVsZCA9IGZpZWxkID09IGZpZWxkc19wZXJfZGVmaW5pdGlvbiAtIDE7Ci0KLSAgICAgIC8vIERlcHJlY2F0ZSAxIGluIGRlcHJlY2F0aW9uX3JhdGUgZmllbGRzLiBPbmx5IHRhYmxlIGZpZWxkcyBjYW4gYmUKLSAgICAgIC8vIGRlcHJlY2F0ZWQuCi0gICAgICAvLyBEb24ndCBkZXByZWNhdGUgdGhlIGxhc3QgZmllbGQgdG8gYXZvaWQgZGFuZ2xpbmcgY29tbWFzIGluIEpTT04uCi0gICAgICBjb25zdCBib29sIGRlcHJlY2F0ZWQgPQotICAgICAgICAgICFpc19zdHJ1Y3QgJiYgIWlzX2xhc3RfZmllbGQgJiYgKGxjZ19yYW5kKCkgJSBkZXByZWNhdGlvbl9yYXRlID09IDApOwotCi0gICAgICBzdGQ6OnN0cmluZyBmaWVsZF9uYW1lID0gImYiICsgZmxhdGJ1ZmZlcnM6Ok51bVRvU3RyaW5nKGZpZWxkKTsKLSAgICAgIEFkZFRvU2NoZW1hQW5kSW5zdGFuY2VzKCgiICAiICsgZmllbGRfbmFtZSArICI6IikuY19zdHIoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlcHJlY2F0ZWQgPyAiIiA6IChmaWVsZF9uYW1lICsgIjogIikuY19zdHIoKSk7Ci0gICAgICAvLyBQaWNrIHJhbmRvbSB0eXBlOgotICAgICAgYXV0byBiYXNlX3R5cGUgPSBzdGF0aWNfY2FzdDxmbGF0YnVmZmVyczo6QmFzZVR5cGU+KAotICAgICAgICAgIGxjZ19yYW5kKCkgJSAoZmxhdGJ1ZmZlcnM6OkJBU0VfVFlQRV9VTklPTiArIDEpKTsKLSAgICAgIHN3aXRjaCAoYmFzZV90eXBlKSB7Ci0gICAgICAgIGNhc2UgZmxhdGJ1ZmZlcnM6OkJBU0VfVFlQRV9TVFJJTkc6Ci0gICAgICAgICAgaWYgKGlzX3N0cnVjdCkgewotICAgICAgICAgICAgRHVtbXkoKTsgIC8vIE5vIHN0cmluZ3MgaW4gc3RydWN0cy4KLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgQWRkVG9TY2hlbWFBbmRJbnN0YW5jZXMoInN0cmluZyIsIGRlcHJlY2F0ZWQgPyAiIiA6ICJcImhpXCIiKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgZmxhdGJ1ZmZlcnM6OkJBU0VfVFlQRV9WRUNUT1I6Ci0gICAgICAgICAgaWYgKGlzX3N0cnVjdCkgewotICAgICAgICAgICAgRHVtbXkoKTsgIC8vIE5vIHZlY3RvcnMgaW4gc3RydWN0cy4KLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgQWRkVG9TY2hlbWFBbmRJbnN0YW5jZXMoIlt1Ynl0ZV0iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVwcmVjYXRlZCA/ICIiIDogIltcbjAsXG4xLFxuMjU1XG5dIik7Ci0gICAgICAgICAgfQotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIGZsYXRidWZmZXJzOjpCQVNFX1RZUEVfTk9ORToKLSAgICAgICAgY2FzZSBmbGF0YnVmZmVyczo6QkFTRV9UWVBFX1VUWVBFOgotICAgICAgICBjYXNlIGZsYXRidWZmZXJzOjpCQVNFX1RZUEVfU1RSVUNUOgotICAgICAgICBjYXNlIGZsYXRidWZmZXJzOjpCQVNFX1RZUEVfVU5JT046Ci0gICAgICAgICAgaWYgKGRlZmluaXRpb24pIHsKLSAgICAgICAgICAgIC8vIFBpY2sgYSByYW5kb20gcHJldmlvdXMgZGVmaW5pdGlvbiBhbmQgcmFuZG9tIGRhdGEgaW5zdGFuY2Ugb2YKLSAgICAgICAgICAgIC8vIHRoYXQgZGVmaW5pdGlvbi4KLSAgICAgICAgICAgIGludCBkZWZyZWYgPSBsY2dfcmFuZCgpICUgZGVmaW5pdGlvbjsKLSAgICAgICAgICAgIGludCBpbnN0YW5jZSA9IGxjZ19yYW5kKCkgJSBpbnN0YW5jZXNfcGVyX2RlZmluaXRpb247Ci0gICAgICAgICAgICBBZGRUb1NjaGVtYUFuZEluc3RhbmNlcygKLSAgICAgICAgICAgICAgICAoIkQiICsgZmxhdGJ1ZmZlcnM6Ok51bVRvU3RyaW5nKGRlZnJlZikpLmNfc3RyKCksCi0gICAgICAgICAgICAgICAgZGVwcmVjYXRlZCA/ICIiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICA6IGRlZmluaXRpb25zW2RlZnJlZl0uaW5zdGFuY2VzW2luc3RhbmNlXS5jX3N0cigpKTsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gSWYgdGhpcyBpcyB0aGUgZmlyc3QgZGVmaW5pdGlvbiwgd2UgaGF2ZSBubyBkZWZpbml0aW9uIHdlIGNhbgotICAgICAgICAgICAgLy8gcmVmZXIgdG8uCi0gICAgICAgICAgICBEdW1teSgpOwotICAgICAgICAgIH0KLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBmbGF0YnVmZmVyczo6QkFTRV9UWVBFX0JPT0w6Ci0gICAgICAgICAgQWRkVG9TY2hlbWFBbmRJbnN0YW5jZXMoCi0gICAgICAgICAgICAgICJib29sIiwgZGVwcmVjYXRlZCA/ICIiIDogKGxjZ19yYW5kKCkgJSAyID8gInRydWUiIDogImZhbHNlIikpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIGZsYXRidWZmZXJzOjpCQVNFX1RZUEVfQVJSQVk6Ci0gICAgICAgICAgaWYgKCFpc19zdHJ1Y3QpIHsKLSAgICAgICAgICAgIEFkZFRvU2NoZW1hQW5kSW5zdGFuY2VzKAotICAgICAgICAgICAgICAgICJ1Ynl0ZSIsCi0gICAgICAgICAgICAgICAgZGVwcmVjYXRlZCA/ICIiIDogIjI1NSIpOyAgLy8gTm8gZml4ZWQtbGVuZ3RoIGFycmF5cyBpbiB0YWJsZXMuCi0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIEFkZFRvU2NoZW1hQW5kSW5zdGFuY2VzKCJbaW50OjNdIiwgZGVwcmVjYXRlZCA/ICIiIDogIltcbixcbixcbl0iKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgLy8gQWxsIHRoZSBzY2FsYXIgdHlwZXMuCi0gICAgICAgICAgc2NoZW1hICs9IGZsYXRidWZmZXJzOjprVHlwZU5hbWVzW2Jhc2VfdHlwZV07Ci0KLSAgICAgICAgICBpZiAoIWRlcHJlY2F0ZWQpIHsKLSAgICAgICAgICAgIC8vIFdlIHdhbnQgZWFjaCBpbnN0YW5jZSB0byB1c2UgaXRzIG93biByYW5kb20gdmFsdWUuCi0gICAgICAgICAgICBmb3IgKGludCBpbnN0ID0gMDsgaW5zdCA8IGluc3RhbmNlc19wZXJfZGVmaW5pdGlvbjsgaW5zdCsrKQotICAgICAgICAgICAgICBkZWZpbml0aW9uc1tkZWZpbml0aW9uXS5pbnN0YW5jZXNbaW5zdF0gKz0KLSAgICAgICAgICAgICAgICAgIGZsYXRidWZmZXJzOjpJc0Zsb2F0KGJhc2VfdHlwZSkKLSAgICAgICAgICAgICAgICAgICAgICA/IGZsYXRidWZmZXJzOjpOdW1Ub1N0cmluZzxkb3VibGU+KGxjZ19yYW5kKCkgJSAxMjgpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLmNfc3RyKCkKLSAgICAgICAgICAgICAgICAgICAgICA6IGZsYXRidWZmZXJzOjpOdW1Ub1N0cmluZzxpbnQ+KGxjZ19yYW5kKCkgJSAxMjgpLmNfc3RyKCk7Ci0gICAgICAgICAgfQotICAgICAgfQotICAgICAgQWRkVG9TY2hlbWFBbmRJbnN0YW5jZXMoZGVwcmVjYXRlZCA/ICIoZGVwcmVjYXRlZCk7XG4iIDogIjtcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXByZWNhdGVkICAgICAgPyAiIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBpc19sYXN0X2ZpZWxkID8gIlxuIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogIixcbiIpOwotICAgIH0KLSAgICBBZGRUb1NjaGVtYUFuZEluc3RhbmNlcygifVxuXG4iLCAifSIpOwotICB9Ci0KLSAgc2NoZW1hICs9ICJyb290X3R5cGUgRCIgKyBmbGF0YnVmZmVyczo6TnVtVG9TdHJpbmcobnVtX2RlZmluaXRpb25zIC0gMSk7Ci0gIHNjaGVtYSArPSAiO1xuIjsKLQotICBmbGF0YnVmZmVyczo6UGFyc2VyIHBhcnNlcjsKLQotICAvLyBXaWxsIG5vdCBjb21wYXJlIGFnYWluc3QgdGhlIG9yaWdpbmFsIGlmIHdlIGRvbid0IHdyaXRlIGRlZmF1bHRzCi0gIHBhcnNlci5idWlsZGVyXy5Gb3JjZURlZmF1bHRzKHRydWUpOwotCi0gIC8vIFBhcnNlIHRoZSBzY2hlbWEsIHBhcnNlIHRoZSBnZW5lcmF0ZWQgZGF0YSwgdGhlbiBnZW5lcmF0ZSB0ZXh0IGJhY2sKLSAgLy8gZnJvbSB0aGUgYmluYXJ5IGFuZCBjb21wYXJlIGFnYWluc3QgdGhlIG9yaWdpbmFsLgotICBURVNUX0VRKHBhcnNlci5QYXJzZShzY2hlbWEuY19zdHIoKSksIHRydWUpOwotCi0gIGNvbnN0IHN0ZDo6c3RyaW5nICZqc29uID0KLSAgICAgIGRlZmluaXRpb25zW251bV9kZWZpbml0aW9ucyAtIDFdLmluc3RhbmNlc1swXSArICJcbiI7Ci0KLSAgVEVTVF9FUShwYXJzZXIuUGFyc2UoanNvbi5jX3N0cigpKSwgdHJ1ZSk7Ci0KLSAgc3RkOjpzdHJpbmcganNvbmdlbjsKLSAgcGFyc2VyLm9wdHMuaW5kZW50X3N0ZXAgPSAwOwotICBhdXRvIHJlc3VsdCA9Ci0gICAgICBHZW5lcmF0ZVRleHQocGFyc2VyLCBwYXJzZXIuYnVpbGRlcl8uR2V0QnVmZmVyUG9pbnRlcigpLCAmanNvbmdlbik7Ci0gIFRFU1RfRVEocmVzdWx0LCB0cnVlKTsKLQotICBpZiAoanNvbmdlbiAhPSBqc29uKSB7Ci0gICAgLy8gVGhlc2Ugc3RyaW5ncyBhcmUgbGFyZ2VyIHRoYW4gYSBtZWdhYnl0ZSwgc28gd2Ugc2hvdyB0aGUgYnl0ZXMgYXJvdW5kCi0gICAgLy8gdGhlIGZpcnN0IGJ5dGVzIHRoYXQgYXJlIGRpZmZlcmVudCByYXRoZXIgdGhhbiB0aGUgd2hvbGUgc3RyaW5nLgotICAgIHNpemVfdCBsZW4gPSBzdGQ6Om1pbihqc29uLmxlbmd0aCgpLCBqc29uZ2VuLmxlbmd0aCgpKTsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7Ci0gICAgICBpZiAoanNvbltpXSAhPSBqc29uZ2VuW2ldKSB7Ci0gICAgICAgIGkgLT0gc3RkOjptaW4oc3RhdGljX2Nhc3Q8c2l6ZV90PigxMCksIGkpOyAgLy8gc2hvdyBzb21lIGNvbnRleHQ7Ci0gICAgICAgIHNpemVfdCBlbmQgPSBzdGQ6Om1pbihsZW4sIGkgKyAyMCk7Ci0gICAgICAgIGZvciAoOyBpIDwgZW5kOyBpKyspCi0gICAgICAgICAgVEVTVF9PVVRQVVRfTElORSgiYXQgJWQ6IGZvdW5kIFwiJWNcIiwgZXhwZWN0ZWQgXCIlY1wiXG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50PihpKSwganNvbmdlbltpXSwganNvbltpXSk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgIH0KLSAgICBURVNUX05PVE5VTEwobnVsbHB0cik7ICAvLy1WNTAxICh0aGlzIGNvbW1lbnQgc3VwcmVzc2VzIENXRS01NzAgd2FybmluZykKLSAgfQotCi0vLyBjbGFuZy1mb3JtYXQgb2ZmCi0gICNpZmRlZiBGTEFUQlVGRkVSU19URVNUX1ZFUkJPU0UKLSAgICBURVNUX09VVFBVVF9MSU5FKCIlZGsgc2NoZW1hIHRlc3RlZCB3aXRoICVkayBvZiBqc29uXG4iLAotICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50PihzY2hlbWEubGVuZ3RoKCkgLyAxMDI0KSwKLSAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludD4oanNvbi5sZW5ndGgoKSAvIDEwMjQpKTsKLSAgI2VuZGlmCi0gIC8vIGNsYW5nLWZvcm1hdCBvbgotfQotCi0vLyBUZXN0IHRoYXQgcGFyc2VyIGVycm9ycyBhcmUgYWN0dWFsbHkgZ2VuZXJhdGVkLgotdm9pZCBUZXN0RXJyb3JfKGNvbnN0IGNoYXIgKnNyYywgY29uc3QgY2hhciAqZXJyb3Jfc3Vic3RyLCBib29sIHN0cmljdF9qc29uLAotICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmZpbGUsIGludCBsaW5lLCBjb25zdCBjaGFyICpmdW5jKSB7Ci0gIGZsYXRidWZmZXJzOjpJRExPcHRpb25zIG9wdHM7Ci0gIG9wdHMuc3RyaWN0X2pzb24gPSBzdHJpY3RfanNvbjsKLSAgZmxhdGJ1ZmZlcnM6OlBhcnNlciBwYXJzZXIob3B0cyk7Ci0gIGlmIChwYXJzZXIuUGFyc2Uoc3JjKSkgewotICAgIFRlc3RGYWlsKCJ0cnVlIiwgImZhbHNlIiwKLSAgICAgICAgICAgICAoInBhcnNlci5QYXJzZShcIiIgKyBzdGQ6OnN0cmluZyhzcmMpICsgIlwiKSIpLmNfc3RyKCksIGZpbGUsIGxpbmUsCi0gICAgICAgICAgICAgZnVuYyk7Ci0gIH0gZWxzZSBpZiAoIXN0cnN0cihwYXJzZXIuZXJyb3JfLmNfc3RyKCksIGVycm9yX3N1YnN0cikpIHsKLSAgICBUZXN0RmFpbChlcnJvcl9zdWJzdHIsIHBhcnNlci5lcnJvcl8uY19zdHIoKSwKLSAgICAgICAgICAgICAoInBhcnNlci5QYXJzZShcIiIgKyBzdGQ6OnN0cmluZyhzcmMpICsgIlwiKSIpLmNfc3RyKCksIGZpbGUsIGxpbmUsCi0gICAgICAgICAgICAgZnVuYyk7Ci0gIH0KLX0KLQotdm9pZCBUZXN0RXJyb3JfKGNvbnN0IGNoYXIgKnNyYywgY29uc3QgY2hhciAqZXJyb3Jfc3Vic3RyLCBjb25zdCBjaGFyICpmaWxlLAotICAgICAgICAgICAgICAgIGludCBsaW5lLCBjb25zdCBjaGFyICpmdW5jKSB7Ci0gIFRlc3RFcnJvcl8oc3JjLCBlcnJvcl9zdWJzdHIsIGZhbHNlLCBmaWxlLCBsaW5lLCBmdW5jKTsKLX0KLQotI2lmZGVmIF9XSU4zMgotIyAgZGVmaW5lIFRlc3RFcnJvcihzcmMsIC4uLikgXAotICAgIFRlc3RFcnJvcl8oc3JjLCBfX1ZBX0FSR1NfXywgX19GSUxFX18sIF9fTElORV9fLCBfX0ZVTkNUSU9OX18pCi0jZWxzZQotIyAgZGVmaW5lIFRlc3RFcnJvcihzcmMsIC4uLikgXAotICAgIFRlc3RFcnJvcl8oc3JjLCBfX1ZBX0FSR1NfXywgX19GSUxFX18sIF9fTElORV9fLCBfX1BSRVRUWV9GVU5DVElPTl9fKQotI2VuZGlmCi0KLS8vIFRlc3QgdGhhdCBwYXJzaW5nIGVycm9ycyBvY2N1ciBhcyB3ZSdkIGV4cGVjdC4KLS8vIEFsc28gdXNlZnVsIGZvciBjb3ZlcmFnZSwgbWFraW5nIHN1cmUgdGhlc2UgcGF0aHMgYXJlIHJ1bi4KLXZvaWQgRXJyb3JUZXN0KCkgewotICAvLyBJbiBvcmRlciB0aGV5IGFwcGVhciBpbiBpZGxfcGFyc2VyLmNwcAotICBUZXN0RXJyb3IoInRhYmxlIFggeyBZOmJ5dGU7IH0gcm9vdF90eXBlIFg7IHsgWTogOTk5IH0iLCAiZG9lcyBub3QgZml0Iik7Ci0gIFRlc3RFcnJvcigiXCJcMCIsICJpbGxlZ2FsIik7Ci0gIFRlc3RFcnJvcigiXCJcXHEiLCAiZXNjYXBlIGNvZGUiKTsKLSAgVGVzdEVycm9yKCJ0YWJsZSAvLy8iLCAiZG9jdW1lbnRhdGlvbiIpOwotICBUZXN0RXJyb3IoIkAiLCAiaWxsZWdhbCIpOwotICBUZXN0RXJyb3IoInRhYmxlIDEiLCAiZXhwZWN0aW5nIik7Ci0gIFRlc3RFcnJvcigidGFibGUgWCB7IFk6W1tpbnRdXTsgfSIsICJuZXN0ZWQgdmVjdG9yIik7Ci0gIFRlc3RFcnJvcigidGFibGUgWCB7IFk6MTsgfSIsICJpbGxlZ2FsIHR5cGUiKTsKLSAgVGVzdEVycm9yKCJ0YWJsZSBYIHsgWTppbnQ7IFk6aW50OyB9IiwgImZpZWxkIGFscmVhZHkiKTsKLSAgVGVzdEVycm9yKCJ0YWJsZSBZIHt9IHRhYmxlIFggeyBZOmludDsgfSIsICJzYW1lIGFzIHRhYmxlIik7Ci0gIFRlc3RFcnJvcigic3RydWN0IFggeyBZOnN0cmluZzsgfSIsICJvbmx5IHNjYWxhciIpOwotICBUZXN0RXJyb3IoInN0cnVjdCBYIHsgYTp1aW50ID0gNDI7IH0iLCAiZGVmYXVsdCB2YWx1ZXMiKTsKLSAgVGVzdEVycm9yKCJlbnVtIFk6Ynl0ZSB7IFogPSAxIH0gdGFibGUgWCB7IHk6WTsgfSIsICJub3QgcGFydCBvZiBlbnVtIik7Ci0gIFRlc3RFcnJvcigic3RydWN0IFggeyBZOmludCAoZGVwcmVjYXRlZCk7IH0iLCAiZGVwcmVjYXRlIik7Ci0gIFRlc3RFcnJvcigidW5pb24gWiB7IFggfSB0YWJsZSBYIHsgWTpaOyB9IHJvb3RfdHlwZSBYOyB7IFk6IHt9LCBBOjEgfSIsCi0gICAgICAgICAgICAibWlzc2luZyB0eXBlIGZpZWxkIik7Ci0gIFRlc3RFcnJvcigidW5pb24gWiB7IFggfSB0YWJsZSBYIHsgWTpaOyB9IHJvb3RfdHlwZSBYOyB7IFlfdHlwZTogOTksIFk6IHsiLAotICAgICAgICAgICAgInR5cGUgaWQiKTsKLSAgVGVzdEVycm9yKCJ0YWJsZSBYIHsgWTppbnQ7IH0gcm9vdF90eXBlIFg7IHsgWjoiLCAidW5rbm93biBmaWVsZCIpOwotICBUZXN0RXJyb3IoInRhYmxlIFggeyBZOmludDsgfSByb290X3R5cGUgWDsgeyBZOiIsICJzdHJpbmcgY29uc3RhbnQiLCB0cnVlKTsKLSAgVGVzdEVycm9yKCJ0YWJsZSBYIHsgWTppbnQ7IH0gcm9vdF90eXBlIFg7IHsgXCJZXCI6MSwgfSIsICJzdHJpbmcgY29uc3RhbnQiLAotICAgICAgICAgICAgdHJ1ZSk7Ci0gIFRlc3RFcnJvcigKLSAgICAgICJzdHJ1Y3QgWCB7IFk6aW50OyBaOmludDsgfSB0YWJsZSBXIHsgVjpYOyB9IHJvb3RfdHlwZSBXOyAiCi0gICAgICAieyBWOnsgWToxIH0gfSIsCi0gICAgICAid3JvbmcgbnVtYmVyIik7Ci0gIFRlc3RFcnJvcigiZW51bSBFOmJ5dGUgeyBBIH0gdGFibGUgWCB7IFk6RTsgfSByb290X3R5cGUgWDsgeyBZOlUgfSIsCi0gICAgICAgICAgICAidW5rbm93biBlbnVtIHZhbHVlIik7Ci0gIFRlc3RFcnJvcigidGFibGUgWCB7IFk6Ynl0ZTsgfSByb290X3R5cGUgWDsgeyBZOjsgfSIsICJzdGFydGluZyIpOwotICBUZXN0RXJyb3IoImVudW0gWDpieXRlIHsgWSB9IGVudW0gWCB7IiwgImVudW0gYWxyZWFkeSIpOwotICBUZXN0RXJyb3IoImVudW0gWDpmbG9hdCB7fSIsICJ1bmRlcmx5aW5nIik7Ci0gIFRlc3RFcnJvcigiZW51bSBYOmJ5dGUgeyBZLCBZIH0iLCAidmFsdWUgYWxyZWFkeSIpOwotICBUZXN0RXJyb3IoImVudW0gWDpieXRlIHsgWT0yLCBaPTIgfSIsICJ1bmlxdWUiKTsKLSAgVGVzdEVycm9yKCJ0YWJsZSBYIHsgWTppbnQ7IH0gdGFibGUgWCB7IiwgImRhdGF0eXBlIGFscmVhZHkiKTsKLSAgVGVzdEVycm9yKCJ0YWJsZSBYIHsgfSB1bmlvbiBYIHsgfSIsICJkYXRhdHlwZSBhbHJlYWR5Iik7Ci0gIFRlc3RFcnJvcigidW5pb24gWCB7IH0gdGFibGUgWCB7IH0iLCAiZGF0YXR5cGUgYWxyZWFkeSIpOwotICBUZXN0RXJyb3IoIm5hbWVzcGFjZSBBOyB0YWJsZSBYIHsgfSBuYW1lc3BhY2UgQTsgdW5pb24gWCB7IH0iLAotICAgICAgICAgICAgImRhdGF0eXBlIGFscmVhZHkiKTsKLSAgVGVzdEVycm9yKCJuYW1lc3BhY2UgQTsgdW5pb24gWCB7IH0gbmFtZXNwYWNlIEE7IHRhYmxlIFggeyB9IiwKLSAgICAgICAgICAgICJkYXRhdHlwZSBhbHJlYWR5Iik7Ci0gIFRlc3RFcnJvcigic3RydWN0IFggKGZvcmNlX2FsaWduOiA3KSB7IFk6aW50OyB9IiwgImZvcmNlX2FsaWduIik7Ci0gIFRlc3RFcnJvcigic3RydWN0IFgge30iLCAic2l6ZSAwIik7Ci0gIFRlc3RFcnJvcigie30iLCAibm8gcm9vdCIpOwotICBUZXN0RXJyb3IoInRhYmxlIFggeyBZOmJ5dGU7IH0gcm9vdF90eXBlIFg7IHsgWToxIH0geyBZOjEgfSIsICJlbmQgb2YgZmlsZSIpOwotICBUZXN0RXJyb3IoInRhYmxlIFggeyBZOmJ5dGU7IH0gcm9vdF90eXBlIFg7IHsgWToxIH0gdGFibGUgWXsgWjppbnQgfSIsCi0gICAgICAgICAgICAiZW5kIG9mIGZpbGUiKTsKLSAgVGVzdEVycm9yKCJyb290X3R5cGUgWDsiLCAidW5rbm93biByb290Iik7Ci0gIFRlc3RFcnJvcigic3RydWN0IFggeyBZOmludDsgfSByb290X3R5cGUgWDsiLCAiYSB0YWJsZSIpOwotICBUZXN0RXJyb3IoInVuaW9uIFggeyBZIH0iLCAicmVmZXJlbmNlZCIpOwotICBUZXN0RXJyb3IoInVuaW9uIFogeyBYIH0gc3RydWN0IFggeyBZOmludDsgfSIsICJvbmx5IHRhYmxlcyIpOwotICBUZXN0RXJyb3IoInRhYmxlIFggeyBZOltpbnRdOyBZTGVuZ3RoOmludDsgfSIsICJjbGFzaCIpOwotICBUZXN0RXJyb3IoInRhYmxlIFggeyBZOmJ5dGU7IH0gcm9vdF90eXBlIFg7IHsgWToxLCBZOjIgfSIsICJtb3JlIHRoYW4gb25jZSIpOwotICAvLyBmbG9hdCB0byBpbnRlZ2VyIGNvbnZlcnNpb24gaXMgZm9yYmlkZGVuCi0gIFRlc3RFcnJvcigidGFibGUgWCB7IFk6aW50OyB9IHJvb3RfdHlwZSBYOyB7IFk6MS4wIH0iLCAiZmxvYXQiKTsKLSAgVGVzdEVycm9yKCJ0YWJsZSBYIHsgWTpib29sOyB9IHJvb3RfdHlwZSBYOyB7IFk6MS4wIH0iLCAiZmxvYXQiKTsKLSAgVGVzdEVycm9yKCJlbnVtIFg6Ym9vbCB7IFkgPSB0cnVlIH0iLCAibXVzdCBiZSBpbnRlZ3JhbCIpOwotICAvLyBBcnJheSBvZiBub24tc2NhbGFyCi0gIFRlc3RFcnJvcigidGFibGUgWCB7IHg6aW50OyB9IHN0cnVjdCBZIHsgeTpbWDoyXTsgfSIsCi0gICAgICAgICAgICAibWF5IGNvbnRhaW4gb25seSBzY2FsYXIgb3Igc3RydWN0IGZpZWxkcyIpOwotICAvLyBOb24tc25ha2UgY2FzZSBmaWVsZCBuYW1lcwotICBUZXN0RXJyb3IoInRhYmxlIFggeyBZOiBpbnQ7IH0gcm9vdF90eXBlIFk6IHtZOjEuMH0iLCAic25ha2VfY2FzZSIpOwotICAvLyBDb21wbGV4IGRlZmF1bHRzCi0gIFRlc3RFcnJvcigidGFibGUgWCB7IHk6IHN0cmluZyA9IDE7IH0iLCAiZXhwZWN0aW5nOiBzdHJpbmciKTsKLSAgVGVzdEVycm9yKCJ0YWJsZSBYIHsgeTogc3RyaW5nID0gW107IH0iLCAiIENhbm5vdCBhc3NpZ24gdG9rZW4iKTsKLSAgVGVzdEVycm9yKCJ0YWJsZSBYIHsgeTogW2ludF0gPSBbMV07IH0iLCAiRXhwZWN0ZWQgYF1gIik7Ci0gIFRlc3RFcnJvcigidGFibGUgWCB7IHk6IFtpbnRdID0gWzsgfSIsICJFeHBlY3RlZCBgXWAiKTsKLSAgVGVzdEVycm9yKCJ0YWJsZSBYIHsgeTogW2ludF0gPSBcIlwiOyB9IiwgInR5cGUgbWlzbWF0Y2giKTsKLSAgLy8gQW4gaWRlbnRpZmllciBjYW4ndCBzdGFydCBmcm9tIHNpZ24gKCt8LSkKLSAgVGVzdEVycm9yKCJ0YWJsZSBYIHsgLVk6IGludDsgfSByb290X3R5cGUgWToge1k6MS4wfSIsICJpZGVudGlmaWVyIik7Ci0gIFRlc3RFcnJvcigidGFibGUgWCB7ICtZOiBpbnQ7IH0gcm9vdF90eXBlIFk6IHtZOjEuMH0iLCAiaWRlbnRpZmllciIpOwotfQotCi10ZW1wbGF0ZTx0eXBlbmFtZSBUPgotVCBUZXN0VmFsdWUoY29uc3QgY2hhciAqanNvbiwgY29uc3QgY2hhciAqdHlwZV9uYW1lLAotICAgICAgICAgICAgY29uc3QgY2hhciAqZGVjbHMgPSBudWxscHRyKSB7Ci0gIGZsYXRidWZmZXJzOjpQYXJzZXIgcGFyc2VyOwotICBwYXJzZXIuYnVpbGRlcl8uRm9yY2VEZWZhdWx0cyh0cnVlKTsgIC8vIHJldHVybiBkZWZhdWx0cwotICBhdXRvIGNoZWNrX2RlZmF1bHQgPSBqc29uID8gZmFsc2UgOiB0cnVlOwotICBpZiAoY2hlY2tfZGVmYXVsdCkgeyBwYXJzZXIub3B0cy5vdXRwdXRfZGVmYXVsdF9zY2FsYXJzX2luX2pzb24gPSB0cnVlOyB9Ci0gIC8vIFNpbXBsZSBzY2hlbWEuCi0gIHN0ZDo6c3RyaW5nIHNjaGVtYSA9IHN0ZDo6c3RyaW5nKGRlY2xzID8gZGVjbHMgOiAiIikgKyAiXG4iICsKLSAgICAgICAgICAgICAgICAgICAgICAgInRhYmxlIFggeyB5OiIgKyBzdGQ6OnN0cmluZyh0eXBlX25hbWUpICsKLSAgICAgICAgICAgICAgICAgICAgICAgIjsgfSByb290X3R5cGUgWDsiOwotICBhdXRvIHNjaGVtYV9kb25lID0gcGFyc2VyLlBhcnNlKHNjaGVtYS5jX3N0cigpKTsKLSAgVEVTVF9FUV9TVFIocGFyc2VyLmVycm9yXy5jX3N0cigpLCAiIik7Ci0gIFRFU1RfRVEoc2NoZW1hX2RvbmUsIHRydWUpOwotCi0gIGF1dG8gZG9uZSA9IHBhcnNlci5QYXJzZShjaGVja19kZWZhdWx0ID8gInt9IiA6IGpzb24pOwotICBURVNUX0VRX1NUUihwYXJzZXIuZXJyb3JfLmNfc3RyKCksICIiKTsKLSAgVEVTVF9FUShkb25lLCB0cnVlKTsKLQotICAvLyBDaGVjayB3aXRoIHByaW50LgotICBzdGQ6OnN0cmluZyBwcmludF9iYWNrOwotICBwYXJzZXIub3B0cy5pbmRlbnRfc3RlcCA9IC0xOwotICBURVNUX0VRKEdlbmVyYXRlVGV4dChwYXJzZXIsIHBhcnNlci5idWlsZGVyXy5HZXRCdWZmZXJQb2ludGVyKCksICZwcmludF9iYWNrKSwKLSAgICAgICAgICB0cnVlKTsKLSAgLy8gcmVzdG9yZSB2YWx1ZSBmcm9tIGl0cyBkZWZhdWx0Ci0gIGlmIChjaGVja19kZWZhdWx0KSB7IFRFU1RfRVEocGFyc2VyLlBhcnNlKHByaW50X2JhY2suY19zdHIoKSksIHRydWUpOyB9Ci0KLSAgYXV0byByb290ID0gZmxhdGJ1ZmZlcnM6OkdldFJvb3Q8ZmxhdGJ1ZmZlcnM6OlRhYmxlPigKLSAgICAgIHBhcnNlci5idWlsZGVyXy5HZXRCdWZmZXJQb2ludGVyKCkpOwotICByZXR1cm4gcm9vdC0+R2V0RmllbGQ8VD4oZmxhdGJ1ZmZlcnM6OkZpZWxkSW5kZXhUb09mZnNldCgwKSwgMCk7Ci19Ci0KLWJvb2wgRmxvYXRDb21wYXJlKGZsb2F0IGEsIGZsb2F0IGIpIHsgcmV0dXJuIGZhYnMoYSAtIGIpIDwgMC4wMDE7IH0KLQotLy8gQWRkaXRpb25hbCBwYXJzZXIgdGVzdGluZyBub3QgY292ZXJlZCBlbHNld2hlcmUuCi12b2lkIFZhbHVlVGVzdCgpIHsKLSAgLy8gVGVzdCBzY2llbnRpZmljIG5vdGF0aW9uIG51bWJlcnMuCi0gIFRFU1RfRVEoCi0gICAgICBGbG9hdENvbXBhcmUoVGVzdFZhbHVlPGZsb2F0PigieyB5OjAuMDMxNDE1OWUrMiB9IiwgImZsb2F0IiksIDMuMTQxNTlmKSwKLSAgICAgIHRydWUpOwotICAvLyBudW1iZXIgaW4gc3RyaW5nCi0gIFRFU1RfRVEoRmxvYXRDb21wYXJlKFRlc3RWYWx1ZTxmbG9hdD4oInsgeTpcIjAuMDMxNDE1OWUrMlwiIH0iLCAiZmxvYXQiKSwKLSAgICAgICAgICAgICAgICAgICAgICAgMy4xNDE1OWYpLAotICAgICAgICAgIHRydWUpOwotCi0gIC8vIFRlc3QgY29udmVyc2lvbiBmdW5jdGlvbnMuCi0gIFRFU1RfRVEoRmxvYXRDb21wYXJlKFRlc3RWYWx1ZTxmbG9hdD4oInsgeTpjb3MocmFkKDE4MCkpIH0iLCAiZmxvYXQiKSwgLTEpLAotICAgICAgICAgIHRydWUpOwotCi0gIC8vIGludCBlbWJlZGRlZCB0byBzdHJpbmcKLSAgVEVTVF9FUShUZXN0VmFsdWU8aW50PigieyB5OlwiLTg3NlwiIH0iLCAiaW50PS0xMjMiKSwgLTg3Nik7Ci0gIFRFU1RfRVEoVGVzdFZhbHVlPGludD4oInsgeTpcIjg3NlwiIH0iLCAiaW50PS0xMjMiKSwgODc2KTsKLQotICAvLyBUZXN0IG5lZ2F0aXZlIGhleCBjb25zdGFudC4KLSAgVEVTVF9FUShUZXN0VmFsdWU8aW50PigieyB5Oi0weDhlYTAgfSIsICJpbnQ9LTB4OGVhMCIpLCAtMzY1MTIpOwotICBURVNUX0VRKFRlc3RWYWx1ZTxpbnQ+KG51bGxwdHIsICJpbnQ9LTB4OGVhMCIpLCAtMzY1MTIpOwotCi0gIC8vIHBvc2l0aXZlIGhleCBjb25zdGFudAotICBURVNUX0VRKFRlc3RWYWx1ZTxpbnQ+KCJ7IHk6MHgxYWJjZGVmIH0iLCAiaW50PTB4MSIpLCAweDFhYmNkZWYpOwotICAvLyB3aXRoIG9wdGlvbmFsICcrJyBzaWduCi0gIFRFU1RfRVEoVGVzdFZhbHVlPGludD4oInsgeTorMHgxYWJjZGVmIH0iLCAiaW50PSsweDEiKSwgMHgxYWJjZGVmKTsKLSAgLy8gaGV4IGluIHN0cmluZwotICBURVNUX0VRKFRlc3RWYWx1ZTxpbnQ+KCJ7IHk6XCIweDFhYmNkZWZcIiB9IiwgImludD0rMHgxIiksIDB4MWFiY2RlZik7Ci0KLSAgLy8gTWFrZSBzdXJlIHdlIGRvIHVuc2lnbmVkIDY0Yml0IGNvcnJlY3RseS4KLSAgVEVTVF9FUShUZXN0VmFsdWU8dWludDY0X3Q+KCJ7IHk6MTIzMzUwODk2NDQ2ODgzNDAxMzMgfSIsICJ1bG9uZyIpLAotICAgICAgICAgIDEyMzM1MDg5NjQ0Njg4MzQwMTMzVUxMKTsKLQotICAvLyBib29sIGluIHN0cmluZwotICBURVNUX0VRKFRlc3RWYWx1ZTxib29sPigieyB5OlwiZmFsc2VcIiB9IiwgImJvb2w9dHJ1ZSIpLCBmYWxzZSk7Ci0gIFRFU1RfRVEoVGVzdFZhbHVlPGJvb2w+KCJ7IHk6XCJ0cnVlXCIgfSIsICJib29sPVwidHJ1ZVwiIiksIHRydWUpOwotICBURVNUX0VRKFRlc3RWYWx1ZTxib29sPigieyB5OidmYWxzZScgfSIsICJib29sPXRydWUiKSwgZmFsc2UpOwotICBURVNUX0VRKFRlc3RWYWx1ZTxib29sPigieyB5Oid0cnVlJyB9IiwgImJvb2w9XCJ0cnVlXCIiKSwgdHJ1ZSk7Ci0KLSAgLy8gY2hlY2sgY29tbWVudHMgYmVmb3JlIGFuZCBhZnRlciBqc29uIG9iamVjdAotICBURVNUX0VRKFRlc3RWYWx1ZTxpbnQ+KCIvKmJlZm9yZSovIHsgeToxIH0gLyphZnRlciovIiwgImludCIpLCAxKTsKLSAgVEVTVF9FUShUZXN0VmFsdWU8aW50PigiLy9iZWZvcmUgXG4geyB5OjEgfSAvL2FmdGVyIiwgImludCIpLCAxKTsKLX0KLQotdm9pZCBOZXN0ZWRMaXN0VGVzdCgpIHsKLSAgZmxhdGJ1ZmZlcnM6OlBhcnNlciBwYXJzZXIxOwotICBURVNUX0VRKHBhcnNlcjEuUGFyc2UoInN0cnVjdCBUZXN0IHsgYTpzaG9ydDsgYjpieXRlOyB9IHRhYmxlIFQgeyBGOltUZXN0XTsgfSIKLSAgICAgICAgICAgICAgICAgICAgICAgICJyb290X3R5cGUgVDsiCi0gICAgICAgICAgICAgICAgICAgICAgICAieyBGOlsgWzEwLDIwXSwgWzMwLDQwXV0gfSIpLAotICAgICAgICAgIHRydWUpOwotfQotCi12b2lkIEVudW1TdHJpbmdzVGVzdCgpIHsKLSAgZmxhdGJ1ZmZlcnM6OlBhcnNlciBwYXJzZXIxOwotICBURVNUX0VRKHBhcnNlcjEuUGFyc2UoImVudW0gRTpieXRlIHsgQSwgQiwgQyB9IHRhYmxlIFQgeyBGOltFXTsgfSIKLSAgICAgICAgICAgICAgICAgICAgICAgICJyb290X3R5cGUgVDsiCi0gICAgICAgICAgICAgICAgICAgICAgICAieyBGOlsgQSwgQiwgXCJDXCIsIFwiQSBCIENcIiBdIH0iKSwKLSAgICAgICAgICB0cnVlKTsKLSAgZmxhdGJ1ZmZlcnM6OlBhcnNlciBwYXJzZXIyOwotICBURVNUX0VRKHBhcnNlcjIuUGFyc2UoImVudW0gRTpieXRlIHsgQSwgQiwgQyB9IHRhYmxlIFQgeyBGOltpbnRdOyB9IgotICAgICAgICAgICAgICAgICAgICAgICAgInJvb3RfdHlwZSBUOyIKLSAgICAgICAgICAgICAgICAgICAgICAgICJ7IEY6WyBcIkUuQ1wiLCBcIkUuQSBFLkIgRS5DXCIgXSB9IiksCi0gICAgICAgICAgdHJ1ZSk7Ci0gIC8vIHVuc2lnbmVkIGJpdF9mbGFncwotICBmbGF0YnVmZmVyczo6UGFyc2VyIHBhcnNlcjM7Ci0gIFRFU1RfRVEoCi0gICAgICBwYXJzZXIzLlBhcnNlKCJlbnVtIEU6dWludDE2IChiaXRfZmxhZ3MpIHsgRjAsIEYwNz03LCBGMDgsIEYxND0xNCwgRjE1IH0iCi0gICAgICAgICAgICAgICAgICAgICIgdGFibGUgVCB7IEY6IEUgPSBcIkYxNSBGMDhcIjsgfSIKLSAgICAgICAgICAgICAgICAgICAgInJvb3RfdHlwZSBUOyIpLAotICAgICAgdHJ1ZSk7Ci19Ci0KLXZvaWQgRW51bU5hbWVzVGVzdCgpIHsKLSAgVEVTVF9FUV9TVFIoIlJlZCIsIEVudW1OYW1lQ29sb3IoQ29sb3JfUmVkKSk7Ci0gIFRFU1RfRVFfU1RSKCJHcmVlbiIsIEVudW1OYW1lQ29sb3IoQ29sb3JfR3JlZW4pKTsKLSAgVEVTVF9FUV9TVFIoIkJsdWUiLCBFbnVtTmFtZUNvbG9yKENvbG9yX0JsdWUpKTsKLSAgLy8gQ2hlY2sgdGhhdCBDb2xvciB0byBzdHJpbmcgZG9uJ3QgY3Jhc2ggd2hpbGUgZGVjb2RlIGEgbWl4dHVyZSBvZiBDb2xvcnMuCi0gIC8vIDEpIEV4YW1wbGU6OkNvbG9yIGVudW0gaXMgZW51bSB3aXRoIHVuZml4ZWQgdW5kZXJseWluZyB0eXBlLgotICAvLyAyKSBWYWxpZCBlbnVtIHJhbmdlOiBbMDsgMl4oY2VpbChsb2cyKENvbG9yX0FOWSkpKSAtIDFdLgotICAvLyBDb25zZXF1ZW5jZTogQSB2YWx1ZSBpcyBvdXQgb2YgdGhpcyByYW5nZSB3aWxsIGxlYWQgdG8gVUIgKHNpbmNlIEMrKzE3KS4KLSAgLy8gRm9yIGRldGFpbHMgc2VlIEMrKzE3IHN0YW5kYXJkIG9yIGV4cGxhbmF0aW9uIG9uIHRoZSBTTzoKLSAgLy8gc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzE4MTk1MzEyL3doYXQtaGFwcGVucy1pZi15b3Utc3RhdGljLWNhc3QtaW52YWxpZC12YWx1ZS10by1lbnVtLWNsYXNzCi0gIFRFU1RfRVFfU1RSKCIiLCBFbnVtTmFtZUNvbG9yKHN0YXRpY19jYXN0PENvbG9yPigwKSkpOwotICBURVNUX0VRX1NUUigiIiwgRW51bU5hbWVDb2xvcihzdGF0aWNfY2FzdDxDb2xvcj4oQ29sb3JfQU5ZIC0gMSkpKTsKLSAgVEVTVF9FUV9TVFIoIiIsIEVudW1OYW1lQ29sb3Ioc3RhdGljX2Nhc3Q8Q29sb3I+KENvbG9yX0FOWSArIDEpKSk7Ci19Ci0KLXZvaWQgRW51bU91dE9mUmFuZ2VUZXN0KCkgewotICBUZXN0RXJyb3IoImVudW0gWDpieXRlIHsgWSA9IDEyOCB9IiwgImVudW0gdmFsdWUgZG9lcyBub3QgZml0Iik7Ci0gIFRlc3RFcnJvcigiZW51bSBYOmJ5dGUgeyBZID0gLTEyOSB9IiwgImVudW0gdmFsdWUgZG9lcyBub3QgZml0Iik7Ci0gIFRlc3RFcnJvcigiZW51bSBYOmJ5dGUgeyBZID0gMTI2LCBaMCwgWjEgfSIsICJlbnVtIHZhbHVlIGRvZXMgbm90IGZpdCIpOwotICBUZXN0RXJyb3IoImVudW0gWDp1Ynl0ZSB7IFkgPSAtMSB9IiwgImVudW0gdmFsdWUgZG9lcyBub3QgZml0Iik7Ci0gIFRlc3RFcnJvcigiZW51bSBYOnVieXRlIHsgWSA9IDI1NiB9IiwgImVudW0gdmFsdWUgZG9lcyBub3QgZml0Iik7Ci0gIFRlc3RFcnJvcigiZW51bSBYOnVieXRlIHsgWSA9IDI1NSwgWiB9IiwgImVudW0gdmFsdWUgZG9lcyBub3QgZml0Iik7Ci0gIFRlc3RFcnJvcigidGFibGUgWXt9IHVuaW9uIFggeyBZID0gLTEgfSIsICJlbnVtIHZhbHVlIGRvZXMgbm90IGZpdCIpOwotICBUZXN0RXJyb3IoInRhYmxlIFl7fSB1bmlvbiBYIHsgWSA9IDI1NiB9IiwgImVudW0gdmFsdWUgZG9lcyBub3QgZml0Iik7Ci0gIFRlc3RFcnJvcigidGFibGUgWXt9IHVuaW9uIFggeyBZID0gMjU1LCBaOlkgfSIsICJlbnVtIHZhbHVlIGRvZXMgbm90IGZpdCIpOwotICBUZXN0RXJyb3IoImVudW0gWDppbnQgeyBZID0gLTIxNDc0ODM2NDkgfSIsICJlbnVtIHZhbHVlIGRvZXMgbm90IGZpdCIpOwotICBUZXN0RXJyb3IoImVudW0gWDppbnQgeyBZID0gMjE0NzQ4MzY0OCB9IiwgImVudW0gdmFsdWUgZG9lcyBub3QgZml0Iik7Ci0gIFRlc3RFcnJvcigiZW51bSBYOnVpbnQgeyBZID0gLTEgfSIsICJlbnVtIHZhbHVlIGRvZXMgbm90IGZpdCIpOwotICBUZXN0RXJyb3IoImVudW0gWDp1aW50IHsgWSA9IDQyOTQ5NjcyOTcgfSIsICJlbnVtIHZhbHVlIGRvZXMgbm90IGZpdCIpOwotICBUZXN0RXJyb3IoImVudW0gWDpsb25nIHsgWSA9IDkyMjMzNzIwMzY4NTQ3NzU4MDggfSIsICJkb2VzIG5vdCBmaXQiKTsKLSAgVGVzdEVycm9yKCJlbnVtIFg6bG9uZyB7IFkgPSA5MjIzMzcyMDM2ODU0Nzc1ODA3LCBaIH0iLAotICAgICAgICAgICAgImVudW0gdmFsdWUgZG9lcyBub3QgZml0Iik7Ci0gIFRlc3RFcnJvcigiZW51bSBYOnVsb25nIHsgWSA9IC0xIH0iLCAiZG9lcyBub3QgZml0Iik7Ci0gIFRlc3RFcnJvcigiZW51bSBYOnVieXRlIChiaXRfZmxhZ3MpIHsgWT04IH0iLCAiYml0IGZsYWcgb3V0Iik7Ci0gIFRlc3RFcnJvcigiZW51bSBYOmJ5dGUgKGJpdF9mbGFncykgeyBZPTcgfSIsICJtdXN0IGJlIHVuc2lnbmVkIik7ICAvLyAtMTI4Ci0gIC8vIGJpdF9mbGdzIG91dCBvZiByYW5nZQotICBUZXN0RXJyb3IoImVudW0gWDp1Ynl0ZSAoYml0X2ZsYWdzKSB7IFkwLFkxLFkyLFkzLFk0LFk1LFk2LFk3LFk4IH0iLAotICAgICAgICAgICAgIm91dCBvZiByYW5nZSIpOwotfQotCi12b2lkIEVudW1WYWx1ZVRlc3QoKSB7Ci0gIC8vIGpzb246ICJ7IFk6MCB9Iiwgc2NoZW1hOiB0YWJsZSBYIHsgeTogIkUifQotICAvLyAwIGluIGVudW0gKFY9MCkgRSB0aGVuIFk9MCBpcyB2YWxpZC4KLSAgVEVTVF9FUShUZXN0VmFsdWU8aW50PigieyB5OjAgfSIsICJFIiwgImVudW0gRTppbnQgeyBWIH0iKSwgMCk7Ci0gIFRFU1RfRVEoVGVzdFZhbHVlPGludD4oInsgeTpWIH0iLCAiRSIsICJlbnVtIEU6aW50IHsgViB9IiksIDApOwotICAvLyBBIGRlZmF1bHQgdmFsdWUgb2YgWSBpcyAwLgotICBURVNUX0VRKFRlc3RWYWx1ZTxpbnQ+KCJ7IH0iLCAiRSIsICJlbnVtIEU6aW50IHsgViB9IiksIDApOwotICBURVNUX0VRKFRlc3RWYWx1ZTxpbnQ+KCJ7IHk6NSB9IiwgIkU9ViIsICJlbnVtIEU6aW50IHsgVj01IH0iKSwgNSk7Ci0gIC8vIEdlbmVyYXRlIGpzb24gd2l0aCBkZWZhdWx0cyBhbmQgY2hlY2suCi0gIFRFU1RfRVEoVGVzdFZhbHVlPGludD4obnVsbHB0ciwgIkU9ViIsICJlbnVtIEU6aW50IHsgVj01IH0iKSwgNSk7Ci0gIC8vIDUgaW4gZW51bQotICBURVNUX0VRKFRlc3RWYWx1ZTxpbnQ+KCJ7IHk6NSB9IiwgIkUiLCAiZW51bSBFOmludCB7IFosIFY9NSB9IiksIDUpOwotICBURVNUX0VRKFRlc3RWYWx1ZTxpbnQ+KCJ7IHk6NSB9IiwgIkU9ViIsICJlbnVtIEU6aW50IHsgWiwgVj01IH0iKSwgNSk7Ci0gIC8vIEdlbmVyYXRlIGpzb24gd2l0aCBkZWZhdWx0cyBhbmQgY2hlY2suCi0gIFRFU1RfRVEoVGVzdFZhbHVlPGludD4obnVsbHB0ciwgIkUiLCAiZW51bSBFOmludCB7IFosIFY9NSB9IiksIDApOwotICBURVNUX0VRKFRlc3RWYWx1ZTxpbnQ+KG51bGxwdHIsICJFPVYiLCAiZW51bSBFOmludCB7IFosIFY9NSB9IiksIDUpOwotICAvLyB1ODQgdGVzdAotICBURVNUX0VRKFRlc3RWYWx1ZTx1aW50NjRfdD4obnVsbHB0ciwgIkU9ViIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZW51bSBFOnVsb25nIHsgViA9IDEzODM1MDU4MDU1MjgyMTYzNzEyIH0iKSwKLSAgICAgICAgICAxMzgzNTA1ODA1NTI4MjE2MzcxMlVMTCk7Ci0gIFRFU1RfRVEoVGVzdFZhbHVlPHVpbnQ2NF90PihudWxscHRyLCAiRT1WIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJlbnVtIEU6dWxvbmcgeyBWID0gMTg0NDY3NDQwNzM3MDk1NTE2MTUgfSIpLAotICAgICAgICAgIDE4NDQ2NzQ0MDczNzA5NTUxNjE1VUxMKTsKLSAgLy8gQXNzaWduIG5vbi1lbnVtIHZhbHVlIHRvIGVudW0gZmllbGQuIElzIGl0IHJpZ2h0PwotICBURVNUX0VRKFRlc3RWYWx1ZTxpbnQ+KCJ7IHk6NyB9IiwgIkUiLCAiZW51bSBFOmludCB7IFYgPSAwIH0iKSwgNyk7Ci0gIC8vIENoZWNrIHRoYXQgbm9uLWFzY2VuZGluZyB2YWx1ZXMgYXJlIHZhbGlkLgotICBURVNUX0VRKFRlc3RWYWx1ZTxpbnQ+KCJ7IHk6NSB9IiwgIkU9ViIsICJlbnVtIEU6aW50IHsgWj0xMCwgVj01IH0iKSwgNSk7Ci19Ci0KLXZvaWQgSW50ZWdlck91dE9mUmFuZ2VUZXN0KCkgewotICBUZXN0RXJyb3IoInRhYmxlIFQgeyBGOmJ5dGU7IH0gcm9vdF90eXBlIFQ7IHsgRjoxMjggfSIsCi0gICAgICAgICAgICAiY29uc3RhbnQgZG9lcyBub3QgZml0Iik7Ci0gIFRlc3RFcnJvcigidGFibGUgVCB7IEY6Ynl0ZTsgfSByb290X3R5cGUgVDsgeyBGOi0xMjkgfSIsCi0gICAgICAgICAgICAiY29uc3RhbnQgZG9lcyBub3QgZml0Iik7Ci0gIFRlc3RFcnJvcigidGFibGUgVCB7IEY6dWJ5dGU7IH0gcm9vdF90eXBlIFQ7IHsgRjoyNTYgfSIsCi0gICAgICAgICAgICAiY29uc3RhbnQgZG9lcyBub3QgZml0Iik7Ci0gIFRlc3RFcnJvcigidGFibGUgVCB7IEY6dWJ5dGU7IH0gcm9vdF90eXBlIFQ7IHsgRjotMSB9IiwKLSAgICAgICAgICAgICJjb25zdGFudCBkb2VzIG5vdCBmaXQiKTsKLSAgVGVzdEVycm9yKCJ0YWJsZSBUIHsgRjpzaG9ydDsgfSByb290X3R5cGUgVDsgeyBGOjMyNzY4IH0iLAotICAgICAgICAgICAgImNvbnN0YW50IGRvZXMgbm90IGZpdCIpOwotICBUZXN0RXJyb3IoInRhYmxlIFQgeyBGOnNob3J0OyB9IHJvb3RfdHlwZSBUOyB7IEY6LTMyNzY5IH0iLAotICAgICAgICAgICAgImNvbnN0YW50IGRvZXMgbm90IGZpdCIpOwotICBUZXN0RXJyb3IoInRhYmxlIFQgeyBGOnVzaG9ydDsgfSByb290X3R5cGUgVDsgeyBGOjY1NTM2IH0iLAotICAgICAgICAgICAgImNvbnN0YW50IGRvZXMgbm90IGZpdCIpOwotICBUZXN0RXJyb3IoInRhYmxlIFQgeyBGOnVzaG9ydDsgfSByb290X3R5cGUgVDsgeyBGOi0xIH0iLAotICAgICAgICAgICAgImNvbnN0YW50IGRvZXMgbm90IGZpdCIpOwotICBUZXN0RXJyb3IoInRhYmxlIFQgeyBGOmludDsgfSByb290X3R5cGUgVDsgeyBGOjIxNDc0ODM2NDggfSIsCi0gICAgICAgICAgICAiY29uc3RhbnQgZG9lcyBub3QgZml0Iik7Ci0gIFRlc3RFcnJvcigidGFibGUgVCB7IEY6aW50OyB9IHJvb3RfdHlwZSBUOyB7IEY6LTIxNDc0ODM2NDkgfSIsCi0gICAgICAgICAgICAiY29uc3RhbnQgZG9lcyBub3QgZml0Iik7Ci0gIFRlc3RFcnJvcigidGFibGUgVCB7IEY6dWludDsgfSByb290X3R5cGUgVDsgeyBGOjQyOTQ5NjcyOTYgfSIsCi0gICAgICAgICAgICAiY29uc3RhbnQgZG9lcyBub3QgZml0Iik7Ci0gIFRlc3RFcnJvcigidGFibGUgVCB7IEY6dWludDsgfSByb290X3R5cGUgVDsgeyBGOi0xIH0iLAotICAgICAgICAgICAgImNvbnN0YW50IGRvZXMgbm90IGZpdCIpOwotICAvLyBDaGVjayBmaXhlZCB3aWR0aCBhbGlhc2VzCi0gIFRlc3RFcnJvcigidGFibGUgWCB7IFk6dWludDg7IH0gcm9vdF90eXBlIFg7IHsgWTogLTEgfSIsICJkb2VzIG5vdCBmaXQiKTsKLSAgVGVzdEVycm9yKCJ0YWJsZSBYIHsgWTp1aW50ODsgfSByb290X3R5cGUgWDsgeyBZOiAyNTYgfSIsICJkb2VzIG5vdCBmaXQiKTsKLSAgVGVzdEVycm9yKCJ0YWJsZSBYIHsgWTp1aW50MTY7IH0gcm9vdF90eXBlIFg7IHsgWTogLTEgfSIsICJkb2VzIG5vdCBmaXQiKTsKLSAgVGVzdEVycm9yKCJ0YWJsZSBYIHsgWTp1aW50MTY7IH0gcm9vdF90eXBlIFg7IHsgWTogNjU1MzYgfSIsICJkb2VzIG5vdCBmaXQiKTsKLSAgVGVzdEVycm9yKCJ0YWJsZSBYIHsgWTp1aW50MzI7IH0gcm9vdF90eXBlIFg7IHsgWTogLTEgfSIsICIiKTsKLSAgVGVzdEVycm9yKCJ0YWJsZSBYIHsgWTp1aW50MzI7IH0gcm9vdF90eXBlIFg7IHsgWTogNDI5NDk2NzI5NiB9IiwKLSAgICAgICAgICAgICJkb2VzIG5vdCBmaXQiKTsKLSAgVGVzdEVycm9yKCJ0YWJsZSBYIHsgWTp1aW50NjQ7IH0gcm9vdF90eXBlIFg7IHsgWTogLTEgfSIsICIiKTsKLSAgVGVzdEVycm9yKCJ0YWJsZSBYIHsgWTp1aW50NjQ7IH0gcm9vdF90eXBlIFg7IHsgWTogLTkyMjMzNzIwMzY4NTQ3NzU4MDkgfSIsCi0gICAgICAgICAgICAiZG9lcyBub3QgZml0Iik7Ci0gIFRlc3RFcnJvcigidGFibGUgWCB7IFk6dWludDY0OyB9IHJvb3RfdHlwZSBYOyB7IFk6IDE4NDQ2NzQ0MDczNzA5NTUxNjE2IH0iLAotICAgICAgICAgICAgImRvZXMgbm90IGZpdCIpOwotCi0gIFRlc3RFcnJvcigidGFibGUgWCB7IFk6aW50ODsgfSByb290X3R5cGUgWDsgeyBZOiAtMTI5IH0iLCAiZG9lcyBub3QgZml0Iik7Ci0gIFRlc3RFcnJvcigidGFibGUgWCB7IFk6aW50ODsgfSByb290X3R5cGUgWDsgeyBZOiAxMjggfSIsICJkb2VzIG5vdCBmaXQiKTsKLSAgVGVzdEVycm9yKCJ0YWJsZSBYIHsgWTppbnQxNjsgfSByb290X3R5cGUgWDsgeyBZOiAtMzI3NjkgfSIsICJkb2VzIG5vdCBmaXQiKTsKLSAgVGVzdEVycm9yKCJ0YWJsZSBYIHsgWTppbnQxNjsgfSByb290X3R5cGUgWDsgeyBZOiAzMjc2OCB9IiwgImRvZXMgbm90IGZpdCIpOwotICBUZXN0RXJyb3IoInRhYmxlIFggeyBZOmludDMyOyB9IHJvb3RfdHlwZSBYOyB7IFk6IC0yMTQ3NDgzNjQ5IH0iLCAiIik7Ci0gIFRlc3RFcnJvcigidGFibGUgWCB7IFk6aW50MzI7IH0gcm9vdF90eXBlIFg7IHsgWTogMjE0NzQ4MzY0OCB9IiwKLSAgICAgICAgICAgICJkb2VzIG5vdCBmaXQiKTsKLSAgVGVzdEVycm9yKCJ0YWJsZSBYIHsgWTppbnQ2NDsgfSByb290X3R5cGUgWDsgeyBZOiAtOTIyMzM3MjAzNjg1NDc3NTgwOSB9IiwKLSAgICAgICAgICAgICJkb2VzIG5vdCBmaXQiKTsKLSAgVGVzdEVycm9yKCJ0YWJsZSBYIHsgWTppbnQ2NDsgfSByb290X3R5cGUgWDsgeyBZOiA5MjIzMzcyMDM2ODU0Nzc1ODA4IH0iLAotICAgICAgICAgICAgImRvZXMgbm90IGZpdCIpOwotICAvLyBjaGVjayBvdXQtb2YtaW50NjQgYXMgaW50OAotICBUZXN0RXJyb3IoInRhYmxlIFggeyBZOmludDg7IH0gcm9vdF90eXBlIFg7IHsgWTogLTkyMjMzNzIwMzY4NTQ3NzU4MDkgfSIsCi0gICAgICAgICAgICAiZG9lcyBub3QgZml0Iik7Ci0gIFRlc3RFcnJvcigidGFibGUgWCB7IFk6aW50ODsgfSByb290X3R5cGUgWDsgeyBZOiA5MjIzMzcyMDM2ODU0Nzc1ODA4IH0iLAotICAgICAgICAgICAgImRvZXMgbm90IGZpdCIpOwotCi0gIC8vIENoZWNrIGRlZmF1bHQgdmFsdWVzCi0gIFRlc3RFcnJvcigidGFibGUgWCB7IFk6aW50NjQ9LTkyMjMzNzIwMzY4NTQ3NzU4MDk7IH0gcm9vdF90eXBlIFg7IHt9IiwKLSAgICAgICAgICAgICJkb2VzIG5vdCBmaXQiKTsKLSAgVGVzdEVycm9yKCJ0YWJsZSBYIHsgWTppbnQ2ND0gOTIyMzM3MjAzNjg1NDc3NTgwODsgfSByb290X3R5cGUgWDsge30iLAotICAgICAgICAgICAgImRvZXMgbm90IGZpdCIpOwotICBUZXN0RXJyb3IoInRhYmxlIFggeyBZOnVpbnQ2NDsgfSByb290X3R5cGUgWDsgeyBZOiAtMSB9IiwgIiIpOwotICBUZXN0RXJyb3IoInRhYmxlIFggeyBZOnVpbnQ2ND0tOTIyMzM3MjAzNjg1NDc3NTgwOTsgfSByb290X3R5cGUgWDsge30iLAotICAgICAgICAgICAgImRvZXMgbm90IGZpdCIpOwotICBUZXN0RXJyb3IoInRhYmxlIFggeyBZOnVpbnQ2ND0gMTg0NDY3NDQwNzM3MDk1NTE2MTY7IH0gcm9vdF90eXBlIFg7IHt9IiwKLSAgICAgICAgICAgICJkb2VzIG5vdCBmaXQiKTsKLX0KLQotdm9pZCBJbnRlZ2VyQm91bmRhcnlUZXN0KCkgewotICAvLyBDaGVjayBudW1lcmljYWwgY29tcGF0aWJpbGl0eSB3aXRoIG5vbi1DKysgbGFuZ3VhZ2VzLgotICAvLyBCeSB0aGUgQysrIHN0YW5kYXJkLCBzdGQ6Om51bWVyaWNhbF9saW1pdHM8aW50NjRfdD46Om1pbigpID09Ci0gIC8vIC05MjIzMzcyMDM2ODU0Nzc1ODA3ICgtMl42MysxKSBvciBsZXNzKiBUaGUgRmxhdGJ1ZmZlcnMgZ3JhbW1hciBhbmQgbW9zdCBvZgotICAvLyB0aGUgbGFuZ3VhZ2VzIChDIywgSmF2YSwgUnVzdCkgZXhwZWN0IHRoYXQgbWluaW11bSB2YWx1ZXMgYXJlOiAtMTI4LAotICAvLyAtMzI3NjgsLi4sIC05MjIzMzcyMDM2ODU0Nzc1ODA4LiBTaW5jZSBDKysyMCwKLSAgLy8gc3RhdGljX2Nhc3Q8aW50NjQ+KDB4ODAwMDAwMDAwMDAwMDAwMFVMTCkgaXMgd2VsbC1kZWZpbmVkIHR3bydzIGNvbXBsZW1lbnQKLSAgLy8gY2FzdC4gVGhlcmVmb3JlIC05MjIzMzcyMDM2ODU0Nzc1ODA4IHNob3VsZCBiZSB2YWxpZCBuZWdhdGl2ZSB2YWx1ZS4KLSAgVEVTVF9FUShmbGF0YnVmZmVyczo6bnVtZXJpY19saW1pdHM8aW50OF90Pjo6bWluKCksIC0xMjgpOwotICBURVNUX0VRKGZsYXRidWZmZXJzOjpudW1lcmljX2xpbWl0czxpbnQ4X3Q+OjptYXgoKSwgMTI3KTsKLSAgVEVTVF9FUShmbGF0YnVmZmVyczo6bnVtZXJpY19saW1pdHM8aW50MTZfdD46Om1pbigpLCAtMzI3NjgpOwotICBURVNUX0VRKGZsYXRidWZmZXJzOjpudW1lcmljX2xpbWl0czxpbnQxNl90Pjo6bWF4KCksIDMyNzY3KTsKLSAgVEVTVF9FUShmbGF0YnVmZmVyczo6bnVtZXJpY19saW1pdHM8aW50MzJfdD46Om1pbigpICsgMSwgLTIxNDc0ODM2NDcpOwotICBURVNUX0VRKGZsYXRidWZmZXJzOjpudW1lcmljX2xpbWl0czxpbnQzMl90Pjo6bWF4KCksIDIxNDc0ODM2NDdVTEwpOwotICBURVNUX0VRKGZsYXRidWZmZXJzOjpudW1lcmljX2xpbWl0czxpbnQ2NF90Pjo6bWluKCkgKyAxTEwsCi0gICAgICAgICAgLTkyMjMzNzIwMzY4NTQ3NzU4MDdMTCk7Ci0gIFRFU1RfRVEoZmxhdGJ1ZmZlcnM6Om51bWVyaWNfbGltaXRzPGludDY0X3Q+OjptYXgoKSwgOTIyMzM3MjAzNjg1NDc3NTgwN1VMTCk7Ci0gIFRFU1RfRVEoZmxhdGJ1ZmZlcnM6Om51bWVyaWNfbGltaXRzPHVpbnQ4X3Q+OjptYXgoKSwgMjU1KTsKLSAgVEVTVF9FUShmbGF0YnVmZmVyczo6bnVtZXJpY19saW1pdHM8dWludDE2X3Q+OjptYXgoKSwgNjU1MzUpOwotICBURVNUX0VRKGZsYXRidWZmZXJzOjpudW1lcmljX2xpbWl0czx1aW50MzJfdD46Om1heCgpLCA0Mjk0OTY3Mjk1VUxMKTsKLSAgVEVTVF9FUShmbGF0YnVmZmVyczo6bnVtZXJpY19saW1pdHM8dWludDY0X3Q+OjptYXgoKSwKLSAgICAgICAgICAxODQ0Njc0NDA3MzcwOTU1MTYxNVVMTCk7Ci0KLSAgVEVTVF9FUShUZXN0VmFsdWU8aW50OF90PigieyB5OjEyNyB9IiwgImJ5dGUiKSwgMTI3KTsKLSAgVEVTVF9FUShUZXN0VmFsdWU8aW50OF90PigieyB5Oi0xMjggfSIsICJieXRlIiksIC0xMjgpOwotICBURVNUX0VRKFRlc3RWYWx1ZTx1aW50OF90PigieyB5OjI1NSB9IiwgInVieXRlIiksIDI1NSk7Ci0gIFRFU1RfRVEoVGVzdFZhbHVlPHVpbnQ4X3Q+KCJ7IHk6MCB9IiwgInVieXRlIiksIDApOwotICBURVNUX0VRKFRlc3RWYWx1ZTxpbnQxNl90PigieyB5OjMyNzY3IH0iLCAic2hvcnQiKSwgMzI3NjcpOwotICBURVNUX0VRKFRlc3RWYWx1ZTxpbnQxNl90PigieyB5Oi0zMjc2OCB9IiwgInNob3J0IiksIC0zMjc2OCk7Ci0gIFRFU1RfRVEoVGVzdFZhbHVlPHVpbnQxNl90PigieyB5OjY1NTM1IH0iLCAidXNob3J0IiksIDY1NTM1KTsKLSAgVEVTVF9FUShUZXN0VmFsdWU8dWludDE2X3Q+KCJ7IHk6MCB9IiwgInVzaG9ydCIpLCAwKTsKLSAgVEVTVF9FUShUZXN0VmFsdWU8aW50MzJfdD4oInsgeToyMTQ3NDgzNjQ3IH0iLCAiaW50IiksIDIxNDc0ODM2NDcpOwotICBURVNUX0VRKFRlc3RWYWx1ZTxpbnQzMl90PigieyB5Oi0yMTQ3NDgzNjQ4IH0iLCAiaW50IikgKyAxLCAtMjE0NzQ4MzY0Nyk7Ci0gIFRFU1RfRVEoVGVzdFZhbHVlPHVpbnQzMl90PigieyB5OjQyOTQ5NjcyOTUgfSIsICJ1aW50IiksIDQyOTQ5NjcyOTUpOwotICBURVNUX0VRKFRlc3RWYWx1ZTx1aW50MzJfdD4oInsgeTowIH0iLCAidWludCIpLCAwKTsKLSAgVEVTVF9FUShUZXN0VmFsdWU8aW50NjRfdD4oInsgeTo5MjIzMzcyMDM2ODU0Nzc1ODA3IH0iLCAibG9uZyIpLAotICAgICAgICAgIDkyMjMzNzIwMzY4NTQ3NzU4MDdMTCk7Ci0gIFRFU1RfRVEoVGVzdFZhbHVlPGludDY0X3Q+KCJ7IHk6LTkyMjMzNzIwMzY4NTQ3NzU4MDggfSIsICJsb25nIikgKyAxTEwsCi0gICAgICAgICAgLTkyMjMzNzIwMzY4NTQ3NzU4MDdMTCk7Ci0gIFRFU1RfRVEoVGVzdFZhbHVlPHVpbnQ2NF90PigieyB5OjE4NDQ2NzQ0MDczNzA5NTUxNjE1IH0iLCAidWxvbmciKSwKLSAgICAgICAgICAxODQ0Njc0NDA3MzcwOTU1MTYxNVVMTCk7Ci0gIFRFU1RfRVEoVGVzdFZhbHVlPHVpbnQ2NF90PigieyB5OjAgfSIsICJ1bG9uZyIpLCAwKTsKLSAgVEVTVF9FUShUZXN0VmFsdWU8dWludDY0X3Q+KCJ7IHk6IDE4NDQ2NzQ0MDczNzA5NTUxNjE1IH0iLCAidWludDY0IiksCi0gICAgICAgICAgMTg0NDY3NDQwNzM3MDk1NTE2MTVVTEwpOwotICAvLyBjaGVjayB0aGF0IHRoZSBkZWZhdWx0IHdvcmtzCi0gIFRFU1RfRVEoVGVzdFZhbHVlPHVpbnQ2NF90PihudWxscHRyLCAidWludDY0ID0gMTg0NDY3NDQwNzM3MDk1NTE2MTUiKSwKLSAgICAgICAgICAxODQ0Njc0NDA3MzcwOTU1MTYxNVVMTCk7Ci19Ci0KLXZvaWQgVmFsaWRGbG9hdFRlc3QoKSB7Ci0gIC8vIGNoZWNrIHJvdW5kaW5nIHRvIGluZmluaXR5Ci0gIFRFU1RfRVEoVGVzdFZhbHVlPGZsb2F0PigieyB5OiszLjQwMjllKzM4IH0iLCAiZmxvYXQiKSwgK2luZmluaXR5X2YpOwotICBURVNUX0VRKFRlc3RWYWx1ZTxmbG9hdD4oInsgeTotMy40MDI5ZSszOCB9IiwgImZsb2F0IiksIC1pbmZpbml0eV9mKTsKLSAgVEVTVF9FUShUZXN0VmFsdWU8ZG91YmxlPigieyB5OisxLjc5NzdlKzMwOCB9IiwgImRvdWJsZSIpLCAraW5maW5pdHlfZCk7Ci0gIFRFU1RfRVEoVGVzdFZhbHVlPGRvdWJsZT4oInsgeTotMS43OTc3ZSszMDggfSIsICJkb3VibGUiKSwgLWluZmluaXR5X2QpOwotCi0gIFRFU1RfRVEoCi0gICAgICBGbG9hdENvbXBhcmUoVGVzdFZhbHVlPGZsb2F0PigieyB5OjAuMDMxNDE1OWUrMiB9IiwgImZsb2F0IiksIDMuMTQxNTlmKSwKLSAgICAgIHRydWUpOwotICAvLyBmbG9hdCBpbiBzdHJpbmcKLSAgVEVTVF9FUShGbG9hdENvbXBhcmUoVGVzdFZhbHVlPGZsb2F0PigieyB5OlwiIDAuMDMxNDE1OWUrMiAgXCIgfSIsICJmbG9hdCIpLAotICAgICAgICAgICAgICAgICAgICAgICAzLjE0MTU5ZiksCi0gICAgICAgICAgdHJ1ZSk7Ci0KLSAgVEVTVF9FUShUZXN0VmFsdWU8ZmxvYXQ+KCJ7IHk6MSB9IiwgImZsb2F0IiksIDEuMGYpOwotICBURVNUX0VRKFRlc3RWYWx1ZTxmbG9hdD4oInsgeToxLjAgfSIsICJmbG9hdCIpLCAxLjBmKTsKLSAgVEVTVF9FUShUZXN0VmFsdWU8ZmxvYXQ+KCJ7IHk6MS4gfSIsICJmbG9hdCIpLCAxLjBmKTsKLSAgVEVTVF9FUShUZXN0VmFsdWU8ZmxvYXQ+KCJ7IHk6KzEuIH0iLCAiZmxvYXQiKSwgMS4wZik7Ci0gIFRFU1RfRVEoVGVzdFZhbHVlPGZsb2F0PigieyB5Oi0xLiB9IiwgImZsb2F0IiksIC0xLjBmKTsKLSAgVEVTVF9FUShUZXN0VmFsdWU8ZmxvYXQ+KCJ7IHk6MS5lMCB9IiwgImZsb2F0IiksIDEuMGYpOwotICBURVNUX0VRKFRlc3RWYWx1ZTxmbG9hdD4oInsgeToxLmUrMCB9IiwgImZsb2F0IiksIDEuMGYpOwotICBURVNUX0VRKFRlc3RWYWx1ZTxmbG9hdD4oInsgeToxLmUtMCB9IiwgImZsb2F0IiksIDEuMGYpOwotICBURVNUX0VRKFRlc3RWYWx1ZTxmbG9hdD4oInsgeTowLjEyNSB9IiwgImZsb2F0IiksIDAuMTI1Zik7Ci0gIFRFU1RfRVEoVGVzdFZhbHVlPGZsb2F0PigieyB5Oi4xMjUgfSIsICJmbG9hdCIpLCAwLjEyNWYpOwotICBURVNUX0VRKFRlc3RWYWx1ZTxmbG9hdD4oInsgeTotLjEyNSB9IiwgImZsb2F0IiksIC0wLjEyNWYpOwotICBURVNUX0VRKFRlc3RWYWx1ZTxmbG9hdD4oInsgeTorLjEyNSB9IiwgImZsb2F0IiksICswLjEyNWYpOwotICBURVNUX0VRKFRlc3RWYWx1ZTxmbG9hdD4oInsgeTo1IH0iLCAiZmxvYXQiKSwgNS4wZik7Ci0gIFRFU1RfRVEoVGVzdFZhbHVlPGZsb2F0PigieyB5OlwiNVwiIH0iLCAiZmxvYXQiKSwgNS4wZik7Ci0KLSNpZiBkZWZpbmVkKEZMQVRCVUZGRVJTX0hBU19ORVdfU1RSVE9EKSAmJiAoRkxBVEJVRkZFUlNfSEFTX05FV19TVFJUT0QgPiAwKQotICAvLyBPbGQgTVNWQyB2ZXJzaW9ucyBtYXkgaGF2ZSBwcm9ibGVtIHdpdGggdGhpcyBjaGVjay4KLSAgLy8gaHR0cHM6Ly93d3cuZXhwbG9yaW5nYmluYXJ5LmNvbS92aXN1YWwtYy1wbHVzLXBsdXMtc3RydG9kLXN0aWxsLWJyb2tlbi8KLSAgVEVTVF9FUShUZXN0VmFsdWU8ZG91YmxlPigieyB5OjYuOTI5NDk1NjQ0NjAwOTE5NWUxNSB9IiwgImRvdWJsZSIpLAotICAgICAgICAgIDY5Mjk0OTU2NDQ2MDA5MjAuMCk7Ci0gIC8vIGNoZWNrIG5hbidzCi0gIFRFU1RfRVEoc3RkOjppc25hbihUZXN0VmFsdWU8ZG91YmxlPigieyB5Om5hbiB9IiwgImRvdWJsZSIpKSwgdHJ1ZSk7Ci0gIFRFU1RfRVEoc3RkOjppc25hbihUZXN0VmFsdWU8ZmxvYXQ+KCJ7IHk6bmFuIH0iLCAiZmxvYXQiKSksIHRydWUpOwotICBURVNUX0VRKHN0ZDo6aXNuYW4oVGVzdFZhbHVlPGZsb2F0PigieyB5OlwibmFuXCIgfSIsICJmbG9hdCIpKSwgdHJ1ZSk7Ci0gIFRFU1RfRVEoc3RkOjppc25hbihUZXN0VmFsdWU8ZmxvYXQ+KCJ7IHk6XCIrbmFuXCIgfSIsICJmbG9hdCIpKSwgdHJ1ZSk7Ci0gIFRFU1RfRVEoc3RkOjppc25hbihUZXN0VmFsdWU8ZmxvYXQ+KCJ7IHk6XCItbmFuXCIgfSIsICJmbG9hdCIpKSwgdHJ1ZSk7Ci0gIFRFU1RfRVEoc3RkOjppc25hbihUZXN0VmFsdWU8ZmxvYXQ+KCJ7IHk6K25hbiB9IiwgImZsb2F0IikpLCB0cnVlKTsKLSAgVEVTVF9FUShzdGQ6OmlzbmFuKFRlc3RWYWx1ZTxmbG9hdD4oInsgeTotbmFuIH0iLCAiZmxvYXQiKSksIHRydWUpOwotICBURVNUX0VRKHN0ZDo6aXNuYW4oVGVzdFZhbHVlPGZsb2F0PihudWxscHRyLCAiZmxvYXQ9bmFuIikpLCB0cnVlKTsKLSAgVEVTVF9FUShzdGQ6OmlzbmFuKFRlc3RWYWx1ZTxmbG9hdD4obnVsbHB0ciwgImZsb2F0PS1uYW4iKSksIHRydWUpOwotICAvLyBjaGVjayBpbmYKLSAgVEVTVF9FUShUZXN0VmFsdWU8ZmxvYXQ+KCJ7IHk6aW5mIH0iLCAiZmxvYXQiKSwgaW5maW5pdHlfZik7Ci0gIFRFU1RfRVEoVGVzdFZhbHVlPGZsb2F0PigieyB5OlwiaW5mXCIgfSIsICJmbG9hdCIpLCBpbmZpbml0eV9mKTsKLSAgVEVTVF9FUShUZXN0VmFsdWU8ZmxvYXQ+KCJ7IHk6XCItaW5mXCIgfSIsICJmbG9hdCIpLCAtaW5maW5pdHlfZik7Ci0gIFRFU1RfRVEoVGVzdFZhbHVlPGZsb2F0PigieyB5OlwiK2luZlwiIH0iLCAiZmxvYXQiKSwgaW5maW5pdHlfZik7Ci0gIFRFU1RfRVEoVGVzdFZhbHVlPGZsb2F0PigieyB5OitpbmYgfSIsICJmbG9hdCIpLCBpbmZpbml0eV9mKTsKLSAgVEVTVF9FUShUZXN0VmFsdWU8ZmxvYXQ+KCJ7IHk6LWluZiB9IiwgImZsb2F0IiksIC1pbmZpbml0eV9mKTsKLSAgVEVTVF9FUShUZXN0VmFsdWU8ZmxvYXQ+KG51bGxwdHIsICJmbG9hdD1pbmYiKSwgaW5maW5pdHlfZik7Ci0gIFRFU1RfRVEoVGVzdFZhbHVlPGZsb2F0PihudWxscHRyLCAiZmxvYXQ9LWluZiIpLCAtaW5maW5pdHlfZik7Ci0gIFRlc3RWYWx1ZTxkb3VibGU+KAotICAgICAgInsgeTogWzAuMiwgLjIsIDEuMCwgLTEuMCwgLTIuLCAyLiwgMWUwLCAtMWUwLCAxLjBlMCwgLTEuMGUwLCAtMy5lMiwgIgotICAgICAgIjMuMGUyXSB9IiwKLSAgICAgICJbZG91YmxlXSIpOwotICBUZXN0VmFsdWU8ZmxvYXQ+KAotICAgICAgInsgeTogWzAuMiwgLjIsIDEuMCwgLTEuMCwgLTIuLCAyLiwgMWUwLCAtMWUwLCAxLjBlMCwgLTEuMGUwLCAtMy5lMiwgIgotICAgICAgIjMuMGUyXSB9IiwKLSAgICAgICJbZmxvYXRdIik7Ci0KLSAgLy8gVGVzdCBiaW5hcnkgZm9ybWF0IG9mIGZsb2F0IHBvaW50LgotICAvLyBodHRwczovL2VuLmNwcHJlZmVyZW5jZS5jb20vdy9jcHAvbGFuZ3VhZ2UvZmxvYXRpbmdfbGl0ZXJhbAotICAvLyAweDExLjEycC0xID0gKDEqMTZeMSArIDIqMTZeMCArIDMqMTZeLTEgKyA0KjE2Xi0yKSAqIDJeLTEgPQotICBURVNUX0VRKFRlc3RWYWx1ZTxkb3VibGU+KCJ7IHk6MHgxMi4zNHAtMSB9IiwgImRvdWJsZSIpLCA5LjEwMTU2MjUpOwotICAvLyBoZXggZnJhY3Rpb24gMS4yIChkZWNpbWFsIDEuMTI1KSBzY2FsZWQgYnkgMl4zLCB0aGF0IGlzIDkuMAotICBURVNUX0VRKFRlc3RWYWx1ZTxmbG9hdD4oInsgeTotMHgwLjJwMCB9IiwgImZsb2F0IiksIC0wLjEyNWYpOwotICBURVNUX0VRKFRlc3RWYWx1ZTxmbG9hdD4oInsgeTotMHguMnAxIH0iLCAiZmxvYXQiKSwgLTAuMjVmKTsKLSAgVEVTVF9FUShUZXN0VmFsdWU8ZmxvYXQ+KCJ7IHk6MHgxLjJwMyB9IiwgImZsb2F0IiksIDkuMGYpOwotICBURVNUX0VRKFRlc3RWYWx1ZTxmbG9hdD4oInsgeToweDEwLjFwMCB9IiwgImZsb2F0IiksIDE2LjA2MjVmKTsKLSAgVEVTVF9FUShUZXN0VmFsdWU8ZG91YmxlPigieyB5OjB4MS4ycDMgfSIsICJkb3VibGUiKSwgOS4wKTsKLSAgVEVTVF9FUShUZXN0VmFsdWU8ZG91YmxlPigieyB5OjB4MTAuMXAwIH0iLCAiZG91YmxlIiksIDE2LjA2MjUpOwotICBURVNUX0VRKFRlc3RWYWx1ZTxkb3VibGU+KCJ7IHk6MHhDLjY4cCsyIH0iLCAiZG91YmxlIiksIDQ5LjYyNSk7Ci0gIFRlc3RWYWx1ZTxkb3VibGU+KCJ7IHk6IFsweDIwLjRlcDEsICsweDIwLjRlcDEsIC0weDIwLjRlcDFdIH0iLCAiW2RvdWJsZV0iKTsKLSAgVGVzdFZhbHVlPGZsb2F0PigieyB5OiBbMHgyMC40ZXAxLCArMHgyMC40ZXAxLCAtMHgyMC40ZXAxXSB9IiwgIltmbG9hdF0iKTsKLQotI2Vsc2UgICAvLyBGTEFUQlVGRkVSU19IQVNfTkVXX1NUUlRPRAotICBURVNUX09VVFBVVF9MSU5FKCJGTEFUQlVGRkVSU19IQVNfTkVXX1NUUlRPRCB0ZXN0cyBza2lwcGVkIik7Ci0jZW5kaWYgIC8vICFGTEFUQlVGRkVSU19IQVNfTkVXX1NUUlRPRAotfQotCi12b2lkIEludmFsaWRGbG9hdFRlc3QoKSB7Ci0gIGF1dG8gaW52YWxpZF9tc2cgPSAiaW52YWxpZCBudW1iZXIiOwotICBhdXRvIGNvbW1hX21zZyA9ICJleHBlY3Rpbmc6ICwiOwotICBUZXN0RXJyb3IoInRhYmxlIFQgeyBGOmZsb2F0OyB9IHJvb3RfdHlwZSBUOyB7IEY6MSwwIH0iLCAiIik7Ci0gIFRlc3RFcnJvcigidGFibGUgVCB7IEY6ZmxvYXQ7IH0gcm9vdF90eXBlIFQ7IHsgRjouIH0iLCAiIik7Ci0gIFRlc3RFcnJvcigidGFibGUgVCB7IEY6ZmxvYXQ7IH0gcm9vdF90eXBlIFQ7IHsgRjotIH0iLCBpbnZhbGlkX21zZyk7Ci0gIFRlc3RFcnJvcigidGFibGUgVCB7IEY6ZmxvYXQ7IH0gcm9vdF90eXBlIFQ7IHsgRjorIH0iLCBpbnZhbGlkX21zZyk7Ci0gIFRlc3RFcnJvcigidGFibGUgVCB7IEY6ZmxvYXQ7IH0gcm9vdF90eXBlIFQ7IHsgRjotLiB9IiwgaW52YWxpZF9tc2cpOwotICBUZXN0RXJyb3IoInRhYmxlIFQgeyBGOmZsb2F0OyB9IHJvb3RfdHlwZSBUOyB7IEY6Ky4gfSIsIGludmFsaWRfbXNnKTsKLSAgVGVzdEVycm9yKCJ0YWJsZSBUIHsgRjpmbG9hdDsgfSByb290X3R5cGUgVDsgeyBGOi5lIH0iLCAiIik7Ci0gIFRlc3RFcnJvcigidGFibGUgVCB7IEY6ZmxvYXQ7IH0gcm9vdF90eXBlIFQ7IHsgRjotZSB9IiwgaW52YWxpZF9tc2cpOwotICBUZXN0RXJyb3IoInRhYmxlIFQgeyBGOmZsb2F0OyB9IHJvb3RfdHlwZSBUOyB7IEY6K2UgfSIsIGludmFsaWRfbXNnKTsKLSAgVGVzdEVycm9yKCJ0YWJsZSBUIHsgRjpmbG9hdDsgfSByb290X3R5cGUgVDsgeyBGOi0uZSB9IiwgaW52YWxpZF9tc2cpOwotICBUZXN0RXJyb3IoInRhYmxlIFQgeyBGOmZsb2F0OyB9IHJvb3RfdHlwZSBUOyB7IEY6Ky5lIH0iLCBpbnZhbGlkX21zZyk7Ci0gIFRlc3RFcnJvcigidGFibGUgVCB7IEY6ZmxvYXQ7IH0gcm9vdF90eXBlIFQ7IHsgRjotZTEgfSIsIGludmFsaWRfbXNnKTsKLSAgVGVzdEVycm9yKCJ0YWJsZSBUIHsgRjpmbG9hdDsgfSByb290X3R5cGUgVDsgeyBGOitlMSB9IiwgaW52YWxpZF9tc2cpOwotICBUZXN0RXJyb3IoInRhYmxlIFQgeyBGOmZsb2F0OyB9IHJvb3RfdHlwZSBUOyB7IEY6MS4wZSsgfSIsIGludmFsaWRfbXNnKTsKLSAgVGVzdEVycm9yKCJ0YWJsZSBUIHsgRjpmbG9hdDsgfSByb290X3R5cGUgVDsgeyBGOjEuMGUtIH0iLCBpbnZhbGlkX21zZyk7Ci0gIC8vIGV4cG9uZW50IHBQIGlzIG1hbmRhdG9yeSBmb3IgaGV4LWZsb2F0Ci0gIFRlc3RFcnJvcigidGFibGUgVCB7IEY6ZmxvYXQ7IH0gcm9vdF90eXBlIFQ7IHsgRjoweDAgfSIsIGludmFsaWRfbXNnKTsKLSAgVGVzdEVycm9yKCJ0YWJsZSBUIHsgRjpmbG9hdDsgfSByb290X3R5cGUgVDsgeyBGOi0weC4gfSIsIGludmFsaWRfbXNnKTsKLSAgVGVzdEVycm9yKCJ0YWJsZSBUIHsgRjpmbG9hdDsgfSByb290X3R5cGUgVDsgeyBGOjB4LiB9IiwgaW52YWxpZF9tc2cpOwotICBUZXN0RXJyb3IoInRhYmxlIFQgeyBGOmZsb2F0OyB9IHJvb3RfdHlwZSBUOyB7IEY6MFhlIH0iLCBpbnZhbGlkX21zZyk7Ci0gIFRlc3RFcnJvcigidGFibGUgVCB7IEY6ZmxvYXQ7IH0gcm9vdF90eXBlIFQ7IHsgRjpcIjBYZVwiIH0iLCBpbnZhbGlkX21zZyk7Ci0gIFRlc3RFcnJvcigidGFibGUgVCB7IEY6ZmxvYXQ7IH0gcm9vdF90eXBlIFQ7IHsgRjpcIm5hbigxKVwiIH0iLCBpbnZhbGlkX21zZyk7Ci0gIC8vIGVFIG5vdCBleHBvbmVudCBpbiBoZXgtZmxvYXQhCi0gIFRlc3RFcnJvcigidGFibGUgVCB7IEY6ZmxvYXQ7IH0gcm9vdF90eXBlIFQ7IHsgRjoweDAuMGUrIH0iLCBpbnZhbGlkX21zZyk7Ci0gIFRlc3RFcnJvcigidGFibGUgVCB7IEY6ZmxvYXQ7IH0gcm9vdF90eXBlIFQ7IHsgRjoweDAuMGUtIH0iLCBpbnZhbGlkX21zZyk7Ci0gIFRlc3RFcnJvcigidGFibGUgVCB7IEY6ZmxvYXQ7IH0gcm9vdF90eXBlIFQ7IHsgRjoweDAuMHAgfSIsIGludmFsaWRfbXNnKTsKLSAgVGVzdEVycm9yKCJ0YWJsZSBUIHsgRjpmbG9hdDsgfSByb290X3R5cGUgVDsgeyBGOjB4MC4wcCsgfSIsIGludmFsaWRfbXNnKTsKLSAgVGVzdEVycm9yKCJ0YWJsZSBUIHsgRjpmbG9hdDsgfSByb290X3R5cGUgVDsgeyBGOjB4MC4wcC0gfSIsIGludmFsaWRfbXNnKTsKLSAgVGVzdEVycm9yKCJ0YWJsZSBUIHsgRjpmbG9hdDsgfSByb290X3R5cGUgVDsgeyBGOjB4MC4wcGExIH0iLCBpbnZhbGlkX21zZyk7Ci0gIFRlc3RFcnJvcigidGFibGUgVCB7IEY6ZmxvYXQ7IH0gcm9vdF90eXBlIFQ7IHsgRjoweDAuMGUrIH0iLCBpbnZhbGlkX21zZyk7Ci0gIFRlc3RFcnJvcigidGFibGUgVCB7IEY6ZmxvYXQ7IH0gcm9vdF90eXBlIFQ7IHsgRjoweDAuMGUtIH0iLCBpbnZhbGlkX21zZyk7Ci0gIFRlc3RFcnJvcigidGFibGUgVCB7IEY6ZmxvYXQ7IH0gcm9vdF90eXBlIFQ7IHsgRjoweDAuMGUrMCB9IiwgaW52YWxpZF9tc2cpOwotICBUZXN0RXJyb3IoInRhYmxlIFQgeyBGOmZsb2F0OyB9IHJvb3RfdHlwZSBUOyB7IEY6MHgwLjBlLTAgfSIsIGludmFsaWRfbXNnKTsKLSAgVGVzdEVycm9yKCJ0YWJsZSBUIHsgRjpmbG9hdDsgfSByb290X3R5cGUgVDsgeyBGOjB4MC4wZXArIH0iLCBpbnZhbGlkX21zZyk7Ci0gIFRlc3RFcnJvcigidGFibGUgVCB7IEY6ZmxvYXQ7IH0gcm9vdF90eXBlIFQ7IHsgRjoweDAuMGVwLSB9IiwgaW52YWxpZF9tc2cpOwotICBUZXN0RXJyb3IoInRhYmxlIFQgeyBGOmZsb2F0OyB9IHJvb3RfdHlwZSBUOyB7IEY6MS4yLjMgfSIsIGludmFsaWRfbXNnKTsKLSAgVGVzdEVycm9yKCJ0YWJsZSBUIHsgRjpmbG9hdDsgfSByb290X3R5cGUgVDsgeyBGOjEuMi5lMyB9IiwgaW52YWxpZF9tc2cpOwotICBUZXN0RXJyb3IoInRhYmxlIFQgeyBGOmZsb2F0OyB9IHJvb3RfdHlwZSBUOyB7IEY6MS4yZS4zIH0iLCBpbnZhbGlkX21zZyk7Ci0gIFRlc3RFcnJvcigidGFibGUgVCB7IEY6ZmxvYXQ7IH0gcm9vdF90eXBlIFQ7IHsgRjoxLjJlMC4zIH0iLCBpbnZhbGlkX21zZyk7Ci0gIFRlc3RFcnJvcigidGFibGUgVCB7IEY6ZmxvYXQ7IH0gcm9vdF90eXBlIFQ7IHsgRjoxLjJlMy4gfSIsIGludmFsaWRfbXNnKTsKLSAgVGVzdEVycm9yKCJ0YWJsZSBUIHsgRjpmbG9hdDsgfSByb290X3R5cGUgVDsgeyBGOjEuMmUzLjAgfSIsIGludmFsaWRfbXNnKTsKLSAgVGVzdEVycm9yKCJ0YWJsZSBUIHsgRjpmbG9hdDsgfSByb290X3R5cGUgVDsgeyBGOistMS4wIH0iLCBpbnZhbGlkX21zZyk7Ci0gIFRlc3RFcnJvcigidGFibGUgVCB7IEY6ZmxvYXQ7IH0gcm9vdF90eXBlIFQ7IHsgRjoxLjBlKy0xIH0iLCBpbnZhbGlkX21zZyk7Ci0gIFRlc3RFcnJvcigidGFibGUgVCB7IEY6ZmxvYXQ7IH0gcm9vdF90eXBlIFQ7IHsgRjpcIjEuMGUrLTFcIiB9IiwgaW52YWxpZF9tc2cpOwotICBUZXN0RXJyb3IoInRhYmxlIFQgeyBGOmZsb2F0OyB9IHJvb3RfdHlwZSBUOyB7IEY6MS5lMGUgfSIsIGNvbW1hX21zZyk7Ci0gIFRlc3RFcnJvcigidGFibGUgVCB7IEY6ZmxvYXQ7IH0gcm9vdF90eXBlIFQ7IHsgRjoweDEucDBlIH0iLCBjb21tYV9tc2cpOwotICBUZXN0RXJyb3IoInRhYmxlIFQgeyBGOmZsb2F0OyB9IHJvb3RfdHlwZSBUOyB7IEY6XCIgMHgxMCBcIiB9IiwgaW52YWxpZF9tc2cpOwotICAvLyBmbG9hdHMgaW4gc3RyaW5nCi0gIFRlc3RFcnJvcigidGFibGUgVCB7IEY6ZmxvYXQ7IH0gcm9vdF90eXBlIFQ7IHsgRjpcIjEsMi5cIiB9IiwgaW52YWxpZF9tc2cpOwotICBUZXN0RXJyb3IoInRhYmxlIFQgeyBGOmZsb2F0OyB9IHJvb3RfdHlwZSBUOyB7IEY6XCIxLjJlMy5cIiB9IiwgaW52YWxpZF9tc2cpOwotICBUZXN0RXJyb3IoInRhYmxlIFQgeyBGOmZsb2F0OyB9IHJvb3RfdHlwZSBUOyB7IEY6XCIweDEucDBlXCIgfSIsIGludmFsaWRfbXNnKTsKLSAgVGVzdEVycm9yKCJ0YWJsZSBUIHsgRjpmbG9hdDsgfSByb290X3R5cGUgVDsgeyBGOlwiMHgxLjBcIiB9IiwgaW52YWxpZF9tc2cpOwotICBUZXN0RXJyb3IoInRhYmxlIFQgeyBGOmZsb2F0OyB9IHJvb3RfdHlwZSBUOyB7IEY6XCIgMHgxLjBcIiB9IiwgaW52YWxpZF9tc2cpOwotICBUZXN0RXJyb3IoInRhYmxlIFQgeyBGOmZsb2F0OyB9IHJvb3RfdHlwZSBUOyB7IEY6XCIrIDBcIiB9IiwgaW52YWxpZF9tc2cpOwotICAvLyBkaXNhYmxlIGVzY2FwZXMgZm9yICJudW1iZXItaW4tc3RyaW5nIgotICBUZXN0RXJyb3IoInRhYmxlIFQgeyBGOmZsb2F0OyB9IHJvb3RfdHlwZSBUOyB7IEY6XCJcXGYxLjJlMy5cIiB9IiwgImludmFsaWQiKTsKLSAgVGVzdEVycm9yKCJ0YWJsZSBUIHsgRjpmbG9hdDsgfSByb290X3R5cGUgVDsgeyBGOlwiXFx0MS4yZTMuXCIgfSIsICJpbnZhbGlkIik7Ci0gIFRlc3RFcnJvcigidGFibGUgVCB7IEY6ZmxvYXQ7IH0gcm9vdF90eXBlIFQ7IHsgRjpcIlxcbjEuMmUzLlwiIH0iLCAiaW52YWxpZCIpOwotICBUZXN0RXJyb3IoInRhYmxlIFQgeyBGOmZsb2F0OyB9IHJvb3RfdHlwZSBUOyB7IEY6XCJcXHIxLjJlMy5cIiB9IiwgImludmFsaWQiKTsKLSAgVGVzdEVycm9yKCJ0YWJsZSBUIHsgRjpmbG9hdDsgfSByb290X3R5cGUgVDsgeyBGOlwiNFxceDAwNVwiIH0iLCAiaW52YWxpZCIpOwotICBUZXN0RXJyb3IoInRhYmxlIFQgeyBGOmZsb2F0OyB9IHJvb3RfdHlwZSBUOyB7IEY6XCJcJzEyXCdcIiB9IiwgaW52YWxpZF9tc2cpOwotICAvLyBudWxsIGlzIG5vdCBhIG51bWJlciBjb25zdGFudCEKLSAgVGVzdEVycm9yKCJ0YWJsZSBUIHsgRjpmbG9hdDsgfSByb290X3R5cGUgVDsgeyBGOlwibnVsbFwiIH0iLCBpbnZhbGlkX21zZyk7Ci0gIFRlc3RFcnJvcigidGFibGUgVCB7IEY6ZmxvYXQ7IH0gcm9vdF90eXBlIFQ7IHsgRjpudWxsIH0iLCBpbnZhbGlkX21zZyk7Ci19Ci0KLXZvaWQgR2VuZXJhdGVUYWJsZVRleHRUZXN0KCkgewordm9pZCBHZW5lcmF0ZVRhYmxlVGV4dFRlc3QoY29uc3Qgc3RkOjpzdHJpbmcgJnRlc3RzX2RhdGFfcGF0aCkgewogICBzdGQ6OnN0cmluZyBzY2hlbWFmaWxlOwogICBzdGQ6OnN0cmluZyBqc29uZmlsZTsKICAgYm9vbCBvayA9Ci0gICAgICBmbGF0YnVmZmVyczo6TG9hZEZpbGUoKHRlc3RfZGF0YV9wYXRoICsgIm1vbnN0ZXJfdGVzdC5mYnMiKS5jX3N0cigpLAorICAgICAgZmxhdGJ1ZmZlcnM6OkxvYWRGaWxlKCh0ZXN0c19kYXRhX3BhdGggKyAibW9uc3Rlcl90ZXN0LmZicyIpLmNfc3RyKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UsICZzY2hlbWFmaWxlKSAmJgotICAgICAgZmxhdGJ1ZmZlcnM6OkxvYWRGaWxlKCh0ZXN0X2RhdGFfcGF0aCArICJtb25zdGVyZGF0YV90ZXN0Lmpzb24iKS5jX3N0cigpLAorICAgICAgZmxhdGJ1ZmZlcnM6OkxvYWRGaWxlKCh0ZXN0c19kYXRhX3BhdGggKyAibW9uc3RlcmRhdGFfdGVzdC5qc29uIikuY19zdHIoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSwgJmpzb25maWxlKTsKICAgVEVTVF9FUShvaywgdHJ1ZSk7CiAgIGF1dG8gaW5jbHVkZV90ZXN0X3BhdGggPQotICAgICAgZmxhdGJ1ZmZlcnM6OkNvbkNhdFBhdGhGaWxlTmFtZSh0ZXN0X2RhdGFfcGF0aCwgImluY2x1ZGVfdGVzdCIpOwotICBjb25zdCBjaGFyICppbmNsdWRlX2RpcmVjdG9yaWVzW10gPSB7IHRlc3RfZGF0YV9wYXRoLmNfc3RyKCksCisgICAgICBmbGF0YnVmZmVyczo6Q29uQ2F0UGF0aEZpbGVOYW1lKHRlc3RzX2RhdGFfcGF0aCwgImluY2x1ZGVfdGVzdCIpOworICBjb25zdCBjaGFyICppbmNsdWRlX2RpcmVjdG9yaWVzW10gPSB7IHRlc3RzX2RhdGFfcGF0aC5jX3N0cigpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluY2x1ZGVfdGVzdF9wYXRoLmNfc3RyKCksIG51bGxwdHIgfTsKICAgZmxhdGJ1ZmZlcnM6OklETE9wdGlvbnMgb3B0OwogICBvcHQuaW5kZW50X3N0ZXAgPSAtMTsKQEAgLTIzNjAsMzM4ICsxMzgsOSBAQAogICBURVNUX0VRX1NUUihqc29uZ2VuLmNfc3RyKCksICJ7YTogMTAsYjogMjB9Iik7CiB9CiAKLXRlbXBsYXRlPHR5cGVuYW1lIFQ+Ci12b2lkIE51bWVyaWNVdGlsc1Rlc3RJbnRlZ2VyKGNvbnN0IGNoYXIgKmxvd2VyLCBjb25zdCBjaGFyICp1cHBlcikgewotICBUIHg7Ci0gIFRFU1RfRVEoZmxhdGJ1ZmZlcnM6OlN0cmluZ1RvTnVtYmVyKCIxcSIsICZ4KSwgZmFsc2UpOwotICBURVNUX0VRKHgsIDApOwotICBURVNUX0VRKGZsYXRidWZmZXJzOjpTdHJpbmdUb051bWJlcih1cHBlciwgJngpLCBmYWxzZSk7Ci0gIFRFU1RfRVEoeCwgZmxhdGJ1ZmZlcnM6Om51bWVyaWNfbGltaXRzPFQ+OjptYXgoKSk7Ci0gIFRFU1RfRVEoZmxhdGJ1ZmZlcnM6OlN0cmluZ1RvTnVtYmVyKGxvd2VyLCAmeCksIGZhbHNlKTsKLSAgYXV0byBleHB2YWwgPSBmbGF0YnVmZmVyczo6aXNfdW5zaWduZWQ8VD46OnZhbHVlCi0gICAgICAgICAgICAgICAgICAgID8gZmxhdGJ1ZmZlcnM6Om51bWVyaWNfbGltaXRzPFQ+OjptYXgoKQotICAgICAgICAgICAgICAgICAgICA6IGZsYXRidWZmZXJzOjpudW1lcmljX2xpbWl0czxUPjo6bG93ZXN0KCk7Ci0gIFRFU1RfRVEoeCwgZXhwdmFsKTsKLX0KLQotdGVtcGxhdGU8dHlwZW5hbWUgVD4KLXZvaWQgTnVtZXJpY1V0aWxzVGVzdEZsb2F0KGNvbnN0IGNoYXIgKmxvd2VyLCBjb25zdCBjaGFyICp1cHBlcikgewotICBUIGY7Ci0gIFRFU1RfRVEoZmxhdGJ1ZmZlcnM6OlN0cmluZ1RvTnVtYmVyKCIiLCAmZiksIGZhbHNlKTsKLSAgVEVTVF9FUShmbGF0YnVmZmVyczo6U3RyaW5nVG9OdW1iZXIoIjFxIiwgJmYpLCBmYWxzZSk7Ci0gIFRFU1RfRVEoZiwgMCk7Ci0gIFRFU1RfRVEoZmxhdGJ1ZmZlcnM6OlN0cmluZ1RvTnVtYmVyKHVwcGVyLCAmZiksIHRydWUpOwotICBURVNUX0VRKGYsICtmbGF0YnVmZmVyczo6bnVtZXJpY19saW1pdHM8VD46OmluZmluaXR5KCkpOwotICBURVNUX0VRKGZsYXRidWZmZXJzOjpTdHJpbmdUb051bWJlcihsb3dlciwgJmYpLCB0cnVlKTsKLSAgVEVTVF9FUShmLCAtZmxhdGJ1ZmZlcnM6Om51bWVyaWNfbGltaXRzPFQ+OjppbmZpbml0eSgpKTsKLX0KLQotdm9pZCBOdW1lcmljVXRpbHNUZXN0KCkgewotICBOdW1lcmljVXRpbHNUZXN0SW50ZWdlcjx1aW50NjRfdD4oIi0xIiwgIjE4NDQ2NzQ0MDczNzA5NTUxNjE2Iik7Ci0gIE51bWVyaWNVdGlsc1Rlc3RJbnRlZ2VyPHVpbnQ4X3Q+KCItMSIsICIyNTYiKTsKLSAgTnVtZXJpY1V0aWxzVGVzdEludGVnZXI8aW50NjRfdD4oIi05MjIzMzcyMDM2ODU0Nzc1ODA5IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjkyMjMzNzIwMzY4NTQ3NzU4MDgiKTsKLSAgTnVtZXJpY1V0aWxzVGVzdEludGVnZXI8aW50OF90PigiLTEyOSIsICIxMjgiKTsKLSAgTnVtZXJpY1V0aWxzVGVzdEZsb2F0PGZsb2F0PigiLTMuNDAyOWUrMzgiLCAiKzMuNDAyOWUrMzgiKTsKLSAgTnVtZXJpY1V0aWxzVGVzdEZsb2F0PGZsb2F0PigiLTEuNzk3N2UrMzA4IiwgIisxLjc5NzdlKzMwOCIpOwotfQotCi12b2lkIElzQXNjaWlVdGlsc1Rlc3QoKSB7Ci0gIGNoYXIgYyA9IC0xMjg7Ci0gIGZvciAoaW50IGNudCA9IDA7IGNudCA8IDI1NjsgY250KyspIHsKLSAgICBhdXRvIGFscGhhID0gKCgnYScgPD0gYykgJiYgKGMgPD0gJ3onKSkgfHwgKCgnQScgPD0gYykgJiYgKGMgPD0gJ1onKSk7Ci0gICAgYXV0byBkZWMgPSAoKCcwJyA8PSBjKSAmJiAoYyA8PSAnOScpKTsKLSAgICBhdXRvIGhleCA9ICgoJ2EnIDw9IGMpICYmIChjIDw9ICdmJykpIHx8ICgoJ0EnIDw9IGMpICYmIChjIDw9ICdGJykpOwotICAgIFRFU1RfRVEoZmxhdGJ1ZmZlcnM6OmlzX2FscGhhKGMpLCBhbHBoYSk7Ci0gICAgVEVTVF9FUShmbGF0YnVmZmVyczo6aXNfYWxudW0oYyksIGFscGhhIHx8IGRlYyk7Ci0gICAgVEVTVF9FUShmbGF0YnVmZmVyczo6aXNfZGlnaXQoYyksIGRlYyk7Ci0gICAgVEVTVF9FUShmbGF0YnVmZmVyczo6aXNfeGRpZ2l0KGMpLCBkZWMgfHwgaGV4KTsKLSAgICBjICs9IDE7Ci0gIH0KLX0KLQotdm9pZCBVbmljb2RlVGVzdCgpIHsKLSAgZmxhdGJ1ZmZlcnM6OlBhcnNlciBwYXJzZXI7Ci0gIC8vIFdpdGhvdXQgc2V0dGluZyBhbGxvd19ub25fdXRmOCA9IHRydWUsIHdlIHRyZWF0IFx4IHNlcXVlbmNlcyBhcyBieXRlCi0gIC8vIHNlcXVlbmNlcyB3aGljaCBhcmUgdGhlbiB2YWxpZGF0ZWQgYXMgVVRGLTguCi0gIFRFU1RfRVEocGFyc2VyLlBhcnNlKCJ0YWJsZSBUIHsgRjpzdHJpbmc7IH0iCi0gICAgICAgICAgICAgICAgICAgICAgICJyb290X3R5cGUgVDsiCi0gICAgICAgICAgICAgICAgICAgICAgICJ7IEY6XCJcXHUyMEFDXFx1MDBBMlxcdTMwRTZcXHUzMEZDXFx1MzBCNlxcdTMwRkMiCi0gICAgICAgICAgICAgICAgICAgICAgICJcXHU1MjI1XFx1MzBCNVxcdTMwQTRcXHUzMEM4XFx4RTJcXHg4MlxceEFDXFx1MDA4MFxcdUQ4IgotICAgICAgICAgICAgICAgICAgICAgICAiM0RcXHVERTBFXCIgfSIpLAotICAgICAgICAgIHRydWUpOwotICBzdGQ6OnN0cmluZyBqc29uZ2VuOwotICBwYXJzZXIub3B0cy5pbmRlbnRfc3RlcCA9IC0xOwotICBhdXRvIHJlc3VsdCA9Ci0gICAgICBHZW5lcmF0ZVRleHQocGFyc2VyLCBwYXJzZXIuYnVpbGRlcl8uR2V0QnVmZmVyUG9pbnRlcigpLCAmanNvbmdlbik7Ci0gIFRFU1RfRVEocmVzdWx0LCB0cnVlKTsKLSAgVEVTVF9FUV9TVFIoanNvbmdlbi5jX3N0cigpLAotICAgICAgICAgICAgICAie0Y6IFwiXFx1MjBBQ1xcdTAwQTJcXHUzMEU2XFx1MzBGQ1xcdTMwQjZcXHUzMEZDIgotICAgICAgICAgICAgICAiXFx1NTIyNVxcdTMwQjVcXHUzMEE0XFx1MzBDOFxcdTIwQUNcXHUwMDgwXFx1RDgzRFxcdURFMEVcIn0iKTsKLX0KLQotdm9pZCBVbmljb2RlVGVzdEFsbG93Tm9uVVRGOCgpIHsKLSAgZmxhdGJ1ZmZlcnM6OlBhcnNlciBwYXJzZXI7Ci0gIHBhcnNlci5vcHRzLmFsbG93X25vbl91dGY4ID0gdHJ1ZTsKLSAgVEVTVF9FUSgKLSAgICAgIHBhcnNlci5QYXJzZSgKLSAgICAgICAgICAidGFibGUgVCB7IEY6c3RyaW5nOyB9IgotICAgICAgICAgICJyb290X3R5cGUgVDsiCi0gICAgICAgICAgInsgRjpcIlxcdTIwQUNcXHUwMEEyXFx1MzBFNlxcdTMwRkNcXHUzMEI2XFx1MzBGQyIKLSAgICAgICAgICAiXFx1NTIyNVxcdTMwQjVcXHUzMEE0XFx1MzBDOFxceDAxXFx4ODBcXHUwMDgwXFx1RDgzRFxcdURFMEVcIiB9IiksCi0gICAgICB0cnVlKTsKLSAgc3RkOjpzdHJpbmcganNvbmdlbjsKLSAgcGFyc2VyLm9wdHMuaW5kZW50X3N0ZXAgPSAtMTsKLSAgYXV0byByZXN1bHQgPQotICAgICAgR2VuZXJhdGVUZXh0KHBhcnNlciwgcGFyc2VyLmJ1aWxkZXJfLkdldEJ1ZmZlclBvaW50ZXIoKSwgJmpzb25nZW4pOwotICBURVNUX0VRKHJlc3VsdCwgdHJ1ZSk7Ci0gIFRFU1RfRVFfU1RSKAotICAgICAganNvbmdlbi5jX3N0cigpLAotICAgICAgIntGOiBcIlxcdTIwQUNcXHUwMEEyXFx1MzBFNlxcdTMwRkNcXHUzMEI2XFx1MzBGQyIKLSAgICAgICJcXHU1MjI1XFx1MzBCNVxcdTMwQTRcXHUzMEM4XFx1MDAwMVxceDgwXFx1MDA4MFxcdUQ4M0RcXHVERTBFXCJ9Iik7Ci19Ci0KLXZvaWQgVW5pY29kZVRlc3RHZW5lcmF0ZVRleHRGYWlsc09uTm9uVVRGOCgpIHsKLSAgZmxhdGJ1ZmZlcnM6OlBhcnNlciBwYXJzZXI7Ci0gIC8vIEFsbG93IG5vbi1VVEYtOCBpbml0aWFsbHkgdG8gbW9kZWwgd2hhdCBoYXBwZW5zIHdoZW4gd2UgbG9hZCBhIGJpbmFyeQotICAvLyBmbGF0YnVmZmVyIGZyb20gZGlzayB3aGljaCBjb250YWlucyBub24tVVRGLTggc3RyaW5ncy4KLSAgcGFyc2VyLm9wdHMuYWxsb3dfbm9uX3V0ZjggPSB0cnVlOwotICBURVNUX0VRKAotICAgICAgcGFyc2VyLlBhcnNlKAotICAgICAgICAgICJ0YWJsZSBUIHsgRjpzdHJpbmc7IH0iCi0gICAgICAgICAgInJvb3RfdHlwZSBUOyIKLSAgICAgICAgICAieyBGOlwiXFx1MjBBQ1xcdTAwQTJcXHUzMEU2XFx1MzBGQ1xcdTMwQjZcXHUzMEZDIgotICAgICAgICAgICJcXHU1MjI1XFx1MzBCNVxcdTMwQTRcXHUzMEM4XFx4MDFcXHg4MFxcdTAwODBcXHVEODNEXFx1REUwRVwiIH0iKSwKLSAgICAgIHRydWUpOwotICBzdGQ6OnN0cmluZyBqc29uZ2VuOwotICBwYXJzZXIub3B0cy5pbmRlbnRfc3RlcCA9IC0xOwotICAvLyBOb3csIGRpc2FsbG93IG5vbi1VVEYtOCAodGhlIGRlZmF1bHQgYmVoYXZpb3IpIHNvIEdlbmVyYXRlVGV4dCBpbmRpY2F0ZXMKLSAgLy8gZmFpbHVyZS4KLSAgcGFyc2VyLm9wdHMuYWxsb3dfbm9uX3V0ZjggPSBmYWxzZTsKLSAgYXV0byByZXN1bHQgPQotICAgICAgR2VuZXJhdGVUZXh0KHBhcnNlciwgcGFyc2VyLmJ1aWxkZXJfLkdldEJ1ZmZlclBvaW50ZXIoKSwgJmpzb25nZW4pOwotICBURVNUX0VRKHJlc3VsdCwgZmFsc2UpOwotfQotCi12b2lkIFVuaWNvZGVTdXJyb2dhdGVzVGVzdCgpIHsKLSAgZmxhdGJ1ZmZlcnM6OlBhcnNlciBwYXJzZXI7Ci0KLSAgVEVTVF9FUShwYXJzZXIuUGFyc2UoInRhYmxlIFQgeyBGOnN0cmluZyAoaWQ6IDApOyB9IgotICAgICAgICAgICAgICAgICAgICAgICAicm9vdF90eXBlIFQ7IgotICAgICAgICAgICAgICAgICAgICAgICAieyBGOlwiXFx1RDgzRFxcdURDQTlcIn0iKSwKLSAgICAgICAgICB0cnVlKTsKLSAgYXV0byByb290ID0gZmxhdGJ1ZmZlcnM6OkdldFJvb3Q8ZmxhdGJ1ZmZlcnM6OlRhYmxlPigKLSAgICAgIHBhcnNlci5idWlsZGVyXy5HZXRCdWZmZXJQb2ludGVyKCkpOwotICBhdXRvIHN0cmluZyA9IHJvb3QtPkdldFBvaW50ZXI8ZmxhdGJ1ZmZlcnM6OlN0cmluZyAqPigKLSAgICAgIGZsYXRidWZmZXJzOjpGaWVsZEluZGV4VG9PZmZzZXQoMCkpOwotICBURVNUX0VRX1NUUihzdHJpbmctPmNfc3RyKCksICJceEYwXHg5Rlx4OTJceEE5Iik7Ci19Ci0KLXZvaWQgVW5pY29kZUludmFsaWRTdXJyb2dhdGVzVGVzdCgpIHsKLSAgVGVzdEVycm9yKAotICAgICAgInRhYmxlIFQgeyBGOnN0cmluZzsgfSIKLSAgICAgICJyb290X3R5cGUgVDsiCi0gICAgICAieyBGOlwiXFx1RDgwMFwifSIsCi0gICAgICAidW5wYWlyZWQgaGlnaCBzdXJyb2dhdGUiKTsKLSAgVGVzdEVycm9yKAotICAgICAgInRhYmxlIFQgeyBGOnN0cmluZzsgfSIKLSAgICAgICJyb290X3R5cGUgVDsiCi0gICAgICAieyBGOlwiXFx1RDgwMGFiY2RcIn0iLAotICAgICAgInVucGFpcmVkIGhpZ2ggc3Vycm9nYXRlIik7Ci0gIFRlc3RFcnJvcigKLSAgICAgICJ0YWJsZSBUIHsgRjpzdHJpbmc7IH0iCi0gICAgICAicm9vdF90eXBlIFQ7IgotICAgICAgInsgRjpcIlxcdUQ4MDBcXG5cIn0iLAotICAgICAgInVucGFpcmVkIGhpZ2ggc3Vycm9nYXRlIik7Ci0gIFRlc3RFcnJvcigKLSAgICAgICJ0YWJsZSBUIHsgRjpzdHJpbmc7IH0iCi0gICAgICAicm9vdF90eXBlIFQ7IgotICAgICAgInsgRjpcIlxcdUQ4MDBcXHVEODAwXCJ9IiwKLSAgICAgICJtdWx0aXBsZSBoaWdoIHN1cnJvZ2F0ZXMiKTsKLSAgVGVzdEVycm9yKAotICAgICAgInRhYmxlIFQgeyBGOnN0cmluZzsgfSIKLSAgICAgICJyb290X3R5cGUgVDsiCi0gICAgICAieyBGOlwiXFx1REMwMFwifSIsCi0gICAgICAidW5wYWlyZWQgbG93IHN1cnJvZ2F0ZSIpOwotfQotCi12b2lkIEludmFsaWRVVEY4VGVzdCgpIHsKLSAgLy8gIjEgYnl0ZSIgcGF0dGVybiwgdW5kZXIgbWluIGxlbmd0aCBvZiAyIGJ5dGVzCi0gIFRlc3RFcnJvcigKLSAgICAgICJ0YWJsZSBUIHsgRjpzdHJpbmc7IH0iCi0gICAgICAicm9vdF90eXBlIFQ7IgotICAgICAgInsgRjpcIlx4ODBcIn0iLAotICAgICAgImlsbGVnYWwgVVRGLTggc2VxdWVuY2UiKTsKLSAgLy8gMiBieXRlIHBhdHRlcm4sIHN0cmluZyB0b28gc2hvcnQKLSAgVGVzdEVycm9yKAotICAgICAgInRhYmxlIFQgeyBGOnN0cmluZzsgfSIKLSAgICAgICJyb290X3R5cGUgVDsiCi0gICAgICAieyBGOlwiXHhERlwifSIsCi0gICAgICAiaWxsZWdhbCBVVEYtOCBzZXF1ZW5jZSIpOwotICAvLyAzIGJ5dGUgcGF0dGVybiwgc3RyaW5nIHRvbyBzaG9ydAotICBUZXN0RXJyb3IoCi0gICAgICAidGFibGUgVCB7IEY6c3RyaW5nOyB9IgotICAgICAgInJvb3RfdHlwZSBUOyIKLSAgICAgICJ7IEY6XCJceEVGXHhCRlwifSIsCi0gICAgICAiaWxsZWdhbCBVVEYtOCBzZXF1ZW5jZSIpOwotICAvLyA0IGJ5dGUgcGF0dGVybiwgc3RyaW5nIHRvbyBzaG9ydAotICBUZXN0RXJyb3IoCi0gICAgICAidGFibGUgVCB7IEY6c3RyaW5nOyB9IgotICAgICAgInJvb3RfdHlwZSBUOyIKLSAgICAgICJ7IEY6XCJceEY3XHhCRlx4QkZcIn0iLAotICAgICAgImlsbGVnYWwgVVRGLTggc2VxdWVuY2UiKTsKLSAgLy8gIjUgYnl0ZSIgcGF0dGVybiwgc3RyaW5nIHRvbyBzaG9ydAotICBUZXN0RXJyb3IoCi0gICAgICAidGFibGUgVCB7IEY6c3RyaW5nOyB9IgotICAgICAgInJvb3RfdHlwZSBUOyIKLSAgICAgICJ7IEY6XCJceEZCXHhCRlx4QkZceEJGXCJ9IiwKLSAgICAgICJpbGxlZ2FsIFVURi04IHNlcXVlbmNlIik7Ci0gIC8vICI2IGJ5dGUiIHBhdHRlcm4sIHN0cmluZyB0b28gc2hvcnQKLSAgVGVzdEVycm9yKAotICAgICAgInRhYmxlIFQgeyBGOnN0cmluZzsgfSIKLSAgICAgICJyb290X3R5cGUgVDsiCi0gICAgICAieyBGOlwiXHhGRFx4QkZceEJGXHhCRlx4QkZcIn0iLAotICAgICAgImlsbGVnYWwgVVRGLTggc2VxdWVuY2UiKTsKLSAgLy8gIjcgYnl0ZSIgcGF0dGVybiwgc3RyaW5nIHRvbyBzaG9ydAotICBUZXN0RXJyb3IoCi0gICAgICAidGFibGUgVCB7IEY6c3RyaW5nOyB9IgotICAgICAgInJvb3RfdHlwZSBUOyIKLSAgICAgICJ7IEY6XCJceEZFXHhCRlx4QkZceEJGXHhCRlx4QkZcIn0iLAotICAgICAgImlsbGVnYWwgVVRGLTggc2VxdWVuY2UiKTsKLSAgLy8gIjUgYnl0ZSIgcGF0dGVybiwgb3ZlciBtYXggbGVuZ3RoIG9mIDQgYnl0ZXMKLSAgVGVzdEVycm9yKAotICAgICAgInRhYmxlIFQgeyBGOnN0cmluZzsgfSIKLSAgICAgICJyb290X3R5cGUgVDsiCi0gICAgICAieyBGOlwiXHhGQlx4QkZceEJGXHhCRlx4QkZcIn0iLAotICAgICAgImlsbGVnYWwgVVRGLTggc2VxdWVuY2UiKTsKLSAgLy8gIjYgYnl0ZSIgcGF0dGVybiwgb3ZlciBtYXggbGVuZ3RoIG9mIDQgYnl0ZXMKLSAgVGVzdEVycm9yKAotICAgICAgInRhYmxlIFQgeyBGOnN0cmluZzsgfSIKLSAgICAgICJyb290X3R5cGUgVDsiCi0gICAgICAieyBGOlwiXHhGRFx4QkZceEJGXHhCRlx4QkZceEJGXCJ9IiwKLSAgICAgICJpbGxlZ2FsIFVURi04IHNlcXVlbmNlIik7Ci0gIC8vICI3IGJ5dGUiIHBhdHRlcm4sIG92ZXIgbWF4IGxlbmd0aCBvZiA0IGJ5dGVzCi0gIFRlc3RFcnJvcigKLSAgICAgICJ0YWJsZSBUIHsgRjpzdHJpbmc7IH0iCi0gICAgICAicm9vdF90eXBlIFQ7IgotICAgICAgInsgRjpcIlx4RkVceEJGXHhCRlx4QkZceEJGXHhCRlx4QkZcIn0iLAotICAgICAgImlsbGVnYWwgVVRGLTggc2VxdWVuY2UiKTsKLQotICAvLyBUaHJlZSBpbnZhbGlkIGVuY29kaW5ncyBmb3IgVSswMDBBIChcbiwgYWthIE5FV0xJTkUpCi0gIFRlc3RFcnJvcigKLSAgICAgICJ0YWJsZSBUIHsgRjpzdHJpbmc7IH0iCi0gICAgICAicm9vdF90eXBlIFQ7IgotICAgICAgInsgRjpcIlx4QzBceDhBXCJ9IiwKLSAgICAgICJpbGxlZ2FsIFVURi04IHNlcXVlbmNlIik7Ci0gIFRlc3RFcnJvcigKLSAgICAgICJ0YWJsZSBUIHsgRjpzdHJpbmc7IH0iCi0gICAgICAicm9vdF90eXBlIFQ7IgotICAgICAgInsgRjpcIlx4RTBceDgwXHg4QVwifSIsCi0gICAgICAiaWxsZWdhbCBVVEYtOCBzZXF1ZW5jZSIpOwotICBUZXN0RXJyb3IoCi0gICAgICAidGFibGUgVCB7IEY6c3RyaW5nOyB9IgotICAgICAgInJvb3RfdHlwZSBUOyIKLSAgICAgICJ7IEY6XCJceEYwXHg4MFx4ODBceDhBXCJ9IiwKLSAgICAgICJpbGxlZ2FsIFVURi04IHNlcXVlbmNlIik7Ci0KLSAgLy8gVHdvIGludmFsaWQgZW5jb2RpbmdzIGZvciBVKzAwQTkgKENPUFlSSUdIVCBTWU1CT0wpCi0gIFRlc3RFcnJvcigKLSAgICAgICJ0YWJsZSBUIHsgRjpzdHJpbmc7IH0iCi0gICAgICAicm9vdF90eXBlIFQ7IgotICAgICAgInsgRjpcIlx4RTBceDgxXHhBOVwifSIsCi0gICAgICAiaWxsZWdhbCBVVEYtOCBzZXF1ZW5jZSIpOwotICBUZXN0RXJyb3IoCi0gICAgICAidGFibGUgVCB7IEY6c3RyaW5nOyB9IgotICAgICAgInJvb3RfdHlwZSBUOyIKLSAgICAgICJ7IEY6XCJceEYwXHg4MFx4ODFceEE5XCJ9IiwKLSAgICAgICJpbGxlZ2FsIFVURi04IHNlcXVlbmNlIik7Ci0KLSAgLy8gSW52YWxpZCBlbmNvZGluZyBmb3IgVSsyMEFDIChFVVJPIFNZTUJPTCkKLSAgVGVzdEVycm9yKAotICAgICAgInRhYmxlIFQgeyBGOnN0cmluZzsgfSIKLSAgICAgICJyb290X3R5cGUgVDsiCi0gICAgICAieyBGOlwiXHhGMFx4ODJceDgyXHhBQ1wifSIsCi0gICAgICAiaWxsZWdhbCBVVEYtOCBzZXF1ZW5jZSIpOwotCi0gIC8vIFVURi0xNiBzdXJyb2dhdGUgdmFsdWVzIGJldHdlZW4gVStEODAwIGFuZCBVK0RGRkYgY2Fubm90IGJlIGVuY29kZWQgaW4KLSAgLy8gVVRGLTgKLSAgVGVzdEVycm9yKAotICAgICAgInRhYmxlIFQgeyBGOnN0cmluZzsgfSIKLSAgICAgICJyb290X3R5cGUgVDsiCi0gICAgICAvLyBVKzEwNDAwICJlbmNvZGVkIiBhcyBVK0Q4MDEgVStEQzAwCi0gICAgICAieyBGOlwiXHhFRFx4QTBceDgxXHhFRFx4QjBceDgwXCJ9IiwKLSAgICAgICJpbGxlZ2FsIFVURi04IHNlcXVlbmNlIik7Ci0KLSAgLy8gQ2hlY2sgaW5kZXBlbmRlbmNlIG9mIGlkZW50aWZpZXIgZnJvbSBsb2NhbGUuCi0gIHN0ZDo6c3RyaW5nIGxvY2FsZV9pZGVudDsKLSAgbG9jYWxlX2lkZW50ICs9ICJ0YWJsZSBUIHsgRiI7Ci0gIGxvY2FsZV9pZGVudCArPSBzdGF0aWNfY2FzdDxjaGFyPigtMzIpOyAgLy8gdW5zaWduZWQgMHhFMAotICBsb2NhbGVfaWRlbnQgKz0gIiA6c3RyaW5nOyB9IjsKLSAgbG9jYWxlX2lkZW50ICs9ICJyb290X3R5cGUgVDsiOwotICBsb2NhbGVfaWRlbnQgKz0gInt9IjsKLSAgVGVzdEVycm9yKGxvY2FsZV9pZGVudC5jX3N0cigpLCAiIik7Ci19Ci0KLXZvaWQgVW5rbm93bkZpZWxkc1Rlc3QoKSB7Ci0gIGZsYXRidWZmZXJzOjpJRExPcHRpb25zIG9wdHM7Ci0gIG9wdHMuc2tpcF91bmV4cGVjdGVkX2ZpZWxkc19pbl9qc29uID0gdHJ1ZTsKLSAgZmxhdGJ1ZmZlcnM6OlBhcnNlciBwYXJzZXIob3B0cyk7Ci0KLSAgVEVTVF9FUShwYXJzZXIuUGFyc2UoInRhYmxlIFQgeyBzdHI6c3RyaW5nOyBpOmludDt9IgotICAgICAgICAgICAgICAgICAgICAgICAicm9vdF90eXBlIFQ7IgotICAgICAgICAgICAgICAgICAgICAgICAieyBzdHI6XCJ0ZXN0XCIsIgotICAgICAgICAgICAgICAgICAgICAgICAidW5rbm93bl9zdHJpbmc6XCJ0ZXN0XCIsIgotICAgICAgICAgICAgICAgICAgICAgICAiXCJ1bmtub3duX3N0cmluZ1wiOlwidGVzdFwiLCIKLSAgICAgICAgICAgICAgICAgICAgICAgInVua25vd25faW50OjEwLCIKLSAgICAgICAgICAgICAgICAgICAgICAgInVua25vd25fZmxvYXQ6MS4wLCIKLSAgICAgICAgICAgICAgICAgICAgICAgInVua25vd25fYXJyYXk6IFsgMSwgMiwgMywgNF0sIgotICAgICAgICAgICAgICAgICAgICAgICAidW5rbm93bl9vYmplY3Q6IHsgaTogMTAgfSwiCi0gICAgICAgICAgICAgICAgICAgICAgICJcInVua25vd25fb2JqZWN0XCI6IHsgXCJpXCI6IDEwIH0sIgotICAgICAgICAgICAgICAgICAgICAgICAiaToxMH0iKSwKLSAgICAgICAgICB0cnVlKTsKLQotICBzdGQ6OnN0cmluZyBqc29uZ2VuOwotICBwYXJzZXIub3B0cy5pbmRlbnRfc3RlcCA9IC0xOwotICBhdXRvIHJlc3VsdCA9Ci0gICAgICBHZW5lcmF0ZVRleHQocGFyc2VyLCBwYXJzZXIuYnVpbGRlcl8uR2V0QnVmZmVyUG9pbnRlcigpLCAmanNvbmdlbik7Ci0gIFRFU1RfRVEocmVzdWx0LCB0cnVlKTsKLSAgVEVTVF9FUV9TVFIoanNvbmdlbi5jX3N0cigpLCAie3N0cjogXCJ0ZXN0XCIsaTogMTB9Iik7Ci19Ci0KLXZvaWQgUGFyc2VVbmlvblRlc3QoKSB7Ci0gIC8vIFVuaW9ucyBtdXN0IGJlIHBhcnNlYWJsZSB3aXRoIHRoZSB0eXBlIGZpZWxkIGZvbGxvd2luZyB0aGUgb2JqZWN0LgotICBmbGF0YnVmZmVyczo6UGFyc2VyIHBhcnNlcjsKLSAgVEVTVF9FUShwYXJzZXIuUGFyc2UoInRhYmxlIFQgeyBBOmludDsgfSIKLSAgICAgICAgICAgICAgICAgICAgICAgInVuaW9uIFUgeyBUIH0iCi0gICAgICAgICAgICAgICAgICAgICAgICJ0YWJsZSBWIHsgWDpVOyB9IgotICAgICAgICAgICAgICAgICAgICAgICAicm9vdF90eXBlIFY7IgotICAgICAgICAgICAgICAgICAgICAgICAieyBYOnsgQToxIH0sIFhfdHlwZTogVCB9IiksCi0gICAgICAgICAgdHJ1ZSk7Ci0gIC8vIFVuaW9ucyBtdXN0IGJlIHBhcnNhYmxlIHdpdGggcHJlZml4ZWQgbmFtZXNwYWNlLgotICBmbGF0YnVmZmVyczo6UGFyc2VyIHBhcnNlcjI7Ci0gIFRFU1RfRVEocGFyc2VyMi5QYXJzZSgibmFtZXNwYWNlIE47IHRhYmxlIEEge30gbmFtZXNwYWNlOyB1bmlvbiBVIHsgTi5BIH0iCi0gICAgICAgICAgICAgICAgICAgICAgICAidGFibGUgQiB7IGU6VTsgfSByb290X3R5cGUgQjsiCi0gICAgICAgICAgICAgICAgICAgICAgICAieyBlX3R5cGU6IE5fQSwgZToge30gfSIpLAotICAgICAgICAgIHRydWUpOwotfQotCi12b2lkIFZhbGlkU2FtZU5hbWVEaWZmZXJlbnROYW1lc3BhY2VUZXN0KCkgewotICAvLyBEdXBsaWNhdGUgdGFibGUgbmFtZXMgaW4gZGlmZmVyZW50IG5hbWVzcGFjZXMgbXVzdCBiZSBwYXJzYWJsZQotICBURVNUX0FTU0VSVChmbGF0YnVmZmVyczo6UGFyc2VyKCkuUGFyc2UoCi0gICAgICAibmFtZXNwYWNlIEE7IHRhYmxlIFgge30gbmFtZXNwYWNlIEI7IHRhYmxlIFgge30iKSk7Ci0gIC8vIER1cGxpY2F0ZSB1bmlvbiBuYW1lcyBpbiBkaWZmZXJlbnQgbmFtZXNwYWNlcyBtdXN0IGJlIHBhcnNhYmxlCi0gIFRFU1RfQVNTRVJUKGZsYXRidWZmZXJzOjpQYXJzZXIoKS5QYXJzZSgKLSAgICAgICJuYW1lc3BhY2UgQTsgdW5pb24gWCB7fSBuYW1lc3BhY2UgQjsgdW5pb24gWCB7fSIpKTsKLSAgLy8gQ2xhc2hpbmcgdGFibGUgYW5kIHVuaW9uIG5hbWVzIGluIGRpZmZlcmVudCBuYW1lc3BhY2VzIG11c3QgYmUgcGFyc2FibGUKLSAgVEVTVF9BU1NFUlQoZmxhdGJ1ZmZlcnM6OlBhcnNlcigpLlBhcnNlKAotICAgICAgIm5hbWVzcGFjZSBBOyB0YWJsZSBYIHt9IG5hbWVzcGFjZSBCOyB1bmlvbiBYIHt9IikpOwotICBURVNUX0FTU0VSVChmbGF0YnVmZmVyczo6UGFyc2VyKCkuUGFyc2UoCi0gICAgICAibmFtZXNwYWNlIEE7IHVuaW9uIFgge30gbmFtZXNwYWNlIEI7IHRhYmxlIFgge30iKSk7Ci19Ci0KLXZvaWQgTXVsdGlGaWxlTmFtZUNsYXNoVGVzdCgpIHsKK3ZvaWQgTXVsdGlGaWxlTmFtZUNsYXNoVGVzdChjb25zdCBzdGQ6OnN0cmluZyAmdGVzdHNfZGF0YV9wYXRoKSB7CiAgIGNvbnN0IGF1dG8gbmFtZV9jbGFzaF9wYXRoID0KLSAgICAgIGZsYXRidWZmZXJzOjpDb25DYXRQYXRoRmlsZU5hbWUodGVzdF9kYXRhX3BhdGgsICJuYW1lX2NsYXNoX3Rlc3QiKTsKKyAgICAgIGZsYXRidWZmZXJzOjpDb25DYXRQYXRoRmlsZU5hbWUodGVzdHNfZGF0YV9wYXRoLCAibmFtZV9jbGFzaF90ZXN0Iik7CiAgIGNvbnN0IGNoYXIgKmluY2x1ZGVfZGlyZWN0b3JpZXNbXSA9IHsgbmFtZV9jbGFzaF9wYXRoLmNfc3RyKCkgfTsKIAogICAvLyBMb2FkIHZhbGlkIDIgZmlsZSBGbGF0YnVmZmVyIHNjaGVtYQpAQCAtMjcxOCwxNSArMTY3LDE1IEBACiAgICAgICBmYWxzZSk7CiB9CiAKLXZvaWQgSW52YWxpZE5lc3RlZEZsYXRidWZmZXJUZXN0KCkgewordm9pZCBJbnZhbGlkTmVzdGVkRmxhdGJ1ZmZlclRlc3QoY29uc3Qgc3RkOjpzdHJpbmcgJnRlc3RzX2RhdGFfcGF0aCkgewogICAvLyBGaXJzdCwgbG9hZCBhbmQgcGFyc2UgRmxhdEJ1ZmZlciBzY2hlbWEgKC5mYnMpCiAgIHN0ZDo6c3RyaW5nIHNjaGVtYWZpbGU7Ci0gIFRFU1RfRVEoZmxhdGJ1ZmZlcnM6OkxvYWRGaWxlKCh0ZXN0X2RhdGFfcGF0aCArICJtb25zdGVyX3Rlc3QuZmJzIikuY19zdHIoKSwKKyAgVEVTVF9FUShmbGF0YnVmZmVyczo6TG9hZEZpbGUoKHRlc3RzX2RhdGFfcGF0aCArICJtb25zdGVyX3Rlc3QuZmJzIikuY19zdHIoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UsICZzY2hlbWFmaWxlKSwKICAgICAgICAgICB0cnVlKTsKICAgYXV0byBpbmNsdWRlX3Rlc3RfcGF0aCA9Ci0gICAgICBmbGF0YnVmZmVyczo6Q29uQ2F0UGF0aEZpbGVOYW1lKHRlc3RfZGF0YV9wYXRoLCAiaW5jbHVkZV90ZXN0Iik7Ci0gIGNvbnN0IGNoYXIgKmluY2x1ZGVfZGlyZWN0b3JpZXNbXSA9IHsgdGVzdF9kYXRhX3BhdGguY19zdHIoKSwKKyAgICAgIGZsYXRidWZmZXJzOjpDb25DYXRQYXRoRmlsZU5hbWUodGVzdHNfZGF0YV9wYXRoLCAiaW5jbHVkZV90ZXN0Iik7CisgIGNvbnN0IGNoYXIgKmluY2x1ZGVfZGlyZWN0b3JpZXNbXSA9IHsgdGVzdHNfZGF0YV9wYXRoLmNfc3RyKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5jbHVkZV90ZXN0X3BhdGguY19zdHIoKSwgbnVsbHB0ciB9OwogICBmbGF0YnVmZmVyczo6UGFyc2VyIHBhcnNlcjE7CiAgIFRFU1RfRVEocGFyc2VyMS5QYXJzZShzY2hlbWFmaWxlLmNfc3RyKCksIGluY2x1ZGVfZGlyZWN0b3JpZXMpLCB0cnVlKTsKQEAgLTI3MzcsMTIyICsxODYsMTUgQEAKICAgICAgICAgICBmYWxzZSk7CiB9CiAKLXZvaWQgRXZvbHV0aW9uVGVzdCgpIHsKLSAgLy8gVlMxMCBkb2VzIG5vdCBzdXBwb3J0IHR5cGVkIGVudW1zLCBleGNsdWRlIGZyb20gdGVzdHMKLSNpZiAhZGVmaW5lZChfTVNDX1ZFUikgfHwgX01TQ19WRVIgPj0gMTcwMAotICBjb25zdCBpbnQgTlVNX1ZFUlNJT05TID0gMjsKLSAgc3RkOjpzdHJpbmcgc2NoZW1hc1tOVU1fVkVSU0lPTlNdOwotICBzdGQ6OnN0cmluZyBqc29uZmlsZXNbTlVNX1ZFUlNJT05TXTsKLSAgc3RkOjp2ZWN0b3I8dWludDhfdD4gYmluYXJpZXNbTlVNX1ZFUlNJT05TXTsKLQotICBmbGF0YnVmZmVyczo6SURMT3B0aW9ucyBpZGxfb3B0czsKLSAgaWRsX29wdHMubGFuZ190b19nZW5lcmF0ZSB8PSBmbGF0YnVmZmVyczo6SURMT3B0aW9uczo6a0JpbmFyeTsKLSAgZmxhdGJ1ZmZlcnM6OlBhcnNlciBwYXJzZXIoaWRsX29wdHMpOwotCi0gIC8vIExvYWQgYWxsIHRoZSBzY2hlbWEgdmVyc2lvbnMgYW5kIHRoZWlyIGFzc29jaWF0ZWQgZGF0YS4KLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBOVU1fVkVSU0lPTlM7ICsraSkgewotICAgIHN0ZDo6c3RyaW5nIHNjaGVtYSA9IHRlc3RfZGF0YV9wYXRoICsgImV2b2x1dGlvbl90ZXN0L2V2b2x1dGlvbl92IiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgZmxhdGJ1ZmZlcnM6Ok51bVRvU3RyaW5nKGkgKyAxKSArICIuZmJzIjsKLSAgICBURVNUX0FTU0VSVChmbGF0YnVmZmVyczo6TG9hZEZpbGUoc2NoZW1hLmNfc3RyKCksIGZhbHNlLCAmc2NoZW1hc1tpXSkpOwotICAgIHN0ZDo6c3RyaW5nIGpzb24gPSB0ZXN0X2RhdGFfcGF0aCArICJldm9sdXRpb25fdGVzdC9ldm9sdXRpb25fdiIgKwotICAgICAgICAgICAgICAgICAgICAgICBmbGF0YnVmZmVyczo6TnVtVG9TdHJpbmcoaSArIDEpICsgIi5qc29uIjsKLSAgICBURVNUX0FTU0VSVChmbGF0YnVmZmVyczo6TG9hZEZpbGUoanNvbi5jX3N0cigpLCBmYWxzZSwgJmpzb25maWxlc1tpXSkpOwotCi0gICAgVEVTVF9BU1NFUlQocGFyc2VyLlBhcnNlKHNjaGVtYXNbaV0uY19zdHIoKSkpOwotICAgIFRFU1RfQVNTRVJUKHBhcnNlci5QYXJzZShqc29uZmlsZXNbaV0uY19zdHIoKSkpOwotCi0gICAgYXV0byBidWZMZW4gPSBwYXJzZXIuYnVpbGRlcl8uR2V0U2l6ZSgpOwotICAgIGF1dG8gYnVmID0gcGFyc2VyLmJ1aWxkZXJfLkdldEJ1ZmZlclBvaW50ZXIoKTsKLSAgICBiaW5hcmllc1tpXS5yZXNlcnZlKGJ1Zkxlbik7Ci0gICAgc3RkOjpjb3B5KGJ1ZiwgYnVmICsgYnVmTGVuLCBzdGQ6OmJhY2tfaW5zZXJ0ZXIoYmluYXJpZXNbaV0pKTsKLSAgfQotCi0gIC8vIEFzc2VydCB0aGF0IGFsbCB0aGUgdmVyaWZpZXJzIGZvciB0aGUgZGlmZmVyZW50IHNjaGVtYSB2ZXJzaW9ucyBwcm9wZXJseQotICAvLyB2ZXJpZnkgYW55IHZlcnNpb24gZGF0YS4KLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBOVU1fVkVSU0lPTlM7ICsraSkgewotICAgIGZsYXRidWZmZXJzOjpWZXJpZmllciB2ZXJpZmllcigmYmluYXJpZXNbaV0uZnJvbnQoKSwgYmluYXJpZXNbaV0uc2l6ZSgpKTsKLSAgICBURVNUX0FTU0VSVChFdm9sdXRpb246OlYxOjpWZXJpZnlSb290QnVmZmVyKHZlcmlmaWVyKSk7Ci0gICAgVEVTVF9BU1NFUlQoRXZvbHV0aW9uOjpWMjo6VmVyaWZ5Um9vdEJ1ZmZlcih2ZXJpZmllcikpOwotICB9Ci0KLSAgLy8gVGVzdCBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSBieSByZWFkaW5nIG9sZCBkYXRhIHdpdGggYW4gZXZvbHZlZCBzY2hlbWEuCi0gIGF1dG8gcm9vdF92MV92aWV3ZWRfZnJvbV92MiA9IEV2b2x1dGlvbjo6VjI6OkdldFJvb3QoJmJpbmFyaWVzWzBdLmZyb250KCkpOwotICAvLyBmaWVsZCAnaycgaXMgbmV3IGluIHZlcnNpb24gMiwgc28gaXQgc2hvdWxkIGJlIG51bGwuCi0gIFRFU1RfQVNTRVJUKG51bGxwdHIgPT0gcm9vdF92MV92aWV3ZWRfZnJvbV92Mi0+aygpKTsKLSAgLy8gZmllbGQgJ2wnIGlzIG5ldyBpbiB2ZXJzaW9uIDIgd2l0aCBhIGRlZmF1bHQgb2YgNTYuCi0gIFRFU1RfRVEocm9vdF92MV92aWV3ZWRfZnJvbV92Mi0+bCgpLCA1Nik7Ci0gIC8vIGZpZWxkICdjJyBvZiAnVGFibGVBJyBpcyBuZXcgaW4gdmVyc2lvbiAyLCBzbyBpdCBzaG91bGQgYmUgbnVsbC4KLSAgVEVTVF9BU1NFUlQobnVsbHB0ciA9PSByb290X3YxX3ZpZXdlZF9mcm9tX3YyLT5lKCktPmMoKSk7Ci0gIC8vICdUYWJsZUMnIHdhcyBhZGRlZCB0byBmaWVsZCAnYycgdW5pb24gaW4gdmVyc2lvbiAyLCBzbyBpdCBzaG91bGQgYmUgbnVsbC4KLSAgVEVTVF9BU1NFUlQobnVsbHB0ciA9PSByb290X3YxX3ZpZXdlZF9mcm9tX3YyLT5jX2FzX1RhYmxlQygpKTsKLSAgLy8gVGhlIGZpZWxkICdjJyB1bmlvbiBzaG91bGQgYmUgb2YgdHlwZSAnVGFibGVCJyByZWdhcmRsZXNzIG9mIHNjaGVtYSB2ZXJzaW9uCi0gIFRFU1RfQVNTRVJUKHJvb3RfdjFfdmlld2VkX2Zyb21fdjItPmNfdHlwZSgpID09IEV2b2x1dGlvbjo6VjI6OlVuaW9uOjpUYWJsZUIpOwotICAvLyBUaGUgZmllbGQgJ2YnIHdhcyByZW5hbWVkIHRvICdmZicgaW4gdmVyc2lvbiAyLCBpdCBzaG91bGQgc3RpbGwgYmUKLSAgLy8gcmVhZGFibGUuCi0gIFRFU1RfRVEocm9vdF92MV92aWV3ZWRfZnJvbV92Mi0+ZmYoKS0+YSgpLCAxNik7Ci0KLSAgLy8gVGVzdCBmb3J3YXJkcyBjb21wYXRpYmlsaXR5IGJ5IHJlYWRpbmcgbmV3IGRhdGEgd2l0aCBhbiBvbGQgc2NoZW1hLgotICBhdXRvIHJvb3RfdjJfdmlld2VkX2Zyb21fdjEgPSBFdm9sdXRpb246OlYxOjpHZXRSb290KCZiaW5hcmllc1sxXS5mcm9udCgpKTsKLSAgLy8gVGhlIGZpZWxkICdjJyB1bmlvbiBpbiB2ZXJzaW9uIDIgaXMgYSBuZXcgdGFibGUgKGluZGV4ID0gMykgYW5kIHNob3VsZAotICAvLyBzdGlsbCBiZSBhY2Nlc3NpYmxlLCBidXQgbm90IGludGVycHJldGFibGUuCi0gIFRFU1RfRVEoc3RhdGljX2Nhc3Q8dWludDhfdD4ocm9vdF92Ml92aWV3ZWRfZnJvbV92MS0+Y190eXBlKCkpLCAzKTsKLSAgVEVTVF9OT1ROVUxMKHJvb3RfdjJfdmlld2VkX2Zyb21fdjEtPmMoKSk7Ci0gIC8vIFRoZSBmaWVsZCAnZCcgZW51bSBpbiB2ZXJpc29uIDIgaGFzIG5ldyBtZW1iZXJzIGFuZCBzaG91bGQgc3RpbGwgYmUKLSAgLy8gYWNjZXNzaWJsZSwgYnV0IG5vdCBpbnRlcnByZXRhYmxlLgotICBURVNUX0VRKHN0YXRpY19jYXN0PGludDhfdD4ocm9vdF92Ml92aWV3ZWRfZnJvbV92MS0+ZCgpKSwgMyk7Ci0gIC8vIFRoZSBmaWVsZCAnYScgaW4gdmVyc2lvbiAyIGlzIGRlcHJlY2F0ZWQgYW5kIHNob3VsZCByZXR1cm4gdGhlIGRlZmF1bHQKLSAgLy8gdmFsdWUgKDApIGluc3RlYWQgb2YgdGhlIHZhbHVlIHN0b3JlZCBpbiB0aGUgaW4gdGhlIGJ1ZmZlciAoNDIpLgotICBURVNUX0VRKHJvb3RfdjJfdmlld2VkX2Zyb21fdjEtPmEoKSwgMCk7Ci0gIC8vIFRoZSBmaWVsZCAnZmYnIHdhcyBvcmlnaW5hbGx5IG5hbWVkICdmJyBpbiB2ZXJzaW9uIDEsIGl0IHNob3VsZCBzdGlsbCBiZQotICAvLyByZWFkYWJsZS4KLSAgVEVTVF9FUShyb290X3YyX3ZpZXdlZF9mcm9tX3YxLT5mKCktPmEoKSwgMzUpOwotI2VuZGlmCi19Ci0KLXZvaWQgVW5pb25EZXByZWNhdGlvblRlc3QoKSB7Ci0gIGNvbnN0IGludCBOVU1fVkVSU0lPTlMgPSAyOwotICBzdGQ6OnN0cmluZyBzY2hlbWFzW05VTV9WRVJTSU9OU107Ci0gIHN0ZDo6c3RyaW5nIGpzb25maWxlc1tOVU1fVkVSU0lPTlNdOwotICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBiaW5hcmllc1tOVU1fVkVSU0lPTlNdOwotCi0gIGZsYXRidWZmZXJzOjpJRExPcHRpb25zIGlkbF9vcHRzOwotICBpZGxfb3B0cy5sYW5nX3RvX2dlbmVyYXRlIHw9IGZsYXRidWZmZXJzOjpJRExPcHRpb25zOjprQmluYXJ5OwotICBmbGF0YnVmZmVyczo6UGFyc2VyIHBhcnNlcihpZGxfb3B0cyk7Ci0KLSAgLy8gTG9hZCBhbGwgdGhlIHNjaGVtYSB2ZXJzaW9ucyBhbmQgdGhlaXIgYXNzb2NpYXRlZCBkYXRhLgotICBmb3IgKGludCBpID0gMDsgaSA8IE5VTV9WRVJTSU9OUzsgKytpKSB7Ci0gICAgc3RkOjpzdHJpbmcgc2NoZW1hID0gdGVzdF9kYXRhX3BhdGggKyAiZXZvbHV0aW9uX3Rlc3QvZXZvbHV0aW9uX3YiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICBmbGF0YnVmZmVyczo6TnVtVG9TdHJpbmcoaSArIDEpICsgIi5mYnMiOwotICAgIFRFU1RfQVNTRVJUKGZsYXRidWZmZXJzOjpMb2FkRmlsZShzY2hlbWEuY19zdHIoKSwgZmFsc2UsICZzY2hlbWFzW2ldKSk7Ci0gICAgc3RkOjpzdHJpbmcganNvbiA9IHRlc3RfZGF0YV9wYXRoICsgImV2b2x1dGlvbl90ZXN0L2V2b2x1dGlvbl92IiArCi0gICAgICAgICAgICAgICAgICAgICAgIGZsYXRidWZmZXJzOjpOdW1Ub1N0cmluZyhpICsgMSkgKyAiLmpzb24iOwotICAgIFRFU1RfQVNTRVJUKGZsYXRidWZmZXJzOjpMb2FkRmlsZShqc29uLmNfc3RyKCksIGZhbHNlLCAmanNvbmZpbGVzW2ldKSk7Ci0KLSAgICBURVNUX0FTU0VSVChwYXJzZXIuUGFyc2Uoc2NoZW1hc1tpXS5jX3N0cigpKSk7Ci0gICAgVEVTVF9BU1NFUlQocGFyc2VyLlBhcnNlKGpzb25maWxlc1tpXS5jX3N0cigpKSk7Ci0KLSAgICBhdXRvIGJ1ZkxlbiA9IHBhcnNlci5idWlsZGVyXy5HZXRTaXplKCk7Ci0gICAgYXV0byBidWYgPSBwYXJzZXIuYnVpbGRlcl8uR2V0QnVmZmVyUG9pbnRlcigpOwotICAgIGJpbmFyaWVzW2ldLnJlc2VydmUoYnVmTGVuKTsKLSAgICBzdGQ6OmNvcHkoYnVmLCBidWYgKyBidWZMZW4sIHN0ZDo6YmFja19pbnNlcnRlcihiaW5hcmllc1tpXSkpOwotICB9Ci0KLSAgYXV0byB2MiA9IHBhcnNlci5Mb29rdXBTdHJ1Y3QoIkV2b2x1dGlvbi5WMi5Sb290Iik7Ci0gIFRFU1RfTk9UTlVMTCh2Mik7Ci0gIGF1dG8gal90eXBlX2ZpZWxkID0gdjItPmZpZWxkcy5Mb29rdXAoImpfdHlwZSIpOwotICBURVNUX05PVE5VTEwoal90eXBlX2ZpZWxkKTsKLSAgVEVTVF9BU1NFUlQoal90eXBlX2ZpZWxkLT5kZXByZWNhdGVkKTsKLX0KLQotdm9pZCBVbmlvblZlY3RvclRlc3QoKSB7Cit2b2lkIFVuaW9uVmVjdG9yVGVzdChjb25zdCBzdGQ6OnN0cmluZyAmdGVzdHNfZGF0YV9wYXRoKSB7CiAgIC8vIGxvYWQgRmxhdEJ1ZmZlciBmYnMgc2NoZW1hIGFuZCBqc29uLgogICBzdGQ6OnN0cmluZyBzY2hlbWFmaWxlLCBqc29uZmlsZTsKICAgVEVTVF9FUShmbGF0YnVmZmVyczo6TG9hZEZpbGUoCi0gICAgICAgICAgICAgICh0ZXN0X2RhdGFfcGF0aCArICJ1bmlvbl92ZWN0b3IvdW5pb25fdmVjdG9yLmZicyIpLmNfc3RyKCksIGZhbHNlLAotICAgICAgICAgICAgICAmc2NoZW1hZmlsZSksCisgICAgICAgICAgICAgICh0ZXN0c19kYXRhX3BhdGggKyAidW5pb25fdmVjdG9yL3VuaW9uX3ZlY3Rvci5mYnMiKS5jX3N0cigpLAorICAgICAgICAgICAgICBmYWxzZSwgJnNjaGVtYWZpbGUpLAogICAgICAgICAgIHRydWUpOwogICBURVNUX0VRKGZsYXRidWZmZXJzOjpMb2FkRmlsZSgKLSAgICAgICAgICAgICAgKHRlc3RfZGF0YV9wYXRoICsgInVuaW9uX3ZlY3Rvci91bmlvbl92ZWN0b3IuanNvbiIpLmNfc3RyKCksCisgICAgICAgICAgICAgICh0ZXN0c19kYXRhX3BhdGggKyAidW5pb25fdmVjdG9yL3VuaW9uX3ZlY3Rvci5qc29uIikuY19zdHIoKSwKICAgICAgICAgICAgICAgZmFsc2UsICZqc29uZmlsZSksCiAgICAgICAgICAgdHJ1ZSk7CiAKQEAgLTMwMzUsMzM5ICszNzcsNiBAQAogICBURVNUX0VRKHBhcnNlcjIuUGFyc2UoInthX3R5cGU6Qm9vbCxhOntiOnRydWV9fSIpLCB0cnVlKTsKIH0KIAotdm9pZCBTdHJ1Y3RVbmlvblRlc3QoKSB7Ci0gIEdhZGdldFVuaW9uIGdhZGdldDsKLSAgZ2FkZ2V0LlNldChGYWxsaW5nVHViKDEwMCkpOwotCi0gIEhhbmRGYW5UIGZhbjsKLSAgZmFuLmxlbmd0aCA9IDEwOwotICBnYWRnZXQuU2V0KGZhbik7Ci19Ci0KLXZvaWQgV2FybmluZ3NBc0Vycm9yc1Rlc3QoKSB7Ci0gIHsKLSAgICBmbGF0YnVmZmVyczo6SURMT3B0aW9ucyBvcHRzOwotICAgIC8vIG9wdHMud2FybmluZ3NfYXNfZXJyb3JzIHNob3VsZCBkZWZhdWx0IHRvIGZhbHNlCi0gICAgZmxhdGJ1ZmZlcnM6OlBhcnNlciBwYXJzZXIob3B0cyk7Ci0gICAgVEVTVF9FUShwYXJzZXIuUGFyc2UoInRhYmxlIFQgeyBUSElTX05BTUVfQ0FVU0VTX0FfV0FSTklORzpzdHJpbmc7fVxuIgotICAgICAgICAgICAgICAgICAgICAgICAgICJyb290X3R5cGUgVDsiKSwKLSAgICAgICAgICAgIHRydWUpOwotICB9Ci0gIHsKLSAgICBmbGF0YnVmZmVyczo6SURMT3B0aW9ucyBvcHRzOwotICAgIG9wdHMud2FybmluZ3NfYXNfZXJyb3JzID0gdHJ1ZTsKLSAgICBmbGF0YnVmZmVyczo6UGFyc2VyIHBhcnNlcihvcHRzKTsKLSAgICBURVNUX0VRKHBhcnNlci5QYXJzZSgidGFibGUgVCB7IFRISVNfTkFNRV9DQVVTRVNfQV9XQVJOSU5HOnN0cmluZzt9XG4iCi0gICAgICAgICAgICAgICAgICAgICAgICAgInJvb3RfdHlwZSBUOyIpLAotICAgICAgICAgICAgZmFsc2UpOwotICB9Ci19Ci0KLXZvaWQgQ29uZm9ybVRlc3QoKSB7Ci0gIGZsYXRidWZmZXJzOjpQYXJzZXIgcGFyc2VyOwotICBURVNUX0VRKHBhcnNlci5QYXJzZSgidGFibGUgVCB7IEE6aW50OyB9IGVudW0gRTpieXRlIHsgQSB9IiksIHRydWUpOwotCi0gIGF1dG8gdGVzdF9jb25mb3JtID0gW10oZmxhdGJ1ZmZlcnM6OlBhcnNlciAmcGFyc2VyMSwgY29uc3QgY2hhciAqdGVzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpleHBlY3RlZF9lcnIpIHsKLSAgICBmbGF0YnVmZmVyczo6UGFyc2VyIHBhcnNlcjI7Ci0gICAgVEVTVF9FUShwYXJzZXIyLlBhcnNlKHRlc3QpLCB0cnVlKTsKLSAgICBhdXRvIGVyciA9IHBhcnNlcjIuQ29uZm9ybVRvKHBhcnNlcjEpOwotICAgIFRFU1RfTk9UTlVMTChzdHJzdHIoZXJyLmNfc3RyKCksIGV4cGVjdGVkX2VycikpOwotICB9OwotCi0gIHRlc3RfY29uZm9ybShwYXJzZXIsICJ0YWJsZSBUIHsgQTpieXRlOyB9IiwgInR5cGVzIGRpZmZlciBmb3IgZmllbGQiKTsKLSAgdGVzdF9jb25mb3JtKHBhcnNlciwgInRhYmxlIFQgeyBCOmludDsgQTppbnQ7IH0iLCAib2Zmc2V0cyBkaWZmZXIgZm9yIGZpZWxkIik7Ci0gIHRlc3RfY29uZm9ybShwYXJzZXIsICJ0YWJsZSBUIHsgQTppbnQgPSAxOyB9IiwgImRlZmF1bHRzIGRpZmZlciBmb3IgZmllbGQiKTsKLSAgdGVzdF9jb25mb3JtKHBhcnNlciwgInRhYmxlIFQgeyBCOmZsb2F0OyB9IiwKLSAgICAgICAgICAgICAgICJmaWVsZCByZW5hbWVkIHRvIGRpZmZlcmVudCB0eXBlIik7Ci0gIHRlc3RfY29uZm9ybShwYXJzZXIsICJlbnVtIEU6Ynl0ZSB7IEIsIEEgfSIsICJ2YWx1ZXMgZGlmZmVyIGZvciBlbnVtIik7Ci19Ci0KLXZvaWQgUGFyc2VQcm90b0J1ZkFzY2lpVGVzdCgpIHsKLSAgLy8gV2UgY2FuIHB1dCB0aGUgcGFyc2VyIGluIGEgbW9kZSB3aGVyZSBpdCB3aWxsIGFjY2VwdCBKU09OIHRoYXQgbG9va3MgbW9yZQotICAvLyBsaWtlIFByb3RvYnVmIEFTQ0lJLCBmb3IgdXNlcnMgdGhhdCBoYXZlIGRhdGEgaW4gdGhhdCBmb3JtYXQuCi0gIC8vIFRoaXMgdXNlcyBubyAiIiBmb3IgZmllbGQgbmFtZXMgKHdoaWNoIHdlIGFscmVhZHkgc3VwcG9ydCBieSBkZWZhdWx0LAotICAvLyBvbWl0cyBgLGAsIGA6YCBiZWZvcmUgYHtgIGFuZCBhIGNvdXBsZSBvZiBvdGhlciBmZWF0dXJlcy4KLSAgZmxhdGJ1ZmZlcnM6OlBhcnNlciBwYXJzZXI7Ci0gIHBhcnNlci5vcHRzLnByb3RvYnVmX2FzY2lpX2FsaWtlID0gdHJ1ZTsKLSAgVEVTVF9FUSgKLSAgICAgIHBhcnNlci5QYXJzZSgidGFibGUgUyB7IEI6aW50OyB9IHRhYmxlIFQgeyBBOltpbnRdOyBDOlM7IH0gcm9vdF90eXBlIFQ7IiksCi0gICAgICB0cnVlKTsKLSAgVEVTVF9FUShwYXJzZXIuUGFyc2UoInsgQSBbMSAyXSBDIHsgQjoyIH19IiksIHRydWUpOwotICAvLyBTaW1pbGFybHksIGluIHRleHQgb3V0cHV0LCBpdCBzaG91bGQgb21pdCB0aGVzZS4KLSAgc3RkOjpzdHJpbmcgdGV4dDsKLSAgYXV0byBvayA9IGZsYXRidWZmZXJzOjpHZW5lcmF0ZVRleHQoCi0gICAgICBwYXJzZXIsIHBhcnNlci5idWlsZGVyXy5HZXRCdWZmZXJQb2ludGVyKCksICZ0ZXh0KTsKLSAgVEVTVF9FUShvaywgdHJ1ZSk7Ci0gIFRFU1RfRVFfU1RSKHRleHQuY19zdHIoKSwKLSAgICAgICAgICAgICAgIntcbiAgQSBbXG4gICAgMVxuICAgIDJcbiAgXVxuICBDIHtcbiAgICBCOiAyXG4gIH1cbn1cbiIpOwotfQotCi12b2lkIEZsZXhCdWZmZXJzVGVzdCgpIHsKLSAgZmxleGJ1ZmZlcnM6OkJ1aWxkZXIgc2xiKDUxMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsZXhidWZmZXJzOjpCVUlMREVSX0ZMQUdfU0hBUkVfS0VZU19BTkRfU1RSSU5HUyk7Ci0KLSAgLy8gV3JpdGUgdGhlIGVxdWl2YWxlbnQgb2Y6Ci0gIC8vIHsgdmVjOiBbIC0xMDAsICJGcmVkIiwgNC4wLCBmYWxzZSBdLCBiYXI6IFsgMSwgMiwgMyBdLCBiYXIzOiBbIDEsIDIsIDMgXSwKLSAgLy8gZm9vOiAxMDAsIGJvb2w6IHRydWUsIG15bWFwOiB7IGZvbzogIkZyZWQiIH0gfQotCi0gIC8vIEl0J3MgcG9zc2libGUgdG8gZG8gdGhpcyB3aXRob3V0IHN0ZDo6ZnVuY3Rpb24gc3VwcG9ydCBhcyB3ZWxsLgotICBzbGIuTWFwKFsmXSgpIHsKLSAgICBzbGIuVmVjdG9yKCJ2ZWMiLCBbJl0oKSB7Ci0gICAgICBzbGIgKz0gLTEwMDsgIC8vIEVxdWl2YWxlbnQgdG8gc2xiLkFkZCgtMTAwKSBvciBzbGIuSW50KC0xMDApOwotICAgICAgc2xiICs9ICJGcmVkIjsKLSAgICAgIHNsYi5JbmRpcmVjdEZsb2F0KDQuMGYpOwotICAgICAgYXV0byBpX2YgPSBzbGIuTGFzdFZhbHVlKCk7Ci0gICAgICB1aW50OF90IGJsb2JbXSA9IHsgNzcgfTsKLSAgICAgIHNsYi5CbG9iKGJsb2IsIDEpOwotICAgICAgc2xiICs9IGZhbHNlOwotICAgICAgc2xiLlJldXNlVmFsdWUoaV9mKTsKLSAgICB9KTsKLSAgICBpbnQgaW50c1tdID0geyAxLCAyLCAzIH07Ci0gICAgc2xiLlZlY3RvcigiYmFyIiwgaW50cywgMyk7Ci0gICAgc2xiLkZpeGVkVHlwZWRWZWN0b3IoImJhcjMiLCBpbnRzLCAzKTsKLSAgICBib29sIGJvb2xzW10gPSB7IHRydWUsIGZhbHNlLCB0cnVlLCBmYWxzZSB9OwotICAgIHNsYi5WZWN0b3IoImJvb2xzIiwgYm9vbHMsIDQpOwotICAgIHNsYi5Cb29sKCJib29sIiwgdHJ1ZSk7Ci0gICAgc2xiLkRvdWJsZSgiZm9vIiwgMTAwKTsKLSAgICBzbGIuTWFwKCJteW1hcCIsIFsmXSgpIHsKLSAgICAgIHNsYi5TdHJpbmcoImZvbyIsICJGcmVkIik7ICAvLyBUZXN0aW5nIGtleSBhbmQgc3RyaW5nIHJldXNlLgotICAgIH0pOwotICB9KTsKLSAgc2xiLkZpbmlzaCgpOwotCi0vLyBjbGFuZy1mb3JtYXQgb2ZmCi0gICNpZmRlZiBGTEFUQlVGRkVSU19URVNUX1ZFUkJPU0UKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNsYi5HZXRCdWZmZXIoKS5zaXplKCk7IGkrKykKLSAgICAgIHByaW50ZigiJWQgIiwgc2xiLkdldEJ1ZmZlcigpLmRhdGEoKVtpXSk7Ci0gICAgcHJpbnRmKCJcbiIpOwotICAjZW5kaWYKLSAgLy8gY2xhbmctZm9ybWF0IG9uCi0KLSAgc3RkOjp2ZWN0b3I8dWludDhfdD4gcmV1c2VfdHJhY2tlcjsKLSAgVEVTVF9FUShmbGV4YnVmZmVyczo6VmVyaWZ5QnVmZmVyKHNsYi5HZXRCdWZmZXIoKS5kYXRhKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbGIuR2V0QnVmZmVyKCkuc2l6ZSgpLCAmcmV1c2VfdHJhY2tlciksCi0gICAgICAgICAgdHJ1ZSk7Ci0KLSAgYXV0byBtYXAgPSBmbGV4YnVmZmVyczo6R2V0Um9vdChzbGIuR2V0QnVmZmVyKCkpLkFzTWFwKCk7Ci0gIFRFU1RfRVEobWFwLnNpemUoKSwgNyk7Ci0gIGF1dG8gdmVjID0gbWFwWyJ2ZWMiXS5Bc1ZlY3RvcigpOwotICBURVNUX0VRKHZlYy5zaXplKCksIDYpOwotICBURVNUX0VRKHZlY1swXS5Bc0ludDY0KCksIC0xMDApOwotICBURVNUX0VRX1NUUih2ZWNbMV0uQXNTdHJpbmcoKS5jX3N0cigpLCAiRnJlZCIpOwotICBURVNUX0VRKHZlY1sxXS5Bc0ludDY0KCksIDApOyAgLy8gTnVtYmVyIHBhcnNpbmcgZmFpbGVkLgotICBURVNUX0VRKHZlY1syXS5Bc0RvdWJsZSgpLCA0LjApOwotICBURVNUX0VRKHZlY1syXS5Bc1N0cmluZygpLklzVGhlRW1wdHlTdHJpbmcoKSwgdHJ1ZSk7ICAvLyBXcm9uZyBUeXBlLgotICBURVNUX0VRX1NUUih2ZWNbMl0uQXNTdHJpbmcoKS5jX3N0cigpLCAiIik7ICAgICAvLyBUaGlzIHN0aWxsIHdvcmtzIHRob3VnaC4KLSAgVEVTVF9FUV9TVFIodmVjWzJdLlRvU3RyaW5nKCkuY19zdHIoKSwgIjQuMCIpOyAgLy8gT3IgaGF2ZSBpdCBjb252ZXJ0ZWQuCi0gIC8vIEZldyB0ZXN0cyBmb3IgdGVtcGxhdGVkIHZlcnNpb24gb2YgQXMuCi0gIFRFU1RfRVEodmVjWzBdLkFzPGludDY0X3Q+KCksIC0xMDApOwotICBURVNUX0VRX1NUUih2ZWNbMV0uQXM8c3RkOjpzdHJpbmc+KCkuY19zdHIoKSwgIkZyZWQiKTsKLSAgVEVTVF9FUSh2ZWNbMV0uQXM8aW50NjRfdD4oKSwgMCk7ICAvLyBOdW1iZXIgcGFyc2luZyBmYWlsZWQuCi0gIFRFU1RfRVEodmVjWzJdLkFzPGRvdWJsZT4oKSwgNC4wKTsKLSAgLy8gVGVzdCB0aGF0IHRoZSBibG9iIGNhbiBiZSBhY2Nlc3NlZC4KLSAgVEVTVF9FUSh2ZWNbM10uSXNCbG9iKCksIHRydWUpOwotICBhdXRvIGJsb2IgPSB2ZWNbM10uQXNCbG9iKCk7Ci0gIFRFU1RfRVEoYmxvYi5zaXplKCksIDEpOwotICBURVNUX0VRKGJsb2IuZGF0YSgpWzBdLCA3Nyk7Ci0gIFRFU1RfRVEodmVjWzRdLklzQm9vbCgpLCB0cnVlKTsgICAvLyBDaGVjayBpZiB0eXBlIGlzIGEgYm9vbAotICBURVNUX0VRKHZlY1s0XS5Bc0Jvb2woKSwgZmFsc2UpOyAgLy8gQ2hlY2sgaWYgdmFsdWUgaXMgZmFsc2UKLSAgVEVTVF9FUSh2ZWNbNV0uQXNEb3VibGUoKSwgNC4wKTsgIC8vIFRoaXMgaXMgc2hhcmVkIHdpdGggdmVjWzJdICEKLSAgYXV0byB0dmVjID0gbWFwWyJiYXIiXS5Bc1R5cGVkVmVjdG9yKCk7Ci0gIFRFU1RfRVEodHZlYy5zaXplKCksIDMpOwotICBURVNUX0VRKHR2ZWNbMl0uQXNJbnQ4KCksIDMpOwotICBhdXRvIHR2ZWMzID0gbWFwWyJiYXIzIl0uQXNGaXhlZFR5cGVkVmVjdG9yKCk7Ci0gIFRFU1RfRVEodHZlYzMuc2l6ZSgpLCAzKTsKLSAgVEVTVF9FUSh0dmVjM1syXS5Bc0ludDgoKSwgMyk7Ci0gIFRFU1RfRVEobWFwWyJib29sIl0uQXNCb29sKCksIHRydWUpOwotICBhdXRvIHR2ZWNiID0gbWFwWyJib29scyJdLkFzVHlwZWRWZWN0b3IoKTsKLSAgVEVTVF9FUSh0dmVjYi5FbGVtZW50VHlwZSgpLCBmbGV4YnVmZmVyczo6RkJUX0JPT0wpOwotICBURVNUX0VRKG1hcFsiZm9vIl0uQXNVSW50OCgpLCAxMDApOwotICBURVNUX0VRKG1hcFsidW5rbm93biJdLklzTnVsbCgpLCB0cnVlKTsKLSAgYXV0byBteW1hcCA9IG1hcFsibXltYXAiXS5Bc01hcCgpOwotICAvLyBUaGVzZSBzaG91bGQgYmUgZXF1YWwgYnkgcG9pbnRlciBlcXVhbGl0eSwgc2luY2Uga2V5IGFuZCB2YWx1ZSBhcmUgc2hhcmVkLgotICBURVNUX0VRKG15bWFwLktleXMoKVswXS5Bc0tleSgpLCBtYXAuS2V5cygpWzRdLkFzS2V5KCkpOwotICBURVNUX0VRKG15bWFwLlZhbHVlcygpWzBdLkFzU3RyaW5nKCkuY19zdHIoKSwgdmVjWzFdLkFzU3RyaW5nKCkuY19zdHIoKSk7Ci0gIC8vIFdlIGNhbiBtdXRhdGUgdmFsdWVzIGluIHRoZSBidWZmZXIuCi0gIFRFU1RfRVEodmVjWzBdLk11dGF0ZUludCgtOTkpLCB0cnVlKTsKLSAgVEVTVF9FUSh2ZWNbMF0uQXNJbnQ2NCgpLCAtOTkpOwotICBURVNUX0VRKHZlY1sxXS5NdXRhdGVTdHJpbmcoIkpvaG4iKSwgdHJ1ZSk7ICAvLyBTaXplIG11c3QgbWF0Y2guCi0gIFRFU1RfRVFfU1RSKHZlY1sxXS5Bc1N0cmluZygpLmNfc3RyKCksICJKb2huIik7Ci0gIFRFU1RfRVEodmVjWzFdLk11dGF0ZVN0cmluZygiQWxmcmVkIiksIGZhbHNlKTsgIC8vIFRvbyBsb25nLgotICBURVNUX0VRKHZlY1syXS5NdXRhdGVGbG9hdCgyLjBmKSwgdHJ1ZSk7Ci0gIFRFU1RfRVEodmVjWzJdLkFzRmxvYXQoKSwgMi4wZik7Ci0gIFRFU1RfRVEodmVjWzJdLk11dGF0ZUZsb2F0KDMuMTQxNTkpLCBmYWxzZSk7ICAvLyBEb3VibGUgZG9lcyBub3QgZml0IGluIGZsb2F0LgotICBURVNUX0VRKHZlY1s0XS5Bc0Jvb2woKSwgZmFsc2UpOyAgICAgICAgICAgICAgLy8gSXMgZmFsc2UgYmVmb3JlIGNoYW5nZQotICBURVNUX0VRKHZlY1s0XS5NdXRhdGVCb29sKHRydWUpLCB0cnVlKTsgICAgICAgLy8gQ2FuIGNoYW5nZSBhIGJvb2wKLSAgVEVTVF9FUSh2ZWNbNF0uQXNCb29sKCksIHRydWUpOyAgICAgICAgICAgICAgIC8vIENoYW5nZWQgYm9vbCBpcyBub3cgdHJ1ZQotCi0gIC8vIFBhcnNlIGZyb20gSlNPTjoKLSAgZmxhdGJ1ZmZlcnM6OlBhcnNlciBwYXJzZXI7Ci0gIHNsYi5DbGVhcigpOwotICBhdXRvIGpzb250ZXN0ID0gInsgYTogWyAxMjMsIDQ1Ni4wIF0sIGI6IFwiaGVsbG9cIiwgYzogdHJ1ZSwgZDogZmFsc2UgfSI7Ci0gIFRFU1RfRVEocGFyc2VyLlBhcnNlRmxleEJ1ZmZlcihqc29udGVzdCwgbnVsbHB0ciwgJnNsYiksIHRydWUpOwotICBURVNUX0VRKGZsZXhidWZmZXJzOjpWZXJpZnlCdWZmZXIoc2xiLkdldEJ1ZmZlcigpLmRhdGEoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNsYi5HZXRCdWZmZXIoKS5zaXplKCksICZyZXVzZV90cmFja2VyKSwKLSAgICAgICAgICB0cnVlKTsKLSAgYXV0byBqcm9vdCA9IGZsZXhidWZmZXJzOjpHZXRSb290KHNsYi5HZXRCdWZmZXIoKSk7Ci0gIGF1dG8gam1hcCA9IGpyb290LkFzTWFwKCk7Ci0gIGF1dG8ganZlYyA9IGptYXBbImEiXS5Bc1ZlY3RvcigpOwotICBURVNUX0VRKGp2ZWNbMF0uQXNJbnQ2NCgpLCAxMjMpOwotICBURVNUX0VRKGp2ZWNbMV0uQXNEb3VibGUoKSwgNDU2LjApOwotICBURVNUX0VRX1NUUihqbWFwWyJiIl0uQXNTdHJpbmcoKS5jX3N0cigpLCAiaGVsbG8iKTsKLSAgVEVTVF9FUShqbWFwWyJjIl0uSXNCb29sKCksIHRydWUpOyAgIC8vIFBhcnNlZCBjb3JyZWN0bHkgdG8gYSBib29sCi0gIFRFU1RfRVEoam1hcFsiYyJdLkFzQm9vbCgpLCB0cnVlKTsgICAvLyBQYXJzZWQgY29ycmVjdGx5IHRvIHRydWUKLSAgVEVTVF9FUShqbWFwWyJkIl0uSXNCb29sKCksIHRydWUpOyAgIC8vIFBhcnNlZCBjb3JyZWN0bHkgdG8gYSBib29sCi0gIFRFU1RfRVEoam1hcFsiZCJdLkFzQm9vbCgpLCBmYWxzZSk7ICAvLyBQYXJzZWQgY29ycmVjdGx5IHRvIGZhbHNlCi0gIC8vIEFuZCBmcm9tIEZsZXhCdWZmZXIgYmFjayB0byBKU09OOgotICBhdXRvIGpzb25iYWNrID0ganJvb3QuVG9TdHJpbmcoKTsKLSAgVEVTVF9FUV9TVFIoanNvbnRlc3QsIGpzb25iYWNrLmNfc3RyKCkpOwotCi0gIHNsYi5DbGVhcigpOwotICBzbGIuVmVjdG9yKFsmXSgpIHsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IDEzMDsgKytpKSBzbGIuQWRkKHN0YXRpY19jYXN0PHVpbnQ4X3Q+KDI1NSkpOwotICAgIHNsYi5WZWN0b3IoWyZdKCkgewotICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAxMzA7ICsraSkgc2xiLkFkZChzdGF0aWNfY2FzdDx1aW50OF90PigyNTUpKTsKLSAgICAgIHNsYi5WZWN0b3IoW10ge30pOwotICAgIH0pOwotICB9KTsKLSAgc2xiLkZpbmlzaCgpOwotICBURVNUX0VRKHNsYi5HZXRTaXplKCksIDY2NCk7Ci19Ci0KLXZvaWQgRmxleEJ1ZmZlcnNGbG9hdGluZ1BvaW50VGVzdCgpIHsKLSNpZiBkZWZpbmVkKEZMQVRCVUZGRVJTX0hBU19ORVdfU1RSVE9EKSAmJiAoRkxBVEJVRkZFUlNfSEFTX05FV19TVFJUT0QgPiAwKQotICBmbGV4YnVmZmVyczo6QnVpbGRlciBzbGIoNTEyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxleGJ1ZmZlcnM6OkJVSUxERVJfRkxBR19TSEFSRV9LRVlTX0FORF9TVFJJTkdTKTsKLSAgLy8gUGFyc2UgZmxvYXRpbmctcG9pbnQgdmFsdWVzIGZyb20gSlNPTjoKLSAgZmxhdGJ1ZmZlcnM6OlBhcnNlciBwYXJzZXI7Ci0gIHNsYi5DbGVhcigpOwotICBhdXRvIGpzb250ZXN0ID0KLSAgICAgICJ7IGE6IFsxLjAsIG5hbiwgaW5mLCBpbmZpbml0eSwgLWluZiwgK2luZiwgLWluZmluaXR5LCA4LjBdIH0iOwotICBURVNUX0VRKHBhcnNlci5QYXJzZUZsZXhCdWZmZXIoanNvbnRlc3QsIG51bGxwdHIsICZzbGIpLCB0cnVlKTsKLSAgYXV0byBqcm9vdCA9IGZsZXhidWZmZXJzOjpHZXRSb290KHNsYi5HZXRCdWZmZXIoKSk7Ci0gIFRFU1RfRVEoZmxleGJ1ZmZlcnM6OlZlcmlmeUJ1ZmZlcihzbGIuR2V0QnVmZmVyKCkuZGF0YSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2xiLkdldEJ1ZmZlcigpLnNpemUoKSwgbnVsbHB0ciksCi0gICAgICAgICAgdHJ1ZSk7Ci0gIGF1dG8gam1hcCA9IGpyb290LkFzTWFwKCk7Ci0gIGF1dG8ganZlYyA9IGptYXBbImEiXS5Bc1ZlY3RvcigpOwotICBURVNUX0VRKDgsIGp2ZWMuc2l6ZSgpKTsKLSAgVEVTVF9FUSgxLjAsIGp2ZWNbMF0uQXNEb3VibGUoKSk7Ci0gIFRFU1RfQVNTRVJUKGlzX3F1aWV0X25hbihqdmVjWzFdLkFzRG91YmxlKCkpKTsKLSAgVEVTVF9FUShpbmZpbml0eV9kLCBqdmVjWzJdLkFzRG91YmxlKCkpOwotICBURVNUX0VRKGluZmluaXR5X2QsIGp2ZWNbM10uQXNEb3VibGUoKSk7Ci0gIFRFU1RfRVEoLWluZmluaXR5X2QsIGp2ZWNbNF0uQXNEb3VibGUoKSk7Ci0gIFRFU1RfRVEoK2luZmluaXR5X2QsIGp2ZWNbNV0uQXNEb3VibGUoKSk7Ci0gIFRFU1RfRVEoLWluZmluaXR5X2QsIGp2ZWNbNl0uQXNEb3VibGUoKSk7Ci0gIFRFU1RfRVEoOC4wLCBqdmVjWzddLkFzRG91YmxlKCkpOwotI2VuZGlmCi19Ci0KLXZvaWQgRmxleEJ1ZmZlcnNEZXByZWNhdGVkVGVzdCgpIHsKLSAgLy8gRmxleEJ1ZmZlcnMgYXMgb3JpZ2luYWxseSBkZXNpZ25lZCBoYWQgYSBmbGF3IGludm9sdmluZyB0aGUKLSAgLy8gRkJUX1ZFQ1RPUl9TVFJJTkcgZGF0YXR5cGUsIGFuZCB0aGlzIHRlc3QgZG9jdW1lbnRzL3Rlc3RzIHRoZSBmaXggZm9yIGl0LgotICAvLyBEaXNjdXNzaW9uOiBodHRwczovL2dpdGh1Yi5jb20vZ29vZ2xlL2ZsYXRidWZmZXJzL2lzc3Vlcy81NjI3Ci0gIGZsZXhidWZmZXJzOjpCdWlsZGVyIHNsYjsKLSAgLy8gRkJUX1ZFQ1RPUl8qIGFyZSAidHlwZWQgdmVjdG9ycyIgd2hlcmUgYWxsIGVsZW1lbnRzIGFyZSBvZiB0aGUgc2FtZSB0eXBlLgotICAvLyBQcm9ibGVtIGlzLCB3aGVuIHN0b3JpbmcgRkJUX1NUUklORyBlbGVtZW50cywgaXQgcmVsaWVzIG9uIHRoYXQgdHlwZSB0bwotICAvLyBnZXQgdGhlIGJpdC13aWR0aCBmb3IgdGhlIHNpemUgZmllbGQgb2YgdGhlIHN0cmluZywgd2hpY2ggaW4gdGhpcyBjYXNlCi0gIC8vIGlzbid0IHByZXNlbnQsIGFuZCBpbnN0ZWFkIGRlZmF1bHRzIHRvIDgtYml0LiBUaGlzIG1lYW5zIHRoYXQgYW55IHN0cmluZ3MKLSAgLy8gc3RvcmVkIGluc2lkZSBzdWNoIGEgdmVjdG9yLCB3aGVuIGFjY2Vzc2VkIHRocnUgdGhlIG9sZCBBUEkgdGhhdCByZXR1cm5zCi0gIC8vIGEgU3RyaW5nIHJlZmVyZW5jZSwgd2lsbCBhcHBlYXIgdG8gYmUgdHJ1bmNhdGVkIGlmIHRoZSBzdHJpbmcgc3RvcmVkIGlzCi0gIC8vIGFjdHVhbGx5ID49MjU2IGJ5dGVzLgotICBzdGQ6OnN0cmluZyB0ZXN0X2RhdGEoMzAwLCAnQScpOwotICBhdXRvIHN0YXJ0ID0gc2xiLlN0YXJ0VmVjdG9yKCk7Ci0gIC8vIFRoaXMgb25lIHdpbGwgaGF2ZSBhIDE2LWJpdCBzaXplIGZpZWxkLgotICBzbGIuU3RyaW5nKHRlc3RfZGF0YSk7Ci0gIC8vIFRoaXMgb25lIHdpbGwgaGF2ZSBhbiA4LWJpdCBzaXplIGZpZWxkLgotICBzbGIuU3RyaW5nKCJoZWxsbyIpOwotICAvLyBXZSdyZSBhc2tpbmcgdGhpcyB0byBiZSBzZXJpYWxpemVkIGFzIGEgdHlwZWQgdmVjdG9yICh0cnVlKSwgYnV0IG5vdAotICAvLyBmaXhlZCBzaXplIChmYWxzZSkuIFRoZSB0eXBlIHdpbGwgYmUgRkJUX1ZFQ1RPUl9TVFJJTkcgd2l0aCBhIGJpdC13aWR0aAotICAvLyBvZiB3aGF0ZXZlciB0aGUgb2Zmc2V0cyBpbiB0aGUgdmVjdG9yIG5lZWQsIHRoZSBiaXQtd2lkdGhzIG9mIHRoZSBzdHJpbmdzCi0gIC8vIGFyZSBub3Qgc3RvcmVkKCEpIDwtIHRoZSBhY3R1YWwgZGVzaWduIGZsYXcuCi0gIC8vIE5vdGUgdGhhdCBldmVuIGluIHRoZSBmaXhlZCBjb2RlLCB3ZSBjb250aW51ZSB0byBzZXJpYWxpemUgdGhlIGVsZW1lbnRzIG9mCi0gIC8vIEZCVF9WRUNUT1JfU1RSSU5HIGFzIEZCVF9TVFJJTkcsIHNpbmNlIHRoZXJlIG1heSBiZSBvbGQgY29kZSBvdXQgdGhlcmUKLSAgLy8gcmVhZGluZyBuZXcgZGF0YSB0aGF0IHdlIHdhbnQgdG8gY29udGludWUgdG8gZnVuY3Rpb24uCi0gIC8vIFRodXMsIEZCVF9WRUNUT1JfU1RSSU5HLCB3aGlsZSBkZXByZWNhdGVkLCB3aWxsIGFsd2F5cyBiZSByZXByZXNlbnRlZCB0aGUKLSAgLy8gc2FtZSB3YXksIHRoZSBmaXggbGllcyBvbiB0aGUgcmVhZGluZyBzaWRlLgotICBzbGIuRW5kVmVjdG9yKHN0YXJ0LCB0cnVlLCBmYWxzZSk7Ci0gIHNsYi5GaW5pc2goKTsKLSAgLy8gVmVyaWZ5IGJlY2F1c2Ugd2h5IG5vdC4KLSAgVEVTVF9FUShmbGV4YnVmZmVyczo6VmVyaWZ5QnVmZmVyKHNsYi5HZXRCdWZmZXIoKS5kYXRhKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbGIuR2V0QnVmZmVyKCkuc2l6ZSgpLCBudWxscHRyKSwKLSAgICAgICAgICB0cnVlKTsKLSAgLy8gU28gbm93IGxldHMgcmVhZCB0aGlzIGRhdGEgYmFjay4KLSAgLy8gRm9yIGV4aXN0aW5nIGRhdGEsIHNpbmNlIHdlIGhhdmUgbm8gd2F5IG9mIGtub3dpbmcgd2hhdCB0aGUgYWN0dWFsCi0gIC8vIGJpdC13aWR0aCBvZiB0aGUgc2l6ZSBmaWVsZCBvZiB0aGUgc3RyaW5nIGlzLCB3ZSBhcmUgZ29pbmcgdG8gaWdub3JlIHRoaXMKLSAgLy8gZmllbGQsIGFuZCBpbnN0ZWFkIHRyZWF0IHRoZXNlIHN0cmluZ3MgYXMgRkJUX0tFWSAobnVsbC10ZXJtaW5hdGVkKSwgc28gd2UKLSAgLy8gY2FuIGRlYWwgd2l0aCBzdHJpbmdzIG9mIGFyYml0cmFyeSBsZW5ndGguIFRoaXMgb2YgY291cnNlIHRydW5jYXRlcyBzdHJpbmdzCi0gIC8vIHdpdGggZW1iZWRkZWQgbnVsbHMsIGJ1dCB3ZSB0aGluayB0aGF0IHRoYXQgaXMgcHJlZmVycmFibGUgb3ZlciB0cnVuY2F0aW5nCi0gIC8vIHN0cmluZ3MgPj0gMjU2IGJ5dGVzLgotICBhdXRvIHZlYyA9IGZsZXhidWZmZXJzOjpHZXRSb290KHNsYi5HZXRCdWZmZXIoKSkuQXNUeXBlZFZlY3RvcigpOwotICAvLyBFdmVuIHRob3VnaCB0aGlzIHdhcyBzZXJpYWxpemVkIGFzIEZCVF9WRUNUT1JfU1RSSU5HLCBpdCBpcyByZWFkIGFzCi0gIC8vIEZCVF9WRUNUT1JfS0VZOgotICBURVNUX0VRKHZlYy5FbGVtZW50VHlwZSgpLCBmbGV4YnVmZmVyczo6RkJUX0tFWSk7Ci0gIC8vIEFjY2VzcyB0aGUgbG9uZyBzdHJpbmcuIFByZXZpb3VzbHksIHRoaXMgd291bGQgcmV0dXJuIGEgc3RyaW5nIG9mIHNpemUgMSwKLSAgLy8gc2luY2UgaXQgd291bGQgcmVhZCB0aGUgaGlnaC1ieXRlIG9mIHRoZSAxNi1iaXQgbGVuZ3RoLgotICAvLyBUaGlzIHNob3VsZCBub3cgY29ycmVjdGx5IHRlc3QgdGhlIGZ1bGwgMzAwIGJ5dGVzLCB1c2luZyBBc0tleSgpOgotICBURVNUX0VRX1NUUih2ZWNbMF0uQXNLZXkoKSwgdGVzdF9kYXRhLmNfc3RyKCkpOwotICAvLyBPbGQgY29kZSB0aGF0IGNhbGxlZCBBc1N0cmluZyB3aWxsIGNvbnRpbnVlIHRvIHdvcmssIGFzIHRoZSBTdHJpbmcKLSAgLy8gYWNjZXNzb3Igb2JqZWN0cyBub3cgdXNlIGEgY2FjaGVkIHNpemUgdGhhdCBjYW4gY29tZSBmcm9tIGEga2V5IGFzIHdlbGwuCi0gIFRFU1RfRVFfU1RSKHZlY1swXS5Bc1N0cmluZygpLmNfc3RyKCksIHRlc3RfZGF0YS5jX3N0cigpKTsKLSAgLy8gU2hvcnQgc3RyaW5ncyB3b3JrIGFzIGJlZm9yZToKLSAgVEVTVF9FUV9TVFIodmVjWzFdLkFzS2V5KCksICJoZWxsbyIpOwotICBURVNUX0VRX1NUUih2ZWNbMV0uQXNTdHJpbmcoKS5jX3N0cigpLCAiaGVsbG8iKTsKLSAgLy8gU28sIHdoaWxlIGV4aXN0aW5nIGNvZGUgYW5kIGRhdGEgbW9zdGx5ICJqdXN0IHdvcmsiIHdpdGggdGhlIGZpeGVzIGFwcGxpZWQKLSAgLy8gdG8gQXNUeXBlZFZlY3RvciBhbmQgQXNTdHJpbmcsIHdoYXQgZG8geW91IGRvIGdvaW5nIGZvcndhcmQ/Ci0gIC8vIENvZGUgYWNjZXNzaW5nIGV4aXN0aW5nIGRhdGEgZG9lc24ndCBuZWNlc3NhcmlseSBuZWVkIHRvIGNoYW5nZSwgdGhvdWdoCi0gIC8vIHlvdSBjb3VsZCBjb25zaWRlciB1c2luZyBBc0tleSBpbnN0ZWFkIG9mIEFzU3RyaW5nIGZvciBhKSBkb2N1bWVudGluZwotICAvLyB0aGF0IHlvdSBhcmUgYWNjZXNzaW5nIGtleXMsIG9yIGIpIGEgc3BlZWR1cCBpZiB5b3UgZG9uJ3QgYWN0dWFsbHkgdXNlCi0gIC8vIHRoZSBzdHJpbmcgc2l6ZS4KLSAgLy8gRm9yIG5ldyBkYXRhLCBvciBkYXRhIHRoYXQgZG9lc24ndCBuZWVkIHRvIGJlIGJhY2t3YXJkcyBjb21wYXRpYmxlLAotICAvLyBpbnN0ZWFkIHNlcmlhbGl6ZSBhcyBGQlRfVkVDVE9SIChjYWxsIEVuZFZlY3RvciB3aXRoIHR5cGVkID0gZmFsc2UsIHRoZW4KLSAgLy8gcmVhZCBlbGVtZW50cyB3aXRoIEFzU3RyaW5nKSwgb3IsIGZvciBtYXhpbXVtIGNvbXBhY3RuZXNzLCB1c2UKLSAgLy8gRkJUX1ZFQ1RPUl9LRVkgKGNhbGwgc2xiLktleSBhYm92ZSBpbnN0ZWFkLCByZWFkIHdpdGggQXNLZXkgb3IgQXNTdHJpbmcpLgotfQotCi12b2lkIFR5cGVBbGlhc2VzVGVzdCgpIHsKLSAgZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyIGJ1aWxkZXI7Ci0KLSAgYnVpbGRlci5GaW5pc2goQ3JlYXRlVHlwZUFsaWFzZXMoCi0gICAgICBidWlsZGVyLCBmbGF0YnVmZmVyczo6bnVtZXJpY19saW1pdHM8aW50OF90Pjo6bWluKCksCi0gICAgICBmbGF0YnVmZmVyczo6bnVtZXJpY19saW1pdHM8dWludDhfdD46Om1heCgpLAotICAgICAgZmxhdGJ1ZmZlcnM6Om51bWVyaWNfbGltaXRzPGludDE2X3Q+OjptaW4oKSwKLSAgICAgIGZsYXRidWZmZXJzOjpudW1lcmljX2xpbWl0czx1aW50MTZfdD46Om1heCgpLAotICAgICAgZmxhdGJ1ZmZlcnM6Om51bWVyaWNfbGltaXRzPGludDMyX3Q+OjptaW4oKSwKLSAgICAgIGZsYXRidWZmZXJzOjpudW1lcmljX2xpbWl0czx1aW50MzJfdD46Om1heCgpLAotICAgICAgZmxhdGJ1ZmZlcnM6Om51bWVyaWNfbGltaXRzPGludDY0X3Q+OjptaW4oKSwKLSAgICAgIGZsYXRidWZmZXJzOjpudW1lcmljX2xpbWl0czx1aW50NjRfdD46Om1heCgpLCAyLjNmLCAyLjMpKTsKLQotICBhdXRvIHAgPSBidWlsZGVyLkdldEJ1ZmZlclBvaW50ZXIoKTsKLSAgYXV0byB0YSA9IGZsYXRidWZmZXJzOjpHZXRSb290PFR5cGVBbGlhc2VzPihwKTsKLQotICBURVNUX0VRKHRhLT5pOCgpLCBmbGF0YnVmZmVyczo6bnVtZXJpY19saW1pdHM8aW50OF90Pjo6bWluKCkpOwotICBURVNUX0VRKHRhLT51OCgpLCBmbGF0YnVmZmVyczo6bnVtZXJpY19saW1pdHM8dWludDhfdD46Om1heCgpKTsKLSAgVEVTVF9FUSh0YS0+aTE2KCksIGZsYXRidWZmZXJzOjpudW1lcmljX2xpbWl0czxpbnQxNl90Pjo6bWluKCkpOwotICBURVNUX0VRKHRhLT51MTYoKSwgZmxhdGJ1ZmZlcnM6Om51bWVyaWNfbGltaXRzPHVpbnQxNl90Pjo6bWF4KCkpOwotICBURVNUX0VRKHRhLT5pMzIoKSwgZmxhdGJ1ZmZlcnM6Om51bWVyaWNfbGltaXRzPGludDMyX3Q+OjptaW4oKSk7Ci0gIFRFU1RfRVEodGEtPnUzMigpLCBmbGF0YnVmZmVyczo6bnVtZXJpY19saW1pdHM8dWludDMyX3Q+OjptYXgoKSk7Ci0gIFRFU1RfRVEodGEtPmk2NCgpLCBmbGF0YnVmZmVyczo6bnVtZXJpY19saW1pdHM8aW50NjRfdD46Om1pbigpKTsKLSAgVEVTVF9FUSh0YS0+dTY0KCksIGZsYXRidWZmZXJzOjpudW1lcmljX2xpbWl0czx1aW50NjRfdD46Om1heCgpKTsKLSAgVEVTVF9FUSh0YS0+ZjMyKCksIDIuM2YpOwotICBURVNUX0VRKHRhLT5mNjQoKSwgMi4zKTsKLSAgdXNpbmcgbmFtZXNwYWNlIGZsYXRidWZmZXJzOyAgLy8gaXNfc2FtZQotICBzdGF0aWNfYXNzZXJ0KGlzX3NhbWU8ZGVjbHR5cGUodGEtPmk4KCkpLCBpbnQ4X3Q+Ojp2YWx1ZSwgImludmFsaWQgdHlwZSIpOwotICBzdGF0aWNfYXNzZXJ0KGlzX3NhbWU8ZGVjbHR5cGUodGEtPmkxNigpKSwgaW50MTZfdD46OnZhbHVlLCAiaW52YWxpZCB0eXBlIik7Ci0gIHN0YXRpY19hc3NlcnQoaXNfc2FtZTxkZWNsdHlwZSh0YS0+aTMyKCkpLCBpbnQzMl90Pjo6dmFsdWUsICJpbnZhbGlkIHR5cGUiKTsKLSAgc3RhdGljX2Fzc2VydChpc19zYW1lPGRlY2x0eXBlKHRhLT5pNjQoKSksIGludDY0X3Q+Ojp2YWx1ZSwgImludmFsaWQgdHlwZSIpOwotICBzdGF0aWNfYXNzZXJ0KGlzX3NhbWU8ZGVjbHR5cGUodGEtPnU4KCkpLCB1aW50OF90Pjo6dmFsdWUsICJpbnZhbGlkIHR5cGUiKTsKLSAgc3RhdGljX2Fzc2VydChpc19zYW1lPGRlY2x0eXBlKHRhLT51MTYoKSksIHVpbnQxNl90Pjo6dmFsdWUsICJpbnZhbGlkIHR5cGUiKTsKLSAgc3RhdGljX2Fzc2VydChpc19zYW1lPGRlY2x0eXBlKHRhLT51MzIoKSksIHVpbnQzMl90Pjo6dmFsdWUsICJpbnZhbGlkIHR5cGUiKTsKLSAgc3RhdGljX2Fzc2VydChpc19zYW1lPGRlY2x0eXBlKHRhLT51NjQoKSksIHVpbnQ2NF90Pjo6dmFsdWUsICJpbnZhbGlkIHR5cGUiKTsKLSAgc3RhdGljX2Fzc2VydChpc19zYW1lPGRlY2x0eXBlKHRhLT5mMzIoKSksIGZsb2F0Pjo6dmFsdWUsICJpbnZhbGlkIHR5cGUiKTsKLSAgc3RhdGljX2Fzc2VydChpc19zYW1lPGRlY2x0eXBlKHRhLT5mNjQoKSksIGRvdWJsZT46OnZhbHVlLCAiaW52YWxpZCB0eXBlIik7Ci19Ci0KIHZvaWQgRW5kaWFuU3dhcFRlc3QoKSB7CiAgIFRFU1RfRVEoZmxhdGJ1ZmZlcnM6OkVuZGlhblN3YXAoc3RhdGljX2Nhc3Q8aW50MTZfdD4oMHgxMjM0KSksIDB4MzQxMik7CiAgIFRFU1RfRVEoZmxhdGJ1ZmZlcnM6OkVuZGlhblN3YXAoc3RhdGljX2Nhc3Q8aW50MzJfdD4oMHgxMjM0NTY3OCkpLApAQCAtMzQ1NSwxNyArNDY0LDQ3IEBACiAgIGIudGVzdC50eXBlID0gQW55X01vbnN0ZXI7CiAgIFRFU1RfRVEoYiA9PSBhLCBmYWxzZSk7CiAgIFRFU1RfRVEoYiAhPSBhLCB0cnVlKTsKLX0KIAotLy8gRm9yIHRlc3RpbmcgYW55IGJpbmFyaWVzLCBlLmcuIGZyb20gZnV6emluZy4KLXZvaWQgTG9hZFZlcmlmeUJpbmFyeVRlc3QoKSB7Ci0gIHN0ZDo6c3RyaW5nIGJpbmFyeTsKLSAgaWYgKGZsYXRidWZmZXJzOjpMb2FkRmlsZSgKLSAgICAgICAgICAodGVzdF9kYXRhX3BhdGggKyAiZnV6emVyL3lvdXItZmlsZW5hbWUtaGVyZSIpLmNfc3RyKCksIHRydWUsCi0gICAgICAgICAgJmJpbmFyeSkpIHsKLSAgICBmbGF0YnVmZmVyczo6VmVyaWZpZXIgdmVyaWZpZXIoCi0gICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCAqPihiaW5hcnkuZGF0YSgpKSwgYmluYXJ5LnNpemUoKSk7Ci0gICAgVEVTVF9FUShWZXJpZnlNb25zdGVyQnVmZmVyKHZlcmlmaWVyKSwgdHJ1ZSk7CisgIC8vIFRlc3QgdGhhdCB2ZWN0b3Igb2YgdGFibGVzIGFyZSBjb21wYXJlZCBieSB2YWx1ZSBhbmQgbm90IGJ5IHJlZmVyZW5jZS4KKyAgeworICAgIC8vIFR3byB0YWJsZXMgYXJlIGVxdWFsIGJ5IGRlZmF1bHQuCisgICAgTW9uc3RlclQgYSwgYjsKKyAgICBURVNUX0VRKGEgPT0gYiwgdHJ1ZSk7CisKKyAgICAvLyBBZGRpbmcgb25seSBhIHRhYmxlIHRvIG9uZSBvZiB0aGUgbW9uc3RlciB2ZWN0b3JzIHNob3VsZCBtYWtlIGl0IG5vdAorICAgIC8vIGVxdWFsIChkdWUgdG8gc2l6ZSBtaXN0bWF0Y2gpLgorICAgIGEudGVzdGFycmF5b2Z0YWJsZXMucHVzaF9iYWNrKAorICAgICAgICBmbGF0YnVmZmVyczo6dW5pcXVlX3B0cjxNb25zdGVyVD4obmV3IE1vbnN0ZXJUKSk7CisgICAgVEVTVF9FUShhID09IGIsIGZhbHNlKTsKKworICAgIC8vIEFkZGluZyBhbiBlcXVhbGl2YW50IHRhYmxlIHRvIHRoZSBvdGhlciBtb25zdGVyIHZlY3RvciBzaG91bGQgbWFrZSBpdAorICAgIC8vIGVxdWFsIGFnYWluLgorICAgIGIudGVzdGFycmF5b2Z0YWJsZXMucHVzaF9iYWNrKAorICAgICAgICBmbGF0YnVmZmVyczo6dW5pcXVlX3B0cjxNb25zdGVyVD4obmV3IE1vbnN0ZXJUKSk7CisgICAgVEVTVF9FUShhID09IGIsIHRydWUpOworCisgICAgLy8gQ3JlYXRlIHR3byBuZXcgbW9uc3RlcnMgdGhhdCBhcmUgZGlmZmVyZW50LgorICAgIGF1dG8gYyA9IGZsYXRidWZmZXJzOjp1bmlxdWVfcHRyPE1vbnN0ZXJUPihuZXcgTW9uc3RlclQpOworICAgIGF1dG8gZCA9IGZsYXRidWZmZXJzOjp1bmlxdWVfcHRyPE1vbnN0ZXJUPihuZXcgTW9uc3RlclQpOworICAgIGMtPmhwID0gMTsKKyAgICBkLT5ocCA9IDI7CisgICAgVEVTVF9FUShjID09IGQsIGZhbHNlKTsKKworICAgIC8vIEFkZGluZyB0aGVtIHRvIHRoZSBvcmlnaW5hbCBtb25zdGVycyBzaG91bGQgYWxzbyBtYWtlIHRoZW0gZGlmZmVyZW50LgorICAgIGEudGVzdGFycmF5b2Z0YWJsZXMucHVzaF9iYWNrKHN0ZDo6bW92ZShjKSk7CisgICAgYi50ZXN0YXJyYXlvZnRhYmxlcy5wdXNoX2JhY2soc3RkOjptb3ZlKGQpKTsKKyAgICBURVNUX0VRKGEgPT0gYiwgZmFsc2UpOworCisgICAgLy8gUmVtb3ZlIHRoZSBtaXNtYXRjaGluZyBtb25zdGVycyB0byBnZXQgYmFjayB0byBlcXVhbGl0eQorICAgIGEudGVzdGFycmF5b2Z0YWJsZXMucG9wX2JhY2soKTsKKyAgICBiLnRlc3RhcnJheW9mdGFibGVzLnBvcF9iYWNrKCk7CisgICAgVEVTVF9FUShhID09IGIsIHRydWUpOworCisgICAgLy8gQ2hlY2sgdGhhdCBudWxscHRyIGFyZSBPSy4KKyAgICBhLnRlc3RhcnJheW9mdGFibGVzLnB1c2hfYmFjayhudWxscHRyKTsKKyAgICBiLnRlc3RhcnJheW9mdGFibGVzLnB1c2hfYmFjaygKKyAgICAgICAgZmxhdGJ1ZmZlcnM6OnVuaXF1ZV9wdHI8TW9uc3RlclQ+KG5ldyBNb25zdGVyVCkpOworICAgIFRFU1RfRVEoYSA9PSBiLCBmYWxzZSk7CiAgIH0KIH0KIApAQCAtMzUyNiwxNyArNTY1LDE3IEBACiAgIFRFU1RfRVEoKCphWzZdKSA8ICgqYVs1XSksIHRydWUpOwogfQogCi0jaWYgIWRlZmluZWQoRkxBVEJVRkZFUlNfU1BBTl9NSU5JTUFMKQorI2lmICFkZWZpbmVkKEZMQVRCVUZGRVJTX1VTRV9TVERfU1BBTikgJiYgIWRlZmluZWQoRkxBVEJVRkZFUlNfU1BBTl9NSU5JTUFMKQogdm9pZCBGbGF0YnVmZmVyc1NwYW5UZXN0KCkgewogICAvLyBDb21waWxlLXRpbWUgY2hlY2tpbmcgb2Ygbm9uLWNvbnN0IFtdIHRvIGNvbnN0IFtdIGNvbnZlcnNpb25zLgotICB1c2luZyBmbGF0YnVmZmVyczo6aW50ZXJuYWw6OmlzX3NwYW5fY29udmVydGFibGU7Ci0gICh2b2lkKWlzX3NwYW5fY29udmVydGFibGU8aW50LCAxLCBpbnQsIDE+Ojp0eXBlKDEyMyk7Ci0gICh2b2lkKWlzX3NwYW5fY29udmVydGFibGU8Y29uc3QgaW50LCAxLCBpbnQsIDE+Ojp0eXBlKDEyMyk7Ci0gICh2b2lkKWlzX3NwYW5fY29udmVydGFibGU8Y29uc3QgaW50NjRfdCwgMSwgaW50NjRfdCwgMT46OnR5cGUoMTIzKTsKLSAgKHZvaWQpaXNfc3Bhbl9jb252ZXJ0YWJsZTxjb25zdCB1aW50NjRfdCwgMSwgdWludDY0X3QsIDE+Ojp0eXBlKDEyMyk7Ci0gICh2b2lkKWlzX3NwYW5fY29udmVydGFibGU8Y29uc3QgaW50LCAxLCBjb25zdCBpbnQsIDE+Ojp0eXBlKDEyMyk7Ci0gICh2b2lkKWlzX3NwYW5fY29udmVydGFibGU8Y29uc3QgaW50NjRfdCwgMSwgY29uc3QgaW50NjRfdCwgMT46OnR5cGUoMTIzKTsKLSAgKHZvaWQpaXNfc3Bhbl9jb252ZXJ0YWJsZTxjb25zdCB1aW50NjRfdCwgMSwgY29uc3QgdWludDY0X3QsIDE+Ojp0eXBlKDEyMyk7CisgIHVzaW5nIGZsYXRidWZmZXJzOjppbnRlcm5hbDo6aXNfc3Bhbl9jb252ZXJ0aWJsZTsKKyAgKHZvaWQpaXNfc3Bhbl9jb252ZXJ0aWJsZTxpbnQsIDEsIGludCwgMT46OnR5cGUoMTIzKTsKKyAgKHZvaWQpaXNfc3Bhbl9jb252ZXJ0aWJsZTxjb25zdCBpbnQsIDEsIGludCwgMT46OnR5cGUoMTIzKTsKKyAgKHZvaWQpaXNfc3Bhbl9jb252ZXJ0aWJsZTxjb25zdCBpbnQ2NF90LCAxLCBpbnQ2NF90LCAxPjo6dHlwZSgxMjMpOworICAodm9pZClpc19zcGFuX2NvbnZlcnRpYmxlPGNvbnN0IHVpbnQ2NF90LCAxLCB1aW50NjRfdCwgMT46OnR5cGUoMTIzKTsKKyAgKHZvaWQpaXNfc3Bhbl9jb252ZXJ0aWJsZTxjb25zdCBpbnQsIDEsIGNvbnN0IGludCwgMT46OnR5cGUoMTIzKTsKKyAgKHZvaWQpaXNfc3Bhbl9jb252ZXJ0aWJsZTxjb25zdCBpbnQ2NF90LCAxLCBjb25zdCBpbnQ2NF90LCAxPjo6dHlwZSgxMjMpOworICAodm9pZClpc19zcGFuX2NvbnZlcnRpYmxlPGNvbnN0IHVpbnQ2NF90LCAxLCBjb25zdCB1aW50NjRfdCwgMT46OnR5cGUoMTIzKTsKIAogICB1c2luZyBmbGF0YnVmZmVyczo6c3BhbjsKICAgc3BhbjxjaGFyLCAwPiBjMTsKQEAgLTM4MDMsMTggKzg0MiwxOSBAQAogCiAvLyBWUzEwIGRvZXMgbm90IHN1cHBvcnQgdHlwZWQgZW51bXMsIGV4Y2x1ZGUgZnJvbSB0ZXN0cwogI2lmICFkZWZpbmVkKF9NU0NfVkVSKSB8fCBfTVNDX1ZFUiA+PSAxNzAwCi12b2lkIEZpeGVkTGVuZ3RoQXJyYXlKc29uVGVzdChib29sIGJpbmFyeSkgewordm9pZCBGaXhlZExlbmd0aEFycmF5SnNvblRlc3QoY29uc3Qgc3RkOjpzdHJpbmcgJnRlc3RzX2RhdGFfcGF0aCwgYm9vbCBiaW5hcnkpIHsKICAgLy8gbG9hZCBGbGF0QnVmZmVyIHNjaGVtYSAoLmZicykgYW5kIEpTT04gZnJvbSBkaXNrCiAgIHN0ZDo6c3RyaW5nIHNjaGVtYWZpbGU7CiAgIHN0ZDo6c3RyaW5nIGpzb25maWxlOwotICBURVNUX0VRKAotICAgICAgZmxhdGJ1ZmZlcnM6OkxvYWRGaWxlKAotICAgICAgICAgICh0ZXN0X2RhdGFfcGF0aCArICJhcnJheXNfdGVzdC4iICsgKGJpbmFyeSA/ICJiZmJzIiA6ICJmYnMiKSkuY19zdHIoKSwKLSAgICAgICAgICBiaW5hcnksICZzY2hlbWFmaWxlKSwKLSAgICAgIHRydWUpOwotICBURVNUX0VRKGZsYXRidWZmZXJzOjpMb2FkRmlsZSgodGVzdF9kYXRhX3BhdGggKyAiYXJyYXlzX3Rlc3QuZ29sZGVuIikuY19zdHIoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UsICZqc29uZmlsZSksCisgIFRFU1RfRVEoZmxhdGJ1ZmZlcnM6OkxvYWRGaWxlKAorICAgICAgICAgICAgICAodGVzdHNfZGF0YV9wYXRoICsgImFycmF5c190ZXN0LiIgKyAoYmluYXJ5ID8gImJmYnMiIDogImZicyIpKQorICAgICAgICAgICAgICAgICAgLmNfc3RyKCksCisgICAgICAgICAgICAgIGJpbmFyeSwgJnNjaGVtYWZpbGUpLAogICAgICAgICAgIHRydWUpOworICBURVNUX0VRKAorICAgICAgZmxhdGJ1ZmZlcnM6OkxvYWRGaWxlKCh0ZXN0c19kYXRhX3BhdGggKyAiYXJyYXlzX3Rlc3QuZ29sZGVuIikuY19zdHIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSwgJmpzb25maWxlKSwKKyAgICAgIHRydWUpOwogCiAgIC8vIHBhcnNlIHNjaGVtYSBmaXJzdCwgc28gd2UgY2FuIHVzZSBpdCB0byBwYXJzZSB0aGUgZGF0YSBhZnRlcgogICBmbGF0YnVmZmVyczo6UGFyc2VyIHBhcnNlck9yZywgcGFyc2VyR2VuOwpAQCAtMzgyMywxMSArODYzLDEzIEBACiAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCAqPihzY2hlbWFmaWxlLmNfc3RyKCkpLAogICAgICAgICBzY2hlbWFmaWxlLnNpemUoKSk7CiAgICAgVEVTVF9FUShyZWZsZWN0aW9uOjpWZXJpZnlTY2hlbWFCdWZmZXIodmVyaWZpZXIpLCB0cnVlKTsKLSAgICBURVNUX0VRKHBhcnNlck9yZy5EZXNlcmlhbGl6ZSgoY29uc3QgdWludDhfdCAqKXNjaGVtYWZpbGUuY19zdHIoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2hlbWFmaWxlLnNpemUoKSksCisgICAgVEVTVF9FUShwYXJzZXJPcmcuRGVzZXJpYWxpemUoCisgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90ICo+KHNjaGVtYWZpbGUuY19zdHIoKSksCisgICAgICAgICAgICAgICAgc2NoZW1hZmlsZS5zaXplKCkpLAogICAgICAgICAgICAgdHJ1ZSk7Ci0gICAgVEVTVF9FUShwYXJzZXJHZW4uRGVzZXJpYWxpemUoKGNvbnN0IHVpbnQ4X3QgKilzY2hlbWFmaWxlLmNfc3RyKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NoZW1hZmlsZS5zaXplKCkpLAorICAgIFRFU1RfRVEocGFyc2VyR2VuLkRlc2VyaWFsaXplKAorICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCAqPihzY2hlbWFmaWxlLmNfc3RyKCkpLAorICAgICAgICAgICAgICAgIHNjaGVtYWZpbGUuc2l6ZSgpKSwKICAgICAgICAgICAgIHRydWUpOwogICB9IGVsc2UgewogICAgIFRFU1RfRVEocGFyc2VyT3JnLlBhcnNlKHNjaGVtYWZpbGUuY19zdHIoKSksIHRydWUpOwpAQCAtMzg2MiwxNiArOTA0LDE3IEBACiAgICAgICAgICAgMCk7CiB9CiAKLXZvaWQgRml4ZWRMZW5ndGhBcnJheVNwYW5UZXN0KCkgewordm9pZCBGaXhlZExlbmd0aEFycmF5U3BhblRlc3QoY29uc3Qgc3RkOjpzdHJpbmcgJnRlc3RzX2RhdGFfcGF0aCkgewogICAvLyBsb2FkIEZsYXRCdWZmZXIgc2NoZW1hICguZmJzKSBhbmQgSlNPTiBmcm9tIGRpc2sKICAgc3RkOjpzdHJpbmcgc2NoZW1hZmlsZTsKICAgc3RkOjpzdHJpbmcganNvbmZpbGU7Ci0gIFRFU1RfRVEoZmxhdGJ1ZmZlcnM6OkxvYWRGaWxlKCh0ZXN0X2RhdGFfcGF0aCArICJhcnJheXNfdGVzdC5mYnMiKS5jX3N0cigpLAorICBURVNUX0VRKGZsYXRidWZmZXJzOjpMb2FkRmlsZSgodGVzdHNfZGF0YV9wYXRoICsgImFycmF5c190ZXN0LmZicyIpLmNfc3RyKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlLCAmc2NoZW1hZmlsZSksCiAgICAgICAgICAgdHJ1ZSk7Ci0gIFRFU1RfRVEoZmxhdGJ1ZmZlcnM6OkxvYWRGaWxlKCh0ZXN0X2RhdGFfcGF0aCArICJhcnJheXNfdGVzdC5nb2xkZW4iKS5jX3N0cigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSwgJmpzb25maWxlKSwKLSAgICAgICAgICB0cnVlKTsKKyAgVEVTVF9FUSgKKyAgICAgIGZsYXRidWZmZXJzOjpMb2FkRmlsZSgodGVzdHNfZGF0YV9wYXRoICsgImFycmF5c190ZXN0LmdvbGRlbiIpLmNfc3RyKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UsICZqc29uZmlsZSksCisgICAgICB0cnVlKTsKIAogICAvLyBwYXJzZSBzY2hlbWEgZmlyc3QsIHNvIHdlIGNhbiB1c2UgaXQgdG8gcGFyc2UgdGhlIGRhdGEgYWZ0ZXIKICAgZmxhdGJ1ZmZlcnM6OlBhcnNlciBwYXJzZXI7CkBAIC0zOTExLDExICs5NTQsMTEgQEAKICAgICBURVNUX0VRKDIsIG11dGFibGVfZF9jLnNpemUoKSk7CiAgICAgVEVTVF9FUShNeUdhbWU6OkV4YW1wbGU6OlRlc3RFbnVtOjpDLCBjb25zdF9kX2NbMF0pOwogICAgIFRFU1RfRVEoTXlHYW1lOjpFeGFtcGxlOjpUZXN0RW51bTo6QiwgY29uc3RfZF9jWzFdKTsKLSAgICBURVNUX0FTU0VSVChtdXRhYmxlX2RfYy5lbmQoKSA9PSBzdGQ6OmNvcHkoY29uc3RfZF9jLmNiZWdpbigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdF9kX2MuY2VuZCgpLAorICAgIFRFU1RfQVNTRVJUKG11dGFibGVfZF9jLmVuZCgpID09IHN0ZDo6Y29weShjb25zdF9kX2MuYmVnaW4oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3RfZF9jLmVuZCgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdXRhYmxlX2RfYy5iZWdpbigpKSk7CiAgICAgVEVTVF9BU1NFUlQoCi0gICAgICAgIHN0ZDo6ZXF1YWwoY29uc3RfZF9jLmNiZWdpbigpLCBjb25zdF9kX2MuY2VuZCgpLCBtdXRhYmxlX2RfYy5jYmVnaW4oKSkpOworICAgICAgICBzdGQ6OmVxdWFsKGNvbnN0X2RfYy5iZWdpbigpLCBjb25zdF9kX2MuZW5kKCksIG11dGFibGVfZF9jLmJlZ2luKCkpKTsKICAgfQogICAvLyB0ZXN0IGxpdHRsZSBlbmRpYW4gYXJyYXkgb2YgaW50MzIKICMgIGlmIEZMQVRCVUZGRVJTX0xJVFRMRUVORElBTgpAQCAtMzkyNywxMSArOTcwLDExIEBACiAgICAgVEVTVF9FUSgyLCBtdXRhYmxlX2RfYS5zaXplKCkpOwogICAgIFRFU1RfRVEoLTEsIGNvbnN0X2RfYVswXSk7CiAgICAgVEVTVF9FUSgyLCBjb25zdF9kX2FbMV0pOwotICAgIFRFU1RfQVNTRVJUKG11dGFibGVfZF9hLmVuZCgpID09IHN0ZDo6Y29weShjb25zdF9kX2EuY2JlZ2luKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0X2RfYS5jZW5kKCksCisgICAgVEVTVF9BU1NFUlQobXV0YWJsZV9kX2EuZW5kKCkgPT0gc3RkOjpjb3B5KGNvbnN0X2RfYS5iZWdpbigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdF9kX2EuZW5kKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG11dGFibGVfZF9hLmJlZ2luKCkpKTsKICAgICBURVNUX0FTU0VSVCgKLSAgICAgICAgc3RkOjplcXVhbChjb25zdF9kX2EuY2JlZ2luKCksIGNvbnN0X2RfYS5jZW5kKCksIG11dGFibGVfZF9hLmNiZWdpbigpKSk7CisgICAgICAgIHN0ZDo6ZXF1YWwoY29uc3RfZF9hLmJlZ2luKCksIGNvbnN0X2RfYS5lbmQoKSwgbXV0YWJsZV9kX2EuYmVnaW4oKSkpOwogICB9CiAjICBlbmRpZgogfQpAQCAtMzk0MCwxMSArOTgzLDExIEBACiB2b2lkIEZpeGVkTGVuZ3RoQXJyYXlTcGFuVGVzdCgpIHt9CiAjZW5kaWYKIAotdm9pZCBUZXN0RW1iZWRkZWRCaW5hcnlTY2hlbWEoKSB7Cit2b2lkIFRlc3RFbWJlZGRlZEJpbmFyeVNjaGVtYShjb25zdCBzdGQ6OnN0cmluZyAmdGVzdHNfZGF0YV9wYXRoKSB7CiAgIC8vIGxvYWQgSlNPTiBmcm9tIGRpc2sKICAgc3RkOjpzdHJpbmcganNvbmZpbGU7CiAgIFRFU1RfRVEoZmxhdGJ1ZmZlcnM6OkxvYWRGaWxlKAotICAgICAgICAgICAgICAodGVzdF9kYXRhX3BhdGggKyAibW9uc3RlcmRhdGFfdGVzdC5nb2xkZW4iKS5jX3N0cigpLCBmYWxzZSwKKyAgICAgICAgICAgICAgKHRlc3RzX2RhdGFfcGF0aCArICJtb25zdGVyZGF0YV90ZXN0LmdvbGRlbiIpLmNfc3RyKCksIGZhbHNlLAogICAgICAgICAgICAgICAmanNvbmZpbGUpLAogICAgICAgICAgIHRydWUpOwogCkBAIC0zOTg4LDE5MiArMTAzMSw5MyBAQAogICAgICAgICAgIDApOwogfQogCi12b2lkIFN0cmluZ1ZlY3RvckRlZmF1bHRzVGVzdCgpIHsKLSAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IHNjaGVtYXM7Ci0gIHNjaGVtYXMucHVzaF9iYWNrKCJ0YWJsZSBNb25zdGVyIHsgbWFuYTogc3RyaW5nID0gXCJcIjsgfSIpOwotICBzY2hlbWFzLnB1c2hfYmFjaygidGFibGUgTW9uc3RlciB7IG1hbmE6IHN0cmluZyA9IFwibXlzdHJcIjsgfSIpOwotICBzY2hlbWFzLnB1c2hfYmFjaygidGFibGUgTW9uc3RlciB7IG1hbmE6IHN0cmluZyA9IFwiICBcIjsgfSIpOwotICBzY2hlbWFzLnB1c2hfYmFjaygidGFibGUgTW9uc3RlciB7IG1hbmE6IHN0cmluZyA9IFwibnVsbFwiOyB9Iik7Ci0gIHNjaGVtYXMucHVzaF9iYWNrKCJ0YWJsZSBNb25zdGVyIHsgbWFuYTogW2ludF0gPSBbXTsgfSIpOwotICBzY2hlbWFzLnB1c2hfYmFjaygidGFibGUgTW9uc3RlciB7IG1hbmE6IFt1aW50XSA9IFsgIF07IH0iKTsKLSAgc2NoZW1hcy5wdXNoX2JhY2soInRhYmxlIE1vbnN0ZXIgeyBtYW5hOiBbYnl0ZV0gPSBbXHRcdFxuXTsgfSIpOwotICBzY2hlbWFzLnB1c2hfYmFjaygiZW51bSBFOmludHt9dGFibGUgTW9uc3RlcnttYW5hOltFXT1bXTt9Iik7Ci0gIGZvciAoYXV0byBzID0gc2NoZW1hcy5iZWdpbigpOyBzIDwgc2NoZW1hcy5lbmQoKTsgcysrKSB7Ci0gICAgZmxhdGJ1ZmZlcnM6OlBhcnNlciBwYXJzZXI7Ci0gICAgVEVTVF9BU1NFUlQocGFyc2VyLlBhcnNlKHMtPmNfc3RyKCkpKTsKLSAgICBjb25zdCBhdXRvICptYW5hID0gcGFyc2VyLnN0cnVjdHNfLkxvb2t1cCgiTW9uc3RlciIpLT5maWVsZHMuTG9va3VwKCJtYW5hIik7Ci0gICAgVEVTVF9FUShtYW5hLT5Jc0RlZmF1bHQoKSwgdHJ1ZSk7Ci0gIH0KLX0KK3ZvaWQgTmVzdGVkVmVyaWZpZXJUZXN0KCkgeworICAvLyBDcmVhdGUgYSBuZXN0ZWQgbW9uc3Rlci4KKyAgZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyIG5lc3RlZF9idWlsZGVyOworICBGaW5pc2hNb25zdGVyQnVmZmVyKAorICAgICAgbmVzdGVkX2J1aWxkZXIsCisgICAgICBDcmVhdGVNb25zdGVyKG5lc3RlZF9idWlsZGVyLCBudWxscHRyLCAwLCAwLAorICAgICAgICAgICAgICAgICAgICBuZXN0ZWRfYnVpbGRlci5DcmVhdGVTdHJpbmcoIk5lc3RlZE1vbnN0ZXIiKSkpOwogCi12b2lkIE9wdGlvbmFsU2NhbGFyc1Rlc3QoKSB7Ci0gIC8vIFNpbXBsZSBzY2hlbWFzIGFuZCBhICJoYXMgb3B0aW9uYWwgc2NhbGFyIiBzZW50aW5hbC4KLSAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IHNjaGVtYXM7Ci0gIHNjaGVtYXMucHVzaF9iYWNrKCJ0YWJsZSBNb25zdGVyIHsgbWFuYSA6IGludDsgfSIpOwotICBzY2hlbWFzLnB1c2hfYmFjaygidGFibGUgTW9uc3RlciB7IG1hbmEgOiBpbnQgPSA0MjsgfSIpOwotICBzY2hlbWFzLnB1c2hfYmFjaygidGFibGUgTW9uc3RlciB7IG1hbmEgOiBpbnQgPSAgbnVsbDsgfSIpOwotICBzY2hlbWFzLnB1c2hfYmFjaygidGFibGUgTW9uc3RlciB7IG1hbmEgOiBsb25nOyB9Iik7Ci0gIHNjaGVtYXMucHVzaF9iYWNrKCJ0YWJsZSBNb25zdGVyIHsgbWFuYSA6IGxvbmcgPSA0MjsgfSIpOwotICBzY2hlbWFzLnB1c2hfYmFjaygidGFibGUgTW9uc3RlciB7IG1hbmEgOiBsb25nID0gbnVsbDsgfSIpOwotICBzY2hlbWFzLnB1c2hfYmFjaygidGFibGUgTW9uc3RlciB7IG1hbmEgOiBmbG9hdDsgfSIpOwotICBzY2hlbWFzLnB1c2hfYmFjaygidGFibGUgTW9uc3RlciB7IG1hbmEgOiBmbG9hdCA9IDQyOyB9Iik7Ci0gIHNjaGVtYXMucHVzaF9iYWNrKCJ0YWJsZSBNb25zdGVyIHsgbWFuYSA6IGZsb2F0ID0gbnVsbDsgfSIpOwotICBzY2hlbWFzLnB1c2hfYmFjaygidGFibGUgTW9uc3RlciB7IG1hbmEgOiBkb3VibGU7IH0iKTsKLSAgc2NoZW1hcy5wdXNoX2JhY2soInRhYmxlIE1vbnN0ZXIgeyBtYW5hIDogZG91YmxlID0gNDI7IH0iKTsKLSAgc2NoZW1hcy5wdXNoX2JhY2soInRhYmxlIE1vbnN0ZXIgeyBtYW5hIDogZG91YmxlID0gbnVsbDsgfSIpOwotICBzY2hlbWFzLnB1c2hfYmFjaygidGFibGUgTW9uc3RlciB7IG1hbmEgOiBib29sOyB9Iik7Ci0gIHNjaGVtYXMucHVzaF9iYWNrKCJ0YWJsZSBNb25zdGVyIHsgbWFuYSA6IGJvb2wgPSA0MjsgfSIpOwotICBzY2hlbWFzLnB1c2hfYmFjaygidGFibGUgTW9uc3RlciB7IG1hbmEgOiBib29sID0gbnVsbDsgfSIpOwotICBzY2hlbWFzLnB1c2hfYmFjaygKLSAgICAgICJlbnVtIEVudW06IGludCB7QT0wLCBCPTF9ICIKLSAgICAgICJ0YWJsZSBNb25zdGVyIHsgbWFuYSA6IEVudW07IH0iKTsKLSAgc2NoZW1hcy5wdXNoX2JhY2soCi0gICAgICAiZW51bSBFbnVtOiBpbnQge0E9MCwgQj0xfSAiCi0gICAgICAidGFibGUgTW9uc3RlciB7IG1hbmEgOiBFbnVtID0gQjsgfSIpOwotICBzY2hlbWFzLnB1c2hfYmFjaygKLSAgICAgICJlbnVtIEVudW06IGludCB7QT0wLCBCPTF9ICIKLSAgICAgICJ0YWJsZSBNb25zdGVyIHsgbWFuYSA6IEVudW0gPSBudWxsOyB9Iik7CisgIC8vIFZlcmlmeSB0aGUgbmVzdGVkIG1vbnN0ZXIKKyAgZmxhdGJ1ZmZlcnM6OlZlcmlmaWVyIHZlcmlmaWVyKG5lc3RlZF9idWlsZGVyLkdldEJ1ZmZlclBvaW50ZXIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5lc3RlZF9idWlsZGVyLkdldFNpemUoKSk7CisgIFRFU1RfRVEodHJ1ZSwgVmVyaWZ5TW9uc3RlckJ1ZmZlcih2ZXJpZmllcikpOwogCi0gIC8vIENoZWNrIHRoZSBGaWVsZERlZiBpcyBjb3JyZWN0bHkgc2V0LgotICBmb3IgKGF1dG8gc2NoZW1hID0gc2NoZW1hcy5iZWdpbigpOyBzY2hlbWEgPCBzY2hlbWFzLmVuZCgpOyBzY2hlbWErKykgewotICAgIGNvbnN0IGJvb2wgaGFzX251bGwgPSBzY2hlbWEtPmZpbmQoIm51bGwiKSAhPSBzdGQ6OnN0cmluZzo6bnBvczsKLSAgICBmbGF0YnVmZmVyczo6UGFyc2VyIHBhcnNlcjsKLSAgICBURVNUX0FTU0VSVChwYXJzZXIuUGFyc2Uoc2NoZW1hLT5jX3N0cigpKSk7Ci0gICAgY29uc3QgYXV0byAqbWFuYSA9IHBhcnNlci5zdHJ1Y3RzXy5Mb29rdXAoIk1vbnN0ZXIiKS0+ZmllbGRzLkxvb2t1cCgibWFuYSIpOwotICAgIFRFU1RfRVEobWFuYS0+SXNPcHRpb25hbCgpLCBoYXNfbnVsbCk7Ci0gIH0KLQotICAvLyBUZXN0IGlmIG51bGxhYmxlIHNjYWxhcnMgYXJlIGFsbG93ZWQgZm9yIGVhY2ggbGFuZ3VhZ2UuCi0gIGZvciAodW5zaWduZWQgbGFuZyA9IDE7IGxhbmcgPCBmbGF0YnVmZmVyczo6SURMT3B0aW9uczo6a01BWDsgbGFuZyA8PD0gMSkgewotICAgIGZsYXRidWZmZXJzOjpJRExPcHRpb25zIG9wdHM7Ci0gICAgb3B0cy5sYW5nX3RvX2dlbmVyYXRlID0gbGFuZzsKLSAgICBpZiAoZmFsc2UgPT0gZmxhdGJ1ZmZlcnM6OlBhcnNlcjo6U3VwcG9ydHNPcHRpb25hbFNjYWxhcnMob3B0cykpIHsKLSAgICAgIGNvbnRpbnVlOwotICAgIH0KLSAgICBmb3IgKGF1dG8gc2NoZW1hID0gc2NoZW1hcy5iZWdpbigpOyBzY2hlbWEgPCBzY2hlbWFzLmVuZCgpOyBzY2hlbWErKykgewotICAgICAgZmxhdGJ1ZmZlcnM6OlBhcnNlciBwYXJzZXIob3B0cyk7Ci0gICAgICBhdXRvIGRvbmUgPSBwYXJzZXIuUGFyc2Uoc2NoZW1hLT5jX3N0cigpKTsKLSAgICAgIFRFU1RfRVFfU1RSKHBhcnNlci5lcnJvcl8uY19zdHIoKSwgIiIpOwotICAgICAgVEVTVF9BU1NFUlQoZG9uZSk7Ci0gICAgfQotICB9Ci0KLSAgLy8gdGVzdCBDKysgbnVsbGFibGUKLSAgZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyIGZiYjsKLSAgRmluaXNoU2NhbGFyU3R1ZmZCdWZmZXIoCi0gICAgICBmYmIsIG9wdGlvbmFsX3NjYWxhcnM6OkNyZWF0ZVNjYWxhclN0dWZmKGZiYiwgMSwgc3RhdGljX2Nhc3Q8aW50OF90PigyKSkpOwotICBhdXRvIG9wdHMgPSBvcHRpb25hbF9zY2FsYXJzOjpHZXRNdXRhYmxlU2NhbGFyU3R1ZmYoZmJiLkdldEJ1ZmZlclBvaW50ZXIoKSk7Ci0gIFRFU1RfQVNTRVJUKCFvcHRzLT5tYXliZV9ib29sKCkpOwotICBURVNUX0FTU0VSVCghb3B0cy0+bWF5YmVfZjMyKCkuaGFzX3ZhbHVlKCkpOwotICBURVNUX0FTU0VSVChvcHRzLT5tYXliZV9pOCgpLmhhc192YWx1ZSgpKTsKLSAgVEVTVF9FUShvcHRzLT5tYXliZV9pOCgpLnZhbHVlKCksIDIpOwotICBURVNUX0FTU0VSVChvcHRzLT5tdXRhdGVfbWF5YmVfaTgoMykpOwotICBURVNUX0FTU0VSVChvcHRzLT5tYXliZV9pOCgpLmhhc192YWx1ZSgpKTsKLSAgVEVTVF9FUShvcHRzLT5tYXliZV9pOCgpLnZhbHVlKCksIDMpOwotICBURVNUX0FTU0VSVCghb3B0cy0+bXV0YXRlX21heWJlX2kxNigtMTApKTsKLQotICBvcHRpb25hbF9zY2FsYXJzOjpTY2FsYXJTdHVmZlQgb2JqOwotICBURVNUX0FTU0VSVCghb2JqLm1heWJlX2Jvb2wpOwotICBURVNUX0FTU0VSVCghb2JqLm1heWJlX2YzMi5oYXNfdmFsdWUoKSk7Ci0gIG9wdHMtPlVuUGFja1RvKCZvYmopOwotICBURVNUX0FTU0VSVCghb2JqLm1heWJlX2Jvb2wpOwotICBURVNUX0FTU0VSVCghb2JqLm1heWJlX2YzMi5oYXNfdmFsdWUoKSk7Ci0gIFRFU1RfQVNTRVJUKG9iai5tYXliZV9pOC5oYXNfdmFsdWUoKSAmJiBvYmoubWF5YmVfaTgudmFsdWUoKSA9PSAzKTsKLSAgVEVTVF9BU1NFUlQob2JqLm1heWJlX2k4ICYmICpvYmoubWF5YmVfaTggPT0gMyk7Ci0gIG9iai5tYXliZV9pMzIgPSAtMTsKLSAgb2JqLm1heWJlX2VudW0gPSBvcHRpb25hbF9zY2FsYXJzOjpPcHRpb25hbEJ5dGVfVHdvOwotCi0gIGZiYi5DbGVhcigpOwotICBGaW5pc2hTY2FsYXJTdHVmZkJ1ZmZlcihmYmIsIG9wdGlvbmFsX3NjYWxhcnM6OlNjYWxhclN0dWZmOjpQYWNrKGZiYiwgJm9iaikpOwotICBvcHRzID0gb3B0aW9uYWxfc2NhbGFyczo6R2V0TXV0YWJsZVNjYWxhclN0dWZmKGZiYi5HZXRCdWZmZXJQb2ludGVyKCkpOwotICBURVNUX0FTU0VSVChvcHRzLT5tYXliZV9pOCgpLmhhc192YWx1ZSgpKTsKLSAgVEVTVF9FUShvcHRzLT5tYXliZV9pOCgpLnZhbHVlKCksIDMpOwotICBURVNUX0FTU0VSVChvcHRzLT5tYXliZV9pMzIoKS5oYXNfdmFsdWUoKSk7Ci0gIFRFU1RfRVEob3B0cy0+bWF5YmVfaTMyKCkudmFsdWUoKSwgLTEpOwotICBURVNUX0VRKG9wdHMtPm1heWJlX2VudW0oKS52YWx1ZSgpLCBvcHRpb25hbF9zY2FsYXJzOjpPcHRpb25hbEJ5dGVfVHdvKTsKLSAgVEVTVF9BU1NFUlQob3B0cy0+bWF5YmVfaTMyKCkgPT0gZmxhdGJ1ZmZlcnM6Ok9wdGlvbmFsPGludDY0X3Q+KC0xKSk7Ci19Ci0KLXZvaWQgUGFyc2VGbGV4YnVmZmVyc0Zyb21Kc29uV2l0aE51bGxUZXN0KCkgewotICAvLyBUZXN0IG51bGxzIGFyZSBoYW5kbGVkIGFwcHJvcHJpYXRlbHkgdGhyb3VnaCBmbGV4YnVmZmVycyB0byBleGVyY2lzZSBvdGhlcgotICAvLyBjb2RlIHBhdGhzIG9mIFBhcnNlU2luZ2xlVmFsdWUgaW4gdGhlIG9wdGlvbmFsIHNjYWxhcnMgY2hhbmdlLgotICAvLyBUT0RPKGNuZW8pOiBKc29uIC0+IEZsYXRidWZmZXJzIHRlc3Qgb25jZSBzb21lIGxhbmd1YWdlIGNhbiBnZW5lcmF0ZSBjb2RlCi0gIC8vIHdpdGggb3B0aW9uYWwgc2NhbGFycy4KICAgewotICAgIGNoYXIganNvbltdID0gIntcIm9wdF9maWVsZFwiOiAxMjMgfSI7Ci0gICAgZmxhdGJ1ZmZlcnM6OlBhcnNlciBwYXJzZXI7Ci0gICAgZmxleGJ1ZmZlcnM6OkJ1aWxkZXIgZmxleGJ1aWxkOwotICAgIHBhcnNlci5QYXJzZUZsZXhCdWZmZXIoanNvbiwgbnVsbHB0ciwgJmZsZXhidWlsZCk7Ci0gICAgYXV0byByb290ID0gZmxleGJ1ZmZlcnM6OkdldFJvb3QoZmxleGJ1aWxkLkdldEJ1ZmZlcigpKTsKLSAgICBURVNUX0VRKHJvb3QuQXNNYXAoKVsib3B0X2ZpZWxkIl0uQXNJbnQ2NCgpLCAxMjMpOworICAgIC8vIENyZWF0ZSB0aGUgb3V0ZXIgbW9uc3Rlci4KKyAgICBmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgYnVpbGRlcjsKKworICAgIC8vIEFkZCB0aGUgbmVzdGVkIG1vbnN0ZXIgYXMgYSB2ZWN0b3Igb2YgYnl0ZXMuCisgICAgYXV0byBuZXN0ZWRfbW9uc3Rlcl9ieXRlcyA9IGJ1aWxkZXIuQ3JlYXRlVmVjdG9yKAorICAgICAgICBuZXN0ZWRfYnVpbGRlci5HZXRCdWZmZXJQb2ludGVyKCksIG5lc3RlZF9idWlsZGVyLkdldFNpemUoKSk7CisKKyAgICBhdXRvIG5hbWUgPSBidWlsZGVyLkNyZWF0ZVN0cmluZygiT3V0ZXJNb25zdGVyIik7CisKKyAgICBNb25zdGVyQnVpbGRlciBtb25fYnVpbGRlcihidWlsZGVyKTsKKyAgICBtb25fYnVpbGRlci5hZGRfbmFtZShuYW1lKTsKKyAgICBtb25fYnVpbGRlci5hZGRfdGVzdG5lc3RlZGZsYXRidWZmZXIobmVzdGVkX21vbnN0ZXJfYnl0ZXMpOworICAgIEZpbmlzaE1vbnN0ZXJCdWZmZXIoYnVpbGRlciwgbW9uX2J1aWxkZXIuRmluaXNoKCkpOworCisgICAgLy8gVmVyaWZ5IHRoZSByb290IG1vbnN0ZXIsIHdoaWNoIGluY2x1ZGVzIHZlcmlmaW5nIHRoZSBuZXN0ZWQgbW9uc3RlcgorICAgIGZsYXRidWZmZXJzOjpWZXJpZmllciB2ZXJpZmllcihidWlsZGVyLkdldEJ1ZmZlclBvaW50ZXIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVpbGRlci5HZXRTaXplKCkpOworICAgIFRFU1RfRVEodHJ1ZSwgVmVyaWZ5TW9uc3RlckJ1ZmZlcih2ZXJpZmllcikpOwogICB9CisKICAgewotICAgIGNoYXIganNvbltdID0gIntcIm9wdF9maWVsZFwiOiAxMjMuNCB9IjsKLSAgICBmbGF0YnVmZmVyczo6UGFyc2VyIHBhcnNlcjsKLSAgICBmbGV4YnVmZmVyczo6QnVpbGRlciBmbGV4YnVpbGQ7Ci0gICAgcGFyc2VyLlBhcnNlRmxleEJ1ZmZlcihqc29uLCBudWxscHRyLCAmZmxleGJ1aWxkKTsKLSAgICBhdXRvIHJvb3QgPSBmbGV4YnVmZmVyczo6R2V0Um9vdChmbGV4YnVpbGQuR2V0QnVmZmVyKCkpOwotICAgIFRFU1RfRVEocm9vdC5Bc01hcCgpWyJvcHRfZmllbGQiXS5Bc0RvdWJsZSgpLCAxMjMuNCk7CisgICAgLy8gQ3JlYXRlIHRoZSBvdXRlciBtb25zdGVyLgorICAgIGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciBidWlsZGVyOworCisgICAgLy8gUHVycG9zZWx5IGludmFsaWRhdGUgdGhlIG5lc3RlZCBmbGF0YnVmZmVyIHNldHRpbmcgaXRzIGxlbmd0aCB0byAxLCBhbgorICAgIC8vIGludmFsaWQgbGVuZ3RoLgorICAgIHVpbnQ4X3QgaW52YWxpZF9uZXN0ZWRfYnVmZmVyWzFdOworICAgIGF1dG8gbmVzdGVkX21vbnN0ZXJfYnl0ZXMgPSBidWlsZGVyLkNyZWF0ZVZlY3RvcihpbnZhbGlkX25lc3RlZF9idWZmZXIsIDEpOworCisgICAgYXV0byBuYW1lID0gYnVpbGRlci5DcmVhdGVTdHJpbmcoIk91dGVyTW9uc3RlciIpOworCisgICAgTW9uc3RlckJ1aWxkZXIgbW9uX2J1aWxkZXIoYnVpbGRlcik7CisgICAgbW9uX2J1aWxkZXIuYWRkX25hbWUobmFtZSk7CisgICAgbW9uX2J1aWxkZXIuYWRkX3Rlc3RuZXN0ZWRmbGF0YnVmZmVyKG5lc3RlZF9tb25zdGVyX2J5dGVzKTsKKyAgICBGaW5pc2hNb25zdGVyQnVmZmVyKGJ1aWxkZXIsIG1vbl9idWlsZGVyLkZpbmlzaCgpKTsKKworICAgIC8vIFZlcmlmeSB0aGUgcm9vdCBtb25zdGVyIGZhaWxzLCBzaW5jZSB0aGUgaW5jbHVkZWQgbmVzdGVkIG1vbnN0ZXIgZmFpbHMuCisgICAgZmxhdGJ1ZmZlcnM6OlZlcmlmaWVyIHZlcmlmaWVyKGJ1aWxkZXIuR2V0QnVmZmVyUG9pbnRlcigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWlsZGVyLkdldFNpemUoKSk7CisgICAgVEVTVF9FUShmYWxzZSwgVmVyaWZ5TW9uc3RlckJ1ZmZlcih2ZXJpZmllcikpOworCisgICAgLy8gVmVyaWZ5IHRoZSByb290IG1vbnN0ZXIgc3VjY2VlZHMsIHNpbmNlIHdlJ3ZlIGRpc2FibGVkIGNoZWNraW5nIG5lc3RlZAorICAgIC8vIGZsYXRidWZmZXJzCisgICAgZmxhdGJ1ZmZlcnM6OlZlcmlmaWVyOjpPcHRpb25zIG9wdGlvbnM7CisgICAgb3B0aW9ucy5jaGVja19uZXN0ZWRfZmxhdGJ1ZmZlcnMgPSBmYWxzZTsKKyAgICBmbGF0YnVmZmVyczo6VmVyaWZpZXIgbm9fY2hlY2tfbmVzdGVkKGJ1aWxkZXIuR2V0QnVmZmVyUG9pbnRlcigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVpbGRlci5HZXRTaXplKCksIG9wdGlvbnMpOworICAgIFRFU1RfRVEodHJ1ZSwgVmVyaWZ5TW9uc3RlckJ1ZmZlcihub19jaGVja19uZXN0ZWQpKTsKICAgfQorCiAgIHsKLSAgICBjaGFyIGpzb25bXSA9ICJ7XCJvcHRfZmllbGRcIjogbnVsbCB9IjsKLSAgICBmbGF0YnVmZmVyczo6UGFyc2VyIHBhcnNlcjsKLSAgICBmbGV4YnVmZmVyczo6QnVpbGRlciBmbGV4YnVpbGQ7Ci0gICAgcGFyc2VyLlBhcnNlRmxleEJ1ZmZlcihqc29uLCBudWxscHRyLCAmZmxleGJ1aWxkKTsKLSAgICBhdXRvIHJvb3QgPSBmbGV4YnVmZmVyczo6R2V0Um9vdChmbGV4YnVpbGQuR2V0QnVmZmVyKCkpOwotICAgIFRFU1RfQVNTRVJUKCFyb290LkFzTWFwKCkuSXNUaGVFbXB0eU1hcCgpKTsKLSAgICBURVNUX0FTU0VSVChyb290LkFzTWFwKClbIm9wdF9maWVsZCJdLklzTnVsbCgpKTsKLSAgICBURVNUX0VRKHJvb3QuVG9TdHJpbmcoKSwgc3RkOjpzdHJpbmcoInsgb3B0X2ZpZWxkOiBudWxsIH0iKSk7CisgICAgLy8gQ3JlYXRlIHRoZSBvdXRlciBtb25zdGVyLgorICAgIGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciBidWlsZGVyOworCisgICAgLy8gUHVycG9zZWx5IGludmFsaWRhdGUgdGhlIG5lc3RlZCBmbGF0YnVmZmVyIHNldHRpbmcgaXRzIGxlbmd0aCB0byAwLCBhbgorICAgIC8vIGludmFsaWQgbGVuZ3RoLgorICAgIHVpbnQ4X3QgKmludmFsaWRfbmVzdGVkX2J1ZmZlciA9IG51bGxwdHI7CisgICAgYXV0byBuZXN0ZWRfbW9uc3Rlcl9ieXRlcyA9IGJ1aWxkZXIuQ3JlYXRlVmVjdG9yKGludmFsaWRfbmVzdGVkX2J1ZmZlciwgMCk7CisKKyAgICBhdXRvIG5hbWUgPSBidWlsZGVyLkNyZWF0ZVN0cmluZygiT3V0ZXJNb25zdGVyIik7CisKKyAgICBNb25zdGVyQnVpbGRlciBtb25fYnVpbGRlcihidWlsZGVyKTsKKyAgICBtb25fYnVpbGRlci5hZGRfbmFtZShuYW1lKTsKKyAgICBtb25fYnVpbGRlci5hZGRfdGVzdG5lc3RlZGZsYXRidWZmZXIobmVzdGVkX21vbnN0ZXJfYnl0ZXMpOworICAgIEZpbmlzaE1vbnN0ZXJCdWZmZXIoYnVpbGRlciwgbW9uX2J1aWxkZXIuRmluaXNoKCkpOworCisgICAgLy8gVmVyaWZ5IHRoZSByb290IG1vbnN0ZXIgZmFpbHMsIHNpbmNlIHRoZSBpbmNsdWRlZCBuZXN0ZWQgbW9uc3RlciBmYWlscy4KKyAgICBmbGF0YnVmZmVyczo6VmVyaWZpZXIgdmVyaWZpZXIoYnVpbGRlci5HZXRCdWZmZXJQb2ludGVyKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIuR2V0U2l6ZSgpKTsKKyAgICBURVNUX0VRKGZhbHNlLCBWZXJpZnlNb25zdGVyQnVmZmVyKHZlcmlmaWVyKSk7CiAgIH0KIH0KIAotdm9pZCBGaWVsZElkZW50aWZpZXJUZXN0KCkgewotICB1c2luZyBmbGF0YnVmZmVyczo6UGFyc2VyOwotICBURVNUX0VRKHRydWUsIFBhcnNlcigpLlBhcnNlKCJ0YWJsZSBUeyBmOiBpbnQgKGlkOjApOyB9IikpOwotICAvLyBub24taW50ZWdlciBgaWRgIHNob3VsZCBiZSByZWplY3RlZAotICBURVNUX0VRKGZhbHNlLCBQYXJzZXIoKS5QYXJzZSgidGFibGUgVHsgZjogaW50IChpZDp0ZXh0KTsgfSIpKTsKLSAgVEVTVF9FUShmYWxzZSwgUGFyc2VyKCkuUGFyc2UoInRhYmxlIFR7IGY6IGludCAoaWQ6XCJ0ZXh0XCIpOyB9IikpOwotICBURVNUX0VRKGZhbHNlLCBQYXJzZXIoKS5QYXJzZSgidGFibGUgVHsgZjogaW50IChpZDowdGV4dCk7IH0iKSk7Ci0gIFRFU1RfRVEoZmFsc2UsIFBhcnNlcigpLlBhcnNlKCJ0YWJsZSBUeyBmOiBpbnQgKGlkOjEuMCk7IH0iKSk7Ci0gIFRFU1RfRVEoZmFsc2UsIFBhcnNlcigpLlBhcnNlKCJ0YWJsZSBUeyBmOiBpbnQgKGlkOi0xKTsgZzogaW50IChpZDowKTsgfSIpKTsKLSAgVEVTVF9FUShmYWxzZSwgUGFyc2VyKCkuUGFyc2UoInRhYmxlIFR7IGY6IGludCAoaWQ6MTI5NDk2NzI2KTsgfSIpKTsKLSAgLy8gQSB1bnVpb24gZmlsZWQgb2NjdXB5cyB0d28gaWRzOiBlbnVtZXJhdG9yICsgcG9pbnRlciAob2Zmc2V0KS4KLSAgVEVTVF9FUShmYWxzZSwKLSAgICAgICAgICBQYXJzZXIoKS5QYXJzZSgidW5pb24gWHt9IHRhYmxlIFR7IHU6IFgoaWQ6MCk7IHRhYmxlIEZ7eDppbnQ7XG59IikpOwotICAvLyBQb3NpdGl2ZSB0ZXN0cyBmb3IgdW5pb25zCi0gIFRFU1RfRVEodHJ1ZSwgUGFyc2VyKCkuUGFyc2UoInVuaW9uIFh7fSB0YWJsZSBUeyB1OiBYIChpZDoxKTsgfSIpKTsKLSAgVEVTVF9FUSh0cnVlLCBQYXJzZXIoKS5QYXJzZSgidW5pb24gWHt9IHRhYmxlIFR7IHU6IFg7IH0iKSk7Ci0gIC8vIFRlc3QgdXNpbmcgJ2luZicgYW5kICduYW4nIHdvcmRzIGJvdGggYXMgaWRlbnRpZmllcnMgYW5kIGFzIGRlZmF1bHQgdmFsdWVzLgotICBURVNUX0VRKHRydWUsIFBhcnNlcigpLlBhcnNlKCJ0YWJsZSBUeyBuYW46IHN0cmluZzsgfSIpKTsKLSAgVEVTVF9FUSh0cnVlLCBQYXJzZXIoKS5QYXJzZSgidGFibGUgVHsgaW5mOiBzdHJpbmc7IH0iKSk7Ci0jaWYgZGVmaW5lZChGTEFUQlVGRkVSU19IQVNfTkVXX1NUUlRPRCkgJiYgKEZMQVRCVUZGRVJTX0hBU19ORVdfU1RSVE9EID4gMCkKLSAgVEVTVF9FUSh0cnVlLCBQYXJzZXIoKS5QYXJzZSgidGFibGUgVHsgaW5mOiBmbG9hdCA9IGluZjsgfSIpKTsKLSAgVEVTVF9FUSh0cnVlLCBQYXJzZXIoKS5QYXJzZSgidGFibGUgVHsgbmFuOiBmbG9hdCA9IGluZjsgfSIpKTsKLSNlbmRpZgotfQotCi12b2lkIFBhcnNlSW5jb3JyZWN0TW9uc3Rlckpzb25UZXN0KCkgewotICBzdGQ6OnN0cmluZyBzY2hlbWFmaWxlOwotICBURVNUX0VRKGZsYXRidWZmZXJzOjpMb2FkRmlsZSgodGVzdF9kYXRhX3BhdGggKyAibW9uc3Rlcl90ZXN0LmJmYnMiKS5jX3N0cigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlLCAmc2NoZW1hZmlsZSksCi0gICAgICAgICAgdHJ1ZSk7Ci0gIGZsYXRidWZmZXJzOjpQYXJzZXIgcGFyc2VyOwotICBmbGF0YnVmZmVyczo6VmVyaWZpZXIgdmVyaWZpZXIoCi0gICAgICByZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QgKj4oc2NoZW1hZmlsZS5jX3N0cigpKSwgc2NoZW1hZmlsZS5zaXplKCkpOwotICBURVNUX0VRKHJlZmxlY3Rpb246OlZlcmlmeVNjaGVtYUJ1ZmZlcih2ZXJpZmllciksIHRydWUpOwotICBURVNUX0VRKHBhcnNlci5EZXNlcmlhbGl6ZSgoY29uc3QgdWludDhfdCAqKXNjaGVtYWZpbGUuY19zdHIoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NoZW1hZmlsZS5zaXplKCkpLAotICAgICAgICAgIHRydWUpOwotICBURVNUX0VRKHBhcnNlci5QYXJzZUpzb24oIntuYW1lOlwibW9uc3RlclwifSIpLCB0cnVlKTsKLSAgVEVTVF9FUShwYXJzZXIuUGFyc2VKc29uKCIiKSwgZmFsc2UpOwotICBURVNUX0VRKHBhcnNlci5QYXJzZUpzb24oIntuYW1lOiAxfSIpLCBmYWxzZSk7Ci0gIFRFU1RfRVEocGFyc2VyLlBhcnNlSnNvbigie25hbWU6KzF9IiksIGZhbHNlKTsKLSAgVEVTVF9FUShwYXJzZXIuUGFyc2VKc29uKCJ7bmFtZTotMX0iKSwgZmFsc2UpOwotICBURVNUX0VRKHBhcnNlci5QYXJzZUpzb24oIntuYW1lOi1mfSIpLCBmYWxzZSk7Ci0gIFRFU1RfRVEocGFyc2VyLlBhcnNlSnNvbigie25hbWU6K2Z9IiksIGZhbHNlKTsKLX0KLQotI2lmICFkZWZpbmVkKF9NU0NfVkVSKSB8fCBfTVNDX1ZFUiA+PSAxNzAwCiB0ZW1wbGF0ZTxjbGFzcyBULCBjbGFzcyBDb250YWluZXI+CiB2b2lkIFRlc3RJdGVyYXRvcnMoY29uc3Qgc3RkOjp2ZWN0b3I8VD4gJmV4cGVjdGVkLCBjb25zdCBDb250YWluZXIgJnRlc3RlZCkgewogICBURVNUX0FTU0VSVCh0ZXN0ZWQucmJlZ2luKCkuYmFzZSgpID09IHRlc3RlZC5lbmQoKSk7CkBAIC00MjMyLDIxICsxMTc2LDIzMiBAQAogICAgIFRlc3RJdGVyYXRvcnMoc3RkOjp2ZWN0b3I8aW50PigxNSwgMCksIGludF8xNSk7CiAgIH0KIH0KLSNlbHNlCi12b2lkIEZsYXRidWZmZXJzSXRlcmF0b3JzVGVzdCgpIHt9Ci0jZW5kaWYKIAotaW50IEZsYXRCdWZmZXJUZXN0cygpIHsKLSAgLy8gY2xhbmctZm9ybWF0IG9mZgordm9pZCBQcml2YXRlQW5ub3RhdGlvbnNMZWFrcygpIHsKKyAgLy8gU2ltcGxlIHNjaGVtYXMgYW5kIGEgImhhcyBvcHRpb25hbCBzY2FsYXIiIHNlbnRpbmFsLgorICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gc2NoZW1hczsKKyAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IGZhaWx1cmVfc2NoZW1hczsKIAorICAvLyAocHJpdmF0ZSkgKHRhYmxlL3N0cnVjdCkKKyAgc2NoZW1hcy5wdXNoX2JhY2soCisgICAgICAidGFibGUgTW9uc3RlciAocHJpdmF0ZSkgeyBtYW5hOiBpbnQ7IH0iCisgICAgICAic3RydWN0IEFCQyAocHJpdmF0ZSkgeyBtYW5hOiBpbnQ7IH0iKTsKKworICAvLyAocHVibGljKSAodGFibGUvc3RydWN0KQorICBzY2hlbWFzLnB1c2hfYmFjaygKKyAgICAgICJ0YWJsZSBNb25zdGVyIHsgbWFuYTogaW50OyB9IgorICAgICAgInN0cnVjdCBBQkMgeyBtYW5hOiBpbnQ7IH0iKTsKKworICAvLyAocHJpdmF0ZSkgKHVuaW9uKSBjb250YWluaW5nIChwcml2YXRlKSAodGFibGUvc3RydWN0KQorICBzY2hlbWFzLnB1c2hfYmFjaygKKyAgICAgICJ0YWJsZSBNb25zdGVyIChwcml2YXRlKSB7IG1hbmE6IGludDsgfSAiCisgICAgICAic3RydWN0IEFCQyAocHJpdmF0ZSkgeyBtYW5hOiBpbnQ7IH0gIgorICAgICAgInVuaW9uIEFueSAocHJpdmF0ZSkgeyBNb25zdGVyLCBBQkMgfSAiKTsKKworICAvLyAocHVibGljKSAodW5pb24pIGNvbnRhaW5pbmcgKHB1YmxpYykgKHRhYmxlL3N0cnVjdCkKKyAgc2NoZW1hcy5wdXNoX2JhY2soCisgICAgICAidGFibGUgTW9uc3RlciB7IG1hbmE6IGludDsgfSIKKyAgICAgICJzdHJ1Y3QgQUJDIHsgbWFuYTogaW50OyB9IgorICAgICAgInVuaW9uIEFueSB7IE1vbnN0ZXIsIEFCQyB9Iik7CisKKyAgLy8gKHByaXZhdGUpICh0YWJsZS9zdHJ1Y3QvZW51bSkKKyAgc2NoZW1hcy5wdXNoX2JhY2soCisgICAgICAidGFibGUgTW9uc3RlciAocHJpdmF0ZSkgeyBtYW5hOiBpbnQ7IH0iCisgICAgICAic3RydWN0IEFCQyAocHJpdmF0ZSkgeyBtYW5hOiBpbnQ7IH0iCisgICAgICAiZW51bSBSYWNlOmJ5dGUgKHByaXZhdGUpIHsgTm9uZSA9IC0xLCBIdW1hbiA9IDAsIH0iKTsKKworICAvLyAocHVibGljKSAodGFibGUvc3RydWN0L2VudW0pCisgIHNjaGVtYXMucHVzaF9iYWNrKAorICAgICAgInRhYmxlIE1vbnN0ZXIgeyBtYW5hOiBpbnQ7IH0iCisgICAgICAic3RydWN0IEFCQyB7IG1hbmE6IGludDsgfSIKKyAgICAgICJlbnVtIFJhY2U6Ynl0ZSB7IE5vbmUgPSAtMSwgSHVtYW4gPSAwLCB9Iik7CisKKyAgLy8gKHByaXZhdGUpICh1bmlvbikgY29udGFpbmluZyAocHJpdmF0ZSkgKHRhYmxlL3N0cnVjdCkKKyAgc2NoZW1hcy5wdXNoX2JhY2soCisgICAgICAidGFibGUgTW9uc3RlciAocHJpdmF0ZSkgeyBtYW5hOiBpbnQ7IH0iCisgICAgICAic3RydWN0IEFCQyAocHJpdmF0ZSkgeyBtYW5hOiBpbnQ7IH0iCisgICAgICAiZW51bSBSYWNlOmJ5dGUgKHByaXZhdGUpIHsgTm9uZSA9IC0xLCBIdW1hbiA9IDAsIH0iCisgICAgICAidW5pb24gQW55IChwcml2YXRlKSB7IE1vbnN0ZXIsIEFCQyB9Iik7CisKKyAgLy8gKHB1YmxpYykgKHVuaW9uKSBjb250YWluaW5nIChwdWJsaWMpICh0YWJsZS9zdHJ1Y3QpCisgIHNjaGVtYXMucHVzaF9iYWNrKAorICAgICAgInRhYmxlIE1vbnN0ZXIgeyBtYW5hOiBpbnQ7IH0iCisgICAgICAic3RydWN0IEFCQyB7IG1hbmE6IGludDsgfSIKKyAgICAgICJlbnVtIFJhY2U6Ynl0ZSB7IE5vbmUgPSAtMSwgSHVtYW4gPSAwLCB9IgorICAgICAgInVuaW9uIEFueSB7IE1vbnN0ZXIsIEFCQyB9Iik7CisKKyAgLy8gKHByaXZhdGUpICh0YWJsZSksIChwdWJsaWMgc3RydWN0KQorICBzY2hlbWFzLnB1c2hfYmFjaygKKyAgICAgICJ0YWJsZSBNb25zdGVyIChwcml2YXRlKSB7IG1hbmE6IGludDsgfSIKKyAgICAgICJzdHJ1Y3QgQUJDIHsgbWFuYTogaW50OyB9Iik7CisKKyAgLy8gKHByaXZhdGUpICh0YWJsZSksIChwdWJsaWMpIChzdHJ1Y3QvZW51bSkKKyAgc2NoZW1hcy5wdXNoX2JhY2soCisgICAgICAidGFibGUgTW9uc3RlciAocHJpdmF0ZSkgeyBtYW5hOiBpbnQ7IH0iCisgICAgICAic3RydWN0IEFCQyB7IG1hbmE6IGludDsgfSIKKyAgICAgICJlbnVtIFJhY2U6Ynl0ZSB7IE5vbmUgPSAtMSwgSHVtYW4gPSAwLCB9Iik7CisKKyAgLy8gKHB1YmxpYykgKHN0cnVjdCkgY29udGFpbmluZyAocHVibGljKSAoZW51bSkKKyAgc2NoZW1hcy5wdXNoX2JhY2soCisgICAgICAiZW51bSBSYWNlOmJ5dGUgeyBOb25lID0gLTEsIEh1bWFuID0gMCwgfSIKKyAgICAgICJ0YWJsZSBNb25zdGVyIHsgbWFuYTogaW50OyB9IgorICAgICAgInN0cnVjdCBBQkMgeyBtYW5hOiBpbnQ7IHR5cGU6IFJhY2U7IH0iKTsKKworICAvLyAocHVibGljKSAodW5pb24pIGNvbnRhaW5pbmcgKHByaXZhdGUpICh0YWJsZSkgJiAocHVibGljKSAoc3RydWN0KQorICBmYWlsdXJlX3NjaGVtYXMucHVzaF9iYWNrKAorICAgICAgInRhYmxlIE1vbnN0ZXIgKHByaXZhdGUpIHsgbWFuYTogaW50OyB9IgorICAgICAgInN0cnVjdCBBQkMgeyBtYW5hOiBpbnQ7IH0iCisgICAgICAidW5pb24gQW55IHsgTW9uc3RlciwgQUJDIH0iKTsKKworICAvLyAocHVibGljKSAodW5pb24pIGNvbnRhaW5pbmcgKHByaXZhdGUpICh0YWJsZS9zdHJ1Y3QpCisgIGZhaWx1cmVfc2NoZW1hcy5wdXNoX2JhY2soCisgICAgICAidGFibGUgTW9uc3RlciAocHJpdmF0ZSkgeyBtYW5hOiBpbnQ7IH0iCisgICAgICAic3RydWN0IEFCQyAocHJpdmF0ZSkgeyBtYW5hOiBpbnQ7IH0iCisgICAgICAiZW51bSBSYWNlOmJ5dGUgeyBOb25lID0gLTEsIEh1bWFuID0gMCwgfSIKKyAgICAgICJ1bmlvbiBBbnkgeyBNb25zdGVyLCBBQkMgfSIpOworCisgIC8vIChwdWJsaWMpICh0YWJsZSkgY29udGFpbmluZyAocHJpdmF0ZSkgKHN0cnVjdCkKKyAgZmFpbHVyZV9zY2hlbWFzLnB1c2hfYmFjaygKKyAgICAgICJ0YWJsZSBNb25zdGVyIHsgbWFuYTogaW50OyBhYjogQUJDOyB9IgorICAgICAgInN0cnVjdCBBQkMgKHByaXZhdGUpIHsgbWFuYTogaW50OyB9Iik7CisKKyAgLy8gKHB1YmxpYykgKHN0cnVjdCkgY29udGFpbmluZyAocHJpdmF0ZSkgKGVudW0pCisgIGZhaWx1cmVfc2NoZW1hcy5wdXNoX2JhY2soCisgICAgICAiZW51bSBSYWNlOmJ5dGUgKHByaXZhdGUpIHsgTm9uZSA9IC0xLCBIdW1hbiA9IDAsIH0iCisgICAgICAidGFibGUgTW9uc3RlciB7IG1hbmE6IGludDsgfSIKKyAgICAgICJzdHJ1Y3QgQUJDIHsgbWFuYTogaW50OyB0eXBlOiBSYWNlOyB9Iik7CisKKyAgZmxhdGJ1ZmZlcnM6OklETE9wdGlvbnMgb3B0czsKKyAgb3B0cy5sYW5nX3RvX2dlbmVyYXRlID0gZmxhdGJ1ZmZlcnM6OklETE9wdGlvbnM6Okxhbmd1YWdlOjprU3dpZnQ7CisgIG9wdHMubm9fbGVha19wcml2YXRlX2Fubm90YXRpb25zID0gdHJ1ZTsKKworICBmb3IgKGF1dG8gc2NoZW1hID0gc2NoZW1hcy5iZWdpbigpOyBzY2hlbWEgPCBzY2hlbWFzLmVuZCgpOyBzY2hlbWErKykgeworICAgIGZsYXRidWZmZXJzOjpQYXJzZXIgcGFyc2VyKG9wdHMpOworICAgIFRFU1RfQVNTRVJUKHBhcnNlci5QYXJzZShzY2hlbWEtPmNfc3RyKCkpKTsKKyAgfQorCisgIGZvciAoYXV0byBzY2hlbWEgPSBmYWlsdXJlX3NjaGVtYXMuYmVnaW4oKTsgc2NoZW1hIDwgZmFpbHVyZV9zY2hlbWFzLmVuZCgpOworICAgICAgIHNjaGVtYSsrKSB7CisgICAgZmxhdGJ1ZmZlcnM6OlBhcnNlciBwYXJzZXIob3B0cyk7CisgICAgVEVTVF9FUShmYWxzZSwgcGFyc2VyLlBhcnNlKHNjaGVtYS0+Y19zdHIoKSkpOworICB9CisKKyAgb3B0cy5ub19sZWFrX3ByaXZhdGVfYW5ub3RhdGlvbnMgPSBmYWxzZTsKKworICBmb3IgKGF1dG8gc2NoZW1hID0gc2NoZW1hcy5iZWdpbigpOyBzY2hlbWEgPCBzY2hlbWFzLmVuZCgpOyBzY2hlbWErKykgeworICAgIGZsYXRidWZmZXJzOjpQYXJzZXIgcGFyc2VyKG9wdHMpOworICAgIFRFU1RfQVNTRVJUKHBhcnNlci5QYXJzZShzY2hlbWEtPmNfc3RyKCkpKTsKKyAgfQorCisgIGZvciAoYXV0byBzY2hlbWEgPSBmYWlsdXJlX3NjaGVtYXMuYmVnaW4oKTsgc2NoZW1hIDwgZmFpbHVyZV9zY2hlbWFzLmVuZCgpOworICAgICAgIHNjaGVtYSsrKSB7CisgICAgZmxhdGJ1ZmZlcnM6OlBhcnNlciBwYXJzZXIob3B0cyk7CisgICAgVEVTVF9BU1NFUlQocGFyc2VyLlBhcnNlKHNjaGVtYS0+Y19zdHIoKSkpOworICB9Cit9CisKK3ZvaWQgVmVjdG9yU3BhblRlc3QoKSB7CisgIGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciBidWlsZGVyOworCisgIGF1dG8gbWxvYyA9IENyZWF0ZU1vbnN0ZXIoCisgICAgICBidWlsZGVyLCBudWxscHRyLCAwLCAwLCBidWlsZGVyLkNyZWF0ZVN0cmluZygiTW9uc3RlciIpLAorICAgICAgYnVpbGRlci5DcmVhdGVWZWN0b3I8dWludDhfdD4oeyAwLCAxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5IH0pKTsKKworICBGaW5pc2hNb25zdGVyQnVmZmVyKGJ1aWxkZXIsIG1sb2MpOworCisgIGF1dG8gbW9uc3RlciA9IEdldE1vbnN0ZXIoYnVpbGRlci5HZXRCdWZmZXJQb2ludGVyKCkpOworICBhdXRvIG11dGFibGVfbW9uc3RlciA9IEdldE11dGFibGVNb25zdGVyKGJ1aWxkZXIuR2V0QnVmZmVyUG9pbnRlcigpKTsKKworICB7ICAvLyB1c2luZyByZWZlcmVuY2VzCisgICAgVEVTVF9OT1ROVUxMKG1vbnN0ZXItPmludmVudG9yeSgpKTsKKworICAgIGZsYXRidWZmZXJzOjpzcGFuPGNvbnN0IHVpbnQ4X3Q+IGNvbnN0X2ludmVudG9yeSA9CisgICAgICAgIGZsYXRidWZmZXJzOjptYWtlX3NwYW4oKm1vbnN0ZXItPmludmVudG9yeSgpKTsKKyAgICBURVNUX0VRKGNvbnN0X2ludmVudG9yeS5zaXplKCksIDEwKTsKKyAgICBURVNUX0VRKGNvbnN0X2ludmVudG9yeVswXSwgMCk7CisgICAgVEVTVF9FUShjb25zdF9pbnZlbnRvcnlbOV0sIDkpOworCisgICAgZmxhdGJ1ZmZlcnM6OnNwYW48dWludDhfdD4gbXV0YWJsZV9pbnZlbnRvcnkgPQorICAgICAgICBmbGF0YnVmZmVyczo6bWFrZV9zcGFuKCptdXRhYmxlX21vbnN0ZXItPm11dGFibGVfaW52ZW50b3J5KCkpOworICAgIFRFU1RfRVEobXV0YWJsZV9pbnZlbnRvcnkuc2l6ZSgpLCAxMCk7CisgICAgVEVTVF9FUShtdXRhYmxlX2ludmVudG9yeVswXSwgMCk7CisgICAgVEVTVF9FUShtdXRhYmxlX2ludmVudG9yeVs5XSwgOSk7CisKKyAgICBtdXRhYmxlX2ludmVudG9yeVswXSA9IDQyOworICAgIFRFU1RfRVEobXV0YWJsZV9pbnZlbnRvcnlbMF0sIDQyKTsKKworICAgIG11dGFibGVfaW52ZW50b3J5WzBdID0gMDsKKyAgICBURVNUX0VRKG11dGFibGVfaW52ZW50b3J5WzBdLCAwKTsKKyAgfQorCisgIHsgIC8vIHVzaW5nIHBvaW50ZXJzCisgICAgVEVTVF9FUShmbGF0YnVmZmVyczo6VmVjdG9yTGVuZ3RoKG1vbnN0ZXItPmludmVudG9yeSgpKSwgMTApOworCisgICAgZmxhdGJ1ZmZlcnM6OnNwYW48Y29uc3QgdWludDhfdD4gY29uc3RfaW52ZW50b3J5ID0KKyAgICAgICAgZmxhdGJ1ZmZlcnM6Om1ha2Vfc3Bhbihtb25zdGVyLT5pbnZlbnRvcnkoKSk7CisgICAgVEVTVF9FUShjb25zdF9pbnZlbnRvcnkuc2l6ZSgpLCAxMCk7CisgICAgVEVTVF9FUShjb25zdF9pbnZlbnRvcnlbMF0sIDApOworICAgIFRFU1RfRVEoY29uc3RfaW52ZW50b3J5WzldLCA5KTsKKworICAgIGZsYXRidWZmZXJzOjpzcGFuPHVpbnQ4X3Q+IG11dGFibGVfaW52ZW50b3J5ID0KKyAgICAgICAgZmxhdGJ1ZmZlcnM6Om1ha2Vfc3BhbihtdXRhYmxlX21vbnN0ZXItPm11dGFibGVfaW52ZW50b3J5KCkpOworICAgIFRFU1RfRVEobXV0YWJsZV9pbnZlbnRvcnkuc2l6ZSgpLCAxMCk7CisgICAgVEVTVF9FUShtdXRhYmxlX2ludmVudG9yeVswXSwgMCk7CisgICAgVEVTVF9FUShtdXRhYmxlX2ludmVudG9yeVs5XSwgOSk7CisKKyAgICBtdXRhYmxlX2ludmVudG9yeVswXSA9IDQyOworICAgIFRFU1RfRVEobXV0YWJsZV9pbnZlbnRvcnlbMF0sIDQyKTsKKworICAgIG11dGFibGVfaW52ZW50b3J5WzBdID0gMDsKKyAgICBURVNUX0VRKG11dGFibGVfaW52ZW50b3J5WzBdLCAwKTsKKyAgfQorCisgIHsKKyAgICBURVNUX0FTU0VSVChudWxscHRyID09IG1vbnN0ZXItPnRlc3RuZXN0ZWRmbGF0YnVmZmVyKCkpOworCisgICAgVEVTVF9FUShmbGF0YnVmZmVyczo6VmVjdG9yTGVuZ3RoKG1vbnN0ZXItPnRlc3RuZXN0ZWRmbGF0YnVmZmVyKCkpLCAwKTsKKworICAgIGZsYXRidWZmZXJzOjpzcGFuPGNvbnN0IHVpbnQ4X3Q+IGNvbnN0X25lc3RlZCA9CisgICAgICAgIGZsYXRidWZmZXJzOjptYWtlX3NwYW4obW9uc3Rlci0+dGVzdG5lc3RlZGZsYXRidWZmZXIoKSk7CisgICAgVEVTVF9BU1NFUlQoY29uc3RfbmVzdGVkLmVtcHR5KCkpOworCisgICAgZmxhdGJ1ZmZlcnM6OnNwYW48dWludDhfdD4gbXV0YWJsZV9uZXN0ZWQgPQorICAgICAgICBmbGF0YnVmZmVyczo6bWFrZV9zcGFuKG11dGFibGVfbW9uc3Rlci0+bXV0YWJsZV90ZXN0bmVzdGVkZmxhdGJ1ZmZlcigpKTsKKyAgICBURVNUX0FTU0VSVChtdXRhYmxlX25lc3RlZC5lbXB0eSgpKTsKKyAgfQorfQorCit2b2lkIE5hdGl2ZUlubGluZVRhYmxlVmVjdG9yVGVzdCgpIHsKKyAgVGVzdE5hdGl2ZUlubGluZVRhYmxlVCB0ZXN0OworICBmb3IgKGludCBpID0gMDsgaSA8IDEwOyArK2kpIHsKKyAgICBOYXRpdmVJbmxpbmVUYWJsZVQgdDsKKyAgICB0LmEgPSBpOworICAgIHRlc3QudC5wdXNoX2JhY2sodCk7CisgIH0KKworICBmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgZmJiOworICBhdXRvIG9mZnNldCA9IFRlc3ROYXRpdmVJbmxpbmVUYWJsZTo6UGFjayhmYmIsICZ0ZXN0KTsKKyAgZmJiLkZpbmlzaChvZmZzZXQpOworCisgIGF1dG8gKnJvb3QgPQorICAgICAgZmxhdGJ1ZmZlcnM6OkdldFJvb3Q8VGVzdE5hdGl2ZUlubGluZVRhYmxlPihmYmIuR2V0QnVmZmVyUG9pbnRlcigpKTsKKyAgVGVzdE5hdGl2ZUlubGluZVRhYmxlVCB1bnBhY2tlZDsKKyAgcm9vdC0+VW5QYWNrVG8oJnVucGFja2VkKTsKKworICBmb3IgKGludCBpID0gMDsgaSA8IDEwOyArK2kpIHsKKyAgICBURVNUX0FTU0VSVCh1bnBhY2tlZC50W2ldID09IHRlc3QudFtpXSk7CisgIH0KKworICBURVNUX0FTU0VSVCh1bnBhY2tlZC50ID09IHRlc3QudCk7Cit9CisKK2ludCBGbGF0QnVmZmVyVGVzdHMoY29uc3Qgc3RkOjpzdHJpbmcgJnRlc3RzX2RhdGFfcGF0aCkgewogICAvLyBSdW4gb3VyIHZhcmlvdXMgdGVzdCBzdWl0ZXM6CiAKICAgc3RkOjpzdHJpbmcgcmF3YnVmOwogICBhdXRvIGZsYXRidWYxID0gQ3JlYXRlRmxhdEJ1ZmZlclRlc3QocmF3YnVmKTsKICAgYXV0byBmbGF0YnVmID0gc3RkOjptb3ZlKGZsYXRidWYxKTsgIC8vIFRlc3QgbW92ZSBhc3NpZ25tZW50LgogCi0gIFRyaXZpYWxseUNvcHlhYmxlVGVzdCgpOwotCiAgIEFjY2Vzc0ZsYXRCdWZmZXJUZXN0KHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCAqPihyYXdidWYuY19zdHIoKSksCiAgICAgICAgICAgICAgICAgICAgICAgIHJhd2J1Zi5sZW5ndGgoKSk7CiAgIEFjY2Vzc0ZsYXRCdWZmZXJUZXN0KGZsYXRidWYuZGF0YSgpLCBmbGF0YnVmLnNpemUoKSk7CkBAIC00MjU0LDQyICsxNDA5LDQ4IEBACiAgIE11dGF0ZUZsYXRCdWZmZXJzVGVzdChmbGF0YnVmLmRhdGEoKSwgZmxhdGJ1Zi5zaXplKCkpOwogCiAgIE9iamVjdEZsYXRCdWZmZXJzVGVzdChmbGF0YnVmLmRhdGEoKSk7CisgIFVuUGFja1RvKGZsYXRidWYuZGF0YSgpKTsKIAogICBNaW5pUmVmbGVjdEZsYXRCdWZmZXJzVGVzdChmbGF0YnVmLmRhdGEoKSk7CiAgIE1pbmlSZWZsZWN0Rml4ZWRMZW5ndGhBcnJheVRlc3QoKTsKIAogICBTaXplUHJlZml4ZWRUZXN0KCk7CiAKLSAgI2lmbmRlZiBGTEFUQlVGRkVSU19OT19GSUxFX1RFU1RTCi0gICAgI2lmZGVmIEZMQVRCVUZGRVJTX1RFU1RfUEFUSF9QUkVGSVgKLSAgICAgIHRlc3RfZGF0YV9wYXRoID0gRkxBVEJVRkZFUlNfU1RSSU5HKEZMQVRCVUZGRVJTX1RFU1RfUEFUSF9QUkVGSVgpICsKLSAgICAgICAgICAgICAgICAgICAgICAgdGVzdF9kYXRhX3BhdGg7Ci0gICAgI2VuZGlmCi0gICAgUGFyc2VBbmRHZW5lcmF0ZVRleHRUZXN0KGZhbHNlKTsKLSAgICBQYXJzZUFuZEdlbmVyYXRlVGV4dFRlc3QodHJ1ZSk7Ci0gICAgRml4ZWRMZW5ndGhBcnJheUpzb25UZXN0KGZhbHNlKTsKLSAgICBGaXhlZExlbmd0aEFycmF5SnNvblRlc3QodHJ1ZSk7Ci0gICAgUmVmbGVjdGlvblRlc3QoZmxhdGJ1Zi5kYXRhKCksIGZsYXRidWYuc2l6ZSgpKTsKLSAgICBQYXJzZVByb3RvVGVzdCgpOwotICAgIFBhcnNlUHJvdG9UZXN0V2l0aFN1ZmZpeCgpOwotICAgIFBhcnNlUHJvdG9UZXN0V2l0aEluY2x1ZGVzKCk7Ci0gICAgRXZvbHV0aW9uVGVzdCgpOwotICAgIFVuaW9uRGVwcmVjYXRpb25UZXN0KCk7Ci0gICAgVW5pb25WZWN0b3JUZXN0KCk7Ci0gICAgTG9hZFZlcmlmeUJpbmFyeVRlc3QoKTsKLSAgICBHZW5lcmF0ZVRhYmxlVGV4dFRlc3QoKTsKLSAgICBUZXN0RW1iZWRkZWRCaW5hcnlTY2hlbWEoKTsKLSAgI2VuZGlmCi0gIC8vIGNsYW5nLWZvcm1hdCBvbgorI2lmbmRlZiBGTEFUQlVGRkVSU19OT19GSUxFX1RFU1RTCisgIFBhcnNlQW5kR2VuZXJhdGVUZXh0VGVzdCh0ZXN0c19kYXRhX3BhdGgsIGZhbHNlKTsKKyAgUGFyc2VBbmRHZW5lcmF0ZVRleHRUZXN0KHRlc3RzX2RhdGFfcGF0aCwgdHJ1ZSk7CisgIEZpeGVkTGVuZ3RoQXJyYXlKc29uVGVzdCh0ZXN0c19kYXRhX3BhdGgsIGZhbHNlKTsKKyAgRml4ZWRMZW5ndGhBcnJheUpzb25UZXN0KHRlc3RzX2RhdGFfcGF0aCwgdHJ1ZSk7CisgIFJlZmxlY3Rpb25UZXN0KHRlc3RzX2RhdGFfcGF0aCwgZmxhdGJ1Zi5kYXRhKCksIGZsYXRidWYuc2l6ZSgpKTsKKyAgUGFyc2VQcm90b1Rlc3QodGVzdHNfZGF0YV9wYXRoKTsKKyAgUGFyc2VQcm90b1Rlc3RXaXRoU3VmZml4KHRlc3RzX2RhdGFfcGF0aCk7CisgIFBhcnNlUHJvdG9UZXN0V2l0aEluY2x1ZGVzKHRlc3RzX2RhdGFfcGF0aCk7CisgIEV2b2x1dGlvblRlc3QodGVzdHNfZGF0YV9wYXRoKTsKKyAgVW5pb25EZXByZWNhdGlvblRlc3QodGVzdHNfZGF0YV9wYXRoKTsKKyAgVW5pb25WZWN0b3JUZXN0KHRlc3RzX2RhdGFfcGF0aCk7CisgIEdlbmVyYXRlVGFibGVUZXh0VGVzdCh0ZXN0c19kYXRhX3BhdGgpOworICBUZXN0RW1iZWRkZWRCaW5hcnlTY2hlbWEodGVzdHNfZGF0YV9wYXRoKTsKKyAgSnNvbk9wdGlvbmFsVGVzdCh0ZXN0c19kYXRhX3BhdGgsIGZhbHNlKTsKKyAgSnNvbk9wdGlvbmFsVGVzdCh0ZXN0c19kYXRhX3BhdGgsIHRydWUpOworICBNdWx0aUZpbGVOYW1lQ2xhc2hUZXN0KHRlc3RzX2RhdGFfcGF0aCk7CisgIEludmFsaWROZXN0ZWRGbGF0YnVmZmVyVGVzdCh0ZXN0c19kYXRhX3BhdGgpOworICBKc29uRGVmYXVsdFRlc3QodGVzdHNfZGF0YV9wYXRoKTsKKyAgSnNvbkVudW1zVGVzdCh0ZXN0c19kYXRhX3BhdGgpOworICBUZXN0TW9uc3RlckV4dHJhRmxvYXRzKHRlc3RzX2RhdGFfcGF0aCk7CisgIFBhcnNlSW5jb3JyZWN0TW9uc3Rlckpzb25UZXN0KHRlc3RzX2RhdGFfcGF0aCk7CisgIEZpeGVkTGVuZ3RoQXJyYXlTcGFuVGVzdCh0ZXN0c19kYXRhX3BhdGgpOworI2VuZGlmCiAKICAgVXRpbENvbnZlcnRDYXNlKCk7CiAKICAgRnV6elRlc3QxKCk7CiAgIEZ1enpUZXN0MigpOwogCisgIFRyaXZpYWxseUNvcHlhYmxlVGVzdCgpOwogICBFcnJvclRlc3QoKTsKICAgVmFsdWVUZXN0KCk7CiAgIEVudW1WYWx1ZVRlc3QoKTsKKyAgTmVzdGVkTGlzdFRlc3QoKTsKICAgRW51bVN0cmluZ3NUZXN0KCk7CiAgIEVudW1OYW1lc1Rlc3QoKTsKICAgRW51bU91dE9mUmFuZ2VUZXN0KCk7CkBAIC00MzA0LDE2ICsxNDY1LDEzIEBACiAgIFVua25vd25GaWVsZHNUZXN0KCk7CiAgIFBhcnNlVW5pb25UZXN0KCk7CiAgIFZhbGlkU2FtZU5hbWVEaWZmZXJlbnROYW1lc3BhY2VUZXN0KCk7Ci0gIE11bHRpRmlsZU5hbWVDbGFzaFRlc3QoKTsKLSAgSW52YWxpZE5lc3RlZEZsYXRidWZmZXJUZXN0KCk7CiAgIENvbmZvcm1UZXN0KCk7CiAgIFBhcnNlUHJvdG9CdWZBc2NpaVRlc3QoKTsKICAgVHlwZUFsaWFzZXNUZXN0KCk7CiAgIEVuZGlhblN3YXBUZXN0KCk7CiAgIENyZWF0ZVNoYXJlZFN0cmluZ1Rlc3QoKTsKLSAgSnNvbkRlZmF1bHRUZXN0KCk7Ci0gIEpzb25FbnVtc1Rlc3QoKTsKICAgRmxleEJ1ZmZlcnNUZXN0KCk7CisgIEZsZXhCdWZmZXJzUmV1c2VCdWdUZXN0KCk7CiAgIEZsZXhCdWZmZXJzRGVwcmVjYXRlZFRlc3QoKTsKICAgVW5pbml0aWFsaXplZFZlY3RvclRlc3QoKTsKICAgRXF1YWxPcGVyYXRvclRlc3QoKTsKQEAgLTQzMjEsNyArMTQ3OSw2IEBACiAgIElzQXNjaWlVdGlsc1Rlc3QoKTsKICAgVmFsaWRGbG9hdFRlc3QoKTsKICAgSW52YWxpZEZsb2F0VGVzdCgpOwotICBUZXN0TW9uc3RlckV4dHJhRmxvYXRzKCk7CiAgIEZpeGVkTGVuZ3RoQXJyYXlUZXN0KCk7CiAgIE5hdGl2ZVR5cGVUZXN0KCk7CiAgIE9wdGlvbmFsU2NhbGFyc1Rlc3QoKTsKQEAgLTQzMzAsMTYgKzE0ODcsMjggQEAKICAgRml4ZWRMZW5ndGhBcnJheUNvbnN0cnVjdG9yVGVzdCgpOwogICBGaWVsZElkZW50aWZpZXJUZXN0KCk7CiAgIFN0cmluZ1ZlY3RvckRlZmF1bHRzVGVzdCgpOwotICBQYXJzZUluY29ycmVjdE1vbnN0ZXJKc29uVGVzdCgpOwogICBGbGV4QnVmZmVyc0Zsb2F0aW5nUG9pbnRUZXN0KCk7CiAgIEZsYXRidWZmZXJzSXRlcmF0b3JzVGVzdCgpOwotICBGaXhlZExlbmd0aEFycmF5U3BhblRlc3QoKTsKLSAgU3RydWN0VW5pb25UZXN0KCk7CiAgIFdhcm5pbmdzQXNFcnJvcnNUZXN0KCk7CisgIE5lc3RlZFZlcmlmaWVyVGVzdCgpOworICBQcml2YXRlQW5ub3RhdGlvbnNMZWFrcygpOworICBKc29uVW5zb3J0ZWRBcnJheVRlc3QoKTsKKyAgVmVjdG9yU3BhblRlc3QoKTsKKyAgTmF0aXZlSW5saW5lVGFibGVWZWN0b3JUZXN0KCk7CiAgIHJldHVybiAwOwogfQorfSAgLy8gbmFtZXNwYWNlCit9ICAvLyBuYW1lc3BhY2UgdGVzdHMKK30gIC8vIG5hbWVzcGFjZSBmbGF0YnVmZmVycwogCiBpbnQgbWFpbihpbnQgYXJnYywgY29uc3QgY2hhciAqYXJndltdKSB7CisgIHN0ZDo6c3RyaW5nIHRlc3RzX2RhdGFfcGF0aCA9CisjaWZkZWYgQkFaRUxfVEVTVF9EQVRBX1BBVEgKKyAgICAgICIuLi9jb21fZ2l0aHViX2dvb2dsZV9mbGF0YnVmZmVycy90ZXN0cy8iOworI2Vsc2UKKyAgICAgICJ0ZXN0cy8iOworI2VuZGlmCisKICAgZm9yIChpbnQgYXJnaSA9IDE7IGFyZ2kgPCBhcmdjOyBhcmdpKyspIHsKICAgICBzdGQ6OnN0cmluZyBhcmcgPSBhcmd2W2FyZ2ldOwogICAgIGlmIChhcmcgPT0gIi0tdGVzdF9wYXRoIikgewpAQCAtNDM0Nyw3ICsxNTE2LDkgQEAKICAgICAgICAgZnByaW50ZihzdGRlcnIsICJlcnJvcjogbWlzc2luZyBwYXRoIGZvbGxvd2luZzogJXNcbiIsIGFyZy5jX3N0cigpKTsKICAgICAgICAgZXhpdCgxKTsKICAgICAgIH0KLSAgICAgIHRlc3RfZGF0YV9wYXRoID0gYXJndlthcmdpXTsKKyAgICAgIC8vIE92ZXJyaWRlIGRlZmF1bHQgcGF0aCBpZiBwcm92aWRlZCBvbmUuCisgICAgICB0ZXN0c19kYXRhX3BhdGggPSBhcmd2W2FyZ2ldOworCiAgICAgfSBlbHNlIHsKICAgICAgIGZwcmludGYoc3RkZXJyLCAiZXJyb3I6IFVua25vd24gYXJndW1lbnQ6ICVzXG4iLCBhcmcuY19zdHIoKSk7CiAgICAgICBleGl0KDEpOwpAQCAtNDM2OCw3ICsxNTM5LDEyIEBACiAgICAgVEVTVF9PVVRQVVRfTElORSgiVGhlIGdsb2JhbCBDLWxvY2FsZSBjaGFuZ2VkOiAlcyIsIHRoZV9sb2NhbGUuY19zdHIoKSk7CiAgIH0KIAotICBGbGF0QnVmZmVyVGVzdHMoKTsKKyNpZmRlZiBGTEFUQlVGRkVSU19URVNUX1BBVEhfUFJFRklYCisgIHRlc3RzX2RhdGFfcGF0aCA9CisgICAgICBGTEFUQlVGRkVSU19TVFJJTkcoRkxBVEJVRkZFUlNfVEVTVF9QQVRIX1BSRUZJWCkgKyB0ZXN0c19kYXRhX3BhdGg7CisjZW5kaWYKKworICBmbGF0YnVmZmVyczo6dGVzdHM6OkZsYXRCdWZmZXJUZXN0cyh0ZXN0c19kYXRhX3BhdGgpOwogICBGbGF0QnVmZmVyQnVpbGRlclRlc3QoKTsKIAogICBpZiAoIXRlc3RpbmdfZmFpbHMpIHsKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL3Rlc3RfYXNzZXJ0LmNwcCBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL3Rlc3RfYXNzZXJ0LmNwcAppbmRleCBlMmI0M2E3Li4zMmRlY2U5IDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy90ZXN0X2Fzc2VydC5jcHAKKysrIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvdGVzdF9hc3NlcnQuY3BwCkBAIC00MCwxMCArNDAsOCBAQAogICB0ZXN0aW5nX2ZhaWxzID0gMDsKICAgLy8gRGlzYWJsZSBzdGRvdXQgYnVmZmVyaW5nIHRvIHByZXZlbnQgaW5mb3JtYXRpb24gbG9zdCBvbiBhc3NlcnRpb24gb3IgY29yZQogICAvLyBkdW1wLgotICBzZXR2YnVmKHN0ZG91dCwgTlVMTCwgX0lPTkJGLCAwKTsKLSAgc2V0dmJ1ZihzdGRlcnIsIE5VTEwsIF9JT05CRiwgMCk7Ci0KLSAgZmxhdGJ1ZmZlcnM6OlNldHVwRGVmYXVsdENSVFJlcG9ydE1vZGUoKTsKKyAgc2V0dmJ1ZihzdGRvdXQsIG51bGxwdHIsIF9JT05CRiwgMCk7CisgIHNldHZidWYoc3RkZXJyLCBudWxscHRyLCBfSU9OQkYsIDApOwogCiAgIC8vIGNsYW5nLWZvcm1hdCBvZmYKIApkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvdGVzdF9hc3NlcnQuaCBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL3Rlc3RfYXNzZXJ0LmgKaW5kZXggZTYxNDBjYy4uOWQ1Zjc4MCAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvdGVzdF9hc3NlcnQuaAorKysgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy90ZXN0X2Fzc2VydC5oCkBAIC01MSwxMCArNTEsMTAgQEAKIAogLy8gV3JpdGUgY2FwdHVyZWQgc3RhdGUgdG8gYSBsb2cgYW5kIHRlcm1pbmF0ZSB0ZXN0IHJ1bi4KIHZvaWQgVGVzdEZhaWwoY29uc3QgY2hhciAqZXhwdmFsLCBjb25zdCBjaGFyICp2YWwsIGNvbnN0IGNoYXIgKmV4cCwKLSAgICAgICAgICAgICAgY29uc3QgY2hhciAqZmlsZSwgaW50IGxpbmUsIGNvbnN0IGNoYXIgKmZ1bmMgPSAwKTsKKyAgICAgICAgICAgICAgY29uc3QgY2hhciAqZmlsZSwgaW50IGxpbmUsIGNvbnN0IGNoYXIgKmZ1bmMgPSBudWxscHRyKTsKIAogdm9pZCBUZXN0RXFTdHIoY29uc3QgY2hhciAqZXhwdmFsLCBjb25zdCBjaGFyICp2YWwsIGNvbnN0IGNoYXIgKmV4cCwKLSAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmZpbGUsIGludCBsaW5lLCBjb25zdCBjaGFyICpmdW5jID0gMCk7CisgICAgICAgICAgICAgICBjb25zdCBjaGFyICpmaWxlLCBpbnQgbGluZSwgY29uc3QgY2hhciAqZnVuYyA9IG51bGxwdHIpOwogCiAvLyBXb3JrYXJvdW5kIGZvciBgZW51bSBjbGFzc2AgcHJpbnRpbmcuCiAvLyBUaGVyZSBpcyBhbiBpc3N1ZSB3aXRoIHRoZSBwcmludGluZyBvZiBlbnVtcyB3aXRoIGEgZml4ZWQgdW5kZXJseWluZyB0eXBlLgpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvdGVzdF9idWlsZGVyLmNwcCBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL3Rlc3RfYnVpbGRlci5jcHAKaW5kZXggYWU2NzA3Ni4uMDQ3YTM4MCAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvdGVzdF9idWlsZGVyLmNwcAorKysgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy90ZXN0X2J1aWxkZXIuY3BwCkBAIC0xMTcsNiArMTE3LDkgQEAKICAgcmV0dXJuIHZlcmlmeShidWYsIGV4cGVjdGVkX25hbWUsIGNvbG9yKTsKIH0KIAorLy8gZm9yd2FyZC1kZWNsYXJlZCBpbiB0ZXN0LmNwcAordm9pZCBGbGF0QnVmZmVyQnVpbGRlclRlc3QoKTsKKwogdm9pZCBGbGF0QnVmZmVyQnVpbGRlclRlc3QoKSB7CiAgIHVzaW5nIGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlcjsKIApAQCAtMTM4LDUgKzE0MSw4IEBACiAgICAgICBUZXN0U2VsZWN0b3IodGVzdHMsIHRlc3RzICsgNCkpOwogfQogCisvLyBmb3J3YXJkLWRlY2xhcmVkIGluIHRlc3RfYnVpbGRlci5oCit2b2lkIENoZWNrVGVzdEdlbmVyYXRlZElzVmFsaWQoY29uc3QgTXlHYW1lOjpFeGFtcGxlOjpDb2xvciYpOworCiAvLyBMaW5rLXRpbWUgY2hlY2sgdXNpbmcgcG9pbnRlciB0eXBlLgogdm9pZCBDaGVja1Rlc3RHZW5lcmF0ZWRJc1ZhbGlkKGNvbnN0IE15R2FtZTo6RXhhbXBsZTo6Q29sb3IgJikge30KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL3RzL0JVSUxELmJhemVsIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvdHMvQlVJTEQuYmF6ZWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDU0MDExYQotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL3RzL0JVSUxELmJhemVsCkBAIC0wLDAgKzEsMTIgQEAKK2xvYWQoIi8vOnR5cGVzY3JpcHQuYnpsIiwgImZsYXRidWZmZXJfdHNfbGlicmFyeSIpCisKK3BhY2thZ2UoZGVmYXVsdF92aXNpYmlsaXR5ID0gWyIvL3Zpc2liaWxpdHk6cHJpdmF0ZSJdKQorCitmbGF0YnVmZmVyX3RzX2xpYnJhcnkoCisgICAgbmFtZSA9ICJ0eXBlc2NyaXB0X3RzX2ZicyIsCisgICAgc3JjcyA9IFsidHlwZXNjcmlwdF9rZXl3b3Jkcy5mYnMiXSwKKyAgICBkZXBzID0gWworICAgICAgICAiLy90ZXN0cy90cy90ZXN0X2RpcjppbmNsdWRlX3RzX2ZicyIsCisgICAgICAgICIvL3Rlc3RzL3RzL3Rlc3RfZGlyOnR5cGVzY3JpcHRfdHJhbnNpdGl2ZV90c19mYnMiLAorICAgIF0sCispCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9KYXZhU2NyaXB0RmxleEJ1ZmZlcnNUZXN0LmpzIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvdHMvSmF2YVNjcmlwdEZsZXhCdWZmZXJzVGVzdC5qcwpzaW1pbGFyaXR5IGluZGV4IDk4JQpyZW5hbWUgZnJvbSB0aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9KYXZhU2NyaXB0RmxleEJ1ZmZlcnNUZXN0LmpzCnJlbmFtZSB0byB0aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy90cy9KYXZhU2NyaXB0RmxleEJ1ZmZlcnNUZXN0LmpzCmluZGV4IGQyNDYyYzYuLjA0ZTY3MGMgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL0phdmFTY3JpcHRGbGV4QnVmZmVyc1Rlc3QuanMKKysrIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvdHMvSmF2YVNjcmlwdEZsZXhCdWZmZXJzVGVzdC5qcwpAQCAtMSw3ICsxLDcgQEAKIC8vIFJ1biB0aGlzIHVzaW5nIEphdmFTY3JpcHRUZXN0LnNoCiBpbXBvcnQgYXNzZXJ0IGZyb20gJ2Fzc2VydCcKIGltcG9ydCBmcyBmcm9tICdmcycKLWltcG9ydCAqIGFzIGZsZXhidWZmZXJzIGZyb20gJ2ZsYXRidWZmZXJzL2pzL2ZsZXhidWZmZXJzJworaW1wb3J0ICogYXMgZmxleGJ1ZmZlcnMgZnJvbSAnZmxhdGJ1ZmZlcnMvanMvZmxleGJ1ZmZlcnMuanMnCiAKIGZ1bmN0aW9uIG1haW4oKSB7CiAgIHRlc3RTaW5nbGVWYWx1ZUJ1ZmZlcnMoKTsKQEAgLTI2NCw2ICsyNjQsNyBAQAogCiAgIF9hc3NlcnQoZXhhbXBsZSk7CiAgIF9hc3NlcnQoMHgxMDAwMDAwMDFuKTsKKyAgX2Fzc2VydCh7IHRlc3RfbnVtYmVyOiA3Mi42IH0pCiB9CiAKIGZ1bmN0aW9uIHRlc3RSb3VuZFRyaXBXaXRoQnVpbGRlcigpIHsKQEAgLTM0MCw3ICszNDEsNyBAQAogfQogCiBmdW5jdGlvbiB0ZXN0R29sZEJ1ZmZlcigpIHsKLSAgY29uc3QgZGF0YSA9IG5ldyBVaW50OEFycmF5KGZzLnJlYWRGaWxlU3luYygnZ29sZF9mbGV4YnVmZmVyX2V4YW1wbGUuYmluJykpLmJ1ZmZlcjsKKyAgY29uc3QgZGF0YSA9IG5ldyBVaW50OEFycmF5KGZzLnJlYWRGaWxlU3luYygnLi4vZ29sZF9mbGV4YnVmZmVyX2V4YW1wbGUuYmluJykpLmJ1ZmZlcjsKICAgY29uc3QgYjEgPSBmbGV4YnVmZmVycy50b1JlZmVyZW5jZShkYXRhKS5nZXQoImJvb2xzIikuZ2V0KDEpOwogICBhc3NlcnQuc3RyaWN0RXF1YWwoYjEuaXNCb29sKCksIHRydWUpOwogICBhc3NlcnQuc3RyaWN0RXF1YWwoYjEuYm9vbFZhbHVlKCksIGZhbHNlKTsKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL0phdmFTY3JpcHRUZXN0LmpzIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvdHMvSmF2YVNjcmlwdFRlc3QuanMKc2ltaWxhcml0eSBpbmRleCA5MyUKcmVuYW1lIGZyb20gdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvSmF2YVNjcmlwdFRlc3QuanMKcmVuYW1lIHRvIHRoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL3RzL0phdmFTY3JpcHRUZXN0LmpzCmluZGV4IGYxZmRjNjkuLmI3NmRkMmUgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL0phdmFTY3JpcHRUZXN0LmpzCisrKyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL3RzL0phdmFTY3JpcHRUZXN0LmpzCkBAIC0zLDE4ICszLDE4IEBACiBpbXBvcnQgZnMgZnJvbSAnZnMnCiBpbXBvcnQgKiBhcyBmbGF0YnVmZmVycyBmcm9tICdmbGF0YnVmZmVycycKIAotaW1wb3J0IHsgTW9uc3RlciwgTW9uc3RlclQgfSBmcm9tICcuL215LWdhbWUvZXhhbXBsZS9tb25zdGVyJwotaW1wb3J0IHsgVGVzdCB9IGZyb20gJy4vbXktZ2FtZS9leGFtcGxlL3Rlc3QnCi1pbXBvcnQgeyBTdGF0IH0gZnJvbSAnLi9teS1nYW1lL2V4YW1wbGUvc3RhdCcKLWltcG9ydCB7IFZlYzMgfSBmcm9tICcuL215LWdhbWUvZXhhbXBsZS92ZWMzJwotaW1wb3J0IHsgQ29sb3IgfSBmcm9tICcuL215LWdhbWUvZXhhbXBsZS9jb2xvcic7Ci1pbXBvcnQgeyBBbnkgfSBmcm9tICcuL215LWdhbWUvZXhhbXBsZS9hbnknOworaW1wb3J0IHsgTW9uc3RlciwgTW9uc3RlclQgfSBmcm9tICcuL215LWdhbWUvZXhhbXBsZS9tb25zdGVyLmpzJworaW1wb3J0IHsgVGVzdCwgVGVzdFQgfSBmcm9tICcuL215LWdhbWUvZXhhbXBsZS90ZXN0LmpzJworaW1wb3J0IHsgU3RhdCB9IGZyb20gJy4vbXktZ2FtZS9leGFtcGxlL3N0YXQuanMnCitpbXBvcnQgeyBWZWMzIH0gZnJvbSAnLi9teS1nYW1lL2V4YW1wbGUvdmVjMy5qcycKK2ltcG9ydCB7IENvbG9yIH0gZnJvbSAnLi9teS1nYW1lL2V4YW1wbGUvY29sb3IuanMnOworaW1wb3J0IHsgQW55IH0gZnJvbSAnLi9teS1nYW1lL2V4YW1wbGUvYW55LmpzJzsKIAogZnVuY3Rpb24gbWFpbigpIHsKIAogICAvLyBGaXJzdCwgbGV0J3MgdGVzdCByZWFkaW5nIGEgRmxhdEJ1ZmZlciBnZW5lcmF0ZWQgYnkgQysrIGNvZGU6CiAgIC8vIFRoaXMgZmlsZSB3YXMgZ2VuZXJhdGVkIGZyb20gbW9uc3RlcmRhdGFfdGVzdC5qc29uCi0gIHZhciBkYXRhID0gbmV3IFVpbnQ4QXJyYXkoZnMucmVhZEZpbGVTeW5jKCdtb25zdGVyZGF0YV90ZXN0Lm1vbicpKTsKKyAgdmFyIGRhdGEgPSBuZXcgVWludDhBcnJheShmcy5yZWFkRmlsZVN5bmMoJy4uL21vbnN0ZXJkYXRhX3Rlc3QubW9uJykpOwogCiAgIC8vIE5vdyB0ZXN0IGl0OgogCkBAIC00Nyw2ICs0Nyw3IEBACiAgIGZ1enpUZXN0MSgpOwogICB0ZXN0TnVsbFN0cmluZ3MoKTsKICAgdGVzdFNoYXJlZFN0cmluZ3MoKTsKKyAgdGVzdFZlY3Rvck9mU3RydWN0cygpOwogCiAgIGNvbnNvbGUubG9nKCdGbGF0QnVmZmVycyB0ZXN0OiBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5Jyk7CiB9CkBAIC0yODQsOCArMjg1LDggQEAKIH0KIAogZnVuY3Rpb24gdGVzdFVuaWNvZGUoKSB7Ci0gIHZhciBjb3JyZWN0ID0gZnMucmVhZEZpbGVTeW5jKCd1bmljb2RlX3Rlc3QubW9uJyk7Ci0gIHZhciBqc29uID0gSlNPTi5wYXJzZShmcy5yZWFkRmlsZVN5bmMoJ3VuaWNvZGVfdGVzdC5qc29uJywgJ3V0ZjgnKSk7CisgIHZhciBjb3JyZWN0ID0gZnMucmVhZEZpbGVTeW5jKCcuLi91bmljb2RlX3Rlc3QubW9uJyk7CisgIHZhciBqc29uID0gSlNPTi5wYXJzZShmcy5yZWFkRmlsZVN5bmMoJy4uL3VuaWNvZGVfdGVzdC5qc29uJywgJ3V0ZjgnKSk7CiAKICAgLy8gVGVzdCByZWFkaW5nCiAgIGZ1bmN0aW9uIHRlc3RSZWFkaW5nVW5pY29kZShiYikgewpAQCAtNDU4LDQgKzQ1OSwyMiBAQAogICBhc3NlcnQuc3RyaWN0RXF1YWwoYnVpbGRlci5jcmVhdGVTaGFyZWRTdHJpbmcodW5kZWZpbmVkKSwgMCk7CiB9CiAKK2Z1bmN0aW9uIHRlc3RWZWN0b3JPZlN0cnVjdHMoKSB7CisgIGxldCBtb25zdGVyID0gbmV3IE1vbnN0ZXJUKCk7CisgIG1vbnN0ZXIubmFtZSA9ICd0ZXN0VmVjdG9yT2ZTdHJ1Y3RzJzsKKyAgbW9uc3Rlci50ZXN0NCA9IFsKKyAgICBuZXcgVGVzdFQoMSwgMiksCisgICAgbmV3IFRlc3RUKDMsIDQpCisgIF07CisKKyAgbGV0IGJ1aWxkZXIgPSBuZXcgZmxhdGJ1ZmZlcnMuQnVpbGRlcigpOworICBidWlsZGVyLmZpbmlzaChtb25zdGVyLnBhY2soYnVpbGRlcikpOworCisgIGxldCBkZWNvZGVkTW9uc3RlciA9IE1vbnN0ZXIuZ2V0Um9vdEFzTW9uc3RlcihidWlsZGVyLmRhdGFCdWZmZXIoKSkudW5wYWNrKCk7CisgIGFzc2VydC5zdHJpY3RFcXVhbChkZWNvZGVkTW9uc3Rlci50ZXN0NFswXS5hLCAxKTsKKyAgYXNzZXJ0LnN0cmljdEVxdWFsKGRlY29kZWRNb25zdGVyLnRlc3Q0WzBdLmIsIDIpOworICBhc3NlcnQuc3RyaWN0RXF1YWwoZGVjb2RlZE1vbnN0ZXIudGVzdDRbMV0uYSwgMyk7CisgIGFzc2VydC5zdHJpY3RFcXVhbChkZWNvZGVkTW9uc3Rlci50ZXN0NFsxXS5iLCA0KTsKK30KKwogbWFpbigpOwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvSmF2YVNjcmlwdFVuaW9uVmVjdG9yVGVzdC5qcyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL3RzL0phdmFTY3JpcHRVbmlvblZlY3RvclRlc3QuanMKc2ltaWxhcml0eSBpbmRleCA5NCUKcmVuYW1lIGZyb20gdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvSmF2YVNjcmlwdFVuaW9uVmVjdG9yVGVzdC5qcwpyZW5hbWUgdG8gdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvdHMvSmF2YVNjcmlwdFVuaW9uVmVjdG9yVGVzdC5qcwppbmRleCBiODBlMzdmLi4xODg1N2Q2IDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9KYXZhU2NyaXB0VW5pb25WZWN0b3JUZXN0LmpzCisrKyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL3RzL0phdmFTY3JpcHRVbmlvblZlY3RvclRlc3QuanMKQEAgLTEsMTAgKzEsMTAgQEAKIGltcG9ydCBhc3NlcnQgZnJvbSAnYXNzZXJ0JwogaW1wb3J0ICogYXMgZmxhdGJ1ZmZlcnMgZnJvbSAnZmxhdGJ1ZmZlcnMnCiAKLWltcG9ydCB7IENoYXJhY3RlciB9IGZyb20gJy4vdW5pb25fdmVjdG9yL2NoYXJhY3RlcicKLWltcG9ydCB7IEJvb2tSZWFkZXIsIEJvb2tSZWFkZXJUIH0gZnJvbSAnLi91bmlvbl92ZWN0b3IvYm9vay1yZWFkZXInCi1pbXBvcnQgeyBBdHRhY2tlciwgQXR0YWNrZXJUIH0gZnJvbSAnLi91bmlvbl92ZWN0b3IvYXR0YWNrZXInCi1pbXBvcnQgeyBNb3ZpZSwgTW92aWVUIH0gZnJvbSAnLi91bmlvbl92ZWN0b3IvbW92aWUnCitpbXBvcnQgeyBDaGFyYWN0ZXIgfSBmcm9tICcuL3VuaW9uX3ZlY3Rvci9jaGFyYWN0ZXIuanMnCitpbXBvcnQgeyBCb29rUmVhZGVyLCBCb29rUmVhZGVyVCB9IGZyb20gJy4vdW5pb25fdmVjdG9yL2Jvb2stcmVhZGVyLmpzJworaW1wb3J0IHsgQXR0YWNrZXIsIEF0dGFja2VyVCB9IGZyb20gJy4vdW5pb25fdmVjdG9yL2F0dGFja2VyLmpzJworaW1wb3J0IHsgTW92aWUsIE1vdmllVCB9IGZyb20gJy4vdW5pb25fdmVjdG9yL21vdmllLmpzJwogCiB2YXIgY2hhclR5cGVzID0gWwogICBDaGFyYWN0ZXIuQmVsbGUsCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy90cy9UeXBlU2NyaXB0VGVzdC5weSBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL3RzL1R5cGVTY3JpcHRUZXN0LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmM5NWVkNzIKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy90cy9UeXBlU2NyaXB0VGVzdC5weQpAQCAtMCwwICsxLDEyMyBAQAorIyEvdXNyL2Jpbi9lbnYgcHl0aG9uMworIworIyBDb3B5cmlnaHQgMjAyMiBHb29nbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitpbXBvcnQgcGxhdGZvcm0KK2ltcG9ydCBzaHV0aWwKK2ltcG9ydCBzdWJwcm9jZXNzCitpbXBvcnQgc3lzCitmcm9tIHBhdGhsaWIgaW1wb3J0IFBhdGgKKworIyBHZXQgdGhlIHBhdGggd2hlcmUgdGhpcyBzY3JpcHQgaXMgbG9jYXRlZCBzbyB3ZSBjYW4gaW52b2tlIHRoZSBzY3JpcHQgZnJvbQorIyBhbnkgZGlyZWN0b3J5IGFuZCBoYXZlIHRoZSBwYXRocyB3b3JrIGNvcnJlY3RseS4KK3Rlc3RzX3BhdGggPSBQYXRoKF9fZmlsZV9fKS5wYXJlbnQucmVzb2x2ZSgpCisKKyMgR2V0IHRoZSByb290IHBhdGggYXMgYW4gYWJzb2x1dGUgcGF0aCwgc28gYWxsIGRlcml2ZWQgcGF0aHMgYXJlIGFic29sdXRlLgorcm9vdF9wYXRoID0gdGVzdHNfcGF0aC5wYXJlbnQucGFyZW50LmFic29sdXRlKCkKKworIyBXaW5kb3dzIHdvcmtzIHdpdGggc3VicHJvY2Vzcy5ydW4gYSBiaXQgZGlmZmVyZW50bHkuCitpc193aW5kb3dzID0gcGxhdGZvcm0uc3lzdGVtKCkgPT0gIldpbmRvd3MiCisKKyMgR2V0IHRoZSBsb2NhdGlvbiBvZiB0aGUgZmxhdGMgZXhlY3V0YWJsZQorZmxhdGNfZXhlID0gUGF0aCgiZmxhdGMuZXhlIiBpZiBpc193aW5kb3dzIGVsc2UgImZsYXRjIikKKworIyBGaW5kIGFuZCBhc3NlcnQgZmxhdGMgY29tcGlsZXIgaXMgcHJlc2VudC4KK2lmIHJvb3RfcGF0aCBpbiBmbGF0Y19leGUucGFyZW50czoKKyAgICBmbGF0Y19leGUgPSBmbGF0Y19leGUucmVsYXRpdmVfdG8ocm9vdF9wYXRoKQorZmxhdGNfcGF0aCA9IFBhdGgocm9vdF9wYXRoLCBmbGF0Y19leGUpCithc3NlcnQgZmxhdGNfcGF0aC5leGlzdHMoKSwgIkNhbm5vdCBmaW5kIHRoZSBmbGF0YyBjb21waWxlciAiICsgc3RyKGZsYXRjX3BhdGgpCisKK2RlZiBjaGVja19jYWxsKGFyZ3MsIGN3ZD10ZXN0c19wYXRoKToKKyAgICBzdWJwcm9jZXNzLmNoZWNrX2NhbGwoYXJncywgY3dkPXN0cihjd2QpLCBzaGVsbD1pc193aW5kb3dzKQorCisjIEV4ZWN1dGUgdGhlIGZsYXRjIGNvbXBpbGVyIHdpdGggdGhlIHNwZWNpZmllZCBwYXJhbWV0ZXJzCitkZWYgZmxhdGMob3B0aW9ucywgc2NoZW1hLCBwcmVmaXg9Tm9uZSwgaW5jbHVkZT1Ob25lLCBkYXRhPU5vbmUsIGN3ZD10ZXN0c19wYXRoKToKKyAgICBjbWQgPSBbc3RyKGZsYXRjX3BhdGgpXSArIG9wdGlvbnMKKyAgICBpZiBwcmVmaXg6CisgICAgICAgIGNtZCArPSBbIi1vIl0gKyBbcHJlZml4XQorICAgIGlmIGluY2x1ZGU6CisgICAgICAgIGNtZCArPSBbIi1JIl0gKyBbaW5jbHVkZV0KKyAgICBjbWQgKz0gW3NjaGVtYV0gaWYgaXNpbnN0YW5jZShzY2hlbWEsIHN0cikgZWxzZSBzY2hlbWEKKyAgICBpZiBkYXRhOgorICAgICAgICBjbWQgKz0gW2RhdGFdIGlmIGlzaW5zdGFuY2UoZGF0YSwgc3RyKSBlbHNlIGRhdGEKKyAgICBjaGVja19jYWxsKGNtZCkKKworcHJpbnQoIlJlbW92aW5nIG5vZGVfbW9kdWxlcy8gZGlyZWN0b3J5Li4uIikKK3NodXRpbC5ybXRyZWUoUGF0aCh0ZXN0c19wYXRoLCAibm9kZV9tb2R1bGVzIiksIGlnbm9yZV9lcnJvcnM9VHJ1ZSkKKworY2hlY2tfY2FsbChbIm5wbSIsICJpbnN0YWxsIiwgIi0tc2lsZW50Il0pCisKK3ByaW50KCJJbnZva2luZyBmbGF0Yy4uLiIpCitmbGF0YygKKyAgICBvcHRpb25zPVsiLS10cyIsICItLWdlbi1uYW1lLXN0cmluZ3MiLCAiLS1nZW4tbXV0YWJsZSIsICItLWdlbi1vYmplY3QtYXBpIl0sCisgICAgc2NoZW1hPSIuLi9tb25zdGVyX3Rlc3QuZmJzIiwKKyAgICBpbmNsdWRlPSIuLi9pbmNsdWRlX3Rlc3QiLAorKQorCitmbGF0YygKKyAgICBvcHRpb25zPVsiLS1nZW4tb2JqZWN0LWFwaSIsICItYiJdLAorICAgIHNjaGVtYT0iLi4vbW9uc3Rlcl90ZXN0LmZicyIsCisgICAgaW5jbHVkZT0iLi4vaW5jbHVkZV90ZXN0IiwKKyAgICBkYXRhPSIuLi91bmljb2RlX3Rlc3QuanNvbiIsCispCisKK2ZsYXRjKAorICAgIG9wdGlvbnM9WyItLXRzIiwgIi0tZ2VuLW5hbWUtc3RyaW5ncyIsICItLWdlbi1tdXRhYmxlIiwgIi0tZ2VuLW9iamVjdC1hcGkiXSwKKyAgICBzY2hlbWE9Ii4uL3VuaW9uX3ZlY3Rvci91bmlvbl92ZWN0b3IuZmJzIiwKKyAgICBwcmVmaXg9InVuaW9uX3ZlY3RvciIsCispCisKK2ZsYXRjKAorICAgIG9wdGlvbnM9WyItLXRzIiwgIi0tZ2VuLW5hbWUtc3RyaW5ncyJdLAorICAgIHNjaGVtYT0iLi4vb3B0aW9uYWxfc2NhbGFycy5mYnMiLAorKQorCitmbGF0YygKKyAgICBvcHRpb25zPVsiLS10cyIsICItLWdlbi1uYW1lLXN0cmluZ3MiLCAiLS1nZW4tbXV0YWJsZSIsICItLWdlbi1vYmplY3QtYXBpIl0sCisgICAgc2NoZW1hPVsKKyAgICAgICAgInR5cGVzY3JpcHRfa2V5d29yZHMuZmJzIiwKKyAgICAgICAgInRlc3RfZGlyL3R5cGVzY3JpcHRfaW5jbHVkZS5mYnMiLAorICAgICAgICAidGVzdF9kaXIvdHlwZXNjcmlwdF90cmFuc2l0aXZlX2luY2x1ZGUuZmJzIiwKKyAgICAgICAgIi4uLy4uL3JlZmxlY3Rpb24vcmVmbGVjdGlvbi5mYnMiLAorICAgIF0sCisgICAgaW5jbHVkZT0iLi4vLi4vIiwKKykKKworZmxhdGMoCisgICAgb3B0aW9ucz1bCisgICAgICAgICItLXRzIiwKKyAgICAgICAgIi0tZ2VuLW5hbWUtc3RyaW5ncyIsCisgICAgICAgICItLWdlbi1tdXRhYmxlIiwKKyAgICAgICAgIi0tZ2VuLW9iamVjdC1hcGkiLAorICAgICAgICAiLS10cy1mbGF0LWZpbGVzIiwKKyAgICBdLAorICAgIHNjaGVtYT1bCisgICAgICAgICJ0eXBlc2NyaXB0X2tleXdvcmRzLmZicyIsCisgICAgICAgICJ0ZXN0X2Rpci90eXBlc2NyaXB0X2luY2x1ZGUuZmJzIiwKKyAgICAgICAgInRlc3RfZGlyL3R5cGVzY3JpcHRfdHJhbnNpdGl2ZV9pbmNsdWRlLmZicyIsCisgICAgICAgICIuLi8uLi9yZWZsZWN0aW9uL3JlZmxlY3Rpb24uZmJzIiwKKyAgICBdLAorICAgIGluY2x1ZGU9Ii4uLy4uLyIsCispCisKK3ByaW50KCJSdW5uaW5nIFR5cGVTY3JpcHQgQ29tcGlsZXIuLi4iKQorY2hlY2tfY2FsbChbInRzYyJdKQorCitOT0RFX0NNRCA9IFsibm9kZSJdCisKK3ByaW50KCJSdW5uaW5nIFR5cGVTY3JpcHQgVGVzdHMuLi4iKQorY2hlY2tfY2FsbChOT0RFX0NNRCArIFsiSmF2YVNjcmlwdFRlc3QiXSkKK2NoZWNrX2NhbGwoTk9ERV9DTUQgKyBbIkphdmFTY3JpcHRVbmlvblZlY3RvclRlc3QiXSkKK2NoZWNrX2NhbGwoTk9ERV9DTUQgKyBbIkphdmFTY3JpcHRGbGV4QnVmZmVyc1Rlc3QiXSkKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy90cy9mb29iYXIvYWJjLmpzIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvdHMvZm9vYmFyL2FiYy5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZGVmOTg4Ci0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvdHMvZm9vYmFyL2FiYy5qcwpAQCAtMCwwICsxLDUgQEAKKy8vIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGJ5IHRoZSBGbGF0QnVmZmVycyBjb21waWxlciwgZG8gbm90IG1vZGlmeQorZXhwb3J0IHZhciBBYmM7CisoZnVuY3Rpb24gKEFiYykgeworICAgIEFiY1tBYmNbImEiXSA9IDBdID0gImEiOworfSkoQWJjIHx8IChBYmMgPSB7fSkpOwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvdHMvZm9vYmFyL2FiYy50cyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL3RzL2Zvb2Jhci9hYmMudHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWY4ODQyYgotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL3RzL2Zvb2Jhci9hYmMudHMKQEAgLTAsMCArMSw1IEBACisvLyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBieSB0aGUgRmxhdEJ1ZmZlcnMgY29tcGlsZXIsIGRvIG5vdCBtb2RpZnkKKworZXhwb3J0IGVudW0gQWJjIHsKKyAgYSA9IDAKK30KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL3RzL2Zvb2Jhci9jbGFzcy5qcyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL3RzL2Zvb2Jhci9jbGFzcy5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMGUxZGYxCi0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvdHMvZm9vYmFyL2NsYXNzLmpzCkBAIC0wLDAgKzEsNSBAQAorLy8gYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgYnkgdGhlIEZsYXRCdWZmZXJzIGNvbXBpbGVyLCBkbyBub3QgbW9kaWZ5CitleHBvcnQgdmFyIGNsYXNzXzsKKyhmdW5jdGlvbiAoY2xhc3NfKSB7CisgICAgY2xhc3NfW2NsYXNzX1siYXJndW1lbnRzXyJdID0gMF0gPSAiYXJndW1lbnRzXyI7Cit9KShjbGFzc18gfHwgKGNsYXNzXyA9IHt9KSk7CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy90cy9mb29iYXIvY2xhc3MudHMgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy90cy9mb29iYXIvY2xhc3MudHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDI2ZmIyOAotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL3RzL2Zvb2Jhci9jbGFzcy50cwpAQCAtMCwwICsxLDUgQEAKKy8vIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGJ5IHRoZSBGbGF0QnVmZmVycyBjb21waWxlciwgZG8gbm90IG1vZGlmeQorCitleHBvcnQgZW51bSBjbGFzc18geworICBhcmd1bWVudHNfID0gMAorfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvbW9uc3Rlcl90ZXN0LmpzIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvdHMvbW9uc3Rlcl90ZXN0LmpzCnNpbWlsYXJpdHkgaW5kZXggOTElCnJlbmFtZSBmcm9tIHRoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL21vbnN0ZXJfdGVzdC5qcwpyZW5hbWUgdG8gdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvdHMvbW9uc3Rlcl90ZXN0LmpzCmluZGV4IGI0ZTEzZDEuLmFmYzMzM2UgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL21vbnN0ZXJfdGVzdC5qcworKysgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy90cy9tb25zdGVyX3Rlc3QuanMKQEAgLTksNiArOSw3IEBACiBleHBvcnQgeyBSZWZlcnJhYmxlLCBSZWZlcnJhYmxlVCB9IGZyb20gJy4vbXktZ2FtZS9leGFtcGxlL3JlZmVycmFibGUnOwogZXhwb3J0IHsgU3RhdCwgU3RhdFQgfSBmcm9tICcuL215LWdhbWUvZXhhbXBsZS9zdGF0JzsKIGV4cG9ydCB7IFN0cnVjdE9mU3RydWN0cywgU3RydWN0T2ZTdHJ1Y3RzVCB9IGZyb20gJy4vbXktZ2FtZS9leGFtcGxlL3N0cnVjdC1vZi1zdHJ1Y3RzJzsKK2V4cG9ydCB7IFN0cnVjdE9mU3RydWN0c09mU3RydWN0cywgU3RydWN0T2ZTdHJ1Y3RzT2ZTdHJ1Y3RzVCB9IGZyb20gJy4vbXktZ2FtZS9leGFtcGxlL3N0cnVjdC1vZi1zdHJ1Y3RzLW9mLXN0cnVjdHMnOwogZXhwb3J0IHsgVGVzdCwgVGVzdFQgfSBmcm9tICcuL215LWdhbWUvZXhhbXBsZS90ZXN0JzsKIGV4cG9ydCB7IFRlc3RTaW1wbGVUYWJsZVdpdGhFbnVtLCBUZXN0U2ltcGxlVGFibGVXaXRoRW51bVQgfSBmcm9tICcuL215LWdhbWUvZXhhbXBsZS90ZXN0LXNpbXBsZS10YWJsZS13aXRoLWVudW0nOwogZXhwb3J0IHsgVHlwZUFsaWFzZXMsIFR5cGVBbGlhc2VzVCB9IGZyb20gJy4vbXktZ2FtZS9leGFtcGxlL3R5cGUtYWxpYXNlcyc7CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9tb25zdGVyX3Rlc3QudHMgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy90cy9tb25zdGVyX3Rlc3QudHMKc2ltaWxhcml0eSBpbmRleCA5MSUKcmVuYW1lIGZyb20gdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvbW9uc3Rlcl90ZXN0LnRzCnJlbmFtZSB0byB0aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy90cy9tb25zdGVyX3Rlc3QudHMKaW5kZXggYjRlMTNkMS4uYWZjMzMzZSAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvbW9uc3Rlcl90ZXN0LnRzCisrKyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL3RzL21vbnN0ZXJfdGVzdC50cwpAQCAtOSw2ICs5LDcgQEAKIGV4cG9ydCB7IFJlZmVycmFibGUsIFJlZmVycmFibGVUIH0gZnJvbSAnLi9teS1nYW1lL2V4YW1wbGUvcmVmZXJyYWJsZSc7CiBleHBvcnQgeyBTdGF0LCBTdGF0VCB9IGZyb20gJy4vbXktZ2FtZS9leGFtcGxlL3N0YXQnOwogZXhwb3J0IHsgU3RydWN0T2ZTdHJ1Y3RzLCBTdHJ1Y3RPZlN0cnVjdHNUIH0gZnJvbSAnLi9teS1nYW1lL2V4YW1wbGUvc3RydWN0LW9mLXN0cnVjdHMnOworZXhwb3J0IHsgU3RydWN0T2ZTdHJ1Y3RzT2ZTdHJ1Y3RzLCBTdHJ1Y3RPZlN0cnVjdHNPZlN0cnVjdHNUIH0gZnJvbSAnLi9teS1nYW1lL2V4YW1wbGUvc3RydWN0LW9mLXN0cnVjdHMtb2Ytc3RydWN0cyc7CiBleHBvcnQgeyBUZXN0LCBUZXN0VCB9IGZyb20gJy4vbXktZ2FtZS9leGFtcGxlL3Rlc3QnOwogZXhwb3J0IHsgVGVzdFNpbXBsZVRhYmxlV2l0aEVudW0sIFRlc3RTaW1wbGVUYWJsZVdpdGhFbnVtVCB9IGZyb20gJy4vbXktZ2FtZS9leGFtcGxlL3Rlc3Qtc2ltcGxlLXRhYmxlLXdpdGgtZW51bSc7CiBleHBvcnQgeyBUeXBlQWxpYXNlcywgVHlwZUFsaWFzZXNUIH0gZnJvbSAnLi9teS1nYW1lL2V4YW1wbGUvdHlwZS1hbGlhc2VzJzsKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL3RzL21vbnN0ZXJfdGVzdF9nZW5lcmF0ZWQudHMgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy90cy9tb25zdGVyX3Rlc3RfZ2VuZXJhdGVkLnRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE4YWVjMDcKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy90cy9tb25zdGVyX3Rlc3RfZ2VuZXJhdGVkLnRzCkBAIC0wLDAgKzEsMTkgQEAKKy8vIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGJ5IHRoZSBGbGF0QnVmZmVycyBjb21waWxlciwgZG8gbm90IG1vZGlmeQorCitleHBvcnQgeyBNb25zdGVyIGFzIE15R2FtZV9FeGFtcGxlMl9Nb25zdGVyLCBNb25zdGVyVCBhcyBNeUdhbWVfRXhhbXBsZTJfTW9uc3RlclQgfSBmcm9tICcuL215LWdhbWUvZXhhbXBsZTIvbW9uc3Rlci5qcyc7CitleHBvcnQgeyBBYmlsaXR5LCBBYmlsaXR5VCB9IGZyb20gJy4vbXktZ2FtZS9leGFtcGxlL2FiaWxpdHkuanMnOworZXhwb3J0IHsgQW55LCB1bmlvblRvQW55LCB1bmlvbkxpc3RUb0FueSB9IGZyb20gJy4vbXktZ2FtZS9leGFtcGxlL2FueS5qcyc7CitleHBvcnQgeyBBbnlBbWJpZ3VvdXNBbGlhc2VzLCB1bmlvblRvQW55QW1iaWd1b3VzQWxpYXNlcywgdW5pb25MaXN0VG9BbnlBbWJpZ3VvdXNBbGlhc2VzIH0gZnJvbSAnLi9teS1nYW1lL2V4YW1wbGUvYW55LWFtYmlndW91cy1hbGlhc2VzLmpzJzsKK2V4cG9ydCB7IEFueVVuaXF1ZUFsaWFzZXMsIHVuaW9uVG9BbnlVbmlxdWVBbGlhc2VzLCB1bmlvbkxpc3RUb0FueVVuaXF1ZUFsaWFzZXMgfSBmcm9tICcuL215LWdhbWUvZXhhbXBsZS9hbnktdW5pcXVlLWFsaWFzZXMuanMnOworZXhwb3J0IHsgQ29sb3IgfSBmcm9tICcuL215LWdhbWUvZXhhbXBsZS9jb2xvci5qcyc7CitleHBvcnQgeyBNb25zdGVyLCBNb25zdGVyVCB9IGZyb20gJy4vbXktZ2FtZS9leGFtcGxlL21vbnN0ZXIuanMnOworZXhwb3J0IHsgUmFjZSB9IGZyb20gJy4vbXktZ2FtZS9leGFtcGxlL3JhY2UuanMnOworZXhwb3J0IHsgUmVmZXJyYWJsZSwgUmVmZXJyYWJsZVQgfSBmcm9tICcuL215LWdhbWUvZXhhbXBsZS9yZWZlcnJhYmxlLmpzJzsKK2V4cG9ydCB7IFN0YXQsIFN0YXRUIH0gZnJvbSAnLi9teS1nYW1lL2V4YW1wbGUvc3RhdC5qcyc7CitleHBvcnQgeyBTdHJ1Y3RPZlN0cnVjdHMsIFN0cnVjdE9mU3RydWN0c1QgfSBmcm9tICcuL215LWdhbWUvZXhhbXBsZS9zdHJ1Y3Qtb2Ytc3RydWN0cy5qcyc7CitleHBvcnQgeyBTdHJ1Y3RPZlN0cnVjdHNPZlN0cnVjdHMsIFN0cnVjdE9mU3RydWN0c09mU3RydWN0c1QgfSBmcm9tICcuL215LWdhbWUvZXhhbXBsZS9zdHJ1Y3Qtb2Ytc3RydWN0cy1vZi1zdHJ1Y3RzLmpzJzsKK2V4cG9ydCB7IFRlc3QsIFRlc3RUIH0gZnJvbSAnLi9teS1nYW1lL2V4YW1wbGUvdGVzdC5qcyc7CitleHBvcnQgeyBUZXN0U2ltcGxlVGFibGVXaXRoRW51bSwgVGVzdFNpbXBsZVRhYmxlV2l0aEVudW1UIH0gZnJvbSAnLi9teS1nYW1lL2V4YW1wbGUvdGVzdC1zaW1wbGUtdGFibGUtd2l0aC1lbnVtLmpzJzsKK2V4cG9ydCB7IFR5cGVBbGlhc2VzLCBUeXBlQWxpYXNlc1QgfSBmcm9tICcuL215LWdhbWUvZXhhbXBsZS90eXBlLWFsaWFzZXMuanMnOworZXhwb3J0IHsgVmVjMywgVmVjM1QgfSBmcm9tICcuL215LWdhbWUvZXhhbXBsZS92ZWMzLmpzJzsKK2V4cG9ydCB7IEluUGFyZW50TmFtZXNwYWNlLCBJblBhcmVudE5hbWVzcGFjZVQgfSBmcm9tICcuL215LWdhbWUvaW4tcGFyZW50LW5hbWVzcGFjZS5qcyc7CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy9tb25zdGVyX3Rlc3RfZ3JwYy5kLnRzIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvdHMvbW9uc3Rlcl90ZXN0X2dycGMuZC50cwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvbW9uc3Rlcl90ZXN0X2dycGMuZC50cwpyZW5hbWUgdG8gdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvdHMvbW9uc3Rlcl90ZXN0X2dycGMuZC50cwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvbW9uc3Rlcl90ZXN0X2dycGMuanMgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy90cy9tb25zdGVyX3Rlc3RfZ3JwYy5qcwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvbW9uc3Rlcl90ZXN0X2dycGMuanMKcmVuYW1lIHRvIHRoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL3RzL21vbnN0ZXJfdGVzdF9ncnBjLmpzCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy90cy9tb25zdGVyZGF0YV9qYXZhc2NyaXB0X3dpcmUubW9uIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvdHMvbW9uc3RlcmRhdGFfamF2YXNjcmlwdF93aXJlLm1vbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNjAyMGEyCi0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvdHMvbW9uc3RlcmRhdGFfamF2YXNjcmlwdF93aXJlLm1vbgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy90cy9teS1nYW1lL2V4YW1wbGUvYWJpbGl0eS5qcyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL3RzL215LWdhbWUvZXhhbXBsZS9hYmlsaXR5LmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRkN2QzZGIKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy90cy9teS1nYW1lL2V4YW1wbGUvYWJpbGl0eS5qcwpAQCAtMCwwICsxLDU0IEBACisvLyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBieSB0aGUgRmxhdEJ1ZmZlcnMgY29tcGlsZXIsIGRvIG5vdCBtb2RpZnkKK2V4cG9ydCBjbGFzcyBBYmlsaXR5IHsKKyAgICBjb25zdHJ1Y3RvcigpIHsKKyAgICAgICAgdGhpcy5iYiA9IG51bGw7CisgICAgICAgIHRoaXMuYmJfcG9zID0gMDsKKyAgICB9CisgICAgX19pbml0KGksIGJiKSB7CisgICAgICAgIHRoaXMuYmJfcG9zID0gaTsKKyAgICAgICAgdGhpcy5iYiA9IGJiOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisgICAgaWQoKSB7CisgICAgICAgIHJldHVybiB0aGlzLmJiLnJlYWRVaW50MzIodGhpcy5iYl9wb3MpOworICAgIH0KKyAgICBtdXRhdGVfaWQodmFsdWUpIHsKKyAgICAgICAgdGhpcy5iYi53cml0ZVVpbnQzMih0aGlzLmJiX3BvcyArIDAsIHZhbHVlKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIGRpc3RhbmNlKCkgeworICAgICAgICByZXR1cm4gdGhpcy5iYi5yZWFkVWludDMyKHRoaXMuYmJfcG9zICsgNCk7CisgICAgfQorICAgIG11dGF0ZV9kaXN0YW5jZSh2YWx1ZSkgeworICAgICAgICB0aGlzLmJiLndyaXRlVWludDMyKHRoaXMuYmJfcG9zICsgNCwgdmFsdWUpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgc3RhdGljIGdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpIHsKKyAgICAgICAgcmV0dXJuICdNeUdhbWVfRXhhbXBsZV9BYmlsaXR5JzsKKyAgICB9CisgICAgc3RhdGljIHNpemVPZigpIHsKKyAgICAgICAgcmV0dXJuIDg7CisgICAgfQorICAgIHN0YXRpYyBjcmVhdGVBYmlsaXR5KGJ1aWxkZXIsIGlkLCBkaXN0YW5jZSkgeworICAgICAgICBidWlsZGVyLnByZXAoNCwgOCk7CisgICAgICAgIGJ1aWxkZXIud3JpdGVJbnQzMihkaXN0YW5jZSk7CisgICAgICAgIGJ1aWxkZXIud3JpdGVJbnQzMihpZCk7CisgICAgICAgIHJldHVybiBidWlsZGVyLm9mZnNldCgpOworICAgIH0KKyAgICB1bnBhY2soKSB7CisgICAgICAgIHJldHVybiBuZXcgQWJpbGl0eVQodGhpcy5pZCgpLCB0aGlzLmRpc3RhbmNlKCkpOworICAgIH0KKyAgICB1bnBhY2tUbyhfbykgeworICAgICAgICBfby5pZCA9IHRoaXMuaWQoKTsKKyAgICAgICAgX28uZGlzdGFuY2UgPSB0aGlzLmRpc3RhbmNlKCk7CisgICAgfQorfQorZXhwb3J0IGNsYXNzIEFiaWxpdHlUIHsKKyAgICBjb25zdHJ1Y3RvcihpZCA9IDAsIGRpc3RhbmNlID0gMCkgeworICAgICAgICB0aGlzLmlkID0gaWQ7CisgICAgICAgIHRoaXMuZGlzdGFuY2UgPSBkaXN0YW5jZTsKKyAgICB9CisgICAgcGFjayhidWlsZGVyKSB7CisgICAgICAgIHJldHVybiBBYmlsaXR5LmNyZWF0ZUFiaWxpdHkoYnVpbGRlciwgdGhpcy5pZCwgdGhpcy5kaXN0YW5jZSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvdHMvbXktZ2FtZS9leGFtcGxlL2FiaWxpdHkudHMgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy90cy9teS1nYW1lL2V4YW1wbGUvYWJpbGl0eS50cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNmIwZWI4Ci0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvdHMvbXktZ2FtZS9leGFtcGxlL2FiaWxpdHkudHMKQEAgLTAsMCArMSw3NyBAQAorLy8gYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgYnkgdGhlIEZsYXRCdWZmZXJzIGNvbXBpbGVyLCBkbyBub3QgbW9kaWZ5CisKK2ltcG9ydCAqIGFzIGZsYXRidWZmZXJzIGZyb20gJ2ZsYXRidWZmZXJzJzsKKworCisKK2V4cG9ydCBjbGFzcyBBYmlsaXR5IHsKKyAgYmI6IGZsYXRidWZmZXJzLkJ5dGVCdWZmZXJ8bnVsbCA9IG51bGw7CisgIGJiX3BvcyA9IDA7CisgIF9faW5pdChpOm51bWJlciwgYmI6ZmxhdGJ1ZmZlcnMuQnl0ZUJ1ZmZlcik6QWJpbGl0eSB7CisgIHRoaXMuYmJfcG9zID0gaTsKKyAgdGhpcy5iYiA9IGJiOworICByZXR1cm4gdGhpczsKK30KKworaWQoKTpudW1iZXIgeworICByZXR1cm4gdGhpcy5iYiEucmVhZFVpbnQzMih0aGlzLmJiX3Bvcyk7Cit9CisKK211dGF0ZV9pZCh2YWx1ZTpudW1iZXIpOmJvb2xlYW4geworICB0aGlzLmJiIS53cml0ZVVpbnQzMih0aGlzLmJiX3BvcyArIDAsIHZhbHVlKTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK2Rpc3RhbmNlKCk6bnVtYmVyIHsKKyAgcmV0dXJuIHRoaXMuYmIhLnJlYWRVaW50MzIodGhpcy5iYl9wb3MgKyA0KTsKK30KKworbXV0YXRlX2Rpc3RhbmNlKHZhbHVlOm51bWJlcik6Ym9vbGVhbiB7CisgIHRoaXMuYmIhLndyaXRlVWludDMyKHRoaXMuYmJfcG9zICsgNCwgdmFsdWUpOworICByZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIGdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpOnN0cmluZyB7CisgIHJldHVybiAnTXlHYW1lX0V4YW1wbGVfQWJpbGl0eSc7Cit9CisKK3N0YXRpYyBzaXplT2YoKTpudW1iZXIgeworICByZXR1cm4gODsKK30KKworc3RhdGljIGNyZWF0ZUFiaWxpdHkoYnVpbGRlcjpmbGF0YnVmZmVycy5CdWlsZGVyLCBpZDogbnVtYmVyLCBkaXN0YW5jZTogbnVtYmVyKTpmbGF0YnVmZmVycy5PZmZzZXQgeworICBidWlsZGVyLnByZXAoNCwgOCk7CisgIGJ1aWxkZXIud3JpdGVJbnQzMihkaXN0YW5jZSk7CisgIGJ1aWxkZXIud3JpdGVJbnQzMihpZCk7CisgIHJldHVybiBidWlsZGVyLm9mZnNldCgpOworfQorCisKK3VucGFjaygpOiBBYmlsaXR5VCB7CisgIHJldHVybiBuZXcgQWJpbGl0eVQoCisgICAgdGhpcy5pZCgpLAorICAgIHRoaXMuZGlzdGFuY2UoKQorICApOworfQorCisKK3VucGFja1RvKF9vOiBBYmlsaXR5VCk6IHZvaWQgeworICBfby5pZCA9IHRoaXMuaWQoKTsKKyAgX28uZGlzdGFuY2UgPSB0aGlzLmRpc3RhbmNlKCk7Cit9Cit9CisKK2V4cG9ydCBjbGFzcyBBYmlsaXR5VCB7Citjb25zdHJ1Y3RvcigKKyAgcHVibGljIGlkOiBudW1iZXIgPSAwLAorICBwdWJsaWMgZGlzdGFuY2U6IG51bWJlciA9IDAKKyl7fQorCisKK3BhY2soYnVpbGRlcjpmbGF0YnVmZmVycy5CdWlsZGVyKTogZmxhdGJ1ZmZlcnMuT2Zmc2V0IHsKKyAgcmV0dXJuIEFiaWxpdHkuY3JlYXRlQWJpbGl0eShidWlsZGVyLAorICAgIHRoaXMuaWQsCisgICAgdGhpcy5kaXN0YW5jZQorICApOworfQorfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvdHMvbXktZ2FtZS9leGFtcGxlL2FueS1hbWJpZ3VvdXMtYWxpYXNlcy5qcyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL3RzL215LWdhbWUvZXhhbXBsZS9hbnktYW1iaWd1b3VzLWFsaWFzZXMuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2E4MTkwOAotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL3RzL215LWdhbWUvZXhhbXBsZS9hbnktYW1iaWd1b3VzLWFsaWFzZXMuanMKQEAgLTAsMCArMSwyNyBAQAorLy8gYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgYnkgdGhlIEZsYXRCdWZmZXJzIGNvbXBpbGVyLCBkbyBub3QgbW9kaWZ5CitpbXBvcnQgeyBNb25zdGVyIH0gZnJvbSAnLi4vLi4vbXktZ2FtZS9leGFtcGxlL21vbnN0ZXIuanMnOworZXhwb3J0IHZhciBBbnlBbWJpZ3VvdXNBbGlhc2VzOworKGZ1bmN0aW9uIChBbnlBbWJpZ3VvdXNBbGlhc2VzKSB7CisgICAgQW55QW1iaWd1b3VzQWxpYXNlc1tBbnlBbWJpZ3VvdXNBbGlhc2VzWyJOT05FIl0gPSAwXSA9ICJOT05FIjsKKyAgICBBbnlBbWJpZ3VvdXNBbGlhc2VzW0FueUFtYmlndW91c0FsaWFzZXNbIk0xIl0gPSAxXSA9ICJNMSI7CisgICAgQW55QW1iaWd1b3VzQWxpYXNlc1tBbnlBbWJpZ3VvdXNBbGlhc2VzWyJNMiJdID0gMl0gPSAiTTIiOworICAgIEFueUFtYmlndW91c0FsaWFzZXNbQW55QW1iaWd1b3VzQWxpYXNlc1siTTMiXSA9IDNdID0gIk0zIjsKK30pKEFueUFtYmlndW91c0FsaWFzZXMgfHwgKEFueUFtYmlndW91c0FsaWFzZXMgPSB7fSkpOworZXhwb3J0IGZ1bmN0aW9uIHVuaW9uVG9BbnlBbWJpZ3VvdXNBbGlhc2VzKHR5cGUsIGFjY2Vzc29yKSB7CisgICAgc3dpdGNoIChBbnlBbWJpZ3VvdXNBbGlhc2VzW3R5cGVdKSB7CisgICAgICAgIGNhc2UgJ05PTkUnOiByZXR1cm4gbnVsbDsKKyAgICAgICAgY2FzZSAnTTEnOiByZXR1cm4gYWNjZXNzb3IobmV3IE1vbnN0ZXIoKSk7CisgICAgICAgIGNhc2UgJ00yJzogcmV0dXJuIGFjY2Vzc29yKG5ldyBNb25zdGVyKCkpOworICAgICAgICBjYXNlICdNMyc6IHJldHVybiBhY2Nlc3NvcihuZXcgTW9uc3RlcigpKTsKKyAgICAgICAgZGVmYXVsdDogcmV0dXJuIG51bGw7CisgICAgfQorfQorZXhwb3J0IGZ1bmN0aW9uIHVuaW9uTGlzdFRvQW55QW1iaWd1b3VzQWxpYXNlcyh0eXBlLCBhY2Nlc3NvciwgaW5kZXgpIHsKKyAgICBzd2l0Y2ggKEFueUFtYmlndW91c0FsaWFzZXNbdHlwZV0pIHsKKyAgICAgICAgY2FzZSAnTk9ORSc6IHJldHVybiBudWxsOworICAgICAgICBjYXNlICdNMSc6IHJldHVybiBhY2Nlc3NvcihpbmRleCwgbmV3IE1vbnN0ZXIoKSk7CisgICAgICAgIGNhc2UgJ00yJzogcmV0dXJuIGFjY2Vzc29yKGluZGV4LCBuZXcgTW9uc3RlcigpKTsKKyAgICAgICAgY2FzZSAnTTMnOiByZXR1cm4gYWNjZXNzb3IoaW5kZXgsIG5ldyBNb25zdGVyKCkpOworICAgICAgICBkZWZhdWx0OiByZXR1cm4gbnVsbDsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy90cy9teS1nYW1lL2V4YW1wbGUvYW55LWFtYmlndW91cy1hbGlhc2VzLnRzIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvdHMvbXktZ2FtZS9leGFtcGxlL2FueS1hbWJpZ3VvdXMtYWxpYXNlcy50cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hN2E2M2I3Ci0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvdHMvbXktZ2FtZS9leGFtcGxlL2FueS1hbWJpZ3VvdXMtYWxpYXNlcy50cwpAQCAtMCwwICsxLDM4IEBACisvLyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBieSB0aGUgRmxhdEJ1ZmZlcnMgY29tcGlsZXIsIGRvIG5vdCBtb2RpZnkKKworaW1wb3J0IHsgTW9uc3RlciwgTW9uc3RlclQgfSBmcm9tICcuLi8uLi9teS1nYW1lL2V4YW1wbGUvbW9uc3Rlci5qcyc7CisKKworZXhwb3J0IGVudW0gQW55QW1iaWd1b3VzQWxpYXNlcyB7CisgIE5PTkUgPSAwLAorICBNMSA9IDEsCisgIE0yID0gMiwKKyAgTTMgPSAzCit9CisKK2V4cG9ydCBmdW5jdGlvbiB1bmlvblRvQW55QW1iaWd1b3VzQWxpYXNlcygKKyAgdHlwZTogQW55QW1iaWd1b3VzQWxpYXNlcywKKyAgYWNjZXNzb3I6IChvYmo6TW9uc3RlcikgPT4gTW9uc3RlcnxudWxsCispOiBNb25zdGVyfG51bGwgeworICBzd2l0Y2goQW55QW1iaWd1b3VzQWxpYXNlc1t0eXBlXSkgeworICAgIGNhc2UgJ05PTkUnOiByZXR1cm4gbnVsbDsgCisgICAgY2FzZSAnTTEnOiByZXR1cm4gYWNjZXNzb3IobmV3IE1vbnN0ZXIoKSkhIGFzIE1vbnN0ZXI7CisgICAgY2FzZSAnTTInOiByZXR1cm4gYWNjZXNzb3IobmV3IE1vbnN0ZXIoKSkhIGFzIE1vbnN0ZXI7CisgICAgY2FzZSAnTTMnOiByZXR1cm4gYWNjZXNzb3IobmV3IE1vbnN0ZXIoKSkhIGFzIE1vbnN0ZXI7CisgICAgZGVmYXVsdDogcmV0dXJuIG51bGw7CisgIH0KK30KKworZXhwb3J0IGZ1bmN0aW9uIHVuaW9uTGlzdFRvQW55QW1iaWd1b3VzQWxpYXNlcygKKyAgdHlwZTogQW55QW1iaWd1b3VzQWxpYXNlcywgCisgIGFjY2Vzc29yOiAoaW5kZXg6IG51bWJlciwgb2JqOk1vbnN0ZXIpID0+IE1vbnN0ZXJ8bnVsbCwgCisgIGluZGV4OiBudW1iZXIKKyk6IE1vbnN0ZXJ8bnVsbCB7CisgIHN3aXRjaChBbnlBbWJpZ3VvdXNBbGlhc2VzW3R5cGVdKSB7CisgICAgY2FzZSAnTk9ORSc6IHJldHVybiBudWxsOyAKKyAgICBjYXNlICdNMSc6IHJldHVybiBhY2Nlc3NvcihpbmRleCwgbmV3IE1vbnN0ZXIoKSkhIGFzIE1vbnN0ZXI7CisgICAgY2FzZSAnTTInOiByZXR1cm4gYWNjZXNzb3IoaW5kZXgsIG5ldyBNb25zdGVyKCkpISBhcyBNb25zdGVyOworICAgIGNhc2UgJ00zJzogcmV0dXJuIGFjY2Vzc29yKGluZGV4LCBuZXcgTW9uc3RlcigpKSEgYXMgTW9uc3RlcjsKKyAgICBkZWZhdWx0OiByZXR1cm4gbnVsbDsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvdHMvbXktZ2FtZS9leGFtcGxlL2FueS11bmlxdWUtYWxpYXNlcy5qcyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL3RzL215LWdhbWUvZXhhbXBsZS9hbnktdW5pcXVlLWFsaWFzZXMuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDFhYzZiZgotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL3RzL215LWdhbWUvZXhhbXBsZS9hbnktdW5pcXVlLWFsaWFzZXMuanMKQEAgLTAsMCArMSwyOSBAQAorLy8gYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgYnkgdGhlIEZsYXRCdWZmZXJzIGNvbXBpbGVyLCBkbyBub3QgbW9kaWZ5CitpbXBvcnQgeyBNb25zdGVyIGFzIE15R2FtZV9FeGFtcGxlMl9Nb25zdGVyIH0gZnJvbSAnLi4vLi4vbXktZ2FtZS9leGFtcGxlMi9tb25zdGVyLmpzJzsKK2ltcG9ydCB7IE1vbnN0ZXIgfSBmcm9tICcuLi8uLi9teS1nYW1lL2V4YW1wbGUvbW9uc3Rlci5qcyc7CitpbXBvcnQgeyBUZXN0U2ltcGxlVGFibGVXaXRoRW51bSB9IGZyb20gJy4uLy4uL215LWdhbWUvZXhhbXBsZS90ZXN0LXNpbXBsZS10YWJsZS13aXRoLWVudW0uanMnOworZXhwb3J0IHZhciBBbnlVbmlxdWVBbGlhc2VzOworKGZ1bmN0aW9uIChBbnlVbmlxdWVBbGlhc2VzKSB7CisgICAgQW55VW5pcXVlQWxpYXNlc1tBbnlVbmlxdWVBbGlhc2VzWyJOT05FIl0gPSAwXSA9ICJOT05FIjsKKyAgICBBbnlVbmlxdWVBbGlhc2VzW0FueVVuaXF1ZUFsaWFzZXNbIk0iXSA9IDFdID0gIk0iOworICAgIEFueVVuaXF1ZUFsaWFzZXNbQW55VW5pcXVlQWxpYXNlc1siVFMiXSA9IDJdID0gIlRTIjsKKyAgICBBbnlVbmlxdWVBbGlhc2VzW0FueVVuaXF1ZUFsaWFzZXNbIk0yIl0gPSAzXSA9ICJNMiI7Cit9KShBbnlVbmlxdWVBbGlhc2VzIHx8IChBbnlVbmlxdWVBbGlhc2VzID0ge30pKTsKK2V4cG9ydCBmdW5jdGlvbiB1bmlvblRvQW55VW5pcXVlQWxpYXNlcyh0eXBlLCBhY2Nlc3NvcikgeworICAgIHN3aXRjaCAoQW55VW5pcXVlQWxpYXNlc1t0eXBlXSkgeworICAgICAgICBjYXNlICdOT05FJzogcmV0dXJuIG51bGw7CisgICAgICAgIGNhc2UgJ00nOiByZXR1cm4gYWNjZXNzb3IobmV3IE1vbnN0ZXIoKSk7CisgICAgICAgIGNhc2UgJ1RTJzogcmV0dXJuIGFjY2Vzc29yKG5ldyBUZXN0U2ltcGxlVGFibGVXaXRoRW51bSgpKTsKKyAgICAgICAgY2FzZSAnTTInOiByZXR1cm4gYWNjZXNzb3IobmV3IE15R2FtZV9FeGFtcGxlMl9Nb25zdGVyKCkpOworICAgICAgICBkZWZhdWx0OiByZXR1cm4gbnVsbDsKKyAgICB9Cit9CitleHBvcnQgZnVuY3Rpb24gdW5pb25MaXN0VG9BbnlVbmlxdWVBbGlhc2VzKHR5cGUsIGFjY2Vzc29yLCBpbmRleCkgeworICAgIHN3aXRjaCAoQW55VW5pcXVlQWxpYXNlc1t0eXBlXSkgeworICAgICAgICBjYXNlICdOT05FJzogcmV0dXJuIG51bGw7CisgICAgICAgIGNhc2UgJ00nOiByZXR1cm4gYWNjZXNzb3IoaW5kZXgsIG5ldyBNb25zdGVyKCkpOworICAgICAgICBjYXNlICdUUyc6IHJldHVybiBhY2Nlc3NvcihpbmRleCwgbmV3IFRlc3RTaW1wbGVUYWJsZVdpdGhFbnVtKCkpOworICAgICAgICBjYXNlICdNMic6IHJldHVybiBhY2Nlc3NvcihpbmRleCwgbmV3IE15R2FtZV9FeGFtcGxlMl9Nb25zdGVyKCkpOworICAgICAgICBkZWZhdWx0OiByZXR1cm4gbnVsbDsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy90cy9teS1nYW1lL2V4YW1wbGUvYW55LXVuaXF1ZS1hbGlhc2VzLnRzIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvdHMvbXktZ2FtZS9leGFtcGxlL2FueS11bmlxdWUtYWxpYXNlcy50cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNmFhMzc4Ci0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvdHMvbXktZ2FtZS9leGFtcGxlL2FueS11bmlxdWUtYWxpYXNlcy50cwpAQCAtMCwwICsxLDQwIEBACisvLyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBieSB0aGUgRmxhdEJ1ZmZlcnMgY29tcGlsZXIsIGRvIG5vdCBtb2RpZnkKKworaW1wb3J0IHsgTW9uc3RlciBhcyBNeUdhbWVfRXhhbXBsZTJfTW9uc3RlciwgTW9uc3RlclQgYXMgTXlHYW1lX0V4YW1wbGUyX01vbnN0ZXJUIH0gZnJvbSAnLi4vLi4vbXktZ2FtZS9leGFtcGxlMi9tb25zdGVyLmpzJzsKK2ltcG9ydCB7IE1vbnN0ZXIsIE1vbnN0ZXJUIH0gZnJvbSAnLi4vLi4vbXktZ2FtZS9leGFtcGxlL21vbnN0ZXIuanMnOworaW1wb3J0IHsgVGVzdFNpbXBsZVRhYmxlV2l0aEVudW0sIFRlc3RTaW1wbGVUYWJsZVdpdGhFbnVtVCB9IGZyb20gJy4uLy4uL215LWdhbWUvZXhhbXBsZS90ZXN0LXNpbXBsZS10YWJsZS13aXRoLWVudW0uanMnOworCisKK2V4cG9ydCBlbnVtIEFueVVuaXF1ZUFsaWFzZXMgeworICBOT05FID0gMCwKKyAgTSA9IDEsCisgIFRTID0gMiwKKyAgTTIgPSAzCit9CisKK2V4cG9ydCBmdW5jdGlvbiB1bmlvblRvQW55VW5pcXVlQWxpYXNlcygKKyAgdHlwZTogQW55VW5pcXVlQWxpYXNlcywKKyAgYWNjZXNzb3I6IChvYmo6TW9uc3RlcnxNeUdhbWVfRXhhbXBsZTJfTW9uc3RlcnxUZXN0U2ltcGxlVGFibGVXaXRoRW51bSkgPT4gTW9uc3RlcnxNeUdhbWVfRXhhbXBsZTJfTW9uc3RlcnxUZXN0U2ltcGxlVGFibGVXaXRoRW51bXxudWxsCispOiBNb25zdGVyfE15R2FtZV9FeGFtcGxlMl9Nb25zdGVyfFRlc3RTaW1wbGVUYWJsZVdpdGhFbnVtfG51bGwgeworICBzd2l0Y2goQW55VW5pcXVlQWxpYXNlc1t0eXBlXSkgeworICAgIGNhc2UgJ05PTkUnOiByZXR1cm4gbnVsbDsgCisgICAgY2FzZSAnTSc6IHJldHVybiBhY2Nlc3NvcihuZXcgTW9uc3RlcigpKSEgYXMgTW9uc3RlcjsKKyAgICBjYXNlICdUUyc6IHJldHVybiBhY2Nlc3NvcihuZXcgVGVzdFNpbXBsZVRhYmxlV2l0aEVudW0oKSkhIGFzIFRlc3RTaW1wbGVUYWJsZVdpdGhFbnVtOworICAgIGNhc2UgJ00yJzogcmV0dXJuIGFjY2Vzc29yKG5ldyBNeUdhbWVfRXhhbXBsZTJfTW9uc3RlcigpKSEgYXMgTXlHYW1lX0V4YW1wbGUyX01vbnN0ZXI7CisgICAgZGVmYXVsdDogcmV0dXJuIG51bGw7CisgIH0KK30KKworZXhwb3J0IGZ1bmN0aW9uIHVuaW9uTGlzdFRvQW55VW5pcXVlQWxpYXNlcygKKyAgdHlwZTogQW55VW5pcXVlQWxpYXNlcywgCisgIGFjY2Vzc29yOiAoaW5kZXg6IG51bWJlciwgb2JqOk1vbnN0ZXJ8TXlHYW1lX0V4YW1wbGUyX01vbnN0ZXJ8VGVzdFNpbXBsZVRhYmxlV2l0aEVudW0pID0+IE1vbnN0ZXJ8TXlHYW1lX0V4YW1wbGUyX01vbnN0ZXJ8VGVzdFNpbXBsZVRhYmxlV2l0aEVudW18bnVsbCwgCisgIGluZGV4OiBudW1iZXIKKyk6IE1vbnN0ZXJ8TXlHYW1lX0V4YW1wbGUyX01vbnN0ZXJ8VGVzdFNpbXBsZVRhYmxlV2l0aEVudW18bnVsbCB7CisgIHN3aXRjaChBbnlVbmlxdWVBbGlhc2VzW3R5cGVdKSB7CisgICAgY2FzZSAnTk9ORSc6IHJldHVybiBudWxsOyAKKyAgICBjYXNlICdNJzogcmV0dXJuIGFjY2Vzc29yKGluZGV4LCBuZXcgTW9uc3RlcigpKSEgYXMgTW9uc3RlcjsKKyAgICBjYXNlICdUUyc6IHJldHVybiBhY2Nlc3NvcihpbmRleCwgbmV3IFRlc3RTaW1wbGVUYWJsZVdpdGhFbnVtKCkpISBhcyBUZXN0U2ltcGxlVGFibGVXaXRoRW51bTsKKyAgICBjYXNlICdNMic6IHJldHVybiBhY2Nlc3NvcihpbmRleCwgbmV3IE15R2FtZV9FeGFtcGxlMl9Nb25zdGVyKCkpISBhcyBNeUdhbWVfRXhhbXBsZTJfTW9uc3RlcjsKKyAgICBkZWZhdWx0OiByZXR1cm4gbnVsbDsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvdHMvbXktZ2FtZS9leGFtcGxlL2FueS5qcyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL3RzL215LWdhbWUvZXhhbXBsZS9hbnkuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjdiZThmNAotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL3RzL215LWdhbWUvZXhhbXBsZS9hbnkuanMKQEAgLTAsMCArMSwyOSBAQAorLy8gYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgYnkgdGhlIEZsYXRCdWZmZXJzIGNvbXBpbGVyLCBkbyBub3QgbW9kaWZ5CitpbXBvcnQgeyBNb25zdGVyIGFzIE15R2FtZV9FeGFtcGxlMl9Nb25zdGVyIH0gZnJvbSAnLi4vLi4vbXktZ2FtZS9leGFtcGxlMi9tb25zdGVyLmpzJzsKK2ltcG9ydCB7IE1vbnN0ZXIgfSBmcm9tICcuLi8uLi9teS1nYW1lL2V4YW1wbGUvbW9uc3Rlci5qcyc7CitpbXBvcnQgeyBUZXN0U2ltcGxlVGFibGVXaXRoRW51bSB9IGZyb20gJy4uLy4uL215LWdhbWUvZXhhbXBsZS90ZXN0LXNpbXBsZS10YWJsZS13aXRoLWVudW0uanMnOworZXhwb3J0IHZhciBBbnk7CisoZnVuY3Rpb24gKEFueSkgeworICAgIEFueVtBbnlbIk5PTkUiXSA9IDBdID0gIk5PTkUiOworICAgIEFueVtBbnlbIk1vbnN0ZXIiXSA9IDFdID0gIk1vbnN0ZXIiOworICAgIEFueVtBbnlbIlRlc3RTaW1wbGVUYWJsZVdpdGhFbnVtIl0gPSAyXSA9ICJUZXN0U2ltcGxlVGFibGVXaXRoRW51bSI7CisgICAgQW55W0FueVsiTXlHYW1lX0V4YW1wbGUyX01vbnN0ZXIiXSA9IDNdID0gIk15R2FtZV9FeGFtcGxlMl9Nb25zdGVyIjsKK30pKEFueSB8fCAoQW55ID0ge30pKTsKK2V4cG9ydCBmdW5jdGlvbiB1bmlvblRvQW55KHR5cGUsIGFjY2Vzc29yKSB7CisgICAgc3dpdGNoIChBbnlbdHlwZV0pIHsKKyAgICAgICAgY2FzZSAnTk9ORSc6IHJldHVybiBudWxsOworICAgICAgICBjYXNlICdNb25zdGVyJzogcmV0dXJuIGFjY2Vzc29yKG5ldyBNb25zdGVyKCkpOworICAgICAgICBjYXNlICdUZXN0U2ltcGxlVGFibGVXaXRoRW51bSc6IHJldHVybiBhY2Nlc3NvcihuZXcgVGVzdFNpbXBsZVRhYmxlV2l0aEVudW0oKSk7CisgICAgICAgIGNhc2UgJ015R2FtZV9FeGFtcGxlMl9Nb25zdGVyJzogcmV0dXJuIGFjY2Vzc29yKG5ldyBNeUdhbWVfRXhhbXBsZTJfTW9uc3RlcigpKTsKKyAgICAgICAgZGVmYXVsdDogcmV0dXJuIG51bGw7CisgICAgfQorfQorZXhwb3J0IGZ1bmN0aW9uIHVuaW9uTGlzdFRvQW55KHR5cGUsIGFjY2Vzc29yLCBpbmRleCkgeworICAgIHN3aXRjaCAoQW55W3R5cGVdKSB7CisgICAgICAgIGNhc2UgJ05PTkUnOiByZXR1cm4gbnVsbDsKKyAgICAgICAgY2FzZSAnTW9uc3Rlcic6IHJldHVybiBhY2Nlc3NvcihpbmRleCwgbmV3IE1vbnN0ZXIoKSk7CisgICAgICAgIGNhc2UgJ1Rlc3RTaW1wbGVUYWJsZVdpdGhFbnVtJzogcmV0dXJuIGFjY2Vzc29yKGluZGV4LCBuZXcgVGVzdFNpbXBsZVRhYmxlV2l0aEVudW0oKSk7CisgICAgICAgIGNhc2UgJ015R2FtZV9FeGFtcGxlMl9Nb25zdGVyJzogcmV0dXJuIGFjY2Vzc29yKGluZGV4LCBuZXcgTXlHYW1lX0V4YW1wbGUyX01vbnN0ZXIoKSk7CisgICAgICAgIGRlZmF1bHQ6IHJldHVybiBudWxsOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL3RzL215LWdhbWUvZXhhbXBsZS9hbnkudHMgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy90cy9teS1nYW1lL2V4YW1wbGUvYW55LnRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRlMWNiZmQKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy90cy9teS1nYW1lL2V4YW1wbGUvYW55LnRzCkBAIC0wLDAgKzEsNDAgQEAKKy8vIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGJ5IHRoZSBGbGF0QnVmZmVycyBjb21waWxlciwgZG8gbm90IG1vZGlmeQorCitpbXBvcnQgeyBNb25zdGVyIGFzIE15R2FtZV9FeGFtcGxlMl9Nb25zdGVyLCBNb25zdGVyVCBhcyBNeUdhbWVfRXhhbXBsZTJfTW9uc3RlclQgfSBmcm9tICcuLi8uLi9teS1nYW1lL2V4YW1wbGUyL21vbnN0ZXIuanMnOworaW1wb3J0IHsgTW9uc3RlciwgTW9uc3RlclQgfSBmcm9tICcuLi8uLi9teS1nYW1lL2V4YW1wbGUvbW9uc3Rlci5qcyc7CitpbXBvcnQgeyBUZXN0U2ltcGxlVGFibGVXaXRoRW51bSwgVGVzdFNpbXBsZVRhYmxlV2l0aEVudW1UIH0gZnJvbSAnLi4vLi4vbXktZ2FtZS9leGFtcGxlL3Rlc3Qtc2ltcGxlLXRhYmxlLXdpdGgtZW51bS5qcyc7CisKKworZXhwb3J0IGVudW0gQW55IHsKKyAgTk9ORSA9IDAsCisgIE1vbnN0ZXIgPSAxLAorICBUZXN0U2ltcGxlVGFibGVXaXRoRW51bSA9IDIsCisgIE15R2FtZV9FeGFtcGxlMl9Nb25zdGVyID0gMworfQorCitleHBvcnQgZnVuY3Rpb24gdW5pb25Ub0FueSgKKyAgdHlwZTogQW55LAorICBhY2Nlc3NvcjogKG9iajpNb25zdGVyfE15R2FtZV9FeGFtcGxlMl9Nb25zdGVyfFRlc3RTaW1wbGVUYWJsZVdpdGhFbnVtKSA9PiBNb25zdGVyfE15R2FtZV9FeGFtcGxlMl9Nb25zdGVyfFRlc3RTaW1wbGVUYWJsZVdpdGhFbnVtfG51bGwKKyk6IE1vbnN0ZXJ8TXlHYW1lX0V4YW1wbGUyX01vbnN0ZXJ8VGVzdFNpbXBsZVRhYmxlV2l0aEVudW18bnVsbCB7CisgIHN3aXRjaChBbnlbdHlwZV0pIHsKKyAgICBjYXNlICdOT05FJzogcmV0dXJuIG51bGw7IAorICAgIGNhc2UgJ01vbnN0ZXInOiByZXR1cm4gYWNjZXNzb3IobmV3IE1vbnN0ZXIoKSkhIGFzIE1vbnN0ZXI7CisgICAgY2FzZSAnVGVzdFNpbXBsZVRhYmxlV2l0aEVudW0nOiByZXR1cm4gYWNjZXNzb3IobmV3IFRlc3RTaW1wbGVUYWJsZVdpdGhFbnVtKCkpISBhcyBUZXN0U2ltcGxlVGFibGVXaXRoRW51bTsKKyAgICBjYXNlICdNeUdhbWVfRXhhbXBsZTJfTW9uc3Rlcic6IHJldHVybiBhY2Nlc3NvcihuZXcgTXlHYW1lX0V4YW1wbGUyX01vbnN0ZXIoKSkhIGFzIE15R2FtZV9FeGFtcGxlMl9Nb25zdGVyOworICAgIGRlZmF1bHQ6IHJldHVybiBudWxsOworICB9Cit9CisKK2V4cG9ydCBmdW5jdGlvbiB1bmlvbkxpc3RUb0FueSgKKyAgdHlwZTogQW55LCAKKyAgYWNjZXNzb3I6IChpbmRleDogbnVtYmVyLCBvYmo6TW9uc3RlcnxNeUdhbWVfRXhhbXBsZTJfTW9uc3RlcnxUZXN0U2ltcGxlVGFibGVXaXRoRW51bSkgPT4gTW9uc3RlcnxNeUdhbWVfRXhhbXBsZTJfTW9uc3RlcnxUZXN0U2ltcGxlVGFibGVXaXRoRW51bXxudWxsLCAKKyAgaW5kZXg6IG51bWJlcgorKTogTW9uc3RlcnxNeUdhbWVfRXhhbXBsZTJfTW9uc3RlcnxUZXN0U2ltcGxlVGFibGVXaXRoRW51bXxudWxsIHsKKyAgc3dpdGNoKEFueVt0eXBlXSkgeworICAgIGNhc2UgJ05PTkUnOiByZXR1cm4gbnVsbDsgCisgICAgY2FzZSAnTW9uc3Rlcic6IHJldHVybiBhY2Nlc3NvcihpbmRleCwgbmV3IE1vbnN0ZXIoKSkhIGFzIE1vbnN0ZXI7CisgICAgY2FzZSAnVGVzdFNpbXBsZVRhYmxlV2l0aEVudW0nOiByZXR1cm4gYWNjZXNzb3IoaW5kZXgsIG5ldyBUZXN0U2ltcGxlVGFibGVXaXRoRW51bSgpKSEgYXMgVGVzdFNpbXBsZVRhYmxlV2l0aEVudW07CisgICAgY2FzZSAnTXlHYW1lX0V4YW1wbGUyX01vbnN0ZXInOiByZXR1cm4gYWNjZXNzb3IoaW5kZXgsIG5ldyBNeUdhbWVfRXhhbXBsZTJfTW9uc3RlcigpKSEgYXMgTXlHYW1lX0V4YW1wbGUyX01vbnN0ZXI7CisgICAgZGVmYXVsdDogcmV0dXJuIG51bGw7CisgIH0KK30KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL3RzL215LWdhbWUvZXhhbXBsZS9jb2xvci5qcyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL3RzL215LWdhbWUvZXhhbXBsZS9jb2xvci5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOTVmNzVlCi0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvdHMvbXktZ2FtZS9leGFtcGxlL2NvbG9yLmpzCkBAIC0wLDAgKzEsMTcgQEAKKy8vIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGJ5IHRoZSBGbGF0QnVmZmVycyBjb21waWxlciwgZG8gbm90IG1vZGlmeQorLyoqCisgKiBDb21wb3NpdGUgY29tcG9uZW50cyBvZiBNb25zdGVyIGNvbG9yLgorICovCitleHBvcnQgdmFyIENvbG9yOworKGZ1bmN0aW9uIChDb2xvcikgeworICAgIENvbG9yW0NvbG9yWyJSZWQiXSA9IDFdID0gIlJlZCI7CisgICAgLyoqCisgICAgICogXGJyaWVmIGNvbG9yIEdyZWVuCisgICAgICogR3JlZW4gaXMgYml0X2ZsYWcgd2l0aCB2YWx1ZSAoMXUgPDwgMSkKKyAgICAgKi8KKyAgICBDb2xvcltDb2xvclsiR3JlZW4iXSA9IDJdID0gIkdyZWVuIjsKKyAgICAvKioKKyAgICAgKiBcYnJpZWYgY29sb3IgQmx1ZSAoMXUgPDwgMykKKyAgICAgKi8KKyAgICBDb2xvcltDb2xvclsiQmx1ZSJdID0gOF0gPSAiQmx1ZSI7Cit9KShDb2xvciB8fCAoQ29sb3IgPSB7fSkpOwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvdHMvbXktZ2FtZS9leGFtcGxlL2NvbG9yLnRzIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvdHMvbXktZ2FtZS9leGFtcGxlL2NvbG9yLnRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhjZTU4ZGEKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy90cy9teS1nYW1lL2V4YW1wbGUvY29sb3IudHMKQEAgLTAsMCArMSwxOSBAQAorLy8gYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgYnkgdGhlIEZsYXRCdWZmZXJzIGNvbXBpbGVyLCBkbyBub3QgbW9kaWZ5CisKKy8qKgorICogQ29tcG9zaXRlIGNvbXBvbmVudHMgb2YgTW9uc3RlciBjb2xvci4KKyAqLworZXhwb3J0IGVudW0gQ29sb3IgeworICBSZWQgPSAxLAorCisgIC8qKgorICAgKiBcYnJpZWYgY29sb3IgR3JlZW4KKyAgICogR3JlZW4gaXMgYml0X2ZsYWcgd2l0aCB2YWx1ZSAoMXUgPDwgMSkKKyAgICovCisgIEdyZWVuID0gMiwKKworICAvKioKKyAgICogXGJyaWVmIGNvbG9yIEJsdWUgKDF1IDw8IDMpCisgICAqLworICBCbHVlID0gOAorfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvdHMvbXktZ2FtZS9leGFtcGxlL2xvbmctZW51bS5qcyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL3RzL215LWdhbWUvZXhhbXBsZS9sb25nLWVudW0uanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDQwZDhhNgotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL3RzL215LWdhbWUvZXhhbXBsZS9sb25nLWVudW0uanMKQEAgLTAsMCArMSw3IEBACisvLyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBieSB0aGUgRmxhdEJ1ZmZlcnMgY29tcGlsZXIsIGRvIG5vdCBtb2RpZnkKK2V4cG9ydCB2YXIgTG9uZ0VudW07CisoZnVuY3Rpb24gKExvbmdFbnVtKSB7CisgICAgTG9uZ0VudW1bIkxvbmdPbmUiXSA9ICIyIjsKKyAgICBMb25nRW51bVsiTG9uZ1R3byJdID0gIjQiOworICAgIExvbmdFbnVtWyJMb25nQmlnIl0gPSAiMTA5OTUxMTYyNzc3NiI7Cit9KShMb25nRW51bSB8fCAoTG9uZ0VudW0gPSB7fSkpOwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvdHMvbXktZ2FtZS9leGFtcGxlL2xvbmctZW51bS50cyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL3RzL215LWdhbWUvZXhhbXBsZS9sb25nLWVudW0udHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzFlYTE4OAotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL3RzL215LWdhbWUvZXhhbXBsZS9sb25nLWVudW0udHMKQEAgLTAsMCArMSw3IEBACisvLyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBieSB0aGUgRmxhdEJ1ZmZlcnMgY29tcGlsZXIsIGRvIG5vdCBtb2RpZnkKKworZXhwb3J0IGVudW0gTG9uZ0VudW0geworICBMb25nT25lID0gJzInLAorICBMb25nVHdvID0gJzQnLAorICBMb25nQmlnID0gJzEwOTk1MTE2Mjc3NzYnCit9CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy90cy9teS1nYW1lL2V4YW1wbGUvbW9uc3Rlci5qcyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL3RzL215LWdhbWUvZXhhbXBsZS9tb25zdGVyLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU0ZWY5NzAKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy90cy9teS1nYW1lL2V4YW1wbGUvbW9uc3Rlci5qcwpAQCAtMCwwICsxLDExMjUgQEAKKy8vIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGJ5IHRoZSBGbGF0QnVmZmVycyBjb21waWxlciwgZG8gbm90IG1vZGlmeQoraW1wb3J0ICogYXMgZmxhdGJ1ZmZlcnMgZnJvbSAnZmxhdGJ1ZmZlcnMnOworaW1wb3J0IHsgQWJpbGl0eSB9IGZyb20gJy4uLy4uL215LWdhbWUvZXhhbXBsZS9hYmlsaXR5LmpzJzsKK2ltcG9ydCB7IEFueSwgdW5pb25Ub0FueSB9IGZyb20gJy4uLy4uL215LWdhbWUvZXhhbXBsZS9hbnkuanMnOworaW1wb3J0IHsgQW55QW1iaWd1b3VzQWxpYXNlcywgdW5pb25Ub0FueUFtYmlndW91c0FsaWFzZXMgfSBmcm9tICcuLi8uLi9teS1nYW1lL2V4YW1wbGUvYW55LWFtYmlndW91cy1hbGlhc2VzLmpzJzsKK2ltcG9ydCB7IEFueVVuaXF1ZUFsaWFzZXMsIHVuaW9uVG9BbnlVbmlxdWVBbGlhc2VzIH0gZnJvbSAnLi4vLi4vbXktZ2FtZS9leGFtcGxlL2FueS11bmlxdWUtYWxpYXNlcy5qcyc7CitpbXBvcnQgeyBDb2xvciB9IGZyb20gJy4uLy4uL215LWdhbWUvZXhhbXBsZS9jb2xvci5qcyc7CitpbXBvcnQgeyBSYWNlIH0gZnJvbSAnLi4vLi4vbXktZ2FtZS9leGFtcGxlL3JhY2UuanMnOworaW1wb3J0IHsgUmVmZXJyYWJsZSB9IGZyb20gJy4uLy4uL215LWdhbWUvZXhhbXBsZS9yZWZlcnJhYmxlLmpzJzsKK2ltcG9ydCB7IFN0YXQgfSBmcm9tICcuLi8uLi9teS1nYW1lL2V4YW1wbGUvc3RhdC5qcyc7CitpbXBvcnQgeyBUZXN0IH0gZnJvbSAnLi4vLi4vbXktZ2FtZS9leGFtcGxlL3Rlc3QuanMnOworaW1wb3J0IHsgVmVjMyB9IGZyb20gJy4uLy4uL215LWdhbWUvZXhhbXBsZS92ZWMzLmpzJzsKK2ltcG9ydCB7IEluUGFyZW50TmFtZXNwYWNlIH0gZnJvbSAnLi4vLi4vbXktZ2FtZS9pbi1wYXJlbnQtbmFtZXNwYWNlLmpzJzsKKy8qKgorICogYW4gZXhhbXBsZSBkb2N1bWVudGF0aW9uIGNvbW1lbnQ6ICJtb25zdGVyIG9iamVjdCIKKyAqLworZXhwb3J0IGNsYXNzIE1vbnN0ZXIgeworICAgIGNvbnN0cnVjdG9yKCkgeworICAgICAgICB0aGlzLmJiID0gbnVsbDsKKyAgICAgICAgdGhpcy5iYl9wb3MgPSAwOworICAgIH0KKyAgICBfX2luaXQoaSwgYmIpIHsKKyAgICAgICAgdGhpcy5iYl9wb3MgPSBpOworICAgICAgICB0aGlzLmJiID0gYmI7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKyAgICBzdGF0aWMgZ2V0Um9vdEFzTW9uc3RlcihiYiwgb2JqKSB7CisgICAgICAgIHJldHVybiAob2JqIHx8IG5ldyBNb25zdGVyKCkpLl9faW5pdChiYi5yZWFkSW50MzIoYmIucG9zaXRpb24oKSkgKyBiYi5wb3NpdGlvbigpLCBiYik7CisgICAgfQorICAgIHN0YXRpYyBnZXRTaXplUHJlZml4ZWRSb290QXNNb25zdGVyKGJiLCBvYmopIHsKKyAgICAgICAgYmIuc2V0UG9zaXRpb24oYmIucG9zaXRpb24oKSArIGZsYXRidWZmZXJzLlNJWkVfUFJFRklYX0xFTkdUSCk7CisgICAgICAgIHJldHVybiAob2JqIHx8IG5ldyBNb25zdGVyKCkpLl9faW5pdChiYi5yZWFkSW50MzIoYmIucG9zaXRpb24oKSkgKyBiYi5wb3NpdGlvbigpLCBiYik7CisgICAgfQorICAgIHN0YXRpYyBidWZmZXJIYXNJZGVudGlmaWVyKGJiKSB7CisgICAgICAgIHJldHVybiBiYi5fX2hhc19pZGVudGlmaWVyKCdNT05TJyk7CisgICAgfQorICAgIHBvcyhvYmopIHsKKyAgICAgICAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywgNCk7CisgICAgICAgIHJldHVybiBvZmZzZXQgPyAob2JqIHx8IG5ldyBWZWMzKCkpLl9faW5pdCh0aGlzLmJiX3BvcyArIG9mZnNldCwgdGhpcy5iYikgOiBudWxsOworICAgIH0KKyAgICBtYW5hKCkgeworICAgICAgICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCA2KTsKKyAgICAgICAgcmV0dXJuIG9mZnNldCA/IHRoaXMuYmIucmVhZEludDE2KHRoaXMuYmJfcG9zICsgb2Zmc2V0KSA6IDE1MDsKKyAgICB9CisgICAgbXV0YXRlX21hbmEodmFsdWUpIHsKKyAgICAgICAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywgNik7CisgICAgICAgIGlmIChvZmZzZXQgPT09IDApIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICB0aGlzLmJiLndyaXRlSW50MTYodGhpcy5iYl9wb3MgKyBvZmZzZXQsIHZhbHVlKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIGhwKCkgeworICAgICAgICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCA4KTsKKyAgICAgICAgcmV0dXJuIG9mZnNldCA/IHRoaXMuYmIucmVhZEludDE2KHRoaXMuYmJfcG9zICsgb2Zmc2V0KSA6IDEwMDsKKyAgICB9CisgICAgbXV0YXRlX2hwKHZhbHVlKSB7CisgICAgICAgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsIDgpOworICAgICAgICBpZiAob2Zmc2V0ID09PSAwKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgdGhpcy5iYi53cml0ZUludDE2KHRoaXMuYmJfcG9zICsgb2Zmc2V0LCB2YWx1ZSk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICBuYW1lKG9wdGlvbmFsRW5jb2RpbmcpIHsKKyAgICAgICAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywgMTApOworICAgICAgICByZXR1cm4gb2Zmc2V0ID8gdGhpcy5iYi5fX3N0cmluZyh0aGlzLmJiX3BvcyArIG9mZnNldCwgb3B0aW9uYWxFbmNvZGluZykgOiBudWxsOworICAgIH0KKyAgICBpbnZlbnRvcnkoaW5kZXgpIHsKKyAgICAgICAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywgMTQpOworICAgICAgICByZXR1cm4gb2Zmc2V0ID8gdGhpcy5iYi5yZWFkVWludDgodGhpcy5iYi5fX3ZlY3Rvcih0aGlzLmJiX3BvcyArIG9mZnNldCkgKyBpbmRleCkgOiAwOworICAgIH0KKyAgICBpbnZlbnRvcnlMZW5ndGgoKSB7CisgICAgICAgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsIDE0KTsKKyAgICAgICAgcmV0dXJuIG9mZnNldCA/IHRoaXMuYmIuX192ZWN0b3JfbGVuKHRoaXMuYmJfcG9zICsgb2Zmc2V0KSA6IDA7CisgICAgfQorICAgIGludmVudG9yeUFycmF5KCkgeworICAgICAgICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCAxNCk7CisgICAgICAgIHJldHVybiBvZmZzZXQgPyBuZXcgVWludDhBcnJheSh0aGlzLmJiLmJ5dGVzKCkuYnVmZmVyLCB0aGlzLmJiLmJ5dGVzKCkuYnl0ZU9mZnNldCArIHRoaXMuYmIuX192ZWN0b3IodGhpcy5iYl9wb3MgKyBvZmZzZXQpLCB0aGlzLmJiLl9fdmVjdG9yX2xlbih0aGlzLmJiX3BvcyArIG9mZnNldCkpIDogbnVsbDsKKyAgICB9CisgICAgY29sb3IoKSB7CisgICAgICAgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsIDE2KTsKKyAgICAgICAgcmV0dXJuIG9mZnNldCA/IHRoaXMuYmIucmVhZFVpbnQ4KHRoaXMuYmJfcG9zICsgb2Zmc2V0KSA6IENvbG9yLkJsdWU7CisgICAgfQorICAgIG11dGF0ZV9jb2xvcih2YWx1ZSkgeworICAgICAgICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCAxNik7CisgICAgICAgIGlmIChvZmZzZXQgPT09IDApIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICB0aGlzLmJiLndyaXRlVWludDgodGhpcy5iYl9wb3MgKyBvZmZzZXQsIHZhbHVlKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIHRlc3RUeXBlKCkgeworICAgICAgICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCAxOCk7CisgICAgICAgIHJldHVybiBvZmZzZXQgPyB0aGlzLmJiLnJlYWRVaW50OCh0aGlzLmJiX3BvcyArIG9mZnNldCkgOiBBbnkuTk9ORTsKKyAgICB9CisgICAgdGVzdChvYmopIHsKKyAgICAgICAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywgMjApOworICAgICAgICByZXR1cm4gb2Zmc2V0ID8gdGhpcy5iYi5fX3VuaW9uKG9iaiwgdGhpcy5iYl9wb3MgKyBvZmZzZXQpIDogbnVsbDsKKyAgICB9CisgICAgdGVzdDQoaW5kZXgsIG9iaikgeworICAgICAgICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCAyMik7CisgICAgICAgIHJldHVybiBvZmZzZXQgPyAob2JqIHx8IG5ldyBUZXN0KCkpLl9faW5pdCh0aGlzLmJiLl9fdmVjdG9yKHRoaXMuYmJfcG9zICsgb2Zmc2V0KSArIGluZGV4ICogNCwgdGhpcy5iYikgOiBudWxsOworICAgIH0KKyAgICB0ZXN0NExlbmd0aCgpIHsKKyAgICAgICAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywgMjIpOworICAgICAgICByZXR1cm4gb2Zmc2V0ID8gdGhpcy5iYi5fX3ZlY3Rvcl9sZW4odGhpcy5iYl9wb3MgKyBvZmZzZXQpIDogMDsKKyAgICB9CisgICAgdGVzdGFycmF5b2ZzdHJpbmcoaW5kZXgsIG9wdGlvbmFsRW5jb2RpbmcpIHsKKyAgICAgICAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywgMjQpOworICAgICAgICByZXR1cm4gb2Zmc2V0ID8gdGhpcy5iYi5fX3N0cmluZyh0aGlzLmJiLl9fdmVjdG9yKHRoaXMuYmJfcG9zICsgb2Zmc2V0KSArIGluZGV4ICogNCwgb3B0aW9uYWxFbmNvZGluZykgOiBudWxsOworICAgIH0KKyAgICB0ZXN0YXJyYXlvZnN0cmluZ0xlbmd0aCgpIHsKKyAgICAgICAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywgMjQpOworICAgICAgICByZXR1cm4gb2Zmc2V0ID8gdGhpcy5iYi5fX3ZlY3Rvcl9sZW4odGhpcy5iYl9wb3MgKyBvZmZzZXQpIDogMDsKKyAgICB9CisgICAgLyoqCisgICAgICogYW4gZXhhbXBsZSBkb2N1bWVudGF0aW9uIGNvbW1lbnQ6IHRoaXMgd2lsbCBlbmQgdXAgaW4gdGhlIGdlbmVyYXRlZCBjb2RlCisgICAgICogbXVsdGlsaW5lIHRvbworICAgICAqLworICAgIHRlc3RhcnJheW9mdGFibGVzKGluZGV4LCBvYmopIHsKKyAgICAgICAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywgMjYpOworICAgICAgICByZXR1cm4gb2Zmc2V0ID8gKG9iaiB8fCBuZXcgTW9uc3RlcigpKS5fX2luaXQodGhpcy5iYi5fX2luZGlyZWN0KHRoaXMuYmIuX192ZWN0b3IodGhpcy5iYl9wb3MgKyBvZmZzZXQpICsgaW5kZXggKiA0KSwgdGhpcy5iYikgOiBudWxsOworICAgIH0KKyAgICB0ZXN0YXJyYXlvZnRhYmxlc0xlbmd0aCgpIHsKKyAgICAgICAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywgMjYpOworICAgICAgICByZXR1cm4gb2Zmc2V0ID8gdGhpcy5iYi5fX3ZlY3Rvcl9sZW4odGhpcy5iYl9wb3MgKyBvZmZzZXQpIDogMDsKKyAgICB9CisgICAgZW5lbXkob2JqKSB7CisgICAgICAgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsIDI4KTsKKyAgICAgICAgcmV0dXJuIG9mZnNldCA/IChvYmogfHwgbmV3IE1vbnN0ZXIoKSkuX19pbml0KHRoaXMuYmIuX19pbmRpcmVjdCh0aGlzLmJiX3BvcyArIG9mZnNldCksIHRoaXMuYmIpIDogbnVsbDsKKyAgICB9CisgICAgdGVzdG5lc3RlZGZsYXRidWZmZXIoaW5kZXgpIHsKKyAgICAgICAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywgMzApOworICAgICAgICByZXR1cm4gb2Zmc2V0ID8gdGhpcy5iYi5yZWFkVWludDgodGhpcy5iYi5fX3ZlY3Rvcih0aGlzLmJiX3BvcyArIG9mZnNldCkgKyBpbmRleCkgOiAwOworICAgIH0KKyAgICB0ZXN0bmVzdGVkZmxhdGJ1ZmZlckxlbmd0aCgpIHsKKyAgICAgICAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywgMzApOworICAgICAgICByZXR1cm4gb2Zmc2V0ID8gdGhpcy5iYi5fX3ZlY3Rvcl9sZW4odGhpcy5iYl9wb3MgKyBvZmZzZXQpIDogMDsKKyAgICB9CisgICAgdGVzdG5lc3RlZGZsYXRidWZmZXJBcnJheSgpIHsKKyAgICAgICAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywgMzApOworICAgICAgICByZXR1cm4gb2Zmc2V0ID8gbmV3IFVpbnQ4QXJyYXkodGhpcy5iYi5ieXRlcygpLmJ1ZmZlciwgdGhpcy5iYi5ieXRlcygpLmJ5dGVPZmZzZXQgKyB0aGlzLmJiLl9fdmVjdG9yKHRoaXMuYmJfcG9zICsgb2Zmc2V0KSwgdGhpcy5iYi5fX3ZlY3Rvcl9sZW4odGhpcy5iYl9wb3MgKyBvZmZzZXQpKSA6IG51bGw7CisgICAgfQorICAgIHRlc3RlbXB0eShvYmopIHsKKyAgICAgICAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywgMzIpOworICAgICAgICByZXR1cm4gb2Zmc2V0ID8gKG9iaiB8fCBuZXcgU3RhdCgpKS5fX2luaXQodGhpcy5iYi5fX2luZGlyZWN0KHRoaXMuYmJfcG9zICsgb2Zmc2V0KSwgdGhpcy5iYikgOiBudWxsOworICAgIH0KKyAgICB0ZXN0Ym9vbCgpIHsKKyAgICAgICAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywgMzQpOworICAgICAgICByZXR1cm4gb2Zmc2V0ID8gISF0aGlzLmJiLnJlYWRJbnQ4KHRoaXMuYmJfcG9zICsgb2Zmc2V0KSA6IGZhbHNlOworICAgIH0KKyAgICBtdXRhdGVfdGVzdGJvb2wodmFsdWUpIHsKKyAgICAgICAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywgMzQpOworICAgICAgICBpZiAob2Zmc2V0ID09PSAwKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgdGhpcy5iYi53cml0ZUludDgodGhpcy5iYl9wb3MgKyBvZmZzZXQsICt2YWx1ZSk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICB0ZXN0aGFzaHMzMkZudjEoKSB7CisgICAgICAgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsIDM2KTsKKyAgICAgICAgcmV0dXJuIG9mZnNldCA/IHRoaXMuYmIucmVhZEludDMyKHRoaXMuYmJfcG9zICsgb2Zmc2V0KSA6IDA7CisgICAgfQorICAgIG11dGF0ZV90ZXN0aGFzaHMzMl9mbnYxKHZhbHVlKSB7CisgICAgICAgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsIDM2KTsKKyAgICAgICAgaWYgKG9mZnNldCA9PT0gMCkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIHRoaXMuYmIud3JpdGVJbnQzMih0aGlzLmJiX3BvcyArIG9mZnNldCwgdmFsdWUpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgdGVzdGhhc2h1MzJGbnYxKCkgeworICAgICAgICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCAzOCk7CisgICAgICAgIHJldHVybiBvZmZzZXQgPyB0aGlzLmJiLnJlYWRVaW50MzIodGhpcy5iYl9wb3MgKyBvZmZzZXQpIDogMDsKKyAgICB9CisgICAgbXV0YXRlX3Rlc3RoYXNodTMyX2ZudjEodmFsdWUpIHsKKyAgICAgICAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywgMzgpOworICAgICAgICBpZiAob2Zmc2V0ID09PSAwKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgdGhpcy5iYi53cml0ZVVpbnQzMih0aGlzLmJiX3BvcyArIG9mZnNldCwgdmFsdWUpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgdGVzdGhhc2hzNjRGbnYxKCkgeworICAgICAgICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCA0MCk7CisgICAgICAgIHJldHVybiBvZmZzZXQgPyB0aGlzLmJiLnJlYWRJbnQ2NCh0aGlzLmJiX3BvcyArIG9mZnNldCkgOiBCaWdJbnQoJzAnKTsKKyAgICB9CisgICAgbXV0YXRlX3Rlc3RoYXNoczY0X2ZudjEodmFsdWUpIHsKKyAgICAgICAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywgNDApOworICAgICAgICBpZiAob2Zmc2V0ID09PSAwKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgdGhpcy5iYi53cml0ZUludDY0KHRoaXMuYmJfcG9zICsgb2Zmc2V0LCB2YWx1ZSk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICB0ZXN0aGFzaHU2NEZudjEoKSB7CisgICAgICAgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsIDQyKTsKKyAgICAgICAgcmV0dXJuIG9mZnNldCA/IHRoaXMuYmIucmVhZFVpbnQ2NCh0aGlzLmJiX3BvcyArIG9mZnNldCkgOiBCaWdJbnQoJzAnKTsKKyAgICB9CisgICAgbXV0YXRlX3Rlc3RoYXNodTY0X2ZudjEodmFsdWUpIHsKKyAgICAgICAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywgNDIpOworICAgICAgICBpZiAob2Zmc2V0ID09PSAwKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgdGhpcy5iYi53cml0ZVVpbnQ2NCh0aGlzLmJiX3BvcyArIG9mZnNldCwgdmFsdWUpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgdGVzdGhhc2hzMzJGbnYxYSgpIHsKKyAgICAgICAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywgNDQpOworICAgICAgICByZXR1cm4gb2Zmc2V0ID8gdGhpcy5iYi5yZWFkSW50MzIodGhpcy5iYl9wb3MgKyBvZmZzZXQpIDogMDsKKyAgICB9CisgICAgbXV0YXRlX3Rlc3RoYXNoczMyX2ZudjFhKHZhbHVlKSB7CisgICAgICAgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsIDQ0KTsKKyAgICAgICAgaWYgKG9mZnNldCA9PT0gMCkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIHRoaXMuYmIud3JpdGVJbnQzMih0aGlzLmJiX3BvcyArIG9mZnNldCwgdmFsdWUpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgdGVzdGhhc2h1MzJGbnYxYSgpIHsKKyAgICAgICAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywgNDYpOworICAgICAgICByZXR1cm4gb2Zmc2V0ID8gdGhpcy5iYi5yZWFkVWludDMyKHRoaXMuYmJfcG9zICsgb2Zmc2V0KSA6IDA7CisgICAgfQorICAgIG11dGF0ZV90ZXN0aGFzaHUzMl9mbnYxYSh2YWx1ZSkgeworICAgICAgICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCA0Nik7CisgICAgICAgIGlmIChvZmZzZXQgPT09IDApIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICB0aGlzLmJiLndyaXRlVWludDMyKHRoaXMuYmJfcG9zICsgb2Zmc2V0LCB2YWx1ZSk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICB0ZXN0aGFzaHM2NEZudjFhKCkgeworICAgICAgICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCA0OCk7CisgICAgICAgIHJldHVybiBvZmZzZXQgPyB0aGlzLmJiLnJlYWRJbnQ2NCh0aGlzLmJiX3BvcyArIG9mZnNldCkgOiBCaWdJbnQoJzAnKTsKKyAgICB9CisgICAgbXV0YXRlX3Rlc3RoYXNoczY0X2ZudjFhKHZhbHVlKSB7CisgICAgICAgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsIDQ4KTsKKyAgICAgICAgaWYgKG9mZnNldCA9PT0gMCkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIHRoaXMuYmIud3JpdGVJbnQ2NCh0aGlzLmJiX3BvcyArIG9mZnNldCwgdmFsdWUpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgdGVzdGhhc2h1NjRGbnYxYSgpIHsKKyAgICAgICAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywgNTApOworICAgICAgICByZXR1cm4gb2Zmc2V0ID8gdGhpcy5iYi5yZWFkVWludDY0KHRoaXMuYmJfcG9zICsgb2Zmc2V0KSA6IEJpZ0ludCgnMCcpOworICAgIH0KKyAgICBtdXRhdGVfdGVzdGhhc2h1NjRfZm52MWEodmFsdWUpIHsKKyAgICAgICAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywgNTApOworICAgICAgICBpZiAob2Zmc2V0ID09PSAwKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgdGhpcy5iYi53cml0ZVVpbnQ2NCh0aGlzLmJiX3BvcyArIG9mZnNldCwgdmFsdWUpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgdGVzdGFycmF5b2Zib29scyhpbmRleCkgeworICAgICAgICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCA1Mik7CisgICAgICAgIHJldHVybiBvZmZzZXQgPyAhIXRoaXMuYmIucmVhZEludDgodGhpcy5iYi5fX3ZlY3Rvcih0aGlzLmJiX3BvcyArIG9mZnNldCkgKyBpbmRleCkgOiBmYWxzZTsKKyAgICB9CisgICAgdGVzdGFycmF5b2Zib29sc0xlbmd0aCgpIHsKKyAgICAgICAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywgNTIpOworICAgICAgICByZXR1cm4gb2Zmc2V0ID8gdGhpcy5iYi5fX3ZlY3Rvcl9sZW4odGhpcy5iYl9wb3MgKyBvZmZzZXQpIDogMDsKKyAgICB9CisgICAgdGVzdGFycmF5b2Zib29sc0FycmF5KCkgeworICAgICAgICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCA1Mik7CisgICAgICAgIHJldHVybiBvZmZzZXQgPyBuZXcgSW50OEFycmF5KHRoaXMuYmIuYnl0ZXMoKS5idWZmZXIsIHRoaXMuYmIuYnl0ZXMoKS5ieXRlT2Zmc2V0ICsgdGhpcy5iYi5fX3ZlY3Rvcih0aGlzLmJiX3BvcyArIG9mZnNldCksIHRoaXMuYmIuX192ZWN0b3JfbGVuKHRoaXMuYmJfcG9zICsgb2Zmc2V0KSkgOiBudWxsOworICAgIH0KKyAgICB0ZXN0ZigpIHsKKyAgICAgICAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywgNTQpOworICAgICAgICByZXR1cm4gb2Zmc2V0ID8gdGhpcy5iYi5yZWFkRmxvYXQzMih0aGlzLmJiX3BvcyArIG9mZnNldCkgOiAzLjE0MTU5OworICAgIH0KKyAgICBtdXRhdGVfdGVzdGYodmFsdWUpIHsKKyAgICAgICAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywgNTQpOworICAgICAgICBpZiAob2Zmc2V0ID09PSAwKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgdGhpcy5iYi53cml0ZUZsb2F0MzIodGhpcy5iYl9wb3MgKyBvZmZzZXQsIHZhbHVlKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIHRlc3RmMigpIHsKKyAgICAgICAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywgNTYpOworICAgICAgICByZXR1cm4gb2Zmc2V0ID8gdGhpcy5iYi5yZWFkRmxvYXQzMih0aGlzLmJiX3BvcyArIG9mZnNldCkgOiAzLjA7CisgICAgfQorICAgIG11dGF0ZV90ZXN0ZjIodmFsdWUpIHsKKyAgICAgICAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywgNTYpOworICAgICAgICBpZiAob2Zmc2V0ID09PSAwKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgdGhpcy5iYi53cml0ZUZsb2F0MzIodGhpcy5iYl9wb3MgKyBvZmZzZXQsIHZhbHVlKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIHRlc3RmMygpIHsKKyAgICAgICAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywgNTgpOworICAgICAgICByZXR1cm4gb2Zmc2V0ID8gdGhpcy5iYi5yZWFkRmxvYXQzMih0aGlzLmJiX3BvcyArIG9mZnNldCkgOiAwLjA7CisgICAgfQorICAgIG11dGF0ZV90ZXN0ZjModmFsdWUpIHsKKyAgICAgICAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywgNTgpOworICAgICAgICBpZiAob2Zmc2V0ID09PSAwKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgdGhpcy5iYi53cml0ZUZsb2F0MzIodGhpcy5iYl9wb3MgKyBvZmZzZXQsIHZhbHVlKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIHRlc3RhcnJheW9mc3RyaW5nMihpbmRleCwgb3B0aW9uYWxFbmNvZGluZykgeworICAgICAgICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCA2MCk7CisgICAgICAgIHJldHVybiBvZmZzZXQgPyB0aGlzLmJiLl9fc3RyaW5nKHRoaXMuYmIuX192ZWN0b3IodGhpcy5iYl9wb3MgKyBvZmZzZXQpICsgaW5kZXggKiA0LCBvcHRpb25hbEVuY29kaW5nKSA6IG51bGw7CisgICAgfQorICAgIHRlc3RhcnJheW9mc3RyaW5nMkxlbmd0aCgpIHsKKyAgICAgICAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywgNjApOworICAgICAgICByZXR1cm4gb2Zmc2V0ID8gdGhpcy5iYi5fX3ZlY3Rvcl9sZW4odGhpcy5iYl9wb3MgKyBvZmZzZXQpIDogMDsKKyAgICB9CisgICAgdGVzdGFycmF5b2Zzb3J0ZWRzdHJ1Y3QoaW5kZXgsIG9iaikgeworICAgICAgICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCA2Mik7CisgICAgICAgIHJldHVybiBvZmZzZXQgPyAob2JqIHx8IG5ldyBBYmlsaXR5KCkpLl9faW5pdCh0aGlzLmJiLl9fdmVjdG9yKHRoaXMuYmJfcG9zICsgb2Zmc2V0KSArIGluZGV4ICogOCwgdGhpcy5iYikgOiBudWxsOworICAgIH0KKyAgICB0ZXN0YXJyYXlvZnNvcnRlZHN0cnVjdExlbmd0aCgpIHsKKyAgICAgICAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywgNjIpOworICAgICAgICByZXR1cm4gb2Zmc2V0ID8gdGhpcy5iYi5fX3ZlY3Rvcl9sZW4odGhpcy5iYl9wb3MgKyBvZmZzZXQpIDogMDsKKyAgICB9CisgICAgZmxleChpbmRleCkgeworICAgICAgICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCA2NCk7CisgICAgICAgIHJldHVybiBvZmZzZXQgPyB0aGlzLmJiLnJlYWRVaW50OCh0aGlzLmJiLl9fdmVjdG9yKHRoaXMuYmJfcG9zICsgb2Zmc2V0KSArIGluZGV4KSA6IDA7CisgICAgfQorICAgIGZsZXhMZW5ndGgoKSB7CisgICAgICAgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsIDY0KTsKKyAgICAgICAgcmV0dXJuIG9mZnNldCA/IHRoaXMuYmIuX192ZWN0b3JfbGVuKHRoaXMuYmJfcG9zICsgb2Zmc2V0KSA6IDA7CisgICAgfQorICAgIGZsZXhBcnJheSgpIHsKKyAgICAgICAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywgNjQpOworICAgICAgICByZXR1cm4gb2Zmc2V0ID8gbmV3IFVpbnQ4QXJyYXkodGhpcy5iYi5ieXRlcygpLmJ1ZmZlciwgdGhpcy5iYi5ieXRlcygpLmJ5dGVPZmZzZXQgKyB0aGlzLmJiLl9fdmVjdG9yKHRoaXMuYmJfcG9zICsgb2Zmc2V0KSwgdGhpcy5iYi5fX3ZlY3Rvcl9sZW4odGhpcy5iYl9wb3MgKyBvZmZzZXQpKSA6IG51bGw7CisgICAgfQorICAgIHRlc3Q1KGluZGV4LCBvYmopIHsKKyAgICAgICAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywgNjYpOworICAgICAgICByZXR1cm4gb2Zmc2V0ID8gKG9iaiB8fCBuZXcgVGVzdCgpKS5fX2luaXQodGhpcy5iYi5fX3ZlY3Rvcih0aGlzLmJiX3BvcyArIG9mZnNldCkgKyBpbmRleCAqIDQsIHRoaXMuYmIpIDogbnVsbDsKKyAgICB9CisgICAgdGVzdDVMZW5ndGgoKSB7CisgICAgICAgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsIDY2KTsKKyAgICAgICAgcmV0dXJuIG9mZnNldCA/IHRoaXMuYmIuX192ZWN0b3JfbGVuKHRoaXMuYmJfcG9zICsgb2Zmc2V0KSA6IDA7CisgICAgfQorICAgIHZlY3Rvck9mTG9uZ3MoaW5kZXgpIHsKKyAgICAgICAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywgNjgpOworICAgICAgICByZXR1cm4gb2Zmc2V0ID8gdGhpcy5iYi5yZWFkSW50NjQodGhpcy5iYi5fX3ZlY3Rvcih0aGlzLmJiX3BvcyArIG9mZnNldCkgKyBpbmRleCAqIDgpIDogQmlnSW50KDApOworICAgIH0KKyAgICB2ZWN0b3JPZkxvbmdzTGVuZ3RoKCkgeworICAgICAgICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCA2OCk7CisgICAgICAgIHJldHVybiBvZmZzZXQgPyB0aGlzLmJiLl9fdmVjdG9yX2xlbih0aGlzLmJiX3BvcyArIG9mZnNldCkgOiAwOworICAgIH0KKyAgICB2ZWN0b3JPZkRvdWJsZXMoaW5kZXgpIHsKKyAgICAgICAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywgNzApOworICAgICAgICByZXR1cm4gb2Zmc2V0ID8gdGhpcy5iYi5yZWFkRmxvYXQ2NCh0aGlzLmJiLl9fdmVjdG9yKHRoaXMuYmJfcG9zICsgb2Zmc2V0KSArIGluZGV4ICogOCkgOiAwOworICAgIH0KKyAgICB2ZWN0b3JPZkRvdWJsZXNMZW5ndGgoKSB7CisgICAgICAgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsIDcwKTsKKyAgICAgICAgcmV0dXJuIG9mZnNldCA/IHRoaXMuYmIuX192ZWN0b3JfbGVuKHRoaXMuYmJfcG9zICsgb2Zmc2V0KSA6IDA7CisgICAgfQorICAgIHZlY3Rvck9mRG91Ymxlc0FycmF5KCkgeworICAgICAgICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCA3MCk7CisgICAgICAgIHJldHVybiBvZmZzZXQgPyBuZXcgRmxvYXQ2NEFycmF5KHRoaXMuYmIuYnl0ZXMoKS5idWZmZXIsIHRoaXMuYmIuYnl0ZXMoKS5ieXRlT2Zmc2V0ICsgdGhpcy5iYi5fX3ZlY3Rvcih0aGlzLmJiX3BvcyArIG9mZnNldCksIHRoaXMuYmIuX192ZWN0b3JfbGVuKHRoaXMuYmJfcG9zICsgb2Zmc2V0KSkgOiBudWxsOworICAgIH0KKyAgICBwYXJlbnROYW1lc3BhY2VUZXN0KG9iaikgeworICAgICAgICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCA3Mik7CisgICAgICAgIHJldHVybiBvZmZzZXQgPyAob2JqIHx8IG5ldyBJblBhcmVudE5hbWVzcGFjZSgpKS5fX2luaXQodGhpcy5iYi5fX2luZGlyZWN0KHRoaXMuYmJfcG9zICsgb2Zmc2V0KSwgdGhpcy5iYikgOiBudWxsOworICAgIH0KKyAgICB2ZWN0b3JPZlJlZmVycmFibGVzKGluZGV4LCBvYmopIHsKKyAgICAgICAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywgNzQpOworICAgICAgICByZXR1cm4gb2Zmc2V0ID8gKG9iaiB8fCBuZXcgUmVmZXJyYWJsZSgpKS5fX2luaXQodGhpcy5iYi5fX2luZGlyZWN0KHRoaXMuYmIuX192ZWN0b3IodGhpcy5iYl9wb3MgKyBvZmZzZXQpICsgaW5kZXggKiA0KSwgdGhpcy5iYikgOiBudWxsOworICAgIH0KKyAgICB2ZWN0b3JPZlJlZmVycmFibGVzTGVuZ3RoKCkgeworICAgICAgICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCA3NCk7CisgICAgICAgIHJldHVybiBvZmZzZXQgPyB0aGlzLmJiLl9fdmVjdG9yX2xlbih0aGlzLmJiX3BvcyArIG9mZnNldCkgOiAwOworICAgIH0KKyAgICBzaW5nbGVXZWFrUmVmZXJlbmNlKCkgeworICAgICAgICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCA3Nik7CisgICAgICAgIHJldHVybiBvZmZzZXQgPyB0aGlzLmJiLnJlYWRVaW50NjQodGhpcy5iYl9wb3MgKyBvZmZzZXQpIDogQmlnSW50KCcwJyk7CisgICAgfQorICAgIG11dGF0ZV9zaW5nbGVfd2Vha19yZWZlcmVuY2UodmFsdWUpIHsKKyAgICAgICAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywgNzYpOworICAgICAgICBpZiAob2Zmc2V0ID09PSAwKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgdGhpcy5iYi53cml0ZVVpbnQ2NCh0aGlzLmJiX3BvcyArIG9mZnNldCwgdmFsdWUpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgdmVjdG9yT2ZXZWFrUmVmZXJlbmNlcyhpbmRleCkgeworICAgICAgICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCA3OCk7CisgICAgICAgIHJldHVybiBvZmZzZXQgPyB0aGlzLmJiLnJlYWRVaW50NjQodGhpcy5iYi5fX3ZlY3Rvcih0aGlzLmJiX3BvcyArIG9mZnNldCkgKyBpbmRleCAqIDgpIDogQmlnSW50KDApOworICAgIH0KKyAgICB2ZWN0b3JPZldlYWtSZWZlcmVuY2VzTGVuZ3RoKCkgeworICAgICAgICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCA3OCk7CisgICAgICAgIHJldHVybiBvZmZzZXQgPyB0aGlzLmJiLl9fdmVjdG9yX2xlbih0aGlzLmJiX3BvcyArIG9mZnNldCkgOiAwOworICAgIH0KKyAgICB2ZWN0b3JPZlN0cm9uZ1JlZmVycmFibGVzKGluZGV4LCBvYmopIHsKKyAgICAgICAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywgODApOworICAgICAgICByZXR1cm4gb2Zmc2V0ID8gKG9iaiB8fCBuZXcgUmVmZXJyYWJsZSgpKS5fX2luaXQodGhpcy5iYi5fX2luZGlyZWN0KHRoaXMuYmIuX192ZWN0b3IodGhpcy5iYl9wb3MgKyBvZmZzZXQpICsgaW5kZXggKiA0KSwgdGhpcy5iYikgOiBudWxsOworICAgIH0KKyAgICB2ZWN0b3JPZlN0cm9uZ1JlZmVycmFibGVzTGVuZ3RoKCkgeworICAgICAgICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCA4MCk7CisgICAgICAgIHJldHVybiBvZmZzZXQgPyB0aGlzLmJiLl9fdmVjdG9yX2xlbih0aGlzLmJiX3BvcyArIG9mZnNldCkgOiAwOworICAgIH0KKyAgICBjb093bmluZ1JlZmVyZW5jZSgpIHsKKyAgICAgICAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywgODIpOworICAgICAgICByZXR1cm4gb2Zmc2V0ID8gdGhpcy5iYi5yZWFkVWludDY0KHRoaXMuYmJfcG9zICsgb2Zmc2V0KSA6IEJpZ0ludCgnMCcpOworICAgIH0KKyAgICBtdXRhdGVfY29fb3duaW5nX3JlZmVyZW5jZSh2YWx1ZSkgeworICAgICAgICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCA4Mik7CisgICAgICAgIGlmIChvZmZzZXQgPT09IDApIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICB0aGlzLmJiLndyaXRlVWludDY0KHRoaXMuYmJfcG9zICsgb2Zmc2V0LCB2YWx1ZSk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICB2ZWN0b3JPZkNvT3duaW5nUmVmZXJlbmNlcyhpbmRleCkgeworICAgICAgICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCA4NCk7CisgICAgICAgIHJldHVybiBvZmZzZXQgPyB0aGlzLmJiLnJlYWRVaW50NjQodGhpcy5iYi5fX3ZlY3Rvcih0aGlzLmJiX3BvcyArIG9mZnNldCkgKyBpbmRleCAqIDgpIDogQmlnSW50KDApOworICAgIH0KKyAgICB2ZWN0b3JPZkNvT3duaW5nUmVmZXJlbmNlc0xlbmd0aCgpIHsKKyAgICAgICAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywgODQpOworICAgICAgICByZXR1cm4gb2Zmc2V0ID8gdGhpcy5iYi5fX3ZlY3Rvcl9sZW4odGhpcy5iYl9wb3MgKyBvZmZzZXQpIDogMDsKKyAgICB9CisgICAgbm9uT3duaW5nUmVmZXJlbmNlKCkgeworICAgICAgICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCA4Nik7CisgICAgICAgIHJldHVybiBvZmZzZXQgPyB0aGlzLmJiLnJlYWRVaW50NjQodGhpcy5iYl9wb3MgKyBvZmZzZXQpIDogQmlnSW50KCcwJyk7CisgICAgfQorICAgIG11dGF0ZV9ub25fb3duaW5nX3JlZmVyZW5jZSh2YWx1ZSkgeworICAgICAgICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCA4Nik7CisgICAgICAgIGlmIChvZmZzZXQgPT09IDApIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICB0aGlzLmJiLndyaXRlVWludDY0KHRoaXMuYmJfcG9zICsgb2Zmc2V0LCB2YWx1ZSk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICB2ZWN0b3JPZk5vbk93bmluZ1JlZmVyZW5jZXMoaW5kZXgpIHsKKyAgICAgICAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywgODgpOworICAgICAgICByZXR1cm4gb2Zmc2V0ID8gdGhpcy5iYi5yZWFkVWludDY0KHRoaXMuYmIuX192ZWN0b3IodGhpcy5iYl9wb3MgKyBvZmZzZXQpICsgaW5kZXggKiA4KSA6IEJpZ0ludCgwKTsKKyAgICB9CisgICAgdmVjdG9yT2ZOb25Pd25pbmdSZWZlcmVuY2VzTGVuZ3RoKCkgeworICAgICAgICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCA4OCk7CisgICAgICAgIHJldHVybiBvZmZzZXQgPyB0aGlzLmJiLl9fdmVjdG9yX2xlbih0aGlzLmJiX3BvcyArIG9mZnNldCkgOiAwOworICAgIH0KKyAgICBhbnlVbmlxdWVUeXBlKCkgeworICAgICAgICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCA5MCk7CisgICAgICAgIHJldHVybiBvZmZzZXQgPyB0aGlzLmJiLnJlYWRVaW50OCh0aGlzLmJiX3BvcyArIG9mZnNldCkgOiBBbnlVbmlxdWVBbGlhc2VzLk5PTkU7CisgICAgfQorICAgIGFueVVuaXF1ZShvYmopIHsKKyAgICAgICAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywgOTIpOworICAgICAgICByZXR1cm4gb2Zmc2V0ID8gdGhpcy5iYi5fX3VuaW9uKG9iaiwgdGhpcy5iYl9wb3MgKyBvZmZzZXQpIDogbnVsbDsKKyAgICB9CisgICAgYW55QW1iaWd1b3VzVHlwZSgpIHsKKyAgICAgICAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywgOTQpOworICAgICAgICByZXR1cm4gb2Zmc2V0ID8gdGhpcy5iYi5yZWFkVWludDgodGhpcy5iYl9wb3MgKyBvZmZzZXQpIDogQW55QW1iaWd1b3VzQWxpYXNlcy5OT05FOworICAgIH0KKyAgICBhbnlBbWJpZ3VvdXMob2JqKSB7CisgICAgICAgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsIDk2KTsKKyAgICAgICAgcmV0dXJuIG9mZnNldCA/IHRoaXMuYmIuX191bmlvbihvYmosIHRoaXMuYmJfcG9zICsgb2Zmc2V0KSA6IG51bGw7CisgICAgfQorICAgIHZlY3Rvck9mRW51bXMoaW5kZXgpIHsKKyAgICAgICAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywgOTgpOworICAgICAgICByZXR1cm4gb2Zmc2V0ID8gdGhpcy5iYi5yZWFkVWludDgodGhpcy5iYi5fX3ZlY3Rvcih0aGlzLmJiX3BvcyArIG9mZnNldCkgKyBpbmRleCkgOiAwOworICAgIH0KKyAgICB2ZWN0b3JPZkVudW1zTGVuZ3RoKCkgeworICAgICAgICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCA5OCk7CisgICAgICAgIHJldHVybiBvZmZzZXQgPyB0aGlzLmJiLl9fdmVjdG9yX2xlbih0aGlzLmJiX3BvcyArIG9mZnNldCkgOiAwOworICAgIH0KKyAgICB2ZWN0b3JPZkVudW1zQXJyYXkoKSB7CisgICAgICAgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsIDk4KTsKKyAgICAgICAgcmV0dXJuIG9mZnNldCA/IG5ldyBVaW50OEFycmF5KHRoaXMuYmIuYnl0ZXMoKS5idWZmZXIsIHRoaXMuYmIuYnl0ZXMoKS5ieXRlT2Zmc2V0ICsgdGhpcy5iYi5fX3ZlY3Rvcih0aGlzLmJiX3BvcyArIG9mZnNldCksIHRoaXMuYmIuX192ZWN0b3JfbGVuKHRoaXMuYmJfcG9zICsgb2Zmc2V0KSkgOiBudWxsOworICAgIH0KKyAgICBzaWduZWRFbnVtKCkgeworICAgICAgICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCAxMDApOworICAgICAgICByZXR1cm4gb2Zmc2V0ID8gdGhpcy5iYi5yZWFkSW50OCh0aGlzLmJiX3BvcyArIG9mZnNldCkgOiBSYWNlLk5vbmU7CisgICAgfQorICAgIG11dGF0ZV9zaWduZWRfZW51bSh2YWx1ZSkgeworICAgICAgICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCAxMDApOworICAgICAgICBpZiAob2Zmc2V0ID09PSAwKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgdGhpcy5iYi53cml0ZUludDgodGhpcy5iYl9wb3MgKyBvZmZzZXQsIHZhbHVlKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIHRlc3RyZXF1aXJlZG5lc3RlZGZsYXRidWZmZXIoaW5kZXgpIHsKKyAgICAgICAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywgMTAyKTsKKyAgICAgICAgcmV0dXJuIG9mZnNldCA/IHRoaXMuYmIucmVhZFVpbnQ4KHRoaXMuYmIuX192ZWN0b3IodGhpcy5iYl9wb3MgKyBvZmZzZXQpICsgaW5kZXgpIDogMDsKKyAgICB9CisgICAgdGVzdHJlcXVpcmVkbmVzdGVkZmxhdGJ1ZmZlckxlbmd0aCgpIHsKKyAgICAgICAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywgMTAyKTsKKyAgICAgICAgcmV0dXJuIG9mZnNldCA/IHRoaXMuYmIuX192ZWN0b3JfbGVuKHRoaXMuYmJfcG9zICsgb2Zmc2V0KSA6IDA7CisgICAgfQorICAgIHRlc3RyZXF1aXJlZG5lc3RlZGZsYXRidWZmZXJBcnJheSgpIHsKKyAgICAgICAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywgMTAyKTsKKyAgICAgICAgcmV0dXJuIG9mZnNldCA/IG5ldyBVaW50OEFycmF5KHRoaXMuYmIuYnl0ZXMoKS5idWZmZXIsIHRoaXMuYmIuYnl0ZXMoKS5ieXRlT2Zmc2V0ICsgdGhpcy5iYi5fX3ZlY3Rvcih0aGlzLmJiX3BvcyArIG9mZnNldCksIHRoaXMuYmIuX192ZWN0b3JfbGVuKHRoaXMuYmJfcG9zICsgb2Zmc2V0KSkgOiBudWxsOworICAgIH0KKyAgICBzY2FsYXJLZXlTb3J0ZWRUYWJsZXMoaW5kZXgsIG9iaikgeworICAgICAgICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCAxMDQpOworICAgICAgICByZXR1cm4gb2Zmc2V0ID8gKG9iaiB8fCBuZXcgU3RhdCgpKS5fX2luaXQodGhpcy5iYi5fX2luZGlyZWN0KHRoaXMuYmIuX192ZWN0b3IodGhpcy5iYl9wb3MgKyBvZmZzZXQpICsgaW5kZXggKiA0KSwgdGhpcy5iYikgOiBudWxsOworICAgIH0KKyAgICBzY2FsYXJLZXlTb3J0ZWRUYWJsZXNMZW5ndGgoKSB7CisgICAgICAgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsIDEwNCk7CisgICAgICAgIHJldHVybiBvZmZzZXQgPyB0aGlzLmJiLl9fdmVjdG9yX2xlbih0aGlzLmJiX3BvcyArIG9mZnNldCkgOiAwOworICAgIH0KKyAgICBuYXRpdmVJbmxpbmUob2JqKSB7CisgICAgICAgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsIDEwNik7CisgICAgICAgIHJldHVybiBvZmZzZXQgPyAob2JqIHx8IG5ldyBUZXN0KCkpLl9faW5pdCh0aGlzLmJiX3BvcyArIG9mZnNldCwgdGhpcy5iYikgOiBudWxsOworICAgIH0KKyAgICBsb25nRW51bU5vbkVudW1EZWZhdWx0KCkgeworICAgICAgICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCAxMDgpOworICAgICAgICByZXR1cm4gb2Zmc2V0ID8gdGhpcy5iYi5yZWFkVWludDY0KHRoaXMuYmJfcG9zICsgb2Zmc2V0KSA6IEJpZ0ludCgnMCcpOworICAgIH0KKyAgICBtdXRhdGVfbG9uZ19lbnVtX25vbl9lbnVtX2RlZmF1bHQodmFsdWUpIHsKKyAgICAgICAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywgMTA4KTsKKyAgICAgICAgaWYgKG9mZnNldCA9PT0gMCkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIHRoaXMuYmIud3JpdGVVaW50NjQodGhpcy5iYl9wb3MgKyBvZmZzZXQsIHZhbHVlKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIGxvbmdFbnVtTm9ybWFsRGVmYXVsdCgpIHsKKyAgICAgICAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywgMTEwKTsKKyAgICAgICAgcmV0dXJuIG9mZnNldCA/IHRoaXMuYmIucmVhZFVpbnQ2NCh0aGlzLmJiX3BvcyArIG9mZnNldCkgOiBCaWdJbnQoJzInKTsKKyAgICB9CisgICAgbXV0YXRlX2xvbmdfZW51bV9ub3JtYWxfZGVmYXVsdCh2YWx1ZSkgeworICAgICAgICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCAxMTApOworICAgICAgICBpZiAob2Zmc2V0ID09PSAwKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgdGhpcy5iYi53cml0ZVVpbnQ2NCh0aGlzLmJiX3BvcyArIG9mZnNldCwgdmFsdWUpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgc3RhdGljIGdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpIHsKKyAgICAgICAgcmV0dXJuICdNeUdhbWVfRXhhbXBsZV9Nb25zdGVyJzsKKyAgICB9CisgICAgc3RhdGljIHN0YXJ0TW9uc3RlcihidWlsZGVyKSB7CisgICAgICAgIGJ1aWxkZXIuc3RhcnRPYmplY3QoNTQpOworICAgIH0KKyAgICBzdGF0aWMgYWRkUG9zKGJ1aWxkZXIsIHBvc09mZnNldCkgeworICAgICAgICBidWlsZGVyLmFkZEZpZWxkU3RydWN0KDAsIHBvc09mZnNldCwgMCk7CisgICAgfQorICAgIHN0YXRpYyBhZGRNYW5hKGJ1aWxkZXIsIG1hbmEpIHsKKyAgICAgICAgYnVpbGRlci5hZGRGaWVsZEludDE2KDEsIG1hbmEsIDE1MCk7CisgICAgfQorICAgIHN0YXRpYyBhZGRIcChidWlsZGVyLCBocCkgeworICAgICAgICBidWlsZGVyLmFkZEZpZWxkSW50MTYoMiwgaHAsIDEwMCk7CisgICAgfQorICAgIHN0YXRpYyBhZGROYW1lKGJ1aWxkZXIsIG5hbWVPZmZzZXQpIHsKKyAgICAgICAgYnVpbGRlci5hZGRGaWVsZE9mZnNldCgzLCBuYW1lT2Zmc2V0LCAwKTsKKyAgICB9CisgICAgc3RhdGljIGFkZEludmVudG9yeShidWlsZGVyLCBpbnZlbnRvcnlPZmZzZXQpIHsKKyAgICAgICAgYnVpbGRlci5hZGRGaWVsZE9mZnNldCg1LCBpbnZlbnRvcnlPZmZzZXQsIDApOworICAgIH0KKyAgICBzdGF0aWMgY3JlYXRlSW52ZW50b3J5VmVjdG9yKGJ1aWxkZXIsIGRhdGEpIHsKKyAgICAgICAgYnVpbGRlci5zdGFydFZlY3RvcigxLCBkYXRhLmxlbmd0aCwgMSk7CisgICAgICAgIGZvciAobGV0IGkgPSBkYXRhLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7CisgICAgICAgICAgICBidWlsZGVyLmFkZEludDgoZGF0YVtpXSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGJ1aWxkZXIuZW5kVmVjdG9yKCk7CisgICAgfQorICAgIHN0YXRpYyBzdGFydEludmVudG9yeVZlY3RvcihidWlsZGVyLCBudW1FbGVtcykgeworICAgICAgICBidWlsZGVyLnN0YXJ0VmVjdG9yKDEsIG51bUVsZW1zLCAxKTsKKyAgICB9CisgICAgc3RhdGljIGFkZENvbG9yKGJ1aWxkZXIsIGNvbG9yKSB7CisgICAgICAgIGJ1aWxkZXIuYWRkRmllbGRJbnQ4KDYsIGNvbG9yLCBDb2xvci5CbHVlKTsKKyAgICB9CisgICAgc3RhdGljIGFkZFRlc3RUeXBlKGJ1aWxkZXIsIHRlc3RUeXBlKSB7CisgICAgICAgIGJ1aWxkZXIuYWRkRmllbGRJbnQ4KDcsIHRlc3RUeXBlLCBBbnkuTk9ORSk7CisgICAgfQorICAgIHN0YXRpYyBhZGRUZXN0KGJ1aWxkZXIsIHRlc3RPZmZzZXQpIHsKKyAgICAgICAgYnVpbGRlci5hZGRGaWVsZE9mZnNldCg4LCB0ZXN0T2Zmc2V0LCAwKTsKKyAgICB9CisgICAgc3RhdGljIGFkZFRlc3Q0KGJ1aWxkZXIsIHRlc3Q0T2Zmc2V0KSB7CisgICAgICAgIGJ1aWxkZXIuYWRkRmllbGRPZmZzZXQoOSwgdGVzdDRPZmZzZXQsIDApOworICAgIH0KKyAgICBzdGF0aWMgc3RhcnRUZXN0NFZlY3RvcihidWlsZGVyLCBudW1FbGVtcykgeworICAgICAgICBidWlsZGVyLnN0YXJ0VmVjdG9yKDQsIG51bUVsZW1zLCAyKTsKKyAgICB9CisgICAgc3RhdGljIGFkZFRlc3RhcnJheW9mc3RyaW5nKGJ1aWxkZXIsIHRlc3RhcnJheW9mc3RyaW5nT2Zmc2V0KSB7CisgICAgICAgIGJ1aWxkZXIuYWRkRmllbGRPZmZzZXQoMTAsIHRlc3RhcnJheW9mc3RyaW5nT2Zmc2V0LCAwKTsKKyAgICB9CisgICAgc3RhdGljIGNyZWF0ZVRlc3RhcnJheW9mc3RyaW5nVmVjdG9yKGJ1aWxkZXIsIGRhdGEpIHsKKyAgICAgICAgYnVpbGRlci5zdGFydFZlY3Rvcig0LCBkYXRhLmxlbmd0aCwgNCk7CisgICAgICAgIGZvciAobGV0IGkgPSBkYXRhLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7CisgICAgICAgICAgICBidWlsZGVyLmFkZE9mZnNldChkYXRhW2ldKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gYnVpbGRlci5lbmRWZWN0b3IoKTsKKyAgICB9CisgICAgc3RhdGljIHN0YXJ0VGVzdGFycmF5b2ZzdHJpbmdWZWN0b3IoYnVpbGRlciwgbnVtRWxlbXMpIHsKKyAgICAgICAgYnVpbGRlci5zdGFydFZlY3Rvcig0LCBudW1FbGVtcywgNCk7CisgICAgfQorICAgIHN0YXRpYyBhZGRUZXN0YXJyYXlvZnRhYmxlcyhidWlsZGVyLCB0ZXN0YXJyYXlvZnRhYmxlc09mZnNldCkgeworICAgICAgICBidWlsZGVyLmFkZEZpZWxkT2Zmc2V0KDExLCB0ZXN0YXJyYXlvZnRhYmxlc09mZnNldCwgMCk7CisgICAgfQorICAgIHN0YXRpYyBjcmVhdGVUZXN0YXJyYXlvZnRhYmxlc1ZlY3RvcihidWlsZGVyLCBkYXRhKSB7CisgICAgICAgIGJ1aWxkZXIuc3RhcnRWZWN0b3IoNCwgZGF0YS5sZW5ndGgsIDQpOworICAgICAgICBmb3IgKGxldCBpID0gZGF0YS5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgeworICAgICAgICAgICAgYnVpbGRlci5hZGRPZmZzZXQoZGF0YVtpXSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGJ1aWxkZXIuZW5kVmVjdG9yKCk7CisgICAgfQorICAgIHN0YXRpYyBzdGFydFRlc3RhcnJheW9mdGFibGVzVmVjdG9yKGJ1aWxkZXIsIG51bUVsZW1zKSB7CisgICAgICAgIGJ1aWxkZXIuc3RhcnRWZWN0b3IoNCwgbnVtRWxlbXMsIDQpOworICAgIH0KKyAgICBzdGF0aWMgYWRkRW5lbXkoYnVpbGRlciwgZW5lbXlPZmZzZXQpIHsKKyAgICAgICAgYnVpbGRlci5hZGRGaWVsZE9mZnNldCgxMiwgZW5lbXlPZmZzZXQsIDApOworICAgIH0KKyAgICBzdGF0aWMgYWRkVGVzdG5lc3RlZGZsYXRidWZmZXIoYnVpbGRlciwgdGVzdG5lc3RlZGZsYXRidWZmZXJPZmZzZXQpIHsKKyAgICAgICAgYnVpbGRlci5hZGRGaWVsZE9mZnNldCgxMywgdGVzdG5lc3RlZGZsYXRidWZmZXJPZmZzZXQsIDApOworICAgIH0KKyAgICBzdGF0aWMgY3JlYXRlVGVzdG5lc3RlZGZsYXRidWZmZXJWZWN0b3IoYnVpbGRlciwgZGF0YSkgeworICAgICAgICBidWlsZGVyLnN0YXJ0VmVjdG9yKDEsIGRhdGEubGVuZ3RoLCAxKTsKKyAgICAgICAgZm9yIChsZXQgaSA9IGRhdGEubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHsKKyAgICAgICAgICAgIGJ1aWxkZXIuYWRkSW50OChkYXRhW2ldKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gYnVpbGRlci5lbmRWZWN0b3IoKTsKKyAgICB9CisgICAgc3RhdGljIHN0YXJ0VGVzdG5lc3RlZGZsYXRidWZmZXJWZWN0b3IoYnVpbGRlciwgbnVtRWxlbXMpIHsKKyAgICAgICAgYnVpbGRlci5zdGFydFZlY3RvcigxLCBudW1FbGVtcywgMSk7CisgICAgfQorICAgIHN0YXRpYyBhZGRUZXN0ZW1wdHkoYnVpbGRlciwgdGVzdGVtcHR5T2Zmc2V0KSB7CisgICAgICAgIGJ1aWxkZXIuYWRkRmllbGRPZmZzZXQoMTQsIHRlc3RlbXB0eU9mZnNldCwgMCk7CisgICAgfQorICAgIHN0YXRpYyBhZGRUZXN0Ym9vbChidWlsZGVyLCB0ZXN0Ym9vbCkgeworICAgICAgICBidWlsZGVyLmFkZEZpZWxkSW50OCgxNSwgK3Rlc3Rib29sLCArZmFsc2UpOworICAgIH0KKyAgICBzdGF0aWMgYWRkVGVzdGhhc2hzMzJGbnYxKGJ1aWxkZXIsIHRlc3RoYXNoczMyRm52MSkgeworICAgICAgICBidWlsZGVyLmFkZEZpZWxkSW50MzIoMTYsIHRlc3RoYXNoczMyRm52MSwgMCk7CisgICAgfQorICAgIHN0YXRpYyBhZGRUZXN0aGFzaHUzMkZudjEoYnVpbGRlciwgdGVzdGhhc2h1MzJGbnYxKSB7CisgICAgICAgIGJ1aWxkZXIuYWRkRmllbGRJbnQzMigxNywgdGVzdGhhc2h1MzJGbnYxLCAwKTsKKyAgICB9CisgICAgc3RhdGljIGFkZFRlc3RoYXNoczY0Rm52MShidWlsZGVyLCB0ZXN0aGFzaHM2NEZudjEpIHsKKyAgICAgICAgYnVpbGRlci5hZGRGaWVsZEludDY0KDE4LCB0ZXN0aGFzaHM2NEZudjEsIEJpZ0ludCgnMCcpKTsKKyAgICB9CisgICAgc3RhdGljIGFkZFRlc3RoYXNodTY0Rm52MShidWlsZGVyLCB0ZXN0aGFzaHU2NEZudjEpIHsKKyAgICAgICAgYnVpbGRlci5hZGRGaWVsZEludDY0KDE5LCB0ZXN0aGFzaHU2NEZudjEsIEJpZ0ludCgnMCcpKTsKKyAgICB9CisgICAgc3RhdGljIGFkZFRlc3RoYXNoczMyRm52MWEoYnVpbGRlciwgdGVzdGhhc2hzMzJGbnYxYSkgeworICAgICAgICBidWlsZGVyLmFkZEZpZWxkSW50MzIoMjAsIHRlc3RoYXNoczMyRm52MWEsIDApOworICAgIH0KKyAgICBzdGF0aWMgYWRkVGVzdGhhc2h1MzJGbnYxYShidWlsZGVyLCB0ZXN0aGFzaHUzMkZudjFhKSB7CisgICAgICAgIGJ1aWxkZXIuYWRkRmllbGRJbnQzMigyMSwgdGVzdGhhc2h1MzJGbnYxYSwgMCk7CisgICAgfQorICAgIHN0YXRpYyBhZGRUZXN0aGFzaHM2NEZudjFhKGJ1aWxkZXIsIHRlc3RoYXNoczY0Rm52MWEpIHsKKyAgICAgICAgYnVpbGRlci5hZGRGaWVsZEludDY0KDIyLCB0ZXN0aGFzaHM2NEZudjFhLCBCaWdJbnQoJzAnKSk7CisgICAgfQorICAgIHN0YXRpYyBhZGRUZXN0aGFzaHU2NEZudjFhKGJ1aWxkZXIsIHRlc3RoYXNodTY0Rm52MWEpIHsKKyAgICAgICAgYnVpbGRlci5hZGRGaWVsZEludDY0KDIzLCB0ZXN0aGFzaHU2NEZudjFhLCBCaWdJbnQoJzAnKSk7CisgICAgfQorICAgIHN0YXRpYyBhZGRUZXN0YXJyYXlvZmJvb2xzKGJ1aWxkZXIsIHRlc3RhcnJheW9mYm9vbHNPZmZzZXQpIHsKKyAgICAgICAgYnVpbGRlci5hZGRGaWVsZE9mZnNldCgyNCwgdGVzdGFycmF5b2Zib29sc09mZnNldCwgMCk7CisgICAgfQorICAgIHN0YXRpYyBjcmVhdGVUZXN0YXJyYXlvZmJvb2xzVmVjdG9yKGJ1aWxkZXIsIGRhdGEpIHsKKyAgICAgICAgYnVpbGRlci5zdGFydFZlY3RvcigxLCBkYXRhLmxlbmd0aCwgMSk7CisgICAgICAgIGZvciAobGV0IGkgPSBkYXRhLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7CisgICAgICAgICAgICBidWlsZGVyLmFkZEludDgoK2RhdGFbaV0pOworICAgICAgICB9CisgICAgICAgIHJldHVybiBidWlsZGVyLmVuZFZlY3RvcigpOworICAgIH0KKyAgICBzdGF0aWMgc3RhcnRUZXN0YXJyYXlvZmJvb2xzVmVjdG9yKGJ1aWxkZXIsIG51bUVsZW1zKSB7CisgICAgICAgIGJ1aWxkZXIuc3RhcnRWZWN0b3IoMSwgbnVtRWxlbXMsIDEpOworICAgIH0KKyAgICBzdGF0aWMgYWRkVGVzdGYoYnVpbGRlciwgdGVzdGYpIHsKKyAgICAgICAgYnVpbGRlci5hZGRGaWVsZEZsb2F0MzIoMjUsIHRlc3RmLCAzLjE0MTU5KTsKKyAgICB9CisgICAgc3RhdGljIGFkZFRlc3RmMihidWlsZGVyLCB0ZXN0ZjIpIHsKKyAgICAgICAgYnVpbGRlci5hZGRGaWVsZEZsb2F0MzIoMjYsIHRlc3RmMiwgMy4wKTsKKyAgICB9CisgICAgc3RhdGljIGFkZFRlc3RmMyhidWlsZGVyLCB0ZXN0ZjMpIHsKKyAgICAgICAgYnVpbGRlci5hZGRGaWVsZEZsb2F0MzIoMjcsIHRlc3RmMywgMC4wKTsKKyAgICB9CisgICAgc3RhdGljIGFkZFRlc3RhcnJheW9mc3RyaW5nMihidWlsZGVyLCB0ZXN0YXJyYXlvZnN0cmluZzJPZmZzZXQpIHsKKyAgICAgICAgYnVpbGRlci5hZGRGaWVsZE9mZnNldCgyOCwgdGVzdGFycmF5b2ZzdHJpbmcyT2Zmc2V0LCAwKTsKKyAgICB9CisgICAgc3RhdGljIGNyZWF0ZVRlc3RhcnJheW9mc3RyaW5nMlZlY3RvcihidWlsZGVyLCBkYXRhKSB7CisgICAgICAgIGJ1aWxkZXIuc3RhcnRWZWN0b3IoNCwgZGF0YS5sZW5ndGgsIDQpOworICAgICAgICBmb3IgKGxldCBpID0gZGF0YS5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgeworICAgICAgICAgICAgYnVpbGRlci5hZGRPZmZzZXQoZGF0YVtpXSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGJ1aWxkZXIuZW5kVmVjdG9yKCk7CisgICAgfQorICAgIHN0YXRpYyBzdGFydFRlc3RhcnJheW9mc3RyaW5nMlZlY3RvcihidWlsZGVyLCBudW1FbGVtcykgeworICAgICAgICBidWlsZGVyLnN0YXJ0VmVjdG9yKDQsIG51bUVsZW1zLCA0KTsKKyAgICB9CisgICAgc3RhdGljIGFkZFRlc3RhcnJheW9mc29ydGVkc3RydWN0KGJ1aWxkZXIsIHRlc3RhcnJheW9mc29ydGVkc3RydWN0T2Zmc2V0KSB7CisgICAgICAgIGJ1aWxkZXIuYWRkRmllbGRPZmZzZXQoMjksIHRlc3RhcnJheW9mc29ydGVkc3RydWN0T2Zmc2V0LCAwKTsKKyAgICB9CisgICAgc3RhdGljIHN0YXJ0VGVzdGFycmF5b2Zzb3J0ZWRzdHJ1Y3RWZWN0b3IoYnVpbGRlciwgbnVtRWxlbXMpIHsKKyAgICAgICAgYnVpbGRlci5zdGFydFZlY3Rvcig4LCBudW1FbGVtcywgNCk7CisgICAgfQorICAgIHN0YXRpYyBhZGRGbGV4KGJ1aWxkZXIsIGZsZXhPZmZzZXQpIHsKKyAgICAgICAgYnVpbGRlci5hZGRGaWVsZE9mZnNldCgzMCwgZmxleE9mZnNldCwgMCk7CisgICAgfQorICAgIHN0YXRpYyBjcmVhdGVGbGV4VmVjdG9yKGJ1aWxkZXIsIGRhdGEpIHsKKyAgICAgICAgYnVpbGRlci5zdGFydFZlY3RvcigxLCBkYXRhLmxlbmd0aCwgMSk7CisgICAgICAgIGZvciAobGV0IGkgPSBkYXRhLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7CisgICAgICAgICAgICBidWlsZGVyLmFkZEludDgoZGF0YVtpXSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGJ1aWxkZXIuZW5kVmVjdG9yKCk7CisgICAgfQorICAgIHN0YXRpYyBzdGFydEZsZXhWZWN0b3IoYnVpbGRlciwgbnVtRWxlbXMpIHsKKyAgICAgICAgYnVpbGRlci5zdGFydFZlY3RvcigxLCBudW1FbGVtcywgMSk7CisgICAgfQorICAgIHN0YXRpYyBhZGRUZXN0NShidWlsZGVyLCB0ZXN0NU9mZnNldCkgeworICAgICAgICBidWlsZGVyLmFkZEZpZWxkT2Zmc2V0KDMxLCB0ZXN0NU9mZnNldCwgMCk7CisgICAgfQorICAgIHN0YXRpYyBzdGFydFRlc3Q1VmVjdG9yKGJ1aWxkZXIsIG51bUVsZW1zKSB7CisgICAgICAgIGJ1aWxkZXIuc3RhcnRWZWN0b3IoNCwgbnVtRWxlbXMsIDIpOworICAgIH0KKyAgICBzdGF0aWMgYWRkVmVjdG9yT2ZMb25ncyhidWlsZGVyLCB2ZWN0b3JPZkxvbmdzT2Zmc2V0KSB7CisgICAgICAgIGJ1aWxkZXIuYWRkRmllbGRPZmZzZXQoMzIsIHZlY3Rvck9mTG9uZ3NPZmZzZXQsIDApOworICAgIH0KKyAgICBzdGF0aWMgY3JlYXRlVmVjdG9yT2ZMb25nc1ZlY3RvcihidWlsZGVyLCBkYXRhKSB7CisgICAgICAgIGJ1aWxkZXIuc3RhcnRWZWN0b3IoOCwgZGF0YS5sZW5ndGgsIDgpOworICAgICAgICBmb3IgKGxldCBpID0gZGF0YS5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgeworICAgICAgICAgICAgYnVpbGRlci5hZGRJbnQ2NChkYXRhW2ldKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gYnVpbGRlci5lbmRWZWN0b3IoKTsKKyAgICB9CisgICAgc3RhdGljIHN0YXJ0VmVjdG9yT2ZMb25nc1ZlY3RvcihidWlsZGVyLCBudW1FbGVtcykgeworICAgICAgICBidWlsZGVyLnN0YXJ0VmVjdG9yKDgsIG51bUVsZW1zLCA4KTsKKyAgICB9CisgICAgc3RhdGljIGFkZFZlY3Rvck9mRG91YmxlcyhidWlsZGVyLCB2ZWN0b3JPZkRvdWJsZXNPZmZzZXQpIHsKKyAgICAgICAgYnVpbGRlci5hZGRGaWVsZE9mZnNldCgzMywgdmVjdG9yT2ZEb3VibGVzT2Zmc2V0LCAwKTsKKyAgICB9CisgICAgc3RhdGljIGNyZWF0ZVZlY3Rvck9mRG91Ymxlc1ZlY3RvcihidWlsZGVyLCBkYXRhKSB7CisgICAgICAgIGJ1aWxkZXIuc3RhcnRWZWN0b3IoOCwgZGF0YS5sZW5ndGgsIDgpOworICAgICAgICBmb3IgKGxldCBpID0gZGF0YS5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgeworICAgICAgICAgICAgYnVpbGRlci5hZGRGbG9hdDY0KGRhdGFbaV0pOworICAgICAgICB9CisgICAgICAgIHJldHVybiBidWlsZGVyLmVuZFZlY3RvcigpOworICAgIH0KKyAgICBzdGF0aWMgc3RhcnRWZWN0b3JPZkRvdWJsZXNWZWN0b3IoYnVpbGRlciwgbnVtRWxlbXMpIHsKKyAgICAgICAgYnVpbGRlci5zdGFydFZlY3Rvcig4LCBudW1FbGVtcywgOCk7CisgICAgfQorICAgIHN0YXRpYyBhZGRQYXJlbnROYW1lc3BhY2VUZXN0KGJ1aWxkZXIsIHBhcmVudE5hbWVzcGFjZVRlc3RPZmZzZXQpIHsKKyAgICAgICAgYnVpbGRlci5hZGRGaWVsZE9mZnNldCgzNCwgcGFyZW50TmFtZXNwYWNlVGVzdE9mZnNldCwgMCk7CisgICAgfQorICAgIHN0YXRpYyBhZGRWZWN0b3JPZlJlZmVycmFibGVzKGJ1aWxkZXIsIHZlY3Rvck9mUmVmZXJyYWJsZXNPZmZzZXQpIHsKKyAgICAgICAgYnVpbGRlci5hZGRGaWVsZE9mZnNldCgzNSwgdmVjdG9yT2ZSZWZlcnJhYmxlc09mZnNldCwgMCk7CisgICAgfQorICAgIHN0YXRpYyBjcmVhdGVWZWN0b3JPZlJlZmVycmFibGVzVmVjdG9yKGJ1aWxkZXIsIGRhdGEpIHsKKyAgICAgICAgYnVpbGRlci5zdGFydFZlY3Rvcig0LCBkYXRhLmxlbmd0aCwgNCk7CisgICAgICAgIGZvciAobGV0IGkgPSBkYXRhLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7CisgICAgICAgICAgICBidWlsZGVyLmFkZE9mZnNldChkYXRhW2ldKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gYnVpbGRlci5lbmRWZWN0b3IoKTsKKyAgICB9CisgICAgc3RhdGljIHN0YXJ0VmVjdG9yT2ZSZWZlcnJhYmxlc1ZlY3RvcihidWlsZGVyLCBudW1FbGVtcykgeworICAgICAgICBidWlsZGVyLnN0YXJ0VmVjdG9yKDQsIG51bUVsZW1zLCA0KTsKKyAgICB9CisgICAgc3RhdGljIGFkZFNpbmdsZVdlYWtSZWZlcmVuY2UoYnVpbGRlciwgc2luZ2xlV2Vha1JlZmVyZW5jZSkgeworICAgICAgICBidWlsZGVyLmFkZEZpZWxkSW50NjQoMzYsIHNpbmdsZVdlYWtSZWZlcmVuY2UsIEJpZ0ludCgnMCcpKTsKKyAgICB9CisgICAgc3RhdGljIGFkZFZlY3Rvck9mV2Vha1JlZmVyZW5jZXMoYnVpbGRlciwgdmVjdG9yT2ZXZWFrUmVmZXJlbmNlc09mZnNldCkgeworICAgICAgICBidWlsZGVyLmFkZEZpZWxkT2Zmc2V0KDM3LCB2ZWN0b3JPZldlYWtSZWZlcmVuY2VzT2Zmc2V0LCAwKTsKKyAgICB9CisgICAgc3RhdGljIGNyZWF0ZVZlY3Rvck9mV2Vha1JlZmVyZW5jZXNWZWN0b3IoYnVpbGRlciwgZGF0YSkgeworICAgICAgICBidWlsZGVyLnN0YXJ0VmVjdG9yKDgsIGRhdGEubGVuZ3RoLCA4KTsKKyAgICAgICAgZm9yIChsZXQgaSA9IGRhdGEubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHsKKyAgICAgICAgICAgIGJ1aWxkZXIuYWRkSW50NjQoZGF0YVtpXSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGJ1aWxkZXIuZW5kVmVjdG9yKCk7CisgICAgfQorICAgIHN0YXRpYyBzdGFydFZlY3Rvck9mV2Vha1JlZmVyZW5jZXNWZWN0b3IoYnVpbGRlciwgbnVtRWxlbXMpIHsKKyAgICAgICAgYnVpbGRlci5zdGFydFZlY3Rvcig4LCBudW1FbGVtcywgOCk7CisgICAgfQorICAgIHN0YXRpYyBhZGRWZWN0b3JPZlN0cm9uZ1JlZmVycmFibGVzKGJ1aWxkZXIsIHZlY3Rvck9mU3Ryb25nUmVmZXJyYWJsZXNPZmZzZXQpIHsKKyAgICAgICAgYnVpbGRlci5hZGRGaWVsZE9mZnNldCgzOCwgdmVjdG9yT2ZTdHJvbmdSZWZlcnJhYmxlc09mZnNldCwgMCk7CisgICAgfQorICAgIHN0YXRpYyBjcmVhdGVWZWN0b3JPZlN0cm9uZ1JlZmVycmFibGVzVmVjdG9yKGJ1aWxkZXIsIGRhdGEpIHsKKyAgICAgICAgYnVpbGRlci5zdGFydFZlY3Rvcig0LCBkYXRhLmxlbmd0aCwgNCk7CisgICAgICAgIGZvciAobGV0IGkgPSBkYXRhLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7CisgICAgICAgICAgICBidWlsZGVyLmFkZE9mZnNldChkYXRhW2ldKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gYnVpbGRlci5lbmRWZWN0b3IoKTsKKyAgICB9CisgICAgc3RhdGljIHN0YXJ0VmVjdG9yT2ZTdHJvbmdSZWZlcnJhYmxlc1ZlY3RvcihidWlsZGVyLCBudW1FbGVtcykgeworICAgICAgICBidWlsZGVyLnN0YXJ0VmVjdG9yKDQsIG51bUVsZW1zLCA0KTsKKyAgICB9CisgICAgc3RhdGljIGFkZENvT3duaW5nUmVmZXJlbmNlKGJ1aWxkZXIsIGNvT3duaW5nUmVmZXJlbmNlKSB7CisgICAgICAgIGJ1aWxkZXIuYWRkRmllbGRJbnQ2NCgzOSwgY29Pd25pbmdSZWZlcmVuY2UsIEJpZ0ludCgnMCcpKTsKKyAgICB9CisgICAgc3RhdGljIGFkZFZlY3Rvck9mQ29Pd25pbmdSZWZlcmVuY2VzKGJ1aWxkZXIsIHZlY3Rvck9mQ29Pd25pbmdSZWZlcmVuY2VzT2Zmc2V0KSB7CisgICAgICAgIGJ1aWxkZXIuYWRkRmllbGRPZmZzZXQoNDAsIHZlY3Rvck9mQ29Pd25pbmdSZWZlcmVuY2VzT2Zmc2V0LCAwKTsKKyAgICB9CisgICAgc3RhdGljIGNyZWF0ZVZlY3Rvck9mQ29Pd25pbmdSZWZlcmVuY2VzVmVjdG9yKGJ1aWxkZXIsIGRhdGEpIHsKKyAgICAgICAgYnVpbGRlci5zdGFydFZlY3Rvcig4LCBkYXRhLmxlbmd0aCwgOCk7CisgICAgICAgIGZvciAobGV0IGkgPSBkYXRhLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7CisgICAgICAgICAgICBidWlsZGVyLmFkZEludDY0KGRhdGFbaV0pOworICAgICAgICB9CisgICAgICAgIHJldHVybiBidWlsZGVyLmVuZFZlY3RvcigpOworICAgIH0KKyAgICBzdGF0aWMgc3RhcnRWZWN0b3JPZkNvT3duaW5nUmVmZXJlbmNlc1ZlY3RvcihidWlsZGVyLCBudW1FbGVtcykgeworICAgICAgICBidWlsZGVyLnN0YXJ0VmVjdG9yKDgsIG51bUVsZW1zLCA4KTsKKyAgICB9CisgICAgc3RhdGljIGFkZE5vbk93bmluZ1JlZmVyZW5jZShidWlsZGVyLCBub25Pd25pbmdSZWZlcmVuY2UpIHsKKyAgICAgICAgYnVpbGRlci5hZGRGaWVsZEludDY0KDQxLCBub25Pd25pbmdSZWZlcmVuY2UsIEJpZ0ludCgnMCcpKTsKKyAgICB9CisgICAgc3RhdGljIGFkZFZlY3Rvck9mTm9uT3duaW5nUmVmZXJlbmNlcyhidWlsZGVyLCB2ZWN0b3JPZk5vbk93bmluZ1JlZmVyZW5jZXNPZmZzZXQpIHsKKyAgICAgICAgYnVpbGRlci5hZGRGaWVsZE9mZnNldCg0MiwgdmVjdG9yT2ZOb25Pd25pbmdSZWZlcmVuY2VzT2Zmc2V0LCAwKTsKKyAgICB9CisgICAgc3RhdGljIGNyZWF0ZVZlY3Rvck9mTm9uT3duaW5nUmVmZXJlbmNlc1ZlY3RvcihidWlsZGVyLCBkYXRhKSB7CisgICAgICAgIGJ1aWxkZXIuc3RhcnRWZWN0b3IoOCwgZGF0YS5sZW5ndGgsIDgpOworICAgICAgICBmb3IgKGxldCBpID0gZGF0YS5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgeworICAgICAgICAgICAgYnVpbGRlci5hZGRJbnQ2NChkYXRhW2ldKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gYnVpbGRlci5lbmRWZWN0b3IoKTsKKyAgICB9CisgICAgc3RhdGljIHN0YXJ0VmVjdG9yT2ZOb25Pd25pbmdSZWZlcmVuY2VzVmVjdG9yKGJ1aWxkZXIsIG51bUVsZW1zKSB7CisgICAgICAgIGJ1aWxkZXIuc3RhcnRWZWN0b3IoOCwgbnVtRWxlbXMsIDgpOworICAgIH0KKyAgICBzdGF0aWMgYWRkQW55VW5pcXVlVHlwZShidWlsZGVyLCBhbnlVbmlxdWVUeXBlKSB7CisgICAgICAgIGJ1aWxkZXIuYWRkRmllbGRJbnQ4KDQzLCBhbnlVbmlxdWVUeXBlLCBBbnlVbmlxdWVBbGlhc2VzLk5PTkUpOworICAgIH0KKyAgICBzdGF0aWMgYWRkQW55VW5pcXVlKGJ1aWxkZXIsIGFueVVuaXF1ZU9mZnNldCkgeworICAgICAgICBidWlsZGVyLmFkZEZpZWxkT2Zmc2V0KDQ0LCBhbnlVbmlxdWVPZmZzZXQsIDApOworICAgIH0KKyAgICBzdGF0aWMgYWRkQW55QW1iaWd1b3VzVHlwZShidWlsZGVyLCBhbnlBbWJpZ3VvdXNUeXBlKSB7CisgICAgICAgIGJ1aWxkZXIuYWRkRmllbGRJbnQ4KDQ1LCBhbnlBbWJpZ3VvdXNUeXBlLCBBbnlBbWJpZ3VvdXNBbGlhc2VzLk5PTkUpOworICAgIH0KKyAgICBzdGF0aWMgYWRkQW55QW1iaWd1b3VzKGJ1aWxkZXIsIGFueUFtYmlndW91c09mZnNldCkgeworICAgICAgICBidWlsZGVyLmFkZEZpZWxkT2Zmc2V0KDQ2LCBhbnlBbWJpZ3VvdXNPZmZzZXQsIDApOworICAgIH0KKyAgICBzdGF0aWMgYWRkVmVjdG9yT2ZFbnVtcyhidWlsZGVyLCB2ZWN0b3JPZkVudW1zT2Zmc2V0KSB7CisgICAgICAgIGJ1aWxkZXIuYWRkRmllbGRPZmZzZXQoNDcsIHZlY3Rvck9mRW51bXNPZmZzZXQsIDApOworICAgIH0KKyAgICBzdGF0aWMgY3JlYXRlVmVjdG9yT2ZFbnVtc1ZlY3RvcihidWlsZGVyLCBkYXRhKSB7CisgICAgICAgIGJ1aWxkZXIuc3RhcnRWZWN0b3IoMSwgZGF0YS5sZW5ndGgsIDEpOworICAgICAgICBmb3IgKGxldCBpID0gZGF0YS5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgeworICAgICAgICAgICAgYnVpbGRlci5hZGRJbnQ4KGRhdGFbaV0pOworICAgICAgICB9CisgICAgICAgIHJldHVybiBidWlsZGVyLmVuZFZlY3RvcigpOworICAgIH0KKyAgICBzdGF0aWMgc3RhcnRWZWN0b3JPZkVudW1zVmVjdG9yKGJ1aWxkZXIsIG51bUVsZW1zKSB7CisgICAgICAgIGJ1aWxkZXIuc3RhcnRWZWN0b3IoMSwgbnVtRWxlbXMsIDEpOworICAgIH0KKyAgICBzdGF0aWMgYWRkU2lnbmVkRW51bShidWlsZGVyLCBzaWduZWRFbnVtKSB7CisgICAgICAgIGJ1aWxkZXIuYWRkRmllbGRJbnQ4KDQ4LCBzaWduZWRFbnVtLCBSYWNlLk5vbmUpOworICAgIH0KKyAgICBzdGF0aWMgYWRkVGVzdHJlcXVpcmVkbmVzdGVkZmxhdGJ1ZmZlcihidWlsZGVyLCB0ZXN0cmVxdWlyZWRuZXN0ZWRmbGF0YnVmZmVyT2Zmc2V0KSB7CisgICAgICAgIGJ1aWxkZXIuYWRkRmllbGRPZmZzZXQoNDksIHRlc3RyZXF1aXJlZG5lc3RlZGZsYXRidWZmZXJPZmZzZXQsIDApOworICAgIH0KKyAgICBzdGF0aWMgY3JlYXRlVGVzdHJlcXVpcmVkbmVzdGVkZmxhdGJ1ZmZlclZlY3RvcihidWlsZGVyLCBkYXRhKSB7CisgICAgICAgIGJ1aWxkZXIuc3RhcnRWZWN0b3IoMSwgZGF0YS5sZW5ndGgsIDEpOworICAgICAgICBmb3IgKGxldCBpID0gZGF0YS5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgeworICAgICAgICAgICAgYnVpbGRlci5hZGRJbnQ4KGRhdGFbaV0pOworICAgICAgICB9CisgICAgICAgIHJldHVybiBidWlsZGVyLmVuZFZlY3RvcigpOworICAgIH0KKyAgICBzdGF0aWMgc3RhcnRUZXN0cmVxdWlyZWRuZXN0ZWRmbGF0YnVmZmVyVmVjdG9yKGJ1aWxkZXIsIG51bUVsZW1zKSB7CisgICAgICAgIGJ1aWxkZXIuc3RhcnRWZWN0b3IoMSwgbnVtRWxlbXMsIDEpOworICAgIH0KKyAgICBzdGF0aWMgYWRkU2NhbGFyS2V5U29ydGVkVGFibGVzKGJ1aWxkZXIsIHNjYWxhcktleVNvcnRlZFRhYmxlc09mZnNldCkgeworICAgICAgICBidWlsZGVyLmFkZEZpZWxkT2Zmc2V0KDUwLCBzY2FsYXJLZXlTb3J0ZWRUYWJsZXNPZmZzZXQsIDApOworICAgIH0KKyAgICBzdGF0aWMgY3JlYXRlU2NhbGFyS2V5U29ydGVkVGFibGVzVmVjdG9yKGJ1aWxkZXIsIGRhdGEpIHsKKyAgICAgICAgYnVpbGRlci5zdGFydFZlY3Rvcig0LCBkYXRhLmxlbmd0aCwgNCk7CisgICAgICAgIGZvciAobGV0IGkgPSBkYXRhLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7CisgICAgICAgICAgICBidWlsZGVyLmFkZE9mZnNldChkYXRhW2ldKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gYnVpbGRlci5lbmRWZWN0b3IoKTsKKyAgICB9CisgICAgc3RhdGljIHN0YXJ0U2NhbGFyS2V5U29ydGVkVGFibGVzVmVjdG9yKGJ1aWxkZXIsIG51bUVsZW1zKSB7CisgICAgICAgIGJ1aWxkZXIuc3RhcnRWZWN0b3IoNCwgbnVtRWxlbXMsIDQpOworICAgIH0KKyAgICBzdGF0aWMgYWRkTmF0aXZlSW5saW5lKGJ1aWxkZXIsIG5hdGl2ZUlubGluZU9mZnNldCkgeworICAgICAgICBidWlsZGVyLmFkZEZpZWxkU3RydWN0KDUxLCBuYXRpdmVJbmxpbmVPZmZzZXQsIDApOworICAgIH0KKyAgICBzdGF0aWMgYWRkTG9uZ0VudW1Ob25FbnVtRGVmYXVsdChidWlsZGVyLCBsb25nRW51bU5vbkVudW1EZWZhdWx0KSB7CisgICAgICAgIGJ1aWxkZXIuYWRkRmllbGRJbnQ2NCg1MiwgbG9uZ0VudW1Ob25FbnVtRGVmYXVsdCwgQmlnSW50KCcwJykpOworICAgIH0KKyAgICBzdGF0aWMgYWRkTG9uZ0VudW1Ob3JtYWxEZWZhdWx0KGJ1aWxkZXIsIGxvbmdFbnVtTm9ybWFsRGVmYXVsdCkgeworICAgICAgICBidWlsZGVyLmFkZEZpZWxkSW50NjQoNTMsIGxvbmdFbnVtTm9ybWFsRGVmYXVsdCwgQmlnSW50KCcyJykpOworICAgIH0KKyAgICBzdGF0aWMgZW5kTW9uc3RlcihidWlsZGVyKSB7CisgICAgICAgIGNvbnN0IG9mZnNldCA9IGJ1aWxkZXIuZW5kT2JqZWN0KCk7CisgICAgICAgIGJ1aWxkZXIucmVxdWlyZWRGaWVsZChvZmZzZXQsIDEwKTsgLy8gbmFtZQorICAgICAgICByZXR1cm4gb2Zmc2V0OworICAgIH0KKyAgICBzdGF0aWMgZmluaXNoTW9uc3RlckJ1ZmZlcihidWlsZGVyLCBvZmZzZXQpIHsKKyAgICAgICAgYnVpbGRlci5maW5pc2gob2Zmc2V0LCAnTU9OUycpOworICAgIH0KKyAgICBzdGF0aWMgZmluaXNoU2l6ZVByZWZpeGVkTW9uc3RlckJ1ZmZlcihidWlsZGVyLCBvZmZzZXQpIHsKKyAgICAgICAgYnVpbGRlci5maW5pc2gob2Zmc2V0LCAnTU9OUycsIHRydWUpOworICAgIH0KKyAgICBzZXJpYWxpemUoKSB7CisgICAgICAgIHJldHVybiB0aGlzLmJiLmJ5dGVzKCk7CisgICAgfQorICAgIHN0YXRpYyBkZXNlcmlhbGl6ZShidWZmZXIpIHsKKyAgICAgICAgcmV0dXJuIE1vbnN0ZXIuZ2V0Um9vdEFzTW9uc3RlcihuZXcgZmxhdGJ1ZmZlcnMuQnl0ZUJ1ZmZlcihidWZmZXIpKTsKKyAgICB9CisgICAgdW5wYWNrKCkgeworICAgICAgICByZXR1cm4gbmV3IE1vbnN0ZXJUKCh0aGlzLnBvcygpICE9PSBudWxsID8gdGhpcy5wb3MoKS51bnBhY2soKSA6IG51bGwpLCB0aGlzLm1hbmEoKSwgdGhpcy5ocCgpLCB0aGlzLm5hbWUoKSwgdGhpcy5iYi5jcmVhdGVTY2FsYXJMaXN0KHRoaXMuaW52ZW50b3J5LmJpbmQodGhpcyksIHRoaXMuaW52ZW50b3J5TGVuZ3RoKCkpLCB0aGlzLmNvbG9yKCksIHRoaXMudGVzdFR5cGUoKSwgKCgpID0+IHsKKyAgICAgICAgICAgIGxldCB0ZW1wID0gdW5pb25Ub0FueSh0aGlzLnRlc3RUeXBlKCksIHRoaXMudGVzdC5iaW5kKHRoaXMpKTsKKyAgICAgICAgICAgIGlmICh0ZW1wID09PSBudWxsKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gdGVtcC51bnBhY2soKTsKKyAgICAgICAgfSkoKSwgdGhpcy5iYi5jcmVhdGVPYmpMaXN0KHRoaXMudGVzdDQuYmluZCh0aGlzKSwgdGhpcy50ZXN0NExlbmd0aCgpKSwgdGhpcy5iYi5jcmVhdGVTY2FsYXJMaXN0KHRoaXMudGVzdGFycmF5b2ZzdHJpbmcuYmluZCh0aGlzKSwgdGhpcy50ZXN0YXJyYXlvZnN0cmluZ0xlbmd0aCgpKSwgdGhpcy5iYi5jcmVhdGVPYmpMaXN0KHRoaXMudGVzdGFycmF5b2Z0YWJsZXMuYmluZCh0aGlzKSwgdGhpcy50ZXN0YXJyYXlvZnRhYmxlc0xlbmd0aCgpKSwgKHRoaXMuZW5lbXkoKSAhPT0gbnVsbCA/IHRoaXMuZW5lbXkoKS51bnBhY2soKSA6IG51bGwpLCB0aGlzLmJiLmNyZWF0ZVNjYWxhckxpc3QodGhpcy50ZXN0bmVzdGVkZmxhdGJ1ZmZlci5iaW5kKHRoaXMpLCB0aGlzLnRlc3RuZXN0ZWRmbGF0YnVmZmVyTGVuZ3RoKCkpLCAodGhpcy50ZXN0ZW1wdHkoKSAhPT0gbnVsbCA/IHRoaXMudGVzdGVtcHR5KCkudW5wYWNrKCkgOiBudWxsKSwgdGhpcy50ZXN0Ym9vbCgpLCB0aGlzLnRlc3RoYXNoczMyRm52MSgpLCB0aGlzLnRlc3RoYXNodTMyRm52MSgpLCB0aGlzLnRlc3RoYXNoczY0Rm52MSgpLCB0aGlzLnRlc3RoYXNodTY0Rm52MSgpLCB0aGlzLnRlc3RoYXNoczMyRm52MWEoKSwgdGhpcy50ZXN0aGFzaHUzMkZudjFhKCksIHRoaXMudGVzdGhhc2hzNjRGbnYxYSgpLCB0aGlzLnRlc3RoYXNodTY0Rm52MWEoKSwgdGhpcy5iYi5jcmVhdGVTY2FsYXJMaXN0KHRoaXMudGVzdGFycmF5b2Zib29scy5iaW5kKHRoaXMpLCB0aGlzLnRlc3RhcnJheW9mYm9vbHNMZW5ndGgoKSksIHRoaXMudGVzdGYoKSwgdGhpcy50ZXN0ZjIoKSwgdGhpcy50ZXN0ZjMoKSwgdGhpcy5iYi5jcmVhdGVTY2FsYXJMaXN0KHRoaXMudGVzdGFycmF5b2ZzdHJpbmcyLmJpbmQodGhpcyksIHRoaXMudGVzdGFycmF5b2ZzdHJpbmcyTGVuZ3RoKCkpLCB0aGlzLmJiLmNyZWF0ZU9iakxpc3QodGhpcy50ZXN0YXJyYXlvZnNvcnRlZHN0cnVjdC5iaW5kKHRoaXMpLCB0aGlzLnRlc3RhcnJheW9mc29ydGVkc3RydWN0TGVuZ3RoKCkpLCB0aGlzLmJiLmNyZWF0ZVNjYWxhckxpc3QodGhpcy5mbGV4LmJpbmQodGhpcyksIHRoaXMuZmxleExlbmd0aCgpKSwgdGhpcy5iYi5jcmVhdGVPYmpMaXN0KHRoaXMudGVzdDUuYmluZCh0aGlzKSwgdGhpcy50ZXN0NUxlbmd0aCgpKSwgdGhpcy5iYi5jcmVhdGVTY2FsYXJMaXN0KHRoaXMudmVjdG9yT2ZMb25ncy5iaW5kKHRoaXMpLCB0aGlzLnZlY3Rvck9mTG9uZ3NMZW5ndGgoKSksIHRoaXMuYmIuY3JlYXRlU2NhbGFyTGlzdCh0aGlzLnZlY3Rvck9mRG91Ymxlcy5iaW5kKHRoaXMpLCB0aGlzLnZlY3Rvck9mRG91Ymxlc0xlbmd0aCgpKSwgKHRoaXMucGFyZW50TmFtZXNwYWNlVGVzdCgpICE9PSBudWxsID8gdGhpcy5wYXJlbnROYW1lc3BhY2VUZXN0KCkudW5wYWNrKCkgOiBudWxsKSwgdGhpcy5iYi5jcmVhdGVPYmpMaXN0KHRoaXMudmVjdG9yT2ZSZWZlcnJhYmxlcy5iaW5kKHRoaXMpLCB0aGlzLnZlY3Rvck9mUmVmZXJyYWJsZXNMZW5ndGgoKSksIHRoaXMuc2luZ2xlV2Vha1JlZmVyZW5jZSgpLCB0aGlzLmJiLmNyZWF0ZVNjYWxhckxpc3QodGhpcy52ZWN0b3JPZldlYWtSZWZlcmVuY2VzLmJpbmQodGhpcyksIHRoaXMudmVjdG9yT2ZXZWFrUmVmZXJlbmNlc0xlbmd0aCgpKSwgdGhpcy5iYi5jcmVhdGVPYmpMaXN0KHRoaXMudmVjdG9yT2ZTdHJvbmdSZWZlcnJhYmxlcy5iaW5kKHRoaXMpLCB0aGlzLnZlY3Rvck9mU3Ryb25nUmVmZXJyYWJsZXNMZW5ndGgoKSksIHRoaXMuY29Pd25pbmdSZWZlcmVuY2UoKSwgdGhpcy5iYi5jcmVhdGVTY2FsYXJMaXN0KHRoaXMudmVjdG9yT2ZDb093bmluZ1JlZmVyZW5jZXMuYmluZCh0aGlzKSwgdGhpcy52ZWN0b3JPZkNvT3duaW5nUmVmZXJlbmNlc0xlbmd0aCgpKSwgdGhpcy5ub25Pd25pbmdSZWZlcmVuY2UoKSwgdGhpcy5iYi5jcmVhdGVTY2FsYXJMaXN0KHRoaXMudmVjdG9yT2ZOb25Pd25pbmdSZWZlcmVuY2VzLmJpbmQodGhpcyksIHRoaXMudmVjdG9yT2ZOb25Pd25pbmdSZWZlcmVuY2VzTGVuZ3RoKCkpLCB0aGlzLmFueVVuaXF1ZVR5cGUoKSwgKCgpID0+IHsKKyAgICAgICAgICAgIGxldCB0ZW1wID0gdW5pb25Ub0FueVVuaXF1ZUFsaWFzZXModGhpcy5hbnlVbmlxdWVUeXBlKCksIHRoaXMuYW55VW5pcXVlLmJpbmQodGhpcykpOworICAgICAgICAgICAgaWYgKHRlbXAgPT09IG51bGwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiB0ZW1wLnVucGFjaygpOworICAgICAgICB9KSgpLCB0aGlzLmFueUFtYmlndW91c1R5cGUoKSwgKCgpID0+IHsKKyAgICAgICAgICAgIGxldCB0ZW1wID0gdW5pb25Ub0FueUFtYmlndW91c0FsaWFzZXModGhpcy5hbnlBbWJpZ3VvdXNUeXBlKCksIHRoaXMuYW55QW1iaWd1b3VzLmJpbmQodGhpcykpOworICAgICAgICAgICAgaWYgKHRlbXAgPT09IG51bGwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiB0ZW1wLnVucGFjaygpOworICAgICAgICB9KSgpLCB0aGlzLmJiLmNyZWF0ZVNjYWxhckxpc3QodGhpcy52ZWN0b3JPZkVudW1zLmJpbmQodGhpcyksIHRoaXMudmVjdG9yT2ZFbnVtc0xlbmd0aCgpKSwgdGhpcy5zaWduZWRFbnVtKCksIHRoaXMuYmIuY3JlYXRlU2NhbGFyTGlzdCh0aGlzLnRlc3RyZXF1aXJlZG5lc3RlZGZsYXRidWZmZXIuYmluZCh0aGlzKSwgdGhpcy50ZXN0cmVxdWlyZWRuZXN0ZWRmbGF0YnVmZmVyTGVuZ3RoKCkpLCB0aGlzLmJiLmNyZWF0ZU9iakxpc3QodGhpcy5zY2FsYXJLZXlTb3J0ZWRUYWJsZXMuYmluZCh0aGlzKSwgdGhpcy5zY2FsYXJLZXlTb3J0ZWRUYWJsZXNMZW5ndGgoKSksICh0aGlzLm5hdGl2ZUlubGluZSgpICE9PSBudWxsID8gdGhpcy5uYXRpdmVJbmxpbmUoKS51bnBhY2soKSA6IG51bGwpLCB0aGlzLmxvbmdFbnVtTm9uRW51bURlZmF1bHQoKSwgdGhpcy5sb25nRW51bU5vcm1hbERlZmF1bHQoKSk7CisgICAgfQorICAgIHVucGFja1RvKF9vKSB7CisgICAgICAgIF9vLnBvcyA9ICh0aGlzLnBvcygpICE9PSBudWxsID8gdGhpcy5wb3MoKS51bnBhY2soKSA6IG51bGwpOworICAgICAgICBfby5tYW5hID0gdGhpcy5tYW5hKCk7CisgICAgICAgIF9vLmhwID0gdGhpcy5ocCgpOworICAgICAgICBfby5uYW1lID0gdGhpcy5uYW1lKCk7CisgICAgICAgIF9vLmludmVudG9yeSA9IHRoaXMuYmIuY3JlYXRlU2NhbGFyTGlzdCh0aGlzLmludmVudG9yeS5iaW5kKHRoaXMpLCB0aGlzLmludmVudG9yeUxlbmd0aCgpKTsKKyAgICAgICAgX28uY29sb3IgPSB0aGlzLmNvbG9yKCk7CisgICAgICAgIF9vLnRlc3RUeXBlID0gdGhpcy50ZXN0VHlwZSgpOworICAgICAgICBfby50ZXN0ID0gKCgpID0+IHsKKyAgICAgICAgICAgIGxldCB0ZW1wID0gdW5pb25Ub0FueSh0aGlzLnRlc3RUeXBlKCksIHRoaXMudGVzdC5iaW5kKHRoaXMpKTsKKyAgICAgICAgICAgIGlmICh0ZW1wID09PSBudWxsKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gdGVtcC51bnBhY2soKTsKKyAgICAgICAgfSkoKTsKKyAgICAgICAgX28udGVzdDQgPSB0aGlzLmJiLmNyZWF0ZU9iakxpc3QodGhpcy50ZXN0NC5iaW5kKHRoaXMpLCB0aGlzLnRlc3Q0TGVuZ3RoKCkpOworICAgICAgICBfby50ZXN0YXJyYXlvZnN0cmluZyA9IHRoaXMuYmIuY3JlYXRlU2NhbGFyTGlzdCh0aGlzLnRlc3RhcnJheW9mc3RyaW5nLmJpbmQodGhpcyksIHRoaXMudGVzdGFycmF5b2ZzdHJpbmdMZW5ndGgoKSk7CisgICAgICAgIF9vLnRlc3RhcnJheW9mdGFibGVzID0gdGhpcy5iYi5jcmVhdGVPYmpMaXN0KHRoaXMudGVzdGFycmF5b2Z0YWJsZXMuYmluZCh0aGlzKSwgdGhpcy50ZXN0YXJyYXlvZnRhYmxlc0xlbmd0aCgpKTsKKyAgICAgICAgX28uZW5lbXkgPSAodGhpcy5lbmVteSgpICE9PSBudWxsID8gdGhpcy5lbmVteSgpLnVucGFjaygpIDogbnVsbCk7CisgICAgICAgIF9vLnRlc3RuZXN0ZWRmbGF0YnVmZmVyID0gdGhpcy5iYi5jcmVhdGVTY2FsYXJMaXN0KHRoaXMudGVzdG5lc3RlZGZsYXRidWZmZXIuYmluZCh0aGlzKSwgdGhpcy50ZXN0bmVzdGVkZmxhdGJ1ZmZlckxlbmd0aCgpKTsKKyAgICAgICAgX28udGVzdGVtcHR5ID0gKHRoaXMudGVzdGVtcHR5KCkgIT09IG51bGwgPyB0aGlzLnRlc3RlbXB0eSgpLnVucGFjaygpIDogbnVsbCk7CisgICAgICAgIF9vLnRlc3Rib29sID0gdGhpcy50ZXN0Ym9vbCgpOworICAgICAgICBfby50ZXN0aGFzaHMzMkZudjEgPSB0aGlzLnRlc3RoYXNoczMyRm52MSgpOworICAgICAgICBfby50ZXN0aGFzaHUzMkZudjEgPSB0aGlzLnRlc3RoYXNodTMyRm52MSgpOworICAgICAgICBfby50ZXN0aGFzaHM2NEZudjEgPSB0aGlzLnRlc3RoYXNoczY0Rm52MSgpOworICAgICAgICBfby50ZXN0aGFzaHU2NEZudjEgPSB0aGlzLnRlc3RoYXNodTY0Rm52MSgpOworICAgICAgICBfby50ZXN0aGFzaHMzMkZudjFhID0gdGhpcy50ZXN0aGFzaHMzMkZudjFhKCk7CisgICAgICAgIF9vLnRlc3RoYXNodTMyRm52MWEgPSB0aGlzLnRlc3RoYXNodTMyRm52MWEoKTsKKyAgICAgICAgX28udGVzdGhhc2hzNjRGbnYxYSA9IHRoaXMudGVzdGhhc2hzNjRGbnYxYSgpOworICAgICAgICBfby50ZXN0aGFzaHU2NEZudjFhID0gdGhpcy50ZXN0aGFzaHU2NEZudjFhKCk7CisgICAgICAgIF9vLnRlc3RhcnJheW9mYm9vbHMgPSB0aGlzLmJiLmNyZWF0ZVNjYWxhckxpc3QodGhpcy50ZXN0YXJyYXlvZmJvb2xzLmJpbmQodGhpcyksIHRoaXMudGVzdGFycmF5b2Zib29sc0xlbmd0aCgpKTsKKyAgICAgICAgX28udGVzdGYgPSB0aGlzLnRlc3RmKCk7CisgICAgICAgIF9vLnRlc3RmMiA9IHRoaXMudGVzdGYyKCk7CisgICAgICAgIF9vLnRlc3RmMyA9IHRoaXMudGVzdGYzKCk7CisgICAgICAgIF9vLnRlc3RhcnJheW9mc3RyaW5nMiA9IHRoaXMuYmIuY3JlYXRlU2NhbGFyTGlzdCh0aGlzLnRlc3RhcnJheW9mc3RyaW5nMi5iaW5kKHRoaXMpLCB0aGlzLnRlc3RhcnJheW9mc3RyaW5nMkxlbmd0aCgpKTsKKyAgICAgICAgX28udGVzdGFycmF5b2Zzb3J0ZWRzdHJ1Y3QgPSB0aGlzLmJiLmNyZWF0ZU9iakxpc3QodGhpcy50ZXN0YXJyYXlvZnNvcnRlZHN0cnVjdC5iaW5kKHRoaXMpLCB0aGlzLnRlc3RhcnJheW9mc29ydGVkc3RydWN0TGVuZ3RoKCkpOworICAgICAgICBfby5mbGV4ID0gdGhpcy5iYi5jcmVhdGVTY2FsYXJMaXN0KHRoaXMuZmxleC5iaW5kKHRoaXMpLCB0aGlzLmZsZXhMZW5ndGgoKSk7CisgICAgICAgIF9vLnRlc3Q1ID0gdGhpcy5iYi5jcmVhdGVPYmpMaXN0KHRoaXMudGVzdDUuYmluZCh0aGlzKSwgdGhpcy50ZXN0NUxlbmd0aCgpKTsKKyAgICAgICAgX28udmVjdG9yT2ZMb25ncyA9IHRoaXMuYmIuY3JlYXRlU2NhbGFyTGlzdCh0aGlzLnZlY3Rvck9mTG9uZ3MuYmluZCh0aGlzKSwgdGhpcy52ZWN0b3JPZkxvbmdzTGVuZ3RoKCkpOworICAgICAgICBfby52ZWN0b3JPZkRvdWJsZXMgPSB0aGlzLmJiLmNyZWF0ZVNjYWxhckxpc3QodGhpcy52ZWN0b3JPZkRvdWJsZXMuYmluZCh0aGlzKSwgdGhpcy52ZWN0b3JPZkRvdWJsZXNMZW5ndGgoKSk7CisgICAgICAgIF9vLnBhcmVudE5hbWVzcGFjZVRlc3QgPSAodGhpcy5wYXJlbnROYW1lc3BhY2VUZXN0KCkgIT09IG51bGwgPyB0aGlzLnBhcmVudE5hbWVzcGFjZVRlc3QoKS51bnBhY2soKSA6IG51bGwpOworICAgICAgICBfby52ZWN0b3JPZlJlZmVycmFibGVzID0gdGhpcy5iYi5jcmVhdGVPYmpMaXN0KHRoaXMudmVjdG9yT2ZSZWZlcnJhYmxlcy5iaW5kKHRoaXMpLCB0aGlzLnZlY3Rvck9mUmVmZXJyYWJsZXNMZW5ndGgoKSk7CisgICAgICAgIF9vLnNpbmdsZVdlYWtSZWZlcmVuY2UgPSB0aGlzLnNpbmdsZVdlYWtSZWZlcmVuY2UoKTsKKyAgICAgICAgX28udmVjdG9yT2ZXZWFrUmVmZXJlbmNlcyA9IHRoaXMuYmIuY3JlYXRlU2NhbGFyTGlzdCh0aGlzLnZlY3Rvck9mV2Vha1JlZmVyZW5jZXMuYmluZCh0aGlzKSwgdGhpcy52ZWN0b3JPZldlYWtSZWZlcmVuY2VzTGVuZ3RoKCkpOworICAgICAgICBfby52ZWN0b3JPZlN0cm9uZ1JlZmVycmFibGVzID0gdGhpcy5iYi5jcmVhdGVPYmpMaXN0KHRoaXMudmVjdG9yT2ZTdHJvbmdSZWZlcnJhYmxlcy5iaW5kKHRoaXMpLCB0aGlzLnZlY3Rvck9mU3Ryb25nUmVmZXJyYWJsZXNMZW5ndGgoKSk7CisgICAgICAgIF9vLmNvT3duaW5nUmVmZXJlbmNlID0gdGhpcy5jb093bmluZ1JlZmVyZW5jZSgpOworICAgICAgICBfby52ZWN0b3JPZkNvT3duaW5nUmVmZXJlbmNlcyA9IHRoaXMuYmIuY3JlYXRlU2NhbGFyTGlzdCh0aGlzLnZlY3Rvck9mQ29Pd25pbmdSZWZlcmVuY2VzLmJpbmQodGhpcyksIHRoaXMudmVjdG9yT2ZDb093bmluZ1JlZmVyZW5jZXNMZW5ndGgoKSk7CisgICAgICAgIF9vLm5vbk93bmluZ1JlZmVyZW5jZSA9IHRoaXMubm9uT3duaW5nUmVmZXJlbmNlKCk7CisgICAgICAgIF9vLnZlY3Rvck9mTm9uT3duaW5nUmVmZXJlbmNlcyA9IHRoaXMuYmIuY3JlYXRlU2NhbGFyTGlzdCh0aGlzLnZlY3Rvck9mTm9uT3duaW5nUmVmZXJlbmNlcy5iaW5kKHRoaXMpLCB0aGlzLnZlY3Rvck9mTm9uT3duaW5nUmVmZXJlbmNlc0xlbmd0aCgpKTsKKyAgICAgICAgX28uYW55VW5pcXVlVHlwZSA9IHRoaXMuYW55VW5pcXVlVHlwZSgpOworICAgICAgICBfby5hbnlVbmlxdWUgPSAoKCkgPT4geworICAgICAgICAgICAgbGV0IHRlbXAgPSB1bmlvblRvQW55VW5pcXVlQWxpYXNlcyh0aGlzLmFueVVuaXF1ZVR5cGUoKSwgdGhpcy5hbnlVbmlxdWUuYmluZCh0aGlzKSk7CisgICAgICAgICAgICBpZiAodGVtcCA9PT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHRlbXAudW5wYWNrKCk7CisgICAgICAgIH0pKCk7CisgICAgICAgIF9vLmFueUFtYmlndW91c1R5cGUgPSB0aGlzLmFueUFtYmlndW91c1R5cGUoKTsKKyAgICAgICAgX28uYW55QW1iaWd1b3VzID0gKCgpID0+IHsKKyAgICAgICAgICAgIGxldCB0ZW1wID0gdW5pb25Ub0FueUFtYmlndW91c0FsaWFzZXModGhpcy5hbnlBbWJpZ3VvdXNUeXBlKCksIHRoaXMuYW55QW1iaWd1b3VzLmJpbmQodGhpcykpOworICAgICAgICAgICAgaWYgKHRlbXAgPT09IG51bGwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiB0ZW1wLnVucGFjaygpOworICAgICAgICB9KSgpOworICAgICAgICBfby52ZWN0b3JPZkVudW1zID0gdGhpcy5iYi5jcmVhdGVTY2FsYXJMaXN0KHRoaXMudmVjdG9yT2ZFbnVtcy5iaW5kKHRoaXMpLCB0aGlzLnZlY3Rvck9mRW51bXNMZW5ndGgoKSk7CisgICAgICAgIF9vLnNpZ25lZEVudW0gPSB0aGlzLnNpZ25lZEVudW0oKTsKKyAgICAgICAgX28udGVzdHJlcXVpcmVkbmVzdGVkZmxhdGJ1ZmZlciA9IHRoaXMuYmIuY3JlYXRlU2NhbGFyTGlzdCh0aGlzLnRlc3RyZXF1aXJlZG5lc3RlZGZsYXRidWZmZXIuYmluZCh0aGlzKSwgdGhpcy50ZXN0cmVxdWlyZWRuZXN0ZWRmbGF0YnVmZmVyTGVuZ3RoKCkpOworICAgICAgICBfby5zY2FsYXJLZXlTb3J0ZWRUYWJsZXMgPSB0aGlzLmJiLmNyZWF0ZU9iakxpc3QodGhpcy5zY2FsYXJLZXlTb3J0ZWRUYWJsZXMuYmluZCh0aGlzKSwgdGhpcy5zY2FsYXJLZXlTb3J0ZWRUYWJsZXNMZW5ndGgoKSk7CisgICAgICAgIF9vLm5hdGl2ZUlubGluZSA9ICh0aGlzLm5hdGl2ZUlubGluZSgpICE9PSBudWxsID8gdGhpcy5uYXRpdmVJbmxpbmUoKS51bnBhY2soKSA6IG51bGwpOworICAgICAgICBfby5sb25nRW51bU5vbkVudW1EZWZhdWx0ID0gdGhpcy5sb25nRW51bU5vbkVudW1EZWZhdWx0KCk7CisgICAgICAgIF9vLmxvbmdFbnVtTm9ybWFsRGVmYXVsdCA9IHRoaXMubG9uZ0VudW1Ob3JtYWxEZWZhdWx0KCk7CisgICAgfQorfQorZXhwb3J0IGNsYXNzIE1vbnN0ZXJUIHsKKyAgICBjb25zdHJ1Y3Rvcihwb3MgPSBudWxsLCBtYW5hID0gMTUwLCBocCA9IDEwMCwgbmFtZSA9IG51bGwsIGludmVudG9yeSA9IFtdLCBjb2xvciA9IENvbG9yLkJsdWUsIHRlc3RUeXBlID0gQW55Lk5PTkUsIHRlc3QgPSBudWxsLCB0ZXN0NCA9IFtdLCB0ZXN0YXJyYXlvZnN0cmluZyA9IFtdLCB0ZXN0YXJyYXlvZnRhYmxlcyA9IFtdLCBlbmVteSA9IG51bGwsIHRlc3RuZXN0ZWRmbGF0YnVmZmVyID0gW10sIHRlc3RlbXB0eSA9IG51bGwsIHRlc3Rib29sID0gZmFsc2UsIHRlc3RoYXNoczMyRm52MSA9IDAsIHRlc3RoYXNodTMyRm52MSA9IDAsIHRlc3RoYXNoczY0Rm52MSA9IEJpZ0ludCgnMCcpLCB0ZXN0aGFzaHU2NEZudjEgPSBCaWdJbnQoJzAnKSwgdGVzdGhhc2hzMzJGbnYxYSA9IDAsIHRlc3RoYXNodTMyRm52MWEgPSAwLCB0ZXN0aGFzaHM2NEZudjFhID0gQmlnSW50KCcwJyksIHRlc3RoYXNodTY0Rm52MWEgPSBCaWdJbnQoJzAnKSwgdGVzdGFycmF5b2Zib29scyA9IFtdLCB0ZXN0ZiA9IDMuMTQxNTksIHRlc3RmMiA9IDMuMCwgdGVzdGYzID0gMC4wLCB0ZXN0YXJyYXlvZnN0cmluZzIgPSBbXSwgdGVzdGFycmF5b2Zzb3J0ZWRzdHJ1Y3QgPSBbXSwgZmxleCA9IFtdLCB0ZXN0NSA9IFtdLCB2ZWN0b3JPZkxvbmdzID0gW10sIHZlY3Rvck9mRG91YmxlcyA9IFtdLCBwYXJlbnROYW1lc3BhY2VUZXN0ID0gbnVsbCwgdmVjdG9yT2ZSZWZlcnJhYmxlcyA9IFtdLCBzaW5nbGVXZWFrUmVmZXJlbmNlID0gQmlnSW50KCcwJyksIHZlY3Rvck9mV2Vha1JlZmVyZW5jZXMgPSBbXSwgdmVjdG9yT2ZTdHJvbmdSZWZlcnJhYmxlcyA9IFtdLCBjb093bmluZ1JlZmVyZW5jZSA9IEJpZ0ludCgnMCcpLCB2ZWN0b3JPZkNvT3duaW5nUmVmZXJlbmNlcyA9IFtdLCBub25Pd25pbmdSZWZlcmVuY2UgPSBCaWdJbnQoJzAnKSwgdmVjdG9yT2ZOb25Pd25pbmdSZWZlcmVuY2VzID0gW10sIGFueVVuaXF1ZVR5cGUgPSBBbnlVbmlxdWVBbGlhc2VzLk5PTkUsIGFueVVuaXF1ZSA9IG51bGwsIGFueUFtYmlndW91c1R5cGUgPSBBbnlBbWJpZ3VvdXNBbGlhc2VzLk5PTkUsIGFueUFtYmlndW91cyA9IG51bGwsIHZlY3Rvck9mRW51bXMgPSBbXSwgc2lnbmVkRW51bSA9IFJhY2UuTm9uZSwgdGVzdHJlcXVpcmVkbmVzdGVkZmxhdGJ1ZmZlciA9IFtdLCBzY2FsYXJLZXlTb3J0ZWRUYWJsZXMgPSBbXSwgbmF0aXZlSW5saW5lID0gbnVsbCwgbG9uZ0VudW1Ob25FbnVtRGVmYXVsdCA9IEJpZ0ludCgnMCcpLCBsb25nRW51bU5vcm1hbERlZmF1bHQgPSBCaWdJbnQoJzInKSkgeworICAgICAgICB0aGlzLnBvcyA9IHBvczsKKyAgICAgICAgdGhpcy5tYW5hID0gbWFuYTsKKyAgICAgICAgdGhpcy5ocCA9IGhwOworICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOworICAgICAgICB0aGlzLmludmVudG9yeSA9IGludmVudG9yeTsKKyAgICAgICAgdGhpcy5jb2xvciA9IGNvbG9yOworICAgICAgICB0aGlzLnRlc3RUeXBlID0gdGVzdFR5cGU7CisgICAgICAgIHRoaXMudGVzdCA9IHRlc3Q7CisgICAgICAgIHRoaXMudGVzdDQgPSB0ZXN0NDsKKyAgICAgICAgdGhpcy50ZXN0YXJyYXlvZnN0cmluZyA9IHRlc3RhcnJheW9mc3RyaW5nOworICAgICAgICB0aGlzLnRlc3RhcnJheW9mdGFibGVzID0gdGVzdGFycmF5b2Z0YWJsZXM7CisgICAgICAgIHRoaXMuZW5lbXkgPSBlbmVteTsKKyAgICAgICAgdGhpcy50ZXN0bmVzdGVkZmxhdGJ1ZmZlciA9IHRlc3RuZXN0ZWRmbGF0YnVmZmVyOworICAgICAgICB0aGlzLnRlc3RlbXB0eSA9IHRlc3RlbXB0eTsKKyAgICAgICAgdGhpcy50ZXN0Ym9vbCA9IHRlc3Rib29sOworICAgICAgICB0aGlzLnRlc3RoYXNoczMyRm52MSA9IHRlc3RoYXNoczMyRm52MTsKKyAgICAgICAgdGhpcy50ZXN0aGFzaHUzMkZudjEgPSB0ZXN0aGFzaHUzMkZudjE7CisgICAgICAgIHRoaXMudGVzdGhhc2hzNjRGbnYxID0gdGVzdGhhc2hzNjRGbnYxOworICAgICAgICB0aGlzLnRlc3RoYXNodTY0Rm52MSA9IHRlc3RoYXNodTY0Rm52MTsKKyAgICAgICAgdGhpcy50ZXN0aGFzaHMzMkZudjFhID0gdGVzdGhhc2hzMzJGbnYxYTsKKyAgICAgICAgdGhpcy50ZXN0aGFzaHUzMkZudjFhID0gdGVzdGhhc2h1MzJGbnYxYTsKKyAgICAgICAgdGhpcy50ZXN0aGFzaHM2NEZudjFhID0gdGVzdGhhc2hzNjRGbnYxYTsKKyAgICAgICAgdGhpcy50ZXN0aGFzaHU2NEZudjFhID0gdGVzdGhhc2h1NjRGbnYxYTsKKyAgICAgICAgdGhpcy50ZXN0YXJyYXlvZmJvb2xzID0gdGVzdGFycmF5b2Zib29sczsKKyAgICAgICAgdGhpcy50ZXN0ZiA9IHRlc3RmOworICAgICAgICB0aGlzLnRlc3RmMiA9IHRlc3RmMjsKKyAgICAgICAgdGhpcy50ZXN0ZjMgPSB0ZXN0ZjM7CisgICAgICAgIHRoaXMudGVzdGFycmF5b2ZzdHJpbmcyID0gdGVzdGFycmF5b2ZzdHJpbmcyOworICAgICAgICB0aGlzLnRlc3RhcnJheW9mc29ydGVkc3RydWN0ID0gdGVzdGFycmF5b2Zzb3J0ZWRzdHJ1Y3Q7CisgICAgICAgIHRoaXMuZmxleCA9IGZsZXg7CisgICAgICAgIHRoaXMudGVzdDUgPSB0ZXN0NTsKKyAgICAgICAgdGhpcy52ZWN0b3JPZkxvbmdzID0gdmVjdG9yT2ZMb25nczsKKyAgICAgICAgdGhpcy52ZWN0b3JPZkRvdWJsZXMgPSB2ZWN0b3JPZkRvdWJsZXM7CisgICAgICAgIHRoaXMucGFyZW50TmFtZXNwYWNlVGVzdCA9IHBhcmVudE5hbWVzcGFjZVRlc3Q7CisgICAgICAgIHRoaXMudmVjdG9yT2ZSZWZlcnJhYmxlcyA9IHZlY3Rvck9mUmVmZXJyYWJsZXM7CisgICAgICAgIHRoaXMuc2luZ2xlV2Vha1JlZmVyZW5jZSA9IHNpbmdsZVdlYWtSZWZlcmVuY2U7CisgICAgICAgIHRoaXMudmVjdG9yT2ZXZWFrUmVmZXJlbmNlcyA9IHZlY3Rvck9mV2Vha1JlZmVyZW5jZXM7CisgICAgICAgIHRoaXMudmVjdG9yT2ZTdHJvbmdSZWZlcnJhYmxlcyA9IHZlY3Rvck9mU3Ryb25nUmVmZXJyYWJsZXM7CisgICAgICAgIHRoaXMuY29Pd25pbmdSZWZlcmVuY2UgPSBjb093bmluZ1JlZmVyZW5jZTsKKyAgICAgICAgdGhpcy52ZWN0b3JPZkNvT3duaW5nUmVmZXJlbmNlcyA9IHZlY3Rvck9mQ29Pd25pbmdSZWZlcmVuY2VzOworICAgICAgICB0aGlzLm5vbk93bmluZ1JlZmVyZW5jZSA9IG5vbk93bmluZ1JlZmVyZW5jZTsKKyAgICAgICAgdGhpcy52ZWN0b3JPZk5vbk93bmluZ1JlZmVyZW5jZXMgPSB2ZWN0b3JPZk5vbk93bmluZ1JlZmVyZW5jZXM7CisgICAgICAgIHRoaXMuYW55VW5pcXVlVHlwZSA9IGFueVVuaXF1ZVR5cGU7CisgICAgICAgIHRoaXMuYW55VW5pcXVlID0gYW55VW5pcXVlOworICAgICAgICB0aGlzLmFueUFtYmlndW91c1R5cGUgPSBhbnlBbWJpZ3VvdXNUeXBlOworICAgICAgICB0aGlzLmFueUFtYmlndW91cyA9IGFueUFtYmlndW91czsKKyAgICAgICAgdGhpcy52ZWN0b3JPZkVudW1zID0gdmVjdG9yT2ZFbnVtczsKKyAgICAgICAgdGhpcy5zaWduZWRFbnVtID0gc2lnbmVkRW51bTsKKyAgICAgICAgdGhpcy50ZXN0cmVxdWlyZWRuZXN0ZWRmbGF0YnVmZmVyID0gdGVzdHJlcXVpcmVkbmVzdGVkZmxhdGJ1ZmZlcjsKKyAgICAgICAgdGhpcy5zY2FsYXJLZXlTb3J0ZWRUYWJsZXMgPSBzY2FsYXJLZXlTb3J0ZWRUYWJsZXM7CisgICAgICAgIHRoaXMubmF0aXZlSW5saW5lID0gbmF0aXZlSW5saW5lOworICAgICAgICB0aGlzLmxvbmdFbnVtTm9uRW51bURlZmF1bHQgPSBsb25nRW51bU5vbkVudW1EZWZhdWx0OworICAgICAgICB0aGlzLmxvbmdFbnVtTm9ybWFsRGVmYXVsdCA9IGxvbmdFbnVtTm9ybWFsRGVmYXVsdDsKKyAgICB9CisgICAgcGFjayhidWlsZGVyKSB7CisgICAgICAgIGNvbnN0IG5hbWUgPSAodGhpcy5uYW1lICE9PSBudWxsID8gYnVpbGRlci5jcmVhdGVTdHJpbmcodGhpcy5uYW1lKSA6IDApOworICAgICAgICBjb25zdCBpbnZlbnRvcnkgPSBNb25zdGVyLmNyZWF0ZUludmVudG9yeVZlY3RvcihidWlsZGVyLCB0aGlzLmludmVudG9yeSk7CisgICAgICAgIGNvbnN0IHRlc3QgPSBidWlsZGVyLmNyZWF0ZU9iamVjdE9mZnNldCh0aGlzLnRlc3QpOworICAgICAgICBjb25zdCB0ZXN0NCA9IGJ1aWxkZXIuY3JlYXRlU3RydWN0T2Zmc2V0TGlzdCh0aGlzLnRlc3Q0LCBNb25zdGVyLnN0YXJ0VGVzdDRWZWN0b3IpOworICAgICAgICBjb25zdCB0ZXN0YXJyYXlvZnN0cmluZyA9IE1vbnN0ZXIuY3JlYXRlVGVzdGFycmF5b2ZzdHJpbmdWZWN0b3IoYnVpbGRlciwgYnVpbGRlci5jcmVhdGVPYmplY3RPZmZzZXRMaXN0KHRoaXMudGVzdGFycmF5b2ZzdHJpbmcpKTsKKyAgICAgICAgY29uc3QgdGVzdGFycmF5b2Z0YWJsZXMgPSBNb25zdGVyLmNyZWF0ZVRlc3RhcnJheW9mdGFibGVzVmVjdG9yKGJ1aWxkZXIsIGJ1aWxkZXIuY3JlYXRlT2JqZWN0T2Zmc2V0TGlzdCh0aGlzLnRlc3RhcnJheW9mdGFibGVzKSk7CisgICAgICAgIGNvbnN0IGVuZW15ID0gKHRoaXMuZW5lbXkgIT09IG51bGwgPyB0aGlzLmVuZW15LnBhY2soYnVpbGRlcikgOiAwKTsKKyAgICAgICAgY29uc3QgdGVzdG5lc3RlZGZsYXRidWZmZXIgPSBNb25zdGVyLmNyZWF0ZVRlc3RuZXN0ZWRmbGF0YnVmZmVyVmVjdG9yKGJ1aWxkZXIsIHRoaXMudGVzdG5lc3RlZGZsYXRidWZmZXIpOworICAgICAgICBjb25zdCB0ZXN0ZW1wdHkgPSAodGhpcy50ZXN0ZW1wdHkgIT09IG51bGwgPyB0aGlzLnRlc3RlbXB0eS5wYWNrKGJ1aWxkZXIpIDogMCk7CisgICAgICAgIGNvbnN0IHRlc3RhcnJheW9mYm9vbHMgPSBNb25zdGVyLmNyZWF0ZVRlc3RhcnJheW9mYm9vbHNWZWN0b3IoYnVpbGRlciwgdGhpcy50ZXN0YXJyYXlvZmJvb2xzKTsKKyAgICAgICAgY29uc3QgdGVzdGFycmF5b2ZzdHJpbmcyID0gTW9uc3Rlci5jcmVhdGVUZXN0YXJyYXlvZnN0cmluZzJWZWN0b3IoYnVpbGRlciwgYnVpbGRlci5jcmVhdGVPYmplY3RPZmZzZXRMaXN0KHRoaXMudGVzdGFycmF5b2ZzdHJpbmcyKSk7CisgICAgICAgIGNvbnN0IHRlc3RhcnJheW9mc29ydGVkc3RydWN0ID0gYnVpbGRlci5jcmVhdGVTdHJ1Y3RPZmZzZXRMaXN0KHRoaXMudGVzdGFycmF5b2Zzb3J0ZWRzdHJ1Y3QsIE1vbnN0ZXIuc3RhcnRUZXN0YXJyYXlvZnNvcnRlZHN0cnVjdFZlY3Rvcik7CisgICAgICAgIGNvbnN0IGZsZXggPSBNb25zdGVyLmNyZWF0ZUZsZXhWZWN0b3IoYnVpbGRlciwgdGhpcy5mbGV4KTsKKyAgICAgICAgY29uc3QgdGVzdDUgPSBidWlsZGVyLmNyZWF0ZVN0cnVjdE9mZnNldExpc3QodGhpcy50ZXN0NSwgTW9uc3Rlci5zdGFydFRlc3Q1VmVjdG9yKTsKKyAgICAgICAgY29uc3QgdmVjdG9yT2ZMb25ncyA9IE1vbnN0ZXIuY3JlYXRlVmVjdG9yT2ZMb25nc1ZlY3RvcihidWlsZGVyLCB0aGlzLnZlY3Rvck9mTG9uZ3MpOworICAgICAgICBjb25zdCB2ZWN0b3JPZkRvdWJsZXMgPSBNb25zdGVyLmNyZWF0ZVZlY3Rvck9mRG91Ymxlc1ZlY3RvcihidWlsZGVyLCB0aGlzLnZlY3Rvck9mRG91Ymxlcyk7CisgICAgICAgIGNvbnN0IHBhcmVudE5hbWVzcGFjZVRlc3QgPSAodGhpcy5wYXJlbnROYW1lc3BhY2VUZXN0ICE9PSBudWxsID8gdGhpcy5wYXJlbnROYW1lc3BhY2VUZXN0LnBhY2soYnVpbGRlcikgOiAwKTsKKyAgICAgICAgY29uc3QgdmVjdG9yT2ZSZWZlcnJhYmxlcyA9IE1vbnN0ZXIuY3JlYXRlVmVjdG9yT2ZSZWZlcnJhYmxlc1ZlY3RvcihidWlsZGVyLCBidWlsZGVyLmNyZWF0ZU9iamVjdE9mZnNldExpc3QodGhpcy52ZWN0b3JPZlJlZmVycmFibGVzKSk7CisgICAgICAgIGNvbnN0IHZlY3Rvck9mV2Vha1JlZmVyZW5jZXMgPSBNb25zdGVyLmNyZWF0ZVZlY3Rvck9mV2Vha1JlZmVyZW5jZXNWZWN0b3IoYnVpbGRlciwgdGhpcy52ZWN0b3JPZldlYWtSZWZlcmVuY2VzKTsKKyAgICAgICAgY29uc3QgdmVjdG9yT2ZTdHJvbmdSZWZlcnJhYmxlcyA9IE1vbnN0ZXIuY3JlYXRlVmVjdG9yT2ZTdHJvbmdSZWZlcnJhYmxlc1ZlY3RvcihidWlsZGVyLCBidWlsZGVyLmNyZWF0ZU9iamVjdE9mZnNldExpc3QodGhpcy52ZWN0b3JPZlN0cm9uZ1JlZmVycmFibGVzKSk7CisgICAgICAgIGNvbnN0IHZlY3Rvck9mQ29Pd25pbmdSZWZlcmVuY2VzID0gTW9uc3Rlci5jcmVhdGVWZWN0b3JPZkNvT3duaW5nUmVmZXJlbmNlc1ZlY3RvcihidWlsZGVyLCB0aGlzLnZlY3Rvck9mQ29Pd25pbmdSZWZlcmVuY2VzKTsKKyAgICAgICAgY29uc3QgdmVjdG9yT2ZOb25Pd25pbmdSZWZlcmVuY2VzID0gTW9uc3Rlci5jcmVhdGVWZWN0b3JPZk5vbk93bmluZ1JlZmVyZW5jZXNWZWN0b3IoYnVpbGRlciwgdGhpcy52ZWN0b3JPZk5vbk93bmluZ1JlZmVyZW5jZXMpOworICAgICAgICBjb25zdCBhbnlVbmlxdWUgPSBidWlsZGVyLmNyZWF0ZU9iamVjdE9mZnNldCh0aGlzLmFueVVuaXF1ZSk7CisgICAgICAgIGNvbnN0IGFueUFtYmlndW91cyA9IGJ1aWxkZXIuY3JlYXRlT2JqZWN0T2Zmc2V0KHRoaXMuYW55QW1iaWd1b3VzKTsKKyAgICAgICAgY29uc3QgdmVjdG9yT2ZFbnVtcyA9IE1vbnN0ZXIuY3JlYXRlVmVjdG9yT2ZFbnVtc1ZlY3RvcihidWlsZGVyLCB0aGlzLnZlY3Rvck9mRW51bXMpOworICAgICAgICBjb25zdCB0ZXN0cmVxdWlyZWRuZXN0ZWRmbGF0YnVmZmVyID0gTW9uc3Rlci5jcmVhdGVUZXN0cmVxdWlyZWRuZXN0ZWRmbGF0YnVmZmVyVmVjdG9yKGJ1aWxkZXIsIHRoaXMudGVzdHJlcXVpcmVkbmVzdGVkZmxhdGJ1ZmZlcik7CisgICAgICAgIGNvbnN0IHNjYWxhcktleVNvcnRlZFRhYmxlcyA9IE1vbnN0ZXIuY3JlYXRlU2NhbGFyS2V5U29ydGVkVGFibGVzVmVjdG9yKGJ1aWxkZXIsIGJ1aWxkZXIuY3JlYXRlT2JqZWN0T2Zmc2V0TGlzdCh0aGlzLnNjYWxhcktleVNvcnRlZFRhYmxlcykpOworICAgICAgICBNb25zdGVyLnN0YXJ0TW9uc3RlcihidWlsZGVyKTsKKyAgICAgICAgTW9uc3Rlci5hZGRQb3MoYnVpbGRlciwgKHRoaXMucG9zICE9PSBudWxsID8gdGhpcy5wb3MucGFjayhidWlsZGVyKSA6IDApKTsKKyAgICAgICAgTW9uc3Rlci5hZGRNYW5hKGJ1aWxkZXIsIHRoaXMubWFuYSk7CisgICAgICAgIE1vbnN0ZXIuYWRkSHAoYnVpbGRlciwgdGhpcy5ocCk7CisgICAgICAgIE1vbnN0ZXIuYWRkTmFtZShidWlsZGVyLCBuYW1lKTsKKyAgICAgICAgTW9uc3Rlci5hZGRJbnZlbnRvcnkoYnVpbGRlciwgaW52ZW50b3J5KTsKKyAgICAgICAgTW9uc3Rlci5hZGRDb2xvcihidWlsZGVyLCB0aGlzLmNvbG9yKTsKKyAgICAgICAgTW9uc3Rlci5hZGRUZXN0VHlwZShidWlsZGVyLCB0aGlzLnRlc3RUeXBlKTsKKyAgICAgICAgTW9uc3Rlci5hZGRUZXN0KGJ1aWxkZXIsIHRlc3QpOworICAgICAgICBNb25zdGVyLmFkZFRlc3Q0KGJ1aWxkZXIsIHRlc3Q0KTsKKyAgICAgICAgTW9uc3Rlci5hZGRUZXN0YXJyYXlvZnN0cmluZyhidWlsZGVyLCB0ZXN0YXJyYXlvZnN0cmluZyk7CisgICAgICAgIE1vbnN0ZXIuYWRkVGVzdGFycmF5b2Z0YWJsZXMoYnVpbGRlciwgdGVzdGFycmF5b2Z0YWJsZXMpOworICAgICAgICBNb25zdGVyLmFkZEVuZW15KGJ1aWxkZXIsIGVuZW15KTsKKyAgICAgICAgTW9uc3Rlci5hZGRUZXN0bmVzdGVkZmxhdGJ1ZmZlcihidWlsZGVyLCB0ZXN0bmVzdGVkZmxhdGJ1ZmZlcik7CisgICAgICAgIE1vbnN0ZXIuYWRkVGVzdGVtcHR5KGJ1aWxkZXIsIHRlc3RlbXB0eSk7CisgICAgICAgIE1vbnN0ZXIuYWRkVGVzdGJvb2woYnVpbGRlciwgdGhpcy50ZXN0Ym9vbCk7CisgICAgICAgIE1vbnN0ZXIuYWRkVGVzdGhhc2hzMzJGbnYxKGJ1aWxkZXIsIHRoaXMudGVzdGhhc2hzMzJGbnYxKTsKKyAgICAgICAgTW9uc3Rlci5hZGRUZXN0aGFzaHUzMkZudjEoYnVpbGRlciwgdGhpcy50ZXN0aGFzaHUzMkZudjEpOworICAgICAgICBNb25zdGVyLmFkZFRlc3RoYXNoczY0Rm52MShidWlsZGVyLCB0aGlzLnRlc3RoYXNoczY0Rm52MSk7CisgICAgICAgIE1vbnN0ZXIuYWRkVGVzdGhhc2h1NjRGbnYxKGJ1aWxkZXIsIHRoaXMudGVzdGhhc2h1NjRGbnYxKTsKKyAgICAgICAgTW9uc3Rlci5hZGRUZXN0aGFzaHMzMkZudjFhKGJ1aWxkZXIsIHRoaXMudGVzdGhhc2hzMzJGbnYxYSk7CisgICAgICAgIE1vbnN0ZXIuYWRkVGVzdGhhc2h1MzJGbnYxYShidWlsZGVyLCB0aGlzLnRlc3RoYXNodTMyRm52MWEpOworICAgICAgICBNb25zdGVyLmFkZFRlc3RoYXNoczY0Rm52MWEoYnVpbGRlciwgdGhpcy50ZXN0aGFzaHM2NEZudjFhKTsKKyAgICAgICAgTW9uc3Rlci5hZGRUZXN0aGFzaHU2NEZudjFhKGJ1aWxkZXIsIHRoaXMudGVzdGhhc2h1NjRGbnYxYSk7CisgICAgICAgIE1vbnN0ZXIuYWRkVGVzdGFycmF5b2Zib29scyhidWlsZGVyLCB0ZXN0YXJyYXlvZmJvb2xzKTsKKyAgICAgICAgTW9uc3Rlci5hZGRUZXN0ZihidWlsZGVyLCB0aGlzLnRlc3RmKTsKKyAgICAgICAgTW9uc3Rlci5hZGRUZXN0ZjIoYnVpbGRlciwgdGhpcy50ZXN0ZjIpOworICAgICAgICBNb25zdGVyLmFkZFRlc3RmMyhidWlsZGVyLCB0aGlzLnRlc3RmMyk7CisgICAgICAgIE1vbnN0ZXIuYWRkVGVzdGFycmF5b2ZzdHJpbmcyKGJ1aWxkZXIsIHRlc3RhcnJheW9mc3RyaW5nMik7CisgICAgICAgIE1vbnN0ZXIuYWRkVGVzdGFycmF5b2Zzb3J0ZWRzdHJ1Y3QoYnVpbGRlciwgdGVzdGFycmF5b2Zzb3J0ZWRzdHJ1Y3QpOworICAgICAgICBNb25zdGVyLmFkZEZsZXgoYnVpbGRlciwgZmxleCk7CisgICAgICAgIE1vbnN0ZXIuYWRkVGVzdDUoYnVpbGRlciwgdGVzdDUpOworICAgICAgICBNb25zdGVyLmFkZFZlY3Rvck9mTG9uZ3MoYnVpbGRlciwgdmVjdG9yT2ZMb25ncyk7CisgICAgICAgIE1vbnN0ZXIuYWRkVmVjdG9yT2ZEb3VibGVzKGJ1aWxkZXIsIHZlY3Rvck9mRG91Ymxlcyk7CisgICAgICAgIE1vbnN0ZXIuYWRkUGFyZW50TmFtZXNwYWNlVGVzdChidWlsZGVyLCBwYXJlbnROYW1lc3BhY2VUZXN0KTsKKyAgICAgICAgTW9uc3Rlci5hZGRWZWN0b3JPZlJlZmVycmFibGVzKGJ1aWxkZXIsIHZlY3Rvck9mUmVmZXJyYWJsZXMpOworICAgICAgICBNb25zdGVyLmFkZFNpbmdsZVdlYWtSZWZlcmVuY2UoYnVpbGRlciwgdGhpcy5zaW5nbGVXZWFrUmVmZXJlbmNlKTsKKyAgICAgICAgTW9uc3Rlci5hZGRWZWN0b3JPZldlYWtSZWZlcmVuY2VzKGJ1aWxkZXIsIHZlY3Rvck9mV2Vha1JlZmVyZW5jZXMpOworICAgICAgICBNb25zdGVyLmFkZFZlY3Rvck9mU3Ryb25nUmVmZXJyYWJsZXMoYnVpbGRlciwgdmVjdG9yT2ZTdHJvbmdSZWZlcnJhYmxlcyk7CisgICAgICAgIE1vbnN0ZXIuYWRkQ29Pd25pbmdSZWZlcmVuY2UoYnVpbGRlciwgdGhpcy5jb093bmluZ1JlZmVyZW5jZSk7CisgICAgICAgIE1vbnN0ZXIuYWRkVmVjdG9yT2ZDb093bmluZ1JlZmVyZW5jZXMoYnVpbGRlciwgdmVjdG9yT2ZDb093bmluZ1JlZmVyZW5jZXMpOworICAgICAgICBNb25zdGVyLmFkZE5vbk93bmluZ1JlZmVyZW5jZShidWlsZGVyLCB0aGlzLm5vbk93bmluZ1JlZmVyZW5jZSk7CisgICAgICAgIE1vbnN0ZXIuYWRkVmVjdG9yT2ZOb25Pd25pbmdSZWZlcmVuY2VzKGJ1aWxkZXIsIHZlY3Rvck9mTm9uT3duaW5nUmVmZXJlbmNlcyk7CisgICAgICAgIE1vbnN0ZXIuYWRkQW55VW5pcXVlVHlwZShidWlsZGVyLCB0aGlzLmFueVVuaXF1ZVR5cGUpOworICAgICAgICBNb25zdGVyLmFkZEFueVVuaXF1ZShidWlsZGVyLCBhbnlVbmlxdWUpOworICAgICAgICBNb25zdGVyLmFkZEFueUFtYmlndW91c1R5cGUoYnVpbGRlciwgdGhpcy5hbnlBbWJpZ3VvdXNUeXBlKTsKKyAgICAgICAgTW9uc3Rlci5hZGRBbnlBbWJpZ3VvdXMoYnVpbGRlciwgYW55QW1iaWd1b3VzKTsKKyAgICAgICAgTW9uc3Rlci5hZGRWZWN0b3JPZkVudW1zKGJ1aWxkZXIsIHZlY3Rvck9mRW51bXMpOworICAgICAgICBNb25zdGVyLmFkZFNpZ25lZEVudW0oYnVpbGRlciwgdGhpcy5zaWduZWRFbnVtKTsKKyAgICAgICAgTW9uc3Rlci5hZGRUZXN0cmVxdWlyZWRuZXN0ZWRmbGF0YnVmZmVyKGJ1aWxkZXIsIHRlc3RyZXF1aXJlZG5lc3RlZGZsYXRidWZmZXIpOworICAgICAgICBNb25zdGVyLmFkZFNjYWxhcktleVNvcnRlZFRhYmxlcyhidWlsZGVyLCBzY2FsYXJLZXlTb3J0ZWRUYWJsZXMpOworICAgICAgICBNb25zdGVyLmFkZE5hdGl2ZUlubGluZShidWlsZGVyLCAodGhpcy5uYXRpdmVJbmxpbmUgIT09IG51bGwgPyB0aGlzLm5hdGl2ZUlubGluZS5wYWNrKGJ1aWxkZXIpIDogMCkpOworICAgICAgICBNb25zdGVyLmFkZExvbmdFbnVtTm9uRW51bURlZmF1bHQoYnVpbGRlciwgdGhpcy5sb25nRW51bU5vbkVudW1EZWZhdWx0KTsKKyAgICAgICAgTW9uc3Rlci5hZGRMb25nRW51bU5vcm1hbERlZmF1bHQoYnVpbGRlciwgdGhpcy5sb25nRW51bU5vcm1hbERlZmF1bHQpOworICAgICAgICByZXR1cm4gTW9uc3Rlci5lbmRNb25zdGVyKGJ1aWxkZXIpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL3RzL215LWdhbWUvZXhhbXBsZS9tb25zdGVyLnRzIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvdHMvbXktZ2FtZS9leGFtcGxlL21vbnN0ZXIudHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjNlNTc2OAotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL3RzL215LWdhbWUvZXhhbXBsZS9tb25zdGVyLnRzCkBAIC0wLDAgKzEsMTQzNCBAQAorLy8gYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgYnkgdGhlIEZsYXRCdWZmZXJzIGNvbXBpbGVyLCBkbyBub3QgbW9kaWZ5CisKK2ltcG9ydCAqIGFzIGZsYXRidWZmZXJzIGZyb20gJ2ZsYXRidWZmZXJzJzsKKworaW1wb3J0IHsgTW9uc3RlciBhcyBNeUdhbWVfRXhhbXBsZTJfTW9uc3RlciwgTW9uc3RlclQgYXMgTXlHYW1lX0V4YW1wbGUyX01vbnN0ZXJUIH0gZnJvbSAnLi4vLi4vbXktZ2FtZS9leGFtcGxlMi9tb25zdGVyLmpzJzsKK2ltcG9ydCB7IEFiaWxpdHksIEFiaWxpdHlUIH0gZnJvbSAnLi4vLi4vbXktZ2FtZS9leGFtcGxlL2FiaWxpdHkuanMnOworaW1wb3J0IHsgQW55LCB1bmlvblRvQW55LCB1bmlvbkxpc3RUb0FueSB9IGZyb20gJy4uLy4uL215LWdhbWUvZXhhbXBsZS9hbnkuanMnOworaW1wb3J0IHsgQW55QW1iaWd1b3VzQWxpYXNlcywgdW5pb25Ub0FueUFtYmlndW91c0FsaWFzZXMsIHVuaW9uTGlzdFRvQW55QW1iaWd1b3VzQWxpYXNlcyB9IGZyb20gJy4uLy4uL215LWdhbWUvZXhhbXBsZS9hbnktYW1iaWd1b3VzLWFsaWFzZXMuanMnOworaW1wb3J0IHsgQW55VW5pcXVlQWxpYXNlcywgdW5pb25Ub0FueVVuaXF1ZUFsaWFzZXMsIHVuaW9uTGlzdFRvQW55VW5pcXVlQWxpYXNlcyB9IGZyb20gJy4uLy4uL215LWdhbWUvZXhhbXBsZS9hbnktdW5pcXVlLWFsaWFzZXMuanMnOworaW1wb3J0IHsgQ29sb3IgfSBmcm9tICcuLi8uLi9teS1nYW1lL2V4YW1wbGUvY29sb3IuanMnOworaW1wb3J0IHsgUmFjZSB9IGZyb20gJy4uLy4uL215LWdhbWUvZXhhbXBsZS9yYWNlLmpzJzsKK2ltcG9ydCB7IFJlZmVycmFibGUsIFJlZmVycmFibGVUIH0gZnJvbSAnLi4vLi4vbXktZ2FtZS9leGFtcGxlL3JlZmVycmFibGUuanMnOworaW1wb3J0IHsgU3RhdCwgU3RhdFQgfSBmcm9tICcuLi8uLi9teS1nYW1lL2V4YW1wbGUvc3RhdC5qcyc7CitpbXBvcnQgeyBUZXN0LCBUZXN0VCB9IGZyb20gJy4uLy4uL215LWdhbWUvZXhhbXBsZS90ZXN0LmpzJzsKK2ltcG9ydCB7IFRlc3RTaW1wbGVUYWJsZVdpdGhFbnVtLCBUZXN0U2ltcGxlVGFibGVXaXRoRW51bVQgfSBmcm9tICcuLi8uLi9teS1nYW1lL2V4YW1wbGUvdGVzdC1zaW1wbGUtdGFibGUtd2l0aC1lbnVtLmpzJzsKK2ltcG9ydCB7IFZlYzMsIFZlYzNUIH0gZnJvbSAnLi4vLi4vbXktZ2FtZS9leGFtcGxlL3ZlYzMuanMnOworaW1wb3J0IHsgSW5QYXJlbnROYW1lc3BhY2UsIEluUGFyZW50TmFtZXNwYWNlVCB9IGZyb20gJy4uLy4uL215LWdhbWUvaW4tcGFyZW50LW5hbWVzcGFjZS5qcyc7CisKKworLyoqCisgKiBhbiBleGFtcGxlIGRvY3VtZW50YXRpb24gY29tbWVudDogIm1vbnN0ZXIgb2JqZWN0IgorICovCitleHBvcnQgY2xhc3MgTW9uc3RlciB7CisgIGJiOiBmbGF0YnVmZmVycy5CeXRlQnVmZmVyfG51bGwgPSBudWxsOworICBiYl9wb3MgPSAwOworICBfX2luaXQoaTpudW1iZXIsIGJiOmZsYXRidWZmZXJzLkJ5dGVCdWZmZXIpOk1vbnN0ZXIgeworICB0aGlzLmJiX3BvcyA9IGk7CisgIHRoaXMuYmIgPSBiYjsKKyAgcmV0dXJuIHRoaXM7Cit9CisKK3N0YXRpYyBnZXRSb290QXNNb25zdGVyKGJiOmZsYXRidWZmZXJzLkJ5dGVCdWZmZXIsIG9iaj86TW9uc3Rlcik6TW9uc3RlciB7CisgIHJldHVybiAob2JqIHx8IG5ldyBNb25zdGVyKCkpLl9faW5pdChiYi5yZWFkSW50MzIoYmIucG9zaXRpb24oKSkgKyBiYi5wb3NpdGlvbigpLCBiYik7Cit9CisKK3N0YXRpYyBnZXRTaXplUHJlZml4ZWRSb290QXNNb25zdGVyKGJiOmZsYXRidWZmZXJzLkJ5dGVCdWZmZXIsIG9iaj86TW9uc3Rlcik6TW9uc3RlciB7CisgIGJiLnNldFBvc2l0aW9uKGJiLnBvc2l0aW9uKCkgKyBmbGF0YnVmZmVycy5TSVpFX1BSRUZJWF9MRU5HVEgpOworICByZXR1cm4gKG9iaiB8fCBuZXcgTW9uc3RlcigpKS5fX2luaXQoYmIucmVhZEludDMyKGJiLnBvc2l0aW9uKCkpICsgYmIucG9zaXRpb24oKSwgYmIpOworfQorCitzdGF0aWMgYnVmZmVySGFzSWRlbnRpZmllcihiYjpmbGF0YnVmZmVycy5CeXRlQnVmZmVyKTpib29sZWFuIHsKKyAgcmV0dXJuIGJiLl9faGFzX2lkZW50aWZpZXIoJ01PTlMnKTsKK30KKworcG9zKG9iaj86VmVjMyk6VmVjM3xudWxsIHsKKyAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYiEuX19vZmZzZXQodGhpcy5iYl9wb3MsIDQpOworICByZXR1cm4gb2Zmc2V0ID8gKG9iaiB8fCBuZXcgVmVjMygpKS5fX2luaXQodGhpcy5iYl9wb3MgKyBvZmZzZXQsIHRoaXMuYmIhKSA6IG51bGw7Cit9CisKK21hbmEoKTpudW1iZXIgeworICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiIS5fX29mZnNldCh0aGlzLmJiX3BvcywgNik7CisgIHJldHVybiBvZmZzZXQgPyB0aGlzLmJiIS5yZWFkSW50MTYodGhpcy5iYl9wb3MgKyBvZmZzZXQpIDogMTUwOworfQorCittdXRhdGVfbWFuYSh2YWx1ZTpudW1iZXIpOmJvb2xlYW4geworICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiIS5fX29mZnNldCh0aGlzLmJiX3BvcywgNik7CisKKyAgaWYgKG9mZnNldCA9PT0gMCkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHRoaXMuYmIhLndyaXRlSW50MTYodGhpcy5iYl9wb3MgKyBvZmZzZXQsIHZhbHVlKTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK2hwKCk6bnVtYmVyIHsKKyAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYiEuX19vZmZzZXQodGhpcy5iYl9wb3MsIDgpOworICByZXR1cm4gb2Zmc2V0ID8gdGhpcy5iYiEucmVhZEludDE2KHRoaXMuYmJfcG9zICsgb2Zmc2V0KSA6IDEwMDsKK30KKworbXV0YXRlX2hwKHZhbHVlOm51bWJlcik6Ym9vbGVhbiB7CisgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIhLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCA4KTsKKworICBpZiAob2Zmc2V0ID09PSAwKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgdGhpcy5iYiEud3JpdGVJbnQxNih0aGlzLmJiX3BvcyArIG9mZnNldCwgdmFsdWUpOworICByZXR1cm4gdHJ1ZTsKK30KKworbmFtZSgpOnN0cmluZ3xudWxsCituYW1lKG9wdGlvbmFsRW5jb2Rpbmc6ZmxhdGJ1ZmZlcnMuRW5jb2RpbmcpOnN0cmluZ3xVaW50OEFycmF5fG51bGwKK25hbWUob3B0aW9uYWxFbmNvZGluZz86YW55KTpzdHJpbmd8VWludDhBcnJheXxudWxsIHsKKyAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYiEuX19vZmZzZXQodGhpcy5iYl9wb3MsIDEwKTsKKyAgcmV0dXJuIG9mZnNldCA/IHRoaXMuYmIhLl9fc3RyaW5nKHRoaXMuYmJfcG9zICsgb2Zmc2V0LCBvcHRpb25hbEVuY29kaW5nKSA6IG51bGw7Cit9CisKK2ludmVudG9yeShpbmRleDogbnVtYmVyKTpudW1iZXJ8bnVsbCB7CisgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIhLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCAxNCk7CisgIHJldHVybiBvZmZzZXQgPyB0aGlzLmJiIS5yZWFkVWludDgodGhpcy5iYiEuX192ZWN0b3IodGhpcy5iYl9wb3MgKyBvZmZzZXQpICsgaW5kZXgpIDogMDsKK30KKworaW52ZW50b3J5TGVuZ3RoKCk6bnVtYmVyIHsKKyAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYiEuX19vZmZzZXQodGhpcy5iYl9wb3MsIDE0KTsKKyAgcmV0dXJuIG9mZnNldCA/IHRoaXMuYmIhLl9fdmVjdG9yX2xlbih0aGlzLmJiX3BvcyArIG9mZnNldCkgOiAwOworfQorCitpbnZlbnRvcnlBcnJheSgpOlVpbnQ4QXJyYXl8bnVsbCB7CisgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIhLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCAxNCk7CisgIHJldHVybiBvZmZzZXQgPyBuZXcgVWludDhBcnJheSh0aGlzLmJiIS5ieXRlcygpLmJ1ZmZlciwgdGhpcy5iYiEuYnl0ZXMoKS5ieXRlT2Zmc2V0ICsgdGhpcy5iYiEuX192ZWN0b3IodGhpcy5iYl9wb3MgKyBvZmZzZXQpLCB0aGlzLmJiIS5fX3ZlY3Rvcl9sZW4odGhpcy5iYl9wb3MgKyBvZmZzZXQpKSA6IG51bGw7Cit9CisKK2NvbG9yKCk6Q29sb3IgeworICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiIS5fX29mZnNldCh0aGlzLmJiX3BvcywgMTYpOworICByZXR1cm4gb2Zmc2V0ID8gdGhpcy5iYiEucmVhZFVpbnQ4KHRoaXMuYmJfcG9zICsgb2Zmc2V0KSA6IENvbG9yLkJsdWU7Cit9CisKK211dGF0ZV9jb2xvcih2YWx1ZTpDb2xvcik6Ym9vbGVhbiB7CisgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIhLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCAxNik7CisKKyAgaWYgKG9mZnNldCA9PT0gMCkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHRoaXMuYmIhLndyaXRlVWludDgodGhpcy5iYl9wb3MgKyBvZmZzZXQsIHZhbHVlKTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK3Rlc3RUeXBlKCk6QW55IHsKKyAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYiEuX19vZmZzZXQodGhpcy5iYl9wb3MsIDE4KTsKKyAgcmV0dXJuIG9mZnNldCA/IHRoaXMuYmIhLnJlYWRVaW50OCh0aGlzLmJiX3BvcyArIG9mZnNldCkgOiBBbnkuTk9ORTsKK30KKwordGVzdDxUIGV4dGVuZHMgZmxhdGJ1ZmZlcnMuVGFibGU+KG9iajphbnkpOmFueXxudWxsIHsKKyAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYiEuX19vZmZzZXQodGhpcy5iYl9wb3MsIDIwKTsKKyAgcmV0dXJuIG9mZnNldCA/IHRoaXMuYmIhLl9fdW5pb24ob2JqLCB0aGlzLmJiX3BvcyArIG9mZnNldCkgOiBudWxsOworfQorCit0ZXN0NChpbmRleDogbnVtYmVyLCBvYmo/OlRlc3QpOlRlc3R8bnVsbCB7CisgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIhLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCAyMik7CisgIHJldHVybiBvZmZzZXQgPyAob2JqIHx8IG5ldyBUZXN0KCkpLl9faW5pdCh0aGlzLmJiIS5fX3ZlY3Rvcih0aGlzLmJiX3BvcyArIG9mZnNldCkgKyBpbmRleCAqIDQsIHRoaXMuYmIhKSA6IG51bGw7Cit9CisKK3Rlc3Q0TGVuZ3RoKCk6bnVtYmVyIHsKKyAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYiEuX19vZmZzZXQodGhpcy5iYl9wb3MsIDIyKTsKKyAgcmV0dXJuIG9mZnNldCA/IHRoaXMuYmIhLl9fdmVjdG9yX2xlbih0aGlzLmJiX3BvcyArIG9mZnNldCkgOiAwOworfQorCit0ZXN0YXJyYXlvZnN0cmluZyhpbmRleDogbnVtYmVyKTpzdHJpbmcKK3Rlc3RhcnJheW9mc3RyaW5nKGluZGV4OiBudW1iZXIsb3B0aW9uYWxFbmNvZGluZzpmbGF0YnVmZmVycy5FbmNvZGluZyk6c3RyaW5nfFVpbnQ4QXJyYXkKK3Rlc3RhcnJheW9mc3RyaW5nKGluZGV4OiBudW1iZXIsb3B0aW9uYWxFbmNvZGluZz86YW55KTpzdHJpbmd8VWludDhBcnJheXxudWxsIHsKKyAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYiEuX19vZmZzZXQodGhpcy5iYl9wb3MsIDI0KTsKKyAgcmV0dXJuIG9mZnNldCA/IHRoaXMuYmIhLl9fc3RyaW5nKHRoaXMuYmIhLl9fdmVjdG9yKHRoaXMuYmJfcG9zICsgb2Zmc2V0KSArIGluZGV4ICogNCwgb3B0aW9uYWxFbmNvZGluZykgOiBudWxsOworfQorCit0ZXN0YXJyYXlvZnN0cmluZ0xlbmd0aCgpOm51bWJlciB7CisgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIhLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCAyNCk7CisgIHJldHVybiBvZmZzZXQgPyB0aGlzLmJiIS5fX3ZlY3Rvcl9sZW4odGhpcy5iYl9wb3MgKyBvZmZzZXQpIDogMDsKK30KKworLyoqCisgKiBhbiBleGFtcGxlIGRvY3VtZW50YXRpb24gY29tbWVudDogdGhpcyB3aWxsIGVuZCB1cCBpbiB0aGUgZ2VuZXJhdGVkIGNvZGUKKyAqIG11bHRpbGluZSB0b28KKyAqLwordGVzdGFycmF5b2Z0YWJsZXMoaW5kZXg6IG51bWJlciwgb2JqPzpNb25zdGVyKTpNb25zdGVyfG51bGwgeworICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiIS5fX29mZnNldCh0aGlzLmJiX3BvcywgMjYpOworICByZXR1cm4gb2Zmc2V0ID8gKG9iaiB8fCBuZXcgTW9uc3RlcigpKS5fX2luaXQodGhpcy5iYiEuX19pbmRpcmVjdCh0aGlzLmJiIS5fX3ZlY3Rvcih0aGlzLmJiX3BvcyArIG9mZnNldCkgKyBpbmRleCAqIDQpLCB0aGlzLmJiISkgOiBudWxsOworfQorCit0ZXN0YXJyYXlvZnRhYmxlc0xlbmd0aCgpOm51bWJlciB7CisgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIhLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCAyNik7CisgIHJldHVybiBvZmZzZXQgPyB0aGlzLmJiIS5fX3ZlY3Rvcl9sZW4odGhpcy5iYl9wb3MgKyBvZmZzZXQpIDogMDsKK30KKworZW5lbXkob2JqPzpNb25zdGVyKTpNb25zdGVyfG51bGwgeworICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiIS5fX29mZnNldCh0aGlzLmJiX3BvcywgMjgpOworICByZXR1cm4gb2Zmc2V0ID8gKG9iaiB8fCBuZXcgTW9uc3RlcigpKS5fX2luaXQodGhpcy5iYiEuX19pbmRpcmVjdCh0aGlzLmJiX3BvcyArIG9mZnNldCksIHRoaXMuYmIhKSA6IG51bGw7Cit9CisKK3Rlc3RuZXN0ZWRmbGF0YnVmZmVyKGluZGV4OiBudW1iZXIpOm51bWJlcnxudWxsIHsKKyAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYiEuX19vZmZzZXQodGhpcy5iYl9wb3MsIDMwKTsKKyAgcmV0dXJuIG9mZnNldCA/IHRoaXMuYmIhLnJlYWRVaW50OCh0aGlzLmJiIS5fX3ZlY3Rvcih0aGlzLmJiX3BvcyArIG9mZnNldCkgKyBpbmRleCkgOiAwOworfQorCit0ZXN0bmVzdGVkZmxhdGJ1ZmZlckxlbmd0aCgpOm51bWJlciB7CisgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIhLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCAzMCk7CisgIHJldHVybiBvZmZzZXQgPyB0aGlzLmJiIS5fX3ZlY3Rvcl9sZW4odGhpcy5iYl9wb3MgKyBvZmZzZXQpIDogMDsKK30KKwordGVzdG5lc3RlZGZsYXRidWZmZXJBcnJheSgpOlVpbnQ4QXJyYXl8bnVsbCB7CisgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIhLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCAzMCk7CisgIHJldHVybiBvZmZzZXQgPyBuZXcgVWludDhBcnJheSh0aGlzLmJiIS5ieXRlcygpLmJ1ZmZlciwgdGhpcy5iYiEuYnl0ZXMoKS5ieXRlT2Zmc2V0ICsgdGhpcy5iYiEuX192ZWN0b3IodGhpcy5iYl9wb3MgKyBvZmZzZXQpLCB0aGlzLmJiIS5fX3ZlY3Rvcl9sZW4odGhpcy5iYl9wb3MgKyBvZmZzZXQpKSA6IG51bGw7Cit9CisKK3Rlc3RlbXB0eShvYmo/OlN0YXQpOlN0YXR8bnVsbCB7CisgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIhLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCAzMik7CisgIHJldHVybiBvZmZzZXQgPyAob2JqIHx8IG5ldyBTdGF0KCkpLl9faW5pdCh0aGlzLmJiIS5fX2luZGlyZWN0KHRoaXMuYmJfcG9zICsgb2Zmc2V0KSwgdGhpcy5iYiEpIDogbnVsbDsKK30KKwordGVzdGJvb2woKTpib29sZWFuIHsKKyAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYiEuX19vZmZzZXQodGhpcy5iYl9wb3MsIDM0KTsKKyAgcmV0dXJuIG9mZnNldCA/ICEhdGhpcy5iYiEucmVhZEludDgodGhpcy5iYl9wb3MgKyBvZmZzZXQpIDogZmFsc2U7Cit9CisKK211dGF0ZV90ZXN0Ym9vbCh2YWx1ZTpib29sZWFuKTpib29sZWFuIHsKKyAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYiEuX19vZmZzZXQodGhpcy5iYl9wb3MsIDM0KTsKKworICBpZiAob2Zmc2V0ID09PSAwKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgdGhpcy5iYiEud3JpdGVJbnQ4KHRoaXMuYmJfcG9zICsgb2Zmc2V0LCArdmFsdWUpOworICByZXR1cm4gdHJ1ZTsKK30KKwordGVzdGhhc2hzMzJGbnYxKCk6bnVtYmVyIHsKKyAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYiEuX19vZmZzZXQodGhpcy5iYl9wb3MsIDM2KTsKKyAgcmV0dXJuIG9mZnNldCA/IHRoaXMuYmIhLnJlYWRJbnQzMih0aGlzLmJiX3BvcyArIG9mZnNldCkgOiAwOworfQorCittdXRhdGVfdGVzdGhhc2hzMzJfZm52MSh2YWx1ZTpudW1iZXIpOmJvb2xlYW4geworICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiIS5fX29mZnNldCh0aGlzLmJiX3BvcywgMzYpOworCisgIGlmIChvZmZzZXQgPT09IDApIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICB0aGlzLmJiIS53cml0ZUludDMyKHRoaXMuYmJfcG9zICsgb2Zmc2V0LCB2YWx1ZSk7CisgIHJldHVybiB0cnVlOworfQorCit0ZXN0aGFzaHUzMkZudjEoKTpudW1iZXIgeworICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiIS5fX29mZnNldCh0aGlzLmJiX3BvcywgMzgpOworICByZXR1cm4gb2Zmc2V0ID8gdGhpcy5iYiEucmVhZFVpbnQzMih0aGlzLmJiX3BvcyArIG9mZnNldCkgOiAwOworfQorCittdXRhdGVfdGVzdGhhc2h1MzJfZm52MSh2YWx1ZTpudW1iZXIpOmJvb2xlYW4geworICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiIS5fX29mZnNldCh0aGlzLmJiX3BvcywgMzgpOworCisgIGlmIChvZmZzZXQgPT09IDApIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICB0aGlzLmJiIS53cml0ZVVpbnQzMih0aGlzLmJiX3BvcyArIG9mZnNldCwgdmFsdWUpOworICByZXR1cm4gdHJ1ZTsKK30KKwordGVzdGhhc2hzNjRGbnYxKCk6YmlnaW50IHsKKyAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYiEuX19vZmZzZXQodGhpcy5iYl9wb3MsIDQwKTsKKyAgcmV0dXJuIG9mZnNldCA/IHRoaXMuYmIhLnJlYWRJbnQ2NCh0aGlzLmJiX3BvcyArIG9mZnNldCkgOiBCaWdJbnQoJzAnKTsKK30KKworbXV0YXRlX3Rlc3RoYXNoczY0X2ZudjEodmFsdWU6YmlnaW50KTpib29sZWFuIHsKKyAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYiEuX19vZmZzZXQodGhpcy5iYl9wb3MsIDQwKTsKKworICBpZiAob2Zmc2V0ID09PSAwKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgdGhpcy5iYiEud3JpdGVJbnQ2NCh0aGlzLmJiX3BvcyArIG9mZnNldCwgdmFsdWUpOworICByZXR1cm4gdHJ1ZTsKK30KKwordGVzdGhhc2h1NjRGbnYxKCk6YmlnaW50IHsKKyAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYiEuX19vZmZzZXQodGhpcy5iYl9wb3MsIDQyKTsKKyAgcmV0dXJuIG9mZnNldCA/IHRoaXMuYmIhLnJlYWRVaW50NjQodGhpcy5iYl9wb3MgKyBvZmZzZXQpIDogQmlnSW50KCcwJyk7Cit9CisKK211dGF0ZV90ZXN0aGFzaHU2NF9mbnYxKHZhbHVlOmJpZ2ludCk6Ym9vbGVhbiB7CisgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIhLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCA0Mik7CisKKyAgaWYgKG9mZnNldCA9PT0gMCkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHRoaXMuYmIhLndyaXRlVWludDY0KHRoaXMuYmJfcG9zICsgb2Zmc2V0LCB2YWx1ZSk7CisgIHJldHVybiB0cnVlOworfQorCit0ZXN0aGFzaHMzMkZudjFhKCk6bnVtYmVyIHsKKyAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYiEuX19vZmZzZXQodGhpcy5iYl9wb3MsIDQ0KTsKKyAgcmV0dXJuIG9mZnNldCA/IHRoaXMuYmIhLnJlYWRJbnQzMih0aGlzLmJiX3BvcyArIG9mZnNldCkgOiAwOworfQorCittdXRhdGVfdGVzdGhhc2hzMzJfZm52MWEodmFsdWU6bnVtYmVyKTpib29sZWFuIHsKKyAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYiEuX19vZmZzZXQodGhpcy5iYl9wb3MsIDQ0KTsKKworICBpZiAob2Zmc2V0ID09PSAwKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgdGhpcy5iYiEud3JpdGVJbnQzMih0aGlzLmJiX3BvcyArIG9mZnNldCwgdmFsdWUpOworICByZXR1cm4gdHJ1ZTsKK30KKwordGVzdGhhc2h1MzJGbnYxYSgpOm51bWJlciB7CisgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIhLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCA0Nik7CisgIHJldHVybiBvZmZzZXQgPyB0aGlzLmJiIS5yZWFkVWludDMyKHRoaXMuYmJfcG9zICsgb2Zmc2V0KSA6IDA7Cit9CisKK211dGF0ZV90ZXN0aGFzaHUzMl9mbnYxYSh2YWx1ZTpudW1iZXIpOmJvb2xlYW4geworICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiIS5fX29mZnNldCh0aGlzLmJiX3BvcywgNDYpOworCisgIGlmIChvZmZzZXQgPT09IDApIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICB0aGlzLmJiIS53cml0ZVVpbnQzMih0aGlzLmJiX3BvcyArIG9mZnNldCwgdmFsdWUpOworICByZXR1cm4gdHJ1ZTsKK30KKwordGVzdGhhc2hzNjRGbnYxYSgpOmJpZ2ludCB7CisgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIhLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCA0OCk7CisgIHJldHVybiBvZmZzZXQgPyB0aGlzLmJiIS5yZWFkSW50NjQodGhpcy5iYl9wb3MgKyBvZmZzZXQpIDogQmlnSW50KCcwJyk7Cit9CisKK211dGF0ZV90ZXN0aGFzaHM2NF9mbnYxYSh2YWx1ZTpiaWdpbnQpOmJvb2xlYW4geworICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiIS5fX29mZnNldCh0aGlzLmJiX3BvcywgNDgpOworCisgIGlmIChvZmZzZXQgPT09IDApIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICB0aGlzLmJiIS53cml0ZUludDY0KHRoaXMuYmJfcG9zICsgb2Zmc2V0LCB2YWx1ZSk7CisgIHJldHVybiB0cnVlOworfQorCit0ZXN0aGFzaHU2NEZudjFhKCk6YmlnaW50IHsKKyAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYiEuX19vZmZzZXQodGhpcy5iYl9wb3MsIDUwKTsKKyAgcmV0dXJuIG9mZnNldCA/IHRoaXMuYmIhLnJlYWRVaW50NjQodGhpcy5iYl9wb3MgKyBvZmZzZXQpIDogQmlnSW50KCcwJyk7Cit9CisKK211dGF0ZV90ZXN0aGFzaHU2NF9mbnYxYSh2YWx1ZTpiaWdpbnQpOmJvb2xlYW4geworICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiIS5fX29mZnNldCh0aGlzLmJiX3BvcywgNTApOworCisgIGlmIChvZmZzZXQgPT09IDApIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICB0aGlzLmJiIS53cml0ZVVpbnQ2NCh0aGlzLmJiX3BvcyArIG9mZnNldCwgdmFsdWUpOworICByZXR1cm4gdHJ1ZTsKK30KKwordGVzdGFycmF5b2Zib29scyhpbmRleDogbnVtYmVyKTpib29sZWFufG51bGwgeworICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiIS5fX29mZnNldCh0aGlzLmJiX3BvcywgNTIpOworICByZXR1cm4gb2Zmc2V0ID8gISF0aGlzLmJiIS5yZWFkSW50OCh0aGlzLmJiIS5fX3ZlY3Rvcih0aGlzLmJiX3BvcyArIG9mZnNldCkgKyBpbmRleCkgOiBmYWxzZTsKK30KKwordGVzdGFycmF5b2Zib29sc0xlbmd0aCgpOm51bWJlciB7CisgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIhLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCA1Mik7CisgIHJldHVybiBvZmZzZXQgPyB0aGlzLmJiIS5fX3ZlY3Rvcl9sZW4odGhpcy5iYl9wb3MgKyBvZmZzZXQpIDogMDsKK30KKwordGVzdGFycmF5b2Zib29sc0FycmF5KCk6SW50OEFycmF5fG51bGwgeworICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiIS5fX29mZnNldCh0aGlzLmJiX3BvcywgNTIpOworICByZXR1cm4gb2Zmc2V0ID8gbmV3IEludDhBcnJheSh0aGlzLmJiIS5ieXRlcygpLmJ1ZmZlciwgdGhpcy5iYiEuYnl0ZXMoKS5ieXRlT2Zmc2V0ICsgdGhpcy5iYiEuX192ZWN0b3IodGhpcy5iYl9wb3MgKyBvZmZzZXQpLCB0aGlzLmJiIS5fX3ZlY3Rvcl9sZW4odGhpcy5iYl9wb3MgKyBvZmZzZXQpKSA6IG51bGw7Cit9CisKK3Rlc3RmKCk6bnVtYmVyIHsKKyAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYiEuX19vZmZzZXQodGhpcy5iYl9wb3MsIDU0KTsKKyAgcmV0dXJuIG9mZnNldCA/IHRoaXMuYmIhLnJlYWRGbG9hdDMyKHRoaXMuYmJfcG9zICsgb2Zmc2V0KSA6IDMuMTQxNTk7Cit9CisKK211dGF0ZV90ZXN0Zih2YWx1ZTpudW1iZXIpOmJvb2xlYW4geworICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiIS5fX29mZnNldCh0aGlzLmJiX3BvcywgNTQpOworCisgIGlmIChvZmZzZXQgPT09IDApIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICB0aGlzLmJiIS53cml0ZUZsb2F0MzIodGhpcy5iYl9wb3MgKyBvZmZzZXQsIHZhbHVlKTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK3Rlc3RmMigpOm51bWJlciB7CisgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIhLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCA1Nik7CisgIHJldHVybiBvZmZzZXQgPyB0aGlzLmJiIS5yZWFkRmxvYXQzMih0aGlzLmJiX3BvcyArIG9mZnNldCkgOiAzLjA7Cit9CisKK211dGF0ZV90ZXN0ZjIodmFsdWU6bnVtYmVyKTpib29sZWFuIHsKKyAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYiEuX19vZmZzZXQodGhpcy5iYl9wb3MsIDU2KTsKKworICBpZiAob2Zmc2V0ID09PSAwKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgdGhpcy5iYiEud3JpdGVGbG9hdDMyKHRoaXMuYmJfcG9zICsgb2Zmc2V0LCB2YWx1ZSk7CisgIHJldHVybiB0cnVlOworfQorCit0ZXN0ZjMoKTpudW1iZXIgeworICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiIS5fX29mZnNldCh0aGlzLmJiX3BvcywgNTgpOworICByZXR1cm4gb2Zmc2V0ID8gdGhpcy5iYiEucmVhZEZsb2F0MzIodGhpcy5iYl9wb3MgKyBvZmZzZXQpIDogMC4wOworfQorCittdXRhdGVfdGVzdGYzKHZhbHVlOm51bWJlcik6Ym9vbGVhbiB7CisgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIhLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCA1OCk7CisKKyAgaWYgKG9mZnNldCA9PT0gMCkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHRoaXMuYmIhLndyaXRlRmxvYXQzMih0aGlzLmJiX3BvcyArIG9mZnNldCwgdmFsdWUpOworICByZXR1cm4gdHJ1ZTsKK30KKwordGVzdGFycmF5b2ZzdHJpbmcyKGluZGV4OiBudW1iZXIpOnN0cmluZwordGVzdGFycmF5b2ZzdHJpbmcyKGluZGV4OiBudW1iZXIsb3B0aW9uYWxFbmNvZGluZzpmbGF0YnVmZmVycy5FbmNvZGluZyk6c3RyaW5nfFVpbnQ4QXJyYXkKK3Rlc3RhcnJheW9mc3RyaW5nMihpbmRleDogbnVtYmVyLG9wdGlvbmFsRW5jb2Rpbmc/OmFueSk6c3RyaW5nfFVpbnQ4QXJyYXl8bnVsbCB7CisgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIhLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCA2MCk7CisgIHJldHVybiBvZmZzZXQgPyB0aGlzLmJiIS5fX3N0cmluZyh0aGlzLmJiIS5fX3ZlY3Rvcih0aGlzLmJiX3BvcyArIG9mZnNldCkgKyBpbmRleCAqIDQsIG9wdGlvbmFsRW5jb2RpbmcpIDogbnVsbDsKK30KKwordGVzdGFycmF5b2ZzdHJpbmcyTGVuZ3RoKCk6bnVtYmVyIHsKKyAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYiEuX19vZmZzZXQodGhpcy5iYl9wb3MsIDYwKTsKKyAgcmV0dXJuIG9mZnNldCA/IHRoaXMuYmIhLl9fdmVjdG9yX2xlbih0aGlzLmJiX3BvcyArIG9mZnNldCkgOiAwOworfQorCit0ZXN0YXJyYXlvZnNvcnRlZHN0cnVjdChpbmRleDogbnVtYmVyLCBvYmo/OkFiaWxpdHkpOkFiaWxpdHl8bnVsbCB7CisgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIhLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCA2Mik7CisgIHJldHVybiBvZmZzZXQgPyAob2JqIHx8IG5ldyBBYmlsaXR5KCkpLl9faW5pdCh0aGlzLmJiIS5fX3ZlY3Rvcih0aGlzLmJiX3BvcyArIG9mZnNldCkgKyBpbmRleCAqIDgsIHRoaXMuYmIhKSA6IG51bGw7Cit9CisKK3Rlc3RhcnJheW9mc29ydGVkc3RydWN0TGVuZ3RoKCk6bnVtYmVyIHsKKyAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYiEuX19vZmZzZXQodGhpcy5iYl9wb3MsIDYyKTsKKyAgcmV0dXJuIG9mZnNldCA/IHRoaXMuYmIhLl9fdmVjdG9yX2xlbih0aGlzLmJiX3BvcyArIG9mZnNldCkgOiAwOworfQorCitmbGV4KGluZGV4OiBudW1iZXIpOm51bWJlcnxudWxsIHsKKyAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYiEuX19vZmZzZXQodGhpcy5iYl9wb3MsIDY0KTsKKyAgcmV0dXJuIG9mZnNldCA/IHRoaXMuYmIhLnJlYWRVaW50OCh0aGlzLmJiIS5fX3ZlY3Rvcih0aGlzLmJiX3BvcyArIG9mZnNldCkgKyBpbmRleCkgOiAwOworfQorCitmbGV4TGVuZ3RoKCk6bnVtYmVyIHsKKyAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYiEuX19vZmZzZXQodGhpcy5iYl9wb3MsIDY0KTsKKyAgcmV0dXJuIG9mZnNldCA/IHRoaXMuYmIhLl9fdmVjdG9yX2xlbih0aGlzLmJiX3BvcyArIG9mZnNldCkgOiAwOworfQorCitmbGV4QXJyYXkoKTpVaW50OEFycmF5fG51bGwgeworICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiIS5fX29mZnNldCh0aGlzLmJiX3BvcywgNjQpOworICByZXR1cm4gb2Zmc2V0ID8gbmV3IFVpbnQ4QXJyYXkodGhpcy5iYiEuYnl0ZXMoKS5idWZmZXIsIHRoaXMuYmIhLmJ5dGVzKCkuYnl0ZU9mZnNldCArIHRoaXMuYmIhLl9fdmVjdG9yKHRoaXMuYmJfcG9zICsgb2Zmc2V0KSwgdGhpcy5iYiEuX192ZWN0b3JfbGVuKHRoaXMuYmJfcG9zICsgb2Zmc2V0KSkgOiBudWxsOworfQorCit0ZXN0NShpbmRleDogbnVtYmVyLCBvYmo/OlRlc3QpOlRlc3R8bnVsbCB7CisgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIhLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCA2Nik7CisgIHJldHVybiBvZmZzZXQgPyAob2JqIHx8IG5ldyBUZXN0KCkpLl9faW5pdCh0aGlzLmJiIS5fX3ZlY3Rvcih0aGlzLmJiX3BvcyArIG9mZnNldCkgKyBpbmRleCAqIDQsIHRoaXMuYmIhKSA6IG51bGw7Cit9CisKK3Rlc3Q1TGVuZ3RoKCk6bnVtYmVyIHsKKyAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYiEuX19vZmZzZXQodGhpcy5iYl9wb3MsIDY2KTsKKyAgcmV0dXJuIG9mZnNldCA/IHRoaXMuYmIhLl9fdmVjdG9yX2xlbih0aGlzLmJiX3BvcyArIG9mZnNldCkgOiAwOworfQorCit2ZWN0b3JPZkxvbmdzKGluZGV4OiBudW1iZXIpOmJpZ2ludHxudWxsIHsKKyAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYiEuX19vZmZzZXQodGhpcy5iYl9wb3MsIDY4KTsKKyAgcmV0dXJuIG9mZnNldCA/IHRoaXMuYmIhLnJlYWRJbnQ2NCh0aGlzLmJiIS5fX3ZlY3Rvcih0aGlzLmJiX3BvcyArIG9mZnNldCkgKyBpbmRleCAqIDgpIDogQmlnSW50KDApOworfQorCit2ZWN0b3JPZkxvbmdzTGVuZ3RoKCk6bnVtYmVyIHsKKyAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYiEuX19vZmZzZXQodGhpcy5iYl9wb3MsIDY4KTsKKyAgcmV0dXJuIG9mZnNldCA/IHRoaXMuYmIhLl9fdmVjdG9yX2xlbih0aGlzLmJiX3BvcyArIG9mZnNldCkgOiAwOworfQorCit2ZWN0b3JPZkRvdWJsZXMoaW5kZXg6IG51bWJlcik6bnVtYmVyfG51bGwgeworICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiIS5fX29mZnNldCh0aGlzLmJiX3BvcywgNzApOworICByZXR1cm4gb2Zmc2V0ID8gdGhpcy5iYiEucmVhZEZsb2F0NjQodGhpcy5iYiEuX192ZWN0b3IodGhpcy5iYl9wb3MgKyBvZmZzZXQpICsgaW5kZXggKiA4KSA6IDA7Cit9CisKK3ZlY3Rvck9mRG91Ymxlc0xlbmd0aCgpOm51bWJlciB7CisgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIhLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCA3MCk7CisgIHJldHVybiBvZmZzZXQgPyB0aGlzLmJiIS5fX3ZlY3Rvcl9sZW4odGhpcy5iYl9wb3MgKyBvZmZzZXQpIDogMDsKK30KKwordmVjdG9yT2ZEb3VibGVzQXJyYXkoKTpGbG9hdDY0QXJyYXl8bnVsbCB7CisgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIhLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCA3MCk7CisgIHJldHVybiBvZmZzZXQgPyBuZXcgRmxvYXQ2NEFycmF5KHRoaXMuYmIhLmJ5dGVzKCkuYnVmZmVyLCB0aGlzLmJiIS5ieXRlcygpLmJ5dGVPZmZzZXQgKyB0aGlzLmJiIS5fX3ZlY3Rvcih0aGlzLmJiX3BvcyArIG9mZnNldCksIHRoaXMuYmIhLl9fdmVjdG9yX2xlbih0aGlzLmJiX3BvcyArIG9mZnNldCkpIDogbnVsbDsKK30KKworcGFyZW50TmFtZXNwYWNlVGVzdChvYmo/OkluUGFyZW50TmFtZXNwYWNlKTpJblBhcmVudE5hbWVzcGFjZXxudWxsIHsKKyAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYiEuX19vZmZzZXQodGhpcy5iYl9wb3MsIDcyKTsKKyAgcmV0dXJuIG9mZnNldCA/IChvYmogfHwgbmV3IEluUGFyZW50TmFtZXNwYWNlKCkpLl9faW5pdCh0aGlzLmJiIS5fX2luZGlyZWN0KHRoaXMuYmJfcG9zICsgb2Zmc2V0KSwgdGhpcy5iYiEpIDogbnVsbDsKK30KKwordmVjdG9yT2ZSZWZlcnJhYmxlcyhpbmRleDogbnVtYmVyLCBvYmo/OlJlZmVycmFibGUpOlJlZmVycmFibGV8bnVsbCB7CisgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIhLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCA3NCk7CisgIHJldHVybiBvZmZzZXQgPyAob2JqIHx8IG5ldyBSZWZlcnJhYmxlKCkpLl9faW5pdCh0aGlzLmJiIS5fX2luZGlyZWN0KHRoaXMuYmIhLl9fdmVjdG9yKHRoaXMuYmJfcG9zICsgb2Zmc2V0KSArIGluZGV4ICogNCksIHRoaXMuYmIhKSA6IG51bGw7Cit9CisKK3ZlY3Rvck9mUmVmZXJyYWJsZXNMZW5ndGgoKTpudW1iZXIgeworICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiIS5fX29mZnNldCh0aGlzLmJiX3BvcywgNzQpOworICByZXR1cm4gb2Zmc2V0ID8gdGhpcy5iYiEuX192ZWN0b3JfbGVuKHRoaXMuYmJfcG9zICsgb2Zmc2V0KSA6IDA7Cit9CisKK3NpbmdsZVdlYWtSZWZlcmVuY2UoKTpiaWdpbnQgeworICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiIS5fX29mZnNldCh0aGlzLmJiX3BvcywgNzYpOworICByZXR1cm4gb2Zmc2V0ID8gdGhpcy5iYiEucmVhZFVpbnQ2NCh0aGlzLmJiX3BvcyArIG9mZnNldCkgOiBCaWdJbnQoJzAnKTsKK30KKworbXV0YXRlX3NpbmdsZV93ZWFrX3JlZmVyZW5jZSh2YWx1ZTpiaWdpbnQpOmJvb2xlYW4geworICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiIS5fX29mZnNldCh0aGlzLmJiX3BvcywgNzYpOworCisgIGlmIChvZmZzZXQgPT09IDApIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICB0aGlzLmJiIS53cml0ZVVpbnQ2NCh0aGlzLmJiX3BvcyArIG9mZnNldCwgdmFsdWUpOworICByZXR1cm4gdHJ1ZTsKK30KKwordmVjdG9yT2ZXZWFrUmVmZXJlbmNlcyhpbmRleDogbnVtYmVyKTpiaWdpbnR8bnVsbCB7CisgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIhLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCA3OCk7CisgIHJldHVybiBvZmZzZXQgPyB0aGlzLmJiIS5yZWFkVWludDY0KHRoaXMuYmIhLl9fdmVjdG9yKHRoaXMuYmJfcG9zICsgb2Zmc2V0KSArIGluZGV4ICogOCkgOiBCaWdJbnQoMCk7Cit9CisKK3ZlY3Rvck9mV2Vha1JlZmVyZW5jZXNMZW5ndGgoKTpudW1iZXIgeworICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiIS5fX29mZnNldCh0aGlzLmJiX3BvcywgNzgpOworICByZXR1cm4gb2Zmc2V0ID8gdGhpcy5iYiEuX192ZWN0b3JfbGVuKHRoaXMuYmJfcG9zICsgb2Zmc2V0KSA6IDA7Cit9CisKK3ZlY3Rvck9mU3Ryb25nUmVmZXJyYWJsZXMoaW5kZXg6IG51bWJlciwgb2JqPzpSZWZlcnJhYmxlKTpSZWZlcnJhYmxlfG51bGwgeworICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiIS5fX29mZnNldCh0aGlzLmJiX3BvcywgODApOworICByZXR1cm4gb2Zmc2V0ID8gKG9iaiB8fCBuZXcgUmVmZXJyYWJsZSgpKS5fX2luaXQodGhpcy5iYiEuX19pbmRpcmVjdCh0aGlzLmJiIS5fX3ZlY3Rvcih0aGlzLmJiX3BvcyArIG9mZnNldCkgKyBpbmRleCAqIDQpLCB0aGlzLmJiISkgOiBudWxsOworfQorCit2ZWN0b3JPZlN0cm9uZ1JlZmVycmFibGVzTGVuZ3RoKCk6bnVtYmVyIHsKKyAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYiEuX19vZmZzZXQodGhpcy5iYl9wb3MsIDgwKTsKKyAgcmV0dXJuIG9mZnNldCA/IHRoaXMuYmIhLl9fdmVjdG9yX2xlbih0aGlzLmJiX3BvcyArIG9mZnNldCkgOiAwOworfQorCitjb093bmluZ1JlZmVyZW5jZSgpOmJpZ2ludCB7CisgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIhLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCA4Mik7CisgIHJldHVybiBvZmZzZXQgPyB0aGlzLmJiIS5yZWFkVWludDY0KHRoaXMuYmJfcG9zICsgb2Zmc2V0KSA6IEJpZ0ludCgnMCcpOworfQorCittdXRhdGVfY29fb3duaW5nX3JlZmVyZW5jZSh2YWx1ZTpiaWdpbnQpOmJvb2xlYW4geworICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiIS5fX29mZnNldCh0aGlzLmJiX3BvcywgODIpOworCisgIGlmIChvZmZzZXQgPT09IDApIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICB0aGlzLmJiIS53cml0ZVVpbnQ2NCh0aGlzLmJiX3BvcyArIG9mZnNldCwgdmFsdWUpOworICByZXR1cm4gdHJ1ZTsKK30KKwordmVjdG9yT2ZDb093bmluZ1JlZmVyZW5jZXMoaW5kZXg6IG51bWJlcik6YmlnaW50fG51bGwgeworICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiIS5fX29mZnNldCh0aGlzLmJiX3BvcywgODQpOworICByZXR1cm4gb2Zmc2V0ID8gdGhpcy5iYiEucmVhZFVpbnQ2NCh0aGlzLmJiIS5fX3ZlY3Rvcih0aGlzLmJiX3BvcyArIG9mZnNldCkgKyBpbmRleCAqIDgpIDogQmlnSW50KDApOworfQorCit2ZWN0b3JPZkNvT3duaW5nUmVmZXJlbmNlc0xlbmd0aCgpOm51bWJlciB7CisgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIhLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCA4NCk7CisgIHJldHVybiBvZmZzZXQgPyB0aGlzLmJiIS5fX3ZlY3Rvcl9sZW4odGhpcy5iYl9wb3MgKyBvZmZzZXQpIDogMDsKK30KKworbm9uT3duaW5nUmVmZXJlbmNlKCk6YmlnaW50IHsKKyAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYiEuX19vZmZzZXQodGhpcy5iYl9wb3MsIDg2KTsKKyAgcmV0dXJuIG9mZnNldCA/IHRoaXMuYmIhLnJlYWRVaW50NjQodGhpcy5iYl9wb3MgKyBvZmZzZXQpIDogQmlnSW50KCcwJyk7Cit9CisKK211dGF0ZV9ub25fb3duaW5nX3JlZmVyZW5jZSh2YWx1ZTpiaWdpbnQpOmJvb2xlYW4geworICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiIS5fX29mZnNldCh0aGlzLmJiX3BvcywgODYpOworCisgIGlmIChvZmZzZXQgPT09IDApIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICB0aGlzLmJiIS53cml0ZVVpbnQ2NCh0aGlzLmJiX3BvcyArIG9mZnNldCwgdmFsdWUpOworICByZXR1cm4gdHJ1ZTsKK30KKwordmVjdG9yT2ZOb25Pd25pbmdSZWZlcmVuY2VzKGluZGV4OiBudW1iZXIpOmJpZ2ludHxudWxsIHsKKyAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYiEuX19vZmZzZXQodGhpcy5iYl9wb3MsIDg4KTsKKyAgcmV0dXJuIG9mZnNldCA/IHRoaXMuYmIhLnJlYWRVaW50NjQodGhpcy5iYiEuX192ZWN0b3IodGhpcy5iYl9wb3MgKyBvZmZzZXQpICsgaW5kZXggKiA4KSA6IEJpZ0ludCgwKTsKK30KKwordmVjdG9yT2ZOb25Pd25pbmdSZWZlcmVuY2VzTGVuZ3RoKCk6bnVtYmVyIHsKKyAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYiEuX19vZmZzZXQodGhpcy5iYl9wb3MsIDg4KTsKKyAgcmV0dXJuIG9mZnNldCA/IHRoaXMuYmIhLl9fdmVjdG9yX2xlbih0aGlzLmJiX3BvcyArIG9mZnNldCkgOiAwOworfQorCithbnlVbmlxdWVUeXBlKCk6QW55VW5pcXVlQWxpYXNlcyB7CisgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIhLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCA5MCk7CisgIHJldHVybiBvZmZzZXQgPyB0aGlzLmJiIS5yZWFkVWludDgodGhpcy5iYl9wb3MgKyBvZmZzZXQpIDogQW55VW5pcXVlQWxpYXNlcy5OT05FOworfQorCithbnlVbmlxdWU8VCBleHRlbmRzIGZsYXRidWZmZXJzLlRhYmxlPihvYmo6YW55KTphbnl8bnVsbCB7CisgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIhLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCA5Mik7CisgIHJldHVybiBvZmZzZXQgPyB0aGlzLmJiIS5fX3VuaW9uKG9iaiwgdGhpcy5iYl9wb3MgKyBvZmZzZXQpIDogbnVsbDsKK30KKworYW55QW1iaWd1b3VzVHlwZSgpOkFueUFtYmlndW91c0FsaWFzZXMgeworICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiIS5fX29mZnNldCh0aGlzLmJiX3BvcywgOTQpOworICByZXR1cm4gb2Zmc2V0ID8gdGhpcy5iYiEucmVhZFVpbnQ4KHRoaXMuYmJfcG9zICsgb2Zmc2V0KSA6IEFueUFtYmlndW91c0FsaWFzZXMuTk9ORTsKK30KKworYW55QW1iaWd1b3VzPFQgZXh0ZW5kcyBmbGF0YnVmZmVycy5UYWJsZT4ob2JqOmFueSk6YW55fG51bGwgeworICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiIS5fX29mZnNldCh0aGlzLmJiX3BvcywgOTYpOworICByZXR1cm4gb2Zmc2V0ID8gdGhpcy5iYiEuX191bmlvbihvYmosIHRoaXMuYmJfcG9zICsgb2Zmc2V0KSA6IG51bGw7Cit9CisKK3ZlY3Rvck9mRW51bXMoaW5kZXg6IG51bWJlcik6Q29sb3J8bnVsbCB7CisgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIhLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCA5OCk7CisgIHJldHVybiBvZmZzZXQgPyB0aGlzLmJiIS5yZWFkVWludDgodGhpcy5iYiEuX192ZWN0b3IodGhpcy5iYl9wb3MgKyBvZmZzZXQpICsgaW5kZXgpIDogMDsKK30KKwordmVjdG9yT2ZFbnVtc0xlbmd0aCgpOm51bWJlciB7CisgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIhLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCA5OCk7CisgIHJldHVybiBvZmZzZXQgPyB0aGlzLmJiIS5fX3ZlY3Rvcl9sZW4odGhpcy5iYl9wb3MgKyBvZmZzZXQpIDogMDsKK30KKwordmVjdG9yT2ZFbnVtc0FycmF5KCk6VWludDhBcnJheXxudWxsIHsKKyAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYiEuX19vZmZzZXQodGhpcy5iYl9wb3MsIDk4KTsKKyAgcmV0dXJuIG9mZnNldCA/IG5ldyBVaW50OEFycmF5KHRoaXMuYmIhLmJ5dGVzKCkuYnVmZmVyLCB0aGlzLmJiIS5ieXRlcygpLmJ5dGVPZmZzZXQgKyB0aGlzLmJiIS5fX3ZlY3Rvcih0aGlzLmJiX3BvcyArIG9mZnNldCksIHRoaXMuYmIhLl9fdmVjdG9yX2xlbih0aGlzLmJiX3BvcyArIG9mZnNldCkpIDogbnVsbDsKK30KKworc2lnbmVkRW51bSgpOlJhY2UgeworICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiIS5fX29mZnNldCh0aGlzLmJiX3BvcywgMTAwKTsKKyAgcmV0dXJuIG9mZnNldCA/IHRoaXMuYmIhLnJlYWRJbnQ4KHRoaXMuYmJfcG9zICsgb2Zmc2V0KSA6IFJhY2UuTm9uZTsKK30KKworbXV0YXRlX3NpZ25lZF9lbnVtKHZhbHVlOlJhY2UpOmJvb2xlYW4geworICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiIS5fX29mZnNldCh0aGlzLmJiX3BvcywgMTAwKTsKKworICBpZiAob2Zmc2V0ID09PSAwKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgdGhpcy5iYiEud3JpdGVJbnQ4KHRoaXMuYmJfcG9zICsgb2Zmc2V0LCB2YWx1ZSk7CisgIHJldHVybiB0cnVlOworfQorCit0ZXN0cmVxdWlyZWRuZXN0ZWRmbGF0YnVmZmVyKGluZGV4OiBudW1iZXIpOm51bWJlcnxudWxsIHsKKyAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYiEuX19vZmZzZXQodGhpcy5iYl9wb3MsIDEwMik7CisgIHJldHVybiBvZmZzZXQgPyB0aGlzLmJiIS5yZWFkVWludDgodGhpcy5iYiEuX192ZWN0b3IodGhpcy5iYl9wb3MgKyBvZmZzZXQpICsgaW5kZXgpIDogMDsKK30KKwordGVzdHJlcXVpcmVkbmVzdGVkZmxhdGJ1ZmZlckxlbmd0aCgpOm51bWJlciB7CisgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIhLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCAxMDIpOworICByZXR1cm4gb2Zmc2V0ID8gdGhpcy5iYiEuX192ZWN0b3JfbGVuKHRoaXMuYmJfcG9zICsgb2Zmc2V0KSA6IDA7Cit9CisKK3Rlc3RyZXF1aXJlZG5lc3RlZGZsYXRidWZmZXJBcnJheSgpOlVpbnQ4QXJyYXl8bnVsbCB7CisgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIhLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCAxMDIpOworICByZXR1cm4gb2Zmc2V0ID8gbmV3IFVpbnQ4QXJyYXkodGhpcy5iYiEuYnl0ZXMoKS5idWZmZXIsIHRoaXMuYmIhLmJ5dGVzKCkuYnl0ZU9mZnNldCArIHRoaXMuYmIhLl9fdmVjdG9yKHRoaXMuYmJfcG9zICsgb2Zmc2V0KSwgdGhpcy5iYiEuX192ZWN0b3JfbGVuKHRoaXMuYmJfcG9zICsgb2Zmc2V0KSkgOiBudWxsOworfQorCitzY2FsYXJLZXlTb3J0ZWRUYWJsZXMoaW5kZXg6IG51bWJlciwgb2JqPzpTdGF0KTpTdGF0fG51bGwgeworICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiIS5fX29mZnNldCh0aGlzLmJiX3BvcywgMTA0KTsKKyAgcmV0dXJuIG9mZnNldCA/IChvYmogfHwgbmV3IFN0YXQoKSkuX19pbml0KHRoaXMuYmIhLl9faW5kaXJlY3QodGhpcy5iYiEuX192ZWN0b3IodGhpcy5iYl9wb3MgKyBvZmZzZXQpICsgaW5kZXggKiA0KSwgdGhpcy5iYiEpIDogbnVsbDsKK30KKworc2NhbGFyS2V5U29ydGVkVGFibGVzTGVuZ3RoKCk6bnVtYmVyIHsKKyAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYiEuX19vZmZzZXQodGhpcy5iYl9wb3MsIDEwNCk7CisgIHJldHVybiBvZmZzZXQgPyB0aGlzLmJiIS5fX3ZlY3Rvcl9sZW4odGhpcy5iYl9wb3MgKyBvZmZzZXQpIDogMDsKK30KKworbmF0aXZlSW5saW5lKG9iaj86VGVzdCk6VGVzdHxudWxsIHsKKyAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYiEuX19vZmZzZXQodGhpcy5iYl9wb3MsIDEwNik7CisgIHJldHVybiBvZmZzZXQgPyAob2JqIHx8IG5ldyBUZXN0KCkpLl9faW5pdCh0aGlzLmJiX3BvcyArIG9mZnNldCwgdGhpcy5iYiEpIDogbnVsbDsKK30KKworbG9uZ0VudW1Ob25FbnVtRGVmYXVsdCgpOmJpZ2ludCB7CisgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIhLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCAxMDgpOworICByZXR1cm4gb2Zmc2V0ID8gdGhpcy5iYiEucmVhZFVpbnQ2NCh0aGlzLmJiX3BvcyArIG9mZnNldCkgOiBCaWdJbnQoJzAnKTsKK30KKworbXV0YXRlX2xvbmdfZW51bV9ub25fZW51bV9kZWZhdWx0KHZhbHVlOmJpZ2ludCk6Ym9vbGVhbiB7CisgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIhLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCAxMDgpOworCisgIGlmIChvZmZzZXQgPT09IDApIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICB0aGlzLmJiIS53cml0ZVVpbnQ2NCh0aGlzLmJiX3BvcyArIG9mZnNldCwgdmFsdWUpOworICByZXR1cm4gdHJ1ZTsKK30KKworbG9uZ0VudW1Ob3JtYWxEZWZhdWx0KCk6YmlnaW50IHsKKyAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYiEuX19vZmZzZXQodGhpcy5iYl9wb3MsIDExMCk7CisgIHJldHVybiBvZmZzZXQgPyB0aGlzLmJiIS5yZWFkVWludDY0KHRoaXMuYmJfcG9zICsgb2Zmc2V0KSA6IEJpZ0ludCgnMicpOworfQorCittdXRhdGVfbG9uZ19lbnVtX25vcm1hbF9kZWZhdWx0KHZhbHVlOmJpZ2ludCk6Ym9vbGVhbiB7CisgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIhLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCAxMTApOworCisgIGlmIChvZmZzZXQgPT09IDApIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICB0aGlzLmJiIS53cml0ZVVpbnQ2NCh0aGlzLmJiX3BvcyArIG9mZnNldCwgdmFsdWUpOworICByZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIGdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpOnN0cmluZyB7CisgIHJldHVybiAnTXlHYW1lX0V4YW1wbGVfTW9uc3Rlcic7Cit9CisKK3N0YXRpYyBzdGFydE1vbnN0ZXIoYnVpbGRlcjpmbGF0YnVmZmVycy5CdWlsZGVyKSB7CisgIGJ1aWxkZXIuc3RhcnRPYmplY3QoNTQpOworfQorCitzdGF0aWMgYWRkUG9zKGJ1aWxkZXI6ZmxhdGJ1ZmZlcnMuQnVpbGRlciwgcG9zT2Zmc2V0OmZsYXRidWZmZXJzLk9mZnNldCkgeworICBidWlsZGVyLmFkZEZpZWxkU3RydWN0KDAsIHBvc09mZnNldCwgMCk7Cit9CisKK3N0YXRpYyBhZGRNYW5hKGJ1aWxkZXI6ZmxhdGJ1ZmZlcnMuQnVpbGRlciwgbWFuYTpudW1iZXIpIHsKKyAgYnVpbGRlci5hZGRGaWVsZEludDE2KDEsIG1hbmEsIDE1MCk7Cit9CisKK3N0YXRpYyBhZGRIcChidWlsZGVyOmZsYXRidWZmZXJzLkJ1aWxkZXIsIGhwOm51bWJlcikgeworICBidWlsZGVyLmFkZEZpZWxkSW50MTYoMiwgaHAsIDEwMCk7Cit9CisKK3N0YXRpYyBhZGROYW1lKGJ1aWxkZXI6ZmxhdGJ1ZmZlcnMuQnVpbGRlciwgbmFtZU9mZnNldDpmbGF0YnVmZmVycy5PZmZzZXQpIHsKKyAgYnVpbGRlci5hZGRGaWVsZE9mZnNldCgzLCBuYW1lT2Zmc2V0LCAwKTsKK30KKworc3RhdGljIGFkZEludmVudG9yeShidWlsZGVyOmZsYXRidWZmZXJzLkJ1aWxkZXIsIGludmVudG9yeU9mZnNldDpmbGF0YnVmZmVycy5PZmZzZXQpIHsKKyAgYnVpbGRlci5hZGRGaWVsZE9mZnNldCg1LCBpbnZlbnRvcnlPZmZzZXQsIDApOworfQorCitzdGF0aWMgY3JlYXRlSW52ZW50b3J5VmVjdG9yKGJ1aWxkZXI6ZmxhdGJ1ZmZlcnMuQnVpbGRlciwgZGF0YTpudW1iZXJbXXxVaW50OEFycmF5KTpmbGF0YnVmZmVycy5PZmZzZXQgeworICBidWlsZGVyLnN0YXJ0VmVjdG9yKDEsIGRhdGEubGVuZ3RoLCAxKTsKKyAgZm9yIChsZXQgaSA9IGRhdGEubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHsKKyAgICBidWlsZGVyLmFkZEludDgoZGF0YVtpXSEpOworICB9CisgIHJldHVybiBidWlsZGVyLmVuZFZlY3RvcigpOworfQorCitzdGF0aWMgc3RhcnRJbnZlbnRvcnlWZWN0b3IoYnVpbGRlcjpmbGF0YnVmZmVycy5CdWlsZGVyLCBudW1FbGVtczpudW1iZXIpIHsKKyAgYnVpbGRlci5zdGFydFZlY3RvcigxLCBudW1FbGVtcywgMSk7Cit9CisKK3N0YXRpYyBhZGRDb2xvcihidWlsZGVyOmZsYXRidWZmZXJzLkJ1aWxkZXIsIGNvbG9yOkNvbG9yKSB7CisgIGJ1aWxkZXIuYWRkRmllbGRJbnQ4KDYsIGNvbG9yLCBDb2xvci5CbHVlKTsKK30KKworc3RhdGljIGFkZFRlc3RUeXBlKGJ1aWxkZXI6ZmxhdGJ1ZmZlcnMuQnVpbGRlciwgdGVzdFR5cGU6QW55KSB7CisgIGJ1aWxkZXIuYWRkRmllbGRJbnQ4KDcsIHRlc3RUeXBlLCBBbnkuTk9ORSk7Cit9CisKK3N0YXRpYyBhZGRUZXN0KGJ1aWxkZXI6ZmxhdGJ1ZmZlcnMuQnVpbGRlciwgdGVzdE9mZnNldDpmbGF0YnVmZmVycy5PZmZzZXQpIHsKKyAgYnVpbGRlci5hZGRGaWVsZE9mZnNldCg4LCB0ZXN0T2Zmc2V0LCAwKTsKK30KKworc3RhdGljIGFkZFRlc3Q0KGJ1aWxkZXI6ZmxhdGJ1ZmZlcnMuQnVpbGRlciwgdGVzdDRPZmZzZXQ6ZmxhdGJ1ZmZlcnMuT2Zmc2V0KSB7CisgIGJ1aWxkZXIuYWRkRmllbGRPZmZzZXQoOSwgdGVzdDRPZmZzZXQsIDApOworfQorCitzdGF0aWMgc3RhcnRUZXN0NFZlY3RvcihidWlsZGVyOmZsYXRidWZmZXJzLkJ1aWxkZXIsIG51bUVsZW1zOm51bWJlcikgeworICBidWlsZGVyLnN0YXJ0VmVjdG9yKDQsIG51bUVsZW1zLCAyKTsKK30KKworc3RhdGljIGFkZFRlc3RhcnJheW9mc3RyaW5nKGJ1aWxkZXI6ZmxhdGJ1ZmZlcnMuQnVpbGRlciwgdGVzdGFycmF5b2ZzdHJpbmdPZmZzZXQ6ZmxhdGJ1ZmZlcnMuT2Zmc2V0KSB7CisgIGJ1aWxkZXIuYWRkRmllbGRPZmZzZXQoMTAsIHRlc3RhcnJheW9mc3RyaW5nT2Zmc2V0LCAwKTsKK30KKworc3RhdGljIGNyZWF0ZVRlc3RhcnJheW9mc3RyaW5nVmVjdG9yKGJ1aWxkZXI6ZmxhdGJ1ZmZlcnMuQnVpbGRlciwgZGF0YTpmbGF0YnVmZmVycy5PZmZzZXRbXSk6ZmxhdGJ1ZmZlcnMuT2Zmc2V0IHsKKyAgYnVpbGRlci5zdGFydFZlY3Rvcig0LCBkYXRhLmxlbmd0aCwgNCk7CisgIGZvciAobGV0IGkgPSBkYXRhLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7CisgICAgYnVpbGRlci5hZGRPZmZzZXQoZGF0YVtpXSEpOworICB9CisgIHJldHVybiBidWlsZGVyLmVuZFZlY3RvcigpOworfQorCitzdGF0aWMgc3RhcnRUZXN0YXJyYXlvZnN0cmluZ1ZlY3RvcihidWlsZGVyOmZsYXRidWZmZXJzLkJ1aWxkZXIsIG51bUVsZW1zOm51bWJlcikgeworICBidWlsZGVyLnN0YXJ0VmVjdG9yKDQsIG51bUVsZW1zLCA0KTsKK30KKworc3RhdGljIGFkZFRlc3RhcnJheW9mdGFibGVzKGJ1aWxkZXI6ZmxhdGJ1ZmZlcnMuQnVpbGRlciwgdGVzdGFycmF5b2Z0YWJsZXNPZmZzZXQ6ZmxhdGJ1ZmZlcnMuT2Zmc2V0KSB7CisgIGJ1aWxkZXIuYWRkRmllbGRPZmZzZXQoMTEsIHRlc3RhcnJheW9mdGFibGVzT2Zmc2V0LCAwKTsKK30KKworc3RhdGljIGNyZWF0ZVRlc3RhcnJheW9mdGFibGVzVmVjdG9yKGJ1aWxkZXI6ZmxhdGJ1ZmZlcnMuQnVpbGRlciwgZGF0YTpmbGF0YnVmZmVycy5PZmZzZXRbXSk6ZmxhdGJ1ZmZlcnMuT2Zmc2V0IHsKKyAgYnVpbGRlci5zdGFydFZlY3Rvcig0LCBkYXRhLmxlbmd0aCwgNCk7CisgIGZvciAobGV0IGkgPSBkYXRhLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7CisgICAgYnVpbGRlci5hZGRPZmZzZXQoZGF0YVtpXSEpOworICB9CisgIHJldHVybiBidWlsZGVyLmVuZFZlY3RvcigpOworfQorCitzdGF0aWMgc3RhcnRUZXN0YXJyYXlvZnRhYmxlc1ZlY3RvcihidWlsZGVyOmZsYXRidWZmZXJzLkJ1aWxkZXIsIG51bUVsZW1zOm51bWJlcikgeworICBidWlsZGVyLnN0YXJ0VmVjdG9yKDQsIG51bUVsZW1zLCA0KTsKK30KKworc3RhdGljIGFkZEVuZW15KGJ1aWxkZXI6ZmxhdGJ1ZmZlcnMuQnVpbGRlciwgZW5lbXlPZmZzZXQ6ZmxhdGJ1ZmZlcnMuT2Zmc2V0KSB7CisgIGJ1aWxkZXIuYWRkRmllbGRPZmZzZXQoMTIsIGVuZW15T2Zmc2V0LCAwKTsKK30KKworc3RhdGljIGFkZFRlc3RuZXN0ZWRmbGF0YnVmZmVyKGJ1aWxkZXI6ZmxhdGJ1ZmZlcnMuQnVpbGRlciwgdGVzdG5lc3RlZGZsYXRidWZmZXJPZmZzZXQ6ZmxhdGJ1ZmZlcnMuT2Zmc2V0KSB7CisgIGJ1aWxkZXIuYWRkRmllbGRPZmZzZXQoMTMsIHRlc3RuZXN0ZWRmbGF0YnVmZmVyT2Zmc2V0LCAwKTsKK30KKworc3RhdGljIGNyZWF0ZVRlc3RuZXN0ZWRmbGF0YnVmZmVyVmVjdG9yKGJ1aWxkZXI6ZmxhdGJ1ZmZlcnMuQnVpbGRlciwgZGF0YTpudW1iZXJbXXxVaW50OEFycmF5KTpmbGF0YnVmZmVycy5PZmZzZXQgeworICBidWlsZGVyLnN0YXJ0VmVjdG9yKDEsIGRhdGEubGVuZ3RoLCAxKTsKKyAgZm9yIChsZXQgaSA9IGRhdGEubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHsKKyAgICBidWlsZGVyLmFkZEludDgoZGF0YVtpXSEpOworICB9CisgIHJldHVybiBidWlsZGVyLmVuZFZlY3RvcigpOworfQorCitzdGF0aWMgc3RhcnRUZXN0bmVzdGVkZmxhdGJ1ZmZlclZlY3RvcihidWlsZGVyOmZsYXRidWZmZXJzLkJ1aWxkZXIsIG51bUVsZW1zOm51bWJlcikgeworICBidWlsZGVyLnN0YXJ0VmVjdG9yKDEsIG51bUVsZW1zLCAxKTsKK30KKworc3RhdGljIGFkZFRlc3RlbXB0eShidWlsZGVyOmZsYXRidWZmZXJzLkJ1aWxkZXIsIHRlc3RlbXB0eU9mZnNldDpmbGF0YnVmZmVycy5PZmZzZXQpIHsKKyAgYnVpbGRlci5hZGRGaWVsZE9mZnNldCgxNCwgdGVzdGVtcHR5T2Zmc2V0LCAwKTsKK30KKworc3RhdGljIGFkZFRlc3Rib29sKGJ1aWxkZXI6ZmxhdGJ1ZmZlcnMuQnVpbGRlciwgdGVzdGJvb2w6Ym9vbGVhbikgeworICBidWlsZGVyLmFkZEZpZWxkSW50OCgxNSwgK3Rlc3Rib29sLCArZmFsc2UpOworfQorCitzdGF0aWMgYWRkVGVzdGhhc2hzMzJGbnYxKGJ1aWxkZXI6ZmxhdGJ1ZmZlcnMuQnVpbGRlciwgdGVzdGhhc2hzMzJGbnYxOm51bWJlcikgeworICBidWlsZGVyLmFkZEZpZWxkSW50MzIoMTYsIHRlc3RoYXNoczMyRm52MSwgMCk7Cit9CisKK3N0YXRpYyBhZGRUZXN0aGFzaHUzMkZudjEoYnVpbGRlcjpmbGF0YnVmZmVycy5CdWlsZGVyLCB0ZXN0aGFzaHUzMkZudjE6bnVtYmVyKSB7CisgIGJ1aWxkZXIuYWRkRmllbGRJbnQzMigxNywgdGVzdGhhc2h1MzJGbnYxLCAwKTsKK30KKworc3RhdGljIGFkZFRlc3RoYXNoczY0Rm52MShidWlsZGVyOmZsYXRidWZmZXJzLkJ1aWxkZXIsIHRlc3RoYXNoczY0Rm52MTpiaWdpbnQpIHsKKyAgYnVpbGRlci5hZGRGaWVsZEludDY0KDE4LCB0ZXN0aGFzaHM2NEZudjEsIEJpZ0ludCgnMCcpKTsKK30KKworc3RhdGljIGFkZFRlc3RoYXNodTY0Rm52MShidWlsZGVyOmZsYXRidWZmZXJzLkJ1aWxkZXIsIHRlc3RoYXNodTY0Rm52MTpiaWdpbnQpIHsKKyAgYnVpbGRlci5hZGRGaWVsZEludDY0KDE5LCB0ZXN0aGFzaHU2NEZudjEsIEJpZ0ludCgnMCcpKTsKK30KKworc3RhdGljIGFkZFRlc3RoYXNoczMyRm52MWEoYnVpbGRlcjpmbGF0YnVmZmVycy5CdWlsZGVyLCB0ZXN0aGFzaHMzMkZudjFhOm51bWJlcikgeworICBidWlsZGVyLmFkZEZpZWxkSW50MzIoMjAsIHRlc3RoYXNoczMyRm52MWEsIDApOworfQorCitzdGF0aWMgYWRkVGVzdGhhc2h1MzJGbnYxYShidWlsZGVyOmZsYXRidWZmZXJzLkJ1aWxkZXIsIHRlc3RoYXNodTMyRm52MWE6bnVtYmVyKSB7CisgIGJ1aWxkZXIuYWRkRmllbGRJbnQzMigyMSwgdGVzdGhhc2h1MzJGbnYxYSwgMCk7Cit9CisKK3N0YXRpYyBhZGRUZXN0aGFzaHM2NEZudjFhKGJ1aWxkZXI6ZmxhdGJ1ZmZlcnMuQnVpbGRlciwgdGVzdGhhc2hzNjRGbnYxYTpiaWdpbnQpIHsKKyAgYnVpbGRlci5hZGRGaWVsZEludDY0KDIyLCB0ZXN0aGFzaHM2NEZudjFhLCBCaWdJbnQoJzAnKSk7Cit9CisKK3N0YXRpYyBhZGRUZXN0aGFzaHU2NEZudjFhKGJ1aWxkZXI6ZmxhdGJ1ZmZlcnMuQnVpbGRlciwgdGVzdGhhc2h1NjRGbnYxYTpiaWdpbnQpIHsKKyAgYnVpbGRlci5hZGRGaWVsZEludDY0KDIzLCB0ZXN0aGFzaHU2NEZudjFhLCBCaWdJbnQoJzAnKSk7Cit9CisKK3N0YXRpYyBhZGRUZXN0YXJyYXlvZmJvb2xzKGJ1aWxkZXI6ZmxhdGJ1ZmZlcnMuQnVpbGRlciwgdGVzdGFycmF5b2Zib29sc09mZnNldDpmbGF0YnVmZmVycy5PZmZzZXQpIHsKKyAgYnVpbGRlci5hZGRGaWVsZE9mZnNldCgyNCwgdGVzdGFycmF5b2Zib29sc09mZnNldCwgMCk7Cit9CisKK3N0YXRpYyBjcmVhdGVUZXN0YXJyYXlvZmJvb2xzVmVjdG9yKGJ1aWxkZXI6ZmxhdGJ1ZmZlcnMuQnVpbGRlciwgZGF0YTpib29sZWFuW10pOmZsYXRidWZmZXJzLk9mZnNldCB7CisgIGJ1aWxkZXIuc3RhcnRWZWN0b3IoMSwgZGF0YS5sZW5ndGgsIDEpOworICBmb3IgKGxldCBpID0gZGF0YS5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgeworICAgIGJ1aWxkZXIuYWRkSW50OCgrZGF0YVtpXSEpOworICB9CisgIHJldHVybiBidWlsZGVyLmVuZFZlY3RvcigpOworfQorCitzdGF0aWMgc3RhcnRUZXN0YXJyYXlvZmJvb2xzVmVjdG9yKGJ1aWxkZXI6ZmxhdGJ1ZmZlcnMuQnVpbGRlciwgbnVtRWxlbXM6bnVtYmVyKSB7CisgIGJ1aWxkZXIuc3RhcnRWZWN0b3IoMSwgbnVtRWxlbXMsIDEpOworfQorCitzdGF0aWMgYWRkVGVzdGYoYnVpbGRlcjpmbGF0YnVmZmVycy5CdWlsZGVyLCB0ZXN0ZjpudW1iZXIpIHsKKyAgYnVpbGRlci5hZGRGaWVsZEZsb2F0MzIoMjUsIHRlc3RmLCAzLjE0MTU5KTsKK30KKworc3RhdGljIGFkZFRlc3RmMihidWlsZGVyOmZsYXRidWZmZXJzLkJ1aWxkZXIsIHRlc3RmMjpudW1iZXIpIHsKKyAgYnVpbGRlci5hZGRGaWVsZEZsb2F0MzIoMjYsIHRlc3RmMiwgMy4wKTsKK30KKworc3RhdGljIGFkZFRlc3RmMyhidWlsZGVyOmZsYXRidWZmZXJzLkJ1aWxkZXIsIHRlc3RmMzpudW1iZXIpIHsKKyAgYnVpbGRlci5hZGRGaWVsZEZsb2F0MzIoMjcsIHRlc3RmMywgMC4wKTsKK30KKworc3RhdGljIGFkZFRlc3RhcnJheW9mc3RyaW5nMihidWlsZGVyOmZsYXRidWZmZXJzLkJ1aWxkZXIsIHRlc3RhcnJheW9mc3RyaW5nMk9mZnNldDpmbGF0YnVmZmVycy5PZmZzZXQpIHsKKyAgYnVpbGRlci5hZGRGaWVsZE9mZnNldCgyOCwgdGVzdGFycmF5b2ZzdHJpbmcyT2Zmc2V0LCAwKTsKK30KKworc3RhdGljIGNyZWF0ZVRlc3RhcnJheW9mc3RyaW5nMlZlY3RvcihidWlsZGVyOmZsYXRidWZmZXJzLkJ1aWxkZXIsIGRhdGE6ZmxhdGJ1ZmZlcnMuT2Zmc2V0W10pOmZsYXRidWZmZXJzLk9mZnNldCB7CisgIGJ1aWxkZXIuc3RhcnRWZWN0b3IoNCwgZGF0YS5sZW5ndGgsIDQpOworICBmb3IgKGxldCBpID0gZGF0YS5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgeworICAgIGJ1aWxkZXIuYWRkT2Zmc2V0KGRhdGFbaV0hKTsKKyAgfQorICByZXR1cm4gYnVpbGRlci5lbmRWZWN0b3IoKTsKK30KKworc3RhdGljIHN0YXJ0VGVzdGFycmF5b2ZzdHJpbmcyVmVjdG9yKGJ1aWxkZXI6ZmxhdGJ1ZmZlcnMuQnVpbGRlciwgbnVtRWxlbXM6bnVtYmVyKSB7CisgIGJ1aWxkZXIuc3RhcnRWZWN0b3IoNCwgbnVtRWxlbXMsIDQpOworfQorCitzdGF0aWMgYWRkVGVzdGFycmF5b2Zzb3J0ZWRzdHJ1Y3QoYnVpbGRlcjpmbGF0YnVmZmVycy5CdWlsZGVyLCB0ZXN0YXJyYXlvZnNvcnRlZHN0cnVjdE9mZnNldDpmbGF0YnVmZmVycy5PZmZzZXQpIHsKKyAgYnVpbGRlci5hZGRGaWVsZE9mZnNldCgyOSwgdGVzdGFycmF5b2Zzb3J0ZWRzdHJ1Y3RPZmZzZXQsIDApOworfQorCitzdGF0aWMgc3RhcnRUZXN0YXJyYXlvZnNvcnRlZHN0cnVjdFZlY3RvcihidWlsZGVyOmZsYXRidWZmZXJzLkJ1aWxkZXIsIG51bUVsZW1zOm51bWJlcikgeworICBidWlsZGVyLnN0YXJ0VmVjdG9yKDgsIG51bUVsZW1zLCA0KTsKK30KKworc3RhdGljIGFkZEZsZXgoYnVpbGRlcjpmbGF0YnVmZmVycy5CdWlsZGVyLCBmbGV4T2Zmc2V0OmZsYXRidWZmZXJzLk9mZnNldCkgeworICBidWlsZGVyLmFkZEZpZWxkT2Zmc2V0KDMwLCBmbGV4T2Zmc2V0LCAwKTsKK30KKworc3RhdGljIGNyZWF0ZUZsZXhWZWN0b3IoYnVpbGRlcjpmbGF0YnVmZmVycy5CdWlsZGVyLCBkYXRhOm51bWJlcltdfFVpbnQ4QXJyYXkpOmZsYXRidWZmZXJzLk9mZnNldCB7CisgIGJ1aWxkZXIuc3RhcnRWZWN0b3IoMSwgZGF0YS5sZW5ndGgsIDEpOworICBmb3IgKGxldCBpID0gZGF0YS5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgeworICAgIGJ1aWxkZXIuYWRkSW50OChkYXRhW2ldISk7CisgIH0KKyAgcmV0dXJuIGJ1aWxkZXIuZW5kVmVjdG9yKCk7Cit9CisKK3N0YXRpYyBzdGFydEZsZXhWZWN0b3IoYnVpbGRlcjpmbGF0YnVmZmVycy5CdWlsZGVyLCBudW1FbGVtczpudW1iZXIpIHsKKyAgYnVpbGRlci5zdGFydFZlY3RvcigxLCBudW1FbGVtcywgMSk7Cit9CisKK3N0YXRpYyBhZGRUZXN0NShidWlsZGVyOmZsYXRidWZmZXJzLkJ1aWxkZXIsIHRlc3Q1T2Zmc2V0OmZsYXRidWZmZXJzLk9mZnNldCkgeworICBidWlsZGVyLmFkZEZpZWxkT2Zmc2V0KDMxLCB0ZXN0NU9mZnNldCwgMCk7Cit9CisKK3N0YXRpYyBzdGFydFRlc3Q1VmVjdG9yKGJ1aWxkZXI6ZmxhdGJ1ZmZlcnMuQnVpbGRlciwgbnVtRWxlbXM6bnVtYmVyKSB7CisgIGJ1aWxkZXIuc3RhcnRWZWN0b3IoNCwgbnVtRWxlbXMsIDIpOworfQorCitzdGF0aWMgYWRkVmVjdG9yT2ZMb25ncyhidWlsZGVyOmZsYXRidWZmZXJzLkJ1aWxkZXIsIHZlY3Rvck9mTG9uZ3NPZmZzZXQ6ZmxhdGJ1ZmZlcnMuT2Zmc2V0KSB7CisgIGJ1aWxkZXIuYWRkRmllbGRPZmZzZXQoMzIsIHZlY3Rvck9mTG9uZ3NPZmZzZXQsIDApOworfQorCitzdGF0aWMgY3JlYXRlVmVjdG9yT2ZMb25nc1ZlY3RvcihidWlsZGVyOmZsYXRidWZmZXJzLkJ1aWxkZXIsIGRhdGE6YmlnaW50W10pOmZsYXRidWZmZXJzLk9mZnNldCB7CisgIGJ1aWxkZXIuc3RhcnRWZWN0b3IoOCwgZGF0YS5sZW5ndGgsIDgpOworICBmb3IgKGxldCBpID0gZGF0YS5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgeworICAgIGJ1aWxkZXIuYWRkSW50NjQoZGF0YVtpXSEpOworICB9CisgIHJldHVybiBidWlsZGVyLmVuZFZlY3RvcigpOworfQorCitzdGF0aWMgc3RhcnRWZWN0b3JPZkxvbmdzVmVjdG9yKGJ1aWxkZXI6ZmxhdGJ1ZmZlcnMuQnVpbGRlciwgbnVtRWxlbXM6bnVtYmVyKSB7CisgIGJ1aWxkZXIuc3RhcnRWZWN0b3IoOCwgbnVtRWxlbXMsIDgpOworfQorCitzdGF0aWMgYWRkVmVjdG9yT2ZEb3VibGVzKGJ1aWxkZXI6ZmxhdGJ1ZmZlcnMuQnVpbGRlciwgdmVjdG9yT2ZEb3VibGVzT2Zmc2V0OmZsYXRidWZmZXJzLk9mZnNldCkgeworICBidWlsZGVyLmFkZEZpZWxkT2Zmc2V0KDMzLCB2ZWN0b3JPZkRvdWJsZXNPZmZzZXQsIDApOworfQorCitzdGF0aWMgY3JlYXRlVmVjdG9yT2ZEb3VibGVzVmVjdG9yKGJ1aWxkZXI6ZmxhdGJ1ZmZlcnMuQnVpbGRlciwgZGF0YTpudW1iZXJbXXxGbG9hdDY0QXJyYXkpOmZsYXRidWZmZXJzLk9mZnNldDsKKy8qKgorICogQGRlcHJlY2F0ZWQgVGhpcyBVaW50OEFycmF5IG92ZXJsb2FkIHdpbGwgYmUgcmVtb3ZlZCBpbiB0aGUgZnV0dXJlLgorICovCitzdGF0aWMgY3JlYXRlVmVjdG9yT2ZEb3VibGVzVmVjdG9yKGJ1aWxkZXI6ZmxhdGJ1ZmZlcnMuQnVpbGRlciwgZGF0YTpudW1iZXJbXXxVaW50OEFycmF5KTpmbGF0YnVmZmVycy5PZmZzZXQ7CitzdGF0aWMgY3JlYXRlVmVjdG9yT2ZEb3VibGVzVmVjdG9yKGJ1aWxkZXI6ZmxhdGJ1ZmZlcnMuQnVpbGRlciwgZGF0YTpudW1iZXJbXXxGbG9hdDY0QXJyYXl8VWludDhBcnJheSk6ZmxhdGJ1ZmZlcnMuT2Zmc2V0IHsKKyAgYnVpbGRlci5zdGFydFZlY3Rvcig4LCBkYXRhLmxlbmd0aCwgOCk7CisgIGZvciAobGV0IGkgPSBkYXRhLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7CisgICAgYnVpbGRlci5hZGRGbG9hdDY0KGRhdGFbaV0hKTsKKyAgfQorICByZXR1cm4gYnVpbGRlci5lbmRWZWN0b3IoKTsKK30KKworc3RhdGljIHN0YXJ0VmVjdG9yT2ZEb3VibGVzVmVjdG9yKGJ1aWxkZXI6ZmxhdGJ1ZmZlcnMuQnVpbGRlciwgbnVtRWxlbXM6bnVtYmVyKSB7CisgIGJ1aWxkZXIuc3RhcnRWZWN0b3IoOCwgbnVtRWxlbXMsIDgpOworfQorCitzdGF0aWMgYWRkUGFyZW50TmFtZXNwYWNlVGVzdChidWlsZGVyOmZsYXRidWZmZXJzLkJ1aWxkZXIsIHBhcmVudE5hbWVzcGFjZVRlc3RPZmZzZXQ6ZmxhdGJ1ZmZlcnMuT2Zmc2V0KSB7CisgIGJ1aWxkZXIuYWRkRmllbGRPZmZzZXQoMzQsIHBhcmVudE5hbWVzcGFjZVRlc3RPZmZzZXQsIDApOworfQorCitzdGF0aWMgYWRkVmVjdG9yT2ZSZWZlcnJhYmxlcyhidWlsZGVyOmZsYXRidWZmZXJzLkJ1aWxkZXIsIHZlY3Rvck9mUmVmZXJyYWJsZXNPZmZzZXQ6ZmxhdGJ1ZmZlcnMuT2Zmc2V0KSB7CisgIGJ1aWxkZXIuYWRkRmllbGRPZmZzZXQoMzUsIHZlY3Rvck9mUmVmZXJyYWJsZXNPZmZzZXQsIDApOworfQorCitzdGF0aWMgY3JlYXRlVmVjdG9yT2ZSZWZlcnJhYmxlc1ZlY3RvcihidWlsZGVyOmZsYXRidWZmZXJzLkJ1aWxkZXIsIGRhdGE6ZmxhdGJ1ZmZlcnMuT2Zmc2V0W10pOmZsYXRidWZmZXJzLk9mZnNldCB7CisgIGJ1aWxkZXIuc3RhcnRWZWN0b3IoNCwgZGF0YS5sZW5ndGgsIDQpOworICBmb3IgKGxldCBpID0gZGF0YS5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgeworICAgIGJ1aWxkZXIuYWRkT2Zmc2V0KGRhdGFbaV0hKTsKKyAgfQorICByZXR1cm4gYnVpbGRlci5lbmRWZWN0b3IoKTsKK30KKworc3RhdGljIHN0YXJ0VmVjdG9yT2ZSZWZlcnJhYmxlc1ZlY3RvcihidWlsZGVyOmZsYXRidWZmZXJzLkJ1aWxkZXIsIG51bUVsZW1zOm51bWJlcikgeworICBidWlsZGVyLnN0YXJ0VmVjdG9yKDQsIG51bUVsZW1zLCA0KTsKK30KKworc3RhdGljIGFkZFNpbmdsZVdlYWtSZWZlcmVuY2UoYnVpbGRlcjpmbGF0YnVmZmVycy5CdWlsZGVyLCBzaW5nbGVXZWFrUmVmZXJlbmNlOmJpZ2ludCkgeworICBidWlsZGVyLmFkZEZpZWxkSW50NjQoMzYsIHNpbmdsZVdlYWtSZWZlcmVuY2UsIEJpZ0ludCgnMCcpKTsKK30KKworc3RhdGljIGFkZFZlY3Rvck9mV2Vha1JlZmVyZW5jZXMoYnVpbGRlcjpmbGF0YnVmZmVycy5CdWlsZGVyLCB2ZWN0b3JPZldlYWtSZWZlcmVuY2VzT2Zmc2V0OmZsYXRidWZmZXJzLk9mZnNldCkgeworICBidWlsZGVyLmFkZEZpZWxkT2Zmc2V0KDM3LCB2ZWN0b3JPZldlYWtSZWZlcmVuY2VzT2Zmc2V0LCAwKTsKK30KKworc3RhdGljIGNyZWF0ZVZlY3Rvck9mV2Vha1JlZmVyZW5jZXNWZWN0b3IoYnVpbGRlcjpmbGF0YnVmZmVycy5CdWlsZGVyLCBkYXRhOmJpZ2ludFtdKTpmbGF0YnVmZmVycy5PZmZzZXQgeworICBidWlsZGVyLnN0YXJ0VmVjdG9yKDgsIGRhdGEubGVuZ3RoLCA4KTsKKyAgZm9yIChsZXQgaSA9IGRhdGEubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHsKKyAgICBidWlsZGVyLmFkZEludDY0KGRhdGFbaV0hKTsKKyAgfQorICByZXR1cm4gYnVpbGRlci5lbmRWZWN0b3IoKTsKK30KKworc3RhdGljIHN0YXJ0VmVjdG9yT2ZXZWFrUmVmZXJlbmNlc1ZlY3RvcihidWlsZGVyOmZsYXRidWZmZXJzLkJ1aWxkZXIsIG51bUVsZW1zOm51bWJlcikgeworICBidWlsZGVyLnN0YXJ0VmVjdG9yKDgsIG51bUVsZW1zLCA4KTsKK30KKworc3RhdGljIGFkZFZlY3Rvck9mU3Ryb25nUmVmZXJyYWJsZXMoYnVpbGRlcjpmbGF0YnVmZmVycy5CdWlsZGVyLCB2ZWN0b3JPZlN0cm9uZ1JlZmVycmFibGVzT2Zmc2V0OmZsYXRidWZmZXJzLk9mZnNldCkgeworICBidWlsZGVyLmFkZEZpZWxkT2Zmc2V0KDM4LCB2ZWN0b3JPZlN0cm9uZ1JlZmVycmFibGVzT2Zmc2V0LCAwKTsKK30KKworc3RhdGljIGNyZWF0ZVZlY3Rvck9mU3Ryb25nUmVmZXJyYWJsZXNWZWN0b3IoYnVpbGRlcjpmbGF0YnVmZmVycy5CdWlsZGVyLCBkYXRhOmZsYXRidWZmZXJzLk9mZnNldFtdKTpmbGF0YnVmZmVycy5PZmZzZXQgeworICBidWlsZGVyLnN0YXJ0VmVjdG9yKDQsIGRhdGEubGVuZ3RoLCA0KTsKKyAgZm9yIChsZXQgaSA9IGRhdGEubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHsKKyAgICBidWlsZGVyLmFkZE9mZnNldChkYXRhW2ldISk7CisgIH0KKyAgcmV0dXJuIGJ1aWxkZXIuZW5kVmVjdG9yKCk7Cit9CisKK3N0YXRpYyBzdGFydFZlY3Rvck9mU3Ryb25nUmVmZXJyYWJsZXNWZWN0b3IoYnVpbGRlcjpmbGF0YnVmZmVycy5CdWlsZGVyLCBudW1FbGVtczpudW1iZXIpIHsKKyAgYnVpbGRlci5zdGFydFZlY3Rvcig0LCBudW1FbGVtcywgNCk7Cit9CisKK3N0YXRpYyBhZGRDb093bmluZ1JlZmVyZW5jZShidWlsZGVyOmZsYXRidWZmZXJzLkJ1aWxkZXIsIGNvT3duaW5nUmVmZXJlbmNlOmJpZ2ludCkgeworICBidWlsZGVyLmFkZEZpZWxkSW50NjQoMzksIGNvT3duaW5nUmVmZXJlbmNlLCBCaWdJbnQoJzAnKSk7Cit9CisKK3N0YXRpYyBhZGRWZWN0b3JPZkNvT3duaW5nUmVmZXJlbmNlcyhidWlsZGVyOmZsYXRidWZmZXJzLkJ1aWxkZXIsIHZlY3Rvck9mQ29Pd25pbmdSZWZlcmVuY2VzT2Zmc2V0OmZsYXRidWZmZXJzLk9mZnNldCkgeworICBidWlsZGVyLmFkZEZpZWxkT2Zmc2V0KDQwLCB2ZWN0b3JPZkNvT3duaW5nUmVmZXJlbmNlc09mZnNldCwgMCk7Cit9CisKK3N0YXRpYyBjcmVhdGVWZWN0b3JPZkNvT3duaW5nUmVmZXJlbmNlc1ZlY3RvcihidWlsZGVyOmZsYXRidWZmZXJzLkJ1aWxkZXIsIGRhdGE6YmlnaW50W10pOmZsYXRidWZmZXJzLk9mZnNldCB7CisgIGJ1aWxkZXIuc3RhcnRWZWN0b3IoOCwgZGF0YS5sZW5ndGgsIDgpOworICBmb3IgKGxldCBpID0gZGF0YS5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgeworICAgIGJ1aWxkZXIuYWRkSW50NjQoZGF0YVtpXSEpOworICB9CisgIHJldHVybiBidWlsZGVyLmVuZFZlY3RvcigpOworfQorCitzdGF0aWMgc3RhcnRWZWN0b3JPZkNvT3duaW5nUmVmZXJlbmNlc1ZlY3RvcihidWlsZGVyOmZsYXRidWZmZXJzLkJ1aWxkZXIsIG51bUVsZW1zOm51bWJlcikgeworICBidWlsZGVyLnN0YXJ0VmVjdG9yKDgsIG51bUVsZW1zLCA4KTsKK30KKworc3RhdGljIGFkZE5vbk93bmluZ1JlZmVyZW5jZShidWlsZGVyOmZsYXRidWZmZXJzLkJ1aWxkZXIsIG5vbk93bmluZ1JlZmVyZW5jZTpiaWdpbnQpIHsKKyAgYnVpbGRlci5hZGRGaWVsZEludDY0KDQxLCBub25Pd25pbmdSZWZlcmVuY2UsIEJpZ0ludCgnMCcpKTsKK30KKworc3RhdGljIGFkZFZlY3Rvck9mTm9uT3duaW5nUmVmZXJlbmNlcyhidWlsZGVyOmZsYXRidWZmZXJzLkJ1aWxkZXIsIHZlY3Rvck9mTm9uT3duaW5nUmVmZXJlbmNlc09mZnNldDpmbGF0YnVmZmVycy5PZmZzZXQpIHsKKyAgYnVpbGRlci5hZGRGaWVsZE9mZnNldCg0MiwgdmVjdG9yT2ZOb25Pd25pbmdSZWZlcmVuY2VzT2Zmc2V0LCAwKTsKK30KKworc3RhdGljIGNyZWF0ZVZlY3Rvck9mTm9uT3duaW5nUmVmZXJlbmNlc1ZlY3RvcihidWlsZGVyOmZsYXRidWZmZXJzLkJ1aWxkZXIsIGRhdGE6YmlnaW50W10pOmZsYXRidWZmZXJzLk9mZnNldCB7CisgIGJ1aWxkZXIuc3RhcnRWZWN0b3IoOCwgZGF0YS5sZW5ndGgsIDgpOworICBmb3IgKGxldCBpID0gZGF0YS5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgeworICAgIGJ1aWxkZXIuYWRkSW50NjQoZGF0YVtpXSEpOworICB9CisgIHJldHVybiBidWlsZGVyLmVuZFZlY3RvcigpOworfQorCitzdGF0aWMgc3RhcnRWZWN0b3JPZk5vbk93bmluZ1JlZmVyZW5jZXNWZWN0b3IoYnVpbGRlcjpmbGF0YnVmZmVycy5CdWlsZGVyLCBudW1FbGVtczpudW1iZXIpIHsKKyAgYnVpbGRlci5zdGFydFZlY3Rvcig4LCBudW1FbGVtcywgOCk7Cit9CisKK3N0YXRpYyBhZGRBbnlVbmlxdWVUeXBlKGJ1aWxkZXI6ZmxhdGJ1ZmZlcnMuQnVpbGRlciwgYW55VW5pcXVlVHlwZTpBbnlVbmlxdWVBbGlhc2VzKSB7CisgIGJ1aWxkZXIuYWRkRmllbGRJbnQ4KDQzLCBhbnlVbmlxdWVUeXBlLCBBbnlVbmlxdWVBbGlhc2VzLk5PTkUpOworfQorCitzdGF0aWMgYWRkQW55VW5pcXVlKGJ1aWxkZXI6ZmxhdGJ1ZmZlcnMuQnVpbGRlciwgYW55VW5pcXVlT2Zmc2V0OmZsYXRidWZmZXJzLk9mZnNldCkgeworICBidWlsZGVyLmFkZEZpZWxkT2Zmc2V0KDQ0LCBhbnlVbmlxdWVPZmZzZXQsIDApOworfQorCitzdGF0aWMgYWRkQW55QW1iaWd1b3VzVHlwZShidWlsZGVyOmZsYXRidWZmZXJzLkJ1aWxkZXIsIGFueUFtYmlndW91c1R5cGU6QW55QW1iaWd1b3VzQWxpYXNlcykgeworICBidWlsZGVyLmFkZEZpZWxkSW50OCg0NSwgYW55QW1iaWd1b3VzVHlwZSwgQW55QW1iaWd1b3VzQWxpYXNlcy5OT05FKTsKK30KKworc3RhdGljIGFkZEFueUFtYmlndW91cyhidWlsZGVyOmZsYXRidWZmZXJzLkJ1aWxkZXIsIGFueUFtYmlndW91c09mZnNldDpmbGF0YnVmZmVycy5PZmZzZXQpIHsKKyAgYnVpbGRlci5hZGRGaWVsZE9mZnNldCg0NiwgYW55QW1iaWd1b3VzT2Zmc2V0LCAwKTsKK30KKworc3RhdGljIGFkZFZlY3Rvck9mRW51bXMoYnVpbGRlcjpmbGF0YnVmZmVycy5CdWlsZGVyLCB2ZWN0b3JPZkVudW1zT2Zmc2V0OmZsYXRidWZmZXJzLk9mZnNldCkgeworICBidWlsZGVyLmFkZEZpZWxkT2Zmc2V0KDQ3LCB2ZWN0b3JPZkVudW1zT2Zmc2V0LCAwKTsKK30KKworc3RhdGljIGNyZWF0ZVZlY3Rvck9mRW51bXNWZWN0b3IoYnVpbGRlcjpmbGF0YnVmZmVycy5CdWlsZGVyLCBkYXRhOkNvbG9yW10pOmZsYXRidWZmZXJzLk9mZnNldCB7CisgIGJ1aWxkZXIuc3RhcnRWZWN0b3IoMSwgZGF0YS5sZW5ndGgsIDEpOworICBmb3IgKGxldCBpID0gZGF0YS5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgeworICAgIGJ1aWxkZXIuYWRkSW50OChkYXRhW2ldISk7CisgIH0KKyAgcmV0dXJuIGJ1aWxkZXIuZW5kVmVjdG9yKCk7Cit9CisKK3N0YXRpYyBzdGFydFZlY3Rvck9mRW51bXNWZWN0b3IoYnVpbGRlcjpmbGF0YnVmZmVycy5CdWlsZGVyLCBudW1FbGVtczpudW1iZXIpIHsKKyAgYnVpbGRlci5zdGFydFZlY3RvcigxLCBudW1FbGVtcywgMSk7Cit9CisKK3N0YXRpYyBhZGRTaWduZWRFbnVtKGJ1aWxkZXI6ZmxhdGJ1ZmZlcnMuQnVpbGRlciwgc2lnbmVkRW51bTpSYWNlKSB7CisgIGJ1aWxkZXIuYWRkRmllbGRJbnQ4KDQ4LCBzaWduZWRFbnVtLCBSYWNlLk5vbmUpOworfQorCitzdGF0aWMgYWRkVGVzdHJlcXVpcmVkbmVzdGVkZmxhdGJ1ZmZlcihidWlsZGVyOmZsYXRidWZmZXJzLkJ1aWxkZXIsIHRlc3RyZXF1aXJlZG5lc3RlZGZsYXRidWZmZXJPZmZzZXQ6ZmxhdGJ1ZmZlcnMuT2Zmc2V0KSB7CisgIGJ1aWxkZXIuYWRkRmllbGRPZmZzZXQoNDksIHRlc3RyZXF1aXJlZG5lc3RlZGZsYXRidWZmZXJPZmZzZXQsIDApOworfQorCitzdGF0aWMgY3JlYXRlVGVzdHJlcXVpcmVkbmVzdGVkZmxhdGJ1ZmZlclZlY3RvcihidWlsZGVyOmZsYXRidWZmZXJzLkJ1aWxkZXIsIGRhdGE6bnVtYmVyW118VWludDhBcnJheSk6ZmxhdGJ1ZmZlcnMuT2Zmc2V0IHsKKyAgYnVpbGRlci5zdGFydFZlY3RvcigxLCBkYXRhLmxlbmd0aCwgMSk7CisgIGZvciAobGV0IGkgPSBkYXRhLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7CisgICAgYnVpbGRlci5hZGRJbnQ4KGRhdGFbaV0hKTsKKyAgfQorICByZXR1cm4gYnVpbGRlci5lbmRWZWN0b3IoKTsKK30KKworc3RhdGljIHN0YXJ0VGVzdHJlcXVpcmVkbmVzdGVkZmxhdGJ1ZmZlclZlY3RvcihidWlsZGVyOmZsYXRidWZmZXJzLkJ1aWxkZXIsIG51bUVsZW1zOm51bWJlcikgeworICBidWlsZGVyLnN0YXJ0VmVjdG9yKDEsIG51bUVsZW1zLCAxKTsKK30KKworc3RhdGljIGFkZFNjYWxhcktleVNvcnRlZFRhYmxlcyhidWlsZGVyOmZsYXRidWZmZXJzLkJ1aWxkZXIsIHNjYWxhcktleVNvcnRlZFRhYmxlc09mZnNldDpmbGF0YnVmZmVycy5PZmZzZXQpIHsKKyAgYnVpbGRlci5hZGRGaWVsZE9mZnNldCg1MCwgc2NhbGFyS2V5U29ydGVkVGFibGVzT2Zmc2V0LCAwKTsKK30KKworc3RhdGljIGNyZWF0ZVNjYWxhcktleVNvcnRlZFRhYmxlc1ZlY3RvcihidWlsZGVyOmZsYXRidWZmZXJzLkJ1aWxkZXIsIGRhdGE6ZmxhdGJ1ZmZlcnMuT2Zmc2V0W10pOmZsYXRidWZmZXJzLk9mZnNldCB7CisgIGJ1aWxkZXIuc3RhcnRWZWN0b3IoNCwgZGF0YS5sZW5ndGgsIDQpOworICBmb3IgKGxldCBpID0gZGF0YS5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgeworICAgIGJ1aWxkZXIuYWRkT2Zmc2V0KGRhdGFbaV0hKTsKKyAgfQorICByZXR1cm4gYnVpbGRlci5lbmRWZWN0b3IoKTsKK30KKworc3RhdGljIHN0YXJ0U2NhbGFyS2V5U29ydGVkVGFibGVzVmVjdG9yKGJ1aWxkZXI6ZmxhdGJ1ZmZlcnMuQnVpbGRlciwgbnVtRWxlbXM6bnVtYmVyKSB7CisgIGJ1aWxkZXIuc3RhcnRWZWN0b3IoNCwgbnVtRWxlbXMsIDQpOworfQorCitzdGF0aWMgYWRkTmF0aXZlSW5saW5lKGJ1aWxkZXI6ZmxhdGJ1ZmZlcnMuQnVpbGRlciwgbmF0aXZlSW5saW5lT2Zmc2V0OmZsYXRidWZmZXJzLk9mZnNldCkgeworICBidWlsZGVyLmFkZEZpZWxkU3RydWN0KDUxLCBuYXRpdmVJbmxpbmVPZmZzZXQsIDApOworfQorCitzdGF0aWMgYWRkTG9uZ0VudW1Ob25FbnVtRGVmYXVsdChidWlsZGVyOmZsYXRidWZmZXJzLkJ1aWxkZXIsIGxvbmdFbnVtTm9uRW51bURlZmF1bHQ6YmlnaW50KSB7CisgIGJ1aWxkZXIuYWRkRmllbGRJbnQ2NCg1MiwgbG9uZ0VudW1Ob25FbnVtRGVmYXVsdCwgQmlnSW50KCcwJykpOworfQorCitzdGF0aWMgYWRkTG9uZ0VudW1Ob3JtYWxEZWZhdWx0KGJ1aWxkZXI6ZmxhdGJ1ZmZlcnMuQnVpbGRlciwgbG9uZ0VudW1Ob3JtYWxEZWZhdWx0OmJpZ2ludCkgeworICBidWlsZGVyLmFkZEZpZWxkSW50NjQoNTMsIGxvbmdFbnVtTm9ybWFsRGVmYXVsdCwgQmlnSW50KCcyJykpOworfQorCitzdGF0aWMgZW5kTW9uc3RlcihidWlsZGVyOmZsYXRidWZmZXJzLkJ1aWxkZXIpOmZsYXRidWZmZXJzLk9mZnNldCB7CisgIGNvbnN0IG9mZnNldCA9IGJ1aWxkZXIuZW5kT2JqZWN0KCk7CisgIGJ1aWxkZXIucmVxdWlyZWRGaWVsZChvZmZzZXQsIDEwKSAvLyBuYW1lCisgIHJldHVybiBvZmZzZXQ7Cit9CisKK3N0YXRpYyBmaW5pc2hNb25zdGVyQnVmZmVyKGJ1aWxkZXI6ZmxhdGJ1ZmZlcnMuQnVpbGRlciwgb2Zmc2V0OmZsYXRidWZmZXJzLk9mZnNldCkgeworICBidWlsZGVyLmZpbmlzaChvZmZzZXQsICdNT05TJyk7Cit9CisKK3N0YXRpYyBmaW5pc2hTaXplUHJlZml4ZWRNb25zdGVyQnVmZmVyKGJ1aWxkZXI6ZmxhdGJ1ZmZlcnMuQnVpbGRlciwgb2Zmc2V0OmZsYXRidWZmZXJzLk9mZnNldCkgeworICBidWlsZGVyLmZpbmlzaChvZmZzZXQsICdNT05TJywgdHJ1ZSk7Cit9CisKKworc2VyaWFsaXplKCk6VWludDhBcnJheSB7CisgIHJldHVybiB0aGlzLmJiIS5ieXRlcygpOworfQorCitzdGF0aWMgZGVzZXJpYWxpemUoYnVmZmVyOiBVaW50OEFycmF5KTpNb25zdGVyIHsKKyAgcmV0dXJuIE1vbnN0ZXIuZ2V0Um9vdEFzTW9uc3RlcihuZXcgZmxhdGJ1ZmZlcnMuQnl0ZUJ1ZmZlcihidWZmZXIpKQorfQorCit1bnBhY2soKTogTW9uc3RlclQgeworICByZXR1cm4gbmV3IE1vbnN0ZXJUKAorICAgICh0aGlzLnBvcygpICE9PSBudWxsID8gdGhpcy5wb3MoKSEudW5wYWNrKCkgOiBudWxsKSwKKyAgICB0aGlzLm1hbmEoKSwKKyAgICB0aGlzLmhwKCksCisgICAgdGhpcy5uYW1lKCksCisgICAgdGhpcy5iYiEuY3JlYXRlU2NhbGFyTGlzdCh0aGlzLmludmVudG9yeS5iaW5kKHRoaXMpLCB0aGlzLmludmVudG9yeUxlbmd0aCgpKSwKKyAgICB0aGlzLmNvbG9yKCksCisgICAgdGhpcy50ZXN0VHlwZSgpLAorICAgICgoKSA9PiB7CisgICAgICBsZXQgdGVtcCA9IHVuaW9uVG9BbnkodGhpcy50ZXN0VHlwZSgpLCB0aGlzLnRlc3QuYmluZCh0aGlzKSk7CisgICAgICBpZih0ZW1wID09PSBudWxsKSB7IHJldHVybiBudWxsOyB9CisgICAgICByZXR1cm4gdGVtcC51bnBhY2soKQorICB9KSgpLAorICAgIHRoaXMuYmIhLmNyZWF0ZU9iakxpc3QodGhpcy50ZXN0NC5iaW5kKHRoaXMpLCB0aGlzLnRlc3Q0TGVuZ3RoKCkpLAorICAgIHRoaXMuYmIhLmNyZWF0ZVNjYWxhckxpc3QodGhpcy50ZXN0YXJyYXlvZnN0cmluZy5iaW5kKHRoaXMpLCB0aGlzLnRlc3RhcnJheW9mc3RyaW5nTGVuZ3RoKCkpLAorICAgIHRoaXMuYmIhLmNyZWF0ZU9iakxpc3QodGhpcy50ZXN0YXJyYXlvZnRhYmxlcy5iaW5kKHRoaXMpLCB0aGlzLnRlc3RhcnJheW9mdGFibGVzTGVuZ3RoKCkpLAorICAgICh0aGlzLmVuZW15KCkgIT09IG51bGwgPyB0aGlzLmVuZW15KCkhLnVucGFjaygpIDogbnVsbCksCisgICAgdGhpcy5iYiEuY3JlYXRlU2NhbGFyTGlzdCh0aGlzLnRlc3RuZXN0ZWRmbGF0YnVmZmVyLmJpbmQodGhpcyksIHRoaXMudGVzdG5lc3RlZGZsYXRidWZmZXJMZW5ndGgoKSksCisgICAgKHRoaXMudGVzdGVtcHR5KCkgIT09IG51bGwgPyB0aGlzLnRlc3RlbXB0eSgpIS51bnBhY2soKSA6IG51bGwpLAorICAgIHRoaXMudGVzdGJvb2woKSwKKyAgICB0aGlzLnRlc3RoYXNoczMyRm52MSgpLAorICAgIHRoaXMudGVzdGhhc2h1MzJGbnYxKCksCisgICAgdGhpcy50ZXN0aGFzaHM2NEZudjEoKSwKKyAgICB0aGlzLnRlc3RoYXNodTY0Rm52MSgpLAorICAgIHRoaXMudGVzdGhhc2hzMzJGbnYxYSgpLAorICAgIHRoaXMudGVzdGhhc2h1MzJGbnYxYSgpLAorICAgIHRoaXMudGVzdGhhc2hzNjRGbnYxYSgpLAorICAgIHRoaXMudGVzdGhhc2h1NjRGbnYxYSgpLAorICAgIHRoaXMuYmIhLmNyZWF0ZVNjYWxhckxpc3QodGhpcy50ZXN0YXJyYXlvZmJvb2xzLmJpbmQodGhpcyksIHRoaXMudGVzdGFycmF5b2Zib29sc0xlbmd0aCgpKSwKKyAgICB0aGlzLnRlc3RmKCksCisgICAgdGhpcy50ZXN0ZjIoKSwKKyAgICB0aGlzLnRlc3RmMygpLAorICAgIHRoaXMuYmIhLmNyZWF0ZVNjYWxhckxpc3QodGhpcy50ZXN0YXJyYXlvZnN0cmluZzIuYmluZCh0aGlzKSwgdGhpcy50ZXN0YXJyYXlvZnN0cmluZzJMZW5ndGgoKSksCisgICAgdGhpcy5iYiEuY3JlYXRlT2JqTGlzdCh0aGlzLnRlc3RhcnJheW9mc29ydGVkc3RydWN0LmJpbmQodGhpcyksIHRoaXMudGVzdGFycmF5b2Zzb3J0ZWRzdHJ1Y3RMZW5ndGgoKSksCisgICAgdGhpcy5iYiEuY3JlYXRlU2NhbGFyTGlzdCh0aGlzLmZsZXguYmluZCh0aGlzKSwgdGhpcy5mbGV4TGVuZ3RoKCkpLAorICAgIHRoaXMuYmIhLmNyZWF0ZU9iakxpc3QodGhpcy50ZXN0NS5iaW5kKHRoaXMpLCB0aGlzLnRlc3Q1TGVuZ3RoKCkpLAorICAgIHRoaXMuYmIhLmNyZWF0ZVNjYWxhckxpc3QodGhpcy52ZWN0b3JPZkxvbmdzLmJpbmQodGhpcyksIHRoaXMudmVjdG9yT2ZMb25nc0xlbmd0aCgpKSwKKyAgICB0aGlzLmJiIS5jcmVhdGVTY2FsYXJMaXN0KHRoaXMudmVjdG9yT2ZEb3VibGVzLmJpbmQodGhpcyksIHRoaXMudmVjdG9yT2ZEb3VibGVzTGVuZ3RoKCkpLAorICAgICh0aGlzLnBhcmVudE5hbWVzcGFjZVRlc3QoKSAhPT0gbnVsbCA/IHRoaXMucGFyZW50TmFtZXNwYWNlVGVzdCgpIS51bnBhY2soKSA6IG51bGwpLAorICAgIHRoaXMuYmIhLmNyZWF0ZU9iakxpc3QodGhpcy52ZWN0b3JPZlJlZmVycmFibGVzLmJpbmQodGhpcyksIHRoaXMudmVjdG9yT2ZSZWZlcnJhYmxlc0xlbmd0aCgpKSwKKyAgICB0aGlzLnNpbmdsZVdlYWtSZWZlcmVuY2UoKSwKKyAgICB0aGlzLmJiIS5jcmVhdGVTY2FsYXJMaXN0KHRoaXMudmVjdG9yT2ZXZWFrUmVmZXJlbmNlcy5iaW5kKHRoaXMpLCB0aGlzLnZlY3Rvck9mV2Vha1JlZmVyZW5jZXNMZW5ndGgoKSksCisgICAgdGhpcy5iYiEuY3JlYXRlT2JqTGlzdCh0aGlzLnZlY3Rvck9mU3Ryb25nUmVmZXJyYWJsZXMuYmluZCh0aGlzKSwgdGhpcy52ZWN0b3JPZlN0cm9uZ1JlZmVycmFibGVzTGVuZ3RoKCkpLAorICAgIHRoaXMuY29Pd25pbmdSZWZlcmVuY2UoKSwKKyAgICB0aGlzLmJiIS5jcmVhdGVTY2FsYXJMaXN0KHRoaXMudmVjdG9yT2ZDb093bmluZ1JlZmVyZW5jZXMuYmluZCh0aGlzKSwgdGhpcy52ZWN0b3JPZkNvT3duaW5nUmVmZXJlbmNlc0xlbmd0aCgpKSwKKyAgICB0aGlzLm5vbk93bmluZ1JlZmVyZW5jZSgpLAorICAgIHRoaXMuYmIhLmNyZWF0ZVNjYWxhckxpc3QodGhpcy52ZWN0b3JPZk5vbk93bmluZ1JlZmVyZW5jZXMuYmluZCh0aGlzKSwgdGhpcy52ZWN0b3JPZk5vbk93bmluZ1JlZmVyZW5jZXNMZW5ndGgoKSksCisgICAgdGhpcy5hbnlVbmlxdWVUeXBlKCksCisgICAgKCgpID0+IHsKKyAgICAgIGxldCB0ZW1wID0gdW5pb25Ub0FueVVuaXF1ZUFsaWFzZXModGhpcy5hbnlVbmlxdWVUeXBlKCksIHRoaXMuYW55VW5pcXVlLmJpbmQodGhpcykpOworICAgICAgaWYodGVtcCA9PT0gbnVsbCkgeyByZXR1cm4gbnVsbDsgfQorICAgICAgcmV0dXJuIHRlbXAudW5wYWNrKCkKKyAgfSkoKSwKKyAgICB0aGlzLmFueUFtYmlndW91c1R5cGUoKSwKKyAgICAoKCkgPT4geworICAgICAgbGV0IHRlbXAgPSB1bmlvblRvQW55QW1iaWd1b3VzQWxpYXNlcyh0aGlzLmFueUFtYmlndW91c1R5cGUoKSwgdGhpcy5hbnlBbWJpZ3VvdXMuYmluZCh0aGlzKSk7CisgICAgICBpZih0ZW1wID09PSBudWxsKSB7IHJldHVybiBudWxsOyB9CisgICAgICByZXR1cm4gdGVtcC51bnBhY2soKQorICB9KSgpLAorICAgIHRoaXMuYmIhLmNyZWF0ZVNjYWxhckxpc3QodGhpcy52ZWN0b3JPZkVudW1zLmJpbmQodGhpcyksIHRoaXMudmVjdG9yT2ZFbnVtc0xlbmd0aCgpKSwKKyAgICB0aGlzLnNpZ25lZEVudW0oKSwKKyAgICB0aGlzLmJiIS5jcmVhdGVTY2FsYXJMaXN0KHRoaXMudGVzdHJlcXVpcmVkbmVzdGVkZmxhdGJ1ZmZlci5iaW5kKHRoaXMpLCB0aGlzLnRlc3RyZXF1aXJlZG5lc3RlZGZsYXRidWZmZXJMZW5ndGgoKSksCisgICAgdGhpcy5iYiEuY3JlYXRlT2JqTGlzdCh0aGlzLnNjYWxhcktleVNvcnRlZFRhYmxlcy5iaW5kKHRoaXMpLCB0aGlzLnNjYWxhcktleVNvcnRlZFRhYmxlc0xlbmd0aCgpKSwKKyAgICAodGhpcy5uYXRpdmVJbmxpbmUoKSAhPT0gbnVsbCA/IHRoaXMubmF0aXZlSW5saW5lKCkhLnVucGFjaygpIDogbnVsbCksCisgICAgdGhpcy5sb25nRW51bU5vbkVudW1EZWZhdWx0KCksCisgICAgdGhpcy5sb25nRW51bU5vcm1hbERlZmF1bHQoKQorICApOworfQorCisKK3VucGFja1RvKF9vOiBNb25zdGVyVCk6IHZvaWQgeworICBfby5wb3MgPSAodGhpcy5wb3MoKSAhPT0gbnVsbCA/IHRoaXMucG9zKCkhLnVucGFjaygpIDogbnVsbCk7CisgIF9vLm1hbmEgPSB0aGlzLm1hbmEoKTsKKyAgX28uaHAgPSB0aGlzLmhwKCk7CisgIF9vLm5hbWUgPSB0aGlzLm5hbWUoKTsKKyAgX28uaW52ZW50b3J5ID0gdGhpcy5iYiEuY3JlYXRlU2NhbGFyTGlzdCh0aGlzLmludmVudG9yeS5iaW5kKHRoaXMpLCB0aGlzLmludmVudG9yeUxlbmd0aCgpKTsKKyAgX28uY29sb3IgPSB0aGlzLmNvbG9yKCk7CisgIF9vLnRlc3RUeXBlID0gdGhpcy50ZXN0VHlwZSgpOworICBfby50ZXN0ID0gKCgpID0+IHsKKyAgICAgIGxldCB0ZW1wID0gdW5pb25Ub0FueSh0aGlzLnRlc3RUeXBlKCksIHRoaXMudGVzdC5iaW5kKHRoaXMpKTsKKyAgICAgIGlmKHRlbXAgPT09IG51bGwpIHsgcmV0dXJuIG51bGw7IH0KKyAgICAgIHJldHVybiB0ZW1wLnVucGFjaygpCisgIH0pKCk7CisgIF9vLnRlc3Q0ID0gdGhpcy5iYiEuY3JlYXRlT2JqTGlzdCh0aGlzLnRlc3Q0LmJpbmQodGhpcyksIHRoaXMudGVzdDRMZW5ndGgoKSk7CisgIF9vLnRlc3RhcnJheW9mc3RyaW5nID0gdGhpcy5iYiEuY3JlYXRlU2NhbGFyTGlzdCh0aGlzLnRlc3RhcnJheW9mc3RyaW5nLmJpbmQodGhpcyksIHRoaXMudGVzdGFycmF5b2ZzdHJpbmdMZW5ndGgoKSk7CisgIF9vLnRlc3RhcnJheW9mdGFibGVzID0gdGhpcy5iYiEuY3JlYXRlT2JqTGlzdCh0aGlzLnRlc3RhcnJheW9mdGFibGVzLmJpbmQodGhpcyksIHRoaXMudGVzdGFycmF5b2Z0YWJsZXNMZW5ndGgoKSk7CisgIF9vLmVuZW15ID0gKHRoaXMuZW5lbXkoKSAhPT0gbnVsbCA/IHRoaXMuZW5lbXkoKSEudW5wYWNrKCkgOiBudWxsKTsKKyAgX28udGVzdG5lc3RlZGZsYXRidWZmZXIgPSB0aGlzLmJiIS5jcmVhdGVTY2FsYXJMaXN0KHRoaXMudGVzdG5lc3RlZGZsYXRidWZmZXIuYmluZCh0aGlzKSwgdGhpcy50ZXN0bmVzdGVkZmxhdGJ1ZmZlckxlbmd0aCgpKTsKKyAgX28udGVzdGVtcHR5ID0gKHRoaXMudGVzdGVtcHR5KCkgIT09IG51bGwgPyB0aGlzLnRlc3RlbXB0eSgpIS51bnBhY2soKSA6IG51bGwpOworICBfby50ZXN0Ym9vbCA9IHRoaXMudGVzdGJvb2woKTsKKyAgX28udGVzdGhhc2hzMzJGbnYxID0gdGhpcy50ZXN0aGFzaHMzMkZudjEoKTsKKyAgX28udGVzdGhhc2h1MzJGbnYxID0gdGhpcy50ZXN0aGFzaHUzMkZudjEoKTsKKyAgX28udGVzdGhhc2hzNjRGbnYxID0gdGhpcy50ZXN0aGFzaHM2NEZudjEoKTsKKyAgX28udGVzdGhhc2h1NjRGbnYxID0gdGhpcy50ZXN0aGFzaHU2NEZudjEoKTsKKyAgX28udGVzdGhhc2hzMzJGbnYxYSA9IHRoaXMudGVzdGhhc2hzMzJGbnYxYSgpOworICBfby50ZXN0aGFzaHUzMkZudjFhID0gdGhpcy50ZXN0aGFzaHUzMkZudjFhKCk7CisgIF9vLnRlc3RoYXNoczY0Rm52MWEgPSB0aGlzLnRlc3RoYXNoczY0Rm52MWEoKTsKKyAgX28udGVzdGhhc2h1NjRGbnYxYSA9IHRoaXMudGVzdGhhc2h1NjRGbnYxYSgpOworICBfby50ZXN0YXJyYXlvZmJvb2xzID0gdGhpcy5iYiEuY3JlYXRlU2NhbGFyTGlzdCh0aGlzLnRlc3RhcnJheW9mYm9vbHMuYmluZCh0aGlzKSwgdGhpcy50ZXN0YXJyYXlvZmJvb2xzTGVuZ3RoKCkpOworICBfby50ZXN0ZiA9IHRoaXMudGVzdGYoKTsKKyAgX28udGVzdGYyID0gdGhpcy50ZXN0ZjIoKTsKKyAgX28udGVzdGYzID0gdGhpcy50ZXN0ZjMoKTsKKyAgX28udGVzdGFycmF5b2ZzdHJpbmcyID0gdGhpcy5iYiEuY3JlYXRlU2NhbGFyTGlzdCh0aGlzLnRlc3RhcnJheW9mc3RyaW5nMi5iaW5kKHRoaXMpLCB0aGlzLnRlc3RhcnJheW9mc3RyaW5nMkxlbmd0aCgpKTsKKyAgX28udGVzdGFycmF5b2Zzb3J0ZWRzdHJ1Y3QgPSB0aGlzLmJiIS5jcmVhdGVPYmpMaXN0KHRoaXMudGVzdGFycmF5b2Zzb3J0ZWRzdHJ1Y3QuYmluZCh0aGlzKSwgdGhpcy50ZXN0YXJyYXlvZnNvcnRlZHN0cnVjdExlbmd0aCgpKTsKKyAgX28uZmxleCA9IHRoaXMuYmIhLmNyZWF0ZVNjYWxhckxpc3QodGhpcy5mbGV4LmJpbmQodGhpcyksIHRoaXMuZmxleExlbmd0aCgpKTsKKyAgX28udGVzdDUgPSB0aGlzLmJiIS5jcmVhdGVPYmpMaXN0KHRoaXMudGVzdDUuYmluZCh0aGlzKSwgdGhpcy50ZXN0NUxlbmd0aCgpKTsKKyAgX28udmVjdG9yT2ZMb25ncyA9IHRoaXMuYmIhLmNyZWF0ZVNjYWxhckxpc3QodGhpcy52ZWN0b3JPZkxvbmdzLmJpbmQodGhpcyksIHRoaXMudmVjdG9yT2ZMb25nc0xlbmd0aCgpKTsKKyAgX28udmVjdG9yT2ZEb3VibGVzID0gdGhpcy5iYiEuY3JlYXRlU2NhbGFyTGlzdCh0aGlzLnZlY3Rvck9mRG91Ymxlcy5iaW5kKHRoaXMpLCB0aGlzLnZlY3Rvck9mRG91Ymxlc0xlbmd0aCgpKTsKKyAgX28ucGFyZW50TmFtZXNwYWNlVGVzdCA9ICh0aGlzLnBhcmVudE5hbWVzcGFjZVRlc3QoKSAhPT0gbnVsbCA/IHRoaXMucGFyZW50TmFtZXNwYWNlVGVzdCgpIS51bnBhY2soKSA6IG51bGwpOworICBfby52ZWN0b3JPZlJlZmVycmFibGVzID0gdGhpcy5iYiEuY3JlYXRlT2JqTGlzdCh0aGlzLnZlY3Rvck9mUmVmZXJyYWJsZXMuYmluZCh0aGlzKSwgdGhpcy52ZWN0b3JPZlJlZmVycmFibGVzTGVuZ3RoKCkpOworICBfby5zaW5nbGVXZWFrUmVmZXJlbmNlID0gdGhpcy5zaW5nbGVXZWFrUmVmZXJlbmNlKCk7CisgIF9vLnZlY3Rvck9mV2Vha1JlZmVyZW5jZXMgPSB0aGlzLmJiIS5jcmVhdGVTY2FsYXJMaXN0KHRoaXMudmVjdG9yT2ZXZWFrUmVmZXJlbmNlcy5iaW5kKHRoaXMpLCB0aGlzLnZlY3Rvck9mV2Vha1JlZmVyZW5jZXNMZW5ndGgoKSk7CisgIF9vLnZlY3Rvck9mU3Ryb25nUmVmZXJyYWJsZXMgPSB0aGlzLmJiIS5jcmVhdGVPYmpMaXN0KHRoaXMudmVjdG9yT2ZTdHJvbmdSZWZlcnJhYmxlcy5iaW5kKHRoaXMpLCB0aGlzLnZlY3Rvck9mU3Ryb25nUmVmZXJyYWJsZXNMZW5ndGgoKSk7CisgIF9vLmNvT3duaW5nUmVmZXJlbmNlID0gdGhpcy5jb093bmluZ1JlZmVyZW5jZSgpOworICBfby52ZWN0b3JPZkNvT3duaW5nUmVmZXJlbmNlcyA9IHRoaXMuYmIhLmNyZWF0ZVNjYWxhckxpc3QodGhpcy52ZWN0b3JPZkNvT3duaW5nUmVmZXJlbmNlcy5iaW5kKHRoaXMpLCB0aGlzLnZlY3Rvck9mQ29Pd25pbmdSZWZlcmVuY2VzTGVuZ3RoKCkpOworICBfby5ub25Pd25pbmdSZWZlcmVuY2UgPSB0aGlzLm5vbk93bmluZ1JlZmVyZW5jZSgpOworICBfby52ZWN0b3JPZk5vbk93bmluZ1JlZmVyZW5jZXMgPSB0aGlzLmJiIS5jcmVhdGVTY2FsYXJMaXN0KHRoaXMudmVjdG9yT2ZOb25Pd25pbmdSZWZlcmVuY2VzLmJpbmQodGhpcyksIHRoaXMudmVjdG9yT2ZOb25Pd25pbmdSZWZlcmVuY2VzTGVuZ3RoKCkpOworICBfby5hbnlVbmlxdWVUeXBlID0gdGhpcy5hbnlVbmlxdWVUeXBlKCk7CisgIF9vLmFueVVuaXF1ZSA9ICgoKSA9PiB7CisgICAgICBsZXQgdGVtcCA9IHVuaW9uVG9BbnlVbmlxdWVBbGlhc2VzKHRoaXMuYW55VW5pcXVlVHlwZSgpLCB0aGlzLmFueVVuaXF1ZS5iaW5kKHRoaXMpKTsKKyAgICAgIGlmKHRlbXAgPT09IG51bGwpIHsgcmV0dXJuIG51bGw7IH0KKyAgICAgIHJldHVybiB0ZW1wLnVucGFjaygpCisgIH0pKCk7CisgIF9vLmFueUFtYmlndW91c1R5cGUgPSB0aGlzLmFueUFtYmlndW91c1R5cGUoKTsKKyAgX28uYW55QW1iaWd1b3VzID0gKCgpID0+IHsKKyAgICAgIGxldCB0ZW1wID0gdW5pb25Ub0FueUFtYmlndW91c0FsaWFzZXModGhpcy5hbnlBbWJpZ3VvdXNUeXBlKCksIHRoaXMuYW55QW1iaWd1b3VzLmJpbmQodGhpcykpOworICAgICAgaWYodGVtcCA9PT0gbnVsbCkgeyByZXR1cm4gbnVsbDsgfQorICAgICAgcmV0dXJuIHRlbXAudW5wYWNrKCkKKyAgfSkoKTsKKyAgX28udmVjdG9yT2ZFbnVtcyA9IHRoaXMuYmIhLmNyZWF0ZVNjYWxhckxpc3QodGhpcy52ZWN0b3JPZkVudW1zLmJpbmQodGhpcyksIHRoaXMudmVjdG9yT2ZFbnVtc0xlbmd0aCgpKTsKKyAgX28uc2lnbmVkRW51bSA9IHRoaXMuc2lnbmVkRW51bSgpOworICBfby50ZXN0cmVxdWlyZWRuZXN0ZWRmbGF0YnVmZmVyID0gdGhpcy5iYiEuY3JlYXRlU2NhbGFyTGlzdCh0aGlzLnRlc3RyZXF1aXJlZG5lc3RlZGZsYXRidWZmZXIuYmluZCh0aGlzKSwgdGhpcy50ZXN0cmVxdWlyZWRuZXN0ZWRmbGF0YnVmZmVyTGVuZ3RoKCkpOworICBfby5zY2FsYXJLZXlTb3J0ZWRUYWJsZXMgPSB0aGlzLmJiIS5jcmVhdGVPYmpMaXN0KHRoaXMuc2NhbGFyS2V5U29ydGVkVGFibGVzLmJpbmQodGhpcyksIHRoaXMuc2NhbGFyS2V5U29ydGVkVGFibGVzTGVuZ3RoKCkpOworICBfby5uYXRpdmVJbmxpbmUgPSAodGhpcy5uYXRpdmVJbmxpbmUoKSAhPT0gbnVsbCA/IHRoaXMubmF0aXZlSW5saW5lKCkhLnVucGFjaygpIDogbnVsbCk7CisgIF9vLmxvbmdFbnVtTm9uRW51bURlZmF1bHQgPSB0aGlzLmxvbmdFbnVtTm9uRW51bURlZmF1bHQoKTsKKyAgX28ubG9uZ0VudW1Ob3JtYWxEZWZhdWx0ID0gdGhpcy5sb25nRW51bU5vcm1hbERlZmF1bHQoKTsKK30KK30KKworZXhwb3J0IGNsYXNzIE1vbnN0ZXJUIHsKK2NvbnN0cnVjdG9yKAorICBwdWJsaWMgcG9zOiBWZWMzVHxudWxsID0gbnVsbCwKKyAgcHVibGljIG1hbmE6IG51bWJlciA9IDE1MCwKKyAgcHVibGljIGhwOiBudW1iZXIgPSAxMDAsCisgIHB1YmxpYyBuYW1lOiBzdHJpbmd8VWludDhBcnJheXxudWxsID0gbnVsbCwKKyAgcHVibGljIGludmVudG9yeTogKG51bWJlcilbXSA9IFtdLAorICBwdWJsaWMgY29sb3I6IENvbG9yID0gQ29sb3IuQmx1ZSwKKyAgcHVibGljIHRlc3RUeXBlOiBBbnkgPSBBbnkuTk9ORSwKKyAgcHVibGljIHRlc3Q6IE1vbnN0ZXJUfE15R2FtZV9FeGFtcGxlMl9Nb25zdGVyVHxUZXN0U2ltcGxlVGFibGVXaXRoRW51bVR8bnVsbCA9IG51bGwsCisgIHB1YmxpYyB0ZXN0NDogKFRlc3RUKVtdID0gW10sCisgIHB1YmxpYyB0ZXN0YXJyYXlvZnN0cmluZzogKHN0cmluZylbXSA9IFtdLAorICBwdWJsaWMgdGVzdGFycmF5b2Z0YWJsZXM6IChNb25zdGVyVClbXSA9IFtdLAorICBwdWJsaWMgZW5lbXk6IE1vbnN0ZXJUfG51bGwgPSBudWxsLAorICBwdWJsaWMgdGVzdG5lc3RlZGZsYXRidWZmZXI6IChudW1iZXIpW10gPSBbXSwKKyAgcHVibGljIHRlc3RlbXB0eTogU3RhdFR8bnVsbCA9IG51bGwsCisgIHB1YmxpYyB0ZXN0Ym9vbDogYm9vbGVhbiA9IGZhbHNlLAorICBwdWJsaWMgdGVzdGhhc2hzMzJGbnYxOiBudW1iZXIgPSAwLAorICBwdWJsaWMgdGVzdGhhc2h1MzJGbnYxOiBudW1iZXIgPSAwLAorICBwdWJsaWMgdGVzdGhhc2hzNjRGbnYxOiBiaWdpbnQgPSBCaWdJbnQoJzAnKSwKKyAgcHVibGljIHRlc3RoYXNodTY0Rm52MTogYmlnaW50ID0gQmlnSW50KCcwJyksCisgIHB1YmxpYyB0ZXN0aGFzaHMzMkZudjFhOiBudW1iZXIgPSAwLAorICBwdWJsaWMgdGVzdGhhc2h1MzJGbnYxYTogbnVtYmVyID0gMCwKKyAgcHVibGljIHRlc3RoYXNoczY0Rm52MWE6IGJpZ2ludCA9IEJpZ0ludCgnMCcpLAorICBwdWJsaWMgdGVzdGhhc2h1NjRGbnYxYTogYmlnaW50ID0gQmlnSW50KCcwJyksCisgIHB1YmxpYyB0ZXN0YXJyYXlvZmJvb2xzOiAoYm9vbGVhbilbXSA9IFtdLAorICBwdWJsaWMgdGVzdGY6IG51bWJlciA9IDMuMTQxNTksCisgIHB1YmxpYyB0ZXN0ZjI6IG51bWJlciA9IDMuMCwKKyAgcHVibGljIHRlc3RmMzogbnVtYmVyID0gMC4wLAorICBwdWJsaWMgdGVzdGFycmF5b2ZzdHJpbmcyOiAoc3RyaW5nKVtdID0gW10sCisgIHB1YmxpYyB0ZXN0YXJyYXlvZnNvcnRlZHN0cnVjdDogKEFiaWxpdHlUKVtdID0gW10sCisgIHB1YmxpYyBmbGV4OiAobnVtYmVyKVtdID0gW10sCisgIHB1YmxpYyB0ZXN0NTogKFRlc3RUKVtdID0gW10sCisgIHB1YmxpYyB2ZWN0b3JPZkxvbmdzOiAoYmlnaW50KVtdID0gW10sCisgIHB1YmxpYyB2ZWN0b3JPZkRvdWJsZXM6IChudW1iZXIpW10gPSBbXSwKKyAgcHVibGljIHBhcmVudE5hbWVzcGFjZVRlc3Q6IEluUGFyZW50TmFtZXNwYWNlVHxudWxsID0gbnVsbCwKKyAgcHVibGljIHZlY3Rvck9mUmVmZXJyYWJsZXM6IChSZWZlcnJhYmxlVClbXSA9IFtdLAorICBwdWJsaWMgc2luZ2xlV2Vha1JlZmVyZW5jZTogYmlnaW50ID0gQmlnSW50KCcwJyksCisgIHB1YmxpYyB2ZWN0b3JPZldlYWtSZWZlcmVuY2VzOiAoYmlnaW50KVtdID0gW10sCisgIHB1YmxpYyB2ZWN0b3JPZlN0cm9uZ1JlZmVycmFibGVzOiAoUmVmZXJyYWJsZVQpW10gPSBbXSwKKyAgcHVibGljIGNvT3duaW5nUmVmZXJlbmNlOiBiaWdpbnQgPSBCaWdJbnQoJzAnKSwKKyAgcHVibGljIHZlY3Rvck9mQ29Pd25pbmdSZWZlcmVuY2VzOiAoYmlnaW50KVtdID0gW10sCisgIHB1YmxpYyBub25Pd25pbmdSZWZlcmVuY2U6IGJpZ2ludCA9IEJpZ0ludCgnMCcpLAorICBwdWJsaWMgdmVjdG9yT2ZOb25Pd25pbmdSZWZlcmVuY2VzOiAoYmlnaW50KVtdID0gW10sCisgIHB1YmxpYyBhbnlVbmlxdWVUeXBlOiBBbnlVbmlxdWVBbGlhc2VzID0gQW55VW5pcXVlQWxpYXNlcy5OT05FLAorICBwdWJsaWMgYW55VW5pcXVlOiBNb25zdGVyVHxNeUdhbWVfRXhhbXBsZTJfTW9uc3RlclR8VGVzdFNpbXBsZVRhYmxlV2l0aEVudW1UfG51bGwgPSBudWxsLAorICBwdWJsaWMgYW55QW1iaWd1b3VzVHlwZTogQW55QW1iaWd1b3VzQWxpYXNlcyA9IEFueUFtYmlndW91c0FsaWFzZXMuTk9ORSwKKyAgcHVibGljIGFueUFtYmlndW91czogTW9uc3RlclR8bnVsbCA9IG51bGwsCisgIHB1YmxpYyB2ZWN0b3JPZkVudW1zOiAoQ29sb3IpW10gPSBbXSwKKyAgcHVibGljIHNpZ25lZEVudW06IFJhY2UgPSBSYWNlLk5vbmUsCisgIHB1YmxpYyB0ZXN0cmVxdWlyZWRuZXN0ZWRmbGF0YnVmZmVyOiAobnVtYmVyKVtdID0gW10sCisgIHB1YmxpYyBzY2FsYXJLZXlTb3J0ZWRUYWJsZXM6IChTdGF0VClbXSA9IFtdLAorICBwdWJsaWMgbmF0aXZlSW5saW5lOiBUZXN0VHxudWxsID0gbnVsbCwKKyAgcHVibGljIGxvbmdFbnVtTm9uRW51bURlZmF1bHQ6IGJpZ2ludCA9IEJpZ0ludCgnMCcpLAorICBwdWJsaWMgbG9uZ0VudW1Ob3JtYWxEZWZhdWx0OiBiaWdpbnQgPSBCaWdJbnQoJzInKQorKXt9CisKKworcGFjayhidWlsZGVyOmZsYXRidWZmZXJzLkJ1aWxkZXIpOiBmbGF0YnVmZmVycy5PZmZzZXQgeworICBjb25zdCBuYW1lID0gKHRoaXMubmFtZSAhPT0gbnVsbCA/IGJ1aWxkZXIuY3JlYXRlU3RyaW5nKHRoaXMubmFtZSEpIDogMCk7CisgIGNvbnN0IGludmVudG9yeSA9IE1vbnN0ZXIuY3JlYXRlSW52ZW50b3J5VmVjdG9yKGJ1aWxkZXIsIHRoaXMuaW52ZW50b3J5KTsKKyAgY29uc3QgdGVzdCA9IGJ1aWxkZXIuY3JlYXRlT2JqZWN0T2Zmc2V0KHRoaXMudGVzdCk7CisgIGNvbnN0IHRlc3Q0ID0gYnVpbGRlci5jcmVhdGVTdHJ1Y3RPZmZzZXRMaXN0KHRoaXMudGVzdDQsIE1vbnN0ZXIuc3RhcnRUZXN0NFZlY3Rvcik7CisgIGNvbnN0IHRlc3RhcnJheW9mc3RyaW5nID0gTW9uc3Rlci5jcmVhdGVUZXN0YXJyYXlvZnN0cmluZ1ZlY3RvcihidWlsZGVyLCBidWlsZGVyLmNyZWF0ZU9iamVjdE9mZnNldExpc3QodGhpcy50ZXN0YXJyYXlvZnN0cmluZykpOworICBjb25zdCB0ZXN0YXJyYXlvZnRhYmxlcyA9IE1vbnN0ZXIuY3JlYXRlVGVzdGFycmF5b2Z0YWJsZXNWZWN0b3IoYnVpbGRlciwgYnVpbGRlci5jcmVhdGVPYmplY3RPZmZzZXRMaXN0KHRoaXMudGVzdGFycmF5b2Z0YWJsZXMpKTsKKyAgY29uc3QgZW5lbXkgPSAodGhpcy5lbmVteSAhPT0gbnVsbCA/IHRoaXMuZW5lbXkhLnBhY2soYnVpbGRlcikgOiAwKTsKKyAgY29uc3QgdGVzdG5lc3RlZGZsYXRidWZmZXIgPSBNb25zdGVyLmNyZWF0ZVRlc3RuZXN0ZWRmbGF0YnVmZmVyVmVjdG9yKGJ1aWxkZXIsIHRoaXMudGVzdG5lc3RlZGZsYXRidWZmZXIpOworICBjb25zdCB0ZXN0ZW1wdHkgPSAodGhpcy50ZXN0ZW1wdHkgIT09IG51bGwgPyB0aGlzLnRlc3RlbXB0eSEucGFjayhidWlsZGVyKSA6IDApOworICBjb25zdCB0ZXN0YXJyYXlvZmJvb2xzID0gTW9uc3Rlci5jcmVhdGVUZXN0YXJyYXlvZmJvb2xzVmVjdG9yKGJ1aWxkZXIsIHRoaXMudGVzdGFycmF5b2Zib29scyk7CisgIGNvbnN0IHRlc3RhcnJheW9mc3RyaW5nMiA9IE1vbnN0ZXIuY3JlYXRlVGVzdGFycmF5b2ZzdHJpbmcyVmVjdG9yKGJ1aWxkZXIsIGJ1aWxkZXIuY3JlYXRlT2JqZWN0T2Zmc2V0TGlzdCh0aGlzLnRlc3RhcnJheW9mc3RyaW5nMikpOworICBjb25zdCB0ZXN0YXJyYXlvZnNvcnRlZHN0cnVjdCA9IGJ1aWxkZXIuY3JlYXRlU3RydWN0T2Zmc2V0TGlzdCh0aGlzLnRlc3RhcnJheW9mc29ydGVkc3RydWN0LCBNb25zdGVyLnN0YXJ0VGVzdGFycmF5b2Zzb3J0ZWRzdHJ1Y3RWZWN0b3IpOworICBjb25zdCBmbGV4ID0gTW9uc3Rlci5jcmVhdGVGbGV4VmVjdG9yKGJ1aWxkZXIsIHRoaXMuZmxleCk7CisgIGNvbnN0IHRlc3Q1ID0gYnVpbGRlci5jcmVhdGVTdHJ1Y3RPZmZzZXRMaXN0KHRoaXMudGVzdDUsIE1vbnN0ZXIuc3RhcnRUZXN0NVZlY3Rvcik7CisgIGNvbnN0IHZlY3Rvck9mTG9uZ3MgPSBNb25zdGVyLmNyZWF0ZVZlY3Rvck9mTG9uZ3NWZWN0b3IoYnVpbGRlciwgdGhpcy52ZWN0b3JPZkxvbmdzKTsKKyAgY29uc3QgdmVjdG9yT2ZEb3VibGVzID0gTW9uc3Rlci5jcmVhdGVWZWN0b3JPZkRvdWJsZXNWZWN0b3IoYnVpbGRlciwgdGhpcy52ZWN0b3JPZkRvdWJsZXMpOworICBjb25zdCBwYXJlbnROYW1lc3BhY2VUZXN0ID0gKHRoaXMucGFyZW50TmFtZXNwYWNlVGVzdCAhPT0gbnVsbCA/IHRoaXMucGFyZW50TmFtZXNwYWNlVGVzdCEucGFjayhidWlsZGVyKSA6IDApOworICBjb25zdCB2ZWN0b3JPZlJlZmVycmFibGVzID0gTW9uc3Rlci5jcmVhdGVWZWN0b3JPZlJlZmVycmFibGVzVmVjdG9yKGJ1aWxkZXIsIGJ1aWxkZXIuY3JlYXRlT2JqZWN0T2Zmc2V0TGlzdCh0aGlzLnZlY3Rvck9mUmVmZXJyYWJsZXMpKTsKKyAgY29uc3QgdmVjdG9yT2ZXZWFrUmVmZXJlbmNlcyA9IE1vbnN0ZXIuY3JlYXRlVmVjdG9yT2ZXZWFrUmVmZXJlbmNlc1ZlY3RvcihidWlsZGVyLCB0aGlzLnZlY3Rvck9mV2Vha1JlZmVyZW5jZXMpOworICBjb25zdCB2ZWN0b3JPZlN0cm9uZ1JlZmVycmFibGVzID0gTW9uc3Rlci5jcmVhdGVWZWN0b3JPZlN0cm9uZ1JlZmVycmFibGVzVmVjdG9yKGJ1aWxkZXIsIGJ1aWxkZXIuY3JlYXRlT2JqZWN0T2Zmc2V0TGlzdCh0aGlzLnZlY3Rvck9mU3Ryb25nUmVmZXJyYWJsZXMpKTsKKyAgY29uc3QgdmVjdG9yT2ZDb093bmluZ1JlZmVyZW5jZXMgPSBNb25zdGVyLmNyZWF0ZVZlY3Rvck9mQ29Pd25pbmdSZWZlcmVuY2VzVmVjdG9yKGJ1aWxkZXIsIHRoaXMudmVjdG9yT2ZDb093bmluZ1JlZmVyZW5jZXMpOworICBjb25zdCB2ZWN0b3JPZk5vbk93bmluZ1JlZmVyZW5jZXMgPSBNb25zdGVyLmNyZWF0ZVZlY3Rvck9mTm9uT3duaW5nUmVmZXJlbmNlc1ZlY3RvcihidWlsZGVyLCB0aGlzLnZlY3Rvck9mTm9uT3duaW5nUmVmZXJlbmNlcyk7CisgIGNvbnN0IGFueVVuaXF1ZSA9IGJ1aWxkZXIuY3JlYXRlT2JqZWN0T2Zmc2V0KHRoaXMuYW55VW5pcXVlKTsKKyAgY29uc3QgYW55QW1iaWd1b3VzID0gYnVpbGRlci5jcmVhdGVPYmplY3RPZmZzZXQodGhpcy5hbnlBbWJpZ3VvdXMpOworICBjb25zdCB2ZWN0b3JPZkVudW1zID0gTW9uc3Rlci5jcmVhdGVWZWN0b3JPZkVudW1zVmVjdG9yKGJ1aWxkZXIsIHRoaXMudmVjdG9yT2ZFbnVtcyk7CisgIGNvbnN0IHRlc3RyZXF1aXJlZG5lc3RlZGZsYXRidWZmZXIgPSBNb25zdGVyLmNyZWF0ZVRlc3RyZXF1aXJlZG5lc3RlZGZsYXRidWZmZXJWZWN0b3IoYnVpbGRlciwgdGhpcy50ZXN0cmVxdWlyZWRuZXN0ZWRmbGF0YnVmZmVyKTsKKyAgY29uc3Qgc2NhbGFyS2V5U29ydGVkVGFibGVzID0gTW9uc3Rlci5jcmVhdGVTY2FsYXJLZXlTb3J0ZWRUYWJsZXNWZWN0b3IoYnVpbGRlciwgYnVpbGRlci5jcmVhdGVPYmplY3RPZmZzZXRMaXN0KHRoaXMuc2NhbGFyS2V5U29ydGVkVGFibGVzKSk7CisKKyAgTW9uc3Rlci5zdGFydE1vbnN0ZXIoYnVpbGRlcik7CisgIE1vbnN0ZXIuYWRkUG9zKGJ1aWxkZXIsICh0aGlzLnBvcyAhPT0gbnVsbCA/IHRoaXMucG9zIS5wYWNrKGJ1aWxkZXIpIDogMCkpOworICBNb25zdGVyLmFkZE1hbmEoYnVpbGRlciwgdGhpcy5tYW5hKTsKKyAgTW9uc3Rlci5hZGRIcChidWlsZGVyLCB0aGlzLmhwKTsKKyAgTW9uc3Rlci5hZGROYW1lKGJ1aWxkZXIsIG5hbWUpOworICBNb25zdGVyLmFkZEludmVudG9yeShidWlsZGVyLCBpbnZlbnRvcnkpOworICBNb25zdGVyLmFkZENvbG9yKGJ1aWxkZXIsIHRoaXMuY29sb3IpOworICBNb25zdGVyLmFkZFRlc3RUeXBlKGJ1aWxkZXIsIHRoaXMudGVzdFR5cGUpOworICBNb25zdGVyLmFkZFRlc3QoYnVpbGRlciwgdGVzdCk7CisgIE1vbnN0ZXIuYWRkVGVzdDQoYnVpbGRlciwgdGVzdDQpOworICBNb25zdGVyLmFkZFRlc3RhcnJheW9mc3RyaW5nKGJ1aWxkZXIsIHRlc3RhcnJheW9mc3RyaW5nKTsKKyAgTW9uc3Rlci5hZGRUZXN0YXJyYXlvZnRhYmxlcyhidWlsZGVyLCB0ZXN0YXJyYXlvZnRhYmxlcyk7CisgIE1vbnN0ZXIuYWRkRW5lbXkoYnVpbGRlciwgZW5lbXkpOworICBNb25zdGVyLmFkZFRlc3RuZXN0ZWRmbGF0YnVmZmVyKGJ1aWxkZXIsIHRlc3RuZXN0ZWRmbGF0YnVmZmVyKTsKKyAgTW9uc3Rlci5hZGRUZXN0ZW1wdHkoYnVpbGRlciwgdGVzdGVtcHR5KTsKKyAgTW9uc3Rlci5hZGRUZXN0Ym9vbChidWlsZGVyLCB0aGlzLnRlc3Rib29sKTsKKyAgTW9uc3Rlci5hZGRUZXN0aGFzaHMzMkZudjEoYnVpbGRlciwgdGhpcy50ZXN0aGFzaHMzMkZudjEpOworICBNb25zdGVyLmFkZFRlc3RoYXNodTMyRm52MShidWlsZGVyLCB0aGlzLnRlc3RoYXNodTMyRm52MSk7CisgIE1vbnN0ZXIuYWRkVGVzdGhhc2hzNjRGbnYxKGJ1aWxkZXIsIHRoaXMudGVzdGhhc2hzNjRGbnYxKTsKKyAgTW9uc3Rlci5hZGRUZXN0aGFzaHU2NEZudjEoYnVpbGRlciwgdGhpcy50ZXN0aGFzaHU2NEZudjEpOworICBNb25zdGVyLmFkZFRlc3RoYXNoczMyRm52MWEoYnVpbGRlciwgdGhpcy50ZXN0aGFzaHMzMkZudjFhKTsKKyAgTW9uc3Rlci5hZGRUZXN0aGFzaHUzMkZudjFhKGJ1aWxkZXIsIHRoaXMudGVzdGhhc2h1MzJGbnYxYSk7CisgIE1vbnN0ZXIuYWRkVGVzdGhhc2hzNjRGbnYxYShidWlsZGVyLCB0aGlzLnRlc3RoYXNoczY0Rm52MWEpOworICBNb25zdGVyLmFkZFRlc3RoYXNodTY0Rm52MWEoYnVpbGRlciwgdGhpcy50ZXN0aGFzaHU2NEZudjFhKTsKKyAgTW9uc3Rlci5hZGRUZXN0YXJyYXlvZmJvb2xzKGJ1aWxkZXIsIHRlc3RhcnJheW9mYm9vbHMpOworICBNb25zdGVyLmFkZFRlc3RmKGJ1aWxkZXIsIHRoaXMudGVzdGYpOworICBNb25zdGVyLmFkZFRlc3RmMihidWlsZGVyLCB0aGlzLnRlc3RmMik7CisgIE1vbnN0ZXIuYWRkVGVzdGYzKGJ1aWxkZXIsIHRoaXMudGVzdGYzKTsKKyAgTW9uc3Rlci5hZGRUZXN0YXJyYXlvZnN0cmluZzIoYnVpbGRlciwgdGVzdGFycmF5b2ZzdHJpbmcyKTsKKyAgTW9uc3Rlci5hZGRUZXN0YXJyYXlvZnNvcnRlZHN0cnVjdChidWlsZGVyLCB0ZXN0YXJyYXlvZnNvcnRlZHN0cnVjdCk7CisgIE1vbnN0ZXIuYWRkRmxleChidWlsZGVyLCBmbGV4KTsKKyAgTW9uc3Rlci5hZGRUZXN0NShidWlsZGVyLCB0ZXN0NSk7CisgIE1vbnN0ZXIuYWRkVmVjdG9yT2ZMb25ncyhidWlsZGVyLCB2ZWN0b3JPZkxvbmdzKTsKKyAgTW9uc3Rlci5hZGRWZWN0b3JPZkRvdWJsZXMoYnVpbGRlciwgdmVjdG9yT2ZEb3VibGVzKTsKKyAgTW9uc3Rlci5hZGRQYXJlbnROYW1lc3BhY2VUZXN0KGJ1aWxkZXIsIHBhcmVudE5hbWVzcGFjZVRlc3QpOworICBNb25zdGVyLmFkZFZlY3Rvck9mUmVmZXJyYWJsZXMoYnVpbGRlciwgdmVjdG9yT2ZSZWZlcnJhYmxlcyk7CisgIE1vbnN0ZXIuYWRkU2luZ2xlV2Vha1JlZmVyZW5jZShidWlsZGVyLCB0aGlzLnNpbmdsZVdlYWtSZWZlcmVuY2UpOworICBNb25zdGVyLmFkZFZlY3Rvck9mV2Vha1JlZmVyZW5jZXMoYnVpbGRlciwgdmVjdG9yT2ZXZWFrUmVmZXJlbmNlcyk7CisgIE1vbnN0ZXIuYWRkVmVjdG9yT2ZTdHJvbmdSZWZlcnJhYmxlcyhidWlsZGVyLCB2ZWN0b3JPZlN0cm9uZ1JlZmVycmFibGVzKTsKKyAgTW9uc3Rlci5hZGRDb093bmluZ1JlZmVyZW5jZShidWlsZGVyLCB0aGlzLmNvT3duaW5nUmVmZXJlbmNlKTsKKyAgTW9uc3Rlci5hZGRWZWN0b3JPZkNvT3duaW5nUmVmZXJlbmNlcyhidWlsZGVyLCB2ZWN0b3JPZkNvT3duaW5nUmVmZXJlbmNlcyk7CisgIE1vbnN0ZXIuYWRkTm9uT3duaW5nUmVmZXJlbmNlKGJ1aWxkZXIsIHRoaXMubm9uT3duaW5nUmVmZXJlbmNlKTsKKyAgTW9uc3Rlci5hZGRWZWN0b3JPZk5vbk93bmluZ1JlZmVyZW5jZXMoYnVpbGRlciwgdmVjdG9yT2ZOb25Pd25pbmdSZWZlcmVuY2VzKTsKKyAgTW9uc3Rlci5hZGRBbnlVbmlxdWVUeXBlKGJ1aWxkZXIsIHRoaXMuYW55VW5pcXVlVHlwZSk7CisgIE1vbnN0ZXIuYWRkQW55VW5pcXVlKGJ1aWxkZXIsIGFueVVuaXF1ZSk7CisgIE1vbnN0ZXIuYWRkQW55QW1iaWd1b3VzVHlwZShidWlsZGVyLCB0aGlzLmFueUFtYmlndW91c1R5cGUpOworICBNb25zdGVyLmFkZEFueUFtYmlndW91cyhidWlsZGVyLCBhbnlBbWJpZ3VvdXMpOworICBNb25zdGVyLmFkZFZlY3Rvck9mRW51bXMoYnVpbGRlciwgdmVjdG9yT2ZFbnVtcyk7CisgIE1vbnN0ZXIuYWRkU2lnbmVkRW51bShidWlsZGVyLCB0aGlzLnNpZ25lZEVudW0pOworICBNb25zdGVyLmFkZFRlc3RyZXF1aXJlZG5lc3RlZGZsYXRidWZmZXIoYnVpbGRlciwgdGVzdHJlcXVpcmVkbmVzdGVkZmxhdGJ1ZmZlcik7CisgIE1vbnN0ZXIuYWRkU2NhbGFyS2V5U29ydGVkVGFibGVzKGJ1aWxkZXIsIHNjYWxhcktleVNvcnRlZFRhYmxlcyk7CisgIE1vbnN0ZXIuYWRkTmF0aXZlSW5saW5lKGJ1aWxkZXIsICh0aGlzLm5hdGl2ZUlubGluZSAhPT0gbnVsbCA/IHRoaXMubmF0aXZlSW5saW5lIS5wYWNrKGJ1aWxkZXIpIDogMCkpOworICBNb25zdGVyLmFkZExvbmdFbnVtTm9uRW51bURlZmF1bHQoYnVpbGRlciwgdGhpcy5sb25nRW51bU5vbkVudW1EZWZhdWx0KTsKKyAgTW9uc3Rlci5hZGRMb25nRW51bU5vcm1hbERlZmF1bHQoYnVpbGRlciwgdGhpcy5sb25nRW51bU5vcm1hbERlZmF1bHQpOworCisgIHJldHVybiBNb25zdGVyLmVuZE1vbnN0ZXIoYnVpbGRlcik7Cit9Cit9CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy90cy9teS1nYW1lL2V4YW1wbGUvcmFjZS5qcyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL3RzL215LWdhbWUvZXhhbXBsZS9yYWNlLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc0ZjUxMDUKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy90cy9teS1nYW1lL2V4YW1wbGUvcmFjZS5qcwpAQCAtMCwwICsxLDggQEAKKy8vIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGJ5IHRoZSBGbGF0QnVmZmVycyBjb21waWxlciwgZG8gbm90IG1vZGlmeQorZXhwb3J0IHZhciBSYWNlOworKGZ1bmN0aW9uIChSYWNlKSB7CisgICAgUmFjZVtSYWNlWyJOb25lIl0gPSAtMV0gPSAiTm9uZSI7CisgICAgUmFjZVtSYWNlWyJIdW1hbiJdID0gMF0gPSAiSHVtYW4iOworICAgIFJhY2VbUmFjZVsiRHdhcmYiXSA9IDFdID0gIkR3YXJmIjsKKyAgICBSYWNlW1JhY2VbIkVsZiJdID0gMl0gPSAiRWxmIjsKK30pKFJhY2UgfHwgKFJhY2UgPSB7fSkpOwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvdHMvbXktZ2FtZS9leGFtcGxlL3JhY2UudHMgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy90cy9teS1nYW1lL2V4YW1wbGUvcmFjZS50cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44Y2I5NjU0Ci0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvdHMvbXktZ2FtZS9leGFtcGxlL3JhY2UudHMKQEAgLTAsMCArMSw4IEBACisvLyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBieSB0aGUgRmxhdEJ1ZmZlcnMgY29tcGlsZXIsIGRvIG5vdCBtb2RpZnkKKworZXhwb3J0IGVudW0gUmFjZSB7CisgIE5vbmUgPSAtMSwKKyAgSHVtYW4gPSAwLAorICBEd2FyZiA9IDEsCisgIEVsZiA9IDIKK30KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL3RzL215LWdhbWUvZXhhbXBsZS9yZWZlcnJhYmxlLmpzIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvdHMvbXktZ2FtZS9leGFtcGxlL3JlZmVycmFibGUuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzY3MDM0YgotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL3RzL215LWdhbWUvZXhhbXBsZS9yZWZlcnJhYmxlLmpzCkBAIC0wLDAgKzEsNzAgQEAKKy8vIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGJ5IHRoZSBGbGF0QnVmZmVycyBjb21waWxlciwgZG8gbm90IG1vZGlmeQoraW1wb3J0ICogYXMgZmxhdGJ1ZmZlcnMgZnJvbSAnZmxhdGJ1ZmZlcnMnOworZXhwb3J0IGNsYXNzIFJlZmVycmFibGUgeworICAgIGNvbnN0cnVjdG9yKCkgeworICAgICAgICB0aGlzLmJiID0gbnVsbDsKKyAgICAgICAgdGhpcy5iYl9wb3MgPSAwOworICAgIH0KKyAgICBfX2luaXQoaSwgYmIpIHsKKyAgICAgICAgdGhpcy5iYl9wb3MgPSBpOworICAgICAgICB0aGlzLmJiID0gYmI7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKyAgICBzdGF0aWMgZ2V0Um9vdEFzUmVmZXJyYWJsZShiYiwgb2JqKSB7CisgICAgICAgIHJldHVybiAob2JqIHx8IG5ldyBSZWZlcnJhYmxlKCkpLl9faW5pdChiYi5yZWFkSW50MzIoYmIucG9zaXRpb24oKSkgKyBiYi5wb3NpdGlvbigpLCBiYik7CisgICAgfQorICAgIHN0YXRpYyBnZXRTaXplUHJlZml4ZWRSb290QXNSZWZlcnJhYmxlKGJiLCBvYmopIHsKKyAgICAgICAgYmIuc2V0UG9zaXRpb24oYmIucG9zaXRpb24oKSArIGZsYXRidWZmZXJzLlNJWkVfUFJFRklYX0xFTkdUSCk7CisgICAgICAgIHJldHVybiAob2JqIHx8IG5ldyBSZWZlcnJhYmxlKCkpLl9faW5pdChiYi5yZWFkSW50MzIoYmIucG9zaXRpb24oKSkgKyBiYi5wb3NpdGlvbigpLCBiYik7CisgICAgfQorICAgIGlkKCkgeworICAgICAgICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCA0KTsKKyAgICAgICAgcmV0dXJuIG9mZnNldCA/IHRoaXMuYmIucmVhZFVpbnQ2NCh0aGlzLmJiX3BvcyArIG9mZnNldCkgOiBCaWdJbnQoJzAnKTsKKyAgICB9CisgICAgbXV0YXRlX2lkKHZhbHVlKSB7CisgICAgICAgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsIDQpOworICAgICAgICBpZiAob2Zmc2V0ID09PSAwKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgdGhpcy5iYi53cml0ZVVpbnQ2NCh0aGlzLmJiX3BvcyArIG9mZnNldCwgdmFsdWUpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgc3RhdGljIGdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpIHsKKyAgICAgICAgcmV0dXJuICdNeUdhbWVfRXhhbXBsZV9SZWZlcnJhYmxlJzsKKyAgICB9CisgICAgc3RhdGljIHN0YXJ0UmVmZXJyYWJsZShidWlsZGVyKSB7CisgICAgICAgIGJ1aWxkZXIuc3RhcnRPYmplY3QoMSk7CisgICAgfQorICAgIHN0YXRpYyBhZGRJZChidWlsZGVyLCBpZCkgeworICAgICAgICBidWlsZGVyLmFkZEZpZWxkSW50NjQoMCwgaWQsIEJpZ0ludCgnMCcpKTsKKyAgICB9CisgICAgc3RhdGljIGVuZFJlZmVycmFibGUoYnVpbGRlcikgeworICAgICAgICBjb25zdCBvZmZzZXQgPSBidWlsZGVyLmVuZE9iamVjdCgpOworICAgICAgICByZXR1cm4gb2Zmc2V0OworICAgIH0KKyAgICBzdGF0aWMgY3JlYXRlUmVmZXJyYWJsZShidWlsZGVyLCBpZCkgeworICAgICAgICBSZWZlcnJhYmxlLnN0YXJ0UmVmZXJyYWJsZShidWlsZGVyKTsKKyAgICAgICAgUmVmZXJyYWJsZS5hZGRJZChidWlsZGVyLCBpZCk7CisgICAgICAgIHJldHVybiBSZWZlcnJhYmxlLmVuZFJlZmVycmFibGUoYnVpbGRlcik7CisgICAgfQorICAgIHNlcmlhbGl6ZSgpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuYmIuYnl0ZXMoKTsKKyAgICB9CisgICAgc3RhdGljIGRlc2VyaWFsaXplKGJ1ZmZlcikgeworICAgICAgICByZXR1cm4gUmVmZXJyYWJsZS5nZXRSb290QXNSZWZlcnJhYmxlKG5ldyBmbGF0YnVmZmVycy5CeXRlQnVmZmVyKGJ1ZmZlcikpOworICAgIH0KKyAgICB1bnBhY2soKSB7CisgICAgICAgIHJldHVybiBuZXcgUmVmZXJyYWJsZVQodGhpcy5pZCgpKTsKKyAgICB9CisgICAgdW5wYWNrVG8oX28pIHsKKyAgICAgICAgX28uaWQgPSB0aGlzLmlkKCk7CisgICAgfQorfQorZXhwb3J0IGNsYXNzIFJlZmVycmFibGVUIHsKKyAgICBjb25zdHJ1Y3RvcihpZCA9IEJpZ0ludCgnMCcpKSB7CisgICAgICAgIHRoaXMuaWQgPSBpZDsKKyAgICB9CisgICAgcGFjayhidWlsZGVyKSB7CisgICAgICAgIHJldHVybiBSZWZlcnJhYmxlLmNyZWF0ZVJlZmVycmFibGUoYnVpbGRlciwgdGhpcy5pZCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvdHMvbXktZ2FtZS9leGFtcGxlL3JlZmVycmFibGUudHMgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy90cy9teS1nYW1lL2V4YW1wbGUvcmVmZXJyYWJsZS50cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYzAyOTgwCi0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvdHMvbXktZ2FtZS9leGFtcGxlL3JlZmVycmFibGUudHMKQEAgLTAsMCArMSw5NSBAQAorLy8gYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgYnkgdGhlIEZsYXRCdWZmZXJzIGNvbXBpbGVyLCBkbyBub3QgbW9kaWZ5CisKK2ltcG9ydCAqIGFzIGZsYXRidWZmZXJzIGZyb20gJ2ZsYXRidWZmZXJzJzsKKworCisKK2V4cG9ydCBjbGFzcyBSZWZlcnJhYmxlIHsKKyAgYmI6IGZsYXRidWZmZXJzLkJ5dGVCdWZmZXJ8bnVsbCA9IG51bGw7CisgIGJiX3BvcyA9IDA7CisgIF9faW5pdChpOm51bWJlciwgYmI6ZmxhdGJ1ZmZlcnMuQnl0ZUJ1ZmZlcik6UmVmZXJyYWJsZSB7CisgIHRoaXMuYmJfcG9zID0gaTsKKyAgdGhpcy5iYiA9IGJiOworICByZXR1cm4gdGhpczsKK30KKworc3RhdGljIGdldFJvb3RBc1JlZmVycmFibGUoYmI6ZmxhdGJ1ZmZlcnMuQnl0ZUJ1ZmZlciwgb2JqPzpSZWZlcnJhYmxlKTpSZWZlcnJhYmxlIHsKKyAgcmV0dXJuIChvYmogfHwgbmV3IFJlZmVycmFibGUoKSkuX19pbml0KGJiLnJlYWRJbnQzMihiYi5wb3NpdGlvbigpKSArIGJiLnBvc2l0aW9uKCksIGJiKTsKK30KKworc3RhdGljIGdldFNpemVQcmVmaXhlZFJvb3RBc1JlZmVycmFibGUoYmI6ZmxhdGJ1ZmZlcnMuQnl0ZUJ1ZmZlciwgb2JqPzpSZWZlcnJhYmxlKTpSZWZlcnJhYmxlIHsKKyAgYmIuc2V0UG9zaXRpb24oYmIucG9zaXRpb24oKSArIGZsYXRidWZmZXJzLlNJWkVfUFJFRklYX0xFTkdUSCk7CisgIHJldHVybiAob2JqIHx8IG5ldyBSZWZlcnJhYmxlKCkpLl9faW5pdChiYi5yZWFkSW50MzIoYmIucG9zaXRpb24oKSkgKyBiYi5wb3NpdGlvbigpLCBiYik7Cit9CisKK2lkKCk6YmlnaW50IHsKKyAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYiEuX19vZmZzZXQodGhpcy5iYl9wb3MsIDQpOworICByZXR1cm4gb2Zmc2V0ID8gdGhpcy5iYiEucmVhZFVpbnQ2NCh0aGlzLmJiX3BvcyArIG9mZnNldCkgOiBCaWdJbnQoJzAnKTsKK30KKworbXV0YXRlX2lkKHZhbHVlOmJpZ2ludCk6Ym9vbGVhbiB7CisgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIhLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCA0KTsKKworICBpZiAob2Zmc2V0ID09PSAwKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgdGhpcy5iYiEud3JpdGVVaW50NjQodGhpcy5iYl9wb3MgKyBvZmZzZXQsIHZhbHVlKTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyBnZXRGdWxseVF1YWxpZmllZE5hbWUoKTpzdHJpbmcgeworICByZXR1cm4gJ015R2FtZV9FeGFtcGxlX1JlZmVycmFibGUnOworfQorCitzdGF0aWMgc3RhcnRSZWZlcnJhYmxlKGJ1aWxkZXI6ZmxhdGJ1ZmZlcnMuQnVpbGRlcikgeworICBidWlsZGVyLnN0YXJ0T2JqZWN0KDEpOworfQorCitzdGF0aWMgYWRkSWQoYnVpbGRlcjpmbGF0YnVmZmVycy5CdWlsZGVyLCBpZDpiaWdpbnQpIHsKKyAgYnVpbGRlci5hZGRGaWVsZEludDY0KDAsIGlkLCBCaWdJbnQoJzAnKSk7Cit9CisKK3N0YXRpYyBlbmRSZWZlcnJhYmxlKGJ1aWxkZXI6ZmxhdGJ1ZmZlcnMuQnVpbGRlcik6ZmxhdGJ1ZmZlcnMuT2Zmc2V0IHsKKyAgY29uc3Qgb2Zmc2V0ID0gYnVpbGRlci5lbmRPYmplY3QoKTsKKyAgcmV0dXJuIG9mZnNldDsKK30KKworc3RhdGljIGNyZWF0ZVJlZmVycmFibGUoYnVpbGRlcjpmbGF0YnVmZmVycy5CdWlsZGVyLCBpZDpiaWdpbnQpOmZsYXRidWZmZXJzLk9mZnNldCB7CisgIFJlZmVycmFibGUuc3RhcnRSZWZlcnJhYmxlKGJ1aWxkZXIpOworICBSZWZlcnJhYmxlLmFkZElkKGJ1aWxkZXIsIGlkKTsKKyAgcmV0dXJuIFJlZmVycmFibGUuZW5kUmVmZXJyYWJsZShidWlsZGVyKTsKK30KKworc2VyaWFsaXplKCk6VWludDhBcnJheSB7CisgIHJldHVybiB0aGlzLmJiIS5ieXRlcygpOworfQorCitzdGF0aWMgZGVzZXJpYWxpemUoYnVmZmVyOiBVaW50OEFycmF5KTpSZWZlcnJhYmxlIHsKKyAgcmV0dXJuIFJlZmVycmFibGUuZ2V0Um9vdEFzUmVmZXJyYWJsZShuZXcgZmxhdGJ1ZmZlcnMuQnl0ZUJ1ZmZlcihidWZmZXIpKQorfQorCit1bnBhY2soKTogUmVmZXJyYWJsZVQgeworICByZXR1cm4gbmV3IFJlZmVycmFibGVUKAorICAgIHRoaXMuaWQoKQorICApOworfQorCisKK3VucGFja1RvKF9vOiBSZWZlcnJhYmxlVCk6IHZvaWQgeworICBfby5pZCA9IHRoaXMuaWQoKTsKK30KK30KKworZXhwb3J0IGNsYXNzIFJlZmVycmFibGVUIHsKK2NvbnN0cnVjdG9yKAorICBwdWJsaWMgaWQ6IGJpZ2ludCA9IEJpZ0ludCgnMCcpCispe30KKworCitwYWNrKGJ1aWxkZXI6ZmxhdGJ1ZmZlcnMuQnVpbGRlcik6IGZsYXRidWZmZXJzLk9mZnNldCB7CisgIHJldHVybiBSZWZlcnJhYmxlLmNyZWF0ZVJlZmVycmFibGUoYnVpbGRlciwKKyAgICB0aGlzLmlkCisgICk7Cit9Cit9CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy90cy9teS1nYW1lL2V4YW1wbGUvc3RhdC5qcyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL3RzL215LWdhbWUvZXhhbXBsZS9zdGF0LmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQzYjU2OWYKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy90cy9teS1nYW1lL2V4YW1wbGUvc3RhdC5qcwpAQCAtMCwwICsxLDk5IEBACisvLyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBieSB0aGUgRmxhdEJ1ZmZlcnMgY29tcGlsZXIsIGRvIG5vdCBtb2RpZnkKK2ltcG9ydCAqIGFzIGZsYXRidWZmZXJzIGZyb20gJ2ZsYXRidWZmZXJzJzsKK2V4cG9ydCBjbGFzcyBTdGF0IHsKKyAgICBjb25zdHJ1Y3RvcigpIHsKKyAgICAgICAgdGhpcy5iYiA9IG51bGw7CisgICAgICAgIHRoaXMuYmJfcG9zID0gMDsKKyAgICB9CisgICAgX19pbml0KGksIGJiKSB7CisgICAgICAgIHRoaXMuYmJfcG9zID0gaTsKKyAgICAgICAgdGhpcy5iYiA9IGJiOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisgICAgc3RhdGljIGdldFJvb3RBc1N0YXQoYmIsIG9iaikgeworICAgICAgICByZXR1cm4gKG9iaiB8fCBuZXcgU3RhdCgpKS5fX2luaXQoYmIucmVhZEludDMyKGJiLnBvc2l0aW9uKCkpICsgYmIucG9zaXRpb24oKSwgYmIpOworICAgIH0KKyAgICBzdGF0aWMgZ2V0U2l6ZVByZWZpeGVkUm9vdEFzU3RhdChiYiwgb2JqKSB7CisgICAgICAgIGJiLnNldFBvc2l0aW9uKGJiLnBvc2l0aW9uKCkgKyBmbGF0YnVmZmVycy5TSVpFX1BSRUZJWF9MRU5HVEgpOworICAgICAgICByZXR1cm4gKG9iaiB8fCBuZXcgU3RhdCgpKS5fX2luaXQoYmIucmVhZEludDMyKGJiLnBvc2l0aW9uKCkpICsgYmIucG9zaXRpb24oKSwgYmIpOworICAgIH0KKyAgICBpZChvcHRpb25hbEVuY29kaW5nKSB7CisgICAgICAgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsIDQpOworICAgICAgICByZXR1cm4gb2Zmc2V0ID8gdGhpcy5iYi5fX3N0cmluZyh0aGlzLmJiX3BvcyArIG9mZnNldCwgb3B0aW9uYWxFbmNvZGluZykgOiBudWxsOworICAgIH0KKyAgICB2YWwoKSB7CisgICAgICAgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsIDYpOworICAgICAgICByZXR1cm4gb2Zmc2V0ID8gdGhpcy5iYi5yZWFkSW50NjQodGhpcy5iYl9wb3MgKyBvZmZzZXQpIDogQmlnSW50KCcwJyk7CisgICAgfQorICAgIG11dGF0ZV92YWwodmFsdWUpIHsKKyAgICAgICAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywgNik7CisgICAgICAgIGlmIChvZmZzZXQgPT09IDApIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICB0aGlzLmJiLndyaXRlSW50NjQodGhpcy5iYl9wb3MgKyBvZmZzZXQsIHZhbHVlKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIGNvdW50KCkgeworICAgICAgICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCA4KTsKKyAgICAgICAgcmV0dXJuIG9mZnNldCA/IHRoaXMuYmIucmVhZFVpbnQxNih0aGlzLmJiX3BvcyArIG9mZnNldCkgOiAwOworICAgIH0KKyAgICBtdXRhdGVfY291bnQodmFsdWUpIHsKKyAgICAgICAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywgOCk7CisgICAgICAgIGlmIChvZmZzZXQgPT09IDApIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICB0aGlzLmJiLndyaXRlVWludDE2KHRoaXMuYmJfcG9zICsgb2Zmc2V0LCB2YWx1ZSk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICBzdGF0aWMgZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCkgeworICAgICAgICByZXR1cm4gJ015R2FtZV9FeGFtcGxlX1N0YXQnOworICAgIH0KKyAgICBzdGF0aWMgc3RhcnRTdGF0KGJ1aWxkZXIpIHsKKyAgICAgICAgYnVpbGRlci5zdGFydE9iamVjdCgzKTsKKyAgICB9CisgICAgc3RhdGljIGFkZElkKGJ1aWxkZXIsIGlkT2Zmc2V0KSB7CisgICAgICAgIGJ1aWxkZXIuYWRkRmllbGRPZmZzZXQoMCwgaWRPZmZzZXQsIDApOworICAgIH0KKyAgICBzdGF0aWMgYWRkVmFsKGJ1aWxkZXIsIHZhbCkgeworICAgICAgICBidWlsZGVyLmFkZEZpZWxkSW50NjQoMSwgdmFsLCBCaWdJbnQoJzAnKSk7CisgICAgfQorICAgIHN0YXRpYyBhZGRDb3VudChidWlsZGVyLCBjb3VudCkgeworICAgICAgICBidWlsZGVyLmFkZEZpZWxkSW50MTYoMiwgY291bnQsIDApOworICAgIH0KKyAgICBzdGF0aWMgZW5kU3RhdChidWlsZGVyKSB7CisgICAgICAgIGNvbnN0IG9mZnNldCA9IGJ1aWxkZXIuZW5kT2JqZWN0KCk7CisgICAgICAgIHJldHVybiBvZmZzZXQ7CisgICAgfQorICAgIHN0YXRpYyBjcmVhdGVTdGF0KGJ1aWxkZXIsIGlkT2Zmc2V0LCB2YWwsIGNvdW50KSB7CisgICAgICAgIFN0YXQuc3RhcnRTdGF0KGJ1aWxkZXIpOworICAgICAgICBTdGF0LmFkZElkKGJ1aWxkZXIsIGlkT2Zmc2V0KTsKKyAgICAgICAgU3RhdC5hZGRWYWwoYnVpbGRlciwgdmFsKTsKKyAgICAgICAgU3RhdC5hZGRDb3VudChidWlsZGVyLCBjb3VudCk7CisgICAgICAgIHJldHVybiBTdGF0LmVuZFN0YXQoYnVpbGRlcik7CisgICAgfQorICAgIHNlcmlhbGl6ZSgpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuYmIuYnl0ZXMoKTsKKyAgICB9CisgICAgc3RhdGljIGRlc2VyaWFsaXplKGJ1ZmZlcikgeworICAgICAgICByZXR1cm4gU3RhdC5nZXRSb290QXNTdGF0KG5ldyBmbGF0YnVmZmVycy5CeXRlQnVmZmVyKGJ1ZmZlcikpOworICAgIH0KKyAgICB1bnBhY2soKSB7CisgICAgICAgIHJldHVybiBuZXcgU3RhdFQodGhpcy5pZCgpLCB0aGlzLnZhbCgpLCB0aGlzLmNvdW50KCkpOworICAgIH0KKyAgICB1bnBhY2tUbyhfbykgeworICAgICAgICBfby5pZCA9IHRoaXMuaWQoKTsKKyAgICAgICAgX28udmFsID0gdGhpcy52YWwoKTsKKyAgICAgICAgX28uY291bnQgPSB0aGlzLmNvdW50KCk7CisgICAgfQorfQorZXhwb3J0IGNsYXNzIFN0YXRUIHsKKyAgICBjb25zdHJ1Y3RvcihpZCA9IG51bGwsIHZhbCA9IEJpZ0ludCgnMCcpLCBjb3VudCA9IDApIHsKKyAgICAgICAgdGhpcy5pZCA9IGlkOworICAgICAgICB0aGlzLnZhbCA9IHZhbDsKKyAgICAgICAgdGhpcy5jb3VudCA9IGNvdW50OworICAgIH0KKyAgICBwYWNrKGJ1aWxkZXIpIHsKKyAgICAgICAgY29uc3QgaWQgPSAodGhpcy5pZCAhPT0gbnVsbCA/IGJ1aWxkZXIuY3JlYXRlU3RyaW5nKHRoaXMuaWQpIDogMCk7CisgICAgICAgIHJldHVybiBTdGF0LmNyZWF0ZVN0YXQoYnVpbGRlciwgaWQsIHRoaXMudmFsLCB0aGlzLmNvdW50KTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy90cy9teS1nYW1lL2V4YW1wbGUvc3RhdC50cyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL3RzL215LWdhbWUvZXhhbXBsZS9zdGF0LnRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU0NTI1OTkKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy90cy9teS1nYW1lL2V4YW1wbGUvc3RhdC50cwpAQCAtMCwwICsxLDEzOCBAQAorLy8gYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgYnkgdGhlIEZsYXRCdWZmZXJzIGNvbXBpbGVyLCBkbyBub3QgbW9kaWZ5CisKK2ltcG9ydCAqIGFzIGZsYXRidWZmZXJzIGZyb20gJ2ZsYXRidWZmZXJzJzsKKworCisKK2V4cG9ydCBjbGFzcyBTdGF0IHsKKyAgYmI6IGZsYXRidWZmZXJzLkJ5dGVCdWZmZXJ8bnVsbCA9IG51bGw7CisgIGJiX3BvcyA9IDA7CisgIF9faW5pdChpOm51bWJlciwgYmI6ZmxhdGJ1ZmZlcnMuQnl0ZUJ1ZmZlcik6U3RhdCB7CisgIHRoaXMuYmJfcG9zID0gaTsKKyAgdGhpcy5iYiA9IGJiOworICByZXR1cm4gdGhpczsKK30KKworc3RhdGljIGdldFJvb3RBc1N0YXQoYmI6ZmxhdGJ1ZmZlcnMuQnl0ZUJ1ZmZlciwgb2JqPzpTdGF0KTpTdGF0IHsKKyAgcmV0dXJuIChvYmogfHwgbmV3IFN0YXQoKSkuX19pbml0KGJiLnJlYWRJbnQzMihiYi5wb3NpdGlvbigpKSArIGJiLnBvc2l0aW9uKCksIGJiKTsKK30KKworc3RhdGljIGdldFNpemVQcmVmaXhlZFJvb3RBc1N0YXQoYmI6ZmxhdGJ1ZmZlcnMuQnl0ZUJ1ZmZlciwgb2JqPzpTdGF0KTpTdGF0IHsKKyAgYmIuc2V0UG9zaXRpb24oYmIucG9zaXRpb24oKSArIGZsYXRidWZmZXJzLlNJWkVfUFJFRklYX0xFTkdUSCk7CisgIHJldHVybiAob2JqIHx8IG5ldyBTdGF0KCkpLl9faW5pdChiYi5yZWFkSW50MzIoYmIucG9zaXRpb24oKSkgKyBiYi5wb3NpdGlvbigpLCBiYik7Cit9CisKK2lkKCk6c3RyaW5nfG51bGwKK2lkKG9wdGlvbmFsRW5jb2Rpbmc6ZmxhdGJ1ZmZlcnMuRW5jb2RpbmcpOnN0cmluZ3xVaW50OEFycmF5fG51bGwKK2lkKG9wdGlvbmFsRW5jb2Rpbmc/OmFueSk6c3RyaW5nfFVpbnQ4QXJyYXl8bnVsbCB7CisgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIhLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCA0KTsKKyAgcmV0dXJuIG9mZnNldCA/IHRoaXMuYmIhLl9fc3RyaW5nKHRoaXMuYmJfcG9zICsgb2Zmc2V0LCBvcHRpb25hbEVuY29kaW5nKSA6IG51bGw7Cit9CisKK3ZhbCgpOmJpZ2ludCB7CisgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIhLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCA2KTsKKyAgcmV0dXJuIG9mZnNldCA/IHRoaXMuYmIhLnJlYWRJbnQ2NCh0aGlzLmJiX3BvcyArIG9mZnNldCkgOiBCaWdJbnQoJzAnKTsKK30KKworbXV0YXRlX3ZhbCh2YWx1ZTpiaWdpbnQpOmJvb2xlYW4geworICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiIS5fX29mZnNldCh0aGlzLmJiX3BvcywgNik7CisKKyAgaWYgKG9mZnNldCA9PT0gMCkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHRoaXMuYmIhLndyaXRlSW50NjQodGhpcy5iYl9wb3MgKyBvZmZzZXQsIHZhbHVlKTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK2NvdW50KCk6bnVtYmVyIHsKKyAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYiEuX19vZmZzZXQodGhpcy5iYl9wb3MsIDgpOworICByZXR1cm4gb2Zmc2V0ID8gdGhpcy5iYiEucmVhZFVpbnQxNih0aGlzLmJiX3BvcyArIG9mZnNldCkgOiAwOworfQorCittdXRhdGVfY291bnQodmFsdWU6bnVtYmVyKTpib29sZWFuIHsKKyAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYiEuX19vZmZzZXQodGhpcy5iYl9wb3MsIDgpOworCisgIGlmIChvZmZzZXQgPT09IDApIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICB0aGlzLmJiIS53cml0ZVVpbnQxNih0aGlzLmJiX3BvcyArIG9mZnNldCwgdmFsdWUpOworICByZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIGdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpOnN0cmluZyB7CisgIHJldHVybiAnTXlHYW1lX0V4YW1wbGVfU3RhdCc7Cit9CisKK3N0YXRpYyBzdGFydFN0YXQoYnVpbGRlcjpmbGF0YnVmZmVycy5CdWlsZGVyKSB7CisgIGJ1aWxkZXIuc3RhcnRPYmplY3QoMyk7Cit9CisKK3N0YXRpYyBhZGRJZChidWlsZGVyOmZsYXRidWZmZXJzLkJ1aWxkZXIsIGlkT2Zmc2V0OmZsYXRidWZmZXJzLk9mZnNldCkgeworICBidWlsZGVyLmFkZEZpZWxkT2Zmc2V0KDAsIGlkT2Zmc2V0LCAwKTsKK30KKworc3RhdGljIGFkZFZhbChidWlsZGVyOmZsYXRidWZmZXJzLkJ1aWxkZXIsIHZhbDpiaWdpbnQpIHsKKyAgYnVpbGRlci5hZGRGaWVsZEludDY0KDEsIHZhbCwgQmlnSW50KCcwJykpOworfQorCitzdGF0aWMgYWRkQ291bnQoYnVpbGRlcjpmbGF0YnVmZmVycy5CdWlsZGVyLCBjb3VudDpudW1iZXIpIHsKKyAgYnVpbGRlci5hZGRGaWVsZEludDE2KDIsIGNvdW50LCAwKTsKK30KKworc3RhdGljIGVuZFN0YXQoYnVpbGRlcjpmbGF0YnVmZmVycy5CdWlsZGVyKTpmbGF0YnVmZmVycy5PZmZzZXQgeworICBjb25zdCBvZmZzZXQgPSBidWlsZGVyLmVuZE9iamVjdCgpOworICByZXR1cm4gb2Zmc2V0OworfQorCitzdGF0aWMgY3JlYXRlU3RhdChidWlsZGVyOmZsYXRidWZmZXJzLkJ1aWxkZXIsIGlkT2Zmc2V0OmZsYXRidWZmZXJzLk9mZnNldCwgdmFsOmJpZ2ludCwgY291bnQ6bnVtYmVyKTpmbGF0YnVmZmVycy5PZmZzZXQgeworICBTdGF0LnN0YXJ0U3RhdChidWlsZGVyKTsKKyAgU3RhdC5hZGRJZChidWlsZGVyLCBpZE9mZnNldCk7CisgIFN0YXQuYWRkVmFsKGJ1aWxkZXIsIHZhbCk7CisgIFN0YXQuYWRkQ291bnQoYnVpbGRlciwgY291bnQpOworICByZXR1cm4gU3RhdC5lbmRTdGF0KGJ1aWxkZXIpOworfQorCitzZXJpYWxpemUoKTpVaW50OEFycmF5IHsKKyAgcmV0dXJuIHRoaXMuYmIhLmJ5dGVzKCk7Cit9CisKK3N0YXRpYyBkZXNlcmlhbGl6ZShidWZmZXI6IFVpbnQ4QXJyYXkpOlN0YXQgeworICByZXR1cm4gU3RhdC5nZXRSb290QXNTdGF0KG5ldyBmbGF0YnVmZmVycy5CeXRlQnVmZmVyKGJ1ZmZlcikpCit9CisKK3VucGFjaygpOiBTdGF0VCB7CisgIHJldHVybiBuZXcgU3RhdFQoCisgICAgdGhpcy5pZCgpLAorICAgIHRoaXMudmFsKCksCisgICAgdGhpcy5jb3VudCgpCisgICk7Cit9CisKKwordW5wYWNrVG8oX286IFN0YXRUKTogdm9pZCB7CisgIF9vLmlkID0gdGhpcy5pZCgpOworICBfby52YWwgPSB0aGlzLnZhbCgpOworICBfby5jb3VudCA9IHRoaXMuY291bnQoKTsKK30KK30KKworZXhwb3J0IGNsYXNzIFN0YXRUIHsKK2NvbnN0cnVjdG9yKAorICBwdWJsaWMgaWQ6IHN0cmluZ3xVaW50OEFycmF5fG51bGwgPSBudWxsLAorICBwdWJsaWMgdmFsOiBiaWdpbnQgPSBCaWdJbnQoJzAnKSwKKyAgcHVibGljIGNvdW50OiBudW1iZXIgPSAwCispe30KKworCitwYWNrKGJ1aWxkZXI6ZmxhdGJ1ZmZlcnMuQnVpbGRlcik6IGZsYXRidWZmZXJzLk9mZnNldCB7CisgIGNvbnN0IGlkID0gKHRoaXMuaWQgIT09IG51bGwgPyBidWlsZGVyLmNyZWF0ZVN0cmluZyh0aGlzLmlkISkgOiAwKTsKKworICByZXR1cm4gU3RhdC5jcmVhdGVTdGF0KGJ1aWxkZXIsCisgICAgaWQsCisgICAgdGhpcy52YWwsCisgICAgdGhpcy5jb3VudAorICApOworfQorfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvdHMvbXktZ2FtZS9leGFtcGxlL3N0cnVjdC1vZi1zdHJ1Y3RzLW9mLXN0cnVjdHMuanMgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy90cy9teS1nYW1lL2V4YW1wbGUvc3RydWN0LW9mLXN0cnVjdHMtb2Ytc3RydWN0cy5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNWZiYzY2Ci0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvdHMvbXktZ2FtZS9leGFtcGxlL3N0cnVjdC1vZi1zdHJ1Y3RzLW9mLXN0cnVjdHMuanMKQEAgLTAsMCArMSw1MiBAQAorLy8gYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgYnkgdGhlIEZsYXRCdWZmZXJzIGNvbXBpbGVyLCBkbyBub3QgbW9kaWZ5CitpbXBvcnQgeyBTdHJ1Y3RPZlN0cnVjdHMgfSBmcm9tICcuLi8uLi9teS1nYW1lL2V4YW1wbGUvc3RydWN0LW9mLXN0cnVjdHMuanMnOworZXhwb3J0IGNsYXNzIFN0cnVjdE9mU3RydWN0c09mU3RydWN0cyB7CisgICAgY29uc3RydWN0b3IoKSB7CisgICAgICAgIHRoaXMuYmIgPSBudWxsOworICAgICAgICB0aGlzLmJiX3BvcyA9IDA7CisgICAgfQorICAgIF9faW5pdChpLCBiYikgeworICAgICAgICB0aGlzLmJiX3BvcyA9IGk7CisgICAgICAgIHRoaXMuYmIgPSBiYjsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorICAgIGEob2JqKSB7CisgICAgICAgIHJldHVybiAob2JqIHx8IG5ldyBTdHJ1Y3RPZlN0cnVjdHMoKSkuX19pbml0KHRoaXMuYmJfcG9zLCB0aGlzLmJiKTsKKyAgICB9CisgICAgc3RhdGljIGdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpIHsKKyAgICAgICAgcmV0dXJuICdNeUdhbWVfRXhhbXBsZV9TdHJ1Y3RPZlN0cnVjdHNPZlN0cnVjdHMnOworICAgIH0KKyAgICBzdGF0aWMgc2l6ZU9mKCkgeworICAgICAgICByZXR1cm4gMjA7CisgICAgfQorICAgIHN0YXRpYyBjcmVhdGVTdHJ1Y3RPZlN0cnVjdHNPZlN0cnVjdHMoYnVpbGRlciwgYV9hX2lkLCBhX2FfZGlzdGFuY2UsIGFfYl9hLCBhX2JfYiwgYV9jX2lkLCBhX2NfZGlzdGFuY2UpIHsKKyAgICAgICAgYnVpbGRlci5wcmVwKDQsIDIwKTsKKyAgICAgICAgYnVpbGRlci5wcmVwKDQsIDIwKTsKKyAgICAgICAgYnVpbGRlci5wcmVwKDQsIDgpOworICAgICAgICBidWlsZGVyLndyaXRlSW50MzIoYV9jX2Rpc3RhbmNlKTsKKyAgICAgICAgYnVpbGRlci53cml0ZUludDMyKGFfY19pZCk7CisgICAgICAgIGJ1aWxkZXIucHJlcCgyLCA0KTsKKyAgICAgICAgYnVpbGRlci5wYWQoMSk7CisgICAgICAgIGJ1aWxkZXIud3JpdGVJbnQ4KGFfYl9iKTsKKyAgICAgICAgYnVpbGRlci53cml0ZUludDE2KGFfYl9hKTsKKyAgICAgICAgYnVpbGRlci5wcmVwKDQsIDgpOworICAgICAgICBidWlsZGVyLndyaXRlSW50MzIoYV9hX2Rpc3RhbmNlKTsKKyAgICAgICAgYnVpbGRlci53cml0ZUludDMyKGFfYV9pZCk7CisgICAgICAgIHJldHVybiBidWlsZGVyLm9mZnNldCgpOworICAgIH0KKyAgICB1bnBhY2soKSB7CisgICAgICAgIHJldHVybiBuZXcgU3RydWN0T2ZTdHJ1Y3RzT2ZTdHJ1Y3RzVCgodGhpcy5hKCkgIT09IG51bGwgPyB0aGlzLmEoKS51bnBhY2soKSA6IG51bGwpKTsKKyAgICB9CisgICAgdW5wYWNrVG8oX28pIHsKKyAgICAgICAgX28uYSA9ICh0aGlzLmEoKSAhPT0gbnVsbCA/IHRoaXMuYSgpLnVucGFjaygpIDogbnVsbCk7CisgICAgfQorfQorZXhwb3J0IGNsYXNzIFN0cnVjdE9mU3RydWN0c09mU3RydWN0c1QgeworICAgIGNvbnN0cnVjdG9yKGEgPSBudWxsKSB7CisgICAgICAgIHRoaXMuYSA9IGE7CisgICAgfQorICAgIHBhY2soYnVpbGRlcikgeworICAgICAgICB2YXIgX2EsIF9iLCBfYywgX2QsIF9lLCBfZiwgX2csIF9oLCBfaiwgX2ssIF9sLCBfbSwgX3AsIF9xLCBfciwgX3MsIF90LCBfdTsKKyAgICAgICAgcmV0dXJuIFN0cnVjdE9mU3RydWN0c09mU3RydWN0cy5jcmVhdGVTdHJ1Y3RPZlN0cnVjdHNPZlN0cnVjdHMoYnVpbGRlciwgKChfYyA9IChfYiA9IChfYSA9IHRoaXMuYSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmEpID09PSBudWxsIHx8IF9iID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYi5pZCkgIT09IG51bGwgJiYgX2MgIT09IHZvaWQgMCA/IF9jIDogMCksICgoX2YgPSAoX2UgPSAoX2QgPSB0aGlzLmEpID09PSBudWxsIHx8IF9kID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfZC5hKSA9PT0gbnVsbCB8fCBfZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2UuZGlzdGFuY2UpICE9PSBudWxsICYmIF9mICE9PSB2b2lkIDAgPyBfZiA6IDApLCAoKF9qID0gKF9oID0gKF9nID0gdGhpcy5hKSA9PT0gbnVsbCB8fCBfZyA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2cuYikgPT09IG51bGwgfHwgX2ggPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9oLmEpICE9PSBudWxsICYmIF9qICE9PSB2b2lkIDAgPyBfaiA6IDApLCAoKF9tID0gKF9sID0gKF9rID0gdGhpcy5hKSA9PT0gbnVsbCB8fCBfayA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2suYikgPT09IG51bGwgfHwgX2wgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9sLmIpICE9PSBudWxsICYmIF9tICE9PSB2b2lkIDAgPyBfbSA6IDApLCAoKF9yID0gKF9xID0gKF9wID0gdGhpcy5hKSA9PT0gbnVsbCB8fCBfcCA9PT0gdm9pZCAwID8gdm9pZCAwIDogX3AuYykgPT09IG51bGwgfHwgX3EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9xLmlkKSAhPT0gbnVsbCAmJiBfciAhPT0gdm9pZCAwID8gX3IgOiAwKSwgKChfdSA9IChfdCA9IChfcyA9IHRoaXMuYSkgPT09IG51bGwgfHwgX3MgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9zLmMpID09PSBudWxsIHx8IF90ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfdC5kaXN0YW5jZSkgIT09IG51bGwgJiYgX3UgIT09IHZvaWQgMCA/IF91IDogMCkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL3RzL215LWdhbWUvZXhhbXBsZS9zdHJ1Y3Qtb2Ytc3RydWN0cy1vZi1zdHJ1Y3RzLnRzIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvdHMvbXktZ2FtZS9leGFtcGxlL3N0cnVjdC1vZi1zdHJ1Y3RzLW9mLXN0cnVjdHMudHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTJlZmMxMgotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL3RzL215LWdhbWUvZXhhbXBsZS9zdHJ1Y3Qtb2Ytc3RydWN0cy1vZi1zdHJ1Y3RzLnRzCkBAIC0wLDAgKzEsNzQgQEAKKy8vIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGJ5IHRoZSBGbGF0QnVmZmVycyBjb21waWxlciwgZG8gbm90IG1vZGlmeQorCitpbXBvcnQgKiBhcyBmbGF0YnVmZmVycyBmcm9tICdmbGF0YnVmZmVycyc7CisKK2ltcG9ydCB7IFN0cnVjdE9mU3RydWN0cywgU3RydWN0T2ZTdHJ1Y3RzVCB9IGZyb20gJy4uLy4uL215LWdhbWUvZXhhbXBsZS9zdHJ1Y3Qtb2Ytc3RydWN0cy5qcyc7CisKKworZXhwb3J0IGNsYXNzIFN0cnVjdE9mU3RydWN0c09mU3RydWN0cyB7CisgIGJiOiBmbGF0YnVmZmVycy5CeXRlQnVmZmVyfG51bGwgPSBudWxsOworICBiYl9wb3MgPSAwOworICBfX2luaXQoaTpudW1iZXIsIGJiOmZsYXRidWZmZXJzLkJ5dGVCdWZmZXIpOlN0cnVjdE9mU3RydWN0c09mU3RydWN0cyB7CisgIHRoaXMuYmJfcG9zID0gaTsKKyAgdGhpcy5iYiA9IGJiOworICByZXR1cm4gdGhpczsKK30KKworYShvYmo/OlN0cnVjdE9mU3RydWN0cyk6U3RydWN0T2ZTdHJ1Y3RzfG51bGwgeworICByZXR1cm4gKG9iaiB8fCBuZXcgU3RydWN0T2ZTdHJ1Y3RzKCkpLl9faW5pdCh0aGlzLmJiX3BvcywgdGhpcy5iYiEpOworfQorCitzdGF0aWMgZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCk6c3RyaW5nIHsKKyAgcmV0dXJuICdNeUdhbWVfRXhhbXBsZV9TdHJ1Y3RPZlN0cnVjdHNPZlN0cnVjdHMnOworfQorCitzdGF0aWMgc2l6ZU9mKCk6bnVtYmVyIHsKKyAgcmV0dXJuIDIwOworfQorCitzdGF0aWMgY3JlYXRlU3RydWN0T2ZTdHJ1Y3RzT2ZTdHJ1Y3RzKGJ1aWxkZXI6ZmxhdGJ1ZmZlcnMuQnVpbGRlciwgYV9hX2lkOiBudW1iZXIsIGFfYV9kaXN0YW5jZTogbnVtYmVyLCBhX2JfYTogbnVtYmVyLCBhX2JfYjogbnVtYmVyLCBhX2NfaWQ6IG51bWJlciwgYV9jX2Rpc3RhbmNlOiBudW1iZXIpOmZsYXRidWZmZXJzLk9mZnNldCB7CisgIGJ1aWxkZXIucHJlcCg0LCAyMCk7CisgIGJ1aWxkZXIucHJlcCg0LCAyMCk7CisgIGJ1aWxkZXIucHJlcCg0LCA4KTsKKyAgYnVpbGRlci53cml0ZUludDMyKGFfY19kaXN0YW5jZSk7CisgIGJ1aWxkZXIud3JpdGVJbnQzMihhX2NfaWQpOworICBidWlsZGVyLnByZXAoMiwgNCk7CisgIGJ1aWxkZXIucGFkKDEpOworICBidWlsZGVyLndyaXRlSW50OChhX2JfYik7CisgIGJ1aWxkZXIud3JpdGVJbnQxNihhX2JfYSk7CisgIGJ1aWxkZXIucHJlcCg0LCA4KTsKKyAgYnVpbGRlci53cml0ZUludDMyKGFfYV9kaXN0YW5jZSk7CisgIGJ1aWxkZXIud3JpdGVJbnQzMihhX2FfaWQpOworICByZXR1cm4gYnVpbGRlci5vZmZzZXQoKTsKK30KKworCit1bnBhY2soKTogU3RydWN0T2ZTdHJ1Y3RzT2ZTdHJ1Y3RzVCB7CisgIHJldHVybiBuZXcgU3RydWN0T2ZTdHJ1Y3RzT2ZTdHJ1Y3RzVCgKKyAgICAodGhpcy5hKCkgIT09IG51bGwgPyB0aGlzLmEoKSEudW5wYWNrKCkgOiBudWxsKQorICApOworfQorCisKK3VucGFja1RvKF9vOiBTdHJ1Y3RPZlN0cnVjdHNPZlN0cnVjdHNUKTogdm9pZCB7CisgIF9vLmEgPSAodGhpcy5hKCkgIT09IG51bGwgPyB0aGlzLmEoKSEudW5wYWNrKCkgOiBudWxsKTsKK30KK30KKworZXhwb3J0IGNsYXNzIFN0cnVjdE9mU3RydWN0c09mU3RydWN0c1QgeworY29uc3RydWN0b3IoCisgIHB1YmxpYyBhOiBTdHJ1Y3RPZlN0cnVjdHNUfG51bGwgPSBudWxsCispe30KKworCitwYWNrKGJ1aWxkZXI6ZmxhdGJ1ZmZlcnMuQnVpbGRlcik6IGZsYXRidWZmZXJzLk9mZnNldCB7CisgIHJldHVybiBTdHJ1Y3RPZlN0cnVjdHNPZlN0cnVjdHMuY3JlYXRlU3RydWN0T2ZTdHJ1Y3RzT2ZTdHJ1Y3RzKGJ1aWxkZXIsCisgICAgKHRoaXMuYT8uYT8uaWQgPz8gMCksCisgICAgKHRoaXMuYT8uYT8uZGlzdGFuY2UgPz8gMCksCisgICAgKHRoaXMuYT8uYj8uYSA/PyAwKSwKKyAgICAodGhpcy5hPy5iPy5iID8/IDApLAorICAgICh0aGlzLmE/LmM/LmlkID8/IDApLAorICAgICh0aGlzLmE/LmM/LmRpc3RhbmNlID8/IDApCisgICk7Cit9Cit9CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy90cy9teS1nYW1lL2V4YW1wbGUvc3RydWN0LW9mLXN0cnVjdHMuanMgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy90cy9teS1nYW1lL2V4YW1wbGUvc3RydWN0LW9mLXN0cnVjdHMuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjZhYWRjOAotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL3RzL215LWdhbWUvZXhhbXBsZS9zdHJ1Y3Qtb2Ytc3RydWN0cy5qcwpAQCAtMCwwICsxLDYyIEBACisvLyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBieSB0aGUgRmxhdEJ1ZmZlcnMgY29tcGlsZXIsIGRvIG5vdCBtb2RpZnkKK2ltcG9ydCB7IEFiaWxpdHkgfSBmcm9tICcuLi8uLi9teS1nYW1lL2V4YW1wbGUvYWJpbGl0eS5qcyc7CitpbXBvcnQgeyBUZXN0IH0gZnJvbSAnLi4vLi4vbXktZ2FtZS9leGFtcGxlL3Rlc3QuanMnOworZXhwb3J0IGNsYXNzIFN0cnVjdE9mU3RydWN0cyB7CisgICAgY29uc3RydWN0b3IoKSB7CisgICAgICAgIHRoaXMuYmIgPSBudWxsOworICAgICAgICB0aGlzLmJiX3BvcyA9IDA7CisgICAgfQorICAgIF9faW5pdChpLCBiYikgeworICAgICAgICB0aGlzLmJiX3BvcyA9IGk7CisgICAgICAgIHRoaXMuYmIgPSBiYjsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorICAgIGEob2JqKSB7CisgICAgICAgIHJldHVybiAob2JqIHx8IG5ldyBBYmlsaXR5KCkpLl9faW5pdCh0aGlzLmJiX3BvcywgdGhpcy5iYik7CisgICAgfQorICAgIGIob2JqKSB7CisgICAgICAgIHJldHVybiAob2JqIHx8IG5ldyBUZXN0KCkpLl9faW5pdCh0aGlzLmJiX3BvcyArIDgsIHRoaXMuYmIpOworICAgIH0KKyAgICBjKG9iaikgeworICAgICAgICByZXR1cm4gKG9iaiB8fCBuZXcgQWJpbGl0eSgpKS5fX2luaXQodGhpcy5iYl9wb3MgKyAxMiwgdGhpcy5iYik7CisgICAgfQorICAgIHN0YXRpYyBnZXRGdWxseVF1YWxpZmllZE5hbWUoKSB7CisgICAgICAgIHJldHVybiAnTXlHYW1lX0V4YW1wbGVfU3RydWN0T2ZTdHJ1Y3RzJzsKKyAgICB9CisgICAgc3RhdGljIHNpemVPZigpIHsKKyAgICAgICAgcmV0dXJuIDIwOworICAgIH0KKyAgICBzdGF0aWMgY3JlYXRlU3RydWN0T2ZTdHJ1Y3RzKGJ1aWxkZXIsIGFfaWQsIGFfZGlzdGFuY2UsIGJfYSwgYl9iLCBjX2lkLCBjX2Rpc3RhbmNlKSB7CisgICAgICAgIGJ1aWxkZXIucHJlcCg0LCAyMCk7CisgICAgICAgIGJ1aWxkZXIucHJlcCg0LCA4KTsKKyAgICAgICAgYnVpbGRlci53cml0ZUludDMyKGNfZGlzdGFuY2UpOworICAgICAgICBidWlsZGVyLndyaXRlSW50MzIoY19pZCk7CisgICAgICAgIGJ1aWxkZXIucHJlcCgyLCA0KTsKKyAgICAgICAgYnVpbGRlci5wYWQoMSk7CisgICAgICAgIGJ1aWxkZXIud3JpdGVJbnQ4KGJfYik7CisgICAgICAgIGJ1aWxkZXIud3JpdGVJbnQxNihiX2EpOworICAgICAgICBidWlsZGVyLnByZXAoNCwgOCk7CisgICAgICAgIGJ1aWxkZXIud3JpdGVJbnQzMihhX2Rpc3RhbmNlKTsKKyAgICAgICAgYnVpbGRlci53cml0ZUludDMyKGFfaWQpOworICAgICAgICByZXR1cm4gYnVpbGRlci5vZmZzZXQoKTsKKyAgICB9CisgICAgdW5wYWNrKCkgeworICAgICAgICByZXR1cm4gbmV3IFN0cnVjdE9mU3RydWN0c1QoKHRoaXMuYSgpICE9PSBudWxsID8gdGhpcy5hKCkudW5wYWNrKCkgOiBudWxsKSwgKHRoaXMuYigpICE9PSBudWxsID8gdGhpcy5iKCkudW5wYWNrKCkgOiBudWxsKSwgKHRoaXMuYygpICE9PSBudWxsID8gdGhpcy5jKCkudW5wYWNrKCkgOiBudWxsKSk7CisgICAgfQorICAgIHVucGFja1RvKF9vKSB7CisgICAgICAgIF9vLmEgPSAodGhpcy5hKCkgIT09IG51bGwgPyB0aGlzLmEoKS51bnBhY2soKSA6IG51bGwpOworICAgICAgICBfby5iID0gKHRoaXMuYigpICE9PSBudWxsID8gdGhpcy5iKCkudW5wYWNrKCkgOiBudWxsKTsKKyAgICAgICAgX28uYyA9ICh0aGlzLmMoKSAhPT0gbnVsbCA/IHRoaXMuYygpLnVucGFjaygpIDogbnVsbCk7CisgICAgfQorfQorZXhwb3J0IGNsYXNzIFN0cnVjdE9mU3RydWN0c1QgeworICAgIGNvbnN0cnVjdG9yKGEgPSBudWxsLCBiID0gbnVsbCwgYyA9IG51bGwpIHsKKyAgICAgICAgdGhpcy5hID0gYTsKKyAgICAgICAgdGhpcy5iID0gYjsKKyAgICAgICAgdGhpcy5jID0gYzsKKyAgICB9CisgICAgcGFjayhidWlsZGVyKSB7CisgICAgICAgIHZhciBfYSwgX2IsIF9jLCBfZCwgX2UsIF9mLCBfZywgX2gsIF9qLCBfaywgX2wsIF9tOworICAgICAgICByZXR1cm4gU3RydWN0T2ZTdHJ1Y3RzLmNyZWF0ZVN0cnVjdE9mU3RydWN0cyhidWlsZGVyLCAoKF9iID0gKF9hID0gdGhpcy5hKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuaWQpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6IDApLCAoKF9kID0gKF9jID0gdGhpcy5hKSA9PT0gbnVsbCB8fCBfYyA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2MuZGlzdGFuY2UpICE9PSBudWxsICYmIF9kICE9PSB2b2lkIDAgPyBfZCA6IDApLCAoKF9mID0gKF9lID0gdGhpcy5iKSA9PT0gbnVsbCB8fCBfZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2UuYSkgIT09IG51bGwgJiYgX2YgIT09IHZvaWQgMCA/IF9mIDogMCksICgoX2ggPSAoX2cgPSB0aGlzLmIpID09PSBudWxsIHx8IF9nID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfZy5iKSAhPT0gbnVsbCAmJiBfaCAhPT0gdm9pZCAwID8gX2ggOiAwKSwgKChfayA9IChfaiA9IHRoaXMuYykgPT09IG51bGwgfHwgX2ogPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9qLmlkKSAhPT0gbnVsbCAmJiBfayAhPT0gdm9pZCAwID8gX2sgOiAwKSwgKChfbSA9IChfbCA9IHRoaXMuYykgPT09IG51bGwgfHwgX2wgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9sLmRpc3RhbmNlKSAhPT0gbnVsbCAmJiBfbSAhPT0gdm9pZCAwID8gX20gOiAwKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvdHMvbXktZ2FtZS9leGFtcGxlL3N0cnVjdC1vZi1zdHJ1Y3RzLnRzIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvdHMvbXktZ2FtZS9leGFtcGxlL3N0cnVjdC1vZi1zdHJ1Y3RzLnRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc0OWE3M2MKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy90cy9teS1nYW1lL2V4YW1wbGUvc3RydWN0LW9mLXN0cnVjdHMudHMKQEAgLTAsMCArMSw4OCBAQAorLy8gYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgYnkgdGhlIEZsYXRCdWZmZXJzIGNvbXBpbGVyLCBkbyBub3QgbW9kaWZ5CisKK2ltcG9ydCAqIGFzIGZsYXRidWZmZXJzIGZyb20gJ2ZsYXRidWZmZXJzJzsKKworaW1wb3J0IHsgQWJpbGl0eSwgQWJpbGl0eVQgfSBmcm9tICcuLi8uLi9teS1nYW1lL2V4YW1wbGUvYWJpbGl0eS5qcyc7CitpbXBvcnQgeyBUZXN0LCBUZXN0VCB9IGZyb20gJy4uLy4uL215LWdhbWUvZXhhbXBsZS90ZXN0LmpzJzsKKworCitleHBvcnQgY2xhc3MgU3RydWN0T2ZTdHJ1Y3RzIHsKKyAgYmI6IGZsYXRidWZmZXJzLkJ5dGVCdWZmZXJ8bnVsbCA9IG51bGw7CisgIGJiX3BvcyA9IDA7CisgIF9faW5pdChpOm51bWJlciwgYmI6ZmxhdGJ1ZmZlcnMuQnl0ZUJ1ZmZlcik6U3RydWN0T2ZTdHJ1Y3RzIHsKKyAgdGhpcy5iYl9wb3MgPSBpOworICB0aGlzLmJiID0gYmI7CisgIHJldHVybiB0aGlzOworfQorCithKG9iaj86QWJpbGl0eSk6QWJpbGl0eXxudWxsIHsKKyAgcmV0dXJuIChvYmogfHwgbmV3IEFiaWxpdHkoKSkuX19pbml0KHRoaXMuYmJfcG9zLCB0aGlzLmJiISk7Cit9CisKK2Iob2JqPzpUZXN0KTpUZXN0fG51bGwgeworICByZXR1cm4gKG9iaiB8fCBuZXcgVGVzdCgpKS5fX2luaXQodGhpcy5iYl9wb3MgKyA4LCB0aGlzLmJiISk7Cit9CisKK2Mob2JqPzpBYmlsaXR5KTpBYmlsaXR5fG51bGwgeworICByZXR1cm4gKG9iaiB8fCBuZXcgQWJpbGl0eSgpKS5fX2luaXQodGhpcy5iYl9wb3MgKyAxMiwgdGhpcy5iYiEpOworfQorCitzdGF0aWMgZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCk6c3RyaW5nIHsKKyAgcmV0dXJuICdNeUdhbWVfRXhhbXBsZV9TdHJ1Y3RPZlN0cnVjdHMnOworfQorCitzdGF0aWMgc2l6ZU9mKCk6bnVtYmVyIHsKKyAgcmV0dXJuIDIwOworfQorCitzdGF0aWMgY3JlYXRlU3RydWN0T2ZTdHJ1Y3RzKGJ1aWxkZXI6ZmxhdGJ1ZmZlcnMuQnVpbGRlciwgYV9pZDogbnVtYmVyLCBhX2Rpc3RhbmNlOiBudW1iZXIsIGJfYTogbnVtYmVyLCBiX2I6IG51bWJlciwgY19pZDogbnVtYmVyLCBjX2Rpc3RhbmNlOiBudW1iZXIpOmZsYXRidWZmZXJzLk9mZnNldCB7CisgIGJ1aWxkZXIucHJlcCg0LCAyMCk7CisgIGJ1aWxkZXIucHJlcCg0LCA4KTsKKyAgYnVpbGRlci53cml0ZUludDMyKGNfZGlzdGFuY2UpOworICBidWlsZGVyLndyaXRlSW50MzIoY19pZCk7CisgIGJ1aWxkZXIucHJlcCgyLCA0KTsKKyAgYnVpbGRlci5wYWQoMSk7CisgIGJ1aWxkZXIud3JpdGVJbnQ4KGJfYik7CisgIGJ1aWxkZXIud3JpdGVJbnQxNihiX2EpOworICBidWlsZGVyLnByZXAoNCwgOCk7CisgIGJ1aWxkZXIud3JpdGVJbnQzMihhX2Rpc3RhbmNlKTsKKyAgYnVpbGRlci53cml0ZUludDMyKGFfaWQpOworICByZXR1cm4gYnVpbGRlci5vZmZzZXQoKTsKK30KKworCit1bnBhY2soKTogU3RydWN0T2ZTdHJ1Y3RzVCB7CisgIHJldHVybiBuZXcgU3RydWN0T2ZTdHJ1Y3RzVCgKKyAgICAodGhpcy5hKCkgIT09IG51bGwgPyB0aGlzLmEoKSEudW5wYWNrKCkgOiBudWxsKSwKKyAgICAodGhpcy5iKCkgIT09IG51bGwgPyB0aGlzLmIoKSEudW5wYWNrKCkgOiBudWxsKSwKKyAgICAodGhpcy5jKCkgIT09IG51bGwgPyB0aGlzLmMoKSEudW5wYWNrKCkgOiBudWxsKQorICApOworfQorCisKK3VucGFja1RvKF9vOiBTdHJ1Y3RPZlN0cnVjdHNUKTogdm9pZCB7CisgIF9vLmEgPSAodGhpcy5hKCkgIT09IG51bGwgPyB0aGlzLmEoKSEudW5wYWNrKCkgOiBudWxsKTsKKyAgX28uYiA9ICh0aGlzLmIoKSAhPT0gbnVsbCA/IHRoaXMuYigpIS51bnBhY2soKSA6IG51bGwpOworICBfby5jID0gKHRoaXMuYygpICE9PSBudWxsID8gdGhpcy5jKCkhLnVucGFjaygpIDogbnVsbCk7Cit9Cit9CisKK2V4cG9ydCBjbGFzcyBTdHJ1Y3RPZlN0cnVjdHNUIHsKK2NvbnN0cnVjdG9yKAorICBwdWJsaWMgYTogQWJpbGl0eVR8bnVsbCA9IG51bGwsCisgIHB1YmxpYyBiOiBUZXN0VHxudWxsID0gbnVsbCwKKyAgcHVibGljIGM6IEFiaWxpdHlUfG51bGwgPSBudWxsCispe30KKworCitwYWNrKGJ1aWxkZXI6ZmxhdGJ1ZmZlcnMuQnVpbGRlcik6IGZsYXRidWZmZXJzLk9mZnNldCB7CisgIHJldHVybiBTdHJ1Y3RPZlN0cnVjdHMuY3JlYXRlU3RydWN0T2ZTdHJ1Y3RzKGJ1aWxkZXIsCisgICAgKHRoaXMuYT8uaWQgPz8gMCksCisgICAgKHRoaXMuYT8uZGlzdGFuY2UgPz8gMCksCisgICAgKHRoaXMuYj8uYSA/PyAwKSwKKyAgICAodGhpcy5iPy5iID8/IDApLAorICAgICh0aGlzLmM/LmlkID8/IDApLAorICAgICh0aGlzLmM/LmRpc3RhbmNlID8/IDApCisgICk7Cit9Cit9CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy90cy9teS1nYW1lL2V4YW1wbGUvdGVzdC1zaW1wbGUtdGFibGUtd2l0aC1lbnVtLmpzIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvdHMvbXktZ2FtZS9leGFtcGxlL3Rlc3Qtc2ltcGxlLXRhYmxlLXdpdGgtZW51bS5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNjkwZmVlCi0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvdHMvbXktZ2FtZS9leGFtcGxlL3Rlc3Qtc2ltcGxlLXRhYmxlLXdpdGgtZW51bS5qcwpAQCAtMCwwICsxLDcxIEBACisvLyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBieSB0aGUgRmxhdEJ1ZmZlcnMgY29tcGlsZXIsIGRvIG5vdCBtb2RpZnkKK2ltcG9ydCAqIGFzIGZsYXRidWZmZXJzIGZyb20gJ2ZsYXRidWZmZXJzJzsKK2ltcG9ydCB7IENvbG9yIH0gZnJvbSAnLi4vLi4vbXktZ2FtZS9leGFtcGxlL2NvbG9yLmpzJzsKK2V4cG9ydCBjbGFzcyBUZXN0U2ltcGxlVGFibGVXaXRoRW51bSB7CisgICAgY29uc3RydWN0b3IoKSB7CisgICAgICAgIHRoaXMuYmIgPSBudWxsOworICAgICAgICB0aGlzLmJiX3BvcyA9IDA7CisgICAgfQorICAgIF9faW5pdChpLCBiYikgeworICAgICAgICB0aGlzLmJiX3BvcyA9IGk7CisgICAgICAgIHRoaXMuYmIgPSBiYjsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorICAgIHN0YXRpYyBnZXRSb290QXNUZXN0U2ltcGxlVGFibGVXaXRoRW51bShiYiwgb2JqKSB7CisgICAgICAgIHJldHVybiAob2JqIHx8IG5ldyBUZXN0U2ltcGxlVGFibGVXaXRoRW51bSgpKS5fX2luaXQoYmIucmVhZEludDMyKGJiLnBvc2l0aW9uKCkpICsgYmIucG9zaXRpb24oKSwgYmIpOworICAgIH0KKyAgICBzdGF0aWMgZ2V0U2l6ZVByZWZpeGVkUm9vdEFzVGVzdFNpbXBsZVRhYmxlV2l0aEVudW0oYmIsIG9iaikgeworICAgICAgICBiYi5zZXRQb3NpdGlvbihiYi5wb3NpdGlvbigpICsgZmxhdGJ1ZmZlcnMuU0laRV9QUkVGSVhfTEVOR1RIKTsKKyAgICAgICAgcmV0dXJuIChvYmogfHwgbmV3IFRlc3RTaW1wbGVUYWJsZVdpdGhFbnVtKCkpLl9faW5pdChiYi5yZWFkSW50MzIoYmIucG9zaXRpb24oKSkgKyBiYi5wb3NpdGlvbigpLCBiYik7CisgICAgfQorICAgIGNvbG9yKCkgeworICAgICAgICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCA0KTsKKyAgICAgICAgcmV0dXJuIG9mZnNldCA/IHRoaXMuYmIucmVhZFVpbnQ4KHRoaXMuYmJfcG9zICsgb2Zmc2V0KSA6IENvbG9yLkdyZWVuOworICAgIH0KKyAgICBtdXRhdGVfY29sb3IodmFsdWUpIHsKKyAgICAgICAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywgNCk7CisgICAgICAgIGlmIChvZmZzZXQgPT09IDApIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICB0aGlzLmJiLndyaXRlVWludDgodGhpcy5iYl9wb3MgKyBvZmZzZXQsIHZhbHVlKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIHN0YXRpYyBnZXRGdWxseVF1YWxpZmllZE5hbWUoKSB7CisgICAgICAgIHJldHVybiAnTXlHYW1lX0V4YW1wbGVfVGVzdFNpbXBsZVRhYmxlV2l0aEVudW0nOworICAgIH0KKyAgICBzdGF0aWMgc3RhcnRUZXN0U2ltcGxlVGFibGVXaXRoRW51bShidWlsZGVyKSB7CisgICAgICAgIGJ1aWxkZXIuc3RhcnRPYmplY3QoMSk7CisgICAgfQorICAgIHN0YXRpYyBhZGRDb2xvcihidWlsZGVyLCBjb2xvcikgeworICAgICAgICBidWlsZGVyLmFkZEZpZWxkSW50OCgwLCBjb2xvciwgQ29sb3IuR3JlZW4pOworICAgIH0KKyAgICBzdGF0aWMgZW5kVGVzdFNpbXBsZVRhYmxlV2l0aEVudW0oYnVpbGRlcikgeworICAgICAgICBjb25zdCBvZmZzZXQgPSBidWlsZGVyLmVuZE9iamVjdCgpOworICAgICAgICByZXR1cm4gb2Zmc2V0OworICAgIH0KKyAgICBzdGF0aWMgY3JlYXRlVGVzdFNpbXBsZVRhYmxlV2l0aEVudW0oYnVpbGRlciwgY29sb3IpIHsKKyAgICAgICAgVGVzdFNpbXBsZVRhYmxlV2l0aEVudW0uc3RhcnRUZXN0U2ltcGxlVGFibGVXaXRoRW51bShidWlsZGVyKTsKKyAgICAgICAgVGVzdFNpbXBsZVRhYmxlV2l0aEVudW0uYWRkQ29sb3IoYnVpbGRlciwgY29sb3IpOworICAgICAgICByZXR1cm4gVGVzdFNpbXBsZVRhYmxlV2l0aEVudW0uZW5kVGVzdFNpbXBsZVRhYmxlV2l0aEVudW0oYnVpbGRlcik7CisgICAgfQorICAgIHNlcmlhbGl6ZSgpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuYmIuYnl0ZXMoKTsKKyAgICB9CisgICAgc3RhdGljIGRlc2VyaWFsaXplKGJ1ZmZlcikgeworICAgICAgICByZXR1cm4gVGVzdFNpbXBsZVRhYmxlV2l0aEVudW0uZ2V0Um9vdEFzVGVzdFNpbXBsZVRhYmxlV2l0aEVudW0obmV3IGZsYXRidWZmZXJzLkJ5dGVCdWZmZXIoYnVmZmVyKSk7CisgICAgfQorICAgIHVucGFjaygpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBUZXN0U2ltcGxlVGFibGVXaXRoRW51bVQodGhpcy5jb2xvcigpKTsKKyAgICB9CisgICAgdW5wYWNrVG8oX28pIHsKKyAgICAgICAgX28uY29sb3IgPSB0aGlzLmNvbG9yKCk7CisgICAgfQorfQorZXhwb3J0IGNsYXNzIFRlc3RTaW1wbGVUYWJsZVdpdGhFbnVtVCB7CisgICAgY29uc3RydWN0b3IoY29sb3IgPSBDb2xvci5HcmVlbikgeworICAgICAgICB0aGlzLmNvbG9yID0gY29sb3I7CisgICAgfQorICAgIHBhY2soYnVpbGRlcikgeworICAgICAgICByZXR1cm4gVGVzdFNpbXBsZVRhYmxlV2l0aEVudW0uY3JlYXRlVGVzdFNpbXBsZVRhYmxlV2l0aEVudW0oYnVpbGRlciwgdGhpcy5jb2xvcik7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvdHMvbXktZ2FtZS9leGFtcGxlL3Rlc3Qtc2ltcGxlLXRhYmxlLXdpdGgtZW51bS50cyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL3RzL215LWdhbWUvZXhhbXBsZS90ZXN0LXNpbXBsZS10YWJsZS13aXRoLWVudW0udHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2ZjYTAwYgotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL3RzL215LWdhbWUvZXhhbXBsZS90ZXN0LXNpbXBsZS10YWJsZS13aXRoLWVudW0udHMKQEAgLTAsMCArMSw5NiBAQAorLy8gYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgYnkgdGhlIEZsYXRCdWZmZXJzIGNvbXBpbGVyLCBkbyBub3QgbW9kaWZ5CisKK2ltcG9ydCAqIGFzIGZsYXRidWZmZXJzIGZyb20gJ2ZsYXRidWZmZXJzJzsKKworaW1wb3J0IHsgQ29sb3IgfSBmcm9tICcuLi8uLi9teS1nYW1lL2V4YW1wbGUvY29sb3IuanMnOworCisKK2V4cG9ydCBjbGFzcyBUZXN0U2ltcGxlVGFibGVXaXRoRW51bSB7CisgIGJiOiBmbGF0YnVmZmVycy5CeXRlQnVmZmVyfG51bGwgPSBudWxsOworICBiYl9wb3MgPSAwOworICBfX2luaXQoaTpudW1iZXIsIGJiOmZsYXRidWZmZXJzLkJ5dGVCdWZmZXIpOlRlc3RTaW1wbGVUYWJsZVdpdGhFbnVtIHsKKyAgdGhpcy5iYl9wb3MgPSBpOworICB0aGlzLmJiID0gYmI7CisgIHJldHVybiB0aGlzOworfQorCitzdGF0aWMgZ2V0Um9vdEFzVGVzdFNpbXBsZVRhYmxlV2l0aEVudW0oYmI6ZmxhdGJ1ZmZlcnMuQnl0ZUJ1ZmZlciwgb2JqPzpUZXN0U2ltcGxlVGFibGVXaXRoRW51bSk6VGVzdFNpbXBsZVRhYmxlV2l0aEVudW0geworICByZXR1cm4gKG9iaiB8fCBuZXcgVGVzdFNpbXBsZVRhYmxlV2l0aEVudW0oKSkuX19pbml0KGJiLnJlYWRJbnQzMihiYi5wb3NpdGlvbigpKSArIGJiLnBvc2l0aW9uKCksIGJiKTsKK30KKworc3RhdGljIGdldFNpemVQcmVmaXhlZFJvb3RBc1Rlc3RTaW1wbGVUYWJsZVdpdGhFbnVtKGJiOmZsYXRidWZmZXJzLkJ5dGVCdWZmZXIsIG9iaj86VGVzdFNpbXBsZVRhYmxlV2l0aEVudW0pOlRlc3RTaW1wbGVUYWJsZVdpdGhFbnVtIHsKKyAgYmIuc2V0UG9zaXRpb24oYmIucG9zaXRpb24oKSArIGZsYXRidWZmZXJzLlNJWkVfUFJFRklYX0xFTkdUSCk7CisgIHJldHVybiAob2JqIHx8IG5ldyBUZXN0U2ltcGxlVGFibGVXaXRoRW51bSgpKS5fX2luaXQoYmIucmVhZEludDMyKGJiLnBvc2l0aW9uKCkpICsgYmIucG9zaXRpb24oKSwgYmIpOworfQorCitjb2xvcigpOkNvbG9yIHsKKyAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYiEuX19vZmZzZXQodGhpcy5iYl9wb3MsIDQpOworICByZXR1cm4gb2Zmc2V0ID8gdGhpcy5iYiEucmVhZFVpbnQ4KHRoaXMuYmJfcG9zICsgb2Zmc2V0KSA6IENvbG9yLkdyZWVuOworfQorCittdXRhdGVfY29sb3IodmFsdWU6Q29sb3IpOmJvb2xlYW4geworICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiIS5fX29mZnNldCh0aGlzLmJiX3BvcywgNCk7CisKKyAgaWYgKG9mZnNldCA9PT0gMCkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHRoaXMuYmIhLndyaXRlVWludDgodGhpcy5iYl9wb3MgKyBvZmZzZXQsIHZhbHVlKTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyBnZXRGdWxseVF1YWxpZmllZE5hbWUoKTpzdHJpbmcgeworICByZXR1cm4gJ015R2FtZV9FeGFtcGxlX1Rlc3RTaW1wbGVUYWJsZVdpdGhFbnVtJzsKK30KKworc3RhdGljIHN0YXJ0VGVzdFNpbXBsZVRhYmxlV2l0aEVudW0oYnVpbGRlcjpmbGF0YnVmZmVycy5CdWlsZGVyKSB7CisgIGJ1aWxkZXIuc3RhcnRPYmplY3QoMSk7Cit9CisKK3N0YXRpYyBhZGRDb2xvcihidWlsZGVyOmZsYXRidWZmZXJzLkJ1aWxkZXIsIGNvbG9yOkNvbG9yKSB7CisgIGJ1aWxkZXIuYWRkRmllbGRJbnQ4KDAsIGNvbG9yLCBDb2xvci5HcmVlbik7Cit9CisKK3N0YXRpYyBlbmRUZXN0U2ltcGxlVGFibGVXaXRoRW51bShidWlsZGVyOmZsYXRidWZmZXJzLkJ1aWxkZXIpOmZsYXRidWZmZXJzLk9mZnNldCB7CisgIGNvbnN0IG9mZnNldCA9IGJ1aWxkZXIuZW5kT2JqZWN0KCk7CisgIHJldHVybiBvZmZzZXQ7Cit9CisKK3N0YXRpYyBjcmVhdGVUZXN0U2ltcGxlVGFibGVXaXRoRW51bShidWlsZGVyOmZsYXRidWZmZXJzLkJ1aWxkZXIsIGNvbG9yOkNvbG9yKTpmbGF0YnVmZmVycy5PZmZzZXQgeworICBUZXN0U2ltcGxlVGFibGVXaXRoRW51bS5zdGFydFRlc3RTaW1wbGVUYWJsZVdpdGhFbnVtKGJ1aWxkZXIpOworICBUZXN0U2ltcGxlVGFibGVXaXRoRW51bS5hZGRDb2xvcihidWlsZGVyLCBjb2xvcik7CisgIHJldHVybiBUZXN0U2ltcGxlVGFibGVXaXRoRW51bS5lbmRUZXN0U2ltcGxlVGFibGVXaXRoRW51bShidWlsZGVyKTsKK30KKworc2VyaWFsaXplKCk6VWludDhBcnJheSB7CisgIHJldHVybiB0aGlzLmJiIS5ieXRlcygpOworfQorCitzdGF0aWMgZGVzZXJpYWxpemUoYnVmZmVyOiBVaW50OEFycmF5KTpUZXN0U2ltcGxlVGFibGVXaXRoRW51bSB7CisgIHJldHVybiBUZXN0U2ltcGxlVGFibGVXaXRoRW51bS5nZXRSb290QXNUZXN0U2ltcGxlVGFibGVXaXRoRW51bShuZXcgZmxhdGJ1ZmZlcnMuQnl0ZUJ1ZmZlcihidWZmZXIpKQorfQorCit1bnBhY2soKTogVGVzdFNpbXBsZVRhYmxlV2l0aEVudW1UIHsKKyAgcmV0dXJuIG5ldyBUZXN0U2ltcGxlVGFibGVXaXRoRW51bVQoCisgICAgdGhpcy5jb2xvcigpCisgICk7Cit9CisKKwordW5wYWNrVG8oX286IFRlc3RTaW1wbGVUYWJsZVdpdGhFbnVtVCk6IHZvaWQgeworICBfby5jb2xvciA9IHRoaXMuY29sb3IoKTsKK30KK30KKworZXhwb3J0IGNsYXNzIFRlc3RTaW1wbGVUYWJsZVdpdGhFbnVtVCB7Citjb25zdHJ1Y3RvcigKKyAgcHVibGljIGNvbG9yOiBDb2xvciA9IENvbG9yLkdyZWVuCispe30KKworCitwYWNrKGJ1aWxkZXI6ZmxhdGJ1ZmZlcnMuQnVpbGRlcik6IGZsYXRidWZmZXJzLk9mZnNldCB7CisgIHJldHVybiBUZXN0U2ltcGxlVGFibGVXaXRoRW51bS5jcmVhdGVUZXN0U2ltcGxlVGFibGVXaXRoRW51bShidWlsZGVyLAorICAgIHRoaXMuY29sb3IKKyAgKTsKK30KK30KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL3RzL215LWdhbWUvZXhhbXBsZS90ZXN0LmpzIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvdHMvbXktZ2FtZS9leGFtcGxlL3Rlc3QuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWM0MzYxOQotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL3RzL215LWdhbWUvZXhhbXBsZS90ZXN0LmpzCkBAIC0wLDAgKzEsNTUgQEAKKy8vIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGJ5IHRoZSBGbGF0QnVmZmVycyBjb21waWxlciwgZG8gbm90IG1vZGlmeQorZXhwb3J0IGNsYXNzIFRlc3QgeworICAgIGNvbnN0cnVjdG9yKCkgeworICAgICAgICB0aGlzLmJiID0gbnVsbDsKKyAgICAgICAgdGhpcy5iYl9wb3MgPSAwOworICAgIH0KKyAgICBfX2luaXQoaSwgYmIpIHsKKyAgICAgICAgdGhpcy5iYl9wb3MgPSBpOworICAgICAgICB0aGlzLmJiID0gYmI7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKyAgICBhKCkgeworICAgICAgICByZXR1cm4gdGhpcy5iYi5yZWFkSW50MTYodGhpcy5iYl9wb3MpOworICAgIH0KKyAgICBtdXRhdGVfYSh2YWx1ZSkgeworICAgICAgICB0aGlzLmJiLndyaXRlSW50MTYodGhpcy5iYl9wb3MgKyAwLCB2YWx1ZSk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICBiKCkgeworICAgICAgICByZXR1cm4gdGhpcy5iYi5yZWFkSW50OCh0aGlzLmJiX3BvcyArIDIpOworICAgIH0KKyAgICBtdXRhdGVfYih2YWx1ZSkgeworICAgICAgICB0aGlzLmJiLndyaXRlSW50OCh0aGlzLmJiX3BvcyArIDIsIHZhbHVlKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIHN0YXRpYyBnZXRGdWxseVF1YWxpZmllZE5hbWUoKSB7CisgICAgICAgIHJldHVybiAnTXlHYW1lX0V4YW1wbGVfVGVzdCc7CisgICAgfQorICAgIHN0YXRpYyBzaXplT2YoKSB7CisgICAgICAgIHJldHVybiA0OworICAgIH0KKyAgICBzdGF0aWMgY3JlYXRlVGVzdChidWlsZGVyLCBhLCBiKSB7CisgICAgICAgIGJ1aWxkZXIucHJlcCgyLCA0KTsKKyAgICAgICAgYnVpbGRlci5wYWQoMSk7CisgICAgICAgIGJ1aWxkZXIud3JpdGVJbnQ4KGIpOworICAgICAgICBidWlsZGVyLndyaXRlSW50MTYoYSk7CisgICAgICAgIHJldHVybiBidWlsZGVyLm9mZnNldCgpOworICAgIH0KKyAgICB1bnBhY2soKSB7CisgICAgICAgIHJldHVybiBuZXcgVGVzdFQodGhpcy5hKCksIHRoaXMuYigpKTsKKyAgICB9CisgICAgdW5wYWNrVG8oX28pIHsKKyAgICAgICAgX28uYSA9IHRoaXMuYSgpOworICAgICAgICBfby5iID0gdGhpcy5iKCk7CisgICAgfQorfQorZXhwb3J0IGNsYXNzIFRlc3RUIHsKKyAgICBjb25zdHJ1Y3RvcihhID0gMCwgYiA9IDApIHsKKyAgICAgICAgdGhpcy5hID0gYTsKKyAgICAgICAgdGhpcy5iID0gYjsKKyAgICB9CisgICAgcGFjayhidWlsZGVyKSB7CisgICAgICAgIHJldHVybiBUZXN0LmNyZWF0ZVRlc3QoYnVpbGRlciwgdGhpcy5hLCB0aGlzLmIpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL3RzL215LWdhbWUvZXhhbXBsZS90ZXN0LnRzIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvdHMvbXktZ2FtZS9leGFtcGxlL3Rlc3QudHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjNkODRlZQotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL3RzL215LWdhbWUvZXhhbXBsZS90ZXN0LnRzCkBAIC0wLDAgKzEsNzggQEAKKy8vIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGJ5IHRoZSBGbGF0QnVmZmVycyBjb21waWxlciwgZG8gbm90IG1vZGlmeQorCitpbXBvcnQgKiBhcyBmbGF0YnVmZmVycyBmcm9tICdmbGF0YnVmZmVycyc7CisKKworCitleHBvcnQgY2xhc3MgVGVzdCB7CisgIGJiOiBmbGF0YnVmZmVycy5CeXRlQnVmZmVyfG51bGwgPSBudWxsOworICBiYl9wb3MgPSAwOworICBfX2luaXQoaTpudW1iZXIsIGJiOmZsYXRidWZmZXJzLkJ5dGVCdWZmZXIpOlRlc3QgeworICB0aGlzLmJiX3BvcyA9IGk7CisgIHRoaXMuYmIgPSBiYjsKKyAgcmV0dXJuIHRoaXM7Cit9CisKK2EoKTpudW1iZXIgeworICByZXR1cm4gdGhpcy5iYiEucmVhZEludDE2KHRoaXMuYmJfcG9zKTsKK30KKworbXV0YXRlX2EodmFsdWU6bnVtYmVyKTpib29sZWFuIHsKKyAgdGhpcy5iYiEud3JpdGVJbnQxNih0aGlzLmJiX3BvcyArIDAsIHZhbHVlKTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK2IoKTpudW1iZXIgeworICByZXR1cm4gdGhpcy5iYiEucmVhZEludDgodGhpcy5iYl9wb3MgKyAyKTsKK30KKworbXV0YXRlX2IodmFsdWU6bnVtYmVyKTpib29sZWFuIHsKKyAgdGhpcy5iYiEud3JpdGVJbnQ4KHRoaXMuYmJfcG9zICsgMiwgdmFsdWUpOworICByZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIGdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpOnN0cmluZyB7CisgIHJldHVybiAnTXlHYW1lX0V4YW1wbGVfVGVzdCc7Cit9CisKK3N0YXRpYyBzaXplT2YoKTpudW1iZXIgeworICByZXR1cm4gNDsKK30KKworc3RhdGljIGNyZWF0ZVRlc3QoYnVpbGRlcjpmbGF0YnVmZmVycy5CdWlsZGVyLCBhOiBudW1iZXIsIGI6IG51bWJlcik6ZmxhdGJ1ZmZlcnMuT2Zmc2V0IHsKKyAgYnVpbGRlci5wcmVwKDIsIDQpOworICBidWlsZGVyLnBhZCgxKTsKKyAgYnVpbGRlci53cml0ZUludDgoYik7CisgIGJ1aWxkZXIud3JpdGVJbnQxNihhKTsKKyAgcmV0dXJuIGJ1aWxkZXIub2Zmc2V0KCk7Cit9CisKKwordW5wYWNrKCk6IFRlc3RUIHsKKyAgcmV0dXJuIG5ldyBUZXN0VCgKKyAgICB0aGlzLmEoKSwKKyAgICB0aGlzLmIoKQorICApOworfQorCisKK3VucGFja1RvKF9vOiBUZXN0VCk6IHZvaWQgeworICBfby5hID0gdGhpcy5hKCk7CisgIF9vLmIgPSB0aGlzLmIoKTsKK30KK30KKworZXhwb3J0IGNsYXNzIFRlc3RUIHsKK2NvbnN0cnVjdG9yKAorICBwdWJsaWMgYTogbnVtYmVyID0gMCwKKyAgcHVibGljIGI6IG51bWJlciA9IDAKKyl7fQorCisKK3BhY2soYnVpbGRlcjpmbGF0YnVmZmVycy5CdWlsZGVyKTogZmxhdGJ1ZmZlcnMuT2Zmc2V0IHsKKyAgcmV0dXJuIFRlc3QuY3JlYXRlVGVzdChidWlsZGVyLAorICAgIHRoaXMuYSwKKyAgICB0aGlzLmIKKyAgKTsKK30KK30KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL3RzL215LWdhbWUvZXhhbXBsZS90eXBlLWFsaWFzZXMuanMgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy90cy9teS1nYW1lL2V4YW1wbGUvdHlwZS1hbGlhc2VzLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0YjVmODkKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy90cy9teS1nYW1lL2V4YW1wbGUvdHlwZS1hbGlhc2VzLmpzCkBAIC0wLDAgKzEsMjkwIEBACisvLyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBieSB0aGUgRmxhdEJ1ZmZlcnMgY29tcGlsZXIsIGRvIG5vdCBtb2RpZnkKK2ltcG9ydCAqIGFzIGZsYXRidWZmZXJzIGZyb20gJ2ZsYXRidWZmZXJzJzsKK2V4cG9ydCBjbGFzcyBUeXBlQWxpYXNlcyB7CisgICAgY29uc3RydWN0b3IoKSB7CisgICAgICAgIHRoaXMuYmIgPSBudWxsOworICAgICAgICB0aGlzLmJiX3BvcyA9IDA7CisgICAgfQorICAgIF9faW5pdChpLCBiYikgeworICAgICAgICB0aGlzLmJiX3BvcyA9IGk7CisgICAgICAgIHRoaXMuYmIgPSBiYjsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorICAgIHN0YXRpYyBnZXRSb290QXNUeXBlQWxpYXNlcyhiYiwgb2JqKSB7CisgICAgICAgIHJldHVybiAob2JqIHx8IG5ldyBUeXBlQWxpYXNlcygpKS5fX2luaXQoYmIucmVhZEludDMyKGJiLnBvc2l0aW9uKCkpICsgYmIucG9zaXRpb24oKSwgYmIpOworICAgIH0KKyAgICBzdGF0aWMgZ2V0U2l6ZVByZWZpeGVkUm9vdEFzVHlwZUFsaWFzZXMoYmIsIG9iaikgeworICAgICAgICBiYi5zZXRQb3NpdGlvbihiYi5wb3NpdGlvbigpICsgZmxhdGJ1ZmZlcnMuU0laRV9QUkVGSVhfTEVOR1RIKTsKKyAgICAgICAgcmV0dXJuIChvYmogfHwgbmV3IFR5cGVBbGlhc2VzKCkpLl9faW5pdChiYi5yZWFkSW50MzIoYmIucG9zaXRpb24oKSkgKyBiYi5wb3NpdGlvbigpLCBiYik7CisgICAgfQorICAgIGk4KCkgeworICAgICAgICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCA0KTsKKyAgICAgICAgcmV0dXJuIG9mZnNldCA/IHRoaXMuYmIucmVhZEludDgodGhpcy5iYl9wb3MgKyBvZmZzZXQpIDogMDsKKyAgICB9CisgICAgbXV0YXRlX2k4KHZhbHVlKSB7CisgICAgICAgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsIDQpOworICAgICAgICBpZiAob2Zmc2V0ID09PSAwKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgdGhpcy5iYi53cml0ZUludDgodGhpcy5iYl9wb3MgKyBvZmZzZXQsIHZhbHVlKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIHU4KCkgeworICAgICAgICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCA2KTsKKyAgICAgICAgcmV0dXJuIG9mZnNldCA/IHRoaXMuYmIucmVhZFVpbnQ4KHRoaXMuYmJfcG9zICsgb2Zmc2V0KSA6IDA7CisgICAgfQorICAgIG11dGF0ZV91OCh2YWx1ZSkgeworICAgICAgICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCA2KTsKKyAgICAgICAgaWYgKG9mZnNldCA9PT0gMCkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIHRoaXMuYmIud3JpdGVVaW50OCh0aGlzLmJiX3BvcyArIG9mZnNldCwgdmFsdWUpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgaTE2KCkgeworICAgICAgICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCA4KTsKKyAgICAgICAgcmV0dXJuIG9mZnNldCA/IHRoaXMuYmIucmVhZEludDE2KHRoaXMuYmJfcG9zICsgb2Zmc2V0KSA6IDA7CisgICAgfQorICAgIG11dGF0ZV9pMTYodmFsdWUpIHsKKyAgICAgICAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywgOCk7CisgICAgICAgIGlmIChvZmZzZXQgPT09IDApIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICB0aGlzLmJiLndyaXRlSW50MTYodGhpcy5iYl9wb3MgKyBvZmZzZXQsIHZhbHVlKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIHUxNigpIHsKKyAgICAgICAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywgMTApOworICAgICAgICByZXR1cm4gb2Zmc2V0ID8gdGhpcy5iYi5yZWFkVWludDE2KHRoaXMuYmJfcG9zICsgb2Zmc2V0KSA6IDA7CisgICAgfQorICAgIG11dGF0ZV91MTYodmFsdWUpIHsKKyAgICAgICAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywgMTApOworICAgICAgICBpZiAob2Zmc2V0ID09PSAwKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgdGhpcy5iYi53cml0ZVVpbnQxNih0aGlzLmJiX3BvcyArIG9mZnNldCwgdmFsdWUpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgaTMyKCkgeworICAgICAgICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCAxMik7CisgICAgICAgIHJldHVybiBvZmZzZXQgPyB0aGlzLmJiLnJlYWRJbnQzMih0aGlzLmJiX3BvcyArIG9mZnNldCkgOiAwOworICAgIH0KKyAgICBtdXRhdGVfaTMyKHZhbHVlKSB7CisgICAgICAgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsIDEyKTsKKyAgICAgICAgaWYgKG9mZnNldCA9PT0gMCkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIHRoaXMuYmIud3JpdGVJbnQzMih0aGlzLmJiX3BvcyArIG9mZnNldCwgdmFsdWUpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgdTMyKCkgeworICAgICAgICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCAxNCk7CisgICAgICAgIHJldHVybiBvZmZzZXQgPyB0aGlzLmJiLnJlYWRVaW50MzIodGhpcy5iYl9wb3MgKyBvZmZzZXQpIDogMDsKKyAgICB9CisgICAgbXV0YXRlX3UzMih2YWx1ZSkgeworICAgICAgICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCAxNCk7CisgICAgICAgIGlmIChvZmZzZXQgPT09IDApIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICB0aGlzLmJiLndyaXRlVWludDMyKHRoaXMuYmJfcG9zICsgb2Zmc2V0LCB2YWx1ZSk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICBpNjQoKSB7CisgICAgICAgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsIDE2KTsKKyAgICAgICAgcmV0dXJuIG9mZnNldCA/IHRoaXMuYmIucmVhZEludDY0KHRoaXMuYmJfcG9zICsgb2Zmc2V0KSA6IEJpZ0ludCgnMCcpOworICAgIH0KKyAgICBtdXRhdGVfaTY0KHZhbHVlKSB7CisgICAgICAgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsIDE2KTsKKyAgICAgICAgaWYgKG9mZnNldCA9PT0gMCkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIHRoaXMuYmIud3JpdGVJbnQ2NCh0aGlzLmJiX3BvcyArIG9mZnNldCwgdmFsdWUpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgdTY0KCkgeworICAgICAgICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCAxOCk7CisgICAgICAgIHJldHVybiBvZmZzZXQgPyB0aGlzLmJiLnJlYWRVaW50NjQodGhpcy5iYl9wb3MgKyBvZmZzZXQpIDogQmlnSW50KCcwJyk7CisgICAgfQorICAgIG11dGF0ZV91NjQodmFsdWUpIHsKKyAgICAgICAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywgMTgpOworICAgICAgICBpZiAob2Zmc2V0ID09PSAwKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgdGhpcy5iYi53cml0ZVVpbnQ2NCh0aGlzLmJiX3BvcyArIG9mZnNldCwgdmFsdWUpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgZjMyKCkgeworICAgICAgICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCAyMCk7CisgICAgICAgIHJldHVybiBvZmZzZXQgPyB0aGlzLmJiLnJlYWRGbG9hdDMyKHRoaXMuYmJfcG9zICsgb2Zmc2V0KSA6IDAuMDsKKyAgICB9CisgICAgbXV0YXRlX2YzMih2YWx1ZSkgeworICAgICAgICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCAyMCk7CisgICAgICAgIGlmIChvZmZzZXQgPT09IDApIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICB0aGlzLmJiLndyaXRlRmxvYXQzMih0aGlzLmJiX3BvcyArIG9mZnNldCwgdmFsdWUpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgZjY0KCkgeworICAgICAgICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCAyMik7CisgICAgICAgIHJldHVybiBvZmZzZXQgPyB0aGlzLmJiLnJlYWRGbG9hdDY0KHRoaXMuYmJfcG9zICsgb2Zmc2V0KSA6IDAuMDsKKyAgICB9CisgICAgbXV0YXRlX2Y2NCh2YWx1ZSkgeworICAgICAgICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCAyMik7CisgICAgICAgIGlmIChvZmZzZXQgPT09IDApIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICB0aGlzLmJiLndyaXRlRmxvYXQ2NCh0aGlzLmJiX3BvcyArIG9mZnNldCwgdmFsdWUpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgdjgoaW5kZXgpIHsKKyAgICAgICAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywgMjQpOworICAgICAgICByZXR1cm4gb2Zmc2V0ID8gdGhpcy5iYi5yZWFkSW50OCh0aGlzLmJiLl9fdmVjdG9yKHRoaXMuYmJfcG9zICsgb2Zmc2V0KSArIGluZGV4KSA6IDA7CisgICAgfQorICAgIHY4TGVuZ3RoKCkgeworICAgICAgICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCAyNCk7CisgICAgICAgIHJldHVybiBvZmZzZXQgPyB0aGlzLmJiLl9fdmVjdG9yX2xlbih0aGlzLmJiX3BvcyArIG9mZnNldCkgOiAwOworICAgIH0KKyAgICB2OEFycmF5KCkgeworICAgICAgICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCAyNCk7CisgICAgICAgIHJldHVybiBvZmZzZXQgPyBuZXcgSW50OEFycmF5KHRoaXMuYmIuYnl0ZXMoKS5idWZmZXIsIHRoaXMuYmIuYnl0ZXMoKS5ieXRlT2Zmc2V0ICsgdGhpcy5iYi5fX3ZlY3Rvcih0aGlzLmJiX3BvcyArIG9mZnNldCksIHRoaXMuYmIuX192ZWN0b3JfbGVuKHRoaXMuYmJfcG9zICsgb2Zmc2V0KSkgOiBudWxsOworICAgIH0KKyAgICB2ZjY0KGluZGV4KSB7CisgICAgICAgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsIDI2KTsKKyAgICAgICAgcmV0dXJuIG9mZnNldCA/IHRoaXMuYmIucmVhZEZsb2F0NjQodGhpcy5iYi5fX3ZlY3Rvcih0aGlzLmJiX3BvcyArIG9mZnNldCkgKyBpbmRleCAqIDgpIDogMDsKKyAgICB9CisgICAgdmY2NExlbmd0aCgpIHsKKyAgICAgICAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywgMjYpOworICAgICAgICByZXR1cm4gb2Zmc2V0ID8gdGhpcy5iYi5fX3ZlY3Rvcl9sZW4odGhpcy5iYl9wb3MgKyBvZmZzZXQpIDogMDsKKyAgICB9CisgICAgdmY2NEFycmF5KCkgeworICAgICAgICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCAyNik7CisgICAgICAgIHJldHVybiBvZmZzZXQgPyBuZXcgRmxvYXQ2NEFycmF5KHRoaXMuYmIuYnl0ZXMoKS5idWZmZXIsIHRoaXMuYmIuYnl0ZXMoKS5ieXRlT2Zmc2V0ICsgdGhpcy5iYi5fX3ZlY3Rvcih0aGlzLmJiX3BvcyArIG9mZnNldCksIHRoaXMuYmIuX192ZWN0b3JfbGVuKHRoaXMuYmJfcG9zICsgb2Zmc2V0KSkgOiBudWxsOworICAgIH0KKyAgICBzdGF0aWMgZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCkgeworICAgICAgICByZXR1cm4gJ015R2FtZV9FeGFtcGxlX1R5cGVBbGlhc2VzJzsKKyAgICB9CisgICAgc3RhdGljIHN0YXJ0VHlwZUFsaWFzZXMoYnVpbGRlcikgeworICAgICAgICBidWlsZGVyLnN0YXJ0T2JqZWN0KDEyKTsKKyAgICB9CisgICAgc3RhdGljIGFkZEk4KGJ1aWxkZXIsIGk4KSB7CisgICAgICAgIGJ1aWxkZXIuYWRkRmllbGRJbnQ4KDAsIGk4LCAwKTsKKyAgICB9CisgICAgc3RhdGljIGFkZFU4KGJ1aWxkZXIsIHU4KSB7CisgICAgICAgIGJ1aWxkZXIuYWRkRmllbGRJbnQ4KDEsIHU4LCAwKTsKKyAgICB9CisgICAgc3RhdGljIGFkZEkxNihidWlsZGVyLCBpMTYpIHsKKyAgICAgICAgYnVpbGRlci5hZGRGaWVsZEludDE2KDIsIGkxNiwgMCk7CisgICAgfQorICAgIHN0YXRpYyBhZGRVMTYoYnVpbGRlciwgdTE2KSB7CisgICAgICAgIGJ1aWxkZXIuYWRkRmllbGRJbnQxNigzLCB1MTYsIDApOworICAgIH0KKyAgICBzdGF0aWMgYWRkSTMyKGJ1aWxkZXIsIGkzMikgeworICAgICAgICBidWlsZGVyLmFkZEZpZWxkSW50MzIoNCwgaTMyLCAwKTsKKyAgICB9CisgICAgc3RhdGljIGFkZFUzMihidWlsZGVyLCB1MzIpIHsKKyAgICAgICAgYnVpbGRlci5hZGRGaWVsZEludDMyKDUsIHUzMiwgMCk7CisgICAgfQorICAgIHN0YXRpYyBhZGRJNjQoYnVpbGRlciwgaTY0KSB7CisgICAgICAgIGJ1aWxkZXIuYWRkRmllbGRJbnQ2NCg2LCBpNjQsIEJpZ0ludCgnMCcpKTsKKyAgICB9CisgICAgc3RhdGljIGFkZFU2NChidWlsZGVyLCB1NjQpIHsKKyAgICAgICAgYnVpbGRlci5hZGRGaWVsZEludDY0KDcsIHU2NCwgQmlnSW50KCcwJykpOworICAgIH0KKyAgICBzdGF0aWMgYWRkRjMyKGJ1aWxkZXIsIGYzMikgeworICAgICAgICBidWlsZGVyLmFkZEZpZWxkRmxvYXQzMig4LCBmMzIsIDAuMCk7CisgICAgfQorICAgIHN0YXRpYyBhZGRGNjQoYnVpbGRlciwgZjY0KSB7CisgICAgICAgIGJ1aWxkZXIuYWRkRmllbGRGbG9hdDY0KDksIGY2NCwgMC4wKTsKKyAgICB9CisgICAgc3RhdGljIGFkZFY4KGJ1aWxkZXIsIHY4T2Zmc2V0KSB7CisgICAgICAgIGJ1aWxkZXIuYWRkRmllbGRPZmZzZXQoMTAsIHY4T2Zmc2V0LCAwKTsKKyAgICB9CisgICAgc3RhdGljIGNyZWF0ZVY4VmVjdG9yKGJ1aWxkZXIsIGRhdGEpIHsKKyAgICAgICAgYnVpbGRlci5zdGFydFZlY3RvcigxLCBkYXRhLmxlbmd0aCwgMSk7CisgICAgICAgIGZvciAobGV0IGkgPSBkYXRhLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7CisgICAgICAgICAgICBidWlsZGVyLmFkZEludDgoZGF0YVtpXSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGJ1aWxkZXIuZW5kVmVjdG9yKCk7CisgICAgfQorICAgIHN0YXRpYyBzdGFydFY4VmVjdG9yKGJ1aWxkZXIsIG51bUVsZW1zKSB7CisgICAgICAgIGJ1aWxkZXIuc3RhcnRWZWN0b3IoMSwgbnVtRWxlbXMsIDEpOworICAgIH0KKyAgICBzdGF0aWMgYWRkVmY2NChidWlsZGVyLCB2ZjY0T2Zmc2V0KSB7CisgICAgICAgIGJ1aWxkZXIuYWRkRmllbGRPZmZzZXQoMTEsIHZmNjRPZmZzZXQsIDApOworICAgIH0KKyAgICBzdGF0aWMgY3JlYXRlVmY2NFZlY3RvcihidWlsZGVyLCBkYXRhKSB7CisgICAgICAgIGJ1aWxkZXIuc3RhcnRWZWN0b3IoOCwgZGF0YS5sZW5ndGgsIDgpOworICAgICAgICBmb3IgKGxldCBpID0gZGF0YS5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgeworICAgICAgICAgICAgYnVpbGRlci5hZGRGbG9hdDY0KGRhdGFbaV0pOworICAgICAgICB9CisgICAgICAgIHJldHVybiBidWlsZGVyLmVuZFZlY3RvcigpOworICAgIH0KKyAgICBzdGF0aWMgc3RhcnRWZjY0VmVjdG9yKGJ1aWxkZXIsIG51bUVsZW1zKSB7CisgICAgICAgIGJ1aWxkZXIuc3RhcnRWZWN0b3IoOCwgbnVtRWxlbXMsIDgpOworICAgIH0KKyAgICBzdGF0aWMgZW5kVHlwZUFsaWFzZXMoYnVpbGRlcikgeworICAgICAgICBjb25zdCBvZmZzZXQgPSBidWlsZGVyLmVuZE9iamVjdCgpOworICAgICAgICByZXR1cm4gb2Zmc2V0OworICAgIH0KKyAgICBzdGF0aWMgY3JlYXRlVHlwZUFsaWFzZXMoYnVpbGRlciwgaTgsIHU4LCBpMTYsIHUxNiwgaTMyLCB1MzIsIGk2NCwgdTY0LCBmMzIsIGY2NCwgdjhPZmZzZXQsIHZmNjRPZmZzZXQpIHsKKyAgICAgICAgVHlwZUFsaWFzZXMuc3RhcnRUeXBlQWxpYXNlcyhidWlsZGVyKTsKKyAgICAgICAgVHlwZUFsaWFzZXMuYWRkSTgoYnVpbGRlciwgaTgpOworICAgICAgICBUeXBlQWxpYXNlcy5hZGRVOChidWlsZGVyLCB1OCk7CisgICAgICAgIFR5cGVBbGlhc2VzLmFkZEkxNihidWlsZGVyLCBpMTYpOworICAgICAgICBUeXBlQWxpYXNlcy5hZGRVMTYoYnVpbGRlciwgdTE2KTsKKyAgICAgICAgVHlwZUFsaWFzZXMuYWRkSTMyKGJ1aWxkZXIsIGkzMik7CisgICAgICAgIFR5cGVBbGlhc2VzLmFkZFUzMihidWlsZGVyLCB1MzIpOworICAgICAgICBUeXBlQWxpYXNlcy5hZGRJNjQoYnVpbGRlciwgaTY0KTsKKyAgICAgICAgVHlwZUFsaWFzZXMuYWRkVTY0KGJ1aWxkZXIsIHU2NCk7CisgICAgICAgIFR5cGVBbGlhc2VzLmFkZEYzMihidWlsZGVyLCBmMzIpOworICAgICAgICBUeXBlQWxpYXNlcy5hZGRGNjQoYnVpbGRlciwgZjY0KTsKKyAgICAgICAgVHlwZUFsaWFzZXMuYWRkVjgoYnVpbGRlciwgdjhPZmZzZXQpOworICAgICAgICBUeXBlQWxpYXNlcy5hZGRWZjY0KGJ1aWxkZXIsIHZmNjRPZmZzZXQpOworICAgICAgICByZXR1cm4gVHlwZUFsaWFzZXMuZW5kVHlwZUFsaWFzZXMoYnVpbGRlcik7CisgICAgfQorICAgIHNlcmlhbGl6ZSgpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuYmIuYnl0ZXMoKTsKKyAgICB9CisgICAgc3RhdGljIGRlc2VyaWFsaXplKGJ1ZmZlcikgeworICAgICAgICByZXR1cm4gVHlwZUFsaWFzZXMuZ2V0Um9vdEFzVHlwZUFsaWFzZXMobmV3IGZsYXRidWZmZXJzLkJ5dGVCdWZmZXIoYnVmZmVyKSk7CisgICAgfQorICAgIHVucGFjaygpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBUeXBlQWxpYXNlc1QodGhpcy5pOCgpLCB0aGlzLnU4KCksIHRoaXMuaTE2KCksIHRoaXMudTE2KCksIHRoaXMuaTMyKCksIHRoaXMudTMyKCksIHRoaXMuaTY0KCksIHRoaXMudTY0KCksIHRoaXMuZjMyKCksIHRoaXMuZjY0KCksIHRoaXMuYmIuY3JlYXRlU2NhbGFyTGlzdCh0aGlzLnY4LmJpbmQodGhpcyksIHRoaXMudjhMZW5ndGgoKSksIHRoaXMuYmIuY3JlYXRlU2NhbGFyTGlzdCh0aGlzLnZmNjQuYmluZCh0aGlzKSwgdGhpcy52ZjY0TGVuZ3RoKCkpKTsKKyAgICB9CisgICAgdW5wYWNrVG8oX28pIHsKKyAgICAgICAgX28uaTggPSB0aGlzLmk4KCk7CisgICAgICAgIF9vLnU4ID0gdGhpcy51OCgpOworICAgICAgICBfby5pMTYgPSB0aGlzLmkxNigpOworICAgICAgICBfby51MTYgPSB0aGlzLnUxNigpOworICAgICAgICBfby5pMzIgPSB0aGlzLmkzMigpOworICAgICAgICBfby51MzIgPSB0aGlzLnUzMigpOworICAgICAgICBfby5pNjQgPSB0aGlzLmk2NCgpOworICAgICAgICBfby51NjQgPSB0aGlzLnU2NCgpOworICAgICAgICBfby5mMzIgPSB0aGlzLmYzMigpOworICAgICAgICBfby5mNjQgPSB0aGlzLmY2NCgpOworICAgICAgICBfby52OCA9IHRoaXMuYmIuY3JlYXRlU2NhbGFyTGlzdCh0aGlzLnY4LmJpbmQodGhpcyksIHRoaXMudjhMZW5ndGgoKSk7CisgICAgICAgIF9vLnZmNjQgPSB0aGlzLmJiLmNyZWF0ZVNjYWxhckxpc3QodGhpcy52ZjY0LmJpbmQodGhpcyksIHRoaXMudmY2NExlbmd0aCgpKTsKKyAgICB9Cit9CitleHBvcnQgY2xhc3MgVHlwZUFsaWFzZXNUIHsKKyAgICBjb25zdHJ1Y3RvcihpOCA9IDAsIHU4ID0gMCwgaTE2ID0gMCwgdTE2ID0gMCwgaTMyID0gMCwgdTMyID0gMCwgaTY0ID0gQmlnSW50KCcwJyksIHU2NCA9IEJpZ0ludCgnMCcpLCBmMzIgPSAwLjAsIGY2NCA9IDAuMCwgdjggPSBbXSwgdmY2NCA9IFtdKSB7CisgICAgICAgIHRoaXMuaTggPSBpODsKKyAgICAgICAgdGhpcy51OCA9IHU4OworICAgICAgICB0aGlzLmkxNiA9IGkxNjsKKyAgICAgICAgdGhpcy51MTYgPSB1MTY7CisgICAgICAgIHRoaXMuaTMyID0gaTMyOworICAgICAgICB0aGlzLnUzMiA9IHUzMjsKKyAgICAgICAgdGhpcy5pNjQgPSBpNjQ7CisgICAgICAgIHRoaXMudTY0ID0gdTY0OworICAgICAgICB0aGlzLmYzMiA9IGYzMjsKKyAgICAgICAgdGhpcy5mNjQgPSBmNjQ7CisgICAgICAgIHRoaXMudjggPSB2ODsKKyAgICAgICAgdGhpcy52ZjY0ID0gdmY2NDsKKyAgICB9CisgICAgcGFjayhidWlsZGVyKSB7CisgICAgICAgIGNvbnN0IHY4ID0gVHlwZUFsaWFzZXMuY3JlYXRlVjhWZWN0b3IoYnVpbGRlciwgdGhpcy52OCk7CisgICAgICAgIGNvbnN0IHZmNjQgPSBUeXBlQWxpYXNlcy5jcmVhdGVWZjY0VmVjdG9yKGJ1aWxkZXIsIHRoaXMudmY2NCk7CisgICAgICAgIHJldHVybiBUeXBlQWxpYXNlcy5jcmVhdGVUeXBlQWxpYXNlcyhidWlsZGVyLCB0aGlzLmk4LCB0aGlzLnU4LCB0aGlzLmkxNiwgdGhpcy51MTYsIHRoaXMuaTMyLCB0aGlzLnUzMiwgdGhpcy5pNjQsIHRoaXMudTY0LCB0aGlzLmYzMiwgdGhpcy5mNjQsIHY4LCB2ZjY0KTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy90cy9teS1nYW1lL2V4YW1wbGUvdHlwZS1hbGlhc2VzLnRzIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvdHMvbXktZ2FtZS9leGFtcGxlL3R5cGUtYWxpYXNlcy50cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MDVjOGNmCi0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvdHMvbXktZ2FtZS9leGFtcGxlL3R5cGUtYWxpYXNlcy50cwpAQCAtMCwwICsxLDQwNSBAQAorLy8gYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgYnkgdGhlIEZsYXRCdWZmZXJzIGNvbXBpbGVyLCBkbyBub3QgbW9kaWZ5CisKK2ltcG9ydCAqIGFzIGZsYXRidWZmZXJzIGZyb20gJ2ZsYXRidWZmZXJzJzsKKworCisKK2V4cG9ydCBjbGFzcyBUeXBlQWxpYXNlcyB7CisgIGJiOiBmbGF0YnVmZmVycy5CeXRlQnVmZmVyfG51bGwgPSBudWxsOworICBiYl9wb3MgPSAwOworICBfX2luaXQoaTpudW1iZXIsIGJiOmZsYXRidWZmZXJzLkJ5dGVCdWZmZXIpOlR5cGVBbGlhc2VzIHsKKyAgdGhpcy5iYl9wb3MgPSBpOworICB0aGlzLmJiID0gYmI7CisgIHJldHVybiB0aGlzOworfQorCitzdGF0aWMgZ2V0Um9vdEFzVHlwZUFsaWFzZXMoYmI6ZmxhdGJ1ZmZlcnMuQnl0ZUJ1ZmZlciwgb2JqPzpUeXBlQWxpYXNlcyk6VHlwZUFsaWFzZXMgeworICByZXR1cm4gKG9iaiB8fCBuZXcgVHlwZUFsaWFzZXMoKSkuX19pbml0KGJiLnJlYWRJbnQzMihiYi5wb3NpdGlvbigpKSArIGJiLnBvc2l0aW9uKCksIGJiKTsKK30KKworc3RhdGljIGdldFNpemVQcmVmaXhlZFJvb3RBc1R5cGVBbGlhc2VzKGJiOmZsYXRidWZmZXJzLkJ5dGVCdWZmZXIsIG9iaj86VHlwZUFsaWFzZXMpOlR5cGVBbGlhc2VzIHsKKyAgYmIuc2V0UG9zaXRpb24oYmIucG9zaXRpb24oKSArIGZsYXRidWZmZXJzLlNJWkVfUFJFRklYX0xFTkdUSCk7CisgIHJldHVybiAob2JqIHx8IG5ldyBUeXBlQWxpYXNlcygpKS5fX2luaXQoYmIucmVhZEludDMyKGJiLnBvc2l0aW9uKCkpICsgYmIucG9zaXRpb24oKSwgYmIpOworfQorCitpOCgpOm51bWJlciB7CisgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIhLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCA0KTsKKyAgcmV0dXJuIG9mZnNldCA/IHRoaXMuYmIhLnJlYWRJbnQ4KHRoaXMuYmJfcG9zICsgb2Zmc2V0KSA6IDA7Cit9CisKK211dGF0ZV9pOCh2YWx1ZTpudW1iZXIpOmJvb2xlYW4geworICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiIS5fX29mZnNldCh0aGlzLmJiX3BvcywgNCk7CisKKyAgaWYgKG9mZnNldCA9PT0gMCkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHRoaXMuYmIhLndyaXRlSW50OCh0aGlzLmJiX3BvcyArIG9mZnNldCwgdmFsdWUpOworICByZXR1cm4gdHJ1ZTsKK30KKwordTgoKTpudW1iZXIgeworICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiIS5fX29mZnNldCh0aGlzLmJiX3BvcywgNik7CisgIHJldHVybiBvZmZzZXQgPyB0aGlzLmJiIS5yZWFkVWludDgodGhpcy5iYl9wb3MgKyBvZmZzZXQpIDogMDsKK30KKworbXV0YXRlX3U4KHZhbHVlOm51bWJlcik6Ym9vbGVhbiB7CisgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIhLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCA2KTsKKworICBpZiAob2Zmc2V0ID09PSAwKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgdGhpcy5iYiEud3JpdGVVaW50OCh0aGlzLmJiX3BvcyArIG9mZnNldCwgdmFsdWUpOworICByZXR1cm4gdHJ1ZTsKK30KKworaTE2KCk6bnVtYmVyIHsKKyAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYiEuX19vZmZzZXQodGhpcy5iYl9wb3MsIDgpOworICByZXR1cm4gb2Zmc2V0ID8gdGhpcy5iYiEucmVhZEludDE2KHRoaXMuYmJfcG9zICsgb2Zmc2V0KSA6IDA7Cit9CisKK211dGF0ZV9pMTYodmFsdWU6bnVtYmVyKTpib29sZWFuIHsKKyAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYiEuX19vZmZzZXQodGhpcy5iYl9wb3MsIDgpOworCisgIGlmIChvZmZzZXQgPT09IDApIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICB0aGlzLmJiIS53cml0ZUludDE2KHRoaXMuYmJfcG9zICsgb2Zmc2V0LCB2YWx1ZSk7CisgIHJldHVybiB0cnVlOworfQorCit1MTYoKTpudW1iZXIgeworICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiIS5fX29mZnNldCh0aGlzLmJiX3BvcywgMTApOworICByZXR1cm4gb2Zmc2V0ID8gdGhpcy5iYiEucmVhZFVpbnQxNih0aGlzLmJiX3BvcyArIG9mZnNldCkgOiAwOworfQorCittdXRhdGVfdTE2KHZhbHVlOm51bWJlcik6Ym9vbGVhbiB7CisgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIhLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCAxMCk7CisKKyAgaWYgKG9mZnNldCA9PT0gMCkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHRoaXMuYmIhLndyaXRlVWludDE2KHRoaXMuYmJfcG9zICsgb2Zmc2V0LCB2YWx1ZSk7CisgIHJldHVybiB0cnVlOworfQorCitpMzIoKTpudW1iZXIgeworICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiIS5fX29mZnNldCh0aGlzLmJiX3BvcywgMTIpOworICByZXR1cm4gb2Zmc2V0ID8gdGhpcy5iYiEucmVhZEludDMyKHRoaXMuYmJfcG9zICsgb2Zmc2V0KSA6IDA7Cit9CisKK211dGF0ZV9pMzIodmFsdWU6bnVtYmVyKTpib29sZWFuIHsKKyAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYiEuX19vZmZzZXQodGhpcy5iYl9wb3MsIDEyKTsKKworICBpZiAob2Zmc2V0ID09PSAwKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgdGhpcy5iYiEud3JpdGVJbnQzMih0aGlzLmJiX3BvcyArIG9mZnNldCwgdmFsdWUpOworICByZXR1cm4gdHJ1ZTsKK30KKwordTMyKCk6bnVtYmVyIHsKKyAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYiEuX19vZmZzZXQodGhpcy5iYl9wb3MsIDE0KTsKKyAgcmV0dXJuIG9mZnNldCA/IHRoaXMuYmIhLnJlYWRVaW50MzIodGhpcy5iYl9wb3MgKyBvZmZzZXQpIDogMDsKK30KKworbXV0YXRlX3UzMih2YWx1ZTpudW1iZXIpOmJvb2xlYW4geworICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiIS5fX29mZnNldCh0aGlzLmJiX3BvcywgMTQpOworCisgIGlmIChvZmZzZXQgPT09IDApIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICB0aGlzLmJiIS53cml0ZVVpbnQzMih0aGlzLmJiX3BvcyArIG9mZnNldCwgdmFsdWUpOworICByZXR1cm4gdHJ1ZTsKK30KKworaTY0KCk6YmlnaW50IHsKKyAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYiEuX19vZmZzZXQodGhpcy5iYl9wb3MsIDE2KTsKKyAgcmV0dXJuIG9mZnNldCA/IHRoaXMuYmIhLnJlYWRJbnQ2NCh0aGlzLmJiX3BvcyArIG9mZnNldCkgOiBCaWdJbnQoJzAnKTsKK30KKworbXV0YXRlX2k2NCh2YWx1ZTpiaWdpbnQpOmJvb2xlYW4geworICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiIS5fX29mZnNldCh0aGlzLmJiX3BvcywgMTYpOworCisgIGlmIChvZmZzZXQgPT09IDApIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICB0aGlzLmJiIS53cml0ZUludDY0KHRoaXMuYmJfcG9zICsgb2Zmc2V0LCB2YWx1ZSk7CisgIHJldHVybiB0cnVlOworfQorCit1NjQoKTpiaWdpbnQgeworICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiIS5fX29mZnNldCh0aGlzLmJiX3BvcywgMTgpOworICByZXR1cm4gb2Zmc2V0ID8gdGhpcy5iYiEucmVhZFVpbnQ2NCh0aGlzLmJiX3BvcyArIG9mZnNldCkgOiBCaWdJbnQoJzAnKTsKK30KKworbXV0YXRlX3U2NCh2YWx1ZTpiaWdpbnQpOmJvb2xlYW4geworICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiIS5fX29mZnNldCh0aGlzLmJiX3BvcywgMTgpOworCisgIGlmIChvZmZzZXQgPT09IDApIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICB0aGlzLmJiIS53cml0ZVVpbnQ2NCh0aGlzLmJiX3BvcyArIG9mZnNldCwgdmFsdWUpOworICByZXR1cm4gdHJ1ZTsKK30KKworZjMyKCk6bnVtYmVyIHsKKyAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYiEuX19vZmZzZXQodGhpcy5iYl9wb3MsIDIwKTsKKyAgcmV0dXJuIG9mZnNldCA/IHRoaXMuYmIhLnJlYWRGbG9hdDMyKHRoaXMuYmJfcG9zICsgb2Zmc2V0KSA6IDAuMDsKK30KKworbXV0YXRlX2YzMih2YWx1ZTpudW1iZXIpOmJvb2xlYW4geworICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiIS5fX29mZnNldCh0aGlzLmJiX3BvcywgMjApOworCisgIGlmIChvZmZzZXQgPT09IDApIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICB0aGlzLmJiIS53cml0ZUZsb2F0MzIodGhpcy5iYl9wb3MgKyBvZmZzZXQsIHZhbHVlKTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK2Y2NCgpOm51bWJlciB7CisgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIhLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCAyMik7CisgIHJldHVybiBvZmZzZXQgPyB0aGlzLmJiIS5yZWFkRmxvYXQ2NCh0aGlzLmJiX3BvcyArIG9mZnNldCkgOiAwLjA7Cit9CisKK211dGF0ZV9mNjQodmFsdWU6bnVtYmVyKTpib29sZWFuIHsKKyAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYiEuX19vZmZzZXQodGhpcy5iYl9wb3MsIDIyKTsKKworICBpZiAob2Zmc2V0ID09PSAwKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgdGhpcy5iYiEud3JpdGVGbG9hdDY0KHRoaXMuYmJfcG9zICsgb2Zmc2V0LCB2YWx1ZSk7CisgIHJldHVybiB0cnVlOworfQorCit2OChpbmRleDogbnVtYmVyKTpudW1iZXJ8bnVsbCB7CisgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIhLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCAyNCk7CisgIHJldHVybiBvZmZzZXQgPyB0aGlzLmJiIS5yZWFkSW50OCh0aGlzLmJiIS5fX3ZlY3Rvcih0aGlzLmJiX3BvcyArIG9mZnNldCkgKyBpbmRleCkgOiAwOworfQorCit2OExlbmd0aCgpOm51bWJlciB7CisgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIhLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCAyNCk7CisgIHJldHVybiBvZmZzZXQgPyB0aGlzLmJiIS5fX3ZlY3Rvcl9sZW4odGhpcy5iYl9wb3MgKyBvZmZzZXQpIDogMDsKK30KKwordjhBcnJheSgpOkludDhBcnJheXxudWxsIHsKKyAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYiEuX19vZmZzZXQodGhpcy5iYl9wb3MsIDI0KTsKKyAgcmV0dXJuIG9mZnNldCA/IG5ldyBJbnQ4QXJyYXkodGhpcy5iYiEuYnl0ZXMoKS5idWZmZXIsIHRoaXMuYmIhLmJ5dGVzKCkuYnl0ZU9mZnNldCArIHRoaXMuYmIhLl9fdmVjdG9yKHRoaXMuYmJfcG9zICsgb2Zmc2V0KSwgdGhpcy5iYiEuX192ZWN0b3JfbGVuKHRoaXMuYmJfcG9zICsgb2Zmc2V0KSkgOiBudWxsOworfQorCit2ZjY0KGluZGV4OiBudW1iZXIpOm51bWJlcnxudWxsIHsKKyAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYiEuX19vZmZzZXQodGhpcy5iYl9wb3MsIDI2KTsKKyAgcmV0dXJuIG9mZnNldCA/IHRoaXMuYmIhLnJlYWRGbG9hdDY0KHRoaXMuYmIhLl9fdmVjdG9yKHRoaXMuYmJfcG9zICsgb2Zmc2V0KSArIGluZGV4ICogOCkgOiAwOworfQorCit2ZjY0TGVuZ3RoKCk6bnVtYmVyIHsKKyAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYiEuX19vZmZzZXQodGhpcy5iYl9wb3MsIDI2KTsKKyAgcmV0dXJuIG9mZnNldCA/IHRoaXMuYmIhLl9fdmVjdG9yX2xlbih0aGlzLmJiX3BvcyArIG9mZnNldCkgOiAwOworfQorCit2ZjY0QXJyYXkoKTpGbG9hdDY0QXJyYXl8bnVsbCB7CisgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIhLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCAyNik7CisgIHJldHVybiBvZmZzZXQgPyBuZXcgRmxvYXQ2NEFycmF5KHRoaXMuYmIhLmJ5dGVzKCkuYnVmZmVyLCB0aGlzLmJiIS5ieXRlcygpLmJ5dGVPZmZzZXQgKyB0aGlzLmJiIS5fX3ZlY3Rvcih0aGlzLmJiX3BvcyArIG9mZnNldCksIHRoaXMuYmIhLl9fdmVjdG9yX2xlbih0aGlzLmJiX3BvcyArIG9mZnNldCkpIDogbnVsbDsKK30KKworc3RhdGljIGdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpOnN0cmluZyB7CisgIHJldHVybiAnTXlHYW1lX0V4YW1wbGVfVHlwZUFsaWFzZXMnOworfQorCitzdGF0aWMgc3RhcnRUeXBlQWxpYXNlcyhidWlsZGVyOmZsYXRidWZmZXJzLkJ1aWxkZXIpIHsKKyAgYnVpbGRlci5zdGFydE9iamVjdCgxMik7Cit9CisKK3N0YXRpYyBhZGRJOChidWlsZGVyOmZsYXRidWZmZXJzLkJ1aWxkZXIsIGk4Om51bWJlcikgeworICBidWlsZGVyLmFkZEZpZWxkSW50OCgwLCBpOCwgMCk7Cit9CisKK3N0YXRpYyBhZGRVOChidWlsZGVyOmZsYXRidWZmZXJzLkJ1aWxkZXIsIHU4Om51bWJlcikgeworICBidWlsZGVyLmFkZEZpZWxkSW50OCgxLCB1OCwgMCk7Cit9CisKK3N0YXRpYyBhZGRJMTYoYnVpbGRlcjpmbGF0YnVmZmVycy5CdWlsZGVyLCBpMTY6bnVtYmVyKSB7CisgIGJ1aWxkZXIuYWRkRmllbGRJbnQxNigyLCBpMTYsIDApOworfQorCitzdGF0aWMgYWRkVTE2KGJ1aWxkZXI6ZmxhdGJ1ZmZlcnMuQnVpbGRlciwgdTE2Om51bWJlcikgeworICBidWlsZGVyLmFkZEZpZWxkSW50MTYoMywgdTE2LCAwKTsKK30KKworc3RhdGljIGFkZEkzMihidWlsZGVyOmZsYXRidWZmZXJzLkJ1aWxkZXIsIGkzMjpudW1iZXIpIHsKKyAgYnVpbGRlci5hZGRGaWVsZEludDMyKDQsIGkzMiwgMCk7Cit9CisKK3N0YXRpYyBhZGRVMzIoYnVpbGRlcjpmbGF0YnVmZmVycy5CdWlsZGVyLCB1MzI6bnVtYmVyKSB7CisgIGJ1aWxkZXIuYWRkRmllbGRJbnQzMig1LCB1MzIsIDApOworfQorCitzdGF0aWMgYWRkSTY0KGJ1aWxkZXI6ZmxhdGJ1ZmZlcnMuQnVpbGRlciwgaTY0OmJpZ2ludCkgeworICBidWlsZGVyLmFkZEZpZWxkSW50NjQoNiwgaTY0LCBCaWdJbnQoJzAnKSk7Cit9CisKK3N0YXRpYyBhZGRVNjQoYnVpbGRlcjpmbGF0YnVmZmVycy5CdWlsZGVyLCB1NjQ6YmlnaW50KSB7CisgIGJ1aWxkZXIuYWRkRmllbGRJbnQ2NCg3LCB1NjQsIEJpZ0ludCgnMCcpKTsKK30KKworc3RhdGljIGFkZEYzMihidWlsZGVyOmZsYXRidWZmZXJzLkJ1aWxkZXIsIGYzMjpudW1iZXIpIHsKKyAgYnVpbGRlci5hZGRGaWVsZEZsb2F0MzIoOCwgZjMyLCAwLjApOworfQorCitzdGF0aWMgYWRkRjY0KGJ1aWxkZXI6ZmxhdGJ1ZmZlcnMuQnVpbGRlciwgZjY0Om51bWJlcikgeworICBidWlsZGVyLmFkZEZpZWxkRmxvYXQ2NCg5LCBmNjQsIDAuMCk7Cit9CisKK3N0YXRpYyBhZGRWOChidWlsZGVyOmZsYXRidWZmZXJzLkJ1aWxkZXIsIHY4T2Zmc2V0OmZsYXRidWZmZXJzLk9mZnNldCkgeworICBidWlsZGVyLmFkZEZpZWxkT2Zmc2V0KDEwLCB2OE9mZnNldCwgMCk7Cit9CisKK3N0YXRpYyBjcmVhdGVWOFZlY3RvcihidWlsZGVyOmZsYXRidWZmZXJzLkJ1aWxkZXIsIGRhdGE6bnVtYmVyW118SW50OEFycmF5KTpmbGF0YnVmZmVycy5PZmZzZXQ7CisvKioKKyAqIEBkZXByZWNhdGVkIFRoaXMgVWludDhBcnJheSBvdmVybG9hZCB3aWxsIGJlIHJlbW92ZWQgaW4gdGhlIGZ1dHVyZS4KKyAqLworc3RhdGljIGNyZWF0ZVY4VmVjdG9yKGJ1aWxkZXI6ZmxhdGJ1ZmZlcnMuQnVpbGRlciwgZGF0YTpudW1iZXJbXXxVaW50OEFycmF5KTpmbGF0YnVmZmVycy5PZmZzZXQ7CitzdGF0aWMgY3JlYXRlVjhWZWN0b3IoYnVpbGRlcjpmbGF0YnVmZmVycy5CdWlsZGVyLCBkYXRhOm51bWJlcltdfEludDhBcnJheXxVaW50OEFycmF5KTpmbGF0YnVmZmVycy5PZmZzZXQgeworICBidWlsZGVyLnN0YXJ0VmVjdG9yKDEsIGRhdGEubGVuZ3RoLCAxKTsKKyAgZm9yIChsZXQgaSA9IGRhdGEubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHsKKyAgICBidWlsZGVyLmFkZEludDgoZGF0YVtpXSEpOworICB9CisgIHJldHVybiBidWlsZGVyLmVuZFZlY3RvcigpOworfQorCitzdGF0aWMgc3RhcnRWOFZlY3RvcihidWlsZGVyOmZsYXRidWZmZXJzLkJ1aWxkZXIsIG51bUVsZW1zOm51bWJlcikgeworICBidWlsZGVyLnN0YXJ0VmVjdG9yKDEsIG51bUVsZW1zLCAxKTsKK30KKworc3RhdGljIGFkZFZmNjQoYnVpbGRlcjpmbGF0YnVmZmVycy5CdWlsZGVyLCB2ZjY0T2Zmc2V0OmZsYXRidWZmZXJzLk9mZnNldCkgeworICBidWlsZGVyLmFkZEZpZWxkT2Zmc2V0KDExLCB2ZjY0T2Zmc2V0LCAwKTsKK30KKworc3RhdGljIGNyZWF0ZVZmNjRWZWN0b3IoYnVpbGRlcjpmbGF0YnVmZmVycy5CdWlsZGVyLCBkYXRhOm51bWJlcltdfEZsb2F0NjRBcnJheSk6ZmxhdGJ1ZmZlcnMuT2Zmc2V0OworLyoqCisgKiBAZGVwcmVjYXRlZCBUaGlzIFVpbnQ4QXJyYXkgb3ZlcmxvYWQgd2lsbCBiZSByZW1vdmVkIGluIHRoZSBmdXR1cmUuCisgKi8KK3N0YXRpYyBjcmVhdGVWZjY0VmVjdG9yKGJ1aWxkZXI6ZmxhdGJ1ZmZlcnMuQnVpbGRlciwgZGF0YTpudW1iZXJbXXxVaW50OEFycmF5KTpmbGF0YnVmZmVycy5PZmZzZXQ7CitzdGF0aWMgY3JlYXRlVmY2NFZlY3RvcihidWlsZGVyOmZsYXRidWZmZXJzLkJ1aWxkZXIsIGRhdGE6bnVtYmVyW118RmxvYXQ2NEFycmF5fFVpbnQ4QXJyYXkpOmZsYXRidWZmZXJzLk9mZnNldCB7CisgIGJ1aWxkZXIuc3RhcnRWZWN0b3IoOCwgZGF0YS5sZW5ndGgsIDgpOworICBmb3IgKGxldCBpID0gZGF0YS5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgeworICAgIGJ1aWxkZXIuYWRkRmxvYXQ2NChkYXRhW2ldISk7CisgIH0KKyAgcmV0dXJuIGJ1aWxkZXIuZW5kVmVjdG9yKCk7Cit9CisKK3N0YXRpYyBzdGFydFZmNjRWZWN0b3IoYnVpbGRlcjpmbGF0YnVmZmVycy5CdWlsZGVyLCBudW1FbGVtczpudW1iZXIpIHsKKyAgYnVpbGRlci5zdGFydFZlY3Rvcig4LCBudW1FbGVtcywgOCk7Cit9CisKK3N0YXRpYyBlbmRUeXBlQWxpYXNlcyhidWlsZGVyOmZsYXRidWZmZXJzLkJ1aWxkZXIpOmZsYXRidWZmZXJzLk9mZnNldCB7CisgIGNvbnN0IG9mZnNldCA9IGJ1aWxkZXIuZW5kT2JqZWN0KCk7CisgIHJldHVybiBvZmZzZXQ7Cit9CisKK3N0YXRpYyBjcmVhdGVUeXBlQWxpYXNlcyhidWlsZGVyOmZsYXRidWZmZXJzLkJ1aWxkZXIsIGk4Om51bWJlciwgdTg6bnVtYmVyLCBpMTY6bnVtYmVyLCB1MTY6bnVtYmVyLCBpMzI6bnVtYmVyLCB1MzI6bnVtYmVyLCBpNjQ6YmlnaW50LCB1NjQ6YmlnaW50LCBmMzI6bnVtYmVyLCBmNjQ6bnVtYmVyLCB2OE9mZnNldDpmbGF0YnVmZmVycy5PZmZzZXQsIHZmNjRPZmZzZXQ6ZmxhdGJ1ZmZlcnMuT2Zmc2V0KTpmbGF0YnVmZmVycy5PZmZzZXQgeworICBUeXBlQWxpYXNlcy5zdGFydFR5cGVBbGlhc2VzKGJ1aWxkZXIpOworICBUeXBlQWxpYXNlcy5hZGRJOChidWlsZGVyLCBpOCk7CisgIFR5cGVBbGlhc2VzLmFkZFU4KGJ1aWxkZXIsIHU4KTsKKyAgVHlwZUFsaWFzZXMuYWRkSTE2KGJ1aWxkZXIsIGkxNik7CisgIFR5cGVBbGlhc2VzLmFkZFUxNihidWlsZGVyLCB1MTYpOworICBUeXBlQWxpYXNlcy5hZGRJMzIoYnVpbGRlciwgaTMyKTsKKyAgVHlwZUFsaWFzZXMuYWRkVTMyKGJ1aWxkZXIsIHUzMik7CisgIFR5cGVBbGlhc2VzLmFkZEk2NChidWlsZGVyLCBpNjQpOworICBUeXBlQWxpYXNlcy5hZGRVNjQoYnVpbGRlciwgdTY0KTsKKyAgVHlwZUFsaWFzZXMuYWRkRjMyKGJ1aWxkZXIsIGYzMik7CisgIFR5cGVBbGlhc2VzLmFkZEY2NChidWlsZGVyLCBmNjQpOworICBUeXBlQWxpYXNlcy5hZGRWOChidWlsZGVyLCB2OE9mZnNldCk7CisgIFR5cGVBbGlhc2VzLmFkZFZmNjQoYnVpbGRlciwgdmY2NE9mZnNldCk7CisgIHJldHVybiBUeXBlQWxpYXNlcy5lbmRUeXBlQWxpYXNlcyhidWlsZGVyKTsKK30KKworc2VyaWFsaXplKCk6VWludDhBcnJheSB7CisgIHJldHVybiB0aGlzLmJiIS5ieXRlcygpOworfQorCitzdGF0aWMgZGVzZXJpYWxpemUoYnVmZmVyOiBVaW50OEFycmF5KTpUeXBlQWxpYXNlcyB7CisgIHJldHVybiBUeXBlQWxpYXNlcy5nZXRSb290QXNUeXBlQWxpYXNlcyhuZXcgZmxhdGJ1ZmZlcnMuQnl0ZUJ1ZmZlcihidWZmZXIpKQorfQorCit1bnBhY2soKTogVHlwZUFsaWFzZXNUIHsKKyAgcmV0dXJuIG5ldyBUeXBlQWxpYXNlc1QoCisgICAgdGhpcy5pOCgpLAorICAgIHRoaXMudTgoKSwKKyAgICB0aGlzLmkxNigpLAorICAgIHRoaXMudTE2KCksCisgICAgdGhpcy5pMzIoKSwKKyAgICB0aGlzLnUzMigpLAorICAgIHRoaXMuaTY0KCksCisgICAgdGhpcy51NjQoKSwKKyAgICB0aGlzLmYzMigpLAorICAgIHRoaXMuZjY0KCksCisgICAgdGhpcy5iYiEuY3JlYXRlU2NhbGFyTGlzdCh0aGlzLnY4LmJpbmQodGhpcyksIHRoaXMudjhMZW5ndGgoKSksCisgICAgdGhpcy5iYiEuY3JlYXRlU2NhbGFyTGlzdCh0aGlzLnZmNjQuYmluZCh0aGlzKSwgdGhpcy52ZjY0TGVuZ3RoKCkpCisgICk7Cit9CisKKwordW5wYWNrVG8oX286IFR5cGVBbGlhc2VzVCk6IHZvaWQgeworICBfby5pOCA9IHRoaXMuaTgoKTsKKyAgX28udTggPSB0aGlzLnU4KCk7CisgIF9vLmkxNiA9IHRoaXMuaTE2KCk7CisgIF9vLnUxNiA9IHRoaXMudTE2KCk7CisgIF9vLmkzMiA9IHRoaXMuaTMyKCk7CisgIF9vLnUzMiA9IHRoaXMudTMyKCk7CisgIF9vLmk2NCA9IHRoaXMuaTY0KCk7CisgIF9vLnU2NCA9IHRoaXMudTY0KCk7CisgIF9vLmYzMiA9IHRoaXMuZjMyKCk7CisgIF9vLmY2NCA9IHRoaXMuZjY0KCk7CisgIF9vLnY4ID0gdGhpcy5iYiEuY3JlYXRlU2NhbGFyTGlzdCh0aGlzLnY4LmJpbmQodGhpcyksIHRoaXMudjhMZW5ndGgoKSk7CisgIF9vLnZmNjQgPSB0aGlzLmJiIS5jcmVhdGVTY2FsYXJMaXN0KHRoaXMudmY2NC5iaW5kKHRoaXMpLCB0aGlzLnZmNjRMZW5ndGgoKSk7Cit9Cit9CisKK2V4cG9ydCBjbGFzcyBUeXBlQWxpYXNlc1QgeworY29uc3RydWN0b3IoCisgIHB1YmxpYyBpODogbnVtYmVyID0gMCwKKyAgcHVibGljIHU4OiBudW1iZXIgPSAwLAorICBwdWJsaWMgaTE2OiBudW1iZXIgPSAwLAorICBwdWJsaWMgdTE2OiBudW1iZXIgPSAwLAorICBwdWJsaWMgaTMyOiBudW1iZXIgPSAwLAorICBwdWJsaWMgdTMyOiBudW1iZXIgPSAwLAorICBwdWJsaWMgaTY0OiBiaWdpbnQgPSBCaWdJbnQoJzAnKSwKKyAgcHVibGljIHU2NDogYmlnaW50ID0gQmlnSW50KCcwJyksCisgIHB1YmxpYyBmMzI6IG51bWJlciA9IDAuMCwKKyAgcHVibGljIGY2NDogbnVtYmVyID0gMC4wLAorICBwdWJsaWMgdjg6IChudW1iZXIpW10gPSBbXSwKKyAgcHVibGljIHZmNjQ6IChudW1iZXIpW10gPSBbXQorKXt9CisKKworcGFjayhidWlsZGVyOmZsYXRidWZmZXJzLkJ1aWxkZXIpOiBmbGF0YnVmZmVycy5PZmZzZXQgeworICBjb25zdCB2OCA9IFR5cGVBbGlhc2VzLmNyZWF0ZVY4VmVjdG9yKGJ1aWxkZXIsIHRoaXMudjgpOworICBjb25zdCB2ZjY0ID0gVHlwZUFsaWFzZXMuY3JlYXRlVmY2NFZlY3RvcihidWlsZGVyLCB0aGlzLnZmNjQpOworCisgIHJldHVybiBUeXBlQWxpYXNlcy5jcmVhdGVUeXBlQWxpYXNlcyhidWlsZGVyLAorICAgIHRoaXMuaTgsCisgICAgdGhpcy51OCwKKyAgICB0aGlzLmkxNiwKKyAgICB0aGlzLnUxNiwKKyAgICB0aGlzLmkzMiwKKyAgICB0aGlzLnUzMiwKKyAgICB0aGlzLmk2NCwKKyAgICB0aGlzLnU2NCwKKyAgICB0aGlzLmYzMiwKKyAgICB0aGlzLmY2NCwKKyAgICB2OCwKKyAgICB2ZjY0CisgICk7Cit9Cit9CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy90cy9teS1nYW1lL2V4YW1wbGUvdmVjMy5qcyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL3RzL215LWdhbWUvZXhhbXBsZS92ZWMzLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhZTY0ZWIKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy90cy9teS1nYW1lL2V4YW1wbGUvdmVjMy5qcwpAQCAtMCwwICsxLDk4IEBACisvLyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBieSB0aGUgRmxhdEJ1ZmZlcnMgY29tcGlsZXIsIGRvIG5vdCBtb2RpZnkKK2ltcG9ydCB7IFRlc3QgfSBmcm9tICcuLi8uLi9teS1nYW1lL2V4YW1wbGUvdGVzdC5qcyc7CitleHBvcnQgY2xhc3MgVmVjMyB7CisgICAgY29uc3RydWN0b3IoKSB7CisgICAgICAgIHRoaXMuYmIgPSBudWxsOworICAgICAgICB0aGlzLmJiX3BvcyA9IDA7CisgICAgfQorICAgIF9faW5pdChpLCBiYikgeworICAgICAgICB0aGlzLmJiX3BvcyA9IGk7CisgICAgICAgIHRoaXMuYmIgPSBiYjsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorICAgIHgoKSB7CisgICAgICAgIHJldHVybiB0aGlzLmJiLnJlYWRGbG9hdDMyKHRoaXMuYmJfcG9zKTsKKyAgICB9CisgICAgbXV0YXRlX3godmFsdWUpIHsKKyAgICAgICAgdGhpcy5iYi53cml0ZUZsb2F0MzIodGhpcy5iYl9wb3MgKyAwLCB2YWx1ZSk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICB5KCkgeworICAgICAgICByZXR1cm4gdGhpcy5iYi5yZWFkRmxvYXQzMih0aGlzLmJiX3BvcyArIDQpOworICAgIH0KKyAgICBtdXRhdGVfeSh2YWx1ZSkgeworICAgICAgICB0aGlzLmJiLndyaXRlRmxvYXQzMih0aGlzLmJiX3BvcyArIDQsIHZhbHVlKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIHooKSB7CisgICAgICAgIHJldHVybiB0aGlzLmJiLnJlYWRGbG9hdDMyKHRoaXMuYmJfcG9zICsgOCk7CisgICAgfQorICAgIG11dGF0ZV96KHZhbHVlKSB7CisgICAgICAgIHRoaXMuYmIud3JpdGVGbG9hdDMyKHRoaXMuYmJfcG9zICsgOCwgdmFsdWUpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgdGVzdDEoKSB7CisgICAgICAgIHJldHVybiB0aGlzLmJiLnJlYWRGbG9hdDY0KHRoaXMuYmJfcG9zICsgMTYpOworICAgIH0KKyAgICBtdXRhdGVfdGVzdDEodmFsdWUpIHsKKyAgICAgICAgdGhpcy5iYi53cml0ZUZsb2F0NjQodGhpcy5iYl9wb3MgKyAxNiwgdmFsdWUpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgdGVzdDIoKSB7CisgICAgICAgIHJldHVybiB0aGlzLmJiLnJlYWRVaW50OCh0aGlzLmJiX3BvcyArIDI0KTsKKyAgICB9CisgICAgbXV0YXRlX3Rlc3QyKHZhbHVlKSB7CisgICAgICAgIHRoaXMuYmIud3JpdGVVaW50OCh0aGlzLmJiX3BvcyArIDI0LCB2YWx1ZSk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICB0ZXN0MyhvYmopIHsKKyAgICAgICAgcmV0dXJuIChvYmogfHwgbmV3IFRlc3QoKSkuX19pbml0KHRoaXMuYmJfcG9zICsgMjYsIHRoaXMuYmIpOworICAgIH0KKyAgICBzdGF0aWMgZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCkgeworICAgICAgICByZXR1cm4gJ015R2FtZV9FeGFtcGxlX1ZlYzMnOworICAgIH0KKyAgICBzdGF0aWMgc2l6ZU9mKCkgeworICAgICAgICByZXR1cm4gMzI7CisgICAgfQorICAgIHN0YXRpYyBjcmVhdGVWZWMzKGJ1aWxkZXIsIHgsIHksIHosIHRlc3QxLCB0ZXN0MiwgdGVzdDNfYSwgdGVzdDNfYikgeworICAgICAgICBidWlsZGVyLnByZXAoOCwgMzIpOworICAgICAgICBidWlsZGVyLnBhZCgyKTsKKyAgICAgICAgYnVpbGRlci5wcmVwKDIsIDQpOworICAgICAgICBidWlsZGVyLnBhZCgxKTsKKyAgICAgICAgYnVpbGRlci53cml0ZUludDgodGVzdDNfYik7CisgICAgICAgIGJ1aWxkZXIud3JpdGVJbnQxNih0ZXN0M19hKTsKKyAgICAgICAgYnVpbGRlci5wYWQoMSk7CisgICAgICAgIGJ1aWxkZXIud3JpdGVJbnQ4KHRlc3QyKTsKKyAgICAgICAgYnVpbGRlci53cml0ZUZsb2F0NjQodGVzdDEpOworICAgICAgICBidWlsZGVyLnBhZCg0KTsKKyAgICAgICAgYnVpbGRlci53cml0ZUZsb2F0MzIoeik7CisgICAgICAgIGJ1aWxkZXIud3JpdGVGbG9hdDMyKHkpOworICAgICAgICBidWlsZGVyLndyaXRlRmxvYXQzMih4KTsKKyAgICAgICAgcmV0dXJuIGJ1aWxkZXIub2Zmc2V0KCk7CisgICAgfQorICAgIHVucGFjaygpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBWZWMzVCh0aGlzLngoKSwgdGhpcy55KCksIHRoaXMueigpLCB0aGlzLnRlc3QxKCksIHRoaXMudGVzdDIoKSwgKHRoaXMudGVzdDMoKSAhPT0gbnVsbCA/IHRoaXMudGVzdDMoKS51bnBhY2soKSA6IG51bGwpKTsKKyAgICB9CisgICAgdW5wYWNrVG8oX28pIHsKKyAgICAgICAgX28ueCA9IHRoaXMueCgpOworICAgICAgICBfby55ID0gdGhpcy55KCk7CisgICAgICAgIF9vLnogPSB0aGlzLnooKTsKKyAgICAgICAgX28udGVzdDEgPSB0aGlzLnRlc3QxKCk7CisgICAgICAgIF9vLnRlc3QyID0gdGhpcy50ZXN0MigpOworICAgICAgICBfby50ZXN0MyA9ICh0aGlzLnRlc3QzKCkgIT09IG51bGwgPyB0aGlzLnRlc3QzKCkudW5wYWNrKCkgOiBudWxsKTsKKyAgICB9Cit9CitleHBvcnQgY2xhc3MgVmVjM1QgeworICAgIGNvbnN0cnVjdG9yKHggPSAwLjAsIHkgPSAwLjAsIHogPSAwLjAsIHRlc3QxID0gMC4wLCB0ZXN0MiA9IDAsIHRlc3QzID0gbnVsbCkgeworICAgICAgICB0aGlzLnggPSB4OworICAgICAgICB0aGlzLnkgPSB5OworICAgICAgICB0aGlzLnogPSB6OworICAgICAgICB0aGlzLnRlc3QxID0gdGVzdDE7CisgICAgICAgIHRoaXMudGVzdDIgPSB0ZXN0MjsKKyAgICAgICAgdGhpcy50ZXN0MyA9IHRlc3QzOworICAgIH0KKyAgICBwYWNrKGJ1aWxkZXIpIHsKKyAgICAgICAgdmFyIF9hLCBfYiwgX2MsIF9kOworICAgICAgICByZXR1cm4gVmVjMy5jcmVhdGVWZWMzKGJ1aWxkZXIsIHRoaXMueCwgdGhpcy55LCB0aGlzLnosIHRoaXMudGVzdDEsIHRoaXMudGVzdDIsICgoX2IgPSAoX2EgPSB0aGlzLnRlc3QzKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuYSkgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogMCksICgoX2QgPSAoX2MgPSB0aGlzLnRlc3QzKSA9PT0gbnVsbCB8fCBfYyA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2MuYikgIT09IG51bGwgJiYgX2QgIT09IHZvaWQgMCA/IF9kIDogMCkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL3RzL215LWdhbWUvZXhhbXBsZS92ZWMzLnRzIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvdHMvbXktZ2FtZS9leGFtcGxlL3ZlYzMudHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmM0YzQ3MwotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL3RzL215LWdhbWUvZXhhbXBsZS92ZWMzLnRzCkBAIC0wLDAgKzEsMTM3IEBACisvLyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBieSB0aGUgRmxhdEJ1ZmZlcnMgY29tcGlsZXIsIGRvIG5vdCBtb2RpZnkKKworaW1wb3J0ICogYXMgZmxhdGJ1ZmZlcnMgZnJvbSAnZmxhdGJ1ZmZlcnMnOworCitpbXBvcnQgeyBDb2xvciB9IGZyb20gJy4uLy4uL215LWdhbWUvZXhhbXBsZS9jb2xvci5qcyc7CitpbXBvcnQgeyBUZXN0LCBUZXN0VCB9IGZyb20gJy4uLy4uL215LWdhbWUvZXhhbXBsZS90ZXN0LmpzJzsKKworCitleHBvcnQgY2xhc3MgVmVjMyB7CisgIGJiOiBmbGF0YnVmZmVycy5CeXRlQnVmZmVyfG51bGwgPSBudWxsOworICBiYl9wb3MgPSAwOworICBfX2luaXQoaTpudW1iZXIsIGJiOmZsYXRidWZmZXJzLkJ5dGVCdWZmZXIpOlZlYzMgeworICB0aGlzLmJiX3BvcyA9IGk7CisgIHRoaXMuYmIgPSBiYjsKKyAgcmV0dXJuIHRoaXM7Cit9CisKK3goKTpudW1iZXIgeworICByZXR1cm4gdGhpcy5iYiEucmVhZEZsb2F0MzIodGhpcy5iYl9wb3MpOworfQorCittdXRhdGVfeCh2YWx1ZTpudW1iZXIpOmJvb2xlYW4geworICB0aGlzLmJiIS53cml0ZUZsb2F0MzIodGhpcy5iYl9wb3MgKyAwLCB2YWx1ZSk7CisgIHJldHVybiB0cnVlOworfQorCit5KCk6bnVtYmVyIHsKKyAgcmV0dXJuIHRoaXMuYmIhLnJlYWRGbG9hdDMyKHRoaXMuYmJfcG9zICsgNCk7Cit9CisKK211dGF0ZV95KHZhbHVlOm51bWJlcik6Ym9vbGVhbiB7CisgIHRoaXMuYmIhLndyaXRlRmxvYXQzMih0aGlzLmJiX3BvcyArIDQsIHZhbHVlKTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK3ooKTpudW1iZXIgeworICByZXR1cm4gdGhpcy5iYiEucmVhZEZsb2F0MzIodGhpcy5iYl9wb3MgKyA4KTsKK30KKworbXV0YXRlX3oodmFsdWU6bnVtYmVyKTpib29sZWFuIHsKKyAgdGhpcy5iYiEud3JpdGVGbG9hdDMyKHRoaXMuYmJfcG9zICsgOCwgdmFsdWUpOworICByZXR1cm4gdHJ1ZTsKK30KKwordGVzdDEoKTpudW1iZXIgeworICByZXR1cm4gdGhpcy5iYiEucmVhZEZsb2F0NjQodGhpcy5iYl9wb3MgKyAxNik7Cit9CisKK211dGF0ZV90ZXN0MSh2YWx1ZTpudW1iZXIpOmJvb2xlYW4geworICB0aGlzLmJiIS53cml0ZUZsb2F0NjQodGhpcy5iYl9wb3MgKyAxNiwgdmFsdWUpOworICByZXR1cm4gdHJ1ZTsKK30KKwordGVzdDIoKTpDb2xvciB7CisgIHJldHVybiB0aGlzLmJiIS5yZWFkVWludDgodGhpcy5iYl9wb3MgKyAyNCk7Cit9CisKK211dGF0ZV90ZXN0Mih2YWx1ZTpDb2xvcik6Ym9vbGVhbiB7CisgIHRoaXMuYmIhLndyaXRlVWludDgodGhpcy5iYl9wb3MgKyAyNCwgdmFsdWUpOworICByZXR1cm4gdHJ1ZTsKK30KKwordGVzdDMob2JqPzpUZXN0KTpUZXN0fG51bGwgeworICByZXR1cm4gKG9iaiB8fCBuZXcgVGVzdCgpKS5fX2luaXQodGhpcy5iYl9wb3MgKyAyNiwgdGhpcy5iYiEpOworfQorCitzdGF0aWMgZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCk6c3RyaW5nIHsKKyAgcmV0dXJuICdNeUdhbWVfRXhhbXBsZV9WZWMzJzsKK30KKworc3RhdGljIHNpemVPZigpOm51bWJlciB7CisgIHJldHVybiAzMjsKK30KKworc3RhdGljIGNyZWF0ZVZlYzMoYnVpbGRlcjpmbGF0YnVmZmVycy5CdWlsZGVyLCB4OiBudW1iZXIsIHk6IG51bWJlciwgejogbnVtYmVyLCB0ZXN0MTogbnVtYmVyLCB0ZXN0MjogQ29sb3IsIHRlc3QzX2E6IG51bWJlciwgdGVzdDNfYjogbnVtYmVyKTpmbGF0YnVmZmVycy5PZmZzZXQgeworICBidWlsZGVyLnByZXAoOCwgMzIpOworICBidWlsZGVyLnBhZCgyKTsKKyAgYnVpbGRlci5wcmVwKDIsIDQpOworICBidWlsZGVyLnBhZCgxKTsKKyAgYnVpbGRlci53cml0ZUludDgodGVzdDNfYik7CisgIGJ1aWxkZXIud3JpdGVJbnQxNih0ZXN0M19hKTsKKyAgYnVpbGRlci5wYWQoMSk7CisgIGJ1aWxkZXIud3JpdGVJbnQ4KHRlc3QyKTsKKyAgYnVpbGRlci53cml0ZUZsb2F0NjQodGVzdDEpOworICBidWlsZGVyLnBhZCg0KTsKKyAgYnVpbGRlci53cml0ZUZsb2F0MzIoeik7CisgIGJ1aWxkZXIud3JpdGVGbG9hdDMyKHkpOworICBidWlsZGVyLndyaXRlRmxvYXQzMih4KTsKKyAgcmV0dXJuIGJ1aWxkZXIub2Zmc2V0KCk7Cit9CisKKwordW5wYWNrKCk6IFZlYzNUIHsKKyAgcmV0dXJuIG5ldyBWZWMzVCgKKyAgICB0aGlzLngoKSwKKyAgICB0aGlzLnkoKSwKKyAgICB0aGlzLnooKSwKKyAgICB0aGlzLnRlc3QxKCksCisgICAgdGhpcy50ZXN0MigpLAorICAgICh0aGlzLnRlc3QzKCkgIT09IG51bGwgPyB0aGlzLnRlc3QzKCkhLnVucGFjaygpIDogbnVsbCkKKyAgKTsKK30KKworCit1bnBhY2tUbyhfbzogVmVjM1QpOiB2b2lkIHsKKyAgX28ueCA9IHRoaXMueCgpOworICBfby55ID0gdGhpcy55KCk7CisgIF9vLnogPSB0aGlzLnooKTsKKyAgX28udGVzdDEgPSB0aGlzLnRlc3QxKCk7CisgIF9vLnRlc3QyID0gdGhpcy50ZXN0MigpOworICBfby50ZXN0MyA9ICh0aGlzLnRlc3QzKCkgIT09IG51bGwgPyB0aGlzLnRlc3QzKCkhLnVucGFjaygpIDogbnVsbCk7Cit9Cit9CisKK2V4cG9ydCBjbGFzcyBWZWMzVCB7Citjb25zdHJ1Y3RvcigKKyAgcHVibGljIHg6IG51bWJlciA9IDAuMCwKKyAgcHVibGljIHk6IG51bWJlciA9IDAuMCwKKyAgcHVibGljIHo6IG51bWJlciA9IDAuMCwKKyAgcHVibGljIHRlc3QxOiBudW1iZXIgPSAwLjAsCisgIHB1YmxpYyB0ZXN0MjogQ29sb3IgPSAwLAorICBwdWJsaWMgdGVzdDM6IFRlc3RUfG51bGwgPSBudWxsCispe30KKworCitwYWNrKGJ1aWxkZXI6ZmxhdGJ1ZmZlcnMuQnVpbGRlcik6IGZsYXRidWZmZXJzLk9mZnNldCB7CisgIHJldHVybiBWZWMzLmNyZWF0ZVZlYzMoYnVpbGRlciwKKyAgICB0aGlzLngsCisgICAgdGhpcy55LAorICAgIHRoaXMueiwKKyAgICB0aGlzLnRlc3QxLAorICAgIHRoaXMudGVzdDIsCisgICAgKHRoaXMudGVzdDM/LmEgPz8gMCksCisgICAgKHRoaXMudGVzdDM/LmIgPz8gMCkKKyAgKTsKK30KK30KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL3RzL215LWdhbWUvZXhhbXBsZTIvbW9uc3Rlci5qcyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL3RzL215LWdhbWUvZXhhbXBsZTIvbW9uc3Rlci5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNTBhMmM4Ci0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvdHMvbXktZ2FtZS9leGFtcGxlMi9tb25zdGVyLmpzCkBAIC0wLDAgKzEsNTAgQEAKKy8vIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGJ5IHRoZSBGbGF0QnVmZmVycyBjb21waWxlciwgZG8gbm90IG1vZGlmeQoraW1wb3J0ICogYXMgZmxhdGJ1ZmZlcnMgZnJvbSAnZmxhdGJ1ZmZlcnMnOworZXhwb3J0IGNsYXNzIE1vbnN0ZXIgeworICAgIGNvbnN0cnVjdG9yKCkgeworICAgICAgICB0aGlzLmJiID0gbnVsbDsKKyAgICAgICAgdGhpcy5iYl9wb3MgPSAwOworICAgIH0KKyAgICBfX2luaXQoaSwgYmIpIHsKKyAgICAgICAgdGhpcy5iYl9wb3MgPSBpOworICAgICAgICB0aGlzLmJiID0gYmI7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKyAgICBzdGF0aWMgZ2V0Um9vdEFzTW9uc3RlcihiYiwgb2JqKSB7CisgICAgICAgIHJldHVybiAob2JqIHx8IG5ldyBNb25zdGVyKCkpLl9faW5pdChiYi5yZWFkSW50MzIoYmIucG9zaXRpb24oKSkgKyBiYi5wb3NpdGlvbigpLCBiYik7CisgICAgfQorICAgIHN0YXRpYyBnZXRTaXplUHJlZml4ZWRSb290QXNNb25zdGVyKGJiLCBvYmopIHsKKyAgICAgICAgYmIuc2V0UG9zaXRpb24oYmIucG9zaXRpb24oKSArIGZsYXRidWZmZXJzLlNJWkVfUFJFRklYX0xFTkdUSCk7CisgICAgICAgIHJldHVybiAob2JqIHx8IG5ldyBNb25zdGVyKCkpLl9faW5pdChiYi5yZWFkSW50MzIoYmIucG9zaXRpb24oKSkgKyBiYi5wb3NpdGlvbigpLCBiYik7CisgICAgfQorICAgIHN0YXRpYyBnZXRGdWxseVF1YWxpZmllZE5hbWUoKSB7CisgICAgICAgIHJldHVybiAnTXlHYW1lX0V4YW1wbGUyX01vbnN0ZXInOworICAgIH0KKyAgICBzdGF0aWMgc3RhcnRNb25zdGVyKGJ1aWxkZXIpIHsKKyAgICAgICAgYnVpbGRlci5zdGFydE9iamVjdCgwKTsKKyAgICB9CisgICAgc3RhdGljIGVuZE1vbnN0ZXIoYnVpbGRlcikgeworICAgICAgICBjb25zdCBvZmZzZXQgPSBidWlsZGVyLmVuZE9iamVjdCgpOworICAgICAgICByZXR1cm4gb2Zmc2V0OworICAgIH0KKyAgICBzdGF0aWMgY3JlYXRlTW9uc3RlcihidWlsZGVyKSB7CisgICAgICAgIE1vbnN0ZXIuc3RhcnRNb25zdGVyKGJ1aWxkZXIpOworICAgICAgICByZXR1cm4gTW9uc3Rlci5lbmRNb25zdGVyKGJ1aWxkZXIpOworICAgIH0KKyAgICBzZXJpYWxpemUoKSB7CisgICAgICAgIHJldHVybiB0aGlzLmJiLmJ5dGVzKCk7CisgICAgfQorICAgIHN0YXRpYyBkZXNlcmlhbGl6ZShidWZmZXIpIHsKKyAgICAgICAgcmV0dXJuIE1vbnN0ZXIuZ2V0Um9vdEFzTW9uc3RlcihuZXcgZmxhdGJ1ZmZlcnMuQnl0ZUJ1ZmZlcihidWZmZXIpKTsKKyAgICB9CisgICAgdW5wYWNrKCkgeworICAgICAgICByZXR1cm4gbmV3IE1vbnN0ZXJUKCk7CisgICAgfQorICAgIHVucGFja1RvKF9vKSB7IH0KK30KK2V4cG9ydCBjbGFzcyBNb25zdGVyVCB7CisgICAgY29uc3RydWN0b3IoKSB7IH0KKyAgICBwYWNrKGJ1aWxkZXIpIHsKKyAgICAgICAgcmV0dXJuIE1vbnN0ZXIuY3JlYXRlTW9uc3RlcihidWlsZGVyKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy90cy9teS1nYW1lL2V4YW1wbGUyL21vbnN0ZXIudHMgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy90cy9teS1nYW1lL2V4YW1wbGUyL21vbnN0ZXIudHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzI0MDQ3NgotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL3RzL215LWdhbWUvZXhhbXBsZTIvbW9uc3Rlci50cwpAQCAtMCwwICsxLDY2IEBACisvLyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBieSB0aGUgRmxhdEJ1ZmZlcnMgY29tcGlsZXIsIGRvIG5vdCBtb2RpZnkKKworaW1wb3J0ICogYXMgZmxhdGJ1ZmZlcnMgZnJvbSAnZmxhdGJ1ZmZlcnMnOworCisKKworZXhwb3J0IGNsYXNzIE1vbnN0ZXIgeworICBiYjogZmxhdGJ1ZmZlcnMuQnl0ZUJ1ZmZlcnxudWxsID0gbnVsbDsKKyAgYmJfcG9zID0gMDsKKyAgX19pbml0KGk6bnVtYmVyLCBiYjpmbGF0YnVmZmVycy5CeXRlQnVmZmVyKTpNb25zdGVyIHsKKyAgdGhpcy5iYl9wb3MgPSBpOworICB0aGlzLmJiID0gYmI7CisgIHJldHVybiB0aGlzOworfQorCitzdGF0aWMgZ2V0Um9vdEFzTW9uc3RlcihiYjpmbGF0YnVmZmVycy5CeXRlQnVmZmVyLCBvYmo/Ok1vbnN0ZXIpOk1vbnN0ZXIgeworICByZXR1cm4gKG9iaiB8fCBuZXcgTW9uc3RlcigpKS5fX2luaXQoYmIucmVhZEludDMyKGJiLnBvc2l0aW9uKCkpICsgYmIucG9zaXRpb24oKSwgYmIpOworfQorCitzdGF0aWMgZ2V0U2l6ZVByZWZpeGVkUm9vdEFzTW9uc3RlcihiYjpmbGF0YnVmZmVycy5CeXRlQnVmZmVyLCBvYmo/Ok1vbnN0ZXIpOk1vbnN0ZXIgeworICBiYi5zZXRQb3NpdGlvbihiYi5wb3NpdGlvbigpICsgZmxhdGJ1ZmZlcnMuU0laRV9QUkVGSVhfTEVOR1RIKTsKKyAgcmV0dXJuIChvYmogfHwgbmV3IE1vbnN0ZXIoKSkuX19pbml0KGJiLnJlYWRJbnQzMihiYi5wb3NpdGlvbigpKSArIGJiLnBvc2l0aW9uKCksIGJiKTsKK30KKworc3RhdGljIGdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpOnN0cmluZyB7CisgIHJldHVybiAnTXlHYW1lX0V4YW1wbGUyX01vbnN0ZXInOworfQorCitzdGF0aWMgc3RhcnRNb25zdGVyKGJ1aWxkZXI6ZmxhdGJ1ZmZlcnMuQnVpbGRlcikgeworICBidWlsZGVyLnN0YXJ0T2JqZWN0KDApOworfQorCitzdGF0aWMgZW5kTW9uc3RlcihidWlsZGVyOmZsYXRidWZmZXJzLkJ1aWxkZXIpOmZsYXRidWZmZXJzLk9mZnNldCB7CisgIGNvbnN0IG9mZnNldCA9IGJ1aWxkZXIuZW5kT2JqZWN0KCk7CisgIHJldHVybiBvZmZzZXQ7Cit9CisKK3N0YXRpYyBjcmVhdGVNb25zdGVyKGJ1aWxkZXI6ZmxhdGJ1ZmZlcnMuQnVpbGRlcik6ZmxhdGJ1ZmZlcnMuT2Zmc2V0IHsKKyAgTW9uc3Rlci5zdGFydE1vbnN0ZXIoYnVpbGRlcik7CisgIHJldHVybiBNb25zdGVyLmVuZE1vbnN0ZXIoYnVpbGRlcik7Cit9CisKK3NlcmlhbGl6ZSgpOlVpbnQ4QXJyYXkgeworICByZXR1cm4gdGhpcy5iYiEuYnl0ZXMoKTsKK30KKworc3RhdGljIGRlc2VyaWFsaXplKGJ1ZmZlcjogVWludDhBcnJheSk6TW9uc3RlciB7CisgIHJldHVybiBNb25zdGVyLmdldFJvb3RBc01vbnN0ZXIobmV3IGZsYXRidWZmZXJzLkJ5dGVCdWZmZXIoYnVmZmVyKSkKK30KKwordW5wYWNrKCk6IE1vbnN0ZXJUIHsKKyAgcmV0dXJuIG5ldyBNb25zdGVyVCgpOworfQorCisKK3VucGFja1RvKF9vOiBNb25zdGVyVCk6IHZvaWQge30KK30KKworZXhwb3J0IGNsYXNzIE1vbnN0ZXJUIHsKK2NvbnN0cnVjdG9yKCl7fQorCisKK3BhY2soYnVpbGRlcjpmbGF0YnVmZmVycy5CdWlsZGVyKTogZmxhdGJ1ZmZlcnMuT2Zmc2V0IHsKKyAgcmV0dXJuIE1vbnN0ZXIuY3JlYXRlTW9uc3RlcihidWlsZGVyKTsKK30KK30KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL3RzL215LWdhbWUvaW4tcGFyZW50LW5hbWVzcGFjZS5qcyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL3RzL215LWdhbWUvaW4tcGFyZW50LW5hbWVzcGFjZS5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNGIwZWQ3Ci0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvdHMvbXktZ2FtZS9pbi1wYXJlbnQtbmFtZXNwYWNlLmpzCkBAIC0wLDAgKzEsNTAgQEAKKy8vIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGJ5IHRoZSBGbGF0QnVmZmVycyBjb21waWxlciwgZG8gbm90IG1vZGlmeQoraW1wb3J0ICogYXMgZmxhdGJ1ZmZlcnMgZnJvbSAnZmxhdGJ1ZmZlcnMnOworZXhwb3J0IGNsYXNzIEluUGFyZW50TmFtZXNwYWNlIHsKKyAgICBjb25zdHJ1Y3RvcigpIHsKKyAgICAgICAgdGhpcy5iYiA9IG51bGw7CisgICAgICAgIHRoaXMuYmJfcG9zID0gMDsKKyAgICB9CisgICAgX19pbml0KGksIGJiKSB7CisgICAgICAgIHRoaXMuYmJfcG9zID0gaTsKKyAgICAgICAgdGhpcy5iYiA9IGJiOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisgICAgc3RhdGljIGdldFJvb3RBc0luUGFyZW50TmFtZXNwYWNlKGJiLCBvYmopIHsKKyAgICAgICAgcmV0dXJuIChvYmogfHwgbmV3IEluUGFyZW50TmFtZXNwYWNlKCkpLl9faW5pdChiYi5yZWFkSW50MzIoYmIucG9zaXRpb24oKSkgKyBiYi5wb3NpdGlvbigpLCBiYik7CisgICAgfQorICAgIHN0YXRpYyBnZXRTaXplUHJlZml4ZWRSb290QXNJblBhcmVudE5hbWVzcGFjZShiYiwgb2JqKSB7CisgICAgICAgIGJiLnNldFBvc2l0aW9uKGJiLnBvc2l0aW9uKCkgKyBmbGF0YnVmZmVycy5TSVpFX1BSRUZJWF9MRU5HVEgpOworICAgICAgICByZXR1cm4gKG9iaiB8fCBuZXcgSW5QYXJlbnROYW1lc3BhY2UoKSkuX19pbml0KGJiLnJlYWRJbnQzMihiYi5wb3NpdGlvbigpKSArIGJiLnBvc2l0aW9uKCksIGJiKTsKKyAgICB9CisgICAgc3RhdGljIGdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpIHsKKyAgICAgICAgcmV0dXJuICdNeUdhbWVfSW5QYXJlbnROYW1lc3BhY2UnOworICAgIH0KKyAgICBzdGF0aWMgc3RhcnRJblBhcmVudE5hbWVzcGFjZShidWlsZGVyKSB7CisgICAgICAgIGJ1aWxkZXIuc3RhcnRPYmplY3QoMCk7CisgICAgfQorICAgIHN0YXRpYyBlbmRJblBhcmVudE5hbWVzcGFjZShidWlsZGVyKSB7CisgICAgICAgIGNvbnN0IG9mZnNldCA9IGJ1aWxkZXIuZW5kT2JqZWN0KCk7CisgICAgICAgIHJldHVybiBvZmZzZXQ7CisgICAgfQorICAgIHN0YXRpYyBjcmVhdGVJblBhcmVudE5hbWVzcGFjZShidWlsZGVyKSB7CisgICAgICAgIEluUGFyZW50TmFtZXNwYWNlLnN0YXJ0SW5QYXJlbnROYW1lc3BhY2UoYnVpbGRlcik7CisgICAgICAgIHJldHVybiBJblBhcmVudE5hbWVzcGFjZS5lbmRJblBhcmVudE5hbWVzcGFjZShidWlsZGVyKTsKKyAgICB9CisgICAgc2VyaWFsaXplKCkgeworICAgICAgICByZXR1cm4gdGhpcy5iYi5ieXRlcygpOworICAgIH0KKyAgICBzdGF0aWMgZGVzZXJpYWxpemUoYnVmZmVyKSB7CisgICAgICAgIHJldHVybiBJblBhcmVudE5hbWVzcGFjZS5nZXRSb290QXNJblBhcmVudE5hbWVzcGFjZShuZXcgZmxhdGJ1ZmZlcnMuQnl0ZUJ1ZmZlcihidWZmZXIpKTsKKyAgICB9CisgICAgdW5wYWNrKCkgeworICAgICAgICByZXR1cm4gbmV3IEluUGFyZW50TmFtZXNwYWNlVCgpOworICAgIH0KKyAgICB1bnBhY2tUbyhfbykgeyB9Cit9CitleHBvcnQgY2xhc3MgSW5QYXJlbnROYW1lc3BhY2VUIHsKKyAgICBjb25zdHJ1Y3RvcigpIHsgfQorICAgIHBhY2soYnVpbGRlcikgeworICAgICAgICByZXR1cm4gSW5QYXJlbnROYW1lc3BhY2UuY3JlYXRlSW5QYXJlbnROYW1lc3BhY2UoYnVpbGRlcik7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvdHMvbXktZ2FtZS9pbi1wYXJlbnQtbmFtZXNwYWNlLnRzIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvdHMvbXktZ2FtZS9pbi1wYXJlbnQtbmFtZXNwYWNlLnRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBkZTk0ZGYKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy90cy9teS1nYW1lL2luLXBhcmVudC1uYW1lc3BhY2UudHMKQEAgLTAsMCArMSw2NiBAQAorLy8gYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgYnkgdGhlIEZsYXRCdWZmZXJzIGNvbXBpbGVyLCBkbyBub3QgbW9kaWZ5CisKK2ltcG9ydCAqIGFzIGZsYXRidWZmZXJzIGZyb20gJ2ZsYXRidWZmZXJzJzsKKworCisKK2V4cG9ydCBjbGFzcyBJblBhcmVudE5hbWVzcGFjZSB7CisgIGJiOiBmbGF0YnVmZmVycy5CeXRlQnVmZmVyfG51bGwgPSBudWxsOworICBiYl9wb3MgPSAwOworICBfX2luaXQoaTpudW1iZXIsIGJiOmZsYXRidWZmZXJzLkJ5dGVCdWZmZXIpOkluUGFyZW50TmFtZXNwYWNlIHsKKyAgdGhpcy5iYl9wb3MgPSBpOworICB0aGlzLmJiID0gYmI7CisgIHJldHVybiB0aGlzOworfQorCitzdGF0aWMgZ2V0Um9vdEFzSW5QYXJlbnROYW1lc3BhY2UoYmI6ZmxhdGJ1ZmZlcnMuQnl0ZUJ1ZmZlciwgb2JqPzpJblBhcmVudE5hbWVzcGFjZSk6SW5QYXJlbnROYW1lc3BhY2UgeworICByZXR1cm4gKG9iaiB8fCBuZXcgSW5QYXJlbnROYW1lc3BhY2UoKSkuX19pbml0KGJiLnJlYWRJbnQzMihiYi5wb3NpdGlvbigpKSArIGJiLnBvc2l0aW9uKCksIGJiKTsKK30KKworc3RhdGljIGdldFNpemVQcmVmaXhlZFJvb3RBc0luUGFyZW50TmFtZXNwYWNlKGJiOmZsYXRidWZmZXJzLkJ5dGVCdWZmZXIsIG9iaj86SW5QYXJlbnROYW1lc3BhY2UpOkluUGFyZW50TmFtZXNwYWNlIHsKKyAgYmIuc2V0UG9zaXRpb24oYmIucG9zaXRpb24oKSArIGZsYXRidWZmZXJzLlNJWkVfUFJFRklYX0xFTkdUSCk7CisgIHJldHVybiAob2JqIHx8IG5ldyBJblBhcmVudE5hbWVzcGFjZSgpKS5fX2luaXQoYmIucmVhZEludDMyKGJiLnBvc2l0aW9uKCkpICsgYmIucG9zaXRpb24oKSwgYmIpOworfQorCitzdGF0aWMgZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCk6c3RyaW5nIHsKKyAgcmV0dXJuICdNeUdhbWVfSW5QYXJlbnROYW1lc3BhY2UnOworfQorCitzdGF0aWMgc3RhcnRJblBhcmVudE5hbWVzcGFjZShidWlsZGVyOmZsYXRidWZmZXJzLkJ1aWxkZXIpIHsKKyAgYnVpbGRlci5zdGFydE9iamVjdCgwKTsKK30KKworc3RhdGljIGVuZEluUGFyZW50TmFtZXNwYWNlKGJ1aWxkZXI6ZmxhdGJ1ZmZlcnMuQnVpbGRlcik6ZmxhdGJ1ZmZlcnMuT2Zmc2V0IHsKKyAgY29uc3Qgb2Zmc2V0ID0gYnVpbGRlci5lbmRPYmplY3QoKTsKKyAgcmV0dXJuIG9mZnNldDsKK30KKworc3RhdGljIGNyZWF0ZUluUGFyZW50TmFtZXNwYWNlKGJ1aWxkZXI6ZmxhdGJ1ZmZlcnMuQnVpbGRlcik6ZmxhdGJ1ZmZlcnMuT2Zmc2V0IHsKKyAgSW5QYXJlbnROYW1lc3BhY2Uuc3RhcnRJblBhcmVudE5hbWVzcGFjZShidWlsZGVyKTsKKyAgcmV0dXJuIEluUGFyZW50TmFtZXNwYWNlLmVuZEluUGFyZW50TmFtZXNwYWNlKGJ1aWxkZXIpOworfQorCitzZXJpYWxpemUoKTpVaW50OEFycmF5IHsKKyAgcmV0dXJuIHRoaXMuYmIhLmJ5dGVzKCk7Cit9CisKK3N0YXRpYyBkZXNlcmlhbGl6ZShidWZmZXI6IFVpbnQ4QXJyYXkpOkluUGFyZW50TmFtZXNwYWNlIHsKKyAgcmV0dXJuIEluUGFyZW50TmFtZXNwYWNlLmdldFJvb3RBc0luUGFyZW50TmFtZXNwYWNlKG5ldyBmbGF0YnVmZmVycy5CeXRlQnVmZmVyKGJ1ZmZlcikpCit9CisKK3VucGFjaygpOiBJblBhcmVudE5hbWVzcGFjZVQgeworICByZXR1cm4gbmV3IEluUGFyZW50TmFtZXNwYWNlVCgpOworfQorCisKK3VucGFja1RvKF9vOiBJblBhcmVudE5hbWVzcGFjZVQpOiB2b2lkIHt9Cit9CisKK2V4cG9ydCBjbGFzcyBJblBhcmVudE5hbWVzcGFjZVQgeworY29uc3RydWN0b3IoKXt9CisKKworcGFjayhidWlsZGVyOmZsYXRidWZmZXJzLkJ1aWxkZXIpOiBmbGF0YnVmZmVycy5PZmZzZXQgeworICByZXR1cm4gSW5QYXJlbnROYW1lc3BhY2UuY3JlYXRlSW5QYXJlbnROYW1lc3BhY2UoYnVpbGRlcik7Cit9Cit9CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy90cy9vcHRpb25hbC1zY2FsYXJzL29wdGlvbmFsLWJ5dGUudHMgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy90cy9vcHRpb25hbC1zY2FsYXJzL29wdGlvbmFsLWJ5dGUudHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjRkYjI2NQotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL3RzL29wdGlvbmFsLXNjYWxhcnMvb3B0aW9uYWwtYnl0ZS50cwpAQCAtMCwwICsxLDcgQEAKKy8vIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGJ5IHRoZSBGbGF0QnVmZmVycyBjb21waWxlciwgZG8gbm90IG1vZGlmeQorCitleHBvcnQgZW51bSBPcHRpb25hbEJ5dGUgeworICBOb25lID0gMCwKKyAgT25lID0gMSwKKyAgVHdvID0gMgorfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvdHMvb3B0aW9uYWwtc2NhbGFycy9zY2FsYXItc3R1ZmYudHMgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy90cy9vcHRpb25hbC1zY2FsYXJzL3NjYWxhci1zdHVmZi50cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYWRmMzFiCi0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvdHMvb3B0aW9uYWwtc2NhbGFycy9zY2FsYXItc3R1ZmYudHMKQEAgLTAsMCArMSw0MjcgQEAKKy8vIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGJ5IHRoZSBGbGF0QnVmZmVycyBjb21waWxlciwgZG8gbm90IG1vZGlmeQorCitpbXBvcnQgKiBhcyBmbGF0YnVmZmVycyBmcm9tICdmbGF0YnVmZmVycyc7CisKK2ltcG9ydCB7IE9wdGlvbmFsQnl0ZSB9IGZyb20gJy4uL29wdGlvbmFsLXNjYWxhcnMvb3B0aW9uYWwtYnl0ZS5qcyc7CisKKworZXhwb3J0IGNsYXNzIFNjYWxhclN0dWZmIHsKKyAgYmI6IGZsYXRidWZmZXJzLkJ5dGVCdWZmZXJ8bnVsbCA9IG51bGw7CisgIGJiX3BvcyA9IDA7CisgIF9faW5pdChpOm51bWJlciwgYmI6ZmxhdGJ1ZmZlcnMuQnl0ZUJ1ZmZlcik6U2NhbGFyU3R1ZmYgeworICB0aGlzLmJiX3BvcyA9IGk7CisgIHRoaXMuYmIgPSBiYjsKKyAgcmV0dXJuIHRoaXM7Cit9CisKK3N0YXRpYyBnZXRSb290QXNTY2FsYXJTdHVmZihiYjpmbGF0YnVmZmVycy5CeXRlQnVmZmVyLCBvYmo/OlNjYWxhclN0dWZmKTpTY2FsYXJTdHVmZiB7CisgIHJldHVybiAob2JqIHx8IG5ldyBTY2FsYXJTdHVmZigpKS5fX2luaXQoYmIucmVhZEludDMyKGJiLnBvc2l0aW9uKCkpICsgYmIucG9zaXRpb24oKSwgYmIpOworfQorCitzdGF0aWMgZ2V0U2l6ZVByZWZpeGVkUm9vdEFzU2NhbGFyU3R1ZmYoYmI6ZmxhdGJ1ZmZlcnMuQnl0ZUJ1ZmZlciwgb2JqPzpTY2FsYXJTdHVmZik6U2NhbGFyU3R1ZmYgeworICBiYi5zZXRQb3NpdGlvbihiYi5wb3NpdGlvbigpICsgZmxhdGJ1ZmZlcnMuU0laRV9QUkVGSVhfTEVOR1RIKTsKKyAgcmV0dXJuIChvYmogfHwgbmV3IFNjYWxhclN0dWZmKCkpLl9faW5pdChiYi5yZWFkSW50MzIoYmIucG9zaXRpb24oKSkgKyBiYi5wb3NpdGlvbigpLCBiYik7Cit9CisKK3N0YXRpYyBidWZmZXJIYXNJZGVudGlmaWVyKGJiOmZsYXRidWZmZXJzLkJ5dGVCdWZmZXIpOmJvb2xlYW4geworICByZXR1cm4gYmIuX19oYXNfaWRlbnRpZmllcignTlVMTCcpOworfQorCitqdXN0STgoKTpudW1iZXIgeworICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiIS5fX29mZnNldCh0aGlzLmJiX3BvcywgNCk7CisgIHJldHVybiBvZmZzZXQgPyB0aGlzLmJiIS5yZWFkSW50OCh0aGlzLmJiX3BvcyArIG9mZnNldCkgOiAwOworfQorCittYXliZUk4KCk6bnVtYmVyfG51bGwgeworICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiIS5fX29mZnNldCh0aGlzLmJiX3BvcywgNik7CisgIHJldHVybiBvZmZzZXQgPyB0aGlzLmJiIS5yZWFkSW50OCh0aGlzLmJiX3BvcyArIG9mZnNldCkgOiBudWxsOworfQorCitkZWZhdWx0STgoKTpudW1iZXIgeworICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiIS5fX29mZnNldCh0aGlzLmJiX3BvcywgOCk7CisgIHJldHVybiBvZmZzZXQgPyB0aGlzLmJiIS5yZWFkSW50OCh0aGlzLmJiX3BvcyArIG9mZnNldCkgOiA0MjsKK30KKworanVzdFU4KCk6bnVtYmVyIHsKKyAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYiEuX19vZmZzZXQodGhpcy5iYl9wb3MsIDEwKTsKKyAgcmV0dXJuIG9mZnNldCA/IHRoaXMuYmIhLnJlYWRVaW50OCh0aGlzLmJiX3BvcyArIG9mZnNldCkgOiAwOworfQorCittYXliZVU4KCk6bnVtYmVyfG51bGwgeworICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiIS5fX29mZnNldCh0aGlzLmJiX3BvcywgMTIpOworICByZXR1cm4gb2Zmc2V0ID8gdGhpcy5iYiEucmVhZFVpbnQ4KHRoaXMuYmJfcG9zICsgb2Zmc2V0KSA6IG51bGw7Cit9CisKK2RlZmF1bHRVOCgpOm51bWJlciB7CisgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIhLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCAxNCk7CisgIHJldHVybiBvZmZzZXQgPyB0aGlzLmJiIS5yZWFkVWludDgodGhpcy5iYl9wb3MgKyBvZmZzZXQpIDogNDI7Cit9CisKK2p1c3RJMTYoKTpudW1iZXIgeworICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiIS5fX29mZnNldCh0aGlzLmJiX3BvcywgMTYpOworICByZXR1cm4gb2Zmc2V0ID8gdGhpcy5iYiEucmVhZEludDE2KHRoaXMuYmJfcG9zICsgb2Zmc2V0KSA6IDA7Cit9CisKK21heWJlSTE2KCk6bnVtYmVyfG51bGwgeworICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiIS5fX29mZnNldCh0aGlzLmJiX3BvcywgMTgpOworICByZXR1cm4gb2Zmc2V0ID8gdGhpcy5iYiEucmVhZEludDE2KHRoaXMuYmJfcG9zICsgb2Zmc2V0KSA6IG51bGw7Cit9CisKK2RlZmF1bHRJMTYoKTpudW1iZXIgeworICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiIS5fX29mZnNldCh0aGlzLmJiX3BvcywgMjApOworICByZXR1cm4gb2Zmc2V0ID8gdGhpcy5iYiEucmVhZEludDE2KHRoaXMuYmJfcG9zICsgb2Zmc2V0KSA6IDQyOworfQorCitqdXN0VTE2KCk6bnVtYmVyIHsKKyAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYiEuX19vZmZzZXQodGhpcy5iYl9wb3MsIDIyKTsKKyAgcmV0dXJuIG9mZnNldCA/IHRoaXMuYmIhLnJlYWRVaW50MTYodGhpcy5iYl9wb3MgKyBvZmZzZXQpIDogMDsKK30KKworbWF5YmVVMTYoKTpudW1iZXJ8bnVsbCB7CisgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIhLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCAyNCk7CisgIHJldHVybiBvZmZzZXQgPyB0aGlzLmJiIS5yZWFkVWludDE2KHRoaXMuYmJfcG9zICsgb2Zmc2V0KSA6IG51bGw7Cit9CisKK2RlZmF1bHRVMTYoKTpudW1iZXIgeworICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiIS5fX29mZnNldCh0aGlzLmJiX3BvcywgMjYpOworICByZXR1cm4gb2Zmc2V0ID8gdGhpcy5iYiEucmVhZFVpbnQxNih0aGlzLmJiX3BvcyArIG9mZnNldCkgOiA0MjsKK30KKworanVzdEkzMigpOm51bWJlciB7CisgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIhLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCAyOCk7CisgIHJldHVybiBvZmZzZXQgPyB0aGlzLmJiIS5yZWFkSW50MzIodGhpcy5iYl9wb3MgKyBvZmZzZXQpIDogMDsKK30KKworbWF5YmVJMzIoKTpudW1iZXJ8bnVsbCB7CisgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIhLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCAzMCk7CisgIHJldHVybiBvZmZzZXQgPyB0aGlzLmJiIS5yZWFkSW50MzIodGhpcy5iYl9wb3MgKyBvZmZzZXQpIDogbnVsbDsKK30KKworZGVmYXVsdEkzMigpOm51bWJlciB7CisgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIhLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCAzMik7CisgIHJldHVybiBvZmZzZXQgPyB0aGlzLmJiIS5yZWFkSW50MzIodGhpcy5iYl9wb3MgKyBvZmZzZXQpIDogNDI7Cit9CisKK2p1c3RVMzIoKTpudW1iZXIgeworICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiIS5fX29mZnNldCh0aGlzLmJiX3BvcywgMzQpOworICByZXR1cm4gb2Zmc2V0ID8gdGhpcy5iYiEucmVhZFVpbnQzMih0aGlzLmJiX3BvcyArIG9mZnNldCkgOiAwOworfQorCittYXliZVUzMigpOm51bWJlcnxudWxsIHsKKyAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYiEuX19vZmZzZXQodGhpcy5iYl9wb3MsIDM2KTsKKyAgcmV0dXJuIG9mZnNldCA/IHRoaXMuYmIhLnJlYWRVaW50MzIodGhpcy5iYl9wb3MgKyBvZmZzZXQpIDogbnVsbDsKK30KKworZGVmYXVsdFUzMigpOm51bWJlciB7CisgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIhLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCAzOCk7CisgIHJldHVybiBvZmZzZXQgPyB0aGlzLmJiIS5yZWFkVWludDMyKHRoaXMuYmJfcG9zICsgb2Zmc2V0KSA6IDQyOworfQorCitqdXN0STY0KCk6YmlnaW50IHsKKyAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYiEuX19vZmZzZXQodGhpcy5iYl9wb3MsIDQwKTsKKyAgcmV0dXJuIG9mZnNldCA/IHRoaXMuYmIhLnJlYWRJbnQ2NCh0aGlzLmJiX3BvcyArIG9mZnNldCkgOiBCaWdJbnQoJzAnKTsKK30KKworbWF5YmVJNjQoKTpiaWdpbnR8bnVsbCB7CisgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIhLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCA0Mik7CisgIHJldHVybiBvZmZzZXQgPyB0aGlzLmJiIS5yZWFkSW50NjQodGhpcy5iYl9wb3MgKyBvZmZzZXQpIDogbnVsbDsKK30KKworZGVmYXVsdEk2NCgpOmJpZ2ludCB7CisgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIhLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCA0NCk7CisgIHJldHVybiBvZmZzZXQgPyB0aGlzLmJiIS5yZWFkSW50NjQodGhpcy5iYl9wb3MgKyBvZmZzZXQpIDogQmlnSW50KCc0MicpOworfQorCitqdXN0VTY0KCk6YmlnaW50IHsKKyAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYiEuX19vZmZzZXQodGhpcy5iYl9wb3MsIDQ2KTsKKyAgcmV0dXJuIG9mZnNldCA/IHRoaXMuYmIhLnJlYWRVaW50NjQodGhpcy5iYl9wb3MgKyBvZmZzZXQpIDogQmlnSW50KCcwJyk7Cit9CisKK21heWJlVTY0KCk6YmlnaW50fG51bGwgeworICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiIS5fX29mZnNldCh0aGlzLmJiX3BvcywgNDgpOworICByZXR1cm4gb2Zmc2V0ID8gdGhpcy5iYiEucmVhZFVpbnQ2NCh0aGlzLmJiX3BvcyArIG9mZnNldCkgOiBudWxsOworfQorCitkZWZhdWx0VTY0KCk6YmlnaW50IHsKKyAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYiEuX19vZmZzZXQodGhpcy5iYl9wb3MsIDUwKTsKKyAgcmV0dXJuIG9mZnNldCA/IHRoaXMuYmIhLnJlYWRVaW50NjQodGhpcy5iYl9wb3MgKyBvZmZzZXQpIDogQmlnSW50KCc0MicpOworfQorCitqdXN0RjMyKCk6bnVtYmVyIHsKKyAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYiEuX19vZmZzZXQodGhpcy5iYl9wb3MsIDUyKTsKKyAgcmV0dXJuIG9mZnNldCA/IHRoaXMuYmIhLnJlYWRGbG9hdDMyKHRoaXMuYmJfcG9zICsgb2Zmc2V0KSA6IDAuMDsKK30KKworbWF5YmVGMzIoKTpudW1iZXJ8bnVsbCB7CisgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIhLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCA1NCk7CisgIHJldHVybiBvZmZzZXQgPyB0aGlzLmJiIS5yZWFkRmxvYXQzMih0aGlzLmJiX3BvcyArIG9mZnNldCkgOiBudWxsOworfQorCitkZWZhdWx0RjMyKCk6bnVtYmVyIHsKKyAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYiEuX19vZmZzZXQodGhpcy5iYl9wb3MsIDU2KTsKKyAgcmV0dXJuIG9mZnNldCA/IHRoaXMuYmIhLnJlYWRGbG9hdDMyKHRoaXMuYmJfcG9zICsgb2Zmc2V0KSA6IDQyLjA7Cit9CisKK2p1c3RGNjQoKTpudW1iZXIgeworICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiIS5fX29mZnNldCh0aGlzLmJiX3BvcywgNTgpOworICByZXR1cm4gb2Zmc2V0ID8gdGhpcy5iYiEucmVhZEZsb2F0NjQodGhpcy5iYl9wb3MgKyBvZmZzZXQpIDogMC4wOworfQorCittYXliZUY2NCgpOm51bWJlcnxudWxsIHsKKyAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYiEuX19vZmZzZXQodGhpcy5iYl9wb3MsIDYwKTsKKyAgcmV0dXJuIG9mZnNldCA/IHRoaXMuYmIhLnJlYWRGbG9hdDY0KHRoaXMuYmJfcG9zICsgb2Zmc2V0KSA6IG51bGw7Cit9CisKK2RlZmF1bHRGNjQoKTpudW1iZXIgeworICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiIS5fX29mZnNldCh0aGlzLmJiX3BvcywgNjIpOworICByZXR1cm4gb2Zmc2V0ID8gdGhpcy5iYiEucmVhZEZsb2F0NjQodGhpcy5iYl9wb3MgKyBvZmZzZXQpIDogNDIuMDsKK30KKworanVzdEJvb2woKTpib29sZWFuIHsKKyAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYiEuX19vZmZzZXQodGhpcy5iYl9wb3MsIDY0KTsKKyAgcmV0dXJuIG9mZnNldCA/ICEhdGhpcy5iYiEucmVhZEludDgodGhpcy5iYl9wb3MgKyBvZmZzZXQpIDogZmFsc2U7Cit9CisKK21heWJlQm9vbCgpOmJvb2xlYW58bnVsbCB7CisgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIhLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCA2Nik7CisgIHJldHVybiBvZmZzZXQgPyAhIXRoaXMuYmIhLnJlYWRJbnQ4KHRoaXMuYmJfcG9zICsgb2Zmc2V0KSA6IG51bGw7Cit9CisKK2RlZmF1bHRCb29sKCk6Ym9vbGVhbiB7CisgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIhLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCA2OCk7CisgIHJldHVybiBvZmZzZXQgPyAhIXRoaXMuYmIhLnJlYWRJbnQ4KHRoaXMuYmJfcG9zICsgb2Zmc2V0KSA6IHRydWU7Cit9CisKK2p1c3RFbnVtKCk6T3B0aW9uYWxCeXRlIHsKKyAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYiEuX19vZmZzZXQodGhpcy5iYl9wb3MsIDcwKTsKKyAgcmV0dXJuIG9mZnNldCA/IHRoaXMuYmIhLnJlYWRJbnQ4KHRoaXMuYmJfcG9zICsgb2Zmc2V0KSA6IE9wdGlvbmFsQnl0ZS5Ob25lOworfQorCittYXliZUVudW0oKTpPcHRpb25hbEJ5dGV8bnVsbCB7CisgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIhLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCA3Mik7CisgIHJldHVybiBvZmZzZXQgPyB0aGlzLmJiIS5yZWFkSW50OCh0aGlzLmJiX3BvcyArIG9mZnNldCkgOiBudWxsOworfQorCitkZWZhdWx0RW51bSgpOk9wdGlvbmFsQnl0ZSB7CisgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIhLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCA3NCk7CisgIHJldHVybiBvZmZzZXQgPyB0aGlzLmJiIS5yZWFkSW50OCh0aGlzLmJiX3BvcyArIG9mZnNldCkgOiBPcHRpb25hbEJ5dGUuT25lOworfQorCitzdGF0aWMgZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCk6c3RyaW5nIHsKKyAgcmV0dXJuICdvcHRpb25hbF9zY2FsYXJzX1NjYWxhclN0dWZmJzsKK30KKworc3RhdGljIHN0YXJ0U2NhbGFyU3R1ZmYoYnVpbGRlcjpmbGF0YnVmZmVycy5CdWlsZGVyKSB7CisgIGJ1aWxkZXIuc3RhcnRPYmplY3QoMzYpOworfQorCitzdGF0aWMgYWRkSnVzdEk4KGJ1aWxkZXI6ZmxhdGJ1ZmZlcnMuQnVpbGRlciwganVzdEk4Om51bWJlcikgeworICBidWlsZGVyLmFkZEZpZWxkSW50OCgwLCBqdXN0STgsIDApOworfQorCitzdGF0aWMgYWRkTWF5YmVJOChidWlsZGVyOmZsYXRidWZmZXJzLkJ1aWxkZXIsIG1heWJlSTg6bnVtYmVyKSB7CisgIGJ1aWxkZXIuYWRkRmllbGRJbnQ4KDEsIG1heWJlSTgsIDApOworfQorCitzdGF0aWMgYWRkRGVmYXVsdEk4KGJ1aWxkZXI6ZmxhdGJ1ZmZlcnMuQnVpbGRlciwgZGVmYXVsdEk4Om51bWJlcikgeworICBidWlsZGVyLmFkZEZpZWxkSW50OCgyLCBkZWZhdWx0STgsIDQyKTsKK30KKworc3RhdGljIGFkZEp1c3RVOChidWlsZGVyOmZsYXRidWZmZXJzLkJ1aWxkZXIsIGp1c3RVODpudW1iZXIpIHsKKyAgYnVpbGRlci5hZGRGaWVsZEludDgoMywganVzdFU4LCAwKTsKK30KKworc3RhdGljIGFkZE1heWJlVTgoYnVpbGRlcjpmbGF0YnVmZmVycy5CdWlsZGVyLCBtYXliZVU4Om51bWJlcikgeworICBidWlsZGVyLmFkZEZpZWxkSW50OCg0LCBtYXliZVU4LCAwKTsKK30KKworc3RhdGljIGFkZERlZmF1bHRVOChidWlsZGVyOmZsYXRidWZmZXJzLkJ1aWxkZXIsIGRlZmF1bHRVODpudW1iZXIpIHsKKyAgYnVpbGRlci5hZGRGaWVsZEludDgoNSwgZGVmYXVsdFU4LCA0Mik7Cit9CisKK3N0YXRpYyBhZGRKdXN0STE2KGJ1aWxkZXI6ZmxhdGJ1ZmZlcnMuQnVpbGRlciwganVzdEkxNjpudW1iZXIpIHsKKyAgYnVpbGRlci5hZGRGaWVsZEludDE2KDYsIGp1c3RJMTYsIDApOworfQorCitzdGF0aWMgYWRkTWF5YmVJMTYoYnVpbGRlcjpmbGF0YnVmZmVycy5CdWlsZGVyLCBtYXliZUkxNjpudW1iZXIpIHsKKyAgYnVpbGRlci5hZGRGaWVsZEludDE2KDcsIG1heWJlSTE2LCAwKTsKK30KKworc3RhdGljIGFkZERlZmF1bHRJMTYoYnVpbGRlcjpmbGF0YnVmZmVycy5CdWlsZGVyLCBkZWZhdWx0STE2Om51bWJlcikgeworICBidWlsZGVyLmFkZEZpZWxkSW50MTYoOCwgZGVmYXVsdEkxNiwgNDIpOworfQorCitzdGF0aWMgYWRkSnVzdFUxNihidWlsZGVyOmZsYXRidWZmZXJzLkJ1aWxkZXIsIGp1c3RVMTY6bnVtYmVyKSB7CisgIGJ1aWxkZXIuYWRkRmllbGRJbnQxNig5LCBqdXN0VTE2LCAwKTsKK30KKworc3RhdGljIGFkZE1heWJlVTE2KGJ1aWxkZXI6ZmxhdGJ1ZmZlcnMuQnVpbGRlciwgbWF5YmVVMTY6bnVtYmVyKSB7CisgIGJ1aWxkZXIuYWRkRmllbGRJbnQxNigxMCwgbWF5YmVVMTYsIDApOworfQorCitzdGF0aWMgYWRkRGVmYXVsdFUxNihidWlsZGVyOmZsYXRidWZmZXJzLkJ1aWxkZXIsIGRlZmF1bHRVMTY6bnVtYmVyKSB7CisgIGJ1aWxkZXIuYWRkRmllbGRJbnQxNigxMSwgZGVmYXVsdFUxNiwgNDIpOworfQorCitzdGF0aWMgYWRkSnVzdEkzMihidWlsZGVyOmZsYXRidWZmZXJzLkJ1aWxkZXIsIGp1c3RJMzI6bnVtYmVyKSB7CisgIGJ1aWxkZXIuYWRkRmllbGRJbnQzMigxMiwganVzdEkzMiwgMCk7Cit9CisKK3N0YXRpYyBhZGRNYXliZUkzMihidWlsZGVyOmZsYXRidWZmZXJzLkJ1aWxkZXIsIG1heWJlSTMyOm51bWJlcikgeworICBidWlsZGVyLmFkZEZpZWxkSW50MzIoMTMsIG1heWJlSTMyLCAwKTsKK30KKworc3RhdGljIGFkZERlZmF1bHRJMzIoYnVpbGRlcjpmbGF0YnVmZmVycy5CdWlsZGVyLCBkZWZhdWx0STMyOm51bWJlcikgeworICBidWlsZGVyLmFkZEZpZWxkSW50MzIoMTQsIGRlZmF1bHRJMzIsIDQyKTsKK30KKworc3RhdGljIGFkZEp1c3RVMzIoYnVpbGRlcjpmbGF0YnVmZmVycy5CdWlsZGVyLCBqdXN0VTMyOm51bWJlcikgeworICBidWlsZGVyLmFkZEZpZWxkSW50MzIoMTUsIGp1c3RVMzIsIDApOworfQorCitzdGF0aWMgYWRkTWF5YmVVMzIoYnVpbGRlcjpmbGF0YnVmZmVycy5CdWlsZGVyLCBtYXliZVUzMjpudW1iZXIpIHsKKyAgYnVpbGRlci5hZGRGaWVsZEludDMyKDE2LCBtYXliZVUzMiwgMCk7Cit9CisKK3N0YXRpYyBhZGREZWZhdWx0VTMyKGJ1aWxkZXI6ZmxhdGJ1ZmZlcnMuQnVpbGRlciwgZGVmYXVsdFUzMjpudW1iZXIpIHsKKyAgYnVpbGRlci5hZGRGaWVsZEludDMyKDE3LCBkZWZhdWx0VTMyLCA0Mik7Cit9CisKK3N0YXRpYyBhZGRKdXN0STY0KGJ1aWxkZXI6ZmxhdGJ1ZmZlcnMuQnVpbGRlciwganVzdEk2NDpiaWdpbnQpIHsKKyAgYnVpbGRlci5hZGRGaWVsZEludDY0KDE4LCBqdXN0STY0LCBCaWdJbnQoJzAnKSk7Cit9CisKK3N0YXRpYyBhZGRNYXliZUk2NChidWlsZGVyOmZsYXRidWZmZXJzLkJ1aWxkZXIsIG1heWJlSTY0OmJpZ2ludCkgeworICBidWlsZGVyLmFkZEZpZWxkSW50NjQoMTksIG1heWJlSTY0LCBCaWdJbnQoMCkpOworfQorCitzdGF0aWMgYWRkRGVmYXVsdEk2NChidWlsZGVyOmZsYXRidWZmZXJzLkJ1aWxkZXIsIGRlZmF1bHRJNjQ6YmlnaW50KSB7CisgIGJ1aWxkZXIuYWRkRmllbGRJbnQ2NCgyMCwgZGVmYXVsdEk2NCwgQmlnSW50KCc0MicpKTsKK30KKworc3RhdGljIGFkZEp1c3RVNjQoYnVpbGRlcjpmbGF0YnVmZmVycy5CdWlsZGVyLCBqdXN0VTY0OmJpZ2ludCkgeworICBidWlsZGVyLmFkZEZpZWxkSW50NjQoMjEsIGp1c3RVNjQsIEJpZ0ludCgnMCcpKTsKK30KKworc3RhdGljIGFkZE1heWJlVTY0KGJ1aWxkZXI6ZmxhdGJ1ZmZlcnMuQnVpbGRlciwgbWF5YmVVNjQ6YmlnaW50KSB7CisgIGJ1aWxkZXIuYWRkRmllbGRJbnQ2NCgyMiwgbWF5YmVVNjQsIEJpZ0ludCgwKSk7Cit9CisKK3N0YXRpYyBhZGREZWZhdWx0VTY0KGJ1aWxkZXI6ZmxhdGJ1ZmZlcnMuQnVpbGRlciwgZGVmYXVsdFU2NDpiaWdpbnQpIHsKKyAgYnVpbGRlci5hZGRGaWVsZEludDY0KDIzLCBkZWZhdWx0VTY0LCBCaWdJbnQoJzQyJykpOworfQorCitzdGF0aWMgYWRkSnVzdEYzMihidWlsZGVyOmZsYXRidWZmZXJzLkJ1aWxkZXIsIGp1c3RGMzI6bnVtYmVyKSB7CisgIGJ1aWxkZXIuYWRkRmllbGRGbG9hdDMyKDI0LCBqdXN0RjMyLCAwLjApOworfQorCitzdGF0aWMgYWRkTWF5YmVGMzIoYnVpbGRlcjpmbGF0YnVmZmVycy5CdWlsZGVyLCBtYXliZUYzMjpudW1iZXIpIHsKKyAgYnVpbGRlci5hZGRGaWVsZEZsb2F0MzIoMjUsIG1heWJlRjMyLCAwKTsKK30KKworc3RhdGljIGFkZERlZmF1bHRGMzIoYnVpbGRlcjpmbGF0YnVmZmVycy5CdWlsZGVyLCBkZWZhdWx0RjMyOm51bWJlcikgeworICBidWlsZGVyLmFkZEZpZWxkRmxvYXQzMigyNiwgZGVmYXVsdEYzMiwgNDIuMCk7Cit9CisKK3N0YXRpYyBhZGRKdXN0RjY0KGJ1aWxkZXI6ZmxhdGJ1ZmZlcnMuQnVpbGRlciwganVzdEY2NDpudW1iZXIpIHsKKyAgYnVpbGRlci5hZGRGaWVsZEZsb2F0NjQoMjcsIGp1c3RGNjQsIDAuMCk7Cit9CisKK3N0YXRpYyBhZGRNYXliZUY2NChidWlsZGVyOmZsYXRidWZmZXJzLkJ1aWxkZXIsIG1heWJlRjY0Om51bWJlcikgeworICBidWlsZGVyLmFkZEZpZWxkRmxvYXQ2NCgyOCwgbWF5YmVGNjQsIDApOworfQorCitzdGF0aWMgYWRkRGVmYXVsdEY2NChidWlsZGVyOmZsYXRidWZmZXJzLkJ1aWxkZXIsIGRlZmF1bHRGNjQ6bnVtYmVyKSB7CisgIGJ1aWxkZXIuYWRkRmllbGRGbG9hdDY0KDI5LCBkZWZhdWx0RjY0LCA0Mi4wKTsKK30KKworc3RhdGljIGFkZEp1c3RCb29sKGJ1aWxkZXI6ZmxhdGJ1ZmZlcnMuQnVpbGRlciwganVzdEJvb2w6Ym9vbGVhbikgeworICBidWlsZGVyLmFkZEZpZWxkSW50OCgzMCwgK2p1c3RCb29sLCArZmFsc2UpOworfQorCitzdGF0aWMgYWRkTWF5YmVCb29sKGJ1aWxkZXI6ZmxhdGJ1ZmZlcnMuQnVpbGRlciwgbWF5YmVCb29sOmJvb2xlYW4pIHsKKyAgYnVpbGRlci5hZGRGaWVsZEludDgoMzEsICttYXliZUJvb2wsIDApOworfQorCitzdGF0aWMgYWRkRGVmYXVsdEJvb2woYnVpbGRlcjpmbGF0YnVmZmVycy5CdWlsZGVyLCBkZWZhdWx0Qm9vbDpib29sZWFuKSB7CisgIGJ1aWxkZXIuYWRkRmllbGRJbnQ4KDMyLCArZGVmYXVsdEJvb2wsICt0cnVlKTsKK30KKworc3RhdGljIGFkZEp1c3RFbnVtKGJ1aWxkZXI6ZmxhdGJ1ZmZlcnMuQnVpbGRlciwganVzdEVudW06T3B0aW9uYWxCeXRlKSB7CisgIGJ1aWxkZXIuYWRkRmllbGRJbnQ4KDMzLCBqdXN0RW51bSwgT3B0aW9uYWxCeXRlLk5vbmUpOworfQorCitzdGF0aWMgYWRkTWF5YmVFbnVtKGJ1aWxkZXI6ZmxhdGJ1ZmZlcnMuQnVpbGRlciwgbWF5YmVFbnVtOk9wdGlvbmFsQnl0ZSkgeworICBidWlsZGVyLmFkZEZpZWxkSW50OCgzNCwgbWF5YmVFbnVtLCAwKTsKK30KKworc3RhdGljIGFkZERlZmF1bHRFbnVtKGJ1aWxkZXI6ZmxhdGJ1ZmZlcnMuQnVpbGRlciwgZGVmYXVsdEVudW06T3B0aW9uYWxCeXRlKSB7CisgIGJ1aWxkZXIuYWRkRmllbGRJbnQ4KDM1LCBkZWZhdWx0RW51bSwgT3B0aW9uYWxCeXRlLk9uZSk7Cit9CisKK3N0YXRpYyBlbmRTY2FsYXJTdHVmZihidWlsZGVyOmZsYXRidWZmZXJzLkJ1aWxkZXIpOmZsYXRidWZmZXJzLk9mZnNldCB7CisgIGNvbnN0IG9mZnNldCA9IGJ1aWxkZXIuZW5kT2JqZWN0KCk7CisgIHJldHVybiBvZmZzZXQ7Cit9CisKK3N0YXRpYyBmaW5pc2hTY2FsYXJTdHVmZkJ1ZmZlcihidWlsZGVyOmZsYXRidWZmZXJzLkJ1aWxkZXIsIG9mZnNldDpmbGF0YnVmZmVycy5PZmZzZXQpIHsKKyAgYnVpbGRlci5maW5pc2gob2Zmc2V0LCAnTlVMTCcpOworfQorCitzdGF0aWMgZmluaXNoU2l6ZVByZWZpeGVkU2NhbGFyU3R1ZmZCdWZmZXIoYnVpbGRlcjpmbGF0YnVmZmVycy5CdWlsZGVyLCBvZmZzZXQ6ZmxhdGJ1ZmZlcnMuT2Zmc2V0KSB7CisgIGJ1aWxkZXIuZmluaXNoKG9mZnNldCwgJ05VTEwnLCB0cnVlKTsKK30KKworc3RhdGljIGNyZWF0ZVNjYWxhclN0dWZmKGJ1aWxkZXI6ZmxhdGJ1ZmZlcnMuQnVpbGRlciwganVzdEk4Om51bWJlciwgbWF5YmVJODpudW1iZXJ8bnVsbCwgZGVmYXVsdEk4Om51bWJlciwganVzdFU4Om51bWJlciwgbWF5YmVVODpudW1iZXJ8bnVsbCwgZGVmYXVsdFU4Om51bWJlciwganVzdEkxNjpudW1iZXIsIG1heWJlSTE2Om51bWJlcnxudWxsLCBkZWZhdWx0STE2Om51bWJlciwganVzdFUxNjpudW1iZXIsIG1heWJlVTE2Om51bWJlcnxudWxsLCBkZWZhdWx0VTE2Om51bWJlciwganVzdEkzMjpudW1iZXIsIG1heWJlSTMyOm51bWJlcnxudWxsLCBkZWZhdWx0STMyOm51bWJlciwganVzdFUzMjpudW1iZXIsIG1heWJlVTMyOm51bWJlcnxudWxsLCBkZWZhdWx0VTMyOm51bWJlciwganVzdEk2NDpiaWdpbnQsIG1heWJlSTY0OmJpZ2ludHxudWxsLCBkZWZhdWx0STY0OmJpZ2ludCwganVzdFU2NDpiaWdpbnQsIG1heWJlVTY0OmJpZ2ludHxudWxsLCBkZWZhdWx0VTY0OmJpZ2ludCwganVzdEYzMjpudW1iZXIsIG1heWJlRjMyOm51bWJlcnxudWxsLCBkZWZhdWx0RjMyOm51bWJlciwganVzdEY2NDpudW1iZXIsIG1heWJlRjY0Om51bWJlcnxudWxsLCBkZWZhdWx0RjY0Om51bWJlciwganVzdEJvb2w6Ym9vbGVhbiwgbWF5YmVCb29sOmJvb2xlYW58bnVsbCwgZGVmYXVsdEJvb2w6Ym9vbGVhbiwganVzdEVudW06T3B0aW9uYWxCeXRlLCBtYXliZUVudW06T3B0aW9uYWxCeXRlfG51bGwsIGRlZmF1bHRFbnVtOk9wdGlvbmFsQnl0ZSk6ZmxhdGJ1ZmZlcnMuT2Zmc2V0IHsKKyAgU2NhbGFyU3R1ZmYuc3RhcnRTY2FsYXJTdHVmZihidWlsZGVyKTsKKyAgU2NhbGFyU3R1ZmYuYWRkSnVzdEk4KGJ1aWxkZXIsIGp1c3RJOCk7CisgIGlmIChtYXliZUk4ICE9PSBudWxsKQorICAgIFNjYWxhclN0dWZmLmFkZE1heWJlSTgoYnVpbGRlciwgbWF5YmVJOCk7CisgIFNjYWxhclN0dWZmLmFkZERlZmF1bHRJOChidWlsZGVyLCBkZWZhdWx0STgpOworICBTY2FsYXJTdHVmZi5hZGRKdXN0VTgoYnVpbGRlciwganVzdFU4KTsKKyAgaWYgKG1heWJlVTggIT09IG51bGwpCisgICAgU2NhbGFyU3R1ZmYuYWRkTWF5YmVVOChidWlsZGVyLCBtYXliZVU4KTsKKyAgU2NhbGFyU3R1ZmYuYWRkRGVmYXVsdFU4KGJ1aWxkZXIsIGRlZmF1bHRVOCk7CisgIFNjYWxhclN0dWZmLmFkZEp1c3RJMTYoYnVpbGRlciwganVzdEkxNik7CisgIGlmIChtYXliZUkxNiAhPT0gbnVsbCkKKyAgICBTY2FsYXJTdHVmZi5hZGRNYXliZUkxNihidWlsZGVyLCBtYXliZUkxNik7CisgIFNjYWxhclN0dWZmLmFkZERlZmF1bHRJMTYoYnVpbGRlciwgZGVmYXVsdEkxNik7CisgIFNjYWxhclN0dWZmLmFkZEp1c3RVMTYoYnVpbGRlciwganVzdFUxNik7CisgIGlmIChtYXliZVUxNiAhPT0gbnVsbCkKKyAgICBTY2FsYXJTdHVmZi5hZGRNYXliZVUxNihidWlsZGVyLCBtYXliZVUxNik7CisgIFNjYWxhclN0dWZmLmFkZERlZmF1bHRVMTYoYnVpbGRlciwgZGVmYXVsdFUxNik7CisgIFNjYWxhclN0dWZmLmFkZEp1c3RJMzIoYnVpbGRlciwganVzdEkzMik7CisgIGlmIChtYXliZUkzMiAhPT0gbnVsbCkKKyAgICBTY2FsYXJTdHVmZi5hZGRNYXliZUkzMihidWlsZGVyLCBtYXliZUkzMik7CisgIFNjYWxhclN0dWZmLmFkZERlZmF1bHRJMzIoYnVpbGRlciwgZGVmYXVsdEkzMik7CisgIFNjYWxhclN0dWZmLmFkZEp1c3RVMzIoYnVpbGRlciwganVzdFUzMik7CisgIGlmIChtYXliZVUzMiAhPT0gbnVsbCkKKyAgICBTY2FsYXJTdHVmZi5hZGRNYXliZVUzMihidWlsZGVyLCBtYXliZVUzMik7CisgIFNjYWxhclN0dWZmLmFkZERlZmF1bHRVMzIoYnVpbGRlciwgZGVmYXVsdFUzMik7CisgIFNjYWxhclN0dWZmLmFkZEp1c3RJNjQoYnVpbGRlciwganVzdEk2NCk7CisgIGlmIChtYXliZUk2NCAhPT0gbnVsbCkKKyAgICBTY2FsYXJTdHVmZi5hZGRNYXliZUk2NChidWlsZGVyLCBtYXliZUk2NCk7CisgIFNjYWxhclN0dWZmLmFkZERlZmF1bHRJNjQoYnVpbGRlciwgZGVmYXVsdEk2NCk7CisgIFNjYWxhclN0dWZmLmFkZEp1c3RVNjQoYnVpbGRlciwganVzdFU2NCk7CisgIGlmIChtYXliZVU2NCAhPT0gbnVsbCkKKyAgICBTY2FsYXJTdHVmZi5hZGRNYXliZVU2NChidWlsZGVyLCBtYXliZVU2NCk7CisgIFNjYWxhclN0dWZmLmFkZERlZmF1bHRVNjQoYnVpbGRlciwgZGVmYXVsdFU2NCk7CisgIFNjYWxhclN0dWZmLmFkZEp1c3RGMzIoYnVpbGRlciwganVzdEYzMik7CisgIGlmIChtYXliZUYzMiAhPT0gbnVsbCkKKyAgICBTY2FsYXJTdHVmZi5hZGRNYXliZUYzMihidWlsZGVyLCBtYXliZUYzMik7CisgIFNjYWxhclN0dWZmLmFkZERlZmF1bHRGMzIoYnVpbGRlciwgZGVmYXVsdEYzMik7CisgIFNjYWxhclN0dWZmLmFkZEp1c3RGNjQoYnVpbGRlciwganVzdEY2NCk7CisgIGlmIChtYXliZUY2NCAhPT0gbnVsbCkKKyAgICBTY2FsYXJTdHVmZi5hZGRNYXliZUY2NChidWlsZGVyLCBtYXliZUY2NCk7CisgIFNjYWxhclN0dWZmLmFkZERlZmF1bHRGNjQoYnVpbGRlciwgZGVmYXVsdEY2NCk7CisgIFNjYWxhclN0dWZmLmFkZEp1c3RCb29sKGJ1aWxkZXIsIGp1c3RCb29sKTsKKyAgaWYgKG1heWJlQm9vbCAhPT0gbnVsbCkKKyAgICBTY2FsYXJTdHVmZi5hZGRNYXliZUJvb2woYnVpbGRlciwgbWF5YmVCb29sKTsKKyAgU2NhbGFyU3R1ZmYuYWRkRGVmYXVsdEJvb2woYnVpbGRlciwgZGVmYXVsdEJvb2wpOworICBTY2FsYXJTdHVmZi5hZGRKdXN0RW51bShidWlsZGVyLCBqdXN0RW51bSk7CisgIGlmIChtYXliZUVudW0gIT09IG51bGwpCisgICAgU2NhbGFyU3R1ZmYuYWRkTWF5YmVFbnVtKGJ1aWxkZXIsIG1heWJlRW51bSk7CisgIFNjYWxhclN0dWZmLmFkZERlZmF1bHRFbnVtKGJ1aWxkZXIsIGRlZmF1bHRFbnVtKTsKKyAgcmV0dXJuIFNjYWxhclN0dWZmLmVuZFNjYWxhclN0dWZmKGJ1aWxkZXIpOworfQorfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvb3B0aW9uYWxfc2NhbGFycy50cyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL3RzL29wdGlvbmFsX3NjYWxhcnMudHMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHRoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL29wdGlvbmFsX3NjYWxhcnMudHMKcmVuYW1lIHRvIHRoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL3RzL29wdGlvbmFsX3NjYWxhcnMudHMKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL3RzL29wdGlvbmFsX3NjYWxhcnNfZ2VuZXJhdGVkLnRzIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvdHMvb3B0aW9uYWxfc2NhbGFyc19nZW5lcmF0ZWQudHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWJkMzM1MAotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL3RzL29wdGlvbmFsX3NjYWxhcnNfZ2VuZXJhdGVkLnRzCkBAIC0wLDAgKzEsNCBAQAorLy8gYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgYnkgdGhlIEZsYXRCdWZmZXJzIGNvbXBpbGVyLCBkbyBub3QgbW9kaWZ5CisKK2V4cG9ydCB7IE9wdGlvbmFsQnl0ZSB9IGZyb20gJy4vb3B0aW9uYWwtc2NhbGFycy9vcHRpb25hbC1ieXRlLmpzJzsKK2V4cG9ydCB7IFNjYWxhclN0dWZmIH0gZnJvbSAnLi9vcHRpb25hbC1zY2FsYXJzL3NjYWxhci1zdHVmZi5qcyc7CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy90cy9wYWNrYWdlLmpzb24gYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy90cy9wYWNrYWdlLmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWMyNjM5ZQotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL3RzL3BhY2thZ2UuanNvbgpAQCAtMCwwICsxLDcgQEAKK3sKKyAgICAidHlwZSI6ICJtb2R1bGUiLAorICAgICJkZXBlbmRlbmNpZXMiOiB7CisgICAgICAgICJAZ3JwYy9ncnBjLWpzIjogIl4xLjcuMCIsCisgICAgICAgICJmbGF0YnVmZmVycyI6ICIuLi8uLi8iCisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvdHMvcmVmbGVjdGlvbi9hZHZhbmNlZC1mZWF0dXJlcy50cyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL3RzL3JlZmxlY3Rpb24vYWR2YW5jZWQtZmVhdHVyZXMudHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGQzYjg2NQotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL3RzL3JlZmxlY3Rpb24vYWR2YW5jZWQtZmVhdHVyZXMudHMKQEAgLTAsMCArMSwxMSBAQAorLy8gYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgYnkgdGhlIEZsYXRCdWZmZXJzIGNvbXBpbGVyLCBkbyBub3QgbW9kaWZ5CisKKy8qKgorICogTmV3IHNjaGVtYSBsYW5ndWFnZSBmZWF0dXJlcyB0aGF0IGFyZSBub3Qgc3VwcG9ydGVkIGJ5IG9sZCBjb2RlIGdlbmVyYXRvcnMuCisgKi8KK2V4cG9ydCBlbnVtIEFkdmFuY2VkRmVhdHVyZXMgeworICBBZHZhbmNlZEFycmF5RmVhdHVyZXMgPSAnMScsCisgIEFkdmFuY2VkVW5pb25GZWF0dXJlcyA9ICcyJywKKyAgT3B0aW9uYWxTY2FsYXJzID0gJzQnLAorICBEZWZhdWx0VmVjdG9yc0FuZFN0cmluZ3MgPSAnOCcKK30KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL3RzL3JlZmxlY3Rpb24vYmFzZS10eXBlLmpzIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvdHMvcmVmbGVjdGlvbi9iYXNlLXR5cGUuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGNjZDBhYwotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL3RzL3JlZmxlY3Rpb24vYmFzZS10eXBlLmpzCkBAIC0wLDAgKzEsMjMgQEAKKy8vIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGJ5IHRoZSBGbGF0QnVmZmVycyBjb21waWxlciwgZG8gbm90IG1vZGlmeQorZXhwb3J0IHZhciBCYXNlVHlwZTsKKyhmdW5jdGlvbiAoQmFzZVR5cGUpIHsKKyAgICBCYXNlVHlwZVtCYXNlVHlwZVsiTm9uZSJdID0gMF0gPSAiTm9uZSI7CisgICAgQmFzZVR5cGVbQmFzZVR5cGVbIlVUeXBlIl0gPSAxXSA9ICJVVHlwZSI7CisgICAgQmFzZVR5cGVbQmFzZVR5cGVbIkJvb2wiXSA9IDJdID0gIkJvb2wiOworICAgIEJhc2VUeXBlW0Jhc2VUeXBlWyJCeXRlIl0gPSAzXSA9ICJCeXRlIjsKKyAgICBCYXNlVHlwZVtCYXNlVHlwZVsiVUJ5dGUiXSA9IDRdID0gIlVCeXRlIjsKKyAgICBCYXNlVHlwZVtCYXNlVHlwZVsiU2hvcnQiXSA9IDVdID0gIlNob3J0IjsKKyAgICBCYXNlVHlwZVtCYXNlVHlwZVsiVVNob3J0Il0gPSA2XSA9ICJVU2hvcnQiOworICAgIEJhc2VUeXBlW0Jhc2VUeXBlWyJJbnQiXSA9IDddID0gIkludCI7CisgICAgQmFzZVR5cGVbQmFzZVR5cGVbIlVJbnQiXSA9IDhdID0gIlVJbnQiOworICAgIEJhc2VUeXBlW0Jhc2VUeXBlWyJMb25nIl0gPSA5XSA9ICJMb25nIjsKKyAgICBCYXNlVHlwZVtCYXNlVHlwZVsiVUxvbmciXSA9IDEwXSA9ICJVTG9uZyI7CisgICAgQmFzZVR5cGVbQmFzZVR5cGVbIkZsb2F0Il0gPSAxMV0gPSAiRmxvYXQiOworICAgIEJhc2VUeXBlW0Jhc2VUeXBlWyJEb3VibGUiXSA9IDEyXSA9ICJEb3VibGUiOworICAgIEJhc2VUeXBlW0Jhc2VUeXBlWyJTdHJpbmciXSA9IDEzXSA9ICJTdHJpbmciOworICAgIEJhc2VUeXBlW0Jhc2VUeXBlWyJWZWN0b3IiXSA9IDE0XSA9ICJWZWN0b3IiOworICAgIEJhc2VUeXBlW0Jhc2VUeXBlWyJPYmoiXSA9IDE1XSA9ICJPYmoiOworICAgIEJhc2VUeXBlW0Jhc2VUeXBlWyJVbmlvbiJdID0gMTZdID0gIlVuaW9uIjsKKyAgICBCYXNlVHlwZVtCYXNlVHlwZVsiQXJyYXkiXSA9IDE3XSA9ICJBcnJheSI7CisgICAgQmFzZVR5cGVbQmFzZVR5cGVbIk1heEJhc2VUeXBlIl0gPSAxOF0gPSAiTWF4QmFzZVR5cGUiOworfSkoQmFzZVR5cGUgfHwgKEJhc2VUeXBlID0ge30pKTsKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL3RzL3JlZmxlY3Rpb24vYmFzZS10eXBlLnRzIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvdHMvcmVmbGVjdGlvbi9iYXNlLXR5cGUudHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2VlOThlZAotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL3RzL3JlZmxlY3Rpb24vYmFzZS10eXBlLnRzCkBAIC0wLDAgKzEsMjMgQEAKKy8vIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGJ5IHRoZSBGbGF0QnVmZmVycyBjb21waWxlciwgZG8gbm90IG1vZGlmeQorCitleHBvcnQgZW51bSBCYXNlVHlwZSB7CisgIE5vbmUgPSAwLAorICBVVHlwZSA9IDEsCisgIEJvb2wgPSAyLAorICBCeXRlID0gMywKKyAgVUJ5dGUgPSA0LAorICBTaG9ydCA9IDUsCisgIFVTaG9ydCA9IDYsCisgIEludCA9IDcsCisgIFVJbnQgPSA4LAorICBMb25nID0gOSwKKyAgVUxvbmcgPSAxMCwKKyAgRmxvYXQgPSAxMSwKKyAgRG91YmxlID0gMTIsCisgIFN0cmluZyA9IDEzLAorICBWZWN0b3IgPSAxNCwKKyAgT2JqID0gMTUsCisgIFVuaW9uID0gMTYsCisgIEFycmF5ID0gMTcsCisgIE1heEJhc2VUeXBlID0gMTgKK30KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL3RzL3JlZmxlY3Rpb24vZW51bS12YWwuanMgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy90cy9yZWZsZWN0aW9uL2VudW0tdmFsLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYyY2UwM2QKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy90cy9yZWZsZWN0aW9uL2VudW0tdmFsLmpzCkBAIC0wLDAgKzEsMTEwIEBACisvLyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBieSB0aGUgRmxhdEJ1ZmZlcnMgY29tcGlsZXIsIGRvIG5vdCBtb2RpZnkKK2ltcG9ydCAqIGFzIGZsYXRidWZmZXJzIGZyb20gJ2ZsYXRidWZmZXJzJzsKK2ltcG9ydCB7IFR5cGUgfSBmcm9tICcuLi9yZWZsZWN0aW9uL3R5cGUuanMnOworZXhwb3J0IGNsYXNzIEVudW1WYWwgeworICAgIGNvbnN0cnVjdG9yKCkgeworICAgICAgICB0aGlzLmJiID0gbnVsbDsKKyAgICAgICAgdGhpcy5iYl9wb3MgPSAwOworICAgIH0KKyAgICBfX2luaXQoaSwgYmIpIHsKKyAgICAgICAgdGhpcy5iYl9wb3MgPSBpOworICAgICAgICB0aGlzLmJiID0gYmI7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKyAgICBzdGF0aWMgZ2V0Um9vdEFzRW51bVZhbChiYiwgb2JqKSB7CisgICAgICAgIHJldHVybiAob2JqIHx8IG5ldyBFbnVtVmFsKCkpLl9faW5pdChiYi5yZWFkSW50MzIoYmIucG9zaXRpb24oKSkgKyBiYi5wb3NpdGlvbigpLCBiYik7CisgICAgfQorICAgIHN0YXRpYyBnZXRTaXplUHJlZml4ZWRSb290QXNFbnVtVmFsKGJiLCBvYmopIHsKKyAgICAgICAgYmIuc2V0UG9zaXRpb24oYmIucG9zaXRpb24oKSArIGZsYXRidWZmZXJzLlNJWkVfUFJFRklYX0xFTkdUSCk7CisgICAgICAgIHJldHVybiAob2JqIHx8IG5ldyBFbnVtVmFsKCkpLl9faW5pdChiYi5yZWFkSW50MzIoYmIucG9zaXRpb24oKSkgKyBiYi5wb3NpdGlvbigpLCBiYik7CisgICAgfQorICAgIG5hbWUob3B0aW9uYWxFbmNvZGluZykgeworICAgICAgICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCA0KTsKKyAgICAgICAgcmV0dXJuIG9mZnNldCA/IHRoaXMuYmIuX19zdHJpbmcodGhpcy5iYl9wb3MgKyBvZmZzZXQsIG9wdGlvbmFsRW5jb2RpbmcpIDogbnVsbDsKKyAgICB9CisgICAgdmFsdWUoKSB7CisgICAgICAgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsIDYpOworICAgICAgICByZXR1cm4gb2Zmc2V0ID8gdGhpcy5iYi5yZWFkSW50NjQodGhpcy5iYl9wb3MgKyBvZmZzZXQpIDogQmlnSW50KCcwJyk7CisgICAgfQorICAgIG11dGF0ZV92YWx1ZSh2YWx1ZSkgeworICAgICAgICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCA2KTsKKyAgICAgICAgaWYgKG9mZnNldCA9PT0gMCkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIHRoaXMuYmIud3JpdGVJbnQ2NCh0aGlzLmJiX3BvcyArIG9mZnNldCwgdmFsdWUpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgdW5pb25UeXBlKG9iaikgeworICAgICAgICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCAxMCk7CisgICAgICAgIHJldHVybiBvZmZzZXQgPyAob2JqIHx8IG5ldyBUeXBlKCkpLl9faW5pdCh0aGlzLmJiLl9faW5kaXJlY3QodGhpcy5iYl9wb3MgKyBvZmZzZXQpLCB0aGlzLmJiKSA6IG51bGw7CisgICAgfQorICAgIGRvY3VtZW50YXRpb24oaW5kZXgsIG9wdGlvbmFsRW5jb2RpbmcpIHsKKyAgICAgICAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywgMTIpOworICAgICAgICByZXR1cm4gb2Zmc2V0ID8gdGhpcy5iYi5fX3N0cmluZyh0aGlzLmJiLl9fdmVjdG9yKHRoaXMuYmJfcG9zICsgb2Zmc2V0KSArIGluZGV4ICogNCwgb3B0aW9uYWxFbmNvZGluZykgOiBudWxsOworICAgIH0KKyAgICBkb2N1bWVudGF0aW9uTGVuZ3RoKCkgeworICAgICAgICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCAxMik7CisgICAgICAgIHJldHVybiBvZmZzZXQgPyB0aGlzLmJiLl9fdmVjdG9yX2xlbih0aGlzLmJiX3BvcyArIG9mZnNldCkgOiAwOworICAgIH0KKyAgICBzdGF0aWMgZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCkgeworICAgICAgICByZXR1cm4gJ3JlZmxlY3Rpb25fRW51bVZhbCc7CisgICAgfQorICAgIHN0YXRpYyBzdGFydEVudW1WYWwoYnVpbGRlcikgeworICAgICAgICBidWlsZGVyLnN0YXJ0T2JqZWN0KDUpOworICAgIH0KKyAgICBzdGF0aWMgYWRkTmFtZShidWlsZGVyLCBuYW1lT2Zmc2V0KSB7CisgICAgICAgIGJ1aWxkZXIuYWRkRmllbGRPZmZzZXQoMCwgbmFtZU9mZnNldCwgMCk7CisgICAgfQorICAgIHN0YXRpYyBhZGRWYWx1ZShidWlsZGVyLCB2YWx1ZSkgeworICAgICAgICBidWlsZGVyLmFkZEZpZWxkSW50NjQoMSwgdmFsdWUsIEJpZ0ludCgnMCcpKTsKKyAgICB9CisgICAgc3RhdGljIGFkZFVuaW9uVHlwZShidWlsZGVyLCB1bmlvblR5cGVPZmZzZXQpIHsKKyAgICAgICAgYnVpbGRlci5hZGRGaWVsZE9mZnNldCgzLCB1bmlvblR5cGVPZmZzZXQsIDApOworICAgIH0KKyAgICBzdGF0aWMgYWRkRG9jdW1lbnRhdGlvbihidWlsZGVyLCBkb2N1bWVudGF0aW9uT2Zmc2V0KSB7CisgICAgICAgIGJ1aWxkZXIuYWRkRmllbGRPZmZzZXQoNCwgZG9jdW1lbnRhdGlvbk9mZnNldCwgMCk7CisgICAgfQorICAgIHN0YXRpYyBjcmVhdGVEb2N1bWVudGF0aW9uVmVjdG9yKGJ1aWxkZXIsIGRhdGEpIHsKKyAgICAgICAgYnVpbGRlci5zdGFydFZlY3Rvcig0LCBkYXRhLmxlbmd0aCwgNCk7CisgICAgICAgIGZvciAobGV0IGkgPSBkYXRhLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7CisgICAgICAgICAgICBidWlsZGVyLmFkZE9mZnNldChkYXRhW2ldKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gYnVpbGRlci5lbmRWZWN0b3IoKTsKKyAgICB9CisgICAgc3RhdGljIHN0YXJ0RG9jdW1lbnRhdGlvblZlY3RvcihidWlsZGVyLCBudW1FbGVtcykgeworICAgICAgICBidWlsZGVyLnN0YXJ0VmVjdG9yKDQsIG51bUVsZW1zLCA0KTsKKyAgICB9CisgICAgc3RhdGljIGVuZEVudW1WYWwoYnVpbGRlcikgeworICAgICAgICBjb25zdCBvZmZzZXQgPSBidWlsZGVyLmVuZE9iamVjdCgpOworICAgICAgICBidWlsZGVyLnJlcXVpcmVkRmllbGQob2Zmc2V0LCA0KTsgLy8gbmFtZQorICAgICAgICByZXR1cm4gb2Zmc2V0OworICAgIH0KKyAgICB1bnBhY2soKSB7CisgICAgICAgIHJldHVybiBuZXcgRW51bVZhbFQodGhpcy5uYW1lKCksIHRoaXMudmFsdWUoKSwgKHRoaXMudW5pb25UeXBlKCkgIT09IG51bGwgPyB0aGlzLnVuaW9uVHlwZSgpLnVucGFjaygpIDogbnVsbCksIHRoaXMuYmIuY3JlYXRlU2NhbGFyTGlzdCh0aGlzLmRvY3VtZW50YXRpb24uYmluZCh0aGlzKSwgdGhpcy5kb2N1bWVudGF0aW9uTGVuZ3RoKCkpKTsKKyAgICB9CisgICAgdW5wYWNrVG8oX28pIHsKKyAgICAgICAgX28ubmFtZSA9IHRoaXMubmFtZSgpOworICAgICAgICBfby52YWx1ZSA9IHRoaXMudmFsdWUoKTsKKyAgICAgICAgX28udW5pb25UeXBlID0gKHRoaXMudW5pb25UeXBlKCkgIT09IG51bGwgPyB0aGlzLnVuaW9uVHlwZSgpLnVucGFjaygpIDogbnVsbCk7CisgICAgICAgIF9vLmRvY3VtZW50YXRpb24gPSB0aGlzLmJiLmNyZWF0ZVNjYWxhckxpc3QodGhpcy5kb2N1bWVudGF0aW9uLmJpbmQodGhpcyksIHRoaXMuZG9jdW1lbnRhdGlvbkxlbmd0aCgpKTsKKyAgICB9Cit9CitleHBvcnQgY2xhc3MgRW51bVZhbFQgeworICAgIGNvbnN0cnVjdG9yKG5hbWUgPSBudWxsLCB2YWx1ZSA9IEJpZ0ludCgnMCcpLCB1bmlvblR5cGUgPSBudWxsLCBkb2N1bWVudGF0aW9uID0gW10pIHsKKyAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKKyAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlOworICAgICAgICB0aGlzLnVuaW9uVHlwZSA9IHVuaW9uVHlwZTsKKyAgICAgICAgdGhpcy5kb2N1bWVudGF0aW9uID0gZG9jdW1lbnRhdGlvbjsKKyAgICB9CisgICAgcGFjayhidWlsZGVyKSB7CisgICAgICAgIGNvbnN0IG5hbWUgPSAodGhpcy5uYW1lICE9PSBudWxsID8gYnVpbGRlci5jcmVhdGVTdHJpbmcodGhpcy5uYW1lKSA6IDApOworICAgICAgICBjb25zdCB1bmlvblR5cGUgPSAodGhpcy51bmlvblR5cGUgIT09IG51bGwgPyB0aGlzLnVuaW9uVHlwZS5wYWNrKGJ1aWxkZXIpIDogMCk7CisgICAgICAgIGNvbnN0IGRvY3VtZW50YXRpb24gPSBFbnVtVmFsLmNyZWF0ZURvY3VtZW50YXRpb25WZWN0b3IoYnVpbGRlciwgYnVpbGRlci5jcmVhdGVPYmplY3RPZmZzZXRMaXN0KHRoaXMuZG9jdW1lbnRhdGlvbikpOworICAgICAgICBFbnVtVmFsLnN0YXJ0RW51bVZhbChidWlsZGVyKTsKKyAgICAgICAgRW51bVZhbC5hZGROYW1lKGJ1aWxkZXIsIG5hbWUpOworICAgICAgICBFbnVtVmFsLmFkZFZhbHVlKGJ1aWxkZXIsIHRoaXMudmFsdWUpOworICAgICAgICBFbnVtVmFsLmFkZFVuaW9uVHlwZShidWlsZGVyLCB1bmlvblR5cGUpOworICAgICAgICBFbnVtVmFsLmFkZERvY3VtZW50YXRpb24oYnVpbGRlciwgZG9jdW1lbnRhdGlvbik7CisgICAgICAgIHJldHVybiBFbnVtVmFsLmVuZEVudW1WYWwoYnVpbGRlcik7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvdHMvcmVmbGVjdGlvbi9lbnVtLXZhbC50cyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL3RzL3JlZmxlY3Rpb24vZW51bS12YWwudHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODUyNzgzMgotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL3RzL3JlZmxlY3Rpb24vZW51bS12YWwudHMKQEAgLTAsMCArMSwxNDkgQEAKKy8vIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGJ5IHRoZSBGbGF0QnVmZmVycyBjb21waWxlciwgZG8gbm90IG1vZGlmeQorCitpbXBvcnQgKiBhcyBmbGF0YnVmZmVycyBmcm9tICdmbGF0YnVmZmVycyc7CisKK2ltcG9ydCB7IFR5cGUsIFR5cGVUIH0gZnJvbSAnLi4vcmVmbGVjdGlvbi90eXBlLmpzJzsKKworCitleHBvcnQgY2xhc3MgRW51bVZhbCB7CisgIGJiOiBmbGF0YnVmZmVycy5CeXRlQnVmZmVyfG51bGwgPSBudWxsOworICBiYl9wb3MgPSAwOworICBfX2luaXQoaTpudW1iZXIsIGJiOmZsYXRidWZmZXJzLkJ5dGVCdWZmZXIpOkVudW1WYWwgeworICB0aGlzLmJiX3BvcyA9IGk7CisgIHRoaXMuYmIgPSBiYjsKKyAgcmV0dXJuIHRoaXM7Cit9CisKK3N0YXRpYyBnZXRSb290QXNFbnVtVmFsKGJiOmZsYXRidWZmZXJzLkJ5dGVCdWZmZXIsIG9iaj86RW51bVZhbCk6RW51bVZhbCB7CisgIHJldHVybiAob2JqIHx8IG5ldyBFbnVtVmFsKCkpLl9faW5pdChiYi5yZWFkSW50MzIoYmIucG9zaXRpb24oKSkgKyBiYi5wb3NpdGlvbigpLCBiYik7Cit9CisKK3N0YXRpYyBnZXRTaXplUHJlZml4ZWRSb290QXNFbnVtVmFsKGJiOmZsYXRidWZmZXJzLkJ5dGVCdWZmZXIsIG9iaj86RW51bVZhbCk6RW51bVZhbCB7CisgIGJiLnNldFBvc2l0aW9uKGJiLnBvc2l0aW9uKCkgKyBmbGF0YnVmZmVycy5TSVpFX1BSRUZJWF9MRU5HVEgpOworICByZXR1cm4gKG9iaiB8fCBuZXcgRW51bVZhbCgpKS5fX2luaXQoYmIucmVhZEludDMyKGJiLnBvc2l0aW9uKCkpICsgYmIucG9zaXRpb24oKSwgYmIpOworfQorCituYW1lKCk6c3RyaW5nfG51bGwKK25hbWUob3B0aW9uYWxFbmNvZGluZzpmbGF0YnVmZmVycy5FbmNvZGluZyk6c3RyaW5nfFVpbnQ4QXJyYXl8bnVsbAorbmFtZShvcHRpb25hbEVuY29kaW5nPzphbnkpOnN0cmluZ3xVaW50OEFycmF5fG51bGwgeworICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiIS5fX29mZnNldCh0aGlzLmJiX3BvcywgNCk7CisgIHJldHVybiBvZmZzZXQgPyB0aGlzLmJiIS5fX3N0cmluZyh0aGlzLmJiX3BvcyArIG9mZnNldCwgb3B0aW9uYWxFbmNvZGluZykgOiBudWxsOworfQorCit2YWx1ZSgpOmJpZ2ludCB7CisgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIhLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCA2KTsKKyAgcmV0dXJuIG9mZnNldCA/IHRoaXMuYmIhLnJlYWRJbnQ2NCh0aGlzLmJiX3BvcyArIG9mZnNldCkgOiBCaWdJbnQoJzAnKTsKK30KKworbXV0YXRlX3ZhbHVlKHZhbHVlOmJpZ2ludCk6Ym9vbGVhbiB7CisgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIhLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCA2KTsKKworICBpZiAob2Zmc2V0ID09PSAwKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgdGhpcy5iYiEud3JpdGVJbnQ2NCh0aGlzLmJiX3BvcyArIG9mZnNldCwgdmFsdWUpOworICByZXR1cm4gdHJ1ZTsKK30KKwordW5pb25UeXBlKG9iaj86VHlwZSk6VHlwZXxudWxsIHsKKyAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYiEuX19vZmZzZXQodGhpcy5iYl9wb3MsIDEwKTsKKyAgcmV0dXJuIG9mZnNldCA/IChvYmogfHwgbmV3IFR5cGUoKSkuX19pbml0KHRoaXMuYmIhLl9faW5kaXJlY3QodGhpcy5iYl9wb3MgKyBvZmZzZXQpLCB0aGlzLmJiISkgOiBudWxsOworfQorCitkb2N1bWVudGF0aW9uKGluZGV4OiBudW1iZXIpOnN0cmluZworZG9jdW1lbnRhdGlvbihpbmRleDogbnVtYmVyLG9wdGlvbmFsRW5jb2Rpbmc6ZmxhdGJ1ZmZlcnMuRW5jb2RpbmcpOnN0cmluZ3xVaW50OEFycmF5Citkb2N1bWVudGF0aW9uKGluZGV4OiBudW1iZXIsb3B0aW9uYWxFbmNvZGluZz86YW55KTpzdHJpbmd8VWludDhBcnJheXxudWxsIHsKKyAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYiEuX19vZmZzZXQodGhpcy5iYl9wb3MsIDEyKTsKKyAgcmV0dXJuIG9mZnNldCA/IHRoaXMuYmIhLl9fc3RyaW5nKHRoaXMuYmIhLl9fdmVjdG9yKHRoaXMuYmJfcG9zICsgb2Zmc2V0KSArIGluZGV4ICogNCwgb3B0aW9uYWxFbmNvZGluZykgOiBudWxsOworfQorCitkb2N1bWVudGF0aW9uTGVuZ3RoKCk6bnVtYmVyIHsKKyAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYiEuX19vZmZzZXQodGhpcy5iYl9wb3MsIDEyKTsKKyAgcmV0dXJuIG9mZnNldCA/IHRoaXMuYmIhLl9fdmVjdG9yX2xlbih0aGlzLmJiX3BvcyArIG9mZnNldCkgOiAwOworfQorCitzdGF0aWMgZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCk6c3RyaW5nIHsKKyAgcmV0dXJuICdyZWZsZWN0aW9uX0VudW1WYWwnOworfQorCitzdGF0aWMgc3RhcnRFbnVtVmFsKGJ1aWxkZXI6ZmxhdGJ1ZmZlcnMuQnVpbGRlcikgeworICBidWlsZGVyLnN0YXJ0T2JqZWN0KDUpOworfQorCitzdGF0aWMgYWRkTmFtZShidWlsZGVyOmZsYXRidWZmZXJzLkJ1aWxkZXIsIG5hbWVPZmZzZXQ6ZmxhdGJ1ZmZlcnMuT2Zmc2V0KSB7CisgIGJ1aWxkZXIuYWRkRmllbGRPZmZzZXQoMCwgbmFtZU9mZnNldCwgMCk7Cit9CisKK3N0YXRpYyBhZGRWYWx1ZShidWlsZGVyOmZsYXRidWZmZXJzLkJ1aWxkZXIsIHZhbHVlOmJpZ2ludCkgeworICBidWlsZGVyLmFkZEZpZWxkSW50NjQoMSwgdmFsdWUsIEJpZ0ludCgnMCcpKTsKK30KKworc3RhdGljIGFkZFVuaW9uVHlwZShidWlsZGVyOmZsYXRidWZmZXJzLkJ1aWxkZXIsIHVuaW9uVHlwZU9mZnNldDpmbGF0YnVmZmVycy5PZmZzZXQpIHsKKyAgYnVpbGRlci5hZGRGaWVsZE9mZnNldCgzLCB1bmlvblR5cGVPZmZzZXQsIDApOworfQorCitzdGF0aWMgYWRkRG9jdW1lbnRhdGlvbihidWlsZGVyOmZsYXRidWZmZXJzLkJ1aWxkZXIsIGRvY3VtZW50YXRpb25PZmZzZXQ6ZmxhdGJ1ZmZlcnMuT2Zmc2V0KSB7CisgIGJ1aWxkZXIuYWRkRmllbGRPZmZzZXQoNCwgZG9jdW1lbnRhdGlvbk9mZnNldCwgMCk7Cit9CisKK3N0YXRpYyBjcmVhdGVEb2N1bWVudGF0aW9uVmVjdG9yKGJ1aWxkZXI6ZmxhdGJ1ZmZlcnMuQnVpbGRlciwgZGF0YTpmbGF0YnVmZmVycy5PZmZzZXRbXSk6ZmxhdGJ1ZmZlcnMuT2Zmc2V0IHsKKyAgYnVpbGRlci5zdGFydFZlY3Rvcig0LCBkYXRhLmxlbmd0aCwgNCk7CisgIGZvciAobGV0IGkgPSBkYXRhLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7CisgICAgYnVpbGRlci5hZGRPZmZzZXQoZGF0YVtpXSEpOworICB9CisgIHJldHVybiBidWlsZGVyLmVuZFZlY3RvcigpOworfQorCitzdGF0aWMgc3RhcnREb2N1bWVudGF0aW9uVmVjdG9yKGJ1aWxkZXI6ZmxhdGJ1ZmZlcnMuQnVpbGRlciwgbnVtRWxlbXM6bnVtYmVyKSB7CisgIGJ1aWxkZXIuc3RhcnRWZWN0b3IoNCwgbnVtRWxlbXMsIDQpOworfQorCitzdGF0aWMgZW5kRW51bVZhbChidWlsZGVyOmZsYXRidWZmZXJzLkJ1aWxkZXIpOmZsYXRidWZmZXJzLk9mZnNldCB7CisgIGNvbnN0IG9mZnNldCA9IGJ1aWxkZXIuZW5kT2JqZWN0KCk7CisgIGJ1aWxkZXIucmVxdWlyZWRGaWVsZChvZmZzZXQsIDQpIC8vIG5hbWUKKyAgcmV0dXJuIG9mZnNldDsKK30KKworCit1bnBhY2soKTogRW51bVZhbFQgeworICByZXR1cm4gbmV3IEVudW1WYWxUKAorICAgIHRoaXMubmFtZSgpLAorICAgIHRoaXMudmFsdWUoKSwKKyAgICAodGhpcy51bmlvblR5cGUoKSAhPT0gbnVsbCA/IHRoaXMudW5pb25UeXBlKCkhLnVucGFjaygpIDogbnVsbCksCisgICAgdGhpcy5iYiEuY3JlYXRlU2NhbGFyTGlzdCh0aGlzLmRvY3VtZW50YXRpb24uYmluZCh0aGlzKSwgdGhpcy5kb2N1bWVudGF0aW9uTGVuZ3RoKCkpCisgICk7Cit9CisKKwordW5wYWNrVG8oX286IEVudW1WYWxUKTogdm9pZCB7CisgIF9vLm5hbWUgPSB0aGlzLm5hbWUoKTsKKyAgX28udmFsdWUgPSB0aGlzLnZhbHVlKCk7CisgIF9vLnVuaW9uVHlwZSA9ICh0aGlzLnVuaW9uVHlwZSgpICE9PSBudWxsID8gdGhpcy51bmlvblR5cGUoKSEudW5wYWNrKCkgOiBudWxsKTsKKyAgX28uZG9jdW1lbnRhdGlvbiA9IHRoaXMuYmIhLmNyZWF0ZVNjYWxhckxpc3QodGhpcy5kb2N1bWVudGF0aW9uLmJpbmQodGhpcyksIHRoaXMuZG9jdW1lbnRhdGlvbkxlbmd0aCgpKTsKK30KK30KKworZXhwb3J0IGNsYXNzIEVudW1WYWxUIHsKK2NvbnN0cnVjdG9yKAorICBwdWJsaWMgbmFtZTogc3RyaW5nfFVpbnQ4QXJyYXl8bnVsbCA9IG51bGwsCisgIHB1YmxpYyB2YWx1ZTogYmlnaW50ID0gQmlnSW50KCcwJyksCisgIHB1YmxpYyB1bmlvblR5cGU6IFR5cGVUfG51bGwgPSBudWxsLAorICBwdWJsaWMgZG9jdW1lbnRhdGlvbjogKHN0cmluZylbXSA9IFtdCispe30KKworCitwYWNrKGJ1aWxkZXI6ZmxhdGJ1ZmZlcnMuQnVpbGRlcik6IGZsYXRidWZmZXJzLk9mZnNldCB7CisgIGNvbnN0IG5hbWUgPSAodGhpcy5uYW1lICE9PSBudWxsID8gYnVpbGRlci5jcmVhdGVTdHJpbmcodGhpcy5uYW1lISkgOiAwKTsKKyAgY29uc3QgdW5pb25UeXBlID0gKHRoaXMudW5pb25UeXBlICE9PSBudWxsID8gdGhpcy51bmlvblR5cGUhLnBhY2soYnVpbGRlcikgOiAwKTsKKyAgY29uc3QgZG9jdW1lbnRhdGlvbiA9IEVudW1WYWwuY3JlYXRlRG9jdW1lbnRhdGlvblZlY3RvcihidWlsZGVyLCBidWlsZGVyLmNyZWF0ZU9iamVjdE9mZnNldExpc3QodGhpcy5kb2N1bWVudGF0aW9uKSk7CisKKyAgRW51bVZhbC5zdGFydEVudW1WYWwoYnVpbGRlcik7CisgIEVudW1WYWwuYWRkTmFtZShidWlsZGVyLCBuYW1lKTsKKyAgRW51bVZhbC5hZGRWYWx1ZShidWlsZGVyLCB0aGlzLnZhbHVlKTsKKyAgRW51bVZhbC5hZGRVbmlvblR5cGUoYnVpbGRlciwgdW5pb25UeXBlKTsKKyAgRW51bVZhbC5hZGREb2N1bWVudGF0aW9uKGJ1aWxkZXIsIGRvY3VtZW50YXRpb24pOworCisgIHJldHVybiBFbnVtVmFsLmVuZEVudW1WYWwoYnVpbGRlcik7Cit9Cit9CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy90cy9yZWZsZWN0aW9uL2VudW0uanMgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy90cy9yZWZsZWN0aW9uL2VudW0uanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDkzOTMwNwotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL3RzL3JlZmxlY3Rpb24vZW51bS5qcwpAQCAtMCwwICsxLDE3NSBAQAorLy8gYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgYnkgdGhlIEZsYXRCdWZmZXJzIGNvbXBpbGVyLCBkbyBub3QgbW9kaWZ5CitpbXBvcnQgKiBhcyBmbGF0YnVmZmVycyBmcm9tICdmbGF0YnVmZmVycyc7CitpbXBvcnQgeyBFbnVtVmFsIH0gZnJvbSAnLi4vcmVmbGVjdGlvbi9lbnVtLXZhbC5qcyc7CitpbXBvcnQgeyBLZXlWYWx1ZSB9IGZyb20gJy4uL3JlZmxlY3Rpb24va2V5LXZhbHVlLmpzJzsKK2ltcG9ydCB7IFR5cGUgfSBmcm9tICcuLi9yZWZsZWN0aW9uL3R5cGUuanMnOworZXhwb3J0IGNsYXNzIEVudW0geworICAgIGNvbnN0cnVjdG9yKCkgeworICAgICAgICB0aGlzLmJiID0gbnVsbDsKKyAgICAgICAgdGhpcy5iYl9wb3MgPSAwOworICAgIH0KKyAgICBfX2luaXQoaSwgYmIpIHsKKyAgICAgICAgdGhpcy5iYl9wb3MgPSBpOworICAgICAgICB0aGlzLmJiID0gYmI7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKyAgICBzdGF0aWMgZ2V0Um9vdEFzRW51bShiYiwgb2JqKSB7CisgICAgICAgIHJldHVybiAob2JqIHx8IG5ldyBFbnVtKCkpLl9faW5pdChiYi5yZWFkSW50MzIoYmIucG9zaXRpb24oKSkgKyBiYi5wb3NpdGlvbigpLCBiYik7CisgICAgfQorICAgIHN0YXRpYyBnZXRTaXplUHJlZml4ZWRSb290QXNFbnVtKGJiLCBvYmopIHsKKyAgICAgICAgYmIuc2V0UG9zaXRpb24oYmIucG9zaXRpb24oKSArIGZsYXRidWZmZXJzLlNJWkVfUFJFRklYX0xFTkdUSCk7CisgICAgICAgIHJldHVybiAob2JqIHx8IG5ldyBFbnVtKCkpLl9faW5pdChiYi5yZWFkSW50MzIoYmIucG9zaXRpb24oKSkgKyBiYi5wb3NpdGlvbigpLCBiYik7CisgICAgfQorICAgIG5hbWUob3B0aW9uYWxFbmNvZGluZykgeworICAgICAgICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCA0KTsKKyAgICAgICAgcmV0dXJuIG9mZnNldCA/IHRoaXMuYmIuX19zdHJpbmcodGhpcy5iYl9wb3MgKyBvZmZzZXQsIG9wdGlvbmFsRW5jb2RpbmcpIDogbnVsbDsKKyAgICB9CisgICAgdmFsdWVzKGluZGV4LCBvYmopIHsKKyAgICAgICAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywgNik7CisgICAgICAgIHJldHVybiBvZmZzZXQgPyAob2JqIHx8IG5ldyBFbnVtVmFsKCkpLl9faW5pdCh0aGlzLmJiLl9faW5kaXJlY3QodGhpcy5iYi5fX3ZlY3Rvcih0aGlzLmJiX3BvcyArIG9mZnNldCkgKyBpbmRleCAqIDQpLCB0aGlzLmJiKSA6IG51bGw7CisgICAgfQorICAgIHZhbHVlc0xlbmd0aCgpIHsKKyAgICAgICAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywgNik7CisgICAgICAgIHJldHVybiBvZmZzZXQgPyB0aGlzLmJiLl9fdmVjdG9yX2xlbih0aGlzLmJiX3BvcyArIG9mZnNldCkgOiAwOworICAgIH0KKyAgICBpc1VuaW9uKCkgeworICAgICAgICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCA4KTsKKyAgICAgICAgcmV0dXJuIG9mZnNldCA/ICEhdGhpcy5iYi5yZWFkSW50OCh0aGlzLmJiX3BvcyArIG9mZnNldCkgOiBmYWxzZTsKKyAgICB9CisgICAgbXV0YXRlX2lzX3VuaW9uKHZhbHVlKSB7CisgICAgICAgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsIDgpOworICAgICAgICBpZiAob2Zmc2V0ID09PSAwKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgdGhpcy5iYi53cml0ZUludDgodGhpcy5iYl9wb3MgKyBvZmZzZXQsICt2YWx1ZSk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICB1bmRlcmx5aW5nVHlwZShvYmopIHsKKyAgICAgICAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywgMTApOworICAgICAgICByZXR1cm4gb2Zmc2V0ID8gKG9iaiB8fCBuZXcgVHlwZSgpKS5fX2luaXQodGhpcy5iYi5fX2luZGlyZWN0KHRoaXMuYmJfcG9zICsgb2Zmc2V0KSwgdGhpcy5iYikgOiBudWxsOworICAgIH0KKyAgICBhdHRyaWJ1dGVzKGluZGV4LCBvYmopIHsKKyAgICAgICAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywgMTIpOworICAgICAgICByZXR1cm4gb2Zmc2V0ID8gKG9iaiB8fCBuZXcgS2V5VmFsdWUoKSkuX19pbml0KHRoaXMuYmIuX19pbmRpcmVjdCh0aGlzLmJiLl9fdmVjdG9yKHRoaXMuYmJfcG9zICsgb2Zmc2V0KSArIGluZGV4ICogNCksIHRoaXMuYmIpIDogbnVsbDsKKyAgICB9CisgICAgYXR0cmlidXRlc0xlbmd0aCgpIHsKKyAgICAgICAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywgMTIpOworICAgICAgICByZXR1cm4gb2Zmc2V0ID8gdGhpcy5iYi5fX3ZlY3Rvcl9sZW4odGhpcy5iYl9wb3MgKyBvZmZzZXQpIDogMDsKKyAgICB9CisgICAgZG9jdW1lbnRhdGlvbihpbmRleCwgb3B0aW9uYWxFbmNvZGluZykgeworICAgICAgICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCAxNCk7CisgICAgICAgIHJldHVybiBvZmZzZXQgPyB0aGlzLmJiLl9fc3RyaW5nKHRoaXMuYmIuX192ZWN0b3IodGhpcy5iYl9wb3MgKyBvZmZzZXQpICsgaW5kZXggKiA0LCBvcHRpb25hbEVuY29kaW5nKSA6IG51bGw7CisgICAgfQorICAgIGRvY3VtZW50YXRpb25MZW5ndGgoKSB7CisgICAgICAgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsIDE0KTsKKyAgICAgICAgcmV0dXJuIG9mZnNldCA/IHRoaXMuYmIuX192ZWN0b3JfbGVuKHRoaXMuYmJfcG9zICsgb2Zmc2V0KSA6IDA7CisgICAgfQorICAgIGRlY2xhcmF0aW9uRmlsZShvcHRpb25hbEVuY29kaW5nKSB7CisgICAgICAgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsIDE2KTsKKyAgICAgICAgcmV0dXJuIG9mZnNldCA/IHRoaXMuYmIuX19zdHJpbmcodGhpcy5iYl9wb3MgKyBvZmZzZXQsIG9wdGlvbmFsRW5jb2RpbmcpIDogbnVsbDsKKyAgICB9CisgICAgc3RhdGljIGdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpIHsKKyAgICAgICAgcmV0dXJuICdyZWZsZWN0aW9uX0VudW0nOworICAgIH0KKyAgICBzdGF0aWMgc3RhcnRFbnVtKGJ1aWxkZXIpIHsKKyAgICAgICAgYnVpbGRlci5zdGFydE9iamVjdCg3KTsKKyAgICB9CisgICAgc3RhdGljIGFkZE5hbWUoYnVpbGRlciwgbmFtZU9mZnNldCkgeworICAgICAgICBidWlsZGVyLmFkZEZpZWxkT2Zmc2V0KDAsIG5hbWVPZmZzZXQsIDApOworICAgIH0KKyAgICBzdGF0aWMgYWRkVmFsdWVzKGJ1aWxkZXIsIHZhbHVlc09mZnNldCkgeworICAgICAgICBidWlsZGVyLmFkZEZpZWxkT2Zmc2V0KDEsIHZhbHVlc09mZnNldCwgMCk7CisgICAgfQorICAgIHN0YXRpYyBjcmVhdGVWYWx1ZXNWZWN0b3IoYnVpbGRlciwgZGF0YSkgeworICAgICAgICBidWlsZGVyLnN0YXJ0VmVjdG9yKDQsIGRhdGEubGVuZ3RoLCA0KTsKKyAgICAgICAgZm9yIChsZXQgaSA9IGRhdGEubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHsKKyAgICAgICAgICAgIGJ1aWxkZXIuYWRkT2Zmc2V0KGRhdGFbaV0pOworICAgICAgICB9CisgICAgICAgIHJldHVybiBidWlsZGVyLmVuZFZlY3RvcigpOworICAgIH0KKyAgICBzdGF0aWMgc3RhcnRWYWx1ZXNWZWN0b3IoYnVpbGRlciwgbnVtRWxlbXMpIHsKKyAgICAgICAgYnVpbGRlci5zdGFydFZlY3Rvcig0LCBudW1FbGVtcywgNCk7CisgICAgfQorICAgIHN0YXRpYyBhZGRJc1VuaW9uKGJ1aWxkZXIsIGlzVW5pb24pIHsKKyAgICAgICAgYnVpbGRlci5hZGRGaWVsZEludDgoMiwgK2lzVW5pb24sICtmYWxzZSk7CisgICAgfQorICAgIHN0YXRpYyBhZGRVbmRlcmx5aW5nVHlwZShidWlsZGVyLCB1bmRlcmx5aW5nVHlwZU9mZnNldCkgeworICAgICAgICBidWlsZGVyLmFkZEZpZWxkT2Zmc2V0KDMsIHVuZGVybHlpbmdUeXBlT2Zmc2V0LCAwKTsKKyAgICB9CisgICAgc3RhdGljIGFkZEF0dHJpYnV0ZXMoYnVpbGRlciwgYXR0cmlidXRlc09mZnNldCkgeworICAgICAgICBidWlsZGVyLmFkZEZpZWxkT2Zmc2V0KDQsIGF0dHJpYnV0ZXNPZmZzZXQsIDApOworICAgIH0KKyAgICBzdGF0aWMgY3JlYXRlQXR0cmlidXRlc1ZlY3RvcihidWlsZGVyLCBkYXRhKSB7CisgICAgICAgIGJ1aWxkZXIuc3RhcnRWZWN0b3IoNCwgZGF0YS5sZW5ndGgsIDQpOworICAgICAgICBmb3IgKGxldCBpID0gZGF0YS5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgeworICAgICAgICAgICAgYnVpbGRlci5hZGRPZmZzZXQoZGF0YVtpXSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGJ1aWxkZXIuZW5kVmVjdG9yKCk7CisgICAgfQorICAgIHN0YXRpYyBzdGFydEF0dHJpYnV0ZXNWZWN0b3IoYnVpbGRlciwgbnVtRWxlbXMpIHsKKyAgICAgICAgYnVpbGRlci5zdGFydFZlY3Rvcig0LCBudW1FbGVtcywgNCk7CisgICAgfQorICAgIHN0YXRpYyBhZGREb2N1bWVudGF0aW9uKGJ1aWxkZXIsIGRvY3VtZW50YXRpb25PZmZzZXQpIHsKKyAgICAgICAgYnVpbGRlci5hZGRGaWVsZE9mZnNldCg1LCBkb2N1bWVudGF0aW9uT2Zmc2V0LCAwKTsKKyAgICB9CisgICAgc3RhdGljIGNyZWF0ZURvY3VtZW50YXRpb25WZWN0b3IoYnVpbGRlciwgZGF0YSkgeworICAgICAgICBidWlsZGVyLnN0YXJ0VmVjdG9yKDQsIGRhdGEubGVuZ3RoLCA0KTsKKyAgICAgICAgZm9yIChsZXQgaSA9IGRhdGEubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHsKKyAgICAgICAgICAgIGJ1aWxkZXIuYWRkT2Zmc2V0KGRhdGFbaV0pOworICAgICAgICB9CisgICAgICAgIHJldHVybiBidWlsZGVyLmVuZFZlY3RvcigpOworICAgIH0KKyAgICBzdGF0aWMgc3RhcnREb2N1bWVudGF0aW9uVmVjdG9yKGJ1aWxkZXIsIG51bUVsZW1zKSB7CisgICAgICAgIGJ1aWxkZXIuc3RhcnRWZWN0b3IoNCwgbnVtRWxlbXMsIDQpOworICAgIH0KKyAgICBzdGF0aWMgYWRkRGVjbGFyYXRpb25GaWxlKGJ1aWxkZXIsIGRlY2xhcmF0aW9uRmlsZU9mZnNldCkgeworICAgICAgICBidWlsZGVyLmFkZEZpZWxkT2Zmc2V0KDYsIGRlY2xhcmF0aW9uRmlsZU9mZnNldCwgMCk7CisgICAgfQorICAgIHN0YXRpYyBlbmRFbnVtKGJ1aWxkZXIpIHsKKyAgICAgICAgY29uc3Qgb2Zmc2V0ID0gYnVpbGRlci5lbmRPYmplY3QoKTsKKyAgICAgICAgYnVpbGRlci5yZXF1aXJlZEZpZWxkKG9mZnNldCwgNCk7IC8vIG5hbWUKKyAgICAgICAgYnVpbGRlci5yZXF1aXJlZEZpZWxkKG9mZnNldCwgNik7IC8vIHZhbHVlcworICAgICAgICBidWlsZGVyLnJlcXVpcmVkRmllbGQob2Zmc2V0LCAxMCk7IC8vIHVuZGVybHlpbmdfdHlwZQorICAgICAgICByZXR1cm4gb2Zmc2V0OworICAgIH0KKyAgICB1bnBhY2soKSB7CisgICAgICAgIHJldHVybiBuZXcgRW51bVQodGhpcy5uYW1lKCksIHRoaXMuYmIuY3JlYXRlT2JqTGlzdCh0aGlzLnZhbHVlcy5iaW5kKHRoaXMpLCB0aGlzLnZhbHVlc0xlbmd0aCgpKSwgdGhpcy5pc1VuaW9uKCksICh0aGlzLnVuZGVybHlpbmdUeXBlKCkgIT09IG51bGwgPyB0aGlzLnVuZGVybHlpbmdUeXBlKCkudW5wYWNrKCkgOiBudWxsKSwgdGhpcy5iYi5jcmVhdGVPYmpMaXN0KHRoaXMuYXR0cmlidXRlcy5iaW5kKHRoaXMpLCB0aGlzLmF0dHJpYnV0ZXNMZW5ndGgoKSksIHRoaXMuYmIuY3JlYXRlU2NhbGFyTGlzdCh0aGlzLmRvY3VtZW50YXRpb24uYmluZCh0aGlzKSwgdGhpcy5kb2N1bWVudGF0aW9uTGVuZ3RoKCkpLCB0aGlzLmRlY2xhcmF0aW9uRmlsZSgpKTsKKyAgICB9CisgICAgdW5wYWNrVG8oX28pIHsKKyAgICAgICAgX28ubmFtZSA9IHRoaXMubmFtZSgpOworICAgICAgICBfby52YWx1ZXMgPSB0aGlzLmJiLmNyZWF0ZU9iakxpc3QodGhpcy52YWx1ZXMuYmluZCh0aGlzKSwgdGhpcy52YWx1ZXNMZW5ndGgoKSk7CisgICAgICAgIF9vLmlzVW5pb24gPSB0aGlzLmlzVW5pb24oKTsKKyAgICAgICAgX28udW5kZXJseWluZ1R5cGUgPSAodGhpcy51bmRlcmx5aW5nVHlwZSgpICE9PSBudWxsID8gdGhpcy51bmRlcmx5aW5nVHlwZSgpLnVucGFjaygpIDogbnVsbCk7CisgICAgICAgIF9vLmF0dHJpYnV0ZXMgPSB0aGlzLmJiLmNyZWF0ZU9iakxpc3QodGhpcy5hdHRyaWJ1dGVzLmJpbmQodGhpcyksIHRoaXMuYXR0cmlidXRlc0xlbmd0aCgpKTsKKyAgICAgICAgX28uZG9jdW1lbnRhdGlvbiA9IHRoaXMuYmIuY3JlYXRlU2NhbGFyTGlzdCh0aGlzLmRvY3VtZW50YXRpb24uYmluZCh0aGlzKSwgdGhpcy5kb2N1bWVudGF0aW9uTGVuZ3RoKCkpOworICAgICAgICBfby5kZWNsYXJhdGlvbkZpbGUgPSB0aGlzLmRlY2xhcmF0aW9uRmlsZSgpOworICAgIH0KK30KK2V4cG9ydCBjbGFzcyBFbnVtVCB7CisgICAgY29uc3RydWN0b3IobmFtZSA9IG51bGwsIHZhbHVlcyA9IFtdLCBpc1VuaW9uID0gZmFsc2UsIHVuZGVybHlpbmdUeXBlID0gbnVsbCwgYXR0cmlidXRlcyA9IFtdLCBkb2N1bWVudGF0aW9uID0gW10sIGRlY2xhcmF0aW9uRmlsZSA9IG51bGwpIHsKKyAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKKyAgICAgICAgdGhpcy52YWx1ZXMgPSB2YWx1ZXM7CisgICAgICAgIHRoaXMuaXNVbmlvbiA9IGlzVW5pb247CisgICAgICAgIHRoaXMudW5kZXJseWluZ1R5cGUgPSB1bmRlcmx5aW5nVHlwZTsKKyAgICAgICAgdGhpcy5hdHRyaWJ1dGVzID0gYXR0cmlidXRlczsKKyAgICAgICAgdGhpcy5kb2N1bWVudGF0aW9uID0gZG9jdW1lbnRhdGlvbjsKKyAgICAgICAgdGhpcy5kZWNsYXJhdGlvbkZpbGUgPSBkZWNsYXJhdGlvbkZpbGU7CisgICAgfQorICAgIHBhY2soYnVpbGRlcikgeworICAgICAgICBjb25zdCBuYW1lID0gKHRoaXMubmFtZSAhPT0gbnVsbCA/IGJ1aWxkZXIuY3JlYXRlU3RyaW5nKHRoaXMubmFtZSkgOiAwKTsKKyAgICAgICAgY29uc3QgdmFsdWVzID0gRW51bS5jcmVhdGVWYWx1ZXNWZWN0b3IoYnVpbGRlciwgYnVpbGRlci5jcmVhdGVPYmplY3RPZmZzZXRMaXN0KHRoaXMudmFsdWVzKSk7CisgICAgICAgIGNvbnN0IHVuZGVybHlpbmdUeXBlID0gKHRoaXMudW5kZXJseWluZ1R5cGUgIT09IG51bGwgPyB0aGlzLnVuZGVybHlpbmdUeXBlLnBhY2soYnVpbGRlcikgOiAwKTsKKyAgICAgICAgY29uc3QgYXR0cmlidXRlcyA9IEVudW0uY3JlYXRlQXR0cmlidXRlc1ZlY3RvcihidWlsZGVyLCBidWlsZGVyLmNyZWF0ZU9iamVjdE9mZnNldExpc3QodGhpcy5hdHRyaWJ1dGVzKSk7CisgICAgICAgIGNvbnN0IGRvY3VtZW50YXRpb24gPSBFbnVtLmNyZWF0ZURvY3VtZW50YXRpb25WZWN0b3IoYnVpbGRlciwgYnVpbGRlci5jcmVhdGVPYmplY3RPZmZzZXRMaXN0KHRoaXMuZG9jdW1lbnRhdGlvbikpOworICAgICAgICBjb25zdCBkZWNsYXJhdGlvbkZpbGUgPSAodGhpcy5kZWNsYXJhdGlvbkZpbGUgIT09IG51bGwgPyBidWlsZGVyLmNyZWF0ZVN0cmluZyh0aGlzLmRlY2xhcmF0aW9uRmlsZSkgOiAwKTsKKyAgICAgICAgRW51bS5zdGFydEVudW0oYnVpbGRlcik7CisgICAgICAgIEVudW0uYWRkTmFtZShidWlsZGVyLCBuYW1lKTsKKyAgICAgICAgRW51bS5hZGRWYWx1ZXMoYnVpbGRlciwgdmFsdWVzKTsKKyAgICAgICAgRW51bS5hZGRJc1VuaW9uKGJ1aWxkZXIsIHRoaXMuaXNVbmlvbik7CisgICAgICAgIEVudW0uYWRkVW5kZXJseWluZ1R5cGUoYnVpbGRlciwgdW5kZXJseWluZ1R5cGUpOworICAgICAgICBFbnVtLmFkZEF0dHJpYnV0ZXMoYnVpbGRlciwgYXR0cmlidXRlcyk7CisgICAgICAgIEVudW0uYWRkRG9jdW1lbnRhdGlvbihidWlsZGVyLCBkb2N1bWVudGF0aW9uKTsKKyAgICAgICAgRW51bS5hZGREZWNsYXJhdGlvbkZpbGUoYnVpbGRlciwgZGVjbGFyYXRpb25GaWxlKTsKKyAgICAgICAgcmV0dXJuIEVudW0uZW5kRW51bShidWlsZGVyKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy90cy9yZWZsZWN0aW9uL2VudW0udHMgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy90cy9yZWZsZWN0aW9uL2VudW0udHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2JiYTM1NAotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL3RzL3JlZmxlY3Rpb24vZW51bS50cwpAQCAtMCwwICsxLDIzNCBAQAorLy8gYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgYnkgdGhlIEZsYXRCdWZmZXJzIGNvbXBpbGVyLCBkbyBub3QgbW9kaWZ5CisKK2ltcG9ydCAqIGFzIGZsYXRidWZmZXJzIGZyb20gJ2ZsYXRidWZmZXJzJzsKKworaW1wb3J0IHsgRW51bVZhbCwgRW51bVZhbFQgfSBmcm9tICcuLi9yZWZsZWN0aW9uL2VudW0tdmFsLmpzJzsKK2ltcG9ydCB7IEtleVZhbHVlLCBLZXlWYWx1ZVQgfSBmcm9tICcuLi9yZWZsZWN0aW9uL2tleS12YWx1ZS5qcyc7CitpbXBvcnQgeyBUeXBlLCBUeXBlVCB9IGZyb20gJy4uL3JlZmxlY3Rpb24vdHlwZS5qcyc7CisKKworZXhwb3J0IGNsYXNzIEVudW0geworICBiYjogZmxhdGJ1ZmZlcnMuQnl0ZUJ1ZmZlcnxudWxsID0gbnVsbDsKKyAgYmJfcG9zID0gMDsKKyAgX19pbml0KGk6bnVtYmVyLCBiYjpmbGF0YnVmZmVycy5CeXRlQnVmZmVyKTpFbnVtIHsKKyAgdGhpcy5iYl9wb3MgPSBpOworICB0aGlzLmJiID0gYmI7CisgIHJldHVybiB0aGlzOworfQorCitzdGF0aWMgZ2V0Um9vdEFzRW51bShiYjpmbGF0YnVmZmVycy5CeXRlQnVmZmVyLCBvYmo/OkVudW0pOkVudW0geworICByZXR1cm4gKG9iaiB8fCBuZXcgRW51bSgpKS5fX2luaXQoYmIucmVhZEludDMyKGJiLnBvc2l0aW9uKCkpICsgYmIucG9zaXRpb24oKSwgYmIpOworfQorCitzdGF0aWMgZ2V0U2l6ZVByZWZpeGVkUm9vdEFzRW51bShiYjpmbGF0YnVmZmVycy5CeXRlQnVmZmVyLCBvYmo/OkVudW0pOkVudW0geworICBiYi5zZXRQb3NpdGlvbihiYi5wb3NpdGlvbigpICsgZmxhdGJ1ZmZlcnMuU0laRV9QUkVGSVhfTEVOR1RIKTsKKyAgcmV0dXJuIChvYmogfHwgbmV3IEVudW0oKSkuX19pbml0KGJiLnJlYWRJbnQzMihiYi5wb3NpdGlvbigpKSArIGJiLnBvc2l0aW9uKCksIGJiKTsKK30KKworbmFtZSgpOnN0cmluZ3xudWxsCituYW1lKG9wdGlvbmFsRW5jb2Rpbmc6ZmxhdGJ1ZmZlcnMuRW5jb2RpbmcpOnN0cmluZ3xVaW50OEFycmF5fG51bGwKK25hbWUob3B0aW9uYWxFbmNvZGluZz86YW55KTpzdHJpbmd8VWludDhBcnJheXxudWxsIHsKKyAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYiEuX19vZmZzZXQodGhpcy5iYl9wb3MsIDQpOworICByZXR1cm4gb2Zmc2V0ID8gdGhpcy5iYiEuX19zdHJpbmcodGhpcy5iYl9wb3MgKyBvZmZzZXQsIG9wdGlvbmFsRW5jb2RpbmcpIDogbnVsbDsKK30KKwordmFsdWVzKGluZGV4OiBudW1iZXIsIG9iaj86RW51bVZhbCk6RW51bVZhbHxudWxsIHsKKyAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYiEuX19vZmZzZXQodGhpcy5iYl9wb3MsIDYpOworICByZXR1cm4gb2Zmc2V0ID8gKG9iaiB8fCBuZXcgRW51bVZhbCgpKS5fX2luaXQodGhpcy5iYiEuX19pbmRpcmVjdCh0aGlzLmJiIS5fX3ZlY3Rvcih0aGlzLmJiX3BvcyArIG9mZnNldCkgKyBpbmRleCAqIDQpLCB0aGlzLmJiISkgOiBudWxsOworfQorCit2YWx1ZXNMZW5ndGgoKTpudW1iZXIgeworICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiIS5fX29mZnNldCh0aGlzLmJiX3BvcywgNik7CisgIHJldHVybiBvZmZzZXQgPyB0aGlzLmJiIS5fX3ZlY3Rvcl9sZW4odGhpcy5iYl9wb3MgKyBvZmZzZXQpIDogMDsKK30KKworaXNVbmlvbigpOmJvb2xlYW4geworICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiIS5fX29mZnNldCh0aGlzLmJiX3BvcywgOCk7CisgIHJldHVybiBvZmZzZXQgPyAhIXRoaXMuYmIhLnJlYWRJbnQ4KHRoaXMuYmJfcG9zICsgb2Zmc2V0KSA6IGZhbHNlOworfQorCittdXRhdGVfaXNfdW5pb24odmFsdWU6Ym9vbGVhbik6Ym9vbGVhbiB7CisgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIhLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCA4KTsKKworICBpZiAob2Zmc2V0ID09PSAwKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgdGhpcy5iYiEud3JpdGVJbnQ4KHRoaXMuYmJfcG9zICsgb2Zmc2V0LCArdmFsdWUpOworICByZXR1cm4gdHJ1ZTsKK30KKwordW5kZXJseWluZ1R5cGUob2JqPzpUeXBlKTpUeXBlfG51bGwgeworICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiIS5fX29mZnNldCh0aGlzLmJiX3BvcywgMTApOworICByZXR1cm4gb2Zmc2V0ID8gKG9iaiB8fCBuZXcgVHlwZSgpKS5fX2luaXQodGhpcy5iYiEuX19pbmRpcmVjdCh0aGlzLmJiX3BvcyArIG9mZnNldCksIHRoaXMuYmIhKSA6IG51bGw7Cit9CisKK2F0dHJpYnV0ZXMoaW5kZXg6IG51bWJlciwgb2JqPzpLZXlWYWx1ZSk6S2V5VmFsdWV8bnVsbCB7CisgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIhLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCAxMik7CisgIHJldHVybiBvZmZzZXQgPyAob2JqIHx8IG5ldyBLZXlWYWx1ZSgpKS5fX2luaXQodGhpcy5iYiEuX19pbmRpcmVjdCh0aGlzLmJiIS5fX3ZlY3Rvcih0aGlzLmJiX3BvcyArIG9mZnNldCkgKyBpbmRleCAqIDQpLCB0aGlzLmJiISkgOiBudWxsOworfQorCithdHRyaWJ1dGVzTGVuZ3RoKCk6bnVtYmVyIHsKKyAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYiEuX19vZmZzZXQodGhpcy5iYl9wb3MsIDEyKTsKKyAgcmV0dXJuIG9mZnNldCA/IHRoaXMuYmIhLl9fdmVjdG9yX2xlbih0aGlzLmJiX3BvcyArIG9mZnNldCkgOiAwOworfQorCitkb2N1bWVudGF0aW9uKGluZGV4OiBudW1iZXIpOnN0cmluZworZG9jdW1lbnRhdGlvbihpbmRleDogbnVtYmVyLG9wdGlvbmFsRW5jb2Rpbmc6ZmxhdGJ1ZmZlcnMuRW5jb2RpbmcpOnN0cmluZ3xVaW50OEFycmF5Citkb2N1bWVudGF0aW9uKGluZGV4OiBudW1iZXIsb3B0aW9uYWxFbmNvZGluZz86YW55KTpzdHJpbmd8VWludDhBcnJheXxudWxsIHsKKyAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYiEuX19vZmZzZXQodGhpcy5iYl9wb3MsIDE0KTsKKyAgcmV0dXJuIG9mZnNldCA/IHRoaXMuYmIhLl9fc3RyaW5nKHRoaXMuYmIhLl9fdmVjdG9yKHRoaXMuYmJfcG9zICsgb2Zmc2V0KSArIGluZGV4ICogNCwgb3B0aW9uYWxFbmNvZGluZykgOiBudWxsOworfQorCitkb2N1bWVudGF0aW9uTGVuZ3RoKCk6bnVtYmVyIHsKKyAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYiEuX19vZmZzZXQodGhpcy5iYl9wb3MsIDE0KTsKKyAgcmV0dXJuIG9mZnNldCA/IHRoaXMuYmIhLl9fdmVjdG9yX2xlbih0aGlzLmJiX3BvcyArIG9mZnNldCkgOiAwOworfQorCisvKioKKyAqIEZpbGUgdGhhdCB0aGlzIEVudW0gaXMgZGVjbGFyZWQgaW4uCisgKi8KK2RlY2xhcmF0aW9uRmlsZSgpOnN0cmluZ3xudWxsCitkZWNsYXJhdGlvbkZpbGUob3B0aW9uYWxFbmNvZGluZzpmbGF0YnVmZmVycy5FbmNvZGluZyk6c3RyaW5nfFVpbnQ4QXJyYXl8bnVsbAorZGVjbGFyYXRpb25GaWxlKG9wdGlvbmFsRW5jb2Rpbmc/OmFueSk6c3RyaW5nfFVpbnQ4QXJyYXl8bnVsbCB7CisgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIhLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCAxNik7CisgIHJldHVybiBvZmZzZXQgPyB0aGlzLmJiIS5fX3N0cmluZyh0aGlzLmJiX3BvcyArIG9mZnNldCwgb3B0aW9uYWxFbmNvZGluZykgOiBudWxsOworfQorCitzdGF0aWMgZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCk6c3RyaW5nIHsKKyAgcmV0dXJuICdyZWZsZWN0aW9uX0VudW0nOworfQorCitzdGF0aWMgc3RhcnRFbnVtKGJ1aWxkZXI6ZmxhdGJ1ZmZlcnMuQnVpbGRlcikgeworICBidWlsZGVyLnN0YXJ0T2JqZWN0KDcpOworfQorCitzdGF0aWMgYWRkTmFtZShidWlsZGVyOmZsYXRidWZmZXJzLkJ1aWxkZXIsIG5hbWVPZmZzZXQ6ZmxhdGJ1ZmZlcnMuT2Zmc2V0KSB7CisgIGJ1aWxkZXIuYWRkRmllbGRPZmZzZXQoMCwgbmFtZU9mZnNldCwgMCk7Cit9CisKK3N0YXRpYyBhZGRWYWx1ZXMoYnVpbGRlcjpmbGF0YnVmZmVycy5CdWlsZGVyLCB2YWx1ZXNPZmZzZXQ6ZmxhdGJ1ZmZlcnMuT2Zmc2V0KSB7CisgIGJ1aWxkZXIuYWRkRmllbGRPZmZzZXQoMSwgdmFsdWVzT2Zmc2V0LCAwKTsKK30KKworc3RhdGljIGNyZWF0ZVZhbHVlc1ZlY3RvcihidWlsZGVyOmZsYXRidWZmZXJzLkJ1aWxkZXIsIGRhdGE6ZmxhdGJ1ZmZlcnMuT2Zmc2V0W10pOmZsYXRidWZmZXJzLk9mZnNldCB7CisgIGJ1aWxkZXIuc3RhcnRWZWN0b3IoNCwgZGF0YS5sZW5ndGgsIDQpOworICBmb3IgKGxldCBpID0gZGF0YS5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgeworICAgIGJ1aWxkZXIuYWRkT2Zmc2V0KGRhdGFbaV0hKTsKKyAgfQorICByZXR1cm4gYnVpbGRlci5lbmRWZWN0b3IoKTsKK30KKworc3RhdGljIHN0YXJ0VmFsdWVzVmVjdG9yKGJ1aWxkZXI6ZmxhdGJ1ZmZlcnMuQnVpbGRlciwgbnVtRWxlbXM6bnVtYmVyKSB7CisgIGJ1aWxkZXIuc3RhcnRWZWN0b3IoNCwgbnVtRWxlbXMsIDQpOworfQorCitzdGF0aWMgYWRkSXNVbmlvbihidWlsZGVyOmZsYXRidWZmZXJzLkJ1aWxkZXIsIGlzVW5pb246Ym9vbGVhbikgeworICBidWlsZGVyLmFkZEZpZWxkSW50OCgyLCAraXNVbmlvbiwgK2ZhbHNlKTsKK30KKworc3RhdGljIGFkZFVuZGVybHlpbmdUeXBlKGJ1aWxkZXI6ZmxhdGJ1ZmZlcnMuQnVpbGRlciwgdW5kZXJseWluZ1R5cGVPZmZzZXQ6ZmxhdGJ1ZmZlcnMuT2Zmc2V0KSB7CisgIGJ1aWxkZXIuYWRkRmllbGRPZmZzZXQoMywgdW5kZXJseWluZ1R5cGVPZmZzZXQsIDApOworfQorCitzdGF0aWMgYWRkQXR0cmlidXRlcyhidWlsZGVyOmZsYXRidWZmZXJzLkJ1aWxkZXIsIGF0dHJpYnV0ZXNPZmZzZXQ6ZmxhdGJ1ZmZlcnMuT2Zmc2V0KSB7CisgIGJ1aWxkZXIuYWRkRmllbGRPZmZzZXQoNCwgYXR0cmlidXRlc09mZnNldCwgMCk7Cit9CisKK3N0YXRpYyBjcmVhdGVBdHRyaWJ1dGVzVmVjdG9yKGJ1aWxkZXI6ZmxhdGJ1ZmZlcnMuQnVpbGRlciwgZGF0YTpmbGF0YnVmZmVycy5PZmZzZXRbXSk6ZmxhdGJ1ZmZlcnMuT2Zmc2V0IHsKKyAgYnVpbGRlci5zdGFydFZlY3Rvcig0LCBkYXRhLmxlbmd0aCwgNCk7CisgIGZvciAobGV0IGkgPSBkYXRhLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7CisgICAgYnVpbGRlci5hZGRPZmZzZXQoZGF0YVtpXSEpOworICB9CisgIHJldHVybiBidWlsZGVyLmVuZFZlY3RvcigpOworfQorCitzdGF0aWMgc3RhcnRBdHRyaWJ1dGVzVmVjdG9yKGJ1aWxkZXI6ZmxhdGJ1ZmZlcnMuQnVpbGRlciwgbnVtRWxlbXM6bnVtYmVyKSB7CisgIGJ1aWxkZXIuc3RhcnRWZWN0b3IoNCwgbnVtRWxlbXMsIDQpOworfQorCitzdGF0aWMgYWRkRG9jdW1lbnRhdGlvbihidWlsZGVyOmZsYXRidWZmZXJzLkJ1aWxkZXIsIGRvY3VtZW50YXRpb25PZmZzZXQ6ZmxhdGJ1ZmZlcnMuT2Zmc2V0KSB7CisgIGJ1aWxkZXIuYWRkRmllbGRPZmZzZXQoNSwgZG9jdW1lbnRhdGlvbk9mZnNldCwgMCk7Cit9CisKK3N0YXRpYyBjcmVhdGVEb2N1bWVudGF0aW9uVmVjdG9yKGJ1aWxkZXI6ZmxhdGJ1ZmZlcnMuQnVpbGRlciwgZGF0YTpmbGF0YnVmZmVycy5PZmZzZXRbXSk6ZmxhdGJ1ZmZlcnMuT2Zmc2V0IHsKKyAgYnVpbGRlci5zdGFydFZlY3Rvcig0LCBkYXRhLmxlbmd0aCwgNCk7CisgIGZvciAobGV0IGkgPSBkYXRhLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7CisgICAgYnVpbGRlci5hZGRPZmZzZXQoZGF0YVtpXSEpOworICB9CisgIHJldHVybiBidWlsZGVyLmVuZFZlY3RvcigpOworfQorCitzdGF0aWMgc3RhcnREb2N1bWVudGF0aW9uVmVjdG9yKGJ1aWxkZXI6ZmxhdGJ1ZmZlcnMuQnVpbGRlciwgbnVtRWxlbXM6bnVtYmVyKSB7CisgIGJ1aWxkZXIuc3RhcnRWZWN0b3IoNCwgbnVtRWxlbXMsIDQpOworfQorCitzdGF0aWMgYWRkRGVjbGFyYXRpb25GaWxlKGJ1aWxkZXI6ZmxhdGJ1ZmZlcnMuQnVpbGRlciwgZGVjbGFyYXRpb25GaWxlT2Zmc2V0OmZsYXRidWZmZXJzLk9mZnNldCkgeworICBidWlsZGVyLmFkZEZpZWxkT2Zmc2V0KDYsIGRlY2xhcmF0aW9uRmlsZU9mZnNldCwgMCk7Cit9CisKK3N0YXRpYyBlbmRFbnVtKGJ1aWxkZXI6ZmxhdGJ1ZmZlcnMuQnVpbGRlcik6ZmxhdGJ1ZmZlcnMuT2Zmc2V0IHsKKyAgY29uc3Qgb2Zmc2V0ID0gYnVpbGRlci5lbmRPYmplY3QoKTsKKyAgYnVpbGRlci5yZXF1aXJlZEZpZWxkKG9mZnNldCwgNCkgLy8gbmFtZQorICBidWlsZGVyLnJlcXVpcmVkRmllbGQob2Zmc2V0LCA2KSAvLyB2YWx1ZXMKKyAgYnVpbGRlci5yZXF1aXJlZEZpZWxkKG9mZnNldCwgMTApIC8vIHVuZGVybHlpbmdfdHlwZQorICByZXR1cm4gb2Zmc2V0OworfQorCisKK3VucGFjaygpOiBFbnVtVCB7CisgIHJldHVybiBuZXcgRW51bVQoCisgICAgdGhpcy5uYW1lKCksCisgICAgdGhpcy5iYiEuY3JlYXRlT2JqTGlzdCh0aGlzLnZhbHVlcy5iaW5kKHRoaXMpLCB0aGlzLnZhbHVlc0xlbmd0aCgpKSwKKyAgICB0aGlzLmlzVW5pb24oKSwKKyAgICAodGhpcy51bmRlcmx5aW5nVHlwZSgpICE9PSBudWxsID8gdGhpcy51bmRlcmx5aW5nVHlwZSgpIS51bnBhY2soKSA6IG51bGwpLAorICAgIHRoaXMuYmIhLmNyZWF0ZU9iakxpc3QodGhpcy5hdHRyaWJ1dGVzLmJpbmQodGhpcyksIHRoaXMuYXR0cmlidXRlc0xlbmd0aCgpKSwKKyAgICB0aGlzLmJiIS5jcmVhdGVTY2FsYXJMaXN0KHRoaXMuZG9jdW1lbnRhdGlvbi5iaW5kKHRoaXMpLCB0aGlzLmRvY3VtZW50YXRpb25MZW5ndGgoKSksCisgICAgdGhpcy5kZWNsYXJhdGlvbkZpbGUoKQorICApOworfQorCisKK3VucGFja1RvKF9vOiBFbnVtVCk6IHZvaWQgeworICBfby5uYW1lID0gdGhpcy5uYW1lKCk7CisgIF9vLnZhbHVlcyA9IHRoaXMuYmIhLmNyZWF0ZU9iakxpc3QodGhpcy52YWx1ZXMuYmluZCh0aGlzKSwgdGhpcy52YWx1ZXNMZW5ndGgoKSk7CisgIF9vLmlzVW5pb24gPSB0aGlzLmlzVW5pb24oKTsKKyAgX28udW5kZXJseWluZ1R5cGUgPSAodGhpcy51bmRlcmx5aW5nVHlwZSgpICE9PSBudWxsID8gdGhpcy51bmRlcmx5aW5nVHlwZSgpIS51bnBhY2soKSA6IG51bGwpOworICBfby5hdHRyaWJ1dGVzID0gdGhpcy5iYiEuY3JlYXRlT2JqTGlzdCh0aGlzLmF0dHJpYnV0ZXMuYmluZCh0aGlzKSwgdGhpcy5hdHRyaWJ1dGVzTGVuZ3RoKCkpOworICBfby5kb2N1bWVudGF0aW9uID0gdGhpcy5iYiEuY3JlYXRlU2NhbGFyTGlzdCh0aGlzLmRvY3VtZW50YXRpb24uYmluZCh0aGlzKSwgdGhpcy5kb2N1bWVudGF0aW9uTGVuZ3RoKCkpOworICBfby5kZWNsYXJhdGlvbkZpbGUgPSB0aGlzLmRlY2xhcmF0aW9uRmlsZSgpOworfQorfQorCitleHBvcnQgY2xhc3MgRW51bVQgeworY29uc3RydWN0b3IoCisgIHB1YmxpYyBuYW1lOiBzdHJpbmd8VWludDhBcnJheXxudWxsID0gbnVsbCwKKyAgcHVibGljIHZhbHVlczogKEVudW1WYWxUKVtdID0gW10sCisgIHB1YmxpYyBpc1VuaW9uOiBib29sZWFuID0gZmFsc2UsCisgIHB1YmxpYyB1bmRlcmx5aW5nVHlwZTogVHlwZVR8bnVsbCA9IG51bGwsCisgIHB1YmxpYyBhdHRyaWJ1dGVzOiAoS2V5VmFsdWVUKVtdID0gW10sCisgIHB1YmxpYyBkb2N1bWVudGF0aW9uOiAoc3RyaW5nKVtdID0gW10sCisgIHB1YmxpYyBkZWNsYXJhdGlvbkZpbGU6IHN0cmluZ3xVaW50OEFycmF5fG51bGwgPSBudWxsCispe30KKworCitwYWNrKGJ1aWxkZXI6ZmxhdGJ1ZmZlcnMuQnVpbGRlcik6IGZsYXRidWZmZXJzLk9mZnNldCB7CisgIGNvbnN0IG5hbWUgPSAodGhpcy5uYW1lICE9PSBudWxsID8gYnVpbGRlci5jcmVhdGVTdHJpbmcodGhpcy5uYW1lISkgOiAwKTsKKyAgY29uc3QgdmFsdWVzID0gRW51bS5jcmVhdGVWYWx1ZXNWZWN0b3IoYnVpbGRlciwgYnVpbGRlci5jcmVhdGVPYmplY3RPZmZzZXRMaXN0KHRoaXMudmFsdWVzKSk7CisgIGNvbnN0IHVuZGVybHlpbmdUeXBlID0gKHRoaXMudW5kZXJseWluZ1R5cGUgIT09IG51bGwgPyB0aGlzLnVuZGVybHlpbmdUeXBlIS5wYWNrKGJ1aWxkZXIpIDogMCk7CisgIGNvbnN0IGF0dHJpYnV0ZXMgPSBFbnVtLmNyZWF0ZUF0dHJpYnV0ZXNWZWN0b3IoYnVpbGRlciwgYnVpbGRlci5jcmVhdGVPYmplY3RPZmZzZXRMaXN0KHRoaXMuYXR0cmlidXRlcykpOworICBjb25zdCBkb2N1bWVudGF0aW9uID0gRW51bS5jcmVhdGVEb2N1bWVudGF0aW9uVmVjdG9yKGJ1aWxkZXIsIGJ1aWxkZXIuY3JlYXRlT2JqZWN0T2Zmc2V0TGlzdCh0aGlzLmRvY3VtZW50YXRpb24pKTsKKyAgY29uc3QgZGVjbGFyYXRpb25GaWxlID0gKHRoaXMuZGVjbGFyYXRpb25GaWxlICE9PSBudWxsID8gYnVpbGRlci5jcmVhdGVTdHJpbmcodGhpcy5kZWNsYXJhdGlvbkZpbGUhKSA6IDApOworCisgIEVudW0uc3RhcnRFbnVtKGJ1aWxkZXIpOworICBFbnVtLmFkZE5hbWUoYnVpbGRlciwgbmFtZSk7CisgIEVudW0uYWRkVmFsdWVzKGJ1aWxkZXIsIHZhbHVlcyk7CisgIEVudW0uYWRkSXNVbmlvbihidWlsZGVyLCB0aGlzLmlzVW5pb24pOworICBFbnVtLmFkZFVuZGVybHlpbmdUeXBlKGJ1aWxkZXIsIHVuZGVybHlpbmdUeXBlKTsKKyAgRW51bS5hZGRBdHRyaWJ1dGVzKGJ1aWxkZXIsIGF0dHJpYnV0ZXMpOworICBFbnVtLmFkZERvY3VtZW50YXRpb24oYnVpbGRlciwgZG9jdW1lbnRhdGlvbik7CisgIEVudW0uYWRkRGVjbGFyYXRpb25GaWxlKGJ1aWxkZXIsIGRlY2xhcmF0aW9uRmlsZSk7CisKKyAgcmV0dXJuIEVudW0uZW5kRW51bShidWlsZGVyKTsKK30KK30KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL3RzL3JlZmxlY3Rpb24vZmllbGQuanMgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy90cy9yZWZsZWN0aW9uL2ZpZWxkLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEwN2I3N2IKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy90cy9yZWZsZWN0aW9uL2ZpZWxkLmpzCkBAIC0wLDAgKzEsMjg0IEBACisvLyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBieSB0aGUgRmxhdEJ1ZmZlcnMgY29tcGlsZXIsIGRvIG5vdCBtb2RpZnkKK2ltcG9ydCAqIGFzIGZsYXRidWZmZXJzIGZyb20gJ2ZsYXRidWZmZXJzJzsKK2ltcG9ydCB7IEtleVZhbHVlIH0gZnJvbSAnLi4vcmVmbGVjdGlvbi9rZXktdmFsdWUuanMnOworaW1wb3J0IHsgVHlwZSB9IGZyb20gJy4uL3JlZmxlY3Rpb24vdHlwZS5qcyc7CitleHBvcnQgY2xhc3MgRmllbGQgeworICAgIGNvbnN0cnVjdG9yKCkgeworICAgICAgICB0aGlzLmJiID0gbnVsbDsKKyAgICAgICAgdGhpcy5iYl9wb3MgPSAwOworICAgIH0KKyAgICBfX2luaXQoaSwgYmIpIHsKKyAgICAgICAgdGhpcy5iYl9wb3MgPSBpOworICAgICAgICB0aGlzLmJiID0gYmI7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKyAgICBzdGF0aWMgZ2V0Um9vdEFzRmllbGQoYmIsIG9iaikgeworICAgICAgICByZXR1cm4gKG9iaiB8fCBuZXcgRmllbGQoKSkuX19pbml0KGJiLnJlYWRJbnQzMihiYi5wb3NpdGlvbigpKSArIGJiLnBvc2l0aW9uKCksIGJiKTsKKyAgICB9CisgICAgc3RhdGljIGdldFNpemVQcmVmaXhlZFJvb3RBc0ZpZWxkKGJiLCBvYmopIHsKKyAgICAgICAgYmIuc2V0UG9zaXRpb24oYmIucG9zaXRpb24oKSArIGZsYXRidWZmZXJzLlNJWkVfUFJFRklYX0xFTkdUSCk7CisgICAgICAgIHJldHVybiAob2JqIHx8IG5ldyBGaWVsZCgpKS5fX2luaXQoYmIucmVhZEludDMyKGJiLnBvc2l0aW9uKCkpICsgYmIucG9zaXRpb24oKSwgYmIpOworICAgIH0KKyAgICBuYW1lKG9wdGlvbmFsRW5jb2RpbmcpIHsKKyAgICAgICAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywgNCk7CisgICAgICAgIHJldHVybiBvZmZzZXQgPyB0aGlzLmJiLl9fc3RyaW5nKHRoaXMuYmJfcG9zICsgb2Zmc2V0LCBvcHRpb25hbEVuY29kaW5nKSA6IG51bGw7CisgICAgfQorICAgIHR5cGUob2JqKSB7CisgICAgICAgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsIDYpOworICAgICAgICByZXR1cm4gb2Zmc2V0ID8gKG9iaiB8fCBuZXcgVHlwZSgpKS5fX2luaXQodGhpcy5iYi5fX2luZGlyZWN0KHRoaXMuYmJfcG9zICsgb2Zmc2V0KSwgdGhpcy5iYikgOiBudWxsOworICAgIH0KKyAgICBpZCgpIHsKKyAgICAgICAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywgOCk7CisgICAgICAgIHJldHVybiBvZmZzZXQgPyB0aGlzLmJiLnJlYWRVaW50MTYodGhpcy5iYl9wb3MgKyBvZmZzZXQpIDogMDsKKyAgICB9CisgICAgbXV0YXRlX2lkKHZhbHVlKSB7CisgICAgICAgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsIDgpOworICAgICAgICBpZiAob2Zmc2V0ID09PSAwKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgdGhpcy5iYi53cml0ZVVpbnQxNih0aGlzLmJiX3BvcyArIG9mZnNldCwgdmFsdWUpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgb2Zmc2V0KCkgeworICAgICAgICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCAxMCk7CisgICAgICAgIHJldHVybiBvZmZzZXQgPyB0aGlzLmJiLnJlYWRVaW50MTYodGhpcy5iYl9wb3MgKyBvZmZzZXQpIDogMDsKKyAgICB9CisgICAgbXV0YXRlX29mZnNldCh2YWx1ZSkgeworICAgICAgICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCAxMCk7CisgICAgICAgIGlmIChvZmZzZXQgPT09IDApIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICB0aGlzLmJiLndyaXRlVWludDE2KHRoaXMuYmJfcG9zICsgb2Zmc2V0LCB2YWx1ZSk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICBkZWZhdWx0SW50ZWdlcigpIHsKKyAgICAgICAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywgMTIpOworICAgICAgICByZXR1cm4gb2Zmc2V0ID8gdGhpcy5iYi5yZWFkSW50NjQodGhpcy5iYl9wb3MgKyBvZmZzZXQpIDogQmlnSW50KCcwJyk7CisgICAgfQorICAgIG11dGF0ZV9kZWZhdWx0X2ludGVnZXIodmFsdWUpIHsKKyAgICAgICAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywgMTIpOworICAgICAgICBpZiAob2Zmc2V0ID09PSAwKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgdGhpcy5iYi53cml0ZUludDY0KHRoaXMuYmJfcG9zICsgb2Zmc2V0LCB2YWx1ZSk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICBkZWZhdWx0UmVhbCgpIHsKKyAgICAgICAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywgMTQpOworICAgICAgICByZXR1cm4gb2Zmc2V0ID8gdGhpcy5iYi5yZWFkRmxvYXQ2NCh0aGlzLmJiX3BvcyArIG9mZnNldCkgOiAwLjA7CisgICAgfQorICAgIG11dGF0ZV9kZWZhdWx0X3JlYWwodmFsdWUpIHsKKyAgICAgICAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywgMTQpOworICAgICAgICBpZiAob2Zmc2V0ID09PSAwKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgdGhpcy5iYi53cml0ZUZsb2F0NjQodGhpcy5iYl9wb3MgKyBvZmZzZXQsIHZhbHVlKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIGRlcHJlY2F0ZWQoKSB7CisgICAgICAgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsIDE2KTsKKyAgICAgICAgcmV0dXJuIG9mZnNldCA/ICEhdGhpcy5iYi5yZWFkSW50OCh0aGlzLmJiX3BvcyArIG9mZnNldCkgOiBmYWxzZTsKKyAgICB9CisgICAgbXV0YXRlX2RlcHJlY2F0ZWQodmFsdWUpIHsKKyAgICAgICAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywgMTYpOworICAgICAgICBpZiAob2Zmc2V0ID09PSAwKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgdGhpcy5iYi53cml0ZUludDgodGhpcy5iYl9wb3MgKyBvZmZzZXQsICt2YWx1ZSk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICByZXF1aXJlZCgpIHsKKyAgICAgICAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywgMTgpOworICAgICAgICByZXR1cm4gb2Zmc2V0ID8gISF0aGlzLmJiLnJlYWRJbnQ4KHRoaXMuYmJfcG9zICsgb2Zmc2V0KSA6IGZhbHNlOworICAgIH0KKyAgICBtdXRhdGVfcmVxdWlyZWQodmFsdWUpIHsKKyAgICAgICAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywgMTgpOworICAgICAgICBpZiAob2Zmc2V0ID09PSAwKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgdGhpcy5iYi53cml0ZUludDgodGhpcy5iYl9wb3MgKyBvZmZzZXQsICt2YWx1ZSk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICBrZXkoKSB7CisgICAgICAgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsIDIwKTsKKyAgICAgICAgcmV0dXJuIG9mZnNldCA/ICEhdGhpcy5iYi5yZWFkSW50OCh0aGlzLmJiX3BvcyArIG9mZnNldCkgOiBmYWxzZTsKKyAgICB9CisgICAgbXV0YXRlX2tleSh2YWx1ZSkgeworICAgICAgICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCAyMCk7CisgICAgICAgIGlmIChvZmZzZXQgPT09IDApIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICB0aGlzLmJiLndyaXRlSW50OCh0aGlzLmJiX3BvcyArIG9mZnNldCwgK3ZhbHVlKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIGF0dHJpYnV0ZXMoaW5kZXgsIG9iaikgeworICAgICAgICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCAyMik7CisgICAgICAgIHJldHVybiBvZmZzZXQgPyAob2JqIHx8IG5ldyBLZXlWYWx1ZSgpKS5fX2luaXQodGhpcy5iYi5fX2luZGlyZWN0KHRoaXMuYmIuX192ZWN0b3IodGhpcy5iYl9wb3MgKyBvZmZzZXQpICsgaW5kZXggKiA0KSwgdGhpcy5iYikgOiBudWxsOworICAgIH0KKyAgICBhdHRyaWJ1dGVzTGVuZ3RoKCkgeworICAgICAgICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCAyMik7CisgICAgICAgIHJldHVybiBvZmZzZXQgPyB0aGlzLmJiLl9fdmVjdG9yX2xlbih0aGlzLmJiX3BvcyArIG9mZnNldCkgOiAwOworICAgIH0KKyAgICBkb2N1bWVudGF0aW9uKGluZGV4LCBvcHRpb25hbEVuY29kaW5nKSB7CisgICAgICAgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsIDI0KTsKKyAgICAgICAgcmV0dXJuIG9mZnNldCA/IHRoaXMuYmIuX19zdHJpbmcodGhpcy5iYi5fX3ZlY3Rvcih0aGlzLmJiX3BvcyArIG9mZnNldCkgKyBpbmRleCAqIDQsIG9wdGlvbmFsRW5jb2RpbmcpIDogbnVsbDsKKyAgICB9CisgICAgZG9jdW1lbnRhdGlvbkxlbmd0aCgpIHsKKyAgICAgICAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywgMjQpOworICAgICAgICByZXR1cm4gb2Zmc2V0ID8gdGhpcy5iYi5fX3ZlY3Rvcl9sZW4odGhpcy5iYl9wb3MgKyBvZmZzZXQpIDogMDsKKyAgICB9CisgICAgb3B0aW9uYWwoKSB7CisgICAgICAgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsIDI2KTsKKyAgICAgICAgcmV0dXJuIG9mZnNldCA/ICEhdGhpcy5iYi5yZWFkSW50OCh0aGlzLmJiX3BvcyArIG9mZnNldCkgOiBmYWxzZTsKKyAgICB9CisgICAgbXV0YXRlX29wdGlvbmFsKHZhbHVlKSB7CisgICAgICAgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsIDI2KTsKKyAgICAgICAgaWYgKG9mZnNldCA9PT0gMCkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIHRoaXMuYmIud3JpdGVJbnQ4KHRoaXMuYmJfcG9zICsgb2Zmc2V0LCArdmFsdWUpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgLyoqCisgICAgICogTnVtYmVyIG9mIHBhZGRpbmcgb2N0ZXRzIHRvIGFsd2F5cyBhZGQgYWZ0ZXIgdGhpcyBmaWVsZC4gU3RydWN0cyBvbmx5LgorICAgICAqLworICAgIHBhZGRpbmcoKSB7CisgICAgICAgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsIDI4KTsKKyAgICAgICAgcmV0dXJuIG9mZnNldCA/IHRoaXMuYmIucmVhZFVpbnQxNih0aGlzLmJiX3BvcyArIG9mZnNldCkgOiAwOworICAgIH0KKyAgICBtdXRhdGVfcGFkZGluZyh2YWx1ZSkgeworICAgICAgICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCAyOCk7CisgICAgICAgIGlmIChvZmZzZXQgPT09IDApIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICB0aGlzLmJiLndyaXRlVWludDE2KHRoaXMuYmJfcG9zICsgb2Zmc2V0LCB2YWx1ZSk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICBzdGF0aWMgZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCkgeworICAgICAgICByZXR1cm4gJ3JlZmxlY3Rpb25fRmllbGQnOworICAgIH0KKyAgICBzdGF0aWMgc3RhcnRGaWVsZChidWlsZGVyKSB7CisgICAgICAgIGJ1aWxkZXIuc3RhcnRPYmplY3QoMTMpOworICAgIH0KKyAgICBzdGF0aWMgYWRkTmFtZShidWlsZGVyLCBuYW1lT2Zmc2V0KSB7CisgICAgICAgIGJ1aWxkZXIuYWRkRmllbGRPZmZzZXQoMCwgbmFtZU9mZnNldCwgMCk7CisgICAgfQorICAgIHN0YXRpYyBhZGRUeXBlKGJ1aWxkZXIsIHR5cGVPZmZzZXQpIHsKKyAgICAgICAgYnVpbGRlci5hZGRGaWVsZE9mZnNldCgxLCB0eXBlT2Zmc2V0LCAwKTsKKyAgICB9CisgICAgc3RhdGljIGFkZElkKGJ1aWxkZXIsIGlkKSB7CisgICAgICAgIGJ1aWxkZXIuYWRkRmllbGRJbnQxNigyLCBpZCwgMCk7CisgICAgfQorICAgIHN0YXRpYyBhZGRPZmZzZXQoYnVpbGRlciwgb2Zmc2V0KSB7CisgICAgICAgIGJ1aWxkZXIuYWRkRmllbGRJbnQxNigzLCBvZmZzZXQsIDApOworICAgIH0KKyAgICBzdGF0aWMgYWRkRGVmYXVsdEludGVnZXIoYnVpbGRlciwgZGVmYXVsdEludGVnZXIpIHsKKyAgICAgICAgYnVpbGRlci5hZGRGaWVsZEludDY0KDQsIGRlZmF1bHRJbnRlZ2VyLCBCaWdJbnQoJzAnKSk7CisgICAgfQorICAgIHN0YXRpYyBhZGREZWZhdWx0UmVhbChidWlsZGVyLCBkZWZhdWx0UmVhbCkgeworICAgICAgICBidWlsZGVyLmFkZEZpZWxkRmxvYXQ2NCg1LCBkZWZhdWx0UmVhbCwgMC4wKTsKKyAgICB9CisgICAgc3RhdGljIGFkZERlcHJlY2F0ZWQoYnVpbGRlciwgZGVwcmVjYXRlZCkgeworICAgICAgICBidWlsZGVyLmFkZEZpZWxkSW50OCg2LCArZGVwcmVjYXRlZCwgK2ZhbHNlKTsKKyAgICB9CisgICAgc3RhdGljIGFkZFJlcXVpcmVkKGJ1aWxkZXIsIHJlcXVpcmVkKSB7CisgICAgICAgIGJ1aWxkZXIuYWRkRmllbGRJbnQ4KDcsICtyZXF1aXJlZCwgK2ZhbHNlKTsKKyAgICB9CisgICAgc3RhdGljIGFkZEtleShidWlsZGVyLCBrZXkpIHsKKyAgICAgICAgYnVpbGRlci5hZGRGaWVsZEludDgoOCwgK2tleSwgK2ZhbHNlKTsKKyAgICB9CisgICAgc3RhdGljIGFkZEF0dHJpYnV0ZXMoYnVpbGRlciwgYXR0cmlidXRlc09mZnNldCkgeworICAgICAgICBidWlsZGVyLmFkZEZpZWxkT2Zmc2V0KDksIGF0dHJpYnV0ZXNPZmZzZXQsIDApOworICAgIH0KKyAgICBzdGF0aWMgY3JlYXRlQXR0cmlidXRlc1ZlY3RvcihidWlsZGVyLCBkYXRhKSB7CisgICAgICAgIGJ1aWxkZXIuc3RhcnRWZWN0b3IoNCwgZGF0YS5sZW5ndGgsIDQpOworICAgICAgICBmb3IgKGxldCBpID0gZGF0YS5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgeworICAgICAgICAgICAgYnVpbGRlci5hZGRPZmZzZXQoZGF0YVtpXSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGJ1aWxkZXIuZW5kVmVjdG9yKCk7CisgICAgfQorICAgIHN0YXRpYyBzdGFydEF0dHJpYnV0ZXNWZWN0b3IoYnVpbGRlciwgbnVtRWxlbXMpIHsKKyAgICAgICAgYnVpbGRlci5zdGFydFZlY3Rvcig0LCBudW1FbGVtcywgNCk7CisgICAgfQorICAgIHN0YXRpYyBhZGREb2N1bWVudGF0aW9uKGJ1aWxkZXIsIGRvY3VtZW50YXRpb25PZmZzZXQpIHsKKyAgICAgICAgYnVpbGRlci5hZGRGaWVsZE9mZnNldCgxMCwgZG9jdW1lbnRhdGlvbk9mZnNldCwgMCk7CisgICAgfQorICAgIHN0YXRpYyBjcmVhdGVEb2N1bWVudGF0aW9uVmVjdG9yKGJ1aWxkZXIsIGRhdGEpIHsKKyAgICAgICAgYnVpbGRlci5zdGFydFZlY3Rvcig0LCBkYXRhLmxlbmd0aCwgNCk7CisgICAgICAgIGZvciAobGV0IGkgPSBkYXRhLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7CisgICAgICAgICAgICBidWlsZGVyLmFkZE9mZnNldChkYXRhW2ldKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gYnVpbGRlci5lbmRWZWN0b3IoKTsKKyAgICB9CisgICAgc3RhdGljIHN0YXJ0RG9jdW1lbnRhdGlvblZlY3RvcihidWlsZGVyLCBudW1FbGVtcykgeworICAgICAgICBidWlsZGVyLnN0YXJ0VmVjdG9yKDQsIG51bUVsZW1zLCA0KTsKKyAgICB9CisgICAgc3RhdGljIGFkZE9wdGlvbmFsKGJ1aWxkZXIsIG9wdGlvbmFsKSB7CisgICAgICAgIGJ1aWxkZXIuYWRkRmllbGRJbnQ4KDExLCArb3B0aW9uYWwsICtmYWxzZSk7CisgICAgfQorICAgIHN0YXRpYyBhZGRQYWRkaW5nKGJ1aWxkZXIsIHBhZGRpbmcpIHsKKyAgICAgICAgYnVpbGRlci5hZGRGaWVsZEludDE2KDEyLCBwYWRkaW5nLCAwKTsKKyAgICB9CisgICAgc3RhdGljIGVuZEZpZWxkKGJ1aWxkZXIpIHsKKyAgICAgICAgY29uc3Qgb2Zmc2V0ID0gYnVpbGRlci5lbmRPYmplY3QoKTsKKyAgICAgICAgYnVpbGRlci5yZXF1aXJlZEZpZWxkKG9mZnNldCwgNCk7IC8vIG5hbWUKKyAgICAgICAgYnVpbGRlci5yZXF1aXJlZEZpZWxkKG9mZnNldCwgNik7IC8vIHR5cGUKKyAgICAgICAgcmV0dXJuIG9mZnNldDsKKyAgICB9CisgICAgdW5wYWNrKCkgeworICAgICAgICByZXR1cm4gbmV3IEZpZWxkVCh0aGlzLm5hbWUoKSwgKHRoaXMudHlwZSgpICE9PSBudWxsID8gdGhpcy50eXBlKCkudW5wYWNrKCkgOiBudWxsKSwgdGhpcy5pZCgpLCB0aGlzLm9mZnNldCgpLCB0aGlzLmRlZmF1bHRJbnRlZ2VyKCksIHRoaXMuZGVmYXVsdFJlYWwoKSwgdGhpcy5kZXByZWNhdGVkKCksIHRoaXMucmVxdWlyZWQoKSwgdGhpcy5rZXkoKSwgdGhpcy5iYi5jcmVhdGVPYmpMaXN0KHRoaXMuYXR0cmlidXRlcy5iaW5kKHRoaXMpLCB0aGlzLmF0dHJpYnV0ZXNMZW5ndGgoKSksIHRoaXMuYmIuY3JlYXRlU2NhbGFyTGlzdCh0aGlzLmRvY3VtZW50YXRpb24uYmluZCh0aGlzKSwgdGhpcy5kb2N1bWVudGF0aW9uTGVuZ3RoKCkpLCB0aGlzLm9wdGlvbmFsKCksIHRoaXMucGFkZGluZygpKTsKKyAgICB9CisgICAgdW5wYWNrVG8oX28pIHsKKyAgICAgICAgX28ubmFtZSA9IHRoaXMubmFtZSgpOworICAgICAgICBfby50eXBlID0gKHRoaXMudHlwZSgpICE9PSBudWxsID8gdGhpcy50eXBlKCkudW5wYWNrKCkgOiBudWxsKTsKKyAgICAgICAgX28uaWQgPSB0aGlzLmlkKCk7CisgICAgICAgIF9vLm9mZnNldCA9IHRoaXMub2Zmc2V0KCk7CisgICAgICAgIF9vLmRlZmF1bHRJbnRlZ2VyID0gdGhpcy5kZWZhdWx0SW50ZWdlcigpOworICAgICAgICBfby5kZWZhdWx0UmVhbCA9IHRoaXMuZGVmYXVsdFJlYWwoKTsKKyAgICAgICAgX28uZGVwcmVjYXRlZCA9IHRoaXMuZGVwcmVjYXRlZCgpOworICAgICAgICBfby5yZXF1aXJlZCA9IHRoaXMucmVxdWlyZWQoKTsKKyAgICAgICAgX28ua2V5ID0gdGhpcy5rZXkoKTsKKyAgICAgICAgX28uYXR0cmlidXRlcyA9IHRoaXMuYmIuY3JlYXRlT2JqTGlzdCh0aGlzLmF0dHJpYnV0ZXMuYmluZCh0aGlzKSwgdGhpcy5hdHRyaWJ1dGVzTGVuZ3RoKCkpOworICAgICAgICBfby5kb2N1bWVudGF0aW9uID0gdGhpcy5iYi5jcmVhdGVTY2FsYXJMaXN0KHRoaXMuZG9jdW1lbnRhdGlvbi5iaW5kKHRoaXMpLCB0aGlzLmRvY3VtZW50YXRpb25MZW5ndGgoKSk7CisgICAgICAgIF9vLm9wdGlvbmFsID0gdGhpcy5vcHRpb25hbCgpOworICAgICAgICBfby5wYWRkaW5nID0gdGhpcy5wYWRkaW5nKCk7CisgICAgfQorfQorZXhwb3J0IGNsYXNzIEZpZWxkVCB7CisgICAgY29uc3RydWN0b3IobmFtZSA9IG51bGwsIHR5cGUgPSBudWxsLCBpZCA9IDAsIG9mZnNldCA9IDAsIGRlZmF1bHRJbnRlZ2VyID0gQmlnSW50KCcwJyksIGRlZmF1bHRSZWFsID0gMC4wLCBkZXByZWNhdGVkID0gZmFsc2UsIHJlcXVpcmVkID0gZmFsc2UsIGtleSA9IGZhbHNlLCBhdHRyaWJ1dGVzID0gW10sIGRvY3VtZW50YXRpb24gPSBbXSwgb3B0aW9uYWwgPSBmYWxzZSwgcGFkZGluZyA9IDApIHsKKyAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKKyAgICAgICAgdGhpcy50eXBlID0gdHlwZTsKKyAgICAgICAgdGhpcy5pZCA9IGlkOworICAgICAgICB0aGlzLm9mZnNldCA9IG9mZnNldDsKKyAgICAgICAgdGhpcy5kZWZhdWx0SW50ZWdlciA9IGRlZmF1bHRJbnRlZ2VyOworICAgICAgICB0aGlzLmRlZmF1bHRSZWFsID0gZGVmYXVsdFJlYWw7CisgICAgICAgIHRoaXMuZGVwcmVjYXRlZCA9IGRlcHJlY2F0ZWQ7CisgICAgICAgIHRoaXMucmVxdWlyZWQgPSByZXF1aXJlZDsKKyAgICAgICAgdGhpcy5rZXkgPSBrZXk7CisgICAgICAgIHRoaXMuYXR0cmlidXRlcyA9IGF0dHJpYnV0ZXM7CisgICAgICAgIHRoaXMuZG9jdW1lbnRhdGlvbiA9IGRvY3VtZW50YXRpb247CisgICAgICAgIHRoaXMub3B0aW9uYWwgPSBvcHRpb25hbDsKKyAgICAgICAgdGhpcy5wYWRkaW5nID0gcGFkZGluZzsKKyAgICB9CisgICAgcGFjayhidWlsZGVyKSB7CisgICAgICAgIGNvbnN0IG5hbWUgPSAodGhpcy5uYW1lICE9PSBudWxsID8gYnVpbGRlci5jcmVhdGVTdHJpbmcodGhpcy5uYW1lKSA6IDApOworICAgICAgICBjb25zdCB0eXBlID0gKHRoaXMudHlwZSAhPT0gbnVsbCA/IHRoaXMudHlwZS5wYWNrKGJ1aWxkZXIpIDogMCk7CisgICAgICAgIGNvbnN0IGF0dHJpYnV0ZXMgPSBGaWVsZC5jcmVhdGVBdHRyaWJ1dGVzVmVjdG9yKGJ1aWxkZXIsIGJ1aWxkZXIuY3JlYXRlT2JqZWN0T2Zmc2V0TGlzdCh0aGlzLmF0dHJpYnV0ZXMpKTsKKyAgICAgICAgY29uc3QgZG9jdW1lbnRhdGlvbiA9IEZpZWxkLmNyZWF0ZURvY3VtZW50YXRpb25WZWN0b3IoYnVpbGRlciwgYnVpbGRlci5jcmVhdGVPYmplY3RPZmZzZXRMaXN0KHRoaXMuZG9jdW1lbnRhdGlvbikpOworICAgICAgICBGaWVsZC5zdGFydEZpZWxkKGJ1aWxkZXIpOworICAgICAgICBGaWVsZC5hZGROYW1lKGJ1aWxkZXIsIG5hbWUpOworICAgICAgICBGaWVsZC5hZGRUeXBlKGJ1aWxkZXIsIHR5cGUpOworICAgICAgICBGaWVsZC5hZGRJZChidWlsZGVyLCB0aGlzLmlkKTsKKyAgICAgICAgRmllbGQuYWRkT2Zmc2V0KGJ1aWxkZXIsIHRoaXMub2Zmc2V0KTsKKyAgICAgICAgRmllbGQuYWRkRGVmYXVsdEludGVnZXIoYnVpbGRlciwgdGhpcy5kZWZhdWx0SW50ZWdlcik7CisgICAgICAgIEZpZWxkLmFkZERlZmF1bHRSZWFsKGJ1aWxkZXIsIHRoaXMuZGVmYXVsdFJlYWwpOworICAgICAgICBGaWVsZC5hZGREZXByZWNhdGVkKGJ1aWxkZXIsIHRoaXMuZGVwcmVjYXRlZCk7CisgICAgICAgIEZpZWxkLmFkZFJlcXVpcmVkKGJ1aWxkZXIsIHRoaXMucmVxdWlyZWQpOworICAgICAgICBGaWVsZC5hZGRLZXkoYnVpbGRlciwgdGhpcy5rZXkpOworICAgICAgICBGaWVsZC5hZGRBdHRyaWJ1dGVzKGJ1aWxkZXIsIGF0dHJpYnV0ZXMpOworICAgICAgICBGaWVsZC5hZGREb2N1bWVudGF0aW9uKGJ1aWxkZXIsIGRvY3VtZW50YXRpb24pOworICAgICAgICBGaWVsZC5hZGRPcHRpb25hbChidWlsZGVyLCB0aGlzLm9wdGlvbmFsKTsKKyAgICAgICAgRmllbGQuYWRkUGFkZGluZyhidWlsZGVyLCB0aGlzLnBhZGRpbmcpOworICAgICAgICByZXR1cm4gRmllbGQuZW5kRmllbGQoYnVpbGRlcik7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvdHMvcmVmbGVjdGlvbi9maWVsZC50cyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL3RzL3JlZmxlY3Rpb24vZmllbGQudHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDhjMWJlZAotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL3RzL3JlZmxlY3Rpb24vZmllbGQudHMKQEAgLTAsMCArMSwzNzcgQEAKKy8vIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGJ5IHRoZSBGbGF0QnVmZmVycyBjb21waWxlciwgZG8gbm90IG1vZGlmeQorCitpbXBvcnQgKiBhcyBmbGF0YnVmZmVycyBmcm9tICdmbGF0YnVmZmVycyc7CisKK2ltcG9ydCB7IEtleVZhbHVlLCBLZXlWYWx1ZVQgfSBmcm9tICcuLi9yZWZsZWN0aW9uL2tleS12YWx1ZS5qcyc7CitpbXBvcnQgeyBUeXBlLCBUeXBlVCB9IGZyb20gJy4uL3JlZmxlY3Rpb24vdHlwZS5qcyc7CisKKworZXhwb3J0IGNsYXNzIEZpZWxkIHsKKyAgYmI6IGZsYXRidWZmZXJzLkJ5dGVCdWZmZXJ8bnVsbCA9IG51bGw7CisgIGJiX3BvcyA9IDA7CisgIF9faW5pdChpOm51bWJlciwgYmI6ZmxhdGJ1ZmZlcnMuQnl0ZUJ1ZmZlcik6RmllbGQgeworICB0aGlzLmJiX3BvcyA9IGk7CisgIHRoaXMuYmIgPSBiYjsKKyAgcmV0dXJuIHRoaXM7Cit9CisKK3N0YXRpYyBnZXRSb290QXNGaWVsZChiYjpmbGF0YnVmZmVycy5CeXRlQnVmZmVyLCBvYmo/OkZpZWxkKTpGaWVsZCB7CisgIHJldHVybiAob2JqIHx8IG5ldyBGaWVsZCgpKS5fX2luaXQoYmIucmVhZEludDMyKGJiLnBvc2l0aW9uKCkpICsgYmIucG9zaXRpb24oKSwgYmIpOworfQorCitzdGF0aWMgZ2V0U2l6ZVByZWZpeGVkUm9vdEFzRmllbGQoYmI6ZmxhdGJ1ZmZlcnMuQnl0ZUJ1ZmZlciwgb2JqPzpGaWVsZCk6RmllbGQgeworICBiYi5zZXRQb3NpdGlvbihiYi5wb3NpdGlvbigpICsgZmxhdGJ1ZmZlcnMuU0laRV9QUkVGSVhfTEVOR1RIKTsKKyAgcmV0dXJuIChvYmogfHwgbmV3IEZpZWxkKCkpLl9faW5pdChiYi5yZWFkSW50MzIoYmIucG9zaXRpb24oKSkgKyBiYi5wb3NpdGlvbigpLCBiYik7Cit9CisKK25hbWUoKTpzdHJpbmd8bnVsbAorbmFtZShvcHRpb25hbEVuY29kaW5nOmZsYXRidWZmZXJzLkVuY29kaW5nKTpzdHJpbmd8VWludDhBcnJheXxudWxsCituYW1lKG9wdGlvbmFsRW5jb2Rpbmc/OmFueSk6c3RyaW5nfFVpbnQ4QXJyYXl8bnVsbCB7CisgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIhLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCA0KTsKKyAgcmV0dXJuIG9mZnNldCA/IHRoaXMuYmIhLl9fc3RyaW5nKHRoaXMuYmJfcG9zICsgb2Zmc2V0LCBvcHRpb25hbEVuY29kaW5nKSA6IG51bGw7Cit9CisKK3R5cGUob2JqPzpUeXBlKTpUeXBlfG51bGwgeworICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiIS5fX29mZnNldCh0aGlzLmJiX3BvcywgNik7CisgIHJldHVybiBvZmZzZXQgPyAob2JqIHx8IG5ldyBUeXBlKCkpLl9faW5pdCh0aGlzLmJiIS5fX2luZGlyZWN0KHRoaXMuYmJfcG9zICsgb2Zmc2V0KSwgdGhpcy5iYiEpIDogbnVsbDsKK30KKworaWQoKTpudW1iZXIgeworICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiIS5fX29mZnNldCh0aGlzLmJiX3BvcywgOCk7CisgIHJldHVybiBvZmZzZXQgPyB0aGlzLmJiIS5yZWFkVWludDE2KHRoaXMuYmJfcG9zICsgb2Zmc2V0KSA6IDA7Cit9CisKK211dGF0ZV9pZCh2YWx1ZTpudW1iZXIpOmJvb2xlYW4geworICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiIS5fX29mZnNldCh0aGlzLmJiX3BvcywgOCk7CisKKyAgaWYgKG9mZnNldCA9PT0gMCkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHRoaXMuYmIhLndyaXRlVWludDE2KHRoaXMuYmJfcG9zICsgb2Zmc2V0LCB2YWx1ZSk7CisgIHJldHVybiB0cnVlOworfQorCitvZmZzZXQoKTpudW1iZXIgeworICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiIS5fX29mZnNldCh0aGlzLmJiX3BvcywgMTApOworICByZXR1cm4gb2Zmc2V0ID8gdGhpcy5iYiEucmVhZFVpbnQxNih0aGlzLmJiX3BvcyArIG9mZnNldCkgOiAwOworfQorCittdXRhdGVfb2Zmc2V0KHZhbHVlOm51bWJlcik6Ym9vbGVhbiB7CisgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIhLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCAxMCk7CisKKyAgaWYgKG9mZnNldCA9PT0gMCkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHRoaXMuYmIhLndyaXRlVWludDE2KHRoaXMuYmJfcG9zICsgb2Zmc2V0LCB2YWx1ZSk7CisgIHJldHVybiB0cnVlOworfQorCitkZWZhdWx0SW50ZWdlcigpOmJpZ2ludCB7CisgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIhLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCAxMik7CisgIHJldHVybiBvZmZzZXQgPyB0aGlzLmJiIS5yZWFkSW50NjQodGhpcy5iYl9wb3MgKyBvZmZzZXQpIDogQmlnSW50KCcwJyk7Cit9CisKK211dGF0ZV9kZWZhdWx0X2ludGVnZXIodmFsdWU6YmlnaW50KTpib29sZWFuIHsKKyAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYiEuX19vZmZzZXQodGhpcy5iYl9wb3MsIDEyKTsKKworICBpZiAob2Zmc2V0ID09PSAwKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgdGhpcy5iYiEud3JpdGVJbnQ2NCh0aGlzLmJiX3BvcyArIG9mZnNldCwgdmFsdWUpOworICByZXR1cm4gdHJ1ZTsKK30KKworZGVmYXVsdFJlYWwoKTpudW1iZXIgeworICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiIS5fX29mZnNldCh0aGlzLmJiX3BvcywgMTQpOworICByZXR1cm4gb2Zmc2V0ID8gdGhpcy5iYiEucmVhZEZsb2F0NjQodGhpcy5iYl9wb3MgKyBvZmZzZXQpIDogMC4wOworfQorCittdXRhdGVfZGVmYXVsdF9yZWFsKHZhbHVlOm51bWJlcik6Ym9vbGVhbiB7CisgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIhLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCAxNCk7CisKKyAgaWYgKG9mZnNldCA9PT0gMCkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHRoaXMuYmIhLndyaXRlRmxvYXQ2NCh0aGlzLmJiX3BvcyArIG9mZnNldCwgdmFsdWUpOworICByZXR1cm4gdHJ1ZTsKK30KKworZGVwcmVjYXRlZCgpOmJvb2xlYW4geworICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiIS5fX29mZnNldCh0aGlzLmJiX3BvcywgMTYpOworICByZXR1cm4gb2Zmc2V0ID8gISF0aGlzLmJiIS5yZWFkSW50OCh0aGlzLmJiX3BvcyArIG9mZnNldCkgOiBmYWxzZTsKK30KKworbXV0YXRlX2RlcHJlY2F0ZWQodmFsdWU6Ym9vbGVhbik6Ym9vbGVhbiB7CisgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIhLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCAxNik7CisKKyAgaWYgKG9mZnNldCA9PT0gMCkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHRoaXMuYmIhLndyaXRlSW50OCh0aGlzLmJiX3BvcyArIG9mZnNldCwgK3ZhbHVlKTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK3JlcXVpcmVkKCk6Ym9vbGVhbiB7CisgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIhLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCAxOCk7CisgIHJldHVybiBvZmZzZXQgPyAhIXRoaXMuYmIhLnJlYWRJbnQ4KHRoaXMuYmJfcG9zICsgb2Zmc2V0KSA6IGZhbHNlOworfQorCittdXRhdGVfcmVxdWlyZWQodmFsdWU6Ym9vbGVhbik6Ym9vbGVhbiB7CisgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIhLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCAxOCk7CisKKyAgaWYgKG9mZnNldCA9PT0gMCkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHRoaXMuYmIhLndyaXRlSW50OCh0aGlzLmJiX3BvcyArIG9mZnNldCwgK3ZhbHVlKTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK2tleSgpOmJvb2xlYW4geworICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiIS5fX29mZnNldCh0aGlzLmJiX3BvcywgMjApOworICByZXR1cm4gb2Zmc2V0ID8gISF0aGlzLmJiIS5yZWFkSW50OCh0aGlzLmJiX3BvcyArIG9mZnNldCkgOiBmYWxzZTsKK30KKworbXV0YXRlX2tleSh2YWx1ZTpib29sZWFuKTpib29sZWFuIHsKKyAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYiEuX19vZmZzZXQodGhpcy5iYl9wb3MsIDIwKTsKKworICBpZiAob2Zmc2V0ID09PSAwKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgdGhpcy5iYiEud3JpdGVJbnQ4KHRoaXMuYmJfcG9zICsgb2Zmc2V0LCArdmFsdWUpOworICByZXR1cm4gdHJ1ZTsKK30KKworYXR0cmlidXRlcyhpbmRleDogbnVtYmVyLCBvYmo/OktleVZhbHVlKTpLZXlWYWx1ZXxudWxsIHsKKyAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYiEuX19vZmZzZXQodGhpcy5iYl9wb3MsIDIyKTsKKyAgcmV0dXJuIG9mZnNldCA/IChvYmogfHwgbmV3IEtleVZhbHVlKCkpLl9faW5pdCh0aGlzLmJiIS5fX2luZGlyZWN0KHRoaXMuYmIhLl9fdmVjdG9yKHRoaXMuYmJfcG9zICsgb2Zmc2V0KSArIGluZGV4ICogNCksIHRoaXMuYmIhKSA6IG51bGw7Cit9CisKK2F0dHJpYnV0ZXNMZW5ndGgoKTpudW1iZXIgeworICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiIS5fX29mZnNldCh0aGlzLmJiX3BvcywgMjIpOworICByZXR1cm4gb2Zmc2V0ID8gdGhpcy5iYiEuX192ZWN0b3JfbGVuKHRoaXMuYmJfcG9zICsgb2Zmc2V0KSA6IDA7Cit9CisKK2RvY3VtZW50YXRpb24oaW5kZXg6IG51bWJlcik6c3RyaW5nCitkb2N1bWVudGF0aW9uKGluZGV4OiBudW1iZXIsb3B0aW9uYWxFbmNvZGluZzpmbGF0YnVmZmVycy5FbmNvZGluZyk6c3RyaW5nfFVpbnQ4QXJyYXkKK2RvY3VtZW50YXRpb24oaW5kZXg6IG51bWJlcixvcHRpb25hbEVuY29kaW5nPzphbnkpOnN0cmluZ3xVaW50OEFycmF5fG51bGwgeworICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiIS5fX29mZnNldCh0aGlzLmJiX3BvcywgMjQpOworICByZXR1cm4gb2Zmc2V0ID8gdGhpcy5iYiEuX19zdHJpbmcodGhpcy5iYiEuX192ZWN0b3IodGhpcy5iYl9wb3MgKyBvZmZzZXQpICsgaW5kZXggKiA0LCBvcHRpb25hbEVuY29kaW5nKSA6IG51bGw7Cit9CisKK2RvY3VtZW50YXRpb25MZW5ndGgoKTpudW1iZXIgeworICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiIS5fX29mZnNldCh0aGlzLmJiX3BvcywgMjQpOworICByZXR1cm4gb2Zmc2V0ID8gdGhpcy5iYiEuX192ZWN0b3JfbGVuKHRoaXMuYmJfcG9zICsgb2Zmc2V0KSA6IDA7Cit9CisKK29wdGlvbmFsKCk6Ym9vbGVhbiB7CisgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIhLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCAyNik7CisgIHJldHVybiBvZmZzZXQgPyAhIXRoaXMuYmIhLnJlYWRJbnQ4KHRoaXMuYmJfcG9zICsgb2Zmc2V0KSA6IGZhbHNlOworfQorCittdXRhdGVfb3B0aW9uYWwodmFsdWU6Ym9vbGVhbik6Ym9vbGVhbiB7CisgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIhLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCAyNik7CisKKyAgaWYgKG9mZnNldCA9PT0gMCkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHRoaXMuYmIhLndyaXRlSW50OCh0aGlzLmJiX3BvcyArIG9mZnNldCwgK3ZhbHVlKTsKKyAgcmV0dXJuIHRydWU7Cit9CisKKy8qKgorICogTnVtYmVyIG9mIHBhZGRpbmcgb2N0ZXRzIHRvIGFsd2F5cyBhZGQgYWZ0ZXIgdGhpcyBmaWVsZC4gU3RydWN0cyBvbmx5LgorICovCitwYWRkaW5nKCk6bnVtYmVyIHsKKyAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYiEuX19vZmZzZXQodGhpcy5iYl9wb3MsIDI4KTsKKyAgcmV0dXJuIG9mZnNldCA/IHRoaXMuYmIhLnJlYWRVaW50MTYodGhpcy5iYl9wb3MgKyBvZmZzZXQpIDogMDsKK30KKworbXV0YXRlX3BhZGRpbmcodmFsdWU6bnVtYmVyKTpib29sZWFuIHsKKyAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYiEuX19vZmZzZXQodGhpcy5iYl9wb3MsIDI4KTsKKworICBpZiAob2Zmc2V0ID09PSAwKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgdGhpcy5iYiEud3JpdGVVaW50MTYodGhpcy5iYl9wb3MgKyBvZmZzZXQsIHZhbHVlKTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyBnZXRGdWxseVF1YWxpZmllZE5hbWUoKTpzdHJpbmcgeworICByZXR1cm4gJ3JlZmxlY3Rpb25fRmllbGQnOworfQorCitzdGF0aWMgc3RhcnRGaWVsZChidWlsZGVyOmZsYXRidWZmZXJzLkJ1aWxkZXIpIHsKKyAgYnVpbGRlci5zdGFydE9iamVjdCgxMyk7Cit9CisKK3N0YXRpYyBhZGROYW1lKGJ1aWxkZXI6ZmxhdGJ1ZmZlcnMuQnVpbGRlciwgbmFtZU9mZnNldDpmbGF0YnVmZmVycy5PZmZzZXQpIHsKKyAgYnVpbGRlci5hZGRGaWVsZE9mZnNldCgwLCBuYW1lT2Zmc2V0LCAwKTsKK30KKworc3RhdGljIGFkZFR5cGUoYnVpbGRlcjpmbGF0YnVmZmVycy5CdWlsZGVyLCB0eXBlT2Zmc2V0OmZsYXRidWZmZXJzLk9mZnNldCkgeworICBidWlsZGVyLmFkZEZpZWxkT2Zmc2V0KDEsIHR5cGVPZmZzZXQsIDApOworfQorCitzdGF0aWMgYWRkSWQoYnVpbGRlcjpmbGF0YnVmZmVycy5CdWlsZGVyLCBpZDpudW1iZXIpIHsKKyAgYnVpbGRlci5hZGRGaWVsZEludDE2KDIsIGlkLCAwKTsKK30KKworc3RhdGljIGFkZE9mZnNldChidWlsZGVyOmZsYXRidWZmZXJzLkJ1aWxkZXIsIG9mZnNldDpudW1iZXIpIHsKKyAgYnVpbGRlci5hZGRGaWVsZEludDE2KDMsIG9mZnNldCwgMCk7Cit9CisKK3N0YXRpYyBhZGREZWZhdWx0SW50ZWdlcihidWlsZGVyOmZsYXRidWZmZXJzLkJ1aWxkZXIsIGRlZmF1bHRJbnRlZ2VyOmJpZ2ludCkgeworICBidWlsZGVyLmFkZEZpZWxkSW50NjQoNCwgZGVmYXVsdEludGVnZXIsIEJpZ0ludCgnMCcpKTsKK30KKworc3RhdGljIGFkZERlZmF1bHRSZWFsKGJ1aWxkZXI6ZmxhdGJ1ZmZlcnMuQnVpbGRlciwgZGVmYXVsdFJlYWw6bnVtYmVyKSB7CisgIGJ1aWxkZXIuYWRkRmllbGRGbG9hdDY0KDUsIGRlZmF1bHRSZWFsLCAwLjApOworfQorCitzdGF0aWMgYWRkRGVwcmVjYXRlZChidWlsZGVyOmZsYXRidWZmZXJzLkJ1aWxkZXIsIGRlcHJlY2F0ZWQ6Ym9vbGVhbikgeworICBidWlsZGVyLmFkZEZpZWxkSW50OCg2LCArZGVwcmVjYXRlZCwgK2ZhbHNlKTsKK30KKworc3RhdGljIGFkZFJlcXVpcmVkKGJ1aWxkZXI6ZmxhdGJ1ZmZlcnMuQnVpbGRlciwgcmVxdWlyZWQ6Ym9vbGVhbikgeworICBidWlsZGVyLmFkZEZpZWxkSW50OCg3LCArcmVxdWlyZWQsICtmYWxzZSk7Cit9CisKK3N0YXRpYyBhZGRLZXkoYnVpbGRlcjpmbGF0YnVmZmVycy5CdWlsZGVyLCBrZXk6Ym9vbGVhbikgeworICBidWlsZGVyLmFkZEZpZWxkSW50OCg4LCAra2V5LCArZmFsc2UpOworfQorCitzdGF0aWMgYWRkQXR0cmlidXRlcyhidWlsZGVyOmZsYXRidWZmZXJzLkJ1aWxkZXIsIGF0dHJpYnV0ZXNPZmZzZXQ6ZmxhdGJ1ZmZlcnMuT2Zmc2V0KSB7CisgIGJ1aWxkZXIuYWRkRmllbGRPZmZzZXQoOSwgYXR0cmlidXRlc09mZnNldCwgMCk7Cit9CisKK3N0YXRpYyBjcmVhdGVBdHRyaWJ1dGVzVmVjdG9yKGJ1aWxkZXI6ZmxhdGJ1ZmZlcnMuQnVpbGRlciwgZGF0YTpmbGF0YnVmZmVycy5PZmZzZXRbXSk6ZmxhdGJ1ZmZlcnMuT2Zmc2V0IHsKKyAgYnVpbGRlci5zdGFydFZlY3Rvcig0LCBkYXRhLmxlbmd0aCwgNCk7CisgIGZvciAobGV0IGkgPSBkYXRhLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7CisgICAgYnVpbGRlci5hZGRPZmZzZXQoZGF0YVtpXSEpOworICB9CisgIHJldHVybiBidWlsZGVyLmVuZFZlY3RvcigpOworfQorCitzdGF0aWMgc3RhcnRBdHRyaWJ1dGVzVmVjdG9yKGJ1aWxkZXI6ZmxhdGJ1ZmZlcnMuQnVpbGRlciwgbnVtRWxlbXM6bnVtYmVyKSB7CisgIGJ1aWxkZXIuc3RhcnRWZWN0b3IoNCwgbnVtRWxlbXMsIDQpOworfQorCitzdGF0aWMgYWRkRG9jdW1lbnRhdGlvbihidWlsZGVyOmZsYXRidWZmZXJzLkJ1aWxkZXIsIGRvY3VtZW50YXRpb25PZmZzZXQ6ZmxhdGJ1ZmZlcnMuT2Zmc2V0KSB7CisgIGJ1aWxkZXIuYWRkRmllbGRPZmZzZXQoMTAsIGRvY3VtZW50YXRpb25PZmZzZXQsIDApOworfQorCitzdGF0aWMgY3JlYXRlRG9jdW1lbnRhdGlvblZlY3RvcihidWlsZGVyOmZsYXRidWZmZXJzLkJ1aWxkZXIsIGRhdGE6ZmxhdGJ1ZmZlcnMuT2Zmc2V0W10pOmZsYXRidWZmZXJzLk9mZnNldCB7CisgIGJ1aWxkZXIuc3RhcnRWZWN0b3IoNCwgZGF0YS5sZW5ndGgsIDQpOworICBmb3IgKGxldCBpID0gZGF0YS5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgeworICAgIGJ1aWxkZXIuYWRkT2Zmc2V0KGRhdGFbaV0hKTsKKyAgfQorICByZXR1cm4gYnVpbGRlci5lbmRWZWN0b3IoKTsKK30KKworc3RhdGljIHN0YXJ0RG9jdW1lbnRhdGlvblZlY3RvcihidWlsZGVyOmZsYXRidWZmZXJzLkJ1aWxkZXIsIG51bUVsZW1zOm51bWJlcikgeworICBidWlsZGVyLnN0YXJ0VmVjdG9yKDQsIG51bUVsZW1zLCA0KTsKK30KKworc3RhdGljIGFkZE9wdGlvbmFsKGJ1aWxkZXI6ZmxhdGJ1ZmZlcnMuQnVpbGRlciwgb3B0aW9uYWw6Ym9vbGVhbikgeworICBidWlsZGVyLmFkZEZpZWxkSW50OCgxMSwgK29wdGlvbmFsLCArZmFsc2UpOworfQorCitzdGF0aWMgYWRkUGFkZGluZyhidWlsZGVyOmZsYXRidWZmZXJzLkJ1aWxkZXIsIHBhZGRpbmc6bnVtYmVyKSB7CisgIGJ1aWxkZXIuYWRkRmllbGRJbnQxNigxMiwgcGFkZGluZywgMCk7Cit9CisKK3N0YXRpYyBlbmRGaWVsZChidWlsZGVyOmZsYXRidWZmZXJzLkJ1aWxkZXIpOmZsYXRidWZmZXJzLk9mZnNldCB7CisgIGNvbnN0IG9mZnNldCA9IGJ1aWxkZXIuZW5kT2JqZWN0KCk7CisgIGJ1aWxkZXIucmVxdWlyZWRGaWVsZChvZmZzZXQsIDQpIC8vIG5hbWUKKyAgYnVpbGRlci5yZXF1aXJlZEZpZWxkKG9mZnNldCwgNikgLy8gdHlwZQorICByZXR1cm4gb2Zmc2V0OworfQorCisKK3VucGFjaygpOiBGaWVsZFQgeworICByZXR1cm4gbmV3IEZpZWxkVCgKKyAgICB0aGlzLm5hbWUoKSwKKyAgICAodGhpcy50eXBlKCkgIT09IG51bGwgPyB0aGlzLnR5cGUoKSEudW5wYWNrKCkgOiBudWxsKSwKKyAgICB0aGlzLmlkKCksCisgICAgdGhpcy5vZmZzZXQoKSwKKyAgICB0aGlzLmRlZmF1bHRJbnRlZ2VyKCksCisgICAgdGhpcy5kZWZhdWx0UmVhbCgpLAorICAgIHRoaXMuZGVwcmVjYXRlZCgpLAorICAgIHRoaXMucmVxdWlyZWQoKSwKKyAgICB0aGlzLmtleSgpLAorICAgIHRoaXMuYmIhLmNyZWF0ZU9iakxpc3QodGhpcy5hdHRyaWJ1dGVzLmJpbmQodGhpcyksIHRoaXMuYXR0cmlidXRlc0xlbmd0aCgpKSwKKyAgICB0aGlzLmJiIS5jcmVhdGVTY2FsYXJMaXN0KHRoaXMuZG9jdW1lbnRhdGlvbi5iaW5kKHRoaXMpLCB0aGlzLmRvY3VtZW50YXRpb25MZW5ndGgoKSksCisgICAgdGhpcy5vcHRpb25hbCgpLAorICAgIHRoaXMucGFkZGluZygpCisgICk7Cit9CisKKwordW5wYWNrVG8oX286IEZpZWxkVCk6IHZvaWQgeworICBfby5uYW1lID0gdGhpcy5uYW1lKCk7CisgIF9vLnR5cGUgPSAodGhpcy50eXBlKCkgIT09IG51bGwgPyB0aGlzLnR5cGUoKSEudW5wYWNrKCkgOiBudWxsKTsKKyAgX28uaWQgPSB0aGlzLmlkKCk7CisgIF9vLm9mZnNldCA9IHRoaXMub2Zmc2V0KCk7CisgIF9vLmRlZmF1bHRJbnRlZ2VyID0gdGhpcy5kZWZhdWx0SW50ZWdlcigpOworICBfby5kZWZhdWx0UmVhbCA9IHRoaXMuZGVmYXVsdFJlYWwoKTsKKyAgX28uZGVwcmVjYXRlZCA9IHRoaXMuZGVwcmVjYXRlZCgpOworICBfby5yZXF1aXJlZCA9IHRoaXMucmVxdWlyZWQoKTsKKyAgX28ua2V5ID0gdGhpcy5rZXkoKTsKKyAgX28uYXR0cmlidXRlcyA9IHRoaXMuYmIhLmNyZWF0ZU9iakxpc3QodGhpcy5hdHRyaWJ1dGVzLmJpbmQodGhpcyksIHRoaXMuYXR0cmlidXRlc0xlbmd0aCgpKTsKKyAgX28uZG9jdW1lbnRhdGlvbiA9IHRoaXMuYmIhLmNyZWF0ZVNjYWxhckxpc3QodGhpcy5kb2N1bWVudGF0aW9uLmJpbmQodGhpcyksIHRoaXMuZG9jdW1lbnRhdGlvbkxlbmd0aCgpKTsKKyAgX28ub3B0aW9uYWwgPSB0aGlzLm9wdGlvbmFsKCk7CisgIF9vLnBhZGRpbmcgPSB0aGlzLnBhZGRpbmcoKTsKK30KK30KKworZXhwb3J0IGNsYXNzIEZpZWxkVCB7Citjb25zdHJ1Y3RvcigKKyAgcHVibGljIG5hbWU6IHN0cmluZ3xVaW50OEFycmF5fG51bGwgPSBudWxsLAorICBwdWJsaWMgdHlwZTogVHlwZVR8bnVsbCA9IG51bGwsCisgIHB1YmxpYyBpZDogbnVtYmVyID0gMCwKKyAgcHVibGljIG9mZnNldDogbnVtYmVyID0gMCwKKyAgcHVibGljIGRlZmF1bHRJbnRlZ2VyOiBiaWdpbnQgPSBCaWdJbnQoJzAnKSwKKyAgcHVibGljIGRlZmF1bHRSZWFsOiBudW1iZXIgPSAwLjAsCisgIHB1YmxpYyBkZXByZWNhdGVkOiBib29sZWFuID0gZmFsc2UsCisgIHB1YmxpYyByZXF1aXJlZDogYm9vbGVhbiA9IGZhbHNlLAorICBwdWJsaWMga2V5OiBib29sZWFuID0gZmFsc2UsCisgIHB1YmxpYyBhdHRyaWJ1dGVzOiAoS2V5VmFsdWVUKVtdID0gW10sCisgIHB1YmxpYyBkb2N1bWVudGF0aW9uOiAoc3RyaW5nKVtdID0gW10sCisgIHB1YmxpYyBvcHRpb25hbDogYm9vbGVhbiA9IGZhbHNlLAorICBwdWJsaWMgcGFkZGluZzogbnVtYmVyID0gMAorKXt9CisKKworcGFjayhidWlsZGVyOmZsYXRidWZmZXJzLkJ1aWxkZXIpOiBmbGF0YnVmZmVycy5PZmZzZXQgeworICBjb25zdCBuYW1lID0gKHRoaXMubmFtZSAhPT0gbnVsbCA/IGJ1aWxkZXIuY3JlYXRlU3RyaW5nKHRoaXMubmFtZSEpIDogMCk7CisgIGNvbnN0IHR5cGUgPSAodGhpcy50eXBlICE9PSBudWxsID8gdGhpcy50eXBlIS5wYWNrKGJ1aWxkZXIpIDogMCk7CisgIGNvbnN0IGF0dHJpYnV0ZXMgPSBGaWVsZC5jcmVhdGVBdHRyaWJ1dGVzVmVjdG9yKGJ1aWxkZXIsIGJ1aWxkZXIuY3JlYXRlT2JqZWN0T2Zmc2V0TGlzdCh0aGlzLmF0dHJpYnV0ZXMpKTsKKyAgY29uc3QgZG9jdW1lbnRhdGlvbiA9IEZpZWxkLmNyZWF0ZURvY3VtZW50YXRpb25WZWN0b3IoYnVpbGRlciwgYnVpbGRlci5jcmVhdGVPYmplY3RPZmZzZXRMaXN0KHRoaXMuZG9jdW1lbnRhdGlvbikpOworCisgIEZpZWxkLnN0YXJ0RmllbGQoYnVpbGRlcik7CisgIEZpZWxkLmFkZE5hbWUoYnVpbGRlciwgbmFtZSk7CisgIEZpZWxkLmFkZFR5cGUoYnVpbGRlciwgdHlwZSk7CisgIEZpZWxkLmFkZElkKGJ1aWxkZXIsIHRoaXMuaWQpOworICBGaWVsZC5hZGRPZmZzZXQoYnVpbGRlciwgdGhpcy5vZmZzZXQpOworICBGaWVsZC5hZGREZWZhdWx0SW50ZWdlcihidWlsZGVyLCB0aGlzLmRlZmF1bHRJbnRlZ2VyKTsKKyAgRmllbGQuYWRkRGVmYXVsdFJlYWwoYnVpbGRlciwgdGhpcy5kZWZhdWx0UmVhbCk7CisgIEZpZWxkLmFkZERlcHJlY2F0ZWQoYnVpbGRlciwgdGhpcy5kZXByZWNhdGVkKTsKKyAgRmllbGQuYWRkUmVxdWlyZWQoYnVpbGRlciwgdGhpcy5yZXF1aXJlZCk7CisgIEZpZWxkLmFkZEtleShidWlsZGVyLCB0aGlzLmtleSk7CisgIEZpZWxkLmFkZEF0dHJpYnV0ZXMoYnVpbGRlciwgYXR0cmlidXRlcyk7CisgIEZpZWxkLmFkZERvY3VtZW50YXRpb24oYnVpbGRlciwgZG9jdW1lbnRhdGlvbik7CisgIEZpZWxkLmFkZE9wdGlvbmFsKGJ1aWxkZXIsIHRoaXMub3B0aW9uYWwpOworICBGaWVsZC5hZGRQYWRkaW5nKGJ1aWxkZXIsIHRoaXMucGFkZGluZyk7CisKKyAgcmV0dXJuIEZpZWxkLmVuZEZpZWxkKGJ1aWxkZXIpOworfQorfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvdHMvcmVmbGVjdGlvbi9rZXktdmFsdWUuanMgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy90cy9yZWZsZWN0aW9uL2tleS12YWx1ZS5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MjJiNGYyCi0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvdHMvcmVmbGVjdGlvbi9rZXktdmFsdWUuanMKQEAgLTAsMCArMSw2OSBAQAorLy8gYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgYnkgdGhlIEZsYXRCdWZmZXJzIGNvbXBpbGVyLCBkbyBub3QgbW9kaWZ5CitpbXBvcnQgKiBhcyBmbGF0YnVmZmVycyBmcm9tICdmbGF0YnVmZmVycyc7CitleHBvcnQgY2xhc3MgS2V5VmFsdWUgeworICAgIGNvbnN0cnVjdG9yKCkgeworICAgICAgICB0aGlzLmJiID0gbnVsbDsKKyAgICAgICAgdGhpcy5iYl9wb3MgPSAwOworICAgIH0KKyAgICBfX2luaXQoaSwgYmIpIHsKKyAgICAgICAgdGhpcy5iYl9wb3MgPSBpOworICAgICAgICB0aGlzLmJiID0gYmI7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKyAgICBzdGF0aWMgZ2V0Um9vdEFzS2V5VmFsdWUoYmIsIG9iaikgeworICAgICAgICByZXR1cm4gKG9iaiB8fCBuZXcgS2V5VmFsdWUoKSkuX19pbml0KGJiLnJlYWRJbnQzMihiYi5wb3NpdGlvbigpKSArIGJiLnBvc2l0aW9uKCksIGJiKTsKKyAgICB9CisgICAgc3RhdGljIGdldFNpemVQcmVmaXhlZFJvb3RBc0tleVZhbHVlKGJiLCBvYmopIHsKKyAgICAgICAgYmIuc2V0UG9zaXRpb24oYmIucG9zaXRpb24oKSArIGZsYXRidWZmZXJzLlNJWkVfUFJFRklYX0xFTkdUSCk7CisgICAgICAgIHJldHVybiAob2JqIHx8IG5ldyBLZXlWYWx1ZSgpKS5fX2luaXQoYmIucmVhZEludDMyKGJiLnBvc2l0aW9uKCkpICsgYmIucG9zaXRpb24oKSwgYmIpOworICAgIH0KKyAgICBrZXkob3B0aW9uYWxFbmNvZGluZykgeworICAgICAgICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCA0KTsKKyAgICAgICAgcmV0dXJuIG9mZnNldCA/IHRoaXMuYmIuX19zdHJpbmcodGhpcy5iYl9wb3MgKyBvZmZzZXQsIG9wdGlvbmFsRW5jb2RpbmcpIDogbnVsbDsKKyAgICB9CisgICAgdmFsdWUob3B0aW9uYWxFbmNvZGluZykgeworICAgICAgICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCA2KTsKKyAgICAgICAgcmV0dXJuIG9mZnNldCA/IHRoaXMuYmIuX19zdHJpbmcodGhpcy5iYl9wb3MgKyBvZmZzZXQsIG9wdGlvbmFsRW5jb2RpbmcpIDogbnVsbDsKKyAgICB9CisgICAgc3RhdGljIGdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpIHsKKyAgICAgICAgcmV0dXJuICdyZWZsZWN0aW9uX0tleVZhbHVlJzsKKyAgICB9CisgICAgc3RhdGljIHN0YXJ0S2V5VmFsdWUoYnVpbGRlcikgeworICAgICAgICBidWlsZGVyLnN0YXJ0T2JqZWN0KDIpOworICAgIH0KKyAgICBzdGF0aWMgYWRkS2V5KGJ1aWxkZXIsIGtleU9mZnNldCkgeworICAgICAgICBidWlsZGVyLmFkZEZpZWxkT2Zmc2V0KDAsIGtleU9mZnNldCwgMCk7CisgICAgfQorICAgIHN0YXRpYyBhZGRWYWx1ZShidWlsZGVyLCB2YWx1ZU9mZnNldCkgeworICAgICAgICBidWlsZGVyLmFkZEZpZWxkT2Zmc2V0KDEsIHZhbHVlT2Zmc2V0LCAwKTsKKyAgICB9CisgICAgc3RhdGljIGVuZEtleVZhbHVlKGJ1aWxkZXIpIHsKKyAgICAgICAgY29uc3Qgb2Zmc2V0ID0gYnVpbGRlci5lbmRPYmplY3QoKTsKKyAgICAgICAgYnVpbGRlci5yZXF1aXJlZEZpZWxkKG9mZnNldCwgNCk7IC8vIGtleQorICAgICAgICByZXR1cm4gb2Zmc2V0OworICAgIH0KKyAgICBzdGF0aWMgY3JlYXRlS2V5VmFsdWUoYnVpbGRlciwga2V5T2Zmc2V0LCB2YWx1ZU9mZnNldCkgeworICAgICAgICBLZXlWYWx1ZS5zdGFydEtleVZhbHVlKGJ1aWxkZXIpOworICAgICAgICBLZXlWYWx1ZS5hZGRLZXkoYnVpbGRlciwga2V5T2Zmc2V0KTsKKyAgICAgICAgS2V5VmFsdWUuYWRkVmFsdWUoYnVpbGRlciwgdmFsdWVPZmZzZXQpOworICAgICAgICByZXR1cm4gS2V5VmFsdWUuZW5kS2V5VmFsdWUoYnVpbGRlcik7CisgICAgfQorICAgIHVucGFjaygpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBLZXlWYWx1ZVQodGhpcy5rZXkoKSwgdGhpcy52YWx1ZSgpKTsKKyAgICB9CisgICAgdW5wYWNrVG8oX28pIHsKKyAgICAgICAgX28ua2V5ID0gdGhpcy5rZXkoKTsKKyAgICAgICAgX28udmFsdWUgPSB0aGlzLnZhbHVlKCk7CisgICAgfQorfQorZXhwb3J0IGNsYXNzIEtleVZhbHVlVCB7CisgICAgY29uc3RydWN0b3Ioa2V5ID0gbnVsbCwgdmFsdWUgPSBudWxsKSB7CisgICAgICAgIHRoaXMua2V5ID0ga2V5OworICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7CisgICAgfQorICAgIHBhY2soYnVpbGRlcikgeworICAgICAgICBjb25zdCBrZXkgPSAodGhpcy5rZXkgIT09IG51bGwgPyBidWlsZGVyLmNyZWF0ZVN0cmluZyh0aGlzLmtleSkgOiAwKTsKKyAgICAgICAgY29uc3QgdmFsdWUgPSAodGhpcy52YWx1ZSAhPT0gbnVsbCA/IGJ1aWxkZXIuY3JlYXRlU3RyaW5nKHRoaXMudmFsdWUpIDogMCk7CisgICAgICAgIHJldHVybiBLZXlWYWx1ZS5jcmVhdGVLZXlWYWx1ZShidWlsZGVyLCBrZXksIHZhbHVlKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy90cy9yZWZsZWN0aW9uL2tleS12YWx1ZS50cyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL3RzL3JlZmxlY3Rpb24va2V5LXZhbHVlLnRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjczNjc2NmIKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy90cy9yZWZsZWN0aW9uL2tleS12YWx1ZS50cwpAQCAtMCwwICsxLDk4IEBACisvLyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBieSB0aGUgRmxhdEJ1ZmZlcnMgY29tcGlsZXIsIGRvIG5vdCBtb2RpZnkKKworaW1wb3J0ICogYXMgZmxhdGJ1ZmZlcnMgZnJvbSAnZmxhdGJ1ZmZlcnMnOworCisKKworZXhwb3J0IGNsYXNzIEtleVZhbHVlIHsKKyAgYmI6IGZsYXRidWZmZXJzLkJ5dGVCdWZmZXJ8bnVsbCA9IG51bGw7CisgIGJiX3BvcyA9IDA7CisgIF9faW5pdChpOm51bWJlciwgYmI6ZmxhdGJ1ZmZlcnMuQnl0ZUJ1ZmZlcik6S2V5VmFsdWUgeworICB0aGlzLmJiX3BvcyA9IGk7CisgIHRoaXMuYmIgPSBiYjsKKyAgcmV0dXJuIHRoaXM7Cit9CisKK3N0YXRpYyBnZXRSb290QXNLZXlWYWx1ZShiYjpmbGF0YnVmZmVycy5CeXRlQnVmZmVyLCBvYmo/OktleVZhbHVlKTpLZXlWYWx1ZSB7CisgIHJldHVybiAob2JqIHx8IG5ldyBLZXlWYWx1ZSgpKS5fX2luaXQoYmIucmVhZEludDMyKGJiLnBvc2l0aW9uKCkpICsgYmIucG9zaXRpb24oKSwgYmIpOworfQorCitzdGF0aWMgZ2V0U2l6ZVByZWZpeGVkUm9vdEFzS2V5VmFsdWUoYmI6ZmxhdGJ1ZmZlcnMuQnl0ZUJ1ZmZlciwgb2JqPzpLZXlWYWx1ZSk6S2V5VmFsdWUgeworICBiYi5zZXRQb3NpdGlvbihiYi5wb3NpdGlvbigpICsgZmxhdGJ1ZmZlcnMuU0laRV9QUkVGSVhfTEVOR1RIKTsKKyAgcmV0dXJuIChvYmogfHwgbmV3IEtleVZhbHVlKCkpLl9faW5pdChiYi5yZWFkSW50MzIoYmIucG9zaXRpb24oKSkgKyBiYi5wb3NpdGlvbigpLCBiYik7Cit9CisKK2tleSgpOnN0cmluZ3xudWxsCitrZXkob3B0aW9uYWxFbmNvZGluZzpmbGF0YnVmZmVycy5FbmNvZGluZyk6c3RyaW5nfFVpbnQ4QXJyYXl8bnVsbAora2V5KG9wdGlvbmFsRW5jb2Rpbmc/OmFueSk6c3RyaW5nfFVpbnQ4QXJyYXl8bnVsbCB7CisgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIhLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCA0KTsKKyAgcmV0dXJuIG9mZnNldCA/IHRoaXMuYmIhLl9fc3RyaW5nKHRoaXMuYmJfcG9zICsgb2Zmc2V0LCBvcHRpb25hbEVuY29kaW5nKSA6IG51bGw7Cit9CisKK3ZhbHVlKCk6c3RyaW5nfG51bGwKK3ZhbHVlKG9wdGlvbmFsRW5jb2Rpbmc6ZmxhdGJ1ZmZlcnMuRW5jb2RpbmcpOnN0cmluZ3xVaW50OEFycmF5fG51bGwKK3ZhbHVlKG9wdGlvbmFsRW5jb2Rpbmc/OmFueSk6c3RyaW5nfFVpbnQ4QXJyYXl8bnVsbCB7CisgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIhLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCA2KTsKKyAgcmV0dXJuIG9mZnNldCA/IHRoaXMuYmIhLl9fc3RyaW5nKHRoaXMuYmJfcG9zICsgb2Zmc2V0LCBvcHRpb25hbEVuY29kaW5nKSA6IG51bGw7Cit9CisKK3N0YXRpYyBnZXRGdWxseVF1YWxpZmllZE5hbWUoKTpzdHJpbmcgeworICByZXR1cm4gJ3JlZmxlY3Rpb25fS2V5VmFsdWUnOworfQorCitzdGF0aWMgc3RhcnRLZXlWYWx1ZShidWlsZGVyOmZsYXRidWZmZXJzLkJ1aWxkZXIpIHsKKyAgYnVpbGRlci5zdGFydE9iamVjdCgyKTsKK30KKworc3RhdGljIGFkZEtleShidWlsZGVyOmZsYXRidWZmZXJzLkJ1aWxkZXIsIGtleU9mZnNldDpmbGF0YnVmZmVycy5PZmZzZXQpIHsKKyAgYnVpbGRlci5hZGRGaWVsZE9mZnNldCgwLCBrZXlPZmZzZXQsIDApOworfQorCitzdGF0aWMgYWRkVmFsdWUoYnVpbGRlcjpmbGF0YnVmZmVycy5CdWlsZGVyLCB2YWx1ZU9mZnNldDpmbGF0YnVmZmVycy5PZmZzZXQpIHsKKyAgYnVpbGRlci5hZGRGaWVsZE9mZnNldCgxLCB2YWx1ZU9mZnNldCwgMCk7Cit9CisKK3N0YXRpYyBlbmRLZXlWYWx1ZShidWlsZGVyOmZsYXRidWZmZXJzLkJ1aWxkZXIpOmZsYXRidWZmZXJzLk9mZnNldCB7CisgIGNvbnN0IG9mZnNldCA9IGJ1aWxkZXIuZW5kT2JqZWN0KCk7CisgIGJ1aWxkZXIucmVxdWlyZWRGaWVsZChvZmZzZXQsIDQpIC8vIGtleQorICByZXR1cm4gb2Zmc2V0OworfQorCitzdGF0aWMgY3JlYXRlS2V5VmFsdWUoYnVpbGRlcjpmbGF0YnVmZmVycy5CdWlsZGVyLCBrZXlPZmZzZXQ6ZmxhdGJ1ZmZlcnMuT2Zmc2V0LCB2YWx1ZU9mZnNldDpmbGF0YnVmZmVycy5PZmZzZXQpOmZsYXRidWZmZXJzLk9mZnNldCB7CisgIEtleVZhbHVlLnN0YXJ0S2V5VmFsdWUoYnVpbGRlcik7CisgIEtleVZhbHVlLmFkZEtleShidWlsZGVyLCBrZXlPZmZzZXQpOworICBLZXlWYWx1ZS5hZGRWYWx1ZShidWlsZGVyLCB2YWx1ZU9mZnNldCk7CisgIHJldHVybiBLZXlWYWx1ZS5lbmRLZXlWYWx1ZShidWlsZGVyKTsKK30KKwordW5wYWNrKCk6IEtleVZhbHVlVCB7CisgIHJldHVybiBuZXcgS2V5VmFsdWVUKAorICAgIHRoaXMua2V5KCksCisgICAgdGhpcy52YWx1ZSgpCisgICk7Cit9CisKKwordW5wYWNrVG8oX286IEtleVZhbHVlVCk6IHZvaWQgeworICBfby5rZXkgPSB0aGlzLmtleSgpOworICBfby52YWx1ZSA9IHRoaXMudmFsdWUoKTsKK30KK30KKworZXhwb3J0IGNsYXNzIEtleVZhbHVlVCB7Citjb25zdHJ1Y3RvcigKKyAgcHVibGljIGtleTogc3RyaW5nfFVpbnQ4QXJyYXl8bnVsbCA9IG51bGwsCisgIHB1YmxpYyB2YWx1ZTogc3RyaW5nfFVpbnQ4QXJyYXl8bnVsbCA9IG51bGwKKyl7fQorCisKK3BhY2soYnVpbGRlcjpmbGF0YnVmZmVycy5CdWlsZGVyKTogZmxhdGJ1ZmZlcnMuT2Zmc2V0IHsKKyAgY29uc3Qga2V5ID0gKHRoaXMua2V5ICE9PSBudWxsID8gYnVpbGRlci5jcmVhdGVTdHJpbmcodGhpcy5rZXkhKSA6IDApOworICBjb25zdCB2YWx1ZSA9ICh0aGlzLnZhbHVlICE9PSBudWxsID8gYnVpbGRlci5jcmVhdGVTdHJpbmcodGhpcy52YWx1ZSEpIDogMCk7CisKKyAgcmV0dXJuIEtleVZhbHVlLmNyZWF0ZUtleVZhbHVlKGJ1aWxkZXIsCisgICAga2V5LAorICAgIHZhbHVlCisgICk7Cit9Cit9CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy90cy9yZWZsZWN0aW9uL29iamVjdC5qcyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL3RzL3JlZmxlY3Rpb24vb2JqZWN0LmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQyODg1NDUKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy90cy9yZWZsZWN0aW9uL29iamVjdC5qcwpAQCAtMCwwICsxLDIwMSBAQAorLy8gYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgYnkgdGhlIEZsYXRCdWZmZXJzIGNvbXBpbGVyLCBkbyBub3QgbW9kaWZ5CitpbXBvcnQgKiBhcyBmbGF0YnVmZmVycyBmcm9tICdmbGF0YnVmZmVycyc7CitpbXBvcnQgeyBGaWVsZCB9IGZyb20gJy4uL3JlZmxlY3Rpb24vZmllbGQuanMnOworaW1wb3J0IHsgS2V5VmFsdWUgfSBmcm9tICcuLi9yZWZsZWN0aW9uL2tleS12YWx1ZS5qcyc7CitleHBvcnQgY2xhc3MgT2JqZWN0XyB7CisgICAgY29uc3RydWN0b3IoKSB7CisgICAgICAgIHRoaXMuYmIgPSBudWxsOworICAgICAgICB0aGlzLmJiX3BvcyA9IDA7CisgICAgfQorICAgIF9faW5pdChpLCBiYikgeworICAgICAgICB0aGlzLmJiX3BvcyA9IGk7CisgICAgICAgIHRoaXMuYmIgPSBiYjsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorICAgIHN0YXRpYyBnZXRSb290QXNPYmplY3QoYmIsIG9iaikgeworICAgICAgICByZXR1cm4gKG9iaiB8fCBuZXcgT2JqZWN0XygpKS5fX2luaXQoYmIucmVhZEludDMyKGJiLnBvc2l0aW9uKCkpICsgYmIucG9zaXRpb24oKSwgYmIpOworICAgIH0KKyAgICBzdGF0aWMgZ2V0U2l6ZVByZWZpeGVkUm9vdEFzT2JqZWN0KGJiLCBvYmopIHsKKyAgICAgICAgYmIuc2V0UG9zaXRpb24oYmIucG9zaXRpb24oKSArIGZsYXRidWZmZXJzLlNJWkVfUFJFRklYX0xFTkdUSCk7CisgICAgICAgIHJldHVybiAob2JqIHx8IG5ldyBPYmplY3RfKCkpLl9faW5pdChiYi5yZWFkSW50MzIoYmIucG9zaXRpb24oKSkgKyBiYi5wb3NpdGlvbigpLCBiYik7CisgICAgfQorICAgIG5hbWUob3B0aW9uYWxFbmNvZGluZykgeworICAgICAgICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCA0KTsKKyAgICAgICAgcmV0dXJuIG9mZnNldCA/IHRoaXMuYmIuX19zdHJpbmcodGhpcy5iYl9wb3MgKyBvZmZzZXQsIG9wdGlvbmFsRW5jb2RpbmcpIDogbnVsbDsKKyAgICB9CisgICAgZmllbGRzKGluZGV4LCBvYmopIHsKKyAgICAgICAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywgNik7CisgICAgICAgIHJldHVybiBvZmZzZXQgPyAob2JqIHx8IG5ldyBGaWVsZCgpKS5fX2luaXQodGhpcy5iYi5fX2luZGlyZWN0KHRoaXMuYmIuX192ZWN0b3IodGhpcy5iYl9wb3MgKyBvZmZzZXQpICsgaW5kZXggKiA0KSwgdGhpcy5iYikgOiBudWxsOworICAgIH0KKyAgICBmaWVsZHNMZW5ndGgoKSB7CisgICAgICAgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsIDYpOworICAgICAgICByZXR1cm4gb2Zmc2V0ID8gdGhpcy5iYi5fX3ZlY3Rvcl9sZW4odGhpcy5iYl9wb3MgKyBvZmZzZXQpIDogMDsKKyAgICB9CisgICAgaXNTdHJ1Y3QoKSB7CisgICAgICAgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsIDgpOworICAgICAgICByZXR1cm4gb2Zmc2V0ID8gISF0aGlzLmJiLnJlYWRJbnQ4KHRoaXMuYmJfcG9zICsgb2Zmc2V0KSA6IGZhbHNlOworICAgIH0KKyAgICBtdXRhdGVfaXNfc3RydWN0KHZhbHVlKSB7CisgICAgICAgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsIDgpOworICAgICAgICBpZiAob2Zmc2V0ID09PSAwKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgdGhpcy5iYi53cml0ZUludDgodGhpcy5iYl9wb3MgKyBvZmZzZXQsICt2YWx1ZSk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICBtaW5hbGlnbigpIHsKKyAgICAgICAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywgMTApOworICAgICAgICByZXR1cm4gb2Zmc2V0ID8gdGhpcy5iYi5yZWFkSW50MzIodGhpcy5iYl9wb3MgKyBvZmZzZXQpIDogMDsKKyAgICB9CisgICAgbXV0YXRlX21pbmFsaWduKHZhbHVlKSB7CisgICAgICAgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsIDEwKTsKKyAgICAgICAgaWYgKG9mZnNldCA9PT0gMCkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIHRoaXMuYmIud3JpdGVJbnQzMih0aGlzLmJiX3BvcyArIG9mZnNldCwgdmFsdWUpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgYnl0ZXNpemUoKSB7CisgICAgICAgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsIDEyKTsKKyAgICAgICAgcmV0dXJuIG9mZnNldCA/IHRoaXMuYmIucmVhZEludDMyKHRoaXMuYmJfcG9zICsgb2Zmc2V0KSA6IDA7CisgICAgfQorICAgIG11dGF0ZV9ieXRlc2l6ZSh2YWx1ZSkgeworICAgICAgICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCAxMik7CisgICAgICAgIGlmIChvZmZzZXQgPT09IDApIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICB0aGlzLmJiLndyaXRlSW50MzIodGhpcy5iYl9wb3MgKyBvZmZzZXQsIHZhbHVlKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIGF0dHJpYnV0ZXMoaW5kZXgsIG9iaikgeworICAgICAgICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCAxNCk7CisgICAgICAgIHJldHVybiBvZmZzZXQgPyAob2JqIHx8IG5ldyBLZXlWYWx1ZSgpKS5fX2luaXQodGhpcy5iYi5fX2luZGlyZWN0KHRoaXMuYmIuX192ZWN0b3IodGhpcy5iYl9wb3MgKyBvZmZzZXQpICsgaW5kZXggKiA0KSwgdGhpcy5iYikgOiBudWxsOworICAgIH0KKyAgICBhdHRyaWJ1dGVzTGVuZ3RoKCkgeworICAgICAgICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCAxNCk7CisgICAgICAgIHJldHVybiBvZmZzZXQgPyB0aGlzLmJiLl9fdmVjdG9yX2xlbih0aGlzLmJiX3BvcyArIG9mZnNldCkgOiAwOworICAgIH0KKyAgICBkb2N1bWVudGF0aW9uKGluZGV4LCBvcHRpb25hbEVuY29kaW5nKSB7CisgICAgICAgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsIDE2KTsKKyAgICAgICAgcmV0dXJuIG9mZnNldCA/IHRoaXMuYmIuX19zdHJpbmcodGhpcy5iYi5fX3ZlY3Rvcih0aGlzLmJiX3BvcyArIG9mZnNldCkgKyBpbmRleCAqIDQsIG9wdGlvbmFsRW5jb2RpbmcpIDogbnVsbDsKKyAgICB9CisgICAgZG9jdW1lbnRhdGlvbkxlbmd0aCgpIHsKKyAgICAgICAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywgMTYpOworICAgICAgICByZXR1cm4gb2Zmc2V0ID8gdGhpcy5iYi5fX3ZlY3Rvcl9sZW4odGhpcy5iYl9wb3MgKyBvZmZzZXQpIDogMDsKKyAgICB9CisgICAgZGVjbGFyYXRpb25GaWxlKG9wdGlvbmFsRW5jb2RpbmcpIHsKKyAgICAgICAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywgMTgpOworICAgICAgICByZXR1cm4gb2Zmc2V0ID8gdGhpcy5iYi5fX3N0cmluZyh0aGlzLmJiX3BvcyArIG9mZnNldCwgb3B0aW9uYWxFbmNvZGluZykgOiBudWxsOworICAgIH0KKyAgICBzdGF0aWMgZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCkgeworICAgICAgICByZXR1cm4gJ3JlZmxlY3Rpb25fT2JqZWN0JzsKKyAgICB9CisgICAgc3RhdGljIHN0YXJ0T2JqZWN0KGJ1aWxkZXIpIHsKKyAgICAgICAgYnVpbGRlci5zdGFydE9iamVjdCg4KTsKKyAgICB9CisgICAgc3RhdGljIGFkZE5hbWUoYnVpbGRlciwgbmFtZU9mZnNldCkgeworICAgICAgICBidWlsZGVyLmFkZEZpZWxkT2Zmc2V0KDAsIG5hbWVPZmZzZXQsIDApOworICAgIH0KKyAgICBzdGF0aWMgYWRkRmllbGRzKGJ1aWxkZXIsIGZpZWxkc09mZnNldCkgeworICAgICAgICBidWlsZGVyLmFkZEZpZWxkT2Zmc2V0KDEsIGZpZWxkc09mZnNldCwgMCk7CisgICAgfQorICAgIHN0YXRpYyBjcmVhdGVGaWVsZHNWZWN0b3IoYnVpbGRlciwgZGF0YSkgeworICAgICAgICBidWlsZGVyLnN0YXJ0VmVjdG9yKDQsIGRhdGEubGVuZ3RoLCA0KTsKKyAgICAgICAgZm9yIChsZXQgaSA9IGRhdGEubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHsKKyAgICAgICAgICAgIGJ1aWxkZXIuYWRkT2Zmc2V0KGRhdGFbaV0pOworICAgICAgICB9CisgICAgICAgIHJldHVybiBidWlsZGVyLmVuZFZlY3RvcigpOworICAgIH0KKyAgICBzdGF0aWMgc3RhcnRGaWVsZHNWZWN0b3IoYnVpbGRlciwgbnVtRWxlbXMpIHsKKyAgICAgICAgYnVpbGRlci5zdGFydFZlY3Rvcig0LCBudW1FbGVtcywgNCk7CisgICAgfQorICAgIHN0YXRpYyBhZGRJc1N0cnVjdChidWlsZGVyLCBpc1N0cnVjdCkgeworICAgICAgICBidWlsZGVyLmFkZEZpZWxkSW50OCgyLCAraXNTdHJ1Y3QsICtmYWxzZSk7CisgICAgfQorICAgIHN0YXRpYyBhZGRNaW5hbGlnbihidWlsZGVyLCBtaW5hbGlnbikgeworICAgICAgICBidWlsZGVyLmFkZEZpZWxkSW50MzIoMywgbWluYWxpZ24sIDApOworICAgIH0KKyAgICBzdGF0aWMgYWRkQnl0ZXNpemUoYnVpbGRlciwgYnl0ZXNpemUpIHsKKyAgICAgICAgYnVpbGRlci5hZGRGaWVsZEludDMyKDQsIGJ5dGVzaXplLCAwKTsKKyAgICB9CisgICAgc3RhdGljIGFkZEF0dHJpYnV0ZXMoYnVpbGRlciwgYXR0cmlidXRlc09mZnNldCkgeworICAgICAgICBidWlsZGVyLmFkZEZpZWxkT2Zmc2V0KDUsIGF0dHJpYnV0ZXNPZmZzZXQsIDApOworICAgIH0KKyAgICBzdGF0aWMgY3JlYXRlQXR0cmlidXRlc1ZlY3RvcihidWlsZGVyLCBkYXRhKSB7CisgICAgICAgIGJ1aWxkZXIuc3RhcnRWZWN0b3IoNCwgZGF0YS5sZW5ndGgsIDQpOworICAgICAgICBmb3IgKGxldCBpID0gZGF0YS5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgeworICAgICAgICAgICAgYnVpbGRlci5hZGRPZmZzZXQoZGF0YVtpXSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGJ1aWxkZXIuZW5kVmVjdG9yKCk7CisgICAgfQorICAgIHN0YXRpYyBzdGFydEF0dHJpYnV0ZXNWZWN0b3IoYnVpbGRlciwgbnVtRWxlbXMpIHsKKyAgICAgICAgYnVpbGRlci5zdGFydFZlY3Rvcig0LCBudW1FbGVtcywgNCk7CisgICAgfQorICAgIHN0YXRpYyBhZGREb2N1bWVudGF0aW9uKGJ1aWxkZXIsIGRvY3VtZW50YXRpb25PZmZzZXQpIHsKKyAgICAgICAgYnVpbGRlci5hZGRGaWVsZE9mZnNldCg2LCBkb2N1bWVudGF0aW9uT2Zmc2V0LCAwKTsKKyAgICB9CisgICAgc3RhdGljIGNyZWF0ZURvY3VtZW50YXRpb25WZWN0b3IoYnVpbGRlciwgZGF0YSkgeworICAgICAgICBidWlsZGVyLnN0YXJ0VmVjdG9yKDQsIGRhdGEubGVuZ3RoLCA0KTsKKyAgICAgICAgZm9yIChsZXQgaSA9IGRhdGEubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHsKKyAgICAgICAgICAgIGJ1aWxkZXIuYWRkT2Zmc2V0KGRhdGFbaV0pOworICAgICAgICB9CisgICAgICAgIHJldHVybiBidWlsZGVyLmVuZFZlY3RvcigpOworICAgIH0KKyAgICBzdGF0aWMgc3RhcnREb2N1bWVudGF0aW9uVmVjdG9yKGJ1aWxkZXIsIG51bUVsZW1zKSB7CisgICAgICAgIGJ1aWxkZXIuc3RhcnRWZWN0b3IoNCwgbnVtRWxlbXMsIDQpOworICAgIH0KKyAgICBzdGF0aWMgYWRkRGVjbGFyYXRpb25GaWxlKGJ1aWxkZXIsIGRlY2xhcmF0aW9uRmlsZU9mZnNldCkgeworICAgICAgICBidWlsZGVyLmFkZEZpZWxkT2Zmc2V0KDcsIGRlY2xhcmF0aW9uRmlsZU9mZnNldCwgMCk7CisgICAgfQorICAgIHN0YXRpYyBlbmRPYmplY3QoYnVpbGRlcikgeworICAgICAgICBjb25zdCBvZmZzZXQgPSBidWlsZGVyLmVuZE9iamVjdCgpOworICAgICAgICBidWlsZGVyLnJlcXVpcmVkRmllbGQob2Zmc2V0LCA0KTsgLy8gbmFtZQorICAgICAgICBidWlsZGVyLnJlcXVpcmVkRmllbGQob2Zmc2V0LCA2KTsgLy8gZmllbGRzCisgICAgICAgIHJldHVybiBvZmZzZXQ7CisgICAgfQorICAgIHN0YXRpYyBjcmVhdGVPYmplY3QoYnVpbGRlciwgbmFtZU9mZnNldCwgZmllbGRzT2Zmc2V0LCBpc1N0cnVjdCwgbWluYWxpZ24sIGJ5dGVzaXplLCBhdHRyaWJ1dGVzT2Zmc2V0LCBkb2N1bWVudGF0aW9uT2Zmc2V0LCBkZWNsYXJhdGlvbkZpbGVPZmZzZXQpIHsKKyAgICAgICAgT2JqZWN0Xy5zdGFydE9iamVjdChidWlsZGVyKTsKKyAgICAgICAgT2JqZWN0Xy5hZGROYW1lKGJ1aWxkZXIsIG5hbWVPZmZzZXQpOworICAgICAgICBPYmplY3RfLmFkZEZpZWxkcyhidWlsZGVyLCBmaWVsZHNPZmZzZXQpOworICAgICAgICBPYmplY3RfLmFkZElzU3RydWN0KGJ1aWxkZXIsIGlzU3RydWN0KTsKKyAgICAgICAgT2JqZWN0Xy5hZGRNaW5hbGlnbihidWlsZGVyLCBtaW5hbGlnbik7CisgICAgICAgIE9iamVjdF8uYWRkQnl0ZXNpemUoYnVpbGRlciwgYnl0ZXNpemUpOworICAgICAgICBPYmplY3RfLmFkZEF0dHJpYnV0ZXMoYnVpbGRlciwgYXR0cmlidXRlc09mZnNldCk7CisgICAgICAgIE9iamVjdF8uYWRkRG9jdW1lbnRhdGlvbihidWlsZGVyLCBkb2N1bWVudGF0aW9uT2Zmc2V0KTsKKyAgICAgICAgT2JqZWN0Xy5hZGREZWNsYXJhdGlvbkZpbGUoYnVpbGRlciwgZGVjbGFyYXRpb25GaWxlT2Zmc2V0KTsKKyAgICAgICAgcmV0dXJuIE9iamVjdF8uZW5kT2JqZWN0KGJ1aWxkZXIpOworICAgIH0KKyAgICB1bnBhY2soKSB7CisgICAgICAgIHJldHVybiBuZXcgT2JqZWN0X1QodGhpcy5uYW1lKCksIHRoaXMuYmIuY3JlYXRlT2JqTGlzdCh0aGlzLmZpZWxkcy5iaW5kKHRoaXMpLCB0aGlzLmZpZWxkc0xlbmd0aCgpKSwgdGhpcy5pc1N0cnVjdCgpLCB0aGlzLm1pbmFsaWduKCksIHRoaXMuYnl0ZXNpemUoKSwgdGhpcy5iYi5jcmVhdGVPYmpMaXN0KHRoaXMuYXR0cmlidXRlcy5iaW5kKHRoaXMpLCB0aGlzLmF0dHJpYnV0ZXNMZW5ndGgoKSksIHRoaXMuYmIuY3JlYXRlU2NhbGFyTGlzdCh0aGlzLmRvY3VtZW50YXRpb24uYmluZCh0aGlzKSwgdGhpcy5kb2N1bWVudGF0aW9uTGVuZ3RoKCkpLCB0aGlzLmRlY2xhcmF0aW9uRmlsZSgpKTsKKyAgICB9CisgICAgdW5wYWNrVG8oX28pIHsKKyAgICAgICAgX28ubmFtZSA9IHRoaXMubmFtZSgpOworICAgICAgICBfby5maWVsZHMgPSB0aGlzLmJiLmNyZWF0ZU9iakxpc3QodGhpcy5maWVsZHMuYmluZCh0aGlzKSwgdGhpcy5maWVsZHNMZW5ndGgoKSk7CisgICAgICAgIF9vLmlzU3RydWN0ID0gdGhpcy5pc1N0cnVjdCgpOworICAgICAgICBfby5taW5hbGlnbiA9IHRoaXMubWluYWxpZ24oKTsKKyAgICAgICAgX28uYnl0ZXNpemUgPSB0aGlzLmJ5dGVzaXplKCk7CisgICAgICAgIF9vLmF0dHJpYnV0ZXMgPSB0aGlzLmJiLmNyZWF0ZU9iakxpc3QodGhpcy5hdHRyaWJ1dGVzLmJpbmQodGhpcyksIHRoaXMuYXR0cmlidXRlc0xlbmd0aCgpKTsKKyAgICAgICAgX28uZG9jdW1lbnRhdGlvbiA9IHRoaXMuYmIuY3JlYXRlU2NhbGFyTGlzdCh0aGlzLmRvY3VtZW50YXRpb24uYmluZCh0aGlzKSwgdGhpcy5kb2N1bWVudGF0aW9uTGVuZ3RoKCkpOworICAgICAgICBfby5kZWNsYXJhdGlvbkZpbGUgPSB0aGlzLmRlY2xhcmF0aW9uRmlsZSgpOworICAgIH0KK30KK2V4cG9ydCBjbGFzcyBPYmplY3RfVCB7CisgICAgY29uc3RydWN0b3IobmFtZSA9IG51bGwsIGZpZWxkcyA9IFtdLCBpc1N0cnVjdCA9IGZhbHNlLCBtaW5hbGlnbiA9IDAsIGJ5dGVzaXplID0gMCwgYXR0cmlidXRlcyA9IFtdLCBkb2N1bWVudGF0aW9uID0gW10sIGRlY2xhcmF0aW9uRmlsZSA9IG51bGwpIHsKKyAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKKyAgICAgICAgdGhpcy5maWVsZHMgPSBmaWVsZHM7CisgICAgICAgIHRoaXMuaXNTdHJ1Y3QgPSBpc1N0cnVjdDsKKyAgICAgICAgdGhpcy5taW5hbGlnbiA9IG1pbmFsaWduOworICAgICAgICB0aGlzLmJ5dGVzaXplID0gYnl0ZXNpemU7CisgICAgICAgIHRoaXMuYXR0cmlidXRlcyA9IGF0dHJpYnV0ZXM7CisgICAgICAgIHRoaXMuZG9jdW1lbnRhdGlvbiA9IGRvY3VtZW50YXRpb247CisgICAgICAgIHRoaXMuZGVjbGFyYXRpb25GaWxlID0gZGVjbGFyYXRpb25GaWxlOworICAgIH0KKyAgICBwYWNrKGJ1aWxkZXIpIHsKKyAgICAgICAgY29uc3QgbmFtZSA9ICh0aGlzLm5hbWUgIT09IG51bGwgPyBidWlsZGVyLmNyZWF0ZVN0cmluZyh0aGlzLm5hbWUpIDogMCk7CisgICAgICAgIGNvbnN0IGZpZWxkcyA9IE9iamVjdF8uY3JlYXRlRmllbGRzVmVjdG9yKGJ1aWxkZXIsIGJ1aWxkZXIuY3JlYXRlT2JqZWN0T2Zmc2V0TGlzdCh0aGlzLmZpZWxkcykpOworICAgICAgICBjb25zdCBhdHRyaWJ1dGVzID0gT2JqZWN0Xy5jcmVhdGVBdHRyaWJ1dGVzVmVjdG9yKGJ1aWxkZXIsIGJ1aWxkZXIuY3JlYXRlT2JqZWN0T2Zmc2V0TGlzdCh0aGlzLmF0dHJpYnV0ZXMpKTsKKyAgICAgICAgY29uc3QgZG9jdW1lbnRhdGlvbiA9IE9iamVjdF8uY3JlYXRlRG9jdW1lbnRhdGlvblZlY3RvcihidWlsZGVyLCBidWlsZGVyLmNyZWF0ZU9iamVjdE9mZnNldExpc3QodGhpcy5kb2N1bWVudGF0aW9uKSk7CisgICAgICAgIGNvbnN0IGRlY2xhcmF0aW9uRmlsZSA9ICh0aGlzLmRlY2xhcmF0aW9uRmlsZSAhPT0gbnVsbCA/IGJ1aWxkZXIuY3JlYXRlU3RyaW5nKHRoaXMuZGVjbGFyYXRpb25GaWxlKSA6IDApOworICAgICAgICByZXR1cm4gT2JqZWN0Xy5jcmVhdGVPYmplY3QoYnVpbGRlciwgbmFtZSwgZmllbGRzLCB0aGlzLmlzU3RydWN0LCB0aGlzLm1pbmFsaWduLCB0aGlzLmJ5dGVzaXplLCBhdHRyaWJ1dGVzLCBkb2N1bWVudGF0aW9uLCBkZWNsYXJhdGlvbkZpbGUpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL3RzL3JlZmxlY3Rpb24vb2JqZWN0LnRzIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvdHMvcmVmbGVjdGlvbi9vYmplY3QudHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWUxNGYwMwotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL3RzL3JlZmxlY3Rpb24vb2JqZWN0LnRzCkBAIC0wLDAgKzEsMjc3IEBACisvLyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBieSB0aGUgRmxhdEJ1ZmZlcnMgY29tcGlsZXIsIGRvIG5vdCBtb2RpZnkKKworaW1wb3J0ICogYXMgZmxhdGJ1ZmZlcnMgZnJvbSAnZmxhdGJ1ZmZlcnMnOworCitpbXBvcnQgeyBGaWVsZCwgRmllbGRUIH0gZnJvbSAnLi4vcmVmbGVjdGlvbi9maWVsZC5qcyc7CitpbXBvcnQgeyBLZXlWYWx1ZSwgS2V5VmFsdWVUIH0gZnJvbSAnLi4vcmVmbGVjdGlvbi9rZXktdmFsdWUuanMnOworCisKK2V4cG9ydCBjbGFzcyBPYmplY3RfIHsKKyAgYmI6IGZsYXRidWZmZXJzLkJ5dGVCdWZmZXJ8bnVsbCA9IG51bGw7CisgIGJiX3BvcyA9IDA7CisgIF9faW5pdChpOm51bWJlciwgYmI6ZmxhdGJ1ZmZlcnMuQnl0ZUJ1ZmZlcik6T2JqZWN0XyB7CisgIHRoaXMuYmJfcG9zID0gaTsKKyAgdGhpcy5iYiA9IGJiOworICByZXR1cm4gdGhpczsKK30KKworc3RhdGljIGdldFJvb3RBc09iamVjdChiYjpmbGF0YnVmZmVycy5CeXRlQnVmZmVyLCBvYmo/Ok9iamVjdF8pOk9iamVjdF8geworICByZXR1cm4gKG9iaiB8fCBuZXcgT2JqZWN0XygpKS5fX2luaXQoYmIucmVhZEludDMyKGJiLnBvc2l0aW9uKCkpICsgYmIucG9zaXRpb24oKSwgYmIpOworfQorCitzdGF0aWMgZ2V0U2l6ZVByZWZpeGVkUm9vdEFzT2JqZWN0KGJiOmZsYXRidWZmZXJzLkJ5dGVCdWZmZXIsIG9iaj86T2JqZWN0Xyk6T2JqZWN0XyB7CisgIGJiLnNldFBvc2l0aW9uKGJiLnBvc2l0aW9uKCkgKyBmbGF0YnVmZmVycy5TSVpFX1BSRUZJWF9MRU5HVEgpOworICByZXR1cm4gKG9iaiB8fCBuZXcgT2JqZWN0XygpKS5fX2luaXQoYmIucmVhZEludDMyKGJiLnBvc2l0aW9uKCkpICsgYmIucG9zaXRpb24oKSwgYmIpOworfQorCituYW1lKCk6c3RyaW5nfG51bGwKK25hbWUob3B0aW9uYWxFbmNvZGluZzpmbGF0YnVmZmVycy5FbmNvZGluZyk6c3RyaW5nfFVpbnQ4QXJyYXl8bnVsbAorbmFtZShvcHRpb25hbEVuY29kaW5nPzphbnkpOnN0cmluZ3xVaW50OEFycmF5fG51bGwgeworICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiIS5fX29mZnNldCh0aGlzLmJiX3BvcywgNCk7CisgIHJldHVybiBvZmZzZXQgPyB0aGlzLmJiIS5fX3N0cmluZyh0aGlzLmJiX3BvcyArIG9mZnNldCwgb3B0aW9uYWxFbmNvZGluZykgOiBudWxsOworfQorCitmaWVsZHMoaW5kZXg6IG51bWJlciwgb2JqPzpGaWVsZCk6RmllbGR8bnVsbCB7CisgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIhLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCA2KTsKKyAgcmV0dXJuIG9mZnNldCA/IChvYmogfHwgbmV3IEZpZWxkKCkpLl9faW5pdCh0aGlzLmJiIS5fX2luZGlyZWN0KHRoaXMuYmIhLl9fdmVjdG9yKHRoaXMuYmJfcG9zICsgb2Zmc2V0KSArIGluZGV4ICogNCksIHRoaXMuYmIhKSA6IG51bGw7Cit9CisKK2ZpZWxkc0xlbmd0aCgpOm51bWJlciB7CisgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIhLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCA2KTsKKyAgcmV0dXJuIG9mZnNldCA/IHRoaXMuYmIhLl9fdmVjdG9yX2xlbih0aGlzLmJiX3BvcyArIG9mZnNldCkgOiAwOworfQorCitpc1N0cnVjdCgpOmJvb2xlYW4geworICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiIS5fX29mZnNldCh0aGlzLmJiX3BvcywgOCk7CisgIHJldHVybiBvZmZzZXQgPyAhIXRoaXMuYmIhLnJlYWRJbnQ4KHRoaXMuYmJfcG9zICsgb2Zmc2V0KSA6IGZhbHNlOworfQorCittdXRhdGVfaXNfc3RydWN0KHZhbHVlOmJvb2xlYW4pOmJvb2xlYW4geworICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiIS5fX29mZnNldCh0aGlzLmJiX3BvcywgOCk7CisKKyAgaWYgKG9mZnNldCA9PT0gMCkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHRoaXMuYmIhLndyaXRlSW50OCh0aGlzLmJiX3BvcyArIG9mZnNldCwgK3ZhbHVlKTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK21pbmFsaWduKCk6bnVtYmVyIHsKKyAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYiEuX19vZmZzZXQodGhpcy5iYl9wb3MsIDEwKTsKKyAgcmV0dXJuIG9mZnNldCA/IHRoaXMuYmIhLnJlYWRJbnQzMih0aGlzLmJiX3BvcyArIG9mZnNldCkgOiAwOworfQorCittdXRhdGVfbWluYWxpZ24odmFsdWU6bnVtYmVyKTpib29sZWFuIHsKKyAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYiEuX19vZmZzZXQodGhpcy5iYl9wb3MsIDEwKTsKKworICBpZiAob2Zmc2V0ID09PSAwKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgdGhpcy5iYiEud3JpdGVJbnQzMih0aGlzLmJiX3BvcyArIG9mZnNldCwgdmFsdWUpOworICByZXR1cm4gdHJ1ZTsKK30KKworYnl0ZXNpemUoKTpudW1iZXIgeworICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiIS5fX29mZnNldCh0aGlzLmJiX3BvcywgMTIpOworICByZXR1cm4gb2Zmc2V0ID8gdGhpcy5iYiEucmVhZEludDMyKHRoaXMuYmJfcG9zICsgb2Zmc2V0KSA6IDA7Cit9CisKK211dGF0ZV9ieXRlc2l6ZSh2YWx1ZTpudW1iZXIpOmJvb2xlYW4geworICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiIS5fX29mZnNldCh0aGlzLmJiX3BvcywgMTIpOworCisgIGlmIChvZmZzZXQgPT09IDApIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICB0aGlzLmJiIS53cml0ZUludDMyKHRoaXMuYmJfcG9zICsgb2Zmc2V0LCB2YWx1ZSk7CisgIHJldHVybiB0cnVlOworfQorCithdHRyaWJ1dGVzKGluZGV4OiBudW1iZXIsIG9iaj86S2V5VmFsdWUpOktleVZhbHVlfG51bGwgeworICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiIS5fX29mZnNldCh0aGlzLmJiX3BvcywgMTQpOworICByZXR1cm4gb2Zmc2V0ID8gKG9iaiB8fCBuZXcgS2V5VmFsdWUoKSkuX19pbml0KHRoaXMuYmIhLl9faW5kaXJlY3QodGhpcy5iYiEuX192ZWN0b3IodGhpcy5iYl9wb3MgKyBvZmZzZXQpICsgaW5kZXggKiA0KSwgdGhpcy5iYiEpIDogbnVsbDsKK30KKworYXR0cmlidXRlc0xlbmd0aCgpOm51bWJlciB7CisgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIhLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCAxNCk7CisgIHJldHVybiBvZmZzZXQgPyB0aGlzLmJiIS5fX3ZlY3Rvcl9sZW4odGhpcy5iYl9wb3MgKyBvZmZzZXQpIDogMDsKK30KKworZG9jdW1lbnRhdGlvbihpbmRleDogbnVtYmVyKTpzdHJpbmcKK2RvY3VtZW50YXRpb24oaW5kZXg6IG51bWJlcixvcHRpb25hbEVuY29kaW5nOmZsYXRidWZmZXJzLkVuY29kaW5nKTpzdHJpbmd8VWludDhBcnJheQorZG9jdW1lbnRhdGlvbihpbmRleDogbnVtYmVyLG9wdGlvbmFsRW5jb2Rpbmc/OmFueSk6c3RyaW5nfFVpbnQ4QXJyYXl8bnVsbCB7CisgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIhLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCAxNik7CisgIHJldHVybiBvZmZzZXQgPyB0aGlzLmJiIS5fX3N0cmluZyh0aGlzLmJiIS5fX3ZlY3Rvcih0aGlzLmJiX3BvcyArIG9mZnNldCkgKyBpbmRleCAqIDQsIG9wdGlvbmFsRW5jb2RpbmcpIDogbnVsbDsKK30KKworZG9jdW1lbnRhdGlvbkxlbmd0aCgpOm51bWJlciB7CisgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIhLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCAxNik7CisgIHJldHVybiBvZmZzZXQgPyB0aGlzLmJiIS5fX3ZlY3Rvcl9sZW4odGhpcy5iYl9wb3MgKyBvZmZzZXQpIDogMDsKK30KKworLyoqCisgKiBGaWxlIHRoYXQgdGhpcyBPYmplY3QgaXMgZGVjbGFyZWQgaW4uCisgKi8KK2RlY2xhcmF0aW9uRmlsZSgpOnN0cmluZ3xudWxsCitkZWNsYXJhdGlvbkZpbGUob3B0aW9uYWxFbmNvZGluZzpmbGF0YnVmZmVycy5FbmNvZGluZyk6c3RyaW5nfFVpbnQ4QXJyYXl8bnVsbAorZGVjbGFyYXRpb25GaWxlKG9wdGlvbmFsRW5jb2Rpbmc/OmFueSk6c3RyaW5nfFVpbnQ4QXJyYXl8bnVsbCB7CisgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIhLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCAxOCk7CisgIHJldHVybiBvZmZzZXQgPyB0aGlzLmJiIS5fX3N0cmluZyh0aGlzLmJiX3BvcyArIG9mZnNldCwgb3B0aW9uYWxFbmNvZGluZykgOiBudWxsOworfQorCitzdGF0aWMgZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCk6c3RyaW5nIHsKKyAgcmV0dXJuICdyZWZsZWN0aW9uX09iamVjdCc7Cit9CisKK3N0YXRpYyBzdGFydE9iamVjdChidWlsZGVyOmZsYXRidWZmZXJzLkJ1aWxkZXIpIHsKKyAgYnVpbGRlci5zdGFydE9iamVjdCg4KTsKK30KKworc3RhdGljIGFkZE5hbWUoYnVpbGRlcjpmbGF0YnVmZmVycy5CdWlsZGVyLCBuYW1lT2Zmc2V0OmZsYXRidWZmZXJzLk9mZnNldCkgeworICBidWlsZGVyLmFkZEZpZWxkT2Zmc2V0KDAsIG5hbWVPZmZzZXQsIDApOworfQorCitzdGF0aWMgYWRkRmllbGRzKGJ1aWxkZXI6ZmxhdGJ1ZmZlcnMuQnVpbGRlciwgZmllbGRzT2Zmc2V0OmZsYXRidWZmZXJzLk9mZnNldCkgeworICBidWlsZGVyLmFkZEZpZWxkT2Zmc2V0KDEsIGZpZWxkc09mZnNldCwgMCk7Cit9CisKK3N0YXRpYyBjcmVhdGVGaWVsZHNWZWN0b3IoYnVpbGRlcjpmbGF0YnVmZmVycy5CdWlsZGVyLCBkYXRhOmZsYXRidWZmZXJzLk9mZnNldFtdKTpmbGF0YnVmZmVycy5PZmZzZXQgeworICBidWlsZGVyLnN0YXJ0VmVjdG9yKDQsIGRhdGEubGVuZ3RoLCA0KTsKKyAgZm9yIChsZXQgaSA9IGRhdGEubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHsKKyAgICBidWlsZGVyLmFkZE9mZnNldChkYXRhW2ldISk7CisgIH0KKyAgcmV0dXJuIGJ1aWxkZXIuZW5kVmVjdG9yKCk7Cit9CisKK3N0YXRpYyBzdGFydEZpZWxkc1ZlY3RvcihidWlsZGVyOmZsYXRidWZmZXJzLkJ1aWxkZXIsIG51bUVsZW1zOm51bWJlcikgeworICBidWlsZGVyLnN0YXJ0VmVjdG9yKDQsIG51bUVsZW1zLCA0KTsKK30KKworc3RhdGljIGFkZElzU3RydWN0KGJ1aWxkZXI6ZmxhdGJ1ZmZlcnMuQnVpbGRlciwgaXNTdHJ1Y3Q6Ym9vbGVhbikgeworICBidWlsZGVyLmFkZEZpZWxkSW50OCgyLCAraXNTdHJ1Y3QsICtmYWxzZSk7Cit9CisKK3N0YXRpYyBhZGRNaW5hbGlnbihidWlsZGVyOmZsYXRidWZmZXJzLkJ1aWxkZXIsIG1pbmFsaWduOm51bWJlcikgeworICBidWlsZGVyLmFkZEZpZWxkSW50MzIoMywgbWluYWxpZ24sIDApOworfQorCitzdGF0aWMgYWRkQnl0ZXNpemUoYnVpbGRlcjpmbGF0YnVmZmVycy5CdWlsZGVyLCBieXRlc2l6ZTpudW1iZXIpIHsKKyAgYnVpbGRlci5hZGRGaWVsZEludDMyKDQsIGJ5dGVzaXplLCAwKTsKK30KKworc3RhdGljIGFkZEF0dHJpYnV0ZXMoYnVpbGRlcjpmbGF0YnVmZmVycy5CdWlsZGVyLCBhdHRyaWJ1dGVzT2Zmc2V0OmZsYXRidWZmZXJzLk9mZnNldCkgeworICBidWlsZGVyLmFkZEZpZWxkT2Zmc2V0KDUsIGF0dHJpYnV0ZXNPZmZzZXQsIDApOworfQorCitzdGF0aWMgY3JlYXRlQXR0cmlidXRlc1ZlY3RvcihidWlsZGVyOmZsYXRidWZmZXJzLkJ1aWxkZXIsIGRhdGE6ZmxhdGJ1ZmZlcnMuT2Zmc2V0W10pOmZsYXRidWZmZXJzLk9mZnNldCB7CisgIGJ1aWxkZXIuc3RhcnRWZWN0b3IoNCwgZGF0YS5sZW5ndGgsIDQpOworICBmb3IgKGxldCBpID0gZGF0YS5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgeworICAgIGJ1aWxkZXIuYWRkT2Zmc2V0KGRhdGFbaV0hKTsKKyAgfQorICByZXR1cm4gYnVpbGRlci5lbmRWZWN0b3IoKTsKK30KKworc3RhdGljIHN0YXJ0QXR0cmlidXRlc1ZlY3RvcihidWlsZGVyOmZsYXRidWZmZXJzLkJ1aWxkZXIsIG51bUVsZW1zOm51bWJlcikgeworICBidWlsZGVyLnN0YXJ0VmVjdG9yKDQsIG51bUVsZW1zLCA0KTsKK30KKworc3RhdGljIGFkZERvY3VtZW50YXRpb24oYnVpbGRlcjpmbGF0YnVmZmVycy5CdWlsZGVyLCBkb2N1bWVudGF0aW9uT2Zmc2V0OmZsYXRidWZmZXJzLk9mZnNldCkgeworICBidWlsZGVyLmFkZEZpZWxkT2Zmc2V0KDYsIGRvY3VtZW50YXRpb25PZmZzZXQsIDApOworfQorCitzdGF0aWMgY3JlYXRlRG9jdW1lbnRhdGlvblZlY3RvcihidWlsZGVyOmZsYXRidWZmZXJzLkJ1aWxkZXIsIGRhdGE6ZmxhdGJ1ZmZlcnMuT2Zmc2V0W10pOmZsYXRidWZmZXJzLk9mZnNldCB7CisgIGJ1aWxkZXIuc3RhcnRWZWN0b3IoNCwgZGF0YS5sZW5ndGgsIDQpOworICBmb3IgKGxldCBpID0gZGF0YS5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgeworICAgIGJ1aWxkZXIuYWRkT2Zmc2V0KGRhdGFbaV0hKTsKKyAgfQorICByZXR1cm4gYnVpbGRlci5lbmRWZWN0b3IoKTsKK30KKworc3RhdGljIHN0YXJ0RG9jdW1lbnRhdGlvblZlY3RvcihidWlsZGVyOmZsYXRidWZmZXJzLkJ1aWxkZXIsIG51bUVsZW1zOm51bWJlcikgeworICBidWlsZGVyLnN0YXJ0VmVjdG9yKDQsIG51bUVsZW1zLCA0KTsKK30KKworc3RhdGljIGFkZERlY2xhcmF0aW9uRmlsZShidWlsZGVyOmZsYXRidWZmZXJzLkJ1aWxkZXIsIGRlY2xhcmF0aW9uRmlsZU9mZnNldDpmbGF0YnVmZmVycy5PZmZzZXQpIHsKKyAgYnVpbGRlci5hZGRGaWVsZE9mZnNldCg3LCBkZWNsYXJhdGlvbkZpbGVPZmZzZXQsIDApOworfQorCitzdGF0aWMgZW5kT2JqZWN0KGJ1aWxkZXI6ZmxhdGJ1ZmZlcnMuQnVpbGRlcik6ZmxhdGJ1ZmZlcnMuT2Zmc2V0IHsKKyAgY29uc3Qgb2Zmc2V0ID0gYnVpbGRlci5lbmRPYmplY3QoKTsKKyAgYnVpbGRlci5yZXF1aXJlZEZpZWxkKG9mZnNldCwgNCkgLy8gbmFtZQorICBidWlsZGVyLnJlcXVpcmVkRmllbGQob2Zmc2V0LCA2KSAvLyBmaWVsZHMKKyAgcmV0dXJuIG9mZnNldDsKK30KKworc3RhdGljIGNyZWF0ZU9iamVjdChidWlsZGVyOmZsYXRidWZmZXJzLkJ1aWxkZXIsIG5hbWVPZmZzZXQ6ZmxhdGJ1ZmZlcnMuT2Zmc2V0LCBmaWVsZHNPZmZzZXQ6ZmxhdGJ1ZmZlcnMuT2Zmc2V0LCBpc1N0cnVjdDpib29sZWFuLCBtaW5hbGlnbjpudW1iZXIsIGJ5dGVzaXplOm51bWJlciwgYXR0cmlidXRlc09mZnNldDpmbGF0YnVmZmVycy5PZmZzZXQsIGRvY3VtZW50YXRpb25PZmZzZXQ6ZmxhdGJ1ZmZlcnMuT2Zmc2V0LCBkZWNsYXJhdGlvbkZpbGVPZmZzZXQ6ZmxhdGJ1ZmZlcnMuT2Zmc2V0KTpmbGF0YnVmZmVycy5PZmZzZXQgeworICBPYmplY3RfLnN0YXJ0T2JqZWN0KGJ1aWxkZXIpOworICBPYmplY3RfLmFkZE5hbWUoYnVpbGRlciwgbmFtZU9mZnNldCk7CisgIE9iamVjdF8uYWRkRmllbGRzKGJ1aWxkZXIsIGZpZWxkc09mZnNldCk7CisgIE9iamVjdF8uYWRkSXNTdHJ1Y3QoYnVpbGRlciwgaXNTdHJ1Y3QpOworICBPYmplY3RfLmFkZE1pbmFsaWduKGJ1aWxkZXIsIG1pbmFsaWduKTsKKyAgT2JqZWN0Xy5hZGRCeXRlc2l6ZShidWlsZGVyLCBieXRlc2l6ZSk7CisgIE9iamVjdF8uYWRkQXR0cmlidXRlcyhidWlsZGVyLCBhdHRyaWJ1dGVzT2Zmc2V0KTsKKyAgT2JqZWN0Xy5hZGREb2N1bWVudGF0aW9uKGJ1aWxkZXIsIGRvY3VtZW50YXRpb25PZmZzZXQpOworICBPYmplY3RfLmFkZERlY2xhcmF0aW9uRmlsZShidWlsZGVyLCBkZWNsYXJhdGlvbkZpbGVPZmZzZXQpOworICByZXR1cm4gT2JqZWN0Xy5lbmRPYmplY3QoYnVpbGRlcik7Cit9CisKK3VucGFjaygpOiBPYmplY3RfVCB7CisgIHJldHVybiBuZXcgT2JqZWN0X1QoCisgICAgdGhpcy5uYW1lKCksCisgICAgdGhpcy5iYiEuY3JlYXRlT2JqTGlzdCh0aGlzLmZpZWxkcy5iaW5kKHRoaXMpLCB0aGlzLmZpZWxkc0xlbmd0aCgpKSwKKyAgICB0aGlzLmlzU3RydWN0KCksCisgICAgdGhpcy5taW5hbGlnbigpLAorICAgIHRoaXMuYnl0ZXNpemUoKSwKKyAgICB0aGlzLmJiIS5jcmVhdGVPYmpMaXN0KHRoaXMuYXR0cmlidXRlcy5iaW5kKHRoaXMpLCB0aGlzLmF0dHJpYnV0ZXNMZW5ndGgoKSksCisgICAgdGhpcy5iYiEuY3JlYXRlU2NhbGFyTGlzdCh0aGlzLmRvY3VtZW50YXRpb24uYmluZCh0aGlzKSwgdGhpcy5kb2N1bWVudGF0aW9uTGVuZ3RoKCkpLAorICAgIHRoaXMuZGVjbGFyYXRpb25GaWxlKCkKKyAgKTsKK30KKworCit1bnBhY2tUbyhfbzogT2JqZWN0X1QpOiB2b2lkIHsKKyAgX28ubmFtZSA9IHRoaXMubmFtZSgpOworICBfby5maWVsZHMgPSB0aGlzLmJiIS5jcmVhdGVPYmpMaXN0KHRoaXMuZmllbGRzLmJpbmQodGhpcyksIHRoaXMuZmllbGRzTGVuZ3RoKCkpOworICBfby5pc1N0cnVjdCA9IHRoaXMuaXNTdHJ1Y3QoKTsKKyAgX28ubWluYWxpZ24gPSB0aGlzLm1pbmFsaWduKCk7CisgIF9vLmJ5dGVzaXplID0gdGhpcy5ieXRlc2l6ZSgpOworICBfby5hdHRyaWJ1dGVzID0gdGhpcy5iYiEuY3JlYXRlT2JqTGlzdCh0aGlzLmF0dHJpYnV0ZXMuYmluZCh0aGlzKSwgdGhpcy5hdHRyaWJ1dGVzTGVuZ3RoKCkpOworICBfby5kb2N1bWVudGF0aW9uID0gdGhpcy5iYiEuY3JlYXRlU2NhbGFyTGlzdCh0aGlzLmRvY3VtZW50YXRpb24uYmluZCh0aGlzKSwgdGhpcy5kb2N1bWVudGF0aW9uTGVuZ3RoKCkpOworICBfby5kZWNsYXJhdGlvbkZpbGUgPSB0aGlzLmRlY2xhcmF0aW9uRmlsZSgpOworfQorfQorCitleHBvcnQgY2xhc3MgT2JqZWN0X1QgeworY29uc3RydWN0b3IoCisgIHB1YmxpYyBuYW1lOiBzdHJpbmd8VWludDhBcnJheXxudWxsID0gbnVsbCwKKyAgcHVibGljIGZpZWxkczogKEZpZWxkVClbXSA9IFtdLAorICBwdWJsaWMgaXNTdHJ1Y3Q6IGJvb2xlYW4gPSBmYWxzZSwKKyAgcHVibGljIG1pbmFsaWduOiBudW1iZXIgPSAwLAorICBwdWJsaWMgYnl0ZXNpemU6IG51bWJlciA9IDAsCisgIHB1YmxpYyBhdHRyaWJ1dGVzOiAoS2V5VmFsdWVUKVtdID0gW10sCisgIHB1YmxpYyBkb2N1bWVudGF0aW9uOiAoc3RyaW5nKVtdID0gW10sCisgIHB1YmxpYyBkZWNsYXJhdGlvbkZpbGU6IHN0cmluZ3xVaW50OEFycmF5fG51bGwgPSBudWxsCispe30KKworCitwYWNrKGJ1aWxkZXI6ZmxhdGJ1ZmZlcnMuQnVpbGRlcik6IGZsYXRidWZmZXJzLk9mZnNldCB7CisgIGNvbnN0IG5hbWUgPSAodGhpcy5uYW1lICE9PSBudWxsID8gYnVpbGRlci5jcmVhdGVTdHJpbmcodGhpcy5uYW1lISkgOiAwKTsKKyAgY29uc3QgZmllbGRzID0gT2JqZWN0Xy5jcmVhdGVGaWVsZHNWZWN0b3IoYnVpbGRlciwgYnVpbGRlci5jcmVhdGVPYmplY3RPZmZzZXRMaXN0KHRoaXMuZmllbGRzKSk7CisgIGNvbnN0IGF0dHJpYnV0ZXMgPSBPYmplY3RfLmNyZWF0ZUF0dHJpYnV0ZXNWZWN0b3IoYnVpbGRlciwgYnVpbGRlci5jcmVhdGVPYmplY3RPZmZzZXRMaXN0KHRoaXMuYXR0cmlidXRlcykpOworICBjb25zdCBkb2N1bWVudGF0aW9uID0gT2JqZWN0Xy5jcmVhdGVEb2N1bWVudGF0aW9uVmVjdG9yKGJ1aWxkZXIsIGJ1aWxkZXIuY3JlYXRlT2JqZWN0T2Zmc2V0TGlzdCh0aGlzLmRvY3VtZW50YXRpb24pKTsKKyAgY29uc3QgZGVjbGFyYXRpb25GaWxlID0gKHRoaXMuZGVjbGFyYXRpb25GaWxlICE9PSBudWxsID8gYnVpbGRlci5jcmVhdGVTdHJpbmcodGhpcy5kZWNsYXJhdGlvbkZpbGUhKSA6IDApOworCisgIHJldHVybiBPYmplY3RfLmNyZWF0ZU9iamVjdChidWlsZGVyLAorICAgIG5hbWUsCisgICAgZmllbGRzLAorICAgIHRoaXMuaXNTdHJ1Y3QsCisgICAgdGhpcy5taW5hbGlnbiwKKyAgICB0aGlzLmJ5dGVzaXplLAorICAgIGF0dHJpYnV0ZXMsCisgICAgZG9jdW1lbnRhdGlvbiwKKyAgICBkZWNsYXJhdGlvbkZpbGUKKyAgKTsKK30KK30KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL3RzL3JlZmxlY3Rpb24vcnBjY2FsbC5qcyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL3RzL3JlZmxlY3Rpb24vcnBjY2FsbC5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NmU5MmViCi0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvdHMvcmVmbGVjdGlvbi9ycGNjYWxsLmpzCkBAIC0wLDAgKzEsMTMxIEBACisvLyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBieSB0aGUgRmxhdEJ1ZmZlcnMgY29tcGlsZXIsIGRvIG5vdCBtb2RpZnkKK2ltcG9ydCAqIGFzIGZsYXRidWZmZXJzIGZyb20gJ2ZsYXRidWZmZXJzJzsKK2ltcG9ydCB7IEtleVZhbHVlIH0gZnJvbSAnLi4vcmVmbGVjdGlvbi9rZXktdmFsdWUuanMnOworaW1wb3J0IHsgT2JqZWN0XyB9IGZyb20gJy4uL3JlZmxlY3Rpb24vb2JqZWN0LmpzJzsKK2V4cG9ydCBjbGFzcyBSUENDYWxsIHsKKyAgICBjb25zdHJ1Y3RvcigpIHsKKyAgICAgICAgdGhpcy5iYiA9IG51bGw7CisgICAgICAgIHRoaXMuYmJfcG9zID0gMDsKKyAgICB9CisgICAgX19pbml0KGksIGJiKSB7CisgICAgICAgIHRoaXMuYmJfcG9zID0gaTsKKyAgICAgICAgdGhpcy5iYiA9IGJiOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisgICAgc3RhdGljIGdldFJvb3RBc1JQQ0NhbGwoYmIsIG9iaikgeworICAgICAgICByZXR1cm4gKG9iaiB8fCBuZXcgUlBDQ2FsbCgpKS5fX2luaXQoYmIucmVhZEludDMyKGJiLnBvc2l0aW9uKCkpICsgYmIucG9zaXRpb24oKSwgYmIpOworICAgIH0KKyAgICBzdGF0aWMgZ2V0U2l6ZVByZWZpeGVkUm9vdEFzUlBDQ2FsbChiYiwgb2JqKSB7CisgICAgICAgIGJiLnNldFBvc2l0aW9uKGJiLnBvc2l0aW9uKCkgKyBmbGF0YnVmZmVycy5TSVpFX1BSRUZJWF9MRU5HVEgpOworICAgICAgICByZXR1cm4gKG9iaiB8fCBuZXcgUlBDQ2FsbCgpKS5fX2luaXQoYmIucmVhZEludDMyKGJiLnBvc2l0aW9uKCkpICsgYmIucG9zaXRpb24oKSwgYmIpOworICAgIH0KKyAgICBuYW1lKG9wdGlvbmFsRW5jb2RpbmcpIHsKKyAgICAgICAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywgNCk7CisgICAgICAgIHJldHVybiBvZmZzZXQgPyB0aGlzLmJiLl9fc3RyaW5nKHRoaXMuYmJfcG9zICsgb2Zmc2V0LCBvcHRpb25hbEVuY29kaW5nKSA6IG51bGw7CisgICAgfQorICAgIHJlcXVlc3Qob2JqKSB7CisgICAgICAgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsIDYpOworICAgICAgICByZXR1cm4gb2Zmc2V0ID8gKG9iaiB8fCBuZXcgT2JqZWN0XygpKS5fX2luaXQodGhpcy5iYi5fX2luZGlyZWN0KHRoaXMuYmJfcG9zICsgb2Zmc2V0KSwgdGhpcy5iYikgOiBudWxsOworICAgIH0KKyAgICByZXNwb25zZShvYmopIHsKKyAgICAgICAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywgOCk7CisgICAgICAgIHJldHVybiBvZmZzZXQgPyAob2JqIHx8IG5ldyBPYmplY3RfKCkpLl9faW5pdCh0aGlzLmJiLl9faW5kaXJlY3QodGhpcy5iYl9wb3MgKyBvZmZzZXQpLCB0aGlzLmJiKSA6IG51bGw7CisgICAgfQorICAgIGF0dHJpYnV0ZXMoaW5kZXgsIG9iaikgeworICAgICAgICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCAxMCk7CisgICAgICAgIHJldHVybiBvZmZzZXQgPyAob2JqIHx8IG5ldyBLZXlWYWx1ZSgpKS5fX2luaXQodGhpcy5iYi5fX2luZGlyZWN0KHRoaXMuYmIuX192ZWN0b3IodGhpcy5iYl9wb3MgKyBvZmZzZXQpICsgaW5kZXggKiA0KSwgdGhpcy5iYikgOiBudWxsOworICAgIH0KKyAgICBhdHRyaWJ1dGVzTGVuZ3RoKCkgeworICAgICAgICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCAxMCk7CisgICAgICAgIHJldHVybiBvZmZzZXQgPyB0aGlzLmJiLl9fdmVjdG9yX2xlbih0aGlzLmJiX3BvcyArIG9mZnNldCkgOiAwOworICAgIH0KKyAgICBkb2N1bWVudGF0aW9uKGluZGV4LCBvcHRpb25hbEVuY29kaW5nKSB7CisgICAgICAgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsIDEyKTsKKyAgICAgICAgcmV0dXJuIG9mZnNldCA/IHRoaXMuYmIuX19zdHJpbmcodGhpcy5iYi5fX3ZlY3Rvcih0aGlzLmJiX3BvcyArIG9mZnNldCkgKyBpbmRleCAqIDQsIG9wdGlvbmFsRW5jb2RpbmcpIDogbnVsbDsKKyAgICB9CisgICAgZG9jdW1lbnRhdGlvbkxlbmd0aCgpIHsKKyAgICAgICAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywgMTIpOworICAgICAgICByZXR1cm4gb2Zmc2V0ID8gdGhpcy5iYi5fX3ZlY3Rvcl9sZW4odGhpcy5iYl9wb3MgKyBvZmZzZXQpIDogMDsKKyAgICB9CisgICAgc3RhdGljIGdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpIHsKKyAgICAgICAgcmV0dXJuICdyZWZsZWN0aW9uX1JQQ0NhbGwnOworICAgIH0KKyAgICBzdGF0aWMgc3RhcnRSUENDYWxsKGJ1aWxkZXIpIHsKKyAgICAgICAgYnVpbGRlci5zdGFydE9iamVjdCg1KTsKKyAgICB9CisgICAgc3RhdGljIGFkZE5hbWUoYnVpbGRlciwgbmFtZU9mZnNldCkgeworICAgICAgICBidWlsZGVyLmFkZEZpZWxkT2Zmc2V0KDAsIG5hbWVPZmZzZXQsIDApOworICAgIH0KKyAgICBzdGF0aWMgYWRkUmVxdWVzdChidWlsZGVyLCByZXF1ZXN0T2Zmc2V0KSB7CisgICAgICAgIGJ1aWxkZXIuYWRkRmllbGRPZmZzZXQoMSwgcmVxdWVzdE9mZnNldCwgMCk7CisgICAgfQorICAgIHN0YXRpYyBhZGRSZXNwb25zZShidWlsZGVyLCByZXNwb25zZU9mZnNldCkgeworICAgICAgICBidWlsZGVyLmFkZEZpZWxkT2Zmc2V0KDIsIHJlc3BvbnNlT2Zmc2V0LCAwKTsKKyAgICB9CisgICAgc3RhdGljIGFkZEF0dHJpYnV0ZXMoYnVpbGRlciwgYXR0cmlidXRlc09mZnNldCkgeworICAgICAgICBidWlsZGVyLmFkZEZpZWxkT2Zmc2V0KDMsIGF0dHJpYnV0ZXNPZmZzZXQsIDApOworICAgIH0KKyAgICBzdGF0aWMgY3JlYXRlQXR0cmlidXRlc1ZlY3RvcihidWlsZGVyLCBkYXRhKSB7CisgICAgICAgIGJ1aWxkZXIuc3RhcnRWZWN0b3IoNCwgZGF0YS5sZW5ndGgsIDQpOworICAgICAgICBmb3IgKGxldCBpID0gZGF0YS5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgeworICAgICAgICAgICAgYnVpbGRlci5hZGRPZmZzZXQoZGF0YVtpXSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGJ1aWxkZXIuZW5kVmVjdG9yKCk7CisgICAgfQorICAgIHN0YXRpYyBzdGFydEF0dHJpYnV0ZXNWZWN0b3IoYnVpbGRlciwgbnVtRWxlbXMpIHsKKyAgICAgICAgYnVpbGRlci5zdGFydFZlY3Rvcig0LCBudW1FbGVtcywgNCk7CisgICAgfQorICAgIHN0YXRpYyBhZGREb2N1bWVudGF0aW9uKGJ1aWxkZXIsIGRvY3VtZW50YXRpb25PZmZzZXQpIHsKKyAgICAgICAgYnVpbGRlci5hZGRGaWVsZE9mZnNldCg0LCBkb2N1bWVudGF0aW9uT2Zmc2V0LCAwKTsKKyAgICB9CisgICAgc3RhdGljIGNyZWF0ZURvY3VtZW50YXRpb25WZWN0b3IoYnVpbGRlciwgZGF0YSkgeworICAgICAgICBidWlsZGVyLnN0YXJ0VmVjdG9yKDQsIGRhdGEubGVuZ3RoLCA0KTsKKyAgICAgICAgZm9yIChsZXQgaSA9IGRhdGEubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHsKKyAgICAgICAgICAgIGJ1aWxkZXIuYWRkT2Zmc2V0KGRhdGFbaV0pOworICAgICAgICB9CisgICAgICAgIHJldHVybiBidWlsZGVyLmVuZFZlY3RvcigpOworICAgIH0KKyAgICBzdGF0aWMgc3RhcnREb2N1bWVudGF0aW9uVmVjdG9yKGJ1aWxkZXIsIG51bUVsZW1zKSB7CisgICAgICAgIGJ1aWxkZXIuc3RhcnRWZWN0b3IoNCwgbnVtRWxlbXMsIDQpOworICAgIH0KKyAgICBzdGF0aWMgZW5kUlBDQ2FsbChidWlsZGVyKSB7CisgICAgICAgIGNvbnN0IG9mZnNldCA9IGJ1aWxkZXIuZW5kT2JqZWN0KCk7CisgICAgICAgIGJ1aWxkZXIucmVxdWlyZWRGaWVsZChvZmZzZXQsIDQpOyAvLyBuYW1lCisgICAgICAgIGJ1aWxkZXIucmVxdWlyZWRGaWVsZChvZmZzZXQsIDYpOyAvLyByZXF1ZXN0CisgICAgICAgIGJ1aWxkZXIucmVxdWlyZWRGaWVsZChvZmZzZXQsIDgpOyAvLyByZXNwb25zZQorICAgICAgICByZXR1cm4gb2Zmc2V0OworICAgIH0KKyAgICB1bnBhY2soKSB7CisgICAgICAgIHJldHVybiBuZXcgUlBDQ2FsbFQodGhpcy5uYW1lKCksICh0aGlzLnJlcXVlc3QoKSAhPT0gbnVsbCA/IHRoaXMucmVxdWVzdCgpLnVucGFjaygpIDogbnVsbCksICh0aGlzLnJlc3BvbnNlKCkgIT09IG51bGwgPyB0aGlzLnJlc3BvbnNlKCkudW5wYWNrKCkgOiBudWxsKSwgdGhpcy5iYi5jcmVhdGVPYmpMaXN0KHRoaXMuYXR0cmlidXRlcy5iaW5kKHRoaXMpLCB0aGlzLmF0dHJpYnV0ZXNMZW5ndGgoKSksIHRoaXMuYmIuY3JlYXRlU2NhbGFyTGlzdCh0aGlzLmRvY3VtZW50YXRpb24uYmluZCh0aGlzKSwgdGhpcy5kb2N1bWVudGF0aW9uTGVuZ3RoKCkpKTsKKyAgICB9CisgICAgdW5wYWNrVG8oX28pIHsKKyAgICAgICAgX28ubmFtZSA9IHRoaXMubmFtZSgpOworICAgICAgICBfby5yZXF1ZXN0ID0gKHRoaXMucmVxdWVzdCgpICE9PSBudWxsID8gdGhpcy5yZXF1ZXN0KCkudW5wYWNrKCkgOiBudWxsKTsKKyAgICAgICAgX28ucmVzcG9uc2UgPSAodGhpcy5yZXNwb25zZSgpICE9PSBudWxsID8gdGhpcy5yZXNwb25zZSgpLnVucGFjaygpIDogbnVsbCk7CisgICAgICAgIF9vLmF0dHJpYnV0ZXMgPSB0aGlzLmJiLmNyZWF0ZU9iakxpc3QodGhpcy5hdHRyaWJ1dGVzLmJpbmQodGhpcyksIHRoaXMuYXR0cmlidXRlc0xlbmd0aCgpKTsKKyAgICAgICAgX28uZG9jdW1lbnRhdGlvbiA9IHRoaXMuYmIuY3JlYXRlU2NhbGFyTGlzdCh0aGlzLmRvY3VtZW50YXRpb24uYmluZCh0aGlzKSwgdGhpcy5kb2N1bWVudGF0aW9uTGVuZ3RoKCkpOworICAgIH0KK30KK2V4cG9ydCBjbGFzcyBSUENDYWxsVCB7CisgICAgY29uc3RydWN0b3IobmFtZSA9IG51bGwsIHJlcXVlc3QgPSBudWxsLCByZXNwb25zZSA9IG51bGwsIGF0dHJpYnV0ZXMgPSBbXSwgZG9jdW1lbnRhdGlvbiA9IFtdKSB7CisgICAgICAgIHRoaXMubmFtZSA9IG5hbWU7CisgICAgICAgIHRoaXMucmVxdWVzdCA9IHJlcXVlc3Q7CisgICAgICAgIHRoaXMucmVzcG9uc2UgPSByZXNwb25zZTsKKyAgICAgICAgdGhpcy5hdHRyaWJ1dGVzID0gYXR0cmlidXRlczsKKyAgICAgICAgdGhpcy5kb2N1bWVudGF0aW9uID0gZG9jdW1lbnRhdGlvbjsKKyAgICB9CisgICAgcGFjayhidWlsZGVyKSB7CisgICAgICAgIGNvbnN0IG5hbWUgPSAodGhpcy5uYW1lICE9PSBudWxsID8gYnVpbGRlci5jcmVhdGVTdHJpbmcodGhpcy5uYW1lKSA6IDApOworICAgICAgICBjb25zdCByZXF1ZXN0ID0gKHRoaXMucmVxdWVzdCAhPT0gbnVsbCA/IHRoaXMucmVxdWVzdC5wYWNrKGJ1aWxkZXIpIDogMCk7CisgICAgICAgIGNvbnN0IHJlc3BvbnNlID0gKHRoaXMucmVzcG9uc2UgIT09IG51bGwgPyB0aGlzLnJlc3BvbnNlLnBhY2soYnVpbGRlcikgOiAwKTsKKyAgICAgICAgY29uc3QgYXR0cmlidXRlcyA9IFJQQ0NhbGwuY3JlYXRlQXR0cmlidXRlc1ZlY3RvcihidWlsZGVyLCBidWlsZGVyLmNyZWF0ZU9iamVjdE9mZnNldExpc3QodGhpcy5hdHRyaWJ1dGVzKSk7CisgICAgICAgIGNvbnN0IGRvY3VtZW50YXRpb24gPSBSUENDYWxsLmNyZWF0ZURvY3VtZW50YXRpb25WZWN0b3IoYnVpbGRlciwgYnVpbGRlci5jcmVhdGVPYmplY3RPZmZzZXRMaXN0KHRoaXMuZG9jdW1lbnRhdGlvbikpOworICAgICAgICBSUENDYWxsLnN0YXJ0UlBDQ2FsbChidWlsZGVyKTsKKyAgICAgICAgUlBDQ2FsbC5hZGROYW1lKGJ1aWxkZXIsIG5hbWUpOworICAgICAgICBSUENDYWxsLmFkZFJlcXVlc3QoYnVpbGRlciwgcmVxdWVzdCk7CisgICAgICAgIFJQQ0NhbGwuYWRkUmVzcG9uc2UoYnVpbGRlciwgcmVzcG9uc2UpOworICAgICAgICBSUENDYWxsLmFkZEF0dHJpYnV0ZXMoYnVpbGRlciwgYXR0cmlidXRlcyk7CisgICAgICAgIFJQQ0NhbGwuYWRkRG9jdW1lbnRhdGlvbihidWlsZGVyLCBkb2N1bWVudGF0aW9uKTsKKyAgICAgICAgcmV0dXJuIFJQQ0NhbGwuZW5kUlBDQ2FsbChidWlsZGVyKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy90cy9yZWZsZWN0aW9uL3JwY2NhbGwudHMgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy90cy9yZWZsZWN0aW9uL3JwY2NhbGwudHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTUxZDdiMQotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL3RzL3JlZmxlY3Rpb24vcnBjY2FsbC50cwpAQCAtMCwwICsxLDE3MyBAQAorLy8gYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgYnkgdGhlIEZsYXRCdWZmZXJzIGNvbXBpbGVyLCBkbyBub3QgbW9kaWZ5CisKK2ltcG9ydCAqIGFzIGZsYXRidWZmZXJzIGZyb20gJ2ZsYXRidWZmZXJzJzsKKworaW1wb3J0IHsgS2V5VmFsdWUsIEtleVZhbHVlVCB9IGZyb20gJy4uL3JlZmxlY3Rpb24va2V5LXZhbHVlLmpzJzsKK2ltcG9ydCB7IE9iamVjdF8sIE9iamVjdF9UIH0gZnJvbSAnLi4vcmVmbGVjdGlvbi9vYmplY3QuanMnOworCisKK2V4cG9ydCBjbGFzcyBSUENDYWxsIHsKKyAgYmI6IGZsYXRidWZmZXJzLkJ5dGVCdWZmZXJ8bnVsbCA9IG51bGw7CisgIGJiX3BvcyA9IDA7CisgIF9faW5pdChpOm51bWJlciwgYmI6ZmxhdGJ1ZmZlcnMuQnl0ZUJ1ZmZlcik6UlBDQ2FsbCB7CisgIHRoaXMuYmJfcG9zID0gaTsKKyAgdGhpcy5iYiA9IGJiOworICByZXR1cm4gdGhpczsKK30KKworc3RhdGljIGdldFJvb3RBc1JQQ0NhbGwoYmI6ZmxhdGJ1ZmZlcnMuQnl0ZUJ1ZmZlciwgb2JqPzpSUENDYWxsKTpSUENDYWxsIHsKKyAgcmV0dXJuIChvYmogfHwgbmV3IFJQQ0NhbGwoKSkuX19pbml0KGJiLnJlYWRJbnQzMihiYi5wb3NpdGlvbigpKSArIGJiLnBvc2l0aW9uKCksIGJiKTsKK30KKworc3RhdGljIGdldFNpemVQcmVmaXhlZFJvb3RBc1JQQ0NhbGwoYmI6ZmxhdGJ1ZmZlcnMuQnl0ZUJ1ZmZlciwgb2JqPzpSUENDYWxsKTpSUENDYWxsIHsKKyAgYmIuc2V0UG9zaXRpb24oYmIucG9zaXRpb24oKSArIGZsYXRidWZmZXJzLlNJWkVfUFJFRklYX0xFTkdUSCk7CisgIHJldHVybiAob2JqIHx8IG5ldyBSUENDYWxsKCkpLl9faW5pdChiYi5yZWFkSW50MzIoYmIucG9zaXRpb24oKSkgKyBiYi5wb3NpdGlvbigpLCBiYik7Cit9CisKK25hbWUoKTpzdHJpbmd8bnVsbAorbmFtZShvcHRpb25hbEVuY29kaW5nOmZsYXRidWZmZXJzLkVuY29kaW5nKTpzdHJpbmd8VWludDhBcnJheXxudWxsCituYW1lKG9wdGlvbmFsRW5jb2Rpbmc/OmFueSk6c3RyaW5nfFVpbnQ4QXJyYXl8bnVsbCB7CisgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIhLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCA0KTsKKyAgcmV0dXJuIG9mZnNldCA/IHRoaXMuYmIhLl9fc3RyaW5nKHRoaXMuYmJfcG9zICsgb2Zmc2V0LCBvcHRpb25hbEVuY29kaW5nKSA6IG51bGw7Cit9CisKK3JlcXVlc3Qob2JqPzpPYmplY3RfKTpPYmplY3RffG51bGwgeworICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiIS5fX29mZnNldCh0aGlzLmJiX3BvcywgNik7CisgIHJldHVybiBvZmZzZXQgPyAob2JqIHx8IG5ldyBPYmplY3RfKCkpLl9faW5pdCh0aGlzLmJiIS5fX2luZGlyZWN0KHRoaXMuYmJfcG9zICsgb2Zmc2V0KSwgdGhpcy5iYiEpIDogbnVsbDsKK30KKworcmVzcG9uc2Uob2JqPzpPYmplY3RfKTpPYmplY3RffG51bGwgeworICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiIS5fX29mZnNldCh0aGlzLmJiX3BvcywgOCk7CisgIHJldHVybiBvZmZzZXQgPyAob2JqIHx8IG5ldyBPYmplY3RfKCkpLl9faW5pdCh0aGlzLmJiIS5fX2luZGlyZWN0KHRoaXMuYmJfcG9zICsgb2Zmc2V0KSwgdGhpcy5iYiEpIDogbnVsbDsKK30KKworYXR0cmlidXRlcyhpbmRleDogbnVtYmVyLCBvYmo/OktleVZhbHVlKTpLZXlWYWx1ZXxudWxsIHsKKyAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYiEuX19vZmZzZXQodGhpcy5iYl9wb3MsIDEwKTsKKyAgcmV0dXJuIG9mZnNldCA/IChvYmogfHwgbmV3IEtleVZhbHVlKCkpLl9faW5pdCh0aGlzLmJiIS5fX2luZGlyZWN0KHRoaXMuYmIhLl9fdmVjdG9yKHRoaXMuYmJfcG9zICsgb2Zmc2V0KSArIGluZGV4ICogNCksIHRoaXMuYmIhKSA6IG51bGw7Cit9CisKK2F0dHJpYnV0ZXNMZW5ndGgoKTpudW1iZXIgeworICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiIS5fX29mZnNldCh0aGlzLmJiX3BvcywgMTApOworICByZXR1cm4gb2Zmc2V0ID8gdGhpcy5iYiEuX192ZWN0b3JfbGVuKHRoaXMuYmJfcG9zICsgb2Zmc2V0KSA6IDA7Cit9CisKK2RvY3VtZW50YXRpb24oaW5kZXg6IG51bWJlcik6c3RyaW5nCitkb2N1bWVudGF0aW9uKGluZGV4OiBudW1iZXIsb3B0aW9uYWxFbmNvZGluZzpmbGF0YnVmZmVycy5FbmNvZGluZyk6c3RyaW5nfFVpbnQ4QXJyYXkKK2RvY3VtZW50YXRpb24oaW5kZXg6IG51bWJlcixvcHRpb25hbEVuY29kaW5nPzphbnkpOnN0cmluZ3xVaW50OEFycmF5fG51bGwgeworICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiIS5fX29mZnNldCh0aGlzLmJiX3BvcywgMTIpOworICByZXR1cm4gb2Zmc2V0ID8gdGhpcy5iYiEuX19zdHJpbmcodGhpcy5iYiEuX192ZWN0b3IodGhpcy5iYl9wb3MgKyBvZmZzZXQpICsgaW5kZXggKiA0LCBvcHRpb25hbEVuY29kaW5nKSA6IG51bGw7Cit9CisKK2RvY3VtZW50YXRpb25MZW5ndGgoKTpudW1iZXIgeworICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiIS5fX29mZnNldCh0aGlzLmJiX3BvcywgMTIpOworICByZXR1cm4gb2Zmc2V0ID8gdGhpcy5iYiEuX192ZWN0b3JfbGVuKHRoaXMuYmJfcG9zICsgb2Zmc2V0KSA6IDA7Cit9CisKK3N0YXRpYyBnZXRGdWxseVF1YWxpZmllZE5hbWUoKTpzdHJpbmcgeworICByZXR1cm4gJ3JlZmxlY3Rpb25fUlBDQ2FsbCc7Cit9CisKK3N0YXRpYyBzdGFydFJQQ0NhbGwoYnVpbGRlcjpmbGF0YnVmZmVycy5CdWlsZGVyKSB7CisgIGJ1aWxkZXIuc3RhcnRPYmplY3QoNSk7Cit9CisKK3N0YXRpYyBhZGROYW1lKGJ1aWxkZXI6ZmxhdGJ1ZmZlcnMuQnVpbGRlciwgbmFtZU9mZnNldDpmbGF0YnVmZmVycy5PZmZzZXQpIHsKKyAgYnVpbGRlci5hZGRGaWVsZE9mZnNldCgwLCBuYW1lT2Zmc2V0LCAwKTsKK30KKworc3RhdGljIGFkZFJlcXVlc3QoYnVpbGRlcjpmbGF0YnVmZmVycy5CdWlsZGVyLCByZXF1ZXN0T2Zmc2V0OmZsYXRidWZmZXJzLk9mZnNldCkgeworICBidWlsZGVyLmFkZEZpZWxkT2Zmc2V0KDEsIHJlcXVlc3RPZmZzZXQsIDApOworfQorCitzdGF0aWMgYWRkUmVzcG9uc2UoYnVpbGRlcjpmbGF0YnVmZmVycy5CdWlsZGVyLCByZXNwb25zZU9mZnNldDpmbGF0YnVmZmVycy5PZmZzZXQpIHsKKyAgYnVpbGRlci5hZGRGaWVsZE9mZnNldCgyLCByZXNwb25zZU9mZnNldCwgMCk7Cit9CisKK3N0YXRpYyBhZGRBdHRyaWJ1dGVzKGJ1aWxkZXI6ZmxhdGJ1ZmZlcnMuQnVpbGRlciwgYXR0cmlidXRlc09mZnNldDpmbGF0YnVmZmVycy5PZmZzZXQpIHsKKyAgYnVpbGRlci5hZGRGaWVsZE9mZnNldCgzLCBhdHRyaWJ1dGVzT2Zmc2V0LCAwKTsKK30KKworc3RhdGljIGNyZWF0ZUF0dHJpYnV0ZXNWZWN0b3IoYnVpbGRlcjpmbGF0YnVmZmVycy5CdWlsZGVyLCBkYXRhOmZsYXRidWZmZXJzLk9mZnNldFtdKTpmbGF0YnVmZmVycy5PZmZzZXQgeworICBidWlsZGVyLnN0YXJ0VmVjdG9yKDQsIGRhdGEubGVuZ3RoLCA0KTsKKyAgZm9yIChsZXQgaSA9IGRhdGEubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHsKKyAgICBidWlsZGVyLmFkZE9mZnNldChkYXRhW2ldISk7CisgIH0KKyAgcmV0dXJuIGJ1aWxkZXIuZW5kVmVjdG9yKCk7Cit9CisKK3N0YXRpYyBzdGFydEF0dHJpYnV0ZXNWZWN0b3IoYnVpbGRlcjpmbGF0YnVmZmVycy5CdWlsZGVyLCBudW1FbGVtczpudW1iZXIpIHsKKyAgYnVpbGRlci5zdGFydFZlY3Rvcig0LCBudW1FbGVtcywgNCk7Cit9CisKK3N0YXRpYyBhZGREb2N1bWVudGF0aW9uKGJ1aWxkZXI6ZmxhdGJ1ZmZlcnMuQnVpbGRlciwgZG9jdW1lbnRhdGlvbk9mZnNldDpmbGF0YnVmZmVycy5PZmZzZXQpIHsKKyAgYnVpbGRlci5hZGRGaWVsZE9mZnNldCg0LCBkb2N1bWVudGF0aW9uT2Zmc2V0LCAwKTsKK30KKworc3RhdGljIGNyZWF0ZURvY3VtZW50YXRpb25WZWN0b3IoYnVpbGRlcjpmbGF0YnVmZmVycy5CdWlsZGVyLCBkYXRhOmZsYXRidWZmZXJzLk9mZnNldFtdKTpmbGF0YnVmZmVycy5PZmZzZXQgeworICBidWlsZGVyLnN0YXJ0VmVjdG9yKDQsIGRhdGEubGVuZ3RoLCA0KTsKKyAgZm9yIChsZXQgaSA9IGRhdGEubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHsKKyAgICBidWlsZGVyLmFkZE9mZnNldChkYXRhW2ldISk7CisgIH0KKyAgcmV0dXJuIGJ1aWxkZXIuZW5kVmVjdG9yKCk7Cit9CisKK3N0YXRpYyBzdGFydERvY3VtZW50YXRpb25WZWN0b3IoYnVpbGRlcjpmbGF0YnVmZmVycy5CdWlsZGVyLCBudW1FbGVtczpudW1iZXIpIHsKKyAgYnVpbGRlci5zdGFydFZlY3Rvcig0LCBudW1FbGVtcywgNCk7Cit9CisKK3N0YXRpYyBlbmRSUENDYWxsKGJ1aWxkZXI6ZmxhdGJ1ZmZlcnMuQnVpbGRlcik6ZmxhdGJ1ZmZlcnMuT2Zmc2V0IHsKKyAgY29uc3Qgb2Zmc2V0ID0gYnVpbGRlci5lbmRPYmplY3QoKTsKKyAgYnVpbGRlci5yZXF1aXJlZEZpZWxkKG9mZnNldCwgNCkgLy8gbmFtZQorICBidWlsZGVyLnJlcXVpcmVkRmllbGQob2Zmc2V0LCA2KSAvLyByZXF1ZXN0CisgIGJ1aWxkZXIucmVxdWlyZWRGaWVsZChvZmZzZXQsIDgpIC8vIHJlc3BvbnNlCisgIHJldHVybiBvZmZzZXQ7Cit9CisKKwordW5wYWNrKCk6IFJQQ0NhbGxUIHsKKyAgcmV0dXJuIG5ldyBSUENDYWxsVCgKKyAgICB0aGlzLm5hbWUoKSwKKyAgICAodGhpcy5yZXF1ZXN0KCkgIT09IG51bGwgPyB0aGlzLnJlcXVlc3QoKSEudW5wYWNrKCkgOiBudWxsKSwKKyAgICAodGhpcy5yZXNwb25zZSgpICE9PSBudWxsID8gdGhpcy5yZXNwb25zZSgpIS51bnBhY2soKSA6IG51bGwpLAorICAgIHRoaXMuYmIhLmNyZWF0ZU9iakxpc3QodGhpcy5hdHRyaWJ1dGVzLmJpbmQodGhpcyksIHRoaXMuYXR0cmlidXRlc0xlbmd0aCgpKSwKKyAgICB0aGlzLmJiIS5jcmVhdGVTY2FsYXJMaXN0KHRoaXMuZG9jdW1lbnRhdGlvbi5iaW5kKHRoaXMpLCB0aGlzLmRvY3VtZW50YXRpb25MZW5ndGgoKSkKKyAgKTsKK30KKworCit1bnBhY2tUbyhfbzogUlBDQ2FsbFQpOiB2b2lkIHsKKyAgX28ubmFtZSA9IHRoaXMubmFtZSgpOworICBfby5yZXF1ZXN0ID0gKHRoaXMucmVxdWVzdCgpICE9PSBudWxsID8gdGhpcy5yZXF1ZXN0KCkhLnVucGFjaygpIDogbnVsbCk7CisgIF9vLnJlc3BvbnNlID0gKHRoaXMucmVzcG9uc2UoKSAhPT0gbnVsbCA/IHRoaXMucmVzcG9uc2UoKSEudW5wYWNrKCkgOiBudWxsKTsKKyAgX28uYXR0cmlidXRlcyA9IHRoaXMuYmIhLmNyZWF0ZU9iakxpc3QodGhpcy5hdHRyaWJ1dGVzLmJpbmQodGhpcyksIHRoaXMuYXR0cmlidXRlc0xlbmd0aCgpKTsKKyAgX28uZG9jdW1lbnRhdGlvbiA9IHRoaXMuYmIhLmNyZWF0ZVNjYWxhckxpc3QodGhpcy5kb2N1bWVudGF0aW9uLmJpbmQodGhpcyksIHRoaXMuZG9jdW1lbnRhdGlvbkxlbmd0aCgpKTsKK30KK30KKworZXhwb3J0IGNsYXNzIFJQQ0NhbGxUIHsKK2NvbnN0cnVjdG9yKAorICBwdWJsaWMgbmFtZTogc3RyaW5nfFVpbnQ4QXJyYXl8bnVsbCA9IG51bGwsCisgIHB1YmxpYyByZXF1ZXN0OiBPYmplY3RfVHxudWxsID0gbnVsbCwKKyAgcHVibGljIHJlc3BvbnNlOiBPYmplY3RfVHxudWxsID0gbnVsbCwKKyAgcHVibGljIGF0dHJpYnV0ZXM6IChLZXlWYWx1ZVQpW10gPSBbXSwKKyAgcHVibGljIGRvY3VtZW50YXRpb246IChzdHJpbmcpW10gPSBbXQorKXt9CisKKworcGFjayhidWlsZGVyOmZsYXRidWZmZXJzLkJ1aWxkZXIpOiBmbGF0YnVmZmVycy5PZmZzZXQgeworICBjb25zdCBuYW1lID0gKHRoaXMubmFtZSAhPT0gbnVsbCA/IGJ1aWxkZXIuY3JlYXRlU3RyaW5nKHRoaXMubmFtZSEpIDogMCk7CisgIGNvbnN0IHJlcXVlc3QgPSAodGhpcy5yZXF1ZXN0ICE9PSBudWxsID8gdGhpcy5yZXF1ZXN0IS5wYWNrKGJ1aWxkZXIpIDogMCk7CisgIGNvbnN0IHJlc3BvbnNlID0gKHRoaXMucmVzcG9uc2UgIT09IG51bGwgPyB0aGlzLnJlc3BvbnNlIS5wYWNrKGJ1aWxkZXIpIDogMCk7CisgIGNvbnN0IGF0dHJpYnV0ZXMgPSBSUENDYWxsLmNyZWF0ZUF0dHJpYnV0ZXNWZWN0b3IoYnVpbGRlciwgYnVpbGRlci5jcmVhdGVPYmplY3RPZmZzZXRMaXN0KHRoaXMuYXR0cmlidXRlcykpOworICBjb25zdCBkb2N1bWVudGF0aW9uID0gUlBDQ2FsbC5jcmVhdGVEb2N1bWVudGF0aW9uVmVjdG9yKGJ1aWxkZXIsIGJ1aWxkZXIuY3JlYXRlT2JqZWN0T2Zmc2V0TGlzdCh0aGlzLmRvY3VtZW50YXRpb24pKTsKKworICBSUENDYWxsLnN0YXJ0UlBDQ2FsbChidWlsZGVyKTsKKyAgUlBDQ2FsbC5hZGROYW1lKGJ1aWxkZXIsIG5hbWUpOworICBSUENDYWxsLmFkZFJlcXVlc3QoYnVpbGRlciwgcmVxdWVzdCk7CisgIFJQQ0NhbGwuYWRkUmVzcG9uc2UoYnVpbGRlciwgcmVzcG9uc2UpOworICBSUENDYWxsLmFkZEF0dHJpYnV0ZXMoYnVpbGRlciwgYXR0cmlidXRlcyk7CisgIFJQQ0NhbGwuYWRkRG9jdW1lbnRhdGlvbihidWlsZGVyLCBkb2N1bWVudGF0aW9uKTsKKworICByZXR1cm4gUlBDQ2FsbC5lbmRSUENDYWxsKGJ1aWxkZXIpOworfQorfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvdHMvcmVmbGVjdGlvbi9zY2hlbWEtZmlsZS5qcyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL3RzL3JlZmxlY3Rpb24vc2NoZW1hLWZpbGUuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzFjNjE0NQotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL3RzL3JlZmxlY3Rpb24vc2NoZW1hLWZpbGUuanMKQEAgLTAsMCArMSw4OCBAQAorLy8gYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgYnkgdGhlIEZsYXRCdWZmZXJzIGNvbXBpbGVyLCBkbyBub3QgbW9kaWZ5CitpbXBvcnQgKiBhcyBmbGF0YnVmZmVycyBmcm9tICdmbGF0YnVmZmVycyc7CisvKioKKyAqIEZpbGUgc3BlY2lmaWMgaW5mb3JtYXRpb24uCisgKiBTeW1ib2xzIGRlY2xhcmVkIHdpdGhpbiBhIGZpbGUgbWF5IGJlIHJlY292ZXJlZCBieSBpdGVyYXRpbmcgb3ZlciBhbGwKKyAqIHN5bWJvbHMgYW5kIGV4YW1pbmluZyB0aGUgYGRlY2xhcmF0aW9uX2ZpbGVgIGZpZWxkLgorICovCitleHBvcnQgY2xhc3MgU2NoZW1hRmlsZSB7CisgICAgY29uc3RydWN0b3IoKSB7CisgICAgICAgIHRoaXMuYmIgPSBudWxsOworICAgICAgICB0aGlzLmJiX3BvcyA9IDA7CisgICAgfQorICAgIF9faW5pdChpLCBiYikgeworICAgICAgICB0aGlzLmJiX3BvcyA9IGk7CisgICAgICAgIHRoaXMuYmIgPSBiYjsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorICAgIHN0YXRpYyBnZXRSb290QXNTY2hlbWFGaWxlKGJiLCBvYmopIHsKKyAgICAgICAgcmV0dXJuIChvYmogfHwgbmV3IFNjaGVtYUZpbGUoKSkuX19pbml0KGJiLnJlYWRJbnQzMihiYi5wb3NpdGlvbigpKSArIGJiLnBvc2l0aW9uKCksIGJiKTsKKyAgICB9CisgICAgc3RhdGljIGdldFNpemVQcmVmaXhlZFJvb3RBc1NjaGVtYUZpbGUoYmIsIG9iaikgeworICAgICAgICBiYi5zZXRQb3NpdGlvbihiYi5wb3NpdGlvbigpICsgZmxhdGJ1ZmZlcnMuU0laRV9QUkVGSVhfTEVOR1RIKTsKKyAgICAgICAgcmV0dXJuIChvYmogfHwgbmV3IFNjaGVtYUZpbGUoKSkuX19pbml0KGJiLnJlYWRJbnQzMihiYi5wb3NpdGlvbigpKSArIGJiLnBvc2l0aW9uKCksIGJiKTsKKyAgICB9CisgICAgZmlsZW5hbWUob3B0aW9uYWxFbmNvZGluZykgeworICAgICAgICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCA0KTsKKyAgICAgICAgcmV0dXJuIG9mZnNldCA/IHRoaXMuYmIuX19zdHJpbmcodGhpcy5iYl9wb3MgKyBvZmZzZXQsIG9wdGlvbmFsRW5jb2RpbmcpIDogbnVsbDsKKyAgICB9CisgICAgaW5jbHVkZWRGaWxlbmFtZXMoaW5kZXgsIG9wdGlvbmFsRW5jb2RpbmcpIHsKKyAgICAgICAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywgNik7CisgICAgICAgIHJldHVybiBvZmZzZXQgPyB0aGlzLmJiLl9fc3RyaW5nKHRoaXMuYmIuX192ZWN0b3IodGhpcy5iYl9wb3MgKyBvZmZzZXQpICsgaW5kZXggKiA0LCBvcHRpb25hbEVuY29kaW5nKSA6IG51bGw7CisgICAgfQorICAgIGluY2x1ZGVkRmlsZW5hbWVzTGVuZ3RoKCkgeworICAgICAgICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCA2KTsKKyAgICAgICAgcmV0dXJuIG9mZnNldCA/IHRoaXMuYmIuX192ZWN0b3JfbGVuKHRoaXMuYmJfcG9zICsgb2Zmc2V0KSA6IDA7CisgICAgfQorICAgIHN0YXRpYyBnZXRGdWxseVF1YWxpZmllZE5hbWUoKSB7CisgICAgICAgIHJldHVybiAncmVmbGVjdGlvbl9TY2hlbWFGaWxlJzsKKyAgICB9CisgICAgc3RhdGljIHN0YXJ0U2NoZW1hRmlsZShidWlsZGVyKSB7CisgICAgICAgIGJ1aWxkZXIuc3RhcnRPYmplY3QoMik7CisgICAgfQorICAgIHN0YXRpYyBhZGRGaWxlbmFtZShidWlsZGVyLCBmaWxlbmFtZU9mZnNldCkgeworICAgICAgICBidWlsZGVyLmFkZEZpZWxkT2Zmc2V0KDAsIGZpbGVuYW1lT2Zmc2V0LCAwKTsKKyAgICB9CisgICAgc3RhdGljIGFkZEluY2x1ZGVkRmlsZW5hbWVzKGJ1aWxkZXIsIGluY2x1ZGVkRmlsZW5hbWVzT2Zmc2V0KSB7CisgICAgICAgIGJ1aWxkZXIuYWRkRmllbGRPZmZzZXQoMSwgaW5jbHVkZWRGaWxlbmFtZXNPZmZzZXQsIDApOworICAgIH0KKyAgICBzdGF0aWMgY3JlYXRlSW5jbHVkZWRGaWxlbmFtZXNWZWN0b3IoYnVpbGRlciwgZGF0YSkgeworICAgICAgICBidWlsZGVyLnN0YXJ0VmVjdG9yKDQsIGRhdGEubGVuZ3RoLCA0KTsKKyAgICAgICAgZm9yIChsZXQgaSA9IGRhdGEubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHsKKyAgICAgICAgICAgIGJ1aWxkZXIuYWRkT2Zmc2V0KGRhdGFbaV0pOworICAgICAgICB9CisgICAgICAgIHJldHVybiBidWlsZGVyLmVuZFZlY3RvcigpOworICAgIH0KKyAgICBzdGF0aWMgc3RhcnRJbmNsdWRlZEZpbGVuYW1lc1ZlY3RvcihidWlsZGVyLCBudW1FbGVtcykgeworICAgICAgICBidWlsZGVyLnN0YXJ0VmVjdG9yKDQsIG51bUVsZW1zLCA0KTsKKyAgICB9CisgICAgc3RhdGljIGVuZFNjaGVtYUZpbGUoYnVpbGRlcikgeworICAgICAgICBjb25zdCBvZmZzZXQgPSBidWlsZGVyLmVuZE9iamVjdCgpOworICAgICAgICBidWlsZGVyLnJlcXVpcmVkRmllbGQob2Zmc2V0LCA0KTsgLy8gZmlsZW5hbWUKKyAgICAgICAgcmV0dXJuIG9mZnNldDsKKyAgICB9CisgICAgc3RhdGljIGNyZWF0ZVNjaGVtYUZpbGUoYnVpbGRlciwgZmlsZW5hbWVPZmZzZXQsIGluY2x1ZGVkRmlsZW5hbWVzT2Zmc2V0KSB7CisgICAgICAgIFNjaGVtYUZpbGUuc3RhcnRTY2hlbWFGaWxlKGJ1aWxkZXIpOworICAgICAgICBTY2hlbWFGaWxlLmFkZEZpbGVuYW1lKGJ1aWxkZXIsIGZpbGVuYW1lT2Zmc2V0KTsKKyAgICAgICAgU2NoZW1hRmlsZS5hZGRJbmNsdWRlZEZpbGVuYW1lcyhidWlsZGVyLCBpbmNsdWRlZEZpbGVuYW1lc09mZnNldCk7CisgICAgICAgIHJldHVybiBTY2hlbWFGaWxlLmVuZFNjaGVtYUZpbGUoYnVpbGRlcik7CisgICAgfQorICAgIHVucGFjaygpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBTY2hlbWFGaWxlVCh0aGlzLmZpbGVuYW1lKCksIHRoaXMuYmIuY3JlYXRlU2NhbGFyTGlzdCh0aGlzLmluY2x1ZGVkRmlsZW5hbWVzLmJpbmQodGhpcyksIHRoaXMuaW5jbHVkZWRGaWxlbmFtZXNMZW5ndGgoKSkpOworICAgIH0KKyAgICB1bnBhY2tUbyhfbykgeworICAgICAgICBfby5maWxlbmFtZSA9IHRoaXMuZmlsZW5hbWUoKTsKKyAgICAgICAgX28uaW5jbHVkZWRGaWxlbmFtZXMgPSB0aGlzLmJiLmNyZWF0ZVNjYWxhckxpc3QodGhpcy5pbmNsdWRlZEZpbGVuYW1lcy5iaW5kKHRoaXMpLCB0aGlzLmluY2x1ZGVkRmlsZW5hbWVzTGVuZ3RoKCkpOworICAgIH0KK30KK2V4cG9ydCBjbGFzcyBTY2hlbWFGaWxlVCB7CisgICAgY29uc3RydWN0b3IoZmlsZW5hbWUgPSBudWxsLCBpbmNsdWRlZEZpbGVuYW1lcyA9IFtdKSB7CisgICAgICAgIHRoaXMuZmlsZW5hbWUgPSBmaWxlbmFtZTsKKyAgICAgICAgdGhpcy5pbmNsdWRlZEZpbGVuYW1lcyA9IGluY2x1ZGVkRmlsZW5hbWVzOworICAgIH0KKyAgICBwYWNrKGJ1aWxkZXIpIHsKKyAgICAgICAgY29uc3QgZmlsZW5hbWUgPSAodGhpcy5maWxlbmFtZSAhPT0gbnVsbCA/IGJ1aWxkZXIuY3JlYXRlU3RyaW5nKHRoaXMuZmlsZW5hbWUpIDogMCk7CisgICAgICAgIGNvbnN0IGluY2x1ZGVkRmlsZW5hbWVzID0gU2NoZW1hRmlsZS5jcmVhdGVJbmNsdWRlZEZpbGVuYW1lc1ZlY3RvcihidWlsZGVyLCBidWlsZGVyLmNyZWF0ZU9iamVjdE9mZnNldExpc3QodGhpcy5pbmNsdWRlZEZpbGVuYW1lcykpOworICAgICAgICByZXR1cm4gU2NoZW1hRmlsZS5jcmVhdGVTY2hlbWFGaWxlKGJ1aWxkZXIsIGZpbGVuYW1lLCBpbmNsdWRlZEZpbGVuYW1lcyk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvdHMvcmVmbGVjdGlvbi9zY2hlbWEtZmlsZS50cyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL3RzL3JlZmxlY3Rpb24vc2NoZW1hLWZpbGUudHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTFmNTAzNQotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL3RzL3JlZmxlY3Rpb24vc2NoZW1hLWZpbGUudHMKQEAgLTAsMCArMSwxMjYgQEAKKy8vIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGJ5IHRoZSBGbGF0QnVmZmVycyBjb21waWxlciwgZG8gbm90IG1vZGlmeQorCitpbXBvcnQgKiBhcyBmbGF0YnVmZmVycyBmcm9tICdmbGF0YnVmZmVycyc7CisKKworCisvKioKKyAqIEZpbGUgc3BlY2lmaWMgaW5mb3JtYXRpb24uCisgKiBTeW1ib2xzIGRlY2xhcmVkIHdpdGhpbiBhIGZpbGUgbWF5IGJlIHJlY292ZXJlZCBieSBpdGVyYXRpbmcgb3ZlciBhbGwKKyAqIHN5bWJvbHMgYW5kIGV4YW1pbmluZyB0aGUgYGRlY2xhcmF0aW9uX2ZpbGVgIGZpZWxkLgorICovCitleHBvcnQgY2xhc3MgU2NoZW1hRmlsZSB7CisgIGJiOiBmbGF0YnVmZmVycy5CeXRlQnVmZmVyfG51bGwgPSBudWxsOworICBiYl9wb3MgPSAwOworICBfX2luaXQoaTpudW1iZXIsIGJiOmZsYXRidWZmZXJzLkJ5dGVCdWZmZXIpOlNjaGVtYUZpbGUgeworICB0aGlzLmJiX3BvcyA9IGk7CisgIHRoaXMuYmIgPSBiYjsKKyAgcmV0dXJuIHRoaXM7Cit9CisKK3N0YXRpYyBnZXRSb290QXNTY2hlbWFGaWxlKGJiOmZsYXRidWZmZXJzLkJ5dGVCdWZmZXIsIG9iaj86U2NoZW1hRmlsZSk6U2NoZW1hRmlsZSB7CisgIHJldHVybiAob2JqIHx8IG5ldyBTY2hlbWFGaWxlKCkpLl9faW5pdChiYi5yZWFkSW50MzIoYmIucG9zaXRpb24oKSkgKyBiYi5wb3NpdGlvbigpLCBiYik7Cit9CisKK3N0YXRpYyBnZXRTaXplUHJlZml4ZWRSb290QXNTY2hlbWFGaWxlKGJiOmZsYXRidWZmZXJzLkJ5dGVCdWZmZXIsIG9iaj86U2NoZW1hRmlsZSk6U2NoZW1hRmlsZSB7CisgIGJiLnNldFBvc2l0aW9uKGJiLnBvc2l0aW9uKCkgKyBmbGF0YnVmZmVycy5TSVpFX1BSRUZJWF9MRU5HVEgpOworICByZXR1cm4gKG9iaiB8fCBuZXcgU2NoZW1hRmlsZSgpKS5fX2luaXQoYmIucmVhZEludDMyKGJiLnBvc2l0aW9uKCkpICsgYmIucG9zaXRpb24oKSwgYmIpOworfQorCisvKioKKyAqIEZpbGVuYW1lLCByZWxhdGl2ZSB0byBwcm9qZWN0IHJvb3QuCisgKi8KK2ZpbGVuYW1lKCk6c3RyaW5nfG51bGwKK2ZpbGVuYW1lKG9wdGlvbmFsRW5jb2Rpbmc6ZmxhdGJ1ZmZlcnMuRW5jb2RpbmcpOnN0cmluZ3xVaW50OEFycmF5fG51bGwKK2ZpbGVuYW1lKG9wdGlvbmFsRW5jb2Rpbmc/OmFueSk6c3RyaW5nfFVpbnQ4QXJyYXl8bnVsbCB7CisgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIhLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCA0KTsKKyAgcmV0dXJuIG9mZnNldCA/IHRoaXMuYmIhLl9fc3RyaW5nKHRoaXMuYmJfcG9zICsgb2Zmc2V0LCBvcHRpb25hbEVuY29kaW5nKSA6IG51bGw7Cit9CisKKy8qKgorICogTmFtZXMgb2YgaW5jbHVkZWQgZmlsZXMsIHJlbGF0aXZlIHRvIHByb2plY3Qgcm9vdC4KKyAqLworaW5jbHVkZWRGaWxlbmFtZXMoaW5kZXg6IG51bWJlcik6c3RyaW5nCitpbmNsdWRlZEZpbGVuYW1lcyhpbmRleDogbnVtYmVyLG9wdGlvbmFsRW5jb2Rpbmc6ZmxhdGJ1ZmZlcnMuRW5jb2RpbmcpOnN0cmluZ3xVaW50OEFycmF5CitpbmNsdWRlZEZpbGVuYW1lcyhpbmRleDogbnVtYmVyLG9wdGlvbmFsRW5jb2Rpbmc/OmFueSk6c3RyaW5nfFVpbnQ4QXJyYXl8bnVsbCB7CisgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIhLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCA2KTsKKyAgcmV0dXJuIG9mZnNldCA/IHRoaXMuYmIhLl9fc3RyaW5nKHRoaXMuYmIhLl9fdmVjdG9yKHRoaXMuYmJfcG9zICsgb2Zmc2V0KSArIGluZGV4ICogNCwgb3B0aW9uYWxFbmNvZGluZykgOiBudWxsOworfQorCitpbmNsdWRlZEZpbGVuYW1lc0xlbmd0aCgpOm51bWJlciB7CisgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIhLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCA2KTsKKyAgcmV0dXJuIG9mZnNldCA/IHRoaXMuYmIhLl9fdmVjdG9yX2xlbih0aGlzLmJiX3BvcyArIG9mZnNldCkgOiAwOworfQorCitzdGF0aWMgZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCk6c3RyaW5nIHsKKyAgcmV0dXJuICdyZWZsZWN0aW9uX1NjaGVtYUZpbGUnOworfQorCitzdGF0aWMgc3RhcnRTY2hlbWFGaWxlKGJ1aWxkZXI6ZmxhdGJ1ZmZlcnMuQnVpbGRlcikgeworICBidWlsZGVyLnN0YXJ0T2JqZWN0KDIpOworfQorCitzdGF0aWMgYWRkRmlsZW5hbWUoYnVpbGRlcjpmbGF0YnVmZmVycy5CdWlsZGVyLCBmaWxlbmFtZU9mZnNldDpmbGF0YnVmZmVycy5PZmZzZXQpIHsKKyAgYnVpbGRlci5hZGRGaWVsZE9mZnNldCgwLCBmaWxlbmFtZU9mZnNldCwgMCk7Cit9CisKK3N0YXRpYyBhZGRJbmNsdWRlZEZpbGVuYW1lcyhidWlsZGVyOmZsYXRidWZmZXJzLkJ1aWxkZXIsIGluY2x1ZGVkRmlsZW5hbWVzT2Zmc2V0OmZsYXRidWZmZXJzLk9mZnNldCkgeworICBidWlsZGVyLmFkZEZpZWxkT2Zmc2V0KDEsIGluY2x1ZGVkRmlsZW5hbWVzT2Zmc2V0LCAwKTsKK30KKworc3RhdGljIGNyZWF0ZUluY2x1ZGVkRmlsZW5hbWVzVmVjdG9yKGJ1aWxkZXI6ZmxhdGJ1ZmZlcnMuQnVpbGRlciwgZGF0YTpmbGF0YnVmZmVycy5PZmZzZXRbXSk6ZmxhdGJ1ZmZlcnMuT2Zmc2V0IHsKKyAgYnVpbGRlci5zdGFydFZlY3Rvcig0LCBkYXRhLmxlbmd0aCwgNCk7CisgIGZvciAobGV0IGkgPSBkYXRhLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7CisgICAgYnVpbGRlci5hZGRPZmZzZXQoZGF0YVtpXSEpOworICB9CisgIHJldHVybiBidWlsZGVyLmVuZFZlY3RvcigpOworfQorCitzdGF0aWMgc3RhcnRJbmNsdWRlZEZpbGVuYW1lc1ZlY3RvcihidWlsZGVyOmZsYXRidWZmZXJzLkJ1aWxkZXIsIG51bUVsZW1zOm51bWJlcikgeworICBidWlsZGVyLnN0YXJ0VmVjdG9yKDQsIG51bUVsZW1zLCA0KTsKK30KKworc3RhdGljIGVuZFNjaGVtYUZpbGUoYnVpbGRlcjpmbGF0YnVmZmVycy5CdWlsZGVyKTpmbGF0YnVmZmVycy5PZmZzZXQgeworICBjb25zdCBvZmZzZXQgPSBidWlsZGVyLmVuZE9iamVjdCgpOworICBidWlsZGVyLnJlcXVpcmVkRmllbGQob2Zmc2V0LCA0KSAvLyBmaWxlbmFtZQorICByZXR1cm4gb2Zmc2V0OworfQorCitzdGF0aWMgY3JlYXRlU2NoZW1hRmlsZShidWlsZGVyOmZsYXRidWZmZXJzLkJ1aWxkZXIsIGZpbGVuYW1lT2Zmc2V0OmZsYXRidWZmZXJzLk9mZnNldCwgaW5jbHVkZWRGaWxlbmFtZXNPZmZzZXQ6ZmxhdGJ1ZmZlcnMuT2Zmc2V0KTpmbGF0YnVmZmVycy5PZmZzZXQgeworICBTY2hlbWFGaWxlLnN0YXJ0U2NoZW1hRmlsZShidWlsZGVyKTsKKyAgU2NoZW1hRmlsZS5hZGRGaWxlbmFtZShidWlsZGVyLCBmaWxlbmFtZU9mZnNldCk7CisgIFNjaGVtYUZpbGUuYWRkSW5jbHVkZWRGaWxlbmFtZXMoYnVpbGRlciwgaW5jbHVkZWRGaWxlbmFtZXNPZmZzZXQpOworICByZXR1cm4gU2NoZW1hRmlsZS5lbmRTY2hlbWFGaWxlKGJ1aWxkZXIpOworfQorCit1bnBhY2soKTogU2NoZW1hRmlsZVQgeworICByZXR1cm4gbmV3IFNjaGVtYUZpbGVUKAorICAgIHRoaXMuZmlsZW5hbWUoKSwKKyAgICB0aGlzLmJiIS5jcmVhdGVTY2FsYXJMaXN0KHRoaXMuaW5jbHVkZWRGaWxlbmFtZXMuYmluZCh0aGlzKSwgdGhpcy5pbmNsdWRlZEZpbGVuYW1lc0xlbmd0aCgpKQorICApOworfQorCisKK3VucGFja1RvKF9vOiBTY2hlbWFGaWxlVCk6IHZvaWQgeworICBfby5maWxlbmFtZSA9IHRoaXMuZmlsZW5hbWUoKTsKKyAgX28uaW5jbHVkZWRGaWxlbmFtZXMgPSB0aGlzLmJiIS5jcmVhdGVTY2FsYXJMaXN0KHRoaXMuaW5jbHVkZWRGaWxlbmFtZXMuYmluZCh0aGlzKSwgdGhpcy5pbmNsdWRlZEZpbGVuYW1lc0xlbmd0aCgpKTsKK30KK30KKworZXhwb3J0IGNsYXNzIFNjaGVtYUZpbGVUIHsKK2NvbnN0cnVjdG9yKAorICBwdWJsaWMgZmlsZW5hbWU6IHN0cmluZ3xVaW50OEFycmF5fG51bGwgPSBudWxsLAorICBwdWJsaWMgaW5jbHVkZWRGaWxlbmFtZXM6IChzdHJpbmcpW10gPSBbXQorKXt9CisKKworcGFjayhidWlsZGVyOmZsYXRidWZmZXJzLkJ1aWxkZXIpOiBmbGF0YnVmZmVycy5PZmZzZXQgeworICBjb25zdCBmaWxlbmFtZSA9ICh0aGlzLmZpbGVuYW1lICE9PSBudWxsID8gYnVpbGRlci5jcmVhdGVTdHJpbmcodGhpcy5maWxlbmFtZSEpIDogMCk7CisgIGNvbnN0IGluY2x1ZGVkRmlsZW5hbWVzID0gU2NoZW1hRmlsZS5jcmVhdGVJbmNsdWRlZEZpbGVuYW1lc1ZlY3RvcihidWlsZGVyLCBidWlsZGVyLmNyZWF0ZU9iamVjdE9mZnNldExpc3QodGhpcy5pbmNsdWRlZEZpbGVuYW1lcykpOworCisgIHJldHVybiBTY2hlbWFGaWxlLmNyZWF0ZVNjaGVtYUZpbGUoYnVpbGRlciwKKyAgICBmaWxlbmFtZSwKKyAgICBpbmNsdWRlZEZpbGVuYW1lcworICApOworfQorfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvdHMvcmVmbGVjdGlvbi9zY2hlbWEuanMgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy90cy9yZWZsZWN0aW9uL3NjaGVtYS5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNTAyMjk3Ci0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvdHMvcmVmbGVjdGlvbi9zY2hlbWEuanMKQEAgLTAsMCArMSwyMTMgQEAKKy8vIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGJ5IHRoZSBGbGF0QnVmZmVycyBjb21waWxlciwgZG8gbm90IG1vZGlmeQoraW1wb3J0ICogYXMgZmxhdGJ1ZmZlcnMgZnJvbSAnZmxhdGJ1ZmZlcnMnOworaW1wb3J0IHsgRW51bSB9IGZyb20gJy4uL3JlZmxlY3Rpb24vZW51bS5qcyc7CitpbXBvcnQgeyBPYmplY3RfIH0gZnJvbSAnLi4vcmVmbGVjdGlvbi9vYmplY3QuanMnOworaW1wb3J0IHsgU2NoZW1hRmlsZSB9IGZyb20gJy4uL3JlZmxlY3Rpb24vc2NoZW1hLWZpbGUuanMnOworaW1wb3J0IHsgU2VydmljZSB9IGZyb20gJy4uL3JlZmxlY3Rpb24vc2VydmljZS5qcyc7CitleHBvcnQgY2xhc3MgU2NoZW1hIHsKKyAgICBjb25zdHJ1Y3RvcigpIHsKKyAgICAgICAgdGhpcy5iYiA9IG51bGw7CisgICAgICAgIHRoaXMuYmJfcG9zID0gMDsKKyAgICB9CisgICAgX19pbml0KGksIGJiKSB7CisgICAgICAgIHRoaXMuYmJfcG9zID0gaTsKKyAgICAgICAgdGhpcy5iYiA9IGJiOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisgICAgc3RhdGljIGdldFJvb3RBc1NjaGVtYShiYiwgb2JqKSB7CisgICAgICAgIHJldHVybiAob2JqIHx8IG5ldyBTY2hlbWEoKSkuX19pbml0KGJiLnJlYWRJbnQzMihiYi5wb3NpdGlvbigpKSArIGJiLnBvc2l0aW9uKCksIGJiKTsKKyAgICB9CisgICAgc3RhdGljIGdldFNpemVQcmVmaXhlZFJvb3RBc1NjaGVtYShiYiwgb2JqKSB7CisgICAgICAgIGJiLnNldFBvc2l0aW9uKGJiLnBvc2l0aW9uKCkgKyBmbGF0YnVmZmVycy5TSVpFX1BSRUZJWF9MRU5HVEgpOworICAgICAgICByZXR1cm4gKG9iaiB8fCBuZXcgU2NoZW1hKCkpLl9faW5pdChiYi5yZWFkSW50MzIoYmIucG9zaXRpb24oKSkgKyBiYi5wb3NpdGlvbigpLCBiYik7CisgICAgfQorICAgIHN0YXRpYyBidWZmZXJIYXNJZGVudGlmaWVyKGJiKSB7CisgICAgICAgIHJldHVybiBiYi5fX2hhc19pZGVudGlmaWVyKCdCRkJTJyk7CisgICAgfQorICAgIG9iamVjdHMoaW5kZXgsIG9iaikgeworICAgICAgICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCA0KTsKKyAgICAgICAgcmV0dXJuIG9mZnNldCA/IChvYmogfHwgbmV3IE9iamVjdF8oKSkuX19pbml0KHRoaXMuYmIuX19pbmRpcmVjdCh0aGlzLmJiLl9fdmVjdG9yKHRoaXMuYmJfcG9zICsgb2Zmc2V0KSArIGluZGV4ICogNCksIHRoaXMuYmIpIDogbnVsbDsKKyAgICB9CisgICAgb2JqZWN0c0xlbmd0aCgpIHsKKyAgICAgICAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywgNCk7CisgICAgICAgIHJldHVybiBvZmZzZXQgPyB0aGlzLmJiLl9fdmVjdG9yX2xlbih0aGlzLmJiX3BvcyArIG9mZnNldCkgOiAwOworICAgIH0KKyAgICBlbnVtcyhpbmRleCwgb2JqKSB7CisgICAgICAgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsIDYpOworICAgICAgICByZXR1cm4gb2Zmc2V0ID8gKG9iaiB8fCBuZXcgRW51bSgpKS5fX2luaXQodGhpcy5iYi5fX2luZGlyZWN0KHRoaXMuYmIuX192ZWN0b3IodGhpcy5iYl9wb3MgKyBvZmZzZXQpICsgaW5kZXggKiA0KSwgdGhpcy5iYikgOiBudWxsOworICAgIH0KKyAgICBlbnVtc0xlbmd0aCgpIHsKKyAgICAgICAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywgNik7CisgICAgICAgIHJldHVybiBvZmZzZXQgPyB0aGlzLmJiLl9fdmVjdG9yX2xlbih0aGlzLmJiX3BvcyArIG9mZnNldCkgOiAwOworICAgIH0KKyAgICBmaWxlSWRlbnQob3B0aW9uYWxFbmNvZGluZykgeworICAgICAgICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCA4KTsKKyAgICAgICAgcmV0dXJuIG9mZnNldCA/IHRoaXMuYmIuX19zdHJpbmcodGhpcy5iYl9wb3MgKyBvZmZzZXQsIG9wdGlvbmFsRW5jb2RpbmcpIDogbnVsbDsKKyAgICB9CisgICAgZmlsZUV4dChvcHRpb25hbEVuY29kaW5nKSB7CisgICAgICAgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsIDEwKTsKKyAgICAgICAgcmV0dXJuIG9mZnNldCA/IHRoaXMuYmIuX19zdHJpbmcodGhpcy5iYl9wb3MgKyBvZmZzZXQsIG9wdGlvbmFsRW5jb2RpbmcpIDogbnVsbDsKKyAgICB9CisgICAgcm9vdFRhYmxlKG9iaikgeworICAgICAgICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCAxMik7CisgICAgICAgIHJldHVybiBvZmZzZXQgPyAob2JqIHx8IG5ldyBPYmplY3RfKCkpLl9faW5pdCh0aGlzLmJiLl9faW5kaXJlY3QodGhpcy5iYl9wb3MgKyBvZmZzZXQpLCB0aGlzLmJiKSA6IG51bGw7CisgICAgfQorICAgIHNlcnZpY2VzKGluZGV4LCBvYmopIHsKKyAgICAgICAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywgMTQpOworICAgICAgICByZXR1cm4gb2Zmc2V0ID8gKG9iaiB8fCBuZXcgU2VydmljZSgpKS5fX2luaXQodGhpcy5iYi5fX2luZGlyZWN0KHRoaXMuYmIuX192ZWN0b3IodGhpcy5iYl9wb3MgKyBvZmZzZXQpICsgaW5kZXggKiA0KSwgdGhpcy5iYikgOiBudWxsOworICAgIH0KKyAgICBzZXJ2aWNlc0xlbmd0aCgpIHsKKyAgICAgICAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywgMTQpOworICAgICAgICByZXR1cm4gb2Zmc2V0ID8gdGhpcy5iYi5fX3ZlY3Rvcl9sZW4odGhpcy5iYl9wb3MgKyBvZmZzZXQpIDogMDsKKyAgICB9CisgICAgYWR2YW5jZWRGZWF0dXJlcygpIHsKKyAgICAgICAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywgMTYpOworICAgICAgICByZXR1cm4gb2Zmc2V0ID8gdGhpcy5iYi5yZWFkVWludDY0KHRoaXMuYmJfcG9zICsgb2Zmc2V0KSA6IEJpZ0ludCgnMCcpOworICAgIH0KKyAgICBtdXRhdGVfYWR2YW5jZWRfZmVhdHVyZXModmFsdWUpIHsKKyAgICAgICAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywgMTYpOworICAgICAgICBpZiAob2Zmc2V0ID09PSAwKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgdGhpcy5iYi53cml0ZVVpbnQ2NCh0aGlzLmJiX3BvcyArIG9mZnNldCwgdmFsdWUpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgLyoqCisgICAgICogQWxsIHRoZSBmaWxlcyB1c2VkIGluIHRoaXMgY29tcGlsYXRpb24uIEZpbGVzIGFyZSByZWxhdGl2ZSB0byB3aGVyZQorICAgICAqIGZsYXRjIHdhcyBpbnZva2VkLgorICAgICAqLworICAgIGZic0ZpbGVzKGluZGV4LCBvYmopIHsKKyAgICAgICAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywgMTgpOworICAgICAgICByZXR1cm4gb2Zmc2V0ID8gKG9iaiB8fCBuZXcgU2NoZW1hRmlsZSgpKS5fX2luaXQodGhpcy5iYi5fX2luZGlyZWN0KHRoaXMuYmIuX192ZWN0b3IodGhpcy5iYl9wb3MgKyBvZmZzZXQpICsgaW5kZXggKiA0KSwgdGhpcy5iYikgOiBudWxsOworICAgIH0KKyAgICBmYnNGaWxlc0xlbmd0aCgpIHsKKyAgICAgICAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywgMTgpOworICAgICAgICByZXR1cm4gb2Zmc2V0ID8gdGhpcy5iYi5fX3ZlY3Rvcl9sZW4odGhpcy5iYl9wb3MgKyBvZmZzZXQpIDogMDsKKyAgICB9CisgICAgc3RhdGljIGdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpIHsKKyAgICAgICAgcmV0dXJuICdyZWZsZWN0aW9uX1NjaGVtYSc7CisgICAgfQorICAgIHN0YXRpYyBzdGFydFNjaGVtYShidWlsZGVyKSB7CisgICAgICAgIGJ1aWxkZXIuc3RhcnRPYmplY3QoOCk7CisgICAgfQorICAgIHN0YXRpYyBhZGRPYmplY3RzKGJ1aWxkZXIsIG9iamVjdHNPZmZzZXQpIHsKKyAgICAgICAgYnVpbGRlci5hZGRGaWVsZE9mZnNldCgwLCBvYmplY3RzT2Zmc2V0LCAwKTsKKyAgICB9CisgICAgc3RhdGljIGNyZWF0ZU9iamVjdHNWZWN0b3IoYnVpbGRlciwgZGF0YSkgeworICAgICAgICBidWlsZGVyLnN0YXJ0VmVjdG9yKDQsIGRhdGEubGVuZ3RoLCA0KTsKKyAgICAgICAgZm9yIChsZXQgaSA9IGRhdGEubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHsKKyAgICAgICAgICAgIGJ1aWxkZXIuYWRkT2Zmc2V0KGRhdGFbaV0pOworICAgICAgICB9CisgICAgICAgIHJldHVybiBidWlsZGVyLmVuZFZlY3RvcigpOworICAgIH0KKyAgICBzdGF0aWMgc3RhcnRPYmplY3RzVmVjdG9yKGJ1aWxkZXIsIG51bUVsZW1zKSB7CisgICAgICAgIGJ1aWxkZXIuc3RhcnRWZWN0b3IoNCwgbnVtRWxlbXMsIDQpOworICAgIH0KKyAgICBzdGF0aWMgYWRkRW51bXMoYnVpbGRlciwgZW51bXNPZmZzZXQpIHsKKyAgICAgICAgYnVpbGRlci5hZGRGaWVsZE9mZnNldCgxLCBlbnVtc09mZnNldCwgMCk7CisgICAgfQorICAgIHN0YXRpYyBjcmVhdGVFbnVtc1ZlY3RvcihidWlsZGVyLCBkYXRhKSB7CisgICAgICAgIGJ1aWxkZXIuc3RhcnRWZWN0b3IoNCwgZGF0YS5sZW5ndGgsIDQpOworICAgICAgICBmb3IgKGxldCBpID0gZGF0YS5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgeworICAgICAgICAgICAgYnVpbGRlci5hZGRPZmZzZXQoZGF0YVtpXSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGJ1aWxkZXIuZW5kVmVjdG9yKCk7CisgICAgfQorICAgIHN0YXRpYyBzdGFydEVudW1zVmVjdG9yKGJ1aWxkZXIsIG51bUVsZW1zKSB7CisgICAgICAgIGJ1aWxkZXIuc3RhcnRWZWN0b3IoNCwgbnVtRWxlbXMsIDQpOworICAgIH0KKyAgICBzdGF0aWMgYWRkRmlsZUlkZW50KGJ1aWxkZXIsIGZpbGVJZGVudE9mZnNldCkgeworICAgICAgICBidWlsZGVyLmFkZEZpZWxkT2Zmc2V0KDIsIGZpbGVJZGVudE9mZnNldCwgMCk7CisgICAgfQorICAgIHN0YXRpYyBhZGRGaWxlRXh0KGJ1aWxkZXIsIGZpbGVFeHRPZmZzZXQpIHsKKyAgICAgICAgYnVpbGRlci5hZGRGaWVsZE9mZnNldCgzLCBmaWxlRXh0T2Zmc2V0LCAwKTsKKyAgICB9CisgICAgc3RhdGljIGFkZFJvb3RUYWJsZShidWlsZGVyLCByb290VGFibGVPZmZzZXQpIHsKKyAgICAgICAgYnVpbGRlci5hZGRGaWVsZE9mZnNldCg0LCByb290VGFibGVPZmZzZXQsIDApOworICAgIH0KKyAgICBzdGF0aWMgYWRkU2VydmljZXMoYnVpbGRlciwgc2VydmljZXNPZmZzZXQpIHsKKyAgICAgICAgYnVpbGRlci5hZGRGaWVsZE9mZnNldCg1LCBzZXJ2aWNlc09mZnNldCwgMCk7CisgICAgfQorICAgIHN0YXRpYyBjcmVhdGVTZXJ2aWNlc1ZlY3RvcihidWlsZGVyLCBkYXRhKSB7CisgICAgICAgIGJ1aWxkZXIuc3RhcnRWZWN0b3IoNCwgZGF0YS5sZW5ndGgsIDQpOworICAgICAgICBmb3IgKGxldCBpID0gZGF0YS5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgeworICAgICAgICAgICAgYnVpbGRlci5hZGRPZmZzZXQoZGF0YVtpXSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGJ1aWxkZXIuZW5kVmVjdG9yKCk7CisgICAgfQorICAgIHN0YXRpYyBzdGFydFNlcnZpY2VzVmVjdG9yKGJ1aWxkZXIsIG51bUVsZW1zKSB7CisgICAgICAgIGJ1aWxkZXIuc3RhcnRWZWN0b3IoNCwgbnVtRWxlbXMsIDQpOworICAgIH0KKyAgICBzdGF0aWMgYWRkQWR2YW5jZWRGZWF0dXJlcyhidWlsZGVyLCBhZHZhbmNlZEZlYXR1cmVzKSB7CisgICAgICAgIGJ1aWxkZXIuYWRkRmllbGRJbnQ2NCg2LCBhZHZhbmNlZEZlYXR1cmVzLCBCaWdJbnQoJzAnKSk7CisgICAgfQorICAgIHN0YXRpYyBhZGRGYnNGaWxlcyhidWlsZGVyLCBmYnNGaWxlc09mZnNldCkgeworICAgICAgICBidWlsZGVyLmFkZEZpZWxkT2Zmc2V0KDcsIGZic0ZpbGVzT2Zmc2V0LCAwKTsKKyAgICB9CisgICAgc3RhdGljIGNyZWF0ZUZic0ZpbGVzVmVjdG9yKGJ1aWxkZXIsIGRhdGEpIHsKKyAgICAgICAgYnVpbGRlci5zdGFydFZlY3Rvcig0LCBkYXRhLmxlbmd0aCwgNCk7CisgICAgICAgIGZvciAobGV0IGkgPSBkYXRhLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7CisgICAgICAgICAgICBidWlsZGVyLmFkZE9mZnNldChkYXRhW2ldKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gYnVpbGRlci5lbmRWZWN0b3IoKTsKKyAgICB9CisgICAgc3RhdGljIHN0YXJ0RmJzRmlsZXNWZWN0b3IoYnVpbGRlciwgbnVtRWxlbXMpIHsKKyAgICAgICAgYnVpbGRlci5zdGFydFZlY3Rvcig0LCBudW1FbGVtcywgNCk7CisgICAgfQorICAgIHN0YXRpYyBlbmRTY2hlbWEoYnVpbGRlcikgeworICAgICAgICBjb25zdCBvZmZzZXQgPSBidWlsZGVyLmVuZE9iamVjdCgpOworICAgICAgICBidWlsZGVyLnJlcXVpcmVkRmllbGQob2Zmc2V0LCA0KTsgLy8gb2JqZWN0cworICAgICAgICBidWlsZGVyLnJlcXVpcmVkRmllbGQob2Zmc2V0LCA2KTsgLy8gZW51bXMKKyAgICAgICAgcmV0dXJuIG9mZnNldDsKKyAgICB9CisgICAgc3RhdGljIGZpbmlzaFNjaGVtYUJ1ZmZlcihidWlsZGVyLCBvZmZzZXQpIHsKKyAgICAgICAgYnVpbGRlci5maW5pc2gob2Zmc2V0LCAnQkZCUycpOworICAgIH0KKyAgICBzdGF0aWMgZmluaXNoU2l6ZVByZWZpeGVkU2NoZW1hQnVmZmVyKGJ1aWxkZXIsIG9mZnNldCkgeworICAgICAgICBidWlsZGVyLmZpbmlzaChvZmZzZXQsICdCRkJTJywgdHJ1ZSk7CisgICAgfQorICAgIHVucGFjaygpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBTY2hlbWFUKHRoaXMuYmIuY3JlYXRlT2JqTGlzdCh0aGlzLm9iamVjdHMuYmluZCh0aGlzKSwgdGhpcy5vYmplY3RzTGVuZ3RoKCkpLCB0aGlzLmJiLmNyZWF0ZU9iakxpc3QodGhpcy5lbnVtcy5iaW5kKHRoaXMpLCB0aGlzLmVudW1zTGVuZ3RoKCkpLCB0aGlzLmZpbGVJZGVudCgpLCB0aGlzLmZpbGVFeHQoKSwgKHRoaXMucm9vdFRhYmxlKCkgIT09IG51bGwgPyB0aGlzLnJvb3RUYWJsZSgpLnVucGFjaygpIDogbnVsbCksIHRoaXMuYmIuY3JlYXRlT2JqTGlzdCh0aGlzLnNlcnZpY2VzLmJpbmQodGhpcyksIHRoaXMuc2VydmljZXNMZW5ndGgoKSksIHRoaXMuYWR2YW5jZWRGZWF0dXJlcygpLCB0aGlzLmJiLmNyZWF0ZU9iakxpc3QodGhpcy5mYnNGaWxlcy5iaW5kKHRoaXMpLCB0aGlzLmZic0ZpbGVzTGVuZ3RoKCkpKTsKKyAgICB9CisgICAgdW5wYWNrVG8oX28pIHsKKyAgICAgICAgX28ub2JqZWN0cyA9IHRoaXMuYmIuY3JlYXRlT2JqTGlzdCh0aGlzLm9iamVjdHMuYmluZCh0aGlzKSwgdGhpcy5vYmplY3RzTGVuZ3RoKCkpOworICAgICAgICBfby5lbnVtcyA9IHRoaXMuYmIuY3JlYXRlT2JqTGlzdCh0aGlzLmVudW1zLmJpbmQodGhpcyksIHRoaXMuZW51bXNMZW5ndGgoKSk7CisgICAgICAgIF9vLmZpbGVJZGVudCA9IHRoaXMuZmlsZUlkZW50KCk7CisgICAgICAgIF9vLmZpbGVFeHQgPSB0aGlzLmZpbGVFeHQoKTsKKyAgICAgICAgX28ucm9vdFRhYmxlID0gKHRoaXMucm9vdFRhYmxlKCkgIT09IG51bGwgPyB0aGlzLnJvb3RUYWJsZSgpLnVucGFjaygpIDogbnVsbCk7CisgICAgICAgIF9vLnNlcnZpY2VzID0gdGhpcy5iYi5jcmVhdGVPYmpMaXN0KHRoaXMuc2VydmljZXMuYmluZCh0aGlzKSwgdGhpcy5zZXJ2aWNlc0xlbmd0aCgpKTsKKyAgICAgICAgX28uYWR2YW5jZWRGZWF0dXJlcyA9IHRoaXMuYWR2YW5jZWRGZWF0dXJlcygpOworICAgICAgICBfby5mYnNGaWxlcyA9IHRoaXMuYmIuY3JlYXRlT2JqTGlzdCh0aGlzLmZic0ZpbGVzLmJpbmQodGhpcyksIHRoaXMuZmJzRmlsZXNMZW5ndGgoKSk7CisgICAgfQorfQorZXhwb3J0IGNsYXNzIFNjaGVtYVQgeworICAgIGNvbnN0cnVjdG9yKG9iamVjdHMgPSBbXSwgZW51bXMgPSBbXSwgZmlsZUlkZW50ID0gbnVsbCwgZmlsZUV4dCA9IG51bGwsIHJvb3RUYWJsZSA9IG51bGwsIHNlcnZpY2VzID0gW10sIGFkdmFuY2VkRmVhdHVyZXMgPSBCaWdJbnQoJzAnKSwgZmJzRmlsZXMgPSBbXSkgeworICAgICAgICB0aGlzLm9iamVjdHMgPSBvYmplY3RzOworICAgICAgICB0aGlzLmVudW1zID0gZW51bXM7CisgICAgICAgIHRoaXMuZmlsZUlkZW50ID0gZmlsZUlkZW50OworICAgICAgICB0aGlzLmZpbGVFeHQgPSBmaWxlRXh0OworICAgICAgICB0aGlzLnJvb3RUYWJsZSA9IHJvb3RUYWJsZTsKKyAgICAgICAgdGhpcy5zZXJ2aWNlcyA9IHNlcnZpY2VzOworICAgICAgICB0aGlzLmFkdmFuY2VkRmVhdHVyZXMgPSBhZHZhbmNlZEZlYXR1cmVzOworICAgICAgICB0aGlzLmZic0ZpbGVzID0gZmJzRmlsZXM7CisgICAgfQorICAgIHBhY2soYnVpbGRlcikgeworICAgICAgICBjb25zdCBvYmplY3RzID0gU2NoZW1hLmNyZWF0ZU9iamVjdHNWZWN0b3IoYnVpbGRlciwgYnVpbGRlci5jcmVhdGVPYmplY3RPZmZzZXRMaXN0KHRoaXMub2JqZWN0cykpOworICAgICAgICBjb25zdCBlbnVtcyA9IFNjaGVtYS5jcmVhdGVFbnVtc1ZlY3RvcihidWlsZGVyLCBidWlsZGVyLmNyZWF0ZU9iamVjdE9mZnNldExpc3QodGhpcy5lbnVtcykpOworICAgICAgICBjb25zdCBmaWxlSWRlbnQgPSAodGhpcy5maWxlSWRlbnQgIT09IG51bGwgPyBidWlsZGVyLmNyZWF0ZVN0cmluZyh0aGlzLmZpbGVJZGVudCkgOiAwKTsKKyAgICAgICAgY29uc3QgZmlsZUV4dCA9ICh0aGlzLmZpbGVFeHQgIT09IG51bGwgPyBidWlsZGVyLmNyZWF0ZVN0cmluZyh0aGlzLmZpbGVFeHQpIDogMCk7CisgICAgICAgIGNvbnN0IHJvb3RUYWJsZSA9ICh0aGlzLnJvb3RUYWJsZSAhPT0gbnVsbCA/IHRoaXMucm9vdFRhYmxlLnBhY2soYnVpbGRlcikgOiAwKTsKKyAgICAgICAgY29uc3Qgc2VydmljZXMgPSBTY2hlbWEuY3JlYXRlU2VydmljZXNWZWN0b3IoYnVpbGRlciwgYnVpbGRlci5jcmVhdGVPYmplY3RPZmZzZXRMaXN0KHRoaXMuc2VydmljZXMpKTsKKyAgICAgICAgY29uc3QgZmJzRmlsZXMgPSBTY2hlbWEuY3JlYXRlRmJzRmlsZXNWZWN0b3IoYnVpbGRlciwgYnVpbGRlci5jcmVhdGVPYmplY3RPZmZzZXRMaXN0KHRoaXMuZmJzRmlsZXMpKTsKKyAgICAgICAgU2NoZW1hLnN0YXJ0U2NoZW1hKGJ1aWxkZXIpOworICAgICAgICBTY2hlbWEuYWRkT2JqZWN0cyhidWlsZGVyLCBvYmplY3RzKTsKKyAgICAgICAgU2NoZW1hLmFkZEVudW1zKGJ1aWxkZXIsIGVudW1zKTsKKyAgICAgICAgU2NoZW1hLmFkZEZpbGVJZGVudChidWlsZGVyLCBmaWxlSWRlbnQpOworICAgICAgICBTY2hlbWEuYWRkRmlsZUV4dChidWlsZGVyLCBmaWxlRXh0KTsKKyAgICAgICAgU2NoZW1hLmFkZFJvb3RUYWJsZShidWlsZGVyLCByb290VGFibGUpOworICAgICAgICBTY2hlbWEuYWRkU2VydmljZXMoYnVpbGRlciwgc2VydmljZXMpOworICAgICAgICBTY2hlbWEuYWRkQWR2YW5jZWRGZWF0dXJlcyhidWlsZGVyLCB0aGlzLmFkdmFuY2VkRmVhdHVyZXMpOworICAgICAgICBTY2hlbWEuYWRkRmJzRmlsZXMoYnVpbGRlciwgZmJzRmlsZXMpOworICAgICAgICByZXR1cm4gU2NoZW1hLmVuZFNjaGVtYShidWlsZGVyKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy90cy9yZWZsZWN0aW9uL3NjaGVtYS50cyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL3RzL3JlZmxlY3Rpb24vc2NoZW1hLnRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQxODM5YzcKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy90cy9yZWZsZWN0aW9uL3NjaGVtYS50cwpAQCAtMCwwICsxLDI3NiBAQAorLy8gYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgYnkgdGhlIEZsYXRCdWZmZXJzIGNvbXBpbGVyLCBkbyBub3QgbW9kaWZ5CisKK2ltcG9ydCAqIGFzIGZsYXRidWZmZXJzIGZyb20gJ2ZsYXRidWZmZXJzJzsKKworaW1wb3J0IHsgRW51bSwgRW51bVQgfSBmcm9tICcuLi9yZWZsZWN0aW9uL2VudW0uanMnOworaW1wb3J0IHsgT2JqZWN0XywgT2JqZWN0X1QgfSBmcm9tICcuLi9yZWZsZWN0aW9uL29iamVjdC5qcyc7CitpbXBvcnQgeyBTY2hlbWFGaWxlLCBTY2hlbWFGaWxlVCB9IGZyb20gJy4uL3JlZmxlY3Rpb24vc2NoZW1hLWZpbGUuanMnOworaW1wb3J0IHsgU2VydmljZSwgU2VydmljZVQgfSBmcm9tICcuLi9yZWZsZWN0aW9uL3NlcnZpY2UuanMnOworCisKK2V4cG9ydCBjbGFzcyBTY2hlbWEgeworICBiYjogZmxhdGJ1ZmZlcnMuQnl0ZUJ1ZmZlcnxudWxsID0gbnVsbDsKKyAgYmJfcG9zID0gMDsKKyAgX19pbml0KGk6bnVtYmVyLCBiYjpmbGF0YnVmZmVycy5CeXRlQnVmZmVyKTpTY2hlbWEgeworICB0aGlzLmJiX3BvcyA9IGk7CisgIHRoaXMuYmIgPSBiYjsKKyAgcmV0dXJuIHRoaXM7Cit9CisKK3N0YXRpYyBnZXRSb290QXNTY2hlbWEoYmI6ZmxhdGJ1ZmZlcnMuQnl0ZUJ1ZmZlciwgb2JqPzpTY2hlbWEpOlNjaGVtYSB7CisgIHJldHVybiAob2JqIHx8IG5ldyBTY2hlbWEoKSkuX19pbml0KGJiLnJlYWRJbnQzMihiYi5wb3NpdGlvbigpKSArIGJiLnBvc2l0aW9uKCksIGJiKTsKK30KKworc3RhdGljIGdldFNpemVQcmVmaXhlZFJvb3RBc1NjaGVtYShiYjpmbGF0YnVmZmVycy5CeXRlQnVmZmVyLCBvYmo/OlNjaGVtYSk6U2NoZW1hIHsKKyAgYmIuc2V0UG9zaXRpb24oYmIucG9zaXRpb24oKSArIGZsYXRidWZmZXJzLlNJWkVfUFJFRklYX0xFTkdUSCk7CisgIHJldHVybiAob2JqIHx8IG5ldyBTY2hlbWEoKSkuX19pbml0KGJiLnJlYWRJbnQzMihiYi5wb3NpdGlvbigpKSArIGJiLnBvc2l0aW9uKCksIGJiKTsKK30KKworc3RhdGljIGJ1ZmZlckhhc0lkZW50aWZpZXIoYmI6ZmxhdGJ1ZmZlcnMuQnl0ZUJ1ZmZlcik6Ym9vbGVhbiB7CisgIHJldHVybiBiYi5fX2hhc19pZGVudGlmaWVyKCdCRkJTJyk7Cit9CisKK29iamVjdHMoaW5kZXg6IG51bWJlciwgb2JqPzpPYmplY3RfKTpPYmplY3RffG51bGwgeworICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiIS5fX29mZnNldCh0aGlzLmJiX3BvcywgNCk7CisgIHJldHVybiBvZmZzZXQgPyAob2JqIHx8IG5ldyBPYmplY3RfKCkpLl9faW5pdCh0aGlzLmJiIS5fX2luZGlyZWN0KHRoaXMuYmIhLl9fdmVjdG9yKHRoaXMuYmJfcG9zICsgb2Zmc2V0KSArIGluZGV4ICogNCksIHRoaXMuYmIhKSA6IG51bGw7Cit9CisKK29iamVjdHNMZW5ndGgoKTpudW1iZXIgeworICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiIS5fX29mZnNldCh0aGlzLmJiX3BvcywgNCk7CisgIHJldHVybiBvZmZzZXQgPyB0aGlzLmJiIS5fX3ZlY3Rvcl9sZW4odGhpcy5iYl9wb3MgKyBvZmZzZXQpIDogMDsKK30KKworZW51bXMoaW5kZXg6IG51bWJlciwgb2JqPzpFbnVtKTpFbnVtfG51bGwgeworICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiIS5fX29mZnNldCh0aGlzLmJiX3BvcywgNik7CisgIHJldHVybiBvZmZzZXQgPyAob2JqIHx8IG5ldyBFbnVtKCkpLl9faW5pdCh0aGlzLmJiIS5fX2luZGlyZWN0KHRoaXMuYmIhLl9fdmVjdG9yKHRoaXMuYmJfcG9zICsgb2Zmc2V0KSArIGluZGV4ICogNCksIHRoaXMuYmIhKSA6IG51bGw7Cit9CisKK2VudW1zTGVuZ3RoKCk6bnVtYmVyIHsKKyAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYiEuX19vZmZzZXQodGhpcy5iYl9wb3MsIDYpOworICByZXR1cm4gb2Zmc2V0ID8gdGhpcy5iYiEuX192ZWN0b3JfbGVuKHRoaXMuYmJfcG9zICsgb2Zmc2V0KSA6IDA7Cit9CisKK2ZpbGVJZGVudCgpOnN0cmluZ3xudWxsCitmaWxlSWRlbnQob3B0aW9uYWxFbmNvZGluZzpmbGF0YnVmZmVycy5FbmNvZGluZyk6c3RyaW5nfFVpbnQ4QXJyYXl8bnVsbAorZmlsZUlkZW50KG9wdGlvbmFsRW5jb2Rpbmc/OmFueSk6c3RyaW5nfFVpbnQ4QXJyYXl8bnVsbCB7CisgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIhLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCA4KTsKKyAgcmV0dXJuIG9mZnNldCA/IHRoaXMuYmIhLl9fc3RyaW5nKHRoaXMuYmJfcG9zICsgb2Zmc2V0LCBvcHRpb25hbEVuY29kaW5nKSA6IG51bGw7Cit9CisKK2ZpbGVFeHQoKTpzdHJpbmd8bnVsbAorZmlsZUV4dChvcHRpb25hbEVuY29kaW5nOmZsYXRidWZmZXJzLkVuY29kaW5nKTpzdHJpbmd8VWludDhBcnJheXxudWxsCitmaWxlRXh0KG9wdGlvbmFsRW5jb2Rpbmc/OmFueSk6c3RyaW5nfFVpbnQ4QXJyYXl8bnVsbCB7CisgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIhLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCAxMCk7CisgIHJldHVybiBvZmZzZXQgPyB0aGlzLmJiIS5fX3N0cmluZyh0aGlzLmJiX3BvcyArIG9mZnNldCwgb3B0aW9uYWxFbmNvZGluZykgOiBudWxsOworfQorCityb290VGFibGUob2JqPzpPYmplY3RfKTpPYmplY3RffG51bGwgeworICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiIS5fX29mZnNldCh0aGlzLmJiX3BvcywgMTIpOworICByZXR1cm4gb2Zmc2V0ID8gKG9iaiB8fCBuZXcgT2JqZWN0XygpKS5fX2luaXQodGhpcy5iYiEuX19pbmRpcmVjdCh0aGlzLmJiX3BvcyArIG9mZnNldCksIHRoaXMuYmIhKSA6IG51bGw7Cit9CisKK3NlcnZpY2VzKGluZGV4OiBudW1iZXIsIG9iaj86U2VydmljZSk6U2VydmljZXxudWxsIHsKKyAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYiEuX19vZmZzZXQodGhpcy5iYl9wb3MsIDE0KTsKKyAgcmV0dXJuIG9mZnNldCA/IChvYmogfHwgbmV3IFNlcnZpY2UoKSkuX19pbml0KHRoaXMuYmIhLl9faW5kaXJlY3QodGhpcy5iYiEuX192ZWN0b3IodGhpcy5iYl9wb3MgKyBvZmZzZXQpICsgaW5kZXggKiA0KSwgdGhpcy5iYiEpIDogbnVsbDsKK30KKworc2VydmljZXNMZW5ndGgoKTpudW1iZXIgeworICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiIS5fX29mZnNldCh0aGlzLmJiX3BvcywgMTQpOworICByZXR1cm4gb2Zmc2V0ID8gdGhpcy5iYiEuX192ZWN0b3JfbGVuKHRoaXMuYmJfcG9zICsgb2Zmc2V0KSA6IDA7Cit9CisKK2FkdmFuY2VkRmVhdHVyZXMoKTpiaWdpbnQgeworICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiIS5fX29mZnNldCh0aGlzLmJiX3BvcywgMTYpOworICByZXR1cm4gb2Zmc2V0ID8gdGhpcy5iYiEucmVhZFVpbnQ2NCh0aGlzLmJiX3BvcyArIG9mZnNldCkgOiBCaWdJbnQoJzAnKTsKK30KKworbXV0YXRlX2FkdmFuY2VkX2ZlYXR1cmVzKHZhbHVlOmJpZ2ludCk6Ym9vbGVhbiB7CisgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIhLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCAxNik7CisKKyAgaWYgKG9mZnNldCA9PT0gMCkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHRoaXMuYmIhLndyaXRlVWludDY0KHRoaXMuYmJfcG9zICsgb2Zmc2V0LCB2YWx1ZSk7CisgIHJldHVybiB0cnVlOworfQorCisvKioKKyAqIEFsbCB0aGUgZmlsZXMgdXNlZCBpbiB0aGlzIGNvbXBpbGF0aW9uLiBGaWxlcyBhcmUgcmVsYXRpdmUgdG8gd2hlcmUKKyAqIGZsYXRjIHdhcyBpbnZva2VkLgorICovCitmYnNGaWxlcyhpbmRleDogbnVtYmVyLCBvYmo/OlNjaGVtYUZpbGUpOlNjaGVtYUZpbGV8bnVsbCB7CisgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIhLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCAxOCk7CisgIHJldHVybiBvZmZzZXQgPyAob2JqIHx8IG5ldyBTY2hlbWFGaWxlKCkpLl9faW5pdCh0aGlzLmJiIS5fX2luZGlyZWN0KHRoaXMuYmIhLl9fdmVjdG9yKHRoaXMuYmJfcG9zICsgb2Zmc2V0KSArIGluZGV4ICogNCksIHRoaXMuYmIhKSA6IG51bGw7Cit9CisKK2Zic0ZpbGVzTGVuZ3RoKCk6bnVtYmVyIHsKKyAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYiEuX19vZmZzZXQodGhpcy5iYl9wb3MsIDE4KTsKKyAgcmV0dXJuIG9mZnNldCA/IHRoaXMuYmIhLl9fdmVjdG9yX2xlbih0aGlzLmJiX3BvcyArIG9mZnNldCkgOiAwOworfQorCitzdGF0aWMgZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCk6c3RyaW5nIHsKKyAgcmV0dXJuICdyZWZsZWN0aW9uX1NjaGVtYSc7Cit9CisKK3N0YXRpYyBzdGFydFNjaGVtYShidWlsZGVyOmZsYXRidWZmZXJzLkJ1aWxkZXIpIHsKKyAgYnVpbGRlci5zdGFydE9iamVjdCg4KTsKK30KKworc3RhdGljIGFkZE9iamVjdHMoYnVpbGRlcjpmbGF0YnVmZmVycy5CdWlsZGVyLCBvYmplY3RzT2Zmc2V0OmZsYXRidWZmZXJzLk9mZnNldCkgeworICBidWlsZGVyLmFkZEZpZWxkT2Zmc2V0KDAsIG9iamVjdHNPZmZzZXQsIDApOworfQorCitzdGF0aWMgY3JlYXRlT2JqZWN0c1ZlY3RvcihidWlsZGVyOmZsYXRidWZmZXJzLkJ1aWxkZXIsIGRhdGE6ZmxhdGJ1ZmZlcnMuT2Zmc2V0W10pOmZsYXRidWZmZXJzLk9mZnNldCB7CisgIGJ1aWxkZXIuc3RhcnRWZWN0b3IoNCwgZGF0YS5sZW5ndGgsIDQpOworICBmb3IgKGxldCBpID0gZGF0YS5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgeworICAgIGJ1aWxkZXIuYWRkT2Zmc2V0KGRhdGFbaV0hKTsKKyAgfQorICByZXR1cm4gYnVpbGRlci5lbmRWZWN0b3IoKTsKK30KKworc3RhdGljIHN0YXJ0T2JqZWN0c1ZlY3RvcihidWlsZGVyOmZsYXRidWZmZXJzLkJ1aWxkZXIsIG51bUVsZW1zOm51bWJlcikgeworICBidWlsZGVyLnN0YXJ0VmVjdG9yKDQsIG51bUVsZW1zLCA0KTsKK30KKworc3RhdGljIGFkZEVudW1zKGJ1aWxkZXI6ZmxhdGJ1ZmZlcnMuQnVpbGRlciwgZW51bXNPZmZzZXQ6ZmxhdGJ1ZmZlcnMuT2Zmc2V0KSB7CisgIGJ1aWxkZXIuYWRkRmllbGRPZmZzZXQoMSwgZW51bXNPZmZzZXQsIDApOworfQorCitzdGF0aWMgY3JlYXRlRW51bXNWZWN0b3IoYnVpbGRlcjpmbGF0YnVmZmVycy5CdWlsZGVyLCBkYXRhOmZsYXRidWZmZXJzLk9mZnNldFtdKTpmbGF0YnVmZmVycy5PZmZzZXQgeworICBidWlsZGVyLnN0YXJ0VmVjdG9yKDQsIGRhdGEubGVuZ3RoLCA0KTsKKyAgZm9yIChsZXQgaSA9IGRhdGEubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHsKKyAgICBidWlsZGVyLmFkZE9mZnNldChkYXRhW2ldISk7CisgIH0KKyAgcmV0dXJuIGJ1aWxkZXIuZW5kVmVjdG9yKCk7Cit9CisKK3N0YXRpYyBzdGFydEVudW1zVmVjdG9yKGJ1aWxkZXI6ZmxhdGJ1ZmZlcnMuQnVpbGRlciwgbnVtRWxlbXM6bnVtYmVyKSB7CisgIGJ1aWxkZXIuc3RhcnRWZWN0b3IoNCwgbnVtRWxlbXMsIDQpOworfQorCitzdGF0aWMgYWRkRmlsZUlkZW50KGJ1aWxkZXI6ZmxhdGJ1ZmZlcnMuQnVpbGRlciwgZmlsZUlkZW50T2Zmc2V0OmZsYXRidWZmZXJzLk9mZnNldCkgeworICBidWlsZGVyLmFkZEZpZWxkT2Zmc2V0KDIsIGZpbGVJZGVudE9mZnNldCwgMCk7Cit9CisKK3N0YXRpYyBhZGRGaWxlRXh0KGJ1aWxkZXI6ZmxhdGJ1ZmZlcnMuQnVpbGRlciwgZmlsZUV4dE9mZnNldDpmbGF0YnVmZmVycy5PZmZzZXQpIHsKKyAgYnVpbGRlci5hZGRGaWVsZE9mZnNldCgzLCBmaWxlRXh0T2Zmc2V0LCAwKTsKK30KKworc3RhdGljIGFkZFJvb3RUYWJsZShidWlsZGVyOmZsYXRidWZmZXJzLkJ1aWxkZXIsIHJvb3RUYWJsZU9mZnNldDpmbGF0YnVmZmVycy5PZmZzZXQpIHsKKyAgYnVpbGRlci5hZGRGaWVsZE9mZnNldCg0LCByb290VGFibGVPZmZzZXQsIDApOworfQorCitzdGF0aWMgYWRkU2VydmljZXMoYnVpbGRlcjpmbGF0YnVmZmVycy5CdWlsZGVyLCBzZXJ2aWNlc09mZnNldDpmbGF0YnVmZmVycy5PZmZzZXQpIHsKKyAgYnVpbGRlci5hZGRGaWVsZE9mZnNldCg1LCBzZXJ2aWNlc09mZnNldCwgMCk7Cit9CisKK3N0YXRpYyBjcmVhdGVTZXJ2aWNlc1ZlY3RvcihidWlsZGVyOmZsYXRidWZmZXJzLkJ1aWxkZXIsIGRhdGE6ZmxhdGJ1ZmZlcnMuT2Zmc2V0W10pOmZsYXRidWZmZXJzLk9mZnNldCB7CisgIGJ1aWxkZXIuc3RhcnRWZWN0b3IoNCwgZGF0YS5sZW5ndGgsIDQpOworICBmb3IgKGxldCBpID0gZGF0YS5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgeworICAgIGJ1aWxkZXIuYWRkT2Zmc2V0KGRhdGFbaV0hKTsKKyAgfQorICByZXR1cm4gYnVpbGRlci5lbmRWZWN0b3IoKTsKK30KKworc3RhdGljIHN0YXJ0U2VydmljZXNWZWN0b3IoYnVpbGRlcjpmbGF0YnVmZmVycy5CdWlsZGVyLCBudW1FbGVtczpudW1iZXIpIHsKKyAgYnVpbGRlci5zdGFydFZlY3Rvcig0LCBudW1FbGVtcywgNCk7Cit9CisKK3N0YXRpYyBhZGRBZHZhbmNlZEZlYXR1cmVzKGJ1aWxkZXI6ZmxhdGJ1ZmZlcnMuQnVpbGRlciwgYWR2YW5jZWRGZWF0dXJlczpiaWdpbnQpIHsKKyAgYnVpbGRlci5hZGRGaWVsZEludDY0KDYsIGFkdmFuY2VkRmVhdHVyZXMsIEJpZ0ludCgnMCcpKTsKK30KKworc3RhdGljIGFkZEZic0ZpbGVzKGJ1aWxkZXI6ZmxhdGJ1ZmZlcnMuQnVpbGRlciwgZmJzRmlsZXNPZmZzZXQ6ZmxhdGJ1ZmZlcnMuT2Zmc2V0KSB7CisgIGJ1aWxkZXIuYWRkRmllbGRPZmZzZXQoNywgZmJzRmlsZXNPZmZzZXQsIDApOworfQorCitzdGF0aWMgY3JlYXRlRmJzRmlsZXNWZWN0b3IoYnVpbGRlcjpmbGF0YnVmZmVycy5CdWlsZGVyLCBkYXRhOmZsYXRidWZmZXJzLk9mZnNldFtdKTpmbGF0YnVmZmVycy5PZmZzZXQgeworICBidWlsZGVyLnN0YXJ0VmVjdG9yKDQsIGRhdGEubGVuZ3RoLCA0KTsKKyAgZm9yIChsZXQgaSA9IGRhdGEubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHsKKyAgICBidWlsZGVyLmFkZE9mZnNldChkYXRhW2ldISk7CisgIH0KKyAgcmV0dXJuIGJ1aWxkZXIuZW5kVmVjdG9yKCk7Cit9CisKK3N0YXRpYyBzdGFydEZic0ZpbGVzVmVjdG9yKGJ1aWxkZXI6ZmxhdGJ1ZmZlcnMuQnVpbGRlciwgbnVtRWxlbXM6bnVtYmVyKSB7CisgIGJ1aWxkZXIuc3RhcnRWZWN0b3IoNCwgbnVtRWxlbXMsIDQpOworfQorCitzdGF0aWMgZW5kU2NoZW1hKGJ1aWxkZXI6ZmxhdGJ1ZmZlcnMuQnVpbGRlcik6ZmxhdGJ1ZmZlcnMuT2Zmc2V0IHsKKyAgY29uc3Qgb2Zmc2V0ID0gYnVpbGRlci5lbmRPYmplY3QoKTsKKyAgYnVpbGRlci5yZXF1aXJlZEZpZWxkKG9mZnNldCwgNCkgLy8gb2JqZWN0cworICBidWlsZGVyLnJlcXVpcmVkRmllbGQob2Zmc2V0LCA2KSAvLyBlbnVtcworICByZXR1cm4gb2Zmc2V0OworfQorCitzdGF0aWMgZmluaXNoU2NoZW1hQnVmZmVyKGJ1aWxkZXI6ZmxhdGJ1ZmZlcnMuQnVpbGRlciwgb2Zmc2V0OmZsYXRidWZmZXJzLk9mZnNldCkgeworICBidWlsZGVyLmZpbmlzaChvZmZzZXQsICdCRkJTJyk7Cit9CisKK3N0YXRpYyBmaW5pc2hTaXplUHJlZml4ZWRTY2hlbWFCdWZmZXIoYnVpbGRlcjpmbGF0YnVmZmVycy5CdWlsZGVyLCBvZmZzZXQ6ZmxhdGJ1ZmZlcnMuT2Zmc2V0KSB7CisgIGJ1aWxkZXIuZmluaXNoKG9mZnNldCwgJ0JGQlMnLCB0cnVlKTsKK30KKworCit1bnBhY2soKTogU2NoZW1hVCB7CisgIHJldHVybiBuZXcgU2NoZW1hVCgKKyAgICB0aGlzLmJiIS5jcmVhdGVPYmpMaXN0KHRoaXMub2JqZWN0cy5iaW5kKHRoaXMpLCB0aGlzLm9iamVjdHNMZW5ndGgoKSksCisgICAgdGhpcy5iYiEuY3JlYXRlT2JqTGlzdCh0aGlzLmVudW1zLmJpbmQodGhpcyksIHRoaXMuZW51bXNMZW5ndGgoKSksCisgICAgdGhpcy5maWxlSWRlbnQoKSwKKyAgICB0aGlzLmZpbGVFeHQoKSwKKyAgICAodGhpcy5yb290VGFibGUoKSAhPT0gbnVsbCA/IHRoaXMucm9vdFRhYmxlKCkhLnVucGFjaygpIDogbnVsbCksCisgICAgdGhpcy5iYiEuY3JlYXRlT2JqTGlzdCh0aGlzLnNlcnZpY2VzLmJpbmQodGhpcyksIHRoaXMuc2VydmljZXNMZW5ndGgoKSksCisgICAgdGhpcy5hZHZhbmNlZEZlYXR1cmVzKCksCisgICAgdGhpcy5iYiEuY3JlYXRlT2JqTGlzdCh0aGlzLmZic0ZpbGVzLmJpbmQodGhpcyksIHRoaXMuZmJzRmlsZXNMZW5ndGgoKSkKKyAgKTsKK30KKworCit1bnBhY2tUbyhfbzogU2NoZW1hVCk6IHZvaWQgeworICBfby5vYmplY3RzID0gdGhpcy5iYiEuY3JlYXRlT2JqTGlzdCh0aGlzLm9iamVjdHMuYmluZCh0aGlzKSwgdGhpcy5vYmplY3RzTGVuZ3RoKCkpOworICBfby5lbnVtcyA9IHRoaXMuYmIhLmNyZWF0ZU9iakxpc3QodGhpcy5lbnVtcy5iaW5kKHRoaXMpLCB0aGlzLmVudW1zTGVuZ3RoKCkpOworICBfby5maWxlSWRlbnQgPSB0aGlzLmZpbGVJZGVudCgpOworICBfby5maWxlRXh0ID0gdGhpcy5maWxlRXh0KCk7CisgIF9vLnJvb3RUYWJsZSA9ICh0aGlzLnJvb3RUYWJsZSgpICE9PSBudWxsID8gdGhpcy5yb290VGFibGUoKSEudW5wYWNrKCkgOiBudWxsKTsKKyAgX28uc2VydmljZXMgPSB0aGlzLmJiIS5jcmVhdGVPYmpMaXN0KHRoaXMuc2VydmljZXMuYmluZCh0aGlzKSwgdGhpcy5zZXJ2aWNlc0xlbmd0aCgpKTsKKyAgX28uYWR2YW5jZWRGZWF0dXJlcyA9IHRoaXMuYWR2YW5jZWRGZWF0dXJlcygpOworICBfby5mYnNGaWxlcyA9IHRoaXMuYmIhLmNyZWF0ZU9iakxpc3QodGhpcy5mYnNGaWxlcy5iaW5kKHRoaXMpLCB0aGlzLmZic0ZpbGVzTGVuZ3RoKCkpOworfQorfQorCitleHBvcnQgY2xhc3MgU2NoZW1hVCB7Citjb25zdHJ1Y3RvcigKKyAgcHVibGljIG9iamVjdHM6IChPYmplY3RfVClbXSA9IFtdLAorICBwdWJsaWMgZW51bXM6IChFbnVtVClbXSA9IFtdLAorICBwdWJsaWMgZmlsZUlkZW50OiBzdHJpbmd8VWludDhBcnJheXxudWxsID0gbnVsbCwKKyAgcHVibGljIGZpbGVFeHQ6IHN0cmluZ3xVaW50OEFycmF5fG51bGwgPSBudWxsLAorICBwdWJsaWMgcm9vdFRhYmxlOiBPYmplY3RfVHxudWxsID0gbnVsbCwKKyAgcHVibGljIHNlcnZpY2VzOiAoU2VydmljZVQpW10gPSBbXSwKKyAgcHVibGljIGFkdmFuY2VkRmVhdHVyZXM6IGJpZ2ludCA9IEJpZ0ludCgnMCcpLAorICBwdWJsaWMgZmJzRmlsZXM6IChTY2hlbWFGaWxlVClbXSA9IFtdCispe30KKworCitwYWNrKGJ1aWxkZXI6ZmxhdGJ1ZmZlcnMuQnVpbGRlcik6IGZsYXRidWZmZXJzLk9mZnNldCB7CisgIGNvbnN0IG9iamVjdHMgPSBTY2hlbWEuY3JlYXRlT2JqZWN0c1ZlY3RvcihidWlsZGVyLCBidWlsZGVyLmNyZWF0ZU9iamVjdE9mZnNldExpc3QodGhpcy5vYmplY3RzKSk7CisgIGNvbnN0IGVudW1zID0gU2NoZW1hLmNyZWF0ZUVudW1zVmVjdG9yKGJ1aWxkZXIsIGJ1aWxkZXIuY3JlYXRlT2JqZWN0T2Zmc2V0TGlzdCh0aGlzLmVudW1zKSk7CisgIGNvbnN0IGZpbGVJZGVudCA9ICh0aGlzLmZpbGVJZGVudCAhPT0gbnVsbCA/IGJ1aWxkZXIuY3JlYXRlU3RyaW5nKHRoaXMuZmlsZUlkZW50ISkgOiAwKTsKKyAgY29uc3QgZmlsZUV4dCA9ICh0aGlzLmZpbGVFeHQgIT09IG51bGwgPyBidWlsZGVyLmNyZWF0ZVN0cmluZyh0aGlzLmZpbGVFeHQhKSA6IDApOworICBjb25zdCByb290VGFibGUgPSAodGhpcy5yb290VGFibGUgIT09IG51bGwgPyB0aGlzLnJvb3RUYWJsZSEucGFjayhidWlsZGVyKSA6IDApOworICBjb25zdCBzZXJ2aWNlcyA9IFNjaGVtYS5jcmVhdGVTZXJ2aWNlc1ZlY3RvcihidWlsZGVyLCBidWlsZGVyLmNyZWF0ZU9iamVjdE9mZnNldExpc3QodGhpcy5zZXJ2aWNlcykpOworICBjb25zdCBmYnNGaWxlcyA9IFNjaGVtYS5jcmVhdGVGYnNGaWxlc1ZlY3RvcihidWlsZGVyLCBidWlsZGVyLmNyZWF0ZU9iamVjdE9mZnNldExpc3QodGhpcy5mYnNGaWxlcykpOworCisgIFNjaGVtYS5zdGFydFNjaGVtYShidWlsZGVyKTsKKyAgU2NoZW1hLmFkZE9iamVjdHMoYnVpbGRlciwgb2JqZWN0cyk7CisgIFNjaGVtYS5hZGRFbnVtcyhidWlsZGVyLCBlbnVtcyk7CisgIFNjaGVtYS5hZGRGaWxlSWRlbnQoYnVpbGRlciwgZmlsZUlkZW50KTsKKyAgU2NoZW1hLmFkZEZpbGVFeHQoYnVpbGRlciwgZmlsZUV4dCk7CisgIFNjaGVtYS5hZGRSb290VGFibGUoYnVpbGRlciwgcm9vdFRhYmxlKTsKKyAgU2NoZW1hLmFkZFNlcnZpY2VzKGJ1aWxkZXIsIHNlcnZpY2VzKTsKKyAgU2NoZW1hLmFkZEFkdmFuY2VkRmVhdHVyZXMoYnVpbGRlciwgdGhpcy5hZHZhbmNlZEZlYXR1cmVzKTsKKyAgU2NoZW1hLmFkZEZic0ZpbGVzKGJ1aWxkZXIsIGZic0ZpbGVzKTsKKworICByZXR1cm4gU2NoZW1hLmVuZFNjaGVtYShidWlsZGVyKTsKK30KK30KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL3RzL3JlZmxlY3Rpb24vc2VydmljZS5qcyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL3RzL3JlZmxlY3Rpb24vc2VydmljZS5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YzY2ZWY3Ci0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvdHMvcmVmbGVjdGlvbi9zZXJ2aWNlLmpzCkBAIC0wLDAgKzEsMTQ2IEBACisvLyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBieSB0aGUgRmxhdEJ1ZmZlcnMgY29tcGlsZXIsIGRvIG5vdCBtb2RpZnkKK2ltcG9ydCAqIGFzIGZsYXRidWZmZXJzIGZyb20gJ2ZsYXRidWZmZXJzJzsKK2ltcG9ydCB7IEtleVZhbHVlIH0gZnJvbSAnLi4vcmVmbGVjdGlvbi9rZXktdmFsdWUuanMnOworaW1wb3J0IHsgUlBDQ2FsbCB9IGZyb20gJy4uL3JlZmxlY3Rpb24vcnBjY2FsbC5qcyc7CitleHBvcnQgY2xhc3MgU2VydmljZSB7CisgICAgY29uc3RydWN0b3IoKSB7CisgICAgICAgIHRoaXMuYmIgPSBudWxsOworICAgICAgICB0aGlzLmJiX3BvcyA9IDA7CisgICAgfQorICAgIF9faW5pdChpLCBiYikgeworICAgICAgICB0aGlzLmJiX3BvcyA9IGk7CisgICAgICAgIHRoaXMuYmIgPSBiYjsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorICAgIHN0YXRpYyBnZXRSb290QXNTZXJ2aWNlKGJiLCBvYmopIHsKKyAgICAgICAgcmV0dXJuIChvYmogfHwgbmV3IFNlcnZpY2UoKSkuX19pbml0KGJiLnJlYWRJbnQzMihiYi5wb3NpdGlvbigpKSArIGJiLnBvc2l0aW9uKCksIGJiKTsKKyAgICB9CisgICAgc3RhdGljIGdldFNpemVQcmVmaXhlZFJvb3RBc1NlcnZpY2UoYmIsIG9iaikgeworICAgICAgICBiYi5zZXRQb3NpdGlvbihiYi5wb3NpdGlvbigpICsgZmxhdGJ1ZmZlcnMuU0laRV9QUkVGSVhfTEVOR1RIKTsKKyAgICAgICAgcmV0dXJuIChvYmogfHwgbmV3IFNlcnZpY2UoKSkuX19pbml0KGJiLnJlYWRJbnQzMihiYi5wb3NpdGlvbigpKSArIGJiLnBvc2l0aW9uKCksIGJiKTsKKyAgICB9CisgICAgbmFtZShvcHRpb25hbEVuY29kaW5nKSB7CisgICAgICAgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsIDQpOworICAgICAgICByZXR1cm4gb2Zmc2V0ID8gdGhpcy5iYi5fX3N0cmluZyh0aGlzLmJiX3BvcyArIG9mZnNldCwgb3B0aW9uYWxFbmNvZGluZykgOiBudWxsOworICAgIH0KKyAgICBjYWxscyhpbmRleCwgb2JqKSB7CisgICAgICAgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsIDYpOworICAgICAgICByZXR1cm4gb2Zmc2V0ID8gKG9iaiB8fCBuZXcgUlBDQ2FsbCgpKS5fX2luaXQodGhpcy5iYi5fX2luZGlyZWN0KHRoaXMuYmIuX192ZWN0b3IodGhpcy5iYl9wb3MgKyBvZmZzZXQpICsgaW5kZXggKiA0KSwgdGhpcy5iYikgOiBudWxsOworICAgIH0KKyAgICBjYWxsc0xlbmd0aCgpIHsKKyAgICAgICAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywgNik7CisgICAgICAgIHJldHVybiBvZmZzZXQgPyB0aGlzLmJiLl9fdmVjdG9yX2xlbih0aGlzLmJiX3BvcyArIG9mZnNldCkgOiAwOworICAgIH0KKyAgICBhdHRyaWJ1dGVzKGluZGV4LCBvYmopIHsKKyAgICAgICAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywgOCk7CisgICAgICAgIHJldHVybiBvZmZzZXQgPyAob2JqIHx8IG5ldyBLZXlWYWx1ZSgpKS5fX2luaXQodGhpcy5iYi5fX2luZGlyZWN0KHRoaXMuYmIuX192ZWN0b3IodGhpcy5iYl9wb3MgKyBvZmZzZXQpICsgaW5kZXggKiA0KSwgdGhpcy5iYikgOiBudWxsOworICAgIH0KKyAgICBhdHRyaWJ1dGVzTGVuZ3RoKCkgeworICAgICAgICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCA4KTsKKyAgICAgICAgcmV0dXJuIG9mZnNldCA/IHRoaXMuYmIuX192ZWN0b3JfbGVuKHRoaXMuYmJfcG9zICsgb2Zmc2V0KSA6IDA7CisgICAgfQorICAgIGRvY3VtZW50YXRpb24oaW5kZXgsIG9wdGlvbmFsRW5jb2RpbmcpIHsKKyAgICAgICAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywgMTApOworICAgICAgICByZXR1cm4gb2Zmc2V0ID8gdGhpcy5iYi5fX3N0cmluZyh0aGlzLmJiLl9fdmVjdG9yKHRoaXMuYmJfcG9zICsgb2Zmc2V0KSArIGluZGV4ICogNCwgb3B0aW9uYWxFbmNvZGluZykgOiBudWxsOworICAgIH0KKyAgICBkb2N1bWVudGF0aW9uTGVuZ3RoKCkgeworICAgICAgICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCAxMCk7CisgICAgICAgIHJldHVybiBvZmZzZXQgPyB0aGlzLmJiLl9fdmVjdG9yX2xlbih0aGlzLmJiX3BvcyArIG9mZnNldCkgOiAwOworICAgIH0KKyAgICBkZWNsYXJhdGlvbkZpbGUob3B0aW9uYWxFbmNvZGluZykgeworICAgICAgICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCAxMik7CisgICAgICAgIHJldHVybiBvZmZzZXQgPyB0aGlzLmJiLl9fc3RyaW5nKHRoaXMuYmJfcG9zICsgb2Zmc2V0LCBvcHRpb25hbEVuY29kaW5nKSA6IG51bGw7CisgICAgfQorICAgIHN0YXRpYyBnZXRGdWxseVF1YWxpZmllZE5hbWUoKSB7CisgICAgICAgIHJldHVybiAncmVmbGVjdGlvbl9TZXJ2aWNlJzsKKyAgICB9CisgICAgc3RhdGljIHN0YXJ0U2VydmljZShidWlsZGVyKSB7CisgICAgICAgIGJ1aWxkZXIuc3RhcnRPYmplY3QoNSk7CisgICAgfQorICAgIHN0YXRpYyBhZGROYW1lKGJ1aWxkZXIsIG5hbWVPZmZzZXQpIHsKKyAgICAgICAgYnVpbGRlci5hZGRGaWVsZE9mZnNldCgwLCBuYW1lT2Zmc2V0LCAwKTsKKyAgICB9CisgICAgc3RhdGljIGFkZENhbGxzKGJ1aWxkZXIsIGNhbGxzT2Zmc2V0KSB7CisgICAgICAgIGJ1aWxkZXIuYWRkRmllbGRPZmZzZXQoMSwgY2FsbHNPZmZzZXQsIDApOworICAgIH0KKyAgICBzdGF0aWMgY3JlYXRlQ2FsbHNWZWN0b3IoYnVpbGRlciwgZGF0YSkgeworICAgICAgICBidWlsZGVyLnN0YXJ0VmVjdG9yKDQsIGRhdGEubGVuZ3RoLCA0KTsKKyAgICAgICAgZm9yIChsZXQgaSA9IGRhdGEubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHsKKyAgICAgICAgICAgIGJ1aWxkZXIuYWRkT2Zmc2V0KGRhdGFbaV0pOworICAgICAgICB9CisgICAgICAgIHJldHVybiBidWlsZGVyLmVuZFZlY3RvcigpOworICAgIH0KKyAgICBzdGF0aWMgc3RhcnRDYWxsc1ZlY3RvcihidWlsZGVyLCBudW1FbGVtcykgeworICAgICAgICBidWlsZGVyLnN0YXJ0VmVjdG9yKDQsIG51bUVsZW1zLCA0KTsKKyAgICB9CisgICAgc3RhdGljIGFkZEF0dHJpYnV0ZXMoYnVpbGRlciwgYXR0cmlidXRlc09mZnNldCkgeworICAgICAgICBidWlsZGVyLmFkZEZpZWxkT2Zmc2V0KDIsIGF0dHJpYnV0ZXNPZmZzZXQsIDApOworICAgIH0KKyAgICBzdGF0aWMgY3JlYXRlQXR0cmlidXRlc1ZlY3RvcihidWlsZGVyLCBkYXRhKSB7CisgICAgICAgIGJ1aWxkZXIuc3RhcnRWZWN0b3IoNCwgZGF0YS5sZW5ndGgsIDQpOworICAgICAgICBmb3IgKGxldCBpID0gZGF0YS5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgeworICAgICAgICAgICAgYnVpbGRlci5hZGRPZmZzZXQoZGF0YVtpXSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGJ1aWxkZXIuZW5kVmVjdG9yKCk7CisgICAgfQorICAgIHN0YXRpYyBzdGFydEF0dHJpYnV0ZXNWZWN0b3IoYnVpbGRlciwgbnVtRWxlbXMpIHsKKyAgICAgICAgYnVpbGRlci5zdGFydFZlY3Rvcig0LCBudW1FbGVtcywgNCk7CisgICAgfQorICAgIHN0YXRpYyBhZGREb2N1bWVudGF0aW9uKGJ1aWxkZXIsIGRvY3VtZW50YXRpb25PZmZzZXQpIHsKKyAgICAgICAgYnVpbGRlci5hZGRGaWVsZE9mZnNldCgzLCBkb2N1bWVudGF0aW9uT2Zmc2V0LCAwKTsKKyAgICB9CisgICAgc3RhdGljIGNyZWF0ZURvY3VtZW50YXRpb25WZWN0b3IoYnVpbGRlciwgZGF0YSkgeworICAgICAgICBidWlsZGVyLnN0YXJ0VmVjdG9yKDQsIGRhdGEubGVuZ3RoLCA0KTsKKyAgICAgICAgZm9yIChsZXQgaSA9IGRhdGEubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHsKKyAgICAgICAgICAgIGJ1aWxkZXIuYWRkT2Zmc2V0KGRhdGFbaV0pOworICAgICAgICB9CisgICAgICAgIHJldHVybiBidWlsZGVyLmVuZFZlY3RvcigpOworICAgIH0KKyAgICBzdGF0aWMgc3RhcnREb2N1bWVudGF0aW9uVmVjdG9yKGJ1aWxkZXIsIG51bUVsZW1zKSB7CisgICAgICAgIGJ1aWxkZXIuc3RhcnRWZWN0b3IoNCwgbnVtRWxlbXMsIDQpOworICAgIH0KKyAgICBzdGF0aWMgYWRkRGVjbGFyYXRpb25GaWxlKGJ1aWxkZXIsIGRlY2xhcmF0aW9uRmlsZU9mZnNldCkgeworICAgICAgICBidWlsZGVyLmFkZEZpZWxkT2Zmc2V0KDQsIGRlY2xhcmF0aW9uRmlsZU9mZnNldCwgMCk7CisgICAgfQorICAgIHN0YXRpYyBlbmRTZXJ2aWNlKGJ1aWxkZXIpIHsKKyAgICAgICAgY29uc3Qgb2Zmc2V0ID0gYnVpbGRlci5lbmRPYmplY3QoKTsKKyAgICAgICAgYnVpbGRlci5yZXF1aXJlZEZpZWxkKG9mZnNldCwgNCk7IC8vIG5hbWUKKyAgICAgICAgcmV0dXJuIG9mZnNldDsKKyAgICB9CisgICAgc3RhdGljIGNyZWF0ZVNlcnZpY2UoYnVpbGRlciwgbmFtZU9mZnNldCwgY2FsbHNPZmZzZXQsIGF0dHJpYnV0ZXNPZmZzZXQsIGRvY3VtZW50YXRpb25PZmZzZXQsIGRlY2xhcmF0aW9uRmlsZU9mZnNldCkgeworICAgICAgICBTZXJ2aWNlLnN0YXJ0U2VydmljZShidWlsZGVyKTsKKyAgICAgICAgU2VydmljZS5hZGROYW1lKGJ1aWxkZXIsIG5hbWVPZmZzZXQpOworICAgICAgICBTZXJ2aWNlLmFkZENhbGxzKGJ1aWxkZXIsIGNhbGxzT2Zmc2V0KTsKKyAgICAgICAgU2VydmljZS5hZGRBdHRyaWJ1dGVzKGJ1aWxkZXIsIGF0dHJpYnV0ZXNPZmZzZXQpOworICAgICAgICBTZXJ2aWNlLmFkZERvY3VtZW50YXRpb24oYnVpbGRlciwgZG9jdW1lbnRhdGlvbk9mZnNldCk7CisgICAgICAgIFNlcnZpY2UuYWRkRGVjbGFyYXRpb25GaWxlKGJ1aWxkZXIsIGRlY2xhcmF0aW9uRmlsZU9mZnNldCk7CisgICAgICAgIHJldHVybiBTZXJ2aWNlLmVuZFNlcnZpY2UoYnVpbGRlcik7CisgICAgfQorICAgIHVucGFjaygpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBTZXJ2aWNlVCh0aGlzLm5hbWUoKSwgdGhpcy5iYi5jcmVhdGVPYmpMaXN0KHRoaXMuY2FsbHMuYmluZCh0aGlzKSwgdGhpcy5jYWxsc0xlbmd0aCgpKSwgdGhpcy5iYi5jcmVhdGVPYmpMaXN0KHRoaXMuYXR0cmlidXRlcy5iaW5kKHRoaXMpLCB0aGlzLmF0dHJpYnV0ZXNMZW5ndGgoKSksIHRoaXMuYmIuY3JlYXRlU2NhbGFyTGlzdCh0aGlzLmRvY3VtZW50YXRpb24uYmluZCh0aGlzKSwgdGhpcy5kb2N1bWVudGF0aW9uTGVuZ3RoKCkpLCB0aGlzLmRlY2xhcmF0aW9uRmlsZSgpKTsKKyAgICB9CisgICAgdW5wYWNrVG8oX28pIHsKKyAgICAgICAgX28ubmFtZSA9IHRoaXMubmFtZSgpOworICAgICAgICBfby5jYWxscyA9IHRoaXMuYmIuY3JlYXRlT2JqTGlzdCh0aGlzLmNhbGxzLmJpbmQodGhpcyksIHRoaXMuY2FsbHNMZW5ndGgoKSk7CisgICAgICAgIF9vLmF0dHJpYnV0ZXMgPSB0aGlzLmJiLmNyZWF0ZU9iakxpc3QodGhpcy5hdHRyaWJ1dGVzLmJpbmQodGhpcyksIHRoaXMuYXR0cmlidXRlc0xlbmd0aCgpKTsKKyAgICAgICAgX28uZG9jdW1lbnRhdGlvbiA9IHRoaXMuYmIuY3JlYXRlU2NhbGFyTGlzdCh0aGlzLmRvY3VtZW50YXRpb24uYmluZCh0aGlzKSwgdGhpcy5kb2N1bWVudGF0aW9uTGVuZ3RoKCkpOworICAgICAgICBfby5kZWNsYXJhdGlvbkZpbGUgPSB0aGlzLmRlY2xhcmF0aW9uRmlsZSgpOworICAgIH0KK30KK2V4cG9ydCBjbGFzcyBTZXJ2aWNlVCB7CisgICAgY29uc3RydWN0b3IobmFtZSA9IG51bGwsIGNhbGxzID0gW10sIGF0dHJpYnV0ZXMgPSBbXSwgZG9jdW1lbnRhdGlvbiA9IFtdLCBkZWNsYXJhdGlvbkZpbGUgPSBudWxsKSB7CisgICAgICAgIHRoaXMubmFtZSA9IG5hbWU7CisgICAgICAgIHRoaXMuY2FsbHMgPSBjYWxsczsKKyAgICAgICAgdGhpcy5hdHRyaWJ1dGVzID0gYXR0cmlidXRlczsKKyAgICAgICAgdGhpcy5kb2N1bWVudGF0aW9uID0gZG9jdW1lbnRhdGlvbjsKKyAgICAgICAgdGhpcy5kZWNsYXJhdGlvbkZpbGUgPSBkZWNsYXJhdGlvbkZpbGU7CisgICAgfQorICAgIHBhY2soYnVpbGRlcikgeworICAgICAgICBjb25zdCBuYW1lID0gKHRoaXMubmFtZSAhPT0gbnVsbCA/IGJ1aWxkZXIuY3JlYXRlU3RyaW5nKHRoaXMubmFtZSkgOiAwKTsKKyAgICAgICAgY29uc3QgY2FsbHMgPSBTZXJ2aWNlLmNyZWF0ZUNhbGxzVmVjdG9yKGJ1aWxkZXIsIGJ1aWxkZXIuY3JlYXRlT2JqZWN0T2Zmc2V0TGlzdCh0aGlzLmNhbGxzKSk7CisgICAgICAgIGNvbnN0IGF0dHJpYnV0ZXMgPSBTZXJ2aWNlLmNyZWF0ZUF0dHJpYnV0ZXNWZWN0b3IoYnVpbGRlciwgYnVpbGRlci5jcmVhdGVPYmplY3RPZmZzZXRMaXN0KHRoaXMuYXR0cmlidXRlcykpOworICAgICAgICBjb25zdCBkb2N1bWVudGF0aW9uID0gU2VydmljZS5jcmVhdGVEb2N1bWVudGF0aW9uVmVjdG9yKGJ1aWxkZXIsIGJ1aWxkZXIuY3JlYXRlT2JqZWN0T2Zmc2V0TGlzdCh0aGlzLmRvY3VtZW50YXRpb24pKTsKKyAgICAgICAgY29uc3QgZGVjbGFyYXRpb25GaWxlID0gKHRoaXMuZGVjbGFyYXRpb25GaWxlICE9PSBudWxsID8gYnVpbGRlci5jcmVhdGVTdHJpbmcodGhpcy5kZWNsYXJhdGlvbkZpbGUpIDogMCk7CisgICAgICAgIHJldHVybiBTZXJ2aWNlLmNyZWF0ZVNlcnZpY2UoYnVpbGRlciwgbmFtZSwgY2FsbHMsIGF0dHJpYnV0ZXMsIGRvY3VtZW50YXRpb24sIGRlY2xhcmF0aW9uRmlsZSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvdHMvcmVmbGVjdGlvbi9zZXJ2aWNlLnRzIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvdHMvcmVmbGVjdGlvbi9zZXJ2aWNlLnRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMwODNjYWUKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy90cy9yZWZsZWN0aW9uL3NlcnZpY2UudHMKQEAgLTAsMCArMSwyMDEgQEAKKy8vIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGJ5IHRoZSBGbGF0QnVmZmVycyBjb21waWxlciwgZG8gbm90IG1vZGlmeQorCitpbXBvcnQgKiBhcyBmbGF0YnVmZmVycyBmcm9tICdmbGF0YnVmZmVycyc7CisKK2ltcG9ydCB7IEtleVZhbHVlLCBLZXlWYWx1ZVQgfSBmcm9tICcuLi9yZWZsZWN0aW9uL2tleS12YWx1ZS5qcyc7CitpbXBvcnQgeyBSUENDYWxsLCBSUENDYWxsVCB9IGZyb20gJy4uL3JlZmxlY3Rpb24vcnBjY2FsbC5qcyc7CisKKworZXhwb3J0IGNsYXNzIFNlcnZpY2UgeworICBiYjogZmxhdGJ1ZmZlcnMuQnl0ZUJ1ZmZlcnxudWxsID0gbnVsbDsKKyAgYmJfcG9zID0gMDsKKyAgX19pbml0KGk6bnVtYmVyLCBiYjpmbGF0YnVmZmVycy5CeXRlQnVmZmVyKTpTZXJ2aWNlIHsKKyAgdGhpcy5iYl9wb3MgPSBpOworICB0aGlzLmJiID0gYmI7CisgIHJldHVybiB0aGlzOworfQorCitzdGF0aWMgZ2V0Um9vdEFzU2VydmljZShiYjpmbGF0YnVmZmVycy5CeXRlQnVmZmVyLCBvYmo/OlNlcnZpY2UpOlNlcnZpY2UgeworICByZXR1cm4gKG9iaiB8fCBuZXcgU2VydmljZSgpKS5fX2luaXQoYmIucmVhZEludDMyKGJiLnBvc2l0aW9uKCkpICsgYmIucG9zaXRpb24oKSwgYmIpOworfQorCitzdGF0aWMgZ2V0U2l6ZVByZWZpeGVkUm9vdEFzU2VydmljZShiYjpmbGF0YnVmZmVycy5CeXRlQnVmZmVyLCBvYmo/OlNlcnZpY2UpOlNlcnZpY2UgeworICBiYi5zZXRQb3NpdGlvbihiYi5wb3NpdGlvbigpICsgZmxhdGJ1ZmZlcnMuU0laRV9QUkVGSVhfTEVOR1RIKTsKKyAgcmV0dXJuIChvYmogfHwgbmV3IFNlcnZpY2UoKSkuX19pbml0KGJiLnJlYWRJbnQzMihiYi5wb3NpdGlvbigpKSArIGJiLnBvc2l0aW9uKCksIGJiKTsKK30KKworbmFtZSgpOnN0cmluZ3xudWxsCituYW1lKG9wdGlvbmFsRW5jb2Rpbmc6ZmxhdGJ1ZmZlcnMuRW5jb2RpbmcpOnN0cmluZ3xVaW50OEFycmF5fG51bGwKK25hbWUob3B0aW9uYWxFbmNvZGluZz86YW55KTpzdHJpbmd8VWludDhBcnJheXxudWxsIHsKKyAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYiEuX19vZmZzZXQodGhpcy5iYl9wb3MsIDQpOworICByZXR1cm4gb2Zmc2V0ID8gdGhpcy5iYiEuX19zdHJpbmcodGhpcy5iYl9wb3MgKyBvZmZzZXQsIG9wdGlvbmFsRW5jb2RpbmcpIDogbnVsbDsKK30KKworY2FsbHMoaW5kZXg6IG51bWJlciwgb2JqPzpSUENDYWxsKTpSUENDYWxsfG51bGwgeworICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiIS5fX29mZnNldCh0aGlzLmJiX3BvcywgNik7CisgIHJldHVybiBvZmZzZXQgPyAob2JqIHx8IG5ldyBSUENDYWxsKCkpLl9faW5pdCh0aGlzLmJiIS5fX2luZGlyZWN0KHRoaXMuYmIhLl9fdmVjdG9yKHRoaXMuYmJfcG9zICsgb2Zmc2V0KSArIGluZGV4ICogNCksIHRoaXMuYmIhKSA6IG51bGw7Cit9CisKK2NhbGxzTGVuZ3RoKCk6bnVtYmVyIHsKKyAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYiEuX19vZmZzZXQodGhpcy5iYl9wb3MsIDYpOworICByZXR1cm4gb2Zmc2V0ID8gdGhpcy5iYiEuX192ZWN0b3JfbGVuKHRoaXMuYmJfcG9zICsgb2Zmc2V0KSA6IDA7Cit9CisKK2F0dHJpYnV0ZXMoaW5kZXg6IG51bWJlciwgb2JqPzpLZXlWYWx1ZSk6S2V5VmFsdWV8bnVsbCB7CisgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIhLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCA4KTsKKyAgcmV0dXJuIG9mZnNldCA/IChvYmogfHwgbmV3IEtleVZhbHVlKCkpLl9faW5pdCh0aGlzLmJiIS5fX2luZGlyZWN0KHRoaXMuYmIhLl9fdmVjdG9yKHRoaXMuYmJfcG9zICsgb2Zmc2V0KSArIGluZGV4ICogNCksIHRoaXMuYmIhKSA6IG51bGw7Cit9CisKK2F0dHJpYnV0ZXNMZW5ndGgoKTpudW1iZXIgeworICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiIS5fX29mZnNldCh0aGlzLmJiX3BvcywgOCk7CisgIHJldHVybiBvZmZzZXQgPyB0aGlzLmJiIS5fX3ZlY3Rvcl9sZW4odGhpcy5iYl9wb3MgKyBvZmZzZXQpIDogMDsKK30KKworZG9jdW1lbnRhdGlvbihpbmRleDogbnVtYmVyKTpzdHJpbmcKK2RvY3VtZW50YXRpb24oaW5kZXg6IG51bWJlcixvcHRpb25hbEVuY29kaW5nOmZsYXRidWZmZXJzLkVuY29kaW5nKTpzdHJpbmd8VWludDhBcnJheQorZG9jdW1lbnRhdGlvbihpbmRleDogbnVtYmVyLG9wdGlvbmFsRW5jb2Rpbmc/OmFueSk6c3RyaW5nfFVpbnQ4QXJyYXl8bnVsbCB7CisgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIhLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCAxMCk7CisgIHJldHVybiBvZmZzZXQgPyB0aGlzLmJiIS5fX3N0cmluZyh0aGlzLmJiIS5fX3ZlY3Rvcih0aGlzLmJiX3BvcyArIG9mZnNldCkgKyBpbmRleCAqIDQsIG9wdGlvbmFsRW5jb2RpbmcpIDogbnVsbDsKK30KKworZG9jdW1lbnRhdGlvbkxlbmd0aCgpOm51bWJlciB7CisgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIhLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCAxMCk7CisgIHJldHVybiBvZmZzZXQgPyB0aGlzLmJiIS5fX3ZlY3Rvcl9sZW4odGhpcy5iYl9wb3MgKyBvZmZzZXQpIDogMDsKK30KKworLyoqCisgKiBGaWxlIHRoYXQgdGhpcyBTZXJ2aWNlIGlzIGRlY2xhcmVkIGluLgorICovCitkZWNsYXJhdGlvbkZpbGUoKTpzdHJpbmd8bnVsbAorZGVjbGFyYXRpb25GaWxlKG9wdGlvbmFsRW5jb2Rpbmc6ZmxhdGJ1ZmZlcnMuRW5jb2RpbmcpOnN0cmluZ3xVaW50OEFycmF5fG51bGwKK2RlY2xhcmF0aW9uRmlsZShvcHRpb25hbEVuY29kaW5nPzphbnkpOnN0cmluZ3xVaW50OEFycmF5fG51bGwgeworICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiIS5fX29mZnNldCh0aGlzLmJiX3BvcywgMTIpOworICByZXR1cm4gb2Zmc2V0ID8gdGhpcy5iYiEuX19zdHJpbmcodGhpcy5iYl9wb3MgKyBvZmZzZXQsIG9wdGlvbmFsRW5jb2RpbmcpIDogbnVsbDsKK30KKworc3RhdGljIGdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpOnN0cmluZyB7CisgIHJldHVybiAncmVmbGVjdGlvbl9TZXJ2aWNlJzsKK30KKworc3RhdGljIHN0YXJ0U2VydmljZShidWlsZGVyOmZsYXRidWZmZXJzLkJ1aWxkZXIpIHsKKyAgYnVpbGRlci5zdGFydE9iamVjdCg1KTsKK30KKworc3RhdGljIGFkZE5hbWUoYnVpbGRlcjpmbGF0YnVmZmVycy5CdWlsZGVyLCBuYW1lT2Zmc2V0OmZsYXRidWZmZXJzLk9mZnNldCkgeworICBidWlsZGVyLmFkZEZpZWxkT2Zmc2V0KDAsIG5hbWVPZmZzZXQsIDApOworfQorCitzdGF0aWMgYWRkQ2FsbHMoYnVpbGRlcjpmbGF0YnVmZmVycy5CdWlsZGVyLCBjYWxsc09mZnNldDpmbGF0YnVmZmVycy5PZmZzZXQpIHsKKyAgYnVpbGRlci5hZGRGaWVsZE9mZnNldCgxLCBjYWxsc09mZnNldCwgMCk7Cit9CisKK3N0YXRpYyBjcmVhdGVDYWxsc1ZlY3RvcihidWlsZGVyOmZsYXRidWZmZXJzLkJ1aWxkZXIsIGRhdGE6ZmxhdGJ1ZmZlcnMuT2Zmc2V0W10pOmZsYXRidWZmZXJzLk9mZnNldCB7CisgIGJ1aWxkZXIuc3RhcnRWZWN0b3IoNCwgZGF0YS5sZW5ndGgsIDQpOworICBmb3IgKGxldCBpID0gZGF0YS5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgeworICAgIGJ1aWxkZXIuYWRkT2Zmc2V0KGRhdGFbaV0hKTsKKyAgfQorICByZXR1cm4gYnVpbGRlci5lbmRWZWN0b3IoKTsKK30KKworc3RhdGljIHN0YXJ0Q2FsbHNWZWN0b3IoYnVpbGRlcjpmbGF0YnVmZmVycy5CdWlsZGVyLCBudW1FbGVtczpudW1iZXIpIHsKKyAgYnVpbGRlci5zdGFydFZlY3Rvcig0LCBudW1FbGVtcywgNCk7Cit9CisKK3N0YXRpYyBhZGRBdHRyaWJ1dGVzKGJ1aWxkZXI6ZmxhdGJ1ZmZlcnMuQnVpbGRlciwgYXR0cmlidXRlc09mZnNldDpmbGF0YnVmZmVycy5PZmZzZXQpIHsKKyAgYnVpbGRlci5hZGRGaWVsZE9mZnNldCgyLCBhdHRyaWJ1dGVzT2Zmc2V0LCAwKTsKK30KKworc3RhdGljIGNyZWF0ZUF0dHJpYnV0ZXNWZWN0b3IoYnVpbGRlcjpmbGF0YnVmZmVycy5CdWlsZGVyLCBkYXRhOmZsYXRidWZmZXJzLk9mZnNldFtdKTpmbGF0YnVmZmVycy5PZmZzZXQgeworICBidWlsZGVyLnN0YXJ0VmVjdG9yKDQsIGRhdGEubGVuZ3RoLCA0KTsKKyAgZm9yIChsZXQgaSA9IGRhdGEubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHsKKyAgICBidWlsZGVyLmFkZE9mZnNldChkYXRhW2ldISk7CisgIH0KKyAgcmV0dXJuIGJ1aWxkZXIuZW5kVmVjdG9yKCk7Cit9CisKK3N0YXRpYyBzdGFydEF0dHJpYnV0ZXNWZWN0b3IoYnVpbGRlcjpmbGF0YnVmZmVycy5CdWlsZGVyLCBudW1FbGVtczpudW1iZXIpIHsKKyAgYnVpbGRlci5zdGFydFZlY3Rvcig0LCBudW1FbGVtcywgNCk7Cit9CisKK3N0YXRpYyBhZGREb2N1bWVudGF0aW9uKGJ1aWxkZXI6ZmxhdGJ1ZmZlcnMuQnVpbGRlciwgZG9jdW1lbnRhdGlvbk9mZnNldDpmbGF0YnVmZmVycy5PZmZzZXQpIHsKKyAgYnVpbGRlci5hZGRGaWVsZE9mZnNldCgzLCBkb2N1bWVudGF0aW9uT2Zmc2V0LCAwKTsKK30KKworc3RhdGljIGNyZWF0ZURvY3VtZW50YXRpb25WZWN0b3IoYnVpbGRlcjpmbGF0YnVmZmVycy5CdWlsZGVyLCBkYXRhOmZsYXRidWZmZXJzLk9mZnNldFtdKTpmbGF0YnVmZmVycy5PZmZzZXQgeworICBidWlsZGVyLnN0YXJ0VmVjdG9yKDQsIGRhdGEubGVuZ3RoLCA0KTsKKyAgZm9yIChsZXQgaSA9IGRhdGEubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHsKKyAgICBidWlsZGVyLmFkZE9mZnNldChkYXRhW2ldISk7CisgIH0KKyAgcmV0dXJuIGJ1aWxkZXIuZW5kVmVjdG9yKCk7Cit9CisKK3N0YXRpYyBzdGFydERvY3VtZW50YXRpb25WZWN0b3IoYnVpbGRlcjpmbGF0YnVmZmVycy5CdWlsZGVyLCBudW1FbGVtczpudW1iZXIpIHsKKyAgYnVpbGRlci5zdGFydFZlY3Rvcig0LCBudW1FbGVtcywgNCk7Cit9CisKK3N0YXRpYyBhZGREZWNsYXJhdGlvbkZpbGUoYnVpbGRlcjpmbGF0YnVmZmVycy5CdWlsZGVyLCBkZWNsYXJhdGlvbkZpbGVPZmZzZXQ6ZmxhdGJ1ZmZlcnMuT2Zmc2V0KSB7CisgIGJ1aWxkZXIuYWRkRmllbGRPZmZzZXQoNCwgZGVjbGFyYXRpb25GaWxlT2Zmc2V0LCAwKTsKK30KKworc3RhdGljIGVuZFNlcnZpY2UoYnVpbGRlcjpmbGF0YnVmZmVycy5CdWlsZGVyKTpmbGF0YnVmZmVycy5PZmZzZXQgeworICBjb25zdCBvZmZzZXQgPSBidWlsZGVyLmVuZE9iamVjdCgpOworICBidWlsZGVyLnJlcXVpcmVkRmllbGQob2Zmc2V0LCA0KSAvLyBuYW1lCisgIHJldHVybiBvZmZzZXQ7Cit9CisKK3N0YXRpYyBjcmVhdGVTZXJ2aWNlKGJ1aWxkZXI6ZmxhdGJ1ZmZlcnMuQnVpbGRlciwgbmFtZU9mZnNldDpmbGF0YnVmZmVycy5PZmZzZXQsIGNhbGxzT2Zmc2V0OmZsYXRidWZmZXJzLk9mZnNldCwgYXR0cmlidXRlc09mZnNldDpmbGF0YnVmZmVycy5PZmZzZXQsIGRvY3VtZW50YXRpb25PZmZzZXQ6ZmxhdGJ1ZmZlcnMuT2Zmc2V0LCBkZWNsYXJhdGlvbkZpbGVPZmZzZXQ6ZmxhdGJ1ZmZlcnMuT2Zmc2V0KTpmbGF0YnVmZmVycy5PZmZzZXQgeworICBTZXJ2aWNlLnN0YXJ0U2VydmljZShidWlsZGVyKTsKKyAgU2VydmljZS5hZGROYW1lKGJ1aWxkZXIsIG5hbWVPZmZzZXQpOworICBTZXJ2aWNlLmFkZENhbGxzKGJ1aWxkZXIsIGNhbGxzT2Zmc2V0KTsKKyAgU2VydmljZS5hZGRBdHRyaWJ1dGVzKGJ1aWxkZXIsIGF0dHJpYnV0ZXNPZmZzZXQpOworICBTZXJ2aWNlLmFkZERvY3VtZW50YXRpb24oYnVpbGRlciwgZG9jdW1lbnRhdGlvbk9mZnNldCk7CisgIFNlcnZpY2UuYWRkRGVjbGFyYXRpb25GaWxlKGJ1aWxkZXIsIGRlY2xhcmF0aW9uRmlsZU9mZnNldCk7CisgIHJldHVybiBTZXJ2aWNlLmVuZFNlcnZpY2UoYnVpbGRlcik7Cit9CisKK3VucGFjaygpOiBTZXJ2aWNlVCB7CisgIHJldHVybiBuZXcgU2VydmljZVQoCisgICAgdGhpcy5uYW1lKCksCisgICAgdGhpcy5iYiEuY3JlYXRlT2JqTGlzdCh0aGlzLmNhbGxzLmJpbmQodGhpcyksIHRoaXMuY2FsbHNMZW5ndGgoKSksCisgICAgdGhpcy5iYiEuY3JlYXRlT2JqTGlzdCh0aGlzLmF0dHJpYnV0ZXMuYmluZCh0aGlzKSwgdGhpcy5hdHRyaWJ1dGVzTGVuZ3RoKCkpLAorICAgIHRoaXMuYmIhLmNyZWF0ZVNjYWxhckxpc3QodGhpcy5kb2N1bWVudGF0aW9uLmJpbmQodGhpcyksIHRoaXMuZG9jdW1lbnRhdGlvbkxlbmd0aCgpKSwKKyAgICB0aGlzLmRlY2xhcmF0aW9uRmlsZSgpCisgICk7Cit9CisKKwordW5wYWNrVG8oX286IFNlcnZpY2VUKTogdm9pZCB7CisgIF9vLm5hbWUgPSB0aGlzLm5hbWUoKTsKKyAgX28uY2FsbHMgPSB0aGlzLmJiIS5jcmVhdGVPYmpMaXN0KHRoaXMuY2FsbHMuYmluZCh0aGlzKSwgdGhpcy5jYWxsc0xlbmd0aCgpKTsKKyAgX28uYXR0cmlidXRlcyA9IHRoaXMuYmIhLmNyZWF0ZU9iakxpc3QodGhpcy5hdHRyaWJ1dGVzLmJpbmQodGhpcyksIHRoaXMuYXR0cmlidXRlc0xlbmd0aCgpKTsKKyAgX28uZG9jdW1lbnRhdGlvbiA9IHRoaXMuYmIhLmNyZWF0ZVNjYWxhckxpc3QodGhpcy5kb2N1bWVudGF0aW9uLmJpbmQodGhpcyksIHRoaXMuZG9jdW1lbnRhdGlvbkxlbmd0aCgpKTsKKyAgX28uZGVjbGFyYXRpb25GaWxlID0gdGhpcy5kZWNsYXJhdGlvbkZpbGUoKTsKK30KK30KKworZXhwb3J0IGNsYXNzIFNlcnZpY2VUIHsKK2NvbnN0cnVjdG9yKAorICBwdWJsaWMgbmFtZTogc3RyaW5nfFVpbnQ4QXJyYXl8bnVsbCA9IG51bGwsCisgIHB1YmxpYyBjYWxsczogKFJQQ0NhbGxUKVtdID0gW10sCisgIHB1YmxpYyBhdHRyaWJ1dGVzOiAoS2V5VmFsdWVUKVtdID0gW10sCisgIHB1YmxpYyBkb2N1bWVudGF0aW9uOiAoc3RyaW5nKVtdID0gW10sCisgIHB1YmxpYyBkZWNsYXJhdGlvbkZpbGU6IHN0cmluZ3xVaW50OEFycmF5fG51bGwgPSBudWxsCispe30KKworCitwYWNrKGJ1aWxkZXI6ZmxhdGJ1ZmZlcnMuQnVpbGRlcik6IGZsYXRidWZmZXJzLk9mZnNldCB7CisgIGNvbnN0IG5hbWUgPSAodGhpcy5uYW1lICE9PSBudWxsID8gYnVpbGRlci5jcmVhdGVTdHJpbmcodGhpcy5uYW1lISkgOiAwKTsKKyAgY29uc3QgY2FsbHMgPSBTZXJ2aWNlLmNyZWF0ZUNhbGxzVmVjdG9yKGJ1aWxkZXIsIGJ1aWxkZXIuY3JlYXRlT2JqZWN0T2Zmc2V0TGlzdCh0aGlzLmNhbGxzKSk7CisgIGNvbnN0IGF0dHJpYnV0ZXMgPSBTZXJ2aWNlLmNyZWF0ZUF0dHJpYnV0ZXNWZWN0b3IoYnVpbGRlciwgYnVpbGRlci5jcmVhdGVPYmplY3RPZmZzZXRMaXN0KHRoaXMuYXR0cmlidXRlcykpOworICBjb25zdCBkb2N1bWVudGF0aW9uID0gU2VydmljZS5jcmVhdGVEb2N1bWVudGF0aW9uVmVjdG9yKGJ1aWxkZXIsIGJ1aWxkZXIuY3JlYXRlT2JqZWN0T2Zmc2V0TGlzdCh0aGlzLmRvY3VtZW50YXRpb24pKTsKKyAgY29uc3QgZGVjbGFyYXRpb25GaWxlID0gKHRoaXMuZGVjbGFyYXRpb25GaWxlICE9PSBudWxsID8gYnVpbGRlci5jcmVhdGVTdHJpbmcodGhpcy5kZWNsYXJhdGlvbkZpbGUhKSA6IDApOworCisgIHJldHVybiBTZXJ2aWNlLmNyZWF0ZVNlcnZpY2UoYnVpbGRlciwKKyAgICBuYW1lLAorICAgIGNhbGxzLAorICAgIGF0dHJpYnV0ZXMsCisgICAgZG9jdW1lbnRhdGlvbiwKKyAgICBkZWNsYXJhdGlvbkZpbGUKKyAgKTsKK30KK30KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL3RzL3JlZmxlY3Rpb24vdHlwZS5qcyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL3RzL3JlZmxlY3Rpb24vdHlwZS5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mM2NjYmRmCi0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvdHMvcmVmbGVjdGlvbi90eXBlLmpzCkBAIC0wLDAgKzEsMTYxIEBACisvLyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBieSB0aGUgRmxhdEJ1ZmZlcnMgY29tcGlsZXIsIGRvIG5vdCBtb2RpZnkKK2ltcG9ydCAqIGFzIGZsYXRidWZmZXJzIGZyb20gJ2ZsYXRidWZmZXJzJzsKK2ltcG9ydCB7IEJhc2VUeXBlIH0gZnJvbSAnLi4vcmVmbGVjdGlvbi9iYXNlLXR5cGUuanMnOworZXhwb3J0IGNsYXNzIFR5cGUgeworICAgIGNvbnN0cnVjdG9yKCkgeworICAgICAgICB0aGlzLmJiID0gbnVsbDsKKyAgICAgICAgdGhpcy5iYl9wb3MgPSAwOworICAgIH0KKyAgICBfX2luaXQoaSwgYmIpIHsKKyAgICAgICAgdGhpcy5iYl9wb3MgPSBpOworICAgICAgICB0aGlzLmJiID0gYmI7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKyAgICBzdGF0aWMgZ2V0Um9vdEFzVHlwZShiYiwgb2JqKSB7CisgICAgICAgIHJldHVybiAob2JqIHx8IG5ldyBUeXBlKCkpLl9faW5pdChiYi5yZWFkSW50MzIoYmIucG9zaXRpb24oKSkgKyBiYi5wb3NpdGlvbigpLCBiYik7CisgICAgfQorICAgIHN0YXRpYyBnZXRTaXplUHJlZml4ZWRSb290QXNUeXBlKGJiLCBvYmopIHsKKyAgICAgICAgYmIuc2V0UG9zaXRpb24oYmIucG9zaXRpb24oKSArIGZsYXRidWZmZXJzLlNJWkVfUFJFRklYX0xFTkdUSCk7CisgICAgICAgIHJldHVybiAob2JqIHx8IG5ldyBUeXBlKCkpLl9faW5pdChiYi5yZWFkSW50MzIoYmIucG9zaXRpb24oKSkgKyBiYi5wb3NpdGlvbigpLCBiYik7CisgICAgfQorICAgIGJhc2VUeXBlKCkgeworICAgICAgICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCA0KTsKKyAgICAgICAgcmV0dXJuIG9mZnNldCA/IHRoaXMuYmIucmVhZEludDgodGhpcy5iYl9wb3MgKyBvZmZzZXQpIDogQmFzZVR5cGUuTm9uZTsKKyAgICB9CisgICAgbXV0YXRlX2Jhc2VfdHlwZSh2YWx1ZSkgeworICAgICAgICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCA0KTsKKyAgICAgICAgaWYgKG9mZnNldCA9PT0gMCkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIHRoaXMuYmIud3JpdGVJbnQ4KHRoaXMuYmJfcG9zICsgb2Zmc2V0LCB2YWx1ZSk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICBlbGVtZW50KCkgeworICAgICAgICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCA2KTsKKyAgICAgICAgcmV0dXJuIG9mZnNldCA/IHRoaXMuYmIucmVhZEludDgodGhpcy5iYl9wb3MgKyBvZmZzZXQpIDogQmFzZVR5cGUuTm9uZTsKKyAgICB9CisgICAgbXV0YXRlX2VsZW1lbnQodmFsdWUpIHsKKyAgICAgICAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywgNik7CisgICAgICAgIGlmIChvZmZzZXQgPT09IDApIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICB0aGlzLmJiLndyaXRlSW50OCh0aGlzLmJiX3BvcyArIG9mZnNldCwgdmFsdWUpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgaW5kZXgoKSB7CisgICAgICAgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsIDgpOworICAgICAgICByZXR1cm4gb2Zmc2V0ID8gdGhpcy5iYi5yZWFkSW50MzIodGhpcy5iYl9wb3MgKyBvZmZzZXQpIDogLTE7CisgICAgfQorICAgIG11dGF0ZV9pbmRleCh2YWx1ZSkgeworICAgICAgICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCA4KTsKKyAgICAgICAgaWYgKG9mZnNldCA9PT0gMCkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIHRoaXMuYmIud3JpdGVJbnQzMih0aGlzLmJiX3BvcyArIG9mZnNldCwgdmFsdWUpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgZml4ZWRMZW5ndGgoKSB7CisgICAgICAgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsIDEwKTsKKyAgICAgICAgcmV0dXJuIG9mZnNldCA/IHRoaXMuYmIucmVhZFVpbnQxNih0aGlzLmJiX3BvcyArIG9mZnNldCkgOiAwOworICAgIH0KKyAgICBtdXRhdGVfZml4ZWRfbGVuZ3RoKHZhbHVlKSB7CisgICAgICAgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsIDEwKTsKKyAgICAgICAgaWYgKG9mZnNldCA9PT0gMCkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIHRoaXMuYmIud3JpdGVVaW50MTYodGhpcy5iYl9wb3MgKyBvZmZzZXQsIHZhbHVlKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIC8qKgorICAgICAqIFRoZSBzaXplIChvY3RldHMpIG9mIHRoZSBgYmFzZV90eXBlYCBmaWVsZC4KKyAgICAgKi8KKyAgICBiYXNlU2l6ZSgpIHsKKyAgICAgICAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywgMTIpOworICAgICAgICByZXR1cm4gb2Zmc2V0ID8gdGhpcy5iYi5yZWFkVWludDMyKHRoaXMuYmJfcG9zICsgb2Zmc2V0KSA6IDQ7CisgICAgfQorICAgIG11dGF0ZV9iYXNlX3NpemUodmFsdWUpIHsKKyAgICAgICAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywgMTIpOworICAgICAgICBpZiAob2Zmc2V0ID09PSAwKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgdGhpcy5iYi53cml0ZVVpbnQzMih0aGlzLmJiX3BvcyArIG9mZnNldCwgdmFsdWUpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgLyoqCisgICAgICogVGhlIHNpemUgKG9jdGV0cykgb2YgdGhlIGBlbGVtZW50YCBmaWVsZCwgaWYgcHJlc2VudC4KKyAgICAgKi8KKyAgICBlbGVtZW50U2l6ZSgpIHsKKyAgICAgICAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywgMTQpOworICAgICAgICByZXR1cm4gb2Zmc2V0ID8gdGhpcy5iYi5yZWFkVWludDMyKHRoaXMuYmJfcG9zICsgb2Zmc2V0KSA6IDA7CisgICAgfQorICAgIG11dGF0ZV9lbGVtZW50X3NpemUodmFsdWUpIHsKKyAgICAgICAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywgMTQpOworICAgICAgICBpZiAob2Zmc2V0ID09PSAwKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgdGhpcy5iYi53cml0ZVVpbnQzMih0aGlzLmJiX3BvcyArIG9mZnNldCwgdmFsdWUpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgc3RhdGljIGdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpIHsKKyAgICAgICAgcmV0dXJuICdyZWZsZWN0aW9uX1R5cGUnOworICAgIH0KKyAgICBzdGF0aWMgc3RhcnRUeXBlKGJ1aWxkZXIpIHsKKyAgICAgICAgYnVpbGRlci5zdGFydE9iamVjdCg2KTsKKyAgICB9CisgICAgc3RhdGljIGFkZEJhc2VUeXBlKGJ1aWxkZXIsIGJhc2VUeXBlKSB7CisgICAgICAgIGJ1aWxkZXIuYWRkRmllbGRJbnQ4KDAsIGJhc2VUeXBlLCBCYXNlVHlwZS5Ob25lKTsKKyAgICB9CisgICAgc3RhdGljIGFkZEVsZW1lbnQoYnVpbGRlciwgZWxlbWVudCkgeworICAgICAgICBidWlsZGVyLmFkZEZpZWxkSW50OCgxLCBlbGVtZW50LCBCYXNlVHlwZS5Ob25lKTsKKyAgICB9CisgICAgc3RhdGljIGFkZEluZGV4KGJ1aWxkZXIsIGluZGV4KSB7CisgICAgICAgIGJ1aWxkZXIuYWRkRmllbGRJbnQzMigyLCBpbmRleCwgLTEpOworICAgIH0KKyAgICBzdGF0aWMgYWRkRml4ZWRMZW5ndGgoYnVpbGRlciwgZml4ZWRMZW5ndGgpIHsKKyAgICAgICAgYnVpbGRlci5hZGRGaWVsZEludDE2KDMsIGZpeGVkTGVuZ3RoLCAwKTsKKyAgICB9CisgICAgc3RhdGljIGFkZEJhc2VTaXplKGJ1aWxkZXIsIGJhc2VTaXplKSB7CisgICAgICAgIGJ1aWxkZXIuYWRkRmllbGRJbnQzMig0LCBiYXNlU2l6ZSwgNCk7CisgICAgfQorICAgIHN0YXRpYyBhZGRFbGVtZW50U2l6ZShidWlsZGVyLCBlbGVtZW50U2l6ZSkgeworICAgICAgICBidWlsZGVyLmFkZEZpZWxkSW50MzIoNSwgZWxlbWVudFNpemUsIDApOworICAgIH0KKyAgICBzdGF0aWMgZW5kVHlwZShidWlsZGVyKSB7CisgICAgICAgIGNvbnN0IG9mZnNldCA9IGJ1aWxkZXIuZW5kT2JqZWN0KCk7CisgICAgICAgIHJldHVybiBvZmZzZXQ7CisgICAgfQorICAgIHN0YXRpYyBjcmVhdGVUeXBlKGJ1aWxkZXIsIGJhc2VUeXBlLCBlbGVtZW50LCBpbmRleCwgZml4ZWRMZW5ndGgsIGJhc2VTaXplLCBlbGVtZW50U2l6ZSkgeworICAgICAgICBUeXBlLnN0YXJ0VHlwZShidWlsZGVyKTsKKyAgICAgICAgVHlwZS5hZGRCYXNlVHlwZShidWlsZGVyLCBiYXNlVHlwZSk7CisgICAgICAgIFR5cGUuYWRkRWxlbWVudChidWlsZGVyLCBlbGVtZW50KTsKKyAgICAgICAgVHlwZS5hZGRJbmRleChidWlsZGVyLCBpbmRleCk7CisgICAgICAgIFR5cGUuYWRkRml4ZWRMZW5ndGgoYnVpbGRlciwgZml4ZWRMZW5ndGgpOworICAgICAgICBUeXBlLmFkZEJhc2VTaXplKGJ1aWxkZXIsIGJhc2VTaXplKTsKKyAgICAgICAgVHlwZS5hZGRFbGVtZW50U2l6ZShidWlsZGVyLCBlbGVtZW50U2l6ZSk7CisgICAgICAgIHJldHVybiBUeXBlLmVuZFR5cGUoYnVpbGRlcik7CisgICAgfQorICAgIHVucGFjaygpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBUeXBlVCh0aGlzLmJhc2VUeXBlKCksIHRoaXMuZWxlbWVudCgpLCB0aGlzLmluZGV4KCksIHRoaXMuZml4ZWRMZW5ndGgoKSwgdGhpcy5iYXNlU2l6ZSgpLCB0aGlzLmVsZW1lbnRTaXplKCkpOworICAgIH0KKyAgICB1bnBhY2tUbyhfbykgeworICAgICAgICBfby5iYXNlVHlwZSA9IHRoaXMuYmFzZVR5cGUoKTsKKyAgICAgICAgX28uZWxlbWVudCA9IHRoaXMuZWxlbWVudCgpOworICAgICAgICBfby5pbmRleCA9IHRoaXMuaW5kZXgoKTsKKyAgICAgICAgX28uZml4ZWRMZW5ndGggPSB0aGlzLmZpeGVkTGVuZ3RoKCk7CisgICAgICAgIF9vLmJhc2VTaXplID0gdGhpcy5iYXNlU2l6ZSgpOworICAgICAgICBfby5lbGVtZW50U2l6ZSA9IHRoaXMuZWxlbWVudFNpemUoKTsKKyAgICB9Cit9CitleHBvcnQgY2xhc3MgVHlwZVQgeworICAgIGNvbnN0cnVjdG9yKGJhc2VUeXBlID0gQmFzZVR5cGUuTm9uZSwgZWxlbWVudCA9IEJhc2VUeXBlLk5vbmUsIGluZGV4ID0gLTEsIGZpeGVkTGVuZ3RoID0gMCwgYmFzZVNpemUgPSA0LCBlbGVtZW50U2l6ZSA9IDApIHsKKyAgICAgICAgdGhpcy5iYXNlVHlwZSA9IGJhc2VUeXBlOworICAgICAgICB0aGlzLmVsZW1lbnQgPSBlbGVtZW50OworICAgICAgICB0aGlzLmluZGV4ID0gaW5kZXg7CisgICAgICAgIHRoaXMuZml4ZWRMZW5ndGggPSBmaXhlZExlbmd0aDsKKyAgICAgICAgdGhpcy5iYXNlU2l6ZSA9IGJhc2VTaXplOworICAgICAgICB0aGlzLmVsZW1lbnRTaXplID0gZWxlbWVudFNpemU7CisgICAgfQorICAgIHBhY2soYnVpbGRlcikgeworICAgICAgICByZXR1cm4gVHlwZS5jcmVhdGVUeXBlKGJ1aWxkZXIsIHRoaXMuYmFzZVR5cGUsIHRoaXMuZWxlbWVudCwgdGhpcy5pbmRleCwgdGhpcy5maXhlZExlbmd0aCwgdGhpcy5iYXNlU2l6ZSwgdGhpcy5lbGVtZW50U2l6ZSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvdHMvcmVmbGVjdGlvbi90eXBlLnRzIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvdHMvcmVmbGVjdGlvbi90eXBlLnRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4MzFlMjEKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy90cy9yZWZsZWN0aW9uL3R5cGUudHMKQEAgLTAsMCArMSwyMTkgQEAKKy8vIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGJ5IHRoZSBGbGF0QnVmZmVycyBjb21waWxlciwgZG8gbm90IG1vZGlmeQorCitpbXBvcnQgKiBhcyBmbGF0YnVmZmVycyBmcm9tICdmbGF0YnVmZmVycyc7CisKK2ltcG9ydCB7IEJhc2VUeXBlIH0gZnJvbSAnLi4vcmVmbGVjdGlvbi9iYXNlLXR5cGUuanMnOworCisKK2V4cG9ydCBjbGFzcyBUeXBlIHsKKyAgYmI6IGZsYXRidWZmZXJzLkJ5dGVCdWZmZXJ8bnVsbCA9IG51bGw7CisgIGJiX3BvcyA9IDA7CisgIF9faW5pdChpOm51bWJlciwgYmI6ZmxhdGJ1ZmZlcnMuQnl0ZUJ1ZmZlcik6VHlwZSB7CisgIHRoaXMuYmJfcG9zID0gaTsKKyAgdGhpcy5iYiA9IGJiOworICByZXR1cm4gdGhpczsKK30KKworc3RhdGljIGdldFJvb3RBc1R5cGUoYmI6ZmxhdGJ1ZmZlcnMuQnl0ZUJ1ZmZlciwgb2JqPzpUeXBlKTpUeXBlIHsKKyAgcmV0dXJuIChvYmogfHwgbmV3IFR5cGUoKSkuX19pbml0KGJiLnJlYWRJbnQzMihiYi5wb3NpdGlvbigpKSArIGJiLnBvc2l0aW9uKCksIGJiKTsKK30KKworc3RhdGljIGdldFNpemVQcmVmaXhlZFJvb3RBc1R5cGUoYmI6ZmxhdGJ1ZmZlcnMuQnl0ZUJ1ZmZlciwgb2JqPzpUeXBlKTpUeXBlIHsKKyAgYmIuc2V0UG9zaXRpb24oYmIucG9zaXRpb24oKSArIGZsYXRidWZmZXJzLlNJWkVfUFJFRklYX0xFTkdUSCk7CisgIHJldHVybiAob2JqIHx8IG5ldyBUeXBlKCkpLl9faW5pdChiYi5yZWFkSW50MzIoYmIucG9zaXRpb24oKSkgKyBiYi5wb3NpdGlvbigpLCBiYik7Cit9CisKK2Jhc2VUeXBlKCk6QmFzZVR5cGUgeworICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiIS5fX29mZnNldCh0aGlzLmJiX3BvcywgNCk7CisgIHJldHVybiBvZmZzZXQgPyB0aGlzLmJiIS5yZWFkSW50OCh0aGlzLmJiX3BvcyArIG9mZnNldCkgOiBCYXNlVHlwZS5Ob25lOworfQorCittdXRhdGVfYmFzZV90eXBlKHZhbHVlOkJhc2VUeXBlKTpib29sZWFuIHsKKyAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYiEuX19vZmZzZXQodGhpcy5iYl9wb3MsIDQpOworCisgIGlmIChvZmZzZXQgPT09IDApIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICB0aGlzLmJiIS53cml0ZUludDgodGhpcy5iYl9wb3MgKyBvZmZzZXQsIHZhbHVlKTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK2VsZW1lbnQoKTpCYXNlVHlwZSB7CisgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIhLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCA2KTsKKyAgcmV0dXJuIG9mZnNldCA/IHRoaXMuYmIhLnJlYWRJbnQ4KHRoaXMuYmJfcG9zICsgb2Zmc2V0KSA6IEJhc2VUeXBlLk5vbmU7Cit9CisKK211dGF0ZV9lbGVtZW50KHZhbHVlOkJhc2VUeXBlKTpib29sZWFuIHsKKyAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYiEuX19vZmZzZXQodGhpcy5iYl9wb3MsIDYpOworCisgIGlmIChvZmZzZXQgPT09IDApIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICB0aGlzLmJiIS53cml0ZUludDgodGhpcy5iYl9wb3MgKyBvZmZzZXQsIHZhbHVlKTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK2luZGV4KCk6bnVtYmVyIHsKKyAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYiEuX19vZmZzZXQodGhpcy5iYl9wb3MsIDgpOworICByZXR1cm4gb2Zmc2V0ID8gdGhpcy5iYiEucmVhZEludDMyKHRoaXMuYmJfcG9zICsgb2Zmc2V0KSA6IC0xOworfQorCittdXRhdGVfaW5kZXgodmFsdWU6bnVtYmVyKTpib29sZWFuIHsKKyAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYiEuX19vZmZzZXQodGhpcy5iYl9wb3MsIDgpOworCisgIGlmIChvZmZzZXQgPT09IDApIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICB0aGlzLmJiIS53cml0ZUludDMyKHRoaXMuYmJfcG9zICsgb2Zmc2V0LCB2YWx1ZSk7CisgIHJldHVybiB0cnVlOworfQorCitmaXhlZExlbmd0aCgpOm51bWJlciB7CisgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIhLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCAxMCk7CisgIHJldHVybiBvZmZzZXQgPyB0aGlzLmJiIS5yZWFkVWludDE2KHRoaXMuYmJfcG9zICsgb2Zmc2V0KSA6IDA7Cit9CisKK211dGF0ZV9maXhlZF9sZW5ndGgodmFsdWU6bnVtYmVyKTpib29sZWFuIHsKKyAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYiEuX19vZmZzZXQodGhpcy5iYl9wb3MsIDEwKTsKKworICBpZiAob2Zmc2V0ID09PSAwKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgdGhpcy5iYiEud3JpdGVVaW50MTYodGhpcy5iYl9wb3MgKyBvZmZzZXQsIHZhbHVlKTsKKyAgcmV0dXJuIHRydWU7Cit9CisKKy8qKgorICogVGhlIHNpemUgKG9jdGV0cykgb2YgdGhlIGBiYXNlX3R5cGVgIGZpZWxkLgorICovCitiYXNlU2l6ZSgpOm51bWJlciB7CisgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIhLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCAxMik7CisgIHJldHVybiBvZmZzZXQgPyB0aGlzLmJiIS5yZWFkVWludDMyKHRoaXMuYmJfcG9zICsgb2Zmc2V0KSA6IDQ7Cit9CisKK211dGF0ZV9iYXNlX3NpemUodmFsdWU6bnVtYmVyKTpib29sZWFuIHsKKyAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYiEuX19vZmZzZXQodGhpcy5iYl9wb3MsIDEyKTsKKworICBpZiAob2Zmc2V0ID09PSAwKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgdGhpcy5iYiEud3JpdGVVaW50MzIodGhpcy5iYl9wb3MgKyBvZmZzZXQsIHZhbHVlKTsKKyAgcmV0dXJuIHRydWU7Cit9CisKKy8qKgorICogVGhlIHNpemUgKG9jdGV0cykgb2YgdGhlIGBlbGVtZW50YCBmaWVsZCwgaWYgcHJlc2VudC4KKyAqLworZWxlbWVudFNpemUoKTpudW1iZXIgeworICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiIS5fX29mZnNldCh0aGlzLmJiX3BvcywgMTQpOworICByZXR1cm4gb2Zmc2V0ID8gdGhpcy5iYiEucmVhZFVpbnQzMih0aGlzLmJiX3BvcyArIG9mZnNldCkgOiAwOworfQorCittdXRhdGVfZWxlbWVudF9zaXplKHZhbHVlOm51bWJlcik6Ym9vbGVhbiB7CisgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIhLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCAxNCk7CisKKyAgaWYgKG9mZnNldCA9PT0gMCkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHRoaXMuYmIhLndyaXRlVWludDMyKHRoaXMuYmJfcG9zICsgb2Zmc2V0LCB2YWx1ZSk7CisgIHJldHVybiB0cnVlOworfQorCitzdGF0aWMgZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCk6c3RyaW5nIHsKKyAgcmV0dXJuICdyZWZsZWN0aW9uX1R5cGUnOworfQorCitzdGF0aWMgc3RhcnRUeXBlKGJ1aWxkZXI6ZmxhdGJ1ZmZlcnMuQnVpbGRlcikgeworICBidWlsZGVyLnN0YXJ0T2JqZWN0KDYpOworfQorCitzdGF0aWMgYWRkQmFzZVR5cGUoYnVpbGRlcjpmbGF0YnVmZmVycy5CdWlsZGVyLCBiYXNlVHlwZTpCYXNlVHlwZSkgeworICBidWlsZGVyLmFkZEZpZWxkSW50OCgwLCBiYXNlVHlwZSwgQmFzZVR5cGUuTm9uZSk7Cit9CisKK3N0YXRpYyBhZGRFbGVtZW50KGJ1aWxkZXI6ZmxhdGJ1ZmZlcnMuQnVpbGRlciwgZWxlbWVudDpCYXNlVHlwZSkgeworICBidWlsZGVyLmFkZEZpZWxkSW50OCgxLCBlbGVtZW50LCBCYXNlVHlwZS5Ob25lKTsKK30KKworc3RhdGljIGFkZEluZGV4KGJ1aWxkZXI6ZmxhdGJ1ZmZlcnMuQnVpbGRlciwgaW5kZXg6bnVtYmVyKSB7CisgIGJ1aWxkZXIuYWRkRmllbGRJbnQzMigyLCBpbmRleCwgLTEpOworfQorCitzdGF0aWMgYWRkRml4ZWRMZW5ndGgoYnVpbGRlcjpmbGF0YnVmZmVycy5CdWlsZGVyLCBmaXhlZExlbmd0aDpudW1iZXIpIHsKKyAgYnVpbGRlci5hZGRGaWVsZEludDE2KDMsIGZpeGVkTGVuZ3RoLCAwKTsKK30KKworc3RhdGljIGFkZEJhc2VTaXplKGJ1aWxkZXI6ZmxhdGJ1ZmZlcnMuQnVpbGRlciwgYmFzZVNpemU6bnVtYmVyKSB7CisgIGJ1aWxkZXIuYWRkRmllbGRJbnQzMig0LCBiYXNlU2l6ZSwgNCk7Cit9CisKK3N0YXRpYyBhZGRFbGVtZW50U2l6ZShidWlsZGVyOmZsYXRidWZmZXJzLkJ1aWxkZXIsIGVsZW1lbnRTaXplOm51bWJlcikgeworICBidWlsZGVyLmFkZEZpZWxkSW50MzIoNSwgZWxlbWVudFNpemUsIDApOworfQorCitzdGF0aWMgZW5kVHlwZShidWlsZGVyOmZsYXRidWZmZXJzLkJ1aWxkZXIpOmZsYXRidWZmZXJzLk9mZnNldCB7CisgIGNvbnN0IG9mZnNldCA9IGJ1aWxkZXIuZW5kT2JqZWN0KCk7CisgIHJldHVybiBvZmZzZXQ7Cit9CisKK3N0YXRpYyBjcmVhdGVUeXBlKGJ1aWxkZXI6ZmxhdGJ1ZmZlcnMuQnVpbGRlciwgYmFzZVR5cGU6QmFzZVR5cGUsIGVsZW1lbnQ6QmFzZVR5cGUsIGluZGV4Om51bWJlciwgZml4ZWRMZW5ndGg6bnVtYmVyLCBiYXNlU2l6ZTpudW1iZXIsIGVsZW1lbnRTaXplOm51bWJlcik6ZmxhdGJ1ZmZlcnMuT2Zmc2V0IHsKKyAgVHlwZS5zdGFydFR5cGUoYnVpbGRlcik7CisgIFR5cGUuYWRkQmFzZVR5cGUoYnVpbGRlciwgYmFzZVR5cGUpOworICBUeXBlLmFkZEVsZW1lbnQoYnVpbGRlciwgZWxlbWVudCk7CisgIFR5cGUuYWRkSW5kZXgoYnVpbGRlciwgaW5kZXgpOworICBUeXBlLmFkZEZpeGVkTGVuZ3RoKGJ1aWxkZXIsIGZpeGVkTGVuZ3RoKTsKKyAgVHlwZS5hZGRCYXNlU2l6ZShidWlsZGVyLCBiYXNlU2l6ZSk7CisgIFR5cGUuYWRkRWxlbWVudFNpemUoYnVpbGRlciwgZWxlbWVudFNpemUpOworICByZXR1cm4gVHlwZS5lbmRUeXBlKGJ1aWxkZXIpOworfQorCit1bnBhY2soKTogVHlwZVQgeworICByZXR1cm4gbmV3IFR5cGVUKAorICAgIHRoaXMuYmFzZVR5cGUoKSwKKyAgICB0aGlzLmVsZW1lbnQoKSwKKyAgICB0aGlzLmluZGV4KCksCisgICAgdGhpcy5maXhlZExlbmd0aCgpLAorICAgIHRoaXMuYmFzZVNpemUoKSwKKyAgICB0aGlzLmVsZW1lbnRTaXplKCkKKyAgKTsKK30KKworCit1bnBhY2tUbyhfbzogVHlwZVQpOiB2b2lkIHsKKyAgX28uYmFzZVR5cGUgPSB0aGlzLmJhc2VUeXBlKCk7CisgIF9vLmVsZW1lbnQgPSB0aGlzLmVsZW1lbnQoKTsKKyAgX28uaW5kZXggPSB0aGlzLmluZGV4KCk7CisgIF9vLmZpeGVkTGVuZ3RoID0gdGhpcy5maXhlZExlbmd0aCgpOworICBfby5iYXNlU2l6ZSA9IHRoaXMuYmFzZVNpemUoKTsKKyAgX28uZWxlbWVudFNpemUgPSB0aGlzLmVsZW1lbnRTaXplKCk7Cit9Cit9CisKK2V4cG9ydCBjbGFzcyBUeXBlVCB7Citjb25zdHJ1Y3RvcigKKyAgcHVibGljIGJhc2VUeXBlOiBCYXNlVHlwZSA9IEJhc2VUeXBlLk5vbmUsCisgIHB1YmxpYyBlbGVtZW50OiBCYXNlVHlwZSA9IEJhc2VUeXBlLk5vbmUsCisgIHB1YmxpYyBpbmRleDogbnVtYmVyID0gLTEsCisgIHB1YmxpYyBmaXhlZExlbmd0aDogbnVtYmVyID0gMCwKKyAgcHVibGljIGJhc2VTaXplOiBudW1iZXIgPSA0LAorICBwdWJsaWMgZWxlbWVudFNpemU6IG51bWJlciA9IDAKKyl7fQorCisKK3BhY2soYnVpbGRlcjpmbGF0YnVmZmVycy5CdWlsZGVyKTogZmxhdGJ1ZmZlcnMuT2Zmc2V0IHsKKyAgcmV0dXJuIFR5cGUuY3JlYXRlVHlwZShidWlsZGVyLAorICAgIHRoaXMuYmFzZVR5cGUsCisgICAgdGhpcy5lbGVtZW50LAorICAgIHRoaXMuaW5kZXgsCisgICAgdGhpcy5maXhlZExlbmd0aCwKKyAgICB0aGlzLmJhc2VTaXplLAorICAgIHRoaXMuZWxlbWVudFNpemUKKyAgKTsKK30KK30KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL3RzL3JlZmxlY3Rpb25fZ2VuZXJhdGVkLmpzIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvdHMvcmVmbGVjdGlvbl9nZW5lcmF0ZWQuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGQ2ODZjYwotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL3RzL3JlZmxlY3Rpb25fZ2VuZXJhdGVkLmpzCkBAIC0wLDAgKzEsMTU3NSBAQAorLy8gYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgYnkgdGhlIEZsYXRCdWZmZXJzIGNvbXBpbGVyLCBkbyBub3QgbW9kaWZ5CitpbXBvcnQgKiBhcyBmbGF0YnVmZmVycyBmcm9tICdmbGF0YnVmZmVycyc7CitleHBvcnQgdmFyIEJhc2VUeXBlOworKGZ1bmN0aW9uIChCYXNlVHlwZSkgeworICAgIEJhc2VUeXBlW0Jhc2VUeXBlWyJOb25lIl0gPSAwXSA9ICJOb25lIjsKKyAgICBCYXNlVHlwZVtCYXNlVHlwZVsiVVR5cGUiXSA9IDFdID0gIlVUeXBlIjsKKyAgICBCYXNlVHlwZVtCYXNlVHlwZVsiQm9vbCJdID0gMl0gPSAiQm9vbCI7CisgICAgQmFzZVR5cGVbQmFzZVR5cGVbIkJ5dGUiXSA9IDNdID0gIkJ5dGUiOworICAgIEJhc2VUeXBlW0Jhc2VUeXBlWyJVQnl0ZSJdID0gNF0gPSAiVUJ5dGUiOworICAgIEJhc2VUeXBlW0Jhc2VUeXBlWyJTaG9ydCJdID0gNV0gPSAiU2hvcnQiOworICAgIEJhc2VUeXBlW0Jhc2VUeXBlWyJVU2hvcnQiXSA9IDZdID0gIlVTaG9ydCI7CisgICAgQmFzZVR5cGVbQmFzZVR5cGVbIkludCJdID0gN10gPSAiSW50IjsKKyAgICBCYXNlVHlwZVtCYXNlVHlwZVsiVUludCJdID0gOF0gPSAiVUludCI7CisgICAgQmFzZVR5cGVbQmFzZVR5cGVbIkxvbmciXSA9IDldID0gIkxvbmciOworICAgIEJhc2VUeXBlW0Jhc2VUeXBlWyJVTG9uZyJdID0gMTBdID0gIlVMb25nIjsKKyAgICBCYXNlVHlwZVtCYXNlVHlwZVsiRmxvYXQiXSA9IDExXSA9ICJGbG9hdCI7CisgICAgQmFzZVR5cGVbQmFzZVR5cGVbIkRvdWJsZSJdID0gMTJdID0gIkRvdWJsZSI7CisgICAgQmFzZVR5cGVbQmFzZVR5cGVbIlN0cmluZyJdID0gMTNdID0gIlN0cmluZyI7CisgICAgQmFzZVR5cGVbQmFzZVR5cGVbIlZlY3RvciJdID0gMTRdID0gIlZlY3RvciI7CisgICAgQmFzZVR5cGVbQmFzZVR5cGVbIk9iaiJdID0gMTVdID0gIk9iaiI7CisgICAgQmFzZVR5cGVbQmFzZVR5cGVbIlVuaW9uIl0gPSAxNl0gPSAiVW5pb24iOworICAgIEJhc2VUeXBlW0Jhc2VUeXBlWyJBcnJheSJdID0gMTddID0gIkFycmF5IjsKKyAgICBCYXNlVHlwZVtCYXNlVHlwZVsiTWF4QmFzZVR5cGUiXSA9IDE4XSA9ICJNYXhCYXNlVHlwZSI7Cit9KShCYXNlVHlwZSB8fCAoQmFzZVR5cGUgPSB7fSkpOworLyoqCisgKiBOZXcgc2NoZW1hIGxhbmd1YWdlIGZlYXR1cmVzIHRoYXQgYXJlIG5vdCBzdXBwb3J0ZWQgYnkgb2xkIGNvZGUgZ2VuZXJhdG9ycy4KKyAqLworZXhwb3J0IHZhciBBZHZhbmNlZEZlYXR1cmVzOworKGZ1bmN0aW9uIChBZHZhbmNlZEZlYXR1cmVzKSB7CisgICAgQWR2YW5jZWRGZWF0dXJlc1siQWR2YW5jZWRBcnJheUZlYXR1cmVzIl0gPSAiMSI7CisgICAgQWR2YW5jZWRGZWF0dXJlc1siQWR2YW5jZWRVbmlvbkZlYXR1cmVzIl0gPSAiMiI7CisgICAgQWR2YW5jZWRGZWF0dXJlc1siT3B0aW9uYWxTY2FsYXJzIl0gPSAiNCI7CisgICAgQWR2YW5jZWRGZWF0dXJlc1siRGVmYXVsdFZlY3RvcnNBbmRTdHJpbmdzIl0gPSAiOCI7Cit9KShBZHZhbmNlZEZlYXR1cmVzIHx8IChBZHZhbmNlZEZlYXR1cmVzID0ge30pKTsKK2V4cG9ydCBjbGFzcyBUeXBlIHsKKyAgICBjb25zdHJ1Y3RvcigpIHsKKyAgICAgICAgdGhpcy5iYiA9IG51bGw7CisgICAgICAgIHRoaXMuYmJfcG9zID0gMDsKKyAgICB9CisgICAgX19pbml0KGksIGJiKSB7CisgICAgICAgIHRoaXMuYmJfcG9zID0gaTsKKyAgICAgICAgdGhpcy5iYiA9IGJiOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisgICAgc3RhdGljIGdldFJvb3RBc1R5cGUoYmIsIG9iaikgeworICAgICAgICByZXR1cm4gKG9iaiB8fCBuZXcgVHlwZSgpKS5fX2luaXQoYmIucmVhZEludDMyKGJiLnBvc2l0aW9uKCkpICsgYmIucG9zaXRpb24oKSwgYmIpOworICAgIH0KKyAgICBzdGF0aWMgZ2V0U2l6ZVByZWZpeGVkUm9vdEFzVHlwZShiYiwgb2JqKSB7CisgICAgICAgIGJiLnNldFBvc2l0aW9uKGJiLnBvc2l0aW9uKCkgKyBmbGF0YnVmZmVycy5TSVpFX1BSRUZJWF9MRU5HVEgpOworICAgICAgICByZXR1cm4gKG9iaiB8fCBuZXcgVHlwZSgpKS5fX2luaXQoYmIucmVhZEludDMyKGJiLnBvc2l0aW9uKCkpICsgYmIucG9zaXRpb24oKSwgYmIpOworICAgIH0KKyAgICBiYXNlVHlwZSgpIHsKKyAgICAgICAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywgNCk7CisgICAgICAgIHJldHVybiBvZmZzZXQgPyB0aGlzLmJiLnJlYWRJbnQ4KHRoaXMuYmJfcG9zICsgb2Zmc2V0KSA6IEJhc2VUeXBlLk5vbmU7CisgICAgfQorICAgIG11dGF0ZV9iYXNlX3R5cGUodmFsdWUpIHsKKyAgICAgICAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywgNCk7CisgICAgICAgIGlmIChvZmZzZXQgPT09IDApIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICB0aGlzLmJiLndyaXRlSW50OCh0aGlzLmJiX3BvcyArIG9mZnNldCwgdmFsdWUpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgZWxlbWVudCgpIHsKKyAgICAgICAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywgNik7CisgICAgICAgIHJldHVybiBvZmZzZXQgPyB0aGlzLmJiLnJlYWRJbnQ4KHRoaXMuYmJfcG9zICsgb2Zmc2V0KSA6IEJhc2VUeXBlLk5vbmU7CisgICAgfQorICAgIG11dGF0ZV9lbGVtZW50KHZhbHVlKSB7CisgICAgICAgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsIDYpOworICAgICAgICBpZiAob2Zmc2V0ID09PSAwKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgdGhpcy5iYi53cml0ZUludDgodGhpcy5iYl9wb3MgKyBvZmZzZXQsIHZhbHVlKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIGluZGV4KCkgeworICAgICAgICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCA4KTsKKyAgICAgICAgcmV0dXJuIG9mZnNldCA/IHRoaXMuYmIucmVhZEludDMyKHRoaXMuYmJfcG9zICsgb2Zmc2V0KSA6IC0xOworICAgIH0KKyAgICBtdXRhdGVfaW5kZXgodmFsdWUpIHsKKyAgICAgICAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywgOCk7CisgICAgICAgIGlmIChvZmZzZXQgPT09IDApIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICB0aGlzLmJiLndyaXRlSW50MzIodGhpcy5iYl9wb3MgKyBvZmZzZXQsIHZhbHVlKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIGZpeGVkTGVuZ3RoKCkgeworICAgICAgICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCAxMCk7CisgICAgICAgIHJldHVybiBvZmZzZXQgPyB0aGlzLmJiLnJlYWRVaW50MTYodGhpcy5iYl9wb3MgKyBvZmZzZXQpIDogMDsKKyAgICB9CisgICAgbXV0YXRlX2ZpeGVkX2xlbmd0aCh2YWx1ZSkgeworICAgICAgICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCAxMCk7CisgICAgICAgIGlmIChvZmZzZXQgPT09IDApIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICB0aGlzLmJiLndyaXRlVWludDE2KHRoaXMuYmJfcG9zICsgb2Zmc2V0LCB2YWx1ZSk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICAvKioKKyAgICAgKiBUaGUgc2l6ZSAob2N0ZXRzKSBvZiB0aGUgYGJhc2VfdHlwZWAgZmllbGQuCisgICAgICovCisgICAgYmFzZVNpemUoKSB7CisgICAgICAgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsIDEyKTsKKyAgICAgICAgcmV0dXJuIG9mZnNldCA/IHRoaXMuYmIucmVhZFVpbnQzMih0aGlzLmJiX3BvcyArIG9mZnNldCkgOiA0OworICAgIH0KKyAgICBtdXRhdGVfYmFzZV9zaXplKHZhbHVlKSB7CisgICAgICAgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsIDEyKTsKKyAgICAgICAgaWYgKG9mZnNldCA9PT0gMCkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIHRoaXMuYmIud3JpdGVVaW50MzIodGhpcy5iYl9wb3MgKyBvZmZzZXQsIHZhbHVlKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIC8qKgorICAgICAqIFRoZSBzaXplIChvY3RldHMpIG9mIHRoZSBgZWxlbWVudGAgZmllbGQsIGlmIHByZXNlbnQuCisgICAgICovCisgICAgZWxlbWVudFNpemUoKSB7CisgICAgICAgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsIDE0KTsKKyAgICAgICAgcmV0dXJuIG9mZnNldCA/IHRoaXMuYmIucmVhZFVpbnQzMih0aGlzLmJiX3BvcyArIG9mZnNldCkgOiAwOworICAgIH0KKyAgICBtdXRhdGVfZWxlbWVudF9zaXplKHZhbHVlKSB7CisgICAgICAgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsIDE0KTsKKyAgICAgICAgaWYgKG9mZnNldCA9PT0gMCkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIHRoaXMuYmIud3JpdGVVaW50MzIodGhpcy5iYl9wb3MgKyBvZmZzZXQsIHZhbHVlKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIHN0YXRpYyBnZXRGdWxseVF1YWxpZmllZE5hbWUoKSB7CisgICAgICAgIHJldHVybiAncmVmbGVjdGlvbl9UeXBlJzsKKyAgICB9CisgICAgc3RhdGljIHN0YXJ0VHlwZShidWlsZGVyKSB7CisgICAgICAgIGJ1aWxkZXIuc3RhcnRPYmplY3QoNik7CisgICAgfQorICAgIHN0YXRpYyBhZGRCYXNlVHlwZShidWlsZGVyLCBiYXNlVHlwZSkgeworICAgICAgICBidWlsZGVyLmFkZEZpZWxkSW50OCgwLCBiYXNlVHlwZSwgQmFzZVR5cGUuTm9uZSk7CisgICAgfQorICAgIHN0YXRpYyBhZGRFbGVtZW50KGJ1aWxkZXIsIGVsZW1lbnQpIHsKKyAgICAgICAgYnVpbGRlci5hZGRGaWVsZEludDgoMSwgZWxlbWVudCwgQmFzZVR5cGUuTm9uZSk7CisgICAgfQorICAgIHN0YXRpYyBhZGRJbmRleChidWlsZGVyLCBpbmRleCkgeworICAgICAgICBidWlsZGVyLmFkZEZpZWxkSW50MzIoMiwgaW5kZXgsIC0xKTsKKyAgICB9CisgICAgc3RhdGljIGFkZEZpeGVkTGVuZ3RoKGJ1aWxkZXIsIGZpeGVkTGVuZ3RoKSB7CisgICAgICAgIGJ1aWxkZXIuYWRkRmllbGRJbnQxNigzLCBmaXhlZExlbmd0aCwgMCk7CisgICAgfQorICAgIHN0YXRpYyBhZGRCYXNlU2l6ZShidWlsZGVyLCBiYXNlU2l6ZSkgeworICAgICAgICBidWlsZGVyLmFkZEZpZWxkSW50MzIoNCwgYmFzZVNpemUsIDQpOworICAgIH0KKyAgICBzdGF0aWMgYWRkRWxlbWVudFNpemUoYnVpbGRlciwgZWxlbWVudFNpemUpIHsKKyAgICAgICAgYnVpbGRlci5hZGRGaWVsZEludDMyKDUsIGVsZW1lbnRTaXplLCAwKTsKKyAgICB9CisgICAgc3RhdGljIGVuZFR5cGUoYnVpbGRlcikgeworICAgICAgICBjb25zdCBvZmZzZXQgPSBidWlsZGVyLmVuZE9iamVjdCgpOworICAgICAgICByZXR1cm4gb2Zmc2V0OworICAgIH0KKyAgICBzdGF0aWMgY3JlYXRlVHlwZShidWlsZGVyLCBiYXNlVHlwZSwgZWxlbWVudCwgaW5kZXgsIGZpeGVkTGVuZ3RoLCBiYXNlU2l6ZSwgZWxlbWVudFNpemUpIHsKKyAgICAgICAgVHlwZS5zdGFydFR5cGUoYnVpbGRlcik7CisgICAgICAgIFR5cGUuYWRkQmFzZVR5cGUoYnVpbGRlciwgYmFzZVR5cGUpOworICAgICAgICBUeXBlLmFkZEVsZW1lbnQoYnVpbGRlciwgZWxlbWVudCk7CisgICAgICAgIFR5cGUuYWRkSW5kZXgoYnVpbGRlciwgaW5kZXgpOworICAgICAgICBUeXBlLmFkZEZpeGVkTGVuZ3RoKGJ1aWxkZXIsIGZpeGVkTGVuZ3RoKTsKKyAgICAgICAgVHlwZS5hZGRCYXNlU2l6ZShidWlsZGVyLCBiYXNlU2l6ZSk7CisgICAgICAgIFR5cGUuYWRkRWxlbWVudFNpemUoYnVpbGRlciwgZWxlbWVudFNpemUpOworICAgICAgICByZXR1cm4gVHlwZS5lbmRUeXBlKGJ1aWxkZXIpOworICAgIH0KKyAgICB1bnBhY2soKSB7CisgICAgICAgIHJldHVybiBuZXcgVHlwZVQodGhpcy5iYXNlVHlwZSgpLCB0aGlzLmVsZW1lbnQoKSwgdGhpcy5pbmRleCgpLCB0aGlzLmZpeGVkTGVuZ3RoKCksIHRoaXMuYmFzZVNpemUoKSwgdGhpcy5lbGVtZW50U2l6ZSgpKTsKKyAgICB9CisgICAgdW5wYWNrVG8oX28pIHsKKyAgICAgICAgX28uYmFzZVR5cGUgPSB0aGlzLmJhc2VUeXBlKCk7CisgICAgICAgIF9vLmVsZW1lbnQgPSB0aGlzLmVsZW1lbnQoKTsKKyAgICAgICAgX28uaW5kZXggPSB0aGlzLmluZGV4KCk7CisgICAgICAgIF9vLmZpeGVkTGVuZ3RoID0gdGhpcy5maXhlZExlbmd0aCgpOworICAgICAgICBfby5iYXNlU2l6ZSA9IHRoaXMuYmFzZVNpemUoKTsKKyAgICAgICAgX28uZWxlbWVudFNpemUgPSB0aGlzLmVsZW1lbnRTaXplKCk7CisgICAgfQorfQorZXhwb3J0IGNsYXNzIFR5cGVUIHsKKyAgICBjb25zdHJ1Y3RvcihiYXNlVHlwZSA9IEJhc2VUeXBlLk5vbmUsIGVsZW1lbnQgPSBCYXNlVHlwZS5Ob25lLCBpbmRleCA9IC0xLCBmaXhlZExlbmd0aCA9IDAsIGJhc2VTaXplID0gNCwgZWxlbWVudFNpemUgPSAwKSB7CisgICAgICAgIHRoaXMuYmFzZVR5cGUgPSBiYXNlVHlwZTsKKyAgICAgICAgdGhpcy5lbGVtZW50ID0gZWxlbWVudDsKKyAgICAgICAgdGhpcy5pbmRleCA9IGluZGV4OworICAgICAgICB0aGlzLmZpeGVkTGVuZ3RoID0gZml4ZWRMZW5ndGg7CisgICAgICAgIHRoaXMuYmFzZVNpemUgPSBiYXNlU2l6ZTsKKyAgICAgICAgdGhpcy5lbGVtZW50U2l6ZSA9IGVsZW1lbnRTaXplOworICAgIH0KKyAgICBwYWNrKGJ1aWxkZXIpIHsKKyAgICAgICAgcmV0dXJuIFR5cGUuY3JlYXRlVHlwZShidWlsZGVyLCB0aGlzLmJhc2VUeXBlLCB0aGlzLmVsZW1lbnQsIHRoaXMuaW5kZXgsIHRoaXMuZml4ZWRMZW5ndGgsIHRoaXMuYmFzZVNpemUsIHRoaXMuZWxlbWVudFNpemUpOworICAgIH0KK30KK2V4cG9ydCBjbGFzcyBLZXlWYWx1ZSB7CisgICAgY29uc3RydWN0b3IoKSB7CisgICAgICAgIHRoaXMuYmIgPSBudWxsOworICAgICAgICB0aGlzLmJiX3BvcyA9IDA7CisgICAgfQorICAgIF9faW5pdChpLCBiYikgeworICAgICAgICB0aGlzLmJiX3BvcyA9IGk7CisgICAgICAgIHRoaXMuYmIgPSBiYjsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorICAgIHN0YXRpYyBnZXRSb290QXNLZXlWYWx1ZShiYiwgb2JqKSB7CisgICAgICAgIHJldHVybiAob2JqIHx8IG5ldyBLZXlWYWx1ZSgpKS5fX2luaXQoYmIucmVhZEludDMyKGJiLnBvc2l0aW9uKCkpICsgYmIucG9zaXRpb24oKSwgYmIpOworICAgIH0KKyAgICBzdGF0aWMgZ2V0U2l6ZVByZWZpeGVkUm9vdEFzS2V5VmFsdWUoYmIsIG9iaikgeworICAgICAgICBiYi5zZXRQb3NpdGlvbihiYi5wb3NpdGlvbigpICsgZmxhdGJ1ZmZlcnMuU0laRV9QUkVGSVhfTEVOR1RIKTsKKyAgICAgICAgcmV0dXJuIChvYmogfHwgbmV3IEtleVZhbHVlKCkpLl9faW5pdChiYi5yZWFkSW50MzIoYmIucG9zaXRpb24oKSkgKyBiYi5wb3NpdGlvbigpLCBiYik7CisgICAgfQorICAgIGtleShvcHRpb25hbEVuY29kaW5nKSB7CisgICAgICAgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsIDQpOworICAgICAgICByZXR1cm4gb2Zmc2V0ID8gdGhpcy5iYi5fX3N0cmluZyh0aGlzLmJiX3BvcyArIG9mZnNldCwgb3B0aW9uYWxFbmNvZGluZykgOiBudWxsOworICAgIH0KKyAgICB2YWx1ZShvcHRpb25hbEVuY29kaW5nKSB7CisgICAgICAgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsIDYpOworICAgICAgICByZXR1cm4gb2Zmc2V0ID8gdGhpcy5iYi5fX3N0cmluZyh0aGlzLmJiX3BvcyArIG9mZnNldCwgb3B0aW9uYWxFbmNvZGluZykgOiBudWxsOworICAgIH0KKyAgICBzdGF0aWMgZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCkgeworICAgICAgICByZXR1cm4gJ3JlZmxlY3Rpb25fS2V5VmFsdWUnOworICAgIH0KKyAgICBzdGF0aWMgc3RhcnRLZXlWYWx1ZShidWlsZGVyKSB7CisgICAgICAgIGJ1aWxkZXIuc3RhcnRPYmplY3QoMik7CisgICAgfQorICAgIHN0YXRpYyBhZGRLZXkoYnVpbGRlciwga2V5T2Zmc2V0KSB7CisgICAgICAgIGJ1aWxkZXIuYWRkRmllbGRPZmZzZXQoMCwga2V5T2Zmc2V0LCAwKTsKKyAgICB9CisgICAgc3RhdGljIGFkZFZhbHVlKGJ1aWxkZXIsIHZhbHVlT2Zmc2V0KSB7CisgICAgICAgIGJ1aWxkZXIuYWRkRmllbGRPZmZzZXQoMSwgdmFsdWVPZmZzZXQsIDApOworICAgIH0KKyAgICBzdGF0aWMgZW5kS2V5VmFsdWUoYnVpbGRlcikgeworICAgICAgICBjb25zdCBvZmZzZXQgPSBidWlsZGVyLmVuZE9iamVjdCgpOworICAgICAgICBidWlsZGVyLnJlcXVpcmVkRmllbGQob2Zmc2V0LCA0KTsgLy8ga2V5CisgICAgICAgIHJldHVybiBvZmZzZXQ7CisgICAgfQorICAgIHN0YXRpYyBjcmVhdGVLZXlWYWx1ZShidWlsZGVyLCBrZXlPZmZzZXQsIHZhbHVlT2Zmc2V0KSB7CisgICAgICAgIEtleVZhbHVlLnN0YXJ0S2V5VmFsdWUoYnVpbGRlcik7CisgICAgICAgIEtleVZhbHVlLmFkZEtleShidWlsZGVyLCBrZXlPZmZzZXQpOworICAgICAgICBLZXlWYWx1ZS5hZGRWYWx1ZShidWlsZGVyLCB2YWx1ZU9mZnNldCk7CisgICAgICAgIHJldHVybiBLZXlWYWx1ZS5lbmRLZXlWYWx1ZShidWlsZGVyKTsKKyAgICB9CisgICAgdW5wYWNrKCkgeworICAgICAgICByZXR1cm4gbmV3IEtleVZhbHVlVCh0aGlzLmtleSgpLCB0aGlzLnZhbHVlKCkpOworICAgIH0KKyAgICB1bnBhY2tUbyhfbykgeworICAgICAgICBfby5rZXkgPSB0aGlzLmtleSgpOworICAgICAgICBfby52YWx1ZSA9IHRoaXMudmFsdWUoKTsKKyAgICB9Cit9CitleHBvcnQgY2xhc3MgS2V5VmFsdWVUIHsKKyAgICBjb25zdHJ1Y3RvcihrZXkgPSBudWxsLCB2YWx1ZSA9IG51bGwpIHsKKyAgICAgICAgdGhpcy5rZXkgPSBrZXk7CisgICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTsKKyAgICB9CisgICAgcGFjayhidWlsZGVyKSB7CisgICAgICAgIGNvbnN0IGtleSA9ICh0aGlzLmtleSAhPT0gbnVsbCA/IGJ1aWxkZXIuY3JlYXRlU3RyaW5nKHRoaXMua2V5KSA6IDApOworICAgICAgICBjb25zdCB2YWx1ZSA9ICh0aGlzLnZhbHVlICE9PSBudWxsID8gYnVpbGRlci5jcmVhdGVTdHJpbmcodGhpcy52YWx1ZSkgOiAwKTsKKyAgICAgICAgcmV0dXJuIEtleVZhbHVlLmNyZWF0ZUtleVZhbHVlKGJ1aWxkZXIsIGtleSwgdmFsdWUpOworICAgIH0KK30KK2V4cG9ydCBjbGFzcyBFbnVtVmFsIHsKKyAgICBjb25zdHJ1Y3RvcigpIHsKKyAgICAgICAgdGhpcy5iYiA9IG51bGw7CisgICAgICAgIHRoaXMuYmJfcG9zID0gMDsKKyAgICB9CisgICAgX19pbml0KGksIGJiKSB7CisgICAgICAgIHRoaXMuYmJfcG9zID0gaTsKKyAgICAgICAgdGhpcy5iYiA9IGJiOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisgICAgc3RhdGljIGdldFJvb3RBc0VudW1WYWwoYmIsIG9iaikgeworICAgICAgICByZXR1cm4gKG9iaiB8fCBuZXcgRW51bVZhbCgpKS5fX2luaXQoYmIucmVhZEludDMyKGJiLnBvc2l0aW9uKCkpICsgYmIucG9zaXRpb24oKSwgYmIpOworICAgIH0KKyAgICBzdGF0aWMgZ2V0U2l6ZVByZWZpeGVkUm9vdEFzRW51bVZhbChiYiwgb2JqKSB7CisgICAgICAgIGJiLnNldFBvc2l0aW9uKGJiLnBvc2l0aW9uKCkgKyBmbGF0YnVmZmVycy5TSVpFX1BSRUZJWF9MRU5HVEgpOworICAgICAgICByZXR1cm4gKG9iaiB8fCBuZXcgRW51bVZhbCgpKS5fX2luaXQoYmIucmVhZEludDMyKGJiLnBvc2l0aW9uKCkpICsgYmIucG9zaXRpb24oKSwgYmIpOworICAgIH0KKyAgICBuYW1lKG9wdGlvbmFsRW5jb2RpbmcpIHsKKyAgICAgICAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywgNCk7CisgICAgICAgIHJldHVybiBvZmZzZXQgPyB0aGlzLmJiLl9fc3RyaW5nKHRoaXMuYmJfcG9zICsgb2Zmc2V0LCBvcHRpb25hbEVuY29kaW5nKSA6IG51bGw7CisgICAgfQorICAgIHZhbHVlKCkgeworICAgICAgICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCA2KTsKKyAgICAgICAgcmV0dXJuIG9mZnNldCA/IHRoaXMuYmIucmVhZEludDY0KHRoaXMuYmJfcG9zICsgb2Zmc2V0KSA6IEJpZ0ludCgnMCcpOworICAgIH0KKyAgICBtdXRhdGVfdmFsdWUodmFsdWUpIHsKKyAgICAgICAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywgNik7CisgICAgICAgIGlmIChvZmZzZXQgPT09IDApIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICB0aGlzLmJiLndyaXRlSW50NjQodGhpcy5iYl9wb3MgKyBvZmZzZXQsIHZhbHVlKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIHVuaW9uVHlwZShvYmopIHsKKyAgICAgICAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywgMTApOworICAgICAgICByZXR1cm4gb2Zmc2V0ID8gKG9iaiB8fCBuZXcgVHlwZSgpKS5fX2luaXQodGhpcy5iYi5fX2luZGlyZWN0KHRoaXMuYmJfcG9zICsgb2Zmc2V0KSwgdGhpcy5iYikgOiBudWxsOworICAgIH0KKyAgICBkb2N1bWVudGF0aW9uKGluZGV4LCBvcHRpb25hbEVuY29kaW5nKSB7CisgICAgICAgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsIDEyKTsKKyAgICAgICAgcmV0dXJuIG9mZnNldCA/IHRoaXMuYmIuX19zdHJpbmcodGhpcy5iYi5fX3ZlY3Rvcih0aGlzLmJiX3BvcyArIG9mZnNldCkgKyBpbmRleCAqIDQsIG9wdGlvbmFsRW5jb2RpbmcpIDogbnVsbDsKKyAgICB9CisgICAgZG9jdW1lbnRhdGlvbkxlbmd0aCgpIHsKKyAgICAgICAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywgMTIpOworICAgICAgICByZXR1cm4gb2Zmc2V0ID8gdGhpcy5iYi5fX3ZlY3Rvcl9sZW4odGhpcy5iYl9wb3MgKyBvZmZzZXQpIDogMDsKKyAgICB9CisgICAgc3RhdGljIGdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpIHsKKyAgICAgICAgcmV0dXJuICdyZWZsZWN0aW9uX0VudW1WYWwnOworICAgIH0KKyAgICBzdGF0aWMgc3RhcnRFbnVtVmFsKGJ1aWxkZXIpIHsKKyAgICAgICAgYnVpbGRlci5zdGFydE9iamVjdCg1KTsKKyAgICB9CisgICAgc3RhdGljIGFkZE5hbWUoYnVpbGRlciwgbmFtZU9mZnNldCkgeworICAgICAgICBidWlsZGVyLmFkZEZpZWxkT2Zmc2V0KDAsIG5hbWVPZmZzZXQsIDApOworICAgIH0KKyAgICBzdGF0aWMgYWRkVmFsdWUoYnVpbGRlciwgdmFsdWUpIHsKKyAgICAgICAgYnVpbGRlci5hZGRGaWVsZEludDY0KDEsIHZhbHVlLCBCaWdJbnQoJzAnKSk7CisgICAgfQorICAgIHN0YXRpYyBhZGRVbmlvblR5cGUoYnVpbGRlciwgdW5pb25UeXBlT2Zmc2V0KSB7CisgICAgICAgIGJ1aWxkZXIuYWRkRmllbGRPZmZzZXQoMywgdW5pb25UeXBlT2Zmc2V0LCAwKTsKKyAgICB9CisgICAgc3RhdGljIGFkZERvY3VtZW50YXRpb24oYnVpbGRlciwgZG9jdW1lbnRhdGlvbk9mZnNldCkgeworICAgICAgICBidWlsZGVyLmFkZEZpZWxkT2Zmc2V0KDQsIGRvY3VtZW50YXRpb25PZmZzZXQsIDApOworICAgIH0KKyAgICBzdGF0aWMgY3JlYXRlRG9jdW1lbnRhdGlvblZlY3RvcihidWlsZGVyLCBkYXRhKSB7CisgICAgICAgIGJ1aWxkZXIuc3RhcnRWZWN0b3IoNCwgZGF0YS5sZW5ndGgsIDQpOworICAgICAgICBmb3IgKGxldCBpID0gZGF0YS5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgeworICAgICAgICAgICAgYnVpbGRlci5hZGRPZmZzZXQoZGF0YVtpXSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGJ1aWxkZXIuZW5kVmVjdG9yKCk7CisgICAgfQorICAgIHN0YXRpYyBzdGFydERvY3VtZW50YXRpb25WZWN0b3IoYnVpbGRlciwgbnVtRWxlbXMpIHsKKyAgICAgICAgYnVpbGRlci5zdGFydFZlY3Rvcig0LCBudW1FbGVtcywgNCk7CisgICAgfQorICAgIHN0YXRpYyBlbmRFbnVtVmFsKGJ1aWxkZXIpIHsKKyAgICAgICAgY29uc3Qgb2Zmc2V0ID0gYnVpbGRlci5lbmRPYmplY3QoKTsKKyAgICAgICAgYnVpbGRlci5yZXF1aXJlZEZpZWxkKG9mZnNldCwgNCk7IC8vIG5hbWUKKyAgICAgICAgcmV0dXJuIG9mZnNldDsKKyAgICB9CisgICAgdW5wYWNrKCkgeworICAgICAgICByZXR1cm4gbmV3IEVudW1WYWxUKHRoaXMubmFtZSgpLCB0aGlzLnZhbHVlKCksICh0aGlzLnVuaW9uVHlwZSgpICE9PSBudWxsID8gdGhpcy51bmlvblR5cGUoKS51bnBhY2soKSA6IG51bGwpLCB0aGlzLmJiLmNyZWF0ZVNjYWxhckxpc3QodGhpcy5kb2N1bWVudGF0aW9uLmJpbmQodGhpcyksIHRoaXMuZG9jdW1lbnRhdGlvbkxlbmd0aCgpKSk7CisgICAgfQorICAgIHVucGFja1RvKF9vKSB7CisgICAgICAgIF9vLm5hbWUgPSB0aGlzLm5hbWUoKTsKKyAgICAgICAgX28udmFsdWUgPSB0aGlzLnZhbHVlKCk7CisgICAgICAgIF9vLnVuaW9uVHlwZSA9ICh0aGlzLnVuaW9uVHlwZSgpICE9PSBudWxsID8gdGhpcy51bmlvblR5cGUoKS51bnBhY2soKSA6IG51bGwpOworICAgICAgICBfby5kb2N1bWVudGF0aW9uID0gdGhpcy5iYi5jcmVhdGVTY2FsYXJMaXN0KHRoaXMuZG9jdW1lbnRhdGlvbi5iaW5kKHRoaXMpLCB0aGlzLmRvY3VtZW50YXRpb25MZW5ndGgoKSk7CisgICAgfQorfQorZXhwb3J0IGNsYXNzIEVudW1WYWxUIHsKKyAgICBjb25zdHJ1Y3RvcihuYW1lID0gbnVsbCwgdmFsdWUgPSBCaWdJbnQoJzAnKSwgdW5pb25UeXBlID0gbnVsbCwgZG9jdW1lbnRhdGlvbiA9IFtdKSB7CisgICAgICAgIHRoaXMubmFtZSA9IG5hbWU7CisgICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTsKKyAgICAgICAgdGhpcy51bmlvblR5cGUgPSB1bmlvblR5cGU7CisgICAgICAgIHRoaXMuZG9jdW1lbnRhdGlvbiA9IGRvY3VtZW50YXRpb247CisgICAgfQorICAgIHBhY2soYnVpbGRlcikgeworICAgICAgICBjb25zdCBuYW1lID0gKHRoaXMubmFtZSAhPT0gbnVsbCA/IGJ1aWxkZXIuY3JlYXRlU3RyaW5nKHRoaXMubmFtZSkgOiAwKTsKKyAgICAgICAgY29uc3QgdW5pb25UeXBlID0gKHRoaXMudW5pb25UeXBlICE9PSBudWxsID8gdGhpcy51bmlvblR5cGUucGFjayhidWlsZGVyKSA6IDApOworICAgICAgICBjb25zdCBkb2N1bWVudGF0aW9uID0gRW51bVZhbC5jcmVhdGVEb2N1bWVudGF0aW9uVmVjdG9yKGJ1aWxkZXIsIGJ1aWxkZXIuY3JlYXRlT2JqZWN0T2Zmc2V0TGlzdCh0aGlzLmRvY3VtZW50YXRpb24pKTsKKyAgICAgICAgRW51bVZhbC5zdGFydEVudW1WYWwoYnVpbGRlcik7CisgICAgICAgIEVudW1WYWwuYWRkTmFtZShidWlsZGVyLCBuYW1lKTsKKyAgICAgICAgRW51bVZhbC5hZGRWYWx1ZShidWlsZGVyLCB0aGlzLnZhbHVlKTsKKyAgICAgICAgRW51bVZhbC5hZGRVbmlvblR5cGUoYnVpbGRlciwgdW5pb25UeXBlKTsKKyAgICAgICAgRW51bVZhbC5hZGREb2N1bWVudGF0aW9uKGJ1aWxkZXIsIGRvY3VtZW50YXRpb24pOworICAgICAgICByZXR1cm4gRW51bVZhbC5lbmRFbnVtVmFsKGJ1aWxkZXIpOworICAgIH0KK30KK2V4cG9ydCBjbGFzcyBFbnVtIHsKKyAgICBjb25zdHJ1Y3RvcigpIHsKKyAgICAgICAgdGhpcy5iYiA9IG51bGw7CisgICAgICAgIHRoaXMuYmJfcG9zID0gMDsKKyAgICB9CisgICAgX19pbml0KGksIGJiKSB7CisgICAgICAgIHRoaXMuYmJfcG9zID0gaTsKKyAgICAgICAgdGhpcy5iYiA9IGJiOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisgICAgc3RhdGljIGdldFJvb3RBc0VudW0oYmIsIG9iaikgeworICAgICAgICByZXR1cm4gKG9iaiB8fCBuZXcgRW51bSgpKS5fX2luaXQoYmIucmVhZEludDMyKGJiLnBvc2l0aW9uKCkpICsgYmIucG9zaXRpb24oKSwgYmIpOworICAgIH0KKyAgICBzdGF0aWMgZ2V0U2l6ZVByZWZpeGVkUm9vdEFzRW51bShiYiwgb2JqKSB7CisgICAgICAgIGJiLnNldFBvc2l0aW9uKGJiLnBvc2l0aW9uKCkgKyBmbGF0YnVmZmVycy5TSVpFX1BSRUZJWF9MRU5HVEgpOworICAgICAgICByZXR1cm4gKG9iaiB8fCBuZXcgRW51bSgpKS5fX2luaXQoYmIucmVhZEludDMyKGJiLnBvc2l0aW9uKCkpICsgYmIucG9zaXRpb24oKSwgYmIpOworICAgIH0KKyAgICBuYW1lKG9wdGlvbmFsRW5jb2RpbmcpIHsKKyAgICAgICAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywgNCk7CisgICAgICAgIHJldHVybiBvZmZzZXQgPyB0aGlzLmJiLl9fc3RyaW5nKHRoaXMuYmJfcG9zICsgb2Zmc2V0LCBvcHRpb25hbEVuY29kaW5nKSA6IG51bGw7CisgICAgfQorICAgIHZhbHVlcyhpbmRleCwgb2JqKSB7CisgICAgICAgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsIDYpOworICAgICAgICByZXR1cm4gb2Zmc2V0ID8gKG9iaiB8fCBuZXcgRW51bVZhbCgpKS5fX2luaXQodGhpcy5iYi5fX2luZGlyZWN0KHRoaXMuYmIuX192ZWN0b3IodGhpcy5iYl9wb3MgKyBvZmZzZXQpICsgaW5kZXggKiA0KSwgdGhpcy5iYikgOiBudWxsOworICAgIH0KKyAgICB2YWx1ZXNMZW5ndGgoKSB7CisgICAgICAgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsIDYpOworICAgICAgICByZXR1cm4gb2Zmc2V0ID8gdGhpcy5iYi5fX3ZlY3Rvcl9sZW4odGhpcy5iYl9wb3MgKyBvZmZzZXQpIDogMDsKKyAgICB9CisgICAgaXNVbmlvbigpIHsKKyAgICAgICAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywgOCk7CisgICAgICAgIHJldHVybiBvZmZzZXQgPyAhIXRoaXMuYmIucmVhZEludDgodGhpcy5iYl9wb3MgKyBvZmZzZXQpIDogZmFsc2U7CisgICAgfQorICAgIG11dGF0ZV9pc191bmlvbih2YWx1ZSkgeworICAgICAgICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCA4KTsKKyAgICAgICAgaWYgKG9mZnNldCA9PT0gMCkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIHRoaXMuYmIud3JpdGVJbnQ4KHRoaXMuYmJfcG9zICsgb2Zmc2V0LCArdmFsdWUpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgdW5kZXJseWluZ1R5cGUob2JqKSB7CisgICAgICAgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsIDEwKTsKKyAgICAgICAgcmV0dXJuIG9mZnNldCA/IChvYmogfHwgbmV3IFR5cGUoKSkuX19pbml0KHRoaXMuYmIuX19pbmRpcmVjdCh0aGlzLmJiX3BvcyArIG9mZnNldCksIHRoaXMuYmIpIDogbnVsbDsKKyAgICB9CisgICAgYXR0cmlidXRlcyhpbmRleCwgb2JqKSB7CisgICAgICAgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsIDEyKTsKKyAgICAgICAgcmV0dXJuIG9mZnNldCA/IChvYmogfHwgbmV3IEtleVZhbHVlKCkpLl9faW5pdCh0aGlzLmJiLl9faW5kaXJlY3QodGhpcy5iYi5fX3ZlY3Rvcih0aGlzLmJiX3BvcyArIG9mZnNldCkgKyBpbmRleCAqIDQpLCB0aGlzLmJiKSA6IG51bGw7CisgICAgfQorICAgIGF0dHJpYnV0ZXNMZW5ndGgoKSB7CisgICAgICAgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsIDEyKTsKKyAgICAgICAgcmV0dXJuIG9mZnNldCA/IHRoaXMuYmIuX192ZWN0b3JfbGVuKHRoaXMuYmJfcG9zICsgb2Zmc2V0KSA6IDA7CisgICAgfQorICAgIGRvY3VtZW50YXRpb24oaW5kZXgsIG9wdGlvbmFsRW5jb2RpbmcpIHsKKyAgICAgICAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywgMTQpOworICAgICAgICByZXR1cm4gb2Zmc2V0ID8gdGhpcy5iYi5fX3N0cmluZyh0aGlzLmJiLl9fdmVjdG9yKHRoaXMuYmJfcG9zICsgb2Zmc2V0KSArIGluZGV4ICogNCwgb3B0aW9uYWxFbmNvZGluZykgOiBudWxsOworICAgIH0KKyAgICBkb2N1bWVudGF0aW9uTGVuZ3RoKCkgeworICAgICAgICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCAxNCk7CisgICAgICAgIHJldHVybiBvZmZzZXQgPyB0aGlzLmJiLl9fdmVjdG9yX2xlbih0aGlzLmJiX3BvcyArIG9mZnNldCkgOiAwOworICAgIH0KKyAgICBkZWNsYXJhdGlvbkZpbGUob3B0aW9uYWxFbmNvZGluZykgeworICAgICAgICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCAxNik7CisgICAgICAgIHJldHVybiBvZmZzZXQgPyB0aGlzLmJiLl9fc3RyaW5nKHRoaXMuYmJfcG9zICsgb2Zmc2V0LCBvcHRpb25hbEVuY29kaW5nKSA6IG51bGw7CisgICAgfQorICAgIHN0YXRpYyBnZXRGdWxseVF1YWxpZmllZE5hbWUoKSB7CisgICAgICAgIHJldHVybiAncmVmbGVjdGlvbl9FbnVtJzsKKyAgICB9CisgICAgc3RhdGljIHN0YXJ0RW51bShidWlsZGVyKSB7CisgICAgICAgIGJ1aWxkZXIuc3RhcnRPYmplY3QoNyk7CisgICAgfQorICAgIHN0YXRpYyBhZGROYW1lKGJ1aWxkZXIsIG5hbWVPZmZzZXQpIHsKKyAgICAgICAgYnVpbGRlci5hZGRGaWVsZE9mZnNldCgwLCBuYW1lT2Zmc2V0LCAwKTsKKyAgICB9CisgICAgc3RhdGljIGFkZFZhbHVlcyhidWlsZGVyLCB2YWx1ZXNPZmZzZXQpIHsKKyAgICAgICAgYnVpbGRlci5hZGRGaWVsZE9mZnNldCgxLCB2YWx1ZXNPZmZzZXQsIDApOworICAgIH0KKyAgICBzdGF0aWMgY3JlYXRlVmFsdWVzVmVjdG9yKGJ1aWxkZXIsIGRhdGEpIHsKKyAgICAgICAgYnVpbGRlci5zdGFydFZlY3Rvcig0LCBkYXRhLmxlbmd0aCwgNCk7CisgICAgICAgIGZvciAobGV0IGkgPSBkYXRhLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7CisgICAgICAgICAgICBidWlsZGVyLmFkZE9mZnNldChkYXRhW2ldKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gYnVpbGRlci5lbmRWZWN0b3IoKTsKKyAgICB9CisgICAgc3RhdGljIHN0YXJ0VmFsdWVzVmVjdG9yKGJ1aWxkZXIsIG51bUVsZW1zKSB7CisgICAgICAgIGJ1aWxkZXIuc3RhcnRWZWN0b3IoNCwgbnVtRWxlbXMsIDQpOworICAgIH0KKyAgICBzdGF0aWMgYWRkSXNVbmlvbihidWlsZGVyLCBpc1VuaW9uKSB7CisgICAgICAgIGJ1aWxkZXIuYWRkRmllbGRJbnQ4KDIsICtpc1VuaW9uLCArZmFsc2UpOworICAgIH0KKyAgICBzdGF0aWMgYWRkVW5kZXJseWluZ1R5cGUoYnVpbGRlciwgdW5kZXJseWluZ1R5cGVPZmZzZXQpIHsKKyAgICAgICAgYnVpbGRlci5hZGRGaWVsZE9mZnNldCgzLCB1bmRlcmx5aW5nVHlwZU9mZnNldCwgMCk7CisgICAgfQorICAgIHN0YXRpYyBhZGRBdHRyaWJ1dGVzKGJ1aWxkZXIsIGF0dHJpYnV0ZXNPZmZzZXQpIHsKKyAgICAgICAgYnVpbGRlci5hZGRGaWVsZE9mZnNldCg0LCBhdHRyaWJ1dGVzT2Zmc2V0LCAwKTsKKyAgICB9CisgICAgc3RhdGljIGNyZWF0ZUF0dHJpYnV0ZXNWZWN0b3IoYnVpbGRlciwgZGF0YSkgeworICAgICAgICBidWlsZGVyLnN0YXJ0VmVjdG9yKDQsIGRhdGEubGVuZ3RoLCA0KTsKKyAgICAgICAgZm9yIChsZXQgaSA9IGRhdGEubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHsKKyAgICAgICAgICAgIGJ1aWxkZXIuYWRkT2Zmc2V0KGRhdGFbaV0pOworICAgICAgICB9CisgICAgICAgIHJldHVybiBidWlsZGVyLmVuZFZlY3RvcigpOworICAgIH0KKyAgICBzdGF0aWMgc3RhcnRBdHRyaWJ1dGVzVmVjdG9yKGJ1aWxkZXIsIG51bUVsZW1zKSB7CisgICAgICAgIGJ1aWxkZXIuc3RhcnRWZWN0b3IoNCwgbnVtRWxlbXMsIDQpOworICAgIH0KKyAgICBzdGF0aWMgYWRkRG9jdW1lbnRhdGlvbihidWlsZGVyLCBkb2N1bWVudGF0aW9uT2Zmc2V0KSB7CisgICAgICAgIGJ1aWxkZXIuYWRkRmllbGRPZmZzZXQoNSwgZG9jdW1lbnRhdGlvbk9mZnNldCwgMCk7CisgICAgfQorICAgIHN0YXRpYyBjcmVhdGVEb2N1bWVudGF0aW9uVmVjdG9yKGJ1aWxkZXIsIGRhdGEpIHsKKyAgICAgICAgYnVpbGRlci5zdGFydFZlY3Rvcig0LCBkYXRhLmxlbmd0aCwgNCk7CisgICAgICAgIGZvciAobGV0IGkgPSBkYXRhLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7CisgICAgICAgICAgICBidWlsZGVyLmFkZE9mZnNldChkYXRhW2ldKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gYnVpbGRlci5lbmRWZWN0b3IoKTsKKyAgICB9CisgICAgc3RhdGljIHN0YXJ0RG9jdW1lbnRhdGlvblZlY3RvcihidWlsZGVyLCBudW1FbGVtcykgeworICAgICAgICBidWlsZGVyLnN0YXJ0VmVjdG9yKDQsIG51bUVsZW1zLCA0KTsKKyAgICB9CisgICAgc3RhdGljIGFkZERlY2xhcmF0aW9uRmlsZShidWlsZGVyLCBkZWNsYXJhdGlvbkZpbGVPZmZzZXQpIHsKKyAgICAgICAgYnVpbGRlci5hZGRGaWVsZE9mZnNldCg2LCBkZWNsYXJhdGlvbkZpbGVPZmZzZXQsIDApOworICAgIH0KKyAgICBzdGF0aWMgZW5kRW51bShidWlsZGVyKSB7CisgICAgICAgIGNvbnN0IG9mZnNldCA9IGJ1aWxkZXIuZW5kT2JqZWN0KCk7CisgICAgICAgIGJ1aWxkZXIucmVxdWlyZWRGaWVsZChvZmZzZXQsIDQpOyAvLyBuYW1lCisgICAgICAgIGJ1aWxkZXIucmVxdWlyZWRGaWVsZChvZmZzZXQsIDYpOyAvLyB2YWx1ZXMKKyAgICAgICAgYnVpbGRlci5yZXF1aXJlZEZpZWxkKG9mZnNldCwgMTApOyAvLyB1bmRlcmx5aW5nX3R5cGUKKyAgICAgICAgcmV0dXJuIG9mZnNldDsKKyAgICB9CisgICAgdW5wYWNrKCkgeworICAgICAgICByZXR1cm4gbmV3IEVudW1UKHRoaXMubmFtZSgpLCB0aGlzLmJiLmNyZWF0ZU9iakxpc3QodGhpcy52YWx1ZXMuYmluZCh0aGlzKSwgdGhpcy52YWx1ZXNMZW5ndGgoKSksIHRoaXMuaXNVbmlvbigpLCAodGhpcy51bmRlcmx5aW5nVHlwZSgpICE9PSBudWxsID8gdGhpcy51bmRlcmx5aW5nVHlwZSgpLnVucGFjaygpIDogbnVsbCksIHRoaXMuYmIuY3JlYXRlT2JqTGlzdCh0aGlzLmF0dHJpYnV0ZXMuYmluZCh0aGlzKSwgdGhpcy5hdHRyaWJ1dGVzTGVuZ3RoKCkpLCB0aGlzLmJiLmNyZWF0ZVNjYWxhckxpc3QodGhpcy5kb2N1bWVudGF0aW9uLmJpbmQodGhpcyksIHRoaXMuZG9jdW1lbnRhdGlvbkxlbmd0aCgpKSwgdGhpcy5kZWNsYXJhdGlvbkZpbGUoKSk7CisgICAgfQorICAgIHVucGFja1RvKF9vKSB7CisgICAgICAgIF9vLm5hbWUgPSB0aGlzLm5hbWUoKTsKKyAgICAgICAgX28udmFsdWVzID0gdGhpcy5iYi5jcmVhdGVPYmpMaXN0KHRoaXMudmFsdWVzLmJpbmQodGhpcyksIHRoaXMudmFsdWVzTGVuZ3RoKCkpOworICAgICAgICBfby5pc1VuaW9uID0gdGhpcy5pc1VuaW9uKCk7CisgICAgICAgIF9vLnVuZGVybHlpbmdUeXBlID0gKHRoaXMudW5kZXJseWluZ1R5cGUoKSAhPT0gbnVsbCA/IHRoaXMudW5kZXJseWluZ1R5cGUoKS51bnBhY2soKSA6IG51bGwpOworICAgICAgICBfby5hdHRyaWJ1dGVzID0gdGhpcy5iYi5jcmVhdGVPYmpMaXN0KHRoaXMuYXR0cmlidXRlcy5iaW5kKHRoaXMpLCB0aGlzLmF0dHJpYnV0ZXNMZW5ndGgoKSk7CisgICAgICAgIF9vLmRvY3VtZW50YXRpb24gPSB0aGlzLmJiLmNyZWF0ZVNjYWxhckxpc3QodGhpcy5kb2N1bWVudGF0aW9uLmJpbmQodGhpcyksIHRoaXMuZG9jdW1lbnRhdGlvbkxlbmd0aCgpKTsKKyAgICAgICAgX28uZGVjbGFyYXRpb25GaWxlID0gdGhpcy5kZWNsYXJhdGlvbkZpbGUoKTsKKyAgICB9Cit9CitleHBvcnQgY2xhc3MgRW51bVQgeworICAgIGNvbnN0cnVjdG9yKG5hbWUgPSBudWxsLCB2YWx1ZXMgPSBbXSwgaXNVbmlvbiA9IGZhbHNlLCB1bmRlcmx5aW5nVHlwZSA9IG51bGwsIGF0dHJpYnV0ZXMgPSBbXSwgZG9jdW1lbnRhdGlvbiA9IFtdLCBkZWNsYXJhdGlvbkZpbGUgPSBudWxsKSB7CisgICAgICAgIHRoaXMubmFtZSA9IG5hbWU7CisgICAgICAgIHRoaXMudmFsdWVzID0gdmFsdWVzOworICAgICAgICB0aGlzLmlzVW5pb24gPSBpc1VuaW9uOworICAgICAgICB0aGlzLnVuZGVybHlpbmdUeXBlID0gdW5kZXJseWluZ1R5cGU7CisgICAgICAgIHRoaXMuYXR0cmlidXRlcyA9IGF0dHJpYnV0ZXM7CisgICAgICAgIHRoaXMuZG9jdW1lbnRhdGlvbiA9IGRvY3VtZW50YXRpb247CisgICAgICAgIHRoaXMuZGVjbGFyYXRpb25GaWxlID0gZGVjbGFyYXRpb25GaWxlOworICAgIH0KKyAgICBwYWNrKGJ1aWxkZXIpIHsKKyAgICAgICAgY29uc3QgbmFtZSA9ICh0aGlzLm5hbWUgIT09IG51bGwgPyBidWlsZGVyLmNyZWF0ZVN0cmluZyh0aGlzLm5hbWUpIDogMCk7CisgICAgICAgIGNvbnN0IHZhbHVlcyA9IEVudW0uY3JlYXRlVmFsdWVzVmVjdG9yKGJ1aWxkZXIsIGJ1aWxkZXIuY3JlYXRlT2JqZWN0T2Zmc2V0TGlzdCh0aGlzLnZhbHVlcykpOworICAgICAgICBjb25zdCB1bmRlcmx5aW5nVHlwZSA9ICh0aGlzLnVuZGVybHlpbmdUeXBlICE9PSBudWxsID8gdGhpcy51bmRlcmx5aW5nVHlwZS5wYWNrKGJ1aWxkZXIpIDogMCk7CisgICAgICAgIGNvbnN0IGF0dHJpYnV0ZXMgPSBFbnVtLmNyZWF0ZUF0dHJpYnV0ZXNWZWN0b3IoYnVpbGRlciwgYnVpbGRlci5jcmVhdGVPYmplY3RPZmZzZXRMaXN0KHRoaXMuYXR0cmlidXRlcykpOworICAgICAgICBjb25zdCBkb2N1bWVudGF0aW9uID0gRW51bS5jcmVhdGVEb2N1bWVudGF0aW9uVmVjdG9yKGJ1aWxkZXIsIGJ1aWxkZXIuY3JlYXRlT2JqZWN0T2Zmc2V0TGlzdCh0aGlzLmRvY3VtZW50YXRpb24pKTsKKyAgICAgICAgY29uc3QgZGVjbGFyYXRpb25GaWxlID0gKHRoaXMuZGVjbGFyYXRpb25GaWxlICE9PSBudWxsID8gYnVpbGRlci5jcmVhdGVTdHJpbmcodGhpcy5kZWNsYXJhdGlvbkZpbGUpIDogMCk7CisgICAgICAgIEVudW0uc3RhcnRFbnVtKGJ1aWxkZXIpOworICAgICAgICBFbnVtLmFkZE5hbWUoYnVpbGRlciwgbmFtZSk7CisgICAgICAgIEVudW0uYWRkVmFsdWVzKGJ1aWxkZXIsIHZhbHVlcyk7CisgICAgICAgIEVudW0uYWRkSXNVbmlvbihidWlsZGVyLCB0aGlzLmlzVW5pb24pOworICAgICAgICBFbnVtLmFkZFVuZGVybHlpbmdUeXBlKGJ1aWxkZXIsIHVuZGVybHlpbmdUeXBlKTsKKyAgICAgICAgRW51bS5hZGRBdHRyaWJ1dGVzKGJ1aWxkZXIsIGF0dHJpYnV0ZXMpOworICAgICAgICBFbnVtLmFkZERvY3VtZW50YXRpb24oYnVpbGRlciwgZG9jdW1lbnRhdGlvbik7CisgICAgICAgIEVudW0uYWRkRGVjbGFyYXRpb25GaWxlKGJ1aWxkZXIsIGRlY2xhcmF0aW9uRmlsZSk7CisgICAgICAgIHJldHVybiBFbnVtLmVuZEVudW0oYnVpbGRlcik7CisgICAgfQorfQorZXhwb3J0IGNsYXNzIEZpZWxkIHsKKyAgICBjb25zdHJ1Y3RvcigpIHsKKyAgICAgICAgdGhpcy5iYiA9IG51bGw7CisgICAgICAgIHRoaXMuYmJfcG9zID0gMDsKKyAgICB9CisgICAgX19pbml0KGksIGJiKSB7CisgICAgICAgIHRoaXMuYmJfcG9zID0gaTsKKyAgICAgICAgdGhpcy5iYiA9IGJiOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisgICAgc3RhdGljIGdldFJvb3RBc0ZpZWxkKGJiLCBvYmopIHsKKyAgICAgICAgcmV0dXJuIChvYmogfHwgbmV3IEZpZWxkKCkpLl9faW5pdChiYi5yZWFkSW50MzIoYmIucG9zaXRpb24oKSkgKyBiYi5wb3NpdGlvbigpLCBiYik7CisgICAgfQorICAgIHN0YXRpYyBnZXRTaXplUHJlZml4ZWRSb290QXNGaWVsZChiYiwgb2JqKSB7CisgICAgICAgIGJiLnNldFBvc2l0aW9uKGJiLnBvc2l0aW9uKCkgKyBmbGF0YnVmZmVycy5TSVpFX1BSRUZJWF9MRU5HVEgpOworICAgICAgICByZXR1cm4gKG9iaiB8fCBuZXcgRmllbGQoKSkuX19pbml0KGJiLnJlYWRJbnQzMihiYi5wb3NpdGlvbigpKSArIGJiLnBvc2l0aW9uKCksIGJiKTsKKyAgICB9CisgICAgbmFtZShvcHRpb25hbEVuY29kaW5nKSB7CisgICAgICAgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsIDQpOworICAgICAgICByZXR1cm4gb2Zmc2V0ID8gdGhpcy5iYi5fX3N0cmluZyh0aGlzLmJiX3BvcyArIG9mZnNldCwgb3B0aW9uYWxFbmNvZGluZykgOiBudWxsOworICAgIH0KKyAgICB0eXBlKG9iaikgeworICAgICAgICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCA2KTsKKyAgICAgICAgcmV0dXJuIG9mZnNldCA/IChvYmogfHwgbmV3IFR5cGUoKSkuX19pbml0KHRoaXMuYmIuX19pbmRpcmVjdCh0aGlzLmJiX3BvcyArIG9mZnNldCksIHRoaXMuYmIpIDogbnVsbDsKKyAgICB9CisgICAgaWQoKSB7CisgICAgICAgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsIDgpOworICAgICAgICByZXR1cm4gb2Zmc2V0ID8gdGhpcy5iYi5yZWFkVWludDE2KHRoaXMuYmJfcG9zICsgb2Zmc2V0KSA6IDA7CisgICAgfQorICAgIG11dGF0ZV9pZCh2YWx1ZSkgeworICAgICAgICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCA4KTsKKyAgICAgICAgaWYgKG9mZnNldCA9PT0gMCkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIHRoaXMuYmIud3JpdGVVaW50MTYodGhpcy5iYl9wb3MgKyBvZmZzZXQsIHZhbHVlKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIG9mZnNldCgpIHsKKyAgICAgICAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywgMTApOworICAgICAgICByZXR1cm4gb2Zmc2V0ID8gdGhpcy5iYi5yZWFkVWludDE2KHRoaXMuYmJfcG9zICsgb2Zmc2V0KSA6IDA7CisgICAgfQorICAgIG11dGF0ZV9vZmZzZXQodmFsdWUpIHsKKyAgICAgICAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywgMTApOworICAgICAgICBpZiAob2Zmc2V0ID09PSAwKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgdGhpcy5iYi53cml0ZVVpbnQxNih0aGlzLmJiX3BvcyArIG9mZnNldCwgdmFsdWUpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgZGVmYXVsdEludGVnZXIoKSB7CisgICAgICAgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsIDEyKTsKKyAgICAgICAgcmV0dXJuIG9mZnNldCA/IHRoaXMuYmIucmVhZEludDY0KHRoaXMuYmJfcG9zICsgb2Zmc2V0KSA6IEJpZ0ludCgnMCcpOworICAgIH0KKyAgICBtdXRhdGVfZGVmYXVsdF9pbnRlZ2VyKHZhbHVlKSB7CisgICAgICAgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsIDEyKTsKKyAgICAgICAgaWYgKG9mZnNldCA9PT0gMCkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIHRoaXMuYmIud3JpdGVJbnQ2NCh0aGlzLmJiX3BvcyArIG9mZnNldCwgdmFsdWUpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgZGVmYXVsdFJlYWwoKSB7CisgICAgICAgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsIDE0KTsKKyAgICAgICAgcmV0dXJuIG9mZnNldCA/IHRoaXMuYmIucmVhZEZsb2F0NjQodGhpcy5iYl9wb3MgKyBvZmZzZXQpIDogMC4wOworICAgIH0KKyAgICBtdXRhdGVfZGVmYXVsdF9yZWFsKHZhbHVlKSB7CisgICAgICAgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsIDE0KTsKKyAgICAgICAgaWYgKG9mZnNldCA9PT0gMCkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIHRoaXMuYmIud3JpdGVGbG9hdDY0KHRoaXMuYmJfcG9zICsgb2Zmc2V0LCB2YWx1ZSk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICBkZXByZWNhdGVkKCkgeworICAgICAgICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCAxNik7CisgICAgICAgIHJldHVybiBvZmZzZXQgPyAhIXRoaXMuYmIucmVhZEludDgodGhpcy5iYl9wb3MgKyBvZmZzZXQpIDogZmFsc2U7CisgICAgfQorICAgIG11dGF0ZV9kZXByZWNhdGVkKHZhbHVlKSB7CisgICAgICAgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsIDE2KTsKKyAgICAgICAgaWYgKG9mZnNldCA9PT0gMCkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIHRoaXMuYmIud3JpdGVJbnQ4KHRoaXMuYmJfcG9zICsgb2Zmc2V0LCArdmFsdWUpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgcmVxdWlyZWQoKSB7CisgICAgICAgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsIDE4KTsKKyAgICAgICAgcmV0dXJuIG9mZnNldCA/ICEhdGhpcy5iYi5yZWFkSW50OCh0aGlzLmJiX3BvcyArIG9mZnNldCkgOiBmYWxzZTsKKyAgICB9CisgICAgbXV0YXRlX3JlcXVpcmVkKHZhbHVlKSB7CisgICAgICAgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsIDE4KTsKKyAgICAgICAgaWYgKG9mZnNldCA9PT0gMCkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIHRoaXMuYmIud3JpdGVJbnQ4KHRoaXMuYmJfcG9zICsgb2Zmc2V0LCArdmFsdWUpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAga2V5KCkgeworICAgICAgICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCAyMCk7CisgICAgICAgIHJldHVybiBvZmZzZXQgPyAhIXRoaXMuYmIucmVhZEludDgodGhpcy5iYl9wb3MgKyBvZmZzZXQpIDogZmFsc2U7CisgICAgfQorICAgIG11dGF0ZV9rZXkodmFsdWUpIHsKKyAgICAgICAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywgMjApOworICAgICAgICBpZiAob2Zmc2V0ID09PSAwKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgdGhpcy5iYi53cml0ZUludDgodGhpcy5iYl9wb3MgKyBvZmZzZXQsICt2YWx1ZSk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICBhdHRyaWJ1dGVzKGluZGV4LCBvYmopIHsKKyAgICAgICAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywgMjIpOworICAgICAgICByZXR1cm4gb2Zmc2V0ID8gKG9iaiB8fCBuZXcgS2V5VmFsdWUoKSkuX19pbml0KHRoaXMuYmIuX19pbmRpcmVjdCh0aGlzLmJiLl9fdmVjdG9yKHRoaXMuYmJfcG9zICsgb2Zmc2V0KSArIGluZGV4ICogNCksIHRoaXMuYmIpIDogbnVsbDsKKyAgICB9CisgICAgYXR0cmlidXRlc0xlbmd0aCgpIHsKKyAgICAgICAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywgMjIpOworICAgICAgICByZXR1cm4gb2Zmc2V0ID8gdGhpcy5iYi5fX3ZlY3Rvcl9sZW4odGhpcy5iYl9wb3MgKyBvZmZzZXQpIDogMDsKKyAgICB9CisgICAgZG9jdW1lbnRhdGlvbihpbmRleCwgb3B0aW9uYWxFbmNvZGluZykgeworICAgICAgICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCAyNCk7CisgICAgICAgIHJldHVybiBvZmZzZXQgPyB0aGlzLmJiLl9fc3RyaW5nKHRoaXMuYmIuX192ZWN0b3IodGhpcy5iYl9wb3MgKyBvZmZzZXQpICsgaW5kZXggKiA0LCBvcHRpb25hbEVuY29kaW5nKSA6IG51bGw7CisgICAgfQorICAgIGRvY3VtZW50YXRpb25MZW5ndGgoKSB7CisgICAgICAgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsIDI0KTsKKyAgICAgICAgcmV0dXJuIG9mZnNldCA/IHRoaXMuYmIuX192ZWN0b3JfbGVuKHRoaXMuYmJfcG9zICsgb2Zmc2V0KSA6IDA7CisgICAgfQorICAgIG9wdGlvbmFsKCkgeworICAgICAgICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCAyNik7CisgICAgICAgIHJldHVybiBvZmZzZXQgPyAhIXRoaXMuYmIucmVhZEludDgodGhpcy5iYl9wb3MgKyBvZmZzZXQpIDogZmFsc2U7CisgICAgfQorICAgIG11dGF0ZV9vcHRpb25hbCh2YWx1ZSkgeworICAgICAgICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCAyNik7CisgICAgICAgIGlmIChvZmZzZXQgPT09IDApIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICB0aGlzLmJiLndyaXRlSW50OCh0aGlzLmJiX3BvcyArIG9mZnNldCwgK3ZhbHVlKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIC8qKgorICAgICAqIE51bWJlciBvZiBwYWRkaW5nIG9jdGV0cyB0byBhbHdheXMgYWRkIGFmdGVyIHRoaXMgZmllbGQuIFN0cnVjdHMgb25seS4KKyAgICAgKi8KKyAgICBwYWRkaW5nKCkgeworICAgICAgICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCAyOCk7CisgICAgICAgIHJldHVybiBvZmZzZXQgPyB0aGlzLmJiLnJlYWRVaW50MTYodGhpcy5iYl9wb3MgKyBvZmZzZXQpIDogMDsKKyAgICB9CisgICAgbXV0YXRlX3BhZGRpbmcodmFsdWUpIHsKKyAgICAgICAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywgMjgpOworICAgICAgICBpZiAob2Zmc2V0ID09PSAwKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgdGhpcy5iYi53cml0ZVVpbnQxNih0aGlzLmJiX3BvcyArIG9mZnNldCwgdmFsdWUpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgc3RhdGljIGdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpIHsKKyAgICAgICAgcmV0dXJuICdyZWZsZWN0aW9uX0ZpZWxkJzsKKyAgICB9CisgICAgc3RhdGljIHN0YXJ0RmllbGQoYnVpbGRlcikgeworICAgICAgICBidWlsZGVyLnN0YXJ0T2JqZWN0KDEzKTsKKyAgICB9CisgICAgc3RhdGljIGFkZE5hbWUoYnVpbGRlciwgbmFtZU9mZnNldCkgeworICAgICAgICBidWlsZGVyLmFkZEZpZWxkT2Zmc2V0KDAsIG5hbWVPZmZzZXQsIDApOworICAgIH0KKyAgICBzdGF0aWMgYWRkVHlwZShidWlsZGVyLCB0eXBlT2Zmc2V0KSB7CisgICAgICAgIGJ1aWxkZXIuYWRkRmllbGRPZmZzZXQoMSwgdHlwZU9mZnNldCwgMCk7CisgICAgfQorICAgIHN0YXRpYyBhZGRJZChidWlsZGVyLCBpZCkgeworICAgICAgICBidWlsZGVyLmFkZEZpZWxkSW50MTYoMiwgaWQsIDApOworICAgIH0KKyAgICBzdGF0aWMgYWRkT2Zmc2V0KGJ1aWxkZXIsIG9mZnNldCkgeworICAgICAgICBidWlsZGVyLmFkZEZpZWxkSW50MTYoMywgb2Zmc2V0LCAwKTsKKyAgICB9CisgICAgc3RhdGljIGFkZERlZmF1bHRJbnRlZ2VyKGJ1aWxkZXIsIGRlZmF1bHRJbnRlZ2VyKSB7CisgICAgICAgIGJ1aWxkZXIuYWRkRmllbGRJbnQ2NCg0LCBkZWZhdWx0SW50ZWdlciwgQmlnSW50KCcwJykpOworICAgIH0KKyAgICBzdGF0aWMgYWRkRGVmYXVsdFJlYWwoYnVpbGRlciwgZGVmYXVsdFJlYWwpIHsKKyAgICAgICAgYnVpbGRlci5hZGRGaWVsZEZsb2F0NjQoNSwgZGVmYXVsdFJlYWwsIDAuMCk7CisgICAgfQorICAgIHN0YXRpYyBhZGREZXByZWNhdGVkKGJ1aWxkZXIsIGRlcHJlY2F0ZWQpIHsKKyAgICAgICAgYnVpbGRlci5hZGRGaWVsZEludDgoNiwgK2RlcHJlY2F0ZWQsICtmYWxzZSk7CisgICAgfQorICAgIHN0YXRpYyBhZGRSZXF1aXJlZChidWlsZGVyLCByZXF1aXJlZCkgeworICAgICAgICBidWlsZGVyLmFkZEZpZWxkSW50OCg3LCArcmVxdWlyZWQsICtmYWxzZSk7CisgICAgfQorICAgIHN0YXRpYyBhZGRLZXkoYnVpbGRlciwga2V5KSB7CisgICAgICAgIGJ1aWxkZXIuYWRkRmllbGRJbnQ4KDgsICtrZXksICtmYWxzZSk7CisgICAgfQorICAgIHN0YXRpYyBhZGRBdHRyaWJ1dGVzKGJ1aWxkZXIsIGF0dHJpYnV0ZXNPZmZzZXQpIHsKKyAgICAgICAgYnVpbGRlci5hZGRGaWVsZE9mZnNldCg5LCBhdHRyaWJ1dGVzT2Zmc2V0LCAwKTsKKyAgICB9CisgICAgc3RhdGljIGNyZWF0ZUF0dHJpYnV0ZXNWZWN0b3IoYnVpbGRlciwgZGF0YSkgeworICAgICAgICBidWlsZGVyLnN0YXJ0VmVjdG9yKDQsIGRhdGEubGVuZ3RoLCA0KTsKKyAgICAgICAgZm9yIChsZXQgaSA9IGRhdGEubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHsKKyAgICAgICAgICAgIGJ1aWxkZXIuYWRkT2Zmc2V0KGRhdGFbaV0pOworICAgICAgICB9CisgICAgICAgIHJldHVybiBidWlsZGVyLmVuZFZlY3RvcigpOworICAgIH0KKyAgICBzdGF0aWMgc3RhcnRBdHRyaWJ1dGVzVmVjdG9yKGJ1aWxkZXIsIG51bUVsZW1zKSB7CisgICAgICAgIGJ1aWxkZXIuc3RhcnRWZWN0b3IoNCwgbnVtRWxlbXMsIDQpOworICAgIH0KKyAgICBzdGF0aWMgYWRkRG9jdW1lbnRhdGlvbihidWlsZGVyLCBkb2N1bWVudGF0aW9uT2Zmc2V0KSB7CisgICAgICAgIGJ1aWxkZXIuYWRkRmllbGRPZmZzZXQoMTAsIGRvY3VtZW50YXRpb25PZmZzZXQsIDApOworICAgIH0KKyAgICBzdGF0aWMgY3JlYXRlRG9jdW1lbnRhdGlvblZlY3RvcihidWlsZGVyLCBkYXRhKSB7CisgICAgICAgIGJ1aWxkZXIuc3RhcnRWZWN0b3IoNCwgZGF0YS5sZW5ndGgsIDQpOworICAgICAgICBmb3IgKGxldCBpID0gZGF0YS5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgeworICAgICAgICAgICAgYnVpbGRlci5hZGRPZmZzZXQoZGF0YVtpXSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGJ1aWxkZXIuZW5kVmVjdG9yKCk7CisgICAgfQorICAgIHN0YXRpYyBzdGFydERvY3VtZW50YXRpb25WZWN0b3IoYnVpbGRlciwgbnVtRWxlbXMpIHsKKyAgICAgICAgYnVpbGRlci5zdGFydFZlY3Rvcig0LCBudW1FbGVtcywgNCk7CisgICAgfQorICAgIHN0YXRpYyBhZGRPcHRpb25hbChidWlsZGVyLCBvcHRpb25hbCkgeworICAgICAgICBidWlsZGVyLmFkZEZpZWxkSW50OCgxMSwgK29wdGlvbmFsLCArZmFsc2UpOworICAgIH0KKyAgICBzdGF0aWMgYWRkUGFkZGluZyhidWlsZGVyLCBwYWRkaW5nKSB7CisgICAgICAgIGJ1aWxkZXIuYWRkRmllbGRJbnQxNigxMiwgcGFkZGluZywgMCk7CisgICAgfQorICAgIHN0YXRpYyBlbmRGaWVsZChidWlsZGVyKSB7CisgICAgICAgIGNvbnN0IG9mZnNldCA9IGJ1aWxkZXIuZW5kT2JqZWN0KCk7CisgICAgICAgIGJ1aWxkZXIucmVxdWlyZWRGaWVsZChvZmZzZXQsIDQpOyAvLyBuYW1lCisgICAgICAgIGJ1aWxkZXIucmVxdWlyZWRGaWVsZChvZmZzZXQsIDYpOyAvLyB0eXBlCisgICAgICAgIHJldHVybiBvZmZzZXQ7CisgICAgfQorICAgIHVucGFjaygpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBGaWVsZFQodGhpcy5uYW1lKCksICh0aGlzLnR5cGUoKSAhPT0gbnVsbCA/IHRoaXMudHlwZSgpLnVucGFjaygpIDogbnVsbCksIHRoaXMuaWQoKSwgdGhpcy5vZmZzZXQoKSwgdGhpcy5kZWZhdWx0SW50ZWdlcigpLCB0aGlzLmRlZmF1bHRSZWFsKCksIHRoaXMuZGVwcmVjYXRlZCgpLCB0aGlzLnJlcXVpcmVkKCksIHRoaXMua2V5KCksIHRoaXMuYmIuY3JlYXRlT2JqTGlzdCh0aGlzLmF0dHJpYnV0ZXMuYmluZCh0aGlzKSwgdGhpcy5hdHRyaWJ1dGVzTGVuZ3RoKCkpLCB0aGlzLmJiLmNyZWF0ZVNjYWxhckxpc3QodGhpcy5kb2N1bWVudGF0aW9uLmJpbmQodGhpcyksIHRoaXMuZG9jdW1lbnRhdGlvbkxlbmd0aCgpKSwgdGhpcy5vcHRpb25hbCgpLCB0aGlzLnBhZGRpbmcoKSk7CisgICAgfQorICAgIHVucGFja1RvKF9vKSB7CisgICAgICAgIF9vLm5hbWUgPSB0aGlzLm5hbWUoKTsKKyAgICAgICAgX28udHlwZSA9ICh0aGlzLnR5cGUoKSAhPT0gbnVsbCA/IHRoaXMudHlwZSgpLnVucGFjaygpIDogbnVsbCk7CisgICAgICAgIF9vLmlkID0gdGhpcy5pZCgpOworICAgICAgICBfby5vZmZzZXQgPSB0aGlzLm9mZnNldCgpOworICAgICAgICBfby5kZWZhdWx0SW50ZWdlciA9IHRoaXMuZGVmYXVsdEludGVnZXIoKTsKKyAgICAgICAgX28uZGVmYXVsdFJlYWwgPSB0aGlzLmRlZmF1bHRSZWFsKCk7CisgICAgICAgIF9vLmRlcHJlY2F0ZWQgPSB0aGlzLmRlcHJlY2F0ZWQoKTsKKyAgICAgICAgX28ucmVxdWlyZWQgPSB0aGlzLnJlcXVpcmVkKCk7CisgICAgICAgIF9vLmtleSA9IHRoaXMua2V5KCk7CisgICAgICAgIF9vLmF0dHJpYnV0ZXMgPSB0aGlzLmJiLmNyZWF0ZU9iakxpc3QodGhpcy5hdHRyaWJ1dGVzLmJpbmQodGhpcyksIHRoaXMuYXR0cmlidXRlc0xlbmd0aCgpKTsKKyAgICAgICAgX28uZG9jdW1lbnRhdGlvbiA9IHRoaXMuYmIuY3JlYXRlU2NhbGFyTGlzdCh0aGlzLmRvY3VtZW50YXRpb24uYmluZCh0aGlzKSwgdGhpcy5kb2N1bWVudGF0aW9uTGVuZ3RoKCkpOworICAgICAgICBfby5vcHRpb25hbCA9IHRoaXMub3B0aW9uYWwoKTsKKyAgICAgICAgX28ucGFkZGluZyA9IHRoaXMucGFkZGluZygpOworICAgIH0KK30KK2V4cG9ydCBjbGFzcyBGaWVsZFQgeworICAgIGNvbnN0cnVjdG9yKG5hbWUgPSBudWxsLCB0eXBlID0gbnVsbCwgaWQgPSAwLCBvZmZzZXQgPSAwLCBkZWZhdWx0SW50ZWdlciA9IEJpZ0ludCgnMCcpLCBkZWZhdWx0UmVhbCA9IDAuMCwgZGVwcmVjYXRlZCA9IGZhbHNlLCByZXF1aXJlZCA9IGZhbHNlLCBrZXkgPSBmYWxzZSwgYXR0cmlidXRlcyA9IFtdLCBkb2N1bWVudGF0aW9uID0gW10sIG9wdGlvbmFsID0gZmFsc2UsIHBhZGRpbmcgPSAwKSB7CisgICAgICAgIHRoaXMubmFtZSA9IG5hbWU7CisgICAgICAgIHRoaXMudHlwZSA9IHR5cGU7CisgICAgICAgIHRoaXMuaWQgPSBpZDsKKyAgICAgICAgdGhpcy5vZmZzZXQgPSBvZmZzZXQ7CisgICAgICAgIHRoaXMuZGVmYXVsdEludGVnZXIgPSBkZWZhdWx0SW50ZWdlcjsKKyAgICAgICAgdGhpcy5kZWZhdWx0UmVhbCA9IGRlZmF1bHRSZWFsOworICAgICAgICB0aGlzLmRlcHJlY2F0ZWQgPSBkZXByZWNhdGVkOworICAgICAgICB0aGlzLnJlcXVpcmVkID0gcmVxdWlyZWQ7CisgICAgICAgIHRoaXMua2V5ID0ga2V5OworICAgICAgICB0aGlzLmF0dHJpYnV0ZXMgPSBhdHRyaWJ1dGVzOworICAgICAgICB0aGlzLmRvY3VtZW50YXRpb24gPSBkb2N1bWVudGF0aW9uOworICAgICAgICB0aGlzLm9wdGlvbmFsID0gb3B0aW9uYWw7CisgICAgICAgIHRoaXMucGFkZGluZyA9IHBhZGRpbmc7CisgICAgfQorICAgIHBhY2soYnVpbGRlcikgeworICAgICAgICBjb25zdCBuYW1lID0gKHRoaXMubmFtZSAhPT0gbnVsbCA/IGJ1aWxkZXIuY3JlYXRlU3RyaW5nKHRoaXMubmFtZSkgOiAwKTsKKyAgICAgICAgY29uc3QgdHlwZSA9ICh0aGlzLnR5cGUgIT09IG51bGwgPyB0aGlzLnR5cGUucGFjayhidWlsZGVyKSA6IDApOworICAgICAgICBjb25zdCBhdHRyaWJ1dGVzID0gRmllbGQuY3JlYXRlQXR0cmlidXRlc1ZlY3RvcihidWlsZGVyLCBidWlsZGVyLmNyZWF0ZU9iamVjdE9mZnNldExpc3QodGhpcy5hdHRyaWJ1dGVzKSk7CisgICAgICAgIGNvbnN0IGRvY3VtZW50YXRpb24gPSBGaWVsZC5jcmVhdGVEb2N1bWVudGF0aW9uVmVjdG9yKGJ1aWxkZXIsIGJ1aWxkZXIuY3JlYXRlT2JqZWN0T2Zmc2V0TGlzdCh0aGlzLmRvY3VtZW50YXRpb24pKTsKKyAgICAgICAgRmllbGQuc3RhcnRGaWVsZChidWlsZGVyKTsKKyAgICAgICAgRmllbGQuYWRkTmFtZShidWlsZGVyLCBuYW1lKTsKKyAgICAgICAgRmllbGQuYWRkVHlwZShidWlsZGVyLCB0eXBlKTsKKyAgICAgICAgRmllbGQuYWRkSWQoYnVpbGRlciwgdGhpcy5pZCk7CisgICAgICAgIEZpZWxkLmFkZE9mZnNldChidWlsZGVyLCB0aGlzLm9mZnNldCk7CisgICAgICAgIEZpZWxkLmFkZERlZmF1bHRJbnRlZ2VyKGJ1aWxkZXIsIHRoaXMuZGVmYXVsdEludGVnZXIpOworICAgICAgICBGaWVsZC5hZGREZWZhdWx0UmVhbChidWlsZGVyLCB0aGlzLmRlZmF1bHRSZWFsKTsKKyAgICAgICAgRmllbGQuYWRkRGVwcmVjYXRlZChidWlsZGVyLCB0aGlzLmRlcHJlY2F0ZWQpOworICAgICAgICBGaWVsZC5hZGRSZXF1aXJlZChidWlsZGVyLCB0aGlzLnJlcXVpcmVkKTsKKyAgICAgICAgRmllbGQuYWRkS2V5KGJ1aWxkZXIsIHRoaXMua2V5KTsKKyAgICAgICAgRmllbGQuYWRkQXR0cmlidXRlcyhidWlsZGVyLCBhdHRyaWJ1dGVzKTsKKyAgICAgICAgRmllbGQuYWRkRG9jdW1lbnRhdGlvbihidWlsZGVyLCBkb2N1bWVudGF0aW9uKTsKKyAgICAgICAgRmllbGQuYWRkT3B0aW9uYWwoYnVpbGRlciwgdGhpcy5vcHRpb25hbCk7CisgICAgICAgIEZpZWxkLmFkZFBhZGRpbmcoYnVpbGRlciwgdGhpcy5wYWRkaW5nKTsKKyAgICAgICAgcmV0dXJuIEZpZWxkLmVuZEZpZWxkKGJ1aWxkZXIpOworICAgIH0KK30KK2V4cG9ydCBjbGFzcyBPYmplY3RfIHsKKyAgICBjb25zdHJ1Y3RvcigpIHsKKyAgICAgICAgdGhpcy5iYiA9IG51bGw7CisgICAgICAgIHRoaXMuYmJfcG9zID0gMDsKKyAgICB9CisgICAgX19pbml0KGksIGJiKSB7CisgICAgICAgIHRoaXMuYmJfcG9zID0gaTsKKyAgICAgICAgdGhpcy5iYiA9IGJiOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisgICAgc3RhdGljIGdldFJvb3RBc09iamVjdChiYiwgb2JqKSB7CisgICAgICAgIHJldHVybiAob2JqIHx8IG5ldyBPYmplY3RfKCkpLl9faW5pdChiYi5yZWFkSW50MzIoYmIucG9zaXRpb24oKSkgKyBiYi5wb3NpdGlvbigpLCBiYik7CisgICAgfQorICAgIHN0YXRpYyBnZXRTaXplUHJlZml4ZWRSb290QXNPYmplY3QoYmIsIG9iaikgeworICAgICAgICBiYi5zZXRQb3NpdGlvbihiYi5wb3NpdGlvbigpICsgZmxhdGJ1ZmZlcnMuU0laRV9QUkVGSVhfTEVOR1RIKTsKKyAgICAgICAgcmV0dXJuIChvYmogfHwgbmV3IE9iamVjdF8oKSkuX19pbml0KGJiLnJlYWRJbnQzMihiYi5wb3NpdGlvbigpKSArIGJiLnBvc2l0aW9uKCksIGJiKTsKKyAgICB9CisgICAgbmFtZShvcHRpb25hbEVuY29kaW5nKSB7CisgICAgICAgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsIDQpOworICAgICAgICByZXR1cm4gb2Zmc2V0ID8gdGhpcy5iYi5fX3N0cmluZyh0aGlzLmJiX3BvcyArIG9mZnNldCwgb3B0aW9uYWxFbmNvZGluZykgOiBudWxsOworICAgIH0KKyAgICBmaWVsZHMoaW5kZXgsIG9iaikgeworICAgICAgICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCA2KTsKKyAgICAgICAgcmV0dXJuIG9mZnNldCA/IChvYmogfHwgbmV3IEZpZWxkKCkpLl9faW5pdCh0aGlzLmJiLl9faW5kaXJlY3QodGhpcy5iYi5fX3ZlY3Rvcih0aGlzLmJiX3BvcyArIG9mZnNldCkgKyBpbmRleCAqIDQpLCB0aGlzLmJiKSA6IG51bGw7CisgICAgfQorICAgIGZpZWxkc0xlbmd0aCgpIHsKKyAgICAgICAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywgNik7CisgICAgICAgIHJldHVybiBvZmZzZXQgPyB0aGlzLmJiLl9fdmVjdG9yX2xlbih0aGlzLmJiX3BvcyArIG9mZnNldCkgOiAwOworICAgIH0KKyAgICBpc1N0cnVjdCgpIHsKKyAgICAgICAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywgOCk7CisgICAgICAgIHJldHVybiBvZmZzZXQgPyAhIXRoaXMuYmIucmVhZEludDgodGhpcy5iYl9wb3MgKyBvZmZzZXQpIDogZmFsc2U7CisgICAgfQorICAgIG11dGF0ZV9pc19zdHJ1Y3QodmFsdWUpIHsKKyAgICAgICAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywgOCk7CisgICAgICAgIGlmIChvZmZzZXQgPT09IDApIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICB0aGlzLmJiLndyaXRlSW50OCh0aGlzLmJiX3BvcyArIG9mZnNldCwgK3ZhbHVlKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIG1pbmFsaWduKCkgeworICAgICAgICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCAxMCk7CisgICAgICAgIHJldHVybiBvZmZzZXQgPyB0aGlzLmJiLnJlYWRJbnQzMih0aGlzLmJiX3BvcyArIG9mZnNldCkgOiAwOworICAgIH0KKyAgICBtdXRhdGVfbWluYWxpZ24odmFsdWUpIHsKKyAgICAgICAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywgMTApOworICAgICAgICBpZiAob2Zmc2V0ID09PSAwKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgdGhpcy5iYi53cml0ZUludDMyKHRoaXMuYmJfcG9zICsgb2Zmc2V0LCB2YWx1ZSk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICBieXRlc2l6ZSgpIHsKKyAgICAgICAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywgMTIpOworICAgICAgICByZXR1cm4gb2Zmc2V0ID8gdGhpcy5iYi5yZWFkSW50MzIodGhpcy5iYl9wb3MgKyBvZmZzZXQpIDogMDsKKyAgICB9CisgICAgbXV0YXRlX2J5dGVzaXplKHZhbHVlKSB7CisgICAgICAgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsIDEyKTsKKyAgICAgICAgaWYgKG9mZnNldCA9PT0gMCkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIHRoaXMuYmIud3JpdGVJbnQzMih0aGlzLmJiX3BvcyArIG9mZnNldCwgdmFsdWUpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgYXR0cmlidXRlcyhpbmRleCwgb2JqKSB7CisgICAgICAgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsIDE0KTsKKyAgICAgICAgcmV0dXJuIG9mZnNldCA/IChvYmogfHwgbmV3IEtleVZhbHVlKCkpLl9faW5pdCh0aGlzLmJiLl9faW5kaXJlY3QodGhpcy5iYi5fX3ZlY3Rvcih0aGlzLmJiX3BvcyArIG9mZnNldCkgKyBpbmRleCAqIDQpLCB0aGlzLmJiKSA6IG51bGw7CisgICAgfQorICAgIGF0dHJpYnV0ZXNMZW5ndGgoKSB7CisgICAgICAgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsIDE0KTsKKyAgICAgICAgcmV0dXJuIG9mZnNldCA/IHRoaXMuYmIuX192ZWN0b3JfbGVuKHRoaXMuYmJfcG9zICsgb2Zmc2V0KSA6IDA7CisgICAgfQorICAgIGRvY3VtZW50YXRpb24oaW5kZXgsIG9wdGlvbmFsRW5jb2RpbmcpIHsKKyAgICAgICAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywgMTYpOworICAgICAgICByZXR1cm4gb2Zmc2V0ID8gdGhpcy5iYi5fX3N0cmluZyh0aGlzLmJiLl9fdmVjdG9yKHRoaXMuYmJfcG9zICsgb2Zmc2V0KSArIGluZGV4ICogNCwgb3B0aW9uYWxFbmNvZGluZykgOiBudWxsOworICAgIH0KKyAgICBkb2N1bWVudGF0aW9uTGVuZ3RoKCkgeworICAgICAgICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCAxNik7CisgICAgICAgIHJldHVybiBvZmZzZXQgPyB0aGlzLmJiLl9fdmVjdG9yX2xlbih0aGlzLmJiX3BvcyArIG9mZnNldCkgOiAwOworICAgIH0KKyAgICBkZWNsYXJhdGlvbkZpbGUob3B0aW9uYWxFbmNvZGluZykgeworICAgICAgICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCAxOCk7CisgICAgICAgIHJldHVybiBvZmZzZXQgPyB0aGlzLmJiLl9fc3RyaW5nKHRoaXMuYmJfcG9zICsgb2Zmc2V0LCBvcHRpb25hbEVuY29kaW5nKSA6IG51bGw7CisgICAgfQorICAgIHN0YXRpYyBnZXRGdWxseVF1YWxpZmllZE5hbWUoKSB7CisgICAgICAgIHJldHVybiAncmVmbGVjdGlvbl9PYmplY3QnOworICAgIH0KKyAgICBzdGF0aWMgc3RhcnRPYmplY3QoYnVpbGRlcikgeworICAgICAgICBidWlsZGVyLnN0YXJ0T2JqZWN0KDgpOworICAgIH0KKyAgICBzdGF0aWMgYWRkTmFtZShidWlsZGVyLCBuYW1lT2Zmc2V0KSB7CisgICAgICAgIGJ1aWxkZXIuYWRkRmllbGRPZmZzZXQoMCwgbmFtZU9mZnNldCwgMCk7CisgICAgfQorICAgIHN0YXRpYyBhZGRGaWVsZHMoYnVpbGRlciwgZmllbGRzT2Zmc2V0KSB7CisgICAgICAgIGJ1aWxkZXIuYWRkRmllbGRPZmZzZXQoMSwgZmllbGRzT2Zmc2V0LCAwKTsKKyAgICB9CisgICAgc3RhdGljIGNyZWF0ZUZpZWxkc1ZlY3RvcihidWlsZGVyLCBkYXRhKSB7CisgICAgICAgIGJ1aWxkZXIuc3RhcnRWZWN0b3IoNCwgZGF0YS5sZW5ndGgsIDQpOworICAgICAgICBmb3IgKGxldCBpID0gZGF0YS5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgeworICAgICAgICAgICAgYnVpbGRlci5hZGRPZmZzZXQoZGF0YVtpXSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGJ1aWxkZXIuZW5kVmVjdG9yKCk7CisgICAgfQorICAgIHN0YXRpYyBzdGFydEZpZWxkc1ZlY3RvcihidWlsZGVyLCBudW1FbGVtcykgeworICAgICAgICBidWlsZGVyLnN0YXJ0VmVjdG9yKDQsIG51bUVsZW1zLCA0KTsKKyAgICB9CisgICAgc3RhdGljIGFkZElzU3RydWN0KGJ1aWxkZXIsIGlzU3RydWN0KSB7CisgICAgICAgIGJ1aWxkZXIuYWRkRmllbGRJbnQ4KDIsICtpc1N0cnVjdCwgK2ZhbHNlKTsKKyAgICB9CisgICAgc3RhdGljIGFkZE1pbmFsaWduKGJ1aWxkZXIsIG1pbmFsaWduKSB7CisgICAgICAgIGJ1aWxkZXIuYWRkRmllbGRJbnQzMigzLCBtaW5hbGlnbiwgMCk7CisgICAgfQorICAgIHN0YXRpYyBhZGRCeXRlc2l6ZShidWlsZGVyLCBieXRlc2l6ZSkgeworICAgICAgICBidWlsZGVyLmFkZEZpZWxkSW50MzIoNCwgYnl0ZXNpemUsIDApOworICAgIH0KKyAgICBzdGF0aWMgYWRkQXR0cmlidXRlcyhidWlsZGVyLCBhdHRyaWJ1dGVzT2Zmc2V0KSB7CisgICAgICAgIGJ1aWxkZXIuYWRkRmllbGRPZmZzZXQoNSwgYXR0cmlidXRlc09mZnNldCwgMCk7CisgICAgfQorICAgIHN0YXRpYyBjcmVhdGVBdHRyaWJ1dGVzVmVjdG9yKGJ1aWxkZXIsIGRhdGEpIHsKKyAgICAgICAgYnVpbGRlci5zdGFydFZlY3Rvcig0LCBkYXRhLmxlbmd0aCwgNCk7CisgICAgICAgIGZvciAobGV0IGkgPSBkYXRhLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7CisgICAgICAgICAgICBidWlsZGVyLmFkZE9mZnNldChkYXRhW2ldKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gYnVpbGRlci5lbmRWZWN0b3IoKTsKKyAgICB9CisgICAgc3RhdGljIHN0YXJ0QXR0cmlidXRlc1ZlY3RvcihidWlsZGVyLCBudW1FbGVtcykgeworICAgICAgICBidWlsZGVyLnN0YXJ0VmVjdG9yKDQsIG51bUVsZW1zLCA0KTsKKyAgICB9CisgICAgc3RhdGljIGFkZERvY3VtZW50YXRpb24oYnVpbGRlciwgZG9jdW1lbnRhdGlvbk9mZnNldCkgeworICAgICAgICBidWlsZGVyLmFkZEZpZWxkT2Zmc2V0KDYsIGRvY3VtZW50YXRpb25PZmZzZXQsIDApOworICAgIH0KKyAgICBzdGF0aWMgY3JlYXRlRG9jdW1lbnRhdGlvblZlY3RvcihidWlsZGVyLCBkYXRhKSB7CisgICAgICAgIGJ1aWxkZXIuc3RhcnRWZWN0b3IoNCwgZGF0YS5sZW5ndGgsIDQpOworICAgICAgICBmb3IgKGxldCBpID0gZGF0YS5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgeworICAgICAgICAgICAgYnVpbGRlci5hZGRPZmZzZXQoZGF0YVtpXSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGJ1aWxkZXIuZW5kVmVjdG9yKCk7CisgICAgfQorICAgIHN0YXRpYyBzdGFydERvY3VtZW50YXRpb25WZWN0b3IoYnVpbGRlciwgbnVtRWxlbXMpIHsKKyAgICAgICAgYnVpbGRlci5zdGFydFZlY3Rvcig0LCBudW1FbGVtcywgNCk7CisgICAgfQorICAgIHN0YXRpYyBhZGREZWNsYXJhdGlvbkZpbGUoYnVpbGRlciwgZGVjbGFyYXRpb25GaWxlT2Zmc2V0KSB7CisgICAgICAgIGJ1aWxkZXIuYWRkRmllbGRPZmZzZXQoNywgZGVjbGFyYXRpb25GaWxlT2Zmc2V0LCAwKTsKKyAgICB9CisgICAgc3RhdGljIGVuZE9iamVjdChidWlsZGVyKSB7CisgICAgICAgIGNvbnN0IG9mZnNldCA9IGJ1aWxkZXIuZW5kT2JqZWN0KCk7CisgICAgICAgIGJ1aWxkZXIucmVxdWlyZWRGaWVsZChvZmZzZXQsIDQpOyAvLyBuYW1lCisgICAgICAgIGJ1aWxkZXIucmVxdWlyZWRGaWVsZChvZmZzZXQsIDYpOyAvLyBmaWVsZHMKKyAgICAgICAgcmV0dXJuIG9mZnNldDsKKyAgICB9CisgICAgc3RhdGljIGNyZWF0ZU9iamVjdChidWlsZGVyLCBuYW1lT2Zmc2V0LCBmaWVsZHNPZmZzZXQsIGlzU3RydWN0LCBtaW5hbGlnbiwgYnl0ZXNpemUsIGF0dHJpYnV0ZXNPZmZzZXQsIGRvY3VtZW50YXRpb25PZmZzZXQsIGRlY2xhcmF0aW9uRmlsZU9mZnNldCkgeworICAgICAgICBPYmplY3RfLnN0YXJ0T2JqZWN0KGJ1aWxkZXIpOworICAgICAgICBPYmplY3RfLmFkZE5hbWUoYnVpbGRlciwgbmFtZU9mZnNldCk7CisgICAgICAgIE9iamVjdF8uYWRkRmllbGRzKGJ1aWxkZXIsIGZpZWxkc09mZnNldCk7CisgICAgICAgIE9iamVjdF8uYWRkSXNTdHJ1Y3QoYnVpbGRlciwgaXNTdHJ1Y3QpOworICAgICAgICBPYmplY3RfLmFkZE1pbmFsaWduKGJ1aWxkZXIsIG1pbmFsaWduKTsKKyAgICAgICAgT2JqZWN0Xy5hZGRCeXRlc2l6ZShidWlsZGVyLCBieXRlc2l6ZSk7CisgICAgICAgIE9iamVjdF8uYWRkQXR0cmlidXRlcyhidWlsZGVyLCBhdHRyaWJ1dGVzT2Zmc2V0KTsKKyAgICAgICAgT2JqZWN0Xy5hZGREb2N1bWVudGF0aW9uKGJ1aWxkZXIsIGRvY3VtZW50YXRpb25PZmZzZXQpOworICAgICAgICBPYmplY3RfLmFkZERlY2xhcmF0aW9uRmlsZShidWlsZGVyLCBkZWNsYXJhdGlvbkZpbGVPZmZzZXQpOworICAgICAgICByZXR1cm4gT2JqZWN0Xy5lbmRPYmplY3QoYnVpbGRlcik7CisgICAgfQorICAgIHVucGFjaygpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBPYmplY3RfVCh0aGlzLm5hbWUoKSwgdGhpcy5iYi5jcmVhdGVPYmpMaXN0KHRoaXMuZmllbGRzLmJpbmQodGhpcyksIHRoaXMuZmllbGRzTGVuZ3RoKCkpLCB0aGlzLmlzU3RydWN0KCksIHRoaXMubWluYWxpZ24oKSwgdGhpcy5ieXRlc2l6ZSgpLCB0aGlzLmJiLmNyZWF0ZU9iakxpc3QodGhpcy5hdHRyaWJ1dGVzLmJpbmQodGhpcyksIHRoaXMuYXR0cmlidXRlc0xlbmd0aCgpKSwgdGhpcy5iYi5jcmVhdGVTY2FsYXJMaXN0KHRoaXMuZG9jdW1lbnRhdGlvbi5iaW5kKHRoaXMpLCB0aGlzLmRvY3VtZW50YXRpb25MZW5ndGgoKSksIHRoaXMuZGVjbGFyYXRpb25GaWxlKCkpOworICAgIH0KKyAgICB1bnBhY2tUbyhfbykgeworICAgICAgICBfby5uYW1lID0gdGhpcy5uYW1lKCk7CisgICAgICAgIF9vLmZpZWxkcyA9IHRoaXMuYmIuY3JlYXRlT2JqTGlzdCh0aGlzLmZpZWxkcy5iaW5kKHRoaXMpLCB0aGlzLmZpZWxkc0xlbmd0aCgpKTsKKyAgICAgICAgX28uaXNTdHJ1Y3QgPSB0aGlzLmlzU3RydWN0KCk7CisgICAgICAgIF9vLm1pbmFsaWduID0gdGhpcy5taW5hbGlnbigpOworICAgICAgICBfby5ieXRlc2l6ZSA9IHRoaXMuYnl0ZXNpemUoKTsKKyAgICAgICAgX28uYXR0cmlidXRlcyA9IHRoaXMuYmIuY3JlYXRlT2JqTGlzdCh0aGlzLmF0dHJpYnV0ZXMuYmluZCh0aGlzKSwgdGhpcy5hdHRyaWJ1dGVzTGVuZ3RoKCkpOworICAgICAgICBfby5kb2N1bWVudGF0aW9uID0gdGhpcy5iYi5jcmVhdGVTY2FsYXJMaXN0KHRoaXMuZG9jdW1lbnRhdGlvbi5iaW5kKHRoaXMpLCB0aGlzLmRvY3VtZW50YXRpb25MZW5ndGgoKSk7CisgICAgICAgIF9vLmRlY2xhcmF0aW9uRmlsZSA9IHRoaXMuZGVjbGFyYXRpb25GaWxlKCk7CisgICAgfQorfQorZXhwb3J0IGNsYXNzIE9iamVjdF9UIHsKKyAgICBjb25zdHJ1Y3RvcihuYW1lID0gbnVsbCwgZmllbGRzID0gW10sIGlzU3RydWN0ID0gZmFsc2UsIG1pbmFsaWduID0gMCwgYnl0ZXNpemUgPSAwLCBhdHRyaWJ1dGVzID0gW10sIGRvY3VtZW50YXRpb24gPSBbXSwgZGVjbGFyYXRpb25GaWxlID0gbnVsbCkgeworICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOworICAgICAgICB0aGlzLmZpZWxkcyA9IGZpZWxkczsKKyAgICAgICAgdGhpcy5pc1N0cnVjdCA9IGlzU3RydWN0OworICAgICAgICB0aGlzLm1pbmFsaWduID0gbWluYWxpZ247CisgICAgICAgIHRoaXMuYnl0ZXNpemUgPSBieXRlc2l6ZTsKKyAgICAgICAgdGhpcy5hdHRyaWJ1dGVzID0gYXR0cmlidXRlczsKKyAgICAgICAgdGhpcy5kb2N1bWVudGF0aW9uID0gZG9jdW1lbnRhdGlvbjsKKyAgICAgICAgdGhpcy5kZWNsYXJhdGlvbkZpbGUgPSBkZWNsYXJhdGlvbkZpbGU7CisgICAgfQorICAgIHBhY2soYnVpbGRlcikgeworICAgICAgICBjb25zdCBuYW1lID0gKHRoaXMubmFtZSAhPT0gbnVsbCA/IGJ1aWxkZXIuY3JlYXRlU3RyaW5nKHRoaXMubmFtZSkgOiAwKTsKKyAgICAgICAgY29uc3QgZmllbGRzID0gT2JqZWN0Xy5jcmVhdGVGaWVsZHNWZWN0b3IoYnVpbGRlciwgYnVpbGRlci5jcmVhdGVPYmplY3RPZmZzZXRMaXN0KHRoaXMuZmllbGRzKSk7CisgICAgICAgIGNvbnN0IGF0dHJpYnV0ZXMgPSBPYmplY3RfLmNyZWF0ZUF0dHJpYnV0ZXNWZWN0b3IoYnVpbGRlciwgYnVpbGRlci5jcmVhdGVPYmplY3RPZmZzZXRMaXN0KHRoaXMuYXR0cmlidXRlcykpOworICAgICAgICBjb25zdCBkb2N1bWVudGF0aW9uID0gT2JqZWN0Xy5jcmVhdGVEb2N1bWVudGF0aW9uVmVjdG9yKGJ1aWxkZXIsIGJ1aWxkZXIuY3JlYXRlT2JqZWN0T2Zmc2V0TGlzdCh0aGlzLmRvY3VtZW50YXRpb24pKTsKKyAgICAgICAgY29uc3QgZGVjbGFyYXRpb25GaWxlID0gKHRoaXMuZGVjbGFyYXRpb25GaWxlICE9PSBudWxsID8gYnVpbGRlci5jcmVhdGVTdHJpbmcodGhpcy5kZWNsYXJhdGlvbkZpbGUpIDogMCk7CisgICAgICAgIHJldHVybiBPYmplY3RfLmNyZWF0ZU9iamVjdChidWlsZGVyLCBuYW1lLCBmaWVsZHMsIHRoaXMuaXNTdHJ1Y3QsIHRoaXMubWluYWxpZ24sIHRoaXMuYnl0ZXNpemUsIGF0dHJpYnV0ZXMsIGRvY3VtZW50YXRpb24sIGRlY2xhcmF0aW9uRmlsZSk7CisgICAgfQorfQorZXhwb3J0IGNsYXNzIFJQQ0NhbGwgeworICAgIGNvbnN0cnVjdG9yKCkgeworICAgICAgICB0aGlzLmJiID0gbnVsbDsKKyAgICAgICAgdGhpcy5iYl9wb3MgPSAwOworICAgIH0KKyAgICBfX2luaXQoaSwgYmIpIHsKKyAgICAgICAgdGhpcy5iYl9wb3MgPSBpOworICAgICAgICB0aGlzLmJiID0gYmI7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKyAgICBzdGF0aWMgZ2V0Um9vdEFzUlBDQ2FsbChiYiwgb2JqKSB7CisgICAgICAgIHJldHVybiAob2JqIHx8IG5ldyBSUENDYWxsKCkpLl9faW5pdChiYi5yZWFkSW50MzIoYmIucG9zaXRpb24oKSkgKyBiYi5wb3NpdGlvbigpLCBiYik7CisgICAgfQorICAgIHN0YXRpYyBnZXRTaXplUHJlZml4ZWRSb290QXNSUENDYWxsKGJiLCBvYmopIHsKKyAgICAgICAgYmIuc2V0UG9zaXRpb24oYmIucG9zaXRpb24oKSArIGZsYXRidWZmZXJzLlNJWkVfUFJFRklYX0xFTkdUSCk7CisgICAgICAgIHJldHVybiAob2JqIHx8IG5ldyBSUENDYWxsKCkpLl9faW5pdChiYi5yZWFkSW50MzIoYmIucG9zaXRpb24oKSkgKyBiYi5wb3NpdGlvbigpLCBiYik7CisgICAgfQorICAgIG5hbWUob3B0aW9uYWxFbmNvZGluZykgeworICAgICAgICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCA0KTsKKyAgICAgICAgcmV0dXJuIG9mZnNldCA/IHRoaXMuYmIuX19zdHJpbmcodGhpcy5iYl9wb3MgKyBvZmZzZXQsIG9wdGlvbmFsRW5jb2RpbmcpIDogbnVsbDsKKyAgICB9CisgICAgcmVxdWVzdChvYmopIHsKKyAgICAgICAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywgNik7CisgICAgICAgIHJldHVybiBvZmZzZXQgPyAob2JqIHx8IG5ldyBPYmplY3RfKCkpLl9faW5pdCh0aGlzLmJiLl9faW5kaXJlY3QodGhpcy5iYl9wb3MgKyBvZmZzZXQpLCB0aGlzLmJiKSA6IG51bGw7CisgICAgfQorICAgIHJlc3BvbnNlKG9iaikgeworICAgICAgICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCA4KTsKKyAgICAgICAgcmV0dXJuIG9mZnNldCA/IChvYmogfHwgbmV3IE9iamVjdF8oKSkuX19pbml0KHRoaXMuYmIuX19pbmRpcmVjdCh0aGlzLmJiX3BvcyArIG9mZnNldCksIHRoaXMuYmIpIDogbnVsbDsKKyAgICB9CisgICAgYXR0cmlidXRlcyhpbmRleCwgb2JqKSB7CisgICAgICAgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsIDEwKTsKKyAgICAgICAgcmV0dXJuIG9mZnNldCA/IChvYmogfHwgbmV3IEtleVZhbHVlKCkpLl9faW5pdCh0aGlzLmJiLl9faW5kaXJlY3QodGhpcy5iYi5fX3ZlY3Rvcih0aGlzLmJiX3BvcyArIG9mZnNldCkgKyBpbmRleCAqIDQpLCB0aGlzLmJiKSA6IG51bGw7CisgICAgfQorICAgIGF0dHJpYnV0ZXNMZW5ndGgoKSB7CisgICAgICAgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsIDEwKTsKKyAgICAgICAgcmV0dXJuIG9mZnNldCA/IHRoaXMuYmIuX192ZWN0b3JfbGVuKHRoaXMuYmJfcG9zICsgb2Zmc2V0KSA6IDA7CisgICAgfQorICAgIGRvY3VtZW50YXRpb24oaW5kZXgsIG9wdGlvbmFsRW5jb2RpbmcpIHsKKyAgICAgICAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywgMTIpOworICAgICAgICByZXR1cm4gb2Zmc2V0ID8gdGhpcy5iYi5fX3N0cmluZyh0aGlzLmJiLl9fdmVjdG9yKHRoaXMuYmJfcG9zICsgb2Zmc2V0KSArIGluZGV4ICogNCwgb3B0aW9uYWxFbmNvZGluZykgOiBudWxsOworICAgIH0KKyAgICBkb2N1bWVudGF0aW9uTGVuZ3RoKCkgeworICAgICAgICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCAxMik7CisgICAgICAgIHJldHVybiBvZmZzZXQgPyB0aGlzLmJiLl9fdmVjdG9yX2xlbih0aGlzLmJiX3BvcyArIG9mZnNldCkgOiAwOworICAgIH0KKyAgICBzdGF0aWMgZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCkgeworICAgICAgICByZXR1cm4gJ3JlZmxlY3Rpb25fUlBDQ2FsbCc7CisgICAgfQorICAgIHN0YXRpYyBzdGFydFJQQ0NhbGwoYnVpbGRlcikgeworICAgICAgICBidWlsZGVyLnN0YXJ0T2JqZWN0KDUpOworICAgIH0KKyAgICBzdGF0aWMgYWRkTmFtZShidWlsZGVyLCBuYW1lT2Zmc2V0KSB7CisgICAgICAgIGJ1aWxkZXIuYWRkRmllbGRPZmZzZXQoMCwgbmFtZU9mZnNldCwgMCk7CisgICAgfQorICAgIHN0YXRpYyBhZGRSZXF1ZXN0KGJ1aWxkZXIsIHJlcXVlc3RPZmZzZXQpIHsKKyAgICAgICAgYnVpbGRlci5hZGRGaWVsZE9mZnNldCgxLCByZXF1ZXN0T2Zmc2V0LCAwKTsKKyAgICB9CisgICAgc3RhdGljIGFkZFJlc3BvbnNlKGJ1aWxkZXIsIHJlc3BvbnNlT2Zmc2V0KSB7CisgICAgICAgIGJ1aWxkZXIuYWRkRmllbGRPZmZzZXQoMiwgcmVzcG9uc2VPZmZzZXQsIDApOworICAgIH0KKyAgICBzdGF0aWMgYWRkQXR0cmlidXRlcyhidWlsZGVyLCBhdHRyaWJ1dGVzT2Zmc2V0KSB7CisgICAgICAgIGJ1aWxkZXIuYWRkRmllbGRPZmZzZXQoMywgYXR0cmlidXRlc09mZnNldCwgMCk7CisgICAgfQorICAgIHN0YXRpYyBjcmVhdGVBdHRyaWJ1dGVzVmVjdG9yKGJ1aWxkZXIsIGRhdGEpIHsKKyAgICAgICAgYnVpbGRlci5zdGFydFZlY3Rvcig0LCBkYXRhLmxlbmd0aCwgNCk7CisgICAgICAgIGZvciAobGV0IGkgPSBkYXRhLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7CisgICAgICAgICAgICBidWlsZGVyLmFkZE9mZnNldChkYXRhW2ldKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gYnVpbGRlci5lbmRWZWN0b3IoKTsKKyAgICB9CisgICAgc3RhdGljIHN0YXJ0QXR0cmlidXRlc1ZlY3RvcihidWlsZGVyLCBudW1FbGVtcykgeworICAgICAgICBidWlsZGVyLnN0YXJ0VmVjdG9yKDQsIG51bUVsZW1zLCA0KTsKKyAgICB9CisgICAgc3RhdGljIGFkZERvY3VtZW50YXRpb24oYnVpbGRlciwgZG9jdW1lbnRhdGlvbk9mZnNldCkgeworICAgICAgICBidWlsZGVyLmFkZEZpZWxkT2Zmc2V0KDQsIGRvY3VtZW50YXRpb25PZmZzZXQsIDApOworICAgIH0KKyAgICBzdGF0aWMgY3JlYXRlRG9jdW1lbnRhdGlvblZlY3RvcihidWlsZGVyLCBkYXRhKSB7CisgICAgICAgIGJ1aWxkZXIuc3RhcnRWZWN0b3IoNCwgZGF0YS5sZW5ndGgsIDQpOworICAgICAgICBmb3IgKGxldCBpID0gZGF0YS5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgeworICAgICAgICAgICAgYnVpbGRlci5hZGRPZmZzZXQoZGF0YVtpXSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGJ1aWxkZXIuZW5kVmVjdG9yKCk7CisgICAgfQorICAgIHN0YXRpYyBzdGFydERvY3VtZW50YXRpb25WZWN0b3IoYnVpbGRlciwgbnVtRWxlbXMpIHsKKyAgICAgICAgYnVpbGRlci5zdGFydFZlY3Rvcig0LCBudW1FbGVtcywgNCk7CisgICAgfQorICAgIHN0YXRpYyBlbmRSUENDYWxsKGJ1aWxkZXIpIHsKKyAgICAgICAgY29uc3Qgb2Zmc2V0ID0gYnVpbGRlci5lbmRPYmplY3QoKTsKKyAgICAgICAgYnVpbGRlci5yZXF1aXJlZEZpZWxkKG9mZnNldCwgNCk7IC8vIG5hbWUKKyAgICAgICAgYnVpbGRlci5yZXF1aXJlZEZpZWxkKG9mZnNldCwgNik7IC8vIHJlcXVlc3QKKyAgICAgICAgYnVpbGRlci5yZXF1aXJlZEZpZWxkKG9mZnNldCwgOCk7IC8vIHJlc3BvbnNlCisgICAgICAgIHJldHVybiBvZmZzZXQ7CisgICAgfQorICAgIHVucGFjaygpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBSUENDYWxsVCh0aGlzLm5hbWUoKSwgKHRoaXMucmVxdWVzdCgpICE9PSBudWxsID8gdGhpcy5yZXF1ZXN0KCkudW5wYWNrKCkgOiBudWxsKSwgKHRoaXMucmVzcG9uc2UoKSAhPT0gbnVsbCA/IHRoaXMucmVzcG9uc2UoKS51bnBhY2soKSA6IG51bGwpLCB0aGlzLmJiLmNyZWF0ZU9iakxpc3QodGhpcy5hdHRyaWJ1dGVzLmJpbmQodGhpcyksIHRoaXMuYXR0cmlidXRlc0xlbmd0aCgpKSwgdGhpcy5iYi5jcmVhdGVTY2FsYXJMaXN0KHRoaXMuZG9jdW1lbnRhdGlvbi5iaW5kKHRoaXMpLCB0aGlzLmRvY3VtZW50YXRpb25MZW5ndGgoKSkpOworICAgIH0KKyAgICB1bnBhY2tUbyhfbykgeworICAgICAgICBfby5uYW1lID0gdGhpcy5uYW1lKCk7CisgICAgICAgIF9vLnJlcXVlc3QgPSAodGhpcy5yZXF1ZXN0KCkgIT09IG51bGwgPyB0aGlzLnJlcXVlc3QoKS51bnBhY2soKSA6IG51bGwpOworICAgICAgICBfby5yZXNwb25zZSA9ICh0aGlzLnJlc3BvbnNlKCkgIT09IG51bGwgPyB0aGlzLnJlc3BvbnNlKCkudW5wYWNrKCkgOiBudWxsKTsKKyAgICAgICAgX28uYXR0cmlidXRlcyA9IHRoaXMuYmIuY3JlYXRlT2JqTGlzdCh0aGlzLmF0dHJpYnV0ZXMuYmluZCh0aGlzKSwgdGhpcy5hdHRyaWJ1dGVzTGVuZ3RoKCkpOworICAgICAgICBfby5kb2N1bWVudGF0aW9uID0gdGhpcy5iYi5jcmVhdGVTY2FsYXJMaXN0KHRoaXMuZG9jdW1lbnRhdGlvbi5iaW5kKHRoaXMpLCB0aGlzLmRvY3VtZW50YXRpb25MZW5ndGgoKSk7CisgICAgfQorfQorZXhwb3J0IGNsYXNzIFJQQ0NhbGxUIHsKKyAgICBjb25zdHJ1Y3RvcihuYW1lID0gbnVsbCwgcmVxdWVzdCA9IG51bGwsIHJlc3BvbnNlID0gbnVsbCwgYXR0cmlidXRlcyA9IFtdLCBkb2N1bWVudGF0aW9uID0gW10pIHsKKyAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKKyAgICAgICAgdGhpcy5yZXF1ZXN0ID0gcmVxdWVzdDsKKyAgICAgICAgdGhpcy5yZXNwb25zZSA9IHJlc3BvbnNlOworICAgICAgICB0aGlzLmF0dHJpYnV0ZXMgPSBhdHRyaWJ1dGVzOworICAgICAgICB0aGlzLmRvY3VtZW50YXRpb24gPSBkb2N1bWVudGF0aW9uOworICAgIH0KKyAgICBwYWNrKGJ1aWxkZXIpIHsKKyAgICAgICAgY29uc3QgbmFtZSA9ICh0aGlzLm5hbWUgIT09IG51bGwgPyBidWlsZGVyLmNyZWF0ZVN0cmluZyh0aGlzLm5hbWUpIDogMCk7CisgICAgICAgIGNvbnN0IHJlcXVlc3QgPSAodGhpcy5yZXF1ZXN0ICE9PSBudWxsID8gdGhpcy5yZXF1ZXN0LnBhY2soYnVpbGRlcikgOiAwKTsKKyAgICAgICAgY29uc3QgcmVzcG9uc2UgPSAodGhpcy5yZXNwb25zZSAhPT0gbnVsbCA/IHRoaXMucmVzcG9uc2UucGFjayhidWlsZGVyKSA6IDApOworICAgICAgICBjb25zdCBhdHRyaWJ1dGVzID0gUlBDQ2FsbC5jcmVhdGVBdHRyaWJ1dGVzVmVjdG9yKGJ1aWxkZXIsIGJ1aWxkZXIuY3JlYXRlT2JqZWN0T2Zmc2V0TGlzdCh0aGlzLmF0dHJpYnV0ZXMpKTsKKyAgICAgICAgY29uc3QgZG9jdW1lbnRhdGlvbiA9IFJQQ0NhbGwuY3JlYXRlRG9jdW1lbnRhdGlvblZlY3RvcihidWlsZGVyLCBidWlsZGVyLmNyZWF0ZU9iamVjdE9mZnNldExpc3QodGhpcy5kb2N1bWVudGF0aW9uKSk7CisgICAgICAgIFJQQ0NhbGwuc3RhcnRSUENDYWxsKGJ1aWxkZXIpOworICAgICAgICBSUENDYWxsLmFkZE5hbWUoYnVpbGRlciwgbmFtZSk7CisgICAgICAgIFJQQ0NhbGwuYWRkUmVxdWVzdChidWlsZGVyLCByZXF1ZXN0KTsKKyAgICAgICAgUlBDQ2FsbC5hZGRSZXNwb25zZShidWlsZGVyLCByZXNwb25zZSk7CisgICAgICAgIFJQQ0NhbGwuYWRkQXR0cmlidXRlcyhidWlsZGVyLCBhdHRyaWJ1dGVzKTsKKyAgICAgICAgUlBDQ2FsbC5hZGREb2N1bWVudGF0aW9uKGJ1aWxkZXIsIGRvY3VtZW50YXRpb24pOworICAgICAgICByZXR1cm4gUlBDQ2FsbC5lbmRSUENDYWxsKGJ1aWxkZXIpOworICAgIH0KK30KK2V4cG9ydCBjbGFzcyBTZXJ2aWNlIHsKKyAgICBjb25zdHJ1Y3RvcigpIHsKKyAgICAgICAgdGhpcy5iYiA9IG51bGw7CisgICAgICAgIHRoaXMuYmJfcG9zID0gMDsKKyAgICB9CisgICAgX19pbml0KGksIGJiKSB7CisgICAgICAgIHRoaXMuYmJfcG9zID0gaTsKKyAgICAgICAgdGhpcy5iYiA9IGJiOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisgICAgc3RhdGljIGdldFJvb3RBc1NlcnZpY2UoYmIsIG9iaikgeworICAgICAgICByZXR1cm4gKG9iaiB8fCBuZXcgU2VydmljZSgpKS5fX2luaXQoYmIucmVhZEludDMyKGJiLnBvc2l0aW9uKCkpICsgYmIucG9zaXRpb24oKSwgYmIpOworICAgIH0KKyAgICBzdGF0aWMgZ2V0U2l6ZVByZWZpeGVkUm9vdEFzU2VydmljZShiYiwgb2JqKSB7CisgICAgICAgIGJiLnNldFBvc2l0aW9uKGJiLnBvc2l0aW9uKCkgKyBmbGF0YnVmZmVycy5TSVpFX1BSRUZJWF9MRU5HVEgpOworICAgICAgICByZXR1cm4gKG9iaiB8fCBuZXcgU2VydmljZSgpKS5fX2luaXQoYmIucmVhZEludDMyKGJiLnBvc2l0aW9uKCkpICsgYmIucG9zaXRpb24oKSwgYmIpOworICAgIH0KKyAgICBuYW1lKG9wdGlvbmFsRW5jb2RpbmcpIHsKKyAgICAgICAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywgNCk7CisgICAgICAgIHJldHVybiBvZmZzZXQgPyB0aGlzLmJiLl9fc3RyaW5nKHRoaXMuYmJfcG9zICsgb2Zmc2V0LCBvcHRpb25hbEVuY29kaW5nKSA6IG51bGw7CisgICAgfQorICAgIGNhbGxzKGluZGV4LCBvYmopIHsKKyAgICAgICAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywgNik7CisgICAgICAgIHJldHVybiBvZmZzZXQgPyAob2JqIHx8IG5ldyBSUENDYWxsKCkpLl9faW5pdCh0aGlzLmJiLl9faW5kaXJlY3QodGhpcy5iYi5fX3ZlY3Rvcih0aGlzLmJiX3BvcyArIG9mZnNldCkgKyBpbmRleCAqIDQpLCB0aGlzLmJiKSA6IG51bGw7CisgICAgfQorICAgIGNhbGxzTGVuZ3RoKCkgeworICAgICAgICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCA2KTsKKyAgICAgICAgcmV0dXJuIG9mZnNldCA/IHRoaXMuYmIuX192ZWN0b3JfbGVuKHRoaXMuYmJfcG9zICsgb2Zmc2V0KSA6IDA7CisgICAgfQorICAgIGF0dHJpYnV0ZXMoaW5kZXgsIG9iaikgeworICAgICAgICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCA4KTsKKyAgICAgICAgcmV0dXJuIG9mZnNldCA/IChvYmogfHwgbmV3IEtleVZhbHVlKCkpLl9faW5pdCh0aGlzLmJiLl9faW5kaXJlY3QodGhpcy5iYi5fX3ZlY3Rvcih0aGlzLmJiX3BvcyArIG9mZnNldCkgKyBpbmRleCAqIDQpLCB0aGlzLmJiKSA6IG51bGw7CisgICAgfQorICAgIGF0dHJpYnV0ZXNMZW5ndGgoKSB7CisgICAgICAgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsIDgpOworICAgICAgICByZXR1cm4gb2Zmc2V0ID8gdGhpcy5iYi5fX3ZlY3Rvcl9sZW4odGhpcy5iYl9wb3MgKyBvZmZzZXQpIDogMDsKKyAgICB9CisgICAgZG9jdW1lbnRhdGlvbihpbmRleCwgb3B0aW9uYWxFbmNvZGluZykgeworICAgICAgICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCAxMCk7CisgICAgICAgIHJldHVybiBvZmZzZXQgPyB0aGlzLmJiLl9fc3RyaW5nKHRoaXMuYmIuX192ZWN0b3IodGhpcy5iYl9wb3MgKyBvZmZzZXQpICsgaW5kZXggKiA0LCBvcHRpb25hbEVuY29kaW5nKSA6IG51bGw7CisgICAgfQorICAgIGRvY3VtZW50YXRpb25MZW5ndGgoKSB7CisgICAgICAgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsIDEwKTsKKyAgICAgICAgcmV0dXJuIG9mZnNldCA/IHRoaXMuYmIuX192ZWN0b3JfbGVuKHRoaXMuYmJfcG9zICsgb2Zmc2V0KSA6IDA7CisgICAgfQorICAgIGRlY2xhcmF0aW9uRmlsZShvcHRpb25hbEVuY29kaW5nKSB7CisgICAgICAgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsIDEyKTsKKyAgICAgICAgcmV0dXJuIG9mZnNldCA/IHRoaXMuYmIuX19zdHJpbmcodGhpcy5iYl9wb3MgKyBvZmZzZXQsIG9wdGlvbmFsRW5jb2RpbmcpIDogbnVsbDsKKyAgICB9CisgICAgc3RhdGljIGdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpIHsKKyAgICAgICAgcmV0dXJuICdyZWZsZWN0aW9uX1NlcnZpY2UnOworICAgIH0KKyAgICBzdGF0aWMgc3RhcnRTZXJ2aWNlKGJ1aWxkZXIpIHsKKyAgICAgICAgYnVpbGRlci5zdGFydE9iamVjdCg1KTsKKyAgICB9CisgICAgc3RhdGljIGFkZE5hbWUoYnVpbGRlciwgbmFtZU9mZnNldCkgeworICAgICAgICBidWlsZGVyLmFkZEZpZWxkT2Zmc2V0KDAsIG5hbWVPZmZzZXQsIDApOworICAgIH0KKyAgICBzdGF0aWMgYWRkQ2FsbHMoYnVpbGRlciwgY2FsbHNPZmZzZXQpIHsKKyAgICAgICAgYnVpbGRlci5hZGRGaWVsZE9mZnNldCgxLCBjYWxsc09mZnNldCwgMCk7CisgICAgfQorICAgIHN0YXRpYyBjcmVhdGVDYWxsc1ZlY3RvcihidWlsZGVyLCBkYXRhKSB7CisgICAgICAgIGJ1aWxkZXIuc3RhcnRWZWN0b3IoNCwgZGF0YS5sZW5ndGgsIDQpOworICAgICAgICBmb3IgKGxldCBpID0gZGF0YS5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgeworICAgICAgICAgICAgYnVpbGRlci5hZGRPZmZzZXQoZGF0YVtpXSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGJ1aWxkZXIuZW5kVmVjdG9yKCk7CisgICAgfQorICAgIHN0YXRpYyBzdGFydENhbGxzVmVjdG9yKGJ1aWxkZXIsIG51bUVsZW1zKSB7CisgICAgICAgIGJ1aWxkZXIuc3RhcnRWZWN0b3IoNCwgbnVtRWxlbXMsIDQpOworICAgIH0KKyAgICBzdGF0aWMgYWRkQXR0cmlidXRlcyhidWlsZGVyLCBhdHRyaWJ1dGVzT2Zmc2V0KSB7CisgICAgICAgIGJ1aWxkZXIuYWRkRmllbGRPZmZzZXQoMiwgYXR0cmlidXRlc09mZnNldCwgMCk7CisgICAgfQorICAgIHN0YXRpYyBjcmVhdGVBdHRyaWJ1dGVzVmVjdG9yKGJ1aWxkZXIsIGRhdGEpIHsKKyAgICAgICAgYnVpbGRlci5zdGFydFZlY3Rvcig0LCBkYXRhLmxlbmd0aCwgNCk7CisgICAgICAgIGZvciAobGV0IGkgPSBkYXRhLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7CisgICAgICAgICAgICBidWlsZGVyLmFkZE9mZnNldChkYXRhW2ldKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gYnVpbGRlci5lbmRWZWN0b3IoKTsKKyAgICB9CisgICAgc3RhdGljIHN0YXJ0QXR0cmlidXRlc1ZlY3RvcihidWlsZGVyLCBudW1FbGVtcykgeworICAgICAgICBidWlsZGVyLnN0YXJ0VmVjdG9yKDQsIG51bUVsZW1zLCA0KTsKKyAgICB9CisgICAgc3RhdGljIGFkZERvY3VtZW50YXRpb24oYnVpbGRlciwgZG9jdW1lbnRhdGlvbk9mZnNldCkgeworICAgICAgICBidWlsZGVyLmFkZEZpZWxkT2Zmc2V0KDMsIGRvY3VtZW50YXRpb25PZmZzZXQsIDApOworICAgIH0KKyAgICBzdGF0aWMgY3JlYXRlRG9jdW1lbnRhdGlvblZlY3RvcihidWlsZGVyLCBkYXRhKSB7CisgICAgICAgIGJ1aWxkZXIuc3RhcnRWZWN0b3IoNCwgZGF0YS5sZW5ndGgsIDQpOworICAgICAgICBmb3IgKGxldCBpID0gZGF0YS5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgeworICAgICAgICAgICAgYnVpbGRlci5hZGRPZmZzZXQoZGF0YVtpXSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGJ1aWxkZXIuZW5kVmVjdG9yKCk7CisgICAgfQorICAgIHN0YXRpYyBzdGFydERvY3VtZW50YXRpb25WZWN0b3IoYnVpbGRlciwgbnVtRWxlbXMpIHsKKyAgICAgICAgYnVpbGRlci5zdGFydFZlY3Rvcig0LCBudW1FbGVtcywgNCk7CisgICAgfQorICAgIHN0YXRpYyBhZGREZWNsYXJhdGlvbkZpbGUoYnVpbGRlciwgZGVjbGFyYXRpb25GaWxlT2Zmc2V0KSB7CisgICAgICAgIGJ1aWxkZXIuYWRkRmllbGRPZmZzZXQoNCwgZGVjbGFyYXRpb25GaWxlT2Zmc2V0LCAwKTsKKyAgICB9CisgICAgc3RhdGljIGVuZFNlcnZpY2UoYnVpbGRlcikgeworICAgICAgICBjb25zdCBvZmZzZXQgPSBidWlsZGVyLmVuZE9iamVjdCgpOworICAgICAgICBidWlsZGVyLnJlcXVpcmVkRmllbGQob2Zmc2V0LCA0KTsgLy8gbmFtZQorICAgICAgICByZXR1cm4gb2Zmc2V0OworICAgIH0KKyAgICBzdGF0aWMgY3JlYXRlU2VydmljZShidWlsZGVyLCBuYW1lT2Zmc2V0LCBjYWxsc09mZnNldCwgYXR0cmlidXRlc09mZnNldCwgZG9jdW1lbnRhdGlvbk9mZnNldCwgZGVjbGFyYXRpb25GaWxlT2Zmc2V0KSB7CisgICAgICAgIFNlcnZpY2Uuc3RhcnRTZXJ2aWNlKGJ1aWxkZXIpOworICAgICAgICBTZXJ2aWNlLmFkZE5hbWUoYnVpbGRlciwgbmFtZU9mZnNldCk7CisgICAgICAgIFNlcnZpY2UuYWRkQ2FsbHMoYnVpbGRlciwgY2FsbHNPZmZzZXQpOworICAgICAgICBTZXJ2aWNlLmFkZEF0dHJpYnV0ZXMoYnVpbGRlciwgYXR0cmlidXRlc09mZnNldCk7CisgICAgICAgIFNlcnZpY2UuYWRkRG9jdW1lbnRhdGlvbihidWlsZGVyLCBkb2N1bWVudGF0aW9uT2Zmc2V0KTsKKyAgICAgICAgU2VydmljZS5hZGREZWNsYXJhdGlvbkZpbGUoYnVpbGRlciwgZGVjbGFyYXRpb25GaWxlT2Zmc2V0KTsKKyAgICAgICAgcmV0dXJuIFNlcnZpY2UuZW5kU2VydmljZShidWlsZGVyKTsKKyAgICB9CisgICAgdW5wYWNrKCkgeworICAgICAgICByZXR1cm4gbmV3IFNlcnZpY2VUKHRoaXMubmFtZSgpLCB0aGlzLmJiLmNyZWF0ZU9iakxpc3QodGhpcy5jYWxscy5iaW5kKHRoaXMpLCB0aGlzLmNhbGxzTGVuZ3RoKCkpLCB0aGlzLmJiLmNyZWF0ZU9iakxpc3QodGhpcy5hdHRyaWJ1dGVzLmJpbmQodGhpcyksIHRoaXMuYXR0cmlidXRlc0xlbmd0aCgpKSwgdGhpcy5iYi5jcmVhdGVTY2FsYXJMaXN0KHRoaXMuZG9jdW1lbnRhdGlvbi5iaW5kKHRoaXMpLCB0aGlzLmRvY3VtZW50YXRpb25MZW5ndGgoKSksIHRoaXMuZGVjbGFyYXRpb25GaWxlKCkpOworICAgIH0KKyAgICB1bnBhY2tUbyhfbykgeworICAgICAgICBfby5uYW1lID0gdGhpcy5uYW1lKCk7CisgICAgICAgIF9vLmNhbGxzID0gdGhpcy5iYi5jcmVhdGVPYmpMaXN0KHRoaXMuY2FsbHMuYmluZCh0aGlzKSwgdGhpcy5jYWxsc0xlbmd0aCgpKTsKKyAgICAgICAgX28uYXR0cmlidXRlcyA9IHRoaXMuYmIuY3JlYXRlT2JqTGlzdCh0aGlzLmF0dHJpYnV0ZXMuYmluZCh0aGlzKSwgdGhpcy5hdHRyaWJ1dGVzTGVuZ3RoKCkpOworICAgICAgICBfby5kb2N1bWVudGF0aW9uID0gdGhpcy5iYi5jcmVhdGVTY2FsYXJMaXN0KHRoaXMuZG9jdW1lbnRhdGlvbi5iaW5kKHRoaXMpLCB0aGlzLmRvY3VtZW50YXRpb25MZW5ndGgoKSk7CisgICAgICAgIF9vLmRlY2xhcmF0aW9uRmlsZSA9IHRoaXMuZGVjbGFyYXRpb25GaWxlKCk7CisgICAgfQorfQorZXhwb3J0IGNsYXNzIFNlcnZpY2VUIHsKKyAgICBjb25zdHJ1Y3RvcihuYW1lID0gbnVsbCwgY2FsbHMgPSBbXSwgYXR0cmlidXRlcyA9IFtdLCBkb2N1bWVudGF0aW9uID0gW10sIGRlY2xhcmF0aW9uRmlsZSA9IG51bGwpIHsKKyAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKKyAgICAgICAgdGhpcy5jYWxscyA9IGNhbGxzOworICAgICAgICB0aGlzLmF0dHJpYnV0ZXMgPSBhdHRyaWJ1dGVzOworICAgICAgICB0aGlzLmRvY3VtZW50YXRpb24gPSBkb2N1bWVudGF0aW9uOworICAgICAgICB0aGlzLmRlY2xhcmF0aW9uRmlsZSA9IGRlY2xhcmF0aW9uRmlsZTsKKyAgICB9CisgICAgcGFjayhidWlsZGVyKSB7CisgICAgICAgIGNvbnN0IG5hbWUgPSAodGhpcy5uYW1lICE9PSBudWxsID8gYnVpbGRlci5jcmVhdGVTdHJpbmcodGhpcy5uYW1lKSA6IDApOworICAgICAgICBjb25zdCBjYWxscyA9IFNlcnZpY2UuY3JlYXRlQ2FsbHNWZWN0b3IoYnVpbGRlciwgYnVpbGRlci5jcmVhdGVPYmplY3RPZmZzZXRMaXN0KHRoaXMuY2FsbHMpKTsKKyAgICAgICAgY29uc3QgYXR0cmlidXRlcyA9IFNlcnZpY2UuY3JlYXRlQXR0cmlidXRlc1ZlY3RvcihidWlsZGVyLCBidWlsZGVyLmNyZWF0ZU9iamVjdE9mZnNldExpc3QodGhpcy5hdHRyaWJ1dGVzKSk7CisgICAgICAgIGNvbnN0IGRvY3VtZW50YXRpb24gPSBTZXJ2aWNlLmNyZWF0ZURvY3VtZW50YXRpb25WZWN0b3IoYnVpbGRlciwgYnVpbGRlci5jcmVhdGVPYmplY3RPZmZzZXRMaXN0KHRoaXMuZG9jdW1lbnRhdGlvbikpOworICAgICAgICBjb25zdCBkZWNsYXJhdGlvbkZpbGUgPSAodGhpcy5kZWNsYXJhdGlvbkZpbGUgIT09IG51bGwgPyBidWlsZGVyLmNyZWF0ZVN0cmluZyh0aGlzLmRlY2xhcmF0aW9uRmlsZSkgOiAwKTsKKyAgICAgICAgcmV0dXJuIFNlcnZpY2UuY3JlYXRlU2VydmljZShidWlsZGVyLCBuYW1lLCBjYWxscywgYXR0cmlidXRlcywgZG9jdW1lbnRhdGlvbiwgZGVjbGFyYXRpb25GaWxlKTsKKyAgICB9Cit9CisvKioKKyAqIEZpbGUgc3BlY2lmaWMgaW5mb3JtYXRpb24uCisgKiBTeW1ib2xzIGRlY2xhcmVkIHdpdGhpbiBhIGZpbGUgbWF5IGJlIHJlY292ZXJlZCBieSBpdGVyYXRpbmcgb3ZlciBhbGwKKyAqIHN5bWJvbHMgYW5kIGV4YW1pbmluZyB0aGUgYGRlY2xhcmF0aW9uX2ZpbGVgIGZpZWxkLgorICovCitleHBvcnQgY2xhc3MgU2NoZW1hRmlsZSB7CisgICAgY29uc3RydWN0b3IoKSB7CisgICAgICAgIHRoaXMuYmIgPSBudWxsOworICAgICAgICB0aGlzLmJiX3BvcyA9IDA7CisgICAgfQorICAgIF9faW5pdChpLCBiYikgeworICAgICAgICB0aGlzLmJiX3BvcyA9IGk7CisgICAgICAgIHRoaXMuYmIgPSBiYjsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorICAgIHN0YXRpYyBnZXRSb290QXNTY2hlbWFGaWxlKGJiLCBvYmopIHsKKyAgICAgICAgcmV0dXJuIChvYmogfHwgbmV3IFNjaGVtYUZpbGUoKSkuX19pbml0KGJiLnJlYWRJbnQzMihiYi5wb3NpdGlvbigpKSArIGJiLnBvc2l0aW9uKCksIGJiKTsKKyAgICB9CisgICAgc3RhdGljIGdldFNpemVQcmVmaXhlZFJvb3RBc1NjaGVtYUZpbGUoYmIsIG9iaikgeworICAgICAgICBiYi5zZXRQb3NpdGlvbihiYi5wb3NpdGlvbigpICsgZmxhdGJ1ZmZlcnMuU0laRV9QUkVGSVhfTEVOR1RIKTsKKyAgICAgICAgcmV0dXJuIChvYmogfHwgbmV3IFNjaGVtYUZpbGUoKSkuX19pbml0KGJiLnJlYWRJbnQzMihiYi5wb3NpdGlvbigpKSArIGJiLnBvc2l0aW9uKCksIGJiKTsKKyAgICB9CisgICAgZmlsZW5hbWUob3B0aW9uYWxFbmNvZGluZykgeworICAgICAgICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCA0KTsKKyAgICAgICAgcmV0dXJuIG9mZnNldCA/IHRoaXMuYmIuX19zdHJpbmcodGhpcy5iYl9wb3MgKyBvZmZzZXQsIG9wdGlvbmFsRW5jb2RpbmcpIDogbnVsbDsKKyAgICB9CisgICAgaW5jbHVkZWRGaWxlbmFtZXMoaW5kZXgsIG9wdGlvbmFsRW5jb2RpbmcpIHsKKyAgICAgICAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywgNik7CisgICAgICAgIHJldHVybiBvZmZzZXQgPyB0aGlzLmJiLl9fc3RyaW5nKHRoaXMuYmIuX192ZWN0b3IodGhpcy5iYl9wb3MgKyBvZmZzZXQpICsgaW5kZXggKiA0LCBvcHRpb25hbEVuY29kaW5nKSA6IG51bGw7CisgICAgfQorICAgIGluY2x1ZGVkRmlsZW5hbWVzTGVuZ3RoKCkgeworICAgICAgICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCA2KTsKKyAgICAgICAgcmV0dXJuIG9mZnNldCA/IHRoaXMuYmIuX192ZWN0b3JfbGVuKHRoaXMuYmJfcG9zICsgb2Zmc2V0KSA6IDA7CisgICAgfQorICAgIHN0YXRpYyBnZXRGdWxseVF1YWxpZmllZE5hbWUoKSB7CisgICAgICAgIHJldHVybiAncmVmbGVjdGlvbl9TY2hlbWFGaWxlJzsKKyAgICB9CisgICAgc3RhdGljIHN0YXJ0U2NoZW1hRmlsZShidWlsZGVyKSB7CisgICAgICAgIGJ1aWxkZXIuc3RhcnRPYmplY3QoMik7CisgICAgfQorICAgIHN0YXRpYyBhZGRGaWxlbmFtZShidWlsZGVyLCBmaWxlbmFtZU9mZnNldCkgeworICAgICAgICBidWlsZGVyLmFkZEZpZWxkT2Zmc2V0KDAsIGZpbGVuYW1lT2Zmc2V0LCAwKTsKKyAgICB9CisgICAgc3RhdGljIGFkZEluY2x1ZGVkRmlsZW5hbWVzKGJ1aWxkZXIsIGluY2x1ZGVkRmlsZW5hbWVzT2Zmc2V0KSB7CisgICAgICAgIGJ1aWxkZXIuYWRkRmllbGRPZmZzZXQoMSwgaW5jbHVkZWRGaWxlbmFtZXNPZmZzZXQsIDApOworICAgIH0KKyAgICBzdGF0aWMgY3JlYXRlSW5jbHVkZWRGaWxlbmFtZXNWZWN0b3IoYnVpbGRlciwgZGF0YSkgeworICAgICAgICBidWlsZGVyLnN0YXJ0VmVjdG9yKDQsIGRhdGEubGVuZ3RoLCA0KTsKKyAgICAgICAgZm9yIChsZXQgaSA9IGRhdGEubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHsKKyAgICAgICAgICAgIGJ1aWxkZXIuYWRkT2Zmc2V0KGRhdGFbaV0pOworICAgICAgICB9CisgICAgICAgIHJldHVybiBidWlsZGVyLmVuZFZlY3RvcigpOworICAgIH0KKyAgICBzdGF0aWMgc3RhcnRJbmNsdWRlZEZpbGVuYW1lc1ZlY3RvcihidWlsZGVyLCBudW1FbGVtcykgeworICAgICAgICBidWlsZGVyLnN0YXJ0VmVjdG9yKDQsIG51bUVsZW1zLCA0KTsKKyAgICB9CisgICAgc3RhdGljIGVuZFNjaGVtYUZpbGUoYnVpbGRlcikgeworICAgICAgICBjb25zdCBvZmZzZXQgPSBidWlsZGVyLmVuZE9iamVjdCgpOworICAgICAgICBidWlsZGVyLnJlcXVpcmVkRmllbGQob2Zmc2V0LCA0KTsgLy8gZmlsZW5hbWUKKyAgICAgICAgcmV0dXJuIG9mZnNldDsKKyAgICB9CisgICAgc3RhdGljIGNyZWF0ZVNjaGVtYUZpbGUoYnVpbGRlciwgZmlsZW5hbWVPZmZzZXQsIGluY2x1ZGVkRmlsZW5hbWVzT2Zmc2V0KSB7CisgICAgICAgIFNjaGVtYUZpbGUuc3RhcnRTY2hlbWFGaWxlKGJ1aWxkZXIpOworICAgICAgICBTY2hlbWFGaWxlLmFkZEZpbGVuYW1lKGJ1aWxkZXIsIGZpbGVuYW1lT2Zmc2V0KTsKKyAgICAgICAgU2NoZW1hRmlsZS5hZGRJbmNsdWRlZEZpbGVuYW1lcyhidWlsZGVyLCBpbmNsdWRlZEZpbGVuYW1lc09mZnNldCk7CisgICAgICAgIHJldHVybiBTY2hlbWFGaWxlLmVuZFNjaGVtYUZpbGUoYnVpbGRlcik7CisgICAgfQorICAgIHVucGFjaygpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBTY2hlbWFGaWxlVCh0aGlzLmZpbGVuYW1lKCksIHRoaXMuYmIuY3JlYXRlU2NhbGFyTGlzdCh0aGlzLmluY2x1ZGVkRmlsZW5hbWVzLmJpbmQodGhpcyksIHRoaXMuaW5jbHVkZWRGaWxlbmFtZXNMZW5ndGgoKSkpOworICAgIH0KKyAgICB1bnBhY2tUbyhfbykgeworICAgICAgICBfby5maWxlbmFtZSA9IHRoaXMuZmlsZW5hbWUoKTsKKyAgICAgICAgX28uaW5jbHVkZWRGaWxlbmFtZXMgPSB0aGlzLmJiLmNyZWF0ZVNjYWxhckxpc3QodGhpcy5pbmNsdWRlZEZpbGVuYW1lcy5iaW5kKHRoaXMpLCB0aGlzLmluY2x1ZGVkRmlsZW5hbWVzTGVuZ3RoKCkpOworICAgIH0KK30KK2V4cG9ydCBjbGFzcyBTY2hlbWFGaWxlVCB7CisgICAgY29uc3RydWN0b3IoZmlsZW5hbWUgPSBudWxsLCBpbmNsdWRlZEZpbGVuYW1lcyA9IFtdKSB7CisgICAgICAgIHRoaXMuZmlsZW5hbWUgPSBmaWxlbmFtZTsKKyAgICAgICAgdGhpcy5pbmNsdWRlZEZpbGVuYW1lcyA9IGluY2x1ZGVkRmlsZW5hbWVzOworICAgIH0KKyAgICBwYWNrKGJ1aWxkZXIpIHsKKyAgICAgICAgY29uc3QgZmlsZW5hbWUgPSAodGhpcy5maWxlbmFtZSAhPT0gbnVsbCA/IGJ1aWxkZXIuY3JlYXRlU3RyaW5nKHRoaXMuZmlsZW5hbWUpIDogMCk7CisgICAgICAgIGNvbnN0IGluY2x1ZGVkRmlsZW5hbWVzID0gU2NoZW1hRmlsZS5jcmVhdGVJbmNsdWRlZEZpbGVuYW1lc1ZlY3RvcihidWlsZGVyLCBidWlsZGVyLmNyZWF0ZU9iamVjdE9mZnNldExpc3QodGhpcy5pbmNsdWRlZEZpbGVuYW1lcykpOworICAgICAgICByZXR1cm4gU2NoZW1hRmlsZS5jcmVhdGVTY2hlbWFGaWxlKGJ1aWxkZXIsIGZpbGVuYW1lLCBpbmNsdWRlZEZpbGVuYW1lcyk7CisgICAgfQorfQorZXhwb3J0IGNsYXNzIFNjaGVtYSB7CisgICAgY29uc3RydWN0b3IoKSB7CisgICAgICAgIHRoaXMuYmIgPSBudWxsOworICAgICAgICB0aGlzLmJiX3BvcyA9IDA7CisgICAgfQorICAgIF9faW5pdChpLCBiYikgeworICAgICAgICB0aGlzLmJiX3BvcyA9IGk7CisgICAgICAgIHRoaXMuYmIgPSBiYjsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorICAgIHN0YXRpYyBnZXRSb290QXNTY2hlbWEoYmIsIG9iaikgeworICAgICAgICByZXR1cm4gKG9iaiB8fCBuZXcgU2NoZW1hKCkpLl9faW5pdChiYi5yZWFkSW50MzIoYmIucG9zaXRpb24oKSkgKyBiYi5wb3NpdGlvbigpLCBiYik7CisgICAgfQorICAgIHN0YXRpYyBnZXRTaXplUHJlZml4ZWRSb290QXNTY2hlbWEoYmIsIG9iaikgeworICAgICAgICBiYi5zZXRQb3NpdGlvbihiYi5wb3NpdGlvbigpICsgZmxhdGJ1ZmZlcnMuU0laRV9QUkVGSVhfTEVOR1RIKTsKKyAgICAgICAgcmV0dXJuIChvYmogfHwgbmV3IFNjaGVtYSgpKS5fX2luaXQoYmIucmVhZEludDMyKGJiLnBvc2l0aW9uKCkpICsgYmIucG9zaXRpb24oKSwgYmIpOworICAgIH0KKyAgICBzdGF0aWMgYnVmZmVySGFzSWRlbnRpZmllcihiYikgeworICAgICAgICByZXR1cm4gYmIuX19oYXNfaWRlbnRpZmllcignQkZCUycpOworICAgIH0KKyAgICBvYmplY3RzKGluZGV4LCBvYmopIHsKKyAgICAgICAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywgNCk7CisgICAgICAgIHJldHVybiBvZmZzZXQgPyAob2JqIHx8IG5ldyBPYmplY3RfKCkpLl9faW5pdCh0aGlzLmJiLl9faW5kaXJlY3QodGhpcy5iYi5fX3ZlY3Rvcih0aGlzLmJiX3BvcyArIG9mZnNldCkgKyBpbmRleCAqIDQpLCB0aGlzLmJiKSA6IG51bGw7CisgICAgfQorICAgIG9iamVjdHNMZW5ndGgoKSB7CisgICAgICAgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsIDQpOworICAgICAgICByZXR1cm4gb2Zmc2V0ID8gdGhpcy5iYi5fX3ZlY3Rvcl9sZW4odGhpcy5iYl9wb3MgKyBvZmZzZXQpIDogMDsKKyAgICB9CisgICAgZW51bXMoaW5kZXgsIG9iaikgeworICAgICAgICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCA2KTsKKyAgICAgICAgcmV0dXJuIG9mZnNldCA/IChvYmogfHwgbmV3IEVudW0oKSkuX19pbml0KHRoaXMuYmIuX19pbmRpcmVjdCh0aGlzLmJiLl9fdmVjdG9yKHRoaXMuYmJfcG9zICsgb2Zmc2V0KSArIGluZGV4ICogNCksIHRoaXMuYmIpIDogbnVsbDsKKyAgICB9CisgICAgZW51bXNMZW5ndGgoKSB7CisgICAgICAgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsIDYpOworICAgICAgICByZXR1cm4gb2Zmc2V0ID8gdGhpcy5iYi5fX3ZlY3Rvcl9sZW4odGhpcy5iYl9wb3MgKyBvZmZzZXQpIDogMDsKKyAgICB9CisgICAgZmlsZUlkZW50KG9wdGlvbmFsRW5jb2RpbmcpIHsKKyAgICAgICAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywgOCk7CisgICAgICAgIHJldHVybiBvZmZzZXQgPyB0aGlzLmJiLl9fc3RyaW5nKHRoaXMuYmJfcG9zICsgb2Zmc2V0LCBvcHRpb25hbEVuY29kaW5nKSA6IG51bGw7CisgICAgfQorICAgIGZpbGVFeHQob3B0aW9uYWxFbmNvZGluZykgeworICAgICAgICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCAxMCk7CisgICAgICAgIHJldHVybiBvZmZzZXQgPyB0aGlzLmJiLl9fc3RyaW5nKHRoaXMuYmJfcG9zICsgb2Zmc2V0LCBvcHRpb25hbEVuY29kaW5nKSA6IG51bGw7CisgICAgfQorICAgIHJvb3RUYWJsZShvYmopIHsKKyAgICAgICAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywgMTIpOworICAgICAgICByZXR1cm4gb2Zmc2V0ID8gKG9iaiB8fCBuZXcgT2JqZWN0XygpKS5fX2luaXQodGhpcy5iYi5fX2luZGlyZWN0KHRoaXMuYmJfcG9zICsgb2Zmc2V0KSwgdGhpcy5iYikgOiBudWxsOworICAgIH0KKyAgICBzZXJ2aWNlcyhpbmRleCwgb2JqKSB7CisgICAgICAgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsIDE0KTsKKyAgICAgICAgcmV0dXJuIG9mZnNldCA/IChvYmogfHwgbmV3IFNlcnZpY2UoKSkuX19pbml0KHRoaXMuYmIuX19pbmRpcmVjdCh0aGlzLmJiLl9fdmVjdG9yKHRoaXMuYmJfcG9zICsgb2Zmc2V0KSArIGluZGV4ICogNCksIHRoaXMuYmIpIDogbnVsbDsKKyAgICB9CisgICAgc2VydmljZXNMZW5ndGgoKSB7CisgICAgICAgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsIDE0KTsKKyAgICAgICAgcmV0dXJuIG9mZnNldCA/IHRoaXMuYmIuX192ZWN0b3JfbGVuKHRoaXMuYmJfcG9zICsgb2Zmc2V0KSA6IDA7CisgICAgfQorICAgIGFkdmFuY2VkRmVhdHVyZXMoKSB7CisgICAgICAgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsIDE2KTsKKyAgICAgICAgcmV0dXJuIG9mZnNldCA/IHRoaXMuYmIucmVhZFVpbnQ2NCh0aGlzLmJiX3BvcyArIG9mZnNldCkgOiBCaWdJbnQoJzAnKTsKKyAgICB9CisgICAgbXV0YXRlX2FkdmFuY2VkX2ZlYXR1cmVzKHZhbHVlKSB7CisgICAgICAgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsIDE2KTsKKyAgICAgICAgaWYgKG9mZnNldCA9PT0gMCkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIHRoaXMuYmIud3JpdGVVaW50NjQodGhpcy5iYl9wb3MgKyBvZmZzZXQsIHZhbHVlKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIC8qKgorICAgICAqIEFsbCB0aGUgZmlsZXMgdXNlZCBpbiB0aGlzIGNvbXBpbGF0aW9uLiBGaWxlcyBhcmUgcmVsYXRpdmUgdG8gd2hlcmUKKyAgICAgKiBmbGF0YyB3YXMgaW52b2tlZC4KKyAgICAgKi8KKyAgICBmYnNGaWxlcyhpbmRleCwgb2JqKSB7CisgICAgICAgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsIDE4KTsKKyAgICAgICAgcmV0dXJuIG9mZnNldCA/IChvYmogfHwgbmV3IFNjaGVtYUZpbGUoKSkuX19pbml0KHRoaXMuYmIuX19pbmRpcmVjdCh0aGlzLmJiLl9fdmVjdG9yKHRoaXMuYmJfcG9zICsgb2Zmc2V0KSArIGluZGV4ICogNCksIHRoaXMuYmIpIDogbnVsbDsKKyAgICB9CisgICAgZmJzRmlsZXNMZW5ndGgoKSB7CisgICAgICAgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsIDE4KTsKKyAgICAgICAgcmV0dXJuIG9mZnNldCA/IHRoaXMuYmIuX192ZWN0b3JfbGVuKHRoaXMuYmJfcG9zICsgb2Zmc2V0KSA6IDA7CisgICAgfQorICAgIHN0YXRpYyBnZXRGdWxseVF1YWxpZmllZE5hbWUoKSB7CisgICAgICAgIHJldHVybiAncmVmbGVjdGlvbl9TY2hlbWEnOworICAgIH0KKyAgICBzdGF0aWMgc3RhcnRTY2hlbWEoYnVpbGRlcikgeworICAgICAgICBidWlsZGVyLnN0YXJ0T2JqZWN0KDgpOworICAgIH0KKyAgICBzdGF0aWMgYWRkT2JqZWN0cyhidWlsZGVyLCBvYmplY3RzT2Zmc2V0KSB7CisgICAgICAgIGJ1aWxkZXIuYWRkRmllbGRPZmZzZXQoMCwgb2JqZWN0c09mZnNldCwgMCk7CisgICAgfQorICAgIHN0YXRpYyBjcmVhdGVPYmplY3RzVmVjdG9yKGJ1aWxkZXIsIGRhdGEpIHsKKyAgICAgICAgYnVpbGRlci5zdGFydFZlY3Rvcig0LCBkYXRhLmxlbmd0aCwgNCk7CisgICAgICAgIGZvciAobGV0IGkgPSBkYXRhLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7CisgICAgICAgICAgICBidWlsZGVyLmFkZE9mZnNldChkYXRhW2ldKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gYnVpbGRlci5lbmRWZWN0b3IoKTsKKyAgICB9CisgICAgc3RhdGljIHN0YXJ0T2JqZWN0c1ZlY3RvcihidWlsZGVyLCBudW1FbGVtcykgeworICAgICAgICBidWlsZGVyLnN0YXJ0VmVjdG9yKDQsIG51bUVsZW1zLCA0KTsKKyAgICB9CisgICAgc3RhdGljIGFkZEVudW1zKGJ1aWxkZXIsIGVudW1zT2Zmc2V0KSB7CisgICAgICAgIGJ1aWxkZXIuYWRkRmllbGRPZmZzZXQoMSwgZW51bXNPZmZzZXQsIDApOworICAgIH0KKyAgICBzdGF0aWMgY3JlYXRlRW51bXNWZWN0b3IoYnVpbGRlciwgZGF0YSkgeworICAgICAgICBidWlsZGVyLnN0YXJ0VmVjdG9yKDQsIGRhdGEubGVuZ3RoLCA0KTsKKyAgICAgICAgZm9yIChsZXQgaSA9IGRhdGEubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHsKKyAgICAgICAgICAgIGJ1aWxkZXIuYWRkT2Zmc2V0KGRhdGFbaV0pOworICAgICAgICB9CisgICAgICAgIHJldHVybiBidWlsZGVyLmVuZFZlY3RvcigpOworICAgIH0KKyAgICBzdGF0aWMgc3RhcnRFbnVtc1ZlY3RvcihidWlsZGVyLCBudW1FbGVtcykgeworICAgICAgICBidWlsZGVyLnN0YXJ0VmVjdG9yKDQsIG51bUVsZW1zLCA0KTsKKyAgICB9CisgICAgc3RhdGljIGFkZEZpbGVJZGVudChidWlsZGVyLCBmaWxlSWRlbnRPZmZzZXQpIHsKKyAgICAgICAgYnVpbGRlci5hZGRGaWVsZE9mZnNldCgyLCBmaWxlSWRlbnRPZmZzZXQsIDApOworICAgIH0KKyAgICBzdGF0aWMgYWRkRmlsZUV4dChidWlsZGVyLCBmaWxlRXh0T2Zmc2V0KSB7CisgICAgICAgIGJ1aWxkZXIuYWRkRmllbGRPZmZzZXQoMywgZmlsZUV4dE9mZnNldCwgMCk7CisgICAgfQorICAgIHN0YXRpYyBhZGRSb290VGFibGUoYnVpbGRlciwgcm9vdFRhYmxlT2Zmc2V0KSB7CisgICAgICAgIGJ1aWxkZXIuYWRkRmllbGRPZmZzZXQoNCwgcm9vdFRhYmxlT2Zmc2V0LCAwKTsKKyAgICB9CisgICAgc3RhdGljIGFkZFNlcnZpY2VzKGJ1aWxkZXIsIHNlcnZpY2VzT2Zmc2V0KSB7CisgICAgICAgIGJ1aWxkZXIuYWRkRmllbGRPZmZzZXQoNSwgc2VydmljZXNPZmZzZXQsIDApOworICAgIH0KKyAgICBzdGF0aWMgY3JlYXRlU2VydmljZXNWZWN0b3IoYnVpbGRlciwgZGF0YSkgeworICAgICAgICBidWlsZGVyLnN0YXJ0VmVjdG9yKDQsIGRhdGEubGVuZ3RoLCA0KTsKKyAgICAgICAgZm9yIChsZXQgaSA9IGRhdGEubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHsKKyAgICAgICAgICAgIGJ1aWxkZXIuYWRkT2Zmc2V0KGRhdGFbaV0pOworICAgICAgICB9CisgICAgICAgIHJldHVybiBidWlsZGVyLmVuZFZlY3RvcigpOworICAgIH0KKyAgICBzdGF0aWMgc3RhcnRTZXJ2aWNlc1ZlY3RvcihidWlsZGVyLCBudW1FbGVtcykgeworICAgICAgICBidWlsZGVyLnN0YXJ0VmVjdG9yKDQsIG51bUVsZW1zLCA0KTsKKyAgICB9CisgICAgc3RhdGljIGFkZEFkdmFuY2VkRmVhdHVyZXMoYnVpbGRlciwgYWR2YW5jZWRGZWF0dXJlcykgeworICAgICAgICBidWlsZGVyLmFkZEZpZWxkSW50NjQoNiwgYWR2YW5jZWRGZWF0dXJlcywgQmlnSW50KCcwJykpOworICAgIH0KKyAgICBzdGF0aWMgYWRkRmJzRmlsZXMoYnVpbGRlciwgZmJzRmlsZXNPZmZzZXQpIHsKKyAgICAgICAgYnVpbGRlci5hZGRGaWVsZE9mZnNldCg3LCBmYnNGaWxlc09mZnNldCwgMCk7CisgICAgfQorICAgIHN0YXRpYyBjcmVhdGVGYnNGaWxlc1ZlY3RvcihidWlsZGVyLCBkYXRhKSB7CisgICAgICAgIGJ1aWxkZXIuc3RhcnRWZWN0b3IoNCwgZGF0YS5sZW5ndGgsIDQpOworICAgICAgICBmb3IgKGxldCBpID0gZGF0YS5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgeworICAgICAgICAgICAgYnVpbGRlci5hZGRPZmZzZXQoZGF0YVtpXSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGJ1aWxkZXIuZW5kVmVjdG9yKCk7CisgICAgfQorICAgIHN0YXRpYyBzdGFydEZic0ZpbGVzVmVjdG9yKGJ1aWxkZXIsIG51bUVsZW1zKSB7CisgICAgICAgIGJ1aWxkZXIuc3RhcnRWZWN0b3IoNCwgbnVtRWxlbXMsIDQpOworICAgIH0KKyAgICBzdGF0aWMgZW5kU2NoZW1hKGJ1aWxkZXIpIHsKKyAgICAgICAgY29uc3Qgb2Zmc2V0ID0gYnVpbGRlci5lbmRPYmplY3QoKTsKKyAgICAgICAgYnVpbGRlci5yZXF1aXJlZEZpZWxkKG9mZnNldCwgNCk7IC8vIG9iamVjdHMKKyAgICAgICAgYnVpbGRlci5yZXF1aXJlZEZpZWxkKG9mZnNldCwgNik7IC8vIGVudW1zCisgICAgICAgIHJldHVybiBvZmZzZXQ7CisgICAgfQorICAgIHN0YXRpYyBmaW5pc2hTY2hlbWFCdWZmZXIoYnVpbGRlciwgb2Zmc2V0KSB7CisgICAgICAgIGJ1aWxkZXIuZmluaXNoKG9mZnNldCwgJ0JGQlMnKTsKKyAgICB9CisgICAgc3RhdGljIGZpbmlzaFNpemVQcmVmaXhlZFNjaGVtYUJ1ZmZlcihidWlsZGVyLCBvZmZzZXQpIHsKKyAgICAgICAgYnVpbGRlci5maW5pc2gob2Zmc2V0LCAnQkZCUycsIHRydWUpOworICAgIH0KKyAgICB1bnBhY2soKSB7CisgICAgICAgIHJldHVybiBuZXcgU2NoZW1hVCh0aGlzLmJiLmNyZWF0ZU9iakxpc3QodGhpcy5vYmplY3RzLmJpbmQodGhpcyksIHRoaXMub2JqZWN0c0xlbmd0aCgpKSwgdGhpcy5iYi5jcmVhdGVPYmpMaXN0KHRoaXMuZW51bXMuYmluZCh0aGlzKSwgdGhpcy5lbnVtc0xlbmd0aCgpKSwgdGhpcy5maWxlSWRlbnQoKSwgdGhpcy5maWxlRXh0KCksICh0aGlzLnJvb3RUYWJsZSgpICE9PSBudWxsID8gdGhpcy5yb290VGFibGUoKS51bnBhY2soKSA6IG51bGwpLCB0aGlzLmJiLmNyZWF0ZU9iakxpc3QodGhpcy5zZXJ2aWNlcy5iaW5kKHRoaXMpLCB0aGlzLnNlcnZpY2VzTGVuZ3RoKCkpLCB0aGlzLmFkdmFuY2VkRmVhdHVyZXMoKSwgdGhpcy5iYi5jcmVhdGVPYmpMaXN0KHRoaXMuZmJzRmlsZXMuYmluZCh0aGlzKSwgdGhpcy5mYnNGaWxlc0xlbmd0aCgpKSk7CisgICAgfQorICAgIHVucGFja1RvKF9vKSB7CisgICAgICAgIF9vLm9iamVjdHMgPSB0aGlzLmJiLmNyZWF0ZU9iakxpc3QodGhpcy5vYmplY3RzLmJpbmQodGhpcyksIHRoaXMub2JqZWN0c0xlbmd0aCgpKTsKKyAgICAgICAgX28uZW51bXMgPSB0aGlzLmJiLmNyZWF0ZU9iakxpc3QodGhpcy5lbnVtcy5iaW5kKHRoaXMpLCB0aGlzLmVudW1zTGVuZ3RoKCkpOworICAgICAgICBfby5maWxlSWRlbnQgPSB0aGlzLmZpbGVJZGVudCgpOworICAgICAgICBfby5maWxlRXh0ID0gdGhpcy5maWxlRXh0KCk7CisgICAgICAgIF9vLnJvb3RUYWJsZSA9ICh0aGlzLnJvb3RUYWJsZSgpICE9PSBudWxsID8gdGhpcy5yb290VGFibGUoKS51bnBhY2soKSA6IG51bGwpOworICAgICAgICBfby5zZXJ2aWNlcyA9IHRoaXMuYmIuY3JlYXRlT2JqTGlzdCh0aGlzLnNlcnZpY2VzLmJpbmQodGhpcyksIHRoaXMuc2VydmljZXNMZW5ndGgoKSk7CisgICAgICAgIF9vLmFkdmFuY2VkRmVhdHVyZXMgPSB0aGlzLmFkdmFuY2VkRmVhdHVyZXMoKTsKKyAgICAgICAgX28uZmJzRmlsZXMgPSB0aGlzLmJiLmNyZWF0ZU9iakxpc3QodGhpcy5mYnNGaWxlcy5iaW5kKHRoaXMpLCB0aGlzLmZic0ZpbGVzTGVuZ3RoKCkpOworICAgIH0KK30KK2V4cG9ydCBjbGFzcyBTY2hlbWFUIHsKKyAgICBjb25zdHJ1Y3RvcihvYmplY3RzID0gW10sIGVudW1zID0gW10sIGZpbGVJZGVudCA9IG51bGwsIGZpbGVFeHQgPSBudWxsLCByb290VGFibGUgPSBudWxsLCBzZXJ2aWNlcyA9IFtdLCBhZHZhbmNlZEZlYXR1cmVzID0gQmlnSW50KCcwJyksIGZic0ZpbGVzID0gW10pIHsKKyAgICAgICAgdGhpcy5vYmplY3RzID0gb2JqZWN0czsKKyAgICAgICAgdGhpcy5lbnVtcyA9IGVudW1zOworICAgICAgICB0aGlzLmZpbGVJZGVudCA9IGZpbGVJZGVudDsKKyAgICAgICAgdGhpcy5maWxlRXh0ID0gZmlsZUV4dDsKKyAgICAgICAgdGhpcy5yb290VGFibGUgPSByb290VGFibGU7CisgICAgICAgIHRoaXMuc2VydmljZXMgPSBzZXJ2aWNlczsKKyAgICAgICAgdGhpcy5hZHZhbmNlZEZlYXR1cmVzID0gYWR2YW5jZWRGZWF0dXJlczsKKyAgICAgICAgdGhpcy5mYnNGaWxlcyA9IGZic0ZpbGVzOworICAgIH0KKyAgICBwYWNrKGJ1aWxkZXIpIHsKKyAgICAgICAgY29uc3Qgb2JqZWN0cyA9IFNjaGVtYS5jcmVhdGVPYmplY3RzVmVjdG9yKGJ1aWxkZXIsIGJ1aWxkZXIuY3JlYXRlT2JqZWN0T2Zmc2V0TGlzdCh0aGlzLm9iamVjdHMpKTsKKyAgICAgICAgY29uc3QgZW51bXMgPSBTY2hlbWEuY3JlYXRlRW51bXNWZWN0b3IoYnVpbGRlciwgYnVpbGRlci5jcmVhdGVPYmplY3RPZmZzZXRMaXN0KHRoaXMuZW51bXMpKTsKKyAgICAgICAgY29uc3QgZmlsZUlkZW50ID0gKHRoaXMuZmlsZUlkZW50ICE9PSBudWxsID8gYnVpbGRlci5jcmVhdGVTdHJpbmcodGhpcy5maWxlSWRlbnQpIDogMCk7CisgICAgICAgIGNvbnN0IGZpbGVFeHQgPSAodGhpcy5maWxlRXh0ICE9PSBudWxsID8gYnVpbGRlci5jcmVhdGVTdHJpbmcodGhpcy5maWxlRXh0KSA6IDApOworICAgICAgICBjb25zdCByb290VGFibGUgPSAodGhpcy5yb290VGFibGUgIT09IG51bGwgPyB0aGlzLnJvb3RUYWJsZS5wYWNrKGJ1aWxkZXIpIDogMCk7CisgICAgICAgIGNvbnN0IHNlcnZpY2VzID0gU2NoZW1hLmNyZWF0ZVNlcnZpY2VzVmVjdG9yKGJ1aWxkZXIsIGJ1aWxkZXIuY3JlYXRlT2JqZWN0T2Zmc2V0TGlzdCh0aGlzLnNlcnZpY2VzKSk7CisgICAgICAgIGNvbnN0IGZic0ZpbGVzID0gU2NoZW1hLmNyZWF0ZUZic0ZpbGVzVmVjdG9yKGJ1aWxkZXIsIGJ1aWxkZXIuY3JlYXRlT2JqZWN0T2Zmc2V0TGlzdCh0aGlzLmZic0ZpbGVzKSk7CisgICAgICAgIFNjaGVtYS5zdGFydFNjaGVtYShidWlsZGVyKTsKKyAgICAgICAgU2NoZW1hLmFkZE9iamVjdHMoYnVpbGRlciwgb2JqZWN0cyk7CisgICAgICAgIFNjaGVtYS5hZGRFbnVtcyhidWlsZGVyLCBlbnVtcyk7CisgICAgICAgIFNjaGVtYS5hZGRGaWxlSWRlbnQoYnVpbGRlciwgZmlsZUlkZW50KTsKKyAgICAgICAgU2NoZW1hLmFkZEZpbGVFeHQoYnVpbGRlciwgZmlsZUV4dCk7CisgICAgICAgIFNjaGVtYS5hZGRSb290VGFibGUoYnVpbGRlciwgcm9vdFRhYmxlKTsKKyAgICAgICAgU2NoZW1hLmFkZFNlcnZpY2VzKGJ1aWxkZXIsIHNlcnZpY2VzKTsKKyAgICAgICAgU2NoZW1hLmFkZEFkdmFuY2VkRmVhdHVyZXMoYnVpbGRlciwgdGhpcy5hZHZhbmNlZEZlYXR1cmVzKTsKKyAgICAgICAgU2NoZW1hLmFkZEZic0ZpbGVzKGJ1aWxkZXIsIGZic0ZpbGVzKTsKKyAgICAgICAgcmV0dXJuIFNjaGVtYS5lbmRTY2hlbWEoYnVpbGRlcik7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvdHMvcmVmbGVjdGlvbl9nZW5lcmF0ZWQudHMgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy90cy9yZWZsZWN0aW9uX2dlbmVyYXRlZC50cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YmIxMjIyCi0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvdHMvcmVmbGVjdGlvbl9nZW5lcmF0ZWQudHMKQEAgLTAsMCArMSwyMTAwIEBACisvLyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBieSB0aGUgRmxhdEJ1ZmZlcnMgY29tcGlsZXIsIGRvIG5vdCBtb2RpZnkKKworaW1wb3J0ICogYXMgZmxhdGJ1ZmZlcnMgZnJvbSAnZmxhdGJ1ZmZlcnMnOworCisKK2V4cG9ydCBlbnVtIEJhc2VUeXBlIHsKKyAgTm9uZSA9IDAsCisgIFVUeXBlID0gMSwKKyAgQm9vbCA9IDIsCisgIEJ5dGUgPSAzLAorICBVQnl0ZSA9IDQsCisgIFNob3J0ID0gNSwKKyAgVVNob3J0ID0gNiwKKyAgSW50ID0gNywKKyAgVUludCA9IDgsCisgIExvbmcgPSA5LAorICBVTG9uZyA9IDEwLAorICBGbG9hdCA9IDExLAorICBEb3VibGUgPSAxMiwKKyAgU3RyaW5nID0gMTMsCisgIFZlY3RvciA9IDE0LAorICBPYmogPSAxNSwKKyAgVW5pb24gPSAxNiwKKyAgQXJyYXkgPSAxNywKKyAgTWF4QmFzZVR5cGUgPSAxOAorfQorCisvKioKKyAqIE5ldyBzY2hlbWEgbGFuZ3VhZ2UgZmVhdHVyZXMgdGhhdCBhcmUgbm90IHN1cHBvcnRlZCBieSBvbGQgY29kZSBnZW5lcmF0b3JzLgorICovCitleHBvcnQgZW51bSBBZHZhbmNlZEZlYXR1cmVzIHsKKyAgQWR2YW5jZWRBcnJheUZlYXR1cmVzID0gJzEnLAorICBBZHZhbmNlZFVuaW9uRmVhdHVyZXMgPSAnMicsCisgIE9wdGlvbmFsU2NhbGFycyA9ICc0JywKKyAgRGVmYXVsdFZlY3RvcnNBbmRTdHJpbmdzID0gJzgnCit9CisKK2V4cG9ydCBjbGFzcyBUeXBlIHsKKyAgYmI6IGZsYXRidWZmZXJzLkJ5dGVCdWZmZXJ8bnVsbCA9IG51bGw7CisgIGJiX3BvcyA9IDA7CisgIF9faW5pdChpOm51bWJlciwgYmI6ZmxhdGJ1ZmZlcnMuQnl0ZUJ1ZmZlcik6VHlwZSB7CisgIHRoaXMuYmJfcG9zID0gaTsKKyAgdGhpcy5iYiA9IGJiOworICByZXR1cm4gdGhpczsKK30KKworc3RhdGljIGdldFJvb3RBc1R5cGUoYmI6ZmxhdGJ1ZmZlcnMuQnl0ZUJ1ZmZlciwgb2JqPzpUeXBlKTpUeXBlIHsKKyAgcmV0dXJuIChvYmogfHwgbmV3IFR5cGUoKSkuX19pbml0KGJiLnJlYWRJbnQzMihiYi5wb3NpdGlvbigpKSArIGJiLnBvc2l0aW9uKCksIGJiKTsKK30KKworc3RhdGljIGdldFNpemVQcmVmaXhlZFJvb3RBc1R5cGUoYmI6ZmxhdGJ1ZmZlcnMuQnl0ZUJ1ZmZlciwgb2JqPzpUeXBlKTpUeXBlIHsKKyAgYmIuc2V0UG9zaXRpb24oYmIucG9zaXRpb24oKSArIGZsYXRidWZmZXJzLlNJWkVfUFJFRklYX0xFTkdUSCk7CisgIHJldHVybiAob2JqIHx8IG5ldyBUeXBlKCkpLl9faW5pdChiYi5yZWFkSW50MzIoYmIucG9zaXRpb24oKSkgKyBiYi5wb3NpdGlvbigpLCBiYik7Cit9CisKK2Jhc2VUeXBlKCk6QmFzZVR5cGUgeworICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiIS5fX29mZnNldCh0aGlzLmJiX3BvcywgNCk7CisgIHJldHVybiBvZmZzZXQgPyB0aGlzLmJiIS5yZWFkSW50OCh0aGlzLmJiX3BvcyArIG9mZnNldCkgOiBCYXNlVHlwZS5Ob25lOworfQorCittdXRhdGVfYmFzZV90eXBlKHZhbHVlOkJhc2VUeXBlKTpib29sZWFuIHsKKyAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYiEuX19vZmZzZXQodGhpcy5iYl9wb3MsIDQpOworCisgIGlmIChvZmZzZXQgPT09IDApIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICB0aGlzLmJiIS53cml0ZUludDgodGhpcy5iYl9wb3MgKyBvZmZzZXQsIHZhbHVlKTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK2VsZW1lbnQoKTpCYXNlVHlwZSB7CisgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIhLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCA2KTsKKyAgcmV0dXJuIG9mZnNldCA/IHRoaXMuYmIhLnJlYWRJbnQ4KHRoaXMuYmJfcG9zICsgb2Zmc2V0KSA6IEJhc2VUeXBlLk5vbmU7Cit9CisKK211dGF0ZV9lbGVtZW50KHZhbHVlOkJhc2VUeXBlKTpib29sZWFuIHsKKyAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYiEuX19vZmZzZXQodGhpcy5iYl9wb3MsIDYpOworCisgIGlmIChvZmZzZXQgPT09IDApIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICB0aGlzLmJiIS53cml0ZUludDgodGhpcy5iYl9wb3MgKyBvZmZzZXQsIHZhbHVlKTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK2luZGV4KCk6bnVtYmVyIHsKKyAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYiEuX19vZmZzZXQodGhpcy5iYl9wb3MsIDgpOworICByZXR1cm4gb2Zmc2V0ID8gdGhpcy5iYiEucmVhZEludDMyKHRoaXMuYmJfcG9zICsgb2Zmc2V0KSA6IC0xOworfQorCittdXRhdGVfaW5kZXgodmFsdWU6bnVtYmVyKTpib29sZWFuIHsKKyAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYiEuX19vZmZzZXQodGhpcy5iYl9wb3MsIDgpOworCisgIGlmIChvZmZzZXQgPT09IDApIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICB0aGlzLmJiIS53cml0ZUludDMyKHRoaXMuYmJfcG9zICsgb2Zmc2V0LCB2YWx1ZSk7CisgIHJldHVybiB0cnVlOworfQorCitmaXhlZExlbmd0aCgpOm51bWJlciB7CisgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIhLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCAxMCk7CisgIHJldHVybiBvZmZzZXQgPyB0aGlzLmJiIS5yZWFkVWludDE2KHRoaXMuYmJfcG9zICsgb2Zmc2V0KSA6IDA7Cit9CisKK211dGF0ZV9maXhlZF9sZW5ndGgodmFsdWU6bnVtYmVyKTpib29sZWFuIHsKKyAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYiEuX19vZmZzZXQodGhpcy5iYl9wb3MsIDEwKTsKKworICBpZiAob2Zmc2V0ID09PSAwKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgdGhpcy5iYiEud3JpdGVVaW50MTYodGhpcy5iYl9wb3MgKyBvZmZzZXQsIHZhbHVlKTsKKyAgcmV0dXJuIHRydWU7Cit9CisKKy8qKgorICogVGhlIHNpemUgKG9jdGV0cykgb2YgdGhlIGBiYXNlX3R5cGVgIGZpZWxkLgorICovCitiYXNlU2l6ZSgpOm51bWJlciB7CisgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIhLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCAxMik7CisgIHJldHVybiBvZmZzZXQgPyB0aGlzLmJiIS5yZWFkVWludDMyKHRoaXMuYmJfcG9zICsgb2Zmc2V0KSA6IDQ7Cit9CisKK211dGF0ZV9iYXNlX3NpemUodmFsdWU6bnVtYmVyKTpib29sZWFuIHsKKyAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYiEuX19vZmZzZXQodGhpcy5iYl9wb3MsIDEyKTsKKworICBpZiAob2Zmc2V0ID09PSAwKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgdGhpcy5iYiEud3JpdGVVaW50MzIodGhpcy5iYl9wb3MgKyBvZmZzZXQsIHZhbHVlKTsKKyAgcmV0dXJuIHRydWU7Cit9CisKKy8qKgorICogVGhlIHNpemUgKG9jdGV0cykgb2YgdGhlIGBlbGVtZW50YCBmaWVsZCwgaWYgcHJlc2VudC4KKyAqLworZWxlbWVudFNpemUoKTpudW1iZXIgeworICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiIS5fX29mZnNldCh0aGlzLmJiX3BvcywgMTQpOworICByZXR1cm4gb2Zmc2V0ID8gdGhpcy5iYiEucmVhZFVpbnQzMih0aGlzLmJiX3BvcyArIG9mZnNldCkgOiAwOworfQorCittdXRhdGVfZWxlbWVudF9zaXplKHZhbHVlOm51bWJlcik6Ym9vbGVhbiB7CisgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIhLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCAxNCk7CisKKyAgaWYgKG9mZnNldCA9PT0gMCkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHRoaXMuYmIhLndyaXRlVWludDMyKHRoaXMuYmJfcG9zICsgb2Zmc2V0LCB2YWx1ZSk7CisgIHJldHVybiB0cnVlOworfQorCitzdGF0aWMgZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCk6c3RyaW5nIHsKKyAgcmV0dXJuICdyZWZsZWN0aW9uX1R5cGUnOworfQorCitzdGF0aWMgc3RhcnRUeXBlKGJ1aWxkZXI6ZmxhdGJ1ZmZlcnMuQnVpbGRlcikgeworICBidWlsZGVyLnN0YXJ0T2JqZWN0KDYpOworfQorCitzdGF0aWMgYWRkQmFzZVR5cGUoYnVpbGRlcjpmbGF0YnVmZmVycy5CdWlsZGVyLCBiYXNlVHlwZTpCYXNlVHlwZSkgeworICBidWlsZGVyLmFkZEZpZWxkSW50OCgwLCBiYXNlVHlwZSwgQmFzZVR5cGUuTm9uZSk7Cit9CisKK3N0YXRpYyBhZGRFbGVtZW50KGJ1aWxkZXI6ZmxhdGJ1ZmZlcnMuQnVpbGRlciwgZWxlbWVudDpCYXNlVHlwZSkgeworICBidWlsZGVyLmFkZEZpZWxkSW50OCgxLCBlbGVtZW50LCBCYXNlVHlwZS5Ob25lKTsKK30KKworc3RhdGljIGFkZEluZGV4KGJ1aWxkZXI6ZmxhdGJ1ZmZlcnMuQnVpbGRlciwgaW5kZXg6bnVtYmVyKSB7CisgIGJ1aWxkZXIuYWRkRmllbGRJbnQzMigyLCBpbmRleCwgLTEpOworfQorCitzdGF0aWMgYWRkRml4ZWRMZW5ndGgoYnVpbGRlcjpmbGF0YnVmZmVycy5CdWlsZGVyLCBmaXhlZExlbmd0aDpudW1iZXIpIHsKKyAgYnVpbGRlci5hZGRGaWVsZEludDE2KDMsIGZpeGVkTGVuZ3RoLCAwKTsKK30KKworc3RhdGljIGFkZEJhc2VTaXplKGJ1aWxkZXI6ZmxhdGJ1ZmZlcnMuQnVpbGRlciwgYmFzZVNpemU6bnVtYmVyKSB7CisgIGJ1aWxkZXIuYWRkRmllbGRJbnQzMig0LCBiYXNlU2l6ZSwgNCk7Cit9CisKK3N0YXRpYyBhZGRFbGVtZW50U2l6ZShidWlsZGVyOmZsYXRidWZmZXJzLkJ1aWxkZXIsIGVsZW1lbnRTaXplOm51bWJlcikgeworICBidWlsZGVyLmFkZEZpZWxkSW50MzIoNSwgZWxlbWVudFNpemUsIDApOworfQorCitzdGF0aWMgZW5kVHlwZShidWlsZGVyOmZsYXRidWZmZXJzLkJ1aWxkZXIpOmZsYXRidWZmZXJzLk9mZnNldCB7CisgIGNvbnN0IG9mZnNldCA9IGJ1aWxkZXIuZW5kT2JqZWN0KCk7CisgIHJldHVybiBvZmZzZXQ7Cit9CisKK3N0YXRpYyBjcmVhdGVUeXBlKGJ1aWxkZXI6ZmxhdGJ1ZmZlcnMuQnVpbGRlciwgYmFzZVR5cGU6QmFzZVR5cGUsIGVsZW1lbnQ6QmFzZVR5cGUsIGluZGV4Om51bWJlciwgZml4ZWRMZW5ndGg6bnVtYmVyLCBiYXNlU2l6ZTpudW1iZXIsIGVsZW1lbnRTaXplOm51bWJlcik6ZmxhdGJ1ZmZlcnMuT2Zmc2V0IHsKKyAgVHlwZS5zdGFydFR5cGUoYnVpbGRlcik7CisgIFR5cGUuYWRkQmFzZVR5cGUoYnVpbGRlciwgYmFzZVR5cGUpOworICBUeXBlLmFkZEVsZW1lbnQoYnVpbGRlciwgZWxlbWVudCk7CisgIFR5cGUuYWRkSW5kZXgoYnVpbGRlciwgaW5kZXgpOworICBUeXBlLmFkZEZpeGVkTGVuZ3RoKGJ1aWxkZXIsIGZpeGVkTGVuZ3RoKTsKKyAgVHlwZS5hZGRCYXNlU2l6ZShidWlsZGVyLCBiYXNlU2l6ZSk7CisgIFR5cGUuYWRkRWxlbWVudFNpemUoYnVpbGRlciwgZWxlbWVudFNpemUpOworICByZXR1cm4gVHlwZS5lbmRUeXBlKGJ1aWxkZXIpOworfQorCit1bnBhY2soKTogVHlwZVQgeworICByZXR1cm4gbmV3IFR5cGVUKAorICAgIHRoaXMuYmFzZVR5cGUoKSwKKyAgICB0aGlzLmVsZW1lbnQoKSwKKyAgICB0aGlzLmluZGV4KCksCisgICAgdGhpcy5maXhlZExlbmd0aCgpLAorICAgIHRoaXMuYmFzZVNpemUoKSwKKyAgICB0aGlzLmVsZW1lbnRTaXplKCkKKyAgKTsKK30KKworCit1bnBhY2tUbyhfbzogVHlwZVQpOiB2b2lkIHsKKyAgX28uYmFzZVR5cGUgPSB0aGlzLmJhc2VUeXBlKCk7CisgIF9vLmVsZW1lbnQgPSB0aGlzLmVsZW1lbnQoKTsKKyAgX28uaW5kZXggPSB0aGlzLmluZGV4KCk7CisgIF9vLmZpeGVkTGVuZ3RoID0gdGhpcy5maXhlZExlbmd0aCgpOworICBfby5iYXNlU2l6ZSA9IHRoaXMuYmFzZVNpemUoKTsKKyAgX28uZWxlbWVudFNpemUgPSB0aGlzLmVsZW1lbnRTaXplKCk7Cit9Cit9CisKK2V4cG9ydCBjbGFzcyBUeXBlVCB7Citjb25zdHJ1Y3RvcigKKyAgcHVibGljIGJhc2VUeXBlOiBCYXNlVHlwZSA9IEJhc2VUeXBlLk5vbmUsCisgIHB1YmxpYyBlbGVtZW50OiBCYXNlVHlwZSA9IEJhc2VUeXBlLk5vbmUsCisgIHB1YmxpYyBpbmRleDogbnVtYmVyID0gLTEsCisgIHB1YmxpYyBmaXhlZExlbmd0aDogbnVtYmVyID0gMCwKKyAgcHVibGljIGJhc2VTaXplOiBudW1iZXIgPSA0LAorICBwdWJsaWMgZWxlbWVudFNpemU6IG51bWJlciA9IDAKKyl7fQorCisKK3BhY2soYnVpbGRlcjpmbGF0YnVmZmVycy5CdWlsZGVyKTogZmxhdGJ1ZmZlcnMuT2Zmc2V0IHsKKyAgcmV0dXJuIFR5cGUuY3JlYXRlVHlwZShidWlsZGVyLAorICAgIHRoaXMuYmFzZVR5cGUsCisgICAgdGhpcy5lbGVtZW50LAorICAgIHRoaXMuaW5kZXgsCisgICAgdGhpcy5maXhlZExlbmd0aCwKKyAgICB0aGlzLmJhc2VTaXplLAorICAgIHRoaXMuZWxlbWVudFNpemUKKyAgKTsKK30KK30KKworZXhwb3J0IGNsYXNzIEtleVZhbHVlIHsKKyAgYmI6IGZsYXRidWZmZXJzLkJ5dGVCdWZmZXJ8bnVsbCA9IG51bGw7CisgIGJiX3BvcyA9IDA7CisgIF9faW5pdChpOm51bWJlciwgYmI6ZmxhdGJ1ZmZlcnMuQnl0ZUJ1ZmZlcik6S2V5VmFsdWUgeworICB0aGlzLmJiX3BvcyA9IGk7CisgIHRoaXMuYmIgPSBiYjsKKyAgcmV0dXJuIHRoaXM7Cit9CisKK3N0YXRpYyBnZXRSb290QXNLZXlWYWx1ZShiYjpmbGF0YnVmZmVycy5CeXRlQnVmZmVyLCBvYmo/OktleVZhbHVlKTpLZXlWYWx1ZSB7CisgIHJldHVybiAob2JqIHx8IG5ldyBLZXlWYWx1ZSgpKS5fX2luaXQoYmIucmVhZEludDMyKGJiLnBvc2l0aW9uKCkpICsgYmIucG9zaXRpb24oKSwgYmIpOworfQorCitzdGF0aWMgZ2V0U2l6ZVByZWZpeGVkUm9vdEFzS2V5VmFsdWUoYmI6ZmxhdGJ1ZmZlcnMuQnl0ZUJ1ZmZlciwgb2JqPzpLZXlWYWx1ZSk6S2V5VmFsdWUgeworICBiYi5zZXRQb3NpdGlvbihiYi5wb3NpdGlvbigpICsgZmxhdGJ1ZmZlcnMuU0laRV9QUkVGSVhfTEVOR1RIKTsKKyAgcmV0dXJuIChvYmogfHwgbmV3IEtleVZhbHVlKCkpLl9faW5pdChiYi5yZWFkSW50MzIoYmIucG9zaXRpb24oKSkgKyBiYi5wb3NpdGlvbigpLCBiYik7Cit9CisKK2tleSgpOnN0cmluZ3xudWxsCitrZXkob3B0aW9uYWxFbmNvZGluZzpmbGF0YnVmZmVycy5FbmNvZGluZyk6c3RyaW5nfFVpbnQ4QXJyYXl8bnVsbAora2V5KG9wdGlvbmFsRW5jb2Rpbmc/OmFueSk6c3RyaW5nfFVpbnQ4QXJyYXl8bnVsbCB7CisgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIhLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCA0KTsKKyAgcmV0dXJuIG9mZnNldCA/IHRoaXMuYmIhLl9fc3RyaW5nKHRoaXMuYmJfcG9zICsgb2Zmc2V0LCBvcHRpb25hbEVuY29kaW5nKSA6IG51bGw7Cit9CisKK3ZhbHVlKCk6c3RyaW5nfG51bGwKK3ZhbHVlKG9wdGlvbmFsRW5jb2Rpbmc6ZmxhdGJ1ZmZlcnMuRW5jb2RpbmcpOnN0cmluZ3xVaW50OEFycmF5fG51bGwKK3ZhbHVlKG9wdGlvbmFsRW5jb2Rpbmc/OmFueSk6c3RyaW5nfFVpbnQ4QXJyYXl8bnVsbCB7CisgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIhLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCA2KTsKKyAgcmV0dXJuIG9mZnNldCA/IHRoaXMuYmIhLl9fc3RyaW5nKHRoaXMuYmJfcG9zICsgb2Zmc2V0LCBvcHRpb25hbEVuY29kaW5nKSA6IG51bGw7Cit9CisKK3N0YXRpYyBnZXRGdWxseVF1YWxpZmllZE5hbWUoKTpzdHJpbmcgeworICByZXR1cm4gJ3JlZmxlY3Rpb25fS2V5VmFsdWUnOworfQorCitzdGF0aWMgc3RhcnRLZXlWYWx1ZShidWlsZGVyOmZsYXRidWZmZXJzLkJ1aWxkZXIpIHsKKyAgYnVpbGRlci5zdGFydE9iamVjdCgyKTsKK30KKworc3RhdGljIGFkZEtleShidWlsZGVyOmZsYXRidWZmZXJzLkJ1aWxkZXIsIGtleU9mZnNldDpmbGF0YnVmZmVycy5PZmZzZXQpIHsKKyAgYnVpbGRlci5hZGRGaWVsZE9mZnNldCgwLCBrZXlPZmZzZXQsIDApOworfQorCitzdGF0aWMgYWRkVmFsdWUoYnVpbGRlcjpmbGF0YnVmZmVycy5CdWlsZGVyLCB2YWx1ZU9mZnNldDpmbGF0YnVmZmVycy5PZmZzZXQpIHsKKyAgYnVpbGRlci5hZGRGaWVsZE9mZnNldCgxLCB2YWx1ZU9mZnNldCwgMCk7Cit9CisKK3N0YXRpYyBlbmRLZXlWYWx1ZShidWlsZGVyOmZsYXRidWZmZXJzLkJ1aWxkZXIpOmZsYXRidWZmZXJzLk9mZnNldCB7CisgIGNvbnN0IG9mZnNldCA9IGJ1aWxkZXIuZW5kT2JqZWN0KCk7CisgIGJ1aWxkZXIucmVxdWlyZWRGaWVsZChvZmZzZXQsIDQpIC8vIGtleQorICByZXR1cm4gb2Zmc2V0OworfQorCitzdGF0aWMgY3JlYXRlS2V5VmFsdWUoYnVpbGRlcjpmbGF0YnVmZmVycy5CdWlsZGVyLCBrZXlPZmZzZXQ6ZmxhdGJ1ZmZlcnMuT2Zmc2V0LCB2YWx1ZU9mZnNldDpmbGF0YnVmZmVycy5PZmZzZXQpOmZsYXRidWZmZXJzLk9mZnNldCB7CisgIEtleVZhbHVlLnN0YXJ0S2V5VmFsdWUoYnVpbGRlcik7CisgIEtleVZhbHVlLmFkZEtleShidWlsZGVyLCBrZXlPZmZzZXQpOworICBLZXlWYWx1ZS5hZGRWYWx1ZShidWlsZGVyLCB2YWx1ZU9mZnNldCk7CisgIHJldHVybiBLZXlWYWx1ZS5lbmRLZXlWYWx1ZShidWlsZGVyKTsKK30KKwordW5wYWNrKCk6IEtleVZhbHVlVCB7CisgIHJldHVybiBuZXcgS2V5VmFsdWVUKAorICAgIHRoaXMua2V5KCksCisgICAgdGhpcy52YWx1ZSgpCisgICk7Cit9CisKKwordW5wYWNrVG8oX286IEtleVZhbHVlVCk6IHZvaWQgeworICBfby5rZXkgPSB0aGlzLmtleSgpOworICBfby52YWx1ZSA9IHRoaXMudmFsdWUoKTsKK30KK30KKworZXhwb3J0IGNsYXNzIEtleVZhbHVlVCB7Citjb25zdHJ1Y3RvcigKKyAgcHVibGljIGtleTogc3RyaW5nfFVpbnQ4QXJyYXl8bnVsbCA9IG51bGwsCisgIHB1YmxpYyB2YWx1ZTogc3RyaW5nfFVpbnQ4QXJyYXl8bnVsbCA9IG51bGwKKyl7fQorCisKK3BhY2soYnVpbGRlcjpmbGF0YnVmZmVycy5CdWlsZGVyKTogZmxhdGJ1ZmZlcnMuT2Zmc2V0IHsKKyAgY29uc3Qga2V5ID0gKHRoaXMua2V5ICE9PSBudWxsID8gYnVpbGRlci5jcmVhdGVTdHJpbmcodGhpcy5rZXkhKSA6IDApOworICBjb25zdCB2YWx1ZSA9ICh0aGlzLnZhbHVlICE9PSBudWxsID8gYnVpbGRlci5jcmVhdGVTdHJpbmcodGhpcy52YWx1ZSEpIDogMCk7CisKKyAgcmV0dXJuIEtleVZhbHVlLmNyZWF0ZUtleVZhbHVlKGJ1aWxkZXIsCisgICAga2V5LAorICAgIHZhbHVlCisgICk7Cit9Cit9CisKK2V4cG9ydCBjbGFzcyBFbnVtVmFsIHsKKyAgYmI6IGZsYXRidWZmZXJzLkJ5dGVCdWZmZXJ8bnVsbCA9IG51bGw7CisgIGJiX3BvcyA9IDA7CisgIF9faW5pdChpOm51bWJlciwgYmI6ZmxhdGJ1ZmZlcnMuQnl0ZUJ1ZmZlcik6RW51bVZhbCB7CisgIHRoaXMuYmJfcG9zID0gaTsKKyAgdGhpcy5iYiA9IGJiOworICByZXR1cm4gdGhpczsKK30KKworc3RhdGljIGdldFJvb3RBc0VudW1WYWwoYmI6ZmxhdGJ1ZmZlcnMuQnl0ZUJ1ZmZlciwgb2JqPzpFbnVtVmFsKTpFbnVtVmFsIHsKKyAgcmV0dXJuIChvYmogfHwgbmV3IEVudW1WYWwoKSkuX19pbml0KGJiLnJlYWRJbnQzMihiYi5wb3NpdGlvbigpKSArIGJiLnBvc2l0aW9uKCksIGJiKTsKK30KKworc3RhdGljIGdldFNpemVQcmVmaXhlZFJvb3RBc0VudW1WYWwoYmI6ZmxhdGJ1ZmZlcnMuQnl0ZUJ1ZmZlciwgb2JqPzpFbnVtVmFsKTpFbnVtVmFsIHsKKyAgYmIuc2V0UG9zaXRpb24oYmIucG9zaXRpb24oKSArIGZsYXRidWZmZXJzLlNJWkVfUFJFRklYX0xFTkdUSCk7CisgIHJldHVybiAob2JqIHx8IG5ldyBFbnVtVmFsKCkpLl9faW5pdChiYi5yZWFkSW50MzIoYmIucG9zaXRpb24oKSkgKyBiYi5wb3NpdGlvbigpLCBiYik7Cit9CisKK25hbWUoKTpzdHJpbmd8bnVsbAorbmFtZShvcHRpb25hbEVuY29kaW5nOmZsYXRidWZmZXJzLkVuY29kaW5nKTpzdHJpbmd8VWludDhBcnJheXxudWxsCituYW1lKG9wdGlvbmFsRW5jb2Rpbmc/OmFueSk6c3RyaW5nfFVpbnQ4QXJyYXl8bnVsbCB7CisgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIhLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCA0KTsKKyAgcmV0dXJuIG9mZnNldCA/IHRoaXMuYmIhLl9fc3RyaW5nKHRoaXMuYmJfcG9zICsgb2Zmc2V0LCBvcHRpb25hbEVuY29kaW5nKSA6IG51bGw7Cit9CisKK3ZhbHVlKCk6YmlnaW50IHsKKyAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYiEuX19vZmZzZXQodGhpcy5iYl9wb3MsIDYpOworICByZXR1cm4gb2Zmc2V0ID8gdGhpcy5iYiEucmVhZEludDY0KHRoaXMuYmJfcG9zICsgb2Zmc2V0KSA6IEJpZ0ludCgnMCcpOworfQorCittdXRhdGVfdmFsdWUodmFsdWU6YmlnaW50KTpib29sZWFuIHsKKyAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYiEuX19vZmZzZXQodGhpcy5iYl9wb3MsIDYpOworCisgIGlmIChvZmZzZXQgPT09IDApIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICB0aGlzLmJiIS53cml0ZUludDY0KHRoaXMuYmJfcG9zICsgb2Zmc2V0LCB2YWx1ZSk7CisgIHJldHVybiB0cnVlOworfQorCit1bmlvblR5cGUob2JqPzpUeXBlKTpUeXBlfG51bGwgeworICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiIS5fX29mZnNldCh0aGlzLmJiX3BvcywgMTApOworICByZXR1cm4gb2Zmc2V0ID8gKG9iaiB8fCBuZXcgVHlwZSgpKS5fX2luaXQodGhpcy5iYiEuX19pbmRpcmVjdCh0aGlzLmJiX3BvcyArIG9mZnNldCksIHRoaXMuYmIhKSA6IG51bGw7Cit9CisKK2RvY3VtZW50YXRpb24oaW5kZXg6IG51bWJlcik6c3RyaW5nCitkb2N1bWVudGF0aW9uKGluZGV4OiBudW1iZXIsb3B0aW9uYWxFbmNvZGluZzpmbGF0YnVmZmVycy5FbmNvZGluZyk6c3RyaW5nfFVpbnQ4QXJyYXkKK2RvY3VtZW50YXRpb24oaW5kZXg6IG51bWJlcixvcHRpb25hbEVuY29kaW5nPzphbnkpOnN0cmluZ3xVaW50OEFycmF5fG51bGwgeworICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiIS5fX29mZnNldCh0aGlzLmJiX3BvcywgMTIpOworICByZXR1cm4gb2Zmc2V0ID8gdGhpcy5iYiEuX19zdHJpbmcodGhpcy5iYiEuX192ZWN0b3IodGhpcy5iYl9wb3MgKyBvZmZzZXQpICsgaW5kZXggKiA0LCBvcHRpb25hbEVuY29kaW5nKSA6IG51bGw7Cit9CisKK2RvY3VtZW50YXRpb25MZW5ndGgoKTpudW1iZXIgeworICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiIS5fX29mZnNldCh0aGlzLmJiX3BvcywgMTIpOworICByZXR1cm4gb2Zmc2V0ID8gdGhpcy5iYiEuX192ZWN0b3JfbGVuKHRoaXMuYmJfcG9zICsgb2Zmc2V0KSA6IDA7Cit9CisKK3N0YXRpYyBnZXRGdWxseVF1YWxpZmllZE5hbWUoKTpzdHJpbmcgeworICByZXR1cm4gJ3JlZmxlY3Rpb25fRW51bVZhbCc7Cit9CisKK3N0YXRpYyBzdGFydEVudW1WYWwoYnVpbGRlcjpmbGF0YnVmZmVycy5CdWlsZGVyKSB7CisgIGJ1aWxkZXIuc3RhcnRPYmplY3QoNSk7Cit9CisKK3N0YXRpYyBhZGROYW1lKGJ1aWxkZXI6ZmxhdGJ1ZmZlcnMuQnVpbGRlciwgbmFtZU9mZnNldDpmbGF0YnVmZmVycy5PZmZzZXQpIHsKKyAgYnVpbGRlci5hZGRGaWVsZE9mZnNldCgwLCBuYW1lT2Zmc2V0LCAwKTsKK30KKworc3RhdGljIGFkZFZhbHVlKGJ1aWxkZXI6ZmxhdGJ1ZmZlcnMuQnVpbGRlciwgdmFsdWU6YmlnaW50KSB7CisgIGJ1aWxkZXIuYWRkRmllbGRJbnQ2NCgxLCB2YWx1ZSwgQmlnSW50KCcwJykpOworfQorCitzdGF0aWMgYWRkVW5pb25UeXBlKGJ1aWxkZXI6ZmxhdGJ1ZmZlcnMuQnVpbGRlciwgdW5pb25UeXBlT2Zmc2V0OmZsYXRidWZmZXJzLk9mZnNldCkgeworICBidWlsZGVyLmFkZEZpZWxkT2Zmc2V0KDMsIHVuaW9uVHlwZU9mZnNldCwgMCk7Cit9CisKK3N0YXRpYyBhZGREb2N1bWVudGF0aW9uKGJ1aWxkZXI6ZmxhdGJ1ZmZlcnMuQnVpbGRlciwgZG9jdW1lbnRhdGlvbk9mZnNldDpmbGF0YnVmZmVycy5PZmZzZXQpIHsKKyAgYnVpbGRlci5hZGRGaWVsZE9mZnNldCg0LCBkb2N1bWVudGF0aW9uT2Zmc2V0LCAwKTsKK30KKworc3RhdGljIGNyZWF0ZURvY3VtZW50YXRpb25WZWN0b3IoYnVpbGRlcjpmbGF0YnVmZmVycy5CdWlsZGVyLCBkYXRhOmZsYXRidWZmZXJzLk9mZnNldFtdKTpmbGF0YnVmZmVycy5PZmZzZXQgeworICBidWlsZGVyLnN0YXJ0VmVjdG9yKDQsIGRhdGEubGVuZ3RoLCA0KTsKKyAgZm9yIChsZXQgaSA9IGRhdGEubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHsKKyAgICBidWlsZGVyLmFkZE9mZnNldChkYXRhW2ldISk7CisgIH0KKyAgcmV0dXJuIGJ1aWxkZXIuZW5kVmVjdG9yKCk7Cit9CisKK3N0YXRpYyBzdGFydERvY3VtZW50YXRpb25WZWN0b3IoYnVpbGRlcjpmbGF0YnVmZmVycy5CdWlsZGVyLCBudW1FbGVtczpudW1iZXIpIHsKKyAgYnVpbGRlci5zdGFydFZlY3Rvcig0LCBudW1FbGVtcywgNCk7Cit9CisKK3N0YXRpYyBlbmRFbnVtVmFsKGJ1aWxkZXI6ZmxhdGJ1ZmZlcnMuQnVpbGRlcik6ZmxhdGJ1ZmZlcnMuT2Zmc2V0IHsKKyAgY29uc3Qgb2Zmc2V0ID0gYnVpbGRlci5lbmRPYmplY3QoKTsKKyAgYnVpbGRlci5yZXF1aXJlZEZpZWxkKG9mZnNldCwgNCkgLy8gbmFtZQorICByZXR1cm4gb2Zmc2V0OworfQorCisKK3VucGFjaygpOiBFbnVtVmFsVCB7CisgIHJldHVybiBuZXcgRW51bVZhbFQoCisgICAgdGhpcy5uYW1lKCksCisgICAgdGhpcy52YWx1ZSgpLAorICAgICh0aGlzLnVuaW9uVHlwZSgpICE9PSBudWxsID8gdGhpcy51bmlvblR5cGUoKSEudW5wYWNrKCkgOiBudWxsKSwKKyAgICB0aGlzLmJiIS5jcmVhdGVTY2FsYXJMaXN0KHRoaXMuZG9jdW1lbnRhdGlvbi5iaW5kKHRoaXMpLCB0aGlzLmRvY3VtZW50YXRpb25MZW5ndGgoKSkKKyAgKTsKK30KKworCit1bnBhY2tUbyhfbzogRW51bVZhbFQpOiB2b2lkIHsKKyAgX28ubmFtZSA9IHRoaXMubmFtZSgpOworICBfby52YWx1ZSA9IHRoaXMudmFsdWUoKTsKKyAgX28udW5pb25UeXBlID0gKHRoaXMudW5pb25UeXBlKCkgIT09IG51bGwgPyB0aGlzLnVuaW9uVHlwZSgpIS51bnBhY2soKSA6IG51bGwpOworICBfby5kb2N1bWVudGF0aW9uID0gdGhpcy5iYiEuY3JlYXRlU2NhbGFyTGlzdCh0aGlzLmRvY3VtZW50YXRpb24uYmluZCh0aGlzKSwgdGhpcy5kb2N1bWVudGF0aW9uTGVuZ3RoKCkpOworfQorfQorCitleHBvcnQgY2xhc3MgRW51bVZhbFQgeworY29uc3RydWN0b3IoCisgIHB1YmxpYyBuYW1lOiBzdHJpbmd8VWludDhBcnJheXxudWxsID0gbnVsbCwKKyAgcHVibGljIHZhbHVlOiBiaWdpbnQgPSBCaWdJbnQoJzAnKSwKKyAgcHVibGljIHVuaW9uVHlwZTogVHlwZVR8bnVsbCA9IG51bGwsCisgIHB1YmxpYyBkb2N1bWVudGF0aW9uOiAoc3RyaW5nKVtdID0gW10KKyl7fQorCisKK3BhY2soYnVpbGRlcjpmbGF0YnVmZmVycy5CdWlsZGVyKTogZmxhdGJ1ZmZlcnMuT2Zmc2V0IHsKKyAgY29uc3QgbmFtZSA9ICh0aGlzLm5hbWUgIT09IG51bGwgPyBidWlsZGVyLmNyZWF0ZVN0cmluZyh0aGlzLm5hbWUhKSA6IDApOworICBjb25zdCB1bmlvblR5cGUgPSAodGhpcy51bmlvblR5cGUgIT09IG51bGwgPyB0aGlzLnVuaW9uVHlwZSEucGFjayhidWlsZGVyKSA6IDApOworICBjb25zdCBkb2N1bWVudGF0aW9uID0gRW51bVZhbC5jcmVhdGVEb2N1bWVudGF0aW9uVmVjdG9yKGJ1aWxkZXIsIGJ1aWxkZXIuY3JlYXRlT2JqZWN0T2Zmc2V0TGlzdCh0aGlzLmRvY3VtZW50YXRpb24pKTsKKworICBFbnVtVmFsLnN0YXJ0RW51bVZhbChidWlsZGVyKTsKKyAgRW51bVZhbC5hZGROYW1lKGJ1aWxkZXIsIG5hbWUpOworICBFbnVtVmFsLmFkZFZhbHVlKGJ1aWxkZXIsIHRoaXMudmFsdWUpOworICBFbnVtVmFsLmFkZFVuaW9uVHlwZShidWlsZGVyLCB1bmlvblR5cGUpOworICBFbnVtVmFsLmFkZERvY3VtZW50YXRpb24oYnVpbGRlciwgZG9jdW1lbnRhdGlvbik7CisKKyAgcmV0dXJuIEVudW1WYWwuZW5kRW51bVZhbChidWlsZGVyKTsKK30KK30KKworZXhwb3J0IGNsYXNzIEVudW0geworICBiYjogZmxhdGJ1ZmZlcnMuQnl0ZUJ1ZmZlcnxudWxsID0gbnVsbDsKKyAgYmJfcG9zID0gMDsKKyAgX19pbml0KGk6bnVtYmVyLCBiYjpmbGF0YnVmZmVycy5CeXRlQnVmZmVyKTpFbnVtIHsKKyAgdGhpcy5iYl9wb3MgPSBpOworICB0aGlzLmJiID0gYmI7CisgIHJldHVybiB0aGlzOworfQorCitzdGF0aWMgZ2V0Um9vdEFzRW51bShiYjpmbGF0YnVmZmVycy5CeXRlQnVmZmVyLCBvYmo/OkVudW0pOkVudW0geworICByZXR1cm4gKG9iaiB8fCBuZXcgRW51bSgpKS5fX2luaXQoYmIucmVhZEludDMyKGJiLnBvc2l0aW9uKCkpICsgYmIucG9zaXRpb24oKSwgYmIpOworfQorCitzdGF0aWMgZ2V0U2l6ZVByZWZpeGVkUm9vdEFzRW51bShiYjpmbGF0YnVmZmVycy5CeXRlQnVmZmVyLCBvYmo/OkVudW0pOkVudW0geworICBiYi5zZXRQb3NpdGlvbihiYi5wb3NpdGlvbigpICsgZmxhdGJ1ZmZlcnMuU0laRV9QUkVGSVhfTEVOR1RIKTsKKyAgcmV0dXJuIChvYmogfHwgbmV3IEVudW0oKSkuX19pbml0KGJiLnJlYWRJbnQzMihiYi5wb3NpdGlvbigpKSArIGJiLnBvc2l0aW9uKCksIGJiKTsKK30KKworbmFtZSgpOnN0cmluZ3xudWxsCituYW1lKG9wdGlvbmFsRW5jb2Rpbmc6ZmxhdGJ1ZmZlcnMuRW5jb2RpbmcpOnN0cmluZ3xVaW50OEFycmF5fG51bGwKK25hbWUob3B0aW9uYWxFbmNvZGluZz86YW55KTpzdHJpbmd8VWludDhBcnJheXxudWxsIHsKKyAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYiEuX19vZmZzZXQodGhpcy5iYl9wb3MsIDQpOworICByZXR1cm4gb2Zmc2V0ID8gdGhpcy5iYiEuX19zdHJpbmcodGhpcy5iYl9wb3MgKyBvZmZzZXQsIG9wdGlvbmFsRW5jb2RpbmcpIDogbnVsbDsKK30KKwordmFsdWVzKGluZGV4OiBudW1iZXIsIG9iaj86RW51bVZhbCk6RW51bVZhbHxudWxsIHsKKyAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYiEuX19vZmZzZXQodGhpcy5iYl9wb3MsIDYpOworICByZXR1cm4gb2Zmc2V0ID8gKG9iaiB8fCBuZXcgRW51bVZhbCgpKS5fX2luaXQodGhpcy5iYiEuX19pbmRpcmVjdCh0aGlzLmJiIS5fX3ZlY3Rvcih0aGlzLmJiX3BvcyArIG9mZnNldCkgKyBpbmRleCAqIDQpLCB0aGlzLmJiISkgOiBudWxsOworfQorCit2YWx1ZXNMZW5ndGgoKTpudW1iZXIgeworICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiIS5fX29mZnNldCh0aGlzLmJiX3BvcywgNik7CisgIHJldHVybiBvZmZzZXQgPyB0aGlzLmJiIS5fX3ZlY3Rvcl9sZW4odGhpcy5iYl9wb3MgKyBvZmZzZXQpIDogMDsKK30KKworaXNVbmlvbigpOmJvb2xlYW4geworICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiIS5fX29mZnNldCh0aGlzLmJiX3BvcywgOCk7CisgIHJldHVybiBvZmZzZXQgPyAhIXRoaXMuYmIhLnJlYWRJbnQ4KHRoaXMuYmJfcG9zICsgb2Zmc2V0KSA6IGZhbHNlOworfQorCittdXRhdGVfaXNfdW5pb24odmFsdWU6Ym9vbGVhbik6Ym9vbGVhbiB7CisgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIhLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCA4KTsKKworICBpZiAob2Zmc2V0ID09PSAwKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgdGhpcy5iYiEud3JpdGVJbnQ4KHRoaXMuYmJfcG9zICsgb2Zmc2V0LCArdmFsdWUpOworICByZXR1cm4gdHJ1ZTsKK30KKwordW5kZXJseWluZ1R5cGUob2JqPzpUeXBlKTpUeXBlfG51bGwgeworICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiIS5fX29mZnNldCh0aGlzLmJiX3BvcywgMTApOworICByZXR1cm4gb2Zmc2V0ID8gKG9iaiB8fCBuZXcgVHlwZSgpKS5fX2luaXQodGhpcy5iYiEuX19pbmRpcmVjdCh0aGlzLmJiX3BvcyArIG9mZnNldCksIHRoaXMuYmIhKSA6IG51bGw7Cit9CisKK2F0dHJpYnV0ZXMoaW5kZXg6IG51bWJlciwgb2JqPzpLZXlWYWx1ZSk6S2V5VmFsdWV8bnVsbCB7CisgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIhLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCAxMik7CisgIHJldHVybiBvZmZzZXQgPyAob2JqIHx8IG5ldyBLZXlWYWx1ZSgpKS5fX2luaXQodGhpcy5iYiEuX19pbmRpcmVjdCh0aGlzLmJiIS5fX3ZlY3Rvcih0aGlzLmJiX3BvcyArIG9mZnNldCkgKyBpbmRleCAqIDQpLCB0aGlzLmJiISkgOiBudWxsOworfQorCithdHRyaWJ1dGVzTGVuZ3RoKCk6bnVtYmVyIHsKKyAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYiEuX19vZmZzZXQodGhpcy5iYl9wb3MsIDEyKTsKKyAgcmV0dXJuIG9mZnNldCA/IHRoaXMuYmIhLl9fdmVjdG9yX2xlbih0aGlzLmJiX3BvcyArIG9mZnNldCkgOiAwOworfQorCitkb2N1bWVudGF0aW9uKGluZGV4OiBudW1iZXIpOnN0cmluZworZG9jdW1lbnRhdGlvbihpbmRleDogbnVtYmVyLG9wdGlvbmFsRW5jb2Rpbmc6ZmxhdGJ1ZmZlcnMuRW5jb2RpbmcpOnN0cmluZ3xVaW50OEFycmF5Citkb2N1bWVudGF0aW9uKGluZGV4OiBudW1iZXIsb3B0aW9uYWxFbmNvZGluZz86YW55KTpzdHJpbmd8VWludDhBcnJheXxudWxsIHsKKyAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYiEuX19vZmZzZXQodGhpcy5iYl9wb3MsIDE0KTsKKyAgcmV0dXJuIG9mZnNldCA/IHRoaXMuYmIhLl9fc3RyaW5nKHRoaXMuYmIhLl9fdmVjdG9yKHRoaXMuYmJfcG9zICsgb2Zmc2V0KSArIGluZGV4ICogNCwgb3B0aW9uYWxFbmNvZGluZykgOiBudWxsOworfQorCitkb2N1bWVudGF0aW9uTGVuZ3RoKCk6bnVtYmVyIHsKKyAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYiEuX19vZmZzZXQodGhpcy5iYl9wb3MsIDE0KTsKKyAgcmV0dXJuIG9mZnNldCA/IHRoaXMuYmIhLl9fdmVjdG9yX2xlbih0aGlzLmJiX3BvcyArIG9mZnNldCkgOiAwOworfQorCisvKioKKyAqIEZpbGUgdGhhdCB0aGlzIEVudW0gaXMgZGVjbGFyZWQgaW4uCisgKi8KK2RlY2xhcmF0aW9uRmlsZSgpOnN0cmluZ3xudWxsCitkZWNsYXJhdGlvbkZpbGUob3B0aW9uYWxFbmNvZGluZzpmbGF0YnVmZmVycy5FbmNvZGluZyk6c3RyaW5nfFVpbnQ4QXJyYXl8bnVsbAorZGVjbGFyYXRpb25GaWxlKG9wdGlvbmFsRW5jb2Rpbmc/OmFueSk6c3RyaW5nfFVpbnQ4QXJyYXl8bnVsbCB7CisgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIhLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCAxNik7CisgIHJldHVybiBvZmZzZXQgPyB0aGlzLmJiIS5fX3N0cmluZyh0aGlzLmJiX3BvcyArIG9mZnNldCwgb3B0aW9uYWxFbmNvZGluZykgOiBudWxsOworfQorCitzdGF0aWMgZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCk6c3RyaW5nIHsKKyAgcmV0dXJuICdyZWZsZWN0aW9uX0VudW0nOworfQorCitzdGF0aWMgc3RhcnRFbnVtKGJ1aWxkZXI6ZmxhdGJ1ZmZlcnMuQnVpbGRlcikgeworICBidWlsZGVyLnN0YXJ0T2JqZWN0KDcpOworfQorCitzdGF0aWMgYWRkTmFtZShidWlsZGVyOmZsYXRidWZmZXJzLkJ1aWxkZXIsIG5hbWVPZmZzZXQ6ZmxhdGJ1ZmZlcnMuT2Zmc2V0KSB7CisgIGJ1aWxkZXIuYWRkRmllbGRPZmZzZXQoMCwgbmFtZU9mZnNldCwgMCk7Cit9CisKK3N0YXRpYyBhZGRWYWx1ZXMoYnVpbGRlcjpmbGF0YnVmZmVycy5CdWlsZGVyLCB2YWx1ZXNPZmZzZXQ6ZmxhdGJ1ZmZlcnMuT2Zmc2V0KSB7CisgIGJ1aWxkZXIuYWRkRmllbGRPZmZzZXQoMSwgdmFsdWVzT2Zmc2V0LCAwKTsKK30KKworc3RhdGljIGNyZWF0ZVZhbHVlc1ZlY3RvcihidWlsZGVyOmZsYXRidWZmZXJzLkJ1aWxkZXIsIGRhdGE6ZmxhdGJ1ZmZlcnMuT2Zmc2V0W10pOmZsYXRidWZmZXJzLk9mZnNldCB7CisgIGJ1aWxkZXIuc3RhcnRWZWN0b3IoNCwgZGF0YS5sZW5ndGgsIDQpOworICBmb3IgKGxldCBpID0gZGF0YS5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgeworICAgIGJ1aWxkZXIuYWRkT2Zmc2V0KGRhdGFbaV0hKTsKKyAgfQorICByZXR1cm4gYnVpbGRlci5lbmRWZWN0b3IoKTsKK30KKworc3RhdGljIHN0YXJ0VmFsdWVzVmVjdG9yKGJ1aWxkZXI6ZmxhdGJ1ZmZlcnMuQnVpbGRlciwgbnVtRWxlbXM6bnVtYmVyKSB7CisgIGJ1aWxkZXIuc3RhcnRWZWN0b3IoNCwgbnVtRWxlbXMsIDQpOworfQorCitzdGF0aWMgYWRkSXNVbmlvbihidWlsZGVyOmZsYXRidWZmZXJzLkJ1aWxkZXIsIGlzVW5pb246Ym9vbGVhbikgeworICBidWlsZGVyLmFkZEZpZWxkSW50OCgyLCAraXNVbmlvbiwgK2ZhbHNlKTsKK30KKworc3RhdGljIGFkZFVuZGVybHlpbmdUeXBlKGJ1aWxkZXI6ZmxhdGJ1ZmZlcnMuQnVpbGRlciwgdW5kZXJseWluZ1R5cGVPZmZzZXQ6ZmxhdGJ1ZmZlcnMuT2Zmc2V0KSB7CisgIGJ1aWxkZXIuYWRkRmllbGRPZmZzZXQoMywgdW5kZXJseWluZ1R5cGVPZmZzZXQsIDApOworfQorCitzdGF0aWMgYWRkQXR0cmlidXRlcyhidWlsZGVyOmZsYXRidWZmZXJzLkJ1aWxkZXIsIGF0dHJpYnV0ZXNPZmZzZXQ6ZmxhdGJ1ZmZlcnMuT2Zmc2V0KSB7CisgIGJ1aWxkZXIuYWRkRmllbGRPZmZzZXQoNCwgYXR0cmlidXRlc09mZnNldCwgMCk7Cit9CisKK3N0YXRpYyBjcmVhdGVBdHRyaWJ1dGVzVmVjdG9yKGJ1aWxkZXI6ZmxhdGJ1ZmZlcnMuQnVpbGRlciwgZGF0YTpmbGF0YnVmZmVycy5PZmZzZXRbXSk6ZmxhdGJ1ZmZlcnMuT2Zmc2V0IHsKKyAgYnVpbGRlci5zdGFydFZlY3Rvcig0LCBkYXRhLmxlbmd0aCwgNCk7CisgIGZvciAobGV0IGkgPSBkYXRhLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7CisgICAgYnVpbGRlci5hZGRPZmZzZXQoZGF0YVtpXSEpOworICB9CisgIHJldHVybiBidWlsZGVyLmVuZFZlY3RvcigpOworfQorCitzdGF0aWMgc3RhcnRBdHRyaWJ1dGVzVmVjdG9yKGJ1aWxkZXI6ZmxhdGJ1ZmZlcnMuQnVpbGRlciwgbnVtRWxlbXM6bnVtYmVyKSB7CisgIGJ1aWxkZXIuc3RhcnRWZWN0b3IoNCwgbnVtRWxlbXMsIDQpOworfQorCitzdGF0aWMgYWRkRG9jdW1lbnRhdGlvbihidWlsZGVyOmZsYXRidWZmZXJzLkJ1aWxkZXIsIGRvY3VtZW50YXRpb25PZmZzZXQ6ZmxhdGJ1ZmZlcnMuT2Zmc2V0KSB7CisgIGJ1aWxkZXIuYWRkRmllbGRPZmZzZXQoNSwgZG9jdW1lbnRhdGlvbk9mZnNldCwgMCk7Cit9CisKK3N0YXRpYyBjcmVhdGVEb2N1bWVudGF0aW9uVmVjdG9yKGJ1aWxkZXI6ZmxhdGJ1ZmZlcnMuQnVpbGRlciwgZGF0YTpmbGF0YnVmZmVycy5PZmZzZXRbXSk6ZmxhdGJ1ZmZlcnMuT2Zmc2V0IHsKKyAgYnVpbGRlci5zdGFydFZlY3Rvcig0LCBkYXRhLmxlbmd0aCwgNCk7CisgIGZvciAobGV0IGkgPSBkYXRhLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7CisgICAgYnVpbGRlci5hZGRPZmZzZXQoZGF0YVtpXSEpOworICB9CisgIHJldHVybiBidWlsZGVyLmVuZFZlY3RvcigpOworfQorCitzdGF0aWMgc3RhcnREb2N1bWVudGF0aW9uVmVjdG9yKGJ1aWxkZXI6ZmxhdGJ1ZmZlcnMuQnVpbGRlciwgbnVtRWxlbXM6bnVtYmVyKSB7CisgIGJ1aWxkZXIuc3RhcnRWZWN0b3IoNCwgbnVtRWxlbXMsIDQpOworfQorCitzdGF0aWMgYWRkRGVjbGFyYXRpb25GaWxlKGJ1aWxkZXI6ZmxhdGJ1ZmZlcnMuQnVpbGRlciwgZGVjbGFyYXRpb25GaWxlT2Zmc2V0OmZsYXRidWZmZXJzLk9mZnNldCkgeworICBidWlsZGVyLmFkZEZpZWxkT2Zmc2V0KDYsIGRlY2xhcmF0aW9uRmlsZU9mZnNldCwgMCk7Cit9CisKK3N0YXRpYyBlbmRFbnVtKGJ1aWxkZXI6ZmxhdGJ1ZmZlcnMuQnVpbGRlcik6ZmxhdGJ1ZmZlcnMuT2Zmc2V0IHsKKyAgY29uc3Qgb2Zmc2V0ID0gYnVpbGRlci5lbmRPYmplY3QoKTsKKyAgYnVpbGRlci5yZXF1aXJlZEZpZWxkKG9mZnNldCwgNCkgLy8gbmFtZQorICBidWlsZGVyLnJlcXVpcmVkRmllbGQob2Zmc2V0LCA2KSAvLyB2YWx1ZXMKKyAgYnVpbGRlci5yZXF1aXJlZEZpZWxkKG9mZnNldCwgMTApIC8vIHVuZGVybHlpbmdfdHlwZQorICByZXR1cm4gb2Zmc2V0OworfQorCisKK3VucGFjaygpOiBFbnVtVCB7CisgIHJldHVybiBuZXcgRW51bVQoCisgICAgdGhpcy5uYW1lKCksCisgICAgdGhpcy5iYiEuY3JlYXRlT2JqTGlzdCh0aGlzLnZhbHVlcy5iaW5kKHRoaXMpLCB0aGlzLnZhbHVlc0xlbmd0aCgpKSwKKyAgICB0aGlzLmlzVW5pb24oKSwKKyAgICAodGhpcy51bmRlcmx5aW5nVHlwZSgpICE9PSBudWxsID8gdGhpcy51bmRlcmx5aW5nVHlwZSgpIS51bnBhY2soKSA6IG51bGwpLAorICAgIHRoaXMuYmIhLmNyZWF0ZU9iakxpc3QodGhpcy5hdHRyaWJ1dGVzLmJpbmQodGhpcyksIHRoaXMuYXR0cmlidXRlc0xlbmd0aCgpKSwKKyAgICB0aGlzLmJiIS5jcmVhdGVTY2FsYXJMaXN0KHRoaXMuZG9jdW1lbnRhdGlvbi5iaW5kKHRoaXMpLCB0aGlzLmRvY3VtZW50YXRpb25MZW5ndGgoKSksCisgICAgdGhpcy5kZWNsYXJhdGlvbkZpbGUoKQorICApOworfQorCisKK3VucGFja1RvKF9vOiBFbnVtVCk6IHZvaWQgeworICBfby5uYW1lID0gdGhpcy5uYW1lKCk7CisgIF9vLnZhbHVlcyA9IHRoaXMuYmIhLmNyZWF0ZU9iakxpc3QodGhpcy52YWx1ZXMuYmluZCh0aGlzKSwgdGhpcy52YWx1ZXNMZW5ndGgoKSk7CisgIF9vLmlzVW5pb24gPSB0aGlzLmlzVW5pb24oKTsKKyAgX28udW5kZXJseWluZ1R5cGUgPSAodGhpcy51bmRlcmx5aW5nVHlwZSgpICE9PSBudWxsID8gdGhpcy51bmRlcmx5aW5nVHlwZSgpIS51bnBhY2soKSA6IG51bGwpOworICBfby5hdHRyaWJ1dGVzID0gdGhpcy5iYiEuY3JlYXRlT2JqTGlzdCh0aGlzLmF0dHJpYnV0ZXMuYmluZCh0aGlzKSwgdGhpcy5hdHRyaWJ1dGVzTGVuZ3RoKCkpOworICBfby5kb2N1bWVudGF0aW9uID0gdGhpcy5iYiEuY3JlYXRlU2NhbGFyTGlzdCh0aGlzLmRvY3VtZW50YXRpb24uYmluZCh0aGlzKSwgdGhpcy5kb2N1bWVudGF0aW9uTGVuZ3RoKCkpOworICBfby5kZWNsYXJhdGlvbkZpbGUgPSB0aGlzLmRlY2xhcmF0aW9uRmlsZSgpOworfQorfQorCitleHBvcnQgY2xhc3MgRW51bVQgeworY29uc3RydWN0b3IoCisgIHB1YmxpYyBuYW1lOiBzdHJpbmd8VWludDhBcnJheXxudWxsID0gbnVsbCwKKyAgcHVibGljIHZhbHVlczogKEVudW1WYWxUKVtdID0gW10sCisgIHB1YmxpYyBpc1VuaW9uOiBib29sZWFuID0gZmFsc2UsCisgIHB1YmxpYyB1bmRlcmx5aW5nVHlwZTogVHlwZVR8bnVsbCA9IG51bGwsCisgIHB1YmxpYyBhdHRyaWJ1dGVzOiAoS2V5VmFsdWVUKVtdID0gW10sCisgIHB1YmxpYyBkb2N1bWVudGF0aW9uOiAoc3RyaW5nKVtdID0gW10sCisgIHB1YmxpYyBkZWNsYXJhdGlvbkZpbGU6IHN0cmluZ3xVaW50OEFycmF5fG51bGwgPSBudWxsCispe30KKworCitwYWNrKGJ1aWxkZXI6ZmxhdGJ1ZmZlcnMuQnVpbGRlcik6IGZsYXRidWZmZXJzLk9mZnNldCB7CisgIGNvbnN0IG5hbWUgPSAodGhpcy5uYW1lICE9PSBudWxsID8gYnVpbGRlci5jcmVhdGVTdHJpbmcodGhpcy5uYW1lISkgOiAwKTsKKyAgY29uc3QgdmFsdWVzID0gRW51bS5jcmVhdGVWYWx1ZXNWZWN0b3IoYnVpbGRlciwgYnVpbGRlci5jcmVhdGVPYmplY3RPZmZzZXRMaXN0KHRoaXMudmFsdWVzKSk7CisgIGNvbnN0IHVuZGVybHlpbmdUeXBlID0gKHRoaXMudW5kZXJseWluZ1R5cGUgIT09IG51bGwgPyB0aGlzLnVuZGVybHlpbmdUeXBlIS5wYWNrKGJ1aWxkZXIpIDogMCk7CisgIGNvbnN0IGF0dHJpYnV0ZXMgPSBFbnVtLmNyZWF0ZUF0dHJpYnV0ZXNWZWN0b3IoYnVpbGRlciwgYnVpbGRlci5jcmVhdGVPYmplY3RPZmZzZXRMaXN0KHRoaXMuYXR0cmlidXRlcykpOworICBjb25zdCBkb2N1bWVudGF0aW9uID0gRW51bS5jcmVhdGVEb2N1bWVudGF0aW9uVmVjdG9yKGJ1aWxkZXIsIGJ1aWxkZXIuY3JlYXRlT2JqZWN0T2Zmc2V0TGlzdCh0aGlzLmRvY3VtZW50YXRpb24pKTsKKyAgY29uc3QgZGVjbGFyYXRpb25GaWxlID0gKHRoaXMuZGVjbGFyYXRpb25GaWxlICE9PSBudWxsID8gYnVpbGRlci5jcmVhdGVTdHJpbmcodGhpcy5kZWNsYXJhdGlvbkZpbGUhKSA6IDApOworCisgIEVudW0uc3RhcnRFbnVtKGJ1aWxkZXIpOworICBFbnVtLmFkZE5hbWUoYnVpbGRlciwgbmFtZSk7CisgIEVudW0uYWRkVmFsdWVzKGJ1aWxkZXIsIHZhbHVlcyk7CisgIEVudW0uYWRkSXNVbmlvbihidWlsZGVyLCB0aGlzLmlzVW5pb24pOworICBFbnVtLmFkZFVuZGVybHlpbmdUeXBlKGJ1aWxkZXIsIHVuZGVybHlpbmdUeXBlKTsKKyAgRW51bS5hZGRBdHRyaWJ1dGVzKGJ1aWxkZXIsIGF0dHJpYnV0ZXMpOworICBFbnVtLmFkZERvY3VtZW50YXRpb24oYnVpbGRlciwgZG9jdW1lbnRhdGlvbik7CisgIEVudW0uYWRkRGVjbGFyYXRpb25GaWxlKGJ1aWxkZXIsIGRlY2xhcmF0aW9uRmlsZSk7CisKKyAgcmV0dXJuIEVudW0uZW5kRW51bShidWlsZGVyKTsKK30KK30KKworZXhwb3J0IGNsYXNzIEZpZWxkIHsKKyAgYmI6IGZsYXRidWZmZXJzLkJ5dGVCdWZmZXJ8bnVsbCA9IG51bGw7CisgIGJiX3BvcyA9IDA7CisgIF9faW5pdChpOm51bWJlciwgYmI6ZmxhdGJ1ZmZlcnMuQnl0ZUJ1ZmZlcik6RmllbGQgeworICB0aGlzLmJiX3BvcyA9IGk7CisgIHRoaXMuYmIgPSBiYjsKKyAgcmV0dXJuIHRoaXM7Cit9CisKK3N0YXRpYyBnZXRSb290QXNGaWVsZChiYjpmbGF0YnVmZmVycy5CeXRlQnVmZmVyLCBvYmo/OkZpZWxkKTpGaWVsZCB7CisgIHJldHVybiAob2JqIHx8IG5ldyBGaWVsZCgpKS5fX2luaXQoYmIucmVhZEludDMyKGJiLnBvc2l0aW9uKCkpICsgYmIucG9zaXRpb24oKSwgYmIpOworfQorCitzdGF0aWMgZ2V0U2l6ZVByZWZpeGVkUm9vdEFzRmllbGQoYmI6ZmxhdGJ1ZmZlcnMuQnl0ZUJ1ZmZlciwgb2JqPzpGaWVsZCk6RmllbGQgeworICBiYi5zZXRQb3NpdGlvbihiYi5wb3NpdGlvbigpICsgZmxhdGJ1ZmZlcnMuU0laRV9QUkVGSVhfTEVOR1RIKTsKKyAgcmV0dXJuIChvYmogfHwgbmV3IEZpZWxkKCkpLl9faW5pdChiYi5yZWFkSW50MzIoYmIucG9zaXRpb24oKSkgKyBiYi5wb3NpdGlvbigpLCBiYik7Cit9CisKK25hbWUoKTpzdHJpbmd8bnVsbAorbmFtZShvcHRpb25hbEVuY29kaW5nOmZsYXRidWZmZXJzLkVuY29kaW5nKTpzdHJpbmd8VWludDhBcnJheXxudWxsCituYW1lKG9wdGlvbmFsRW5jb2Rpbmc/OmFueSk6c3RyaW5nfFVpbnQ4QXJyYXl8bnVsbCB7CisgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIhLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCA0KTsKKyAgcmV0dXJuIG9mZnNldCA/IHRoaXMuYmIhLl9fc3RyaW5nKHRoaXMuYmJfcG9zICsgb2Zmc2V0LCBvcHRpb25hbEVuY29kaW5nKSA6IG51bGw7Cit9CisKK3R5cGUob2JqPzpUeXBlKTpUeXBlfG51bGwgeworICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiIS5fX29mZnNldCh0aGlzLmJiX3BvcywgNik7CisgIHJldHVybiBvZmZzZXQgPyAob2JqIHx8IG5ldyBUeXBlKCkpLl9faW5pdCh0aGlzLmJiIS5fX2luZGlyZWN0KHRoaXMuYmJfcG9zICsgb2Zmc2V0KSwgdGhpcy5iYiEpIDogbnVsbDsKK30KKworaWQoKTpudW1iZXIgeworICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiIS5fX29mZnNldCh0aGlzLmJiX3BvcywgOCk7CisgIHJldHVybiBvZmZzZXQgPyB0aGlzLmJiIS5yZWFkVWludDE2KHRoaXMuYmJfcG9zICsgb2Zmc2V0KSA6IDA7Cit9CisKK211dGF0ZV9pZCh2YWx1ZTpudW1iZXIpOmJvb2xlYW4geworICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiIS5fX29mZnNldCh0aGlzLmJiX3BvcywgOCk7CisKKyAgaWYgKG9mZnNldCA9PT0gMCkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHRoaXMuYmIhLndyaXRlVWludDE2KHRoaXMuYmJfcG9zICsgb2Zmc2V0LCB2YWx1ZSk7CisgIHJldHVybiB0cnVlOworfQorCitvZmZzZXQoKTpudW1iZXIgeworICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiIS5fX29mZnNldCh0aGlzLmJiX3BvcywgMTApOworICByZXR1cm4gb2Zmc2V0ID8gdGhpcy5iYiEucmVhZFVpbnQxNih0aGlzLmJiX3BvcyArIG9mZnNldCkgOiAwOworfQorCittdXRhdGVfb2Zmc2V0KHZhbHVlOm51bWJlcik6Ym9vbGVhbiB7CisgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIhLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCAxMCk7CisKKyAgaWYgKG9mZnNldCA9PT0gMCkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHRoaXMuYmIhLndyaXRlVWludDE2KHRoaXMuYmJfcG9zICsgb2Zmc2V0LCB2YWx1ZSk7CisgIHJldHVybiB0cnVlOworfQorCitkZWZhdWx0SW50ZWdlcigpOmJpZ2ludCB7CisgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIhLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCAxMik7CisgIHJldHVybiBvZmZzZXQgPyB0aGlzLmJiIS5yZWFkSW50NjQodGhpcy5iYl9wb3MgKyBvZmZzZXQpIDogQmlnSW50KCcwJyk7Cit9CisKK211dGF0ZV9kZWZhdWx0X2ludGVnZXIodmFsdWU6YmlnaW50KTpib29sZWFuIHsKKyAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYiEuX19vZmZzZXQodGhpcy5iYl9wb3MsIDEyKTsKKworICBpZiAob2Zmc2V0ID09PSAwKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgdGhpcy5iYiEud3JpdGVJbnQ2NCh0aGlzLmJiX3BvcyArIG9mZnNldCwgdmFsdWUpOworICByZXR1cm4gdHJ1ZTsKK30KKworZGVmYXVsdFJlYWwoKTpudW1iZXIgeworICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiIS5fX29mZnNldCh0aGlzLmJiX3BvcywgMTQpOworICByZXR1cm4gb2Zmc2V0ID8gdGhpcy5iYiEucmVhZEZsb2F0NjQodGhpcy5iYl9wb3MgKyBvZmZzZXQpIDogMC4wOworfQorCittdXRhdGVfZGVmYXVsdF9yZWFsKHZhbHVlOm51bWJlcik6Ym9vbGVhbiB7CisgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIhLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCAxNCk7CisKKyAgaWYgKG9mZnNldCA9PT0gMCkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHRoaXMuYmIhLndyaXRlRmxvYXQ2NCh0aGlzLmJiX3BvcyArIG9mZnNldCwgdmFsdWUpOworICByZXR1cm4gdHJ1ZTsKK30KKworZGVwcmVjYXRlZCgpOmJvb2xlYW4geworICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiIS5fX29mZnNldCh0aGlzLmJiX3BvcywgMTYpOworICByZXR1cm4gb2Zmc2V0ID8gISF0aGlzLmJiIS5yZWFkSW50OCh0aGlzLmJiX3BvcyArIG9mZnNldCkgOiBmYWxzZTsKK30KKworbXV0YXRlX2RlcHJlY2F0ZWQodmFsdWU6Ym9vbGVhbik6Ym9vbGVhbiB7CisgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIhLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCAxNik7CisKKyAgaWYgKG9mZnNldCA9PT0gMCkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHRoaXMuYmIhLndyaXRlSW50OCh0aGlzLmJiX3BvcyArIG9mZnNldCwgK3ZhbHVlKTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK3JlcXVpcmVkKCk6Ym9vbGVhbiB7CisgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIhLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCAxOCk7CisgIHJldHVybiBvZmZzZXQgPyAhIXRoaXMuYmIhLnJlYWRJbnQ4KHRoaXMuYmJfcG9zICsgb2Zmc2V0KSA6IGZhbHNlOworfQorCittdXRhdGVfcmVxdWlyZWQodmFsdWU6Ym9vbGVhbik6Ym9vbGVhbiB7CisgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIhLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCAxOCk7CisKKyAgaWYgKG9mZnNldCA9PT0gMCkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHRoaXMuYmIhLndyaXRlSW50OCh0aGlzLmJiX3BvcyArIG9mZnNldCwgK3ZhbHVlKTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK2tleSgpOmJvb2xlYW4geworICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiIS5fX29mZnNldCh0aGlzLmJiX3BvcywgMjApOworICByZXR1cm4gb2Zmc2V0ID8gISF0aGlzLmJiIS5yZWFkSW50OCh0aGlzLmJiX3BvcyArIG9mZnNldCkgOiBmYWxzZTsKK30KKworbXV0YXRlX2tleSh2YWx1ZTpib29sZWFuKTpib29sZWFuIHsKKyAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYiEuX19vZmZzZXQodGhpcy5iYl9wb3MsIDIwKTsKKworICBpZiAob2Zmc2V0ID09PSAwKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgdGhpcy5iYiEud3JpdGVJbnQ4KHRoaXMuYmJfcG9zICsgb2Zmc2V0LCArdmFsdWUpOworICByZXR1cm4gdHJ1ZTsKK30KKworYXR0cmlidXRlcyhpbmRleDogbnVtYmVyLCBvYmo/OktleVZhbHVlKTpLZXlWYWx1ZXxudWxsIHsKKyAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYiEuX19vZmZzZXQodGhpcy5iYl9wb3MsIDIyKTsKKyAgcmV0dXJuIG9mZnNldCA/IChvYmogfHwgbmV3IEtleVZhbHVlKCkpLl9faW5pdCh0aGlzLmJiIS5fX2luZGlyZWN0KHRoaXMuYmIhLl9fdmVjdG9yKHRoaXMuYmJfcG9zICsgb2Zmc2V0KSArIGluZGV4ICogNCksIHRoaXMuYmIhKSA6IG51bGw7Cit9CisKK2F0dHJpYnV0ZXNMZW5ndGgoKTpudW1iZXIgeworICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiIS5fX29mZnNldCh0aGlzLmJiX3BvcywgMjIpOworICByZXR1cm4gb2Zmc2V0ID8gdGhpcy5iYiEuX192ZWN0b3JfbGVuKHRoaXMuYmJfcG9zICsgb2Zmc2V0KSA6IDA7Cit9CisKK2RvY3VtZW50YXRpb24oaW5kZXg6IG51bWJlcik6c3RyaW5nCitkb2N1bWVudGF0aW9uKGluZGV4OiBudW1iZXIsb3B0aW9uYWxFbmNvZGluZzpmbGF0YnVmZmVycy5FbmNvZGluZyk6c3RyaW5nfFVpbnQ4QXJyYXkKK2RvY3VtZW50YXRpb24oaW5kZXg6IG51bWJlcixvcHRpb25hbEVuY29kaW5nPzphbnkpOnN0cmluZ3xVaW50OEFycmF5fG51bGwgeworICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiIS5fX29mZnNldCh0aGlzLmJiX3BvcywgMjQpOworICByZXR1cm4gb2Zmc2V0ID8gdGhpcy5iYiEuX19zdHJpbmcodGhpcy5iYiEuX192ZWN0b3IodGhpcy5iYl9wb3MgKyBvZmZzZXQpICsgaW5kZXggKiA0LCBvcHRpb25hbEVuY29kaW5nKSA6IG51bGw7Cit9CisKK2RvY3VtZW50YXRpb25MZW5ndGgoKTpudW1iZXIgeworICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiIS5fX29mZnNldCh0aGlzLmJiX3BvcywgMjQpOworICByZXR1cm4gb2Zmc2V0ID8gdGhpcy5iYiEuX192ZWN0b3JfbGVuKHRoaXMuYmJfcG9zICsgb2Zmc2V0KSA6IDA7Cit9CisKK29wdGlvbmFsKCk6Ym9vbGVhbiB7CisgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIhLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCAyNik7CisgIHJldHVybiBvZmZzZXQgPyAhIXRoaXMuYmIhLnJlYWRJbnQ4KHRoaXMuYmJfcG9zICsgb2Zmc2V0KSA6IGZhbHNlOworfQorCittdXRhdGVfb3B0aW9uYWwodmFsdWU6Ym9vbGVhbik6Ym9vbGVhbiB7CisgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIhLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCAyNik7CisKKyAgaWYgKG9mZnNldCA9PT0gMCkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHRoaXMuYmIhLndyaXRlSW50OCh0aGlzLmJiX3BvcyArIG9mZnNldCwgK3ZhbHVlKTsKKyAgcmV0dXJuIHRydWU7Cit9CisKKy8qKgorICogTnVtYmVyIG9mIHBhZGRpbmcgb2N0ZXRzIHRvIGFsd2F5cyBhZGQgYWZ0ZXIgdGhpcyBmaWVsZC4gU3RydWN0cyBvbmx5LgorICovCitwYWRkaW5nKCk6bnVtYmVyIHsKKyAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYiEuX19vZmZzZXQodGhpcy5iYl9wb3MsIDI4KTsKKyAgcmV0dXJuIG9mZnNldCA/IHRoaXMuYmIhLnJlYWRVaW50MTYodGhpcy5iYl9wb3MgKyBvZmZzZXQpIDogMDsKK30KKworbXV0YXRlX3BhZGRpbmcodmFsdWU6bnVtYmVyKTpib29sZWFuIHsKKyAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYiEuX19vZmZzZXQodGhpcy5iYl9wb3MsIDI4KTsKKworICBpZiAob2Zmc2V0ID09PSAwKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgdGhpcy5iYiEud3JpdGVVaW50MTYodGhpcy5iYl9wb3MgKyBvZmZzZXQsIHZhbHVlKTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyBnZXRGdWxseVF1YWxpZmllZE5hbWUoKTpzdHJpbmcgeworICByZXR1cm4gJ3JlZmxlY3Rpb25fRmllbGQnOworfQorCitzdGF0aWMgc3RhcnRGaWVsZChidWlsZGVyOmZsYXRidWZmZXJzLkJ1aWxkZXIpIHsKKyAgYnVpbGRlci5zdGFydE9iamVjdCgxMyk7Cit9CisKK3N0YXRpYyBhZGROYW1lKGJ1aWxkZXI6ZmxhdGJ1ZmZlcnMuQnVpbGRlciwgbmFtZU9mZnNldDpmbGF0YnVmZmVycy5PZmZzZXQpIHsKKyAgYnVpbGRlci5hZGRGaWVsZE9mZnNldCgwLCBuYW1lT2Zmc2V0LCAwKTsKK30KKworc3RhdGljIGFkZFR5cGUoYnVpbGRlcjpmbGF0YnVmZmVycy5CdWlsZGVyLCB0eXBlT2Zmc2V0OmZsYXRidWZmZXJzLk9mZnNldCkgeworICBidWlsZGVyLmFkZEZpZWxkT2Zmc2V0KDEsIHR5cGVPZmZzZXQsIDApOworfQorCitzdGF0aWMgYWRkSWQoYnVpbGRlcjpmbGF0YnVmZmVycy5CdWlsZGVyLCBpZDpudW1iZXIpIHsKKyAgYnVpbGRlci5hZGRGaWVsZEludDE2KDIsIGlkLCAwKTsKK30KKworc3RhdGljIGFkZE9mZnNldChidWlsZGVyOmZsYXRidWZmZXJzLkJ1aWxkZXIsIG9mZnNldDpudW1iZXIpIHsKKyAgYnVpbGRlci5hZGRGaWVsZEludDE2KDMsIG9mZnNldCwgMCk7Cit9CisKK3N0YXRpYyBhZGREZWZhdWx0SW50ZWdlcihidWlsZGVyOmZsYXRidWZmZXJzLkJ1aWxkZXIsIGRlZmF1bHRJbnRlZ2VyOmJpZ2ludCkgeworICBidWlsZGVyLmFkZEZpZWxkSW50NjQoNCwgZGVmYXVsdEludGVnZXIsIEJpZ0ludCgnMCcpKTsKK30KKworc3RhdGljIGFkZERlZmF1bHRSZWFsKGJ1aWxkZXI6ZmxhdGJ1ZmZlcnMuQnVpbGRlciwgZGVmYXVsdFJlYWw6bnVtYmVyKSB7CisgIGJ1aWxkZXIuYWRkRmllbGRGbG9hdDY0KDUsIGRlZmF1bHRSZWFsLCAwLjApOworfQorCitzdGF0aWMgYWRkRGVwcmVjYXRlZChidWlsZGVyOmZsYXRidWZmZXJzLkJ1aWxkZXIsIGRlcHJlY2F0ZWQ6Ym9vbGVhbikgeworICBidWlsZGVyLmFkZEZpZWxkSW50OCg2LCArZGVwcmVjYXRlZCwgK2ZhbHNlKTsKK30KKworc3RhdGljIGFkZFJlcXVpcmVkKGJ1aWxkZXI6ZmxhdGJ1ZmZlcnMuQnVpbGRlciwgcmVxdWlyZWQ6Ym9vbGVhbikgeworICBidWlsZGVyLmFkZEZpZWxkSW50OCg3LCArcmVxdWlyZWQsICtmYWxzZSk7Cit9CisKK3N0YXRpYyBhZGRLZXkoYnVpbGRlcjpmbGF0YnVmZmVycy5CdWlsZGVyLCBrZXk6Ym9vbGVhbikgeworICBidWlsZGVyLmFkZEZpZWxkSW50OCg4LCAra2V5LCArZmFsc2UpOworfQorCitzdGF0aWMgYWRkQXR0cmlidXRlcyhidWlsZGVyOmZsYXRidWZmZXJzLkJ1aWxkZXIsIGF0dHJpYnV0ZXNPZmZzZXQ6ZmxhdGJ1ZmZlcnMuT2Zmc2V0KSB7CisgIGJ1aWxkZXIuYWRkRmllbGRPZmZzZXQoOSwgYXR0cmlidXRlc09mZnNldCwgMCk7Cit9CisKK3N0YXRpYyBjcmVhdGVBdHRyaWJ1dGVzVmVjdG9yKGJ1aWxkZXI6ZmxhdGJ1ZmZlcnMuQnVpbGRlciwgZGF0YTpmbGF0YnVmZmVycy5PZmZzZXRbXSk6ZmxhdGJ1ZmZlcnMuT2Zmc2V0IHsKKyAgYnVpbGRlci5zdGFydFZlY3Rvcig0LCBkYXRhLmxlbmd0aCwgNCk7CisgIGZvciAobGV0IGkgPSBkYXRhLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7CisgICAgYnVpbGRlci5hZGRPZmZzZXQoZGF0YVtpXSEpOworICB9CisgIHJldHVybiBidWlsZGVyLmVuZFZlY3RvcigpOworfQorCitzdGF0aWMgc3RhcnRBdHRyaWJ1dGVzVmVjdG9yKGJ1aWxkZXI6ZmxhdGJ1ZmZlcnMuQnVpbGRlciwgbnVtRWxlbXM6bnVtYmVyKSB7CisgIGJ1aWxkZXIuc3RhcnRWZWN0b3IoNCwgbnVtRWxlbXMsIDQpOworfQorCitzdGF0aWMgYWRkRG9jdW1lbnRhdGlvbihidWlsZGVyOmZsYXRidWZmZXJzLkJ1aWxkZXIsIGRvY3VtZW50YXRpb25PZmZzZXQ6ZmxhdGJ1ZmZlcnMuT2Zmc2V0KSB7CisgIGJ1aWxkZXIuYWRkRmllbGRPZmZzZXQoMTAsIGRvY3VtZW50YXRpb25PZmZzZXQsIDApOworfQorCitzdGF0aWMgY3JlYXRlRG9jdW1lbnRhdGlvblZlY3RvcihidWlsZGVyOmZsYXRidWZmZXJzLkJ1aWxkZXIsIGRhdGE6ZmxhdGJ1ZmZlcnMuT2Zmc2V0W10pOmZsYXRidWZmZXJzLk9mZnNldCB7CisgIGJ1aWxkZXIuc3RhcnRWZWN0b3IoNCwgZGF0YS5sZW5ndGgsIDQpOworICBmb3IgKGxldCBpID0gZGF0YS5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgeworICAgIGJ1aWxkZXIuYWRkT2Zmc2V0KGRhdGFbaV0hKTsKKyAgfQorICByZXR1cm4gYnVpbGRlci5lbmRWZWN0b3IoKTsKK30KKworc3RhdGljIHN0YXJ0RG9jdW1lbnRhdGlvblZlY3RvcihidWlsZGVyOmZsYXRidWZmZXJzLkJ1aWxkZXIsIG51bUVsZW1zOm51bWJlcikgeworICBidWlsZGVyLnN0YXJ0VmVjdG9yKDQsIG51bUVsZW1zLCA0KTsKK30KKworc3RhdGljIGFkZE9wdGlvbmFsKGJ1aWxkZXI6ZmxhdGJ1ZmZlcnMuQnVpbGRlciwgb3B0aW9uYWw6Ym9vbGVhbikgeworICBidWlsZGVyLmFkZEZpZWxkSW50OCgxMSwgK29wdGlvbmFsLCArZmFsc2UpOworfQorCitzdGF0aWMgYWRkUGFkZGluZyhidWlsZGVyOmZsYXRidWZmZXJzLkJ1aWxkZXIsIHBhZGRpbmc6bnVtYmVyKSB7CisgIGJ1aWxkZXIuYWRkRmllbGRJbnQxNigxMiwgcGFkZGluZywgMCk7Cit9CisKK3N0YXRpYyBlbmRGaWVsZChidWlsZGVyOmZsYXRidWZmZXJzLkJ1aWxkZXIpOmZsYXRidWZmZXJzLk9mZnNldCB7CisgIGNvbnN0IG9mZnNldCA9IGJ1aWxkZXIuZW5kT2JqZWN0KCk7CisgIGJ1aWxkZXIucmVxdWlyZWRGaWVsZChvZmZzZXQsIDQpIC8vIG5hbWUKKyAgYnVpbGRlci5yZXF1aXJlZEZpZWxkKG9mZnNldCwgNikgLy8gdHlwZQorICByZXR1cm4gb2Zmc2V0OworfQorCisKK3VucGFjaygpOiBGaWVsZFQgeworICByZXR1cm4gbmV3IEZpZWxkVCgKKyAgICB0aGlzLm5hbWUoKSwKKyAgICAodGhpcy50eXBlKCkgIT09IG51bGwgPyB0aGlzLnR5cGUoKSEudW5wYWNrKCkgOiBudWxsKSwKKyAgICB0aGlzLmlkKCksCisgICAgdGhpcy5vZmZzZXQoKSwKKyAgICB0aGlzLmRlZmF1bHRJbnRlZ2VyKCksCisgICAgdGhpcy5kZWZhdWx0UmVhbCgpLAorICAgIHRoaXMuZGVwcmVjYXRlZCgpLAorICAgIHRoaXMucmVxdWlyZWQoKSwKKyAgICB0aGlzLmtleSgpLAorICAgIHRoaXMuYmIhLmNyZWF0ZU9iakxpc3QodGhpcy5hdHRyaWJ1dGVzLmJpbmQodGhpcyksIHRoaXMuYXR0cmlidXRlc0xlbmd0aCgpKSwKKyAgICB0aGlzLmJiIS5jcmVhdGVTY2FsYXJMaXN0KHRoaXMuZG9jdW1lbnRhdGlvbi5iaW5kKHRoaXMpLCB0aGlzLmRvY3VtZW50YXRpb25MZW5ndGgoKSksCisgICAgdGhpcy5vcHRpb25hbCgpLAorICAgIHRoaXMucGFkZGluZygpCisgICk7Cit9CisKKwordW5wYWNrVG8oX286IEZpZWxkVCk6IHZvaWQgeworICBfby5uYW1lID0gdGhpcy5uYW1lKCk7CisgIF9vLnR5cGUgPSAodGhpcy50eXBlKCkgIT09IG51bGwgPyB0aGlzLnR5cGUoKSEudW5wYWNrKCkgOiBudWxsKTsKKyAgX28uaWQgPSB0aGlzLmlkKCk7CisgIF9vLm9mZnNldCA9IHRoaXMub2Zmc2V0KCk7CisgIF9vLmRlZmF1bHRJbnRlZ2VyID0gdGhpcy5kZWZhdWx0SW50ZWdlcigpOworICBfby5kZWZhdWx0UmVhbCA9IHRoaXMuZGVmYXVsdFJlYWwoKTsKKyAgX28uZGVwcmVjYXRlZCA9IHRoaXMuZGVwcmVjYXRlZCgpOworICBfby5yZXF1aXJlZCA9IHRoaXMucmVxdWlyZWQoKTsKKyAgX28ua2V5ID0gdGhpcy5rZXkoKTsKKyAgX28uYXR0cmlidXRlcyA9IHRoaXMuYmIhLmNyZWF0ZU9iakxpc3QodGhpcy5hdHRyaWJ1dGVzLmJpbmQodGhpcyksIHRoaXMuYXR0cmlidXRlc0xlbmd0aCgpKTsKKyAgX28uZG9jdW1lbnRhdGlvbiA9IHRoaXMuYmIhLmNyZWF0ZVNjYWxhckxpc3QodGhpcy5kb2N1bWVudGF0aW9uLmJpbmQodGhpcyksIHRoaXMuZG9jdW1lbnRhdGlvbkxlbmd0aCgpKTsKKyAgX28ub3B0aW9uYWwgPSB0aGlzLm9wdGlvbmFsKCk7CisgIF9vLnBhZGRpbmcgPSB0aGlzLnBhZGRpbmcoKTsKK30KK30KKworZXhwb3J0IGNsYXNzIEZpZWxkVCB7Citjb25zdHJ1Y3RvcigKKyAgcHVibGljIG5hbWU6IHN0cmluZ3xVaW50OEFycmF5fG51bGwgPSBudWxsLAorICBwdWJsaWMgdHlwZTogVHlwZVR8bnVsbCA9IG51bGwsCisgIHB1YmxpYyBpZDogbnVtYmVyID0gMCwKKyAgcHVibGljIG9mZnNldDogbnVtYmVyID0gMCwKKyAgcHVibGljIGRlZmF1bHRJbnRlZ2VyOiBiaWdpbnQgPSBCaWdJbnQoJzAnKSwKKyAgcHVibGljIGRlZmF1bHRSZWFsOiBudW1iZXIgPSAwLjAsCisgIHB1YmxpYyBkZXByZWNhdGVkOiBib29sZWFuID0gZmFsc2UsCisgIHB1YmxpYyByZXF1aXJlZDogYm9vbGVhbiA9IGZhbHNlLAorICBwdWJsaWMga2V5OiBib29sZWFuID0gZmFsc2UsCisgIHB1YmxpYyBhdHRyaWJ1dGVzOiAoS2V5VmFsdWVUKVtdID0gW10sCisgIHB1YmxpYyBkb2N1bWVudGF0aW9uOiAoc3RyaW5nKVtdID0gW10sCisgIHB1YmxpYyBvcHRpb25hbDogYm9vbGVhbiA9IGZhbHNlLAorICBwdWJsaWMgcGFkZGluZzogbnVtYmVyID0gMAorKXt9CisKKworcGFjayhidWlsZGVyOmZsYXRidWZmZXJzLkJ1aWxkZXIpOiBmbGF0YnVmZmVycy5PZmZzZXQgeworICBjb25zdCBuYW1lID0gKHRoaXMubmFtZSAhPT0gbnVsbCA/IGJ1aWxkZXIuY3JlYXRlU3RyaW5nKHRoaXMubmFtZSEpIDogMCk7CisgIGNvbnN0IHR5cGUgPSAodGhpcy50eXBlICE9PSBudWxsID8gdGhpcy50eXBlIS5wYWNrKGJ1aWxkZXIpIDogMCk7CisgIGNvbnN0IGF0dHJpYnV0ZXMgPSBGaWVsZC5jcmVhdGVBdHRyaWJ1dGVzVmVjdG9yKGJ1aWxkZXIsIGJ1aWxkZXIuY3JlYXRlT2JqZWN0T2Zmc2V0TGlzdCh0aGlzLmF0dHJpYnV0ZXMpKTsKKyAgY29uc3QgZG9jdW1lbnRhdGlvbiA9IEZpZWxkLmNyZWF0ZURvY3VtZW50YXRpb25WZWN0b3IoYnVpbGRlciwgYnVpbGRlci5jcmVhdGVPYmplY3RPZmZzZXRMaXN0KHRoaXMuZG9jdW1lbnRhdGlvbikpOworCisgIEZpZWxkLnN0YXJ0RmllbGQoYnVpbGRlcik7CisgIEZpZWxkLmFkZE5hbWUoYnVpbGRlciwgbmFtZSk7CisgIEZpZWxkLmFkZFR5cGUoYnVpbGRlciwgdHlwZSk7CisgIEZpZWxkLmFkZElkKGJ1aWxkZXIsIHRoaXMuaWQpOworICBGaWVsZC5hZGRPZmZzZXQoYnVpbGRlciwgdGhpcy5vZmZzZXQpOworICBGaWVsZC5hZGREZWZhdWx0SW50ZWdlcihidWlsZGVyLCB0aGlzLmRlZmF1bHRJbnRlZ2VyKTsKKyAgRmllbGQuYWRkRGVmYXVsdFJlYWwoYnVpbGRlciwgdGhpcy5kZWZhdWx0UmVhbCk7CisgIEZpZWxkLmFkZERlcHJlY2F0ZWQoYnVpbGRlciwgdGhpcy5kZXByZWNhdGVkKTsKKyAgRmllbGQuYWRkUmVxdWlyZWQoYnVpbGRlciwgdGhpcy5yZXF1aXJlZCk7CisgIEZpZWxkLmFkZEtleShidWlsZGVyLCB0aGlzLmtleSk7CisgIEZpZWxkLmFkZEF0dHJpYnV0ZXMoYnVpbGRlciwgYXR0cmlidXRlcyk7CisgIEZpZWxkLmFkZERvY3VtZW50YXRpb24oYnVpbGRlciwgZG9jdW1lbnRhdGlvbik7CisgIEZpZWxkLmFkZE9wdGlvbmFsKGJ1aWxkZXIsIHRoaXMub3B0aW9uYWwpOworICBGaWVsZC5hZGRQYWRkaW5nKGJ1aWxkZXIsIHRoaXMucGFkZGluZyk7CisKKyAgcmV0dXJuIEZpZWxkLmVuZEZpZWxkKGJ1aWxkZXIpOworfQorfQorCitleHBvcnQgY2xhc3MgT2JqZWN0XyB7CisgIGJiOiBmbGF0YnVmZmVycy5CeXRlQnVmZmVyfG51bGwgPSBudWxsOworICBiYl9wb3MgPSAwOworICBfX2luaXQoaTpudW1iZXIsIGJiOmZsYXRidWZmZXJzLkJ5dGVCdWZmZXIpOk9iamVjdF8geworICB0aGlzLmJiX3BvcyA9IGk7CisgIHRoaXMuYmIgPSBiYjsKKyAgcmV0dXJuIHRoaXM7Cit9CisKK3N0YXRpYyBnZXRSb290QXNPYmplY3QoYmI6ZmxhdGJ1ZmZlcnMuQnl0ZUJ1ZmZlciwgb2JqPzpPYmplY3RfKTpPYmplY3RfIHsKKyAgcmV0dXJuIChvYmogfHwgbmV3IE9iamVjdF8oKSkuX19pbml0KGJiLnJlYWRJbnQzMihiYi5wb3NpdGlvbigpKSArIGJiLnBvc2l0aW9uKCksIGJiKTsKK30KKworc3RhdGljIGdldFNpemVQcmVmaXhlZFJvb3RBc09iamVjdChiYjpmbGF0YnVmZmVycy5CeXRlQnVmZmVyLCBvYmo/Ok9iamVjdF8pOk9iamVjdF8geworICBiYi5zZXRQb3NpdGlvbihiYi5wb3NpdGlvbigpICsgZmxhdGJ1ZmZlcnMuU0laRV9QUkVGSVhfTEVOR1RIKTsKKyAgcmV0dXJuIChvYmogfHwgbmV3IE9iamVjdF8oKSkuX19pbml0KGJiLnJlYWRJbnQzMihiYi5wb3NpdGlvbigpKSArIGJiLnBvc2l0aW9uKCksIGJiKTsKK30KKworbmFtZSgpOnN0cmluZ3xudWxsCituYW1lKG9wdGlvbmFsRW5jb2Rpbmc6ZmxhdGJ1ZmZlcnMuRW5jb2RpbmcpOnN0cmluZ3xVaW50OEFycmF5fG51bGwKK25hbWUob3B0aW9uYWxFbmNvZGluZz86YW55KTpzdHJpbmd8VWludDhBcnJheXxudWxsIHsKKyAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYiEuX19vZmZzZXQodGhpcy5iYl9wb3MsIDQpOworICByZXR1cm4gb2Zmc2V0ID8gdGhpcy5iYiEuX19zdHJpbmcodGhpcy5iYl9wb3MgKyBvZmZzZXQsIG9wdGlvbmFsRW5jb2RpbmcpIDogbnVsbDsKK30KKworZmllbGRzKGluZGV4OiBudW1iZXIsIG9iaj86RmllbGQpOkZpZWxkfG51bGwgeworICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiIS5fX29mZnNldCh0aGlzLmJiX3BvcywgNik7CisgIHJldHVybiBvZmZzZXQgPyAob2JqIHx8IG5ldyBGaWVsZCgpKS5fX2luaXQodGhpcy5iYiEuX19pbmRpcmVjdCh0aGlzLmJiIS5fX3ZlY3Rvcih0aGlzLmJiX3BvcyArIG9mZnNldCkgKyBpbmRleCAqIDQpLCB0aGlzLmJiISkgOiBudWxsOworfQorCitmaWVsZHNMZW5ndGgoKTpudW1iZXIgeworICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiIS5fX29mZnNldCh0aGlzLmJiX3BvcywgNik7CisgIHJldHVybiBvZmZzZXQgPyB0aGlzLmJiIS5fX3ZlY3Rvcl9sZW4odGhpcy5iYl9wb3MgKyBvZmZzZXQpIDogMDsKK30KKworaXNTdHJ1Y3QoKTpib29sZWFuIHsKKyAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYiEuX19vZmZzZXQodGhpcy5iYl9wb3MsIDgpOworICByZXR1cm4gb2Zmc2V0ID8gISF0aGlzLmJiIS5yZWFkSW50OCh0aGlzLmJiX3BvcyArIG9mZnNldCkgOiBmYWxzZTsKK30KKworbXV0YXRlX2lzX3N0cnVjdCh2YWx1ZTpib29sZWFuKTpib29sZWFuIHsKKyAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYiEuX19vZmZzZXQodGhpcy5iYl9wb3MsIDgpOworCisgIGlmIChvZmZzZXQgPT09IDApIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICB0aGlzLmJiIS53cml0ZUludDgodGhpcy5iYl9wb3MgKyBvZmZzZXQsICt2YWx1ZSk7CisgIHJldHVybiB0cnVlOworfQorCittaW5hbGlnbigpOm51bWJlciB7CisgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIhLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCAxMCk7CisgIHJldHVybiBvZmZzZXQgPyB0aGlzLmJiIS5yZWFkSW50MzIodGhpcy5iYl9wb3MgKyBvZmZzZXQpIDogMDsKK30KKworbXV0YXRlX21pbmFsaWduKHZhbHVlOm51bWJlcik6Ym9vbGVhbiB7CisgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIhLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCAxMCk7CisKKyAgaWYgKG9mZnNldCA9PT0gMCkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHRoaXMuYmIhLndyaXRlSW50MzIodGhpcy5iYl9wb3MgKyBvZmZzZXQsIHZhbHVlKTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK2J5dGVzaXplKCk6bnVtYmVyIHsKKyAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYiEuX19vZmZzZXQodGhpcy5iYl9wb3MsIDEyKTsKKyAgcmV0dXJuIG9mZnNldCA/IHRoaXMuYmIhLnJlYWRJbnQzMih0aGlzLmJiX3BvcyArIG9mZnNldCkgOiAwOworfQorCittdXRhdGVfYnl0ZXNpemUodmFsdWU6bnVtYmVyKTpib29sZWFuIHsKKyAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYiEuX19vZmZzZXQodGhpcy5iYl9wb3MsIDEyKTsKKworICBpZiAob2Zmc2V0ID09PSAwKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgdGhpcy5iYiEud3JpdGVJbnQzMih0aGlzLmJiX3BvcyArIG9mZnNldCwgdmFsdWUpOworICByZXR1cm4gdHJ1ZTsKK30KKworYXR0cmlidXRlcyhpbmRleDogbnVtYmVyLCBvYmo/OktleVZhbHVlKTpLZXlWYWx1ZXxudWxsIHsKKyAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYiEuX19vZmZzZXQodGhpcy5iYl9wb3MsIDE0KTsKKyAgcmV0dXJuIG9mZnNldCA/IChvYmogfHwgbmV3IEtleVZhbHVlKCkpLl9faW5pdCh0aGlzLmJiIS5fX2luZGlyZWN0KHRoaXMuYmIhLl9fdmVjdG9yKHRoaXMuYmJfcG9zICsgb2Zmc2V0KSArIGluZGV4ICogNCksIHRoaXMuYmIhKSA6IG51bGw7Cit9CisKK2F0dHJpYnV0ZXNMZW5ndGgoKTpudW1iZXIgeworICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiIS5fX29mZnNldCh0aGlzLmJiX3BvcywgMTQpOworICByZXR1cm4gb2Zmc2V0ID8gdGhpcy5iYiEuX192ZWN0b3JfbGVuKHRoaXMuYmJfcG9zICsgb2Zmc2V0KSA6IDA7Cit9CisKK2RvY3VtZW50YXRpb24oaW5kZXg6IG51bWJlcik6c3RyaW5nCitkb2N1bWVudGF0aW9uKGluZGV4OiBudW1iZXIsb3B0aW9uYWxFbmNvZGluZzpmbGF0YnVmZmVycy5FbmNvZGluZyk6c3RyaW5nfFVpbnQ4QXJyYXkKK2RvY3VtZW50YXRpb24oaW5kZXg6IG51bWJlcixvcHRpb25hbEVuY29kaW5nPzphbnkpOnN0cmluZ3xVaW50OEFycmF5fG51bGwgeworICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiIS5fX29mZnNldCh0aGlzLmJiX3BvcywgMTYpOworICByZXR1cm4gb2Zmc2V0ID8gdGhpcy5iYiEuX19zdHJpbmcodGhpcy5iYiEuX192ZWN0b3IodGhpcy5iYl9wb3MgKyBvZmZzZXQpICsgaW5kZXggKiA0LCBvcHRpb25hbEVuY29kaW5nKSA6IG51bGw7Cit9CisKK2RvY3VtZW50YXRpb25MZW5ndGgoKTpudW1iZXIgeworICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiIS5fX29mZnNldCh0aGlzLmJiX3BvcywgMTYpOworICByZXR1cm4gb2Zmc2V0ID8gdGhpcy5iYiEuX192ZWN0b3JfbGVuKHRoaXMuYmJfcG9zICsgb2Zmc2V0KSA6IDA7Cit9CisKKy8qKgorICogRmlsZSB0aGF0IHRoaXMgT2JqZWN0IGlzIGRlY2xhcmVkIGluLgorICovCitkZWNsYXJhdGlvbkZpbGUoKTpzdHJpbmd8bnVsbAorZGVjbGFyYXRpb25GaWxlKG9wdGlvbmFsRW5jb2Rpbmc6ZmxhdGJ1ZmZlcnMuRW5jb2RpbmcpOnN0cmluZ3xVaW50OEFycmF5fG51bGwKK2RlY2xhcmF0aW9uRmlsZShvcHRpb25hbEVuY29kaW5nPzphbnkpOnN0cmluZ3xVaW50OEFycmF5fG51bGwgeworICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiIS5fX29mZnNldCh0aGlzLmJiX3BvcywgMTgpOworICByZXR1cm4gb2Zmc2V0ID8gdGhpcy5iYiEuX19zdHJpbmcodGhpcy5iYl9wb3MgKyBvZmZzZXQsIG9wdGlvbmFsRW5jb2RpbmcpIDogbnVsbDsKK30KKworc3RhdGljIGdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpOnN0cmluZyB7CisgIHJldHVybiAncmVmbGVjdGlvbl9PYmplY3QnOworfQorCitzdGF0aWMgc3RhcnRPYmplY3QoYnVpbGRlcjpmbGF0YnVmZmVycy5CdWlsZGVyKSB7CisgIGJ1aWxkZXIuc3RhcnRPYmplY3QoOCk7Cit9CisKK3N0YXRpYyBhZGROYW1lKGJ1aWxkZXI6ZmxhdGJ1ZmZlcnMuQnVpbGRlciwgbmFtZU9mZnNldDpmbGF0YnVmZmVycy5PZmZzZXQpIHsKKyAgYnVpbGRlci5hZGRGaWVsZE9mZnNldCgwLCBuYW1lT2Zmc2V0LCAwKTsKK30KKworc3RhdGljIGFkZEZpZWxkcyhidWlsZGVyOmZsYXRidWZmZXJzLkJ1aWxkZXIsIGZpZWxkc09mZnNldDpmbGF0YnVmZmVycy5PZmZzZXQpIHsKKyAgYnVpbGRlci5hZGRGaWVsZE9mZnNldCgxLCBmaWVsZHNPZmZzZXQsIDApOworfQorCitzdGF0aWMgY3JlYXRlRmllbGRzVmVjdG9yKGJ1aWxkZXI6ZmxhdGJ1ZmZlcnMuQnVpbGRlciwgZGF0YTpmbGF0YnVmZmVycy5PZmZzZXRbXSk6ZmxhdGJ1ZmZlcnMuT2Zmc2V0IHsKKyAgYnVpbGRlci5zdGFydFZlY3Rvcig0LCBkYXRhLmxlbmd0aCwgNCk7CisgIGZvciAobGV0IGkgPSBkYXRhLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7CisgICAgYnVpbGRlci5hZGRPZmZzZXQoZGF0YVtpXSEpOworICB9CisgIHJldHVybiBidWlsZGVyLmVuZFZlY3RvcigpOworfQorCitzdGF0aWMgc3RhcnRGaWVsZHNWZWN0b3IoYnVpbGRlcjpmbGF0YnVmZmVycy5CdWlsZGVyLCBudW1FbGVtczpudW1iZXIpIHsKKyAgYnVpbGRlci5zdGFydFZlY3Rvcig0LCBudW1FbGVtcywgNCk7Cit9CisKK3N0YXRpYyBhZGRJc1N0cnVjdChidWlsZGVyOmZsYXRidWZmZXJzLkJ1aWxkZXIsIGlzU3RydWN0OmJvb2xlYW4pIHsKKyAgYnVpbGRlci5hZGRGaWVsZEludDgoMiwgK2lzU3RydWN0LCArZmFsc2UpOworfQorCitzdGF0aWMgYWRkTWluYWxpZ24oYnVpbGRlcjpmbGF0YnVmZmVycy5CdWlsZGVyLCBtaW5hbGlnbjpudW1iZXIpIHsKKyAgYnVpbGRlci5hZGRGaWVsZEludDMyKDMsIG1pbmFsaWduLCAwKTsKK30KKworc3RhdGljIGFkZEJ5dGVzaXplKGJ1aWxkZXI6ZmxhdGJ1ZmZlcnMuQnVpbGRlciwgYnl0ZXNpemU6bnVtYmVyKSB7CisgIGJ1aWxkZXIuYWRkRmllbGRJbnQzMig0LCBieXRlc2l6ZSwgMCk7Cit9CisKK3N0YXRpYyBhZGRBdHRyaWJ1dGVzKGJ1aWxkZXI6ZmxhdGJ1ZmZlcnMuQnVpbGRlciwgYXR0cmlidXRlc09mZnNldDpmbGF0YnVmZmVycy5PZmZzZXQpIHsKKyAgYnVpbGRlci5hZGRGaWVsZE9mZnNldCg1LCBhdHRyaWJ1dGVzT2Zmc2V0LCAwKTsKK30KKworc3RhdGljIGNyZWF0ZUF0dHJpYnV0ZXNWZWN0b3IoYnVpbGRlcjpmbGF0YnVmZmVycy5CdWlsZGVyLCBkYXRhOmZsYXRidWZmZXJzLk9mZnNldFtdKTpmbGF0YnVmZmVycy5PZmZzZXQgeworICBidWlsZGVyLnN0YXJ0VmVjdG9yKDQsIGRhdGEubGVuZ3RoLCA0KTsKKyAgZm9yIChsZXQgaSA9IGRhdGEubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHsKKyAgICBidWlsZGVyLmFkZE9mZnNldChkYXRhW2ldISk7CisgIH0KKyAgcmV0dXJuIGJ1aWxkZXIuZW5kVmVjdG9yKCk7Cit9CisKK3N0YXRpYyBzdGFydEF0dHJpYnV0ZXNWZWN0b3IoYnVpbGRlcjpmbGF0YnVmZmVycy5CdWlsZGVyLCBudW1FbGVtczpudW1iZXIpIHsKKyAgYnVpbGRlci5zdGFydFZlY3Rvcig0LCBudW1FbGVtcywgNCk7Cit9CisKK3N0YXRpYyBhZGREb2N1bWVudGF0aW9uKGJ1aWxkZXI6ZmxhdGJ1ZmZlcnMuQnVpbGRlciwgZG9jdW1lbnRhdGlvbk9mZnNldDpmbGF0YnVmZmVycy5PZmZzZXQpIHsKKyAgYnVpbGRlci5hZGRGaWVsZE9mZnNldCg2LCBkb2N1bWVudGF0aW9uT2Zmc2V0LCAwKTsKK30KKworc3RhdGljIGNyZWF0ZURvY3VtZW50YXRpb25WZWN0b3IoYnVpbGRlcjpmbGF0YnVmZmVycy5CdWlsZGVyLCBkYXRhOmZsYXRidWZmZXJzLk9mZnNldFtdKTpmbGF0YnVmZmVycy5PZmZzZXQgeworICBidWlsZGVyLnN0YXJ0VmVjdG9yKDQsIGRhdGEubGVuZ3RoLCA0KTsKKyAgZm9yIChsZXQgaSA9IGRhdGEubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHsKKyAgICBidWlsZGVyLmFkZE9mZnNldChkYXRhW2ldISk7CisgIH0KKyAgcmV0dXJuIGJ1aWxkZXIuZW5kVmVjdG9yKCk7Cit9CisKK3N0YXRpYyBzdGFydERvY3VtZW50YXRpb25WZWN0b3IoYnVpbGRlcjpmbGF0YnVmZmVycy5CdWlsZGVyLCBudW1FbGVtczpudW1iZXIpIHsKKyAgYnVpbGRlci5zdGFydFZlY3Rvcig0LCBudW1FbGVtcywgNCk7Cit9CisKK3N0YXRpYyBhZGREZWNsYXJhdGlvbkZpbGUoYnVpbGRlcjpmbGF0YnVmZmVycy5CdWlsZGVyLCBkZWNsYXJhdGlvbkZpbGVPZmZzZXQ6ZmxhdGJ1ZmZlcnMuT2Zmc2V0KSB7CisgIGJ1aWxkZXIuYWRkRmllbGRPZmZzZXQoNywgZGVjbGFyYXRpb25GaWxlT2Zmc2V0LCAwKTsKK30KKworc3RhdGljIGVuZE9iamVjdChidWlsZGVyOmZsYXRidWZmZXJzLkJ1aWxkZXIpOmZsYXRidWZmZXJzLk9mZnNldCB7CisgIGNvbnN0IG9mZnNldCA9IGJ1aWxkZXIuZW5kT2JqZWN0KCk7CisgIGJ1aWxkZXIucmVxdWlyZWRGaWVsZChvZmZzZXQsIDQpIC8vIG5hbWUKKyAgYnVpbGRlci5yZXF1aXJlZEZpZWxkKG9mZnNldCwgNikgLy8gZmllbGRzCisgIHJldHVybiBvZmZzZXQ7Cit9CisKK3N0YXRpYyBjcmVhdGVPYmplY3QoYnVpbGRlcjpmbGF0YnVmZmVycy5CdWlsZGVyLCBuYW1lT2Zmc2V0OmZsYXRidWZmZXJzLk9mZnNldCwgZmllbGRzT2Zmc2V0OmZsYXRidWZmZXJzLk9mZnNldCwgaXNTdHJ1Y3Q6Ym9vbGVhbiwgbWluYWxpZ246bnVtYmVyLCBieXRlc2l6ZTpudW1iZXIsIGF0dHJpYnV0ZXNPZmZzZXQ6ZmxhdGJ1ZmZlcnMuT2Zmc2V0LCBkb2N1bWVudGF0aW9uT2Zmc2V0OmZsYXRidWZmZXJzLk9mZnNldCwgZGVjbGFyYXRpb25GaWxlT2Zmc2V0OmZsYXRidWZmZXJzLk9mZnNldCk6ZmxhdGJ1ZmZlcnMuT2Zmc2V0IHsKKyAgT2JqZWN0Xy5zdGFydE9iamVjdChidWlsZGVyKTsKKyAgT2JqZWN0Xy5hZGROYW1lKGJ1aWxkZXIsIG5hbWVPZmZzZXQpOworICBPYmplY3RfLmFkZEZpZWxkcyhidWlsZGVyLCBmaWVsZHNPZmZzZXQpOworICBPYmplY3RfLmFkZElzU3RydWN0KGJ1aWxkZXIsIGlzU3RydWN0KTsKKyAgT2JqZWN0Xy5hZGRNaW5hbGlnbihidWlsZGVyLCBtaW5hbGlnbik7CisgIE9iamVjdF8uYWRkQnl0ZXNpemUoYnVpbGRlciwgYnl0ZXNpemUpOworICBPYmplY3RfLmFkZEF0dHJpYnV0ZXMoYnVpbGRlciwgYXR0cmlidXRlc09mZnNldCk7CisgIE9iamVjdF8uYWRkRG9jdW1lbnRhdGlvbihidWlsZGVyLCBkb2N1bWVudGF0aW9uT2Zmc2V0KTsKKyAgT2JqZWN0Xy5hZGREZWNsYXJhdGlvbkZpbGUoYnVpbGRlciwgZGVjbGFyYXRpb25GaWxlT2Zmc2V0KTsKKyAgcmV0dXJuIE9iamVjdF8uZW5kT2JqZWN0KGJ1aWxkZXIpOworfQorCit1bnBhY2soKTogT2JqZWN0X1QgeworICByZXR1cm4gbmV3IE9iamVjdF9UKAorICAgIHRoaXMubmFtZSgpLAorICAgIHRoaXMuYmIhLmNyZWF0ZU9iakxpc3QodGhpcy5maWVsZHMuYmluZCh0aGlzKSwgdGhpcy5maWVsZHNMZW5ndGgoKSksCisgICAgdGhpcy5pc1N0cnVjdCgpLAorICAgIHRoaXMubWluYWxpZ24oKSwKKyAgICB0aGlzLmJ5dGVzaXplKCksCisgICAgdGhpcy5iYiEuY3JlYXRlT2JqTGlzdCh0aGlzLmF0dHJpYnV0ZXMuYmluZCh0aGlzKSwgdGhpcy5hdHRyaWJ1dGVzTGVuZ3RoKCkpLAorICAgIHRoaXMuYmIhLmNyZWF0ZVNjYWxhckxpc3QodGhpcy5kb2N1bWVudGF0aW9uLmJpbmQodGhpcyksIHRoaXMuZG9jdW1lbnRhdGlvbkxlbmd0aCgpKSwKKyAgICB0aGlzLmRlY2xhcmF0aW9uRmlsZSgpCisgICk7Cit9CisKKwordW5wYWNrVG8oX286IE9iamVjdF9UKTogdm9pZCB7CisgIF9vLm5hbWUgPSB0aGlzLm5hbWUoKTsKKyAgX28uZmllbGRzID0gdGhpcy5iYiEuY3JlYXRlT2JqTGlzdCh0aGlzLmZpZWxkcy5iaW5kKHRoaXMpLCB0aGlzLmZpZWxkc0xlbmd0aCgpKTsKKyAgX28uaXNTdHJ1Y3QgPSB0aGlzLmlzU3RydWN0KCk7CisgIF9vLm1pbmFsaWduID0gdGhpcy5taW5hbGlnbigpOworICBfby5ieXRlc2l6ZSA9IHRoaXMuYnl0ZXNpemUoKTsKKyAgX28uYXR0cmlidXRlcyA9IHRoaXMuYmIhLmNyZWF0ZU9iakxpc3QodGhpcy5hdHRyaWJ1dGVzLmJpbmQodGhpcyksIHRoaXMuYXR0cmlidXRlc0xlbmd0aCgpKTsKKyAgX28uZG9jdW1lbnRhdGlvbiA9IHRoaXMuYmIhLmNyZWF0ZVNjYWxhckxpc3QodGhpcy5kb2N1bWVudGF0aW9uLmJpbmQodGhpcyksIHRoaXMuZG9jdW1lbnRhdGlvbkxlbmd0aCgpKTsKKyAgX28uZGVjbGFyYXRpb25GaWxlID0gdGhpcy5kZWNsYXJhdGlvbkZpbGUoKTsKK30KK30KKworZXhwb3J0IGNsYXNzIE9iamVjdF9UIHsKK2NvbnN0cnVjdG9yKAorICBwdWJsaWMgbmFtZTogc3RyaW5nfFVpbnQ4QXJyYXl8bnVsbCA9IG51bGwsCisgIHB1YmxpYyBmaWVsZHM6IChGaWVsZFQpW10gPSBbXSwKKyAgcHVibGljIGlzU3RydWN0OiBib29sZWFuID0gZmFsc2UsCisgIHB1YmxpYyBtaW5hbGlnbjogbnVtYmVyID0gMCwKKyAgcHVibGljIGJ5dGVzaXplOiBudW1iZXIgPSAwLAorICBwdWJsaWMgYXR0cmlidXRlczogKEtleVZhbHVlVClbXSA9IFtdLAorICBwdWJsaWMgZG9jdW1lbnRhdGlvbjogKHN0cmluZylbXSA9IFtdLAorICBwdWJsaWMgZGVjbGFyYXRpb25GaWxlOiBzdHJpbmd8VWludDhBcnJheXxudWxsID0gbnVsbAorKXt9CisKKworcGFjayhidWlsZGVyOmZsYXRidWZmZXJzLkJ1aWxkZXIpOiBmbGF0YnVmZmVycy5PZmZzZXQgeworICBjb25zdCBuYW1lID0gKHRoaXMubmFtZSAhPT0gbnVsbCA/IGJ1aWxkZXIuY3JlYXRlU3RyaW5nKHRoaXMubmFtZSEpIDogMCk7CisgIGNvbnN0IGZpZWxkcyA9IE9iamVjdF8uY3JlYXRlRmllbGRzVmVjdG9yKGJ1aWxkZXIsIGJ1aWxkZXIuY3JlYXRlT2JqZWN0T2Zmc2V0TGlzdCh0aGlzLmZpZWxkcykpOworICBjb25zdCBhdHRyaWJ1dGVzID0gT2JqZWN0Xy5jcmVhdGVBdHRyaWJ1dGVzVmVjdG9yKGJ1aWxkZXIsIGJ1aWxkZXIuY3JlYXRlT2JqZWN0T2Zmc2V0TGlzdCh0aGlzLmF0dHJpYnV0ZXMpKTsKKyAgY29uc3QgZG9jdW1lbnRhdGlvbiA9IE9iamVjdF8uY3JlYXRlRG9jdW1lbnRhdGlvblZlY3RvcihidWlsZGVyLCBidWlsZGVyLmNyZWF0ZU9iamVjdE9mZnNldExpc3QodGhpcy5kb2N1bWVudGF0aW9uKSk7CisgIGNvbnN0IGRlY2xhcmF0aW9uRmlsZSA9ICh0aGlzLmRlY2xhcmF0aW9uRmlsZSAhPT0gbnVsbCA/IGJ1aWxkZXIuY3JlYXRlU3RyaW5nKHRoaXMuZGVjbGFyYXRpb25GaWxlISkgOiAwKTsKKworICByZXR1cm4gT2JqZWN0Xy5jcmVhdGVPYmplY3QoYnVpbGRlciwKKyAgICBuYW1lLAorICAgIGZpZWxkcywKKyAgICB0aGlzLmlzU3RydWN0LAorICAgIHRoaXMubWluYWxpZ24sCisgICAgdGhpcy5ieXRlc2l6ZSwKKyAgICBhdHRyaWJ1dGVzLAorICAgIGRvY3VtZW50YXRpb24sCisgICAgZGVjbGFyYXRpb25GaWxlCisgICk7Cit9Cit9CisKK2V4cG9ydCBjbGFzcyBSUENDYWxsIHsKKyAgYmI6IGZsYXRidWZmZXJzLkJ5dGVCdWZmZXJ8bnVsbCA9IG51bGw7CisgIGJiX3BvcyA9IDA7CisgIF9faW5pdChpOm51bWJlciwgYmI6ZmxhdGJ1ZmZlcnMuQnl0ZUJ1ZmZlcik6UlBDQ2FsbCB7CisgIHRoaXMuYmJfcG9zID0gaTsKKyAgdGhpcy5iYiA9IGJiOworICByZXR1cm4gdGhpczsKK30KKworc3RhdGljIGdldFJvb3RBc1JQQ0NhbGwoYmI6ZmxhdGJ1ZmZlcnMuQnl0ZUJ1ZmZlciwgb2JqPzpSUENDYWxsKTpSUENDYWxsIHsKKyAgcmV0dXJuIChvYmogfHwgbmV3IFJQQ0NhbGwoKSkuX19pbml0KGJiLnJlYWRJbnQzMihiYi5wb3NpdGlvbigpKSArIGJiLnBvc2l0aW9uKCksIGJiKTsKK30KKworc3RhdGljIGdldFNpemVQcmVmaXhlZFJvb3RBc1JQQ0NhbGwoYmI6ZmxhdGJ1ZmZlcnMuQnl0ZUJ1ZmZlciwgb2JqPzpSUENDYWxsKTpSUENDYWxsIHsKKyAgYmIuc2V0UG9zaXRpb24oYmIucG9zaXRpb24oKSArIGZsYXRidWZmZXJzLlNJWkVfUFJFRklYX0xFTkdUSCk7CisgIHJldHVybiAob2JqIHx8IG5ldyBSUENDYWxsKCkpLl9faW5pdChiYi5yZWFkSW50MzIoYmIucG9zaXRpb24oKSkgKyBiYi5wb3NpdGlvbigpLCBiYik7Cit9CisKK25hbWUoKTpzdHJpbmd8bnVsbAorbmFtZShvcHRpb25hbEVuY29kaW5nOmZsYXRidWZmZXJzLkVuY29kaW5nKTpzdHJpbmd8VWludDhBcnJheXxudWxsCituYW1lKG9wdGlvbmFsRW5jb2Rpbmc/OmFueSk6c3RyaW5nfFVpbnQ4QXJyYXl8bnVsbCB7CisgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIhLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCA0KTsKKyAgcmV0dXJuIG9mZnNldCA/IHRoaXMuYmIhLl9fc3RyaW5nKHRoaXMuYmJfcG9zICsgb2Zmc2V0LCBvcHRpb25hbEVuY29kaW5nKSA6IG51bGw7Cit9CisKK3JlcXVlc3Qob2JqPzpPYmplY3RfKTpPYmplY3RffG51bGwgeworICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiIS5fX29mZnNldCh0aGlzLmJiX3BvcywgNik7CisgIHJldHVybiBvZmZzZXQgPyAob2JqIHx8IG5ldyBPYmplY3RfKCkpLl9faW5pdCh0aGlzLmJiIS5fX2luZGlyZWN0KHRoaXMuYmJfcG9zICsgb2Zmc2V0KSwgdGhpcy5iYiEpIDogbnVsbDsKK30KKworcmVzcG9uc2Uob2JqPzpPYmplY3RfKTpPYmplY3RffG51bGwgeworICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiIS5fX29mZnNldCh0aGlzLmJiX3BvcywgOCk7CisgIHJldHVybiBvZmZzZXQgPyAob2JqIHx8IG5ldyBPYmplY3RfKCkpLl9faW5pdCh0aGlzLmJiIS5fX2luZGlyZWN0KHRoaXMuYmJfcG9zICsgb2Zmc2V0KSwgdGhpcy5iYiEpIDogbnVsbDsKK30KKworYXR0cmlidXRlcyhpbmRleDogbnVtYmVyLCBvYmo/OktleVZhbHVlKTpLZXlWYWx1ZXxudWxsIHsKKyAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYiEuX19vZmZzZXQodGhpcy5iYl9wb3MsIDEwKTsKKyAgcmV0dXJuIG9mZnNldCA/IChvYmogfHwgbmV3IEtleVZhbHVlKCkpLl9faW5pdCh0aGlzLmJiIS5fX2luZGlyZWN0KHRoaXMuYmIhLl9fdmVjdG9yKHRoaXMuYmJfcG9zICsgb2Zmc2V0KSArIGluZGV4ICogNCksIHRoaXMuYmIhKSA6IG51bGw7Cit9CisKK2F0dHJpYnV0ZXNMZW5ndGgoKTpudW1iZXIgeworICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiIS5fX29mZnNldCh0aGlzLmJiX3BvcywgMTApOworICByZXR1cm4gb2Zmc2V0ID8gdGhpcy5iYiEuX192ZWN0b3JfbGVuKHRoaXMuYmJfcG9zICsgb2Zmc2V0KSA6IDA7Cit9CisKK2RvY3VtZW50YXRpb24oaW5kZXg6IG51bWJlcik6c3RyaW5nCitkb2N1bWVudGF0aW9uKGluZGV4OiBudW1iZXIsb3B0aW9uYWxFbmNvZGluZzpmbGF0YnVmZmVycy5FbmNvZGluZyk6c3RyaW5nfFVpbnQ4QXJyYXkKK2RvY3VtZW50YXRpb24oaW5kZXg6IG51bWJlcixvcHRpb25hbEVuY29kaW5nPzphbnkpOnN0cmluZ3xVaW50OEFycmF5fG51bGwgeworICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiIS5fX29mZnNldCh0aGlzLmJiX3BvcywgMTIpOworICByZXR1cm4gb2Zmc2V0ID8gdGhpcy5iYiEuX19zdHJpbmcodGhpcy5iYiEuX192ZWN0b3IodGhpcy5iYl9wb3MgKyBvZmZzZXQpICsgaW5kZXggKiA0LCBvcHRpb25hbEVuY29kaW5nKSA6IG51bGw7Cit9CisKK2RvY3VtZW50YXRpb25MZW5ndGgoKTpudW1iZXIgeworICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiIS5fX29mZnNldCh0aGlzLmJiX3BvcywgMTIpOworICByZXR1cm4gb2Zmc2V0ID8gdGhpcy5iYiEuX192ZWN0b3JfbGVuKHRoaXMuYmJfcG9zICsgb2Zmc2V0KSA6IDA7Cit9CisKK3N0YXRpYyBnZXRGdWxseVF1YWxpZmllZE5hbWUoKTpzdHJpbmcgeworICByZXR1cm4gJ3JlZmxlY3Rpb25fUlBDQ2FsbCc7Cit9CisKK3N0YXRpYyBzdGFydFJQQ0NhbGwoYnVpbGRlcjpmbGF0YnVmZmVycy5CdWlsZGVyKSB7CisgIGJ1aWxkZXIuc3RhcnRPYmplY3QoNSk7Cit9CisKK3N0YXRpYyBhZGROYW1lKGJ1aWxkZXI6ZmxhdGJ1ZmZlcnMuQnVpbGRlciwgbmFtZU9mZnNldDpmbGF0YnVmZmVycy5PZmZzZXQpIHsKKyAgYnVpbGRlci5hZGRGaWVsZE9mZnNldCgwLCBuYW1lT2Zmc2V0LCAwKTsKK30KKworc3RhdGljIGFkZFJlcXVlc3QoYnVpbGRlcjpmbGF0YnVmZmVycy5CdWlsZGVyLCByZXF1ZXN0T2Zmc2V0OmZsYXRidWZmZXJzLk9mZnNldCkgeworICBidWlsZGVyLmFkZEZpZWxkT2Zmc2V0KDEsIHJlcXVlc3RPZmZzZXQsIDApOworfQorCitzdGF0aWMgYWRkUmVzcG9uc2UoYnVpbGRlcjpmbGF0YnVmZmVycy5CdWlsZGVyLCByZXNwb25zZU9mZnNldDpmbGF0YnVmZmVycy5PZmZzZXQpIHsKKyAgYnVpbGRlci5hZGRGaWVsZE9mZnNldCgyLCByZXNwb25zZU9mZnNldCwgMCk7Cit9CisKK3N0YXRpYyBhZGRBdHRyaWJ1dGVzKGJ1aWxkZXI6ZmxhdGJ1ZmZlcnMuQnVpbGRlciwgYXR0cmlidXRlc09mZnNldDpmbGF0YnVmZmVycy5PZmZzZXQpIHsKKyAgYnVpbGRlci5hZGRGaWVsZE9mZnNldCgzLCBhdHRyaWJ1dGVzT2Zmc2V0LCAwKTsKK30KKworc3RhdGljIGNyZWF0ZUF0dHJpYnV0ZXNWZWN0b3IoYnVpbGRlcjpmbGF0YnVmZmVycy5CdWlsZGVyLCBkYXRhOmZsYXRidWZmZXJzLk9mZnNldFtdKTpmbGF0YnVmZmVycy5PZmZzZXQgeworICBidWlsZGVyLnN0YXJ0VmVjdG9yKDQsIGRhdGEubGVuZ3RoLCA0KTsKKyAgZm9yIChsZXQgaSA9IGRhdGEubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHsKKyAgICBidWlsZGVyLmFkZE9mZnNldChkYXRhW2ldISk7CisgIH0KKyAgcmV0dXJuIGJ1aWxkZXIuZW5kVmVjdG9yKCk7Cit9CisKK3N0YXRpYyBzdGFydEF0dHJpYnV0ZXNWZWN0b3IoYnVpbGRlcjpmbGF0YnVmZmVycy5CdWlsZGVyLCBudW1FbGVtczpudW1iZXIpIHsKKyAgYnVpbGRlci5zdGFydFZlY3Rvcig0LCBudW1FbGVtcywgNCk7Cit9CisKK3N0YXRpYyBhZGREb2N1bWVudGF0aW9uKGJ1aWxkZXI6ZmxhdGJ1ZmZlcnMuQnVpbGRlciwgZG9jdW1lbnRhdGlvbk9mZnNldDpmbGF0YnVmZmVycy5PZmZzZXQpIHsKKyAgYnVpbGRlci5hZGRGaWVsZE9mZnNldCg0LCBkb2N1bWVudGF0aW9uT2Zmc2V0LCAwKTsKK30KKworc3RhdGljIGNyZWF0ZURvY3VtZW50YXRpb25WZWN0b3IoYnVpbGRlcjpmbGF0YnVmZmVycy5CdWlsZGVyLCBkYXRhOmZsYXRidWZmZXJzLk9mZnNldFtdKTpmbGF0YnVmZmVycy5PZmZzZXQgeworICBidWlsZGVyLnN0YXJ0VmVjdG9yKDQsIGRhdGEubGVuZ3RoLCA0KTsKKyAgZm9yIChsZXQgaSA9IGRhdGEubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHsKKyAgICBidWlsZGVyLmFkZE9mZnNldChkYXRhW2ldISk7CisgIH0KKyAgcmV0dXJuIGJ1aWxkZXIuZW5kVmVjdG9yKCk7Cit9CisKK3N0YXRpYyBzdGFydERvY3VtZW50YXRpb25WZWN0b3IoYnVpbGRlcjpmbGF0YnVmZmVycy5CdWlsZGVyLCBudW1FbGVtczpudW1iZXIpIHsKKyAgYnVpbGRlci5zdGFydFZlY3Rvcig0LCBudW1FbGVtcywgNCk7Cit9CisKK3N0YXRpYyBlbmRSUENDYWxsKGJ1aWxkZXI6ZmxhdGJ1ZmZlcnMuQnVpbGRlcik6ZmxhdGJ1ZmZlcnMuT2Zmc2V0IHsKKyAgY29uc3Qgb2Zmc2V0ID0gYnVpbGRlci5lbmRPYmplY3QoKTsKKyAgYnVpbGRlci5yZXF1aXJlZEZpZWxkKG9mZnNldCwgNCkgLy8gbmFtZQorICBidWlsZGVyLnJlcXVpcmVkRmllbGQob2Zmc2V0LCA2KSAvLyByZXF1ZXN0CisgIGJ1aWxkZXIucmVxdWlyZWRGaWVsZChvZmZzZXQsIDgpIC8vIHJlc3BvbnNlCisgIHJldHVybiBvZmZzZXQ7Cit9CisKKwordW5wYWNrKCk6IFJQQ0NhbGxUIHsKKyAgcmV0dXJuIG5ldyBSUENDYWxsVCgKKyAgICB0aGlzLm5hbWUoKSwKKyAgICAodGhpcy5yZXF1ZXN0KCkgIT09IG51bGwgPyB0aGlzLnJlcXVlc3QoKSEudW5wYWNrKCkgOiBudWxsKSwKKyAgICAodGhpcy5yZXNwb25zZSgpICE9PSBudWxsID8gdGhpcy5yZXNwb25zZSgpIS51bnBhY2soKSA6IG51bGwpLAorICAgIHRoaXMuYmIhLmNyZWF0ZU9iakxpc3QodGhpcy5hdHRyaWJ1dGVzLmJpbmQodGhpcyksIHRoaXMuYXR0cmlidXRlc0xlbmd0aCgpKSwKKyAgICB0aGlzLmJiIS5jcmVhdGVTY2FsYXJMaXN0KHRoaXMuZG9jdW1lbnRhdGlvbi5iaW5kKHRoaXMpLCB0aGlzLmRvY3VtZW50YXRpb25MZW5ndGgoKSkKKyAgKTsKK30KKworCit1bnBhY2tUbyhfbzogUlBDQ2FsbFQpOiB2b2lkIHsKKyAgX28ubmFtZSA9IHRoaXMubmFtZSgpOworICBfby5yZXF1ZXN0ID0gKHRoaXMucmVxdWVzdCgpICE9PSBudWxsID8gdGhpcy5yZXF1ZXN0KCkhLnVucGFjaygpIDogbnVsbCk7CisgIF9vLnJlc3BvbnNlID0gKHRoaXMucmVzcG9uc2UoKSAhPT0gbnVsbCA/IHRoaXMucmVzcG9uc2UoKSEudW5wYWNrKCkgOiBudWxsKTsKKyAgX28uYXR0cmlidXRlcyA9IHRoaXMuYmIhLmNyZWF0ZU9iakxpc3QodGhpcy5hdHRyaWJ1dGVzLmJpbmQodGhpcyksIHRoaXMuYXR0cmlidXRlc0xlbmd0aCgpKTsKKyAgX28uZG9jdW1lbnRhdGlvbiA9IHRoaXMuYmIhLmNyZWF0ZVNjYWxhckxpc3QodGhpcy5kb2N1bWVudGF0aW9uLmJpbmQodGhpcyksIHRoaXMuZG9jdW1lbnRhdGlvbkxlbmd0aCgpKTsKK30KK30KKworZXhwb3J0IGNsYXNzIFJQQ0NhbGxUIHsKK2NvbnN0cnVjdG9yKAorICBwdWJsaWMgbmFtZTogc3RyaW5nfFVpbnQ4QXJyYXl8bnVsbCA9IG51bGwsCisgIHB1YmxpYyByZXF1ZXN0OiBPYmplY3RfVHxudWxsID0gbnVsbCwKKyAgcHVibGljIHJlc3BvbnNlOiBPYmplY3RfVHxudWxsID0gbnVsbCwKKyAgcHVibGljIGF0dHJpYnV0ZXM6IChLZXlWYWx1ZVQpW10gPSBbXSwKKyAgcHVibGljIGRvY3VtZW50YXRpb246IChzdHJpbmcpW10gPSBbXQorKXt9CisKKworcGFjayhidWlsZGVyOmZsYXRidWZmZXJzLkJ1aWxkZXIpOiBmbGF0YnVmZmVycy5PZmZzZXQgeworICBjb25zdCBuYW1lID0gKHRoaXMubmFtZSAhPT0gbnVsbCA/IGJ1aWxkZXIuY3JlYXRlU3RyaW5nKHRoaXMubmFtZSEpIDogMCk7CisgIGNvbnN0IHJlcXVlc3QgPSAodGhpcy5yZXF1ZXN0ICE9PSBudWxsID8gdGhpcy5yZXF1ZXN0IS5wYWNrKGJ1aWxkZXIpIDogMCk7CisgIGNvbnN0IHJlc3BvbnNlID0gKHRoaXMucmVzcG9uc2UgIT09IG51bGwgPyB0aGlzLnJlc3BvbnNlIS5wYWNrKGJ1aWxkZXIpIDogMCk7CisgIGNvbnN0IGF0dHJpYnV0ZXMgPSBSUENDYWxsLmNyZWF0ZUF0dHJpYnV0ZXNWZWN0b3IoYnVpbGRlciwgYnVpbGRlci5jcmVhdGVPYmplY3RPZmZzZXRMaXN0KHRoaXMuYXR0cmlidXRlcykpOworICBjb25zdCBkb2N1bWVudGF0aW9uID0gUlBDQ2FsbC5jcmVhdGVEb2N1bWVudGF0aW9uVmVjdG9yKGJ1aWxkZXIsIGJ1aWxkZXIuY3JlYXRlT2JqZWN0T2Zmc2V0TGlzdCh0aGlzLmRvY3VtZW50YXRpb24pKTsKKworICBSUENDYWxsLnN0YXJ0UlBDQ2FsbChidWlsZGVyKTsKKyAgUlBDQ2FsbC5hZGROYW1lKGJ1aWxkZXIsIG5hbWUpOworICBSUENDYWxsLmFkZFJlcXVlc3QoYnVpbGRlciwgcmVxdWVzdCk7CisgIFJQQ0NhbGwuYWRkUmVzcG9uc2UoYnVpbGRlciwgcmVzcG9uc2UpOworICBSUENDYWxsLmFkZEF0dHJpYnV0ZXMoYnVpbGRlciwgYXR0cmlidXRlcyk7CisgIFJQQ0NhbGwuYWRkRG9jdW1lbnRhdGlvbihidWlsZGVyLCBkb2N1bWVudGF0aW9uKTsKKworICByZXR1cm4gUlBDQ2FsbC5lbmRSUENDYWxsKGJ1aWxkZXIpOworfQorfQorCitleHBvcnQgY2xhc3MgU2VydmljZSB7CisgIGJiOiBmbGF0YnVmZmVycy5CeXRlQnVmZmVyfG51bGwgPSBudWxsOworICBiYl9wb3MgPSAwOworICBfX2luaXQoaTpudW1iZXIsIGJiOmZsYXRidWZmZXJzLkJ5dGVCdWZmZXIpOlNlcnZpY2UgeworICB0aGlzLmJiX3BvcyA9IGk7CisgIHRoaXMuYmIgPSBiYjsKKyAgcmV0dXJuIHRoaXM7Cit9CisKK3N0YXRpYyBnZXRSb290QXNTZXJ2aWNlKGJiOmZsYXRidWZmZXJzLkJ5dGVCdWZmZXIsIG9iaj86U2VydmljZSk6U2VydmljZSB7CisgIHJldHVybiAob2JqIHx8IG5ldyBTZXJ2aWNlKCkpLl9faW5pdChiYi5yZWFkSW50MzIoYmIucG9zaXRpb24oKSkgKyBiYi5wb3NpdGlvbigpLCBiYik7Cit9CisKK3N0YXRpYyBnZXRTaXplUHJlZml4ZWRSb290QXNTZXJ2aWNlKGJiOmZsYXRidWZmZXJzLkJ5dGVCdWZmZXIsIG9iaj86U2VydmljZSk6U2VydmljZSB7CisgIGJiLnNldFBvc2l0aW9uKGJiLnBvc2l0aW9uKCkgKyBmbGF0YnVmZmVycy5TSVpFX1BSRUZJWF9MRU5HVEgpOworICByZXR1cm4gKG9iaiB8fCBuZXcgU2VydmljZSgpKS5fX2luaXQoYmIucmVhZEludDMyKGJiLnBvc2l0aW9uKCkpICsgYmIucG9zaXRpb24oKSwgYmIpOworfQorCituYW1lKCk6c3RyaW5nfG51bGwKK25hbWUob3B0aW9uYWxFbmNvZGluZzpmbGF0YnVmZmVycy5FbmNvZGluZyk6c3RyaW5nfFVpbnQ4QXJyYXl8bnVsbAorbmFtZShvcHRpb25hbEVuY29kaW5nPzphbnkpOnN0cmluZ3xVaW50OEFycmF5fG51bGwgeworICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiIS5fX29mZnNldCh0aGlzLmJiX3BvcywgNCk7CisgIHJldHVybiBvZmZzZXQgPyB0aGlzLmJiIS5fX3N0cmluZyh0aGlzLmJiX3BvcyArIG9mZnNldCwgb3B0aW9uYWxFbmNvZGluZykgOiBudWxsOworfQorCitjYWxscyhpbmRleDogbnVtYmVyLCBvYmo/OlJQQ0NhbGwpOlJQQ0NhbGx8bnVsbCB7CisgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIhLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCA2KTsKKyAgcmV0dXJuIG9mZnNldCA/IChvYmogfHwgbmV3IFJQQ0NhbGwoKSkuX19pbml0KHRoaXMuYmIhLl9faW5kaXJlY3QodGhpcy5iYiEuX192ZWN0b3IodGhpcy5iYl9wb3MgKyBvZmZzZXQpICsgaW5kZXggKiA0KSwgdGhpcy5iYiEpIDogbnVsbDsKK30KKworY2FsbHNMZW5ndGgoKTpudW1iZXIgeworICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiIS5fX29mZnNldCh0aGlzLmJiX3BvcywgNik7CisgIHJldHVybiBvZmZzZXQgPyB0aGlzLmJiIS5fX3ZlY3Rvcl9sZW4odGhpcy5iYl9wb3MgKyBvZmZzZXQpIDogMDsKK30KKworYXR0cmlidXRlcyhpbmRleDogbnVtYmVyLCBvYmo/OktleVZhbHVlKTpLZXlWYWx1ZXxudWxsIHsKKyAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYiEuX19vZmZzZXQodGhpcy5iYl9wb3MsIDgpOworICByZXR1cm4gb2Zmc2V0ID8gKG9iaiB8fCBuZXcgS2V5VmFsdWUoKSkuX19pbml0KHRoaXMuYmIhLl9faW5kaXJlY3QodGhpcy5iYiEuX192ZWN0b3IodGhpcy5iYl9wb3MgKyBvZmZzZXQpICsgaW5kZXggKiA0KSwgdGhpcy5iYiEpIDogbnVsbDsKK30KKworYXR0cmlidXRlc0xlbmd0aCgpOm51bWJlciB7CisgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIhLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCA4KTsKKyAgcmV0dXJuIG9mZnNldCA/IHRoaXMuYmIhLl9fdmVjdG9yX2xlbih0aGlzLmJiX3BvcyArIG9mZnNldCkgOiAwOworfQorCitkb2N1bWVudGF0aW9uKGluZGV4OiBudW1iZXIpOnN0cmluZworZG9jdW1lbnRhdGlvbihpbmRleDogbnVtYmVyLG9wdGlvbmFsRW5jb2Rpbmc6ZmxhdGJ1ZmZlcnMuRW5jb2RpbmcpOnN0cmluZ3xVaW50OEFycmF5Citkb2N1bWVudGF0aW9uKGluZGV4OiBudW1iZXIsb3B0aW9uYWxFbmNvZGluZz86YW55KTpzdHJpbmd8VWludDhBcnJheXxudWxsIHsKKyAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYiEuX19vZmZzZXQodGhpcy5iYl9wb3MsIDEwKTsKKyAgcmV0dXJuIG9mZnNldCA/IHRoaXMuYmIhLl9fc3RyaW5nKHRoaXMuYmIhLl9fdmVjdG9yKHRoaXMuYmJfcG9zICsgb2Zmc2V0KSArIGluZGV4ICogNCwgb3B0aW9uYWxFbmNvZGluZykgOiBudWxsOworfQorCitkb2N1bWVudGF0aW9uTGVuZ3RoKCk6bnVtYmVyIHsKKyAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYiEuX19vZmZzZXQodGhpcy5iYl9wb3MsIDEwKTsKKyAgcmV0dXJuIG9mZnNldCA/IHRoaXMuYmIhLl9fdmVjdG9yX2xlbih0aGlzLmJiX3BvcyArIG9mZnNldCkgOiAwOworfQorCisvKioKKyAqIEZpbGUgdGhhdCB0aGlzIFNlcnZpY2UgaXMgZGVjbGFyZWQgaW4uCisgKi8KK2RlY2xhcmF0aW9uRmlsZSgpOnN0cmluZ3xudWxsCitkZWNsYXJhdGlvbkZpbGUob3B0aW9uYWxFbmNvZGluZzpmbGF0YnVmZmVycy5FbmNvZGluZyk6c3RyaW5nfFVpbnQ4QXJyYXl8bnVsbAorZGVjbGFyYXRpb25GaWxlKG9wdGlvbmFsRW5jb2Rpbmc/OmFueSk6c3RyaW5nfFVpbnQ4QXJyYXl8bnVsbCB7CisgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIhLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCAxMik7CisgIHJldHVybiBvZmZzZXQgPyB0aGlzLmJiIS5fX3N0cmluZyh0aGlzLmJiX3BvcyArIG9mZnNldCwgb3B0aW9uYWxFbmNvZGluZykgOiBudWxsOworfQorCitzdGF0aWMgZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCk6c3RyaW5nIHsKKyAgcmV0dXJuICdyZWZsZWN0aW9uX1NlcnZpY2UnOworfQorCitzdGF0aWMgc3RhcnRTZXJ2aWNlKGJ1aWxkZXI6ZmxhdGJ1ZmZlcnMuQnVpbGRlcikgeworICBidWlsZGVyLnN0YXJ0T2JqZWN0KDUpOworfQorCitzdGF0aWMgYWRkTmFtZShidWlsZGVyOmZsYXRidWZmZXJzLkJ1aWxkZXIsIG5hbWVPZmZzZXQ6ZmxhdGJ1ZmZlcnMuT2Zmc2V0KSB7CisgIGJ1aWxkZXIuYWRkRmllbGRPZmZzZXQoMCwgbmFtZU9mZnNldCwgMCk7Cit9CisKK3N0YXRpYyBhZGRDYWxscyhidWlsZGVyOmZsYXRidWZmZXJzLkJ1aWxkZXIsIGNhbGxzT2Zmc2V0OmZsYXRidWZmZXJzLk9mZnNldCkgeworICBidWlsZGVyLmFkZEZpZWxkT2Zmc2V0KDEsIGNhbGxzT2Zmc2V0LCAwKTsKK30KKworc3RhdGljIGNyZWF0ZUNhbGxzVmVjdG9yKGJ1aWxkZXI6ZmxhdGJ1ZmZlcnMuQnVpbGRlciwgZGF0YTpmbGF0YnVmZmVycy5PZmZzZXRbXSk6ZmxhdGJ1ZmZlcnMuT2Zmc2V0IHsKKyAgYnVpbGRlci5zdGFydFZlY3Rvcig0LCBkYXRhLmxlbmd0aCwgNCk7CisgIGZvciAobGV0IGkgPSBkYXRhLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7CisgICAgYnVpbGRlci5hZGRPZmZzZXQoZGF0YVtpXSEpOworICB9CisgIHJldHVybiBidWlsZGVyLmVuZFZlY3RvcigpOworfQorCitzdGF0aWMgc3RhcnRDYWxsc1ZlY3RvcihidWlsZGVyOmZsYXRidWZmZXJzLkJ1aWxkZXIsIG51bUVsZW1zOm51bWJlcikgeworICBidWlsZGVyLnN0YXJ0VmVjdG9yKDQsIG51bUVsZW1zLCA0KTsKK30KKworc3RhdGljIGFkZEF0dHJpYnV0ZXMoYnVpbGRlcjpmbGF0YnVmZmVycy5CdWlsZGVyLCBhdHRyaWJ1dGVzT2Zmc2V0OmZsYXRidWZmZXJzLk9mZnNldCkgeworICBidWlsZGVyLmFkZEZpZWxkT2Zmc2V0KDIsIGF0dHJpYnV0ZXNPZmZzZXQsIDApOworfQorCitzdGF0aWMgY3JlYXRlQXR0cmlidXRlc1ZlY3RvcihidWlsZGVyOmZsYXRidWZmZXJzLkJ1aWxkZXIsIGRhdGE6ZmxhdGJ1ZmZlcnMuT2Zmc2V0W10pOmZsYXRidWZmZXJzLk9mZnNldCB7CisgIGJ1aWxkZXIuc3RhcnRWZWN0b3IoNCwgZGF0YS5sZW5ndGgsIDQpOworICBmb3IgKGxldCBpID0gZGF0YS5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgeworICAgIGJ1aWxkZXIuYWRkT2Zmc2V0KGRhdGFbaV0hKTsKKyAgfQorICByZXR1cm4gYnVpbGRlci5lbmRWZWN0b3IoKTsKK30KKworc3RhdGljIHN0YXJ0QXR0cmlidXRlc1ZlY3RvcihidWlsZGVyOmZsYXRidWZmZXJzLkJ1aWxkZXIsIG51bUVsZW1zOm51bWJlcikgeworICBidWlsZGVyLnN0YXJ0VmVjdG9yKDQsIG51bUVsZW1zLCA0KTsKK30KKworc3RhdGljIGFkZERvY3VtZW50YXRpb24oYnVpbGRlcjpmbGF0YnVmZmVycy5CdWlsZGVyLCBkb2N1bWVudGF0aW9uT2Zmc2V0OmZsYXRidWZmZXJzLk9mZnNldCkgeworICBidWlsZGVyLmFkZEZpZWxkT2Zmc2V0KDMsIGRvY3VtZW50YXRpb25PZmZzZXQsIDApOworfQorCitzdGF0aWMgY3JlYXRlRG9jdW1lbnRhdGlvblZlY3RvcihidWlsZGVyOmZsYXRidWZmZXJzLkJ1aWxkZXIsIGRhdGE6ZmxhdGJ1ZmZlcnMuT2Zmc2V0W10pOmZsYXRidWZmZXJzLk9mZnNldCB7CisgIGJ1aWxkZXIuc3RhcnRWZWN0b3IoNCwgZGF0YS5sZW5ndGgsIDQpOworICBmb3IgKGxldCBpID0gZGF0YS5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgeworICAgIGJ1aWxkZXIuYWRkT2Zmc2V0KGRhdGFbaV0hKTsKKyAgfQorICByZXR1cm4gYnVpbGRlci5lbmRWZWN0b3IoKTsKK30KKworc3RhdGljIHN0YXJ0RG9jdW1lbnRhdGlvblZlY3RvcihidWlsZGVyOmZsYXRidWZmZXJzLkJ1aWxkZXIsIG51bUVsZW1zOm51bWJlcikgeworICBidWlsZGVyLnN0YXJ0VmVjdG9yKDQsIG51bUVsZW1zLCA0KTsKK30KKworc3RhdGljIGFkZERlY2xhcmF0aW9uRmlsZShidWlsZGVyOmZsYXRidWZmZXJzLkJ1aWxkZXIsIGRlY2xhcmF0aW9uRmlsZU9mZnNldDpmbGF0YnVmZmVycy5PZmZzZXQpIHsKKyAgYnVpbGRlci5hZGRGaWVsZE9mZnNldCg0LCBkZWNsYXJhdGlvbkZpbGVPZmZzZXQsIDApOworfQorCitzdGF0aWMgZW5kU2VydmljZShidWlsZGVyOmZsYXRidWZmZXJzLkJ1aWxkZXIpOmZsYXRidWZmZXJzLk9mZnNldCB7CisgIGNvbnN0IG9mZnNldCA9IGJ1aWxkZXIuZW5kT2JqZWN0KCk7CisgIGJ1aWxkZXIucmVxdWlyZWRGaWVsZChvZmZzZXQsIDQpIC8vIG5hbWUKKyAgcmV0dXJuIG9mZnNldDsKK30KKworc3RhdGljIGNyZWF0ZVNlcnZpY2UoYnVpbGRlcjpmbGF0YnVmZmVycy5CdWlsZGVyLCBuYW1lT2Zmc2V0OmZsYXRidWZmZXJzLk9mZnNldCwgY2FsbHNPZmZzZXQ6ZmxhdGJ1ZmZlcnMuT2Zmc2V0LCBhdHRyaWJ1dGVzT2Zmc2V0OmZsYXRidWZmZXJzLk9mZnNldCwgZG9jdW1lbnRhdGlvbk9mZnNldDpmbGF0YnVmZmVycy5PZmZzZXQsIGRlY2xhcmF0aW9uRmlsZU9mZnNldDpmbGF0YnVmZmVycy5PZmZzZXQpOmZsYXRidWZmZXJzLk9mZnNldCB7CisgIFNlcnZpY2Uuc3RhcnRTZXJ2aWNlKGJ1aWxkZXIpOworICBTZXJ2aWNlLmFkZE5hbWUoYnVpbGRlciwgbmFtZU9mZnNldCk7CisgIFNlcnZpY2UuYWRkQ2FsbHMoYnVpbGRlciwgY2FsbHNPZmZzZXQpOworICBTZXJ2aWNlLmFkZEF0dHJpYnV0ZXMoYnVpbGRlciwgYXR0cmlidXRlc09mZnNldCk7CisgIFNlcnZpY2UuYWRkRG9jdW1lbnRhdGlvbihidWlsZGVyLCBkb2N1bWVudGF0aW9uT2Zmc2V0KTsKKyAgU2VydmljZS5hZGREZWNsYXJhdGlvbkZpbGUoYnVpbGRlciwgZGVjbGFyYXRpb25GaWxlT2Zmc2V0KTsKKyAgcmV0dXJuIFNlcnZpY2UuZW5kU2VydmljZShidWlsZGVyKTsKK30KKwordW5wYWNrKCk6IFNlcnZpY2VUIHsKKyAgcmV0dXJuIG5ldyBTZXJ2aWNlVCgKKyAgICB0aGlzLm5hbWUoKSwKKyAgICB0aGlzLmJiIS5jcmVhdGVPYmpMaXN0KHRoaXMuY2FsbHMuYmluZCh0aGlzKSwgdGhpcy5jYWxsc0xlbmd0aCgpKSwKKyAgICB0aGlzLmJiIS5jcmVhdGVPYmpMaXN0KHRoaXMuYXR0cmlidXRlcy5iaW5kKHRoaXMpLCB0aGlzLmF0dHJpYnV0ZXNMZW5ndGgoKSksCisgICAgdGhpcy5iYiEuY3JlYXRlU2NhbGFyTGlzdCh0aGlzLmRvY3VtZW50YXRpb24uYmluZCh0aGlzKSwgdGhpcy5kb2N1bWVudGF0aW9uTGVuZ3RoKCkpLAorICAgIHRoaXMuZGVjbGFyYXRpb25GaWxlKCkKKyAgKTsKK30KKworCit1bnBhY2tUbyhfbzogU2VydmljZVQpOiB2b2lkIHsKKyAgX28ubmFtZSA9IHRoaXMubmFtZSgpOworICBfby5jYWxscyA9IHRoaXMuYmIhLmNyZWF0ZU9iakxpc3QodGhpcy5jYWxscy5iaW5kKHRoaXMpLCB0aGlzLmNhbGxzTGVuZ3RoKCkpOworICBfby5hdHRyaWJ1dGVzID0gdGhpcy5iYiEuY3JlYXRlT2JqTGlzdCh0aGlzLmF0dHJpYnV0ZXMuYmluZCh0aGlzKSwgdGhpcy5hdHRyaWJ1dGVzTGVuZ3RoKCkpOworICBfby5kb2N1bWVudGF0aW9uID0gdGhpcy5iYiEuY3JlYXRlU2NhbGFyTGlzdCh0aGlzLmRvY3VtZW50YXRpb24uYmluZCh0aGlzKSwgdGhpcy5kb2N1bWVudGF0aW9uTGVuZ3RoKCkpOworICBfby5kZWNsYXJhdGlvbkZpbGUgPSB0aGlzLmRlY2xhcmF0aW9uRmlsZSgpOworfQorfQorCitleHBvcnQgY2xhc3MgU2VydmljZVQgeworY29uc3RydWN0b3IoCisgIHB1YmxpYyBuYW1lOiBzdHJpbmd8VWludDhBcnJheXxudWxsID0gbnVsbCwKKyAgcHVibGljIGNhbGxzOiAoUlBDQ2FsbFQpW10gPSBbXSwKKyAgcHVibGljIGF0dHJpYnV0ZXM6IChLZXlWYWx1ZVQpW10gPSBbXSwKKyAgcHVibGljIGRvY3VtZW50YXRpb246IChzdHJpbmcpW10gPSBbXSwKKyAgcHVibGljIGRlY2xhcmF0aW9uRmlsZTogc3RyaW5nfFVpbnQ4QXJyYXl8bnVsbCA9IG51bGwKKyl7fQorCisKK3BhY2soYnVpbGRlcjpmbGF0YnVmZmVycy5CdWlsZGVyKTogZmxhdGJ1ZmZlcnMuT2Zmc2V0IHsKKyAgY29uc3QgbmFtZSA9ICh0aGlzLm5hbWUgIT09IG51bGwgPyBidWlsZGVyLmNyZWF0ZVN0cmluZyh0aGlzLm5hbWUhKSA6IDApOworICBjb25zdCBjYWxscyA9IFNlcnZpY2UuY3JlYXRlQ2FsbHNWZWN0b3IoYnVpbGRlciwgYnVpbGRlci5jcmVhdGVPYmplY3RPZmZzZXRMaXN0KHRoaXMuY2FsbHMpKTsKKyAgY29uc3QgYXR0cmlidXRlcyA9IFNlcnZpY2UuY3JlYXRlQXR0cmlidXRlc1ZlY3RvcihidWlsZGVyLCBidWlsZGVyLmNyZWF0ZU9iamVjdE9mZnNldExpc3QodGhpcy5hdHRyaWJ1dGVzKSk7CisgIGNvbnN0IGRvY3VtZW50YXRpb24gPSBTZXJ2aWNlLmNyZWF0ZURvY3VtZW50YXRpb25WZWN0b3IoYnVpbGRlciwgYnVpbGRlci5jcmVhdGVPYmplY3RPZmZzZXRMaXN0KHRoaXMuZG9jdW1lbnRhdGlvbikpOworICBjb25zdCBkZWNsYXJhdGlvbkZpbGUgPSAodGhpcy5kZWNsYXJhdGlvbkZpbGUgIT09IG51bGwgPyBidWlsZGVyLmNyZWF0ZVN0cmluZyh0aGlzLmRlY2xhcmF0aW9uRmlsZSEpIDogMCk7CisKKyAgcmV0dXJuIFNlcnZpY2UuY3JlYXRlU2VydmljZShidWlsZGVyLAorICAgIG5hbWUsCisgICAgY2FsbHMsCisgICAgYXR0cmlidXRlcywKKyAgICBkb2N1bWVudGF0aW9uLAorICAgIGRlY2xhcmF0aW9uRmlsZQorICApOworfQorfQorCisvKioKKyAqIEZpbGUgc3BlY2lmaWMgaW5mb3JtYXRpb24uCisgKiBTeW1ib2xzIGRlY2xhcmVkIHdpdGhpbiBhIGZpbGUgbWF5IGJlIHJlY292ZXJlZCBieSBpdGVyYXRpbmcgb3ZlciBhbGwKKyAqIHN5bWJvbHMgYW5kIGV4YW1pbmluZyB0aGUgYGRlY2xhcmF0aW9uX2ZpbGVgIGZpZWxkLgorICovCitleHBvcnQgY2xhc3MgU2NoZW1hRmlsZSB7CisgIGJiOiBmbGF0YnVmZmVycy5CeXRlQnVmZmVyfG51bGwgPSBudWxsOworICBiYl9wb3MgPSAwOworICBfX2luaXQoaTpudW1iZXIsIGJiOmZsYXRidWZmZXJzLkJ5dGVCdWZmZXIpOlNjaGVtYUZpbGUgeworICB0aGlzLmJiX3BvcyA9IGk7CisgIHRoaXMuYmIgPSBiYjsKKyAgcmV0dXJuIHRoaXM7Cit9CisKK3N0YXRpYyBnZXRSb290QXNTY2hlbWFGaWxlKGJiOmZsYXRidWZmZXJzLkJ5dGVCdWZmZXIsIG9iaj86U2NoZW1hRmlsZSk6U2NoZW1hRmlsZSB7CisgIHJldHVybiAob2JqIHx8IG5ldyBTY2hlbWFGaWxlKCkpLl9faW5pdChiYi5yZWFkSW50MzIoYmIucG9zaXRpb24oKSkgKyBiYi5wb3NpdGlvbigpLCBiYik7Cit9CisKK3N0YXRpYyBnZXRTaXplUHJlZml4ZWRSb290QXNTY2hlbWFGaWxlKGJiOmZsYXRidWZmZXJzLkJ5dGVCdWZmZXIsIG9iaj86U2NoZW1hRmlsZSk6U2NoZW1hRmlsZSB7CisgIGJiLnNldFBvc2l0aW9uKGJiLnBvc2l0aW9uKCkgKyBmbGF0YnVmZmVycy5TSVpFX1BSRUZJWF9MRU5HVEgpOworICByZXR1cm4gKG9iaiB8fCBuZXcgU2NoZW1hRmlsZSgpKS5fX2luaXQoYmIucmVhZEludDMyKGJiLnBvc2l0aW9uKCkpICsgYmIucG9zaXRpb24oKSwgYmIpOworfQorCisvKioKKyAqIEZpbGVuYW1lLCByZWxhdGl2ZSB0byBwcm9qZWN0IHJvb3QuCisgKi8KK2ZpbGVuYW1lKCk6c3RyaW5nfG51bGwKK2ZpbGVuYW1lKG9wdGlvbmFsRW5jb2Rpbmc6ZmxhdGJ1ZmZlcnMuRW5jb2RpbmcpOnN0cmluZ3xVaW50OEFycmF5fG51bGwKK2ZpbGVuYW1lKG9wdGlvbmFsRW5jb2Rpbmc/OmFueSk6c3RyaW5nfFVpbnQ4QXJyYXl8bnVsbCB7CisgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIhLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCA0KTsKKyAgcmV0dXJuIG9mZnNldCA/IHRoaXMuYmIhLl9fc3RyaW5nKHRoaXMuYmJfcG9zICsgb2Zmc2V0LCBvcHRpb25hbEVuY29kaW5nKSA6IG51bGw7Cit9CisKKy8qKgorICogTmFtZXMgb2YgaW5jbHVkZWQgZmlsZXMsIHJlbGF0aXZlIHRvIHByb2plY3Qgcm9vdC4KKyAqLworaW5jbHVkZWRGaWxlbmFtZXMoaW5kZXg6IG51bWJlcik6c3RyaW5nCitpbmNsdWRlZEZpbGVuYW1lcyhpbmRleDogbnVtYmVyLG9wdGlvbmFsRW5jb2Rpbmc6ZmxhdGJ1ZmZlcnMuRW5jb2RpbmcpOnN0cmluZ3xVaW50OEFycmF5CitpbmNsdWRlZEZpbGVuYW1lcyhpbmRleDogbnVtYmVyLG9wdGlvbmFsRW5jb2Rpbmc/OmFueSk6c3RyaW5nfFVpbnQ4QXJyYXl8bnVsbCB7CisgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIhLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCA2KTsKKyAgcmV0dXJuIG9mZnNldCA/IHRoaXMuYmIhLl9fc3RyaW5nKHRoaXMuYmIhLl9fdmVjdG9yKHRoaXMuYmJfcG9zICsgb2Zmc2V0KSArIGluZGV4ICogNCwgb3B0aW9uYWxFbmNvZGluZykgOiBudWxsOworfQorCitpbmNsdWRlZEZpbGVuYW1lc0xlbmd0aCgpOm51bWJlciB7CisgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIhLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCA2KTsKKyAgcmV0dXJuIG9mZnNldCA/IHRoaXMuYmIhLl9fdmVjdG9yX2xlbih0aGlzLmJiX3BvcyArIG9mZnNldCkgOiAwOworfQorCitzdGF0aWMgZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCk6c3RyaW5nIHsKKyAgcmV0dXJuICdyZWZsZWN0aW9uX1NjaGVtYUZpbGUnOworfQorCitzdGF0aWMgc3RhcnRTY2hlbWFGaWxlKGJ1aWxkZXI6ZmxhdGJ1ZmZlcnMuQnVpbGRlcikgeworICBidWlsZGVyLnN0YXJ0T2JqZWN0KDIpOworfQorCitzdGF0aWMgYWRkRmlsZW5hbWUoYnVpbGRlcjpmbGF0YnVmZmVycy5CdWlsZGVyLCBmaWxlbmFtZU9mZnNldDpmbGF0YnVmZmVycy5PZmZzZXQpIHsKKyAgYnVpbGRlci5hZGRGaWVsZE9mZnNldCgwLCBmaWxlbmFtZU9mZnNldCwgMCk7Cit9CisKK3N0YXRpYyBhZGRJbmNsdWRlZEZpbGVuYW1lcyhidWlsZGVyOmZsYXRidWZmZXJzLkJ1aWxkZXIsIGluY2x1ZGVkRmlsZW5hbWVzT2Zmc2V0OmZsYXRidWZmZXJzLk9mZnNldCkgeworICBidWlsZGVyLmFkZEZpZWxkT2Zmc2V0KDEsIGluY2x1ZGVkRmlsZW5hbWVzT2Zmc2V0LCAwKTsKK30KKworc3RhdGljIGNyZWF0ZUluY2x1ZGVkRmlsZW5hbWVzVmVjdG9yKGJ1aWxkZXI6ZmxhdGJ1ZmZlcnMuQnVpbGRlciwgZGF0YTpmbGF0YnVmZmVycy5PZmZzZXRbXSk6ZmxhdGJ1ZmZlcnMuT2Zmc2V0IHsKKyAgYnVpbGRlci5zdGFydFZlY3Rvcig0LCBkYXRhLmxlbmd0aCwgNCk7CisgIGZvciAobGV0IGkgPSBkYXRhLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7CisgICAgYnVpbGRlci5hZGRPZmZzZXQoZGF0YVtpXSEpOworICB9CisgIHJldHVybiBidWlsZGVyLmVuZFZlY3RvcigpOworfQorCitzdGF0aWMgc3RhcnRJbmNsdWRlZEZpbGVuYW1lc1ZlY3RvcihidWlsZGVyOmZsYXRidWZmZXJzLkJ1aWxkZXIsIG51bUVsZW1zOm51bWJlcikgeworICBidWlsZGVyLnN0YXJ0VmVjdG9yKDQsIG51bUVsZW1zLCA0KTsKK30KKworc3RhdGljIGVuZFNjaGVtYUZpbGUoYnVpbGRlcjpmbGF0YnVmZmVycy5CdWlsZGVyKTpmbGF0YnVmZmVycy5PZmZzZXQgeworICBjb25zdCBvZmZzZXQgPSBidWlsZGVyLmVuZE9iamVjdCgpOworICBidWlsZGVyLnJlcXVpcmVkRmllbGQob2Zmc2V0LCA0KSAvLyBmaWxlbmFtZQorICByZXR1cm4gb2Zmc2V0OworfQorCitzdGF0aWMgY3JlYXRlU2NoZW1hRmlsZShidWlsZGVyOmZsYXRidWZmZXJzLkJ1aWxkZXIsIGZpbGVuYW1lT2Zmc2V0OmZsYXRidWZmZXJzLk9mZnNldCwgaW5jbHVkZWRGaWxlbmFtZXNPZmZzZXQ6ZmxhdGJ1ZmZlcnMuT2Zmc2V0KTpmbGF0YnVmZmVycy5PZmZzZXQgeworICBTY2hlbWFGaWxlLnN0YXJ0U2NoZW1hRmlsZShidWlsZGVyKTsKKyAgU2NoZW1hRmlsZS5hZGRGaWxlbmFtZShidWlsZGVyLCBmaWxlbmFtZU9mZnNldCk7CisgIFNjaGVtYUZpbGUuYWRkSW5jbHVkZWRGaWxlbmFtZXMoYnVpbGRlciwgaW5jbHVkZWRGaWxlbmFtZXNPZmZzZXQpOworICByZXR1cm4gU2NoZW1hRmlsZS5lbmRTY2hlbWFGaWxlKGJ1aWxkZXIpOworfQorCit1bnBhY2soKTogU2NoZW1hRmlsZVQgeworICByZXR1cm4gbmV3IFNjaGVtYUZpbGVUKAorICAgIHRoaXMuZmlsZW5hbWUoKSwKKyAgICB0aGlzLmJiIS5jcmVhdGVTY2FsYXJMaXN0KHRoaXMuaW5jbHVkZWRGaWxlbmFtZXMuYmluZCh0aGlzKSwgdGhpcy5pbmNsdWRlZEZpbGVuYW1lc0xlbmd0aCgpKQorICApOworfQorCisKK3VucGFja1RvKF9vOiBTY2hlbWFGaWxlVCk6IHZvaWQgeworICBfby5maWxlbmFtZSA9IHRoaXMuZmlsZW5hbWUoKTsKKyAgX28uaW5jbHVkZWRGaWxlbmFtZXMgPSB0aGlzLmJiIS5jcmVhdGVTY2FsYXJMaXN0KHRoaXMuaW5jbHVkZWRGaWxlbmFtZXMuYmluZCh0aGlzKSwgdGhpcy5pbmNsdWRlZEZpbGVuYW1lc0xlbmd0aCgpKTsKK30KK30KKworZXhwb3J0IGNsYXNzIFNjaGVtYUZpbGVUIHsKK2NvbnN0cnVjdG9yKAorICBwdWJsaWMgZmlsZW5hbWU6IHN0cmluZ3xVaW50OEFycmF5fG51bGwgPSBudWxsLAorICBwdWJsaWMgaW5jbHVkZWRGaWxlbmFtZXM6IChzdHJpbmcpW10gPSBbXQorKXt9CisKKworcGFjayhidWlsZGVyOmZsYXRidWZmZXJzLkJ1aWxkZXIpOiBmbGF0YnVmZmVycy5PZmZzZXQgeworICBjb25zdCBmaWxlbmFtZSA9ICh0aGlzLmZpbGVuYW1lICE9PSBudWxsID8gYnVpbGRlci5jcmVhdGVTdHJpbmcodGhpcy5maWxlbmFtZSEpIDogMCk7CisgIGNvbnN0IGluY2x1ZGVkRmlsZW5hbWVzID0gU2NoZW1hRmlsZS5jcmVhdGVJbmNsdWRlZEZpbGVuYW1lc1ZlY3RvcihidWlsZGVyLCBidWlsZGVyLmNyZWF0ZU9iamVjdE9mZnNldExpc3QodGhpcy5pbmNsdWRlZEZpbGVuYW1lcykpOworCisgIHJldHVybiBTY2hlbWFGaWxlLmNyZWF0ZVNjaGVtYUZpbGUoYnVpbGRlciwKKyAgICBmaWxlbmFtZSwKKyAgICBpbmNsdWRlZEZpbGVuYW1lcworICApOworfQorfQorCitleHBvcnQgY2xhc3MgU2NoZW1hIHsKKyAgYmI6IGZsYXRidWZmZXJzLkJ5dGVCdWZmZXJ8bnVsbCA9IG51bGw7CisgIGJiX3BvcyA9IDA7CisgIF9faW5pdChpOm51bWJlciwgYmI6ZmxhdGJ1ZmZlcnMuQnl0ZUJ1ZmZlcik6U2NoZW1hIHsKKyAgdGhpcy5iYl9wb3MgPSBpOworICB0aGlzLmJiID0gYmI7CisgIHJldHVybiB0aGlzOworfQorCitzdGF0aWMgZ2V0Um9vdEFzU2NoZW1hKGJiOmZsYXRidWZmZXJzLkJ5dGVCdWZmZXIsIG9iaj86U2NoZW1hKTpTY2hlbWEgeworICByZXR1cm4gKG9iaiB8fCBuZXcgU2NoZW1hKCkpLl9faW5pdChiYi5yZWFkSW50MzIoYmIucG9zaXRpb24oKSkgKyBiYi5wb3NpdGlvbigpLCBiYik7Cit9CisKK3N0YXRpYyBnZXRTaXplUHJlZml4ZWRSb290QXNTY2hlbWEoYmI6ZmxhdGJ1ZmZlcnMuQnl0ZUJ1ZmZlciwgb2JqPzpTY2hlbWEpOlNjaGVtYSB7CisgIGJiLnNldFBvc2l0aW9uKGJiLnBvc2l0aW9uKCkgKyBmbGF0YnVmZmVycy5TSVpFX1BSRUZJWF9MRU5HVEgpOworICByZXR1cm4gKG9iaiB8fCBuZXcgU2NoZW1hKCkpLl9faW5pdChiYi5yZWFkSW50MzIoYmIucG9zaXRpb24oKSkgKyBiYi5wb3NpdGlvbigpLCBiYik7Cit9CisKK3N0YXRpYyBidWZmZXJIYXNJZGVudGlmaWVyKGJiOmZsYXRidWZmZXJzLkJ5dGVCdWZmZXIpOmJvb2xlYW4geworICByZXR1cm4gYmIuX19oYXNfaWRlbnRpZmllcignQkZCUycpOworfQorCitvYmplY3RzKGluZGV4OiBudW1iZXIsIG9iaj86T2JqZWN0Xyk6T2JqZWN0X3xudWxsIHsKKyAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYiEuX19vZmZzZXQodGhpcy5iYl9wb3MsIDQpOworICByZXR1cm4gb2Zmc2V0ID8gKG9iaiB8fCBuZXcgT2JqZWN0XygpKS5fX2luaXQodGhpcy5iYiEuX19pbmRpcmVjdCh0aGlzLmJiIS5fX3ZlY3Rvcih0aGlzLmJiX3BvcyArIG9mZnNldCkgKyBpbmRleCAqIDQpLCB0aGlzLmJiISkgOiBudWxsOworfQorCitvYmplY3RzTGVuZ3RoKCk6bnVtYmVyIHsKKyAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYiEuX19vZmZzZXQodGhpcy5iYl9wb3MsIDQpOworICByZXR1cm4gb2Zmc2V0ID8gdGhpcy5iYiEuX192ZWN0b3JfbGVuKHRoaXMuYmJfcG9zICsgb2Zmc2V0KSA6IDA7Cit9CisKK2VudW1zKGluZGV4OiBudW1iZXIsIG9iaj86RW51bSk6RW51bXxudWxsIHsKKyAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYiEuX19vZmZzZXQodGhpcy5iYl9wb3MsIDYpOworICByZXR1cm4gb2Zmc2V0ID8gKG9iaiB8fCBuZXcgRW51bSgpKS5fX2luaXQodGhpcy5iYiEuX19pbmRpcmVjdCh0aGlzLmJiIS5fX3ZlY3Rvcih0aGlzLmJiX3BvcyArIG9mZnNldCkgKyBpbmRleCAqIDQpLCB0aGlzLmJiISkgOiBudWxsOworfQorCitlbnVtc0xlbmd0aCgpOm51bWJlciB7CisgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIhLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCA2KTsKKyAgcmV0dXJuIG9mZnNldCA/IHRoaXMuYmIhLl9fdmVjdG9yX2xlbih0aGlzLmJiX3BvcyArIG9mZnNldCkgOiAwOworfQorCitmaWxlSWRlbnQoKTpzdHJpbmd8bnVsbAorZmlsZUlkZW50KG9wdGlvbmFsRW5jb2Rpbmc6ZmxhdGJ1ZmZlcnMuRW5jb2RpbmcpOnN0cmluZ3xVaW50OEFycmF5fG51bGwKK2ZpbGVJZGVudChvcHRpb25hbEVuY29kaW5nPzphbnkpOnN0cmluZ3xVaW50OEFycmF5fG51bGwgeworICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiIS5fX29mZnNldCh0aGlzLmJiX3BvcywgOCk7CisgIHJldHVybiBvZmZzZXQgPyB0aGlzLmJiIS5fX3N0cmluZyh0aGlzLmJiX3BvcyArIG9mZnNldCwgb3B0aW9uYWxFbmNvZGluZykgOiBudWxsOworfQorCitmaWxlRXh0KCk6c3RyaW5nfG51bGwKK2ZpbGVFeHQob3B0aW9uYWxFbmNvZGluZzpmbGF0YnVmZmVycy5FbmNvZGluZyk6c3RyaW5nfFVpbnQ4QXJyYXl8bnVsbAorZmlsZUV4dChvcHRpb25hbEVuY29kaW5nPzphbnkpOnN0cmluZ3xVaW50OEFycmF5fG51bGwgeworICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiIS5fX29mZnNldCh0aGlzLmJiX3BvcywgMTApOworICByZXR1cm4gb2Zmc2V0ID8gdGhpcy5iYiEuX19zdHJpbmcodGhpcy5iYl9wb3MgKyBvZmZzZXQsIG9wdGlvbmFsRW5jb2RpbmcpIDogbnVsbDsKK30KKworcm9vdFRhYmxlKG9iaj86T2JqZWN0Xyk6T2JqZWN0X3xudWxsIHsKKyAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYiEuX19vZmZzZXQodGhpcy5iYl9wb3MsIDEyKTsKKyAgcmV0dXJuIG9mZnNldCA/IChvYmogfHwgbmV3IE9iamVjdF8oKSkuX19pbml0KHRoaXMuYmIhLl9faW5kaXJlY3QodGhpcy5iYl9wb3MgKyBvZmZzZXQpLCB0aGlzLmJiISkgOiBudWxsOworfQorCitzZXJ2aWNlcyhpbmRleDogbnVtYmVyLCBvYmo/OlNlcnZpY2UpOlNlcnZpY2V8bnVsbCB7CisgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIhLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCAxNCk7CisgIHJldHVybiBvZmZzZXQgPyAob2JqIHx8IG5ldyBTZXJ2aWNlKCkpLl9faW5pdCh0aGlzLmJiIS5fX2luZGlyZWN0KHRoaXMuYmIhLl9fdmVjdG9yKHRoaXMuYmJfcG9zICsgb2Zmc2V0KSArIGluZGV4ICogNCksIHRoaXMuYmIhKSA6IG51bGw7Cit9CisKK3NlcnZpY2VzTGVuZ3RoKCk6bnVtYmVyIHsKKyAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYiEuX19vZmZzZXQodGhpcy5iYl9wb3MsIDE0KTsKKyAgcmV0dXJuIG9mZnNldCA/IHRoaXMuYmIhLl9fdmVjdG9yX2xlbih0aGlzLmJiX3BvcyArIG9mZnNldCkgOiAwOworfQorCithZHZhbmNlZEZlYXR1cmVzKCk6YmlnaW50IHsKKyAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYiEuX19vZmZzZXQodGhpcy5iYl9wb3MsIDE2KTsKKyAgcmV0dXJuIG9mZnNldCA/IHRoaXMuYmIhLnJlYWRVaW50NjQodGhpcy5iYl9wb3MgKyBvZmZzZXQpIDogQmlnSW50KCcwJyk7Cit9CisKK211dGF0ZV9hZHZhbmNlZF9mZWF0dXJlcyh2YWx1ZTpiaWdpbnQpOmJvb2xlYW4geworICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiIS5fX29mZnNldCh0aGlzLmJiX3BvcywgMTYpOworCisgIGlmIChvZmZzZXQgPT09IDApIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICB0aGlzLmJiIS53cml0ZVVpbnQ2NCh0aGlzLmJiX3BvcyArIG9mZnNldCwgdmFsdWUpOworICByZXR1cm4gdHJ1ZTsKK30KKworLyoqCisgKiBBbGwgdGhlIGZpbGVzIHVzZWQgaW4gdGhpcyBjb21waWxhdGlvbi4gRmlsZXMgYXJlIHJlbGF0aXZlIHRvIHdoZXJlCisgKiBmbGF0YyB3YXMgaW52b2tlZC4KKyAqLworZmJzRmlsZXMoaW5kZXg6IG51bWJlciwgb2JqPzpTY2hlbWFGaWxlKTpTY2hlbWFGaWxlfG51bGwgeworICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiIS5fX29mZnNldCh0aGlzLmJiX3BvcywgMTgpOworICByZXR1cm4gb2Zmc2V0ID8gKG9iaiB8fCBuZXcgU2NoZW1hRmlsZSgpKS5fX2luaXQodGhpcy5iYiEuX19pbmRpcmVjdCh0aGlzLmJiIS5fX3ZlY3Rvcih0aGlzLmJiX3BvcyArIG9mZnNldCkgKyBpbmRleCAqIDQpLCB0aGlzLmJiISkgOiBudWxsOworfQorCitmYnNGaWxlc0xlbmd0aCgpOm51bWJlciB7CisgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIhLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCAxOCk7CisgIHJldHVybiBvZmZzZXQgPyB0aGlzLmJiIS5fX3ZlY3Rvcl9sZW4odGhpcy5iYl9wb3MgKyBvZmZzZXQpIDogMDsKK30KKworc3RhdGljIGdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpOnN0cmluZyB7CisgIHJldHVybiAncmVmbGVjdGlvbl9TY2hlbWEnOworfQorCitzdGF0aWMgc3RhcnRTY2hlbWEoYnVpbGRlcjpmbGF0YnVmZmVycy5CdWlsZGVyKSB7CisgIGJ1aWxkZXIuc3RhcnRPYmplY3QoOCk7Cit9CisKK3N0YXRpYyBhZGRPYmplY3RzKGJ1aWxkZXI6ZmxhdGJ1ZmZlcnMuQnVpbGRlciwgb2JqZWN0c09mZnNldDpmbGF0YnVmZmVycy5PZmZzZXQpIHsKKyAgYnVpbGRlci5hZGRGaWVsZE9mZnNldCgwLCBvYmplY3RzT2Zmc2V0LCAwKTsKK30KKworc3RhdGljIGNyZWF0ZU9iamVjdHNWZWN0b3IoYnVpbGRlcjpmbGF0YnVmZmVycy5CdWlsZGVyLCBkYXRhOmZsYXRidWZmZXJzLk9mZnNldFtdKTpmbGF0YnVmZmVycy5PZmZzZXQgeworICBidWlsZGVyLnN0YXJ0VmVjdG9yKDQsIGRhdGEubGVuZ3RoLCA0KTsKKyAgZm9yIChsZXQgaSA9IGRhdGEubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHsKKyAgICBidWlsZGVyLmFkZE9mZnNldChkYXRhW2ldISk7CisgIH0KKyAgcmV0dXJuIGJ1aWxkZXIuZW5kVmVjdG9yKCk7Cit9CisKK3N0YXRpYyBzdGFydE9iamVjdHNWZWN0b3IoYnVpbGRlcjpmbGF0YnVmZmVycy5CdWlsZGVyLCBudW1FbGVtczpudW1iZXIpIHsKKyAgYnVpbGRlci5zdGFydFZlY3Rvcig0LCBudW1FbGVtcywgNCk7Cit9CisKK3N0YXRpYyBhZGRFbnVtcyhidWlsZGVyOmZsYXRidWZmZXJzLkJ1aWxkZXIsIGVudW1zT2Zmc2V0OmZsYXRidWZmZXJzLk9mZnNldCkgeworICBidWlsZGVyLmFkZEZpZWxkT2Zmc2V0KDEsIGVudW1zT2Zmc2V0LCAwKTsKK30KKworc3RhdGljIGNyZWF0ZUVudW1zVmVjdG9yKGJ1aWxkZXI6ZmxhdGJ1ZmZlcnMuQnVpbGRlciwgZGF0YTpmbGF0YnVmZmVycy5PZmZzZXRbXSk6ZmxhdGJ1ZmZlcnMuT2Zmc2V0IHsKKyAgYnVpbGRlci5zdGFydFZlY3Rvcig0LCBkYXRhLmxlbmd0aCwgNCk7CisgIGZvciAobGV0IGkgPSBkYXRhLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7CisgICAgYnVpbGRlci5hZGRPZmZzZXQoZGF0YVtpXSEpOworICB9CisgIHJldHVybiBidWlsZGVyLmVuZFZlY3RvcigpOworfQorCitzdGF0aWMgc3RhcnRFbnVtc1ZlY3RvcihidWlsZGVyOmZsYXRidWZmZXJzLkJ1aWxkZXIsIG51bUVsZW1zOm51bWJlcikgeworICBidWlsZGVyLnN0YXJ0VmVjdG9yKDQsIG51bUVsZW1zLCA0KTsKK30KKworc3RhdGljIGFkZEZpbGVJZGVudChidWlsZGVyOmZsYXRidWZmZXJzLkJ1aWxkZXIsIGZpbGVJZGVudE9mZnNldDpmbGF0YnVmZmVycy5PZmZzZXQpIHsKKyAgYnVpbGRlci5hZGRGaWVsZE9mZnNldCgyLCBmaWxlSWRlbnRPZmZzZXQsIDApOworfQorCitzdGF0aWMgYWRkRmlsZUV4dChidWlsZGVyOmZsYXRidWZmZXJzLkJ1aWxkZXIsIGZpbGVFeHRPZmZzZXQ6ZmxhdGJ1ZmZlcnMuT2Zmc2V0KSB7CisgIGJ1aWxkZXIuYWRkRmllbGRPZmZzZXQoMywgZmlsZUV4dE9mZnNldCwgMCk7Cit9CisKK3N0YXRpYyBhZGRSb290VGFibGUoYnVpbGRlcjpmbGF0YnVmZmVycy5CdWlsZGVyLCByb290VGFibGVPZmZzZXQ6ZmxhdGJ1ZmZlcnMuT2Zmc2V0KSB7CisgIGJ1aWxkZXIuYWRkRmllbGRPZmZzZXQoNCwgcm9vdFRhYmxlT2Zmc2V0LCAwKTsKK30KKworc3RhdGljIGFkZFNlcnZpY2VzKGJ1aWxkZXI6ZmxhdGJ1ZmZlcnMuQnVpbGRlciwgc2VydmljZXNPZmZzZXQ6ZmxhdGJ1ZmZlcnMuT2Zmc2V0KSB7CisgIGJ1aWxkZXIuYWRkRmllbGRPZmZzZXQoNSwgc2VydmljZXNPZmZzZXQsIDApOworfQorCitzdGF0aWMgY3JlYXRlU2VydmljZXNWZWN0b3IoYnVpbGRlcjpmbGF0YnVmZmVycy5CdWlsZGVyLCBkYXRhOmZsYXRidWZmZXJzLk9mZnNldFtdKTpmbGF0YnVmZmVycy5PZmZzZXQgeworICBidWlsZGVyLnN0YXJ0VmVjdG9yKDQsIGRhdGEubGVuZ3RoLCA0KTsKKyAgZm9yIChsZXQgaSA9IGRhdGEubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHsKKyAgICBidWlsZGVyLmFkZE9mZnNldChkYXRhW2ldISk7CisgIH0KKyAgcmV0dXJuIGJ1aWxkZXIuZW5kVmVjdG9yKCk7Cit9CisKK3N0YXRpYyBzdGFydFNlcnZpY2VzVmVjdG9yKGJ1aWxkZXI6ZmxhdGJ1ZmZlcnMuQnVpbGRlciwgbnVtRWxlbXM6bnVtYmVyKSB7CisgIGJ1aWxkZXIuc3RhcnRWZWN0b3IoNCwgbnVtRWxlbXMsIDQpOworfQorCitzdGF0aWMgYWRkQWR2YW5jZWRGZWF0dXJlcyhidWlsZGVyOmZsYXRidWZmZXJzLkJ1aWxkZXIsIGFkdmFuY2VkRmVhdHVyZXM6YmlnaW50KSB7CisgIGJ1aWxkZXIuYWRkRmllbGRJbnQ2NCg2LCBhZHZhbmNlZEZlYXR1cmVzLCBCaWdJbnQoJzAnKSk7Cit9CisKK3N0YXRpYyBhZGRGYnNGaWxlcyhidWlsZGVyOmZsYXRidWZmZXJzLkJ1aWxkZXIsIGZic0ZpbGVzT2Zmc2V0OmZsYXRidWZmZXJzLk9mZnNldCkgeworICBidWlsZGVyLmFkZEZpZWxkT2Zmc2V0KDcsIGZic0ZpbGVzT2Zmc2V0LCAwKTsKK30KKworc3RhdGljIGNyZWF0ZUZic0ZpbGVzVmVjdG9yKGJ1aWxkZXI6ZmxhdGJ1ZmZlcnMuQnVpbGRlciwgZGF0YTpmbGF0YnVmZmVycy5PZmZzZXRbXSk6ZmxhdGJ1ZmZlcnMuT2Zmc2V0IHsKKyAgYnVpbGRlci5zdGFydFZlY3Rvcig0LCBkYXRhLmxlbmd0aCwgNCk7CisgIGZvciAobGV0IGkgPSBkYXRhLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7CisgICAgYnVpbGRlci5hZGRPZmZzZXQoZGF0YVtpXSEpOworICB9CisgIHJldHVybiBidWlsZGVyLmVuZFZlY3RvcigpOworfQorCitzdGF0aWMgc3RhcnRGYnNGaWxlc1ZlY3RvcihidWlsZGVyOmZsYXRidWZmZXJzLkJ1aWxkZXIsIG51bUVsZW1zOm51bWJlcikgeworICBidWlsZGVyLnN0YXJ0VmVjdG9yKDQsIG51bUVsZW1zLCA0KTsKK30KKworc3RhdGljIGVuZFNjaGVtYShidWlsZGVyOmZsYXRidWZmZXJzLkJ1aWxkZXIpOmZsYXRidWZmZXJzLk9mZnNldCB7CisgIGNvbnN0IG9mZnNldCA9IGJ1aWxkZXIuZW5kT2JqZWN0KCk7CisgIGJ1aWxkZXIucmVxdWlyZWRGaWVsZChvZmZzZXQsIDQpIC8vIG9iamVjdHMKKyAgYnVpbGRlci5yZXF1aXJlZEZpZWxkKG9mZnNldCwgNikgLy8gZW51bXMKKyAgcmV0dXJuIG9mZnNldDsKK30KKworc3RhdGljIGZpbmlzaFNjaGVtYUJ1ZmZlcihidWlsZGVyOmZsYXRidWZmZXJzLkJ1aWxkZXIsIG9mZnNldDpmbGF0YnVmZmVycy5PZmZzZXQpIHsKKyAgYnVpbGRlci5maW5pc2gob2Zmc2V0LCAnQkZCUycpOworfQorCitzdGF0aWMgZmluaXNoU2l6ZVByZWZpeGVkU2NoZW1hQnVmZmVyKGJ1aWxkZXI6ZmxhdGJ1ZmZlcnMuQnVpbGRlciwgb2Zmc2V0OmZsYXRidWZmZXJzLk9mZnNldCkgeworICBidWlsZGVyLmZpbmlzaChvZmZzZXQsICdCRkJTJywgdHJ1ZSk7Cit9CisKKwordW5wYWNrKCk6IFNjaGVtYVQgeworICByZXR1cm4gbmV3IFNjaGVtYVQoCisgICAgdGhpcy5iYiEuY3JlYXRlT2JqTGlzdCh0aGlzLm9iamVjdHMuYmluZCh0aGlzKSwgdGhpcy5vYmplY3RzTGVuZ3RoKCkpLAorICAgIHRoaXMuYmIhLmNyZWF0ZU9iakxpc3QodGhpcy5lbnVtcy5iaW5kKHRoaXMpLCB0aGlzLmVudW1zTGVuZ3RoKCkpLAorICAgIHRoaXMuZmlsZUlkZW50KCksCisgICAgdGhpcy5maWxlRXh0KCksCisgICAgKHRoaXMucm9vdFRhYmxlKCkgIT09IG51bGwgPyB0aGlzLnJvb3RUYWJsZSgpIS51bnBhY2soKSA6IG51bGwpLAorICAgIHRoaXMuYmIhLmNyZWF0ZU9iakxpc3QodGhpcy5zZXJ2aWNlcy5iaW5kKHRoaXMpLCB0aGlzLnNlcnZpY2VzTGVuZ3RoKCkpLAorICAgIHRoaXMuYWR2YW5jZWRGZWF0dXJlcygpLAorICAgIHRoaXMuYmIhLmNyZWF0ZU9iakxpc3QodGhpcy5mYnNGaWxlcy5iaW5kKHRoaXMpLCB0aGlzLmZic0ZpbGVzTGVuZ3RoKCkpCisgICk7Cit9CisKKwordW5wYWNrVG8oX286IFNjaGVtYVQpOiB2b2lkIHsKKyAgX28ub2JqZWN0cyA9IHRoaXMuYmIhLmNyZWF0ZU9iakxpc3QodGhpcy5vYmplY3RzLmJpbmQodGhpcyksIHRoaXMub2JqZWN0c0xlbmd0aCgpKTsKKyAgX28uZW51bXMgPSB0aGlzLmJiIS5jcmVhdGVPYmpMaXN0KHRoaXMuZW51bXMuYmluZCh0aGlzKSwgdGhpcy5lbnVtc0xlbmd0aCgpKTsKKyAgX28uZmlsZUlkZW50ID0gdGhpcy5maWxlSWRlbnQoKTsKKyAgX28uZmlsZUV4dCA9IHRoaXMuZmlsZUV4dCgpOworICBfby5yb290VGFibGUgPSAodGhpcy5yb290VGFibGUoKSAhPT0gbnVsbCA/IHRoaXMucm9vdFRhYmxlKCkhLnVucGFjaygpIDogbnVsbCk7CisgIF9vLnNlcnZpY2VzID0gdGhpcy5iYiEuY3JlYXRlT2JqTGlzdCh0aGlzLnNlcnZpY2VzLmJpbmQodGhpcyksIHRoaXMuc2VydmljZXNMZW5ndGgoKSk7CisgIF9vLmFkdmFuY2VkRmVhdHVyZXMgPSB0aGlzLmFkdmFuY2VkRmVhdHVyZXMoKTsKKyAgX28uZmJzRmlsZXMgPSB0aGlzLmJiIS5jcmVhdGVPYmpMaXN0KHRoaXMuZmJzRmlsZXMuYmluZCh0aGlzKSwgdGhpcy5mYnNGaWxlc0xlbmd0aCgpKTsKK30KK30KKworZXhwb3J0IGNsYXNzIFNjaGVtYVQgeworY29uc3RydWN0b3IoCisgIHB1YmxpYyBvYmplY3RzOiAoT2JqZWN0X1QpW10gPSBbXSwKKyAgcHVibGljIGVudW1zOiAoRW51bVQpW10gPSBbXSwKKyAgcHVibGljIGZpbGVJZGVudDogc3RyaW5nfFVpbnQ4QXJyYXl8bnVsbCA9IG51bGwsCisgIHB1YmxpYyBmaWxlRXh0OiBzdHJpbmd8VWludDhBcnJheXxudWxsID0gbnVsbCwKKyAgcHVibGljIHJvb3RUYWJsZTogT2JqZWN0X1R8bnVsbCA9IG51bGwsCisgIHB1YmxpYyBzZXJ2aWNlczogKFNlcnZpY2VUKVtdID0gW10sCisgIHB1YmxpYyBhZHZhbmNlZEZlYXR1cmVzOiBiaWdpbnQgPSBCaWdJbnQoJzAnKSwKKyAgcHVibGljIGZic0ZpbGVzOiAoU2NoZW1hRmlsZVQpW10gPSBbXQorKXt9CisKKworcGFjayhidWlsZGVyOmZsYXRidWZmZXJzLkJ1aWxkZXIpOiBmbGF0YnVmZmVycy5PZmZzZXQgeworICBjb25zdCBvYmplY3RzID0gU2NoZW1hLmNyZWF0ZU9iamVjdHNWZWN0b3IoYnVpbGRlciwgYnVpbGRlci5jcmVhdGVPYmplY3RPZmZzZXRMaXN0KHRoaXMub2JqZWN0cykpOworICBjb25zdCBlbnVtcyA9IFNjaGVtYS5jcmVhdGVFbnVtc1ZlY3RvcihidWlsZGVyLCBidWlsZGVyLmNyZWF0ZU9iamVjdE9mZnNldExpc3QodGhpcy5lbnVtcykpOworICBjb25zdCBmaWxlSWRlbnQgPSAodGhpcy5maWxlSWRlbnQgIT09IG51bGwgPyBidWlsZGVyLmNyZWF0ZVN0cmluZyh0aGlzLmZpbGVJZGVudCEpIDogMCk7CisgIGNvbnN0IGZpbGVFeHQgPSAodGhpcy5maWxlRXh0ICE9PSBudWxsID8gYnVpbGRlci5jcmVhdGVTdHJpbmcodGhpcy5maWxlRXh0ISkgOiAwKTsKKyAgY29uc3Qgcm9vdFRhYmxlID0gKHRoaXMucm9vdFRhYmxlICE9PSBudWxsID8gdGhpcy5yb290VGFibGUhLnBhY2soYnVpbGRlcikgOiAwKTsKKyAgY29uc3Qgc2VydmljZXMgPSBTY2hlbWEuY3JlYXRlU2VydmljZXNWZWN0b3IoYnVpbGRlciwgYnVpbGRlci5jcmVhdGVPYmplY3RPZmZzZXRMaXN0KHRoaXMuc2VydmljZXMpKTsKKyAgY29uc3QgZmJzRmlsZXMgPSBTY2hlbWEuY3JlYXRlRmJzRmlsZXNWZWN0b3IoYnVpbGRlciwgYnVpbGRlci5jcmVhdGVPYmplY3RPZmZzZXRMaXN0KHRoaXMuZmJzRmlsZXMpKTsKKworICBTY2hlbWEuc3RhcnRTY2hlbWEoYnVpbGRlcik7CisgIFNjaGVtYS5hZGRPYmplY3RzKGJ1aWxkZXIsIG9iamVjdHMpOworICBTY2hlbWEuYWRkRW51bXMoYnVpbGRlciwgZW51bXMpOworICBTY2hlbWEuYWRkRmlsZUlkZW50KGJ1aWxkZXIsIGZpbGVJZGVudCk7CisgIFNjaGVtYS5hZGRGaWxlRXh0KGJ1aWxkZXIsIGZpbGVFeHQpOworICBTY2hlbWEuYWRkUm9vdFRhYmxlKGJ1aWxkZXIsIHJvb3RUYWJsZSk7CisgIFNjaGVtYS5hZGRTZXJ2aWNlcyhidWlsZGVyLCBzZXJ2aWNlcyk7CisgIFNjaGVtYS5hZGRBZHZhbmNlZEZlYXR1cmVzKGJ1aWxkZXIsIHRoaXMuYWR2YW5jZWRGZWF0dXJlcyk7CisgIFNjaGVtYS5hZGRGYnNGaWxlcyhidWlsZGVyLCBmYnNGaWxlcyk7CisKKyAgcmV0dXJuIFNjaGVtYS5lbmRTY2hlbWEoYnVpbGRlcik7Cit9Cit9CisKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL3Rlc3RfZGlyL0JVSUxELmJhemVsIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvdHMvdGVzdF9kaXIvQlVJTEQuYmF6ZWwKc2ltaWxhcml0eSBpbmRleCA4NyUKcmVuYW1lIGZyb20gdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvdGVzdF9kaXIvQlVJTEQuYmF6ZWwKcmVuYW1lIHRvIHRoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL3RzL3Rlc3RfZGlyL0JVSUxELmJhemVsCmluZGV4IGU4MTU5NmQuLjc2OGZlODMgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL3Rlc3RfZGlyL0JVSUxELmJhemVsCisrKyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL3RzL3Rlc3RfZGlyL0JVSUxELmJhemVsCkBAIC0xLDQgKzEsNCBAQAotbG9hZCgiLy86YnVpbGRfZGVmcy5iemwiLCAiZmxhdGJ1ZmZlcl90c19saWJyYXJ5IikKK2xvYWQoIi8vOnR5cGVzY3JpcHQuYnpsIiwgImZsYXRidWZmZXJfdHNfbGlicmFyeSIpCiAKIGZsYXRidWZmZXJfdHNfbGlicmFyeSgKICAgICBuYW1lID0gInR5cGVzY3JpcHRfdHJhbnNpdGl2ZV90c19mYnMiLApkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvdGVzdF9kaXIvdHlwZXNjcmlwdF9pbmNsdWRlLmZicyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL3RzL3Rlc3RfZGlyL3R5cGVzY3JpcHRfaW5jbHVkZS5mYnMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHRoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL3Rlc3RfZGlyL3R5cGVzY3JpcHRfaW5jbHVkZS5mYnMKcmVuYW1lIHRvIHRoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL3RzL3Rlc3RfZGlyL3R5cGVzY3JpcHRfaW5jbHVkZS5mYnMKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL3Rlc3RfZGlyL3R5cGVzY3JpcHRfdHJhbnNpdGl2ZV9pbmNsdWRlLmZicyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL3RzL3Rlc3RfZGlyL3R5cGVzY3JpcHRfdHJhbnNpdGl2ZV9pbmNsdWRlLmZicwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvdGVzdF9kaXIvdHlwZXNjcmlwdF90cmFuc2l0aXZlX2luY2x1ZGUuZmJzCnJlbmFtZSB0byB0aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy90cy90ZXN0X2Rpci90eXBlc2NyaXB0X3RyYW5zaXRpdmVfaW5jbHVkZS5mYnMKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL3RzL3RzLWZsYXQtZmlsZXMvbW9uc3Rlcl90ZXN0X2dlbmVyYXRlZC50cyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL3RzL3RzLWZsYXQtZmlsZXMvbW9uc3Rlcl90ZXN0X2dlbmVyYXRlZC50cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YTc2OGYyCi0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvdHMvdHMtZmxhdC1maWxlcy9tb25zdGVyX3Rlc3RfZ2VuZXJhdGVkLnRzCkBAIC0wLDAgKzEsMTgzMCBAQAorLy8gYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgYnkgdGhlIEZsYXRCdWZmZXJzIGNvbXBpbGVyLCBkbyBub3QgbW9kaWZ5CisKK2ltcG9ydCAqIGFzIGZsYXRidWZmZXJzIGZyb20gJ2ZsYXRidWZmZXJzJzsKKworZXhwb3J0IGVudW0gTXlHYW1lX090aGVyTmFtZVNwYWNlX0Zyb21JbmNsdWRlIHsKKyAgSW5jbHVkZVZhbCA9ICcwJworfQorCisvKioKKyAqIENvbXBvc2l0ZSBjb21wb25lbnRzIG9mIE1vbnN0ZXIgY29sb3IuCisgKi8KK2V4cG9ydCBlbnVtIE15R2FtZV9FeGFtcGxlX0NvbG9yIHsKKyAgUmVkID0gMSwKKworICAvKioKKyAgICogXGJyaWVmIGNvbG9yIEdyZWVuCisgICAqIEdyZWVuIGlzIGJpdF9mbGFnIHdpdGggdmFsdWUgKDF1IDw8IDEpCisgICAqLworICBHcmVlbiA9IDIsCisKKyAgLyoqCisgICAqIFxicmllZiBjb2xvciBCbHVlICgxdSA8PCAzKQorICAgKi8KKyAgQmx1ZSA9IDgKK30KKworZXhwb3J0IGVudW0gTXlHYW1lX0V4YW1wbGVfUmFjZSB7CisgIE5vbmUgPSAtMSwKKyAgSHVtYW4gPSAwLAorICBEd2FyZiA9IDEsCisgIEVsZiA9IDIKK30KKworZXhwb3J0IGVudW0gTXlHYW1lX0V4YW1wbGVfTG9uZ0VudW0geworICBMb25nT25lID0gJzInLAorICBMb25nVHdvID0gJzQnLAorICBMb25nQmlnID0gJzEwOTk1MTE2Mjc3NzYnCit9CisKK2V4cG9ydCBlbnVtIE15R2FtZV9FeGFtcGxlX0FueSB7CisgIE5PTkUgPSAwLAorICBNb25zdGVyID0gMSwKKyAgVGVzdFNpbXBsZVRhYmxlV2l0aEVudW0gPSAyLAorICBNeUdhbWVfRXhhbXBsZTJfTW9uc3RlciA9IDMKK30KKworZXhwb3J0IGZ1bmN0aW9uIHVuaW9uVG9BbnkoCisgIHR5cGU6IE15R2FtZV9FeGFtcGxlX0FueSwKKyAgYWNjZXNzb3I6IChvYmo6TXlHYW1lX0V4YW1wbGUyX01vbnN0ZXJ8TXlHYW1lX0V4YW1wbGVfTW9uc3RlcnxNeUdhbWVfRXhhbXBsZV9UZXN0U2ltcGxlVGFibGVXaXRoRW51bSkgPT4gTXlHYW1lX0V4YW1wbGUyX01vbnN0ZXJ8TXlHYW1lX0V4YW1wbGVfTW9uc3RlcnxNeUdhbWVfRXhhbXBsZV9UZXN0U2ltcGxlVGFibGVXaXRoRW51bXxudWxsCispOiBNeUdhbWVfRXhhbXBsZTJfTW9uc3RlcnxNeUdhbWVfRXhhbXBsZV9Nb25zdGVyfE15R2FtZV9FeGFtcGxlX1Rlc3RTaW1wbGVUYWJsZVdpdGhFbnVtfG51bGwgeworICBzd2l0Y2goTXlHYW1lX0V4YW1wbGVfQW55W3R5cGVdKSB7CisgICAgY2FzZSAnTk9ORSc6IHJldHVybiBudWxsOyAKKyAgICBjYXNlICdNb25zdGVyJzogcmV0dXJuIGFjY2Vzc29yKG5ldyBNeUdhbWVfRXhhbXBsZV9Nb25zdGVyKCkpISBhcyBNeUdhbWVfRXhhbXBsZV9Nb25zdGVyOworICAgIGNhc2UgJ1Rlc3RTaW1wbGVUYWJsZVdpdGhFbnVtJzogcmV0dXJuIGFjY2Vzc29yKG5ldyBNeUdhbWVfRXhhbXBsZV9UZXN0U2ltcGxlVGFibGVXaXRoRW51bSgpKSEgYXMgTXlHYW1lX0V4YW1wbGVfVGVzdFNpbXBsZVRhYmxlV2l0aEVudW07CisgICAgY2FzZSAnTXlHYW1lX0V4YW1wbGUyX01vbnN0ZXInOiByZXR1cm4gYWNjZXNzb3IobmV3IE15R2FtZV9FeGFtcGxlMl9Nb25zdGVyKCkpISBhcyBNeUdhbWVfRXhhbXBsZTJfTW9uc3RlcjsKKyAgICBkZWZhdWx0OiByZXR1cm4gbnVsbDsKKyAgfQorfQorCitleHBvcnQgZnVuY3Rpb24gdW5pb25MaXN0VG9BbnkoCisgIHR5cGU6IE15R2FtZV9FeGFtcGxlX0FueSwgCisgIGFjY2Vzc29yOiAoaW5kZXg6IG51bWJlciwgb2JqOk15R2FtZV9FeGFtcGxlMl9Nb25zdGVyfE15R2FtZV9FeGFtcGxlX01vbnN0ZXJ8TXlHYW1lX0V4YW1wbGVfVGVzdFNpbXBsZVRhYmxlV2l0aEVudW0pID0+IE15R2FtZV9FeGFtcGxlMl9Nb25zdGVyfE15R2FtZV9FeGFtcGxlX01vbnN0ZXJ8TXlHYW1lX0V4YW1wbGVfVGVzdFNpbXBsZVRhYmxlV2l0aEVudW18bnVsbCwgCisgIGluZGV4OiBudW1iZXIKKyk6IE15R2FtZV9FeGFtcGxlMl9Nb25zdGVyfE15R2FtZV9FeGFtcGxlX01vbnN0ZXJ8TXlHYW1lX0V4YW1wbGVfVGVzdFNpbXBsZVRhYmxlV2l0aEVudW18bnVsbCB7CisgIHN3aXRjaChNeUdhbWVfRXhhbXBsZV9BbnlbdHlwZV0pIHsKKyAgICBjYXNlICdOT05FJzogcmV0dXJuIG51bGw7IAorICAgIGNhc2UgJ01vbnN0ZXInOiByZXR1cm4gYWNjZXNzb3IoaW5kZXgsIG5ldyBNeUdhbWVfRXhhbXBsZV9Nb25zdGVyKCkpISBhcyBNeUdhbWVfRXhhbXBsZV9Nb25zdGVyOworICAgIGNhc2UgJ1Rlc3RTaW1wbGVUYWJsZVdpdGhFbnVtJzogcmV0dXJuIGFjY2Vzc29yKGluZGV4LCBuZXcgTXlHYW1lX0V4YW1wbGVfVGVzdFNpbXBsZVRhYmxlV2l0aEVudW0oKSkhIGFzIE15R2FtZV9FeGFtcGxlX1Rlc3RTaW1wbGVUYWJsZVdpdGhFbnVtOworICAgIGNhc2UgJ015R2FtZV9FeGFtcGxlMl9Nb25zdGVyJzogcmV0dXJuIGFjY2Vzc29yKGluZGV4LCBuZXcgTXlHYW1lX0V4YW1wbGUyX01vbnN0ZXIoKSkhIGFzIE15R2FtZV9FeGFtcGxlMl9Nb25zdGVyOworICAgIGRlZmF1bHQ6IHJldHVybiBudWxsOworICB9Cit9CisKK2V4cG9ydCBlbnVtIE15R2FtZV9FeGFtcGxlX0FueVVuaXF1ZUFsaWFzZXMgeworICBOT05FID0gMCwKKyAgTSA9IDEsCisgIFRTID0gMiwKKyAgTTIgPSAzCit9CisKK2V4cG9ydCBmdW5jdGlvbiB1bmlvblRvQW55VW5pcXVlQWxpYXNlcygKKyAgdHlwZTogTXlHYW1lX0V4YW1wbGVfQW55VW5pcXVlQWxpYXNlcywKKyAgYWNjZXNzb3I6IChvYmo6TXlHYW1lX0V4YW1wbGUyX01vbnN0ZXJ8TXlHYW1lX0V4YW1wbGVfTW9uc3RlcnxNeUdhbWVfRXhhbXBsZV9UZXN0U2ltcGxlVGFibGVXaXRoRW51bSkgPT4gTXlHYW1lX0V4YW1wbGUyX01vbnN0ZXJ8TXlHYW1lX0V4YW1wbGVfTW9uc3RlcnxNeUdhbWVfRXhhbXBsZV9UZXN0U2ltcGxlVGFibGVXaXRoRW51bXxudWxsCispOiBNeUdhbWVfRXhhbXBsZTJfTW9uc3RlcnxNeUdhbWVfRXhhbXBsZV9Nb25zdGVyfE15R2FtZV9FeGFtcGxlX1Rlc3RTaW1wbGVUYWJsZVdpdGhFbnVtfG51bGwgeworICBzd2l0Y2goTXlHYW1lX0V4YW1wbGVfQW55VW5pcXVlQWxpYXNlc1t0eXBlXSkgeworICAgIGNhc2UgJ05PTkUnOiByZXR1cm4gbnVsbDsgCisgICAgY2FzZSAnTSc6IHJldHVybiBhY2Nlc3NvcihuZXcgTXlHYW1lX0V4YW1wbGVfTW9uc3RlcigpKSEgYXMgTXlHYW1lX0V4YW1wbGVfTW9uc3RlcjsKKyAgICBjYXNlICdUUyc6IHJldHVybiBhY2Nlc3NvcihuZXcgTXlHYW1lX0V4YW1wbGVfVGVzdFNpbXBsZVRhYmxlV2l0aEVudW0oKSkhIGFzIE15R2FtZV9FeGFtcGxlX1Rlc3RTaW1wbGVUYWJsZVdpdGhFbnVtOworICAgIGNhc2UgJ00yJzogcmV0dXJuIGFjY2Vzc29yKG5ldyBNeUdhbWVfRXhhbXBsZTJfTW9uc3RlcigpKSEgYXMgTXlHYW1lX0V4YW1wbGUyX01vbnN0ZXI7CisgICAgZGVmYXVsdDogcmV0dXJuIG51bGw7CisgIH0KK30KKworZXhwb3J0IGZ1bmN0aW9uIHVuaW9uTGlzdFRvQW55VW5pcXVlQWxpYXNlcygKKyAgdHlwZTogTXlHYW1lX0V4YW1wbGVfQW55VW5pcXVlQWxpYXNlcywgCisgIGFjY2Vzc29yOiAoaW5kZXg6IG51bWJlciwgb2JqOk15R2FtZV9FeGFtcGxlMl9Nb25zdGVyfE15R2FtZV9FeGFtcGxlX01vbnN0ZXJ8TXlHYW1lX0V4YW1wbGVfVGVzdFNpbXBsZVRhYmxlV2l0aEVudW0pID0+IE15R2FtZV9FeGFtcGxlMl9Nb25zdGVyfE15R2FtZV9FeGFtcGxlX01vbnN0ZXJ8TXlHYW1lX0V4YW1wbGVfVGVzdFNpbXBsZVRhYmxlV2l0aEVudW18bnVsbCwgCisgIGluZGV4OiBudW1iZXIKKyk6IE15R2FtZV9FeGFtcGxlMl9Nb25zdGVyfE15R2FtZV9FeGFtcGxlX01vbnN0ZXJ8TXlHYW1lX0V4YW1wbGVfVGVzdFNpbXBsZVRhYmxlV2l0aEVudW18bnVsbCB7CisgIHN3aXRjaChNeUdhbWVfRXhhbXBsZV9BbnlVbmlxdWVBbGlhc2VzW3R5cGVdKSB7CisgICAgY2FzZSAnTk9ORSc6IHJldHVybiBudWxsOyAKKyAgICBjYXNlICdNJzogcmV0dXJuIGFjY2Vzc29yKGluZGV4LCBuZXcgTXlHYW1lX0V4YW1wbGVfTW9uc3RlcigpKSEgYXMgTXlHYW1lX0V4YW1wbGVfTW9uc3RlcjsKKyAgICBjYXNlICdUUyc6IHJldHVybiBhY2Nlc3NvcihpbmRleCwgbmV3IE15R2FtZV9FeGFtcGxlX1Rlc3RTaW1wbGVUYWJsZVdpdGhFbnVtKCkpISBhcyBNeUdhbWVfRXhhbXBsZV9UZXN0U2ltcGxlVGFibGVXaXRoRW51bTsKKyAgICBjYXNlICdNMic6IHJldHVybiBhY2Nlc3NvcihpbmRleCwgbmV3IE15R2FtZV9FeGFtcGxlMl9Nb25zdGVyKCkpISBhcyBNeUdhbWVfRXhhbXBsZTJfTW9uc3RlcjsKKyAgICBkZWZhdWx0OiByZXR1cm4gbnVsbDsKKyAgfQorfQorCitleHBvcnQgZW51bSBNeUdhbWVfRXhhbXBsZV9BbnlBbWJpZ3VvdXNBbGlhc2VzIHsKKyAgTk9ORSA9IDAsCisgIE0xID0gMSwKKyAgTTIgPSAyLAorICBNMyA9IDMKK30KKworZXhwb3J0IGZ1bmN0aW9uIHVuaW9uVG9BbnlBbWJpZ3VvdXNBbGlhc2VzKAorICB0eXBlOiBNeUdhbWVfRXhhbXBsZV9BbnlBbWJpZ3VvdXNBbGlhc2VzLAorICBhY2Nlc3NvcjogKG9iajpNeUdhbWVfRXhhbXBsZV9Nb25zdGVyKSA9PiBNeUdhbWVfRXhhbXBsZV9Nb25zdGVyfG51bGwKKyk6IE15R2FtZV9FeGFtcGxlX01vbnN0ZXJ8bnVsbCB7CisgIHN3aXRjaChNeUdhbWVfRXhhbXBsZV9BbnlBbWJpZ3VvdXNBbGlhc2VzW3R5cGVdKSB7CisgICAgY2FzZSAnTk9ORSc6IHJldHVybiBudWxsOyAKKyAgICBjYXNlICdNMSc6IHJldHVybiBhY2Nlc3NvcihuZXcgTXlHYW1lX0V4YW1wbGVfTW9uc3RlcigpKSEgYXMgTXlHYW1lX0V4YW1wbGVfTW9uc3RlcjsKKyAgICBjYXNlICdNMic6IHJldHVybiBhY2Nlc3NvcihuZXcgTXlHYW1lX0V4YW1wbGVfTW9uc3RlcigpKSEgYXMgTXlHYW1lX0V4YW1wbGVfTW9uc3RlcjsKKyAgICBjYXNlICdNMyc6IHJldHVybiBhY2Nlc3NvcihuZXcgTXlHYW1lX0V4YW1wbGVfTW9uc3RlcigpKSEgYXMgTXlHYW1lX0V4YW1wbGVfTW9uc3RlcjsKKyAgICBkZWZhdWx0OiByZXR1cm4gbnVsbDsKKyAgfQorfQorCitleHBvcnQgZnVuY3Rpb24gdW5pb25MaXN0VG9BbnlBbWJpZ3VvdXNBbGlhc2VzKAorICB0eXBlOiBNeUdhbWVfRXhhbXBsZV9BbnlBbWJpZ3VvdXNBbGlhc2VzLCAKKyAgYWNjZXNzb3I6IChpbmRleDogbnVtYmVyLCBvYmo6TXlHYW1lX0V4YW1wbGVfTW9uc3RlcikgPT4gTXlHYW1lX0V4YW1wbGVfTW9uc3RlcnxudWxsLCAKKyAgaW5kZXg6IG51bWJlcgorKTogTXlHYW1lX0V4YW1wbGVfTW9uc3RlcnxudWxsIHsKKyAgc3dpdGNoKE15R2FtZV9FeGFtcGxlX0FueUFtYmlndW91c0FsaWFzZXNbdHlwZV0pIHsKKyAgICBjYXNlICdOT05FJzogcmV0dXJuIG51bGw7IAorICAgIGNhc2UgJ00xJzogcmV0dXJuIGFjY2Vzc29yKGluZGV4LCBuZXcgTXlHYW1lX0V4YW1wbGVfTW9uc3RlcigpKSEgYXMgTXlHYW1lX0V4YW1wbGVfTW9uc3RlcjsKKyAgICBjYXNlICdNMic6IHJldHVybiBhY2Nlc3NvcihpbmRleCwgbmV3IE15R2FtZV9FeGFtcGxlX01vbnN0ZXIoKSkhIGFzIE15R2FtZV9FeGFtcGxlX01vbnN0ZXI7CisgICAgY2FzZSAnTTMnOiByZXR1cm4gYWNjZXNzb3IoaW5kZXgsIG5ldyBNeUdhbWVfRXhhbXBsZV9Nb25zdGVyKCkpISBhcyBNeUdhbWVfRXhhbXBsZV9Nb25zdGVyOworICAgIGRlZmF1bHQ6IHJldHVybiBudWxsOworICB9Cit9CisKK2V4cG9ydCBjbGFzcyBNeUdhbWVfT3RoZXJOYW1lU3BhY2VfVW51c2VkIHsKKyAgYmI6IGZsYXRidWZmZXJzLkJ5dGVCdWZmZXJ8bnVsbCA9IG51bGw7CisgIGJiX3BvcyA9IDA7CisgIF9faW5pdChpOm51bWJlciwgYmI6ZmxhdGJ1ZmZlcnMuQnl0ZUJ1ZmZlcik6TXlHYW1lX090aGVyTmFtZVNwYWNlX1VudXNlZCB7CisgIHRoaXMuYmJfcG9zID0gaTsKKyAgdGhpcy5iYiA9IGJiOworICByZXR1cm4gdGhpczsKK30KKworYSgpOm51bWJlciB7CisgIHJldHVybiB0aGlzLmJiIS5yZWFkSW50MzIodGhpcy5iYl9wb3MpOworfQorCitzdGF0aWMgc2l6ZU9mKCk6bnVtYmVyIHsKKyAgcmV0dXJuIDQ7Cit9CisKK3N0YXRpYyBjcmVhdGVVbnVzZWQoYnVpbGRlcjpmbGF0YnVmZmVycy5CdWlsZGVyLCBhOiBudW1iZXIpOmZsYXRidWZmZXJzLk9mZnNldCB7CisgIGJ1aWxkZXIucHJlcCg0LCA0KTsKKyAgYnVpbGRlci53cml0ZUludDMyKGEpOworICByZXR1cm4gYnVpbGRlci5vZmZzZXQoKTsKK30KKworfQorCitleHBvcnQgY2xhc3MgTXlHYW1lX090aGVyTmFtZVNwYWNlX1RhYmxlQiB7CisgIGJiOiBmbGF0YnVmZmVycy5CeXRlQnVmZmVyfG51bGwgPSBudWxsOworICBiYl9wb3MgPSAwOworICBfX2luaXQoaTpudW1iZXIsIGJiOmZsYXRidWZmZXJzLkJ5dGVCdWZmZXIpOk15R2FtZV9PdGhlck5hbWVTcGFjZV9UYWJsZUIgeworICB0aGlzLmJiX3BvcyA9IGk7CisgIHRoaXMuYmIgPSBiYjsKKyAgcmV0dXJuIHRoaXM7Cit9CisKK3N0YXRpYyBnZXRSb290QXNUYWJsZUIoYmI6ZmxhdGJ1ZmZlcnMuQnl0ZUJ1ZmZlciwgb2JqPzpNeUdhbWVfT3RoZXJOYW1lU3BhY2VfVGFibGVCKTpNeUdhbWVfT3RoZXJOYW1lU3BhY2VfVGFibGVCIHsKKyAgcmV0dXJuIChvYmogfHwgbmV3IE15R2FtZV9PdGhlck5hbWVTcGFjZV9UYWJsZUIoKSkuX19pbml0KGJiLnJlYWRJbnQzMihiYi5wb3NpdGlvbigpKSArIGJiLnBvc2l0aW9uKCksIGJiKTsKK30KKworc3RhdGljIGdldFNpemVQcmVmaXhlZFJvb3RBc1RhYmxlQihiYjpmbGF0YnVmZmVycy5CeXRlQnVmZmVyLCBvYmo/Ok15R2FtZV9PdGhlck5hbWVTcGFjZV9UYWJsZUIpOk15R2FtZV9PdGhlck5hbWVTcGFjZV9UYWJsZUIgeworICBiYi5zZXRQb3NpdGlvbihiYi5wb3NpdGlvbigpICsgZmxhdGJ1ZmZlcnMuU0laRV9QUkVGSVhfTEVOR1RIKTsKKyAgcmV0dXJuIChvYmogfHwgbmV3IE15R2FtZV9PdGhlck5hbWVTcGFjZV9UYWJsZUIoKSkuX19pbml0KGJiLnJlYWRJbnQzMihiYi5wb3NpdGlvbigpKSArIGJiLnBvc2l0aW9uKCksIGJiKTsKK30KKworYShvYmo/OlRhYmxlQSk6VGFibGVBfG51bGwgeworICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiIS5fX29mZnNldCh0aGlzLmJiX3BvcywgNCk7CisgIHJldHVybiBvZmZzZXQgPyAob2JqIHx8IG5ldyBUYWJsZUEoKSkuX19pbml0KHRoaXMuYmIhLl9faW5kaXJlY3QodGhpcy5iYl9wb3MgKyBvZmZzZXQpLCB0aGlzLmJiISkgOiBudWxsOworfQorCitzdGF0aWMgc3RhcnRUYWJsZUIoYnVpbGRlcjpmbGF0YnVmZmVycy5CdWlsZGVyKSB7CisgIGJ1aWxkZXIuc3RhcnRPYmplY3QoMSk7Cit9CisKK3N0YXRpYyBhZGRBKGJ1aWxkZXI6ZmxhdGJ1ZmZlcnMuQnVpbGRlciwgYU9mZnNldDpmbGF0YnVmZmVycy5PZmZzZXQpIHsKKyAgYnVpbGRlci5hZGRGaWVsZE9mZnNldCgwLCBhT2Zmc2V0LCAwKTsKK30KKworc3RhdGljIGVuZFRhYmxlQihidWlsZGVyOmZsYXRidWZmZXJzLkJ1aWxkZXIpOmZsYXRidWZmZXJzLk9mZnNldCB7CisgIGNvbnN0IG9mZnNldCA9IGJ1aWxkZXIuZW5kT2JqZWN0KCk7CisgIHJldHVybiBvZmZzZXQ7Cit9CisKK3N0YXRpYyBjcmVhdGVUYWJsZUIoYnVpbGRlcjpmbGF0YnVmZmVycy5CdWlsZGVyLCBhT2Zmc2V0OmZsYXRidWZmZXJzLk9mZnNldCk6ZmxhdGJ1ZmZlcnMuT2Zmc2V0IHsKKyAgTXlHYW1lX090aGVyTmFtZVNwYWNlX1RhYmxlQi5zdGFydFRhYmxlQihidWlsZGVyKTsKKyAgTXlHYW1lX090aGVyTmFtZVNwYWNlX1RhYmxlQi5hZGRBKGJ1aWxkZXIsIGFPZmZzZXQpOworICByZXR1cm4gTXlHYW1lX090aGVyTmFtZVNwYWNlX1RhYmxlQi5lbmRUYWJsZUIoYnVpbGRlcik7Cit9CisKK3NlcmlhbGl6ZSgpOlVpbnQ4QXJyYXkgeworICByZXR1cm4gdGhpcy5iYiEuYnl0ZXMoKTsKK30KKworc3RhdGljIGRlc2VyaWFsaXplKGJ1ZmZlcjogVWludDhBcnJheSk6VGFibGVCIHsKKyAgcmV0dXJuIE15R2FtZV9PdGhlck5hbWVTcGFjZV9UYWJsZUIuZ2V0Um9vdEFzVGFibGVCKG5ldyBmbGF0YnVmZmVycy5CeXRlQnVmZmVyKGJ1ZmZlcikpCit9Cit9CisKK2V4cG9ydCBjbGFzcyBUYWJsZUEgeworICBiYjogZmxhdGJ1ZmZlcnMuQnl0ZUJ1ZmZlcnxudWxsID0gbnVsbDsKKyAgYmJfcG9zID0gMDsKKyAgX19pbml0KGk6bnVtYmVyLCBiYjpmbGF0YnVmZmVycy5CeXRlQnVmZmVyKTpUYWJsZUEgeworICB0aGlzLmJiX3BvcyA9IGk7CisgIHRoaXMuYmIgPSBiYjsKKyAgcmV0dXJuIHRoaXM7Cit9CisKK3N0YXRpYyBnZXRSb290QXNUYWJsZUEoYmI6ZmxhdGJ1ZmZlcnMuQnl0ZUJ1ZmZlciwgb2JqPzpUYWJsZUEpOlRhYmxlQSB7CisgIHJldHVybiAob2JqIHx8IG5ldyBUYWJsZUEoKSkuX19pbml0KGJiLnJlYWRJbnQzMihiYi5wb3NpdGlvbigpKSArIGJiLnBvc2l0aW9uKCksIGJiKTsKK30KKworc3RhdGljIGdldFNpemVQcmVmaXhlZFJvb3RBc1RhYmxlQShiYjpmbGF0YnVmZmVycy5CeXRlQnVmZmVyLCBvYmo/OlRhYmxlQSk6VGFibGVBIHsKKyAgYmIuc2V0UG9zaXRpb24oYmIucG9zaXRpb24oKSArIGZsYXRidWZmZXJzLlNJWkVfUFJFRklYX0xFTkdUSCk7CisgIHJldHVybiAob2JqIHx8IG5ldyBUYWJsZUEoKSkuX19pbml0KGJiLnJlYWRJbnQzMihiYi5wb3NpdGlvbigpKSArIGJiLnBvc2l0aW9uKCksIGJiKTsKK30KKworYihvYmo/Ok15R2FtZV9PdGhlck5hbWVTcGFjZV9UYWJsZUIpOk15R2FtZV9PdGhlck5hbWVTcGFjZV9UYWJsZUJ8bnVsbCB7CisgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIhLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCA0KTsKKyAgcmV0dXJuIG9mZnNldCA/IChvYmogfHwgbmV3IE15R2FtZV9PdGhlck5hbWVTcGFjZV9UYWJsZUIoKSkuX19pbml0KHRoaXMuYmIhLl9faW5kaXJlY3QodGhpcy5iYl9wb3MgKyBvZmZzZXQpLCB0aGlzLmJiISkgOiBudWxsOworfQorCitzdGF0aWMgc3RhcnRUYWJsZUEoYnVpbGRlcjpmbGF0YnVmZmVycy5CdWlsZGVyKSB7CisgIGJ1aWxkZXIuc3RhcnRPYmplY3QoMSk7Cit9CisKK3N0YXRpYyBhZGRCKGJ1aWxkZXI6ZmxhdGJ1ZmZlcnMuQnVpbGRlciwgYk9mZnNldDpmbGF0YnVmZmVycy5PZmZzZXQpIHsKKyAgYnVpbGRlci5hZGRGaWVsZE9mZnNldCgwLCBiT2Zmc2V0LCAwKTsKK30KKworc3RhdGljIGVuZFRhYmxlQShidWlsZGVyOmZsYXRidWZmZXJzLkJ1aWxkZXIpOmZsYXRidWZmZXJzLk9mZnNldCB7CisgIGNvbnN0IG9mZnNldCA9IGJ1aWxkZXIuZW5kT2JqZWN0KCk7CisgIHJldHVybiBvZmZzZXQ7Cit9CisKK3N0YXRpYyBjcmVhdGVUYWJsZUEoYnVpbGRlcjpmbGF0YnVmZmVycy5CdWlsZGVyLCBiT2Zmc2V0OmZsYXRidWZmZXJzLk9mZnNldCk6ZmxhdGJ1ZmZlcnMuT2Zmc2V0IHsKKyAgVGFibGVBLnN0YXJ0VGFibGVBKGJ1aWxkZXIpOworICBUYWJsZUEuYWRkQihidWlsZGVyLCBiT2Zmc2V0KTsKKyAgcmV0dXJuIFRhYmxlQS5lbmRUYWJsZUEoYnVpbGRlcik7Cit9CisKK3NlcmlhbGl6ZSgpOlVpbnQ4QXJyYXkgeworICByZXR1cm4gdGhpcy5iYiEuYnl0ZXMoKTsKK30KKworc3RhdGljIGRlc2VyaWFsaXplKGJ1ZmZlcjogVWludDhBcnJheSk6VGFibGVBIHsKKyAgcmV0dXJuIFRhYmxlQS5nZXRSb290QXNUYWJsZUEobmV3IGZsYXRidWZmZXJzLkJ5dGVCdWZmZXIoYnVmZmVyKSkKK30KK30KKworZXhwb3J0IGNsYXNzIE15R2FtZV9JblBhcmVudE5hbWVzcGFjZSB7CisgIGJiOiBmbGF0YnVmZmVycy5CeXRlQnVmZmVyfG51bGwgPSBudWxsOworICBiYl9wb3MgPSAwOworICBfX2luaXQoaTpudW1iZXIsIGJiOmZsYXRidWZmZXJzLkJ5dGVCdWZmZXIpOk15R2FtZV9JblBhcmVudE5hbWVzcGFjZSB7CisgIHRoaXMuYmJfcG9zID0gaTsKKyAgdGhpcy5iYiA9IGJiOworICByZXR1cm4gdGhpczsKK30KKworc3RhdGljIGdldFJvb3RBc0luUGFyZW50TmFtZXNwYWNlKGJiOmZsYXRidWZmZXJzLkJ5dGVCdWZmZXIsIG9iaj86TXlHYW1lX0luUGFyZW50TmFtZXNwYWNlKTpNeUdhbWVfSW5QYXJlbnROYW1lc3BhY2UgeworICByZXR1cm4gKG9iaiB8fCBuZXcgTXlHYW1lX0luUGFyZW50TmFtZXNwYWNlKCkpLl9faW5pdChiYi5yZWFkSW50MzIoYmIucG9zaXRpb24oKSkgKyBiYi5wb3NpdGlvbigpLCBiYik7Cit9CisKK3N0YXRpYyBnZXRTaXplUHJlZml4ZWRSb290QXNJblBhcmVudE5hbWVzcGFjZShiYjpmbGF0YnVmZmVycy5CeXRlQnVmZmVyLCBvYmo/Ok15R2FtZV9JblBhcmVudE5hbWVzcGFjZSk6TXlHYW1lX0luUGFyZW50TmFtZXNwYWNlIHsKKyAgYmIuc2V0UG9zaXRpb24oYmIucG9zaXRpb24oKSArIGZsYXRidWZmZXJzLlNJWkVfUFJFRklYX0xFTkdUSCk7CisgIHJldHVybiAob2JqIHx8IG5ldyBNeUdhbWVfSW5QYXJlbnROYW1lc3BhY2UoKSkuX19pbml0KGJiLnJlYWRJbnQzMihiYi5wb3NpdGlvbigpKSArIGJiLnBvc2l0aW9uKCksIGJiKTsKK30KKworc3RhdGljIHN0YXJ0SW5QYXJlbnROYW1lc3BhY2UoYnVpbGRlcjpmbGF0YnVmZmVycy5CdWlsZGVyKSB7CisgIGJ1aWxkZXIuc3RhcnRPYmplY3QoMCk7Cit9CisKK3N0YXRpYyBlbmRJblBhcmVudE5hbWVzcGFjZShidWlsZGVyOmZsYXRidWZmZXJzLkJ1aWxkZXIpOmZsYXRidWZmZXJzLk9mZnNldCB7CisgIGNvbnN0IG9mZnNldCA9IGJ1aWxkZXIuZW5kT2JqZWN0KCk7CisgIHJldHVybiBvZmZzZXQ7Cit9CisKK3N0YXRpYyBjcmVhdGVJblBhcmVudE5hbWVzcGFjZShidWlsZGVyOmZsYXRidWZmZXJzLkJ1aWxkZXIpOmZsYXRidWZmZXJzLk9mZnNldCB7CisgIE15R2FtZV9JblBhcmVudE5hbWVzcGFjZS5zdGFydEluUGFyZW50TmFtZXNwYWNlKGJ1aWxkZXIpOworICByZXR1cm4gTXlHYW1lX0luUGFyZW50TmFtZXNwYWNlLmVuZEluUGFyZW50TmFtZXNwYWNlKGJ1aWxkZXIpOworfQorCitzZXJpYWxpemUoKTpVaW50OEFycmF5IHsKKyAgcmV0dXJuIHRoaXMuYmIhLmJ5dGVzKCk7Cit9CisKK3N0YXRpYyBkZXNlcmlhbGl6ZShidWZmZXI6IFVpbnQ4QXJyYXkpOkluUGFyZW50TmFtZXNwYWNlIHsKKyAgcmV0dXJuIE15R2FtZV9JblBhcmVudE5hbWVzcGFjZS5nZXRSb290QXNJblBhcmVudE5hbWVzcGFjZShuZXcgZmxhdGJ1ZmZlcnMuQnl0ZUJ1ZmZlcihidWZmZXIpKQorfQorfQorCitleHBvcnQgY2xhc3MgTXlHYW1lX0V4YW1wbGUyX01vbnN0ZXIgeworICBiYjogZmxhdGJ1ZmZlcnMuQnl0ZUJ1ZmZlcnxudWxsID0gbnVsbDsKKyAgYmJfcG9zID0gMDsKKyAgX19pbml0KGk6bnVtYmVyLCBiYjpmbGF0YnVmZmVycy5CeXRlQnVmZmVyKTpNeUdhbWVfRXhhbXBsZTJfTW9uc3RlciB7CisgIHRoaXMuYmJfcG9zID0gaTsKKyAgdGhpcy5iYiA9IGJiOworICByZXR1cm4gdGhpczsKK30KKworc3RhdGljIGdldFJvb3RBc01vbnN0ZXIoYmI6ZmxhdGJ1ZmZlcnMuQnl0ZUJ1ZmZlciwgb2JqPzpNeUdhbWVfRXhhbXBsZTJfTW9uc3Rlcik6TXlHYW1lX0V4YW1wbGUyX01vbnN0ZXIgeworICByZXR1cm4gKG9iaiB8fCBuZXcgTXlHYW1lX0V4YW1wbGUyX01vbnN0ZXIoKSkuX19pbml0KGJiLnJlYWRJbnQzMihiYi5wb3NpdGlvbigpKSArIGJiLnBvc2l0aW9uKCksIGJiKTsKK30KKworc3RhdGljIGdldFNpemVQcmVmaXhlZFJvb3RBc01vbnN0ZXIoYmI6ZmxhdGJ1ZmZlcnMuQnl0ZUJ1ZmZlciwgb2JqPzpNeUdhbWVfRXhhbXBsZTJfTW9uc3Rlcik6TXlHYW1lX0V4YW1wbGUyX01vbnN0ZXIgeworICBiYi5zZXRQb3NpdGlvbihiYi5wb3NpdGlvbigpICsgZmxhdGJ1ZmZlcnMuU0laRV9QUkVGSVhfTEVOR1RIKTsKKyAgcmV0dXJuIChvYmogfHwgbmV3IE15R2FtZV9FeGFtcGxlMl9Nb25zdGVyKCkpLl9faW5pdChiYi5yZWFkSW50MzIoYmIucG9zaXRpb24oKSkgKyBiYi5wb3NpdGlvbigpLCBiYik7Cit9CisKK3N0YXRpYyBzdGFydE1vbnN0ZXIoYnVpbGRlcjpmbGF0YnVmZmVycy5CdWlsZGVyKSB7CisgIGJ1aWxkZXIuc3RhcnRPYmplY3QoMCk7Cit9CisKK3N0YXRpYyBlbmRNb25zdGVyKGJ1aWxkZXI6ZmxhdGJ1ZmZlcnMuQnVpbGRlcik6ZmxhdGJ1ZmZlcnMuT2Zmc2V0IHsKKyAgY29uc3Qgb2Zmc2V0ID0gYnVpbGRlci5lbmRPYmplY3QoKTsKKyAgcmV0dXJuIG9mZnNldDsKK30KKworc3RhdGljIGNyZWF0ZU1vbnN0ZXIoYnVpbGRlcjpmbGF0YnVmZmVycy5CdWlsZGVyKTpmbGF0YnVmZmVycy5PZmZzZXQgeworICBNeUdhbWVfRXhhbXBsZTJfTW9uc3Rlci5zdGFydE1vbnN0ZXIoYnVpbGRlcik7CisgIHJldHVybiBNeUdhbWVfRXhhbXBsZTJfTW9uc3Rlci5lbmRNb25zdGVyKGJ1aWxkZXIpOworfQorCitzZXJpYWxpemUoKTpVaW50OEFycmF5IHsKKyAgcmV0dXJuIHRoaXMuYmIhLmJ5dGVzKCk7Cit9CisKK3N0YXRpYyBkZXNlcmlhbGl6ZShidWZmZXI6IFVpbnQ4QXJyYXkpOk1vbnN0ZXIgeworICByZXR1cm4gTXlHYW1lX0V4YW1wbGUyX01vbnN0ZXIuZ2V0Um9vdEFzTW9uc3RlcihuZXcgZmxhdGJ1ZmZlcnMuQnl0ZUJ1ZmZlcihidWZmZXIpKQorfQorfQorCitleHBvcnQgY2xhc3MgTXlHYW1lX0V4YW1wbGVfVGVzdCB7CisgIGJiOiBmbGF0YnVmZmVycy5CeXRlQnVmZmVyfG51bGwgPSBudWxsOworICBiYl9wb3MgPSAwOworICBfX2luaXQoaTpudW1iZXIsIGJiOmZsYXRidWZmZXJzLkJ5dGVCdWZmZXIpOk15R2FtZV9FeGFtcGxlX1Rlc3QgeworICB0aGlzLmJiX3BvcyA9IGk7CisgIHRoaXMuYmIgPSBiYjsKKyAgcmV0dXJuIHRoaXM7Cit9CisKK2EoKTpudW1iZXIgeworICByZXR1cm4gdGhpcy5iYiEucmVhZEludDE2KHRoaXMuYmJfcG9zKTsKK30KKworYigpOm51bWJlciB7CisgIHJldHVybiB0aGlzLmJiIS5yZWFkSW50OCh0aGlzLmJiX3BvcyArIDIpOworfQorCitzdGF0aWMgc2l6ZU9mKCk6bnVtYmVyIHsKKyAgcmV0dXJuIDQ7Cit9CisKK3N0YXRpYyBjcmVhdGVUZXN0KGJ1aWxkZXI6ZmxhdGJ1ZmZlcnMuQnVpbGRlciwgYTogbnVtYmVyLCBiOiBudW1iZXIpOmZsYXRidWZmZXJzLk9mZnNldCB7CisgIGJ1aWxkZXIucHJlcCgyLCA0KTsKKyAgYnVpbGRlci5wYWQoMSk7CisgIGJ1aWxkZXIud3JpdGVJbnQ4KGIpOworICBidWlsZGVyLndyaXRlSW50MTYoYSk7CisgIHJldHVybiBidWlsZGVyLm9mZnNldCgpOworfQorCit9CisKK2V4cG9ydCBjbGFzcyBNeUdhbWVfRXhhbXBsZV9UZXN0U2ltcGxlVGFibGVXaXRoRW51bSB7CisgIGJiOiBmbGF0YnVmZmVycy5CeXRlQnVmZmVyfG51bGwgPSBudWxsOworICBiYl9wb3MgPSAwOworICBfX2luaXQoaTpudW1iZXIsIGJiOmZsYXRidWZmZXJzLkJ5dGVCdWZmZXIpOk15R2FtZV9FeGFtcGxlX1Rlc3RTaW1wbGVUYWJsZVdpdGhFbnVtIHsKKyAgdGhpcy5iYl9wb3MgPSBpOworICB0aGlzLmJiID0gYmI7CisgIHJldHVybiB0aGlzOworfQorCitzdGF0aWMgZ2V0Um9vdEFzVGVzdFNpbXBsZVRhYmxlV2l0aEVudW0oYmI6ZmxhdGJ1ZmZlcnMuQnl0ZUJ1ZmZlciwgb2JqPzpNeUdhbWVfRXhhbXBsZV9UZXN0U2ltcGxlVGFibGVXaXRoRW51bSk6TXlHYW1lX0V4YW1wbGVfVGVzdFNpbXBsZVRhYmxlV2l0aEVudW0geworICByZXR1cm4gKG9iaiB8fCBuZXcgTXlHYW1lX0V4YW1wbGVfVGVzdFNpbXBsZVRhYmxlV2l0aEVudW0oKSkuX19pbml0KGJiLnJlYWRJbnQzMihiYi5wb3NpdGlvbigpKSArIGJiLnBvc2l0aW9uKCksIGJiKTsKK30KKworc3RhdGljIGdldFNpemVQcmVmaXhlZFJvb3RBc1Rlc3RTaW1wbGVUYWJsZVdpdGhFbnVtKGJiOmZsYXRidWZmZXJzLkJ5dGVCdWZmZXIsIG9iaj86TXlHYW1lX0V4YW1wbGVfVGVzdFNpbXBsZVRhYmxlV2l0aEVudW0pOk15R2FtZV9FeGFtcGxlX1Rlc3RTaW1wbGVUYWJsZVdpdGhFbnVtIHsKKyAgYmIuc2V0UG9zaXRpb24oYmIucG9zaXRpb24oKSArIGZsYXRidWZmZXJzLlNJWkVfUFJFRklYX0xFTkdUSCk7CisgIHJldHVybiAob2JqIHx8IG5ldyBNeUdhbWVfRXhhbXBsZV9UZXN0U2ltcGxlVGFibGVXaXRoRW51bSgpKS5fX2luaXQoYmIucmVhZEludDMyKGJiLnBvc2l0aW9uKCkpICsgYmIucG9zaXRpb24oKSwgYmIpOworfQorCitjb2xvcigpOk15R2FtZV9FeGFtcGxlX0NvbG9yIHsKKyAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYiEuX19vZmZzZXQodGhpcy5iYl9wb3MsIDQpOworICByZXR1cm4gb2Zmc2V0ID8gdGhpcy5iYiEucmVhZFVpbnQ4KHRoaXMuYmJfcG9zICsgb2Zmc2V0KSA6IE15R2FtZV9FeGFtcGxlX0NvbG9yLkdyZWVuOworfQorCitzdGF0aWMgc3RhcnRUZXN0U2ltcGxlVGFibGVXaXRoRW51bShidWlsZGVyOmZsYXRidWZmZXJzLkJ1aWxkZXIpIHsKKyAgYnVpbGRlci5zdGFydE9iamVjdCgxKTsKK30KKworc3RhdGljIGFkZENvbG9yKGJ1aWxkZXI6ZmxhdGJ1ZmZlcnMuQnVpbGRlciwgY29sb3I6TXlHYW1lX0V4YW1wbGVfQ29sb3IpIHsKKyAgYnVpbGRlci5hZGRGaWVsZEludDgoMCwgY29sb3IsIE15R2FtZV9FeGFtcGxlX0NvbG9yLkdyZWVuKTsKK30KKworc3RhdGljIGVuZFRlc3RTaW1wbGVUYWJsZVdpdGhFbnVtKGJ1aWxkZXI6ZmxhdGJ1ZmZlcnMuQnVpbGRlcik6ZmxhdGJ1ZmZlcnMuT2Zmc2V0IHsKKyAgY29uc3Qgb2Zmc2V0ID0gYnVpbGRlci5lbmRPYmplY3QoKTsKKyAgcmV0dXJuIG9mZnNldDsKK30KKworc3RhdGljIGNyZWF0ZVRlc3RTaW1wbGVUYWJsZVdpdGhFbnVtKGJ1aWxkZXI6ZmxhdGJ1ZmZlcnMuQnVpbGRlciwgY29sb3I6TXlHYW1lX0V4YW1wbGVfQ29sb3IpOmZsYXRidWZmZXJzLk9mZnNldCB7CisgIE15R2FtZV9FeGFtcGxlX1Rlc3RTaW1wbGVUYWJsZVdpdGhFbnVtLnN0YXJ0VGVzdFNpbXBsZVRhYmxlV2l0aEVudW0oYnVpbGRlcik7CisgIE15R2FtZV9FeGFtcGxlX1Rlc3RTaW1wbGVUYWJsZVdpdGhFbnVtLmFkZENvbG9yKGJ1aWxkZXIsIGNvbG9yKTsKKyAgcmV0dXJuIE15R2FtZV9FeGFtcGxlX1Rlc3RTaW1wbGVUYWJsZVdpdGhFbnVtLmVuZFRlc3RTaW1wbGVUYWJsZVdpdGhFbnVtKGJ1aWxkZXIpOworfQorCitzZXJpYWxpemUoKTpVaW50OEFycmF5IHsKKyAgcmV0dXJuIHRoaXMuYmIhLmJ5dGVzKCk7Cit9CisKK3N0YXRpYyBkZXNlcmlhbGl6ZShidWZmZXI6IFVpbnQ4QXJyYXkpOlRlc3RTaW1wbGVUYWJsZVdpdGhFbnVtIHsKKyAgcmV0dXJuIE15R2FtZV9FeGFtcGxlX1Rlc3RTaW1wbGVUYWJsZVdpdGhFbnVtLmdldFJvb3RBc1Rlc3RTaW1wbGVUYWJsZVdpdGhFbnVtKG5ldyBmbGF0YnVmZmVycy5CeXRlQnVmZmVyKGJ1ZmZlcikpCit9Cit9CisKK2V4cG9ydCBjbGFzcyBNeUdhbWVfRXhhbXBsZV9WZWMzIHsKKyAgYmI6IGZsYXRidWZmZXJzLkJ5dGVCdWZmZXJ8bnVsbCA9IG51bGw7CisgIGJiX3BvcyA9IDA7CisgIF9faW5pdChpOm51bWJlciwgYmI6ZmxhdGJ1ZmZlcnMuQnl0ZUJ1ZmZlcik6TXlHYW1lX0V4YW1wbGVfVmVjMyB7CisgIHRoaXMuYmJfcG9zID0gaTsKKyAgdGhpcy5iYiA9IGJiOworICByZXR1cm4gdGhpczsKK30KKworeCgpOm51bWJlciB7CisgIHJldHVybiB0aGlzLmJiIS5yZWFkRmxvYXQzMih0aGlzLmJiX3Bvcyk7Cit9CisKK3koKTpudW1iZXIgeworICByZXR1cm4gdGhpcy5iYiEucmVhZEZsb2F0MzIodGhpcy5iYl9wb3MgKyA0KTsKK30KKworeigpOm51bWJlciB7CisgIHJldHVybiB0aGlzLmJiIS5yZWFkRmxvYXQzMih0aGlzLmJiX3BvcyArIDgpOworfQorCit0ZXN0MSgpOm51bWJlciB7CisgIHJldHVybiB0aGlzLmJiIS5yZWFkRmxvYXQ2NCh0aGlzLmJiX3BvcyArIDE2KTsKK30KKwordGVzdDIoKTpNeUdhbWVfRXhhbXBsZV9Db2xvciB7CisgIHJldHVybiB0aGlzLmJiIS5yZWFkVWludDgodGhpcy5iYl9wb3MgKyAyNCk7Cit9CisKK3Rlc3QzKG9iaj86TXlHYW1lX0V4YW1wbGVfVGVzdCk6TXlHYW1lX0V4YW1wbGVfVGVzdHxudWxsIHsKKyAgcmV0dXJuIChvYmogfHwgbmV3IE15R2FtZV9FeGFtcGxlX1Rlc3QoKSkuX19pbml0KHRoaXMuYmJfcG9zICsgMjYsIHRoaXMuYmIhKTsKK30KKworc3RhdGljIHNpemVPZigpOm51bWJlciB7CisgIHJldHVybiAzMjsKK30KKworc3RhdGljIGNyZWF0ZVZlYzMoYnVpbGRlcjpmbGF0YnVmZmVycy5CdWlsZGVyLCB4OiBudW1iZXIsIHk6IG51bWJlciwgejogbnVtYmVyLCB0ZXN0MTogbnVtYmVyLCB0ZXN0MjogTXlHYW1lX0V4YW1wbGVfQ29sb3IsIHRlc3QzX2E6IG51bWJlciwgdGVzdDNfYjogbnVtYmVyKTpmbGF0YnVmZmVycy5PZmZzZXQgeworICBidWlsZGVyLnByZXAoOCwgMzIpOworICBidWlsZGVyLnBhZCgyKTsKKyAgYnVpbGRlci5wcmVwKDIsIDQpOworICBidWlsZGVyLnBhZCgxKTsKKyAgYnVpbGRlci53cml0ZUludDgodGVzdDNfYik7CisgIGJ1aWxkZXIud3JpdGVJbnQxNih0ZXN0M19hKTsKKyAgYnVpbGRlci5wYWQoMSk7CisgIGJ1aWxkZXIud3JpdGVJbnQ4KHRlc3QyKTsKKyAgYnVpbGRlci53cml0ZUZsb2F0NjQodGVzdDEpOworICBidWlsZGVyLnBhZCg0KTsKKyAgYnVpbGRlci53cml0ZUZsb2F0MzIoeik7CisgIGJ1aWxkZXIud3JpdGVGbG9hdDMyKHkpOworICBidWlsZGVyLndyaXRlRmxvYXQzMih4KTsKKyAgcmV0dXJuIGJ1aWxkZXIub2Zmc2V0KCk7Cit9CisKK30KKworZXhwb3J0IGNsYXNzIE15R2FtZV9FeGFtcGxlX0FiaWxpdHkgeworICBiYjogZmxhdGJ1ZmZlcnMuQnl0ZUJ1ZmZlcnxudWxsID0gbnVsbDsKKyAgYmJfcG9zID0gMDsKKyAgX19pbml0KGk6bnVtYmVyLCBiYjpmbGF0YnVmZmVycy5CeXRlQnVmZmVyKTpNeUdhbWVfRXhhbXBsZV9BYmlsaXR5IHsKKyAgdGhpcy5iYl9wb3MgPSBpOworICB0aGlzLmJiID0gYmI7CisgIHJldHVybiB0aGlzOworfQorCitpZCgpOm51bWJlciB7CisgIHJldHVybiB0aGlzLmJiIS5yZWFkVWludDMyKHRoaXMuYmJfcG9zKTsKK30KKworZGlzdGFuY2UoKTpudW1iZXIgeworICByZXR1cm4gdGhpcy5iYiEucmVhZFVpbnQzMih0aGlzLmJiX3BvcyArIDQpOworfQorCitzdGF0aWMgc2l6ZU9mKCk6bnVtYmVyIHsKKyAgcmV0dXJuIDg7Cit9CisKK3N0YXRpYyBjcmVhdGVBYmlsaXR5KGJ1aWxkZXI6ZmxhdGJ1ZmZlcnMuQnVpbGRlciwgaWQ6IG51bWJlciwgZGlzdGFuY2U6IG51bWJlcik6ZmxhdGJ1ZmZlcnMuT2Zmc2V0IHsKKyAgYnVpbGRlci5wcmVwKDQsIDgpOworICBidWlsZGVyLndyaXRlSW50MzIoZGlzdGFuY2UpOworICBidWlsZGVyLndyaXRlSW50MzIoaWQpOworICByZXR1cm4gYnVpbGRlci5vZmZzZXQoKTsKK30KKworfQorCitleHBvcnQgY2xhc3MgTXlHYW1lX0V4YW1wbGVfU3RydWN0T2ZTdHJ1Y3RzIHsKKyAgYmI6IGZsYXRidWZmZXJzLkJ5dGVCdWZmZXJ8bnVsbCA9IG51bGw7CisgIGJiX3BvcyA9IDA7CisgIF9faW5pdChpOm51bWJlciwgYmI6ZmxhdGJ1ZmZlcnMuQnl0ZUJ1ZmZlcik6TXlHYW1lX0V4YW1wbGVfU3RydWN0T2ZTdHJ1Y3RzIHsKKyAgdGhpcy5iYl9wb3MgPSBpOworICB0aGlzLmJiID0gYmI7CisgIHJldHVybiB0aGlzOworfQorCithKG9iaj86TXlHYW1lX0V4YW1wbGVfQWJpbGl0eSk6TXlHYW1lX0V4YW1wbGVfQWJpbGl0eXxudWxsIHsKKyAgcmV0dXJuIChvYmogfHwgbmV3IE15R2FtZV9FeGFtcGxlX0FiaWxpdHkoKSkuX19pbml0KHRoaXMuYmJfcG9zLCB0aGlzLmJiISk7Cit9CisKK2Iob2JqPzpNeUdhbWVfRXhhbXBsZV9UZXN0KTpNeUdhbWVfRXhhbXBsZV9UZXN0fG51bGwgeworICByZXR1cm4gKG9iaiB8fCBuZXcgTXlHYW1lX0V4YW1wbGVfVGVzdCgpKS5fX2luaXQodGhpcy5iYl9wb3MgKyA4LCB0aGlzLmJiISk7Cit9CisKK2Mob2JqPzpNeUdhbWVfRXhhbXBsZV9BYmlsaXR5KTpNeUdhbWVfRXhhbXBsZV9BYmlsaXR5fG51bGwgeworICByZXR1cm4gKG9iaiB8fCBuZXcgTXlHYW1lX0V4YW1wbGVfQWJpbGl0eSgpKS5fX2luaXQodGhpcy5iYl9wb3MgKyAxMiwgdGhpcy5iYiEpOworfQorCitzdGF0aWMgc2l6ZU9mKCk6bnVtYmVyIHsKKyAgcmV0dXJuIDIwOworfQorCitzdGF0aWMgY3JlYXRlU3RydWN0T2ZTdHJ1Y3RzKGJ1aWxkZXI6ZmxhdGJ1ZmZlcnMuQnVpbGRlciwgYV9pZDogbnVtYmVyLCBhX2Rpc3RhbmNlOiBudW1iZXIsIGJfYTogbnVtYmVyLCBiX2I6IG51bWJlciwgY19pZDogbnVtYmVyLCBjX2Rpc3RhbmNlOiBudW1iZXIpOmZsYXRidWZmZXJzLk9mZnNldCB7CisgIGJ1aWxkZXIucHJlcCg0LCAyMCk7CisgIGJ1aWxkZXIucHJlcCg0LCA4KTsKKyAgYnVpbGRlci53cml0ZUludDMyKGNfZGlzdGFuY2UpOworICBidWlsZGVyLndyaXRlSW50MzIoY19pZCk7CisgIGJ1aWxkZXIucHJlcCgyLCA0KTsKKyAgYnVpbGRlci5wYWQoMSk7CisgIGJ1aWxkZXIud3JpdGVJbnQ4KGJfYik7CisgIGJ1aWxkZXIud3JpdGVJbnQxNihiX2EpOworICBidWlsZGVyLnByZXAoNCwgOCk7CisgIGJ1aWxkZXIud3JpdGVJbnQzMihhX2Rpc3RhbmNlKTsKKyAgYnVpbGRlci53cml0ZUludDMyKGFfaWQpOworICByZXR1cm4gYnVpbGRlci5vZmZzZXQoKTsKK30KKworfQorCitleHBvcnQgY2xhc3MgTXlHYW1lX0V4YW1wbGVfU3RydWN0T2ZTdHJ1Y3RzT2ZTdHJ1Y3RzIHsKKyAgYmI6IGZsYXRidWZmZXJzLkJ5dGVCdWZmZXJ8bnVsbCA9IG51bGw7CisgIGJiX3BvcyA9IDA7CisgIF9faW5pdChpOm51bWJlciwgYmI6ZmxhdGJ1ZmZlcnMuQnl0ZUJ1ZmZlcik6TXlHYW1lX0V4YW1wbGVfU3RydWN0T2ZTdHJ1Y3RzT2ZTdHJ1Y3RzIHsKKyAgdGhpcy5iYl9wb3MgPSBpOworICB0aGlzLmJiID0gYmI7CisgIHJldHVybiB0aGlzOworfQorCithKG9iaj86TXlHYW1lX0V4YW1wbGVfU3RydWN0T2ZTdHJ1Y3RzKTpNeUdhbWVfRXhhbXBsZV9TdHJ1Y3RPZlN0cnVjdHN8bnVsbCB7CisgIHJldHVybiAob2JqIHx8IG5ldyBNeUdhbWVfRXhhbXBsZV9TdHJ1Y3RPZlN0cnVjdHMoKSkuX19pbml0KHRoaXMuYmJfcG9zLCB0aGlzLmJiISk7Cit9CisKK3N0YXRpYyBzaXplT2YoKTpudW1iZXIgeworICByZXR1cm4gMjA7Cit9CisKK3N0YXRpYyBjcmVhdGVTdHJ1Y3RPZlN0cnVjdHNPZlN0cnVjdHMoYnVpbGRlcjpmbGF0YnVmZmVycy5CdWlsZGVyLCBhX2FfaWQ6IG51bWJlciwgYV9hX2Rpc3RhbmNlOiBudW1iZXIsIGFfYl9hOiBudW1iZXIsIGFfYl9iOiBudW1iZXIsIGFfY19pZDogbnVtYmVyLCBhX2NfZGlzdGFuY2U6IG51bWJlcik6ZmxhdGJ1ZmZlcnMuT2Zmc2V0IHsKKyAgYnVpbGRlci5wcmVwKDQsIDIwKTsKKyAgYnVpbGRlci5wcmVwKDQsIDIwKTsKKyAgYnVpbGRlci5wcmVwKDQsIDgpOworICBidWlsZGVyLndyaXRlSW50MzIoYV9jX2Rpc3RhbmNlKTsKKyAgYnVpbGRlci53cml0ZUludDMyKGFfY19pZCk7CisgIGJ1aWxkZXIucHJlcCgyLCA0KTsKKyAgYnVpbGRlci5wYWQoMSk7CisgIGJ1aWxkZXIud3JpdGVJbnQ4KGFfYl9iKTsKKyAgYnVpbGRlci53cml0ZUludDE2KGFfYl9hKTsKKyAgYnVpbGRlci5wcmVwKDQsIDgpOworICBidWlsZGVyLndyaXRlSW50MzIoYV9hX2Rpc3RhbmNlKTsKKyAgYnVpbGRlci53cml0ZUludDMyKGFfYV9pZCk7CisgIHJldHVybiBidWlsZGVyLm9mZnNldCgpOworfQorCit9CisKK2V4cG9ydCBjbGFzcyBNeUdhbWVfRXhhbXBsZV9TdGF0IHsKKyAgYmI6IGZsYXRidWZmZXJzLkJ5dGVCdWZmZXJ8bnVsbCA9IG51bGw7CisgIGJiX3BvcyA9IDA7CisgIF9faW5pdChpOm51bWJlciwgYmI6ZmxhdGJ1ZmZlcnMuQnl0ZUJ1ZmZlcik6TXlHYW1lX0V4YW1wbGVfU3RhdCB7CisgIHRoaXMuYmJfcG9zID0gaTsKKyAgdGhpcy5iYiA9IGJiOworICByZXR1cm4gdGhpczsKK30KKworc3RhdGljIGdldFJvb3RBc1N0YXQoYmI6ZmxhdGJ1ZmZlcnMuQnl0ZUJ1ZmZlciwgb2JqPzpNeUdhbWVfRXhhbXBsZV9TdGF0KTpNeUdhbWVfRXhhbXBsZV9TdGF0IHsKKyAgcmV0dXJuIChvYmogfHwgbmV3IE15R2FtZV9FeGFtcGxlX1N0YXQoKSkuX19pbml0KGJiLnJlYWRJbnQzMihiYi5wb3NpdGlvbigpKSArIGJiLnBvc2l0aW9uKCksIGJiKTsKK30KKworc3RhdGljIGdldFNpemVQcmVmaXhlZFJvb3RBc1N0YXQoYmI6ZmxhdGJ1ZmZlcnMuQnl0ZUJ1ZmZlciwgb2JqPzpNeUdhbWVfRXhhbXBsZV9TdGF0KTpNeUdhbWVfRXhhbXBsZV9TdGF0IHsKKyAgYmIuc2V0UG9zaXRpb24oYmIucG9zaXRpb24oKSArIGZsYXRidWZmZXJzLlNJWkVfUFJFRklYX0xFTkdUSCk7CisgIHJldHVybiAob2JqIHx8IG5ldyBNeUdhbWVfRXhhbXBsZV9TdGF0KCkpLl9faW5pdChiYi5yZWFkSW50MzIoYmIucG9zaXRpb24oKSkgKyBiYi5wb3NpdGlvbigpLCBiYik7Cit9CisKK2lkKCk6c3RyaW5nfG51bGwKK2lkKG9wdGlvbmFsRW5jb2Rpbmc6ZmxhdGJ1ZmZlcnMuRW5jb2RpbmcpOnN0cmluZ3xVaW50OEFycmF5fG51bGwKK2lkKG9wdGlvbmFsRW5jb2Rpbmc/OmFueSk6c3RyaW5nfFVpbnQ4QXJyYXl8bnVsbCB7CisgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIhLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCA0KTsKKyAgcmV0dXJuIG9mZnNldCA/IHRoaXMuYmIhLl9fc3RyaW5nKHRoaXMuYmJfcG9zICsgb2Zmc2V0LCBvcHRpb25hbEVuY29kaW5nKSA6IG51bGw7Cit9CisKK3ZhbCgpOmJpZ2ludCB7CisgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIhLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCA2KTsKKyAgcmV0dXJuIG9mZnNldCA/IHRoaXMuYmIhLnJlYWRJbnQ2NCh0aGlzLmJiX3BvcyArIG9mZnNldCkgOiBCaWdJbnQoJzAnKTsKK30KKworY291bnQoKTpudW1iZXIgeworICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiIS5fX29mZnNldCh0aGlzLmJiX3BvcywgOCk7CisgIHJldHVybiBvZmZzZXQgPyB0aGlzLmJiIS5yZWFkVWludDE2KHRoaXMuYmJfcG9zICsgb2Zmc2V0KSA6IDA7Cit9CisKK3N0YXRpYyBzdGFydFN0YXQoYnVpbGRlcjpmbGF0YnVmZmVycy5CdWlsZGVyKSB7CisgIGJ1aWxkZXIuc3RhcnRPYmplY3QoMyk7Cit9CisKK3N0YXRpYyBhZGRJZChidWlsZGVyOmZsYXRidWZmZXJzLkJ1aWxkZXIsIGlkT2Zmc2V0OmZsYXRidWZmZXJzLk9mZnNldCkgeworICBidWlsZGVyLmFkZEZpZWxkT2Zmc2V0KDAsIGlkT2Zmc2V0LCAwKTsKK30KKworc3RhdGljIGFkZFZhbChidWlsZGVyOmZsYXRidWZmZXJzLkJ1aWxkZXIsIHZhbDpiaWdpbnQpIHsKKyAgYnVpbGRlci5hZGRGaWVsZEludDY0KDEsIHZhbCwgQmlnSW50KCcwJykpOworfQorCitzdGF0aWMgYWRkQ291bnQoYnVpbGRlcjpmbGF0YnVmZmVycy5CdWlsZGVyLCBjb3VudDpudW1iZXIpIHsKKyAgYnVpbGRlci5hZGRGaWVsZEludDE2KDIsIGNvdW50LCAwKTsKK30KKworc3RhdGljIGVuZFN0YXQoYnVpbGRlcjpmbGF0YnVmZmVycy5CdWlsZGVyKTpmbGF0YnVmZmVycy5PZmZzZXQgeworICBjb25zdCBvZmZzZXQgPSBidWlsZGVyLmVuZE9iamVjdCgpOworICByZXR1cm4gb2Zmc2V0OworfQorCitzdGF0aWMgY3JlYXRlU3RhdChidWlsZGVyOmZsYXRidWZmZXJzLkJ1aWxkZXIsIGlkT2Zmc2V0OmZsYXRidWZmZXJzLk9mZnNldCwgdmFsOmJpZ2ludCwgY291bnQ6bnVtYmVyKTpmbGF0YnVmZmVycy5PZmZzZXQgeworICBNeUdhbWVfRXhhbXBsZV9TdGF0LnN0YXJ0U3RhdChidWlsZGVyKTsKKyAgTXlHYW1lX0V4YW1wbGVfU3RhdC5hZGRJZChidWlsZGVyLCBpZE9mZnNldCk7CisgIE15R2FtZV9FeGFtcGxlX1N0YXQuYWRkVmFsKGJ1aWxkZXIsIHZhbCk7CisgIE15R2FtZV9FeGFtcGxlX1N0YXQuYWRkQ291bnQoYnVpbGRlciwgY291bnQpOworICByZXR1cm4gTXlHYW1lX0V4YW1wbGVfU3RhdC5lbmRTdGF0KGJ1aWxkZXIpOworfQorCitzZXJpYWxpemUoKTpVaW50OEFycmF5IHsKKyAgcmV0dXJuIHRoaXMuYmIhLmJ5dGVzKCk7Cit9CisKK3N0YXRpYyBkZXNlcmlhbGl6ZShidWZmZXI6IFVpbnQ4QXJyYXkpOlN0YXQgeworICByZXR1cm4gTXlHYW1lX0V4YW1wbGVfU3RhdC5nZXRSb290QXNTdGF0KG5ldyBmbGF0YnVmZmVycy5CeXRlQnVmZmVyKGJ1ZmZlcikpCit9Cit9CisKK2V4cG9ydCBjbGFzcyBNeUdhbWVfRXhhbXBsZV9SZWZlcnJhYmxlIHsKKyAgYmI6IGZsYXRidWZmZXJzLkJ5dGVCdWZmZXJ8bnVsbCA9IG51bGw7CisgIGJiX3BvcyA9IDA7CisgIF9faW5pdChpOm51bWJlciwgYmI6ZmxhdGJ1ZmZlcnMuQnl0ZUJ1ZmZlcik6TXlHYW1lX0V4YW1wbGVfUmVmZXJyYWJsZSB7CisgIHRoaXMuYmJfcG9zID0gaTsKKyAgdGhpcy5iYiA9IGJiOworICByZXR1cm4gdGhpczsKK30KKworc3RhdGljIGdldFJvb3RBc1JlZmVycmFibGUoYmI6ZmxhdGJ1ZmZlcnMuQnl0ZUJ1ZmZlciwgb2JqPzpNeUdhbWVfRXhhbXBsZV9SZWZlcnJhYmxlKTpNeUdhbWVfRXhhbXBsZV9SZWZlcnJhYmxlIHsKKyAgcmV0dXJuIChvYmogfHwgbmV3IE15R2FtZV9FeGFtcGxlX1JlZmVycmFibGUoKSkuX19pbml0KGJiLnJlYWRJbnQzMihiYi5wb3NpdGlvbigpKSArIGJiLnBvc2l0aW9uKCksIGJiKTsKK30KKworc3RhdGljIGdldFNpemVQcmVmaXhlZFJvb3RBc1JlZmVycmFibGUoYmI6ZmxhdGJ1ZmZlcnMuQnl0ZUJ1ZmZlciwgb2JqPzpNeUdhbWVfRXhhbXBsZV9SZWZlcnJhYmxlKTpNeUdhbWVfRXhhbXBsZV9SZWZlcnJhYmxlIHsKKyAgYmIuc2V0UG9zaXRpb24oYmIucG9zaXRpb24oKSArIGZsYXRidWZmZXJzLlNJWkVfUFJFRklYX0xFTkdUSCk7CisgIHJldHVybiAob2JqIHx8IG5ldyBNeUdhbWVfRXhhbXBsZV9SZWZlcnJhYmxlKCkpLl9faW5pdChiYi5yZWFkSW50MzIoYmIucG9zaXRpb24oKSkgKyBiYi5wb3NpdGlvbigpLCBiYik7Cit9CisKK2lkKCk6YmlnaW50IHsKKyAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYiEuX19vZmZzZXQodGhpcy5iYl9wb3MsIDQpOworICByZXR1cm4gb2Zmc2V0ID8gdGhpcy5iYiEucmVhZFVpbnQ2NCh0aGlzLmJiX3BvcyArIG9mZnNldCkgOiBCaWdJbnQoJzAnKTsKK30KKworc3RhdGljIHN0YXJ0UmVmZXJyYWJsZShidWlsZGVyOmZsYXRidWZmZXJzLkJ1aWxkZXIpIHsKKyAgYnVpbGRlci5zdGFydE9iamVjdCgxKTsKK30KKworc3RhdGljIGFkZElkKGJ1aWxkZXI6ZmxhdGJ1ZmZlcnMuQnVpbGRlciwgaWQ6YmlnaW50KSB7CisgIGJ1aWxkZXIuYWRkRmllbGRJbnQ2NCgwLCBpZCwgQmlnSW50KCcwJykpOworfQorCitzdGF0aWMgZW5kUmVmZXJyYWJsZShidWlsZGVyOmZsYXRidWZmZXJzLkJ1aWxkZXIpOmZsYXRidWZmZXJzLk9mZnNldCB7CisgIGNvbnN0IG9mZnNldCA9IGJ1aWxkZXIuZW5kT2JqZWN0KCk7CisgIHJldHVybiBvZmZzZXQ7Cit9CisKK3N0YXRpYyBjcmVhdGVSZWZlcnJhYmxlKGJ1aWxkZXI6ZmxhdGJ1ZmZlcnMuQnVpbGRlciwgaWQ6YmlnaW50KTpmbGF0YnVmZmVycy5PZmZzZXQgeworICBNeUdhbWVfRXhhbXBsZV9SZWZlcnJhYmxlLnN0YXJ0UmVmZXJyYWJsZShidWlsZGVyKTsKKyAgTXlHYW1lX0V4YW1wbGVfUmVmZXJyYWJsZS5hZGRJZChidWlsZGVyLCBpZCk7CisgIHJldHVybiBNeUdhbWVfRXhhbXBsZV9SZWZlcnJhYmxlLmVuZFJlZmVycmFibGUoYnVpbGRlcik7Cit9CisKK3NlcmlhbGl6ZSgpOlVpbnQ4QXJyYXkgeworICByZXR1cm4gdGhpcy5iYiEuYnl0ZXMoKTsKK30KKworc3RhdGljIGRlc2VyaWFsaXplKGJ1ZmZlcjogVWludDhBcnJheSk6UmVmZXJyYWJsZSB7CisgIHJldHVybiBNeUdhbWVfRXhhbXBsZV9SZWZlcnJhYmxlLmdldFJvb3RBc1JlZmVycmFibGUobmV3IGZsYXRidWZmZXJzLkJ5dGVCdWZmZXIoYnVmZmVyKSkKK30KK30KKworLyoqCisgKiBhbiBleGFtcGxlIGRvY3VtZW50YXRpb24gY29tbWVudDogIm1vbnN0ZXIgb2JqZWN0IgorICovCitleHBvcnQgY2xhc3MgTXlHYW1lX0V4YW1wbGVfTW9uc3RlciB7CisgIGJiOiBmbGF0YnVmZmVycy5CeXRlQnVmZmVyfG51bGwgPSBudWxsOworICBiYl9wb3MgPSAwOworICBfX2luaXQoaTpudW1iZXIsIGJiOmZsYXRidWZmZXJzLkJ5dGVCdWZmZXIpOk15R2FtZV9FeGFtcGxlX01vbnN0ZXIgeworICB0aGlzLmJiX3BvcyA9IGk7CisgIHRoaXMuYmIgPSBiYjsKKyAgcmV0dXJuIHRoaXM7Cit9CisKK3N0YXRpYyBnZXRSb290QXNNb25zdGVyKGJiOmZsYXRidWZmZXJzLkJ5dGVCdWZmZXIsIG9iaj86TXlHYW1lX0V4YW1wbGVfTW9uc3Rlcik6TXlHYW1lX0V4YW1wbGVfTW9uc3RlciB7CisgIHJldHVybiAob2JqIHx8IG5ldyBNeUdhbWVfRXhhbXBsZV9Nb25zdGVyKCkpLl9faW5pdChiYi5yZWFkSW50MzIoYmIucG9zaXRpb24oKSkgKyBiYi5wb3NpdGlvbigpLCBiYik7Cit9CisKK3N0YXRpYyBnZXRTaXplUHJlZml4ZWRSb290QXNNb25zdGVyKGJiOmZsYXRidWZmZXJzLkJ5dGVCdWZmZXIsIG9iaj86TXlHYW1lX0V4YW1wbGVfTW9uc3Rlcik6TXlHYW1lX0V4YW1wbGVfTW9uc3RlciB7CisgIGJiLnNldFBvc2l0aW9uKGJiLnBvc2l0aW9uKCkgKyBmbGF0YnVmZmVycy5TSVpFX1BSRUZJWF9MRU5HVEgpOworICByZXR1cm4gKG9iaiB8fCBuZXcgTXlHYW1lX0V4YW1wbGVfTW9uc3RlcigpKS5fX2luaXQoYmIucmVhZEludDMyKGJiLnBvc2l0aW9uKCkpICsgYmIucG9zaXRpb24oKSwgYmIpOworfQorCitzdGF0aWMgYnVmZmVySGFzSWRlbnRpZmllcihiYjpmbGF0YnVmZmVycy5CeXRlQnVmZmVyKTpib29sZWFuIHsKKyAgcmV0dXJuIGJiLl9faGFzX2lkZW50aWZpZXIoJ01PTlMnKTsKK30KKworcG9zKG9iaj86TXlHYW1lX0V4YW1wbGVfVmVjMyk6TXlHYW1lX0V4YW1wbGVfVmVjM3xudWxsIHsKKyAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYiEuX19vZmZzZXQodGhpcy5iYl9wb3MsIDQpOworICByZXR1cm4gb2Zmc2V0ID8gKG9iaiB8fCBuZXcgTXlHYW1lX0V4YW1wbGVfVmVjMygpKS5fX2luaXQodGhpcy5iYl9wb3MgKyBvZmZzZXQsIHRoaXMuYmIhKSA6IG51bGw7Cit9CisKK21hbmEoKTpudW1iZXIgeworICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiIS5fX29mZnNldCh0aGlzLmJiX3BvcywgNik7CisgIHJldHVybiBvZmZzZXQgPyB0aGlzLmJiIS5yZWFkSW50MTYodGhpcy5iYl9wb3MgKyBvZmZzZXQpIDogMTUwOworfQorCitocCgpOm51bWJlciB7CisgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIhLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCA4KTsKKyAgcmV0dXJuIG9mZnNldCA/IHRoaXMuYmIhLnJlYWRJbnQxNih0aGlzLmJiX3BvcyArIG9mZnNldCkgOiAxMDA7Cit9CisKK25hbWUoKTpzdHJpbmd8bnVsbAorbmFtZShvcHRpb25hbEVuY29kaW5nOmZsYXRidWZmZXJzLkVuY29kaW5nKTpzdHJpbmd8VWludDhBcnJheXxudWxsCituYW1lKG9wdGlvbmFsRW5jb2Rpbmc/OmFueSk6c3RyaW5nfFVpbnQ4QXJyYXl8bnVsbCB7CisgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIhLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCAxMCk7CisgIHJldHVybiBvZmZzZXQgPyB0aGlzLmJiIS5fX3N0cmluZyh0aGlzLmJiX3BvcyArIG9mZnNldCwgb3B0aW9uYWxFbmNvZGluZykgOiBudWxsOworfQorCitpbnZlbnRvcnkoaW5kZXg6IG51bWJlcik6bnVtYmVyfG51bGwgeworICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiIS5fX29mZnNldCh0aGlzLmJiX3BvcywgMTQpOworICByZXR1cm4gb2Zmc2V0ID8gdGhpcy5iYiEucmVhZFVpbnQ4KHRoaXMuYmIhLl9fdmVjdG9yKHRoaXMuYmJfcG9zICsgb2Zmc2V0KSArIGluZGV4KSA6IDA7Cit9CisKK2ludmVudG9yeUxlbmd0aCgpOm51bWJlciB7CisgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIhLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCAxNCk7CisgIHJldHVybiBvZmZzZXQgPyB0aGlzLmJiIS5fX3ZlY3Rvcl9sZW4odGhpcy5iYl9wb3MgKyBvZmZzZXQpIDogMDsKK30KKworaW52ZW50b3J5QXJyYXkoKTpVaW50OEFycmF5fG51bGwgeworICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiIS5fX29mZnNldCh0aGlzLmJiX3BvcywgMTQpOworICByZXR1cm4gb2Zmc2V0ID8gbmV3IFVpbnQ4QXJyYXkodGhpcy5iYiEuYnl0ZXMoKS5idWZmZXIsIHRoaXMuYmIhLmJ5dGVzKCkuYnl0ZU9mZnNldCArIHRoaXMuYmIhLl9fdmVjdG9yKHRoaXMuYmJfcG9zICsgb2Zmc2V0KSwgdGhpcy5iYiEuX192ZWN0b3JfbGVuKHRoaXMuYmJfcG9zICsgb2Zmc2V0KSkgOiBudWxsOworfQorCitjb2xvcigpOk15R2FtZV9FeGFtcGxlX0NvbG9yIHsKKyAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYiEuX19vZmZzZXQodGhpcy5iYl9wb3MsIDE2KTsKKyAgcmV0dXJuIG9mZnNldCA/IHRoaXMuYmIhLnJlYWRVaW50OCh0aGlzLmJiX3BvcyArIG9mZnNldCkgOiBNeUdhbWVfRXhhbXBsZV9Db2xvci5CbHVlOworfQorCit0ZXN0VHlwZSgpOk15R2FtZV9FeGFtcGxlX0FueSB7CisgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIhLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCAxOCk7CisgIHJldHVybiBvZmZzZXQgPyB0aGlzLmJiIS5yZWFkVWludDgodGhpcy5iYl9wb3MgKyBvZmZzZXQpIDogTXlHYW1lX0V4YW1wbGVfQW55Lk5PTkU7Cit9CisKK3Rlc3Q8VCBleHRlbmRzIGZsYXRidWZmZXJzLlRhYmxlPihvYmo6YW55KTphbnl8bnVsbCB7CisgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIhLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCAyMCk7CisgIHJldHVybiBvZmZzZXQgPyB0aGlzLmJiIS5fX3VuaW9uKG9iaiwgdGhpcy5iYl9wb3MgKyBvZmZzZXQpIDogbnVsbDsKK30KKwordGVzdDQoaW5kZXg6IG51bWJlciwgb2JqPzpNeUdhbWVfRXhhbXBsZV9UZXN0KTpNeUdhbWVfRXhhbXBsZV9UZXN0fG51bGwgeworICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiIS5fX29mZnNldCh0aGlzLmJiX3BvcywgMjIpOworICByZXR1cm4gb2Zmc2V0ID8gKG9iaiB8fCBuZXcgTXlHYW1lX0V4YW1wbGVfVGVzdCgpKS5fX2luaXQodGhpcy5iYiEuX192ZWN0b3IodGhpcy5iYl9wb3MgKyBvZmZzZXQpICsgaW5kZXggKiA0LCB0aGlzLmJiISkgOiBudWxsOworfQorCit0ZXN0NExlbmd0aCgpOm51bWJlciB7CisgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIhLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCAyMik7CisgIHJldHVybiBvZmZzZXQgPyB0aGlzLmJiIS5fX3ZlY3Rvcl9sZW4odGhpcy5iYl9wb3MgKyBvZmZzZXQpIDogMDsKK30KKwordGVzdGFycmF5b2ZzdHJpbmcoaW5kZXg6IG51bWJlcik6c3RyaW5nCit0ZXN0YXJyYXlvZnN0cmluZyhpbmRleDogbnVtYmVyLG9wdGlvbmFsRW5jb2Rpbmc6ZmxhdGJ1ZmZlcnMuRW5jb2RpbmcpOnN0cmluZ3xVaW50OEFycmF5Cit0ZXN0YXJyYXlvZnN0cmluZyhpbmRleDogbnVtYmVyLG9wdGlvbmFsRW5jb2Rpbmc/OmFueSk6c3RyaW5nfFVpbnQ4QXJyYXl8bnVsbCB7CisgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIhLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCAyNCk7CisgIHJldHVybiBvZmZzZXQgPyB0aGlzLmJiIS5fX3N0cmluZyh0aGlzLmJiIS5fX3ZlY3Rvcih0aGlzLmJiX3BvcyArIG9mZnNldCkgKyBpbmRleCAqIDQsIG9wdGlvbmFsRW5jb2RpbmcpIDogbnVsbDsKK30KKwordGVzdGFycmF5b2ZzdHJpbmdMZW5ndGgoKTpudW1iZXIgeworICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiIS5fX29mZnNldCh0aGlzLmJiX3BvcywgMjQpOworICByZXR1cm4gb2Zmc2V0ID8gdGhpcy5iYiEuX192ZWN0b3JfbGVuKHRoaXMuYmJfcG9zICsgb2Zmc2V0KSA6IDA7Cit9CisKKy8qKgorICogYW4gZXhhbXBsZSBkb2N1bWVudGF0aW9uIGNvbW1lbnQ6IHRoaXMgd2lsbCBlbmQgdXAgaW4gdGhlIGdlbmVyYXRlZCBjb2RlCisgKiBtdWx0aWxpbmUgdG9vCisgKi8KK3Rlc3RhcnJheW9mdGFibGVzKGluZGV4OiBudW1iZXIsIG9iaj86TXlHYW1lX0V4YW1wbGVfTW9uc3Rlcik6TXlHYW1lX0V4YW1wbGVfTW9uc3RlcnxudWxsIHsKKyAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYiEuX19vZmZzZXQodGhpcy5iYl9wb3MsIDI2KTsKKyAgcmV0dXJuIG9mZnNldCA/IChvYmogfHwgbmV3IE15R2FtZV9FeGFtcGxlX01vbnN0ZXIoKSkuX19pbml0KHRoaXMuYmIhLl9faW5kaXJlY3QodGhpcy5iYiEuX192ZWN0b3IodGhpcy5iYl9wb3MgKyBvZmZzZXQpICsgaW5kZXggKiA0KSwgdGhpcy5iYiEpIDogbnVsbDsKK30KKwordGVzdGFycmF5b2Z0YWJsZXNMZW5ndGgoKTpudW1iZXIgeworICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiIS5fX29mZnNldCh0aGlzLmJiX3BvcywgMjYpOworICByZXR1cm4gb2Zmc2V0ID8gdGhpcy5iYiEuX192ZWN0b3JfbGVuKHRoaXMuYmJfcG9zICsgb2Zmc2V0KSA6IDA7Cit9CisKK2VuZW15KG9iaj86TXlHYW1lX0V4YW1wbGVfTW9uc3Rlcik6TXlHYW1lX0V4YW1wbGVfTW9uc3RlcnxudWxsIHsKKyAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYiEuX19vZmZzZXQodGhpcy5iYl9wb3MsIDI4KTsKKyAgcmV0dXJuIG9mZnNldCA/IChvYmogfHwgbmV3IE15R2FtZV9FeGFtcGxlX01vbnN0ZXIoKSkuX19pbml0KHRoaXMuYmIhLl9faW5kaXJlY3QodGhpcy5iYl9wb3MgKyBvZmZzZXQpLCB0aGlzLmJiISkgOiBudWxsOworfQorCit0ZXN0bmVzdGVkZmxhdGJ1ZmZlcihpbmRleDogbnVtYmVyKTpudW1iZXJ8bnVsbCB7CisgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIhLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCAzMCk7CisgIHJldHVybiBvZmZzZXQgPyB0aGlzLmJiIS5yZWFkVWludDgodGhpcy5iYiEuX192ZWN0b3IodGhpcy5iYl9wb3MgKyBvZmZzZXQpICsgaW5kZXgpIDogMDsKK30KKwordGVzdG5lc3RlZGZsYXRidWZmZXJMZW5ndGgoKTpudW1iZXIgeworICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiIS5fX29mZnNldCh0aGlzLmJiX3BvcywgMzApOworICByZXR1cm4gb2Zmc2V0ID8gdGhpcy5iYiEuX192ZWN0b3JfbGVuKHRoaXMuYmJfcG9zICsgb2Zmc2V0KSA6IDA7Cit9CisKK3Rlc3RuZXN0ZWRmbGF0YnVmZmVyQXJyYXkoKTpVaW50OEFycmF5fG51bGwgeworICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiIS5fX29mZnNldCh0aGlzLmJiX3BvcywgMzApOworICByZXR1cm4gb2Zmc2V0ID8gbmV3IFVpbnQ4QXJyYXkodGhpcy5iYiEuYnl0ZXMoKS5idWZmZXIsIHRoaXMuYmIhLmJ5dGVzKCkuYnl0ZU9mZnNldCArIHRoaXMuYmIhLl9fdmVjdG9yKHRoaXMuYmJfcG9zICsgb2Zmc2V0KSwgdGhpcy5iYiEuX192ZWN0b3JfbGVuKHRoaXMuYmJfcG9zICsgb2Zmc2V0KSkgOiBudWxsOworfQorCit0ZXN0ZW1wdHkob2JqPzpNeUdhbWVfRXhhbXBsZV9TdGF0KTpNeUdhbWVfRXhhbXBsZV9TdGF0fG51bGwgeworICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiIS5fX29mZnNldCh0aGlzLmJiX3BvcywgMzIpOworICByZXR1cm4gb2Zmc2V0ID8gKG9iaiB8fCBuZXcgTXlHYW1lX0V4YW1wbGVfU3RhdCgpKS5fX2luaXQodGhpcy5iYiEuX19pbmRpcmVjdCh0aGlzLmJiX3BvcyArIG9mZnNldCksIHRoaXMuYmIhKSA6IG51bGw7Cit9CisKK3Rlc3Rib29sKCk6Ym9vbGVhbiB7CisgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIhLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCAzNCk7CisgIHJldHVybiBvZmZzZXQgPyAhIXRoaXMuYmIhLnJlYWRJbnQ4KHRoaXMuYmJfcG9zICsgb2Zmc2V0KSA6IGZhbHNlOworfQorCit0ZXN0aGFzaHMzMkZudjEoKTpudW1iZXIgeworICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiIS5fX29mZnNldCh0aGlzLmJiX3BvcywgMzYpOworICByZXR1cm4gb2Zmc2V0ID8gdGhpcy5iYiEucmVhZEludDMyKHRoaXMuYmJfcG9zICsgb2Zmc2V0KSA6IDA7Cit9CisKK3Rlc3RoYXNodTMyRm52MSgpOm51bWJlciB7CisgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIhLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCAzOCk7CisgIHJldHVybiBvZmZzZXQgPyB0aGlzLmJiIS5yZWFkVWludDMyKHRoaXMuYmJfcG9zICsgb2Zmc2V0KSA6IDA7Cit9CisKK3Rlc3RoYXNoczY0Rm52MSgpOmJpZ2ludCB7CisgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIhLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCA0MCk7CisgIHJldHVybiBvZmZzZXQgPyB0aGlzLmJiIS5yZWFkSW50NjQodGhpcy5iYl9wb3MgKyBvZmZzZXQpIDogQmlnSW50KCcwJyk7Cit9CisKK3Rlc3RoYXNodTY0Rm52MSgpOmJpZ2ludCB7CisgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIhLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCA0Mik7CisgIHJldHVybiBvZmZzZXQgPyB0aGlzLmJiIS5yZWFkVWludDY0KHRoaXMuYmJfcG9zICsgb2Zmc2V0KSA6IEJpZ0ludCgnMCcpOworfQorCit0ZXN0aGFzaHMzMkZudjFhKCk6bnVtYmVyIHsKKyAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYiEuX19vZmZzZXQodGhpcy5iYl9wb3MsIDQ0KTsKKyAgcmV0dXJuIG9mZnNldCA/IHRoaXMuYmIhLnJlYWRJbnQzMih0aGlzLmJiX3BvcyArIG9mZnNldCkgOiAwOworfQorCit0ZXN0aGFzaHUzMkZudjFhKCk6bnVtYmVyIHsKKyAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYiEuX19vZmZzZXQodGhpcy5iYl9wb3MsIDQ2KTsKKyAgcmV0dXJuIG9mZnNldCA/IHRoaXMuYmIhLnJlYWRVaW50MzIodGhpcy5iYl9wb3MgKyBvZmZzZXQpIDogMDsKK30KKwordGVzdGhhc2hzNjRGbnYxYSgpOmJpZ2ludCB7CisgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIhLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCA0OCk7CisgIHJldHVybiBvZmZzZXQgPyB0aGlzLmJiIS5yZWFkSW50NjQodGhpcy5iYl9wb3MgKyBvZmZzZXQpIDogQmlnSW50KCcwJyk7Cit9CisKK3Rlc3RoYXNodTY0Rm52MWEoKTpiaWdpbnQgeworICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiIS5fX29mZnNldCh0aGlzLmJiX3BvcywgNTApOworICByZXR1cm4gb2Zmc2V0ID8gdGhpcy5iYiEucmVhZFVpbnQ2NCh0aGlzLmJiX3BvcyArIG9mZnNldCkgOiBCaWdJbnQoJzAnKTsKK30KKwordGVzdGFycmF5b2Zib29scyhpbmRleDogbnVtYmVyKTpib29sZWFufG51bGwgeworICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiIS5fX29mZnNldCh0aGlzLmJiX3BvcywgNTIpOworICByZXR1cm4gb2Zmc2V0ID8gISF0aGlzLmJiIS5yZWFkSW50OCh0aGlzLmJiIS5fX3ZlY3Rvcih0aGlzLmJiX3BvcyArIG9mZnNldCkgKyBpbmRleCkgOiBmYWxzZTsKK30KKwordGVzdGFycmF5b2Zib29sc0xlbmd0aCgpOm51bWJlciB7CisgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIhLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCA1Mik7CisgIHJldHVybiBvZmZzZXQgPyB0aGlzLmJiIS5fX3ZlY3Rvcl9sZW4odGhpcy5iYl9wb3MgKyBvZmZzZXQpIDogMDsKK30KKwordGVzdGFycmF5b2Zib29sc0FycmF5KCk6SW50OEFycmF5fG51bGwgeworICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiIS5fX29mZnNldCh0aGlzLmJiX3BvcywgNTIpOworICByZXR1cm4gb2Zmc2V0ID8gbmV3IEludDhBcnJheSh0aGlzLmJiIS5ieXRlcygpLmJ1ZmZlciwgdGhpcy5iYiEuYnl0ZXMoKS5ieXRlT2Zmc2V0ICsgdGhpcy5iYiEuX192ZWN0b3IodGhpcy5iYl9wb3MgKyBvZmZzZXQpLCB0aGlzLmJiIS5fX3ZlY3Rvcl9sZW4odGhpcy5iYl9wb3MgKyBvZmZzZXQpKSA6IG51bGw7Cit9CisKK3Rlc3RmKCk6bnVtYmVyIHsKKyAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYiEuX19vZmZzZXQodGhpcy5iYl9wb3MsIDU0KTsKKyAgcmV0dXJuIG9mZnNldCA/IHRoaXMuYmIhLnJlYWRGbG9hdDMyKHRoaXMuYmJfcG9zICsgb2Zmc2V0KSA6IDMuMTQxNTk7Cit9CisKK3Rlc3RmMigpOm51bWJlciB7CisgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIhLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCA1Nik7CisgIHJldHVybiBvZmZzZXQgPyB0aGlzLmJiIS5yZWFkRmxvYXQzMih0aGlzLmJiX3BvcyArIG9mZnNldCkgOiAzLjA7Cit9CisKK3Rlc3RmMygpOm51bWJlciB7CisgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIhLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCA1OCk7CisgIHJldHVybiBvZmZzZXQgPyB0aGlzLmJiIS5yZWFkRmxvYXQzMih0aGlzLmJiX3BvcyArIG9mZnNldCkgOiAwLjA7Cit9CisKK3Rlc3RhcnJheW9mc3RyaW5nMihpbmRleDogbnVtYmVyKTpzdHJpbmcKK3Rlc3RhcnJheW9mc3RyaW5nMihpbmRleDogbnVtYmVyLG9wdGlvbmFsRW5jb2Rpbmc6ZmxhdGJ1ZmZlcnMuRW5jb2RpbmcpOnN0cmluZ3xVaW50OEFycmF5Cit0ZXN0YXJyYXlvZnN0cmluZzIoaW5kZXg6IG51bWJlcixvcHRpb25hbEVuY29kaW5nPzphbnkpOnN0cmluZ3xVaW50OEFycmF5fG51bGwgeworICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiIS5fX29mZnNldCh0aGlzLmJiX3BvcywgNjApOworICByZXR1cm4gb2Zmc2V0ID8gdGhpcy5iYiEuX19zdHJpbmcodGhpcy5iYiEuX192ZWN0b3IodGhpcy5iYl9wb3MgKyBvZmZzZXQpICsgaW5kZXggKiA0LCBvcHRpb25hbEVuY29kaW5nKSA6IG51bGw7Cit9CisKK3Rlc3RhcnJheW9mc3RyaW5nMkxlbmd0aCgpOm51bWJlciB7CisgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIhLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCA2MCk7CisgIHJldHVybiBvZmZzZXQgPyB0aGlzLmJiIS5fX3ZlY3Rvcl9sZW4odGhpcy5iYl9wb3MgKyBvZmZzZXQpIDogMDsKK30KKwordGVzdGFycmF5b2Zzb3J0ZWRzdHJ1Y3QoaW5kZXg6IG51bWJlciwgb2JqPzpNeUdhbWVfRXhhbXBsZV9BYmlsaXR5KTpNeUdhbWVfRXhhbXBsZV9BYmlsaXR5fG51bGwgeworICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiIS5fX29mZnNldCh0aGlzLmJiX3BvcywgNjIpOworICByZXR1cm4gb2Zmc2V0ID8gKG9iaiB8fCBuZXcgTXlHYW1lX0V4YW1wbGVfQWJpbGl0eSgpKS5fX2luaXQodGhpcy5iYiEuX192ZWN0b3IodGhpcy5iYl9wb3MgKyBvZmZzZXQpICsgaW5kZXggKiA4LCB0aGlzLmJiISkgOiBudWxsOworfQorCit0ZXN0YXJyYXlvZnNvcnRlZHN0cnVjdExlbmd0aCgpOm51bWJlciB7CisgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIhLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCA2Mik7CisgIHJldHVybiBvZmZzZXQgPyB0aGlzLmJiIS5fX3ZlY3Rvcl9sZW4odGhpcy5iYl9wb3MgKyBvZmZzZXQpIDogMDsKK30KKworZmxleChpbmRleDogbnVtYmVyKTpudW1iZXJ8bnVsbCB7CisgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIhLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCA2NCk7CisgIHJldHVybiBvZmZzZXQgPyB0aGlzLmJiIS5yZWFkVWludDgodGhpcy5iYiEuX192ZWN0b3IodGhpcy5iYl9wb3MgKyBvZmZzZXQpICsgaW5kZXgpIDogMDsKK30KKworZmxleExlbmd0aCgpOm51bWJlciB7CisgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIhLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCA2NCk7CisgIHJldHVybiBvZmZzZXQgPyB0aGlzLmJiIS5fX3ZlY3Rvcl9sZW4odGhpcy5iYl9wb3MgKyBvZmZzZXQpIDogMDsKK30KKworZmxleEFycmF5KCk6VWludDhBcnJheXxudWxsIHsKKyAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYiEuX19vZmZzZXQodGhpcy5iYl9wb3MsIDY0KTsKKyAgcmV0dXJuIG9mZnNldCA/IG5ldyBVaW50OEFycmF5KHRoaXMuYmIhLmJ5dGVzKCkuYnVmZmVyLCB0aGlzLmJiIS5ieXRlcygpLmJ5dGVPZmZzZXQgKyB0aGlzLmJiIS5fX3ZlY3Rvcih0aGlzLmJiX3BvcyArIG9mZnNldCksIHRoaXMuYmIhLl9fdmVjdG9yX2xlbih0aGlzLmJiX3BvcyArIG9mZnNldCkpIDogbnVsbDsKK30KKwordGVzdDUoaW5kZXg6IG51bWJlciwgb2JqPzpNeUdhbWVfRXhhbXBsZV9UZXN0KTpNeUdhbWVfRXhhbXBsZV9UZXN0fG51bGwgeworICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiIS5fX29mZnNldCh0aGlzLmJiX3BvcywgNjYpOworICByZXR1cm4gb2Zmc2V0ID8gKG9iaiB8fCBuZXcgTXlHYW1lX0V4YW1wbGVfVGVzdCgpKS5fX2luaXQodGhpcy5iYiEuX192ZWN0b3IodGhpcy5iYl9wb3MgKyBvZmZzZXQpICsgaW5kZXggKiA0LCB0aGlzLmJiISkgOiBudWxsOworfQorCit0ZXN0NUxlbmd0aCgpOm51bWJlciB7CisgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIhLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCA2Nik7CisgIHJldHVybiBvZmZzZXQgPyB0aGlzLmJiIS5fX3ZlY3Rvcl9sZW4odGhpcy5iYl9wb3MgKyBvZmZzZXQpIDogMDsKK30KKwordmVjdG9yT2ZMb25ncyhpbmRleDogbnVtYmVyKTpiaWdpbnR8bnVsbCB7CisgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIhLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCA2OCk7CisgIHJldHVybiBvZmZzZXQgPyB0aGlzLmJiIS5yZWFkSW50NjQodGhpcy5iYiEuX192ZWN0b3IodGhpcy5iYl9wb3MgKyBvZmZzZXQpICsgaW5kZXggKiA4KSA6IEJpZ0ludCgwKTsKK30KKwordmVjdG9yT2ZMb25nc0xlbmd0aCgpOm51bWJlciB7CisgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIhLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCA2OCk7CisgIHJldHVybiBvZmZzZXQgPyB0aGlzLmJiIS5fX3ZlY3Rvcl9sZW4odGhpcy5iYl9wb3MgKyBvZmZzZXQpIDogMDsKK30KKwordmVjdG9yT2ZEb3VibGVzKGluZGV4OiBudW1iZXIpOm51bWJlcnxudWxsIHsKKyAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYiEuX19vZmZzZXQodGhpcy5iYl9wb3MsIDcwKTsKKyAgcmV0dXJuIG9mZnNldCA/IHRoaXMuYmIhLnJlYWRGbG9hdDY0KHRoaXMuYmIhLl9fdmVjdG9yKHRoaXMuYmJfcG9zICsgb2Zmc2V0KSArIGluZGV4ICogOCkgOiAwOworfQorCit2ZWN0b3JPZkRvdWJsZXNMZW5ndGgoKTpudW1iZXIgeworICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiIS5fX29mZnNldCh0aGlzLmJiX3BvcywgNzApOworICByZXR1cm4gb2Zmc2V0ID8gdGhpcy5iYiEuX192ZWN0b3JfbGVuKHRoaXMuYmJfcG9zICsgb2Zmc2V0KSA6IDA7Cit9CisKK3ZlY3Rvck9mRG91Ymxlc0FycmF5KCk6RmxvYXQ2NEFycmF5fG51bGwgeworICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiIS5fX29mZnNldCh0aGlzLmJiX3BvcywgNzApOworICByZXR1cm4gb2Zmc2V0ID8gbmV3IEZsb2F0NjRBcnJheSh0aGlzLmJiIS5ieXRlcygpLmJ1ZmZlciwgdGhpcy5iYiEuYnl0ZXMoKS5ieXRlT2Zmc2V0ICsgdGhpcy5iYiEuX192ZWN0b3IodGhpcy5iYl9wb3MgKyBvZmZzZXQpLCB0aGlzLmJiIS5fX3ZlY3Rvcl9sZW4odGhpcy5iYl9wb3MgKyBvZmZzZXQpKSA6IG51bGw7Cit9CisKK3BhcmVudE5hbWVzcGFjZVRlc3Qob2JqPzpNeUdhbWVfSW5QYXJlbnROYW1lc3BhY2UpOk15R2FtZV9JblBhcmVudE5hbWVzcGFjZXxudWxsIHsKKyAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYiEuX19vZmZzZXQodGhpcy5iYl9wb3MsIDcyKTsKKyAgcmV0dXJuIG9mZnNldCA/IChvYmogfHwgbmV3IE15R2FtZV9JblBhcmVudE5hbWVzcGFjZSgpKS5fX2luaXQodGhpcy5iYiEuX19pbmRpcmVjdCh0aGlzLmJiX3BvcyArIG9mZnNldCksIHRoaXMuYmIhKSA6IG51bGw7Cit9CisKK3ZlY3Rvck9mUmVmZXJyYWJsZXMoaW5kZXg6IG51bWJlciwgb2JqPzpNeUdhbWVfRXhhbXBsZV9SZWZlcnJhYmxlKTpNeUdhbWVfRXhhbXBsZV9SZWZlcnJhYmxlfG51bGwgeworICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiIS5fX29mZnNldCh0aGlzLmJiX3BvcywgNzQpOworICByZXR1cm4gb2Zmc2V0ID8gKG9iaiB8fCBuZXcgTXlHYW1lX0V4YW1wbGVfUmVmZXJyYWJsZSgpKS5fX2luaXQodGhpcy5iYiEuX19pbmRpcmVjdCh0aGlzLmJiIS5fX3ZlY3Rvcih0aGlzLmJiX3BvcyArIG9mZnNldCkgKyBpbmRleCAqIDQpLCB0aGlzLmJiISkgOiBudWxsOworfQorCit2ZWN0b3JPZlJlZmVycmFibGVzTGVuZ3RoKCk6bnVtYmVyIHsKKyAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYiEuX19vZmZzZXQodGhpcy5iYl9wb3MsIDc0KTsKKyAgcmV0dXJuIG9mZnNldCA/IHRoaXMuYmIhLl9fdmVjdG9yX2xlbih0aGlzLmJiX3BvcyArIG9mZnNldCkgOiAwOworfQorCitzaW5nbGVXZWFrUmVmZXJlbmNlKCk6YmlnaW50IHsKKyAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYiEuX19vZmZzZXQodGhpcy5iYl9wb3MsIDc2KTsKKyAgcmV0dXJuIG9mZnNldCA/IHRoaXMuYmIhLnJlYWRVaW50NjQodGhpcy5iYl9wb3MgKyBvZmZzZXQpIDogQmlnSW50KCcwJyk7Cit9CisKK3ZlY3Rvck9mV2Vha1JlZmVyZW5jZXMoaW5kZXg6IG51bWJlcik6YmlnaW50fG51bGwgeworICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiIS5fX29mZnNldCh0aGlzLmJiX3BvcywgNzgpOworICByZXR1cm4gb2Zmc2V0ID8gdGhpcy5iYiEucmVhZFVpbnQ2NCh0aGlzLmJiIS5fX3ZlY3Rvcih0aGlzLmJiX3BvcyArIG9mZnNldCkgKyBpbmRleCAqIDgpIDogQmlnSW50KDApOworfQorCit2ZWN0b3JPZldlYWtSZWZlcmVuY2VzTGVuZ3RoKCk6bnVtYmVyIHsKKyAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYiEuX19vZmZzZXQodGhpcy5iYl9wb3MsIDc4KTsKKyAgcmV0dXJuIG9mZnNldCA/IHRoaXMuYmIhLl9fdmVjdG9yX2xlbih0aGlzLmJiX3BvcyArIG9mZnNldCkgOiAwOworfQorCit2ZWN0b3JPZlN0cm9uZ1JlZmVycmFibGVzKGluZGV4OiBudW1iZXIsIG9iaj86TXlHYW1lX0V4YW1wbGVfUmVmZXJyYWJsZSk6TXlHYW1lX0V4YW1wbGVfUmVmZXJyYWJsZXxudWxsIHsKKyAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYiEuX19vZmZzZXQodGhpcy5iYl9wb3MsIDgwKTsKKyAgcmV0dXJuIG9mZnNldCA/IChvYmogfHwgbmV3IE15R2FtZV9FeGFtcGxlX1JlZmVycmFibGUoKSkuX19pbml0KHRoaXMuYmIhLl9faW5kaXJlY3QodGhpcy5iYiEuX192ZWN0b3IodGhpcy5iYl9wb3MgKyBvZmZzZXQpICsgaW5kZXggKiA0KSwgdGhpcy5iYiEpIDogbnVsbDsKK30KKwordmVjdG9yT2ZTdHJvbmdSZWZlcnJhYmxlc0xlbmd0aCgpOm51bWJlciB7CisgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIhLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCA4MCk7CisgIHJldHVybiBvZmZzZXQgPyB0aGlzLmJiIS5fX3ZlY3Rvcl9sZW4odGhpcy5iYl9wb3MgKyBvZmZzZXQpIDogMDsKK30KKworY29Pd25pbmdSZWZlcmVuY2UoKTpiaWdpbnQgeworICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiIS5fX29mZnNldCh0aGlzLmJiX3BvcywgODIpOworICByZXR1cm4gb2Zmc2V0ID8gdGhpcy5iYiEucmVhZFVpbnQ2NCh0aGlzLmJiX3BvcyArIG9mZnNldCkgOiBCaWdJbnQoJzAnKTsKK30KKwordmVjdG9yT2ZDb093bmluZ1JlZmVyZW5jZXMoaW5kZXg6IG51bWJlcik6YmlnaW50fG51bGwgeworICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiIS5fX29mZnNldCh0aGlzLmJiX3BvcywgODQpOworICByZXR1cm4gb2Zmc2V0ID8gdGhpcy5iYiEucmVhZFVpbnQ2NCh0aGlzLmJiIS5fX3ZlY3Rvcih0aGlzLmJiX3BvcyArIG9mZnNldCkgKyBpbmRleCAqIDgpIDogQmlnSW50KDApOworfQorCit2ZWN0b3JPZkNvT3duaW5nUmVmZXJlbmNlc0xlbmd0aCgpOm51bWJlciB7CisgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIhLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCA4NCk7CisgIHJldHVybiBvZmZzZXQgPyB0aGlzLmJiIS5fX3ZlY3Rvcl9sZW4odGhpcy5iYl9wb3MgKyBvZmZzZXQpIDogMDsKK30KKworbm9uT3duaW5nUmVmZXJlbmNlKCk6YmlnaW50IHsKKyAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYiEuX19vZmZzZXQodGhpcy5iYl9wb3MsIDg2KTsKKyAgcmV0dXJuIG9mZnNldCA/IHRoaXMuYmIhLnJlYWRVaW50NjQodGhpcy5iYl9wb3MgKyBvZmZzZXQpIDogQmlnSW50KCcwJyk7Cit9CisKK3ZlY3Rvck9mTm9uT3duaW5nUmVmZXJlbmNlcyhpbmRleDogbnVtYmVyKTpiaWdpbnR8bnVsbCB7CisgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIhLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCA4OCk7CisgIHJldHVybiBvZmZzZXQgPyB0aGlzLmJiIS5yZWFkVWludDY0KHRoaXMuYmIhLl9fdmVjdG9yKHRoaXMuYmJfcG9zICsgb2Zmc2V0KSArIGluZGV4ICogOCkgOiBCaWdJbnQoMCk7Cit9CisKK3ZlY3Rvck9mTm9uT3duaW5nUmVmZXJlbmNlc0xlbmd0aCgpOm51bWJlciB7CisgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIhLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCA4OCk7CisgIHJldHVybiBvZmZzZXQgPyB0aGlzLmJiIS5fX3ZlY3Rvcl9sZW4odGhpcy5iYl9wb3MgKyBvZmZzZXQpIDogMDsKK30KKworYW55VW5pcXVlVHlwZSgpOk15R2FtZV9FeGFtcGxlX0FueVVuaXF1ZUFsaWFzZXMgeworICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiIS5fX29mZnNldCh0aGlzLmJiX3BvcywgOTApOworICByZXR1cm4gb2Zmc2V0ID8gdGhpcy5iYiEucmVhZFVpbnQ4KHRoaXMuYmJfcG9zICsgb2Zmc2V0KSA6IE15R2FtZV9FeGFtcGxlX0FueVVuaXF1ZUFsaWFzZXMuTk9ORTsKK30KKworYW55VW5pcXVlPFQgZXh0ZW5kcyBmbGF0YnVmZmVycy5UYWJsZT4ob2JqOmFueSk6YW55fG51bGwgeworICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiIS5fX29mZnNldCh0aGlzLmJiX3BvcywgOTIpOworICByZXR1cm4gb2Zmc2V0ID8gdGhpcy5iYiEuX191bmlvbihvYmosIHRoaXMuYmJfcG9zICsgb2Zmc2V0KSA6IG51bGw7Cit9CisKK2FueUFtYmlndW91c1R5cGUoKTpNeUdhbWVfRXhhbXBsZV9BbnlBbWJpZ3VvdXNBbGlhc2VzIHsKKyAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYiEuX19vZmZzZXQodGhpcy5iYl9wb3MsIDk0KTsKKyAgcmV0dXJuIG9mZnNldCA/IHRoaXMuYmIhLnJlYWRVaW50OCh0aGlzLmJiX3BvcyArIG9mZnNldCkgOiBNeUdhbWVfRXhhbXBsZV9BbnlBbWJpZ3VvdXNBbGlhc2VzLk5PTkU7Cit9CisKK2FueUFtYmlndW91czxUIGV4dGVuZHMgZmxhdGJ1ZmZlcnMuVGFibGU+KG9iajphbnkpOmFueXxudWxsIHsKKyAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYiEuX19vZmZzZXQodGhpcy5iYl9wb3MsIDk2KTsKKyAgcmV0dXJuIG9mZnNldCA/IHRoaXMuYmIhLl9fdW5pb24ob2JqLCB0aGlzLmJiX3BvcyArIG9mZnNldCkgOiBudWxsOworfQorCit2ZWN0b3JPZkVudW1zKGluZGV4OiBudW1iZXIpOk15R2FtZV9FeGFtcGxlX0NvbG9yfG51bGwgeworICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiIS5fX29mZnNldCh0aGlzLmJiX3BvcywgOTgpOworICByZXR1cm4gb2Zmc2V0ID8gdGhpcy5iYiEucmVhZFVpbnQ4KHRoaXMuYmIhLl9fdmVjdG9yKHRoaXMuYmJfcG9zICsgb2Zmc2V0KSArIGluZGV4KSA6IDA7Cit9CisKK3ZlY3Rvck9mRW51bXNMZW5ndGgoKTpudW1iZXIgeworICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiIS5fX29mZnNldCh0aGlzLmJiX3BvcywgOTgpOworICByZXR1cm4gb2Zmc2V0ID8gdGhpcy5iYiEuX192ZWN0b3JfbGVuKHRoaXMuYmJfcG9zICsgb2Zmc2V0KSA6IDA7Cit9CisKK3ZlY3Rvck9mRW51bXNBcnJheSgpOlVpbnQ4QXJyYXl8bnVsbCB7CisgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIhLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCA5OCk7CisgIHJldHVybiBvZmZzZXQgPyBuZXcgVWludDhBcnJheSh0aGlzLmJiIS5ieXRlcygpLmJ1ZmZlciwgdGhpcy5iYiEuYnl0ZXMoKS5ieXRlT2Zmc2V0ICsgdGhpcy5iYiEuX192ZWN0b3IodGhpcy5iYl9wb3MgKyBvZmZzZXQpLCB0aGlzLmJiIS5fX3ZlY3Rvcl9sZW4odGhpcy5iYl9wb3MgKyBvZmZzZXQpKSA6IG51bGw7Cit9CisKK3NpZ25lZEVudW0oKTpNeUdhbWVfRXhhbXBsZV9SYWNlIHsKKyAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYiEuX19vZmZzZXQodGhpcy5iYl9wb3MsIDEwMCk7CisgIHJldHVybiBvZmZzZXQgPyB0aGlzLmJiIS5yZWFkSW50OCh0aGlzLmJiX3BvcyArIG9mZnNldCkgOiBNeUdhbWVfRXhhbXBsZV9SYWNlLk5vbmU7Cit9CisKK3Rlc3RyZXF1aXJlZG5lc3RlZGZsYXRidWZmZXIoaW5kZXg6IG51bWJlcik6bnVtYmVyfG51bGwgeworICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiIS5fX29mZnNldCh0aGlzLmJiX3BvcywgMTAyKTsKKyAgcmV0dXJuIG9mZnNldCA/IHRoaXMuYmIhLnJlYWRVaW50OCh0aGlzLmJiIS5fX3ZlY3Rvcih0aGlzLmJiX3BvcyArIG9mZnNldCkgKyBpbmRleCkgOiAwOworfQorCit0ZXN0cmVxdWlyZWRuZXN0ZWRmbGF0YnVmZmVyTGVuZ3RoKCk6bnVtYmVyIHsKKyAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYiEuX19vZmZzZXQodGhpcy5iYl9wb3MsIDEwMik7CisgIHJldHVybiBvZmZzZXQgPyB0aGlzLmJiIS5fX3ZlY3Rvcl9sZW4odGhpcy5iYl9wb3MgKyBvZmZzZXQpIDogMDsKK30KKwordGVzdHJlcXVpcmVkbmVzdGVkZmxhdGJ1ZmZlckFycmF5KCk6VWludDhBcnJheXxudWxsIHsKKyAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYiEuX19vZmZzZXQodGhpcy5iYl9wb3MsIDEwMik7CisgIHJldHVybiBvZmZzZXQgPyBuZXcgVWludDhBcnJheSh0aGlzLmJiIS5ieXRlcygpLmJ1ZmZlciwgdGhpcy5iYiEuYnl0ZXMoKS5ieXRlT2Zmc2V0ICsgdGhpcy5iYiEuX192ZWN0b3IodGhpcy5iYl9wb3MgKyBvZmZzZXQpLCB0aGlzLmJiIS5fX3ZlY3Rvcl9sZW4odGhpcy5iYl9wb3MgKyBvZmZzZXQpKSA6IG51bGw7Cit9CisKK3NjYWxhcktleVNvcnRlZFRhYmxlcyhpbmRleDogbnVtYmVyLCBvYmo/Ok15R2FtZV9FeGFtcGxlX1N0YXQpOk15R2FtZV9FeGFtcGxlX1N0YXR8bnVsbCB7CisgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIhLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCAxMDQpOworICByZXR1cm4gb2Zmc2V0ID8gKG9iaiB8fCBuZXcgTXlHYW1lX0V4YW1wbGVfU3RhdCgpKS5fX2luaXQodGhpcy5iYiEuX19pbmRpcmVjdCh0aGlzLmJiIS5fX3ZlY3Rvcih0aGlzLmJiX3BvcyArIG9mZnNldCkgKyBpbmRleCAqIDQpLCB0aGlzLmJiISkgOiBudWxsOworfQorCitzY2FsYXJLZXlTb3J0ZWRUYWJsZXNMZW5ndGgoKTpudW1iZXIgeworICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiIS5fX29mZnNldCh0aGlzLmJiX3BvcywgMTA0KTsKKyAgcmV0dXJuIG9mZnNldCA/IHRoaXMuYmIhLl9fdmVjdG9yX2xlbih0aGlzLmJiX3BvcyArIG9mZnNldCkgOiAwOworfQorCituYXRpdmVJbmxpbmUob2JqPzpNeUdhbWVfRXhhbXBsZV9UZXN0KTpNeUdhbWVfRXhhbXBsZV9UZXN0fG51bGwgeworICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiIS5fX29mZnNldCh0aGlzLmJiX3BvcywgMTA2KTsKKyAgcmV0dXJuIG9mZnNldCA/IChvYmogfHwgbmV3IE15R2FtZV9FeGFtcGxlX1Rlc3QoKSkuX19pbml0KHRoaXMuYmJfcG9zICsgb2Zmc2V0LCB0aGlzLmJiISkgOiBudWxsOworfQorCitsb25nRW51bU5vbkVudW1EZWZhdWx0KCk6YmlnaW50IHsKKyAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYiEuX19vZmZzZXQodGhpcy5iYl9wb3MsIDEwOCk7CisgIHJldHVybiBvZmZzZXQgPyB0aGlzLmJiIS5yZWFkVWludDY0KHRoaXMuYmJfcG9zICsgb2Zmc2V0KSA6IEJpZ0ludCgnMCcpOworfQorCitsb25nRW51bU5vcm1hbERlZmF1bHQoKTpiaWdpbnQgeworICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiIS5fX29mZnNldCh0aGlzLmJiX3BvcywgMTEwKTsKKyAgcmV0dXJuIG9mZnNldCA/IHRoaXMuYmIhLnJlYWRVaW50NjQodGhpcy5iYl9wb3MgKyBvZmZzZXQpIDogQmlnSW50KCcyJyk7Cit9CisKK3N0YXRpYyBzdGFydE1vbnN0ZXIoYnVpbGRlcjpmbGF0YnVmZmVycy5CdWlsZGVyKSB7CisgIGJ1aWxkZXIuc3RhcnRPYmplY3QoNTQpOworfQorCitzdGF0aWMgYWRkUG9zKGJ1aWxkZXI6ZmxhdGJ1ZmZlcnMuQnVpbGRlciwgcG9zT2Zmc2V0OmZsYXRidWZmZXJzLk9mZnNldCkgeworICBidWlsZGVyLmFkZEZpZWxkU3RydWN0KDAsIHBvc09mZnNldCwgMCk7Cit9CisKK3N0YXRpYyBhZGRNYW5hKGJ1aWxkZXI6ZmxhdGJ1ZmZlcnMuQnVpbGRlciwgbWFuYTpudW1iZXIpIHsKKyAgYnVpbGRlci5hZGRGaWVsZEludDE2KDEsIG1hbmEsIDE1MCk7Cit9CisKK3N0YXRpYyBhZGRIcChidWlsZGVyOmZsYXRidWZmZXJzLkJ1aWxkZXIsIGhwOm51bWJlcikgeworICBidWlsZGVyLmFkZEZpZWxkSW50MTYoMiwgaHAsIDEwMCk7Cit9CisKK3N0YXRpYyBhZGROYW1lKGJ1aWxkZXI6ZmxhdGJ1ZmZlcnMuQnVpbGRlciwgbmFtZU9mZnNldDpmbGF0YnVmZmVycy5PZmZzZXQpIHsKKyAgYnVpbGRlci5hZGRGaWVsZE9mZnNldCgzLCBuYW1lT2Zmc2V0LCAwKTsKK30KKworc3RhdGljIGFkZEludmVudG9yeShidWlsZGVyOmZsYXRidWZmZXJzLkJ1aWxkZXIsIGludmVudG9yeU9mZnNldDpmbGF0YnVmZmVycy5PZmZzZXQpIHsKKyAgYnVpbGRlci5hZGRGaWVsZE9mZnNldCg1LCBpbnZlbnRvcnlPZmZzZXQsIDApOworfQorCitzdGF0aWMgY3JlYXRlSW52ZW50b3J5VmVjdG9yKGJ1aWxkZXI6ZmxhdGJ1ZmZlcnMuQnVpbGRlciwgZGF0YTpudW1iZXJbXXxVaW50OEFycmF5KTpmbGF0YnVmZmVycy5PZmZzZXQgeworICBidWlsZGVyLnN0YXJ0VmVjdG9yKDEsIGRhdGEubGVuZ3RoLCAxKTsKKyAgZm9yIChsZXQgaSA9IGRhdGEubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHsKKyAgICBidWlsZGVyLmFkZEludDgoZGF0YVtpXSEpOworICB9CisgIHJldHVybiBidWlsZGVyLmVuZFZlY3RvcigpOworfQorCitzdGF0aWMgc3RhcnRJbnZlbnRvcnlWZWN0b3IoYnVpbGRlcjpmbGF0YnVmZmVycy5CdWlsZGVyLCBudW1FbGVtczpudW1iZXIpIHsKKyAgYnVpbGRlci5zdGFydFZlY3RvcigxLCBudW1FbGVtcywgMSk7Cit9CisKK3N0YXRpYyBhZGRDb2xvcihidWlsZGVyOmZsYXRidWZmZXJzLkJ1aWxkZXIsIGNvbG9yOk15R2FtZV9FeGFtcGxlX0NvbG9yKSB7CisgIGJ1aWxkZXIuYWRkRmllbGRJbnQ4KDYsIGNvbG9yLCBNeUdhbWVfRXhhbXBsZV9Db2xvci5CbHVlKTsKK30KKworc3RhdGljIGFkZFRlc3RUeXBlKGJ1aWxkZXI6ZmxhdGJ1ZmZlcnMuQnVpbGRlciwgdGVzdFR5cGU6TXlHYW1lX0V4YW1wbGVfQW55KSB7CisgIGJ1aWxkZXIuYWRkRmllbGRJbnQ4KDcsIHRlc3RUeXBlLCBNeUdhbWVfRXhhbXBsZV9BbnkuTk9ORSk7Cit9CisKK3N0YXRpYyBhZGRUZXN0KGJ1aWxkZXI6ZmxhdGJ1ZmZlcnMuQnVpbGRlciwgdGVzdE9mZnNldDpmbGF0YnVmZmVycy5PZmZzZXQpIHsKKyAgYnVpbGRlci5hZGRGaWVsZE9mZnNldCg4LCB0ZXN0T2Zmc2V0LCAwKTsKK30KKworc3RhdGljIGFkZFRlc3Q0KGJ1aWxkZXI6ZmxhdGJ1ZmZlcnMuQnVpbGRlciwgdGVzdDRPZmZzZXQ6ZmxhdGJ1ZmZlcnMuT2Zmc2V0KSB7CisgIGJ1aWxkZXIuYWRkRmllbGRPZmZzZXQoOSwgdGVzdDRPZmZzZXQsIDApOworfQorCitzdGF0aWMgc3RhcnRUZXN0NFZlY3RvcihidWlsZGVyOmZsYXRidWZmZXJzLkJ1aWxkZXIsIG51bUVsZW1zOm51bWJlcikgeworICBidWlsZGVyLnN0YXJ0VmVjdG9yKDQsIG51bUVsZW1zLCAyKTsKK30KKworc3RhdGljIGFkZFRlc3RhcnJheW9mc3RyaW5nKGJ1aWxkZXI6ZmxhdGJ1ZmZlcnMuQnVpbGRlciwgdGVzdGFycmF5b2ZzdHJpbmdPZmZzZXQ6ZmxhdGJ1ZmZlcnMuT2Zmc2V0KSB7CisgIGJ1aWxkZXIuYWRkRmllbGRPZmZzZXQoMTAsIHRlc3RhcnJheW9mc3RyaW5nT2Zmc2V0LCAwKTsKK30KKworc3RhdGljIGNyZWF0ZVRlc3RhcnJheW9mc3RyaW5nVmVjdG9yKGJ1aWxkZXI6ZmxhdGJ1ZmZlcnMuQnVpbGRlciwgZGF0YTpmbGF0YnVmZmVycy5PZmZzZXRbXSk6ZmxhdGJ1ZmZlcnMuT2Zmc2V0IHsKKyAgYnVpbGRlci5zdGFydFZlY3Rvcig0LCBkYXRhLmxlbmd0aCwgNCk7CisgIGZvciAobGV0IGkgPSBkYXRhLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7CisgICAgYnVpbGRlci5hZGRPZmZzZXQoZGF0YVtpXSEpOworICB9CisgIHJldHVybiBidWlsZGVyLmVuZFZlY3RvcigpOworfQorCitzdGF0aWMgc3RhcnRUZXN0YXJyYXlvZnN0cmluZ1ZlY3RvcihidWlsZGVyOmZsYXRidWZmZXJzLkJ1aWxkZXIsIG51bUVsZW1zOm51bWJlcikgeworICBidWlsZGVyLnN0YXJ0VmVjdG9yKDQsIG51bUVsZW1zLCA0KTsKK30KKworc3RhdGljIGFkZFRlc3RhcnJheW9mdGFibGVzKGJ1aWxkZXI6ZmxhdGJ1ZmZlcnMuQnVpbGRlciwgdGVzdGFycmF5b2Z0YWJsZXNPZmZzZXQ6ZmxhdGJ1ZmZlcnMuT2Zmc2V0KSB7CisgIGJ1aWxkZXIuYWRkRmllbGRPZmZzZXQoMTEsIHRlc3RhcnJheW9mdGFibGVzT2Zmc2V0LCAwKTsKK30KKworc3RhdGljIGNyZWF0ZVRlc3RhcnJheW9mdGFibGVzVmVjdG9yKGJ1aWxkZXI6ZmxhdGJ1ZmZlcnMuQnVpbGRlciwgZGF0YTpmbGF0YnVmZmVycy5PZmZzZXRbXSk6ZmxhdGJ1ZmZlcnMuT2Zmc2V0IHsKKyAgYnVpbGRlci5zdGFydFZlY3Rvcig0LCBkYXRhLmxlbmd0aCwgNCk7CisgIGZvciAobGV0IGkgPSBkYXRhLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7CisgICAgYnVpbGRlci5hZGRPZmZzZXQoZGF0YVtpXSEpOworICB9CisgIHJldHVybiBidWlsZGVyLmVuZFZlY3RvcigpOworfQorCitzdGF0aWMgc3RhcnRUZXN0YXJyYXlvZnRhYmxlc1ZlY3RvcihidWlsZGVyOmZsYXRidWZmZXJzLkJ1aWxkZXIsIG51bUVsZW1zOm51bWJlcikgeworICBidWlsZGVyLnN0YXJ0VmVjdG9yKDQsIG51bUVsZW1zLCA0KTsKK30KKworc3RhdGljIGFkZEVuZW15KGJ1aWxkZXI6ZmxhdGJ1ZmZlcnMuQnVpbGRlciwgZW5lbXlPZmZzZXQ6ZmxhdGJ1ZmZlcnMuT2Zmc2V0KSB7CisgIGJ1aWxkZXIuYWRkRmllbGRPZmZzZXQoMTIsIGVuZW15T2Zmc2V0LCAwKTsKK30KKworc3RhdGljIGFkZFRlc3RuZXN0ZWRmbGF0YnVmZmVyKGJ1aWxkZXI6ZmxhdGJ1ZmZlcnMuQnVpbGRlciwgdGVzdG5lc3RlZGZsYXRidWZmZXJPZmZzZXQ6ZmxhdGJ1ZmZlcnMuT2Zmc2V0KSB7CisgIGJ1aWxkZXIuYWRkRmllbGRPZmZzZXQoMTMsIHRlc3RuZXN0ZWRmbGF0YnVmZmVyT2Zmc2V0LCAwKTsKK30KKworc3RhdGljIGNyZWF0ZVRlc3RuZXN0ZWRmbGF0YnVmZmVyVmVjdG9yKGJ1aWxkZXI6ZmxhdGJ1ZmZlcnMuQnVpbGRlciwgZGF0YTpudW1iZXJbXXxVaW50OEFycmF5KTpmbGF0YnVmZmVycy5PZmZzZXQgeworICBidWlsZGVyLnN0YXJ0VmVjdG9yKDEsIGRhdGEubGVuZ3RoLCAxKTsKKyAgZm9yIChsZXQgaSA9IGRhdGEubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHsKKyAgICBidWlsZGVyLmFkZEludDgoZGF0YVtpXSEpOworICB9CisgIHJldHVybiBidWlsZGVyLmVuZFZlY3RvcigpOworfQorCitzdGF0aWMgc3RhcnRUZXN0bmVzdGVkZmxhdGJ1ZmZlclZlY3RvcihidWlsZGVyOmZsYXRidWZmZXJzLkJ1aWxkZXIsIG51bUVsZW1zOm51bWJlcikgeworICBidWlsZGVyLnN0YXJ0VmVjdG9yKDEsIG51bUVsZW1zLCAxKTsKK30KKworc3RhdGljIGFkZFRlc3RlbXB0eShidWlsZGVyOmZsYXRidWZmZXJzLkJ1aWxkZXIsIHRlc3RlbXB0eU9mZnNldDpmbGF0YnVmZmVycy5PZmZzZXQpIHsKKyAgYnVpbGRlci5hZGRGaWVsZE9mZnNldCgxNCwgdGVzdGVtcHR5T2Zmc2V0LCAwKTsKK30KKworc3RhdGljIGFkZFRlc3Rib29sKGJ1aWxkZXI6ZmxhdGJ1ZmZlcnMuQnVpbGRlciwgdGVzdGJvb2w6Ym9vbGVhbikgeworICBidWlsZGVyLmFkZEZpZWxkSW50OCgxNSwgK3Rlc3Rib29sLCArZmFsc2UpOworfQorCitzdGF0aWMgYWRkVGVzdGhhc2hzMzJGbnYxKGJ1aWxkZXI6ZmxhdGJ1ZmZlcnMuQnVpbGRlciwgdGVzdGhhc2hzMzJGbnYxOm51bWJlcikgeworICBidWlsZGVyLmFkZEZpZWxkSW50MzIoMTYsIHRlc3RoYXNoczMyRm52MSwgMCk7Cit9CisKK3N0YXRpYyBhZGRUZXN0aGFzaHUzMkZudjEoYnVpbGRlcjpmbGF0YnVmZmVycy5CdWlsZGVyLCB0ZXN0aGFzaHUzMkZudjE6bnVtYmVyKSB7CisgIGJ1aWxkZXIuYWRkRmllbGRJbnQzMigxNywgdGVzdGhhc2h1MzJGbnYxLCAwKTsKK30KKworc3RhdGljIGFkZFRlc3RoYXNoczY0Rm52MShidWlsZGVyOmZsYXRidWZmZXJzLkJ1aWxkZXIsIHRlc3RoYXNoczY0Rm52MTpiaWdpbnQpIHsKKyAgYnVpbGRlci5hZGRGaWVsZEludDY0KDE4LCB0ZXN0aGFzaHM2NEZudjEsIEJpZ0ludCgnMCcpKTsKK30KKworc3RhdGljIGFkZFRlc3RoYXNodTY0Rm52MShidWlsZGVyOmZsYXRidWZmZXJzLkJ1aWxkZXIsIHRlc3RoYXNodTY0Rm52MTpiaWdpbnQpIHsKKyAgYnVpbGRlci5hZGRGaWVsZEludDY0KDE5LCB0ZXN0aGFzaHU2NEZudjEsIEJpZ0ludCgnMCcpKTsKK30KKworc3RhdGljIGFkZFRlc3RoYXNoczMyRm52MWEoYnVpbGRlcjpmbGF0YnVmZmVycy5CdWlsZGVyLCB0ZXN0aGFzaHMzMkZudjFhOm51bWJlcikgeworICBidWlsZGVyLmFkZEZpZWxkSW50MzIoMjAsIHRlc3RoYXNoczMyRm52MWEsIDApOworfQorCitzdGF0aWMgYWRkVGVzdGhhc2h1MzJGbnYxYShidWlsZGVyOmZsYXRidWZmZXJzLkJ1aWxkZXIsIHRlc3RoYXNodTMyRm52MWE6bnVtYmVyKSB7CisgIGJ1aWxkZXIuYWRkRmllbGRJbnQzMigyMSwgdGVzdGhhc2h1MzJGbnYxYSwgMCk7Cit9CisKK3N0YXRpYyBhZGRUZXN0aGFzaHM2NEZudjFhKGJ1aWxkZXI6ZmxhdGJ1ZmZlcnMuQnVpbGRlciwgdGVzdGhhc2hzNjRGbnYxYTpiaWdpbnQpIHsKKyAgYnVpbGRlci5hZGRGaWVsZEludDY0KDIyLCB0ZXN0aGFzaHM2NEZudjFhLCBCaWdJbnQoJzAnKSk7Cit9CisKK3N0YXRpYyBhZGRUZXN0aGFzaHU2NEZudjFhKGJ1aWxkZXI6ZmxhdGJ1ZmZlcnMuQnVpbGRlciwgdGVzdGhhc2h1NjRGbnYxYTpiaWdpbnQpIHsKKyAgYnVpbGRlci5hZGRGaWVsZEludDY0KDIzLCB0ZXN0aGFzaHU2NEZudjFhLCBCaWdJbnQoJzAnKSk7Cit9CisKK3N0YXRpYyBhZGRUZXN0YXJyYXlvZmJvb2xzKGJ1aWxkZXI6ZmxhdGJ1ZmZlcnMuQnVpbGRlciwgdGVzdGFycmF5b2Zib29sc09mZnNldDpmbGF0YnVmZmVycy5PZmZzZXQpIHsKKyAgYnVpbGRlci5hZGRGaWVsZE9mZnNldCgyNCwgdGVzdGFycmF5b2Zib29sc09mZnNldCwgMCk7Cit9CisKK3N0YXRpYyBjcmVhdGVUZXN0YXJyYXlvZmJvb2xzVmVjdG9yKGJ1aWxkZXI6ZmxhdGJ1ZmZlcnMuQnVpbGRlciwgZGF0YTpib29sZWFuW10pOmZsYXRidWZmZXJzLk9mZnNldCB7CisgIGJ1aWxkZXIuc3RhcnRWZWN0b3IoMSwgZGF0YS5sZW5ndGgsIDEpOworICBmb3IgKGxldCBpID0gZGF0YS5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgeworICAgIGJ1aWxkZXIuYWRkSW50OCgrZGF0YVtpXSEpOworICB9CisgIHJldHVybiBidWlsZGVyLmVuZFZlY3RvcigpOworfQorCitzdGF0aWMgc3RhcnRUZXN0YXJyYXlvZmJvb2xzVmVjdG9yKGJ1aWxkZXI6ZmxhdGJ1ZmZlcnMuQnVpbGRlciwgbnVtRWxlbXM6bnVtYmVyKSB7CisgIGJ1aWxkZXIuc3RhcnRWZWN0b3IoMSwgbnVtRWxlbXMsIDEpOworfQorCitzdGF0aWMgYWRkVGVzdGYoYnVpbGRlcjpmbGF0YnVmZmVycy5CdWlsZGVyLCB0ZXN0ZjpudW1iZXIpIHsKKyAgYnVpbGRlci5hZGRGaWVsZEZsb2F0MzIoMjUsIHRlc3RmLCAzLjE0MTU5KTsKK30KKworc3RhdGljIGFkZFRlc3RmMihidWlsZGVyOmZsYXRidWZmZXJzLkJ1aWxkZXIsIHRlc3RmMjpudW1iZXIpIHsKKyAgYnVpbGRlci5hZGRGaWVsZEZsb2F0MzIoMjYsIHRlc3RmMiwgMy4wKTsKK30KKworc3RhdGljIGFkZFRlc3RmMyhidWlsZGVyOmZsYXRidWZmZXJzLkJ1aWxkZXIsIHRlc3RmMzpudW1iZXIpIHsKKyAgYnVpbGRlci5hZGRGaWVsZEZsb2F0MzIoMjcsIHRlc3RmMywgMC4wKTsKK30KKworc3RhdGljIGFkZFRlc3RhcnJheW9mc3RyaW5nMihidWlsZGVyOmZsYXRidWZmZXJzLkJ1aWxkZXIsIHRlc3RhcnJheW9mc3RyaW5nMk9mZnNldDpmbGF0YnVmZmVycy5PZmZzZXQpIHsKKyAgYnVpbGRlci5hZGRGaWVsZE9mZnNldCgyOCwgdGVzdGFycmF5b2ZzdHJpbmcyT2Zmc2V0LCAwKTsKK30KKworc3RhdGljIGNyZWF0ZVRlc3RhcnJheW9mc3RyaW5nMlZlY3RvcihidWlsZGVyOmZsYXRidWZmZXJzLkJ1aWxkZXIsIGRhdGE6ZmxhdGJ1ZmZlcnMuT2Zmc2V0W10pOmZsYXRidWZmZXJzLk9mZnNldCB7CisgIGJ1aWxkZXIuc3RhcnRWZWN0b3IoNCwgZGF0YS5sZW5ndGgsIDQpOworICBmb3IgKGxldCBpID0gZGF0YS5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgeworICAgIGJ1aWxkZXIuYWRkT2Zmc2V0KGRhdGFbaV0hKTsKKyAgfQorICByZXR1cm4gYnVpbGRlci5lbmRWZWN0b3IoKTsKK30KKworc3RhdGljIHN0YXJ0VGVzdGFycmF5b2ZzdHJpbmcyVmVjdG9yKGJ1aWxkZXI6ZmxhdGJ1ZmZlcnMuQnVpbGRlciwgbnVtRWxlbXM6bnVtYmVyKSB7CisgIGJ1aWxkZXIuc3RhcnRWZWN0b3IoNCwgbnVtRWxlbXMsIDQpOworfQorCitzdGF0aWMgYWRkVGVzdGFycmF5b2Zzb3J0ZWRzdHJ1Y3QoYnVpbGRlcjpmbGF0YnVmZmVycy5CdWlsZGVyLCB0ZXN0YXJyYXlvZnNvcnRlZHN0cnVjdE9mZnNldDpmbGF0YnVmZmVycy5PZmZzZXQpIHsKKyAgYnVpbGRlci5hZGRGaWVsZE9mZnNldCgyOSwgdGVzdGFycmF5b2Zzb3J0ZWRzdHJ1Y3RPZmZzZXQsIDApOworfQorCitzdGF0aWMgc3RhcnRUZXN0YXJyYXlvZnNvcnRlZHN0cnVjdFZlY3RvcihidWlsZGVyOmZsYXRidWZmZXJzLkJ1aWxkZXIsIG51bUVsZW1zOm51bWJlcikgeworICBidWlsZGVyLnN0YXJ0VmVjdG9yKDgsIG51bUVsZW1zLCA0KTsKK30KKworc3RhdGljIGFkZEZsZXgoYnVpbGRlcjpmbGF0YnVmZmVycy5CdWlsZGVyLCBmbGV4T2Zmc2V0OmZsYXRidWZmZXJzLk9mZnNldCkgeworICBidWlsZGVyLmFkZEZpZWxkT2Zmc2V0KDMwLCBmbGV4T2Zmc2V0LCAwKTsKK30KKworc3RhdGljIGNyZWF0ZUZsZXhWZWN0b3IoYnVpbGRlcjpmbGF0YnVmZmVycy5CdWlsZGVyLCBkYXRhOm51bWJlcltdfFVpbnQ4QXJyYXkpOmZsYXRidWZmZXJzLk9mZnNldCB7CisgIGJ1aWxkZXIuc3RhcnRWZWN0b3IoMSwgZGF0YS5sZW5ndGgsIDEpOworICBmb3IgKGxldCBpID0gZGF0YS5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgeworICAgIGJ1aWxkZXIuYWRkSW50OChkYXRhW2ldISk7CisgIH0KKyAgcmV0dXJuIGJ1aWxkZXIuZW5kVmVjdG9yKCk7Cit9CisKK3N0YXRpYyBzdGFydEZsZXhWZWN0b3IoYnVpbGRlcjpmbGF0YnVmZmVycy5CdWlsZGVyLCBudW1FbGVtczpudW1iZXIpIHsKKyAgYnVpbGRlci5zdGFydFZlY3RvcigxLCBudW1FbGVtcywgMSk7Cit9CisKK3N0YXRpYyBhZGRUZXN0NShidWlsZGVyOmZsYXRidWZmZXJzLkJ1aWxkZXIsIHRlc3Q1T2Zmc2V0OmZsYXRidWZmZXJzLk9mZnNldCkgeworICBidWlsZGVyLmFkZEZpZWxkT2Zmc2V0KDMxLCB0ZXN0NU9mZnNldCwgMCk7Cit9CisKK3N0YXRpYyBzdGFydFRlc3Q1VmVjdG9yKGJ1aWxkZXI6ZmxhdGJ1ZmZlcnMuQnVpbGRlciwgbnVtRWxlbXM6bnVtYmVyKSB7CisgIGJ1aWxkZXIuc3RhcnRWZWN0b3IoNCwgbnVtRWxlbXMsIDIpOworfQorCitzdGF0aWMgYWRkVmVjdG9yT2ZMb25ncyhidWlsZGVyOmZsYXRidWZmZXJzLkJ1aWxkZXIsIHZlY3Rvck9mTG9uZ3NPZmZzZXQ6ZmxhdGJ1ZmZlcnMuT2Zmc2V0KSB7CisgIGJ1aWxkZXIuYWRkRmllbGRPZmZzZXQoMzIsIHZlY3Rvck9mTG9uZ3NPZmZzZXQsIDApOworfQorCitzdGF0aWMgY3JlYXRlVmVjdG9yT2ZMb25nc1ZlY3RvcihidWlsZGVyOmZsYXRidWZmZXJzLkJ1aWxkZXIsIGRhdGE6YmlnaW50W10pOmZsYXRidWZmZXJzLk9mZnNldCB7CisgIGJ1aWxkZXIuc3RhcnRWZWN0b3IoOCwgZGF0YS5sZW5ndGgsIDgpOworICBmb3IgKGxldCBpID0gZGF0YS5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgeworICAgIGJ1aWxkZXIuYWRkSW50NjQoZGF0YVtpXSEpOworICB9CisgIHJldHVybiBidWlsZGVyLmVuZFZlY3RvcigpOworfQorCitzdGF0aWMgc3RhcnRWZWN0b3JPZkxvbmdzVmVjdG9yKGJ1aWxkZXI6ZmxhdGJ1ZmZlcnMuQnVpbGRlciwgbnVtRWxlbXM6bnVtYmVyKSB7CisgIGJ1aWxkZXIuc3RhcnRWZWN0b3IoOCwgbnVtRWxlbXMsIDgpOworfQorCitzdGF0aWMgYWRkVmVjdG9yT2ZEb3VibGVzKGJ1aWxkZXI6ZmxhdGJ1ZmZlcnMuQnVpbGRlciwgdmVjdG9yT2ZEb3VibGVzT2Zmc2V0OmZsYXRidWZmZXJzLk9mZnNldCkgeworICBidWlsZGVyLmFkZEZpZWxkT2Zmc2V0KDMzLCB2ZWN0b3JPZkRvdWJsZXNPZmZzZXQsIDApOworfQorCitzdGF0aWMgY3JlYXRlVmVjdG9yT2ZEb3VibGVzVmVjdG9yKGJ1aWxkZXI6ZmxhdGJ1ZmZlcnMuQnVpbGRlciwgZGF0YTpudW1iZXJbXXxGbG9hdDY0QXJyYXkpOmZsYXRidWZmZXJzLk9mZnNldDsKKy8qKgorICogQGRlcHJlY2F0ZWQgVGhpcyBVaW50OEFycmF5IG92ZXJsb2FkIHdpbGwgYmUgcmVtb3ZlZCBpbiB0aGUgZnV0dXJlLgorICovCitzdGF0aWMgY3JlYXRlVmVjdG9yT2ZEb3VibGVzVmVjdG9yKGJ1aWxkZXI6ZmxhdGJ1ZmZlcnMuQnVpbGRlciwgZGF0YTpudW1iZXJbXXxVaW50OEFycmF5KTpmbGF0YnVmZmVycy5PZmZzZXQ7CitzdGF0aWMgY3JlYXRlVmVjdG9yT2ZEb3VibGVzVmVjdG9yKGJ1aWxkZXI6ZmxhdGJ1ZmZlcnMuQnVpbGRlciwgZGF0YTpudW1iZXJbXXxGbG9hdDY0QXJyYXl8VWludDhBcnJheSk6ZmxhdGJ1ZmZlcnMuT2Zmc2V0IHsKKyAgYnVpbGRlci5zdGFydFZlY3Rvcig4LCBkYXRhLmxlbmd0aCwgOCk7CisgIGZvciAobGV0IGkgPSBkYXRhLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7CisgICAgYnVpbGRlci5hZGRGbG9hdDY0KGRhdGFbaV0hKTsKKyAgfQorICByZXR1cm4gYnVpbGRlci5lbmRWZWN0b3IoKTsKK30KKworc3RhdGljIHN0YXJ0VmVjdG9yT2ZEb3VibGVzVmVjdG9yKGJ1aWxkZXI6ZmxhdGJ1ZmZlcnMuQnVpbGRlciwgbnVtRWxlbXM6bnVtYmVyKSB7CisgIGJ1aWxkZXIuc3RhcnRWZWN0b3IoOCwgbnVtRWxlbXMsIDgpOworfQorCitzdGF0aWMgYWRkUGFyZW50TmFtZXNwYWNlVGVzdChidWlsZGVyOmZsYXRidWZmZXJzLkJ1aWxkZXIsIHBhcmVudE5hbWVzcGFjZVRlc3RPZmZzZXQ6ZmxhdGJ1ZmZlcnMuT2Zmc2V0KSB7CisgIGJ1aWxkZXIuYWRkRmllbGRPZmZzZXQoMzQsIHBhcmVudE5hbWVzcGFjZVRlc3RPZmZzZXQsIDApOworfQorCitzdGF0aWMgYWRkVmVjdG9yT2ZSZWZlcnJhYmxlcyhidWlsZGVyOmZsYXRidWZmZXJzLkJ1aWxkZXIsIHZlY3Rvck9mUmVmZXJyYWJsZXNPZmZzZXQ6ZmxhdGJ1ZmZlcnMuT2Zmc2V0KSB7CisgIGJ1aWxkZXIuYWRkRmllbGRPZmZzZXQoMzUsIHZlY3Rvck9mUmVmZXJyYWJsZXNPZmZzZXQsIDApOworfQorCitzdGF0aWMgY3JlYXRlVmVjdG9yT2ZSZWZlcnJhYmxlc1ZlY3RvcihidWlsZGVyOmZsYXRidWZmZXJzLkJ1aWxkZXIsIGRhdGE6ZmxhdGJ1ZmZlcnMuT2Zmc2V0W10pOmZsYXRidWZmZXJzLk9mZnNldCB7CisgIGJ1aWxkZXIuc3RhcnRWZWN0b3IoNCwgZGF0YS5sZW5ndGgsIDQpOworICBmb3IgKGxldCBpID0gZGF0YS5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgeworICAgIGJ1aWxkZXIuYWRkT2Zmc2V0KGRhdGFbaV0hKTsKKyAgfQorICByZXR1cm4gYnVpbGRlci5lbmRWZWN0b3IoKTsKK30KKworc3RhdGljIHN0YXJ0VmVjdG9yT2ZSZWZlcnJhYmxlc1ZlY3RvcihidWlsZGVyOmZsYXRidWZmZXJzLkJ1aWxkZXIsIG51bUVsZW1zOm51bWJlcikgeworICBidWlsZGVyLnN0YXJ0VmVjdG9yKDQsIG51bUVsZW1zLCA0KTsKK30KKworc3RhdGljIGFkZFNpbmdsZVdlYWtSZWZlcmVuY2UoYnVpbGRlcjpmbGF0YnVmZmVycy5CdWlsZGVyLCBzaW5nbGVXZWFrUmVmZXJlbmNlOmJpZ2ludCkgeworICBidWlsZGVyLmFkZEZpZWxkSW50NjQoMzYsIHNpbmdsZVdlYWtSZWZlcmVuY2UsIEJpZ0ludCgnMCcpKTsKK30KKworc3RhdGljIGFkZFZlY3Rvck9mV2Vha1JlZmVyZW5jZXMoYnVpbGRlcjpmbGF0YnVmZmVycy5CdWlsZGVyLCB2ZWN0b3JPZldlYWtSZWZlcmVuY2VzT2Zmc2V0OmZsYXRidWZmZXJzLk9mZnNldCkgeworICBidWlsZGVyLmFkZEZpZWxkT2Zmc2V0KDM3LCB2ZWN0b3JPZldlYWtSZWZlcmVuY2VzT2Zmc2V0LCAwKTsKK30KKworc3RhdGljIGNyZWF0ZVZlY3Rvck9mV2Vha1JlZmVyZW5jZXNWZWN0b3IoYnVpbGRlcjpmbGF0YnVmZmVycy5CdWlsZGVyLCBkYXRhOmJpZ2ludFtdKTpmbGF0YnVmZmVycy5PZmZzZXQgeworICBidWlsZGVyLnN0YXJ0VmVjdG9yKDgsIGRhdGEubGVuZ3RoLCA4KTsKKyAgZm9yIChsZXQgaSA9IGRhdGEubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHsKKyAgICBidWlsZGVyLmFkZEludDY0KGRhdGFbaV0hKTsKKyAgfQorICByZXR1cm4gYnVpbGRlci5lbmRWZWN0b3IoKTsKK30KKworc3RhdGljIHN0YXJ0VmVjdG9yT2ZXZWFrUmVmZXJlbmNlc1ZlY3RvcihidWlsZGVyOmZsYXRidWZmZXJzLkJ1aWxkZXIsIG51bUVsZW1zOm51bWJlcikgeworICBidWlsZGVyLnN0YXJ0VmVjdG9yKDgsIG51bUVsZW1zLCA4KTsKK30KKworc3RhdGljIGFkZFZlY3Rvck9mU3Ryb25nUmVmZXJyYWJsZXMoYnVpbGRlcjpmbGF0YnVmZmVycy5CdWlsZGVyLCB2ZWN0b3JPZlN0cm9uZ1JlZmVycmFibGVzT2Zmc2V0OmZsYXRidWZmZXJzLk9mZnNldCkgeworICBidWlsZGVyLmFkZEZpZWxkT2Zmc2V0KDM4LCB2ZWN0b3JPZlN0cm9uZ1JlZmVycmFibGVzT2Zmc2V0LCAwKTsKK30KKworc3RhdGljIGNyZWF0ZVZlY3Rvck9mU3Ryb25nUmVmZXJyYWJsZXNWZWN0b3IoYnVpbGRlcjpmbGF0YnVmZmVycy5CdWlsZGVyLCBkYXRhOmZsYXRidWZmZXJzLk9mZnNldFtdKTpmbGF0YnVmZmVycy5PZmZzZXQgeworICBidWlsZGVyLnN0YXJ0VmVjdG9yKDQsIGRhdGEubGVuZ3RoLCA0KTsKKyAgZm9yIChsZXQgaSA9IGRhdGEubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHsKKyAgICBidWlsZGVyLmFkZE9mZnNldChkYXRhW2ldISk7CisgIH0KKyAgcmV0dXJuIGJ1aWxkZXIuZW5kVmVjdG9yKCk7Cit9CisKK3N0YXRpYyBzdGFydFZlY3Rvck9mU3Ryb25nUmVmZXJyYWJsZXNWZWN0b3IoYnVpbGRlcjpmbGF0YnVmZmVycy5CdWlsZGVyLCBudW1FbGVtczpudW1iZXIpIHsKKyAgYnVpbGRlci5zdGFydFZlY3Rvcig0LCBudW1FbGVtcywgNCk7Cit9CisKK3N0YXRpYyBhZGRDb093bmluZ1JlZmVyZW5jZShidWlsZGVyOmZsYXRidWZmZXJzLkJ1aWxkZXIsIGNvT3duaW5nUmVmZXJlbmNlOmJpZ2ludCkgeworICBidWlsZGVyLmFkZEZpZWxkSW50NjQoMzksIGNvT3duaW5nUmVmZXJlbmNlLCBCaWdJbnQoJzAnKSk7Cit9CisKK3N0YXRpYyBhZGRWZWN0b3JPZkNvT3duaW5nUmVmZXJlbmNlcyhidWlsZGVyOmZsYXRidWZmZXJzLkJ1aWxkZXIsIHZlY3Rvck9mQ29Pd25pbmdSZWZlcmVuY2VzT2Zmc2V0OmZsYXRidWZmZXJzLk9mZnNldCkgeworICBidWlsZGVyLmFkZEZpZWxkT2Zmc2V0KDQwLCB2ZWN0b3JPZkNvT3duaW5nUmVmZXJlbmNlc09mZnNldCwgMCk7Cit9CisKK3N0YXRpYyBjcmVhdGVWZWN0b3JPZkNvT3duaW5nUmVmZXJlbmNlc1ZlY3RvcihidWlsZGVyOmZsYXRidWZmZXJzLkJ1aWxkZXIsIGRhdGE6YmlnaW50W10pOmZsYXRidWZmZXJzLk9mZnNldCB7CisgIGJ1aWxkZXIuc3RhcnRWZWN0b3IoOCwgZGF0YS5sZW5ndGgsIDgpOworICBmb3IgKGxldCBpID0gZGF0YS5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgeworICAgIGJ1aWxkZXIuYWRkSW50NjQoZGF0YVtpXSEpOworICB9CisgIHJldHVybiBidWlsZGVyLmVuZFZlY3RvcigpOworfQorCitzdGF0aWMgc3RhcnRWZWN0b3JPZkNvT3duaW5nUmVmZXJlbmNlc1ZlY3RvcihidWlsZGVyOmZsYXRidWZmZXJzLkJ1aWxkZXIsIG51bUVsZW1zOm51bWJlcikgeworICBidWlsZGVyLnN0YXJ0VmVjdG9yKDgsIG51bUVsZW1zLCA4KTsKK30KKworc3RhdGljIGFkZE5vbk93bmluZ1JlZmVyZW5jZShidWlsZGVyOmZsYXRidWZmZXJzLkJ1aWxkZXIsIG5vbk93bmluZ1JlZmVyZW5jZTpiaWdpbnQpIHsKKyAgYnVpbGRlci5hZGRGaWVsZEludDY0KDQxLCBub25Pd25pbmdSZWZlcmVuY2UsIEJpZ0ludCgnMCcpKTsKK30KKworc3RhdGljIGFkZFZlY3Rvck9mTm9uT3duaW5nUmVmZXJlbmNlcyhidWlsZGVyOmZsYXRidWZmZXJzLkJ1aWxkZXIsIHZlY3Rvck9mTm9uT3duaW5nUmVmZXJlbmNlc09mZnNldDpmbGF0YnVmZmVycy5PZmZzZXQpIHsKKyAgYnVpbGRlci5hZGRGaWVsZE9mZnNldCg0MiwgdmVjdG9yT2ZOb25Pd25pbmdSZWZlcmVuY2VzT2Zmc2V0LCAwKTsKK30KKworc3RhdGljIGNyZWF0ZVZlY3Rvck9mTm9uT3duaW5nUmVmZXJlbmNlc1ZlY3RvcihidWlsZGVyOmZsYXRidWZmZXJzLkJ1aWxkZXIsIGRhdGE6YmlnaW50W10pOmZsYXRidWZmZXJzLk9mZnNldCB7CisgIGJ1aWxkZXIuc3RhcnRWZWN0b3IoOCwgZGF0YS5sZW5ndGgsIDgpOworICBmb3IgKGxldCBpID0gZGF0YS5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgeworICAgIGJ1aWxkZXIuYWRkSW50NjQoZGF0YVtpXSEpOworICB9CisgIHJldHVybiBidWlsZGVyLmVuZFZlY3RvcigpOworfQorCitzdGF0aWMgc3RhcnRWZWN0b3JPZk5vbk93bmluZ1JlZmVyZW5jZXNWZWN0b3IoYnVpbGRlcjpmbGF0YnVmZmVycy5CdWlsZGVyLCBudW1FbGVtczpudW1iZXIpIHsKKyAgYnVpbGRlci5zdGFydFZlY3Rvcig4LCBudW1FbGVtcywgOCk7Cit9CisKK3N0YXRpYyBhZGRBbnlVbmlxdWVUeXBlKGJ1aWxkZXI6ZmxhdGJ1ZmZlcnMuQnVpbGRlciwgYW55VW5pcXVlVHlwZTpNeUdhbWVfRXhhbXBsZV9BbnlVbmlxdWVBbGlhc2VzKSB7CisgIGJ1aWxkZXIuYWRkRmllbGRJbnQ4KDQzLCBhbnlVbmlxdWVUeXBlLCBNeUdhbWVfRXhhbXBsZV9BbnlVbmlxdWVBbGlhc2VzLk5PTkUpOworfQorCitzdGF0aWMgYWRkQW55VW5pcXVlKGJ1aWxkZXI6ZmxhdGJ1ZmZlcnMuQnVpbGRlciwgYW55VW5pcXVlT2Zmc2V0OmZsYXRidWZmZXJzLk9mZnNldCkgeworICBidWlsZGVyLmFkZEZpZWxkT2Zmc2V0KDQ0LCBhbnlVbmlxdWVPZmZzZXQsIDApOworfQorCitzdGF0aWMgYWRkQW55QW1iaWd1b3VzVHlwZShidWlsZGVyOmZsYXRidWZmZXJzLkJ1aWxkZXIsIGFueUFtYmlndW91c1R5cGU6TXlHYW1lX0V4YW1wbGVfQW55QW1iaWd1b3VzQWxpYXNlcykgeworICBidWlsZGVyLmFkZEZpZWxkSW50OCg0NSwgYW55QW1iaWd1b3VzVHlwZSwgTXlHYW1lX0V4YW1wbGVfQW55QW1iaWd1b3VzQWxpYXNlcy5OT05FKTsKK30KKworc3RhdGljIGFkZEFueUFtYmlndW91cyhidWlsZGVyOmZsYXRidWZmZXJzLkJ1aWxkZXIsIGFueUFtYmlndW91c09mZnNldDpmbGF0YnVmZmVycy5PZmZzZXQpIHsKKyAgYnVpbGRlci5hZGRGaWVsZE9mZnNldCg0NiwgYW55QW1iaWd1b3VzT2Zmc2V0LCAwKTsKK30KKworc3RhdGljIGFkZFZlY3Rvck9mRW51bXMoYnVpbGRlcjpmbGF0YnVmZmVycy5CdWlsZGVyLCB2ZWN0b3JPZkVudW1zT2Zmc2V0OmZsYXRidWZmZXJzLk9mZnNldCkgeworICBidWlsZGVyLmFkZEZpZWxkT2Zmc2V0KDQ3LCB2ZWN0b3JPZkVudW1zT2Zmc2V0LCAwKTsKK30KKworc3RhdGljIGNyZWF0ZVZlY3Rvck9mRW51bXNWZWN0b3IoYnVpbGRlcjpmbGF0YnVmZmVycy5CdWlsZGVyLCBkYXRhOk15R2FtZV9FeGFtcGxlX0NvbG9yW10pOmZsYXRidWZmZXJzLk9mZnNldCB7CisgIGJ1aWxkZXIuc3RhcnRWZWN0b3IoMSwgZGF0YS5sZW5ndGgsIDEpOworICBmb3IgKGxldCBpID0gZGF0YS5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgeworICAgIGJ1aWxkZXIuYWRkSW50OChkYXRhW2ldISk7CisgIH0KKyAgcmV0dXJuIGJ1aWxkZXIuZW5kVmVjdG9yKCk7Cit9CisKK3N0YXRpYyBzdGFydFZlY3Rvck9mRW51bXNWZWN0b3IoYnVpbGRlcjpmbGF0YnVmZmVycy5CdWlsZGVyLCBudW1FbGVtczpudW1iZXIpIHsKKyAgYnVpbGRlci5zdGFydFZlY3RvcigxLCBudW1FbGVtcywgMSk7Cit9CisKK3N0YXRpYyBhZGRTaWduZWRFbnVtKGJ1aWxkZXI6ZmxhdGJ1ZmZlcnMuQnVpbGRlciwgc2lnbmVkRW51bTpNeUdhbWVfRXhhbXBsZV9SYWNlKSB7CisgIGJ1aWxkZXIuYWRkRmllbGRJbnQ4KDQ4LCBzaWduZWRFbnVtLCBNeUdhbWVfRXhhbXBsZV9SYWNlLk5vbmUpOworfQorCitzdGF0aWMgYWRkVGVzdHJlcXVpcmVkbmVzdGVkZmxhdGJ1ZmZlcihidWlsZGVyOmZsYXRidWZmZXJzLkJ1aWxkZXIsIHRlc3RyZXF1aXJlZG5lc3RlZGZsYXRidWZmZXJPZmZzZXQ6ZmxhdGJ1ZmZlcnMuT2Zmc2V0KSB7CisgIGJ1aWxkZXIuYWRkRmllbGRPZmZzZXQoNDksIHRlc3RyZXF1aXJlZG5lc3RlZGZsYXRidWZmZXJPZmZzZXQsIDApOworfQorCitzdGF0aWMgY3JlYXRlVGVzdHJlcXVpcmVkbmVzdGVkZmxhdGJ1ZmZlclZlY3RvcihidWlsZGVyOmZsYXRidWZmZXJzLkJ1aWxkZXIsIGRhdGE6bnVtYmVyW118VWludDhBcnJheSk6ZmxhdGJ1ZmZlcnMuT2Zmc2V0IHsKKyAgYnVpbGRlci5zdGFydFZlY3RvcigxLCBkYXRhLmxlbmd0aCwgMSk7CisgIGZvciAobGV0IGkgPSBkYXRhLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7CisgICAgYnVpbGRlci5hZGRJbnQ4KGRhdGFbaV0hKTsKKyAgfQorICByZXR1cm4gYnVpbGRlci5lbmRWZWN0b3IoKTsKK30KKworc3RhdGljIHN0YXJ0VGVzdHJlcXVpcmVkbmVzdGVkZmxhdGJ1ZmZlclZlY3RvcihidWlsZGVyOmZsYXRidWZmZXJzLkJ1aWxkZXIsIG51bUVsZW1zOm51bWJlcikgeworICBidWlsZGVyLnN0YXJ0VmVjdG9yKDEsIG51bUVsZW1zLCAxKTsKK30KKworc3RhdGljIGFkZFNjYWxhcktleVNvcnRlZFRhYmxlcyhidWlsZGVyOmZsYXRidWZmZXJzLkJ1aWxkZXIsIHNjYWxhcktleVNvcnRlZFRhYmxlc09mZnNldDpmbGF0YnVmZmVycy5PZmZzZXQpIHsKKyAgYnVpbGRlci5hZGRGaWVsZE9mZnNldCg1MCwgc2NhbGFyS2V5U29ydGVkVGFibGVzT2Zmc2V0LCAwKTsKK30KKworc3RhdGljIGNyZWF0ZVNjYWxhcktleVNvcnRlZFRhYmxlc1ZlY3RvcihidWlsZGVyOmZsYXRidWZmZXJzLkJ1aWxkZXIsIGRhdGE6ZmxhdGJ1ZmZlcnMuT2Zmc2V0W10pOmZsYXRidWZmZXJzLk9mZnNldCB7CisgIGJ1aWxkZXIuc3RhcnRWZWN0b3IoNCwgZGF0YS5sZW5ndGgsIDQpOworICBmb3IgKGxldCBpID0gZGF0YS5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgeworICAgIGJ1aWxkZXIuYWRkT2Zmc2V0KGRhdGFbaV0hKTsKKyAgfQorICByZXR1cm4gYnVpbGRlci5lbmRWZWN0b3IoKTsKK30KKworc3RhdGljIHN0YXJ0U2NhbGFyS2V5U29ydGVkVGFibGVzVmVjdG9yKGJ1aWxkZXI6ZmxhdGJ1ZmZlcnMuQnVpbGRlciwgbnVtRWxlbXM6bnVtYmVyKSB7CisgIGJ1aWxkZXIuc3RhcnRWZWN0b3IoNCwgbnVtRWxlbXMsIDQpOworfQorCitzdGF0aWMgYWRkTmF0aXZlSW5saW5lKGJ1aWxkZXI6ZmxhdGJ1ZmZlcnMuQnVpbGRlciwgbmF0aXZlSW5saW5lT2Zmc2V0OmZsYXRidWZmZXJzLk9mZnNldCkgeworICBidWlsZGVyLmFkZEZpZWxkU3RydWN0KDUxLCBuYXRpdmVJbmxpbmVPZmZzZXQsIDApOworfQorCitzdGF0aWMgYWRkTG9uZ0VudW1Ob25FbnVtRGVmYXVsdChidWlsZGVyOmZsYXRidWZmZXJzLkJ1aWxkZXIsIGxvbmdFbnVtTm9uRW51bURlZmF1bHQ6YmlnaW50KSB7CisgIGJ1aWxkZXIuYWRkRmllbGRJbnQ2NCg1MiwgbG9uZ0VudW1Ob25FbnVtRGVmYXVsdCwgQmlnSW50KCcwJykpOworfQorCitzdGF0aWMgYWRkTG9uZ0VudW1Ob3JtYWxEZWZhdWx0KGJ1aWxkZXI6ZmxhdGJ1ZmZlcnMuQnVpbGRlciwgbG9uZ0VudW1Ob3JtYWxEZWZhdWx0OmJpZ2ludCkgeworICBidWlsZGVyLmFkZEZpZWxkSW50NjQoNTMsIGxvbmdFbnVtTm9ybWFsRGVmYXVsdCwgQmlnSW50KCcyJykpOworfQorCitzdGF0aWMgZW5kTW9uc3RlcihidWlsZGVyOmZsYXRidWZmZXJzLkJ1aWxkZXIpOmZsYXRidWZmZXJzLk9mZnNldCB7CisgIGNvbnN0IG9mZnNldCA9IGJ1aWxkZXIuZW5kT2JqZWN0KCk7CisgIGJ1aWxkZXIucmVxdWlyZWRGaWVsZChvZmZzZXQsIDEwKSAvLyBuYW1lCisgIHJldHVybiBvZmZzZXQ7Cit9CisKK3N0YXRpYyBmaW5pc2hNb25zdGVyQnVmZmVyKGJ1aWxkZXI6ZmxhdGJ1ZmZlcnMuQnVpbGRlciwgb2Zmc2V0OmZsYXRidWZmZXJzLk9mZnNldCkgeworICBidWlsZGVyLmZpbmlzaChvZmZzZXQsICdNT05TJyk7Cit9CisKK3N0YXRpYyBmaW5pc2hTaXplUHJlZml4ZWRNb25zdGVyQnVmZmVyKGJ1aWxkZXI6ZmxhdGJ1ZmZlcnMuQnVpbGRlciwgb2Zmc2V0OmZsYXRidWZmZXJzLk9mZnNldCkgeworICBidWlsZGVyLmZpbmlzaChvZmZzZXQsICdNT05TJywgdHJ1ZSk7Cit9CisKKworc2VyaWFsaXplKCk6VWludDhBcnJheSB7CisgIHJldHVybiB0aGlzLmJiIS5ieXRlcygpOworfQorCitzdGF0aWMgZGVzZXJpYWxpemUoYnVmZmVyOiBVaW50OEFycmF5KTpNb25zdGVyIHsKKyAgcmV0dXJuIE15R2FtZV9FeGFtcGxlX01vbnN0ZXIuZ2V0Um9vdEFzTW9uc3RlcihuZXcgZmxhdGJ1ZmZlcnMuQnl0ZUJ1ZmZlcihidWZmZXIpKQorfQorfQorCitleHBvcnQgY2xhc3MgTXlHYW1lX0V4YW1wbGVfVHlwZUFsaWFzZXMgeworICBiYjogZmxhdGJ1ZmZlcnMuQnl0ZUJ1ZmZlcnxudWxsID0gbnVsbDsKKyAgYmJfcG9zID0gMDsKKyAgX19pbml0KGk6bnVtYmVyLCBiYjpmbGF0YnVmZmVycy5CeXRlQnVmZmVyKTpNeUdhbWVfRXhhbXBsZV9UeXBlQWxpYXNlcyB7CisgIHRoaXMuYmJfcG9zID0gaTsKKyAgdGhpcy5iYiA9IGJiOworICByZXR1cm4gdGhpczsKK30KKworc3RhdGljIGdldFJvb3RBc1R5cGVBbGlhc2VzKGJiOmZsYXRidWZmZXJzLkJ5dGVCdWZmZXIsIG9iaj86TXlHYW1lX0V4YW1wbGVfVHlwZUFsaWFzZXMpOk15R2FtZV9FeGFtcGxlX1R5cGVBbGlhc2VzIHsKKyAgcmV0dXJuIChvYmogfHwgbmV3IE15R2FtZV9FeGFtcGxlX1R5cGVBbGlhc2VzKCkpLl9faW5pdChiYi5yZWFkSW50MzIoYmIucG9zaXRpb24oKSkgKyBiYi5wb3NpdGlvbigpLCBiYik7Cit9CisKK3N0YXRpYyBnZXRTaXplUHJlZml4ZWRSb290QXNUeXBlQWxpYXNlcyhiYjpmbGF0YnVmZmVycy5CeXRlQnVmZmVyLCBvYmo/Ok15R2FtZV9FeGFtcGxlX1R5cGVBbGlhc2VzKTpNeUdhbWVfRXhhbXBsZV9UeXBlQWxpYXNlcyB7CisgIGJiLnNldFBvc2l0aW9uKGJiLnBvc2l0aW9uKCkgKyBmbGF0YnVmZmVycy5TSVpFX1BSRUZJWF9MRU5HVEgpOworICByZXR1cm4gKG9iaiB8fCBuZXcgTXlHYW1lX0V4YW1wbGVfVHlwZUFsaWFzZXMoKSkuX19pbml0KGJiLnJlYWRJbnQzMihiYi5wb3NpdGlvbigpKSArIGJiLnBvc2l0aW9uKCksIGJiKTsKK30KKworaTgoKTpudW1iZXIgeworICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiIS5fX29mZnNldCh0aGlzLmJiX3BvcywgNCk7CisgIHJldHVybiBvZmZzZXQgPyB0aGlzLmJiIS5yZWFkSW50OCh0aGlzLmJiX3BvcyArIG9mZnNldCkgOiAwOworfQorCit1OCgpOm51bWJlciB7CisgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIhLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCA2KTsKKyAgcmV0dXJuIG9mZnNldCA/IHRoaXMuYmIhLnJlYWRVaW50OCh0aGlzLmJiX3BvcyArIG9mZnNldCkgOiAwOworfQorCitpMTYoKTpudW1iZXIgeworICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiIS5fX29mZnNldCh0aGlzLmJiX3BvcywgOCk7CisgIHJldHVybiBvZmZzZXQgPyB0aGlzLmJiIS5yZWFkSW50MTYodGhpcy5iYl9wb3MgKyBvZmZzZXQpIDogMDsKK30KKwordTE2KCk6bnVtYmVyIHsKKyAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYiEuX19vZmZzZXQodGhpcy5iYl9wb3MsIDEwKTsKKyAgcmV0dXJuIG9mZnNldCA/IHRoaXMuYmIhLnJlYWRVaW50MTYodGhpcy5iYl9wb3MgKyBvZmZzZXQpIDogMDsKK30KKworaTMyKCk6bnVtYmVyIHsKKyAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYiEuX19vZmZzZXQodGhpcy5iYl9wb3MsIDEyKTsKKyAgcmV0dXJuIG9mZnNldCA/IHRoaXMuYmIhLnJlYWRJbnQzMih0aGlzLmJiX3BvcyArIG9mZnNldCkgOiAwOworfQorCit1MzIoKTpudW1iZXIgeworICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiIS5fX29mZnNldCh0aGlzLmJiX3BvcywgMTQpOworICByZXR1cm4gb2Zmc2V0ID8gdGhpcy5iYiEucmVhZFVpbnQzMih0aGlzLmJiX3BvcyArIG9mZnNldCkgOiAwOworfQorCitpNjQoKTpiaWdpbnQgeworICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiIS5fX29mZnNldCh0aGlzLmJiX3BvcywgMTYpOworICByZXR1cm4gb2Zmc2V0ID8gdGhpcy5iYiEucmVhZEludDY0KHRoaXMuYmJfcG9zICsgb2Zmc2V0KSA6IEJpZ0ludCgnMCcpOworfQorCit1NjQoKTpiaWdpbnQgeworICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiIS5fX29mZnNldCh0aGlzLmJiX3BvcywgMTgpOworICByZXR1cm4gb2Zmc2V0ID8gdGhpcy5iYiEucmVhZFVpbnQ2NCh0aGlzLmJiX3BvcyArIG9mZnNldCkgOiBCaWdJbnQoJzAnKTsKK30KKworZjMyKCk6bnVtYmVyIHsKKyAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYiEuX19vZmZzZXQodGhpcy5iYl9wb3MsIDIwKTsKKyAgcmV0dXJuIG9mZnNldCA/IHRoaXMuYmIhLnJlYWRGbG9hdDMyKHRoaXMuYmJfcG9zICsgb2Zmc2V0KSA6IDAuMDsKK30KKworZjY0KCk6bnVtYmVyIHsKKyAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYiEuX19vZmZzZXQodGhpcy5iYl9wb3MsIDIyKTsKKyAgcmV0dXJuIG9mZnNldCA/IHRoaXMuYmIhLnJlYWRGbG9hdDY0KHRoaXMuYmJfcG9zICsgb2Zmc2V0KSA6IDAuMDsKK30KKwordjgoaW5kZXg6IG51bWJlcik6bnVtYmVyfG51bGwgeworICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiIS5fX29mZnNldCh0aGlzLmJiX3BvcywgMjQpOworICByZXR1cm4gb2Zmc2V0ID8gdGhpcy5iYiEucmVhZEludDgodGhpcy5iYiEuX192ZWN0b3IodGhpcy5iYl9wb3MgKyBvZmZzZXQpICsgaW5kZXgpIDogMDsKK30KKwordjhMZW5ndGgoKTpudW1iZXIgeworICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiIS5fX29mZnNldCh0aGlzLmJiX3BvcywgMjQpOworICByZXR1cm4gb2Zmc2V0ID8gdGhpcy5iYiEuX192ZWN0b3JfbGVuKHRoaXMuYmJfcG9zICsgb2Zmc2V0KSA6IDA7Cit9CisKK3Y4QXJyYXkoKTpJbnQ4QXJyYXl8bnVsbCB7CisgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIhLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCAyNCk7CisgIHJldHVybiBvZmZzZXQgPyBuZXcgSW50OEFycmF5KHRoaXMuYmIhLmJ5dGVzKCkuYnVmZmVyLCB0aGlzLmJiIS5ieXRlcygpLmJ5dGVPZmZzZXQgKyB0aGlzLmJiIS5fX3ZlY3Rvcih0aGlzLmJiX3BvcyArIG9mZnNldCksIHRoaXMuYmIhLl9fdmVjdG9yX2xlbih0aGlzLmJiX3BvcyArIG9mZnNldCkpIDogbnVsbDsKK30KKwordmY2NChpbmRleDogbnVtYmVyKTpudW1iZXJ8bnVsbCB7CisgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIhLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCAyNik7CisgIHJldHVybiBvZmZzZXQgPyB0aGlzLmJiIS5yZWFkRmxvYXQ2NCh0aGlzLmJiIS5fX3ZlY3Rvcih0aGlzLmJiX3BvcyArIG9mZnNldCkgKyBpbmRleCAqIDgpIDogMDsKK30KKwordmY2NExlbmd0aCgpOm51bWJlciB7CisgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIhLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCAyNik7CisgIHJldHVybiBvZmZzZXQgPyB0aGlzLmJiIS5fX3ZlY3Rvcl9sZW4odGhpcy5iYl9wb3MgKyBvZmZzZXQpIDogMDsKK30KKwordmY2NEFycmF5KCk6RmxvYXQ2NEFycmF5fG51bGwgeworICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiIS5fX29mZnNldCh0aGlzLmJiX3BvcywgMjYpOworICByZXR1cm4gb2Zmc2V0ID8gbmV3IEZsb2F0NjRBcnJheSh0aGlzLmJiIS5ieXRlcygpLmJ1ZmZlciwgdGhpcy5iYiEuYnl0ZXMoKS5ieXRlT2Zmc2V0ICsgdGhpcy5iYiEuX192ZWN0b3IodGhpcy5iYl9wb3MgKyBvZmZzZXQpLCB0aGlzLmJiIS5fX3ZlY3Rvcl9sZW4odGhpcy5iYl9wb3MgKyBvZmZzZXQpKSA6IG51bGw7Cit9CisKK3N0YXRpYyBzdGFydFR5cGVBbGlhc2VzKGJ1aWxkZXI6ZmxhdGJ1ZmZlcnMuQnVpbGRlcikgeworICBidWlsZGVyLnN0YXJ0T2JqZWN0KDEyKTsKK30KKworc3RhdGljIGFkZEk4KGJ1aWxkZXI6ZmxhdGJ1ZmZlcnMuQnVpbGRlciwgaTg6bnVtYmVyKSB7CisgIGJ1aWxkZXIuYWRkRmllbGRJbnQ4KDAsIGk4LCAwKTsKK30KKworc3RhdGljIGFkZFU4KGJ1aWxkZXI6ZmxhdGJ1ZmZlcnMuQnVpbGRlciwgdTg6bnVtYmVyKSB7CisgIGJ1aWxkZXIuYWRkRmllbGRJbnQ4KDEsIHU4LCAwKTsKK30KKworc3RhdGljIGFkZEkxNihidWlsZGVyOmZsYXRidWZmZXJzLkJ1aWxkZXIsIGkxNjpudW1iZXIpIHsKKyAgYnVpbGRlci5hZGRGaWVsZEludDE2KDIsIGkxNiwgMCk7Cit9CisKK3N0YXRpYyBhZGRVMTYoYnVpbGRlcjpmbGF0YnVmZmVycy5CdWlsZGVyLCB1MTY6bnVtYmVyKSB7CisgIGJ1aWxkZXIuYWRkRmllbGRJbnQxNigzLCB1MTYsIDApOworfQorCitzdGF0aWMgYWRkSTMyKGJ1aWxkZXI6ZmxhdGJ1ZmZlcnMuQnVpbGRlciwgaTMyOm51bWJlcikgeworICBidWlsZGVyLmFkZEZpZWxkSW50MzIoNCwgaTMyLCAwKTsKK30KKworc3RhdGljIGFkZFUzMihidWlsZGVyOmZsYXRidWZmZXJzLkJ1aWxkZXIsIHUzMjpudW1iZXIpIHsKKyAgYnVpbGRlci5hZGRGaWVsZEludDMyKDUsIHUzMiwgMCk7Cit9CisKK3N0YXRpYyBhZGRJNjQoYnVpbGRlcjpmbGF0YnVmZmVycy5CdWlsZGVyLCBpNjQ6YmlnaW50KSB7CisgIGJ1aWxkZXIuYWRkRmllbGRJbnQ2NCg2LCBpNjQsIEJpZ0ludCgnMCcpKTsKK30KKworc3RhdGljIGFkZFU2NChidWlsZGVyOmZsYXRidWZmZXJzLkJ1aWxkZXIsIHU2NDpiaWdpbnQpIHsKKyAgYnVpbGRlci5hZGRGaWVsZEludDY0KDcsIHU2NCwgQmlnSW50KCcwJykpOworfQorCitzdGF0aWMgYWRkRjMyKGJ1aWxkZXI6ZmxhdGJ1ZmZlcnMuQnVpbGRlciwgZjMyOm51bWJlcikgeworICBidWlsZGVyLmFkZEZpZWxkRmxvYXQzMig4LCBmMzIsIDAuMCk7Cit9CisKK3N0YXRpYyBhZGRGNjQoYnVpbGRlcjpmbGF0YnVmZmVycy5CdWlsZGVyLCBmNjQ6bnVtYmVyKSB7CisgIGJ1aWxkZXIuYWRkRmllbGRGbG9hdDY0KDksIGY2NCwgMC4wKTsKK30KKworc3RhdGljIGFkZFY4KGJ1aWxkZXI6ZmxhdGJ1ZmZlcnMuQnVpbGRlciwgdjhPZmZzZXQ6ZmxhdGJ1ZmZlcnMuT2Zmc2V0KSB7CisgIGJ1aWxkZXIuYWRkRmllbGRPZmZzZXQoMTAsIHY4T2Zmc2V0LCAwKTsKK30KKworc3RhdGljIGNyZWF0ZVY4VmVjdG9yKGJ1aWxkZXI6ZmxhdGJ1ZmZlcnMuQnVpbGRlciwgZGF0YTpudW1iZXJbXXxJbnQ4QXJyYXkpOmZsYXRidWZmZXJzLk9mZnNldDsKKy8qKgorICogQGRlcHJlY2F0ZWQgVGhpcyBVaW50OEFycmF5IG92ZXJsb2FkIHdpbGwgYmUgcmVtb3ZlZCBpbiB0aGUgZnV0dXJlLgorICovCitzdGF0aWMgY3JlYXRlVjhWZWN0b3IoYnVpbGRlcjpmbGF0YnVmZmVycy5CdWlsZGVyLCBkYXRhOm51bWJlcltdfFVpbnQ4QXJyYXkpOmZsYXRidWZmZXJzLk9mZnNldDsKK3N0YXRpYyBjcmVhdGVWOFZlY3RvcihidWlsZGVyOmZsYXRidWZmZXJzLkJ1aWxkZXIsIGRhdGE6bnVtYmVyW118SW50OEFycmF5fFVpbnQ4QXJyYXkpOmZsYXRidWZmZXJzLk9mZnNldCB7CisgIGJ1aWxkZXIuc3RhcnRWZWN0b3IoMSwgZGF0YS5sZW5ndGgsIDEpOworICBmb3IgKGxldCBpID0gZGF0YS5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgeworICAgIGJ1aWxkZXIuYWRkSW50OChkYXRhW2ldISk7CisgIH0KKyAgcmV0dXJuIGJ1aWxkZXIuZW5kVmVjdG9yKCk7Cit9CisKK3N0YXRpYyBzdGFydFY4VmVjdG9yKGJ1aWxkZXI6ZmxhdGJ1ZmZlcnMuQnVpbGRlciwgbnVtRWxlbXM6bnVtYmVyKSB7CisgIGJ1aWxkZXIuc3RhcnRWZWN0b3IoMSwgbnVtRWxlbXMsIDEpOworfQorCitzdGF0aWMgYWRkVmY2NChidWlsZGVyOmZsYXRidWZmZXJzLkJ1aWxkZXIsIHZmNjRPZmZzZXQ6ZmxhdGJ1ZmZlcnMuT2Zmc2V0KSB7CisgIGJ1aWxkZXIuYWRkRmllbGRPZmZzZXQoMTEsIHZmNjRPZmZzZXQsIDApOworfQorCitzdGF0aWMgY3JlYXRlVmY2NFZlY3RvcihidWlsZGVyOmZsYXRidWZmZXJzLkJ1aWxkZXIsIGRhdGE6bnVtYmVyW118RmxvYXQ2NEFycmF5KTpmbGF0YnVmZmVycy5PZmZzZXQ7CisvKioKKyAqIEBkZXByZWNhdGVkIFRoaXMgVWludDhBcnJheSBvdmVybG9hZCB3aWxsIGJlIHJlbW92ZWQgaW4gdGhlIGZ1dHVyZS4KKyAqLworc3RhdGljIGNyZWF0ZVZmNjRWZWN0b3IoYnVpbGRlcjpmbGF0YnVmZmVycy5CdWlsZGVyLCBkYXRhOm51bWJlcltdfFVpbnQ4QXJyYXkpOmZsYXRidWZmZXJzLk9mZnNldDsKK3N0YXRpYyBjcmVhdGVWZjY0VmVjdG9yKGJ1aWxkZXI6ZmxhdGJ1ZmZlcnMuQnVpbGRlciwgZGF0YTpudW1iZXJbXXxGbG9hdDY0QXJyYXl8VWludDhBcnJheSk6ZmxhdGJ1ZmZlcnMuT2Zmc2V0IHsKKyAgYnVpbGRlci5zdGFydFZlY3Rvcig4LCBkYXRhLmxlbmd0aCwgOCk7CisgIGZvciAobGV0IGkgPSBkYXRhLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7CisgICAgYnVpbGRlci5hZGRGbG9hdDY0KGRhdGFbaV0hKTsKKyAgfQorICByZXR1cm4gYnVpbGRlci5lbmRWZWN0b3IoKTsKK30KKworc3RhdGljIHN0YXJ0VmY2NFZlY3RvcihidWlsZGVyOmZsYXRidWZmZXJzLkJ1aWxkZXIsIG51bUVsZW1zOm51bWJlcikgeworICBidWlsZGVyLnN0YXJ0VmVjdG9yKDgsIG51bUVsZW1zLCA4KTsKK30KKworc3RhdGljIGVuZFR5cGVBbGlhc2VzKGJ1aWxkZXI6ZmxhdGJ1ZmZlcnMuQnVpbGRlcik6ZmxhdGJ1ZmZlcnMuT2Zmc2V0IHsKKyAgY29uc3Qgb2Zmc2V0ID0gYnVpbGRlci5lbmRPYmplY3QoKTsKKyAgcmV0dXJuIG9mZnNldDsKK30KKworc3RhdGljIGNyZWF0ZVR5cGVBbGlhc2VzKGJ1aWxkZXI6ZmxhdGJ1ZmZlcnMuQnVpbGRlciwgaTg6bnVtYmVyLCB1ODpudW1iZXIsIGkxNjpudW1iZXIsIHUxNjpudW1iZXIsIGkzMjpudW1iZXIsIHUzMjpudW1iZXIsIGk2NDpiaWdpbnQsIHU2NDpiaWdpbnQsIGYzMjpudW1iZXIsIGY2NDpudW1iZXIsIHY4T2Zmc2V0OmZsYXRidWZmZXJzLk9mZnNldCwgdmY2NE9mZnNldDpmbGF0YnVmZmVycy5PZmZzZXQpOmZsYXRidWZmZXJzLk9mZnNldCB7CisgIE15R2FtZV9FeGFtcGxlX1R5cGVBbGlhc2VzLnN0YXJ0VHlwZUFsaWFzZXMoYnVpbGRlcik7CisgIE15R2FtZV9FeGFtcGxlX1R5cGVBbGlhc2VzLmFkZEk4KGJ1aWxkZXIsIGk4KTsKKyAgTXlHYW1lX0V4YW1wbGVfVHlwZUFsaWFzZXMuYWRkVTgoYnVpbGRlciwgdTgpOworICBNeUdhbWVfRXhhbXBsZV9UeXBlQWxpYXNlcy5hZGRJMTYoYnVpbGRlciwgaTE2KTsKKyAgTXlHYW1lX0V4YW1wbGVfVHlwZUFsaWFzZXMuYWRkVTE2KGJ1aWxkZXIsIHUxNik7CisgIE15R2FtZV9FeGFtcGxlX1R5cGVBbGlhc2VzLmFkZEkzMihidWlsZGVyLCBpMzIpOworICBNeUdhbWVfRXhhbXBsZV9UeXBlQWxpYXNlcy5hZGRVMzIoYnVpbGRlciwgdTMyKTsKKyAgTXlHYW1lX0V4YW1wbGVfVHlwZUFsaWFzZXMuYWRkSTY0KGJ1aWxkZXIsIGk2NCk7CisgIE15R2FtZV9FeGFtcGxlX1R5cGVBbGlhc2VzLmFkZFU2NChidWlsZGVyLCB1NjQpOworICBNeUdhbWVfRXhhbXBsZV9UeXBlQWxpYXNlcy5hZGRGMzIoYnVpbGRlciwgZjMyKTsKKyAgTXlHYW1lX0V4YW1wbGVfVHlwZUFsaWFzZXMuYWRkRjY0KGJ1aWxkZXIsIGY2NCk7CisgIE15R2FtZV9FeGFtcGxlX1R5cGVBbGlhc2VzLmFkZFY4KGJ1aWxkZXIsIHY4T2Zmc2V0KTsKKyAgTXlHYW1lX0V4YW1wbGVfVHlwZUFsaWFzZXMuYWRkVmY2NChidWlsZGVyLCB2ZjY0T2Zmc2V0KTsKKyAgcmV0dXJuIE15R2FtZV9FeGFtcGxlX1R5cGVBbGlhc2VzLmVuZFR5cGVBbGlhc2VzKGJ1aWxkZXIpOworfQorCitzZXJpYWxpemUoKTpVaW50OEFycmF5IHsKKyAgcmV0dXJuIHRoaXMuYmIhLmJ5dGVzKCk7Cit9CisKK3N0YXRpYyBkZXNlcmlhbGl6ZShidWZmZXI6IFVpbnQ4QXJyYXkpOlR5cGVBbGlhc2VzIHsKKyAgcmV0dXJuIE15R2FtZV9FeGFtcGxlX1R5cGVBbGlhc2VzLmdldFJvb3RBc1R5cGVBbGlhc2VzKG5ldyBmbGF0YnVmZmVycy5CeXRlQnVmZmVyKGJ1ZmZlcikpCit9Cit9CisKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL3RzY29uZmlnLmpzb24gYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy90cy90c2NvbmZpZy5qc29uCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSB0aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy90c2NvbmZpZy5qc29uCnJlbmFtZSB0byB0aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy90cy90c2NvbmZpZy5qc29uCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy90cy90eXBlc2NyaXB0L2NsYXNzLmpzIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvdHMvdHlwZXNjcmlwdC9jbGFzcy5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YjBmMmMwCi0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvdHMvdHlwZXNjcmlwdC9jbGFzcy5qcwpAQCAtMCwwICsxLDYgQEAKKy8vIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGJ5IHRoZSBGbGF0QnVmZmVycyBjb21waWxlciwgZG8gbm90IG1vZGlmeQorZXhwb3J0IHZhciBjbGFzc187CisoZnVuY3Rpb24gKGNsYXNzXykgeworICAgIGNsYXNzX1tjbGFzc19bIm5ld18iXSA9IDBdID0gIm5ld18iOworICAgIGNsYXNzX1tjbGFzc19bImluc3RhbmNlb2ZfIl0gPSAxXSA9ICJpbnN0YW5jZW9mXyI7Cit9KShjbGFzc18gfHwgKGNsYXNzXyA9IHt9KSk7CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy90cy90eXBlc2NyaXB0L2NsYXNzLnRzIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvdHMvdHlwZXNjcmlwdC9jbGFzcy50cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZDhmMTQ1Ci0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvdHMvdHlwZXNjcmlwdC9jbGFzcy50cwpAQCAtMCwwICsxLDYgQEAKKy8vIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGJ5IHRoZSBGbGF0QnVmZmVycyBjb21waWxlciwgZG8gbm90IG1vZGlmeQorCitleHBvcnQgZW51bSBjbGFzc18geworICBuZXdfID0gMCwKKyAgaW5zdGFuY2VvZl8gPSAxCit9CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy90cy90eXBlc2NyaXB0L29iamVjdC5qcyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL3RzL3R5cGVzY3JpcHQvb2JqZWN0LmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA1ZmZiMWEKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy90cy90eXBlc2NyaXB0L29iamVjdC5qcwpAQCAtMCwwICsxLDE2NiBAQAorLy8gYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgYnkgdGhlIEZsYXRCdWZmZXJzIGNvbXBpbGVyLCBkbyBub3QgbW9kaWZ5CitpbXBvcnQgKiBhcyBmbGF0YnVmZmVycyBmcm9tICdmbGF0YnVmZmVycyc7CitpbXBvcnQgeyBBYmMgfSBmcm9tICcuLi9mb29iYXIvYWJjLmpzJzsKK2ltcG9ydCB7IGNsYXNzXyBhcyBmb29iYXJfY2xhc3NfIH0gZnJvbSAnLi4vZm9vYmFyL2NsYXNzLmpzJzsKK2ltcG9ydCB7IFNjaGVtYSB9IGZyb20gJy4uL3JlZmxlY3Rpb24vc2NoZW1hLmpzJzsKK2ltcG9ydCB7IGNsYXNzXyB9IGZyb20gJy4uL3R5cGVzY3JpcHQvY2xhc3MuanMnOworZXhwb3J0IGNsYXNzIE9iamVjdF8geworICAgIGNvbnN0cnVjdG9yKCkgeworICAgICAgICB0aGlzLmJiID0gbnVsbDsKKyAgICAgICAgdGhpcy5iYl9wb3MgPSAwOworICAgIH0KKyAgICBfX2luaXQoaSwgYmIpIHsKKyAgICAgICAgdGhpcy5iYl9wb3MgPSBpOworICAgICAgICB0aGlzLmJiID0gYmI7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKyAgICBzdGF0aWMgZ2V0Um9vdEFzT2JqZWN0KGJiLCBvYmopIHsKKyAgICAgICAgcmV0dXJuIChvYmogfHwgbmV3IE9iamVjdF8oKSkuX19pbml0KGJiLnJlYWRJbnQzMihiYi5wb3NpdGlvbigpKSArIGJiLnBvc2l0aW9uKCksIGJiKTsKKyAgICB9CisgICAgc3RhdGljIGdldFNpemVQcmVmaXhlZFJvb3RBc09iamVjdChiYiwgb2JqKSB7CisgICAgICAgIGJiLnNldFBvc2l0aW9uKGJiLnBvc2l0aW9uKCkgKyBmbGF0YnVmZmVycy5TSVpFX1BSRUZJWF9MRU5HVEgpOworICAgICAgICByZXR1cm4gKG9iaiB8fCBuZXcgT2JqZWN0XygpKS5fX2luaXQoYmIucmVhZEludDMyKGJiLnBvc2l0aW9uKCkpICsgYmIucG9zaXRpb24oKSwgYmIpOworICAgIH0KKyAgICByZXR1cm5fKCkgeworICAgICAgICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCA0KTsKKyAgICAgICAgcmV0dXJuIG9mZnNldCA/IHRoaXMuYmIucmVhZEludDMyKHRoaXMuYmJfcG9zICsgb2Zmc2V0KSA6IDA7CisgICAgfQorICAgIG11dGF0ZV9yZXR1cm4odmFsdWUpIHsKKyAgICAgICAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywgNCk7CisgICAgICAgIGlmIChvZmZzZXQgPT09IDApIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICB0aGlzLmJiLndyaXRlSW50MzIodGhpcy5iYl9wb3MgKyBvZmZzZXQsIHZhbHVlKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIGlmXygpIHsKKyAgICAgICAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywgNik7CisgICAgICAgIHJldHVybiBvZmZzZXQgPyB0aGlzLmJiLnJlYWRJbnQzMih0aGlzLmJiX3BvcyArIG9mZnNldCkgOiAwOworICAgIH0KKyAgICBtdXRhdGVfaWYodmFsdWUpIHsKKyAgICAgICAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywgNik7CisgICAgICAgIGlmIChvZmZzZXQgPT09IDApIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICB0aGlzLmJiLndyaXRlSW50MzIodGhpcy5iYl9wb3MgKyBvZmZzZXQsIHZhbHVlKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIHN3aXRjaF8oKSB7CisgICAgICAgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsIDgpOworICAgICAgICByZXR1cm4gb2Zmc2V0ID8gdGhpcy5iYi5yZWFkSW50MzIodGhpcy5iYl9wb3MgKyBvZmZzZXQpIDogMDsKKyAgICB9CisgICAgbXV0YXRlX3N3aXRjaCh2YWx1ZSkgeworICAgICAgICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCA4KTsKKyAgICAgICAgaWYgKG9mZnNldCA9PT0gMCkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIHRoaXMuYmIud3JpdGVJbnQzMih0aGlzLmJiX3BvcyArIG9mZnNldCwgdmFsdWUpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgZW51bV8oKSB7CisgICAgICAgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsIDEwKTsKKyAgICAgICAgcmV0dXJuIG9mZnNldCA/IHRoaXMuYmIucmVhZEludDMyKHRoaXMuYmJfcG9zICsgb2Zmc2V0KSA6IGNsYXNzXy5uZXdfOworICAgIH0KKyAgICBtdXRhdGVfZW51bSh2YWx1ZSkgeworICAgICAgICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCAxMCk7CisgICAgICAgIGlmIChvZmZzZXQgPT09IDApIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICB0aGlzLmJiLndyaXRlSW50MzIodGhpcy5iYl9wb3MgKyBvZmZzZXQsIHZhbHVlKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIGVudW0yKCkgeworICAgICAgICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCAxMik7CisgICAgICAgIHJldHVybiBvZmZzZXQgPyB0aGlzLmJiLnJlYWRJbnQzMih0aGlzLmJiX3BvcyArIG9mZnNldCkgOiBmb29iYXJfY2xhc3NfLmFyZ3VtZW50c187CisgICAgfQorICAgIG11dGF0ZV9lbnVtMih2YWx1ZSkgeworICAgICAgICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCAxMik7CisgICAgICAgIGlmIChvZmZzZXQgPT09IDApIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICB0aGlzLmJiLndyaXRlSW50MzIodGhpcy5iYl9wb3MgKyBvZmZzZXQsIHZhbHVlKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIGVudW0zKCkgeworICAgICAgICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCAxNCk7CisgICAgICAgIHJldHVybiBvZmZzZXQgPyB0aGlzLmJiLnJlYWRJbnQzMih0aGlzLmJiX3BvcyArIG9mZnNldCkgOiBBYmMuYTsKKyAgICB9CisgICAgbXV0YXRlX2VudW0zKHZhbHVlKSB7CisgICAgICAgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsIDE0KTsKKyAgICAgICAgaWYgKG9mZnNldCA9PT0gMCkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIHRoaXMuYmIud3JpdGVJbnQzMih0aGlzLmJiX3BvcyArIG9mZnNldCwgdmFsdWUpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgcmVmbGVjdChvYmopIHsKKyAgICAgICAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywgMTYpOworICAgICAgICByZXR1cm4gb2Zmc2V0ID8gKG9iaiB8fCBuZXcgU2NoZW1hKCkpLl9faW5pdCh0aGlzLmJiLl9faW5kaXJlY3QodGhpcy5iYl9wb3MgKyBvZmZzZXQpLCB0aGlzLmJiKSA6IG51bGw7CisgICAgfQorICAgIHN0YXRpYyBnZXRGdWxseVF1YWxpZmllZE5hbWUoKSB7CisgICAgICAgIHJldHVybiAndHlwZXNjcmlwdF9PYmplY3QnOworICAgIH0KKyAgICBzdGF0aWMgc3RhcnRPYmplY3QoYnVpbGRlcikgeworICAgICAgICBidWlsZGVyLnN0YXJ0T2JqZWN0KDcpOworICAgIH0KKyAgICBzdGF0aWMgYWRkUmV0dXJuKGJ1aWxkZXIsIHJldHVybl8pIHsKKyAgICAgICAgYnVpbGRlci5hZGRGaWVsZEludDMyKDAsIHJldHVybl8sIDApOworICAgIH0KKyAgICBzdGF0aWMgYWRkSWYoYnVpbGRlciwgaWZfKSB7CisgICAgICAgIGJ1aWxkZXIuYWRkRmllbGRJbnQzMigxLCBpZl8sIDApOworICAgIH0KKyAgICBzdGF0aWMgYWRkU3dpdGNoKGJ1aWxkZXIsIHN3aXRjaF8pIHsKKyAgICAgICAgYnVpbGRlci5hZGRGaWVsZEludDMyKDIsIHN3aXRjaF8sIDApOworICAgIH0KKyAgICBzdGF0aWMgYWRkRW51bShidWlsZGVyLCBlbnVtXykgeworICAgICAgICBidWlsZGVyLmFkZEZpZWxkSW50MzIoMywgZW51bV8sIGNsYXNzXy5uZXdfKTsKKyAgICB9CisgICAgc3RhdGljIGFkZEVudW0yKGJ1aWxkZXIsIGVudW0yKSB7CisgICAgICAgIGJ1aWxkZXIuYWRkRmllbGRJbnQzMig0LCBlbnVtMiwgZm9vYmFyX2NsYXNzXy5hcmd1bWVudHNfKTsKKyAgICB9CisgICAgc3RhdGljIGFkZEVudW0zKGJ1aWxkZXIsIGVudW0zKSB7CisgICAgICAgIGJ1aWxkZXIuYWRkRmllbGRJbnQzMig1LCBlbnVtMywgQWJjLmEpOworICAgIH0KKyAgICBzdGF0aWMgYWRkUmVmbGVjdChidWlsZGVyLCByZWZsZWN0T2Zmc2V0KSB7CisgICAgICAgIGJ1aWxkZXIuYWRkRmllbGRPZmZzZXQoNiwgcmVmbGVjdE9mZnNldCwgMCk7CisgICAgfQorICAgIHN0YXRpYyBlbmRPYmplY3QoYnVpbGRlcikgeworICAgICAgICBjb25zdCBvZmZzZXQgPSBidWlsZGVyLmVuZE9iamVjdCgpOworICAgICAgICByZXR1cm4gb2Zmc2V0OworICAgIH0KKyAgICB1bnBhY2soKSB7CisgICAgICAgIHJldHVybiBuZXcgT2JqZWN0X1QodGhpcy5yZXR1cm5fKCksIHRoaXMuaWZfKCksIHRoaXMuc3dpdGNoXygpLCB0aGlzLmVudW1fKCksIHRoaXMuZW51bTIoKSwgdGhpcy5lbnVtMygpLCAodGhpcy5yZWZsZWN0KCkgIT09IG51bGwgPyB0aGlzLnJlZmxlY3QoKS51bnBhY2soKSA6IG51bGwpKTsKKyAgICB9CisgICAgdW5wYWNrVG8oX28pIHsKKyAgICAgICAgX28ucmV0dXJuXyA9IHRoaXMucmV0dXJuXygpOworICAgICAgICBfby5pZl8gPSB0aGlzLmlmXygpOworICAgICAgICBfby5zd2l0Y2hfID0gdGhpcy5zd2l0Y2hfKCk7CisgICAgICAgIF9vLmVudW1fID0gdGhpcy5lbnVtXygpOworICAgICAgICBfby5lbnVtMiA9IHRoaXMuZW51bTIoKTsKKyAgICAgICAgX28uZW51bTMgPSB0aGlzLmVudW0zKCk7CisgICAgICAgIF9vLnJlZmxlY3QgPSAodGhpcy5yZWZsZWN0KCkgIT09IG51bGwgPyB0aGlzLnJlZmxlY3QoKS51bnBhY2soKSA6IG51bGwpOworICAgIH0KK30KK2V4cG9ydCBjbGFzcyBPYmplY3RfVCB7CisgICAgY29uc3RydWN0b3IocmV0dXJuXyA9IDAsIGlmXyA9IDAsIHN3aXRjaF8gPSAwLCBlbnVtXyA9IGNsYXNzXy5uZXdfLCBlbnVtMiA9IGZvb2Jhcl9jbGFzc18uYXJndW1lbnRzXywgZW51bTMgPSBBYmMuYSwgcmVmbGVjdCA9IG51bGwpIHsKKyAgICAgICAgdGhpcy5yZXR1cm5fID0gcmV0dXJuXzsKKyAgICAgICAgdGhpcy5pZl8gPSBpZl87CisgICAgICAgIHRoaXMuc3dpdGNoXyA9IHN3aXRjaF87CisgICAgICAgIHRoaXMuZW51bV8gPSBlbnVtXzsKKyAgICAgICAgdGhpcy5lbnVtMiA9IGVudW0yOworICAgICAgICB0aGlzLmVudW0zID0gZW51bTM7CisgICAgICAgIHRoaXMucmVmbGVjdCA9IHJlZmxlY3Q7CisgICAgfQorICAgIHBhY2soYnVpbGRlcikgeworICAgICAgICBjb25zdCByZWZsZWN0ID0gKHRoaXMucmVmbGVjdCAhPT0gbnVsbCA/IHRoaXMucmVmbGVjdC5wYWNrKGJ1aWxkZXIpIDogMCk7CisgICAgICAgIE9iamVjdF8uc3RhcnRPYmplY3QoYnVpbGRlcik7CisgICAgICAgIE9iamVjdF8uYWRkUmV0dXJuKGJ1aWxkZXIsIHRoaXMucmV0dXJuXyk7CisgICAgICAgIE9iamVjdF8uYWRkSWYoYnVpbGRlciwgdGhpcy5pZl8pOworICAgICAgICBPYmplY3RfLmFkZFN3aXRjaChidWlsZGVyLCB0aGlzLnN3aXRjaF8pOworICAgICAgICBPYmplY3RfLmFkZEVudW0oYnVpbGRlciwgdGhpcy5lbnVtXyk7CisgICAgICAgIE9iamVjdF8uYWRkRW51bTIoYnVpbGRlciwgdGhpcy5lbnVtMik7CisgICAgICAgIE9iamVjdF8uYWRkRW51bTMoYnVpbGRlciwgdGhpcy5lbnVtMyk7CisgICAgICAgIE9iamVjdF8uYWRkUmVmbGVjdChidWlsZGVyLCByZWZsZWN0KTsKKyAgICAgICAgcmV0dXJuIE9iamVjdF8uZW5kT2JqZWN0KGJ1aWxkZXIpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL3RzL3R5cGVzY3JpcHQvb2JqZWN0LnRzIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvdHMvdHlwZXNjcmlwdC9vYmplY3QudHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDQxYjY2MAotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL3RzL3R5cGVzY3JpcHQvb2JqZWN0LnRzCkBAIC0wLDAgKzEsMjIyIEBACisvLyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBieSB0aGUgRmxhdEJ1ZmZlcnMgY29tcGlsZXIsIGRvIG5vdCBtb2RpZnkKKworaW1wb3J0ICogYXMgZmxhdGJ1ZmZlcnMgZnJvbSAnZmxhdGJ1ZmZlcnMnOworCitpbXBvcnQgeyBBYmMgfSBmcm9tICcuLi9mb29iYXIvYWJjLmpzJzsKK2ltcG9ydCB7IGNsYXNzXyBhcyBmb29iYXJfY2xhc3NfIH0gZnJvbSAnLi4vZm9vYmFyL2NsYXNzLmpzJzsKK2ltcG9ydCB7IFNjaGVtYSwgU2NoZW1hVCB9IGZyb20gJy4uL3JlZmxlY3Rpb24vc2NoZW1hLmpzJzsKK2ltcG9ydCB7IGNsYXNzXyB9IGZyb20gJy4uL3R5cGVzY3JpcHQvY2xhc3MuanMnOworCisKK2V4cG9ydCBjbGFzcyBPYmplY3RfIHsKKyAgYmI6IGZsYXRidWZmZXJzLkJ5dGVCdWZmZXJ8bnVsbCA9IG51bGw7CisgIGJiX3BvcyA9IDA7CisgIF9faW5pdChpOm51bWJlciwgYmI6ZmxhdGJ1ZmZlcnMuQnl0ZUJ1ZmZlcik6T2JqZWN0XyB7CisgIHRoaXMuYmJfcG9zID0gaTsKKyAgdGhpcy5iYiA9IGJiOworICByZXR1cm4gdGhpczsKK30KKworc3RhdGljIGdldFJvb3RBc09iamVjdChiYjpmbGF0YnVmZmVycy5CeXRlQnVmZmVyLCBvYmo/Ok9iamVjdF8pOk9iamVjdF8geworICByZXR1cm4gKG9iaiB8fCBuZXcgT2JqZWN0XygpKS5fX2luaXQoYmIucmVhZEludDMyKGJiLnBvc2l0aW9uKCkpICsgYmIucG9zaXRpb24oKSwgYmIpOworfQorCitzdGF0aWMgZ2V0U2l6ZVByZWZpeGVkUm9vdEFzT2JqZWN0KGJiOmZsYXRidWZmZXJzLkJ5dGVCdWZmZXIsIG9iaj86T2JqZWN0Xyk6T2JqZWN0XyB7CisgIGJiLnNldFBvc2l0aW9uKGJiLnBvc2l0aW9uKCkgKyBmbGF0YnVmZmVycy5TSVpFX1BSRUZJWF9MRU5HVEgpOworICByZXR1cm4gKG9iaiB8fCBuZXcgT2JqZWN0XygpKS5fX2luaXQoYmIucmVhZEludDMyKGJiLnBvc2l0aW9uKCkpICsgYmIucG9zaXRpb24oKSwgYmIpOworfQorCityZXR1cm5fKCk6bnVtYmVyIHsKKyAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYiEuX19vZmZzZXQodGhpcy5iYl9wb3MsIDQpOworICByZXR1cm4gb2Zmc2V0ID8gdGhpcy5iYiEucmVhZEludDMyKHRoaXMuYmJfcG9zICsgb2Zmc2V0KSA6IDA7Cit9CisKK211dGF0ZV9yZXR1cm4odmFsdWU6bnVtYmVyKTpib29sZWFuIHsKKyAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYiEuX19vZmZzZXQodGhpcy5iYl9wb3MsIDQpOworCisgIGlmIChvZmZzZXQgPT09IDApIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICB0aGlzLmJiIS53cml0ZUludDMyKHRoaXMuYmJfcG9zICsgb2Zmc2V0LCB2YWx1ZSk7CisgIHJldHVybiB0cnVlOworfQorCitpZl8oKTpudW1iZXIgeworICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiIS5fX29mZnNldCh0aGlzLmJiX3BvcywgNik7CisgIHJldHVybiBvZmZzZXQgPyB0aGlzLmJiIS5yZWFkSW50MzIodGhpcy5iYl9wb3MgKyBvZmZzZXQpIDogMDsKK30KKworbXV0YXRlX2lmKHZhbHVlOm51bWJlcik6Ym9vbGVhbiB7CisgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIhLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCA2KTsKKworICBpZiAob2Zmc2V0ID09PSAwKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgdGhpcy5iYiEud3JpdGVJbnQzMih0aGlzLmJiX3BvcyArIG9mZnNldCwgdmFsdWUpOworICByZXR1cm4gdHJ1ZTsKK30KKworc3dpdGNoXygpOm51bWJlciB7CisgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIhLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCA4KTsKKyAgcmV0dXJuIG9mZnNldCA/IHRoaXMuYmIhLnJlYWRJbnQzMih0aGlzLmJiX3BvcyArIG9mZnNldCkgOiAwOworfQorCittdXRhdGVfc3dpdGNoKHZhbHVlOm51bWJlcik6Ym9vbGVhbiB7CisgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIhLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCA4KTsKKworICBpZiAob2Zmc2V0ID09PSAwKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgdGhpcy5iYiEud3JpdGVJbnQzMih0aGlzLmJiX3BvcyArIG9mZnNldCwgdmFsdWUpOworICByZXR1cm4gdHJ1ZTsKK30KKworZW51bV8oKTpjbGFzc18geworICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiIS5fX29mZnNldCh0aGlzLmJiX3BvcywgMTApOworICByZXR1cm4gb2Zmc2V0ID8gdGhpcy5iYiEucmVhZEludDMyKHRoaXMuYmJfcG9zICsgb2Zmc2V0KSA6IGNsYXNzXy5uZXdfOworfQorCittdXRhdGVfZW51bSh2YWx1ZTpjbGFzc18pOmJvb2xlYW4geworICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiIS5fX29mZnNldCh0aGlzLmJiX3BvcywgMTApOworCisgIGlmIChvZmZzZXQgPT09IDApIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICB0aGlzLmJiIS53cml0ZUludDMyKHRoaXMuYmJfcG9zICsgb2Zmc2V0LCB2YWx1ZSk7CisgIHJldHVybiB0cnVlOworfQorCitlbnVtMigpOmZvb2Jhcl9jbGFzc18geworICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiIS5fX29mZnNldCh0aGlzLmJiX3BvcywgMTIpOworICByZXR1cm4gb2Zmc2V0ID8gdGhpcy5iYiEucmVhZEludDMyKHRoaXMuYmJfcG9zICsgb2Zmc2V0KSA6IGZvb2Jhcl9jbGFzc18uYXJndW1lbnRzXzsKK30KKworbXV0YXRlX2VudW0yKHZhbHVlOmZvb2Jhcl9jbGFzc18pOmJvb2xlYW4geworICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiIS5fX29mZnNldCh0aGlzLmJiX3BvcywgMTIpOworCisgIGlmIChvZmZzZXQgPT09IDApIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICB0aGlzLmJiIS53cml0ZUludDMyKHRoaXMuYmJfcG9zICsgb2Zmc2V0LCB2YWx1ZSk7CisgIHJldHVybiB0cnVlOworfQorCitlbnVtMygpOkFiYyB7CisgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIhLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCAxNCk7CisgIHJldHVybiBvZmZzZXQgPyB0aGlzLmJiIS5yZWFkSW50MzIodGhpcy5iYl9wb3MgKyBvZmZzZXQpIDogQWJjLmE7Cit9CisKK211dGF0ZV9lbnVtMyh2YWx1ZTpBYmMpOmJvb2xlYW4geworICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiIS5fX29mZnNldCh0aGlzLmJiX3BvcywgMTQpOworCisgIGlmIChvZmZzZXQgPT09IDApIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICB0aGlzLmJiIS53cml0ZUludDMyKHRoaXMuYmJfcG9zICsgb2Zmc2V0LCB2YWx1ZSk7CisgIHJldHVybiB0cnVlOworfQorCityZWZsZWN0KG9iaj86U2NoZW1hKTpTY2hlbWF8bnVsbCB7CisgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIhLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCAxNik7CisgIHJldHVybiBvZmZzZXQgPyAob2JqIHx8IG5ldyBTY2hlbWEoKSkuX19pbml0KHRoaXMuYmIhLl9faW5kaXJlY3QodGhpcy5iYl9wb3MgKyBvZmZzZXQpLCB0aGlzLmJiISkgOiBudWxsOworfQorCitzdGF0aWMgZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCk6c3RyaW5nIHsKKyAgcmV0dXJuICd0eXBlc2NyaXB0X09iamVjdCc7Cit9CisKK3N0YXRpYyBzdGFydE9iamVjdChidWlsZGVyOmZsYXRidWZmZXJzLkJ1aWxkZXIpIHsKKyAgYnVpbGRlci5zdGFydE9iamVjdCg3KTsKK30KKworc3RhdGljIGFkZFJldHVybihidWlsZGVyOmZsYXRidWZmZXJzLkJ1aWxkZXIsIHJldHVybl86bnVtYmVyKSB7CisgIGJ1aWxkZXIuYWRkRmllbGRJbnQzMigwLCByZXR1cm5fLCAwKTsKK30KKworc3RhdGljIGFkZElmKGJ1aWxkZXI6ZmxhdGJ1ZmZlcnMuQnVpbGRlciwgaWZfOm51bWJlcikgeworICBidWlsZGVyLmFkZEZpZWxkSW50MzIoMSwgaWZfLCAwKTsKK30KKworc3RhdGljIGFkZFN3aXRjaChidWlsZGVyOmZsYXRidWZmZXJzLkJ1aWxkZXIsIHN3aXRjaF86bnVtYmVyKSB7CisgIGJ1aWxkZXIuYWRkRmllbGRJbnQzMigyLCBzd2l0Y2hfLCAwKTsKK30KKworc3RhdGljIGFkZEVudW0oYnVpbGRlcjpmbGF0YnVmZmVycy5CdWlsZGVyLCBlbnVtXzpjbGFzc18pIHsKKyAgYnVpbGRlci5hZGRGaWVsZEludDMyKDMsIGVudW1fLCBjbGFzc18ubmV3Xyk7Cit9CisKK3N0YXRpYyBhZGRFbnVtMihidWlsZGVyOmZsYXRidWZmZXJzLkJ1aWxkZXIsIGVudW0yOmZvb2Jhcl9jbGFzc18pIHsKKyAgYnVpbGRlci5hZGRGaWVsZEludDMyKDQsIGVudW0yLCBmb29iYXJfY2xhc3NfLmFyZ3VtZW50c18pOworfQorCitzdGF0aWMgYWRkRW51bTMoYnVpbGRlcjpmbGF0YnVmZmVycy5CdWlsZGVyLCBlbnVtMzpBYmMpIHsKKyAgYnVpbGRlci5hZGRGaWVsZEludDMyKDUsIGVudW0zLCBBYmMuYSk7Cit9CisKK3N0YXRpYyBhZGRSZWZsZWN0KGJ1aWxkZXI6ZmxhdGJ1ZmZlcnMuQnVpbGRlciwgcmVmbGVjdE9mZnNldDpmbGF0YnVmZmVycy5PZmZzZXQpIHsKKyAgYnVpbGRlci5hZGRGaWVsZE9mZnNldCg2LCByZWZsZWN0T2Zmc2V0LCAwKTsKK30KKworc3RhdGljIGVuZE9iamVjdChidWlsZGVyOmZsYXRidWZmZXJzLkJ1aWxkZXIpOmZsYXRidWZmZXJzLk9mZnNldCB7CisgIGNvbnN0IG9mZnNldCA9IGJ1aWxkZXIuZW5kT2JqZWN0KCk7CisgIHJldHVybiBvZmZzZXQ7Cit9CisKKwordW5wYWNrKCk6IE9iamVjdF9UIHsKKyAgcmV0dXJuIG5ldyBPYmplY3RfVCgKKyAgICB0aGlzLnJldHVybl8oKSwKKyAgICB0aGlzLmlmXygpLAorICAgIHRoaXMuc3dpdGNoXygpLAorICAgIHRoaXMuZW51bV8oKSwKKyAgICB0aGlzLmVudW0yKCksCisgICAgdGhpcy5lbnVtMygpLAorICAgICh0aGlzLnJlZmxlY3QoKSAhPT0gbnVsbCA/IHRoaXMucmVmbGVjdCgpIS51bnBhY2soKSA6IG51bGwpCisgICk7Cit9CisKKwordW5wYWNrVG8oX286IE9iamVjdF9UKTogdm9pZCB7CisgIF9vLnJldHVybl8gPSB0aGlzLnJldHVybl8oKTsKKyAgX28uaWZfID0gdGhpcy5pZl8oKTsKKyAgX28uc3dpdGNoXyA9IHRoaXMuc3dpdGNoXygpOworICBfby5lbnVtXyA9IHRoaXMuZW51bV8oKTsKKyAgX28uZW51bTIgPSB0aGlzLmVudW0yKCk7CisgIF9vLmVudW0zID0gdGhpcy5lbnVtMygpOworICBfby5yZWZsZWN0ID0gKHRoaXMucmVmbGVjdCgpICE9PSBudWxsID8gdGhpcy5yZWZsZWN0KCkhLnVucGFjaygpIDogbnVsbCk7Cit9Cit9CisKK2V4cG9ydCBjbGFzcyBPYmplY3RfVCB7Citjb25zdHJ1Y3RvcigKKyAgcHVibGljIHJldHVybl86IG51bWJlciA9IDAsCisgIHB1YmxpYyBpZl86IG51bWJlciA9IDAsCisgIHB1YmxpYyBzd2l0Y2hfOiBudW1iZXIgPSAwLAorICBwdWJsaWMgZW51bV86IGNsYXNzXyA9IGNsYXNzXy5uZXdfLAorICBwdWJsaWMgZW51bTI6IGZvb2Jhcl9jbGFzc18gPSBmb29iYXJfY2xhc3NfLmFyZ3VtZW50c18sCisgIHB1YmxpYyBlbnVtMzogQWJjID0gQWJjLmEsCisgIHB1YmxpYyByZWZsZWN0OiBTY2hlbWFUfG51bGwgPSBudWxsCispe30KKworCitwYWNrKGJ1aWxkZXI6ZmxhdGJ1ZmZlcnMuQnVpbGRlcik6IGZsYXRidWZmZXJzLk9mZnNldCB7CisgIGNvbnN0IHJlZmxlY3QgPSAodGhpcy5yZWZsZWN0ICE9PSBudWxsID8gdGhpcy5yZWZsZWN0IS5wYWNrKGJ1aWxkZXIpIDogMCk7CisKKyAgT2JqZWN0Xy5zdGFydE9iamVjdChidWlsZGVyKTsKKyAgT2JqZWN0Xy5hZGRSZXR1cm4oYnVpbGRlciwgdGhpcy5yZXR1cm5fKTsKKyAgT2JqZWN0Xy5hZGRJZihidWlsZGVyLCB0aGlzLmlmXyk7CisgIE9iamVjdF8uYWRkU3dpdGNoKGJ1aWxkZXIsIHRoaXMuc3dpdGNoXyk7CisgIE9iamVjdF8uYWRkRW51bShidWlsZGVyLCB0aGlzLmVudW1fKTsKKyAgT2JqZWN0Xy5hZGRFbnVtMihidWlsZGVyLCB0aGlzLmVudW0yKTsKKyAgT2JqZWN0Xy5hZGRFbnVtMyhidWlsZGVyLCB0aGlzLmVudW0zKTsKKyAgT2JqZWN0Xy5hZGRSZWZsZWN0KGJ1aWxkZXIsIHJlZmxlY3QpOworCisgIHJldHVybiBPYmplY3RfLmVuZE9iamVjdChidWlsZGVyKTsKK30KK30KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL3RzL3R5cGVzY3JpcHRfaW5jbHVkZV9nZW5lcmF0ZWQuanMgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy90cy90eXBlc2NyaXB0X2luY2x1ZGVfZ2VuZXJhdGVkLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUwZTFkZjEKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy90cy90eXBlc2NyaXB0X2luY2x1ZGVfZ2VuZXJhdGVkLmpzCkBAIC0wLDAgKzEsNSBAQAorLy8gYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgYnkgdGhlIEZsYXRCdWZmZXJzIGNvbXBpbGVyLCBkbyBub3QgbW9kaWZ5CitleHBvcnQgdmFyIGNsYXNzXzsKKyhmdW5jdGlvbiAoY2xhc3NfKSB7CisgICAgY2xhc3NfW2NsYXNzX1siYXJndW1lbnRzXyJdID0gMF0gPSAiYXJndW1lbnRzXyI7Cit9KShjbGFzc18gfHwgKGNsYXNzXyA9IHt9KSk7CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy90cy90eXBlc2NyaXB0X2luY2x1ZGVfZ2VuZXJhdGVkLnRzIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvdHMvdHlwZXNjcmlwdF9pbmNsdWRlX2dlbmVyYXRlZC50cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNDE5NDMxCi0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvdHMvdHlwZXNjcmlwdF9pbmNsdWRlX2dlbmVyYXRlZC50cwpAQCAtMCwwICsxLDcgQEAKKy8vIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGJ5IHRoZSBGbGF0QnVmZmVycyBjb21waWxlciwgZG8gbm90IG1vZGlmeQorCisKK2V4cG9ydCBlbnVtIGNsYXNzXyB7CisgIGFyZ3VtZW50c18gPSAwCit9CisKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL3R5cGVzY3JpcHRfa2V5d29yZHMuZmJzIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvdHMvdHlwZXNjcmlwdF9rZXl3b3Jkcy5mYnMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHRoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL3R5cGVzY3JpcHRfa2V5d29yZHMuZmJzCnJlbmFtZSB0byB0aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy90cy90eXBlc2NyaXB0X2tleXdvcmRzLmZicwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvdHMvdHlwZXNjcmlwdF9rZXl3b3Jkc19nZW5lcmF0ZWQuanMgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy90cy90eXBlc2NyaXB0X2tleXdvcmRzX2dlbmVyYXRlZC5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NTI1ZGE3Ci0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvdHMvdHlwZXNjcmlwdF9rZXl3b3Jkc19nZW5lcmF0ZWQuanMKQEAgLTAsMCArMSwxNzAgQEAKKy8vIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGJ5IHRoZSBGbGF0QnVmZmVycyBjb21waWxlciwgZG8gbm90IG1vZGlmeQoraW1wb3J0ICogYXMgZmxhdGJ1ZmZlcnMgZnJvbSAnZmxhdGJ1ZmZlcnMnOworaW1wb3J0IHsgU2NoZW1hIGFzIFNjaGVtYSB9IGZyb20gJy4vcmVmbGVjdGlvbl9nZW5lcmF0ZWQuanMnOworaW1wb3J0IHsgY2xhc3NfIGFzIGZvb2Jhcl9jbGFzc18gfSBmcm9tICcuL3R5cGVzY3JpcHRfaW5jbHVkZV9nZW5lcmF0ZWQuanMnOworaW1wb3J0IHsgQWJjIGFzIEFiYyB9IGZyb20gJy4vdHlwZXNjcmlwdF90cmFuc2l0aXZlX2luY2x1ZGVfZ2VuZXJhdGVkLmpzJzsKK2V4cG9ydCB2YXIgY2xhc3NfOworKGZ1bmN0aW9uIChjbGFzc18pIHsKKyAgICBjbGFzc19bY2xhc3NfWyJuZXdfIl0gPSAwXSA9ICJuZXdfIjsKKyAgICBjbGFzc19bY2xhc3NfWyJpbnN0YW5jZW9mXyJdID0gMV0gPSAiaW5zdGFuY2VvZl8iOworfSkoY2xhc3NfIHx8IChjbGFzc18gPSB7fSkpOworZXhwb3J0IGNsYXNzIE9iamVjdF8geworICAgIGNvbnN0cnVjdG9yKCkgeworICAgICAgICB0aGlzLmJiID0gbnVsbDsKKyAgICAgICAgdGhpcy5iYl9wb3MgPSAwOworICAgIH0KKyAgICBfX2luaXQoaSwgYmIpIHsKKyAgICAgICAgdGhpcy5iYl9wb3MgPSBpOworICAgICAgICB0aGlzLmJiID0gYmI7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKyAgICBzdGF0aWMgZ2V0Um9vdEFzT2JqZWN0KGJiLCBvYmopIHsKKyAgICAgICAgcmV0dXJuIChvYmogfHwgbmV3IE9iamVjdF8oKSkuX19pbml0KGJiLnJlYWRJbnQzMihiYi5wb3NpdGlvbigpKSArIGJiLnBvc2l0aW9uKCksIGJiKTsKKyAgICB9CisgICAgc3RhdGljIGdldFNpemVQcmVmaXhlZFJvb3RBc09iamVjdChiYiwgb2JqKSB7CisgICAgICAgIGJiLnNldFBvc2l0aW9uKGJiLnBvc2l0aW9uKCkgKyBmbGF0YnVmZmVycy5TSVpFX1BSRUZJWF9MRU5HVEgpOworICAgICAgICByZXR1cm4gKG9iaiB8fCBuZXcgT2JqZWN0XygpKS5fX2luaXQoYmIucmVhZEludDMyKGJiLnBvc2l0aW9uKCkpICsgYmIucG9zaXRpb24oKSwgYmIpOworICAgIH0KKyAgICByZXR1cm5fKCkgeworICAgICAgICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCA0KTsKKyAgICAgICAgcmV0dXJuIG9mZnNldCA/IHRoaXMuYmIucmVhZEludDMyKHRoaXMuYmJfcG9zICsgb2Zmc2V0KSA6IDA7CisgICAgfQorICAgIG11dGF0ZV9yZXR1cm4odmFsdWUpIHsKKyAgICAgICAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywgNCk7CisgICAgICAgIGlmIChvZmZzZXQgPT09IDApIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICB0aGlzLmJiLndyaXRlSW50MzIodGhpcy5iYl9wb3MgKyBvZmZzZXQsIHZhbHVlKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIGlmXygpIHsKKyAgICAgICAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywgNik7CisgICAgICAgIHJldHVybiBvZmZzZXQgPyB0aGlzLmJiLnJlYWRJbnQzMih0aGlzLmJiX3BvcyArIG9mZnNldCkgOiAwOworICAgIH0KKyAgICBtdXRhdGVfaWYodmFsdWUpIHsKKyAgICAgICAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywgNik7CisgICAgICAgIGlmIChvZmZzZXQgPT09IDApIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICB0aGlzLmJiLndyaXRlSW50MzIodGhpcy5iYl9wb3MgKyBvZmZzZXQsIHZhbHVlKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIHN3aXRjaF8oKSB7CisgICAgICAgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsIDgpOworICAgICAgICByZXR1cm4gb2Zmc2V0ID8gdGhpcy5iYi5yZWFkSW50MzIodGhpcy5iYl9wb3MgKyBvZmZzZXQpIDogMDsKKyAgICB9CisgICAgbXV0YXRlX3N3aXRjaCh2YWx1ZSkgeworICAgICAgICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCA4KTsKKyAgICAgICAgaWYgKG9mZnNldCA9PT0gMCkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIHRoaXMuYmIud3JpdGVJbnQzMih0aGlzLmJiX3BvcyArIG9mZnNldCwgdmFsdWUpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgZW51bV8oKSB7CisgICAgICAgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsIDEwKTsKKyAgICAgICAgcmV0dXJuIG9mZnNldCA/IHRoaXMuYmIucmVhZEludDMyKHRoaXMuYmJfcG9zICsgb2Zmc2V0KSA6IGNsYXNzXy5uZXdfOworICAgIH0KKyAgICBtdXRhdGVfZW51bSh2YWx1ZSkgeworICAgICAgICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCAxMCk7CisgICAgICAgIGlmIChvZmZzZXQgPT09IDApIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICB0aGlzLmJiLndyaXRlSW50MzIodGhpcy5iYl9wb3MgKyBvZmZzZXQsIHZhbHVlKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIGVudW0yKCkgeworICAgICAgICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCAxMik7CisgICAgICAgIHJldHVybiBvZmZzZXQgPyB0aGlzLmJiLnJlYWRJbnQzMih0aGlzLmJiX3BvcyArIG9mZnNldCkgOiBmb29iYXJfY2xhc3NfLmFyZ3VtZW50c187CisgICAgfQorICAgIG11dGF0ZV9lbnVtMih2YWx1ZSkgeworICAgICAgICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCAxMik7CisgICAgICAgIGlmIChvZmZzZXQgPT09IDApIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICB0aGlzLmJiLndyaXRlSW50MzIodGhpcy5iYl9wb3MgKyBvZmZzZXQsIHZhbHVlKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIGVudW0zKCkgeworICAgICAgICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCAxNCk7CisgICAgICAgIHJldHVybiBvZmZzZXQgPyB0aGlzLmJiLnJlYWRJbnQzMih0aGlzLmJiX3BvcyArIG9mZnNldCkgOiBBYmMuYTsKKyAgICB9CisgICAgbXV0YXRlX2VudW0zKHZhbHVlKSB7CisgICAgICAgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsIDE0KTsKKyAgICAgICAgaWYgKG9mZnNldCA9PT0gMCkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIHRoaXMuYmIud3JpdGVJbnQzMih0aGlzLmJiX3BvcyArIG9mZnNldCwgdmFsdWUpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgcmVmbGVjdChvYmopIHsKKyAgICAgICAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywgMTYpOworICAgICAgICByZXR1cm4gb2Zmc2V0ID8gKG9iaiB8fCBuZXcgU2NoZW1hKCkpLl9faW5pdCh0aGlzLmJiLl9faW5kaXJlY3QodGhpcy5iYl9wb3MgKyBvZmZzZXQpLCB0aGlzLmJiKSA6IG51bGw7CisgICAgfQorICAgIHN0YXRpYyBnZXRGdWxseVF1YWxpZmllZE5hbWUoKSB7CisgICAgICAgIHJldHVybiAndHlwZXNjcmlwdF9PYmplY3QnOworICAgIH0KKyAgICBzdGF0aWMgc3RhcnRPYmplY3QoYnVpbGRlcikgeworICAgICAgICBidWlsZGVyLnN0YXJ0T2JqZWN0KDcpOworICAgIH0KKyAgICBzdGF0aWMgYWRkUmV0dXJuKGJ1aWxkZXIsIHJldHVybl8pIHsKKyAgICAgICAgYnVpbGRlci5hZGRGaWVsZEludDMyKDAsIHJldHVybl8sIDApOworICAgIH0KKyAgICBzdGF0aWMgYWRkSWYoYnVpbGRlciwgaWZfKSB7CisgICAgICAgIGJ1aWxkZXIuYWRkRmllbGRJbnQzMigxLCBpZl8sIDApOworICAgIH0KKyAgICBzdGF0aWMgYWRkU3dpdGNoKGJ1aWxkZXIsIHN3aXRjaF8pIHsKKyAgICAgICAgYnVpbGRlci5hZGRGaWVsZEludDMyKDIsIHN3aXRjaF8sIDApOworICAgIH0KKyAgICBzdGF0aWMgYWRkRW51bShidWlsZGVyLCBlbnVtXykgeworICAgICAgICBidWlsZGVyLmFkZEZpZWxkSW50MzIoMywgZW51bV8sIGNsYXNzXy5uZXdfKTsKKyAgICB9CisgICAgc3RhdGljIGFkZEVudW0yKGJ1aWxkZXIsIGVudW0yKSB7CisgICAgICAgIGJ1aWxkZXIuYWRkRmllbGRJbnQzMig0LCBlbnVtMiwgZm9vYmFyX2NsYXNzXy5hcmd1bWVudHNfKTsKKyAgICB9CisgICAgc3RhdGljIGFkZEVudW0zKGJ1aWxkZXIsIGVudW0zKSB7CisgICAgICAgIGJ1aWxkZXIuYWRkRmllbGRJbnQzMig1LCBlbnVtMywgQWJjLmEpOworICAgIH0KKyAgICBzdGF0aWMgYWRkUmVmbGVjdChidWlsZGVyLCByZWZsZWN0T2Zmc2V0KSB7CisgICAgICAgIGJ1aWxkZXIuYWRkRmllbGRPZmZzZXQoNiwgcmVmbGVjdE9mZnNldCwgMCk7CisgICAgfQorICAgIHN0YXRpYyBlbmRPYmplY3QoYnVpbGRlcikgeworICAgICAgICBjb25zdCBvZmZzZXQgPSBidWlsZGVyLmVuZE9iamVjdCgpOworICAgICAgICByZXR1cm4gb2Zmc2V0OworICAgIH0KKyAgICB1bnBhY2soKSB7CisgICAgICAgIHJldHVybiBuZXcgT2JqZWN0X1QodGhpcy5yZXR1cm5fKCksIHRoaXMuaWZfKCksIHRoaXMuc3dpdGNoXygpLCB0aGlzLmVudW1fKCksIHRoaXMuZW51bTIoKSwgdGhpcy5lbnVtMygpLCAodGhpcy5yZWZsZWN0KCkgIT09IG51bGwgPyB0aGlzLnJlZmxlY3QoKS51bnBhY2soKSA6IG51bGwpKTsKKyAgICB9CisgICAgdW5wYWNrVG8oX28pIHsKKyAgICAgICAgX28ucmV0dXJuXyA9IHRoaXMucmV0dXJuXygpOworICAgICAgICBfby5pZl8gPSB0aGlzLmlmXygpOworICAgICAgICBfby5zd2l0Y2hfID0gdGhpcy5zd2l0Y2hfKCk7CisgICAgICAgIF9vLmVudW1fID0gdGhpcy5lbnVtXygpOworICAgICAgICBfby5lbnVtMiA9IHRoaXMuZW51bTIoKTsKKyAgICAgICAgX28uZW51bTMgPSB0aGlzLmVudW0zKCk7CisgICAgICAgIF9vLnJlZmxlY3QgPSAodGhpcy5yZWZsZWN0KCkgIT09IG51bGwgPyB0aGlzLnJlZmxlY3QoKS51bnBhY2soKSA6IG51bGwpOworICAgIH0KK30KK2V4cG9ydCBjbGFzcyBPYmplY3RfVCB7CisgICAgY29uc3RydWN0b3IocmV0dXJuXyA9IDAsIGlmXyA9IDAsIHN3aXRjaF8gPSAwLCBlbnVtXyA9IGNsYXNzXy5uZXdfLCBlbnVtMiA9IGZvb2Jhcl9jbGFzc18uYXJndW1lbnRzXywgZW51bTMgPSBBYmMuYSwgcmVmbGVjdCA9IG51bGwpIHsKKyAgICAgICAgdGhpcy5yZXR1cm5fID0gcmV0dXJuXzsKKyAgICAgICAgdGhpcy5pZl8gPSBpZl87CisgICAgICAgIHRoaXMuc3dpdGNoXyA9IHN3aXRjaF87CisgICAgICAgIHRoaXMuZW51bV8gPSBlbnVtXzsKKyAgICAgICAgdGhpcy5lbnVtMiA9IGVudW0yOworICAgICAgICB0aGlzLmVudW0zID0gZW51bTM7CisgICAgICAgIHRoaXMucmVmbGVjdCA9IHJlZmxlY3Q7CisgICAgfQorICAgIHBhY2soYnVpbGRlcikgeworICAgICAgICBjb25zdCByZWZsZWN0ID0gKHRoaXMucmVmbGVjdCAhPT0gbnVsbCA/IHRoaXMucmVmbGVjdC5wYWNrKGJ1aWxkZXIpIDogMCk7CisgICAgICAgIE9iamVjdF8uc3RhcnRPYmplY3QoYnVpbGRlcik7CisgICAgICAgIE9iamVjdF8uYWRkUmV0dXJuKGJ1aWxkZXIsIHRoaXMucmV0dXJuXyk7CisgICAgICAgIE9iamVjdF8uYWRkSWYoYnVpbGRlciwgdGhpcy5pZl8pOworICAgICAgICBPYmplY3RfLmFkZFN3aXRjaChidWlsZGVyLCB0aGlzLnN3aXRjaF8pOworICAgICAgICBPYmplY3RfLmFkZEVudW0oYnVpbGRlciwgdGhpcy5lbnVtXyk7CisgICAgICAgIE9iamVjdF8uYWRkRW51bTIoYnVpbGRlciwgdGhpcy5lbnVtMik7CisgICAgICAgIE9iamVjdF8uYWRkRW51bTMoYnVpbGRlciwgdGhpcy5lbnVtMyk7CisgICAgICAgIE9iamVjdF8uYWRkUmVmbGVjdChidWlsZGVyLCByZWZsZWN0KTsKKyAgICAgICAgcmV0dXJuIE9iamVjdF8uZW5kT2JqZWN0KGJ1aWxkZXIpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL3RzL3R5cGVzY3JpcHRfa2V5d29yZHNfZ2VuZXJhdGVkLnRzIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvdHMvdHlwZXNjcmlwdF9rZXl3b3Jkc19nZW5lcmF0ZWQudHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDI3MjQyNQotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL3RzL3R5cGVzY3JpcHRfa2V5d29yZHNfZ2VuZXJhdGVkLnRzCkBAIC0wLDAgKzEsMjI2IEBACisvLyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBieSB0aGUgRmxhdEJ1ZmZlcnMgY29tcGlsZXIsIGRvIG5vdCBtb2RpZnkKKworaW1wb3J0ICogYXMgZmxhdGJ1ZmZlcnMgZnJvbSAnZmxhdGJ1ZmZlcnMnOworCitpbXBvcnQge1NjaGVtYSBhcyBTY2hlbWEsIFNjaGVtYVQgYXMgU2NoZW1hVH0gZnJvbSAnLi9yZWZsZWN0aW9uX2dlbmVyYXRlZC5qcyc7CitpbXBvcnQge2NsYXNzXyBhcyBmb29iYXJfY2xhc3NffSBmcm9tICcuL3R5cGVzY3JpcHRfaW5jbHVkZV9nZW5lcmF0ZWQuanMnOworaW1wb3J0IHtBYmMgYXMgQWJjfSBmcm9tICcuL3R5cGVzY3JpcHRfdHJhbnNpdGl2ZV9pbmNsdWRlX2dlbmVyYXRlZC5qcyc7CisKK2V4cG9ydCBlbnVtIGNsYXNzXyB7CisgIG5ld18gPSAwLAorICBpbnN0YW5jZW9mXyA9IDEKK30KKworZXhwb3J0IGNsYXNzIE9iamVjdF8geworICBiYjogZmxhdGJ1ZmZlcnMuQnl0ZUJ1ZmZlcnxudWxsID0gbnVsbDsKKyAgYmJfcG9zID0gMDsKKyAgX19pbml0KGk6bnVtYmVyLCBiYjpmbGF0YnVmZmVycy5CeXRlQnVmZmVyKTpPYmplY3RfIHsKKyAgdGhpcy5iYl9wb3MgPSBpOworICB0aGlzLmJiID0gYmI7CisgIHJldHVybiB0aGlzOworfQorCitzdGF0aWMgZ2V0Um9vdEFzT2JqZWN0KGJiOmZsYXRidWZmZXJzLkJ5dGVCdWZmZXIsIG9iaj86T2JqZWN0Xyk6T2JqZWN0XyB7CisgIHJldHVybiAob2JqIHx8IG5ldyBPYmplY3RfKCkpLl9faW5pdChiYi5yZWFkSW50MzIoYmIucG9zaXRpb24oKSkgKyBiYi5wb3NpdGlvbigpLCBiYik7Cit9CisKK3N0YXRpYyBnZXRTaXplUHJlZml4ZWRSb290QXNPYmplY3QoYmI6ZmxhdGJ1ZmZlcnMuQnl0ZUJ1ZmZlciwgb2JqPzpPYmplY3RfKTpPYmplY3RfIHsKKyAgYmIuc2V0UG9zaXRpb24oYmIucG9zaXRpb24oKSArIGZsYXRidWZmZXJzLlNJWkVfUFJFRklYX0xFTkdUSCk7CisgIHJldHVybiAob2JqIHx8IG5ldyBPYmplY3RfKCkpLl9faW5pdChiYi5yZWFkSW50MzIoYmIucG9zaXRpb24oKSkgKyBiYi5wb3NpdGlvbigpLCBiYik7Cit9CisKK3JldHVybl8oKTpudW1iZXIgeworICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiIS5fX29mZnNldCh0aGlzLmJiX3BvcywgNCk7CisgIHJldHVybiBvZmZzZXQgPyB0aGlzLmJiIS5yZWFkSW50MzIodGhpcy5iYl9wb3MgKyBvZmZzZXQpIDogMDsKK30KKworbXV0YXRlX3JldHVybih2YWx1ZTpudW1iZXIpOmJvb2xlYW4geworICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiIS5fX29mZnNldCh0aGlzLmJiX3BvcywgNCk7CisKKyAgaWYgKG9mZnNldCA9PT0gMCkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHRoaXMuYmIhLndyaXRlSW50MzIodGhpcy5iYl9wb3MgKyBvZmZzZXQsIHZhbHVlKTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK2lmXygpOm51bWJlciB7CisgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIhLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCA2KTsKKyAgcmV0dXJuIG9mZnNldCA/IHRoaXMuYmIhLnJlYWRJbnQzMih0aGlzLmJiX3BvcyArIG9mZnNldCkgOiAwOworfQorCittdXRhdGVfaWYodmFsdWU6bnVtYmVyKTpib29sZWFuIHsKKyAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYiEuX19vZmZzZXQodGhpcy5iYl9wb3MsIDYpOworCisgIGlmIChvZmZzZXQgPT09IDApIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICB0aGlzLmJiIS53cml0ZUludDMyKHRoaXMuYmJfcG9zICsgb2Zmc2V0LCB2YWx1ZSk7CisgIHJldHVybiB0cnVlOworfQorCitzd2l0Y2hfKCk6bnVtYmVyIHsKKyAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYiEuX19vZmZzZXQodGhpcy5iYl9wb3MsIDgpOworICByZXR1cm4gb2Zmc2V0ID8gdGhpcy5iYiEucmVhZEludDMyKHRoaXMuYmJfcG9zICsgb2Zmc2V0KSA6IDA7Cit9CisKK211dGF0ZV9zd2l0Y2godmFsdWU6bnVtYmVyKTpib29sZWFuIHsKKyAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYiEuX19vZmZzZXQodGhpcy5iYl9wb3MsIDgpOworCisgIGlmIChvZmZzZXQgPT09IDApIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICB0aGlzLmJiIS53cml0ZUludDMyKHRoaXMuYmJfcG9zICsgb2Zmc2V0LCB2YWx1ZSk7CisgIHJldHVybiB0cnVlOworfQorCitlbnVtXygpOmNsYXNzXyB7CisgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIhLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCAxMCk7CisgIHJldHVybiBvZmZzZXQgPyB0aGlzLmJiIS5yZWFkSW50MzIodGhpcy5iYl9wb3MgKyBvZmZzZXQpIDogY2xhc3NfLm5ld187Cit9CisKK211dGF0ZV9lbnVtKHZhbHVlOmNsYXNzXyk6Ym9vbGVhbiB7CisgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIhLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCAxMCk7CisKKyAgaWYgKG9mZnNldCA9PT0gMCkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHRoaXMuYmIhLndyaXRlSW50MzIodGhpcy5iYl9wb3MgKyBvZmZzZXQsIHZhbHVlKTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK2VudW0yKCk6Zm9vYmFyX2NsYXNzXyB7CisgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIhLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCAxMik7CisgIHJldHVybiBvZmZzZXQgPyB0aGlzLmJiIS5yZWFkSW50MzIodGhpcy5iYl9wb3MgKyBvZmZzZXQpIDogZm9vYmFyX2NsYXNzXy5hcmd1bWVudHNfOworfQorCittdXRhdGVfZW51bTIodmFsdWU6Zm9vYmFyX2NsYXNzXyk6Ym9vbGVhbiB7CisgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIhLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCAxMik7CisKKyAgaWYgKG9mZnNldCA9PT0gMCkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHRoaXMuYmIhLndyaXRlSW50MzIodGhpcy5iYl9wb3MgKyBvZmZzZXQsIHZhbHVlKTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK2VudW0zKCk6QWJjIHsKKyAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYiEuX19vZmZzZXQodGhpcy5iYl9wb3MsIDE0KTsKKyAgcmV0dXJuIG9mZnNldCA/IHRoaXMuYmIhLnJlYWRJbnQzMih0aGlzLmJiX3BvcyArIG9mZnNldCkgOiBBYmMuYTsKK30KKworbXV0YXRlX2VudW0zKHZhbHVlOkFiYyk6Ym9vbGVhbiB7CisgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIhLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCAxNCk7CisKKyAgaWYgKG9mZnNldCA9PT0gMCkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHRoaXMuYmIhLndyaXRlSW50MzIodGhpcy5iYl9wb3MgKyBvZmZzZXQsIHZhbHVlKTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK3JlZmxlY3Qob2JqPzpTY2hlbWEpOlNjaGVtYXxudWxsIHsKKyAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYiEuX19vZmZzZXQodGhpcy5iYl9wb3MsIDE2KTsKKyAgcmV0dXJuIG9mZnNldCA/IChvYmogfHwgbmV3IFNjaGVtYSgpKS5fX2luaXQodGhpcy5iYiEuX19pbmRpcmVjdCh0aGlzLmJiX3BvcyArIG9mZnNldCksIHRoaXMuYmIhKSA6IG51bGw7Cit9CisKK3N0YXRpYyBnZXRGdWxseVF1YWxpZmllZE5hbWUoKTpzdHJpbmcgeworICByZXR1cm4gJ3R5cGVzY3JpcHRfT2JqZWN0JzsKK30KKworc3RhdGljIHN0YXJ0T2JqZWN0KGJ1aWxkZXI6ZmxhdGJ1ZmZlcnMuQnVpbGRlcikgeworICBidWlsZGVyLnN0YXJ0T2JqZWN0KDcpOworfQorCitzdGF0aWMgYWRkUmV0dXJuKGJ1aWxkZXI6ZmxhdGJ1ZmZlcnMuQnVpbGRlciwgcmV0dXJuXzpudW1iZXIpIHsKKyAgYnVpbGRlci5hZGRGaWVsZEludDMyKDAsIHJldHVybl8sIDApOworfQorCitzdGF0aWMgYWRkSWYoYnVpbGRlcjpmbGF0YnVmZmVycy5CdWlsZGVyLCBpZl86bnVtYmVyKSB7CisgIGJ1aWxkZXIuYWRkRmllbGRJbnQzMigxLCBpZl8sIDApOworfQorCitzdGF0aWMgYWRkU3dpdGNoKGJ1aWxkZXI6ZmxhdGJ1ZmZlcnMuQnVpbGRlciwgc3dpdGNoXzpudW1iZXIpIHsKKyAgYnVpbGRlci5hZGRGaWVsZEludDMyKDIsIHN3aXRjaF8sIDApOworfQorCitzdGF0aWMgYWRkRW51bShidWlsZGVyOmZsYXRidWZmZXJzLkJ1aWxkZXIsIGVudW1fOmNsYXNzXykgeworICBidWlsZGVyLmFkZEZpZWxkSW50MzIoMywgZW51bV8sIGNsYXNzXy5uZXdfKTsKK30KKworc3RhdGljIGFkZEVudW0yKGJ1aWxkZXI6ZmxhdGJ1ZmZlcnMuQnVpbGRlciwgZW51bTI6Zm9vYmFyX2NsYXNzXykgeworICBidWlsZGVyLmFkZEZpZWxkSW50MzIoNCwgZW51bTIsIGZvb2Jhcl9jbGFzc18uYXJndW1lbnRzXyk7Cit9CisKK3N0YXRpYyBhZGRFbnVtMyhidWlsZGVyOmZsYXRidWZmZXJzLkJ1aWxkZXIsIGVudW0zOkFiYykgeworICBidWlsZGVyLmFkZEZpZWxkSW50MzIoNSwgZW51bTMsIEFiYy5hKTsKK30KKworc3RhdGljIGFkZFJlZmxlY3QoYnVpbGRlcjpmbGF0YnVmZmVycy5CdWlsZGVyLCByZWZsZWN0T2Zmc2V0OmZsYXRidWZmZXJzLk9mZnNldCkgeworICBidWlsZGVyLmFkZEZpZWxkT2Zmc2V0KDYsIHJlZmxlY3RPZmZzZXQsIDApOworfQorCitzdGF0aWMgZW5kT2JqZWN0KGJ1aWxkZXI6ZmxhdGJ1ZmZlcnMuQnVpbGRlcik6ZmxhdGJ1ZmZlcnMuT2Zmc2V0IHsKKyAgY29uc3Qgb2Zmc2V0ID0gYnVpbGRlci5lbmRPYmplY3QoKTsKKyAgcmV0dXJuIG9mZnNldDsKK30KKworCit1bnBhY2soKTogT2JqZWN0X1QgeworICByZXR1cm4gbmV3IE9iamVjdF9UKAorICAgIHRoaXMucmV0dXJuXygpLAorICAgIHRoaXMuaWZfKCksCisgICAgdGhpcy5zd2l0Y2hfKCksCisgICAgdGhpcy5lbnVtXygpLAorICAgIHRoaXMuZW51bTIoKSwKKyAgICB0aGlzLmVudW0zKCksCisgICAgKHRoaXMucmVmbGVjdCgpICE9PSBudWxsID8gdGhpcy5yZWZsZWN0KCkhLnVucGFjaygpIDogbnVsbCkKKyAgKTsKK30KKworCit1bnBhY2tUbyhfbzogT2JqZWN0X1QpOiB2b2lkIHsKKyAgX28ucmV0dXJuXyA9IHRoaXMucmV0dXJuXygpOworICBfby5pZl8gPSB0aGlzLmlmXygpOworICBfby5zd2l0Y2hfID0gdGhpcy5zd2l0Y2hfKCk7CisgIF9vLmVudW1fID0gdGhpcy5lbnVtXygpOworICBfby5lbnVtMiA9IHRoaXMuZW51bTIoKTsKKyAgX28uZW51bTMgPSB0aGlzLmVudW0zKCk7CisgIF9vLnJlZmxlY3QgPSAodGhpcy5yZWZsZWN0KCkgIT09IG51bGwgPyB0aGlzLnJlZmxlY3QoKSEudW5wYWNrKCkgOiBudWxsKTsKK30KK30KKworZXhwb3J0IGNsYXNzIE9iamVjdF9UIHsKK2NvbnN0cnVjdG9yKAorICBwdWJsaWMgcmV0dXJuXzogbnVtYmVyID0gMCwKKyAgcHVibGljIGlmXzogbnVtYmVyID0gMCwKKyAgcHVibGljIHN3aXRjaF86IG51bWJlciA9IDAsCisgIHB1YmxpYyBlbnVtXzogY2xhc3NfID0gY2xhc3NfLm5ld18sCisgIHB1YmxpYyBlbnVtMjogZm9vYmFyX2NsYXNzXyA9IGZvb2Jhcl9jbGFzc18uYXJndW1lbnRzXywKKyAgcHVibGljIGVudW0zOiBBYmMgPSBBYmMuYSwKKyAgcHVibGljIHJlZmxlY3Q6IFNjaGVtYVR8bnVsbCA9IG51bGwKKyl7fQorCisKK3BhY2soYnVpbGRlcjpmbGF0YnVmZmVycy5CdWlsZGVyKTogZmxhdGJ1ZmZlcnMuT2Zmc2V0IHsKKyAgY29uc3QgcmVmbGVjdCA9ICh0aGlzLnJlZmxlY3QgIT09IG51bGwgPyB0aGlzLnJlZmxlY3QhLnBhY2soYnVpbGRlcikgOiAwKTsKKworICBPYmplY3RfLnN0YXJ0T2JqZWN0KGJ1aWxkZXIpOworICBPYmplY3RfLmFkZFJldHVybihidWlsZGVyLCB0aGlzLnJldHVybl8pOworICBPYmplY3RfLmFkZElmKGJ1aWxkZXIsIHRoaXMuaWZfKTsKKyAgT2JqZWN0Xy5hZGRTd2l0Y2goYnVpbGRlciwgdGhpcy5zd2l0Y2hfKTsKKyAgT2JqZWN0Xy5hZGRFbnVtKGJ1aWxkZXIsIHRoaXMuZW51bV8pOworICBPYmplY3RfLmFkZEVudW0yKGJ1aWxkZXIsIHRoaXMuZW51bTIpOworICBPYmplY3RfLmFkZEVudW0zKGJ1aWxkZXIsIHRoaXMuZW51bTMpOworICBPYmplY3RfLmFkZFJlZmxlY3QoYnVpbGRlciwgcmVmbGVjdCk7CisKKyAgcmV0dXJuIE9iamVjdF8uZW5kT2JqZWN0KGJ1aWxkZXIpOworfQorfQorCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy90cy90eXBlc2NyaXB0X3RyYW5zaXRpdmVfaW5jbHVkZV9nZW5lcmF0ZWQuanMgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy90cy90eXBlc2NyaXB0X3RyYW5zaXRpdmVfaW5jbHVkZV9nZW5lcmF0ZWQuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2RlZjk4OAotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL3RzL3R5cGVzY3JpcHRfdHJhbnNpdGl2ZV9pbmNsdWRlX2dlbmVyYXRlZC5qcwpAQCAtMCwwICsxLDUgQEAKKy8vIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGJ5IHRoZSBGbGF0QnVmZmVycyBjb21waWxlciwgZG8gbm90IG1vZGlmeQorZXhwb3J0IHZhciBBYmM7CisoZnVuY3Rpb24gKEFiYykgeworICAgIEFiY1tBYmNbImEiXSA9IDBdID0gImEiOworfSkoQWJjIHx8IChBYmMgPSB7fSkpOwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvdHMvdHlwZXNjcmlwdF90cmFuc2l0aXZlX2luY2x1ZGVfZ2VuZXJhdGVkLnRzIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvdHMvdHlwZXNjcmlwdF90cmFuc2l0aXZlX2luY2x1ZGVfZ2VuZXJhdGVkLnRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZiYjE2MDEKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy90cy90eXBlc2NyaXB0X3RyYW5zaXRpdmVfaW5jbHVkZV9nZW5lcmF0ZWQudHMKQEAgLTAsMCArMSw3IEBACisvLyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBieSB0aGUgRmxhdEJ1ZmZlcnMgY29tcGlsZXIsIGRvIG5vdCBtb2RpZnkKKworCitleHBvcnQgZW51bSBBYmMgeworICBhID0gMAorfQorCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy90cy91bmljb2RlX3Rlc3QubW9uIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvdHMvdW5pY29kZV90ZXN0Lm1vbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNGY1ZmI0Ci0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvdHMvdW5pY29kZV90ZXN0Lm1vbgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy90cy91bmlvbl92ZWN0b3IvYXR0YWNrZXIuanMgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy90cy91bmlvbl92ZWN0b3IvYXR0YWNrZXIuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzJiZTk0ZQotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL3RzL3VuaW9uX3ZlY3Rvci9hdHRhY2tlci5qcwpAQCAtMCwwICsxLDY0IEBACisvLyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBieSB0aGUgRmxhdEJ1ZmZlcnMgY29tcGlsZXIsIGRvIG5vdCBtb2RpZnkKK2ltcG9ydCAqIGFzIGZsYXRidWZmZXJzIGZyb20gJ2ZsYXRidWZmZXJzJzsKK2V4cG9ydCBjbGFzcyBBdHRhY2tlciB7CisgICAgY29uc3RydWN0b3IoKSB7CisgICAgICAgIHRoaXMuYmIgPSBudWxsOworICAgICAgICB0aGlzLmJiX3BvcyA9IDA7CisgICAgfQorICAgIF9faW5pdChpLCBiYikgeworICAgICAgICB0aGlzLmJiX3BvcyA9IGk7CisgICAgICAgIHRoaXMuYmIgPSBiYjsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorICAgIHN0YXRpYyBnZXRSb290QXNBdHRhY2tlcihiYiwgb2JqKSB7CisgICAgICAgIHJldHVybiAob2JqIHx8IG5ldyBBdHRhY2tlcigpKS5fX2luaXQoYmIucmVhZEludDMyKGJiLnBvc2l0aW9uKCkpICsgYmIucG9zaXRpb24oKSwgYmIpOworICAgIH0KKyAgICBzdGF0aWMgZ2V0U2l6ZVByZWZpeGVkUm9vdEFzQXR0YWNrZXIoYmIsIG9iaikgeworICAgICAgICBiYi5zZXRQb3NpdGlvbihiYi5wb3NpdGlvbigpICsgZmxhdGJ1ZmZlcnMuU0laRV9QUkVGSVhfTEVOR1RIKTsKKyAgICAgICAgcmV0dXJuIChvYmogfHwgbmV3IEF0dGFja2VyKCkpLl9faW5pdChiYi5yZWFkSW50MzIoYmIucG9zaXRpb24oKSkgKyBiYi5wb3NpdGlvbigpLCBiYik7CisgICAgfQorICAgIHN3b3JkQXR0YWNrRGFtYWdlKCkgeworICAgICAgICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCA0KTsKKyAgICAgICAgcmV0dXJuIG9mZnNldCA/IHRoaXMuYmIucmVhZEludDMyKHRoaXMuYmJfcG9zICsgb2Zmc2V0KSA6IDA7CisgICAgfQorICAgIG11dGF0ZV9zd29yZF9hdHRhY2tfZGFtYWdlKHZhbHVlKSB7CisgICAgICAgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsIDQpOworICAgICAgICBpZiAob2Zmc2V0ID09PSAwKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgdGhpcy5iYi53cml0ZUludDMyKHRoaXMuYmJfcG9zICsgb2Zmc2V0LCB2YWx1ZSk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICBzdGF0aWMgZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCkgeworICAgICAgICByZXR1cm4gJ0F0dGFja2VyJzsKKyAgICB9CisgICAgc3RhdGljIHN0YXJ0QXR0YWNrZXIoYnVpbGRlcikgeworICAgICAgICBidWlsZGVyLnN0YXJ0T2JqZWN0KDEpOworICAgIH0KKyAgICBzdGF0aWMgYWRkU3dvcmRBdHRhY2tEYW1hZ2UoYnVpbGRlciwgc3dvcmRBdHRhY2tEYW1hZ2UpIHsKKyAgICAgICAgYnVpbGRlci5hZGRGaWVsZEludDMyKDAsIHN3b3JkQXR0YWNrRGFtYWdlLCAwKTsKKyAgICB9CisgICAgc3RhdGljIGVuZEF0dGFja2VyKGJ1aWxkZXIpIHsKKyAgICAgICAgY29uc3Qgb2Zmc2V0ID0gYnVpbGRlci5lbmRPYmplY3QoKTsKKyAgICAgICAgcmV0dXJuIG9mZnNldDsKKyAgICB9CisgICAgc3RhdGljIGNyZWF0ZUF0dGFja2VyKGJ1aWxkZXIsIHN3b3JkQXR0YWNrRGFtYWdlKSB7CisgICAgICAgIEF0dGFja2VyLnN0YXJ0QXR0YWNrZXIoYnVpbGRlcik7CisgICAgICAgIEF0dGFja2VyLmFkZFN3b3JkQXR0YWNrRGFtYWdlKGJ1aWxkZXIsIHN3b3JkQXR0YWNrRGFtYWdlKTsKKyAgICAgICAgcmV0dXJuIEF0dGFja2VyLmVuZEF0dGFja2VyKGJ1aWxkZXIpOworICAgIH0KKyAgICB1bnBhY2soKSB7CisgICAgICAgIHJldHVybiBuZXcgQXR0YWNrZXJUKHRoaXMuc3dvcmRBdHRhY2tEYW1hZ2UoKSk7CisgICAgfQorICAgIHVucGFja1RvKF9vKSB7CisgICAgICAgIF9vLnN3b3JkQXR0YWNrRGFtYWdlID0gdGhpcy5zd29yZEF0dGFja0RhbWFnZSgpOworICAgIH0KK30KK2V4cG9ydCBjbGFzcyBBdHRhY2tlclQgeworICAgIGNvbnN0cnVjdG9yKHN3b3JkQXR0YWNrRGFtYWdlID0gMCkgeworICAgICAgICB0aGlzLnN3b3JkQXR0YWNrRGFtYWdlID0gc3dvcmRBdHRhY2tEYW1hZ2U7CisgICAgfQorICAgIHBhY2soYnVpbGRlcikgeworICAgICAgICByZXR1cm4gQXR0YWNrZXIuY3JlYXRlQXR0YWNrZXIoYnVpbGRlciwgdGhpcy5zd29yZEF0dGFja0RhbWFnZSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvdHMvdW5pb25fdmVjdG9yL2F0dGFja2VyLnRzIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvdHMvdW5pb25fdmVjdG9yL2F0dGFja2VyLnRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZiM2ZjMGYKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy90cy91bmlvbl92ZWN0b3IvYXR0YWNrZXIudHMKQEAgLTAsMCArMSw4NyBAQAorLy8gYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgYnkgdGhlIEZsYXRCdWZmZXJzIGNvbXBpbGVyLCBkbyBub3QgbW9kaWZ5CisKK2ltcG9ydCAqIGFzIGZsYXRidWZmZXJzIGZyb20gJ2ZsYXRidWZmZXJzJzsKKworCisKK2V4cG9ydCBjbGFzcyBBdHRhY2tlciB7CisgIGJiOiBmbGF0YnVmZmVycy5CeXRlQnVmZmVyfG51bGwgPSBudWxsOworICBiYl9wb3MgPSAwOworICBfX2luaXQoaTpudW1iZXIsIGJiOmZsYXRidWZmZXJzLkJ5dGVCdWZmZXIpOkF0dGFja2VyIHsKKyAgdGhpcy5iYl9wb3MgPSBpOworICB0aGlzLmJiID0gYmI7CisgIHJldHVybiB0aGlzOworfQorCitzdGF0aWMgZ2V0Um9vdEFzQXR0YWNrZXIoYmI6ZmxhdGJ1ZmZlcnMuQnl0ZUJ1ZmZlciwgb2JqPzpBdHRhY2tlcik6QXR0YWNrZXIgeworICByZXR1cm4gKG9iaiB8fCBuZXcgQXR0YWNrZXIoKSkuX19pbml0KGJiLnJlYWRJbnQzMihiYi5wb3NpdGlvbigpKSArIGJiLnBvc2l0aW9uKCksIGJiKTsKK30KKworc3RhdGljIGdldFNpemVQcmVmaXhlZFJvb3RBc0F0dGFja2VyKGJiOmZsYXRidWZmZXJzLkJ5dGVCdWZmZXIsIG9iaj86QXR0YWNrZXIpOkF0dGFja2VyIHsKKyAgYmIuc2V0UG9zaXRpb24oYmIucG9zaXRpb24oKSArIGZsYXRidWZmZXJzLlNJWkVfUFJFRklYX0xFTkdUSCk7CisgIHJldHVybiAob2JqIHx8IG5ldyBBdHRhY2tlcigpKS5fX2luaXQoYmIucmVhZEludDMyKGJiLnBvc2l0aW9uKCkpICsgYmIucG9zaXRpb24oKSwgYmIpOworfQorCitzd29yZEF0dGFja0RhbWFnZSgpOm51bWJlciB7CisgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIhLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCA0KTsKKyAgcmV0dXJuIG9mZnNldCA/IHRoaXMuYmIhLnJlYWRJbnQzMih0aGlzLmJiX3BvcyArIG9mZnNldCkgOiAwOworfQorCittdXRhdGVfc3dvcmRfYXR0YWNrX2RhbWFnZSh2YWx1ZTpudW1iZXIpOmJvb2xlYW4geworICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiIS5fX29mZnNldCh0aGlzLmJiX3BvcywgNCk7CisKKyAgaWYgKG9mZnNldCA9PT0gMCkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHRoaXMuYmIhLndyaXRlSW50MzIodGhpcy5iYl9wb3MgKyBvZmZzZXQsIHZhbHVlKTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyBnZXRGdWxseVF1YWxpZmllZE5hbWUoKTpzdHJpbmcgeworICByZXR1cm4gJ0F0dGFja2VyJzsKK30KKworc3RhdGljIHN0YXJ0QXR0YWNrZXIoYnVpbGRlcjpmbGF0YnVmZmVycy5CdWlsZGVyKSB7CisgIGJ1aWxkZXIuc3RhcnRPYmplY3QoMSk7Cit9CisKK3N0YXRpYyBhZGRTd29yZEF0dGFja0RhbWFnZShidWlsZGVyOmZsYXRidWZmZXJzLkJ1aWxkZXIsIHN3b3JkQXR0YWNrRGFtYWdlOm51bWJlcikgeworICBidWlsZGVyLmFkZEZpZWxkSW50MzIoMCwgc3dvcmRBdHRhY2tEYW1hZ2UsIDApOworfQorCitzdGF0aWMgZW5kQXR0YWNrZXIoYnVpbGRlcjpmbGF0YnVmZmVycy5CdWlsZGVyKTpmbGF0YnVmZmVycy5PZmZzZXQgeworICBjb25zdCBvZmZzZXQgPSBidWlsZGVyLmVuZE9iamVjdCgpOworICByZXR1cm4gb2Zmc2V0OworfQorCitzdGF0aWMgY3JlYXRlQXR0YWNrZXIoYnVpbGRlcjpmbGF0YnVmZmVycy5CdWlsZGVyLCBzd29yZEF0dGFja0RhbWFnZTpudW1iZXIpOmZsYXRidWZmZXJzLk9mZnNldCB7CisgIEF0dGFja2VyLnN0YXJ0QXR0YWNrZXIoYnVpbGRlcik7CisgIEF0dGFja2VyLmFkZFN3b3JkQXR0YWNrRGFtYWdlKGJ1aWxkZXIsIHN3b3JkQXR0YWNrRGFtYWdlKTsKKyAgcmV0dXJuIEF0dGFja2VyLmVuZEF0dGFja2VyKGJ1aWxkZXIpOworfQorCit1bnBhY2soKTogQXR0YWNrZXJUIHsKKyAgcmV0dXJuIG5ldyBBdHRhY2tlclQoCisgICAgdGhpcy5zd29yZEF0dGFja0RhbWFnZSgpCisgICk7Cit9CisKKwordW5wYWNrVG8oX286IEF0dGFja2VyVCk6IHZvaWQgeworICBfby5zd29yZEF0dGFja0RhbWFnZSA9IHRoaXMuc3dvcmRBdHRhY2tEYW1hZ2UoKTsKK30KK30KKworZXhwb3J0IGNsYXNzIEF0dGFja2VyVCB7Citjb25zdHJ1Y3RvcigKKyAgcHVibGljIHN3b3JkQXR0YWNrRGFtYWdlOiBudW1iZXIgPSAwCispe30KKworCitwYWNrKGJ1aWxkZXI6ZmxhdGJ1ZmZlcnMuQnVpbGRlcik6IGZsYXRidWZmZXJzLk9mZnNldCB7CisgIHJldHVybiBBdHRhY2tlci5jcmVhdGVBdHRhY2tlcihidWlsZGVyLAorICAgIHRoaXMuc3dvcmRBdHRhY2tEYW1hZ2UKKyAgKTsKK30KK30KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL3RzL3VuaW9uX3ZlY3Rvci9ib29rLXJlYWRlci5qcyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL3RzL3VuaW9uX3ZlY3Rvci9ib29rLXJlYWRlci5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZDllMWE1Ci0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvdHMvdW5pb25fdmVjdG9yL2Jvb2stcmVhZGVyLmpzCkBAIC0wLDAgKzEsNDQgQEAKKy8vIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGJ5IHRoZSBGbGF0QnVmZmVycyBjb21waWxlciwgZG8gbm90IG1vZGlmeQorZXhwb3J0IGNsYXNzIEJvb2tSZWFkZXIgeworICAgIGNvbnN0cnVjdG9yKCkgeworICAgICAgICB0aGlzLmJiID0gbnVsbDsKKyAgICAgICAgdGhpcy5iYl9wb3MgPSAwOworICAgIH0KKyAgICBfX2luaXQoaSwgYmIpIHsKKyAgICAgICAgdGhpcy5iYl9wb3MgPSBpOworICAgICAgICB0aGlzLmJiID0gYmI7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKyAgICBib29rc1JlYWQoKSB7CisgICAgICAgIHJldHVybiB0aGlzLmJiLnJlYWRJbnQzMih0aGlzLmJiX3Bvcyk7CisgICAgfQorICAgIG11dGF0ZV9ib29rc19yZWFkKHZhbHVlKSB7CisgICAgICAgIHRoaXMuYmIud3JpdGVJbnQzMih0aGlzLmJiX3BvcyArIDAsIHZhbHVlKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIHN0YXRpYyBnZXRGdWxseVF1YWxpZmllZE5hbWUoKSB7CisgICAgICAgIHJldHVybiAnQm9va1JlYWRlcic7CisgICAgfQorICAgIHN0YXRpYyBzaXplT2YoKSB7CisgICAgICAgIHJldHVybiA0OworICAgIH0KKyAgICBzdGF0aWMgY3JlYXRlQm9va1JlYWRlcihidWlsZGVyLCBib29rc19yZWFkKSB7CisgICAgICAgIGJ1aWxkZXIucHJlcCg0LCA0KTsKKyAgICAgICAgYnVpbGRlci53cml0ZUludDMyKGJvb2tzX3JlYWQpOworICAgICAgICByZXR1cm4gYnVpbGRlci5vZmZzZXQoKTsKKyAgICB9CisgICAgdW5wYWNrKCkgeworICAgICAgICByZXR1cm4gbmV3IEJvb2tSZWFkZXJUKHRoaXMuYm9va3NSZWFkKCkpOworICAgIH0KKyAgICB1bnBhY2tUbyhfbykgeworICAgICAgICBfby5ib29rc1JlYWQgPSB0aGlzLmJvb2tzUmVhZCgpOworICAgIH0KK30KK2V4cG9ydCBjbGFzcyBCb29rUmVhZGVyVCB7CisgICAgY29uc3RydWN0b3IoYm9va3NSZWFkID0gMCkgeworICAgICAgICB0aGlzLmJvb2tzUmVhZCA9IGJvb2tzUmVhZDsKKyAgICB9CisgICAgcGFjayhidWlsZGVyKSB7CisgICAgICAgIHJldHVybiBCb29rUmVhZGVyLmNyZWF0ZUJvb2tSZWFkZXIoYnVpbGRlciwgdGhpcy5ib29rc1JlYWQpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL3RzL3VuaW9uX3ZlY3Rvci9ib29rLXJlYWRlci50cyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL3RzL3VuaW9uX3ZlY3Rvci9ib29rLXJlYWRlci50cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YTMxMjc4Ci0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvdHMvdW5pb25fdmVjdG9yL2Jvb2stcmVhZGVyLnRzCkBAIC0wLDAgKzEsNjMgQEAKKy8vIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGJ5IHRoZSBGbGF0QnVmZmVycyBjb21waWxlciwgZG8gbm90IG1vZGlmeQorCitpbXBvcnQgKiBhcyBmbGF0YnVmZmVycyBmcm9tICdmbGF0YnVmZmVycyc7CisKKworCitleHBvcnQgY2xhc3MgQm9va1JlYWRlciB7CisgIGJiOiBmbGF0YnVmZmVycy5CeXRlQnVmZmVyfG51bGwgPSBudWxsOworICBiYl9wb3MgPSAwOworICBfX2luaXQoaTpudW1iZXIsIGJiOmZsYXRidWZmZXJzLkJ5dGVCdWZmZXIpOkJvb2tSZWFkZXIgeworICB0aGlzLmJiX3BvcyA9IGk7CisgIHRoaXMuYmIgPSBiYjsKKyAgcmV0dXJuIHRoaXM7Cit9CisKK2Jvb2tzUmVhZCgpOm51bWJlciB7CisgIHJldHVybiB0aGlzLmJiIS5yZWFkSW50MzIodGhpcy5iYl9wb3MpOworfQorCittdXRhdGVfYm9va3NfcmVhZCh2YWx1ZTpudW1iZXIpOmJvb2xlYW4geworICB0aGlzLmJiIS53cml0ZUludDMyKHRoaXMuYmJfcG9zICsgMCwgdmFsdWUpOworICByZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIGdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpOnN0cmluZyB7CisgIHJldHVybiAnQm9va1JlYWRlcic7Cit9CisKK3N0YXRpYyBzaXplT2YoKTpudW1iZXIgeworICByZXR1cm4gNDsKK30KKworc3RhdGljIGNyZWF0ZUJvb2tSZWFkZXIoYnVpbGRlcjpmbGF0YnVmZmVycy5CdWlsZGVyLCBib29rc19yZWFkOiBudW1iZXIpOmZsYXRidWZmZXJzLk9mZnNldCB7CisgIGJ1aWxkZXIucHJlcCg0LCA0KTsKKyAgYnVpbGRlci53cml0ZUludDMyKGJvb2tzX3JlYWQpOworICByZXR1cm4gYnVpbGRlci5vZmZzZXQoKTsKK30KKworCit1bnBhY2soKTogQm9va1JlYWRlclQgeworICByZXR1cm4gbmV3IEJvb2tSZWFkZXJUKAorICAgIHRoaXMuYm9va3NSZWFkKCkKKyAgKTsKK30KKworCit1bnBhY2tUbyhfbzogQm9va1JlYWRlclQpOiB2b2lkIHsKKyAgX28uYm9va3NSZWFkID0gdGhpcy5ib29rc1JlYWQoKTsKK30KK30KKworZXhwb3J0IGNsYXNzIEJvb2tSZWFkZXJUIHsKK2NvbnN0cnVjdG9yKAorICBwdWJsaWMgYm9va3NSZWFkOiBudW1iZXIgPSAwCispe30KKworCitwYWNrKGJ1aWxkZXI6ZmxhdGJ1ZmZlcnMuQnVpbGRlcik6IGZsYXRidWZmZXJzLk9mZnNldCB7CisgIHJldHVybiBCb29rUmVhZGVyLmNyZWF0ZUJvb2tSZWFkZXIoYnVpbGRlciwKKyAgICB0aGlzLmJvb2tzUmVhZAorICApOworfQorfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvdHMvdW5pb25fdmVjdG9yL2NoYXJhY3Rlci5qcyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL3RzL3VuaW9uX3ZlY3Rvci9jaGFyYWN0ZXIuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDRlMzI5NAotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL3RzL3VuaW9uX3ZlY3Rvci9jaGFyYWN0ZXIuanMKQEAgLTAsMCArMSwzOCBAQAorLy8gYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgYnkgdGhlIEZsYXRCdWZmZXJzIGNvbXBpbGVyLCBkbyBub3QgbW9kaWZ5CitpbXBvcnQgeyBBdHRhY2tlciB9IGZyb20gJy4vYXR0YWNrZXIuanMnOworaW1wb3J0IHsgQm9va1JlYWRlciB9IGZyb20gJy4vYm9vay1yZWFkZXIuanMnOworaW1wb3J0IHsgUmFwdW56ZWwgfSBmcm9tICcuL3JhcHVuemVsLmpzJzsKK2V4cG9ydCB2YXIgQ2hhcmFjdGVyOworKGZ1bmN0aW9uIChDaGFyYWN0ZXIpIHsKKyAgICBDaGFyYWN0ZXJbQ2hhcmFjdGVyWyJOT05FIl0gPSAwXSA9ICJOT05FIjsKKyAgICBDaGFyYWN0ZXJbQ2hhcmFjdGVyWyJNdUxhbiJdID0gMV0gPSAiTXVMYW4iOworICAgIENoYXJhY3RlcltDaGFyYWN0ZXJbIlJhcHVuemVsIl0gPSAyXSA9ICJSYXB1bnplbCI7CisgICAgQ2hhcmFjdGVyW0NoYXJhY3RlclsiQmVsbGUiXSA9IDNdID0gIkJlbGxlIjsKKyAgICBDaGFyYWN0ZXJbQ2hhcmFjdGVyWyJCb29rRmFuIl0gPSA0XSA9ICJCb29rRmFuIjsKKyAgICBDaGFyYWN0ZXJbQ2hhcmFjdGVyWyJPdGhlciJdID0gNV0gPSAiT3RoZXIiOworICAgIENoYXJhY3RlcltDaGFyYWN0ZXJbIlVudXNlZCJdID0gNl0gPSAiVW51c2VkIjsKK30pKENoYXJhY3RlciB8fCAoQ2hhcmFjdGVyID0ge30pKTsKK2V4cG9ydCBmdW5jdGlvbiB1bmlvblRvQ2hhcmFjdGVyKHR5cGUsIGFjY2Vzc29yKSB7CisgICAgc3dpdGNoIChDaGFyYWN0ZXJbdHlwZV0pIHsKKyAgICAgICAgY2FzZSAnTk9ORSc6IHJldHVybiBudWxsOworICAgICAgICBjYXNlICdNdUxhbic6IHJldHVybiBhY2Nlc3NvcihuZXcgQXR0YWNrZXIoKSk7CisgICAgICAgIGNhc2UgJ1JhcHVuemVsJzogcmV0dXJuIGFjY2Vzc29yKG5ldyBSYXB1bnplbCgpKTsKKyAgICAgICAgY2FzZSAnQmVsbGUnOiByZXR1cm4gYWNjZXNzb3IobmV3IEJvb2tSZWFkZXIoKSk7CisgICAgICAgIGNhc2UgJ0Jvb2tGYW4nOiByZXR1cm4gYWNjZXNzb3IobmV3IEJvb2tSZWFkZXIoKSk7CisgICAgICAgIGNhc2UgJ090aGVyJzogcmV0dXJuIGFjY2Vzc29yKCcnKTsKKyAgICAgICAgY2FzZSAnVW51c2VkJzogcmV0dXJuIGFjY2Vzc29yKCcnKTsKKyAgICAgICAgZGVmYXVsdDogcmV0dXJuIG51bGw7CisgICAgfQorfQorZXhwb3J0IGZ1bmN0aW9uIHVuaW9uTGlzdFRvQ2hhcmFjdGVyKHR5cGUsIGFjY2Vzc29yLCBpbmRleCkgeworICAgIHN3aXRjaCAoQ2hhcmFjdGVyW3R5cGVdKSB7CisgICAgICAgIGNhc2UgJ05PTkUnOiByZXR1cm4gbnVsbDsKKyAgICAgICAgY2FzZSAnTXVMYW4nOiByZXR1cm4gYWNjZXNzb3IoaW5kZXgsIG5ldyBBdHRhY2tlcigpKTsKKyAgICAgICAgY2FzZSAnUmFwdW56ZWwnOiByZXR1cm4gYWNjZXNzb3IoaW5kZXgsIG5ldyBSYXB1bnplbCgpKTsKKyAgICAgICAgY2FzZSAnQmVsbGUnOiByZXR1cm4gYWNjZXNzb3IoaW5kZXgsIG5ldyBCb29rUmVhZGVyKCkpOworICAgICAgICBjYXNlICdCb29rRmFuJzogcmV0dXJuIGFjY2Vzc29yKGluZGV4LCBuZXcgQm9va1JlYWRlcigpKTsKKyAgICAgICAgY2FzZSAnT3RoZXInOiByZXR1cm4gYWNjZXNzb3IoaW5kZXgsICcnKTsKKyAgICAgICAgY2FzZSAnVW51c2VkJzogcmV0dXJuIGFjY2Vzc29yKGluZGV4LCAnJyk7CisgICAgICAgIGRlZmF1bHQ6IHJldHVybiBudWxsOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL3RzL3VuaW9uX3ZlY3Rvci9jaGFyYWN0ZXIudHMgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy90cy91bmlvbl92ZWN0b3IvY2hhcmFjdGVyLnRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRkYWQ4NzUKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy90cy91bmlvbl92ZWN0b3IvY2hhcmFjdGVyLnRzCkBAIC0wLDAgKzEsNDkgQEAKKy8vIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGJ5IHRoZSBGbGF0QnVmZmVycyBjb21waWxlciwgZG8gbm90IG1vZGlmeQorCitpbXBvcnQgeyBBdHRhY2tlciwgQXR0YWNrZXJUIH0gZnJvbSAnLi9hdHRhY2tlci5qcyc7CitpbXBvcnQgeyBCb29rUmVhZGVyLCBCb29rUmVhZGVyVCB9IGZyb20gJy4vYm9vay1yZWFkZXIuanMnOworaW1wb3J0IHsgUmFwdW56ZWwsIFJhcHVuemVsVCB9IGZyb20gJy4vcmFwdW56ZWwuanMnOworCisKK2V4cG9ydCBlbnVtIENoYXJhY3RlciB7CisgIE5PTkUgPSAwLAorICBNdUxhbiA9IDEsCisgIFJhcHVuemVsID0gMiwKKyAgQmVsbGUgPSAzLAorICBCb29rRmFuID0gNCwKKyAgT3RoZXIgPSA1LAorICBVbnVzZWQgPSA2Cit9CisKK2V4cG9ydCBmdW5jdGlvbiB1bmlvblRvQ2hhcmFjdGVyKAorICB0eXBlOiBDaGFyYWN0ZXIsCisgIGFjY2Vzc29yOiAob2JqOkF0dGFja2VyfEJvb2tSZWFkZXJ8UmFwdW56ZWx8c3RyaW5nKSA9PiBBdHRhY2tlcnxCb29rUmVhZGVyfFJhcHVuemVsfHN0cmluZ3xudWxsCispOiBBdHRhY2tlcnxCb29rUmVhZGVyfFJhcHVuemVsfHN0cmluZ3xudWxsIHsKKyAgc3dpdGNoKENoYXJhY3Rlclt0eXBlXSkgeworICAgIGNhc2UgJ05PTkUnOiByZXR1cm4gbnVsbDsgCisgICAgY2FzZSAnTXVMYW4nOiByZXR1cm4gYWNjZXNzb3IobmV3IEF0dGFja2VyKCkpISBhcyBBdHRhY2tlcjsKKyAgICBjYXNlICdSYXB1bnplbCc6IHJldHVybiBhY2Nlc3NvcihuZXcgUmFwdW56ZWwoKSkhIGFzIFJhcHVuemVsOworICAgIGNhc2UgJ0JlbGxlJzogcmV0dXJuIGFjY2Vzc29yKG5ldyBCb29rUmVhZGVyKCkpISBhcyBCb29rUmVhZGVyOworICAgIGNhc2UgJ0Jvb2tGYW4nOiByZXR1cm4gYWNjZXNzb3IobmV3IEJvb2tSZWFkZXIoKSkhIGFzIEJvb2tSZWFkZXI7CisgICAgY2FzZSAnT3RoZXInOiByZXR1cm4gYWNjZXNzb3IoJycpIGFzIHN0cmluZzsKKyAgICBjYXNlICdVbnVzZWQnOiByZXR1cm4gYWNjZXNzb3IoJycpIGFzIHN0cmluZzsKKyAgICBkZWZhdWx0OiByZXR1cm4gbnVsbDsKKyAgfQorfQorCitleHBvcnQgZnVuY3Rpb24gdW5pb25MaXN0VG9DaGFyYWN0ZXIoCisgIHR5cGU6IENoYXJhY3RlciwgCisgIGFjY2Vzc29yOiAoaW5kZXg6IG51bWJlciwgb2JqOkF0dGFja2VyfEJvb2tSZWFkZXJ8UmFwdW56ZWx8c3RyaW5nKSA9PiBBdHRhY2tlcnxCb29rUmVhZGVyfFJhcHVuemVsfHN0cmluZ3xudWxsLCAKKyAgaW5kZXg6IG51bWJlcgorKTogQXR0YWNrZXJ8Qm9va1JlYWRlcnxSYXB1bnplbHxzdHJpbmd8bnVsbCB7CisgIHN3aXRjaChDaGFyYWN0ZXJbdHlwZV0pIHsKKyAgICBjYXNlICdOT05FJzogcmV0dXJuIG51bGw7IAorICAgIGNhc2UgJ011TGFuJzogcmV0dXJuIGFjY2Vzc29yKGluZGV4LCBuZXcgQXR0YWNrZXIoKSkhIGFzIEF0dGFja2VyOworICAgIGNhc2UgJ1JhcHVuemVsJzogcmV0dXJuIGFjY2Vzc29yKGluZGV4LCBuZXcgUmFwdW56ZWwoKSkhIGFzIFJhcHVuemVsOworICAgIGNhc2UgJ0JlbGxlJzogcmV0dXJuIGFjY2Vzc29yKGluZGV4LCBuZXcgQm9va1JlYWRlcigpKSEgYXMgQm9va1JlYWRlcjsKKyAgICBjYXNlICdCb29rRmFuJzogcmV0dXJuIGFjY2Vzc29yKGluZGV4LCBuZXcgQm9va1JlYWRlcigpKSEgYXMgQm9va1JlYWRlcjsKKyAgICBjYXNlICdPdGhlcic6IHJldHVybiBhY2Nlc3NvcihpbmRleCwgJycpIGFzIHN0cmluZzsKKyAgICBjYXNlICdVbnVzZWQnOiByZXR1cm4gYWNjZXNzb3IoaW5kZXgsICcnKSBhcyBzdHJpbmc7CisgICAgZGVmYXVsdDogcmV0dXJuIG51bGw7CisgIH0KK30KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL3RzL3VuaW9uX3ZlY3Rvci9mYWxsaW5nLXR1Yi5qcyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL3RzL3VuaW9uX3ZlY3Rvci9mYWxsaW5nLXR1Yi5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kM2M0ZGZlCi0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvdHMvdW5pb25fdmVjdG9yL2ZhbGxpbmctdHViLmpzCkBAIC0wLDAgKzEsNDQgQEAKKy8vIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGJ5IHRoZSBGbGF0QnVmZmVycyBjb21waWxlciwgZG8gbm90IG1vZGlmeQorZXhwb3J0IGNsYXNzIEZhbGxpbmdUdWIgeworICAgIGNvbnN0cnVjdG9yKCkgeworICAgICAgICB0aGlzLmJiID0gbnVsbDsKKyAgICAgICAgdGhpcy5iYl9wb3MgPSAwOworICAgIH0KKyAgICBfX2luaXQoaSwgYmIpIHsKKyAgICAgICAgdGhpcy5iYl9wb3MgPSBpOworICAgICAgICB0aGlzLmJiID0gYmI7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKyAgICB3ZWlnaHQoKSB7CisgICAgICAgIHJldHVybiB0aGlzLmJiLnJlYWRJbnQzMih0aGlzLmJiX3Bvcyk7CisgICAgfQorICAgIG11dGF0ZV93ZWlnaHQodmFsdWUpIHsKKyAgICAgICAgdGhpcy5iYi53cml0ZUludDMyKHRoaXMuYmJfcG9zICsgMCwgdmFsdWUpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgc3RhdGljIGdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpIHsKKyAgICAgICAgcmV0dXJuICdGYWxsaW5nVHViJzsKKyAgICB9CisgICAgc3RhdGljIHNpemVPZigpIHsKKyAgICAgICAgcmV0dXJuIDQ7CisgICAgfQorICAgIHN0YXRpYyBjcmVhdGVGYWxsaW5nVHViKGJ1aWxkZXIsIHdlaWdodCkgeworICAgICAgICBidWlsZGVyLnByZXAoNCwgNCk7CisgICAgICAgIGJ1aWxkZXIud3JpdGVJbnQzMih3ZWlnaHQpOworICAgICAgICByZXR1cm4gYnVpbGRlci5vZmZzZXQoKTsKKyAgICB9CisgICAgdW5wYWNrKCkgeworICAgICAgICByZXR1cm4gbmV3IEZhbGxpbmdUdWJUKHRoaXMud2VpZ2h0KCkpOworICAgIH0KKyAgICB1bnBhY2tUbyhfbykgeworICAgICAgICBfby53ZWlnaHQgPSB0aGlzLndlaWdodCgpOworICAgIH0KK30KK2V4cG9ydCBjbGFzcyBGYWxsaW5nVHViVCB7CisgICAgY29uc3RydWN0b3Iod2VpZ2h0ID0gMCkgeworICAgICAgICB0aGlzLndlaWdodCA9IHdlaWdodDsKKyAgICB9CisgICAgcGFjayhidWlsZGVyKSB7CisgICAgICAgIHJldHVybiBGYWxsaW5nVHViLmNyZWF0ZUZhbGxpbmdUdWIoYnVpbGRlciwgdGhpcy53ZWlnaHQpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL3RzL3VuaW9uX3ZlY3Rvci9mYWxsaW5nLXR1Yi50cyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL3RzL3VuaW9uX3ZlY3Rvci9mYWxsaW5nLXR1Yi50cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMzJmOTlkCi0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvdHMvdW5pb25fdmVjdG9yL2ZhbGxpbmctdHViLnRzCkBAIC0wLDAgKzEsNjMgQEAKKy8vIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGJ5IHRoZSBGbGF0QnVmZmVycyBjb21waWxlciwgZG8gbm90IG1vZGlmeQorCitpbXBvcnQgKiBhcyBmbGF0YnVmZmVycyBmcm9tICdmbGF0YnVmZmVycyc7CisKKworCitleHBvcnQgY2xhc3MgRmFsbGluZ1R1YiB7CisgIGJiOiBmbGF0YnVmZmVycy5CeXRlQnVmZmVyfG51bGwgPSBudWxsOworICBiYl9wb3MgPSAwOworICBfX2luaXQoaTpudW1iZXIsIGJiOmZsYXRidWZmZXJzLkJ5dGVCdWZmZXIpOkZhbGxpbmdUdWIgeworICB0aGlzLmJiX3BvcyA9IGk7CisgIHRoaXMuYmIgPSBiYjsKKyAgcmV0dXJuIHRoaXM7Cit9CisKK3dlaWdodCgpOm51bWJlciB7CisgIHJldHVybiB0aGlzLmJiIS5yZWFkSW50MzIodGhpcy5iYl9wb3MpOworfQorCittdXRhdGVfd2VpZ2h0KHZhbHVlOm51bWJlcik6Ym9vbGVhbiB7CisgIHRoaXMuYmIhLndyaXRlSW50MzIodGhpcy5iYl9wb3MgKyAwLCB2YWx1ZSk7CisgIHJldHVybiB0cnVlOworfQorCitzdGF0aWMgZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCk6c3RyaW5nIHsKKyAgcmV0dXJuICdGYWxsaW5nVHViJzsKK30KKworc3RhdGljIHNpemVPZigpOm51bWJlciB7CisgIHJldHVybiA0OworfQorCitzdGF0aWMgY3JlYXRlRmFsbGluZ1R1YihidWlsZGVyOmZsYXRidWZmZXJzLkJ1aWxkZXIsIHdlaWdodDogbnVtYmVyKTpmbGF0YnVmZmVycy5PZmZzZXQgeworICBidWlsZGVyLnByZXAoNCwgNCk7CisgIGJ1aWxkZXIud3JpdGVJbnQzMih3ZWlnaHQpOworICByZXR1cm4gYnVpbGRlci5vZmZzZXQoKTsKK30KKworCit1bnBhY2soKTogRmFsbGluZ1R1YlQgeworICByZXR1cm4gbmV3IEZhbGxpbmdUdWJUKAorICAgIHRoaXMud2VpZ2h0KCkKKyAgKTsKK30KKworCit1bnBhY2tUbyhfbzogRmFsbGluZ1R1YlQpOiB2b2lkIHsKKyAgX28ud2VpZ2h0ID0gdGhpcy53ZWlnaHQoKTsKK30KK30KKworZXhwb3J0IGNsYXNzIEZhbGxpbmdUdWJUIHsKK2NvbnN0cnVjdG9yKAorICBwdWJsaWMgd2VpZ2h0OiBudW1iZXIgPSAwCispe30KKworCitwYWNrKGJ1aWxkZXI6ZmxhdGJ1ZmZlcnMuQnVpbGRlcik6IGZsYXRidWZmZXJzLk9mZnNldCB7CisgIHJldHVybiBGYWxsaW5nVHViLmNyZWF0ZUZhbGxpbmdUdWIoYnVpbGRlciwKKyAgICB0aGlzLndlaWdodAorICApOworfQorfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvdHMvdW5pb25fdmVjdG9yL2dhZGdldC5qcyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL3RzL3VuaW9uX3ZlY3Rvci9nYWRnZXQuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjAyYTIxNAotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL3RzL3VuaW9uX3ZlY3Rvci9nYWRnZXQuanMKQEAgLTAsMCArMSwyNSBAQAorLy8gYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgYnkgdGhlIEZsYXRCdWZmZXJzIGNvbXBpbGVyLCBkbyBub3QgbW9kaWZ5CitpbXBvcnQgeyBGYWxsaW5nVHViIH0gZnJvbSAnLi9mYWxsaW5nLXR1Yi5qcyc7CitpbXBvcnQgeyBIYW5kRmFuIH0gZnJvbSAnLi9oYW5kLWZhbi5qcyc7CitleHBvcnQgdmFyIEdhZGdldDsKKyhmdW5jdGlvbiAoR2FkZ2V0KSB7CisgICAgR2FkZ2V0W0dhZGdldFsiTk9ORSJdID0gMF0gPSAiTk9ORSI7CisgICAgR2FkZ2V0W0dhZGdldFsiRmFsbGluZ1R1YiJdID0gMV0gPSAiRmFsbGluZ1R1YiI7CisgICAgR2FkZ2V0W0dhZGdldFsiSGFuZEZhbiJdID0gMl0gPSAiSGFuZEZhbiI7Cit9KShHYWRnZXQgfHwgKEdhZGdldCA9IHt9KSk7CitleHBvcnQgZnVuY3Rpb24gdW5pb25Ub0dhZGdldCh0eXBlLCBhY2Nlc3NvcikgeworICAgIHN3aXRjaCAoR2FkZ2V0W3R5cGVdKSB7CisgICAgICAgIGNhc2UgJ05PTkUnOiByZXR1cm4gbnVsbDsKKyAgICAgICAgY2FzZSAnRmFsbGluZ1R1Yic6IHJldHVybiBhY2Nlc3NvcihuZXcgRmFsbGluZ1R1YigpKTsKKyAgICAgICAgY2FzZSAnSGFuZEZhbic6IHJldHVybiBhY2Nlc3NvcihuZXcgSGFuZEZhbigpKTsKKyAgICAgICAgZGVmYXVsdDogcmV0dXJuIG51bGw7CisgICAgfQorfQorZXhwb3J0IGZ1bmN0aW9uIHVuaW9uTGlzdFRvR2FkZ2V0KHR5cGUsIGFjY2Vzc29yLCBpbmRleCkgeworICAgIHN3aXRjaCAoR2FkZ2V0W3R5cGVdKSB7CisgICAgICAgIGNhc2UgJ05PTkUnOiByZXR1cm4gbnVsbDsKKyAgICAgICAgY2FzZSAnRmFsbGluZ1R1Yic6IHJldHVybiBhY2Nlc3NvcihpbmRleCwgbmV3IEZhbGxpbmdUdWIoKSk7CisgICAgICAgIGNhc2UgJ0hhbmRGYW4nOiByZXR1cm4gYWNjZXNzb3IoaW5kZXgsIG5ldyBIYW5kRmFuKCkpOworICAgICAgICBkZWZhdWx0OiByZXR1cm4gbnVsbDsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy90cy91bmlvbl92ZWN0b3IvZ2FkZ2V0LnRzIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvdHMvdW5pb25fdmVjdG9yL2dhZGdldC50cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNmUxMTdiCi0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvdHMvdW5pb25fdmVjdG9yL2dhZGdldC50cwpAQCAtMCwwICsxLDM2IEBACisvLyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBieSB0aGUgRmxhdEJ1ZmZlcnMgY29tcGlsZXIsIGRvIG5vdCBtb2RpZnkKKworaW1wb3J0IHsgRmFsbGluZ1R1YiwgRmFsbGluZ1R1YlQgfSBmcm9tICcuL2ZhbGxpbmctdHViLmpzJzsKK2ltcG9ydCB7IEhhbmRGYW4sIEhhbmRGYW5UIH0gZnJvbSAnLi9oYW5kLWZhbi5qcyc7CisKKworZXhwb3J0IGVudW0gR2FkZ2V0IHsKKyAgTk9ORSA9IDAsCisgIEZhbGxpbmdUdWIgPSAxLAorICBIYW5kRmFuID0gMgorfQorCitleHBvcnQgZnVuY3Rpb24gdW5pb25Ub0dhZGdldCgKKyAgdHlwZTogR2FkZ2V0LAorICBhY2Nlc3NvcjogKG9iajpGYWxsaW5nVHVifEhhbmRGYW4pID0+IEZhbGxpbmdUdWJ8SGFuZEZhbnxudWxsCispOiBGYWxsaW5nVHVifEhhbmRGYW58bnVsbCB7CisgIHN3aXRjaChHYWRnZXRbdHlwZV0pIHsKKyAgICBjYXNlICdOT05FJzogcmV0dXJuIG51bGw7IAorICAgIGNhc2UgJ0ZhbGxpbmdUdWInOiByZXR1cm4gYWNjZXNzb3IobmV3IEZhbGxpbmdUdWIoKSkhIGFzIEZhbGxpbmdUdWI7CisgICAgY2FzZSAnSGFuZEZhbic6IHJldHVybiBhY2Nlc3NvcihuZXcgSGFuZEZhbigpKSEgYXMgSGFuZEZhbjsKKyAgICBkZWZhdWx0OiByZXR1cm4gbnVsbDsKKyAgfQorfQorCitleHBvcnQgZnVuY3Rpb24gdW5pb25MaXN0VG9HYWRnZXQoCisgIHR5cGU6IEdhZGdldCwgCisgIGFjY2Vzc29yOiAoaW5kZXg6IG51bWJlciwgb2JqOkZhbGxpbmdUdWJ8SGFuZEZhbikgPT4gRmFsbGluZ1R1YnxIYW5kRmFufG51bGwsIAorICBpbmRleDogbnVtYmVyCispOiBGYWxsaW5nVHVifEhhbmRGYW58bnVsbCB7CisgIHN3aXRjaChHYWRnZXRbdHlwZV0pIHsKKyAgICBjYXNlICdOT05FJzogcmV0dXJuIG51bGw7IAorICAgIGNhc2UgJ0ZhbGxpbmdUdWInOiByZXR1cm4gYWNjZXNzb3IoaW5kZXgsIG5ldyBGYWxsaW5nVHViKCkpISBhcyBGYWxsaW5nVHViOworICAgIGNhc2UgJ0hhbmRGYW4nOiByZXR1cm4gYWNjZXNzb3IoaW5kZXgsIG5ldyBIYW5kRmFuKCkpISBhcyBIYW5kRmFuOworICAgIGRlZmF1bHQ6IHJldHVybiBudWxsOworICB9Cit9CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy90cy91bmlvbl92ZWN0b3IvaGFuZC1mYW4uanMgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy90cy91bmlvbl92ZWN0b3IvaGFuZC1mYW4uanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjFkZWNjYQotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL3RzL3VuaW9uX3ZlY3Rvci9oYW5kLWZhbi5qcwpAQCAtMCwwICsxLDY0IEBACisvLyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBieSB0aGUgRmxhdEJ1ZmZlcnMgY29tcGlsZXIsIGRvIG5vdCBtb2RpZnkKK2ltcG9ydCAqIGFzIGZsYXRidWZmZXJzIGZyb20gJ2ZsYXRidWZmZXJzJzsKK2V4cG9ydCBjbGFzcyBIYW5kRmFuIHsKKyAgICBjb25zdHJ1Y3RvcigpIHsKKyAgICAgICAgdGhpcy5iYiA9IG51bGw7CisgICAgICAgIHRoaXMuYmJfcG9zID0gMDsKKyAgICB9CisgICAgX19pbml0KGksIGJiKSB7CisgICAgICAgIHRoaXMuYmJfcG9zID0gaTsKKyAgICAgICAgdGhpcy5iYiA9IGJiOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisgICAgc3RhdGljIGdldFJvb3RBc0hhbmRGYW4oYmIsIG9iaikgeworICAgICAgICByZXR1cm4gKG9iaiB8fCBuZXcgSGFuZEZhbigpKS5fX2luaXQoYmIucmVhZEludDMyKGJiLnBvc2l0aW9uKCkpICsgYmIucG9zaXRpb24oKSwgYmIpOworICAgIH0KKyAgICBzdGF0aWMgZ2V0U2l6ZVByZWZpeGVkUm9vdEFzSGFuZEZhbihiYiwgb2JqKSB7CisgICAgICAgIGJiLnNldFBvc2l0aW9uKGJiLnBvc2l0aW9uKCkgKyBmbGF0YnVmZmVycy5TSVpFX1BSRUZJWF9MRU5HVEgpOworICAgICAgICByZXR1cm4gKG9iaiB8fCBuZXcgSGFuZEZhbigpKS5fX2luaXQoYmIucmVhZEludDMyKGJiLnBvc2l0aW9uKCkpICsgYmIucG9zaXRpb24oKSwgYmIpOworICAgIH0KKyAgICBsZW5ndGgoKSB7CisgICAgICAgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsIDQpOworICAgICAgICByZXR1cm4gb2Zmc2V0ID8gdGhpcy5iYi5yZWFkSW50MzIodGhpcy5iYl9wb3MgKyBvZmZzZXQpIDogMDsKKyAgICB9CisgICAgbXV0YXRlX2xlbmd0aCh2YWx1ZSkgeworICAgICAgICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCA0KTsKKyAgICAgICAgaWYgKG9mZnNldCA9PT0gMCkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIHRoaXMuYmIud3JpdGVJbnQzMih0aGlzLmJiX3BvcyArIG9mZnNldCwgdmFsdWUpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgc3RhdGljIGdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpIHsKKyAgICAgICAgcmV0dXJuICdIYW5kRmFuJzsKKyAgICB9CisgICAgc3RhdGljIHN0YXJ0SGFuZEZhbihidWlsZGVyKSB7CisgICAgICAgIGJ1aWxkZXIuc3RhcnRPYmplY3QoMSk7CisgICAgfQorICAgIHN0YXRpYyBhZGRMZW5ndGgoYnVpbGRlciwgbGVuZ3RoKSB7CisgICAgICAgIGJ1aWxkZXIuYWRkRmllbGRJbnQzMigwLCBsZW5ndGgsIDApOworICAgIH0KKyAgICBzdGF0aWMgZW5kSGFuZEZhbihidWlsZGVyKSB7CisgICAgICAgIGNvbnN0IG9mZnNldCA9IGJ1aWxkZXIuZW5kT2JqZWN0KCk7CisgICAgICAgIHJldHVybiBvZmZzZXQ7CisgICAgfQorICAgIHN0YXRpYyBjcmVhdGVIYW5kRmFuKGJ1aWxkZXIsIGxlbmd0aCkgeworICAgICAgICBIYW5kRmFuLnN0YXJ0SGFuZEZhbihidWlsZGVyKTsKKyAgICAgICAgSGFuZEZhbi5hZGRMZW5ndGgoYnVpbGRlciwgbGVuZ3RoKTsKKyAgICAgICAgcmV0dXJuIEhhbmRGYW4uZW5kSGFuZEZhbihidWlsZGVyKTsKKyAgICB9CisgICAgdW5wYWNrKCkgeworICAgICAgICByZXR1cm4gbmV3IEhhbmRGYW5UKHRoaXMubGVuZ3RoKCkpOworICAgIH0KKyAgICB1bnBhY2tUbyhfbykgeworICAgICAgICBfby5sZW5ndGggPSB0aGlzLmxlbmd0aCgpOworICAgIH0KK30KK2V4cG9ydCBjbGFzcyBIYW5kRmFuVCB7CisgICAgY29uc3RydWN0b3IobGVuZ3RoID0gMCkgeworICAgICAgICB0aGlzLmxlbmd0aCA9IGxlbmd0aDsKKyAgICB9CisgICAgcGFjayhidWlsZGVyKSB7CisgICAgICAgIHJldHVybiBIYW5kRmFuLmNyZWF0ZUhhbmRGYW4oYnVpbGRlciwgdGhpcy5sZW5ndGgpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL3RzL3VuaW9uX3ZlY3Rvci9oYW5kLWZhbi50cyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL3RzL3VuaW9uX3ZlY3Rvci9oYW5kLWZhbi50cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOTBiNGRkCi0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvdHMvdW5pb25fdmVjdG9yL2hhbmQtZmFuLnRzCkBAIC0wLDAgKzEsODcgQEAKKy8vIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGJ5IHRoZSBGbGF0QnVmZmVycyBjb21waWxlciwgZG8gbm90IG1vZGlmeQorCitpbXBvcnQgKiBhcyBmbGF0YnVmZmVycyBmcm9tICdmbGF0YnVmZmVycyc7CisKKworCitleHBvcnQgY2xhc3MgSGFuZEZhbiB7CisgIGJiOiBmbGF0YnVmZmVycy5CeXRlQnVmZmVyfG51bGwgPSBudWxsOworICBiYl9wb3MgPSAwOworICBfX2luaXQoaTpudW1iZXIsIGJiOmZsYXRidWZmZXJzLkJ5dGVCdWZmZXIpOkhhbmRGYW4geworICB0aGlzLmJiX3BvcyA9IGk7CisgIHRoaXMuYmIgPSBiYjsKKyAgcmV0dXJuIHRoaXM7Cit9CisKK3N0YXRpYyBnZXRSb290QXNIYW5kRmFuKGJiOmZsYXRidWZmZXJzLkJ5dGVCdWZmZXIsIG9iaj86SGFuZEZhbik6SGFuZEZhbiB7CisgIHJldHVybiAob2JqIHx8IG5ldyBIYW5kRmFuKCkpLl9faW5pdChiYi5yZWFkSW50MzIoYmIucG9zaXRpb24oKSkgKyBiYi5wb3NpdGlvbigpLCBiYik7Cit9CisKK3N0YXRpYyBnZXRTaXplUHJlZml4ZWRSb290QXNIYW5kRmFuKGJiOmZsYXRidWZmZXJzLkJ5dGVCdWZmZXIsIG9iaj86SGFuZEZhbik6SGFuZEZhbiB7CisgIGJiLnNldFBvc2l0aW9uKGJiLnBvc2l0aW9uKCkgKyBmbGF0YnVmZmVycy5TSVpFX1BSRUZJWF9MRU5HVEgpOworICByZXR1cm4gKG9iaiB8fCBuZXcgSGFuZEZhbigpKS5fX2luaXQoYmIucmVhZEludDMyKGJiLnBvc2l0aW9uKCkpICsgYmIucG9zaXRpb24oKSwgYmIpOworfQorCitsZW5ndGgoKTpudW1iZXIgeworICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiIS5fX29mZnNldCh0aGlzLmJiX3BvcywgNCk7CisgIHJldHVybiBvZmZzZXQgPyB0aGlzLmJiIS5yZWFkSW50MzIodGhpcy5iYl9wb3MgKyBvZmZzZXQpIDogMDsKK30KKworbXV0YXRlX2xlbmd0aCh2YWx1ZTpudW1iZXIpOmJvb2xlYW4geworICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiIS5fX29mZnNldCh0aGlzLmJiX3BvcywgNCk7CisKKyAgaWYgKG9mZnNldCA9PT0gMCkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHRoaXMuYmIhLndyaXRlSW50MzIodGhpcy5iYl9wb3MgKyBvZmZzZXQsIHZhbHVlKTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyBnZXRGdWxseVF1YWxpZmllZE5hbWUoKTpzdHJpbmcgeworICByZXR1cm4gJ0hhbmRGYW4nOworfQorCitzdGF0aWMgc3RhcnRIYW5kRmFuKGJ1aWxkZXI6ZmxhdGJ1ZmZlcnMuQnVpbGRlcikgeworICBidWlsZGVyLnN0YXJ0T2JqZWN0KDEpOworfQorCitzdGF0aWMgYWRkTGVuZ3RoKGJ1aWxkZXI6ZmxhdGJ1ZmZlcnMuQnVpbGRlciwgbGVuZ3RoOm51bWJlcikgeworICBidWlsZGVyLmFkZEZpZWxkSW50MzIoMCwgbGVuZ3RoLCAwKTsKK30KKworc3RhdGljIGVuZEhhbmRGYW4oYnVpbGRlcjpmbGF0YnVmZmVycy5CdWlsZGVyKTpmbGF0YnVmZmVycy5PZmZzZXQgeworICBjb25zdCBvZmZzZXQgPSBidWlsZGVyLmVuZE9iamVjdCgpOworICByZXR1cm4gb2Zmc2V0OworfQorCitzdGF0aWMgY3JlYXRlSGFuZEZhbihidWlsZGVyOmZsYXRidWZmZXJzLkJ1aWxkZXIsIGxlbmd0aDpudW1iZXIpOmZsYXRidWZmZXJzLk9mZnNldCB7CisgIEhhbmRGYW4uc3RhcnRIYW5kRmFuKGJ1aWxkZXIpOworICBIYW5kRmFuLmFkZExlbmd0aChidWlsZGVyLCBsZW5ndGgpOworICByZXR1cm4gSGFuZEZhbi5lbmRIYW5kRmFuKGJ1aWxkZXIpOworfQorCit1bnBhY2soKTogSGFuZEZhblQgeworICByZXR1cm4gbmV3IEhhbmRGYW5UKAorICAgIHRoaXMubGVuZ3RoKCkKKyAgKTsKK30KKworCit1bnBhY2tUbyhfbzogSGFuZEZhblQpOiB2b2lkIHsKKyAgX28ubGVuZ3RoID0gdGhpcy5sZW5ndGgoKTsKK30KK30KKworZXhwb3J0IGNsYXNzIEhhbmRGYW5UIHsKK2NvbnN0cnVjdG9yKAorICBwdWJsaWMgbGVuZ3RoOiBudW1iZXIgPSAwCispe30KKworCitwYWNrKGJ1aWxkZXI6ZmxhdGJ1ZmZlcnMuQnVpbGRlcik6IGZsYXRidWZmZXJzLk9mZnNldCB7CisgIHJldHVybiBIYW5kRmFuLmNyZWF0ZUhhbmRGYW4oYnVpbGRlciwKKyAgICB0aGlzLmxlbmd0aAorICApOworfQorfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvdHMvdW5pb25fdmVjdG9yL21vdmllLmpzIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvdHMvdW5pb25fdmVjdG9yL21vdmllLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAyNDVhNDMKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy90cy91bmlvbl92ZWN0b3IvbW92aWUuanMKQEAgLTAsMCArMSwxODUgQEAKKy8vIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGJ5IHRoZSBGbGF0QnVmZmVycyBjb21waWxlciwgZG8gbm90IG1vZGlmeQoraW1wb3J0ICogYXMgZmxhdGJ1ZmZlcnMgZnJvbSAnZmxhdGJ1ZmZlcnMnOworaW1wb3J0IHsgQ2hhcmFjdGVyLCB1bmlvblRvQ2hhcmFjdGVyLCB1bmlvbkxpc3RUb0NoYXJhY3RlciB9IGZyb20gJy4vY2hhcmFjdGVyLmpzJzsKK2V4cG9ydCBjbGFzcyBNb3ZpZSB7CisgICAgY29uc3RydWN0b3IoKSB7CisgICAgICAgIHRoaXMuYmIgPSBudWxsOworICAgICAgICB0aGlzLmJiX3BvcyA9IDA7CisgICAgfQorICAgIF9faW5pdChpLCBiYikgeworICAgICAgICB0aGlzLmJiX3BvcyA9IGk7CisgICAgICAgIHRoaXMuYmIgPSBiYjsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorICAgIHN0YXRpYyBnZXRSb290QXNNb3ZpZShiYiwgb2JqKSB7CisgICAgICAgIHJldHVybiAob2JqIHx8IG5ldyBNb3ZpZSgpKS5fX2luaXQoYmIucmVhZEludDMyKGJiLnBvc2l0aW9uKCkpICsgYmIucG9zaXRpb24oKSwgYmIpOworICAgIH0KKyAgICBzdGF0aWMgZ2V0U2l6ZVByZWZpeGVkUm9vdEFzTW92aWUoYmIsIG9iaikgeworICAgICAgICBiYi5zZXRQb3NpdGlvbihiYi5wb3NpdGlvbigpICsgZmxhdGJ1ZmZlcnMuU0laRV9QUkVGSVhfTEVOR1RIKTsKKyAgICAgICAgcmV0dXJuIChvYmogfHwgbmV3IE1vdmllKCkpLl9faW5pdChiYi5yZWFkSW50MzIoYmIucG9zaXRpb24oKSkgKyBiYi5wb3NpdGlvbigpLCBiYik7CisgICAgfQorICAgIHN0YXRpYyBidWZmZXJIYXNJZGVudGlmaWVyKGJiKSB7CisgICAgICAgIHJldHVybiBiYi5fX2hhc19pZGVudGlmaWVyKCdNT1ZJJyk7CisgICAgfQorICAgIG1haW5DaGFyYWN0ZXJUeXBlKCkgeworICAgICAgICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCA0KTsKKyAgICAgICAgcmV0dXJuIG9mZnNldCA/IHRoaXMuYmIucmVhZFVpbnQ4KHRoaXMuYmJfcG9zICsgb2Zmc2V0KSA6IENoYXJhY3Rlci5OT05FOworICAgIH0KKyAgICBtYWluQ2hhcmFjdGVyKG9iaikgeworICAgICAgICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCA2KTsKKyAgICAgICAgcmV0dXJuIG9mZnNldCA/IHRoaXMuYmIuX191bmlvbl93aXRoX3N0cmluZyhvYmosIHRoaXMuYmJfcG9zICsgb2Zmc2V0KSA6IG51bGw7CisgICAgfQorICAgIGNoYXJhY3RlcnNUeXBlKGluZGV4KSB7CisgICAgICAgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsIDgpOworICAgICAgICByZXR1cm4gb2Zmc2V0ID8gdGhpcy5iYi5yZWFkVWludDgodGhpcy5iYi5fX3ZlY3Rvcih0aGlzLmJiX3BvcyArIG9mZnNldCkgKyBpbmRleCkgOiAwOworICAgIH0KKyAgICBjaGFyYWN0ZXJzVHlwZUxlbmd0aCgpIHsKKyAgICAgICAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywgOCk7CisgICAgICAgIHJldHVybiBvZmZzZXQgPyB0aGlzLmJiLl9fdmVjdG9yX2xlbih0aGlzLmJiX3BvcyArIG9mZnNldCkgOiAwOworICAgIH0KKyAgICBjaGFyYWN0ZXJzVHlwZUFycmF5KCkgeworICAgICAgICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCA4KTsKKyAgICAgICAgcmV0dXJuIG9mZnNldCA/IG5ldyBVaW50OEFycmF5KHRoaXMuYmIuYnl0ZXMoKS5idWZmZXIsIHRoaXMuYmIuYnl0ZXMoKS5ieXRlT2Zmc2V0ICsgdGhpcy5iYi5fX3ZlY3Rvcih0aGlzLmJiX3BvcyArIG9mZnNldCksIHRoaXMuYmIuX192ZWN0b3JfbGVuKHRoaXMuYmJfcG9zICsgb2Zmc2V0KSkgOiBudWxsOworICAgIH0KKyAgICBjaGFyYWN0ZXJzKGluZGV4LCBvYmopIHsKKyAgICAgICAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywgMTApOworICAgICAgICByZXR1cm4gb2Zmc2V0ID8gdGhpcy5iYi5fX3VuaW9uX3dpdGhfc3RyaW5nKG9iaiwgdGhpcy5iYi5fX3ZlY3Rvcih0aGlzLmJiX3BvcyArIG9mZnNldCkgKyBpbmRleCAqIDQpIDogbnVsbDsKKyAgICB9CisgICAgY2hhcmFjdGVyc0xlbmd0aCgpIHsKKyAgICAgICAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywgMTApOworICAgICAgICByZXR1cm4gb2Zmc2V0ID8gdGhpcy5iYi5fX3ZlY3Rvcl9sZW4odGhpcy5iYl9wb3MgKyBvZmZzZXQpIDogMDsKKyAgICB9CisgICAgc3RhdGljIGdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpIHsKKyAgICAgICAgcmV0dXJuICdNb3ZpZSc7CisgICAgfQorICAgIHN0YXRpYyBzdGFydE1vdmllKGJ1aWxkZXIpIHsKKyAgICAgICAgYnVpbGRlci5zdGFydE9iamVjdCg0KTsKKyAgICB9CisgICAgc3RhdGljIGFkZE1haW5DaGFyYWN0ZXJUeXBlKGJ1aWxkZXIsIG1haW5DaGFyYWN0ZXJUeXBlKSB7CisgICAgICAgIGJ1aWxkZXIuYWRkRmllbGRJbnQ4KDAsIG1haW5DaGFyYWN0ZXJUeXBlLCBDaGFyYWN0ZXIuTk9ORSk7CisgICAgfQorICAgIHN0YXRpYyBhZGRNYWluQ2hhcmFjdGVyKGJ1aWxkZXIsIG1haW5DaGFyYWN0ZXJPZmZzZXQpIHsKKyAgICAgICAgYnVpbGRlci5hZGRGaWVsZE9mZnNldCgxLCBtYWluQ2hhcmFjdGVyT2Zmc2V0LCAwKTsKKyAgICB9CisgICAgc3RhdGljIGFkZENoYXJhY3RlcnNUeXBlKGJ1aWxkZXIsIGNoYXJhY3RlcnNUeXBlT2Zmc2V0KSB7CisgICAgICAgIGJ1aWxkZXIuYWRkRmllbGRPZmZzZXQoMiwgY2hhcmFjdGVyc1R5cGVPZmZzZXQsIDApOworICAgIH0KKyAgICBzdGF0aWMgY3JlYXRlQ2hhcmFjdGVyc1R5cGVWZWN0b3IoYnVpbGRlciwgZGF0YSkgeworICAgICAgICBidWlsZGVyLnN0YXJ0VmVjdG9yKDEsIGRhdGEubGVuZ3RoLCAxKTsKKyAgICAgICAgZm9yIChsZXQgaSA9IGRhdGEubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHsKKyAgICAgICAgICAgIGJ1aWxkZXIuYWRkSW50OChkYXRhW2ldKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gYnVpbGRlci5lbmRWZWN0b3IoKTsKKyAgICB9CisgICAgc3RhdGljIHN0YXJ0Q2hhcmFjdGVyc1R5cGVWZWN0b3IoYnVpbGRlciwgbnVtRWxlbXMpIHsKKyAgICAgICAgYnVpbGRlci5zdGFydFZlY3RvcigxLCBudW1FbGVtcywgMSk7CisgICAgfQorICAgIHN0YXRpYyBhZGRDaGFyYWN0ZXJzKGJ1aWxkZXIsIGNoYXJhY3RlcnNPZmZzZXQpIHsKKyAgICAgICAgYnVpbGRlci5hZGRGaWVsZE9mZnNldCgzLCBjaGFyYWN0ZXJzT2Zmc2V0LCAwKTsKKyAgICB9CisgICAgc3RhdGljIGNyZWF0ZUNoYXJhY3RlcnNWZWN0b3IoYnVpbGRlciwgZGF0YSkgeworICAgICAgICBidWlsZGVyLnN0YXJ0VmVjdG9yKDQsIGRhdGEubGVuZ3RoLCA0KTsKKyAgICAgICAgZm9yIChsZXQgaSA9IGRhdGEubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHsKKyAgICAgICAgICAgIGJ1aWxkZXIuYWRkT2Zmc2V0KGRhdGFbaV0pOworICAgICAgICB9CisgICAgICAgIHJldHVybiBidWlsZGVyLmVuZFZlY3RvcigpOworICAgIH0KKyAgICBzdGF0aWMgc3RhcnRDaGFyYWN0ZXJzVmVjdG9yKGJ1aWxkZXIsIG51bUVsZW1zKSB7CisgICAgICAgIGJ1aWxkZXIuc3RhcnRWZWN0b3IoNCwgbnVtRWxlbXMsIDQpOworICAgIH0KKyAgICBzdGF0aWMgZW5kTW92aWUoYnVpbGRlcikgeworICAgICAgICBjb25zdCBvZmZzZXQgPSBidWlsZGVyLmVuZE9iamVjdCgpOworICAgICAgICByZXR1cm4gb2Zmc2V0OworICAgIH0KKyAgICBzdGF0aWMgZmluaXNoTW92aWVCdWZmZXIoYnVpbGRlciwgb2Zmc2V0KSB7CisgICAgICAgIGJ1aWxkZXIuZmluaXNoKG9mZnNldCwgJ01PVkknKTsKKyAgICB9CisgICAgc3RhdGljIGZpbmlzaFNpemVQcmVmaXhlZE1vdmllQnVmZmVyKGJ1aWxkZXIsIG9mZnNldCkgeworICAgICAgICBidWlsZGVyLmZpbmlzaChvZmZzZXQsICdNT1ZJJywgdHJ1ZSk7CisgICAgfQorICAgIHN0YXRpYyBjcmVhdGVNb3ZpZShidWlsZGVyLCBtYWluQ2hhcmFjdGVyVHlwZSwgbWFpbkNoYXJhY3Rlck9mZnNldCwgY2hhcmFjdGVyc1R5cGVPZmZzZXQsIGNoYXJhY3RlcnNPZmZzZXQpIHsKKyAgICAgICAgTW92aWUuc3RhcnRNb3ZpZShidWlsZGVyKTsKKyAgICAgICAgTW92aWUuYWRkTWFpbkNoYXJhY3RlclR5cGUoYnVpbGRlciwgbWFpbkNoYXJhY3RlclR5cGUpOworICAgICAgICBNb3ZpZS5hZGRNYWluQ2hhcmFjdGVyKGJ1aWxkZXIsIG1haW5DaGFyYWN0ZXJPZmZzZXQpOworICAgICAgICBNb3ZpZS5hZGRDaGFyYWN0ZXJzVHlwZShidWlsZGVyLCBjaGFyYWN0ZXJzVHlwZU9mZnNldCk7CisgICAgICAgIE1vdmllLmFkZENoYXJhY3RlcnMoYnVpbGRlciwgY2hhcmFjdGVyc09mZnNldCk7CisgICAgICAgIHJldHVybiBNb3ZpZS5lbmRNb3ZpZShidWlsZGVyKTsKKyAgICB9CisgICAgdW5wYWNrKCkgeworICAgICAgICByZXR1cm4gbmV3IE1vdmllVCh0aGlzLm1haW5DaGFyYWN0ZXJUeXBlKCksICgoKSA9PiB7CisgICAgICAgICAgICBsZXQgdGVtcCA9IHVuaW9uVG9DaGFyYWN0ZXIodGhpcy5tYWluQ2hhcmFjdGVyVHlwZSgpLCB0aGlzLm1haW5DaGFyYWN0ZXIuYmluZCh0aGlzKSk7CisgICAgICAgICAgICBpZiAodGVtcCA9PT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHR5cGVvZiB0ZW1wID09PSAnc3RyaW5nJykgeworICAgICAgICAgICAgICAgIHJldHVybiB0ZW1wOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHRlbXAudW5wYWNrKCk7CisgICAgICAgIH0pKCksIHRoaXMuYmIuY3JlYXRlU2NhbGFyTGlzdCh0aGlzLmNoYXJhY3RlcnNUeXBlLmJpbmQodGhpcyksIHRoaXMuY2hhcmFjdGVyc1R5cGVMZW5ndGgoKSksICgoKSA9PiB7CisgICAgICAgICAgICBsZXQgcmV0ID0gW107CisgICAgICAgICAgICBmb3IgKGxldCB0YXJnZXRFbnVtSW5kZXggPSAwOyB0YXJnZXRFbnVtSW5kZXggPCB0aGlzLmNoYXJhY3RlcnNUeXBlTGVuZ3RoKCk7ICsrdGFyZ2V0RW51bUluZGV4KSB7CisgICAgICAgICAgICAgICAgbGV0IHRhcmdldEVudW0gPSB0aGlzLmNoYXJhY3RlcnNUeXBlKHRhcmdldEVudW1JbmRleCk7CisgICAgICAgICAgICAgICAgaWYgKHRhcmdldEVudW0gPT09IG51bGwgfHwgQ2hhcmFjdGVyW3RhcmdldEVudW1dID09PSAnTk9ORScpIHsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGxldCB0ZW1wID0gdW5pb25MaXN0VG9DaGFyYWN0ZXIodGFyZ2V0RW51bSwgdGhpcy5jaGFyYWN0ZXJzLmJpbmQodGhpcyksIHRhcmdldEVudW1JbmRleCk7CisgICAgICAgICAgICAgICAgaWYgKHRlbXAgPT09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgdGVtcCA9PT0gJ3N0cmluZycpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0LnB1c2godGVtcCk7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXQucHVzaCh0ZW1wLnVucGFjaygpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIH0pKCkpOworICAgIH0KKyAgICB1bnBhY2tUbyhfbykgeworICAgICAgICBfby5tYWluQ2hhcmFjdGVyVHlwZSA9IHRoaXMubWFpbkNoYXJhY3RlclR5cGUoKTsKKyAgICAgICAgX28ubWFpbkNoYXJhY3RlciA9ICgoKSA9PiB7CisgICAgICAgICAgICBsZXQgdGVtcCA9IHVuaW9uVG9DaGFyYWN0ZXIodGhpcy5tYWluQ2hhcmFjdGVyVHlwZSgpLCB0aGlzLm1haW5DaGFyYWN0ZXIuYmluZCh0aGlzKSk7CisgICAgICAgICAgICBpZiAodGVtcCA9PT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHR5cGVvZiB0ZW1wID09PSAnc3RyaW5nJykgeworICAgICAgICAgICAgICAgIHJldHVybiB0ZW1wOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHRlbXAudW5wYWNrKCk7CisgICAgICAgIH0pKCk7CisgICAgICAgIF9vLmNoYXJhY3RlcnNUeXBlID0gdGhpcy5iYi5jcmVhdGVTY2FsYXJMaXN0KHRoaXMuY2hhcmFjdGVyc1R5cGUuYmluZCh0aGlzKSwgdGhpcy5jaGFyYWN0ZXJzVHlwZUxlbmd0aCgpKTsKKyAgICAgICAgX28uY2hhcmFjdGVycyA9ICgoKSA9PiB7CisgICAgICAgICAgICBsZXQgcmV0ID0gW107CisgICAgICAgICAgICBmb3IgKGxldCB0YXJnZXRFbnVtSW5kZXggPSAwOyB0YXJnZXRFbnVtSW5kZXggPCB0aGlzLmNoYXJhY3RlcnNUeXBlTGVuZ3RoKCk7ICsrdGFyZ2V0RW51bUluZGV4KSB7CisgICAgICAgICAgICAgICAgbGV0IHRhcmdldEVudW0gPSB0aGlzLmNoYXJhY3RlcnNUeXBlKHRhcmdldEVudW1JbmRleCk7CisgICAgICAgICAgICAgICAgaWYgKHRhcmdldEVudW0gPT09IG51bGwgfHwgQ2hhcmFjdGVyW3RhcmdldEVudW1dID09PSAnTk9ORScpIHsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGxldCB0ZW1wID0gdW5pb25MaXN0VG9DaGFyYWN0ZXIodGFyZ2V0RW51bSwgdGhpcy5jaGFyYWN0ZXJzLmJpbmQodGhpcyksIHRhcmdldEVudW1JbmRleCk7CisgICAgICAgICAgICAgICAgaWYgKHRlbXAgPT09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgdGVtcCA9PT0gJ3N0cmluZycpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0LnB1c2godGVtcCk7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXQucHVzaCh0ZW1wLnVucGFjaygpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIH0pKCk7CisgICAgfQorfQorZXhwb3J0IGNsYXNzIE1vdmllVCB7CisgICAgY29uc3RydWN0b3IobWFpbkNoYXJhY3RlclR5cGUgPSBDaGFyYWN0ZXIuTk9ORSwgbWFpbkNoYXJhY3RlciA9IG51bGwsIGNoYXJhY3RlcnNUeXBlID0gW10sIGNoYXJhY3RlcnMgPSBbXSkgeworICAgICAgICB0aGlzLm1haW5DaGFyYWN0ZXJUeXBlID0gbWFpbkNoYXJhY3RlclR5cGU7CisgICAgICAgIHRoaXMubWFpbkNoYXJhY3RlciA9IG1haW5DaGFyYWN0ZXI7CisgICAgICAgIHRoaXMuY2hhcmFjdGVyc1R5cGUgPSBjaGFyYWN0ZXJzVHlwZTsKKyAgICAgICAgdGhpcy5jaGFyYWN0ZXJzID0gY2hhcmFjdGVyczsKKyAgICB9CisgICAgcGFjayhidWlsZGVyKSB7CisgICAgICAgIGNvbnN0IG1haW5DaGFyYWN0ZXIgPSBidWlsZGVyLmNyZWF0ZU9iamVjdE9mZnNldCh0aGlzLm1haW5DaGFyYWN0ZXIpOworICAgICAgICBjb25zdCBjaGFyYWN0ZXJzVHlwZSA9IE1vdmllLmNyZWF0ZUNoYXJhY3RlcnNUeXBlVmVjdG9yKGJ1aWxkZXIsIHRoaXMuY2hhcmFjdGVyc1R5cGUpOworICAgICAgICBjb25zdCBjaGFyYWN0ZXJzID0gTW92aWUuY3JlYXRlQ2hhcmFjdGVyc1ZlY3RvcihidWlsZGVyLCBidWlsZGVyLmNyZWF0ZU9iamVjdE9mZnNldExpc3QodGhpcy5jaGFyYWN0ZXJzKSk7CisgICAgICAgIHJldHVybiBNb3ZpZS5jcmVhdGVNb3ZpZShidWlsZGVyLCB0aGlzLm1haW5DaGFyYWN0ZXJUeXBlLCBtYWluQ2hhcmFjdGVyLCBjaGFyYWN0ZXJzVHlwZSwgY2hhcmFjdGVycyk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvdHMvdW5pb25fdmVjdG9yL21vdmllLnRzIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvdHMvdW5pb25fdmVjdG9yL21vdmllLnRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlZGViNTMKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy90cy91bmlvbl92ZWN0b3IvbW92aWUudHMKQEAgLTAsMCArMSwyMTEgQEAKKy8vIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGJ5IHRoZSBGbGF0QnVmZmVycyBjb21waWxlciwgZG8gbm90IG1vZGlmeQorCitpbXBvcnQgKiBhcyBmbGF0YnVmZmVycyBmcm9tICdmbGF0YnVmZmVycyc7CisKK2ltcG9ydCB7IEF0dGFja2VyLCBBdHRhY2tlclQgfSBmcm9tICcuL2F0dGFja2VyLmpzJzsKK2ltcG9ydCB7IEJvb2tSZWFkZXIsIEJvb2tSZWFkZXJUIH0gZnJvbSAnLi9ib29rLXJlYWRlci5qcyc7CitpbXBvcnQgeyBDaGFyYWN0ZXIsIHVuaW9uVG9DaGFyYWN0ZXIsIHVuaW9uTGlzdFRvQ2hhcmFjdGVyIH0gZnJvbSAnLi9jaGFyYWN0ZXIuanMnOworaW1wb3J0IHsgUmFwdW56ZWwsIFJhcHVuemVsVCB9IGZyb20gJy4vcmFwdW56ZWwuanMnOworCisKK2V4cG9ydCBjbGFzcyBNb3ZpZSB7CisgIGJiOiBmbGF0YnVmZmVycy5CeXRlQnVmZmVyfG51bGwgPSBudWxsOworICBiYl9wb3MgPSAwOworICBfX2luaXQoaTpudW1iZXIsIGJiOmZsYXRidWZmZXJzLkJ5dGVCdWZmZXIpOk1vdmllIHsKKyAgdGhpcy5iYl9wb3MgPSBpOworICB0aGlzLmJiID0gYmI7CisgIHJldHVybiB0aGlzOworfQorCitzdGF0aWMgZ2V0Um9vdEFzTW92aWUoYmI6ZmxhdGJ1ZmZlcnMuQnl0ZUJ1ZmZlciwgb2JqPzpNb3ZpZSk6TW92aWUgeworICByZXR1cm4gKG9iaiB8fCBuZXcgTW92aWUoKSkuX19pbml0KGJiLnJlYWRJbnQzMihiYi5wb3NpdGlvbigpKSArIGJiLnBvc2l0aW9uKCksIGJiKTsKK30KKworc3RhdGljIGdldFNpemVQcmVmaXhlZFJvb3RBc01vdmllKGJiOmZsYXRidWZmZXJzLkJ5dGVCdWZmZXIsIG9iaj86TW92aWUpOk1vdmllIHsKKyAgYmIuc2V0UG9zaXRpb24oYmIucG9zaXRpb24oKSArIGZsYXRidWZmZXJzLlNJWkVfUFJFRklYX0xFTkdUSCk7CisgIHJldHVybiAob2JqIHx8IG5ldyBNb3ZpZSgpKS5fX2luaXQoYmIucmVhZEludDMyKGJiLnBvc2l0aW9uKCkpICsgYmIucG9zaXRpb24oKSwgYmIpOworfQorCitzdGF0aWMgYnVmZmVySGFzSWRlbnRpZmllcihiYjpmbGF0YnVmZmVycy5CeXRlQnVmZmVyKTpib29sZWFuIHsKKyAgcmV0dXJuIGJiLl9faGFzX2lkZW50aWZpZXIoJ01PVkknKTsKK30KKworbWFpbkNoYXJhY3RlclR5cGUoKTpDaGFyYWN0ZXIgeworICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiIS5fX29mZnNldCh0aGlzLmJiX3BvcywgNCk7CisgIHJldHVybiBvZmZzZXQgPyB0aGlzLmJiIS5yZWFkVWludDgodGhpcy5iYl9wb3MgKyBvZmZzZXQpIDogQ2hhcmFjdGVyLk5PTkU7Cit9CisKK21haW5DaGFyYWN0ZXI8VCBleHRlbmRzIGZsYXRidWZmZXJzLlRhYmxlPihvYmo6YW55fHN0cmluZyk6YW55fHN0cmluZ3xudWxsIHsKKyAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYiEuX19vZmZzZXQodGhpcy5iYl9wb3MsIDYpOworICByZXR1cm4gb2Zmc2V0ID8gdGhpcy5iYiEuX191bmlvbl93aXRoX3N0cmluZyhvYmosIHRoaXMuYmJfcG9zICsgb2Zmc2V0KSA6IG51bGw7Cit9CisKK2NoYXJhY3RlcnNUeXBlKGluZGV4OiBudW1iZXIpOkNoYXJhY3RlcnxudWxsIHsKKyAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYiEuX19vZmZzZXQodGhpcy5iYl9wb3MsIDgpOworICByZXR1cm4gb2Zmc2V0ID8gdGhpcy5iYiEucmVhZFVpbnQ4KHRoaXMuYmIhLl9fdmVjdG9yKHRoaXMuYmJfcG9zICsgb2Zmc2V0KSArIGluZGV4KSA6IDA7Cit9CisKK2NoYXJhY3RlcnNUeXBlTGVuZ3RoKCk6bnVtYmVyIHsKKyAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYiEuX19vZmZzZXQodGhpcy5iYl9wb3MsIDgpOworICByZXR1cm4gb2Zmc2V0ID8gdGhpcy5iYiEuX192ZWN0b3JfbGVuKHRoaXMuYmJfcG9zICsgb2Zmc2V0KSA6IDA7Cit9CisKK2NoYXJhY3RlcnNUeXBlQXJyYXkoKTpVaW50OEFycmF5fG51bGwgeworICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiIS5fX29mZnNldCh0aGlzLmJiX3BvcywgOCk7CisgIHJldHVybiBvZmZzZXQgPyBuZXcgVWludDhBcnJheSh0aGlzLmJiIS5ieXRlcygpLmJ1ZmZlciwgdGhpcy5iYiEuYnl0ZXMoKS5ieXRlT2Zmc2V0ICsgdGhpcy5iYiEuX192ZWN0b3IodGhpcy5iYl9wb3MgKyBvZmZzZXQpLCB0aGlzLmJiIS5fX3ZlY3Rvcl9sZW4odGhpcy5iYl9wb3MgKyBvZmZzZXQpKSA6IG51bGw7Cit9CisKK2NoYXJhY3RlcnMoaW5kZXg6IG51bWJlciwgb2JqOmFueXxzdHJpbmcpOmFueXxzdHJpbmd8bnVsbCB7CisgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIhLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCAxMCk7CisgIHJldHVybiBvZmZzZXQgPyB0aGlzLmJiIS5fX3VuaW9uX3dpdGhfc3RyaW5nKG9iaiwgdGhpcy5iYiEuX192ZWN0b3IodGhpcy5iYl9wb3MgKyBvZmZzZXQpICsgaW5kZXggKiA0KSA6IG51bGw7Cit9CisKK2NoYXJhY3RlcnNMZW5ndGgoKTpudW1iZXIgeworICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiIS5fX29mZnNldCh0aGlzLmJiX3BvcywgMTApOworICByZXR1cm4gb2Zmc2V0ID8gdGhpcy5iYiEuX192ZWN0b3JfbGVuKHRoaXMuYmJfcG9zICsgb2Zmc2V0KSA6IDA7Cit9CisKK3N0YXRpYyBnZXRGdWxseVF1YWxpZmllZE5hbWUoKTpzdHJpbmcgeworICByZXR1cm4gJ01vdmllJzsKK30KKworc3RhdGljIHN0YXJ0TW92aWUoYnVpbGRlcjpmbGF0YnVmZmVycy5CdWlsZGVyKSB7CisgIGJ1aWxkZXIuc3RhcnRPYmplY3QoNCk7Cit9CisKK3N0YXRpYyBhZGRNYWluQ2hhcmFjdGVyVHlwZShidWlsZGVyOmZsYXRidWZmZXJzLkJ1aWxkZXIsIG1haW5DaGFyYWN0ZXJUeXBlOkNoYXJhY3RlcikgeworICBidWlsZGVyLmFkZEZpZWxkSW50OCgwLCBtYWluQ2hhcmFjdGVyVHlwZSwgQ2hhcmFjdGVyLk5PTkUpOworfQorCitzdGF0aWMgYWRkTWFpbkNoYXJhY3RlcihidWlsZGVyOmZsYXRidWZmZXJzLkJ1aWxkZXIsIG1haW5DaGFyYWN0ZXJPZmZzZXQ6ZmxhdGJ1ZmZlcnMuT2Zmc2V0KSB7CisgIGJ1aWxkZXIuYWRkRmllbGRPZmZzZXQoMSwgbWFpbkNoYXJhY3Rlck9mZnNldCwgMCk7Cit9CisKK3N0YXRpYyBhZGRDaGFyYWN0ZXJzVHlwZShidWlsZGVyOmZsYXRidWZmZXJzLkJ1aWxkZXIsIGNoYXJhY3RlcnNUeXBlT2Zmc2V0OmZsYXRidWZmZXJzLk9mZnNldCkgeworICBidWlsZGVyLmFkZEZpZWxkT2Zmc2V0KDIsIGNoYXJhY3RlcnNUeXBlT2Zmc2V0LCAwKTsKK30KKworc3RhdGljIGNyZWF0ZUNoYXJhY3RlcnNUeXBlVmVjdG9yKGJ1aWxkZXI6ZmxhdGJ1ZmZlcnMuQnVpbGRlciwgZGF0YTpDaGFyYWN0ZXJbXSk6ZmxhdGJ1ZmZlcnMuT2Zmc2V0IHsKKyAgYnVpbGRlci5zdGFydFZlY3RvcigxLCBkYXRhLmxlbmd0aCwgMSk7CisgIGZvciAobGV0IGkgPSBkYXRhLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7CisgICAgYnVpbGRlci5hZGRJbnQ4KGRhdGFbaV0hKTsKKyAgfQorICByZXR1cm4gYnVpbGRlci5lbmRWZWN0b3IoKTsKK30KKworc3RhdGljIHN0YXJ0Q2hhcmFjdGVyc1R5cGVWZWN0b3IoYnVpbGRlcjpmbGF0YnVmZmVycy5CdWlsZGVyLCBudW1FbGVtczpudW1iZXIpIHsKKyAgYnVpbGRlci5zdGFydFZlY3RvcigxLCBudW1FbGVtcywgMSk7Cit9CisKK3N0YXRpYyBhZGRDaGFyYWN0ZXJzKGJ1aWxkZXI6ZmxhdGJ1ZmZlcnMuQnVpbGRlciwgY2hhcmFjdGVyc09mZnNldDpmbGF0YnVmZmVycy5PZmZzZXQpIHsKKyAgYnVpbGRlci5hZGRGaWVsZE9mZnNldCgzLCBjaGFyYWN0ZXJzT2Zmc2V0LCAwKTsKK30KKworc3RhdGljIGNyZWF0ZUNoYXJhY3RlcnNWZWN0b3IoYnVpbGRlcjpmbGF0YnVmZmVycy5CdWlsZGVyLCBkYXRhOmZsYXRidWZmZXJzLk9mZnNldFtdKTpmbGF0YnVmZmVycy5PZmZzZXQgeworICBidWlsZGVyLnN0YXJ0VmVjdG9yKDQsIGRhdGEubGVuZ3RoLCA0KTsKKyAgZm9yIChsZXQgaSA9IGRhdGEubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHsKKyAgICBidWlsZGVyLmFkZE9mZnNldChkYXRhW2ldISk7CisgIH0KKyAgcmV0dXJuIGJ1aWxkZXIuZW5kVmVjdG9yKCk7Cit9CisKK3N0YXRpYyBzdGFydENoYXJhY3RlcnNWZWN0b3IoYnVpbGRlcjpmbGF0YnVmZmVycy5CdWlsZGVyLCBudW1FbGVtczpudW1iZXIpIHsKKyAgYnVpbGRlci5zdGFydFZlY3Rvcig0LCBudW1FbGVtcywgNCk7Cit9CisKK3N0YXRpYyBlbmRNb3ZpZShidWlsZGVyOmZsYXRidWZmZXJzLkJ1aWxkZXIpOmZsYXRidWZmZXJzLk9mZnNldCB7CisgIGNvbnN0IG9mZnNldCA9IGJ1aWxkZXIuZW5kT2JqZWN0KCk7CisgIHJldHVybiBvZmZzZXQ7Cit9CisKK3N0YXRpYyBmaW5pc2hNb3ZpZUJ1ZmZlcihidWlsZGVyOmZsYXRidWZmZXJzLkJ1aWxkZXIsIG9mZnNldDpmbGF0YnVmZmVycy5PZmZzZXQpIHsKKyAgYnVpbGRlci5maW5pc2gob2Zmc2V0LCAnTU9WSScpOworfQorCitzdGF0aWMgZmluaXNoU2l6ZVByZWZpeGVkTW92aWVCdWZmZXIoYnVpbGRlcjpmbGF0YnVmZmVycy5CdWlsZGVyLCBvZmZzZXQ6ZmxhdGJ1ZmZlcnMuT2Zmc2V0KSB7CisgIGJ1aWxkZXIuZmluaXNoKG9mZnNldCwgJ01PVkknLCB0cnVlKTsKK30KKworc3RhdGljIGNyZWF0ZU1vdmllKGJ1aWxkZXI6ZmxhdGJ1ZmZlcnMuQnVpbGRlciwgbWFpbkNoYXJhY3RlclR5cGU6Q2hhcmFjdGVyLCBtYWluQ2hhcmFjdGVyT2Zmc2V0OmZsYXRidWZmZXJzLk9mZnNldCwgY2hhcmFjdGVyc1R5cGVPZmZzZXQ6ZmxhdGJ1ZmZlcnMuT2Zmc2V0LCBjaGFyYWN0ZXJzT2Zmc2V0OmZsYXRidWZmZXJzLk9mZnNldCk6ZmxhdGJ1ZmZlcnMuT2Zmc2V0IHsKKyAgTW92aWUuc3RhcnRNb3ZpZShidWlsZGVyKTsKKyAgTW92aWUuYWRkTWFpbkNoYXJhY3RlclR5cGUoYnVpbGRlciwgbWFpbkNoYXJhY3RlclR5cGUpOworICBNb3ZpZS5hZGRNYWluQ2hhcmFjdGVyKGJ1aWxkZXIsIG1haW5DaGFyYWN0ZXJPZmZzZXQpOworICBNb3ZpZS5hZGRDaGFyYWN0ZXJzVHlwZShidWlsZGVyLCBjaGFyYWN0ZXJzVHlwZU9mZnNldCk7CisgIE1vdmllLmFkZENoYXJhY3RlcnMoYnVpbGRlciwgY2hhcmFjdGVyc09mZnNldCk7CisgIHJldHVybiBNb3ZpZS5lbmRNb3ZpZShidWlsZGVyKTsKK30KKwordW5wYWNrKCk6IE1vdmllVCB7CisgIHJldHVybiBuZXcgTW92aWVUKAorICAgIHRoaXMubWFpbkNoYXJhY3RlclR5cGUoKSwKKyAgICAoKCkgPT4geworICAgICAgbGV0IHRlbXAgPSB1bmlvblRvQ2hhcmFjdGVyKHRoaXMubWFpbkNoYXJhY3RlclR5cGUoKSwgdGhpcy5tYWluQ2hhcmFjdGVyLmJpbmQodGhpcykpOworICAgICAgaWYodGVtcCA9PT0gbnVsbCkgeyByZXR1cm4gbnVsbDsgfQorICAgICAgaWYodHlwZW9mIHRlbXAgPT09ICdzdHJpbmcnKSB7IHJldHVybiB0ZW1wOyB9CisgICAgICByZXR1cm4gdGVtcC51bnBhY2soKQorICB9KSgpLAorICAgIHRoaXMuYmIhLmNyZWF0ZVNjYWxhckxpc3QodGhpcy5jaGFyYWN0ZXJzVHlwZS5iaW5kKHRoaXMpLCB0aGlzLmNoYXJhY3RlcnNUeXBlTGVuZ3RoKCkpLAorICAgICgoKSA9PiB7CisgICAgbGV0IHJldCA9IFtdOworICAgIGZvcihsZXQgdGFyZ2V0RW51bUluZGV4ID0gMDsgdGFyZ2V0RW51bUluZGV4IDwgdGhpcy5jaGFyYWN0ZXJzVHlwZUxlbmd0aCgpOyArK3RhcmdldEVudW1JbmRleCkgeworICAgICAgbGV0IHRhcmdldEVudW0gPSB0aGlzLmNoYXJhY3RlcnNUeXBlKHRhcmdldEVudW1JbmRleCk7CisgICAgICBpZih0YXJnZXRFbnVtID09PSBudWxsIHx8IENoYXJhY3Rlclt0YXJnZXRFbnVtIV0gPT09ICdOT05FJykgeyBjb250aW51ZTsgfQorCisgICAgICBsZXQgdGVtcCA9IHVuaW9uTGlzdFRvQ2hhcmFjdGVyKHRhcmdldEVudW0sIHRoaXMuY2hhcmFjdGVycy5iaW5kKHRoaXMpLCB0YXJnZXRFbnVtSW5kZXgpOworICAgICAgaWYodGVtcCA9PT0gbnVsbCkgeyBjb250aW51ZTsgfQorICAgICAgaWYodHlwZW9mIHRlbXAgPT09ICdzdHJpbmcnKSB7IHJldC5wdXNoKHRlbXApOyBjb250aW51ZTsgfQorICAgICAgcmV0LnB1c2godGVtcC51bnBhY2soKSk7CisgICAgfQorICAgIHJldHVybiByZXQ7CisgIH0pKCkKKyAgKTsKK30KKworCit1bnBhY2tUbyhfbzogTW92aWVUKTogdm9pZCB7CisgIF9vLm1haW5DaGFyYWN0ZXJUeXBlID0gdGhpcy5tYWluQ2hhcmFjdGVyVHlwZSgpOworICBfby5tYWluQ2hhcmFjdGVyID0gKCgpID0+IHsKKyAgICAgIGxldCB0ZW1wID0gdW5pb25Ub0NoYXJhY3Rlcih0aGlzLm1haW5DaGFyYWN0ZXJUeXBlKCksIHRoaXMubWFpbkNoYXJhY3Rlci5iaW5kKHRoaXMpKTsKKyAgICAgIGlmKHRlbXAgPT09IG51bGwpIHsgcmV0dXJuIG51bGw7IH0KKyAgICAgIGlmKHR5cGVvZiB0ZW1wID09PSAnc3RyaW5nJykgeyByZXR1cm4gdGVtcDsgfQorICAgICAgcmV0dXJuIHRlbXAudW5wYWNrKCkKKyAgfSkoKTsKKyAgX28uY2hhcmFjdGVyc1R5cGUgPSB0aGlzLmJiIS5jcmVhdGVTY2FsYXJMaXN0KHRoaXMuY2hhcmFjdGVyc1R5cGUuYmluZCh0aGlzKSwgdGhpcy5jaGFyYWN0ZXJzVHlwZUxlbmd0aCgpKTsKKyAgX28uY2hhcmFjdGVycyA9ICgoKSA9PiB7CisgICAgbGV0IHJldCA9IFtdOworICAgIGZvcihsZXQgdGFyZ2V0RW51bUluZGV4ID0gMDsgdGFyZ2V0RW51bUluZGV4IDwgdGhpcy5jaGFyYWN0ZXJzVHlwZUxlbmd0aCgpOyArK3RhcmdldEVudW1JbmRleCkgeworICAgICAgbGV0IHRhcmdldEVudW0gPSB0aGlzLmNoYXJhY3RlcnNUeXBlKHRhcmdldEVudW1JbmRleCk7CisgICAgICBpZih0YXJnZXRFbnVtID09PSBudWxsIHx8IENoYXJhY3Rlclt0YXJnZXRFbnVtIV0gPT09ICdOT05FJykgeyBjb250aW51ZTsgfQorCisgICAgICBsZXQgdGVtcCA9IHVuaW9uTGlzdFRvQ2hhcmFjdGVyKHRhcmdldEVudW0sIHRoaXMuY2hhcmFjdGVycy5iaW5kKHRoaXMpLCB0YXJnZXRFbnVtSW5kZXgpOworICAgICAgaWYodGVtcCA9PT0gbnVsbCkgeyBjb250aW51ZTsgfQorICAgICAgaWYodHlwZW9mIHRlbXAgPT09ICdzdHJpbmcnKSB7IHJldC5wdXNoKHRlbXApOyBjb250aW51ZTsgfQorICAgICAgcmV0LnB1c2godGVtcC51bnBhY2soKSk7CisgICAgfQorICAgIHJldHVybiByZXQ7CisgIH0pKCk7Cit9Cit9CisKK2V4cG9ydCBjbGFzcyBNb3ZpZVQgeworY29uc3RydWN0b3IoCisgIHB1YmxpYyBtYWluQ2hhcmFjdGVyVHlwZTogQ2hhcmFjdGVyID0gQ2hhcmFjdGVyLk5PTkUsCisgIHB1YmxpYyBtYWluQ2hhcmFjdGVyOiBBdHRhY2tlclR8Qm9va1JlYWRlclR8UmFwdW56ZWxUfHN0cmluZ3xudWxsID0gbnVsbCwKKyAgcHVibGljIGNoYXJhY3RlcnNUeXBlOiAoQ2hhcmFjdGVyKVtdID0gW10sCisgIHB1YmxpYyBjaGFyYWN0ZXJzOiAoQXR0YWNrZXJUfEJvb2tSZWFkZXJUfFJhcHVuemVsVHxzdHJpbmcpW10gPSBbXQorKXt9CisKKworcGFjayhidWlsZGVyOmZsYXRidWZmZXJzLkJ1aWxkZXIpOiBmbGF0YnVmZmVycy5PZmZzZXQgeworICBjb25zdCBtYWluQ2hhcmFjdGVyID0gYnVpbGRlci5jcmVhdGVPYmplY3RPZmZzZXQodGhpcy5tYWluQ2hhcmFjdGVyKTsKKyAgY29uc3QgY2hhcmFjdGVyc1R5cGUgPSBNb3ZpZS5jcmVhdGVDaGFyYWN0ZXJzVHlwZVZlY3RvcihidWlsZGVyLCB0aGlzLmNoYXJhY3RlcnNUeXBlKTsKKyAgY29uc3QgY2hhcmFjdGVycyA9IE1vdmllLmNyZWF0ZUNoYXJhY3RlcnNWZWN0b3IoYnVpbGRlciwgYnVpbGRlci5jcmVhdGVPYmplY3RPZmZzZXRMaXN0KHRoaXMuY2hhcmFjdGVycykpOworCisgIHJldHVybiBNb3ZpZS5jcmVhdGVNb3ZpZShidWlsZGVyLAorICAgIHRoaXMubWFpbkNoYXJhY3RlclR5cGUsCisgICAgbWFpbkNoYXJhY3RlciwKKyAgICBjaGFyYWN0ZXJzVHlwZSwKKyAgICBjaGFyYWN0ZXJzCisgICk7Cit9Cit9CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy90cy91bmlvbl92ZWN0b3IvcmFwdW56ZWwuanMgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy90cy91bmlvbl92ZWN0b3IvcmFwdW56ZWwuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjdhNWU0NAotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL3RzL3VuaW9uX3ZlY3Rvci9yYXB1bnplbC5qcwpAQCAtMCwwICsxLDQ0IEBACisvLyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBieSB0aGUgRmxhdEJ1ZmZlcnMgY29tcGlsZXIsIGRvIG5vdCBtb2RpZnkKK2V4cG9ydCBjbGFzcyBSYXB1bnplbCB7CisgICAgY29uc3RydWN0b3IoKSB7CisgICAgICAgIHRoaXMuYmIgPSBudWxsOworICAgICAgICB0aGlzLmJiX3BvcyA9IDA7CisgICAgfQorICAgIF9faW5pdChpLCBiYikgeworICAgICAgICB0aGlzLmJiX3BvcyA9IGk7CisgICAgICAgIHRoaXMuYmIgPSBiYjsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorICAgIGhhaXJMZW5ndGgoKSB7CisgICAgICAgIHJldHVybiB0aGlzLmJiLnJlYWRJbnQzMih0aGlzLmJiX3Bvcyk7CisgICAgfQorICAgIG11dGF0ZV9oYWlyX2xlbmd0aCh2YWx1ZSkgeworICAgICAgICB0aGlzLmJiLndyaXRlSW50MzIodGhpcy5iYl9wb3MgKyAwLCB2YWx1ZSk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICBzdGF0aWMgZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCkgeworICAgICAgICByZXR1cm4gJ1JhcHVuemVsJzsKKyAgICB9CisgICAgc3RhdGljIHNpemVPZigpIHsKKyAgICAgICAgcmV0dXJuIDQ7CisgICAgfQorICAgIHN0YXRpYyBjcmVhdGVSYXB1bnplbChidWlsZGVyLCBoYWlyX2xlbmd0aCkgeworICAgICAgICBidWlsZGVyLnByZXAoNCwgNCk7CisgICAgICAgIGJ1aWxkZXIud3JpdGVJbnQzMihoYWlyX2xlbmd0aCk7CisgICAgICAgIHJldHVybiBidWlsZGVyLm9mZnNldCgpOworICAgIH0KKyAgICB1bnBhY2soKSB7CisgICAgICAgIHJldHVybiBuZXcgUmFwdW56ZWxUKHRoaXMuaGFpckxlbmd0aCgpKTsKKyAgICB9CisgICAgdW5wYWNrVG8oX28pIHsKKyAgICAgICAgX28uaGFpckxlbmd0aCA9IHRoaXMuaGFpckxlbmd0aCgpOworICAgIH0KK30KK2V4cG9ydCBjbGFzcyBSYXB1bnplbFQgeworICAgIGNvbnN0cnVjdG9yKGhhaXJMZW5ndGggPSAwKSB7CisgICAgICAgIHRoaXMuaGFpckxlbmd0aCA9IGhhaXJMZW5ndGg7CisgICAgfQorICAgIHBhY2soYnVpbGRlcikgeworICAgICAgICByZXR1cm4gUmFwdW56ZWwuY3JlYXRlUmFwdW56ZWwoYnVpbGRlciwgdGhpcy5oYWlyTGVuZ3RoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy90cy91bmlvbl92ZWN0b3IvcmFwdW56ZWwudHMgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy90cy91bmlvbl92ZWN0b3IvcmFwdW56ZWwudHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTFkYzYzZAotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL3RzL3VuaW9uX3ZlY3Rvci9yYXB1bnplbC50cwpAQCAtMCwwICsxLDYzIEBACisvLyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBieSB0aGUgRmxhdEJ1ZmZlcnMgY29tcGlsZXIsIGRvIG5vdCBtb2RpZnkKKworaW1wb3J0ICogYXMgZmxhdGJ1ZmZlcnMgZnJvbSAnZmxhdGJ1ZmZlcnMnOworCisKKworZXhwb3J0IGNsYXNzIFJhcHVuemVsIHsKKyAgYmI6IGZsYXRidWZmZXJzLkJ5dGVCdWZmZXJ8bnVsbCA9IG51bGw7CisgIGJiX3BvcyA9IDA7CisgIF9faW5pdChpOm51bWJlciwgYmI6ZmxhdGJ1ZmZlcnMuQnl0ZUJ1ZmZlcik6UmFwdW56ZWwgeworICB0aGlzLmJiX3BvcyA9IGk7CisgIHRoaXMuYmIgPSBiYjsKKyAgcmV0dXJuIHRoaXM7Cit9CisKK2hhaXJMZW5ndGgoKTpudW1iZXIgeworICByZXR1cm4gdGhpcy5iYiEucmVhZEludDMyKHRoaXMuYmJfcG9zKTsKK30KKworbXV0YXRlX2hhaXJfbGVuZ3RoKHZhbHVlOm51bWJlcik6Ym9vbGVhbiB7CisgIHRoaXMuYmIhLndyaXRlSW50MzIodGhpcy5iYl9wb3MgKyAwLCB2YWx1ZSk7CisgIHJldHVybiB0cnVlOworfQorCitzdGF0aWMgZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCk6c3RyaW5nIHsKKyAgcmV0dXJuICdSYXB1bnplbCc7Cit9CisKK3N0YXRpYyBzaXplT2YoKTpudW1iZXIgeworICByZXR1cm4gNDsKK30KKworc3RhdGljIGNyZWF0ZVJhcHVuemVsKGJ1aWxkZXI6ZmxhdGJ1ZmZlcnMuQnVpbGRlciwgaGFpcl9sZW5ndGg6IG51bWJlcik6ZmxhdGJ1ZmZlcnMuT2Zmc2V0IHsKKyAgYnVpbGRlci5wcmVwKDQsIDQpOworICBidWlsZGVyLndyaXRlSW50MzIoaGFpcl9sZW5ndGgpOworICByZXR1cm4gYnVpbGRlci5vZmZzZXQoKTsKK30KKworCit1bnBhY2soKTogUmFwdW56ZWxUIHsKKyAgcmV0dXJuIG5ldyBSYXB1bnplbFQoCisgICAgdGhpcy5oYWlyTGVuZ3RoKCkKKyAgKTsKK30KKworCit1bnBhY2tUbyhfbzogUmFwdW56ZWxUKTogdm9pZCB7CisgIF9vLmhhaXJMZW5ndGggPSB0aGlzLmhhaXJMZW5ndGgoKTsKK30KK30KKworZXhwb3J0IGNsYXNzIFJhcHVuemVsVCB7Citjb25zdHJ1Y3RvcigKKyAgcHVibGljIGhhaXJMZW5ndGg6IG51bWJlciA9IDAKKyl7fQorCisKK3BhY2soYnVpbGRlcjpmbGF0YnVmZmVycy5CdWlsZGVyKTogZmxhdGJ1ZmZlcnMuT2Zmc2V0IHsKKyAgcmV0dXJuIFJhcHVuemVsLmNyZWF0ZVJhcHVuemVsKGJ1aWxkZXIsCisgICAgdGhpcy5oYWlyTGVuZ3RoCisgICk7Cit9Cit9CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy90cy91bmlvbl92ZWN0b3IvdW5pb25fdmVjdG9yX2dlbmVyYXRlZC5qcyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL3RzL3VuaW9uX3ZlY3Rvci91bmlvbl92ZWN0b3JfZ2VuZXJhdGVkLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY5ZWExOTkKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy90cy91bmlvbl92ZWN0b3IvdW5pb25fdmVjdG9yX2dlbmVyYXRlZC5qcwpAQCAtMCwwICsxLDkgQEAKKy8vIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGJ5IHRoZSBGbGF0QnVmZmVycyBjb21waWxlciwgZG8gbm90IG1vZGlmeQorZXhwb3J0IHsgQXR0YWNrZXIsIEF0dGFja2VyVCB9IGZyb20gJy4vYXR0YWNrZXIuanMnOworZXhwb3J0IHsgQm9va1JlYWRlciwgQm9va1JlYWRlclQgfSBmcm9tICcuL2Jvb2stcmVhZGVyLmpzJzsKK2V4cG9ydCB7IENoYXJhY3RlciwgdW5pb25Ub0NoYXJhY3RlciwgdW5pb25MaXN0VG9DaGFyYWN0ZXIgfSBmcm9tICcuL2NoYXJhY3Rlci5qcyc7CitleHBvcnQgeyBGYWxsaW5nVHViLCBGYWxsaW5nVHViVCB9IGZyb20gJy4vZmFsbGluZy10dWIuanMnOworZXhwb3J0IHsgR2FkZ2V0LCB1bmlvblRvR2FkZ2V0LCB1bmlvbkxpc3RUb0dhZGdldCB9IGZyb20gJy4vZ2FkZ2V0LmpzJzsKK2V4cG9ydCB7IEhhbmRGYW4sIEhhbmRGYW5UIH0gZnJvbSAnLi9oYW5kLWZhbi5qcyc7CitleHBvcnQgeyBNb3ZpZSwgTW92aWVUIH0gZnJvbSAnLi9tb3ZpZS5qcyc7CitleHBvcnQgeyBSYXB1bnplbCwgUmFwdW56ZWxUIH0gZnJvbSAnLi9yYXB1bnplbC5qcyc7CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy90cy91bmlvbl92ZWN0b3IvdW5pb25fdmVjdG9yX2dlbmVyYXRlZC50cyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL3RzL3VuaW9uX3ZlY3Rvci91bmlvbl92ZWN0b3JfZ2VuZXJhdGVkLnRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU1MjdhYmUKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy90cy91bmlvbl92ZWN0b3IvdW5pb25fdmVjdG9yX2dlbmVyYXRlZC50cwpAQCAtMCwwICsxLDEwIEBACisvLyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBieSB0aGUgRmxhdEJ1ZmZlcnMgY29tcGlsZXIsIGRvIG5vdCBtb2RpZnkKKworZXhwb3J0IHsgQXR0YWNrZXIsIEF0dGFja2VyVCB9IGZyb20gJy4vYXR0YWNrZXIuanMnOworZXhwb3J0IHsgQm9va1JlYWRlciwgQm9va1JlYWRlclQgfSBmcm9tICcuL2Jvb2stcmVhZGVyLmpzJzsKK2V4cG9ydCB7IENoYXJhY3RlciwgdW5pb25Ub0NoYXJhY3RlciwgdW5pb25MaXN0VG9DaGFyYWN0ZXIgfSBmcm9tICcuL2NoYXJhY3Rlci5qcyc7CitleHBvcnQgeyBGYWxsaW5nVHViLCBGYWxsaW5nVHViVCB9IGZyb20gJy4vZmFsbGluZy10dWIuanMnOworZXhwb3J0IHsgR2FkZ2V0LCB1bmlvblRvR2FkZ2V0LCB1bmlvbkxpc3RUb0dhZGdldCB9IGZyb20gJy4vZ2FkZ2V0LmpzJzsKK2V4cG9ydCB7IEhhbmRGYW4sIEhhbmRGYW5UIH0gZnJvbSAnLi9oYW5kLWZhbi5qcyc7CitleHBvcnQgeyBNb3ZpZSwgTW92aWVUIH0gZnJvbSAnLi9tb3ZpZS5qcyc7CitleHBvcnQgeyBSYXB1bnplbCwgUmFwdW56ZWxUIH0gZnJvbSAnLi9yYXB1bnplbC5qcyc7CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy90eXBlX2ZpZWxkX2NvbGxzaW9uLmZicyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL3R5cGVfZmllbGRfY29sbHNpb24uZmJzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVjNzM1NDQKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy90eXBlX2ZpZWxkX2NvbGxzaW9uLmZicwpAQCAtMCwwICsxLDggQEAKK25hbWVzcGFjZSB0eXBlX2ZpZWxkX2NvbGxzaW9uOworCisvLyBUaGlzIHRhYmxlIHRlc3RzIGNvbGxzaW9ucyBvZiBpZGVudGlmaWVycy4KK3RhYmxlIENvbGxpc2lvbiB7CisgIGNvbGxpc2lvbiA6IGludDsKK30KKworcm9vdF90eXBlIENvbGxpc2lvbjsKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL3R5cGVfZmllbGRfY29sbHNpb24vQ29sbGlzaW9uLmNzIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvdHlwZV9maWVsZF9jb2xsc2lvbi9Db2xsaXNpb24uY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmZjMjRmMwotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL3R5cGVfZmllbGRfY29sbHNpb24vQ29sbGlzaW9uLmNzCkBAIC0wLDAgKzEsNzMgQEAKKy8vIDxhdXRvLWdlbmVyYXRlZD4KKy8vICBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBieSB0aGUgRmxhdEJ1ZmZlcnMgY29tcGlsZXIsIGRvIG5vdCBtb2RpZnkKKy8vIDwvYXV0by1nZW5lcmF0ZWQ+CisKK25hbWVzcGFjZSB0eXBlX2ZpZWxkX2NvbGxzaW9uCit7CisKK3VzaW5nIGdsb2JhbDo6U3lzdGVtOwordXNpbmcgZ2xvYmFsOjpTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIGdsb2JhbDo6R29vZ2xlLkZsYXRCdWZmZXJzOworCitwdWJsaWMgc3RydWN0IENvbGxpc2lvbiA6IElGbGF0YnVmZmVyT2JqZWN0Cit7CisgIHByaXZhdGUgVGFibGUgX19wOworICBwdWJsaWMgQnl0ZUJ1ZmZlciBCeXRlQnVmZmVyIHsgZ2V0IHsgcmV0dXJuIF9fcC5iYjsgfSB9CisgIHB1YmxpYyBzdGF0aWMgdm9pZCBWYWxpZGF0ZVZlcnNpb24oKSB7IEZsYXRCdWZmZXJDb25zdGFudHMuRkxBVEJVRkZFUlNfMl8wXzgoKTsgfQorICBwdWJsaWMgc3RhdGljIENvbGxpc2lvbiBHZXRSb290QXNDb2xsaXNpb24oQnl0ZUJ1ZmZlciBfYmIpIHsgcmV0dXJuIEdldFJvb3RBc0NvbGxpc2lvbihfYmIsIG5ldyBDb2xsaXNpb24oKSk7IH0KKyAgcHVibGljIHN0YXRpYyBDb2xsaXNpb24gR2V0Um9vdEFzQ29sbGlzaW9uKEJ5dGVCdWZmZXIgX2JiLCBDb2xsaXNpb24gb2JqKSB7IHJldHVybiAob2JqLl9fYXNzaWduKF9iYi5HZXRJbnQoX2JiLlBvc2l0aW9uKSArIF9iYi5Qb3NpdGlvbiwgX2JiKSk7IH0KKyAgcHVibGljIHZvaWQgX19pbml0KGludCBfaSwgQnl0ZUJ1ZmZlciBfYmIpIHsgX19wID0gbmV3IFRhYmxlKF9pLCBfYmIpOyB9CisgIHB1YmxpYyBDb2xsaXNpb24gX19hc3NpZ24oaW50IF9pLCBCeXRlQnVmZmVyIF9iYikgeyBfX2luaXQoX2ksIF9iYik7IHJldHVybiB0aGlzOyB9CisKKyAgcHVibGljIGludCBDb2xsaXNpb25fIHsgZ2V0IHsgaW50IG8gPSBfX3AuX19vZmZzZXQoNCk7IHJldHVybiBvICE9IDAgPyBfX3AuYmIuR2V0SW50KG8gKyBfX3AuYmJfcG9zKSA6IChpbnQpMDsgfSB9CisKKyAgcHVibGljIHN0YXRpYyBPZmZzZXQ8dHlwZV9maWVsZF9jb2xsc2lvbi5Db2xsaXNpb24+IENyZWF0ZUNvbGxpc2lvbihGbGF0QnVmZmVyQnVpbGRlciBidWlsZGVyLAorICAgICAgaW50IGNvbGxpc2lvbiA9IDApIHsKKyAgICBidWlsZGVyLlN0YXJ0VGFibGUoMSk7CisgICAgQ29sbGlzaW9uLkFkZENvbGxpc2lvbihidWlsZGVyLCBjb2xsaXNpb24pOworICAgIHJldHVybiBDb2xsaXNpb24uRW5kQ29sbGlzaW9uKGJ1aWxkZXIpOworICB9CisKKyAgcHVibGljIHN0YXRpYyB2b2lkIFN0YXJ0Q29sbGlzaW9uKEZsYXRCdWZmZXJCdWlsZGVyIGJ1aWxkZXIpIHsgYnVpbGRlci5TdGFydFRhYmxlKDEpOyB9CisgIHB1YmxpYyBzdGF0aWMgdm9pZCBBZGRDb2xsaXNpb24oRmxhdEJ1ZmZlckJ1aWxkZXIgYnVpbGRlciwgaW50IGNvbGxpc2lvbikgeyBidWlsZGVyLkFkZEludCgwLCBjb2xsaXNpb24sIDApOyB9CisgIHB1YmxpYyBzdGF0aWMgT2Zmc2V0PHR5cGVfZmllbGRfY29sbHNpb24uQ29sbGlzaW9uPiBFbmRDb2xsaXNpb24oRmxhdEJ1ZmZlckJ1aWxkZXIgYnVpbGRlcikgeworICAgIGludCBvID0gYnVpbGRlci5FbmRUYWJsZSgpOworICAgIHJldHVybiBuZXcgT2Zmc2V0PHR5cGVfZmllbGRfY29sbHNpb24uQ29sbGlzaW9uPihvKTsKKyAgfQorICBwdWJsaWMgc3RhdGljIHZvaWQgRmluaXNoQ29sbGlzaW9uQnVmZmVyKEZsYXRCdWZmZXJCdWlsZGVyIGJ1aWxkZXIsIE9mZnNldDx0eXBlX2ZpZWxkX2NvbGxzaW9uLkNvbGxpc2lvbj4gb2Zmc2V0KSB7IGJ1aWxkZXIuRmluaXNoKG9mZnNldC5WYWx1ZSk7IH0KKyAgcHVibGljIHN0YXRpYyB2b2lkIEZpbmlzaFNpemVQcmVmaXhlZENvbGxpc2lvbkJ1ZmZlcihGbGF0QnVmZmVyQnVpbGRlciBidWlsZGVyLCBPZmZzZXQ8dHlwZV9maWVsZF9jb2xsc2lvbi5Db2xsaXNpb24+IG9mZnNldCkgeyBidWlsZGVyLkZpbmlzaFNpemVQcmVmaXhlZChvZmZzZXQuVmFsdWUpOyB9CisgIHB1YmxpYyBDb2xsaXNpb25UIFVuUGFjaygpIHsKKyAgICB2YXIgX28gPSBuZXcgQ29sbGlzaW9uVCgpOworICAgIHRoaXMuVW5QYWNrVG8oX28pOworICAgIHJldHVybiBfbzsKKyAgfQorICBwdWJsaWMgdm9pZCBVblBhY2tUbyhDb2xsaXNpb25UIF9vKSB7CisgICAgX28uQ29sbGlzaW9uXyA9IHRoaXMuQ29sbGlzaW9uXzsKKyAgfQorICBwdWJsaWMgc3RhdGljIE9mZnNldDx0eXBlX2ZpZWxkX2NvbGxzaW9uLkNvbGxpc2lvbj4gUGFjayhGbGF0QnVmZmVyQnVpbGRlciBidWlsZGVyLCBDb2xsaXNpb25UIF9vKSB7CisgICAgaWYgKF9vID09IG51bGwpIHJldHVybiBkZWZhdWx0KE9mZnNldDx0eXBlX2ZpZWxkX2NvbGxzaW9uLkNvbGxpc2lvbj4pOworICAgIHJldHVybiBDcmVhdGVDb2xsaXNpb24oCisgICAgICBidWlsZGVyLAorICAgICAgX28uQ29sbGlzaW9uXyk7CisgIH0KK30KKworcHVibGljIGNsYXNzIENvbGxpc2lvblQKK3sKKyAgcHVibGljIGludCBDb2xsaXNpb25fIHsgZ2V0OyBzZXQ7IH0KKworICBwdWJsaWMgQ29sbGlzaW9uVCgpIHsKKyAgICB0aGlzLkNvbGxpc2lvbl8gPSAwOworICB9CisgIHB1YmxpYyBzdGF0aWMgQ29sbGlzaW9uVCBEZXNlcmlhbGl6ZUZyb21CaW5hcnkoYnl0ZVtdIGZiQnVmZmVyKSB7CisgICAgcmV0dXJuIENvbGxpc2lvbi5HZXRSb290QXNDb2xsaXNpb24obmV3IEJ5dGVCdWZmZXIoZmJCdWZmZXIpKS5VblBhY2soKTsKKyAgfQorICBwdWJsaWMgYnl0ZVtdIFNlcmlhbGl6ZVRvQmluYXJ5KCkgeworICAgIHZhciBmYmIgPSBuZXcgRmxhdEJ1ZmZlckJ1aWxkZXIoMHgxMDAwMCk7CisgICAgQ29sbGlzaW9uLkZpbmlzaENvbGxpc2lvbkJ1ZmZlcihmYmIsIENvbGxpc2lvbi5QYWNrKGZiYiwgdGhpcykpOworICAgIHJldHVybiBmYmIuRGF0YUJ1ZmZlci5Ub1NpemVkQXJyYXkoKTsKKyAgfQorfQorCisKK30KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL3VuaW9uX3ZlY3Rvci9BdHRhY2tlci5jcyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL3VuaW9uX3ZlY3Rvci9BdHRhY2tlci5jcwppbmRleCBjZjZkMWE3Li41N2MzMmZhIDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy91bmlvbl92ZWN0b3IvQXR0YWNrZXIuY3MKKysrIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvdW5pb25fdmVjdG9yL0F0dGFja2VyLmNzCkBAIC00LDEzICs0LDEzIEBACiAKIHVzaW5nIGdsb2JhbDo6U3lzdGVtOwogdXNpbmcgZ2xvYmFsOjpTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKLXVzaW5nIGdsb2JhbDo6RmxhdEJ1ZmZlcnM7Cit1c2luZyBnbG9iYWw6Okdvb2dsZS5GbGF0QnVmZmVyczsKIAogcHVibGljIHN0cnVjdCBBdHRhY2tlciA6IElGbGF0YnVmZmVyT2JqZWN0CiB7CiAgIHByaXZhdGUgVGFibGUgX19wOwogICBwdWJsaWMgQnl0ZUJ1ZmZlciBCeXRlQnVmZmVyIHsgZ2V0IHsgcmV0dXJuIF9fcC5iYjsgfSB9Ci0gIHB1YmxpYyBzdGF0aWMgdm9pZCBWYWxpZGF0ZVZlcnNpb24oKSB7IEZsYXRCdWZmZXJDb25zdGFudHMuRkxBVEJVRkZFUlNfMl8wXzAoKTsgfQorICBwdWJsaWMgc3RhdGljIHZvaWQgVmFsaWRhdGVWZXJzaW9uKCkgeyBGbGF0QnVmZmVyQ29uc3RhbnRzLkZMQVRCVUZGRVJTXzJfMF84KCk7IH0KICAgcHVibGljIHN0YXRpYyBBdHRhY2tlciBHZXRSb290QXNBdHRhY2tlcihCeXRlQnVmZmVyIF9iYikgeyByZXR1cm4gR2V0Um9vdEFzQXR0YWNrZXIoX2JiLCBuZXcgQXR0YWNrZXIoKSk7IH0KICAgcHVibGljIHN0YXRpYyBBdHRhY2tlciBHZXRSb290QXNBdHRhY2tlcihCeXRlQnVmZmVyIF9iYiwgQXR0YWNrZXIgb2JqKSB7IHJldHVybiAob2JqLl9fYXNzaWduKF9iYi5HZXRJbnQoX2JiLlBvc2l0aW9uKSArIF9iYi5Qb3NpdGlvbiwgX2JiKSk7IH0KICAgcHVibGljIHZvaWQgX19pbml0KGludCBfaSwgQnl0ZUJ1ZmZlciBfYmIpIHsgX19wID0gbmV3IFRhYmxlKF9pLCBfYmIpOyB9CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy91bmlvbl92ZWN0b3IvQXR0YWNrZXIuamF2YSBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL3VuaW9uX3ZlY3Rvci9BdHRhY2tlci5qYXZhCmluZGV4IDQ4MmEzYWUuLmUxNTY0NDQgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL3VuaW9uX3ZlY3Rvci9BdHRhY2tlci5qYXZhCisrKyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL3VuaW9uX3ZlY3Rvci9BdHRhY2tlci5qYXZhCkBAIC03LDcgKzcsNyBAQAogCiBAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikKIHB1YmxpYyBmaW5hbCBjbGFzcyBBdHRhY2tlciBleHRlbmRzIFRhYmxlIHsKLSAgcHVibGljIHN0YXRpYyB2b2lkIFZhbGlkYXRlVmVyc2lvbigpIHsgQ29uc3RhbnRzLkZMQVRCVUZGRVJTXzJfMF8wKCk7IH0KKyAgcHVibGljIHN0YXRpYyB2b2lkIFZhbGlkYXRlVmVyc2lvbigpIHsgQ29uc3RhbnRzLkZMQVRCVUZGRVJTXzJfMF84KCk7IH0KICAgcHVibGljIHN0YXRpYyBBdHRhY2tlciBnZXRSb290QXNBdHRhY2tlcihCeXRlQnVmZmVyIF9iYikgeyByZXR1cm4gZ2V0Um9vdEFzQXR0YWNrZXIoX2JiLCBuZXcgQXR0YWNrZXIoKSk7IH0KICAgcHVibGljIHN0YXRpYyBBdHRhY2tlciBnZXRSb290QXNBdHRhY2tlcihCeXRlQnVmZmVyIF9iYiwgQXR0YWNrZXIgb2JqKSB7IF9iYi5vcmRlcihCeXRlT3JkZXIuTElUVExFX0VORElBTik7IHJldHVybiAob2JqLl9fYXNzaWduKF9iYi5nZXRJbnQoX2JiLnBvc2l0aW9uKCkpICsgX2JiLnBvc2l0aW9uKCksIF9iYikpOyB9CiAgIHB1YmxpYyB2b2lkIF9faW5pdChpbnQgX2ksIEJ5dGVCdWZmZXIgX2JiKSB7IF9fcmVzZXQoX2ksIF9iYik7IH0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL3VuaW9uX3ZlY3Rvci9BdHRhY2tlci5rdCBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL3VuaW9uX3ZlY3Rvci9BdHRhY2tlci5rdAppbmRleCA5ZjIyZTk4Li42OTQyYmFkIDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy91bmlvbl92ZWN0b3IvQXR0YWNrZXIua3QKKysrIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvdW5pb25fdmVjdG9yL0F0dGFja2VyLmt0CkBAIC0yOSw3ICsyOSw3IEBACiAgICAgICAgIH0KICAgICB9CiAgICAgY29tcGFuaW9uIG9iamVjdCB7Ci0gICAgICAgIGZ1biB2YWxpZGF0ZVZlcnNpb24oKSA9IENvbnN0YW50cy5GTEFUQlVGRkVSU18yXzBfMCgpCisgICAgICAgIGZ1biB2YWxpZGF0ZVZlcnNpb24oKSA9IENvbnN0YW50cy5GTEFUQlVGRkVSU18yXzBfOCgpCiAgICAgICAgIGZ1biBnZXRSb290QXNBdHRhY2tlcihfYmI6IEJ5dGVCdWZmZXIpOiBBdHRhY2tlciA9IGdldFJvb3RBc0F0dGFja2VyKF9iYiwgQXR0YWNrZXIoKSkKICAgICAgICAgZnVuIGdldFJvb3RBc0F0dGFja2VyKF9iYjogQnl0ZUJ1ZmZlciwgb2JqOiBBdHRhY2tlcik6IEF0dGFja2VyIHsKICAgICAgICAgICAgIF9iYi5vcmRlcihCeXRlT3JkZXIuTElUVExFX0VORElBTikKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL3VuaW9uX3ZlY3Rvci9Cb29rUmVhZGVyLmNzIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvdW5pb25fdmVjdG9yL0Jvb2tSZWFkZXIuY3MKaW5kZXggNmNkODhiMy4uNzRkZDMyZiAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvdW5pb25fdmVjdG9yL0Jvb2tSZWFkZXIuY3MKKysrIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvdW5pb25fdmVjdG9yL0Jvb2tSZWFkZXIuY3MKQEAgLTQsNyArNCw3IEBACiAKIHVzaW5nIGdsb2JhbDo6U3lzdGVtOwogdXNpbmcgZ2xvYmFsOjpTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKLXVzaW5nIGdsb2JhbDo6RmxhdEJ1ZmZlcnM7Cit1c2luZyBnbG9iYWw6Okdvb2dsZS5GbGF0QnVmZmVyczsKIAogcHVibGljIHN0cnVjdCBCb29rUmVhZGVyIDogSUZsYXRidWZmZXJPYmplY3QKIHsKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL3VuaW9uX3ZlY3Rvci9DaGFyYWN0ZXIuY3MgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy91bmlvbl92ZWN0b3IvQ2hhcmFjdGVyLmNzCmluZGV4IDQ5NzhiZGMuLjE4MWY5MTQgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL3VuaW9uX3ZlY3Rvci9DaGFyYWN0ZXIuY3MKKysrIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvdW5pb25fdmVjdG9yL0NoYXJhY3Rlci5jcwpAQCAtMzcsNyArMzcsNyBAQAogICBwdWJsaWMgc3RyaW5nIEFzVW51c2VkKCkgeyByZXR1cm4gdGhpcy5BczxzdHJpbmc+KCk7IH0KICAgcHVibGljIHN0YXRpYyBDaGFyYWN0ZXJVbmlvbiBGcm9tVW51c2VkKHN0cmluZyBfdW51c2VkKSB7IHJldHVybiBuZXcgQ2hhcmFjdGVyVW5pb257IFR5cGUgPSBDaGFyYWN0ZXIuVW51c2VkLCBWYWx1ZSA9IF91bnVzZWQgfTsgfQogCi0gIHB1YmxpYyBzdGF0aWMgaW50IFBhY2soRmxhdEJ1ZmZlcnMuRmxhdEJ1ZmZlckJ1aWxkZXIgYnVpbGRlciwgQ2hhcmFjdGVyVW5pb24gX28pIHsKKyAgcHVibGljIHN0YXRpYyBpbnQgUGFjayhHb29nbGUuRmxhdEJ1ZmZlcnMuRmxhdEJ1ZmZlckJ1aWxkZXIgYnVpbGRlciwgQ2hhcmFjdGVyVW5pb24gX28pIHsKICAgICBzd2l0Y2ggKF9vLlR5cGUpIHsKICAgICAgIGRlZmF1bHQ6IHJldHVybiAwOwogICAgICAgY2FzZSBDaGFyYWN0ZXIuTXVMYW46IHJldHVybiBBdHRhY2tlci5QYWNrKGJ1aWxkZXIsIF9vLkFzTXVMYW4oKSkuVmFsdWU7CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy91bmlvbl92ZWN0b3IvRmFsbGluZ1R1Yi5jcyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL3VuaW9uX3ZlY3Rvci9GYWxsaW5nVHViLmNzCmluZGV4IDM2YzU3NGMuLjc5MmRiZWQgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL3VuaW9uX3ZlY3Rvci9GYWxsaW5nVHViLmNzCisrKyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL3VuaW9uX3ZlY3Rvci9GYWxsaW5nVHViLmNzCkBAIC00LDcgKzQsNyBAQAogCiB1c2luZyBnbG9iYWw6OlN5c3RlbTsKIHVzaW5nIGdsb2JhbDo6U3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Ci11c2luZyBnbG9iYWw6OkZsYXRCdWZmZXJzOwordXNpbmcgZ2xvYmFsOjpHb29nbGUuRmxhdEJ1ZmZlcnM7CiAKIHB1YmxpYyBzdHJ1Y3QgRmFsbGluZ1R1YiA6IElGbGF0YnVmZmVyT2JqZWN0CiB7CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy91bmlvbl92ZWN0b3IvR2FkZ2V0LmNzIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvdW5pb25fdmVjdG9yL0dhZGdldC5jcwppbmRleCBlNDc3MGRkLi44ZTVjYTdiIDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy91bmlvbl92ZWN0b3IvR2FkZ2V0LmNzCisrKyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL3VuaW9uX3ZlY3Rvci9HYWRnZXQuY3MKQEAgLTI1LDcgKzI1LDcgQEAKICAgcHVibGljIEhhbmRGYW5UIEFzSGFuZEZhbigpIHsgcmV0dXJuIHRoaXMuQXM8SGFuZEZhblQ+KCk7IH0KICAgcHVibGljIHN0YXRpYyBHYWRnZXRVbmlvbiBGcm9tSGFuZEZhbihIYW5kRmFuVCBfaGFuZGZhbikgeyByZXR1cm4gbmV3IEdhZGdldFVuaW9ueyBUeXBlID0gR2FkZ2V0LkhhbmRGYW4sIFZhbHVlID0gX2hhbmRmYW4gfTsgfQogCi0gIHB1YmxpYyBzdGF0aWMgaW50IFBhY2soRmxhdEJ1ZmZlcnMuRmxhdEJ1ZmZlckJ1aWxkZXIgYnVpbGRlciwgR2FkZ2V0VW5pb24gX28pIHsKKyAgcHVibGljIHN0YXRpYyBpbnQgUGFjayhHb29nbGUuRmxhdEJ1ZmZlcnMuRmxhdEJ1ZmZlckJ1aWxkZXIgYnVpbGRlciwgR2FkZ2V0VW5pb24gX28pIHsKICAgICBzd2l0Y2ggKF9vLlR5cGUpIHsKICAgICAgIGRlZmF1bHQ6IHJldHVybiAwOwogICAgICAgY2FzZSBHYWRnZXQuRmFsbGluZ1R1YjogcmV0dXJuIEZhbGxpbmdUdWIuUGFjayhidWlsZGVyLCBfby5Bc0ZhbGxpbmdUdWIoKSkuVmFsdWU7CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy91bmlvbl92ZWN0b3IvSGFuZEZhbi5jcyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL3VuaW9uX3ZlY3Rvci9IYW5kRmFuLmNzCmluZGV4IGE4ODhhYmYuLjUyZTNlNzQgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL3VuaW9uX3ZlY3Rvci9IYW5kRmFuLmNzCisrKyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL3VuaW9uX3ZlY3Rvci9IYW5kRmFuLmNzCkBAIC00LDEzICs0LDEzIEBACiAKIHVzaW5nIGdsb2JhbDo6U3lzdGVtOwogdXNpbmcgZ2xvYmFsOjpTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKLXVzaW5nIGdsb2JhbDo6RmxhdEJ1ZmZlcnM7Cit1c2luZyBnbG9iYWw6Okdvb2dsZS5GbGF0QnVmZmVyczsKIAogcHVibGljIHN0cnVjdCBIYW5kRmFuIDogSUZsYXRidWZmZXJPYmplY3QKIHsKICAgcHJpdmF0ZSBUYWJsZSBfX3A7CiAgIHB1YmxpYyBCeXRlQnVmZmVyIEJ5dGVCdWZmZXIgeyBnZXQgeyByZXR1cm4gX19wLmJiOyB9IH0KLSAgcHVibGljIHN0YXRpYyB2b2lkIFZhbGlkYXRlVmVyc2lvbigpIHsgRmxhdEJ1ZmZlckNvbnN0YW50cy5GTEFUQlVGRkVSU18yXzBfMCgpOyB9CisgIHB1YmxpYyBzdGF0aWMgdm9pZCBWYWxpZGF0ZVZlcnNpb24oKSB7IEZsYXRCdWZmZXJDb25zdGFudHMuRkxBVEJVRkZFUlNfMl8wXzgoKTsgfQogICBwdWJsaWMgc3RhdGljIEhhbmRGYW4gR2V0Um9vdEFzSGFuZEZhbihCeXRlQnVmZmVyIF9iYikgeyByZXR1cm4gR2V0Um9vdEFzSGFuZEZhbihfYmIsIG5ldyBIYW5kRmFuKCkpOyB9CiAgIHB1YmxpYyBzdGF0aWMgSGFuZEZhbiBHZXRSb290QXNIYW5kRmFuKEJ5dGVCdWZmZXIgX2JiLCBIYW5kRmFuIG9iaikgeyByZXR1cm4gKG9iai5fX2Fzc2lnbihfYmIuR2V0SW50KF9iYi5Qb3NpdGlvbikgKyBfYmIuUG9zaXRpb24sIF9iYikpOyB9CiAgIHB1YmxpYyB2b2lkIF9faW5pdChpbnQgX2ksIEJ5dGVCdWZmZXIgX2JiKSB7IF9fcCA9IG5ldyBUYWJsZShfaSwgX2JiKTsgfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvdW5pb25fdmVjdG9yL0hhbmRGYW4uamF2YSBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL3VuaW9uX3ZlY3Rvci9IYW5kRmFuLmphdmEKaW5kZXggMTRiMjUyMC4uNjQxZGE4NCAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvdW5pb25fdmVjdG9yL0hhbmRGYW4uamF2YQorKysgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy91bmlvbl92ZWN0b3IvSGFuZEZhbi5qYXZhCkBAIC03LDcgKzcsNyBAQAogCiBAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikKIHB1YmxpYyBmaW5hbCBjbGFzcyBIYW5kRmFuIGV4dGVuZHMgVGFibGUgewotICBwdWJsaWMgc3RhdGljIHZvaWQgVmFsaWRhdGVWZXJzaW9uKCkgeyBDb25zdGFudHMuRkxBVEJVRkZFUlNfMl8wXzAoKTsgfQorICBwdWJsaWMgc3RhdGljIHZvaWQgVmFsaWRhdGVWZXJzaW9uKCkgeyBDb25zdGFudHMuRkxBVEJVRkZFUlNfMl8wXzgoKTsgfQogICBwdWJsaWMgc3RhdGljIEhhbmRGYW4gZ2V0Um9vdEFzSGFuZEZhbihCeXRlQnVmZmVyIF9iYikgeyByZXR1cm4gZ2V0Um9vdEFzSGFuZEZhbihfYmIsIG5ldyBIYW5kRmFuKCkpOyB9CiAgIHB1YmxpYyBzdGF0aWMgSGFuZEZhbiBnZXRSb290QXNIYW5kRmFuKEJ5dGVCdWZmZXIgX2JiLCBIYW5kRmFuIG9iaikgeyBfYmIub3JkZXIoQnl0ZU9yZGVyLkxJVFRMRV9FTkRJQU4pOyByZXR1cm4gKG9iai5fX2Fzc2lnbihfYmIuZ2V0SW50KF9iYi5wb3NpdGlvbigpKSArIF9iYi5wb3NpdGlvbigpLCBfYmIpKTsgfQogICBwdWJsaWMgdm9pZCBfX2luaXQoaW50IF9pLCBCeXRlQnVmZmVyIF9iYikgeyBfX3Jlc2V0KF9pLCBfYmIpOyB9CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy91bmlvbl92ZWN0b3IvSGFuZEZhbi5rdCBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL3VuaW9uX3ZlY3Rvci9IYW5kRmFuLmt0CmluZGV4IDBhOGEwNTUuLjgzMDRkMWYgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL3VuaW9uX3ZlY3Rvci9IYW5kRmFuLmt0CisrKyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL3VuaW9uX3ZlY3Rvci9IYW5kRmFuLmt0CkBAIC0yOSw3ICsyOSw3IEBACiAgICAgICAgIH0KICAgICB9CiAgICAgY29tcGFuaW9uIG9iamVjdCB7Ci0gICAgICAgIGZ1biB2YWxpZGF0ZVZlcnNpb24oKSA9IENvbnN0YW50cy5GTEFUQlVGRkVSU18yXzBfMCgpCisgICAgICAgIGZ1biB2YWxpZGF0ZVZlcnNpb24oKSA9IENvbnN0YW50cy5GTEFUQlVGRkVSU18yXzBfOCgpCiAgICAgICAgIGZ1biBnZXRSb290QXNIYW5kRmFuKF9iYjogQnl0ZUJ1ZmZlcik6IEhhbmRGYW4gPSBnZXRSb290QXNIYW5kRmFuKF9iYiwgSGFuZEZhbigpKQogICAgICAgICBmdW4gZ2V0Um9vdEFzSGFuZEZhbihfYmI6IEJ5dGVCdWZmZXIsIG9iajogSGFuZEZhbik6IEhhbmRGYW4gewogICAgICAgICAgICAgX2JiLm9yZGVyKEJ5dGVPcmRlci5MSVRUTEVfRU5ESUFOKQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvdW5pb25fdmVjdG9yL01vdmllLmNzIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvdW5pb25fdmVjdG9yL01vdmllLmNzCmluZGV4IGY4NWRhYTYuLjliYzJkOWEgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL3VuaW9uX3ZlY3Rvci9Nb3ZpZS5jcworKysgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy91bmlvbl92ZWN0b3IvTW92aWUuY3MKQEAgLTQsMTMgKzQsMTMgQEAKIAogdXNpbmcgZ2xvYmFsOjpTeXN0ZW07CiB1c2luZyBnbG9iYWw6OlN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwotdXNpbmcgZ2xvYmFsOjpGbGF0QnVmZmVyczsKK3VzaW5nIGdsb2JhbDo6R29vZ2xlLkZsYXRCdWZmZXJzOwogCiBwdWJsaWMgc3RydWN0IE1vdmllIDogSUZsYXRidWZmZXJPYmplY3QKIHsKICAgcHJpdmF0ZSBUYWJsZSBfX3A7CiAgIHB1YmxpYyBCeXRlQnVmZmVyIEJ5dGVCdWZmZXIgeyBnZXQgeyByZXR1cm4gX19wLmJiOyB9IH0KLSAgcHVibGljIHN0YXRpYyB2b2lkIFZhbGlkYXRlVmVyc2lvbigpIHsgRmxhdEJ1ZmZlckNvbnN0YW50cy5GTEFUQlVGRkVSU18yXzBfMCgpOyB9CisgIHB1YmxpYyBzdGF0aWMgdm9pZCBWYWxpZGF0ZVZlcnNpb24oKSB7IEZsYXRCdWZmZXJDb25zdGFudHMuRkxBVEJVRkZFUlNfMl8wXzgoKTsgfQogICBwdWJsaWMgc3RhdGljIE1vdmllIEdldFJvb3RBc01vdmllKEJ5dGVCdWZmZXIgX2JiKSB7IHJldHVybiBHZXRSb290QXNNb3ZpZShfYmIsIG5ldyBNb3ZpZSgpKTsgfQogICBwdWJsaWMgc3RhdGljIE1vdmllIEdldFJvb3RBc01vdmllKEJ5dGVCdWZmZXIgX2JiLCBNb3ZpZSBvYmopIHsgcmV0dXJuIChvYmouX19hc3NpZ24oX2JiLkdldEludChfYmIuUG9zaXRpb24pICsgX2JiLlBvc2l0aW9uLCBfYmIpKTsgfQogICBwdWJsaWMgc3RhdGljIGJvb2wgTW92aWVCdWZmZXJIYXNJZGVudGlmaWVyKEJ5dGVCdWZmZXIgX2JiKSB7IHJldHVybiBUYWJsZS5fX2hhc19pZGVudGlmaWVyKF9iYiwgIk1PVkkiKTsgfQpAQCAtNTcsMTAgKzU3LDE0IEBACiAgIHB1YmxpYyBzdGF0aWMgdm9pZCBBZGRDaGFyYWN0ZXJzVHlwZShGbGF0QnVmZmVyQnVpbGRlciBidWlsZGVyLCBWZWN0b3JPZmZzZXQgY2hhcmFjdGVyc1R5cGVPZmZzZXQpIHsgYnVpbGRlci5BZGRPZmZzZXQoMiwgY2hhcmFjdGVyc1R5cGVPZmZzZXQuVmFsdWUsIDApOyB9CiAgIHB1YmxpYyBzdGF0aWMgVmVjdG9yT2Zmc2V0IENyZWF0ZUNoYXJhY3RlcnNUeXBlVmVjdG9yKEZsYXRCdWZmZXJCdWlsZGVyIGJ1aWxkZXIsIENoYXJhY3RlcltdIGRhdGEpIHsgYnVpbGRlci5TdGFydFZlY3RvcigxLCBkYXRhLkxlbmd0aCwgMSk7IGZvciAoaW50IGkgPSBkYXRhLkxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSBidWlsZGVyLkFkZEJ5dGUoKGJ5dGUpZGF0YVtpXSk7IHJldHVybiBidWlsZGVyLkVuZFZlY3RvcigpOyB9CiAgIHB1YmxpYyBzdGF0aWMgVmVjdG9yT2Zmc2V0IENyZWF0ZUNoYXJhY3RlcnNUeXBlVmVjdG9yQmxvY2soRmxhdEJ1ZmZlckJ1aWxkZXIgYnVpbGRlciwgQ2hhcmFjdGVyW10gZGF0YSkgeyBidWlsZGVyLlN0YXJ0VmVjdG9yKDEsIGRhdGEuTGVuZ3RoLCAxKTsgYnVpbGRlci5BZGQoZGF0YSk7IHJldHVybiBidWlsZGVyLkVuZFZlY3RvcigpOyB9CisgIHB1YmxpYyBzdGF0aWMgVmVjdG9yT2Zmc2V0IENyZWF0ZUNoYXJhY3RlcnNUeXBlVmVjdG9yQmxvY2soRmxhdEJ1ZmZlckJ1aWxkZXIgYnVpbGRlciwgQXJyYXlTZWdtZW50PENoYXJhY3Rlcj4gZGF0YSkgeyBidWlsZGVyLlN0YXJ0VmVjdG9yKDEsIGRhdGEuQ291bnQsIDEpOyBidWlsZGVyLkFkZChkYXRhKTsgcmV0dXJuIGJ1aWxkZXIuRW5kVmVjdG9yKCk7IH0KKyAgcHVibGljIHN0YXRpYyBWZWN0b3JPZmZzZXQgQ3JlYXRlQ2hhcmFjdGVyc1R5cGVWZWN0b3JCbG9jayhGbGF0QnVmZmVyQnVpbGRlciBidWlsZGVyLCBJbnRQdHIgZGF0YVB0ciwgaW50IHNpemVJbkJ5dGVzKSB7IGJ1aWxkZXIuU3RhcnRWZWN0b3IoMSwgc2l6ZUluQnl0ZXMsIDEpOyBidWlsZGVyLkFkZDxDaGFyYWN0ZXI+KGRhdGFQdHIsIHNpemVJbkJ5dGVzKTsgcmV0dXJuIGJ1aWxkZXIuRW5kVmVjdG9yKCk7IH0KICAgcHVibGljIHN0YXRpYyB2b2lkIFN0YXJ0Q2hhcmFjdGVyc1R5cGVWZWN0b3IoRmxhdEJ1ZmZlckJ1aWxkZXIgYnVpbGRlciwgaW50IG51bUVsZW1zKSB7IGJ1aWxkZXIuU3RhcnRWZWN0b3IoMSwgbnVtRWxlbXMsIDEpOyB9CiAgIHB1YmxpYyBzdGF0aWMgdm9pZCBBZGRDaGFyYWN0ZXJzKEZsYXRCdWZmZXJCdWlsZGVyIGJ1aWxkZXIsIFZlY3Rvck9mZnNldCBjaGFyYWN0ZXJzT2Zmc2V0KSB7IGJ1aWxkZXIuQWRkT2Zmc2V0KDMsIGNoYXJhY3RlcnNPZmZzZXQuVmFsdWUsIDApOyB9CiAgIHB1YmxpYyBzdGF0aWMgVmVjdG9yT2Zmc2V0IENyZWF0ZUNoYXJhY3RlcnNWZWN0b3IoRmxhdEJ1ZmZlckJ1aWxkZXIgYnVpbGRlciwgaW50W10gZGF0YSkgeyBidWlsZGVyLlN0YXJ0VmVjdG9yKDQsIGRhdGEuTGVuZ3RoLCA0KTsgZm9yIChpbnQgaSA9IGRhdGEuTGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIGJ1aWxkZXIuQWRkT2Zmc2V0KGRhdGFbaV0pOyByZXR1cm4gYnVpbGRlci5FbmRWZWN0b3IoKTsgfQogICBwdWJsaWMgc3RhdGljIFZlY3Rvck9mZnNldCBDcmVhdGVDaGFyYWN0ZXJzVmVjdG9yQmxvY2soRmxhdEJ1ZmZlckJ1aWxkZXIgYnVpbGRlciwgaW50W10gZGF0YSkgeyBidWlsZGVyLlN0YXJ0VmVjdG9yKDQsIGRhdGEuTGVuZ3RoLCA0KTsgYnVpbGRlci5BZGQoZGF0YSk7IHJldHVybiBidWlsZGVyLkVuZFZlY3RvcigpOyB9CisgIHB1YmxpYyBzdGF0aWMgVmVjdG9yT2Zmc2V0IENyZWF0ZUNoYXJhY3RlcnNWZWN0b3JCbG9jayhGbGF0QnVmZmVyQnVpbGRlciBidWlsZGVyLCBBcnJheVNlZ21lbnQ8aW50PiBkYXRhKSB7IGJ1aWxkZXIuU3RhcnRWZWN0b3IoNCwgZGF0YS5Db3VudCwgNCk7IGJ1aWxkZXIuQWRkKGRhdGEpOyByZXR1cm4gYnVpbGRlci5FbmRWZWN0b3IoKTsgfQorICBwdWJsaWMgc3RhdGljIFZlY3Rvck9mZnNldCBDcmVhdGVDaGFyYWN0ZXJzVmVjdG9yQmxvY2soRmxhdEJ1ZmZlckJ1aWxkZXIgYnVpbGRlciwgSW50UHRyIGRhdGFQdHIsIGludCBzaXplSW5CeXRlcykgeyBidWlsZGVyLlN0YXJ0VmVjdG9yKDEsIHNpemVJbkJ5dGVzLCAxKTsgYnVpbGRlci5BZGQ8aW50PihkYXRhUHRyLCBzaXplSW5CeXRlcyk7IHJldHVybiBidWlsZGVyLkVuZFZlY3RvcigpOyB9CiAgIHB1YmxpYyBzdGF0aWMgdm9pZCBTdGFydENoYXJhY3RlcnNWZWN0b3IoRmxhdEJ1ZmZlckJ1aWxkZXIgYnVpbGRlciwgaW50IG51bUVsZW1zKSB7IGJ1aWxkZXIuU3RhcnRWZWN0b3IoNCwgbnVtRWxlbXMsIDQpOyB9CiAgIHB1YmxpYyBzdGF0aWMgT2Zmc2V0PE1vdmllPiBFbmRNb3ZpZShGbGF0QnVmZmVyQnVpbGRlciBidWlsZGVyKSB7CiAgICAgaW50IG8gPSBidWlsZGVyLkVuZFRhYmxlKCk7CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy91bmlvbl92ZWN0b3IvTW92aWUuamF2YSBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL3VuaW9uX3ZlY3Rvci9Nb3ZpZS5qYXZhCmluZGV4IGRjNDBkODAuLjJjZjE2MjIgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL3VuaW9uX3ZlY3Rvci9Nb3ZpZS5qYXZhCisrKyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL3VuaW9uX3ZlY3Rvci9Nb3ZpZS5qYXZhCkBAIC03LDcgKzcsNyBAQAogCiBAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikKIHB1YmxpYyBmaW5hbCBjbGFzcyBNb3ZpZSBleHRlbmRzIFRhYmxlIHsKLSAgcHVibGljIHN0YXRpYyB2b2lkIFZhbGlkYXRlVmVyc2lvbigpIHsgQ29uc3RhbnRzLkZMQVRCVUZGRVJTXzJfMF8wKCk7IH0KKyAgcHVibGljIHN0YXRpYyB2b2lkIFZhbGlkYXRlVmVyc2lvbigpIHsgQ29uc3RhbnRzLkZMQVRCVUZGRVJTXzJfMF84KCk7IH0KICAgcHVibGljIHN0YXRpYyBNb3ZpZSBnZXRSb290QXNNb3ZpZShCeXRlQnVmZmVyIF9iYikgeyByZXR1cm4gZ2V0Um9vdEFzTW92aWUoX2JiLCBuZXcgTW92aWUoKSk7IH0KICAgcHVibGljIHN0YXRpYyBNb3ZpZSBnZXRSb290QXNNb3ZpZShCeXRlQnVmZmVyIF9iYiwgTW92aWUgb2JqKSB7IF9iYi5vcmRlcihCeXRlT3JkZXIuTElUVExFX0VORElBTik7IHJldHVybiAob2JqLl9fYXNzaWduKF9iYi5nZXRJbnQoX2JiLnBvc2l0aW9uKCkpICsgX2JiLnBvc2l0aW9uKCksIF9iYikpOyB9CiAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBNb3ZpZUJ1ZmZlckhhc0lkZW50aWZpZXIoQnl0ZUJ1ZmZlciBfYmIpIHsgcmV0dXJuIF9faGFzX2lkZW50aWZpZXIoX2JiLCAiTU9WSSIpOyB9CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy91bmlvbl92ZWN0b3IvTW92aWUua3QgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy91bmlvbl92ZWN0b3IvTW92aWUua3QKaW5kZXggYTlhZDkwNi4uZWUyNmE1OSAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvdW5pb25fdmVjdG9yL01vdmllLmt0CisrKyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL3VuaW9uX3ZlY3Rvci9Nb3ZpZS5rdApAQCAtNjcsNyArNjcsNyBAQAogICAgICAgICAgICAgdmFsIG8gPSBfX29mZnNldCgxMCk7IHJldHVybiBpZiAobyAhPSAwKSBfX3ZlY3Rvcl9sZW4obykgZWxzZSAwCiAgICAgICAgIH0KICAgICBjb21wYW5pb24gb2JqZWN0IHsKLSAgICAgICAgZnVuIHZhbGlkYXRlVmVyc2lvbigpID0gQ29uc3RhbnRzLkZMQVRCVUZGRVJTXzJfMF8wKCkKKyAgICAgICAgZnVuIHZhbGlkYXRlVmVyc2lvbigpID0gQ29uc3RhbnRzLkZMQVRCVUZGRVJTXzJfMF84KCkKICAgICAgICAgZnVuIGdldFJvb3RBc01vdmllKF9iYjogQnl0ZUJ1ZmZlcik6IE1vdmllID0gZ2V0Um9vdEFzTW92aWUoX2JiLCBNb3ZpZSgpKQogICAgICAgICBmdW4gZ2V0Um9vdEFzTW92aWUoX2JiOiBCeXRlQnVmZmVyLCBvYmo6IE1vdmllKTogTW92aWUgewogICAgICAgICAgICAgX2JiLm9yZGVyKEJ5dGVPcmRlci5MSVRUTEVfRU5ESUFOKQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvdW5pb25fdmVjdG9yL1JhcHVuemVsLmNzIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvdW5pb25fdmVjdG9yL1JhcHVuemVsLmNzCmluZGV4IDMxZDJjZGYuLmI5NTU5ZDMgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL3VuaW9uX3ZlY3Rvci9SYXB1bnplbC5jcworKysgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy91bmlvbl92ZWN0b3IvUmFwdW56ZWwuY3MKQEAgLTQsNyArNCw3IEBACiAKIHVzaW5nIGdsb2JhbDo6U3lzdGVtOwogdXNpbmcgZ2xvYmFsOjpTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKLXVzaW5nIGdsb2JhbDo6RmxhdEJ1ZmZlcnM7Cit1c2luZyBnbG9iYWw6Okdvb2dsZS5GbGF0QnVmZmVyczsKIAogcHVibGljIHN0cnVjdCBSYXB1bnplbCA6IElGbGF0YnVmZmVyT2JqZWN0CiB7CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy91bmlvbl92ZWN0b3IvYXR0YWNrZXIudHMgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy91bmlvbl92ZWN0b3IvYXR0YWNrZXIudHMKaW5kZXggYWYzNzAyMC4uNmIzZmMwZiAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvdW5pb25fdmVjdG9yL2F0dGFja2VyLnRzCisrKyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL3VuaW9uX3ZlY3Rvci9hdHRhY2tlci50cwpAQCAtNyw3ICs3LDcgQEAKIGV4cG9ydCBjbGFzcyBBdHRhY2tlciB7CiAgIGJiOiBmbGF0YnVmZmVycy5CeXRlQnVmZmVyfG51bGwgPSBudWxsOwogICBiYl9wb3MgPSAwOwotX19pbml0KGk6bnVtYmVyLCBiYjpmbGF0YnVmZmVycy5CeXRlQnVmZmVyKTpBdHRhY2tlciB7CisgIF9faW5pdChpOm51bWJlciwgYmI6ZmxhdGJ1ZmZlcnMuQnl0ZUJ1ZmZlcik6QXR0YWNrZXIgewogICB0aGlzLmJiX3BvcyA9IGk7CiAgIHRoaXMuYmIgPSBiYjsKICAgcmV0dXJuIHRoaXM7CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy91bmlvbl92ZWN0b3IvYm9vay1yZWFkZXIudHMgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy91bmlvbl92ZWN0b3IvYm9vay1yZWFkZXIudHMKaW5kZXggMjMxMDYwMC4uN2EzMTI3OCAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvdW5pb25fdmVjdG9yL2Jvb2stcmVhZGVyLnRzCisrKyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL3VuaW9uX3ZlY3Rvci9ib29rLXJlYWRlci50cwpAQCAtNyw3ICs3LDcgQEAKIGV4cG9ydCBjbGFzcyBCb29rUmVhZGVyIHsKICAgYmI6IGZsYXRidWZmZXJzLkJ5dGVCdWZmZXJ8bnVsbCA9IG51bGw7CiAgIGJiX3BvcyA9IDA7Ci1fX2luaXQoaTpudW1iZXIsIGJiOmZsYXRidWZmZXJzLkJ5dGVCdWZmZXIpOkJvb2tSZWFkZXIgeworICBfX2luaXQoaTpudW1iZXIsIGJiOmZsYXRidWZmZXJzLkJ5dGVCdWZmZXIpOkJvb2tSZWFkZXIgewogICB0aGlzLmJiX3BvcyA9IGk7CiAgIHRoaXMuYmIgPSBiYjsKICAgcmV0dXJuIHRoaXM7CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy91bmlvbl92ZWN0b3IvY2hhcmFjdGVyLnRzIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvdW5pb25fdmVjdG9yL2NoYXJhY3Rlci50cwppbmRleCBkYmY4ZDUxLi5kOGZmYmMyIDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy91bmlvbl92ZWN0b3IvY2hhcmFjdGVyLnRzCisrKyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL3VuaW9uX3ZlY3Rvci9jaGFyYWN0ZXIudHMKQEAgLTUsNyArNSw3IEBACiBpbXBvcnQgeyBSYXB1bnplbCwgUmFwdW56ZWxUIH0gZnJvbSAnLi9yYXB1bnplbCc7CiAKIAotZXhwb3J0IGVudW0gQ2hhcmFjdGVyeworZXhwb3J0IGVudW0gQ2hhcmFjdGVyIHsKICAgTk9ORSA9IDAsCiAgIE11TGFuID0gMSwKICAgUmFwdW56ZWwgPSAyLApAQCAtNDcsNCArNDcsMyBAQAogICAgIGRlZmF1bHQ6IHJldHVybiBudWxsOwogICB9CiB9Ci0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL3VuaW9uX3ZlY3Rvci9mYWxsaW5nLXR1Yi50cyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL3VuaW9uX3ZlY3Rvci9mYWxsaW5nLXR1Yi50cwppbmRleCAzYTgzNmIzLi5iMzJmOTlkIDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy91bmlvbl92ZWN0b3IvZmFsbGluZy10dWIudHMKKysrIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvdW5pb25fdmVjdG9yL2ZhbGxpbmctdHViLnRzCkBAIC03LDcgKzcsNyBAQAogZXhwb3J0IGNsYXNzIEZhbGxpbmdUdWIgewogICBiYjogZmxhdGJ1ZmZlcnMuQnl0ZUJ1ZmZlcnxudWxsID0gbnVsbDsKICAgYmJfcG9zID0gMDsKLV9faW5pdChpOm51bWJlciwgYmI6ZmxhdGJ1ZmZlcnMuQnl0ZUJ1ZmZlcik6RmFsbGluZ1R1YiB7CisgIF9faW5pdChpOm51bWJlciwgYmI6ZmxhdGJ1ZmZlcnMuQnl0ZUJ1ZmZlcik6RmFsbGluZ1R1YiB7CiAgIHRoaXMuYmJfcG9zID0gaTsKICAgdGhpcy5iYiA9IGJiOwogICByZXR1cm4gdGhpczsKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL3VuaW9uX3ZlY3Rvci9nYWRnZXQudHMgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy91bmlvbl92ZWN0b3IvZ2FkZ2V0LnRzCmluZGV4IDRkODRiMGEuLjMyODA3MWUgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL3VuaW9uX3ZlY3Rvci9nYWRnZXQudHMKKysrIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvdW5pb25fdmVjdG9yL2dhZGdldC50cwpAQCAtNCw3ICs0LDcgQEAKIGltcG9ydCB7IEhhbmRGYW4sIEhhbmRGYW5UIH0gZnJvbSAnLi9oYW5kLWZhbic7CiAKIAotZXhwb3J0IGVudW0gR2FkZ2V0eworZXhwb3J0IGVudW0gR2FkZ2V0IHsKICAgTk9ORSA9IDAsCiAgIEZhbGxpbmdUdWIgPSAxLAogICBIYW5kRmFuID0gMgpAQCAtMzQsNCArMzQsMyBAQAogICAgIGRlZmF1bHQ6IHJldHVybiBudWxsOwogICB9CiB9Ci0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL3VuaW9uX3ZlY3Rvci9oYW5kLWZhbi50cyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL3VuaW9uX3ZlY3Rvci9oYW5kLWZhbi50cwppbmRleCA0YTc3MGJhLi5mOTBiNGRkIDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy91bmlvbl92ZWN0b3IvaGFuZC1mYW4udHMKKysrIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvdW5pb25fdmVjdG9yL2hhbmQtZmFuLnRzCkBAIC03LDcgKzcsNyBAQAogZXhwb3J0IGNsYXNzIEhhbmRGYW4gewogICBiYjogZmxhdGJ1ZmZlcnMuQnl0ZUJ1ZmZlcnxudWxsID0gbnVsbDsKICAgYmJfcG9zID0gMDsKLV9faW5pdChpOm51bWJlciwgYmI6ZmxhdGJ1ZmZlcnMuQnl0ZUJ1ZmZlcik6SGFuZEZhbiB7CisgIF9faW5pdChpOm51bWJlciwgYmI6ZmxhdGJ1ZmZlcnMuQnl0ZUJ1ZmZlcik6SGFuZEZhbiB7CiAgIHRoaXMuYmJfcG9zID0gaTsKICAgdGhpcy5iYiA9IGJiOwogICByZXR1cm4gdGhpczsKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL3VuaW9uX3ZlY3Rvci9tb3ZpZS50cyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL3VuaW9uX3ZlY3Rvci9tb3ZpZS50cwppbmRleCBiM2U4MzgxLi5mY2VhZGFhIDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy91bmlvbl92ZWN0b3IvbW92aWUudHMKKysrIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvdW5pb25fdmVjdG9yL21vdmllLnRzCkBAIC0xMSw3ICsxMSw3IEBACiBleHBvcnQgY2xhc3MgTW92aWUgewogICBiYjogZmxhdGJ1ZmZlcnMuQnl0ZUJ1ZmZlcnxudWxsID0gbnVsbDsKICAgYmJfcG9zID0gMDsKLV9faW5pdChpOm51bWJlciwgYmI6ZmxhdGJ1ZmZlcnMuQnl0ZUJ1ZmZlcik6TW92aWUgeworICBfX2luaXQoaTpudW1iZXIsIGJiOmZsYXRidWZmZXJzLkJ5dGVCdWZmZXIpOk1vdmllIHsKICAgdGhpcy5iYl9wb3MgPSBpOwogICB0aGlzLmJiID0gYmI7CiAgIHJldHVybiB0aGlzOwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvdW5pb25fdmVjdG9yL3JhcHVuemVsLnRzIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvdW5pb25fdmVjdG9yL3JhcHVuemVsLnRzCmluZGV4IDI4ZjZlOTkuLmUxZGM2M2QgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL3VuaW9uX3ZlY3Rvci9yYXB1bnplbC50cworKysgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy91bmlvbl92ZWN0b3IvcmFwdW56ZWwudHMKQEAgLTcsNyArNyw3IEBACiBleHBvcnQgY2xhc3MgUmFwdW56ZWwgewogICBiYjogZmxhdGJ1ZmZlcnMuQnl0ZUJ1ZmZlcnxudWxsID0gbnVsbDsKICAgYmJfcG9zID0gMDsKLV9faW5pdChpOm51bWJlciwgYmI6ZmxhdGJ1ZmZlcnMuQnl0ZUJ1ZmZlcik6UmFwdW56ZWwgeworICBfX2luaXQoaTpudW1iZXIsIGJiOmZsYXRidWZmZXJzLkJ5dGVCdWZmZXIpOlJhcHVuemVsIHsKICAgdGhpcy5iYl9wb3MgPSBpOwogICB0aGlzLmJiID0gYmI7CiAgIHJldHVybiB0aGlzOwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvdW5pb25fdmVjdG9yL3VuaW9uX3ZlY3Rvcl9nZW5lcmF0ZWQuaCBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL3VuaW9uX3ZlY3Rvci91bmlvbl92ZWN0b3JfZ2VuZXJhdGVkLmgKaW5kZXggZTA4ZGY2YS4uOGY2MDI3MiAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvdW5pb25fdmVjdG9yL3VuaW9uX3ZlY3Rvcl9nZW5lcmF0ZWQuaAorKysgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy91bmlvbl92ZWN0b3IvdW5pb25fdmVjdG9yX2dlbmVyYXRlZC5oCkBAIC02LDYgKzYsMTMgQEAKIAogI2luY2x1ZGUgImZsYXRidWZmZXJzL2ZsYXRidWZmZXJzLmgiCiAKKy8vIEVuc3VyZSB0aGUgaW5jbHVkZWQgZmxhdGJ1ZmZlcnMuaCBpcyB0aGUgc2FtZSB2ZXJzaW9uIGFzIHdoZW4gdGhpcyBmaWxlIHdhcworLy8gZ2VuZXJhdGVkLCBvdGhlcndpc2UgaXQgbWF5IG5vdCBiZSBjb21wYXRpYmxlLgorc3RhdGljX2Fzc2VydChGTEFUQlVGRkVSU19WRVJTSU9OX01BSk9SID09IDIgJiYKKyAgICAgICAgICAgICAgRkxBVEJVRkZFUlNfVkVSU0lPTl9NSU5PUiA9PSAwICYmCisgICAgICAgICAgICAgIEZMQVRCVUZGRVJTX1ZFUlNJT05fUkVWSVNJT04gPT0gOCwKKyAgICAgICAgICAgICAiTm9uLWNvbXBhdGlibGUgZmxhdGJ1ZmZlcnMgdmVyc2lvbiBpbmNsdWRlZCIpOworCiBzdHJ1Y3QgQXR0YWNrZXI7CiBzdHJ1Y3QgQXR0YWNrZXJCdWlsZGVyOwogc3RydWN0IEF0dGFja2VyVDsKQEAgLTM0OSw5ICszNTYsNiBAQAogICBzdGF0aWMgY29uc3QgZmxhdGJ1ZmZlcnM6OlR5cGVUYWJsZSAqTWluaVJlZmxlY3RUeXBlVGFibGUoKSB7CiAgICAgcmV0dXJuIFJhcHVuemVsVHlwZVRhYmxlKCk7CiAgIH0KLSAgc3RhdGljIEZMQVRCVUZGRVJTX0NPTlNURVhQUl9DUFAxMSBjb25zdCBjaGFyICpHZXRGdWxseVF1YWxpZmllZE5hbWUoKSB7Ci0gICAgcmV0dXJuICJSYXB1bnplbCI7Ci0gIH0KICAgUmFwdW56ZWwoKQogICAgICAgOiBoYWlyX2xlbmd0aF8oMCkgewogICB9CkBAIC0zODUsOSArMzg5LDYgQEAKICAgc3RhdGljIGNvbnN0IGZsYXRidWZmZXJzOjpUeXBlVGFibGUgKk1pbmlSZWZsZWN0VHlwZVRhYmxlKCkgewogICAgIHJldHVybiBCb29rUmVhZGVyVHlwZVRhYmxlKCk7CiAgIH0KLSAgc3RhdGljIEZMQVRCVUZGRVJTX0NPTlNURVhQUl9DUFAxMSBjb25zdCBjaGFyICpHZXRGdWxseVF1YWxpZmllZE5hbWUoKSB7Ci0gICAgcmV0dXJuICJCb29rUmVhZGVyIjsKLSAgfQogICBCb29rUmVhZGVyKCkKICAgICAgIDogYm9va3NfcmVhZF8oMCkgewogICB9CkBAIC00MjEsOSArNDIyLDYgQEAKICAgc3RhdGljIGNvbnN0IGZsYXRidWZmZXJzOjpUeXBlVGFibGUgKk1pbmlSZWZsZWN0VHlwZVRhYmxlKCkgewogICAgIHJldHVybiBGYWxsaW5nVHViVHlwZVRhYmxlKCk7CiAgIH0KLSAgc3RhdGljIEZMQVRCVUZGRVJTX0NPTlNURVhQUl9DUFAxMSBjb25zdCBjaGFyICpHZXRGdWxseVF1YWxpZmllZE5hbWUoKSB7Ci0gICAgcmV0dXJuICJGYWxsaW5nVHViIjsKLSAgfQogICBGYWxsaW5nVHViKCkKICAgICAgIDogd2VpZ2h0XygwKSB7CiAgIH0KQEAgLTQ1MSw5ICs0NDksNiBAQAogCiBzdHJ1Y3QgQXR0YWNrZXJUIDogcHVibGljIGZsYXRidWZmZXJzOjpOYXRpdmVUYWJsZSB7CiAgIHR5cGVkZWYgQXR0YWNrZXIgVGFibGVUeXBlOwotICBzdGF0aWMgRkxBVEJVRkZFUlNfQ09OU1RFWFBSX0NQUDExIGNvbnN0IGNoYXIgKkdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpIHsKLSAgICByZXR1cm4gIkF0dGFja2VyVCI7Ci0gIH0KICAgaW50MzJfdCBzd29yZF9hdHRhY2tfZGFtYWdlID0gMDsKIH07CiAKQEAgLTQ2Myw5ICs0NTgsNiBAQAogICBzdGF0aWMgY29uc3QgZmxhdGJ1ZmZlcnM6OlR5cGVUYWJsZSAqTWluaVJlZmxlY3RUeXBlVGFibGUoKSB7CiAgICAgcmV0dXJuIEF0dGFja2VyVHlwZVRhYmxlKCk7CiAgIH0KLSAgc3RhdGljIEZMQVRCVUZGRVJTX0NPTlNURVhQUl9DUFAxMSBjb25zdCBjaGFyICpHZXRGdWxseVF1YWxpZmllZE5hbWUoKSB7Ci0gICAgcmV0dXJuICJBdHRhY2tlciI7Ci0gIH0KICAgZW51bSBGbGF0QnVmZmVyc1ZUYWJsZU9mZnNldCBGTEFUQlVGRkVSU19WVEFCTEVfVU5ERVJMWUlOR19UWVBFIHsKICAgICBWVF9TV09SRF9BVFRBQ0tfREFNQUdFID0gNAogICB9OwpAQCAtNTE1LDkgKzUwNyw2IEBACiAKIHN0cnVjdCBIYW5kRmFuVCA6IHB1YmxpYyBmbGF0YnVmZmVyczo6TmF0aXZlVGFibGUgewogICB0eXBlZGVmIEhhbmRGYW4gVGFibGVUeXBlOwotICBzdGF0aWMgRkxBVEJVRkZFUlNfQ09OU1RFWFBSX0NQUDExIGNvbnN0IGNoYXIgKkdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpIHsKLSAgICByZXR1cm4gIkhhbmRGYW5UIjsKLSAgfQogICBpbnQzMl90IGxlbmd0aCA9IDA7CiB9OwogCkBAIC01MjcsOSArNTE2LDYgQEAKICAgc3RhdGljIGNvbnN0IGZsYXRidWZmZXJzOjpUeXBlVGFibGUgKk1pbmlSZWZsZWN0VHlwZVRhYmxlKCkgewogICAgIHJldHVybiBIYW5kRmFuVHlwZVRhYmxlKCk7CiAgIH0KLSAgc3RhdGljIEZMQVRCVUZGRVJTX0NPTlNURVhQUl9DUFAxMSBjb25zdCBjaGFyICpHZXRGdWxseVF1YWxpZmllZE5hbWUoKSB7Ci0gICAgcmV0dXJuICJIYW5kRmFuIjsKLSAgfQogICBlbnVtIEZsYXRCdWZmZXJzVlRhYmxlT2Zmc2V0IEZMQVRCVUZGRVJTX1ZUQUJMRV9VTkRFUkxZSU5HX1RZUEUgewogICAgIFZUX0xFTkdUSCA9IDQKICAgfTsKQEAgLTU3OSw5ICs1NjUsNiBAQAogCiBzdHJ1Y3QgTW92aWVUIDogcHVibGljIGZsYXRidWZmZXJzOjpOYXRpdmVUYWJsZSB7CiAgIHR5cGVkZWYgTW92aWUgVGFibGVUeXBlOwotICBzdGF0aWMgRkxBVEJVRkZFUlNfQ09OU1RFWFBSX0NQUDExIGNvbnN0IGNoYXIgKkdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpIHsKLSAgICByZXR1cm4gIk1vdmllVCI7Ci0gIH0KICAgQ2hhcmFjdGVyVW5pb24gbWFpbl9jaGFyYWN0ZXJ7fTsKICAgc3RkOjp2ZWN0b3I8Q2hhcmFjdGVyVW5pb24+IGNoYXJhY3RlcnN7fTsKIH07CkBAIC01OTIsOSArNTc1LDYgQEAKICAgc3RhdGljIGNvbnN0IGZsYXRidWZmZXJzOjpUeXBlVGFibGUgKk1pbmlSZWZsZWN0VHlwZVRhYmxlKCkgewogICAgIHJldHVybiBNb3ZpZVR5cGVUYWJsZSgpOwogICB9Ci0gIHN0YXRpYyBGTEFUQlVGRkVSU19DT05TVEVYUFJfQ1BQMTEgY29uc3QgY2hhciAqR2V0RnVsbHlRdWFsaWZpZWROYW1lKCkgewotICAgIHJldHVybiAiTW92aWUiOwotICB9CiAgIGVudW0gRmxhdEJ1ZmZlcnNWVGFibGVPZmZzZXQgRkxBVEJVRkZFUlNfVlRBQkxFX1VOREVSTFlJTkdfVFlQRSB7CiAgICAgVlRfTUFJTl9DSEFSQUNURVJfVFlQRSA9IDQsCiAgICAgVlRfTUFJTl9DSEFSQUNURVIgPSA2LApAQCAtODEzLDggKzc5Myw4IEBACiAgICh2b2lkKV9yZXNvbHZlcjsKICAgeyBhdXRvIF9lID0gbWFpbl9jaGFyYWN0ZXJfdHlwZSgpOyBfby0+bWFpbl9jaGFyYWN0ZXIudHlwZSA9IF9lOyB9CiAgIHsgYXV0byBfZSA9IG1haW5fY2hhcmFjdGVyKCk7IGlmIChfZSkgX28tPm1haW5fY2hhcmFjdGVyLnZhbHVlID0gQ2hhcmFjdGVyVW5pb246OlVuUGFjayhfZSwgbWFpbl9jaGFyYWN0ZXJfdHlwZSgpLCBfcmVzb2x2ZXIpOyB9Ci0gIHsgYXV0byBfZSA9IGNoYXJhY3RlcnNfdHlwZSgpOyBpZiAoX2UpIHsgX28tPmNoYXJhY3RlcnMucmVzaXplKF9lLT5zaXplKCkpOyBmb3IgKGZsYXRidWZmZXJzOjp1b2Zmc2V0X3QgX2kgPSAwOyBfaSA8IF9lLT5zaXplKCk7IF9pKyspIHsgX28tPmNoYXJhY3RlcnNbX2ldLnR5cGUgPSBzdGF0aWNfY2FzdDxDaGFyYWN0ZXI+KF9lLT5HZXQoX2kpKTsgfSB9IH0KLSAgeyBhdXRvIF9lID0gY2hhcmFjdGVycygpOyBpZiAoX2UpIHsgX28tPmNoYXJhY3RlcnMucmVzaXplKF9lLT5zaXplKCkpOyBmb3IgKGZsYXRidWZmZXJzOjp1b2Zmc2V0X3QgX2kgPSAwOyBfaSA8IF9lLT5zaXplKCk7IF9pKyspIHsgX28tPmNoYXJhY3RlcnNbX2ldLnZhbHVlID0gQ2hhcmFjdGVyVW5pb246OlVuUGFjayhfZS0+R2V0KF9pKSwgY2hhcmFjdGVyc190eXBlKCktPkdldEVudW08Q2hhcmFjdGVyPihfaSksIF9yZXNvbHZlcik7IH0gfSB9CisgIHsgYXV0byBfZSA9IGNoYXJhY3RlcnNfdHlwZSgpOyBpZiAoX2UpIHsgX28tPmNoYXJhY3RlcnMucmVzaXplKF9lLT5zaXplKCkpOyBmb3IgKGZsYXRidWZmZXJzOjp1b2Zmc2V0X3QgX2kgPSAwOyBfaSA8IF9lLT5zaXplKCk7IF9pKyspIHsgX28tPmNoYXJhY3RlcnNbX2ldLnR5cGUgPSBzdGF0aWNfY2FzdDxDaGFyYWN0ZXI+KF9lLT5HZXQoX2kpKTsgfSB9IGVsc2UgeyBfby0+Y2hhcmFjdGVycy5yZXNpemUoMCk7IH0gfQorICB7IGF1dG8gX2UgPSBjaGFyYWN0ZXJzKCk7IGlmIChfZSkgeyBfby0+Y2hhcmFjdGVycy5yZXNpemUoX2UtPnNpemUoKSk7IGZvciAoZmxhdGJ1ZmZlcnM6OnVvZmZzZXRfdCBfaSA9IDA7IF9pIDwgX2UtPnNpemUoKTsgX2krKykgeyBfby0+Y2hhcmFjdGVyc1tfaV0udmFsdWUgPSBDaGFyYWN0ZXJVbmlvbjo6VW5QYWNrKF9lLT5HZXQoX2kpLCBjaGFyYWN0ZXJzX3R5cGUoKS0+R2V0RW51bTxDaGFyYWN0ZXI+KF9pKSwgX3Jlc29sdmVyKTsgfSB9IGVsc2UgeyBfby0+Y2hhcmFjdGVycy5yZXNpemUoMCk7IH0gfQogfQogCiBpbmxpbmUgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxNb3ZpZT4gTW92aWU6OlBhY2soZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBNb3ZpZVQqIF9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyKSB7CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy91bmlvbl92ZWN0b3IvdW5pb25fdmVjdG9yX2dlbmVyYXRlZC50cyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3Rlc3RzL3VuaW9uX3ZlY3Rvci91bmlvbl92ZWN0b3JfZ2VuZXJhdGVkLnRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQzYjQxYzQKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy91bmlvbl92ZWN0b3IvdW5pb25fdmVjdG9yX2dlbmVyYXRlZC50cwpAQCAtMCwwICsxLDEwIEBACisvLyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBieSB0aGUgRmxhdEJ1ZmZlcnMgY29tcGlsZXIsIGRvIG5vdCBtb2RpZnkKKworZXhwb3J0IHsgQXR0YWNrZXIsIEF0dGFja2VyVCB9IGZyb20gJy4vYXR0YWNrZXInOworZXhwb3J0IHsgQm9va1JlYWRlciwgQm9va1JlYWRlclQgfSBmcm9tICcuL2Jvb2stcmVhZGVyJzsKK2V4cG9ydCB7IENoYXJhY3RlciwgdW5pb25Ub0NoYXJhY3RlciwgdW5pb25MaXN0VG9DaGFyYWN0ZXIgfSBmcm9tICcuL2NoYXJhY3Rlcic7CitleHBvcnQgeyBGYWxsaW5nVHViLCBGYWxsaW5nVHViVCB9IGZyb20gJy4vZmFsbGluZy10dWInOworZXhwb3J0IHsgR2FkZ2V0LCB1bmlvblRvR2FkZ2V0LCB1bmlvbkxpc3RUb0dhZGdldCB9IGZyb20gJy4vZ2FkZ2V0JzsKK2V4cG9ydCB7IEhhbmRGYW4sIEhhbmRGYW5UIH0gZnJvbSAnLi9oYW5kLWZhbic7CitleHBvcnQgeyBNb3ZpZSwgTW92aWVUIH0gZnJvbSAnLi9tb3ZpZSc7CitleHBvcnQgeyBSYXB1bnplbCwgUmFwdW56ZWxUIH0gZnJvbSAnLi9yYXB1bnplbCc7CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy91dGlsX3Rlc3QuY3BwIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvdXRpbF90ZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNmRiOTE2Ci0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvdXRpbF90ZXN0LmNwcApAQCAtMCwwICsxLDE2NyBAQAorI2luY2x1ZGUgInV0aWxfdGVzdC5oIgorCisjaW5jbHVkZSAiZmxhdGJ1ZmZlcnMvdXRpbC5oIgorI2luY2x1ZGUgInRlc3RfYXNzZXJ0LmgiCisKK25hbWVzcGFjZSBmbGF0YnVmZmVycyB7CituYW1lc3BhY2UgdGVzdHMgeworbmFtZXNwYWNlIHsKKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK3ZvaWQgTnVtZXJpY1V0aWxzVGVzdEludGVnZXIoY29uc3QgY2hhciAqbG93ZXIsIGNvbnN0IGNoYXIgKnVwcGVyKSB7CisgIFQgeDsKKyAgVEVTVF9FUShmbGF0YnVmZmVyczo6U3RyaW5nVG9OdW1iZXIoIjFxIiwgJngpLCBmYWxzZSk7CisgIFRFU1RfRVEoeCwgMCk7CisgIFRFU1RfRVEoZmxhdGJ1ZmZlcnM6OlN0cmluZ1RvTnVtYmVyKHVwcGVyLCAmeCksIGZhbHNlKTsKKyAgVEVTVF9FUSh4LCBmbGF0YnVmZmVyczo6bnVtZXJpY19saW1pdHM8VD46Om1heCgpKTsKKyAgVEVTVF9FUShmbGF0YnVmZmVyczo6U3RyaW5nVG9OdW1iZXIobG93ZXIsICZ4KSwgZmFsc2UpOworICBhdXRvIGV4cHZhbCA9IGZsYXRidWZmZXJzOjppc191bnNpZ25lZDxUPjo6dmFsdWUKKyAgICAgICAgICAgICAgICAgICAgPyBmbGF0YnVmZmVyczo6bnVtZXJpY19saW1pdHM8VD46Om1heCgpCisgICAgICAgICAgICAgICAgICAgIDogZmxhdGJ1ZmZlcnM6Om51bWVyaWNfbGltaXRzPFQ+Ojpsb3dlc3QoKTsKKyAgVEVTVF9FUSh4LCBleHB2YWwpOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgordm9pZCBOdW1lcmljVXRpbHNUZXN0RmxvYXQoY29uc3QgY2hhciAqbG93ZXIsIGNvbnN0IGNoYXIgKnVwcGVyKSB7CisgIFQgZjsKKyAgVEVTVF9FUShmbGF0YnVmZmVyczo6U3RyaW5nVG9OdW1iZXIoIiIsICZmKSwgZmFsc2UpOworICBURVNUX0VRKGZsYXRidWZmZXJzOjpTdHJpbmdUb051bWJlcigiMXEiLCAmZiksIGZhbHNlKTsKKyAgVEVTVF9FUShmLCAwKTsKKyAgVEVTVF9FUShmbGF0YnVmZmVyczo6U3RyaW5nVG9OdW1iZXIodXBwZXIsICZmKSwgdHJ1ZSk7CisgIFRFU1RfRVEoZiwgK2ZsYXRidWZmZXJzOjpudW1lcmljX2xpbWl0czxUPjo6aW5maW5pdHkoKSk7CisgIFRFU1RfRVEoZmxhdGJ1ZmZlcnM6OlN0cmluZ1RvTnVtYmVyKGxvd2VyLCAmZiksIHRydWUpOworICBURVNUX0VRKGYsIC1mbGF0YnVmZmVyczo6bnVtZXJpY19saW1pdHM8VD46OmluZmluaXR5KCkpOworfQorfSAgLy8gbmFtZXNwYWNlCisKK3ZvaWQgTnVtZXJpY1V0aWxzVGVzdCgpIHsKKyAgTnVtZXJpY1V0aWxzVGVzdEludGVnZXI8dWludDY0X3Q+KCItMSIsICIxODQ0Njc0NDA3MzcwOTU1MTYxNiIpOworICBOdW1lcmljVXRpbHNUZXN0SW50ZWdlcjx1aW50OF90PigiLTEiLCAiMjU2Iik7CisgIE51bWVyaWNVdGlsc1Rlc3RJbnRlZ2VyPGludDY0X3Q+KCItOTIyMzM3MjAzNjg1NDc3NTgwOSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI5MjIzMzcyMDM2ODU0Nzc1ODA4Iik7CisgIE51bWVyaWNVdGlsc1Rlc3RJbnRlZ2VyPGludDhfdD4oIi0xMjkiLCAiMTI4Iik7CisgIE51bWVyaWNVdGlsc1Rlc3RGbG9hdDxmbG9hdD4oIi0zLjQwMjllKzM4IiwgIiszLjQwMjllKzM4Iik7CisgIE51bWVyaWNVdGlsc1Rlc3RGbG9hdDxmbG9hdD4oIi0xLjc5NzdlKzMwOCIsICIrMS43OTc3ZSszMDgiKTsKK30KKwordm9pZCBJc0FzY2lpVXRpbHNUZXN0KCkgeworICBjaGFyIGMgPSAtMTI4OworICBmb3IgKGludCBjbnQgPSAwOyBjbnQgPCAyNTY7IGNudCsrKSB7CisgICAgYXV0byBhbHBoYSA9ICgoJ2EnIDw9IGMpICYmIChjIDw9ICd6JykpIHx8ICgoJ0EnIDw9IGMpICYmIChjIDw9ICdaJykpOworICAgIGF1dG8gZGVjID0gKCgnMCcgPD0gYykgJiYgKGMgPD0gJzknKSk7CisgICAgYXV0byBoZXggPSAoKCdhJyA8PSBjKSAmJiAoYyA8PSAnZicpKSB8fCAoKCdBJyA8PSBjKSAmJiAoYyA8PSAnRicpKTsKKyAgICBURVNUX0VRKGZsYXRidWZmZXJzOjppc19hbHBoYShjKSwgYWxwaGEpOworICAgIFRFU1RfRVEoZmxhdGJ1ZmZlcnM6OmlzX2FsbnVtKGMpLCBhbHBoYSB8fCBkZWMpOworICAgIFRFU1RfRVEoZmxhdGJ1ZmZlcnM6OmlzX2RpZ2l0KGMpLCBkZWMpOworICAgIFRFU1RfRVEoZmxhdGJ1ZmZlcnM6OmlzX3hkaWdpdChjKSwgZGVjIHx8IGhleCk7CisgICAgYyArPSAxOworICB9Cit9CisKK3ZvaWQgVXRpbENvbnZlcnRDYXNlKCkgeworICB7CisgICAgc3RydWN0IFRlc3RDYXNlIHsKKyAgICAgIHN0ZDo6c3RyaW5nIGlucHV0OworICAgICAgZmxhdGJ1ZmZlcnM6OkNhc2Ugb3V0cHV0X2Nhc2U7CisgICAgICBzdGQ6OnN0cmluZyBleHBlY3RlZF9vdXRwdXQ7CisgICAgfTsKKworICAgIHN0ZDo6dmVjdG9yPFRlc3RDYXNlPiBjYXNlczsKKworICAgIC8vIFRlc3RzIGZvciB0aGUgY29tbW9uIGNhc2VzCisgICAgY2FzZXMucHVzaF9iYWNrKHsgInRoZV9xdWlja19icm93bl9mb3giLCBmbGF0YnVmZmVyczo6Q2FzZTo6a1VwcGVyQ2FtZWwsCisgICAgICAgICAgICAgICAgICAgICAgIlRoZVF1aWNrQnJvd25Gb3giIH0pOworICAgIGNhc2VzLnB1c2hfYmFjayh7ICJ0aGVfcXVpY2tfYnJvd25fZm94IiwgZmxhdGJ1ZmZlcnM6OkNhc2U6OmtMb3dlckNhbWVsLAorICAgICAgICAgICAgICAgICAgICAgICJ0aGVRdWlja0Jyb3duRm94IiB9KTsKKyAgICBjYXNlcy5wdXNoX2JhY2soeyAidGhlX3F1aWNrX2Jyb3duX2ZveCIsIGZsYXRidWZmZXJzOjpDYXNlOjprU25ha2UsCisgICAgICAgICAgICAgICAgICAgICAgInRoZV9xdWlja19icm93bl9mb3giIH0pOworICAgIGNhc2VzLnB1c2hfYmFjayh7ICJ0aGVfcXVpY2tfYnJvd25fZm94IiwgZmxhdGJ1ZmZlcnM6OkNhc2U6OmtTY3JlYW1pbmdTbmFrZSwKKyAgICAgICAgICAgICAgICAgICAgICAiVEhFX1FVSUNLX0JST1dOX0ZPWCIgfSk7CisgICAgY2FzZXMucHVzaF9iYWNrKHsgInRoZV9xdWlja19icm93bl9mb3giLCBmbGF0YnVmZmVyczo6Q2FzZTo6a0FsbExvd2VyLAorICAgICAgICAgICAgICAgICAgICAgICJ0aGVfcXVpY2tfYnJvd25fZm94IiB9KTsKKyAgICBjYXNlcy5wdXNoX2JhY2soeyAidGhlX3F1aWNrX2Jyb3duX2ZveCIsIGZsYXRidWZmZXJzOjpDYXNlOjprQWxsVXBwZXIsCisgICAgICAgICAgICAgICAgICAgICAgIlRIRV9RVUlDS19CUk9XTl9GT1giIH0pOworICAgIGNhc2VzLnB1c2hfYmFjayh7ICJ0aGVfcXVpY2tfYnJvd25fZm94IiwgZmxhdGJ1ZmZlcnM6OkNhc2U6OmtVbmtub3duLAorICAgICAgICAgICAgICAgICAgICAgICJ0aGVfcXVpY2tfYnJvd25fZm94IiB9KTsKKyAgICBjYXNlcy5wdXNoX2JhY2soeyAidGhlX3F1aWNrX2Jyb3duX2ZveCIsIGZsYXRidWZmZXJzOjpDYXNlOjprS2VlcCwKKyAgICAgICAgICAgICAgICAgICAgICAidGhlX3F1aWNrX2Jyb3duX2ZveCIgfSk7CisgICAgY2FzZXMucHVzaF9iYWNrKHsgInRoZV9xdWlja19icm93bl9mb3giLCBmbGF0YnVmZmVyczo6Q2FzZTo6a1NuYWtlMiwKKyAgICAgICAgICAgICAgICAgICAgICAidGhlX3F1aWNrX2Jyb3duX2ZveCIgfSk7CisKKyAgICAvLyBUZXN0cyBmb3Igc29tZSBzbmFrZV9jYXNlcyB3aGVyZSB0aGUgXyBpcyBvZGRseSBwbGFjZWQgb3IKKyAgICAvLyBtaXNzaW5nLgorICAgIGNhc2VzLnB1c2hfYmFjayh7ICJzaW5nbGUiLCBmbGF0YnVmZmVyczo6Q2FzZTo6a1VwcGVyQ2FtZWwsICJTaW5nbGUiIH0pOworICAgIGNhc2VzLnB1c2hfYmFjayh7ICJTaW5nbGUiLCBmbGF0YnVmZmVyczo6Q2FzZTo6a1VwcGVyQ2FtZWwsICJTaW5nbGUiIH0pOworICAgIGNhc2VzLnB1c2hfYmFjayh7ICJfbGVhZGluZyIsIGZsYXRidWZmZXJzOjpDYXNlOjprVXBwZXJDYW1lbCwgIl9sZWFkaW5nIiB9KTsKKyAgICBjYXNlcy5wdXNoX2JhY2soCisgICAgICAgIHsgInRyYWlsaW5nXyIsIGZsYXRidWZmZXJzOjpDYXNlOjprVXBwZXJDYW1lbCwgIlRyYWlsaW5nXyIgfSk7CisgICAgY2FzZXMucHVzaF9iYWNrKHsgImRvdWJsZV9fdW5kZXJzY29yZSIsIGZsYXRidWZmZXJzOjpDYXNlOjprVXBwZXJDYW1lbCwKKyAgICAgICAgICAgICAgICAgICAgICAiRG91YmxlX3VuZGVyc2NvcmUiIH0pOworICAgIGNhc2VzLnB1c2hfYmFjayh7ICJzaW5nbGUiLCBmbGF0YnVmZmVyczo6Q2FzZTo6a0xvd2VyQ2FtZWwsICJzaW5nbGUiIH0pOworICAgIGNhc2VzLnB1c2hfYmFjayh7ICJTaW5nbGUiLCBmbGF0YnVmZmVyczo6Q2FzZTo6a0xvd2VyQ2FtZWwsICJTaW5nbGUiIH0pOworICAgIGNhc2VzLnB1c2hfYmFjayh7ICJfbGVhZGluZyIsIGZsYXRidWZmZXJzOjpDYXNlOjprTG93ZXJDYW1lbCwgIkxlYWRpbmciIH0pOworICAgIGNhc2VzLnB1c2hfYmFjaygKKyAgICAgICAgeyAidHJhaWxpbmdfIiwgZmxhdGJ1ZmZlcnM6OkNhc2U6OmtMb3dlckNhbWVsLCAidHJhaWxpbmdfIiB9KTsKKyAgICBjYXNlcy5wdXNoX2JhY2soeyAiZG91YmxlX191bmRlcnNjb3JlIiwgZmxhdGJ1ZmZlcnM6OkNhc2U6OmtMb3dlckNhbWVsLAorICAgICAgICAgICAgICAgICAgICAgICJkb3VibGVfdW5kZXJzY29yZSIgfSk7CisKKyAgICAvLyBUZXN0cyBmb3Igc29tZSBvdXRwdXQgc25ha2VfY2FzZXMKKyAgICBjYXNlcy5wdXNoX2JhY2soeyAic2luZ2xlIiwgZmxhdGJ1ZmZlcnM6OkNhc2U6OmtTbmFrZSwgInNpbmdsZSIgfSk7CisgICAgY2FzZXMucHVzaF9iYWNrKHsgInNpbmdsZSIsIGZsYXRidWZmZXJzOjpDYXNlOjprU2NyZWFtaW5nU25ha2UsICJTSU5HTEUiIH0pOworICAgIGNhc2VzLnB1c2hfYmFjaygKKyAgICAgICAgeyAiX2xlYWRpbmciLCBmbGF0YnVmZmVyczo6Q2FzZTo6a1NjcmVhbWluZ1NuYWtlLCAiX0xFQURJTkciIH0pOworICAgIGNhc2VzLnB1c2hfYmFjaygKKyAgICAgICAgeyAidHJhaWxpbmdfIiwgZmxhdGJ1ZmZlcnM6OkNhc2U6OmtTY3JlYW1pbmdTbmFrZSwgIlRSQUlMSU5HXyIgfSk7CisgICAgY2FzZXMucHVzaF9iYWNrKHsgImRvdWJsZV9fdW5kZXJzY29yZSIsIGZsYXRidWZmZXJzOjpDYXNlOjprU2NyZWFtaW5nU25ha2UsCisgICAgICAgICAgICAgICAgICAgICAgIkRPVUJMRV9fVU5ERVJTQ09SRSIgfSk7CisKKyAgICBmb3IgKGF1dG8gJnRlc3RfY2FzZSA6IGNhc2VzKSB7CisgICAgICBURVNUX0VRKHRlc3RfY2FzZS5leHBlY3RlZF9vdXRwdXQsCisgICAgICAgICAgICAgIGZsYXRidWZmZXJzOjpDb252ZXJ0Q2FzZSh0ZXN0X2Nhc2UuaW5wdXQsIHRlc3RfY2FzZS5vdXRwdXRfY2FzZSkpOworICAgIH0KKyAgfQorCisgIC8vIFRlc3RzIGZvciB0aGUgbm9uIHNuYWtlX2Nhc2UgaW5wdXRzLgorICB7CisgICAgc3RydWN0IFRlc3RDYXNlIHsKKyAgICAgIGZsYXRidWZmZXJzOjpDYXNlIGlucHV0X2Nhc2U7CisgICAgICBzdGQ6OnN0cmluZyBpbnB1dDsKKyAgICAgIGZsYXRidWZmZXJzOjpDYXNlIG91dHB1dF9jYXNlOworICAgICAgc3RkOjpzdHJpbmcgZXhwZWN0ZWRfb3V0cHV0OworICAgIH07CisKKyAgICBzdGQ6OnZlY3RvcjxUZXN0Q2FzZT4gY2FzZXM7CisKKyAgICBjYXNlcy5wdXNoX2JhY2soeyBmbGF0YnVmZmVyczo6Q2FzZTo6a1VwcGVyQ2FtZWwsICJUaGVRdWlja0Jyb3duRm94IiwKKyAgICAgICAgICAgICAgICAgICAgICBmbGF0YnVmZmVyczo6Q2FzZTo6a1NuYWtlLCAidGhlX3F1aWNrX2Jyb3duX2ZveCIgfSk7CisgICAgY2FzZXMucHVzaF9iYWNrKHsgZmxhdGJ1ZmZlcnM6OkNhc2U6OmtMb3dlckNhbWVsLCAidGhlUXVpY2tCcm93bkZveCIsCisgICAgICAgICAgICAgICAgICAgICAgZmxhdGJ1ZmZlcnM6OkNhc2U6OmtTbmFrZSwgInRoZV9xdWlja19icm93bl9mb3giIH0pOworICAgIGNhc2VzLnB1c2hfYmFjayh7IGZsYXRidWZmZXJzOjpDYXNlOjprU25ha2UsICJ0aGVfcXVpY2tfYnJvd25fZm94IiwKKyAgICAgICAgICAgICAgICAgICAgICBmbGF0YnVmZmVyczo6Q2FzZTo6a1NuYWtlLCAidGhlX3F1aWNrX2Jyb3duX2ZveCIgfSk7CisgICAgY2FzZXMucHVzaF9iYWNrKHsgZmxhdGJ1ZmZlcnM6OkNhc2U6OmtTY3JlYW1pbmdTbmFrZSwgIlRIRV9RVUlDS19CUk9XTl9GT1giLAorICAgICAgICAgICAgICAgICAgICAgIGZsYXRidWZmZXJzOjpDYXNlOjprU25ha2UsICJUSEVfUVVJQ0tfQlJPV05fRk9YIiB9KTsKKyAgICBjYXNlcy5wdXNoX2JhY2soeyBmbGF0YnVmZmVyczo6Q2FzZTo6a0FsbFVwcGVyLCAiU0lOR0xFIiwKKyAgICAgICAgICAgICAgICAgICAgICBmbGF0YnVmZmVyczo6Q2FzZTo6a1NuYWtlLCAiU0lOR0xFIiB9KTsKKyAgICBjYXNlcy5wdXNoX2JhY2soeyBmbGF0YnVmZmVyczo6Q2FzZTo6a0FsbExvd2VyLCAic2luZ2xlIiwKKyAgICAgICAgICAgICAgICAgICAgICBmbGF0YnVmZmVyczo6Q2FzZTo6a1NuYWtlLCAic2luZ2xlIiB9KTsKKyAgICBjYXNlcy5wdXNoX2JhY2soeyBmbGF0YnVmZmVyczo6Q2FzZTo6a1VwcGVyQ2FtZWwsICJBQkN0ZXN0IiwKKyAgICAgICAgICAgICAgICAgICAgICBmbGF0YnVmZmVyczo6Q2FzZTo6a1NuYWtlLCAiYWJjdGVzdCIgfSk7CisgICAgY2FzZXMucHVzaF9iYWNrKHsgZmxhdGJ1ZmZlcnM6OkNhc2U6OmtVcHBlckNhbWVsLCAidEhlX3FVaUNrX0JyT3dOX2ZPeCIsCisgICAgICAgICAgICAgICAgICAgICAgZmxhdGJ1ZmZlcnM6OkNhc2U6OmtLZWVwLCAidEhlX3FVaUNrX0JyT3dOX2ZPeCIgfSk7CisgICAgY2FzZXMucHVzaF9iYWNrKHsgZmxhdGJ1ZmZlcnM6OkNhc2U6OmtMb3dlckNhbWVsLCAidGhlUXVpY2sxMjM0NUZveCIsCisgICAgICAgICAgICAgICAgICAgICAgZmxhdGJ1ZmZlcnM6OkNhc2U6OmtTbmFrZSwgInRoZV9xdWlja18xMjM0NWZveCIgfSk7CisgICAgY2FzZXMucHVzaF9iYWNrKHsgZmxhdGJ1ZmZlcnM6OkNhc2U6OmtMb3dlckNhbWVsLCAiYTEyYjM0YzQ1IiwKKyAgICAgICAgICAgICAgICAgICAgICBmbGF0YnVmZmVyczo6Q2FzZTo6a1NuYWtlLCAiYV8xMmJfMzRjXzQ1IiB9KTsKKyAgICBjYXNlcy5wdXNoX2JhY2soeyBmbGF0YnVmZmVyczo6Q2FzZTo6a0xvd2VyQ2FtZWwsICJhMTJiMzRjNDUiLAorICAgICAgICAgICAgICAgICAgICAgIGZsYXRidWZmZXJzOjpDYXNlOjprU25ha2UyLCAiYTEyX2IzNF9jNDUiIH0pOworCisgICAgZm9yIChhdXRvICZ0ZXN0X2Nhc2UgOiBjYXNlcykgeworICAgICAgVEVTVF9FUSh0ZXN0X2Nhc2UuZXhwZWN0ZWRfb3V0cHV0LAorICAgICAgICAgICAgICBmbGF0YnVmZmVyczo6Q29udmVydENhc2UodGVzdF9jYXNlLmlucHV0LCB0ZXN0X2Nhc2Uub3V0cHV0X2Nhc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXN0X2Nhc2UuaW5wdXRfY2FzZSkpOworICAgIH0KKyAgfQorfQorCit9ICAvLyBuYW1lc3BhY2UgdGVzdHMKK30gIC8vIG5hbWVzcGFjZSBmbGF0YnVmZmVycwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvdXRpbF90ZXN0LmggYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy91dGlsX3Rlc3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZjJhMjU3Ci0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvdXRpbF90ZXN0LmgKQEAgLTAsMCArMSwxNSBAQAorI2lmbmRlZiBURVNUU19VVElMX1RFU1RfSAorI2RlZmluZSBURVNUU19VVElMX1RFU1RfSAorCituYW1lc3BhY2UgZmxhdGJ1ZmZlcnMgeworbmFtZXNwYWNlIHRlc3RzIHsKKwordm9pZCBOdW1lcmljVXRpbHNUZXN0KCk7Cit2b2lkIElzQXNjaWlVdGlsc1Rlc3QoKTsKK3ZvaWQgVXRpbENvbnZlcnRDYXNlKCk7CisKKworfSAgLy8gbmFtZXNwYWNlIHRlc3RzCit9ICAvLyBuYW1lc3BhY2UgZmxhdGJ1ZmZlcnMKKworI2VuZGlmCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90ZXN0cy92ZWN0b3JfaGFzX3Rlc3QuZmJzIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvdmVjdG9yX2hhc190ZXN0LmZicwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYmM3MjcxCi0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdGVzdHMvdmVjdG9yX2hhc190ZXN0LmZicwpAQCAtMCwwICsxLDEwIEBACituYW1lc3BhY2UgU3dpZnQuVGVzdHM7CisKK3RhYmxlIFZlY3RvcnMKK3sKKyAgbm9uZTpbdWxvbmddOworICBlbXB0eTpbdWxvbmddOworICBhcnJheTpbdWxvbmddOworfQorCityb290X3R5cGUgVmVjdG9yczsKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3RzL2J1aWxkZXIudHMgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90cy9idWlsZGVyLnRzCmluZGV4IDM0NGE2MjkuLjg1ZjU3MjYgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3RzL2J1aWxkZXIudHMKKysrIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdHMvYnVpbGRlci50cwpAQCAtMjQsNiArMjQsNyBAQAogICAgIHByaXZhdGUgZm9yY2VfZGVmYXVsdHMgPSBmYWxzZTsKICAgICAKICAgICBwcml2YXRlIHN0cmluZ19tYXBzOiBNYXA8c3RyaW5nIHwgVWludDhBcnJheSwgbnVtYmVyPiB8IG51bGwgPSBudWxsOworICAgIHByaXZhdGUgdGV4dF9lbmNvZGVyID0gbmV3IFRleHRFbmNvZGVyKCk7CiAgIAogICAgIC8qKgogICAgICAqIENyZWF0ZSBhIEZsYXRCdWZmZXJCdWlsZGVyLgpAQCAtMTQ5LDcgKzE1MCw3IEBACiAgIAogICAgIC8qKgogICAgICAqIEFkZCBhbiBgaW50OGAgdG8gdGhlIGJ1ZmZlciwgcHJvcGVybHkgYWxpZ25lZCwgYW5kIGdyb3dzIHRoZSBidWZmZXIgKGlmIG5lY2Vzc2FyeSkuCi0gICAgICogQHBhcmFtIHZhbHVlIFRoZSBgaW50OGAgdG8gYWRkIHRoZSB0aGUgYnVmZmVyLgorICAgICAqIEBwYXJhbSB2YWx1ZSBUaGUgYGludDhgIHRvIGFkZCB0aGUgYnVmZmVyLgogICAgICAqLwogICAgIGFkZEludDgodmFsdWU6IG51bWJlcik6IHZvaWQgewogICAgICAgdGhpcy5wcmVwKDEsIDApOwpAQCAtMTU4LDcgKzE1OSw3IEBACiAgIAogICAgIC8qKgogICAgICAqIEFkZCBhbiBgaW50MTZgIHRvIHRoZSBidWZmZXIsIHByb3Blcmx5IGFsaWduZWQsIGFuZCBncm93cyB0aGUgYnVmZmVyIChpZiBuZWNlc3NhcnkpLgotICAgICAqIEBwYXJhbSB2YWx1ZSBUaGUgYGludDE2YCB0byBhZGQgdGhlIHRoZSBidWZmZXIuCisgICAgICogQHBhcmFtIHZhbHVlIFRoZSBgaW50MTZgIHRvIGFkZCB0aGUgYnVmZmVyLgogICAgICAqLwogICAgIGFkZEludDE2KHZhbHVlOiBudW1iZXIpOiB2b2lkIHsKICAgICAgIHRoaXMucHJlcCgyLCAwKTsKQEAgLTE2Nyw3ICsxNjgsNyBAQAogICAKICAgICAvKioKICAgICAgKiBBZGQgYW4gYGludDMyYCB0byB0aGUgYnVmZmVyLCBwcm9wZXJseSBhbGlnbmVkLCBhbmQgZ3Jvd3MgdGhlIGJ1ZmZlciAoaWYgbmVjZXNzYXJ5KS4KLSAgICAgKiBAcGFyYW0gdmFsdWUgVGhlIGBpbnQzMmAgdG8gYWRkIHRoZSB0aGUgYnVmZmVyLgorICAgICAqIEBwYXJhbSB2YWx1ZSBUaGUgYGludDMyYCB0byBhZGQgdGhlIGJ1ZmZlci4KICAgICAgKi8KICAgICBhZGRJbnQzMih2YWx1ZTogbnVtYmVyKTogdm9pZCB7CiAgICAgICB0aGlzLnByZXAoNCwgMCk7CkBAIC0xNzYsNyArMTc3LDcgQEAKICAgCiAgICAgLyoqCiAgICAgICogQWRkIGFuIGBpbnQ2NGAgdG8gdGhlIGJ1ZmZlciwgcHJvcGVybHkgYWxpZ25lZCwgYW5kIGdyb3dzIHRoZSBidWZmZXIgKGlmIG5lY2Vzc2FyeSkuCi0gICAgICogQHBhcmFtIHZhbHVlIFRoZSBgaW50NjRgIHRvIGFkZCB0aGUgdGhlIGJ1ZmZlci4KKyAgICAgKiBAcGFyYW0gdmFsdWUgVGhlIGBpbnQ2NGAgdG8gYWRkIHRoZSBidWZmZXIuCiAgICAgICovCiAgICAgYWRkSW50NjQodmFsdWU6IGJpZ2ludCk6IHZvaWQgewogICAgICAgdGhpcy5wcmVwKDgsIDApOwpAQCAtMTg1LDcgKzE4Niw3IEBACiAgIAogICAgIC8qKgogICAgICAqIEFkZCBhIGBmbG9hdDMyYCB0byB0aGUgYnVmZmVyLCBwcm9wZXJseSBhbGlnbmVkLCBhbmQgZ3Jvd3MgdGhlIGJ1ZmZlciAoaWYgbmVjZXNzYXJ5KS4KLSAgICAgKiBAcGFyYW0gdmFsdWUgVGhlIGBmbG9hdDMyYCB0byBhZGQgdGhlIHRoZSBidWZmZXIuCisgICAgICogQHBhcmFtIHZhbHVlIFRoZSBgZmxvYXQzMmAgdG8gYWRkIHRoZSBidWZmZXIuCiAgICAgICovCiAgICAgYWRkRmxvYXQzMih2YWx1ZTogbnVtYmVyKTogdm9pZCB7CiAgICAgICB0aGlzLnByZXAoNCwgMCk7CkBAIC0xOTQsNyArMTk1LDcgQEAKICAgCiAgICAgLyoqCiAgICAgICogQWRkIGEgYGZsb2F0NjRgIHRvIHRoZSBidWZmZXIsIHByb3Blcmx5IGFsaWduZWQsIGFuZCBncm93cyB0aGUgYnVmZmVyIChpZiBuZWNlc3NhcnkpLgotICAgICAqIEBwYXJhbSB2YWx1ZSBUaGUgYGZsb2F0NjRgIHRvIGFkZCB0aGUgdGhlIGJ1ZmZlci4KKyAgICAgKiBAcGFyYW0gdmFsdWUgVGhlIGBmbG9hdDY0YCB0byBhZGQgdGhlIGJ1ZmZlci4KICAgICAgKi8KICAgICBhZGRGbG9hdDY0KHZhbHVlOiBudW1iZXIpOiB2b2lkIHsKICAgICAgIHRoaXMucHJlcCg4LCAwKTsKQEAgLTUzMSw0MCArNTMyLDcgQEAKICAgICAgIGlmIChzIGluc3RhbmNlb2YgVWludDhBcnJheSkgewogICAgICAgICB1dGY4ID0gczsKICAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHV0ZjggPSBbXTsKLSAgICAgICAgbGV0IGkgPSAwOwotICAKLSAgICAgICAgd2hpbGUgKGkgPCBzLmxlbmd0aCkgewotICAgICAgICAgIGxldCBjb2RlUG9pbnQ7Ci0gIAotICAgICAgICAgIC8vIERlY29kZSBVVEYtMTYKLSAgICAgICAgICBjb25zdCBhID0gcy5jaGFyQ29kZUF0KGkrKyk7Ci0gICAgICAgICAgaWYgKGEgPCAweEQ4MDAgfHwgYSA+PSAweERDMDApIHsKLSAgICAgICAgICAgIGNvZGVQb2ludCA9IGE7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGNvbnN0IGIgPSBzLmNoYXJDb2RlQXQoaSsrKTsKLSAgICAgICAgICAgIGNvZGVQb2ludCA9IChhIDw8IDEwKSArIGIgKyAoMHgxMDAwMCAtICgweEQ4MDAgPDwgMTApIC0gMHhEQzAwKTsKLSAgICAgICAgICB9Ci0gIAotICAgICAgICAgIC8vIEVuY29kZSBVVEYtOAotICAgICAgICAgIGlmIChjb2RlUG9pbnQgPCAweDgwKSB7Ci0gICAgICAgICAgICB1dGY4LnB1c2goY29kZVBvaW50KTsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYgKGNvZGVQb2ludCA8IDB4ODAwKSB7Ci0gICAgICAgICAgICAgIHV0ZjgucHVzaCgoKGNvZGVQb2ludCA+PiA2KSAmIDB4MUYpIHwgMHhDMCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICBpZiAoY29kZVBvaW50IDwgMHgxMDAwMCkgewotICAgICAgICAgICAgICAgIHV0ZjgucHVzaCgoKGNvZGVQb2ludCA+PiAxMikgJiAweDBGKSB8IDB4RTApOwotICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHV0ZjgucHVzaCgKLSAgICAgICAgICAgICAgICAgICgoY29kZVBvaW50ID4+IDE4KSAmIDB4MDcpIHwgMHhGMCwKLSAgICAgICAgICAgICAgICAgICgoY29kZVBvaW50ID4+IDEyKSAmIDB4M0YpIHwgMHg4MCk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgdXRmOC5wdXNoKCgoY29kZVBvaW50ID4+IDYpICYgMHgzRikgfCAweDgwKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHV0ZjgucHVzaCgoY29kZVBvaW50ICYgMHgzRikgfCAweDgwKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KKyAgICAgICAgdXRmOCA9IHRoaXMudGV4dF9lbmNvZGVyLmVuY29kZShzKTsKICAgICAgIH0KICAgCiAgICAgICB0aGlzLmFkZEludDgoMCk7CkBAIC02MTcsNyArNTg1LDcgQEAKICAgCiAgICAgY3JlYXRlU3RydWN0T2Zmc2V0TGlzdChsaXN0OiBzdHJpbmdbXSB8IGFueVtdLCBzdGFydEZ1bmM6IChidWlsZGVyOiBCdWlsZGVyLCBsZW5ndGg6IG51bWJlcikgPT4gdm9pZCk6IE9mZnNldCB7CiAgICAgICBzdGFydEZ1bmModGhpcywgbGlzdC5sZW5ndGgpOwotICAgICAgdGhpcy5jcmVhdGVPYmplY3RPZmZzZXRMaXN0KGxpc3QpOworICAgICAgdGhpcy5jcmVhdGVPYmplY3RPZmZzZXRMaXN0KGxpc3Quc2xpY2UoKS5yZXZlcnNlKCkpOwogICAgICAgcmV0dXJuIHRoaXMuZW5kVmVjdG9yKCk7CiAgICAgfQogICB9CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90cy9ieXRlLWJ1ZmZlci50cyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3RzL2J5dGUtYnVmZmVyLnRzCmluZGV4IGJiNzdmM2IuLjA5YzU1YWQgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3RzL2J5dGUtYnVmZmVyLnRzCisrKyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3RzL2J5dGUtYnVmZmVyLnRzCkBAIC01LDYgKzUsNyBAQAogCiBleHBvcnQgY2xhc3MgQnl0ZUJ1ZmZlciB7CiAgICAgcHJpdmF0ZSBwb3NpdGlvbl8gPSAwOworICAgIHByaXZhdGUgdGV4dF9kZWNvZGVyXyA9IG5ldyBUZXh0RGVjb2RlcigpOwogICAKICAgICAvKioKICAgICAgKiBDcmVhdGUgYSBuZXcgQnl0ZUJ1ZmZlciB3aXRoIGEgZ2l2ZW4gYXJyYXkgb2YgYnl0ZXMgKGBVaW50OEFycmF5YCkKQEAgLTE4Nyw3MCArMTg4LDIyIEBACiAgICAgICogQ3JlYXRlIGEgSmF2YVNjcmlwdCBzdHJpbmcgZnJvbSBVVEYtOCBkYXRhIHN0b3JlZCBpbnNpZGUgdGhlIEZsYXRCdWZmZXIuCiAgICAgICogVGhpcyBhbGxvY2F0ZXMgYSBuZXcgc3RyaW5nIGFuZCBjb252ZXJ0cyB0byB3aWRlIGNoYXJzIHVwb24gZWFjaCBhY2Nlc3MuCiAgICAgICoKLSAgICAgKiBUbyBhdm9pZCB0aGUgY29udmVyc2lvbiB0byBVVEYtMTYsIHBhc3MgRW5jb2RpbmcuVVRGOF9CWVRFUyBhcwotICAgICAqIHRoZSAib3B0aW9uYWxFbmNvZGluZyIgYXJndW1lbnQuIFRoaXMgaXMgdXNlZnVsIGZvciBhdm9pZGluZyBjb252ZXJzaW9uIHRvCi0gICAgICogYW5kIGZyb20gVVRGLTE2IHdoZW4gdGhlIGRhdGEgd2lsbCBqdXN0IGJlIHBhY2thZ2VkIGJhY2sgdXAgaW4gYW5vdGhlcgotICAgICAqIEZsYXRCdWZmZXIgbGF0ZXIgb24uCisgICAgICogVG8gYXZvaWQgdGhlIGNvbnZlcnNpb24gdG8gc3RyaW5nLCBwYXNzIEVuY29kaW5nLlVURjhfQllURVMgYXMgdGhlCisgICAgICogIm9wdGlvbmFsRW5jb2RpbmciIGFyZ3VtZW50LiBUaGlzIGlzIHVzZWZ1bCBmb3IgYXZvaWRpbmcgY29udmVyc2lvbiB3aGVuCisgICAgICogdGhlIGRhdGEgd2lsbCBqdXN0IGJlIHBhY2thZ2VkIGJhY2sgdXAgaW4gYW5vdGhlciBGbGF0QnVmZmVyIGxhdGVyIG9uLgogICAgICAqCiAgICAgICogQHBhcmFtIG9mZnNldAogICAgICAqIEBwYXJhbSBvcHRfZW5jb2RpbmcgRGVmYXVsdHMgdG8gVVRGMTZfU1RSSU5HCiAgICAgICovCiAgICAgX19zdHJpbmcob2Zmc2V0OiBudW1iZXIsIG9wdF9lbmNvZGluZz86IEVuY29kaW5nKTogc3RyaW5nIHwgVWludDhBcnJheSB7CiAgICAgICBvZmZzZXQgKz0gdGhpcy5yZWFkSW50MzIob2Zmc2V0KTsKLSAgCiAgICAgICBjb25zdCBsZW5ndGggPSB0aGlzLnJlYWRJbnQzMihvZmZzZXQpOwotICAgICAgbGV0IHJlc3VsdCA9ICcnOwotICAgICAgbGV0IGkgPSAwOwotICAKICAgICAgIG9mZnNldCArPSBTSVpFT0ZfSU5UOwotICAKLSAgICAgIGlmIChvcHRfZW5jb2RpbmcgPT09IEVuY29kaW5nLlVURjhfQllURVMpIHsKLSAgICAgICAgcmV0dXJuIHRoaXMuYnl0ZXNfLnN1YmFycmF5KG9mZnNldCwgb2Zmc2V0ICsgbGVuZ3RoKTsKLSAgICAgIH0KLSAgCi0gICAgICB3aGlsZSAoaSA8IGxlbmd0aCkgewotICAgICAgICBsZXQgY29kZVBvaW50OwotICAKLSAgICAgICAgLy8gRGVjb2RlIFVURi04Ci0gICAgICAgIGNvbnN0IGEgPSB0aGlzLnJlYWRVaW50OChvZmZzZXQgKyBpKyspOwotICAgICAgICBpZiAoYSA8IDB4QzApIHsKLSAgICAgICAgICBjb2RlUG9pbnQgPSBhOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGNvbnN0IGIgPSB0aGlzLnJlYWRVaW50OChvZmZzZXQgKyBpKyspOwotICAgICAgICAgIGlmIChhIDwgMHhFMCkgewotICAgICAgICAgICAgY29kZVBvaW50ID0KLSAgICAgICAgICAgICAgKChhICYgMHgxRikgPDwgNikgfAotICAgICAgICAgICAgICAoYiAmIDB4M0YpOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBjb25zdCBjID0gdGhpcy5yZWFkVWludDgob2Zmc2V0ICsgaSsrKTsKLSAgICAgICAgICAgIGlmIChhIDwgMHhGMCkgewotICAgICAgICAgICAgICBjb2RlUG9pbnQgPQotICAgICAgICAgICAgICAgICgoYSAmIDB4MEYpIDw8IDEyKSB8Ci0gICAgICAgICAgICAgICAgKChiICYgMHgzRikgPDwgNikgfAotICAgICAgICAgICAgICAgIChjICYgMHgzRik7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICBjb25zdCBkID0gdGhpcy5yZWFkVWludDgob2Zmc2V0ICsgaSsrKTsKLSAgICAgICAgICAgICAgY29kZVBvaW50ID0KLSAgICAgICAgICAgICAgICAoKGEgJiAweDA3KSA8PCAxOCkgfAotICAgICAgICAgICAgICAgICgoYiAmIDB4M0YpIDw8IDEyKSB8Ci0gICAgICAgICAgICAgICAgKChjICYgMHgzRikgPDwgNikgfAotICAgICAgICAgICAgICAgIChkICYgMHgzRik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gIAotICAgICAgICAvLyBFbmNvZGUgVVRGLTE2Ci0gICAgICAgIGlmIChjb2RlUG9pbnQgPCAweDEwMDAwKSB7Ci0gICAgICAgICAgcmVzdWx0ICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoY29kZVBvaW50KTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBjb2RlUG9pbnQgLT0gMHgxMDAwMDsKLSAgICAgICAgICByZXN1bHQgKz0gU3RyaW5nLmZyb21DaGFyQ29kZSgKLSAgICAgICAgICAgIChjb2RlUG9pbnQgPj4gMTApICsgMHhEODAwLAotICAgICAgICAgICAgKGNvZGVQb2ludCAmICgoMSA8PCAxMCkgLSAxKSkgKyAweERDMDApOwotICAgICAgICB9Ci0gICAgICB9Ci0gIAotICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgIGNvbnN0IHV0ZjhieXRlcyA9IHRoaXMuYnl0ZXNfLnN1YmFycmF5KG9mZnNldCwgb2Zmc2V0ICsgbGVuZ3RoKTsKKyAgICAgIGlmIChvcHRfZW5jb2RpbmcgPT09IEVuY29kaW5nLlVURjhfQllURVMpCisgICAgICAgIHJldHVybiB1dGY4Ynl0ZXM7CisgICAgICBlbHNlCisgICAgICAgIHJldHVybiB0aGlzLnRleHRfZGVjb2Rlcl8uZGVjb2RlKHV0ZjhieXRlcyk7CiAgICAgfQogICAKICAgICAvKioKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3RzL2ZsZXhidWZmZXJzL3JlZmVyZW5jZS11dGlsLnRzIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdHMvZmxleGJ1ZmZlcnMvcmVmZXJlbmNlLXV0aWwudHMKaW5kZXggYzU1YTk0MS4uNTJmYjYwMCAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdHMvZmxleGJ1ZmZlcnMvcmVmZXJlbmNlLXV0aWwudHMKKysrIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdHMvZmxleGJ1ZmZlcnMvcmVmZXJlbmNlLXV0aWwudHMKQEAgLTY1LDggKzY1LDggQEAKICAgY29uc3QgaW5wdXQgPSB0b1VURjhBcnJheShrZXkpOwogICBjb25zdCBrZXlzVmVjdG9yT2Zmc2V0ID0gaW5kaXJlY3QoZGF0YVZpZXcsIG9mZnNldCwgcGFyZW50V2lkdGgpIC0gYnl0ZVdpZHRoICogMzsKICAgY29uc3QgYml0V2lkdGggPSBmcm9tQnl0ZVdpZHRoKGJ5dGVXaWR0aCk7Ci0gIGNvbnN0IGluZGlyZWN0T2Zmc2V0ID0ga2V5c1ZlY3Rvck9mZnNldCAtIChyZWFkVUludChkYXRhVmlldywga2V5c1ZlY3Rvck9mZnNldCwgYml0V2lkdGgpIGFzIG51bWJlcik7Ci0gIGNvbnN0IF9ieXRlV2lkdGggPSByZWFkVUludChkYXRhVmlldywga2V5c1ZlY3Rvck9mZnNldCArIGJ5dGVXaWR0aCwgYml0V2lkdGgpIGFzIG51bWJlcjsKKyAgY29uc3QgaW5kaXJlY3RPZmZzZXQgPSBrZXlzVmVjdG9yT2Zmc2V0IC0gTnVtYmVyKHJlYWRVSW50KGRhdGFWaWV3LCBrZXlzVmVjdG9yT2Zmc2V0LCBiaXRXaWR0aCkpOworICBjb25zdCBfYnl0ZVdpZHRoID0gTnVtYmVyKHJlYWRVSW50KGRhdGFWaWV3LCBrZXlzVmVjdG9yT2Zmc2V0ICsgYnl0ZVdpZHRoLCBiaXRXaWR0aCkpOwogICBsZXQgbG93ID0gMDsKICAgbGV0IGhpZ2ggPSBsZW5ndGggLSAxOwogICB3aGlsZSAobG93IDw9IGhpZ2gpIHsKQEAgLTg0LDcgKzg0LDcgQEAKIAogZXhwb3J0IGZ1bmN0aW9uIGRpZmZLZXlzKGlucHV0OiBVaW50OEFycmF5LCBpbmRleDogbnVtYmVyLCBkYXRhVmlldzogRGF0YVZpZXcsIG9mZnNldDogbnVtYmVyLCB3aWR0aDogbnVtYmVyKTogbnVtYmVyIHsKICAgY29uc3Qga2V5T2Zmc2V0ID0gb2Zmc2V0ICsgaW5kZXggKiB3aWR0aDsKLSAgY29uc3Qga2V5SW5kaXJlY3RPZmZzZXQgPSBrZXlPZmZzZXQgLSAocmVhZFVJbnQoZGF0YVZpZXcsIGtleU9mZnNldCwgZnJvbUJ5dGVXaWR0aCh3aWR0aCkpIGFzIG51bWJlcik7CisgIGNvbnN0IGtleUluZGlyZWN0T2Zmc2V0ID0ga2V5T2Zmc2V0IC0gTnVtYmVyKHJlYWRVSW50KGRhdGFWaWV3LCBrZXlPZmZzZXQsIGZyb21CeXRlV2lkdGgod2lkdGgpKSk7CiAgIGZvciAobGV0IGkgPSAwOyBpIDwgaW5wdXQubGVuZ3RoOyBpKyspIHsKICAgICBjb25zdCBkaWYgPSBpbnB1dFtpXSAtIGRhdGFWaWV3LmdldFVpbnQ4KGtleUluZGlyZWN0T2Zmc2V0ICsgaSk7CiAgICAgaWYgKGRpZiAhPT0gMCkgewpAQCAtOTcsMTAgKzk3LDEwIEBACiBleHBvcnQgZnVuY3Rpb24ga2V5Rm9ySW5kZXgoaW5kZXg6IG51bWJlciwgZGF0YVZpZXc6IERhdGFWaWV3LCBvZmZzZXQ6IG51bWJlciwgcGFyZW50V2lkdGg6IG51bWJlciwgYnl0ZVdpZHRoOiBudW1iZXIpOiBzdHJpbmcgewogICBjb25zdCBrZXlzVmVjdG9yT2Zmc2V0ID0gaW5kaXJlY3QoZGF0YVZpZXcsIG9mZnNldCwgcGFyZW50V2lkdGgpIC0gYnl0ZVdpZHRoICogMzsKICAgY29uc3QgYml0V2lkdGggPSBmcm9tQnl0ZVdpZHRoKGJ5dGVXaWR0aCk7Ci0gIGNvbnN0IGluZGlyZWN0T2Zmc2V0ID0ga2V5c1ZlY3Rvck9mZnNldCAtIChyZWFkVUludChkYXRhVmlldywga2V5c1ZlY3Rvck9mZnNldCwgYml0V2lkdGgpIGFzIG51bWJlcik7Ci0gIGNvbnN0IF9ieXRlV2lkdGggPSByZWFkVUludChkYXRhVmlldywga2V5c1ZlY3Rvck9mZnNldCArIGJ5dGVXaWR0aCwgYml0V2lkdGgpIGFzIG51bWJlcjsKKyAgY29uc3QgaW5kaXJlY3RPZmZzZXQgPSBrZXlzVmVjdG9yT2Zmc2V0IC0gTnVtYmVyKHJlYWRVSW50KGRhdGFWaWV3LCBrZXlzVmVjdG9yT2Zmc2V0LCBiaXRXaWR0aCkpOworICBjb25zdCBfYnl0ZVdpZHRoID0gTnVtYmVyKHJlYWRVSW50KGRhdGFWaWV3LCBrZXlzVmVjdG9yT2Zmc2V0ICsgYnl0ZVdpZHRoLCBiaXRXaWR0aCkpOwogICBjb25zdCBrZXlPZmZzZXQgPSBpbmRpcmVjdE9mZnNldCArIGluZGV4ICogX2J5dGVXaWR0aDsKLSAgY29uc3Qga2V5SW5kaXJlY3RPZmZzZXQgPSBrZXlPZmZzZXQgLSAocmVhZFVJbnQoZGF0YVZpZXcsIGtleU9mZnNldCwgZnJvbUJ5dGVXaWR0aChfYnl0ZVdpZHRoKSkgYXMgbnVtYmVyKTsKKyAgY29uc3Qga2V5SW5kaXJlY3RPZmZzZXQgPSBrZXlPZmZzZXQgLSBOdW1iZXIocmVhZFVJbnQoZGF0YVZpZXcsIGtleU9mZnNldCwgZnJvbUJ5dGVXaWR0aChfYnl0ZVdpZHRoKSkpOwogICBsZXQgbGVuZ3RoID0gMDsKICAgd2hpbGUgKGRhdGFWaWV3LmdldFVpbnQ4KGtleUluZGlyZWN0T2Zmc2V0ICsgbGVuZ3RoKSAhPT0gMCkgewogICAgIGxlbmd0aCsrOwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdHMvZmxleGJ1ZmZlcnMvcmVmZXJlbmNlLnRzIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdHMvZmxleGJ1ZmZlcnMvcmVmZXJlbmNlLnRzCmluZGV4IDBlZmY2ZjQuLjM4YzJmMGEgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3RzL2ZsZXhidWZmZXJzL3JlZmVyZW5jZS50cworKysgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90cy9mbGV4YnVmZmVycy9yZWZlcmVuY2UudHMKQEAgLTE1Nyw3ICsxNTcsNyBAQAogICAgIH0gZWxzZSB7CiAgICAgICB0aGlzLl9sZW5ndGggPSAxOwogICAgIH0KLSAgICByZXR1cm4gdGhpcy5fbGVuZ3RoOworICAgIHJldHVybiBOdW1iZXIodGhpcy5fbGVuZ3RoKTsKICAgfQogCiAgIHRvT2JqZWN0KCk6IHVua25vd24gewpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdHlwZXNjcmlwdC5iemwgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy90eXBlc2NyaXB0LmJ6bApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOWMxZTA0Ci0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvdHlwZXNjcmlwdC5iemwKQEAgLTAsMCArMSwxMjcgQEAKKyIiIgorUnVsZXMgZm9yIGJ1aWxkaW5nIHR5cGVzY3JpcHQgZmxhdGJ1ZmZlcnMgd2l0aCBCYXplbC4KKyIiIgorCitsb2FkKCJAYnVpbGRfYmF6ZWxfcnVsZXNfbm9kZWpzLy86aW5kZXguYnpsIiwgImpzX2xpYnJhcnkiKQorbG9hZCgiQG5wbS8vQGJhemVsL3R5cGVzY3JpcHQ6aW5kZXguYnpsIiwgInRzX3Byb2plY3QiKQorbG9hZCgiOmJ1aWxkX2RlZnMuYnpsIiwgIkRFRkFVTFRfSU5DTFVERV9QQVRIUyIsICJmbGF0YnVmZmVyX2xpYnJhcnlfcHVibGljIikKKworREVGQVVMVF9GTEFUQ19UU19BUkdTID0gWworICAgICItLWdlbi1vYmplY3QtYXBpIiwKKyAgICAiLS1nZW4tbXV0YWJsZSIsCisgICAgIi0tcmVmbGVjdC1uYW1lcyIsCisgICAgIi0tZ2VuLW5hbWUtc3RyaW5ncyIsCisgICAgIi0tdHMtZmxhdC1maWxlcyIsCisgICAgIi0ta2VlcC1wcmVmaXgiLAorXQorCitkZWYgZmxhdGJ1ZmZlcl90c19saWJyYXJ5KAorICAgICAgICBuYW1lLAorICAgICAgICBzcmNzLAorICAgICAgICBjb21wYXRpYmxlX3dpdGggPSBOb25lLAorICAgICAgICB0YXJnZXRfY29tcGF0aWJsZV93aXRoID0gTm9uZSwKKyAgICAgICAgZGVwcyA9IFtdLAorICAgICAgICBpbmNsdWRlX3BhdGhzID0gREVGQVVMVF9JTkNMVURFX1BBVEhTLAorICAgICAgICBmbGF0Y19hcmdzID0gREVGQVVMVF9GTEFUQ19UU19BUkdTLAorICAgICAgICB2aXNpYmlsaXR5ID0gTm9uZSwKKyAgICAgICAgcmVzdHJpY3RlZF90byA9IE5vbmUsCisgICAgICAgIGluY2x1ZGVfcmVmbGVjdGlvbiA9IFRydWUsCisgICAgICAgIHBhY2thZ2VfbmFtZSA9IE5vbmUpOgorICAgICIiIkdlbmVyYXRlcyBhIHRzX2xpYnJhcnkgcnVsZSBmb3IgYSBnaXZlbiBmbGF0YnVmZmVyIGRlZmluaXRpb24uCisKKyAgICBBcmdzOgorICAgICAgbmFtZTogTmFtZSBvZiB0aGUgZ2VuZXJhdGVkIHRzX2xpYnJhcnkgcnVsZS4KKyAgICAgIHNyY3M6IFNvdXJjZSAuZmJzIGZpbGUocykuCisgICAgICBkZXBzOiBPdGhlciBmbGF0YnVmZmVyX3RzX2xpYnJhcnkncyB0byBkZXBlbmQgb24uIE5vdGUgdGhhdCBjdXJyZW50bHkKKyAgICAgICAgICAgIHlvdSBtdXN0IHNwZWNpZnkgYWxsIHlvdXIgdHJhbnNpdGl2ZSBkZXBlbmRlbmNpZXMgbWFudWFsbHkuCisgICAgICBpbmNsdWRlX3BhdGhzOiBPcHRpb25hbCwgbGlzdCBvZiBwYXRocyB0aGUgaW5jbHVkZXMgZmlsZXMgY2FuIGJlIGZvdW5kIGluLgorICAgICAgZmxhdGNfYXJnczogT3B0aW9uYWwgbGlzdCBvZiBhZGRpdGlvbmFsIGFyZ3VtZW50cyB0byBwYXNzIHRvIGZsYXRjCisgICAgICAgICAgKGUuZy4gLS1nZW4tbXV0YWJsZSkuCisgICAgICB2aXNpYmlsaXR5OiBUaGUgdmlzaWJpbGl0eSBvZiB0aGUgZ2VuZXJhdGVkIGNjX2xpYnJhcnkuIEJ5IGRlZmF1bHQsIHVzZSB0aGUKKyAgICAgICAgICBkZWZhdWx0IHZpc2liaWxpdHkgb2YgdGhlIHByb2plY3QuCisgICAgICBjb21wYXRpYmxlX3dpdGg6IE9wdGlvbmFsLCBUaGUgbGlzdCBvZiBlbnZpcm9ubWVudHMgdGhpcyBydWxlIGNhbiBiZSBidWlsdAorICAgICAgICBmb3IsIGluIGFkZGl0aW9uIHRvIGRlZmF1bHQtc3VwcG9ydGVkIGVudmlyb25tZW50cy4KKyAgICAgIHJlc3RyaWN0ZWRfdG86IE9wdGlvbmFsLCBUaGUgbGlzdCBvZiBlbnZpcm9ubWVudHMgdGhpcyBydWxlIGNhbiBiZSBidWlsdAorICAgICAgICBmb3IsIGluc3RlYWQgb2YgZGVmYXVsdC1zdXBwb3J0ZWQgZW52aXJvbm1lbnRzLgorICAgICAgdGFyZ2V0X2NvbXBhdGlibGVfd2l0aDogT3B0aW9uYWwsIFRoZSBsaXN0IG9mIHRhcmdldCBwbGF0Zm9ybSBjb25zdHJhaW50cworICAgICAgICB0byB1c2UuCisgICAgICBpbmNsdWRlX3JlZmxlY3Rpb246IE9wdGlvbmFsLCBXaGV0aGVyIHRvIGRlcGVuZCBvbiB0aGUgZmxhdGJ1ZmZlcgorICAgICAgICByZWZsZWN0aW9uIGxpYnJhcnkgYXV0b21hdGljYWxseS4gT25seSByZWFsbHkgcmVsZXZhbnQgZm9yIHRoZQorICAgICAgICB0YXJnZXQgdGhhdCBidWlsZHMgdGhlIHJlZmxlY3Rpb24gbGlicmFyeSBpdHNlbGYuCisgICAgICBwYWNrYWdlX25hbWU6IE9wdGlvbmFsLCBQYWNrYWdlIG5hbWUgdG8gdXNlIGZvciB0aGUgZ2VuZXJhdGVkIGNvZGUuCisgICAgIiIiCisgICAgc3Jjc19saWIgPSAiJXNfc3JjcyIgJSAobmFtZSkKKworICAgICMgZnJjOTcxLXNwZWNpZmljIG1vZGlmaWNhdGlvbjogQWRkIGEgZ2VucnVsZSB0aGF0IG92ZXJ3cml0ZXMgdGhlIGltcG9ydHMgZm9yIGFueSBmbGF0YnVmZmVyCisgICAgIyB0eXBlcyAobW9zdGx5IGp1c3QgZm9yIHJlZmxlY3Rpb24pIGJlY2F1c2UgdGhleSBuZWVkIHRvIHBvaW50IHRvIGV4dGVybmFsLywgbm90IHRvCisgICAgIyB0aGlyZF9wYXJ0eS8uCisgICAgIyBUT0RPKGphbWVzKTogVGhlcmUgYWJzb2x1dGVseSBhcmUgYmV0dGVyIHdheXMgdG8gZG8gdGhpcywgYnV0IHRoaXMgd2FzIHRoZSBxdWljayBhbmQgZGlydHkKKyAgICAjIG9uZS4uLi4KKyAgICBvdXRzID0gWyIlc19nZW5lcmF0ZWQudHMiICUgKHMucmVwbGFjZSgiLmZicyIsICIiKS5zcGxpdCgiLyIpWy0xXSkgZm9yIHMgaW4gc3Jjc10KKyAgICBpbmNsdWRlcyA9IFtkICsgIl9pbmNsdWRlcyIgZm9yIGQgaW4gZGVwc10KKyAgICBmbGF0YnVmZmVyX2xpYnJhcnlfcHVibGljKAorICAgICAgICBuYW1lID0gc3Jjc19saWIsCisgICAgICAgIHNyY3MgPSBzcmNzLAorICAgICAgICBvdXRwdXRfc3VmZml4ID0gIl9wcmVnZW5lcmF0ZWQudHMiLAorICAgICAgICBsYW5ndWFnZV9mbGFnID0gIi0tdHMiLAorICAgICAgICBpbmNsdWRlcyA9IGluY2x1ZGVzLAorICAgICAgICBpbmNsdWRlX3BhdGhzID0gaW5jbHVkZV9wYXRocywKKyAgICAgICAgZmxhdGNfYXJncyA9IGZsYXRjX2FyZ3MgKyBbIi0tZmlsZW5hbWUtc3VmZml4IF9wcmVnZW5lcmF0ZWQiXSwKKyAgICAgICAgY29tcGF0aWJsZV93aXRoID0gY29tcGF0aWJsZV93aXRoLAorICAgICAgICByZXN0cmljdGVkX3RvID0gcmVzdHJpY3RlZF90bywKKyAgICAgICAgdGFyZ2V0X2NvbXBhdGlibGVfd2l0aCA9IHRhcmdldF9jb21wYXRpYmxlX3dpdGgsCisgICAgKQorICAgIGdlbnJ1bGVfY21kID0gIiAiLmpvaW4oWworICAgICAgICAiU1JDUz0oJChTUkNTKSk7IiwKKyAgICAgICAgIk9VVFM9KCQoT1VUUykpOyIsCisgICAgICAgICJmb3IgaSBpbiAkJHshU1JDU1tAXX07IGRvIiwKKyAgICAgICAgInNlZCBcInMvJy4qcmVmbGVjdGlvblxcL3JlZmxlY3Rpb25fcHJlZ2VuZXJhdGVkLydmbGF0YnVmZmVyc19yZWZsZWN0aW9uXFwvcmVmbGVjdGlvbl9nZW5lcmF0ZWQvXCIgJCR7U1JDU1tpXX0gPiAkJHtPVVRTW2ldfTsiLAorICAgICAgICAic2VkIC1pICdzL19wcmVnZW5lcmF0ZWQvX2dlbmVyYXRlZC8nICQke09VVFNbaV19OyIsCisgICAgICAgICJkb25lIiwKKyAgICBdKQorICAgIG5hdGl2ZS5nZW5ydWxlKAorICAgICAgICBuYW1lID0gbmFtZSArICJfcmVpbXBvcnRlci50cyIsCisgICAgICAgIHNyY3MgPSBbc3Jjc19saWJdLAorICAgICAgICBvdXRzID0gb3V0cywKKyAgICAgICAgY21kID0gZ2VucnVsZV9jbWQsCisgICAgKQorICAgIHRzX3Byb2plY3QoCisgICAgICAgIG5hbWUgPSBuYW1lICsgIl90cyIsCisgICAgICAgIHNyY3MgPSBvdXRzLAorICAgICAgICBkZWNsYXJhdGlvbiA9IFRydWUsCisgICAgICAgIHZpc2liaWxpdHkgPSB2aXNpYmlsaXR5LAorICAgICAgICBjb21wYXRpYmxlX3dpdGggPSBjb21wYXRpYmxlX3dpdGgsCisgICAgICAgIHJlc3RyaWN0ZWRfdG8gPSByZXN0cmljdGVkX3RvLAorICAgICAgICB0YXJnZXRfY29tcGF0aWJsZV93aXRoID0gdGFyZ2V0X2NvbXBhdGlibGVfd2l0aCwKKyAgICAgICAgdHNjb25maWcgPSB7CisgICAgICAgICAgICAiY29tcGlsZXJPcHRpb25zIjogeworICAgICAgICAgICAgICAgICJkZWNsYXJhdGlvbiI6IFRydWUsCisgICAgICAgICAgICAgICAgImxpYiI6IFsKKyAgICAgICAgICAgICAgICAgICAgIkVTMjAxNSIsCisgICAgICAgICAgICAgICAgICAgICJFUzIwMjAuQmlnSW50IiwKKyAgICAgICAgICAgICAgICAgICAgIkRPTSIsCisgICAgICAgICAgICAgICAgXSwKKyAgICAgICAgICAgICAgICAibW9kdWxlIjogImVzMjAxNSIsCisgICAgICAgICAgICAgICAgIm1vZHVsZVJlc29sdXRpb24iOiAibm9kZSIsCisgICAgICAgICAgICAgICAgInN0cmljdCI6IFRydWUsCisgICAgICAgICAgICAgICAgInR5cGVzIjogWyJub2RlIl0sCisgICAgICAgICAgICB9LAorICAgICAgICB9LAorICAgICAgICBkZXBzID0gZGVwcyArIFsiQGNvbV9naXRodWJfZ29vZ2xlX2ZsYXRidWZmZXJzLy90czpmbGF0YnVmZmVycyJdICsgKFsiQGNvbV9naXRodWJfZ29vZ2xlX2ZsYXRidWZmZXJzLy9yZWZsZWN0aW9uOnJlZmxlY3Rpb25fdHNfZmJzIl0gaWYgaW5jbHVkZV9yZWZsZWN0aW9uIGVsc2UgW10pLAorICAgICkKKyAgICBqc19saWJyYXJ5KAorICAgICAgICBuYW1lID0gbmFtZSwKKyAgICAgICAgdmlzaWJpbGl0eSA9IHZpc2liaWxpdHksCisgICAgICAgIGNvbXBhdGlibGVfd2l0aCA9IGNvbXBhdGlibGVfd2l0aCwKKyAgICAgICAgcmVzdHJpY3RlZF90byA9IHJlc3RyaWN0ZWRfdG8sCisgICAgICAgIHRhcmdldF9jb21wYXRpYmxlX3dpdGggPSB0YXJnZXRfY29tcGF0aWJsZV93aXRoLAorICAgICAgICBkZXBzID0gW25hbWUgKyAiX3RzIl0sCisgICAgICAgIHBhY2thZ2VfbmFtZSA9IHBhY2thZ2VfbmFtZSwKKyAgICApCisgICAgbmF0aXZlLmZpbGVncm91cCgKKyAgICAgICAgbmFtZSA9ICIlc19pbmNsdWRlcyIgJSAobmFtZSksCisgICAgICAgIHNyY3MgPSBzcmNzICsgaW5jbHVkZXMsCisgICAgICAgIGNvbXBhdGlibGVfd2l0aCA9IGNvbXBhdGlibGVfd2l0aCwKKyAgICAgICAgcmVzdHJpY3RlZF90byA9IHJlc3RyaWN0ZWRfdG8sCisgICAgICAgIHZpc2liaWxpdHkgPSB2aXNpYmlsaXR5LAorICAgICkKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3lhcm4ubG9jayBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3lhcm4ubG9jawppbmRleCAxNzE4NTRkLi44NjM2ZGU5IDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy95YXJuLmxvY2sKKysrIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMveWFybi5sb2NrCkBAIC0yLDI4ICsyLDcgQEAKICMgeWFybiBsb2NrZmlsZSB2MQogCiAKLSJAYmFiZWwvY29kZS1mcmFtZUA3LjEyLjExIjoKLSAgdmVyc2lvbiAiNy4xMi4xMSIKLSAgcmVzb2x2ZWQgImh0dHBzOi8vcmVnaXN0cnkueWFybnBrZy5jb20vQGJhYmVsL2NvZGUtZnJhbWUvLS9jb2RlLWZyYW1lLTcuMTIuMTEudGd6I2Y0YWQ0MzVhYTI2M2RiOTM1YjhmMTBmMmM1NTJkMjNmYjcxNmE2M2YiCi0gIGludGVncml0eSBzaGE1MTItWnQxeW9kQngxVWN5aWVQTVNrV25VNGhQcWh3cTdoR2kybkZMMUxlQTNFVWwrcTJMUXgxNk1JU2dKMCt6N2RubWd2UDlRdElsZXVFVEdPaU9IMVJjSXc9PQotICBkZXBlbmRlbmNpZXM6Ci0gICAgIkBiYWJlbC9oaWdobGlnaHQiICJeNy4xMC40IgotCi0iQGJhYmVsL2hlbHBlci12YWxpZGF0b3ItaWRlbnRpZmllckBeNy4xNi43IjoKLSAgdmVyc2lvbiAiNy4xNi43IgotICByZXNvbHZlZCAiaHR0cHM6Ly9yZWdpc3RyeS55YXJucGtnLmNvbS9AYmFiZWwvaGVscGVyLXZhbGlkYXRvci1pZGVudGlmaWVyLy0vaGVscGVyLXZhbGlkYXRvci1pZGVudGlmaWVyLTcuMTYuNy50Z3ojZThjNjAyNDM4YzRhODE5NTc1MTI0M2RhOTAzMWQxNjA3ZDI0N2NhZCIKLSAgaW50ZWdyaXR5IHNoYTUxMi1oc0VuRmVtZWlXNEQwOEE1Z1VBWnhMQlRYcFozOVArYStER0RzSHcxeXhxeVEvanpGRW54ZjV1VEVHcCszYnpBYk5PeFUxcGFUZ1lTNEVDVS9JZ2ZEdz09Ci0KLSJAYmFiZWwvaGlnaGxpZ2h0QF43LjEwLjQiOgotICB2ZXJzaW9uICI3LjE2LjEwIgotICByZXNvbHZlZCAiaHR0cHM6Ly9yZWdpc3RyeS55YXJucGtnLmNvbS9AYmFiZWwvaGlnaGxpZ2h0Ly0vaGlnaGxpZ2h0LTcuMTYuMTAudGd6Izc0NGYyZWI4MTU3OWQ2ZWVhNzUzYzIyN2IwZjU3MGFkNzg1YWJhODgiCi0gIGludGVncml0eSBzaGE1MTItNUZuVFFMU0xzd0VqNklrZ1Z3NUt1c05VVUZZOVpHcWUvVFJGblAvQktZSFlnZmg3dGMrQzdtd2l5OTUveU5QN0RoOXg1ODBWdjhyN3U3WmZUQkZ4ZHc9PQotICBkZXBlbmRlbmNpZXM6Ci0gICAgIkBiYWJlbC9oZWxwZXItdmFsaWRhdG9yLWlkZW50aWZpZXIiICJeNy4xNi43IgotICAgIGNoYWxrICJeMi4wLjAiCi0gICAganMtdG9rZW5zICJeNC4wLjAiCi0KLSJAYmF6ZWwvdHlwZXNjcmlwdEBeNS4yLjAiOgorIkBiYXplbC90eXBlc2NyaXB0QDUuMi4wIjoKICAgdmVyc2lvbiAiNS4yLjAiCiAgIHJlc29sdmVkICJodHRwczovL3JlZ2lzdHJ5Lnlhcm5wa2cuY29tL0BiYXplbC90eXBlc2NyaXB0Ly0vdHlwZXNjcmlwdC01LjIuMC50Z3ojMTMxMTI3YzgwMTZjNzEyZWYxYjI5MWYyYjUyMTA4ZTUzMjZmMDQ0NyIKICAgaW50ZWdyaXR5IHNoYTUxMi1oTnBTQ1FqNWRPWDk1aUM0WWYvZnV5eGZNVTV1VEFlODR0aHFQY1RDdk9KRm1weXBONnF6eEgyNFM1VWlYa3dic0w4c1FNOURQMCtxRnlUL1RSS2ROdz09CkBAIC00MSwzMSArMjAsNDEgQEAKICAgZGVwZW5kZW5jaWVzOgogICAgIGdvb2dsZS1wcm90b2J1ZiAiXjMuNi4xIgogCi0iQGVzbGludC9lc2xpbnRyY0BeMC40LjMiOgotICB2ZXJzaW9uICIwLjQuMyIKLSAgcmVzb2x2ZWQgImh0dHBzOi8vcmVnaXN0cnkueWFybnBrZy5jb20vQGVzbGludC9lc2xpbnRyYy8tL2VzbGludHJjLTAuNC4zLnRneiM5ZTQyOTgxZWYwMzViZWIzZGQ0OWFkZDE3YWNiOTZlOGZmNmYzOTRjIgotICBpbnRlZ3JpdHkgc2hhNTEyLUo2S0ZGejVRQ1lVSnEzcGYwbWpFY0NKVkVSYnp2NzFQVUlEY3p1aDlKa3dHRXpjZWQ2Q081QURMSEIxcmJmLytvUEJ0b1BmTVlOT3BHRHpDQU5sYlh3PT0KKyJAZXNsaW50L2VzbGludHJjQF4xLjMuMiI6CisgIHZlcnNpb24gIjEuMy4yIgorICByZXNvbHZlZCAiaHR0cHM6Ly9yZWdpc3RyeS55YXJucGtnLmNvbS9AZXNsaW50L2VzbGludHJjLy0vZXNsaW50cmMtMS4zLjIudGd6IzU4YjY5NTgyZjNiNzI3MWQ4ZmE2N2ZlNTI1MTc2N2E1YjM4ZWEzNTYiCisgIGludGVncml0eSBzaGE1MTItQVhZZDIzdzFTL2J2M2ZUczNMejB2amlZZW1TMDhqV2tJM2hZeVM5STFyeSswZitZanMxd20rc1UwQlM4cURPUHJCSWtwNHFIWUMxNkk4dVZ0cExhalE9PQogICBkZXBlbmRlbmNpZXM6CiAgICAgYWp2ICJeNi4xMi40IgotICAgIGRlYnVnICJeNC4xLjEiCi0gICAgZXNwcmVlICJeNy4zLjAiCi0gICAgZ2xvYmFscyAiXjEzLjkuMCIKLSAgICBpZ25vcmUgIl40LjAuNiIKKyAgICBkZWJ1ZyAiXjQuMy4yIgorICAgIGVzcHJlZSAiXjkuNC4wIgorICAgIGdsb2JhbHMgIl4xMy4xNS4wIgorICAgIGlnbm9yZSAiXjUuMi4wIgogICAgIGltcG9ydC1mcmVzaCAiXjMuMi4xIgotICAgIGpzLXlhbWwgIl4zLjEzLjEiCi0gICAgbWluaW1hdGNoICJeMy4wLjQiCisgICAganMteWFtbCAiXjQuMS4wIgorICAgIG1pbmltYXRjaCAiXjMuMS4yIgogICAgIHN0cmlwLWpzb24tY29tbWVudHMgIl4zLjEuMSIKIAotIkBodW1hbndob2NvZGVzL2NvbmZpZy1hcnJheUBeMC41LjAiOgotICB2ZXJzaW9uICIwLjUuMCIKLSAgcmVzb2x2ZWQgImh0dHBzOi8vcmVnaXN0cnkueWFybnBrZy5jb20vQGh1bWFud2hvY29kZXMvY29uZmlnLWFycmF5Ly0vY29uZmlnLWFycmF5LTAuNS4wLnRneiMxNDA3OTY3ZDRjNmVlY2Q3Mzg4ZjgzYWNmMWVhZjRkMGM2ZTU4ZWY5IgotICBpbnRlZ3JpdHkgc2hhNTEyLUZhZ3RLRno3NFhyVGw3eTZIQ3pRcHdEZlhQMHloeGU5bEhMRDFVWnhqdlpJY2J5Uno4elRGRi95WU5mU2Z6VTQxNGVEd1oxU3JPMFF2dHlmK3dGTVFnPT0KKyJAaHVtYW53aG9jb2Rlcy9jb25maWctYXJyYXlAXjAuMTAuNCI6CisgIHZlcnNpb24gIjAuMTAuNCIKKyAgcmVzb2x2ZWQgImh0dHBzOi8vcmVnaXN0cnkueWFybnBrZy5jb20vQGh1bWFud2hvY29kZXMvY29uZmlnLWFycmF5Ly0vY29uZmlnLWFycmF5LTAuMTAuNC50Z3ojMDFlNzM2NmU1N2QyYWQxMDRmZWVhNjNlNzIyNDhmMjIwMTVjNTIwYyIKKyAgaW50ZWdyaXR5IHNoYTUxMi1tWEFJSHhaVDNWY3BnODNvcGwxd0dsVlo5eHlkYmZaTzNyNVlmUlNINkdwcDJKL1BmZEJQMHdiRGEyc082L3FSYmNhbHBvZXZWeVc2QS9mSTZMZmVNdz09CiAgIGRlcGVuZGVuY2llczoKLSAgICAiQGh1bWFud2hvY29kZXMvb2JqZWN0LXNjaGVtYSIgIl4xLjIuMCIKKyAgICAiQGh1bWFud2hvY29kZXMvb2JqZWN0LXNjaGVtYSIgIl4xLjIuMSIKICAgICBkZWJ1ZyAiXjQuMS4xIgogICAgIG1pbmltYXRjaCAiXjMuMC40IgogCi0iQGh1bWFud2hvY29kZXMvb2JqZWN0LXNjaGVtYUBeMS4yLjAiOgorIkBodW1hbndob2NvZGVzL2dpdGlnbm9yZS10by1taW5pbWF0Y2hAXjEuMC4yIjoKKyAgdmVyc2lvbiAiMS4wLjIiCisgIHJlc29sdmVkICJodHRwczovL3JlZ2lzdHJ5Lnlhcm5wa2cuY29tL0BodW1hbndob2NvZGVzL2dpdGlnbm9yZS10by1taW5pbWF0Y2gvLS9naXRpZ25vcmUtdG8tbWluaW1hdGNoLTEuMC4yLnRneiMzMTZiMGE2M2I5MWMxMGU1M2YyNDJlZmI0YWNlNWMzYjM0ZTg3MjhkIgorICBpbnRlZ3JpdHkgc2hhNTEyLXJTcW1NSkRkTEZVc3l4UjZGTXREMDBuZlFLS0xGYjFrditxQmJPVktxRXJ2bG9FSUpMbzViRFRKVFFOVFlnZXlwNzhKc0E3dS9OUGk1alQxR1IvTXVBPT0KKworIkBodW1hbndob2NvZGVzL21vZHVsZS1pbXBvcnRlckBeMS4wLjEiOgorICB2ZXJzaW9uICIxLjAuMSIKKyAgcmVzb2x2ZWQgImh0dHBzOi8vcmVnaXN0cnkueWFybnBrZy5jb20vQGh1bWFud2hvY29kZXMvbW9kdWxlLWltcG9ydGVyLy0vbW9kdWxlLWltcG9ydGVyLTEuMC4xLnRneiNhZjViMjY5MWEyMmI0NGJlODQ3YjBjYTgxNjQxYzVmYjZhZDAxNzJjIgorICBpbnRlZ3JpdHkgc2hhNTEyLWJ4dmVWNFY4djVZYjRuY0ZUVDNyUFNnWkJPcENramZLMHk0b1ZWVkp3SXVEVkJSTURYclB5WFJMOTg4aTVhcDltOWJueUVFaldmbTVXa0JtdGZmTGZBPT0KKworIkBodW1hbndob2NvZGVzL29iamVjdC1zY2hlbWFAXjEuMi4xIjoKICAgdmVyc2lvbiAiMS4yLjEiCiAgIHJlc29sdmVkICJodHRwczovL3JlZ2lzdHJ5Lnlhcm5wa2cuY29tL0BodW1hbndob2NvZGVzL29iamVjdC1zY2hlbWEvLS9vYmplY3Qtc2NoZW1hLTEuMi4xLnRneiNiNTIwNTI5ZWMyMWQ4ZTU5NDVhMTg1MWRmZDFjMzJlOTRlMzlmZjQ1IgogICBpbnRlZ3JpdHkgc2hhNTEyLVpuUU1uTFY0ZTdoRGxVdnc4SCtVOEFTTDAyU1MyR242KzlBYzN3R0dMSWU3K2plMkFlQU94UFkraXpJUEpEZkZEYjdlRGpldjBVczhNTzFpRlJOOGhBPT0KQEAgLTk0LDcgKzgzLDcgQEAKICJAcHJvdG9idWZqcy9hc3Byb21pc2VAXjEuMS4xIiwgIkBwcm90b2J1ZmpzL2FzcHJvbWlzZUBeMS4xLjIiOgogICB2ZXJzaW9uICIxLjEuMiIKICAgcmVzb2x2ZWQgImh0dHBzOi8vcmVnaXN0cnkueWFybnBrZy5jb20vQHByb3RvYnVmanMvYXNwcm9taXNlLy0vYXNwcm9taXNlLTEuMS4yLnRneiM5YjhiMGNjNjYzZDY2OWE3ZDhmNmY1ZDA4OTNhMTRkMzQ4ZjMwZmJmIgotICBpbnRlZ3JpdHkgc2hhMS1tNHNNeG1QV2FhZlk5dlhRaVRvVTAwanpENzg9CisgIGludGVncml0eSBzaGE1MTItaitnS0V4RXVMbUt3dnozT2dST1h0ckoyVUcyeDhDaDJZWlV4YWhoK3MxRjJIWit3QWNlVU5Ma3Z5NnpLQ1BWUmtVKytaV1FyZHhzVWVRWG1jZzR1b1E9PQogCiAiQHByb3RvYnVmanMvYmFzZTY0QF4xLjEuMiI6CiAgIHZlcnNpb24gIjEuMS4yIgpAQCAtMTA5LDEyICs5OCwxMiBAQAogIkBwcm90b2J1ZmpzL2V2ZW50ZW1pdHRlckBeMS4xLjAiOgogICB2ZXJzaW9uICIxLjEuMCIKICAgcmVzb2x2ZWQgImh0dHBzOi8vcmVnaXN0cnkueWFybnBrZy5jb20vQHByb3RvYnVmanMvZXZlbnRlbWl0dGVyLy0vZXZlbnRlbWl0dGVyLTEuMS4wLnRneiMzNTVjYmM5OGJhZmFkNTk3OGY5ZWQwOTVmMzk3NjIxZjFkMDY2YjcwIgotICBpbnRlZ3JpdHkgc2hhMS1OVnk4bUxyNjFaZVBudENWODVkaUh4MEdhM0E9CisgIGludGVncml0eSBzaGE1MTItajllZG5SVDgxdllKOU9mVnVYRzZFUlNUZEVMMXhWc05ncXBreE1zYklhYnpTbzNnb0NqREl2ZWVHdjVkMDNvbTM5TUw3MVJkbXJHTmpHNVNSZUJQL1E9PQogCiAiQHByb3RvYnVmanMvZmV0Y2hAXjEuMS4wIjoKICAgdmVyc2lvbiAiMS4xLjAiCiAgIHJlc29sdmVkICJodHRwczovL3JlZ2lzdHJ5Lnlhcm5wa2cuY29tL0Bwcm90b2J1ZmpzL2ZldGNoLy0vZmV0Y2gtMS4xLjAudGd6I2JhOTlmYjU5ODYxNGFmNjU3MDBjMTYxOWZmMDZkNDU0YjBkODRjNDUiCi0gIGludGVncml0eSBzaGExLXVwbjdXWVlVcjJWd0RCWVovd2JVVkxEWVRFVT0KKyAgaW50ZWdyaXR5IHNoYTUxMi1sbGpWWHBxWGVicHNpalc3MVBaYUNZZUljRTVvbjF3NURsUXk1V0g2R0xiRnJ5TFVyQkQ0OTMyVy9FMkJTcGZSSldzZUlMNHYvS1BnQkZ4RE9JZEtwUT09CiAgIGRlcGVuZGVuY2llczoKICAgICAiQHByb3RvYnVmanMvYXNwcm9taXNlIiAiXjEuMS4xIgogICAgICJAcHJvdG9idWZqcy9pbnF1aXJlIiAiXjEuMS4wIgpAQCAtMTIyLDEyNyArMTExLDEzOCBAQAogIkBwcm90b2J1ZmpzL2Zsb2F0QF4xLjAuMiI6CiAgIHZlcnNpb24gIjEuMC4yIgogICByZXNvbHZlZCAiaHR0cHM6Ly9yZWdpc3RyeS55YXJucGtnLmNvbS9AcHJvdG9idWZqcy9mbG9hdC8tL2Zsb2F0LTEuMC4yLnRneiM1ZTllMWFiZGNiNzNmYzBhN2NiOGIyOTFkZjc4YzhjYmQ5N2I4N2QxIgotICBpbnRlZ3JpdHkgc2hhMS1YcDRhdmN0ei9BcDh1TEtSMzNqSXk5bDdoOUU9CisgIGludGVncml0eSBzaGE1MTItRGRiK2tWWGxYc3Q5ZCtSOVBmVEl4aDFFZE5rZ29SZTV0T1g2dDAxZjFsWVdPdkpuU1BEQmxHMjQxUUx6Y3lQZG9OVHNibExVZHVqR1NFNFJ6clRaR1E9PQogCiAiQHByb3RvYnVmanMvaW5xdWlyZUBeMS4xLjAiOgogICB2ZXJzaW9uICIxLjEuMCIKICAgcmVzb2x2ZWQgImh0dHBzOi8vcmVnaXN0cnkueWFybnBrZy5jb20vQHByb3RvYnVmanMvaW5xdWlyZS8tL2lucXVpcmUtMS4xLjAudGd6I2ZmMjAwZTNlN2NmMjQyOWUyZGNhZmMxMTQwODI4ZThjYzYzOGYwODkiCi0gIGludGVncml0eSBzaGExLS95QU9Qbnp5UXA0dHl2d1JRSUtPak1ZNDhJaz0KKyAgaW50ZWdyaXR5IHNoYTUxMi1rZFNlZmNQZHJ1SmlGTVZTYm44MDF0NHZGSzdLQi81Z2QyZll2cnhodUpZZzhJTHJtbjlTS1NYMnRaZFY2Vitrc3VsV3FTN2FYakJjUlhsM3dIb0Q5UT09CiAKICJAcHJvdG9idWZqcy9wYXRoQF4xLjEuMiI6CiAgIHZlcnNpb24gIjEuMS4yIgogICByZXNvbHZlZCAiaHR0cHM6Ly9yZWdpc3RyeS55YXJucGtnLmNvbS9AcHJvdG9idWZqcy9wYXRoLy0vcGF0aC0xLjEuMi50Z3ojNmNjMmIyMGM1YzlhZDZhZDBkY2NmZDIxY2E3NjczZDhkN2ZiZjY4ZCIKLSAgaW50ZWdyaXR5IHNoYTEtYk1LeURGeWExcTBOelAwaHluWnoyTmY3OW8wPQorICBpbnRlZ3JpdHkgc2hhNTEyLTZKT2NKNVRtMDhkT0hBYmRSM0dydlAreVVVZmtqRzVlUHNIWWN6TUZMcTNabU1rQUQ5OGNEZ2NUMmlBMWxKOU5Wd0ZkNHRIL2lTU29lNDRZV2tsdEVBPT0KIAogIkBwcm90b2J1ZmpzL3Bvb2xAXjEuMS4wIjoKICAgdmVyc2lvbiAiMS4xLjAiCiAgIHJlc29sdmVkICJodHRwczovL3JlZ2lzdHJ5Lnlhcm5wa2cuY29tL0Bwcm90b2J1ZmpzL3Bvb2wvLS9wb29sLTEuMS4wLnRneiMwOWZkMTVmMmQ2ZDNhYmZhOWI2NWJjMzY2NTA2ZDZhZDc4NDZmZjU0IgotICBpbnRlZ3JpdHkgc2hhMS1DZjBWOHRiVHEvcWJaYncyWlFiV3JYaEcvMVE9CisgIGludGVncml0eSBzaGE1MTItMGtFTGFHU0lEQkt2Y2dTNHpranoxUGVkZGF0cmpZY21NV09sQXVBUHdBZWNjVXJQSGRVcW8vSjZMaXltSEhFaUpUNU5yRjFVVnd4WTE0ZitmeTRXUXc9PQogCiAiQHByb3RvYnVmanMvdXRmOEBeMS4xLjAiOgogICB2ZXJzaW9uICIxLjEuMCIKICAgcmVzb2x2ZWQgImh0dHBzOi8vcmVnaXN0cnkueWFybnBrZy5jb20vQHByb3RvYnVmanMvdXRmOC8tL3V0ZjgtMS4xLjAudGd6I2E3NzczNjBiNWIzOWExYTJlNTEwNmY4ZTg1OGYyZmQyZDA2MGM1NzAiCi0gIGludGVncml0eSBzaGExLXAzYzJDMXM1b2FMbEVHK09oWTh2MHRCZ3hYQT0KKyAgaW50ZWdyaXR5IHNoYTUxMi1Wdm4zelpyaFFaa2tCRThMU3VXM2VtOThjMEZ3Z080bnh6djZPZFN4UEtKSUVLWTJiR2JIbittaEdJUGVyekk0dHdkeGFQOC8wKzA2SEJwd2YzNDVMdz09CiAKLSJAdHlwZXMvanNvbi1zY2hlbWFAXjcuMC43IjoKLSAgdmVyc2lvbiAiNy4wLjkiCi0gIHJlc29sdmVkICJodHRwczovL3JlZ2lzdHJ5Lnlhcm5wa2cuY29tL0B0eXBlcy9qc29uLXNjaGVtYS8tL2pzb24tc2NoZW1hLTcuMC45LnRneiM5N2VkYzkwMzdlYTBjMzg1ODUzMjBiMjg5NjRkZGUzYjM5ZTQ2NjBkIgotICBpbnRlZ3JpdHkgc2hhNTEyLXFjVVh1ZW10RXUrRTV3WlNKSE54VVhlQ1poQWZYS1E0MUQrZHVYK1ZZUGRlN3h5RVZaY2krL29YS0pMMTN0blJzOWxSMnByNGZvZDU5R1Q2L1gxL3lRPT0KKyJAdHlwZXMvanNvbi1zY2hlbWFAXjcuMC45IjoKKyAgdmVyc2lvbiAiNy4wLjExIgorICByZXNvbHZlZCAiaHR0cHM6Ly9yZWdpc3RyeS55YXJucGtnLmNvbS9AdHlwZXMvanNvbi1zY2hlbWEvLS9qc29uLXNjaGVtYS03LjAuMTEudGd6I2Q0MjFiNmM1MjdhMzAzN2Y3Yzg0NDMzZmQyYzQyMjllMDE2ODYzZDMiCisgIGludGVncml0eSBzaGE1MTItd091dkcxU040VXM0cmV6K3R5bHd3d0NWMXBzaU5WT2tKZU0zQVVXVU5XZy9qRFFZMitIRS80NDR5NWdjK2pCbVJxQVNPbTJPZWg1YzFheEhvYndSS1E9PQogCiAiQHR5cGVzL2xvbmdAXjQuMC4wIjoKLSAgdmVyc2lvbiAiNC4wLjEiCi0gIHJlc29sdmVkICJodHRwczovL3JlZ2lzdHJ5Lnlhcm5wa2cuY29tL0B0eXBlcy9sb25nLy0vbG9uZy00LjAuMS50Z3ojNDU5YzY1ZmExODY3ZGFmZTZhOGYzMjJjNGM1MTY5NTY2M2NjNTVlOSIKLSAgaW50ZWdyaXR5IHNoYTUxMi01dFhINkJ4L2tOR2QzTWdmZmRtUDRkeTJaK0c0ZWFYdzBTRTgxVHEzQk5hZHRuTVI1L3lTTXpYNFNMRXpISnpTbVBObjRISWRwUXNCdlhNVXlrcjU4dz09CisgIHZlcnNpb24gIjQuMC4yIgorICByZXNvbHZlZCAiaHR0cHM6Ly9yZWdpc3RyeS55YXJucGtnLmNvbS9AdHlwZXMvbG9uZy8tL2xvbmctNC4wLjIudGd6I2I3NDEyOTcxOWZjOGQxMWMwMTg2ODAxMDA4MmQ0ODNiNzU0NTU5MWEiCisgIGludGVncml0eSBzaGE1MTItTXFUR0VvNWJqNXQxNTdVNmZBL0JpRHluTmtuMFlrblZkaDQ4Q01Qa1RTcEZUVm12YW81VVFtbTd1RUY2eEJFbzdxSU1BbFkvSlNsZVlhRTZWT2RwYUE9PQogCi0iQHR5cGVzL25vZGVAMTcuMC4yMSI6Ci0gIHZlcnNpb24gIjE3LjAuMjEiCi0gIHJlc29sdmVkICJodHRwczovL3JlZ2lzdHJ5Lnlhcm5wa2cuY29tL0B0eXBlcy9ub2RlLy0vbm9kZS0xNy4wLjIxLnRneiM4NjRiOTg3YzBjNjhkMDdiNDM0NTg0NWMzZTYzYjc1ZWRkMTQzNjQ0IgotICBpbnRlZ3JpdHkgc2hhNTEyLURCWkNKYmhJSTNyOTBYYlF4SThZOUlqamlpT0dsWjBIcjMyb21YSVp2d3daN3A0RE1NWEdyS1hWeVBmdW9CT3JpOVhOdEwwVUs2OWpZSUJJc1JYM1FRPT0KKyJAdHlwZXMvbm9kZUAxOC43LjE2IjoKKyAgdmVyc2lvbiAiMTguNy4xNiIKKyAgcmVzb2x2ZWQgImh0dHBzOi8vcmVnaXN0cnkueWFybnBrZy5jb20vQHR5cGVzL25vZGUvLS9ub2RlLTE4LjcuMTYudGd6IzBlYjNjY2UxZTM3Yzc5NjE5OTQzZDJmZDkwMzkxOWZjMzA4NTA2MDEiCisgIGludGVncml0eSBzaGE1MTItRVFIaGl4ZnUrbWtxSE1abDFSMk92dXZuNDdQVXcxOGF6TUpPVHdTWnI5L2ZoekhOR1hBSjBtYTBkYXlSVmNocHJwQ2owS2MxSzF4S29XYUFUV0YxcWc9PQogCiAiQHR5cGVzL25vZGVAXjEwLjEuMCI6CiAgIHZlcnNpb24gIjEwLjE3LjYwIgogICByZXNvbHZlZCAiaHR0cHM6Ly9yZWdpc3RyeS55YXJucGtnLmNvbS9AdHlwZXMvbm9kZS8tL25vZGUtMTAuMTcuNjAudGd6IzM1ZjNkNjIxM2RhZWQ5NWRhN2YwZjczZTc1YmNjNjk4MGU5MDU5N2IiCiAgIGludGVncml0eSBzaGE1MTItRjBLSWdESmZ5Mm5BM3pNTG1XR0t4Y0gyWlZFdENaWEhIZE9RczJnU2FRMjcrbE5lRWZHeHprSXc5MGFYc3dBVFg3QVozM3RhaFBienk2S0FmVXJlVnc9PQogCi0iQHR5cGVzY3JpcHQtZXNsaW50L2VzbGludC1wbHVnaW5AXjQuMTIuMCI6Ci0gIHZlcnNpb24gIjQuMzMuMCIKLSAgcmVzb2x2ZWQgImh0dHBzOi8vcmVnaXN0cnkueWFybnBrZy5jb20vQHR5cGVzY3JpcHQtZXNsaW50L2VzbGludC1wbHVnaW4vLS9lc2xpbnQtcGx1Z2luLTQuMzMuMC50Z3ojYzI0ZGM3YzgwNjljNzcwNmJjNDBkOTlmNmZhODdlZGNiMjAwNTI3NiIKLSAgaW50ZWdyaXR5IHNoYTUxMi1hSU5pQXhHVmRPbDFlSnlWamFXbi9ZY1ZBcTRHaS9ZbzM1cUhHQ25xYldWejYxZzM5RDBoMjN2ZVkvTUEwckZGR2Z4SzdUeVNnMnV3RGVOditKZ1ZwZz09CisiQHR5cGVzY3JpcHQtZXNsaW50L2VzbGludC1wbHVnaW5AXjUuMzYuMiI6CisgIHZlcnNpb24gIjUuMzYuMiIKKyAgcmVzb2x2ZWQgImh0dHBzOi8vcmVnaXN0cnkueWFybnBrZy5jb20vQHR5cGVzY3JpcHQtZXNsaW50L2VzbGludC1wbHVnaW4vLS9lc2xpbnQtcGx1Z2luLTUuMzYuMi50Z3ojNmRmMDkyYTIwZTBmOWVjNzQ4YjI3ZjI5M2ExMmNiMzlkMGMxZmU0ZCIKKyAgaW50ZWdyaXR5IHNoYTUxMi1Pd3dSOExSd1NuSTk4dGRjMno3bUpZZ1k2MGdmN0k5WmZHak41RWpDd3duczliZFR1UWZBWGNzalNCMndTUS9UVk5ZU0dLZjRrelZYYk5HYVp2d2lYdz09CiAgIGRlcGVuZGVuY2llczoKLSAgICAiQHR5cGVzY3JpcHQtZXNsaW50L2V4cGVyaW1lbnRhbC11dGlscyIgIjQuMzMuMCIKLSAgICAiQHR5cGVzY3JpcHQtZXNsaW50L3Njb3BlLW1hbmFnZXIiICI0LjMzLjAiCi0gICAgZGVidWcgIl40LjMuMSIKKyAgICAiQHR5cGVzY3JpcHQtZXNsaW50L3Njb3BlLW1hbmFnZXIiICI1LjM2LjIiCisgICAgIkB0eXBlc2NyaXB0LWVzbGludC90eXBlLXV0aWxzIiAiNS4zNi4yIgorICAgICJAdHlwZXNjcmlwdC1lc2xpbnQvdXRpbHMiICI1LjM2LjIiCisgICAgZGVidWcgIl40LjMuNCIKICAgICBmdW5jdGlvbmFsLXJlZC1ibGFjay10cmVlICJeMS4wLjEiCi0gICAgaWdub3JlICJeNS4xLjgiCi0gICAgcmVnZXhwcCAiXjMuMS4wIgotICAgIHNlbXZlciAiXjcuMy41IgorICAgIGlnbm9yZSAiXjUuMi4wIgorICAgIHJlZ2V4cHAgIl4zLjIuMCIKKyAgICBzZW12ZXIgIl43LjMuNyIKICAgICB0c3V0aWxzICJeMy4yMS4wIgogCi0iQHR5cGVzY3JpcHQtZXNsaW50L2V4cGVyaW1lbnRhbC11dGlsc0A0LjMzLjAiOgotICB2ZXJzaW9uICI0LjMzLjAiCi0gIHJlc29sdmVkICJodHRwczovL3JlZ2lzdHJ5Lnlhcm5wa2cuY29tL0B0eXBlc2NyaXB0LWVzbGludC9leHBlcmltZW50YWwtdXRpbHMvLS9leHBlcmltZW50YWwtdXRpbHMtNC4zMy4wLnRneiM2ZjJhNzg2YTQyMDlmYTIyMjI5ODllOTM4MGI1MzMxYjI4MTBmN2ZkIgotICBpbnRlZ3JpdHkgc2hhNTEyLXplUWpPb0VTNUpGalRuQWhJNVFZN1p2aWN6TXpEcHRsczE1R0ZzSTZqeVVPcTBrT2Y5K1dvbmtodGxJaGgwUmdIUm5xajVnZE54VzVqMUV2QXlZZzZRPT0KKyJAdHlwZXNjcmlwdC1lc2xpbnQvcGFyc2VyQF41LjM2LjIiOgorICB2ZXJzaW9uICI1LjM2LjIiCisgIHJlc29sdmVkICJodHRwczovL3JlZ2lzdHJ5Lnlhcm5wa2cuY29tL0B0eXBlc2NyaXB0LWVzbGludC9wYXJzZXIvLS9wYXJzZXItNS4zNi4yLnRneiMzZGRmMzIzZDNhYzg1YTI1Mjk1YTU1ZmNiOWM3YTQ5YWI0NjgwZGRkIgorICBpbnRlZ3JpdHkgc2hhNTEyLXFTL0tiMHl6eThzUjBpZEZzcEk5WjYrdDdtcWsvb1JqbkFZZmV3RytWTjczb3BBVXZtWUwzb1BJTW1nT1g2Q25RUzZnbVZJWEdzaGxiNVJZL1IyMnBBPT0KICAgZGVwZW5kZW5jaWVzOgotICAgICJAdHlwZXMvanNvbi1zY2hlbWEiICJeNy4wLjciCi0gICAgIkB0eXBlc2NyaXB0LWVzbGludC9zY29wZS1tYW5hZ2VyIiAiNC4zMy4wIgotICAgICJAdHlwZXNjcmlwdC1lc2xpbnQvdHlwZXMiICI0LjMzLjAiCi0gICAgIkB0eXBlc2NyaXB0LWVzbGludC90eXBlc2NyaXB0LWVzdHJlZSIgIjQuMzMuMCIKKyAgICAiQHR5cGVzY3JpcHQtZXNsaW50L3Njb3BlLW1hbmFnZXIiICI1LjM2LjIiCisgICAgIkB0eXBlc2NyaXB0LWVzbGludC90eXBlcyIgIjUuMzYuMiIKKyAgICAiQHR5cGVzY3JpcHQtZXNsaW50L3R5cGVzY3JpcHQtZXN0cmVlIiAiNS4zNi4yIgorICAgIGRlYnVnICJeNC4zLjQiCisKKyJAdHlwZXNjcmlwdC1lc2xpbnQvc2NvcGUtbWFuYWdlckA1LjM2LjIiOgorICB2ZXJzaW9uICI1LjM2LjIiCisgIHJlc29sdmVkICJodHRwczovL3JlZ2lzdHJ5Lnlhcm5wa2cuY29tL0B0eXBlc2NyaXB0LWVzbGludC9zY29wZS1tYW5hZ2VyLy0vc2NvcGUtbWFuYWdlci01LjM2LjIudGd6I2E3NWViNTg4YTM4NzlhZTY1OTUxNDc4MDgzMTM3MDY0MjUwNWQxY2QiCisgIGludGVncml0eSBzaGE1MTItY05OUDUxTDhTa0lGU2ZjZThCMU5TVUJUSlR1MlRzNG5XZVdiRnJkYXFqbW45eUtyQWFKVUJIa3lUWmMwY0wwNk9GSHBiK0pacTVBVUhST1MzOThPcnc9PQorICBkZXBlbmRlbmNpZXM6CisgICAgIkB0eXBlc2NyaXB0LWVzbGludC90eXBlcyIgIjUuMzYuMiIKKyAgICAiQHR5cGVzY3JpcHQtZXNsaW50L3Zpc2l0b3Ita2V5cyIgIjUuMzYuMiIKKworIkB0eXBlc2NyaXB0LWVzbGludC90eXBlLXV0aWxzQDUuMzYuMiI6CisgIHZlcnNpb24gIjUuMzYuMiIKKyAgcmVzb2x2ZWQgImh0dHBzOi8vcmVnaXN0cnkueWFybnBrZy5jb20vQHR5cGVzY3JpcHQtZXNsaW50L3R5cGUtdXRpbHMvLS90eXBlLXV0aWxzLTUuMzYuMi50Z3ojNzUyMzczZjRiYWJmMDVlOTkzYWRmMmNkNTQzYTc2MzYzMjgyNjM5MSIKKyAgaW50ZWdyaXR5IHNoYTUxMi1yUFF0UzVyZmlqVVdMb3VoeTZVbXlOcXVLRFBoUWpLc2FLSDBXblk2aGwvMDdsYXNqOGdQYUgyVUQ4eFdrZVBuNlNDK2pXMmk5YzJEWlZEbkwrRG9rdz09CisgIGRlcGVuZGVuY2llczoKKyAgICAiQHR5cGVzY3JpcHQtZXNsaW50L3R5cGVzY3JpcHQtZXN0cmVlIiAiNS4zNi4yIgorICAgICJAdHlwZXNjcmlwdC1lc2xpbnQvdXRpbHMiICI1LjM2LjIiCisgICAgZGVidWcgIl40LjMuNCIKKyAgICB0c3V0aWxzICJeMy4yMS4wIgorCisiQHR5cGVzY3JpcHQtZXNsaW50L3R5cGVzQDUuMzYuMiI6CisgIHZlcnNpb24gIjUuMzYuMiIKKyAgcmVzb2x2ZWQgImh0dHBzOi8vcmVnaXN0cnkueWFybnBrZy5jb20vQHR5cGVzY3JpcHQtZXNsaW50L3R5cGVzLy0vdHlwZXMtNS4zNi4yLnRneiNhNTA2NmU1MDBlYmNmY2VlMzY2OTQxODZjY2M1N2I5NTVjMDVmYWY5IgorICBpbnRlZ3JpdHkgc2hhNTEyLTlPSlN2dnd1RjFMNWVTMkVRZ0ZVYkVDYjk5RjBtd3E1MDF3MEgwRWtZVUxraEZhMTlRcTdXRmJ5Y2R3MVBleEFjOTI5YXN1cGJaY2dqVkllNk9LL1hRPT0KKworIkB0eXBlc2NyaXB0LWVzbGludC90eXBlc2NyaXB0LWVzdHJlZUA1LjM2LjIiOgorICB2ZXJzaW9uICI1LjM2LjIiCisgIHJlc29sdmVkICJodHRwczovL3JlZ2lzdHJ5Lnlhcm5wa2cuY29tL0B0eXBlc2NyaXB0LWVzbGludC90eXBlc2NyaXB0LWVzdHJlZS8tL3R5cGVzY3JpcHQtZXN0cmVlLTUuMzYuMi50Z3ojMGM5MzQxOGIzNmM1M2JhMGJjMzRjNjFmZTk0MDVjNGQxZDhmZTU2MCIKKyAgaW50ZWdyaXR5IHNoYTUxMi04ZnlIK1JmYktjMG1Uc3BmdUVqbGZxQTRZeXdjd1FLMkFtY2Y2VERPd2FSTGc3VndkdTRiWnp5dkJacDRianQxUlJqUTVNRG5PWmFoeE1ydDJsNXY5dz09CisgIGRlcGVuZGVuY2llczoKKyAgICAiQHR5cGVzY3JpcHQtZXNsaW50L3R5cGVzIiAiNS4zNi4yIgorICAgICJAdHlwZXNjcmlwdC1lc2xpbnQvdmlzaXRvci1rZXlzIiAiNS4zNi4yIgorICAgIGRlYnVnICJeNC4zLjQiCisgICAgZ2xvYmJ5ICJeMTEuMS4wIgorICAgIGlzLWdsb2IgIl40LjAuMyIKKyAgICBzZW12ZXIgIl43LjMuNyIKKyAgICB0c3V0aWxzICJeMy4yMS4wIgorCisiQHR5cGVzY3JpcHQtZXNsaW50L3V0aWxzQDUuMzYuMiI6CisgIHZlcnNpb24gIjUuMzYuMiIKKyAgcmVzb2x2ZWQgImh0dHBzOi8vcmVnaXN0cnkueWFybnBrZy5jb20vQHR5cGVzY3JpcHQtZXNsaW50L3V0aWxzLy0vdXRpbHMtNS4zNi4yLnRneiNiMDFhNzZmMGFiMjQ0NDA0YzdhZWZjMzQwYzUwMTVkNWNlNmRhNzRjIgorICBpbnRlZ3JpdHkgc2hhNTEyLXVOY29wV29uRUlUWDk2djlwZWZrOURDMWJXTWRrd2VlU3Nld0o2R2VDN0w2ajJ0MFNKeXdpc2drcjl3VVR0WGs5MGZpMkVsamo5MEhTSG0zT0dkR1JnPT0KKyAgZGVwZW5kZW5jaWVzOgorICAgICJAdHlwZXMvanNvbi1zY2hlbWEiICJeNy4wLjkiCisgICAgIkB0eXBlc2NyaXB0LWVzbGludC9zY29wZS1tYW5hZ2VyIiAiNS4zNi4yIgorICAgICJAdHlwZXNjcmlwdC1lc2xpbnQvdHlwZXMiICI1LjM2LjIiCisgICAgIkB0eXBlc2NyaXB0LWVzbGludC90eXBlc2NyaXB0LWVzdHJlZSIgIjUuMzYuMiIKICAgICBlc2xpbnQtc2NvcGUgIl41LjEuMSIKICAgICBlc2xpbnQtdXRpbHMgIl4zLjAuMCIKIAotIkB0eXBlc2NyaXB0LWVzbGludC9wYXJzZXJAXjQuMTIuMCI6Ci0gIHZlcnNpb24gIjQuMzMuMCIKLSAgcmVzb2x2ZWQgImh0dHBzOi8vcmVnaXN0cnkueWFybnBrZy5jb20vQHR5cGVzY3JpcHQtZXNsaW50L3BhcnNlci8tL3BhcnNlci00LjMzLjAudGd6I2RmZTc5NzU3MGQ5Njk0ZTU2MDUyOGQxOGVlY2FkODZjOGM3NDQ4OTkiCi0gIGludGVncml0eSBzaGE1MTItWm9oZHNiWGFkakdCU0swL3IrZDg3WDBTQm1Lek9xNC9TNW56SzZTQmdKc3BGbzkvQ1VESjdoamF5dXplK0pLN0NaUUxETXJvcXl0cDdwT2NGS1R4WkE9PQorIkB0eXBlc2NyaXB0LWVzbGludC92aXNpdG9yLWtleXNANS4zNi4yIjoKKyAgdmVyc2lvbiAiNS4zNi4yIgorICByZXNvbHZlZCAiaHR0cHM6Ly9yZWdpc3RyeS55YXJucGtnLmNvbS9AdHlwZXNjcmlwdC1lc2xpbnQvdmlzaXRvci1rZXlzLy0vdmlzaXRvci1rZXlzLTUuMzYuMi50Z3ojMmY4Zjc4ZGEwYTNiYWQzMzIwZDJhYzI0OTY1NzkxYWMzOWRhY2U1YSIKKyAgaW50ZWdyaXR5IHNoYTUxMi1CdFJ2U1I2ZEVkck50N05ldDIvWERqYllLVTVNbDZHcUpnVmZYVDBDeFRDSmxuSXFLN3JBR3JldVdLTVQydDhjRlVUMk1zdjVveHcwR01SRDdUNUo3QT09CiAgIGRlcGVuZGVuY2llczoKLSAgICAiQHR5cGVzY3JpcHQtZXNsaW50L3Njb3BlLW1hbmFnZXIiICI0LjMzLjAiCi0gICAgIkB0eXBlc2NyaXB0LWVzbGludC90eXBlcyIgIjQuMzMuMCIKLSAgICAiQHR5cGVzY3JpcHQtZXNsaW50L3R5cGVzY3JpcHQtZXN0cmVlIiAiNC4zMy4wIgotICAgIGRlYnVnICJeNC4zLjEiCisgICAgIkB0eXBlc2NyaXB0LWVzbGludC90eXBlcyIgIjUuMzYuMiIKKyAgICBlc2xpbnQtdmlzaXRvci1rZXlzICJeMy4zLjAiCiAKLSJAdHlwZXNjcmlwdC1lc2xpbnQvc2NvcGUtbWFuYWdlckA0LjMzLjAiOgotICB2ZXJzaW9uICI0LjMzLjAiCi0gIHJlc29sdmVkICJodHRwczovL3JlZ2lzdHJ5Lnlhcm5wa2cuY29tL0B0eXBlc2NyaXB0LWVzbGludC9zY29wZS1tYW5hZ2VyLy0vc2NvcGUtbWFuYWdlci00LjMzLjAudGd6I2QzOGU0OTI4MGQ5ODNlODc3MmUyOTEyMWNmOGM2ZTkyMjFmMjgwYTMiCi0gIGludGVncml0eSBzaGE1MTItNUlmSkhwZ1RzVFp1T05LYk9EY3RMNGtLdVFqZS9iekJSa3dIRThVT1o0Zjg5WmVkZGcrRUdaczhQRDhOY040TGRNM3lnSFdZQjN1a1BBWWp2bC9xYlE9PQotICBkZXBlbmRlbmNpZXM6Ci0gICAgIkB0eXBlc2NyaXB0LWVzbGludC90eXBlcyIgIjQuMzMuMCIKLSAgICAiQHR5cGVzY3JpcHQtZXNsaW50L3Zpc2l0b3Ita2V5cyIgIjQuMzMuMCIKLQotIkB0eXBlc2NyaXB0LWVzbGludC90eXBlc0A0LjMzLjAiOgotICB2ZXJzaW9uICI0LjMzLjAiCi0gIHJlc29sdmVkICJodHRwczovL3JlZ2lzdHJ5Lnlhcm5wa2cuY29tL0B0eXBlc2NyaXB0LWVzbGludC90eXBlcy8tL3R5cGVzLTQuMzMuMC50Z3ojYTFlNTkwMzZhM2I1M2FlODQzMGNlZWJmMmE5MTlkYzdmOWFmNmQ3MiIKLSAgaW50ZWdyaXR5IHNoYTUxMi16S3A3Q2pRekxRSW1YRXBMdDJCVXcxdHZPTVBmTm9UQWZiOGw1MWV2aFliT0VFemRXeVFObUhXV0dQUjZod0tKREFpKzFWWFNCbW5oTDlreVZUVE91UT09Ci0KLSJAdHlwZXNjcmlwdC1lc2xpbnQvdHlwZXNjcmlwdC1lc3RyZWVANC4zMy4wIjoKLSAgdmVyc2lvbiAiNC4zMy4wIgotICByZXNvbHZlZCAiaHR0cHM6Ly9yZWdpc3RyeS55YXJucGtnLmNvbS9AdHlwZXNjcmlwdC1lc2xpbnQvdHlwZXNjcmlwdC1lc3RyZWUvLS90eXBlc2NyaXB0LWVzdHJlZS00LjMzLjAudGd6IzBkZmI1MWMyOTA4ZjY4YzVjMDhkODJhZWZlYWYxNjZhMTdjMjQ2MDkiCi0gIGludGVncml0eSBzaGE1MTItcmtXUlkxTVBGemp3bkVWSHN4R2VtRHpxcWRkdzJRYlRKbElDUEQ5cDlJOUxmc084ZmRtZlFQT1gzdUtmVWFHUkRGSmJmcnRtL3NYaFZYTjRFK2J6Q0E9PQotICBkZXBlbmRlbmNpZXM6Ci0gICAgIkB0eXBlc2NyaXB0LWVzbGludC90eXBlcyIgIjQuMzMuMCIKLSAgICAiQHR5cGVzY3JpcHQtZXNsaW50L3Zpc2l0b3Ita2V5cyIgIjQuMzMuMCIKLSAgICBkZWJ1ZyAiXjQuMy4xIgotICAgIGdsb2JieSAiXjExLjAuMyIKLSAgICBpcy1nbG9iICJeNC4wLjEiCi0gICAgc2VtdmVyICJeNy4zLjUiCi0gICAgdHN1dGlscyAiXjMuMjEuMCIKLQotIkB0eXBlc2NyaXB0LWVzbGludC92aXNpdG9yLWtleXNANC4zMy4wIjoKLSAgdmVyc2lvbiAiNC4zMy4wIgotICByZXNvbHZlZCAiaHR0cHM6Ly9yZWdpc3RyeS55YXJucGtnLmNvbS9AdHlwZXNjcmlwdC1lc2xpbnQvdmlzaXRvci1rZXlzLy0vdmlzaXRvci1rZXlzLTQuMzMuMC50Z3ojMmEyMmY3N2E0MTYwNDI4OWI3YTE4NjU4NmU5ZWM0OGNhOTJlZjFkZCIKLSAgaW50ZWdyaXR5IHNoYTUxMi11cWkvMmFTejlnMmZ0Y0hXZjh1TFBKQTcwclV2Nnl1TVc1Qm9odytid2N1emF4UUlIYUtGWkNLR29HWElyYzl2a1RKMyswdHhNNzNLMEhxM2Q1d2dJZz09Ci0gIGRlcGVuZGVuY2llczoKLSAgICAiQHR5cGVzY3JpcHQtZXNsaW50L3R5cGVzIiAiNC4zMy4wIgotICAgIGVzbGludC12aXNpdG9yLWtleXMgIl4yLjAuMCIKLQotYWNvcm4tanN4QF41LjMuMToKK2Fjb3JuLWpzeEBeNS4zLjI6CiAgIHZlcnNpb24gIjUuMy4yIgogICByZXNvbHZlZCAiaHR0cHM6Ly9yZWdpc3RyeS55YXJucGtnLmNvbS9hY29ybi1qc3gvLS9hY29ybi1qc3gtNS4zLjIudGd6IzdlZDViYjU1OTA4YjNiMmYxYmM1NWM2YWYxNjUzYmFkYTdmMDc5MzciCiAgIGludGVncml0eSBzaGE1MTItcnE5cytKTmhmMElDaGp0RFh4bGxKN2c0MW9aazVTbFh0cDBMSHd5QTVjZWp3bjd2S21LcDRwUHJpNllFZVB2MlBVNjVzQXNlZ2JYdElpbm1ERkRYZ1E9PQogCi1hY29ybkBeNy40LjA6Ci0gIHZlcnNpb24gIjcuNC4xIgotICByZXNvbHZlZCAiaHR0cHM6Ly9yZWdpc3RyeS55YXJucGtnLmNvbS9hY29ybi8tL2Fjb3JuLTcuNC4xLnRneiNmZWFlZDI1NTk3M2QyZTc3NTU1YjgzZGJjMDg4NTFhNmM2MzUyMGZhIgotICBpbnRlZ3JpdHkgc2hhNTEyLW5ReXAwbzEvbU5kYlRPMVBPNmtIa3dTcm1nWjBNVC9qQ0NwTml3YlVqR29STjRkbEJocUp0b1F1Q25FT0t6Z1RWd2cwWldpQ29ReTZTeE1lYlFWaDhBPT0KK2Fjb3JuQF44LjguMDoKKyAgdmVyc2lvbiAiOC44LjAiCisgIHJlc29sdmVkICJodHRwczovL3JlZ2lzdHJ5Lnlhcm5wa2cuY29tL2Fjb3JuLy0vYWNvcm4tOC44LjAudGd6Izg4YzAxODc2MjA0MzVjN2Y2MDE1ODAzZjU1MzlkYWUwNWE5ZGJlYTgiCisgIGludGVncml0eSBzaGE1MTItUU94eWlnUFZycFoyR1hUK1BGeVpUbDZUdE9GYzVlZ3hISVA5SWxRK1JidXBRdVg0UmtUL0JlZTQva1F1QzAyWGt6Zzg0SmNUN29MWXRESVF4cCt2N3c9PQogCiBhanZAXjYuMTAuMCwgYWp2QF42LjEyLjQ6CiAgIHZlcnNpb24gIjYuMTIuNiIKQEAgLTI1NCw1NyArMjU0LDI4IEBACiAgICAganNvbi1zY2hlbWEtdHJhdmVyc2UgIl4wLjQuMSIKICAgICB1cmktanMgIl40LjIuMiIKIAotYWp2QF44LjAuMToKLSAgdmVyc2lvbiAiOC4xMC4wIgotICByZXNvbHZlZCAiaHR0cHM6Ly9yZWdpc3RyeS55YXJucGtnLmNvbS9hanYvLS9hanYtOC4xMC4wLnRneiNlNTczZjcxOWJkM2FmMDY5MDE3ZTNiNjY1MzhhYjk2OGQwNDBlNTRkIgotICBpbnRlZ3JpdHkgc2hhNTEyLWJ6cUFFWk9qa3JVTWwyYWZIOGRrbnJxNUtFazJTcndkQlJPUit2SDFFS1ZRVHFhVWJKVlBkYy9nRWRnZ1RNTTBTZStzK0phNGp1NFRsTmNTdEtsMkh3PT0KLSAgZGVwZW5kZW5jaWVzOgotICAgIGZhc3QtZGVlcC1lcXVhbCAiXjMuMS4xIgotICAgIGpzb24tc2NoZW1hLXRyYXZlcnNlICJeMS4wLjAiCi0gICAgcmVxdWlyZS1mcm9tLXN0cmluZyAiXjIuMC4yIgotICAgIHVyaS1qcyAiXjQuMi4yIgotCi1hbnNpLWNvbG9yc0BeNC4xLjE6Ci0gIHZlcnNpb24gIjQuMS4xIgotICByZXNvbHZlZCAiaHR0cHM6Ly9yZWdpc3RyeS55YXJucGtnLmNvbS9hbnNpLWNvbG9ycy8tL2Fuc2ktY29sb3JzLTQuMS4xLnRneiNjYmI5YWUyNTZiZjc1MGFmMWVhYjM0NGYyMjlhYTI3ZmU5NGJhMzQ4IgotICBpbnRlZ3JpdHkgc2hhNTEyLUpvWDBhcEdiSGFVSkJObDZ5RitwNkpBRllaNjY2L2hoQ0dLTjV0OVFGamJKUUtVVS9nOE1OYkZEYnZmcmdLWHZJMVFwWnBsUE9ud0lvOTlsWC9BQW1BPT0KLQogYW5zaS1yZWdleEBeNS4wLjE6CiAgIHZlcnNpb24gIjUuMC4xIgogICByZXNvbHZlZCAiaHR0cHM6Ly9yZWdpc3RyeS55YXJucGtnLmNvbS9hbnNpLXJlZ2V4Ly0vYW5zaS1yZWdleC01LjAuMS50Z3ojMDgyY2IyYzg5YzlmZTg2NTlhMzExYTUzYmQ2YTRkYzUzMDFkYjMwNCIKICAgaW50ZWdyaXR5IHNoYTUxMi1xdUpRWGxUU1VHTDJMSDlTVVhvOFZ3c1k0c29hbmhnbzZMTlNtODRFMUxCY0U4czNPMHdwZGlSenlSOXovWlpKTWxNV3YzN3FPT2I5cGRKbE1VRUtGUT09CiAKLWFuc2ktc3R5bGVzQF4zLjIuMToKLSAgdmVyc2lvbiAiMy4yLjEiCi0gIHJlc29sdmVkICJodHRwczovL3JlZ2lzdHJ5Lnlhcm5wa2cuY29tL2Fuc2ktc3R5bGVzLy0vYW5zaS1zdHlsZXMtMy4yLjEudGd6IzQxZmJiMjAyNDNlNTBiMTJiZTBmMDRiOGRlZGJmMDc1MjBjZTg0MWQiCi0gIGludGVncml0eSBzaGE1MTItVlQwWkk2a1pSZFRoOFl5SnczU01iWW0vdStOcWZzQXhFcFdPMFBmOXNxOC9lOTRXeHhPcFBLeDlGUjFGbHlDdE9WRE5PUSs4bnRscUZ4aVJjK3I1cUE9PQotICBkZXBlbmRlbmNpZXM6Ci0gICAgY29sb3ItY29udmVydCAiXjEuOS4wIgotCi1hbnNpLXN0eWxlc0BeNC4wLjAsIGFuc2ktc3R5bGVzQF40LjEuMDoKK2Fuc2ktc3R5bGVzQF40LjEuMDoKICAgdmVyc2lvbiAiNC4zLjAiCiAgIHJlc29sdmVkICJodHRwczovL3JlZ2lzdHJ5Lnlhcm5wa2cuY29tL2Fuc2ktc3R5bGVzLy0vYW5zaS1zdHlsZXMtNC4zLjAudGd6I2VkZDgwMzYyOGFlNzFjMDRjODVhZTdhMDkwNmVkYWQzNGI2NDg5MzciCiAgIGludGVncml0eSBzaGE1MTItemJCOXJDSkFUMXJiamlWRGIyaHFLRkhOWUx4Z3RrOE5VUnhaM0lad0QzRjZOdHhiWFpRQ25uU2kxTGt4K0lEb2hkUGxGcDIyMndWQUxJaGVaSlFTRWc9PQogICBkZXBlbmRlbmNpZXM6CiAgICAgY29sb3ItY29udmVydCAiXjIuMC4xIgogCi1hcmdwYXJzZUBeMS4wLjc6Ci0gIHZlcnNpb24gIjEuMC4xMCIKLSAgcmVzb2x2ZWQgImh0dHBzOi8vcmVnaXN0cnkueWFybnBrZy5jb20vYXJncGFyc2UvLS9hcmdwYXJzZS0xLjAuMTAudGd6I2JjZDY3OTFlYTVhZTA5NzI1ZTE3ZTVhZDk4ODEzNGNkNDBiM2Q5MTEiCi0gIGludGVncml0eSBzaGE1MTItbzVSb3k2dE5HNFNML0ZPa0NBTjZSemppYWtaUzI1UkxZRnJjTXR0SnFiZGQ4QldybkErZkd6NTdpTjVQYjA2cHZCR3ZsNWdRMEI0OGRKbHNsWHZvVGc9PQotICBkZXBlbmRlbmNpZXM6Ci0gICAgc3ByaW50Zi1qcyAifjEuMC4yIgorYXJncGFyc2VAXjIuMC4xOgorICB2ZXJzaW9uICIyLjAuMSIKKyAgcmVzb2x2ZWQgImh0dHBzOi8vcmVnaXN0cnkueWFybnBrZy5jb20vYXJncGFyc2UvLS9hcmdwYXJzZS0yLjAuMS50Z3ojMjQ2ZjUwZjNjYTc4YTMyNDBmNmM5OTdlOGE5YmQxZWFjNDllNGIzOCIKKyAgaW50ZWdyaXR5IHNoYTUxMi04KzlXcWViYkZ6cFg5T1IrV2E2TzI5YXNJb2dlUk16Y0d0QUlOZHBNSEh5QWcxMGYwNWFTRlZCYmNFcUdmL1BYdzFFakFaK3EyL2JFQmczRHZ1ckszUT09CiAKIGFycmF5LXVuaW9uQF4yLjEuMDoKICAgdmVyc2lvbiAiMi4xLjAiCiAgIHJlc29sdmVkICJodHRwczovL3JlZ2lzdHJ5Lnlhcm5wa2cuY29tL2FycmF5LXVuaW9uLy0vYXJyYXktdW5pb24tMi4xLjAudGd6I2I3OTg0MjBhZGJlYjFkZTgyOGQ4NGFjZDhhMmUyM2QzZWZlODVlOGQiCiAgIGludGVncml0eSBzaGE1MTItSEd5eG9PVFlVeUNNNnN0VWU2RUpnbmQ0RW9ld0FJN3pNZGZxTytrR2pubFptQkR6L2NSNXBmOHIvY1I0V3E2MHNML3AwSWtjalVFRVB3UzNHRnJJeXc9PQogCi1hc3RyYWwtcmVnZXhAXjIuMC4wOgotICB2ZXJzaW9uICIyLjAuMCIKLSAgcmVzb2x2ZWQgImh0dHBzOi8vcmVnaXN0cnkueWFybnBrZy5jb20vYXN0cmFsLXJlZ2V4Ly0vYXN0cmFsLXJlZ2V4LTIuMC4wLnRneiM0ODMxNDNjNTY3YWVlZDQ3ODU3NTljMDg2NTc4NmRjNzdkN2QyZTMxIgotICBpbnRlZ3JpdHkgc2hhNTEyLVo3dE13MXl0VFh0NWpxTWNPUCtPUXRlVTFWdU5LOVkwMnV1SnRLUTFTdjY5alhRS0tnNWNpYkx3R0pvdzh5elpQK2VBYzE4RW1MR1BhbDBicDM2cnZRPT0KLQogYmFsYW5jZWQtbWF0Y2hAXjEuMC4wOgogICB2ZXJzaW9uICIxLjAuMiIKICAgcmVzb2x2ZWQgImh0dHBzOi8vcmVnaXN0cnkueWFybnBrZy5jb20vYmFsYW5jZWQtbWF0Y2gvLS9iYWxhbmNlZC1tYXRjaC0xLjAuMi50Z3ojZTgzZTNhN2UzZjMwMGIzNGNiOWQ4N2Y2MTVmYTBjYmYzNTc2OTBlZSIKQEAgLTMxOCw3ICsyODksNyBAQAogICAgIGJhbGFuY2VkLW1hdGNoICJeMS4wLjAiCiAgICAgY29uY2F0LW1hcCAiMC4wLjEiCiAKLWJyYWNlc0BeMy4wLjE6CiticmFjZXNAXjMuMC4yOgogICB2ZXJzaW9uICIzLjAuMiIKICAgcmVzb2x2ZWQgImh0dHBzOi8vcmVnaXN0cnkueWFybnBrZy5jb20vYnJhY2VzLy0vYnJhY2VzLTMuMC4yLnRneiMzNDU0ZTFhNDYyZWU4ZDU5OWUyMzZkZjMzNmNkOWVhNGY4YWZlMTA3IgogICBpbnRlZ3JpdHkgc2hhNTEyLWI4dW0rTDFSek0zV0RTenZobTZnSXoxeWZUYkJ0NllUbGNFS0F2c21xQ1paRnc0Nno2MjZsVmo5ajF5RVBXMzNINUgrbEJRcFpNUDFrOGwrNzhIYTBBPT0KQEAgLTMzNSwxNSArMzA2LDYgQEAKICAgcmVzb2x2ZWQgImh0dHBzOi8vcmVnaXN0cnkueWFybnBrZy5jb20vY2FsbHNpdGVzLy0vY2FsbHNpdGVzLTMuMS4wLnRneiNiMzYzMGFiZDg5NDM0MzJmNTRiM2YwNTE5MjM4ZTMzY2Q3ZGYyZjczIgogICBpbnRlZ3JpdHkgc2hhNTEyLVA4QmpBc1h2WlMrVklEVUkxMWhIQ1FFdjc0WVQ2N1lVaTVKSkZOV0lxTDIzNXNCbWpYNCtxeDlNdXZsczVpdnlORU5jdHg0NnhRTFEzYVR1RTdzc2FRPT0KIAotY2hhbGtAXjIuMC4wOgotICB2ZXJzaW9uICIyLjQuMiIKLSAgcmVzb2x2ZWQgImh0dHBzOi8vcmVnaXN0cnkueWFybnBrZy5jb20vY2hhbGsvLS9jaGFsay0yLjQuMi50Z3ojY2Q0MjU0MTY3N2E1NDMzM2NmNTQxYTQ5MTA4YzE0MzJiNDRjOTQyNCIKLSAgaW50ZWdyaXR5IHNoYTUxMi1NdGkrZjlscEpOY3dGNHRXVjgvT3JUVHRGMWdaaStmOEZxbHlBZG91cmFsY0ZXRlFXRjIrTmdDSFNoamtDYitJRkJMcTlidVp3RTF4Y2tRVTRwZVN1UT09Ci0gIGRlcGVuZGVuY2llczoKLSAgICBhbnNpLXN0eWxlcyAiXjMuMi4xIgotICAgIGVzY2FwZS1zdHJpbmctcmVnZXhwICJeMS4wLjUiCi0gICAgc3VwcG9ydHMtY29sb3IgIl41LjMuMCIKLQogY2hhbGtAXjQuMC4wOgogICB2ZXJzaW9uICI0LjEuMiIKICAgcmVzb2x2ZWQgImh0dHBzOi8vcmVnaXN0cnkueWFybnBrZy5jb20vY2hhbGsvLS9jaGFsay00LjEuMi50Z3ojYWFjNGUyYjc3MzRhNzQwODY3YWViMTZiZjAyYWFkNTU2YTFlN2EwMSIKQEAgLTM1MiwxMyArMzE0LDYgQEAKICAgICBhbnNpLXN0eWxlcyAiXjQuMS4wIgogICAgIHN1cHBvcnRzLWNvbG9yICJeNy4xLjAiCiAKLWNvbG9yLWNvbnZlcnRAXjEuOS4wOgotICB2ZXJzaW9uICIxLjkuMyIKLSAgcmVzb2x2ZWQgImh0dHBzOi8vcmVnaXN0cnkueWFybnBrZy5jb20vY29sb3ItY29udmVydC8tL2NvbG9yLWNvbnZlcnQtMS45LjMudGd6I2JiNzE4NTA2OTBlMWYxMzY1NjdkZTYyOWQyZDU0NzFkZWRhNGMxZTgiCi0gIGludGVncml0eSBzaGE1MTItUWZBVXRkK3ZGZEF0RlFjQzhDQ3lZdDFmWVd4U3FBaUsyY1NENnpEQjhOM2Nwc0VCQXZSeHA5ek9HZzZHL1NISEpZQVQ4OC9hei9JdURHQUxzTlZiR2c9PQotICBkZXBlbmRlbmNpZXM6Ci0gICAgY29sb3ItbmFtZSAiMS4xLjMiCi0KIGNvbG9yLWNvbnZlcnRAXjIuMC4xOgogICB2ZXJzaW9uICIyLjAuMSIKICAgcmVzb2x2ZWQgImh0dHBzOi8vcmVnaXN0cnkueWFybnBrZy5jb20vY29sb3ItY29udmVydC8tL2NvbG9yLWNvbnZlcnQtMi4wLjEudGd6IzcyZDNhNjhkNTk4YzliZGIzYWYyYWQxZTg0ZjIxZDg5NmFiZDRkZTMiCkBAIC0zNjYsMTEgKzMyMSw2IEBACiAgIGRlcGVuZGVuY2llczoKICAgICBjb2xvci1uYW1lICJ+MS4xLjQiCiAKLWNvbG9yLW5hbWVAMS4xLjM6Ci0gIHZlcnNpb24gIjEuMS4zIgotICByZXNvbHZlZCAiaHR0cHM6Ly9yZWdpc3RyeS55YXJucGtnLmNvbS9jb2xvci1uYW1lLy0vY29sb3ItbmFtZS0xLjEuMy50Z3ojYTdkMDU1OGJkODljNDJmNzk1ZGQ0MjMyOGY3NDA4MzFjYTUzYmMyNSIKLSAgaW50ZWdyaXR5IHNoYTEtcDlCVmk5aWNRdmVWM1VJeWozUUlNY3BUdkNVPQotCiBjb2xvci1uYW1lQH4xLjEuNDoKICAgdmVyc2lvbiAiMS4xLjQiCiAgIHJlc29sdmVkICJodHRwczovL3JlZ2lzdHJ5Lnlhcm5wa2cuY29tL2NvbG9yLW5hbWUvLS9jb2xvci1uYW1lLTEuMS40LnRneiNjMmEwOWE4N2FjYmRlNjk1NDNkZTZmNjNmYTM5OTVjODI2YzUzNmEyIgpAQCAtMzc5LDcgKzMyOSw3IEBACiBjb25jYXQtbWFwQDAuMC4xOgogICB2ZXJzaW9uICIwLjAuMSIKICAgcmVzb2x2ZWQgImh0dHBzOi8vcmVnaXN0cnkueWFybnBrZy5jb20vY29uY2F0LW1hcC8tL2NvbmNhdC1tYXAtMC4wLjEudGd6I2Q4YTk2YmQ3N2ZkNjhkZjc3OTNhNzMwMzZhM2JhMGQ1NDA1ZDQ3N2IiCi0gIGludGVncml0eSBzaGExLTJLbHIxMy9XamZkNU9uTURhanVnMVVCZFIzcz0KKyAgaW50ZWdyaXR5IHNoYTUxMi0vU3J2NGRzd3lRTkJmb2hHcHo5bzZZYjNHejNTclVEcUJINXJUdWhHUjdhaHRsYllLblZ4dzJiQ0ZNUmxqYUE3RVhIYVhaOHdzSGRvZEZ2YmtoS21xZz09CiAKIGNyb3NzLXNwYXduQF43LjAuMjoKICAgdmVyc2lvbiAiNy4wLjMiCkBAIC0zOTAsMTAgKzM0MCwxMCBAQAogICAgIHNoZWJhbmctY29tbWFuZCAiXjIuMC4wIgogICAgIHdoaWNoICJeMi4wLjEiCiAKLWRlYnVnQF40LjAuMSwgZGVidWdAXjQuMS4xLCBkZWJ1Z0BeNC4zLjE6Ci0gIHZlcnNpb24gIjQuMy4zIgotICByZXNvbHZlZCAiaHR0cHM6Ly9yZWdpc3RyeS55YXJucGtnLmNvbS9kZWJ1Zy8tL2RlYnVnLTQuMy4zLnRneiMwNDI2NmUwYjcwYTk4ZDQ0NjJlNmUyODhlMzgyNTkyMTMzMzJiNjY0IgotICBpbnRlZ3JpdHkgc2hhNTEyLS96eHc1K3ZoMVRmdis0UW43YTVuc2JjSktQYVN2Q0Rob2puNkZFbDl2dXB3SzJWQ1NEdEVpRXRxcjhERnR6WUZPZHo2M0xCa3hlYzdEWXVjMmpvbjZRPT0KK2RlYnVnQF40LjEuMSwgZGVidWdAXjQuMy4yLCBkZWJ1Z0BeNC4zLjQ6CisgIHZlcnNpb24gIjQuMy40IgorICByZXNvbHZlZCAiaHR0cHM6Ly9yZWdpc3RyeS55YXJucGtnLmNvbS9kZWJ1Zy8tL2RlYnVnLTQuMy40LnRneiMxMzE5ZjY1NzkzNTdmMjMzOGQzMzM3ZDJjZGQ0OTE0YmI1ZGNjODY1IgorICBpbnRlZ3JpdHkgc2hhNTEyLVBSV0ZIdVNVM2VEdFFKUHZuTlk3SmNrZXQxajB0NU91T3NGelBQenNla0Q1MlpsOHFVZkZJUEVpc3dYcUl2SFdHVkhPZ1grN0cvdkNOTmhlaHd4ZmtRPT0KICAgZGVwZW5kZW5jaWVzOgogICAgIG1zICIyLjEuMiIKIApAQCAtNDE2LDIzICszNjYsNiBAQAogICBkZXBlbmRlbmNpZXM6CiAgICAgZXN1dGlscyAiXjIuMC4yIgogCi1lbW9qaS1yZWdleEBeOC4wLjA6Ci0gIHZlcnNpb24gIjguMC4wIgotICByZXNvbHZlZCAiaHR0cHM6Ly9yZWdpc3RyeS55YXJucGtnLmNvbS9lbW9qaS1yZWdleC8tL2Vtb2ppLXJlZ2V4LTguMC4wLnRneiNlODE4ZmQ2OWNlNWNjZmNiNDA0NTk0Zjg0Mjk2M2JmNTMxNjRjYzM3IgotICBpbnRlZ3JpdHkgc2hhNTEyLU1Tall6Y1dOT0EwZXdBSHB6ME14cFlGdndnNnlqeTFORzN4dGVvcXo2NDRWQ28vUlBnbnIxL0dHdCtpYzNpSlR6UThFdTNUZE0xNFNhd25WVW1HRTZBPT0KLQotZW5xdWlyZXJAXjIuMy41OgotICB2ZXJzaW9uICIyLjMuNiIKLSAgcmVzb2x2ZWQgImh0dHBzOi8vcmVnaXN0cnkueWFybnBrZy5jb20vZW5xdWlyZXIvLS9lbnF1aXJlci0yLjMuNi50Z3ojMmE3ZmU1ZGQ2MzRhMWU0MTI1YTk3NWVjOTk0ZmY1NDU2ZGMzNzM0ZCIKLSAgaW50ZWdyaXR5IHNoYTUxMi15ak5uUHIzMTUvRmpTNHpJc1V4WWd1WVVQUDJlMU5LNGQ3RTdaT0xpeVlDY2JGQmlUTXlJRCsyd3ZtMnc2K3BaL29kTUE3Y1JramhzUGJsdHdCT3JMZz09Ci0gIGRlcGVuZGVuY2llczoKLSAgICBhbnNpLWNvbG9ycyAiXjQuMS4xIgotCi1lc2NhcGUtc3RyaW5nLXJlZ2V4cEBeMS4wLjU6Ci0gIHZlcnNpb24gIjEuMC41IgotICByZXNvbHZlZCAiaHR0cHM6Ly9yZWdpc3RyeS55YXJucGtnLmNvbS9lc2NhcGUtc3RyaW5nLXJlZ2V4cC8tL2VzY2FwZS1zdHJpbmctcmVnZXhwLTEuMC41LnRneiMxYjYxYzA1NjIxOTBhOGRmZjZhZTNiYjJjZjAyMDBjYTEzMGI4NmQ0IgotICBpbnRlZ3JpdHkgc2hhMS1HMkhBVmlHUXFOLzJyanV5endJQXloTUxodFE9Ci0KIGVzY2FwZS1zdHJpbmctcmVnZXhwQF40LjAuMDoKICAgdmVyc2lvbiAiNC4wLjAiCiAgIHJlc29sdmVkICJodHRwczovL3JlZ2lzdHJ5Lnlhcm5wa2cuY29tL2VzY2FwZS1zdHJpbmctcmVnZXhwLy0vZXNjYXBlLXN0cmluZy1yZWdleHAtNC4wLjAudGd6IzE0YmE4M2E1ZDM3M2UzZDMxMWU1YWZjYTI5Y2Y1YmZhZDk2NWJmMzQiCkBAIC00NDYsMTIgKzM3OSwxMyBAQAogICAgIGVzcmVjdXJzZSAiXjQuMy4wIgogICAgIGVzdHJhdmVyc2UgIl40LjEuMSIKIAotZXNsaW50LXV0aWxzQF4yLjEuMDoKLSAgdmVyc2lvbiAiMi4xLjAiCi0gIHJlc29sdmVkICJodHRwczovL3JlZ2lzdHJ5Lnlhcm5wa2cuY29tL2VzbGludC11dGlscy8tL2VzbGludC11dGlscy0yLjEuMC50Z3ojZDJkZTVlMDM0MjRlNzA3ZGMxMGM3NDA2OGRkZWRhZTcwODc0MWIyNyIKLSAgaW50ZWdyaXR5IHNoYTUxMi13OTRkUVlvYXV5dmxEYzQzWG5HQjhsVTNadDcxM3ZOQ2hndDRFV3doWEFQMlhrQnZuZGZ4RjBBZ0lxS09PYXNqUElQemo5SnFnd2t3YkNZRDAvVjNaZz09Citlc2xpbnQtc2NvcGVAXjcuMS4xOgorICB2ZXJzaW9uICI3LjEuMSIKKyAgcmVzb2x2ZWQgImh0dHBzOi8vcmVnaXN0cnkueWFybnBrZy5jb20vZXNsaW50LXNjb3BlLy0vZXNsaW50LXNjb3BlLTcuMS4xLnRneiNmZmYzNDg5NGMyZjY1ZTUyMjZkMzA0MWFjNDgwYjQ1MTNhMTYzNjQyIgorICBpbnRlZ3JpdHkgc2hhNTEyLVFLUU0vVVhwSWlIY0xxSjVBT3lJVzdYWm16amt6UVhZRTU0bjErK3diMHU5Vi9hYlczbDl1UW54WDhaNVhkMTh4eUtJTVRVQXlRMGsxZThwejZMVXJ3PT0KICAgZGVwZW5kZW5jaWVzOgotICAgIGVzbGludC12aXNpdG9yLWtleXMgIl4xLjEuMCIKKyAgICBlc3JlY3Vyc2UgIl40LjMuMCIKKyAgICBlc3RyYXZlcnNlICJeNS4yLjAiCiAKIGVzbGludC11dGlsc0BeMy4wLjA6CiAgIHZlcnNpb24gIjMuMC4wIgpAQCAtNDYwLDc1ICszOTQsNjkgQEAKICAgZGVwZW5kZW5jaWVzOgogICAgIGVzbGludC12aXNpdG9yLWtleXMgIl4yLjAuMCIKIAotZXNsaW50LXZpc2l0b3Ita2V5c0BeMS4xLjAsIGVzbGludC12aXNpdG9yLWtleXNAXjEuMy4wOgotICB2ZXJzaW9uICIxLjMuMCIKLSAgcmVzb2x2ZWQgImh0dHBzOi8vcmVnaXN0cnkueWFybnBrZy5jb20vZXNsaW50LXZpc2l0b3Ita2V5cy8tL2VzbGludC12aXNpdG9yLWtleXMtMS4zLjAudGd6IzMwZWJkMWVmN2MyZmRmZjAxYzNhNGYxNTEwNDRhZjI1ZmFiMDUyM2UiCi0gIGludGVncml0eSBzaGE1MTItNko3Mk44VU5hNDYyd2EvS0ZPRHQvUEozSVU2MFNEcEMzUVhDMUhqYzFCWFhwZkwyQzlSNStBVTdqaGUwRjZHUkVxVk1oNEp1dStOWTd4bis2ZGlwVVE9PQotCiBlc2xpbnQtdmlzaXRvci1rZXlzQF4yLjAuMDoKICAgdmVyc2lvbiAiMi4xLjAiCiAgIHJlc29sdmVkICJodHRwczovL3JlZ2lzdHJ5Lnlhcm5wa2cuY29tL2VzbGludC12aXNpdG9yLWtleXMvLS9lc2xpbnQtdmlzaXRvci1rZXlzLTIuMS4wLnRneiNmNjUzMjgyNTkzMDU5MjczOTJjOTM4ZWQ0NGViMGE1YzliMmJkMzAzIgogICBpbnRlZ3JpdHkgc2hhNTEyLTByU21SQnpYZ0R6SXNENm1HZEpnZXZ6Z2V6STUzNENlcjVML3Z5TVgwa0h6VC9qaUI0M2pSaGQ5WVVsTUdZTFF5Mnpwck5tb1Q4cWFzQ0d0WStRYUt3PT0KIAotZXNsaW50QF43LjE3LjA6Ci0gIHZlcnNpb24gIjcuMzIuMCIKLSAgcmVzb2x2ZWQgImh0dHBzOi8vcmVnaXN0cnkueWFybnBrZy5jb20vZXNsaW50Ly0vZXNsaW50LTcuMzIuMC50Z3ojYzZkMzI4YTE0YmUzZmIwOGM4ZDFkMjFlMTJjMDJmZGI3YTJhODEyZCIKLSAgaW50ZWdyaXR5IHNoYTUxMi1WSFo4Z1grRURmeis5N2pHY2d5R0N5UmlhL2RQT2Q2WGg5eVB2OEJsMStTb2FJd0QrYS92bHJPbUdSVXlPWXU3TXdVaGM3Q3hxZWFEWlUxM1M0K0VwQT09Citlc2xpbnQtdmlzaXRvci1rZXlzQF4zLjMuMDoKKyAgdmVyc2lvbiAiMy4zLjAiCisgIHJlc29sdmVkICJodHRwczovL3JlZ2lzdHJ5Lnlhcm5wa2cuY29tL2VzbGludC12aXNpdG9yLWtleXMvLS9lc2xpbnQtdmlzaXRvci1rZXlzLTMuMy4wLnRneiNmNjQ4MGZhNmIxZjMwZWZlMmQxOTY4YWE4YWM3NDViODYyNDY5ODI2IgorICBpbnRlZ3JpdHkgc2hhNTEyLW1RK3N1cUtKVnlldXdHWUhBZGpNRnFqQ3lmbDgrTGRueHV5cDNsZGlNQkZLa3Z5dHJYVVpXYWlQQ0VhdjhxREhLdHk0NGJEK3FWMUlQNFQrdyt4WFJBPT0KKworZXNsaW50QF44LjIzLjE6CisgIHZlcnNpb24gIjguMjMuMSIKKyAgcmVzb2x2ZWQgImh0dHBzOi8vcmVnaXN0cnkueWFybnBrZy5jb20vZXNsaW50Ly0vZXNsaW50LTguMjMuMS50Z3ojY2ZkN2IzZjdmZGQwN2RiOGQxNmI0YWMwNTE2YTI5YzhkOGRjYTVkYyIKKyAgaW50ZWdyaXR5IHNoYTUxMi13N0MxSVhDYzZmTnFqcHVZZDB5UGxjVEtLbUhsSEhrdFJrem1CUForN2N2TkJRdWlOangweGFNVGpBSkdDYWZKaFFrckZKb29SRXYwQ3RyVnptSHdxZz09CiAgIGRlcGVuZGVuY2llczoKLSAgICAiQGJhYmVsL2NvZGUtZnJhbWUiICI3LjEyLjExIgotICAgICJAZXNsaW50L2VzbGludHJjIiAiXjAuNC4zIgotICAgICJAaHVtYW53aG9jb2Rlcy9jb25maWctYXJyYXkiICJeMC41LjAiCisgICAgIkBlc2xpbnQvZXNsaW50cmMiICJeMS4zLjIiCisgICAgIkBodW1hbndob2NvZGVzL2NvbmZpZy1hcnJheSIgIl4wLjEwLjQiCisgICAgIkBodW1hbndob2NvZGVzL2dpdGlnbm9yZS10by1taW5pbWF0Y2giICJeMS4wLjIiCisgICAgIkBodW1hbndob2NvZGVzL21vZHVsZS1pbXBvcnRlciIgIl4xLjAuMSIKICAgICBhanYgIl42LjEwLjAiCiAgICAgY2hhbGsgIl40LjAuMCIKICAgICBjcm9zcy1zcGF3biAiXjcuMC4yIgotICAgIGRlYnVnICJeNC4wLjEiCisgICAgZGVidWcgIl40LjMuMiIKICAgICBkb2N0cmluZSAiXjMuMC4wIgotICAgIGVucXVpcmVyICJeMi4zLjUiCiAgICAgZXNjYXBlLXN0cmluZy1yZWdleHAgIl40LjAuMCIKLSAgICBlc2xpbnQtc2NvcGUgIl41LjEuMSIKLSAgICBlc2xpbnQtdXRpbHMgIl4yLjEuMCIKLSAgICBlc2xpbnQtdmlzaXRvci1rZXlzICJeMi4wLjAiCi0gICAgZXNwcmVlICJeNy4zLjEiCisgICAgZXNsaW50LXNjb3BlICJeNy4xLjEiCisgICAgZXNsaW50LXV0aWxzICJeMy4wLjAiCisgICAgZXNsaW50LXZpc2l0b3Ita2V5cyAiXjMuMy4wIgorICAgIGVzcHJlZSAiXjkuNC4wIgogICAgIGVzcXVlcnkgIl4xLjQuMCIKICAgICBlc3V0aWxzICJeMi4wLjIiCiAgICAgZmFzdC1kZWVwLWVxdWFsICJeMy4xLjMiCiAgICAgZmlsZS1lbnRyeS1jYWNoZSAiXjYuMC4xIgotICAgIGZ1bmN0aW9uYWwtcmVkLWJsYWNrLXRyZWUgIl4xLjAuMSIKLSAgICBnbG9iLXBhcmVudCAiXjUuMS4yIgotICAgIGdsb2JhbHMgIl4xMy42LjAiCi0gICAgaWdub3JlICJeNC4wLjYiCisgICAgZmluZC11cCAiXjUuMC4wIgorICAgIGdsb2ItcGFyZW50ICJeNi4wLjEiCisgICAgZ2xvYmFscyAiXjEzLjE1LjAiCisgICAgZ2xvYmJ5ICJeMTEuMS4wIgorICAgIGdyYXBoZW1lLXNwbGl0dGVyICJeMS4wLjQiCisgICAgaWdub3JlICJeNS4yLjAiCiAgICAgaW1wb3J0LWZyZXNoICJeMy4wLjAiCiAgICAgaW11cm11cmhhc2ggIl4wLjEuNCIKICAgICBpcy1nbG9iICJeNC4wLjAiCi0gICAganMteWFtbCAiXjMuMTMuMSIKKyAgICBqcy1zZHNsICJeNC4xLjQiCisgICAganMteWFtbCAiXjQuMS4wIgogICAgIGpzb24tc3RhYmxlLXN0cmluZ2lmeS13aXRob3V0LWpzb25pZnkgIl4xLjAuMSIKICAgICBsZXZuICJeMC40LjEiCiAgICAgbG9kYXNoLm1lcmdlICJeNC42LjIiCi0gICAgbWluaW1hdGNoICJeMy4wLjQiCisgICAgbWluaW1hdGNoICJeMy4xLjIiCiAgICAgbmF0dXJhbC1jb21wYXJlICJeMS40LjAiCiAgICAgb3B0aW9uYXRvciAiXjAuOS4xIgotICAgIHByb2dyZXNzICJeMi4wLjAiCi0gICAgcmVnZXhwcCAiXjMuMS4wIgotICAgIHNlbXZlciAiXjcuMi4xIgotICAgIHN0cmlwLWFuc2kgIl42LjAuMCIKKyAgICByZWdleHBwICJeMy4yLjAiCisgICAgc3RyaXAtYW5zaSAiXjYuMC4xIgogICAgIHN0cmlwLWpzb24tY29tbWVudHMgIl4zLjEuMCIKLSAgICB0YWJsZSAiXjYuMC45IgogICAgIHRleHQtdGFibGUgIl4wLjIuMCIKLSAgICB2OC1jb21waWxlLWNhY2hlICJeMi4wLjMiCiAKLWVzcHJlZUBeNy4zLjAsIGVzcHJlZUBeNy4zLjE6Ci0gIHZlcnNpb24gIjcuMy4xIgotICByZXNvbHZlZCAiaHR0cHM6Ly9yZWdpc3RyeS55YXJucGtnLmNvbS9lc3ByZWUvLS9lc3ByZWUtNy4zLjEudGd6I2YyZGYzMzBiNzUyYzZmNTUwMTlmOGJkODliNzY2MDAzOWMxYmJiYjYiCi0gIGludGVncml0eSBzaGE1MTItdjNKQ05DRTY0dW1rRnBta0ZHcXpWS3NPVDB0TjFacit1ZXFMWmZwVjFPYjhlK0NFZ1BXYStPeENvR0gzdG5oaW1NS0lhQm00bS92YVJwSi9rclJ6Mmc9PQorZXNwcmVlQF45LjQuMDoKKyAgdmVyc2lvbiAiOS40LjAiCisgIHJlc29sdmVkICJodHRwczovL3JlZ2lzdHJ5Lnlhcm5wa2cuY29tL2VzcHJlZS8tL2VzcHJlZS05LjQuMC50Z3ojY2Q0YmMzZDZlOTMzNmM0MzMyNjVmYzBhYTAxNmZjMWFhZjE4MmY4YSIKKyAgaW50ZWdyaXR5IHNoYTUxMi1EUW1uUnBMajdmNlRnTi9OWWIwTVR6SlhMK3ZKRjloM3BIeTRKaENJczN6d2NnZXo4eG1HZzNzWEhjRU85N0JybU8yT1N2Q3dNZGZkbHlsK0U5S2pPdz09CiAgIGRlcGVuZGVuY2llczoKLSAgICBhY29ybiAiXjcuNC4wIgotICAgIGFjb3JuLWpzeCAiXjUuMy4xIgotICAgIGVzbGludC12aXNpdG9yLWtleXMgIl4xLjMuMCIKLQotZXNwcmltYUBeNC4wLjA6Ci0gIHZlcnNpb24gIjQuMC4xIgotICByZXNvbHZlZCAiaHR0cHM6Ly9yZWdpc3RyeS55YXJucGtnLmNvbS9lc3ByaW1hLy0vZXNwcmltYS00LjAuMS50Z3ojMTNiMDRjZGIzZTZjNWQxOWRmOTFhYjY5ODdhODY5NTYxOWIwYWE3MSIKLSAgaW50ZWdyaXR5IHNoYTUxMi1lR3VGRnc3VXBkYStnNHArUUh2blcwUnlUWC9TVmVKQkRNL2dDdE1BUk8wY0x1VDJIY0VLblRQdmhqVjZhR2VxckNCL3NiTm9wMEtzem0wanNhV1U0QT09CisgICAgYWNvcm4gIl44LjguMCIKKyAgICBhY29ybi1qc3ggIl41LjMuMiIKKyAgICBlc2xpbnQtdmlzaXRvci1rZXlzICJeMy4zLjAiCiAKIGVzcXVlcnlAXjEuNC4wOgogICB2ZXJzaW9uICIxLjQuMCIKQEAgLTU4Myw3ICs1MTEsNyBAQAogZmFzdC1sZXZlbnNodGVpbkBeMi4wLjY6CiAgIHZlcnNpb24gIjIuMC42IgogICByZXNvbHZlZCAiaHR0cHM6Ly9yZWdpc3RyeS55YXJucGtnLmNvbS9mYXN0LWxldmVuc2h0ZWluLy0vZmFzdC1sZXZlbnNodGVpbi0yLjAuNi50Z3ojM2Q4YTVjNjY4ODNhMTZhMzBjYTg2NDNlODUxZjE5YmFhNzc5NzkxNyIKLSAgaW50ZWdyaXR5IHNoYTEtUFlwY1pvZzZGcU1NcUdRK2hSOFp1cWQ1ZVJjPQorICBpbnRlZ3JpdHkgc2hhNTEyLURDWHU2SWZocWNrczdUWktZM0h4cDN5NnFwaFk1U0pabXJXTURyS2NFUlNPWFdRZE1oVTlJZy9QWXJ6eXcvdWw5ak9JeWgwTjRNMHRiQzVob2RnOGR3PT0KIAogZmFzdHFAXjEuNi4wOgogICB2ZXJzaW9uICIxLjEzLjAiCkBAIC02MDYsNiArNTM0LDE0IEBACiAgIGRlcGVuZGVuY2llczoKICAgICB0by1yZWdleC1yYW5nZSAiXjUuMC4xIgogCitmaW5kLXVwQF41LjAuMDoKKyAgdmVyc2lvbiAiNS4wLjAiCisgIHJlc29sdmVkICJodHRwczovL3JlZ2lzdHJ5Lnlhcm5wa2cuY29tL2ZpbmQtdXAvLS9maW5kLXVwLTUuMC4wLnRneiM0YzkyODE5ZWNiNzA4MzU2MWU0ZjRhMjQwYTg2YmU1MTk4ZjUzNmZjIgorICBpbnRlZ3JpdHkgc2hhNTEyLTc4L1BYVDF3bExMRGdUekRzN3NqcTloenowdlhEK3puKzd3eXBFZTRmWFF4Q21kbXFmR3NFUFF4bWlDU1FJM2FqRlY5MWJWU3N2TnRySlJpVzZuR25nPT0KKyAgZGVwZW5kZW5jaWVzOgorICAgIGxvY2F0ZS1wYXRoICJeNi4wLjAiCisgICAgcGF0aC1leGlzdHMgIl40LjAuMCIKKwogZmxhdC1jYWNoZUBeMy4wLjQ6CiAgIHZlcnNpb24gIjMuMC40IgogICByZXNvbHZlZCAiaHR0cHM6Ly9yZWdpc3RyeS55YXJucGtnLmNvbS9mbGF0LWNhY2hlLy0vZmxhdC1jYWNoZS0zLjAuNC50Z3ojNjFiMDMzODMwMmIyZmU5Zjk1N2RjYzMyZmMyYTg3ZjFjMzA0OGIxMSIKQEAgLTYxNSwxOSArNTUxLDI0IEBACiAgICAgcmltcmFmICJeMy4wLjIiCiAKIGZsYXR0ZWRAXjMuMS4wOgotICB2ZXJzaW9uICIzLjIuNSIKLSAgcmVzb2x2ZWQgImh0dHBzOi8vcmVnaXN0cnkueWFybnBrZy5jb20vZmxhdHRlZC8tL2ZsYXR0ZWQtMy4yLjUudGd6Izc2Yzg1ODRmNGZjODQzZGI2NDcwMmE2YmQwNGFiN2E4YmQ2NjZkYTMiCi0gIGludGVncml0eSBzaGE1MTItV0lXR2kyTDNEeVRVdlVyd1JLZ0dpOVR3eFFNVUVxUE9QUUJWaTcxUjk2alpYSmRGc2tYRW1mNTRCb1phUzFra25HT0RvSUdBU0dFekJVWWR5TUNCSmc9PQorICB2ZXJzaW9uICIzLjIuNyIKKyAgcmVzb2x2ZWQgImh0dHBzOi8vcmVnaXN0cnkueWFybnBrZy5jb20vZmxhdHRlZC8tL2ZsYXR0ZWQtMy4yLjcudGd6IzYwOWYzOTIwN2NiNjE0Yjg5ZDA3NjViNDc3Y2IyZDQzN2ZiZjk3ODciCisgIGludGVncml0eSBzaGE1MTItNW5xRFN4bDhubjVCU054eVIzbjRJNmVEbWJvbEk2V1QrUXFSNTQ3Und4UWFwZ2pRQm10a3RkUCtIVEJiL2EvekxzYnpFUlRPTnlVQjVwZWZoNVR0alE9PQogCiBmcy5yZWFscGF0aEBeMS4wLjA6CiAgIHZlcnNpb24gIjEuMC4wIgogICByZXNvbHZlZCAiaHR0cHM6Ly9yZWdpc3RyeS55YXJucGtnLmNvbS9mcy5yZWFscGF0aC8tL2ZzLnJlYWxwYXRoLTEuMC4wLnRneiMxNTA0YWQyNTIzMTU4Y2FhNDBkYjRhMjc4N2NiMDE0MTE5OTRlYTRmIgotICBpbnRlZ3JpdHkgc2hhMS1GUVN0SlNNVmpLcEEyMG9uaDhzQlFSbVU2azg9CisgIGludGVncml0eSBzaGE1MTItT08wcEgybEs2YTBoWm5BZGF1NUl0ekhQSTZwVWx2STdqTVZueFVRUnR3NG93RjJ3azhsT1NhYnRHRENUUDRHZ3JnMk1iR25XTzlYOEsxdDQrZkdNRHc9PQorCitmc2V2ZW50c0B+Mi4zLjI6CisgIHZlcnNpb24gIjIuMy4yIgorICByZXNvbHZlZCAiaHR0cHM6Ly9yZWdpc3RyeS55YXJucGtnLmNvbS9mc2V2ZW50cy8tL2ZzZXZlbnRzLTIuMy4yLnRneiM4YTUyNmY3OGI4ZmRmNDYyM2I3MDllMGI5NzVjNTJjMjRjMDJmZDFhIgorICBpbnRlZ3JpdHkgc2hhNTEyLXhpcU1RUjR4QWVIVHVCOXVXbStmRlJjSU9nS0JNaU9CUCtlWGl5VDdqc2dWQ3ExYmtWeWd0MDBvQVNvd0I3RWR0cE9IYWFQZ0t0ODEyUDlhYitEREtBPT0KIAogZnVuY3Rpb25hbC1yZWQtYmxhY2stdHJlZUBeMS4wLjE6CiAgIHZlcnNpb24gIjEuMC4xIgogICByZXNvbHZlZCAiaHR0cHM6Ly9yZWdpc3RyeS55YXJucGtnLmNvbS9mdW5jdGlvbmFsLXJlZC1ibGFjay10cmVlLy0vZnVuY3Rpb25hbC1yZWQtYmxhY2stdHJlZS0xLjAuMS50Z3ojMWIwYWIzYmQ1NTNiMmEwZDYzOTlkMjljMGUzZWEwYjI1MjA3ODMyNyIKLSAgaW50ZWdyaXR5IHNoYTEtR3dxenZWVTdLZzFqbWRLY0RqNmdzbElIZ3ljPQorICBpbnRlZ3JpdHkgc2hhNTEyLWRzS05RTmRqNnhBM1QrUWxBRERBN21PU2xYMHFpTUlOam4wY2dyK2VHSEdzYlNIelRhYmNJb2d6MitwL2lxUDFYczZFUC9zUzJTYnFIK2JyR1RicTBnPT0KIAogZ2xvYi1wYXJlbnRAXjUuMS4yOgogICB2ZXJzaW9uICI1LjEuMiIKQEAgLTYzNiwyNiArNTc3LDMzIEBACiAgIGRlcGVuZGVuY2llczoKICAgICBpcy1nbG9iICJeNC4wLjEiCiAKK2dsb2ItcGFyZW50QF42LjAuMToKKyAgdmVyc2lvbiAiNi4wLjIiCisgIHJlc29sdmVkICJodHRwczovL3JlZ2lzdHJ5Lnlhcm5wa2cuY29tL2dsb2ItcGFyZW50Ly0vZ2xvYi1wYXJlbnQtNi4wLjIudGd6IzZkMjM3ZDk5MDgzOTUwYzc5MjkwZjI0Yzc2NDJhM2RlOWEyOGY5ZTMiCisgIGludGVncml0eSBzaGE1MTItWHh3SThFT2hWUWdXcDZpREwrM2Iwcjg2ZjRkNkFYNnpTVTU1SGZCNHlkQ0V1WExYYzVGY1llT3Urbm5HZnRTNFRFanUvMTFydDRLSlBUTWdiZm12NEE9PQorICBkZXBlbmRlbmNpZXM6CisgICAgaXMtZ2xvYiAiXjQuMC4zIgorCiBnbG9iQF43LjEuMzoKLSAgdmVyc2lvbiAiNy4yLjAiCi0gIHJlc29sdmVkICJodHRwczovL3JlZ2lzdHJ5Lnlhcm5wa2cuY29tL2dsb2IvLS9nbG9iLTcuMi4wLnRneiNkMTU1MzVhZjc3MzJlMDJlOTQ4ZjRjNDE2MjhiZDkxMDI5M2Y2MDIzIgotICBpbnRlZ3JpdHkgc2hhNTEyLWxtTGY2Z3R5clBxOHRUalNtck85NHdCZVFiRlIzSGJMSGJ1eUQ2OXd1eVFrSW1wMmhXcU1HQjQ3T1g2NUZCa1BmZk82NDFJUDlqV2ExejRpdnFHMjZRPT0KKyAgdmVyc2lvbiAiNy4yLjMiCisgIHJlc29sdmVkICJodHRwczovL3JlZ2lzdHJ5Lnlhcm5wa2cuY29tL2dsb2IvLS9nbG9iLTcuMi4zLnRneiNiOGRmMGZiODAyYmJmYThlODliZDFkOTM4YjRlMTY1NzhlZDQ0ZjJiIgorICBpbnRlZ3JpdHkgc2hhNTEyLW5GUjB6THBVMllDYVJ4d29DSnZMNlV2Q0gySkZ5RlZJdndUTHNJZjIxQXVIbE1za0ExaGhUZGsrTGxZSnRPbFl0OXY2ZHZzekQyQkdScUJMK2lRSzlRPT0KICAgZGVwZW5kZW5jaWVzOgogICAgIGZzLnJlYWxwYXRoICJeMS4wLjAiCiAgICAgaW5mbGlnaHQgIl4xLjAuNCIKICAgICBpbmhlcml0cyAiMiIKLSAgICBtaW5pbWF0Y2ggIl4zLjAuNCIKKyAgICBtaW5pbWF0Y2ggIl4zLjEuMSIKICAgICBvbmNlICJeMS4zLjAiCiAgICAgcGF0aC1pcy1hYnNvbHV0ZSAiXjEuMC4wIgogCi1nbG9iYWxzQF4xMy42LjAsIGdsb2JhbHNAXjEzLjkuMDoKLSAgdmVyc2lvbiAiMTMuMTIuMSIKLSAgcmVzb2x2ZWQgImh0dHBzOi8vcmVnaXN0cnkueWFybnBrZy5jb20vZ2xvYmFscy8tL2dsb2JhbHMtMTMuMTIuMS50Z3ojZWMyMDZiZTkzMmU2Yzc3MjM2Njc3MTI3NTc3YWE4ZTUwYmYxYzVjYiIKLSAgaW50ZWdyaXR5IHNoYTUxMi0zMTdkRmxnWTJwZEpaOXJzcFhEa3M3MDczR3BEbVhkZmJNM3ZZWXAwSEFNS0dEaDFGZldQbGVJMmxqVk5MUVg1TTVsWGNBc2xUY1BUck9yTUVGT2p5dz09CitnbG9iYWxzQF4xMy4xNS4wOgorICB2ZXJzaW9uICIxMy4xNy4wIgorICByZXNvbHZlZCAiaHR0cHM6Ly9yZWdpc3RyeS55YXJucGtnLmNvbS9nbG9iYWxzLy0vZ2xvYmFscy0xMy4xNy4wLnRneiM5MDJlYjFlNjgwYTQxZGE5Mzk0NWFkYmRjYjVhOWYzNjFiYTY5YmQ0IgorICBpbnRlZ3JpdHkgc2hhNTEyLTFDKzZuUVJiMUd3R01LbTJkSC9FN2VuRkFNeEdUbUdJNy9kRWRoeS9ETmVsdjg1dzlCNzJ0M3VjNWZydE1OWElienJhckpKL2xUQ2pjYVp3YkxKbXl3PT0KICAgZGVwZW5kZW5jaWVzOgogICAgIHR5cGUtZmVzdCAiXjAuMjAuMiIKIAotZ2xvYmJ5QF4xMS4wLjM6CitnbG9iYnlAXjExLjEuMDoKICAgdmVyc2lvbiAiMTEuMS4wIgogICByZXNvbHZlZCAiaHR0cHM6Ly9yZWdpc3RyeS55YXJucGtnLmNvbS9nbG9iYnkvLS9nbG9iYnktMTEuMS4wLnRneiNiZDRiZTk4YmIwNDJmODNkNzk2ZjdlMzgxMTk5MWZiZTgyYTBkMzRiIgogICBpbnRlZ3JpdHkgc2hhNTEyLWpoSVhhT3p5MXNiOEl5b2NhcnVXU24xVGptbkJWczhBeWhjeTgzcm14Tko4cTJ1V0tDQWozQ25KWStLcEdTWEN1ZUFQYzBpMDVrVnZWS3RQMXQ5UzNnPT0KQEAgLTY2OCwyNiArNjE2LDIxIEBACiAgICAgc2xhc2ggIl4zLjAuMCIKIAogZ29vZ2xlLXByb3RvYnVmQF4zLjYuMToKLSAgdmVyc2lvbiAiMy4xOS40IgotICByZXNvbHZlZCAiaHR0cHM6Ly9yZWdpc3RyeS55YXJucGtnLmNvbS9nb29nbGUtcHJvdG9idWYvLS9nb29nbGUtcHJvdG9idWYtMy4xOS40LnRneiM4ZDMyYzNlMzRiZTkyNTA5NTZmMjhjMGZiOTA5NTVkMTNmMzExODg4IgotICBpbnRlZ3JpdHkgc2hhNTEyLU9JUE5DeHNHMmxrSXZmK1A1Rk5mSi9LbTk1Q3NYT0JlY1M5WmNBVTZtMlJxM3N2YzBBcGw5bkIzR01ETktmUTlhc052NEtqeUFxR3dQUUZyVmxlM1lnPT0KKyAgdmVyc2lvbiAiMy4yMS4wIgorICByZXNvbHZlZCAiaHR0cHM6Ly9yZWdpc3RyeS55YXJucGtnLmNvbS9nb29nbGUtcHJvdG9idWYvLS9nb29nbGUtcHJvdG9idWYtMy4yMS4wLnRneiM4ZGZhM2ZjYTE2MjE4NjE4ZDM3M2Q0MTRkM2MxMTM5ZTI4MDM0ZDZlIgorICBpbnRlZ3JpdHkgc2hhNTEyLWJ5UjdNQlRLNHRaNVBaRWIrdTVaVHpwdDRTZnJUeHY1NjgyTWpQbEhOMTZYZXFnWkUyLzhIT0lXZWlYZThKS25UOU9WYnRCR2hicThtdHZrSzhjZDVnPT0KIAotaGFzLWZsYWdAXjMuMC4wOgotICB2ZXJzaW9uICIzLjAuMCIKLSAgcmVzb2x2ZWQgImh0dHBzOi8vcmVnaXN0cnkueWFybnBrZy5jb20vaGFzLWZsYWcvLS9oYXMtZmxhZy0zLjAuMC50Z3ojYjVkNDU0ZGMyMTk5YWUyMjU2OTlmMzQ2N2U1YTA3ZjNiOTU1YmFmZCIKLSAgaW50ZWdyaXR5IHNoYTEtdGRSVTNDR1pyaUpXbWZOR2Zsb0g4N2xWdXYwPQorZ3JhcGhlbWUtc3BsaXR0ZXJAXjEuMC40OgorICB2ZXJzaW9uICIxLjAuNCIKKyAgcmVzb2x2ZWQgImh0dHBzOi8vcmVnaXN0cnkueWFybnBrZy5jb20vZ3JhcGhlbWUtc3BsaXR0ZXIvLS9ncmFwaGVtZS1zcGxpdHRlci0xLjAuNC50Z3ojOWNmM2E2NjVjNjI0NzQ3OTg5NjgzNGFmMzVjZjFkYmI0NDAwNzY3ZSIKKyAgaW50ZWdyaXR5IHNoYTUxMi1iemg1MERXOWtUUE0wMFQ4eTRvOHZRZzg5RGk5b0xKVkxXL0thT0dJWEpXUC9pcUNONldLWWtiTk9GMDR2RkxKaHdjcFlVaDl5ZGgvKzV2cE9xVjRZUT09CiAKIGhhcy1mbGFnQF40LjAuMDoKICAgdmVyc2lvbiAiNC4wLjAiCiAgIHJlc29sdmVkICJodHRwczovL3JlZ2lzdHJ5Lnlhcm5wa2cuY29tL2hhcy1mbGFnLy0vaGFzLWZsYWctNC4wLjAudGd6Izk0NDc3MWZkOWM4MWM4MTI2NWM0ZDY5NDE4NjBkYTA2YmI1OTQ3OWIiCiAgIGludGVncml0eSBzaGE1MTItRXlrSlQvUTFLalRXY3RwcGdJQWdmU08wdEtWdVpVamhnTXIxN2txVHVtTWw2QWZ2M0VJU2xlVTdxWlV6b1hERlRBSFREQzROT29HL1p4VTNFdmxNUFE9PQogCi1pZ25vcmVAXjQuMC42OgotICB2ZXJzaW9uICI0LjAuNiIKLSAgcmVzb2x2ZWQgImh0dHBzOi8vcmVnaXN0cnkueWFybnBrZy5jb20vaWdub3JlLy0vaWdub3JlLTQuMC42LnRneiM3NTBlM2RiNTg2MjA4N2I0NzM3ZWJhYzgyMDdmZmQxZWYyN2IyNWZjIgotICBpbnRlZ3JpdHkgc2hhNTEyLWN5RkRLcnFjL1lkY1dGbmlKaHpJNDIrQXpTK2dOd21Vek9TRmNSQ1FZd3lTdUJCQnkvS2p1eFdMWi9GSEVINk1vcTFOaXpNT0JXeVRjdjhPNE9aSU1nPT0KLQotaWdub3JlQF41LjEuOCwgaWdub3JlQF41LjIuMDoKK2lnbm9yZUBeNS4yLjA6CiAgIHZlcnNpb24gIjUuMi4wIgogICByZXNvbHZlZCAiaHR0cHM6Ly9yZWdpc3RyeS55YXJucGtnLmNvbS9pZ25vcmUvLS9pZ25vcmUtNS4yLjAudGd6IzZkM2JhYzhmYTdmZTBkNDVkOWY5YmU3YmFjMmZjMjc5NTc3ZTM0NWEiCiAgIGludGVncml0eSBzaGE1MTItQ214Z1lHaUVQQ0xoZkxucFBwMU1vUm1pZndFSU9namNIWHhPQmp2N21ZOTZjK2VXU2NzT1A5YzExMlp5TGRXSGkwRnhIakkrNHVWaEtZcC9nY2RSbVE9PQpAQCAtNzAzLDEyICs2NDYsMTIgQEAKIGltdXJtdXJoYXNoQF4wLjEuNDoKICAgdmVyc2lvbiAiMC4xLjQiCiAgIHJlc29sdmVkICJodHRwczovL3JlZ2lzdHJ5Lnlhcm5wa2cuY29tL2ltdXJtdXJoYXNoLy0vaW11cm11cmhhc2gtMC4xLjQudGd6IzkyMThiOWIyYjkyOGEyMzhiMTNkYzRmYjZiNmQ1NzZmMjMxNDUzZWEiCi0gIGludGVncml0eSBzaGExLWtoaTVzcmtvb2ppeFBjVDdhMjFYYnlNVVUrbz0KKyAgaW50ZWdyaXR5IHNoYTUxMi1KbVhNWjZ3dXZEbUxpSEVtbDl5a3pxTzZsd0Zib2YwR0c0SWtjR2FFTmRDUkREbU1Wbm55N3M1SHNJZ0hDYmFxMHcyTXlQaERxa2hUVWdTMkxVMlBIQT09CiAKIGluZmxpZ2h0QF4xLjAuNDoKICAgdmVyc2lvbiAiMS4wLjYiCiAgIHJlc29sdmVkICJodHRwczovL3JlZ2lzdHJ5Lnlhcm5wa2cuY29tL2luZmxpZ2h0Ly0vaW5mbGlnaHQtMS4wLjYudGd6IzQ5YmQ2MzMxZDdkMDJkMGMwOWJjOTEwYTEwNzViYTgxNjViNTZkZjkiCi0gIGludGVncml0eSBzaGExLVNiMWpNZGZRTFF3SnZKRUtFSFc2Z1dXMWJmaz0KKyAgaW50ZWdyaXR5IHNoYTUxMi1rOTJJL2IwOHE0d3ZGc2NYQ0x2cWZzSENyanJGN3lpWHNRdUlWdlZFN044MlczK2FxcHp1VWRCYmZoV2N5L0ZaUjMvNElnZmxNZ0tMT3N2UERyR0NKQT09CiAgIGRlcGVuZGVuY2llczoKICAgICBvbmNlICJeMS4zLjAiCiAgICAgd3JhcHB5ICIxIgpAQCAtNzIxLDE0ICs2NjQsOSBAQAogaXMtZXh0Z2xvYkBeMi4xLjE6CiAgIHZlcnNpb24gIjIuMS4xIgogICByZXNvbHZlZCAiaHR0cHM6Ly9yZWdpc3RyeS55YXJucGtnLmNvbS9pcy1leHRnbG9iLy0vaXMtZXh0Z2xvYi0yLjEuMS50Z3ojYTg4YzAyNTM1NzkxZjAyZWQzN2M3NmExYjllYTk3NzNjODMzZjhjMiIKLSAgaW50ZWdyaXR5IHNoYTEtcUl3Q1UxZVI4QzdUZkhhaHVlcVhjOGd6K01JPQorICBpbnRlZ3JpdHkgc2hhNTEyLVNiS2JBTmtONjAzVmk0akVadjQ5TGVWSk1uNHlHd3Nielp3b3JFb3lFaXV0c04zbkpZZGJPMzZ6ZmhHSjZRRURwT1pJRmtEdG5xNUpSeG12bDNqc29RPT0KIAotaXMtZnVsbHdpZHRoLWNvZGUtcG9pbnRAXjMuMC4wOgotICB2ZXJzaW9uICIzLjAuMCIKLSAgcmVzb2x2ZWQgImh0dHBzOi8vcmVnaXN0cnkueWFybnBrZy5jb20vaXMtZnVsbHdpZHRoLWNvZGUtcG9pbnQvLS9pcy1mdWxsd2lkdGgtY29kZS1wb2ludC0zLjAuMC50Z3ojZjExNmY4MDY0ZmU5MGIzZjc4NDRhMzg5OTdjMGI3NTA1MTI2OWYxZCIKLSAgaW50ZWdyaXR5IHNoYTUxMi16eW1tNSt1K3NDc1NXeUQ5cU5hZWpWM0RGdmhDS2NsS2RpellhSlV1SEE4M1JMamI3blN1R25kZENIR3YwaGsrS1k3Qk1BbHNXZUs0VWVnNkVWNlhRZz09Ci0KLWlzLWdsb2JAXjQuMC4wLCBpcy1nbG9iQF40LjAuMToKK2lzLWdsb2JAXjQuMC4wLCBpcy1nbG9iQF40LjAuMSwgaXMtZ2xvYkBeNC4wLjM6CiAgIHZlcnNpb24gIjQuMC4zIgogICByZXNvbHZlZCAiaHR0cHM6Ly9yZWdpc3RyeS55YXJucGtnLmNvbS9pcy1nbG9iLy0vaXMtZ2xvYi00LjAuMy50Z3ojNjRmNjFlNDJjYmJiMmVlYzIwNzFhOWRhYzBiMjhiYTFlNjVkNTA4NCIKICAgaW50ZWdyaXR5IHNoYTUxMi14ZWxTYXlISDM2WmdFN1pXaGxpN3BXMzRoTmJObDhPanY1S1Zta0pENGhCZEQzdGg4VGZrOXZZYXNMTSttWFdPWmhGa2daZnhoTFNucndScjRlbFNTZz09CkBAIC03NDMsMzUgKzY4MSwyOSBAQAogaXNleGVAXjIuMC4wOgogICB2ZXJzaW9uICIyLjAuMCIKICAgcmVzb2x2ZWQgImh0dHBzOi8vcmVnaXN0cnkueWFybnBrZy5jb20vaXNleGUvLS9pc2V4ZS0yLjAuMC50Z3ojZThmYmYzNzRkYzU1NmZmODk0N2ExMGRjYjA1NzJkNjMzZjJjZmExMCIKLSAgaW50ZWdyaXR5IHNoYTEtNlB2emROeFZiL2lVZWhEY3NGY3RZejhzK2hBPQorICBpbnRlZ3JpdHkgc2hhNTEyLVJIeE1McDlsbktIR0hSbmc5UUZoUkNNYllBY1ZwbjY5c21TR2NxM2YzNnhqZ1ZWV1RoajRxcUxiVExscTdTc2o4QitmSVExRXVDRUdJMmxLc3lRZUl3PT0KIAotanMtdG9rZW5zQF40LjAuMDoKLSAgdmVyc2lvbiAiNC4wLjAiCi0gIHJlc29sdmVkICJodHRwczovL3JlZ2lzdHJ5Lnlhcm5wa2cuY29tL2pzLXRva2Vucy8tL2pzLXRva2Vucy00LjAuMC50Z3ojMTkyMDNmYjU5OTkxZGY5OGUzYTI4NzA1MGQ0NjQ3Y2RlYWYzMjQ5OSIKLSAgaW50ZWdyaXR5IHNoYTUxMi1SZEpVZmxjRTNjVXpLaU1xUWdzQ3UwNkZQdTlVZElKTzBiZVliUGhITjRrNmFwZ0p0aWZjb0N0VDliY3hPcFlCdHBEMmtDTTZTYnpnNENhdXNXL1BLUT09Citqcy1zZHNsQF40LjEuNDoKKyAgdmVyc2lvbiAiNC4xLjQiCisgIHJlc29sdmVkICJodHRwczovL3JlZ2lzdHJ5Lnlhcm5wa2cuY29tL2pzLXNkc2wvLS9qcy1zZHNsLTQuMS40LnRneiM3ODc5M2M5MGY4MGU4NDMwYjdkOGRjOTQ1MTViNmM3N2Q5OGEyNmE2IgorICBpbnRlZ3JpdHkgc2hhNTEyLVkyL3lENTV5NWp0ZU9BbVk1MEpiVVpZd2szQ1Azd25MUEVabmxSMXc5b0toSVRyQkV0QXh3dVdLZWJGZjhoTXJQTWdiWXdGb1dLL2xIMnNCa0VyRUx3PT0KIAotanMteWFtbEBeMy4xMy4xOgotICB2ZXJzaW9uICIzLjE0LjEiCi0gIHJlc29sdmVkICJodHRwczovL3JlZ2lzdHJ5Lnlhcm5wa2cuY29tL2pzLXlhbWwvLS9qcy15YW1sLTMuMTQuMS50Z3ojZGFlODEyZmRiMzgyNWZhMzA2NjA5YTg3MTczODNjNTBjMzZhMDUzNyIKLSAgaW50ZWdyaXR5IHNoYTUxMi1va01IN09YWEo3WXJOOU9rMy9TWHJudTRpWDl5T2srMjVucVg0aW1TMm5wdXZUWURtby9RRVpvcXdaa1lhSURrM2pWdkJPVE9JRWdFaGFMT3luQlM5Zz09Citqcy15YW1sQF40LjEuMDoKKyAgdmVyc2lvbiAiNC4xLjAiCisgIHJlc29sdmVkICJodHRwczovL3JlZ2lzdHJ5Lnlhcm5wa2cuY29tL2pzLXlhbWwvLS9qcy15YW1sLTQuMS4wLnRneiNjMWZiNjVmOGY1MDE3OTAxY2RkMmM5NTE4NjRiYTE4NDU4YTEwNjAyIgorICBpbnRlZ3JpdHkgc2hhNTEyLXdweFpzOU5veFphSkVTSkdJWlR5REVhWXBsMEZLU0ErRkI5YUppeWVtS2hNd2t4UWc2M2g0VDFLSmdVR0hwVHFQRE5SY21tWUx1Z3JSakpsQnRXdlJBPT0KICAgZGVwZW5kZW5jaWVzOgotICAgIGFyZ3BhcnNlICJeMS4wLjciCi0gICAgZXNwcmltYSAiXjQuMC4wIgorICAgIGFyZ3BhcnNlICJeMi4wLjEiCiAKIGpzb24tc2NoZW1hLXRyYXZlcnNlQF4wLjQuMToKICAgdmVyc2lvbiAiMC40LjEiCiAgIHJlc29sdmVkICJodHRwczovL3JlZ2lzdHJ5Lnlhcm5wa2cuY29tL2pzb24tc2NoZW1hLXRyYXZlcnNlLy0vanNvbi1zY2hlbWEtdHJhdmVyc2UtMC40LjEudGd6IzY5ZjZhODdkOTUxM2FiOGJiOGZlNjNiZGIwOTc5YzQ0OGU2ODQ2NjAiCiAgIGludGVncml0eSBzaGE1MTIteGJiQ0g1ZENZVTVUOExjRWhodWg3SEo4OEhYdVczcXNJM1kwek9aRktmWkVIY3BXaUhVL0p4ems2MjlCcnNhYi9tTWlIUXRpOXdNUCs4NDVSUGUzVmc9PQogCi1qc29uLXNjaGVtYS10cmF2ZXJzZUBeMS4wLjA6Ci0gIHZlcnNpb24gIjEuMC4wIgotICByZXNvbHZlZCAiaHR0cHM6Ly9yZWdpc3RyeS55YXJucGtnLmNvbS9qc29uLXNjaGVtYS10cmF2ZXJzZS8tL2pzb24tc2NoZW1hLXRyYXZlcnNlLTEuMC4wLnRneiNhZTdiY2IzNjU2YWI3N2E3M2JhNWM0OWJmNjU0ZjM4ZTZiNjg2MGUyIgotICBpbnRlZ3JpdHkgc2hhNTEyLU5NOC9QOW4zWGpYaElabjFsTGhrRmFBQ1RPVVJRWGpXaFY0QkEvUm5Pdjh4dmdxdHFwQVg5SU80bVJReFN4MVJsbzR0cXplcWIwc09scnVhT3kzZHVnPT0KLQoganNvbi1zdGFibGUtc3RyaW5naWZ5LXdpdGhvdXQtanNvbmlmeUBeMS4wLjE6CiAgIHZlcnNpb24gIjEuMC4xIgogICByZXNvbHZlZCAiaHR0cHM6Ly9yZWdpc3RyeS55YXJucGtnLmNvbS9qc29uLXN0YWJsZS1zdHJpbmdpZnktd2l0aG91dC1qc29uaWZ5Ly0vanNvbi1zdGFibGUtc3RyaW5naWZ5LXdpdGhvdXQtanNvbmlmeS0xLjAuMS50Z3ojOWRiN2I1OTQ5NmFkM2YzY2ZlZjMwYTc1MTQyZDJkOTMwYWQ3MjY1MSIKLSAgaW50ZWdyaXR5IHNoYTEtbmJlMWxKYXRQenorOHdwMUZDMHRrd3JYSmxFPQorICBpbnRlZ3JpdHkgc2hhNTEyLUJkYm95K2w3dEEzT0dXNkZqeUZIV2tQNUx1QnlqMVRrMzNManlxMGF4eXpkazkvL0pTaTJ1M2ZQMVFTbWQxS053cTZWT0tZR2xBdTg3Q2lzVmlyNlB3PT0KIAogbGV2bkBeMC40LjE6CiAgIHZlcnNpb24gIjAuNC4xIgpAQCAtNzgxLDE2ICs3MTMsMTggQEAKICAgICBwcmVsdWRlLWxzICJeMS4yLjEiCiAgICAgdHlwZS1jaGVjayAifjAuNC4wIgogCitsb2NhdGUtcGF0aEBeNi4wLjA6CisgIHZlcnNpb24gIjYuMC4wIgorICByZXNvbHZlZCAiaHR0cHM6Ly9yZWdpc3RyeS55YXJucGtnLmNvbS9sb2NhdGUtcGF0aC8tL2xvY2F0ZS1wYXRoLTYuMC4wLnRneiM1NTMyMWViMzA5ZmViYmM1OWM0ODAxZDkzMWE3MjQ1MmE2ODFkMjg2IgorICBpbnRlZ3JpdHkgc2hhNTEyLWlQWks2ZVlqYnhSdTN1QjQvV1ozRXNFSU1KRk1xQW9vcGwzUit6dXEwVWpjQW0vTU82S0N3ZURnUGZQM2VsVHp0b0tQM0t0blZIeFRuMk5IQlNEVlV3PT0KKyAgZGVwZW5kZW5jaWVzOgorICAgIHAtbG9jYXRlICJeNS4wLjAiCisKIGxvZGFzaC5tZXJnZUBeNC42LjI6CiAgIHZlcnNpb24gIjQuNi4yIgogICByZXNvbHZlZCAiaHR0cHM6Ly9yZWdpc3RyeS55YXJucGtnLmNvbS9sb2Rhc2gubWVyZ2UvLS9sb2Rhc2gubWVyZ2UtNC42LjIudGd6IzU1OGFhNTNiNDNiNjYxZTE5MjVhMGFmZGZhMzZhOWExMDg1ZmU1N2EiCiAgIGludGVncml0eSBzaGE1MTItMEtwanFYUlZ2cll5Q3NYMXN3Ui9YVEswdmE2VlFrUU02TU5vN1BxVzc3QnlqQWhvQVJBOEVmclAxTjQrS2xLajhZUzBaVUN0UlQvWVV1aHlZRHVqSVE9PQogCi1sb2Rhc2gudHJ1bmNhdGVAXjQuNC4yOgotICB2ZXJzaW9uICI0LjQuMiIKLSAgcmVzb2x2ZWQgImh0dHBzOi8vcmVnaXN0cnkueWFybnBrZy5jb20vbG9kYXNoLnRydW5jYXRlLy0vbG9kYXNoLnRydW5jYXRlLTQuNC4yLnRneiM1YTM1MGRhMGIxMTEzYjgzN2VjZmZmZDU4MTJjYmU1OGQ2ZWFlMTkzIgotICBpbnRlZ3JpdHkgc2hhMS1XalVOb0xFUk80Tit6Ly9WZ1N5K1dOYnE0Wk09Ci0KIGxvbmdAXjQuMC4wOgogICB2ZXJzaW9uICI0LjAuMCIKICAgcmVzb2x2ZWQgImh0dHBzOi8vcmVnaXN0cnkueWFybnBrZy5jb20vbG9uZy8tL2xvbmctNC4wLjAudGd6IzlhN2I3MWNmYjdkMzYxYTE5NGVhNTU1MjQxYzkyZjc0NjhkNWJmMjgiCkBAIC04MDksMTQgKzc0MywxNCBAQAogICBpbnRlZ3JpdHkgc2hhNTEyLThxN1ZFZ01KVzRKOHRjZlZQeThnMDlOY1F3WmRid0ZFcWhlL1daa29JempuLzNUR0R3dE9DWXRYR3hBM084dFB6cGN6Q0NEZ3YrUDJQNXkwMFpKT09nPT0KIAogbWljcm9tYXRjaEBeNC4wLjQ6Ci0gIHZlcnNpb24gIjQuMC40IgotICByZXNvbHZlZCAiaHR0cHM6Ly9yZWdpc3RyeS55YXJucGtnLmNvbS9taWNyb21hdGNoLy0vbWljcm9tYXRjaC00LjAuNC50Z3ojODk2ZDUxOWRmZTlkYjI1ZmNlOTRjZWI3YTUwMDkxOWJmODgxZWJmOSIKLSAgaW50ZWdyaXR5IHNoYTUxMi1wUm16dy9YVWN3WEdwRDlhSTlxLzBYT3dMTnlnakVUSjh5MGFvMHdkcXBycnpEYTRZbnhMY3o3ZlFSWnI4dm9oOFYxMGtHaEFCYk5jSFZrNXdIZ1d3Zz09CisgIHZlcnNpb24gIjQuMC41IgorICByZXNvbHZlZCAiaHR0cHM6Ly9yZWdpc3RyeS55YXJucGtnLmNvbS9taWNyb21hdGNoLy0vbWljcm9tYXRjaC00LjAuNS50Z3ojYmM4OTk5YTdjYmJmNzdjZGM4OWYxMzJmNmU0NjcwNTFiNDkwOTBjNiIKKyAgaW50ZWdyaXR5IHNoYTUxMi1ETXkrRVJjRVcycThaMlBvK1dOWHV3M2M1WWFVU0ZqQU81R3NKcWZFbDdVanZ0SXVGS082WnJLdmNJdGR5OThkd0ZJMk4xdGczek5JZEthUVQrYU5kQT09CiAgIGRlcGVuZGVuY2llczoKLSAgICBicmFjZXMgIl4zLjAuMSIKLSAgICBwaWNvbWF0Y2ggIl4yLjIuMyIKKyAgICBicmFjZXMgIl4zLjAuMiIKKyAgICBwaWNvbWF0Y2ggIl4yLjMuMSIKIAotbWluaW1hdGNoQF4zLjAuNDoKK21pbmltYXRjaEBeMy4wLjQsIG1pbmltYXRjaEBeMy4xLjEsIG1pbmltYXRjaEBeMy4xLjI6CiAgIHZlcnNpb24gIjMuMS4yIgogICByZXNvbHZlZCAiaHR0cHM6Ly9yZWdpc3RyeS55YXJucGtnLmNvbS9taW5pbWF0Y2gvLS9taW5pbWF0Y2gtMy4xLjIudGd6IzE5Y2QxOTRiZmQzZTQyOGYwNDlhNzA4MTdjMDM4ZDg5YWI0YmUzNWIiCiAgIGludGVncml0eSBzaGE1MTItSjdwNjNoUmlBancxTkRFd3cxVzdpMzcrQnlJck9XTzVYUVFBelozVk9jTDBQTnlid3BmbVYvTjA1ekZBendROVVTeUVjWDZ0M1VPK0s1YXFCUU9JSHc9PQpAQCAtODMxLDEyICs3NjUsMTIgQEAKIG5hdHVyYWwtY29tcGFyZUBeMS40LjA6CiAgIHZlcnNpb24gIjEuNC4wIgogICByZXNvbHZlZCAiaHR0cHM6Ly9yZWdpc3RyeS55YXJucGtnLmNvbS9uYXR1cmFsLWNvbXBhcmUvLS9uYXR1cmFsLWNvbXBhcmUtMS40LjAudGd6IzRhYmViZmVlZDc1NDFmMmMyN2FjZmIyOWJkYmJkMTVjOGQ1YmE0ZjciCi0gIGludGVncml0eSBzaGExLVNyNi83dGRVSHl3bnJQc3B2YnZSWEkxYnBQYz0KKyAgaW50ZWdyaXR5IHNoYTUxMi1PV05EOGVpM1Z0TkM5aDdWNjBxZmYzU1ZvYkhyOTk2Q1R3Z3h1Ymd5UVlFcGcyOTBoOUowYnV5RUNOTkpleGtGbTVzT2FqaDVHMTE2UllBMWM4Wk1Tdz09CiAKIG9uY2VAXjEuMy4wOgogICB2ZXJzaW9uICIxLjQuMCIKICAgcmVzb2x2ZWQgImh0dHBzOi8vcmVnaXN0cnkueWFybnBrZy5jb20vb25jZS8tL29uY2UtMS40LjAudGd6IzU4M2IxYWE3NzU5NjFkNGIxMTNhYzE3ZDljNTBiYWVmOWRkNzZiZDEiCi0gIGludGVncml0eSBzaGExLVdEc2FwM1dXSFVzUk9zRjluRkM2NzUzWGE5RT0KKyAgaW50ZWdyaXR5IHNoYTUxMi1sTmFKZ0krMlE1VVJRQmtjY0VLSFRRT1BhWGRVeG5aWkVsUVRaWTBNRlVBdWFFcWUxRStOeXZnZHovYUl5Tmk2WjlNek81ZHYxSDhuNTgvR0VMcDMrdz09CiAgIGRlcGVuZGVuY2llczoKICAgICB3cmFwcHkgIjEiCiAKQEAgLTg1Miw2ICs3ODYsMjAgQEAKICAgICB0eXBlLWNoZWNrICJeMC40LjAiCiAgICAgd29yZC13cmFwICJeMS4yLjMiCiAKK3AtbGltaXRAXjMuMC4yOgorICB2ZXJzaW9uICIzLjEuMCIKKyAgcmVzb2x2ZWQgImh0dHBzOi8vcmVnaXN0cnkueWFybnBrZy5jb20vcC1saW1pdC8tL3AtbGltaXQtMy4xLjAudGd6I2UxZGFjY2JlNzhkMGQxMzg4Y2ExOGM2NGZlYTM4ZTNlNTdlMzcwNmIiCisgIGludGVncml0eSBzaGE1MTItVFlPYW5NM3dHd05Hc1pOMmNWVFlQQXJ3NDU0eG5YajVxbVdGMWJFb0FjNCtjVS9vbDdHVmg3b2RldmpwMUZOSGR1SGMzS1pNY0ZkdXhVNVhjNnVKUlE9PQorICBkZXBlbmRlbmNpZXM6CisgICAgeW9jdG8tcXVldWUgIl4wLjEuMCIKKworcC1sb2NhdGVAXjUuMC4wOgorICB2ZXJzaW9uICI1LjAuMCIKKyAgcmVzb2x2ZWQgImh0dHBzOi8vcmVnaXN0cnkueWFybnBrZy5jb20vcC1sb2NhdGUvLS9wLWxvY2F0ZS01LjAuMC50Z3ojODNjODMxNWM2Nzg1MDA1ZTNiZDAyMTgzOTQxMWM5ZTExMGU2ZDgzNCIKKyAgaW50ZWdyaXR5IHNoYTUxMi1MYU5qdFJXVUJZKyt6QjVuRS9Od2Nhb015bFNQaytTK1pITkIxVHpkYk1KTW55NmR5bnBBR3Q3WC90bC9RWXEzVEllRTZueEhwcGJvMkxHeW1yRzVQdz09CisgIGRlcGVuZGVuY2llczoKKyAgICBwLWxpbWl0ICJeMy4wLjIiCisKIHBhcmVudC1tb2R1bGVAXjEuMC4wOgogICB2ZXJzaW9uICIxLjAuMSIKICAgcmVzb2x2ZWQgImh0dHBzOi8vcmVnaXN0cnkueWFybnBrZy5jb20vcGFyZW50LW1vZHVsZS8tL3BhcmVudC1tb2R1bGUtMS4wLjEudGd6IzY5MWQyNzA5ZTc4Yzc5ZmFlM2ExNTY2MjI0NTJkMDA3NjJjYWFhYTIiCkBAIC04NTksMTAgKzgwNywxNSBAQAogICBkZXBlbmRlbmNpZXM6CiAgICAgY2FsbHNpdGVzICJeMy4wLjAiCiAKK3BhdGgtZXhpc3RzQF40LjAuMDoKKyAgdmVyc2lvbiAiNC4wLjAiCisgIHJlc29sdmVkICJodHRwczovL3JlZ2lzdHJ5Lnlhcm5wa2cuY29tL3BhdGgtZXhpc3RzLy0vcGF0aC1leGlzdHMtNC4wLjAudGd6IzUxM2JkYmUyZDNiOTVkNzc2MmU4YzExMzdlZmExOTVjNmM2MWI1YjMiCisgIGludGVncml0eSBzaGE1MTItYWs5UXk1UTdqWWIyV3djZXk1RnB2ZzJLb0FjL1pJaExTTE9TQm1SbXlnUHNHd2tWVnQwZlphMHFydE16K202dEpUQUhmWlE4Rm5tQjRNRzRMV3k3L3c9PQorCiBwYXRoLWlzLWFic29sdXRlQF4xLjAuMDoKICAgdmVyc2lvbiAiMS4wLjEiCiAgIHJlc29sdmVkICJodHRwczovL3JlZ2lzdHJ5Lnlhcm5wa2cuY29tL3BhdGgtaXMtYWJzb2x1dGUvLS9wYXRoLWlzLWFic29sdXRlLTEuMC4xLnRneiMxNzRiOTI2ODczNTUzNGZmYmM3YWNlNmJmNTNhNWE5ZTFiNWM1ZjVmIgotICBpbnRlZ3JpdHkgc2hhMS1GMHVTYUhOVk5QKzhlczVyOVRwYW5odGNYMTg9CisgIGludGVncml0eSBzaGE1MTItQVZidzNVSjJlOWJxNjR2U2FTOUFtMGZqZTFQYThwYkdxVFRzbVhmYUlpTXBucjVEbERoZkpPdUxqOVNmOTVaUFZEQVVlckRmRWs4OE1QbVBlN1VDUWc9PQogCiBwYXRoLWtleUBeMy4xLjA6CiAgIHZlcnNpb24gIjMuMS4xIgpAQCAtODc0LDcgKzgyNyw3IEBACiAgIHJlc29sdmVkICJodHRwczovL3JlZ2lzdHJ5Lnlhcm5wa2cuY29tL3BhdGgtdHlwZS8tL3BhdGgtdHlwZS00LjAuMC50Z3ojODRlZDAxYzBhN2JhMzgwYWZlMDlkOTBhOGMxODBkY2Q5ZDAzMDQzYiIKICAgaW50ZWdyaXR5IHNoYTUxMi1nREtiOGFaTURlRC90WldzOVA2K3EwSjlNd2tkbDZ4TVY4VGpuR1AzcUpWSjA2YmRNZ2tiQmxMVThJZGZPc0lzRnoyQlcxck5WVDNYdU5FbDh6UEF2dz09CiAKLXBpY29tYXRjaEBeMi4yLjM6CitwaWNvbWF0Y2hAXjIuMy4xOgogICB2ZXJzaW9uICIyLjMuMSIKICAgcmVzb2x2ZWQgImh0dHBzOi8vcmVnaXN0cnkueWFybnBrZy5jb20vcGljb21hdGNoLy0vcGljb21hdGNoLTIuMy4xLnRneiMzYmEzODMzNzMzNjQ2ZDlkM2U0OTk1OTQ2YzEzNjVhNjdmYjA3YTQyIgogICBpbnRlZ3JpdHkgc2hhNTEyLUpVM3RlSFROam1FMlZDR0Z6dVk4RVh6Q0RWd0VxQjJhOGZzSXZ3YVN0SGhBV0pFZVZkMW8xUUQ4MENVNitaZEVYWFNMYlNzdUx3SmprQ0JXcVJRVVZBPT0KQEAgLTg4NCwxMSArODM3LDYgQEAKICAgcmVzb2x2ZWQgImh0dHBzOi8vcmVnaXN0cnkueWFybnBrZy5jb20vcHJlbHVkZS1scy8tL3ByZWx1ZGUtbHMtMS4yLjEudGd6I2RlYmM2NDg5ZDdhNmU2YjBlNzYxMTg4OGNlYzg4MDMzN2QzMTYzOTYiCiAgIGludGVncml0eSBzaGE1MTItdmtjRFByUlpvMVFaTGJuNVJMR1BwZy9XbUlRNjVxb1dXaGNHS2YvYjVlcGxra2FyWDBtOXo4cHBDYXQ0bWxPcVVzV3B5TnVZZ08zVlJ5cllIU3pYNWc9PQogCi1wcm9ncmVzc0BeMi4wLjA6Ci0gIHZlcnNpb24gIjIuMC4zIgotICByZXNvbHZlZCAiaHR0cHM6Ly9yZWdpc3RyeS55YXJucGtnLmNvbS9wcm9ncmVzcy8tL3Byb2dyZXNzLTIuMC4zLnRneiM3ZThjZjhkOGY1YjhmMjM5YzFiYzY4YmViNGViNzg1NjdkNTcyZWY4IgotICBpbnRlZ3JpdHkgc2hhNTEyLTdQaUh0TGxsNUxkbktJTXcxMDBJKzh4SlhSNWdXMlF3V1lrVDZpSnZhMGJYaXRaS2EvWE1yU2JkbWczcjJYbmFpZHo5UXVtZDBWUGFNclpsRjlWOXNBPT0KLQogcHJvdG9idWZqc0A2LjguODoKICAgdmVyc2lvbiAiNi44LjgiCiAgIHJlc29sdmVkICJodHRwczovL3JlZ2lzdHJ5Lnlhcm5wa2cuY29tL3Byb3RvYnVmanMvLS9wcm90b2J1ZmpzLTYuOC44LnRneiNjOGI0ZjEyODJmZDdhOTBlNmY1YjEwOWVkMTFjODRhZjgyOTA4ZTdjIgpAQCAtOTE4LDE2ICs4NjYsMTEgQEAKICAgcmVzb2x2ZWQgImh0dHBzOi8vcmVnaXN0cnkueWFybnBrZy5jb20vcXVldWUtbWljcm90YXNrLy0vcXVldWUtbWljcm90YXNrLTEuMi4zLnRneiM0OTI5MjI4YmJjNzI0ZGZhYzQzZTBlZmIwNThjYWY3YjZjZmI2MjQzIgogICBpbnRlZ3JpdHkgc2hhNTEyLU51YU5TYTZmbEtUNUphU1lRekpvazA0SnpUTDFDQTZhR2h2NXJmTFczUGdxQStNMkNocFpRbkFDOGg4aTRaRmtCUzhYNVJxa0RCSEE3cjRoZWozSzlBPT0KIAotcmVnZXhwcEBeMy4xLjA6CityZWdleHBwQF4zLjIuMDoKICAgdmVyc2lvbiAiMy4yLjAiCiAgIHJlc29sdmVkICJodHRwczovL3JlZ2lzdHJ5Lnlhcm5wa2cuY29tL3JlZ2V4cHAvLS9yZWdleHBwLTMuMi4wLnRneiMwNDI1YTI3NjhkOGYyM2JhZDcwY2E0YjkwNDYxZmEyZjEyMTNlMWIyIgogICBpbnRlZ3JpdHkgc2hhNTEyLXBxMmJXbzltVkQ0M25idHMyd0d2MTdYTGlOTHlhK0drbFo4a2FETFYyWjA4Z0RDc0dwbktuOUJGTWVwdld1SENieVZ2WTdKNW81K0JWdm9RYm1sSkxnPT0KIAotcmVxdWlyZS1mcm9tLXN0cmluZ0BeMi4wLjI6Ci0gIHZlcnNpb24gIjIuMC4yIgotICByZXNvbHZlZCAiaHR0cHM6Ly9yZWdpc3RyeS55YXJucGtnLmNvbS9yZXF1aXJlLWZyb20tc3RyaW5nLy0vcmVxdWlyZS1mcm9tLXN0cmluZy0yLjAuMi50Z3ojODlhN2ZkZDkzODI2MTI2NzMxOGVhZmUxNGY5YzMyZTU5OGMzNjkwOSIKLSAgaW50ZWdyaXR5IHNoYTUxMi1YZjBuV2U2UnNlemlGTXUrQXA5YmlpVWJtcGxxNlM5L3ArN3c3WVhQL0pCSGhyVUREVWh3YSt2QU55dWJ1cWZaV1R2ZVUvL0RZVkdzREc3UktML3ZFdz09Ci0KIHJlc29sdmUtZnJvbUBeNC4wLjA6CiAgIHZlcnNpb24gIjQuMC4wIgogICByZXNvbHZlZCAiaHR0cHM6Ly9yZWdpc3RyeS55YXJucGtnLmNvbS9yZXNvbHZlLWZyb20vLS9yZXNvbHZlLWZyb20tNC4wLjAudGd6IzRhYmNkODUyYWQzMmRkN2JhYWJmZTliNDBlMDBhMzZkYjVmMzkyZTYiCkBAIC05NDUsNiArODg4LDEzIEBACiAgIGRlcGVuZGVuY2llczoKICAgICBnbG9iICJeNy4xLjMiCiAKK3JvbGx1cEBeMi43OS4wOgorICB2ZXJzaW9uICIyLjc5LjAiCisgIHJlc29sdmVkICJodHRwczovL3JlZ2lzdHJ5Lnlhcm5wa2cuY29tL3JvbGx1cC8tL3JvbGx1cC0yLjc5LjAudGd6IzkxNzc5OTJjOWYwOWViNThjNWU1NmNiZmE2NDE2MDdhMTJiNTdjZTIiCisgIGludGVncml0eSBzaGE1MTIteDRLc3JDZ3dRN1pKUGNGQS9TVXU2UVZjWWxPN3VSTGZMQXkwRFNBNE5TMmVHOGphcGRicE01MFRvSDd6NGlPYm9kUllPSjBzb25lRjBpYVFSSjZ6aEE9PQorICBvcHRpb25hbERlcGVuZGVuY2llczoKKyAgICBmc2V2ZW50cyAifjIuMy4yIgorCiBydW4tcGFyYWxsZWxAXjEuMS45OgogICB2ZXJzaW9uICIxLjIuMCIKICAgcmVzb2x2ZWQgImh0dHBzOi8vcmVnaXN0cnkueWFybnBrZy5jb20vcnVuLXBhcmFsbGVsLy0vcnVuLXBhcmFsbGVsLTEuMi4wLnRneiM2NmQxMzY4ZGE3YmRmOTIxZWI5ZDk1YmQxYTkyMjllN2YyMWE0M2VlIgpAQCAtOTU3LDEwICs5MDcsMTAgQEAKICAgcmVzb2x2ZWQgImh0dHBzOi8vcmVnaXN0cnkueWFybnBrZy5jb20vc2VtdmVyLy0vc2VtdmVyLTUuNi4wLnRneiM3ZTc0MjU2ZmJhYTQ5Yzc1YWE3YzdhMjA1Y2MyMjc5OWNhYzgwMDA0IgogICBpbnRlZ3JpdHkgc2hhNTEyLVJTOVI2UjM1TllnUW4rK2ZrRFdhT21xR29qNEVrOWdHcytEUHhOVVpLdXdFMTgzeGpKcm9LdnlvMUl6VkZlWHZVcnZtQUx5NkZXRDV4cmRKVDI1Z01nPT0KIAotc2VtdmVyQF43LjIuMSwgc2VtdmVyQF43LjMuNToKLSAgdmVyc2lvbiAiNy4zLjUiCi0gIHJlc29sdmVkICJodHRwczovL3JlZ2lzdHJ5Lnlhcm5wa2cuY29tL3NlbXZlci8tL3NlbXZlci03LjMuNS50Z3ojMGI2MjFjODc5MzQ4ZDg5OThlNGIwZTRiZTk0YjNmMTJlNjAxOGVmNyIKLSAgaW50ZWdyaXR5IHNoYTUxMi1Qb2VHSlloOEhLNEJUTy9hOVRmNlpHM3Zlby9BN1pWc1lyU0E2SjhueTluYjNCMVZycGt1Tit6OU9FNXdmRTVwNkg0TGNoWVpzZWdpUWdiSkQ5NFpGUT09CitzZW12ZXJAXjcuMy43OgorICB2ZXJzaW9uICI3LjMuNyIKKyAgcmVzb2x2ZWQgImh0dHBzOi8vcmVnaXN0cnkueWFybnBrZy5jb20vc2VtdmVyLy0vc2VtdmVyLTcuMy43LnRneiMxMmM1YjY0OWFmZGJmOTA0OTcwNzc5NmUyMmE0MDI4ODE0Y2U1MjNmIgorICBpbnRlZ3JpdHkgc2hhNTEyLVFsWVR1Y1VZT2V3cytXZUV1akRvRUd6aXo0SzZjNDdWL0JkK0xqU1NZY0E5NHArRG1JTmRmN25jYVVpblRoZnZaeXUxM2xOOU9ZMVhEeHQ4QzBUdzBnPT0KICAgZGVwZW5kZW5jaWVzOgogICAgIGxydS1jYWNoZSAiXjYuMC4wIgogCkBAIC05ODEsMTUgKzkzMSw2IEBACiAgIHJlc29sdmVkICJodHRwczovL3JlZ2lzdHJ5Lnlhcm5wa2cuY29tL3NsYXNoLy0vc2xhc2gtMy4wLjAudGd6IzY1MzliZTg3MGMxNjVhZGJkNTI0MDIyMGRiZTM2MWYxYmM0ZDQ2MzQiCiAgIGludGVncml0eSBzaGE1MTItZzlRMWhhZWJ5MzZPU1N0d2I0bnRDR0dHYUtzYVZTalE2OGZCeG9RY3V0bDVmUzF2dVkxOEgzd1N0M2pGeUZ0cmt4K0t6MFYxRzg1QTRNeUFkRE1pMlE9PQogCi1zbGljZS1hbnNpQF40LjAuMDoKLSAgdmVyc2lvbiAiNC4wLjAiCi0gIHJlc29sdmVkICJodHRwczovL3JlZ2lzdHJ5Lnlhcm5wa2cuY29tL3NsaWNlLWFuc2kvLS9zbGljZS1hbnNpLTQuMC4wLnRneiM1MDBlOGRkMGZkNTViMDU4MTUwODYyNTViMzE5NWFkZjJhNDVmZTZiIgotICBpbnRlZ3JpdHkgc2hhNTEyLXFNQ01maFkwNDBjVkhUNDNLOUJGeWdxWWJVUEZaS0hPZzdLNzNtdFRXSlJiOHB5UDNmemY0SXhkNVN6ZEVKUTZNUlVnL1dCbk9MeGdoWnRLS3VyRU5RPT0KLSAgZGVwZW5kZW5jaWVzOgotICAgIGFuc2ktc3R5bGVzICJeNC4wLjAiCi0gICAgYXN0cmFsLXJlZ2V4ICJeMi4wLjAiCi0gICAgaXMtZnVsbHdpZHRoLWNvZGUtcG9pbnQgIl4zLjAuMCIKLQogc291cmNlLW1hcC1zdXBwb3J0QDAuNS45OgogICB2ZXJzaW9uICIwLjUuOSIKICAgcmVzb2x2ZWQgImh0dHBzOi8vcmVnaXN0cnkueWFybnBrZy5jb20vc291cmNlLW1hcC1zdXBwb3J0Ly0vc291cmNlLW1hcC1zdXBwb3J0LTAuNS45LnRneiM0MWJjOTUzYjI1MzQyNjdlYTJkNjA1YmNjZmE3YmZhMzExMWNlZDVmIgpAQCAtMTAwMywyMSArOTQ0LDcgQEAKICAgcmVzb2x2ZWQgImh0dHBzOi8vcmVnaXN0cnkueWFybnBrZy5jb20vc291cmNlLW1hcC8tL3NvdXJjZS1tYXAtMC42LjEudGd6Izc0NzIyYWYzMmU5NjE0ZTljMjg3YThkMGJiZGU0OGI1ZTJmMWEyNjMiCiAgIGludGVncml0eSBzaGE1MTItVWpnYXB1bVdsYk1oa0JnelQ3WWtjNVlYVVQ0NkYwaUt1OFNHWHEwYmN3UDVkei9oMFBsajZlbkpxanoxWmJxMmw1V2FxWW5yVmJ3V09XTXlGM0Y0N2c9PQogCi1zcHJpbnRmLWpzQH4xLjAuMjoKLSAgdmVyc2lvbiAiMS4wLjMiCi0gIHJlc29sdmVkICJodHRwczovL3JlZ2lzdHJ5Lnlhcm5wa2cuY29tL3NwcmludGYtanMvLS9zcHJpbnRmLWpzLTEuMC4zLnRneiMwNGU2OTI2ZjY2Mjg5NTM1NGYzZGQwMTUyMDM2MzNiODU3Mjk3ZTJjIgotICBpbnRlZ3JpdHkgc2hhMS1CT2FTYjJZb2xUVlBQZEFWSURZenVGY3BmaXc9Ci0KLXN0cmluZy13aWR0aEBeNC4yLjM6Ci0gIHZlcnNpb24gIjQuMi4zIgotICByZXNvbHZlZCAiaHR0cHM6Ly9yZWdpc3RyeS55YXJucGtnLmNvbS9zdHJpbmctd2lkdGgvLS9zdHJpbmctd2lkdGgtNC4yLjMudGd6IzI2OWM3MTE3ZDI3YjA1YWQyZTUzNjgzMGE4ZWM4OTVlZjljNmQwMTAiCi0gIGludGVncml0eSBzaGE1MTItd0t5UVJRcGpKMHNJcDYyRXJTWmRHc2pNSldzYXA1b1JOaWhIaHU2RzdKVk8vOWpJQjZVeWV2TCt0WHVPcXJuZzhqL2N4S1RXeVdVd3ZTVHJpaVp6L2c9PQotICBkZXBlbmRlbmNpZXM6Ci0gICAgZW1vamktcmVnZXggIl44LjAuMCIKLSAgICBpcy1mdWxsd2lkdGgtY29kZS1wb2ludCAiXjMuMC4wIgotICAgIHN0cmlwLWFuc2kgIl42LjAuMSIKLQotc3RyaXAtYW5zaUBeNi4wLjAsIHN0cmlwLWFuc2lAXjYuMC4xOgorc3RyaXAtYW5zaUBeNi4wLjE6CiAgIHZlcnNpb24gIjYuMC4xIgogICByZXNvbHZlZCAiaHR0cHM6Ly9yZWdpc3RyeS55YXJucGtnLmNvbS9zdHJpcC1hbnNpLy0vc3RyaXAtYW5zaS02LjAuMS50Z3ojOWUyNmM2M2QzMGY1MzQ0M2U5NDg5NDk1YjIxMDVkMzdiNjdhODVkOSIKICAgaW50ZWdyaXR5IHNoYTUxMi1ZMzhWUFNIY3FrRnJDcEZuUTl2dVNYbXF1dXY1b1hPS3BHZVQ2YUdycjNvM0djOUFsVmE2SkJmVVNPQ25ieEdHWkYrLzBvb0k3S3JQdVVTenRVZFU1QT09CkBAIC0xMDI5LDEzICs5NTYsNiBAQAogICByZXNvbHZlZCAiaHR0cHM6Ly9yZWdpc3RyeS55YXJucGtnLmNvbS9zdHJpcC1qc29uLWNvbW1lbnRzLy0vc3RyaXAtanNvbi1jb21tZW50cy0zLjEuMS50Z3ojMzFmMTI4MWIzODMyNjMwNDM0ODMxYzMxMGMwMWNjY2RhOGNiZTAwNiIKICAgaW50ZWdyaXR5IHNoYTUxMi02ZlBjK1I0aWh3cVA2Ti9hSXYyZjFnTUg4bE9WdFdRSG9xQzR5SzZvU0RWVm9jdW1Bc2ZDcWprWG5xaVlNaG1Nd1MvbUVITHA3VmVobHQzcWw2bEVpZz09CiAKLXN1cHBvcnRzLWNvbG9yQF41LjMuMDoKLSAgdmVyc2lvbiAiNS41LjAiCi0gIHJlc29sdmVkICJodHRwczovL3JlZ2lzdHJ5Lnlhcm5wa2cuY29tL3N1cHBvcnRzLWNvbG9yLy0vc3VwcG9ydHMtY29sb3ItNS41LjAudGd6I2UyZTY5YTQ0YWM4NzcyZjc4YTFlYzBiMzViNjg5ZGY2NTMwZWZjOGYiCi0gIGludGVncml0eSBzaGE1MTItUWpWandkWEl0NDA4TUlpQXFDWDRvVUtzZ1UyRXFBR3pzMlBwa200YVFZYmptK1pFV0VjVzRTZkZOVHI0dU1OWm1hMGV5NGY1bGdMcmtCMGFYMFFNb3c9PQotICBkZXBlbmRlbmNpZXM6Ci0gICAgaGFzLWZsYWcgIl4zLjAuMCIKLQogc3VwcG9ydHMtY29sb3JAXjcuMS4wOgogICB2ZXJzaW9uICI3LjIuMCIKICAgcmVzb2x2ZWQgImh0dHBzOi8vcmVnaXN0cnkueWFybnBrZy5jb20vc3VwcG9ydHMtY29sb3IvLS9zdXBwb3J0cy1jb2xvci03LjIuMC50Z3ojMWI3ZGNkY2IzMmI4MTM4ODAxYjNlNDc4YmE2YTUxY2FhODk2NDhkYSIKQEAgLTEwNDMsMjEgKzk2MywxMCBAQAogICBkZXBlbmRlbmNpZXM6CiAgICAgaGFzLWZsYWcgIl40LjAuMCIKIAotdGFibGVAXjYuMC45OgotICB2ZXJzaW9uICI2LjguMCIKLSAgcmVzb2x2ZWQgImh0dHBzOi8vcmVnaXN0cnkueWFybnBrZy5jb20vdGFibGUvLS90YWJsZS02LjguMC50Z3ojODdlMjhmMTRmYTQzMjFjMzM3N2JhMjg2ZjA3Yjc5YjI4MWEzYjNjYSIKLSAgaW50ZWdyaXR5IHNoYTUxMi1zL2ZpdHJiVmVFeUhLRmE3bUZka3VRTVdsSDFXZ3cveUVYTXQ1eEFDVDRacHpXRmx1ZWhBeFJ0VVVRS1B1V2hhTEFXaEZjVng2dzNvQzhWS2FVZlBHQT09Ci0gIGRlcGVuZGVuY2llczoKLSAgICBhanYgIl44LjAuMSIKLSAgICBsb2Rhc2gudHJ1bmNhdGUgIl40LjQuMiIKLSAgICBzbGljZS1hbnNpICJeNC4wLjAiCi0gICAgc3RyaW5nLXdpZHRoICJeNC4yLjMiCi0gICAgc3RyaXAtYW5zaSAiXjYuMC4xIgotCiB0ZXh0LXRhYmxlQF4wLjIuMDoKICAgdmVyc2lvbiAiMC4yLjAiCiAgIHJlc29sdmVkICJodHRwczovL3JlZ2lzdHJ5Lnlhcm5wa2cuY29tL3RleHQtdGFibGUvLS90ZXh0LXRhYmxlLTAuMi4wLnRneiM3ZjVlZTgyM2FlODA1MjA3YzAwYWYyZGY0YTg0ZWMzZmNmYTU3MGI0IgotICBpbnRlZ3JpdHkgc2hhMS1mMTdvSTY2QVVnZkFDdkxmU29Uc1A4K2xjTFE9CisgIGludGVncml0eSBzaGE1MTItTis4VWlzQVhER2s4UEZYUDRIQXpWUjluYmZtVkozellMQVdpVElvcUM1djVpc2luaHIrcjV1YU84KzdyM0JNZnVOSXVmSXNBN1JkcFZnYWNDMmNTcHc9PQogCiB0by1yZWdleC1yYW5nZUBeNS4wLjE6CiAgIHZlcnNpb24gIjUuMC4xIgpAQCAtMTA5MCwxMCArOTk5LDEwIEBACiAgIHJlc29sdmVkICJodHRwczovL3JlZ2lzdHJ5Lnlhcm5wa2cuY29tL3R5cGUtZmVzdC8tL3R5cGUtZmVzdC0wLjIwLjIudGd6IzFiZjIwN2Y0YjI4ZjkxNTgzNjY2Y2I1ZmJkMzI3ODg3MzAxY2Q1ZjQiCiAgIGludGVncml0eSBzaGE1MTItTmUrZUU0cjAvaVducEF4RDg1MnozQStOMEJ0NVJOLy9Oakp3UmQyVkZIRW1yeXd4ZjV2c1psaDRSNmxpeGw2Qit3ei84ZCttYVRTQWtOMUZJa0kzTFE9PQogCi10eXBlc2NyaXB0QF40LjUuNToKLSAgdmVyc2lvbiAiNC42LjIiCi0gIHJlc29sdmVkICJodHRwczovL3JlZ2lzdHJ5Lnlhcm5wa2cuY29tL3R5cGVzY3JpcHQvLS90eXBlc2NyaXB0LTQuNi4yLnRneiNmZTEyZDI3MjdiNzA4ZjRlZWY0MGY1MTU5OGIzMzk4YmFhOTYxMWQ0IgotICBpbnRlZ3JpdHkgc2hhNTEyLUhNL2hGaWdUQkhaaExYc2huOXNOMzdIMDg1K2hRR2VKSEovWDdMcEJXTElEL2ZiYzJhY1VNZlUrbEdEOThYODFzS1ArcEZhOWYwRFptQ3dCOUduYkFnPT0KK3R5cGVzY3JpcHRAXjQuOC4zOgorICB2ZXJzaW9uICI0LjguMyIKKyAgcmVzb2x2ZWQgImh0dHBzOi8vcmVnaXN0cnkueWFybnBrZy5jb20vdHlwZXNjcmlwdC8tL3R5cGVzY3JpcHQtNC44LjMudGd6I2Q1OTM0NDUyMmM0YmM0NjRhNjVhNzMwYWM2OTUwMDdmZGI2NmRkODgiCisgIGludGVncml0eSBzaGE1MTItZ29NSGZtMDBuV1BhOFV2Ui9DUFN2eWtxZjZkVlY4eC9kcDBjNW1GVE1USXUwdTBGbEdXUmlveXk3Tm4wUEdBZEh4cEpabnVPL3V0K1BwUThVaUhBaWc9PQogCiB1cmktanNAXjQuMi4yOgogICB2ZXJzaW9uICI0LjQuMSIKQEAgLTExMDIsMTEgKzEwMTEsNiBAQAogICBkZXBlbmRlbmNpZXM6CiAgICAgcHVueWNvZGUgIl4yLjEuMCIKIAotdjgtY29tcGlsZS1jYWNoZUBeMi4wLjM6Ci0gIHZlcnNpb24gIjIuMy4wIgotICByZXNvbHZlZCAiaHR0cHM6Ly9yZWdpc3RyeS55YXJucGtnLmNvbS92OC1jb21waWxlLWNhY2hlLy0vdjgtY29tcGlsZS1jYWNoZS0yLjMuMC50Z3ojMmRlMTk2MThjNjZkYzI0N2RjZmI2Zjk5MzM4MDM1ZDgyNDVhMmNlZSIKLSAgaW50ZWdyaXR5IHNoYTUxMi1sOGxDRW1MY0xZWmg0bmJ1bk5adlFDSmM1cHY3K1JDd2E4cS9MZFV4OHU3bHNXdlBES21wb2RKQUpOd2tBaEpDLy9kRlk0OEt1SUVtanRkNFJWaURyQT09Ci0KIHdoaWNoQF4yLjAuMToKICAgdmVyc2lvbiAiMi4wLjIiCiAgIHJlc29sdmVkICJodHRwczovL3JlZ2lzdHJ5Lnlhcm5wa2cuY29tL3doaWNoLy0vd2hpY2gtMi4wLjIudGd6IzdjNmE4ZGQwYTYzNmEwMzI3ZTEwYjU5YzkyODZlZWU5M2YzZjUxYjEiCkBAIC0xMTIyLDkgKzEwMjYsMTQgQEAKIHdyYXBweUAxOgogICB2ZXJzaW9uICIxLjAuMiIKICAgcmVzb2x2ZWQgImh0dHBzOi8vcmVnaXN0cnkueWFybnBrZy5jb20vd3JhcHB5Ly0vd3JhcHB5LTEuMC4yLnRneiNiNTI0M2Q4ZjNlYzFhYTM1ZjEzNjQ2MDViYzBkMTAzNmUzMGFiNjlmIgotICBpbnRlZ3JpdHkgc2hhMS10U1E5ano3QnFqWHhOa1lGdkEwUU51TUt0cDg9CisgIGludGVncml0eSBzaGE1MTItbDRTcC9EUnNlb3I5d0w2RXZWMitUdVFuNjNkTWtQalovc3A5WGtnaFRFYlY5S2xQUzF4VXNaM3U3L0lRTzR3eHRjRkI0YmdwUVBSY1IzUUN2ZXpQY1E9PQogCiB5YWxsaXN0QF40LjAuMDoKICAgdmVyc2lvbiAiNC4wLjAiCiAgIHJlc29sdmVkICJodHRwczovL3JlZ2lzdHJ5Lnlhcm5wa2cuY29tL3lhbGxpc3QvLS95YWxsaXN0LTQuMC4wLnRneiM5YmI5Mjc5MGQ5YzBlZmZlYzYzYmU3MzUxOWUxMWEzNTAxOWEzYTcyIgogICBpbnRlZ3JpdHkgc2hhNTEyLTN3ZEdpZFp5cTVQQjA4NFhMRVM1VHBPU1JBM3dqWEFsSVdNaHVtMmtSY3YvNDFTbjJlbVEwZHljUVc0dVpYTGVqd0t2ZzZFc3ZiZGxWTCtGWUVjdDdBPT0KKworeW9jdG8tcXVldWVAXjAuMS4wOgorICB2ZXJzaW9uICIwLjEuMCIKKyAgcmVzb2x2ZWQgImh0dHBzOi8vcmVnaXN0cnkueWFybnBrZy5jb20veW9jdG8tcXVldWUvLS95b2N0by1xdWV1ZS0wLjEuMC50Z3ojMDI5NGViM2RlZTA1MDI4ZDMxZWUxYTVmYTJjNTU2YTZhYWYxMGExYiIKKyAgaW50ZWdyaXR5IHNoYTUxMi1yVmtzdnNuTkNkSi9vaEdjNnhnUHd5TjhlaGVDeHNpTE04bXh1RS90L21PVnFKZXdQdU8xbWlMcFRIUWlSZ1RLQ0xleEw0TWVBRlZhZ3RzN0htTloyUT09CmRpZmYgLS1naXQgYS90b29scy9jaS9idWlsZGtpdGUueWFtbCBiL3Rvb2xzL2NpL2J1aWxka2l0ZS55YW1sCmluZGV4IGUyMGM1MjMuLjMwYTdlMjQgMTAwNjQ0Ci0tLSBhL3Rvb2xzL2NpL2J1aWxka2l0ZS55YW1sCisrKyBiL3Rvb2xzL2NpL2J1aWxka2l0ZS55YW1sCkBAIC0xOSw2ICsxOSwxMyBAQAogICAgICAgLSB0b29scy9jaS9jbGVhbi1kaXNrLnNoCiAgICAgICAtIHRvb2xzL2JhemVsICR7U1RBUlRVUH0gLS1vdXRwdXRfYmFzZT0uLi9rOF9vdXRwdXRfYmFzZSB0ZXN0ICR7Q09NTU9OfSAtLWNvbmZpZz1rOCAtLWNvbmZpZz1laWdlbiAke1RBUkdFVFN9CiAKKyAgIyBUZW1wb3Jhcnkgc3RlcCB1bnRpbCBJIG1hbmFnZSB0byBtaWdyYXRlIGV2ZXJ5dGhpbmcgb3Zlci4KKyAgIyBUT0RPKHBoaWwpOiBEZWxldGUgdGhpcyBzdGVwLgorICAtIGxhYmVsOiAieDg2XzY0X3Vwc3RyZWFtX3B5dGhvbiIKKyAgICBjb21tYW5kczoKKyAgICAgIC0gdG9vbHMvY2kvY2xlYW4tZGlzay5zaAorICAgICAgLSB0b29scy9iYXplbCAke1NUQVJUVVB9IC0tb3V0cHV0X2Jhc2U9Li4vazhfb3V0cHV0X2Jhc2VfdXBzdHJlYW1fcHl0aG9uIHRlc3QgJHtDT01NT059IC0tY29uZmlnPWs4X3Vwc3RyZWFtX3B5dGhvbiAtLWNvbmZpZz1laWdlbiAtLWJ1aWxkX3Rlc3RzX29ubHkgLS10ZXN0X2xhbmdfZmlsdGVycz1weSAke1RBUkdFVFN9CisKICAgLSBsYWJlbDogInJvYm9yaW8iCiAgICAgY29tbWFuZHM6CiAgICAgICAtIHRvb2xzL2NpL2NsZWFuLWRpc2suc2gKZGlmZiAtLWdpdCBhL3Rvb2xzL3BsYXRmb3Jtcy9CVUlMRCBiL3Rvb2xzL3BsYXRmb3Jtcy9CVUlMRAppbmRleCAxZDc5ZjA2Li42MTY1YjAwIDEwMDY0NAotLS0gYS90b29scy9wbGF0Zm9ybXMvQlVJTEQKKysrIGIvdG9vbHMvcGxhdGZvcm1zL0JVSUxECkBAIC0xMSw2ICsxMSwxOCBAQAogICAgIF0sCiApCiAKKyMgVE9ETyhwaGlsKTogRGVsZXRlIHRoaXMgcGxhdGZvcm0gYWZ0ZXIgbWlncmF0aW5nIGV2ZXJ5dGhpbmcgdG8gdXNlIHVwc3RyZWFtCisjIHBpcCBydWxlcy4KK3BsYXRmb3JtKAorICAgIG5hbWUgPSAibGludXhfeDg2X3Vwc3RyZWFtX3B5dGhvbiIsCisgICAgY29uc3RyYWludF92YWx1ZXMgPSBbCisgICAgICAgICIvL3Rvb2xzL3BsYXRmb3Jtcy9weXRob246dXBzdHJlYW1fYnVuZGxlZF9weXRob24iLAorICAgIF0sCisgICAgcGFyZW50cyA9IFsKKyAgICAgICAgIjpsaW51eF94ODYiLAorICAgIF0sCispCisKIHBsYXRmb3JtKAogICAgIG5hbWUgPSAibGludXhfYXJtdjciLAogICAgIGNvbnN0cmFpbnRfdmFsdWVzID0gWwpkaWZmIC0tZ2l0IGEvdG9vbHMvcGxhdGZvcm1zL3B5dGhvbi9CVUlMRCBiL3Rvb2xzL3BsYXRmb3Jtcy9weXRob24vQlVJTEQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGExM2JiZAotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL3BsYXRmb3Jtcy9weXRob24vQlVJTEQKQEAgLTAsMCArMSwyMSBAQAorIyBUT0RPKHBoaWwpOiBEZWxldGUgdGhpcyBmaWxlIGFmdGVyIG1pZ3JhdGluZyBldmVyeXRoaW5nIHRvIHVzZSB1cHN0cmVhbSBwaXAKKyMgcnVsZXMuCisKK3BhY2thZ2UoZGVmYXVsdF92aXNpYmlsaXR5ID0gWyIvL3Zpc2liaWxpdHk6cHVibGljIl0pCisKK2NvbnN0cmFpbnRfc2V0dGluZygKKyAgICBuYW1lID0gInB5dGhvbl9zb3VyY2UiLAorICAgIGRlZmF1bHRfY29uc3RyYWludF92YWx1ZSA9ICI6ZGViaWFuX2J1bmRsZWRfcHl0aG9uIiwKKykKKworIyBQeXRob24gY29kZSB0YWtlbiBmcm9tIC5kZWIgcGFja2FnZXMuCitjb25zdHJhaW50X3ZhbHVlKAorICAgIG5hbWUgPSAiZGViaWFuX2J1bmRsZWRfcHl0aG9uIiwKKyAgICBjb25zdHJhaW50X3NldHRpbmcgPSAiOnB5dGhvbl9zb3VyY2UiLAorKQorCisjIFB5dGhvbiBjb2RlIHRha2VuIGZyb20gcHlwaS5vcmcuCitjb25zdHJhaW50X3ZhbHVlKAorICAgIG5hbWUgPSAidXBzdHJlYW1fYnVuZGxlZF9weXRob24iLAorICAgIGNvbnN0cmFpbnRfc2V0dGluZyA9ICI6cHl0aG9uX3NvdXJjZSIsCispCmRpZmYgLS1naXQgYS90b29scy9weXRob24vQlVJTEQgYi90b29scy9weXRob24vQlVJTEQKaW5kZXggOTkzOTY1My4uMzcxMDFmNSAxMDA2NDQKLS0tIGEvdG9vbHMvcHl0aG9uL0JVSUxECisrKyBiL3Rvb2xzL3B5dGhvbi9CVUlMRApAQCAtMSw0ICsxLDUgQEAKIGxvYWQoIkBydWxlc19weXRob24vL3B5dGhvbjpkZWZzLmJ6bCIsICJweV9ydW50aW1lX3BhaXIiKQorbG9hZCgiQHJ1bGVzX3B5dGhvbi8vcHl0aG9uOnBpcC5iemwiLCAiY29tcGlsZV9waXBfcmVxdWlyZW1lbnRzIikKIAogcHlfcnVudGltZSgKICAgICBuYW1lID0gInB5dGhvbjNfcnVudGltZSIsCkBAIC0yNSw3ICsyNiw1MiBAQAogICAgIHRhcmdldF9jb21wYXRpYmxlX3dpdGggPSBbCiAgICAgICAgICJAcGxhdGZvcm1zLy9jcHU6eDg2XzY0IiwKICAgICAgICAgIkBwbGF0Zm9ybXMvL29zOmxpbnV4IiwKKyAgICAgICAgIi8vdG9vbHMvcGxhdGZvcm1zL3B5dGhvbjpkZWJpYW5fYnVuZGxlZF9weXRob24iLAogICAgIF0sCiAgICAgdG9vbGNoYWluID0gIjpweV9ydW50aW1lIiwKICAgICB0b29sY2hhaW5fdHlwZSA9ICJAcnVsZXNfcHl0aG9uLy9weXRob246dG9vbGNoYWluX3R5cGUiLAogKQorCisjIEludm9rZSB0aGlzIHZpYSAiYmF6ZWwgcnVuIC8vdG9vbHMvcHl0aG9uOnJlcXVpcmVtZW50cy51cGRhdGUiLgorY29tcGlsZV9waXBfcmVxdWlyZW1lbnRzKAorICAgIG5hbWUgPSAicmVxdWlyZW1lbnRzIiwKKyAgICByZXF1aXJlbWVudHNfaW4gPSAicmVxdWlyZW1lbnRzLnR4dCIsCisgICAgcmVxdWlyZW1lbnRzX3R4dCA9ICJyZXF1aXJlbWVudHMubG9jay50eHQiLAorICAgIHRhZ3MgPSBbCisgICAgICAgICMgVGhlIHRlc3QgcGluZ3MgcHlwaS5vcmcgdG8gbWFrZSBzdXJlIHRoYXQgdGhlIGxvY2sgZmlsZSBtYXRjaGVzIHRoZQorICAgICAgICAjIHJlcXVpcmVtZW50cyBmaWxlLgorICAgICAgICAjIFRPRE8ocGhpbCk6IERpc2FibGUgdGhpcyBpZiBpdCdzIHRvbyBmbGFreS4KKyAgICAgICAgInJlcXVpcmVzLW5ldHdvcmsiLAorICAgIF0sCispCisKK3B5X3J1bnRpbWUoCisgICAgbmFtZSA9ICJ1cHN0cmVhbV9weXRob24zX3J1bnRpbWUiLAorICAgIGZpbGVzID0gWworICAgICAgICAicnVudGltZV9iaW5hcnkuc2giLAorICAgICAgICAiQHB5dGhvbjNfOV94ODZfNjQtdW5rbm93bi1saW51eC1nbnUvLzpmaWxlcyIsCisgICAgXSwKKyAgICBpbnRlcnByZXRlciA9ICJydW50aW1lX2JpbmFyeS5zaCIsCisgICAgcHl0aG9uX3ZlcnNpb24gPSAiUFkzIiwKKykKKworcHlfcnVudGltZV9wYWlyKAorICAgIG5hbWUgPSAidXBzdHJlYW1fcHlfcnVudGltZSIsCisgICAgcHkyX3J1bnRpbWUgPSBOb25lLAorICAgIHB5M19ydW50aW1lID0gIjp1cHN0cmVhbV9weXRob24zX3J1bnRpbWUiLAorKQorCit0b29sY2hhaW4oCisgICAgbmFtZSA9ICJ1cHN0cmVhbV9weXRob25fdG9vbGNoYWluIiwKKyAgICBleGVjX2NvbXBhdGlibGVfd2l0aCA9IFsKKyAgICAgICAgIkBwbGF0Zm9ybXMvL2NwdTp4ODZfNjQiLAorICAgICAgICAiQHBsYXRmb3Jtcy8vb3M6bGludXgiLAorICAgIF0sCisgICAgdGFyZ2V0X2NvbXBhdGlibGVfd2l0aCA9IFsKKyAgICAgICAgIkBwbGF0Zm9ybXMvL2NwdTp4ODZfNjQiLAorICAgICAgICAiQHBsYXRmb3Jtcy8vb3M6bGludXgiLAorICAgICAgICAiLy90b29scy9wbGF0Zm9ybXMvcHl0aG9uOnVwc3RyZWFtX2J1bmRsZWRfcHl0aG9uIiwKKyAgICBdLAorICAgIHRvb2xjaGFpbiA9ICI6dXBzdHJlYW1fcHlfcnVudGltZSIsCisgICAgdG9vbGNoYWluX3R5cGUgPSAiQHJ1bGVzX3B5dGhvbi8vcHl0aG9uOnRvb2xjaGFpbl90eXBlIiwKKykKZGlmZiAtLWdpdCBhL3Rvb2xzL3B5dGhvbi9waXBfY29uZmlndXJlLnB5IGIvdG9vbHMvcHl0aG9uL3BpcF9jb25maWd1cmUucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGY5ZGZmMQotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL3B5dGhvbi9waXBfY29uZmlndXJlLnB5CkBAIC0wLDAgKzEsODAgQEAKKyIiIlRoaXMgc2NyaXB0IGdlbmVyYXRlcyBjb250ZW50cyBvZiB0aGUgQHBpcCByZXBvc2l0b3J5LgorCitUaGlzIHJlcG9zaXRvcnkgaXMganVzdCBhIHdheSB0byBoYXZlIHNpbXBsZS10by13cml0ZSB0YXJnZXRzIHRvIHNwZWNpZnkgaW4KK0JVSUxEIGZpbGVzLiAgRS5nLiB5b3UgY2FuIHVzZSBAcGlwLy9udW1weS4KKworVGhlIHBpcCBwYWNrYWdlIG5hbWVzIGFyZSBub3JtYWxpemVkOgorLSBMZXR0ZXJzIGFyZSBsb3dlcmNhc2VkLgorLSBQZXJpb2RzIGFyZSByZXBsYWNlZCBieSB1bmRlcnNjb3Jlcy4KKy0gRGFzaGVzIGFyZSByZXBsYWNlZCBieSB1bmRlcnNjb3Jlcy4KKworV2UgZG8gdGhpcyBub3JtYWxpemF0aW9uIGJlY2F1c2UgaXQgcHJvZHVjZXMgcHJlZGljdGFibGUgbmFtZXMuIHBpcCBhbGxvd3MgYQord2lkZSByYW5nZSBvZiBuYW1lcyB0byByZWZlciB0byB0aGUgc2FtZSBwYWNrYWdlLiBUaGF0IHdvdWxkIGJlIGFubm95aW5nIHRvIHVzZQoraW4gQlVJTEQgZmlsZXMuCisiIiIKKworaW1wb3J0IHN5cworaW1wb3J0IHRleHR3cmFwCitmcm9tIHBhdGhsaWIgaW1wb3J0IFBhdGgKKworCitkZWYgcGFyc2VfcmVxdWlyZW1lbnRzKHJlcXVpcmVtZW50c19wYXRoOiBQYXRoKSAtPiBsaXN0W3N0cl06CisgICAgIiIiUGFyc2VzIHRvb2xzL3B5dGhvbi9yZXF1aXJlbWVudHMudHh0LgorCisgICAgV2UgZG9uJ3Qgd2FudCB0byBwYXJzZSB0aGUgbG9jayBmaWxlIHNpbmNlIHdlIHJlYWxseSBvbmx5IHdhbnQgdXNlcnMgdG8KKyAgICBkZXBlbmQgb24gZXhwbGljaXRseSByZXF1ZXN0ZWQgcGlwIHBhY2thZ2VzLiBXZSBkb24ndCB3YW50IHVzZXJzIHRvIGRlcGVuZAorICAgIG9uIHRyYW5zaXRpdmUgZGVwZW5kZW5jaWVzIG9mIG91ciByZXF1ZXN0ZWQgcGlwIHBhY2thZ2VzLgorICAgICIiIgorICAgIHJlc3VsdCA9IFtdCisgICAgZm9yIGxpbmUgaW4gcmVxdWlyZW1lbnRzX3BhdGgucmVhZF90ZXh0KCkuc3BsaXRsaW5lcygpOgorICAgICAgICAjIElnbm9yZSBsaW5lIGNvbW1lbnRzLgorICAgICAgICBpZiBub3QgbGluZSBvciBsaW5lLnN0YXJ0c3dpdGgoIiMiKToKKyAgICAgICAgICAgIGNvbnRpbnVlCisKKyAgICAgICAgIyBSZW1vdmUgYW55IGlubGluZSBjb21tZW50cyB0aGF0IG1heSBvciBtYXkgbm90IGV4aXN0LgorICAgICAgICAjIEUuZzoKKyAgICAgICAgIyBudW1weT09MS4yLjMgICMgbmVlZGVkIGJlY2F1c2Ugd2UgbGlrZSBpdC4KKyAgICAgICAgcmVzdWx0LmFwcGVuZChsaW5lLnNwbGl0KClbMF0pCisKKyAgICByZXR1cm4gcmVzdWx0CisKKworZGVmIGdlbmVyYXRlX2J1aWxkX2ZpbGVzKHJlcXVpcmVtZW50czogbGlzdFtzdHJdKSAtPiBOb25lOgorICAgICIiIkdlbmVyYXRlIGFsbCB0aGUgQlVJTEQgZmlsZXMgaW4gdGhlICJwaXAiIGV4dGVybmFsIHJlcG9zaXRvcnkuCisKKyAgICBXZSBjcmVhdGUgZmlsZXMgbGlrZSB0aGlzOgorCisgICAgICAgIGV4dGVybmFsL3BpcC9udW1weS9CVUlMRAorCisgICAgYW5kIGluIHRoYXQgQlVJTEQgZmlsZSB3ZSBjcmVhdGUgYSAibnVtcHkiIHRhcmdldC4gVGhhdCBsZXRzIHVzZXJzIGRlcGVuZAorICAgIG9uICJAcGlwLy9udW1weSIuCisgICAgIiIiCisgICAgZm9yIHJlcXVpcmVtZW50IGluIHJlcXVpcmVtZW50czoKKyAgICAgICAgcmVxdWlyZW1lbnQgPSByZXF1aXJlbWVudC5sb3dlcigpLnJlcGxhY2UoIi0iLCAiXyIpLnJlcGxhY2UoIi4iLCAiXyIpCisgICAgICAgIHJlcXVpcmVtZW50X2RpciA9IFBhdGgocmVxdWlyZW1lbnQpCisgICAgICAgIHJlcXVpcmVtZW50X2Rpci5ta2RpcigpCisgICAgICAgICMgV2UgY291bGQgdXNlIGFuIGFsaWFzKCkgaGVyZSwgYnV0IHRoYXQgYmVoYXZlcyBzdHJhbmdlbHkgd2l0aAorICAgICAgICAjIHRhcmdldF9jb21wYXRpYmxlX3dpdGggcHJlLTYuMC4KKyAgICAgICAgKHJlcXVpcmVtZW50X2RpciAvICJCVUlMRCIpLndyaXRlX3RleHQoCisgICAgICAgICAgICB0ZXh0d3JhcC5kZWRlbnQoZiIiIlwKKyAgICAgICAgICAgIGxvYWQoIkBwaXBfZGVwcy8vOnJlcXVpcmVtZW50cy5iemwiLCAicmVxdWlyZW1lbnQiKQorICAgICAgICAgICAgcHlfbGlicmFyeSgKKyAgICAgICAgICAgICAgICBuYW1lID0gIntyZXF1aXJlbWVudH0iLAorICAgICAgICAgICAgICAgIGRlcHMgPSBbcmVxdWlyZW1lbnQoIntyZXF1aXJlbWVudH0iKV0sCisgICAgICAgICAgICAgICAgdmlzaWJpbGl0eSA9IFsiLy92aXNpYmlsaXR5OnB1YmxpYyJdLAorICAgICAgICAgICAgICAgIHRhcmdldF9jb21wYXRpYmxlX3dpdGggPSBbCisgICAgICAgICAgICAgICAgICAgICJALy90b29scy9wbGF0Zm9ybXMvcHl0aG9uOnVwc3RyZWFtX2J1bmRsZWRfcHl0aG9uIiwKKyAgICAgICAgICAgICAgICBdLAorICAgICAgICAgICAgKQorICAgICAgICAgICAgIiIiKSkKKworCitkZWYgbWFpbihhcmd2KToKKyAgICByZXF1aXJlbWVudHNfcGF0aCA9IFBhdGgoYXJndlsxXSkKKyAgICByZXF1aXJlbWVudHMgPSBwYXJzZV9yZXF1aXJlbWVudHMocmVxdWlyZW1lbnRzX3BhdGgpCisKKyAgICBnZW5lcmF0ZV9idWlsZF9maWxlcyhyZXF1aXJlbWVudHMpCisKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICBzeXMuZXhpdChtYWluKHN5cy5hcmd2KSkKZGlmZiAtLWdpdCBhL3Rvb2xzL3B5dGhvbi9yZXBvX2RlZnMuYnpsIGIvdG9vbHMvcHl0aG9uL3JlcG9fZGVmcy5iemwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzBjMjEyYgotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL3B5dGhvbi9yZXBvX2RlZnMuYnpsCkBAIC0wLDAgKzEsMzMgQEAKK2RlZiBfcGlwX2NvbmZpZ3VyZV9pbXBsKHJlcG9zaXRvcnlfY3R4KToKKyAgICAiIiJSdW5zIHRvb2xzL3B5dGhvbi9waXBfY29uZmlndXJlLnB5LiIiIgorICAgIHNjcmlwdF9wYXRoID0gcmVwb3NpdG9yeV9jdHgucGF0aChyZXBvc2l0b3J5X2N0eC5hdHRyLl9zY3JpcHQpLnJlYWxwYXRoCisgICAgaW50ZXJwcmV0ZXJfcGF0aCA9IHJlcG9zaXRvcnlfY3R4LnBhdGgocmVwb3NpdG9yeV9jdHguYXR0ci5faW50ZXJwcmV0ZXIpLnJlYWxwYXRoCisgICAgcmVxdWlyZW1lbnRzX3BhdGggPSByZXBvc2l0b3J5X2N0eC5wYXRoKHJlcG9zaXRvcnlfY3R4LmF0dHIuX3JlcXVpcmVtZW50cykucmVhbHBhdGgKKworICAgIHNjcmlwdF9yZXN1bHQgPSByZXBvc2l0b3J5X2N0eC5leGVjdXRlKFsKKyAgICAgICAgaW50ZXJwcmV0ZXJfcGF0aCwKKyAgICAgICAgIi1CU3MiLAorICAgICAgICBzY3JpcHRfcGF0aCwKKyAgICAgICAgcmVxdWlyZW1lbnRzX3BhdGgsCisgICAgXSkKKyAgICBpZiBzY3JpcHRfcmVzdWx0LnJldHVybl9jb2RlICE9IDA6CisgICAgICAgIGZhaWwoInt9IGZhaWxlZDoge30gKHt9KSIuZm9ybWF0KAorICAgICAgICAgICAgc2NyaXB0X3BhdGgsCisgICAgICAgICAgICBzY3JpcHRfcmVzdWx0LnN0ZG91dCwKKyAgICAgICAgICAgIHNjcmlwdF9yZXN1bHQuc3RkZXJyLAorICAgICAgICApKQorCitwaXBfY29uZmlndXJlID0gcmVwb3NpdG9yeV9ydWxlKAorICAgIGltcGxlbWVudGF0aW9uID0gX3BpcF9jb25maWd1cmVfaW1wbCwKKyAgICBhdHRycyA9IHsKKyAgICAgICAgIl9pbnRlcnByZXRlciI6IGF0dHIubGFiZWwoCisgICAgICAgICAgICBkZWZhdWx0ID0gIkBweXRob24zXzlfeDg2XzY0LXVua25vd24tbGludXgtZ251Ly86YmluL3B5dGhvbjMiLAorICAgICAgICApLAorICAgICAgICAiX3NjcmlwdCI6IGF0dHIubGFiZWwoCisgICAgICAgICAgICBkZWZhdWx0ID0gIkAvL3Rvb2xzL3B5dGhvbjpwaXBfY29uZmlndXJlLnB5IiwKKyAgICAgICAgKSwKKyAgICAgICAgIl9yZXF1aXJlbWVudHMiOiBhdHRyLmxhYmVsKAorICAgICAgICAgICAgZGVmYXVsdCA9ICJALy90b29scy9weXRob246cmVxdWlyZW1lbnRzLnR4dCIsCisgICAgICAgICksCisgICAgfSwKKykKZGlmZiAtLWdpdCBhL3Rvb2xzL3B5dGhvbi9yZXF1aXJlbWVudHMubG9jay50eHQgYi90b29scy9weXRob24vcmVxdWlyZW1lbnRzLmxvY2sudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMzN2VhZjgKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9weXRob24vcmVxdWlyZW1lbnRzLmxvY2sudHh0CkBAIC0wLDAgKzEsMjI0IEBACisjCisjIFRoaXMgZmlsZSBpcyBhdXRvZ2VuZXJhdGVkIGJ5IHBpcC1jb21waWxlIHdpdGggcHl0aG9uIDMuOQorIyBUbyB1cGRhdGUsIHJ1bjoKKyMKKyMgICAgYmF6ZWwgcnVuIC8vdG9vbHMvcHl0aG9uOnJlcXVpcmVtZW50cy51cGRhdGUKKyMKK2N5Y2xlcj09MC4xMS4wIFwKKyAgICAtLWhhc2g9c2hhMjU2OjNhMjdlOTVmNzYzYTQyOGE3MzlkMmFkZDk3OWZhNzQ5NGM5MTJhMzJjMTdjNGMzOGM0ZDVmMDgyY2FkMTY1YTMgXAorICAgIC0taGFzaD1zaGEyNTY6OWM4NzQwNTgzOWExOTY5NmU4MzdiM2I4MThmZWQzZjVmNjlmMTZmMWVlYzFhMWFkNzdlMDQzZGNlYTljNzcyZgorICAgICMgdmlhIG1hdHBsb3RsaWIKK2ZvbnR0b29scz09NC4yOC41IFwKKyAgICAtLWhhc2g9c2hhMjU2OjU0NWMwNWQwZjc5MDNhODYzYzIwMjBlMDdiOGYwYTU3NTE3ZjJjNDBkOTQwYmRlZDc3MDc2Mzk3ODcyZDE0Y2EgXAorICAgIC0taGFzaD1zaGEyNTY6ZWRmMjUxZDVkMmNjMDU4MGQ1ZjcyZGU0NjIxYzMzOGQ4YzY2YzVmNjFhYmI1MGNmNDg2NjQwZjczYzgxOTRkNQorICAgICMgdmlhIG1hdHBsb3RsaWIKK2tpd2lzb2x2ZXI9PTEuMy4yIFwKKyAgICAtLWhhc2g9c2hhMjU2OjAwMDc4NDAxODZiYWNmYWEwYWJhNDQ2NmQ1ODkwMzM0ZWE1OTM4ZTBiYjdlMjgwNzhhMGViMGU2M2I1YjU5ZDUgXAorICAgIC0taGFzaD1zaGEyNTY6MTk1NTRiZDhkNTRjZjQxMTM5ZjM3Njc1M2FmMWE2NDRiNjNjOWNhOTNmOGY3MjAwOWQ1MGEyMDgwZjg3MGY3NyBcCisgICAgLS1oYXNoPXNoYTI1NjoxZDQ1ZDFjNzRmODhiOWY0MTA2MjcxNmM3MjdmNzhmMmE1OWE1NDc2ZWNiZTc0OTU2ZmFmYjQyM2M1Yzg3YTc2IFwKKyAgICAtLWhhc2g9c2hhMjU2OjFkODE5NTUzNzMwZDNjMjcyNDU4MjEyNGFlZThhMDNjODQ2ZWM0MzYyZGVkMTAzNGMxNmZiM2VmMzA5MjY0ZTYgXAorICAgIC0taGFzaD1zaGEyNTY6MjIxMGYyODc3OGM3ZDJlZTEzZjNjMmEyMGEzYTIyZGI4ODllNzVmNGVjMTNhMjEwNzJlYWJiNTY5MzgwMWU4NCBcCisgICAgLS1oYXNoPXNoYTI1NjoyMjUyMTIxOWNhNzM5NjU0YTI5NmVlYTZkNDM2NzcwMzU1OGZiYTE2Zjk4Njg4YmQ4Y2U2NWFiZmYzNmVhYTg0IFwKKyAgICAtLWhhc2g9c2hhMjU2OjI1NDA1Zjg4YTM3YzVmNWJjYmEwMWM2ZTM1MDA4NmQ2NWU3NDY1ZmQxY2FhZjk4NjMzM2QyYTA0NTA0NWEyMjMgXAorICAgIC0taGFzaD1zaGEyNTY6MmI2NWJkMzVmM2UwNmE0N2I1YzMwZWE5OWUwYzJiODhmNzJjNjQ3NmVlZGFmOGNmYmM4ZTY2YWRiNTQ3OWRjZiBcCisgICAgLS1oYXNoPXNoYTI1NjoyZGRiNTAwYTI4MDhjMTAwZTcyYzA3NWNiYjAwYmYzMmU2Mjc2M2M4MmI2YTg4MmQ0MDNmMDFhMTE5ZTNmNDAyIFwKKyAgICAtLWhhc2g9c2hhMjU2OjJmOGY2YzhmNGYxY2ZmOTNjYTUwNThkNmVjNWYwZWZkYTkyMmVjYjNmNGM1ZmI3NjE4MWYzMjdkZWNmZjk4YjggXAorICAgIC0taGFzaD1zaGEyNTY6MzBmYTAwOGMxNzIzNTVjNzc2ODE1OTk4M2E3MjcwY2IyMzgzOGM0ZDdkYjczZDZjMGY2YjYwZGRlMGQ0MzJjNiBcCisgICAgLS1oYXNoPXNoYTI1NjozZGJiM2NlYTIwYjRhZjRmNDlmODRjZmZhZjQ1ZGQ1Zjg4ZTg1OTRkMTg1NjhlMDIyNWU2YWQ5ZGVjMGU3OTY3IFwKKyAgICAtLWhhc2g9c2hhMjU2OjQxMTZiYTlhNTgxMDllZDVlNGNiMzE1YmRjYmZmOTgzOGYzMTU5ZDA5OWJhNTI1OWM3YzdmYjc3Zjg1Mzc0OTIgXAorICAgIC0taGFzaD1zaGEyNTY6NDRlNmFkZjY3NTc3ZGJkZmEyZDlmMDZkYjlmYmM1NjM5YWZlZmRiNWJmMmI0ZGZlYzI1YzNhN2ZiYzYxOTUzNiBcCisgICAgLS1oYXNoPXNoYTI1Njo1MzI2ZGRmYWNiZTUxYWJmOTQ2OWZlNjY4OTQ0YmMyZTM5OTE4MWEyMTU4Y2I1ZDQ1ZTFkNDA4NTZiMmEwNTg5IFwKKyAgICAtLWhhc2g9c2hhMjU2OjcwYWRjMzY1ODEzOGJjNzdhMzZjZTc2OWY1ZjE4MzE2OWJjMGEyOTA2YTRmNjFmMDk2NzNmNzE4MTI1NWFjOWIgXAorICAgIC0taGFzaD1zaGEyNTY6NzJiZTZlYmI0ZTkyNTIwYjk3MjZkNzE0NmJjOWM5YjI3NzUxM2E1N2EzOGVmY2Y2NmRiMDYyMGFlYzAwOTdlMCBcCisgICAgLS1oYXNoPXNoYTI1Njo3ODQzYjE2MjRkNmNjY2E0MDNhNjEwZDEyNzdmN2MyOGFkMTg0YzVhYTg4YTE3NTBjMWE5OTk3NTRlNjViNDM5IFwKKyAgICAtLWhhc2g9c2hhMjU2OjdiYTVhMTA0MTQ4MGM2ZTBhOGIxMWE5NTQ0ZDUzNTYyYWJjMmQxOTIyMGJmYTE0MTMzZTBjZGQ5OTY3ZTk3YWYgXAorICAgIC0taGFzaD1zaGEyNTY6ODBlZmQyMDIxMDhjM2E0MTUwZTA0MmIyNjlmN2M3ODY0MzQyMGNjMjMyYTBhNzcxNzQzYmI5NmI3NDJmODM4ZiBcCisgICAgLS1oYXNoPXNoYTI1Njo4MmY0OWM1YTc5ZDM4MzliYzhmMzhjYjVmNGJmYzg3ZTE1ZjA0Y2JhZmE1ZmJkMTJmYjMyYzk0MWNiNTI5Y2ZiIFwKKyAgICAtLWhhc2g9c2hhMjU2OjgzZDJjOWRiNWRmYzUzN2QwMTcxZTMyZGUxNjA0NjEyMzBlYjE0NjYzMjk5YjdlNmQxOGNhNmRjYTIxZTQ5NzcgXAorICAgIC0taGFzaD1zaGEyNTY6OGQ5M2ExMDk1ZjgzZTkwOGZjMjUzZjJmYjU2OWMyNzExNDE0YzBiZmQ0NTFjYWI1ODA0NjY0NjViMjM1YjQ3MCBcCisgICAgLS1oYXNoPXNoYTI1Njo4ZGMzZDg0MmZhNDFhMzNmZTgzZDlmNWM2NmMwY2MxZjI4NzU2NTMwY2Q4OTk0NGI2M2IwNzIyODFlODUyMDMxIFwKKyAgICAtLWhhc2g9c2hhMjU2Ojk2NjFhMDRjYTNjOTUwYThhYzhjNDdmNTNjYmMwYjUzMGJjZTFiNTJmNTE2YTFlODdiNzczNmZlYzI0YmZmZjAgXAorICAgIC0taGFzaD1zaGEyNTY6YTQ5OGJjZDAwNWU4YTNmZWRkMDAyMmJiMzBlZTBhZDkyNzI4MTU0YTg3OThiNzAzZjM5NDQ4NDQ1MjU1MDUwNyBcCisgICAgLS1oYXNoPXNoYTI1NjphN2E0Y2Y1YmJkYzg2MTk4N2E3NzQ1YWVkN2E1MzZjNjQwNTI1Njg1M2M5NGFiYzlmMzI4N2MzZmE0MDFiMTc0IFwKKyAgICAtLWhhc2g9c2hhMjU2OmI1MDc0ZmIwOTQyOWYyYjdiYzgyYjZmYjRiZTg2NDVkY2JhYzE0ZTU5MjEyOGJlZWZmNTQ2MWRjZGUwYWYwOWYgXAorICAgIC0taGFzaD1zaGEyNTY6YjZhNTQzMTk0MGYyOGI2ZGUxMjNkZTQyZjBlYjQ3Yjg0YTA3M2VlM2MzMzQ1ZGMxMDlhZDU1MGEzMzA3ZGQyOCBcCisgICAgLS1oYXNoPXNoYTI1NjpiYTY3N2JjYWZmOTQyOWZkMWJmMDE2NDhhZDA5MDFjZWE1NmMwZDA2OGRmMzgzZDVmNTg1NmQ4ODIyMWZlNzViIFwKKyAgICAtLWhhc2g9c2hhMjU2OmJjYWRiMDVjM2Q0Nzk0ZWI5ZWVlMWRkZGYxYzI0MjE1YzkyZmI3YjU1YTgwYmVhZTdhNjA1MzBhOTEwNjA1NjAgXAorICAgIC0taGFzaD1zaGEyNTY6YmY3ZWI0NWQxNGZjMDM2NTE0YzA5NTU0YmY5ODNmMmE3MjMyMzI1NDkxMmVkMGMzYzhlNjk3YjYyYzRjMTU4ZiBcCisgICAgLS1oYXNoPXNoYTI1NjpjMzU4NzIxYWViZDQwYzI0Mzg5NDI5OGY2ODVhMTllYjA0OTFhNWMzZTBiOTIzYjlmODg3ZWYxMTkzZGRmODI5IFwKKyAgICAtLWhhc2g9c2hhMjU2OmM0NTUwYTM1OWM1MTU3YWFmODUwN2U2ODIwZDk4NjgyODcyYjkxMDBjZTc2MDdmOGFhMDcwYjRiOGFmNmMyOTggXAorICAgIC0taGFzaD1zaGEyNTY6YzY1NzJjMmRhYjIzYzg2YTE0ZTgyYzI0NTQ3M2Q0NWI0YzUxNTMxNGYxZjg1OWU5MjYwOGRjYWZiZDJmMTliOCBcCisgICAgLS1oYXNoPXNoYTI1NjpjYmE0MzBkYjY3M2MyOTM3NjEzNWU2OTVjNmUyNTAxYzQ0YzI1NmE4MTQ5NWRhODQ5ZTg1ZDE3OTNlZTk3NWFkIFwKKyAgICAtLWhhc2g9c2hhMjU2OmRlZGM3MWM4ZWI5YzUwOTYwMzc3NjYzOTAxNzJjMzRmYjg2ZWYwNDhiOGU4OTU4YjRlNDg0YjllNTA1ZDY2YmMgXAorICAgIC0taGFzaD1zaGEyNTY6ZTZmNWViMmY1M2ZhYzdkNDA4YTQ1ZmJjZGVkYTcyMjRiMWNmZmY2NDkxOWQwZjk1NDczNDIwYTkzMTM0N2FlOSBcCisgICAgLS1oYXNoPXNoYTI1NjplYzJlYmExODhjMTkwNmIwNWI5YjQ5YWU1NWFhZTRlZmQ4MTUwYzYxYmE0NTBlNjcyMWY2NDYyMGM1MGI1OWViIFwKKyAgICAtLWhhc2g9c2hhMjU2OmVlMDQwYTdkZThkMjk1ZGJkMjYxZWYyZDZkMzE5MmYxM2UyYjA4ZWM0YTk1NGRlMzRhNmZiOGZmNjQyMmUyNGMgXAorICAgIC0taGFzaD1zaGEyNTY6ZWVkZDNiNTkxOTA4ODVkMWViZGY2YzVlMGNhNTY4MjhiZWIxOTQ5YjRkZmU2ZTVkMDI1NmE0NjE0MjlhYzM4NiBcCisgICAgLS1oYXNoPXNoYTI1NjpmNDQxNDIyYmIzMTNhYjI1ZGU3YjNkYmZkMzg4ZTc5MGVjZWI3NmNlMDFhMTgxOTllYzQ5NDRiMzY5MDE3MDA5IFwKKyAgICAtLWhhc2g9c2hhMjU2OmY4ZWI3YjY3MTZmNWI1MGU5YzA2MjA3YTE0MTcyY2YyZGUyMDFlNDE5MTJlYmU3MzI4NDZjMDJjODMwNDU1YjkgXAorICAgIC0taGFzaD1zaGEyNTY6ZmM0NDUzNzA1YjgxZDAzNTY4ZDViODA4YWQ4ZjA5Yzc3YzQ3NTM0ZjZhYzJlNzJlNzMzZjljYTQ3MTRhYTc1YworICAgICMgdmlhIG1hdHBsb3RsaWIKK21hdHBsb3RsaWI9PTMuNS4xIFwKKyAgICAtLWhhc2g9c2hhMjU2OjE0MzM0Yjk5MDJlYzc3NjQ2MWM0YjhjNjUxNmUyNmI0NTBmN2ViZTBiM2VmODcwM2JmNWNkZmJiYWVjZjc3NGEgXAorICAgIC0taGFzaD1zaGEyNTY6MjI1MmJmYWM4NWNlYzdhZjRhNjdlNDk0YmZjY2Y5MDgwYmNiYThhMDI5OTcwMWVhYjA3NWY0ODg0N2NjYTkwNyBcCisgICAgLS1oYXNoPXNoYTI1NjoyZTM0ODRkODQ1NWFmM2ZkYjA0MjRlYWUxNzg5YWY2MWY2YTc5ZGEwYzgwMDc5MTI1MTEyZmQ1YzFiNjA0MjE4IFwKKyAgICAtLWhhc2g9c2hhMjU2OjM0YTFmYzI5ZjhmOTZlNzhlYzU3YTVlZmY1ZThkOGI1M2QzMjk4YzNiZTZkZjYxZTdhYTllZmJhMjY5Mjk1MjIgXAorICAgIC0taGFzaD1zaGEyNTY6M2U2NjQ5N2NkOTkwYjFhMTMwZTIxOTE5YjAwNGRhMmYxZGMxMTIxMzJjMDFhYzc4MDExYTkwYTBmOTIyOTc3OCBcCisgICAgLS1oYXNoPXNoYTI1Njo0MGUwZDdkZjA1ZThlZmU2MDM5N2M2OWI0NjdmYzhmODdhMmFmZmViNGQ1NjJmZTkyYjcyZmY4OTM3YTJiNTExIFwKKyAgICAtLWhhc2g9c2hhMjU2OjQ1NmNjODMzNGY2ZDExMjRlOGZmODU2YjQyZDJjYzFjODQzMzUzNzVhMTY0NDgxODk5OTk0OTY1NDlmNzE4MmIgXAorICAgIC0taGFzaD1zaGEyNTY6NTA2YjIxMGNjNmU2NmEwZDFjMmJiNzY1ZDA1NWY0ZjZiYzI3NDUwNzBmYjExMjkyMDNiNjdlODViYmZhNWMxOCBcCisgICAgLS1oYXNoPXNoYTI1Njo1MzI3M2M1NDg3ZDFjMTljM2JjMDNiOWViODJhZGFmODQ1NmYyNDNiOTdlZDc5ZDA5ZGRlZDc0N2FiYWYxMjM1IFwKKyAgICAtLWhhc2g9c2hhMjU2OjU3N2VkMjBlYzlhMThkNmJkZWRiNDYxNmY1ZTllOTU3YjRjMDg1NjNhOWY5ODU1NjNhMzFmZDViMTA1NjRkMmEgXAorICAgIC0taGFzaD1zaGEyNTY6NjgwMzI5OWNiZjQ2NjVlY2ExNDQyOGQ5ZTg4NmRlNjJlMjRmNDIyM2FjMzFhYjljNWQ2ZDUzMzlhMzk3ODJjNyBcCisgICAgLS1oYXNoPXNoYTI1Njo2OGZhMzBjZWM4OWI2MTM5ZGM1NTllZDZlZjIyNmM1M2ZkODAzOTZkYTE5MTlhMWI1ZWY2NzJjOTExYWFhNzY3IFwKKyAgICAtLWhhc2g9c2hhMjU2OjZjMDk0ZTRiZmVjZDJmYTdmOWFkZmZkMDNkOGFiY2VlZDcxNTdjOTI4YzI5NzY4OTlkZTI4MmYzNjAwZjBhM2QgXAorICAgIC0taGFzaD1zaGEyNTY6Nzc4ZDM5OGM0ODY2ZDhlMzZlZTNiZjgzMzc3OWM5NDBiNWY1NzE5MmZhMGE1NDliM2FkNjdiYzRjODIyNzcxYiBcCisgICAgLS1oYXNoPXNoYTI1Njo3YTM1MGNhNjg1ZDlmNTk0MTIzZjY1MmJhNzk2ZWUzNzIxOWJmNzJjOGUwZmM0YjQ3MTQ3M2Q4NzEyMWQ2ZDM0IFwKKyAgICAtLWhhc2g9c2hhMjU2Ojg3OTAwYzY3YzBmMTcyOGU2ZGIxN2M2ODA5ZWMwNWMwMjVjNjYyNGRjZjk2YTgwMjAzMjZlYTE1Mzc4ZmU4ZTcgXAorICAgIC0taGFzaD1zaGEyNTY6OGE3NzkwNmRjMmVmOWI2NzQwN2NlYzBiZGJmMDhlMzk3MTE0MWU1MzVkYjg4ODk3NGE5MTViZTVlMWUzZWZjNiBcCisgICAgLS1oYXNoPXNoYTI1Njo4ZTcwYWU2NDc1Y2ZkMGZhZDM4MTZkY2JmNmNhYzUzNmRjNmYxMDBmNzQ3NGJlNThkNTlmYTMwNmU2ZTc2OGE0IFwKKyAgICAtLWhhc2g9c2hhMjU2OmFiZjY3ZTA1YTFiN2Y4NjU4M2Y2ZWJkMDFmNjliNjkzYjljNTM1Mjc2ZjRlOTQzMjkyZTQ0NDg1NTg3MGExYjggXAorICAgIC0taGFzaD1zaGEyNTY6YjA0ZmMyOWJjZWYwNGQ0ZTJkNjI2YWYyOGQ5ZDg5MmJlNmFiYTk0ODU2Y2I0NmVkNTJiY2IyMTljZWFjODk0MyBcCisgICAgLS1oYXNoPXNoYTI1NjpiMTlhNzYxYjk0OGU5MzlhOWUyMDE3M2FhYWU3NjA3MDAyNWYwMDI0ZmM4ZjdiYTA4YmVmMjJhNWM4NTczYWZjIFwKKyAgICAtLWhhc2g9c2hhMjU2OmIyZTk4MTBlMDljM2E0N2I3M2NlOWNhYjVhNzIyNDNhMTI1OGY2MWU3OTAwOTY5MDk3YTgxNzIzMjI0NmNlMWMgXAorICAgIC0taGFzaD1zaGEyNTY6YjcxZjNhN2NhOTM1ZmM3NTlmMmFlZDdjZWMwNmNmZTEwYmMzMTAwZmFkYjVkYmQ5YzQzNWIwNGU1NTc5NzFlMSBcCisgICAgLS1oYXNoPXNoYTI1NjpiOGE0ZmIyYTBjNWFmYmU5NjA0ZjhhOTFkN2QwZjI3YjE4MzJjM2UwYjVlMzY1Zjk1YTEzMDE1ODIyYjRjZDY1IFwKKyAgICAtLWhhc2g9c2hhMjU2OmJiMWM2MTM5MDhmMTFiYWMyNzBiYzc0OTRkNjhiMWVmNmU3YzIyNGI3YTQyMDRkNWRhY2YzNTIyYTQxZTJiYzMgXAorICAgIC0taGFzaD1zaGEyNTY6ZDI0ZTViYjgwMjg1NDFjZTI1ZTU5MzkwMTIyZjVlNDhjODUwNmI3ZTM1NTg3ZTUxMzVlZmNiNjQ3MWI0YWM2YyBcCisgICAgLS1oYXNoPXNoYTI1NjpkNzBhMzJlZTFmOGI1NWVlZDNmZDRlODkyZjAyODZkZjhjY2NjN2UwNDc1YzExZDMzYjVkMGExNDhmNWM3NTk5IFwKKyAgICAtLWhhc2g9c2hhMjU2OmUyOTNiMTZjZjMwM2ZlODI5OTVlNDE3MDBkMTcyYTU4YTE1ZWZjNTMzMTEyNWQwODI0NmI1MjA4NDNlZjIxZWUgXAorICAgIC0taGFzaD1zaGEyNTY6ZTJmMjhhMDdiNGY4MmFiYjQwMjY3ODY0YWQ3YjNhNGVkNzZmMWIxNjYzZTgxYzdlZmM4NGE5YjkyNDhmNjcyZiBcCisgICAgLS1oYXNoPXNoYTI1NjplMzUyMGEyNzRhMGUwNTRlOTE5ZjViMzI3OWVlNWRiY2NmNTMxMTgzMzgxOWNjZjMzOTlkYWI3YzgzZTkwYTI1IFwKKyAgICAtLWhhc2g9c2hhMjU2OmUzYjZmM2ZkMGQ4Y2EzNzg2MWMzMWU5YTdjYWI3MWEwZWYxNGM2MzliNGM5NTY1NGVhMWRkMTUzMTU4YmYwZGYgXAorICAgIC0taGFzaD1zaGEyNTY6ZTQ4NmY2MGRiMGNkMWM4ZDY4NDY0ZDk0ODRmZDJhOTQwMTFjMWFjODU5M2Q3NjVkMDIxMWY5ZGFiYTJiZDUzNSBcCisgICAgLS1oYXNoPXNoYTI1NjplOGM4N2NkYWYwNmZkN2IyNDc3ZjY4OTA5ODM4ZmY0MTc2ZjEwNTA2NGE3MmNhOWQyNGQzZjJhMjlmNzNkMzkzIFwKKyAgICAtLWhhc2g9c2hhMjU2OmVkZjVlNGUxZDVmYjIyYzE4ODIwZTg1ODZmYjg2NzQ1NWRlM2IxMDljMzA5Y2I0ZmNlM2FhZWQ4NWQ5NDY4ZDEgXAorICAgIC0taGFzaD1zaGEyNTY6ZmU4ZDQwYzQzNGE4ZTJjNjhkNjRjNmQ2YTA0ZTc3ZjIxNzkxYTkzZmY2YWZlMGRjZTE2OTU5N2MxMTBkMzA3OQorICAgICMgdmlhIC1yIHRvb2xzL3B5dGhvbi9yZXF1aXJlbWVudHMudHh0CitudW1weT09MS4yMS41IFwKKyAgICAtLWhhc2g9c2hhMjU2OjAwYzlmYTczYTY5ODk4OTViODgxNWQ5ODMwMGEyMGFjOTkzYzQ5YWMzNmM4Mjc3ZThmZmVhYTM2MzFjMGRiYmIgXAorICAgIC0taGFzaD1zaGEyNTY6MDI1YjQ5NzAxNGJjMzNmYzIzODk3ODU5MzUwZjI4NDMyM2YzMmEyZmZmNzY1NDY5N2Y1YTVmYzJhMTllOTkzOSBcCisgICAgLS1oYXNoPXNoYTI1NjowOGRlODQ3MmQ5Zjc1NzFmOWQ1MWIyN2I3NWU4MjdmNTI5NjI5NWZhNzg4MTcwMzJlODQ0NjRiZThiYjkwNWJjIFwKKyAgICAtLWhhc2g9c2hhMjU2OjE5NjRkYjJkNGEwMDM0OGI3YTYwZWU5ZDAxM2M4Y2IwYzU2NjY0NGE1ODllYWE4MDk5NTEyNmVhYzNiOTljZWQgXAorICAgIC0taGFzaD1zaGEyNTY6MmE5YWRkMjdkN2ZjMGZkYjU3MmFiYzNiMjQ4NmViM2IxMzk1ZGE3MWUwMjU0YzU1NTJiMmFhZDJhMThiNTQ0MSBcCisgICAgLS1oYXNoPXNoYTI1NjoyZDhhZGZjYTg0M2JjNDZhYzE5OWE0NjQ1MjMzZjEzYWJmMjAxMWEwYjJmNGFmZmM1YzM3Y2Q1NTI2MjZmMjdiIFwKKyAgICAtLWhhc2g9c2hhMjU2OjMwMWU0MDhhMDUyZmRjZGE1Y2RjZjAzMDIxZWJhZmMzYzZlYTA5MzAyMWJmOWQxYWE0N2M1NGQ0OGJkYWQxNjYgXAorICAgIC0taGFzaD1zaGEyNTY6MzExMjgzYWNmODgwY2ZjYzIwMzY5MjAxYmQ3NWRhOTA3OTA5YWZjNDY2Njk2NmM3ODk1Y2JlZDZmOWQyYzY0MCBcCisgICAgLS1oYXNoPXNoYTI1NjozNDFkZGRjZmUzYjdiNjQyN2EyOGEyN2JhYTU5YWY1YWQ1MWJhYTU5YmZlYzMyNjRmMWFiMjg3YWEzYjMwYjEzIFwKKyAgICAtLWhhc2g9c2hhMjU2OjNhNTA5OGRmMTE1MzQwZmIxN2ZjOTM4NjczMTdhOTQ3ZTFkY2Q5NzhjMzg4OGM1ZGRiMTE4MzY2MDk1ODUxZjggXAorICAgIC0taGFzaD1zaGEyNTY6M2M5Nzg1NDRiZTllMDRlZDEyMDE2ZGQyOTVhNzQyODM3NzMxNDliNDhmNTA3ZDY5YjM2ZjkxYWE5MGE2NDNlNSBcCisgICAgLS1oYXNoPXNoYTI1NjozZDg5M2IwODcxMzIyZWFhMmY4YzcwNzJjZGI1NTJkOGUyYjI3NjQ1Yjc4NzVhNzA4MzNjMzFlOTI3NGQ0NjExIFwKKyAgICAtLWhhc2g9c2hhMjU2OjRmZTZhMDA2NTU3Yjg3YjM1MmMwNDU5NmE2ZTNmMTJhNTdkNmU1ZjQwMWQ4MDQ5NDdiZDMxODhlNmIwZTBlNzYgXAorICAgIC0taGFzaD1zaGEyNTY6NTA3YzA1YzdhMzdiMzY4M2ViMDhhM2ZmOTkzYmQxZWUxZTZjNzUyZjc3YzJmMjc1MjYwNTMzYjI2NWVjZGI2YyBcCisgICAgLS1oYXNoPXNoYTI1Njo1OGNhMWQ3YzhhZWY2ZTk5NjExMmQwY2U4NzNhYzlkZmExZWFmNGExMTk2YjRmZjdmZjczODgwYTA5OTIzYmE3IFwKKyAgICAtLWhhc2g9c2hhMjU2OjYxYmFkYTQzZDQ5NDUxNWQ1YjEyMmY0NTMyYWYyMjZmZGI1ZWUwOGZlNWI1OTE4YjExMTI3OTg0M2RjNjgzNmEgXAorICAgIC0taGFzaD1zaGEyNTY6NjlhNWE4ZDcxYzMwOGQ3ZWYzM2VmNzIzNzFjMjM4OGE5MGUzNDk1ZGJiNzk5MzQzMGU2NzQwMDZmOTQ3OTdkNSBcCisgICAgLS1oYXNoPXNoYTI1Njo2YTU5MjhiYzYyNDEyNjRkY2U1ZWQ1MDllNjZmMzM2NzZmYzk3ZjQ2NGU3YTkxOWVkYzY3MmZiNTUzMjIyMWVlIFwKKyAgICAtLWhhc2g9c2hhMjU2OjdiOWQ2YjE0ZmM5YTQ4NjRiMDhkMWJhNTdkNzMyYjI0OGYwZTQ4MmM3YjJmZjU1YzMxMzEzN2UzZWQ0ZDg0NDkgXAorICAgIC0taGFzaD1zaGEyNTY6YTdjNGI3MDFjYTQxOGNkMzllMjhlYzNiNDk2ZTYzODhmZTA2ZGU4M2Y1ZjBjYjc0Nzk0ZmEzMWNmYTM4NGMwMiBcCisgICAgLS1oYXNoPXNoYTI1NjphN2U4ZjYyMTZmMTgwZjNmZDRlZmI3M2RlNWQxZWFlZmI1ZjVhMWVlNWI2NDVjNjczMzMwMzNlMzk0NDBlNjNhIFwKKyAgICAtLWhhc2g9c2hhMjU2OmI1NDVlYmFkYWEyYjg3OGM4NjMwZTViY2RiOTdmYzQwOTZlNzc5ZjMzNWZjMGY5NDM1NDdjMWM5MTU0MGM4MTUgXAorICAgIC0taGFzaD1zaGEyNTY6YzI5M2QzYzAzMjE5OTZjZDhmZmU4NDIxNWZmZTVkMjY5ZmQ5ZDFkMTJjNmY0ZmZlMmI1OTdhN2MzMGQzZTU5MyBcCisgICAgLS1oYXNoPXNoYTI1NjpjNTU2MmJjYzFhOWI2MTk2MGZjODk1MGFkZTQ0ZDAwZTNkZTI4Zjg5MWFmMGFjYzk2MzA3YzczNjEzZDE4ZjZlIFwKKyAgICAtLWhhc2g9c2hhMjU2OmNhOWMyMzg0ODI5MmM2ZmUwYTE5ZDIxMjc5MGU2MmYzOThmZDk2MDlhYWE4Mzg4NTliZTg0NTliZmJlNTU4YWEgXAorICAgIC0taGFzaD1zaGEyNTY6Y2MxYjMwMjA1ZDEzOGQxMDA1YWRiNTIwODdmZjQ1NzA4ZmViYmVmMGU0MjAzODZmNTg2NjRmOTg0ZWY1Njk1NCBcCisgICAgLS1oYXNoPXNoYTI1NjpkYmNlN2FkZWI2NmI4OTVjNmFhYTFmYWQ3OTZhYWVmYzI5OWNlZDU5N2Y2ZmJkOWNlZGRiMGRkNzM1MjQ1MzU0IFwKKyAgICAtLWhhc2g9c2hhMjU2OmRjNGIyZmIwMWYxYjRkZGJlMjQ1MzQ2OGVhMDcxOWY0ZGJiMWY1Y2FhNzEyYzhiMjFiYjNkZDE0ODBjZDMwZDkgXAorICAgIC0taGFzaD1zaGEyNTY6ZWVkMmFmYWE5N2VjMzNiNDQxMTk5NWJlMTJmOGJkYjk1Yzg3OTg0ZWFhMjhkNzZjZjYyODk3MGM4YTJkNjg5YSBcCisgICAgLS1oYXNoPXNoYTI1NjpmYzdhN2Q3YjBlZDcyNTg5ZmQ4Yjg0ODZiOWI0MmE1NjRmMTBiODc2MmJlOGJkNGQ5ZGY5NGI4MDdhZjRhMDg5CisgICAgIyB2aWEKKyAgICAjICAgLXIgdG9vbHMvcHl0aG9uL3JlcXVpcmVtZW50cy50eHQKKyAgICAjICAgbWF0cGxvdGxpYgorICAgICMgICBzY2lweQorcGFja2FnaW5nPT0yMS4zIFwKKyAgICAtLWhhc2g9c2hhMjU2OmRkNDdjNDI5MjdkODlhYjkxMWU2MDY1MTg5MDdjYzJkM2ExZjM4YmJkMDI2Mzg1OTcwNjQzZjljNWI4ZWNmZWIgXAorICAgIC0taGFzaD1zaGEyNTY6ZWYxMDNlMDVmNTE5Y2RjNzgzYWUyNGVhNGUyZTBmNTA4YTljOTliMmQ0OTY5NjUyZWVkNmEyZTFlYTViZDUyMgorICAgICMgdmlhIG1hdHBsb3RsaWIKK3BpbGxvdz09OC40LjAgXAorICAgIC0taGFzaD1zaGEyNTY6MDY2ZjM5OTljYjNiMDcwYTk1YzM2NTI3MTJjZmZhMWE3NDhjZDAyZDYwYWQ3YjRlNDg1YzM3NDhhMDRkOWQ3NiBcCisgICAgLS1oYXNoPXNoYTI1NjowYTA5NTZmZGM1ZGVmYzM0NDYyYmIxYzc2NWVlODhkOTMzMjM5ZjlhOTRiYzM3ZDEzMjAwNDc3NTI0MWE3NTg1IFwKKyAgICAtLWhhc2g9c2hhMjU2OjBiMDUyYTYxOWE4YmZjZjI2YmQ4YjNmNDhmNDUyODNmOWU5Nzc4OTAyNjNlNDU3MWYyMzkzZWQ4ODk4ZDMzMWIgXAorICAgIC0taGFzaD1zaGEyNTY6MTM5NGE2YWQ1YWJjODM4YzVjZDhhOTJjNWEwNzUzNTY0OGNkZjZkMDllOGUyZDZkZjkxNmRmYTllYTg2ZWFkOCBcCisgICAgLS1oYXNoPXNoYTI1NjoxYmM3MjNiNDM0ZmJjNGFiNTBiYjY4ZTExZTkzY2U1ZmI2OTg2NmFkNjIxZTNjMmM5YmRiMGNkNzBlMzQ1ZjU1IFwKKyAgICAtLWhhc2g9c2hhMjU2OjI0NGNmM2I5NzgwMmMzNGM0MTkwNWQyMjgxMDg0NjgwMmEzMzI5ZGRjYjkzY2NjNDMyODcwMjQzMjExYzc5ZmMgXAorICAgIC0taGFzaD1zaGEyNTY6MjVhNDlkYzJlMmY3NGU2NWVmYWEzMmIxNTM1MjdmYzVhYzk4NTA4ZDUwMmZhNDZlNzRmYTRmZDY3OGVkNjY0NSBcCisgICAgLS1oYXNoPXNoYTI1NjoyZTQ0NDBiOGYwMGY1MDRlZTRiNTNmZTMwZjRlMzgxYWFlMzBiMDU2ODE5M2JlMzA1MjU2YjE0NjIyMTZmZWZmIFwKKyAgICAtLWhhc2g9c2hhMjU2OjM4NjJiNzI1NjA0NmZjZDk1MDYxOGVkMjJkMWQ2MGI4NDJlM2E0MGE0ODIzNmE1NDk4NzQ2ZjIxMTg5YWZiYmMgXAorICAgIC0taGFzaD1zaGEyNTY6M2ViMWNlNWY2NTkwODU1NmMyZDg2ODVhOGYwYTZlOTg5ZDg4N2VjNDA1NzMyNmY2YzIyYjI0ZThhMTcyYzY2YiBcCisgICAgLS1oYXNoPXNoYTI1NjozZjk3Y2ZiMWU1YTM5MmQ3NWRkOGI5ZmQyNzRkMjA1NDA0NzI5OTIzODQwY2E5NGNhNDVhMGFmNTdlMTNkYmU2IFwKKyAgICAtLWhhc2g9c2hhMjU2OjQ5M2NiNGU0MTVmNDRjZDYwMWZjZWMxMWM5OTgzNmY3MDdiYjcxNGFiMDNmNWVkNDZhYzI1NzEzYmFmMGZmMjAgXAorICAgIC0taGFzaD1zaGEyNTY6NGFjYzA5ODVkZGYzOWQxYmM5NjlhOTIyMGI1MWQ5NGVkNTE2OTVkNDU1YzIyOGQ4YWMyOWZjZGIyNTgxMGU2ZSBcCisgICAgLS1oYXNoPXNoYTI1Njo1NTAzYzg2OTE2ZDI3YzJlMTAxYjdmNzFjMmFlMmNkZGJhMDFhMmNmNTViODM5NWIwMjU1ZmQzM2ZhNGQxZjFhIFwKKyAgICAtLWhhc2g9c2hhMjU2OjViN2JiOWRlMDAxOTdmYjQyNjE4MjVjMTU1NTFhZGY3NjA1Y2YxNGE4MGJhZGYxNzYxZDYxZTU5ZGEzNDc3NzkgXAorICAgIC0taGFzaD1zaGEyNTY6NWU5YWM1ZjY2NjE2Yjg3ZDRkYTYxOGEyMGFiMGEzODMyNGRiZTg4ZDhhMzliNTViZTg5NjRlYjUyMDAyMWUwMiBcCisgICAgLS1oYXNoPXNoYTI1Njo2MjA1ODJkYjJhODViMmRmNWY4YTgyZGRlYjUyMTE2NTYwZDdlNWU2YjA1NTA5NWYwNGFkODI4ZDFiMGJhYTM5IFwKKyAgICAtLWhhc2g9c2hhMjU2OjYyY2MxYWZkYTczNWE4ZDEwOTAwNzE2NDcxNGU3Mzc3MWI0OTk3NjhiOWJiNWFmY2JiZWU5ZDBmZjM3NGI0M2YgXAorICAgIC0taGFzaD1zaGEyNTY6NzBhZDllNWM2Y2I5Yjg0ODcyODBhMDJjMGFkOGE1MTU4MWRjYmJlODQ4NGNlMDU4NDc3NjkyYTI3YzE1MWMwYSBcCisgICAgLS1oYXNoPXNoYTI1Njo3MmI5ZTY1NmUzNDA0NDdmODI3ODg1YjhkN2ExNWZjOGM0ZTY4ZDQxMGRjMjI5N2VmNjc4N2VlYzBmMGVhNDA5IFwKKyAgICAtLWhhc2g9c2hhMjU2OjcyY2JjZmQ1NGRmNmNhZjg1Y2MzNTI2NGM3N2VkZTkwMjQ1MmQ2ZGY0MTE2NjAxMDI2MjM3NDE1NTk0NzQ2MGMgXAorICAgIC0taGFzaD1zaGEyNTY6NzkyZTVjMTIzNzY1OTRiZmNiOTg2ZWJmMzg1NWFhNGI3YzIyNTc1NGU5YTk1MjEyOThlNDYwZTkyZmI0YTQ4OCBcCisgICAgLS1oYXNoPXNoYTI1Njo3YjcwMTdiNjFiYmNkZDdmNjM2M2FlY2ViODgxZTIzYzQ2NTgzNzM5Y2I2OWEzYWIzOWNiMzg0ZjZlYzgyZTViIFwKKyAgICAtLWhhc2g9c2hhMjU2OjgxZjhkNWM4MWU0ODNhOTQ0MmQ3MmQxODJlMWZiNmRjYjk3MjNmMjg5YTU3ZTgwMzA4MTFiYWM5ZWEzZmVmOGQgXAorICAgIC0taGFzaD1zaGEyNTY6ODJhYWZhOGQ1ZWI2OGM4NDYzYjZlOWJhZWI0ZjE5MDQzYmIzMWZlZmMwM2ViN2IyMTZiNTFlNmE5OTgxYWUwOSBcCisgICAgLS1oYXNoPXNoYTI1Njo4NGM0NzFhNzM0MjQwNjUzYTBlYzkxZGVjMDk5NjY5NmVlYTIyN2VhZmU3MmEzM2JkMDZjOTI2OTc3MjgwNDZiIFwKKyAgICAtLWhhc2g9c2hhMjU2OjhjODAzYWMzYzI4YmJjNTM3NjNlNjgyNTc0NmYwNWNjNDA3YjIwZTRhNjlkMDEyMmU1MjZhNTgyZTNiNWUxNTMgXAorICAgIC0taGFzaD1zaGEyNTY6OTNjZTllOTU1Y2M5NTk1OWRmOTg1MDVlNDYwOGFkOTgyODFmZmYwMzczNTBkOGMyNjcxYzlhYTg2YmNmMTBhOSBcCisgICAgLS1oYXNoPXNoYTI1Njo5YTNlNWRkYzQ0YzE0MDQyZjA4NDRiOGNmN2QyY2Q0NTVmNmNjODBmZDdmNWVlZmJlNjU3MjkyY2Y2MDFkOWFkIFwKKyAgICAtLWhhc2g9c2hhMjU2OmE0OTAxNjIyNDkzZjg4YjFhMjliZDMwZWMxYTJmNjgzNzgyZTU3YzNjMTZhMmRiYzdmMjU5NWJhMDFmNjM5ZGYgXAorICAgIC0taGFzaD1zaGEyNTY6YTVhNDUzMmExMjMxNDE0OWQ4YjRlNGFkOGZmMDlkZGU3NDI3NzMxZmNmYTU5MTdmZjE2ZDAyOTFmMTM2MDlkZiBcCisgICAgLS1oYXNoPXNoYTI1NjpiODgzMWNiNzMzMmVkYTVkYzg5YjIxYTdiY2U3ZWY2YWQzMDU1NDg4MjA1OTUwMzNhNGIwM2NmMzA5MTIzNWVkIFwKKyAgICAtLWhhc2g9c2hhMjU2OmI4ZTJmODNjNTZlMTQxOTIwYzM5NDY0Yjg1MmRlMzcxOWRmYmZiNmUzYzk5YTJkOGRhMGVkZjRmYjMzMTc2ZWQgXAorICAgIC0taGFzaD1zaGEyNTY6YzcwZTk0MjgxNTg4ZWYwNTNhZTg5OTgwMzk2MTBkYmQ3MWJjNTA5ZTRhY2JjNzdhYjU5ZDdkMjkzN2IxMDY5OCBcCisgICAgLS1oYXNoPXNoYTI1NjpjOGExN2I1ZDk0OGY0Y2VlY2ViNjYzODQ3MjdkZGUxMWIyNDA3MzZmZGRlZGE1NGNhNzQwYjliOGIxNTU2YjI5IFwKKyAgICAtLWhhc2g9c2hhMjU2OmQ4MmNkYjYzMTAwZWY1ZWVkYjgzOTE3MzIzNzVlNmQwNTk5M2I3NjVmNzJjYjM0MzExZmFiOTIxMDMzMTQ2NDkgXAorICAgIC0taGFzaD1zaGEyNTY6ZDg5MzYzZjAyNjU4ZTI1M2RiZDE3MWY3YzM3MTZhNWQzNDBhMjRlZTgyZDM4YWFiOTE4M2Y3ZmRmMGNkY2E0OSBcCisgICAgLS1oYXNoPXNoYTI1NjpkOTllYzE1MjU3MGU0MTk2NzcyZTdhOGU0YmE1MzIwZDJkMjdiZjIyZmRmMTE3NDNkZDg4MjkzNmVkNjQzMDViIFwKKyAgICAtLWhhc2g9c2hhMjU2OmRkYzRkODMyYTBmMGI0YzUyZmZmOTczYTBkNDRiNmM5OTgzOWE5ZDAxNmZlNGU2YTFjYjhmM2VlYTk2NDc5YzIgXAorICAgIC0taGFzaD1zaGEyNTY6ZTNkYWNlY2ZiZWVjOWEzM2U5MzJmMDBjNmNkNzk5NmU2MmY1M2FkNDZmYmU2Nzc1NzczOTRhYWE5MGVlNDE5YSBcCisgICAgLS1oYXNoPXNoYTI1NjplYjlmYzM5M2YzYzYxZjkwNTRlMWVkMjZlNmZlOTEyYzczMjFhZjJmNDFmZjQ5ZDNmODNkMDViYWNmMjJjYzc4CisgICAgIyB2aWEgbWF0cGxvdGxpYgorcHlwYXJzaW5nPT0zLjAuNiBcCisgICAgLS1oYXNoPXNoYTI1NjowNGZmODA4YTViOTA5MTE4MjljNTVjNGUyNmY3NWZhNWNhOGEyZjVmMzZhYTNhNTFmNjhlMjcwMzMzNDFkM2U0IFwKKyAgICAtLWhhc2g9c2hhMjU2OmQ5YmRlYzAwMTNlZjFlYjVhODRhYjM5YTNiMzg2ODkxMTU5OGFmYTQ5NGY1ZmFhMDM4NjQ3MTAxNTA0ZTJiODEKKyAgICAjIHZpYQorICAgICMgICBtYXRwbG90bGliCisgICAgIyAgIHBhY2thZ2luZworcHl0aG9uLWRhdGV1dGlsPT0yLjguMiBcCisgICAgLS1oYXNoPXNoYTI1NjowMTIzY2FjYzE2MjdhZTE5ZGRmM2MyN2E1ZGU1YmQ2N2VlNDU4NmZiZGQ2NDQwZDk3NDhmOGFiYjQ4M2QzZTg2IFwKKyAgICAtLWhhc2g9c2hhMjU2Ojk2MWQwM2RjMzQ1M2ViYmM1OWRiZGVhOWU0ZTExYzU2NTE1MjBhODc2ZDBmNGRiMTYxZTg2NzRhYWU5MzVkYTkKKyAgICAjIHZpYSBtYXRwbG90bGliCitzY2lweT09MS43LjMgXAorICAgIC0taGFzaD1zaGEyNTY6MDMzY2U3NmVkNGU5ZjYyOTIzZTFmODEyNGY3ZTJiMDgwMGRiNTMzODI4Yzg1M2I0MDJjN2VlYzZlOTQ2NWQ4MCBcCisgICAgLS1oYXNoPXNoYTI1NjoxNzMzMDhlZmJhMjI3MGRjZDYxY2Q0NWEzMGRmZGVkNmVjMDA4NWI0YjZlYjMzYjVlYjExYWI0NDMwMDVlMDg4IFwKKyAgICAtLWhhc2g9c2hhMjU2OjIxYjY2MjAwY2Y0NGIxYzNlODY0OTVlM2E0MzZmYzdhMjY2MDhmOTJiOGQ0M2QzNDQ0NTdjNTRmMWMwMjRjYmMgXAorICAgIC0taGFzaD1zaGEyNTY6MmM1NmI4MjBkMzA0ZGZmY2FkYmJiNmNiZmJjMmUyYzc5ZWU0NmVhMjkxZGIxN2UyODhlNzNjZDNjNjRmZWZhOSBcCisgICAgLS1oYXNoPXNoYTI1NjozMDRkZmFhNzE0NmNmZmRiNzVmYmY2YmI3YzE5MGZkNzY4ODc5NTM4OWFkMDYwYjk3MDI2OWM4NTc2ZDAzOGU5IFwKKyAgICAtLWhhc2g9c2hhMjU2OjNmNzgxODFhMTUzZmEyMWMwMThkMzQ2ZjU5NWVkZDY0ODM0NDc1MWQ3ZjAzYWI5NGIzOThiZTJhZDA4M2VkM2UgXAorICAgIC0taGFzaD1zaGEyNTY6NGQyNDJkMTMyMDZjYTQzMDJkODNkOGE2Mzg4YzlkZmNlNDlmYzQ4ZmRkM2MyMGVmYWQ4OWJhMTJmNzg1YmY5ZSBcCisgICAgLS1oYXNoPXNoYTI1Njo1ZDFjYzJjMTlhZmUzYjVhNTQ2ZWRlN2U2YTQ0Y2UxZmY1MmU0NDNkMTJiMjMxODIzMjY4MDE5ZjYwOGI5YjEyIFwKKyAgICAtLWhhc2g9c2hhMjU2OjVmMmNmYzM1OTM3OWM1NmIzYTQxYjE3ZWJkMDI0MTA5YjIwNDlmODc4YmFkYzFlNDU0ZjMxNDE4YzNhMTg0MzYgXAorICAgIC0taGFzaD1zaGEyNTY6NjViZDUyYmY1NWY5YTEwNzEzOTg1NTczOTQyMDNkODgxMzg0ZDI3YjljMmNhZDdkZjlhMDI3MTcwYWVhZWY5MyBcCisgICAgLS1oYXNoPXNoYTI1Njo3ZWRkOWEzMTEyOTlhNjFlOTkxOWVhNDE5MmRkNDc3Mzk1YjUwYzAxNGNkYzFhMWFjNTcyZDdjMjdlMjIwN2ZhIFwKKyAgICAtLWhhc2g9c2hhMjU2Ojg0OTlkOWRkMTQ1OWRjMGQwZmU2OGRiMDgzMmMzZDVmYzEzNjFhZThlMTNkMDVlNjg0OWIzNThkYzNmMmMyNzkgXAorICAgIC0taGFzaD1zaGEyNTY6ODY2YWRhMTRhOTViMDgzZGQ3MjdhODQ1YTc2NGNmOTVkZDEzYmEzZGM2OWExNmI5OTAzODAwMWIwNTQzOTcwOSBcCisgICAgLS1oYXNoPXNoYTI1Njo4NzA2OWNmODc1ZjAyNjJhNmUzMTg3YWIwZjQxOWY1YjQyODBkM2RjZjQ4MTFlZjk2MTNjNjA1ZjZlNGRjYTk1IFwKKyAgICAtLWhhc2g9c2hhMjU2OjkzMzc4ZjNkMTRmZmYwNzU3MjM5MmNlNmE2YTJjZWIzYTFmMjM3NzMzYmQ2ZGNiOWViNmEyYjI5YjBkMTkwODUgXAorICAgIC0taGFzaD1zaGEyNTY6OTVjMmQyNTAwNzRjZmE3NjcxNWQ1ODgzMDU3OWM2NGRmZjczNTQ0ODRiMjg0YzJiOGI4N2U1YTM4MzIxNjcyYyBcCisgICAgLS1oYXNoPXNoYTI1NjphYjU4NzVmYWNmZGVmNzdlMGE0N2Q1ZmQzOWVhMTc4YjU4ZTYwZTQ1NGE0Yzg1YWExZTUyZmNiODBkYjdiYWJmIFwKKyAgICAtLWhhc2g9c2hhMjU2OmIwZTBhZWIwNjFhMWQ3ZGNkMmVkNTllYTU3ZWU1NmM5YjIzZGQ2MDEwMDgyNWY5ODIzOGMwNmVlNWNjNDQ2N2UgXAorICAgIC0taGFzaD1zaGEyNTY6Yjc4YTM1YzVjNzRkMzM2ZjQyZjQ0MTA2MTc0Yjk4NTFjNzgzMTg0YTg1YTNmZTNlNjg4NTcyNTliMzdiOWZmYiBcCisgICAgLS1oYXNoPXNoYTI1NjpjOWUwNGQ3ZTliMDNhOGE2YWMyMDQ1ZjdjNWVmNzQxYmU4NjcyN2Q4ZjQ5YzQ1ZGI0NWYyNDRiZGQyYmNmZjE3IFwKKyAgICAtLWhhc2g9c2hhMjU2OmNhMzZlN2Q5NDMwZjc0ODFmYzdkMTFlMDE1YWUxNmZiZDU1NzU2MTVhOGU5MDYwNTM4MTA0Nzc4YmU4NGFkZGYgXAorICAgIC0taGFzaD1zaGEyNTY6Y2VlYmMzYzRmNmExMDk3NzdjMDA1M2RmYTAyODJmZGRiODg5M2VkZGZiMGQ1OTg1NzRhY2ZiNzM0YTkyNjE2OCBcCisgICAgLS1oYXNoPXNoYTI1NjplMmMwMzY0OTJlNjczYWFkMWI3YjBkMGNjZGMwY2IzMGE5NjgzNTNkMmM0YmY5MmFjOGU3MzUwOWUxYmYyMTJjIFwKKyAgICAtLWhhc2g9c2hhMjU2OmViMzI2NjU4ZjliNzNjMDcwODEzMDBkYWJhOTBhODc0NjU0M2I1ZWExNzcxODRkYWVkMjY1MjgyNzMxNTcyOTQgXAorICAgIC0taGFzaD1zaGEyNTY6ZWI3YWUyYzRkYmRiM2M5MjQ3ZTA3YWNjNTMyZjkxMDc3YWU2ZGJjNDBhZDViZDVkY2EwYmI1YTE3NmVlOWJkYSBcCisgICAgLS1oYXNoPXNoYTI1NjplZGFkMWNmNWIyY2UxOTEyYzRkOGRkYWQyMGUxMWQzMzMxNjU1NTJhYmEyNjJjODgyZTI4Yzc4YmJjMDlkYmY2IFwKKyAgICAtLWhhc2g9c2hhMjU2OmVlZjkzYTQ0NjExNGFjMDE5M2E3YjcxNGNlNjc2NTlkYjgwY2FmOTQwZjMyMzJiYWQ2M2Y0YzdhODFiYzE4ZGYgXAorICAgIC0taGFzaD1zaGEyNTY6ZjdlYWVhMDg5MzQ1YTM1MTMwYmM5YTM5Yjg5ZWMxZmY2OWMyMDhlZmE5N2IzZjhiMjVlYTVkNGM0MWQ4ODA5NCBcCisgICAgLS1oYXNoPXNoYTI1NjpmOTlkMjA2ZGIxZjFhZTczNWE4MTkyYWI5M2JkNjAyOGYzYTQyZjZmYTA4NDY3ZDM3YTE0ZWI5NmM5ZGQzNGEzCisgICAgIyB2aWEgLXIgdG9vbHMvcHl0aG9uL3JlcXVpcmVtZW50cy50eHQKK3NpeD09MS4xNi4wIFwKKyAgICAtLWhhc2g9c2hhMjU2OjFlNjFjMzc0NzdhMTYyNjQ1OGUzNmY3YjFkODJhYTVjOWIwOTRmYTQ4MDI4OTIwNzJlNDlkZTljNjBjNGM5MjYgXAorICAgIC0taGFzaD1zaGEyNTY6OGFiYjJmMWQ4Njg5MGEyZGZiOTg5ZjlhNzdjZmNmZDNlNDdjMmEzNTRiMDExMTE3NzEzMjZmOGFhMjZlMDI1NAorICAgICMgdmlhIHB5dGhvbi1kYXRldXRpbApkaWZmIC0tZ2l0IGEvdG9vbHMvcHl0aG9uL3JlcXVpcmVtZW50cy50eHQgYi90b29scy9weXRob24vcmVxdWlyZW1lbnRzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YmIwY2MxCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvcHl0aG9uL3JlcXVpcmVtZW50cy50eHQKQEAgLTAsMCArMSw1IEBACisjIEFmdGVyIHVwZGF0aW5nIHRoaXMgZmlsZSwgcnVuOgorIyAkIGJhemVsIHJ1biAvL3Rvb2xzL3B5dGhvbjpyZXF1aXJlbWVudHMudXBkYXRlCittYXRwbG90bGliCitudW1weQorc2NpcHkKZGlmZiAtLWdpdCBhL3Rvb2xzL3B5dGhvbi9ydW50aW1lX2JpbmFyeS5zaCBiL3Rvb2xzL3B5dGhvbi9ydW50aW1lX2JpbmFyeS5zaAppbmRleCBhMzZmMDg1Li4xYTRiM2RjIDEwMDc1NQotLS0gYS90b29scy9weXRob24vcnVudGltZV9iaW5hcnkuc2gKKysrIGIvdG9vbHMvcHl0aG9uL3J1bnRpbWVfYmluYXJ5LnNoCkBAIC0xOSwyMiArMTksMjYgQEAKICMgZXhhbXBsZSBpbiBhIGdlbnJ1bGUgdGhlIFB5dGhvbiBydW50aW1lIGlzIGluIHRoZSBydW5maWxlcyBmb2xkZXIgb2YgdGhlCiAjIHRvb2wsIG5vdCBvZiB0aGUgZ2VucnVsZS4KICMgVE9ETyhwaGlsaXBwKTogSXMgdGhlcmUgYSBiZXR0ZXIgd2F5IHRvIGRvIHRoaXM/Ci1CQVNFX1BBVEg9IiIKK1BZVEhPTl9CSU49IiIKIGZvciBwYXRoIGluICR7UFlUSE9OUEFUSC8vOi8gfTsgZG8KLSAgaWYgW1sgIiRwYXRoIiA9PSAqLnJ1bmZpbGVzL3B5dGhvbl9yZXBvIF1dOyB0aGVuCi0gICAgQkFTRV9QQVRIPSIkcGF0aCIKLSAgICBleHBvcnQgTERfTElCUkFSWV9QQVRIPSIkcGF0aCIvbGliL3g4Nl82NC1saW51eC1nbnU6IiRwYXRoIi91c3IvbGliOiIkcGF0aCIvdXNyL2xpYi94ODZfNjQtbGludXgtZ251OiIkcGF0aCIvLi4vbWF0cGxvdGxpYl9yZXBvL3Vzci9saWIKKyAgaWYgW1sgIiRwYXRoIiA9PSAqLnJ1bmZpbGVzL3B5dGhvbjNfOV94ODZfNjQtdW5rbm93bi1saW51eC1nbnUgXV07IHRoZW4KKyAgICBQWVRIT05fQklOPSIkcGF0aCIvYmluL3B5dGhvbjMKKyAgICBleHBvcnQgTERfTElCUkFSWV9QQVRIPSIkcGF0aCIvbGliCisgICAgYnJlYWsKKyAgZWxpZiBbWyAiJHBhdGgiID09ICoucnVuZmlsZXMvcHl0aG9uX3JlcG8gXV07IHRoZW4KKyAgICBQWVRIT05fQklOPSIkcGF0aCIvdXNyL2Jpbi9weXRob24zCisgICAgTERfTElCUkFSWV9QQVRIPSIke3BhdGh9L2xpYi94ODZfNjQtbGludXgtZ251OiR7cGF0aH0vdXNyL2xpYjoke3BhdGh9L3Vzci9saWIveDg2XzY0LWxpbnV4LWdudToke3BhdGh9Ly4uL21hdHBsb3RsaWJfcmVwby91c3IvbGliIgorICAgIExEX0xJQlJBUllfUEFUSCs9Ijoke3BhdGh9L3Vzci9saWIvbGFwYWNrOiR7cGF0aH0vdXNyL2xpYi9saWJibGFzOiR7cGF0aH0vLi4vbWF0cGxvdGxpYl9yZXBvL3JwYXRoZWQzL3Vzci9saWI6JHtwYXRofS91c3IvbGliL3g4Nl82NC1saW51eC1nbnUvbGFwYWNrOiR7cGF0aH0vdXNyL2xpYi94ODZfNjQtbGludXgtZ251L2JsYXMiCisgICAgZXhwb3J0IExEX0xJQlJBUllfUEFUSAogICAgIGJyZWFrCiAgIGZpCiBkb25lCiAKLWlmIFtbIC16ICIkQkFTRV9QQVRIIiBdXTsgdGhlbgoraWYgW1sgLXogIiRQWVRIT05fQklOIiBdXTsgdGhlbgogICBlY2hvICJDb3VsZCBub3QgZmluZCBQeXRob24gYmFzZSBwYXRoLiIgPiYyCiAgIGVjaG8gIk1vcmUgc29waGlzdGljYXRlZCBsb2dpYyBtYXkgYmUgbmVlZGVkLiIgPiYyCiAgIGV4aXQgMQogZmkKIAotZXhwb3J0IExEX0xJQlJBUllfUEFUSD0iJHtCQVNFX1BBVEh9L3Vzci9saWIvbGFwYWNrOiR7QkFTRV9QQVRIfS91c3IvbGliL2xpYmJsYXM6JHtCQVNFX1BBVEh9L3Vzci9saWIveDg2XzY0LWxpbnV4LWdudToke0JBU0VfUEFUSH0vLi4vbWF0cGxvdGxpYl9yZXBvL3JwYXRoZWQzL3Vzci9saWI6JHtCQVNFX1BBVEh9L3Vzci9saWIveDg2XzY0LWxpbnV4LWdudS9sYXBhY2s6JHtCQVNFX1BBVEh9L3Vzci9saWIveDg2XzY0LWxpbnV4LWdudS9ibGFzIgotCiAjIFByZXZlbnQgUHl0aG9uIGZyb20gaW1wb3J0aW5nIHRoZSBob3N0J3MgaW5zdGFsbGVkIHBhY2thZ2VzLgotZXhlYyAiJEJBU0VfUEFUSCIvdXNyL2Jpbi9weXRob24zIC1zUyAiJEAiCitleGVjICIkUFlUSE9OX0JJTiIgLXNTICIkQCIKZGlmZiAtLWdpdCBhL3kyMDIwL2NvbnRyb2xfbG9vcHMvZHJpdmV0cmFpbi9CVUlMRCBiL3kyMDIwL2NvbnRyb2xfbG9vcHMvZHJpdmV0cmFpbi9CVUlMRAppbmRleCAxYmJlNTVlLi4wNDU1ZDBmIDEwMDY0NAotLS0gYS95MjAyMC9jb250cm9sX2xvb3BzL2RyaXZldHJhaW4vQlVJTEQKKysrIGIveTIwMjAvY29udHJvbF9sb29wcy9kcml2ZXRyYWluL0JVSUxECkBAIC0xLDQgKzEsNSBAQAotbG9hZCgiQGNvbV9naXRodWJfZ29vZ2xlX2ZsYXRidWZmZXJzLy86YnVpbGRfZGVmcy5iemwiLCAiZmxhdGJ1ZmZlcl9jY19saWJyYXJ5IiwgImZsYXRidWZmZXJfdHNfbGlicmFyeSIpCitsb2FkKCJAY29tX2dpdGh1Yl9nb29nbGVfZmxhdGJ1ZmZlcnMvLzpidWlsZF9kZWZzLmJ6bCIsICJmbGF0YnVmZmVyX2NjX2xpYnJhcnkiKQorbG9hZCgiQGNvbV9naXRodWJfZ29vZ2xlX2ZsYXRidWZmZXJzLy86dHlwZXNjcmlwdC5iemwiLCAiZmxhdGJ1ZmZlcl90c19saWJyYXJ5IikKIGxvYWQoIi8vYW9zOmNvbmZpZy5iemwiLCAiYW9zX2NvbmZpZyIpCiBsb2FkKCJAbnBtLy9AYmF6ZWwvdHlwZXNjcmlwdDppbmRleC5iemwiLCAidHNfbGlicmFyeSIpCiAKZGlmZiAtLWdpdCBhL3kyMDIwL2NvbnRyb2xfbG9vcHMvc3VwZXJzdHJ1Y3R1cmUvQlVJTEQgYi95MjAyMC9jb250cm9sX2xvb3BzL3N1cGVyc3RydWN0dXJlL0JVSUxECmluZGV4IDgyMmU3YmIuLmQzZjMwM2YgMTAwNjQ0Ci0tLSBhL3kyMDIwL2NvbnRyb2xfbG9vcHMvc3VwZXJzdHJ1Y3R1cmUvQlVJTEQKKysrIGIveTIwMjAvY29udHJvbF9sb29wcy9zdXBlcnN0cnVjdHVyZS9CVUlMRApAQCAtMSw0ICsxLDUgQEAKLWxvYWQoIkBjb21fZ2l0aHViX2dvb2dsZV9mbGF0YnVmZmVycy8vOmJ1aWxkX2RlZnMuYnpsIiwgImZsYXRidWZmZXJfY2NfbGlicmFyeSIsICJmbGF0YnVmZmVyX3RzX2xpYnJhcnkiKQorbG9hZCgiQGNvbV9naXRodWJfZ29vZ2xlX2ZsYXRidWZmZXJzLy86YnVpbGRfZGVmcy5iemwiLCAiZmxhdGJ1ZmZlcl9jY19saWJyYXJ5IikKK2xvYWQoIkBjb21fZ2l0aHViX2dvb2dsZV9mbGF0YnVmZmVycy8vOnR5cGVzY3JpcHQuYnpsIiwgImZsYXRidWZmZXJfdHNfbGlicmFyeSIpCiBsb2FkKCJAbnBtLy9AYmF6ZWwvdHlwZXNjcmlwdDppbmRleC5iemwiLCAidHNfbGlicmFyeSIpCiAKIHBhY2thZ2UoZGVmYXVsdF92aXNpYmlsaXR5ID0gWyIvL3Zpc2liaWxpdHk6cHVibGljIl0pCmRpZmYgLS1naXQgYS95MjAyMC92aXNpb24vc2lmdC9CVUlMRCBiL3kyMDIwL3Zpc2lvbi9zaWZ0L0JVSUxECmluZGV4IGZlZWNiNjIuLjE5NWE4MmUgMTAwNjQ0Ci0tLSBhL3kyMDIwL3Zpc2lvbi9zaWZ0L0JVSUxECisrKyBiL3kyMDIwL3Zpc2lvbi9zaWZ0L0JVSUxECkBAIC0xLDUgKzEsNiBAQAogbG9hZCgiOmZhc3RfZ2F1c3NpYW4uYnpsIiwgImZhc3RfZ2F1c3NpYW4iKQotbG9hZCgiQGNvbV9naXRodWJfZ29vZ2xlX2ZsYXRidWZmZXJzLy86YnVpbGRfZGVmcy5iemwiLCAiZmxhdGJ1ZmZlcl9jY19saWJyYXJ5IiwgImZsYXRidWZmZXJfcHlfbGlicmFyeSIsICJmbGF0YnVmZmVyX3RzX2xpYnJhcnkiKQorbG9hZCgiQGNvbV9naXRodWJfZ29vZ2xlX2ZsYXRidWZmZXJzLy86YnVpbGRfZGVmcy5iemwiLCAiZmxhdGJ1ZmZlcl9jY19saWJyYXJ5IiwgImZsYXRidWZmZXJfcHlfbGlicmFyeSIpCitsb2FkKCJAY29tX2dpdGh1Yl9nb29nbGVfZmxhdGJ1ZmZlcnMvLzp0eXBlc2NyaXB0LmJ6bCIsICJmbGF0YnVmZmVyX3RzX2xpYnJhcnkiKQogCiAjIE5vdGUgdGhhdCB0aGlzIGZpbGUgaXMgYWxzbyB1c2VkIGRpcmVjdGx5IGJ5IDpmYXN0X2dhdXNzaWFuX2hhbGlkZV9nZW5lcmF0b3IsCiAjIHdpdGhvdXQgYW55IGRlcGVuZGVuY2llcyBhZGRlZCBoZXJlLgpkaWZmIC0tZ2l0IGEveTIwMjIvY29udHJvbF9sb29wcy9zdXBlcnN0cnVjdHVyZS9CVUlMRCBiL3kyMDIyL2NvbnRyb2xfbG9vcHMvc3VwZXJzdHJ1Y3R1cmUvQlVJTEQKaW5kZXggZmFiYzg3MS4uY2FmNTZhYiAxMDA2NDQKLS0tIGEveTIwMjIvY29udHJvbF9sb29wcy9zdXBlcnN0cnVjdHVyZS9CVUlMRAorKysgYi95MjAyMi9jb250cm9sX2xvb3BzL3N1cGVyc3RydWN0dXJlL0JVSUxECkBAIC0xLDQgKzEsNSBAQAotbG9hZCgiQGNvbV9naXRodWJfZ29vZ2xlX2ZsYXRidWZmZXJzLy86YnVpbGRfZGVmcy5iemwiLCAiZmxhdGJ1ZmZlcl9jY19saWJyYXJ5IiwgImZsYXRidWZmZXJfdHNfbGlicmFyeSIpCitsb2FkKCJAY29tX2dpdGh1Yl9nb29nbGVfZmxhdGJ1ZmZlcnMvLzpidWlsZF9kZWZzLmJ6bCIsICJmbGF0YnVmZmVyX2NjX2xpYnJhcnkiKQorbG9hZCgiQGNvbV9naXRodWJfZ29vZ2xlX2ZsYXRidWZmZXJzLy86dHlwZXNjcmlwdC5iemwiLCAiZmxhdGJ1ZmZlcl90c19saWJyYXJ5IikKIGxvYWQoIkBucG0vL0BiYXplbC90eXBlc2NyaXB0OmluZGV4LmJ6bCIsICJ0c19saWJyYXJ5IikKIAogcGFja2FnZShkZWZhdWx0X3Zpc2liaWxpdHkgPSBbIi8vdmlzaWJpbGl0eTpwdWJsaWMiXSkKZGlmZiAtLWdpdCBhL3kyMDIyL2xvY2FsaXplci9CVUlMRCBiL3kyMDIyL2xvY2FsaXplci9CVUlMRAppbmRleCAyNDMyNTlhLi5jZDU4N2I4IDEwMDY0NAotLS0gYS95MjAyMi9sb2NhbGl6ZXIvQlVJTEQKKysrIGIveTIwMjIvbG9jYWxpemVyL0JVSUxECkBAIC0xLDQgKzEsNSBAQAotbG9hZCgiQGNvbV9naXRodWJfZ29vZ2xlX2ZsYXRidWZmZXJzLy86YnVpbGRfZGVmcy5iemwiLCAiZmxhdGJ1ZmZlcl9jY19saWJyYXJ5IiwgImZsYXRidWZmZXJfdHNfbGlicmFyeSIpCitsb2FkKCJAY29tX2dpdGh1Yl9nb29nbGVfZmxhdGJ1ZmZlcnMvLzpidWlsZF9kZWZzLmJ6bCIsICJmbGF0YnVmZmVyX2NjX2xpYnJhcnkiKQorbG9hZCgiQGNvbV9naXRodWJfZ29vZ2xlX2ZsYXRidWZmZXJzLy86dHlwZXNjcmlwdC5iemwiLCAiZmxhdGJ1ZmZlcl90c19saWJyYXJ5IikKIGxvYWQoIi8vYW9zOmZsYXRidWZmZXJzLmJ6bCIsICJjY19zdGF0aWNfZmxhdGJ1ZmZlciIpCiBsb2FkKCJAbnBtLy9AYmF6ZWwvdHlwZXNjcmlwdDppbmRleC5iemwiLCAidHNfbGlicmFyeSIpCiAKZGlmZiAtLWdpdCBhL3kyMDIyL3Zpc2lvbi9CVUlMRCBiL3kyMDIyL3Zpc2lvbi9CVUlMRAppbmRleCA2MzI1MjM0Li41ZjZkOGE4IDEwMDY0NAotLS0gYS95MjAyMi92aXNpb24vQlVJTEQKKysrIGIveTIwMjIvdmlzaW9uL0JVSUxECkBAIC0xLDQgKzEsNSBAQAotbG9hZCgiQGNvbV9naXRodWJfZ29vZ2xlX2ZsYXRidWZmZXJzLy86YnVpbGRfZGVmcy5iemwiLCAiZmxhdGJ1ZmZlcl9jY19saWJyYXJ5IiwgImZsYXRidWZmZXJfcHlfbGlicmFyeSIsICJmbGF0YnVmZmVyX3RzX2xpYnJhcnkiKQorbG9hZCgiQGNvbV9naXRodWJfZ29vZ2xlX2ZsYXRidWZmZXJzLy86YnVpbGRfZGVmcy5iemwiLCAiZmxhdGJ1ZmZlcl9jY19saWJyYXJ5IiwgImZsYXRidWZmZXJfcHlfbGlicmFyeSIpCitsb2FkKCJAY29tX2dpdGh1Yl9nb29nbGVfZmxhdGJ1ZmZlcnMvLzp0eXBlc2NyaXB0LmJ6bCIsICJmbGF0YnVmZmVyX3RzX2xpYnJhcnkiKQogbG9hZCgiQG5wbS8vQGJhemVsL3R5cGVzY3JpcHQ6aW5kZXguYnpsIiwgInRzX2xpYnJhcnkiKQogCiBmbGF0YnVmZmVyX2NjX2xpYnJhcnkoCmRpZmYgLS1naXQgYS95MjAyMl9ib3QzL2NvbnRyb2xfbG9vcHMvc3VwZXJzdHJ1Y3R1cmUvQlVJTEQgYi95MjAyMl9ib3QzL2NvbnRyb2xfbG9vcHMvc3VwZXJzdHJ1Y3R1cmUvQlVJTEQKaW5kZXggMzZhNmMxOS4uOWJhZmFkYyAxMDA2NDQKLS0tIGEveTIwMjJfYm90My9jb250cm9sX2xvb3BzL3N1cGVyc3RydWN0dXJlL0JVSUxECisrKyBiL3kyMDIyX2JvdDMvY29udHJvbF9sb29wcy9zdXBlcnN0cnVjdHVyZS9CVUlMRApAQCAtMSw0ICsxLDUgQEAKLWxvYWQoIkBjb21fZ2l0aHViX2dvb2dsZV9mbGF0YnVmZmVycy8vOmJ1aWxkX2RlZnMuYnpsIiwgImZsYXRidWZmZXJfY2NfbGlicmFyeSIsICJmbGF0YnVmZmVyX3RzX2xpYnJhcnkiKQorbG9hZCgiQGNvbV9naXRodWJfZ29vZ2xlX2ZsYXRidWZmZXJzLy86YnVpbGRfZGVmcy5iemwiLCAiZmxhdGJ1ZmZlcl9jY19saWJyYXJ5IikKK2xvYWQoIkBjb21fZ2l0aHViX2dvb2dsZV9mbGF0YnVmZmVycy8vOnR5cGVzY3JpcHQuYnpsIiwgImZsYXRidWZmZXJfdHNfbGlicmFyeSIpCiAKIHBhY2thZ2UoZGVmYXVsdF92aXNpYmlsaXR5ID0gWyIvL3Zpc2liaWxpdHk6cHVibGljIl0pCiAK