LyoqIEBmaWxlDQpJbXBsZW1lbnRhdGlvbiBvZiBTbUJ1c0xpYiBjbGFzcyBsaWJyYXJ5IGZvciBQRUkgcGhhc2UuDQoNCkNvcHlyaWdodCAoYykgMjAwNiwgSW50ZWwgQ29ycG9yYXRpb248QlI+DQpBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzICAgICAgICAgICAgICAgICAgICAgICAgICANCmFyZSBsaWNlbnNlZCBhbmQgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBCU0QgTGljZW5zZSAgICAgICAgIA0Kd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24uICBUaGUgZnVsbCB0ZXh0IG9mIHRoZSBsaWNlbnNlIG1heSBiZSBmb3VuZCBhdCAgICAgICAgDQpodHRwOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvYnNkLWxpY2Vuc2UucGhwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KVEhFIFBST0dSQU0gSVMgRElTVFJJQlVURUQgVU5ERVIgVEhFIEJTRCBMSUNFTlNFIE9OIEFOICJBUyBJUyIgQkFTSVMsICAgICAgICAgICAgICAgICAgICAgDQpXSVRIT1VUIFdBUlJBTlRJRVMgT1IgUkVQUkVTRU5UQVRJT05TIE9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTUyBPUiBJTVBMSUVELiAgICAgICAgICAgICANCg0KDQpNb2R1bGUgTmFtZTogU21idXNMaWIuYw0KDQoqKi8NCg0KI2luY2x1ZGUgIkludGVybmFsU21idXNMaWIuaCINCg0KLyoqDQogIEV4ZWN1dGVzIGFuIFNNQlVTIHF1aWNrIHJlYWQgY29tbWFuZC4NCg0KICBFeGVjdXRlcyBhbiBTTUJVUyBxdWljayByZWFkIGNvbW1hbmQgb24gdGhlIFNNQlVTIGRldmljZSBzcGVjaWZpZWQgYnkgU21CdXNBZGRyZXNzLg0KICBPbmx5IHRoZSBTTUJVUyBzbGF2ZSBhZGRyZXNzIGZpZWxkIG9mIFNtQnVzQWRkcmVzcyBpcyByZXF1aXJlZC4NCiAgSWYgU3RhdHVzIGlzIG5vdCBOVUxMLCB0aGVuIHRoZSBzdGF0dXMgb2YgdGhlIGV4ZWN1dGVkIGNvbW1hbmQgaXMgcmV0dXJuZWQgaW4gU3RhdHVzLg0KICBJZiBQRUMgaXMgc2V0IGluIFNtQnVzQWRkcmVzcywgdGhlbiBBU1NFUlQoKS4NCiAgSWYgQ29tbWFuZCBpbiBTbUJ1c0FkZHJlc3MgaXMgbm90IHplcm8sIHRoZW4gQVNTRVJUKCkuDQogIElmIExlbmd0aCBpbiBTbUJ1c0FkZHJlc3MgaXMgbm90IHplcm8sIHRoZW4gQVNTRVJUKCkuDQogIElmIGFueSByZXNlcnZlZCBiaXRzIG9mIFNtQnVzQWRkcmVzcyBhcmUgc2V0LCB0aGVuIEFTU0VSVCgpLg0KDQogIEBwYXJhbSAgU21CdXNBZGRyZXNzICAgIEFkZHJlc3MgdGhhdCBlbmNvZGVzIHRoZSBTTUJVUyBTbGF2ZSBBZGRyZXNzLA0KICAgICAgICAgICAgICAgICAgICAgICAgICBTTUJVUyBDb21tYW5kLCBTTUJVUyBEYXRhIExlbmd0aCwgYW5kIFBFQy4NCiAgQHBhcmFtICBTdGF0dXMgICAgICAgICAgUmV0dXJuIHN0YXR1cyBmb3IgdGhlIGV4ZWN1dGVkIGNvbW1hbmQuDQogICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgaXMgYW4gb3B0aW9uYWwgcGFyYW1ldGVyIGFuZCBtYXkgYmUgTlVMTC4NCg0KKiovDQpWT0lEDQpFRklBUEkNClNtQnVzUXVpY2tSZWFkICgNCiAgSU4gIFVJTlROICAgICAgICAgICAgICAgICAgICAgU21CdXNBZGRyZXNzLA0KICBPVVQgUkVUVVJOX1NUQVRVUyAgICAgICAgICAgICAqU3RhdHVzICAgICAgIE9QVElPTkFMDQogICkNCnsNCiAgQVNTRVJUICghU01CVVNfTElCX1BFQyAoU21CdXNBZGRyZXNzKSk7DQogIEFTU0VSVCAoU01CVVNfTElCX0NPTU1BTkQgKFNtQnVzQWRkcmVzcykgICA9PSAwKTsNCiAgQVNTRVJUIChTTUJVU19MSUJfTEVOR1RIIChTbUJ1c0FkZHJlc3MpICAgID09IDApOw0KICBBU1NFUlQgKFNNQlVTX0xJQl9SRVNFQVJWRUQgKFNtQnVzQWRkcmVzcykgPT0gMCk7DQoNCiAgSW50ZXJuYWxTbUJ1c0V4ZWMgKEVmaVNtYnVzUXVpY2tSZWFkLCBTbUJ1c0FkZHJlc3MsIDAsIE5VTEwsIFN0YXR1cyk7DQp9DQoNCi8qKg0KICBFeGVjdXRlcyBhbiBTTUJVUyBxdWljayB3cml0ZSBjb21tYW5kLg0KDQogIEV4ZWN1dGVzIGFuIFNNQlVTIHF1aWNrIHdyaXRlIGNvbW1hbmQgb24gdGhlIFNNQlVTIGRldmljZSBzcGVjaWZpZWQgYnkgU21CdXNBZGRyZXNzLg0KICBPbmx5IHRoZSBTTUJVUyBzbGF2ZSBhZGRyZXNzIGZpZWxkIG9mIFNtQnVzQWRkcmVzcyBpcyByZXF1aXJlZC4NCiAgSWYgU3RhdHVzIGlzIG5vdCBOVUxMLCB0aGVuIHRoZSBzdGF0dXMgb2YgdGhlIGV4ZWN1dGVkIGNvbW1hbmQgaXMgcmV0dXJuZWQgaW4gU3RhdHVzLg0KICBJZiBQRUMgaXMgc2V0IGluIFNtQnVzQWRkcmVzcywgdGhlbiBBU1NFUlQoKS4NCiAgSWYgQ29tbWFuZCBpbiBTbUJ1c0FkZHJlc3MgaXMgbm90IHplcm8sIHRoZW4gQVNTRVJUKCkuDQogIElmIExlbmd0aCBpbiBTbUJ1c0FkZHJlc3MgaXMgbm90IHplcm8sIHRoZW4gQVNTRVJUKCkuDQogIElmIGFueSByZXNlcnZlZCBiaXRzIG9mIFNtQnVzQWRkcmVzcyBhcmUgc2V0LCB0aGVuIEFTU0VSVCgpLg0KDQogIEBwYXJhbSAgU21CdXNBZGRyZXNzICAgIEFkZHJlc3MgdGhhdCBlbmNvZGVzIHRoZSBTTUJVUyBTbGF2ZSBBZGRyZXNzLA0KICAgICAgICAgICAgICAgICAgICAgICAgICBTTUJVUyBDb21tYW5kLCBTTUJVUyBEYXRhIExlbmd0aCwgYW5kIFBFQy4NCiAgQHBhcmFtICBTdGF0dXMgICAgICAgICAgUmV0dXJuIHN0YXR1cyBmb3IgdGhlIGV4ZWN1dGVkIGNvbW1hbmQuDQogICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgaXMgYW4gb3B0aW9uYWwgcGFyYW1ldGVyIGFuZCBtYXkgYmUgTlVMTC4NCg0KKiovDQpWT0lEDQpFRklBUEkNClNtQnVzUXVpY2tXcml0ZSAoDQogIElOICBVSU5UTiAgICAgICAgICAgICAgICAgICAgIFNtQnVzQWRkcmVzcywNCiAgT1VUIFJFVFVSTl9TVEFUVVMgICAgICAgICAgICAgKlN0YXR1cyAgICAgICBPUFRJT05BTA0KICApDQp7DQogIEFTU0VSVCAoIVNNQlVTX0xJQl9QRUMgKFNtQnVzQWRkcmVzcykpOw0KICBBU1NFUlQgKFNNQlVTX0xJQl9DT01NQU5EIChTbUJ1c0FkZHJlc3MpICAgPT0gMCk7DQogIEFTU0VSVCAoU01CVVNfTElCX0xFTkdUSCAoU21CdXNBZGRyZXNzKSAgICA9PSAwKTsNCiAgQVNTRVJUIChTTUJVU19MSUJfUkVTRUFSVkVEIChTbUJ1c0FkZHJlc3MpID09IDApOw0KDQogIEludGVybmFsU21CdXNFeGVjIChFZmlTbWJ1c1F1aWNrV3JpdGUsIFNtQnVzQWRkcmVzcywgMCwgTlVMTCwgU3RhdHVzKTsNCn0NCg0KLyoqDQogIEV4ZWN1dGVzIGFuIFNNQlVTIHJlY2VpdmUgYnl0ZSBjb21tYW5kLg0KDQogIEV4ZWN1dGVzIGFuIFNNQlVTIHJlY2VpdmUgYnl0ZSBjb21tYW5kIG9uIHRoZSBTTUJVUyBkZXZpY2Ugc3BlY2lmaWVkIGJ5IFNtQnVzQWRkcmVzcy4NCiAgT25seSB0aGUgU01CVVMgc2xhdmUgYWRkcmVzcyBmaWVsZCBvZiBTbUJ1c0FkZHJlc3MgaXMgcmVxdWlyZWQuDQogIFRoZSBieXRlIHJlY2VpdmVkIGZyb20gdGhlIFNNQlVTIGlzIHJldHVybmVkLg0KICBJZiBTdGF0dXMgaXMgbm90IE5VTEwsIHRoZW4gdGhlIHN0YXR1cyBvZiB0aGUgZXhlY3V0ZWQgY29tbWFuZCBpcyByZXR1cm5lZCBpbiBTdGF0dXMuDQogIElmIENvbW1hbmQgaW4gU21CdXNBZGRyZXNzIGlzIG5vdCB6ZXJvLCB0aGVuIEFTU0VSVCgpLg0KICBJZiBMZW5ndGggaW4gU21CdXNBZGRyZXNzIGlzIG5vdCB6ZXJvLCB0aGVuIEFTU0VSVCgpLg0KICBJZiBhbnkgcmVzZXJ2ZWQgYml0cyBvZiBTbUJ1c0FkZHJlc3MgYXJlIHNldCwgdGhlbiBBU1NFUlQoKS4NCg0KICBAcGFyYW0gIFNtQnVzQWRkcmVzcyAgICBBZGRyZXNzIHRoYXQgZW5jb2RlcyB0aGUgU01CVVMgU2xhdmUgQWRkcmVzcywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgU01CVVMgQ29tbWFuZCwgU01CVVMgRGF0YSBMZW5ndGgsIGFuZCBQRUMuDQogIEBwYXJhbSAgU3RhdHVzICAgICAgICAgIFJldHVybiBzdGF0dXMgZm9yIHRoZSBleGVjdXRlZCBjb21tYW5kLg0KICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGlzIGFuIG9wdGlvbmFsIHBhcmFtZXRlciBhbmQgbWF5IGJlIE5VTEwuDQoNCiAgQHJldHVybiBUaGUgYnl0ZSByZWNlaXZlZCBmcm9tIHRoZSBTTUJVUy4NCg0KKiovDQpVSU5UOA0KRUZJQVBJDQpTbUJ1c1JlY2VpdmVCeXRlICgNCiAgSU4gIFVJTlROICAgICAgICAgIFNtQnVzQWRkcmVzcywNCiAgT1VUIFJFVFVSTl9TVEFUVVMgICpTdGF0dXMgICAgICAgIE9QVElPTkFMDQogICkNCnsNCiAgVUlOVDggICBCeXRlOw0KDQogIEFTU0VSVCAoU01CVVNfTElCX0NPTU1BTkQgKFNtQnVzQWRkcmVzcykgPT0gMCk7DQogIEFTU0VSVCAoU01CVVNfTElCX0xFTkdUSCAoU21CdXNBZGRyZXNzKSAgPT0gMCk7DQogIEFTU0VSVCAoU01CVVNfTElCX1JFU0VBUlZFRCAoU21CdXNBZGRyZXNzKSA9PSAwKTsNCg0KICBJbnRlcm5hbFNtQnVzRXhlYyAoRWZpU21idXNSZWNlaXZlQnl0ZSwgU21CdXNBZGRyZXNzLCAxLCAmQnl0ZSwgU3RhdHVzKTsNCg0KICByZXR1cm4gQnl0ZTsNCn0NCg0KLyoqDQogIEV4ZWN1dGVzIGFuIFNNQlVTIHNlbmQgYnl0ZSBjb21tYW5kLg0KDQogIEV4ZWN1dGVzIGFuIFNNQlVTIHNlbmQgYnl0ZSBjb21tYW5kIG9uIHRoZSBTTUJVUyBkZXZpY2Ugc3BlY2lmaWVkIGJ5IFNtQnVzQWRkcmVzcy4NCiAgVGhlIGJ5dGUgc3BlY2lmaWVkIGJ5IFZhbHVlIGlzIHNlbnQuDQogIE9ubHkgdGhlIFNNQlVTIHNsYXZlIGFkZHJlc3MgZmllbGQgb2YgU21CdXNBZGRyZXNzIGlzIHJlcXVpcmVkLiAgVmFsdWUgaXMgcmV0dXJuZWQuDQogIElmIFN0YXR1cyBpcyBub3QgTlVMTCwgdGhlbiB0aGUgc3RhdHVzIG9mIHRoZSBleGVjdXRlZCBjb21tYW5kIGlzIHJldHVybmVkIGluIFN0YXR1cy4NCiAgSWYgQ29tbWFuZCBpbiBTbUJ1c0FkZHJlc3MgaXMgbm90IHplcm8sIHRoZW4gQVNTRVJUKCkuDQogIElmIExlbmd0aCBpbiBTbUJ1c0FkZHJlc3MgaXMgbm90IHplcm8sIHRoZW4gQVNTRVJUKCkuDQogIElmIGFueSByZXNlcnZlZCBiaXRzIG9mIFNtQnVzQWRkcmVzcyBhcmUgc2V0LCB0aGVuIEFTU0VSVCgpLg0KDQogIEBwYXJhbSAgU21CdXNBZGRyZXNzICAgIEFkZHJlc3MgdGhhdCBlbmNvZGVzIHRoZSBTTUJVUyBTbGF2ZSBBZGRyZXNzLA0KICAgICAgICAgICAgICAgICAgICAgICAgICBTTUJVUyBDb21tYW5kLCBTTUJVUyBEYXRhIExlbmd0aCwgYW5kIFBFQy4NCiAgQHBhcmFtICBWYWx1ZSAgICAgICAgICAgVGhlIDgtYml0IHZhbHVlIHRvIHNlbmQuDQogIEBwYXJhbSAgU3RhdHVzICAgICAgICAgIFJldHVybiBzdGF0dXMgZm9yIHRoZSBleGVjdXRlZCBjb21tYW5kLg0KICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGlzIGFuIG9wdGlvbmFsIHBhcmFtZXRlciBhbmQgbWF5IGJlIE5VTEwuDQoNCiAgQHJldHVybiBUaGUgcGFyYW1ldGVyIG9mIFZhbHVlLg0KDQoqKi8NClVJTlQ4DQpFRklBUEkNClNtQnVzU2VuZEJ5dGUgKA0KICBJTiAgVUlOVE4gICAgICAgICAgU21CdXNBZGRyZXNzLA0KICBJTiAgVUlOVDggICAgICAgICAgVmFsdWUsDQogIE9VVCBSRVRVUk5fU1RBVFVTICAqU3RhdHVzICAgICAgICBPUFRJT05BTA0KICApDQp7DQogIFVJTlQ4ICAgQnl0ZTsNCg0KICBBU1NFUlQgKFNNQlVTX0xJQl9DT01NQU5EIChTbUJ1c0FkZHJlc3MpICAgPT0gMCk7DQogIEFTU0VSVCAoU01CVVNfTElCX0xFTkdUSCAoU21CdXNBZGRyZXNzKSAgICA9PSAwKTsNCiAgQVNTRVJUIChTTUJVU19MSUJfUkVTRUFSVkVEIChTbUJ1c0FkZHJlc3MpID09IDApOw0KDQogIEJ5dGUgICA9IFZhbHVlOw0KICBJbnRlcm5hbFNtQnVzRXhlYyAoRWZpU21idXNTZW5kQnl0ZSwgU21CdXNBZGRyZXNzLCAxLCAmQnl0ZSwgU3RhdHVzKTsNCg0KICByZXR1cm4gVmFsdWU7DQp9DQoNCi8qKg0KICBFeGVjdXRlcyBhbiBTTUJVUyByZWFkIGRhdGEgYnl0ZSBjb21tYW5kLg0KDQogIEV4ZWN1dGVzIGFuIFNNQlVTIHJlYWQgZGF0YSBieXRlIGNvbW1hbmQgb24gdGhlIFNNQlVTIGRldmljZSBzcGVjaWZpZWQgYnkgU21CdXNBZGRyZXNzLg0KICBPbmx5IHRoZSBTTUJVUyBzbGF2ZSBhZGRyZXNzIGFuZCBTTUJVUyBjb21tYW5kIGZpZWxkcyBvZiBTbUJ1c0FkZHJlc3MgYXJlIHJlcXVpcmVkLg0KICBUaGUgOC1iaXQgdmFsdWUgcmVhZCBmcm9tIHRoZSBTTUJVUyBpcyByZXR1cm5lZC4NCiAgSWYgU3RhdHVzIGlzIG5vdCBOVUxMLCB0aGVuIHRoZSBzdGF0dXMgb2YgdGhlIGV4ZWN1dGVkIGNvbW1hbmQgaXMgcmV0dXJuZWQgaW4gU3RhdHVzLg0KICBJZiBMZW5ndGggaW4gU21CdXNBZGRyZXNzIGlzIG5vdCB6ZXJvLCB0aGVuIEFTU0VSVCgpLg0KICBJZiBhbnkgcmVzZXJ2ZWQgYml0cyBvZiBTbUJ1c0FkZHJlc3MgYXJlIHNldCwgdGhlbiBBU1NFUlQoKS4NCg0KICBAcGFyYW0gIFNtQnVzQWRkcmVzcyAgICBBZGRyZXNzIHRoYXQgZW5jb2RlcyB0aGUgU01CVVMgU2xhdmUgQWRkcmVzcywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgU01CVVMgQ29tbWFuZCwgU01CVVMgRGF0YSBMZW5ndGgsIGFuZCBQRUMuDQogIEBwYXJhbSAgU3RhdHVzICAgICAgICAgIFJldHVybiBzdGF0dXMgZm9yIHRoZSBleGVjdXRlZCBjb21tYW5kLg0KICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGlzIGFuIG9wdGlvbmFsIHBhcmFtZXRlciBhbmQgbWF5IGJlIE5VTEwuDQoNCiAgQHJldHVybiBUaGUgYnl0ZSByZWFkIGZyb20gdGhlIFNNQlVTLg0KDQoqKi8NClVJTlQ4DQpFRklBUEkNClNtQnVzUmVhZERhdGFCeXRlICgNCiAgSU4gIFVJTlROICAgICAgICAgIFNtQnVzQWRkcmVzcywNCiAgT1VUIFJFVFVSTl9TVEFUVVMgICpTdGF0dXMgICAgICAgIE9QVElPTkFMDQogICkNCnsNCiAgVUlOVDggICBCeXRlOw0KDQogIEFTU0VSVCAoU01CVVNfTElCX0xFTkdUSCAoU21CdXNBZGRyZXNzKSAgICA9PSAwKTsNCiAgQVNTRVJUIChTTUJVU19MSUJfUkVTRUFSVkVEIChTbUJ1c0FkZHJlc3MpID09IDApOw0KDQogIEludGVybmFsU21CdXNFeGVjIChFZmlTbWJ1c1JlYWRCeXRlLCBTbUJ1c0FkZHJlc3MsIDEsICZCeXRlLCBTdGF0dXMpOw0KICANCiAgcmV0dXJuIEJ5dGU7DQp9DQoNCi8qKg0KICBFeGVjdXRlcyBhbiBTTUJVUyB3cml0ZSBkYXRhIGJ5dGUgY29tbWFuZC4NCg0KICBFeGVjdXRlcyBhbiBTTUJVUyB3cml0ZSBkYXRhIGJ5dGUgY29tbWFuZCBvbiB0aGUgU01CVVMgZGV2aWNlIHNwZWNpZmllZCBieSBTbUJ1c0FkZHJlc3MuDQogIFRoZSA4LWJpdCB2YWx1ZSBzcGVjaWZpZWQgYnkgVmFsdWUgaXMgd3JpdHRlbi4NCiAgT25seSB0aGUgU01CVVMgc2xhdmUgYWRkcmVzcyBhbmQgU01CVVMgY29tbWFuZCBmaWVsZHMgb2YgU21CdXNBZGRyZXNzIGFyZSByZXF1aXJlZC4NCiAgVmFsdWUgaXMgcmV0dXJuZWQuDQogIElmIFN0YXR1cyBpcyBub3QgTlVMTCwgdGhlbiB0aGUgc3RhdHVzIG9mIHRoZSBleGVjdXRlZCBjb21tYW5kIGlzIHJldHVybmVkIGluIFN0YXR1cy4NCiAgSWYgTGVuZ3RoIGluIFNtQnVzQWRkcmVzcyBpcyBub3QgemVybywgdGhlbiBBU1NFUlQoKS4NCiAgSWYgYW55IHJlc2VydmVkIGJpdHMgb2YgU21CdXNBZGRyZXNzIGFyZSBzZXQsIHRoZW4gQVNTRVJUKCkuDQoNCiAgQHBhcmFtICBTbUJ1c0FkZHJlc3MgICAgQWRkcmVzcyB0aGF0IGVuY29kZXMgdGhlIFNNQlVTIFNsYXZlIEFkZHJlc3MsDQogICAgICAgICAgICAgICAgICAgICAgICAgIFNNQlVTIENvbW1hbmQsIFNNQlVTIERhdGEgTGVuZ3RoLCBhbmQgUEVDLg0KICBAcGFyYW0gIFZhbHVlICAgICAgICAgICBUaGUgOC1iaXQgdmFsdWUgdG8gd3JpdGUuDQogIEBwYXJhbSAgU3RhdHVzICAgICAgICAgIFJldHVybiBzdGF0dXMgZm9yIHRoZSBleGVjdXRlZCBjb21tYW5kLg0KICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGlzIGFuIG9wdGlvbmFsIHBhcmFtZXRlciBhbmQgbWF5IGJlIE5VTEwuDQoNCiAgQHJldHVybiBUaGUgcGFyYW1ldGVyIG9mIFZhbHVlLg0KDQoqKi8NClVJTlQ4DQpFRklBUEkNClNtQnVzV3JpdGVEYXRhQnl0ZSAoDQogIElOICBVSU5UTiAgICAgICAgICBTbUJ1c0FkZHJlc3MsDQogIElOICBVSU5UOCAgICAgICAgICBWYWx1ZSwNCiAgT1VUIFJFVFVSTl9TVEFUVVMgICpTdGF0dXMgICAgICAgIE9QVElPTkFMDQogICkNCnsNCiAgVUlOVDggICBCeXRlOw0KDQogIEFTU0VSVCAoU01CVVNfTElCX0xFTkdUSCAoU21CdXNBZGRyZXNzKSAgICA9PSAwKTsNCiAgQVNTRVJUIChTTUJVU19MSUJfUkVTRUFSVkVEIChTbUJ1c0FkZHJlc3MpID09IDApOw0KDQogIEJ5dGUgPSBWYWx1ZTsNCiAgSW50ZXJuYWxTbUJ1c0V4ZWMgKEVmaVNtYnVzV3JpdGVCeXRlLCBTbUJ1c0FkZHJlc3MsIDEsICZCeXRlLCBTdGF0dXMpOw0KICANCiAgcmV0dXJuIFZhbHVlOw0KfQ0KDQovKioNCiAgRXhlY3V0ZXMgYW4gU01CVVMgcmVhZCBkYXRhIHdvcmQgY29tbWFuZC4NCg0KICBFeGVjdXRlcyBhbiBTTUJVUyByZWFkIGRhdGEgd29yZCBjb21tYW5kIG9uIHRoZSBTTUJVUyBkZXZpY2Ugc3BlY2lmaWVkIGJ5IFNtQnVzQWRkcmVzcy4NCiAgT25seSB0aGUgU01CVVMgc2xhdmUgYWRkcmVzcyBhbmQgU01CVVMgY29tbWFuZCBmaWVsZHMgb2YgU21CdXNBZGRyZXNzIGFyZSByZXF1aXJlZC4NCiAgVGhlIDE2LWJpdCB2YWx1ZSByZWFkIGZyb20gdGhlIFNNQlVTIGlzIHJldHVybmVkLg0KICBJZiBTdGF0dXMgaXMgbm90IE5VTEwsIHRoZW4gdGhlIHN0YXR1cyBvZiB0aGUgZXhlY3V0ZWQgY29tbWFuZCBpcyByZXR1cm5lZCBpbiBTdGF0dXMuDQogIElmIExlbmd0aCBpbiBTbUJ1c0FkZHJlc3MgaXMgbm90IHplcm8sIHRoZW4gQVNTRVJUKCkuDQogIElmIGFueSByZXNlcnZlZCBiaXRzIG9mIFNtQnVzQWRkcmVzcyBhcmUgc2V0LCB0aGVuIEFTU0VSVCgpLg0KICANCiAgQHBhcmFtICBTbUJ1c0FkZHJlc3MgICAgQWRkcmVzcyB0aGF0IGVuY29kZXMgdGhlIFNNQlVTIFNsYXZlIEFkZHJlc3MsDQogICAgICAgICAgICAgICAgICAgICAgICAgIFNNQlVTIENvbW1hbmQsIFNNQlVTIERhdGEgTGVuZ3RoLCBhbmQgUEVDLg0KICBAcGFyYW0gIFN0YXR1cyAgICAgICAgICBSZXR1cm4gc3RhdHVzIGZvciB0aGUgZXhlY3V0ZWQgY29tbWFuZC4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBpcyBhbiBvcHRpb25hbCBwYXJhbWV0ZXIgYW5kIG1heSBiZSBOVUxMLg0KDQogIEByZXR1cm4gVGhlIGJ5dGUgcmVhZCBmcm9tIHRoZSBTTUJVUy4NCg0KKiovDQpVSU5UMTYNCkVGSUFQSQ0KU21CdXNSZWFkRGF0YVdvcmQgKA0KICBJTiAgVUlOVE4gICAgICAgICAgU21CdXNBZGRyZXNzLA0KICBPVVQgUkVUVVJOX1NUQVRVUyAgKlN0YXR1cyAgICAgICAgT1BUSU9OQUwNCiAgKQ0Kew0KICBVSU5UMTYgIFdvcmQ7DQoNCiAgQVNTRVJUIChTTUJVU19MSUJfTEVOR1RIIChTbUJ1c0FkZHJlc3MpICAgID09IDApOw0KICBBU1NFUlQgKFNNQlVTX0xJQl9SRVNFQVJWRUQgKFNtQnVzQWRkcmVzcykgPT0gMCk7DQoNCiAgSW50ZXJuYWxTbUJ1c0V4ZWMgKEVmaVNtYnVzUmVhZFdvcmQsIFNtQnVzQWRkcmVzcywgMiwgJldvcmQsIFN0YXR1cyk7DQogIA0KICByZXR1cm4gV29yZDsNCn0NCg0KLyoqDQogIEV4ZWN1dGVzIGFuIFNNQlVTIHdyaXRlIGRhdGEgd29yZCBjb21tYW5kLg0KDQogIEV4ZWN1dGVzIGFuIFNNQlVTIHdyaXRlIGRhdGEgd29yZCBjb21tYW5kIG9uIHRoZSBTTUJVUyBkZXZpY2Ugc3BlY2lmaWVkIGJ5IFNtQnVzQWRkcmVzcy4NCiAgVGhlIDE2LWJpdCB2YWx1ZSBzcGVjaWZpZWQgYnkgVmFsdWUgaXMgd3JpdHRlbi4NCiAgT25seSB0aGUgU01CVVMgc2xhdmUgYWRkcmVzcyBhbmQgU01CVVMgY29tbWFuZCBmaWVsZHMgb2YgU21CdXNBZGRyZXNzIGFyZSByZXF1aXJlZC4NCiAgVmFsdWUgaXMgcmV0dXJuZWQuDQogIElmIFN0YXR1cyBpcyBub3QgTlVMTCwgdGhlbiB0aGUgc3RhdHVzIG9mIHRoZSBleGVjdXRlZCBjb21tYW5kIGlzIHJldHVybmVkIGluIFN0YXR1cy4NCiAgSWYgTGVuZ3RoIGluIFNtQnVzQWRkcmVzcyBpcyBub3QgemVybywgdGhlbiBBU1NFUlQoKS4NCiAgSWYgYW55IHJlc2VydmVkIGJpdHMgb2YgU21CdXNBZGRyZXNzIGFyZSBzZXQsIHRoZW4gQVNTRVJUKCkuDQoNCiAgQHBhcmFtICBTbUJ1c0FkZHJlc3MgICAgQWRkcmVzcyB0aGF0IGVuY29kZXMgdGhlIFNNQlVTIFNsYXZlIEFkZHJlc3MsDQogICAgICAgICAgICAgICAgICAgICAgICAgIFNNQlVTIENvbW1hbmQsIFNNQlVTIERhdGEgTGVuZ3RoLCBhbmQgUEVDLg0KICBAcGFyYW0gIFZhbHVlICAgICAgICAgICBUaGUgMTYtYml0IHZhbHVlIHRvIHdyaXRlLg0KICBAcGFyYW0gIFN0YXR1cyAgICAgICAgICBSZXR1cm4gc3RhdHVzIGZvciB0aGUgZXhlY3V0ZWQgY29tbWFuZC4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBpcyBhbiBvcHRpb25hbCBwYXJhbWV0ZXIgYW5kIG1heSBiZSBOVUxMLg0KDQogIEByZXR1cm4gVGhlIHBhcmFtZXRlciBvZiBWYWx1ZS4NCg0KKiovDQpVSU5UMTYNCkVGSUFQSQ0KU21CdXNXcml0ZURhdGFXb3JkICgNCiAgSU4gIFVJTlROICAgICAgICAgIFNtQnVzQWRkcmVzcywNCiAgSU4gIFVJTlQxNiAgICAgICAgIFZhbHVlLA0KICBPVVQgUkVUVVJOX1NUQVRVUyAgKlN0YXR1cyAgICAgICAgT1BUSU9OQUwNCiAgKQ0Kew0KICBVSU5UMTYgIFdvcmQ7DQoNCiAgQVNTRVJUIChTTUJVU19MSUJfTEVOR1RIIChTbUJ1c0FkZHJlc3MpICAgID09IDApOw0KICBBU1NFUlQgKFNNQlVTX0xJQl9SRVNFQVJWRUQgKFNtQnVzQWRkcmVzcykgPT0gMCk7DQoNCiAgV29yZCA9IFZhbHVlOw0KICBJbnRlcm5hbFNtQnVzRXhlYyAoRWZpU21idXNXcml0ZVdvcmQsIFNtQnVzQWRkcmVzcywgMiwgJldvcmQsIFN0YXR1cyk7DQoNCiAgcmV0dXJuIFZhbHVlOw0KfQ0KDQovKioNCiAgRXhlY3V0ZXMgYW4gU01CVVMgcHJvY2VzcyBjYWxsIGNvbW1hbmQuDQoNCiAgRXhlY3V0ZXMgYW4gU01CVVMgcHJvY2VzcyBjYWxsIGNvbW1hbmQgb24gdGhlIFNNQlVTIGRldmljZSBzcGVjaWZpZWQgYnkgU21CdXNBZGRyZXNzLg0KICBUaGUgMTYtYml0IHZhbHVlIHNwZWNpZmllZCBieSBWYWx1ZSBpcyB3cml0dGVuLg0KICBPbmx5IHRoZSBTTUJVUyBzbGF2ZSBhZGRyZXNzIGFuZCBTTUJVUyBjb21tYW5kIGZpZWxkcyBvZiBTbUJ1c0FkZHJlc3MgYXJlIHJlcXVpcmVkLg0KICBUaGUgMTYtYml0IHZhbHVlIHJldHVybmVkIGJ5IHRoZSBwcm9jZXNzIGNhbGwgY29tbWFuZCBpcyByZXR1cm5lZC4NCiAgSWYgU3RhdHVzIGlzIG5vdCBOVUxMLCB0aGVuIHRoZSBzdGF0dXMgb2YgdGhlIGV4ZWN1dGVkIGNvbW1hbmQgaXMgcmV0dXJuZWQgaW4gU3RhdHVzLg0KICBJZiBMZW5ndGggaW4gU21CdXNBZGRyZXNzIGlzIG5vdCB6ZXJvLCB0aGVuIEFTU0VSVCgpLg0KICBJZiBhbnkgcmVzZXJ2ZWQgYml0cyBvZiBTbUJ1c0FkZHJlc3MgYXJlIHNldCwgdGhlbiBBU1NFUlQoKS4NCg0KICBAcGFyYW0gIFNtQnVzQWRkcmVzcyAgICBBZGRyZXNzIHRoYXQgZW5jb2RlcyB0aGUgU01CVVMgU2xhdmUgQWRkcmVzcywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgU01CVVMgQ29tbWFuZCwgU01CVVMgRGF0YSBMZW5ndGgsIGFuZCBQRUMuDQogIEBwYXJhbSAgVmFsdWUgICAgICAgICAgIFRoZSAxNi1iaXQgdmFsdWUgdG8gd3JpdGUuDQogIEBwYXJhbSAgU3RhdHVzICAgICAgICAgIFJldHVybiBzdGF0dXMgZm9yIHRoZSBleGVjdXRlZCBjb21tYW5kLg0KICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGlzIGFuIG9wdGlvbmFsIHBhcmFtZXRlciBhbmQgbWF5IGJlIE5VTEwuDQoNCiAgQHJldHVybiBUaGUgMTYtYml0IHZhbHVlIHJldHVybmVkIGJ5IHRoZSBwcm9jZXNzIGNhbGwgY29tbWFuZC4NCg0KKiovDQpVSU5UMTYNCkVGSUFQSQ0KU21CdXNQcm9jZXNzQ2FsbCAoDQogIElOICBVSU5UTiAgICAgICAgICBTbUJ1c0FkZHJlc3MsDQogIElOICBVSU5UMTYgICAgICAgICBWYWx1ZSwNCiAgT1VUIFJFVFVSTl9TVEFUVVMgICpTdGF0dXMgICAgICAgIE9QVElPTkFMDQogICkNCnsNCiAgQVNTRVJUIChTTUJVU19MSUJfTEVOR1RIIChTbUJ1c0FkZHJlc3MpICAgID09IDApOw0KICBBU1NFUlQgKFNNQlVTX0xJQl9SRVNFQVJWRUQgKFNtQnVzQWRkcmVzcykgPT0gMCk7DQoNCiAgSW50ZXJuYWxTbUJ1c0V4ZWMgKEVmaVNtYnVzUHJvY2Vzc0NhbGwsIFNtQnVzQWRkcmVzcywgMiwgJlZhbHVlLCBTdGF0dXMpOw0KICANCiAgcmV0dXJuIFZhbHVlOw0KfQ0KDQovKioNCiAgRXhlY3V0ZXMgYW4gU01CVVMgcmVhZCBibG9jayBjb21tYW5kLg0KDQogIEV4ZWN1dGVzIGFuIFNNQlVTIHJlYWQgYmxvY2sgY29tbWFuZCBvbiB0aGUgU01CVVMgZGV2aWNlIHNwZWNpZmllZCBieSBTbUJ1c0FkZHJlc3MuDQogIE9ubHkgdGhlIFNNQlVTIHNsYXZlIGFkZHJlc3MgYW5kIFNNQlVTIGNvbW1hbmQgZmllbGRzIG9mIFNtQnVzQWRkcmVzcyBhcmUgcmVxdWlyZWQuDQogIEJ5dGVzIGFyZSByZWFkIGZyb20gdGhlIFNNQlVTIGFuZCBzdG9yZWQgaW4gQnVmZmVyLg0KICBUaGUgbnVtYmVyIG9mIGJ5dGVzIHJlYWQgaXMgcmV0dXJuZWQsIGFuZCB3aWxsIG5ldmVyIHJldHVybiBhIHZhbHVlIGxhcmdlciB0aGFuIDMyLWJ5dGVzLg0KICBJZiBTdGF0dXMgaXMgbm90IE5VTEwsIHRoZW4gdGhlIHN0YXR1cyBvZiB0aGUgZXhlY3V0ZWQgY29tbWFuZCBpcyByZXR1cm5lZCBpbiBTdGF0dXMuDQogIEl0IGlzIHRoZSBjYWxsZXKhr3MgcmVzcG9uc2liaWxpdHkgdG8gbWFrZSBzdXJlIEJ1ZmZlciBpcyBsYXJnZSBlbm91Z2ggZm9yIHRoZSB0b3RhbCBudW1iZXIgb2YgYnl0ZXMgcmVhZC4NCiAgU01CVVMgc3VwcG9ydHMgYSBtYXhpbXVtIHRyYW5zZmVyIHNpemUgb2YgMzIgYnl0ZXMsIHNvIEJ1ZmZlciBkb2VzIG5vdCBuZWVkIHRvIGJlIGFueSBsYXJnZXIgdGhhbiAzMiBieXRlcy4NCiAgSWYgTGVuZ3RoIGluIFNtQnVzQWRkcmVzcyBpcyBub3QgemVybywgdGhlbiBBU1NFUlQoKS4NCiAgSWYgQnVmZmVyIGlzIE5VTEwsIHRoZW4gQVNTRVJUKCkuDQogIElmIGFueSByZXNlcnZlZCBiaXRzIG9mIFNtQnVzQWRkcmVzcyBhcmUgc2V0LCB0aGVuIEFTU0VSVCgpLg0KDQogIEBwYXJhbSAgU21CdXNBZGRyZXNzICAgIEFkZHJlc3MgdGhhdCBlbmNvZGVzIHRoZSBTTUJVUyBTbGF2ZSBBZGRyZXNzLA0KICAgICAgICAgICAgICAgICAgICAgICAgICBTTUJVUyBDb21tYW5kLCBTTUJVUyBEYXRhIExlbmd0aCwgYW5kIFBFQy4NCiAgQHBhcmFtICBCdWZmZXIgICAgICAgICAgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHN0b3JlIHRoZSBieXRlcyByZWFkIGZyb20gdGhlIFNNQlVTLg0KICBAcGFyYW0gIFN0YXR1cyAgICAgICAgICBSZXR1cm4gc3RhdHVzIGZvciB0aGUgZXhlY3V0ZWQgY29tbWFuZC4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBpcyBhbiBvcHRpb25hbCBwYXJhbWV0ZXIgYW5kIG1heSBiZSBOVUxMLg0KDQogIEByZXR1cm4gVGhlIG51bWJlciBvZiBieXRlcyByZWFkLg0KDQoqKi8NClVJTlRODQpFRklBUEkNClNtQnVzUmVhZEJsb2NrICgNCiAgSU4gIFVJTlROICAgICAgICAgIFNtQnVzQWRkcmVzcywNCiAgT1VUIFZPSUQgICAgICAgICAgICpCdWZmZXIsDQogIE9VVCBSRVRVUk5fU1RBVFVTICAqU3RhdHVzICAgICAgICBPUFRJT05BTA0KICApDQp7DQogIEFTU0VSVCAoQnVmZmVyICE9IE5VTEwpOw0KICBBU1NFUlQgKFNNQlVTX0xJQl9MRU5HVEggKFNtQnVzQWRkcmVzcykgICAgPT0gMCk7DQogIEFTU0VSVCAoU01CVVNfTElCX1JFU0VBUlZFRCAoU21CdXNBZGRyZXNzKSA9PSAwKTsNCg0KICByZXR1cm4gSW50ZXJuYWxTbUJ1c0V4ZWMgKEVmaVNtYnVzUmVhZEJsb2NrLCBTbUJ1c0FkZHJlc3MsIDB4MjAsIEJ1ZmZlciwgU3RhdHVzKTsNCn0NCg0KLyoqDQogIEV4ZWN1dGVzIGFuIFNNQlVTIHdyaXRlIGJsb2NrIGNvbW1hbmQuDQoNCiAgRXhlY3V0ZXMgYW4gU01CVVMgd3JpdGUgYmxvY2sgY29tbWFuZCBvbiB0aGUgU01CVVMgZGV2aWNlIHNwZWNpZmllZCBieSBTbUJ1c0FkZHJlc3MuDQogIFRoZSBTTUJVUyBzbGF2ZSBhZGRyZXNzLCBTTUJVUyBjb21tYW5kLCBhbmQgU01CVVMgbGVuZ3RoIGZpZWxkcyBvZiBTbUJ1c0FkZHJlc3MgYXJlIHJlcXVpcmVkLg0KICBCeXRlcyBhcmUgd3JpdHRlbiB0byB0aGUgU01CVVMgZnJvbSBCdWZmZXIuDQogIFRoZSBudW1iZXIgb2YgYnl0ZXMgd3JpdHRlbiBpcyByZXR1cm5lZCwgYW5kIHdpbGwgbmV2ZXIgcmV0dXJuIGEgdmFsdWUgbGFyZ2VyIHRoYW4gMzItYnl0ZXMuDQogIElmIFN0YXR1cyBpcyBub3QgTlVMTCwgdGhlbiB0aGUgc3RhdHVzIG9mIHRoZSBleGVjdXRlZCBjb21tYW5kIGlzIHJldHVybmVkIGluIFN0YXR1cy4gIA0KICBJZiBMZW5ndGggaW4gU21CdXNBZGRyZXNzIGlzIHplcm8gb3IgZ3JlYXRlciB0aGFuIDMyLCB0aGVuIEFTU0VSVCgpLg0KICBJZiBCdWZmZXIgaXMgTlVMTCwgdGhlbiBBU1NFUlQoKS4NCiAgSWYgYW55IHJlc2VydmVkIGJpdHMgb2YgU21CdXNBZGRyZXNzIGFyZSBzZXQsIHRoZW4gQVNTRVJUKCkuDQoNCiAgQHBhcmFtICBTbUJ1c0FkZHJlc3MgICAgQWRkcmVzcyB0aGF0IGVuY29kZXMgdGhlIFNNQlVTIFNsYXZlIEFkZHJlc3MsDQogICAgICAgICAgICAgICAgICAgICAgICAgIFNNQlVTIENvbW1hbmQsIFNNQlVTIERhdGEgTGVuZ3RoLCBhbmQgUEVDLg0KICBAcGFyYW0gIEJ1ZmZlciAgICAgICAgICBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gc3RvcmUgdGhlIGJ5dGVzIHJlYWQgZnJvbSB0aGUgU01CVVMuDQogIEBwYXJhbSAgU3RhdHVzICAgICAgICAgIFJldHVybiBzdGF0dXMgZm9yIHRoZSBleGVjdXRlZCBjb21tYW5kLg0KICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGlzIGFuIG9wdGlvbmFsIHBhcmFtZXRlciBhbmQgbWF5IGJlIE5VTEwuDQoNCiAgQHJldHVybiBUaGUgbnVtYmVyIG9mIGJ5dGVzIHdyaXR0ZW4uDQoNCioqLw0KVUlOVE4NCkVGSUFQSQ0KU21CdXNXcml0ZUJsb2NrICgNCiAgSU4gIFVJTlROICAgICAgICAgIFNtQnVzQWRkcmVzcywNCiAgT1VUIFZPSUQgICAgICAgICAgICpCdWZmZXIsDQogIE9VVCBSRVRVUk5fU1RBVFVTICAqU3RhdHVzICAgICAgICBPUFRJT05BTA0KICApDQp7DQogIFVJTlROICBMZW5ndGg7DQoNCiAgQVNTRVJUIChCdWZmZXIgIT0gTlVMTCk7DQogIEFTU0VSVCAoU01CVVNfTElCX1JFU0VBUlZFRCAoU21CdXNBZGRyZXNzKSA9PSAwKTsNCg0KICBMZW5ndGggPSBTTUJVU19MSUJfTEVOR1RIIChTbUJ1c0FkZHJlc3MpICsgMTsNCiAgcmV0dXJuIEludGVybmFsU21CdXNFeGVjIChFZmlTbWJ1c1dyaXRlQmxvY2ssIFNtQnVzQWRkcmVzcywgTGVuZ3RoLCBCdWZmZXIsIFN0YXR1cyk7DQp9DQoNCi8qKg0KICBFeGVjdXRlcyBhbiBTTUJVUyBibG9jayBwcm9jZXNzIGNhbGwgY29tbWFuZC4NCg0KICBFeGVjdXRlcyBhbiBTTUJVUyBibG9jayBwcm9jZXNzIGNhbGwgY29tbWFuZCBvbiB0aGUgU01CVVMgZGV2aWNlIHNwZWNpZmllZCBieSBTbUJ1c0FkZHJlc3MuDQogIFRoZSBTTUJVUyBzbGF2ZSBhZGRyZXNzLCBTTUJVUyBjb21tYW5kLCBhbmQgU01CVVMgbGVuZ3RoIGZpZWxkcyBvZiBTbUJ1c0FkZHJlc3MgYXJlIHJlcXVpcmVkLg0KICBCeXRlcyBhcmUgd3JpdHRlbiB0byB0aGUgU01CVVMgZnJvbSBPdXRCdWZmZXIuICBCeXRlcyBhcmUgdGhlbiByZWFkIGZyb20gdGhlIFNNQlVTIGludG8gSW5CdWZmZXIuDQogIElmIFN0YXR1cyBpcyBub3QgTlVMTCwgdGhlbiB0aGUgc3RhdHVzIG9mIHRoZSBleGVjdXRlZCBjb21tYW5kIGlzIHJldHVybmVkIGluIFN0YXR1cy4NCiAgSXQgaXMgdGhlIGNhbGxlcqGvcyByZXNwb25zaWJpbGl0eSB0byBtYWtlIHN1cmUgSW5CdWZmZXIgaXMgbGFyZ2UgZW5vdWdoIGZvciB0aGUgdG90YWwgbnVtYmVyIG9mIGJ5dGVzIHJlYWQuDQogIFNNQlVTIHN1cHBvcnRzIGEgbWF4aW11bSB0cmFuc2ZlciBzaXplIG9mIDMyIGJ5dGVzLCBzbyBCdWZmZXIgZG9lcyBub3QgbmVlZCB0byBiZSBhbnkgbGFyZ2VyIHRoYW4gMzIgYnl0ZXMuDQogIElmIE91dEJ1ZmZlciBpcyBOVUxMLCB0aGVuIEFTU0VSVCgpLg0KICBJZiBJbkJ1ZmZlciBpcyBOVUxMLCB0aGVuIEFTU0VSVCgpLg0KICBJZiBhbnkgcmVzZXJ2ZWQgYml0cyBvZiBTbUJ1c0FkZHJlc3MgYXJlIHNldCwgdGhlbiBBU1NFUlQoKS4NCg0KDQogIEBwYXJhbSAgU21CdXNBZGRyZXNzICAgIEFkZHJlc3MgdGhhdCBlbmNvZGVzIHRoZSBTTUJVUyBTbGF2ZSBBZGRyZXNzLA0KICAgICAgICAgICAgICAgICAgICAgICAgICBTTUJVUyBDb21tYW5kLCBTTUJVUyBEYXRhIExlbmd0aCwgYW5kIFBFQy4NCiAgQHBhcmFtICBPdXRCdWZmZXIgICAgICAgUG9pbnRlciB0byB0aGUgYnVmZmVyIG9mIGJ5dGVzIHRvIHdyaXRlIHRvIHRoZSBTTUJVUy4NCiAgQHBhcmFtICBJbkJ1ZmZlciAgICAgICAgUG9pbnRlciB0byB0aGUgYnVmZmVyIG9mIGJ5dGVzIHRvIHJlYWQgZnJvbSB0aGUgU01CVVMuDQogIEBwYXJhbSAgU3RhdHVzICAgICAgICAgIFJldHVybiBzdGF0dXMgZm9yIHRoZSBleGVjdXRlZCBjb21tYW5kLg0KICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGlzIGFuIG9wdGlvbmFsIHBhcmFtZXRlciBhbmQgbWF5IGJlIE5VTEwuDQoNCiAgQHJldHVybiBUaGUgbnVtYmVyIG9mIGJ5dGVzIHdyaXR0ZW4uDQoNCioqLw0KVUlOVE4NCkVGSUFQSQ0KU21CdXNCbG9ja1Byb2Nlc3NDYWxsICgNCiAgSU4gIFVJTlROICAgICAgICAgIFNtQnVzQWRkcmVzcywNCiAgSU4gIFZPSUQgICAgICAgICAgICpPdXRCdWZmZXIsDQogIE9VVCBWT0lEICAgICAgICAgICAqSW5CdWZmZXIsDQogIE9VVCBSRVRVUk5fU1RBVFVTICAqU3RhdHVzICAgICAgICBPUFRJT05BTA0KICApDQp7DQogIFVJTlROICAgTGVuZ3RoOw0KDQogIEFTU0VSVCAoSW5CdWZmZXIgICE9IE5VTEwpOw0KICBBU1NFUlQgKE91dEJ1ZmZlciAhPSBOVUxMKTsNCiAgQVNTRVJUIChTTUJVU19MSUJfUkVTRUFSVkVEIChTbUJ1c0FkZHJlc3MpID09IDApOw0KDQogIExlbmd0aCAgID0gU01CVVNfTElCX0xFTkdUSCAoU21CdXNBZGRyZXNzKSArIDE7DQogIC8vDQogIC8vIEFzc3VtaW5nIHRoYXQgSW5CdWZmZXIgaXMgbGFyZ2UgZW5vdWdoIHRvIHNhdmUgYW5vdGhlciBtZW1vcnkgY29weS4NCiAgLy8NCiAgSW5CdWZmZXIgPSBDb3B5TWVtIChJbkJ1ZmZlciwgT3V0QnVmZmVyLCBMZW5ndGgpOw0KICByZXR1cm4gSW50ZXJuYWxTbUJ1c0V4ZWMgKEVmaVNtYnVzQldCUlByb2Nlc3NDYWxsLCBTbUJ1c0FkZHJlc3MsIExlbmd0aCwgSW5CdWZmZXIsIFN0YXR1cyk7DQp9DQo=