LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAogKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAqgKiAKICogQ29udHJpYnV0b3JzOgogKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpwYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbDsKCmltcG9ydCBqYXZhLnV0aWwuKjsKaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwppbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLm1vZGVsLklNb2R1bGVGaWxlOwppbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLm1vZGVsLklNb2R1bGVGb2xkZXI7CmltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUubW9kZWwuSU1vZHVsZVJlc291cmNlOwovKioKICogUHVibGlzaCBpbmZvcm1hdGlvbiBmb3IgYSBzcGVjaWZpYyBtb2R1bGUgb24gYSBzcGVjaWZpYyBzZXJ2ZXIuCiAqLwpwdWJsaWMgY2xhc3MgTW9kdWxlUHVibGlzaEluZm8gewoJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1PRFVMRV9JRCA9ICJtb2R1bGUtaWRzIjsKCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FID0gIm5hbWUiOwoJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBBVEggPSAicGF0aCI7Cglwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RBTVAgPSAic3RhbXAiOwoJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZJTEUgPSAiZmlsZSI7Cglwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRk9MREVSID0gImZvbGRlciI7CgoJcHJpdmF0ZSBTdHJpbmcgbW9kdWxlSWQ7Cglwcml2YXRlIFN0cmluZyBuYW1lOwoJcHJpdmF0ZSBJTW9kdWxlUmVzb3VyY2VbXSByZXNvdXJjZXMgPSBuZXcgSU1vZHVsZVJlc291cmNlWzBdOwoKCS8qKgoJICogTW9kdWxlUHVibGlzaEluZm8gY29uc3RydWN0b3IuCgkgKiAKCSAqIEBwYXJhbSBtb2R1bGVJZCBhIG1vZHVsZSBpZAoJICogQHBhcmFtIG5hbWUgdGhlIG1vZHVsZSdzIG5hbWUKCSAqLwoJcHVibGljIE1vZHVsZVB1Ymxpc2hJbmZvKFN0cmluZyBtb2R1bGVJZCwgU3RyaW5nIG5hbWUpIHsKCQlzdXBlcigpOwoKCQl0aGlzLm1vZHVsZUlkID0gbW9kdWxlSWQ7CgkJdGhpcy5uYW1lID0gbmFtZTsKCX0KCgkvKioKCSAqIE1vZHVsZVB1Ymxpc2hJbmZvIGNvbnN0cnVjdG9yLgoJICogCgkgKiBAcGFyYW0gbWVtZW50byBhIG1lbWVudG8KCSAqLwoJcHVibGljIE1vZHVsZVB1Ymxpc2hJbmZvKElNZW1lbnRvIG1lbWVudG8pIHsKCQlzdXBlcigpOwoJCQoJCWxvYWQobWVtZW50byk7Cgl9CgoJcHVibGljIFN0cmluZyBnZXRNb2R1bGVJZCgpIHsKCQlyZXR1cm4gbW9kdWxlSWQ7Cgl9CgoJcHVibGljIFN0cmluZyBnZXROYW1lKCkgewoJCXJldHVybiBuYW1lOwoJfQoKCXB1YmxpYyBJTW9kdWxlUmVzb3VyY2VbXSBnZXRSZXNvdXJjZXMoKSB7CgkJcmV0dXJuIHJlc291cmNlczsKCX0KCglwdWJsaWMgdm9pZCBzZXRSZXNvdXJjZXMoSU1vZHVsZVJlc291cmNlW10gcmVzKSB7CgkJcmVzb3VyY2VzID0gcmVzOwoJfQoKCS8qKgoJICogCgkgKi8KCXByb3RlY3RlZCB2b2lkIGxvYWQoSU1lbWVudG8gbWVtZW50bykgewoJCVRyYWNlLnRyYWNlKFRyYWNlLkZJTkVTVCwgIkxvYWRpbmcgbW9kdWxlIHB1Ymxpc2ggaW5mbyBmb3I6ICIgKyBtZW1lbnRvKTsKCQoJCXRyeSB7CgkJCW1vZHVsZUlkID0gbWVtZW50by5nZXRTdHJpbmcoTU9EVUxFX0lEKTsKCQkJbmFtZSA9IG1lbWVudG8uZ2V0U3RyaW5nKE5BTUUpOwoJCgkJCXJlc291cmNlcyA9IGxvYWRSZXNvdXJjZShtZW1lbnRvKTsKCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewoJCQlUcmFjZS50cmFjZShUcmFjZS5XQVJOSU5HLCAiQ291bGQgbm90IGxvYWQgbW9kdWxlIHB1Ymxpc2ggaW5mbyBpbmZvcm1hdGlvbjogIiArIGUuZ2V0TWVzc2FnZSgpKTsKCQl9Cgl9CgoJcHJvdGVjdGVkIElNb2R1bGVSZXNvdXJjZVtdIGxvYWRSZXNvdXJjZShJTWVtZW50byBtZW1lbnRvKSB7CgkJaWYgKG1lbWVudG8gPT0gbnVsbCkKCQkJcmV0dXJuIG5ldyBJTW9kdWxlUmVzb3VyY2VbMF07CgkJCgkJTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCg1KTsKCQkKCQkvLyBsb2FkIGZpbGVzCgkJSU1lbWVudG9bXSBjaGlsZHJlbiA9IG1lbWVudG8uZ2V0Q2hpbGRyZW4oRklMRSk7CgkJaWYgKGNoaWxkcmVuICE9IG51bGwpIHsKCQkJaW50IHNpemUgPSBjaGlsZHJlbi5sZW5ndGg7CgkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CgkJCQlTdHJpbmcgbmFtZTIgPSBjaGlsZHJlbltpXS5nZXRTdHJpbmcoTkFNRSk7CgkJCQlJUGF0aCBwYXRoID0gbmV3IFBhdGgoY2hpbGRyZW5baV0uZ2V0U3RyaW5nKFBBVEgpKTsKCQkJCWxvbmcgc3RhbXAgPSBMb25nLnBhcnNlTG9uZyhjaGlsZHJlbltpXS5nZXRTdHJpbmcoU1RBTVApKTsKCQkJCU1vZHVsZUZpbGUgZmlsZSA9IG5ldyBNb2R1bGVGaWxlKG5hbWUyLCBwYXRoLCBzdGFtcCk7CgkJCQlsaXN0LmFkZChmaWxlKTsKCQkJfQoJCX0KCQkKCQkvLyBsb2FkIGZvbGRlcnMKCQljaGlsZHJlbiA9IG1lbWVudG8uZ2V0Q2hpbGRyZW4oRk9MREVSKTsKCQlpZiAoY2hpbGRyZW4gIT0gbnVsbCkgewoJCQlpbnQgc2l6ZSA9IGNoaWxkcmVuLmxlbmd0aDsKCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKCQkJCVN0cmluZyBuYW1lMiA9IGNoaWxkcmVuW2ldLmdldFN0cmluZyhOQU1FKTsKCQkJCUlQYXRoIHBhdGggPSBuZXcgUGF0aChjaGlsZHJlbltpXS5nZXRTdHJpbmcoUEFUSCkpOwoJCQkJTW9kdWxlRm9sZGVyIGZvbGRlciA9IG5ldyBNb2R1bGVGb2xkZXIobnVsbCwgbmFtZTIsIHBhdGgpOwoJCQkJZm9sZGVyLnNldE1lbWJlcnMobG9hZFJlc291cmNlKGNoaWxkcmVuW2ldKSk7CgkJCQlsaXN0LmFkZChmb2xkZXIpOwoJCQl9CgkJfQoJCQoJCUlNb2R1bGVSZXNvdXJjZVtdIHJlc291cmNlczIgPSBuZXcgSU1vZHVsZVJlc291cmNlW2xpc3Quc2l6ZSgpXTsKCQlsaXN0LnRvQXJyYXkocmVzb3VyY2VzMik7CgkJcmV0dXJuIHJlc291cmNlczI7Cgl9CgoJLyoqCgkgKiAKCSAqLwoJcHJvdGVjdGVkIHZvaWQgc2F2ZShJTWVtZW50byBtZW1lbnRvKSB7CgkJdHJ5IHsKCQkJbWVtZW50by5wdXRTdHJpbmcoTU9EVUxFX0lELCBtb2R1bGVJZCk7CgkJCWlmIChuYW1lICE9IG51bGwpCgkJCQltZW1lbnRvLnB1dFN0cmluZyhOQU1FLCBuYW1lKTsKCQkJCgkJCXNhdmVSZXNvdXJjZShtZW1lbnRvLCByZXNvdXJjZXMpOwoJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CgkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkNvdWxkIG5vdCBzYXZlIG1vZHVsZSBwdWJsaXNoIGluZm8iLCBlKTsKCQl9Cgl9CgoJcHJvdGVjdGVkIHZvaWQgc2F2ZVJlc291cmNlKElNZW1lbnRvIG1lbWVudG8sIElNb2R1bGVSZXNvdXJjZVtdIHJlc291cmNlczIpIHsKCQlpZiAocmVzb3VyY2VzMiA9PSBudWxsKQoJCQlyZXR1cm47CgkJaW50IHNpemUgPSByZXNvdXJjZXMyLmxlbmd0aDsKCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewoJCQlpZiAocmVzb3VyY2VzMltpXSBpbnN0YW5jZW9mIElNb2R1bGVGaWxlKSB7CgkJCQlJTW9kdWxlRmlsZSBmaWxlID0gKElNb2R1bGVGaWxlKSByZXNvdXJjZXMyW2ldOwoJCQkJSU1lbWVudG8gY2hpbGQgPSBtZW1lbnRvLmNyZWF0ZUNoaWxkKEZJTEUpOwoJCQkJY2hpbGQucHV0U3RyaW5nKE5BTUUsIGZpbGUuZ2V0TmFtZSgpKTsKCQkJCWNoaWxkLnB1dFN0cmluZyhQQVRILCBmaWxlLmdldE1vZHVsZVJlbGF0aXZlUGF0aCgpLnRvUG9ydGFibGVTdHJpbmcoKSk7CgkJCQljaGlsZC5wdXRTdHJpbmcoU1RBTVAsICIiICsgZmlsZS5nZXRNb2RpZmljYXRpb25TdGFtcCgpKTsKCQkJfSBlbHNlIHsKCQkJCUlNb2R1bGVGb2xkZXIgZm9sZGVyID0gKElNb2R1bGVGb2xkZXIpIHJlc291cmNlczJbaV07CgkJCQlJTWVtZW50byBjaGlsZCA9IG1lbWVudG8uY3JlYXRlQ2hpbGQoRk9MREVSKTsKCQkJCWNoaWxkLnB1dFN0cmluZyhOQU1FLCBmb2xkZXIuZ2V0TmFtZSgpKTsKCQkJCWNoaWxkLnB1dFN0cmluZyhQQVRILCBmb2xkZXIuZ2V0TW9kdWxlUmVsYXRpdmVQYXRoKCkudG9Qb3J0YWJsZVN0cmluZygpKTsKCQkJCUlNb2R1bGVSZXNvdXJjZVtdIHJlc291cmNlczMgPSBmb2xkZXIubWVtYmVycygpOwoJCQkJc2F2ZVJlc291cmNlKGNoaWxkLCByZXNvdXJjZXMzKTsKCQkJfQoJCX0KCX0KCglwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewoJCXJldHVybiAiTW9kdWxlUHVibGlzaEluZm8gWyIgKyBtb2R1bGVJZCArICJdIjsKCX0KfQ==