I2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KI2luY2x1ZGUgInVzYi5oIgojaW5jbHVkZSAic2NzaWdsdWUuaCIKI2luY2x1ZGUgInNtY29tbW9uLmgiCiNpbmNsdWRlICJzbWlsLmgiCgppbnQgICAgICAgICBDaGVja19EX0xvZ0NIUyAgICAgICAgICAgICAgKFdPUkQgKixCWVRFICosQllURSAqKTsKdm9pZCAgICAgICAgSW5pdGlhbGl6ZV9EX01lZGlhICAgICAgICAgICh2b2lkKTsKdm9pZCAgICAgICAgUG93ZXJPZmZfRF9NZWRpYSAgICAgICAgICAgICh2b2lkKTsKaW50ICAgICAgICAgQ2hlY2tfRF9NZWRpYVBvd2VyICAgICAgICAgICh2b2lkKTsKaW50ICAgICAgICAgQ2hlY2tfRF9NZWRpYUV4aXN0ICAgICAgICAgICh2b2lkKTsKaW50ICAgICAgICAgQ2hlY2tfRF9NZWRpYVdQICAgICAgICAgICAgICh2b2lkKTsKaW50ICAgICAgICAgQ2hlY2tfRF9NZWRpYUZtdCAgICAgICAgICAgIChzdHJ1Y3QgdXNfZGF0YSAqKTsKaW50ICAgICAgICAgQ2hlY2tfRF9NZWRpYUZtdEZvckVyYXNlQWxsIChzdHJ1Y3QgdXNfZGF0YSAqKTsKaW50ICAgICAgICAgQ29udl9EX01lZGlhQWRkciAgICAgICAgICAgIChzdHJ1Y3QgdXNfZGF0YSAqLCBEV09SRCk7CmludCAgICAgICAgIEluY19EX01lZGlhQWRkciAgICAgICAgICAgICAoc3RydWN0IHVzX2RhdGEgKik7CmludCAgICAgICAgIENoZWNrX0RfRmlyc3RTZWN0ICAgICAgICAgICAodm9pZCk7CmludCAgICAgICAgIENoZWNrX0RfTGFzdFNlY3QgICAgICAgICAgICAodm9pZCk7CmludCAgICAgICAgIE1lZGlhX0RfUmVhZE9uZVNlY3QgICAgICAgICAoc3RydWN0IHVzX2RhdGEgKiwgV09SRCwgQllURSAqKTsKaW50ICAgICAgICAgTWVkaWFfRF9Xcml0ZU9uZVNlY3QgICAgICAgIChzdHJ1Y3QgdXNfZGF0YSAqLCBXT1JELCBCWVRFICopOwppbnQgICAgICAgICBNZWRpYV9EX0NvcHlCbG9ja0hlYWQgICAgICAgKHN0cnVjdCB1c19kYXRhICopOwppbnQgICAgICAgICBNZWRpYV9EX0NvcHlCbG9ja1RhaWwgICAgICAgKHN0cnVjdCB1c19kYXRhICopOwppbnQgICAgICAgICBNZWRpYV9EX0VyYXNlT25lQmxvY2sgICAgICAgKHZvaWQpOwppbnQgICAgICAgICBNZWRpYV9EX0VyYXNlQWxsQmxvY2sgICAgICAgKHZvaWQpOwoKaW50ICBDb3B5X0RfQmxvY2tBbGwgICAgICAgICAgICAgKHN0cnVjdCB1c19kYXRhICosIERXT1JEKTsKaW50ICBDb3B5X0RfQmxvY2tIZWFkICAgICAgICAgICAgKHN0cnVjdCB1c19kYXRhICopOwppbnQgIENvcHlfRF9CbG9ja1RhaWwgICAgICAgICAgICAoc3RydWN0IHVzX2RhdGEgKik7CmludCAgUmVhc3NpZ25fRF9CbG9ja0hlYWQgICAgICAgIChzdHJ1Y3QgdXNfZGF0YSAqKTsKCmludCAgQXNzaWduX0RfV3JpdGVCbG9jayAgICAgICAgICh2b2lkKTsKaW50ICBSZWxlYXNlX0RfUmVhZEJsb2NrICAgICAgICAgKHN0cnVjdCB1c19kYXRhICopOwppbnQgIFJlbGVhc2VfRF9Xcml0ZUJsb2NrICAgICAgICAoc3RydWN0IHVzX2RhdGEgKik7CmludCAgUmVsZWFzZV9EX0NvcHlTZWN0b3IgICAgICAgIChzdHJ1Y3QgdXNfZGF0YSAqKTsKCmludCAgQ29weV9EX1BoeU9uZVNlY3QgICAgICAgICAgIChzdHJ1Y3QgdXNfZGF0YSAqKTsKaW50ICBSZWFkX0RfUGh5T25lU2VjdCAgICAgICAgICAgKHN0cnVjdCB1c19kYXRhICosIFdPUkQsIEJZVEUgKik7CmludCAgV3JpdGVfRF9QaHlPbmVTZWN0ICAgICAgICAgIChzdHJ1Y3QgdXNfZGF0YSAqLCBXT1JELCBCWVRFICopOwppbnQgIEVyYXNlX0RfUGh5T25lQmxvY2sgICAgICAgICAoc3RydWN0IHVzX2RhdGEgKik7CgppbnQgIFNldF9EX1BoeUZtdFZhbHVlICAgICAgICAgICAoc3RydWN0IHVzX2RhdGEgKik7CmludCAgU2VhcmNoX0RfQ0lTICAgICAgICAgICAgICAgIChzdHJ1Y3QgdXNfZGF0YSAqKTsKaW50ICBNYWtlX0RfTG9nVGFibGUgICAgICAgICAgICAgKHN0cnVjdCB1c19kYXRhICopOwp2b2lkIENoZWNrX0RfQmxvY2tJc0Z1bGwgICAgICAgICAodm9pZCk7CgppbnQgIE1hcmtGYWlsX0RfUGh5T25lQmxvY2sgICAgICAoc3RydWN0IHVzX2RhdGEgKik7CgpEV09SRCBFcnJYRENvZGU7CkRXT1JEIEVyckNvZGU7Ci8vQllURSAgU2VjdEJ1ZltTRUNUU0laRV07CkJZVEUgIFdvcmtCdWZbU0VDVFNJWkVdOwpCWVRFICBSZWR1bmRhbnRbUkVEVFNJWkVdOwpCWVRFICBXb3JrUmVkdW5kW1JFRFRTSVpFXTsKLy9XT1JEICBMb2cyUGh5W01BWF9aT05FTlVNXVtNQVhfTE9HQkxPQ0tdOwpXT1JEICAqTG9nMlBoeVtNQVhfWk9ORU5VTV07ICAgICAgICAgICAgICAgICAvLyAxMjggeCAxMDAwLCAgIExvZzJQaHlbTUFYX1pPTkVOVU1dW01BWF9MT0dCTE9DS107CkJZVEUgIEFzc2lnbltNQVhfWk9ORU5VTV1bTUFYX0JMT0NLTlVNLzhdOwpXT1JEICBBc3NpZ25TdGFydFtNQVhfWk9ORU5VTV07CldPUkQgIFJlYWRCbG9jazsKV09SRCAgV3JpdGVCbG9jazsKRFdPUkQgTWVkaWFDaGFuZ2U7CkRXT1JEIFNlY3RDb3B5TW9kZTsKCmV4dGVybiBzdHJ1Y3QgU1NGRENUWVBFICBTc2ZkYzsKZXh0ZXJuIHN0cnVjdCBBRERSRVNTICAgIE1lZGlhOwpleHRlcm4gc3RydWN0IENJU19BUkVBICAgQ2lzQXJlYTsKCi8vQklUIENvbnRyb2wgTWFjcm8KQllURSBCaXREYXRhW10gPSB7IDB4MDEsMHgwMiwweDA0LDB4MDgsMHgxMCwweDIwLDB4NDAsMHg4MCB9IDsKI2RlZmluZSBTZXRfRF9CaXQoYSxiKSAgICAoYVsoQllURSkoKGIpLzgpXXw9IEJpdERhdGFbKGIpJThdKQojZGVmaW5lIENscl9EX0JpdChhLGIpICAgIChhWyhCWVRFKSgoYikvOCldJj1+Qml0RGF0YVsoYiklOF0pCiNkZWZpbmUgQ2hrX0RfQml0KGEsYikgICAgKGFbKEJZVEUpKChiKS84KV0gJiBCaXREYXRhWyhiKSU4XSkKCi8vZXh0ZXJuIFBCWVRFICAgIFNNSG9zdEFkZHI7CmV4dGVybiBCWVRFICAgICBJc1NTRkRDQ29tcGxpYW5jZTsKZXh0ZXJuIEJZVEUgICAgIElzWERDb21wbGlhbmNlOwoKCi8vCi8vLy9Qb3dlciBDb250cm9sICYgTWVkaWEgRXhpc3QgQ2hlY2sgRnVuY3Rpb24KLy8vLy0tLS0tIEluaXRfRF9TbWFydE1lZGlhKCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy9pbnQgSW5pdF9EX1NtYXJ0TWVkaWEodm9pZCkKLy97Ci8vICAgIGludCAgICAgaTsKLy8KLy8gICAgRU1DUl9QcmludCgiSW5pdF9EX1NtYXJ0TWVkaWEgc3RhcnRcbiIpOwovLyAgICBmb3IgKGk9MDsgaTxNQVhfWk9ORU5VTTsgaSsrKQovLyAgICB7Ci8vICAgICAgICBpZiAoTG9nMlBoeVtpXSE9TlVMTCkKLy8gICAgICAgIHsKLy8gICAgICAgICAgICBFTUNSX1ByaW50KCJFeEZyZWVQb29sIFpvbmUgPSAleCwgQWRkciA9ICV4XG4iLCBpLCBMb2cyUGh5W2ldKTsKLy8gICAgICAgICAgICBFeEZyZWVQb29sKExvZzJQaHlbaV0pOwovLyAgICAgICAgICAgIExvZzJQaHlbaV0gPSBOVUxMOwovLyAgICAgICAgfQovLyAgICB9Ci8vCi8vICAgIEluaXRpYWxpemVfRF9NZWRpYSgpOwovLyAgICByZXR1cm4oTk9fRVJST1IpOwovL30KCi8vLS0tLS0gU01fRnJlZU1lbSgpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KaW50IFNNX0ZyZWVNZW0odm9pZCkKewoJaW50CWk7CgoJcHJpbnRrKCJTTV9GcmVlTWVtIHN0YXJ0XG4iKTsKCWZvciAoaT0wOyBpPE1BWF9aT05FTlVNOyBpKyspCgl7CgkJaWYgKExvZzJQaHlbaV0hPU5VTEwpCgkJewoJCQlwcmludGsoIkZyZWUgWm9uZSA9ICV4LCBBZGRyID0gJXBcbiIsIGksIExvZzJQaHlbaV0pOwoJCQlrZnJlZShMb2cyUGh5W2ldKTsKCQkJTG9nMlBoeVtpXSA9IE5VTEw7CgkJfQoJfQoJcmV0dXJuKE5PX0VSUk9SKTsKfQoKLy8vLy0tLS0tIFB3b2ZmX0RfU21hcnRNZWRpYSgpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy9pbnQgUHdvZmZfRF9TbWFydE1lZGlhKHZvaWQpCi8vewovLyAgICBQb3dlck9mZl9EX01lZGlhKCk7Ci8vICAgIHJldHVybihOT19FUlJPUik7Ci8vfQovLwovLy8vLS0tLS0gQ2hlY2tfRF9TbWFydE1lZGlhKCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovL2ludCBDaGVja19EX1NtYXJ0TWVkaWEodm9pZCkKLy97Ci8vICAgIGlmIChDaGVja19EX01lZGlhRXhpc3QoKSkKLy8gICAgICAgIHJldHVybihFcnJDb2RlKTsKLy8KLy8gICAgcmV0dXJuKE5PX0VSUk9SKTsKLy99Ci8vCi8vLy8tLS0tLSBDaGVja19EX1BhcmFtZXRlcigpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vaW50IENoZWNrX0RfUGFyYW1ldGVyKFBGRE9fREVWSUNFX0VYVEVOU0lPTiBmZG9FeHQsV09SRCAqcGN5bCxCWVRFICpwaGVhZCxCWVRFICpwc2VjdCkKLy97Ci8vICAgIGlmIChDaGVja19EX01lZGlhUG93ZXIoKSkKLy8gICAgICAgIHJldHVybihFcnJDb2RlKTsKLy8KLy8gICAgaWYgKENoZWNrX0RfTWVkaWFGbXQoZmRvRXh0KSkKLy8gICAgICAgIHJldHVybihFcnJDb2RlKTsKLy8KLy8gICAgaWYgKENoZWNrX0RfTG9nQ0hTKHBjeWwscGhlYWQscHNlY3QpKQovLyAgICAgICAgcmV0dXJuKEVyckNvZGUpOwovLwovLyAgICByZXR1cm4oTk9fRVJST1IpOwovL30KCi8vU21hcnRNZWRpYSBSZWFkL1dyaXRlL0VyYXNlIEZ1bmN0aW9uCi8vLS0tLS0gTWVkaWFfRF9SZWFkU2VjdG9yKCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQppbnQgTWVkaWFfRF9SZWFkU2VjdG9yKHN0cnVjdCB1c19kYXRhICp1cywgRFdPUkQgc3RhcnQsV09SRCBjb3VudCxCWVRFICpidWYpCnsKCVdPUkQgbGVuLCBibjsKCgkvL2lmIChDaGVja19EX01lZGlhUG93ZXIoKSkgICAgICAgIDsgpmIgNjI1MCBkb24ndCBjYXJlCgkvLyAgICByZXR1cm4oRXJyQ29kZSk7CgkvL2lmIChDaGVja19EX01lZGlhRm10KGZkb0V4dCkpICAgIDsKCS8vICAgIHJldHVybihFcnJDb2RlKTsKCWlmIChDb252X0RfTWVkaWFBZGRyKHVzLCBzdGFydCkpCgkJcmV0dXJuKEVyckNvZGUpOwoKCXdoaWxlKDEpCgl7CgkJbGVuID0gU3NmZGMuTWF4U2VjdG9ycyAtIE1lZGlhLlNlY3RvcjsKCQlpZiAoY291bnQgPiBsZW4pCgkJCWJuID0gbGVuOwoJCWVsc2UKCQkJYm4gPSBjb3VudDsKCQkvL2lmIChNZWRpYV9EX1JlYWRPbmVTZWN0KGZkb0V4dCwgU2VjdEJ1ZikpCgkJLy9pZiAoTWVkaWFfRF9SZWFkT25lU2VjdChmZG9FeHQsIGNvdW50LCBidWYpKQoJCWlmIChNZWRpYV9EX1JlYWRPbmVTZWN0KHVzLCBibiwgYnVmKSkKCQl7CgkJCUVyckNvZGUgPSBFUlJfRWNjUmVhZEVycjsKCQkJcmV0dXJuKEVyckNvZGUpOwoJCX0KCgkJTWVkaWEuU2VjdG9yICs9IGJuOwoJCWNvdW50IC09IGJuOwoKCQlpZiAoY291bnQ8PTApCgkJCWJyZWFrOwoKCQlidWYgKz0gYm4gKiBTRUNUU0laRTsKCgkJaWYgKEluY19EX01lZGlhQWRkcih1cykpCgkJCXJldHVybihFcnJDb2RlKTsKCX0KCglyZXR1cm4oTk9fRVJST1IpOwp9Ci8vIGhlcmUKLy8tLS0tLSBNZWRpYV9EX0NvcHlTZWN0b3IoKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KaW50IE1lZGlhX0RfQ29weVNlY3RvcihzdHJ1Y3QgdXNfZGF0YSAqdXMsIERXT1JEIHN0YXJ0LFdPUkQgY291bnQsQllURSAqYnVmKQp7CgkvL0RXT1JEIG1vZGU7CgkvL2ludCBpOwoJV09SRCBsZW4sIGJuOwoJLy9TU0ZEQ1RZUEVfVCBhYSA9IChTU0ZEQ1RZUEVfVCApICZTc2ZkYzsKCS8vQUREUkVTU19UICAgYmIgPSAoQUREUkVTU19UKSAmTWVkaWE7CgoJLy9wcmludGsoIk1lZGlhX0RfQ29weVNlY3RvciAhISFcbiIpOwoJaWYgKENvbnZfRF9NZWRpYUFkZHIodXMsIHN0YXJ0KSkKCQlyZXR1cm4oRXJyQ29kZSk7CgoJd2hpbGUoMSkKCXsKCQlpZiAoQXNzaWduX0RfV3JpdGVCbG9jaygpKQoJCQlyZXR1cm4oRVJST1IpOwoKCQlsZW4gPSBTc2ZkYy5NYXhTZWN0b3JzIC0gTWVkaWEuU2VjdG9yOwoJCWlmIChjb3VudCA+IGxlbikKCQkJYm4gPSBsZW47CgkJZWxzZQoJCWJuID0gY291bnQ7CgoJCS8vaWYgKFNzZmRjX0RfQ29weUJsb2NrKGZkb0V4dCxjb3VudCxidWYsUmVkdW5kYW50KSkKCQlpZiAoU3NmZGNfRF9Db3B5QmxvY2sodXMsYm4sYnVmLFJlZHVuZGFudCkpCgkJewoJCQlFcnJDb2RlID0gRVJSX1dyaXRlRmF1bHQ7CgkJCXJldHVybihFcnJDb2RlKTsKCQl9CgoJCU1lZGlhLlNlY3RvciA9IDB4MUY7CgkJLy9pZiAoUmVsZWFzZV9EX1JlYWRCbG9jayhmZG9FeHQpKQoJCWlmIChSZWxlYXNlX0RfQ29weVNlY3Rvcih1cykpCgkJewoJCQlpZiAoRXJyQ29kZT09RVJSX0h3RXJyb3IpCgkJCXsKCQkJCUVyckNvZGUgPSBFUlJfV3JpdGVGYXVsdDsKCQkJCXJldHVybihFcnJDb2RlKTsKCQkJfQoJCX0KCQljb3VudCAtPSBibjsKCgkJaWYgKGNvdW50PD0wKQoJCQlicmVhazsKCgkJYnVmICs9IGJuICogU0VDVFNJWkU7CgoJCWlmIChJbmNfRF9NZWRpYUFkZHIodXMpKQoJCQlyZXR1cm4oRXJyQ29kZSk7CgoJfQoJcmV0dXJuKE5PX0VSUk9SKTsKfQoKLy8tLS0tLSBSZWxlYXNlX0RfQ29weVNlY3RvcigpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQppbnQgUmVsZWFzZV9EX0NvcHlTZWN0b3Ioc3RydWN0IHVzX2RhdGEgKnVzKQp7CgkvL1NTRkRDVFlQRV9UIGFhID0gKFNTRkRDVFlQRV9UICkgJlNzZmRjOwoJLy9BRERSRVNTX1QgICBiYiA9IChBRERSRVNTX1QpICZNZWRpYTsKCglMb2cyUGh5W01lZGlhLlpvbmVdW01lZGlhLkxvZ0Jsb2NrXT1Xcml0ZUJsb2NrOwoJTWVkaWEuUGh5QmxvY2s9UmVhZEJsb2NrOwoKCWlmIChNZWRpYS5QaHlCbG9jaz09Tk9fQVNTSUdOKQoJewoJCU1lZGlhLlBoeUJsb2NrPVdyaXRlQmxvY2s7CgkJcmV0dXJuKFNVQ0NFU1MpOwoJfQoKCUNscl9EX0JpdChBc3NpZ25bTWVkaWEuWm9uZV0sTWVkaWEuUGh5QmxvY2spOwoJTWVkaWEuUGh5QmxvY2s9V3JpdGVCbG9jazsKCglyZXR1cm4oU1VDQ0VTUyk7Cn0KLyoKLy8tLS0tLSBNZWRpYV9EX1dyaXRlU2VjdG9yKCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmludCBNZWRpYV9EX1dyaXRlU2VjdG9yKFBGRE9fREVWSUNFX0VYVEVOU0lPTiBmZG9FeHQsIERXT1JEIHN0YXJ0LFdPUkQgY291bnQsQllURSAqYnVmKQp7CiAgICBpbnQgaTsKICAgIFdPUkQgbGVuLCBibjsKICAgIFNTRkRDVFlQRV9UIGFhID0gKFNTRkRDVFlQRV9UICkgJlNzZmRjOwogICAgQUREUkVTU19UICAgYmIgPSAoQUREUkVTU19UKSAmTWVkaWE7CgogICAgLy9pZiAoQ2hlY2tfRF9NZWRpYVBvd2VyKCkpCiAgICAvLyAgICByZXR1cm4oRXJyQ29kZSk7CiAgICAvLwogICAgLy9pZiAoQ2hlY2tfRF9NZWRpYUZtdChmZG9FeHQpKQogICAgLy8gICAgcmV0dXJuKEVyckNvZGUpOwogICAgLy8KICAgIC8vaWYgKENoZWNrX0RfTWVkaWFXUCgpKQogICAgLy8gICAgcmV0dXJuKEVyckNvZGUpOwoKICAgIGlmIChDb252X0RfTWVkaWFBZGRyKGZkb0V4dCwgc3RhcnQpKQogICAgICAgIHJldHVybihFcnJDb2RlKTsKCiAgICAvL0VORV9QcmludCgiTWVkaWFfRF9Xcml0ZVNlY3RvciAtLS0gU2VjdG9yID0gJXhcbiIsIE1lZGlhLlNlY3Rvcik7CiAgICBpZiAoQ2hlY2tfRF9GaXJzdFNlY3QoKSkKICAgIHsKICAgICAgICBpZiAoTWVkaWFfRF9Db3B5QmxvY2tIZWFkKGZkb0V4dCkpCiAgICAgICAgewogICAgICAgICAgICBFcnJDb2RlID0gRVJSX1dyaXRlRmF1bHQ7CiAgICAgICAgICAgIHJldHVybihFcnJDb2RlKTsKICAgICAgICB9CiAgICB9CgogICAgd2hpbGUoMSkKICAgIHsKICAgICAgICBpZiAoIUNoZWNrX0RfRmlyc3RTZWN0KCkpCiAgICAgICAgewogICAgICAgICAgICBpZiAoQXNzaWduX0RfV3JpdGVCbG9jaygpKQogICAgICAgICAgICAgICAgcmV0dXJuKEVyckNvZGUpOwogICAgICAgIH0KCiAgICAgICAgbGVuID0gU3NmZGMuTWF4U2VjdG9ycyAtIE1lZGlhLlNlY3RvcjsKICAgICAgICBpZiAoY291bnQgPiBsZW4pCiAgICAgICAgICAgYm4gPSBsZW47CiAgICAgICAgZWxzZQogICAgICAgICAgIGJuID0gY291bnQ7CiAgICAgICAgLy9mb3IoaT0wO2k8U0VDVFNJWkU7aSsrKQogICAgICAgIC8vICAgIFNlY3RCdWZbaV09KmJ1ZisrOwoKICAgICAgICAvL2lmIChNZWRpYV9EX1dyaXRlT25lU2VjdChmZG9FeHQsIFNlY3RCdWYpKQogICAgICAgIGlmIChNZWRpYV9EX1dyaXRlT25lU2VjdChmZG9FeHQsIGJuLCBidWYpKQogICAgICAgIHsKICAgICAgICAgICAgRXJyQ29kZSA9IEVSUl9Xcml0ZUZhdWx0OwogICAgICAgICAgICByZXR1cm4oRXJyQ29kZSk7CiAgICAgICAgfQoKICAgICAgICBNZWRpYS5TZWN0b3IgKz0gYm4gLSAxOwoKICAgICAgICBpZiAoIUNoZWNrX0RfTGFzdFNlY3QoKSkKICAgICAgICB7CiAgICAgICAgICAgIGlmIChSZWxlYXNlX0RfUmVhZEJsb2NrKGZkb0V4dCkpCgogICAgICAgICAgICB7ICAgIGlmIChFcnJDb2RlPT1FUlJfSHdFcnJvcikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBFcnJDb2RlID0gRVJSX1dyaXRlRmF1bHQ7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuKEVyckNvZGUpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBjb3VudCAtPSBibjsKCiAgICAgICAgaWYgKGNvdW50PD0wKQogICAgICAgICAgICBicmVhazsKCiAgICAgICAgYnVmICs9IGJuICogU0VDVFNJWkU7CgogICAgICAgIC8vaWYgKC0tY291bnQ8PTApCiAgICAgICAgLy8gICAgYnJlYWs7CgogICAgICAgIGlmIChJbmNfRF9NZWRpYUFkZHIoZmRvRXh0KSkKICAgICAgICAgICAgcmV0dXJuKEVyckNvZGUpOwogICAgfQoKICAgIGlmICghQ2hlY2tfRF9MYXN0U2VjdCgpKQogICAgICAgIHJldHVybihOT19FUlJPUik7CgogICAgaWYgKEluY19EX01lZGlhQWRkcihmZG9FeHQpKQogICAgICAgIHJldHVybihFcnJDb2RlKTsKCiAgICBpZiAoTWVkaWFfRF9Db3B5QmxvY2tUYWlsKGZkb0V4dCkpCiAgICB7CiAgICAgICAgRXJyQ29kZSA9IEVSUl9Xcml0ZUZhdWx0OwogICAgICAgIHJldHVybihFcnJDb2RlKTsKICAgIH0KCiAgICByZXR1cm4oTk9fRVJST1IpOwp9Ci8vCi8vLy8tLS0tLSBNZWRpYV9EX0VyYXNlQmxvY2soKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vaW50IE1lZGlhX0RfRXJhc2VCbG9jayhQRkRPX0RFVklDRV9FWFRFTlNJT04gZmRvRXh0LCBEV09SRCBzdGFydCxXT1JEIGNvdW50KQovL3sKLy8gICAgaWYgKENoZWNrX0RfTWVkaWFQb3dlcigpKQovLyAgICAgICAgcmV0dXJuKEVyckNvZGUpOwovLwovLyAgICBpZiAoQ2hlY2tfRF9NZWRpYUZtdChmZG9FeHQpKQovLyAgICAgICAgcmV0dXJuKEVyckNvZGUpOwovLwovLyAgICBpZiAoQ2hlY2tfRF9NZWRpYVdQKCkpCi8vICAgICAgICByZXR1cm4oRXJyQ29kZSk7Ci8vCi8vICAgIGlmIChDb252X0RfTWVkaWFBZGRyKHN0YXJ0KSkKLy8gICAgICAgIHJldHVybihFcnJDb2RlKTsKLy8KLy8gICAgd2hpbGUoQ2hlY2tfRF9GaXJzdFNlY3QoKSkgewovLyAgICAgICAgaWYgKEluY19EX01lZGlhQWRkcihmZG9FeHQpKQovLyAgICAgICAgICAgIHJldHVybihFcnJDb2RlKTsKLy8KLy8gICAgICAgIGlmICgtLWNvdW50PD0wKQovLyAgICAgICAgICAgIHJldHVybihOT19FUlJPUik7Ci8vICAgIH0KLy8KLy8gICAgd2hpbGUoMSkgewovLyAgICAgICAgaWYgKCFDaGVja19EX0xhc3RTZWN0KCkpCi8vICAgICAgICAgICAgaWYgKE1lZGlhX0RfRXJhc2VPbmVCbG9jaygpKQovLyAgICAgICAgICAgICAgICBpZiAoRXJyQ29kZT09RVJSX0h3RXJyb3IpCi8vICAgICAgICAgICAgICAgIHsKLy8gICAgICAgICAgICAgICAgICAgIEVyckNvZGUgPSBFUlJfV3JpdGVGYXVsdDsKLy8gICAgICAgICAgICAgICAgICAgIHJldHVybihFcnJDb2RlKTsKLy8gICAgICAgICAgICAgICAgfQovLwovLyAgICAgICAgaWYgKEluY19EX01lZGlhQWRkcihmZG9FeHQpKQovLyAgICAgICAgICAgIHJldHVybihFcnJDb2RlKTsKLy8KLy8gICAgICAgIGlmICgtLWNvdW50PD0wKQovLyAgICAgICAgICAgIHJldHVybihOT19FUlJPUik7Ci8vICAgIH0KLy99Ci8vCi8vLy8tLS0tLSBNZWRpYV9EX0VyYXNlQWxsKCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vaW50IE1lZGlhX0RfRXJhc2VBbGwoUEZET19ERVZJQ0VfRVhURU5TSU9OIGZkb0V4dCkKLy97Ci8vICAgIGlmIChDaGVja19EX01lZGlhUG93ZXIoKSkKLy8gICAgICAgIHJldHVybihFcnJDb2RlKTsKLy8KLy8gICAgaWYgKENoZWNrX0RfTWVkaWFGbXRGb3JFcmFzZUFsbChmZG9FeHQpKQovLyAgICAgICAgcmV0dXJuKEVyckNvZGUpOwovLwovLyAgICBpZiAoQ2hlY2tfRF9NZWRpYVdQKCkpCi8vICAgICAgICByZXR1cm4oRXJyQ29kZSk7Ci8vCi8vICAgIGlmIChNZWRpYV9EX0VyYXNlQWxsQmxvY2soKSkKLy8gICAgICAgIHJldHVybihFcnJDb2RlKTsKLy8KLy8gICAgcmV0dXJuKE5PX0VSUk9SKTsKLy99CgovL1NtYXJ0TWVkaWEgV3JpdGUgRnVuY3Rpb24gZm9yIE9uZSBTZWN0b3IgV3JpdGUgTW9kZQovLy0tLS0tIE1lZGlhX0RfT25lU2VjdFdyaXRlU3RhcnQoKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KaW50IE1lZGlhX0RfT25lU2VjdFdyaXRlU3RhcnQoUEZET19ERVZJQ0VfRVhURU5TSU9OIGZkb0V4dCxEV09SRCBzdGFydCxCWVRFICpidWYpCnsKLy8gIGludCBpOwovLyAgU1NGRENUWVBFX1QgYWEgPSAoU1NGRENUWVBFX1QgKSAmU3NmZGM7Ci8vICBBRERSRVNTX1QgICBiYiA9IChBRERSRVNTX1QpICZNZWRpYTsKLy8KLy8gIC8vaWYgKENoZWNrX0RfTWVkaWFQb3dlcigpKQovLyAgLy8gICAgcmV0dXJuKEVyckNvZGUpOwovLyAgLy9pZiAoQ2hlY2tfRF9NZWRpYUZtdChmZG9FeHQpKQovLyAgLy8gICAgcmV0dXJuKEVyckNvZGUpOwovLyAgLy9pZiAoQ2hlY2tfRF9NZWRpYVdQKCkpCi8vICAvLyAgICByZXR1cm4oRXJyQ29kZSk7Ci8vICBpZiAoQ29udl9EX01lZGlhQWRkcihmZG9FeHQsIHN0YXJ0KSkKLy8gICAgICByZXR1cm4oRXJyQ29kZSk7Ci8vCi8vICBpZiAoQ2hlY2tfRF9GaXJzdFNlY3QoKSkKLy8gICAgICBpZiAoTWVkaWFfRF9Db3B5QmxvY2tIZWFkKGZkb0V4dCkpCi8vICAgICAgewovLyAgICAgICAgICBFcnJDb2RlID0gRVJSX1dyaXRlRmF1bHQ7Ci8vICAgICAgICAgIHJldHVybihFcnJDb2RlKTsKLy8gICAgICB9Ci8vCi8vICBpZiAoIUNoZWNrX0RfRmlyc3RTZWN0KCkpCi8vICAgICAgaWYgKEFzc2lnbl9EX1dyaXRlQmxvY2soKSkKLy8gICAgICAgICAgcmV0dXJuKEVyckNvZGUpOwovLwovLyAgLy9mb3IoaT0wO2k8U0VDVFNJWkU7aSsrKQovLyAgLy8gICAgU2VjdEJ1ZltpXT0qYnVmKys7Ci8vCi8vICAvL2lmIChNZWRpYV9EX1dyaXRlT25lU2VjdChmZG9FeHQsIFNlY3RCdWYpKQovLyAgaWYgKE1lZGlhX0RfV3JpdGVPbmVTZWN0KGZkb0V4dCwgYnVmKSkKLy8gIHsKLy8gICAgICBFcnJDb2RlID0gRVJSX1dyaXRlRmF1bHQ7Ci8vICAgICAgcmV0dXJuKEVyckNvZGUpOwovLyAgfQovLwovLyAgaWYgKCFDaGVja19EX0xhc3RTZWN0KCkpCi8vICB7Ci8vICAgICAgaWYgKFJlbGVhc2VfRF9SZWFkQmxvY2soZmRvRXh0KSkKLy8gICAgICAgICAgaWYgKEVyckNvZGU9PUVSUl9Id0Vycm9yKQovLyAgICAgICAgICB7Ci8vICAgICAgICAgICAgICBFcnJDb2RlID0gRVJSX1dyaXRlRmF1bHQ7Ci8vICAgICAgICAgICAgICByZXR1cm4oRXJyQ29kZSk7Ci8vICAgICAgICAgIH0KLy8gIH0KCiAgICByZXR1cm4oTk9fRVJST1IpOwp9CgovLy0tLS0tIE1lZGlhX0RfT25lU2VjdFdyaXRlTmV4dCgpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KaW50IE1lZGlhX0RfT25lU2VjdFdyaXRlTmV4dChQRkRPX0RFVklDRV9FWFRFTlNJT04gZmRvRXh0LCBCWVRFICpidWYpCnsKLy8gIGludCBpOwovLyAgU1NGRENUWVBFX1QgYWEgPSAoU1NGRENUWVBFX1QgKSAmU3NmZGM7Ci8vICBBRERSRVNTX1QgICBiYiA9IChBRERSRVNTX1QpICZNZWRpYTsKLy8KLy8gIGlmIChJbmNfRF9NZWRpYUFkZHIoZmRvRXh0KSkKLy8gICAgICByZXR1cm4oRXJyQ29kZSk7Ci8vCi8vICBpZiAoIUNoZWNrX0RfRmlyc3RTZWN0KCkpCi8vICAgIGlmIChBc3NpZ25fRF9Xcml0ZUJsb2NrKCkpCi8vICAgICAgcmV0dXJuKEVyckNvZGUpOwovLwovLyAgLy9mb3IoaT0wO2k8U0VDVFNJWkU7aSsrKQovLyAgLy8gICAgU2VjdEJ1ZltpXT0qYnVmKys7Ci8vCi8vICAvL2lmIChNZWRpYV9EX1dyaXRlT25lU2VjdChmZG9FeHQsIFNlY3RCdWYpKQovLyAgaWYgKE1lZGlhX0RfV3JpdGVPbmVTZWN0KGZkb0V4dCwgYnVmKSkKLy8gIHsKLy8gICAgICBFcnJDb2RlID0gRVJSX1dyaXRlRmF1bHQ7Ci8vICAgICAgcmV0dXJuKEVyckNvZGUpOwovLyAgfQovLwovLyAgaWYgKCFDaGVja19EX0xhc3RTZWN0KCkpCi8vICB7Ci8vICAgICAgaWYgKFJlbGVhc2VfRF9SZWFkQmxvY2soZmRvRXh0KSkKLy8gICAgICAgICAgaWYgKEVyckNvZGU9PUVSUl9Id0Vycm9yKQovLyAgICAgICAgICB7Ci8vICAgICAgICAgICAgICBFcnJDb2RlID0gRVJSX1dyaXRlRmF1bHQ7Ci8vICAgICAgICAgICAgICByZXR1cm4oRXJyQ29kZSk7Ci8vICAgICAgICAgIH0KLy8gIH0KCiAgICByZXR1cm4oTk9fRVJST1IpOwp9CgovLy0tLS0tIE1lZGlhX0RfT25lU2VjdFdyaXRlRmx1c2goKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KaW50IE1lZGlhX0RfT25lU2VjdFdyaXRlRmx1c2goUEZET19ERVZJQ0VfRVhURU5TSU9OIGZkb0V4dCkKewogICAgaWYgKCFDaGVja19EX0xhc3RTZWN0KCkpCiAgICAgICAgcmV0dXJuKE5PX0VSUk9SKTsKCiAgICBpZiAoSW5jX0RfTWVkaWFBZGRyKGZkb0V4dCkpCiAgICAgICAgcmV0dXJuKEVyckNvZGUpOwoKICAgIGlmIChNZWRpYV9EX0NvcHlCbG9ja1RhaWwoZmRvRXh0KSkKICAgIHsKICAgICAgICBFcnJDb2RlID0gRVJSX1dyaXRlRmF1bHQ7CiAgICAgICAgcmV0dXJuKEVyckNvZGUpOwogICAgfQoKICAgIHJldHVybihOT19FUlJPUik7Cn0KLy8KLy8vL0xFRCBUZXJuIE9uL09mZiBTdWJyb3V0aW5lCi8vLy8tLS0tLSBTTV9FbmFibGVMRUQoKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovL3ZvaWQgU01fRW5hYmxlTEVEKFBGRE9fREVWSUNFX0VYVEVOU0lPTiBmZG9FeHQsIEJPT0xFQU4gZW5hYmxlKQovL3sKLy8gICAgaWYgKGZkb0V4dC0+RHJpdmVfSXNTV0xFRCkKLy8gICAgewovLyAgICAgICAgaWYgKGVuYWJsZSkKLy8gICAgICAgICAgIExlZF9EX1Rlcm5PbigpOwovLyAgICAgICAgZWxzZQovLyAgICAgICAgICAgTGVkX0RfVGVybk9mZigpOwovLyAgICB9Ci8vfQovLwovLy8vLS0tLS0gTGVkX0RfVGVybk9uKCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovL3ZvaWQgTGVkX0RfVGVybk9uKHZvaWQpCi8vewovLyAgICBpZiAoQ2hlY2tfRF9DYXJkU3RzQ2hnKCkpCi8vICAgICAgICBNZWRpYUNoYW5nZT1FUlJPUjsKLy8KLy8gICAgQ250X0RfTGVkT24oKTsKLy99Ci8vCi8vLy8tLS0tLSBMZWRfRF9UZXJuT2ZmKCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vdm9pZCBMZWRfRF9UZXJuT2ZmKHZvaWQpCi8vewovLyAgICBpZiAoQ2hlY2tfRF9DYXJkU3RzQ2hnKCkpCi8vICAgICAgICBNZWRpYUNoYW5nZT1FUlJPUjsKLy8KLy8gICAgQ250X0RfTGVkT2ZmKCk7Ci8vfQovLwovLy8vU21hcnRNZWRpYSBMb2dpY2FsIEZvcm1hdCBTdWJyb3V0aW5lCi8vLy8tLS0tLSBDaGVja19EX0xvZ0NIUygpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vaW50IENoZWNrX0RfTG9nQ0hTKFdPUkQgKmMsQllURSAqaCxCWVRFICpzKQovL3sKLy8gICAgc3dpdGNoKFNzZmRjLk1vZGVsKSB7Ci8vICAgICAgICBjYXNlIFNTRkRDMU1COiAgICpjPTEyNTsgKmg9IDQ7ICpzPSA0OyBicmVhazsKLy8gICAgICAgIGNhc2UgU1NGREMyTUI6ICAgKmM9MTI1OyAqaD0gNDsgKnM9IDg7IGJyZWFrOwovLyAgICAgICAgY2FzZSBTU0ZEQzRNQjogICAqYz0yNTA7ICpoPSA0OyAqcz0gODsgYnJlYWs7Ci8vICAgICAgICBjYXNlIFNTRkRDOE1COiAgICpjPTI1MDsgKmg9IDQ7ICpzPTE2OyBicmVhazsKLy8gICAgICAgIGNhc2UgU1NGREMxNk1COiAgKmM9NTAwOyAqaD0gNDsgKnM9MTY7IGJyZWFrOwovLyAgICAgICAgY2FzZSBTU0ZEQzMyTUI6ICAqYz01MDA7ICpoPSA4OyAqcz0xNjsgYnJlYWs7Ci8vICAgICAgICBjYXNlIFNTRkRDNjRNQjogICpjPTUwMDsgKmg9IDg7ICpzPTMyOyBicmVhazsKLy8gICAgICAgIGNhc2UgU1NGREMxMjhNQjogKmM9NTAwOyAqaD0xNjsgKnM9MzI7IGJyZWFrOwovLyAgICAgICAgZGVmYXVsdDogICAgICAgICAqYz0gMDsgICpoPSAwOyAqcz0gMDsgRXJyQ29kZSA9IEVSUl9Ob1NtYXJ0TWVkaWE7ICAgIHJldHVybihFUlJPUik7Ci8vICAgIH0KLy8KLy8gICAgcmV0dXJuKFNVQ0NFU1MpOwovL30KLy8KLy8vL1Bvd2VyIENvbnRyb2wgJiBNZWRpYSBFeGlzdCBDaGVjayBTdWJyb3V0aW5lCi8vLy8tLS0tLSBJbml0aWFsaXplX0RfTWVkaWEoKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vdm9pZCBJbml0aWFsaXplX0RfTWVkaWEodm9pZCkKLy97Ci8vICAgIEVyckNvZGUgICAgICA9IE5PX0VSUk9SOwovLyAgICBNZWRpYUNoYW5nZSAgPSBFUlJPUjsKLy8gICAgU2VjdENvcHlNb2RlID0gQ09NUExFVEVEOwovLyAgICBDbnRfRF9SZXNldCgpOwovL30KLy8KLy8vLy0tLS0tIFBvd2VyT2ZmX0RfTWVkaWEoKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy92b2lkIFBvd2VyT2ZmX0RfTWVkaWEodm9pZCkKLy97Ci8vICAgIENudF9EX1Bvd2VyT2ZmKCk7Ci8vfQovLwovLy8vLS0tLS0gQ2hlY2tfRF9NZWRpYVBvd2VyKCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovL2ludCBDaGVja19EX01lZGlhUG93ZXIodm9pZCkKLy97Ci8vICAgIC8vdXNsZWVwKDU2KjEwMjQpOwovLyAgICBpZiAoQ2hlY2tfRF9DYXJkU3RzQ2hnKCkpCi8vICAgICAgICBNZWRpYUNoYW5nZSA9IEVSUk9SOwovLyAgICAvL3VzbGVlcCg1NioxMDI0KTsKLy8gICAgaWYgKCghQ2hlY2tfRF9DbnRQb3dlcigpKSYmKCFNZWRpYUNoYW5nZSkpICAvLyCmsyBwb3dlciAmIE1lZGlhIKhTs1EgY2hhbmdlLCCraCByZXR1cm4gc3VjY2VzcwovLyAgICAgICAgcmV0dXJuKFNVQ0NFU1MpOwovLyAgICAvL3VzbGVlcCg1NioxMDI0KTsKLy8KLy8gICAgaWYgKENoZWNrX0RfQ2FyZEV4aXN0KCkpICAgICAgICAgICAgICAgICAgICAvLyBDaGVjayBpZiBjYXJkIGlzIG5vdCBleGlzdCwgcmV0dXJuIGVycgovLyAgICB7Ci8vICAgICAgICBFcnJDb2RlICAgICAgICA9IEVSUl9Ob1NtYXJ0TWVkaWE7Ci8vICAgICAgICBNZWRpYUNoYW5nZSA9IEVSUk9SOwovLyAgICAgICAgcmV0dXJuKEVSUk9SKTsKLy8gICAgfQovLyAgICAvL3VzbGVlcCg1NioxMDI0KTsKLy8gICAgaWYgKENudF9EX1Bvd2VyT24oKSkKLy8gICAgewovLyAgICAgICAgRXJyQ29kZSAgICAgICAgPSBFUlJfTm9TbWFydE1lZGlhOwovLyAgICAgICAgTWVkaWFDaGFuZ2UgPSBFUlJPUjsKLy8gICAgICAgIHJldHVybihFUlJPUik7Ci8vICAgIH0KLy8gICAgLy91c2xlZXAoNTYqMTAyNCk7Ci8vICAgIFNzZmRjX0RfUmVzZXQoZmRvRXh0KTsKLy8gICAgLy91c2xlZXAoNTYqMTAyNCk7Ci8vICAgIHJldHVybihTVUNDRVNTKTsKLy99Ci8vCi8vLy8tLS0tLUNoZWNrX0RfTWVkaWFFeGlzdCgpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vaW50IENoZWNrX0RfTWVkaWFFeGlzdCh2b2lkKQovL3sKLy8gICAgaWYgKENoZWNrX0RfQ2FyZFN0c0NoZygpKQovLyAgICAgICAgTWVkaWFDaGFuZ2UgPSBFUlJPUjsKLy8KLy8gICAgaWYgKCFDaGVja19EX0NhcmRFeGlzdCgpKQovLyAgICB7Ci8vICAgICAgICBpZiAoIU1lZGlhQ2hhbmdlKQovLyAgICAgICAgICAgIHJldHVybihTVUNDRVNTKTsKLy8KLy8gICAgICAgIEVyckNvZGUgPSBFUlJfQ2hhbmdlZE1lZGlhOwovLyAgICAgICAgcmV0dXJuKEVSUk9SKTsKLy8gICAgfQovLwovLyAgICBFcnJDb2RlID0gRVJSX05vU21hcnRNZWRpYTsKLy8KLy8gICAgcmV0dXJuKEVSUk9SKTsKLy99Ci8vCi8vLy8tLS0tLSBDaGVja19EX01lZGlhV1AoKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vaW50IENoZWNrX0RfTWVkaWFXUCh2b2lkKQovL3sKLy8gICAgaWYgKFNzZmRjLkF0dHJpYnV0ZSAmTVdQKQovLyAgICB7Ci8vICAgICAgICBFcnJDb2RlID0gRVJSX1dydFByb3RlY3Q7Ci8vICAgICAgICByZXR1cm4oRVJST1IpOwovLyAgICB9Ci8vCi8vICAgIHJldHVybihTVUNDRVNTKTsKLy99CiovCi8vU21hcnRNZWRpYSBQaHlzaWNhbCBGb3JtYXQgVGVzdCBTdWJyb3V0aW5lCi8vLS0tLS0gQ2hlY2tfRF9NZWRpYUZtdCgpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQppbnQgQ2hlY2tfRF9NZWRpYUZtdChzdHJ1Y3QgdXNfZGF0YSAqdXMpCnsKCXByaW50aygiQ2hlY2tfRF9NZWRpYUZtdFxuIik7CgkvL1VMT05HIGksaiwgcmVzdWx0PUZBTFNFLCB6b25lLGJsb2NrOwoKCS8vdXNsZWVwKDU2KjEwMjQpOwoJaWYgKCFNZWRpYUNoYW5nZSkKCQlyZXR1cm4oU1VDQ0VTUyk7CgoJTWVkaWFDaGFuZ2UgID0gRVJST1I7CglTZWN0Q29weU1vZGUgPSBDT01QTEVURUQ7CgoJLy91c2xlZXAoNTYqMTAyNCk7CglpZiAoU2V0X0RfUGh5Rm10VmFsdWUodXMpKQoJewoJCUVyckNvZGUgPSBFUlJfVW5rbm93bk1lZGlhOwoJCXJldHVybihFUlJPUik7Cgl9CgkKCS8vdXNsZWVwKDU2KjEwMjQpOwoJaWYgKFNlYXJjaF9EX0NJUyh1cykpCgl7CgkJRXJyQ29kZSA9IEVSUl9JbGxlZ2FsRm10OwoJCXJldHVybihFUlJPUik7Cgl9CgoKICAgIE1lZGlhQ2hhbmdlID0gU1VDQ0VTUzsKICAgIHJldHVybihTVUNDRVNTKTsKfQovKgovLy8vLS0tLS0gQ2hlY2tfRF9CbG9ja0lzRnVsbCgpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy92b2lkIENoZWNrX0RfQmxvY2tJc0Z1bGwoKQovL3sKLy8gICAgVUxPTkcgaSwgYmxvY2s7Ci8vCi8vICAgIGlmIChJc1hEQ29tcGxpYW5jZSB8fCBJc1NTRkRDQ29tcGxpYW5jZSkKLy8gICAgewovLyAgICAgICAvLyBJZiB0aGUgYmxvY2tzIGFyZSBmdWxsIHRoZW4gcmV0dXJuIHdyaXRlLXByb3RlY3QuCi8vICAgICAgIGJsb2NrID0gU3NmZGMuTWF4QmxvY2tzLzg7Ci8vICAgICAgIGZvciAoTWVkaWEuWm9uZT0wOyBNZWRpYS5ab25lPFNzZmRjLk1heFpvbmVzOyBNZWRpYS5ab25lKyspCi8vICAgICAgIHsKLy8gICAgICAgICAgIGlmIChMb2cyUGh5W01lZGlhLlpvbmVdPT1OVUxMKQovLyAgICAgICAgICAgewovLyAgICAgICAgICAgICAgIGlmIChNYWtlX0RfTG9nVGFibGUoKSkKLy8gICAgICAgICAgICAgICB7Ci8vICAgICAgICAgICAgICAgICAgIEVyckNvZGUgPSBFUlJfSWxsZWdhbEZtdDsKLy8gICAgICAgICAgICAgICAgICAgcmV0dXJuOwovLyAgICAgICAgICAgICAgIH0KLy8gICAgICAgICAgIH0KLy8KLy8gICAgICAgICAgIGZvciAoaT0wOyBpPGJsb2NrOyBpKyspCi8vICAgICAgICAgICB7Ci8vICAgICAgICAgICAgICAgaWYgKEFzc2lnbltNZWRpYS5ab25lXVtpXSAhPSAweEZGKQovLyAgICAgICAgICAgICAgICAgIHJldHVybjsKLy8gICAgICAgICAgIH0KLy8gICAgICAgfQovLyAgICAgICBTc2ZkYy5BdHRyaWJ1dGUgfD0gV1A7Ci8vICAgIH0KLy99Ci8vCi8vCi8vLy8tLS0tLSBDaGVja19EX01lZGlhRm10Rm9yRXJhc2VBbGwoKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vaW50IENoZWNrX0RfTWVkaWFGbXRGb3JFcmFzZUFsbChQRkRPX0RFVklDRV9FWFRFTlNJT04gZmRvRXh0KQovL3sKLy8gICAgTWVkaWFDaGFuZ2UgID0gRVJST1I7Ci8vICAgIFNlY3RDb3B5TW9kZSA9IENPTVBMRVRFRDsKLy8KLy8gICAgaWYgKFNldF9EX1BoeUZtdFZhbHVlKGZkb0V4dCkpCi8vICAgIHsKLy8gICAgICAgIEVyckNvZGUgPSBFUlJfVW5rbm93bk1lZGlhOwovLyAgICAgICAgcmV0dXJuKEVSUk9SKTsKLy8gICAgfQovLwovLyAgICBpZiAoU2VhcmNoX0RfQ0lTKGZkb0V4dCkpCi8vICAgIHsKLy8gICAgICAgIEVyckNvZGUgPSBFUlJfSWxsZWdhbEZtdDsKLy8gICAgICAgIHJldHVybihFUlJPUik7Ci8vICAgIH0KLy8KLy8gICAgcmV0dXJuKFNVQ0NFU1MpOwovL30KKi8KLy9TbWFydE1lZGlhIFBoeXNpY2FsIEFkZHJlc3MgQ29udHJvbCBTdWJyb3V0aW5lCi8vLS0tLS0gQ29udl9EX01lZGlhQWRkcigpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQppbnQgQ29udl9EX01lZGlhQWRkcihzdHJ1Y3QgdXNfZGF0YSAqdXMsIERXT1JEIGFkZHIpCnsKCURXT1JEIHRlbXA7CgkvL1VMT05HICB6ejsKCS8vU1NGRENUWVBFX1QgYWEgPSAoU1NGRENUWVBFX1QgKSAmU3NmZGM7CgkvL0FERFJFU1NfVCAgIGJiID0gKEFERFJFU1NfVCkgJk1lZGlhOwoKCXRlbXAgICAgICAgICAgID0gYWRkci9Tc2ZkYy5NYXhTZWN0b3JzOwoJTWVkaWEuWm9uZSAgICAgPSAoQllURSkgKHRlbXAvU3NmZGMuTWF4TG9nQmxvY2tzKTsKCglpZiAoTG9nMlBoeVtNZWRpYS5ab25lXT09TlVMTCkKCXsKCQlpZiAoTWFrZV9EX0xvZ1RhYmxlKHVzKSkKCQl7CgkJCUVyckNvZGUgPSBFUlJfSWxsZWdhbEZtdDsKCQkJcmV0dXJuKEVSUk9SKTsKCQl9Cgl9CgoJTWVkaWEuU2VjdG9yICAgPSAoQllURSkgKGFkZHIlU3NmZGMuTWF4U2VjdG9ycyk7CglNZWRpYS5Mb2dCbG9jayA9IChXT1JEKSAodGVtcCVTc2ZkYy5NYXhMb2dCbG9ja3MpOwoKCWlmIChNZWRpYS5ab25lPFNzZmRjLk1heFpvbmVzKQoJewoJCUNscl9EX1JlZHVuZGFudERhdGEoUmVkdW5kYW50KTsKCQlTZXRfRF9Mb2dCbG9ja0FkZHIoUmVkdW5kYW50KTsKCQlNZWRpYS5QaHlCbG9jayA9IExvZzJQaHlbTWVkaWEuWm9uZV1bTWVkaWEuTG9nQmxvY2tdOwoJCXJldHVybihTVUNDRVNTKTsKCX0KCglFcnJDb2RlID0gRVJSX091dE9mTEJBOwoJcmV0dXJuKEVSUk9SKTsKfQoKLy8tLS0tLSBJbmNfRF9NZWRpYUFkZHIoKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmludCBJbmNfRF9NZWRpYUFkZHIoc3RydWN0IHVzX2RhdGEgKnVzKQp7CglXT1JEICAgICAgICBMb2dCbG9jayA9IE1lZGlhLkxvZ0Jsb2NrOwoJLy9TU0ZEQ1RZUEVfVCBhYSA9IChTU0ZEQ1RZUEVfVCApICZTc2ZkYzsKCS8vQUREUkVTU19UICAgYmIgPSAoQUREUkVTU19UKSAmTWVkaWE7CgoJaWYgKCsrTWVkaWEuU2VjdG9yPFNzZmRjLk1heFNlY3RvcnMpCgkJcmV0dXJuKFNVQ0NFU1MpOwoKCWlmIChMb2cyUGh5W01lZGlhLlpvbmVdPT1OVUxMKQoJewoJCWlmIChNYWtlX0RfTG9nVGFibGUodXMpKQoJCXsKCQkJRXJyQ29kZSA9IEVSUl9JbGxlZ2FsRm10OwoJCQlyZXR1cm4oRVJST1IpOwoJCX0KCX0KCglNZWRpYS5TZWN0b3I9MDsKCU1lZGlhLkxvZ0Jsb2NrID0gTG9nQmxvY2s7CgoJaWYgKCsrTWVkaWEuTG9nQmxvY2s8U3NmZGMuTWF4TG9nQmxvY2tzKQoJewoJCUNscl9EX1JlZHVuZGFudERhdGEoUmVkdW5kYW50KTsKCQlTZXRfRF9Mb2dCbG9ja0FkZHIoUmVkdW5kYW50KTsKCQlNZWRpYS5QaHlCbG9jaz1Mb2cyUGh5W01lZGlhLlpvbmVdW01lZGlhLkxvZ0Jsb2NrXTsKCQlyZXR1cm4oU1VDQ0VTUyk7Cgl9CgoJTWVkaWEuTG9nQmxvY2s9MDsKCglpZiAoKytNZWRpYS5ab25lPFNzZmRjLk1heFpvbmVzKQoJewoJCWlmIChMb2cyUGh5W01lZGlhLlpvbmVdPT1OVUxMKQoJCXsKCQkJaWYgKE1ha2VfRF9Mb2dUYWJsZSh1cykpCgkJCXsKCQkJCUVyckNvZGUgPSBFUlJfSWxsZWdhbEZtdDsKCQkJCXJldHVybihFUlJPUik7CgkJCX0KCQl9CgoJCU1lZGlhLkxvZ0Jsb2NrID0gMDsKCgkJQ2xyX0RfUmVkdW5kYW50RGF0YShSZWR1bmRhbnQpOwoJCVNldF9EX0xvZ0Jsb2NrQWRkcihSZWR1bmRhbnQpOwoJCU1lZGlhLlBoeUJsb2NrPUxvZzJQaHlbTWVkaWEuWm9uZV1bTWVkaWEuTG9nQmxvY2tdOwoJCXJldHVybihTVUNDRVNTKTsKCX0KCglNZWRpYS5ab25lPTA7CglFcnJDb2RlID0gRVJSX091dE9mTEJBOwoKCXJldHVybihFUlJPUik7Cn0KLyoKLy8tLS0tLSBDaGVja19EX0ZpcnN0U2VjdCgpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmludCBDaGVja19EX0ZpcnN0U2VjdCh2b2lkKQp7CiAgICBTU0ZEQ1RZUEVfVCBhYSA9IChTU0ZEQ1RZUEVfVCApICZTc2ZkYzsKICAgIEFERFJFU1NfVCAgIGJiID0gKEFERFJFU1NfVCkgJk1lZGlhOwoKICAgIGlmICghTWVkaWEuU2VjdG9yKQogICAgICAgIHJldHVybihTVUNDRVNTKTsKCiAgICByZXR1cm4oRVJST1IpOwp9CgovLy0tLS0tIENoZWNrX0RfTGFzdFNlY3QoKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KaW50IENoZWNrX0RfTGFzdFNlY3Qodm9pZCkKewogICAgU1NGRENUWVBFX1QgYWEgPSAoU1NGRENUWVBFX1QgKSAmU3NmZGM7CiAgICBBRERSRVNTX1QgICBiYiA9IChBRERSRVNTX1QpICZNZWRpYTsKCiAgICBpZiAoTWVkaWEuU2VjdG9yPChTc2ZkYy5NYXhTZWN0b3JzLTEpKQogICAgICAgIHJldHVybihFUlJPUik7CgogICAgcmV0dXJuKFNVQ0NFU1MpOwp9CiovCi8vU21hcnRNZWRpYSBSZWFkL1dyaXRlIFN1YnJvdXRpbmUgd2l0aCBSZXRyeQovLy0tLS0tIE1lZGlhX0RfUmVhZE9uZVNlY3QoKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KaW50IE1lZGlhX0RfUmVhZE9uZVNlY3Qoc3RydWN0IHVzX2RhdGEgKnVzLCBXT1JEIGNvdW50LCBCWVRFICpidWYpCnsKCURXT1JEIGVyciwgcmV0cnk7CgoJaWYgKCFSZWFkX0RfUGh5T25lU2VjdCh1cywgY291bnQsIGJ1ZikpCgkJcmV0dXJuKFNVQ0NFU1MpOwoJaWYgKEVyckNvZGU9PUVSUl9Id0Vycm9yKQoJCXJldHVybihFUlJPUik7CglpZiAoRXJyQ29kZT09RVJSX0RhdGFTdGF0dXMpCgkJcmV0dXJuKEVSUk9SKTsKCiNpZmRlZiBSREVSUl9SRUFTU0lHTgoJaWYgKFNzZmRjLkF0dHJpYnV0ZSAmTVdQKQoJewoJCWlmIChFcnJDb2RlPT1FUlJfQ29yUmVhZEVycikKCQkJcmV0dXJuKFNVQ0NFU1MpOwoJCXJldHVybihFUlJPUik7Cgl9CgoJZXJyPUVyckNvZGU7Cglmb3IocmV0cnk9MDsgcmV0cnk8MjsgcmV0cnkrKykKCXsKCQlpZiAoQ29weV9EX0Jsb2NrQWxsKHVzLCAoZXJyPT1FUlJfRWNjUmVhZEVycik/UkVRX0ZBSUw6UkVRX0VSQVNFKSkKCQl7CgkJCWlmIChFcnJDb2RlPT1FUlJfSHdFcnJvcikKCQkJCXJldHVybihFUlJPUik7CgkJCWNvbnRpbnVlOwoJCX0KCgkJRXJyQ29kZSA9IGVycjsKCQlpZiAoRXJyQ29kZT09RVJSX0NvclJlYWRFcnIpCgkJCXJldHVybihTVUNDRVNTKTsKCQlyZXR1cm4oRVJST1IpOwoJfQoKCU1lZGlhQ2hhbmdlID0gRVJST1I7CiNlbHNlCglpZiAoRXJyQ29kZT09RVJSX0NvclJlYWRFcnIpIHJldHVybihTVUNDRVNTKTsKI2VuZGlmCgoJcmV0dXJuKEVSUk9SKTsKfQovKgovLy0tLS0tIE1lZGlhX0RfV3JpdGVPbmVTZWN0KCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KaW50IE1lZGlhX0RfV3JpdGVPbmVTZWN0KFBGRE9fREVWSUNFX0VYVEVOU0lPTiBmZG9FeHQsIFdPUkQgY291bnQsIEJZVEUgKmJ1ZikKewogICAgRFdPUkQgcmV0cnk7CiAgICBTU0ZEQ1RZUEVfVCBhYSA9IChTU0ZEQ1RZUEVfVCApICZTc2ZkYzsKICAgIEFERFJFU1NfVCAgIGJiID0gKEFERFJFU1NfVCkgJk1lZGlhOwoKICAgIGlmICghV3JpdGVfRF9QaHlPbmVTZWN0KGZkb0V4dCwgY291bnQsIGJ1ZikpCiAgICAgICAgcmV0dXJuKFNVQ0NFU1MpOwogICAgaWYgKEVyckNvZGU9PUVSUl9Id0Vycm9yKQogICAgICAgIHJldHVybihFUlJPUik7CgogICAgZm9yKHJldHJ5PTE7IHJldHJ5PDI7IHJldHJ5KyspCiAgICB7CiAgICAgICAgaWYgKFJlYXNzaWduX0RfQmxvY2tIZWFkKGZkb0V4dCkpCiAgICAgICAgewogICAgICAgICAgICBpZiAoRXJyQ29kZT09RVJSX0h3RXJyb3IpCiAgICAgICAgICAgICAgICByZXR1cm4oRVJST1IpOwogICAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9CgogICAgICAgIGlmICghV3JpdGVfRF9QaHlPbmVTZWN0KGZkb0V4dCwgY291bnQsIGJ1ZikpCiAgICAgICAgICAgIHJldHVybihTVUNDRVNTKTsKICAgICAgICBpZiAoRXJyQ29kZT09RVJSX0h3RXJyb3IpCiAgICAgICAgICAgIHJldHVybihFUlJPUik7CiAgICB9CgogICAgaWYgKFJlbGVhc2VfRF9Xcml0ZUJsb2NrKGZkb0V4dCkpCiAgICAgICAgcmV0dXJuKEVSUk9SKTsKCiAgICBFcnJDb2RlICAgICAgICA9IEVSUl9Xcml0ZUZhdWx0OwogICAgTWVkaWFDaGFuZ2UgPSBFUlJPUjsKICAgIHJldHVybihFUlJPUik7Cn0KCi8vU21hcnRNZWRpYSBEYXRhIENvcHkgU3Vicm91dGluZSB3aXRoIFJldHJ5Ci8vLS0tLS0gTWVkaWFfRF9Db3B5QmxvY2tIZWFkKCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQppbnQgTWVkaWFfRF9Db3B5QmxvY2tIZWFkKFBGRE9fREVWSUNFX0VYVEVOU0lPTiBmZG9FeHQpCnsKICAgIERXT1JEIHJldHJ5OwoKICAgIGZvcihyZXRyeT0wOyByZXRyeTwyOyByZXRyeSsrKQogICAgewogICAgICAgIGlmICghQ29weV9EX0Jsb2NrSGVhZChmZG9FeHQpKQogICAgICAgICAgICByZXR1cm4oU1VDQ0VTUyk7CiAgICAgICAgaWYgKEVyckNvZGU9PUVSUl9Id0Vycm9yKQogICAgICAgICAgICByZXR1cm4oRVJST1IpOwogICAgfQoKICAgIE1lZGlhQ2hhbmdlID0gRVJST1I7CiAgICByZXR1cm4oRVJST1IpOwp9CgovLy0tLS0tIE1lZGlhX0RfQ29weUJsb2NrVGFpbCgpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KaW50IE1lZGlhX0RfQ29weUJsb2NrVGFpbChQRkRPX0RFVklDRV9FWFRFTlNJT04gZmRvRXh0KQp7CiAgICBEV09SRCByZXRyeTsKCiAgICBpZiAoIUNvcHlfRF9CbG9ja1RhaWwoZmRvRXh0KSkKICAgICAgICByZXR1cm4oU1VDQ0VTUyk7CiAgICBpZiAoRXJyQ29kZT09RVJSX0h3RXJyb3IpCiAgICAgICAgcmV0dXJuKEVSUk9SKTsKCiAgICBmb3IocmV0cnk9MTsgcmV0cnk8MjsgcmV0cnkrKykKICAgIHsKICAgICAgICBpZiAoUmVhc3NpZ25fRF9CbG9ja0hlYWQoZmRvRXh0KSkKICAgICAgICB7CiAgICAgICAgICAgIGlmIChFcnJDb2RlPT1FUlJfSHdFcnJvcikKICAgICAgICAgICAgICAgIHJldHVybihFUlJPUik7CiAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KCiAgICAgICAgaWYgKCFDb3B5X0RfQmxvY2tUYWlsKGZkb0V4dCkpCiAgICAgICAgICAgIHJldHVybihTVUNDRVNTKTsKICAgICAgICBpZiAoRXJyQ29kZT09RVJSX0h3RXJyb3IpCiAgICAgICAgICAgIHJldHVybihFUlJPUik7CiAgICB9CgogICAgaWYgKFJlbGVhc2VfRF9Xcml0ZUJsb2NrKGZkb0V4dCkpCiAgICAgICAgcmV0dXJuKEVSUk9SKTsKCiAgICBFcnJDb2RlICAgICAgICA9IEVSUl9Xcml0ZUZhdWx0OwogICAgTWVkaWFDaGFuZ2UgPSBFUlJPUjsKICAgIHJldHVybihFUlJPUik7Cn0KLy8KLy8vLy0tLS0tIE1lZGlhX0RfRXJhc2VPbmVCbG9jaygpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy9pbnQgTWVkaWFfRF9FcmFzZU9uZUJsb2NrKHZvaWQpCi8vewovLyAgICBXT1JEICAgICAgICBMb2dCbG9jayA9IE1lZGlhLkxvZ0Jsb2NrOwovLyAgICBXT1JEICAgICAgICBQaHlCbG9jayA9IE1lZGlhLlBoeUJsb2NrOwovLyAgICBTU0ZEQ1RZUEVfVCBhYSA9IChTU0ZEQ1RZUEVfVCApICZTc2ZkYzsKLy8gICAgQUREUkVTU19UICAgYmIgPSAoQUREUkVTU19UKSAmTWVkaWE7Ci8vCi8vICAgIGlmIChNZWRpYS5QaHlCbG9jaz09Tk9fQVNTSUdOKQovLyAgICAgICAgcmV0dXJuKFNVQ0NFU1MpOwovLwovLyAgICBpZiAoTG9nMlBoeVtNZWRpYS5ab25lXT09TlVMTCkKLy8gICAgewovLyAgICAgICAgaWYgKE1ha2VfRF9Mb2dUYWJsZSgpKQovLyAgICAgICAgewovLyAgICAgICAgICAgIEVyckNvZGUgPSBFUlJfSWxsZWdhbEZtdDsKLy8gICAgICAgICAgICByZXR1cm4oRVJST1IpOwovLyAgICAgICAgfQovLyAgICB9Ci8vICAgIE1lZGlhLkxvZ0Jsb2NrID0gTG9nQmxvY2s7Ci8vICAgIE1lZGlhLlBoeUJsb2NrID0gUGh5QmxvY2s7Ci8vCi8vICAgIExvZzJQaHlbTWVkaWEuWm9uZV1bTWVkaWEuTG9nQmxvY2tdPU5PX0FTU0lHTjsKLy8KLy8gICAgaWYgKEVyYXNlX0RfUGh5T25lQmxvY2soZmRvRXh0KSkKLy8gICAgewovLyAgICAgICAgaWYgKEVyckNvZGU9PUVSUl9Id0Vycm9yKQovLyAgICAgICAgICAgIHJldHVybihFUlJPUik7Ci8vICAgICAgICBpZiAoTWFya0ZhaWxfRF9QaHlPbmVCbG9jaygpKQovLyAgICAgICAgICAgIHJldHVybihFUlJPUik7Ci8vCi8vICAgICAgICBFcnJDb2RlID0gRVJSX1dyaXRlRmF1bHQ7Ci8vICAgICAgICByZXR1cm4oRVJST1IpOwovLyAgICB9Ci8vCi8vICAgIENscl9EX0JpdChBc3NpZ25bTWVkaWEuWm9uZV0sTWVkaWEuUGh5QmxvY2spOwovLyAgICBNZWRpYS5QaHlCbG9jaz1OT19BU1NJR047Ci8vICAgIHJldHVybihTVUNDRVNTKTsKLy99Ci8vCi8vLy9TbWFydE1lZGlhIEVyYXNlIFN1YnJvdXRpbmUKLy8vLy0tLS0tIE1lZGlhX0RfRXJhc2VBbGxCbG9jaygpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy9pbnQgTWVkaWFfRF9FcmFzZUFsbEJsb2NrKHZvaWQpCi8vewovLyAgICBXT1JEIGNpcz0wOwovLwovLyAgICBTU0ZEQ1RZUEVfVCBhYSA9IChTU0ZEQ1RZUEVfVCApICZTc2ZkYzsKLy8gICAgQUREUkVTU19UICAgYmIgPSAoQUREUkVTU19UKSAmTWVkaWE7Ci8vCi8vICAgIE1lZGlhQ2hhbmdlID0gRVJST1I7Ci8vICAgIE1lZGlhLlNlY3RvciAgID0gMDsKLy8KLy8gICAgZm9yKE1lZGlhLlpvbmU9MDsgTWVkaWEuWm9uZTxTc2ZkYy5NYXhab25lczsgTWVkaWEuWm9uZSsrKQovLyAgICAgICAgZm9yKE1lZGlhLlBoeUJsb2NrPTA7IE1lZGlhLlBoeUJsb2NrPFNzZmRjLk1heEJsb2NrczsgTWVkaWEuUGh5QmxvY2srKykgewovLyAgICAgICAgICAgIGlmIChTc2ZkY19EX1JlYWRSZWR0RGF0YShSZWR1bmRhbnQpKQovLyAgICAgICAgICAgIHsKLy8gICAgICAgICAgICAgICAgU3NmZGNfRF9SZXNldChmZG9FeHQpOwovLyAgICAgICAgICAgICAgICByZXR1cm4oRVJST1IpOwovLyAgICAgICAgICAgIH0KLy8KLy8gICAgICAgICAgICBTc2ZkY19EX1Jlc2V0KGZkb0V4dCk7Ci8vICAgICAgICAgICAgaWYgKCFDaGVja19EX0ZhaWxCbG9jayhSZWR1bmRhbnQpKQovLyAgICAgICAgICAgIHsKLy8gICAgICAgICAgICAgICAgaWYgKGNpcykKLy8gICAgICAgICAgICAgICAgewovLyAgICAgICAgICAgICAgICAgICAgaWYgKFNzZmRjX0RfRXJhc2VCbG9jayhmZG9FeHQpKQovLyAgICAgICAgICAgICAgICAgICAgewovLyAgICAgICAgICAgICAgICAgICAgICAgIEVyckNvZGUgPSBFUlJfSHdFcnJvcjsKLy8gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4oRVJST1IpOwovLyAgICAgICAgICAgICAgICAgICAgfQovLwovLyAgICAgICAgICAgICAgICAgICAgaWYgKFNzZmRjX0RfQ2hlY2tTdGF0dXMoKSkKLy8gICAgICAgICAgICAgICAgICAgIHsKLy8gICAgICAgICAgICAgICAgICAgICAgICBpZiAoTWFya0ZhaWxfRF9QaHlPbmVCbG9jaygpKQovLyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4oRVJST1IpOwovLyAgICAgICAgICAgICAgICAgICAgfQovLwovLyAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci8vICAgICAgICAgICAgICAgIH0KLy8KLy8gICAgICAgICAgICAgICAgaWYgKE1lZGlhLlBoeUJsb2NrIT1DaXNBcmVhLlBoeUJsb2NrKQovLyAgICAgICAgICAgICAgICB7Ci8vICAgICAgICAgICAgICAgICAgICBFcnJDb2RlID0gRVJSX0lsbGVnYWxGbXQ7Ci8vICAgICAgICAgICAgICAgICAgICByZXR1cm4oRVJST1IpOwovLyAgICAgICAgICAgICAgICB9Ci8vCi8vICAgICAgICAgICAgICAgIGNpcysrOwovLyAgICAgICAgICAgIH0KLy8KLy8gICAgICAgIH0KLy8gICAgcmV0dXJuKFNVQ0NFU1MpOwovL30KKi8KLy9TbWFydE1lZGlhIFBoeXNpY2FsIFNlY3RvciBEYXRhIENvcHkgU3Vicm91dGluZQovLy0tLS0tIENvcHlfRF9CbG9ja0FsbCgpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KaW50IENvcHlfRF9CbG9ja0FsbChzdHJ1Y3QgdXNfZGF0YSAqdXMsIERXT1JEIG1vZGUpCnsKCUJZVEUgc2VjdDsKCS8vU1NGRENUWVBFX1QgYWEgPSAoU1NGRENUWVBFX1QgKSAmU3NmZGM7CgkvL0FERFJFU1NfVCAgIGJiID0gKEFERFJFU1NfVCkgJk1lZGlhOwoKCXNlY3Q9TWVkaWEuU2VjdG9yOwoKCWlmIChBc3NpZ25fRF9Xcml0ZUJsb2NrKCkpCgkJcmV0dXJuKEVSUk9SKTsKCWlmIChtb2RlPT1SRVFfRkFJTCkKCQlTZWN0Q29weU1vZGU9UkVRX0ZBSUw7CgoJZm9yKE1lZGlhLlNlY3Rvcj0wOyBNZWRpYS5TZWN0b3I8U3NmZGMuTWF4U2VjdG9yczsgTWVkaWEuU2VjdG9yKyspCgl7CgkJaWYgKENvcHlfRF9QaHlPbmVTZWN0KHVzKSkKCQl7CgkJCWlmIChFcnJDb2RlPT1FUlJfSHdFcnJvcikKCQkJCXJldHVybihFUlJPUik7CgkJCWlmIChSZWxlYXNlX0RfV3JpdGVCbG9jayh1cykpCgkJCQlyZXR1cm4oRVJST1IpOwoKCQkJRXJyQ29kZSA9IEVSUl9Xcml0ZUZhdWx0OwoJCQlNZWRpYS5QaHlCbG9jaz1SZWFkQmxvY2s7CgkJCU1lZGlhLlNlY3Rvcj1zZWN0OwoKCQkJcmV0dXJuKEVSUk9SKTsKCQl9Cgl9CgoJaWYgKFJlbGVhc2VfRF9SZWFkQmxvY2sodXMpKQoJCXJldHVybihFUlJPUik7CgoJTWVkaWEuUGh5QmxvY2s9V3JpdGVCbG9jazsKCU1lZGlhLlNlY3Rvcj1zZWN0OwoJcmV0dXJuKFNVQ0NFU1MpOwp9Ci8qCi8vLS0tLS0gQ29weV9EX0Jsb2NrSGVhZCgpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQppbnQgQ29weV9EX0Jsb2NrSGVhZChQRkRPX0RFVklDRV9FWFRFTlNJT04gZmRvRXh0KQp7CiAgICBCWVRFIHNlY3Q7CiAgICBTU0ZEQ1RZUEVfVCBhYSA9IChTU0ZEQ1RZUEVfVCApICZTc2ZkYzsKICAgIEFERFJFU1NfVCAgIGJiID0gKEFERFJFU1NfVCkgJk1lZGlhOwoKICAgIHNlY3Q9TWVkaWEuU2VjdG9yOwogICAgaWYgKEFzc2lnbl9EX1dyaXRlQmxvY2soKSkKICAgICAgICByZXR1cm4oRVJST1IpOwoKICAgIGZvcihNZWRpYS5TZWN0b3I9MDsgTWVkaWEuU2VjdG9yPHNlY3Q7IE1lZGlhLlNlY3RvcisrKQogICAgewogICAgICAgIGlmIChDb3B5X0RfUGh5T25lU2VjdChmZG9FeHQpKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKEVyckNvZGU9PUVSUl9Id0Vycm9yKQogICAgICAgICAgICAgICAgcmV0dXJuKEVSUk9SKTsKICAgICAgICAgICAgaWYgKFJlbGVhc2VfRF9Xcml0ZUJsb2NrKGZkb0V4dCkpCiAgICAgICAgICAgICAgICByZXR1cm4oRVJST1IpOwoKICAgICAgICAgICAgRXJyQ29kZSA9IEVSUl9Xcml0ZUZhdWx0OwogICAgICAgICAgICBNZWRpYS5QaHlCbG9jaz1SZWFkQmxvY2s7CiAgICAgICAgICAgIE1lZGlhLlNlY3Rvcj1zZWN0OwoKICAgICAgICAgICAgcmV0dXJuKEVSUk9SKTsKICAgICAgICB9CiAgICB9CgogICAgTWVkaWEuUGh5QmxvY2s9V3JpdGVCbG9jazsKICAgIE1lZGlhLlNlY3Rvcj1zZWN0OwogICAgcmV0dXJuKFNVQ0NFU1MpOwp9CgovLy0tLS0tIENvcHlfRF9CbG9ja1RhaWwoKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KaW50IENvcHlfRF9CbG9ja1RhaWwoUEZET19ERVZJQ0VfRVhURU5TSU9OIGZkb0V4dCkKewogICAgQllURSBzZWN0OwogICAgU1NGRENUWVBFX1QgYWEgPSAoU1NGRENUWVBFX1QgKSAmU3NmZGM7CiAgICBBRERSRVNTX1QgICBiYiA9IChBRERSRVNTX1QpICZNZWRpYTsKCiAgICBmb3Ioc2VjdD1NZWRpYS5TZWN0b3I7IE1lZGlhLlNlY3RvcjxTc2ZkYy5NYXhTZWN0b3JzOyBNZWRpYS5TZWN0b3IrKykKICAgIHsKICAgICAgICBpZiAoQ29weV9EX1BoeU9uZVNlY3QoZmRvRXh0KSkKICAgICAgICB7CiAgICAgICAgICAgIGlmIChFcnJDb2RlPT1FUlJfSHdFcnJvcikKICAgICAgICAgICAgICAgIHJldHVybihFUlJPUik7CgogICAgICAgICAgICBNZWRpYS5QaHlCbG9jaz1Xcml0ZUJsb2NrOwogICAgICAgICAgICBNZWRpYS5TZWN0b3I9c2VjdDsKCiAgICAgICAgICAgIHJldHVybihFUlJPUik7CiAgICAgICAgfQogICAgfQoKICAgIGlmIChSZWxlYXNlX0RfUmVhZEJsb2NrKGZkb0V4dCkpCiAgICAgICAgcmV0dXJuKEVSUk9SKTsKCiAgICBNZWRpYS5QaHlCbG9jaz1Xcml0ZUJsb2NrOwogICAgTWVkaWEuU2VjdG9yPXNlY3Q7CiAgICByZXR1cm4oU1VDQ0VTUyk7Cn0KCi8vLS0tLS0gUmVhc3NpZ25fRF9CbG9ja0hlYWQoKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQppbnQgUmVhc3NpZ25fRF9CbG9ja0hlYWQoUEZET19ERVZJQ0VfRVhURU5TSU9OIGZkb0V4dCkKewogICAgRFdPUkQgIG1vZGU7CiAgICBXT1JEICAgYmxvY2s7CiAgICBCWVRFICAgc2VjdDsKICAgIFNTRkRDVFlQRV9UIGFhID0gKFNTRkRDVFlQRV9UICkgJlNzZmRjOwogICAgQUREUkVTU19UICAgYmIgPSAoQUREUkVTU19UKSAmTWVkaWE7CgogICAgbW9kZT1TZWN0Q29weU1vZGU7CiAgICBibG9jaz1SZWFkQmxvY2s7CiAgICBzZWN0PU1lZGlhLlNlY3RvcjsKCiAgICBpZiAoQXNzaWduX0RfV3JpdGVCbG9jaygpKQogICAgICAgIHJldHVybihFUlJPUik7CgogICAgU2VjdENvcHlNb2RlPVJFUV9GQUlMOwoKICAgIGZvcihNZWRpYS5TZWN0b3I9MDsgTWVkaWEuU2VjdG9yPHNlY3Q7IE1lZGlhLlNlY3RvcisrKQogICAgewogICAgICAgIGlmIChDb3B5X0RfUGh5T25lU2VjdChmZG9FeHQpKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKEVyckNvZGU9PUVSUl9Id0Vycm9yKQogICAgICAgICAgICAgICAgcmV0dXJuKEVSUk9SKTsKICAgICAgICAgICAgaWYgKFJlbGVhc2VfRF9Xcml0ZUJsb2NrKGZkb0V4dCkpCiAgICAgICAgICAgICAgICByZXR1cm4oRVJST1IpOwoKICAgICAgICAgICAgRXJyQ29kZSA9IEVSUl9Xcml0ZUZhdWx0OwogICAgICAgICAgICBTZWN0Q29weU1vZGU9bW9kZTsKICAgICAgICAgICAgV3JpdGVCbG9jaz1SZWFkQmxvY2s7CiAgICAgICAgICAgIFJlYWRCbG9jaz1ibG9jazsKICAgICAgICAgICAgTWVkaWEuU2VjdG9yPXNlY3Q7CiAgICAgICAgICAgIE1lZGlhLlBoeUJsb2NrPVdyaXRlQmxvY2s7CgogICAgICAgICAgICByZXR1cm4oRVJST1IpOwogICAgICAgIH0KICAgIH0KCiAgICBpZiAoUmVsZWFzZV9EX1JlYWRCbG9jayhmZG9FeHQpKQogICAgICAgIHJldHVybihFUlJPUik7CgogICAgU2VjdENvcHlNb2RlPW1vZGU7CiAgICBSZWFkQmxvY2s9YmxvY2s7CiAgICBNZWRpYS5TZWN0b3I9c2VjdDsKICAgIE1lZGlhLlBoeUJsb2NrPVdyaXRlQmxvY2s7CiAgICByZXR1cm4oU1VDQ0VTUyk7Cn0KKi8KLy9TbWFydE1lZGlhIFBoeXNpY2FsIEJsb2NrIEFzc2lnbi9SZWxlYXNlIFN1YnJvdXRpbmUKLy8tLS0tLSBBc3NpZ25fRF9Xcml0ZUJsb2NrKCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmludCBBc3NpZ25fRF9Xcml0ZUJsb2NrKHZvaWQpCnsKCS8vU1NGRENUWVBFX1QgYWEgPSAoU1NGRENUWVBFX1QgKSAmU3NmZGM7CgkvL0FERFJFU1NfVCAgIGJiID0gKEFERFJFU1NfVCkgJk1lZGlhOwoJUmVhZEJsb2NrPU1lZGlhLlBoeUJsb2NrOwoKCWZvcihXcml0ZUJsb2NrPUFzc2lnblN0YXJ0W01lZGlhLlpvbmVdOyBXcml0ZUJsb2NrPFNzZmRjLk1heEJsb2NrczsgV3JpdGVCbG9jaysrKQoJewoJCWlmICghQ2hrX0RfQml0KEFzc2lnbltNZWRpYS5ab25lXSxXcml0ZUJsb2NrKSkKCQl7CgkJCVNldF9EX0JpdChBc3NpZ25bTWVkaWEuWm9uZV0sV3JpdGVCbG9jayk7CgkJCUFzc2lnblN0YXJ0W01lZGlhLlpvbmVdPVdyaXRlQmxvY2srMTsKCQkJTWVkaWEuUGh5QmxvY2s9V3JpdGVCbG9jazsKCQkJU2VjdENvcHlNb2RlPVJFUV9FUkFTRTsKCQkJLy9FcnJYRENvZGUgPSBOT19FUlJPUjsKCQkJcmV0dXJuKFNVQ0NFU1MpOwoJCX0KCX0KCglmb3IoV3JpdGVCbG9jaz0wOyBXcml0ZUJsb2NrPEFzc2lnblN0YXJ0W01lZGlhLlpvbmVdOyBXcml0ZUJsb2NrKyspCgl7CgkJaWYgKCFDaGtfRF9CaXQoQXNzaWduW01lZGlhLlpvbmVdLFdyaXRlQmxvY2spKQoJCXsKCQkJU2V0X0RfQml0KEFzc2lnbltNZWRpYS5ab25lXSxXcml0ZUJsb2NrKTsKCQkJQXNzaWduU3RhcnRbTWVkaWEuWm9uZV09V3JpdGVCbG9jaysxOwoJCQlNZWRpYS5QaHlCbG9jaz1Xcml0ZUJsb2NrOwoJCQlTZWN0Q29weU1vZGU9UkVRX0VSQVNFOwoJCQkvL0VyclhEQ29kZSA9IE5PX0VSUk9SOwoJCQlyZXR1cm4oU1VDQ0VTUyk7CgkJfQoJfQoKCVdyaXRlQmxvY2s9Tk9fQVNTSUdOOwoJRXJyQ29kZSA9IEVSUl9Xcml0ZUZhdWx0OwoJLy8gRm9yIHhEIHRlc3QKCS8vU3NmZGMuQXR0cmlidXRlIHw9IFdQOwoJLy9FcnJYRENvZGUgPSBFUlJfV3J0UHJvdGVjdDsKCXJldHVybihFUlJPUik7Cn0KCi8vLS0tLS0gUmVsZWFzZV9EX1JlYWRCbG9jaygpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQppbnQgUmVsZWFzZV9EX1JlYWRCbG9jayhzdHJ1Y3QgdXNfZGF0YSAqdXMpCnsKCURXT1JEIG1vZGU7CgkvL1NTRkRDVFlQRV9UIGFhID0gKFNTRkRDVFlQRV9UICkgJlNzZmRjOwoJLy9BRERSRVNTX1QgICBiYiA9IChBRERSRVNTX1QpICZNZWRpYTsKCgltb2RlPVNlY3RDb3B5TW9kZTsKCVNlY3RDb3B5TW9kZT1DT01QTEVURUQ7CgoJaWYgKG1vZGU9PUNPTVBMRVRFRCkKCQlyZXR1cm4oU1VDQ0VTUyk7CgoJTG9nMlBoeVtNZWRpYS5ab25lXVtNZWRpYS5Mb2dCbG9ja109V3JpdGVCbG9jazsKCU1lZGlhLlBoeUJsb2NrPVJlYWRCbG9jazsKCglpZiAoTWVkaWEuUGh5QmxvY2s9PU5PX0FTU0lHTikKCXsKCQlNZWRpYS5QaHlCbG9jaz1Xcml0ZUJsb2NrOwoJCXJldHVybihTVUNDRVNTKTsKCX0KCglpZiAobW9kZT09UkVRX0VSQVNFKQoJewoJCWlmIChFcmFzZV9EX1BoeU9uZUJsb2NrKHVzKSkKCQl7CgkJCWlmIChFcnJDb2RlPT1FUlJfSHdFcnJvcikgcmV0dXJuKEVSUk9SKTsKCQkJaWYgKE1hcmtGYWlsX0RfUGh5T25lQmxvY2sodXMpKSByZXR1cm4oRVJST1IpOwoJCX0KCQllbHNlCgkJCUNscl9EX0JpdChBc3NpZ25bTWVkaWEuWm9uZV0sTWVkaWEuUGh5QmxvY2spOwoJfQoJZWxzZSBpZiAoTWFya0ZhaWxfRF9QaHlPbmVCbG9jayh1cykpCgkJcmV0dXJuKEVSUk9SKTsKCglNZWRpYS5QaHlCbG9jaz1Xcml0ZUJsb2NrOwoJcmV0dXJuKFNVQ0NFU1MpOwp9CgovLy0tLS0tIFJlbGVhc2VfRF9Xcml0ZUJsb2NrKCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KaW50IFJlbGVhc2VfRF9Xcml0ZUJsb2NrKHN0cnVjdCB1c19kYXRhICp1cykKewoJLy9TU0ZEQ1RZUEVfVCBhYSA9IChTU0ZEQ1RZUEVfVCApICZTc2ZkYzsKCS8vQUREUkVTU19UICAgYmIgPSAoQUREUkVTU19UKSAmTWVkaWE7CglTZWN0Q29weU1vZGU9Q09NUExFVEVEOwoJTWVkaWEuUGh5QmxvY2s9V3JpdGVCbG9jazsKCglpZiAoTWFya0ZhaWxfRF9QaHlPbmVCbG9jayh1cykpCgkJcmV0dXJuKEVSUk9SKTsKCglNZWRpYS5QaHlCbG9jaz1SZWFkQmxvY2s7CglyZXR1cm4oU1VDQ0VTUyk7Cn0KCi8vU21hcnRNZWRpYSBQaHlzaWNhbCBTZWN0b3IgRGF0YSBDb3B5IFN1YnJvdXRpbmUKLy8tLS0tLSBDb3B5X0RfUGh5T25lU2VjdCgpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmludCBDb3B5X0RfUGh5T25lU2VjdChzdHJ1Y3QgdXNfZGF0YSAqdXMpCnsKCWludCAgICAgICAgICAgaTsKCURXT1JEICBlcnIsIHJldHJ5OwoJLy9TU0ZEQ1RZUEVfVCBhYSA9IChTU0ZEQ1RZUEVfVCApICZTc2ZkYzsKCS8vQUREUkVTU19UICAgYmIgPSAoQUREUkVTU19UKSAmTWVkaWE7CgoJLy9wcmludGsoIkNvcHlfRF9QaHlPbmVTZWN0IC0tLSBTZWNvdHIgPSAleFxuIiwgTWVkaWEuU2VjdG9yKTsKCWlmIChSZWFkQmxvY2shPU5PX0FTU0lHTikKCXsKCQlNZWRpYS5QaHlCbG9jaz1SZWFkQmxvY2s7CgkJZm9yKHJldHJ5PTA7IHJldHJ5PDI7IHJldHJ5KyspCgkJewoJCQlpZiAocmV0cnkhPTApCgkJCXsKCQkJCVNzZmRjX0RfUmVzZXQodXMpOwoJCQkJaWYgKFNzZmRjX0RfUmVhZENpc1NlY3QodXMsV29ya0J1ZixXb3JrUmVkdW5kKSkKCQkJCXsgRXJyQ29kZSA9IEVSUl9Id0Vycm9yOyBNZWRpYUNoYW5nZT1FUlJPUjsgcmV0dXJuKEVSUk9SKTsgfQoKCQkJCWlmIChDaGVja19EX0NJU2RhdGEoV29ya0J1ZixXb3JrUmVkdW5kKSkKCQkJCXsgRXJyQ29kZSA9IEVSUl9Id0Vycm9yOyBNZWRpYUNoYW5nZT1FUlJPUjsgcmV0dXJuKEVSUk9SKTsgfQoJCQl9CgoJCQlpZiAoU3NmZGNfRF9SZWFkU2VjdCh1cyxXb3JrQnVmLFdvcmtSZWR1bmQpKQoJCQl7IEVyckNvZGUgPSBFUlJfSHdFcnJvcjsgTWVkaWFDaGFuZ2U9RVJST1I7IHJldHVybihFUlJPUik7IH0KCQkJaWYgKENoZWNrX0RfRGF0YVN0YXR1cyhXb3JrUmVkdW5kKSkKCQkJeyBlcnI9RVJST1I7IGJyZWFrOyB9CgkJCWlmICghQ2hlY2tfRF9SZWFkRXJyb3IoV29ya1JlZHVuZCkpCgkJCXsgZXJyPVNVQ0NFU1M7IGJyZWFrOyB9CgkJCWlmICghQ2hlY2tfRF9Db3JyZWN0KFdvcmtCdWYsV29ya1JlZHVuZCkpCgkJCXsgZXJyPVNVQ0NFU1M7IGJyZWFrOyB9CgoJCQllcnI9RVJST1I7CgkJCVNlY3RDb3B5TW9kZT1SRVFfRkFJTDsKCQl9Cgl9CgllbHNlCgl7CgkJZXJyPVNVQ0NFU1M7CgkJZm9yKGk9MDsgaTxTRUNUU0laRTsgaSsrKQoJCQlXb3JrQnVmW2ldPURVTU1ZX0RBVEE7CgkJQ2xyX0RfUmVkdW5kYW50RGF0YShXb3JrUmVkdW5kKTsKCX0KCglTZXRfRF9Mb2dCbG9ja0FkZHIoV29ya1JlZHVuZCk7CglpZiAoZXJyPT1FUlJPUikKCXsKCQlTZXRfRF9SaWdodEVDQyhXb3JrUmVkdW5kKTsKCQlTZXRfRF9EYXRhU3RhdXMoV29ya1JlZHVuZCk7Cgl9CgoJTWVkaWEuUGh5QmxvY2s9V3JpdGVCbG9jazsKCglpZiAoU3NmZGNfRF9Xcml0ZVNlY3RGb3JDb3B5KHVzLCBXb3JrQnVmLCBXb3JrUmVkdW5kKSkKCXsgRXJyQ29kZSA9IEVSUl9Id0Vycm9yOyBNZWRpYUNoYW5nZT1FUlJPUjsgcmV0dXJuKEVSUk9SKTsgfQoJaWYgKFNzZmRjX0RfQ2hlY2tTdGF0dXMoKSkKCXsgRXJyQ29kZSA9IEVSUl9Xcml0ZUZhdWx0OyByZXR1cm4oRVJST1IpOyB9CgoJTWVkaWEuUGh5QmxvY2s9UmVhZEJsb2NrOwoJcmV0dXJuKFNVQ0NFU1MpOwp9CgovL1NtYXJ0TWVkaWEgUGh5c2ljYWwgU2VjdG9yIFJlYWQvV3JpdGUvRXJhc2UgU3Vicm91dGluZQovLy0tLS0tIFJlYWRfRF9QaHlPbmVTZWN0KCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KaW50IFJlYWRfRF9QaHlPbmVTZWN0KHN0cnVjdCB1c19kYXRhICp1cywgV09SRCBjb3VudCwgQllURSAqYnVmKQp7CglpbnQgICAgICAgICAgIGk7CglEV09SRCAgcmV0cnk7CgkvL1NTRkRDVFlQRV9UIGFhID0gKFNTRkRDVFlQRV9UICkgJlNzZmRjOwoJLy9BRERSRVNTX1QgICBiYiA9IChBRERSRVNTX1QpICZNZWRpYTsKCglpZiAoTWVkaWEuUGh5QmxvY2s9PU5PX0FTU0lHTikKCXsKCQlmb3IoaT0wOyBpPFNFQ1RTSVpFOyBpKyspCgkJCSpidWYrKz1EVU1NWV9EQVRBOwoJCXJldHVybihTVUNDRVNTKTsKCX0KCglmb3IocmV0cnk9MDsgcmV0cnk8MjsgcmV0cnkrKykKCXsKCQlpZiAocmV0cnkhPTApCgkJewoJCQlTc2ZkY19EX1Jlc2V0KHVzKTsKCgkJCWlmIChTc2ZkY19EX1JlYWRDaXNTZWN0KHVzLFdvcmtCdWYsV29ya1JlZHVuZCkpCgkJCXsgRXJyQ29kZSA9IEVSUl9Id0Vycm9yOyBNZWRpYUNoYW5nZT1FUlJPUjsgcmV0dXJuKEVSUk9SKTsgfQoJCQlpZiAoQ2hlY2tfRF9DSVNkYXRhKFdvcmtCdWYsV29ya1JlZHVuZCkpCgkJCXsgRXJyQ29kZSA9IEVSUl9Id0Vycm9yOyBNZWRpYUNoYW5nZT1FUlJPUjsgcmV0dXJuKEVSUk9SKTsgfQoJCX0KCgkJLy9pZiAoU3NmZGNfRF9SZWFkU2VjdChmZG9FeHQsYnVmLFJlZHVuZGFudCkpCgkJaWYgKFNzZmRjX0RfUmVhZEJsb2NrKHVzLGNvdW50LGJ1ZixSZWR1bmRhbnQpKQoJCXsgRXJyQ29kZSA9IEVSUl9Id0Vycm9yOyBNZWRpYUNoYW5nZT1FUlJPUjsgcmV0dXJuKEVSUk9SKTsgfQoJCWlmIChDaGVja19EX0RhdGFTdGF0dXMoUmVkdW5kYW50KSkKCQl7IEVyckNvZGUgPSBFUlJfRGF0YVN0YXR1czsgcmV0dXJuKEVSUk9SKTsgfQoKCQlpZiAoIUNoZWNrX0RfUmVhZEVycm9yKFJlZHVuZGFudCkpCgkJCXJldHVybihTVUNDRVNTKTsKCgkJaWYgKCFDaGVja19EX0NvcnJlY3QoYnVmLFJlZHVuZGFudCkpCgkJeyBFcnJDb2RlID0gRVJSX0NvclJlYWRFcnI7IHJldHVybihFUlJPUik7IH0KCX0KCglFcnJDb2RlID0gRVJSX0VjY1JlYWRFcnI7CglyZXR1cm4oRVJST1IpOwp9Ci8qCi8vLS0tLS0gV3JpdGVfRF9QaHlPbmVTZWN0KCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQppbnQgV3JpdGVfRF9QaHlPbmVTZWN0KFBGRE9fREVWSUNFX0VYVEVOU0lPTiBmZG9FeHQsIFdPUkQgY291bnQsIEJZVEUgKmJ1ZikKewogICAgU1NGRENUWVBFX1QgYWEgPSAoU1NGRENUWVBFX1QgKSAmU3NmZGM7CiAgICBBRERSRVNTX1QgICBiYiA9IChBRERSRVNTX1QpICZNZWRpYTsKCiAgICAvL2lmIChTc2ZkY19EX1dyaXRlU2VjdChmZG9FeHQsYnVmLFJlZHVuZGFudCkpCiAgICBpZiAoU3NmZGNfRF9Xcml0ZUJsb2NrKGZkb0V4dCxjb3VudCxidWYsUmVkdW5kYW50KSkKICAgIHsgRXJyQ29kZSA9IEVSUl9Id0Vycm9yOyBNZWRpYUNoYW5nZT1FUlJPUjsgcmV0dXJuKEVSUk9SKTsgfQogICAgaWYgKFNzZmRjX0RfQ2hlY2tTdGF0dXMoKSkKICAgIHsgRXJyQ29kZSA9IEVSUl9Xcml0ZUZhdWx0OyByZXR1cm4oRVJST1IpOyB9CgogICAgcmV0dXJuKFNVQ0NFU1MpOwp9CiovCi8vLS0tLS0gRXJhc2VfRF9QaHlPbmVCbG9jaygpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQppbnQgRXJhc2VfRF9QaHlPbmVCbG9jayhzdHJ1Y3QgdXNfZGF0YSAqdXMpCnsKCS8vU1NGRENUWVBFX1QgYWEgPSAoU1NGRENUWVBFX1QgKSAmU3NmZGM7CgkvL0FERFJFU1NfVCAgIGJiID0gKEFERFJFU1NfVCkgJk1lZGlhOwoKCWlmIChTc2ZkY19EX0VyYXNlQmxvY2sodXMpKQoJeyBFcnJDb2RlID0gRVJSX0h3RXJyb3I7IE1lZGlhQ2hhbmdlPUVSUk9SOyByZXR1cm4oRVJST1IpOyB9CglpZiAoU3NmZGNfRF9DaGVja1N0YXR1cygpKQoJeyBFcnJDb2RlID0gRVJSX1dyaXRlRmF1bHQ7IHJldHVybihFUlJPUik7IH0KCglyZXR1cm4oU1VDQ0VTUyk7Cn0KCi8vU21hcnRNZWRpYSBQaHlzaWNhbCBGb3JtYXQgQ2hlY2sgTG9jYWwgU3Vicm91dGluZQovLy0tLS0tIFNldF9EX1BoeUZtdFZhbHVlKCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KaW50IFNldF9EX1BoeUZtdFZhbHVlKHN0cnVjdCB1c19kYXRhICp1cykKewovLyAgICBQUERPX0RFVklDRV9FWFRFTlNJT04gICBwZG9FeHQ7Ci8vICAgIEJZVEUgICAgICBpZGNvZGVbNF07Ci8vICAgIERXT1JEICAgICBVc2VyRGVmRGF0YV8xLCBVc2VyRGVmRGF0YV8yLCBEYXRhLCBtYXNrOwovLwovLyAgICAvL2lmICghZmRvRXh0LT5DaGlsZERldmljZU9iamVjdCkgICAgICAgcmV0dXJuKEVSUk9SKTsKLy8gICAgLy9wZG9FeHQgPSBmZG9FeHQtPkNoaWxkRGV2aWNlT2JqZWN0LT5EZXZpY2VFeHRlbnNpb247Ci8vCi8vICAgIFNzZmRjX0RfUmVhZElEKGlkY29kZSwgUkVBRF9JRF8xKTsKLy8KICAgIC8vaWYgKFNldF9EX1NzZmRjTW9kZWwoaWRjb2RlWzFdKSkKICAgIGlmIChTZXRfRF9Tc2ZkY01vZGVsKHVzLT5TTV9EZXZpY2VJRCkpCiAgICAgICAgcmV0dXJuKEVSUk9SKTsKCi8vICAgIC8vVXNlIE11bHRpLWZ1bmN0aW9uIHBpbiB0byBkaWZmZXJlbnRpYXRlIFNNIGFuZCB4RC4KLy8gICAgVXNlckRlZkRhdGFfMSA9IFJlYWRQQ0lSZWcoZmRvRXh0LT5CdXNJRCwgZmRvRXh0LT5EZXZJRCwgZmRvRXh0LT5GdW5jSUQsIFBDSV9SRUdfVVNFUl9ERUYpICYgMHg4MDsKLy8gICAgaWYgKFVzZXJEZWZEYXRhXzEpCi8vICAgIHsKLy8gICAgICAgaWYgKCBSRUFEX1BPUlRfQllURShTTV9SRUdfSU5UX1NUQVRVUykgJiAweDgwICkgICAgICBmZG9FeHQtPkRpc2tUeXBlID0gRElTS1RZUEVfWEQ7Ci8vICAgICAgIGlmICggUkVBRF9QT1JUX0JZVEUoU01fUkVHX0lOVF9TVEFUVVMpICYgMHg0MCApICAgICAgZmRvRXh0LT5EaXNrVHlwZSA9IERJU0tUWVBFX1NNOwovLwovLyAgICAgICBpZiAoIElzWERDb21wbGlhbmNlICYmIChmZG9FeHQtPkRpc2tUeXBlID09IERJU0tUWVBFX1hEKSApCi8vICAgICAgIHsKLy8gICAgICAgICAgU3NmZGNfRF9SZWFkSUQoaWRjb2RlLCBSRUFEX0lEXzMpOwovLyAgICAgICAgICBpZiAoaWRjb2RlWzJdICE9IDB4QjUpCi8vICAgICAgICAgICAgIHJldHVybihFUlJPUik7Ci8vICAgICAgIH0KLy8gICAgfQovLwovLyAgICAvL1VzZSBHUElPIHRvIGRpZmZlcmVudGlhdGUgU00gYW5kIHhELgovLyAgICBVc2VyRGVmRGF0YV8yID0gUmVhZFBDSVJlZyhmZG9FeHQtPkJ1c0lELCBmZG9FeHQtPkRldklELCBmZG9FeHQtPkZ1bmNJRCwgUENJX1JFR19VU0VSX0RFRikgPj4gODsKLy8gICAgaWYgKCBVc2VyRGVmRGF0YV8yICkKLy8gICAgewovLyAgICAgICBEYXRhID0gUmVhZFBDSVJlZyhmZG9FeHQtPkJ1c0lELCBmZG9FeHQtPkRldklELCAwLCAweEFDKTsKLy8KLy8gICAgICAgbWFzayA9IDEgPDwgKFVzZXJEZWZEYXRhXzItMSk7Ci8vICAgICAgIC8vIDEgOiB4RCAsIDAgOiBTTQovLyAgICAgICBpZiAoIERhdGEgJiBtYXNrKQovLyAgICAgICAgICBmZG9FeHQtPkRpc2tUeXBlID0gRElTS1RZUEVfWEQ7Ci8vICAgICAgIGVsc2UKLy8gICAgICAgICAgZmRvRXh0LT5EaXNrVHlwZSA9IERJU0tUWVBFX1NNOwovLwovLyAgICAgICBpZiAoIElzWERDb21wbGlhbmNlICYmIChmZG9FeHQtPkRpc2tUeXBlID09IERJU0tUWVBFX1hEKSApCi8vICAgICAgIHsKLy8gICAgICAgICAgU3NmZGNfRF9SZWFkSUQoaWRjb2RlLCBSRUFEX0lEXzMpOwovLyAgICAgICAgICBpZiAoaWRjb2RlWzJdICE9IDB4QjUpCi8vICAgICAgICAgICAgIHJldHVybihFUlJPUik7Ci8vICAgICAgIH0KLy8gICAgfQovLwovLyAgICBpZiAoICEoVXNlckRlZkRhdGFfMSB8IFVzZXJEZWZEYXRhXzIpICkKLy8gICAgewovLyAgICAgIC8vIFVzZSBVc2VyRGVmaW5lIFJlZ2lzdGVyIHRvIGRpZmZlcmVudGlhdGUgU00gYW5kIHhELgovLyAgICAgIFNzZmRjX0RfUmVhZElEKGlkY29kZSwgUkVBRF9JRF8zKTsKLy8KLy8gICAgICBpZiAoaWRjb2RlWzJdID09IDB4QjUpCi8vICAgICAgICAgZmRvRXh0LT5EaXNrVHlwZSA9IERJU0tUWVBFX1hEOwovLyAgICAgIGVsc2UKLy8gICAgICB7Ci8vICAgICAgICAgIGlmICghSXNYRENvbXBsaWFuY2UpCi8vICAgICAgICAgICAgIGZkb0V4dC0+RGlza1R5cGUgPSBESVNLVFlQRV9TTTsKLy8gICAgICAgICAgZWxzZQovLyAgICAgICAgICAgICByZXR1cm4oRVJST1IpOwovLyAgICAgIH0KLy8KLy8gICAgICBpZiAoZmRvRXh0LT5Vc2VyRGVmX0Rpc2tUeXBlID09IDB4MDQpICBmZG9FeHQtPkRpc2tUeXBlID0gRElTS1RZUEVfWEQ7Ci8vICAgICAgaWYgKGZkb0V4dC0+VXNlckRlZl9EaXNrVHlwZSA9PSAweDA4KSAgZmRvRXh0LT5EaXNrVHlwZSA9IERJU0tUWVBFX1NNOwovLyAgICB9Ci8vCi8vICAgIGlmICghZmRvRXh0LT5Vc2VyRGVmX0Rpc2FibGVXUCkKLy8gICAgewovLyAgICAgICBpZiAoZmRvRXh0LT5EaXNrVHlwZSA9PSBESVNLVFlQRV9TTSkKLy8gICAgICAgewovLyAgICAgICAgICAgaWYgKENoZWNrX0RfU3NmZGNXUCgpKQovLyAgICAgICAgICAgICAgU3NmZGMuQXR0cmlidXRlfD1XUDsKLy8gICAgICAgfQovLyAgICB9CgogICAgcmV0dXJuKFNVQ0NFU1MpOwp9CgovLy0tLS0tIFNlYXJjaF9EX0NJUygpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KaW50IFNlYXJjaF9EX0NJUyhzdHJ1Y3QgdXNfZGF0YSAqdXMpCnsKCS8vU1NGRENUWVBFX1QgYWEgPSAoU1NGRENUWVBFX1QgKSAmU3NmZGM7CgkvL0FERFJFU1NfVCAgIGJiID0gKEFERFJFU1NfVCkgJk1lZGlhOwoKCU1lZGlhLlpvbmU9MDsgTWVkaWEuU2VjdG9yPTA7CgoJZm9yIChNZWRpYS5QaHlCbG9jaz0wOyBNZWRpYS5QaHlCbG9jazwoU3NmZGMuTWF4QmxvY2tzLVNzZmRjLk1heExvZ0Jsb2Nrcy0xKTsgTWVkaWEuUGh5QmxvY2srKykKCXsKCQlpZiAoU3NmZGNfRF9SZWFkUmVkdERhdGEodXMsIFJlZHVuZGFudCkpCgkJewoJCQlTc2ZkY19EX1Jlc2V0KHVzKTsKCQkJcmV0dXJuKEVSUk9SKTsKCQl9CgoJCWlmICghQ2hlY2tfRF9GYWlsQmxvY2soUmVkdW5kYW50KSkKCQkJYnJlYWs7Cgl9CgoJaWYgKE1lZGlhLlBoeUJsb2NrPT0oU3NmZGMuTWF4QmxvY2tzLVNzZmRjLk1heExvZ0Jsb2Nrcy0xKSkKCXsKCQlTc2ZkY19EX1Jlc2V0KHVzKTsKCQlyZXR1cm4oRVJST1IpOwoJfQoKCXdoaWxlIChNZWRpYS5TZWN0b3I8Q0lTX1NFQVJDSF9TRUNUKQoJewoJCWlmIChNZWRpYS5TZWN0b3IpCgkJewoJCQlpZiAoU3NmZGNfRF9SZWFkUmVkdERhdGEodXMsIFJlZHVuZGFudCkpCgkJCXsKCQkJCVNzZmRjX0RfUmVzZXQodXMpOwoJCQkJcmV0dXJuKEVSUk9SKTsKCQkJfQoJCX0KCQlpZiAoIUNoZWNrX0RfRGF0YVN0YXR1cyhSZWR1bmRhbnQpKQoJCXsKCQkJaWYgKFNzZmRjX0RfUmVhZFNlY3QodXMsV29ya0J1ZixSZWR1bmRhbnQpKQoJCQl7CgkJCQlTc2ZkY19EX1Jlc2V0KHVzKTsKCQkJCXJldHVybihFUlJPUik7CgkJCX0KCgkJCWlmIChDaGVja19EX0NJU2RhdGEoV29ya0J1ZixSZWR1bmRhbnQpKQoJCQl7CgkJCQlTc2ZkY19EX1Jlc2V0KHVzKTsKCQkJCXJldHVybihFUlJPUik7CgkJCX0KCgkJCUNpc0FyZWEuUGh5QmxvY2s9TWVkaWEuUGh5QmxvY2s7CgkJCUNpc0FyZWEuU2VjdG9yPU1lZGlhLlNlY3RvcjsKCQkJU3NmZGNfRF9SZXNldCh1cyk7CgkJCXJldHVybihTVUNDRVNTKTsKCQl9CgoJCU1lZGlhLlNlY3RvcisrOwoJfQoKCVNzZmRjX0RfUmVzZXQodXMpOwoJcmV0dXJuKEVSUk9SKTsKfQoKLy8tLS0tLSBNYWtlX0RfTG9nVGFibGUoKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmludCBNYWtlX0RfTG9nVGFibGUoc3RydWN0IHVzX2RhdGEgKnVzKQp7CglXT1JEICBwaHlibG9jayxsb2dibG9jazsKCS8vU1NGRENUWVBFX1QgYWEgPSAoU1NGRENUWVBFX1QgKSAmU3NmZGM7CgkvL0FERFJFU1NfVCAgIGJiID0gKEFERFJFU1NfVCkgJk1lZGlhOwoKCWlmIChMb2cyUGh5W01lZGlhLlpvbmVdPT1OVUxMKQoJewoJCUxvZzJQaHlbTWVkaWEuWm9uZV0gPSBrbWFsbG9jKE1BWF9MT0dCTE9DSypzaXplb2YoV09SRCksIEdGUF9LRVJORUwpOwoJCS8vcHJpbnRrKCJFeEFsbG9jYXRlUG9vbCBab25lID0gJXgsIEFkZHIgPSAleFxuIiwgTWVkaWEuWm9uZSwgTG9nMlBoeVtNZWRpYS5ab25lXSk7CgkJaWYgKExvZzJQaHlbTWVkaWEuWm9uZV09PU5VTEwpCgkJCXJldHVybihFUlJPUik7Cgl9CgoJTWVkaWEuU2VjdG9yPTA7CgoJLy9mb3IoTWVkaWEuWm9uZT0wOyBNZWRpYS5ab25lPE1BWF9aT05FTlVNOyBNZWRpYS5ab25lKyspCgkvL2ZvcihNZWRpYS5ab25lPTA7IE1lZGlhLlpvbmU8U3NmZGMuTWF4Wm9uZXM7IE1lZGlhLlpvbmUrKykKCXsKCQkvL3ByaW50aygiTWFrZV9EX0xvZ1RhYmxlIC0tLSBNZWRpYVpvbmUgPSAweCV4XG4iLCBNZWRpYS5ab25lKTsKCQlmb3IoTWVkaWEuTG9nQmxvY2s9MDsgTWVkaWEuTG9nQmxvY2s8U3NmZGMuTWF4TG9nQmxvY2tzOyBNZWRpYS5Mb2dCbG9jaysrKQoJCQlMb2cyUGh5W01lZGlhLlpvbmVdW01lZGlhLkxvZ0Jsb2NrXT1OT19BU1NJR047CgoJCWZvcihNZWRpYS5QaHlCbG9jaz0wOyBNZWRpYS5QaHlCbG9jazwoTUFYX0JMT0NLTlVNLzgpOyBNZWRpYS5QaHlCbG9jaysrKQoJCQlBc3NpZ25bTWVkaWEuWm9uZV1bTWVkaWEuUGh5QmxvY2tdPTB4MDA7CgoJCWZvcihNZWRpYS5QaHlCbG9jaz0wOyBNZWRpYS5QaHlCbG9jazxTc2ZkYy5NYXhCbG9ja3M7IE1lZGlhLlBoeUJsb2NrKyspCgkJewoJCQlpZiAoKCFNZWRpYS5ab25lKSAmJiAoTWVkaWEuUGh5QmxvY2s8PUNpc0FyZWEuUGh5QmxvY2spKQoJCQl7CgkJCQlTZXRfRF9CaXQoQXNzaWduW01lZGlhLlpvbmVdLE1lZGlhLlBoeUJsb2NrKTsKCQkJCWNvbnRpbnVlOwoJCQl9CgoJCQlpZiAoU3NmZGNfRF9SZWFkUmVkdERhdGEodXMsIFJlZHVuZGFudCkpCgkJCXsgU3NmZGNfRF9SZXNldCh1cyk7IHJldHVybihFUlJPUik7IH0KCgkJCWlmICghQ2hlY2tfRF9EYXRhQmxhbmsoUmVkdW5kYW50KSkKCQkJCWNvbnRpbnVlOwoKCQkJU2V0X0RfQml0KEFzc2lnbltNZWRpYS5ab25lXSxNZWRpYS5QaHlCbG9jayk7CgoJCQlpZiAoQ2hlY2tfRF9GYWlsQmxvY2soUmVkdW5kYW50KSkKCQkJCWNvbnRpbnVlOwoKCQkJLy9pZiAoQ2hlY2tfRF9EYXRhU3RhdHVzKFJlZHVuZGFudCkpCgkJCS8vICAgIGNvbnRpbnVlOwoKCQkJaWYgKExvYWRfRF9Mb2dCbG9ja0FkZHIoUmVkdW5kYW50KSkKCQkJCWNvbnRpbnVlOwoKCQkJaWYgKE1lZGlhLkxvZ0Jsb2NrPj1Tc2ZkYy5NYXhMb2dCbG9ja3MpCgkJCQljb250aW51ZTsKCgkJCWlmIChMb2cyUGh5W01lZGlhLlpvbmVdW01lZGlhLkxvZ0Jsb2NrXT09Tk9fQVNTSUdOKQoJCQl7CgkJCQlMb2cyUGh5W01lZGlhLlpvbmVdW01lZGlhLkxvZ0Jsb2NrXT1NZWRpYS5QaHlCbG9jazsKCQkJCWNvbnRpbnVlOwoJCQl9CgoJCQlwaHlibG9jayAgICAgPSBNZWRpYS5QaHlCbG9jazsKCQkJbG9nYmxvY2sgICAgID0gTWVkaWEuTG9nQmxvY2s7CgkJCU1lZGlhLlNlY3RvciA9IChCWVRFKShTc2ZkYy5NYXhTZWN0b3JzLTEpOwoKCQkJaWYgKFNzZmRjX0RfUmVhZFJlZHREYXRhKHVzLCBSZWR1bmRhbnQpKQoJCQl7IFNzZmRjX0RfUmVzZXQodXMpOyByZXR1cm4oRVJST1IpOyB9CgoJCQlpZiAoIUxvYWRfRF9Mb2dCbG9ja0FkZHIoUmVkdW5kYW50KSkKCQkJewoJCQkJaWYgKE1lZGlhLkxvZ0Jsb2NrPT1sb2dibG9jaykKCQkJCXsKCQkJCQlNZWRpYS5QaHlCbG9jaz1Mb2cyUGh5W01lZGlhLlpvbmVdW2xvZ2Jsb2NrXTsKCgkJCQkJaWYgKFNzZmRjX0RfUmVhZFJlZHREYXRhKHVzLCBSZWR1bmRhbnQpKQoJCQkJCXsgU3NmZGNfRF9SZXNldCh1cyk7IHJldHVybihFUlJPUik7IH0KCgkJCQkJTWVkaWEuUGh5QmxvY2s9cGh5YmxvY2s7CgoJCQkJCWlmICghTG9hZF9EX0xvZ0Jsb2NrQWRkcihSZWR1bmRhbnQpKQoJCQkJCXsKCQkJCQkJaWYgKE1lZGlhLkxvZ0Jsb2NrIT1sb2dibG9jaykKCQkJCQkJewoJCQkJCQkJTWVkaWEuUGh5QmxvY2s9TG9nMlBoeVtNZWRpYS5ab25lXVtsb2dibG9ja107CgkJCQkJCQlMb2cyUGh5W01lZGlhLlpvbmVdW2xvZ2Jsb2NrXT1waHlibG9jazsKCQkJCQkJfQoJCQkJCX0KCQkJCQllbHNlCgkJCQkJewoJCQkJCQlNZWRpYS5QaHlCbG9jaz1Mb2cyUGh5W01lZGlhLlpvbmVdW2xvZ2Jsb2NrXTsKCQkJCQkJTG9nMlBoeVtNZWRpYS5ab25lXVtsb2dibG9ja109cGh5YmxvY2s7CgkJCQkJfQoJCQkJfQoJCQl9CgoJCQlNZWRpYS5TZWN0b3I9MDsKCi8vIGhlcmUgTm90IHlldAovLyNpZmRlZiBMMlBfRVJSX0VSQVNFCi8vCQkJaWYgKCEoU3NmZGMuQXR0cmlidXRlICZNV1ApKQovLwkJCXsKLy8JCQkJU3NmZGNfRF9SZXNldChmZG9FeHQpOwovLwkJCQlpZiAoU3NmZGNfRF9FcmFzZUJsb2NrKGZkb0V4dCkpCi8vCQkJCQlyZXR1cm4oRVJST1IpOwovLwovLwkJCQlpZiAoU3NmZGNfRF9DaGVja1N0YXR1cygpKQovLwkJCQl7Ci8vCQkJCQlpZiAoTWFya0ZhaWxfRF9QaHlPbmVCbG9jaygpKQovLwkJCQkJCXJldHVybihFUlJPUik7Ci8vCQkJCX0KLy8JCQkJZWxzZQovLwkJCQkJQ2xyX0RfQml0KEFzc2lnbltNZWRpYS5ab25lXSxNZWRpYS5QaHlCbG9jayk7Ci8vCQkJfQovLyNlbHNlCi8vCQkJU3NmZGMuQXR0cmlidXRlfD1NV1A7Ci8vI2VuZGlmCgkJCU1lZGlhLlBoeUJsb2NrPXBoeWJsb2NrOwoKCQl9IC8vIEVuZCBmb3IgKE1lZGlhLlBoeUJsb2NrPFNzZmRjLk1heEJsb2NrcykKCgkJQXNzaWduU3RhcnRbTWVkaWEuWm9uZV09MDsKCgl9IC8vIEVuZCBmb3IgKE1lZGlhLlpvbmU8TUFYX1pPTkVOVU0pCgoJU3NmZGNfRF9SZXNldCh1cyk7CglyZXR1cm4oU1VDQ0VTUyk7Cn0KCi8vLS0tLS0gTWFya0ZhaWxfRF9QaHlPbmVCbG9jaygpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQppbnQgTWFya0ZhaWxfRF9QaHlPbmVCbG9jayhzdHJ1Y3QgdXNfZGF0YSAqdXMpCnsKCUJZVEUgc2VjdDsKCS8vU1NGRENUWVBFX1QgYWEgPSAoU1NGRENUWVBFX1QgKSAmU3NmZGM7CgkvL0FERFJFU1NfVCAgIGJiID0gKEFERFJFU1NfVCkgJk1lZGlhOwoKCXNlY3Q9TWVkaWEuU2VjdG9yOwoJU2V0X0RfRmFpbEJsb2NrKFdvcmtSZWR1bmQpOwoJLy9Tc2ZkY19EX1dyaXRlUmVkdE1vZGUoKTsKCglmb3IoTWVkaWEuU2VjdG9yPTA7IE1lZGlhLlNlY3RvcjxTc2ZkYy5NYXhTZWN0b3JzOyBNZWRpYS5TZWN0b3IrKykKCXsKCQlpZiAoU3NmZGNfRF9Xcml0ZVJlZHREYXRhKHVzLCBXb3JrUmVkdW5kKSkKCQl7CgkJCVNzZmRjX0RfUmVzZXQodXMpOwoJCQlNZWRpYS5TZWN0b3IgICA9IHNlY3Q7CgkJCUVyckNvZGUgICAgICAgID0gRVJSX0h3RXJyb3I7CgkJCU1lZGlhQ2hhbmdlID0gRVJST1I7CgkJCXJldHVybihFUlJPUik7CgkJfSAvLyBOTyBTdGF0dXMgQ2hlY2sKCX0KCglTc2ZkY19EX1Jlc2V0KHVzKTsKCU1lZGlhLlNlY3Rvcj1zZWN0OwoJcmV0dXJuKFNVQ0NFU1MpOwp9Ci8qCi8vCi8vLy8tLS0tLSBTTV9Jbml0KCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovL3ZvaWQgU01fSW5pdCh2b2lkKQovL3sKLy8gICAgX0h3X0RfQ2xySW50Q2FyZENoZygpOwovLyAgICBfSHdfRF9TZXRJbnRNYXNrKCk7Ci8vICAgIC8vIEZvciBETUEgSW50ZXJydXB0Ci8vICAgIF9Id19EX0NsckRNQUludENhcmRDaGcoKTsKLy8gICAgX0h3X0RfU2V0RE1BSW50TWFzaygpOwovL30KLy8KLy8vLy0tLS0tIE1lZGlhX0RfRXJhc2VBbGxSZWR0RGF0YSgpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vaW50IE1lZGlhX0RfRXJhc2VBbGxSZWR0RGF0YShEV09SRCBJbmRleCwgQk9PTEVBTiBDaGVja0Jsb2NrKQovL3sKLy8gICAgQllURSAgICBpOwovLwovLyAgICBpZiAoQ2hlY2tfRF9NZWRpYVBvd2VyKCkpCi8vICAgICAgICByZXR1cm4oRXJyQ29kZSk7Ci8vCi8vICAgIGlmIChDaGVja19EX01lZGlhV1AoKSkKLy8gICAgICAgIHJldHVybihFcnJDb2RlKTsKLy8KLy8gICAgZm9yIChpPTA7IGk8UkVEVFNJWkU7IGkrKykKLy8gICAgICAgIFdvcmtSZWR1bmRbaV0gPSAweEZGOwovLwovLyAgICBNZWRpYS5ab25lID0gKEJZVEUpSW5kZXg7Ci8vICAgIGZvciAoTWVkaWEuUGh5QmxvY2s9MDsgTWVkaWEuUGh5QmxvY2s8U3NmZGMuTWF4QmxvY2tzOyBNZWRpYS5QaHlCbG9jaysrKQovLyAgICB7Ci8vICAgICAgICBpZiAoKCFNZWRpYS5ab25lKSAmJiAoTWVkaWEuUGh5QmxvY2s8PUNpc0FyZWEuUGh5QmxvY2spKQovLyAgICAgICAgICAgIGNvbnRpbnVlOwovLwovLyAgICAgICAgaWYgKFNzZmRjX0RfRXJhc2VCbG9jayhmZG9FeHQpKQovLyAgICAgICAgewovLyAgICAgICAgICAgIEVyckNvZGUgPSBFUlJfSHdFcnJvcjsKLy8gICAgICAgICAgICByZXR1cm4oRVJST1IpOwovLyAgICAgICAgfQovLwovLyAgICAgICAgZm9yKE1lZGlhLlNlY3Rvcj0wOyBNZWRpYS5TZWN0b3I8U3NmZGMuTWF4U2VjdG9yczsgTWVkaWEuU2VjdG9yKyspCi8vICAgICAgICB7Ci8vICAgICAgICAgICAgU3NmZGNfRF9Xcml0ZVJlZHRNb2RlKCk7Ci8vCi8vICAgICAgICAgICAgaWYgKFNzZmRjX0RfV3JpdGVSZWR0RGF0YShXb3JrUmVkdW5kKSkKLy8gICAgICAgICAgICB7Ci8vICAgICAgICAgICAgICAgIFNzZmRjX0RfUmVzZXQoZmRvRXh0KTsKLy8gICAgICAgICAgICAgICAgRXJyQ29kZSAgICAgICAgPSBFUlJfSHdFcnJvcjsKLy8gICAgICAgICAgICAgICAgTWVkaWFDaGFuZ2UgICAgPSBFUlJPUjsKLy8gICAgICAgICAgICAgICAgcmV0dXJuKEVSUk9SKTsKLy8gICAgICAgICAgICB9IC8vIE5PIFN0YXR1cyBDaGVjawovLyAgICAgICAgfQovLwovLyAgICAgICAgU3NmZGNfRF9SZXNldChmZG9FeHQpOwovLyAgICB9Ci8vCi8vICAgIFNzZmRjX0RfUmVzZXQoZmRvRXh0KTsKLy8KLy8gICAgcmV0dXJuKFNVQ0NFU1MpOwovL30KLy8KLy8vLy0tLS0tIE1lZGlhX0RfR2V0TWVkaWFJbmZvKCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vRFdPUkQgTWVkaWFfRF9HZXRNZWRpYUluZm8oUEZET19ERVZJQ0VfRVhURU5TSU9OIGZkb0V4dCwgUElPQ1RMX01FRElBX0lORk9fSU4gcFBhcmFtSW4sIFBJT0NUTF9NRURJQV9JTkZPX09VVCBwUGFyYW1PdXQpCi8vewovLyAgICBwUGFyYW1PdXQtPkVyckNvZGUgPSBTVEFUVVNfQ01EX0ZBSUw7Ci8vCi8vICAgIEluaXRfRF9TbWFydE1lZGlhKCk7Ci8vCi8vICAgIGlmIChDaGVja19EX01lZGlhUG93ZXIoKSkKLy8gICAgICAgIHJldHVybiAoRXJyQ29kZT09RVJSX05vU21hcnRNZWRpYSkgPyBTVEFUVVNfQ01EX05PX01FRElBIDogU1RBVFVTX0NNRF9GQUlMOwovLwovLyAgICBpZiAoU2V0X0RfUGh5Rm10VmFsdWUoZmRvRXh0KSkKLy8gICAgICAgIHJldHVybiBTVEFUVVNfQ01EX0ZBSUw7Ci8vCi8vICAgIC8vdXNsZWVwKDU2KjEwMjQpOwovLyAgICBpZiAoU2VhcmNoX0RfQ0lTKGZkb0V4dCkpCi8vICAgICAgICByZXR1cm4gU1RBVFVTX0NNRF9GQUlMOwovLwovLyAgICBpZiAoQ2hlY2tfRF9NZWRpYVdQKCkpCi8vICAgICAgICByZXR1cm4gU1RBVFVTX0NNRF9NRURJQV9XUDsKLy8KLy8gICAgcFBhcmFtT3V0LT5QYWdlU2l6ZSAgPSBTc2ZkYy5NYXhTZWN0b3JzOwovLyAgICBwUGFyYW1PdXQtPkJsb2NrU2l6ZSA9IFNzZmRjLk1heEJsb2NrczsKLy8gICAgcFBhcmFtT3V0LT5ab25lU2l6ZSAgPSBTc2ZkYy5NYXhab25lczsKLy8KLy8gICAgcmV0dXJuIFNUQVRVU19DTURfU1VDQ0VTUzsKLy99Ki8K