LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CiAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCqAqCiAqIENvbnRyaWJ1dG9yczoKICogICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpwYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUuaW50ZXJuYWwueG1sOwoKaW1wb3J0IGphdmEuaW8uKjsKCmltcG9ydCBvcmcudzNjLmRvbS4qOwppbXBvcnQgb3JnLnhtbC5zYXguSW5wdXRTb3VyY2U7CgppbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS5pbnRlcm5hbC5UcmFjZTsKLyoqCiAqIEZhY3RvcnkgZm9yIHJlYWRpbmcgYW5kIHdyaXRpbmcgZnJvbSBYTUwgZmlsZXMuCiAqLwpwdWJsaWMgY2xhc3MgRmFjdG9yeSB7Cglwcm90ZWN0ZWQgU3RyaW5nIHBhY2thZ2VOYW1lOwoJcHJvdGVjdGVkIERvY3VtZW50IGRvY3VtZW50OwoKCXB1YmxpYyBGYWN0b3J5KCkgewoJCS8vIGRvIG5vdGhpbmcKCX0KCQoJcHJvdGVjdGVkIEF0dHIgY3JlYXRlQXR0cmlidXRlKFN0cmluZyBzLCBFbGVtZW50IGVsZW1lbnQpIHsKCQlBdHRyIGF0dHIgPSBkb2N1bWVudC5jcmVhdGVBdHRyaWJ1dGUocyk7CgkJZWxlbWVudC5zZXRBdHRyaWJ1dGVOb2RlKGF0dHIpOwoJCXJldHVybiBhdHRyOwoJfQoJCglwcm90ZWN0ZWQgWE1MRWxlbWVudCBjcmVhdGVFbGVtZW50KGludCBpbmRleCwgU3RyaW5nIHMsIE5vZGUgbm9kZSkgewoJCWlmIChpbmRleCA8IDApCgkJCXJldHVybiBjcmVhdGVFbGVtZW50KHMsIG5vZGUpOwoJCgkJRWxlbWVudCBlbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChzKTsKCQl0cnkgewoJCQlOb2RlIGNoaWxkID0gbm9kZS5nZXRGaXJzdENoaWxkKCk7CgkJCWZvciAoaW50IGkgPSAwOyBpIDwgaW5kZXg7IGkrKykKCQkJCWNoaWxkID0gY2hpbGQuZ2V0TmV4dFNpYmxpbmcoKTsKCQoJCQlub2RlLmluc2VydEJlZm9yZShlbGVtZW50LCBjaGlsZCk7CgkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKCQkJbm9kZS5hcHBlbmRDaGlsZChlbGVtZW50KTsKCQl9CgkJcmV0dXJuIG5ld0luc3RhbmNlKGVsZW1lbnQpOwoJfQoJCglwcm90ZWN0ZWQgWE1MRWxlbWVudCBjcmVhdGVFbGVtZW50KFN0cmluZyBzLCBOb2RlIG5vZGUpIHsKCQlFbGVtZW50IGVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KHMpOwoJCW5vZGUuYXBwZW5kQ2hpbGQoZWxlbWVudCk7CgkJcmV0dXJuIG5ld0luc3RhbmNlKGVsZW1lbnQpOwoJfQoJCglwdWJsaWMgYnl0ZVtdIGdldENvbnRlbnRzKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKCQlyZXR1cm4gWE1MVXRpbC5nZXRDb250ZW50cyhkb2N1bWVudCk7Cgl9CgkKCS8qKgoJICogCgkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLkRvY3VtZW50CgkgKi8KCXB1YmxpYyBEb2N1bWVudCBnZXREb2N1bWVudCgpIHsKCQlyZXR1cm4gZG9jdW1lbnQ7Cgl9CgkKCXB1YmxpYyBTdHJpbmcgZ2V0UGFja2FnZU5hbWUoKSB7CgkJcmV0dXJuIHBhY2thZ2VOYW1lOwoJfQoJCglwdWJsaWMgWE1MRWxlbWVudCBsb2FkRG9jdW1lbnQoSW5wdXRTdHJlYW0gaW4pIHRocm93cyBJT0V4Y2VwdGlvbiB7CgkJdHJ5IHsKCQkJSW5wdXRTdHJlYW1SZWFkZXIgcmVhZGVyID0gbmV3IElucHV0U3RyZWFtUmVhZGVyKGluKTsKCQkJZG9jdW1lbnQgPSBYTUxVdGlsLmdldERvY3VtZW50QnVpbGRlcigpLnBhcnNlKG5ldyBJbnB1dFNvdXJjZShyZWFkZXIpKTsKCQkJRWxlbWVudCBlbGVtZW50ID0gZG9jdW1lbnQuZ2V0RG9jdW1lbnRFbGVtZW50KCk7CgkJCXJldHVybiBuZXdJbnN0YW5jZShlbGVtZW50KTsKCQl9IGNhdGNoIChFeGNlcHRpb24gZXhjZXB0aW9uKSB7CgkJCVRyYWNlLnRyYWNlKFRyYWNlLldBUk5JTkcsICJFcnJvciBsb2FkaW5nIGRvY3VtZW50IiwgZXhjZXB0aW9uKTsKCQkJdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJDb3VsZCBub3QgbG9hZCBkb2N1bWVudCIpOwoJCX0KCX0KCQoJcHJvdGVjdGVkIFhNTEVsZW1lbnQgbmV3SW5zdGFuY2UoRWxlbWVudCBlbGVtZW50KSB7CgkJU3RyaW5nIHMgPSBlbGVtZW50LmdldE5vZGVOYW1lKCk7CgkJdHJ5IHsKCQkJLy8gY2hhbmdlICJ3ZWItYXBwOnRlc3QiIHRvICJXZWJBcHBUZXN0IgoJCQlzID0gcy5zdWJzdHJpbmcoMCwgMSkudG9VcHBlckNhc2UoKSArIHMuc3Vic3RyaW5nKDEpOwoJCQlpbnQgaSA9IHMuaW5kZXhPZigiLSIpOwoJCQl3aGlsZSAoaSA+PSAwKSB7CgkJCQlzID0gcy5zdWJzdHJpbmcoMCwgaSkgKyBzLnN1YnN0cmluZyhpKzEsIGkrMikudG9VcHBlckNhc2UoKSArIHMuc3Vic3RyaW5nKGkrMik7CgkJCQlpID0gcy5pbmRleE9mKCItIik7CgkJCX0KCQkJaSA9IHMuaW5kZXhPZigiOiIpOwoJCQl3aGlsZSAoaSA+PSAwKSB7CgkJCQlzID0gcy5zdWJzdHJpbmcoMCwgaSkgKyBzLnN1YnN0cmluZyhpKzEsIGkrMikudG9VcHBlckNhc2UoKSArIHMuc3Vic3RyaW5nKGkrMik7CgkJCQlpID0gcy5pbmRleE9mKCI6Iik7CgkJCX0KCQoJCQkvLyBhZGQgcGFja2FnZSBuYW1lCgkJCWlmIChwYWNrYWdlTmFtZSAhPSBudWxsKQoJCQkJcyA9IHBhY2thZ2VOYW1lICsgIi4iICsgczsKCQkJQ2xhc3MgY2xhc3MxID0gQ2xhc3MuZm9yTmFtZShzKTsKCQoJCQlYTUxFbGVtZW50IHhtbEVsZW1lbnQgPSAoWE1MRWxlbWVudCkgY2xhc3MxLm5ld0luc3RhbmNlKCk7CgkJCXhtbEVsZW1lbnQuc2V0RWxlbWVudChlbGVtZW50KTsKCQkJeG1sRWxlbWVudC5zZXRGYWN0b3J5KHRoaXMpOwoJCQlyZXR1cm4geG1sRWxlbWVudDsKCQl9IGNhdGNoIChFeGNlcHRpb24gZXhjZXB0aW9uKSB7CgkJCS8vIGlnbm9yZQoJCX0KCQlyZXR1cm4gbnVsbDsKCX0KCQoJcHVibGljIHZvaWQgc2F2ZShTdHJpbmcgZmlsZW5hbWUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CgkJWE1MVXRpbC5zYXZlKGZpbGVuYW1lLCBkb2N1bWVudCk7Cgl9CgkKCXB1YmxpYyB2b2lkIHNldERvY3VtZW50KERvY3VtZW50IGQpIHsKCQlkb2N1bWVudCA9IGQ7Cgl9CgkKCXB1YmxpYyB2b2lkIHNldFBhY2thZ2VOYW1lKFN0cmluZyBzKSB7CgkJcGFja2FnZU5hbWUgPSBzOwoJfQp9