LyoKICogcGFyc2UuYwogKgogKi8KLyogUG9ydGlvbnMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29weXJpZ2h0cy4gIFNlZQogKiB0aGUgTmV0LVNOTVAncyBDT1BZSU5HIGZpbGUgZm9yIG1vcmUgZGV0YWlscyBhbmQgb3RoZXIgY29weXJpZ2h0cwogKiB0aGF0IG1heSBhcHBseToKICovCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgICAgICBDb3B5cmlnaHQgMTk4OSwgMTk5MSwgMTk5MiBieSBDYXJuZWdpZSBNZWxsb24gVW5pdmVyc2l0eQoKICAgICAgICAgICAgICAgICAgICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQKClBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgYW5kIGl0cwpkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBhbmQgd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsCnByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kIHRoYXQKYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluCnN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbiwgYW5kIHRoYXQgdGhlIG5hbWUgb2YgQ01VIG5vdCBiZQp1c2VkIGluIGFkdmVydGlzaW5nIG9yIHB1YmxpY2l0eSBwZXJ0YWluaW5nIHRvIGRpc3RyaWJ1dGlvbiBvZiB0aGUKc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYywgd3JpdHRlbiBwcmlvciBwZXJtaXNzaW9uLgoKQ01VIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFLCBJTkNMVURJTkcKQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MsIElOIE5PIEVWRU5UIFNIQUxMCkNNVSBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBJTkRJUkVDVCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IKQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLApXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sCkFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMKU09GVFdBUkUuCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoKICogQ29weXJpZ2h0IKkgMjAwMyBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAqIFVzZSBpcyBzdWJqZWN0IHRvIGxpY2Vuc2UgdGVybXMgc3BlY2lmaWVkIGluIHRoZSBDT1BZSU5HIGZpbGUKICogZGlzdHJpYnV0ZWQgd2l0aCB0aGUgTmV0LVNOTVAgcGFja2FnZS4KICovCiNpbmNsdWRlIDxuZXQtc25tcC9uZXQtc25tcC1jb25maWcuaD4KCiNpZm5kZWYgTkVUU05NUF9ESVNBQkxFX01JQl9MT0FESU5HCgojaWYgSEFWRV9MSU1JVFNfSAojaW5jbHVkZSA8bGltaXRzLmg+CiNlbmRpZgojaW5jbHVkZSA8c3RkaW8uaD4KI2lmIEhBVkVfU1RETElCX0gKI2luY2x1ZGUgPHN0ZGxpYi5oPgojZW5kaWYKI2lmIEhBVkVfU1RSSU5HX0gKI2luY2x1ZGUgPHN0cmluZy5oPgojZWxzZQojaW5jbHVkZSA8c3RyaW5ncy5oPgojZW5kaWYKI2luY2x1ZGUgPGN0eXBlLmg+CiNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KI2lmIEhBVkVfU1lTX1NUQVRfSAojaW5jbHVkZSA8c3lzL3N0YXQuaD4KI2VuZGlmCgovKgogKiBXb3cuICBUaGlzIGlzIHVnbHkuICAtLSBXZXMgCiAqLwojaWYgSEFWRV9ESVJFTlRfSAojIGluY2x1ZGUgPGRpcmVudC5oPgojIGRlZmluZSBOQU1MRU4oZGlyZW50KSBzdHJsZW4oKGRpcmVudCktPmRfbmFtZSkKI2Vsc2UKIyBkZWZpbmUgZGlyZW50IGRpcmVjdAojIGRlZmluZSBOQU1MRU4oZGlyZW50KSAoZGlyZW50KS0+ZF9uYW1sZW4KIyBpZiBIQVZFX1NZU19ORElSX0gKIyAgaW5jbHVkZSA8c3lzL25kaXIuaD4KIyBlbmRpZgojIGlmIEhBVkVfU1lTX0RJUl9ICiMgIGluY2x1ZGUgPHN5cy9kaXIuaD4KIyBlbmRpZgojIGlmIEhBVkVfTkRJUl9ICiMgIGluY2x1ZGUgPG5kaXIuaD4KIyBlbmRpZgojZW5kaWYKI2lmIFRJTUVfV0lUSF9TWVNfVElNRQojIGluY2x1ZGUgPHN5cy90aW1lLmg+CiMgaW5jbHVkZSA8dGltZS5oPgojZWxzZQojIGlmIEhBVkVfU1lTX1RJTUVfSAojICBpbmNsdWRlIDxzeXMvdGltZS5oPgojIGVsc2UKIyAgaW5jbHVkZSA8dGltZS5oPgojIGVuZGlmCiNlbmRpZgojaWYgSEFWRV9ORVRJTkVUX0lOX0gKI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KI2VuZGlmCiNpZiBkZWZpbmVkKEhBVkVfUkVHRVhfSCkgJiYgZGVmaW5lZChIQVZFX1JFR0NPTVApCiNpbmNsdWRlIDxyZWdleC5oPgojZW5kaWYKI2lmIEhBVkVfVU5JU1REX0gKI2luY2x1ZGUgPHVuaXN0ZC5oPgojZW5kaWYKI2lmIEhBVkVfRE1BTExPQ19ICiNpbmNsdWRlIDxkbWFsbG9jLmg+CiNlbmRpZgoKI2luY2x1ZGUgPGVycm5vLmg+CgojaW5jbHVkZSA8bmV0LXNubXAvdHlwZXMuaD4KI2luY2x1ZGUgPG5ldC1zbm1wL291dHB1dF9hcGkuaD4KI2luY2x1ZGUgPG5ldC1zbm1wL2NvbmZpZ19hcGkuaD4KI2luY2x1ZGUgPG5ldC1zbm1wL3V0aWxpdGllcy5oPgoKI2luY2x1ZGUgPG5ldC1zbm1wL2xpYnJhcnkvcGFyc2UuaD4KI2luY2x1ZGUgPG5ldC1zbm1wL2xpYnJhcnkvbWliLmg+CiNpbmNsdWRlIDxuZXQtc25tcC9saWJyYXJ5L3NubXBfYXBpLmg+CgovKgogKiBBIGxpbmtlZCBsaXN0IG9mIG5vZGVzLgogKi8Kc3RydWN0IG5vZGUgewogICAgc3RydWN0IG5vZGUgICAgKm5leHQ7CiAgICBjaGFyICAgICAgICAgICAqbGFiZWw7ICAvKiBUaGlzIG5vZGUncyAodW5pcXVlKSB0ZXh0dWFsIG5hbWUgKi8KICAgIHVfbG9uZyAgICAgICAgICBzdWJpZDsgIC8qIFRoaXMgbm9kZSdzIGludGVnZXIgc3ViaWRlbnRpZmllciAqLwogICAgaW50ICAgICAgICAgICAgIG1vZGlkOyAgLyogVGhlIG1vZHVsZSBjb250YWluaW5nIHRoaXMgbm9kZSAqLwogICAgY2hhciAgICAgICAgICAgKnBhcmVudDsgLyogVGhlIHBhcmVudCdzIHRleHR1YWwgbmFtZSAqLwogICAgaW50ICAgICAgICAgICAgIHRjX2luZGV4OyAvKiBpbmRleCBpbnRvIHRjbGlzdCAoLTEgaWYgTkEpICovCiAgICBpbnQgICAgICAgICAgICAgdHlwZTsgICAvKiBUaGUgdHlwZSBvZiBvYmplY3QgdGhpcyByZXByZXNlbnRzICovCiAgICBpbnQgICAgICAgICAgICAgYWNjZXNzOwogICAgaW50ICAgICAgICAgICAgIHN0YXR1czsKICAgIHN0cnVjdCBlbnVtX2xpc3QgKmVudW1zOyAvKiAob3B0aW9uYWwpIGxpc3Qgb2YgZW51bWVyYXRlZCBpbnRlZ2VycyAqLwogICAgc3RydWN0IHJhbmdlX2xpc3QgKnJhbmdlczsKICAgIHN0cnVjdCBpbmRleF9saXN0ICppbmRleGVzOwogICAgY2hhciAgICAgICAgICAgKmF1Z21lbnRzOwogICAgc3RydWN0IHZhcmJpbmRfbGlzdCAqdmFyYmluZHM7CiAgICBjaGFyICAgICAgICAgICAqaGludDsKICAgIGNoYXIgICAgICAgICAgICp1bml0czsKICAgIGNoYXIgICAgICAgICAgICpkZXNjcmlwdGlvbjsgLyogZGVzY3JpcHRpb24gKGEgcXVvdGVkIHN0cmluZykgKi8KICAgIGNoYXIgICAgICAgICAgICpyZWZlcmVuY2U7IC8qIHJlZmVyZW5jZXMgKGEgcXVvdGVkIHN0cmluZykgKi8KICAgIGNoYXIgICAgICAgICAgICpkZWZhdWx0VmFsdWU7CiAgICBjaGFyICAgICAgICAgICAqZmlsZW5hbWU7CiAgICBpbnQgICAgICAgICAgICAgbGluZW5vOwp9OwoKLyoKICogVGhpcyBpcyBvbmUgZWxlbWVudCBvZiBhbiBvYmplY3QgaWRlbnRpZmllciB3aXRoIGVpdGhlciBhbiBpbnRlZ2VyCiAqIHN1YmlkZW50aWZpZXIsIG9yIGEgdGV4dHVhbCBzdHJpbmcgbGFiZWwsIG9yIGJvdGguCiAqIFRoZSBzdWJpZCBpcyAtMSBpZiBub3QgcHJlc2VudCwgYW5kIGxhYmVsIGlzIE5VTEwgaWYgbm90IHByZXNlbnQuCiAqLwpzdHJ1Y3Qgc3ViaWRfcyB7CiAgICBpbnQgICAgICAgICAgICAgc3ViaWQ7CiAgICBpbnQgICAgICAgICAgICAgbW9kaWQ7CiAgICBjaGFyICAgICAgICAgICAqbGFiZWw7Cn07CgojZGVmaW5lIE1BWFRDICAgNDA5NgpzdHJ1Y3QgdGMgeyAgICAgICAgICAgICAgICAgICAgIC8qIHRleHR1YWwgY29udmVudGlvbnMgKi8KICAgIGludCAgICAgICAgICAgICB0eXBlOwogICAgaW50ICAgICAgICAgICAgIG1vZGlkOwogICAgY2hhciAgICAgICAgICAgKmRlc2NyaXB0b3I7CiAgICBjaGFyICAgICAgICAgICAqaGludDsKICAgIHN0cnVjdCBlbnVtX2xpc3QgKmVudW1zOwogICAgc3RydWN0IHJhbmdlX2xpc3QgKnJhbmdlczsKICAgIGNoYXIgICAgICAgICAgICpkZXNjcmlwdGlvbjsKfSB0Y2xpc3RbTUFYVENdOwoKaW50ICAgICAgICAgICAgIG1pYkxpbmUgPSAwOwpjb25zdCBjaGFyICAgICAqRmlsZSA9ICIobm9uZSkiOwpzdGF0aWMgaW50ICAgICAgYW5vbnltb3VzID0gMDsKCnN0cnVjdCBvYmpncm91cCB7CiAgICBjaGFyICAgICAgICAgICAqbmFtZTsKICAgIGludCAgICAgICAgICAgICBsaW5lOwogICAgc3RydWN0IG9iamdyb3VwICpuZXh0Owp9ICAgICAgICAgICAgICAqb2JqZ3JvdXBzID0gTlVMTCwgKm9iamVjdHMgPSBOVUxMLCAqbm90aWZzID0gTlVMTDsKCiNkZWZpbmUgU1lOVEFYX01BU0sgICAgIDB4ODAKLyoKICogdHlwZXMgb2YgdG9rZW5zCiAqIFRva2VucyB3aWh0IHRoZSBTWU5UQVhfTUFTSyBiaXQgc2V0IGFyZSBzeW50YXggdG9rZW5zIAogKi8KI2RlZmluZSBDT05USU5VRSAgICAtMQojZGVmaW5lIEVORE9GRklMRSAgIDAKI2RlZmluZSBMQUJFTCAgICAgICAxCiNkZWZpbmUgU1VCVFJFRSAgICAgMgojZGVmaW5lIFNZTlRBWCAgICAgIDMKI2RlZmluZSBPQkpJRCAgICAgICAoNCB8IFNZTlRBWF9NQVNLKQojZGVmaW5lIE9DVEVUU1RSICAgICg1IHwgU1lOVEFYX01BU0spCiNkZWZpbmUgSU5URUdFUiAgICAgKDYgfCBTWU5UQVhfTUFTSykKI2RlZmluZSBORVRBRERSICAgICAoNyB8IFNZTlRBWF9NQVNLKQojZGVmaW5lIElQQUREUiAgICAgICg4IHwgU1lOVEFYX01BU0spCiNkZWZpbmUgQ09VTlRFUiAgICAgKDkgfCBTWU5UQVhfTUFTSykKI2RlZmluZSBHQVVHRSAgICAgICAoMTAgfCBTWU5UQVhfTUFTSykKI2RlZmluZSBUSU1FVElDS1MgICAoMTEgfCBTWU5UQVhfTUFTSykKI2RlZmluZSBLV19PUEFRVUUgICAoMTIgfCBTWU5UQVhfTUFTSykKI2RlZmluZSBOVUwgICAgICAgICAoMTMgfCBTWU5UQVhfTUFTSykKI2RlZmluZSBTRVFVRU5DRSAgICAxNAojZGVmaW5lIE9GICAgICAgICAgIDE1ICAgICAgICAgIC8qIFNFUVVFTkNFIE9GICovCiNkZWZpbmUgT0JKVFlQRSAgICAgMTYKI2RlZmluZSBBQ0NFU1MgICAgICAxNwojZGVmaW5lIFJFQURPTkxZICAgIDE4CiNkZWZpbmUgUkVBRFdSSVRFICAgMTkKI2RlZmluZSBXUklURU9OTFkgICAyMAojaWZkZWYgTk9BQ0NFU1MKI3VuZGVmIE5PQUNDRVNTICAgICAgICAgICAgICAgICAvKiBhZ2VudCAnTk9BQ0NFU1MnIHRva2VuICovCiNlbmRpZgojZGVmaW5lIE5PQUNDRVNTICAgIDIxCiNkZWZpbmUgU1RBVFVTICAgICAgMjIKI2RlZmluZSBNQU5EQVRPUlkgICAyMwojZGVmaW5lIEtXX09QVElPTkFMICAgIDI0CiNkZWZpbmUgT0JTT0xFVEUgICAgMjUKLyoKICogI2RlZmluZSBSRUNPTU1FTkRFRCAyNiAKICovCiNkZWZpbmUgUFVOQ1QgICAgICAgMjcKI2RlZmluZSBFUVVBTFMgICAgICAyOAojZGVmaW5lIE5VTUJFUiAgICAgIDI5CiNkZWZpbmUgTEVGVEJSQUNLRVQgMzAKI2RlZmluZSBSSUdIVEJSQUNLRVQgMzEKI2RlZmluZSBMRUZUUEFSRU4gICAzMgojZGVmaW5lIFJJR0hUUEFSRU4gIDMzCiNkZWZpbmUgQ09NTUEgICAgICAgMzQKI2RlZmluZSBERVNDUklQVElPTiAzNQojZGVmaW5lIFFVT1RFU1RSSU5HIDM2CiNkZWZpbmUgSU5ERVggICAgICAgMzcKI2RlZmluZSBERUZWQUwgICAgICAzOAojZGVmaW5lIERFUFJFQ0FURUQgIDM5CiNkZWZpbmUgU0laRSAgICAgICAgNDAKI2RlZmluZSBCSVRTVFJJTkcgICAoNDEgfCBTWU5UQVhfTUFTSykKI2RlZmluZSBOU0FQQUREUkVTUyAoNDIgfCBTWU5UQVhfTUFTSykKI2RlZmluZSBDT1VOVEVSNjQgICAoNDMgfCBTWU5UQVhfTUFTSykKI2RlZmluZSBPQkpHUk9VUCAgICA0NAojZGVmaW5lIE5PVElGVFlQRSAgIDQ1CiNkZWZpbmUgQVVHTUVOVFMgICAgNDYKI2RlZmluZSBDT01QTElBTkNFICA0NwojZGVmaW5lIFJFQURDUkVBVEUgIDQ4CiNkZWZpbmUgVU5JVFMgICAgICAgNDkKI2RlZmluZSBSRUZFUkVOQ0UgICA1MAojZGVmaW5lIE5VTV9FTlRSSUVTIDUxCiNkZWZpbmUgTU9EVUxFSURFTlRJVFkgNTIKI2RlZmluZSBMQVNUVVBEQVRFRCA1MwojZGVmaW5lIE9SR0FOSVpBVElPTiA1NAojZGVmaW5lIENPTlRBQ1RJTkZPIDU1CiNkZWZpbmUgVUlOVEVHRVIzMiAoNTYgfCBTWU5UQVhfTUFTSykKI2RlZmluZSBDVVJSRU5UICAgICA1NwojZGVmaW5lIERFRklOSVRJT05TIDU4CiNkZWZpbmUgRU5EICAgICAgICAgNTkKI2RlZmluZSBTRU1JICAgICAgICA2MAojZGVmaW5lIFRSQVBUWVBFICAgIDYxCiNkZWZpbmUgRU5URVJQUklTRSAgNjIKLyoKICogI2RlZmluZSBESVNQTEFZU1RSICg2MyB8IFNZTlRBWF9NQVNLKSAKICovCiNkZWZpbmUgQkVHSU4gICAgICAgNjQKI2RlZmluZSBJTVBPUlRTICAgICA2NQojZGVmaW5lIEVYUE9SVFMgICAgIDY2CiNkZWZpbmUgQUNDTk9USUZZICAgNjcKI2RlZmluZSBCQVIgICAgICAgICA2OAojZGVmaW5lIFJBTkdFICAgICAgIDY5CiNkZWZpbmUgQ09OVkVOVElPTiAgNzAKI2RlZmluZSBESVNQTEFZSElOVCA3MQojZGVmaW5lIEZST00gICAgICAgIDcyCiNkZWZpbmUgQUdFTlRDQVAgICAgNzMKI2RlZmluZSBNQUNSTyAgICAgICA3NAojZGVmaW5lIElNUExJRUQgICAgIDc1CiNkZWZpbmUgU1VQUE9SVFMgICAgNzYKI2RlZmluZSBJTkNMVURFUyAgICA3NwojZGVmaW5lIFZBUklBVElPTiAgIDc4CiNkZWZpbmUgUkVWSVNJT04gICAgNzkKI2RlZmluZSBOT1RJTVBMCSAgICA4MAojZGVmaW5lIE9CSkVDVFMJICAgIDgxCiNkZWZpbmUgTk9USUZJQ0FUSU9OUwk4MgojZGVmaW5lIE1PRFVMRQkgICAgODMKI2RlZmluZSBNSU5BQ0NFU1MgICA4NAojZGVmaW5lIFBST0RSRUwJICAgIDg1CiNkZWZpbmUgV1JTWU5UQVggICAgODYKI2RlZmluZSBDUkVBVEVSRVEgICA4NwojZGVmaW5lIE5PVElGR1JPVVAgIDg4CiNkZWZpbmUgTUFOREFUT1JZR1JPVVBTCTg5CiNkZWZpbmUgR1JPVVAJICAgIDkwCiNkZWZpbmUgT0JKRUNUCSAgICA5MQojZGVmaW5lIElERU5USUZJRVIgIDkyCiNkZWZpbmUgQ0hPSUNFCSAgICA5MwojZGVmaW5lIExFRlRTUUJSQUNLCTk1CiNkZWZpbmUgUklHSFRTUUJSQUNLCTk2CiNkZWZpbmUgSU1QTElDSVQgICAgOTcKI2RlZmluZSBBUFBTWU5UQVgJKDk4IHwgU1lOVEFYX01BU0spCiNkZWZpbmUgT0JKU1lOVEFYCSg5OSB8IFNZTlRBWF9NQVNLKQojZGVmaW5lIFNJTVBMRVNZTlRBWAkoMTAwIHwgU1lOVEFYX01BU0spCiNkZWZpbmUgT0JKTkFNRQkJKDEwMSB8IFNZTlRBWF9NQVNLKQojZGVmaW5lIE5PVElGTkFNRQkoMTAyIHwgU1lOVEFYX01BU0spCiNkZWZpbmUgVkFSSUFCTEVTCTEwMwojZGVmaW5lIFVOU0lHTkVEMzIJKDEwNCB8IFNZTlRBWF9NQVNLKQojZGVmaW5lIElOVEVHRVIzMgkoMTA1IHwgU1lOVEFYX01BU0spCiNkZWZpbmUgT0JKSURFTlRJVFkJMTA2Ci8qCiAqIEJld2FyZSBvZiByZWFjaGluZyBTWU5UQVhfTUFTSyAoMHg4MCkgCiAqLwoKc3RydWN0IHRvayB7CiAgICBjb25zdCBjaGFyICAgICAqbmFtZTsgICAgICAgLyogdG9rZW4gbmFtZSAqLwogICAgaW50ICAgICAgICAgICAgIGxlbjsgICAgICAgIC8qIGxlbmd0aCBub3QgY291bnRpbmcgbnVsICovCiAgICBpbnQgICAgICAgICAgICAgdG9rZW47ICAgICAgLyogdmFsdWUgKi8KICAgIGludCAgICAgICAgICAgICBoYXNoOyAgICAgICAvKiBoYXNoIG9mIG5hbWUgKi8KICAgIHN0cnVjdCB0b2sgICAgICpuZXh0OyAgICAgICAvKiBwb2ludGVyIHRvIG5leHQgaW4gaGFzaCB0YWJsZSAqLwp9OwoKCnN0YXRpYyBzdHJ1Y3QgdG9rIHRva2Vuc1tdID0gewogICAgeyJvYnNvbGV0ZSIsIHNpemVvZigib2Jzb2xldGUiKSAtIDEsIE9CU09MRVRFfQogICAgLAogICAgeyJPcGFxdWUiLCBzaXplb2YoIk9wYXF1ZSIpIC0gMSwgS1dfT1BBUVVFfQogICAgLAogICAgeyJvcHRpb25hbCIsIHNpemVvZigib3B0aW9uYWwiKSAtIDEsIEtXX09QVElPTkFMfQogICAgLAogICAgeyJMQVNULVVQREFURUQiLCBzaXplb2YoIkxBU1QtVVBEQVRFRCIpIC0gMSwgTEFTVFVQREFURUR9CiAgICAsCiAgICB7Ik9SR0FOSVpBVElPTiIsIHNpemVvZigiT1JHQU5JWkFUSU9OIikgLSAxLCBPUkdBTklaQVRJT059CiAgICAsCiAgICB7IkNPTlRBQ1QtSU5GTyIsIHNpemVvZigiQ09OVEFDVC1JTkZPIikgLSAxLCBDT05UQUNUSU5GT30KICAgICwKICAgIHsiTU9EVUxFLUlERU5USVRZIiwgc2l6ZW9mKCJNT0RVTEUtSURFTlRJVFkiKSAtIDEsIE1PRFVMRUlERU5USVRZfQogICAgLAogICAgeyJNT0RVTEUtQ09NUExJQU5DRSIsIHNpemVvZigiTU9EVUxFLUNPTVBMSUFOQ0UiKSAtIDEsIENPTVBMSUFOQ0V9CiAgICAsCiAgICB7IkRFRklOSVRJT05TIiwgc2l6ZW9mKCJERUZJTklUSU9OUyIpIC0gMSwgREVGSU5JVElPTlN9CiAgICAsCiAgICB7IkVORCIsIHNpemVvZigiRU5EIikgLSAxLCBFTkR9CiAgICAsCiAgICB7IkFVR01FTlRTIiwgc2l6ZW9mKCJBVUdNRU5UUyIpIC0gMSwgQVVHTUVOVFN9CiAgICAsCiAgICB7Im5vdC1hY2Nlc3NpYmxlIiwgc2l6ZW9mKCJub3QtYWNjZXNzaWJsZSIpIC0gMSwgTk9BQ0NFU1N9CiAgICAsCiAgICB7IndyaXRlLW9ubHkiLCBzaXplb2YoIndyaXRlLW9ubHkiKSAtIDEsIFdSSVRFT05MWX0KICAgICwKICAgIHsiTnNhcEFkZHJlc3MiLCBzaXplb2YoIk5zYXBBZGRyZXNzIikgLSAxLCBOU0FQQUREUkVTU30KICAgICwKICAgIHsiVU5JVFMiLCBzaXplb2YoIlVuaXRzIikgLSAxLCBVTklUU30KICAgICwKICAgIHsiUkVGRVJFTkNFIiwgc2l6ZW9mKCJSRUZFUkVOQ0UiKSAtIDEsIFJFRkVSRU5DRX0KICAgICwKICAgIHsiTlVNLUVOVFJJRVMiLCBzaXplb2YoIk5VTS1FTlRSSUVTIikgLSAxLCBOVU1fRU5UUklFU30KICAgICwKICAgIHsiQklUU1RSSU5HIiwgc2l6ZW9mKCJCSVRTVFJJTkciKSAtIDEsIEJJVFNUUklOR30KICAgICwKICAgIHsiQklUIiwgc2l6ZW9mKCJCSVQiKSAtIDEsIENPTlRJTlVFfQogICAgLAogICAgeyJCSVRTIiwgc2l6ZW9mKCJCSVRTIikgLSAxLCBCSVRTVFJJTkd9CiAgICAsCiAgICB7IkNvdW50ZXI2NCIsIHNpemVvZigiQ291bnRlcjY0IikgLSAxLCBDT1VOVEVSNjR9CiAgICAsCiAgICB7IlRpbWVUaWNrcyIsIHNpemVvZigiVGltZVRpY2tzIikgLSAxLCBUSU1FVElDS1N9CiAgICAsCiAgICB7Ik5PVElGSUNBVElPTi1UWVBFIiwgc2l6ZW9mKCJOT1RJRklDQVRJT04tVFlQRSIpIC0gMSwgTk9USUZUWVBFfQogICAgLAogICAgeyJPQkpFQ1QtR1JPVVAiLCBzaXplb2YoIk9CSkVDVC1HUk9VUCIpIC0gMSwgT0JKR1JPVVB9CiAgICAsCiAgICB7Ik9CSkVDVC1JREVOVElUWSIsIHNpemVvZigiT0JKRUNULUlERU5USVRZIikgLSAxLCBPQkpJREVOVElUWX0KICAgICwKICAgIHsiSURFTlRJRklFUiIsIHNpemVvZigiSURFTlRJRklFUiIpIC0gMSwgSURFTlRJRklFUn0KICAgICwKICAgIHsiT0JKRUNUIiwgc2l6ZW9mKCJPQkpFQ1QiKSAtIDEsIE9CSkVDVH0KICAgICwKICAgIHsiTmV0d29ya0FkZHJlc3MiLCBzaXplb2YoIk5ldHdvcmtBZGRyZXNzIikgLSAxLCBORVRBRERSfQogICAgLAogICAgeyJHYXVnZSIsIHNpemVvZigiR2F1Z2UiKSAtIDEsIEdBVUdFfQogICAgLAogICAgeyJHYXVnZTMyIiwgc2l6ZW9mKCJHYXVnZTMyIikgLSAxLCBHQVVHRX0KICAgICwKICAgIHsiVW5zaWduZWQzMiIsIHNpemVvZigiVW5zaWduZWQzMiIpIC0gMSwgVU5TSUdORUQzMn0KICAgICwKICAgIHsicmVhZC13cml0ZSIsIHNpemVvZigicmVhZC13cml0ZSIpIC0gMSwgUkVBRFdSSVRFfQogICAgLAogICAgeyJyZWFkLWNyZWF0ZSIsIHNpemVvZigicmVhZC1jcmVhdGUiKSAtIDEsIFJFQURDUkVBVEV9CiAgICAsCiAgICB7Ik9DVEVUU1RSSU5HIiwgc2l6ZW9mKCJPQ1RFVFNUUklORyIpIC0gMSwgT0NURVRTVFJ9CiAgICAsCiAgICB7Ik9DVEVUIiwgc2l6ZW9mKCJPQ1RFVCIpIC0gMSwgQ09OVElOVUV9CiAgICAsCiAgICB7Ik9GIiwgc2l6ZW9mKCJPRiIpIC0gMSwgT0Z9CiAgICAsCiAgICB7IlNFUVVFTkNFIiwgc2l6ZW9mKCJTRVFVRU5DRSIpIC0gMSwgU0VRVUVOQ0V9CiAgICAsCiAgICB7Ik5VTEwiLCBzaXplb2YoIk5VTEwiKSAtIDEsIE5VTH0KICAgICwKICAgIHsiSXBBZGRyZXNzIiwgc2l6ZW9mKCJJcEFkZHJlc3MiKSAtIDEsIElQQUREUn0KICAgICwKICAgIHsiVUludGVnZXIzMiIsIHNpemVvZigiVUludGVnZXIzMiIpIC0gMSwgVUlOVEVHRVIzMn0KICAgICwKICAgIHsiSU5URUdFUiIsIHNpemVvZigiSU5URUdFUiIpIC0gMSwgSU5URUdFUn0KICAgICwKICAgIHsiSW50ZWdlcjMyIiwgc2l6ZW9mKCJJbnRlZ2VyMzIiKSAtIDEsIElOVEVHRVIzMn0KICAgICwKICAgIHsiQ291bnRlciIsIHNpemVvZigiQ291bnRlciIpIC0gMSwgQ09VTlRFUn0KICAgICwKICAgIHsiQ291bnRlcjMyIiwgc2l6ZW9mKCJDb3VudGVyMzIiKSAtIDEsIENPVU5URVJ9CiAgICAsCiAgICB7InJlYWQtb25seSIsIHNpemVvZigicmVhZC1vbmx5IikgLSAxLCBSRUFET05MWX0KICAgICwKICAgIHsiREVTQ1JJUFRJT04iLCBzaXplb2YoIkRFU0NSSVBUSU9OIikgLSAxLCBERVNDUklQVElPTn0KICAgICwKICAgIHsiSU5ERVgiLCBzaXplb2YoIklOREVYIikgLSAxLCBJTkRFWH0KICAgICwKICAgIHsiREVGVkFMIiwgc2l6ZW9mKCJERUZWQUwiKSAtIDEsIERFRlZBTH0KICAgICwKICAgIHsiZGVwcmVjYXRlZCIsIHNpemVvZigiZGVwcmVjYXRlZCIpIC0gMSwgREVQUkVDQVRFRH0KICAgICwKICAgIHsiU0laRSIsIHNpemVvZigiU0laRSIpIC0gMSwgU0laRX0KICAgICwKICAgIHsiTUFYLUFDQ0VTUyIsIHNpemVvZigiTUFYLUFDQ0VTUyIpIC0gMSwgQUNDRVNTfQogICAgLAogICAgeyJBQ0NFU1MiLCBzaXplb2YoIkFDQ0VTUyIpIC0gMSwgQUNDRVNTfQogICAgLAogICAgeyJtYW5kYXRvcnkiLCBzaXplb2YoIm1hbmRhdG9yeSIpIC0gMSwgTUFOREFUT1JZfQogICAgLAogICAgeyJjdXJyZW50Iiwgc2l6ZW9mKCJjdXJyZW50IikgLSAxLCBDVVJSRU5UfQogICAgLAogICAgeyJTVEFUVVMiLCBzaXplb2YoIlNUQVRVUyIpIC0gMSwgU1RBVFVTfQogICAgLAogICAgeyJTWU5UQVgiLCBzaXplb2YoIlNZTlRBWCIpIC0gMSwgU1lOVEFYfQogICAgLAogICAgeyJPQkpFQ1QtVFlQRSIsIHNpemVvZigiT0JKRUNULVRZUEUiKSAtIDEsIE9CSlRZUEV9CiAgICAsCiAgICB7IlRSQVAtVFlQRSIsIHNpemVvZigiVFJBUC1UWVBFIikgLSAxLCBUUkFQVFlQRX0KICAgICwKICAgIHsiRU5URVJQUklTRSIsIHNpemVvZigiRU5URVJQUklTRSIpIC0gMSwgRU5URVJQUklTRX0KICAgICwKICAgIHsiQkVHSU4iLCBzaXplb2YoIkJFR0lOIikgLSAxLCBCRUdJTn0KICAgICwKICAgIHsiSU1QT1JUUyIsIHNpemVvZigiSU1QT1JUUyIpIC0gMSwgSU1QT1JUU30KICAgICwKICAgIHsiRVhQT1JUUyIsIHNpemVvZigiRVhQT1JUUyIpIC0gMSwgRVhQT1JUU30KICAgICwKICAgIHsiYWNjZXNzaWJsZS1mb3Itbm90aWZ5Iiwgc2l6ZW9mKCJhY2Nlc3NpYmxlLWZvci1ub3RpZnkiKSAtIDEsCiAgICAgQUNDTk9USUZZfQogICAgLAogICAgeyJURVhUVUFMLUNPTlZFTlRJT04iLCBzaXplb2YoIlRFWFRVQUwtQ09OVkVOVElPTiIpIC0gMSwgQ09OVkVOVElPTn0KICAgICwKICAgIHsiTk9USUZJQ0FUSU9OLUdST1VQIiwgc2l6ZW9mKCJOT1RJRklDQVRJT04tR1JPVVAiKSAtIDEsIE5PVElGR1JPVVB9CiAgICAsCiAgICB7IkRJU1BMQVktSElOVCIsIHNpemVvZigiRElTUExBWS1ISU5UIikgLSAxLCBESVNQTEFZSElOVH0KICAgICwKICAgIHsiRlJPTSIsIHNpemVvZigiRlJPTSIpIC0gMSwgRlJPTX0KICAgICwKICAgIHsiQUdFTlQtQ0FQQUJJTElUSUVTIiwgc2l6ZW9mKCJBR0VOVC1DQVBBQklMSVRJRVMiKSAtIDEsIEFHRU5UQ0FQfQogICAgLAogICAgeyJNQUNSTyIsIHNpemVvZigiTUFDUk8iKSAtIDEsIE1BQ1JPfQogICAgLAogICAgeyJJTVBMSUVEIiwgc2l6ZW9mKCJJTVBMSUVEIikgLSAxLCBJTVBMSUVEfQogICAgLAogICAgeyJTVVBQT1JUUyIsIHNpemVvZigiU1VQUE9SVFMiKSAtIDEsIFNVUFBPUlRTfQogICAgLAogICAgeyJJTkNMVURFUyIsIHNpemVvZigiSU5DTFVERVMiKSAtIDEsIElOQ0xVREVTfQogICAgLAogICAgeyJWQVJJQVRJT04iLCBzaXplb2YoIlZBUklBVElPTiIpIC0gMSwgVkFSSUFUSU9OfQogICAgLAogICAgeyJSRVZJU0lPTiIsIHNpemVvZigiUkVWSVNJT04iKSAtIDEsIFJFVklTSU9OfQogICAgLAogICAgeyJub3QtaW1wbGVtZW50ZWQiLCBzaXplb2YoIm5vdC1pbXBsZW1lbnRlZCIpIC0gMSwgTk9USU1QTH0KICAgICwKICAgIHsiT0JKRUNUUyIsIHNpemVvZigiT0JKRUNUUyIpIC0gMSwgT0JKRUNUU30KICAgICwKICAgIHsiTk9USUZJQ0FUSU9OUyIsIHNpemVvZigiTk9USUZJQ0FUSU9OUyIpIC0gMSwgTk9USUZJQ0FUSU9OU30KICAgICwKICAgIHsiTU9EVUxFIiwgc2l6ZW9mKCJNT0RVTEUiKSAtIDEsIE1PRFVMRX0KICAgICwKICAgIHsiTUlOLUFDQ0VTUyIsIHNpemVvZigiTUlOLUFDQ0VTUyIpIC0gMSwgTUlOQUNDRVNTfQogICAgLAogICAgeyJQUk9EVUNULVJFTEVBU0UiLCBzaXplb2YoIlBST0RVQ1QtUkVMRUFTRSIpIC0gMSwgUFJPRFJFTH0KICAgICwKICAgIHsiV1JJVEUtU1lOVEFYIiwgc2l6ZW9mKCJXUklURS1TWU5UQVgiKSAtIDEsIFdSU1lOVEFYfQogICAgLAogICAgeyJDUkVBVElPTi1SRVFVSVJFUyIsIHNpemVvZigiQ1JFQVRJT04tUkVRVUlSRVMiKSAtIDEsIENSRUFURVJFUX0KICAgICwKICAgIHsiTUFOREFUT1JZLUdST1VQUyIsIHNpemVvZigiTUFOREFUT1JZLUdST1VQUyIpIC0gMSwgTUFOREFUT1JZR1JPVVBTfQogICAgLAogICAgeyJHUk9VUCIsIHNpemVvZigiR1JPVVAiKSAtIDEsIEdST1VQfQogICAgLAogICAgeyJDSE9JQ0UiLCBzaXplb2YoIkNIT0lDRSIpIC0gMSwgQ0hPSUNFfQogICAgLAogICAgeyJJTVBMSUNJVCIsIHNpemVvZigiSU1QTElDSVQiKSAtIDEsIElNUExJQ0lUfQogICAgLAogICAgeyJPYmplY3RTeW50YXgiLCBzaXplb2YoIk9iamVjdFN5bnRheCIpIC0gMSwgT0JKU1lOVEFYfQogICAgLAogICAgeyJTaW1wbGVTeW50YXgiLCBzaXplb2YoIlNpbXBsZVN5bnRheCIpIC0gMSwgU0lNUExFU1lOVEFYfQogICAgLAogICAgeyJBcHBsaWNhdGlvblN5bnRheCIsIHNpemVvZigiQXBwbGljYXRpb25TeW50YXgiKSAtIDEsIEFQUFNZTlRBWH0KICAgICwKICAgIHsiT2JqZWN0TmFtZSIsIHNpemVvZigiT2JqZWN0TmFtZSIpIC0gMSwgT0JKTkFNRX0KICAgICwKICAgIHsiTm90aWZpY2F0aW9uTmFtZSIsIHNpemVvZigiTm90aWZpY2F0aW9uTmFtZSIpIC0gMSwgTk9USUZOQU1FfQogICAgLAogICAgeyJWQVJJQUJMRVMiLCBzaXplb2YoIlZBUklBQkxFUyIpIC0gMSwgVkFSSUFCTEVTfQogICAgLAogICAge05VTEx9Cn07CgpzdGF0aWMgc3RydWN0IG1vZHVsZV9jb21wYXRhYmlsaXR5ICptb2R1bGVfbWFwX2hlYWQ7CnN0YXRpYyBzdHJ1Y3QgbW9kdWxlX2NvbXBhdGFiaWxpdHkgbW9kdWxlX21hcFtdID0gewogICAgeyJSRkMxMDY1LVNNSSIsICJSRkMxMTU1LVNNSSIsIE5VTEwsIDB9LAogICAgeyJSRkMxMDY2LU1JQiIsICJSRkMxMTU2LU1JQiIsIE5VTEwsIDB9LAogICAgLyoKICAgICAqICdtaWInIC0+ICdtaWItMicgCiAgICAgKi8KICAgIHsiUkZDMTE1Ni1NSUIiLCAiUkZDMTE1OC1NSUIiLCBOVUxMLCAwfSwKICAgIC8qCiAgICAgKiAnc25tcEVuYWJsZUF1dGhUcmFwcycgLT4gJ3NubXBFbmFibGVBdXRoZW5UcmFwcycgCiAgICAgKi8KICAgIHsiUkZDMTE1OC1NSUIiLCAiUkZDMTIxMy1NSUIiLCBOVUxMLCAwfSwKICAgIC8qCiAgICAgKiAnbnVsbE9JRCcgLT4gJ3plcm9Eb3RaZXJvJyAKICAgICAqLwogICAgeyJSRkMxMTU1LVNNSSIsICJTTk1QdjItU01JIiwgTlVMTCwgMH0sCiAgICB7IlJGQzEyMTMtTUlCIiwgIlNOTVB2Mi1TTUkiLCAibWliLTIiLCAwfSwKICAgIHsiUkZDMTIxMy1NSUIiLCAiU05NUHYyLU1JQiIsICJzeXMiLCAzfSwKICAgIHsiUkZDMTIxMy1NSUIiLCAiSUYtTUlCIiwgImlmIiwgMn0sCiAgICB7IlJGQzEyMTMtTUlCIiwgIklQLU1JQiIsICJpcCIsIDJ9LAogICAgeyJSRkMxMjEzLU1JQiIsICJJUC1NSUIiLCAiaWNtcCIsIDR9LAogICAgeyJSRkMxMjEzLU1JQiIsICJUQ1AtTUlCIiwgInRjcCIsIDN9LAogICAgeyJSRkMxMjEzLU1JQiIsICJVRFAtTUlCIiwgInVkcCIsIDN9LAogICAgeyJSRkMxMjEzLU1JQiIsICJTTk1QdjItU01JIiwgInRyYW5zbWlzc2lvbiIsIDB9LAogICAgeyJSRkMxMjEzLU1JQiIsICJTTk1QdjItTUlCIiwgInNubXAiLCA0fSwKICAgIHsiUkZDMTIzMS1NSUIiLCAiVE9LRU5SSU5HLU1JQiIsIE5VTEwsIDB9LAogICAgeyJSRkMxMjcxLU1JQiIsICJSTU9OLU1JQiIsIE5VTEwsIDB9LAogICAgeyJSRkMxMjg2LU1JQiIsICJTT1VSQ0UtUk9VVElORy1NSUIiLCAiZG90MWRTciIsIDd9LAogICAgeyJSRkMxMjg2LU1JQiIsICJCUklER0UtTUlCIiwgTlVMTCwgMH0sCiAgICB7IlJGQzEzMTUtTUlCIiwgIkZSQU1FLVJFTEFZLURURS1NSUIiLCBOVUxMLCAwfSwKICAgIHsiUkZDMTMxNi1NSUIiLCAiQ0hBUkFDVEVSLU1JQiIsIE5VTEwsIDB9LAogICAgeyJSRkMxNDA2LU1JQiIsICJEUzEtTUlCIiwgTlVMTCwgMH0sCiAgICB7IlJGQy0xMjEzIiwgIlJGQzEyMTMtTUlCIiwgTlVMTCwgMH0sCn07CgojZGVmaW5lIE1PRFVMRV9OT1RfRk9VTkQJMAojZGVmaW5lIE1PRFVMRV9MT0FERURfT0sJMQojZGVmaW5lIE1PRFVMRV9BTFJFQURZX0xPQURFRAkyCi8qCiAqICNkZWZpbmUgTU9EVUxFX0xPQURfRkFJTEVEICAgMyAgICAgICAKICovCiNkZWZpbmUgTU9EVUxFX0xPQURfRkFJTEVECU1PRFVMRV9OT1RfRk9VTkQKCgojZGVmaW5lIEhBU0hTSVpFICAgICAgICAzMgojZGVmaW5lIEJVQ0tFVCh4KSAgICAgICAoeCAmIChIQVNIU0laRS0xKSkKCiNkZWZpbmUgTkhBU0hTSVpFICAgIDEyOAojZGVmaW5lIE5CVUNLRVQoeCkgICAoeCAmIChOSEFTSFNJWkUtMSkpCgpzdGF0aWMgc3RydWN0IHRvayAqYnVja2V0c1tIQVNIU0laRV07CgpzdGF0aWMgc3RydWN0IG5vZGUgKm5idWNrZXRzW05IQVNIU0laRV07CnN0YXRpYyBzdHJ1Y3QgdHJlZSAqdGJ1Y2tldHNbTkhBU0hTSVpFXTsKc3RhdGljIHN0cnVjdCBtb2R1bGUgKm1vZHVsZV9oZWFkID0gTlVMTDsKCnN0YXRpYyBzdHJ1Y3Qgbm9kZSAqb3JwaGFuX25vZGVzID0gTlVMTDsKTkVUU05NUF9JTVBPUlQgc3RydWN0IHRyZWUgKnRyZWVfaGVhZDsKc3RydWN0IHRyZWUgICAgICAgICp0cmVlX2hlYWQgPSBOVUxMOwoKI2RlZmluZQlOVU1CRVJfT0ZfUk9PVF9OT0RFUwkzCnN0YXRpYyBzdHJ1Y3QgbW9kdWxlX2ltcG9ydCByb290X2ltcG9ydHNbTlVNQkVSX09GX1JPT1RfTk9ERVNdOwoKc3RhdGljIGludCAgICAgIGN1cnJlbnRfbW9kdWxlID0gMDsKc3RhdGljIGludCAgICAgIG1heF9tb2R1bGUgPSAwOwpzdGF0aWMgaW50ICAgICAgZmlyc3RfZXJyX21vZHVsZSA9IDE7CnN0YXRpYyBjaGFyICAgICpsYXN0X2Vycl9tb2R1bGUgPSBOVUxMOyAvKiBubyByZXBlYXRzIG9uICJDYW5ub3QgZmluZCBtb2R1bGUuLi4iICovCgpzdGF0aWMgdm9pZCAgICAgdHJlZV9mcm9tX25vZGUoc3RydWN0IHRyZWUgKnRwLCBzdHJ1Y3Qgbm9kZSAqbnApOwpzdGF0aWMgdm9pZCAgICAgZG9fc3VidHJlZShzdHJ1Y3QgdHJlZSAqLCBzdHJ1Y3Qgbm9kZSAqKik7CnN0YXRpYyB2b2lkICAgICBkb19saW5rdXAoc3RydWN0IG1vZHVsZSAqLCBzdHJ1Y3Qgbm9kZSAqKTsKc3RhdGljIHZvaWQgICAgIGR1bXBfbW9kdWxlX2xpc3Qodm9pZCk7CnN0YXRpYyBpbnQgICAgICBnZXRfdG9rZW4oRklMRSAqLCBjaGFyICosIGludCk7CnN0YXRpYyBpbnQgICAgICBwYXJzZVF1b3RlU3RyaW5nKEZJTEUgKiwgY2hhciAqLCBpbnQpOwpzdGF0aWMgaW50ICAgICAgdG9zc09iamVjdElkZW50aWZpZXIoRklMRSAqKTsKc3RhdGljIGludCAgICAgIG5hbWVfaGFzaChjb25zdCBjaGFyICopOwpzdGF0aWMgdm9pZCAgICAgaW5pdF9ub2RlX2hhc2goc3RydWN0IG5vZGUgKik7CnN0YXRpYyB2b2lkICAgICBwcmludF9lcnJvcihjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgaW50KTsKc3RhdGljIHZvaWQgICAgIGZyZWVfdHJlZShzdHJ1Y3QgdHJlZSAqKTsKc3RhdGljIHZvaWQgICAgIGZyZWVfcGFydGlhbF90cmVlKHN0cnVjdCB0cmVlICosIGludCk7CnN0YXRpYyB2b2lkICAgICBmcmVlX25vZGUoc3RydWN0IG5vZGUgKik7CnN0YXRpYyB2b2lkICAgICBidWlsZF90cmFuc2xhdGlvbl90YWJsZSh2b2lkKTsKc3RhdGljIHZvaWQgICAgIGluaXRfdHJlZV9yb290cyh2b2lkKTsKc3RhdGljIHZvaWQgICAgIG1lcmdlX2Fub25fY2hpbGRyZW4oc3RydWN0IHRyZWUgKiwgc3RydWN0IHRyZWUgKik7CnN0YXRpYyB2b2lkICAgICB1bmxpbmtfdGJ1Y2tldChzdHJ1Y3QgdHJlZSAqKTsKc3RhdGljIHZvaWQgICAgIHVubGlua190cmVlKHN0cnVjdCB0cmVlICopOwpzdGF0aWMgaW50ICAgICAgZ2V0b2lkKEZJTEUgKiwgc3RydWN0IHN1YmlkX3MgKiwgaW50KTsKc3RhdGljIHN0cnVjdCBub2RlICpwYXJzZV9vYmplY3RpZChGSUxFICosIGNoYXIgKik7CnN0YXRpYyBpbnQgICAgICBnZXRfdGMoY29uc3QgY2hhciAqLCBpbnQsIGludCAqLCBzdHJ1Y3QgZW51bV9saXN0ICoqLAogICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCByYW5nZV9saXN0ICoqLCBjaGFyICoqKTsKc3RhdGljIGludCAgICAgIGdldF90Y19pbmRleChjb25zdCBjaGFyICosIGludCk7CnN0YXRpYyBzdHJ1Y3QgZW51bV9saXN0ICpwYXJzZV9lbnVtbGlzdChGSUxFICosIHN0cnVjdCBlbnVtX2xpc3QgKiopOwpzdGF0aWMgc3RydWN0IHJhbmdlX2xpc3QgKnBhcnNlX3JhbmdlcyhGSUxFICogZnAsIHN0cnVjdCByYW5nZV9saXN0ICoqKTsKc3RhdGljIHN0cnVjdCBub2RlICpwYXJzZV9hc250eXBlKEZJTEUgKiwgY2hhciAqLCBpbnQgKiwgY2hhciAqKTsKc3RhdGljIHN0cnVjdCBub2RlICpwYXJzZV9vYmplY3R0eXBlKEZJTEUgKiwgY2hhciAqKTsKc3RhdGljIHN0cnVjdCBub2RlICpwYXJzZV9vYmplY3Rncm91cChGSUxFICosIGNoYXIgKiwgaW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBvYmpncm91cCAqKik7CnN0YXRpYyBzdHJ1Y3Qgbm9kZSAqcGFyc2Vfbm90aWZpY2F0aW9uRGVmaW5pdGlvbihGSUxFICosIGNoYXIgKik7CnN0YXRpYyBzdHJ1Y3Qgbm9kZSAqcGFyc2VfdHJhcERlZmluaXRpb24oRklMRSAqLCBjaGFyICopOwpzdGF0aWMgc3RydWN0IG5vZGUgKnBhcnNlX2NvbXBsaWFuY2UoRklMRSAqLCBjaGFyICopOwpzdGF0aWMgc3RydWN0IG5vZGUgKnBhcnNlX2NhcGFiaWxpdGllcyhGSUxFICosIGNoYXIgKik7CnN0YXRpYyBzdHJ1Y3Qgbm9kZSAqcGFyc2VfbW9kdWxlSWRlbnRpdHkoRklMRSAqLCBjaGFyICopOwpzdGF0aWMgc3RydWN0IG5vZGUgKnBhcnNlX21hY3JvKEZJTEUgKiwgY2hhciAqKTsKc3RhdGljIHZvaWQgICAgIHBhcnNlX2ltcG9ydHMoRklMRSAqKTsKc3RhdGljIHN0cnVjdCBub2RlICpwYXJzZShGSUxFICosIHN0cnVjdCBub2RlICopOwoKc3RhdGljIGludCAgICAgcmVhZF9tb2R1bGVfaW50ZXJuYWwoY29uc3QgY2hhciAqKTsKc3RhdGljIGludCAgICAgcmVhZF9tb2R1bGVfcmVwbGFjZW1lbnRzKGNvbnN0IGNoYXIgKik7CnN0YXRpYyBpbnQgICAgIHJlYWRfaW1wb3J0X3JlcGxhY2VtZW50cyhjb25zdCBjaGFyICosCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IG1vZHVsZV9pbXBvcnQgKik7CgpzdGF0aWMgdm9pZCAgICAgbmV3X21vZHVsZShjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKik7CgpzdGF0aWMgc3RydWN0IG5vZGUgKm1lcmdlX3BhcnNlX29iamVjdGlkKHN0cnVjdCBub2RlICosIEZJTEUgKiwgY2hhciAqKTsKc3RhdGljIHN0cnVjdCBpbmRleF9saXN0ICpnZXRJbmRleGVzKEZJTEUgKiBmcCwgc3RydWN0IGluZGV4X2xpc3QgKiopOwpzdGF0aWMgc3RydWN0IHZhcmJpbmRfbGlzdCAqZ2V0VmFyYmluZHMoRklMRSAqIGZwLCBzdHJ1Y3QgdmFyYmluZF9saXN0ICoqKTsKc3RhdGljIHZvaWQgICAgIGZyZWVfaW5kZXhlcyhzdHJ1Y3QgaW5kZXhfbGlzdCAqKik7CnN0YXRpYyB2b2lkICAgICBmcmVlX3ZhcmJpbmRzKHN0cnVjdCB2YXJiaW5kX2xpc3QgKiopOwpzdGF0aWMgdm9pZCAgICAgZnJlZV9yYW5nZXMoc3RydWN0IHJhbmdlX2xpc3QgKiopOwpzdGF0aWMgdm9pZCAgICAgZnJlZV9lbnVtcyhzdHJ1Y3QgZW51bV9saXN0ICoqKTsKc3RhdGljIHN0cnVjdCByYW5nZV9saXN0ICpjb3B5X3JhbmdlcyhzdHJ1Y3QgcmFuZ2VfbGlzdCAqKTsKc3RhdGljIHN0cnVjdCBlbnVtX2xpc3QgKmNvcHlfZW51bXMoc3RydWN0IGVudW1fbGlzdCAqKTsKCnN0YXRpYyB1X2ludCAgICBjb21wdXRlX21hdGNoKGNvbnN0IGNoYXIgKnNlYXJjaF9iYXNlLCBjb25zdCBjaGFyICprZXkpOwoKdm9pZApzbm1wX21pYl90b2dnbGVfb3B0aW9uc191c2FnZShjb25zdCBjaGFyICpsZWFkLCBGSUxFICogb3V0ZikKewogICAgZnByaW50ZihvdXRmLCAiJXN1OiAgJXNhbGxvdyB0aGUgdXNlIG9mIHVuZGVybGluZXMgaW4gTUlCIHN5bWJvbHNcbiIsCiAgICAgICAgICAgIGxlYWQsICgobmV0c25tcF9kc19nZXRfYm9vbGVhbihORVRTTk1QX0RTX0xJQlJBUllfSUQsCgkJCQkJICAgTkVUU05NUF9EU19MSUJfTUlCX1BBUlNFX0xBQkVMKSkgPwoJCSAgICJkaXMiIDogIiIpKTsKICAgIGZwcmludGYob3V0ZiwgIiVzYzogICVzYWxsb3cgdGhlIHVzZSBvZiBcIi0tXCIgdG8gdGVybWluYXRlIGNvbW1lbnRzXG4iLAogICAgICAgICAgICBsZWFkLCAoKG5ldHNubXBfZHNfZ2V0X2Jvb2xlYW4oTkVUU05NUF9EU19MSUJSQVJZX0lELAoJCQkJCSAgIE5FVFNOTVBfRFNfTElCX01JQl9DT01NRU5UX1RFUk0pKSA/CgkJICAgIiIgOiAiZGlzIikpOwoKICAgIGZwcmludGYob3V0ZiwgIiVzZDogICVzc2F2ZSB0aGUgREVTQ1JJUFRJT05zIG9mIHRoZSBNSUIgb2JqZWN0c1xuIiwKICAgICAgICAgICAgbGVhZCwgKChuZXRzbm1wX2RzX2dldF9ib29sZWFuKE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgCgkJCQkJICAgTkVUU05NUF9EU19MSUJfU0FWRV9NSUJfREVTQ1JTKSkgPwoJCSAgICJkbyBub3QgIiA6ICIiKSk7CgogICAgZnByaW50ZihvdXRmLCAiJXNlOiAgZGlzYWJsZSBlcnJvcnMgd2hlbiBNSUIgc3ltYm9scyBjb25mbGljdFxuIiwgbGVhZCk7CgogICAgZnByaW50ZihvdXRmLCAiJXN3OiAgZW5hYmxlIHdhcm5pbmdzIHdoZW4gTUlCIHN5bWJvbHMgY29uZmxpY3RcbiIsIGxlYWQpOwoKICAgIGZwcmludGYob3V0ZiwgIiVzVzogIGVuYWJsZSBkZXRhaWxlZCB3YXJuaW5ncyB3aGVuIE1JQiBzeW1ib2xzIGNvbmZsaWN0XG4iLAogICAgICAgICAgICBsZWFkKTsKCiAgICBmcHJpbnRmKG91dGYsICIlc1I6ICByZXBsYWNlIE1JQiBzeW1ib2xzIGZyb20gbGF0ZXN0IG1vZHVsZVxuIiwgbGVhZCk7Cn0KCmNoYXIgICAgICAgICAgICoKc25tcF9taWJfdG9nZ2xlX29wdGlvbnMoY2hhciAqb3B0aW9ucykKewogICAgaWYgKG9wdGlvbnMpIHsKICAgICAgICB3aGlsZSAoKm9wdGlvbnMpIHsKICAgICAgICAgICAgc3dpdGNoICgqb3B0aW9ucykgewogICAgICAgICAgICBjYXNlICd1JzoKICAgICAgICAgICAgICAgIG5ldHNubXBfZHNfc2V0X2Jvb2xlYW4oTkVUU05NUF9EU19MSUJSQVJZX0lELCBORVRTTk1QX0RTX0xJQl9NSUJfUEFSU0VfTEFCRUwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhbmV0c25tcF9kc19nZXRfYm9vbGVhbihORVRTTk1QX0RTX0xJQlJBUllfSUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTkVUU05NUF9EU19MSUJfTUlCX1BBUlNFX0xBQkVMKSk7CiAgICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgIGNhc2UgJ2MnOgogICAgICAgICAgICAgICAgbmV0c25tcF9kc190b2dnbGVfYm9vbGVhbihORVRTTk1QX0RTX0xJQlJBUllfSUQsCgkJCQkJICBORVRTTk1QX0RTX0xJQl9NSUJfQ09NTUVOVF9URVJNKTsKICAgICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgY2FzZSAnZSc6CiAgICAgICAgICAgICAgICBuZXRzbm1wX2RzX3RvZ2dsZV9ib29sZWFuKE5FVFNOTVBfRFNfTElCUkFSWV9JRCwKCQkJCQkgIE5FVFNOTVBfRFNfTElCX01JQl9FUlJPUlMpOwogICAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICBjYXNlICd3JzoKICAgICAgICAgICAgICAgIG5ldHNubXBfZHNfc2V0X2ludChORVRTTk1QX0RTX0xJQlJBUllfSUQsCgkJCQkgICBORVRTTk1QX0RTX0xJQl9NSUJfV0FSTklOR1MsIDEpOwogICAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICBjYXNlICdXJzoKICAgICAgICAgICAgICAgIG5ldHNubXBfZHNfc2V0X2ludChORVRTTk1QX0RTX0xJQlJBUllfSUQsCgkJCQkgICBORVRTTk1QX0RTX0xJQl9NSUJfV0FSTklOR1MsIDIpOwogICAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICBjYXNlICdkJzoKICAgICAgICAgICAgICAgIG5ldHNubXBfZHNfdG9nZ2xlX2Jvb2xlYW4oTkVUU05NUF9EU19MSUJSQVJZX0lELCAKCQkJCQkgIE5FVFNOTVBfRFNfTElCX1NBVkVfTUlCX0RFU0NSUyk7CiAgICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgIGNhc2UgJ1InOgogICAgICAgICAgICAgICAgbmV0c25tcF9kc190b2dnbGVfYm9vbGVhbihORVRTTk1QX0RTX0xJQlJBUllfSUQsIAoJCQkJCSAgTkVUU05NUF9EU19MSUJfTUlCX1JFUExBQ0UpOwogICAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgICAqIHJldHVybiBhdCB0aGUgdW5rbm93biBvcHRpb24gCiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgIHJldHVybiBvcHRpb25zOwogICAgICAgICAgICB9CiAgICAgICAgICAgIG9wdGlvbnMrKzsKICAgICAgICB9CiAgICB9CiAgICByZXR1cm4gTlVMTDsKfQoKc3RhdGljIGludApuYW1lX2hhc2goY29uc3QgY2hhciAqbmFtZSkKewogICAgaW50ICAgICAgICAgICAgIGhhc2ggPSAwOwogICAgY29uc3QgY2hhciAgICAgKmNwOwoKICAgIGlmICghbmFtZSkKICAgICAgICByZXR1cm4gMDsKICAgIGZvciAoY3AgPSBuYW1lOyAqY3A7IGNwKyspCiAgICAgICAgaGFzaCArPSB0b2xvd2VyKCh1bnNpZ25lZCBjaGFyKSgqY3ApKTsKICAgIHJldHVybiAoaGFzaCk7Cn0KCnZvaWQKbmV0c25tcF9pbml0X21pYl9pbnRlcm5hbHModm9pZCkKewogICAgcmVnaXN0ZXIgc3RydWN0IHRvayAqdHA7CiAgICByZWdpc3RlciBpbnQgICAgYiwgaTsKICAgIGludCAgICAgICAgICAgICBtYXhfbW9kYzsKCiAgICBpZiAodHJlZV9oZWFkKQogICAgICAgIHJldHVybjsKCiAgICAvKgogICAgICogU2V0IHVwIGhhc2ggbGlzdCBvZiBwcmUtZGVmaW5lZCB0b2tlbnMKICAgICAqLwogICAgbWVtc2V0KGJ1Y2tldHMsIDAsIHNpemVvZihidWNrZXRzKSk7CiAgICBmb3IgKHRwID0gdG9rZW5zOyB0cC0+bmFtZTsgdHArKykgewogICAgICAgIHRwLT5oYXNoID0gbmFtZV9oYXNoKHRwLT5uYW1lKTsKICAgICAgICBiID0gQlVDS0VUKHRwLT5oYXNoKTsKICAgICAgICBpZiAoYnVja2V0c1tiXSkKICAgICAgICAgICAgdHAtPm5leHQgPSBidWNrZXRzW2JdOyAgICAgIC8qIEJVRyA/Pz8gKi8KICAgICAgICBidWNrZXRzW2JdID0gdHA7CiAgICB9CgogICAgLyoKICAgICAqIEluaXRpYWxpc2Ugb3RoZXIgaW50ZXJuYWwgc3RydWN0dXJlcwogICAgICovCgogICAgbWF4X21vZGMgPSBzaXplb2YobW9kdWxlX21hcCkgLyBzaXplb2YobW9kdWxlX21hcFswXSkgLSAxOwogICAgZm9yIChpID0gMDsgaSA8IG1heF9tb2RjOyArK2kpCiAgICAgICAgbW9kdWxlX21hcFtpXS5uZXh0ID0gJihtb2R1bGVfbWFwW2kgKyAxXSk7CiAgICBtb2R1bGVfbWFwW21heF9tb2RjXS5uZXh0ID0gTlVMTDsKICAgIG1vZHVsZV9tYXBfaGVhZCA9IG1vZHVsZV9tYXA7CgogICAgbWVtc2V0KG5idWNrZXRzLCAwLCBzaXplb2YobmJ1Y2tldHMpKTsKICAgIG1lbXNldCh0YnVja2V0cywgMCwgc2l6ZW9mKHRidWNrZXRzKSk7CiAgICBtZW1zZXQodGNsaXN0LCAwLCBNQVhUQyAqIHNpemVvZihzdHJ1Y3QgdGMpKTsKICAgIGJ1aWxkX3RyYW5zbGF0aW9uX3RhYmxlKCk7CiAgICBpbml0X3RyZWVfcm9vdHMoKTsgICAgICAgICAgLyogU2V0IHVwIGluaXRpYWwgcm9vdHMgKi8KICAgIC8qCiAgICAgKiBSZWxpZXMgb24gJ2FkZF9taWJkaXInIGhhdmluZyBzZXQgdXAgdGhlIG1vZHVsZXMgCiAgICAgKi8KfQoKI2lmbmRlZiBORVRTTk1QX05PX0xFR0FDWV9ERUZJTklUSU9OUwp2b2lkCmluaXRfbWliX2ludGVybmFscyh2b2lkKQp7CiAgICBuZXRzbm1wX2luaXRfbWliX2ludGVybmFscygpOwp9CiNlbmRpZgoKc3RhdGljIHZvaWQKaW5pdF9ub2RlX2hhc2goc3RydWN0IG5vZGUgKm5vZGVzKQp7CiAgICBzdHJ1Y3Qgbm9kZSAgICAqbnAsICpuZXh0cDsKICAgIGludCAgICAgICAgICAgICBoYXNoOwoKICAgIG1lbXNldChuYnVja2V0cywgMCwgc2l6ZW9mKG5idWNrZXRzKSk7CiAgICBmb3IgKG5wID0gbm9kZXM7IG5wOykgewogICAgICAgIG5leHRwID0gbnAtPm5leHQ7CiAgICAgICAgaGFzaCA9IE5CVUNLRVQobmFtZV9oYXNoKG5wLT5wYXJlbnQpKTsKICAgICAgICBucC0+bmV4dCA9IG5idWNrZXRzW2hhc2hdOwogICAgICAgIG5idWNrZXRzW2hhc2hdID0gbnA7CiAgICAgICAgbnAgPSBuZXh0cDsKICAgIH0KfQoKc3RhdGljIGludCAgICAgIGVycm9uZW91c01pYnMgPSAwOwoKaW50CmdldF9taWJfcGFyc2VfZXJyb3JfY291bnQodm9pZCkKewogICAgcmV0dXJuIGVycm9uZW91c01pYnM7Cn0KCgpzdGF0aWMgdm9pZApwcmludF9lcnJvcihjb25zdCBjaGFyICpzdHIsIGNvbnN0IGNoYXIgKnRva2VuLCBpbnQgdHlwZSkKewogICAgZXJyb25lb3VzTWlicysrOwogICAgREVCVUdNU0dUTCgoInBhcnNlLW1pYnMiLCAiXG4iKSk7CiAgICBpZiAodHlwZSA9PSBFTkRPRkZJTEUpCiAgICAgICAgc25tcF9sb2coTE9HX0VSUiwgIiVzIChFT0YpOiBBdCBsaW5lICVkIGluICVzXG4iLCBzdHIsIG1pYkxpbmUsCiAgICAgICAgICAgICAgICAgRmlsZSk7CiAgICBlbHNlIGlmICh0b2tlbiAmJiAqdG9rZW4pCiAgICAgICAgc25tcF9sb2coTE9HX0VSUiwgIiVzICglcyk6IEF0IGxpbmUgJWQgaW4gJXNcbiIsIHN0ciwgdG9rZW4sCiAgICAgICAgICAgICAgICAgbWliTGluZSwgRmlsZSk7CiAgICBlbHNlCiAgICAgICAgc25tcF9sb2coTE9HX0VSUiwgIiVzOiBBdCBsaW5lICVkIGluICVzXG4iLCBzdHIsIG1pYkxpbmUsIEZpbGUpOwp9CgpzdGF0aWMgdm9pZApwcmludF9tb2R1bGVfbm90X2ZvdW5kKGNvbnN0IGNoYXIgKmNwKQp7CiAgICBpZiAoZmlyc3RfZXJyX21vZHVsZSkgewogICAgICAgIHNubXBfbG9nKExPR19FUlIsICJNSUIgc2VhcmNoIHBhdGg6ICVzXG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICBuZXRzbm1wX2dldF9taWJfZGlyZWN0b3J5KCkpOwogICAgICAgIGZpcnN0X2Vycl9tb2R1bGUgPSAwOwogICAgfQogICAgaWYgKCFsYXN0X2Vycl9tb2R1bGUgfHwgc3RyY21wKGNwLCBsYXN0X2Vycl9tb2R1bGUpKQogICAgICAgIHByaW50X2Vycm9yKCJDYW5ub3QgZmluZCBtb2R1bGUiLCBjcCwgQ09OVElOVUUpOwogICAgaWYgKGxhc3RfZXJyX21vZHVsZSkKICAgICAgICBmcmVlKGxhc3RfZXJyX21vZHVsZSk7CiAgICBsYXN0X2Vycl9tb2R1bGUgPSBzdHJkdXAoY3ApOwp9CgpzdGF0aWMgc3RydWN0IG5vZGUgKgphbGxvY19ub2RlKGludCBtb2RpZCkKewogICAgc3RydWN0IG5vZGUgICAgKm5wOwogICAgbnAgPSAoc3RydWN0IG5vZGUgKikgY2FsbG9jKDEsIHNpemVvZihzdHJ1Y3Qgbm9kZSkpOwogICAgaWYgKG5wKSB7CiAgICAgICAgbnAtPnRjX2luZGV4ID0gLTE7CiAgICAgICAgbnAtPm1vZGlkID0gbW9kaWQ7CglucC0+ZmlsZW5hbWUgPSBzdHJkdXAoRmlsZSk7CglucC0+bGluZW5vID0gbWliTGluZTsKICAgIH0KICAgIHJldHVybiBucDsKfQoKc3RhdGljIHZvaWQKdW5saW5rX3RidWNrZXQoc3RydWN0IHRyZWUgKnRwKQp7CiAgICBpbnQgICAgICAgICAgICAgaGFzaCA9IE5CVUNLRVQobmFtZV9oYXNoKHRwLT5sYWJlbCkpOwogICAgc3RydWN0IHRyZWUgICAgKm90cCA9IE5VTEwsICpudHAgPSB0YnVja2V0c1toYXNoXTsKCiAgICB3aGlsZSAobnRwICYmIG50cCAhPSB0cCkgewogICAgICAgIG90cCA9IG50cDsKICAgICAgICBudHAgPSBudHAtPm5leHQ7CiAgICB9CiAgICBpZiAoIW50cCkKICAgICAgICBzbm1wX2xvZyhMT0dfRU1FUkcsICJDYW4ndCBmaW5kICVzIGluIHRidWNrZXRzXG4iLCB0cC0+bGFiZWwpOwogICAgZWxzZSBpZiAob3RwKQogICAgICAgIG90cC0+bmV4dCA9IG50cC0+bmV4dDsKICAgIGVsc2UKICAgICAgICB0YnVja2V0c1toYXNoXSA9IHRwLT5uZXh0Owp9CgpzdGF0aWMgdm9pZAp1bmxpbmtfdHJlZShzdHJ1Y3QgdHJlZSAqdHApCnsKICAgIHN0cnVjdCB0cmVlICAgICpvdHAgPSBOVUxMLCAqbnRwID0gdHAtPnBhcmVudDsKCiAgICBpZiAoIW50cCkgeyAgICAgICAgICAgICAgICAgLyogdGhpcyB0cmVlIGhhcyBubyBwYXJlbnQgKi8KICAgICAgICBERUJVR01TR1RMKCgidW5saW5rX3RyZWUiLCAiVHJlZSBub2RlICVzIGhhcyBubyBwYXJlbnRcbiIsCiAgICAgICAgICAgICAgICAgICAgdHAtPmxhYmVsKSk7CiAgICB9IGVsc2UgewogICAgICAgIG50cCA9IG50cC0+Y2hpbGRfbGlzdDsKCiAgICAgICAgd2hpbGUgKG50cCAmJiBudHAgIT0gdHApIHsKICAgICAgICAgICAgb3RwID0gbnRwOwogICAgICAgICAgICBudHAgPSBudHAtPm5leHRfcGVlcjsKICAgICAgICB9CiAgICAgICAgaWYgKCFudHApCiAgICAgICAgICAgIHNubXBfbG9nKExPR19FTUVSRywgIkNhbid0IGZpbmQgJXMgaW4gJXMncyBjaGlsZHJlblxuIiwKICAgICAgICAgICAgICAgICAgICAgdHAtPmxhYmVsLCB0cC0+cGFyZW50LT5sYWJlbCk7CiAgICAgICAgZWxzZSBpZiAob3RwKQogICAgICAgICAgICBvdHAtPm5leHRfcGVlciA9IG50cC0+bmV4dF9wZWVyOwogICAgICAgIGVsc2UKICAgICAgICAgICAgdHAtPnBhcmVudC0+Y2hpbGRfbGlzdCA9IHRwLT5uZXh0X3BlZXI7CiAgICB9CgogICAgaWYgKHRyZWVfaGVhZCA9PSB0cCkKICAgICAgICB0cmVlX2hlYWQgPSB0cC0+bmV4dF9wZWVyOwp9CgpzdGF0aWMgdm9pZApmcmVlX3BhcnRpYWxfdHJlZShzdHJ1Y3QgdHJlZSAqdHAsIGludCBrZWVwX2xhYmVsKQp7CiAgICBpZiAoIXRwKQogICAgICAgIHJldHVybjsKCiAgICAvKgogICAgICogcmVtb3ZlIHRoZSBkYXRhIGZyb20gdGhpcyB0cmVlIG5vZGUgCiAgICAgKi8KICAgIGZyZWVfZW51bXMoJnRwLT5lbnVtcyk7CiAgICBmcmVlX3JhbmdlcygmdHAtPnJhbmdlcyk7CiAgICBmcmVlX2luZGV4ZXMoJnRwLT5pbmRleGVzKTsKICAgIGZyZWVfdmFyYmluZHMoJnRwLT52YXJiaW5kcyk7CiAgICBpZiAoIWtlZXBfbGFiZWwpCiAgICAgICAgU05NUF9GUkVFKHRwLT5sYWJlbCk7CiAgICBTTk1QX0ZSRUUodHAtPmhpbnQpOwogICAgU05NUF9GUkVFKHRwLT51bml0cyk7CiAgICBTTk1QX0ZSRUUodHAtPmRlc2NyaXB0aW9uKTsKICAgIFNOTVBfRlJFRSh0cC0+cmVmZXJlbmNlKTsKICAgIFNOTVBfRlJFRSh0cC0+YXVnbWVudHMpOwogICAgU05NUF9GUkVFKHRwLT5kZWZhdWx0VmFsdWUpOwp9CgovKgogKiBmcmVlIGEgdHJlZSBub2RlLiBOb3RlOiB0aGUgbm9kZSBtdXN0IGFscmVhZHkgaGF2ZSBiZWVuIHVubGlua2VkCiAqIGZyb20gdGhlIHRyZWUgd2hlbiBjYWxsaW5nIHRoaXMgcm91dGluZQogKi8Kc3RhdGljIHZvaWQKZnJlZV90cmVlKHN0cnVjdCB0cmVlICpUcmVlKQp7CiAgICBpZiAoIVRyZWUpCiAgICAgICAgcmV0dXJuOwoKICAgIHVubGlua190YnVja2V0KFRyZWUpOwogICAgZnJlZV9wYXJ0aWFsX3RyZWUoVHJlZSwgRkFMU0UpOwogICAgaWYgKFRyZWUtPm51bWJlcl9tb2R1bGVzID4gMSkKICAgICAgICBmcmVlKChjaGFyICopIFRyZWUtPm1vZHVsZV9saXN0KTsKICAgIGZyZWUoKGNoYXIgKikgVHJlZSk7Cn0KCnN0YXRpYyB2b2lkCmZyZWVfbm9kZShzdHJ1Y3Qgbm9kZSAqbnApCnsKICAgIGlmICghbnApCiAgICAgICAgcmV0dXJuOwoKICAgIGZyZWVfZW51bXMoJm5wLT5lbnVtcyk7CiAgICBmcmVlX3JhbmdlcygmbnAtPnJhbmdlcyk7CiAgICBmcmVlX2luZGV4ZXMoJm5wLT5pbmRleGVzKTsKICAgIGZyZWVfdmFyYmluZHMoJm5wLT52YXJiaW5kcyk7CiAgICBpZiAobnAtPmxhYmVsKQogICAgICAgIGZyZWUobnAtPmxhYmVsKTsKICAgIGlmIChucC0+aGludCkKICAgICAgICBmcmVlKG5wLT5oaW50KTsKICAgIGlmIChucC0+dW5pdHMpCiAgICAgICAgZnJlZShucC0+dW5pdHMpOwogICAgaWYgKG5wLT5kZXNjcmlwdGlvbikKICAgICAgICBmcmVlKG5wLT5kZXNjcmlwdGlvbik7CiAgICBpZiAobnAtPnJlZmVyZW5jZSkKICAgICAgICBmcmVlKG5wLT5yZWZlcmVuY2UpOwogICAgaWYgKG5wLT5kZWZhdWx0VmFsdWUpCiAgICAgICAgZnJlZShucC0+ZGVmYXVsdFZhbHVlKTsKICAgIGlmIChucC0+cGFyZW50KQogICAgICAgIGZyZWUobnAtPnBhcmVudCk7CiAgICBpZiAobnAtPmF1Z21lbnRzKQogICAgICAgIGZyZWUobnAtPmF1Z21lbnRzKTsKICAgIGlmIChucC0+ZmlsZW5hbWUpCglmcmVlKG5wLT5maWxlbmFtZSk7CiAgICBmcmVlKChjaGFyICopIG5wKTsKfQoKc3RhdGljIHZvaWQKcHJpbnRfcmFuZ2VfdmFsdWUoRklMRSAqIGZwLCBpbnQgdHlwZSwgc3RydWN0IHJhbmdlX2xpc3QgKiBycCkKewogICAgc3dpdGNoICh0eXBlKSB7CiAgICBjYXNlIFRZUEVfSU5URUdFUjoKICAgIGNhc2UgVFlQRV9JTlRFR0VSMzI6CiAgICAgICAgaWYgKHJwLT5sb3cgPT0gcnAtPmhpZ2gpCiAgICAgICAgICAgIGZwcmludGYoZnAsICIlZCIsIHJwLT5sb3cpOwogICAgICAgIGVsc2UKICAgICAgICAgICAgZnByaW50ZihmcCwgIiVkLi4lZCIsIHJwLT5sb3csIHJwLT5oaWdoKTsKICAgICAgICBicmVhazsKICAgIGNhc2UgVFlQRV9VTlNJR05FRDMyOgogICAgY2FzZSBUWVBFX09DVEVUU1RSOgogICAgY2FzZSBUWVBFX0dBVUdFOgogICAgY2FzZSBUWVBFX1VJTlRFR0VSOgogICAgICAgIGlmIChycC0+bG93ID09IHJwLT5oaWdoKQogICAgICAgICAgICBmcHJpbnRmKGZwLCAiJXUiLCAodW5zaWduZWQpcnAtPmxvdyk7CiAgICAgICAgZWxzZQogICAgICAgICAgICBmcHJpbnRmKGZwLCAiJXUuLiV1IiwgKHVuc2lnbmVkKXJwLT5sb3csICh1bnNpZ25lZClycC0+aGlnaCk7CiAgICAgICAgYnJlYWs7CiAgICBkZWZhdWx0OgogICAgICAgIC8qIE5vIG90aGVyIHJhbmdlIHR5cGVzIGFsbG93ZWQgKi8KICAgICAgICBicmVhazsKICAgIH0KfQoKI2lmZGVmIFRFU1QKc3RhdGljIHZvaWQKcHJpbnRfbm9kZXMoRklMRSAqIGZwLCBzdHJ1Y3Qgbm9kZSAqcm9vdCkKewogICAgc3RydWN0IGVudW1fbGlzdCAqZXA7CiAgICBzdHJ1Y3QgaW5kZXhfbGlzdCAqaXA7CiAgICBzdHJ1Y3QgdmFyYmluZF9saXN0ICp2cDsKICAgIHN0cnVjdCBub2RlICAgICpucDsKCiAgICBmb3IgKG5wID0gcm9vdDsgbnA7IG5wID0gbnAtPm5leHQpIHsKICAgICAgICBmcHJpbnRmKGZwLCAiJXMgOjo9IHsgJXMgJWxkIH0gKCVkKVxuIiwgbnAtPmxhYmVsLCBucC0+cGFyZW50LAogICAgICAgICAgICAgICAgbnAtPnN1YmlkLCBucC0+dHlwZSk7CiAgICAgICAgaWYgKG5wLT50Y19pbmRleCA+PSAwKQogICAgICAgICAgICBmcHJpbnRmKGZwLCAiICBUQyA9ICVzXG4iLCB0Y2xpc3RbbnAtPnRjX2luZGV4XS5kZXNjcmlwdG9yKTsKICAgICAgICBpZiAobnAtPmVudW1zKSB7CiAgICAgICAgICAgIGZwcmludGYoZnAsICIgIEVudW1zOiBcbiIpOwogICAgICAgICAgICBmb3IgKGVwID0gbnAtPmVudW1zOyBlcDsgZXAgPSBlcC0+bmV4dCkgewogICAgICAgICAgICAgICAgZnByaW50ZihmcCwgIiAgICAlcyglZClcbiIsIGVwLT5sYWJlbCwgZXAtPnZhbHVlKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAobnAtPnJhbmdlcykgewogICAgICAgICAgICBzdHJ1Y3QgcmFuZ2VfbGlzdCAqcnA7CiAgICAgICAgICAgIGZwcmludGYoZnAsICIgIFJhbmdlczogIik7CiAgICAgICAgICAgIGZvciAocnAgPSBucC0+cmFuZ2VzOyBycDsgcnAgPSBycC0+bmV4dCkgewogICAgICAgICAgICAgICAgZnByaW50ZihmcCwgIlxuICAgICIpOwogICAgICAgICAgICAgICAgcHJpbnRfcmFuZ2VfdmFsdWUoZnAsIG5wLT50eXBlLCBycCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZnByaW50ZihmcCwgIlxuIik7CiAgICAgICAgfQogICAgICAgIGlmIChucC0+aW5kZXhlcykgewogICAgICAgICAgICBmcHJpbnRmKGZwLCAiICBJbmRleGVzOiBcbiIpOwogICAgICAgICAgICBmb3IgKGlwID0gbnAtPmluZGV4ZXM7IGlwOyBpcCA9IGlwLT5uZXh0KSB7CiAgICAgICAgICAgICAgICBmcHJpbnRmKGZwLCAiICAgICVzXG4iLCBpcC0+aWxhYmVsKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAobnAtPmF1Z21lbnRzKQogICAgICAgICAgICBmcHJpbnRmKGZwLCAiICBBdWdtZW50czogJXNcbiIsIG5wLT5hdWdtZW50cyk7CiAgICAgICAgaWYgKG5wLT52YXJiaW5kcykgewogICAgICAgICAgICBmcHJpbnRmKGZwLCAiICBWYXJiaW5kczogXG4iKTsKICAgICAgICAgICAgZm9yICh2cCA9IG5wLT52YXJiaW5kczsgdnA7IHZwID0gdnAtPm5leHQpIHsKICAgICAgICAgICAgICAgIGZwcmludGYoZnAsICIgICAgJXNcbiIsIHZwLT52YmxhYmVsKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAobnAtPmhpbnQpCiAgICAgICAgICAgIGZwcmludGYoZnAsICIgIEhpbnQ6ICVzXG4iLCBucC0+aGludCk7CiAgICAgICAgaWYgKG5wLT51bml0cykKICAgICAgICAgICAgZnByaW50ZihmcCwgIiAgVW5pdHM6ICVzXG4iLCBucC0+dW5pdHMpOwogICAgICAgIGlmIChucC0+ZGVmYXVsdFZhbHVlKQogICAgICAgICAgICBmcHJpbnRmKGZwLCAiICBEZWZhdWx0VmFsdWU6ICVzXG4iLCBucC0+ZGVmYXVsdFZhbHVlKTsKICAgIH0KfQojZW5kaWYKCnZvaWQKcHJpbnRfc3VidHJlZShGSUxFICogZiwgc3RydWN0IHRyZWUgKnRyZWUsIGludCBjb3VudCkKewogICAgc3RydWN0IHRyZWUgICAgKnRwOwogICAgaW50ICAgICAgICAgICAgIGk7CiAgICBjaGFyICAgICAgICAgICAgbW9kYnVmWzI1Nl07CgogICAgZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspCiAgICAgICAgZnByaW50ZihmLCAiICAiKTsKICAgIGZwcmludGYoZiwgIkNoaWxkcmVuIG9mICVzKCVsZCk6XG4iLCB0cmVlLT5sYWJlbCwgdHJlZS0+c3ViaWQpOwogICAgY291bnQrKzsKICAgIGZvciAodHAgPSB0cmVlLT5jaGlsZF9saXN0OyB0cDsgdHAgPSB0cC0+bmV4dF9wZWVyKSB7CiAgICAgICAgZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspCiAgICAgICAgICAgIGZwcmludGYoZiwgIiAgIik7CiAgICAgICAgZnByaW50ZihmLCAiJXM6JXMoJWxkKSB0eXBlPSVkIiwKICAgICAgICAgICAgICAgIG1vZHVsZV9uYW1lKHRwLT5tb2R1bGVfbGlzdFswXSwgbW9kYnVmKSwKICAgICAgICAgICAgICAgIHRwLT5sYWJlbCwgdHAtPnN1YmlkLCB0cC0+dHlwZSk7CiAgICAgICAgaWYgKHRwLT50Y19pbmRleCAhPSAtMSkKICAgICAgICAgICAgZnByaW50ZihmLCAiIHRjPSVkIiwgdHAtPnRjX2luZGV4KTsKICAgICAgICBpZiAodHAtPmhpbnQpCiAgICAgICAgICAgIGZwcmludGYoZiwgIiBoaW50PSVzIiwgdHAtPmhpbnQpOwogICAgICAgIGlmICh0cC0+dW5pdHMpCiAgICAgICAgICAgIGZwcmludGYoZiwgIiB1bml0cz0lcyIsIHRwLT51bml0cyk7CiAgICAgICAgaWYgKHRwLT5udW1iZXJfbW9kdWxlcyA+IDEpIHsKICAgICAgICAgICAgZnByaW50ZihmLCAiIG1vZHVsZXM6Iik7CiAgICAgICAgICAgIGZvciAoaSA9IDE7IGkgPCB0cC0+bnVtYmVyX21vZHVsZXM7IGkrKykKICAgICAgICAgICAgICAgIGZwcmludGYoZiwgIiAlcyIsIG1vZHVsZV9uYW1lKHRwLT5tb2R1bGVfbGlzdFtpXSwgbW9kYnVmKSk7CiAgICAgICAgfQogICAgICAgIGZwcmludGYoZiwgIlxuIik7CiAgICB9CiAgICBmb3IgKHRwID0gdHJlZS0+Y2hpbGRfbGlzdDsgdHA7IHRwID0gdHAtPm5leHRfcGVlcikgewogICAgICAgIGlmICh0cC0+Y2hpbGRfbGlzdCkKICAgICAgICAgICAgcHJpbnRfc3VidHJlZShmLCB0cCwgY291bnQpOwogICAgfQp9Cgp2b2lkCnByaW50X2FzY2lpX2R1bXBfdHJlZShGSUxFICogZiwgc3RydWN0IHRyZWUgKnRyZWUsIGludCBjb3VudCkKewogICAgc3RydWN0IHRyZWUgICAgKnRwOwoKICAgIGNvdW50Kys7CiAgICBmb3IgKHRwID0gdHJlZS0+Y2hpbGRfbGlzdDsgdHA7IHRwID0gdHAtPm5leHRfcGVlcikgewogICAgICAgIGZwcmludGYoZiwgIiVzIE9CSkVDVCBJREVOVElGSUVSIDo6PSB7ICVzICVsZCB9XG4iLCB0cC0+bGFiZWwsCiAgICAgICAgICAgICAgICB0cmVlLT5sYWJlbCwgdHAtPnN1YmlkKTsKICAgIH0KICAgIGZvciAodHAgPSB0cmVlLT5jaGlsZF9saXN0OyB0cDsgdHAgPSB0cC0+bmV4dF9wZWVyKSB7CiAgICAgICAgaWYgKHRwLT5jaGlsZF9saXN0KQogICAgICAgICAgICBwcmludF9hc2NpaV9kdW1wX3RyZWUoZiwgdHAsIGNvdW50KTsKICAgIH0KfQoKc3RhdGljIGludCAgICAgIHRyYW5zbGF0aW9uX3RhYmxlWzI1Nl07CgpzdGF0aWMgdm9pZApidWlsZF90cmFuc2xhdGlvbl90YWJsZSh2b2lkKQp7CiAgICBpbnQgICAgICAgICAgICAgY291bnQ7CgogICAgZm9yIChjb3VudCA9IDA7IGNvdW50IDwgMjU2OyBjb3VudCsrKSB7CiAgICAgICAgc3dpdGNoIChjb3VudCkgewogICAgICAgIGNhc2UgT0JKSUQ6CiAgICAgICAgICAgIHRyYW5zbGF0aW9uX3RhYmxlW2NvdW50XSA9IFRZUEVfT0JKSUQ7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgT0NURVRTVFI6CiAgICAgICAgICAgIHRyYW5zbGF0aW9uX3RhYmxlW2NvdW50XSA9IFRZUEVfT0NURVRTVFI7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgSU5URUdFUjoKICAgICAgICAgICAgdHJhbnNsYXRpb25fdGFibGVbY291bnRdID0gVFlQRV9JTlRFR0VSOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIE5FVEFERFI6CiAgICAgICAgICAgIHRyYW5zbGF0aW9uX3RhYmxlW2NvdW50XSA9IFRZUEVfTkVUQUREUjsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBJUEFERFI6CiAgICAgICAgICAgIHRyYW5zbGF0aW9uX3RhYmxlW2NvdW50XSA9IFRZUEVfSVBBRERSOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIENPVU5URVI6CiAgICAgICAgICAgIHRyYW5zbGF0aW9uX3RhYmxlW2NvdW50XSA9IFRZUEVfQ09VTlRFUjsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBHQVVHRToKICAgICAgICAgICAgdHJhbnNsYXRpb25fdGFibGVbY291bnRdID0gVFlQRV9HQVVHRTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBUSU1FVElDS1M6CiAgICAgICAgICAgIHRyYW5zbGF0aW9uX3RhYmxlW2NvdW50XSA9IFRZUEVfVElNRVRJQ0tTOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIEtXX09QQVFVRToKICAgICAgICAgICAgdHJhbnNsYXRpb25fdGFibGVbY291bnRdID0gVFlQRV9PUEFRVUU7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgTlVMOgogICAgICAgICAgICB0cmFuc2xhdGlvbl90YWJsZVtjb3VudF0gPSBUWVBFX05VTEw7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgQ09VTlRFUjY0OgogICAgICAgICAgICB0cmFuc2xhdGlvbl90YWJsZVtjb3VudF0gPSBUWVBFX0NPVU5URVI2NDsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBCSVRTVFJJTkc6CiAgICAgICAgICAgIHRyYW5zbGF0aW9uX3RhYmxlW2NvdW50XSA9IFRZUEVfQklUU1RSSU5HOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIE5TQVBBRERSRVNTOgogICAgICAgICAgICB0cmFuc2xhdGlvbl90YWJsZVtjb3VudF0gPSBUWVBFX05TQVBBRERSRVNTOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIElOVEVHRVIzMjoKICAgICAgICAgICAgdHJhbnNsYXRpb25fdGFibGVbY291bnRdID0gVFlQRV9JTlRFR0VSMzI7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgVUlOVEVHRVIzMjoKICAgICAgICAgICAgdHJhbnNsYXRpb25fdGFibGVbY291bnRdID0gVFlQRV9VSU5URUdFUjsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBVTlNJR05FRDMyOgogICAgICAgICAgICB0cmFuc2xhdGlvbl90YWJsZVtjb3VudF0gPSBUWVBFX1VOU0lHTkVEMzI7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgVFJBUFRZUEU6CiAgICAgICAgICAgIHRyYW5zbGF0aW9uX3RhYmxlW2NvdW50XSA9IFRZUEVfVFJBUFRZUEU7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgTk9USUZUWVBFOgogICAgICAgICAgICB0cmFuc2xhdGlvbl90YWJsZVtjb3VudF0gPSBUWVBFX05PVElGVFlQRTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBOT1RJRkdST1VQOgogICAgICAgICAgICB0cmFuc2xhdGlvbl90YWJsZVtjb3VudF0gPSBUWVBFX05PVElGR1JPVVA7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgT0JKR1JPVVA6CiAgICAgICAgICAgIHRyYW5zbGF0aW9uX3RhYmxlW2NvdW50XSA9IFRZUEVfT0JKR1JPVVA7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgTU9EVUxFSURFTlRJVFk6CiAgICAgICAgICAgIHRyYW5zbGF0aW9uX3RhYmxlW2NvdW50XSA9IFRZUEVfTU9ESUQ7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgT0JKSURFTlRJVFk6CiAgICAgICAgICAgIHRyYW5zbGF0aW9uX3RhYmxlW2NvdW50XSA9IFRZUEVfT0JKSURFTlRJVFk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgQUdFTlRDQVA6CiAgICAgICAgICAgIHRyYW5zbGF0aW9uX3RhYmxlW2NvdW50XSA9IFRZUEVfQUdFTlRDQVA7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgQ09NUExJQU5DRToKICAgICAgICAgICAgdHJhbnNsYXRpb25fdGFibGVbY291bnRdID0gVFlQRV9NT0RDT01QOwogICAgICAgICAgICBicmVhazsKICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICB0cmFuc2xhdGlvbl90YWJsZVtjb3VudF0gPSBUWVBFX09USEVSOwogICAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICB9Cn0KCnN0YXRpYyB2b2lkCmluaXRfdHJlZV9yb290cyh2b2lkKQp7CiAgICBzdHJ1Y3QgdHJlZSAgICAqdHAsICpsYXN0dHA7CiAgICBpbnQgICAgICAgICAgICAgYmFzZV9tb2RpZDsKICAgIGludCAgICAgICAgICAgICBoYXNoOwoKICAgIGJhc2VfbW9kaWQgPSB3aGljaF9tb2R1bGUoIlNOTVB2Mi1TTUkiKTsKICAgIGlmIChiYXNlX21vZGlkID09IC0xKQogICAgICAgIGJhc2VfbW9kaWQgPSB3aGljaF9tb2R1bGUoIlJGQzExNTUtU01JIik7CiAgICBpZiAoYmFzZV9tb2RpZCA9PSAtMSkKICAgICAgICBiYXNlX21vZGlkID0gd2hpY2hfbW9kdWxlKCJSRkMxMjEzLU1JQiIpOwoKICAgIC8qCiAgICAgKiBidWlsZCByb290IG5vZGUgCiAgICAgKi8KICAgIHRwID0gKHN0cnVjdCB0cmVlICopIGNhbGxvYygxLCBzaXplb2Yoc3RydWN0IHRyZWUpKTsKICAgIGlmICh0cCA9PSBOVUxMKQogICAgICAgIHJldHVybjsKICAgIHRwLT5sYWJlbCA9IHN0cmR1cCgiam9pbnQtaXNvLWNjaXR0Iik7CiAgICB0cC0+bW9kaWQgPSBiYXNlX21vZGlkOwogICAgdHAtPm51bWJlcl9tb2R1bGVzID0gMTsKICAgIHRwLT5tb2R1bGVfbGlzdCA9ICYodHAtPm1vZGlkKTsKICAgIHRwLT5zdWJpZCA9IDI7CiAgICB0cC0+dGNfaW5kZXggPSAtMTsKICAgIHNldF9mdW5jdGlvbih0cCk7ICAgICAgICAgICAvKiBmcm9tIG1pYi5jICovCiAgICBoYXNoID0gTkJVQ0tFVChuYW1lX2hhc2godHAtPmxhYmVsKSk7CiAgICB0cC0+bmV4dCA9IHRidWNrZXRzW2hhc2hdOwogICAgdGJ1Y2tldHNbaGFzaF0gPSB0cDsKICAgIGxhc3R0cCA9IHRwOwogICAgcm9vdF9pbXBvcnRzWzBdLmxhYmVsID0gc3RyZHVwKHRwLT5sYWJlbCk7CiAgICByb290X2ltcG9ydHNbMF0ubW9kaWQgPSBiYXNlX21vZGlkOwoKICAgIC8qCiAgICAgKiBidWlsZCByb290IG5vZGUgCiAgICAgKi8KICAgIHRwID0gKHN0cnVjdCB0cmVlICopIGNhbGxvYygxLCBzaXplb2Yoc3RydWN0IHRyZWUpKTsKICAgIGlmICh0cCA9PSBOVUxMKQogICAgICAgIHJldHVybjsKICAgIHRwLT5uZXh0X3BlZXIgPSBsYXN0dHA7CiAgICB0cC0+bGFiZWwgPSBzdHJkdXAoImNjaXR0Iik7CiAgICB0cC0+bW9kaWQgPSBiYXNlX21vZGlkOwogICAgdHAtPm51bWJlcl9tb2R1bGVzID0gMTsKICAgIHRwLT5tb2R1bGVfbGlzdCA9ICYodHAtPm1vZGlkKTsKICAgIHRwLT5zdWJpZCA9IDA7CiAgICB0cC0+dGNfaW5kZXggPSAtMTsKICAgIHNldF9mdW5jdGlvbih0cCk7ICAgICAgICAgICAvKiBmcm9tIG1pYi5jICovCiAgICBoYXNoID0gTkJVQ0tFVChuYW1lX2hhc2godHAtPmxhYmVsKSk7CiAgICB0cC0+bmV4dCA9IHRidWNrZXRzW2hhc2hdOwogICAgdGJ1Y2tldHNbaGFzaF0gPSB0cDsKICAgIGxhc3R0cCA9IHRwOwogICAgcm9vdF9pbXBvcnRzWzFdLmxhYmVsID0gc3RyZHVwKHRwLT5sYWJlbCk7CiAgICByb290X2ltcG9ydHNbMV0ubW9kaWQgPSBiYXNlX21vZGlkOwoKICAgIC8qCiAgICAgKiBidWlsZCByb290IG5vZGUgCiAgICAgKi8KICAgIHRwID0gKHN0cnVjdCB0cmVlICopIGNhbGxvYygxLCBzaXplb2Yoc3RydWN0IHRyZWUpKTsKICAgIGlmICh0cCA9PSBOVUxMKQogICAgICAgIHJldHVybjsKICAgIHRwLT5uZXh0X3BlZXIgPSBsYXN0dHA7CiAgICB0cC0+bGFiZWwgPSBzdHJkdXAoImlzbyIpOwogICAgdHAtPm1vZGlkID0gYmFzZV9tb2RpZDsKICAgIHRwLT5udW1iZXJfbW9kdWxlcyA9IDE7CiAgICB0cC0+bW9kdWxlX2xpc3QgPSAmKHRwLT5tb2RpZCk7CiAgICB0cC0+c3ViaWQgPSAxOwogICAgdHAtPnRjX2luZGV4ID0gLTE7CiAgICBzZXRfZnVuY3Rpb24odHApOyAgICAgICAgICAgLyogZnJvbSBtaWIuYyAqLwogICAgaGFzaCA9IE5CVUNLRVQobmFtZV9oYXNoKHRwLT5sYWJlbCkpOwogICAgdHAtPm5leHQgPSB0YnVja2V0c1toYXNoXTsKICAgIHRidWNrZXRzW2hhc2hdID0gdHA7CiAgICBsYXN0dHAgPSB0cDsKICAgIHJvb3RfaW1wb3J0c1syXS5sYWJlbCA9IHN0cmR1cCh0cC0+bGFiZWwpOwogICAgcm9vdF9pbXBvcnRzWzJdLm1vZGlkID0gYmFzZV9tb2RpZDsKCiAgICB0cmVlX2hlYWQgPSB0cDsKfQoKI2lmZGVmIFNUUklDVF9NSUJfUEFSU0VJTkcKI2RlZmluZQlsYWJlbF9jb21wYXJlCXN0cmNhc2VjbXAKI2Vsc2UKI2RlZmluZQlsYWJlbF9jb21wYXJlCXN0cmNtcAojZW5kaWYKCgpzdHJ1Y3QgdHJlZSAgICAqCmZpbmRfdHJlZV9ub2RlKGNvbnN0IGNoYXIgKm5hbWUsIGludCBtb2RpZCkKewogICAgc3RydWN0IHRyZWUgICAgKnRwLCAqaGVhZHRwOwogICAgaW50ICAgICAgICAgICAgIGNvdW50LCAqaW50X3A7CgogICAgaWYgKCFuYW1lIHx8ICEqbmFtZSkKICAgICAgICByZXR1cm4gKE5VTEwpOwoKICAgIGhlYWR0cCA9IHRidWNrZXRzW05CVUNLRVQobmFtZV9oYXNoKG5hbWUpKV07CiAgICBmb3IgKHRwID0gaGVhZHRwOyB0cDsgdHAgPSB0cC0+bmV4dCkgewogICAgICAgIGlmICh0cC0+bGFiZWwgJiYgIWxhYmVsX2NvbXBhcmUodHAtPmxhYmVsLCBuYW1lKSkgewoKICAgICAgICAgICAgaWYgKG1vZGlkID09IC0xKSAgICAvKiBBbnkgbW9kdWxlICovCiAgICAgICAgICAgICAgICByZXR1cm4gKHRwKTsKCiAgICAgICAgICAgIGZvciAoaW50X3AgPSB0cC0+bW9kdWxlX2xpc3QsIGNvdW50ID0gMDsKICAgICAgICAgICAgICAgICBjb3VudCA8IHRwLT5udW1iZXJfbW9kdWxlczsgKytjb3VudCwgKytpbnRfcCkKICAgICAgICAgICAgICAgIGlmICgqaW50X3AgPT0gbW9kaWQpCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICh0cCk7CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybiAoTlVMTCk7Cn0KCi8qCiAqIGNvbXB1dGVzIGEgdmFsdWUgd2hpY2ggcmVwcmVzZW50cyBob3cgY2xvc2UgbmFtZTEgaXMgdG8gbmFtZTIuCiAqICogaGlnaCBzY29yZXMgbWVhbiBhIHdvcnNlIG1hdGNoLgogKiAqICh5ZXMsIHRoZSBhbGdvcml0aG0gc3Vja3MhKQogKi8KI2RlZmluZSBNQVhfQkFEIDB4ZmZmZmZmCgpzdGF0aWMgICAgICAgICAgdV9pbnQKY29tcHV0ZV9tYXRjaChjb25zdCBjaGFyICpzZWFyY2hfYmFzZSwgY29uc3QgY2hhciAqa2V5KQp7CiNpZiBkZWZpbmVkKEhBVkVfUkVHRVhfSCkgJiYgZGVmaW5lZChIQVZFX1JFR0NPTVApCiAgICBpbnQgICAgICAgICAgICAgcmM7CiAgICByZWdleF90ICAgICAgICAgcGFyc2V0cmVlOwogICAgcmVnbWF0Y2hfdCAgICAgIHBtYXRjaDsKICAgIHJjID0gcmVnY29tcCgmcGFyc2V0cmVlLCBrZXksIFJFR19JQ0FTRSB8IFJFR19FWFRFTkRFRCk7CiAgICBpZiAocmMgPT0gMCkKICAgICAgICByYyA9IHJlZ2V4ZWMoJnBhcnNldHJlZSwgc2VhcmNoX2Jhc2UsIDEsICZwbWF0Y2gsIDApOwogICAgcmVnZnJlZSgmcGFyc2V0cmVlKTsKICAgIGlmIChyYyA9PSAwKSB7CiAgICAgICAgLyoKICAgICAgICAgKiBmb3VuZCAKICAgICAgICAgKi8KICAgICAgICByZXR1cm4gcG1hdGNoLnJtX3NvOwogICAgfQojZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHVzZSBvdXIgb3duIHdpbGRjYXJkIG1hdGNoZXIgKi8KICAgIC8qCiAgICAgKiBmaXJzdCBmaW5kIHRoZSBsb25nZXN0IG1hdGNoaW5nIHN1YnN0cmluZyAoaWNrKSAKICAgICAqLwogICAgY2hhciAgICAgICAgICAgKmZpcnN0ID0gTlVMTCwgKnJlc3VsdCA9IE5VTEwsICplbnRyeTsKICAgIGNvbnN0IGNoYXIgICAgICpwb3NpdGlvbjsKICAgIGNoYXIgICAgICAgICAgICpuZXdrZXkgPSBzdHJkdXAoa2V5KTsKICAgIGNoYXIgICAgICAgICAgICpzdDsKCgogICAgZW50cnkgPSBzdHJ0b2tfcihuZXdrZXksICIqIiwgJnN0KTsKICAgIHBvc2l0aW9uID0gc2VhcmNoX2Jhc2U7CiAgICB3aGlsZSAoZW50cnkpIHsKICAgICAgICByZXN1bHQgPSBzdHJjYXNlc3RyKHBvc2l0aW9uLCBlbnRyeSk7CgogICAgICAgIGlmIChyZXN1bHQgPT0gTlVMTCkgewogICAgICAgICAgICBmcmVlKG5ld2tleSk7CiAgICAgICAgICAgIHJldHVybiBNQVhfQkFEOwogICAgICAgIH0KCiAgICAgICAgaWYgKGZpcnN0ID09IE5VTEwpCiAgICAgICAgICAgIGZpcnN0ID0gcmVzdWx0OwoKICAgICAgICBwb3NpdGlvbiA9IHJlc3VsdCArIHN0cmxlbihlbnRyeSk7CiAgICAgICAgZW50cnkgPSBzdHJ0b2tfcihOVUxMLCAiKiIsICZzdCk7CiAgICB9CiAgICBmcmVlKG5ld2tleSk7CiAgICBpZiAocmVzdWx0KQogICAgICAgIHJldHVybiAoZmlyc3QgLSBzZWFyY2hfYmFzZSk7CiNlbmRpZgoKICAgIC8qCiAgICAgKiBub3QgZm91bmQgCiAgICAgKi8KICAgIHJldHVybiBNQVhfQkFEOwp9CgovKgogKiBGaW5kIHRoZSB0cmVlIG5vZGUgdGhhdCBiZXN0IG1hdGNoZXMgdGhlIHBhdHRlcm4gc3RyaW5nLgogKiBVc2UgdGhlICJyZXBvcnRlZCIgZmxhZyBzdWNoIHRoYXQgb25seSBvbmUgbWF0Y2gKICogaXMgYXR0ZW1wdGVkIGZvciBldmVyeSBub2RlLgogKgogKiBXYXJuaW5nISBUaGlzIGZ1bmN0aW9uIG1heSByZWN1cnNlLgogKgogKiBDYWxsZXIgX211c3RfIGludm9rZSBjbGVhcl90cmVlX2ZsYWdzIGJlZm9yZSBmaXJzdCBjYWxsCiAqIHRvIHRoaXMgZnVuY3Rpb24uICBUaGlzIGZ1bmN0aW9uIG1heSBiZSBjYWxsZWQgbXVsdGlwbGUgdGltZXMKICogdG8gZW5zdXJlIHRoYXQgdGhlIGVudGlyZSB0cmVlIGlzIHRyYXZlcnNlZC4KICovCgpzdHJ1Y3QgdHJlZSAgICAqCmZpbmRfYmVzdF90cmVlX25vZGUoY29uc3QgY2hhciAqcGF0dHJuLCBzdHJ1Y3QgdHJlZSAqdHJlZV90b3AsCiAgICAgICAgICAgICAgICAgICAgdV9pbnQgKiBtYXRjaCkKewogICAgc3RydWN0IHRyZWUgICAgKnRwLCAqYmVzdF9zb19mYXIgPSBOVUxMLCAqcmV0cHRyOwogICAgdV9pbnQgICAgICAgICAgIG9sZF9tYXRjaCA9IE1BWF9CQUQsIG5ld19tYXRjaCA9IE1BWF9CQUQ7CgogICAgaWYgKCFwYXR0cm4gfHwgISpwYXR0cm4pCiAgICAgICAgcmV0dXJuIChOVUxMKTsKCiAgICBpZiAoIXRyZWVfdG9wKQogICAgICAgIHRyZWVfdG9wID0gZ2V0X3RyZWVfaGVhZCgpOwoKICAgIGZvciAodHAgPSB0cmVlX3RvcDsgdHA7IHRwID0gdHAtPm5leHRfcGVlcikgewogICAgICAgIGlmICghdHAtPnJlcG9ydGVkICYmIHRwLT5sYWJlbCkKICAgICAgICAgICAgbmV3X21hdGNoID0gY29tcHV0ZV9tYXRjaCh0cC0+bGFiZWwsIHBhdHRybik7CiAgICAgICAgdHAtPnJlcG9ydGVkID0gMTsKCiAgICAgICAgaWYgKG5ld19tYXRjaCA8IG9sZF9tYXRjaCkgewogICAgICAgICAgICBiZXN0X3NvX2ZhciA9IHRwOwogICAgICAgICAgICBvbGRfbWF0Y2ggPSBuZXdfbWF0Y2g7CiAgICAgICAgfQogICAgICAgIGlmIChuZXdfbWF0Y2ggPT0gMCkKICAgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAvKiB0aGlzIGlzIHRoZSBiZXN0IHJlc3VsdCB3ZSBjYW4gZ2V0ICovCiAgICAgICAgaWYgKHRwLT5jaGlsZF9saXN0KSB7CiAgICAgICAgICAgIHJldHB0ciA9CiAgICAgICAgICAgICAgICBmaW5kX2Jlc3RfdHJlZV9ub2RlKHBhdHRybiwgdHAtPmNoaWxkX2xpc3QsICZuZXdfbWF0Y2gpOwogICAgICAgICAgICBpZiAobmV3X21hdGNoIDwgb2xkX21hdGNoKSB7CiAgICAgICAgICAgICAgICBiZXN0X3NvX2ZhciA9IHJldHB0cjsKICAgICAgICAgICAgICAgIG9sZF9tYXRjaCA9IG5ld19tYXRjaDsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAobmV3X21hdGNoID09IDApCiAgICAgICAgICAgICAgICBicmVhazsgICAgICAgICAgLyogdGhpcyBpcyB0aGUgYmVzdCByZXN1bHQgd2UgY2FuIGdldCAqLwogICAgICAgIH0KICAgIH0KICAgIGlmIChtYXRjaCkKICAgICAgICAqbWF0Y2ggPSBvbGRfbWF0Y2g7CiAgICByZXR1cm4gKGJlc3Rfc29fZmFyKTsKfQoKCnN0YXRpYyB2b2lkCm1lcmdlX2Fub25fY2hpbGRyZW4oc3RydWN0IHRyZWUgKnRwMSwgc3RydWN0IHRyZWUgKnRwMikKICAgICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgICAgKiBOQjogdHAxIGlzIHRoZSAnYW5vbnltb3VzJyBub2RlIAogICAgICAgICAgICAgICAgICovCnsKICAgIHN0cnVjdCB0cmVlICAgICpjaGlsZDEsICpjaGlsZDIsICpwcmV2aW91czsKCiAgICBmb3IgKGNoaWxkMSA9IHRwMS0+Y2hpbGRfbGlzdDsgY2hpbGQxOykgewoKICAgICAgICBmb3IgKGNoaWxkMiA9IHRwMi0+Y2hpbGRfbGlzdCwgcHJldmlvdXMgPSBOVUxMOwogICAgICAgICAgICAgY2hpbGQyOyBwcmV2aW91cyA9IGNoaWxkMiwgY2hpbGQyID0gY2hpbGQyLT5uZXh0X3BlZXIpIHsKCiAgICAgICAgICAgIGlmIChjaGlsZDEtPnN1YmlkID09IGNoaWxkMi0+c3ViaWQpIHsKICAgICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgICAgKiBGb3VuZCAnbWF0Y2hpbmcnIGNoaWxkcmVuLAogICAgICAgICAgICAgICAgICogIHNvIG1lcmdlIHRoZW0KICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgaWYgKCFzdHJuY21wKGNoaWxkMS0+bGFiZWwsIEFOT04sIEFOT05fTEVOKSkgewogICAgICAgICAgICAgICAgICAgIG1lcmdlX2Fub25fY2hpbGRyZW4oY2hpbGQxLCBjaGlsZDIpOwoKICAgICAgICAgICAgICAgICAgICBjaGlsZDEtPmNoaWxkX2xpc3QgPSBOVUxMOwogICAgICAgICAgICAgICAgICAgIHByZXZpb3VzID0gY2hpbGQxOyAgLyogRmluaXNoZWQgd2l0aCAnY2hpbGQxJyAqLwogICAgICAgICAgICAgICAgICAgIGNoaWxkMSA9IGNoaWxkMS0+bmV4dF9wZWVyOwogICAgICAgICAgICAgICAgICAgIGZyZWVfdHJlZShwcmV2aW91cyk7CiAgICAgICAgICAgICAgICAgICAgZ290byBuZXh0OwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGVsc2UgaWYgKCFzdHJuY21wKGNoaWxkMi0+bGFiZWwsIEFOT04sIEFOT05fTEVOKSkgewogICAgICAgICAgICAgICAgICAgIG1lcmdlX2Fub25fY2hpbGRyZW4oY2hpbGQyLCBjaGlsZDEpOwoKICAgICAgICAgICAgICAgICAgICBpZiAocHJldmlvdXMpCiAgICAgICAgICAgICAgICAgICAgICAgIHByZXZpb3VzLT5uZXh0X3BlZXIgPSBjaGlsZDItPm5leHRfcGVlcjsKICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgIHRwMi0+Y2hpbGRfbGlzdCA9IGNoaWxkMi0+bmV4dF9wZWVyOwogICAgICAgICAgICAgICAgICAgIGZyZWVfdHJlZShjaGlsZDIpOwoKICAgICAgICAgICAgICAgICAgICBwcmV2aW91cyA9IGNoaWxkMTsgIC8qIE1vdmUgJ2NoaWxkMScgdG8gJ3RwMicgKi8KICAgICAgICAgICAgICAgICAgICBjaGlsZDEgPSBjaGlsZDEtPm5leHRfcGVlcjsKICAgICAgICAgICAgICAgICAgICBwcmV2aW91cy0+bmV4dF9wZWVyID0gdHAyLT5jaGlsZF9saXN0OwogICAgICAgICAgICAgICAgICAgIHRwMi0+Y2hpbGRfbGlzdCA9IHByZXZpb3VzOwogICAgICAgICAgICAgICAgICAgIGZvciAocHJldmlvdXMgPSB0cDItPmNoaWxkX2xpc3Q7CiAgICAgICAgICAgICAgICAgICAgICAgICBwcmV2aW91czsgcHJldmlvdXMgPSBwcmV2aW91cy0+bmV4dF9wZWVyKQogICAgICAgICAgICAgICAgICAgICAgICBwcmV2aW91cy0+cGFyZW50ID0gdHAyOwogICAgICAgICAgICAgICAgICAgIGdvdG8gbmV4dDsKICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIWxhYmVsX2NvbXBhcmUoY2hpbGQxLT5sYWJlbCwgY2hpbGQyLT5sYWJlbCkpIHsKICAgICAgICAgICAgICAgICAgICBpZiAobmV0c25tcF9kc19nZXRfaW50KE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgCgkJCQkJICAgTkVUU05NUF9EU19MSUJfTUlCX1dBUk5JTkdTKSkgewogICAgICAgICAgICAgICAgICAgICAgICBzbm1wX2xvZyhMT0dfV0FSTklORywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIldhcm5pbmc6ICVzLiVsZCBpcyBib3RoICVzIGFuZCAlcyAoJXMpXG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cDItPmxhYmVsLCBjaGlsZDEtPnN1YmlkLCBjaGlsZDEtPmxhYmVsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZDItPmxhYmVsLCBGaWxlKTsKCQkgICAgfQogICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICAgICAgICAqIFR3byBjb3BpZXMgb2YgdGhlIHNhbWUgbm9kZS4KICAgICAgICAgICAgICAgICAgICAgKiAnY2hpbGQyJyBhZG9wdHMgdGhlIGNoaWxkcmVuIG9mICdjaGlsZDEnCiAgICAgICAgICAgICAgICAgICAgICovCgogICAgICAgICAgICAgICAgICAgIGlmIChjaGlsZDItPmNoaWxkX2xpc3QpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChwcmV2aW91cyA9IGNoaWxkMi0+Y2hpbGRfbGlzdDsgcHJldmlvdXMtPm5leHRfcGVlcjsgcHJldmlvdXMgPSBwcmV2aW91cy0+bmV4dF9wZWVyKTsgICAgICAgLyogRmluZCB0aGUgZW5kIG9mIHRoZSBsaXN0ICovCiAgICAgICAgICAgICAgICAgICAgICAgIHByZXZpb3VzLT5uZXh0X3BlZXIgPSBjaGlsZDEtPmNoaWxkX2xpc3Q7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkMi0+Y2hpbGRfbGlzdCA9IGNoaWxkMS0+Y2hpbGRfbGlzdDsKICAgICAgICAgICAgICAgICAgICBmb3IgKHByZXZpb3VzID0gY2hpbGQxLT5jaGlsZF9saXN0OwogICAgICAgICAgICAgICAgICAgICAgICAgcHJldmlvdXM7IHByZXZpb3VzID0gcHJldmlvdXMtPm5leHRfcGVlcikKICAgICAgICAgICAgICAgICAgICAgICAgcHJldmlvdXMtPnBhcmVudCA9IGNoaWxkMjsKICAgICAgICAgICAgICAgICAgICBjaGlsZDEtPmNoaWxkX2xpc3QgPSBOVUxMOwoKICAgICAgICAgICAgICAgICAgICBwcmV2aW91cyA9IGNoaWxkMTsgIC8qIEZpbmlzaGVkIHdpdGggJ2NoaWxkMScgKi8KICAgICAgICAgICAgICAgICAgICBjaGlsZDEgPSBjaGlsZDEtPm5leHRfcGVlcjsKICAgICAgICAgICAgICAgICAgICBmcmVlX3RyZWUocHJldmlvdXMpOwogICAgICAgICAgICAgICAgICAgIGdvdG8gbmV4dDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvKgogICAgICAgICAqIElmIG5vIG1hdGNoLCBtb3ZlICdjaGlsZDEnIHRvICd0cDInIGNoaWxkX2xpc3QKICAgICAgICAgKi8KICAgICAgICBpZiAoY2hpbGQxKSB7CiAgICAgICAgICAgIHByZXZpb3VzID0gY2hpbGQxOwogICAgICAgICAgICBjaGlsZDEgPSBjaGlsZDEtPm5leHRfcGVlcjsKICAgICAgICAgICAgcHJldmlvdXMtPnBhcmVudCA9IHRwMjsKICAgICAgICAgICAgcHJldmlvdXMtPm5leHRfcGVlciA9IHRwMi0+Y2hpbGRfbGlzdDsKICAgICAgICAgICAgdHAyLT5jaGlsZF9saXN0ID0gcHJldmlvdXM7CiAgICAgICAgfQogICAgICBuZXh0OjsKICAgIH0KfQoKCi8qCiAqIEZpbmQgYWxsIHRoZSBjaGlsZHJlbiBvZiByb290IGluIHRoZSBsaXN0IG9mIG5vZGVzLiAgTGluayB0aGVtIGludG8gdGhlCiAqIHRyZWUgYW5kIG91dCBvZiB0aGUgbm9kZXMgbGlzdC4KICovCnN0YXRpYyB2b2lkCmRvX3N1YnRyZWUoc3RydWN0IHRyZWUgKnJvb3QsIHN0cnVjdCBub2RlICoqbm9kZXMpCnsKICAgIHN0cnVjdCB0cmVlICAgICp0cCwgKmFub25fdHAgPSBOVUxMOwogICAgc3RydWN0IHRyZWUgICAgKnhyb290ID0gcm9vdDsKICAgIHN0cnVjdCBub2RlICAgICpucCwgKipoZWFkcDsKICAgIHN0cnVjdCBub2RlICAgICpvbGRucCA9IE5VTEwsICpjaGlsZF9saXN0ID0gTlVMTCwgKmNoaWxkcCA9IE5VTEw7CiAgICBpbnQgICAgICAgICAgICAgaGFzaDsKICAgIGludCAgICAgICAgICAgICppbnRfcDsKCiAgICB3aGlsZSAoeHJvb3QtPm5leHRfcGVlciAmJiB4cm9vdC0+bmV4dF9wZWVyLT5zdWJpZCA9PSByb290LT5zdWJpZCkgewojaWYgMAogICAgICAgIHByaW50ZigieHJvb3Q6ICVzLiVzID0+ICVzXG4iLCB4cm9vdC0+cGFyZW50LT5sYWJlbCwgeHJvb3QtPmxhYmVsLAogICAgICAgICAgICAgICB4cm9vdC0+bmV4dF9wZWVyLT5sYWJlbCk7CiNlbmRpZgogICAgICAgIHhyb290ID0geHJvb3QtPm5leHRfcGVlcjsKICAgIH0KCiAgICB0cCA9IHJvb3Q7CiAgICBoZWFkcCA9ICZuYnVja2V0c1tOQlVDS0VUKG5hbWVfaGFzaCh0cC0+bGFiZWwpKV07CiAgICAvKgogICAgICogU2VhcmNoIGVhY2ggb2YgdGhlIG5vZGVzIGZvciBvbmUgd2hvc2UgcGFyZW50IGlzIHJvb3QsIGFuZAogICAgICogbW92ZSBlYWNoIGludG8gYSBzZXBhcmF0ZSBsaXN0LgogICAgICovCiAgICBmb3IgKG5wID0gKmhlYWRwOyBucDsgbnAgPSBucC0+bmV4dCkgewogICAgICAgIGlmICghbGFiZWxfY29tcGFyZSh0cC0+bGFiZWwsIG5wLT5wYXJlbnQpKSB7CiAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAqIHRha2UgdGhpcyBub2RlIG91dCBvZiB0aGUgbm9kZSBsaXN0IAogICAgICAgICAgICAgKi8KICAgICAgICAgICAgaWYgKG9sZG5wID09IE5VTEwpIHsKICAgICAgICAgICAgICAgICpoZWFkcCA9IG5wLT5uZXh0OyAgICAgIC8qIGZpeCByb290IG9mIG5vZGUgbGlzdCAqLwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgb2xkbnAtPm5leHQgPSBucC0+bmV4dDsgLyogbGluayBhcm91bmQgdGhpcyBub2RlICovCiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGNoaWxkX2xpc3QpCiAgICAgICAgICAgICAgICBjaGlsZHAtPm5leHQgPSBucDsKICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgY2hpbGRfbGlzdCA9IG5wOwogICAgICAgICAgICBjaGlsZHAgPSBucDsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBvbGRucCA9IG5wOwogICAgICAgIH0KCiAgICB9CiAgICBpZiAoY2hpbGRwKQogICAgICAgIGNoaWxkcC0+bmV4dCA9IE5VTEw7CiAgICAvKgogICAgICogVGFrZSBlYWNoIGVsZW1lbnQgaW4gdGhlIGNoaWxkIGxpc3QgYW5kIHBsYWNlIGl0IGludG8gdGhlIHRyZWUuCiAgICAgKi8KICAgIGZvciAobnAgPSBjaGlsZF9saXN0OyBucDsgbnAgPSBucC0+bmV4dCkgewogICAgICAgIHN0cnVjdCB0cmVlICAgICpvdHAgPSBOVUxMOwogICAgICAgIHN0cnVjdCB0cmVlICAgICp4eHJvb3QgPSB4cm9vdDsKICAgICAgICBhbm9uX3RwID0gTlVMTDsKICAgICAgICB0cCA9IHhyb290LT5jaGlsZF9saXN0OwoKICAgICAgICBpZiAobnAtPnN1YmlkID09IC0xKSB7CiAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAqIG5hbWUgOjo9IHsgcGFyZW50IH0gCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBucC0+c3ViaWQgPSB4cm9vdC0+c3ViaWQ7CiAgICAgICAgICAgIHRwID0geHJvb3Q7CiAgICAgICAgICAgIHh4cm9vdCA9IHhyb290LT5wYXJlbnQ7CiAgICAgICAgfQoKICAgICAgICB3aGlsZSAodHApIHsKICAgICAgICAgICAgaWYgKHRwLT5zdWJpZCA9PSBucC0+c3ViaWQpCiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICBvdHAgPSB0cDsKICAgICAgICAgICAgICAgIHRwID0gdHAtPm5leHRfcGVlcjsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAodHApIHsKICAgICAgICAgICAgaWYgKCFsYWJlbF9jb21wYXJlKHRwLT5sYWJlbCwgbnAtPmxhYmVsKSkgewogICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgICAqIFVwZGF0ZSBsaXN0IG9mIG1vZHVsZXMgCiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgIGludF9wID0KICAgICAgICAgICAgICAgICAgICAoaW50ICopIG1hbGxvYygodHAtPm51bWJlcl9tb2R1bGVzICsgMSkgKiBzaXplb2YoaW50KSk7CiAgICAgICAgICAgICAgICBpZiAoaW50X3AgPT0gTlVMTCkKICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICBtZW1jcHkoaW50X3AsIHRwLT5tb2R1bGVfbGlzdCwKICAgICAgICAgICAgICAgICAgICAgICB0cC0+bnVtYmVyX21vZHVsZXMgKiBzaXplb2YoaW50KSk7CiAgICAgICAgICAgICAgICBpbnRfcFt0cC0+bnVtYmVyX21vZHVsZXNdID0gbnAtPm1vZGlkOwogICAgICAgICAgICAgICAgaWYgKHRwLT5udW1iZXJfbW9kdWxlcyA+IDEpCiAgICAgICAgICAgICAgICAgICAgZnJlZSgoY2hhciAqKSB0cC0+bW9kdWxlX2xpc3QpOwogICAgICAgICAgICAgICAgKyt0cC0+bnVtYmVyX21vZHVsZXM7CiAgICAgICAgICAgICAgICB0cC0+bW9kdWxlX2xpc3QgPSBpbnRfcDsKCiAgICAgICAgICAgICAgICBpZiAobmV0c25tcF9kc19nZXRfYm9vbGVhbihORVRTTk1QX0RTX0xJQlJBUllfSUQsIAoJCQkJCSAgIE5FVFNOTVBfRFNfTElCX01JQl9SRVBMQUNFKSkgewogICAgICAgICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgICAgICAgICogUmVwbGFjZSBmcm9tIG5vZGUgCiAgICAgICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAgICAgdHJlZV9mcm9tX25vZGUodHAsIG5wKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgICAgKiBIYW5kbGUgY2hpbGRyZW4gCiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgIGRvX3N1YnRyZWUodHAsIG5vZGVzKTsKICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICghc3RybmNtcChucC0+bGFiZWwsIEFOT04sIEFOT05fTEVOKSB8fAogICAgICAgICAgICAgICAgIXN0cm5jbXAodHAtPmxhYmVsLCBBTk9OLCBBTk9OX0xFTikpIHsKICAgICAgICAgICAgICAgIGFub25fdHAgPSB0cDsgICAvKiBOZWVkIHRvIG1lcmdlIHRoZXNlIHR3byB0cmVlcyBsYXRlciAqLwogICAgICAgICAgICB9IGVsc2UgaWYgKG5ldHNubXBfZHNfZ2V0X2ludChORVRTTk1QX0RTX0xJQlJBUllfSUQsIAoJCQkJCSAgTkVUU05NUF9EU19MSUJfTUlCX1dBUk5JTkdTKSkgewogICAgICAgICAgICAgICAgc25tcF9sb2coTE9HX1dBUk5JTkcsCiAgICAgICAgICAgICAgICAgICAgICAgICAiV2FybmluZzogJXMuJWxkIGlzIGJvdGggJXMgYW5kICVzICglcylcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICByb290LT5sYWJlbCwgbnAtPnN1YmlkLCB0cC0+bGFiZWwsIG5wLT5sYWJlbCwKICAgICAgICAgICAgICAgICAgICAgICAgIEZpbGUpOwoJICAgIH0KICAgICAgICB9CgogICAgICAgIHRwID0gKHN0cnVjdCB0cmVlICopIGNhbGxvYygxLCBzaXplb2Yoc3RydWN0IHRyZWUpKTsKICAgICAgICBpZiAodHAgPT0gTlVMTCkKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIHRwLT5wYXJlbnQgPSB4eHJvb3Q7CiAgICAgICAgdHAtPm1vZGlkID0gbnAtPm1vZGlkOwogICAgICAgIHRwLT5udW1iZXJfbW9kdWxlcyA9IDE7CiAgICAgICAgdHAtPm1vZHVsZV9saXN0ID0gJih0cC0+bW9kaWQpOwogICAgICAgIHRyZWVfZnJvbV9ub2RlKHRwLCBucCk7CiAgICAgICAgdHAtPm5leHRfcGVlciA9IG90cCA/IG90cC0+bmV4dF9wZWVyIDogeHhyb290LT5jaGlsZF9saXN0OwogICAgICAgIGlmIChvdHApCiAgICAgICAgICAgIG90cC0+bmV4dF9wZWVyID0gdHA7CiAgICAgICAgZWxzZQogICAgICAgICAgICB4eHJvb3QtPmNoaWxkX2xpc3QgPSB0cDsKICAgICAgICBoYXNoID0gTkJVQ0tFVChuYW1lX2hhc2godHAtPmxhYmVsKSk7CiAgICAgICAgdHAtPm5leHQgPSB0YnVja2V0c1toYXNoXTsKICAgICAgICB0YnVja2V0c1toYXNoXSA9IHRwOwogICAgICAgIGRvX3N1YnRyZWUodHAsIG5vZGVzKTsKCiAgICAgICAgaWYgKGFub25fdHApIHsKICAgICAgICAgICAgaWYgKCFzdHJuY21wKHRwLT5sYWJlbCwgQU5PTiwgQU5PTl9MRU4pKSB7CiAgICAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICAgICogVGhlIG5ldyBub2RlIGlzIGFub255bW91cywKICAgICAgICAgICAgICAgICAqICBzbyBtZXJnZSBpdCB3aXRoIHRoZSBleGlzdGluZyBvbmUuCiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgIG1lcmdlX2Fub25fY2hpbGRyZW4odHAsIGFub25fdHApOwoKICAgICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgICAgKiB1bmxpbmsgYW5kIGRlc3Ryb3kgdHAgCiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgIHVubGlua190cmVlKHRwKTsKICAgICAgICAgICAgICAgIGZyZWVfdHJlZSh0cCk7CiAgICAgICAgICAgIH0gZWxzZSBpZiAoIXN0cm5jbXAoYW5vbl90cC0+bGFiZWwsIEFOT04sIEFOT05fTEVOKSkgewogICAgICAgICAgICAgICAgc3RydWN0IHRyZWUgICAgKm50cDsKICAgICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgICAgKiBUaGUgb2xkIG5vZGUgd2FzIGFub255bW91cywKICAgICAgICAgICAgICAgICAqICBzbyBtZXJnZSBpdCB3aXRoIHRoZSBleGlzdGluZyBvbmUsCiAgICAgICAgICAgICAgICAgKiAgYW5kIGZpbGwgaW4gdGhlIGZ1bGwgaW5mb3JtYXRpb24uCiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgIG1lcmdlX2Fub25fY2hpbGRyZW4oYW5vbl90cCwgdHApOwoKICAgICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgICAgKiB1bmxpbmsgYW5vbl90cCBmcm9tIHRoZSBoYXNoIAogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICB1bmxpbmtfdGJ1Y2tldChhbm9uX3RwKTsKCiAgICAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICAgICogZ2V0IHJpZCBvZiBvbGQgY29udGVudHMgb2YgYW5vbl90cCAKICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgZnJlZV9wYXJ0aWFsX3RyZWUoYW5vbl90cCwgRkFMU0UpOwoKICAgICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgICAgKiBwdXQgaW4gdGhlIGN1cnJlbnQgaW5mb3JtYXRpb24gCiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgIGFub25fdHAtPmxhYmVsID0gdHAtPmxhYmVsOwogICAgICAgICAgICAgICAgYW5vbl90cC0+Y2hpbGRfbGlzdCA9IHRwLT5jaGlsZF9saXN0OwogICAgICAgICAgICAgICAgYW5vbl90cC0+bW9kaWQgPSB0cC0+bW9kaWQ7CiAgICAgICAgICAgICAgICBhbm9uX3RwLT50Y19pbmRleCA9IHRwLT50Y19pbmRleDsKICAgICAgICAgICAgICAgIGFub25fdHAtPnR5cGUgPSB0cC0+dHlwZTsKICAgICAgICAgICAgICAgIGFub25fdHAtPmVudW1zID0gdHAtPmVudW1zOwogICAgICAgICAgICAgICAgYW5vbl90cC0+aW5kZXhlcyA9IHRwLT5pbmRleGVzOwogICAgICAgICAgICAgICAgYW5vbl90cC0+YXVnbWVudHMgPSB0cC0+YXVnbWVudHM7CiAgICAgICAgICAgICAgICBhbm9uX3RwLT52YXJiaW5kcyA9IHRwLT52YXJiaW5kczsKICAgICAgICAgICAgICAgIGFub25fdHAtPnJhbmdlcyA9IHRwLT5yYW5nZXM7CiAgICAgICAgICAgICAgICBhbm9uX3RwLT5oaW50ID0gdHAtPmhpbnQ7CiAgICAgICAgICAgICAgICBhbm9uX3RwLT51bml0cyA9IHRwLT51bml0czsKICAgICAgICAgICAgICAgIGFub25fdHAtPmRlc2NyaXB0aW9uID0gdHAtPmRlc2NyaXB0aW9uOwogICAgICAgICAgICAgICAgYW5vbl90cC0+cmVmZXJlbmNlID0gdHAtPnJlZmVyZW5jZTsKICAgICAgICAgICAgICAgIGFub25fdHAtPmRlZmF1bHRWYWx1ZSA9IHRwLT5kZWZhdWx0VmFsdWU7CiAgICAgICAgICAgICAgICBhbm9uX3RwLT5wYXJlbnQgPSB0cC0+cGFyZW50OwoKICAgICAgICAgICAgICAgIHNldF9mdW5jdGlvbihhbm9uX3RwKTsKCiAgICAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICAgICogdXBkYXRlIHBhcmVudCBwb2ludGVyIGluIG1vdmVkIGNoaWxkcmVuIAogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICBudHAgPSBhbm9uX3RwLT5jaGlsZF9saXN0OwogICAgICAgICAgICAgICAgd2hpbGUgKG50cCkgewogICAgICAgICAgICAgICAgICAgIG50cC0+cGFyZW50ID0gYW5vbl90cDsKICAgICAgICAgICAgICAgICAgICBudHAgPSBudHAtPm5leHRfcGVlcjsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICAgICogaGFzaCBpbiBhbm9uX3RwIGluIGl0cyBuZXcgcGxhY2UgCiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgIGhhc2ggPSBOQlVDS0VUKG5hbWVfaGFzaChhbm9uX3RwLT5sYWJlbCkpOwogICAgICAgICAgICAgICAgYW5vbl90cC0+bmV4dCA9IHRidWNrZXRzW2hhc2hdOwogICAgICAgICAgICAgICAgdGJ1Y2tldHNbaGFzaF0gPSBhbm9uX3RwOwoKICAgICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgICAgKiB1bmxpbmsgYW5kIGRlc3Ryb3kgdHAgCiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgIHVubGlua190YnVja2V0KHRwKTsKICAgICAgICAgICAgICAgIHVubGlua190cmVlKHRwKTsKICAgICAgICAgICAgICAgIGZyZWUodHApOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgICAqIFVoPyAgT25lIG9mIHRoZXNlIHR3byBzaG91bGQgaGF2ZSBiZWVuIGFub255bW91cyEgCiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgIGlmIChuZXRzbm1wX2RzX2dldF9pbnQoTkVUU05NUF9EU19MSUJSQVJZX0lELCAKCQkJCSAgICAgICBORVRTTk1QX0RTX0xJQl9NSUJfV0FSTklOR1MpKSB7CiAgICAgICAgICAgICAgICAgICAgc25tcF9sb2coTE9HX1dBUk5JTkcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIldhcm5pbmc6IGV4cGVjdGVkIGFub255bW91cyBub2RlIChlaXRoZXIgJXMgb3IgJXMpIGluICVzXG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRwLT5sYWJlbCwgYW5vbl90cC0+bGFiZWwsIEZpbGUpOwoJCX0KICAgICAgICAgICAgfQogICAgICAgICAgICBhbm9uX3RwID0gTlVMTDsKICAgICAgICB9CiAgICB9CiAgICAvKgogICAgICogZnJlZSBhbGwgbm9kZXMgdGhhdCB3ZXJlIGNvcGllZCBpbnRvIHRyZWUgCiAgICAgKi8KICAgIG9sZG5wID0gTlVMTDsKICAgIGZvciAobnAgPSBjaGlsZF9saXN0OyBucDsgbnAgPSBucC0+bmV4dCkgewogICAgICAgIGlmIChvbGRucCkKICAgICAgICAgICAgZnJlZV9ub2RlKG9sZG5wKTsKICAgICAgICBvbGRucCA9IG5wOwogICAgfQogICAgaWYgKG9sZG5wKQogICAgICAgIGZyZWVfbm9kZShvbGRucCk7Cn0KCnN0YXRpYyB2b2lkCmRvX2xpbmt1cChzdHJ1Y3QgbW9kdWxlICptcCwgc3RydWN0IG5vZGUgKm5wKQp7CiAgICBzdHJ1Y3QgbW9kdWxlX2ltcG9ydCAqbWlwOwogICAgc3RydWN0IG5vZGUgICAgKm9ucCwgKm9sZHAsICpuZXdwOwogICAgc3RydWN0IHRyZWUgICAgKnRwOwogICAgaW50ICAgICAgICAgICAgIGksIG1vcmU7CiAgICAvKgogICAgICogQWxsIG1vZHVsZXMgaW1wbGljaXRseSBpbXBvcnQKICAgICAqICAgdGhlIHJvb3RzIG9mIHRoZSB0cmVlCiAgICAgKi8KICAgIGlmIChzbm1wX2dldF9kb19kZWJ1Z2dpbmcoKSA+IDEpCiAgICAgICAgZHVtcF9tb2R1bGVfbGlzdCgpOwogICAgREVCVUdNU0dUTCgoInBhcnNlLW1pYnMiLCAiUHJvY2Vzc2luZyBJTVBPUlRTIGZvciBtb2R1bGUgJWQgJXNcbiIsCiAgICAgICAgICAgICAgICBtcC0+bW9kaWQsIG1wLT5uYW1lKSk7CiAgICBpZiAobXAtPm5vX2ltcG9ydHMgPT0gMCkgewogICAgICAgIG1wLT5ub19pbXBvcnRzID0gTlVNQkVSX09GX1JPT1RfTk9ERVM7CiAgICAgICAgbXAtPmltcG9ydHMgPSByb290X2ltcG9ydHM7CiAgICB9CgogICAgLyoKICAgICAqIEJ1aWxkIHRoZSB0cmVlCiAgICAgKi8KICAgIGluaXRfbm9kZV9oYXNoKG5wKTsKICAgIGZvciAoaSA9IDAsIG1pcCA9IG1wLT5pbXBvcnRzOyBpIDwgbXAtPm5vX2ltcG9ydHM7ICsraSwgKyttaXApIHsKICAgICAgICBjaGFyICAgICAgICAgICAgbW9kYnVmWzI1Nl07CiAgICAgICAgREVCVUdNU0dUTCgoInBhcnNlLW1pYnMiLCAiICBQcm9jZXNzaW5nIGltcG9ydDogJXNcbiIsCiAgICAgICAgICAgICAgICAgICAgbWlwLT5sYWJlbCkpOwogICAgICAgIGlmIChnZXRfdGNfaW5kZXgobWlwLT5sYWJlbCwgbWlwLT5tb2RpZCkgIT0gLTEpCiAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIHRwID0gZmluZF90cmVlX25vZGUobWlwLT5sYWJlbCwgbWlwLT5tb2RpZCk7CiAgICAgICAgaWYgKCF0cCkgewogICAgICAgICAgICAgICAgc25tcF9sb2coTE9HX1dBUk5JTkcsCiAgICAgICAgICAgICAgICAgICAgICAgICAiRGlkIG5vdCBmaW5kICclcycgaW4gbW9kdWxlICVzICglcylcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICBtaXAtPmxhYmVsLCBtb2R1bGVfbmFtZShtaXAtPm1vZGlkLCBtb2RidWYpLAogICAgICAgICAgICAgICAgICAgICAgICAgRmlsZSk7CiAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KICAgICAgICBkb19zdWJ0cmVlKHRwLCAmbnApOwogICAgfQoKICAgIC8qCiAgICAgKiBJZiBhbnkgbm9kZXMgbGVmdCBvdmVyLAogICAgICogICBjaGVjayB0aGF0IHRoZXkncmUgbm90IHRoZSByZXN1bHQgb2YgYSAiZnVsbHkgcXVhbGlmaWVkIgogICAgICogICBuYW1lLCBhbmQgdGhlbiBhZGQgdGhlbSB0byB0aGUgbGlzdCBvZiBvcnBoYW5zCiAgICAgKi8KCiAgICBpZiAoIW5wKQogICAgICAgIHJldHVybjsKICAgIGZvciAodHAgPSB0cmVlX2hlYWQ7IHRwOyB0cCA9IHRwLT5uZXh0X3BlZXIpCiAgICAgICAgZG9fc3VidHJlZSh0cCwgJm5wKTsKICAgIGlmICghbnApCiAgICAgICAgcmV0dXJuOwoKICAgIC8qCiAgICAgKiBxdWlldGx5IG1vdmUgYWxsIGludGVybmFsIHJlZmVyZW5jZXMgdG8gdGhlIG9ycGhhbiBsaXN0IAogICAgICovCiAgICBvbGRwID0gb3JwaGFuX25vZGVzOwogICAgZG8gewogICAgICAgIGZvciAoaSA9IDA7IGkgPCBOSEFTSFNJWkU7IGkrKykKICAgICAgICAgICAgZm9yIChvbnAgPSBuYnVja2V0c1tpXTsgb25wOyBvbnAgPSBvbnAtPm5leHQpIHsKICAgICAgICAgICAgICAgIHN0cnVjdCBub2RlICAgICpvcCA9IE5VTEw7CiAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgaGFzaCA9IE5CVUNLRVQobmFtZV9oYXNoKG9ucC0+bGFiZWwpKTsKICAgICAgICAgICAgICAgIG5wID0gbmJ1Y2tldHNbaGFzaF07CiAgICAgICAgICAgICAgICB3aGlsZSAobnApIHsKICAgICAgICAgICAgICAgICAgICBpZiAobGFiZWxfY29tcGFyZShvbnAtPmxhYmVsLCBucC0+cGFyZW50KSkgewogICAgICAgICAgICAgICAgICAgICAgICBvcCA9IG5wOwogICAgICAgICAgICAgICAgICAgICAgICBucCA9IG5wLT5uZXh0OwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvcCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wLT5uZXh0ID0gbnAtPm5leHQ7CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5idWNrZXRzW2hhc2hdID0gbnAtPm5leHQ7CiAgICAgICAgICAgICAgICAgICAgICAgIG5wLT5uZXh0ID0gb3JwaGFuX25vZGVzOwogICAgICAgICAgICAgICAgICAgICAgICBvcnBoYW5fbm9kZXMgPSBucDsKICAgICAgICAgICAgICAgICAgICAgICAgb3AgPSBOVUxMOwogICAgICAgICAgICAgICAgICAgICAgICBucCA9IG5idWNrZXRzW2hhc2hdOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIG5ld3AgPSBvcnBoYW5fbm9kZXM7CiAgICAgICAgbW9yZSA9IDA7CiAgICAgICAgZm9yIChvbnAgPSBvcnBoYW5fbm9kZXM7IG9ucCAhPSBvbGRwOyBvbnAgPSBvbnAtPm5leHQpIHsKICAgICAgICAgICAgc3RydWN0IG5vZGUgICAgKm9wID0gTlVMTDsKICAgICAgICAgICAgaW50ICAgICAgICAgICAgIGhhc2ggPSBOQlVDS0VUKG5hbWVfaGFzaChvbnAtPmxhYmVsKSk7CiAgICAgICAgICAgIG5wID0gbmJ1Y2tldHNbaGFzaF07CiAgICAgICAgICAgIHdoaWxlIChucCkgewogICAgICAgICAgICAgICAgaWYgKGxhYmVsX2NvbXBhcmUob25wLT5sYWJlbCwgbnAtPnBhcmVudCkpIHsKICAgICAgICAgICAgICAgICAgICBvcCA9IG5wOwogICAgICAgICAgICAgICAgICAgIG5wID0gbnAtPm5leHQ7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIGlmIChvcCkKICAgICAgICAgICAgICAgICAgICAgICAgb3AtPm5leHQgPSBucC0+bmV4dDsKICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgIG5idWNrZXRzW2hhc2hdID0gbnAtPm5leHQ7CiAgICAgICAgICAgICAgICAgICAgbnAtPm5leHQgPSBvcnBoYW5fbm9kZXM7CiAgICAgICAgICAgICAgICAgICAgb3JwaGFuX25vZGVzID0gbnA7CiAgICAgICAgICAgICAgICAgICAgb3AgPSBOVUxMOwogICAgICAgICAgICAgICAgICAgIG5wID0gbmJ1Y2tldHNbaGFzaF07CiAgICAgICAgICAgICAgICAgICAgbW9yZSA9IDE7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgb2xkcCA9IG5ld3A7CiAgICB9IHdoaWxlIChtb3JlKTsKCiAgICAvKgogICAgICogY29tcGxhaW4gYWJvdXQgbGVmdCBvdmVyIG5vZGVzIAogICAgICovCiAgICBmb3IgKG5wID0gb3JwaGFuX25vZGVzOyBucCAmJiBucC0+bmV4dDsgbnAgPSBucC0+bmV4dCk7ICAgICAvKiBmaW5kIHRoZSBlbmQgb2YgdGhlIG9ycGhhbiBsaXN0ICovCiAgICBmb3IgKGkgPSAwOyBpIDwgTkhBU0hTSVpFOyBpKyspCiAgICAgICAgaWYgKG5idWNrZXRzW2ldKSB7CiAgICAgICAgICAgIGlmIChvcnBoYW5fbm9kZXMpCiAgICAgICAgICAgICAgICBvbnAgPSBucC0+bmV4dCA9IG5idWNrZXRzW2ldOwogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICBvbnAgPSBvcnBoYW5fbm9kZXMgPSBuYnVja2V0c1tpXTsKICAgICAgICAgICAgbmJ1Y2tldHNbaV0gPSBOVUxMOwogICAgICAgICAgICB3aGlsZSAob25wKSB7CiAgICAgICAgICAgICAgICBzbm1wX2xvZyhMT0dfV0FSTklORywKICAgICAgICAgICAgICAgICAgICAgICAgICJVbmxpbmtlZCBPSUQgaW4gJXM6ICVzIDo6PSB7ICVzICVsZCB9XG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgKG1wLT5uYW1lID8gbXAtPm5hbWUgOiAiPG5vIG1vZHVsZT4iKSwKICAgICAgICAgICAgICAgICAgICAgICAgIChvbnAtPmxhYmVsID8gb25wLT5sYWJlbCA6ICI8bm8gbGFiZWw+IiksCiAgICAgICAgICAgICAgICAgICAgICAgICAob25wLT5wYXJlbnQgPyBvbnAtPnBhcmVudCA6ICI8bm8gcGFyZW50PiIpLAogICAgICAgICAgICAgICAgICAgICAgICAgb25wLT5zdWJpZCk7CgkJIHNubXBfbG9nKExPR19XQVJOSU5HLAoJCQkgICJVbmRlZmluZWQgaWRlbnRpZmllcjogJXMgbmVhciBsaW5lICVkIG9mICVzXG4iLAoJCQkgIChvbnAtPnBhcmVudCA/IG9ucC0+cGFyZW50IDogIjxubyBwYXJlbnQ+IiksCgkJCSAgb25wLT5saW5lbm8sIG9ucC0+ZmlsZW5hbWUpOwogICAgICAgICAgICAgICAgbnAgPSBvbnA7CiAgICAgICAgICAgICAgICBvbnAgPSBvbnAtPm5leHQ7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICByZXR1cm47Cn0KCgovKgogKiBUYWtlcyBhIGxpc3Qgb2YgdGhlIGZvcm06CiAqIHsgaXNvIG9yZygzKSBkb2QoNikgMSB9CiAqIGFuZCBjcmVhdGVzIHNldmVyYWwgbm9kZXMsIG9uZSBmb3IgZWFjaCBwYXJlbnQtY2hpbGQgcGFpci4KICogUmV0dXJucyAwIG9uIGVycm9yLgogKi8Kc3RhdGljIGludApnZXRvaWQoRklMRSAqIGZwLCBzdHJ1Y3Qgc3ViaWRfcyAqaWQsICAgLyogYW4gYXJyYXkgb2Ygc3ViaWRzICovCiAgICAgICBpbnQgbGVuZ3RoKQp7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRoZSBsZW5ndGggb2YgdGhlIGFycmF5ICovCiAgICByZWdpc3RlciBpbnQgICAgY291bnQ7CiAgICBpbnQgICAgICAgICAgICAgdHlwZTsKICAgIGNoYXIgICAgICAgICAgICB0b2tlbltNQVhUT0tFTl07CgogICAgaWYgKCh0eXBlID0gZ2V0X3Rva2VuKGZwLCB0b2tlbiwgTUFYVE9LRU4pKSAhPSBMRUZUQlJBQ0tFVCkgewogICAgICAgIHByaW50X2Vycm9yKCJFeHBlY3RlZCBcIntcIiIsIHRva2VuLCB0eXBlKTsKICAgICAgICByZXR1cm4gMDsKICAgIH0KICAgIHR5cGUgPSBnZXRfdG9rZW4oZnAsIHRva2VuLCBNQVhUT0tFTik7CiAgICBmb3IgKGNvdW50ID0gMDsgY291bnQgPCBsZW5ndGg7IGNvdW50KyssIGlkKyspIHsKICAgICAgICBpZC0+bGFiZWwgPSBOVUxMOwogICAgICAgIGlkLT5tb2RpZCA9IGN1cnJlbnRfbW9kdWxlOwogICAgICAgIGlkLT5zdWJpZCA9IC0xOwogICAgICAgIGlmICh0eXBlID09IFJJR0hUQlJBQ0tFVCkKICAgICAgICAgICAgcmV0dXJuIGNvdW50OwogICAgICAgIGlmICh0eXBlID09IExBQkVMKSB7CiAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAqIHRoaXMgZW50cnkgaGFzIGEgbGFiZWwgCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBpZC0+bGFiZWwgPSBzdHJkdXAodG9rZW4pOwogICAgICAgICAgICB0eXBlID0gZ2V0X3Rva2VuKGZwLCB0b2tlbiwgTUFYVE9LRU4pOwogICAgICAgICAgICBpZiAodHlwZSA9PSBMRUZUUEFSRU4pIHsKICAgICAgICAgICAgICAgIHR5cGUgPSBnZXRfdG9rZW4oZnAsIHRva2VuLCBNQVhUT0tFTik7CiAgICAgICAgICAgICAgICBpZiAodHlwZSA9PSBOVU1CRVIpIHsKICAgICAgICAgICAgICAgICAgICBpZC0+c3ViaWQgPSBzdHJ0b3VsKHRva2VuLCBOVUxMLCAxMCk7CiAgICAgICAgICAgICAgICAgICAgaWYgKCh0eXBlID0KICAgICAgICAgICAgICAgICAgICAgICAgIGdldF90b2tlbihmcCwgdG9rZW4sIE1BWFRPS0VOKSkgIT0gUklHSFRQQVJFTikgewogICAgICAgICAgICAgICAgICAgICAgICBwcmludF9lcnJvcigiRXhwZWN0ZWQgYSBjbG9zaW5nIHBhcmVudGhlc2lzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9rZW4sIHR5cGUpOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIHByaW50X2Vycm9yKCJFeHBlY3RlZCBhIG51bWJlciIsIHRva2VuLCB0eXBlKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIGlmICh0eXBlID09IE5VTUJFUikgewogICAgICAgICAgICAvKgogICAgICAgICAgICAgKiB0aGlzIGVudHJ5ICBoYXMganVzdCBhbiBpbnRlZ2VyIHN1Yi1pZGVudGlmaWVyIAogICAgICAgICAgICAgKi8KICAgICAgICAgICAgaWQtPnN1YmlkID0gc3RydG91bCh0b2tlbiwgTlVMTCwgMTApOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHByaW50X2Vycm9yKCJFeHBlY3RlZCBsYWJlbCBvciBudW1iZXIiLCB0b2tlbiwgdHlwZSk7CiAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgIH0KICAgICAgICB0eXBlID0gZ2V0X3Rva2VuKGZwLCB0b2tlbiwgTUFYVE9LRU4pOwogICAgfQogICAgcHJpbnRfZXJyb3IoIlRvbyBsb25nIE9JRCIsIHRva2VuLCB0eXBlKTsKICAgIHJldHVybiAwOwp9CgovKgogKiBQYXJzZSBhIHNlcXVlbmNlIG9mIG9iamVjdCBzdWJpZGVudGlmaWVycyBmb3IgdGhlIGdpdmVuIG5hbWUuCiAqIFRoZSAibGFiZWwgT0JKRUNUIElERU5USUZJRVIgOjo9IiBwb3J0aW9uIGhhcyBhbHJlYWR5IGJlZW4gcGFyc2VkLgogKgogKiBUaGUgbWFqb3JpdHkgb2YgY2FzZXMgdGFrZSB0aGlzIGZvcm0gOgogKiBsYWJlbCBPQkpFQ1QgSURFTlRJRklFUiA6Oj0geyBwYXJlbnQgMiB9CiAqIHdoZXJlIGEgcGFyZW50IGxhYmVsIGFuZCBhIGNoaWxkIHN1YmlkZW50aWZpZXIgbnVtYmVyIGFyZSBzcGVjaWZpZWQuCiAqCiAqIFZhcmlhdGlvbnMgb24gdGhlIHRoZW1lIGluY2x1ZGUgY2FzZXMgd2hlcmUgYSBudW1iZXIgYXBwZWFycyB3aXRoCiAqIHRoZSBwYXJlbnQsIG9yIGludGVybWVkaWF0ZSBzdWJpZGVudGlmaWVycyBhcmUgc3BlY2lmaWVkIGJ5IGxhYmVsLAogKiBieSBudW1iZXIsIG9yIGJvdGguCiAqCiAqIEhlcmUgYXJlIHNvbWUgcmVwcmVzZW50YXRpdmUgc2FtcGxlcyA6CiAqIGludGVybmV0ICAgICAgICBPQkpFQ1QgSURFTlRJRklFUiA6Oj0geyBpc28gb3JnKDMpIGRvZCg2KSAxIH0KICogbWdtdCAgICAgICAgICAgIE9CSkVDVCBJREVOVElGSUVSIDo6PSB7IGludGVybmV0IDIgfQogKiBycHRySW5mb0hlYWx0aCAgT0JKRUNUIElERU5USUZJRVIgOjo9IHsgc25tcERvdDNScHRyTWd0IDAgNCB9CiAqCiAqIEhlcmUgaXMgYSB2ZXJ5IHJhcmUgZm9ybSA6CiAqIGlzbyAgICAgICAgICAgICBPQkpFQ1QgSURFTlRJRklFUiA6Oj0geyAxIH0KICoKICogUmV0dXJucyBOVUxMIG9uIGVycm9yLiAgV2hlbiB0aGlzIGhhcHBlbnMsIG1lbW9yeSBtYXkgYmUgbGVha2VkLgogKi8Kc3RhdGljIHN0cnVjdCBub2RlICoKcGFyc2Vfb2JqZWN0aWQoRklMRSAqIGZwLCBjaGFyICpuYW1lKQp7CiAgICByZWdpc3RlciBpbnQgICAgY291bnQ7CiAgICByZWdpc3RlciBzdHJ1Y3Qgc3ViaWRfcyAqb3AsICpub3A7CiAgICBpbnQgICAgICAgICAgICAgbGVuZ3RoOwogICAgc3RydWN0IHN1YmlkX3MgIGxvaWRbMzJdOwogICAgc3RydWN0IG5vZGUgICAgKm5wLCAqcm9vdCA9IE5VTEwsICpvbGRucCA9IE5VTEw7CiAgICBzdHJ1Y3QgdHJlZSAgICAqdHA7CgogICAgaWYgKChsZW5ndGggPSBnZXRvaWQoZnAsIGxvaWQsIDMyKSkgPT0gMCkgewogICAgICAgIHByaW50X2Vycm9yKCJCYWQgb2JqZWN0IGlkZW50aWZpZXIiLCBOVUxMLCBDT05USU5VRSk7CiAgICAgICAgcmV0dXJuIE5VTEw7CiAgICB9CgogICAgLyoKICAgICAqIEhhbmRsZSBudW1lcmljLW9ubHkgb2JqZWN0IGlkZW50aWZpZXJzLAogICAgICogIGJ5IGxhYmVsbGluZyB0aGUgZmlyc3Qgc3ViLWlkZW50aWZpZXIKICAgICAqLwogICAgb3AgPSBsb2lkOwogICAgaWYgKCFvcC0+bGFiZWwpIHsKICAgICAgICBpZiAobGVuZ3RoID09IDEpIHsKICAgICAgICAgICAgcHJpbnRfZXJyb3IoIkF0dGVtcHQgdG8gZGVmaW5lIGEgcm9vdCBvaWQiLCBuYW1lLCBPQkpFQ1QpOwogICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICB9CiAgICAgICAgZm9yICh0cCA9IHRyZWVfaGVhZDsgdHA7IHRwID0gdHAtPm5leHRfcGVlcikKICAgICAgICAgICAgaWYgKChpbnQpIHRwLT5zdWJpZCA9PSBvcC0+c3ViaWQpIHsKICAgICAgICAgICAgICAgIG9wLT5sYWJlbCA9IHN0cmR1cCh0cC0+bGFiZWwpOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgIH0KCiAgICAvKgogICAgICogSGFuZGxlICAibGFiZWwgT0JKRUNULUlERU5USUZJRVIgOjo9IHsgc3ViaWQgfSIKICAgICAqLwogICAgaWYgKGxlbmd0aCA9PSAxKSB7CiAgICAgICAgb3AgPSBsb2lkOwogICAgICAgIG5wID0gYWxsb2Nfbm9kZShvcC0+bW9kaWQpOwogICAgICAgIGlmIChucCA9PSBOVUxMKQogICAgICAgICAgICByZXR1cm4gKE5VTEwpOwogICAgICAgIG5wLT5zdWJpZCA9IG9wLT5zdWJpZDsKICAgICAgICBucC0+bGFiZWwgPSBzdHJkdXAobmFtZSk7CiAgICAgICAgbnAtPnBhcmVudCA9IG9wLT5sYWJlbDsKICAgICAgICByZXR1cm4gbnA7CiAgICB9CgogICAgLyoKICAgICAqIEZvciBlYWNoIHBhcmVudC1jaGlsZCBzdWJpZCBwYWlyIGluIHRoZSBzdWJpZCBhcnJheSwKICAgICAqIGNyZWF0ZSBhIG5vZGUgYW5kIGxpbmsgaXQgaW50byB0aGUgbm9kZSBsaXN0LgogICAgICovCiAgICBmb3IgKGNvdW50ID0gMCwgb3AgPSBsb2lkLCBub3AgPSBsb2lkICsgMTsgY291bnQgPCAobGVuZ3RoIC0gMSk7CiAgICAgICAgIGNvdW50KyssIG9wKyssIG5vcCsrKSB7CiAgICAgICAgLyoKICAgICAgICAgKiBldmVyeSBub2RlIG11c3QgaGF2ZSBwYXJlbnQncyBuYW1lIGFuZCBjaGlsZCdzIG5hbWUgb3IgbnVtYmVyIAogICAgICAgICAqLwogICAgICAgIC8qCiAgICAgICAgICogWFggdGhlIG5leHQgc3RhdGVtZW50IGlzIGFsd2F5cyB0cnVlIC0tIGRvZXMgaXQgbWF0dGVyID8/IAogICAgICAgICAqLwogICAgICAgIGlmIChvcC0+bGFiZWwgJiYgKG5vcC0+bGFiZWwgfHwgKG5vcC0+c3ViaWQgIT0gLTEpKSkgewogICAgICAgICAgICBucCA9IGFsbG9jX25vZGUobm9wLT5tb2RpZCk7CiAgICAgICAgICAgIGlmIChucCA9PSBOVUxMKQogICAgICAgICAgICAgICAgcmV0dXJuIChOVUxMKTsKICAgICAgICAgICAgaWYgKHJvb3QgPT0gTlVMTCkKICAgICAgICAgICAgICAgIHJvb3QgPSBucDsKCiAgICAgICAgICAgIG5wLT5wYXJlbnQgPSBzdHJkdXAob3AtPmxhYmVsKTsKICAgICAgICAgICAgaWYgKGNvdW50ID09IChsZW5ndGggLSAyKSkgewogICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgICAqIFRoZSBuYW1lIGZvciB0aGlzIG5vZGUgaXMgdGhlIGxhYmVsIGZvciB0aGlzIGVudHJ5IAogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICBucC0+bGFiZWwgPSBzdHJkdXAobmFtZSk7CiAgICAgICAgICAgICAgICBpZiAobnAtPmxhYmVsID09IE5VTEwpIHsKICAgICAgICAgICAgICAgICAgICBTTk1QX0ZSRUUobnAtPnBhcmVudCk7CiAgICAgICAgICAgICAgICAgICAgU05NUF9GUkVFKG5wKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gKE5VTEwpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgaWYgKCFub3AtPmxhYmVsKSB7CiAgICAgICAgICAgICAgICAgICAgbm9wLT5sYWJlbCA9IChjaGFyICopIG1hbGxvYygyMCArIEFOT05fTEVOKTsKICAgICAgICAgICAgICAgICAgICBpZiAobm9wLT5sYWJlbCA9PSBOVUxMKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIFNOTVBfRlJFRShucC0+cGFyZW50KTsKICAgICAgICAgICAgICAgICAgICAgICAgU05NUF9GUkVFKG5wKTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChOVUxMKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgc3ByaW50Zihub3AtPmxhYmVsLCAiJXMlZCIsIEFOT04sIGFub255bW91cysrKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIG5wLT5sYWJlbCA9IHN0cmR1cChub3AtPmxhYmVsKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAobm9wLT5zdWJpZCAhPSAtMSkKICAgICAgICAgICAgICAgIG5wLT5zdWJpZCA9IG5vcC0+c3ViaWQ7CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHByaW50X2Vycm9yKCJXYXJuaW5nOiBUaGlzIGVudHJ5IGlzIHByZXR0eSBzaWxseSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBucC0+bGFiZWwsIENPTlRJTlVFKTsKCiAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAqIHNldCB1cCBuZXh0IGVudHJ5IAogICAgICAgICAgICAgKi8KICAgICAgICAgICAgaWYgKG9sZG5wKQogICAgICAgICAgICAgICAgb2xkbnAtPm5leHQgPSBucDsKICAgICAgICAgICAgb2xkbnAgPSBucDsKICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAvKiBlbmQgaWYob3AtPmxhYmVsLi4uICovCiAgICB9CgogICAgLyoKICAgICAqIGZyZWUgdGhlIGxvaWQgYXJyYXkgCiAgICAgKi8KICAgIGZvciAoY291bnQgPSAwLCBvcCA9IGxvaWQ7IGNvdW50IDwgbGVuZ3RoOyBjb3VudCsrLCBvcCsrKSB7CiAgICAgICAgaWYgKG9wLT5sYWJlbCkKICAgICAgICAgICAgZnJlZShvcC0+bGFiZWwpOwogICAgfQoKICAgIHJldHVybiByb290Owp9CgpzdGF0aWMgaW50CmdldF90Yyhjb25zdCBjaGFyICpkZXNjcmlwdG9yLAogICAgICAgaW50IG1vZGlkLAogICAgICAgaW50ICp0Y19pbmRleCwKICAgICAgIHN0cnVjdCBlbnVtX2xpc3QgKiplcCwgc3RydWN0IHJhbmdlX2xpc3QgKipycCwgY2hhciAqKmhpbnQpCnsKICAgIGludCAgICAgICAgICAgICBpOwogICAgc3RydWN0IHRjICAgICAgKnRjcDsKCiAgICBpID0gZ2V0X3RjX2luZGV4KGRlc2NyaXB0b3IsIG1vZGlkKTsKICAgIGlmICh0Y19pbmRleCkKICAgICAgICAqdGNfaW5kZXggPSBpOwogICAgaWYgKGkgIT0gLTEpIHsKICAgICAgICB0Y3AgPSAmdGNsaXN0W2ldOwogICAgICAgIGlmIChlcCkgewogICAgICAgICAgICBmcmVlX2VudW1zKGVwKTsKICAgICAgICAgICAgKmVwID0gY29weV9lbnVtcyh0Y3AtPmVudW1zKTsKICAgICAgICB9CiAgICAgICAgaWYgKHJwKSB7CiAgICAgICAgICAgIGZyZWVfcmFuZ2VzKHJwKTsKICAgICAgICAgICAgKnJwID0gY29weV9yYW5nZXModGNwLT5yYW5nZXMpOwogICAgICAgIH0KICAgICAgICBpZiAoaGludCkgewogICAgICAgICAgICBpZiAoKmhpbnQpCiAgICAgICAgICAgICAgICBmcmVlKCpoaW50KTsKICAgICAgICAgICAgKmhpbnQgPSAodGNwLT5oaW50ID8gc3RyZHVwKHRjcC0+aGludCkgOiBOVUxMKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHRjcC0+dHlwZTsKICAgIH0KICAgIHJldHVybiBMQUJFTDsKfQoKLyoKICogcmV0dXJuIGluZGV4IGludG8gdGNsaXN0IG9mIGdpdmVuIFRDIGRlc2NyaXB0b3IKICogcmV0dXJuIC0xIGlmIG5vdCBmb3VuZAogKi8Kc3RhdGljIGludApnZXRfdGNfaW5kZXgoY29uc3QgY2hhciAqZGVzY3JpcHRvciwgaW50IG1vZGlkKQp7CiAgICBpbnQgICAgICAgICAgICAgaTsKICAgIHN0cnVjdCB0YyAgICAgICp0Y3A7CiAgICBzdHJ1Y3QgbW9kdWxlICAqbXA7CiAgICBzdHJ1Y3QgbW9kdWxlX2ltcG9ydCAqbWlwOwoKICAgIC8qCiAgICAgKiBDaGVjayB0aGF0IHRoZSBkZXNjcmlwdG9yIGlzbid0IGltcG9ydGVkCiAgICAgKiAgYnkgc2VhcmNoaW5nIHRoZSBpbXBvcnQgbGlzdAogICAgICovCgogICAgZm9yIChtcCA9IG1vZHVsZV9oZWFkOyBtcDsgbXAgPSBtcC0+bmV4dCkKICAgICAgICBpZiAobXAtPm1vZGlkID09IG1vZGlkKQogICAgICAgICAgICBicmVhazsKICAgIGlmIChtcCkKICAgICAgICBmb3IgKGkgPSAwLCBtaXAgPSBtcC0+aW1wb3J0czsgaSA8IG1wLT5ub19pbXBvcnRzOyArK2ksICsrbWlwKSB7CiAgICAgICAgICAgIGlmICghbGFiZWxfY29tcGFyZShtaXAtPmxhYmVsLCBkZXNjcmlwdG9yKSkgewogICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgICAqIEZvdW5kIGl0IC0gc28gYW1lbmQgdGhlIG1vZHVsZSBJRCAKICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgbW9kaWQgPSBtaXAtPm1vZGlkOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICB9CgoKICAgIGZvciAoaSA9IDAsIHRjcCA9IHRjbGlzdDsgaSA8IE1BWFRDOyBpKyssIHRjcCsrKSB7CiAgICAgICAgaWYgKHRjcC0+dHlwZSA9PSAwKQogICAgICAgICAgICBicmVhazsKICAgICAgICBpZiAoIWxhYmVsX2NvbXBhcmUoZGVzY3JpcHRvciwgdGNwLT5kZXNjcmlwdG9yKSAmJgogICAgICAgICAgICAoKG1vZGlkID09IHRjcC0+bW9kaWQpIHx8IChtb2RpZCA9PSAtMSkpKSB7CiAgICAgICAgICAgIHJldHVybiBpOwogICAgICAgIH0KICAgIH0KICAgIHJldHVybiAtMTsKfQoKLyoKICogdHJhbnNsYXRlIGludGVnZXIgdGNfaW5kZXggdG8gc3RyaW5nIGlkZW50aWZpZXIgZnJvbSB0Y2xpc3QKICogKgogKiAqIFJldHVybnMgcG9pbnRlciB0byBzdHJpbmcgaW4gdGFibGUgKHNob3VsZCBub3QgYmUgbW9kaWZpZWQpIG9yIE5VTEwKICovCmNvbnN0IGNoYXIgICAgICoKZ2V0X3RjX2Rlc2NyaXB0b3IoaW50IHRjX2luZGV4KQp7CiAgICBpZiAodGNfaW5kZXggPCAwIHx8IHRjX2luZGV4ID49IE1BWFRDKQogICAgICAgIHJldHVybiBOVUxMOwogICAgcmV0dXJuICh0Y2xpc3RbdGNfaW5kZXhdLmRlc2NyaXB0b3IpOwp9Cgpjb25zdCBjaGFyICAgICAqCmdldF90Y19kZXNjcmlwdGlvbihpbnQgdGNfaW5kZXgpCnsKICAgIGlmICh0Y19pbmRleCA8IDAgfHwgdGNfaW5kZXggPj0gTUFYVEMpCiAgICAgICAgcmV0dXJuIE5VTEw7CiAgICByZXR1cm4gKHRjbGlzdFt0Y19pbmRleF0uZGVzY3JpcHRpb24pOwp9CgoKLyoKICogUGFyc2VzIGFuIGVudW1lcmF0aW9uIGxpc3Qgb2YgdGhlIGZvcm06CiAqICAgICAgICB7IGxhYmVsKHZhbHVlKSBsYWJlbCh2YWx1ZSkgLi4uIH0KICogVGhlIGluaXRpYWwgeyBoYXMgYWxyZWFkeSBiZWVuIHBhcnNlZC4KICogUmV0dXJucyBOVUxMIG9uIGVycm9yLgogKi8KCnN0YXRpYyBzdHJ1Y3QgZW51bV9saXN0ICoKcGFyc2VfZW51bWxpc3QoRklMRSAqIGZwLCBzdHJ1Y3QgZW51bV9saXN0ICoqcmV0cCkKewogICAgcmVnaXN0ZXIgaW50ICAgIHR5cGU7CiAgICBjaGFyICAgICAgICAgICAgdG9rZW5bTUFYVE9LRU5dOwogICAgc3RydWN0IGVudW1fbGlzdCAqZXAgPSBOVUxMLCAqKmVwcCA9ICZlcDsKCiAgICBmcmVlX2VudW1zKHJldHApOwoKICAgIHdoaWxlICgodHlwZSA9IGdldF90b2tlbihmcCwgdG9rZW4sIE1BWFRPS0VOKSkgIT0gRU5ET0ZGSUxFKSB7CiAgICAgICAgaWYgKHR5cGUgPT0gUklHSFRCUkFDS0VUKQogICAgICAgICAgICBicmVhazsKICAgICAgICAvKiBzb21lIGVudW1zIHVzZSAiZGVwcmVjYXRlZCIgdG8gaW5kaWNhdGUgYSBubyBsb25nZXIgdmFsdWUgbGFiZWwgKi8KICAgICAgICAvKiAoRUc6IElQLU1JQidzIElwQWRkcmVzc1N0YXR1c1RDKSAqLwogICAgICAgIGlmICh0eXBlID09IExBQkVMIHx8IHR5cGUgPT0gREVQUkVDQVRFRCkgewogICAgICAgICAgICAvKgogICAgICAgICAgICAgKiB0aGlzIGlzIGFuIGVudW1lcmF0ZWQgbGFiZWwgCiAgICAgICAgICAgICAqLwogICAgICAgICAgICAqZXBwID0KICAgICAgICAgICAgICAgIChzdHJ1Y3QgZW51bV9saXN0ICopIGNhbGxvYygxLCBzaXplb2Yoc3RydWN0IGVudW1fbGlzdCkpOwogICAgICAgICAgICBpZiAoKmVwcCA9PSBOVUxMKQogICAgICAgICAgICAgICAgcmV0dXJuIChOVUxMKTsKICAgICAgICAgICAgLyoKICAgICAgICAgICAgICogYSByZWFzb25hYmxlIGFwcHJveGltYXRpb24gZm9yIHRoZSBsZW5ndGggCiAgICAgICAgICAgICAqLwogICAgICAgICAgICAoKmVwcCktPmxhYmVsID0gc3RyZHVwKHRva2VuKTsKICAgICAgICAgICAgdHlwZSA9IGdldF90b2tlbihmcCwgdG9rZW4sIE1BWFRPS0VOKTsKICAgICAgICAgICAgaWYgKHR5cGUgIT0gTEVGVFBBUkVOKSB7CiAgICAgICAgICAgICAgICBwcmludF9lcnJvcigiRXhwZWN0ZWQgXCIoXCIiLCB0b2tlbiwgdHlwZSk7CiAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICAgICAgfQogICAgICAgICAgICB0eXBlID0gZ2V0X3Rva2VuKGZwLCB0b2tlbiwgTUFYVE9LRU4pOwogICAgICAgICAgICBpZiAodHlwZSAhPSBOVU1CRVIpIHsKICAgICAgICAgICAgICAgIHByaW50X2Vycm9yKCJFeHBlY3RlZCBpbnRlZ2VyIiwgdG9rZW4sIHR5cGUpOwogICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgKCplcHApLT52YWx1ZSA9IHN0cnRvbCh0b2tlbiwgTlVMTCwgMTApOwogICAgICAgICAgICB0eXBlID0gZ2V0X3Rva2VuKGZwLCB0b2tlbiwgTUFYVE9LRU4pOwogICAgICAgICAgICBpZiAodHlwZSAhPSBSSUdIVFBBUkVOKSB7CiAgICAgICAgICAgICAgICBwcmludF9lcnJvcigiRXhwZWN0ZWQgXCIpXCIiLCB0b2tlbiwgdHlwZSk7CiAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICAgICAgfQogICAgICAgICAgICBlcHAgPSAmKCplcHApLT5uZXh0OwogICAgICAgIH0KICAgIH0KICAgIGlmICh0eXBlID09IEVORE9GRklMRSkgewogICAgICAgIHByaW50X2Vycm9yKCJFeHBlY3RlZCBcIn1cIiIsIHRva2VuLCB0eXBlKTsKICAgICAgICByZXR1cm4gTlVMTDsKICAgIH0KICAgICpyZXRwID0gZXA7CiAgICByZXR1cm4gZXA7Cn0KCnN0YXRpYyBzdHJ1Y3QgcmFuZ2VfbGlzdCAqCnBhcnNlX3JhbmdlcyhGSUxFICogZnAsIHN0cnVjdCByYW5nZV9saXN0ICoqcmV0cCkKewogICAgaW50ICAgICAgICAgICAgIGxvdywgaGlnaDsKICAgIGNoYXIgICAgICAgICAgICBuZXh0dG9rZW5bTUFYVE9LRU5dOwogICAgaW50ICAgICAgICAgICAgIG5leHR0eXBlOwogICAgc3RydWN0IHJhbmdlX2xpc3QgKnJwID0gTlVMTCwgKipycHAgPSAmcnA7CiAgICBpbnQgICAgICAgICAgICAgc2l6ZSA9IDAsIHRha2VuID0gMTsKCiAgICBmcmVlX3JhbmdlcyhyZXRwKTsKCiAgICBuZXh0dHlwZSA9IGdldF90b2tlbihmcCwgbmV4dHRva2VuLCBNQVhUT0tFTik7CiAgICBpZiAobmV4dHR5cGUgPT0gU0laRSkgewogICAgICAgIHNpemUgPSAxOwogICAgICAgIHRha2VuID0gMDsKICAgICAgICBuZXh0dHlwZSA9IGdldF90b2tlbihmcCwgbmV4dHRva2VuLCBNQVhUT0tFTik7CiAgICAgICAgaWYgKG5leHR0eXBlICE9IExFRlRQQVJFTikKICAgICAgICAgICAgcHJpbnRfZXJyb3IoIkV4cGVjdGVkIFwiKFwiIGFmdGVyIFNJWkUiLCBuZXh0dG9rZW4sIG5leHR0eXBlKTsKICAgIH0KCiAgICBkbyB7CiAgICAgICAgaWYgKCF0YWtlbikKICAgICAgICAgICAgbmV4dHR5cGUgPSBnZXRfdG9rZW4oZnAsIG5leHR0b2tlbiwgTUFYVE9LRU4pOwogICAgICAgIGVsc2UKICAgICAgICAgICAgdGFrZW4gPSAwOwogICAgICAgIGhpZ2ggPSBsb3cgPSBzdHJ0b3VsKG5leHR0b2tlbiwgTlVMTCwgMTApOwogICAgICAgIG5leHR0eXBlID0gZ2V0X3Rva2VuKGZwLCBuZXh0dG9rZW4sIE1BWFRPS0VOKTsKICAgICAgICBpZiAobmV4dHR5cGUgPT0gUkFOR0UpIHsKICAgICAgICAgICAgbmV4dHR5cGUgPSBnZXRfdG9rZW4oZnAsIG5leHR0b2tlbiwgTUFYVE9LRU4pOwogICAgICAgICAgICBlcnJubyA9IDA7CiAgICAgICAgICAgIGhpZ2ggPSBzdHJ0b3VsKG5leHR0b2tlbiwgTlVMTCwgMTApOwogICAgICAgICAgICBpZiAoIGVycm5vID09IEVSQU5HRSApIHsKICAgICAgICAgICAgICAgIGlmIChuZXRzbm1wX2RzX2dldF9pbnQoTkVUU05NUF9EU19MSUJSQVJZX0lELCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTkVUU05NUF9EU19MSUJfTUlCX1dBUk5JTkdTKSkKICAgICAgICAgICAgICAgICAgICBzbm1wX2xvZyhMT0dfV0FSTklORywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiV2FybmluZzogVXBwZXIgYm91bmQgbm90IGhhbmRsZWQgY29ycmVjdGx5ICglcyAhPSAlZCk6IEF0IGxpbmUgJWQgaW4gJXNcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5leHR0b2tlbiwgaGlnaCwgbWliTGluZSwgRmlsZSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgbmV4dHR5cGUgPSBnZXRfdG9rZW4oZnAsIG5leHR0b2tlbiwgTUFYVE9LRU4pOwogICAgICAgIH0KICAgICAgICAqcnBwID0gKHN0cnVjdCByYW5nZV9saXN0ICopIGNhbGxvYygxLCBzaXplb2Yoc3RydWN0IHJhbmdlX2xpc3QpKTsKICAgICAgICBpZiAoKnJwcCA9PSBOVUxMKQogICAgICAgICAgICBicmVhazsKICAgICAgICAoKnJwcCktPmxvdyA9IGxvdzsKICAgICAgICAoKnJwcCktPmhpZ2ggPSBoaWdoOwogICAgICAgIHJwcCA9ICYoKnJwcCktPm5leHQ7CgogICAgfSB3aGlsZSAobmV4dHR5cGUgPT0gQkFSKTsKICAgIGlmIChzaXplKSB7CiAgICAgICAgaWYgKG5leHR0eXBlICE9IFJJR0hUUEFSRU4pCiAgICAgICAgICAgIHByaW50X2Vycm9yKCJFeHBlY3RlZCBcIilcIiBhZnRlciBTSVpFIiwgbmV4dHRva2VuLCBuZXh0dHlwZSk7CiAgICAgICAgbmV4dHR5cGUgPSBnZXRfdG9rZW4oZnAsIG5leHR0b2tlbiwgbmV4dHR5cGUpOwogICAgfQogICAgaWYgKG5leHR0eXBlICE9IFJJR0hUUEFSRU4pCiAgICAgICAgcHJpbnRfZXJyb3IoIkV4cGVjdGVkIFwiKVwiIiwgbmV4dHRva2VuLCBuZXh0dHlwZSk7CgogICAgKnJldHAgPSBycDsKICAgIHJldHVybiBycDsKfQoKLyoKICogUGFyc2VzIGFuIGFzbiB0eXBlLiAgU3RydWN0dXJlcyBhcmUgaWdub3JlZCBieSB0aGlzIHBhcnNlci4KICogUmV0dXJucyBOVUxMIG9uIGVycm9yLgogKi8Kc3RhdGljIHN0cnVjdCBub2RlICoKcGFyc2VfYXNudHlwZShGSUxFICogZnAsIGNoYXIgKm5hbWUsIGludCAqbnR5cGUsIGNoYXIgKm50b2tlbikKewogICAgaW50ICAgICAgICAgICAgIHR5cGUsIGk7CiAgICBjaGFyICAgICAgICAgICAgdG9rZW5bTUFYVE9LRU5dOwogICAgY2hhciAgICAgICAgICAgIHF1b3RlZF9zdHJpbmdfYnVmZmVyW01BWFFVT1RFU1RSXTsKICAgIGNoYXIgICAgICAgICAgICpoaW50ID0gTlVMTDsKICAgIGNoYXIgICAgICAgICAgICpkZXNjciA9IE5VTEw7CiAgICBzdHJ1Y3QgdGMgICAgICAqdGNwOwogICAgaW50ICAgICAgICAgICAgIGxldmVsOwoKICAgIHR5cGUgPSBnZXRfdG9rZW4oZnAsIHRva2VuLCBNQVhUT0tFTik7CiAgICBpZiAodHlwZSA9PSBTRVFVRU5DRSB8fCB0eXBlID09IENIT0lDRSkgewogICAgICAgIGxldmVsID0gMDsKICAgICAgICB3aGlsZSAoKHR5cGUgPSBnZXRfdG9rZW4oZnAsIHRva2VuLCBNQVhUT0tFTikpICE9IEVORE9GRklMRSkgewogICAgICAgICAgICBpZiAodHlwZSA9PSBMRUZUQlJBQ0tFVCkgewogICAgICAgICAgICAgICAgbGV2ZWwrKzsKICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlID09IFJJR0hUQlJBQ0tFVCAmJiAtLWxldmVsID09IDApIHsKICAgICAgICAgICAgICAgICpudHlwZSA9IGdldF90b2tlbihmcCwgbnRva2VuLCBNQVhUT0tFTik7CiAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBwcmludF9lcnJvcigiRXhwZWN0ZWQgXCJ9XCIiLCB0b2tlbiwgdHlwZSk7CiAgICAgICAgcmV0dXJuIE5VTEw7CiAgICB9IGVsc2UgaWYgKHR5cGUgPT0gTEVGVEJSQUNLRVQpIHsKICAgICAgICBzdHJ1Y3Qgbm9kZSAgICAqbnA7CiAgICAgICAgaW50ICAgICAgICAgICAgIGNoX25leHQgPSAneyc7CiAgICAgICAgdW5nZXRjKGNoX25leHQsIGZwKTsKICAgICAgICBucCA9IHBhcnNlX29iamVjdGlkKGZwLCBuYW1lKTsKICAgICAgICBpZiAobnAgIT0gTlVMTCkgewogICAgICAgICAgICAqbnR5cGUgPSBnZXRfdG9rZW4oZnAsIG50b2tlbiwgTUFYVE9LRU4pOwogICAgICAgICAgICByZXR1cm4gbnA7CiAgICAgICAgfQogICAgICAgIHJldHVybiBOVUxMOwogICAgfSBlbHNlIGlmICh0eXBlID09IExFRlRTUUJSQUNLKSB7CiAgICAgICAgaW50ICAgICAgICAgICAgIHNpemUgPSAwOwogICAgICAgIGRvIHsKICAgICAgICAgICAgdHlwZSA9IGdldF90b2tlbihmcCwgdG9rZW4sIE1BWFRPS0VOKTsKICAgICAgICB9IHdoaWxlICh0eXBlICE9IEVORE9GRklMRSAmJiB0eXBlICE9IFJJR0hUU1FCUkFDSyk7CiAgICAgICAgaWYgKHR5cGUgIT0gUklHSFRTUUJSQUNLKSB7CiAgICAgICAgICAgIHByaW50X2Vycm9yKCJFeHBlY3RlZCBcIl1cIiIsIHRva2VuLCB0eXBlKTsKICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgfQogICAgICAgIHR5cGUgPSBnZXRfdG9rZW4oZnAsIHRva2VuLCBNQVhUT0tFTik7CiAgICAgICAgaWYgKHR5cGUgPT0gSU1QTElDSVQpCiAgICAgICAgICAgIHR5cGUgPSBnZXRfdG9rZW4oZnAsIHRva2VuLCBNQVhUT0tFTik7CiAgICAgICAgKm50eXBlID0gZ2V0X3Rva2VuKGZwLCBudG9rZW4sIE1BWFRPS0VOKTsKICAgICAgICBpZiAoKm50eXBlID09IExFRlRQQVJFTikgewogICAgICAgICAgICBzd2l0Y2ggKHR5cGUpIHsKICAgICAgICAgICAgY2FzZSBPQ1RFVFNUUjoKICAgICAgICAgICAgICAgICpudHlwZSA9IGdldF90b2tlbihmcCwgbnRva2VuLCBNQVhUT0tFTik7CiAgICAgICAgICAgICAgICBpZiAoKm50eXBlICE9IFNJWkUpIHsKICAgICAgICAgICAgICAgICAgICBwcmludF9lcnJvcigiRXhwZWN0ZWQgU0laRSIsIG50b2tlbiwgKm50eXBlKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHNpemUgPSAxOwogICAgICAgICAgICAgICAgKm50eXBlID0gZ2V0X3Rva2VuKGZwLCBudG9rZW4sIE1BWFRPS0VOKTsKICAgICAgICAgICAgICAgIGlmICgqbnR5cGUgIT0gTEVGVFBBUkVOKSB7CiAgICAgICAgICAgICAgICAgICAgcHJpbnRfZXJyb3IoIkV4cGVjdGVkIFwiKFwiIGFmdGVyIFNJWkUiLCBudG9rZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm50eXBlKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgICAgKiBmYWxsIHRocm91Z2ggCiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgY2FzZSBJTlRFR0VSOgogICAgICAgICAgICAgICAgKm50eXBlID0gZ2V0X3Rva2VuKGZwLCBudG9rZW4sIE1BWFRPS0VOKTsKICAgICAgICAgICAgICAgIGRvIHsKICAgICAgICAgICAgICAgICAgICBpZiAoKm50eXBlICE9IE5VTUJFUikKICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRfZXJyb3IoIkV4cGVjdGVkIE5VTUJFUiIsIG50b2tlbiwgKm50eXBlKTsKICAgICAgICAgICAgICAgICAgICAqbnR5cGUgPSBnZXRfdG9rZW4oZnAsIG50b2tlbiwgTUFYVE9LRU4pOwogICAgICAgICAgICAgICAgICAgIGlmICgqbnR5cGUgPT0gUkFOR0UpIHsKICAgICAgICAgICAgICAgICAgICAgICAgKm50eXBlID0gZ2V0X3Rva2VuKGZwLCBudG9rZW4sIE1BWFRPS0VOKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCpudHlwZSAhPSBOVU1CRVIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludF9lcnJvcigiRXhwZWN0ZWQgTlVNQkVSIiwgbnRva2VuLCAqbnR5cGUpOwogICAgICAgICAgICAgICAgICAgICAgICAqbnR5cGUgPSBnZXRfdG9rZW4oZnAsIG50b2tlbiwgTUFYVE9LRU4pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0gd2hpbGUgKCpudHlwZSA9PSBCQVIpOwogICAgICAgICAgICAgICAgaWYgKCpudHlwZSAhPSBSSUdIVFBBUkVOKSB7CiAgICAgICAgICAgICAgICAgICAgcHJpbnRfZXJyb3IoIkV4cGVjdGVkIFwiKVwiIiwgbnRva2VuLCAqbnR5cGUpOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKm50eXBlID0gZ2V0X3Rva2VuKGZwLCBudG9rZW4sIE1BWFRPS0VOKTsKICAgICAgICAgICAgICAgIGlmIChzaXplKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCpudHlwZSAhPSBSSUdIVFBBUkVOKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHByaW50X2Vycm9yKCJFeHBlY3RlZCBcIilcIiB0byB0ZXJtaW5hdGUgU0laRSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG50b2tlbiwgKm50eXBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICpudHlwZSA9IGdldF90b2tlbihmcCwgbnRva2VuLCBNQVhUT0tFTik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIE5VTEw7CiAgICB9IGVsc2UgewogICAgICAgIGlmICh0eXBlID09IENPTlZFTlRJT04pIHsKICAgICAgICAgICAgd2hpbGUgKHR5cGUgIT0gU1lOVEFYICYmIHR5cGUgIT0gRU5ET0ZGSUxFKSB7CiAgICAgICAgICAgICAgICBpZiAodHlwZSA9PSBESVNQTEFZSElOVCkgewogICAgICAgICAgICAgICAgICAgIHR5cGUgPSBnZXRfdG9rZW4oZnAsIHRva2VuLCBNQVhUT0tFTik7CiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGUgIT0gUVVPVEVTVFJJTkcpCiAgICAgICAgICAgICAgICAgICAgICAgIHByaW50X2Vycm9yKCJESVNQTEFZLUhJTlQgbXVzdCBiZSBzdHJpbmciLCB0b2tlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSk7CiAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICBoaW50ID0gc3RyZHVwKHRva2VuKTsKICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZSA9PSBERVNDUklQVElPTiAmJgogICAgICAgICAgICAgICAgICAgICAgICAgICBuZXRzbm1wX2RzX2dldF9ib29sZWFuKE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTkVUU05NUF9EU19MSUJfU0FWRV9NSUJfREVTQ1JTKSkgewogICAgICAgICAgICAgICAgICAgIHR5cGUgPSBnZXRfdG9rZW4oZnAsIHF1b3RlZF9zdHJpbmdfYnVmZmVyLCBNQVhRVU9URVNUUik7CiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGUgIT0gUVVPVEVTVFJJTkcpCiAgICAgICAgICAgICAgICAgICAgICAgIHByaW50X2Vycm9yKCJERVNDUklQVElPTiBtdXN0IGJlIHN0cmluZyIsIHRva2VuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlKTsKICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyID0gc3RyZHVwKHF1b3RlZF9zdHJpbmdfYnVmZmVyKTsKICAgICAgICAgICAgICAgIH0gZWxzZQogICAgICAgICAgICAgICAgICAgIHR5cGUgPQogICAgICAgICAgICAgICAgICAgICAgICBnZXRfdG9rZW4oZnAsIHF1b3RlZF9zdHJpbmdfYnVmZmVyLCBNQVhRVU9URVNUUik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdHlwZSA9IGdldF90b2tlbihmcCwgdG9rZW4sIE1BWFRPS0VOKTsKICAgICAgICAgICAgaWYgKHR5cGUgPT0gT0JKRUNUKSB7CiAgICAgICAgICAgICAgICB0eXBlID0gZ2V0X3Rva2VuKGZwLCB0b2tlbiwgTUFYVE9LRU4pOwogICAgICAgICAgICAgICAgaWYgKHR5cGUgIT0gSURFTlRJRklFUikgewogICAgICAgICAgICAgICAgICAgIHByaW50X2Vycm9yKCJFeHBlY3RlZCBJREVOVElGSUVSIiwgdG9rZW4sIHR5cGUpOwogICAgICAgICAgICAgICAgICAgIFNOTVBfRlJFRShoaW50KTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHR5cGUgPSBPQkpJRDsKICAgICAgICAgICAgfQogICAgICAgIH0gZWxzZSBpZiAodHlwZSA9PSBPQkpFQ1QpIHsKICAgICAgICAgICAgdHlwZSA9IGdldF90b2tlbihmcCwgdG9rZW4sIE1BWFRPS0VOKTsKICAgICAgICAgICAgaWYgKHR5cGUgIT0gSURFTlRJRklFUikgewogICAgICAgICAgICAgICAgcHJpbnRfZXJyb3IoIkV4cGVjdGVkIElERU5USUZJRVIiLCB0b2tlbiwgdHlwZSk7CiAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICAgICAgfQogICAgICAgICAgICB0eXBlID0gT0JKSUQ7CiAgICAgICAgfQoKICAgICAgICBpZiAodHlwZSA9PSBMQUJFTCkgewogICAgICAgICAgICB0eXBlID0gZ2V0X3RjKHRva2VuLCBjdXJyZW50X21vZHVsZSwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCk7CiAgICAgICAgfQoKICAgICAgICAvKgogICAgICAgICAqIHRleHR1YWwgY29udmVudGlvbiAKICAgICAgICAgKi8KICAgICAgICBmb3IgKGkgPSAwOyBpIDwgTUFYVEM7IGkrKykgewogICAgICAgICAgICBpZiAodGNsaXN0W2ldLnR5cGUgPT0gMCkKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KCiAgICAgICAgaWYgKGkgPT0gTUFYVEMpIHsKICAgICAgICAgICAgcHJpbnRfZXJyb3IoIlRvbyBtYW55IHRleHR1YWwgY29udmVudGlvbnMiLCB0b2tlbiwgdHlwZSk7CiAgICAgICAgICAgIFNOTVBfRlJFRShoaW50KTsKICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgfQogICAgICAgIGlmICghKHR5cGUgJiBTWU5UQVhfTUFTSykpIHsKICAgICAgICAgICAgcHJpbnRfZXJyb3IoIlRleHR1YWwgY29udmVudGlvbiBkb2Vzbid0IG1hcCB0byByZWFsIHR5cGUiLAogICAgICAgICAgICAgICAgICAgICAgICB0b2tlbiwgdHlwZSk7CiAgICAgICAgICAgIFNOTVBfRlJFRShoaW50KTsKICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgfQogICAgICAgIHRjcCA9ICZ0Y2xpc3RbaV07CiAgICAgICAgdGNwLT5tb2RpZCA9IGN1cnJlbnRfbW9kdWxlOwogICAgICAgIHRjcC0+ZGVzY3JpcHRvciA9IHN0cmR1cChuYW1lKTsKICAgICAgICB0Y3AtPmhpbnQgPSBoaW50OwogICAgICAgIHRjcC0+ZGVzY3JpcHRpb24gPSBkZXNjcjsKICAgICAgICB0Y3AtPnR5cGUgPSB0eXBlOwogICAgICAgICpudHlwZSA9IGdldF90b2tlbihmcCwgbnRva2VuLCBNQVhUT0tFTik7CiAgICAgICAgaWYgKCpudHlwZSA9PSBMRUZUUEFSRU4pIHsKICAgICAgICAgICAgdGNwLT5yYW5nZXMgPSBwYXJzZV9yYW5nZXMoZnAsICZ0Y3AtPnJhbmdlcyk7CiAgICAgICAgICAgICpudHlwZSA9IGdldF90b2tlbihmcCwgbnRva2VuLCBNQVhUT0tFTik7CiAgICAgICAgfSBlbHNlIGlmICgqbnR5cGUgPT0gTEVGVEJSQUNLRVQpIHsKICAgICAgICAgICAgLyoKICAgICAgICAgICAgICogaWYgdGhlcmUgaXMgYW4gZW51bWVyYXRpb24gbGlzdCwgcGFyc2UgaXQgCiAgICAgICAgICAgICAqLwogICAgICAgICAgICB0Y3AtPmVudW1zID0gcGFyc2VfZW51bWxpc3QoZnAsICZ0Y3AtPmVudW1zKTsKICAgICAgICAgICAgKm50eXBlID0gZ2V0X3Rva2VuKGZwLCBudG9rZW4sIE1BWFRPS0VOKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIE5VTEw7CiAgICB9Cn0KCgovKgogKiBQYXJzZXMgYW4gT0JKRUNUIFRZUEUgbWFjcm8uCiAqIFJldHVybnMgMCBvbiBlcnJvci4KICovCnN0YXRpYyBzdHJ1Y3Qgbm9kZSAqCnBhcnNlX29iamVjdHR5cGUoRklMRSAqIGZwLCBjaGFyICpuYW1lKQp7CiAgICByZWdpc3RlciBpbnQgICAgdHlwZTsKICAgIGNoYXIgICAgICAgICAgICB0b2tlbltNQVhUT0tFTl07CiAgICBjaGFyICAgICAgICAgICAgbmV4dHRva2VuW01BWFRPS0VOXTsKICAgIGNoYXIgICAgICAgICAgICBxdW90ZWRfc3RyaW5nX2J1ZmZlcltNQVhRVU9URVNUUl07CiAgICBpbnQgICAgICAgICAgICAgbmV4dHR5cGUsIHRjdHlwZTsKICAgIHJlZ2lzdGVyIHN0cnVjdCBub2RlICpucDsKCiAgICB0eXBlID0gZ2V0X3Rva2VuKGZwLCB0b2tlbiwgTUFYVE9LRU4pOwogICAgaWYgKHR5cGUgIT0gU1lOVEFYKSB7CiAgICAgICAgcHJpbnRfZXJyb3IoIkJhZCBmb3JtYXQgZm9yIE9CSkVDVC1UWVBFIiwgdG9rZW4sIHR5cGUpOwogICAgICAgIHJldHVybiBOVUxMOwogICAgfQogICAgbnAgPSBhbGxvY19ub2RlKGN1cnJlbnRfbW9kdWxlKTsKICAgIGlmIChucCA9PSBOVUxMKQogICAgICAgIHJldHVybiAoTlVMTCk7CiAgICB0eXBlID0gZ2V0X3Rva2VuKGZwLCB0b2tlbiwgTUFYVE9LRU4pOwogICAgaWYgKHR5cGUgPT0gT0JKRUNUKSB7CiAgICAgICAgdHlwZSA9IGdldF90b2tlbihmcCwgdG9rZW4sIE1BWFRPS0VOKTsKICAgICAgICBpZiAodHlwZSAhPSBJREVOVElGSUVSKSB7CiAgICAgICAgICAgIHByaW50X2Vycm9yKCJFeHBlY3RlZCBJREVOVElGSUVSIiwgdG9rZW4sIHR5cGUpOwogICAgICAgICAgICBmcmVlX25vZGUobnApOwogICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICB9CiAgICAgICAgdHlwZSA9IE9CSklEOwogICAgfQogICAgaWYgKHR5cGUgPT0gTEFCRUwpIHsKICAgICAgICBpbnQgICAgICAgICAgICAgdG1wX2luZGV4OwogICAgICAgIHRjdHlwZSA9IGdldF90Yyh0b2tlbiwgY3VycmVudF9tb2R1bGUsICZ0bXBfaW5kZXgsCiAgICAgICAgICAgICAgICAgICAgICAgICZucC0+ZW51bXMsICZucC0+cmFuZ2VzLCAmbnAtPmhpbnQpOwogICAgICAgIGlmICh0Y3R5cGUgPT0gTEFCRUwgJiYKICAgICAgICAgICAgbmV0c25tcF9kc19nZXRfaW50KE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgCgkJCSAgICAgICBORVRTTk1QX0RTX0xJQl9NSUJfV0FSTklOR1MpID4gMSkgewogICAgICAgICAgICBwcmludF9lcnJvcigiV2FybmluZzogTm8ga25vd24gdHJhbnNsYXRpb24gZm9yIHR5cGUiLCB0b2tlbiwKICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSk7CiAgICAgICAgfQogICAgICAgIHR5cGUgPSB0Y3R5cGU7CiAgICAgICAgbnAtPnRjX2luZGV4ID0gdG1wX2luZGV4OyAgICAgICAvKiBzdG9yZSBUQyBmb3IgbGF0ZXIgcmVmZXJlbmNlICovCiAgICB9CiAgICBucC0+dHlwZSA9IHR5cGU7CiAgICBuZXh0dHlwZSA9IGdldF90b2tlbihmcCwgbmV4dHRva2VuLCBNQVhUT0tFTik7CiAgICBzd2l0Y2ggKHR5cGUpIHsKICAgIGNhc2UgU0VRVUVOQ0U6CiAgICAgICAgaWYgKG5leHR0eXBlID09IE9GKSB7CiAgICAgICAgICAgIG5leHR0eXBlID0gZ2V0X3Rva2VuKGZwLCBuZXh0dG9rZW4sIE1BWFRPS0VOKTsKICAgICAgICAgICAgbmV4dHR5cGUgPSBnZXRfdG9rZW4oZnAsIG5leHR0b2tlbiwgTUFYVE9LRU4pOwoKICAgICAgICB9CiAgICAgICAgYnJlYWs7CiAgICBjYXNlIElOVEVHRVI6CiAgICBjYXNlIElOVEVHRVIzMjoKICAgIGNhc2UgVUlOVEVHRVIzMjoKICAgIGNhc2UgVU5TSUdORUQzMjoKICAgIGNhc2UgQ09VTlRFUjoKICAgIGNhc2UgR0FVR0U6CiAgICBjYXNlIEJJVFNUUklORzoKICAgIGNhc2UgTEFCRUw6CiAgICAgICAgaWYgKG5leHR0eXBlID09IExFRlRCUkFDS0VUKSB7CiAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAqIGlmIHRoZXJlIGlzIGFuIGVudW1lcmF0aW9uIGxpc3QsIHBhcnNlIGl0IAogICAgICAgICAgICAgKi8KICAgICAgICAgICAgbnAtPmVudW1zID0gcGFyc2VfZW51bWxpc3QoZnAsICZucC0+ZW51bXMpOwogICAgICAgICAgICBuZXh0dHlwZSA9IGdldF90b2tlbihmcCwgbmV4dHRva2VuLCBNQVhUT0tFTik7CiAgICAgICAgfSBlbHNlIGlmIChuZXh0dHlwZSA9PSBMRUZUUEFSRU4pIHsKICAgICAgICAgICAgLyoKICAgICAgICAgICAgICogaWYgdGhlcmUgaXMgYSByYW5nZSBsaXN0LCBwYXJzZSBpdCAKICAgICAgICAgICAgICovCiAgICAgICAgICAgIG5wLT5yYW5nZXMgPSBwYXJzZV9yYW5nZXMoZnAsICZucC0+cmFuZ2VzKTsKICAgICAgICAgICAgbmV4dHR5cGUgPSBnZXRfdG9rZW4oZnAsIG5leHR0b2tlbiwgTUFYVE9LRU4pOwogICAgICAgIH0KICAgICAgICBicmVhazsKICAgIGNhc2UgT0NURVRTVFI6CiAgICBjYXNlIEtXX09QQVFVRToKICAgICAgICAvKgogICAgICAgICAqIHBhcnNlIGFueSBTSVpFIHNwZWNpZmljYXRpb24gCiAgICAgICAgICovCiAgICAgICAgaWYgKG5leHR0eXBlID09IExFRlRQQVJFTikgewogICAgICAgICAgICBuZXh0dHlwZSA9IGdldF90b2tlbihmcCwgbmV4dHRva2VuLCBNQVhUT0tFTik7CiAgICAgICAgICAgIGlmIChuZXh0dHlwZSA9PSBTSVpFKSB7CiAgICAgICAgICAgICAgICBuZXh0dHlwZSA9IGdldF90b2tlbihmcCwgbmV4dHRva2VuLCBNQVhUT0tFTik7CiAgICAgICAgICAgICAgICBpZiAobmV4dHR5cGUgPT0gTEVGVFBBUkVOKSB7CiAgICAgICAgICAgICAgICAgICAgbnAtPnJhbmdlcyA9IHBhcnNlX3JhbmdlcyhmcCwgJm5wLT5yYW5nZXMpOwogICAgICAgICAgICAgICAgICAgIG5leHR0eXBlID0gZ2V0X3Rva2VuKGZwLCBuZXh0dG9rZW4sIE1BWFRPS0VOKTsgICAgICAvKiApICovCiAgICAgICAgICAgICAgICAgICAgaWYgKG5leHR0eXBlID09IFJJR0hUUEFSRU4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgbmV4dHR5cGUgPSBnZXRfdG9rZW4oZnAsIG5leHR0b2tlbiwgTUFYVE9LRU4pOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcHJpbnRfZXJyb3IoIkJhZCBTSVpFIHN5bnRheCIsIHRva2VuLCB0eXBlKTsKICAgICAgICAgICAgZnJlZV9ub2RlKG5wKTsKICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgfQogICAgICAgIGJyZWFrOwogICAgY2FzZSBPQkpJRDoKICAgIGNhc2UgTkVUQUREUjoKICAgIGNhc2UgSVBBRERSOgogICAgY2FzZSBUSU1FVElDS1M6CiAgICBjYXNlIE5VTDoKICAgIGNhc2UgTlNBUEFERFJFU1M6CiAgICBjYXNlIENPVU5URVI2NDoKICAgICAgICBicmVhazsKICAgIGRlZmF1bHQ6CiAgICAgICAgcHJpbnRfZXJyb3IoIkJhZCBzeW50YXgiLCB0b2tlbiwgdHlwZSk7CiAgICAgICAgZnJlZV9ub2RlKG5wKTsKICAgICAgICByZXR1cm4gTlVMTDsKICAgIH0KICAgIGlmIChuZXh0dHlwZSA9PSBVTklUUykgewogICAgICAgIHR5cGUgPSBnZXRfdG9rZW4oZnAsIHF1b3RlZF9zdHJpbmdfYnVmZmVyLCBNQVhRVU9URVNUUik7CiAgICAgICAgaWYgKHR5cGUgIT0gUVVPVEVTVFJJTkcpIHsKICAgICAgICAgICAgcHJpbnRfZXJyb3IoIkJhZCBVTklUUyIsIHF1b3RlZF9zdHJpbmdfYnVmZmVyLCB0eXBlKTsKICAgICAgICAgICAgZnJlZV9ub2RlKG5wKTsKICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgfQogICAgICAgIG5wLT51bml0cyA9IHN0cmR1cChxdW90ZWRfc3RyaW5nX2J1ZmZlcik7CiAgICAgICAgbmV4dHR5cGUgPSBnZXRfdG9rZW4oZnAsIG5leHR0b2tlbiwgTUFYVE9LRU4pOwogICAgfQogICAgaWYgKG5leHR0eXBlICE9IEFDQ0VTUykgewogICAgICAgIHByaW50X2Vycm9yKCJTaG91bGQgYmUgQUNDRVNTIiwgbmV4dHRva2VuLCBuZXh0dHlwZSk7CiAgICAgICAgZnJlZV9ub2RlKG5wKTsKICAgICAgICByZXR1cm4gTlVMTDsKICAgIH0KICAgIHR5cGUgPSBnZXRfdG9rZW4oZnAsIHRva2VuLCBNQVhUT0tFTik7CiAgICBpZiAodHlwZSAhPSBSRUFET05MWSAmJiB0eXBlICE9IFJFQURXUklURSAmJiB0eXBlICE9IFdSSVRFT05MWQogICAgICAgICYmIHR5cGUgIT0gTk9BQ0NFU1MgJiYgdHlwZSAhPSBSRUFEQ1JFQVRFICYmIHR5cGUgIT0gQUNDTk9USUZZKSB7CiAgICAgICAgcHJpbnRfZXJyb3IoIkJhZCBBQ0NFU1MgdHlwZSIsIHRva2VuLCB0eXBlKTsKICAgICAgICBmcmVlX25vZGUobnApOwogICAgICAgIHJldHVybiBOVUxMOwogICAgfQogICAgbnAtPmFjY2VzcyA9IHR5cGU7CiAgICB0eXBlID0gZ2V0X3Rva2VuKGZwLCB0b2tlbiwgTUFYVE9LRU4pOwogICAgaWYgKHR5cGUgIT0gU1RBVFVTKSB7CiAgICAgICAgcHJpbnRfZXJyb3IoIlNob3VsZCBiZSBTVEFUVVMiLCB0b2tlbiwgdHlwZSk7CiAgICAgICAgZnJlZV9ub2RlKG5wKTsKICAgICAgICByZXR1cm4gTlVMTDsKICAgIH0KICAgIHR5cGUgPSBnZXRfdG9rZW4oZnAsIHRva2VuLCBNQVhUT0tFTik7CiAgICBpZiAodHlwZSAhPSBNQU5EQVRPUlkgJiYgdHlwZSAhPSBDVVJSRU5UICYmIHR5cGUgIT0gS1dfT1BUSU9OQUwgJiYKICAgICAgICB0eXBlICE9IE9CU09MRVRFICYmIHR5cGUgIT0gREVQUkVDQVRFRCkgewogICAgICAgIHByaW50X2Vycm9yKCJCYWQgU1RBVFVTIiwgdG9rZW4sIHR5cGUpOwogICAgICAgIGZyZWVfbm9kZShucCk7CiAgICAgICAgcmV0dXJuIE5VTEw7CiAgICB9CiAgICBucC0+c3RhdHVzID0gdHlwZTsKICAgIC8qCiAgICAgKiBPcHRpb25hbCBwYXJ0cyBvZiB0aGUgT0JKRUNULVRZUEUgbWFjcm8KICAgICAqLwogICAgdHlwZSA9IGdldF90b2tlbihmcCwgdG9rZW4sIE1BWFRPS0VOKTsKICAgIHdoaWxlICh0eXBlICE9IEVRVUFMUyAmJiB0eXBlICE9IEVORE9GRklMRSkgewogICAgICAgIHN3aXRjaCAodHlwZSkgewogICAgICAgIGNhc2UgREVTQ1JJUFRJT046CiAgICAgICAgICAgIHR5cGUgPSBnZXRfdG9rZW4oZnAsIHF1b3RlZF9zdHJpbmdfYnVmZmVyLCBNQVhRVU9URVNUUik7CgogICAgICAgICAgICBpZiAodHlwZSAhPSBRVU9URVNUUklORykgewogICAgICAgICAgICAgICAgcHJpbnRfZXJyb3IoIkJhZCBERVNDUklQVElPTiIsIHF1b3RlZF9zdHJpbmdfYnVmZmVyLCB0eXBlKTsKICAgICAgICAgICAgICAgIGZyZWVfbm9kZShucCk7CiAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAobmV0c25tcF9kc19nZXRfYm9vbGVhbihORVRTTk1QX0RTX0xJQlJBUllfSUQsIAoJCQkJICAgICAgIE5FVFNOTVBfRFNfTElCX1NBVkVfTUlCX0RFU0NSUykpIHsKICAgICAgICAgICAgICAgIG5wLT5kZXNjcmlwdGlvbiA9IHN0cmR1cChxdW90ZWRfc3RyaW5nX2J1ZmZlcik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYnJlYWs7CgogICAgICAgIGNhc2UgUkVGRVJFTkNFOgogICAgICAgICAgICB0eXBlID0gZ2V0X3Rva2VuKGZwLCBxdW90ZWRfc3RyaW5nX2J1ZmZlciwgTUFYUVVPVEVTVFIpOwogICAgICAgICAgICBpZiAodHlwZSAhPSBRVU9URVNUUklORykgewogICAgICAgICAgICAgICAgcHJpbnRfZXJyb3IoIkJhZCBSRUZFUkVOQ0UiLCBxdW90ZWRfc3RyaW5nX2J1ZmZlciwgdHlwZSk7CiAgICAgICAgICAgICAgICBmcmVlX25vZGUobnApOwogICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgbnAtPnJlZmVyZW5jZSA9IHN0cmR1cChxdW90ZWRfc3RyaW5nX2J1ZmZlcik7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgSU5ERVg6CiAgICAgICAgICAgIGlmIChucC0+YXVnbWVudHMpIHsKICAgICAgICAgICAgICAgIHByaW50X2Vycm9yKCJDYW5ub3QgaGF2ZSBib3RoIElOREVYIGFuZCBBVUdNRU5UUyIsIHRva2VuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSk7CiAgICAgICAgICAgICAgICBmcmVlX25vZGUobnApOwogICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgbnAtPmluZGV4ZXMgPSBnZXRJbmRleGVzKGZwLCAmbnAtPmluZGV4ZXMpOwogICAgICAgICAgICBpZiAobnAtPmluZGV4ZXMgPT0gTlVMTCkgewogICAgICAgICAgICAgICAgcHJpbnRfZXJyb3IoIkJhZCBJTkRFWCBsaXN0IiwgdG9rZW4sIHR5cGUpOwogICAgICAgICAgICAgICAgZnJlZV9ub2RlKG5wKTsKICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgQVVHTUVOVFM6CiAgICAgICAgICAgIGlmIChucC0+aW5kZXhlcykgewogICAgICAgICAgICAgICAgcHJpbnRfZXJyb3IoIkNhbm5vdCBoYXZlIGJvdGggSU5ERVggYW5kIEFVR01FTlRTIiwgdG9rZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlKTsKICAgICAgICAgICAgICAgIGZyZWVfbm9kZShucCk7CiAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICAgICAgfQogICAgICAgICAgICBucC0+aW5kZXhlcyA9IGdldEluZGV4ZXMoZnAsICZucC0+aW5kZXhlcyk7CiAgICAgICAgICAgIGlmIChucC0+aW5kZXhlcyA9PSBOVUxMKSB7CiAgICAgICAgICAgICAgICBwcmludF9lcnJvcigiQmFkIEFVR01FTlRTIGxpc3QiLCB0b2tlbiwgdHlwZSk7CiAgICAgICAgICAgICAgICBmcmVlX25vZGUobnApOwogICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgbnAtPmF1Z21lbnRzID0gc3RyZHVwKG5wLT5pbmRleGVzLT5pbGFiZWwpOwogICAgICAgICAgICBmcmVlX2luZGV4ZXMoJm5wLT5pbmRleGVzKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBERUZWQUw6CiAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAqIE1hcmsncyBkZWZWYWwgc2VjdGlvbiAKICAgICAgICAgICAgICovCiAgICAgICAgICAgIHR5cGUgPSBnZXRfdG9rZW4oZnAsIHF1b3RlZF9zdHJpbmdfYnVmZmVyLCBNQVhUT0tFTik7CiAgICAgICAgICAgIGlmICh0eXBlICE9IExFRlRCUkFDS0VUKSB7CiAgICAgICAgICAgICAgICBwcmludF9lcnJvcigiQmFkIERFRkFVTFRWQUxVRSIsIHF1b3RlZF9zdHJpbmdfYnVmZmVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSk7CiAgICAgICAgICAgICAgICBmcmVlX25vZGUobnApOwogICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICBsZXZlbCA9IDE7CiAgICAgICAgICAgICAgICBjaGFyICAgICAgICAgICAgZGVmYnVmWzUxMl07CgogICAgICAgICAgICAgICAgZGVmYnVmWzBdID0gMDsKICAgICAgICAgICAgICAgIHdoaWxlICgxKSB7CiAgICAgICAgICAgICAgICAgICAgdHlwZSA9IGdldF90b2tlbihmcCwgcXVvdGVkX3N0cmluZ19idWZmZXIsIE1BWFRPS0VOKTsKICAgICAgICAgICAgICAgICAgICBpZiAoKHR5cGUgPT0gUklHSFRCUkFDS0VUICYmIC0tbGV2ZWwgPT0gMCkKICAgICAgICAgICAgICAgICAgICAgICAgfHwgdHlwZSA9PSBFTkRPRkZJTEUpCiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHR5cGUgPT0gTEVGVEJSQUNLRVQpCiAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsKys7CiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGUgPT0gUVVPVEVTVFJJTkcpCiAgICAgICAgICAgICAgICAgICAgICAgIHN0cmxjYXQoZGVmYnVmLCAiXFxcIiIsIHNpemVvZihkZWZidWYpKTsKICAgICAgICAgICAgICAgICAgICBzdHJsY2F0KGRlZmJ1ZiwgcXVvdGVkX3N0cmluZ19idWZmZXIsIHNpemVvZihkZWZidWYpKTsKICAgICAgICAgICAgICAgICAgICBpZiAodHlwZSA9PSBRVU9URVNUUklORykKICAgICAgICAgICAgICAgICAgICAgICAgc3RybGNhdChkZWZidWYsICJcXFwiIiwgc2l6ZW9mKGRlZmJ1ZikpOwogICAgICAgICAgICAgICAgICAgIHN0cmxjYXQoZGVmYnVmLCAiICIsIHNpemVvZihkZWZidWYpKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAodHlwZSAhPSBSSUdIVEJSQUNLRVQpIHsKICAgICAgICAgICAgICAgICAgICBwcmludF9lcnJvcigiQmFkIERFRkFVTFRWQUxVRSIsIHF1b3RlZF9zdHJpbmdfYnVmZmVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUpOwogICAgICAgICAgICAgICAgICAgIGZyZWVfbm9kZShucCk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgZGVmYnVmW3N0cmxlbihkZWZidWYpIC0gMV0gPSAwOwogICAgICAgICAgICAgICAgbnAtPmRlZmF1bHRWYWx1ZSA9IHN0cmR1cChkZWZidWYpOwogICAgICAgICAgICB9CgogICAgICAgICAgICBicmVhazsKCiAgICAgICAgY2FzZSBOVU1fRU5UUklFUzoKICAgICAgICAgICAgaWYgKHRvc3NPYmplY3RJZGVudGlmaWVyKGZwKSAhPSBPQkpJRCkgewogICAgICAgICAgICAgICAgcHJpbnRfZXJyb3IoIkJhZCBPYmplY3QgSWRlbnRpZmllciIsIHRva2VuLCB0eXBlKTsKICAgICAgICAgICAgICAgIGZyZWVfbm9kZShucCk7CiAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICAgICAgfQogICAgICAgICAgICBicmVhazsKCiAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgcHJpbnRfZXJyb3IoIkJhZCBmb3JtYXQgb2Ygb3B0aW9uYWwgY2xhdXNlcyIsIHRva2VuLCB0eXBlKTsKICAgICAgICAgICAgZnJlZV9ub2RlKG5wKTsKICAgICAgICAgICAgcmV0dXJuIE5VTEw7CgogICAgICAgIH0KICAgICAgICB0eXBlID0gZ2V0X3Rva2VuKGZwLCB0b2tlbiwgTUFYVE9LRU4pOwogICAgfQogICAgaWYgKHR5cGUgIT0gRVFVQUxTKSB7CiAgICAgICAgcHJpbnRfZXJyb3IoIkJhZCBmb3JtYXQiLCB0b2tlbiwgdHlwZSk7CiAgICAgICAgZnJlZV9ub2RlKG5wKTsKICAgICAgICByZXR1cm4gTlVMTDsKICAgIH0KICAgIHJldHVybiBtZXJnZV9wYXJzZV9vYmplY3RpZChucCwgZnAsIG5hbWUpOwp9CgovKgogKiBQYXJzZXMgYW4gT0JKRUNUIEdST1VQIG1hY3JvLgogKiBSZXR1cm5zIDAgb24gZXJyb3IuCiAqCiAqIEFsc28gcGFyc2VzIG9iamVjdC1pZGVudGl0eSwgc2luY2UgdGhleSBhcmUgc2ltaWxhciAoaWdub3JlIFNUQVRVUykuCiAqICAgLSBXSkggMTAvOTYKICovCnN0YXRpYyBzdHJ1Y3Qgbm9kZSAqCnBhcnNlX29iamVjdGdyb3VwKEZJTEUgKiBmcCwgY2hhciAqbmFtZSwgaW50IHdoYXQsIHN0cnVjdCBvYmpncm91cCAqKm9sKQp7CiAgICBpbnQgICAgICAgICAgICAgdHlwZTsKICAgIGNoYXIgICAgICAgICAgICB0b2tlbltNQVhUT0tFTl07CiAgICBjaGFyICAgICAgICAgICAgcXVvdGVkX3N0cmluZ19idWZmZXJbTUFYUVVPVEVTVFJdOwogICAgc3RydWN0IG5vZGUgICAgKm5wOwoKICAgIG5wID0gYWxsb2Nfbm9kZShjdXJyZW50X21vZHVsZSk7CiAgICBpZiAobnAgPT0gTlVMTCkKICAgICAgICByZXR1cm4gKE5VTEwpOwogICAgdHlwZSA9IGdldF90b2tlbihmcCwgdG9rZW4sIE1BWFRPS0VOKTsKICAgIGlmICh0eXBlID09IHdoYXQpIHsKICAgICAgICB0eXBlID0gZ2V0X3Rva2VuKGZwLCB0b2tlbiwgTUFYVE9LRU4pOwogICAgICAgIGlmICh0eXBlICE9IExFRlRCUkFDS0VUKSB7CiAgICAgICAgICAgIHByaW50X2Vycm9yKCJFeHBlY3RlZCBcIntcIiIsIHRva2VuLCB0eXBlKTsKICAgICAgICAgICAgZ290byBza2lwOwogICAgICAgIH0KICAgICAgICBkbyB7CiAgICAgICAgICAgIHN0cnVjdCBvYmpncm91cCAqbzsKICAgICAgICAgICAgdHlwZSA9IGdldF90b2tlbihmcCwgdG9rZW4sIE1BWFRPS0VOKTsKICAgICAgICAgICAgaWYgKHR5cGUgIT0gTEFCRUwpIHsKICAgICAgICAgICAgICAgIHByaW50X2Vycm9yKCJCYWQgaWRlbnRpZmllciIsIHRva2VuLCB0eXBlKTsKICAgICAgICAgICAgICAgIGdvdG8gc2tpcDsKICAgICAgICAgICAgfQogICAgICAgICAgICBvID0gKHN0cnVjdCBvYmpncm91cCAqKSBtYWxsb2Moc2l6ZW9mKHN0cnVjdCBvYmpncm91cCkpOwogICAgICAgICAgICBpZiAoIW8pIHsKICAgICAgICAgICAgICAgIHByaW50X2Vycm9yKCJSZXNvdXJjZSBmYWlsdXJlIiwgdG9rZW4sIHR5cGUpOwogICAgICAgICAgICAgICAgZ290byBza2lwOwogICAgICAgICAgICB9CiAgICAgICAgICAgIG8tPmxpbmUgPSBtaWJMaW5lOwogICAgICAgICAgICBvLT5uYW1lID0gc3RyZHVwKHRva2VuKTsKICAgICAgICAgICAgby0+bmV4dCA9ICpvbDsKICAgICAgICAgICAgKm9sID0gbzsKICAgICAgICAgICAgdHlwZSA9IGdldF90b2tlbihmcCwgdG9rZW4sIE1BWFRPS0VOKTsKICAgICAgICB9IHdoaWxlICh0eXBlID09IENPTU1BKTsKICAgICAgICBpZiAodHlwZSAhPSBSSUdIVEJSQUNLRVQpIHsKICAgICAgICAgICAgcHJpbnRfZXJyb3IoIkV4cGVjdGVkIFwifVwiIGFmdGVyIGxpc3QiLCB0b2tlbiwgdHlwZSk7CiAgICAgICAgICAgIGdvdG8gc2tpcDsKICAgICAgICB9CiAgICAgICAgdHlwZSA9IGdldF90b2tlbihmcCwgdG9rZW4sIHR5cGUpOwogICAgfQogICAgaWYgKHR5cGUgIT0gU1RBVFVTKSB7CiAgICAgICAgcHJpbnRfZXJyb3IoIkV4cGVjdGVkIFNUQVRVUyIsIHRva2VuLCB0eXBlKTsKICAgICAgICBnb3RvIHNraXA7CiAgICB9CiAgICB0eXBlID0gZ2V0X3Rva2VuKGZwLCB0b2tlbiwgTUFYVE9LRU4pOwogICAgaWYgKHR5cGUgIT0gQ1VSUkVOVCAmJiB0eXBlICE9IERFUFJFQ0FURUQgJiYgdHlwZSAhPSBPQlNPTEVURSkgewogICAgICAgIHByaW50X2Vycm9yKCJCYWQgU1RBVFVTIHZhbHVlIiwgdG9rZW4sIHR5cGUpOwogICAgICAgIGdvdG8gc2tpcDsKICAgIH0KICAgIHR5cGUgPSBnZXRfdG9rZW4oZnAsIHRva2VuLCBNQVhUT0tFTik7CiAgICBpZiAodHlwZSAhPSBERVNDUklQVElPTikgewogICAgICAgIHByaW50X2Vycm9yKCJFeHBlY3RlZCBERVNDUklQVElPTiIsIHRva2VuLCB0eXBlKTsKICAgICAgICBnb3RvIHNraXA7CiAgICB9CiAgICB0eXBlID0gZ2V0X3Rva2VuKGZwLCBxdW90ZWRfc3RyaW5nX2J1ZmZlciwgTUFYUVVPVEVTVFIpOwogICAgaWYgKHR5cGUgIT0gUVVPVEVTVFJJTkcpIHsKICAgICAgICBwcmludF9lcnJvcigiQmFkIERFU0NSSVBUSU9OIiwgcXVvdGVkX3N0cmluZ19idWZmZXIsIHR5cGUpOwogICAgICAgIGZyZWVfbm9kZShucCk7CiAgICAgICAgcmV0dXJuIE5VTEw7CiAgICB9CiAgICBpZiAobmV0c25tcF9kc19nZXRfYm9vbGVhbihORVRTTk1QX0RTX0xJQlJBUllfSUQsIAoJCQkgICAgICAgTkVUU05NUF9EU19MSUJfU0FWRV9NSUJfREVTQ1JTKSkgewogICAgICAgIG5wLT5kZXNjcmlwdGlvbiA9IHN0cmR1cChxdW90ZWRfc3RyaW5nX2J1ZmZlcik7CiAgICB9CiAgICB0eXBlID0gZ2V0X3Rva2VuKGZwLCB0b2tlbiwgTUFYVE9LRU4pOwogICAgaWYgKHR5cGUgPT0gUkVGRVJFTkNFKSB7CiAgICAgICAgdHlwZSA9IGdldF90b2tlbihmcCwgcXVvdGVkX3N0cmluZ19idWZmZXIsIE1BWFFVT1RFU1RSKTsKICAgICAgICBpZiAodHlwZSAhPSBRVU9URVNUUklORykgewogICAgICAgICAgICBwcmludF9lcnJvcigiQmFkIFJFRkVSRU5DRSIsIHF1b3RlZF9zdHJpbmdfYnVmZmVyLCB0eXBlKTsKICAgICAgICAgICAgZnJlZV9ub2RlKG5wKTsKICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgfQogICAgICAgIG5wLT5yZWZlcmVuY2UgPSBzdHJkdXAocXVvdGVkX3N0cmluZ19idWZmZXIpOwogICAgICAgIHR5cGUgPSBnZXRfdG9rZW4oZnAsIHRva2VuLCBNQVhUT0tFTik7CiAgICB9CiAgICBpZiAodHlwZSAhPSBFUVVBTFMpCiAgICAgICAgcHJpbnRfZXJyb3IoIkV4cGVjdGVkIFwiOjo9XCIiLCB0b2tlbiwgdHlwZSk7CiAgc2tpcDoKICAgIHdoaWxlICh0eXBlICE9IEVRVUFMUyAmJiB0eXBlICE9IEVORE9GRklMRSkKICAgICAgICB0eXBlID0gZ2V0X3Rva2VuKGZwLCB0b2tlbiwgTUFYVE9LRU4pOwoKICAgIHJldHVybiBtZXJnZV9wYXJzZV9vYmplY3RpZChucCwgZnAsIG5hbWUpOwp9CgovKgogKiBQYXJzZXMgYSBOT1RJRklDQVRJT04tVFlQRSBtYWNyby4KICogUmV0dXJucyAwIG9uIGVycm9yLgogKi8Kc3RhdGljIHN0cnVjdCBub2RlICoKcGFyc2Vfbm90aWZpY2F0aW9uRGVmaW5pdGlvbihGSUxFICogZnAsIGNoYXIgKm5hbWUpCnsKICAgIHJlZ2lzdGVyIGludCAgICB0eXBlOwogICAgY2hhciAgICAgICAgICAgIHRva2VuW01BWFRPS0VOXTsKICAgIGNoYXIgICAgICAgICAgICBxdW90ZWRfc3RyaW5nX2J1ZmZlcltNQVhRVU9URVNUUl07CiAgICByZWdpc3RlciBzdHJ1Y3Qgbm9kZSAqbnA7CgogICAgbnAgPSBhbGxvY19ub2RlKGN1cnJlbnRfbW9kdWxlKTsKICAgIGlmIChucCA9PSBOVUxMKQogICAgICAgIHJldHVybiAoTlVMTCk7CiAgICB0eXBlID0gZ2V0X3Rva2VuKGZwLCB0b2tlbiwgTUFYVE9LRU4pOwogICAgd2hpbGUgKHR5cGUgIT0gRVFVQUxTICYmIHR5cGUgIT0gRU5ET0ZGSUxFKSB7CiAgICAgICAgc3dpdGNoICh0eXBlKSB7CiAgICAgICAgY2FzZSBERVNDUklQVElPTjoKICAgICAgICAgICAgdHlwZSA9IGdldF90b2tlbihmcCwgcXVvdGVkX3N0cmluZ19idWZmZXIsIE1BWFFVT1RFU1RSKTsKICAgICAgICAgICAgaWYgKHR5cGUgIT0gUVVPVEVTVFJJTkcpIHsKICAgICAgICAgICAgICAgIHByaW50X2Vycm9yKCJCYWQgREVTQ1JJUFRJT04iLCBxdW90ZWRfc3RyaW5nX2J1ZmZlciwgdHlwZSk7CiAgICAgICAgICAgICAgICBmcmVlX25vZGUobnApOwogICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKG5ldHNubXBfZHNfZ2V0X2Jvb2xlYW4oTkVUU05NUF9EU19MSUJSQVJZX0lELCAKCQkJCSAgICAgICBORVRTTk1QX0RTX0xJQl9TQVZFX01JQl9ERVNDUlMpKSB7CiAgICAgICAgICAgICAgICBucC0+ZGVzY3JpcHRpb24gPSBzdHJkdXAocXVvdGVkX3N0cmluZ19idWZmZXIpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgUkVGRVJFTkNFOgogICAgICAgICAgICB0eXBlID0gZ2V0X3Rva2VuKGZwLCBxdW90ZWRfc3RyaW5nX2J1ZmZlciwgTUFYUVVPVEVTVFIpOwogICAgICAgICAgICBpZiAodHlwZSAhPSBRVU9URVNUUklORykgewogICAgICAgICAgICAgICAgcHJpbnRfZXJyb3IoIkJhZCBSRUZFUkVOQ0UiLCBxdW90ZWRfc3RyaW5nX2J1ZmZlciwgdHlwZSk7CiAgICAgICAgICAgICAgICBmcmVlX25vZGUobnApOwogICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgbnAtPnJlZmVyZW5jZSA9IHN0cmR1cChxdW90ZWRfc3RyaW5nX2J1ZmZlcik7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgT0JKRUNUUzoKICAgICAgICAgICAgbnAtPnZhcmJpbmRzID0gZ2V0VmFyYmluZHMoZnAsICZucC0+dmFyYmluZHMpOwogICAgICAgICAgICBpZiAoIW5wLT52YXJiaW5kcykgewogICAgICAgICAgICAgICAgcHJpbnRfZXJyb3IoIkJhZCBPQkpFQ1RTIGxpc3QiLCB0b2tlbiwgdHlwZSk7CiAgICAgICAgICAgICAgICBmcmVlX25vZGUobnApOwogICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgLyoKICAgICAgICAgICAgICogTk9USElORyAKICAgICAgICAgICAgICovCiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgICB0eXBlID0gZ2V0X3Rva2VuKGZwLCB0b2tlbiwgTUFYVE9LRU4pOwogICAgfQogICAgcmV0dXJuIG1lcmdlX3BhcnNlX29iamVjdGlkKG5wLCBmcCwgbmFtZSk7Cn0KCi8qCiAqIFBhcnNlcyBhIFRSQVAtVFlQRSBtYWNyby4KICogUmV0dXJucyAwIG9uIGVycm9yLgogKi8Kc3RhdGljIHN0cnVjdCBub2RlICoKcGFyc2VfdHJhcERlZmluaXRpb24oRklMRSAqIGZwLCBjaGFyICpuYW1lKQp7CiAgICByZWdpc3RlciBpbnQgICAgdHlwZTsKICAgIGNoYXIgICAgICAgICAgICB0b2tlbltNQVhUT0tFTl07CiAgICBjaGFyICAgICAgICAgICAgcXVvdGVkX3N0cmluZ19idWZmZXJbTUFYUVVPVEVTVFJdOwogICAgcmVnaXN0ZXIgc3RydWN0IG5vZGUgKm5wOwoKICAgIG5wID0gYWxsb2Nfbm9kZShjdXJyZW50X21vZHVsZSk7CiAgICBpZiAobnAgPT0gTlVMTCkKICAgICAgICByZXR1cm4gKE5VTEwpOwogICAgdHlwZSA9IGdldF90b2tlbihmcCwgdG9rZW4sIE1BWFRPS0VOKTsKICAgIHdoaWxlICh0eXBlICE9IEVRVUFMUyAmJiB0eXBlICE9IEVORE9GRklMRSkgewogICAgICAgIHN3aXRjaCAodHlwZSkgewogICAgICAgIGNhc2UgREVTQ1JJUFRJT046CiAgICAgICAgICAgIHR5cGUgPSBnZXRfdG9rZW4oZnAsIHF1b3RlZF9zdHJpbmdfYnVmZmVyLCBNQVhRVU9URVNUUik7CiAgICAgICAgICAgIGlmICh0eXBlICE9IFFVT1RFU1RSSU5HKSB7CiAgICAgICAgICAgICAgICBwcmludF9lcnJvcigiQmFkIERFU0NSSVBUSU9OIiwgcXVvdGVkX3N0cmluZ19idWZmZXIsIHR5cGUpOwogICAgICAgICAgICAgICAgZnJlZV9ub2RlKG5wKTsKICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChuZXRzbm1wX2RzX2dldF9ib29sZWFuKE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgCgkJCQkgICAgICAgTkVUU05NUF9EU19MSUJfU0FWRV9NSUJfREVTQ1JTKSkgewogICAgICAgICAgICAgICAgbnAtPmRlc2NyaXB0aW9uID0gc3RyZHVwKHF1b3RlZF9zdHJpbmdfYnVmZmVyKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIFJFRkVSRU5DRToKICAgICAgICAgICAgLyogSSdtIG5vdCBzdXJlIFJFRkVSRU5DRXMgYXJlIGxlZ2FsIGluIHNtaXYxIHRyYXBzPz8/ICovCiAgICAgICAgICAgIHR5cGUgPSBnZXRfdG9rZW4oZnAsIHF1b3RlZF9zdHJpbmdfYnVmZmVyLCBNQVhRVU9URVNUUik7CiAgICAgICAgICAgIGlmICh0eXBlICE9IFFVT1RFU1RSSU5HKSB7CiAgICAgICAgICAgICAgICBwcmludF9lcnJvcigiQmFkIFJFRkVSRU5DRSIsIHF1b3RlZF9zdHJpbmdfYnVmZmVyLCB0eXBlKTsKICAgICAgICAgICAgICAgIGZyZWVfbm9kZShucCk7CiAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICAgICAgfQogICAgICAgICAgICBucC0+cmVmZXJlbmNlID0gc3RyZHVwKHF1b3RlZF9zdHJpbmdfYnVmZmVyKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBFTlRFUlBSSVNFOgogICAgICAgICAgICB0eXBlID0gZ2V0X3Rva2VuKGZwLCB0b2tlbiwgTUFYVE9LRU4pOwogICAgICAgICAgICBpZiAodHlwZSA9PSBMRUZUQlJBQ0tFVCkgewogICAgICAgICAgICAgICAgdHlwZSA9IGdldF90b2tlbihmcCwgdG9rZW4sIE1BWFRPS0VOKTsKICAgICAgICAgICAgICAgIGlmICh0eXBlICE9IExBQkVMKSB7CiAgICAgICAgICAgICAgICAgICAgcHJpbnRfZXJyb3IoIkJhZCBUcmFwIEZvcm1hdCIsIHRva2VuLCB0eXBlKTsKICAgICAgICAgICAgICAgICAgICBmcmVlX25vZGUobnApOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgbnAtPnBhcmVudCA9IHN0cmR1cCh0b2tlbik7CiAgICAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICAgICogR2V0IHJpZ2h0IGJyYWNrZXQgCiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgIHR5cGUgPSBnZXRfdG9rZW4oZnAsIHRva2VuLCBNQVhUT0tFTik7CiAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZSA9PSBMQUJFTCkgewogICAgICAgICAgICAgICAgbnAtPnBhcmVudCA9IHN0cmR1cCh0b2tlbik7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBmcmVlX25vZGUobnApOwogICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBWQVJJQUJMRVM6CiAgICAgICAgICAgIG5wLT52YXJiaW5kcyA9IGdldFZhcmJpbmRzKGZwLCAmbnAtPnZhcmJpbmRzKTsKICAgICAgICAgICAgaWYgKCFucC0+dmFyYmluZHMpIHsKICAgICAgICAgICAgICAgIHByaW50X2Vycm9yKCJCYWQgVkFSSUFCTEVTIGxpc3QiLCB0b2tlbiwgdHlwZSk7CiAgICAgICAgICAgICAgICBmcmVlX25vZGUobnApOwogICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgLyoKICAgICAgICAgICAgICogTk9USElORyAKICAgICAgICAgICAgICovCiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgICB0eXBlID0gZ2V0X3Rva2VuKGZwLCB0b2tlbiwgTUFYVE9LRU4pOwogICAgfQogICAgdHlwZSA9IGdldF90b2tlbihmcCwgdG9rZW4sIE1BWFRPS0VOKTsKCiAgICBucC0+bGFiZWwgPSBzdHJkdXAobmFtZSk7CgogICAgaWYgKHR5cGUgIT0gTlVNQkVSKSB7CiAgICAgICAgcHJpbnRfZXJyb3IoIkV4cGVjdGVkIGEgTnVtYmVyIiwgdG9rZW4sIHR5cGUpOwogICAgICAgIGZyZWVfbm9kZShucCk7CiAgICAgICAgcmV0dXJuIE5VTEw7CiAgICB9CiAgICBucC0+c3ViaWQgPSBzdHJ0b3VsKHRva2VuLCBOVUxMLCAxMCk7CiAgICBucC0+bmV4dCA9IGFsbG9jX25vZGUoY3VycmVudF9tb2R1bGUpOwogICAgaWYgKG5wLT5uZXh0ID09IE5VTEwpIHsKICAgICAgICBmcmVlX25vZGUobnApOwogICAgICAgIHJldHVybiAoTlVMTCk7CiAgICB9CiAgICBucC0+bmV4dC0+cGFyZW50ID0gbnAtPnBhcmVudDsKICAgIG5wLT5wYXJlbnQgPSAoY2hhciAqKSBtYWxsb2Moc3RybGVuKG5wLT5wYXJlbnQpICsgMik7CiAgICBpZiAobnAtPnBhcmVudCA9PSBOVUxMKSB7CiAgICAgICAgZnJlZV9ub2RlKG5wLT5uZXh0KTsKICAgICAgICBmcmVlX25vZGUobnApOwogICAgICAgIHJldHVybiAoTlVMTCk7CiAgICB9CiAgICBzdHJjcHkobnAtPnBhcmVudCwgbnAtPm5leHQtPnBhcmVudCk7CiAgICBzdHJjYXQobnAtPnBhcmVudCwgIiMiKTsKICAgIG5wLT5uZXh0LT5sYWJlbCA9IHN0cmR1cChucC0+cGFyZW50KTsKICAgIHJldHVybiBucDsKfQoKCi8qCiAqIFBhcnNlcyBhIGNvbXBsaWFuY2UgbWFjcm8KICogUmV0dXJucyAwIG9uIGVycm9yLgogKi8Kc3RhdGljIGludAplYXRfc3ludGF4KEZJTEUgKiBmcCwgY2hhciAqdG9rZW4sIGludCBtYXh0b2tlbikKewogICAgaW50ICAgICAgICAgICAgIHR5cGUsIG5leHR0eXBlOwogICAgc3RydWN0IG5vZGUgICAgKm5wID0gYWxsb2Nfbm9kZShjdXJyZW50X21vZHVsZSk7CiAgICBjaGFyICAgICAgICAgICAgbmV4dHRva2VuW01BWFRPS0VOXTsKCiAgICBpZiAoIW5wKQoJcmV0dXJuIDA7CgogICAgdHlwZSA9IGdldF90b2tlbihmcCwgdG9rZW4sIG1heHRva2VuKTsKICAgIG5leHR0eXBlID0gZ2V0X3Rva2VuKGZwLCBuZXh0dG9rZW4sIE1BWFRPS0VOKTsKICAgIHN3aXRjaCAodHlwZSkgewogICAgY2FzZSBJTlRFR0VSOgogICAgY2FzZSBJTlRFR0VSMzI6CiAgICBjYXNlIFVJTlRFR0VSMzI6CiAgICBjYXNlIFVOU0lHTkVEMzI6CiAgICBjYXNlIENPVU5URVI6CiAgICBjYXNlIEdBVUdFOgogICAgY2FzZSBCSVRTVFJJTkc6CiAgICBjYXNlIExBQkVMOgogICAgICAgIGlmIChuZXh0dHlwZSA9PSBMRUZUQlJBQ0tFVCkgewogICAgICAgICAgICAvKgogICAgICAgICAgICAgKiBpZiB0aGVyZSBpcyBhbiBlbnVtZXJhdGlvbiBsaXN0LCBwYXJzZSBpdCAKICAgICAgICAgICAgICovCiAgICAgICAgICAgIG5wLT5lbnVtcyA9IHBhcnNlX2VudW1saXN0KGZwLCAmbnAtPmVudW1zKTsKICAgICAgICAgICAgbmV4dHR5cGUgPSBnZXRfdG9rZW4oZnAsIG5leHR0b2tlbiwgTUFYVE9LRU4pOwogICAgICAgIH0gZWxzZSBpZiAobmV4dHR5cGUgPT0gTEVGVFBBUkVOKSB7CiAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAqIGlmIHRoZXJlIGlzIGEgcmFuZ2UgbGlzdCwgcGFyc2UgaXQgCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBucC0+cmFuZ2VzID0gcGFyc2VfcmFuZ2VzKGZwLCAmbnAtPnJhbmdlcyk7CiAgICAgICAgICAgIG5leHR0eXBlID0gZ2V0X3Rva2VuKGZwLCBuZXh0dG9rZW4sIE1BWFRPS0VOKTsKICAgICAgICB9CiAgICAgICAgYnJlYWs7CiAgICBjYXNlIE9DVEVUU1RSOgogICAgY2FzZSBLV19PUEFRVUU6CiAgICAgICAgLyoKICAgICAgICAgKiBwYXJzZSBhbnkgU0laRSBzcGVjaWZpY2F0aW9uIAogICAgICAgICAqLwogICAgICAgIGlmIChuZXh0dHlwZSA9PSBMRUZUUEFSRU4pIHsKICAgICAgICAgICAgbmV4dHR5cGUgPSBnZXRfdG9rZW4oZnAsIG5leHR0b2tlbiwgTUFYVE9LRU4pOwogICAgICAgICAgICBpZiAobmV4dHR5cGUgPT0gU0laRSkgewogICAgICAgICAgICAgICAgbmV4dHR5cGUgPSBnZXRfdG9rZW4oZnAsIG5leHR0b2tlbiwgTUFYVE9LRU4pOwogICAgICAgICAgICAgICAgaWYgKG5leHR0eXBlID09IExFRlRQQVJFTikgewogICAgICAgICAgICAgICAgICAgIG5wLT5yYW5nZXMgPSBwYXJzZV9yYW5nZXMoZnAsICZucC0+cmFuZ2VzKTsKICAgICAgICAgICAgICAgICAgICBuZXh0dHlwZSA9IGdldF90b2tlbihmcCwgbmV4dHRva2VuLCBNQVhUT0tFTik7ICAgICAgLyogKSAqLwogICAgICAgICAgICAgICAgICAgIGlmIChuZXh0dHlwZSA9PSBSSUdIVFBBUkVOKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG5leHR0eXBlID0gZ2V0X3Rva2VuKGZwLCBuZXh0dG9rZW4sIE1BWFRPS0VOKTsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHByaW50X2Vycm9yKCJCYWQgU0laRSBzeW50YXgiLCB0b2tlbiwgdHlwZSk7CiAgICAgICAgICAgIGZyZWVfbm9kZShucCk7CiAgICAgICAgICAgIHJldHVybiBuZXh0dHlwZTsKICAgICAgICB9CiAgICAgICAgYnJlYWs7CiAgICBjYXNlIE9CSklEOgogICAgY2FzZSBORVRBRERSOgogICAgY2FzZSBJUEFERFI6CiAgICBjYXNlIFRJTUVUSUNLUzoKICAgIGNhc2UgTlVMOgogICAgY2FzZSBOU0FQQUREUkVTUzoKICAgIGNhc2UgQ09VTlRFUjY0OgogICAgICAgIGJyZWFrOwogICAgZGVmYXVsdDoKICAgICAgICBwcmludF9lcnJvcigiQmFkIHN5bnRheCIsIHRva2VuLCB0eXBlKTsKICAgICAgICBmcmVlX25vZGUobnApOwogICAgICAgIHJldHVybiBuZXh0dHlwZTsKICAgIH0KICAgIGZyZWVfbm9kZShucCk7CiAgICByZXR1cm4gbmV4dHR5cGU7Cn0KCnN0YXRpYyBpbnQKY29tcGxpYW5jZV9sb29rdXAoY29uc3QgY2hhciAqbmFtZSwgaW50IG1vZGlkKQp7CiAgICBpZiAobW9kaWQgPT0gLTEpIHsKICAgICAgICBzdHJ1Y3Qgb2JqZ3JvdXAgKm9wID0KICAgICAgICAgICAgKHN0cnVjdCBvYmpncm91cCAqKSBtYWxsb2Moc2l6ZW9mKHN0cnVjdCBvYmpncm91cCkpOwogICAgICAgIGlmICghb3ApCiAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgIG9wLT5uZXh0ID0gb2JqZ3JvdXBzOwogICAgICAgIG9wLT5uYW1lID0gc3RyZHVwKG5hbWUpOwogICAgICAgIG9wLT5saW5lID0gbWliTGluZTsKICAgICAgICBvYmpncm91cHMgPSBvcDsKICAgICAgICByZXR1cm4gMTsKICAgIH0gZWxzZQogICAgICAgIHJldHVybiBmaW5kX3RyZWVfbm9kZShuYW1lLCBtb2RpZCkgIT0gTlVMTDsKfQoKc3RhdGljIHN0cnVjdCBub2RlICoKcGFyc2VfY29tcGxpYW5jZShGSUxFICogZnAsIGNoYXIgKm5hbWUpCnsKICAgIGludCAgICAgICAgICAgICB0eXBlOwogICAgY2hhciAgICAgICAgICAgIHRva2VuW01BWFRPS0VOXTsKICAgIGNoYXIgICAgICAgICAgICBxdW90ZWRfc3RyaW5nX2J1ZmZlcltNQVhRVU9URVNUUl07CiAgICBzdHJ1Y3Qgbm9kZSAgICAqbnA7CgogICAgbnAgPSBhbGxvY19ub2RlKGN1cnJlbnRfbW9kdWxlKTsKICAgIGlmIChucCA9PSBOVUxMKQogICAgICAgIHJldHVybiAoTlVMTCk7CiAgICB0eXBlID0gZ2V0X3Rva2VuKGZwLCB0b2tlbiwgTUFYVE9LRU4pOwogICAgaWYgKHR5cGUgIT0gU1RBVFVTKSB7CiAgICAgICAgcHJpbnRfZXJyb3IoIkV4cGVjdGVkIFNUQVRVUyIsIHRva2VuLCB0eXBlKTsKICAgICAgICBnb3RvIHNraXA7CiAgICB9CiAgICB0eXBlID0gZ2V0X3Rva2VuKGZwLCB0b2tlbiwgTUFYVE9LRU4pOwogICAgaWYgKHR5cGUgIT0gQ1VSUkVOVCAmJiB0eXBlICE9IERFUFJFQ0FURUQgJiYgdHlwZSAhPSBPQlNPTEVURSkgewogICAgICAgIHByaW50X2Vycm9yKCJCYWQgU1RBVFVTIiwgdG9rZW4sIHR5cGUpOwogICAgICAgIGdvdG8gc2tpcDsKICAgIH0KICAgIHR5cGUgPSBnZXRfdG9rZW4oZnAsIHRva2VuLCBNQVhUT0tFTik7CiAgICBpZiAodHlwZSAhPSBERVNDUklQVElPTikgewogICAgICAgIHByaW50X2Vycm9yKCJFeHBlY3RlZCBERVNDUklQVElPTiIsIHRva2VuLCB0eXBlKTsKICAgICAgICBnb3RvIHNraXA7CiAgICB9CiAgICB0eXBlID0gZ2V0X3Rva2VuKGZwLCBxdW90ZWRfc3RyaW5nX2J1ZmZlciwgTUFYUVVPVEVTVFIpOwogICAgaWYgKHR5cGUgIT0gUVVPVEVTVFJJTkcpIHsKICAgICAgICBwcmludF9lcnJvcigiQmFkIERFU0NSSVBUSU9OIiwgcXVvdGVkX3N0cmluZ19idWZmZXIsIHR5cGUpOwogICAgICAgIGdvdG8gc2tpcDsKICAgIH0KICAgIGlmIChuZXRzbm1wX2RzX2dldF9ib29sZWFuKE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgCgkJCSAgICAgICBORVRTTk1QX0RTX0xJQl9TQVZFX01JQl9ERVNDUlMpKQogICAgICAgIG5wLT5kZXNjcmlwdGlvbiA9IHN0cmR1cChxdW90ZWRfc3RyaW5nX2J1ZmZlcik7CiAgICB0eXBlID0gZ2V0X3Rva2VuKGZwLCB0b2tlbiwgTUFYVE9LRU4pOwogICAgaWYgKHR5cGUgPT0gUkVGRVJFTkNFKSB7CiAgICAgICAgdHlwZSA9IGdldF90b2tlbihmcCwgcXVvdGVkX3N0cmluZ19idWZmZXIsIE1BWFRPS0VOKTsKICAgICAgICBpZiAodHlwZSAhPSBRVU9URVNUUklORykgewogICAgICAgICAgICBwcmludF9lcnJvcigiQmFkIFJFRkVSRU5DRSIsIHF1b3RlZF9zdHJpbmdfYnVmZmVyLCB0eXBlKTsKICAgICAgICAgICAgZ290byBza2lwOwogICAgICAgIH0KICAgICAgICBucC0+cmVmZXJlbmNlID0gc3RyZHVwKHF1b3RlZF9zdHJpbmdfYnVmZmVyKTsKICAgICAgICB0eXBlID0gZ2V0X3Rva2VuKGZwLCB0b2tlbiwgTUFYVE9LRU4pOwogICAgfQogICAgaWYgKHR5cGUgIT0gTU9EVUxFKSB7CiAgICAgICAgcHJpbnRfZXJyb3IoIkV4cGVjdGVkIE1PRFVMRSIsIHRva2VuLCB0eXBlKTsKICAgICAgICBnb3RvIHNraXA7CiAgICB9CiAgICB3aGlsZSAodHlwZSA9PSBNT0RVTEUpIHsKICAgICAgICBpbnQgICAgICAgICAgICAgbW9kaWQgPSAtMTsKICAgICAgICBjaGFyICAgICAgICAgICAgbW9kbmFtZVtNQVhUT0tFTl07CiAgICAgICAgdHlwZSA9IGdldF90b2tlbihmcCwgdG9rZW4sIE1BWFRPS0VOKTsKICAgICAgICBpZiAodHlwZSA9PSBMQUJFTAogICAgICAgICAgICAmJiBzdHJjbXAodG9rZW4sIG1vZHVsZV9uYW1lKGN1cnJlbnRfbW9kdWxlLCBtb2RuYW1lKSkpIHsKICAgICAgICAgICAgbW9kaWQgPSByZWFkX21vZHVsZV9pbnRlcm5hbCh0b2tlbik7CiAgICAgICAgICAgIGlmIChtb2RpZCAhPSBNT0RVTEVfTE9BREVEX09LCiAgICAgICAgICAgICAgICAmJiBtb2RpZCAhPSBNT0RVTEVfQUxSRUFEWV9MT0FERUQpIHsKICAgICAgICAgICAgICAgIHByaW50X2Vycm9yKCJVbmtub3duIG1vZHVsZSIsIHRva2VuLCB0eXBlKTsKICAgICAgICAgICAgICAgIGdvdG8gc2tpcDsKICAgICAgICAgICAgfQogICAgICAgICAgICBtb2RpZCA9IHdoaWNoX21vZHVsZSh0b2tlbik7CiAgICAgICAgICAgIHR5cGUgPSBnZXRfdG9rZW4oZnAsIHRva2VuLCBNQVhUT0tFTik7CiAgICAgICAgfQogICAgICAgIGlmICh0eXBlID09IE1BTkRBVE9SWUdST1VQUykgewogICAgICAgICAgICB0eXBlID0gZ2V0X3Rva2VuKGZwLCB0b2tlbiwgTUFYVE9LRU4pOwogICAgICAgICAgICBpZiAodHlwZSAhPSBMRUZUQlJBQ0tFVCkgewogICAgICAgICAgICAgICAgcHJpbnRfZXJyb3IoIkV4cGVjdGVkIFwie1wiIiwgdG9rZW4sIHR5cGUpOwogICAgICAgICAgICAgICAgZ290byBza2lwOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGRvIHsKICAgICAgICAgICAgICAgIHR5cGUgPSBnZXRfdG9rZW4oZnAsIHRva2VuLCBNQVhUT0tFTik7CiAgICAgICAgICAgICAgICBpZiAodHlwZSAhPSBMQUJFTCkgewogICAgICAgICAgICAgICAgICAgIHByaW50X2Vycm9yKCJCYWQgZ3JvdXAgbmFtZSIsIHRva2VuLCB0eXBlKTsKICAgICAgICAgICAgICAgICAgICBnb3RvIHNraXA7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoIWNvbXBsaWFuY2VfbG9va3VwKHRva2VuLCBtb2RpZCkpCiAgICAgICAgICAgICAgICAgICAgcHJpbnRfZXJyb3IoIlVua25vd24gZ3JvdXAiLCB0b2tlbiwgdHlwZSk7CiAgICAgICAgICAgICAgICB0eXBlID0gZ2V0X3Rva2VuKGZwLCB0b2tlbiwgTUFYVE9LRU4pOwogICAgICAgICAgICB9IHdoaWxlICh0eXBlID09IENPTU1BKTsKICAgICAgICAgICAgaWYgKHR5cGUgIT0gUklHSFRCUkFDS0VUKSB7CiAgICAgICAgICAgICAgICBwcmludF9lcnJvcigiRXhwZWN0ZWQgXCJ9XCIiLCB0b2tlbiwgdHlwZSk7CiAgICAgICAgICAgICAgICBnb3RvIHNraXA7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdHlwZSA9IGdldF90b2tlbihmcCwgdG9rZW4sIE1BWFRPS0VOKTsKICAgICAgICB9CiAgICAgICAgd2hpbGUgKHR5cGUgPT0gR1JPVVAgfHwgdHlwZSA9PSBPQkpFQ1QpIHsKICAgICAgICAgICAgaWYgKHR5cGUgPT0gR1JPVVApIHsKICAgICAgICAgICAgICAgIHR5cGUgPSBnZXRfdG9rZW4oZnAsIHRva2VuLCBNQVhUT0tFTik7CiAgICAgICAgICAgICAgICBpZiAodHlwZSAhPSBMQUJFTCkgewogICAgICAgICAgICAgICAgICAgIHByaW50X2Vycm9yKCJCYWQgZ3JvdXAgbmFtZSIsIHRva2VuLCB0eXBlKTsKICAgICAgICAgICAgICAgICAgICBnb3RvIHNraXA7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoIWNvbXBsaWFuY2VfbG9va3VwKHRva2VuLCBtb2RpZCkpCiAgICAgICAgICAgICAgICAgICAgcHJpbnRfZXJyb3IoIlVua25vd24gZ3JvdXAiLCB0b2tlbiwgdHlwZSk7CiAgICAgICAgICAgICAgICB0eXBlID0gZ2V0X3Rva2VuKGZwLCB0b2tlbiwgTUFYVE9LRU4pOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgdHlwZSA9IGdldF90b2tlbihmcCwgdG9rZW4sIE1BWFRPS0VOKTsKICAgICAgICAgICAgICAgIGlmICh0eXBlICE9IExBQkVMKSB7CiAgICAgICAgICAgICAgICAgICAgcHJpbnRfZXJyb3IoIkJhZCBvYmplY3QgbmFtZSIsIHRva2VuLCB0eXBlKTsKICAgICAgICAgICAgICAgICAgICBnb3RvIHNraXA7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoIWNvbXBsaWFuY2VfbG9va3VwKHRva2VuLCBtb2RpZCkpCiAgICAgICAgICAgICAgICAgICAgcHJpbnRfZXJyb3IoIlVua25vd24gZ3JvdXAiLCB0b2tlbiwgdHlwZSk7CiAgICAgICAgICAgICAgICB0eXBlID0gZ2V0X3Rva2VuKGZwLCB0b2tlbiwgTUFYVE9LRU4pOwogICAgICAgICAgICAgICAgaWYgKHR5cGUgPT0gU1lOVEFYKQogICAgICAgICAgICAgICAgICAgIHR5cGUgPSBlYXRfc3ludGF4KGZwLCB0b2tlbiwgTUFYVE9LRU4pOwogICAgICAgICAgICAgICAgaWYgKHR5cGUgPT0gV1JTWU5UQVgpCiAgICAgICAgICAgICAgICAgICAgdHlwZSA9IGVhdF9zeW50YXgoZnAsIHRva2VuLCBNQVhUT0tFTik7CiAgICAgICAgICAgICAgICBpZiAodHlwZSA9PSBNSU5BQ0NFU1MpIHsKICAgICAgICAgICAgICAgICAgICB0eXBlID0gZ2V0X3Rva2VuKGZwLCB0b2tlbiwgTUFYVE9LRU4pOwogICAgICAgICAgICAgICAgICAgIGlmICh0eXBlICE9IE5PQUNDRVNTICYmIHR5cGUgIT0gQUNDTk9USUZZCiAgICAgICAgICAgICAgICAgICAgICAgICYmIHR5cGUgIT0gUkVBRE9OTFkgJiYgdHlwZSAhPSBXUklURU9OTFkKICAgICAgICAgICAgICAgICAgICAgICAgJiYgdHlwZSAhPSBSRUFEQ1JFQVRFICYmIHR5cGUgIT0gUkVBRFdSSVRFKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHByaW50X2Vycm9yKCJCYWQgTUlOLUFDQ0VTUyBzcGVjIiwgdG9rZW4sIHR5cGUpOwogICAgICAgICAgICAgICAgICAgICAgICBnb3RvIHNraXA7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHR5cGUgPSBnZXRfdG9rZW4oZnAsIHRva2VuLCBNQVhUT0tFTik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHR5cGUgIT0gREVTQ1JJUFRJT04pIHsKICAgICAgICAgICAgICAgIHByaW50X2Vycm9yKCJFeHBlY3RlZCBERVNDUklQVElPTiIsIHRva2VuLCB0eXBlKTsKICAgICAgICAgICAgICAgIGdvdG8gc2tpcDsKICAgICAgICAgICAgfQogICAgICAgICAgICB0eXBlID0gZ2V0X3Rva2VuKGZwLCB0b2tlbiwgTUFYVE9LRU4pOwogICAgICAgICAgICBpZiAodHlwZSAhPSBRVU9URVNUUklORykgewogICAgICAgICAgICAgICAgcHJpbnRfZXJyb3IoIkJhZCBERVNDUklQVElPTiIsIHRva2VuLCB0eXBlKTsKICAgICAgICAgICAgICAgIGdvdG8gc2tpcDsKICAgICAgICAgICAgfQogICAgICAgICAgICB0eXBlID0gZ2V0X3Rva2VuKGZwLCB0b2tlbiwgTUFYVE9LRU4pOwogICAgICAgIH0KICAgIH0KICBza2lwOgogICAgd2hpbGUgKHR5cGUgIT0gRVFVQUxTICYmIHR5cGUgIT0gRU5ET0ZGSUxFKQogICAgICAgIHR5cGUgPSBnZXRfdG9rZW4oZnAsIHF1b3RlZF9zdHJpbmdfYnVmZmVyLCBNQVhRVU9URVNUUik7CgogICAgcmV0dXJuIG1lcmdlX3BhcnNlX29iamVjdGlkKG5wLCBmcCwgbmFtZSk7Cn0KCgovKgogKiBQYXJzZXMgYSBjYXBhYmlsaXRpZXMgbWFjcm8KICogUmV0dXJucyAwIG9uIGVycm9yLgogKi8Kc3RhdGljIHN0cnVjdCBub2RlICoKcGFyc2VfY2FwYWJpbGl0aWVzKEZJTEUgKiBmcCwgY2hhciAqbmFtZSkKewogICAgaW50ICAgICAgICAgICAgIHR5cGU7CiAgICBjaGFyICAgICAgICAgICAgdG9rZW5bTUFYVE9LRU5dOwogICAgY2hhciAgICAgICAgICAgIHF1b3RlZF9zdHJpbmdfYnVmZmVyW01BWFFVT1RFU1RSXTsKICAgIHN0cnVjdCBub2RlICAgICpucDsKCiAgICBucCA9IGFsbG9jX25vZGUoY3VycmVudF9tb2R1bGUpOwogICAgaWYgKG5wID09IE5VTEwpCiAgICAgICAgcmV0dXJuIChOVUxMKTsKICAgIHR5cGUgPSBnZXRfdG9rZW4oZnAsIHRva2VuLCBNQVhUT0tFTik7CiAgICBpZiAodHlwZSAhPSBQUk9EUkVMKSB7CiAgICAgICAgcHJpbnRfZXJyb3IoIkV4cGVjdGVkIFBST0RVQ1QtUkVMRUFTRSIsIHRva2VuLCB0eXBlKTsKICAgICAgICBnb3RvIHNraXA7CiAgICB9CiAgICB0eXBlID0gZ2V0X3Rva2VuKGZwLCB0b2tlbiwgTUFYVE9LRU4pOwogICAgaWYgKHR5cGUgIT0gUVVPVEVTVFJJTkcpIHsKICAgICAgICBwcmludF9lcnJvcigiRXhwZWN0ZWQgU1RSSU5HIGFmdGVyIFBST0RVQ1QtUkVMRUFTRSIsIHRva2VuLCB0eXBlKTsKICAgICAgICBnb3RvIHNraXA7CiAgICB9CiAgICB0eXBlID0gZ2V0X3Rva2VuKGZwLCB0b2tlbiwgTUFYVE9LRU4pOwogICAgaWYgKHR5cGUgIT0gU1RBVFVTKSB7CiAgICAgICAgcHJpbnRfZXJyb3IoIkV4cGVjdGVkIFNUQVRVUyIsIHRva2VuLCB0eXBlKTsKICAgICAgICBnb3RvIHNraXA7CiAgICB9CiAgICB0eXBlID0gZ2V0X3Rva2VuKGZwLCB0b2tlbiwgTUFYVE9LRU4pOwogICAgaWYgKHR5cGUgIT0gQ1VSUkVOVCAmJiB0eXBlICE9IE9CU09MRVRFKSB7CiAgICAgICAgcHJpbnRfZXJyb3IoIlNUQVRVUyBzaG91bGQgYmUgY3VycmVudCBvciBvYnNvbGV0ZSIsIHRva2VuLCB0eXBlKTsKICAgICAgICBnb3RvIHNraXA7CiAgICB9CiAgICB0eXBlID0gZ2V0X3Rva2VuKGZwLCB0b2tlbiwgTUFYVE9LRU4pOwogICAgaWYgKHR5cGUgIT0gREVTQ1JJUFRJT04pIHsKICAgICAgICBwcmludF9lcnJvcigiRXhwZWN0ZWQgREVTQ1JJUFRJT04iLCB0b2tlbiwgdHlwZSk7CiAgICAgICAgZ290byBza2lwOwogICAgfQogICAgdHlwZSA9IGdldF90b2tlbihmcCwgcXVvdGVkX3N0cmluZ19idWZmZXIsIE1BWFRPS0VOKTsKICAgIGlmICh0eXBlICE9IFFVT1RFU1RSSU5HKSB7CiAgICAgICAgcHJpbnRfZXJyb3IoIkJhZCBERVNDUklQVElPTiIsIHF1b3RlZF9zdHJpbmdfYnVmZmVyLCB0eXBlKTsKICAgICAgICBnb3RvIHNraXA7CiAgICB9CiAgICBpZiAobmV0c25tcF9kc19nZXRfYm9vbGVhbihORVRTTk1QX0RTX0xJQlJBUllfSUQsIAoJCQkgICAgICAgTkVUU05NUF9EU19MSUJfU0FWRV9NSUJfREVTQ1JTKSkgewogICAgICAgIG5wLT5kZXNjcmlwdGlvbiA9IHN0cmR1cChxdW90ZWRfc3RyaW5nX2J1ZmZlcik7CiAgICB9CiAgICB0eXBlID0gZ2V0X3Rva2VuKGZwLCB0b2tlbiwgTUFYVE9LRU4pOwogICAgaWYgKHR5cGUgPT0gUkVGRVJFTkNFKSB7CiAgICAgICAgdHlwZSA9IGdldF90b2tlbihmcCwgcXVvdGVkX3N0cmluZ19idWZmZXIsIE1BWFRPS0VOKTsKICAgICAgICBpZiAodHlwZSAhPSBRVU9URVNUUklORykgewogICAgICAgICAgICBwcmludF9lcnJvcigiQmFkIFJFRkVSRU5DRSIsIHF1b3RlZF9zdHJpbmdfYnVmZmVyLCB0eXBlKTsKICAgICAgICAgICAgZ290byBza2lwOwogICAgICAgIH0KICAgICAgICBucC0+cmVmZXJlbmNlID0gc3RyZHVwKHF1b3RlZF9zdHJpbmdfYnVmZmVyKTsKICAgICAgICB0eXBlID0gZ2V0X3Rva2VuKGZwLCB0b2tlbiwgdHlwZSk7CiAgICB9CiAgICB3aGlsZSAodHlwZSA9PSBTVVBQT1JUUykgewogICAgICAgIGludCAgICAgICAgICAgICBtb2RpZDsKICAgICAgICBzdHJ1Y3QgdHJlZSAgICAqdHA7CgogICAgICAgIHR5cGUgPSBnZXRfdG9rZW4oZnAsIHRva2VuLCBNQVhUT0tFTik7CiAgICAgICAgaWYgKHR5cGUgIT0gTEFCRUwpIHsKICAgICAgICAgICAgcHJpbnRfZXJyb3IoIkJhZCBtb2R1bGUgbmFtZSIsIHRva2VuLCB0eXBlKTsKICAgICAgICAgICAgZ290byBza2lwOwogICAgICAgIH0KICAgICAgICBtb2RpZCA9IHJlYWRfbW9kdWxlX2ludGVybmFsKHRva2VuKTsKICAgICAgICBpZiAobW9kaWQgIT0gTU9EVUxFX0xPQURFRF9PSyAmJiBtb2RpZCAhPSBNT0RVTEVfQUxSRUFEWV9MT0FERUQpIHsKICAgICAgICAgICAgcHJpbnRfZXJyb3IoIk1vZHVsZSBub3QgZm91bmQiLCB0b2tlbiwgdHlwZSk7CiAgICAgICAgICAgIGdvdG8gc2tpcDsKICAgICAgICB9CiAgICAgICAgbW9kaWQgPSB3aGljaF9tb2R1bGUodG9rZW4pOwogICAgICAgIHR5cGUgPSBnZXRfdG9rZW4oZnAsIHRva2VuLCBNQVhUT0tFTik7CiAgICAgICAgaWYgKHR5cGUgIT0gSU5DTFVERVMpIHsKICAgICAgICAgICAgcHJpbnRfZXJyb3IoIkV4cGVjdGVkIElOQ0xVREVTIiwgdG9rZW4sIHR5cGUpOwogICAgICAgICAgICBnb3RvIHNraXA7CiAgICAgICAgfQogICAgICAgIHR5cGUgPSBnZXRfdG9rZW4oZnAsIHRva2VuLCBNQVhUT0tFTik7CiAgICAgICAgaWYgKHR5cGUgIT0gTEVGVEJSQUNLRVQpIHsKICAgICAgICAgICAgcHJpbnRfZXJyb3IoIkV4cGVjdGVkIFwie1wiIiwgdG9rZW4sIHR5cGUpOwogICAgICAgICAgICBnb3RvIHNraXA7CiAgICAgICAgfQogICAgICAgIGRvIHsKICAgICAgICAgICAgdHlwZSA9IGdldF90b2tlbihmcCwgdG9rZW4sIE1BWFRPS0VOKTsKICAgICAgICAgICAgaWYgKHR5cGUgIT0gTEFCRUwpIHsKICAgICAgICAgICAgICAgIHByaW50X2Vycm9yKCJFeHBlY3RlZCBncm91cCBuYW1lIiwgdG9rZW4sIHR5cGUpOwogICAgICAgICAgICAgICAgZ290byBza2lwOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRwID0gZmluZF90cmVlX25vZGUodG9rZW4sIG1vZGlkKTsKICAgICAgICAgICAgaWYgKCF0cCkKICAgICAgICAgICAgICAgIHByaW50X2Vycm9yKCJHcm91cCBub3QgZm91bmQgaW4gbW9kdWxlIiwgdG9rZW4sIHR5cGUpOwogICAgICAgICAgICB0eXBlID0gZ2V0X3Rva2VuKGZwLCB0b2tlbiwgTUFYVE9LRU4pOwogICAgICAgIH0gd2hpbGUgKHR5cGUgPT0gQ09NTUEpOwogICAgICAgIGlmICh0eXBlICE9IFJJR0hUQlJBQ0tFVCkgewogICAgICAgICAgICBwcmludF9lcnJvcigiRXhwZWN0ZWQgXCJ9XCIgYWZ0ZXIgZ3JvdXAgbGlzdCIsIHRva2VuLCB0eXBlKTsKICAgICAgICAgICAgZ290byBza2lwOwogICAgICAgIH0KICAgICAgICB0eXBlID0gZ2V0X3Rva2VuKGZwLCB0b2tlbiwgTUFYVE9LRU4pOwogICAgICAgIHdoaWxlICh0eXBlID09IFZBUklBVElPTikgewogICAgICAgICAgICB0eXBlID0gZ2V0X3Rva2VuKGZwLCB0b2tlbiwgTUFYVE9LRU4pOwogICAgICAgICAgICBpZiAodHlwZSAhPSBMQUJFTCkgewogICAgICAgICAgICAgICAgcHJpbnRfZXJyb3IoIkJhZCBvYmplY3QgbmFtZSIsIHRva2VuLCB0eXBlKTsKICAgICAgICAgICAgICAgIGdvdG8gc2tpcDsKICAgICAgICAgICAgfQogICAgICAgICAgICB0cCA9IGZpbmRfdHJlZV9ub2RlKHRva2VuLCBtb2RpZCk7CiAgICAgICAgICAgIGlmICghdHApCiAgICAgICAgICAgICAgICBwcmludF9lcnJvcigiT2JqZWN0IG5vdCBmb3VuZCBpbiBtb2R1bGUiLCB0b2tlbiwgdHlwZSk7CiAgICAgICAgICAgIHR5cGUgPSBnZXRfdG9rZW4oZnAsIHRva2VuLCBNQVhUT0tFTik7CiAgICAgICAgICAgIGlmICh0eXBlID09IFNZTlRBWCkgewogICAgICAgICAgICAgICAgdHlwZSA9IGVhdF9zeW50YXgoZnAsIHRva2VuLCBNQVhUT0tFTik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHR5cGUgPT0gV1JTWU5UQVgpIHsKICAgICAgICAgICAgICAgIHR5cGUgPSBlYXRfc3ludGF4KGZwLCB0b2tlbiwgTUFYVE9LRU4pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICh0eXBlID09IEFDQ0VTUykgewogICAgICAgICAgICAgICAgdHlwZSA9IGdldF90b2tlbihmcCwgdG9rZW4sIE1BWFRPS0VOKTsKICAgICAgICAgICAgICAgIGlmICh0eXBlICE9IEFDQ05PVElGWSAmJiB0eXBlICE9IFJFQURPTkxZCiAgICAgICAgICAgICAgICAgICAgJiYgdHlwZSAhPSBSRUFEV1JJVEUgJiYgdHlwZSAhPSBSRUFEQ1JFQVRFCiAgICAgICAgICAgICAgICAgICAgJiYgdHlwZSAhPSBXUklURU9OTFkgJiYgdHlwZSAhPSBOT1RJTVBMKSB7CiAgICAgICAgICAgICAgICAgICAgcHJpbnRfZXJyb3IoIkJhZCBBQ0NFU1MiLCB0b2tlbiwgdHlwZSk7CiAgICAgICAgICAgICAgICAgICAgZ290byBza2lwOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdHlwZSA9IGdldF90b2tlbihmcCwgdG9rZW4sIE1BWFRPS0VOKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAodHlwZSA9PSBDUkVBVEVSRVEpIHsKICAgICAgICAgICAgICAgIHR5cGUgPSBnZXRfdG9rZW4oZnAsIHRva2VuLCBNQVhUT0tFTik7CiAgICAgICAgICAgICAgICBpZiAodHlwZSAhPSBMRUZUQlJBQ0tFVCkgewogICAgICAgICAgICAgICAgICAgIHByaW50X2Vycm9yKCJFeHBlY3RlZCBcIntcIiIsIHRva2VuLCB0eXBlKTsKICAgICAgICAgICAgICAgICAgICBnb3RvIHNraXA7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBkbyB7CiAgICAgICAgICAgICAgICAgICAgdHlwZSA9IGdldF90b2tlbihmcCwgdG9rZW4sIE1BWFRPS0VOKTsKICAgICAgICAgICAgICAgICAgICBpZiAodHlwZSAhPSBMQUJFTCkgewogICAgICAgICAgICAgICAgICAgICAgICBwcmludF9lcnJvcigiQmFkIG9iamVjdCBuYW1lIGluIGxpc3QiLCB0b2tlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gc2tpcDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgdHlwZSA9IGdldF90b2tlbihmcCwgdG9rZW4sIE1BWFRPS0VOKTsKICAgICAgICAgICAgICAgIH0gd2hpbGUgKHR5cGUgPT0gQ09NTUEpOwogICAgICAgICAgICAgICAgaWYgKHR5cGUgIT0gUklHSFRCUkFDS0VUKSB7CiAgICAgICAgICAgICAgICAgICAgcHJpbnRfZXJyb3IoIkV4cGVjdGVkIFwifVwiIGFmdGVyIGxpc3QiLCB0b2tlbiwgdHlwZSk7CiAgICAgICAgICAgICAgICAgICAgZ290byBza2lwOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdHlwZSA9IGdldF90b2tlbihmcCwgdG9rZW4sIE1BWFRPS0VOKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAodHlwZSA9PSBERUZWQUwpIHsKICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICBsZXZlbCA9IDE7CiAgICAgICAgICAgICAgICB0eXBlID0gZ2V0X3Rva2VuKGZwLCB0b2tlbiwgTUFYVE9LRU4pOwogICAgICAgICAgICAgICAgaWYgKHR5cGUgIT0gTEVGVEJSQUNLRVQpIHsKICAgICAgICAgICAgICAgICAgICBwcmludF9lcnJvcigiRXhwZWN0ZWQgXCJ7XCIgYWZ0ZXIgREVGVkFMIiwgdG9rZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSk7CiAgICAgICAgICAgICAgICAgICAgZ290byBza2lwOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZG8gewogICAgICAgICAgICAgICAgICAgIHR5cGUgPSBnZXRfdG9rZW4oZnAsIHRva2VuLCBNQVhUT0tFTik7CiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGUgPT0gTEVGVEJSQUNLRVQpCiAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsKys7CiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAodHlwZSA9PSBSSUdIVEJSQUNLRVQpCiAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsLS07CiAgICAgICAgICAgICAgICB9IHdoaWxlICgodHlwZSAhPSBSSUdIVEJSQUNLRVQgfHwgbGV2ZWwgIT0gMCkKICAgICAgICAgICAgICAgICAgICAgICAgICYmIHR5cGUgIT0gRU5ET0ZGSUxFKTsKICAgICAgICAgICAgICAgIGlmICh0eXBlICE9IFJJR0hUQlJBQ0tFVCkgewogICAgICAgICAgICAgICAgICAgIHByaW50X2Vycm9yKCJNaXNzaW5nIFwifVwiIGFmdGVyIERFRlZBTCIsIHRva2VuLCB0eXBlKTsKICAgICAgICAgICAgICAgICAgICBnb3RvIHNraXA7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB0eXBlID0gZ2V0X3Rva2VuKGZwLCB0b2tlbiwgTUFYVE9LRU4pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICh0eXBlICE9IERFU0NSSVBUSU9OKSB7CiAgICAgICAgICAgICAgICBwcmludF9lcnJvcigiRXhwZWN0ZWQgREVTQ1JJUFRJT04iLCB0b2tlbiwgdHlwZSk7CiAgICAgICAgICAgICAgICBnb3RvIHNraXA7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdHlwZSA9IGdldF90b2tlbihmcCwgcXVvdGVkX3N0cmluZ19idWZmZXIsIE1BWFRPS0VOKTsKICAgICAgICAgICAgaWYgKHR5cGUgIT0gUVVPVEVTVFJJTkcpIHsKICAgICAgICAgICAgICAgIHByaW50X2Vycm9yKCJCYWQgREVTQ1JJUFRJT04iLCBxdW90ZWRfc3RyaW5nX2J1ZmZlciwgdHlwZSk7CiAgICAgICAgICAgICAgICBnb3RvIHNraXA7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdHlwZSA9IGdldF90b2tlbihmcCwgdG9rZW4sIE1BWFRPS0VOKTsKICAgICAgICB9CiAgICB9CiAgICBpZiAodHlwZSAhPSBFUVVBTFMpCiAgICAgICAgcHJpbnRfZXJyb3IoIkV4cGVjdGVkIFwiOjo9XCIiLCB0b2tlbiwgdHlwZSk7CiAgc2tpcDoKICAgIHdoaWxlICh0eXBlICE9IEVRVUFMUyAmJiB0eXBlICE9IEVORE9GRklMRSkgewogICAgICAgIHR5cGUgPSBnZXRfdG9rZW4oZnAsIHF1b3RlZF9zdHJpbmdfYnVmZmVyLCBNQVhRVU9URVNUUik7CiAgICB9CiAgICByZXR1cm4gbWVyZ2VfcGFyc2Vfb2JqZWN0aWQobnAsIGZwLCBuYW1lKTsKfQoKLyoKICogUGFyc2VzIGEgbW9kdWxlIGlkZW50aXR5IG1hY3JvCiAqIFJldHVybnMgMCBvbiBlcnJvci4KICovCnN0YXRpYyB2b2lkCmNoZWNrX3V0Yyhjb25zdCBjaGFyICp1dGMpCnsKICAgIGludCAgICAgICAgICAgICBsZW4sIHllYXIsIG1vbnRoLCBkYXksIGhvdXIsIG1pbnV0ZTsKCiAgICBsZW4gPSBzdHJsZW4odXRjKTsKICAgIGlmICh1dGNbbGVuIC0gMV0gIT0gJ1onICYmIHV0Y1tsZW4gLSAxXSAhPSAneicpIHsKICAgICAgICBwcmludF9lcnJvcigiVGltZXN0YW1wIHNob3VsZCBlbmQgd2l0aCBaIiwgdXRjLCBRVU9URVNUUklORyk7CiAgICAgICAgcmV0dXJuOwogICAgfQogICAgaWYgKGxlbiA9PSAxMSkgewogICAgICAgIGxlbiA9CiAgICAgICAgICAgIHNzY2FuZih1dGMsICIlMmQlMmQlMmQlMmQlMmRaIiwgJnllYXIsICZtb250aCwgJmRheSwgJmhvdXIsCiAgICAgICAgICAgICAgICAgICAmbWludXRlKTsKICAgICAgICB5ZWFyICs9IDE5MDA7CiAgICB9IGVsc2UgaWYgKGxlbiA9PSAxMykKICAgICAgICBsZW4gPQogICAgICAgICAgICBzc2NhbmYodXRjLCAiJTRkJTJkJTJkJTJkJTJkWiIsICZ5ZWFyLCAmbW9udGgsICZkYXksICZob3VyLAogICAgICAgICAgICAgICAgICAgJm1pbnV0ZSk7CiAgICBlbHNlIHsKICAgICAgICBwcmludF9lcnJvcigiQmFkIHRpbWVzdGFtcCBmb3JtYXQgKDExIG9yIDEzIGNoYXJhY3RlcnMpIiwKICAgICAgICAgICAgICAgICAgICB1dGMsIFFVT1RFU1RSSU5HKTsKICAgICAgICByZXR1cm47CiAgICB9CiAgICBpZiAobGVuICE9IDUpIHsKICAgICAgICBwcmludF9lcnJvcigiQmFkIHRpbWVzdGFtcCBmb3JtYXQiLCB1dGMsIFFVT1RFU1RSSU5HKTsKICAgICAgICByZXR1cm47CiAgICB9CiAgICBpZiAobW9udGggPCAxIHx8IG1vbnRoID4gMTIpCiAgICAgICAgcHJpbnRfZXJyb3IoIkJhZCBtb250aCBpbiB0aW1lc3RhbXAiLCB1dGMsIFFVT1RFU1RSSU5HKTsKICAgIGlmIChkYXkgPCAxIHx8IGRheSA+IDMxKQogICAgICAgIHByaW50X2Vycm9yKCJCYWQgZGF5IGluIHRpbWVzdGFtcCIsIHV0YywgUVVPVEVTVFJJTkcpOwogICAgaWYgKGhvdXIgPCAwIHx8IGhvdXIgPiAyMykKICAgICAgICBwcmludF9lcnJvcigiQmFkIGhvdXIgaW4gdGltZXN0YW1wIiwgdXRjLCBRVU9URVNUUklORyk7CiAgICBpZiAobWludXRlIDwgMCB8fCBtaW51dGUgPiA1OSkKICAgICAgICBwcmludF9lcnJvcigiQmFkIG1pbnV0ZSBpbiB0aW1lc3RhbXAiLCB1dGMsIFFVT1RFU1RSSU5HKTsKfQoKc3RhdGljIHN0cnVjdCBub2RlICoKcGFyc2VfbW9kdWxlSWRlbnRpdHkoRklMRSAqIGZwLCBjaGFyICpuYW1lKQp7CiAgICByZWdpc3RlciBpbnQgICAgdHlwZTsKICAgIGNoYXIgICAgICAgICAgICB0b2tlbltNQVhUT0tFTl07CiAgICBjaGFyICAgICAgICAgICAgcXVvdGVkX3N0cmluZ19idWZmZXJbTUFYUVVPVEVTVFJdOwogICAgcmVnaXN0ZXIgc3RydWN0IG5vZGUgKm5wOwoKICAgIG5wID0gYWxsb2Nfbm9kZShjdXJyZW50X21vZHVsZSk7CiAgICBpZiAobnAgPT0gTlVMTCkKICAgICAgICByZXR1cm4gKE5VTEwpOwogICAgdHlwZSA9IGdldF90b2tlbihmcCwgdG9rZW4sIE1BWFRPS0VOKTsKICAgIGlmICh0eXBlICE9IExBU1RVUERBVEVEKSB7CiAgICAgICAgcHJpbnRfZXJyb3IoIkV4cGVjdGVkIExBU1QtVVBEQVRFRCIsIHRva2VuLCB0eXBlKTsKICAgICAgICBnb3RvIHNraXA7CiAgICB9CiAgICB0eXBlID0gZ2V0X3Rva2VuKGZwLCB0b2tlbiwgTUFYVE9LRU4pOwogICAgaWYgKHR5cGUgIT0gUVVPVEVTVFJJTkcpIHsKICAgICAgICBwcmludF9lcnJvcigiTmVlZCBTVFJJTkcgZm9yIExBU1QtVVBEQVRFRCIsIHRva2VuLCB0eXBlKTsKICAgICAgICBnb3RvIHNraXA7CiAgICB9CiAgICBjaGVja191dGModG9rZW4pOwogICAgdHlwZSA9IGdldF90b2tlbihmcCwgdG9rZW4sIE1BWFRPS0VOKTsKICAgIGlmICh0eXBlICE9IE9SR0FOSVpBVElPTikgewogICAgICAgIHByaW50X2Vycm9yKCJFeHBlY3RlZCBPUkdBTklaQVRJT04iLCB0b2tlbiwgdHlwZSk7CiAgICAgICAgZ290byBza2lwOwogICAgfQogICAgdHlwZSA9IGdldF90b2tlbihmcCwgdG9rZW4sIE1BWFRPS0VOKTsKICAgIGlmICh0eXBlICE9IFFVT1RFU1RSSU5HKSB7CiAgICAgICAgcHJpbnRfZXJyb3IoIkJhZCBPUkdBTklaQVRJT04iLCB0b2tlbiwgdHlwZSk7CiAgICAgICAgZ290byBza2lwOwogICAgfQogICAgdHlwZSA9IGdldF90b2tlbihmcCwgdG9rZW4sIE1BWFRPS0VOKTsKICAgIGlmICh0eXBlICE9IENPTlRBQ1RJTkZPKSB7CiAgICAgICAgcHJpbnRfZXJyb3IoIkV4cGVjdGVkIENPTlRBQ1QtSU5GTyIsIHRva2VuLCB0eXBlKTsKICAgICAgICBnb3RvIHNraXA7CiAgICB9CiAgICB0eXBlID0gZ2V0X3Rva2VuKGZwLCBxdW90ZWRfc3RyaW5nX2J1ZmZlciwgTUFYUVVPVEVTVFIpOwogICAgaWYgKHR5cGUgIT0gUVVPVEVTVFJJTkcpIHsKICAgICAgICBwcmludF9lcnJvcigiQmFkIENPTlRBQ1QtSU5GTyIsIHF1b3RlZF9zdHJpbmdfYnVmZmVyLCB0eXBlKTsKICAgICAgICBnb3RvIHNraXA7CiAgICB9CiAgICB0eXBlID0gZ2V0X3Rva2VuKGZwLCB0b2tlbiwgTUFYVE9LRU4pOwogICAgaWYgKHR5cGUgIT0gREVTQ1JJUFRJT04pIHsKICAgICAgICBwcmludF9lcnJvcigiRXhwZWN0ZWQgREVTQ1JJUFRJT04iLCB0b2tlbiwgdHlwZSk7CiAgICAgICAgZ290byBza2lwOwogICAgfQogICAgdHlwZSA9IGdldF90b2tlbihmcCwgcXVvdGVkX3N0cmluZ19idWZmZXIsIE1BWFFVT1RFU1RSKTsKICAgIGlmICh0eXBlICE9IFFVT1RFU1RSSU5HKSB7CiAgICAgICAgcHJpbnRfZXJyb3IoIkJhZCBERVNDUklQVElPTiIsIHF1b3RlZF9zdHJpbmdfYnVmZmVyLCB0eXBlKTsKICAgICAgICBnb3RvIHNraXA7CiAgICB9CiAgICBpZiAobmV0c25tcF9kc19nZXRfYm9vbGVhbihORVRTTk1QX0RTX0xJQlJBUllfSUQsIAoJCQkgICAgICAgTkVUU05NUF9EU19MSUJfU0FWRV9NSUJfREVTQ1JTKSkgewogICAgICAgIG5wLT5kZXNjcmlwdGlvbiA9IHN0cmR1cChxdW90ZWRfc3RyaW5nX2J1ZmZlcik7CiAgICB9CiAgICB0eXBlID0gZ2V0X3Rva2VuKGZwLCB0b2tlbiwgTUFYVE9LRU4pOwogICAgd2hpbGUgKHR5cGUgPT0gUkVWSVNJT04pIHsKICAgICAgICB0eXBlID0gZ2V0X3Rva2VuKGZwLCB0b2tlbiwgTUFYVE9LRU4pOwogICAgICAgIGlmICh0eXBlICE9IFFVT1RFU1RSSU5HKSB7CiAgICAgICAgICAgIHByaW50X2Vycm9yKCJCYWQgUkVWSVNJT04iLCB0b2tlbiwgdHlwZSk7CiAgICAgICAgICAgIGdvdG8gc2tpcDsKICAgICAgICB9CiAgICAgICAgY2hlY2tfdXRjKHRva2VuKTsKICAgICAgICB0eXBlID0gZ2V0X3Rva2VuKGZwLCB0b2tlbiwgTUFYVE9LRU4pOwogICAgICAgIGlmICh0eXBlICE9IERFU0NSSVBUSU9OKSB7CiAgICAgICAgICAgIHByaW50X2Vycm9yKCJFeHBlY3RlZCBERVNDUklQVElPTiIsIHRva2VuLCB0eXBlKTsKICAgICAgICAgICAgZ290byBza2lwOwogICAgICAgIH0KICAgICAgICB0eXBlID0gZ2V0X3Rva2VuKGZwLCBxdW90ZWRfc3RyaW5nX2J1ZmZlciwgTUFYUVVPVEVTVFIpOwogICAgICAgIGlmICh0eXBlICE9IFFVT1RFU1RSSU5HKSB7CiAgICAgICAgICAgIHByaW50X2Vycm9yKCJCYWQgREVTQ1JJUFRJT04iLCBxdW90ZWRfc3RyaW5nX2J1ZmZlciwgdHlwZSk7CiAgICAgICAgICAgIGdvdG8gc2tpcDsKICAgICAgICB9CiAgICAgICAgdHlwZSA9IGdldF90b2tlbihmcCwgdG9rZW4sIE1BWFRPS0VOKTsKICAgIH0KICAgIGlmICh0eXBlICE9IEVRVUFMUykKICAgICAgICBwcmludF9lcnJvcigiRXhwZWN0ZWQgXCI6Oj1cIiIsIHRva2VuLCB0eXBlKTsKICBza2lwOgogICAgd2hpbGUgKHR5cGUgIT0gRVFVQUxTICYmIHR5cGUgIT0gRU5ET0ZGSUxFKSB7CiAgICAgICAgdHlwZSA9IGdldF90b2tlbihmcCwgcXVvdGVkX3N0cmluZ19idWZmZXIsIE1BWFFVT1RFU1RSKTsKICAgIH0KICAgIHJldHVybiBtZXJnZV9wYXJzZV9vYmplY3RpZChucCwgZnAsIG5hbWUpOwp9CgoKLyoKICogUGFyc2VzIGEgTUFDUk8gZGVmaW5pdGlvbgogKiBFeHBlY3QgQkVHSU4sIGRpc2NhcmQgZXZlcnl0aGluZyB0byBlbmQuCiAqIFJldHVybnMgMCBvbiBlcnJvci4KICovCnN0YXRpYyBzdHJ1Y3Qgbm9kZSAqCnBhcnNlX21hY3JvKEZJTEUgKiBmcCwgY2hhciAqbmFtZSkKewogICAgcmVnaXN0ZXIgaW50ICAgIHR5cGU7CiAgICBjaGFyICAgICAgICAgICAgdG9rZW5bTUFYVE9LRU5dOwogICAgc3RydWN0IG5vZGUgICAgKm5wOwogICAgaW50ICAgICAgICAgICAgIGlMaW5lID0gbWliTGluZTsKCiAgICBucCA9IGFsbG9jX25vZGUoY3VycmVudF9tb2R1bGUpOwogICAgaWYgKG5wID09IE5VTEwpCiAgICAgICAgcmV0dXJuIChOVUxMKTsKICAgIHR5cGUgPSBnZXRfdG9rZW4oZnAsIHRva2VuLCBzaXplb2YodG9rZW4pKTsKICAgIHdoaWxlICh0eXBlICE9IEVRVUFMUyAmJiB0eXBlICE9IEVORE9GRklMRSkgewogICAgICAgIHR5cGUgPSBnZXRfdG9rZW4oZnAsIHRva2VuLCBzaXplb2YodG9rZW4pKTsKICAgIH0KICAgIGlmICh0eXBlICE9IEVRVUFMUykgewogICAgICAgIGlmIChucCkKICAgICAgICAgICAgZnJlZV9ub2RlKG5wKTsKICAgICAgICByZXR1cm4gTlVMTDsKICAgIH0KICAgIHdoaWxlICh0eXBlICE9IEJFR0lOICYmIHR5cGUgIT0gRU5ET0ZGSUxFKSB7CiAgICAgICAgdHlwZSA9IGdldF90b2tlbihmcCwgdG9rZW4sIHNpemVvZih0b2tlbikpOwogICAgfQogICAgaWYgKHR5cGUgIT0gQkVHSU4pIHsKICAgICAgICBpZiAobnApCiAgICAgICAgICAgIGZyZWVfbm9kZShucCk7CiAgICAgICAgcmV0dXJuIE5VTEw7CiAgICB9CiAgICB3aGlsZSAodHlwZSAhPSBFTkQgJiYgdHlwZSAhPSBFTkRPRkZJTEUpIHsKICAgICAgICB0eXBlID0gZ2V0X3Rva2VuKGZwLCB0b2tlbiwgc2l6ZW9mKHRva2VuKSk7CiAgICB9CiAgICBpZiAodHlwZSAhPSBFTkQpIHsKICAgICAgICBpZiAobnApCiAgICAgICAgICAgIGZyZWVfbm9kZShucCk7CiAgICAgICAgcmV0dXJuIE5VTEw7CiAgICB9CgogICAgaWYgKG5ldHNubXBfZHNfZ2V0X2ludChORVRTTk1QX0RTX0xJQlJBUllfSUQsIAoJCQkgICBORVRTTk1QX0RTX0xJQl9NSUJfV0FSTklOR1MpKSB7CiAgICAgICAgc25tcF9sb2coTE9HX1dBUk5JTkcsCiAgICAgICAgICAgICAgICAgIiVzIE1BQ1JPIChsaW5lcyAlZC4uJWQgcGFyc2VkIGFuZCBpZ25vcmVkKS5cbiIsIG5hbWUsCiAgICAgICAgICAgICAgICAgaUxpbmUsIG1pYkxpbmUpOwogICAgfQoKICAgIHJldHVybiBucDsKfQoKLyoKICogUGFyc2VzIGEgbW9kdWxlIGltcG9ydCBjbGF1c2UKICogICBsb2FkaW5nIGFueSBtb2R1bGVzIHJlZmVyZW5jZWQKICovCnN0YXRpYyB2b2lkCnBhcnNlX2ltcG9ydHMoRklMRSAqIGZwKQp7CiAgICByZWdpc3RlciBpbnQgICAgdHlwZTsKICAgIGNoYXIgICAgICAgICAgICB0b2tlbltNQVhUT0tFTl07CiAgICBjaGFyICAgICAgICAgICAgbW9kYnVmWzI1Nl07CiNkZWZpbmUgTUFYX0lNUE9SVFMJMjU2CiAgICBzdHJ1Y3QgbW9kdWxlX2ltcG9ydCBpbXBvcnRfbGlzdFtNQVhfSU1QT1JUU107CiAgICBpbnQgICAgICAgICAgICAgdGhpc19tb2R1bGU7CiAgICBzdHJ1Y3QgbW9kdWxlICAqbXA7CgogICAgaW50ICAgICAgICAgICAgIGltcG9ydF9jb3VudCA9IDA7ICAgLyogVG90YWwgbnVtYmVyIG9mIGltcG9ydGVkIGRlc2NyaXB0b3JzICovCiAgICBpbnQgICAgICAgICAgICAgaSA9IDAsIG9sZF9pOyAgICAgICAvKiBpbmRleCBvZiBmaXJzdCBpbXBvcnQgZnJvbSBlYWNoIG1vZHVsZSAqLwoKICAgIHR5cGUgPSBnZXRfdG9rZW4oZnAsIHRva2VuLCBNQVhUT0tFTik7CgogICAgLyoKICAgICAqIFBhcnNlIHRoZSBJTVBPUlRTIGNsYXVzZQogICAgICovCiAgICB3aGlsZSAodHlwZSAhPSBTRU1JICYmIHR5cGUgIT0gRU5ET0ZGSUxFKSB7CiAgICAgICAgaWYgKHR5cGUgPT0gTEFCRUwpIHsKICAgICAgICAgICAgaWYgKGltcG9ydF9jb3VudCA9PSBNQVhfSU1QT1JUUykgewogICAgICAgICAgICAgICAgcHJpbnRfZXJyb3IoIlRvbyBtYW55IGltcG9ydGVkIHN5bWJvbHMiLCB0b2tlbiwgdHlwZSk7CiAgICAgICAgICAgICAgICBkbyB7CiAgICAgICAgICAgICAgICAgICAgdHlwZSA9IGdldF90b2tlbihmcCwgdG9rZW4sIE1BWFRPS0VOKTsKICAgICAgICAgICAgICAgIH0gd2hpbGUgKHR5cGUgIT0gU0VNSSAmJiB0eXBlICE9IEVORE9GRklMRSk7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaW1wb3J0X2xpc3RbaW1wb3J0X2NvdW50KytdLmxhYmVsID0gc3RyZHVwKHRva2VuKTsKICAgICAgICB9IGVsc2UgaWYgKHR5cGUgPT0gRlJPTSkgewogICAgICAgICAgICB0eXBlID0gZ2V0X3Rva2VuKGZwLCB0b2tlbiwgTUFYVE9LRU4pOwogICAgICAgICAgICBpZiAoaW1wb3J0X2NvdW50ID09IGkpIHsgICAgLyogQWxsIGltcG9ydHMgYXJlIGhhbmRsZWQgaW50ZXJuYWxseSAqLwogICAgICAgICAgICAgICAgdHlwZSA9IGdldF90b2tlbihmcCwgdG9rZW4sIE1BWFRPS0VOKTsKICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRoaXNfbW9kdWxlID0gd2hpY2hfbW9kdWxlKHRva2VuKTsKCiAgICAgICAgICAgIGZvciAob2xkX2kgPSBpOyBpIDwgaW1wb3J0X2NvdW50OyArK2kpCiAgICAgICAgICAgICAgICBpbXBvcnRfbGlzdFtpXS5tb2RpZCA9IHRoaXNfbW9kdWxlOwoKICAgICAgICAgICAgLyoKICAgICAgICAgICAgICogUmVjdXJzaXZlbHkgcmVhZCBhbnkgcHJlLXJlcXVpc2l0ZSBtb2R1bGVzCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBpZiAocmVhZF9tb2R1bGVfaW50ZXJuYWwodG9rZW4pID09IE1PRFVMRV9OT1RfRk9VTkQpIHsKCQlpbnQgZm91bmQgPSAwOwogICAgICAgICAgICAgICAgZm9yICg7IG9sZF9pIDwgaW1wb3J0X2NvdW50OyArK29sZF9pKSB7CiAgICAgICAgICAgICAgICAgICAgZm91bmQgKz0gcmVhZF9pbXBvcnRfcmVwbGFjZW1lbnRzKHRva2VuLCAmaW1wb3J0X2xpc3Rbb2xkX2ldKTsKICAgICAgICAgICAgICAgIH0KCQlpZiAoIWZvdW5kKQoJCSAgICBwcmludF9tb2R1bGVfbm90X2ZvdW5kKHRva2VuKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICB0eXBlID0gZ2V0X3Rva2VuKGZwLCB0b2tlbiwgTUFYVE9LRU4pOwogICAgfQoKICAgIC8qCiAgICAgKiBTYXZlIHRoZSBpbXBvcnQgaW5mb3JtYXRpb24KICAgICAqICAgaW4gdGhlIGdsb2JhbCBtb2R1bGUgdGFibGUKICAgICAqLwogICAgZm9yIChtcCA9IG1vZHVsZV9oZWFkOyBtcDsgbXAgPSBtcC0+bmV4dCkKICAgICAgICBpZiAobXAtPm1vZGlkID09IGN1cnJlbnRfbW9kdWxlKSB7CiAgICAgICAgICAgIGlmIChpbXBvcnRfY291bnQgPT0gMCkKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgaWYgKG1wLT5pbXBvcnRzICYmIChtcC0+aW1wb3J0cyAhPSByb290X2ltcG9ydHMpKSB7CiAgICAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICAgICogdGhpcyBjYW4gaGFwcGVuIGlmIGFsbCBtb2R1bGVzIGFyZSBpbiBvbmUgc291cmNlIGZpbGUuIAogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbXAtPm5vX2ltcG9ydHM7ICsraSkgewogICAgICAgICAgICAgICAgICAgIERFQlVHTVNHVEwoKCJwYXJzZS1taWJzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIyMjIyBmcmVlaW5nIE1vZHVsZSAlZCAnJXMnICVkXG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1wLT5tb2RpZCwgbXAtPmltcG9ydHNbaV0ubGFiZWwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXAtPmltcG9ydHNbaV0ubW9kaWQpKTsKICAgICAgICAgICAgICAgICAgICBmcmVlKChjaGFyICopIG1wLT5pbXBvcnRzW2ldLmxhYmVsKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZyZWUoKGNoYXIgKikgbXAtPmltcG9ydHMpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIG1wLT5pbXBvcnRzID0gKHN0cnVjdCBtb2R1bGVfaW1wb3J0ICopCiAgICAgICAgICAgICAgICBjYWxsb2MoaW1wb3J0X2NvdW50LCBzaXplb2Yoc3RydWN0IG1vZHVsZV9pbXBvcnQpKTsKICAgICAgICAgICAgaWYgKG1wLT5pbXBvcnRzID09IE5VTEwpCiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBpbXBvcnRfY291bnQ7ICsraSkgewogICAgICAgICAgICAgICAgbXAtPmltcG9ydHNbaV0ubGFiZWwgPSBpbXBvcnRfbGlzdFtpXS5sYWJlbDsKICAgICAgICAgICAgICAgIG1wLT5pbXBvcnRzW2ldLm1vZGlkID0gaW1wb3J0X2xpc3RbaV0ubW9kaWQ7CiAgICAgICAgICAgICAgICBERUJVR01TR1RMKCgicGFyc2UtbWlicyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIyMjIyBhZGRpbmcgTW9kdWxlICVkICclcycgJWRcbiIsIG1wLT5tb2RpZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1wLT5pbXBvcnRzW2ldLmxhYmVsLCBtcC0+aW1wb3J0c1tpXS5tb2RpZCkpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIG1wLT5ub19pbXBvcnRzID0gaW1wb3J0X2NvdW50OwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgIC8qCiAgICAgKiBTaG91bGRuJ3QgZ2V0IHRoaXMgZmFyCiAgICAgKi8KICAgIHByaW50X21vZHVsZV9ub3RfZm91bmQobW9kdWxlX25hbWUoY3VycmVudF9tb2R1bGUsIG1vZGJ1ZikpOwogICAgcmV0dXJuOwp9CgoKCi8qCiAqIE1JQiBtb2R1bGUgaGFuZGxpbmcgcm91dGluZXMKICovCgpzdGF0aWMgdm9pZApkdW1wX21vZHVsZV9saXN0KHZvaWQpCnsKICAgIHN0cnVjdCBtb2R1bGUgICptcCA9IG1vZHVsZV9oZWFkOwoKICAgIERFQlVHTVNHVEwoKCJwYXJzZS1taWJzIiwgIk1vZHVsZSBsaXN0OlxuIikpOwogICAgd2hpbGUgKG1wKSB7CiAgICAgICAgREVCVUdNU0dUTCgoInBhcnNlLW1pYnMiLCAiICAlcyAlZCAlcyAlZFxuIiwgbXAtPm5hbWUsIG1wLT5tb2RpZCwKICAgICAgICAgICAgICAgICAgICBtcC0+ZmlsZSwgbXAtPm5vX2ltcG9ydHMpKTsKICAgICAgICBtcCA9IG1wLT5uZXh0OwogICAgfQp9CgppbnQKd2hpY2hfbW9kdWxlKGNvbnN0IGNoYXIgKm5hbWUpCnsKICAgIHN0cnVjdCBtb2R1bGUgICptcDsKCiAgICBmb3IgKG1wID0gbW9kdWxlX2hlYWQ7IG1wOyBtcCA9IG1wLT5uZXh0KQogICAgICAgIGlmICghbGFiZWxfY29tcGFyZShtcC0+bmFtZSwgbmFtZSkpCiAgICAgICAgICAgIHJldHVybiAobXAtPm1vZGlkKTsKCiAgICBERUJVR01TR1RMKCgicGFyc2UtbWlicyIsICJNb2R1bGUgJXMgbm90IGZvdW5kXG4iLCBuYW1lKSk7CiAgICByZXR1cm4gKC0xKTsKfQoKLyoKICogbW9kdWxlX25hbWUgLSBjb3B5IG1vZHVsZSBuYW1lIHRvIHVzZXIgYnVmZmVyLCByZXR1cm4gcHRyIHRvIHNhbWUuCiAqLwpjaGFyICAgICAgICAgICAqCm1vZHVsZV9uYW1lKGludCBtb2RpZCwgY2hhciAqY3ApCnsKICAgIHN0cnVjdCBtb2R1bGUgICptcDsKCiAgICBmb3IgKG1wID0gbW9kdWxlX2hlYWQ7IG1wOyBtcCA9IG1wLT5uZXh0KQogICAgICAgIGlmIChtcC0+bW9kaWQgPT0gbW9kaWQpIHsKICAgICAgICAgICAgc3RyY3B5KGNwLCBtcC0+bmFtZSk7CiAgICAgICAgICAgIHJldHVybiAoY3ApOwogICAgICAgIH0KCiAgICBpZiAobW9kaWQgIT0gLTEpIERFQlVHTVNHVEwoKCJwYXJzZS1taWJzIiwgIk1vZHVsZSAlZCBub3QgZm91bmRcbiIsIG1vZGlkKSk7CiAgICBzcHJpbnRmKGNwLCAiIyVkIiwgbW9kaWQpOwogICAgcmV0dXJuIChjcCk7Cn0KCi8qCiAqICBCYWNrd2FyZHMgY29tcGF0YWJpbGl0eQogKiAgUmVhZCBuZXdlciBtb2R1bGVzIHRoYXQgcmVwbGFjZSB0aGUgb25lIHNwZWNpZmllZDotCiAqICAgICAgZWl0aGVyIGFsbCBvZiB0aGVtIChyZWFkX21vZHVsZV9yZXBsYWNlbWVudHMpLAogKiAgICAgIG9yIHRob3NlIHJlbGF0aW5nIHRvIGEgc3BlY2lmaWVkIGlkZW50aWZpZXIgKHJlYWRfaW1wb3J0X3JlcGxhY2VtZW50cykKICogICAgICBwbHVzIGFuIGludGVyZmFjZSB0byBhZGQgbmV3IHJlcGxhY2VtZW50IHJlcXVpcmVtZW50cwogKi8Kdm9pZAphZGRfbW9kdWxlX3JlcGxhY2VtZW50KGNvbnN0IGNoYXIgKm9sZF9tb2R1bGUsCiAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqbmV3X21vZHVsZV9uYW1lLAogICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnRhZywgaW50IGxlbikKewogICAgc3RydWN0IG1vZHVsZV9jb21wYXRhYmlsaXR5ICptY3A7CgogICAgbWNwID0gKHN0cnVjdCBtb2R1bGVfY29tcGF0YWJpbGl0eSAqKQogICAgICAgIGNhbGxvYygxLCBzaXplb2Yoc3RydWN0IG1vZHVsZV9jb21wYXRhYmlsaXR5KSk7CiAgICBpZiAobWNwID09IE5VTEwpCiAgICAgICAgcmV0dXJuOwoKICAgIG1jcC0+b2xkX21vZHVsZSA9IHN0cmR1cChvbGRfbW9kdWxlKTsKICAgIG1jcC0+bmV3X21vZHVsZSA9IHN0cmR1cChuZXdfbW9kdWxlX25hbWUpOwogICAgaWYgKHRhZykKICAgICAgICBtY3AtPnRhZyA9IHN0cmR1cCh0YWcpOwogICAgbWNwLT50YWdfbGVuID0gbGVuOwoKICAgIG1jcC0+bmV4dCA9IG1vZHVsZV9tYXBfaGVhZDsKICAgIG1vZHVsZV9tYXBfaGVhZCA9IG1jcDsKfQoKc3RhdGljIGludApyZWFkX21vZHVsZV9yZXBsYWNlbWVudHMoY29uc3QgY2hhciAqbmFtZSkKewogICAgc3RydWN0IG1vZHVsZV9jb21wYXRhYmlsaXR5ICptY3A7CgogICAgZm9yIChtY3AgPSBtb2R1bGVfbWFwX2hlYWQ7IG1jcDsgbWNwID0gbWNwLT5uZXh0KSB7CiAgICAgICAgaWYgKCFsYWJlbF9jb21wYXJlKG1jcC0+b2xkX21vZHVsZSwgbmFtZSkpIHsKICAgICAgICAgICAgaWYgKG5ldHNubXBfZHNfZ2V0X2ludChORVRTTk1QX0RTX0xJQlJBUllfSUQsIAoJCQkJICAgTkVUU05NUF9EU19MSUJfTUlCX1dBUk5JTkdTKSkgewogICAgICAgICAgICAgICAgc25tcF9sb2coTE9HX1dBUk5JTkcsCiAgICAgICAgICAgICAgICAgICAgICAgICAiTG9hZGluZyByZXBsYWNlbWVudCBtb2R1bGUgJXMgZm9yICVzICglcylcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICBtY3AtPm5ld19tb2R1bGUsIG5hbWUsIEZpbGUpOwoJICAgIH0KICAgICAgICAgICAgKHZvaWQpIG5ldHNubXBfcmVhZF9tb2R1bGUobWNwLT5uZXdfbW9kdWxlKTsKICAgICAgICAgICAgcmV0dXJuIDE7CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuIDA7Cn0KCnN0YXRpYyBpbnQKcmVhZF9pbXBvcnRfcmVwbGFjZW1lbnRzKGNvbnN0IGNoYXIgKm9sZF9tb2R1bGVfbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBtb2R1bGVfaW1wb3J0ICppZGVudGlmaWVyKQp7CiAgICBzdHJ1Y3QgbW9kdWxlX2NvbXBhdGFiaWxpdHkgKm1jcDsKCiAgICAvKgogICAgICogTG9vayBmb3IgbWF0Y2hlcyBmaXJzdAogICAgICovCiAgICBmb3IgKG1jcCA9IG1vZHVsZV9tYXBfaGVhZDsgbWNwOyBtY3AgPSBtY3AtPm5leHQpIHsKICAgICAgICBpZiAoIWxhYmVsX2NvbXBhcmUobWNwLT5vbGRfbW9kdWxlLCBvbGRfbW9kdWxlX25hbWUpKSB7CgogICAgICAgICAgICBpZiAoICAgICAgICAgICAgICAgIC8qIGV4YWN0IG1hdGNoICovCiAgICAgICAgICAgICAgICAgICAobWNwLT50YWdfbGVuID09IDAgJiYKICAgICAgICAgICAgICAgICAgICAobWNwLT50YWcgPT0gTlVMTCB8fAogICAgICAgICAgICAgICAgICAgICAhbGFiZWxfY29tcGFyZShtY3AtPnRhZywgaWRlbnRpZmllci0+bGFiZWwpKSkgfHwKICAgICAgICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgICAgICAgKiBwcmVmaXggbWF0Y2ggCiAgICAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgICAgIChtY3AtPnRhZ19sZW4gIT0gMCAmJgogICAgICAgICAgICAgICAgICAgICFzdHJuY21wKG1jcC0+dGFnLCBpZGVudGlmaWVyLT5sYWJlbCwgbWNwLT50YWdfbGVuKSkKICAgICAgICAgICAgICAgICkgewoKICAgICAgICAgICAgICAgIGlmIChuZXRzbm1wX2RzX2dldF9pbnQoTkVUU05NUF9EU19MSUJSQVJZX0lELCAKCQkJCSAgICAgICBORVRTTk1QX0RTX0xJQl9NSUJfV0FSTklOR1MpKSB7CiAgICAgICAgICAgICAgICAgICAgc25tcF9sb2coTE9HX1dBUk5JTkcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkltcG9ydGluZyAlcyBmcm9tIHJlcGxhY2VtZW50IG1vZHVsZSAlcyBpbnN0ZWFkIG9mICVzICglcylcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWRlbnRpZmllci0+bGFiZWwsIG1jcC0+bmV3X21vZHVsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbGRfbW9kdWxlX25hbWUsIEZpbGUpOwoJCX0KICAgICAgICAgICAgICAgICh2b2lkKSBuZXRzbm1wX3JlYWRfbW9kdWxlKG1jcC0+bmV3X21vZHVsZSk7CiAgICAgICAgICAgICAgICBpZGVudGlmaWVyLT5tb2RpZCA9IHdoaWNoX21vZHVsZShtY3AtPm5ld19tb2R1bGUpOwogICAgICAgICAgICAgICAgcmV0dXJuIDE7ICAgICAgICAgLyogZmluaXNoZWQhICovCiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgLyoKICAgICAqIElmIG5vIGV4YWN0IG1hdGNoLCBsb2FkIGV2ZXJ5dGhpbmcgcmVsZXZhbnQKICAgICAqLwogICAgcmV0dXJuIHJlYWRfbW9kdWxlX3JlcGxhY2VtZW50cyhvbGRfbW9kdWxlX25hbWUpOwp9CgoKLyoKICogIFJlYWQgaW4gdGhlIG5hbWVkIG1vZHVsZQogKiAgICAgIFJldHVybnMgdGhlIHJvb3Qgb2YgdGhlIHdob2xlIHRyZWUKICogICAgICAoYnkgYW5hbG9neSB3aXRoICdyZWFkX21pYicpCiAqLwpzdGF0aWMgaW50CnJlYWRfbW9kdWxlX2ludGVybmFsKGNvbnN0IGNoYXIgKm5hbWUpCnsKICAgIHN0cnVjdCBtb2R1bGUgICptcDsKICAgIEZJTEUgICAgICAgICAgICpmcDsKCiAgICBuZXRzbm1wX2luaXRfbWliX2ludGVybmFscygpOwoKICAgIGZvciAobXAgPSBtb2R1bGVfaGVhZDsgbXA7IG1wID0gbXAtPm5leHQpCiAgICAgICAgaWYgKCFsYWJlbF9jb21wYXJlKG1wLT5uYW1lLCBuYW1lKSkgewogICAgICAgICAgICBjb25zdCBjaGFyICAgICAqb2xkRmlsZSA9IEZpbGU7CiAgICAgICAgICAgIGludCAgICAgICAgICAgICBvbGRMaW5lID0gbWliTGluZTsKICAgICAgICAgICAgaW50ICAgICAgICAgICAgIG9sZE1vZHVsZSA9IGN1cnJlbnRfbW9kdWxlOwoKICAgICAgICAgICAgaWYgKG1wLT5ub19pbXBvcnRzICE9IC0xKSB7CiAgICAgICAgICAgICAgICBERUJVR01TR1RMKCgicGFyc2UtbWlicyIsICJNb2R1bGUgJXMgYWxyZWFkeSBsb2FkZWRcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lKSk7CiAgICAgICAgICAgICAgICByZXR1cm4gTU9EVUxFX0FMUkVBRFlfTE9BREVEOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICgoZnAgPSBmb3BlbihtcC0+ZmlsZSwgInIiKSkgPT0gTlVMTCkgewogICAgICAgICAgICAgICAgc25tcF9sb2dfcGVycm9yKG1wLT5maWxlKTsKICAgICAgICAgICAgICAgIHJldHVybiBNT0RVTEVfTE9BRF9GQUlMRUQ7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgbXAtPm5vX2ltcG9ydHMgPSAwOyAvKiBOb3RlIHRoYXQgd2UndmUgcmVhZCB0aGUgZmlsZSAqLwogICAgICAgICAgICBGaWxlID0gbXAtPmZpbGU7CiAgICAgICAgICAgIG1pYkxpbmUgPSAxOwogICAgICAgICAgICBjdXJyZW50X21vZHVsZSA9IG1wLT5tb2RpZDsKICAgICAgICAgICAgLyoKICAgICAgICAgICAgICogUGFyc2UgdGhlIGZpbGUKICAgICAgICAgICAgICovCiAgICAgICAgICAgIHBhcnNlKGZwLCBOVUxMKTsKICAgICAgICAgICAgZmNsb3NlKGZwKTsKICAgICAgICAgICAgRmlsZSA9IG9sZEZpbGU7CiAgICAgICAgICAgIG1pYkxpbmUgPSBvbGRMaW5lOwogICAgICAgICAgICBjdXJyZW50X21vZHVsZSA9IG9sZE1vZHVsZTsKICAgICAgICAgICAgcmV0dXJuIE1PRFVMRV9MT0FERURfT0s7CiAgICAgICAgfQoKICAgIHJldHVybiBNT0RVTEVfTk9UX0ZPVU5EOwp9Cgp2b2lkCmFkb3B0X29ycGhhbnModm9pZCkKewogICAgc3RydWN0IG5vZGUgICAgKm5wLCAqb25wOwogICAgc3RydWN0IHRyZWUgICAgKnRwOwogICAgaW50ICAgICAgICAgICAgIGksIGFkb3B0ZWQgPSAxOwoKICAgIGlmICghb3JwaGFuX25vZGVzKQogICAgICAgIHJldHVybjsKICAgIGluaXRfbm9kZV9oYXNoKG9ycGhhbl9ub2Rlcyk7CiAgICBvcnBoYW5fbm9kZXMgPSBOVUxMOwoKICAgIHdoaWxlIChhZG9wdGVkKSB7CiAgICAgICAgYWRvcHRlZCA9IDA7CiAgICAgICAgZm9yIChpID0gMDsgaSA8IE5IQVNIU0laRTsgaSsrKQogICAgICAgICAgICBpZiAobmJ1Y2tldHNbaV0pIHsKICAgICAgICAgICAgICAgIGZvciAobnAgPSBuYnVja2V0c1tpXTsgbnAgIT0gTlVMTDsgbnAgPSBucC0+bmV4dCkgewogICAgICAgICAgICAgICAgICAgIHRwID0gZmluZF90cmVlX25vZGUobnAtPnBhcmVudCwgLTEpOwoJCSAgICBpZiAodHApIHsKCQkJZG9fc3VidHJlZSh0cCwgJm5wKTsKCQkJYWRvcHRlZCA9IDE7CiAgICAgICAgICAgICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgICAgICAgICAgICAqIGlmIGRvX3N1YnRyZWUgYWRvcHRlZCB0aGUgZW50aXJlIGJ1Y2tldCwgc3RvcAogICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgICAgICAgICAgaWYoTlVMTCA9PSBuYnVja2V0c1tpXSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgICAgICAgICAgICogZG9fc3VidHJlZSBtYXkgbW9kaWZ5IG5idWNrZXRzLCBhbmQgaWYgbnAKICAgICAgICAgICAgICAgICAgICAgICAgICogd2FzIGFkb3B0ZWQsIG5wLT5uZXh0IHByb2JhYmx5IGlzbid0IGFuIG9ycGhhbgogICAgICAgICAgICAgICAgICAgICAgICAgKiBhbnltb3JlLiBpZiBucCBpcyBzdGlsbCBpbiB0aGUgYnVja2V0IChkb19zdWJ0cmVlCiAgICAgICAgICAgICAgICAgICAgICAgICAqIGRpZG4ndCBhZG9wdCBpdCkga2VlcCBvbiBwbHVnZ2luZy4gb3RoZXJ3aXNlCiAgICAgICAgICAgICAgICAgICAgICAgICAqIHN0YXJ0IG92ZXIsIGF0IHRoZSB0b3Agb2YgdGhlIGJ1Y2tldC4KICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAgICAgICAgIGZvcihvbnAgPSBuYnVja2V0c1tpXTsgb25wOyBvbnAgPSBvbnAtPm5leHQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihvbnAgPT0gbnApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmKE5VTEwgPT0gb25wKSB7IC8qIG5vdCBpbiB0aGUgbGlzdCAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgbnAgPSBuYnVja2V0c1tpXTsgLyogc3RhcnQgb3ZlciAqLwogICAgICAgICAgICAgICAgICAgICAgICB9CgkJICAgIH0KCQl9CiAgICAgICAgICAgIH0KICAgIH0KCiAgICAvKgogICAgICogUmVwb3J0IG9uIG91dHN0YW5kaW5nIG9ycGhhbnMKICAgICAqICAgIGFuZCBsaW5rIHRoZW0gYmFjayBpbnRvIHRoZSBvcnBoYW4gbGlzdAogICAgICovCiAgICBmb3IgKGkgPSAwOyBpIDwgTkhBU0hTSVpFOyBpKyspCiAgICAgICAgaWYgKG5idWNrZXRzW2ldKSB7CiAgICAgICAgICAgIGlmIChvcnBoYW5fbm9kZXMpCiAgICAgICAgICAgICAgICBvbnAgPSBucC0+bmV4dCA9IG5idWNrZXRzW2ldOwogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICBvbnAgPSBvcnBoYW5fbm9kZXMgPSBuYnVja2V0c1tpXTsKICAgICAgICAgICAgbmJ1Y2tldHNbaV0gPSBOVUxMOwogICAgICAgICAgICB3aGlsZSAob25wKSB7CiAgICAgICAgICAgICAgICBjaGFyICAgICAgICAgICAgbW9kYnVmWzI1Nl07CiAgICAgICAgICAgICAgICBzbm1wX2xvZyhMT0dfV0FSTklORywKICAgICAgICAgICAgICAgICAgICAgICAgICJDYW5ub3QgYWRvcHQgT0lEIGluICVzOiAlcyA6Oj0geyAlcyAlbGQgfVxuIiwKICAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZV9uYW1lKG9ucC0+bW9kaWQsIG1vZGJ1ZiksCiAgICAgICAgICAgICAgICAgICAgICAgICAob25wLT5sYWJlbCA/IG9ucC0+bGFiZWwgOiAiPG5vIGxhYmVsPiIpLAogICAgICAgICAgICAgICAgICAgICAgICAgKG9ucC0+cGFyZW50ID8gb25wLT5wYXJlbnQgOiAiPG5vIHBhcmVudD4iKSwKICAgICAgICAgICAgICAgICAgICAgICAgIG9ucC0+c3ViaWQpOwoKICAgICAgICAgICAgICAgIG5wID0gb25wOwogICAgICAgICAgICAgICAgb25wID0gb25wLT5uZXh0OwogICAgICAgICAgICB9CiAgICAgICAgfQp9CgojaWZuZGVmIE5FVFNOTVBfTk9fTEVHQUNZX0RFRklOSVRJT05TCnN0cnVjdCB0cmVlICAgICoKcmVhZF9tb2R1bGUoY29uc3QgY2hhciAqbmFtZSkKewogICAgcmV0dXJuIG5ldHNubXBfcmVhZF9tb2R1bGUobmFtZSk7Cn0KI2VuZGlmCgpzdHJ1Y3QgdHJlZSAgICAqCm5ldHNubXBfcmVhZF9tb2R1bGUoY29uc3QgY2hhciAqbmFtZSkKewogICAgaWYgKHJlYWRfbW9kdWxlX2ludGVybmFsKG5hbWUpID09IE1PRFVMRV9OT1RfRk9VTkQpCiAgICAgICAgaWYgKCFyZWFkX21vZHVsZV9yZXBsYWNlbWVudHMobmFtZSkpCgkgICAgcHJpbnRfbW9kdWxlX25vdF9mb3VuZChuYW1lKTsKICAgIHJldHVybiB0cmVlX2hlYWQ7Cn0KCi8qCiAqIFByb3RvdHlwZSBkZWZpbml0aW9uIAogKi8Kdm9pZCAgICAgICAgICAgIHVubG9hZF9tb2R1bGVfYnlfSUQoaW50IG1vZElELCBzdHJ1Y3QgdHJlZSAqdHJlZV90b3ApOwoKdm9pZAp1bmxvYWRfbW9kdWxlX2J5X0lEKGludCBtb2RJRCwgc3RydWN0IHRyZWUgKnRyZWVfdG9wKQp7CiAgICBzdHJ1Y3QgdHJlZSAgICAqdHAsICpuZXh0OwogICAgaW50ICAgICAgICAgICAgIGk7CgogICAgZm9yICh0cCA9IHRyZWVfdG9wOyB0cDsgdHAgPSBuZXh0KSB7CiAgICAgICAgLyoKICAgICAgICAgKiBFc3NlbnRpYWxseSwgdGhpcyBpcyBlcXVpdmFsZW50IHRvIHRoZSBjb2RlIGZyYWdtZW50OgogICAgICAgICAqICAgICAgaWYgKHRwLT5tb2RJRCA9PSBtb2RJRCkKICAgICAgICAgKiAgICAgICAgdHAtPm51bWJlcl9tb2R1bGVzLS07CiAgICAgICAgICogYnV0IGhhbmRsZXMgb25lIHRyZWUgbm9kZSBiZWluZyBwYXJ0IG9mIHNldmVyYWwgbW9kdWxlcywKICAgICAgICAgKiBhbmQgcG9zc2libGUgbXVsdGlwbGUgY29waWVzIG9mIHRoZSBzYW1lIG1vZHVsZSBJRC4KICAgICAgICAgKi8KICAgICAgICBpbnQgICAgICAgICAgICAgbm1vZCA9IHRwLT5udW1iZXJfbW9kdWxlczsKICAgICAgICBpZiAobm1vZCA+IDApIHsgICAgICAgICAvKiBpbiBzb21lIG1vZHVsZSAqLwogICAgICAgICAgICAvKgogICAgICAgICAgICAgKiBSZW1vdmUgYWxsIGNvcGllcyBvZiB0aGlzIG1vZHVsZSBJRAogICAgICAgICAgICAgKi8KICAgICAgICAgICAgaW50ICAgICAgICAgICAgIGNudCA9IDAsICpwaTEsICpwaTIgPSB0cC0+bW9kdWxlX2xpc3Q7CiAgICAgICAgICAgIGZvciAoaSA9IDAsIHBpMSA9IHBpMjsgaSA8IG5tb2Q7IGkrKywgcGkyKyspIHsKICAgICAgICAgICAgICAgIGlmICgqcGkyID09IG1vZElEKQogICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgY250Kys7CiAgICAgICAgICAgICAgICAqcGkxKysgPSAqcGkyOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChubW9kICE9IGNudCkgeyAgLyogaW4gdGhpcyBtb2R1bGUgKi8KICAgICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgICAgKiBpZiAoIChubW9kIC0gY250KSA+IDEpCiAgICAgICAgICAgICAgICAgKiBwcmludGYoIkR1cCBtb2RpZCAlZCwgICVkIHRpbWVzLCAnJXMnXG4iLCB0cC0+bW9kaWQsIChubW9kLWNudCksIHRwLT5sYWJlbCk7IGZmbHVzaChzdGRvdXQpOyA/KiBYWERFQlVHIAogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICB0cC0+bnVtYmVyX21vZHVsZXMgPSBjbnQ7CiAgICAgICAgICAgICAgICBzd2l0Y2ggKGNudCkgewogICAgICAgICAgICAgICAgY2FzZSAwOgogICAgICAgICAgICAgICAgICAgIHRwLT5tb2R1bGVfbGlzdFswXSA9IC0xOyAgICAvKiBNYXJrIHVudXNlZCwgYW5kIEZBTEwgVEhST1VHSCAqLwoKICAgICAgICAgICAgICAgIGNhc2UgMTogICAgICAgIC8qIHNhdmUgdGhlIHJlbWFpbmluZyBtb2R1bGUgKi8KICAgICAgICAgICAgICAgICAgICBpZiAoJih0cC0+bW9kaWQpICE9IHRwLT5tb2R1bGVfbGlzdCkgewogICAgICAgICAgICAgICAgICAgICAgICB0cC0+bW9kaWQgPSB0cC0+bW9kdWxlX2xpc3RbMF07CiAgICAgICAgICAgICAgICAgICAgICAgIGZyZWUodHAtPm1vZHVsZV9saXN0KTsKICAgICAgICAgICAgICAgICAgICAgICAgdHAtPm1vZHVsZV9saXN0ID0gJih0cC0+bW9kaWQpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgIC8qIGlmIHRyZWUgbm9kZSBpcyBpbiB0aGlzIG1vZHVsZSAqLwogICAgICAgIH0KICAgICAgICAvKgogICAgICAgICAqIGlmIHRyZWUgbm9kZSBpcyBpbiBzb21lIG1vZHVsZSAKICAgICAgICAgKi8KICAgICAgICBuZXh0ID0gdHAtPm5leHRfcGVlcjsKCgogICAgICAgIC8qCiAgICAgICAgICogIE9LIC0gdGhhdCdzIGRlYWx0IHdpdGggKnRoaXMqIG5vZGUuCiAgICAgICAgICogICAgTm93IGxldCdzIGxvb2sgYXQgdGhlIGNoaWxkcmVuLgogICAgICAgICAqICAgIChJc24ndCByZWN1cnNpb24gd29uZGVyZnVsISkKICAgICAgICAgKi8KICAgICAgICBpZiAodHAtPmNoaWxkX2xpc3QpCiAgICAgICAgICAgIHVubG9hZF9tb2R1bGVfYnlfSUQobW9kSUQsIHRwLT5jaGlsZF9saXN0KTsKCgogICAgICAgIGlmICh0cC0+bnVtYmVyX21vZHVsZXMgPT0gMCkgewogICAgICAgICAgICAvKgogICAgICAgICAgICAgKiBUaGlzIG5vZGUgaXNuJ3QgbmVlZGVkIGFueSBtb3JlIChleGNlcHQgcGVyaGFwcwogICAgICAgICAgICAgKiBmb3IgdGhlIHNha2Ugb2YgdGhlIGNoaWxkcmVuKSAKICAgICAgICAgICAgICovCiAgICAgICAgICAgIGlmICh0cC0+Y2hpbGRfbGlzdCA9PSBOVUxMKSB7CiAgICAgICAgICAgICAgICB1bmxpbmtfdHJlZSh0cCk7CiAgICAgICAgICAgICAgICBmcmVlX3RyZWUodHApOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgZnJlZV9wYXJ0aWFsX3RyZWUodHAsIFRSVUUpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQp9CgojaWZuZGVmIE5FVFNOTVBfTk9fTEVHQUNZX0RFRklOSVRJT05TCmludAp1bmxvYWRfbW9kdWxlKGNvbnN0IGNoYXIgKm5hbWUpCnsKICAgIHJldHVybiBuZXRzbm1wX3VubG9hZF9tb2R1bGUobmFtZSk7Cn0KI2VuZGlmCgppbnQKbmV0c25tcF91bmxvYWRfbW9kdWxlKGNvbnN0IGNoYXIgKm5hbWUpCnsKICAgIHN0cnVjdCBtb2R1bGUgICptcDsKICAgIGludCAgICAgICAgICAgICBtb2RJRCA9IC0xOwoKICAgIGZvciAobXAgPSBtb2R1bGVfaGVhZDsgbXA7IG1wID0gbXAtPm5leHQpCiAgICAgICAgaWYgKCFsYWJlbF9jb21wYXJlKG1wLT5uYW1lLCBuYW1lKSkgewogICAgICAgICAgICBtb2RJRCA9IG1wLT5tb2RpZDsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQoKICAgIGlmIChtb2RJRCA9PSAtMSkgewogICAgICAgIERFQlVHTVNHVEwoKCJ1bmxvYWQtbWliIiwgIk1vZHVsZSAlcyBub3QgZm91bmQgdG8gdW5sb2FkXG4iLAogICAgICAgICAgICAgICAgICAgIG5hbWUpKTsKICAgICAgICByZXR1cm4gTU9EVUxFX05PVF9GT1VORDsKICAgIH0KICAgIHVubG9hZF9tb2R1bGVfYnlfSUQobW9kSUQsIHRyZWVfaGVhZCk7CiAgICBtcC0+bm9faW1wb3J0cyA9IC0xOyAgICAgICAgLyogbWFyayBhcyB1bmxvYWRlZCAqLwogICAgcmV0dXJuIE1PRFVMRV9MT0FERURfT0s7ICAgIC8qIFdlbGwsIHlvdSBrbm93IHdoYXQgSSBtZWFuISAqLwp9CgovKgogKiBDbGVhciBtb2R1bGUgbWFwLCB0cmVlIG5vZGVzLCB0ZXh0dWFsIGNvbnZlbnRpb24gdGFibGUuCiAqLwp2b2lkCnVubG9hZF9hbGxfbWlicyh2b2lkKQp7CiAgICBzdHJ1Y3QgbW9kdWxlICAqbXA7CiAgICBzdHJ1Y3QgbW9kdWxlX2NvbXBhdGFiaWxpdHkgKm1jcDsKICAgIHN0cnVjdCB0YyAgICAgICpwdGM7CiAgICB1bnNpZ25lZCBpbnQgICAgaTsKCiAgICBmb3IgKG1jcCA9IG1vZHVsZV9tYXBfaGVhZDsgbWNwOyBtY3AgPSBtb2R1bGVfbWFwX2hlYWQpIHsKICAgICAgICBpZiAobWNwID09IG1vZHVsZV9tYXApCiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIG1vZHVsZV9tYXBfaGVhZCA9IG1jcC0+bmV4dDsKICAgICAgICBpZiAobWNwLT50YWcpIGZyZWUoTkVUU05NUF9SRU1PVkVfQ09OU1QoY2hhciAqLCBtY3AtPnRhZykpOwogICAgICAgIGZyZWUoTkVUU05NUF9SRU1PVkVfQ09OU1QoY2hhciAqLCBtY3AtPm9sZF9tb2R1bGUpKTsKICAgICAgICBmcmVlKE5FVFNOTVBfUkVNT1ZFX0NPTlNUKGNoYXIgKiwgbWNwLT5uZXdfbW9kdWxlKSk7CiAgICAgICAgZnJlZShtY3ApOwogICAgfQoKICAgIGZvciAobXAgPSBtb2R1bGVfaGVhZDsgbXA7IG1wID0gbW9kdWxlX2hlYWQpIHsKICAgICAgICBzdHJ1Y3QgbW9kdWxlX2ltcG9ydCAqbWkgPSBtcC0+aW1wb3J0czsKICAgICAgICBpZiAobWkpIHsKICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8ICh1bnNpZ25lZCBpbnQpbXAtPm5vX2ltcG9ydHM7ICsraSkgewogICAgICAgICAgICAgICAgU05NUF9GUkVFKChtaSArIGkpLT5sYWJlbCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgbXAtPm5vX2ltcG9ydHMgPSAwOwogICAgICAgICAgICBpZiAobWkgPT0gcm9vdF9pbXBvcnRzKQogICAgICAgICAgICAgICAgbWVtc2V0KG1pLCAwLCBzaXplb2YoKm1pKSk7CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIGZyZWUobWkpOwogICAgICAgIH0KCiAgICAgICAgdW5sb2FkX21vZHVsZV9ieV9JRChtcC0+bW9kaWQsIHRyZWVfaGVhZCk7CiAgICAgICAgbW9kdWxlX2hlYWQgPSBtcC0+bmV4dDsKICAgICAgICBmcmVlKG1wLT5uYW1lKTsKICAgICAgICBmcmVlKG1wLT5maWxlKTsKICAgICAgICBmcmVlKG1wKTsKICAgIH0KICAgIHVubG9hZF9tb2R1bGVfYnlfSUQoLTEsIHRyZWVfaGVhZCk7CiAgICAvKgogICAgICogdHJlZSBub2RlcyBhcmUgY2xlYXJlZCAKICAgICAqLwoKICAgIGZvciAoaSA9IDAsIHB0YyA9IHRjbGlzdDsgaSA8IE1BWFRDOyBpKyssIHB0YysrKSB7CiAgICAgICAgaWYgKHB0Yy0+dHlwZSA9PSAwKQogICAgICAgICAgICBjb250aW51ZTsKICAgICAgICBmcmVlX2VudW1zKCZwdGMtPmVudW1zKTsKICAgICAgICBmcmVlX3JhbmdlcygmcHRjLT5yYW5nZXMpOwogICAgICAgIGZyZWUocHRjLT5kZXNjcmlwdG9yKTsKICAgICAgICBpZiAocHRjLT5oaW50KQogICAgICAgICAgICBmcmVlKHB0Yy0+aGludCk7CiAgICAgICAgaWYgKHB0Yy0+ZGVzY3JpcHRpb24pCiAgICAgICAgICAgIGZyZWUocHRjLT5kZXNjcmlwdGlvbik7CiAgICB9CiAgICBtZW1zZXQodGNsaXN0LCAwLCBNQVhUQyAqIHNpemVvZihzdHJ1Y3QgdGMpKTsKCiAgICBtZW1zZXQoYnVja2V0cywgMCwgc2l6ZW9mKGJ1Y2tldHMpKTsKICAgIG1lbXNldChuYnVja2V0cywgMCwgc2l6ZW9mKG5idWNrZXRzKSk7CiAgICBtZW1zZXQodGJ1Y2tldHMsIDAsIHNpemVvZih0YnVja2V0cykpOwoKICAgIGZvciAoaSA9IDA7IGkgPCBzaXplb2Yocm9vdF9pbXBvcnRzKSAvIHNpemVvZihyb290X2ltcG9ydHNbMF0pOyBpKyspIHsKICAgICAgICBTTk1QX0ZSRUUocm9vdF9pbXBvcnRzW2ldLmxhYmVsKTsKICAgIH0KCiAgICBtYXhfbW9kdWxlID0gMDsKICAgIGN1cnJlbnRfbW9kdWxlID0gMDsKICAgIG1vZHVsZV9tYXBfaGVhZCA9IE5VTEw7CiAgICBTTk1QX0ZSRUUobGFzdF9lcnJfbW9kdWxlKTsKfQoKc3RhdGljIHZvaWQKbmV3X21vZHVsZShjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICpmaWxlKQp7CiAgICBzdHJ1Y3QgbW9kdWxlICAqbXA7CgogICAgZm9yIChtcCA9IG1vZHVsZV9oZWFkOyBtcDsgbXAgPSBtcC0+bmV4dCkKICAgICAgICBpZiAoIWxhYmVsX2NvbXBhcmUobXAtPm5hbWUsIG5hbWUpKSB7CiAgICAgICAgICAgIERFQlVHTVNHVEwoKCJwYXJzZS1taWJzIiwgIiAgTW9kdWxlICVzIGFscmVhZHkgbm90ZWRcbiIsIG5hbWUpKTsKICAgICAgICAgICAgLyoKICAgICAgICAgICAgICogTm90IHRoZSBzYW1lIGZpbGUgCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBpZiAobGFiZWxfY29tcGFyZShtcC0+ZmlsZSwgZmlsZSkpIHsKICAgICAgICAgICAgICAgIERFQlVHTVNHVEwoKCJwYXJzZS1taWJzIiwgIiAgICAlcyBpcyBub3cgaW4gJXNcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lLCBmaWxlKSk7CiAgICAgICAgICAgICAgICBpZiAobmV0c25tcF9kc19nZXRfaW50KE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgCgkJCQkgICAgICAgTkVUU05NUF9EU19MSUJfTUlCX1dBUk5JTkdTKSkgewogICAgICAgICAgICAgICAgICAgIHNubXBfbG9nKExPR19XQVJOSU5HLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJXYXJuaW5nOiBNb2R1bGUgJXMgd2FzIGluICVzIG5vdyBpcyAlc1xuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lLCBtcC0+ZmlsZSwgZmlsZSk7CgkJfQoKICAgICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgICAgKiBVc2UgdGhlIG5ldyBvbmUgaW4gcHJlZmVyZW5jZSAKICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgZnJlZShtcC0+ZmlsZSk7CiAgICAgICAgICAgICAgICBtcC0+ZmlsZSA9IHN0cmR1cChmaWxlKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgIC8qCiAgICAgKiBBZGQgdGhpcyBtb2R1bGUgdG8gdGhlIGxpc3QgCiAgICAgKi8KICAgIERFQlVHTVNHVEwoKCJwYXJzZS1taWJzIiwgIiAgTW9kdWxlICVkICVzIGlzIGluICVzXG4iLCBtYXhfbW9kdWxlLAogICAgICAgICAgICAgICAgbmFtZSwgZmlsZSkpOwogICAgbXAgPSAoc3RydWN0IG1vZHVsZSAqKSBjYWxsb2MoMSwgc2l6ZW9mKHN0cnVjdCBtb2R1bGUpKTsKICAgIGlmIChtcCA9PSBOVUxMKQogICAgICAgIHJldHVybjsKICAgIG1wLT5uYW1lID0gc3RyZHVwKG5hbWUpOwogICAgbXAtPmZpbGUgPSBzdHJkdXAoZmlsZSk7CiAgICBtcC0+aW1wb3J0cyA9IE5VTEw7CiAgICBtcC0+bm9faW1wb3J0cyA9IC0xOyAgICAgICAgLyogTm90IHlldCBsb2FkZWQgKi8KICAgIG1wLT5tb2RpZCA9IG1heF9tb2R1bGU7CiAgICArK21heF9tb2R1bGU7CgogICAgbXAtPm5leHQgPSBtb2R1bGVfaGVhZDsgICAgIC8qIE9yIGFkZCB0byB0aGUgKmVuZCogb2YgdGhlIGxpc3Q/ICovCiAgICBtb2R1bGVfaGVhZCA9IG1wOwp9CgoKc3RhdGljIHZvaWQKc2Nhbl9vYmpsaXN0KHN0cnVjdCBub2RlICpyb290LCBzdHJ1Y3QgbW9kdWxlICptcCwgc3RydWN0IG9iamdyb3VwICpsaXN0LCBjb25zdCBjaGFyICplcnJvcikKewogICAgaW50ICAgICAgICAgICAgIG9MaW5lID0gbWliTGluZTsKCiAgICB3aGlsZSAobGlzdCkgewogICAgICAgIHN0cnVjdCBvYmpncm91cCAqZ3AgPSBsaXN0OwogICAgICAgIHN0cnVjdCBub2RlICAgICpucDsKICAgICAgICBsaXN0ID0gbGlzdC0+bmV4dDsKICAgICAgICBucCA9IHJvb3Q7CiAgICAgICAgd2hpbGUgKG5wKQogICAgICAgICAgICBpZiAobGFiZWxfY29tcGFyZShucC0+bGFiZWwsIGdwLT5uYW1lKSkKICAgICAgICAgICAgICAgIG5wID0gbnAtPm5leHQ7CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGlmICghbnApIHsKCSAgICBpbnQgaTsKCSAgICBzdHJ1Y3QgbW9kdWxlX2ltcG9ydCAqbWlwOwoJICAgIC8qIGlmIG5vdCBsb2NhbCwgY2hlY2sgaWYgaXQgd2FzIElNUE9SVGVkICovCgkgICAgZm9yIChpID0gMCwgbWlwID0gbXAtPmltcG9ydHM7IGkgPCBtcC0+bm9faW1wb3J0czsgaSsrLCBtaXArKykKCQlpZiAoc3RyY21wKG1pcC0+bGFiZWwsIGdwLT5uYW1lKSA9PSAwKQoJCSAgICBicmVhazsKCSAgICBpZiAoaSA9PSBtcC0+bm9faW1wb3J0cykgewoJCW1pYkxpbmUgPSBncC0+bGluZTsKCQlwcmludF9lcnJvcihlcnJvciwgZ3AtPm5hbWUsIFFVT1RFU1RSSU5HKTsKCSAgICB9CiAgICAgICAgfQogICAgICAgIGZyZWUoZ3AtPm5hbWUpOwogICAgICAgIGZyZWUoZ3ApOwogICAgfQogICAgbWliTGluZSA9IG9MaW5lOwp9CgovKgogKiBQYXJzZXMgYSBtaWIgZmlsZSBhbmQgcmV0dXJucyBhIGxpbmtlZCBsaXN0IG9mIG5vZGVzIGZvdW5kIGluIHRoZSBmaWxlLgogKiBSZXR1cm5zIE5VTEwgb24gZXJyb3IuCiAqLwpzdGF0aWMgc3RydWN0IG5vZGUgKgpwYXJzZShGSUxFICogZnAsIHN0cnVjdCBub2RlICpyb290KQp7CiNpZmRlZiBURVNUCiAgICBleHRlcm4gdm9pZCAgICAgeG1hbGxvY19zdGF0cyhGSUxFICopOwojZW5kaWYKICAgIGNoYXIgICAgICAgICAgICB0b2tlbltNQVhUT0tFTl07CiAgICBjaGFyICAgICAgICAgICAgbmFtZVtNQVhUT0tFTisxXTsKICAgIGludCAgICAgICAgICAgICB0eXBlID0gTEFCRUw7CiAgICBpbnQgICAgICAgICAgICAgbGFzdHR5cGUgPSBMQUJFTDsKCiNkZWZpbmUgQkVUV0VFTl9NSUJTICAgICAgICAgIDEKI2RlZmluZSBJTl9NSUIgICAgICAgICAgICAgICAgMgogICAgaW50ICAgICAgICAgICAgIHN0YXRlID0gQkVUV0VFTl9NSUJTOwogICAgc3RydWN0IG5vZGUgICAgKm5wLCAqbm5wOwogICAgc3RydWN0IG9iamdyb3VwICpvbGRncm91cHMgPSBOVUxMLCAqb2xkb2JqZWN0cyA9IE5VTEwsICpvbGRub3RpZnMgPQogICAgICAgIE5VTEw7CgogICAgREVCVUdNU0dUTCgoInBhcnNlLWZpbGUiLCAiUGFyc2luZyBmaWxlOiAgJXMuLi5cbiIsIEZpbGUpKTsKCiAgICBpZiAobGFzdF9lcnJfbW9kdWxlKQogICAgICAgIGZyZWUobGFzdF9lcnJfbW9kdWxlKTsKICAgIGxhc3RfZXJyX21vZHVsZSA9IE5VTEw7CgogICAgbnAgPSByb290OwogICAgaWYgKG5wICE9IE5VTEwpIHsKICAgICAgICAvKgogICAgICAgICAqIG5vdyBmaW5kIGVuZCBvZiBjaGFpbiAKICAgICAgICAgKi8KICAgICAgICB3aGlsZSAobnAtPm5leHQpCiAgICAgICAgICAgIG5wID0gbnAtPm5leHQ7CiAgICB9CgogICAgd2hpbGUgKHR5cGUgIT0gRU5ET0ZGSUxFKSB7CiAgICAgICAgaWYgKGxhc3R0eXBlID09IENPTlRJTlVFKQogICAgICAgICAgICBsYXN0dHlwZSA9IHR5cGU7CiAgICAgICAgZWxzZQogICAgICAgICAgICB0eXBlID0gbGFzdHR5cGUgPSBnZXRfdG9rZW4oZnAsIHRva2VuLCBNQVhUT0tFTik7CgogICAgICAgIHN3aXRjaCAodHlwZSkgewogICAgICAgIGNhc2UgRU5EOgogICAgICAgICAgICBpZiAoc3RhdGUgIT0gSU5fTUlCKSB7CiAgICAgICAgICAgICAgICBwcmludF9lcnJvcigiRXJyb3IsIEVORCBiZWZvcmUgc3RhcnQgb2YgTUlCIiwgTlVMTCwgdHlwZSk7CiAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIHN0cnVjdCBtb2R1bGUgICptcDsKI2lmZGVmIFRFU1QKICAgICAgICAgICAgICAgIHByaW50ZigiXG5Ob2RlcyBmb3IgTW9kdWxlICVzOlxuIiwgbmFtZSk7CiAgICAgICAgICAgICAgICBwcmludF9ub2RlcyhzdGRvdXQsIHJvb3QpOwojZW5kaWYKICAgICAgICAgICAgICAgIGZvciAobXAgPSBtb2R1bGVfaGVhZDsgbXA7IG1wID0gbXAtPm5leHQpCiAgICAgICAgICAgICAgICAgICAgaWYgKG1wLT5tb2RpZCA9PSBjdXJyZW50X21vZHVsZSkKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBzY2FuX29iamxpc3Qocm9vdCwgbXAsIG9iamdyb3VwcywgIlVuZGVmaW5lZCBPQkpFQ1QtR1JPVVAiKTsKICAgICAgICAgICAgICAgIHNjYW5fb2JqbGlzdChyb290LCBtcCwgb2JqZWN0cywgIlVuZGVmaW5lZCBPQkpFQ1QiKTsKICAgICAgICAgICAgICAgIHNjYW5fb2JqbGlzdChyb290LCBtcCwgbm90aWZzLCAiVW5kZWZpbmVkIE5PVElGSUNBVElPTiIpOwogICAgICAgICAgICAgICAgb2JqZ3JvdXBzID0gb2xkZ3JvdXBzOwogICAgICAgICAgICAgICAgb2JqZWN0cyA9IG9sZG9iamVjdHM7CiAgICAgICAgICAgICAgICBub3RpZnMgPSBvbGRub3RpZnM7CiAgICAgICAgICAgICAgICBkb19saW5rdXAobXAsIHJvb3QpOwogICAgICAgICAgICAgICAgbnAgPSByb290ID0gTlVMTDsKICAgICAgICAgICAgfQogICAgICAgICAgICBzdGF0ZSA9IEJFVFdFRU5fTUlCUzsKI2lmZGVmIFRFU1QKICAgICAgICAgICAgaWYgKG5ldHNubXBfZHNfZ2V0X2ludChORVRTTk1QX0RTX0xJQlJBUllfSUQsIAoJCQkJICAgTkVUU05NUF9EU19MSUJfTUlCX1dBUk5JTkdTKSkgewogICAgICAgICAgICAgICAgLyogeG1hbGxvY19zdGF0cyhzdGRlcnIpOyAqLwoJICAgIH0KI2VuZGlmCiAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIGNhc2UgSU1QT1JUUzoKICAgICAgICAgICAgcGFyc2VfaW1wb3J0cyhmcCk7CiAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIGNhc2UgRVhQT1JUUzoKICAgICAgICAgICAgd2hpbGUgKHR5cGUgIT0gU0VNSSAmJiB0eXBlICE9IEVORE9GRklMRSkKICAgICAgICAgICAgICAgIHR5cGUgPSBnZXRfdG9rZW4oZnAsIHRva2VuLCBNQVhUT0tFTik7CiAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIGNhc2UgTEFCRUw6CiAgICAgICAgY2FzZSBJTlRFR0VSOgogICAgICAgIGNhc2UgSU5URUdFUjMyOgogICAgICAgIGNhc2UgVUlOVEVHRVIzMjoKICAgICAgICBjYXNlIFVOU0lHTkVEMzI6CiAgICAgICAgY2FzZSBDT1VOVEVSOgogICAgICAgIGNhc2UgQ09VTlRFUjY0OgogICAgICAgIGNhc2UgR0FVR0U6CiAgICAgICAgY2FzZSBJUEFERFI6CiAgICAgICAgY2FzZSBORVRBRERSOgogICAgICAgIGNhc2UgTlNBUEFERFJFU1M6CiAgICAgICAgY2FzZSBPQkpTWU5UQVg6CiAgICAgICAgY2FzZSBBUFBTWU5UQVg6CiAgICAgICAgY2FzZSBTSU1QTEVTWU5UQVg6CiAgICAgICAgY2FzZSBPQkpOQU1FOgogICAgICAgIGNhc2UgTk9USUZOQU1FOgogICAgICAgIGNhc2UgS1dfT1BBUVVFOgogICAgICAgIGNhc2UgVElNRVRJQ0tTOgogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIEVORE9GRklMRToKICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgc3RybGNweShuYW1lLCB0b2tlbiwgc2l6ZW9mKG5hbWUpKTsKICAgICAgICAgICAgdHlwZSA9IGdldF90b2tlbihmcCwgdG9rZW4sIE1BWFRPS0VOKTsKICAgICAgICAgICAgbm5wID0gTlVMTDsKICAgICAgICAgICAgaWYgKHR5cGUgPT0gTUFDUk8pIHsKICAgICAgICAgICAgICAgIG5ucCA9IHBhcnNlX21hY3JvKGZwLCBuYW1lKTsKICAgICAgICAgICAgICAgIGlmIChubnAgPT0gTlVMTCkgewogICAgICAgICAgICAgICAgICAgIHByaW50X2Vycm9yKCJCYWQgcGFyc2Ugb2YgTUFDUk8iLCBOVUxMLCB0eXBlKTsKICAgICAgICAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICAgICAgICAqIHJldHVybiBOVUxMOwogICAgICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnJlZV9ub2RlKG5ucCk7IC8qIElHTk9SRSAqLwogICAgICAgICAgICAgICAgbm5wID0gTlVMTDsKICAgICAgICAgICAgfSBlbHNlCiAgICAgICAgICAgICAgICBwcmludF9lcnJvcihuYW1lLCAiaXMgYSByZXNlcnZlZCB3b3JkIiwgbGFzdHR5cGUpOwogICAgICAgICAgICBjb250aW51ZTsgICAgICAgICAgIC8qIHNlZSBpZiB3ZSBjYW4gcGFyc2UgdGhlIHJlc3Qgb2YgdGhlIGZpbGUgKi8KICAgICAgICB9CiAgICAgICAgc3RybGNweShuYW1lLCB0b2tlbiwgc2l6ZW9mKG5hbWUpKTsKICAgICAgICB0eXBlID0gZ2V0X3Rva2VuKGZwLCB0b2tlbiwgTUFYVE9LRU4pOwogICAgICAgIG5ucCA9IE5VTEw7CgogICAgICAgIC8qCiAgICAgICAgICogSGFuZGxlIG9ic29sZXRlIG1ldGhvZCB0byBhc3NpZ24gYW4gb2JqZWN0IGlkZW50aWZpZXIgdG8gYQogICAgICAgICAqIG1vZHVsZQogICAgICAgICAqLwogICAgICAgIGlmIChsYXN0dHlwZSA9PSBMQUJFTCAmJiB0eXBlID09IExFRlRCUkFDS0VUKSB7CiAgICAgICAgICAgIHdoaWxlICh0eXBlICE9IFJJR0hUQlJBQ0tFVCAmJiB0eXBlICE9IEVORE9GRklMRSkKICAgICAgICAgICAgICAgIHR5cGUgPSBnZXRfdG9rZW4oZnAsIHRva2VuLCBNQVhUT0tFTik7CiAgICAgICAgICAgIGlmICh0eXBlID09IEVORE9GRklMRSkgewogICAgICAgICAgICAgICAgcHJpbnRfZXJyb3IoIkV4cGVjdGVkIFwifVwiIiwgdG9rZW4sIHR5cGUpOwogICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdHlwZSA9IGdldF90b2tlbihmcCwgdG9rZW4sIE1BWFRPS0VOKTsKICAgICAgICB9CgogICAgICAgIHN3aXRjaCAodHlwZSkgewogICAgICAgIGNhc2UgREVGSU5JVElPTlM6CiAgICAgICAgICAgIGlmIChzdGF0ZSAhPSBCRVRXRUVOX01JQlMpIHsKICAgICAgICAgICAgICAgIHByaW50X2Vycm9yKCJFcnJvciwgbmVzdGVkIE1JQlMiLCBOVUxMLCB0eXBlKTsKICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHN0YXRlID0gSU5fTUlCOwogICAgICAgICAgICBjdXJyZW50X21vZHVsZSA9IHdoaWNoX21vZHVsZShuYW1lKTsKICAgICAgICAgICAgb2xkZ3JvdXBzID0gb2JqZ3JvdXBzOwogICAgICAgICAgICBvYmpncm91cHMgPSBOVUxMOwogICAgICAgICAgICBvbGRvYmplY3RzID0gb2JqZWN0czsKICAgICAgICAgICAgb2JqZWN0cyA9IE5VTEw7CiAgICAgICAgICAgIG9sZG5vdGlmcyA9IG5vdGlmczsKICAgICAgICAgICAgbm90aWZzID0gTlVMTDsKICAgICAgICAgICAgaWYgKGN1cnJlbnRfbW9kdWxlID09IC0xKSB7CiAgICAgICAgICAgICAgICBuZXdfbW9kdWxlKG5hbWUsIEZpbGUpOwogICAgICAgICAgICAgICAgY3VycmVudF9tb2R1bGUgPSB3aGljaF9tb2R1bGUobmFtZSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgREVCVUdNU0dUTCgoInBhcnNlLW1pYnMiLCAiUGFyc2luZyBNSUI6ICVkICVzXG4iLAogICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50X21vZHVsZSwgbmFtZSkpOwogICAgICAgICAgICB3aGlsZSAoKHR5cGUgPSBnZXRfdG9rZW4oZnAsIHRva2VuLCBNQVhUT0tFTikpICE9IEVORE9GRklMRSkKICAgICAgICAgICAgICAgIGlmICh0eXBlID09IEJFR0lOKQogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIE9CSlRZUEU6CiAgICAgICAgICAgIG5ucCA9IHBhcnNlX29iamVjdHR5cGUoZnAsIG5hbWUpOwogICAgICAgICAgICBpZiAobm5wID09IE5VTEwpIHsKICAgICAgICAgICAgICAgIHByaW50X2Vycm9yKCJCYWQgcGFyc2Ugb2YgT0JKRUNULVRZUEUiLCBOVUxMLCB0eXBlKTsKICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgT0JKR1JPVVA6CiAgICAgICAgICAgIG5ucCA9IHBhcnNlX29iamVjdGdyb3VwKGZwLCBuYW1lLCBPQkpFQ1RTLCAmb2JqZWN0cyk7CiAgICAgICAgICAgIGlmIChubnAgPT0gTlVMTCkgewogICAgICAgICAgICAgICAgcHJpbnRfZXJyb3IoIkJhZCBwYXJzZSBvZiBPQkpFQ1QtR1JPVVAiLCBOVUxMLCB0eXBlKTsKICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgTk9USUZHUk9VUDoKICAgICAgICAgICAgbm5wID0gcGFyc2Vfb2JqZWN0Z3JvdXAoZnAsIG5hbWUsIE5PVElGSUNBVElPTlMsICZub3RpZnMpOwogICAgICAgICAgICBpZiAobm5wID09IE5VTEwpIHsKICAgICAgICAgICAgICAgIHByaW50X2Vycm9yKCJCYWQgcGFyc2Ugb2YgTk9USUZJQ0FUSU9OLUdST1VQIiwgTlVMTCwgdHlwZSk7CiAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICAgICAgfQogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIFRSQVBUWVBFOgogICAgICAgICAgICBubnAgPSBwYXJzZV90cmFwRGVmaW5pdGlvbihmcCwgbmFtZSk7CiAgICAgICAgICAgIGlmIChubnAgPT0gTlVMTCkgewogICAgICAgICAgICAgICAgcHJpbnRfZXJyb3IoIkJhZCBwYXJzZSBvZiBUUkFQLVRZUEUiLCBOVUxMLCB0eXBlKTsKICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgTk9USUZUWVBFOgogICAgICAgICAgICBubnAgPSBwYXJzZV9ub3RpZmljYXRpb25EZWZpbml0aW9uKGZwLCBuYW1lKTsKICAgICAgICAgICAgaWYgKG5ucCA9PSBOVUxMKSB7CiAgICAgICAgICAgICAgICBwcmludF9lcnJvcigiQmFkIHBhcnNlIG9mIE5PVElGSUNBVElPTi1UWVBFIiwgTlVMTCwgdHlwZSk7CiAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICAgICAgfQogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIENPTVBMSUFOQ0U6CiAgICAgICAgICAgIG5ucCA9IHBhcnNlX2NvbXBsaWFuY2UoZnAsIG5hbWUpOwogICAgICAgICAgICBpZiAobm5wID09IE5VTEwpIHsKICAgICAgICAgICAgICAgIHByaW50X2Vycm9yKCJCYWQgcGFyc2Ugb2YgTU9EVUxFLUNPTVBMSUFOQ0UiLCBOVUxMLCB0eXBlKTsKICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgQUdFTlRDQVA6CiAgICAgICAgICAgIG5ucCA9IHBhcnNlX2NhcGFiaWxpdGllcyhmcCwgbmFtZSk7CiAgICAgICAgICAgIGlmIChubnAgPT0gTlVMTCkgewogICAgICAgICAgICAgICAgcHJpbnRfZXJyb3IoIkJhZCBwYXJzZSBvZiBBR0VOVC1DQVBBQklMSVRJRVMiLCBOVUxMLCB0eXBlKTsKICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgTUFDUk86CiAgICAgICAgICAgIG5ucCA9IHBhcnNlX21hY3JvKGZwLCBuYW1lKTsKICAgICAgICAgICAgaWYgKG5ucCA9PSBOVUxMKSB7CiAgICAgICAgICAgICAgICBwcmludF9lcnJvcigiQmFkIHBhcnNlIG9mIE1BQ1JPIiwgTlVMTCwgdHlwZSk7CiAgICAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICAgICogcmV0dXJuIE5VTEw7CiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgfQogICAgICAgICAgICBmcmVlX25vZGUobm5wKTsgICAgIC8qIElHTk9SRSAqLwogICAgICAgICAgICBubnAgPSBOVUxMOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIE1PRFVMRUlERU5USVRZOgogICAgICAgICAgICBubnAgPSBwYXJzZV9tb2R1bGVJZGVudGl0eShmcCwgbmFtZSk7CiAgICAgICAgICAgIGlmIChubnAgPT0gTlVMTCkgewogICAgICAgICAgICAgICAgcHJpbnRfZXJyb3IoIkJhZCBwYXJzZSBvZiBNT0RVTEUtSURFTlRJVFkiLCBOVUxMLCB0eXBlKTsKICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgT0JKSURFTlRJVFk6CiAgICAgICAgICAgIG5ucCA9IHBhcnNlX29iamVjdGdyb3VwKGZwLCBuYW1lLCBPQkpFQ1RTLCAmb2JqZWN0cyk7CiAgICAgICAgICAgIGlmIChubnAgPT0gTlVMTCkgewogICAgICAgICAgICAgICAgcHJpbnRfZXJyb3IoIkJhZCBwYXJzZSBvZiBPQkpFQ1QtSURFTlRJVFkiLCBOVUxMLCB0eXBlKTsKICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgT0JKRUNUOgogICAgICAgICAgICB0eXBlID0gZ2V0X3Rva2VuKGZwLCB0b2tlbiwgTUFYVE9LRU4pOwogICAgICAgICAgICBpZiAodHlwZSAhPSBJREVOVElGSUVSKSB7CiAgICAgICAgICAgICAgICBwcmludF9lcnJvcigiRXhwZWN0ZWQgSURFTlRJRklFUiIsIHRva2VuLCB0eXBlKTsKICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHR5cGUgPSBnZXRfdG9rZW4oZnAsIHRva2VuLCBNQVhUT0tFTik7CiAgICAgICAgICAgIGlmICh0eXBlICE9IEVRVUFMUykgewogICAgICAgICAgICAgICAgcHJpbnRfZXJyb3IoIkV4cGVjdGVkIFwiOjo9XCIiLCB0b2tlbiwgdHlwZSk7CiAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICAgICAgfQogICAgICAgICAgICBubnAgPSBwYXJzZV9vYmplY3RpZChmcCwgbmFtZSk7CiAgICAgICAgICAgIGlmIChubnAgPT0gTlVMTCkgewogICAgICAgICAgICAgICAgcHJpbnRfZXJyb3IoIkJhZCBwYXJzZSBvZiBPQkpFQ1QgSURFTlRJRklFUiIsIE5VTEwsIHR5cGUpOwogICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBFUVVBTFM6CiAgICAgICAgICAgIG5ucCA9IHBhcnNlX2FzbnR5cGUoZnAsIG5hbWUsICZ0eXBlLCB0b2tlbik7CiAgICAgICAgICAgIGxhc3R0eXBlID0gQ09OVElOVUU7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgRU5ET0ZGSUxFOgogICAgICAgICAgICBicmVhazsKICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICBwcmludF9lcnJvcigiQmFkIG9wZXJhdG9yIiwgdG9rZW4sIHR5cGUpOwogICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICB9CiAgICAgICAgaWYgKG5ucCkgewogICAgICAgICAgICBpZiAobnApCiAgICAgICAgICAgICAgICBucC0+bmV4dCA9IG5ucDsKICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgbnAgPSByb290ID0gbm5wOwogICAgICAgICAgICB3aGlsZSAobnAtPm5leHQpCiAgICAgICAgICAgICAgICBucCA9IG5wLT5uZXh0OwogICAgICAgICAgICBpZiAobnAtPnR5cGUgPT0gVFlQRV9PVEhFUikKICAgICAgICAgICAgICAgIG5wLT50eXBlID0gdHlwZTsKICAgICAgICB9CiAgICB9CiAgICBERUJVR01TR1RMKCgicGFyc2UtZmlsZSIsICJFbmQgb2YgZmlsZSAoJXMpXG4iLCBGaWxlKSk7CiAgICByZXR1cm4gcm9vdDsKfQoKLyoKICogcmV0dXJuIHplcm8gaWYgY2hhcmFjdGVyIGlzIG5vdCBhIGxhYmVsIGNoYXJhY3Rlci4gCiAqLwpzdGF0aWMgaW50CmlzX2xhYmVsY2hhcihpbnQgaWNoKQp7CiAgICBpZiAoKGlzYWxudW0oaWNoKSkgfHwgKGljaCA9PSAnLScpKQogICAgICAgIHJldHVybiAxOwogICAgaWYgKGljaCA9PSAnXycgJiYgbmV0c25tcF9kc19nZXRfYm9vbGVhbihORVRTTk1QX0RTX0xJQlJBUllfSUQsIAoJCQkJCSAgICAgTkVUU05NUF9EU19MSUJfTUlCX1BBUlNFX0xBQkVMKSkgewogICAgICAgIHJldHVybiAxOwogICAgfQoKICAgIHJldHVybiAwOwp9CgovKgogKiBQYXJzZXMgYSB0b2tlbiBmcm9tIHRoZSBmaWxlLiAgVGhlIHR5cGUgb2YgdGhlIHRva2VuIHBhcnNlZCBpcyByZXR1cm5lZCwKICogYW5kIHRoZSB0ZXh0IGlzIHBsYWNlZCBpbiB0aGUgc3RyaW5nIHBvaW50ZWQgdG8gYnkgdG9rZW4uCiAqIFdhcm5pbmc6IHRoaXMgbWV0aG9kIG1heSByZWN1cnNlLgogKi8Kc3RhdGljIGludApnZXRfdG9rZW4oRklMRSAqIGZwLCBjaGFyICp0b2tlbiwgaW50IG1heHRsZW4pCnsKICAgIHJlZ2lzdGVyIGludCAgICBjaCwgY2hfbmV4dDsKICAgIHJlZ2lzdGVyIGNoYXIgICpjcCA9IHRva2VuOwogICAgcmVnaXN0ZXIgaW50ICAgIGhhc2ggPSAwOwogICAgcmVnaXN0ZXIgc3RydWN0IHRvayAqdHA7CiAgICBpbnQgICAgICAgICAgICAgdG9vX2xvbmcgPSAwOwogICAgZW51bSB7IGJkaWdpdHMsIHhkaWdpdHMsIG90aGVyIH0gc2VlblN5bWJvbHM7CgogICAgLyoKICAgICAqIHNraXAgYWxsIHdoaXRlIHNwYWNlIAogICAgICovCiAgICBkbyB7CiAgICAgICAgY2ggPSBnZXRjKGZwKTsKICAgICAgICBpZiAoY2ggPT0gJ1xuJykKICAgICAgICAgICAgbWliTGluZSsrOwogICAgfQogICAgd2hpbGUgKGlzc3BhY2UoY2gpICYmIGNoICE9IEVPRik7CiAgICAqY3ArKyA9IGNoOwogICAgKmNwID0gJ1wwJzsKICAgIHN3aXRjaCAoY2gpIHsKICAgIGNhc2UgRU9GOgogICAgICAgIHJldHVybiBFTkRPRkZJTEU7CiAgICBjYXNlICciJzoKICAgICAgICByZXR1cm4gcGFyc2VRdW90ZVN0cmluZyhmcCwgdG9rZW4sIG1heHRsZW4pOwogICAgY2FzZSAnXCcnOiAgICAgICAgICAgICAgICAgLyogYmluYXJ5IG9yIGhleCBjb25zdGFudCAqLwogICAgICAgIHNlZW5TeW1ib2xzID0gYmRpZ2l0czsKICAgICAgICB3aGlsZSAoKGNoID0gZ2V0YyhmcCkpICE9IEVPRiAmJiBjaCAhPSAnXCcnKSB7CiAgICAgICAgICAgIHN3aXRjaCAoc2VlblN5bWJvbHMpIHsKICAgICAgICAgICAgY2FzZSBiZGlnaXRzOgogICAgICAgICAgICAgICAgaWYgKGNoID09ICcwJyB8fCBjaCA9PSAnMScpCiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBzZWVuU3ltYm9scyA9IHhkaWdpdHM7CiAgICAgICAgICAgIGNhc2UgeGRpZ2l0czoKICAgICAgICAgICAgICAgIGlmIChpc3hkaWdpdChjaCkpCiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBzZWVuU3ltYm9scyA9IG90aGVyOwogICAgICAgICAgICBjYXNlIG90aGVyOgogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGNwIC0gdG9rZW4gPCBtYXh0bGVuIC0gMikKICAgICAgICAgICAgICAgICpjcCsrID0gY2g7CiAgICAgICAgfQogICAgICAgIGlmIChjaCA9PSAnXCcnKSB7CiAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgICB2YWwgPSAwOwogICAgICAgICAgICBjaGFyICAgICAgICAgICAqcnVuID0gdG9rZW4gKyAxOwogICAgICAgICAgICBjaCA9IGdldGMoZnApOwogICAgICAgICAgICBzd2l0Y2ggKGNoKSB7CiAgICAgICAgICAgIGNhc2UgRU9GOgogICAgICAgICAgICAgICAgcmV0dXJuIEVORE9GRklMRTsKICAgICAgICAgICAgY2FzZSAnYic6CiAgICAgICAgICAgIGNhc2UgJ0InOgogICAgICAgICAgICAgICAgaWYgKHNlZW5TeW1ib2xzID4gYmRpZ2l0cykgewogICAgICAgICAgICAgICAgICAgICpjcCsrID0gJ1wnJzsKICAgICAgICAgICAgICAgICAgICAqY3AgPSAwOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBMQUJFTDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHdoaWxlIChydW4gIT0gY3ApCiAgICAgICAgICAgICAgICAgICAgdmFsID0gdmFsICogMiArICpydW4rKyAtICcwJzsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICdoJzoKICAgICAgICAgICAgY2FzZSAnSCc6CiAgICAgICAgICAgICAgICBpZiAoc2VlblN5bWJvbHMgPiB4ZGlnaXRzKSB7CiAgICAgICAgICAgICAgICAgICAgKmNwKysgPSAnXCcnOwogICAgICAgICAgICAgICAgICAgICpjcCA9IDA7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIExBQkVMOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgd2hpbGUgKHJ1biAhPSBjcCkgewogICAgICAgICAgICAgICAgICAgIGNoID0gKnJ1bisrOwogICAgICAgICAgICAgICAgICAgIGlmICgnMCcgPD0gY2ggJiYgY2ggPD0gJzknKQogICAgICAgICAgICAgICAgICAgICAgICB2YWwgPSB2YWwgKiAxNiArIGNoIC0gJzAnOwogICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCdhJyA8PSBjaCAmJiBjaCA8PSAnZicpCiAgICAgICAgICAgICAgICAgICAgICAgIHZhbCA9IHZhbCAqIDE2ICsgY2ggLSAnYScgKyAxMDsKICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICgnQScgPD0gY2ggJiYgY2ggPD0gJ0YnKQogICAgICAgICAgICAgICAgICAgICAgICB2YWwgPSB2YWwgKiAxNiArIGNoIC0gJ0EnICsgMTA7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICpjcCsrID0gJ1wnJzsKICAgICAgICAgICAgICAgICpjcCA9IDA7CiAgICAgICAgICAgICAgICByZXR1cm4gTEFCRUw7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgc3ByaW50Zih0b2tlbiwgIiVsZCIsIHZhbCk7CiAgICAgICAgICAgIHJldHVybiBOVU1CRVI7CiAgICAgICAgfSBlbHNlCiAgICAgICAgICAgIHJldHVybiBMQUJFTDsKICAgIGNhc2UgJygnOgogICAgICAgIHJldHVybiBMRUZUUEFSRU47CiAgICBjYXNlICcpJzoKICAgICAgICByZXR1cm4gUklHSFRQQVJFTjsKICAgIGNhc2UgJ3snOgogICAgICAgIHJldHVybiBMRUZUQlJBQ0tFVDsKICAgIGNhc2UgJ30nOgogICAgICAgIHJldHVybiBSSUdIVEJSQUNLRVQ7CiAgICBjYXNlICdbJzoKICAgICAgICByZXR1cm4gTEVGVFNRQlJBQ0s7CiAgICBjYXNlICddJzoKICAgICAgICByZXR1cm4gUklHSFRTUUJSQUNLOwogICAgY2FzZSAnOyc6CiAgICAgICAgcmV0dXJuIFNFTUk7CiAgICBjYXNlICcsJzoKICAgICAgICByZXR1cm4gQ09NTUE7CiAgICBjYXNlICd8JzoKICAgICAgICByZXR1cm4gQkFSOwogICAgY2FzZSAnLic6CiAgICAgICAgY2hfbmV4dCA9IGdldGMoZnApOwogICAgICAgIGlmIChjaF9uZXh0ID09ICcuJykKICAgICAgICAgICAgcmV0dXJuIFJBTkdFOwogICAgICAgIHVuZ2V0YyhjaF9uZXh0LCBmcCk7CiAgICAgICAgcmV0dXJuIExBQkVMOwogICAgY2FzZSAnOic6CiAgICAgICAgY2hfbmV4dCA9IGdldGMoZnApOwogICAgICAgIGlmIChjaF9uZXh0ICE9ICc6JykgewogICAgICAgICAgICB1bmdldGMoY2hfbmV4dCwgZnApOwogICAgICAgICAgICByZXR1cm4gTEFCRUw7CiAgICAgICAgfQogICAgICAgIGNoX25leHQgPSBnZXRjKGZwKTsKICAgICAgICBpZiAoY2hfbmV4dCAhPSAnPScpIHsKICAgICAgICAgICAgdW5nZXRjKGNoX25leHQsIGZwKTsKICAgICAgICAgICAgcmV0dXJuIExBQkVMOwogICAgICAgIH0KICAgICAgICByZXR1cm4gRVFVQUxTOwogICAgY2FzZSAnLSc6CiAgICAgICAgY2hfbmV4dCA9IGdldGMoZnApOwogICAgICAgIGlmIChjaF9uZXh0ID09ICctJykgewogICAgICAgICAgICBpZiAobmV0c25tcF9kc19nZXRfYm9vbGVhbihORVRTTk1QX0RTX0xJQlJBUllfSUQsIAoJCQkJICAgICAgIE5FVFNOTVBfRFNfTElCX01JQl9DT01NRU5UX1RFUk0pKSB7CiAgICAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICAgICogVHJlYXQgdGhlIHJlc3Qgb2YgdGhpcyBsaW5lIGFzIGEgY29tbWVudC4gCiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgIHdoaWxlICgoY2hfbmV4dCAhPSBFT0YpICYmIChjaF9uZXh0ICE9ICdcbicpKQogICAgICAgICAgICAgICAgICAgIGNoX25leHQgPSBnZXRjKGZwKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgICAgKiBUcmVhdCB0aGUgcmVzdCBvZiB0aGUgbGluZSBvciB1bnRpbCBhbm90aGVyICctLScgYXMgYSBjb21tZW50IAogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICAgICogKHRoaXMgaXMgdGhlICJ0ZWNobmljYWxseSIgY29ycmVjdCB3YXkgdG8gcGFyc2UgY29tbWVudHMpIAogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICBjaCA9ICcgJzsKICAgICAgICAgICAgICAgIGNoX25leHQgPSBnZXRjKGZwKTsKICAgICAgICAgICAgICAgIHdoaWxlIChjaF9uZXh0ICE9IEVPRiAmJiBjaF9uZXh0ICE9ICdcbicgJiYKICAgICAgICAgICAgICAgICAgICAgICAoY2ggIT0gJy0nIHx8IGNoX25leHQgIT0gJy0nKSkgewogICAgICAgICAgICAgICAgICAgIGNoID0gY2hfbmV4dDsKICAgICAgICAgICAgICAgICAgICBjaF9uZXh0ID0gZ2V0YyhmcCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGNoX25leHQgPT0gRU9GKQogICAgICAgICAgICAgICAgcmV0dXJuIEVORE9GRklMRTsKICAgICAgICAgICAgaWYgKGNoX25leHQgPT0gJ1xuJykKICAgICAgICAgICAgICAgIG1pYkxpbmUrKzsKICAgICAgICAgICAgcmV0dXJuIGdldF90b2tlbihmcCwgdG9rZW4sIG1heHRsZW4pOwogICAgICAgIH0KICAgICAgICB1bmdldGMoY2hfbmV4dCwgZnApOwoJLyogZmFsbHRocm91Z2ggKi8KICAgIGRlZmF1bHQ6CiAgICAgICAgLyoKICAgICAgICAgKiBBY2N1bXVsYXRlIGNoYXJhY3RlcnMgdW50aWwgZW5kIG9mIHRva2VuIGlzIGZvdW5kLiAgVGhlbiBhdHRlbXB0IHRvCiAgICAgICAgICogbWF0Y2ggdGhpcyB0b2tlbiBhcyBhIHJlc2VydmVkIHdvcmQuICBJZiBhIG1hdGNoIGlzIGZvdW5kLCByZXR1cm4gdGhlCiAgICAgICAgICogdHlwZS4gIEVsc2UgaXQgaXMgYSBsYWJlbC4KICAgICAgICAgKi8KICAgICAgICBpZiAoIWlzX2xhYmVsY2hhcihjaCkpCiAgICAgICAgICAgIHJldHVybiBMQUJFTDsKICAgICAgICBoYXNoICs9IHRvbG93ZXIoY2gpOwogICAgICBtb3JlOgogICAgICAgIHdoaWxlIChpc19sYWJlbGNoYXIoY2hfbmV4dCA9IGdldGMoZnApKSkgewogICAgICAgICAgICBoYXNoICs9IHRvbG93ZXIoY2hfbmV4dCk7CiAgICAgICAgICAgIGlmIChjcCAtIHRva2VuIDwgbWF4dGxlbiAtIDEpCiAgICAgICAgICAgICAgICAqY3ArKyA9IGNoX25leHQ7CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHRvb19sb25nID0gMTsKICAgICAgICB9CiAgICAgICAgdW5nZXRjKGNoX25leHQsIGZwKTsKICAgICAgICAqY3AgPSAnXDAnOwoKICAgICAgICBpZiAodG9vX2xvbmcpCiAgICAgICAgICAgIHByaW50X2Vycm9yKCJXYXJuaW5nOiB0b2tlbiB0b28gbG9uZyIsIHRva2VuLCBDT05USU5VRSk7CiAgICAgICAgZm9yICh0cCA9IGJ1Y2tldHNbQlVDS0VUKGhhc2gpXTsgdHA7IHRwID0gdHAtPm5leHQpIHsKICAgICAgICAgICAgaWYgKCh0cC0+aGFzaCA9PSBoYXNoKSAmJiAoIWxhYmVsX2NvbXBhcmUodHAtPm5hbWUsIHRva2VuKSkpCiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgICAgaWYgKHRwKSB7CiAgICAgICAgICAgIGlmICh0cC0+dG9rZW4gIT0gQ09OVElOVUUpCiAgICAgICAgICAgICAgICByZXR1cm4gKHRwLT50b2tlbik7CiAgICAgICAgICAgIHdoaWxlIChpc3NwYWNlKChjaF9uZXh0ID0gZ2V0YyhmcCkpKSkKICAgICAgICAgICAgICAgIGlmIChjaF9uZXh0ID09ICdcbicpCiAgICAgICAgICAgICAgICAgICAgbWliTGluZSsrOwogICAgICAgICAgICBpZiAoY2hfbmV4dCA9PSBFT0YpCiAgICAgICAgICAgICAgICByZXR1cm4gRU5ET0ZGSUxFOwogICAgICAgICAgICBpZiAoaXNhbG51bShjaF9uZXh0KSkgewogICAgICAgICAgICAgICAgKmNwKysgPSBjaF9uZXh0OwogICAgICAgICAgICAgICAgaGFzaCArPSB0b2xvd2VyKGNoX25leHQpOwogICAgICAgICAgICAgICAgZ290byBtb3JlOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmICh0b2tlblswXSA9PSAnLScgfHwgaXNkaWdpdCgodW5zaWduZWQgY2hhcikodG9rZW5bMF0pKSkgewogICAgICAgICAgICBmb3IgKGNwID0gdG9rZW4gKyAxOyAqY3A7IGNwKyspCiAgICAgICAgICAgICAgICBpZiAoIWlzZGlnaXQoKHVuc2lnbmVkIGNoYXIpKCpjcCkpKQogICAgICAgICAgICAgICAgICAgIHJldHVybiBMQUJFTDsKICAgICAgICAgICAgcmV0dXJuIE5VTUJFUjsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIExBQkVMOwogICAgfQp9CgppbnQKc25tcF9nZXRfdG9rZW4oRklMRSAqIGZwLCBjaGFyICp0b2tlbiwgaW50IG1heHRsZW4pCnsKICAgIHJldHVybiBnZXRfdG9rZW4oZnAsIHRva2VuLCBtYXh0bGVuKTsKfQoKaW50CmFkZF9taWJmaWxlKGNvbnN0IGNoYXIqIHRtcHN0ciwgY29uc3QgY2hhciogZF9uYW1lLCBGSUxFICppcCApCnsKICAgIEZJTEUgICAgICAgICAgICpmcDsKICAgIGNoYXIgICAgICAgICAgICB0b2tlbltNQVhUT0tFTl0sIHRva2VuMltNQVhUT0tFTl07CgogICAgLyoKICAgICAqIHdoaWNoIG1vZHVsZSBpcyB0aGlzIAogICAgICovCiAgICBpZiAoKGZwID0gZm9wZW4odG1wc3RyLCAiciIpKSA9PSBOVUxMKSB7CiAgICAgICAgc25tcF9sb2dfcGVycm9yKHRtcHN0cik7CiAgICAgICAgcmV0dXJuIDE7CiAgICB9CiAgICBERUJVR01TR1RMKCgicGFyc2UtbWlicyIsICJDaGVja2luZyBmaWxlOiAlcy4uLlxuIiwKICAgICAgICAgICAgICAgIHRtcHN0cikpOwogICAgbWliTGluZSA9IDE7CiAgICBGaWxlID0gdG1wc3RyOwogICAgaWYgKGdldF90b2tlbihmcCwgdG9rZW4sIE1BWFRPS0VOKSAhPSBMQUJFTCkgewoJICAgIGZjbG9zZShmcCk7CgkgICAgcmV0dXJuIDE7CiAgICB9CiAgICAvKgogICAgICogc2ltcGxlIHRlc3QgZm9yIHRoaXMgYmVpbmcgYSBNSUIgCiAgICAgKi8KICAgIGlmIChnZXRfdG9rZW4oZnAsIHRva2VuMiwgTUFYVE9LRU4pID09IERFRklOSVRJT05TKSB7CiAgICAgICAgbmV3X21vZHVsZSh0b2tlbiwgdG1wc3RyKTsKICAgICAgICBpZiAoaXApCiAgICAgICAgICAgIGZwcmludGYoaXAsICIlcyAlc1xuIiwgdG9rZW4sIGRfbmFtZSk7CiAgICAgICAgZmNsb3NlKGZwKTsKICAgICAgICByZXR1cm4gMDsKICAgIH0gZWxzZSB7CiAgICAgICAgZmNsb3NlKGZwKTsKICAgICAgICByZXR1cm4gMTsKICAgIH0KfQoKLyogRm9yIFdpbjMyIHBsYXRmb3JtcywgdGhlIGRpcmVjdG9yeSBkb2VzIG5vdCBtYWludGFpbiBhIGxhc3QgbW9kaWZpY2F0aW9uCiAqIGRhdGUgdGhhdCB3ZSBjYW4gY29tcGFyZSB3aXRoIHRoZSBtb2RpZmljYXRpb24gZGF0ZSBvZiB0aGUgLmluZGV4IGZpbGUuCiAqIFRoZXJlZm9yZSB0aGVyZSBpcyBubyB3YXkgdG8ga25vdyB3aGV0aGVyIGFueSAuaW5kZXggZmlsZSBpcyB2YWxpZC4KICogVGhpcyBpcyB0aGUgcmVhc29uIGZvciB0aGUgI2lmICEoZGVmaW5lZChXSU4zMikgfHwgZGVmaW5lZChjeWd3aW4pKQogKiBpbiB0aGUgYWRkX21pYmRpciBmdW5jdGlvbgogKi8KaW50CmFkZF9taWJkaXIoY29uc3QgY2hhciAqZGlybmFtZSkKewogICAgRklMRSAgICAgICAgICAgKmlwOwogICAgRElSICAgICAgICAgICAgKmRpciwgKmRpcjI7CiAgICBjb25zdCBjaGFyICAgICAqb2xkRmlsZSA9IEZpbGU7CiAgICBzdHJ1Y3QgZGlyZW50ICAqZmlsZTsKICAgIGNoYXIgICAgICAgICAgICB0bXBzdHJbMzAwXTsKICAgIGludCAgICAgICAgICAgICBjb3VudCA9IDA7CiAgICBpbnQgICAgICAgICAgICAgZm5hbWVfbGVuID0gMDsKI2lmICEoZGVmaW5lZChXSU4zMikgfHwgZGVmaW5lZChjeWd3aW4pKQogICAgY2hhciAgICAgICAgICAgKnRva2VuOwogICAgY2hhciBzcGFjZTsKICAgIGNoYXIgbmV3bGluZTsKICAgIHN0cnVjdCBzdGF0ICAgICBkaXJfc3RhdCwgaWR4X3N0YXQ7CiAgICBjaGFyICAgICAgICAgICAgdG1wc3RyMVszMDBdOwojZW5kaWYKCiAgICBERUJVR01TR1RMKCgicGFyc2UtbWlicyIsICJTY2FubmluZyBkaXJlY3RvcnkgJXNcbiIsIGRpcm5hbWUpKTsKI2lmICEoZGVmaW5lZChXSU4zMikgfHwgZGVmaW5lZChjeWd3aW4pKQogICAgdG9rZW4gPSBuZXRzbm1wX21pYmluZGV4X2xvb2t1cCggZGlybmFtZSApOwogICAgaWYgKHRva2VuICYmIHN0YXQodG9rZW4sICZpZHhfc3RhdCkgPT0gMCAmJiBzdGF0KGRpcm5hbWUsICZkaXJfc3RhdCkgPT0gMCkgewogICAgICAgIGlmIChkaXJfc3RhdC5zdF9tdGltZSA8IGlkeF9zdGF0LnN0X210aW1lKSB7CiAgICAgICAgICAgIERFQlVHTVNHVEwoKCJwYXJzZS1taWJzIiwgIlRoZSBpbmRleCBpcyBnb29kXG4iKSk7CiAgICAgICAgICAgIGlmICgoaXAgPSBmb3Blbih0b2tlbiwgInIiKSkgIT0gTlVMTCkgewogICAgICAgICAgICAgICAgZmdldHModG1wc3RyLCBzaXplb2YodG1wc3RyKSwgaXApOyAvKiBTa2lwIGRpciBsaW5lICovCiAgICAgICAgICAgICAgICB3aGlsZSAoZnNjYW5mKGlwLCAiJTEyN3MlYyUyOTlzJWMiLCB0b2tlbiwgJnNwYWNlLCB0bXBzdHIsCgkJICAgICZuZXdsaW5lKSA9PSA0KSB7CgoJCSAgICAvKgoJCSAgICAgKiBJZiBhbiBvdmVyZmxvdyBvZiB0aGUgdG9rZW4gb3IgdG1wc3RyIGJ1ZmZlcnMgaGFzIGJlZW4KCQkgICAgICogZm91bmQgbG9nIGEgbWVzc2FnZSBhbmQgYnJlYWsgb3V0IG9mIHRoZSB3aGlsZSBsb29wLAoJCSAgICAgKiB0aHVzIHRoZSByZXN0IG9mIHRoZSBmaWxlIHRva2VucyB3aWxsIGJlIGlnbm9yZWQuCgkJICAgICAqLwoJCSAgICBpZiAoc3BhY2UgIT0gJyAnIHx8IG5ld2xpbmUgIT0gJ1xuJykgewoJCQlzbm1wX2xvZyhMT0dfRVJSLAoJCQkgICAgImFkZF9taWJkaXI6IHN0cmluZ3Mgc2Nhbm5lZCBpbiBmcm9tICVzLyVzICIgXAoJCQkgICAgImFyZSB0b28gbGFyZ2UuICBjb3VudCA9ICVkXG4gIiwgZGlybmFtZSwKCQkJICAgICIuaW5kZXgiLCBjb3VudCk7CgkJCSAgICBicmVhazsKCQkgICAgfQoJCSAgIAoJCSAgICBzbnByaW50Zih0bXBzdHIxLCBzaXplb2YodG1wc3RyMSksICIlcy8lcyIsIGRpcm5hbWUsIHRtcHN0cik7CiAgICAgICAgICAgICAgICAgICAgdG1wc3RyMVsgc2l6ZW9mKHRtcHN0cjEpLTEgXSA9IDA7CiAgICAgICAgICAgICAgICAgICAgbmV3X21vZHVsZSh0b2tlbiwgdG1wc3RyMSk7CiAgICAgICAgICAgICAgICAgICAgY291bnQrKzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZjbG9zZShpcCk7CiAgICAgICAgICAgICAgICByZXR1cm4gY291bnQ7CiAgICAgICAgICAgIH0gZWxzZQogICAgICAgICAgICAgICAgREVCVUdNU0dUTCgoInBhcnNlLW1pYnMiLCAiQ2FuJ3QgcmVhZCBpbmRleFxuIikpOwogICAgICAgIH0gZWxzZQogICAgICAgICAgICBERUJVR01TR1RMKCgicGFyc2UtbWlicyIsICJJbmRleCBvdXRkYXRlZFxuIikpOwogICAgfSBlbHNlCiAgICAgICAgREVCVUdNU0dUTCgoInBhcnNlLW1pYnMiLCAiTm8gaW5kZXhcbiIpKTsKI2VuZGlmCgogICAgaWYgKChkaXIgPSBvcGVuZGlyKGRpcm5hbWUpKSkgewogICAgICAgIGlwID0gbmV0c25tcF9taWJpbmRleF9uZXcoIGRpcm5hbWUgKTsKICAgICAgICB3aGlsZSAoKGZpbGUgPSByZWFkZGlyKGRpcikpKSB7CiAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAqIE9ubHkgcGFyc2UgZmlsZSBuYW1lcyB0aGF0IGRvbid0IGJlZ2luIHdpdGggYSAnLicgCiAgICAgICAgICAgICAqIEFsc28gc2tpcCBmaWxlcyBlbmRpbmcgaW4gJ34nLCBvciBzdGFydGluZy9lbmRpbmcKICAgICAgICAgICAgICogd2l0aCAnIycgd2hpY2ggYXJlIHR5cGljYWxseSBlZGl0b3IgYmFja3VwIGZpbGVzLgogICAgICAgICAgICAgKi8KICAgICAgICAgICAgaWYgKGZpbGUtPmRfbmFtZSAhPSBOVUxMKSB7CiAgICAgICAgICAgICAgZm5hbWVfbGVuID0gc3RybGVuKCBmaWxlLT5kX25hbWUgKTsKICAgICAgICAgICAgICBpZiAoZm5hbWVfbGVuID4gMCAmJiBmaWxlLT5kX25hbWVbMF0gIT0gJy4nIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIGZpbGUtPmRfbmFtZVswXSAhPSAnIycKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBmaWxlLT5kX25hbWVbZm5hbWVfbGVuLTFdICE9ICcjJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIGZpbGUtPmRfbmFtZVtmbmFtZV9sZW4tMV0gIT0gJ34nKSB7CiAgICAgICAgICAgICAgICBzbnByaW50Zih0bXBzdHIsIHNpemVvZih0bXBzdHIpLCAiJXMvJXMiLCBkaXJuYW1lLCBmaWxlLT5kX25hbWUpOwogICAgICAgICAgICAgICAgdG1wc3RyWyBzaXplb2YodG1wc3RyKS0xIF0gPSAwOwogICAgICAgICAgICAgICAgaWYgKChkaXIyID0gb3BlbmRpcih0bXBzdHIpKSkgewogICAgICAgICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgICAgICAgICogZmlsZSBpcyBhIGRpcmVjdG9yeSwgZG9uJ3QgcmVhZCBpdCAKICAgICAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgICAgICBjbG9zZWRpcihkaXIyKTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCAhYWRkX21pYmZpbGUoIHRtcHN0ciwgZmlsZS0+ZF9uYW1lLCBpcCApKQogICAgICAgICAgICAgICAgICAgICAgICBjb3VudCsrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBGaWxlID0gb2xkRmlsZTsKICAgICAgICBjbG9zZWRpcihkaXIpOwogICAgICAgIGlmIChpcCkKICAgICAgICAgICAgZmNsb3NlKGlwKTsKICAgICAgICByZXR1cm4gKGNvdW50KTsKICAgIH0KICAgIGVsc2UKICAgICAgICBERUJVR01TR1RMKCgicGFyc2UtbWlicyIsImNhbm5vdCBvcGVuIE1JQiBkaXJlY3RvcnkgJXNcbiIsIGRpcm5hbWUpKTsKCiAgICByZXR1cm4gKC0xKTsKfQoKCi8qCiAqIFJldHVybnMgdGhlIHJvb3Qgb2YgdGhlIHdob2xlIHRyZWUKICogICAoZm9yIGJhY2t3YXJkcyBjb21wYXRhYmlsaXR5KQogKi8Kc3RydWN0IHRyZWUgICAgKgpyZWFkX21pYihjb25zdCBjaGFyICpmaWxlbmFtZSkKewogICAgRklMRSAgICAgICAgICAgKmZwOwogICAgY2hhciAgICAgICAgICAgIHRva2VuW01BWFRPS0VOXTsKCiAgICBmcCA9IGZvcGVuKGZpbGVuYW1lLCAiciIpOwogICAgaWYgKGZwID09IE5VTEwpIHsKICAgICAgICBzbm1wX2xvZ19wZXJyb3IoZmlsZW5hbWUpOwogICAgICAgIHJldHVybiBOVUxMOwogICAgfQogICAgbWliTGluZSA9IDE7CiAgICBGaWxlID0gZmlsZW5hbWU7CiAgICBERUJVR01TR1RMKCgicGFyc2UtbWlicyIsICJQYXJzaW5nIGZpbGU6ICVzLi4uXG4iLCBmaWxlbmFtZSkpOwogICAgaWYgKGdldF90b2tlbihmcCwgdG9rZW4sIE1BWFRPS0VOKSAhPSBMQUJFTCkgewoJICAgIHNubXBfbG9nKExPR19FUlIsICJGYWlsZWQgdG8gcGFyc2UgTUlCIGZpbGUgJXNcbiIsIGZpbGVuYW1lKTsKCSAgICBmY2xvc2UoZnApOwoJICAgIHJldHVybiBOVUxMOwogICAgfQogICAgZmNsb3NlKGZwKTsKICAgIG5ld19tb2R1bGUodG9rZW4sIGZpbGVuYW1lKTsKICAgICh2b2lkKSBuZXRzbm1wX3JlYWRfbW9kdWxlKHRva2VuKTsKCiAgICByZXR1cm4gdHJlZV9oZWFkOwp9CgoKc3RydWN0IHRyZWUgICAgKgpyZWFkX2FsbF9taWJzKHZvaWQpCnsKICAgIHN0cnVjdCBtb2R1bGUgICptcDsKCiAgICBmb3IgKG1wID0gbW9kdWxlX2hlYWQ7IG1wOyBtcCA9IG1wLT5uZXh0KQogICAgICAgIGlmIChtcC0+bm9faW1wb3J0cyA9PSAtMSkKICAgICAgICAgICAgbmV0c25tcF9yZWFkX21vZHVsZShtcC0+bmFtZSk7CiAgICBhZG9wdF9vcnBoYW5zKCk7CgogICAgcmV0dXJuIHRyZWVfaGVhZDsKfQoKCiNpZmRlZiBURVNUCmludCBtYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pCnsKICAgIGludCAgICAgICAgICAgICBpOwogICAgc3RydWN0IHRyZWUgICAgKnRwOwogICAgbmV0c25tcF9kc19zZXRfaW50KE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgTkVUU05NUF9EU19MSUJfTUlCX1dBUk5JTkdTLCAyKTsKCiAgICBuZXRzbm1wX2luaXRfbWliKCk7CgogICAgaWYgKGFyZ2MgPT0gMSkKICAgICAgICAodm9pZCkgcmVhZF9hbGxfbWlicygpOwogICAgZWxzZQogICAgICAgIGZvciAoaSA9IDE7IGkgPCBhcmdjOyBpKyspCiAgICAgICAgICAgIHJlYWRfbWliKGFyZ3ZbaV0pOwoKICAgIGZvciAodHAgPSB0cmVlX2hlYWQ7IHRwOyB0cCA9IHRwLT5uZXh0X3BlZXIpCiAgICAgICAgcHJpbnRfc3VidHJlZShzdGRvdXQsIHRwLCAwKTsKICAgIGZyZWVfdHJlZSh0cmVlX2hlYWQpOwoKICAgIHJldHVybiAwOwp9CiNlbmRpZiAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVEVTVCAqLwoKc3RhdGljIGludApwYXJzZVF1b3RlU3RyaW5nKEZJTEUgKiBmcCwgY2hhciAqdG9rZW4sIGludCBtYXh0bGVuKQp7CiAgICByZWdpc3RlciBpbnQgICAgY2g7CiAgICBpbnQgICAgICAgICAgICAgY291bnQgPSAwOwogICAgaW50ICAgICAgICAgICAgIHRvb19sb25nID0gMDsKICAgIGNoYXIgICAgICAgICAgICp0b2tlbl9zdGFydCA9IHRva2VuOwoKICAgIGZvciAoY2ggPSBnZXRjKGZwKTsgY2ggIT0gRU9GOyBjaCA9IGdldGMoZnApKSB7CiAgICAgICAgaWYgKGNoID09ICdccicpCiAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIGlmIChjaCA9PSAnXG4nKSB7CiAgICAgICAgICAgIG1pYkxpbmUrKzsKICAgICAgICB9IGVsc2UgaWYgKGNoID09ICciJykgewogICAgICAgICAgICAqdG9rZW4gPSAnXDAnOwogICAgICAgICAgICBpZiAodG9vX2xvbmcgJiYgbmV0c25tcF9kc19nZXRfaW50KE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgCgkJCQkJICAgTkVUU05NUF9EU19MSUJfTUlCX1dBUk5JTkdTKSA+IDEpIHsKICAgICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgICAgKiBzaG93IHNob3J0IGZvcm0gZm9yIGJyZXZpdHkgc2FrZSAKICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgY2hhciAgICAgICAgICAgIGNoX3NhdmUgPSAqKHRva2VuX3N0YXJ0ICsgNTApOwogICAgICAgICAgICAgICAgKih0b2tlbl9zdGFydCArIDUwKSA9ICdcMCc7CiAgICAgICAgICAgICAgICBwcmludF9lcnJvcigiV2FybmluZzogc3RyaW5nIHRvbyBsb25nIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRva2VuX3N0YXJ0LCBRVU9URVNUUklORyk7CiAgICAgICAgICAgICAgICAqKHRva2VuX3N0YXJ0ICsgNTApID0gY2hfc2F2ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gUVVPVEVTVFJJTkc7CiAgICAgICAgfQogICAgICAgIC8qCiAgICAgICAgICogbWF4aW11bSBkZXNjcmlwdGlvbiBsZW5ndGggY2hlY2suICBJZiBncmVhdGVyLCBrZWVwIHBhcnNpbmcKICAgICAgICAgKiBidXQgdHJ1bmNhdGUgdGhlIHN0cmluZyAKICAgICAgICAgKi8KICAgICAgICBpZiAoKytjb3VudCA8IG1heHRsZW4pCiAgICAgICAgICAgICp0b2tlbisrID0gY2g7CiAgICAgICAgZWxzZQogICAgICAgICAgICB0b29fbG9uZyA9IDE7CiAgICB9CgogICAgcmV0dXJuIDA7Cn0KCi8qCiAqIHN0cnVjdCBpbmRleF9saXN0ICoKICogZ2V0SW5kZXhlcyhGSUxFICpmcCk6CiAqICAgVGhpcyByb3V0aW5lIHBhcnNlcyBhIHN0cmluZyBsaWtlICB7IGJsYWggYmxhaCBibGFoIH0gYW5kIHJldHVybnMgYQogKiAgIGxpc3Qgb2YgdGhlIHN0cmluZ3MgZW5jbG9zZWQgd2l0aGluIGl0LgogKgogKi8Kc3RhdGljIHN0cnVjdCBpbmRleF9saXN0ICoKZ2V0SW5kZXhlcyhGSUxFICogZnAsIHN0cnVjdCBpbmRleF9saXN0ICoqcmV0cCkKewogICAgaW50ICAgICAgICAgICAgIHR5cGU7CiAgICBjaGFyICAgICAgICAgICAgdG9rZW5bTUFYVE9LRU5dOwogICAgY2hhciAgICAgICAgICAgIG5leHRJc0ltcGxpZWQgPSAwOwoKICAgIHN0cnVjdCBpbmRleF9saXN0ICpteWxpc3QgPSBOVUxMOwogICAgc3RydWN0IGluZGV4X2xpc3QgKipteXBwID0gJm15bGlzdDsKCiAgICBmcmVlX2luZGV4ZXMocmV0cCk7CgogICAgdHlwZSA9IGdldF90b2tlbihmcCwgdG9rZW4sIE1BWFRPS0VOKTsKCiAgICBpZiAodHlwZSAhPSBMRUZUQlJBQ0tFVCkgewogICAgICAgIHJldHVybiBOVUxMOwogICAgfQoKICAgIHR5cGUgPSBnZXRfdG9rZW4oZnAsIHRva2VuLCBNQVhUT0tFTik7CiAgICB3aGlsZSAodHlwZSAhPSBSSUdIVEJSQUNLRVQgJiYgdHlwZSAhPSBFTkRPRkZJTEUpIHsKICAgICAgICBpZiAoKHR5cGUgPT0gTEFCRUwpIHx8ICh0eXBlICYgU1lOVEFYX01BU0spKSB7CiAgICAgICAgICAgICpteXBwID0KICAgICAgICAgICAgICAgIChzdHJ1Y3QgaW5kZXhfbGlzdCAqKSBjYWxsb2MoMSwgc2l6ZW9mKHN0cnVjdCBpbmRleF9saXN0KSk7CiAgICAgICAgICAgIGlmICgqbXlwcCkgewogICAgICAgICAgICAgICAgKCpteXBwKS0+aWxhYmVsID0gc3RyZHVwKHRva2VuKTsKICAgICAgICAgICAgICAgICgqbXlwcCktPmlzaW1wbGllZCA9IG5leHRJc0ltcGxpZWQ7CiAgICAgICAgICAgICAgICBteXBwID0gJigqbXlwcCktPm5leHQ7CiAgICAgICAgICAgICAgICBuZXh0SXNJbXBsaWVkID0gMDsKICAgICAgICAgICAgfQogICAgICAgIH0gZWxzZSBpZiAodHlwZSA9PSBJTVBMSUVEKSB7CiAgICAgICAgICAgIG5leHRJc0ltcGxpZWQgPSAxOwogICAgICAgIH0KICAgICAgICB0eXBlID0gZ2V0X3Rva2VuKGZwLCB0b2tlbiwgTUFYVE9LRU4pOwogICAgfQoKICAgICpyZXRwID0gbXlsaXN0OwogICAgcmV0dXJuIG15bGlzdDsKfQoKc3RhdGljIHN0cnVjdCB2YXJiaW5kX2xpc3QgKgpnZXRWYXJiaW5kcyhGSUxFICogZnAsIHN0cnVjdCB2YXJiaW5kX2xpc3QgKipyZXRwKQp7CiAgICBpbnQgICAgICAgICAgICAgdHlwZTsKICAgIGNoYXIgICAgICAgICAgICB0b2tlbltNQVhUT0tFTl07CgogICAgc3RydWN0IHZhcmJpbmRfbGlzdCAqbXlsaXN0ID0gTlVMTDsKICAgIHN0cnVjdCB2YXJiaW5kX2xpc3QgKipteXBwID0gJm15bGlzdDsKCiAgICBmcmVlX3ZhcmJpbmRzKHJldHApOwoKICAgIHR5cGUgPSBnZXRfdG9rZW4oZnAsIHRva2VuLCBNQVhUT0tFTik7CgogICAgaWYgKHR5cGUgIT0gTEVGVEJSQUNLRVQpIHsKICAgICAgICByZXR1cm4gTlVMTDsKICAgIH0KCiAgICB0eXBlID0gZ2V0X3Rva2VuKGZwLCB0b2tlbiwgTUFYVE9LRU4pOwogICAgd2hpbGUgKHR5cGUgIT0gUklHSFRCUkFDS0VUICYmIHR5cGUgIT0gRU5ET0ZGSUxFKSB7CiAgICAgICAgaWYgKCh0eXBlID09IExBQkVMKSB8fCAodHlwZSAmIFNZTlRBWF9NQVNLKSkgewogICAgICAgICAgICAqbXlwcCA9CiAgICAgICAgICAgICAgICAoc3RydWN0IHZhcmJpbmRfbGlzdCAqKSBjYWxsb2MoMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yoc3RydWN0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhcmJpbmRfbGlzdCkpOwogICAgICAgICAgICBpZiAoKm15cHApIHsKICAgICAgICAgICAgICAgICgqbXlwcCktPnZibGFiZWwgPSBzdHJkdXAodG9rZW4pOwogICAgICAgICAgICAgICAgbXlwcCA9ICYoKm15cHApLT5uZXh0OwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHR5cGUgPSBnZXRfdG9rZW4oZnAsIHRva2VuLCBNQVhUT0tFTik7CiAgICB9CgogICAgKnJldHAgPSBteWxpc3Q7CiAgICByZXR1cm4gbXlsaXN0Owp9CgpzdGF0aWMgdm9pZApmcmVlX2luZGV4ZXMoc3RydWN0IGluZGV4X2xpc3QgKipzcHApCnsKICAgIGlmIChzcHAgJiYgKnNwcCkgewogICAgICAgIHN0cnVjdCBpbmRleF9saXN0ICpwcCwgKm5wcDsKCiAgICAgICAgcHAgPSAqc3BwOwogICAgICAgICpzcHAgPSBOVUxMOwoKICAgICAgICB3aGlsZSAocHApIHsKICAgICAgICAgICAgbnBwID0gcHAtPm5leHQ7CiAgICAgICAgICAgIGlmIChwcC0+aWxhYmVsKQogICAgICAgICAgICAgICAgZnJlZShwcC0+aWxhYmVsKTsKICAgICAgICAgICAgZnJlZShwcCk7CiAgICAgICAgICAgIHBwID0gbnBwOwogICAgICAgIH0KICAgIH0KfQoKc3RhdGljIHZvaWQKZnJlZV92YXJiaW5kcyhzdHJ1Y3QgdmFyYmluZF9saXN0ICoqc3BwKQp7CiAgICBpZiAoc3BwICYmICpzcHApIHsKICAgICAgICBzdHJ1Y3QgdmFyYmluZF9saXN0ICpwcCwgKm5wcDsKCiAgICAgICAgcHAgPSAqc3BwOwogICAgICAgICpzcHAgPSBOVUxMOwoKICAgICAgICB3aGlsZSAocHApIHsKICAgICAgICAgICAgbnBwID0gcHAtPm5leHQ7CiAgICAgICAgICAgIGlmIChwcC0+dmJsYWJlbCkKICAgICAgICAgICAgICAgIGZyZWUocHAtPnZibGFiZWwpOwogICAgICAgICAgICBmcmVlKHBwKTsKICAgICAgICAgICAgcHAgPSBucHA7CiAgICAgICAgfQogICAgfQp9CgpzdGF0aWMgdm9pZApmcmVlX3JhbmdlcyhzdHJ1Y3QgcmFuZ2VfbGlzdCAqKnNwcCkKewogICAgaWYgKHNwcCAmJiAqc3BwKSB7CiAgICAgICAgc3RydWN0IHJhbmdlX2xpc3QgKnBwLCAqbnBwOwoKICAgICAgICBwcCA9ICpzcHA7CiAgICAgICAgKnNwcCA9IE5VTEw7CgogICAgICAgIHdoaWxlIChwcCkgewogICAgICAgICAgICBucHAgPSBwcC0+bmV4dDsKICAgICAgICAgICAgZnJlZShwcCk7CiAgICAgICAgICAgIHBwID0gbnBwOwogICAgICAgIH0KICAgIH0KfQoKc3RhdGljIHZvaWQKZnJlZV9lbnVtcyhzdHJ1Y3QgZW51bV9saXN0ICoqc3BwKQp7CiAgICBpZiAoc3BwICYmICpzcHApIHsKICAgICAgICBzdHJ1Y3QgZW51bV9saXN0ICpwcCwgKm5wcDsKCiAgICAgICAgcHAgPSAqc3BwOwogICAgICAgICpzcHAgPSBOVUxMOwoKICAgICAgICB3aGlsZSAocHApIHsKICAgICAgICAgICAgbnBwID0gcHAtPm5leHQ7CiAgICAgICAgICAgIGlmIChwcC0+bGFiZWwpCiAgICAgICAgICAgICAgICBmcmVlKHBwLT5sYWJlbCk7CiAgICAgICAgICAgIGZyZWUocHApOwogICAgICAgICAgICBwcCA9IG5wcDsKICAgICAgICB9CiAgICB9Cn0KCnN0YXRpYyBzdHJ1Y3QgZW51bV9saXN0ICoKY29weV9lbnVtcyhzdHJ1Y3QgZW51bV9saXN0ICpzcCkKewogICAgc3RydWN0IGVudW1fbGlzdCAqeHAgPSBOVUxMLCAqKnNwcCA9ICZ4cDsKCiAgICB3aGlsZSAoc3ApIHsKICAgICAgICAqc3BwID0gKHN0cnVjdCBlbnVtX2xpc3QgKikgY2FsbG9jKDEsIHNpemVvZihzdHJ1Y3QgZW51bV9saXN0KSk7CiAgICAgICAgaWYgKCEqc3BwKQogICAgICAgICAgICBicmVhazsKICAgICAgICAoKnNwcCktPmxhYmVsID0gc3RyZHVwKHNwLT5sYWJlbCk7CiAgICAgICAgKCpzcHApLT52YWx1ZSA9IHNwLT52YWx1ZTsKICAgICAgICBzcHAgPSAmKCpzcHApLT5uZXh0OwogICAgICAgIHNwID0gc3AtPm5leHQ7CiAgICB9CiAgICByZXR1cm4gKHhwKTsKfQoKc3RhdGljIHN0cnVjdCByYW5nZV9saXN0ICoKY29weV9yYW5nZXMoc3RydWN0IHJhbmdlX2xpc3QgKnNwKQp7CiAgICBzdHJ1Y3QgcmFuZ2VfbGlzdCAqeHAgPSBOVUxMLCAqKnNwcCA9ICZ4cDsKCiAgICB3aGlsZSAoc3ApIHsKICAgICAgICAqc3BwID0gKHN0cnVjdCByYW5nZV9saXN0ICopIGNhbGxvYygxLCBzaXplb2Yoc3RydWN0IHJhbmdlX2xpc3QpKTsKICAgICAgICBpZiAoISpzcHApCiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICgqc3BwKS0+bG93ID0gc3AtPmxvdzsKICAgICAgICAoKnNwcCktPmhpZ2ggPSBzcC0+aGlnaDsKICAgICAgICBzcHAgPSAmKCpzcHApLT5uZXh0OwogICAgICAgIHNwID0gc3AtPm5leHQ7CiAgICB9CiAgICByZXR1cm4gKHhwKTsKfQoKLyoKICogVGhpcyByb3V0aW5lIHBhcnNlcyBhIHN0cmluZyBsaWtlICB7IGJsYWggYmxhaCBibGFoIH0gYW5kIHJldHVybnMgT0JKSUQgaWYKICogaXQgaXMgd2VsbCBmb3JtZWQsIGFuZCBOVUxMIGlmIG5vdC4KICovCnN0YXRpYyBpbnQKdG9zc09iamVjdElkZW50aWZpZXIoRklMRSAqIGZwKQp7CiAgICBpbnQgICAgICAgICAgICAgdHlwZTsKICAgIGNoYXIgICAgICAgICAgICB0b2tlbltNQVhUT0tFTl07CiAgICBpbnQgICAgICAgICAgICAgYnJhY2tldGNvdW50ID0gMTsKCiAgICB0eXBlID0gZ2V0X3Rva2VuKGZwLCB0b2tlbiwgTUFYVE9LRU4pOwoKICAgIGlmICh0eXBlICE9IExFRlRCUkFDS0VUKQogICAgICAgIHJldHVybiAwOwogICAgd2hpbGUgKCh0eXBlICE9IFJJR0hUQlJBQ0tFVCB8fCBicmFja2V0Y291bnQgPiAwKSAmJiB0eXBlICE9IEVORE9GRklMRSkgewogICAgICAgIHR5cGUgPSBnZXRfdG9rZW4oZnAsIHRva2VuLCBNQVhUT0tFTik7CiAgICAgICAgaWYgKHR5cGUgPT0gTEVGVEJSQUNLRVQpCiAgICAgICAgICAgIGJyYWNrZXRjb3VudCsrOwogICAgICAgIGVsc2UgaWYgKHR5cGUgPT0gUklHSFRCUkFDS0VUKQogICAgICAgICAgICBicmFja2V0Y291bnQtLTsKICAgIH0KCiAgICBpZiAodHlwZSA9PSBSSUdIVEJSQUNLRVQpCiAgICAgICAgcmV0dXJuIE9CSklEOwogICAgZWxzZQogICAgICAgIHJldHVybiAwOwp9CgovKiBGaW5kIG5vZGUgaW4gYW55IE1JQiBtb2R1bGUKICAgVXNlZCBieSBQZXJsIG1vZHVsZXMJCSovCnN0cnVjdCB0cmVlICAgICoKZmluZF9ub2RlKGNvbnN0IGNoYXIgKm5hbWUsIHN0cnVjdCB0cmVlICpzdWJ0cmVlKQp7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFVudXNlZCAqLwogICAgcmV0dXJuIChmaW5kX3RyZWVfbm9kZShuYW1lLCAtMSkpOwp9CgovKiBGaW5kIG5vZGUgaW4gc3BlY2lmaWMgTUlCIG1vZHVsZQogICBVc2VkIGJ5IFBlcmwgbW9kdWxlcwkJKi8Kc3RydWN0IHRyZWUgICAgKgpmaW5kX25vZGUyKGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKm1vZHVsZSkKeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICBpbnQgbW9kaWQgPSAtMTsKICBpZiAobW9kdWxlKSB7CiAgICBtb2RpZCA9IHdoaWNoX21vZHVsZShtb2R1bGUpOwogIH0KICBpZiAobW9kaWQgPT0gLTEpCiAgewogICAgcmV0dXJuIChOVUxMKTsKICB9CiAgcmV0dXJuIChmaW5kX3RyZWVfbm9kZShuYW1lLCBtb2RpZCkpOwp9CgpzdHJ1Y3QgbW9kdWxlICAqCmZpbmRfbW9kdWxlKGludCBtaWQpCnsKICAgIHN0cnVjdCBtb2R1bGUgICptcDsKCiAgICBmb3IgKG1wID0gbW9kdWxlX2hlYWQ7IG1wICE9IE5VTEw7IG1wID0gbXAtPm5leHQpIHsKICAgICAgICBpZiAobXAtPm1vZGlkID09IG1pZCkKICAgICAgICAgICAgYnJlYWs7CiAgICB9CiAgICByZXR1cm4gbXA7Cn0KCgpzdGF0aWMgY2hhciAgICAgbGVhdmVfaW5kZW50WzI1Nl07CnN0YXRpYyBpbnQgICAgICBsZWF2ZV93YXNfc2ltcGxlOwoKc3RhdGljIHZvaWQKcHJpbnRfbWliX2xlYXZlcyhGSUxFICogZiwgc3RydWN0IHRyZWUgKnRwLCBpbnQgd2lkdGgpCnsKICAgIHN0cnVjdCB0cmVlICAgICpudHA7CiAgICBjaGFyICAgICAgICAgICAqaXAgPSBsZWF2ZV9pbmRlbnQgKyBzdHJsZW4obGVhdmVfaW5kZW50KSAtIDE7CiAgICBjaGFyICAgICAgICAgICAgbGFzdF9pcGNoID0gKmlwOwoKICAgICppcCA9ICcrJzsKICAgIGlmICh0cC0+dHlwZSA9PSBUWVBFX09USEVSIHx8IHRwLT50eXBlID4gVFlQRV9TSU1QTEVfTEFTVCkgewogICAgICAgIGZwcmludGYoZiwgIiVzLS0lcyglbGQpXG4iLCBsZWF2ZV9pbmRlbnQsIHRwLT5sYWJlbCwgdHAtPnN1YmlkKTsKICAgICAgICBpZiAodHAtPmluZGV4ZXMpIHsKICAgICAgICAgICAgc3RydWN0IGluZGV4X2xpc3QgKnhwID0gdHAtPmluZGV4ZXM7CiAgICAgICAgICAgIGludCAgICAgICAgICAgICBmaXJzdCA9IDEsIGNwb3MgPSAwLCBsZW4sIGNtYXggPQogICAgICAgICAgICAgICAgd2lkdGggLSBzdHJsZW4obGVhdmVfaW5kZW50KSAtIDEyOwogICAgICAgICAgICAqaXAgPSBsYXN0X2lwY2g7CiAgICAgICAgICAgIGZwcmludGYoZiwgIiVzICB8ICBJbmRleDogIiwgbGVhdmVfaW5kZW50KTsKICAgICAgICAgICAgd2hpbGUgKHhwKSB7CiAgICAgICAgICAgICAgICBpZiAoZmlyc3QpCiAgICAgICAgICAgICAgICAgICAgZmlyc3QgPSAwOwogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgIGZwcmludGYoZiwgIiwgIik7CiAgICAgICAgICAgICAgICBjcG9zICs9IChsZW4gPSBzdHJsZW4oeHAtPmlsYWJlbCkgKyAyKTsKICAgICAgICAgICAgICAgIGlmIChjcG9zID4gY21heCkgewogICAgICAgICAgICAgICAgICAgIGZwcmludGYoZiwgIlxuIik7CiAgICAgICAgICAgICAgICAgICAgZnByaW50ZihmLCAiJXMgIHwgICAgICAgICAiLCBsZWF2ZV9pbmRlbnQpOwogICAgICAgICAgICAgICAgICAgIGNwb3MgPSBsZW47CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmcHJpbnRmKGYsICIlcyIsIHhwLT5pbGFiZWwpOwogICAgICAgICAgICAgICAgeHAgPSB4cC0+bmV4dDsKICAgICAgICAgICAgfQogICAgICAgICAgICBmcHJpbnRmKGYsICJcbiIpOwogICAgICAgICAgICAqaXAgPSAnKyc7CiAgICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgICBjb25zdCBjaGFyICAgICAqYWNjLCAqdHlwOwogICAgICAgIGludCAgICAgICAgICAgICBzaXplID0gMDsKICAgICAgICBzd2l0Y2ggKHRwLT5hY2Nlc3MpIHsKICAgICAgICBjYXNlIE1JQl9BQ0NFU1NfTk9BQ0NFU1M6CiAgICAgICAgICAgIGFjYyA9ICItLS0tIjsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBNSUJfQUNDRVNTX1JFQURPTkxZOgogICAgICAgICAgICBhY2MgPSAiLVItLSI7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgTUlCX0FDQ0VTU19XUklURU9OTFk6CiAgICAgICAgICAgIGFjYyA9ICItLVctIjsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBNSUJfQUNDRVNTX1JFQURXUklURToKICAgICAgICAgICAgYWNjID0gIi1SVy0iOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIE1JQl9BQ0NFU1NfTk9USUZZOgogICAgICAgICAgICBhY2MgPSAiLS0tTiI7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgTUlCX0FDQ0VTU19DUkVBVEU6CiAgICAgICAgICAgIGFjYyA9ICJDUi0tIjsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgYWNjID0gIiAgICAiOwogICAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgICAgc3dpdGNoICh0cC0+dHlwZSkgewogICAgICAgIGNhc2UgVFlQRV9PQkpJRDoKICAgICAgICAgICAgdHlwID0gIk9iaklEICAgICI7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgVFlQRV9PQ1RFVFNUUjoKICAgICAgICAgICAgdHlwID0gIlN0cmluZyAgICI7CiAgICAgICAgICAgIHNpemUgPSAxOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIFRZUEVfSU5URUdFUjoKICAgICAgICAgICAgaWYgKHRwLT5lbnVtcykKICAgICAgICAgICAgICAgIHR5cCA9ICJFbnVtVmFsICAiOwogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB0eXAgPSAiSU5URUdFUiAgIjsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBUWVBFX05FVEFERFI6CiAgICAgICAgICAgIHR5cCA9ICJOZXRBZGRyICAiOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIFRZUEVfSVBBRERSOgogICAgICAgICAgICB0eXAgPSAiSXBBZGRyICAgIjsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBUWVBFX0NPVU5URVI6CiAgICAgICAgICAgIHR5cCA9ICJDb3VudGVyICAiOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIFRZUEVfR0FVR0U6CiAgICAgICAgICAgIHR5cCA9ICJHYXVnZSAgICAiOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIFRZUEVfVElNRVRJQ0tTOgogICAgICAgICAgICB0eXAgPSAiVGltZVRpY2tzIjsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBUWVBFX09QQVFVRToKICAgICAgICAgICAgdHlwID0gIk9wYXF1ZSAgICI7CiAgICAgICAgICAgIHNpemUgPSAxOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIFRZUEVfTlVMTDoKICAgICAgICAgICAgdHlwID0gIk51bGwgICAgICI7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgVFlQRV9DT1VOVEVSNjQ6CiAgICAgICAgICAgIHR5cCA9ICJDb3VudGVyNjQiOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIFRZUEVfQklUU1RSSU5HOgogICAgICAgICAgICB0eXAgPSAiQml0U3RyaW5nIjsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBUWVBFX05TQVBBRERSRVNTOgogICAgICAgICAgICB0eXAgPSAiTnNhcEFkZHIgIjsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBUWVBFX1VOU0lHTkVEMzI6CiAgICAgICAgICAgIHR5cCA9ICJVbnNpZ25lZCAiOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIFRZUEVfVUlOVEVHRVI6CiAgICAgICAgICAgIHR5cCA9ICJVSW50ZWdlciAiOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIFRZUEVfSU5URUdFUjMyOgogICAgICAgICAgICB0eXAgPSAiSW50ZWdlcjMyIjsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgdHlwID0gIiAgICAgICAgICI7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgICBmcHJpbnRmKGYsICIlcy0tICVzICVzICVzKCVsZClcbiIsIGxlYXZlX2luZGVudCwgYWNjLCB0eXAsCiAgICAgICAgICAgICAgICB0cC0+bGFiZWwsIHRwLT5zdWJpZCk7CiAgICAgICAgKmlwID0gbGFzdF9pcGNoOwogICAgICAgIGlmICh0cC0+dGNfaW5kZXggPj0gMCkKICAgICAgICAgICAgZnByaW50ZihmLCAiJXMgICAgICAgIFRleHR1YWwgQ29udmVudGlvbjogJXNcbiIsIGxlYXZlX2luZGVudCwKICAgICAgICAgICAgICAgICAgICB0Y2xpc3RbdHAtPnRjX2luZGV4XS5kZXNjcmlwdG9yKTsKICAgICAgICBpZiAodHAtPmVudW1zKSB7CiAgICAgICAgICAgIHN0cnVjdCBlbnVtX2xpc3QgKmVwID0gdHAtPmVudW1zOwogICAgICAgICAgICBpbnQgICAgICAgICAgICAgY3BvcyA9IDAsIGNtYXggPQogICAgICAgICAgICAgICAgd2lkdGggLSBzdHJsZW4obGVhdmVfaW5kZW50KSAtIDE2OwogICAgICAgICAgICBmcHJpbnRmKGYsICIlcyAgICAgICAgVmFsdWVzOiAiLCBsZWF2ZV9pbmRlbnQpOwogICAgICAgICAgICB3aGlsZSAoZXApIHsKICAgICAgICAgICAgICAgIGNoYXIgICAgICAgICAgICBidWZbODBdOwogICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgIGJ1Znc7CiAgICAgICAgICAgICAgICBpZiAoZXAgIT0gdHAtPmVudW1zKQogICAgICAgICAgICAgICAgICAgIGZwcmludGYoZiwgIiwgIik7CiAgICAgICAgICAgICAgICBzbnByaW50ZihidWYsIHNpemVvZihidWYpLCAiJXMoJWQpIiwgZXAtPmxhYmVsLCBlcC0+dmFsdWUpOwogICAgICAgICAgICAgICAgYnVmWyBzaXplb2YoYnVmKS0xIF0gPSAwOwogICAgICAgICAgICAgICAgY3BvcyArPSAoYnVmdyA9IHN0cmxlbihidWYpICsgMik7CiAgICAgICAgICAgICAgICBpZiAoY3BvcyA+PSBjbWF4KSB7CiAgICAgICAgICAgICAgICAgICAgZnByaW50ZihmLCAiXG4lcyAgICAgICAgICAgICAgICAiLCBsZWF2ZV9pbmRlbnQpOwogICAgICAgICAgICAgICAgICAgIGNwb3MgPSBidWZ3OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnByaW50ZihmLCAiJXMiLCBidWYpOwogICAgICAgICAgICAgICAgZXAgPSBlcC0+bmV4dDsKICAgICAgICAgICAgfQogICAgICAgICAgICBmcHJpbnRmKGYsICJcbiIpOwogICAgICAgIH0KICAgICAgICBpZiAodHAtPnJhbmdlcykgewogICAgICAgICAgICBzdHJ1Y3QgcmFuZ2VfbGlzdCAqcnAgPSB0cC0+cmFuZ2VzOwogICAgICAgICAgICBpZiAoc2l6ZSkKICAgICAgICAgICAgICAgIGZwcmludGYoZiwgIiVzICAgICAgICBTaXplOiAiLCBsZWF2ZV9pbmRlbnQpOwogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICBmcHJpbnRmKGYsICIlcyAgICAgICAgUmFuZ2U6ICIsIGxlYXZlX2luZGVudCk7CiAgICAgICAgICAgIHdoaWxlIChycCkgewogICAgICAgICAgICAgICAgaWYgKHJwICE9IHRwLT5yYW5nZXMpCiAgICAgICAgICAgICAgICAgICAgZnByaW50ZihmLCAiIHwgIik7CiAgICAgICAgICAgICAgICBwcmludF9yYW5nZV92YWx1ZShmLCB0cC0+dHlwZSwgcnApOwogICAgICAgICAgICAgICAgcnAgPSBycC0+bmV4dDsKICAgICAgICAgICAgfQogICAgICAgICAgICBmcHJpbnRmKGYsICJcbiIpOwogICAgICAgIH0KICAgIH0KICAgICppcCA9IGxhc3RfaXBjaDsKICAgIHN0cmNhdChsZWF2ZV9pbmRlbnQsICIgIHwiKTsKICAgIGxlYXZlX3dhc19zaW1wbGUgPSB0cC0+dHlwZSAhPSBUWVBFX09USEVSOwoKICAgIHsKICAgICAgICBpbnQgICAgICAgICAgICAgaSwgaiwgY291bnQgPSAwOwogICAgICAgIHN0cnVjdCBsZWF2ZSB7CiAgICAgICAgICAgIG9pZCAgICAgICAgICAgICBpZDsKICAgICAgICAgICAgc3RydWN0IHRyZWUgICAgKnRwOwogICAgICAgIH0gICAgICAgICAgICAgICpsZWF2ZXMsICpscDsKCiAgICAgICAgZm9yIChudHAgPSB0cC0+Y2hpbGRfbGlzdDsgbnRwOyBudHAgPSBudHAtPm5leHRfcGVlcikKICAgICAgICAgICAgY291bnQrKzsKICAgICAgICBpZiAoY291bnQpIHsKICAgICAgICAgICAgbGVhdmVzID0gKHN0cnVjdCBsZWF2ZSAqKSBjYWxsb2MoY291bnQsIHNpemVvZihzdHJ1Y3QgbGVhdmUpKTsKICAgICAgICAgICAgaWYgKCFsZWF2ZXMpCiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIGZvciAobnRwID0gdHAtPmNoaWxkX2xpc3QsIGNvdW50ID0gMDsgbnRwOwogICAgICAgICAgICAgICAgIG50cCA9IG50cC0+bmV4dF9wZWVyKSB7CiAgICAgICAgICAgICAgICBmb3IgKGkgPSAwLCBscCA9IGxlYXZlczsgaSA8IGNvdW50OyBpKyssIGxwKyspCiAgICAgICAgICAgICAgICAgICAgaWYgKGxwLT5pZCA+PSBudHAtPnN1YmlkKQogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGZvciAoaiA9IGNvdW50OyBqID4gaTsgai0tKQogICAgICAgICAgICAgICAgICAgIGxlYXZlc1tqXSA9IGxlYXZlc1tqIC0gMV07CiAgICAgICAgICAgICAgICBscC0+aWQgPSBudHAtPnN1YmlkOwogICAgICAgICAgICAgICAgbHAtPnRwID0gbnRwOwogICAgICAgICAgICAgICAgY291bnQrKzsKICAgICAgICAgICAgfQogICAgICAgICAgICBmb3IgKGkgPSAxLCBscCA9IGxlYXZlczsgaSA8PSBjb3VudDsgaSsrLCBscCsrKSB7CiAgICAgICAgICAgICAgICBpZiAoIWxlYXZlX3dhc19zaW1wbGUgfHwgbHAtPnRwLT50eXBlID09IDApCiAgICAgICAgICAgICAgICAgICAgZnByaW50ZihmLCAiJXNcbiIsIGxlYXZlX2luZGVudCk7CiAgICAgICAgICAgICAgICBpZiAoaSA9PSBjb3VudCkKICAgICAgICAgICAgICAgICAgICBpcFszXSA9ICcgJzsKICAgICAgICAgICAgICAgIHByaW50X21pYl9sZWF2ZXMoZiwgbHAtPnRwLCB3aWR0aCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZnJlZShsZWF2ZXMpOwogICAgICAgICAgICBsZWF2ZV93YXNfc2ltcGxlID0gMDsKICAgICAgICB9CiAgICB9CiAgICBpcFsxXSA9IDA7Cn0KCnZvaWQKcHJpbnRfbWliX3RyZWUoRklMRSAqIGYsIHN0cnVjdCB0cmVlICp0cCwgaW50IHdpZHRoKQp7CiAgICBsZWF2ZV9pbmRlbnRbMF0gPSAnICc7CiAgICBsZWF2ZV9pbmRlbnRbMV0gPSAwOwogICAgbGVhdmVfd2FzX3NpbXBsZSA9IDE7CiAgICBwcmludF9taWJfbGVhdmVzKGYsIHRwLCB3aWR0aCk7Cn0KCgovKgogKiBNZXJnZSB0aGUgcGFyc2VkIG9iamVjdCBpZGVudGlmaWVyIHdpdGggdGhlIGV4aXN0aW5nIG5vZGUuCiAqIElmIHRoZXJlIGlzIGEgcHJvYmxlbSB3aXRoIHRoZSBpZGVudGlmaWVyLCByZWxlYXNlIHRoZSBleGlzdGluZyBub2RlLgogKi8Kc3RhdGljIHN0cnVjdCBub2RlICoKbWVyZ2VfcGFyc2Vfb2JqZWN0aWQoc3RydWN0IG5vZGUgKm5wLCBGSUxFICogZnAsIGNoYXIgKm5hbWUpCnsKICAgIHN0cnVjdCBub2RlICAgICpubnA7CiAgICAvKgogICAgICogcHJpbnRmKCJtZXJnZSBkZWZ2YWwgLS0+ICVzXG4iLG5wLT5kZWZhdWx0VmFsdWUpOyAKICAgICAqLwogICAgbm5wID0gcGFyc2Vfb2JqZWN0aWQoZnAsIG5hbWUpOwogICAgaWYgKG5ucCkgewoKICAgICAgICAvKgogICAgICAgICAqIGFwcGx5IGxhc3QgT0lEIHN1Yi1pZGVudGlmaWVyIGRhdGEgdG8gdGhlIGluZm9ybWF0aW9uIAogICAgICAgICAqLwogICAgICAgIC8qCiAgICAgICAgICogYWxyZWFkeSBjb2xsZWN0ZWQgZm9yIHRoaXMgbm9kZS4gCiAgICAgICAgICovCiAgICAgICAgc3RydWN0IG5vZGUgICAgKmhlYWRwLCAqbmV4dHA7CiAgICAgICAgaW50ICAgICAgICAgICAgIG5jb3VudCA9IDA7CiAgICAgICAgbmV4dHAgPSBoZWFkcCA9IG5ucDsKICAgICAgICB3aGlsZSAobm5wLT5uZXh0KSB7CiAgICAgICAgICAgIG5leHRwID0gbm5wOwogICAgICAgICAgICBuY291bnQrKzsKICAgICAgICAgICAgbm5wID0gbm5wLT5uZXh0OwogICAgICAgIH0KCiAgICAgICAgbnAtPmxhYmVsID0gbm5wLT5sYWJlbDsKICAgICAgICBucC0+c3ViaWQgPSBubnAtPnN1YmlkOwogICAgICAgIG5wLT5tb2RpZCA9IG5ucC0+bW9kaWQ7CiAgICAgICAgbnAtPnBhcmVudCA9IG5ucC0+cGFyZW50OwoJaWYgKG5ucC0+ZmlsZW5hbWUgIT0gTlVMTCkgewoJICBmcmVlKG5ucC0+ZmlsZW5hbWUpOwoJfQogICAgICAgIGZyZWUobm5wKTsKCiAgICAgICAgaWYgKG5jb3VudCkgewogICAgICAgICAgICBuZXh0cC0+bmV4dCA9IG5wOwogICAgICAgICAgICBucCA9IGhlYWRwOwogICAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgICAgZnJlZV9ub2RlKG5wKTsKICAgICAgICBucCA9IE5VTEw7CiAgICB9CgogICAgcmV0dXJuIG5wOwp9CgovKgogKiB0cmFuc2ZlciBkYXRhIHRvIHRyZWUgZnJvbSBub2RlCiAqCiAqIG1vdmUgcG9pbnRlcnMgZm9yIGFsbG9jJ2QgZGF0YSBmcm9tIG5wIHRvIHRwLgogKiB0aGlzIHByZXZlbnRzIHRoZW0gZnJvbSBiZWluZyBmcmVlZCB3aGVuIG5wIGlzIHJlbGVhc2VkLgogKiBwYXJlbnQgbWVtYmVyIGlzIG5vdCBtb3ZlZC4KICoKICogQ0FVVElPTjogbm9kZXMgbWF5IGJlIHJlcGVhdHMgb2YgZXhpc3RpbmcgdHJlZSBub2Rlcy4KICogVGhpcyBjYW4gaGFwcGVuIGVzcGVjaWFsbHkgd2hlbiByZXNvbHZpbmcgSU1QT1JUIGNsYXVzZXMuCiAqCiAqLwpzdGF0aWMgdm9pZAp0cmVlX2Zyb21fbm9kZShzdHJ1Y3QgdHJlZSAqdHAsIHN0cnVjdCBub2RlICpucCkKewogICAgZnJlZV9wYXJ0aWFsX3RyZWUodHAsIEZBTFNFKTsKCiAgICB0cC0+bGFiZWwgPSBucC0+bGFiZWw7CiAgICBucC0+bGFiZWwgPSBOVUxMOwogICAgdHAtPmVudW1zID0gbnAtPmVudW1zOwogICAgbnAtPmVudW1zID0gTlVMTDsKICAgIHRwLT5yYW5nZXMgPSBucC0+cmFuZ2VzOwogICAgbnAtPnJhbmdlcyA9IE5VTEw7CiAgICB0cC0+aW5kZXhlcyA9IG5wLT5pbmRleGVzOwogICAgbnAtPmluZGV4ZXMgPSBOVUxMOwogICAgdHAtPmF1Z21lbnRzID0gbnAtPmF1Z21lbnRzOwogICAgbnAtPmF1Z21lbnRzID0gTlVMTDsKICAgIHRwLT52YXJiaW5kcyA9IG5wLT52YXJiaW5kczsKICAgIG5wLT52YXJiaW5kcyA9IE5VTEw7CiAgICB0cC0+aGludCA9IG5wLT5oaW50OwogICAgbnAtPmhpbnQgPSBOVUxMOwogICAgdHAtPnVuaXRzID0gbnAtPnVuaXRzOwogICAgbnAtPnVuaXRzID0gTlVMTDsKICAgIHRwLT5kZXNjcmlwdGlvbiA9IG5wLT5kZXNjcmlwdGlvbjsKICAgIG5wLT5kZXNjcmlwdGlvbiA9IE5VTEw7CiAgICB0cC0+cmVmZXJlbmNlID0gbnAtPnJlZmVyZW5jZTsKICAgIG5wLT5yZWZlcmVuY2UgPSBOVUxMOwogICAgdHAtPmRlZmF1bHRWYWx1ZSA9IG5wLT5kZWZhdWx0VmFsdWU7CiAgICBucC0+ZGVmYXVsdFZhbHVlID0gTlVMTDsKICAgIHRwLT5zdWJpZCA9IG5wLT5zdWJpZDsKICAgIHRwLT50Y19pbmRleCA9IG5wLT50Y19pbmRleDsKICAgIHRwLT50eXBlID0gdHJhbnNsYXRpb25fdGFibGVbbnAtPnR5cGVdOwogICAgdHAtPmFjY2VzcyA9IG5wLT5hY2Nlc3M7CiAgICB0cC0+c3RhdHVzID0gbnAtPnN0YXR1czsKCiAgICBzZXRfZnVuY3Rpb24odHApOwp9CgojZW5kaWYgLyogTkVUU05NUF9ESVNBQkxFX01JQl9MT0FESU5HICovCg==