LyoKICogQ29weXJpZ2h0IChjKSAyMDA3LTIwMDggQXRoZXJvcyBDb21tdW5pY2F0aW9ucyBJbmMuCiAqCiAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueQogKiBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlCiAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMuCiAqCiAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUwogKiBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GCiAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SCiAqIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKICogV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOCiAqIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GCiAqIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCiAqLwoKI2luY2x1ZGUgImNwcmVjb21wLmgiCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiAgICBGVU5DVElPTiBERVNDUklQVElPTiAgICAgICAgICAgICAgICAgIHpmTGVkQ3RybFR5cGUxICAgICAgICAgICAgICAqLwovKiAgICAgIFRyYWRpdGlvbmFsIHNpbmdsZS1MRUQgc3RhdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiAgICBJTlBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiAgICAgIGRldiA6IGRldmljZSBwb2ludGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiAgICBPVVRQVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiAgICAgIE5vbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiAgICBBVVRIT1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiAgICAgIFN0ZXBoZW4gQ2hlbiAgICAgICAgQXRoZXJvcyBDb21tdW5pY2F0aW9ucywgSU5DLiAgICAyMDA3LjYgICAgICAqLwovKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovLyBiaXQgMTUtMTIgOiBUb2ZmIGZvciBTY2FuIHN0YXRlCi8vICAgICAxMS04IDogVG9uIGZvciBTY2FuIHN0YXRlCi8vICAgICA3IDogUmVzZXJ2ZWQKLy8gICAgIDYgOiBtb2RlCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8gICAgIGJpdCA2ID0gMAovLyAgICAgNS00IDogQ29ubmVjdCBzdGF0ZQovLyAgICAgICAgICAgMDAgPT4gYWx3YXlzIG9mZgovLyAgICAgICAgICAgMDEgPT4gYWx3YXlzIG9uCi8vICAgICAgICAgICAxMCA9PiBJZGxlIG9mZiwgYWNpdHZlIG9uCi8vICAgICAgICAgICAxMSA9PiBJZGxlIG9uLCBhY3RpdmUgb2ZmCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8gICAgIGJpdCA2ID0gMQovLyAgICAgNS00IDogZnJlcQovLyAgICAgICAgICAgMDAgPT4gMUh6Ci8vICAgICAgICAgICAwMSA9PiAwLjVIegovLyAgICAgICAgICAgMTAgPT4gMC4yNUh6Ci8vICAgICAgICAgICAxMSA9PiAwLjEyNUh6Ci8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8gICAgIDMgOiBQb3dlciBzYXZlIHN0YXRlCi8vICAgICAgICAgMCA9PiBhbHdheXMgb2ZmIGluIHBvd2VyIHNhdmUgc3RhdGUKLy8gICAgICAgICAxID0+IHdvcmtzIGFzIGNvbm5lY3Qgc3RhdGUKLy8gICAgIDIgOiBEaXNhYmxlIHN0YXRlCi8vICAgICAxIDogUmVzZXJ2ZWQKLy8gICAgIDAgOiBQb3dlci1vbiBzdGF0ZQp2b2lkIHpmTGVkQ3RybFR5cGUxKHpkZXZfdCogZGV2KQp7CiAgICB1MTZfdCBpOwogICAgdTMyX3QgdG9uLCB0b2ZmLCB0bXAsIHBlcmlvZDsKICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKCiAgICBmb3IgKGk9MDsgaTxaTV9NQVhfTEVEX05VTUJFUjsgaSsrKQogICAgewogICAgICAgIGlmICh6ZlN0YUlzQ29ubmVjdGVkKGRldikgIT0gVFJVRSkKICAgICAgICB7CiAgICAgICAgICAgIC8vU2NhbiBzdGF0ZQogICAgICAgICAgICB0b24gPSAoKHdkLT5sZWRTdHJ1Y3QubGVkTW9kZVtpXSAmIDB4ZjAwKSA+PiA4KSAqIDU7CiAgICAgICAgICAgIHRvZmYgPSAoKHdkLT5sZWRTdHJ1Y3QubGVkTW9kZVtpXSAmIDB4ZjAwMCkgPj4gMTIpICogNTsKCiAgICAgICAgICAgIGlmICgodG9uICsgdG9mZikgIT0gMCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdG1wID0gd2QtPmxlZFN0cnVjdC5jb3VudGVyIC8gKHRvbit0b2ZmKTsKICAgICAgICAgICAgICAgIHRtcCA9IHdkLT5sZWRTdHJ1Y3QuY291bnRlciAtICh0bXAgKiAodG9uK3RvZmYpKTsKICAgICAgICAgICAgICAgIGlmICh0bXAgPCB0b24pCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgemZIcExlZEN0cmwoZGV2LCBpLCAxKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB6ZkhwTGVkQ3RybChkZXYsIGksIDApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICB7CiAgICAgICAgICAgIGlmICgoemZQb3dlclNhdmluZ01ncklzU2xlZXBpbmcoZGV2KSkgJiYgKCh3ZC0+bGVkU3RydWN0LmxlZE1vZGVbaV0gJiAweDgpID09IDApKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB6ZkhwTGVkQ3RybChkZXYsIGksIDApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy9Db25uZWN0IHN0YXRlCiAgICAgICAgICAgICAgICBpZiAoKHdkLT5sZWRTdHJ1Y3QubGVkTW9kZVtpXSAmIDB4NDApID09IDApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCh3ZC0+bGVkU3RydWN0LmNvdW50ZXIgJiAxKSA9PSAwKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgemZIcExlZEN0cmwoZGV2LCBpLCAod2QtPmxlZFN0cnVjdC5sZWRNb2RlW2ldICYgMHgxMCkgPj4gNCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgod2QtPmxlZFN0cnVjdC50eFRyYWZmaWMgPiAwKSB8fCAod2QtPmxlZFN0cnVjdC5yeFRyYWZmaWMgPiAwKSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgd2QtPmxlZFN0cnVjdC50eFRyYWZmaWMgPSB3ZC0+bGVkU3RydWN0LnJ4VHJhZmZpYyA9IDA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHdkLT5sZWRTdHJ1Y3QubGVkTW9kZVtpXSAmIDB4MjApICE9IDApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgemZIcExlZEN0cmwoZGV2LCBpLCAoKHdkLT5sZWRTdHJ1Y3QubGVkTW9kZVtpXSAmIDB4MTApID4+IDQpXjEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfS8vIGlmICgod2QtPmxlZFN0cnVjdC5sZWRNb2RlW2ldICYgMHg0MCkgPT0gMCkKICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBwZXJpb2QgPSA1ICogKDEgPDwgKCh3ZC0+bGVkU3RydWN0LmxlZE1vZGVbaV0gJiAweDMwKSA+PiA0KSk7CiAgICAgICAgICAgICAgICAgICAgdG1wID0gd2QtPmxlZFN0cnVjdC5jb3VudGVyIC8gKHBlcmlvZCoyKTsKICAgICAgICAgICAgICAgICAgICB0bXAgPSB3ZC0+bGVkU3RydWN0LmNvdW50ZXIgLSAodG1wICogKHBlcmlvZCoyKSk7CiAgICAgICAgICAgICAgICAgICAgaWYgKHRtcCA8IHBlcmlvZCkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgod2QtPmxlZFN0cnVjdC5jb3VudGVyICYgMSkgPT0gMCkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgemZIcExlZEN0cmwoZGV2LCBpLCAwKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgod2QtPmxlZFN0cnVjdC50eFRyYWZmaWMgPiAwKSB8fCAod2QtPmxlZFN0cnVjdC5yeFRyYWZmaWMgPiAwKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3ZC0+bGVkU3RydWN0LnR4VHJhZmZpYyA9IHdkLT5sZWRTdHJ1Y3QucnhUcmFmZmljID0gMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6ZkhwTGVkQ3RybChkZXYsIGksIDEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgod2QtPmxlZFN0cnVjdC5jb3VudGVyICYgMSkgPT0gMCkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgemZIcExlZEN0cmwoZGV2LCBpLCAxKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgod2QtPmxlZFN0cnVjdC50eFRyYWZmaWMgPiAwKSB8fCAod2QtPmxlZFN0cnVjdC5yeFRyYWZmaWMgPiAwKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3ZC0+bGVkU3RydWN0LnR4VHJhZmZpYyA9IHdkLT5sZWRTdHJ1Y3QucnhUcmFmZmljID0gMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6ZkhwTGVkQ3RybChkZXYsIGksIDApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSAvL2Vsc2UsIGlmICgod2QtPmxlZFN0cnVjdC5sZWRNb2RlW2ldICYgMHg0MCkgPT0gMCkKICAgICAgICAgICAgfSAvL2Vsc2UsIGlmICh6ZlBvd2VyU2F2aW5nTWdySXNTbGVlcGluZyhkZXYpKQogICAgICAgIH0gLy9lbHNlIDogaWYgKHpmU3RhSXNDb25uZWN0ZWQoZGV2KSAhPSBUUlVFKQogICAgfSAvL2ZvciAoaT0wOyBpPFpNX01BWF9MRURfTlVNQkVSOyBpKyspCn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICAgIEZVTkNUSU9OIERFU0NSSVBUSU9OICAgICAgICAgICAgICAgICAgemZMZWRDdHJsVHlwZTIgICAgICAgICAgICAgICAgICAgICovCi8qICAgICAgQ3VzdG9taXplIGZvciBOZXRnZWFyIER1YWwtTEVEIHN0YXRlICgoYnVnIzMxMjkyKSkgICAgICAgICAgICAgICAgICAgICovCi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICAgICAgMS4gU3RhdHVzOiAgV2hlbiBkb25nbGUgZG9lcyBub3QgY29ubmVjdCB0byAyLjRHIG9yIDVHIGJ1dCBpbiBzaXRlICAgICovCi8qICAgICAgICAgICAgICAgICAgc3VydmV5L2Fzc29jaWF0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICAgICAgICAgTEVEIHN0YXR1czogU2xvdyBibGlua2luZywgQW1iZXIgdGhlbiBCbHVlIHBlciA1MDBtcyAgICAgICAgICAgICAgICovCi8qICAgICAgMi4gU3RhdHVzOglDb25uZWN0aW9uIGF0IDIuNEcgaW4gc2l0ZSBzdXJ2ZXkvYXNzb2NpYXRpb24gICAgICAgICAgICAgKi8KLyogICAgICAgICBMRUQgc3RhdHVzOiBTbG93IGJsaW5raW5nLCBBbWJlci9vZmYgcGVyIDUwMG1zICAgICAgICAgICAgICAgICAgICAgKi8KLyogICAgICAzLiBTdGF0dXM6CUNvbm5lY3Rpb24gYXQgNUcgaW4gc2l0ZSBzdXJ2ZXkvYXNzb2NpYXRpb24gICAgICAgICAgICAgICAqLwovKiAgICAgICAgIExFRCBzdGF0dXM6IFNsb3cgYmxpbmtpbmcsIEJsdWUvb2ZmIHBlciA1MDBtcyAgICAgICAgICAgICAgICAgICAgICAqLwovKiAgICAgIDQuIFN0YXR1czoJV2hlbiB0cmFuc2ZlciB0aGUgcGFja2V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICAgICAgICAgTEVEIHN0YXR1czogQmxpbmsgcGVyIHBhY2tldCwgaW5jbHVkaW5nIFRYIGFuZCBSWCAgICAgICAgICAgICAgICAgICovCi8qICAgICAgNS4gU3RhdHVzOglXaGVuIGxpbmtpbmcgaXMgZXN0YWJsaXNoZWQgYnV0IG5vIHRyYWZmaWMgICAgICAgICAgICAgICAgKi8KLyogICAgICAgICBMRUQgc3RhdHVzOiBBbHdheXMgb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogICAgICA2LiBTdGF0dXM6CVdoZW4gbGlua2luZyBpcyBkcm9wcGVkIGJ1dCBubyByZS1jb25uZWN0aW9uICAgICAgICAgICAgICAqLwovKiAgICAgICAgIExFRCBzdGF0dXM6IEFsd2F5cyBvZmYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiAgICAgIDcuIFN0YXR1czoJRnJvbSBvbmUgY29ubmVjdGlvbigyLjRHIG9yIDVHKSB0byBjaGFuZ2UgdG8gYW5vdGhlciBiYW5kICovCi8qICAgICAgICAgTEVEIHN0YXR1czogQW1iZXIvQmx1ZSA9PlNsb3cgYmxpbmtpbmcsIEFtYmVyIHRoZW4gQmx1ZSBwZXIgNTAwbXMgICovCi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICAgIElOUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICAgICAgZGV2IDogZGV2aWNlIHBvaW50ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICAgIE9VVFBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICAgICAgTm9uZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICAgIEFVVEhPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICAgICAgU2hhbmctQ2h1biBMaXUgICAgICAgIEF0aGVyb3MgQ29tbXVuaWNhdGlvbnMsIElOQy4gICAgMjAwNy4xMSAgICAgICAgICovCi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnZvaWQgemZMZWRDdHJsVHlwZTJfc2Nhbih6ZGV2X3QqIGRldik7Cgp2b2lkIHpmTGVkQ3RybFR5cGUyKHpkZXZfdCogZGV2KQp7CiAgICB1MzJfdCB0b24sIHRvZmYsIHRtcCwgcGVyaW9kOwogICAgdTE2X3QgT3BlcmF0ZUxFRDsKICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKCiAgICBpZiAoemZTdGFJc0Nvbm5lY3RlZChkZXYpICE9IFRSVUUpCiAgICB7CiAgICAgICAgLy8gRGlzY29ubmVjdCBzdGF0ZQogICAgICAgIGlmKHdkLT5sZWRTdHJ1Y3QuY291bnRlciAlIDQgIT0gMCkKICAgIAl7CiAgICAgIAkgICAgLy8gVXBkYXRlIExFRCBlYWNoIDQwMG1zKDQqMTAwKQogICAgICAJICAgIC8vIFByZXZlbnQgdGhpcyBzaXR1YXRpb24KICAgICAgICAgICAgLy8gICAgICAgICAgICAgIF9fX19fX18gICAgICAgICBfX18KICAgICAgICAgICAgLy8gTEVEWzBdIE9OICAgfCAgICAgICB8ICAgICAgIHwgeCB8CiAgICAgICAgICAgIC8vIC0tLS0tLSBPRkYtPistKy0rLSstKy0rLSstKy0rLSstKy0rLT4+Pi4uLgogICAgICAgICAgICAvLyBMRURbMV0gT04KICAgICAgICAgICAgLy8KICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgaWYgKCgod2QtPnN0YXRlID09IFpNX1dMQU5fU1RBVEVfRElTQUJMRUQpICYmICh3ZC0+c3RhLmJDaGFubmVsU2NhbikpCiAgICAgICAgICAgIHx8ICgod2QtPnN0YXRlICE9IFpNX1dMQU5fU1RBVEVfRElTQUJMRUQpICYmICh3ZC0+c3RhLmJBdXRvUmVjb25uZWN0KSkpCiAgICAgICAgewogICAgICAgICAgICAvLyBTY2FuL0F1dG9SZWNvbm5lY3Qgc3RhdGUKICAgICAgICAgICAgemZMZWRDdHJsVHlwZTJfc2NhbihkZXYpOwogICAgICAgIH0KICAgICAgICBlbHNlCiAgICAgICAgewogICAgICAgICAgICAvLyBOZWl0aGVyIENvbm5lY3RlZCBub3IgU2NhbgogICAgICAgICAgICB6ZkhwTGVkQ3RybChkZXYsIDAsIDApOwogICAgICAgICAgICB6ZkhwTGVkQ3RybChkZXYsIDEsIDApOwogICAgICAgIH0KICAgIH0KICAgIGVsc2UKICAgIHsKICAgICAgICBpZiggd2QtPnN0YS5iQ2hhbm5lbFNjYW4gKQogICAgICAgIHsKICAgICAgICAgICAgLy8gU2NhbiBzdGF0ZQogICAgICAgICAgICBpZih3ZC0+bGVkU3RydWN0LmNvdW50ZXIgJSA0ICE9IDApCiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIHpmTGVkQ3RybFR5cGUyX3NjYW4oZGV2KTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgaWYod2QtPmZyZXF1ZW5jeSA8IDMwMDApCiAgICAgICAgewogICAgICAgICAgICBPcGVyYXRlTEVEID0gMDsgICAgIC8vIExFRFswXTogd29yayBvbiAyLjRHIChiL2cgYmFuZCkKICAgICAgICAgICAgemZIcExlZEN0cmwoZGV2LCAxLCAwKTsKICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICAgICAgT3BlcmF0ZUxFRCA9IDE7ICAgICAvLyBMRURbMV06IHdvcmsgb24gNUcgKGEgYmFuZCkKICAgICAgICAgICAgemZIcExlZEN0cmwoZGV2LCAwLCAwKTsKICAgICAgICB9CgogICAgICAgIGlmICgoemZQb3dlclNhdmluZ01ncklzU2xlZXBpbmcoZGV2KSkgJiYgKCh3ZC0+bGVkU3RydWN0LmxlZE1vZGVbT3BlcmF0ZUxFRF0gJiAweDgpID09IDApKQogICAgICAgIHsKICAgICAgICAgICAgLy8gSWYgU2xlZXBpbmcsIHR1cm4gT0ZGCiAgICAgICAgICAgIHpmSHBMZWRDdHJsKGRldiwgT3BlcmF0ZUxFRCwgMCk7CiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICB7CiAgICAgICAgICAgIC8vQ29ubmVjdCBzdGF0ZQogICAgICAgICAgICBpZiAoKHdkLT5sZWRTdHJ1Y3QuY291bnRlciAmIDEpID09IDApICAgLy8gZXZlbgogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyBObyB0cmFmZmljLCBhbHdheXMgT04KICAgICAgICAgICAgICAgIHpmSHBMZWRDdHJsKGRldiwgT3BlcmF0ZUxFRCwgMSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSAgICAgICAvLyBvZGQKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKCh3ZC0+bGVkU3RydWN0LnR4VHJhZmZpYyA+IDApIHx8ICh3ZC0+bGVkU3RydWN0LnJ4VHJhZmZpYyA+IDApKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIC8vIElmIGhhdmUgdHJhZmZpYywgdHVybiBPRkYKCQkgICAgICAgICAgICAvLyAgICAgICAgICAgICAgICAgICBfX19fXyAgIF8gICBfICAgXyAgIF9fX19fCgkJICAgICAgICAgICAgLy8gTEVEW09wZXJhdGVdIE9OICAgICAgICB8IHwgfCB8IHwgfCB8IHwKCQkgICAgICAgICAgICAvLyAtLS0tLS0tLS0tLS0gT0ZGLT4tKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0+Pj4uLi4KCQkgICAgICAgICAgICAvLwogICAgICAgICAgICAgICAgICAgIHdkLT5sZWRTdHJ1Y3QudHhUcmFmZmljID0gd2QtPmxlZFN0cnVjdC5yeFRyYWZmaWMgPSAwOwogICAgICAgICAgICAgICAgICAgIHpmSHBMZWRDdHJsKGRldiwgT3BlcmF0ZUxFRCwgMCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9Cn0KCnZvaWQgemZMZWRDdHJsVHlwZTJfc2Nhbih6ZGV2X3QqIGRldikKewogICAgem13X2dldF93bGFuX2RldihkZXYpOwoKICAgIC8vIFdoZW4gZG9pbmcgc2NhbiwgYmxpbmsoQW1iZXIvQmx1ZSkgYW5kIG9mZiBwZXIgNTAwbXMgKGFib3V0IDQwMG1zIGluIG91ciBkcml2ZXIpCiAgICAvLyAgICAgICAgICAgICAgIF9fX19fX18gICAgICAgICAgICAgICAgICAgICAgICAgX19fX19fXwogICAgLy8gTEVEWzBdIE9OICAgIHwgICAgICAgfCAgICAgICA4ICAgICAgIDEyICAgICAgfCAgICAgICB8CiAgICAvLyAtLS0tLS0gT0ZGLT4tKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstPj4+Li4uCiAgICAvLyBMRURbMV0gT04gICAgMCAgICAgICA0ICAgICAgIHxfX19fX19ffCAgICAgICAwICAgICAgIDMKICAgIC8vCgogICAgc3dpdGNoKHdkLT5sZWRTdHJ1Y3QuY291bnRlciAlIDE2KQogICAgewogICAgICAgIGNhc2UgMDogICAvLyBjYXNlIDB+MywgTEVEWzBdIG9uCiAgICAgICAgICAgIGlmKHdkLT5zdXBwb3J0TW9kZSAmIFpNX1dJUkVMRVNTX01PREVfMjQpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHpmSHBMZWRDdHJsKGRldiwgMCwgMSk7CiAgICAgICAgICAgICAgICB6ZkhwTGVkQ3RybChkZXYsIDEsIDApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgemZIcExlZEN0cmwoZGV2LCAxLCAxKTsKICAgICAgICAgICAgICAgIHpmSHBMZWRDdHJsKGRldiwgMCwgMCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYnJlYWs7CgogICAgICAgIGNhc2UgODogICAvLyBjYXNlIDh+MTEsIExFRFsxXSBvbgogICAgICAgICAgICBpZih3ZC0+c3VwcG9ydE1vZGUgJiBaTV9XSVJFTEVTU19NT0RFXzUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHpmSHBMZWRDdHJsKGRldiwgMSwgMSk7CiAgICAgICAgICAgICAgICB6ZkhwTGVkQ3RybChkZXYsIDAsIDApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgemZIcExlZEN0cmwoZGV2LCAwLCAxKTsKICAgICAgICAgICAgICAgIHpmSHBMZWRDdHJsKGRldiwgMSwgMCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYnJlYWs7CgogICAgICAgIGRlZmF1bHQ6ICAvLyBvdGhlcnMsIGFsbCBvZmYKICAgICAgICAgICAgemZIcExlZEN0cmwoZGV2LCAwLCAwKTsKICAgICAgICAgICAgemZIcExlZEN0cmwoZGV2LCAxLCAwKTsKICAgICAgICAgICAgYnJlYWs7CiAgICB9Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogICAgRlVOQ1RJT04gREVTQ1JJUFRJT04gICAgICAgICAgICAgICAgICB6ZkxlZEN0cmxUeXBlMyAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICAgICAgQ3VzdG9taXplIGZvciBOZXRnZWFyIFNpbmdsZS1MRUQgc3RhdGUgKChidWcjMzIyNDMpKSAgICAgICAgICAgICAgICAgICAgICAqLwovKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogIKFFT2ZmOiB3aGVuIHRoZSBhZGFwdGVyIGlzIGRpc2FibGVkIG9yIGhhc24ndCBzdGFydGVkIHRvIGFzc29jaWF0ZSB3aXRoIEFQICAgICovCi8qICAgICAgICAgeWV0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogIKFFT246IE9uY2UgYWRwYXRlciBhc3NvY2lhdGUgd2l0aCBBUCBzdWNjZXNzZnVsbHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICChRVNsb3cgYmxpbmtpbmc6IHdoZW5ldmVyIGFkYXB0ZXJzIGRvIHNpdGUtc3VydmV5IG9yIHRyeSB0byBhc3NvY2lhdGUgd2l0aCBBUCAqLwovKiAgICAtIElmIHRoZXJlIGlzIGEgY29ubmVjdGlvbiBhbHJlYWR5LCBhbmQgYWRhcHRlcnMgZG8gc2l0ZS1zdXJ2ZXkgb3IgICAgICAgICAgKi8KLyogICAgICByZS1hc3NvY2lhdGUgYWN0aW9uLCB0aGUgTEVEIHNob3VsZCBrZWVwIExFRCBiYWNrZ3Jhb3VkIGFzIE9OLCB0aHVzICAgICAgICovCi8qICAgICAgdGhlIGJsaW5raW5nIGJlaGF2aW9yIFNIT1VMRCBiZSBPRkYgKDIwMG1zKSAtIE9OICg4MDBtcykgYW5kIGNvbnRpbnVlIHRoaXMqLwovKiAgICAgIGN5Y2xlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogICAgLSBJZiB0aGVyZSBpcyBubyBjb25uZWN0aW9uIHlldCwgYW5kIGFkYXB0ZXJzIHN0YXJ0IHRvIGRvIHNpdGUtc3VydmV5IG9yICAgICovCi8qICAgICAgYXNzb2NpYXRlIGFjdGlvbiwgdGhlIExFRCBzaG91bGQga2VlcCBMRUQgYmFja2dyb3VuZCBhcyBPRkYsIHRodXMgdGhlICAgICAqLwovKiAgICAgIGJsaW5raW5nIGJlaGF2aW9yIFNIT1VMRCBiZSBPTiAoMjAwbXMpIC0gT0ZGICg4MDBtcykgYW5kIGNvbnRpbnVlIHRoaXMgICAgKi8KLyogICAgICBjeWNsZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICAgIC0gRm9yIHRoZSBjYXNlIHRoYXQgYXNzb2NpYXRlIGZhaWwsIGFkcGF0ZXIgc2hvdWxkIGtlZXAgYXNzb2NpYXRpbmcsIGFuZCB0aGUqLwovKiAgICAgIExFRCBzaG91bGQgYWxzbyBrZWVwIHNsb3cgYmxpbmtpbmcuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogIKFFUXVpY2sgYmxpbmtpbmc6IHRvIGJsaW5rIE9GRi1PTiBjeWNsZSBmb3IgZWFjaCB0aW1lIHRoYXQgdHJhZmZpYyBwYWNrZXQgaXMgICovCi8qICAgIHJlY2VpdmVkIG9yIGlzIHRyYW5zbWl0dGVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogICAgSU5QVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICAgICAgZGV2IDogZGV2aWNlIHBvaW50ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogICAgT1VUUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICAgICAgTm9uZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogICAgQVVUSE9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICAgICAgU2hhbmctQ2h1biBMaXUgICAgICAgIEF0aGVyb3MgQ29tbXVuaWNhdGlvbnMsIElOQy4gICAgMjAwOC4wMSAgICAgICAgICAgICAqLwovKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnZvaWQgemZMZWRDdHJsVHlwZTNfc2Nhbih6ZGV2X3QqIGRldiwgdTE2X3QgaXNDb25uZWN0KTsKCnZvaWQgemZMZWRDdHJsVHlwZTMoemRldl90KiBkZXYpCnsKICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKCiAgICBpZiAoemZTdGFJc0Nvbm5lY3RlZChkZXYpICE9IFRSVUUpCiAgICB7CiAgICAgICAgLy8gRGlzY29ubmVjdCBzdGF0ZQogICAgICAgIGlmKHdkLT5sZWRTdHJ1Y3QuY291bnRlciAlIDIgIT0gMCkKICAgIAl7CiAgICAgIAkgICAgLy8gVXBkYXRlIExFRCBlYWNoIDIwMG1zKDIqMTAwKQogICAgICAJICAgIC8vIFByZXZlbnQgdGhpcyBzaXR1YXRpb24KICAgICAgICAgICAgLy8gICAgICAgICAgICAgIF9fXyAgICAgXwogICAgICAgICAgICAvLyBMRURbMF0gT04gICB8ICAgfCAgIHx4fAogICAgICAgICAgICAvLyAtLS0tLS0gT0ZGLT4rLSstKy0rLSstKy0rLT4+Pi4uLgogICAgICAgICAgICAvLwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICBpZiAoKCh3ZC0+c3RhdGUgPT0gWk1fV0xBTl9TVEFURV9ESVNBQkxFRCkgJiYgKHdkLT5zdGEuYkNoYW5uZWxTY2FuKSkKICAgICAgICAgICAgfHwgKCh3ZC0+c3RhdGUgIT0gWk1fV0xBTl9TVEFURV9ESVNBQkxFRCkgJiYgKHdkLT5zdGEuYkF1dG9SZWNvbm5lY3QpKSkKICAgICAgICB7CiAgICAgICAgICAgIC8vIFNjYW4vQXV0b1JlY29ubmVjdCBzdGF0ZQogICAgICAgICAgICB6ZkxlZEN0cmxUeXBlM19zY2FuKGRldiwgMCk7CiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICB7CiAgICAgICAgICAgIC8vIE5laXRoZXIgQ29ubmVjdGVkIG5vciBTY2FuCiAgICAgICAgICAgIHpmSHBMZWRDdHJsKGRldiwgMCwgMCk7CiAgICAgICAgICAgIHpmSHBMZWRDdHJsKGRldiwgMSwgMCk7CiAgICAgICAgfQogICAgfQogICAgZWxzZQogICAgewogICAgICAgIGlmKCB3ZC0+c3RhLmJDaGFubmVsU2NhbiApCiAgICAgICAgewogICAgICAgICAgICAvLyBTY2FuIHN0YXRlCiAgICAgICAgICAgIGlmKHdkLT5sZWRTdHJ1Y3QuY291bnRlciAlIDIgIT0gMCkKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgemZMZWRDdHJsVHlwZTNfc2NhbihkZXYsIDEpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICBpZiAoKHpmUG93ZXJTYXZpbmdNZ3JJc1NsZWVwaW5nKGRldikpICYmICgod2QtPmxlZFN0cnVjdC5sZWRNb2RlWzBdICYgMHg4KSA9PSAwKSkKICAgICAgICB7CiAgICAgICAgICAgIC8vIElmIFNsZWVwaW5nLCB0dXJuIE9GRgogICAgICAgICAgICB6ZkhwTGVkQ3RybChkZXYsIDAsIDApOwogICAgICAgICAgICB6ZkhwTGVkQ3RybChkZXYsIDEsIDApOwogICAgICAgIH0KICAgICAgICBlbHNlCiAgICAgICAgewogICAgICAgICAgICAvL0Nvbm5lY3Qgc3RhdGUKICAgICAgICAgICAgaWYgKCh3ZC0+bGVkU3RydWN0LmNvdW50ZXIgJiAxKSA9PSAwKSAgIC8vIGV2ZW4KICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gTm8gdHJhZmZpYywgYWx3YXlzIE9OCiAgICAgICAgICAgICAgICB6ZkhwTGVkQ3RybChkZXYsIDAsIDEpOwogICAgICAgICAgICAgICAgemZIcExlZEN0cmwoZGV2LCAxLCAxKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlICAgICAgIC8vIG9kZAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoKHdkLT5sZWRTdHJ1Y3QudHhUcmFmZmljID4gMCkgfHwgKHdkLT5sZWRTdHJ1Y3QucnhUcmFmZmljID4gMCkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8gSWYgaGF2ZSB0cmFmZmljLCB0dXJuIE9GRgoJCSAgICAgICAgICAgIC8vICAgICAgICAgICAgICAgICAgIF9fX19fICAgXyAgIF8gICBfICAgX19fX18KCQkgICAgICAgICAgICAvLyBMRURbT3BlcmF0ZV0gT04gICAgICAgIHwgfCB8IHwgfCB8IHwgfAoJCSAgICAgICAgICAgIC8vIC0tLS0tLS0tLS0tLSBPRkYtPi0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLT4+Pi4uLgoJCSAgICAgICAgICAgIC8vCiAgICAgICAgICAgICAgICAgICAgd2QtPmxlZFN0cnVjdC50eFRyYWZmaWMgPSB3ZC0+bGVkU3RydWN0LnJ4VHJhZmZpYyA9IDA7CiAgICAgICAgICAgICAgICAgICAgemZIcExlZEN0cmwoZGV2LCAwLCAwKTsKICAgICAgICAgICAgICAgICAgICB6ZkhwTGVkQ3RybChkZXYsIDEsIDApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQp9Cgp2b2lkIHpmTGVkQ3RybFR5cGUzX3NjYW4oemRldl90KiBkZXYsIHUxNl90IGlzQ29ubmVjdCkKewogICAgdTMyX3QgdG9uLCB0b2ZmLCB0bXA7CiAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CgogICAgLy8gRG9pbmcgc2NhbiB3aGVuIDoKICAgIC8vIDEuIERpc2Nvbm5lY3RlZDogT04gKDIwMG1zKSAtIE9GRiAoODAwbXMpICgyMDBtcy02MDBtcyBpbiBvdXIgZHJpdmVyKQogICAgLy8gICAgICAgICAgICAgICBfX18gICAgICAgICAgICAgX19fICAgICAgICAgICAgIF9fXwogICAgLy8gTEVEWzBdIE9OICAgIHwgICB8ICAgICAgICAgICB8ICAgfCAgICAgICAgICAgfCAgIHwKICAgIC8vIC0tLS0tLSBPRkYtPi0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstPj4+Li4uCiAgICAvLyAgICAgICAgICAgICAgMCAgIDIgICA0ICAgNiAgIDggIDEwICAxMiAgMTQgIDE2CiAgICAvLyAyLiBDb25uZWN0ZWQ6ICAgT04gKDgwMG1zKSAtIE9GRiAoMjAwbXMpICg2MDBtcy0yMDBtcyBpbiBvdXIgZHJpdmVyKQogICAgLy8gICAgICAgICAgICAgICBfX19fX19fX19fXyAgICAgX19fX19fX19fX18gICAgIF9fX19fXwogICAgLy8gTEVEWzBdIE9OICAgIHwgICAgICAgICAgIHwgICB8ICAgICAgICAgICB8ICAgfAogICAgLy8gLS0tLS0tIE9GRi0+LSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0+Pj4uLi4KICAgIC8vICAgICAgICAgICAgICAwICAgMiAgIDQgICA2ICAgOCAgMTAgIDEyICAxNCAgMTYKCiAgICAvL1NjYW4gc3RhdGUKICAgIGlmKCFpc0Nvbm5lY3QpCiAgICAgICAgdG9uID0gMiwgdG9mZiA9IDY7CiAgICBlbHNlCiAgICAgICAgdG9uID0gNiwgdG9mZiA9IDI7CgogICAgaWYgKCh0b24gKyB0b2ZmKSAhPSAwKQogICAgewogICAgICAgIHRtcCA9IHdkLT5sZWRTdHJ1Y3QuY291bnRlciAlICh0b24rdG9mZik7CiAgICAgICBpZiAodG1wIDwgdG9uKQogICAgICAgIHsKICAgICAgICAgICAgemZIcExlZEN0cmwoZGV2LCAwLCAxKTsKICAgICAgICAgICAgemZIcExlZEN0cmwoZGV2LCAxLCAxKTsKICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICAgICAgemZIcExlZEN0cmwoZGV2LCAwLCAwKTsKICAgICAgICAgICAgemZIcExlZEN0cmwoZGV2LCAxLCAwKTsKICAgICAgICB9CiAgICB9Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICAgIEZVTkNUSU9OIERFU0NSSVBUSU9OICAgICAgICAgICAgICAgICAgemZMZWRDdHJsX0JsaW5rV2hlblNjYW5fQWxwaGEgICAgICovCi8qICAgICAgQ3VzdG9taXplIGZvciBBbHBoYS9ETGluayBMRUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICAgICAgLSBCbGluayBMRUQgMTIgdGltZXMgd2l0aGluIDMgc2Vjb25kcyB3aGVuIGRvaW5nIEFjdGl2ZSBTY2FuICAgICAgICAgICovCi8qCSAgICAgICAgICAgICAgICAgICAgICBfX18gICBfX18gICBfX18gICBfX18gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyoJICAgICAgTEVEWzBdIE9OICAgICAgfCAgIHwgfCAgIHwgfCAgIHwgfCAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKgkgICAgICAtLS0tLS0tT0ZGLT4tKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0tKy0tPj4+Li4uICAgICAgICAgICAgICAgICAgICovCi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICAgIElOUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICAgICAgZGV2IDogZGV2aWNlIHBvaW50ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICAgIE9VVFBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICAgICAgTm9uZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICAgIEFVVEhPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICAgICAgU2hhbmctQ2h1biBMaXUgICAgICAgIEF0aGVyb3MgQ29tbXVuaWNhdGlvbnMsIElOQy4gICAgMjAwNy4xMSAgICAgICAgICovCi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnZvaWQgemZMZWRDdHJsX0JsaW5rV2hlblNjYW5fQWxwaGEoemRldl90KiBkZXYpCnsKICAgIHN0YXRpYyB1MzJfdCBjb3VudGVyID0gMDsKICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKCiAgICBpZihjb3VudGVyID4gMzQpICAgICAgICAvLyBjb3VudGVyIGZvciAzIHNlYwogICAgewogICAgICAgIHdkLT5sZWRTdHJ1Y3QuTEVEQ3RybEZsYWcgJj0gfih1OF90KVpNX0xFRF9DVFJMX0ZMQUdfQUxQSEE7CiAgICAgICAgY291bnRlciA9IDA7CiAgICB9CgogICAgaWYoIChjb3VudGVyICUgMykgPCAyKQogICAgICAgIHpmSHBMZWRDdHJsKGRldiwgMCwgMSk7CiAgICBlbHNlCiAgICAgICAgemZIcExlZEN0cmwoZGV2LCAwLCAwKTsKCiAgICBjb3VudGVyKys7Cn0KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiAgICBGVU5DVElPTiBERVNDUklQVElPTiAgICAgICAgICAgICAgICAgIHpmTGVkMTAwbXNDdHJsICAgICAgICAgICAgICAqLwovKiAgICAgIExFRCAxMDAgbWlsbGlzZWNvbmRzIHRpbWVyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiAgICBJTlBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiAgICAgIGRldiA6IGRldmljZSBwb2ludGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiAgICBPVVRQVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiAgICAgIE5vbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiAgICBBVVRIT1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiAgICAgIFN0ZXBoZW4gQ2hlbiAgICAgICAgQXRoZXJvcyBDb21tdW5pY2F0aW9ucywgSU5DLiAgICAyMDA3LjYgICAgICAqLwovKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwp2b2lkIHpmTGVkMTAwbXNDdHJsKHpkZXZfdCogZGV2KQp7CiAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CgogICAgd2QtPmxlZFN0cnVjdC5jb3VudGVyKys7CgogICAgaWYod2QtPmxlZFN0cnVjdC5MRURDdHJsRmxhZykKICAgIHsKICAgICAgICBzd2l0Y2god2QtPmxlZFN0cnVjdC5MRURDdHJsRmxhZykgewogICAgICAgIGNhc2UgWk1fTEVEX0NUUkxfRkxBR19BTFBIQToKICAgICAgICAgICAgemZMZWRDdHJsX0JsaW5rV2hlblNjYW5fQWxwaGEoZGV2KTsKICAgICAgICBicmVhazsKICAgICAgICB9CiAgICB9CiAgICBlbHNlCiAgICB7CiAgICAgICAgc3dpdGNoKHdkLT5sZWRTdHJ1Y3QuTEVEQ3RybFR5cGUpIHsKICAgICAgICBjYXNlIDE6CQkJLy8gVHJhZGl0aW9uYWwgMSBMRUQKICAgICAgICAgICAgemZMZWRDdHJsVHlwZTEoZGV2KTsKICAgICAgICBicmVhazsKCiAgICAgICAgY2FzZSAyOgkJCS8vIER1YWwtTEVEcyBmb3IgTmV0Z2VhcgogICAgICAgICAgICB6ZkxlZEN0cmxUeXBlMihkZXYpOwogICAgICAgIGJyZWFrOwoKICAgICAgICBjYXNlIDM6CQkJLy8gU2luZ2xlLUxFRCBmb3IgTmV0Z2VhciAoV04xMTF2MikKICAgICAgICAgICAgemZMZWRDdHJsVHlwZTMoZGV2KTsKICAgICAgICBicmVhazsKCiAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgemZMZWRDdHJsVHlwZTEoZGV2KTsKICAgICAgICBicmVhazsKICAgICAgICB9CiAgICB9Cn0KCg==