LyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KICogICAgICAgICBBVE1FTCBNaWNyb2NvbnRyb2xsZXIgU29mdHdhcmUgU3VwcG9ydA0KICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KICogQ29weXJpZ2h0IChjKSAyMDA4LCBBdG1lbCBDb3Jwb3JhdGlvbg0KICoNCiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQogKg0KICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0DQogKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoNCiAqDQogKiAtIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwNCiAqIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZGlzY2xhaW1lciBiZWxvdy4NCiAqDQogKiBBdG1lbCdzIG5hbWUgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20NCiAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uDQogKg0KICogRElTQ0xBSU1FUjogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBVE1FTCAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUg0KICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRg0KICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OLUlORlJJTkdFTUVOVCBBUkUNCiAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFUTUVMIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsDQogKiBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UDQogKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwNCiAqIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YNCiAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HDQogKiBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsDQogKiBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLg0KICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KICovDQoNCi8qKiBcZmlsZQ0KICogXHNlY3Rpb24gUHVycG9zZQ0KICoNCiAqIFNDU0kgZGVmaW5pdGlvbnMuDQogKg0KICogXHNlY3Rpb24gVXNhZ2UNCiAqDQogKiAtIyBBZnRlciBjb21tYW5kIGJsb2NrIHJlY2VpdmVkLCBBY2Nlc3MgYW5kIGRlY29kZSB0aGUgU0NTSSBjb21tYW5kIGJsb2NrDQogKiAgICB3aXRoIFNCQ0NvbW1hbmQgc3RydWN0dXJlLg0KICovDQoNCiNpZm5kZWYgU0JDX0gNCiNkZWZpbmUgU0JDX0gNCg0KLyoqIFxhZGR0b2dyb3VwIHVzYmRfbXNkDQogKkB7DQogKi8NCg0KLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiAqICAgICAgRGVmaW5pdGlvbnMNCiAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCg0KLyoqIFxhZGR0b2dyb3VwIHVzYmRfc2JjX29wZXJhdGlvbl9jb2RlcyBTQkMgT3BlcmF0aW9uIENvZGVzDQogKiAgICAgIEB7DQogKiBUaGlzIHBhZ2UgbGlzdHMgb3BlcmF0aW9uIGNvZGVzIG9mIGNvbW1hbmRzIGRlc2NyaWJlZCBpbiB0aGUgU0JDLTMNCiAqIHN0YW5kYXJkLg0KICoNCiAqIFxub3RlIFRoYXQgbW9zdCBjb21tYW5kcyBhcmUgYWN0dWFsbHkgZGVmaW5lZCBpbiBvdGhlciBzdGFuZGFyZHMsDQogKiAgICAgICBsaWtlIFNQQy00LiBPcHRpb25hbCBjb21tYW5kcyBhcmUgbm90IGluY2x1ZGVkIGhlcmUuDQogKg0KICogXHNlZSAgICBzYmMzcjA3LnBkZiAtIFNlY3Rpb24gNS4xIC0gVGFibGUgMTINCiAqIFxzZWUgICAgc3BjNHIwNi5wZGYNCiAqIFxzZWUgICAgU0JDQ29tbWFuZA0KICoNCiAqIFxzZWN0aW9uIENvZGVzDQogKiAtIFNCQ19JTlFVSVJZDQogKiAtIFNCQ19SRUFEXzEwDQogKiAtIFNCQ19SRUFEX0NBUEFDSVRZXzEwDQogKiAtIFNCQ19SRVFVRVNUX1NFTlNFDQogKiAtIFNCQ19URVNUX1VOSVRfUkVBRFkNCiAqIC0gU0JDX1dSSVRFXzEwDQogKg0KICogXHNlY3Rpb24gT3B0aW9uYWwgQ29kZXMgYnV0IHJlcXVpcmVkIGJ5IFdpbmRvd3MNCiAqIC0gU0JDX1BSRVZFTlRfQUxMT1dfTUVESVVNX1JFTU9WQUwNCiAqIC0gU0JDX01PREVfU0VOU0VfNg0KICogLSBTQkNfVkVSSUZZXzEwDQogKiAtIFNCQ19SRUFEX0ZPUk1BVF9DQVBBQ0lUSUVTDQogKi8NCg0KLyoqIFJlcXVlc3QgaW5mb3JtYXRpb24gcmVnYXJkaW5nIHBhcmFtZXRlcnMgb2YgdGhlIHRhcmdldCBhbmQgTG9naWNhbCBVbml0LiAqLw0KI2RlZmluZSBTQkNfSU5RVUlSWSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDEyDQovKiogUmVxdWVzdCB0aGUgdHJhbnNmZXIgZGF0YSB0byB0aGUgaG9zdC4gKi8NCiNkZWZpbmUgU0JDX1JFQURfMTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyOA0KLyoqIFJlcXVlc3QgY2FwYWNpdGllcyBvZiB0aGUgY3VycmVudGx5IGluc3RhbGxlZCBtZWRpdW0uICovDQojZGVmaW5lIFNCQ19SRUFEX0NBUEFDSVRZXzEwICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MjUNCi8qKiBSZXF1ZXN0IHRoYXQgdGhlIGRldmljZSBzZXJ2ZXIgdHJhbnNmZXIgc2Vuc2UgZGF0YS4gKi8NCiNkZWZpbmUgU0JDX1JFUVVFU1RfU0VOU0UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMw0KLyoqIENoZWNrIGlmIHRoZSBMVU4gaXMgcmVhZHkgKi8NCiNkZWZpbmUgU0JDX1RFU1RfVU5JVF9SRUFEWSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMA0KLyoqIFJlcXVlc3QgdGhhdCB0aGUgZGV2aWNlIHdyaXRlIHRoZSBkYXRhIHRyYW5zZmVycmVkIGJ5IHRoZSBob3N0LiAqLw0KI2RlZmluZSBTQkNfV1JJVEVfMTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDJBDQoNCi8qKiBSZXF1ZXN0IHRoYXQgdGhlIHRhcmdldCBlbmFibGUgb3IgZGlzYWJsZSB0aGUgcmVtb3ZhbCBvZiB0aGUgbWVkaXVtIGluICovDQovKiogdGhlIExvZ2ljYWwgVW5pdC4gKi8NCiNkZWZpbmUgU0JDX1BSRVZFTlRfQUxMT1dfTUVESVVNX1JFTU9WQUwgICAgICAgICAgICAgICAgMHgxRQ0KLyoqIFJlcG9ydCBwYXJhbWV0ZXJzLiAqLw0KI2RlZmluZSBTQkNfTU9ERV9TRU5TRV82ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDFBDQovKiogUmVxdWVzdCB0aGF0IHRoZSAlZGV2aWNlIHZlcmlmeSB0aGUgZGF0YSBvbiB0aGUgbWVkaXVtLiAqLw0KI2RlZmluZSBTQkNfVkVSSUZZXzEwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDJGDQovKiogUmVxdWVzdCBhIGxpc3Qgb2YgdGhlIHBvc3NpYmxlIGNhcGFjaXRpZXMgdGhhdCBjYW4gYmUgZm9ybWF0dGVkIG9uIG1lZGl1bSAqLw0KI2RlZmluZSBTQkNfUkVBRF9GT1JNQVRfQ0FQQUNJVElFUyAgICAgICAgICAgICAgICAgICAgICAweDIzDQovKiogICAgICBAfSovDQoNCi8qKiBcYWRkdG9ncm91cCB1c2JkX3NiY19wZXJpcGhfcXVhbGkgU0JDIFBlcmlwaC4gUXVhbGlmaWVycw0KICogICAgICBAew0KICogVGhpcyBwYWdlIGxpc3RzIHRoZSBwZXJpcGhlcmFsIHF1YWxpZmllciB2YWx1ZXMgc3BlY2lmaWVkIGluIHRoZSBJTlFVSVJZDQogKiBkYXRhDQogKiBcc2VlICAgIHNwYzRyMDYucGRmIC0gU2VjdGlvbiA2LjQuMiAtIFRhYmxlIDgzDQogKiBcc2VlICAgIFNCQ0lucXVpcnlEYXRhDQogKg0KICogXHNlY3Rpb24gUXVhbGlmaWVycw0KICogLSBTQkNfUEVSSVBIRVJBTF9ERVZJQ0VfQ09OTkVDVEVEDQogKiAtIFNCQ19QRVJJUEhFUkFMX0RFVklDRV9OT1RfQ09OTkVDVEVEDQogKiAtIFNCQ19QRVJJUEhFUkFMX0RFVklDRV9OT1RfU1VQUE9SVEVEDQogKi8NCg0KI2RlZmluZSBTQkNfUEVSSVBIRVJBTF9ERVZJQ0VfQ09OTkVDVEVEICAgICAgICAgICAgICAgICAweDAwDQojZGVmaW5lIFNCQ19QRVJJUEhFUkFMX0RFVklDRV9OT1RfQ09OTkVDVEVEICAgICAgICAgICAgIDB4MDENCiNkZWZpbmUgU0JDX1BFUklQSEVSQUxfREVWSUNFX05PVF9TVVBQT1JURUQgICAgICAgICAgICAgMHgwMw0KLyoqICAgICAgQH0qLw0KDQovKiogXGFkZHRvZ3JvdXAgdXNiZF9zYmNfcGVyaXBoX3R5cGVzIFNCQyBQZXJpcGguIFR5cGVzDQogKiAgICAgIEB7DQogKiBUaGlzIHBhZ2UgbGlzdHMgcGVyaXBoZXJhbCBkZXZpY2UgdHlwZXMgc3BlY2lmaWVkIGluIHRoZSBJTlFVSVJZIGRhdGENCiAqIFxzZWUgICAgc3BjNHIwNi5wZGYgLSBTZWN0aW9uIDYuNC4yIC0gVGFibGUgODQNCiAqIFxzZWUgICAgU0JDSW5xdWlyeURhdGENCiAqDQogKiBcc2VjdGlvbiBUeXBlcw0KICogLSBTQkNfRElSRUNUX0FDQ0VTU19CTE9DS19ERVZJQ0UNCiAqIC0gU0JDX1NFUVVFTlRJQUxfQUNDRVNTX0RFVklDRQ0KICogLSBTQkNfUFJJTlRFUl9ERVZJQ0UNCiAqIC0gU0JDX1BST0NFU1NPUl9ERVZJQ0UNCiAqIC0gU0JDX1dSSVRFX09OQ0VfREVWSUNFDQogKiAtIFNCQ19DRF9EVkRfREVWSUNFDQogKiAtIFNCQ19TQ0FOTkVSX0RFVklDRQ0KICogLSBTQkNfT1BUSUNBTF9NRU1PUllfREVWSUNFDQogKiAtIFNCQ19NRURJQV9DSEFOR0VSX0RFVklDRQ0KICogLSBTQkNfQ09NTVVOSUNBVElPTl9ERVZJQ0UNCiAqIC0gU0JDX1NUT1JBR0VfQVJSQVlfQ09OVFJPTExFUl9ERVZJQ0UNCiAqIC0gU0JDX0VOQ0xPU1VSRV9TRVJWSUNFU19ERVZJQ0UNCiAqIC0gU0JDX1NJTVBMSUZJRURfRElSRUNUX0FDQ0VTU19ERVZJQ0UNCiAqIC0gU0JDX09QVElDQUxfQ0FSRF9SRUFERVJfV1JJVEVSX0RFVklDRQ0KICogLSBTQkNfQlJJREdFX0NPTlRST0xMRVJfQ09NTUFORFMNCiAqIC0gU0JDX09CSkVDVF9CQVNFRF9TVE9SQUdFX0RFVklDRQ0KICovDQoNCiNkZWZpbmUgU0JDX0RJUkVDVF9BQ0NFU1NfQkxPQ0tfREVWSUNFICAgICAgICAgICAgICAweDAwDQojZGVmaW5lIFNCQ19TRVFVRU5USUFMX0FDQ0VTU19ERVZJQ0UgICAgICAgICAgICAgICAgMHgwMQ0KI2RlZmluZSBTQkNfUFJJTlRFUl9ERVZJQ0UgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDINCiNkZWZpbmUgU0JDX1BST0NFU1NPUl9ERVZJQ0UgICAgICAgICAgICAgICAgICAgICAgICAweDAzDQojZGVmaW5lIFNCQ19XUklURV9PTkNFX0RFVklDRSAgICAgICAgICAgICAgICAgICAgICAgMHgwNA0KI2RlZmluZSBTQkNfQ0RfRFZEX0RFVklDRSAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDUNCiNkZWZpbmUgU0JDX1NDQU5ORVJfREVWSUNFICAgICAgICAgICAgICAgICAgICAgICAgICAweDA2DQojZGVmaW5lIFNCQ19PUFRJQ0FMX01FTU9SWV9ERVZJQ0UgICAgICAgICAgICAgICAgICAgMHgwNw0KI2RlZmluZSBTQkNfTUVESUFfQ0hBTkdFUl9ERVZJQ0UgICAgICAgICAgICAgICAgICAgIDB4MDgNCiNkZWZpbmUgU0JDX0NPTU1VTklDQVRJT05fREVWSUNFICAgICAgICAgICAgICAgICAgICAweDA5DQojZGVmaW5lIFNCQ19TVE9SQUdFX0FSUkFZX0NPTlRST0xMRVJfREVWSUNFICAgICAgICAgMHgwQw0KI2RlZmluZSBTQkNfRU5DTE9TVVJFX1NFUlZJQ0VTX0RFVklDRSAgICAgICAgICAgICAgIDB4MEQNCiNkZWZpbmUgU0JDX1NJTVBMSUZJRURfRElSRUNUX0FDQ0VTU19ERVZJQ0UgICAgICAgICAweDBFDQojZGVmaW5lIFNCQ19PUFRJQ0FMX0NBUkRfUkVBREVSX1dSSVRFUl9ERVZJQ0UgICAgICAgMHgwRg0KI2RlZmluZSBTQkNfQlJJREdFX0NPTlRST0xMRVJfQ09NTUFORFMgICAgICAgICAgICAgIDB4MTANCiNkZWZpbmUgU0JDX09CSkVDVF9CQVNFRF9TVE9SQUdFX0RFVklDRSAgICAgICAgICAgICAweDExDQovKiogICAgICBAfSovDQoNCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQovKiogXGJyaWVmICBWZXJzaW9uIHZhbHVlIGZvciB0aGUgU0JDLTMgc3BlY2lmaWNhdGlvbiAqLw0KLyoqIFxzZWUgICAgc3BjNHIwNi5wZGYgLSBTZWN0aW9uIDYuNC4yIC0gVGFibGUgODUgKi8NCiNkZWZpbmUgU0JDX1NQQ19WRVJTSU9OXzQgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA2DQovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KDQovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KLyoqIFxicmllZiAgVmFsdWVzIGZvciB0aGUgVFBHUyBmaWVsZCByZXR1cm5lZCBpbiBJTlFVSVJZIGRhdGEgKi8NCi8qKiBcc2VlICAgIHNwYzRyMDYucGRmIC0gU2VjdGlvbiA2LjQuMiAtIFRhYmxlIDg2ICovDQojZGVmaW5lIFNCQ19UUEdTX05PTkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwDQojZGVmaW5lIFNCQ19UUEdTX0FTWU1NRVRSSUMgICAgICAgICAgICAgICAgICAgICAgICAgMHgxDQojZGVmaW5lIFNCQ19UUEdTX1NZTU1FVFJJQyAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyDQojZGVmaW5lIFNCQ19UUEdTX0JPVEggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgzDQovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KDQovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KLyoqIFxicmllZiAgVmVyc2lvbiBkZXNjcmlwdG9yIHZhbHVlIGZvciB0aGUgU0JDLTMgc3BlY2lmaWNhdGlvbiAqLw0KLyoqIFxzZWUgICAgc3BjNHIwNi5wZGYgLSBTZWN0aW9uIDYuNC4yIC0gVGFibGUgODcgKi8NCiNkZWZpbmUgU0JDX1ZFUlNJT05fREVTQ1JJUFRPUl9TQkNfMyAgICAgICAgICAgICAgICAweDA0QzANCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQoNCi8qKiBcYWRkdG9ncm91cCB1c2JkX3NiY19zZWNzZV9jb2RlcyBTQkMgU2Vuc2UgUmVzcG9uc2UgQ29kZXMNCiAqICAgICAgQHsNCiAqIFRoaXMgcGFnZSBsaXN0cyBzZW5zZSBkYXRhIHJlc3BvbnNlIGNvZGVzIHJldHVybmVkIGluIFJFUVVFU1QgU0VOU0UgZGF0YQ0KICogXHNlZSAgICBzcGM0cjA2LnBkZiAtIFNlY3Rpb24gNC41LjEgLSBUYWJsZSAxMg0KICoNCiAqIFxzZWN0aW9uIENvZGVzDQogKiAtIFNCQ19TRU5TRV9EQVRBX0ZJWEVEX0NVUlJFTlQNCiAqIC0gU0JDX1NFTlNFX0RBVEFfRklYRURfREVGRVJSRUQNCiAqIC0gU0JDX1NFTlNFX0RBVEFfREVTQ1JJUFRPUl9DVVJSRU5UDQogKiAtIFNCQ19TRU5TRV9EQVRBX0RFU0NSSVBUT1JfREVGRVJSRUQNCiAqLw0KDQojZGVmaW5lIFNCQ19TRU5TRV9EQVRBX0ZJWEVEX0NVUlJFTlQgICAgICAgICAgICAgICAgMHg3MA0KI2RlZmluZSBTQkNfU0VOU0VfREFUQV9GSVhFRF9ERUZFUlJFRCAgICAgICAgICAgICAgIDB4NzENCiNkZWZpbmUgU0JDX1NFTlNFX0RBVEFfREVTQ1JJUFRPUl9DVVJSRU5UICAgICAgICAgICAweDcyDQojZGVmaW5lIFNCQ19TRU5TRV9EQVRBX0RFU0NSSVBUT1JfREVGRVJSRUQgICAgICAgICAgMHg3Mw0KLyoqICAgICAgQH0qLw0KDQovKiogXGFkZHRvZ3JvdXAgdXNiZF9zYmNfc2Vuc2Vfa2V5cyBTQkMgU2Vuc2UgS2V5cw0KICogICAgICBAew0KICogVGhpcyBwYWdlIGxpc3RzIHNlbnNlIGtleSB2YWx1ZXMgcmV0dXJuZWQgaW4gdGhlIFJFUVVFU1QgU0VOU0UgZGF0YQ0KICogXHNlZSAgICBzcGM0cjA2LnBkZiAtIFNlY3Rpb24gNC41LjYgLSBUYWJsZSAyNw0KICoNCiAqIFxzZWN0aW9uIEtleXMNCiAqIC0gU0JDX1NFTlNFX0tFWV9OT19TRU5TRQ0KICogLSBTQkNfU0VOU0VfS0VZX1JFQ09WRVJFRF9FUlJPUg0KICogLSBTQkNfU0VOU0VfS0VZX05PVF9SRUFEWQ0KICogLSBTQkNfU0VOU0VfS0VZX01FRElVTV9FUlJPUg0KICogLSBTQkNfU0VOU0VfS0VZX0hBUkRXQVJFX0VSUk9SDQogKiAtIFNCQ19TRU5TRV9LRVlfSUxMRUdBTF9SRVFVRVNUDQogKiAtIFNCQ19TRU5TRV9LRVlfVU5JVF9BVFRFTlRJT04NCiAqIC0gU0JDX1NFTlNFX0tFWV9EQVRBX1BST1RFQ1QNCiAqIC0gU0JDX1NFTlNFX0tFWV9CTEFOS19DSEVDSw0KICogLSBTQkNfU0VOU0VfS0VZX1ZFTkRPUl9TUEVDSUZJQw0KICogLSBTQkNfU0VOU0VfS0VZX0NPUFlfQUJPUlRFRA0KICogLSBTQkNfU0VOU0VfS0VZX0FCT1JURURfQ09NTUFORA0KICogLSBTQkNfU0VOU0VfS0VZX1ZPTFVNRV9PVkVSRkxPVw0KICogLSBTQkNfU0VOU0VfS0VZX01JU0NPTVBBUkUNCiAqLw0KDQovKiogTm8gc3BlY2lmaWMgc2Vuc2Uga2V5LiBTdWNjZXNzZnVsIGNvbW1hbmQuICovDQojZGVmaW5lIFNCQ19TRU5TRV9LRVlfTk9fU0VOU0UgICAgICAgICAgICAgICAgICAgICAgICAweDAwDQovKiogQ29tbWFuZCBjb21wbGV0ZWQgc3VjY2VzZnVsbHkgd2l0aCBzb21lIHJlY292ZXJ5IGFjdGlvbiBieSB0aGUgJWRldmljZS4gKi8NCiNkZWZpbmUgU0JDX1NFTlNFX0tFWV9SRUNPVkVSRURfRVJST1IgICAgICAgICAgICAgICAgIDB4MDENCi8qKiBUaGUgZGV2aWNlIGNhbiBub3QgYmUgYWNjZXNzZWQuICovDQojZGVmaW5lIFNCQ19TRU5TRV9LRVlfTk9UX1JFQURZICAgICAgICAgICAgICAgICAgICAgICAweDAyDQovKiogQ29tbWFuZCB0ZXJtaW5hdGVkIHdpdGggYSBlcnJvciBjb25kaXRpb24gdGhhdCB3YXMgcHJvYmFibHkgY2F1c2VkIGJ5IGEgKi8NCi8qKiBmbGF3IGluIHRoZSBtZWRpdW0gb3IgYW4gZXJyb3IgaW4gdGhlIHJlY29yZGVkIGRhdGEuICovDQojZGVmaW5lIFNCQ19TRU5TRV9LRVlfTUVESVVNX0VSUk9SICAgICAgICAgICAgICAgICAgICAweDAzDQovKiogSGFyZHdhcmUgZmFpbHVyZSB3aGlsZSBwZXJmb3JtaW5nIHRoZSBjb21tYW5kIG9yIGR1cmluZyBhIHNlbGYgdGVzdC4gKi8NCiNkZWZpbmUgU0JDX1NFTlNFX0tFWV9IQVJEV0FSRV9FUlJPUiAgICAgICAgICAgICAgICAgIDB4MDQNCi8qKiBJbGxlZ2FsIHBhcmFtZXRlciBmb3VuZCBpbiB0aGUgY29tbWFuZCBvciBhZGRpdGlvbmFsIHBhcmFtZXRlcnMuICovDQojZGVmaW5lIFNCQ19TRU5TRV9LRVlfSUxMRUdBTF9SRVFVRVNUICAgICAgICAgICAgICAgICAweDA1DQovKiogUmVtb3ZhYmxlIG1lZGl1bSBtYXkgaGF2ZSBiZWVuIGNoYW5nZWQgb3IgdGhlICVkZXZpY2UgaGFzIGJlZW4gcmVzZXQuICovDQojZGVmaW5lIFNCQ19TRU5TRV9LRVlfVU5JVF9BVFRFTlRJT04gICAgICAgICAgICAgICAgICAweDA2DQovKiogV3JpdGUgb24gYSBibG9jayB0aGF0IGlzIHByb3RlY3RlZC4gKi8NCiNkZWZpbmUgU0JDX1NFTlNFX0tFWV9EQVRBX1BST1RFQ1QgICAgICAgICAgICAgICAgICAgIDB4MDcNCi8qKiBJbmRpY2F0ZXMgdGhhdCBhIHdyaXRlLW9uY2UgZGV2aWNlIG9yIGEgc2VxdWVudGlhbC1hY2Nlc3MgZGV2aWNlICovDQovKiogZW5jb3VudGVyZWQgYmxhbmsgbWVkaXVtIG9yIGZvcm1hdC1kZWZpbmVkIGVuZC1vZi1kYXRhIGluZGljYXRpb24gd2hpbGUgKi8NCi8qKiByZWFkaW5nIG9yIGEgd3JpdGUtb25jZSBkZXZpY2UgZW5jb3VudGVyZWQgYSBub24tYmxhbmsgbWVkaXVtIHdoaWxlIHdyaXRpbmcuICovDQojZGVmaW5lIFNCQ19TRU5TRV9LRVlfQkxBTktfQ0hFQ0sgICAgICAgICAgICAgICAgICAgICAweDA4DQovKiogUmVwb3J0aW5nIHZlbmRvciBzcGVjaWZpYyBjb25kaXRpb25zLiAqLw0KI2RlZmluZSBTQkNfU0VOU0VfS0VZX1ZFTkRPUl9TUEVDSUZJQyAgICAgICAgICAgICAgICAgMHgwOQ0KLyoqIEVYVEVOREVEIENPUFkgY29tbWFuZCB3YXMgYWJvcnRlZC4gKi8NCiNkZWZpbmUgU0JDX1NFTlNFX0tFWV9DT1BZX0FCT1JURUQgICAgICAgICAgICAgICAgICAgIDB4MEENCi8qKiBEZXZpY2UgYWJvcnRlZCB0aGUgY29tbWFuZC4gKi8NCiNkZWZpbmUgU0JDX1NFTlNFX0tFWV9BQk9SVEVEX0NPTU1BTkQgICAgICAgICAgICAgICAgIDB4MEINCi8qKiBBIGJ1ZmZlcmVkIHBlcmlwaGVyYWwgZGV2aWNlIGlzIG92ZXJmbG93LiAqLw0KI2RlZmluZSBTQkNfU0VOU0VfS0VZX1ZPTFVNRV9PVkVSRkxPVyAgICAgICAgICAgICAgICAgMHgwRA0KLyoqIFRoZSBzb3VyY2UgZGF0YSBkaWQgbm90IG1hdGNoIHRoZSBkYXRhIHJlYWQgZnJvbSB0aGUgbWVkaXVtLiAqLw0KI2RlZmluZSBTQkNfU0VOU0VfS0VZX01JU0NPTVBBUkUgICAgICAgICAgICAgICAgICAgICAgMHgwRQ0KLyoqICAgICAgQH0qLw0KDQovKiogXGFkZHRvZ3JvdXAgdXNiZF9zYmNfc2Vuc2VfYWRkaXRpb25hbHMgU0JDIFNlbnNlIEFkZGl0aW9uYWxzDQogKiAgICAgIEB7DQogKiBUaGlzIHBhZ2UgbGlzdHMgYWRkaXRpb25hbCBzZW5zZSBjb2RlIHZhbHVlcyByZXR1cm5lZCBpbiBSRVFVRVNUIFNFTlNFIGRhdGENCiAqIFxzZWUgICAgc3BjNHIwNi5wZGYgLSBTZWN0aW9uIDQuNS42IC0gVGFibGUgMjgNCiAqDQogKiBcc2VjdGlvbiBBZGRpdGlvbmFsIENvZGVzDQogKiAtIFNCQ19BU0NfTE9HSUNBTF9VTklUX05PVF9SRUFEWQ0KICogLSBTQkNfQVNDX0xPR0lDQUxfQkxPQ0tfQUREUkVTU19PVVRfT0ZfUkFOR0UNCiAqIC0gU0JDX0FTQ19JTlZBTElEX0ZJRUxEX0lOX0NEQg0KICogLSBTQkNfQVNDX1dSSVRFX1BST1RFQ1RFRA0KICogLSBTQkNfQVNDX0ZPUk1BVF9DT1JSVVBURUQNCiAqIC0gU0JDX0FTQ19JTlZBTElEX0NPTU1BTkRfT1BFUkFUSU9OX0NPREUNCiAqIC0gU0JDX0FTQ19UT09fTVVDSF9XUklURV9EQVRBDQogKiAtIFNCQ19BU0NfTk9UX1JFQURZX1RPX1JFQURZX0NIQU5HRQ0KICogLSBTQkNfQVNDX01FRElVTV9OT1RfUFJFU0VOVA0KICovDQoNCiNkZWZpbmUgU0JDX0FTQ19MT0dJQ0FMX1VOSVRfTk9UX1JFQURZICAgICAgICAgICAgICAgIDB4MDQNCiNkZWZpbmUgU0JDX0FTQ19MT0dJQ0FMX0JMT0NLX0FERFJFU1NfT1VUX09GX1JBTkdFICAgIDB4MjENCiNkZWZpbmUgU0JDX0FTQ19JTlZBTElEX0ZJRUxEX0lOX0NEQiAgICAgICAgICAgICAgICAgIDB4MjQNCiNkZWZpbmUgU0JDX0FTQ19XUklURV9QUk9URUNURUQgICAgICAgICAgICAgICAgICAgICAgIDB4MjcNCiNkZWZpbmUgU0JDX0FTQ19GT1JNQVRfQ09SUlVQVEVEICAgICAgICAgICAgICAgICAgICAgIDB4MzENCiNkZWZpbmUgU0JDX0FTQ19JTlZBTElEX0NPTU1BTkRfT1BFUkFUSU9OX0NPREUgICAgICAgIDB4MjANCiNkZWZpbmUgU0JDX0FTQ19UT09fTVVDSF9XUklURV9EQVRBICAgICAgICAgICAgICAgICAgIDB4MjYNCiNkZWZpbmUgU0JDX0FTQ19OT1RfUkVBRFlfVE9fUkVBRFlfQ0hBTkdFICAgICAgICAgICAgIDB4MjgNCiNkZWZpbmUgU0JDX0FTQ19NRURJVU1fTk9UX1BSRVNFTlQgICAgICAgICAgICAgICAgICAgIDB4M0ENCi8qKiAgICAgIEB9Ki8NCg0KLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCi8qKiBcYnJpZWYgIE1FRElVTSBUWVBFIGZpZWxkIHZhbHVlIGZvciBkaXJlY3QtYWNjZXNzIGJsb2NrIGRldmljZXMgKi8NCi8qKiBcc2VlICAgIHNiYzNyMDYucGRmIC0gU2VjdGlvbiA2LjMuMSAqLw0KI2RlZmluZSBTQkNfTUVESVVNX1RZUEVfRElSRUNUX0FDQ0VTU19CTE9DS19ERVZJQ0UgICAgMHgwMA0KLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCg0KLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCi8qKiBcYnJpZWYgIE1SSUUgZmllbGQgdmFsdWVzICovDQovKiogXHNlZSAgICBzYmMzcjA2LnBkZiAtIFNlY3Rpb24gNy40LjExIC0gVGFibGUgMjg2ICovDQojZGVmaW5lIFNCQ19NUklFX05PX1JFUE9SVElORyAgICAgICAgICAgICAgICAgICAgICAgICAweDAwDQojZGVmaW5lIFNCQ19NUklFX0FTWU5DSFJPTk9VUyAgICAgICAgICAgICAgICAgICAgICAgICAweDAxDQojZGVmaW5lIFNCQ19NUklFX0dFTkVSQVRFX1VOSVRfQVRURU5USU9OICAgICAgICAgICAgICAweDAyDQojZGVmaW5lIFNCQ19NUklFX0NPTkRfR0VORVJBVEVfUkVDT1ZFUkVEX0VSUk9SICAgICAgICAweDAzDQojZGVmaW5lIFNCQ19NUklFX1VOQ09ORF9HRU5FUkFURV9SRUNPVkVSRURfRVJST1IgICAgICAweDA0DQojZGVmaW5lIFNCQ19NUklFX0dFTkVSQVRFX05PX1NFTlNFICAgICAgICAgICAgICAgICAgICAweDA1DQojZGVmaW5lIFNCQ19NUklFX09OX1JFUVVFU1QgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA2DQovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KDQovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KLyoqIFxicmllZiAgU3VwcG9ydGVkIG1vZGUgcGFnZXMgKi8NCi8qKiBcc2VlICAgIHNiYzNyMDYucGRmIC0gU2VjdGlvbiA2LjMuMSAtIFRhYmxlIDExNSAqLw0KI2RlZmluZSBTQkNfUEFHRV9SRUFEX1dSSVRFX0VSUk9SX1JFQ09WRVJZICAgICAgICAgICAgMHgwMQ0KI2RlZmluZSBTQkNfUEFHRV9JTkZPUk1BVElPTkFMX0VYQ0VQVElPTlNfQ09OVFJPTCAgICAgMHgxQw0KI2RlZmluZSBTQkNfUEFHRV9SRVRVUk5fQUxMICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgzRg0KI2RlZmluZSBTQkNfUEFHRV9WRU5ET1JfU1BFQ0lGSUMgICAgICAgICAgICAgICAgICAgICAgMHgwMA0KLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCg0KLyoqIFxhZGR0b2dyb3VwIHVzYmRfbXNkX2VuZGlhbl9tYWNyb3MgTVNEIEVuZGlhbiBNYWNyb3MNCiAqICAgICAgQHsNCiAqIFRoaXMgcGFnZSBsaXN0cyB0aGUgbWFjcm9zIGZvciBlbmRpYW5uZXNzIGNvbnZlcnNpb24uDQogKg0KICogXHNlY3Rpb24gTWFjcm9zDQogKiAtIFdPUkRCDQogKiAtIERXT1JEQg0KICogLSBTVE9SRV9EV09SREINCiAqIC0gU1RPUkVfV09SREINCiAqLw0KDQogLyoqIFxicmllZiAgQ29udmVydHMgYSBieXRlIGFycmF5IHRvIGEgd29yZCB2YWx1ZSB1c2luZyB0aGUgYmlnIGVuZGlhbiBmb3JtYXQgKi8NCiNkZWZpbmUgV09SREIoYnl0ZXMpICAgICAgICAgICAgKCh1bnNpZ25lZCBzaG9ydCkgKChieXRlc1swXSA8PCA4KSB8IGJ5dGVzWzFdKSkNCg0KLyoqIFxicmllZiAgQ29udmVydHMgYSBieXRlIGFycmF5IHRvIGEgZHdvcmQgdmFsdWUgdXNpbmcgdGhlIGJpZyBlbmRpYW4gZm9ybWF0ICovDQojZGVmaW5lIERXT1JEQihieXRlcykgICAoKHVuc2lnbmVkIGludCkgKChieXRlc1swXSA8PCAyNCkgfCAoYnl0ZXNbMV0gPDwgMTYpIFwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAoYnl0ZXNbMl0gPDwgOCkgfCBieXRlc1szXSkpDQoNCi8qKiBcYnJpZWYgIFN0b3JlcyBhIGR3b3JkIHZhbHVlIGluIGEgYnl0ZSBhcnJheSwgaW4gYmlnIGVuZGlhbiBmb3JtYXQgKi8NCiNkZWZpbmUgU1RPUkVfRFdPUkRCKGR3b3JkLCBieXRlcykgXA0KICAgIGJ5dGVzWzBdID0gKHVuc2lnbmVkIGNoYXIpICgoKGR3b3JkKSA+PiAyNCkgJiAweEZGKTsgXA0KICAgIGJ5dGVzWzFdID0gKHVuc2lnbmVkIGNoYXIpICgoKGR3b3JkKSA+PiAxNikgJiAweEZGKTsgXA0KICAgIGJ5dGVzWzJdID0gKHVuc2lnbmVkIGNoYXIpICgoKGR3b3JkKSA+PiA4KSAmIDB4RkYpOyBcDQogICAgYnl0ZXNbM10gPSAodW5zaWduZWQgY2hhcikgKChkd29yZCkgJiAweEZGKTsNCg0KLyoqIFxicmllZiAgU3RvcmVzIGEgd29yZCB2YWx1ZSBpbiBhIGJ5dGUgYXJyYXksIGluIGJpZyBlbmRpYW4gZm9ybWF0ICovDQojZGVmaW5lIFNUT1JFX1dPUkRCKHdvcmQsIGJ5dGVzKSBcDQogICAgYnl0ZXNbMF0gPSAodW5zaWduZWQgY2hhcikgKCgod29yZCkgPj4gOCkgJiAweEZGKTsgXA0KICAgIGJ5dGVzWzFdID0gKHVuc2lnbmVkIGNoYXIpICgod29yZCkgJiAweEZGKTsNCi8qKiAgICAgIEB9Ki8NCg0KLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiAqICAgICAgU3RydWN0dXJlcw0KICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KI3ByYWdtYSBwYWNrKDEpDQojaWYgZGVmaW5lZCAgICggX19DQ19BUk0gICApIC8qIEtlaWwgpsxWaXNpb24gNCAqLw0KI2VsaWYgZGVmaW5lZCAoIF9fSUNDQVJNX18gKSAvKiBJQVIgRXdhcm0gKi8NCiNkZWZpbmUgX19hdHRyaWJ1dGVfXyguLi4pDQojZGVmaW5lIF9fcGFja2VkX18gIHBhY2tlZA0KI2VsaWYgZGVmaW5lZCAoICBfX0dOVUNfXyAgKSAvKiBHQ0MgQ1MzICovDQojZGVmaW5lIF9fcGFja2VkX18gIGFsaWduZWQoMSkNCiNlbmRpZg0KLyoqDQogKiBcdHlwZWRlZiBTQkNJbnF1aXJ5DQogKiBcYnJpZWYgIFN0cnVjdHVyZSBmb3IgdGhlIElOUVVJUlkgY29tbWFuZA0KICogXHNlZSAgICBzcGM0cjA2LnBkZiAtIFNlY3Rpb24gNi40LjEgLSBUYWJsZSA4MQ0KICovDQp0eXBlZGVmIHN0cnVjdCBfU0JDSW5xdWlyeSB7DQoNCiAgICB1bnNpZ25lZCBjaGFyIGJPcGVyYXRpb25Db2RlOyAgICAgICAvKiE8IDB4MTIgOiBTQkNfSU5RVUlSWSAqLw0KICAgIHVuc2lnbmVkIGNoYXIgaXNFVlBEOjEsICAgICAgICAgICAgIC8qITwgVHlwZSBvZiByZXF1ZXN0ZWQgZGF0YSAqLw0KICAgICAgICAgICAgICAgICAgYlJlc2VydmVkMTo3OyAgICAgICAgIC8qITwgUmVzZXJ2ZWQgYml0cyAqLw0KICAgIHVuc2lnbmVkIGNoYXIgYlBhZ2VDb2RlOyAgICAgICAgICAgIC8qITwgU3BlY2lmaWVzIHRoZSBWUEQgdG8gcmV0dXJuICovDQogICAgdW5zaWduZWQgY2hhciBwQWxsb2NhdGlvbkxlbmd0aFsyXTsgLyohPCBTaXplIG9mIGhvc3QgYnVmZmVyICovDQogICAgdW5zaWduZWQgY2hhciBiQ29udHJvbDsgICAgICAgICAgICAgLyohPCAweDAwICovDQoNCn0gX19hdHRyaWJ1dGVfXyAoKF9fcGFja2VkX18pKSBTQkNJbnF1aXJ5OyAvKiBHQ0MgKi8NCg0KLyoqDQogKiBcdHlwZWRlZiBTQkNJbnF1aXJ5RGF0YQ0KICogXGJyaWVmICBTdGFuZGFyZCBJTlFVSVJZIGRhdGEgZm9ybWF0IHJldHVybmVkIGJ5IHRoZSBkZXZpY2UNCiAqIFxzZWUgICAgc3BjNHIwNi5wZGYgLSBTZWN0aW9uIDYuNC4yIC0gVGFibGUgODINCiAqLw0KdHlwZWRlZiBzdHJ1Y3QgX1NCQ0lucXVpcnlEYXRhIHsNCg0KICAgIHVuc2lnbmVkIGNoYXIgIGJQZXJpcGhlcmFsRGV2aWNlVHlwZTo1LCAvKiE8IFBlcmlwaGVyYWwgZGV2aWNlIHR5cGUgKi8NCiAgICAgICAgICAgICAgICAgICBiUGVyaXBoZXJhbFF1YWxpZmllciA6MzsgLyohPCBQZXJpcGhlcmFsIHF1YWxpZmllciAqLw0KICAgIHVuc2lnbmVkIGNoYXIgIGJSZXNlcnZlZDE6NywgICAgICAgICAgICAvKiE8IFJlc2VydmVkIGJpdHMgKi8NCiAgICAgICAgICAgICAgICAgICBpc1JNQiAgICAgOjE7ICAgICAgICAgICAgLyohPCBJcyBtZWRpYSByZW1vdmFibGUgPyAqLw0KICAgIHVuc2lnbmVkIGNoYXIgIGJWZXJzaW9uOyAgICAgICAgICAgICAgICAvKiE8IFNQQyB2ZXJzaW9uIHVzZWQgKi8NCiAgICB1bnNpZ25lZCBjaGFyICBiUmVzcG9uc2VEYXRhRm9ybWF0OjQsICAgLyohPCBNdXN0IGJlIDB4MiAqLw0KICAgICAgICAgICAgICAgICAgIGlzSElHSFNVUCAgICAgICAgICA6MSwgICAvKiE8IEhpZXJhcmNoaWNhbCBhZGRyZXNzaW5nIHVzZWQgPyAqLw0KICAgICAgICAgICAgICAgICAgIGlzTk9STUFDQSAgICAgICAgICA6MSwgICAvKiE8IEFDQSBhdHRyaWJ1dGUgc3VwcG9ydGVkID8gKi8NCiAgICAgICAgICAgICAgICAgICBiT2Jzb2xldGUxICAgICAgICAgOjI7ICAgLyohPCBPYnNvbGV0ZSBiaXRzICovDQogICAgdW5zaWduZWQgY2hhciAgYkFkZGl0aW9uYWxMZW5ndGg7ICAgICAgIC8qITwgTGVuZ3RoIG9mIHJlbWFpbmluZyBJTlFVSVJZIGRhdGEgKi8NCiAgICB1bnNpZ25lZCBjaGFyICBpc1NDQ1MgICAgOjEsICAgICAgICAgICAgLyohPCBFbWJlZGRlZCBTQ0MgPyAqLw0KICAgICAgICAgICAgICAgICAgIGlzQUNDICAgICA6MSwgICAgICAgICAgICAvKiE8IEFjY2VzcyBjb250cm9sIGNvb3JkaW5hdG9yID8gKi8NCiAgICAgICAgICAgICAgICAgICBiVFBHUyAgICAgOjIsICAgICAgICAgICAgLyohPCBUYXJnZXQgcG9ydCBzdXBwb3J0IGdyb3VwICovDQogICAgICAgICAgICAgICAgICAgaXMzUEMgICAgIDoxLCAgICAgICAgICAgIC8qITwgVGhpcmQtcGFydHkgY29weSBzdXBwb3J0ZWQgPyAqLw0KICAgICAgICAgICAgICAgICAgIGJSZXNlcnZlZDI6MiwgICAgICAgICAgICAvKiE8IFJlc2VydmVkIGJpdHMgKi8NCiAgICAgICAgICAgICAgICAgICBpc1Byb3RlY3QgOjE7ICAgICAgICAgICAgLyohPCBQcm90ZWN0aW9uIGluZm8gc3VwcG9ydGVkID8gKi8NCiAgICB1bnNpZ25lZCBjaGFyICBiT2Jzb2xldGUyOjEsICAgICAgICAgICAgLyohPCBPYnNvbGV0ZSBiaXQgKi8NCiAgICAgICAgICAgICAgICAgICBpc0VuY1NlcnYgOjEsICAgICAgICAgICAgLyohPCBFbWJlZGRlZCBlbmNsb3N1cmUgc2VydmljZSBjb21wPyAqLw0KICAgICAgICAgICAgICAgICAgIGlzVlMgICAgICA6MSwgICAgICAgICAgICAvKiE8ID8/PyAqLw0KICAgICAgICAgICAgICAgICAgIGlzTXVsdGlQICA6MSwgICAgICAgICAgICAvKiE8IE11bHRpLXBvcnQgZGV2aWNlID8gKi8NCiAgICAgICAgICAgICAgICAgICBiT2Jzb2xldGUzOjMsICAgICAgICAgICAgLyohPCBPYnNvbGV0ZSBiaXRzICovDQogICAgICAgICAgICAgICAgICAgYlVudXNlZDEgIDoxOyAgICAgICAgICAgIC8qITwgVW51c2VkIGZlYXR1cmUgKi8NCiAgICB1bnNpZ25lZCBjaGFyICBiVW51c2VkMjo2LCAgICAgICAgICAgICAgLyohPCBVbnVzZWQgZmVhdHVyZXMgKi8NCiAgICAgICAgICAgICAgICAgICBpc0NtZFF1ZToxLCAgICAgICAgICAgICAgLyohPCBUYXNrIG1hbmFnZW1lbnQgbW9kZWwgc3VwcG9ydGVkID8gKi8NCiAgICAgICAgICAgICAgICAgICBpc1ZTMiAgIDoxOyAgICAgICAgICAgICAgLyohPCA/Pz8gKi8NCiAgICB1bnNpZ25lZCBjaGFyICBwVmVuZG9ySURbOF07ICAgICAgICAgICAgLyohPCBUMTAgdmVuZG9yIGlkZW50aWZpY2F0aW9uICovDQogICAgdW5zaWduZWQgY2hhciAgcFByb2R1Y3RJRFsxNl07ICAgICAgICAgIC8qITwgVmVuZG9yLWRlZmluZWQgcHJvZHVjdCBJRCAqLw0KICAgIHVuc2lnbmVkIGNoYXIgIHBQcm9kdWN0UmV2aXNpb25MZXZlbFs0XTsvKiE8IFZlbmRvci1kZWZpbmVkIHByb2R1Y3QgcmV2aXNpb24gKi8NCiAgICB1bnNpZ25lZCBjaGFyICBwVmVuZG9yU3BlY2lmaWNbMjBdOyAgICAgLyohPCBWZW5kb3Itc3BlY2lmaWMgZGF0YSAqLw0KICAgIHVuc2lnbmVkIGNoYXIgIGJVbnVzZWQzOyAgICAgICAgICAgICAgICAvKiE8IFVudXNlZCBmZWF0dXJlcyAqLw0KICAgIHVuc2lnbmVkIGNoYXIgIGJSZXNlcnZlZDM7ICAgICAgICAgICAgICAvKiE8IFJlc2VydmVkIGJpdHMgKi8NCiAgICB1bnNpZ25lZCBzaG9ydCBwVmVyc2lvbkRlc2NyaXB0b3JzWzhdOyAgLyohPCBTdGFuZGFyZHMgdGhlIGRldmljZSBjb21wbGllcyB0byAqLw0KICAgIHVuc2lnbmVkIGNoYXIgIHBSZXNlcnZlZDRbMjJdOyAgICAgICAgICAvKiE8IFJlc2VydmVkIGJ5dGVzICovDQoNCn0gX19hdHRyaWJ1dGVfXyAoKF9fcGFja2VkX18pKSBTQkNJbnF1aXJ5RGF0YTsgLyogR0NDICovDQoNCi8qKg0KICogXHR5cGVkZWYgU0JDUmVhZDEwDQogKiBcYnJpZWYgIERhdGEgc3RydWN0dXJlIGZvciB0aGUgUkVBRCAoMTApIGNvbW1hbmQNCiAqIFxzZWUgICAgc2JjM3IwNy5wZGYgLSBTZWN0aW9uIDUuNyAtIFRhYmxlIDM0DQogKi8NCnR5cGVkZWYgc3RydWN0IF9TQkNSZWFkMTAgew0KDQogICAgdW5zaWduZWQgY2hhciBiT3BlcmF0aW9uQ29kZTsgICAgICAgICAgLyohPCAweDI4IDogU0JDX1JFQURfMTAgKi8NCiAgICB1bnNpZ25lZCBjaGFyIGJPYnNvbGV0ZTE6MSwgICAgICAgICAgICAvKiE8IE9ic29sZXRlIGJpdCAqLw0KICAgICAgICAgICAgICAgICAgaXNGVUFfTlY6MSwgICAgICAgICAgICAgIC8qITwgQ2FjaGUgY29udHJvbCBiaXQgKi8NCiAgICAgICAgICAgICAgICAgIGJSZXNlcnZlZDE6MSwgICAgICAgICAgICAvKiE8IFJlc2VydmVkIGJpdCAqLw0KICAgICAgICAgICAgICAgICAgaXNGVUE6MSwgICAgICAgICAgICAgICAgIC8qITwgQ2FjaGUgY29udHJvbCBiaXQgKi8NCiAgICAgICAgICAgICAgICAgIGlzRFBPOjEsICAgICAgICAgICAgICAgICAvKiE8IENhY2hlIGNvbnRyb2wgYml0ICovDQogICAgICAgICAgICAgICAgICBiUmRQcm90ZWN0OjM7ICAgICAgICAgICAgLyohPCBQcm90ZWN0aW9uIGluZm9ybWF0aW9uIHRvIHNlbmQgKi8NCiAgICB1bnNpZ25lZCBjaGFyIHBMb2dpY2FsQmxvY2tBZGRyZXNzWzRdOyAvKiE8IEluZGV4IG9mIGZpcnN0IGJsb2NrIHRvIHJlYWQgKi8NCiAgICB1bnNpZ25lZCBjaGFyIGJHcm91cE51bWJlcjo1LCAgICAgICAgICAvKiE8IEluZm9ybWF0aW9uIGdyb3VwaW5nICovDQogICAgICAgICAgICAgICAgICBiUmVzZXJ2ZWQyOjM7ICAgICAgICAgICAgLyohPCBSZXNlcnZlZCBiaXRzICovDQogICAgdW5zaWduZWQgY2hhciBwVHJhbnNmZXJMZW5ndGhbMl07ICAgICAgLyohPCBOdW1iZXIgb2YgYmxvY2tzIHRvIHRyYW5zbWl0ICovDQogICAgdW5zaWduZWQgY2hhciBiQ29udHJvbDsgICAgICAgICAgICAgICAgLyohPCAweDAwICovDQoNCn0gX19hdHRyaWJ1dGVfXyAoKF9fcGFja2VkX18pKSBTQkNSZWFkMTA7IC8qIEdDQyAqLw0KDQovKioNCiAqIFx0eXBlZGVmIFNCQ1JlYWRDYXBhY2l0eTEwDQogKiBcYnJpZWYgIFN0cnVjdHVyZSBmb3IgdGhlIFJFQUQgQ0FQQUNJVFkgKDEwKSBjb21tYW5kDQogKiBcc2VlICAgIHNiYzNyMDcucGRmIC0gU2VjdGlvbiA1LjExLjEgLSBUYWJsZSA0MA0KICovDQp0eXBlZGVmIHN0cnVjdCBfU0JDUmVhZENhcGFjaXR5MTAgew0KDQogICAgdW5zaWduZWQgY2hhciBiT3BlcmF0aW9uQ29kZTsgICAgICAgICAgLyohPCAweDI1IDogUkJDX1JFQURfQ0FQQUNJVFkgKi8NCiAgICB1bnNpZ25lZCBjaGFyIGJPYnNvbGV0ZTE6MSwgICAgICAgICAgICAvKiE8IE9ic29sZXRlIGJpdCAqLw0KICAgICAgICAgICAgICAgICAgYlJlc2VydmVkMTo3OyAgICAgICAgICAgIC8qITwgUmVzZXJ2ZWQgYml0cyAqLw0KICAgIHVuc2lnbmVkIGNoYXIgcExvZ2ljYWxCbG9ja0FkZHJlc3NbNF07IC8qITwgQmxvY2sgdG8gZXZhbHVhdGUgaWYgUE1JIGlzIHNldCAqLw0KICAgIHVuc2lnbmVkIGNoYXIgcFJlc2VydmVkMlsyXTsgICAgICAgICAgIC8qITwgUmVzZXJ2ZWQgYnl0ZXMgKi8NCiAgICB1bnNpZ25lZCBjaGFyIGlzUE1JOjEsICAgICAgICAgICAgICAgICAvKiE8IFBhcnRpYWwgbWVkaXVtIGluZGljYXRvciBiaXQgKi8NCiAgICAgICAgICAgICAgICAgIGJSZXNlcnZlZDM6NzsgICAgICAgICAgICAvKiE8IFJlc2VydmVkIGJpdHMgKi8NCiAgICB1bnNpZ25lZCBjaGFyIGJDb250cm9sOyAgICAgICAgICAgICAgICAvKiE8IDB4MDAgKi8NCg0KfSBTQkNSZWFkQ2FwYWNpdHkxMDsNCg0KLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiAqIFxicmllZiAgRGF0YSByZXR1cm5lZCBieSB0aGUgZGV2aWNlIGFmdGVyIGEgUkVBRCBDQVBBQ0lUWSAoMTApIGNvbW1hbmQNCiAqIFxzZWUgICAgc2JjM3IwNy5wZGYgLSBTZWN0aW9uIDUuMTEuMiAtIFRhYmxlIDQxDQogKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQp0eXBlZGVmIHN0cnVjdCB7DQoNCiAgICB1bnNpZ25lZCBjaGFyIHBMb2dpY2FsQmxvY2tBZGRyZXNzWzRdOyAvKiE8IEFkZHJlc3Mgb2YgbGFzdCBsb2dpY2FsIGJsb2NrICovDQogICAgdW5zaWduZWQgY2hhciBwTG9naWNhbEJsb2NrTGVuZ3RoWzRdOyAgLyohPCBMZW5ndGggb2YgZWFjaCBsb2dpY2FsIGJsb2NrICovDQoNCn0gU0JDUmVhZENhcGFjaXR5MTBEYXRhOw0KDQovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KICogXGJyaWVmICBTdHJ1Y3R1cmUgZm9yIHRoZSBSRVFVRVNUIFNFTlNFIGNvbW1hbmQNCiAqIFxzZWUgICAgc3BjNHIwNi5wZGYgLSBTZWN0aW9uIDYuMjYgLSBUYWJsZSAxNzANCiAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCnR5cGVkZWYgc3RydWN0IHsNCg0KICAgIHVuc2lnbmVkIGNoYXIgYk9wZXJhdGlvbkNvZGU7ICAgIC8qITwgMHgwMyA6IFNCQ19SRVFVRVNUX1NFTlNFICovDQogICAgdW5zaWduZWQgY2hhciBpc0Rlc2MgICAgOjEsICAgICAgLyohPCBUeXBlIG9mIGluZm9ybWF0aW9uIGV4cGVjdGVkICovDQogICAgICAgICAgICAgICAgICBiUmVzZXJ2ZWQxOjc7ICAgICAgLyohPCBSZXNlcnZlZCBiaXRzICovDQogICAgdW5zaWduZWQgY2hhciBwUmVzZXJ2ZWQyWzJdOyAgICAgLyohPCBSZXNlcnZlZCBieXRlcyAqLw0KICAgIHVuc2lnbmVkIGNoYXIgYkFsbG9jYXRpb25MZW5ndGg7IC8qITwgU2l6ZSBvZiBob3N0IGJ1ZmZlciAqLw0KICAgIHVuc2lnbmVkIGNoYXIgYkNvbnRyb2w7ICAgICAgICAgIC8qITwgMHgwMCAqLw0KDQp9IFNCQ1JlcXVlc3RTZW5zZTsNCg0KLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiAqIFxicmllZiAgRml4ZWQgZm9ybWF0IHNlbnNlIGRhdGEgcmV0dXJuZWQgYWZ0ZXIgYSBSRVFVRVNUIFNFTlNFIGNvbW1hbmQgaGFzDQogKiAgICAgICAgIGJlZW4gcmVjZWl2ZWQgd2l0aCBhIERFU0MgYml0IGNsZWFyZWQuDQogKiBcc2VlICAgIHNwYzRyMDYucGRmIC0gU2VjdGlvbiA0LjUuMyAtIFRhYmxlIDI2DQogKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQp0eXBlZGVmIHN0cnVjdCB7DQoNCiAgICB1bnNpZ25lZCBjaGFyIGJSZXNwb25zZUNvZGU6NywgICAgICAgICAgICAgICAgLyohPCBTZW5zZSBkYXRhIGZvcm1hdCAqLw0KICAgICAgICAgICAgICAgICAgaXNWYWxpZCAgICAgIDoxOyAgICAgICAgICAgICAgICAvKiE8IEluZm9ybWF0aW9uIGZpZWxkIGlzIHN0YW5kYXJkICovDQogICAgdW5zaWduZWQgY2hhciBiT2Jzb2xldGUxOyAgICAgICAgICAgICAgICAgICAgIC8qITwgT2Jzb2xldGUgYnl0ZSAqLw0KICAgIHVuc2lnbmVkIGNoYXIgYlNlbnNlS2V5IDo0LCAgICAgICAgICAgICAgICAgICAvKiE8IEdlbmVyaWMgZXJyb3IgaW5mb3JtYXRpb24gKi8NCiAgICAgICAgICAgICAgICAgIGJSZXNlcnZlZDE6MSwgICAgICAgICAgICAgICAgICAgLyohPCBSZXNlcnZlZCBiaXQgKi8NCiAgICAgICAgICAgICAgICAgIGlzSUxJICAgICA6MSwgICAgICAgICAgICAgICAgICAgLyohPCBTU0MgKi8NCiAgICAgICAgICAgICAgICAgIGlzRU9NICAgICA6MSwgICAgICAgICAgICAgICAgICAgLyohPCBTU0MgKi8NCiAgICAgICAgICAgICAgICAgIGlzRmlsZW1hcms6MTsgICAgICAgICAgICAgICAgICAgLyohPCBTU0MgKi8NCiAgICB1bnNpZ25lZCBjaGFyIHBJbmZvcm1hdGlvbls0XTsgICAgICAgICAgICAgICAgLyohPCBDb21tYW5kLXNwZWNpZmljICovDQogICAgdW5zaWduZWQgY2hhciBiQWRkaXRpb25hbFNlbnNlTGVuZ3RoOyAgICAgICAgIC8qITwgc2l6ZW9mKFNCQ1JlcXVlc3RTZW5zZV9kYXRhKS04ICovDQogICAgdW5zaWduZWQgY2hhciBwQ29tbWFuZFNwZWNpZmljSW5mb3JtYXRpb25bNF07IC8qITwgQ29tbWFuZC1zcGVjaWZpYyAqLw0KICAgIHVuc2lnbmVkIGNoYXIgYkFkZGl0aW9uYWxTZW5zZUNvZGU7ICAgICAgICAgICAvKiE8IEFkZGl0aW9uYWwgZXJyb3IgaW5mb3JtYXRpb24gKi8NCiAgICB1bnNpZ25lZCBjaGFyIGJBZGRpdGlvbmFsU2Vuc2VDb2RlUXVhbGlmaWVyOyAgLyohPCBGdXJ0aGVyIGVycm9yIGluZm9ybWF0aW9uICovDQogICAgdW5zaWduZWQgY2hhciBiRmllbGRSZXBsYWNlYWJsZVVuaXRDb2RlOyAgICAgIC8qITwgU3BlY2lmaWMgY29tcG9uZW50IGNvZGUgKi8NCiAgICB1bnNpZ25lZCBjaGFyIGJTZW5zZUtleVNwZWNpZmljOjcsICAgICAgICAgICAgLyohPCBBZGRpdGlvbmFsIGV4Y2VwdGlvbiBpbmZvICovDQogICAgICAgICAgICAgICAgICBpc1NLU1YgICAgICAgICAgIDoxOyAgICAgICAgICAgIC8qITwgSXMgc2Vuc2Uga2V5IHNwZWNpZmljIHZhbGlkPyAqLw0KICAgIHVuc2lnbmVkIGNoYXIgcFNlbnNlS2V5U3BlY2lmaWNbMl07ICAgICAgICAgICAvKiE8IEFkZGl0aW9uYWwgZXhjZXB0aW9uIGluZm8gKi8NCg0KfSBTQkNSZXF1ZXN0U2Vuc2VEYXRhOw0KDQovKioNCiAqIFxicmllZiAgU0JDVGVzdFVuaXRSZWFkeQ0KICogICAgICAgICBEYXRhIHN0cnVjdHVyZSBmb3IgdGhlIFRFU1QgVU5JVCBSRUFEWSBjb21tYW5kDQogKiBcc2VlICAgIHNwYzRyMDYucGRmIC0gU2VjdGlvbiA2LjM0IC0gVGFibGUgMTkyDQogKi8NCnR5cGVkZWYgc3RydWN0IF9TQkNUZXN0VW5pdFJlYWR5IHsNCg0KICAgIHVuc2lnbmVkIGNoYXIgYk9wZXJhdGlvbkNvZGU7IC8qITwgMHgwMCA6IFNCQ19URVNUX1VOSVRfUkVBRFkgKi8NCiAgICB1bnNpZ25lZCBjaGFyIHBSZXNlcnZlZDFbNF07ICAvKiE8IFJlc2VydmVkIGJpdHMgKi8NCiAgICB1bnNpZ25lZCBjaGFyIGJDb250cm9sOyAgICAgICAvKiE8IDB4MDAgKi8NCg0KfSBfX2F0dHJpYnV0ZV9fICgoX19wYWNrZWRfXykpIFNCQ1Rlc3RVbml0UmVhZHk7IC8qIEdDQyAqLw0KDQovKioNCiAqIFx0eXBlZGVmIFNCQ1dyaXRlMTANCiAqIFxicmllZiAgU3RydWN0dXJlIGZvciB0aGUgV1JJVEUgKDEwKSBjb21tYW5kDQogKiBcc2VlICAgIHNiYzNyMDcucGRmIC0gU2VjdGlvbiA1LjI2IC0gVGFibGUgNzANCiAqLw0KdHlwZWRlZiBzdHJ1Y3QgX1NCQ1dyaXRlMTAgew0KDQogICAgdW5zaWduZWQgY2hhciBiT3BlcmF0aW9uQ29kZTsgICAgICAgICAgLyohPCAweDJBIDogU0JDX1dSSVRFXzEwICovDQogICAgdW5zaWduZWQgY2hhciBiT2Jzb2xldGUxOjEsICAgICAgICAgICAgLyohPCBPYnNvbGV0ZSBiaXQgKi8NCiAgICAgICAgICAgICAgICAgIGlzRlVBX05WOjEsICAgICAgICAgICAgICAvKiE8IENhY2hlIGNvbnRyb2wgYml0ICovDQogICAgICAgICAgICAgICAgICBiUmVzZXJ2ZWQxOjEsICAgICAgICAgICAgLyohPCBSZXNlcnZlZCBiaXQgKi8NCiAgICAgICAgICAgICAgICAgIGlzRlVBOjEsICAgICAgICAgICAgICAgICAvKiE8IENhY2hlIGNvbnRyb2wgYml0ICovDQogICAgICAgICAgICAgICAgICBpc0RQTzoxLCAgICAgICAgICAgICAgICAgLyohPCBDYWNoZSBjb250cm9sIGJpdCAqLw0KICAgICAgICAgICAgICAgICAgYldyUHJvdGVjdDozOyAgICAgICAgICAgIC8qITwgUHJvdGVjdGlvbiBpbmZvcm1hdGlvbiB0byBzZW5kICovDQogICAgdW5zaWduZWQgY2hhciBwTG9naWNhbEJsb2NrQWRkcmVzc1s0XTsgLyohPCBGaXJzdCBibG9jayB0byB3cml0ZSAqLw0KICAgIHVuc2lnbmVkIGNoYXIgYkdyb3VwTnVtYmVyOjUsICAgICAgICAgIC8qITwgSW5mb3JtYXRpb24gZ3JvdXBpbmcgKi8NCiAgICAgICAgICAgICAgICAgIGJSZXNlcnZlZDI6MzsgICAgICAgICAgICAvKiE8IFJlc2VydmVkIGJpdHMgKi8NCiAgICB1bnNpZ25lZCBjaGFyIHBUcmFuc2Zlckxlbmd0aFsyXTsgICAgICAvKiE8IE51bWJlciBvZiBibG9ja3MgdG8gd3JpdGUgKi8NCiAgICB1bnNpZ25lZCBjaGFyIGJDb250cm9sOyAgICAgICAgICAgICAgICAvKiE8IDB4MDAgKi8NCg0KfSBTQkNXcml0ZTEwOw0KDQovKioNCiAqIFx0eXBlZGVmIFNCQ01lZGl1bVJlbW92YWwNCiAqIFxicmllZiAgU3RydWN0dXJlIGZvciB0aGUgUFJFVkVOVC9BTExPVyBNRURJVU0gUkVNT1ZBTCBjb21tYW5kDQogKiBcc2VlICAgIHNiYzNyMDcucGRmIC0gU2VjdGlvbiA1LjUgLSBUYWJsZSAzMA0KICovDQp0eXBlZGVmIHN0cnVjdCBfU0JDTWVkaXVtUmVtb3ZhbCB7DQoNCiAgICB1bnNpZ25lZCBjaGFyIGJPcGVyYXRpb25Db2RlOyAvKiE8IDB4MUUgOiBTQkNfUFJFVkVOVF9BTExPV19NRURJVU1fUkVNT1ZBTCAqLw0KICAgIHVuc2lnbmVkIGNoYXIgcFJlc2VydmVkMVszXTsgIC8qITwgUmVzZXJ2ZWQgYnl0ZXMgKi8NCiAgICB1bnNpZ25lZCBjaGFyIGJQcmV2ZW50OjIsICAgICAvKiE8IEFjY2VwdC9wcm9oaWJpdCByZW1vdmFsICovDQogICAgICAgICAgICAgICAgICBiUmVzZXJ2ZWQyOjY7ICAgLyohPCBSZXNlcnZlZCBiaXRzICovDQogICAgdW5zaWduZWQgY2hhciBiQ29udHJvbDsgICAgICAgLyohPCAweDAwICovDQoNCn0gX19hdHRyaWJ1dGVfXyAoKF9fcGFja2VkX18pKSBTQkNNZWRpdW1SZW1vdmFsOyAvKiBHQ0MgKi8NCg0KLyoqDQogKiBcdHlwZWRlZiBTQkNNb2RlU2Vuc2U2DQogKiBcYnJpZWYgIFN0cnVjdHVyZSBmb3IgdGhlIE1PREUgU0VOU0UgKDYpIGNvbW1hbmQNCiAqIFxzZWUgICAgc3BjNHIwNiAtIFNlY3Rpb24gNi45LjEgLSBUYWJsZSA5OA0KICovDQp0eXBlZGVmIHN0cnVjdCBfU0JDTW9kZVNlbnNlNiB7DQoNCiAgICB1bnNpZ25lZCBjaGFyIGJPcGVyYXRpb25Db2RlOyAgICAvKiE8IDB4MUEgOiBTQkNfTU9ERV9TRU5TRV82ICovDQogICAgdW5zaWduZWQgY2hhciBiUmVzZXJ2ZWQxOjMsICAgICAgLyohPCBSZXNlcnZlZCBiaXRzICovDQogICAgICAgICAgICAgICAgICBpc0RCRDoxLCAgICAgICAgICAgLyohPCBEaXNhYmxlIGJsb2NrIGRlc2NyaXB0b3JzIGJpdCAqLw0KICAgICAgICAgICAgICAgICAgYlJlc2VydmVkMjo0OyAgICAgIC8qITwgUmVzZXJ2ZWQgYml0cyAqLw0KICAgIHVuc2lnbmVkIGNoYXIgYlBhZ2VDb2RlOjYsICAgICAgIC8qITwgTW9kZSBwYWdlIHRvIHJldHVybiAqLw0KICAgICAgICAgICAgICAgICAgYlBDOjI7ICAgICAgICAgICAgIC8qITwgVHlwZSBvZiBwYXJhbWV0ZXIgdmFsdWVzIHRvIHJldHVybiAqLw0KICAgIHVuc2lnbmVkIGNoYXIgYlN1YnBhZ2VDb2RlOyAgICAgIC8qITwgTW9kZSBzdWJwYWdlIHRvIHJldHVybiAqLw0KICAgIHVuc2lnbmVkIGNoYXIgYkFsbG9jYXRpb25MZW5ndGg7IC8qITwgSG9zdCBidWZmZXIgYWxsb2NhdGVkIHNpemUgKi8NCiAgICB1bnNpZ25lZCBjaGFyIGJDb250cm9sOyAgICAgICAgICAvKiE8IDB4MDAgKi8NCg0KfSBfX2F0dHJpYnV0ZV9fICgoX19wYWNrZWRfXykpIFNCQ01vZGVTZW5zZTY7IC8qIEdDQyAqLw0KDQovKioNCiAqIFx0eXBlZGVmIFNCQ01vZGVQYXJhbWV0ZXJIZWFkZXI2DQogKiBcYnJpZWYgIEhlYWRlciBmb3IgdGhlIGRhdGEgcmV0dXJuZWQgYWZ0ZXIgYSBNT0RFIFNFTlNFICg2KSBjb21tYW5kDQogKiBcc2VlICAgIHNwYzRyMDYucGRmIC0gU2VjdGlvbiA3LjQuMyAtIFRhYmxlIDI2OA0KICovDQp0eXBlZGVmIHN0cnVjdCBfU0JDTW9kZVBhcmFtZXRlckhlYWRlcjYgew0KDQogICAgdW5zaWduZWQgY2hhciBiTW9kZURhdGFMZW5ndGg7ICAgICAgICAgIC8qITwgTGVuZ3RoIG9mIG1vZGUgZGF0YSB0byBmb2xsb3cgKi8NCiAgICB1bnNpZ25lZCBjaGFyIGJNZWRpdW1UeXBlOyAgICAgICAgICAgICAgLyohPCBUeXBlIG9mIG1lZGl1bSAoU0JDX01FRElVTV9UWVBFX0RJUkVDVF9BQ0NFU1NfQkxPQ0tfREVWSUNFKSAqLw0KICAgIHVuc2lnbmVkIGNoYXIgYlJlc2VydmVkMTo0LCAgICAgICAgICAgICAvKiE8IFJlc2VydmVkIGJpdHMgKi8NCiAgICAgICAgICAgICAgICAgIGlzRFBPRlVBOjEsICAgICAgICAgICAgICAgLyohPCBEUE8vRlVBIGJpdHMgc3VwcG9ydGVkID8gKi8NCiAgICAgICAgICAgICAgICAgIGJSZXNlcnZlZDI6MiwgICAgICAgICAgICAgLyohPCBSZXNlcnZlZCBiaXRzICovDQogICAgICAgICAgICAgICAgICBpc1dQOjE7ICAgICAgICAgICAgICAgICAgIC8qITwgSXMgbWVkaXVtIHdyaXRlLXByb3RlY3RlZCA/ICovDQogICAgdW5zaWduZWQgY2hhciBiQmxvY2tEZXNjcmlwdG9yTGVuZ3RoOyAgIC8qITwgTGVuZ3RoIG9mIGFsbCBibG9jayBkZXNjcmlwdG9ycyAqLw0KDQp9IF9fYXR0cmlidXRlX18gKChfX3BhY2tlZF9fKSkgU0JDTW9kZVBhcmFtZXRlckhlYWRlcjY7IC8qIEdDQyAqLw0KDQovKioNCiAqIFx0eXBlZGVmIFNCQ0luZm9ybWF0aW9uYWxFeGNlcHRpb25zQ29udHJvbA0KICogXGJyaWVmICBJbmZvcm1hdGlvbmFsIGV4Y2VwdGlvbnMgY29udHJvbCBtb2RlIHBhZ2UNCiAqIFxzZWUgICAgc3BjNHIwNi5wZGYgLSBTZWN0aW9uIDcuNC4xMSAtIFRhYmxlIDI4NQ0KICovDQp0eXBlZGVmIHN0cnVjdCBfU0JDSW5mb3JtYXRpb25hbEV4Y2VwdGlvbnNDb250cm9sIHsNCg0KICAgIHVuc2lnbmVkIGNoYXIgYlBhZ2VDb2RlOjYsICAgICAgIC8qITwgMHgxQyA6IFNCQ19QQUdFX0lORk9STUFUSU9OQUxfRVhDRVBUSU9OU19DT05UUk9MICovDQogICAgICAgICAgICAgICAgICBpc1NQRjoxLCAgICAgICAgICAgLyohPCBQYWdlIG9yIHN1YnBhZ2UgZGF0YSBmb3JtYXQgKi8NCiAgICAgICAgICAgICAgICAgIGlzUFM6MTsgICAgICAgICAgICAvKiE8IFBhcmFtZXRlcnMgc2F2ZWFibGUgPyAqLw0KICAgIHVuc2lnbmVkIGNoYXIgYlBhZ2VMZW5ndGg7ICAgICAgIC8qITwgTGVuZ3RoIG9mIHBhZ2UgZGF0YSAoMHgwQSkgKi8NCiAgICB1bnNpZ25lZCBjaGFyIGlzTG9nRXJyOjEsICAgICAgICAvKiE8IFNob3VsZCBpbmZvcm1hdGlvbmFsIGV4Y2VwdGlvbnMgYmUgbG9nZ2VkID8gKi8NCiAgICAgICAgICAgICAgICAgIGlzRUJhY2tFcnI6MSwgICAgICAvKiE8IEVuYWJsZSBiYWNrZ3JvdW5kIGVycm9yIGJpdCAqLw0KICAgICAgICAgICAgICAgICAgaXNUZXN0OjEsICAgICAgICAgIC8qITwgQ3JlYXRlIGEgZGV2aWNlIHRlc3QgZmFpbHVyZSA/ICovDQogICAgICAgICAgICAgICAgICBpc0RFeGNwdDoxLCAgICAgICAgLyohPCBEaXNhYmxlIGV4Y2VwdGlvbiBjb250cm9sIGJpdCAqLw0KICAgICAgICAgICAgICAgICAgaXNFV2FzYzoxLCAgICAgICAgIC8qITwgUmVwb3J0IHdhcm5pbmdzID8gKi8NCiAgICAgICAgICAgICAgICAgIGlzRUJGOjEsICAgICAgICAgICAvKiE8IEVuYWJsZSBiYWNrZ3JvdW5kIGZ1bmN0aW9uIGJpdCAqLw0KICAgICAgICAgICAgICAgICAgYlJlc2VydmVkMToxLCAgICAgIC8qITwgUmVzZXJ2ZWQgYml0ICovDQogICAgICAgICAgICAgICAgICBpc1BlcmY6MTsgICAgICAgICAgLyohPCBEZWxheSBhY2NlcHRhYmxlIHdoZW4gdHJlYXRpbmcgZXhjZXB0aW9ucyA/ICovDQogICAgdW5zaWduZWQgY2hhciBiTVJJRTo0LCAgICAgICAgICAgLyohPCBNZXRob2Qgb2YgcmVwb3J0aW5nIGluZm9ybWF0aW9uYWwgZXhjZXB0aW9ucyAqLw0KICAgICAgICAgICAgICAgICAgYlJlc2VydmVkMjo0OyAgICAgIC8qITwgUmVzZXJ2ZWQgYml0cyAqLw0KICAgIHVuc2lnbmVkIGNoYXIgcEludGVydmFsVGltZXJbNF07IC8qITwgRXJyb3IgcmVwb3J0aW5nIHBlcmlvZCAqLw0KICAgIHVuc2lnbmVkIGNoYXIgcFJlcG9ydENvdW50WzRdOyAgIC8qITwgTWF4aW11bSBudW1iZXIgb2YgdGltZSBhIHJlcG9ydCBjYW4gYmUgaXNzdWVkICovDQoNCn0gX19hdHRyaWJ1dGVfXyAoKF9fcGFja2VkX18pKSBTQkNJbmZvcm1hdGlvbmFsRXhjZXB0aW9uc0NvbnRyb2w7IC8qIEdDQyAqLw0KDQovKioNCiAqIFx0eXBlZGVmIFNCQ1JlYWRXcml0ZUVycm9yUmVjb3ZlcnkNCiAqIFxicmllZiAgUmVhZC93cml0ZSBlcnJvciByZWNvdmVyeSBtb2RlIHBhZ2UNCiAqIFxzZWUgICAgc2JjM3IwNy5wZGYgLSBTZWN0aW9uIDYuMy41IC0gVGFibGUgMTIyDQogKi8NCnR5cGVkZWYgc3RydWN0IF9TQkNSZWFkV3JpdGVFcnJvclJlY292ZXJ5IHsNCg0KICAgIHVuc2lnbmVkIGNoYXIgYlBhZ2VDb2RlOjYsICAgICAgICAgICAvKiE8IDB4MDEgOiBTQkNfUEFHRV9SRUFEX1dSSVRFX0VSUk9SX1JFQ09WRVJZICovDQogICAgICAgICAgICAgICAgICBpc1NQRjoxLCAgICAgICAgICAgICAgIC8qITwgUGFnZSBvciBzdWJwYWdlIGRhdGEgZm9ybWF0ICovDQogICAgICAgICAgICAgICAgICBpc1BTOjE7ICAgICAgICAgICAgICAgIC8qITwgUGFyYW1ldGVycyBzYXZlYWJsZSA/ICovDQogICAgdW5zaWduZWQgY2hhciBiUGFnZUxlbmd0aDsgICAgICAgICAgIC8qITwgTGVuZ3RoIG9mIHBhZ2UgZGF0YSAoMHgwQSkgKi8NCiAgICB1bnNpZ25lZCBjaGFyIGlzRENSOjEsICAgICAgICAgICAgICAgLyohPCBEaXNhYmxlIGNvcnJlY3Rpb24gYml0ICovDQogICAgICAgICAgICAgICAgICBpc0RURToxLCAgICAgICAgICAgICAgIC8qITwgRGF0YSB0ZXJtaW5hdGUgb24gZXJyb3IgYml0ICovDQogICAgICAgICAgICAgICAgICBpc1BFUjoxLCAgICAgICAgICAgICAgIC8qITwgUG9zdCBlcnJvciBiaXQgKi8NCiAgICAgICAgICAgICAgICAgIGlzRUVSOjEsICAgICAgICAgICAgICAgLyohPCBFbmFibGUgZWFybHkgcmVjb3ZlcnkgYml0ICovDQogICAgICAgICAgICAgICAgICBpc1JDOjEsICAgICAgICAgICAgICAgIC8qITwgUmVhZCBjb250aW51b3VzIGJpdCAqLw0KICAgICAgICAgICAgICAgICAgaXNUQjoxLCAgICAgICAgICAgICAgICAvKiE8IFRyYW5zZmVyIGJsb2NrIGJpdCAqLw0KICAgICAgICAgICAgICAgICAgaXNBUlJFOjEsICAgICAgICAgICAgICAvKiE8IEF1dG9tYXRpYyByZWFkIHJlYWxsb2NhdGlvbiBlbmFibGVkIGJpdCAqLw0KICAgICAgICAgICAgICAgICAgaXNBV1JFOjE7ICAgICAgICAgICAgICAvKiE8IEF1dG9tYXRpYyB3cml0ZSByZWFsbG9jYXRpb24gZW5hYmxlZCBiaXQgKi8NCiAgICB1bnNpZ25lZCBjaGFyIGJSZWFkUmV0cnlDb3VudDsgICAgICAgLyohPCBOdW1iZXIgb2YgcmV0cmllcyB3aGVuIHJlYWRpbmcgKi8NCiAgICB1bnNpZ25lZCBjaGFyIHBPYnNvbGV0ZTFbM107ICAgICAgICAgLyohPCBPYnNvbGV0ZSBieXRlcyAqLw0KICAgIHVuc2lnbmVkIGNoYXIgYlJlc2VydmVkMTsgICAgICAgICAgICAvKiE8IFJlc2VydmVkIGJ5dGUgKi8NCiAgICB1bnNpZ25lZCBjaGFyIGJXcml0ZVJldHJ5Q291bnQ7ICAgICAgLyohPCBOdW1iZXIgb2YgcmV0cmllcyB3aGVuIHdyaXRpbmcgKi8NCiAgICB1bnNpZ25lZCBjaGFyIGJSZXNlcnZlZDI7ICAgICAgICAgICAgLyohPCBSZXNlcnZlZCBieXRlICovDQogICAgdW5zaWduZWQgY2hhciBwUmVjb3ZlcnlUaW1lTGltaXRbMl07IC8qITwgTWF4aW11bSB0aW1lIGR1cmF0aW9uIGZvciBlcnJvciByZWNvdmVyeSAqLw0KDQp9IF9fYXR0cmlidXRlX18gKChfX3BhY2tlZF9fKSkgU0JDUmVhZFdyaXRlRXJyb3JSZWNvdmVyeTsgLyogR0NDICovDQoNCi8qKg0KICogXHR5cGVkZWYgU0JDQ29tbWFuZA0KICogXGJyaWVmICBHZW5lcmljIHN0cnVjdHVyZSBmb3IgaG9sZGluZyBpbmZvcm1hdGlvbiBhYm91dCBTQkMgY29tbWFuZHMNCiAqIFxzZWUgICAgU0JDSW5xdWlyeQ0KICogXHNlZSAgICBTQkNSZWFkMTANCiAqIFxzZWUgICAgU0JDUmVhZENhcGFjaXR5MTANCiAqIFxzZWUgICAgU0JDUmVxdWVzdFNlbnNlDQogKiBcc2VlICAgIFNCQ1Rlc3RVbml0UmVhZHkNCiAqIFxzZWUgICAgU0JDV3JpdGUxMA0KICogXHNlZSAgICBTQkNNZWRpdW1SZW1vdmFsDQogKiBcc2VlICAgIFNCQ01vZGVTZW5zZTYNCiAqLw0KdHlwZWRlZiB1bmlvbiBfU0JDQ29tbWFuZCB7DQoNCiAgICB1bnNpZ25lZCBjaGFyICAgICBiT3BlcmF0aW9uQ29kZTsgLyohPCBPcGVyYXRpb24gY29kZSBvZiB0aGUgY29tbWFuZCAqLw0KICAgIFNCQ0lucXVpcnkgICAgICAgIGlucXVpcnk7ICAgICAgICAvKiE8IElOUVVJUlkgY29tbWFuZCAqLw0KICAgIFNCQ1JlYWQxMCAgICAgICAgIHJlYWQxMDsgICAgICAgICAvKiE8IFJFQUQgKDEwKSBjb21tYW5kICovDQogICAgU0JDUmVhZENhcGFjaXR5MTAgcmVhZENhcGFjaXR5MTA7IC8qITwgUkVBRCBDQVBBQ0lUWSAoMTApIGNvbW1hbmQgKi8NCiAgICBTQkNSZXF1ZXN0U2Vuc2UgICByZXF1ZXN0U2Vuc2U7ICAgLyohPCBSRVFVRVNUIFNFTlNFIGNvbW1hbmQgKi8NCiAgICBTQkNUZXN0VW5pdFJlYWR5ICB0ZXN0VW5pdFJlYWR5OyAgLyohPCBURVNUIFVOSVQgUkVBRFkgY29tbWFuZCAqLw0KICAgIFNCQ1dyaXRlMTAgICAgICAgIHdyaXRlMTA7ICAgICAgICAvKiE8IFdSSVRFICgxMCkgY29tbWFuZCAqLw0KICAgIFNCQ01lZGl1bVJlbW92YWwgIG1lZGl1bVJlbW92YWw7ICAvKiE8IFBSRVZFTlQvQUxMT1cgTUVESVVNIFJFTU9WQUwgY29tbWFuZCAqLw0KICAgIFNCQ01vZGVTZW5zZTYgICAgIG1vZGVTZW5zZTY7ICAgICAvKiE8IE1PREUgU0VOU0UgKDYpIGNvbW1hbmQgKi8NCg0KfSBTQkNDb21tYW5kOw0KDQojcHJhZ21hIHBhY2soKQ0KDQovKipAfSovDQoNCiNlbmRpZiAvKiNpZm5kZWYgU0JDX0ggKi8NCg0K