LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQ29weXJpZ2h0IChjKSAyMDAyIElCTSBDb3JwLiBhbmQgb3RoZXJzLgpBbGwgcmlnaHRzIHJlc2VydmVkLiCgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUKd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKoApDb250cmlidXRvcnM6CiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUudXRpbDsKCmltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuZW52Lio7CgppbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUudXRpbC5DbGFzc0Zvcm1hdEV4Y2VwdGlvbjsKaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLnV0aWwuSUF0dHJpYnV0ZU5hbWVzQ29uc3RhbnRzOwppbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUudXRpbC5JQ2xhc3NGaWxlQXR0cmlidXRlOwppbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUudXRpbC5JQ29kZUF0dHJpYnV0ZTsKaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLnV0aWwuSUNvbnN0YW50UG9vbDsKaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLnV0aWwuSUNvbnN0YW50UG9vbENvbnN0YW50OwppbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUudXRpbC5JQ29uc3RhbnRQb29sRW50cnk7CmltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS51dGlsLklFeGNlcHRpb25BdHRyaWJ1dGU7CmltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS51dGlsLklNZXRob2RJbmZvOwppbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC4qOwppbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmNvZGVnZW4uKjsKaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci51dGlsLio7CgovKioKICogRGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiBJTWV0aG9kSW5mby4KICovCnB1YmxpYyBjbGFzcyBNZXRob2RJbmZvIGV4dGVuZHMgQ2xhc3NGaWxlU3RydWN0IGltcGxlbWVudHMgSU1ldGhvZEluZm8gewoJcHJpdmF0ZSBib29sZWFuIGlzRGVwcmVjYXRlZDsKCXByaXZhdGUgYm9vbGVhbiBpc1N5bnRoZXRpYzsKCXByaXZhdGUgaW50IGFjY2Vzc0ZsYWdzOwoJcHJpdmF0ZSBjaGFyW10gbmFtZTsKCXByaXZhdGUgY2hhcltdIGRlc2NyaXB0b3I7Cglwcml2YXRlIGludCBuYW1lSW5kZXg7Cglwcml2YXRlIGludCBkZXNjcmlwdG9ySW5kZXg7Cglwcml2YXRlIGludCBhdHRyaWJ1dGVzQ291bnQ7Cglwcml2YXRlIGludCBhdHRyaWJ1dGVCeXRlczsKCXByaXZhdGUgSUNvZGVBdHRyaWJ1dGUgY29kZUF0dHJpYnV0ZTsKCXByaXZhdGUgSUV4Y2VwdGlvbkF0dHJpYnV0ZSBleGNlcHRpb25BdHRyaWJ1dGU7Cglwcml2YXRlIElDbGFzc0ZpbGVBdHRyaWJ1dGVbXSBhdHRyaWJ1dGVzOwoJCgkvKioKCSAqIEBwYXJhbSBjbGFzc0ZpbGVCeXRlcyBieXRlW10KCSAqIEBwYXJhbSBvZmZzZXRzIGludFtdCgkgKiBAcGFyYW0gb2Zmc2V0IGludAoJICovCglwdWJsaWMgTWV0aG9kSW5mbyhieXRlIGNsYXNzRmlsZUJ5dGVzW10sIElDb25zdGFudFBvb2wgY29uc3RhbnRQb29sLCBpbnQgb2Zmc2V0KQoJCXRocm93cyBDbGFzc0Zvcm1hdEV4Y2VwdGlvbiB7CgkJYWNjZXNzRmxhZ3MgPSB1MkF0KGNsYXNzRmlsZUJ5dGVzLCAwLCBvZmZzZXQpOwoJCQoJCXRoaXMubmFtZUluZGV4ID0gdTJBdChjbGFzc0ZpbGVCeXRlcywgMiwgb2Zmc2V0KTsKCQlJQ29uc3RhbnRQb29sRW50cnkgY29uc3RhbnRQb29sRW50cnkgPSBjb25zdGFudFBvb2wuZGVjb2RlRW50cnkodGhpcy5uYW1lSW5kZXgpOwoJCWlmIChjb25zdGFudFBvb2xFbnRyeS5nZXRLaW5kKCkgIT0gSUNvbnN0YW50UG9vbENvbnN0YW50LkNPTlNUQU5UX1V0ZjgpIHsKCQkJdGhyb3cgbmV3IENsYXNzRm9ybWF0RXhjZXB0aW9uKENsYXNzRm9ybWF0RXhjZXB0aW9uLklOVkFMSURfQ09OU1RBTlRfUE9PTF9FTlRSWSk7CgkJfQoJCXRoaXMubmFtZSA9IGNvbnN0YW50UG9vbEVudHJ5LmdldFV0ZjhWYWx1ZSgpOwoJCQoJCXRoaXMuZGVzY3JpcHRvckluZGV4ID0gdTJBdChjbGFzc0ZpbGVCeXRlcywgNCwgb2Zmc2V0KTsKCQljb25zdGFudFBvb2xFbnRyeSA9IGNvbnN0YW50UG9vbC5kZWNvZGVFbnRyeSh0aGlzLmRlc2NyaXB0b3JJbmRleCk7CgkJaWYgKGNvbnN0YW50UG9vbEVudHJ5LmdldEtpbmQoKSAhPSBJQ29uc3RhbnRQb29sQ29uc3RhbnQuQ09OU1RBTlRfVXRmOCkgewoJCQl0aHJvdyBuZXcgQ2xhc3NGb3JtYXRFeGNlcHRpb24oQ2xhc3NGb3JtYXRFeGNlcHRpb24uSU5WQUxJRF9DT05TVEFOVF9QT09MX0VOVFJZKTsKCQl9CgkJdGhpcy5kZXNjcmlwdG9yID0gY29uc3RhbnRQb29sRW50cnkuZ2V0VXRmOFZhbHVlKCk7CgkJCgkJdGhpcy5hdHRyaWJ1dGVzQ291bnQgPSB1MkF0KGNsYXNzRmlsZUJ5dGVzLCA2LCBvZmZzZXQpOwoJCXRoaXMuYXR0cmlidXRlcyA9IENsYXNzRmlsZUF0dHJpYnV0ZS5OT19BVFRSSUJVVEVTOwoJCWlmICh0aGlzLmF0dHJpYnV0ZXNDb3VudCAhPSAwKSB7CgkJCXRoaXMuYXR0cmlidXRlcyA9IG5ldyBJQ2xhc3NGaWxlQXR0cmlidXRlW3RoaXMuYXR0cmlidXRlc0NvdW50XTsKCQl9CgkJaW50IGF0dHJpYnV0ZXNJbmRleCA9IDA7CgkJaW50IHJlYWRPZmZzZXQgPSA4OwoJCWZvciAoaW50IGkgPSAwOyBpIDwgdGhpcy5hdHRyaWJ1dGVzQ291bnQ7IGkrKykgewoJCQljb25zdGFudFBvb2xFbnRyeSA9IGNvbnN0YW50UG9vbC5kZWNvZGVFbnRyeSh1MkF0KGNsYXNzRmlsZUJ5dGVzLCByZWFkT2Zmc2V0LCBvZmZzZXQpKTsKCQkJaWYgKGNvbnN0YW50UG9vbEVudHJ5LmdldEtpbmQoKSAhPSBJQ29uc3RhbnRQb29sQ29uc3RhbnQuQ09OU1RBTlRfVXRmOCkgewoJCQkJdGhyb3cgbmV3IENsYXNzRm9ybWF0RXhjZXB0aW9uKENsYXNzRm9ybWF0RXhjZXB0aW9uLklOVkFMSURfQ09OU1RBTlRfUE9PTF9FTlRSWSk7CgkJCX0KCQkJY2hhcltdIGF0dHJpYnV0ZU5hbWUgPSBjb25zdGFudFBvb2xFbnRyeS5nZXRVdGY4VmFsdWUoKTsKCQkJaWYgKGVxdWFscyhhdHRyaWJ1dGVOYW1lLCBJQXR0cmlidXRlTmFtZXNDb25zdGFudHMuREVQUkVDQVRFRCkpIHsKCQkJCXRoaXMuaXNEZXByZWNhdGVkID0gdHJ1ZTsKCQkJCXRoaXMuYXR0cmlidXRlc1thdHRyaWJ1dGVzSW5kZXgrK10gPSBuZXcgQ2xhc3NGaWxlQXR0cmlidXRlKGNsYXNzRmlsZUJ5dGVzLCBjb25zdGFudFBvb2wsIG9mZnNldCArIHJlYWRPZmZzZXQpOwoJCQl9IGVsc2UgaWYgKGVxdWFscyhhdHRyaWJ1dGVOYW1lLCBJQXR0cmlidXRlTmFtZXNDb25zdGFudHMuU1lOVEhFVElDKSkgewoJCQkJdGhpcy5pc1N5bnRoZXRpYyA9IHRydWU7CgkJCQl0aGlzLmF0dHJpYnV0ZXNbYXR0cmlidXRlc0luZGV4KytdID0gbmV3IENsYXNzRmlsZUF0dHJpYnV0ZShjbGFzc0ZpbGVCeXRlcywgY29uc3RhbnRQb29sLCBvZmZzZXQgKyByZWFkT2Zmc2V0KTsKCQkJfSBlbHNlIGlmIChlcXVhbHMoYXR0cmlidXRlTmFtZSwgSUF0dHJpYnV0ZU5hbWVzQ29uc3RhbnRzLkNPREUpKSB7CgkJCQl0aGlzLmNvZGVBdHRyaWJ1dGUgPSBuZXcgQ29kZUF0dHJpYnV0ZShjbGFzc0ZpbGVCeXRlcywgY29uc3RhbnRQb29sLCBvZmZzZXQgKyByZWFkT2Zmc2V0KTsKCQkJCXRoaXMuYXR0cmlidXRlc1thdHRyaWJ1dGVzSW5kZXgrK10gPSB0aGlzLmNvZGVBdHRyaWJ1dGU7CgkJCX0gZWxzZSBpZiAoZXF1YWxzKGF0dHJpYnV0ZU5hbWUsIElBdHRyaWJ1dGVOYW1lc0NvbnN0YW50cy5FWENFUFRJT05TKSkgewoJCQkJdGhpcy5leGNlcHRpb25BdHRyaWJ1dGUgPSBuZXcgRXhjZXB0aW9uQXR0cmlidXRlKGNsYXNzRmlsZUJ5dGVzLCBjb25zdGFudFBvb2wsIG9mZnNldCArIHJlYWRPZmZzZXQpOwoJCQkJdGhpcy5hdHRyaWJ1dGVzW2F0dHJpYnV0ZXNJbmRleCsrXSA9IHRoaXMuZXhjZXB0aW9uQXR0cmlidXRlOwoJCQl9IGVsc2UgewoJCQkJdGhpcy5hdHRyaWJ1dGVzW2F0dHJpYnV0ZXNJbmRleCsrXSA9IG5ldyBDbGFzc0ZpbGVBdHRyaWJ1dGUoY2xhc3NGaWxlQnl0ZXMsIGNvbnN0YW50UG9vbCwgb2Zmc2V0ICsgcmVhZE9mZnNldCk7CgkJCX0KCQkJcmVhZE9mZnNldCArPSAoNiArIHU0QXQoY2xhc3NGaWxlQnl0ZXMsIHJlYWRPZmZzZXQgKyAyLCBvZmZzZXQpKTsKCQl9CgkJYXR0cmlidXRlQnl0ZXMgPSByZWFkT2Zmc2V0OwoJfQoJLyoqCgkgKiBAc2VlIElNZXRob2RJbmZvI2dldEFjY2Vzc0ZsYWdzKCkKCSAqLwoJcHVibGljIGludCBnZXRBY2Nlc3NGbGFncygpIHsKCQlyZXR1cm4gdGhpcy5hY2Nlc3NGbGFnczsKCX0KCgkvKioKCSAqIEBzZWUgSU1ldGhvZEluZm8jZ2V0Q29kZUF0dHJpYnV0ZSgpCgkgKi8KCXB1YmxpYyBJQ29kZUF0dHJpYnV0ZSBnZXRDb2RlQXR0cmlidXRlKCkgewoJCXJldHVybiB0aGlzLmNvZGVBdHRyaWJ1dGU7Cgl9CgoJLyoqCgkgKiBAc2VlIElNZXRob2RJbmZvI2dldERlc2NyaXB0b3IoKQoJICovCglwdWJsaWMgY2hhcltdIGdldERlc2NyaXB0b3IoKSB7CgkJcmV0dXJuIHRoaXMuZGVzY3JpcHRvcjsKCX0KCgkvKioKCSAqIEBzZWUgSU1ldGhvZEluZm8jZ2V0TmFtZSgpCgkgKi8KCXB1YmxpYyBjaGFyW10gZ2V0TmFtZSgpIHsKCQlyZXR1cm4gdGhpcy5uYW1lOwoJfQoKCS8qKgoJICogQHNlZSBJTWV0aG9kSW5mbyNpc0NsaW5pdCgpCgkgKi8KCXB1YmxpYyBib29sZWFuIGlzQ2xpbml0KCkgewoJCXJldHVybiBuYW1lWzBdID09ICc8JyAmJiBuYW1lLmxlbmd0aCA9PSA4OyAvLyBDYW4gb25seSBtYXRjaCA8Y2xpbml0PgoJfQoKCS8qKgoJICogQHNlZSBJTWV0aG9kSW5mbyNpc0NvbnN0cnVjdG9yKCkKCSAqLwoJcHVibGljIGJvb2xlYW4gaXNDb25zdHJ1Y3RvcigpIHsKCQlyZXR1cm4gbmFtZVswXSA9PSAnPCcgJiYgbmFtZS5sZW5ndGggPT0gNjsgLy8gQ2FuIG9ubHkgbWF0Y2ggPGluaXQ+Cgl9CgoJLyoqCgkgKiBAc2VlIElNZXRob2RJbmZvI2lzRGVwcmVjYXRlZCgpCgkgKi8KCXB1YmxpYyBib29sZWFuIGlzRGVwcmVjYXRlZCgpIHsKCQlyZXR1cm4gdGhpcy5pc0RlcHJlY2F0ZWQ7Cgl9CgoJLyoqCgkgKiBAc2VlIElNZXRob2RJbmZvI2lzU3ludGhldGljKCkKCSAqLwoJcHVibGljIGJvb2xlYW4gaXNTeW50aGV0aWMoKSB7CgkJcmV0dXJuIHRoaXMuaXNTeW50aGV0aWM7Cgl9CgoJLyoqCgkgKiBAc2VlIElNZXRob2RJbmZvI2dldEV4Y2VwdGlvbkF0dHJpYnV0ZSgpCgkgKi8KCXB1YmxpYyBJRXhjZXB0aW9uQXR0cmlidXRlIGdldEV4Y2VwdGlvbkF0dHJpYnV0ZSgpIHsKCQlyZXR1cm4gdGhpcy5leGNlcHRpb25BdHRyaWJ1dGU7Cgl9CgoJLyoqCgkgKiBAc2VlIElNZXRob2RJbmZvI2dldEF0dHJpYnV0ZUNvdW50KCkKCSAqLwoJcHVibGljIGludCBnZXRBdHRyaWJ1dGVDb3VudCgpIHsKCQlyZXR1cm4gdGhpcy5hdHRyaWJ1dGVzQ291bnQ7Cgl9CgoJLyoqCgkgKiBAc2VlIElNZXRob2RJbmZvI2dldERlc2NyaXB0b3JJbmRleCgpCgkgKi8KCXB1YmxpYyBpbnQgZ2V0RGVzY3JpcHRvckluZGV4KCkgewoJCXJldHVybiB0aGlzLmRlc2NyaXB0b3JJbmRleDsKCX0KCgkvKioKCSAqIEBzZWUgSU1ldGhvZEluZm8jZ2V0TmFtZUluZGV4KCkKCSAqLwoJcHVibGljIGludCBnZXROYW1lSW5kZXgoKSB7CgkJcmV0dXJuIHRoaXMubmFtZUluZGV4OwoJfQoKCWludCBzaXplSW5CeXRlcygpIHsKCQlyZXR1cm4gYXR0cmlidXRlQnl0ZXM7Cgl9CgkvKioKCSAqIEBzZWUgSU1ldGhvZEluZm8jZ2V0QXR0cmlidXRlcygpCgkgKi8KCXB1YmxpYyBJQ2xhc3NGaWxlQXR0cmlidXRlW10gZ2V0QXR0cmlidXRlcygpIHsKCQlyZXR1cm4gdGhpcy5hdHRyaWJ1dGVzOwoJfQoKfQ==