LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQoqIENvcHlyaWdodCAoQykgMjAxNiBieSBTYXZvaXItZmFpcmUgTGludXggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCiogQXV0aG9yOiBK5GdlciBOaWNvbGFzIDxuaWNvbGFzLmphZ2VyQHNhdm9pcmZhaXJlbGludXguY29tPiAgICAgICAgICAgICAgKg0KKiBBdXRob3I6IFRyYWN6eWsgQW5kcmVhcyA8dHJhY3p5ay5hbmRyZWFzQHNhdm9pcmZhaXJlbGludXguY29tPiAgICAgICAgICAqDQoqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCiogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICAgKg0KKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgICAqDQoqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAgICoNCiogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQoqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAgICoNCiogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICAgKg0KKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgICAqDQoqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgICAqDQoqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LiAgICoNCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KDQp1c2luZyBuYW1lc3BhY2UgY29uY3VycmVuY3k7DQoNCm5hbWVzcGFjZSBSaW5nQ2xpZW50VVdQDQp7DQoNCi8qIGRlbGVnYXRlICovDQpkZWxlZ2F0ZSB2b2lkIEluY29taW5nQ2FsbChTdHJpbmdeIGFjY291bnRJZCwgU3RyaW5nXiBjYWxsSWQsIFN0cmluZ14gZnJvbSk7DQpkZWxlZ2F0ZSB2b2lkIFN0YXRlQ2hhbmdlKFN0cmluZ14gY2FsbElkLCBDYWxsU3RhdHVzIHN0YXRlLCBpbnQgY29kZSk7DQpkZWxlZ2F0ZSB2b2lkIEluY29taW5nQWNjb3VudE1lc3NhZ2UoU3RyaW5nXiBhY2NvdW50SWQsIFN0cmluZ14gZnJvbSwgU3RyaW5nXiBwYXlsb2FkKTsNCmRlbGVnYXRlIHZvaWQgQ2FsbGluZyhDYWxsXiBjYWxsKTsNCg0KDQpwdWJsaWMgcmVmIGNsYXNzIFJpbmdEIHNlYWxlZA0Kew0KcHVibGljOg0KICAgIC8qIGZ1bmN0aW9ucyAqLw0KDQogICAgLyogcHJvcGVydGllcyAqLw0KICAgIHN0YXRpYyBwcm9wZXJ0eSBSaW5nRF4gaW5zdGFuY2UNCiAgICB7DQogICAgICAgIFJpbmdEXiBnZXQoKQ0KICAgICAgICB7DQogICAgICAgICAgICBzdGF0aWMgUmluZ0ReIGluc3RhbmNlXyA9IHJlZiBuZXcgUmluZ0QoKTsNCiAgICAgICAgICAgIHJldHVybiBpbnN0YW5jZV87DQogICAgICAgIH0NCiAgICB9DQoNCiAgICBwcm9wZXJ0eSBib29sIGRhZW1vblJ1bm5pbmcNCiAgICB7DQogICAgICAgIGJvb2wgZ2V0KCkNCiAgICAgICAgew0KICAgICAgICAgICAgcmV0dXJuIGRhZW1vblJ1bm5pbmdfOw0KICAgICAgICB9DQogICAgfQ0KDQppbnRlcm5hbDoNCiAgICAvKiBmdW5jdGlvbnMgKi8NCiAgICB2b2lkIHN0YXJ0RGFlbW9uKCk7DQogICAgdm9pZCByZWxvYWRBY2NvdW50TGlzdCgpOw0KICAgIHZvaWQgc2VuZEFjY291bnRUZXh0TWVzc2FnZShTdHJpbmdeIG1lc3NhZ2UpOw0KICAgIHZvaWQgY3JlYXRlUklOR0FjY291bnQoU3RyaW5nXiBhbGlhcyk7DQogICAgdm9pZCBjcmVhdGVTSVBBY2NvdW50KFN0cmluZ14gYWxpYXMpOw0KICAgIHZvaWQgcmVmdXNlSW5jb21taW5nQ2FsbChDYWxsXiBjYWxsKTsNCiAgICB2b2lkIGFjY2VwdEluY29tbWluZ0NhbGwoQ2FsbF4gY2FsbCk7DQogICAgdm9pZCBwbGFjZUNhbGwoQ29udGFjdF4gY29udGFjdCk7DQogICAgdm9pZCBjYW5jZWxPdXRHb2luZ0NhbGwoQ2FsbF4gY2FsbCk7DQogICAgdm9pZCBoYW5nVXBDYWxsKENhbGxeIGNhbGwpOw0KDQogICAgLyogVE9ETyA6IG1vdmUgbWVtYmVycyAqLw0KICAgIGJvb2wgaGFzQ29uZmlnOw0KICAgIHN0ZDo6c3RyaW5nIGFjY291bnROYW1lOw0KDQogICAgLyogZXZlbnRzICovDQogICAgZXZlbnQgSW5jb21pbmdDYWxsXiBpbmNvbWluZ0NhbGw7DQogICAgZXZlbnQgU3RhdGVDaGFuZ2VeIHN0YXRlQ2hhbmdlOw0KICAgIGV2ZW50IEluY29taW5nQWNjb3VudE1lc3NhZ2VeIGluY29taW5nQWNjb3VudE1lc3NhZ2U7DQogICAgZXZlbnQgQ2FsbGluZ14gY2FsbGluZzsNCg0KcHJpdmF0ZToNCiAgICAvKiBzdWIgY2xhc3NlcyAqLw0KICAgIGVudW0gY2xhc3MgUmVxdWVzdCB7DQogICAgICAgIE5vbmUsDQogICAgICAgIEFkZFJpbmdBY2NvdW50LA0KICAgICAgICBBZGRTSVBBY2NvdW50LA0KICAgICAgICBSZWZ1c2VJbmNvbW1pbmdDYWxsLA0KICAgICAgICBBY2NlcHRJbmNvbW1pbmdDYWxsLA0KICAgICAgICBDYW5jZWxPdXRHb2luZ0NhbGwsDQogICAgICAgIEhhbmdVcENhbGwNCiAgICB9Ow0KICAgIHJlZiBjbGFzcyBUYXNrDQogICAgew0KICAgIGludGVybmFsOg0KICAgICAgICBUYXNrKFJlcXVlc3Qgcikgew0KICAgICAgICAgICAgcmVxdWVzdCA9IHI7DQogICAgICAgIH0NCiAgICAgICAgVGFzayhSZXF1ZXN0IHIsIENhbGxeIGMpIHsNCiAgICAgICAgICAgIHJlcXVlc3QgPSByOw0KICAgICAgICAgICAgX2NhbGwgPSBjOw0KICAgICAgICB9DQogICAgcHVibGljOg0KICAgICAgICBwcm9wZXJ0eSBSZXF1ZXN0IHJlcXVlc3Q7DQogICAgICAgIHByb3BlcnR5IENhbGxeIF9jYWxsOw0KICAgIH07DQoNCiAgICAvKiBmdW5jdGlvbnMgKi8NCiAgICBSaW5nRCgpOyAvLyBzaW5nbGV0b24NCiAgICB2b2lkIGRlcXVldWVUYXNrcygpOw0KICAgIENhbGxTdGF0dXMgZ2V0Q2FsbFN0YXR1cyhTdHJpbmdeIHN0YXRlKTsNCg0KICAgIC8qIG1lbWJlcnMgKi8NCiAgICBzdGQ6OnN0cmluZyBsb2NhbEZvbGRlcl87DQogICAgYm9vbCBkYWVtb25SdW5uaW5nXyA9IGZhbHNlOw0KICAgIHN0ZDo6cXVldWU8VGFza14+IHRhc2tzTGlzdF87DQp9Ow0KfQ==