LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCiAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCiAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQqgKg0KICogQ29udHJpYnV0b3JzOg0KICogICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCg0KLyogYnVnIDgyNTIwIDogbmVlZCB0byBpbmNsdWRlIHN0ZGxpYi5oICovDQojIGluY2x1ZGUgPHN0ZGxpYi5oPg0KIyBpbmNsdWRlIDxzeXMvdHlwZXMuaD4NCiMgaW5jbHVkZSA8c3lzL3N0YXRmcy5oPg0KIyBpbmNsdWRlIDx1cGRhdGUuaD4NCg0KLyoNCiAqIENsYXNzOiAgICAgb3JnX2VjbGlwc2VfdXBkYXRlX2NvbmZpZ3VyYXRpb25fTG9jYWxTeXN0ZW1JbmZvDQogKiBNZXRob2Q6ICAgIG5hdGl2ZUdldEZyZWVTcGFjZQ0KICogU2lnbmF0dXJlOiAoTGphdmEvaW8vRmlsZTspSg0KICovDQpKTklFWFBPUlQgamxvbmcgSk5JQ0FMTCBKYXZhX29yZ19lY2xpcHNlX3VwZGF0ZV9jb25maWd1cmF0aW9uX0xvY2FsU3lzdGVtSW5mb19uYXRpdmVHZXRGcmVlU3BhY2UoDQoJSk5JRW52ICogam5pZW52LA0KCWpjbGFzcyBqYXZhQ2xhc3MsDQoJam9iamVjdCBmaWxlKSB7DQoNCgkvLyB0byByZXRyaXZlIHRoZSBTdHJpbmcNCglqY2xhc3MgY2xzOw0KCWptZXRob2RJRCBpZDsNCglqb2JqZWN0IG9iajsNCg0KCS8vIGphdmEuaW8uRmlsZS5nZXRBYnNvbHV0ZVBhdGgoKQ0KCWNvbnN0IGNoYXIgKiBscERpcmVjdG9yeU5hbWU7DQoNCgkvLyBMaW51eCBQYXJhbWV0ZXJzDQoJc3RydWN0IHN0YXRmcyBidWZmZXI7DQoNCgkvLyB0aGUgcmVzdWx0DQoJamxvbmcgcmVzdWx0ID0gb3JnX2VjbGlwc2VfdXBkYXRlX2NvbmZpZ3VyYXRpb25fTG9jYWxTeXN0ZW1JbmZvX1NJWkVfVU5LTk9XTjsNCg0KCWNscyA9ICgqam5pZW52KSAtPiBHZXRPYmplY3RDbGFzcyhqbmllbnYsIGZpbGUpOw0KCWlkID0gKCpqbmllbnYpIC0+IEdldE1ldGhvZElEKGpuaWVudiwgY2xzLCAiZ2V0QWJzb2x1dGVQYXRoIiwgIigpTGphdmEvbGFuZy9TdHJpbmc7Iik7DQoJb2JqID0gKCpqbmllbnYpIC0+IENhbGxPYmplY3RNZXRob2Qoam5pZW52LCBmaWxlLCBpZCk7DQoJbHBEaXJlY3RvcnlOYW1lID0gKCpqbmllbnYpIC0+IEdldFN0cmluZ1VURkNoYXJzKGpuaWVudiwgKGpzdHJpbmcpIG9iaiwgMCk7DQoNCgkvLyBjYXN0IG9uZSBhcmd1bWVudCBhcyBqbG9uZyB0byBoYXZlIGEgamxvbmcgcmVzdWx0DQoJaW50IGVyciA9IHN0YXRmcyhscERpcmVjdG9yeU5hbWUsJmJ1ZmZlcik7DQoJaWYgKGVycj09MCl7DQoJCWxvbmcgc2l6ZSA9IGJ1ZmZlci5mX2JzaXplOw0KCQlqbG9uZyBmcmVlID0gYnVmZmVyLmZfYmZyZWU7DQoJCXJlc3VsdCA9IHNpemUqZnJlZTsNCgl9DQoNCglyZXR1cm4gcmVzdWx0Ow0KfQ0KDQovKg0KICogQ2xhc3M6ICAgICBvcmdfZWNsaXBzZV91cGRhdGVfY29uZmlndXJhdGlvbl9Mb2NhbFN5c3RlbUluZm8NCiAqIE1ldGhvZDogICAgbmF0aXZlR2V0TGFiZWwNCiAqIFNpZ25hdHVyZTogKExqYXZhL2lvL0ZpbGU7KUxqYXZhL2xhbmcvU3RyaW5nOw0KICovDQpKTklFWFBPUlQganN0cmluZyBKTklDQUxMIEphdmFfb3JnX2VjbGlwc2VfdXBkYXRlX2NvbmZpZ3VyYXRpb25fTG9jYWxTeXN0ZW1JbmZvX25hdGl2ZUdldExhYmVsKA0KCUpOSUVudiAqIGpuaWVudiwNCglqY2xhc3MgamF2YUNsYXNzLA0KCWpvYmplY3QgZmlsZSkgew0KDQoJLy8gdG8gcmV0cml2ZSB0aGUgU3RyaW5nDQoJamNsYXNzIGNsczsNCglqbWV0aG9kSUQgaWQ7DQoJam9iamVjdCBvYmo7DQoNCgkvLyBqYXZhLmlvLkZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkNCgljb25zdCBjaGFyICogbHBEaXJlY3RvcnlOYW1lOw0KDQoJLy8gb2J0YWluIHRoZSBTdHJpbmcgZnJvbSB0aGUgcGFyYW1ldGVyDQoJY2xzID0gKCpqbmllbnYpIC0+IEdldE9iamVjdENsYXNzKGpuaWVudiwgZmlsZSk7DQoJaWQgPSAoKmpuaWVudikgLT4gR2V0TWV0aG9kSUQoam5pZW52LCBjbHMsICJnZXRBYnNvbHV0ZVBhdGgiLCAiKClMamF2YS9sYW5nL1N0cmluZzsiKTsNCglvYmogPSAoKmpuaWVudikgLT4gQ2FsbE9iamVjdE1ldGhvZChqbmllbnYsIGZpbGUsIGlkKTsNCglscERpcmVjdG9yeU5hbWUgPSAoKmpuaWVudikgLT4gR2V0U3RyaW5nVVRGQ2hhcnMoam5pZW52LCAoanN0cmluZykgb2JqLCAwKTsNCg0KCWpzdHJpbmcgcmVzdWx0ID0gTlVMTDsNCg0KCS8vIExpbnV4IGltcGxlbWVudGF0aW9uIGZvbGxvd2luZw0KDQoJcmV0dXJuIHJlc3VsdDsNCn0NCg0KLyoNCiAqIENsYXNzOiAgICAgb3JnX2VjbGlwc2VfdXBkYXRlX2NvbmZpZ3VyYXRpb25fTG9jYWxTeXN0ZW1JbmZvDQogKiBNZXRob2Q6ICAgIG5hdGl2ZUdldFR5cGUNCiAqIFNpZ25hdHVyZTogKExqYXZhL2lvL0ZpbGU7KUkNCiAqLw0KSk5JRVhQT1JUIGppbnQgSk5JQ0FMTCBKYXZhX29yZ19lY2xpcHNlX3VwZGF0ZV9jb25maWd1cmF0aW9uX0xvY2FsU3lzdGVtSW5mb19uYXRpdmVHZXRUeXBlKA0KCUpOSUVudiAqIGpuaWVudiwNCglqY2xhc3MgamF2YUNsYXNzLA0KCWpvYmplY3QgZmlsZSkgew0KDQoJLy8gdG8gcmV0cml2ZSB0aGUgU3RyaW5nDQoJamNsYXNzIGNsczsNCglqbWV0aG9kSUQgaWQ7DQoJam9iamVjdCBvYmo7DQoNCgkvLyBqYXZhLmlvLkZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkNCgljb25zdCBjaGFyICogbHBEaXJlY3RvcnlOYW1lOw0KDQoJLy8gb2J0YWluIHRoZSBTdHJpbmcgZnJvbSB0aGUgcGFyYW1ldGVyDQoJY2xzID0gKCpqbmllbnYpIC0+IEdldE9iamVjdENsYXNzKGpuaWVudiwgZmlsZSk7DQoJaWQgPSAoKmpuaWVudikgLT4gR2V0TWV0aG9kSUQoam5pZW52LCBjbHMsICJnZXRBYnNvbHV0ZVBhdGgiLCAiKClMamF2YS9sYW5nL1N0cmluZzsiKTsNCglvYmogPSAoKmpuaWVudikgLT4gQ2FsbE9iamVjdE1ldGhvZChqbmllbnYsIGZpbGUsIGlkKTsNCglscERpcmVjdG9yeU5hbWUgPSAoKmpuaWVudikgLT4gR2V0U3RyaW5nVVRGQ2hhcnMoam5pZW52LCAoanN0cmluZykgb2JqLCAwKTsNCg0KCWludCByZXN1bHQ7DQoJDQoJLy8gTGludXggaW1wbGVtYW50YXRpb24NCg0KCXJlc3VsdCA9IG9yZ19lY2xpcHNlX3VwZGF0ZV9jb25maWd1cmF0aW9uX0xvY2FsU3lzdGVtSW5mb19WT0xVTUVfSU5WQUxJRF9QQVRIOw0KCXJldHVybiByZXN1bHQ7DQp9DQoNCi8qDQogKiBDbGFzczogICAgIG9yZ19lY2xpcHNlX3VwZGF0ZV9jb25maWd1cmF0aW9uX0xvY2FsU3lzdGVtSW5mbw0KICogTWV0aG9kOiAgICBuYXRpdmVMaXN0TW91bnRQb2ludHMNCiAqIFNpZ25hdHVyZTogKClbTGphdmEvbGFuZy9TdHJpbmc7DQogKi8NCkpOSUVYUE9SVCBqb2JqZWN0QXJyYXkgSk5JQ0FMTCBKYXZhX29yZ19lY2xpcHNlX3VwZGF0ZV9jb25maWd1cmF0aW9uX0xvY2FsU3lzdGVtSW5mb19uYXRpdmVMaXN0TW91bnRQb2ludHMoDQoJSk5JRW52ICogam5pZW52LA0KCWpjbGFzcyBqYXZhQ2xhc3MpIHsNCg0KCS8vDQoJaW50IGRyaXZlOw0KCWNoYXIgZHJpdmVOYW1lWzEwMF07DQoJam9iamVjdEFycmF5IHJldHVybkFycmF5Ow0KCWludCBuRHJpdmUgPSAwOw0KDQoJLy8gDQoJamNsYXNzIHN0cmluZ0NsYXNzOw0KCWpvYmplY3QgZW1wdHk7DQoJaW50IGluZGV4ID0gMDsNCglqb2JqZWN0IHN0cjsNCg0KCS8vIExpbnV4IGltcGxlbWVudGF0aW9uDQoJLy8gZmluZCBtb3VudCBwb2ludHMNCg0KCWRyaXZlID0gMDsNCglzdHJpbmdDbGFzcyA9ICgqam5pZW52KSAtPiBGaW5kQ2xhc3Moam5pZW52LCAiamF2YS9sYW5nL1N0cmluZyIpOw0KCWVtcHR5ID0gKCpqbmllbnYpIC0+IE5ld1N0cmluZ1VURihqbmllbnYsICIiKTsNCgkvL3JldHVybkFycmF5ID0gKCpqbmllbnYpIC0+IE5ld09iamVjdEFycmF5KGpuaWVudiwgbkRyaXZlLCBzdHJpbmdDbGFzcywgZW1wdHkpOw0KDQoJLy8gZm9yIG5vdyByZXR1cm4gbnVsbCBhcyBtZXRob2QgaXMgbm90IGltcGxlbWVudGVkDQoJcmV0dXJuQXJyYXkgPSBOVUxMOw0KDQoJaW50IGk7DQoJZm9yIChpID0gMDsgaSA8IGRyaXZlOyBpKyspIHsNCgkJLy8gTGludXggaW1wbGVtZW50YXRpb24sIGNyZWF0ZSBTdHJpbmcgZm9yIGVhY2ggbW91bnQgcG9pbnQNCg0KCQlzdHIgPSAoKmpuaWVudikgLT4gTmV3U3RyaW5nVVRGKGpuaWVudiwgZHJpdmVOYW1lKTsNCgkJKCpqbmllbnYpIC0+IFNldE9iamVjdEFycmF5RWxlbWVudChqbmllbnYsIHJldHVybkFycmF5LCBpbmRleCwgc3RyKTsNCg0KCQlpbmRleCsrOw0KCX0NCg0KCXJldHVybiByZXR1cm5BcnJheTsNCn0NCg==