ZGlmZiAtLWdpdCBhL3AvZGFlbW9uL3BhdGhkLmMgYi9wL2RhZW1vbi9wYXRoZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE3ZDM0YWQKLS0tIC9kZXYvbnVsbAorKysgYi9wL2RhZW1vbi9wYXRoZC5jCkBAIC0wLDAgKzEsMTAwMCBAQAorLy8gRGFlbW9uIHp1bSBhdXRvbWF0aXNpZXJ0ZW4gRXJzdGVsbGVuIHZvbiBLYXJ0ZW4uCisvLyBTb2xsIHNwYWV0ZXIgbWFsIHdpY2h0aWdlIFdlZ2UgYmVyZWNobmVuIGtvZW5uZW4gZnVlciBBbmZhZW5nZXIuCisvLworLy8KKy8vIFdlciBtaXIgb2huZSB0cmlmdGlnZW4gR3J1bmQgZGFyYW4gaGVydW1wZnVzY2h0LCBkZXIgd2lyZCBzdGFuZGVzcmVjaHRsaWNoCisvLyBtaXQgZmF1bGVuIEVpZXJuIGJld29yZmVuLiBdOi0+CisvLworLy8gVGlhbWFrCisKKyNwcmFnbWEgc3Ryb25nX3R5cGVzLHNhdmVfdHlwZXMscnR0X2NoZWNrcworI3ByYWdtYSBub19jbG9uZSxub19pbmhlcml0LG5vX3NoYWRvdworI3ByYWdtYSBwZWRhbnRpYyxyYW5nZV9jaGVjayx3YXJuX2RlcHJlY2F0ZWQKKyNwcmFnbWEgd2Fybl9lbXB0eV9jYXN0cyx3YXJuX21pc3NpbmdfcmV0dXJuLHdhcm5fZnVuY3Rpb25faW5jb25zaXN0ZW50CisKKyNpbmNsdWRlIDxzdHJpbmdzLmg+CisjaW5jbHVkZSA8d2l6bGV2ZWxzLmg+CisjaW5jbHVkZSA8cGxheWVyLmg+CisjaW5jbHVkZSA8cHJvcGVydGllcy5oPgorI2luY2x1ZGUgPHJvb21zLmg+CisjaW5jbHVkZSA8bW92aW5nLmg+CisKKyNkZWZpbmUgTE9HTkFNRSAiUEFUSEQiCisjZGVmaW5lIFNBVkVGSUxFICIvcC9kYWVtb24vc2F2ZS9wYXRoZCIKKyNkZWZpbmUgRFVNUEZJTEUgIi9wL2RhZW1vbi9zYXZlL3BhdGhkLWR1bXAiCisvLyNkZWZpbmUgREVCVUcKKworLy8gMTAgdmVyc2NoaWVkZW5lIExldXRlIHdlcmRlbiBnZWJyYXVjaHQsIHVtIGVpbmUgVmVyYmluZHVuZyB6dSB2ZXJpZml6aWVyZW4KKyNkZWZpbmUgTkVFREVEIDEwCisjZGVmaW5lIFRJTUVPVVRfTkVXIDEyMDk2MDAgIC8vIDE0IFRhZ2UKKyNkZWZpbmUgVElNRU9VVF9PTEQgNzc3NjAwMCAvLyA5MCBUYWdlCisKKy8vIEFydCBkZXMgQXVzZ2FuZ3MKKyNkZWZpbmUgTk9STUFMICAwCisjZGVmaW5lIFNQRUNJQUwgMQorI2RlZmluZSBDT01NQU5EIDIKKworLy8gS29zdGVuIGZ1ZXIgdW50ZXJzY2hpZWRsaWNoZSBXZWdlCisjZGVmaW5lIENPU1RfRVhJVFMgKHsgMSwgMTAsIDEwMCB9KQorI2RlZmluZSBDT1NUX01BTlkgICAzCisjZGVmaW5lIENPU1RfRkVXICAgIDUKKyNkZWZpbmUgQ09TVF9PTkUgICAxMAorLy8gS29zdGVuIGZ1ZXIgV2VsdGVud2VjaHNlbCAoUGFyYSAtPiBOb3JtYWwpCisjZGVmaW5lIENPU1RfV09STERDSEFOR0UgMTAwCisKKyNpZmRlZiBERUJVRworI2RlZmluZSBEQkcoeCkgaWYgKCBmaW5kX3BsYXllcigiemVzc3RyYSIpICkgXAorICAgICAgICAgICAgICAgICAgIHRlbGxfb2JqZWN0KCBmaW5kX3BsYXllcigiemVzc3RyYSIpLCAoeCkrIlxuIiApOworI2RlZmluZSBURUxMX1VTRVIoeCkgaWYgKCB0aGlzX3BsYXllcigpICkgXAorICAgICAgICAgICAgICAgICAgIHRlbGxfb2JqZWN0KCB0aGlzX3BsYXllcigpLCAoeCkrIlxuIiApOworI2Vsc2UKKyNkZWZpbmUgREJHKHgpCisjZGVmaW5lIFRFTExfVVNFUih4KQorI2VuZGlmCisKKyNkZWZpbmUgTE9HKHgpIGxvZ19maWxlKCAiUEFUSEQiLCAoeCksIDEwMDAwMCApOworCisvLyBWYXJpYWJsZW4KK25vc2F2ZSBpbnQgdGltZV90b19jbGVhbl91cDsgLy8gWmVpdCBmdWVyIG5hZWNoc3RlcyBDbGVhbnVwIGRlciBEYXRlbgorCittYXBwaW5nIHBhdGhtYXA7CisvKiBQcmVmaXggOiAoWyA8c3VibWFwPiBdKSwKKyAgIDxzdWJtYXA+IGlzdCBlaW4gTWFwcGluZyB2b24gUmFldW1lbiBtaXQgZWluZW0gQXJyYXkgdm9uIFZlcmJpbmR1bmdlbjoKKyAgIChbPHJvb20+OiAoeyBjb25uMSwgY29ubjIsIGNvbm4zLCAuLi59KSwgLi4uXSkKKyAgIEplZGUgVmVyYmluZHVuZyBpc3QgZWluIEFycmF5IG1pdCBmb2xnZW5kZW4gSW5kaXplczoKKyAgICovCisjZGVmaW5lIENPTk5fREVTVCAgICAgMCAgIC8vIFppZWxyYXVtCisjZGVmaW5lIENPTk5fQ01EICAgICAgMSAgIC8vIEtvbW1hbmRvCisjZGVmaW5lIENPTk5fVVNFUlMgICAgMiAgIC8vIEJlbnV0emVyOiAoe3NwaWVsZXIsIHNlaGVyfSkKKyNkZWZpbmUgQ09OTl9FWElUVFlQRSAzICAgLy8gQXVzZ2FuZ3NhcnQgKHMuby4pCisjZGVmaW5lIENPTk5fVElNRVMgICAgNCAgIC8vIFplaXQgbGV0enRlciBCZW51dHp1bmc6ICh7c3BpZWxlcixzZWhlcn0pCisjZGVmaW5lIENPTk5fUEFSQSAgICAgNSAgIC8vIFBhcmF3ZWx0CisjZGVmaW5lIENPTk5fRkxBR1MgICAgNiAgIC8vIEZsYWdzIGZ1ZXIgZGllIFZlcmJpbmR1bmcgKHouQi4gcGVybWFuZW50KQorLy8gSW5kaXplcyBpbiBDT05OX1VTRVJTLiBCZWlkZSBFaW50cmFlZ2Ugc2luZCBlbnR3ZWRlciBnZWhhc2h0ZSBVSURzIE9ERVIgLTEsCisvLyB3ZW5uIGRpZSBWZXJiaW5kdW5nIHZvbiBtZWhyIGFscyBORUVERUQgdW50ZXJzY2hpZWRsaWNoZW4gZ2VnYW5nZW4gd3VyZGUuCisjZGVmaW5lIENPTk5fVV9QTEFZRVJTIDAgIC8vIFNwaWVsZXItVUlEcworI2RlZmluZSBDT05OX1VfU0VFUlMgICAxICAvLyBTZWhlci1VSURTCisvLyBJbmRpemVzIHZvbiBDT05OX1RJTUVTLiBaZWl0c3RlbXBlbCBkZXIgbGV0enRlbiBCZW51dHp1bmcuLi4KKyNkZWZpbmUgQ09OTl9UX1BMQVlFUlMgQ09OTl9VX1BMQVlFUlMgIC8vIC4uLiBkdXJjaCBTcGllbGVyCisjZGVmaW5lIENPTk5fVF9TRUVSUyAgIENPTk5fVV9TRUVSUyAgLy8gLi4uIGR1cmNoIFNlaGVyCisKKy8vIEtvbnN0YW50ZW4gZnVlciBDT05OX0ZMQUdTCisjZGVmaW5lIENGTEFHX1BFUk1BTkVOVCAgIDB4MSAgLy8gVmVyYmluZHVuZyBuaWNodCBleHBpcmVuCisjZGVmaW5lIENGTEFHX0RPTlRVU0UgICAgIDB4MiAgLy8gVmVyYmluZHVuZyBuaWNodCBpbSBSb3V0aW5nIG51dHplbgorI2RlZmluZSBDRkxBR19EVVBMSUNBVEUgICAweDQgIC8vIEtvbW1hbmRvIGhhdCBtZWhyZXJlIFZlcmJpbmR1bmdlbgorCisvLyBsYXVmZW5kZSBQZmFkc3VjaGVuCitub3NhdmUgbWFwcGluZyBzZWFyY2hsaXN0ID0gKFtdKTsKKy8qCisgICAoWyA8dXVpZD4gOiBTTF9WSVNJVEVEOyBTTF9ERVNUSU5BVElPTjsuLi4gLi4uIF0pCisgKi8KKy8vIEluZGl6ZXMgaW4gPGRhdGE+OgorI2RlZmluZSBTTF9TVEFSVCAgICAgICAwCisjZGVmaW5lIFNMX0RFU1RJTkFUSU9OIDEgIC8vIFppZWxyYXVtCisjZGVmaW5lIFNMX1ZJU0lURUQgICAgIDIgIC8vIGFiZ2VsYXVmZW5lL2dlcHJ1ZWZ0ZSBSYWV1bWUKKyNkZWZpbmUgU0xfQ0FORElEQVRFUyAgMyAgLy8gbW9lZ2xpY2hlIFppZWxlCisjZGVmaW5lIFNMX1dJWkxFVkVMICAgIDQgIC8vIFdpemxldmVsCisjZGVmaW5lIFNMX1BBUkEgICAgICAgIDUgIC8vIFBhcmF3ZWx0CisjZGVmaW5lIFNMX1RPRE8gICAgICAgIDYgIC8vIG5vY2ggenUgcHJ1ZWZlbmRlIFJhdW1lIChTTF9DQU5ESURBVEVTLVNMX1ZJU0lURUQpCisjZGVmaW5lIFNMX0NBTExCQUNLICAgIDcgIC8vIENsb3N1cmUgZnVlciBDYWxsYmFjayBuYWNoIFJvdXRlbmJlcmVjaG51bmcKKy8vIFNMX0NBTkRJREFURVM6IChbPHJhdW0+OiAoe3ZlcmJpbmR1bmdzZGF0ZW59KSwgLi4uXSkKKy8vIEluZGl6ZXMgaW0gQXJyYXkgPHZlcmJpbmR1bmdzZGF0ZW4+OgorI2RlZmluZSBTTFRfQ09TVFMgICAgIDAgICAvLyBLb3N0ZW4gZnVlciBWZXJiaW5kdW5nIGJpcyBoaWVyCisjZGVmaW5lIFNMVF9XQVkgICAgICAgMSAgIC8vIGJpc2hlcmlnZXIgV2VnIHZvbiBTdGFydCBiaXMgaGllcgorI2RlZmluZSBTTFRfQ09NTUFORFMgIDIgICAvLyBLb21tYW5kb3MgZnVlciBXZWcgdm9uIFN0YXJ0IGJpcyBoaWVyCisKKy8vIGNhY2hlIGZ1ZXIgYmVyZWNobmV0ZSBXZWdlCitub3NhdmUgbWFwcGluZyBwYXRoY2FjaGUgPSAoW10pOworLy8gQXVmYmF1OiAoWyAic3RhcnRyYXVtIjogPGRlc3RzPiwgLi4uXSkKKy8vIDxkZXN0cz46IChbInppZWxyYXVtIjogPHdlZ2U+LCAuLi5dKQorLy8gPHdlZ2U+OiAoW3BhcmF3ZWx0OiAoPHN0cnVjdCBwYXRoX3M+KSBdKQorCitzdHJ1Y3QgcGF0aF9zIHsKKyAgICBpbnQgY29zdHM7ICAgICAgLy8gS29zdGVuIGRlcyBrb21wbGV0dGVuIFBmYWRlcworICAgIHN0cmluZyAqcm9vbXM7ICAvLyBMaXN0ZSB2b24gZHVyY2hsYXVmZW5lbiBSYWV1bWVuCisgICAgc3RyaW5nICpjbWRzOyAgIC8vIExpc3RlIHZvbiBLb21tYW5kb3MsIHVtIFJhZXVtZSB6dSBkdXJjaGxhdWZlbgorICAgIGludCB0dGw7ICAgICAgICAvLyB0aW1lLXRvLWxpdmUsIEFibGF1ZnplaXQgZGVzIFBmYWRzIGltIENhY2hlCisgICAgaW50IHBhcmE7ICAgICAgIC8vIFBhcmF3ZWx0CisgICAgaW50IGZsYWdzOyAgICAgIC8vIEZsYWdzIHp1IGRlbSBQZmFkCit9OworLy8gRmxhZ3MgZnVlciBQZmFkZSBpbSBQZmFkY2FjaGUKKyNkZWZpbmUgUEZMQUdfUEVSTUFORU5UIENGTEFHX1BFUk1BTkVOVAorI2RlZmluZSBQRkxBR19ET05UVVNFIENGTEFHX0RPTlRVU0UKKworCisvLyBQcm90b3R5cGVzCitwdWJsaWMgdm9pZCBjcmVhdGUoKTsKK3B1YmxpYyB2b2lkIGFkZF9wYXRocyggbWl4ZWQgY29ubmVjdGlvbnMgKTsKK3B1YmxpYyB2YXJhcmdzIHZvaWQgc2hvd19wYXRobWFwKCBzdHJpbmcgcGF0aCApOworcHVibGljIHZhcmFyZ3MgaW50IHNob3dfc3RhdGlzdGljKCBpbnQgdmVyYm9zZSwgaW50IHNpbGVudCApOworcHVibGljIGludCBjaGFuZ2VfcGF0aG1hcCggc3RyaW5nIHBmYWQsIG1peGVkICp2ZXJiaW5kdW5nZW4gKTsKK3B1YmxpYyBtYXBwaW5nIGdldF9wYXRobWFwKCk7CitwdWJsaWMgdm9pZCByZXNldCgpOworcHVibGljIHZhcmFyZ3MgaW50IHJlbW92ZSggaW50IHNpbGVudCApOworcHVibGljIHZhcmFyZ3MgaW50IHF1ZXJ5X3ByZXZlbnRfc2hhZG93KCBvYmplY3Qgb2IgKTsKK3N0YXRpYyBpbnQgaW5zZXJ0X3BhdGhzKCBtaXhlZCAqcGF0aCApOworc3RhdGljIG1peGVkICpmb3JtYXRfcGF0aHMoIG1peGVkIGJ1ZiApOworc3RhdGljIHZvaWQgX3NlYXJjaCggc3RyaW5nIGZuYW1lLCBzdHJpbmcgc3RhcnQgKTsKK3ByaXZhdGUgc3RyaW5nIF9nZXRfcHJlZml4KCBzdHJpbmcgcGF0aCApOworcHJvdGVjdGVkIHZvaWQgY2xlYW51cF9kYXRhKCBzdHJpbmcgKm5hbWVzLCBpbnQgaWR4ICk7Citwcm90ZWN0ZWQgdm9pZCBleHBpcmVfcGF0aF9jYWNoZShzdHJpbmcgKnN0YXJ0cm9vbXMpOworCisKK3B1YmxpYyB2b2lkIGNyZWF0ZSgpCit7CisgICAgLy8gd2lyIG11ZXNzZW4gZGFzIFNhdmVmaWxlIHNjaHJlaWJlbiBkdWVyZmVuCisgICAgc2V0ZXVpZChnZXR1aWQoKSk7CisKKyAgICBpZiAoICFyZXN0b3JlX29iamVjdChTQVZFRklMRSkgKSB7CisgICAgICAgIHBhdGhtYXAgPSAoW10pOworICAgIH0KK30KKworCisvLyBXaXJkIHZvbiBTcGllbGVybiBhdWZnZXJ1ZmVuIG1pdCBkZW4gV2VnZW4sIGRpZSBzaWUgZ2VsYXVmZW4gc2luZAorcHVibGljIHZvaWQgYWRkX3BhdGhzKCBtaXhlZCBjb25uZWN0aW9ucyApCit7CisgICAgbWl4ZWQgcGF0aHM7CisKKyAgICAvLyBrZWluZW4gQXVmcnVmIHBlciBIYW5kIGJpdHRlCisgICAgaWYgKCAhcHJldmlvdXNfb2JqZWN0KCkgfHwgIXRoaXNfcGxheWVyKCkKKyAgICAgICAgIHx8IHRoaXNfaW50ZXJhY3RpdmUoKSAmJiBnZXR1aWQodGhpc19pbnRlcmFjdGl2ZSgpKSAhPSAiemVzc3RyYSIKKyAgICAgICAgIHx8IGZpbGVfc2l6ZSggIi9zdGQvc2hlbGxzIiArCisgICAgICAgICAgICAgICAgICAgICAgIGV4cGxvZGUoIG9iamVjdF9uYW1lKHByZXZpb3VzX29iamVjdCgpKSwgIjoiIClbMF0KKyAgICAgICAgICAgICAgICAgICAgICAgKyAiLmMiICkgPCAxICkKKyAgICAgICAgcmV0dXJuOworCisjaWYgX19CT09UX1RJTUVfXyA8IDEzNTcwNDIwOTIKKyAgICAvLyBhbHRlIFNwaWVsZXJvYmpla3RlIGxpZWZlcm4gbm9jaCBlaW4gQXJyYXkgdm9uIFN0cmluZ3Mgc3RhdHQgZWluZXMKKyAgICAvLyBBcnJheXMgdm9uIEFycmF5cy4KKyAgICBjb25uZWN0aW9ucyA9IG1hcChjb25uZWN0aW9ucywgZnVuY3Rpb24gbWl4ZWQgKHN0cmluZyBwYXRoKQorICAgICAgICB7CisgICAgICAgICAgLy8gQWxsZSBEYXRlbiBrb21tZW4gYWxzIGVpbiBTdHJpbmcgbWl0ICcjJyBhbHMgVHJlbm5lciBhbi4KKyAgICAgICAgICAvLyBNdXN0ZXI6IFN0YXJ0cmF1bSNaaWVscmF1bSNWZXJiI01ldGhvZGUgZGVyIEJld2VndW5nI1BhcmF3ZWx0CisgICAgICAgICAgbWl4ZWQgYnVmID0gZXhwbG9kZSggcGF0aCwgIiMiICk7CisgICAgICAgICAgLy8gRmFsbHMgaW0gVmVyYiBhdWNoICMgdm9ya2FtICh1bndhaHJzY2hlaW5saWNoLCBhYmVyIG1vZWdsaWNoKToKKyAgICAgICAgICBidWZbMi4uPDNdID0gKHsgaW1wbG9kZSggYnVmWzIuLjwzXSwgIiMiICkgfSk7CisgICAgICAgICAgcmV0dXJuIGJ1ZjsKKyAgICAgICAgfSAKKyAgICAgICAgKTsKKyNlbmRpZgorCisgICAgLy8gRGF0ZW4gYXVmYmVyZWl0ZW4KKyAgICBwYXRocyA9IG1hcCggY29ubmVjdGlvbnMsICMnZm9ybWF0X3BhdGhzLyonKi8gKSAtICh7MH0pOworICAgIC8vIE5ldWUgUmFldW1lIGVpbnRyYWdlbgorICAgIGZpbHRlciggcGF0aHMsICMnaW5zZXJ0X3BhdGhzLyonKi8gKTsKK30KKworcHVibGljIG1peGVkIGdldF9wYXRoX2Zyb21fY2FjaGUoc3RyaW5nIGZyb20sIHN0cmluZyB0bywgaW50IHBhcmEpIHsKKyAgICAvLyB3ZW5uIGltIENhY2hlLCBhdXMgZGVtIENhY2hlIGxpZWZlcm4uCisgICAgbWFwcGluZyB0YXJnZXRzID0gcGF0aGNhY2hlW2Zyb21dOworICAgIGlmICh0YXJnZXRzKSB7CisgICAgICAgIG1hcHBpbmcgcGF0aHMgPSB0YXJnZXRzW3RvXTsKKyAgICAgICAgaWYgKHBhdGhzKSB7CisgICAgICAgICAgICBpZiAobWVtYmVyKHBhdGhzLCBwYXJhKSkgeworICAgICAgICAgICAgICAgIHN0cnVjdCBwYXRoX3MgcCA9IHBhdGhzW3BhcmFdOworICAgICAgICAgICAgICAgIGlmIChwLT50dGwgPiB0aW1lKCkpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiAoeyBmcm9tLCB0bywgcGFyYSwgcC0+Y29zdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvcHkocC0+cm9vbXMpLCBjb3B5KHAtPmNtZHMpIH0pOworICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICBtX2RlbGV0ZShwYXRocywgcGFyYSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHJldHVybiAwOworfQorCisvLyBTdWNoZnVua3Rpb24sIHVtIGRpZSBrdWVyemVzdGUgVmVyYmluZHVuZyB6d2lzY2hlbiB6d2VpIFJhZXVtZW4genUgZmluZGVuCitwdWJsaWMgaW50IFNlYXJjaFBhdGgoIHN0cmluZyBmcm9tLCBzdHJpbmcgdG8sIGludCBwYXJhLAorICAgICAgICAgICAgICAgICAgICAgICBjbG9zdXJlIGNhbGxiYWNrKQoreworICAgIC8vIFBybyBVSUQgZGFyZiBlcyBudXIgZWluZW4gU3VjaGF1ZnRyYWcgZ2ViZW4uCisgICAgc3RyaW5nIHVpZD1nZXR1aWQocHJldmlvdXNfb2JqZWN0KCkpOworICAgIGlmICggbWVtYmVyKHNlYXJjaGxpc3QsdWlkKSApCisgICAgICAgIHJldHVybiAtMTsKKyAgICAvLyB1bmQgbWVociBhbHMgNSBnbGVpY2h6ZWl0aWcgZXJzdG1hbCBhdWNoIG5pY2h0LgorICAgIGlmIChzaXplb2Yoc2VhcmNobGlzdCk+NCkKKyAgICAgICAgcmV0dXJuIC0yOworCisgICAgLy8gQW5mcmFnZSBsb2dnZW4KKyAgICBMT0coc3ByaW50ZigiJXM6IFN1Y2hlICVzIC0+ICVzICglZCkgdm9uICVzICglcywgJXMsICVzKVxuIiwKKyAgICAgICAgICBzdHJmdGltZSgiJXklbSVkLSVIJU0lUyIpLCBmcm9tLCB0bywgcGFyYSwgdWlkLAorICAgICAgICAgIG9iamVjdF9uYW1lKHByZXZpb3VzX29iamVjdCgpKSwKKyAgICAgICAgICBvYmplY3RfbmFtZSh0aGlzX3BsYXllcigpKSB8fCAiTk8tUEwiLAorICAgICAgICAgIG9iamVjdF9uYW1lKHRoaXNfaW50ZXJhY3RpdmUoKSkgfHwgIk5PLVRJIikgKTsKKworICAgIC8vIHdlbm4gU3RhcnQtIG9kZXIgWmllbHJhdW0gbmljaHQgYmVrYW5udCBzaW5kLCBrYW5uIGVzIGF1Y2gga2VpbmUgUm91dGUKKyAgICAvLyBnZWJlbi4KKyAgICBpZiAoIW1lbWJlcihwYXRobWFwW19nZXRfcHJlZml4KHRvKV0sdG8pCisgICAgICAgIHx8ICFtZW1iZXIocGF0aG1hcFtfZ2V0X3ByZWZpeChmcm9tKV0sZnJvbSkgKQorICAgICAgICByZXR1cm4gLTM7CisKKyAgICBtaXhlZCBwYXRoID0gZ2V0X3BhdGhfZnJvbV9jYWNoZShmcm9tLCB0bywgcGFyYSk7CisgICAgaWYgKHBhdGgpIHsKKyAgICAgICAgaWYgKGNhbGxiYWNrKQorICAgICAgICAgICAgYXBwbHkoY2FsbGJhY2sscGF0aCk7IAorICAgICAgICByZXR1cm4gMjsKKyAgICB9CisKKyAgICAvLyBEYXRlbnN0cnVrdHVyZXJrbGFlcnVuZzogcy5vLgorICAgIG1hcHBpbmcgdGFyZ2V0cyA9IG1fYWxsb2NhdGUoMTIwMCwzKTsKKyAgICBtX2FkZCh0YXJnZXRzLGZyb20sMCwoe30pLCh7fSkgKTsKKyAgICBzZWFyY2hsaXN0Kz0gKFsgdWlkOiBmcm9tOyB0bzsgKHt9KTsKKyAgICAgICAgICAgICAgICAgICAgIHRhcmdldHM7CisgICAgICAgICAgICAgICAgICAgICAocXVlcnlfd2l6X2xldmVsKHRoaXNfaW50ZXJhY3RpdmUoKSk/MTowKTsKKyAgICAgICAgICAgICAgICAgICAgIHBhcmE7ICh7fSk7IGNhbGxiYWNrXSk7CisKKyAgICAvLyBEaWUgZWlnZW50bGljaGUgU3VjaGUgc3RhcnRlbgorICAgIF9zZWFyY2goIHVpZCwgZnJvbSApOworCisgICAgcmV0dXJuIDE7Cit9CisKKy8vIEdlc3BlaWNoZXJ0ZSBJbmZvcm1hdGlvbmVuIHp1IGVpbmVtIFJhdW0gb2RlciBlaW5lbSBrb21wbGV0dGVuIEdlYmlldAorLy8gYWJmcmFnZW4uIEdlYmlldGUgbGFzc2VuIHNpY2ggYWJlciBudXIgYWxzICJPcmdhbmlzYXRpb25zZWluaGVpdGVuIiBhYmZyYWdlbi4KKy8vIERhYmVpIHdlcmRlbiBHZWJpZXRlIHVudGVyaGFsYiB2b24gL2QvKiBhbHMgL2QvcmVnaW9uL21hZ2llcm5hbWUKKy8vIGFiZ2VzcGVpY2hlcnQgdW5kIGRlciBSZXN0IHVudGVyIGRlbiBlcnN0ZW4gYmVpZGVuIFRlaWxwZmFkZW4uCitwdWJsaWMgdmFyYXJncyB2b2lkIHNob3dfcGF0aG1hcCggc3RyaW5nIHBhdGggKQoreworICAgIHN0cmluZyBwcmU7CisKKyAgICBpZiAoIHBhdGggKQorICAgIHsKKyAgICAgICAgcHJlID0gX2dldF9wcmVmaXgocGF0aCk7CisKKyAgICAgICAgaWYgKCBwcmUgPT0gcGF0aCApCisgICAgICAgICAgICAvLyBHYW56ZW4gVGVpbGJhdW0gYXVzZ2ViZW4KKyAgICAgICAgICAgIHByaW50ZiggIlBhdGhtYXBbJU9dOiAlT1xuIiwgcGF0aCwgcGF0aG1hcFtwYXRoXSApOworICAgICAgICBlbHNlCisgICAgICAgICAgICAvLyBOdXIgSW5mb3MgdWViZXIgZWluZW4gUmF1bSBhdXNnZWJlbgorICAgICAgICAgICAgcHJpbnRmKCAiUGF0aG1hcFslT106ICVPXG4iLCBwYXRoLAorICAgICAgICAgICAgICAgICAgICBwYXRobWFwW3ByZV0gPyBwYXRobWFwW3ByZV1bcGF0aF0gOiAwICk7CisgICAgfQorICAgIGVsc2UKKyAgICAgICAgLy8gT2huZSBBcmd1bWVudCB3aXJkIGRpZSBnZXNhbXRlIE1hcCBhdXNnZWdlYmVuLgorICAgICAgICAvLyBLbGFwcHQgYWJlciBlaGVyIG5pY2h0IChtZWhyKSB3ZWdlbiBCdWZmZXIgb3ZlcmZsb3cuIDteKQorICAgICAgICBwcmludGYoICJQYXRobWFwOiAlT1xuIiwgcGF0aG1hcCApOworfQorCisKKy8vIFN0YXRpc3RpYyB6dSBkZW4gZ2VzcGVpY2hlcnRlbiBEYXRlbiBhbnplaWdlbi4KKy8vIE1pdCAndmVyYm9zZScgd2lyZCBqZWRlIE9yZ2FuaXNhdGlvbnNlaW5oZWl0IGVpbnplbG4gYXVmZ2VsaXN0ZXQsIG9obmUKKy8vIHdpcmQgZ3JvYiBuYWNoIFJlZ2lvbmVuIHp1c2FtbWVuZ2VmYXNzdC4KK3B1YmxpYyB2YXJhcmdzIGludCBzaG93X3N0YXRpc3RpYyggaW50IHZlcmJvc2UsIGludCBzaWxlbnQgKQoreworICAgIGludCBpLCBnZXM7CisgICAgc3RyaW5nICppbmQsIG5hbWU7CisgICAgbWFwcGluZyBtOworCisgICAgaWYgKCB2ZXJib3NlICl7IC8vIFN0dXIgamVkZW4gRWludHJhZyBhdWZsaXN0ZW4KKyAgICAgICAgaW5kID0gc29ydF9hcnJheSggbV9pbmRpY2VzKHBhdGhtYXApLCAjJzwvKicqLyApOworICAgICAgICBmb3IgKCBpID0gc2l6ZW9mKGluZCk7IGktLTsgKXsKKyAgICAgICAgICAgIGlmICggIXNpbGVudCApCisgICAgICAgICAgICAgICAgcHJpbnRmKCAiJS0zMHM6ICU0ZFxuIiwgaW5kW2ldLCBzaXplb2YocGF0aG1hcFtpbmRbaV1dKSApOworICAgICAgICAgICAgZ2VzICs9IHNpemVvZihwYXRobWFwW2luZFtpXV0pOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UgeyAgICAgICAgICAvLyBSZWdpb25lbiB6dXNhbW1lbmZhc3NlbgorICAgICAgICBpbmQgPSBtX2luZGljZXMocGF0aG1hcCk7CisgICAgICAgIG0gPSAoW10pOworCisgICAgICAgIGZvciAoIGkgPSBzaXplb2YoaW5kKTsgaS0tOyApeworICAgICAgICAgICAgaWYgKHN0cnN0cihpbmRbaV0sIi9kLyIpID09IDApCisgICAgICAgICAgICAgICAgLy8gL2QuLi4gamV3ZWlscyBuYWNoIHp3ZWkgVGVpbHBmYWRlbgorICAgICAgICAgICAgICAgIG5hbWUgPSBpbXBsb2RlKCBleHBsb2RlKCBpbmRbaV0sICIvIiApWzAuLjJdLCAiLyIgKTsKKyAgICAgICAgICAgIGVsc2UgaWYgKCBzdHJzdHIoaW5kW2ldLCIvcGxheWVycyIpID09IDApCisgICAgICAgICAgICAgICAgLy8gQWxsZSBQbGF5ZXJ2ZXJ6ZWljaG5pc3NlIHp1c2FtbWVuZmFzc2VuIC4uLgorICAgICAgICAgICAgICAgIG5hbWUgPSAiL3BsYXllcnMiOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIC8vIC4uLiBkZW4gUmVzdCBuYWNoIGVpbmVtIFRlaWxwZmFkCisgICAgICAgICAgICAgICAgbmFtZSA9IGltcGxvZGUoIGV4cGxvZGUoIGluZFtpXSwgIi8iIClbMC4uMV0sICIvIiApOworCisgICAgICAgICAgICBpZiAoICFtW25hbWVdICkKKyAgICAgICAgICAgICAgICBtW25hbWVdID0gc2l6ZW9mKCBwYXRobWFwW2luZFtpXV0gKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBtW25hbWVdICs9IHNpemVvZiggcGF0aG1hcFtpbmRbaV1dICk7CisgICAgICAgIH0KKworICAgICAgICBpbmQgPSBzb3J0X2FycmF5KCBtX2luZGljZXMobSksICMnPC8qJyovICk7CisgICAgICAgIGZvciAoIGkgPSBzaXplb2YoaW5kKTsgaS0tOyApeworICAgICAgICAgICAgaWYgKCAhc2lsZW50ICkKKyAgICAgICAgICAgICAgICBwcmludGYoICIlLTMwczogJTRkXG4iLCBpbmRbaV0sIG1baW5kW2ldXSApOworICAgICAgICAgICAgZ2VzICs9IG1baW5kW2ldXTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICggIXNpbGVudCApCisgICAgICAgIHByaW50ZiggIlxuR2VzYW10OiAlZCBSYWV1bWUuXG4iLCBnZXMgKTsKKworICAgIHJldHVybiBnZXM7Cit9CisKKworLy8gTWFuaXB1bGllcmVuIGRlciBpbnRlcm5lbiBQYXRobWFwLiBOdXIgenVtIERlYnVnZ2VuIHVuZCBzb21pdAorLy8gbnVyIGZ1ZXIgWmVzc3RyYSBlcmxhdWJ0LiBTb25zdCB2ZXJodW56dCBtaXIgbm9jaCB3ZXIgbWVpbmUgRGF0ZW4uIDteKQorcHVibGljIGludCBjaGFuZ2VfcGF0aG1hcCggc3RyaW5nIHBmYWQsIG1peGVkICp2ZXJiaW5kdW5nZW4gKQoreworICAgIGlmICggIXRoaXNfaW50ZXJhY3RpdmUoKSB8fCBnZXR1aWQodGhpc19pbnRlcmFjdGl2ZSgpKSAhPSAiemVzc3RyYSIKKyAgICAgICAgIHx8ICFwcmV2aW91c19vYmplY3QoKSB8fCBnZXR1aWQocHJldmlvdXNfb2JqZWN0KCkpICE9ICJ6ZXNzdHJhIiApCisgICAgICAgIHJldHVybiAtMTsKKworICAgIGlmICggbWFwcGluZ3AodmVyYmluZHVuZ2VuKSApeworICAgICAgICBpZiAoICFwYXRobWFwW19nZXRfcHJlZml4KHBmYWQpXSApCisgICAgICAgICAgICByZXR1cm4gMDsKKworICAgICAgICBwYXRobWFwW19nZXRfcHJlZml4KHBmYWQpXSA9IHZlcmJpbmR1bmdlbjsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIGlmICggIXBhdGhtYXBbX2dldF9wcmVmaXgocGZhZCldW3BmYWRdICkKKyAgICAgICAgICAgIHJldHVybiAwOworCisgICAgICAgIHBhdGhtYXBbX2dldF9wcmVmaXgocGZhZCldW3BmYWRdID0gdmVyYmluZHVuZ2VuOworICAgIH0KKworICAgIHJldHVybiAxOworfQorCisvLyBEaWUgRnVua3Rpb24gZ2lidCBhbGxlIGRlbSBwYXRoZCBiZWthbm50ZW4gUmFldW1lIGFscyBNYXBwaW5nIHZvbiBBcnJheXMKKy8vIHp1cnVlY2suIFNjaGz8c3NlbCBkZXMgTWFwcGluZ3Mgc2luZCBkYWJlaSBHZWJpZXRlLgorcHVibGljIG1hcHBpbmcgZ2V0X3Jvb21zKCkKK3sKKyAgc3RyaW5nICpzdWJtYXBzOworICBtYXBwaW5nIHJvb21tYXA7CisgIGludCBpOworCisgIHJvb21tYXA9KFtdKTsKKworICBzdWJtYXBzPW1faW5kaWNlcyhwYXRobWFwKTsKKworICBpPXNpemVvZihzdWJtYXBzKTsKKworICB3aGlsZSAoaS0tKQorICAgIGlmIChzaXplb2YobV9pbmRpY2VzKHBhdGhtYXBbc3VibWFwc1tpXV0pKSkKKyAgICAgICAgcm9vbW1hcFtzdWJtYXBzW2ldXT1tX2luZGljZXMocGF0aG1hcFtzdWJtYXBzW2ldXSk7CisKKyAgcmV0dXJuIHJvb21tYXA7Cit9CisKKy8vIERhdGVuIHp1IGVpbmVyIFZlcmJpbmR1bmcgc2FtbWVsbiB1bmQgYXVmYmVyZWl0ZW4KK3N0YXRpYyBtaXhlZCAqZm9ybWF0X3BhdGhzKCBtaXhlZCBidWYgKQoreworICAgIHN0cmluZyBjbWQsIHVpZDsKKyAgICBvYmplY3Qgb2I7CisgICAgbWFwcGluZyBleGl0czsKKyAgICBpbnQgYXJ0OworCisgICAgLy8gTWFnaWVyIHVuZCBUZXN0c3BpZWxlciBrb2VubmVuIGF1Y2ggaW4gbmljaHQgYW5nZXNjaGxvc3NlbmUgR2ViaWV0ZQorICAgIC8vIHVuZCB3ZXJkZW4gZGVzaGFsYiBuaWNodCBiZWFjaHRldC4KKyAgICBpZiAoIElTX0xFQVJORVIocHJldmlvdXNfb2JqZWN0KDEpKSB8fAorICAgICAgICAgSVNfTEVBUk5FUihsb3dlcl9jYXNlKCBwcmV2aW91c19vYmplY3QoMSktPlF1ZXJ5KFBfVEVTVFBMQVlFUil8fCIiICkpICkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBjbWQgPSB0cmltKGJ1ZlsyXSxUUklNX0JPVEgpOworI2lmIF9fQk9PVF9USU1FX18gPCAxMzU3MDQyMDkyCisgICAgLy8gIiAwIiBhbSBFbmRlIGRlcyBCZWZlaGxzIGFic2NobmVpZGVuLiAqZ3J1bW1lbCoKKyAgICBpZiAoY21kWzwyLi5dPT0iIDAiKQorICAgICAgY21kID0gY21kWy4uPDNdOworI2VuZGlmCisKKyAgICAvLyBXZW5uIGRlciBaaWVscmF1bSBhbHMgU3RyaW5nIGFuZ2VnZWJlbiB3dXJkZSwga2FubiBkZXIgZnVlaHJlbmRlCisgICAgLy8gU2xhc2ggZmVobGVuIQorICAgIGlmICggYnVmWzFdWzBdICE9ICcvJyApCisgICAgICAgIGJ1ZlsxXSA9ICIvIiArIGJ1ZlsxXTsKKworICAgIC8vIFp1bSBBYmZyYWdlbiBkZXIgenVzYWV0emxpY2hlbiBEYXRlbiBicmF1Y2hlbiB3aXIgZGFzIE9iamVrdCBzZWxiZXIKKyAgICBjYXRjaChvYiA9IGxvYWRfb2JqZWN0KGJ1ZlswXSk7cHVibGlzaCk7CisgICAgaWYgKCFvYmplY3RwKG9iKSkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICAvLyBLbGVpbmVyIEhhY2sgLSBiZWkgVHJhbnNwb3J0ZXJuIGV0Yy4gaXN0ICdvYicgZGllIG5pY2h0IGluaXRpYWxpc2llcnRlCisgICAgLy8gQmx1ZXByaW50LiBKZWRlIEFiZnJhZ2Ugdm9uIFBfRVhJVFMgd3VlcmRlIG5ldHQgYXVmIC1EZWJ1ZyBzY3JvbGxlbi4KKyAgICAvLyBEYSBQX0lEUyBpbSBjcmVhdGUoKSBhdWYgamVkZW4gRmFsbCBhdWYgZWluIEFycmF5IGdlc2V0enQgd2lyZCwKKyAgICAvLyBtaXNzYnJhdWNoZSBpY2ggZGFzIGhpZXIgYWxzICJJc3QgaW5pdGlhbGlzaWVydCItRmxhZy4KKyAgICBpZiAoICFvYi0+UXVlcnlQcm9wKFBfSURTKSApCisgICAgICAgIHJldHVybiAwOworCisgICAgLy8gQXJ0IGRlcyBBdXNnYW5ncyBmZXN0c3RlbGxlbi4gCisgICAgaWYgKCBtYXBwaW5ncChleGl0cyA9IG9iLT5RdWVyeVByb3AoUF9FWElUUykpICYmIGV4aXRzW2NtZF0gKQorICAgICAgICBhcnQgPSBOT1JNQUw7ICAgLy8gIm5vcm1hbGVyIiBBdXNnYW5nCisgICAgZWxzZSBpZiAoIG1hcHBpbmdwKGV4aXRzID0gb2ItPlF1ZXJ5UHJvcChQX1NQRUNJQUxfRVhJVFMpKSAmJiBleGl0c1tjbWRdICkKKyAgICAgICAgYXJ0ID0gU1BFQ0lBTDsgIC8vIFNwZWNpYWxFeGl0CisgICAgZWxzZSB7CisgICAgICAgIC8vIEtvbW1hbmRvcywgZGllIGVpbmVuIGluIGVpbmVuIGFuZGVyZW4gUmF1bSBicmluZ2VuCisgICAgICAgIGFydCA9IHRvX2ludChidWZbM10pOyAgIC8vIE1vdmUtTWV0aG9kZQorCisgICAgICAgIC8vIEVzIHphZWhsZW4gYWJlciBudXIgQmV3ZWd1bmdlbiwgZGllIGhhbGJ3ZWdzICJub3JtYWwiIGF1c3NlaGVuLAorICAgICAgICAvLyBkLmguIGtlaW4gTV9UUE9SVCwgTV9OT0NIRUNLIHVuZCBNX0dPIG11c3MgZ2VzZXR6dCBzZWluLgorICAgICAgICBpZiAoIGFydCAmIChNX1RQT1JUIHwgTV9OT0NIRUNLKSB8fCAhKGFydCAmIE1fR08pICkKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICBlbHNlCisgICAgICAgICAgICBhcnQgPSBDT01NQU5EOworICAgIH0KKworICAgIC8vIERpZSBVSUQgZGVyIFNwaWVsZXIvU2VoZXIgd2lyZCB2ZXJzY2hsdWVzc2VsdC4KKyAgICAvLyBTY2hsaWVzc2xpY2ggYnJhdWNoZW4gd2lyIHNpZSBudXIgZnVlciBzdGF0aXN0aXNjaGUgWndlY2tlIHVuZCBuaWNodCwKKyAgICAvLyB1bSBCZXdlZ3VuZ3Nwcm9maWxlIHp1IGVyc3RlbGxlbi4gY3J5cHQoKSByZWljaHQgZnVlciBkaWVzZSBad2Vja2UKKyAgICAvLyB3b2hsIGVyc3RtYWwuCisgICAgdWlkID0gZ2V0dWlkKHByZXZpb3VzX29iamVjdCgxKSk7CisgICAgdWlkID0gY3J5cHQoIHVpZCwgInczIiApOworCisgICAgLy8gU3RhcnQsIFppZWwsIFZlcmIsIFdpemxldmVsKFRQKSwgVUlEKFRQKSwgQXJ0IGRlcyBBdXNnYW5ncywgUGFyYXdlbHQKKyAgICByZXR1cm4gKHsgYnVmWzBdLCBidWZbMV0sIGNtZCwgcXVlcnlfd2l6X2xldmVsKHByZXZpb3VzX29iamVjdCgxKSkgPyAxIDogMCwKKyAgICAgICAgICAgICAgICAgIHVpZCwgYXJ0LCB0b19pbnQoYnVmWzRdKSB9KTsKK30KKworLy8gUHJ1ZWZ0IGFsbGUgVmVyYmluZHVuZ2VuIGltIEFycmF5IDxjb25ucz4sIHdlbGNoZSBkYXMgZ2xlaWNoZSBLb21tYW5kbyB3aWUKKy8vIDxjb25uPiBoYWJlbiwgb2Igc2llIGluIHVudGVyc2NoaWVkbGljaGUgUmFldW1lIGZ1ZWhyZW4uIFdlbm4gamEsIHNpbmQgc2llCisvLyBmdWVyIGRhcyBSb3V0aW5nIG5pY2h0IG51dHpiYXIuIEF1c25haG1lOiBWZXJiaW5kdW5nZW4sIGRpZSBpbgorLy8gdW50ZXJzY2hpZWRsaWNoZSBQYXJhd2VsdGVuIGZ1ZWhyZW4uCisvLyBBZW5kZXJ0IDxjb25ucz4gZGlyZWt0LgorcHJpdmF0ZSB2b2lkIGNoZWNrX2FuZF9tYXJrX2R1cGxpY2F0ZV9jb25uc19ieV9jb25uKG1peGVkIGNvbm5zLCBtaXhlZCBjb25uKSB7CisgICAgZm9yZWFjaChtaXhlZCBjOiBjb25ucykgeworICAgICAgICBpZiAoIGNbQ09OTl9DTURdID09IGNvbm5bQ09OTl9DTURdCisgICAgICAgICAgICAmJiBjW0NPTk5fREVTVF0gIT0gY29ubltDT05OX0RFU1RdCisgICAgICAgICAgICAmJiBjW0NPTk5fUEFSQV0gPT0gY29ubltDT05OX1BBUkFdICkKKyAgICAgICAgeworICAgICAgICAgICAgY1tDT05OX0ZMQUdTXSB8PSBDRkxBR19EVVBMSUNBVEU7CisgICAgICAgICAgICBjb25uW0NPTk5fRkxBR1NdIHw9IENGTEFHX0RVUExJQ0FURTsKKyAgICAgICAgfQorICAgIH0KK30KKworcHJpdmF0ZSB2b2lkIGNoZWNrX2FuZF9tYXJrX2R1cGxpY2F0ZV9jb25ucyhtaXhlZCBjb25ucykgeworICAgIGZvcmVhY2gobWl4ZWQgYzogY29ubnMpCisgICAgICAgIGNoZWNrX2FuZF9tYXJrX2R1cGxpY2F0ZV9jb25uc19ieV9jb25uKGNvbm5zLCBjKTsKK30KKworCisvLyBOZXVlIFZlcmJpbmR1bmcgaW4gZGVyIERhdGVuYmFuayBlaW50cmFnZW4KK3N0YXRpYyBpbnQgaW5zZXJ0X3BhdGhzKCBtaXhlZCAqcGF0aCApCit7CisgICAgc3RyaW5nIHByZSA9IF9nZXRfcHJlZml4KHBhdGhbMF0pOworCisgICAgLy8gRmFsbHMgbm9jaCBnYXIga2VpbiBFaW50cmFnIGV4aXN0aWVydCwgbmV1IGluaXRpYWxpc2llcmVuCisgICAgaWYgKCAhbWFwcGluZ3AocGF0aG1hcFtwcmVdKSApCisgICAgICAgIHBhdGhtYXBbcHJlXSA9IChbXSk7CisKKyAgICBpZiAoICFwb2ludGVycChwYXRobWFwW3ByZV1bcGF0aFswXV0pICkKKyAgICAgICAgcGF0aG1hcFtwcmVdW3BhdGhbMF1dID0gKHt9KTsKKworICAgIC8vIEF1ZmJhdSB2b24gJ3BhdGgnOgorICAgIC8vICh7IFN0YXJ0LCBaaWVsLCBWZXJiLCBXaXpsZXZlbChUUCksIFVJRChUUCksIEFydCBkZXMgQXVzZ2FuZ3MsIFBhcmEgfSkKKyAgICAvLyBBdWZiYXUgdm9uICdjb25uJyAocy4gYXVjaCBnYW56IG9iZW4pCisgICAgLy8gKHsgWmllbCwgVmVyYiwgKHsgU3BpZWxlci1VSURzLCBTZWhlci1VSURzIH0pLCBBcnQgZGVzIEF1c2dhbmdzLAorICAgIC8vICAgKHsgTGV0enRlcyBCZXRyZXRlbiBkdXJjaCBTcGllbGVyLCBkdXJjaCBTZWhlciB9KSwgUGFyYXdlbHQgfSkKKworICAgIC8vIEFsbGUgVmVyYmluZHVuZ2VuIGRlcyBSYXVtZXMgZHVyY2hnZWhlbgorICAgIG1peGVkIGNvbm5zID0gcGF0aG1hcFtwcmVdW3BhdGhbMF1dOworICAgIC8vIEtvbW1hbmRvcyBkZXIgVmVyYmluZHVuZ2VuIHNhbW1lbG4uIFdlbm4gZXMgendlaSBWZXJiaW5kdW5nZW4gbWl0IGRlbQorICAgIC8vIGdsZWljaGVuIEtvbW1hbmRvIGdpYnQsIHNpbmQgYmVpZGUgdW5iZW51dHpiYXIuCisgICAgbWl4ZWQgY21kcyA9IG1fYWxsb2NhdGUoMTApOworICAgIGludCBpOworICAgIGZvciAoIGkgPSBzaXplb2YoY29ubnMpOyBpLS07ICkKKyAgICB7CisgICAgICAgIG1peGVkIGNvbm4gPSBjb25uc1tpXTsKKyAgICAgICAgbV9hZGQoY21kcyxjb25uW0NPTk5fQ01EXSk7IC8vIEtvbW1hbmRvcyBhbGxlciBDb25ucyBtZXJrZW4KKyAgICAgICAgLy8gV2VubiBaaWVscmF1bSwgVmVyYiB1bmQgUGFyYXdlbHQgcGFzc2VuIC4uLgorICAgICAgICBpZiAoIGNvbm5bQ09OTl9ERVNUXSA9PSBwYXRoWzFdICYmIGNvbm5bQ09OTl9DTURdID09IHBhdGhbMl0KKyAgICAgICAgICAgICAmJiBjb25uW0NPTk5fUEFSQV0gPT0gcGF0aFs2XSApCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIFdlbm4gc2Nob24gZ2VudWcgTGV1dGUgZGllc2UgVmVyYmluZHVuZyBnZW51dHp0IGhhYmVuLCBlaW5mYWNoCisgICAgICAgICAgICAvLyBudXIgZGllIFplaXQgZGVyIGxldHp0ZW4gQmVudXR6dW5nIGFrdHVhbGlzaWVyZW4uCisgICAgICAgICAgICBpbnQgaW5kZXggPSBwYXRoWzNdID8gQ09OTl9VX1NFRVJTIDogQ09OTl9VX1BMQVlFUlM7IC8vIFNlaGVyPworICAgICAgICAgICAgaWYgKCBjb25uW0NPTk5fVVNFUlNdW2luZGV4XSA9PSAtMSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY29ubltDT05OX1RJTUVTXVtpbmRleF0gPSB0aW1lKCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBBbnNvbnN0ZW4gZGllIChuZXVlPykgVUlEIGhpbnp1ZnVlZ2VuIHVuZCBkaWUgWmVpdCBha3R1YWxpc2llcmVuLgorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvbm5bQ09OTl9VU0VSU11baW5kZXhdID0KKyAgICAgICAgICAgICAgICAgICAgY29ubltDT05OX1VTRVJTXVtpbmRleF0gLSAoeyBwYXRoWzRdIH0pICsgKHsgcGF0aFs0XSB9KTsKKyAgICAgICAgICAgICAgICBpZiAoIHNpemVvZihjb25uW0NPTk5fVVNFUlNdW2luZGV4XSkgPj0gTkVFREVEICkKKyAgICAgICAgICAgICAgICAgICAgY29ubltDT05OX1VTRVJTXVtpbmRleF0gPSAtMTsKKworICAgICAgICAgICAgICAgIGNvbm5bQ09OTl9USU1FU11baW5kZXhdID0gdGltZSgpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLy8gRmFsbHMga2VpbmUgVmVyYmluZHVuZyBnZXBhc3N0IGhhdCwgZWluZSBuZXVlIGVyemV1Z2VuLgorICAgIGlmICggaSA8IDAgKSB7CisgICAgICAgIGludCBpbmRleCA9IHBhdGhbM10gPyBDT05OX1VfU0VFUlMgOiBDT05OX1VfUExBWUVSUzsgLy8gU2VoZXI/CisgICAgICAgIG1peGVkIHVpZHMgPSAoeyAoe30pLCAoe30pIH0pOworICAgICAgICB1aWRzW2luZGV4XSA9ICh7IHBhdGhbNF0gfSk7CisgICAgICAgIG1peGVkIHRpbWVzID0gKHsgMCwgMCB9KTsKKyAgICAgICAgdGltZXNbaW5kZXhdID0gdGltZSgpOworCisgICAgICAgIC8vIEF1ZmJhdSBzaWVoZSBvYmVuCisgICAgICAgIG1peGVkIGNvbm4gPSAoeyBwYXRoWzFdLCBwYXRoWzJdLCB1aWRzLCBwYXRoWzVdLCB0aW1lcywgcGF0aFs2XSwgMCB9KTsKKyAgICAgICAgY29ubnMgKz0gKHsgY29ubiB9KTsKKyAgICAgICAgLy8gd2VubiBkaWUgbmV1ZSBWZXJiaW5kdW5nIG5lbiBLb21tYW5kbyBiZW51dHp0LCB3ZWxjaGVzIHNjaG9uIGZ1ZXIKKyAgICAgICAgLy8gZWluZSBhbmRlcmUgVmVyYmluZHVuZyBhdXMgZGllc2VtIFJhdW0gYmVudXR6dCB3aXJkLCBzaW5kIGJlaWRlCisgICAgICAgIC8vIG5pY2h0IG51dHpiYXIsIGRhIGRhcyBaaWVsIG5pY2h0IGVpbmRldXRpZyBpc3QuIEluIGRpZXNlbSBGYWxsCisgICAgICAgIC8vIG11ZXNzZW4gYWxsZSBkaWVzZSBhbHMgdW5iZW51dHpiYXIgZnVlciBkYXMgUm91dGluZyBtYXJraWVydAorICAgICAgICAvLyB3ZXJkZW4uCisgICAgICAgIGlmIChtZW1iZXIoY21kcywgY29ubltDT05OX0NNRF0pKSB7CisgICAgICAgICAgICBjaGVja19hbmRfbWFya19kdXBsaWNhdGVfY29ubnNfYnlfY29ubihjb25ucyxjb25uKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHBhdGhtYXBbcHJlXVtwYXRoWzBdXSA9IGNvbm5zOworCisgICAgLy8gT2IgMCBvZGVyIDEgaXN0IGVpZ2VudGxpY2ggdG90YWwgZWdhbCwgZGEgZGFzIEVyZ2VibmlzLUFycmF5IHNvd2llc28KKyAgICAvLyB2ZXJ3b3JmZW4gd2lyZC4KKyAgICByZXR1cm4gMDsKK30KKworcHJpdmF0ZSB2b2lkIGFkZF90b19jYWNoZShzdHJpbmcgZnJvbSwgc3RyaW5nIHRvLCBpbnQgcGFyYSwgaW50IGNvc3RzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgKnJvb21zLCBzdHJpbmcgKmNtZHMpIHsKKyAgICBzdHJ1Y3QgcGF0aF9zIHAgPSAoPHBhdGhfcz4gY29zdHMgOiBjb3N0cywgcm9vbXM6IHJvb21zLCBjbWRzIDogY21kcywKKyAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhOiBwYXJhLCBmbGFnczogMCwgdHRsOiB0aW1lKCkrODY0MDApOworICAgIGlmICghbWVtYmVyKHBhdGhjYWNoZSwgZnJvbSkpIHsKKyAgICAgICAgcGF0aGNhY2hlW2Zyb21dID0gbV9hbGxvY2F0ZSgxKTsKKyAgICAgICAgcGF0aGNhY2hlW2Zyb21dW3RvXSA9IG1fYWxsb2NhdGUoMSk7CisgICAgfQorICAgIGVsc2UgaWYgKCFtZW1iZXIocGF0aGNhY2hlW2Zyb21dLCB0bykpIHsKKyAgICAgICAgcGF0aGNhY2hlW2Zyb21dW3RvXSA9IG1fYWxsb2NhdGUoMSk7CisgICAgfQorICAgIHBhdGhjYWNoZVtmcm9tXVt0b11bcGFyYV0gPSBwOworfQorCisvLyBEaWVzZSBGdW5rdGlvbiBiZXJlY2huZXQgZGllIEtvc3RlbiBlaW5lciBWZXJiaW5kdW5nLgorLy8gRWluIFNlaGVyc3RhdHVzIHNjaGxpZXNzdCBkaWUgTW9lZ2xpY2hrZWl0ZW4gdm9uIFNwaWVsZXJuIGVpbiAoc2VoZXIKKy8vIGthbm4gU3BpZWxlcnBmYWRlIHByb2JsZW1sb3MgbnV0emVuKS4KKy8vIFdlbm4gZWluZSBWZXJiaW5kdW5nIGluIGVpbmUgYW5kZXJlIFBhcmF3ZWx0IGZ1ZWhydCwgYWxzIGluIDxwYXJhPgorLy8gYW5nZWZyYWd0LCB3aXJkIHNpZSBlcmhlYmxpY2ggdGV1cmVyLgorcHJvdGVjdGVkIGludCBfY2FsY19jb3N0KG1peGVkKiBwYXRoLCBpbnQgc2VlciwgaW50IHBhcmEpCit7CisgICAgbWl4ZWQqIGludGVyZXN0PXBhdGhbQ09OTl9VU0VSU107CisKKyAgICAvLyBCYXNpc2tvc3RlbiBuYWNoIEF1c2dhbmdzYXJ0CisgICAgaW50IGNvc3RzID0gQ09TVF9FWElUU1twYXRoW0NPTk5fRVhJVFRZUEVdXTsKKworICAgIC8vIFZlcmJpbmR1bmdlbiBpbiBhbmRlcmUgYWxzIGRpZSBnZXd1ZW5zY2h0ZSBQYXJhd2VsdCB3ZXJkZW4gYmVpIGRlcgorICAgIC8vIHN1Y2hlIG5pY2h0IGJlcnVlY2tzaWNodGlndCwgYWJlciBWZXJiaW5kdW5nIHZvbiBQYXJhIG5hY2ggTm9ybWFsIHVuZAorICAgIC8vIHVtZ2VrZWhydCBzaW5kIGVybGF1YnQuIFBhcmEtPk5vcm1hbCBzb2xsIGFiZXIgZXR3YXMgdGV1cmVyIHNlaW4sIGRhbWl0CisgICAgLy8gZXMgYmV2b3J6dWd0IHdpcmQsIGluIGRlciBhbmdlZnJhZ3RlbiBXZWx0IHp1IGJsZWliZW4uCisgICAgLy8gKEhpbnRlcmdydW5kOiB3ZW5uIG1hbiBpbiBQYXJhIGlzdCwgbGFldWZ0IG1hbiBtZWlzdGVucyB0cm90emRlbSBkdXJjaAorICAgIC8vIE5vcm1hbHdlbHRyYWV1bWUsIHdlaWwgZXMga2VpbmUgcGFzc2VuZGVuIFBhcmFyYWV1bWUgZ2lidCkuCisgICAgaWYgKHBhcmEgIT0gcGF0aFtDT05OX1BBUkFdKQorICAgICAgICBjb3N0cyArPSBDT1NUX1dPUkxEQ0hBTkdFOworCisgICAgLy8gd2VubiBzY2hvbiBnZW51ZyB1bnRlcnNjaGllZGxpY2hlIExldXRlIGRpZSBWZXJiaW5kdW5nIGdlbGF1ZmVuIHNpbmQsCisgICAgLy8ga29zdGV0IGVzIGRpZSBCYXNpc2tvc3Rlbi4gRnVlciBTZWhlciBhdWNoIGRpZSBTcGllbGVyIGVpbnNjaGxpZXNzZW4uCisgICAgaWYgKGludGVyZXN0W0NPTk5fVV9QTEFZRVJTXT09LTEKKyAgICAgICAgfHwgKHNlZXIgJiYgaW50ZXJlc3RbQ09OTl9VX1NFRVJTXT09LTEpKQorICAgICAgICByZXR1cm4gY29zdHM7CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgLy8gU29uc3Qgd2lyZCBkaWUgVmVyYmluZHVuZyB0ZXVyZXIuCisgICAgICAgIC8vIEFuemFobCBTcGllbGVybnV0emVyIGthbm4gbmljaHQgLTEgc2VpbiAocy5vLikuCisgICAgICAgIGludCB1c2VyY291bnQgPSBzaXplb2YoaW50ZXJlc3RbQ09OTl9VX1BMQVlFUlNdKTsKKyAgICAgICAgLy8gd2VubiA8c2Vlcj4sIHdpcmQgZ2dmLiBkaWUgQW56YWhsIGFuIFNlaGVybnV0emVybiBkcmF1ZiBhZGRpZXJ0LgorICAgICAgICAvLyBXZXJ0IGZ1ZXIgU2VoZXIga2FubiBuaWNodCAtMSBzZWluIChzLm8uKQorICAgICAgICBpZiAoc2VlcikKKyAgICAgICAgICAgIHVzZXJjb3VudCArPSBzaXplb2YoaW50ZXJlc3RbQ09OTl9VX1NFRVJTXSk7CisgICAgICAgIHN3aXRjaCAodXNlcmNvdW50KQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgY29zdHM9MTAwMDAwMDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMS4uMjoKKyAgICAgICAgICAgICAgICBjb3N0cyo9Q09TVF9PTkU7CisgICAgICAgICAgICBjYXNlIDMuLjQ6CisgICAgICAgICAgICAgICAgY29zdHMqPUNPU1RfRkVXOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBjb3N0cyo9Q09TVF9NQU5ZOworICAgICAgICB9CisgICAgICAgIHJldHVybiBjb3N0czsKKyAgICB9CisgICAgREJHKHNwcmludGYoIkh1Y2gsIGtlaW5lIEFobnVuZywgS29zdGVuIHVuYmVzdGltbWJhcjogJU8iLHBhdGgpKTsKKyAgICByZXR1cm4gMTAwMDsKK30KKworLy8gTmV1aW1wbGVtZW50YXRpb24gdm9uIEh1bW5pLCBiZW51dHp0IGVpbmZhY2ggc2ltcGVsIGVpbmVuCisvLyBEaWprc3RyYS1BbGdvcml0aG11cy4gIlNpbXBlbCIgc2NocmVpYmUgaWNoLCBiZXZvciBpY2ggZGllCisvLyBGdW5rdGlvbiBzY2hyZWliZSwgZmx1Y2hlbiB3ZXJkZSBpY2ggZ2xlaWNoLgorc3RhdGljIHZvaWQgX3NlYXJjaChzdHJpbmcgZm5hbWUsIHN0cmluZyBmcm9tKQoreworICAgIC8vIDxmcm9tPiBpc3QgamV0enQgYW56dWd1Y2tlbmRlL3p1IGJlYXJiZWl0ZW5kZSBSYXVtLgorCisgICAgLy8gRGllIGFrdHVlbGxlIExpc3RlIGFuIGFiZ2VzdWNodGVuIFJhZXVtZW4sIFJhZXVtZSwgaW4gZGVuZW4KKyAgICAvLyBhbGxlIFdlZ2UgYmVyZWl0cyBlaW5nZXRyYWdlbiBzaW5kLgorICAgIHN0cmluZyogcm9vbXNfc2VhcmNoZWQ9c2VhcmNobGlzdFtmbmFtZSxTTF9WSVNJVEVEXTsKKworICAgIC8vIFppZWxvcnQKKyAgICBzdHJpbmcgdG8gPSBzZWFyY2hsaXN0W2ZuYW1lLFNMX0RFU1RJTkFUSU9OXTsKKworICAgIC8vIG1vZWdsaWNoZSBaaWVsZQorICAgIG1hcHBpbmcgdGFyZ2V0cz1zZWFyY2hsaXN0W2ZuYW1lLFNMX0NBTkRJREFURVNdOworCisgICAgLy8gd2l6bGV2ZWwKKyAgICBpbnQgc2VlciA9IHNlYXJjaGxpc3RbZm5hbWUsU0xfV0laTEVWRUxdOworCisgICAgLy8gcGFyYQorICAgIGludCBwYXJhPXNlYXJjaGxpc3RbZm5hbWUsU0xfUEFSQV07CisKKyAgICAvLyBOb2NoIHp1IGJlYXJiZWl0ZW5kZSBSYWV1bWUKKyAgICBzdHJpbmcqIHRvX2RvPXNlYXJjaGxpc3RbZm5hbWUsU0xfVE9ET107CisKKyAgICBEQkcoIl9zZWFyY2goKSBzdGFydC4iKTsKKworICAgIHdoaWxlICgoZ2V0X2V2YWxfY29zdCgpPjkwMDAwMCkgJiYgZnJvbSAmJiAoZnJvbSAhPSB0bykpCisgICAgeworICAgICAgICAvLyBGdWVnZSBkZW4gYWt0dWVsbGVuIFJhdW0gKGZyb20pIGFscyBXZWcgaGluenUKKyAgICAgICAgREJHKHNwcmludGYoIkZ1ZWdlIGhpbnp1OiAlcyIsZnJvbSkpOworICAgICAgICByb29tc19zZWFyY2hlZCs9KHtmcm9tfSk7CisgICAgICAgIC8vIEF1cyBkZW4gUmFldW1lbiBkcnVtcnVtIHdlcmRlbiBkaWUgQXVzZ2FlbmdlIGdlc3VjaHQKKyAgICAgICAgLy8gdW5kIHp1ciBXZWdsaXN0ZSBoaW56dWdlZnVlZ3QuCisKKyAgICAgICAgLy8gUGZhZGUgdm9uIDxmcm9tPiB3ZWcgYXVzIGRlciBMaXN0ZSBob2xlbgorICAgICAgICBtaXhlZCogcGF0aHM9cGF0aG1hcFtfZ2V0X3ByZWZpeChmcm9tKV1bZnJvbV07CisKKyAgICAgICAgLy8gTGlzdGUgZGVyIFZlcmJpbmR1bmdlbiB2b24gPGZyb20+IGR1cmNoZ2VoZW4KKyAgICAgICAgZm9yZWFjaCAobWl4ZWQgY29ubjpwYXRocykKKyAgICAgICAgeworICAgICAgICAgICAgaW50IG5ld2Nvc3Q7CisgICAgICAgICAgICAvLyB3ZW5uIGRlciBSYXVtIHNjaG9ubWFsIGdlc2VoZW4gd3VyZGUsIGlzdCBoaWVyIG5peCBtZWhyIG5vZXRpZy4KKyAgICAgICAgICAgIGlmIChtZW1iZXIocm9vbXNfc2VhcmNoZWQsY29ubltDT05OX0RFU1RdKT4tMSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBEQkcoc3ByaW50ZigiUmF1bSAlcyBoYWIgaWNoIHNjaG9uISIsY29ubltDT05OX0RFU1RdKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gVmVyYmluZHVuZyBqZSBuYWNoIEZsYWcgbmljaHQgbnV0emVuLiBBdXNzZXJkZW06CisgICAgICAgICAgICAgICAgLy8gd2VubiBkaWUgVmVyYmluZHVuZyBpbiBlaW5lIFBhcmF3ZWx0IGZ1ZWhydCwgYWJlciBrZWluCisgICAgICAgICAgICAgICAgLy8gU2VoZXJzdGF0dXMgZ2VnZWJlbiBpc3QsIGV4aXN0aWVydCBkaWUgVmVyYmluZHVuZyBuaWNodC4KKyAgICAgICAgICAgICAgICAvLyBXZWl0ZXJoaW4ga29tbXQgZWluZSBWZXJiaW5kdW5nIG5pY2h0IGluIEZyYWdlLCB3ZW5uIHNpZSBpbgorICAgICAgICAgICAgICAgIC8vIGVpbmUgYW5kZXJlIFBhcmF3ZWx0IGZ1ZWhydCwgd2VpbCBkZXIgV2VsdHVlYmVyZ2FuZyBudXIgYW4KKyAgICAgICAgICAgICAgICAvLyBiZXN0aW1tdGVuIE9ydGVuIG1vZWdsaWNoIGlzdC4gQXVzbmFobWUgZGF2b24gc2luZCBXZWNoc2VsCisgICAgICAgICAgICAgICAgLy8gendpc2NoZW4gTm9ybWFsd2VsdCB1bmQgUGFyYXdlbHQuCisgICAgICAgICAgICAgICAgaWYgKAorICAgICAgICAgICAgICAgICAgICAoY29ubltDT05OX0ZMQUdTXSAmIENGTEFHX0RPTlRVU0UpCisgICAgICAgICAgICAgICAgICAgIHx8IChjb25uW0NPTk5fRkxBR1NdICYgQ0ZMQUdfRFVQTElDQVRFKQorICAgICAgICAgICAgICAgICAgICB8fCAoIXNlZXIgJiYgY29ubltDT05OX1BBUkFdKQorICAgICAgICAgICAgICAgICAgICB8fCAoY29ubltDT05OX1BBUkFdICYmIGNvbm5bQ09OTl9QQVJBXSAhPSBwYXJhKQorICAgICAgICAgICAgICAgICAgICApCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIG5ld2Nvc3QgPSB0YXJnZXRzW2Zyb20sU0xUX0NPU1RTXTsgLy8ga29zdGVuIGJpcyBoaWVyaGVyCisgICAgICAgICAgICAgICAgLy8gKyBLb3N0ZW4gaW4gbmFlY2hzdGVuIFJhdW0uCisgICAgICAgICAgICAgICAgbmV3Y29zdCArPSBfY2FsY19jb3N0KGNvbm4sc2VlcixwYXJhKTsKKyAgICAgICAgICAgICAgICAvLyBlcyBrb2VubnRlIHNlaW4sIGRhc3MgZXMgVmVyYmluZHVuZ2VuIG1pdCBnbGVpY2hlbQorICAgICAgICAgICAgICAgIC8vIFN0YXJ0L1ppZWwgZ2lidCwgYWJlciB1bnRlcnNjaGllZGxpY2hlbiBLb3N0ZW4uIEluIGRpZXNlbQorICAgICAgICAgICAgICAgIC8vIEZhbGwgd3VlcmRlIGRhcyBaaWVsIGRlciBha3R1ZWxsZW4gVmVyYmluZHVuZyBtZWhyZmFjaAorICAgICAgICAgICAgICAgIC8vIGhpbnp1Z2VmdWVndCB1bmQgZGFzIGxldHp0ZSBnZXdpbm50LiBEYWhlciBzb2xsdGUgZGllc2UKKyAgICAgICAgICAgICAgICAvLyBWZXJiaW5kdW5nIG51ciBoaW56dWdlZnVlZ3Qgd2VyZGVuLCB3ZW5uIG5vY2gga2VpbmUKKyAgICAgICAgICAgICAgICAvLyBWZXJiaW5kdW5nIGluIGRlbiBaaWVscmF1bSBleGlzdGllcnQsIGRpZSBiaWxsaWdlciBpc3QuCisgICAgICAgICAgICAgICAgaWYgKG1lbWJlcih0YXJnZXRzLGNvbm5bQ09OTl9ERVNUXSkKKyAgICAgICAgICAgICAgICAgICAgJiYgbmV3Y29zdCA+PSB0YXJnZXRzW2Nvbm5bQ09OTl9ERVNUXSxTTFRfQ09TVFNdKQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAvLyBXZWcgYmlzIGhpZXJoZXIgcGx1cyBuYWVjaHN0ZW4gUmF1bQorICAgICAgICAgICAgICAgIHN0cmluZyogbmV3X3dheSA9IHRhcmdldHNbZnJvbSxTTFRfV0FZXTsKKyAgICAgICAgICAgICAgICBuZXdfd2F5ICs9ICh7Y29ubltDT05OX0RFU1RdfSk7CisgICAgICAgICAgICAgICAgLy8gS29tbWFuZG9zIGJpcyBoaWVyaGVyIHBsdXMgbmFlY2hzdGVzIEtvbW1hbmRvCisgICAgICAgICAgICAgICAgc3RyaW5nKiBuZXdfY29tbWFuZHMgPSB0YXJnZXRzW2Zyb20sU0xUX0NPTU1BTkRTXTsKKyAgICAgICAgICAgICAgICBuZXdfY29tbWFuZHMgKz0gKHtjb25uW0NPTk5fQ01EXX0pOworICAgICAgICAgICAgICAgIC8vIG5hZWNoc3RlbiBSYXVtIGluIFRvZG8gZnVlciBkaWUgUHJ1ZWZ1bmcgdW50ZW4gdmVybWVya2VuCisgICAgICAgICAgICAgICAgdG9fZG8gKz0gKHtjb25uW0NPTk5fREVTVF19KTsKKyAgICAgICAgICAgICAgICAvLyBVbmQgS29zdGVuL1dlZy9Lb21tYW5kb3MgYmlzIHp1bSBuYWVjaHN0ZW4gUmF1bSB1bnRlcgorICAgICAgICAgICAgICAgIC8vIHRhcmdldHMvS2FuZGlkYXRlbiBhYmxlZ2VuLgorICAgICAgICAgICAgICAgIHRhcmdldHMgKz0gKFtjb25uW0NPTk5fREVTVF06bmV3Y29zdDtuZXdfd2F5O25ld19jb21tYW5kc10pOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8vIE5hY2hkZW0gZGllIFJhZXVtZSBhbGxlIHp1IGRlbiBLYW5kaWRhdGVuIGFuIG1vZWdsaWNoZW4gV2VnZW4KKyAgICAgICAgLy8gaGluenVnZWZ1ZWd0IHd1cmRlbiwgd2lyZCBudW4gZGVyIG5ldWVzdGUga3Vlcnplc3RlIFdlZyBnZXN1Y2h0LgorICAgICAgICAvLyBOYXR1ZXJsaWNoIG51ciBhdXMgZGVuZW4sIGRpZSBzY2hvbiBkYSBzaW5kLgorICAgICAgICBpZiAoc2l6ZW9mKHRvX2RvKT4wKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBLb3N0ZW4gZGVzIGVyc3RlbiB0b2RvIGFscyBTdGFydHdlcnQgbmVobWVuCisgICAgICAgICAgICBzdHJpbmcgbWlucmF1bTsKKyAgICAgICAgICAgIGludCBtaW5jb3N0cz1fX0lOVF9NQVhfXzsKKyAgICAgICAgICAgIC8vIHVuZCB1ZWJlciBhbGxlIHRvZG9zIGxhdWZlbiB1bSBkYXMgTWluaW11bSB6dSBmaW5kZW4uCisgICAgICAgICAgICBmb3JlYWNoKHN0cmluZyByYXVtOiB0b19kbykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAobWluY29zdHM+dGFyZ2V0c1tyYXVtLFNMVF9DT1NUU10pCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBtaW5yYXVtID0gcmF1bTsKKyAgICAgICAgICAgICAgICAgICAgbWluY29zdHM9dGFyZ2V0c1tyYXVtLFNMVF9DT1NUU107CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgREJHKHNwcmludGYoIk5ldWVyIGt1ZXJ6ZXN0ZXIgUmF1bTogJXMiLG1pbnJhdW0pKTsKKworICAgICAgICAgICAgLy8gZGVyIGJpbGxpZ3N0IHp1IGVycmVpY2hlbmRlIFJhdW0gd2lyZCBkYXMgbmV1ZSA8ZnJvbT4gZnVlciBkZW4KKyAgICAgICAgICAgIC8vIG5hZWNoc3RlbiBEdXJjaGxhdWYKKyAgICAgICAgICAgIGZyb209bWlucmF1bTsKKyAgICAgICAgICAgIC8vIHVuZCBuYXR1ZXJsaWNoIGF1cyBkZW0gdG9fZG8gd2VyZmVuLgorICAgICAgICAgICAgdG9fZG8tPSh7bWlucmF1bX0pOworICAgICAgICAgICAgREJHKHNwcmludGYoIkFuemFobCB1bnRlcnN1Y2h0ZXIgUmFldW1lOiAlZCwgVG9kbzogJWQsICIKKyAgICAgICAgICAgICAgICAgICJLYW5kaWRhdGVuOiAlZCIsCisgICAgICAgICAgICAgICAgICBzaXplb2Yocm9vbXNfc2VhcmNoZWQpLHNpemVvZih0b19kbyksc2l6ZW9mKHRhcmdldHMpKSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBmcm9tPTA7CisgICAgICAgIH0KKyAgICB9IC8vIHdoaWxlIGVuZGUKKworICAgIGlmICghZnJvbSkKKyAgICB7CisgICAgICAgIC8vIEhtcGYuLi4KKyAgICAgICAgVEVMTF9VU0VSKCJLZWluIFdlZyBnZWZ1bmRlbiEiKTsKKyAgICAgICAgaWYgKHNlYXJjaGxpc3RbZm5hbWUsIFNMX0NBTExCQUNLXSkKKyAgICAgICAgICAgIGZ1bmNhbGwoc2VhcmNobGlzdFtmbmFtZSxTTF9DQUxMQkFDS10sCisgICAgICAgICAgICAgICAgICAgIHNlYXJjaGxpc3RbZm5hbWUsU0xfU1RBUlRdLCB0bywgcGFyYSwKKyAgICAgICAgICAgICAgICAgICAgMCwwLDApOworICAgICAgICBtX2RlbGV0ZSggc2VhcmNobGlzdCwgZm5hbWUgKTsgIC8vIHN1Y2hhdWZ0cmFnIGVudHNvcmdlbgorICAgICAgICByZXR1cm47CisgICAgfQorICAgIGVsc2UgaWYgKGZyb209PXRvKQorICAgIHsKKyAgICAgICAgLy8gSlVDSFUhCisgICAgICAgIFRFTExfVVNFUihzcHJpbnRmKCJXZWcgZ2VmdW5kZW4hICVPLCVPLCVPIiwKKyAgICAgICAgICAgICAgdGFyZ2V0c1t0byxTTFRfQ09TVFNdLHRhcmdldHNbdG8sU0xUX1dBWV0sCisgICAgICAgICAgICAgIHRhcmdldHNbdG8sU0xUX0NPTU1BTkRTXSkpOworICAgICAgICBhZGRfdG9fY2FjaGUoc2VhcmNobGlzdFtmbmFtZSxTTF9TVEFSVF0sIHRvLCBwYXJhLAorICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0c1t0byxTTFRfQ09TVFNdLHRhcmdldHNbdG8sU0xUX1dBWV0sCisgICAgICAgICAgICAgICAgICAgICB0YXJnZXRzW3RvLFNMVF9DT01NQU5EU10pOworICAgICAgICBpZiAoc2VhcmNobGlzdFtmbmFtZSwgU0xfQ0FMTEJBQ0tdKQorICAgICAgICAgICAgZnVuY2FsbChzZWFyY2hsaXN0W2ZuYW1lLFNMX0NBTExCQUNLXSwKKyAgICAgICAgICAgICAgICAgICAgc2VhcmNobGlzdFtmbmFtZSxTTF9TVEFSVF0sIHRvLCBwYXJhLAorICAgICAgICAgICAgICAgICAgICB0YXJnZXRzW3RvLFNMVF9DT1NUU10sdGFyZ2V0c1t0byxTTFRfV0FZXSwKKyAgICAgICAgICAgICAgICAgICAgdGFyZ2V0c1t0byxTTFRfQ09NTUFORFNdKTsKKyAgICAgICAgbV9kZWxldGUoIHNlYXJjaGxpc3QsIGZuYW1lICk7ICAvLyBzdWNoYXVmdHJhZyBlbnRzb3JnZW4KKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vIFdlbm4gZGFzIGFsbGVzIG5pY2h0IHdhciwgd2FyZW4gZXMgZGllIEV2YWwtVGlja3MuIE1pc3QuIFNwYWV0ZXIKKyAgICAvLyB3ZWl0ZXJzdWNoZW4uLi4KKyAgICBzZWFyY2hsaXN0W2ZuYW1lLFNMX1ZJU0lURURdPXJvb21zX3NlYXJjaGVkOworICAgIHNlYXJjaGxpc3RbZm5hbWUsU0xfQ0FORElEQVRFU109dGFyZ2V0czsKKyAgICBzZWFyY2hsaXN0W2ZuYW1lLFNMX1RPRE9dPXRvX2RvOworICAgIGNhbGxfb3V0KCJfc2VhcmNoIiwyLGZuYW1lLGZyb20pOworfQorCisKKy8vIERpZSBEYXRlbiB1ZWJlciBSYWV1bWUgd2VyZGVuIHF1YXNpIGdlaGFzaHQgYWJnZXNwZWljaGVydCwgZGFtaXQgd2lyIG5pY2h0CisvLyBzbyBzY2huZWxsIGFuIGRpZSBCZWdyZW56dW5nIGJlaSBBcnJheXMgdW5kIE1hcHBpbmdzIHN0b3NzZW4uCisvLyBEYWJlaSBpc3QgZGVyICdIYXNoJyBkZXIgQW5mYW5nIGRlcyBQZmFkZXMuCitwcml2YXRlIHN0cmluZyBfZ2V0X3ByZWZpeCggc3RyaW5nIHBhdGggKQoreworICAgIHN0cmluZyAqdG1wOworCisgICAgdG1wID0gZXhwbG9kZSggcGF0aCwgIi8iICk7CisKKyAgICAvLyBCZWkgUmFldW1lbiB1bnRlcmhhbGIgdm9uIC9kLyogd2lyZCAvZC9yZWdpb24vbWFnaWVybmFtZSBiZW51dHp0CisgICAgaWYgKCBzdHJzdHIocGF0aCwgIi9kLyIpID09IDApCisgICAgICAgIHJldHVybiBpbXBsb2RlKCB0bXBbMC4uM10sICIvIiApOworICAgIC8vIEFuc29uc3RlbiBkaWUgZXJzdGVuIGJlaWRlbiBUZWlscGZhZGUsIGZhbGxzIHNvdmllbGUgdm9yaGFuZGVuIHNpbmQKKyAgICBlbHNlIGlmICggc2l6ZW9mKHRtcCkgPCA0ICkKKyAgICAgICAgcmV0dXJuIGltcGxvZGUoIHRtcFswLi4xXSwgIi8iICk7CisgICAgZWxzZQorICAgICAgICByZXR1cm4gaW1wbG9kZSggdG1wWzAuLjJdLCAiLyIgKTsKK30KKworLy8gUmVzZXQgdW5kIERhdGVuaGFsdHVuZworLy8gcmVzZXQgd2lyZCBhbGxlIDNoIGdlcnVmZW4sIHVtIGRhcyBTYXZlZmlsZSBpbW1lciBtYWwgd2llZGVyIHp1IHNwZWljaGVybi4KKy8vIERhdGVuYXVmcmFldW1lbiBhYmVyIG51ciBlaW5tYWwgcHJvIFRhZy4KK3B1YmxpYyB2b2lkIHJlc2V0KCkKK3sKKyAgICBpZiAoIHRpbWVfdG9fY2xlYW5fdXAgPD0gdGltZSgpICkKKyAgICB7CisgICAgICAgIC8vIEVpbm1hbCBwcm8gVGFnIFJlc2V0IHp1bSBBdWZyYWV1bWVuIGRlciBEYXRlbmJhbmsKKyAgICAgICAgcm0oRFVNUEZJTEUiLnJhZXVtZSIpOworICAgICAgICBybShEVU1QRklMRSIuY29ubnMiKTsKKyAgICAgICAgdGltZV90b19jbGVhbl91cCA9IHRpbWUoKSArIDg2NDAwOworICAgICAgICBleHBpcmVfcGF0aF9jYWNoZShtX2luZGljZXMocGF0aGNhY2hlKSk7CisgICAgICAgIGNhbGxfb3V0KCMnY2xlYW51cF9kYXRhLCAzMCwKKyAgICAgICAgICAgICAgICAgIHNvcnRfYXJyYXkobV9pbmRpY2VzKHBhdGhtYXApLCAjJzwvKicqLyksIDAgKTsKKworICAgIH0KKyAgICBzYXZlX29iamVjdChTQVZFRklMRSk7CisgICAgc2V0X25leHRfcmVzZXQoMTA4MDApOworfQorCitwcm90ZWN0ZWQgdm9pZCBleHBpcmVfcGF0aF9jYWNoZShzdHJpbmcgKnN0YXJ0cm9vbXMpIHsKKyAgICBmb3JlYWNoKHN0cmluZyBzdGFydCA6IHN0YXJ0cm9vbXMpIHsKKyAgICAgICAgbWFwcGluZyB0YXJnZXRzID0gcGF0aGNhY2hlW3N0YXJ0XTsKKyAgICAgICAgZm9yZWFjaCAoc3RyaW5nIHRhcmdldCwgbWFwcGluZyBwYXRoczogdGFyZ2V0cykgeworICAgICAgICAgICAgZm9yZWFjaChpbnQgcGFyYSwgc3RydWN0IHBhdGhfcyBwOiBwYXRocykgeworICAgICAgICAgICAgICAgIGlmIChwLT50dGwgPCB0aW1lKCkKKyAgICAgICAgICAgICAgICAgICAgfHwgIShwLT5mbGFncyAmIFBGTEFHX1BFUk1BTkVOVCkgKQorICAgICAgICAgICAgICAgICAgICBtX2RlbGV0ZShwYXRocyxwYXJhKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICghc2l6ZW9mKHBhdGhzKSkKKyAgICAgICAgICAgICAgICBtX2RlbGV0ZSh0YXJnZXRzLCB0YXJnZXQpOworICAgICAgICB9CisgICAgICAgIHN0YXJ0cm9vbXMtPSh7c3RhcnR9KTsKKyAgICAgICAgaWYgKCFzaXplb2YodGFyZ2V0cykpCisgICAgICAgICAgICBtX2RlbGV0ZShwYXRoY2FjaGUsIHN0YXJ0KTsKKyAgICAgICAgLy8gcmVjaHQgZ3Jvc3NlciBXZXJ0LCB3ZWlsIGltbWVyIGtvbXBsZXR0ZSBTdGFydHJhZXVtZSBpbiBlaW5lbQorICAgICAgICAvLyBlcmxlZGlndCB3ZXJkZW4uCisgICAgICAgIGlmIChnZXRfZXZhbF9jb3N0KCkgPCAxMDAwMDAwKQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGlmIChzaXplb2Yoc3RhcnRyb29tcykpCisgICAgICAgIGNhbGxfb3V0KCMnZXhwaXJlX3BhdGhfY2FjaGUsIDQsIHN0YXJ0cm9vbXMpOworfQorCisvLyBEYXRlbmJhbmsgYXVmcmFldW1lbgorcHJvdGVjdGVkIHZvaWQgY2xlYW51cF9kYXRhKCBzdHJpbmcgKm5hbWVzLCBpbnQgaWR4ICkKK3sKKyAgICBpbnQgc2l6ZSwgaSwgaiwgazsKKyAgICBzdHJpbmcgKnJvb21zOworICAgIG1peGVkICpwYXRoczsKKworICAgIHNpemUgPSBzaXplb2YobmFtZXMpOworCisgICAgLy8gRWluIGJpc3NlcmwgbWl0bG9nZ2VuLCBkYW1pdCB3aXIgU2Nod2FjaHN0ZWxsZW4gaW0gU3lzdGVtIGF1Y2ggZmluZGVuLgorICAgIGlmICggIWlkeCApeworICAgICAgICBMT0coIHNwcmludGYoIj09PSAlczogU3RhcnRlIGNsZWFudXBfZGF0YSgpOiAlTyBHZWJpZXRlLCAlTyBSYWV1bWUgIgorICAgICAgICAgICAgICAgICAgICAgKyAiLi4uXG4iLCBzdHJmdGltZSgiJXklbSVkLSVIJU0lUyIpLCBzaXplLAorICAgICAgICAgICAgICAgICAgICAgc2hvd19zdGF0aXN0aWMoMSwgMSkgKSApOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgTE9HKCBzcHJpbnRmKCIlczogU2V0emUgY2xlYW51cF9kYXRhKCkgZm9ydC5cbiIsCisgICAgICAgICAgICAgIHN0cmZ0aW1lKCIleSVtJWQtJUglTSVTIikgKSApOworICAgIH0KKworICAgIC8vIEJyYXYgZ2VzcGxpdHRldCwgZGFtaXQgZXMga2VpbiBMYWcgZ2lidC4KKyAgICAvLyBEaWUgR3JlbnplIGlzdCByZWNodCBob2NoIGFuZ2VzZXR6dCwgZGEgaW1tZXIgZ2xlaWNoIGtvbXBsZXR0ZQorICAgIC8vIFRlaWxiYWV1bWUgYXVmZ2VyYWV1bXQgd2VyZGVuLgorICAgIHdoaWxlICggZ2V0X2V2YWxfY29zdCgpID4gMTEwMDAwMCAmJiBpZHggPCBzaXplICl7CisgICAgICAgIHJvb21zID0gc29ydF9hcnJheSggbV9pbmRpY2VzKHBhdGhtYXBbbmFtZXNbaWR4XV0pLCAjJzwvKicqLyApOworCisgICAgICAgIGZvciAoIGkgPSBzaXplb2Yocm9vbXMpOyBpLS07ICl7CisgICAgICAgICAgICBwYXRocyA9IHBhdGhtYXBbbmFtZXNbaWR4XV1bcm9vbXNbaV1dOworICAgICAgICAgICAgaW50IGNvbm5fY291bnQgPSBzaXplb2YocGF0aHMpOworICAgICAgICAgICAgbWFwcGluZyBjbWRzPW1fYWxsb2NhdGUoc2l6ZW9mKHBhdGhzKSk7CisKKyAgICAgICAgICAgIGZvciAoIGogPSBjb25uX2NvdW50OyBqLS07ICkgeworICAgICAgICAgICAgICAgIG1peGVkIGNvbm4gPSBwYXRoc1tqXTsKKyAgICAgICAgICAgICAgICBmb3IgKCBrID0gMDsgayA8IDI7IGsrKyApIHsgLy8gU3BpZWxlci9TZWhlcmVpbnRyYWVnZQorICAgICAgICAgICAgICAgICAgICAvLyBEaWVzZSBWZXJiaW5kdW5nIGhhdCBub2NoIGtlaW5lciBnZW51dHp0IGJpc2hlcgorICAgICAgICAgICAgICAgICAgICBpZiAoICFjb25uW0NPTk5fVElNRVNdW2tdICkKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICAvLyBXZW5uIFZlcmJpbmR1bmcgcGVybWFuZW50LCB1ZWJlcnNwcmluZ2VuCisgICAgICAgICAgICAgICAgICAgIGlmIChjb25uW0NPTk5fRkxBR1NdICYgQ0ZMQUdfUEVSTUFORU5UKQorICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBjb25uW0NPTk5fVVNFUlNdW2tdID09IC0xIC8vICdiZWthbm50ZXMnIEdlYmlldAorICAgICAgICAgICAgICAgICAgICAgICAgICYmIHRpbWUoKSAtIGNvbm5bQ09OTl9USU1FU11ba10gPiBUSU1FT1VUX09MRCApeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gTE9HKCBzcHJpbnRmKCIqKiogTG9lc2NoZSBhbHRlICIKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAgICsgKGsgPyAiU2VoZXIiIDogIlNwaWVsZXIiKQorICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgICAgICAgKyAiLVZlcmJpbmR1bmcgJU8uXG4iLCBwYXRoc1tqXSkgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbm5bQ09OTl9VU0VSU11ba10gPSAoe30pOworICAgICAgICAgICAgICAgICAgICAgICAgY29ubltDT05OX1RJTUVTXVtrXSA9IDA7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIGNvbm5bQ09OTl9VU0VSU11ba10gIT0gLTEgLy8gJ25ldWVzJyBHZWJpZXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIHRpbWUoKSAtIGNvbm5bQ09OTl9USU1FU11ba10gPiBUSU1FT1VUX05FVyApeworICAgICAgICAgICAgICAgICAgICAgICAgY29ubltDT05OX1VTRVJTXVtrXSA9ICh7fSk7CisgICAgICAgICAgICAgICAgICAgICAgICBjb25uW0NPTk5fVElNRVNdW2tdID0gMDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vIFdlbm4gZWluZSBWZXJiaW5kdW5nIHdlZGVyIHZvbiBTcGllbGVybiBub2NoIHZvbiBTZWhlcm4KKyAgICAgICAgICAgICAgICAvLyBiZW51dHp0IHd1cmRlIGluIGxldHp0ZXIgWmVpdCB1bmQgc2llIGtlaW5lIHBlcm1hbmVudGVkCisgICAgICAgICAgICAgICAgLy8gaXN0LCBWZXJiaW5kdW5nIGdhbnogbG9lc2NoZW4uCisgICAgICAgICAgICAgICAgaWYgKCEoY29ubltDT05OX0ZMQUdTXSAmIENGTEFHX1BFUk1BTkVOVCkKKyAgICAgICAgICAgICAgICAgICAgJiYgIWNvbm5bQ09OTl9USU1FU11bQ09OTl9UX1BMQVlFUlNdCisgICAgICAgICAgICAgICAgICAgICYmICFjb25uW0NPTk5fVElNRVNdW0NPTk5fVF9TRUVSU10gKSB7CisgICAgICAgICAgICAgICAgICAgIHBhdGhzW2ouLmpdID0gKHt9KTsgLy8gY29ubiByYXVzd2VyZmVuCisgICAgICAgICAgICAgICAgICAgIGNvbm5fY291bnQtLTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIC8vIENvbm5lY3Rpb25zIG5hY2ggS29tbWFuZG9zIHNwZWljaGVybi4KKyAgICAgICAgICAgICAgICAgICAgaWYgKG1lbWJlcihjbWRzLCBjb25uW0NPTk5fQ01EXSkpCisgICAgICAgICAgICAgICAgICAgICAgICBjbWRzW2Nvbm5bQ09OTl9DTURdXSArPSAoe2Nvbm59KTsKKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgY21kc1tjb25uW0NPTk5fQ01EXV0gPSAoe2Nvbm59KTsKKyAgICAgICAgICAgICAgICAgICAgLy8gdW5kIGRhcyBkdXBsaWNhdGUgZmxhZyBsb2VzY2hlbiwgZGFzIHdpcmQgc3BhZXRlciBuZXUKKyAgICAgICAgICAgICAgICAgICAgLy8gZ2VzZXR6dCwgd2VubiBub2V0aWcuCisgICAgICAgICAgICAgICAgICAgIC8vIChUaGVyZSBpcyBubyBjaGFuY2UgdGhhdCBhIGNvbmN1cnJlbnQgc2VhcmNoIHdpbGwgY2hlY2sKKyAgICAgICAgICAgICAgICAgICAgLy8gdGhlc2UgY29ubmVjdGlvbnMgdW50aWwgdGhleSBhcmUgbWFya2VkIGFnYWluLikKKyAgICAgICAgICAgICAgICAgICAgY29ubltDT05OX0ZMQUdTXSAmPSB+Q0ZMQUdfRFVQTElDQVRFOworICAgICAgICAgICAgICAgICAgICAvLyBDb25uZWN0aW9ucyBkdW1wZW4KKyAgICAgICAgICAgICAgICAgICAgaWYgKCEoY29ubltDT05OX0ZMQUdTXSAmIENGTEFHX0RVUExJQ0FURSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICBtaXhlZCB1PSh7Y29ubltDT05OX1VTRVJTXVtDT05OX1VfUExBWUVSU10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25uW0NPTk5fVVNFUlNdW0NPTk5fVV9TRUVSU10gfSk7CisgICAgICAgICAgICAgICAgICAgICAgd3JpdGVfZmlsZShEVU1QRklMRSIuY29ubnMiLHNwcmludGYoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiJXN8JXN8JXN8JWR8JWR8JWR8JWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICByb29tc1tpXSxjb25uW0NPTk5fREVTVF0sY29ubltDT05OX0NNRF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25uW0NPTk5fRVhJVFRZUEVdLGNvbm5bQ09OTl9QQVJBXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICh1WzBdPT0tMSA/IDAgOiBORUVERUQtc2l6ZW9mKHVbMF0pKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICh1WzBdPT0tMSA/IDAgOiBORUVERUQtc2l6ZW9mKHVbMF0pKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIEVpbiBSYXVtIG9obmUgVmVyYmluZHVuZ2VuIGZyaXNzdCBudXIgUGxhdHogaW4gZGVyIERhdGVuYmFuaworICAgICAgICAgICAgaWYgKCAhY29ubl9jb3VudCApeworICAgICAgICAgICAgICAgIC8vIExPRyggc3ByaW50ZigiKioqIExvZXNjaGUga29tcGxldHRlbiBSYXVtICVPXG4iLCByb29tc1tpXSkgKTsKKyAgICAgICAgICAgICAgICBtX2RlbGV0ZSggcGF0aG1hcFtuYW1lc1tpZHhdXSwgcm9vbXNbaV0gKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIC8vIHdlbm4gS29tbWFuZG9zIG5pY2h0IGVpbmRldXRpZyBzaW5kLCBkYW5uIHdlcmRlbiBkaWUKKyAgICAgICAgICAgICAgICAvLyBlbnRzcHJlY2hlbmRlbiBWZXJiaW5kdW5nZW4gZ2VrZW5uemVpY2huZXQuIEFsbGUgaW4gRnJhZ2UKKyAgICAgICAgICAgICAgICAvLyBrb21tZW5kZW4gVmVyYmluZHVuZ2VuIHNpbmQgamV3ZWlscyBzY2hvbiB6dXNhbW1lbnNvcnRpZXJ0LgorICAgICAgICAgICAgICAgIGZvcmVhY2goc3RyaW5nIGNtZCwgbWl4ZWQgY29ubnMgOiBjbWRzKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChzaXplb2YoY29ubnMpPjEpCisgICAgICAgICAgICAgICAgICAgICAgICBjaGVja19hbmRfbWFya19kdXBsaWNhdGVfY29ubnMoY29ubnMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAvLyBnZ2YuIGdlYWVuZGVydGVzIFZlcmJpbmR1bmdzYXJyYXkgd2llZGVyIGlucyBNYXBwaW5nCisgICAgICAgICAgICAgICAgLy8gc2NocmVpYmVuLgorICAgICAgICAgICAgICAgIHBhdGhtYXBbbmFtZXNbaWR4XV1bcm9vbXNbaV1dID0gcGF0aHM7CisgICAgICAgICAgICAgICAgLy8gUmF1bS9Ob2RlIGlucyBEdW1wIHNjaHJlaWJlbgorICAgICAgICAgICAgICAgIHdyaXRlX2ZpbGUoRFVNUEZJTEUiLnJhZXVtZSIsc3ByaW50ZigKKyAgICAgICAgICAgICAgICAgICAgICAiJXNcbiIscm9vbXNbaV0pKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZHgrKzsKKyAgICB9CisgICAgaWYgKCBpZHggPj0gc2l6ZSApIHsKKyAgICAgICAgTE9HKCBzcHJpbnRmKCI9PT0gJXM6IEJlZW5kZSBjbGVhbnVwX2RhdGEoKSEgVWVicmlnOiAlTyBSYWV1bWUuXG4iLAorICAgICAgICAgICAgICAgICAgICAgc3RyZnRpbWUoIiV5JW0lZC0lSCVNJVMiKSwgc2hvd19zdGF0aXN0aWMoMSwgMSkgKSApOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgY2FsbF9vdXQoICMnY2xlYW51cF9kYXRhLCAyLCBuYW1lcywgaWR4ICk7CisgICAgICAgIExPRyggc3ByaW50ZigiJXM6IFdBUlRFIDIwcyBiZWkgRXZhbGNvc3QgJU9cbiIsCisgICAgICAgICAgICAgICAgICAgICBzdHJmdGltZSgiJXklbSVkLSVIJU0lUyIpLCBnZXRfZXZhbF9jb3N0KCkpICk7CisgICAgfQorfQorCisvLyBCZWltIEVudGxhZGVuIHNwZWljaGVybgorcHVibGljIHZhcmFyZ3MgaW50IHJlbW92ZSggaW50IHNpbGVudCApCit7CisgICAgLy8gVm9yIGRlbSBFbnRmZXJuZW4gbm9jaCBzY2huZWxsIGRpZSBEYXRlbiBzaWNoZXJuCisgICAgc2F2ZV9vYmplY3QoU0FWRUZJTEUpOworICAgIGRlc3RydWN0KHRoaXNfb2JqZWN0KCkpOworCisgICAgcmV0dXJuIDE7Cit9CisKKworLy8gWnVtIERlYnVnZ2VuLiBOdXIgZvxyIFRpYW1hay4gQnp3LiBudW4gZnVlciBab29rLCBWYW5pb24sIFJ1bWF0YQorI2RlZmluZSBBTExPV0VEICh7Inpvb2siLCJ2YW5pb24iLCJydW1hdGEiLCJ6ZXNzdHJhIiwiaHVtbmkifSkKKyNkZWZpbmUgTUFUQ0goeCx5KSAoc2l6ZW9mKHJlZ2V4cCh4LHkpKSkKK3B1YmxpYyBtYXBwaW5nIGdldF9wYXRobWFwKCkKK3sKKyAgaWYgKCAhdGhpc19pbnRlcmFjdGl2ZSgpIHx8ICFNQVRDSChBTExPV0VELGdldHVpZCh0aGlzX2ludGVyYWN0aXZlKCkpKQorICAgICAgIHx8ICFwcmV2aW91c19vYmplY3QoKSB8fCAhTUFUQ0goQUxMT1dFRCxnZXR1aWQocHJldmlvdXNfb2JqZWN0KCkpKSkKKyAgICAgICAgcmV0dXJuIChbXSk7CisKKyAgICByZXR1cm4gcGF0aG1hcDsKK30KK3B1YmxpYyBtYXBwaW5nIGdldF9wYXRoY2FjaGUoKQoreworICBpZiAoICF0aGlzX2ludGVyYWN0aXZlKCkgfHwgIU1BVENIKEFMTE9XRUQsZ2V0dWlkKHRoaXNfaW50ZXJhY3RpdmUoKSkpCisgICAgICAgfHwgIXByZXZpb3VzX29iamVjdCgpIHx8ICFNQVRDSChBTExPV0VELGdldHVpZChwcmV2aW91c19vYmplY3QoKSkpKQorICAgICAgICByZXR1cm4gKFtdKTsKKworICAgIHJldHVybiBwYXRoY2FjaGU7Cit9CisKKyN1bmRlZiBBTExPV0VECisjdW5kZWYgTUFUQ0gK