LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogQ29weXJpZ2h0IChjKSAyMDA0IEV0ZXJhdGlvbiBCaWxpc2ltIEEuUy4KICogQWxsIHJpZ2h0cyByZXNlcnZlZC4goCBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CiAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCiAqIAogKiBDb250cmlidXRvcnM6CiAqICAgICBOYWNpIE0uIERhaSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgogKiAgICAgCiAqIAogKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECiAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCiAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCiAqIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBFVEVSQVRJT04gQS5TLiBPUgogKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCiAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgogKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECiAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAogKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCiAqIFNVQ0ggREFNQUdFLgogKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogKgogKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQogKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEV0ZXJhdGlvbiBCaWxpc2ltIEEuUy4gIEZvciBtb3JlCiAqIGluZm9ybWF0aW9uIG9uIGV0ZXJhdGlvbiwgcGxlYXNlIHNlZQogKiA8aHR0cDovL3d3dy5ldGVyYXRpb24uY29tLz4uCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmludGVybmFsLnhtbDsKCnB1YmxpYyBjbGFzcyBTZXJ2ZXJUeXBlRGVmaW5pdGlvblByb3BlcnR5IHsKCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRZUEVfU1RSSU5HID0gMDsKCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRZUEVfRklMRSA9IDE7CglwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUWVBFX0RJUkVDVE9SWSA9IDI7CglwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUWVBFX0JPT0xFQU4gPSAzOwoKCXByaXZhdGUgU3RyaW5nIGlkOwoJcHJpdmF0ZSBTdHJpbmcgbGFiZWw7Cglwcml2YXRlIGludCB0eXBlOwoJcHJpdmF0ZSBTdHJpbmcgZGVmYXVsdFZhbHVlOwoKCS8qKgoJICogQHJldHVybiBTdHJpbmcKCSAqLwoJcHVibGljIFN0cmluZyBnZXREZWZhdWx0VmFsdWUoKSB7CgkJcmV0dXJuIGRlZmF1bHRWYWx1ZTsKCX0KCgkvKioKCSAqIEByZXR1cm4gU3RyaW5nCgkgKi8KCXB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7CgkJcmV0dXJuIGlkOwoJfQoKCS8qKgoJICogQHJldHVybiBTdHJpbmcKCSAqLwoJcHVibGljIFN0cmluZyBnZXRMYWJlbCgpIHsKCQlyZXR1cm4gbGFiZWw7Cgl9CgoJLyoqCgkgKiBAcmV0dXJuIGludAoJICovCglwdWJsaWMgaW50IGdldFR5cGUoKSB7CgkJcmV0dXJuIHR5cGU7Cgl9CgoJLyoqCgkgKiBTZXRzIHRoZSBkZWZhdWx0VmFsdWUuCgkgKiBAcGFyYW0gZGVmYXVsdFZhbHVlIFRoZSBkZWZhdWx0VmFsdWUgdG8gc2V0CgkgKi8KCXB1YmxpYyB2b2lkIHNldERlZmF1bHRWYWx1ZShTdHJpbmcgZGVmYXVsdFZhbHVlKSB7CgkJdGhpcy5kZWZhdWx0VmFsdWUgPSBkZWZhdWx0VmFsdWU7Cgl9CgoJLyoqCgkgKiBTZXRzIHRoZSBpZC4KCSAqIEBwYXJhbSBpZCBUaGUgaWQgdG8gc2V0CgkgKi8KCXB1YmxpYyB2b2lkIHNldElkKFN0cmluZyBpZCkgewoJCXRoaXMuaWQgPSBpZDsKCX0KCgkvKioKCSAqIFNldHMgdGhlIGxhYmVsLgoJICogQHBhcmFtIGxhYmVsIFRoZSBsYWJlbCB0byBzZXQKCSAqLwoJcHVibGljIHZvaWQgc2V0TGFiZWwoU3RyaW5nIGxhYmVsKSB7CgkJdGhpcy5sYWJlbCA9IGxhYmVsOwoJfQoKCS8qKgoJICogU2V0cyB0aGUgdHlwZS4KCSAqIEBwYXJhbSB0eXBlIFRoZSB0eXBlIHRvIHNldAoJICovCglwdWJsaWMgdm9pZCBzZXRUeXBlKGludCB0eXBlKSB7CgkJdGhpcy50eXBlID0gdHlwZTsKCX0KCXB1YmxpYyB2b2lkIHNldFR5cGVGcm9tU3RyKFN0cmluZyBzdHIpIHsKCQlpZiAoInN0cmluZyIuZXF1YWxzKHN0cikpCgkJCXRoaXMudHlwZSA9IFRZUEVfU1RSSU5HOwoJCWVsc2UgaWYgKCJkaXJlY3RvcnkiLmVxdWFscyhzdHIpKQoJCQl0aGlzLnR5cGUgPSBUWVBFX0RJUkVDVE9SWTsKCQllbHNlIGlmICgiZmlsZSIuZXF1YWxzKHN0cikpCgkJCXRoaXMudHlwZSA9IFRZUEVfRklMRTsKCQllbHNlIGlmICgiYm9vbGVhbiIuZXF1YWxzKHN0cikpCgkJCXRoaXMudHlwZSA9IFRZUEVfQk9PTEVBTjsKCX0KCgkvKiAobm9uLUphdmFkb2MpCgkgKiBAc2VlIGphdmEubGFuZy5PYmplY3QjdG9TdHJpbmcoKQoJICovCglwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewoJCXJldHVybiAiXG48cHJvcGVydHkgaWQ9XCIiCgkJCSsgdGhpcy5nZXRJZCgpCgkJCSsgIlwiXG5cdGxhYmVsPVwiIgoJCQkrIHRoaXMuZ2V0TGFiZWwoKQoJCQkrICJcIlxuXHR0eXBlPVwiIgoJCQkrICh0eXBlID09IFRZUEVfRElSRUNUT1JZCgkJCQk/ICJkaXJlY3RvcnkiCgkJCQk6ICh0eXBlID09IFRZUEVfU1RSSU5HCgkJCQkJPyAic3RyaW5nIgoJCQkJCTogKHR5cGUgPT0gVFlQRV9GSUxFCgkJCQkJCT8gImZpbGUiCgkJCQkJCTogKHR5cGUgPT0gVFlQRV9CT09MRUFOID8gImJvb2xlYW4iIDogInVuZGVmaW5lZCIpKSkpCgkJCSsgIlwiXG5cdGRlZmF1bHQ9XCIiCgkJCSsgdGhpcy5nZXREZWZhdWx0VmFsdWUoKQoJCQkrICJcIiAvPiI7Cgl9Cgp9Cg==