Ly8gRGFlbW9uIHp1bSBhdXRvbWF0aXNpZXJ0ZW4gRXJzdGVsbGVuIHZvbiBLYXJ0ZW4uCi8vIFNvbGwgc3BhZXRlciBtYWwgd2ljaHRpZ2UgV2VnZSBiZXJlY2huZW4ga29lbm5lbiBmdWVyIEFuZmFlbmdlci4KLy8KLy8KLy8gV2VyIG1pciBvaG5lIHRyaWZ0aWdlbiBHcnVuZCBkYXJhbiBoZXJ1bXBmdXNjaHQsIGRlciB3aXJkIHN0YW5kZXNyZWNodGxpY2gKLy8gbWl0IGZhdWxlbiBFaWVybiBiZXdvcmZlbi4gXTotPgovLwovLyBUaWFtYWsKCiNwcmFnbWEgc3Ryb25nX3R5cGVzLHNhdmVfdHlwZXMscnR0X2NoZWNrcwojcHJhZ21hIG5vX2Nsb25lLG5vX2luaGVyaXQsbm9fc2hhZG93CiNwcmFnbWEgcGVkYW50aWMscmFuZ2VfY2hlY2ssd2Fybl9kZXByZWNhdGVkCiNwcmFnbWEgd2Fybl9lbXB0eV9jYXN0cyx3YXJuX21pc3NpbmdfcmV0dXJuLHdhcm5fZnVuY3Rpb25faW5jb25zaXN0ZW50CgojaW5jbHVkZSA8c3RyaW5ncy5oPgojaW5jbHVkZSA8d2l6bGV2ZWxzLmg+CiNpbmNsdWRlIDxwbGF5ZXIuaD4KI2luY2x1ZGUgPHByb3BlcnRpZXMuaD4KI2luY2x1ZGUgPHJvb21zLmg+CiNpbmNsdWRlIDxtb3ZpbmcuaD4KCiNkZWZpbmUgTE9HTkFNRSAiUEFUSEQiCiNkZWZpbmUgU0FWRUZJTEUgIi9wL2RhZW1vbi9zYXZlL3BhdGhkIgojZGVmaW5lIERVTVBGSUxFICIvcC9kYWVtb24vc2F2ZS9wYXRoZC1kdW1wIgovLyNkZWZpbmUgREVCVUcKCi8vIDEwIHZlcnNjaGllZGVuZSBMZXV0ZSB3ZXJkZW4gZ2VicmF1Y2h0LCB1bSBlaW5lIFZlcmJpbmR1bmcgenUgdmVyaWZpemllcmVuCiNkZWZpbmUgTkVFREVEIDEwCiNkZWZpbmUgVElNRU9VVF9ORVcgMTIwOTYwMCAgLy8gMTQgVGFnZQojZGVmaW5lIFRJTUVPVVRfT0xEIDc3NzYwMDAgLy8gOTAgVGFnZQoKLy8gQXJ0IGRlcyBBdXNnYW5ncwojZGVmaW5lIE5PUk1BTCAgMAojZGVmaW5lIFNQRUNJQUwgMQojZGVmaW5lIENPTU1BTkQgMgoKLy8gS29zdGVuIGZ1ZXIgdW50ZXJzY2hpZWRsaWNoZSBXZWdlCiNkZWZpbmUgQ09TVF9FWElUUyAoeyAxLCAxMCwgMTAwIH0pCiNkZWZpbmUgQ09TVF9NQU5ZICAgMwojZGVmaW5lIENPU1RfRkVXICAgIDUKI2RlZmluZSBDT1NUX09ORSAgIDEwCi8vIEtvc3RlbiBmdWVyIFdlbHRlbndlY2hzZWwgKFBhcmEgLT4gTm9ybWFsKQojZGVmaW5lIENPU1RfV09STERDSEFOR0UgMTAwCgojaWZkZWYgREVCVUcKI2RlZmluZSBEQkcoeCkgaWYgKCBmaW5kX3BsYXllcigiemVzc3RyYSIpICkgXAogICAgICAgICAgICAgICAgICAgdGVsbF9vYmplY3QoIGZpbmRfcGxheWVyKCJ6ZXNzdHJhIiksICh4KSsiXG4iICk7CiNkZWZpbmUgVEVMTF9VU0VSKHgpIGlmICggdGhpc19wbGF5ZXIoKSApIFwKICAgICAgICAgICAgICAgICAgIHRlbGxfb2JqZWN0KCB0aGlzX3BsYXllcigpLCAoeCkrIlxuIiApOwojZWxzZQojZGVmaW5lIERCRyh4KQojZGVmaW5lIFRFTExfVVNFUih4KQojZW5kaWYKCiNkZWZpbmUgTE9HKHgpIGxvZ19maWxlKCAiUEFUSEQiLCAoeCksIDEwMDAwMCApOwoKLy8gVmFyaWFibGVuCm5vc2F2ZSBpbnQgdGltZV90b19jbGVhbl91cDsgLy8gWmVpdCBmdWVyIG5hZWNoc3RlcyBDbGVhbnVwIGRlciBEYXRlbgoKbWFwcGluZyBwYXRobWFwOwovKiBQcmVmaXggOiAoWyA8c3VibWFwPiBdKSwKICAgPHN1Ym1hcD4gaXN0IGVpbiBNYXBwaW5nIHZvbiBSYWV1bWVuIG1pdCBlaW5lbSBBcnJheSB2b24gVmVyYmluZHVuZ2VuOgogICAoWzxyb29tPjogKHsgY29ubjEsIGNvbm4yLCBjb25uMywgLi4ufSksIC4uLl0pCiAgIEplZGUgVmVyYmluZHVuZyBpc3QgZWluIEFycmF5IG1pdCBmb2xnZW5kZW4gSW5kaXplczoKICAgKi8KI2RlZmluZSBDT05OX0RFU1QgICAgIDAgICAvLyBaaWVscmF1bQojZGVmaW5lIENPTk5fQ01EICAgICAgMSAgIC8vIEtvbW1hbmRvCiNkZWZpbmUgQ09OTl9VU0VSUyAgICAyICAgLy8gQmVudXR6ZXI6ICh7c3BpZWxlciwgc2VoZXJ9KQojZGVmaW5lIENPTk5fRVhJVFRZUEUgMyAgIC8vIEF1c2dhbmdzYXJ0IChzLm8uKQojZGVmaW5lIENPTk5fVElNRVMgICAgNCAgIC8vIFplaXQgbGV0enRlciBCZW51dHp1bmc6ICh7c3BpZWxlcixzZWhlcn0pCiNkZWZpbmUgQ09OTl9QQVJBICAgICA1ICAgLy8gUGFyYXdlbHQKI2RlZmluZSBDT05OX0ZMQUdTICAgIDYgICAvLyBGbGFncyBmdWVyIGRpZSBWZXJiaW5kdW5nICh6LkIuIHBlcm1hbmVudCkKLy8gSW5kaXplcyBpbiBDT05OX1VTRVJTLiBCZWlkZSBFaW50cmFlZ2Ugc2luZCBlbnR3ZWRlciBnZWhhc2h0ZSBVSURzIE9ERVIgLTEsCi8vIHdlbm4gZGllIFZlcmJpbmR1bmcgdm9uIG1laHIgYWxzIE5FRURFRCB1bnRlcnNjaGllZGxpY2hlbiBnZWdhbmdlbiB3dXJkZS4KI2RlZmluZSBDT05OX1VfUExBWUVSUyAwICAvLyBTcGllbGVyLVVJRHMKI2RlZmluZSBDT05OX1VfU0VFUlMgICAxICAvLyBTZWhlci1VSURTCi8vIEluZGl6ZXMgdm9uIENPTk5fVElNRVMuIFplaXRzdGVtcGVsIGRlciBsZXR6dGVuIEJlbnV0enVuZy4uLgojZGVmaW5lIENPTk5fVF9QTEFZRVJTIENPTk5fVV9QTEFZRVJTICAvLyAuLi4gZHVyY2ggU3BpZWxlcgojZGVmaW5lIENPTk5fVF9TRUVSUyAgIENPTk5fVV9TRUVSUyAgLy8gLi4uIGR1cmNoIFNlaGVyCgovLyBLb25zdGFudGVuIGZ1ZXIgQ09OTl9GTEFHUwojZGVmaW5lIENGTEFHX1BFUk1BTkVOVCAgIDB4MSAgLy8gVmVyYmluZHVuZyBuaWNodCBleHBpcmVuCiNkZWZpbmUgQ0ZMQUdfRE9OVFVTRSAgICAgMHgyICAvLyBWZXJiaW5kdW5nIG5pY2h0IGltIFJvdXRpbmcgbnV0emVuCiNkZWZpbmUgQ0ZMQUdfRFVQTElDQVRFICAgMHg0ICAvLyBLb21tYW5kbyBoYXQgbWVocmVyZSBWZXJiaW5kdW5nZW4KCi8vIGxhdWZlbmRlIFBmYWRzdWNoZW4Kbm9zYXZlIG1hcHBpbmcgc2VhcmNobGlzdCA9IChbXSk7Ci8qCiAgIChbIDx1dWlkPiA6IFNMX1ZJU0lURUQ7IFNMX0RFU1RJTkFUSU9OOy4uLiAuLi4gXSkKICovCi8vIEluZGl6ZXMgaW4gPGRhdGE+OgojZGVmaW5lIFNMX1NUQVJUICAgICAgIDAKI2RlZmluZSBTTF9ERVNUSU5BVElPTiAxICAvLyBaaWVscmF1bQojZGVmaW5lIFNMX1ZJU0lURUQgICAgIDIgIC8vIGFiZ2VsYXVmZW5lL2dlcHJ1ZWZ0ZSBSYWV1bWUKI2RlZmluZSBTTF9DQU5ESURBVEVTICAzICAvLyBtb2VnbGljaGUgWmllbGUKI2RlZmluZSBTTF9XSVpMRVZFTCAgICA0ICAvLyBXaXpsZXZlbAojZGVmaW5lIFNMX1BBUkEgICAgICAgIDUgIC8vIFBhcmF3ZWx0CiNkZWZpbmUgU0xfVE9ETyAgICAgICAgNiAgLy8gbm9jaCB6dSBwcnVlZmVuZGUgUmF1bWUgKFNMX0NBTkRJREFURVMtU0xfVklTSVRFRCkKI2RlZmluZSBTTF9DQUxMQkFDSyAgICA3ICAvLyBDbG9zdXJlIGZ1ZXIgQ2FsbGJhY2sgbmFjaCBSb3V0ZW5iZXJlY2hudW5nCi8vIFNMX0NBTkRJREFURVM6IChbPHJhdW0+OiAoe3ZlcmJpbmR1bmdzZGF0ZW59KSwgLi4uXSkKLy8gSW5kaXplcyBpbSBBcnJheSA8dmVyYmluZHVuZ3NkYXRlbj46CiNkZWZpbmUgU0xUX0NPU1RTICAgICAwICAgLy8gS29zdGVuIGZ1ZXIgVmVyYmluZHVuZyBiaXMgaGllcgojZGVmaW5lIFNMVF9XQVkgICAgICAgMSAgIC8vIGJpc2hlcmlnZXIgV2VnIHZvbiBTdGFydCBiaXMgaGllcgojZGVmaW5lIFNMVF9DT01NQU5EUyAgMiAgIC8vIEtvbW1hbmRvcyBmdWVyIFdlZyB2b24gU3RhcnQgYmlzIGhpZXIKCi8vIGNhY2hlIGZ1ZXIgYmVyZWNobmV0ZSBXZWdlCm5vc2F2ZSBtYXBwaW5nIHBhdGhjYWNoZSA9IChbXSk7Ci8vIEF1ZmJhdTogKFsgInN0YXJ0cmF1bSI6IDxkZXN0cz4sIC4uLl0pCi8vIDxkZXN0cz46IChbInppZWxyYXVtIjogPHdlZ2U+LCAuLi5dKQovLyA8d2VnZT46IChbcGFyYXdlbHQ6ICg8c3RydWN0IHBhdGhfcz4pIF0pCgpzdHJ1Y3QgcGF0aF9zIHsKICAgIGludCBjb3N0czsgICAgICAvLyBLb3N0ZW4gZGVzIGtvbXBsZXR0ZW4gUGZhZGVzCiAgICBzdHJpbmcgKnJvb21zOyAgLy8gTGlzdGUgdm9uIGR1cmNobGF1ZmVuZW4gUmFldW1lbgogICAgc3RyaW5nICpjbWRzOyAgIC8vIExpc3RlIHZvbiBLb21tYW5kb3MsIHVtIFJhZXVtZSB6dSBkdXJjaGxhdWZlbgogICAgaW50IHR0bDsgICAgICAgIC8vIHRpbWUtdG8tbGl2ZSwgQWJsYXVmemVpdCBkZXMgUGZhZHMgaW0gQ2FjaGUKICAgIGludCBwYXJhOyAgICAgICAvLyBQYXJhd2VsdAogICAgaW50IGZsYWdzOyAgICAgIC8vIEZsYWdzIHp1IGRlbSBQZmFkCn07Ci8vIEZsYWdzIGZ1ZXIgUGZhZGUgaW0gUGZhZGNhY2hlCiNkZWZpbmUgUEZMQUdfUEVSTUFORU5UIENGTEFHX1BFUk1BTkVOVAojZGVmaW5lIFBGTEFHX0RPTlRVU0UgQ0ZMQUdfRE9OVFVTRQoKCi8vIFByb3RvdHlwZXMKcHVibGljIHZvaWQgY3JlYXRlKCk7CnB1YmxpYyB2b2lkIGFkZF9wYXRocyggbWl4ZWQgY29ubmVjdGlvbnMgKTsKcHVibGljIHZhcmFyZ3Mgdm9pZCBzaG93X3BhdGhtYXAoIHN0cmluZyBwYXRoICk7CnB1YmxpYyB2YXJhcmdzIGludCBzaG93X3N0YXRpc3RpYyggaW50IHZlcmJvc2UsIGludCBzaWxlbnQgKTsKcHVibGljIGludCBjaGFuZ2VfcGF0aG1hcCggc3RyaW5nIHBmYWQsIG1peGVkICp2ZXJiaW5kdW5nZW4gKTsKcHVibGljIG1hcHBpbmcgZ2V0X3BhdGhtYXAoKTsKcHVibGljIHZvaWQgcmVzZXQoKTsKcHVibGljIHZhcmFyZ3MgaW50IHJlbW92ZSggaW50IHNpbGVudCApOwpwdWJsaWMgdmFyYXJncyBpbnQgcXVlcnlfcHJldmVudF9zaGFkb3coIG9iamVjdCBvYiApOwpzdGF0aWMgaW50IGluc2VydF9wYXRocyggbWl4ZWQgKnBhdGggKTsKc3RhdGljIG1peGVkICpmb3JtYXRfcGF0aHMoIG1peGVkIGJ1ZiApOwpzdGF0aWMgdm9pZCBfc2VhcmNoKCBzdHJpbmcgZm5hbWUsIHN0cmluZyBzdGFydCApOwpwcml2YXRlIHN0cmluZyBfZ2V0X3ByZWZpeCggc3RyaW5nIHBhdGggKTsKcHJvdGVjdGVkIHZvaWQgY2xlYW51cF9kYXRhKCBzdHJpbmcgKm5hbWVzLCBpbnQgaWR4ICk7CnByb3RlY3RlZCB2b2lkIGV4cGlyZV9wYXRoX2NhY2hlKHN0cmluZyAqc3RhcnRyb29tcyk7CgoKcHVibGljIHZvaWQgY3JlYXRlKCkKewogICAgLy8gd2lyIG11ZXNzZW4gZGFzIFNhdmVmaWxlIHNjaHJlaWJlbiBkdWVyZmVuCiAgICBzZXRldWlkKGdldHVpZCgpKTsKCiAgICBpZiAoICFyZXN0b3JlX29iamVjdChTQVZFRklMRSkgKSB7CiAgICAgICAgcGF0aG1hcCA9IChbXSk7CiAgICB9Cn0KCgovLyBXaXJkIHZvbiBTcGllbGVybiBhdWZnZXJ1ZmVuIG1pdCBkZW4gV2VnZW4sIGRpZSBzaWUgZ2VsYXVmZW4gc2luZApwdWJsaWMgdm9pZCBhZGRfcGF0aHMoIG1peGVkIGNvbm5lY3Rpb25zICkKewogICAgbWl4ZWQgcGF0aHM7CgogICAgLy8ga2VpbmVuIEF1ZnJ1ZiBwZXIgSGFuZCBiaXR0ZQogICAgaWYgKCAhcHJldmlvdXNfb2JqZWN0KCkgfHwgIXRoaXNfcGxheWVyKCkKICAgICAgICAgfHwgdGhpc19pbnRlcmFjdGl2ZSgpICYmIGdldHVpZCh0aGlzX2ludGVyYWN0aXZlKCkpICE9ICJ6ZXNzdHJhIgogICAgICAgICB8fCBmaWxlX3NpemUoICIvc3RkL3NoZWxscyIgKwogICAgICAgICAgICAgICAgICAgICAgIGV4cGxvZGUoIG9iamVjdF9uYW1lKHByZXZpb3VzX29iamVjdCgpKSwgIjoiIClbMF0KICAgICAgICAgICAgICAgICAgICAgICArICIuYyIgKSA8IDEgKQogICAgICAgIHJldHVybjsKCiNpZiBfX0JPT1RfVElNRV9fIDwgMTM1NzA0MjA5MgogICAgLy8gYWx0ZSBTcGllbGVyb2JqZWt0ZSBsaWVmZXJuIG5vY2ggZWluIEFycmF5IHZvbiBTdHJpbmdzIHN0YXR0IGVpbmVzCiAgICAvLyBBcnJheXMgdm9uIEFycmF5cy4KICAgIGNvbm5lY3Rpb25zID0gbWFwKGNvbm5lY3Rpb25zLCBmdW5jdGlvbiBtaXhlZCAoc3RyaW5nIHBhdGgpCiAgICAgICAgewogICAgICAgICAgLy8gQWxsZSBEYXRlbiBrb21tZW4gYWxzIGVpbiBTdHJpbmcgbWl0ICcjJyBhbHMgVHJlbm5lciBhbi4KICAgICAgICAgIC8vIE11c3RlcjogU3RhcnRyYXVtI1ppZWxyYXVtI1ZlcmIjTWV0aG9kZSBkZXIgQmV3ZWd1bmcjUGFyYXdlbHQKICAgICAgICAgIG1peGVkIGJ1ZiA9IGV4cGxvZGUoIHBhdGgsICIjIiApOwogICAgICAgICAgLy8gRmFsbHMgaW0gVmVyYiBhdWNoICMgdm9ya2FtICh1bndhaHJzY2hlaW5saWNoLCBhYmVyIG1vZWdsaWNoKToKICAgICAgICAgIGJ1ZlsyLi48M10gPSAoeyBpbXBsb2RlKCBidWZbMi4uPDNdLCAiIyIgKSB9KTsKICAgICAgICAgIHJldHVybiBidWY7CiAgICAgICAgfSAKICAgICAgICApOwojZW5kaWYKCiAgICAvLyBEYXRlbiBhdWZiZXJlaXRlbgogICAgcGF0aHMgPSBtYXAoIGNvbm5lY3Rpb25zLCAjJ2Zvcm1hdF9wYXRocy8qJyovICkgLSAoezB9KTsKICAgIC8vIE5ldWUgUmFldW1lIGVpbnRyYWdlbgogICAgZmlsdGVyKCBwYXRocywgIydpbnNlcnRfcGF0aHMvKicqLyApOwp9CgpwdWJsaWMgbWl4ZWQgZ2V0X3BhdGhfZnJvbV9jYWNoZShzdHJpbmcgZnJvbSwgc3RyaW5nIHRvLCBpbnQgcGFyYSkgewogICAgLy8gd2VubiBpbSBDYWNoZSwgYXVzIGRlbSBDYWNoZSBsaWVmZXJuLgogICAgbWFwcGluZyB0YXJnZXRzID0gcGF0aGNhY2hlW2Zyb21dOwogICAgaWYgKHRhcmdldHMpIHsKICAgICAgICBtYXBwaW5nIHBhdGhzID0gdGFyZ2V0c1t0b107CiAgICAgICAgaWYgKHBhdGhzKSB7CiAgICAgICAgICAgIGlmIChtZW1iZXIocGF0aHMsIHBhcmEpKSB7CiAgICAgICAgICAgICAgICBzdHJ1Y3QgcGF0aF9zIHAgPSBwYXRoc1twYXJhXTsKICAgICAgICAgICAgICAgIGlmIChwLT50dGwgPiB0aW1lKCkpCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICh7IGZyb20sIHRvLCBwYXJhLCBwLT5jb3N0cywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3B5KHAtPnJvb21zKSwgY29weShwLT5jbWRzKSB9KTsKICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgIG1fZGVsZXRlKHBhdGhzLCBwYXJhKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIHJldHVybiAwOwp9CgovLyBTdWNoZnVua3Rpb24sIHVtIGRpZSBrdWVyemVzdGUgVmVyYmluZHVuZyB6d2lzY2hlbiB6d2VpIFJhZXVtZW4genUgZmluZGVuCnB1YmxpYyBpbnQgU2VhcmNoUGF0aCggc3RyaW5nIGZyb20sIHN0cmluZyB0bywgaW50IHBhcmEsCiAgICAgICAgICAgICAgICAgICAgICAgY2xvc3VyZSBjYWxsYmFjaykKewogICAgLy8gUHJvIFVJRCBkYXJmIGVzIG51ciBlaW5lbiBTdWNoYXVmdHJhZyBnZWJlbi4KICAgIHN0cmluZyB1aWQ9Z2V0dWlkKHByZXZpb3VzX29iamVjdCgpKTsKICAgIGlmICggbWVtYmVyKHNlYXJjaGxpc3QsdWlkKSApCiAgICAgICAgcmV0dXJuIC0xOwogICAgLy8gdW5kIG1laHIgYWxzIDUgZ2xlaWNoemVpdGlnIGVyc3RtYWwgYXVjaCBuaWNodC4KICAgIGlmIChzaXplb2Yoc2VhcmNobGlzdCk+NCkKICAgICAgICByZXR1cm4gLTI7CgogICAgLy8gQW5mcmFnZSBsb2dnZW4KICAgIExPRyhzcHJpbnRmKCIlczogU3VjaGUgJXMgLT4gJXMgKCVkKSB2b24gJXMgKCVzLCAlcywgJXMpXG4iLAogICAgICAgICAgc3RyZnRpbWUoIiV5JW0lZC0lSCVNJVMiKSwgZnJvbSwgdG8sIHBhcmEsIHVpZCwKICAgICAgICAgIG9iamVjdF9uYW1lKHByZXZpb3VzX29iamVjdCgpKSwKICAgICAgICAgIG9iamVjdF9uYW1lKHRoaXNfcGxheWVyKCkpIHx8ICJOTy1QTCIsCiAgICAgICAgICBvYmplY3RfbmFtZSh0aGlzX2ludGVyYWN0aXZlKCkpIHx8ICJOTy1USSIpICk7CgogICAgLy8gd2VubiBTdGFydC0gb2RlciBaaWVscmF1bSBuaWNodCBiZWthbm50IHNpbmQsIGthbm4gZXMgYXVjaCBrZWluZSBSb3V0ZQogICAgLy8gZ2ViZW4uCiAgICBpZiAoIW1lbWJlcihwYXRobWFwW19nZXRfcHJlZml4KHRvKV0sdG8pCiAgICAgICAgfHwgIW1lbWJlcihwYXRobWFwW19nZXRfcHJlZml4KGZyb20pXSxmcm9tKSApCiAgICAgICAgcmV0dXJuIC0zOwoKICAgIG1peGVkIHBhdGggPSBnZXRfcGF0aF9mcm9tX2NhY2hlKGZyb20sIHRvLCBwYXJhKTsKICAgIGlmIChwYXRoKSB7CiAgICAgICAgaWYgKGNhbGxiYWNrKQogICAgICAgICAgICBhcHBseShjYWxsYmFjayxwYXRoKTsgCiAgICAgICAgcmV0dXJuIDI7CiAgICB9CgogICAgLy8gRGF0ZW5zdHJ1a3R1cmVya2xhZXJ1bmc6IHMuby4KICAgIG1hcHBpbmcgdGFyZ2V0cyA9IG1fYWxsb2NhdGUoMTIwMCwzKTsKICAgIG1fYWRkKHRhcmdldHMsZnJvbSwwLCh7fSksKHt9KSApOwogICAgc2VhcmNobGlzdCs9IChbIHVpZDogZnJvbTsgdG87ICh7fSk7CiAgICAgICAgICAgICAgICAgICAgIHRhcmdldHM7CiAgICAgICAgICAgICAgICAgICAgIChxdWVyeV93aXpfbGV2ZWwodGhpc19pbnRlcmFjdGl2ZSgpKT8xOjApOwogICAgICAgICAgICAgICAgICAgICBwYXJhOyAoe30pOyBjYWxsYmFja10pOwoKICAgIC8vIERpZSBlaWdlbnRsaWNoZSBTdWNoZSBzdGFydGVuCiAgICBfc2VhcmNoKCB1aWQsIGZyb20gKTsKCiAgICByZXR1cm4gMTsKfQoKLy8gR2VzcGVpY2hlcnRlIEluZm9ybWF0aW9uZW4genUgZWluZW0gUmF1bSBvZGVyIGVpbmVtIGtvbXBsZXR0ZW4gR2ViaWV0Ci8vIGFiZnJhZ2VuLiBHZWJpZXRlIGxhc3NlbiBzaWNoIGFiZXIgbnVyIGFscyAiT3JnYW5pc2F0aW9uc2VpbmhlaXRlbiIgYWJmcmFnZW4uCi8vIERhYmVpIHdlcmRlbiBHZWJpZXRlIHVudGVyaGFsYiB2b24gL2QvKiBhbHMgL2QvcmVnaW9uL21hZ2llcm5hbWUKLy8gYWJnZXNwZWljaGVydCB1bmQgZGVyIFJlc3QgdW50ZXIgZGVuIGVyc3RlbiBiZWlkZW4gVGVpbHBmYWRlbi4KcHVibGljIHZhcmFyZ3Mgdm9pZCBzaG93X3BhdGhtYXAoIHN0cmluZyBwYXRoICkKewogICAgc3RyaW5nIHByZTsKCiAgICBpZiAoIHBhdGggKQogICAgewogICAgICAgIHByZSA9IF9nZXRfcHJlZml4KHBhdGgpOwoKICAgICAgICBpZiAoIHByZSA9PSBwYXRoICkKICAgICAgICAgICAgLy8gR2FuemVuIFRlaWxiYXVtIGF1c2dlYmVuCiAgICAgICAgICAgIHByaW50ZiggIlBhdGhtYXBbJU9dOiAlT1xuIiwgcGF0aCwgcGF0aG1hcFtwYXRoXSApOwogICAgICAgIGVsc2UKICAgICAgICAgICAgLy8gTnVyIEluZm9zIHVlYmVyIGVpbmVuIFJhdW0gYXVzZ2ViZW4KICAgICAgICAgICAgcHJpbnRmKCAiUGF0aG1hcFslT106ICVPXG4iLCBwYXRoLAogICAgICAgICAgICAgICAgICAgIHBhdGhtYXBbcHJlXSA/IHBhdGhtYXBbcHJlXVtwYXRoXSA6IDAgKTsKICAgIH0KICAgIGVsc2UKICAgICAgICAvLyBPaG5lIEFyZ3VtZW50IHdpcmQgZGllIGdlc2FtdGUgTWFwIGF1c2dlZ2ViZW4uCiAgICAgICAgLy8gS2xhcHB0IGFiZXIgZWhlciBuaWNodCAobWVocikgd2VnZW4gQnVmZmVyIG92ZXJmbG93LiA7XikKICAgICAgICBwcmludGYoICJQYXRobWFwOiAlT1xuIiwgcGF0aG1hcCApOwp9CgoKLy8gU3RhdGlzdGljIHp1IGRlbiBnZXNwZWljaGVydGVuIERhdGVuIGFuemVpZ2VuLgovLyBNaXQgJ3ZlcmJvc2UnIHdpcmQgamVkZSBPcmdhbmlzYXRpb25zZWluaGVpdCBlaW56ZWxuIGF1ZmdlbGlzdGV0LCBvaG5lCi8vIHdpcmQgZ3JvYiBuYWNoIFJlZ2lvbmVuIHp1c2FtbWVuZ2VmYXNzdC4KcHVibGljIHZhcmFyZ3MgaW50IHNob3dfc3RhdGlzdGljKCBpbnQgdmVyYm9zZSwgaW50IHNpbGVudCApCnsKICAgIGludCBpLCBnZXM7CiAgICBzdHJpbmcgKmluZCwgbmFtZTsKICAgIG1hcHBpbmcgbTsKCiAgICBpZiAoIHZlcmJvc2UgKXsgLy8gU3R1ciBqZWRlbiBFaW50cmFnIGF1Zmxpc3RlbgogICAgICAgIGluZCA9IHNvcnRfYXJyYXkoIG1faW5kaWNlcyhwYXRobWFwKSwgIyc8LyonKi8gKTsKICAgICAgICBmb3IgKCBpID0gc2l6ZW9mKGluZCk7IGktLTsgKXsKICAgICAgICAgICAgaWYgKCAhc2lsZW50ICkKICAgICAgICAgICAgICAgIHByaW50ZiggIiUtMzBzOiAlNGRcbiIsIGluZFtpXSwgc2l6ZW9mKHBhdGhtYXBbaW5kW2ldXSkgKTsKICAgICAgICAgICAgZ2VzICs9IHNpemVvZihwYXRobWFwW2luZFtpXV0pOwogICAgICAgIH0KICAgIH0KICAgIGVsc2UgeyAgICAgICAgICAvLyBSZWdpb25lbiB6dXNhbW1lbmZhc3NlbgogICAgICAgIGluZCA9IG1faW5kaWNlcyhwYXRobWFwKTsKICAgICAgICBtID0gKFtdKTsKCiAgICAgICAgZm9yICggaSA9IHNpemVvZihpbmQpOyBpLS07ICl7CiAgICAgICAgICAgIGlmIChzdHJzdHIoaW5kW2ldLCIvZC8iKSA9PSAwKQogICAgICAgICAgICAgICAgLy8gL2QuLi4gamV3ZWlscyBuYWNoIHp3ZWkgVGVpbHBmYWRlbgogICAgICAgICAgICAgICAgbmFtZSA9IGltcGxvZGUoIGV4cGxvZGUoIGluZFtpXSwgIi8iIClbMC4uMl0sICIvIiApOwogICAgICAgICAgICBlbHNlIGlmICggc3Ryc3RyKGluZFtpXSwiL3BsYXllcnMiKSA9PSAwKQogICAgICAgICAgICAgICAgLy8gQWxsZSBQbGF5ZXJ2ZXJ6ZWljaG5pc3NlIHp1c2FtbWVuZmFzc2VuIC4uLgogICAgICAgICAgICAgICAgbmFtZSA9ICIvcGxheWVycyI7CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIC8vIC4uLiBkZW4gUmVzdCBuYWNoIGVpbmVtIFRlaWxwZmFkCiAgICAgICAgICAgICAgICBuYW1lID0gaW1wbG9kZSggZXhwbG9kZSggaW5kW2ldLCAiLyIgKVswLi4xXSwgIi8iICk7CgogICAgICAgICAgICBpZiAoICFtW25hbWVdICkKICAgICAgICAgICAgICAgIG1bbmFtZV0gPSBzaXplb2YoIHBhdGhtYXBbaW5kW2ldXSApOwogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICBtW25hbWVdICs9IHNpemVvZiggcGF0aG1hcFtpbmRbaV1dICk7CiAgICAgICAgfQoKICAgICAgICBpbmQgPSBzb3J0X2FycmF5KCBtX2luZGljZXMobSksICMnPC8qJyovICk7CiAgICAgICAgZm9yICggaSA9IHNpemVvZihpbmQpOyBpLS07ICl7CiAgICAgICAgICAgIGlmICggIXNpbGVudCApCiAgICAgICAgICAgICAgICBwcmludGYoICIlLTMwczogJTRkXG4iLCBpbmRbaV0sIG1baW5kW2ldXSApOwogICAgICAgICAgICBnZXMgKz0gbVtpbmRbaV1dOwogICAgICAgIH0KICAgIH0KCiAgICBpZiAoICFzaWxlbnQgKQogICAgICAgIHByaW50ZiggIlxuR2VzYW10OiAlZCBSYWV1bWUuXG4iLCBnZXMgKTsKCiAgICByZXR1cm4gZ2VzOwp9CgoKLy8gTWFuaXB1bGllcmVuIGRlciBpbnRlcm5lbiBQYXRobWFwLiBOdXIgenVtIERlYnVnZ2VuIHVuZCBzb21pdAovLyBudXIgZnVlciBaZXNzdHJhIGVybGF1YnQuIFNvbnN0IHZlcmh1bnp0IG1pciBub2NoIHdlciBtZWluZSBEYXRlbi4gO14pCnB1YmxpYyBpbnQgY2hhbmdlX3BhdGhtYXAoIHN0cmluZyBwZmFkLCBtaXhlZCAqdmVyYmluZHVuZ2VuICkKewogICAgaWYgKCAhdGhpc19pbnRlcmFjdGl2ZSgpIHx8IGdldHVpZCh0aGlzX2ludGVyYWN0aXZlKCkpICE9ICJ6ZXNzdHJhIgogICAgICAgICB8fCAhcHJldmlvdXNfb2JqZWN0KCkgfHwgZ2V0dWlkKHByZXZpb3VzX29iamVjdCgpKSAhPSAiemVzc3RyYSIgKQogICAgICAgIHJldHVybiAtMTsKCiAgICBpZiAoIG1hcHBpbmdwKHZlcmJpbmR1bmdlbikgKXsKICAgICAgICBpZiAoICFwYXRobWFwW19nZXRfcHJlZml4KHBmYWQpXSApCiAgICAgICAgICAgIHJldHVybiAwOwoKICAgICAgICBwYXRobWFwW19nZXRfcHJlZml4KHBmYWQpXSA9IHZlcmJpbmR1bmdlbjsKICAgIH0KICAgIGVsc2UgewogICAgICAgIGlmICggIXBhdGhtYXBbX2dldF9wcmVmaXgocGZhZCldW3BmYWRdICkKICAgICAgICAgICAgcmV0dXJuIDA7CgogICAgICAgIHBhdGhtYXBbX2dldF9wcmVmaXgocGZhZCldW3BmYWRdID0gdmVyYmluZHVuZ2VuOwogICAgfQoKICAgIHJldHVybiAxOwp9CgovLyBEaWUgRnVua3Rpb24gZ2lidCBhbGxlIGRlbSBwYXRoZCBiZWthbm50ZW4gUmFldW1lIGFscyBNYXBwaW5nIHZvbiBBcnJheXMKLy8genVydWVjay4gU2NobPxzc2VsIGRlcyBNYXBwaW5ncyBzaW5kIGRhYmVpIEdlYmlldGUuCnB1YmxpYyBtYXBwaW5nIGdldF9yb29tcygpCnsKICBzdHJpbmcgKnN1Ym1hcHM7CiAgbWFwcGluZyByb29tbWFwOwogIGludCBpOwoKICByb29tbWFwPShbXSk7CgogIHN1Ym1hcHM9bV9pbmRpY2VzKHBhdGhtYXApOwoKICBpPXNpemVvZihzdWJtYXBzKTsKCiAgd2hpbGUgKGktLSkKICAgIGlmIChzaXplb2YobV9pbmRpY2VzKHBhdGhtYXBbc3VibWFwc1tpXV0pKSkKICAgICAgICByb29tbWFwW3N1Ym1hcHNbaV1dPW1faW5kaWNlcyhwYXRobWFwW3N1Ym1hcHNbaV1dKTsKCiAgcmV0dXJuIHJvb21tYXA7Cn0KCi8vIERhdGVuIHp1IGVpbmVyIFZlcmJpbmR1bmcgc2FtbWVsbiB1bmQgYXVmYmVyZWl0ZW4Kc3RhdGljIG1peGVkICpmb3JtYXRfcGF0aHMoIG1peGVkIGJ1ZiApCnsKICAgIHN0cmluZyBjbWQsIHVpZDsKICAgIG9iamVjdCBvYjsKICAgIG1hcHBpbmcgZXhpdHM7CiAgICBpbnQgYXJ0OwoKICAgIC8vIE1hZ2llciB1bmQgVGVzdHNwaWVsZXIga29lbm5lbiBhdWNoIGluIG5pY2h0IGFuZ2VzY2hsb3NzZW5lIEdlYmlldGUKICAgIC8vIHVuZCB3ZXJkZW4gZGVzaGFsYiBuaWNodCBiZWFjaHRldC4KICAgIGlmICggSVNfTEVBUk5FUihwcmV2aW91c19vYmplY3QoMSkpIHx8CiAgICAgICAgIElTX0xFQVJORVIobG93ZXJfY2FzZSggcHJldmlvdXNfb2JqZWN0KDEpLT5RdWVyeShQX1RFU1RQTEFZRVIpfHwiIiApKSApCiAgICAgICAgcmV0dXJuIDA7CgogICAgY21kID0gdHJpbShidWZbMl0sVFJJTV9CT1RIKTsKI2lmIF9fQk9PVF9USU1FX18gPCAxMzU3MDQyMDkyCiAgICAvLyAiIDAiIGFtIEVuZGUgZGVzIEJlZmVobHMgYWJzY2huZWlkZW4uICpncnVtbWVsKgogICAgaWYgKGNtZFs8Mi4uXT09IiAwIikKICAgICAgY21kID0gY21kWy4uPDNdOwojZW5kaWYKCiAgICAvLyBXZW5uIGRlciBaaWVscmF1bSBhbHMgU3RyaW5nIGFuZ2VnZWJlbiB3dXJkZSwga2FubiBkZXIgZnVlaHJlbmRlCiAgICAvLyBTbGFzaCBmZWhsZW4hCiAgICBpZiAoIGJ1ZlsxXVswXSAhPSAnLycgKQogICAgICAgIGJ1ZlsxXSA9ICIvIiArIGJ1ZlsxXTsKCiAgICAvLyBadW0gQWJmcmFnZW4gZGVyIHp1c2FldHpsaWNoZW4gRGF0ZW4gYnJhdWNoZW4gd2lyIGRhcyBPYmpla3Qgc2VsYmVyCiAgICBjYXRjaChvYiA9IGxvYWRfb2JqZWN0KGJ1ZlswXSk7cHVibGlzaCk7CiAgICBpZiAoIW9iamVjdHAob2IpKQogICAgICAgIHJldHVybiAwOwoKICAgIC8vIEtsZWluZXIgSGFjayAtIGJlaSBUcmFuc3BvcnRlcm4gZXRjLiBpc3QgJ29iJyBkaWUgbmljaHQgaW5pdGlhbGlzaWVydGUKICAgIC8vIEJsdWVwcmludC4gSmVkZSBBYmZyYWdlIHZvbiBQX0VYSVRTIHd1ZXJkZSBuZXR0IGF1ZiAtRGVidWcgc2Nyb2xsZW4uCiAgICAvLyBEYSBQX0lEUyBpbSBjcmVhdGUoKSBhdWYgamVkZW4gRmFsbCBhdWYgZWluIEFycmF5IGdlc2V0enQgd2lyZCwKICAgIC8vIG1pc3NicmF1Y2hlIGljaCBkYXMgaGllciBhbHMgIklzdCBpbml0aWFsaXNpZXJ0Ii1GbGFnLgogICAgaWYgKCAhb2ItPlF1ZXJ5UHJvcChQX0lEUykgKQogICAgICAgIHJldHVybiAwOwoKICAgIC8vIEFydCBkZXMgQXVzZ2FuZ3MgZmVzdHN0ZWxsZW4uIAogICAgaWYgKCBtYXBwaW5ncChleGl0cyA9IG9iLT5RdWVyeVByb3AoUF9FWElUUykpICYmIGV4aXRzW2NtZF0gKQogICAgICAgIGFydCA9IE5PUk1BTDsgICAvLyAibm9ybWFsZXIiIEF1c2dhbmcKICAgIGVsc2UgaWYgKCBtYXBwaW5ncChleGl0cyA9IG9iLT5RdWVyeVByb3AoUF9TUEVDSUFMX0VYSVRTKSkgJiYgZXhpdHNbY21kXSApCiAgICAgICAgYXJ0ID0gU1BFQ0lBTDsgIC8vIFNwZWNpYWxFeGl0CiAgICBlbHNlIHsKICAgICAgICAvLyBLb21tYW5kb3MsIGRpZSBlaW5lbiBpbiBlaW5lbiBhbmRlcmVuIFJhdW0gYnJpbmdlbgogICAgICAgIGFydCA9IHRvX2ludChidWZbM10pOyAgIC8vIE1vdmUtTWV0aG9kZQoKICAgICAgICAvLyBFcyB6YWVobGVuIGFiZXIgbnVyIEJld2VndW5nZW4sIGRpZSBoYWxid2VncyAibm9ybWFsIiBhdXNzZWhlbiwKICAgICAgICAvLyBkLmguIGtlaW4gTV9UUE9SVCwgTV9OT0NIRUNLIHVuZCBNX0dPIG11c3MgZ2VzZXR6dCBzZWluLgogICAgICAgIGlmICggYXJ0ICYgKE1fVFBPUlQgfCBNX05PQ0hFQ0spIHx8ICEoYXJ0ICYgTV9HTykgKQogICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICBlbHNlCiAgICAgICAgICAgIGFydCA9IENPTU1BTkQ7CiAgICB9CgogICAgLy8gRGllIFVJRCBkZXIgU3BpZWxlci9TZWhlciB3aXJkIHZlcnNjaGx1ZXNzZWx0LgogICAgLy8gU2NobGllc3NsaWNoIGJyYXVjaGVuIHdpciBzaWUgbnVyIGZ1ZXIgc3RhdGlzdGlzY2hlIFp3ZWNrZSB1bmQgbmljaHQsCiAgICAvLyB1bSBCZXdlZ3VuZ3Nwcm9maWxlIHp1IGVyc3RlbGxlbi4gY3J5cHQoKSByZWljaHQgZnVlciBkaWVzZSBad2Vja2UKICAgIC8vIHdvaGwgZXJzdG1hbC4KICAgIHVpZCA9IGdldHVpZChwcmV2aW91c19vYmplY3QoMSkpOwogICAgdWlkID0gY3J5cHQoIHVpZCwgInczIiApOwoKICAgIC8vIFN0YXJ0LCBaaWVsLCBWZXJiLCBXaXpsZXZlbChUUCksIFVJRChUUCksIEFydCBkZXMgQXVzZ2FuZ3MsIFBhcmF3ZWx0CiAgICByZXR1cm4gKHsgYnVmWzBdLCBidWZbMV0sIGNtZCwgcXVlcnlfd2l6X2xldmVsKHByZXZpb3VzX29iamVjdCgxKSkgPyAxIDogMCwKICAgICAgICAgICAgICAgICAgdWlkLCBhcnQsIHRvX2ludChidWZbNF0pIH0pOwp9CgovLyBQcnVlZnQgYWxsZSBWZXJiaW5kdW5nZW4gaW0gQXJyYXkgPGNvbm5zPiwgd2VsY2hlIGRhcyBnbGVpY2hlIEtvbW1hbmRvIHdpZQovLyA8Y29ubj4gaGFiZW4sIG9iIHNpZSBpbiB1bnRlcnNjaGllZGxpY2hlIFJhZXVtZSBmdWVocmVuLiBXZW5uIGphLCBzaW5kIHNpZQovLyBmdWVyIGRhcyBSb3V0aW5nIG5pY2h0IG51dHpiYXIuIEF1c25haG1lOiBWZXJiaW5kdW5nZW4sIGRpZSBpbgovLyB1bnRlcnNjaGllZGxpY2hlIFBhcmF3ZWx0ZW4gZnVlaHJlbi4KLy8gQWVuZGVydCA8Y29ubnM+IGRpcmVrdC4KcHJpdmF0ZSB2b2lkIGNoZWNrX2FuZF9tYXJrX2R1cGxpY2F0ZV9jb25uc19ieV9jb25uKG1peGVkIGNvbm5zLCBtaXhlZCBjb25uKSB7CiAgICBmb3JlYWNoKG1peGVkIGM6IGNvbm5zKSB7CiAgICAgICAgaWYgKCBjW0NPTk5fQ01EXSA9PSBjb25uW0NPTk5fQ01EXQogICAgICAgICAgICAmJiBjW0NPTk5fREVTVF0gIT0gY29ubltDT05OX0RFU1RdCiAgICAgICAgICAgICYmIGNbQ09OTl9QQVJBXSA9PSBjb25uW0NPTk5fUEFSQV0gKQogICAgICAgIHsKICAgICAgICAgICAgY1tDT05OX0ZMQUdTXSB8PSBDRkxBR19EVVBMSUNBVEU7CiAgICAgICAgICAgIGNvbm5bQ09OTl9GTEFHU10gfD0gQ0ZMQUdfRFVQTElDQVRFOwogICAgICAgIH0KICAgIH0KfQoKcHJpdmF0ZSB2b2lkIGNoZWNrX2FuZF9tYXJrX2R1cGxpY2F0ZV9jb25ucyhtaXhlZCBjb25ucykgewogICAgZm9yZWFjaChtaXhlZCBjOiBjb25ucykKICAgICAgICBjaGVja19hbmRfbWFya19kdXBsaWNhdGVfY29ubnNfYnlfY29ubihjb25ucywgYyk7Cn0KCgovLyBOZXVlIFZlcmJpbmR1bmcgaW4gZGVyIERhdGVuYmFuayBlaW50cmFnZW4Kc3RhdGljIGludCBpbnNlcnRfcGF0aHMoIG1peGVkICpwYXRoICkKewogICAgc3RyaW5nIHByZSA9IF9nZXRfcHJlZml4KHBhdGhbMF0pOwoKICAgIC8vIEZhbGxzIG5vY2ggZ2FyIGtlaW4gRWludHJhZyBleGlzdGllcnQsIG5ldSBpbml0aWFsaXNpZXJlbgogICAgaWYgKCAhbWFwcGluZ3AocGF0aG1hcFtwcmVdKSApCiAgICAgICAgcGF0aG1hcFtwcmVdID0gKFtdKTsKCiAgICBpZiAoICFwb2ludGVycChwYXRobWFwW3ByZV1bcGF0aFswXV0pICkKICAgICAgICBwYXRobWFwW3ByZV1bcGF0aFswXV0gPSAoe30pOwoKICAgIC8vIEF1ZmJhdSB2b24gJ3BhdGgnOgogICAgLy8gKHsgU3RhcnQsIFppZWwsIFZlcmIsIFdpemxldmVsKFRQKSwgVUlEKFRQKSwgQXJ0IGRlcyBBdXNnYW5ncywgUGFyYSB9KQogICAgLy8gQXVmYmF1IHZvbiAnY29ubicgKHMuIGF1Y2ggZ2FueiBvYmVuKQogICAgLy8gKHsgWmllbCwgVmVyYiwgKHsgU3BpZWxlci1VSURzLCBTZWhlci1VSURzIH0pLCBBcnQgZGVzIEF1c2dhbmdzLAogICAgLy8gICAoeyBMZXR6dGVzIEJldHJldGVuIGR1cmNoIFNwaWVsZXIsIGR1cmNoIFNlaGVyIH0pLCBQYXJhd2VsdCB9KQoKICAgIC8vIEFsbGUgVmVyYmluZHVuZ2VuIGRlcyBSYXVtZXMgZHVyY2hnZWhlbgogICAgbWl4ZWQgY29ubnMgPSBwYXRobWFwW3ByZV1bcGF0aFswXV07CiAgICAvLyBLb21tYW5kb3MgZGVyIFZlcmJpbmR1bmdlbiBzYW1tZWxuLiBXZW5uIGVzIHp3ZWkgVmVyYmluZHVuZ2VuIG1pdCBkZW0KICAgIC8vIGdsZWljaGVuIEtvbW1hbmRvIGdpYnQsIHNpbmQgYmVpZGUgdW5iZW51dHpiYXIuCiAgICBtaXhlZCBjbWRzID0gbV9hbGxvY2F0ZSgxMCk7CiAgICBpbnQgaTsKICAgIGZvciAoIGkgPSBzaXplb2YoY29ubnMpOyBpLS07ICkKICAgIHsKICAgICAgICBtaXhlZCBjb25uID0gY29ubnNbaV07CiAgICAgICAgbV9hZGQoY21kcyxjb25uW0NPTk5fQ01EXSk7IC8vIEtvbW1hbmRvcyBhbGxlciBDb25ucyBtZXJrZW4KICAgICAgICAvLyBXZW5uIFppZWxyYXVtLCBWZXJiIHVuZCBQYXJhd2VsdCBwYXNzZW4gLi4uCiAgICAgICAgaWYgKCBjb25uW0NPTk5fREVTVF0gPT0gcGF0aFsxXSAmJiBjb25uW0NPTk5fQ01EXSA9PSBwYXRoWzJdCiAgICAgICAgICAgICAmJiBjb25uW0NPTk5fUEFSQV0gPT0gcGF0aFs2XSApCiAgICAgICAgewogICAgICAgICAgICAvLyBXZW5uIHNjaG9uIGdlbnVnIExldXRlIGRpZXNlIFZlcmJpbmR1bmcgZ2VudXR6dCBoYWJlbiwgZWluZmFjaAogICAgICAgICAgICAvLyBudXIgZGllIFplaXQgZGVyIGxldHp0ZW4gQmVudXR6dW5nIGFrdHVhbGlzaWVyZW4uCiAgICAgICAgICAgIGludCBpbmRleCA9IHBhdGhbM10gPyBDT05OX1VfU0VFUlMgOiBDT05OX1VfUExBWUVSUzsgLy8gU2VoZXI/CiAgICAgICAgICAgIGlmICggY29ubltDT05OX1VTRVJTXVtpbmRleF0gPT0gLTEgKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBjb25uW0NPTk5fVElNRVNdW2luZGV4XSA9IHRpbWUoKTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIEFuc29uc3RlbiBkaWUgKG5ldWU/KSBVSUQgaGluenVmdWVnZW4gdW5kIGRpZSBaZWl0IGFrdHVhbGlzaWVyZW4uCiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgY29ubltDT05OX1VTRVJTXVtpbmRleF0gPQogICAgICAgICAgICAgICAgICAgIGNvbm5bQ09OTl9VU0VSU11baW5kZXhdIC0gKHsgcGF0aFs0XSB9KSArICh7IHBhdGhbNF0gfSk7CiAgICAgICAgICAgICAgICBpZiAoIHNpemVvZihjb25uW0NPTk5fVVNFUlNdW2luZGV4XSkgPj0gTkVFREVEICkKICAgICAgICAgICAgICAgICAgICBjb25uW0NPTk5fVVNFUlNdW2luZGV4XSA9IC0xOwoKICAgICAgICAgICAgICAgIGNvbm5bQ09OTl9USU1FU11baW5kZXhdID0gdGltZSgpOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgLy8gRmFsbHMga2VpbmUgVmVyYmluZHVuZyBnZXBhc3N0IGhhdCwgZWluZSBuZXVlIGVyemV1Z2VuLgogICAgaWYgKCBpIDwgMCApIHsKICAgICAgICBpbnQgaW5kZXggPSBwYXRoWzNdID8gQ09OTl9VX1NFRVJTIDogQ09OTl9VX1BMQVlFUlM7IC8vIFNlaGVyPwogICAgICAgIG1peGVkIHVpZHMgPSAoeyAoe30pLCAoe30pIH0pOwogICAgICAgIHVpZHNbaW5kZXhdID0gKHsgcGF0aFs0XSB9KTsKICAgICAgICBtaXhlZCB0aW1lcyA9ICh7IDAsIDAgfSk7CiAgICAgICAgdGltZXNbaW5kZXhdID0gdGltZSgpOwoKICAgICAgICAvLyBBdWZiYXUgc2llaGUgb2JlbgogICAgICAgIG1peGVkIGNvbm4gPSAoeyBwYXRoWzFdLCBwYXRoWzJdLCB1aWRzLCBwYXRoWzVdLCB0aW1lcywgcGF0aFs2XSwgMCB9KTsKICAgICAgICBjb25ucyArPSAoeyBjb25uIH0pOwogICAgICAgIC8vIHdlbm4gZGllIG5ldWUgVmVyYmluZHVuZyBuZW4gS29tbWFuZG8gYmVudXR6dCwgd2VsY2hlcyBzY2hvbiBmdWVyCiAgICAgICAgLy8gZWluZSBhbmRlcmUgVmVyYmluZHVuZyBhdXMgZGllc2VtIFJhdW0gYmVudXR6dCB3aXJkLCBzaW5kIGJlaWRlCiAgICAgICAgLy8gbmljaHQgbnV0emJhciwgZGEgZGFzIFppZWwgbmljaHQgZWluZGV1dGlnIGlzdC4gSW4gZGllc2VtIEZhbGwKICAgICAgICAvLyBtdWVzc2VuIGFsbGUgZGllc2UgYWxzIHVuYmVudXR6YmFyIGZ1ZXIgZGFzIFJvdXRpbmcgbWFya2llcnQKICAgICAgICAvLyB3ZXJkZW4uCiAgICAgICAgaWYgKG1lbWJlcihjbWRzLCBjb25uW0NPTk5fQ01EXSkpIHsKICAgICAgICAgICAgY2hlY2tfYW5kX21hcmtfZHVwbGljYXRlX2Nvbm5zX2J5X2Nvbm4oY29ubnMsY29ubik7CiAgICAgICAgfQogICAgfQoKICAgIHBhdGhtYXBbcHJlXVtwYXRoWzBdXSA9IGNvbm5zOwoKICAgIC8vIE9iIDAgb2RlciAxIGlzdCBlaWdlbnRsaWNoIHRvdGFsIGVnYWwsIGRhIGRhcyBFcmdlYm5pcy1BcnJheSBzb3dpZXNvCiAgICAvLyB2ZXJ3b3JmZW4gd2lyZC4KICAgIHJldHVybiAwOwp9Cgpwcml2YXRlIHZvaWQgYWRkX3RvX2NhY2hlKHN0cmluZyBmcm9tLCBzdHJpbmcgdG8sIGludCBwYXJhLCBpbnQgY29zdHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nICpyb29tcywgc3RyaW5nICpjbWRzKSB7CiAgICBzdHJ1Y3QgcGF0aF9zIHAgPSAoPHBhdGhfcz4gY29zdHMgOiBjb3N0cywgcm9vbXM6IHJvb21zLCBjbWRzIDogY21kcywKICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmE6IHBhcmEsIGZsYWdzOiAwLCB0dGw6IHRpbWUoKSs4NjQwMCk7CiAgICBpZiAoIW1lbWJlcihwYXRoY2FjaGUsIGZyb20pKSB7CiAgICAgICAgcGF0aGNhY2hlW2Zyb21dID0gbV9hbGxvY2F0ZSgxKTsKICAgICAgICBwYXRoY2FjaGVbZnJvbV1bdG9dID0gbV9hbGxvY2F0ZSgxKTsKICAgIH0KICAgIGVsc2UgaWYgKCFtZW1iZXIocGF0aGNhY2hlW2Zyb21dLCB0bykpIHsKICAgICAgICBwYXRoY2FjaGVbZnJvbV1bdG9dID0gbV9hbGxvY2F0ZSgxKTsKICAgIH0KICAgIHBhdGhjYWNoZVtmcm9tXVt0b11bcGFyYV0gPSBwOwp9CgovLyBEaWVzZSBGdW5rdGlvbiBiZXJlY2huZXQgZGllIEtvc3RlbiBlaW5lciBWZXJiaW5kdW5nLgovLyBFaW4gU2VoZXJzdGF0dXMgc2NobGllc3N0IGRpZSBNb2VnbGljaGtlaXRlbiB2b24gU3BpZWxlcm4gZWluIChzZWhlcgovLyBrYW5uIFNwaWVsZXJwZmFkZSBwcm9ibGVtbG9zIG51dHplbikuCi8vIFdlbm4gZWluZSBWZXJiaW5kdW5nIGluIGVpbmUgYW5kZXJlIFBhcmF3ZWx0IGZ1ZWhydCwgYWxzIGluIDxwYXJhPgovLyBhbmdlZnJhZ3QsIHdpcmQgc2llIGVyaGVibGljaCB0ZXVyZXIuCnByb3RlY3RlZCBpbnQgX2NhbGNfY29zdChtaXhlZCogcGF0aCwgaW50IHNlZXIsIGludCBwYXJhKQp7CiAgICBtaXhlZCogaW50ZXJlc3Q9cGF0aFtDT05OX1VTRVJTXTsKCiAgICAvLyBCYXNpc2tvc3RlbiBuYWNoIEF1c2dhbmdzYXJ0CiAgICBpbnQgY29zdHMgPSBDT1NUX0VYSVRTW3BhdGhbQ09OTl9FWElUVFlQRV1dOwoKICAgIC8vIFZlcmJpbmR1bmdlbiBpbiBhbmRlcmUgYWxzIGRpZSBnZXd1ZW5zY2h0ZSBQYXJhd2VsdCB3ZXJkZW4gYmVpIGRlcgogICAgLy8gc3VjaGUgbmljaHQgYmVydWVja3NpY2h0aWd0LCBhYmVyIFZlcmJpbmR1bmcgdm9uIFBhcmEgbmFjaCBOb3JtYWwgdW5kCiAgICAvLyB1bWdla2VocnQgc2luZCBlcmxhdWJ0LiBQYXJhLT5Ob3JtYWwgc29sbCBhYmVyIGV0d2FzIHRldXJlciBzZWluLCBkYW1pdAogICAgLy8gZXMgYmV2b3J6dWd0IHdpcmQsIGluIGRlciBhbmdlZnJhZ3RlbiBXZWx0IHp1IGJsZWliZW4uCiAgICAvLyAoSGludGVyZ3J1bmQ6IHdlbm4gbWFuIGluIFBhcmEgaXN0LCBsYWV1ZnQgbWFuIG1laXN0ZW5zIHRyb3R6ZGVtIGR1cmNoCiAgICAvLyBOb3JtYWx3ZWx0cmFldW1lLCB3ZWlsIGVzIGtlaW5lIHBhc3NlbmRlbiBQYXJhcmFldW1lIGdpYnQpLgogICAgaWYgKHBhcmEgIT0gcGF0aFtDT05OX1BBUkFdKQogICAgICAgIGNvc3RzICs9IENPU1RfV09STERDSEFOR0U7CgogICAgLy8gd2VubiBzY2hvbiBnZW51ZyB1bnRlcnNjaGllZGxpY2hlIExldXRlIGRpZSBWZXJiaW5kdW5nIGdlbGF1ZmVuIHNpbmQsCiAgICAvLyBrb3N0ZXQgZXMgZGllIEJhc2lza29zdGVuLiBGdWVyIFNlaGVyIGF1Y2ggZGllIFNwaWVsZXIgZWluc2NobGllc3Nlbi4KICAgIGlmIChpbnRlcmVzdFtDT05OX1VfUExBWUVSU109PS0xCiAgICAgICAgfHwgKHNlZXIgJiYgaW50ZXJlc3RbQ09OTl9VX1NFRVJTXT09LTEpKQogICAgICAgIHJldHVybiBjb3N0czsKICAgIGVsc2UKICAgIHsKICAgICAgICAvLyBTb25zdCB3aXJkIGRpZSBWZXJiaW5kdW5nIHRldXJlci4KICAgICAgICAvLyBBbnphaGwgU3BpZWxlcm51dHplciBrYW5uIG5pY2h0IC0xIHNlaW4gKHMuby4pLgogICAgICAgIGludCB1c2VyY291bnQgPSBzaXplb2YoaW50ZXJlc3RbQ09OTl9VX1BMQVlFUlNdKTsKICAgICAgICAvLyB3ZW5uIDxzZWVyPiwgd2lyZCBnZ2YuIGRpZSBBbnphaGwgYW4gU2VoZXJudXR6ZXJuIGRyYXVmIGFkZGllcnQuCiAgICAgICAgLy8gV2VydCBmdWVyIFNlaGVyIGthbm4gbmljaHQgLTEgc2VpbiAocy5vLikKICAgICAgICBpZiAoc2VlcikKICAgICAgICAgICAgdXNlcmNvdW50ICs9IHNpemVvZihpbnRlcmVzdFtDT05OX1VfU0VFUlNdKTsKICAgICAgICBzd2l0Y2ggKHVzZXJjb3VudCkKICAgICAgICB7CiAgICAgICAgICAgIGNhc2UgMDoKICAgICAgICAgICAgICAgIGNvc3RzPTEwMDAwMDA7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAxLi4yOgogICAgICAgICAgICAgICAgY29zdHMqPUNPU1RfT05FOwogICAgICAgICAgICBjYXNlIDMuLjQ6CiAgICAgICAgICAgICAgICBjb3N0cyo9Q09TVF9GRVc7CiAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICBjb3N0cyo9Q09TVF9NQU5ZOwogICAgICAgIH0KICAgICAgICByZXR1cm4gY29zdHM7CiAgICB9CiAgICBEQkcoc3ByaW50ZigiSHVjaCwga2VpbmUgQWhudW5nLCBLb3N0ZW4gdW5iZXN0aW1tYmFyOiAlTyIscGF0aCkpOwogICAgcmV0dXJuIDEwMDA7Cn0KCi8vIE5ldWltcGxlbWVudGF0aW9uIHZvbiBIdW1uaSwgYmVudXR6dCBlaW5mYWNoIHNpbXBlbCBlaW5lbgovLyBEaWprc3RyYS1BbGdvcml0aG11cy4gIlNpbXBlbCIgc2NocmVpYmUgaWNoLCBiZXZvciBpY2ggZGllCi8vIEZ1bmt0aW9uIHNjaHJlaWJlLCBmbHVjaGVuIHdlcmRlIGljaCBnbGVpY2guCnN0YXRpYyB2b2lkIF9zZWFyY2goc3RyaW5nIGZuYW1lLCBzdHJpbmcgZnJvbSkKewogICAgLy8gPGZyb20+IGlzdCBqZXR6dCBhbnp1Z3Vja2VuZGUvenUgYmVhcmJlaXRlbmRlIFJhdW0uCgogICAgLy8gRGllIGFrdHVlbGxlIExpc3RlIGFuIGFiZ2VzdWNodGVuIFJhZXVtZW4sIFJhZXVtZSwgaW4gZGVuZW4KICAgIC8vIGFsbGUgV2VnZSBiZXJlaXRzIGVpbmdldHJhZ2VuIHNpbmQuCiAgICBzdHJpbmcqIHJvb21zX3NlYXJjaGVkPXNlYXJjaGxpc3RbZm5hbWUsU0xfVklTSVRFRF07CgogICAgLy8gWmllbG9ydAogICAgc3RyaW5nIHRvID0gc2VhcmNobGlzdFtmbmFtZSxTTF9ERVNUSU5BVElPTl07CgogICAgLy8gbW9lZ2xpY2hlIFppZWxlCiAgICBtYXBwaW5nIHRhcmdldHM9c2VhcmNobGlzdFtmbmFtZSxTTF9DQU5ESURBVEVTXTsKCiAgICAvLyB3aXpsZXZlbAogICAgaW50IHNlZXIgPSBzZWFyY2hsaXN0W2ZuYW1lLFNMX1dJWkxFVkVMXTsKCiAgICAvLyBwYXJhCiAgICBpbnQgcGFyYT1zZWFyY2hsaXN0W2ZuYW1lLFNMX1BBUkFdOwoKICAgIC8vIE5vY2ggenUgYmVhcmJlaXRlbmRlIFJhZXVtZQogICAgc3RyaW5nKiB0b19kbz1zZWFyY2hsaXN0W2ZuYW1lLFNMX1RPRE9dOwoKICAgIERCRygiX3NlYXJjaCgpIHN0YXJ0LiIpOwoKICAgIHdoaWxlICgoZ2V0X2V2YWxfY29zdCgpPjkwMDAwMCkgJiYgZnJvbSAmJiAoZnJvbSAhPSB0bykpCiAgICB7CiAgICAgICAgLy8gRnVlZ2UgZGVuIGFrdHVlbGxlbiBSYXVtIChmcm9tKSBhbHMgV2VnIGhpbnp1CiAgICAgICAgREJHKHNwcmludGYoIkZ1ZWdlIGhpbnp1OiAlcyIsZnJvbSkpOwogICAgICAgIHJvb21zX3NlYXJjaGVkKz0oe2Zyb219KTsKICAgICAgICAvLyBBdXMgZGVuIFJhZXVtZW4gZHJ1bXJ1bSB3ZXJkZW4gZGllIEF1c2dhZW5nZSBnZXN1Y2h0CiAgICAgICAgLy8gdW5kIHp1ciBXZWdsaXN0ZSBoaW56dWdlZnVlZ3QuCgogICAgICAgIC8vIFBmYWRlIHZvbiA8ZnJvbT4gd2VnIGF1cyBkZXIgTGlzdGUgaG9sZW4KICAgICAgICBtaXhlZCogcGF0aHM9cGF0aG1hcFtfZ2V0X3ByZWZpeChmcm9tKV1bZnJvbV07CgogICAgICAgIC8vIExpc3RlIGRlciBWZXJiaW5kdW5nZW4gdm9uIDxmcm9tPiBkdXJjaGdlaGVuCiAgICAgICAgZm9yZWFjaCAobWl4ZWQgY29ubjpwYXRocykKICAgICAgICB7CiAgICAgICAgICAgIGludCBuZXdjb3N0OwogICAgICAgICAgICAvLyB3ZW5uIGRlciBSYXVtIHNjaG9ubWFsIGdlc2VoZW4gd3VyZGUsIGlzdCBoaWVyIG5peCBtZWhyIG5vZXRpZy4KICAgICAgICAgICAgaWYgKG1lbWJlcihyb29tc19zZWFyY2hlZCxjb25uW0NPTk5fREVTVF0pPi0xKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBEQkcoc3ByaW50ZigiUmF1bSAlcyBoYWIgaWNoIHNjaG9uISIsY29ubltDT05OX0RFU1RdKSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyBWZXJiaW5kdW5nIGplIG5hY2ggRmxhZyBuaWNodCBudXR6ZW4uIEF1c3NlcmRlbToKICAgICAgICAgICAgICAgIC8vIHdlbm4gZGllIFZlcmJpbmR1bmcgaW4gZWluZSBQYXJhd2VsdCBmdWVocnQsIGFiZXIga2VpbgogICAgICAgICAgICAgICAgLy8gU2VoZXJzdGF0dXMgZ2VnZWJlbiBpc3QsIGV4aXN0aWVydCBkaWUgVmVyYmluZHVuZyBuaWNodC4KICAgICAgICAgICAgICAgIC8vIFdlaXRlcmhpbiBrb21tdCBlaW5lIFZlcmJpbmR1bmcgbmljaHQgaW4gRnJhZ2UsIHdlbm4gc2llIGluCiAgICAgICAgICAgICAgICAvLyBlaW5lIGFuZGVyZSBQYXJhd2VsdCBmdWVocnQsIHdlaWwgZGVyIFdlbHR1ZWJlcmdhbmcgbnVyIGFuCiAgICAgICAgICAgICAgICAvLyBiZXN0aW1tdGVuIE9ydGVuIG1vZWdsaWNoIGlzdC4gQXVzbmFobWUgZGF2b24gc2luZCBXZWNoc2VsCiAgICAgICAgICAgICAgICAvLyB6d2lzY2hlbiBOb3JtYWx3ZWx0IHVuZCBQYXJhd2VsdC4KICAgICAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICAgICAoY29ubltDT05OX0ZMQUdTXSAmIENGTEFHX0RPTlRVU0UpCiAgICAgICAgICAgICAgICAgICAgfHwgKGNvbm5bQ09OTl9GTEFHU10gJiBDRkxBR19EVVBMSUNBVEUpCiAgICAgICAgICAgICAgICAgICAgfHwgKCFzZWVyICYmIGNvbm5bQ09OTl9QQVJBXSkKICAgICAgICAgICAgICAgICAgICB8fCAoY29ubltDT05OX1BBUkFdICYmIGNvbm5bQ09OTl9QQVJBXSAhPSBwYXJhKQogICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgIG5ld2Nvc3QgPSB0YXJnZXRzW2Zyb20sU0xUX0NPU1RTXTsgLy8ga29zdGVuIGJpcyBoaWVyaGVyCiAgICAgICAgICAgICAgICAvLyArIEtvc3RlbiBpbiBuYWVjaHN0ZW4gUmF1bS4KICAgICAgICAgICAgICAgIG5ld2Nvc3QgKz0gX2NhbGNfY29zdChjb25uLHNlZXIscGFyYSk7CiAgICAgICAgICAgICAgICAvLyBlcyBrb2VubnRlIHNlaW4sIGRhc3MgZXMgVmVyYmluZHVuZ2VuIG1pdCBnbGVpY2hlbQogICAgICAgICAgICAgICAgLy8gU3RhcnQvWmllbCBnaWJ0LCBhYmVyIHVudGVyc2NoaWVkbGljaGVuIEtvc3Rlbi4gSW4gZGllc2VtCiAgICAgICAgICAgICAgICAvLyBGYWxsIHd1ZXJkZSBkYXMgWmllbCBkZXIgYWt0dWVsbGVuIFZlcmJpbmR1bmcgbWVocmZhY2gKICAgICAgICAgICAgICAgIC8vIGhpbnp1Z2VmdWVndCB1bmQgZGFzIGxldHp0ZSBnZXdpbm50LiBEYWhlciBzb2xsdGUgZGllc2UKICAgICAgICAgICAgICAgIC8vIFZlcmJpbmR1bmcgbnVyIGhpbnp1Z2VmdWVndCB3ZXJkZW4sIHdlbm4gbm9jaCBrZWluZQogICAgICAgICAgICAgICAgLy8gVmVyYmluZHVuZyBpbiBkZW4gWmllbHJhdW0gZXhpc3RpZXJ0LCBkaWUgYmlsbGlnZXIgaXN0LgogICAgICAgICAgICAgICAgaWYgKG1lbWJlcih0YXJnZXRzLGNvbm5bQ09OTl9ERVNUXSkKICAgICAgICAgICAgICAgICAgICAmJiBuZXdjb3N0ID49IHRhcmdldHNbY29ubltDT05OX0RFU1RdLFNMVF9DT1NUU10pCiAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICAvLyBXZWcgYmlzIGhpZXJoZXIgcGx1cyBuYWVjaHN0ZW4gUmF1bQogICAgICAgICAgICAgICAgc3RyaW5nKiBuZXdfd2F5ID0gdGFyZ2V0c1tmcm9tLFNMVF9XQVldOwogICAgICAgICAgICAgICAgbmV3X3dheSArPSAoe2Nvbm5bQ09OTl9ERVNUXX0pOwogICAgICAgICAgICAgICAgLy8gS29tbWFuZG9zIGJpcyBoaWVyaGVyIHBsdXMgbmFlY2hzdGVzIEtvbW1hbmRvCiAgICAgICAgICAgICAgICBzdHJpbmcqIG5ld19jb21tYW5kcyA9IHRhcmdldHNbZnJvbSxTTFRfQ09NTUFORFNdOwogICAgICAgICAgICAgICAgbmV3X2NvbW1hbmRzICs9ICh7Y29ubltDT05OX0NNRF19KTsKICAgICAgICAgICAgICAgIC8vIG5hZWNoc3RlbiBSYXVtIGluIFRvZG8gZnVlciBkaWUgUHJ1ZWZ1bmcgdW50ZW4gdmVybWVya2VuCiAgICAgICAgICAgICAgICB0b19kbyArPSAoe2Nvbm5bQ09OTl9ERVNUXX0pOwogICAgICAgICAgICAgICAgLy8gVW5kIEtvc3Rlbi9XZWcvS29tbWFuZG9zIGJpcyB6dW0gbmFlY2hzdGVuIFJhdW0gdW50ZXIKICAgICAgICAgICAgICAgIC8vIHRhcmdldHMvS2FuZGlkYXRlbiBhYmxlZ2VuLgogICAgICAgICAgICAgICAgdGFyZ2V0cyArPSAoW2Nvbm5bQ09OTl9ERVNUXTpuZXdjb3N0O25ld193YXk7bmV3X2NvbW1hbmRzXSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgLy8gTmFjaGRlbSBkaWUgUmFldW1lIGFsbGUgenUgZGVuIEthbmRpZGF0ZW4gYW4gbW9lZ2xpY2hlbiBXZWdlbgogICAgICAgIC8vIGhpbnp1Z2VmdWVndCB3dXJkZW4sIHdpcmQgbnVuIGRlciBuZXVlc3RlIGt1ZXJ6ZXN0ZSBXZWcgZ2VzdWNodC4KICAgICAgICAvLyBOYXR1ZXJsaWNoIG51ciBhdXMgZGVuZW4sIGRpZSBzY2hvbiBkYSBzaW5kLgogICAgICAgIGlmIChzaXplb2YodG9fZG8pPjApCiAgICAgICAgewogICAgICAgICAgICAvLyBLb3N0ZW4gZGVzIGVyc3RlbiB0b2RvIGFscyBTdGFydHdlcnQgbmVobWVuCiAgICAgICAgICAgIHN0cmluZyBtaW5yYXVtOwogICAgICAgICAgICBpbnQgbWluY29zdHM9X19JTlRfTUFYX187CiAgICAgICAgICAgIC8vIHVuZCB1ZWJlciBhbGxlIHRvZG9zIGxhdWZlbiB1bSBkYXMgTWluaW11bSB6dSBmaW5kZW4uCiAgICAgICAgICAgIGZvcmVhY2goc3RyaW5nIHJhdW06IHRvX2RvKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAobWluY29zdHM+dGFyZ2V0c1tyYXVtLFNMVF9DT1NUU10pCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgbWlucmF1bSA9IHJhdW07CiAgICAgICAgICAgICAgICAgICAgbWluY29zdHM9dGFyZ2V0c1tyYXVtLFNMVF9DT1NUU107CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgREJHKHNwcmludGYoIk5ldWVyIGt1ZXJ6ZXN0ZXIgUmF1bTogJXMiLG1pbnJhdW0pKTsKCiAgICAgICAgICAgIC8vIGRlciBiaWxsaWdzdCB6dSBlcnJlaWNoZW5kZSBSYXVtIHdpcmQgZGFzIG5ldWUgPGZyb20+IGZ1ZXIgZGVuCiAgICAgICAgICAgIC8vIG5hZWNoc3RlbiBEdXJjaGxhdWYKICAgICAgICAgICAgZnJvbT1taW5yYXVtOwogICAgICAgICAgICAvLyB1bmQgbmF0dWVybGljaCBhdXMgZGVtIHRvX2RvIHdlcmZlbi4KICAgICAgICAgICAgdG9fZG8tPSh7bWlucmF1bX0pOwogICAgICAgICAgICBEQkcoc3ByaW50ZigiQW56YWhsIHVudGVyc3VjaHRlciBSYWV1bWU6ICVkLCBUb2RvOiAlZCwgIgogICAgICAgICAgICAgICAgICAiS2FuZGlkYXRlbjogJWQiLAogICAgICAgICAgICAgICAgICBzaXplb2Yocm9vbXNfc2VhcmNoZWQpLHNpemVvZih0b19kbyksc2l6ZW9mKHRhcmdldHMpKSk7CiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICB7CiAgICAgICAgICAgIGZyb209MDsKICAgICAgICB9CiAgICB9IC8vIHdoaWxlIGVuZGUKCiAgICBpZiAoIWZyb20pCiAgICB7CiAgICAgICAgLy8gSG1wZi4uLgogICAgICAgIFRFTExfVVNFUigiS2VpbiBXZWcgZ2VmdW5kZW4hIik7CiAgICAgICAgaWYgKHNlYXJjaGxpc3RbZm5hbWUsIFNMX0NBTExCQUNLXSkKICAgICAgICAgICAgZnVuY2FsbChzZWFyY2hsaXN0W2ZuYW1lLFNMX0NBTExCQUNLXSwKICAgICAgICAgICAgICAgICAgICBzZWFyY2hsaXN0W2ZuYW1lLFNMX1NUQVJUXSwgdG8sIHBhcmEsCiAgICAgICAgICAgICAgICAgICAgMCwwLDApOwogICAgICAgIG1fZGVsZXRlKCBzZWFyY2hsaXN0LCBmbmFtZSApOyAgLy8gc3VjaGF1ZnRyYWcgZW50c29yZ2VuCiAgICAgICAgcmV0dXJuOwogICAgfQogICAgZWxzZSBpZiAoZnJvbT09dG8pCiAgICB7CiAgICAgICAgLy8gSlVDSFUhCiAgICAgICAgVEVMTF9VU0VSKHNwcmludGYoIldlZyBnZWZ1bmRlbiEgJU8sJU8sJU8iLAogICAgICAgICAgICAgIHRhcmdldHNbdG8sU0xUX0NPU1RTXSx0YXJnZXRzW3RvLFNMVF9XQVldLAogICAgICAgICAgICAgIHRhcmdldHNbdG8sU0xUX0NPTU1BTkRTXSkpOwogICAgICAgIGFkZF90b19jYWNoZShzZWFyY2hsaXN0W2ZuYW1lLFNMX1NUQVJUXSwgdG8sIHBhcmEsCiAgICAgICAgICAgICAgICAgICAgIHRhcmdldHNbdG8sU0xUX0NPU1RTXSx0YXJnZXRzW3RvLFNMVF9XQVldLAogICAgICAgICAgICAgICAgICAgICB0YXJnZXRzW3RvLFNMVF9DT01NQU5EU10pOwogICAgICAgIGlmIChzZWFyY2hsaXN0W2ZuYW1lLCBTTF9DQUxMQkFDS10pCiAgICAgICAgICAgIGZ1bmNhbGwoc2VhcmNobGlzdFtmbmFtZSxTTF9DQUxMQkFDS10sCiAgICAgICAgICAgICAgICAgICAgc2VhcmNobGlzdFtmbmFtZSxTTF9TVEFSVF0sIHRvLCBwYXJhLAogICAgICAgICAgICAgICAgICAgIHRhcmdldHNbdG8sU0xUX0NPU1RTXSx0YXJnZXRzW3RvLFNMVF9XQVldLAogICAgICAgICAgICAgICAgICAgIHRhcmdldHNbdG8sU0xUX0NPTU1BTkRTXSk7CiAgICAgICAgbV9kZWxldGUoIHNlYXJjaGxpc3QsIGZuYW1lICk7ICAvLyBzdWNoYXVmdHJhZyBlbnRzb3JnZW4KICAgICAgICByZXR1cm47CiAgICB9CgogICAgLy8gV2VubiBkYXMgYWxsZXMgbmljaHQgd2FyLCB3YXJlbiBlcyBkaWUgRXZhbC1UaWNrcy4gTWlzdC4gU3BhZXRlcgogICAgLy8gd2VpdGVyc3VjaGVuLi4uCiAgICBzZWFyY2hsaXN0W2ZuYW1lLFNMX1ZJU0lURURdPXJvb21zX3NlYXJjaGVkOwogICAgc2VhcmNobGlzdFtmbmFtZSxTTF9DQU5ESURBVEVTXT10YXJnZXRzOwogICAgc2VhcmNobGlzdFtmbmFtZSxTTF9UT0RPXT10b19kbzsKICAgIGNhbGxfb3V0KCJfc2VhcmNoIiwyLGZuYW1lLGZyb20pOwp9CgoKLy8gRGllIERhdGVuIHVlYmVyIFJhZXVtZSB3ZXJkZW4gcXVhc2kgZ2VoYXNodCBhYmdlc3BlaWNoZXJ0LCBkYW1pdCB3aXIgbmljaHQKLy8gc28gc2NobmVsbCBhbiBkaWUgQmVncmVuenVuZyBiZWkgQXJyYXlzIHVuZCBNYXBwaW5ncyBzdG9zc2VuLgovLyBEYWJlaSBpc3QgZGVyICdIYXNoJyBkZXIgQW5mYW5nIGRlcyBQZmFkZXMuCnByaXZhdGUgc3RyaW5nIF9nZXRfcHJlZml4KCBzdHJpbmcgcGF0aCApCnsKICAgIHN0cmluZyAqdG1wOwoKICAgIHRtcCA9IGV4cGxvZGUoIHBhdGgsICIvIiApOwoKICAgIC8vIEJlaSBSYWV1bWVuIHVudGVyaGFsYiB2b24gL2QvKiB3aXJkIC9kL3JlZ2lvbi9tYWdpZXJuYW1lIGJlbnV0enQKICAgIGlmICggc3Ryc3RyKHBhdGgsICIvZC8iKSA9PSAwKQogICAgICAgIHJldHVybiBpbXBsb2RlKCB0bXBbMC4uM10sICIvIiApOwogICAgLy8gQW5zb25zdGVuIGRpZSBlcnN0ZW4gYmVpZGVuIFRlaWxwZmFkZSwgZmFsbHMgc292aWVsZSB2b3JoYW5kZW4gc2luZAogICAgZWxzZSBpZiAoIHNpemVvZih0bXApIDwgNCApCiAgICAgICAgcmV0dXJuIGltcGxvZGUoIHRtcFswLi4xXSwgIi8iICk7CiAgICBlbHNlCiAgICAgICAgcmV0dXJuIGltcGxvZGUoIHRtcFswLi4yXSwgIi8iICk7Cn0KCi8vIFJlc2V0IHVuZCBEYXRlbmhhbHR1bmcKLy8gcmVzZXQgd2lyZCBhbGxlIDNoIGdlcnVmZW4sIHVtIGRhcyBTYXZlZmlsZSBpbW1lciBtYWwgd2llZGVyIHp1IHNwZWljaGVybi4KLy8gRGF0ZW5hdWZyYWV1bWVuIGFiZXIgbnVyIGVpbm1hbCBwcm8gVGFnLgpwdWJsaWMgdm9pZCByZXNldCgpCnsKICAgIGlmICggdGltZV90b19jbGVhbl91cCA8PSB0aW1lKCkgKQogICAgewogICAgICAgIC8vIEVpbm1hbCBwcm8gVGFnIFJlc2V0IHp1bSBBdWZyYWV1bWVuIGRlciBEYXRlbmJhbmsKICAgICAgICBybShEVU1QRklMRSIucmFldW1lIik7CiAgICAgICAgcm0oRFVNUEZJTEUiLmNvbm5zIik7CiAgICAgICAgdGltZV90b19jbGVhbl91cCA9IHRpbWUoKSArIDg2NDAwOwogICAgICAgIGV4cGlyZV9wYXRoX2NhY2hlKG1faW5kaWNlcyhwYXRoY2FjaGUpKTsKICAgICAgICBjYWxsX291dCgjJ2NsZWFudXBfZGF0YSwgMzAsCiAgICAgICAgICAgICAgICAgIHNvcnRfYXJyYXkobV9pbmRpY2VzKHBhdGhtYXApLCAjJzwvKicqLyksIDAgKTsKCiAgICB9CiAgICBzYXZlX29iamVjdChTQVZFRklMRSk7CiAgICBzZXRfbmV4dF9yZXNldCgxMDgwMCk7Cn0KCnByb3RlY3RlZCB2b2lkIGV4cGlyZV9wYXRoX2NhY2hlKHN0cmluZyAqc3RhcnRyb29tcykgewogICAgZm9yZWFjaChzdHJpbmcgc3RhcnQgOiBzdGFydHJvb21zKSB7CiAgICAgICAgbWFwcGluZyB0YXJnZXRzID0gcGF0aGNhY2hlW3N0YXJ0XTsKICAgICAgICBmb3JlYWNoIChzdHJpbmcgdGFyZ2V0LCBtYXBwaW5nIHBhdGhzOiB0YXJnZXRzKSB7CiAgICAgICAgICAgIGZvcmVhY2goaW50IHBhcmEsIHN0cnVjdCBwYXRoX3MgcDogcGF0aHMpIHsKICAgICAgICAgICAgICAgIGlmIChwLT50dGwgPCB0aW1lKCkKICAgICAgICAgICAgICAgICAgICB8fCAhKHAtPmZsYWdzICYgUEZMQUdfUEVSTUFORU5UKSApCiAgICAgICAgICAgICAgICAgICAgbV9kZWxldGUocGF0aHMscGFyYSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCFzaXplb2YocGF0aHMpKQogICAgICAgICAgICAgICAgbV9kZWxldGUodGFyZ2V0cywgdGFyZ2V0KTsKICAgICAgICB9CiAgICAgICAgc3RhcnRyb29tcy09KHtzdGFydH0pOwogICAgICAgIGlmICghc2l6ZW9mKHRhcmdldHMpKQogICAgICAgICAgICBtX2RlbGV0ZShwYXRoY2FjaGUsIHN0YXJ0KTsKICAgICAgICAvLyByZWNodCBncm9zc2VyIFdlcnQsIHdlaWwgaW1tZXIga29tcGxldHRlIFN0YXJ0cmFldW1lIGluIGVpbmVtCiAgICAgICAgLy8gZXJsZWRpZ3Qgd2VyZGVuLgogICAgICAgIGlmIChnZXRfZXZhbF9jb3N0KCkgPCAxMDAwMDAwKQogICAgICAgICAgICBicmVhazsKICAgIH0KICAgIGlmIChzaXplb2Yoc3RhcnRyb29tcykpCiAgICAgICAgY2FsbF9vdXQoIydleHBpcmVfcGF0aF9jYWNoZSwgNCwgc3RhcnRyb29tcyk7Cn0KCi8vIERhdGVuYmFuayBhdWZyYWV1bWVuCnByb3RlY3RlZCB2b2lkIGNsZWFudXBfZGF0YSggc3RyaW5nICpuYW1lcywgaW50IGlkeCApCnsKICAgIGludCBzaXplLCBpLCBqLCBrOwogICAgc3RyaW5nICpyb29tczsKICAgIG1peGVkICpwYXRoczsKCiAgICBzaXplID0gc2l6ZW9mKG5hbWVzKTsKCiAgICAvLyBFaW4gYmlzc2VybCBtaXRsb2dnZW4sIGRhbWl0IHdpciBTY2h3YWNoc3RlbGxlbiBpbSBTeXN0ZW0gYXVjaCBmaW5kZW4uCiAgICBpZiAoICFpZHggKXsKICAgICAgICBMT0coIHNwcmludGYoIj09PSAlczogU3RhcnRlIGNsZWFudXBfZGF0YSgpOiAlTyBHZWJpZXRlLCAlTyBSYWV1bWUgIgogICAgICAgICAgICAgICAgICAgICArICIuLi5cbiIsIHN0cmZ0aW1lKCIleSVtJWQtJUglTSVTIiksIHNpemUsCiAgICAgICAgICAgICAgICAgICAgIHNob3dfc3RhdGlzdGljKDEsIDEpICkgKTsKICAgIH0KICAgIGVsc2UgewogICAgICAgIExPRyggc3ByaW50ZigiJXM6IFNldHplIGNsZWFudXBfZGF0YSgpIGZvcnQuXG4iLAogICAgICAgICAgICAgIHN0cmZ0aW1lKCIleSVtJWQtJUglTSVTIikgKSApOwogICAgfQoKICAgIC8vIEJyYXYgZ2VzcGxpdHRldCwgZGFtaXQgZXMga2VpbiBMYWcgZ2lidC4KICAgIC8vIERpZSBHcmVuemUgaXN0IHJlY2h0IGhvY2ggYW5nZXNldHp0LCBkYSBpbW1lciBnbGVpY2gga29tcGxldHRlCiAgICAvLyBUZWlsYmFldW1lIGF1ZmdlcmFldW10IHdlcmRlbi4KICAgIHdoaWxlICggZ2V0X2V2YWxfY29zdCgpID4gMTEwMDAwMCAmJiBpZHggPCBzaXplICl7CiAgICAgICAgcm9vbXMgPSBzb3J0X2FycmF5KCBtX2luZGljZXMocGF0aG1hcFtuYW1lc1tpZHhdXSksICMnPC8qJyovICk7CgogICAgICAgIGZvciAoIGkgPSBzaXplb2Yocm9vbXMpOyBpLS07ICl7CiAgICAgICAgICAgIHBhdGhzID0gcGF0aG1hcFtuYW1lc1tpZHhdXVtyb29tc1tpXV07CiAgICAgICAgICAgIGludCBjb25uX2NvdW50ID0gc2l6ZW9mKHBhdGhzKTsKICAgICAgICAgICAgbWFwcGluZyBjbWRzPW1fYWxsb2NhdGUoc2l6ZW9mKHBhdGhzKSk7CgogICAgICAgICAgICBmb3IgKCBqID0gY29ubl9jb3VudDsgai0tOyApIHsKICAgICAgICAgICAgICAgIG1peGVkIGNvbm4gPSBwYXRoc1tqXTsKICAgICAgICAgICAgICAgIGZvciAoIGsgPSAwOyBrIDwgMjsgaysrICkgeyAvLyBTcGllbGVyL1NlaGVyZWludHJhZWdlCiAgICAgICAgICAgICAgICAgICAgLy8gRGllc2UgVmVyYmluZHVuZyBoYXQgbm9jaCBrZWluZXIgZ2VudXR6dCBiaXNoZXIKICAgICAgICAgICAgICAgICAgICBpZiAoICFjb25uW0NPTk5fVElNRVNdW2tdICkKICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICAgICAgLy8gV2VubiBWZXJiaW5kdW5nIHBlcm1hbmVudCwgdWViZXJzcHJpbmdlbgogICAgICAgICAgICAgICAgICAgIGlmIChjb25uW0NPTk5fRkxBR1NdICYgQ0ZMQUdfUEVSTUFORU5UKQogICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKCiAgICAgICAgICAgICAgICAgICAgaWYgKCBjb25uW0NPTk5fVVNFUlNdW2tdID09IC0xIC8vICdiZWthbm50ZXMnIEdlYmlldAogICAgICAgICAgICAgICAgICAgICAgICAgJiYgdGltZSgpIC0gY29ubltDT05OX1RJTUVTXVtrXSA+IFRJTUVPVVRfT0xEICl7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIExPRyggc3ByaW50ZigiKioqIExvZXNjaGUgYWx0ZSAiCiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAgICsgKGsgPyAiU2VoZXIiIDogIlNwaWVsZXIiKQogICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgICArICItVmVyYmluZHVuZyAlTy5cbiIsIHBhdGhzW2pdKSApOwogICAgICAgICAgICAgICAgICAgICAgICBjb25uW0NPTk5fVVNFUlNdW2tdID0gKHt9KTsKICAgICAgICAgICAgICAgICAgICAgICAgY29ubltDT05OX1RJTUVTXVtrXSA9IDA7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCBjb25uW0NPTk5fVVNFUlNdW2tdICE9IC0xIC8vICduZXVlcycgR2ViaWV0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIHRpbWUoKSAtIGNvbm5bQ09OTl9USU1FU11ba10gPiBUSU1FT1VUX05FVyApewogICAgICAgICAgICAgICAgICAgICAgICBjb25uW0NPTk5fVVNFUlNdW2tdID0gKHt9KTsKICAgICAgICAgICAgICAgICAgICAgICAgY29ubltDT05OX1RJTUVTXVtrXSA9IDA7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIFdlbm4gZWluZSBWZXJiaW5kdW5nIHdlZGVyIHZvbiBTcGllbGVybiBub2NoIHZvbiBTZWhlcm4KICAgICAgICAgICAgICAgIC8vIGJlbnV0enQgd3VyZGUgaW4gbGV0enRlciBaZWl0IHVuZCBzaWUga2VpbmUgcGVybWFuZW50ZWQKICAgICAgICAgICAgICAgIC8vIGlzdCwgVmVyYmluZHVuZyBnYW56IGxvZXNjaGVuLgogICAgICAgICAgICAgICAgaWYgKCEoY29ubltDT05OX0ZMQUdTXSAmIENGTEFHX1BFUk1BTkVOVCkKICAgICAgICAgICAgICAgICAgICAmJiAhY29ubltDT05OX1RJTUVTXVtDT05OX1RfUExBWUVSU10KICAgICAgICAgICAgICAgICAgICAmJiAhY29ubltDT05OX1RJTUVTXVtDT05OX1RfU0VFUlNdICkgewogICAgICAgICAgICAgICAgICAgIHBhdGhzW2ouLmpdID0gKHt9KTsgLy8gY29ubiByYXVzd2VyZmVuCiAgICAgICAgICAgICAgICAgICAgY29ubl9jb3VudC0tOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgLy8gQ29ubmVjdGlvbnMgbmFjaCBLb21tYW5kb3Mgc3BlaWNoZXJuLgogICAgICAgICAgICAgICAgICAgIGlmIChtZW1iZXIoY21kcywgY29ubltDT05OX0NNRF0pKQogICAgICAgICAgICAgICAgICAgICAgICBjbWRzW2Nvbm5bQ09OTl9DTURdXSArPSAoe2Nvbm59KTsKICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgIGNtZHNbY29ubltDT05OX0NNRF1dID0gKHtjb25ufSk7CiAgICAgICAgICAgICAgICAgICAgLy8gdW5kIGRhcyBkdXBsaWNhdGUgZmxhZyBsb2VzY2hlbiwgZGFzIHdpcmQgc3BhZXRlciBuZXUKICAgICAgICAgICAgICAgICAgICAvLyBnZXNldHp0LCB3ZW5uIG5vZXRpZy4KICAgICAgICAgICAgICAgICAgICAvLyAoVGhlcmUgaXMgbm8gY2hhbmNlIHRoYXQgYSBjb25jdXJyZW50IHNlYXJjaCB3aWxsIGNoZWNrCiAgICAgICAgICAgICAgICAgICAgLy8gdGhlc2UgY29ubmVjdGlvbnMgdW50aWwgdGhleSBhcmUgbWFya2VkIGFnYWluLikKICAgICAgICAgICAgICAgICAgICBjb25uW0NPTk5fRkxBR1NdICY9IH5DRkxBR19EVVBMSUNBVEU7CiAgICAgICAgICAgICAgICAgICAgLy8gQ29ubmVjdGlvbnMgZHVtcGVuCiAgICAgICAgICAgICAgICAgICAgaWYgKCEoY29ubltDT05OX0ZMQUdTXSAmIENGTEFHX0RVUExJQ0FURSkpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgbWl4ZWQgdT0oe2Nvbm5bQ09OTl9VU0VSU11bQ09OTl9VX1BMQVlFUlNdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25uW0NPTk5fVVNFUlNdW0NPTk5fVV9TRUVSU10gfSk7CiAgICAgICAgICAgICAgICAgICAgICB3cml0ZV9maWxlKERVTVBGSUxFIi5jb25ucyIsc3ByaW50ZigKICAgICAgICAgICAgICAgICAgICAgICAgICAgIiVzfCVzfCVzfCVkfCVkfCVkfCVkXG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICByb29tc1tpXSxjb25uW0NPTk5fREVTVF0sY29ubltDT05OX0NNRF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbm5bQ09OTl9FWElUVFlQRV0sY29ubltDT05OX1BBUkFdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAodVswXT09LTEgPyAwIDogTkVFREVELXNpemVvZih1WzBdKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICh1WzBdPT0tMSA/IDAgOiBORUVERUQtc2l6ZW9mKHVbMF0pKQogICAgICAgICAgICAgICAgICAgICAgICAgICApKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIEVpbiBSYXVtIG9obmUgVmVyYmluZHVuZ2VuIGZyaXNzdCBudXIgUGxhdHogaW4gZGVyIERhdGVuYmFuawogICAgICAgICAgICBpZiAoICFjb25uX2NvdW50ICl7CiAgICAgICAgICAgICAgICAvLyBMT0coIHNwcmludGYoIioqKiBMb2VzY2hlIGtvbXBsZXR0ZW4gUmF1bSAlT1xuIiwgcm9vbXNbaV0pICk7CiAgICAgICAgICAgICAgICBtX2RlbGV0ZSggcGF0aG1hcFtuYW1lc1tpZHhdXSwgcm9vbXNbaV0gKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIC8vIHdlbm4gS29tbWFuZG9zIG5pY2h0IGVpbmRldXRpZyBzaW5kLCBkYW5uIHdlcmRlbiBkaWUKICAgICAgICAgICAgICAgIC8vIGVudHNwcmVjaGVuZGVuIFZlcmJpbmR1bmdlbiBnZWtlbm56ZWljaG5ldC4gQWxsZSBpbiBGcmFnZQogICAgICAgICAgICAgICAgLy8ga29tbWVuZGVuIFZlcmJpbmR1bmdlbiBzaW5kIGpld2VpbHMgc2Nob24genVzYW1tZW5zb3J0aWVydC4KICAgICAgICAgICAgICAgIGZvcmVhY2goc3RyaW5nIGNtZCwgbWl4ZWQgY29ubnMgOiBjbWRzKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKHNpemVvZihjb25ucyk+MSkKICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tfYW5kX21hcmtfZHVwbGljYXRlX2Nvbm5zKGNvbm5zKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC8vIGdnZi4gZ2VhZW5kZXJ0ZXMgVmVyYmluZHVuZ3NhcnJheSB3aWVkZXIgaW5zIE1hcHBpbmcKICAgICAgICAgICAgICAgIC8vIHNjaHJlaWJlbi4KICAgICAgICAgICAgICAgIHBhdGhtYXBbbmFtZXNbaWR4XV1bcm9vbXNbaV1dID0gcGF0aHM7CiAgICAgICAgICAgICAgICAvLyBSYXVtL05vZGUgaW5zIER1bXAgc2NocmVpYmVuCiAgICAgICAgICAgICAgICB3cml0ZV9maWxlKERVTVBGSUxFIi5yYWV1bWUiLHNwcmludGYoCiAgICAgICAgICAgICAgICAgICAgICAiJXNcbiIscm9vbXNbaV0pKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZHgrKzsKICAgIH0KICAgIGlmICggaWR4ID49IHNpemUgKSB7CiAgICAgICAgTE9HKCBzcHJpbnRmKCI9PT0gJXM6IEJlZW5kZSBjbGVhbnVwX2RhdGEoKSEgVWVicmlnOiAlTyBSYWV1bWUuXG4iLAogICAgICAgICAgICAgICAgICAgICBzdHJmdGltZSgiJXklbSVkLSVIJU0lUyIpLCBzaG93X3N0YXRpc3RpYygxLCAxKSApICk7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICBjYWxsX291dCggIydjbGVhbnVwX2RhdGEsIDIsIG5hbWVzLCBpZHggKTsKICAgICAgICBMT0coIHNwcmludGYoIiVzOiBXQVJURSAyMHMgYmVpIEV2YWxjb3N0ICVPXG4iLAogICAgICAgICAgICAgICAgICAgICBzdHJmdGltZSgiJXklbSVkLSVIJU0lUyIpLCBnZXRfZXZhbF9jb3N0KCkpICk7CiAgICB9Cn0KCi8vIEJlaW0gRW50bGFkZW4gc3BlaWNoZXJuCnB1YmxpYyB2YXJhcmdzIGludCByZW1vdmUoIGludCBzaWxlbnQgKQp7CiAgICAvLyBWb3IgZGVtIEVudGZlcm5lbiBub2NoIHNjaG5lbGwgZGllIERhdGVuIHNpY2hlcm4KICAgIHNhdmVfb2JqZWN0KFNBVkVGSUxFKTsKICAgIGRlc3RydWN0KHRoaXNfb2JqZWN0KCkpOwoKICAgIHJldHVybiAxOwp9CgoKLy8gWnVtIERlYnVnZ2VuLiBOdXIgZvxyIFRpYW1hay4gQnp3LiBudW4gZnVlciBab29rLCBWYW5pb24sIFJ1bWF0YQojZGVmaW5lIEFMTE9XRUQgKHsiem9vayIsInZhbmlvbiIsInJ1bWF0YSIsInplc3N0cmEiLCJodW1uaSJ9KQojZGVmaW5lIE1BVENIKHgseSkgKHNpemVvZihyZWdleHAoeCx5KSkpCnB1YmxpYyBtYXBwaW5nIGdldF9wYXRobWFwKCkKewogIGlmICggIXRoaXNfaW50ZXJhY3RpdmUoKSB8fCAhTUFUQ0goQUxMT1dFRCxnZXR1aWQodGhpc19pbnRlcmFjdGl2ZSgpKSkKICAgICAgIHx8ICFwcmV2aW91c19vYmplY3QoKSB8fCAhTUFUQ0goQUxMT1dFRCxnZXR1aWQocHJldmlvdXNfb2JqZWN0KCkpKSkKICAgICAgICByZXR1cm4gKFtdKTsKCiAgICByZXR1cm4gcGF0aG1hcDsKfQpwdWJsaWMgbWFwcGluZyBnZXRfcGF0aGNhY2hlKCkKewogIGlmICggIXRoaXNfaW50ZXJhY3RpdmUoKSB8fCAhTUFUQ0goQUxMT1dFRCxnZXR1aWQodGhpc19pbnRlcmFjdGl2ZSgpKSkKICAgICAgIHx8ICFwcmV2aW91c19vYmplY3QoKSB8fCAhTUFUQ0goQUxMT1dFRCxnZXR1aWQocHJldmlvdXNfb2JqZWN0KCkpKSkKICAgICAgICByZXR1cm4gKFtdKTsKCiAgICByZXR1cm4gcGF0aGNhY2hlOwp9CgojdW5kZWYgQUxMT1dFRAojdW5kZWYgTUFUQ0gK