LyoqIEBmaWxlDQogIEltcGxlbWVudGF0aW9uIG9mIEdVSUQgZnVuY3Rpb25zLg0KDQogIENvcHlyaWdodCAoYykgMjAwNiwgSW50ZWwgQ29ycG9yYXRpb248QlI+DQogIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCiAgYXJlIGxpY2Vuc2VkIGFuZCBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEJTRCBMaWNlbnNlDQogIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLiAgVGhlIGZ1bGwgdGV4dCBvZiB0aGUgbGljZW5zZSBtYXkgYmUgZm91bmQgYXQNCiAgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2JzZC1saWNlbnNlLnBocA0KDQogIFRIRSBQUk9HUkFNIElTIERJU1RSSUJVVEVEIFVOREVSIFRIRSBCU0QgTElDRU5TRSBPTiBBTiAiQVMgSVMiIEJBU0lTLA0KICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgUkVQUkVTRU5UQVRJT05TIE9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTUyBPUiBJTVBMSUVELg0KDQogIE1vZHVsZSBOYW1lOiAgTWVtTGliR3VpZC5jDQoNCiAgVGhlIGZvbGxvd2luZyBCYXNlTWVtb3J5TGliIGluc3RhbmNlcyBzaGFyZSB0aGUgc2FtZSB2ZXJzaW9uIG9mIHRoaXMgZmlsZToNCg0KICAgIEJhc2VNZW1vcnlMaWINCiAgICBCYXNlTWVtb3J5TGliTW14DQogICAgQmFzZU1lbW9yeUxpYlNzZTINCiAgICBCYXNlTWVtb3J5TGliUmVwU3RyDQogICAgUGVpTWVtb3J5TGliDQogICAgVWVmaU1lbW9yeUxpYg0KDQoqKi8NCg0KLyoqDQogIENvcGllcyBhIHNvdXJjZSBHVUlEIHRvIGEgZGVzdGluYXRpb24gR1VJRC4NCg0KICBUaGlzIGZ1bmN0aW9uIGNvcGllcyB0aGUgY29udGVudHMgb2YgdGhlIDEyOC1iaXQgR1VJRCBzcGVjaWZpZWQgYnkgU291cmNlR3VpZCB0bw0KICBEZXN0aW5hdGlvbkd1aWQsIGFuZCByZXR1cm5zIERlc3RpbmF0aW9uR3VpZC4NCiAgSWYgRGVzdGluYXRpb25HdWlkIGlzIE5VTEwsIHRoZW4gQVNTRVJUKCkuDQogIElmIFNvdXJjZUd1aWQgaXMgTlVMTCwgdGhlbiBBU1NFUlQoKS4NCg0KICBAcGFyYW0gIERlc3RpbmF0aW9uR3VpZCAgIFBvaW50ZXIgdG8gdGhlIGRlc3RpbmF0aW9uIEdVSUQuDQogIEBwYXJhbSAgU291cmNlR3VpZCAgICAgICAgUG9pbnRlciB0byB0aGUgc291cmNlIEdVSUQuDQoNCiAgQHJldHVybiBEZXN0aW5hdGlvbkd1aWQuDQoNCioqLw0KR1VJRCAqDQpFRklBUEkNCkNvcHlHdWlkICgNCiAgT1VUIEdVSUQgICAgICAgKkRlc3RpbmF0aW9uR3VpZCwNCiAgSU4gQ09OU1QgR1VJRCAgKlNvdXJjZUd1aWQNCiAgKQ0Kew0KICBXcml0ZVVuYWxpZ25lZDY0ICgNCiAgICAoVUlOVDY0KilEZXN0aW5hdGlvbkd1aWQsDQogICAgUmVhZFVuYWxpZ25lZDY0ICgoQ09OU1QgVUlOVDY0KilTb3VyY2VHdWlkKQ0KICAgICk7DQogIFdyaXRlVW5hbGlnbmVkNjQgKA0KICAgIChVSU5UNjQqKURlc3RpbmF0aW9uR3VpZCArIDEsDQogICAgUmVhZFVuYWxpZ25lZDY0ICgoQ09OU1QgVUlOVDY0KilTb3VyY2VHdWlkICsgMSkNCiAgICApOw0KICByZXR1cm4gRGVzdGluYXRpb25HdWlkOw0KfQ0KDQovKioNCiAgQ29tcGFyZXMgdHdvIEdVSURzLg0KDQogIFRoaXMgZnVuY3Rpb24gY29tcGFyZXMgR3VpZDEgdG8gR3VpZDIuICBJZiB0aGUgR1VJRHMgYXJlIGlkZW50aWNhbCB0aGVuIFRSVUUgaXMgcmV0dXJuZWQuDQogIElmIHRoZXJlIGFyZSBhbnkgYml0IGRpZmZlcmVuY2VzIGluIHRoZSB0d28gR1VJRHMsIHRoZW4gRkFMU0UgaXMgcmV0dXJuZWQuDQogIElmIEd1aWQxIGlzIE5VTEwsIHRoZW4gQVNTRVJUKCkuDQogIElmIEd1aWQyIGlzIE5VTEwsIHRoZW4gQVNTRVJUKCkuDQoNCiAgQHBhcmFtICBHdWlkMSAgICAgICBBIHBvaW50ZXIgdG8gYSAxMjggYml0IEdVSUQuDQogIEBwYXJhbSAgR3VpZDIgICAgICAgQSBwb2ludGVyIHRvIGEgMTI4IGJpdCBHVUlELg0KDQogIEByZXR2YWwgVFJVRSAgICAgICAgR3VpZDEgYW5kIEd1aWQyIGFyZSBpZGVudGljYWwuDQogIEByZXR2YWwgRkFMU0UgICAgICAgR3VpZDEgYW5kIEd1aWQyIGFyZSBub3QgaWRlbnRpY2FsLg0KDQoqKi8NCkJPT0xFQU4NCkVGSUFQSQ0KQ29tcGFyZUd1aWQgKA0KICBJTiBDT05TVCBHVUlEICAqR3VpZDEsDQogIElOIENPTlNUIEdVSUQgICpHdWlkMg0KICApDQp7DQogIHJldHVybiAoQk9PTEVBTikoDQogICAgICAgICAgIFJlYWRVbmFsaWduZWQ2NCAoKENPTlNUIFVJTlQ2NCopR3VpZDEpDQogICAgICAgICAgICAgPT0gUmVhZFVuYWxpZ25lZDY0ICgoQ09OU1QgVUlOVDY0KilHdWlkMikgJiYNCiAgICAgICAgICAgUmVhZFVuYWxpZ25lZDY0ICgoQ09OU1QgVUlOVDY0KilHdWlkMSArIDEpDQogICAgICAgICAgICAgPT0gUmVhZFVuYWxpZ25lZDY0ICgoQ09OU1QgVUlOVDY0KilHdWlkMiArIDEpDQogICAgICAgICAgICk7DQp9DQoNCi8qKg0KICBTY2FucyBhIHRhcmdldCBidWZmZXIgZm9yIGEgR1VJRCwgYW5kIHJldHVybnMgYSBwb2ludGVyIHRvIHRoZSBtYXRjaGluZyBHVUlEDQogIGluIHRoZSB0YXJnZXQgYnVmZmVyLg0KDQogIFRoaXMgZnVuY3Rpb24gc2VhcmNoZXMgdGFyZ2V0IHRoZSBidWZmZXIgc3BlY2lmaWVkIGJ5IEJ1ZmZlciBhbmQgTGVuZ3RoIGZyb20NCiAgdGhlIGxvd2VzdCBhZGRyZXNzIHRvIHRoZSBoaWdoZXN0IGFkZHJlc3MgYXQgMTI4LWJpdCBpbmNyZW1lbnRzIGZvciB0aGUgMTI4LWJpdA0KICBHVUlEIHZhbHVlIHRoYXQgbWF0Y2hlcyBHdWlkLiAgSWYgYSBtYXRjaCBpcyBmb3VuZCwgdGhlbiBhIHBvaW50ZXIgdG8gdGhlIG1hdGNoaW5nDQogIEdVSUQgaW4gdGhlIHRhcmdldCBidWZmZXIgaXMgcmV0dXJuZWQuICBJZiBubyBtYXRjaCBpcyBmb3VuZCwgdGhlbiBOVUxMIGlzIHJldHVybmVkLg0KICBJZiBMZW5ndGggaXMgMCwgdGhlbiBOVUxMIGlzIHJldHVybmVkLg0KICBJZiBMZW5ndGggPiAwIGFuZCBCdWZmZXIgaXMgTlVMTCwgdGhlbiBBU1NFUlQoKS4NCiAgSWYgQnVmZmVyIGlzIG5vdCBhbGlnbmVkIG9uIGEgNjQtYml0IGJvdW5kYXJ5LCB0aGVuIEFTU0VSVCgpLg0KICBJZiBMZW5ndGggaXMgZ3JlYXRlciB0aGFuIChNQVhfQUREUkVTUyCWIEJ1ZmZlciArIDEpLCB0aGVuIEFTU0VSVCgpLiANCg0KICBAcGFyYW0gIEJ1ZmZlciAgUG9pbnRlciB0byB0aGUgdGFyZ2V0IGJ1ZmZlciB0byBzY2FuLg0KICBAcGFyYW0gIExlbmd0aCAgTnVtYmVyIG9mIGJ5dGVzIGluIEJ1ZmZlciB0byBzY2FuLg0KICBAcGFyYW0gIEd1aWQgICAgVmFsdWUgdG8gc2VhcmNoIGZvciBpbiB0aGUgdGFyZ2V0IGJ1ZmZlci4NCg0KICBAcmV0dXJuIEEgcG9pbnRlciB0byB0aGUgbWF0Y2hpbmcgR3VpZCBpbiB0aGUgdGFyZ2V0IGJ1ZmZlciBvciBOVUxMIG90aGVyd2lzZS4NCg0KKiovDQpWT0lEICoNCkVGSUFQSQ0KU2Nhbkd1aWQgKA0KICBJTiBDT05TVCBWT0lEICAqQnVmZmVyLA0KICBJTiBVSU5UTiAgICAgICBMZW5ndGgsDQogIElOIENPTlNUIEdVSUQgICpHdWlkDQogICkNCnsNCiAgQ09OU1QgR1VJRCAgICAgICAgICAgICAgICAgICAgICAgICpHdWlkUHRyOw0KDQogIEFTU0VSVCAoQnVmZmVyICE9IE5VTEwpOw0KICAvLw0KICAvLyBNYWtlIHN1cmUgQnVmZmVyIGlzIGFsaWduZWQgb24gYSA2NC1iaXQgYm91bmRhcnkuDQogIC8vDQogIEFTU0VSVCAoKChVSU5UTikgQnVmZmVyICYgNykgPT0gMCk7DQoNCiAgQVNTRVJUIChMZW5ndGggPD0gKE1BWF9BRERSRVNTIC0gKFVJTlROKUJ1ZmZlciArIDEpKTsNCg0KICBHdWlkUHRyID0gKEdVSUQqKUJ1ZmZlcjsNCiAgQnVmZmVyID0gR3VpZFB0ciArIExlbmd0aCAvIHNpemVvZiAoKkd1aWRQdHIpOw0KICB3aGlsZSAoR3VpZFB0ciA8IChDT05TVCBHVUlEKilCdWZmZXIpIHsNCiAgICBpZiAoQ29tcGFyZUd1aWQgKEd1aWRQdHIsIEd1aWQpKSB7DQogICAgICByZXR1cm4gKFZPSUQqKUd1aWRQdHI7DQogICAgfQ0KICAgIEd1aWRQdHIrKzsNCiAgfQ0KICByZXR1cm4gTlVMTDsNCn0NCg==