LyoKICogQ29weXJpZ2h0IChjKSAyMDA3LTIwMDggQXRoZXJvcyBDb21tdW5pY2F0aW9ucyBJbmMuCiAqCiAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueQogKiBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlCiAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMuCiAqCiAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUwogKiBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GCiAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SCiAqIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKICogV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOCiAqIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GCiAqIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCiAqLwoKI2luY2x1ZGUgImNwcmVjb21wLmgiCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiAgICBGVU5DVElPTiBERVNDUklQVElPTiAgICAgICAgICAgICAgICAgIHpmTGVkQ3RybFR5cGUxICAgICAgICAgICAgICAqLwovKiAgICAgIFRyYWRpdGlvbmFsIHNpbmdsZS1MRUQgc3RhdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiAgICBJTlBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiAgICAgIGRldiA6IGRldmljZSBwb2ludGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiAgICBPVVRQVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiAgICAgIE5vbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiAgICBBVVRIT1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiAgICAgIFN0ZXBoZW4gQ2hlbiAgICAgICAgQXRoZXJvcyBDb21tdW5pY2F0aW9ucywgSU5DLiAgICAyMDA3LjYgICAgICAqLwovKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovLyBiaXQgMTUtMTIgOiBUb2ZmIGZvciBTY2FuIHN0YXRlCi8vICAgICAxMS04IDogVG9uIGZvciBTY2FuIHN0YXRlCi8vICAgICA3IDogUmVzZXJ2ZWQKLy8gICAgIDYgOiBtb2RlCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8gICAgIGJpdCA2ID0gMAovLyAgICAgNS00IDogQ29ubmVjdCBzdGF0ZQovLyAgICAgICAgICAgMDAgPT4gYWx3YXlzIG9mZgovLyAgICAgICAgICAgMDEgPT4gYWx3YXlzIG9uCi8vICAgICAgICAgICAxMCA9PiBJZGxlIG9mZiwgYWNpdHZlIG9uCi8vICAgICAgICAgICAxMSA9PiBJZGxlIG9uLCBhY3RpdmUgb2ZmCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8gICAgIGJpdCA2ID0gMQovLyAgICAgNS00IDogZnJlcQovLyAgICAgICAgICAgMDAgPT4gMUh6Ci8vICAgICAgICAgICAwMSA9PiAwLjVIegovLyAgICAgICAgICAgMTAgPT4gMC4yNUh6Ci8vICAgICAgICAgICAxMSA9PiAwLjEyNUh6Ci8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8gICAgIDMgOiBQb3dlciBzYXZlIHN0YXRlCi8vICAgICAgICAgMCA9PiBhbHdheXMgb2ZmIGluIHBvd2VyIHNhdmUgc3RhdGUKLy8gICAgICAgICAxID0+IHdvcmtzIGFzIGNvbm5lY3Qgc3RhdGUKLy8gICAgIDIgOiBEaXNhYmxlIHN0YXRlCi8vICAgICAxIDogUmVzZXJ2ZWQKLy8gICAgIDAgOiBQb3dlci1vbiBzdGF0ZQp2b2lkIHpmTGVkQ3RybFR5cGUxKHpkZXZfdCogZGV2KQp7CiAgICB1MTZfdCBpOwogICAgdTMyX3QgdG9uLCB0b2ZmLCB0bXAsIHBlcmlvZDsKICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKCiAgICBmb3IgKGk9MDsgaTxaTV9NQVhfTEVEX05VTUJFUjsgaSsrKQogICAgewogICAgICAgIGlmICh6ZlN0YUlzQ29ubmVjdGVkKGRldikgIT0gVFJVRSkKICAgICAgICB7CiAgICAgICAgICAgIC8vU2NhbiBzdGF0ZQogICAgICAgICAgICB0b24gPSAoKHdkLT5sZWRTdHJ1Y3QubGVkTW9kZVtpXSAmIDB4ZjAwKSA+PiA4KSAqIDU7CiAgICAgICAgICAgIHRvZmYgPSAoKHdkLT5sZWRTdHJ1Y3QubGVkTW9kZVtpXSAmIDB4ZjAwMCkgPj4gMTIpICogNTsKCiAgICAgICAgICAgIGlmICgodG9uICsgdG9mZikgIT0gMCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdG1wID0gd2QtPmxlZFN0cnVjdC5jb3VudGVyIC8gKHRvbit0b2ZmKTsKICAgICAgICAgICAgICAgIHRtcCA9IHdkLT5sZWRTdHJ1Y3QuY291bnRlciAtICh0bXAgKiAodG9uK3RvZmYpKTsKICAgICAgICAgICAgICAgIGlmICh0bXAgPCB0b24pCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgemZIcExlZEN0cmwoZGV2LCBpLCAxKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB6ZkhwTGVkQ3RybChkZXYsIGksIDApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICB7CiAgICAgICAgICAgIGlmICgoemZQb3dlclNhdmluZ01ncklzU2xlZXBpbmcoZGV2KSkgJiYgKCh3ZC0+bGVkU3RydWN0LmxlZE1vZGVbaV0gJiAweDgpID09IDApKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB6ZkhwTGVkQ3RybChkZXYsIGksIDApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy9Db25uZWN0IHN0YXRlCiAgICAgICAgICAgICAgICBpZiAoKHdkLT5sZWRTdHJ1Y3QubGVkTW9kZVtpXSAmIDB4NDApID09IDApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCh3ZC0+bGVkU3RydWN0LmNvdW50ZXIgJiAxKSA9PSAwKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgemZIcExlZEN0cmwoZGV2LCBpLCAod2QtPmxlZFN0cnVjdC5sZWRNb2RlW2ldICYgMHgxMCkgPj4gNCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgod2QtPmxlZFN0cnVjdC50eFRyYWZmaWMgPiAwKSB8fCAod2QtPmxlZFN0cnVjdC5yeFRyYWZmaWMgPiAwKSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgd2QtPmxlZFN0cnVjdC50eFRyYWZmaWMgPSB3ZC0+bGVkU3RydWN0LnJ4VHJhZmZpYyA9IDA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHdkLT5sZWRTdHJ1Y3QubGVkTW9kZVtpXSAmIDB4MjApICE9IDApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgemZIcExlZEN0cmwoZGV2LCBpLCAoKHdkLT5sZWRTdHJ1Y3QubGVkTW9kZVtpXSAmIDB4MTApID4+IDQpXjEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfS8vIGlmICgod2QtPmxlZFN0cnVjdC5sZWRNb2RlW2ldICYgMHg0MCkgPT0gMCkKICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBwZXJpb2QgPSA1ICogKDEgPDwgKCh3ZC0+bGVkU3RydWN0LmxlZE1vZGVbaV0gJiAweDMwKSA+PiA0KSk7CiAgICAgICAgICAgICAgICAgICAgdG1wID0gd2QtPmxlZFN0cnVjdC5jb3VudGVyIC8gKHBlcmlvZCoyKTsKICAgICAgICAgICAgICAgICAgICB0bXAgPSB3ZC0+bGVkU3RydWN0LmNvdW50ZXIgLSAodG1wICogKHBlcmlvZCoyKSk7CiAgICAgICAgICAgICAgICAgICAgaWYgKHRtcCA8IHBlcmlvZCkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgod2QtPmxlZFN0cnVjdC5jb3VudGVyICYgMSkgPT0gMCkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgemZIcExlZEN0cmwoZGV2LCBpLCAwKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgod2QtPmxlZFN0cnVjdC50eFRyYWZmaWMgPiAwKSB8fCAod2QtPmxlZFN0cnVjdC5yeFRyYWZmaWMgPiAwKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3ZC0+bGVkU3RydWN0LnR4VHJhZmZpYyA9IHdkLT5sZWRTdHJ1Y3QucnhUcmFmZmljID0gMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6ZkhwTGVkQ3RybChkZXYsIGksIDEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgod2QtPmxlZFN0cnVjdC5jb3VudGVyICYgMSkgPT0gMCkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgemZIcExlZEN0cmwoZGV2LCBpLCAxKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgod2QtPmxlZFN0cnVjdC50eFRyYWZmaWMgPiAwKSB8fCAod2QtPmxlZFN0cnVjdC5yeFRyYWZmaWMgPiAwKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3ZC0+bGVkU3RydWN0LnR4VHJhZmZpYyA9IHdkLT5sZWRTdHJ1Y3QucnhUcmFmZmljID0gMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6ZkhwTGVkQ3RybChkZXYsIGksIDApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSAvL2Vsc2UsIGlmICgod2QtPmxlZFN0cnVjdC5sZWRNb2RlW2ldICYgMHg0MCkgPT0gMCkKICAgICAgICAgICAgfSAvL2Vsc2UsIGlmICh6ZlBvd2VyU2F2aW5nTWdySXNTbGVlcGluZyhkZXYpKQogICAgICAgIH0gLy9lbHNlIDogaWYgKHpmU3RhSXNDb25uZWN0ZWQoZGV2KSAhPSBUUlVFKQogICAgfSAvL2ZvciAoaT0wOyBpPFpNX01BWF9MRURfTlVNQkVSOyBpKyspCn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICAgIEZVTkNUSU9OIERFU0NSSVBUSU9OICAgICAgICAgICAgICAgICAgemZMZWRDdHJsVHlwZTIgICAgICAgICAgICAgICAgICAgICovCi8qICAgICAgQ3VzdG9taXplIGZvciBOZXRnZWFyIER1YWwtTEVEIHN0YXRlICgoYnVnIzMxMjkyKSkgICAgICAgICAgICAgICAgICAgICovCi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICAgICAgMS4gU3RhdHVzOiAgV2hlbiBkb25nbGUgZG9lcyBub3QgY29ubmVjdCB0byAyLjRHIG9yIDVHIGJ1dCBpbiBzaXRlICAgICovCi8qICAgICAgICAgICAgICAgICAgc3VydmV5L2Fzc29jaWF0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICAgICAgICAgTEVEIHN0YXR1czogU2xvdyBibGlua2luZywgQW1iZXIgdGhlbiBCbHVlIHBlciA1MDBtcyAgICAgICAgICAgICAgICovCi8qICAgICAgMi4gU3RhdHVzOglDb25uZWN0aW9uIGF0IDIuNEcgaW4gc2l0ZSBzdXJ2ZXkvYXNzb2NpYXRpb24gICAgICAgICAgICAgKi8KLyogICAgICAgICBMRUQgc3RhdHVzOiBTbG93IGJsaW5raW5nLCBBbWJlci9vZmYgcGVyIDUwMG1zICAgICAgICAgICAgICAgICAgICAgKi8KLyogICAgICAzLiBTdGF0dXM6CUNvbm5lY3Rpb24gYXQgNUcgaW4gc2l0ZSBzdXJ2ZXkvYXNzb2NpYXRpb24gICAgICAgICAgICAgICAqLwovKiAgICAgICAgIExFRCBzdGF0dXM6IFNsb3cgYmxpbmtpbmcsIEJsdWUvb2ZmIHBlciA1MDBtcyAgICAgICAgICAgICAgICAgICAgICAqLwovKiAgICAgIDQuIFN0YXR1czoJV2hlbiB0cmFuc2ZlciB0aGUgcGFja2V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICAgICAgICAgTEVEIHN0YXR1czogQmxpbmsgcGVyIHBhY2tldCwgaW5jbHVkaW5nIFRYIGFuZCBSWCAgICAgICAgICAgICAgICAgICovCi8qICAgICAgNS4gU3RhdHVzOglXaGVuIGxpbmtpbmcgaXMgZXN0YWJsaXNoZWQgYnV0IG5vIHRyYWZmaWMgICAgICAgICAgICAgICAgKi8KLyogICAgICAgICBMRUQgc3RhdHVzOiBBbHdheXMgb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogICAgICA2LiBTdGF0dXM6CVdoZW4gbGlua2luZyBpcyBkcm9wcGVkIGJ1dCBubyByZS1jb25uZWN0aW9uICAgICAgICAgICAgICAqLwovKiAgICAgICAgIExFRCBzdGF0dXM6IEFsd2F5cyBvZmYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiAgICAgIDcuIFN0YXR1czoJRnJvbSBvbmUgY29ubmVjdGlvbigyLjRHIG9yIDVHKSB0byBjaGFuZ2UgdG8gYW5vdGhlciBiYW5kICovCi8qICAgICAgICAgTEVEIHN0YXR1czogQW1iZXIvQmx1ZSA9PlNsb3cgYmxpbmtpbmcsIEFtYmVyIHRoZW4gQmx1ZSBwZXIgNTAwbXMgICovCi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICAgIElOUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICAgICAgZGV2IDogZGV2aWNlIHBvaW50ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICAgIE9VVFBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICAgICAgTm9uZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICAgIEFVVEhPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICAgICAgU2hhbmctQ2h1biBMaXUgICAgICAgIEF0aGVyb3MgQ29tbXVuaWNhdGlvbnMsIElOQy4gICAgMjAwNy4xMSAgICAgICAgICovCi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnZvaWQgemZMZWRDdHJsVHlwZTJfc2Nhbih6ZGV2X3QqIGRldik7Cgp2b2lkIHpmTGVkQ3RybFR5cGUyKHpkZXZfdCogZGV2KQp7CiAgICB1MTZfdCBPcGVyYXRlTEVEOwogICAgem13X2dldF93bGFuX2RldihkZXYpOwoKICAgIGlmICh6ZlN0YUlzQ29ubmVjdGVkKGRldikgIT0gVFJVRSkKICAgIHsKICAgICAgICAvLyBEaXNjb25uZWN0IHN0YXRlCiAgICAgICAgaWYod2QtPmxlZFN0cnVjdC5jb3VudGVyICUgNCAhPSAwKQogICAgCXsKICAgICAgCSAgICAvLyBVcGRhdGUgTEVEIGVhY2ggNDAwbXMoNCoxMDApCiAgICAgIAkgICAgLy8gUHJldmVudCB0aGlzIHNpdHVhdGlvbgogICAgICAgICAgICAvLyAgICAgICAgICAgICAgX19fX19fXyAgICAgICAgIF9fXwogICAgICAgICAgICAvLyBMRURbMF0gT04gICB8ICAgICAgIHwgICAgICAgfCB4IHwKICAgICAgICAgICAgLy8gLS0tLS0tIE9GRi0+Ky0rLSstKy0rLSstKy0rLSstKy0rLSstPj4+Li4uCiAgICAgICAgICAgIC8vIExFRFsxXSBPTgogICAgICAgICAgICAvLwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICBpZiAoKCh3ZC0+c3RhdGUgPT0gWk1fV0xBTl9TVEFURV9ESVNBQkxFRCkgJiYgKHdkLT5zdGEuYkNoYW5uZWxTY2FuKSkKICAgICAgICAgICAgfHwgKCh3ZC0+c3RhdGUgIT0gWk1fV0xBTl9TVEFURV9ESVNBQkxFRCkgJiYgKHdkLT5zdGEuYkF1dG9SZWNvbm5lY3QpKSkKICAgICAgICB7CiAgICAgICAgICAgIC8vIFNjYW4vQXV0b1JlY29ubmVjdCBzdGF0ZQogICAgICAgICAgICB6ZkxlZEN0cmxUeXBlMl9zY2FuKGRldik7CiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICB7CiAgICAgICAgICAgIC8vIE5laXRoZXIgQ29ubmVjdGVkIG5vciBTY2FuCiAgICAgICAgICAgIHpmSHBMZWRDdHJsKGRldiwgMCwgMCk7CiAgICAgICAgICAgIHpmSHBMZWRDdHJsKGRldiwgMSwgMCk7CiAgICAgICAgfQogICAgfQogICAgZWxzZQogICAgewogICAgICAgIGlmKCB3ZC0+c3RhLmJDaGFubmVsU2NhbiApCiAgICAgICAgewogICAgICAgICAgICAvLyBTY2FuIHN0YXRlCiAgICAgICAgICAgIGlmKHdkLT5sZWRTdHJ1Y3QuY291bnRlciAlIDQgIT0gMCkKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgemZMZWRDdHJsVHlwZTJfc2NhbihkZXYpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICBpZih3ZC0+ZnJlcXVlbmN5IDwgMzAwMCkKICAgICAgICB7CiAgICAgICAgICAgIE9wZXJhdGVMRUQgPSAwOyAgICAgLy8gTEVEWzBdOiB3b3JrIG9uIDIuNEcgKGIvZyBiYW5kKQogICAgICAgICAgICB6ZkhwTGVkQ3RybChkZXYsIDEsIDApOwogICAgICAgIH0KICAgICAgICBlbHNlCiAgICAgICAgewogICAgICAgICAgICBPcGVyYXRlTEVEID0gMTsgICAgIC8vIExFRFsxXTogd29yayBvbiA1RyAoYSBiYW5kKQogICAgICAgICAgICB6ZkhwTGVkQ3RybChkZXYsIDAsIDApOwogICAgICAgIH0KCiAgICAgICAgaWYgKCh6ZlBvd2VyU2F2aW5nTWdySXNTbGVlcGluZyhkZXYpKSAmJiAoKHdkLT5sZWRTdHJ1Y3QubGVkTW9kZVtPcGVyYXRlTEVEXSAmIDB4OCkgPT0gMCkpCiAgICAgICAgewogICAgICAgICAgICAvLyBJZiBTbGVlcGluZywgdHVybiBPRkYKICAgICAgICAgICAgemZIcExlZEN0cmwoZGV2LCBPcGVyYXRlTEVELCAwKTsKICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICAgICAgLy9Db25uZWN0IHN0YXRlCiAgICAgICAgICAgIGlmICgod2QtPmxlZFN0cnVjdC5jb3VudGVyICYgMSkgPT0gMCkgICAvLyBldmVuCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIE5vIHRyYWZmaWMsIGFsd2F5cyBPTgogICAgICAgICAgICAgICAgemZIcExlZEN0cmwoZGV2LCBPcGVyYXRlTEVELCAxKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlICAgICAgIC8vIG9kZAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoKHdkLT5sZWRTdHJ1Y3QudHhUcmFmZmljID4gMCkgfHwgKHdkLT5sZWRTdHJ1Y3QucnhUcmFmZmljID4gMCkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8gSWYgaGF2ZSB0cmFmZmljLCB0dXJuIE9GRgoJCSAgICAgICAgICAgIC8vICAgICAgICAgICAgICAgICAgIF9fX19fICAgXyAgIF8gICBfICAgX19fX18KCQkgICAgICAgICAgICAvLyBMRURbT3BlcmF0ZV0gT04gICAgICAgIHwgfCB8IHwgfCB8IHwgfAoJCSAgICAgICAgICAgIC8vIC0tLS0tLS0tLS0tLSBPRkYtPi0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLT4+Pi4uLgoJCSAgICAgICAgICAgIC8vCiAgICAgICAgICAgICAgICAgICAgd2QtPmxlZFN0cnVjdC50eFRyYWZmaWMgPSB3ZC0+bGVkU3RydWN0LnJ4VHJhZmZpYyA9IDA7CiAgICAgICAgICAgICAgICAgICAgemZIcExlZEN0cmwoZGV2LCBPcGVyYXRlTEVELCAwKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KfQoKdm9pZCB6ZkxlZEN0cmxUeXBlMl9zY2FuKHpkZXZfdCogZGV2KQp7CiAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CgogICAgLy8gV2hlbiBkb2luZyBzY2FuLCBibGluayhBbWJlci9CbHVlKSBhbmQgb2ZmIHBlciA1MDBtcyAoYWJvdXQgNDAwbXMgaW4gb3VyIGRyaXZlcikKICAgIC8vICAgICAgICAgICAgICAgX19fX19fXyAgICAgICAgICAgICAgICAgICAgICAgICBfX19fX19fCiAgICAvLyBMRURbMF0gT04gICAgfCAgICAgICB8ICAgICAgIDggICAgICAgMTIgICAgICB8ICAgICAgIHwKICAgIC8vIC0tLS0tLSBPRkYtPi0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0+Pj4uLi4KICAgIC8vIExFRFsxXSBPTiAgICAwICAgICAgIDQgICAgICAgfF9fX19fX198ICAgICAgIDAgICAgICAgMwogICAgLy8KCiAgICBzd2l0Y2god2QtPmxlZFN0cnVjdC5jb3VudGVyICUgMTYpCiAgICB7CiAgICAgICAgY2FzZSAwOiAgIC8vIGNhc2UgMH4zLCBMRURbMF0gb24KICAgICAgICAgICAgaWYod2QtPnN1cHBvcnRNb2RlICYgWk1fV0lSRUxFU1NfTU9ERV8yNCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgemZIcExlZEN0cmwoZGV2LCAwLCAxKTsKICAgICAgICAgICAgICAgIHpmSHBMZWRDdHJsKGRldiwgMSwgMCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB6ZkhwTGVkQ3RybChkZXYsIDEsIDEpOwogICAgICAgICAgICAgICAgemZIcExlZEN0cmwoZGV2LCAwLCAwKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBicmVhazsKCiAgICAgICAgY2FzZSA4OiAgIC8vIGNhc2UgOH4xMSwgTEVEWzFdIG9uCiAgICAgICAgICAgIGlmKHdkLT5zdXBwb3J0TW9kZSAmIFpNX1dJUkVMRVNTX01PREVfNSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgemZIcExlZEN0cmwoZGV2LCAxLCAxKTsKICAgICAgICAgICAgICAgIHpmSHBMZWRDdHJsKGRldiwgMCwgMCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB6ZkhwTGVkQ3RybChkZXYsIDAsIDEpOwogICAgICAgICAgICAgICAgemZIcExlZEN0cmwoZGV2LCAxLCAwKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBicmVhazsKCiAgICAgICAgZGVmYXVsdDogIC8vIG90aGVycywgYWxsIG9mZgogICAgICAgICAgICB6ZkhwTGVkQ3RybChkZXYsIDAsIDApOwogICAgICAgICAgICB6ZkhwTGVkQ3RybChkZXYsIDEsIDApOwogICAgICAgICAgICBicmVhazsKICAgIH0KfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiAgICBGVU5DVElPTiBERVNDUklQVElPTiAgICAgICAgICAgICAgICAgIHpmTGVkQ3RybFR5cGUzICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogICAgICBDdXN0b21pemUgZm9yIE5ldGdlYXIgU2luZ2xlLUxFRCBzdGF0ZSAoKGJ1ZyMzMjI0MykpICAgICAgICAgICAgICAgICAgICAgICovCi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiAgoUVPZmY6IHdoZW4gdGhlIGFkYXB0ZXIgaXMgZGlzYWJsZWQgb3IgaGFzbid0IHN0YXJ0ZWQgdG8gYXNzb2NpYXRlIHdpdGggQVAgICAgKi8KLyogICAgICAgICB5ZXQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiAgoUVPbjogT25jZSBhZHBhdGVyIGFzc29jaWF0ZSB3aXRoIEFQIHN1Y2Nlc3NmdWxseSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogIKFFU2xvdyBibGlua2luZzogd2hlbmV2ZXIgYWRhcHRlcnMgZG8gc2l0ZS1zdXJ2ZXkgb3IgdHJ5IHRvIGFzc29jaWF0ZSB3aXRoIEFQICovCi8qICAgIC0gSWYgdGhlcmUgaXMgYSBjb25uZWN0aW9uIGFscmVhZHksIGFuZCBhZGFwdGVycyBkbyBzaXRlLXN1cnZleSBvciAgICAgICAgICAqLwovKiAgICAgIHJlLWFzc29jaWF0ZSBhY3Rpb24sIHRoZSBMRUQgc2hvdWxkIGtlZXAgTEVEIGJhY2tncmFvdWQgYXMgT04sIHRodXMgICAgICAgKi8KLyogICAgICB0aGUgYmxpbmtpbmcgYmVoYXZpb3IgU0hPVUxEIGJlIE9GRiAoMjAwbXMpIC0gT04gKDgwMG1zKSBhbmQgY29udGludWUgdGhpcyovCi8qICAgICAgY3ljbGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiAgICAtIElmIHRoZXJlIGlzIG5vIGNvbm5lY3Rpb24geWV0LCBhbmQgYWRhcHRlcnMgc3RhcnQgdG8gZG8gc2l0ZS1zdXJ2ZXkgb3IgICAgKi8KLyogICAgICBhc3NvY2lhdGUgYWN0aW9uLCB0aGUgTEVEIHNob3VsZCBrZWVwIExFRCBiYWNrZ3JvdW5kIGFzIE9GRiwgdGh1cyB0aGUgICAgICovCi8qICAgICAgYmxpbmtpbmcgYmVoYXZpb3IgU0hPVUxEIGJlIE9OICgyMDBtcykgLSBPRkYgKDgwMG1zKSBhbmQgY29udGludWUgdGhpcyAgICAqLwovKiAgICAgIGN5Y2xlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogICAgLSBGb3IgdGhlIGNhc2UgdGhhdCBhc3NvY2lhdGUgZmFpbCwgYWRwYXRlciBzaG91bGQga2VlcCBhc3NvY2lhdGluZywgYW5kIHRoZSovCi8qICAgICAgTEVEIHNob3VsZCBhbHNvIGtlZXAgc2xvdyBibGlua2luZy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiAgoUVRdWljayBibGlua2luZzogdG8gYmxpbmsgT0ZGLU9OIGN5Y2xlIGZvciBlYWNoIHRpbWUgdGhhdCB0cmFmZmljIHBhY2tldCBpcyAgKi8KLyogICAgcmVjZWl2ZWQgb3IgaXMgdHJhbnNtaXR0ZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiAgICBJTlBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogICAgICBkZXYgOiBkZXZpY2UgcG9pbnRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiAgICBPVVRQVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogICAgICBOb25lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiAgICBBVVRIT1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogICAgICBTaGFuZy1DaHVuIExpdSAgICAgICAgQXRoZXJvcyBDb21tdW5pY2F0aW9ucywgSU5DLiAgICAyMDA4LjAxICAgICAgICAgICAgICovCi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kdm9pZCB6ZkxlZEN0cmxUeXBlM19zY2FuKHpkZXZfdCogZGV2LCB1MTZfdCBpc0Nvbm5lY3QpOwoKdm9pZCB6ZkxlZEN0cmxUeXBlMyh6ZGV2X3QqIGRldikKewogICAgem13X2dldF93bGFuX2RldihkZXYpOwoKICAgIGlmICh6ZlN0YUlzQ29ubmVjdGVkKGRldikgIT0gVFJVRSkKICAgIHsKICAgICAgICAvLyBEaXNjb25uZWN0IHN0YXRlCiAgICAgICAgaWYod2QtPmxlZFN0cnVjdC5jb3VudGVyICUgMiAhPSAwKQogICAgCXsKICAgICAgCSAgICAvLyBVcGRhdGUgTEVEIGVhY2ggMjAwbXMoMioxMDApCiAgICAgIAkgICAgLy8gUHJldmVudCB0aGlzIHNpdHVhdGlvbgogICAgICAgICAgICAvLyAgICAgICAgICAgICAgX19fICAgICBfCiAgICAgICAgICAgIC8vIExFRFswXSBPTiAgIHwgICB8ICAgfHh8CiAgICAgICAgICAgIC8vIC0tLS0tLSBPRkYtPistKy0rLSstKy0rLSstPj4+Li4uCiAgICAgICAgICAgIC8vCiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgIGlmICgoKHdkLT5zdGF0ZSA9PSBaTV9XTEFOX1NUQVRFX0RJU0FCTEVEKSAmJiAod2QtPnN0YS5iQ2hhbm5lbFNjYW4pKQogICAgICAgICAgICB8fCAoKHdkLT5zdGF0ZSAhPSBaTV9XTEFOX1NUQVRFX0RJU0FCTEVEKSAmJiAod2QtPnN0YS5iQXV0b1JlY29ubmVjdCkpKQogICAgICAgIHsKICAgICAgICAgICAgLy8gU2Nhbi9BdXRvUmVjb25uZWN0IHN0YXRlCiAgICAgICAgICAgIHpmTGVkQ3RybFR5cGUzX3NjYW4oZGV2LCAwKTsKICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICAgICAgLy8gTmVpdGhlciBDb25uZWN0ZWQgbm9yIFNjYW4KICAgICAgICAgICAgemZIcExlZEN0cmwoZGV2LCAwLCAwKTsKICAgICAgICAgICAgemZIcExlZEN0cmwoZGV2LCAxLCAwKTsKICAgICAgICB9CiAgICB9CiAgICBlbHNlCiAgICB7CiAgICAgICAgaWYoIHdkLT5zdGEuYkNoYW5uZWxTY2FuICkKICAgICAgICB7CiAgICAgICAgICAgIC8vIFNjYW4gc3RhdGUKICAgICAgICAgICAgaWYod2QtPmxlZFN0cnVjdC5jb3VudGVyICUgMiAhPSAwKQogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB6ZkxlZEN0cmxUeXBlM19zY2FuKGRldiwgMSk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgIGlmICgoemZQb3dlclNhdmluZ01ncklzU2xlZXBpbmcoZGV2KSkgJiYgKCh3ZC0+bGVkU3RydWN0LmxlZE1vZGVbMF0gJiAweDgpID09IDApKQogICAgICAgIHsKICAgICAgICAgICAgLy8gSWYgU2xlZXBpbmcsIHR1cm4gT0ZGCiAgICAgICAgICAgIHpmSHBMZWRDdHJsKGRldiwgMCwgMCk7CiAgICAgICAgICAgIHpmSHBMZWRDdHJsKGRldiwgMSwgMCk7CiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICB7CiAgICAgICAgICAgIC8vQ29ubmVjdCBzdGF0ZQogICAgICAgICAgICBpZiAoKHdkLT5sZWRTdHJ1Y3QuY291bnRlciAmIDEpID09IDApICAgLy8gZXZlbgogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyBObyB0cmFmZmljLCBhbHdheXMgT04KICAgICAgICAgICAgICAgIHpmSHBMZWRDdHJsKGRldiwgMCwgMSk7CiAgICAgICAgICAgICAgICB6ZkhwTGVkQ3RybChkZXYsIDEsIDEpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgICAgICAgLy8gb2RkCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmICgod2QtPmxlZFN0cnVjdC50eFRyYWZmaWMgPiAwKSB8fCAod2QtPmxlZFN0cnVjdC5yeFRyYWZmaWMgPiAwKSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAvLyBJZiBoYXZlIHRyYWZmaWMsIHR1cm4gT0ZGCgkJICAgICAgICAgICAgLy8gICAgICAgICAgICAgICAgICAgX19fX18gICBfICAgXyAgIF8gICBfX19fXwoJCSAgICAgICAgICAgIC8vIExFRFtPcGVyYXRlXSBPTiAgICAgICAgfCB8IHwgfCB8IHwgfCB8CgkJICAgICAgICAgICAgLy8gLS0tLS0tLS0tLS0tIE9GRi0+LSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstPj4+Li4uCgkJICAgICAgICAgICAgLy8KICAgICAgICAgICAgICAgICAgICB3ZC0+bGVkU3RydWN0LnR4VHJhZmZpYyA9IHdkLT5sZWRTdHJ1Y3QucnhUcmFmZmljID0gMDsKICAgICAgICAgICAgICAgICAgICB6ZkhwTGVkQ3RybChkZXYsIDAsIDApOwogICAgICAgICAgICAgICAgICAgIHpmSHBMZWRDdHJsKGRldiwgMSwgMCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9Cn0KCnZvaWQgemZMZWRDdHJsVHlwZTNfc2Nhbih6ZGV2X3QqIGRldiwgdTE2X3QgaXNDb25uZWN0KQp7CiAgICB1MzJfdCB0b24sIHRvZmYsIHRtcDsKICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKCiAgICAvLyBEb2luZyBzY2FuIHdoZW4gOgogICAgLy8gMS4gRGlzY29ubmVjdGVkOiBPTiAoMjAwbXMpIC0gT0ZGICg4MDBtcykgKDIwMG1zLTYwMG1zIGluIG91ciBkcml2ZXIpCiAgICAvLyAgICAgICAgICAgICAgIF9fXyAgICAgICAgICAgICBfX18gICAgICAgICAgICAgX19fCiAgICAvLyBMRURbMF0gT04gICAgfCAgIHwgICAgICAgICAgIHwgICB8ICAgICAgICAgICB8ICAgfAogICAgLy8gLS0tLS0tIE9GRi0+LSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0+Pj4uLi4KICAgIC8vICAgICAgICAgICAgICAwICAgMiAgIDQgICA2ICAgOCAgMTAgIDEyICAxNCAgMTYKICAgIC8vIDIuIENvbm5lY3RlZDogICBPTiAoODAwbXMpIC0gT0ZGICgyMDBtcykgKDYwMG1zLTIwMG1zIGluIG91ciBkcml2ZXIpCiAgICAvLyAgICAgICAgICAgICAgIF9fX19fX19fX19fICAgICBfX19fX19fX19fXyAgICAgX19fX19fCiAgICAvLyBMRURbMF0gT04gICAgfCAgICAgICAgICAgfCAgIHwgICAgICAgICAgIHwgICB8CiAgICAvLyAtLS0tLS0gT0ZGLT4tKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLT4+Pi4uLgogICAgLy8gICAgICAgICAgICAgIDAgICAyICAgNCAgIDYgICA4ICAxMCAgMTIgIDE0ICAxNgoKICAgIC8vU2NhbiBzdGF0ZQogICAgaWYoIWlzQ29ubmVjdCkKICAgICAgICB0b24gPSAyLCB0b2ZmID0gNjsKICAgIGVsc2UKICAgICAgICB0b24gPSA2LCB0b2ZmID0gMjsKCiAgICBpZiAoKHRvbiArIHRvZmYpICE9IDApCiAgICB7CiAgICAgICAgdG1wID0gd2QtPmxlZFN0cnVjdC5jb3VudGVyICUgKHRvbit0b2ZmKTsKICAgICAgIGlmICh0bXAgPCB0b24pCiAgICAgICAgewogICAgICAgICAgICB6ZkhwTGVkQ3RybChkZXYsIDAsIDEpOwogICAgICAgICAgICB6ZkhwTGVkQ3RybChkZXYsIDEsIDEpOwogICAgICAgIH0KICAgICAgICBlbHNlCiAgICAgICAgewogICAgICAgICAgICB6ZkhwTGVkQ3RybChkZXYsIDAsIDApOwogICAgICAgICAgICB6ZkhwTGVkQ3RybChkZXYsIDEsIDApOwogICAgICAgIH0KICAgIH0KfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogICAgRlVOQ1RJT04gREVTQ1JJUFRJT04gICAgICAgICAgICAgICAgICB6ZkxlZEN0cmxfQmxpbmtXaGVuU2Nhbl9BbHBoYSAgICAgKi8KLyogICAgICBDdXN0b21pemUgZm9yIEFscGhhL0RMaW5rIExFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogICAgICAtIEJsaW5rIExFRCAxMiB0aW1lcyB3aXRoaW4gMyBzZWNvbmRzIHdoZW4gZG9pbmcgQWN0aXZlIFNjYW4gICAgICAgICAgKi8KLyoJICAgICAgICAgICAgICAgICAgICAgIF9fXyAgIF9fXyAgIF9fXyAgIF9fXyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKgkgICAgICBMRURbMF0gT04gICAgICB8ICAgfCB8ICAgfCB8ICAgfCB8ICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qCSAgICAgIC0tLS0tLS1PRkYtPi0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLS0rLS0+Pj4uLi4gICAgICAgICAgICAgICAgICAgKi8KLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogICAgSU5QVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogICAgICBkZXYgOiBkZXZpY2UgcG9pbnRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogICAgT1VUUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogICAgICBOb25lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogICAgQVVUSE9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogICAgICBTaGFuZy1DaHVuIExpdSAgICAgICAgQXRoZXJvcyBDb21tdW5pY2F0aW9ucywgSU5DLiAgICAyMDA3LjExICAgICAgICAgKi8KLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kdm9pZCB6ZkxlZEN0cmxfQmxpbmtXaGVuU2Nhbl9BbHBoYSh6ZGV2X3QqIGRldikKewogICAgc3RhdGljIHUzMl90IGNvdW50ZXIgPSAwOwogICAgem13X2dldF93bGFuX2RldihkZXYpOwoKICAgIGlmKGNvdW50ZXIgPiAzNCkgICAgICAgIC8vIGNvdW50ZXIgZm9yIDMgc2VjCiAgICB7CiAgICAgICAgd2QtPmxlZFN0cnVjdC5MRURDdHJsRmxhZyAmPSB+KHU4X3QpWk1fTEVEX0NUUkxfRkxBR19BTFBIQTsKICAgICAgICBjb3VudGVyID0gMDsKICAgIH0KCiAgICBpZiggKGNvdW50ZXIgJSAzKSA8IDIpCiAgICAgICAgemZIcExlZEN0cmwoZGV2LCAwLCAxKTsKICAgIGVsc2UKICAgICAgICB6ZkhwTGVkQ3RybChkZXYsIDAsIDApOwoKICAgIGNvdW50ZXIrKzsKfQoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICAgIEZVTkNUSU9OIERFU0NSSVBUSU9OICAgICAgICAgICAgICAgICAgemZMZWQxMDBtc0N0cmwgICAgICAgICAgICAgICovCi8qICAgICAgTEVEIDEwMCBtaWxsaXNlY29uZHMgdGltZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICAgIElOUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICAgICAgZGV2IDogZGV2aWNlIHBvaW50ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICAgIE9VVFBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICAgICAgTm9uZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICAgIEFVVEhPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICAgICAgU3RlcGhlbiBDaGVuICAgICAgICBBdGhlcm9zIENvbW11bmljYXRpb25zLCBJTkMuICAgIDIwMDcuNiAgICAgICovCi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnZvaWQgemZMZWQxMDBtc0N0cmwoemRldl90KiBkZXYpCnsKICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKCiAgICB3ZC0+bGVkU3RydWN0LmNvdW50ZXIrKzsKCiAgICBpZih3ZC0+bGVkU3RydWN0LkxFREN0cmxGbGFnKQogICAgewogICAgICAgIHN3aXRjaCh3ZC0+bGVkU3RydWN0LkxFREN0cmxGbGFnKSB7CiAgICAgICAgY2FzZSBaTV9MRURfQ1RSTF9GTEFHX0FMUEhBOgogICAgICAgICAgICB6ZkxlZEN0cmxfQmxpbmtXaGVuU2Nhbl9BbHBoYShkZXYpOwogICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgIH0KICAgIGVsc2UKICAgIHsKICAgICAgICBzd2l0Y2god2QtPmxlZFN0cnVjdC5MRURDdHJsVHlwZSkgewogICAgICAgIGNhc2UgMToJCQkvLyBUcmFkaXRpb25hbCAxIExFRAogICAgICAgICAgICB6ZkxlZEN0cmxUeXBlMShkZXYpOwogICAgICAgIGJyZWFrOwoKICAgICAgICBjYXNlIDI6CQkJLy8gRHVhbC1MRURzIGZvciBOZXRnZWFyCiAgICAgICAgICAgIHpmTGVkQ3RybFR5cGUyKGRldik7CiAgICAgICAgYnJlYWs7CgogICAgICAgIGNhc2UgMzoJCQkvLyBTaW5nbGUtTEVEIGZvciBOZXRnZWFyIChXTjExMXYyKQogICAgICAgICAgICB6ZkxlZEN0cmxUeXBlMyhkZXYpOwogICAgICAgIGJyZWFrOwoKICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICB6ZkxlZEN0cmxUeXBlMShkZXYpOwogICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgIH0KfQoK